diff --git a/.github/workflows/ydb-slo-action-test-init.yml b/.github/workflows/ydb-slo-action-test-init.yml index ae00758..15087d0 100644 --- a/.github/workflows/ydb-slo-action-test-init.yml +++ b/.github/workflows/ydb-slo-action-test-init.yml @@ -16,10 +16,14 @@ jobs: uses: ydb-platform/ydb-slo-action/init@main - name: Run chaos testing - run: echo 'CHAOS 🙈🙈🙈' + run: | + echo 'Performing chaos testing...' + sleep 10 - name: Run user workload - run: sleep 60 + run: | + echo 'Running user workload...'; + sleep 10 - name: Upload YDB SLO Test results uses: actions/upload-artifact@v4 diff --git a/init/action.yaml b/init/action.yaml deleted file mode 100644 index abfd123..0000000 --- a/init/action.yaml +++ /dev/null @@ -1,13 +0,0 @@ -name: 'YDB SLO Init Action' -description: 'The init action initializes SLO tests.' -inputs: - # YDB_STORAGE_NODE_COUNT: - # description: 'The number of YDB storage nodes to create.' - # default: "1" - YDB_DATABASE_NODE_COUNT: - description: 'The number of YDB database nodes to create.' - default: "3" -runs: - using: 'node20' - main: 'main.js' - post: 'post.js' diff --git a/init/action.yml b/init/action.yml new file mode 100644 index 0000000..a1a3340 --- /dev/null +++ b/init/action.yml @@ -0,0 +1,32 @@ +name: 'YDB SLO Initialization Action' +description: 'This action prepares a Docker Compose configuration to deploy YDB and Prometheus. During post-run, it collects metric results and generates an SLO report.' + +inputs: + # ydb_storage_node_count: + # description: 'Specifies the number of YDB storage nodes to initialize within the Docker Compose setup.' + # default: "1" + ydb_database_node_count: + description: 'Specifies the number of YDB database nodes to initialize within the Docker Compose setup.' + required: false + default: '3' + disable_default_metrics: + description: 'A comma-separated list of default metric IDs to exclude from the report generation.' + required: false + default: '' + custom_metrics_yaml: + description: 'YAML string defining additional custom metrics to include in the SLO report.' + required: false + default: '' + report_template: + description: 'Path to a custom Markdown template used for generating the final SLO report.' + required: false + default: '' + sdk_name: + description: 'The name of the SDK used by the user to generate load on the YDB database.' + required: false + default: '' + +runs: + using: 'node20' + main: 'main.js' # Responsible for preparing the Docker Compose configuration for YDB and Prometheus + post: 'post.js' # Collects metrics and generates report.md based on specified or default configurations diff --git a/init/main.js b/init/main.js index 7043d72..e69de29 100644 --- a/init/main.js +++ b/init/main.js @@ -1,19066 +0,0 @@ -/* eslint-disable */ -import { createRequire } from "node:module"; -var __create = Object.create; -var __getProtoOf = Object.getPrototypeOf; -var __defProp = Object.defineProperty; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __toESM = (mod, isNodeMode, target) => { - target = mod != null ? __create(__getProtoOf(mod)) : {}; - const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target; - for (let key of __getOwnPropNames(mod)) - if (!__hasOwnProp.call(to, key)) - __defProp(to, key, { - get: () => mod[key], - enumerable: true - }); - return to; -}; -var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports); -var __require = /* @__PURE__ */ createRequire(import.meta.url); - -// ../node_modules/@actions/core/lib/utils.js -var require_utils = __commonJS((exports) => { - Object.defineProperty(exports, "__esModule", { value: true }); - exports.toCommandProperties = exports.toCommandValue = undefined; - function toCommandValue(input) { - if (input === null || input === undefined) { - return ""; - } else if (typeof input === "string" || input instanceof String) { - return input; - } - return JSON.stringify(input); - } - exports.toCommandValue = toCommandValue; - function toCommandProperties(annotationProperties) { - if (!Object.keys(annotationProperties).length) { - return {}; - } - return { - title: annotationProperties.title, - file: annotationProperties.file, - line: annotationProperties.startLine, - endLine: annotationProperties.endLine, - col: annotationProperties.startColumn, - endColumn: annotationProperties.endColumn - }; - } - exports.toCommandProperties = toCommandProperties; -}); - -// ../node_modules/@actions/core/lib/command.js -var require_command = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.issue = exports.issueCommand = undefined; - var os = __importStar(__require("os")); - var utils_1 = require_utils(); - function issueCommand(command, properties, message) { - const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os.EOL); - } - exports.issueCommand = issueCommand; - function issue(name, message = "") { - issueCommand(name, {}, message); - } - exports.issue = issue; - var CMD_STRING = "::"; - - class Command { - constructor(command, properties, message) { - if (!command) { - command = "missing.command"; - } - this.command = command; - this.properties = properties; - this.message = message; - } - toString() { - let cmdStr = CMD_STRING + this.command; - if (this.properties && Object.keys(this.properties).length > 0) { - cmdStr += " "; - let first = true; - for (const key in this.properties) { - if (this.properties.hasOwnProperty(key)) { - const val = this.properties[key]; - if (val) { - if (first) { - first = false; - } else { - cmdStr += ","; - } - cmdStr += `${key}=${escapeProperty(val)}`; - } - } - } - } - cmdStr += `${CMD_STRING}${escapeData(this.message)}`; - return cmdStr; - } - } - function escapeData(s) { - return (0, utils_1.toCommandValue)(s).replace(/%/g, "%25").replace(/\r/g, "%0D").replace(/\n/g, "%0A"); - } - function escapeProperty(s) { - return (0, utils_1.toCommandValue)(s).replace(/%/g, "%25").replace(/\r/g, "%0D").replace(/\n/g, "%0A").replace(/:/g, "%3A").replace(/,/g, "%2C"); - } -}); - -// ../node_modules/@actions/core/lib/file-command.js -var require_file_command = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.prepareKeyValueMessage = exports.issueFileCommand = undefined; - var crypto = __importStar(__require("crypto")); - var fs = __importStar(__require("fs")); - var os = __importStar(__require("os")); - var utils_1 = require_utils(); - function issueFileCommand(command, message) { - const filePath = process.env[`GITHUB_${command}`]; - if (!filePath) { - throw new Error(`Unable to find environment variable for file command ${command}`); - } - if (!fs.existsSync(filePath)) { - throw new Error(`Missing file at path: ${filePath}`); - } - fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, { - encoding: "utf8" - }); - } - exports.issueFileCommand = issueFileCommand; - function prepareKeyValueMessage(key, value) { - const delimiter = `ghadelimiter_${crypto.randomUUID()}`; - const convertedValue = (0, utils_1.toCommandValue)(value); - if (key.includes(delimiter)) { - throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`); - } - if (convertedValue.includes(delimiter)) { - throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); - } - return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; - } - exports.prepareKeyValueMessage = prepareKeyValueMessage; -}); - -// ../node_modules/@actions/http-client/lib/proxy.js -var require_proxy = __commonJS((exports) => { - Object.defineProperty(exports, "__esModule", { value: true }); - exports.checkBypass = exports.getProxyUrl = undefined; - function getProxyUrl(reqUrl) { - const usingSsl = reqUrl.protocol === "https:"; - if (checkBypass(reqUrl)) { - return; - } - const proxyVar = (() => { - if (usingSsl) { - return process.env["https_proxy"] || process.env["HTTPS_PROXY"]; - } else { - return process.env["http_proxy"] || process.env["HTTP_PROXY"]; - } - })(); - if (proxyVar) { - try { - return new DecodedURL(proxyVar); - } catch (_a) { - if (!proxyVar.startsWith("http://") && !proxyVar.startsWith("https://")) - return new DecodedURL(`http://${proxyVar}`); - } - } else { - return; - } - } - exports.getProxyUrl = getProxyUrl; - function checkBypass(reqUrl) { - if (!reqUrl.hostname) { - return false; - } - const reqHost = reqUrl.hostname; - if (isLoopbackAddress(reqHost)) { - return true; - } - const noProxy = process.env["no_proxy"] || process.env["NO_PROXY"] || ""; - if (!noProxy) { - return false; - } - let reqPort; - if (reqUrl.port) { - reqPort = Number(reqUrl.port); - } else if (reqUrl.protocol === "http:") { - reqPort = 80; - } else if (reqUrl.protocol === "https:") { - reqPort = 443; - } - const upperReqHosts = [reqUrl.hostname.toUpperCase()]; - if (typeof reqPort === "number") { - upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); - } - for (const upperNoProxyItem of noProxy.split(",").map((x) => x.trim().toUpperCase()).filter((x) => x)) { - if (upperNoProxyItem === "*" || upperReqHosts.some((x) => x === upperNoProxyItem || x.endsWith(`.${upperNoProxyItem}`) || upperNoProxyItem.startsWith(".") && x.endsWith(`${upperNoProxyItem}`))) { - return true; - } - } - return false; - } - exports.checkBypass = checkBypass; - function isLoopbackAddress(host) { - const hostLower = host.toLowerCase(); - return hostLower === "localhost" || hostLower.startsWith("127.") || hostLower.startsWith("[::1]") || hostLower.startsWith("[0:0:0:0:0:0:0:1]"); - } - - class DecodedURL extends URL { - constructor(url, base) { - super(url, base); - this._decodedUsername = decodeURIComponent(super.username); - this._decodedPassword = decodeURIComponent(super.password); - } - get username() { - return this._decodedUsername; - } - get password() { - return this._decodedPassword; - } - } -}); - -// ../node_modules/tunnel/lib/tunnel.js -var require_tunnel = __commonJS((exports) => { - var net = __require("net"); - var tls = __require("tls"); - var http = __require("http"); - var https = __require("https"); - var events = __require("events"); - var assert = __require("assert"); - var util = __require("util"); - exports.httpOverHttp = httpOverHttp; - exports.httpsOverHttp = httpsOverHttp; - exports.httpOverHttps = httpOverHttps; - exports.httpsOverHttps = httpsOverHttps; - function httpOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - return agent; - } - function httpsOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; - } - function httpOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - return agent; - } - function httpsOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; - } - function TunnelingAgent(options) { - var self = this; - self.options = options || {}; - self.proxyOptions = self.options.proxy || {}; - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; - self.requests = []; - self.sockets = []; - self.on("free", function onFree(socket, host, port, localAddress) { - var options2 = toOptions(host, port, localAddress); - for (var i = 0, len = self.requests.length;i < len; ++i) { - var pending = self.requests[i]; - if (pending.host === options2.host && pending.port === options2.port) { - self.requests.splice(i, 1); - pending.request.onSocket(socket); - return; - } - } - socket.destroy(); - self.removeSocket(socket); - }); - } - util.inherits(TunnelingAgent, events.EventEmitter); - TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { - var self = this; - var options = mergeOptions({ request: req }, self.options, toOptions(host, port, localAddress)); - if (self.sockets.length >= this.maxSockets) { - self.requests.push(options); - return; - } - self.createSocket(options, function(socket) { - socket.on("free", onFree); - socket.on("close", onCloseOrRemove); - socket.on("agentRemove", onCloseOrRemove); - req.onSocket(socket); - function onFree() { - self.emit("free", socket, options); - } - function onCloseOrRemove(err) { - self.removeSocket(socket); - socket.removeListener("free", onFree); - socket.removeListener("close", onCloseOrRemove); - socket.removeListener("agentRemove", onCloseOrRemove); - } - }); - }; - TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this; - var placeholder = {}; - self.sockets.push(placeholder); - var connectOptions = mergeOptions({}, self.proxyOptions, { - method: "CONNECT", - path: options.host + ":" + options.port, - agent: false, - headers: { - host: options.host + ":" + options.port - } - }); - if (options.localAddress) { - connectOptions.localAddress = options.localAddress; - } - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {}; - connectOptions.headers["Proxy-Authorization"] = "Basic " + new Buffer(connectOptions.proxyAuth).toString("base64"); - } - debug("making CONNECT request"); - var connectReq = self.request(connectOptions); - connectReq.useChunkedEncodingByDefault = false; - connectReq.once("response", onResponse); - connectReq.once("upgrade", onUpgrade); - connectReq.once("connect", onConnect); - connectReq.once("error", onError); - connectReq.end(); - function onResponse(res) { - res.upgrade = true; - } - function onUpgrade(res, socket, head) { - process.nextTick(function() { - onConnect(res, socket, head); - }); - } - function onConnect(res, socket, head) { - connectReq.removeAllListeners(); - socket.removeAllListeners(); - if (res.statusCode !== 200) { - debug("tunneling socket could not be established, statusCode=%d", res.statusCode); - socket.destroy(); - var error = new Error("tunneling socket could not be established, " + "statusCode=" + res.statusCode); - error.code = "ECONNRESET"; - options.request.emit("error", error); - self.removeSocket(placeholder); - return; - } - if (head.length > 0) { - debug("got illegal response body from proxy"); - socket.destroy(); - var error = new Error("got illegal response body from proxy"); - error.code = "ECONNRESET"; - options.request.emit("error", error); - self.removeSocket(placeholder); - return; - } - debug("tunneling connection has established"); - self.sockets[self.sockets.indexOf(placeholder)] = socket; - return cb(socket); - } - function onError(cause) { - connectReq.removeAllListeners(); - debug("tunneling socket could not be established, cause=%s\n", cause.message, cause.stack); - var error = new Error("tunneling socket could not be established, " + "cause=" + cause.message); - error.code = "ECONNRESET"; - options.request.emit("error", error); - self.removeSocket(placeholder); - } - }; - TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket); - if (pos === -1) { - return; - } - this.sockets.splice(pos, 1); - var pending = this.requests.shift(); - if (pending) { - this.createSocket(pending, function(socket2) { - pending.request.onSocket(socket2); - }); - } - }; - function createSecureSocket(options, cb) { - var self = this; - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - var hostHeader = options.request.getHeader("host"); - var tlsOptions = mergeOptions({}, self.options, { - socket, - servername: hostHeader ? hostHeader.replace(/:.*$/, "") : options.host - }); - var secureSocket = tls.connect(0, tlsOptions); - self.sockets[self.sockets.indexOf(socket)] = secureSocket; - cb(secureSocket); - }); - } - function toOptions(host, port, localAddress) { - if (typeof host === "string") { - return { - host, - port, - localAddress - }; - } - return host; - } - function mergeOptions(target) { - for (var i = 1, len = arguments.length;i < len; ++i) { - var overrides = arguments[i]; - if (typeof overrides === "object") { - var keys = Object.keys(overrides); - for (var j = 0, keyLen = keys.length;j < keyLen; ++j) { - var k = keys[j]; - if (overrides[k] !== undefined) { - target[k] = overrides[k]; - } - } - } - } - return target; - } - var debug; - if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments); - if (typeof args[0] === "string") { - args[0] = "TUNNEL: " + args[0]; - } else { - args.unshift("TUNNEL:"); - } - console.error.apply(console, args); - }; - } else { - debug = function() { - }; - } - exports.debug = debug; -}); - -// ../node_modules/undici/lib/core/symbols.js -var require_symbols = __commonJS((exports, module) => { - module.exports = { - kClose: Symbol("close"), - kDestroy: Symbol("destroy"), - kDispatch: Symbol("dispatch"), - kUrl: Symbol("url"), - kWriting: Symbol("writing"), - kResuming: Symbol("resuming"), - kQueue: Symbol("queue"), - kConnect: Symbol("connect"), - kConnecting: Symbol("connecting"), - kHeadersList: Symbol("headers list"), - kKeepAliveDefaultTimeout: Symbol("default keep alive timeout"), - kKeepAliveMaxTimeout: Symbol("max keep alive timeout"), - kKeepAliveTimeoutThreshold: Symbol("keep alive timeout threshold"), - kKeepAliveTimeoutValue: Symbol("keep alive timeout"), - kKeepAlive: Symbol("keep alive"), - kHeadersTimeout: Symbol("headers timeout"), - kBodyTimeout: Symbol("body timeout"), - kServerName: Symbol("server name"), - kLocalAddress: Symbol("local address"), - kHost: Symbol("host"), - kNoRef: Symbol("no ref"), - kBodyUsed: Symbol("used"), - kRunning: Symbol("running"), - kBlocking: Symbol("blocking"), - kPending: Symbol("pending"), - kSize: Symbol("size"), - kBusy: Symbol("busy"), - kQueued: Symbol("queued"), - kFree: Symbol("free"), - kConnected: Symbol("connected"), - kClosed: Symbol("closed"), - kNeedDrain: Symbol("need drain"), - kReset: Symbol("reset"), - kDestroyed: Symbol.for("nodejs.stream.destroyed"), - kMaxHeadersSize: Symbol("max headers size"), - kRunningIdx: Symbol("running index"), - kPendingIdx: Symbol("pending index"), - kError: Symbol("error"), - kClients: Symbol("clients"), - kClient: Symbol("client"), - kParser: Symbol("parser"), - kOnDestroyed: Symbol("destroy callbacks"), - kPipelining: Symbol("pipelining"), - kSocket: Symbol("socket"), - kHostHeader: Symbol("host header"), - kConnector: Symbol("connector"), - kStrictContentLength: Symbol("strict content length"), - kMaxRedirections: Symbol("maxRedirections"), - kMaxRequests: Symbol("maxRequestsPerClient"), - kProxy: Symbol("proxy agent options"), - kCounter: Symbol("socket request counter"), - kInterceptors: Symbol("dispatch interceptors"), - kMaxResponseSize: Symbol("max response size"), - kHTTP2Session: Symbol("http2Session"), - kHTTP2SessionState: Symbol("http2Session state"), - kHTTP2BuildRequest: Symbol("http2 build request"), - kHTTP1BuildRequest: Symbol("http1 build request"), - kHTTP2CopyHeaders: Symbol("http2 copy headers"), - kHTTPConnVersion: Symbol("http connection version"), - kRetryHandlerDefaultRetry: Symbol("retry agent default retry"), - kConstruct: Symbol("constructable") - }; -}); - -// ../node_modules/undici/lib/core/errors.js -var require_errors = __commonJS((exports, module) => { - class UndiciError extends Error { - constructor(message) { - super(message); - this.name = "UndiciError"; - this.code = "UND_ERR"; - } - } - - class ConnectTimeoutError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, ConnectTimeoutError); - this.name = "ConnectTimeoutError"; - this.message = message || "Connect Timeout Error"; - this.code = "UND_ERR_CONNECT_TIMEOUT"; - } - } - - class HeadersTimeoutError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, HeadersTimeoutError); - this.name = "HeadersTimeoutError"; - this.message = message || "Headers Timeout Error"; - this.code = "UND_ERR_HEADERS_TIMEOUT"; - } - } - - class HeadersOverflowError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, HeadersOverflowError); - this.name = "HeadersOverflowError"; - this.message = message || "Headers Overflow Error"; - this.code = "UND_ERR_HEADERS_OVERFLOW"; - } - } - - class BodyTimeoutError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, BodyTimeoutError); - this.name = "BodyTimeoutError"; - this.message = message || "Body Timeout Error"; - this.code = "UND_ERR_BODY_TIMEOUT"; - } - } - - class ResponseStatusCodeError extends UndiciError { - constructor(message, statusCode, headers, body) { - super(message); - Error.captureStackTrace(this, ResponseStatusCodeError); - this.name = "ResponseStatusCodeError"; - this.message = message || "Response Status Code Error"; - this.code = "UND_ERR_RESPONSE_STATUS_CODE"; - this.body = body; - this.status = statusCode; - this.statusCode = statusCode; - this.headers = headers; - } - } - - class InvalidArgumentError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, InvalidArgumentError); - this.name = "InvalidArgumentError"; - this.message = message || "Invalid Argument Error"; - this.code = "UND_ERR_INVALID_ARG"; - } - } - - class InvalidReturnValueError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, InvalidReturnValueError); - this.name = "InvalidReturnValueError"; - this.message = message || "Invalid Return Value Error"; - this.code = "UND_ERR_INVALID_RETURN_VALUE"; - } - } - - class RequestAbortedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, RequestAbortedError); - this.name = "AbortError"; - this.message = message || "Request aborted"; - this.code = "UND_ERR_ABORTED"; - } - } - - class InformationalError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, InformationalError); - this.name = "InformationalError"; - this.message = message || "Request information"; - this.code = "UND_ERR_INFO"; - } - } - - class RequestContentLengthMismatchError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, RequestContentLengthMismatchError); - this.name = "RequestContentLengthMismatchError"; - this.message = message || "Request body length does not match content-length header"; - this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; - } - } - - class ResponseContentLengthMismatchError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, ResponseContentLengthMismatchError); - this.name = "ResponseContentLengthMismatchError"; - this.message = message || "Response body length does not match content-length header"; - this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; - } - } - - class ClientDestroyedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, ClientDestroyedError); - this.name = "ClientDestroyedError"; - this.message = message || "The client is destroyed"; - this.code = "UND_ERR_DESTROYED"; - } - } - - class ClientClosedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, ClientClosedError); - this.name = "ClientClosedError"; - this.message = message || "The client is closed"; - this.code = "UND_ERR_CLOSED"; - } - } - - class SocketError extends UndiciError { - constructor(message, socket) { - super(message); - Error.captureStackTrace(this, SocketError); - this.name = "SocketError"; - this.message = message || "Socket error"; - this.code = "UND_ERR_SOCKET"; - this.socket = socket; - } - } - - class NotSupportedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, NotSupportedError); - this.name = "NotSupportedError"; - this.message = message || "Not supported error"; - this.code = "UND_ERR_NOT_SUPPORTED"; - } - } - - class BalancedPoolMissingUpstreamError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, NotSupportedError); - this.name = "MissingUpstreamError"; - this.message = message || "No upstream has been added to the BalancedPool"; - this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; - } - } - - class HTTPParserError extends Error { - constructor(message, code, data) { - super(message); - Error.captureStackTrace(this, HTTPParserError); - this.name = "HTTPParserError"; - this.code = code ? `HPE_${code}` : undefined; - this.data = data ? data.toString() : undefined; - } - } - - class ResponseExceededMaxSizeError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, ResponseExceededMaxSizeError); - this.name = "ResponseExceededMaxSizeError"; - this.message = message || "Response content exceeded max size"; - this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; - } - } - - class RequestRetryError extends UndiciError { - constructor(message, code, { headers, data }) { - super(message); - Error.captureStackTrace(this, RequestRetryError); - this.name = "RequestRetryError"; - this.message = message || "Request retry error"; - this.code = "UND_ERR_REQ_RETRY"; - this.statusCode = code; - this.data = data; - this.headers = headers; - } - } - module.exports = { - HTTPParserError, - UndiciError, - HeadersTimeoutError, - HeadersOverflowError, - BodyTimeoutError, - RequestContentLengthMismatchError, - ConnectTimeoutError, - ResponseStatusCodeError, - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError, - ClientDestroyedError, - ClientClosedError, - InformationalError, - SocketError, - NotSupportedError, - ResponseContentLengthMismatchError, - BalancedPoolMissingUpstreamError, - ResponseExceededMaxSizeError, - RequestRetryError - }; -}); - -// ../node_modules/undici/lib/core/constants.js -var require_constants = __commonJS((exports, module) => { - var headerNameLowerCasedRecord = {}; - var wellknownHeaderNames = [ - "Accept", - "Accept-Encoding", - "Accept-Language", - "Accept-Ranges", - "Access-Control-Allow-Credentials", - "Access-Control-Allow-Headers", - "Access-Control-Allow-Methods", - "Access-Control-Allow-Origin", - "Access-Control-Expose-Headers", - "Access-Control-Max-Age", - "Access-Control-Request-Headers", - "Access-Control-Request-Method", - "Age", - "Allow", - "Alt-Svc", - "Alt-Used", - "Authorization", - "Cache-Control", - "Clear-Site-Data", - "Connection", - "Content-Disposition", - "Content-Encoding", - "Content-Language", - "Content-Length", - "Content-Location", - "Content-Range", - "Content-Security-Policy", - "Content-Security-Policy-Report-Only", - "Content-Type", - "Cookie", - "Cross-Origin-Embedder-Policy", - "Cross-Origin-Opener-Policy", - "Cross-Origin-Resource-Policy", - "Date", - "Device-Memory", - "Downlink", - "ECT", - "ETag", - "Expect", - "Expect-CT", - "Expires", - "Forwarded", - "From", - "Host", - "If-Match", - "If-Modified-Since", - "If-None-Match", - "If-Range", - "If-Unmodified-Since", - "Keep-Alive", - "Last-Modified", - "Link", - "Location", - "Max-Forwards", - "Origin", - "Permissions-Policy", - "Pragma", - "Proxy-Authenticate", - "Proxy-Authorization", - "RTT", - "Range", - "Referer", - "Referrer-Policy", - "Refresh", - "Retry-After", - "Sec-WebSocket-Accept", - "Sec-WebSocket-Extensions", - "Sec-WebSocket-Key", - "Sec-WebSocket-Protocol", - "Sec-WebSocket-Version", - "Server", - "Server-Timing", - "Service-Worker-Allowed", - "Service-Worker-Navigation-Preload", - "Set-Cookie", - "SourceMap", - "Strict-Transport-Security", - "Supports-Loading-Mode", - "TE", - "Timing-Allow-Origin", - "Trailer", - "Transfer-Encoding", - "Upgrade", - "Upgrade-Insecure-Requests", - "User-Agent", - "Vary", - "Via", - "WWW-Authenticate", - "X-Content-Type-Options", - "X-DNS-Prefetch-Control", - "X-Frame-Options", - "X-Permitted-Cross-Domain-Policies", - "X-Powered-By", - "X-Requested-With", - "X-XSS-Protection" - ]; - for (let i = 0;i < wellknownHeaderNames.length; ++i) { - const key = wellknownHeaderNames[i]; - const lowerCasedKey = key.toLowerCase(); - headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; - } - Object.setPrototypeOf(headerNameLowerCasedRecord, null); - module.exports = { - wellknownHeaderNames, - headerNameLowerCasedRecord - }; -}); - -// ../node_modules/undici/lib/core/util.js -var require_util = __commonJS((exports, module) => { - var assert = __require("assert"); - var { kDestroyed, kBodyUsed } = require_symbols(); - var { IncomingMessage } = __require("http"); - var stream = __require("stream"); - var net = __require("net"); - var { InvalidArgumentError } = require_errors(); - var { Blob: Blob2 } = __require("buffer"); - var nodeUtil = __require("util"); - var { stringify } = __require("querystring"); - var { headerNameLowerCasedRecord } = require_constants(); - var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); - function nop() { - } - function isStream(obj) { - return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; - } - function isBlobLike(object) { - return Blob2 && object instanceof Blob2 || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]); - } - function buildURL(url, queryParams) { - if (url.includes("?") || url.includes("#")) { - throw new Error('Query params cannot be passed when url already contains "?" or "#".'); - } - const stringified = stringify(queryParams); - if (stringified) { - url += "?" + stringified; - } - return url; - } - function parseURL(url) { - if (typeof url === "string") { - url = new URL(url); - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - return url; - } - if (!url || typeof url !== "object") { - throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); - } - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - if (!(url instanceof URL)) { - if (url.port != null && url.port !== "" && !Number.isFinite(parseInt(url.port))) { - throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); - } - if (url.path != null && typeof url.path !== "string") { - throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); - } - if (url.pathname != null && typeof url.pathname !== "string") { - throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); - } - if (url.hostname != null && typeof url.hostname !== "string") { - throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); - } - if (url.origin != null && typeof url.origin !== "string") { - throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); - } - const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; - let origin = url.origin != null ? url.origin : `${url.protocol}//${url.hostname}:${port}`; - let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; - if (origin.endsWith("/")) { - origin = origin.substring(0, origin.length - 1); - } - if (path && !path.startsWith("/")) { - path = `/${path}`; - } - url = new URL(origin + path); - } - return url; - } - function parseOrigin(url) { - url = parseURL(url); - if (url.pathname !== "/" || url.search || url.hash) { - throw new InvalidArgumentError("invalid url"); - } - return url; - } - function getHostname(host) { - if (host[0] === "[") { - const idx2 = host.indexOf("]"); - assert(idx2 !== -1); - return host.substring(1, idx2); - } - const idx = host.indexOf(":"); - if (idx === -1) - return host; - return host.substring(0, idx); - } - function getServerName(host) { - if (!host) { - return null; - } - assert.strictEqual(typeof host, "string"); - const servername = getHostname(host); - if (net.isIP(servername)) { - return ""; - } - return servername; - } - function deepClone(obj) { - return JSON.parse(JSON.stringify(obj)); - } - function isAsyncIterable(obj) { - return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); - } - function isIterable(obj) { - return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); - } - function bodyLength(body) { - if (body == null) { - return 0; - } else if (isStream(body)) { - const state = body._readableState; - return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null; - } else if (isBlobLike(body)) { - return body.size != null ? body.size : null; - } else if (isBuffer(body)) { - return body.byteLength; - } - return null; - } - function isDestroyed(stream2) { - return !stream2 || !!(stream2.destroyed || stream2[kDestroyed]); - } - function isReadableAborted(stream2) { - const state = stream2 && stream2._readableState; - return isDestroyed(stream2) && state && !state.endEmitted; - } - function destroy(stream2, err) { - if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { - return; - } - if (typeof stream2.destroy === "function") { - if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { - stream2.socket = null; - } - stream2.destroy(err); - } else if (err) { - process.nextTick((stream3, err2) => { - stream3.emit("error", err2); - }, stream2, err); - } - if (stream2.destroyed !== true) { - stream2[kDestroyed] = true; - } - } - var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; - function parseKeepAliveTimeout(val) { - const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR); - return m ? parseInt(m[1], 10) * 1000 : null; - } - function headerNameToString(value) { - return headerNameLowerCasedRecord[value] || value.toLowerCase(); - } - function parseHeaders(headers, obj = {}) { - if (!Array.isArray(headers)) - return headers; - for (let i = 0;i < headers.length; i += 2) { - const key = headers[i].toString().toLowerCase(); - let val = obj[key]; - if (!val) { - if (Array.isArray(headers[i + 1])) { - obj[key] = headers[i + 1].map((x) => x.toString("utf8")); - } else { - obj[key] = headers[i + 1].toString("utf8"); - } - } else { - if (!Array.isArray(val)) { - val = [val]; - obj[key] = val; - } - val.push(headers[i + 1].toString("utf8")); - } - } - if ("content-length" in obj && "content-disposition" in obj) { - obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1"); - } - return obj; - } - function parseRawHeaders(headers) { - const ret = []; - let hasContentLength = false; - let contentDispositionIdx = -1; - for (let n = 0;n < headers.length; n += 2) { - const key = headers[n + 0].toString(); - const val = headers[n + 1].toString("utf8"); - if (key.length === 14 && (key === "content-length" || key.toLowerCase() === "content-length")) { - ret.push(key, val); - hasContentLength = true; - } else if (key.length === 19 && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { - contentDispositionIdx = ret.push(key, val) - 1; - } else { - ret.push(key, val); - } - } - if (hasContentLength && contentDispositionIdx !== -1) { - ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); - } - return ret; - } - function isBuffer(buffer) { - return buffer instanceof Uint8Array || Buffer.isBuffer(buffer); - } - function validateHandler(handler, method, upgrade) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - if (typeof handler.onConnect !== "function") { - throw new InvalidArgumentError("invalid onConnect method"); - } - if (typeof handler.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); - } - if (typeof handler.onBodySent !== "function" && handler.onBodySent !== undefined) { - throw new InvalidArgumentError("invalid onBodySent method"); - } - if (upgrade || method === "CONNECT") { - if (typeof handler.onUpgrade !== "function") { - throw new InvalidArgumentError("invalid onUpgrade method"); - } - } else { - if (typeof handler.onHeaders !== "function") { - throw new InvalidArgumentError("invalid onHeaders method"); - } - if (typeof handler.onData !== "function") { - throw new InvalidArgumentError("invalid onData method"); - } - if (typeof handler.onComplete !== "function") { - throw new InvalidArgumentError("invalid onComplete method"); - } - } - } - function isDisturbed(body) { - return !!(body && (stream.isDisturbed ? stream.isDisturbed(body) || body[kBodyUsed] : body[kBodyUsed] || body.readableDidRead || body._readableState && body._readableState.dataEmitted || isReadableAborted(body))); - } - function isErrored(body) { - return !!(body && (stream.isErrored ? stream.isErrored(body) : /state: 'errored'/.test(nodeUtil.inspect(body)))); - } - function isReadable(body) { - return !!(body && (stream.isReadable ? stream.isReadable(body) : /state: 'readable'/.test(nodeUtil.inspect(body)))); - } - function getSocketInfo(socket) { - return { - localAddress: socket.localAddress, - localPort: socket.localPort, - remoteAddress: socket.remoteAddress, - remotePort: socket.remotePort, - remoteFamily: socket.remoteFamily, - timeout: socket.timeout, - bytesWritten: socket.bytesWritten, - bytesRead: socket.bytesRead - }; - } - async function* convertIterableToBuffer(iterable) { - for await (const chunk of iterable) { - yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); - } - } - var ReadableStream; - function ReadableStreamFrom(iterable) { - if (!ReadableStream) { - ReadableStream = __require("stream/web").ReadableStream; - } - if (ReadableStream.from) { - return ReadableStream.from(convertIterableToBuffer(iterable)); - } - let iterator; - return new ReadableStream({ - async start() { - iterator = iterable[Symbol.asyncIterator](); - }, - async pull(controller) { - const { done, value } = await iterator.next(); - if (done) { - queueMicrotask(() => { - controller.close(); - }); - } else { - const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); - controller.enqueue(new Uint8Array(buf)); - } - return controller.desiredSize > 0; - }, - async cancel(reason) { - await iterator.return(); - } - }, 0); - } - function isFormDataLike(object) { - return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; - } - function throwIfAborted(signal) { - if (!signal) { - return; - } - if (typeof signal.throwIfAborted === "function") { - signal.throwIfAborted(); - } else { - if (signal.aborted) { - const err = new Error("The operation was aborted"); - err.name = "AbortError"; - throw err; - } - } - } - function addAbortListener(signal, listener) { - if ("addEventListener" in signal) { - signal.addEventListener("abort", listener, { once: true }); - return () => signal.removeEventListener("abort", listener); - } - signal.addListener("abort", listener); - return () => signal.removeListener("abort", listener); - } - var hasToWellFormed = !!String.prototype.toWellFormed; - function toUSVString(val) { - if (hasToWellFormed) { - return `${val}`.toWellFormed(); - } else if (nodeUtil.toUSVString) { - return nodeUtil.toUSVString(val); - } - return `${val}`; - } - function parseRangeHeader(range) { - if (range == null || range === "") - return { start: 0, end: null, size: null }; - const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null; - return m ? { - start: parseInt(m[1]), - end: m[2] ? parseInt(m[2]) : null, - size: m[3] ? parseInt(m[3]) : null - } : null; - } - var kEnumerableProperty = Object.create(null); - kEnumerableProperty.enumerable = true; - module.exports = { - kEnumerableProperty, - nop, - isDisturbed, - isErrored, - isReadable, - toUSVString, - isReadableAborted, - isBlobLike, - parseOrigin, - parseURL, - getServerName, - isStream, - isIterable, - isAsyncIterable, - isDestroyed, - headerNameToString, - parseRawHeaders, - parseHeaders, - parseKeepAliveTimeout, - destroy, - bodyLength, - deepClone, - ReadableStreamFrom, - isBuffer, - validateHandler, - getSocketInfo, - isFormDataLike, - buildURL, - throwIfAborted, - addAbortListener, - parseRangeHeader, - nodeMajor, - nodeMinor, - nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13, - safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"] - }; -}); - -// ../node_modules/undici/lib/timers.js -var require_timers = __commonJS((exports, module) => { - var fastNow = Date.now(); - var fastNowTimeout; - var fastTimers = []; - function onTimeout() { - fastNow = Date.now(); - let len = fastTimers.length; - let idx = 0; - while (idx < len) { - const timer = fastTimers[idx]; - if (timer.state === 0) { - timer.state = fastNow + timer.delay; - } else if (timer.state > 0 && fastNow >= timer.state) { - timer.state = -1; - timer.callback(timer.opaque); - } - if (timer.state === -1) { - timer.state = -2; - if (idx !== len - 1) { - fastTimers[idx] = fastTimers.pop(); - } else { - fastTimers.pop(); - } - len -= 1; - } else { - idx += 1; - } - } - if (fastTimers.length > 0) { - refreshTimeout(); - } - } - function refreshTimeout() { - if (fastNowTimeout && fastNowTimeout.refresh) { - fastNowTimeout.refresh(); - } else { - clearTimeout(fastNowTimeout); - fastNowTimeout = setTimeout(onTimeout, 1000); - if (fastNowTimeout.unref) { - fastNowTimeout.unref(); - } - } - } - - class Timeout { - constructor(callback, delay, opaque) { - this.callback = callback; - this.delay = delay; - this.opaque = opaque; - this.state = -2; - this.refresh(); - } - refresh() { - if (this.state === -2) { - fastTimers.push(this); - if (!fastNowTimeout || fastTimers.length === 1) { - refreshTimeout(); - } - } - this.state = 0; - } - clear() { - this.state = -1; - } - } - module.exports = { - setTimeout(callback, delay, opaque) { - return delay < 1000 ? setTimeout(callback, delay, opaque) : new Timeout(callback, delay, opaque); - }, - clearTimeout(timeout) { - if (timeout instanceof Timeout) { - timeout.clear(); - } else { - clearTimeout(timeout); - } - } - }; -}); - -// ../node_modules/@fastify/busboy/deps/streamsearch/sbmh.js -var require_sbmh = __commonJS((exports, module) => { - var EventEmitter = __require("node:events").EventEmitter; - var inherits = __require("node:util").inherits; - function SBMH(needle) { - if (typeof needle === "string") { - needle = Buffer.from(needle); - } - if (!Buffer.isBuffer(needle)) { - throw new TypeError("The needle has to be a String or a Buffer."); - } - const needleLength = needle.length; - if (needleLength === 0) { - throw new Error("The needle cannot be an empty String/Buffer."); - } - if (needleLength > 256) { - throw new Error("The needle cannot have a length bigger than 256."); - } - this.maxMatches = Infinity; - this.matches = 0; - this._occ = new Array(256).fill(needleLength); - this._lookbehind_size = 0; - this._needle = needle; - this._bufpos = 0; - this._lookbehind = Buffer.alloc(needleLength); - for (var i = 0;i < needleLength - 1; ++i) { - this._occ[needle[i]] = needleLength - 1 - i; - } - } - inherits(SBMH, EventEmitter); - SBMH.prototype.reset = function() { - this._lookbehind_size = 0; - this.matches = 0; - this._bufpos = 0; - }; - SBMH.prototype.push = function(chunk, pos) { - if (!Buffer.isBuffer(chunk)) { - chunk = Buffer.from(chunk, "binary"); - } - const chlen = chunk.length; - this._bufpos = pos || 0; - let r; - while (r !== chlen && this.matches < this.maxMatches) { - r = this._sbmh_feed(chunk); - } - return r; - }; - SBMH.prototype._sbmh_feed = function(data) { - const len = data.length; - const needle = this._needle; - const needleLength = needle.length; - const lastNeedleChar = needle[needleLength - 1]; - let pos = -this._lookbehind_size; - let ch; - if (pos < 0) { - while (pos < 0 && pos <= len - needleLength) { - ch = this._sbmh_lookup_char(data, pos + needleLength - 1); - if (ch === lastNeedleChar && this._sbmh_memcmp(data, pos, needleLength - 1)) { - this._lookbehind_size = 0; - ++this.matches; - this.emit("info", true); - return this._bufpos = pos + needleLength; - } - pos += this._occ[ch]; - } - if (pos < 0) { - while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { - ++pos; - } - } - if (pos >= 0) { - this.emit("info", false, this._lookbehind, 0, this._lookbehind_size); - this._lookbehind_size = 0; - } else { - const bytesToCutOff = this._lookbehind_size + pos; - if (bytesToCutOff > 0) { - this.emit("info", false, this._lookbehind, 0, bytesToCutOff); - } - this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff, this._lookbehind_size - bytesToCutOff); - this._lookbehind_size -= bytesToCutOff; - data.copy(this._lookbehind, this._lookbehind_size); - this._lookbehind_size += len; - this._bufpos = len; - return len; - } - } - pos += (pos >= 0) * this._bufpos; - if (data.indexOf(needle, pos) !== -1) { - pos = data.indexOf(needle, pos); - ++this.matches; - if (pos > 0) { - this.emit("info", true, data, this._bufpos, pos); - } else { - this.emit("info", true); - } - return this._bufpos = pos + needleLength; - } else { - pos = len - needleLength; - } - while (pos < len && (data[pos] !== needle[0] || Buffer.compare(data.subarray(pos, pos + len - pos), needle.subarray(0, len - pos)) !== 0)) { - ++pos; - } - if (pos < len) { - data.copy(this._lookbehind, 0, pos, pos + (len - pos)); - this._lookbehind_size = len - pos; - } - if (pos > 0) { - this.emit("info", false, data, this._bufpos, pos < len ? pos : len); - } - this._bufpos = len; - return len; - }; - SBMH.prototype._sbmh_lookup_char = function(data, pos) { - return pos < 0 ? this._lookbehind[this._lookbehind_size + pos] : data[pos]; - }; - SBMH.prototype._sbmh_memcmp = function(data, pos, len) { - for (var i = 0;i < len; ++i) { - if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { - return false; - } - } - return true; - }; - module.exports = SBMH; -}); - -// ../node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js -var require_PartStream = __commonJS((exports, module) => { - var inherits = __require("node:util").inherits; - var ReadableStream = __require("node:stream").Readable; - function PartStream(opts) { - ReadableStream.call(this, opts); - } - inherits(PartStream, ReadableStream); - PartStream.prototype._read = function(n) { - }; - module.exports = PartStream; -}); - -// ../node_modules/@fastify/busboy/lib/utils/getLimit.js -var require_getLimit = __commonJS((exports, module) => { - module.exports = function getLimit(limits, name, defaultLimit) { - if (!limits || limits[name] === undefined || limits[name] === null) { - return defaultLimit; - } - if (typeof limits[name] !== "number" || isNaN(limits[name])) { - throw new TypeError("Limit " + name + " is not a valid number"); - } - return limits[name]; - }; -}); - -// ../node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js -var require_HeaderParser = __commonJS((exports, module) => { - var EventEmitter = __require("node:events").EventEmitter; - var inherits = __require("node:util").inherits; - var getLimit = require_getLimit(); - var StreamSearch = require_sbmh(); - var B_DCRLF = Buffer.from("\r\n\r\n"); - var RE_CRLF = /\r\n/g; - var RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/; - function HeaderParser(cfg) { - EventEmitter.call(this); - cfg = cfg || {}; - const self = this; - this.nread = 0; - this.maxed = false; - this.npairs = 0; - this.maxHeaderPairs = getLimit(cfg, "maxHeaderPairs", 2000); - this.maxHeaderSize = getLimit(cfg, "maxHeaderSize", 80 * 1024); - this.buffer = ""; - this.header = {}; - this.finished = false; - this.ss = new StreamSearch(B_DCRLF); - this.ss.on("info", function(isMatch, data, start, end) { - if (data && !self.maxed) { - if (self.nread + end - start >= self.maxHeaderSize) { - end = self.maxHeaderSize - self.nread + start; - self.nread = self.maxHeaderSize; - self.maxed = true; - } else { - self.nread += end - start; - } - self.buffer += data.toString("binary", start, end); - } - if (isMatch) { - self._finish(); - } - }); - } - inherits(HeaderParser, EventEmitter); - HeaderParser.prototype.push = function(data) { - const r = this.ss.push(data); - if (this.finished) { - return r; - } - }; - HeaderParser.prototype.reset = function() { - this.finished = false; - this.buffer = ""; - this.header = {}; - this.ss.reset(); - }; - HeaderParser.prototype._finish = function() { - if (this.buffer) { - this._parseHeader(); - } - this.ss.matches = this.ss.maxMatches; - const header = this.header; - this.header = {}; - this.buffer = ""; - this.finished = true; - this.nread = this.npairs = 0; - this.maxed = false; - this.emit("header", header); - }; - HeaderParser.prototype._parseHeader = function() { - if (this.npairs === this.maxHeaderPairs) { - return; - } - const lines = this.buffer.split(RE_CRLF); - const len = lines.length; - let m, h; - for (var i = 0;i < len; ++i) { - if (lines[i].length === 0) { - continue; - } - if (lines[i][0] === "\t" || lines[i][0] === " ") { - if (h) { - this.header[h][this.header[h].length - 1] += lines[i]; - continue; - } - } - const posColon = lines[i].indexOf(":"); - if (posColon === -1 || posColon === 0) { - return; - } - m = RE_HDR.exec(lines[i]); - h = m[1].toLowerCase(); - this.header[h] = this.header[h] || []; - this.header[h].push(m[2] || ""); - if (++this.npairs === this.maxHeaderPairs) { - break; - } - } - }; - module.exports = HeaderParser; -}); - -// ../node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js -var require_Dicer = __commonJS((exports, module) => { - var WritableStream = __require("node:stream").Writable; - var inherits = __require("node:util").inherits; - var StreamSearch = require_sbmh(); - var PartStream = require_PartStream(); - var HeaderParser = require_HeaderParser(); - var DASH = 45; - var B_ONEDASH = Buffer.from("-"); - var B_CRLF = Buffer.from("\r\n"); - var EMPTY_FN = function() { - }; - function Dicer(cfg) { - if (!(this instanceof Dicer)) { - return new Dicer(cfg); - } - WritableStream.call(this, cfg); - if (!cfg || !cfg.headerFirst && typeof cfg.boundary !== "string") { - throw new TypeError("Boundary required"); - } - if (typeof cfg.boundary === "string") { - this.setBoundary(cfg.boundary); - } else { - this._bparser = undefined; - } - this._headerFirst = cfg.headerFirst; - this._dashes = 0; - this._parts = 0; - this._finished = false; - this._realFinish = false; - this._isPreamble = true; - this._justMatched = false; - this._firstWrite = true; - this._inHeader = true; - this._part = undefined; - this._cb = undefined; - this._ignoreData = false; - this._partOpts = { highWaterMark: cfg.partHwm }; - this._pause = false; - const self = this; - this._hparser = new HeaderParser(cfg); - this._hparser.on("header", function(header) { - self._inHeader = false; - self._part.emit("header", header); - }); - } - inherits(Dicer, WritableStream); - Dicer.prototype.emit = function(ev) { - if (ev === "finish" && !this._realFinish) { - if (!this._finished) { - const self = this; - process.nextTick(function() { - self.emit("error", new Error("Unexpected end of multipart data")); - if (self._part && !self._ignoreData) { - const type = self._isPreamble ? "Preamble" : "Part"; - self._part.emit("error", new Error(type + " terminated early due to unexpected end of multipart data")); - self._part.push(null); - process.nextTick(function() { - self._realFinish = true; - self.emit("finish"); - self._realFinish = false; - }); - return; - } - self._realFinish = true; - self.emit("finish"); - self._realFinish = false; - }); - } - } else { - WritableStream.prototype.emit.apply(this, arguments); - } - }; - Dicer.prototype._write = function(data, encoding, cb) { - if (!this._hparser && !this._bparser) { - return cb(); - } - if (this._headerFirst && this._isPreamble) { - if (!this._part) { - this._part = new PartStream(this._partOpts); - if (this.listenerCount("preamble") !== 0) { - this.emit("preamble", this._part); - } else { - this._ignore(); - } - } - const r = this._hparser.push(data); - if (!this._inHeader && r !== undefined && r < data.length) { - data = data.slice(r); - } else { - return cb(); - } - } - if (this._firstWrite) { - this._bparser.push(B_CRLF); - this._firstWrite = false; - } - this._bparser.push(data); - if (this._pause) { - this._cb = cb; - } else { - cb(); - } - }; - Dicer.prototype.reset = function() { - this._part = undefined; - this._bparser = undefined; - this._hparser = undefined; - }; - Dicer.prototype.setBoundary = function(boundary) { - const self = this; - this._bparser = new StreamSearch("\r\n--" + boundary); - this._bparser.on("info", function(isMatch, data, start, end) { - self._oninfo(isMatch, data, start, end); - }); - }; - Dicer.prototype._ignore = function() { - if (this._part && !this._ignoreData) { - this._ignoreData = true; - this._part.on("error", EMPTY_FN); - this._part.resume(); - } - }; - Dicer.prototype._oninfo = function(isMatch, data, start, end) { - let buf; - const self = this; - let i = 0; - let r; - let shouldWriteMore = true; - if (!this._part && this._justMatched && data) { - while (this._dashes < 2 && start + i < end) { - if (data[start + i] === DASH) { - ++i; - ++this._dashes; - } else { - if (this._dashes) { - buf = B_ONEDASH; - } - this._dashes = 0; - break; - } - } - if (this._dashes === 2) { - if (start + i < end && this.listenerCount("trailer") !== 0) { - this.emit("trailer", data.slice(start + i, end)); - } - this.reset(); - this._finished = true; - if (self._parts === 0) { - self._realFinish = true; - self.emit("finish"); - self._realFinish = false; - } - } - if (this._dashes) { - return; - } - } - if (this._justMatched) { - this._justMatched = false; - } - if (!this._part) { - this._part = new PartStream(this._partOpts); - this._part._read = function(n) { - self._unpause(); - }; - if (this._isPreamble && this.listenerCount("preamble") !== 0) { - this.emit("preamble", this._part); - } else if (this._isPreamble !== true && this.listenerCount("part") !== 0) { - this.emit("part", this._part); - } else { - this._ignore(); - } - if (!this._isPreamble) { - this._inHeader = true; - } - } - if (data && start < end && !this._ignoreData) { - if (this._isPreamble || !this._inHeader) { - if (buf) { - shouldWriteMore = this._part.push(buf); - } - shouldWriteMore = this._part.push(data.slice(start, end)); - if (!shouldWriteMore) { - this._pause = true; - } - } else if (!this._isPreamble && this._inHeader) { - if (buf) { - this._hparser.push(buf); - } - r = this._hparser.push(data.slice(start, end)); - if (!this._inHeader && r !== undefined && r < end) { - this._oninfo(false, data, start + r, end); - } - } - } - if (isMatch) { - this._hparser.reset(); - if (this._isPreamble) { - this._isPreamble = false; - } else { - if (start !== end) { - ++this._parts; - this._part.on("end", function() { - if (--self._parts === 0) { - if (self._finished) { - self._realFinish = true; - self.emit("finish"); - self._realFinish = false; - } else { - self._unpause(); - } - } - }); - } - } - this._part.push(null); - this._part = undefined; - this._ignoreData = false; - this._justMatched = true; - this._dashes = 0; - } - }; - Dicer.prototype._unpause = function() { - if (!this._pause) { - return; - } - this._pause = false; - if (this._cb) { - const cb = this._cb; - this._cb = undefined; - cb(); - } - }; - module.exports = Dicer; -}); - -// ../node_modules/@fastify/busboy/lib/utils/decodeText.js -var require_decodeText = __commonJS((exports, module) => { - var utf8Decoder = new TextDecoder("utf-8"); - var textDecoders = new Map([ - ["utf-8", utf8Decoder], - ["utf8", utf8Decoder] - ]); - function getDecoder(charset) { - let lc; - while (true) { - switch (charset) { - case "utf-8": - case "utf8": - return decoders.utf8; - case "latin1": - case "ascii": - case "us-ascii": - case "iso-8859-1": - case "iso8859-1": - case "iso88591": - case "iso_8859-1": - case "windows-1252": - case "iso_8859-1:1987": - case "cp1252": - case "x-cp1252": - return decoders.latin1; - case "utf16le": - case "utf-16le": - case "ucs2": - case "ucs-2": - return decoders.utf16le; - case "base64": - return decoders.base64; - default: - if (lc === undefined) { - lc = true; - charset = charset.toLowerCase(); - continue; - } - return decoders.other.bind(charset); - } - } - } - var decoders = { - utf8: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - return data.utf8Slice(0, data.length); - }, - latin1: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - return data; - } - return data.latin1Slice(0, data.length); - }, - utf16le: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - return data.ucs2Slice(0, data.length); - }, - base64: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - return data.base64Slice(0, data.length); - }, - other: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - if (textDecoders.has(exports.toString())) { - try { - return textDecoders.get(exports).decode(data); - } catch { - } - } - return typeof data === "string" ? data : data.toString(); - } - }; - function decodeText(text, sourceEncoding, destEncoding) { - if (text) { - return getDecoder(destEncoding)(text, sourceEncoding); - } - return text; - } - module.exports = decodeText; -}); - -// ../node_modules/@fastify/busboy/lib/utils/parseParams.js -var require_parseParams = __commonJS((exports, module) => { - var decodeText = require_decodeText(); - var RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g; - var EncodedLookup = { - "%00": "\0", - "%01": "\x01", - "%02": "\x02", - "%03": "\x03", - "%04": "\x04", - "%05": "\x05", - "%06": "\x06", - "%07": "\x07", - "%08": "\b", - "%09": "\t", - "%0a": ` -`, - "%0A": ` -`, - "%0b": "\v", - "%0B": "\v", - "%0c": "\f", - "%0C": "\f", - "%0d": `\r`, - "%0D": `\r`, - "%0e": "\x0E", - "%0E": "\x0E", - "%0f": "\x0F", - "%0F": "\x0F", - "%10": "\x10", - "%11": "\x11", - "%12": "\x12", - "%13": "\x13", - "%14": "\x14", - "%15": "\x15", - "%16": "\x16", - "%17": "\x17", - "%18": "\x18", - "%19": "\x19", - "%1a": "\x1A", - "%1A": "\x1A", - "%1b": "\x1B", - "%1B": "\x1B", - "%1c": "\x1C", - "%1C": "\x1C", - "%1d": "\x1D", - "%1D": "\x1D", - "%1e": "\x1E", - "%1E": "\x1E", - "%1f": "\x1F", - "%1F": "\x1F", - "%20": " ", - "%21": "!", - "%22": '"', - "%23": "#", - "%24": "$", - "%25": "%", - "%26": "&", - "%27": "'", - "%28": "(", - "%29": ")", - "%2a": "*", - "%2A": "*", - "%2b": "+", - "%2B": "+", - "%2c": ",", - "%2C": ",", - "%2d": "-", - "%2D": "-", - "%2e": ".", - "%2E": ".", - "%2f": "/", - "%2F": "/", - "%30": "0", - "%31": "1", - "%32": "2", - "%33": "3", - "%34": "4", - "%35": "5", - "%36": "6", - "%37": "7", - "%38": "8", - "%39": "9", - "%3a": ":", - "%3A": ":", - "%3b": ";", - "%3B": ";", - "%3c": "<", - "%3C": "<", - "%3d": "=", - "%3D": "=", - "%3e": ">", - "%3E": ">", - "%3f": "?", - "%3F": "?", - "%40": "@", - "%41": "A", - "%42": "B", - "%43": "C", - "%44": "D", - "%45": "E", - "%46": "F", - "%47": "G", - "%48": "H", - "%49": "I", - "%4a": "J", - "%4A": "J", - "%4b": "K", - "%4B": "K", - "%4c": "L", - "%4C": "L", - "%4d": "M", - "%4D": "M", - "%4e": "N", - "%4E": "N", - "%4f": "O", - "%4F": "O", - "%50": "P", - "%51": "Q", - "%52": "R", - "%53": "S", - "%54": "T", - "%55": "U", - "%56": "V", - "%57": "W", - "%58": "X", - "%59": "Y", - "%5a": "Z", - "%5A": "Z", - "%5b": "[", - "%5B": "[", - "%5c": "\\", - "%5C": "\\", - "%5d": "]", - "%5D": "]", - "%5e": "^", - "%5E": "^", - "%5f": "_", - "%5F": "_", - "%60": "`", - "%61": "a", - "%62": "b", - "%63": "c", - "%64": "d", - "%65": "e", - "%66": "f", - "%67": "g", - "%68": "h", - "%69": "i", - "%6a": "j", - "%6A": "j", - "%6b": "k", - "%6B": "k", - "%6c": "l", - "%6C": "l", - "%6d": "m", - "%6D": "m", - "%6e": "n", - "%6E": "n", - "%6f": "o", - "%6F": "o", - "%70": "p", - "%71": "q", - "%72": "r", - "%73": "s", - "%74": "t", - "%75": "u", - "%76": "v", - "%77": "w", - "%78": "x", - "%79": "y", - "%7a": "z", - "%7A": "z", - "%7b": "{", - "%7B": "{", - "%7c": "|", - "%7C": "|", - "%7d": "}", - "%7D": "}", - "%7e": "~", - "%7E": "~", - "%7f": "\x7F", - "%7F": "\x7F", - "%80": "\x80", - "%81": "\x81", - "%82": "\x82", - "%83": "\x83", - "%84": "\x84", - "%85": "\x85", - "%86": "\x86", - "%87": "\x87", - "%88": "\x88", - "%89": "\x89", - "%8a": "\x8A", - "%8A": "\x8A", - "%8b": "\x8B", - "%8B": "\x8B", - "%8c": "\x8C", - "%8C": "\x8C", - "%8d": "\x8D", - "%8D": "\x8D", - "%8e": "\x8E", - "%8E": "\x8E", - "%8f": "\x8F", - "%8F": "\x8F", - "%90": "\x90", - "%91": "\x91", - "%92": "\x92", - "%93": "\x93", - "%94": "\x94", - "%95": "\x95", - "%96": "\x96", - "%97": "\x97", - "%98": "\x98", - "%99": "\x99", - "%9a": "\x9A", - "%9A": "\x9A", - "%9b": "\x9B", - "%9B": "\x9B", - "%9c": "\x9C", - "%9C": "\x9C", - "%9d": "\x9D", - "%9D": "\x9D", - "%9e": "\x9E", - "%9E": "\x9E", - "%9f": "\x9F", - "%9F": "\x9F", - "%a0": "\xA0", - "%A0": "\xA0", - "%a1": "\xA1", - "%A1": "\xA1", - "%a2": "\xA2", - "%A2": "\xA2", - "%a3": "\xA3", - "%A3": "\xA3", - "%a4": "\xA4", - "%A4": "\xA4", - "%a5": "\xA5", - "%A5": "\xA5", - "%a6": "\xA6", - "%A6": "\xA6", - "%a7": "\xA7", - "%A7": "\xA7", - "%a8": "\xA8", - "%A8": "\xA8", - "%a9": "\xA9", - "%A9": "\xA9", - "%aa": "\xAA", - "%Aa": "\xAA", - "%aA": "\xAA", - "%AA": "\xAA", - "%ab": "\xAB", - "%Ab": "\xAB", - "%aB": "\xAB", - "%AB": "\xAB", - "%ac": "\xAC", - "%Ac": "\xAC", - "%aC": "\xAC", - "%AC": "\xAC", - "%ad": "\xAD", - "%Ad": "\xAD", - "%aD": "\xAD", - "%AD": "\xAD", - "%ae": "\xAE", - "%Ae": "\xAE", - "%aE": "\xAE", - "%AE": "\xAE", - "%af": "\xAF", - "%Af": "\xAF", - "%aF": "\xAF", - "%AF": "\xAF", - "%b0": "\xB0", - "%B0": "\xB0", - "%b1": "\xB1", - "%B1": "\xB1", - "%b2": "\xB2", - "%B2": "\xB2", - "%b3": "\xB3", - "%B3": "\xB3", - "%b4": "\xB4", - "%B4": "\xB4", - "%b5": "\xB5", - "%B5": "\xB5", - "%b6": "\xB6", - "%B6": "\xB6", - "%b7": "\xB7", - "%B7": "\xB7", - "%b8": "\xB8", - "%B8": "\xB8", - "%b9": "\xB9", - "%B9": "\xB9", - "%ba": "\xBA", - "%Ba": "\xBA", - "%bA": "\xBA", - "%BA": "\xBA", - "%bb": "\xBB", - "%Bb": "\xBB", - "%bB": "\xBB", - "%BB": "\xBB", - "%bc": "\xBC", - "%Bc": "\xBC", - "%bC": "\xBC", - "%BC": "\xBC", - "%bd": "\xBD", - "%Bd": "\xBD", - "%bD": "\xBD", - "%BD": "\xBD", - "%be": "\xBE", - "%Be": "\xBE", - "%bE": "\xBE", - "%BE": "\xBE", - "%bf": "\xBF", - "%Bf": "\xBF", - "%bF": "\xBF", - "%BF": "\xBF", - "%c0": "\xC0", - "%C0": "\xC0", - "%c1": "\xC1", - "%C1": "\xC1", - "%c2": "\xC2", - "%C2": "\xC2", - "%c3": "\xC3", - "%C3": "\xC3", - "%c4": "\xC4", - "%C4": "\xC4", - "%c5": "\xC5", - "%C5": "\xC5", - "%c6": "\xC6", - "%C6": "\xC6", - "%c7": "\xC7", - "%C7": "\xC7", - "%c8": "\xC8", - "%C8": "\xC8", - "%c9": "\xC9", - "%C9": "\xC9", - "%ca": "\xCA", - "%Ca": "\xCA", - "%cA": "\xCA", - "%CA": "\xCA", - "%cb": "\xCB", - "%Cb": "\xCB", - "%cB": "\xCB", - "%CB": "\xCB", - "%cc": "\xCC", - "%Cc": "\xCC", - "%cC": "\xCC", - "%CC": "\xCC", - "%cd": "\xCD", - "%Cd": "\xCD", - "%cD": "\xCD", - "%CD": "\xCD", - "%ce": "\xCE", - "%Ce": "\xCE", - "%cE": "\xCE", - "%CE": "\xCE", - "%cf": "\xCF", - "%Cf": "\xCF", - "%cF": "\xCF", - "%CF": "\xCF", - "%d0": "\xD0", - "%D0": "\xD0", - "%d1": "\xD1", - "%D1": "\xD1", - "%d2": "\xD2", - "%D2": "\xD2", - "%d3": "\xD3", - "%D3": "\xD3", - "%d4": "\xD4", - "%D4": "\xD4", - "%d5": "\xD5", - "%D5": "\xD5", - "%d6": "\xD6", - "%D6": "\xD6", - "%d7": "\xD7", - "%D7": "\xD7", - "%d8": "\xD8", - "%D8": "\xD8", - "%d9": "\xD9", - "%D9": "\xD9", - "%da": "\xDA", - "%Da": "\xDA", - "%dA": "\xDA", - "%DA": "\xDA", - "%db": "\xDB", - "%Db": "\xDB", - "%dB": "\xDB", - "%DB": "\xDB", - "%dc": "\xDC", - "%Dc": "\xDC", - "%dC": "\xDC", - "%DC": "\xDC", - "%dd": "\xDD", - "%Dd": "\xDD", - "%dD": "\xDD", - "%DD": "\xDD", - "%de": "\xDE", - "%De": "\xDE", - "%dE": "\xDE", - "%DE": "\xDE", - "%df": "\xDF", - "%Df": "\xDF", - "%dF": "\xDF", - "%DF": "\xDF", - "%e0": "\xE0", - "%E0": "\xE0", - "%e1": "\xE1", - "%E1": "\xE1", - "%e2": "\xE2", - "%E2": "\xE2", - "%e3": "\xE3", - "%E3": "\xE3", - "%e4": "\xE4", - "%E4": "\xE4", - "%e5": "\xE5", - "%E5": "\xE5", - "%e6": "\xE6", - "%E6": "\xE6", - "%e7": "\xE7", - "%E7": "\xE7", - "%e8": "\xE8", - "%E8": "\xE8", - "%e9": "\xE9", - "%E9": "\xE9", - "%ea": "\xEA", - "%Ea": "\xEA", - "%eA": "\xEA", - "%EA": "\xEA", - "%eb": "\xEB", - "%Eb": "\xEB", - "%eB": "\xEB", - "%EB": "\xEB", - "%ec": "\xEC", - "%Ec": "\xEC", - "%eC": "\xEC", - "%EC": "\xEC", - "%ed": "\xED", - "%Ed": "\xED", - "%eD": "\xED", - "%ED": "\xED", - "%ee": "\xEE", - "%Ee": "\xEE", - "%eE": "\xEE", - "%EE": "\xEE", - "%ef": "\xEF", - "%Ef": "\xEF", - "%eF": "\xEF", - "%EF": "\xEF", - "%f0": "\xF0", - "%F0": "\xF0", - "%f1": "\xF1", - "%F1": "\xF1", - "%f2": "\xF2", - "%F2": "\xF2", - "%f3": "\xF3", - "%F3": "\xF3", - "%f4": "\xF4", - "%F4": "\xF4", - "%f5": "\xF5", - "%F5": "\xF5", - "%f6": "\xF6", - "%F6": "\xF6", - "%f7": "\xF7", - "%F7": "\xF7", - "%f8": "\xF8", - "%F8": "\xF8", - "%f9": "\xF9", - "%F9": "\xF9", - "%fa": "\xFA", - "%Fa": "\xFA", - "%fA": "\xFA", - "%FA": "\xFA", - "%fb": "\xFB", - "%Fb": "\xFB", - "%fB": "\xFB", - "%FB": "\xFB", - "%fc": "\xFC", - "%Fc": "\xFC", - "%fC": "\xFC", - "%FC": "\xFC", - "%fd": "\xFD", - "%Fd": "\xFD", - "%fD": "\xFD", - "%FD": "\xFD", - "%fe": "\xFE", - "%Fe": "\xFE", - "%fE": "\xFE", - "%FE": "\xFE", - "%ff": "\xFF", - "%Ff": "\xFF", - "%fF": "\xFF", - "%FF": "\xFF" - }; - function encodedReplacer(match) { - return EncodedLookup[match]; - } - var STATE_KEY = 0; - var STATE_VALUE = 1; - var STATE_CHARSET = 2; - var STATE_LANG = 3; - function parseParams(str) { - const res = []; - let state = STATE_KEY; - let charset = ""; - let inquote = false; - let escaping = false; - let p = 0; - let tmp = ""; - const len = str.length; - for (var i = 0;i < len; ++i) { - const char = str[i]; - if (char === "\\" && inquote) { - if (escaping) { - escaping = false; - } else { - escaping = true; - continue; - } - } else if (char === '"') { - if (!escaping) { - if (inquote) { - inquote = false; - state = STATE_KEY; - } else { - inquote = true; - } - continue; - } else { - escaping = false; - } - } else { - if (escaping && inquote) { - tmp += "\\"; - } - escaping = false; - if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") { - if (state === STATE_CHARSET) { - state = STATE_LANG; - charset = tmp.substring(1); - } else { - state = STATE_VALUE; - } - tmp = ""; - continue; - } else if (state === STATE_KEY && (char === "*" || char === "=") && res.length) { - state = char === "*" ? STATE_CHARSET : STATE_VALUE; - res[p] = [tmp, undefined]; - tmp = ""; - continue; - } else if (!inquote && char === ";") { - state = STATE_KEY; - if (charset) { - if (tmp.length) { - tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), "binary", charset); - } - charset = ""; - } else if (tmp.length) { - tmp = decodeText(tmp, "binary", "utf8"); - } - if (res[p] === undefined) { - res[p] = tmp; - } else { - res[p][1] = tmp; - } - tmp = ""; - ++p; - continue; - } else if (!inquote && (char === " " || char === "\t")) { - continue; - } - } - tmp += char; - } - if (charset && tmp.length) { - tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), "binary", charset); - } else if (tmp) { - tmp = decodeText(tmp, "binary", "utf8"); - } - if (res[p] === undefined) { - if (tmp) { - res[p] = tmp; - } - } else { - res[p][1] = tmp; - } - return res; - } - module.exports = parseParams; -}); - -// ../node_modules/@fastify/busboy/lib/utils/basename.js -var require_basename = __commonJS((exports, module) => { - module.exports = function basename(path) { - if (typeof path !== "string") { - return ""; - } - for (var i = path.length - 1;i >= 0; --i) { - switch (path.charCodeAt(i)) { - case 47: - case 92: - path = path.slice(i + 1); - return path === ".." || path === "." ? "" : path; - } - } - return path === ".." || path === "." ? "" : path; - }; -}); - -// ../node_modules/@fastify/busboy/lib/types/multipart.js -var require_multipart = __commonJS((exports, module) => { - var { Readable } = __require("node:stream"); - var { inherits } = __require("node:util"); - var Dicer = require_Dicer(); - var parseParams = require_parseParams(); - var decodeText = require_decodeText(); - var basename = require_basename(); - var getLimit = require_getLimit(); - var RE_BOUNDARY = /^boundary$/i; - var RE_FIELD = /^form-data$/i; - var RE_CHARSET = /^charset$/i; - var RE_FILENAME = /^filename$/i; - var RE_NAME = /^name$/i; - Multipart.detect = /^multipart\/form-data/i; - function Multipart(boy, cfg) { - let i; - let len; - const self = this; - let boundary; - const limits = cfg.limits; - const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => contentType === "application/octet-stream" || fileName !== undefined); - const parsedConType = cfg.parsedConType || []; - const defCharset = cfg.defCharset || "utf8"; - const preservePath = cfg.preservePath; - const fileOpts = { highWaterMark: cfg.fileHwm }; - for (i = 0, len = parsedConType.length;i < len; ++i) { - if (Array.isArray(parsedConType[i]) && RE_BOUNDARY.test(parsedConType[i][0])) { - boundary = parsedConType[i][1]; - break; - } - } - function checkFinished() { - if (nends === 0 && finished && !boy._done) { - finished = false; - self.end(); - } - } - if (typeof boundary !== "string") { - throw new Error("Multipart: Boundary not found"); - } - const fieldSizeLimit = getLimit(limits, "fieldSize", 1 * 1024 * 1024); - const fileSizeLimit = getLimit(limits, "fileSize", Infinity); - const filesLimit = getLimit(limits, "files", Infinity); - const fieldsLimit = getLimit(limits, "fields", Infinity); - const partsLimit = getLimit(limits, "parts", Infinity); - const headerPairsLimit = getLimit(limits, "headerPairs", 2000); - const headerSizeLimit = getLimit(limits, "headerSize", 80 * 1024); - let nfiles = 0; - let nfields = 0; - let nends = 0; - let curFile; - let curField; - let finished = false; - this._needDrain = false; - this._pause = false; - this._cb = undefined; - this._nparts = 0; - this._boy = boy; - const parserCfg = { - boundary, - maxHeaderPairs: headerPairsLimit, - maxHeaderSize: headerSizeLimit, - partHwm: fileOpts.highWaterMark, - highWaterMark: cfg.highWaterMark - }; - this.parser = new Dicer(parserCfg); - this.parser.on("drain", function() { - self._needDrain = false; - if (self._cb && !self._pause) { - const cb = self._cb; - self._cb = undefined; - cb(); - } - }).on("part", function onPart(part) { - if (++self._nparts > partsLimit) { - self.parser.removeListener("part", onPart); - self.parser.on("part", skipPart); - boy.hitPartsLimit = true; - boy.emit("partsLimit"); - return skipPart(part); - } - if (curField) { - const field = curField; - field.emit("end"); - field.removeAllListeners("end"); - } - part.on("header", function(header) { - let contype; - let fieldname; - let parsed; - let charset; - let encoding; - let filename; - let nsize = 0; - if (header["content-type"]) { - parsed = parseParams(header["content-type"][0]); - if (parsed[0]) { - contype = parsed[0].toLowerCase(); - for (i = 0, len = parsed.length;i < len; ++i) { - if (RE_CHARSET.test(parsed[i][0])) { - charset = parsed[i][1].toLowerCase(); - break; - } - } - } - } - if (contype === undefined) { - contype = "text/plain"; - } - if (charset === undefined) { - charset = defCharset; - } - if (header["content-disposition"]) { - parsed = parseParams(header["content-disposition"][0]); - if (!RE_FIELD.test(parsed[0])) { - return skipPart(part); - } - for (i = 0, len = parsed.length;i < len; ++i) { - if (RE_NAME.test(parsed[i][0])) { - fieldname = parsed[i][1]; - } else if (RE_FILENAME.test(parsed[i][0])) { - filename = parsed[i][1]; - if (!preservePath) { - filename = basename(filename); - } - } - } - } else { - return skipPart(part); - } - if (header["content-transfer-encoding"]) { - encoding = header["content-transfer-encoding"][0].toLowerCase(); - } else { - encoding = "7bit"; - } - let onData, onEnd; - if (isPartAFile(fieldname, contype, filename)) { - if (nfiles === filesLimit) { - if (!boy.hitFilesLimit) { - boy.hitFilesLimit = true; - boy.emit("filesLimit"); - } - return skipPart(part); - } - ++nfiles; - if (boy.listenerCount("file") === 0) { - self.parser._ignore(); - return; - } - ++nends; - const file = new FileStream(fileOpts); - curFile = file; - file.on("end", function() { - --nends; - self._pause = false; - checkFinished(); - if (self._cb && !self._needDrain) { - const cb = self._cb; - self._cb = undefined; - cb(); - } - }); - file._read = function(n) { - if (!self._pause) { - return; - } - self._pause = false; - if (self._cb && !self._needDrain) { - const cb = self._cb; - self._cb = undefined; - cb(); - } - }; - boy.emit("file", fieldname, file, filename, encoding, contype); - onData = function(data) { - if ((nsize += data.length) > fileSizeLimit) { - const extralen = fileSizeLimit - nsize + data.length; - if (extralen > 0) { - file.push(data.slice(0, extralen)); - } - file.truncated = true; - file.bytesRead = fileSizeLimit; - part.removeAllListeners("data"); - file.emit("limit"); - return; - } else if (!file.push(data)) { - self._pause = true; - } - file.bytesRead = nsize; - }; - onEnd = function() { - curFile = undefined; - file.push(null); - }; - } else { - if (nfields === fieldsLimit) { - if (!boy.hitFieldsLimit) { - boy.hitFieldsLimit = true; - boy.emit("fieldsLimit"); - } - return skipPart(part); - } - ++nfields; - ++nends; - let buffer = ""; - let truncated = false; - curField = part; - onData = function(data) { - if ((nsize += data.length) > fieldSizeLimit) { - const extralen = fieldSizeLimit - (nsize - data.length); - buffer += data.toString("binary", 0, extralen); - truncated = true; - part.removeAllListeners("data"); - } else { - buffer += data.toString("binary"); - } - }; - onEnd = function() { - curField = undefined; - if (buffer.length) { - buffer = decodeText(buffer, "binary", charset); - } - boy.emit("field", fieldname, buffer, false, truncated, encoding, contype); - --nends; - checkFinished(); - }; - } - part._readableState.sync = false; - part.on("data", onData); - part.on("end", onEnd); - }).on("error", function(err) { - if (curFile) { - curFile.emit("error", err); - } - }); - }).on("error", function(err) { - boy.emit("error", err); - }).on("finish", function() { - finished = true; - checkFinished(); - }); - } - Multipart.prototype.write = function(chunk, cb) { - const r = this.parser.write(chunk); - if (r && !this._pause) { - cb(); - } else { - this._needDrain = !r; - this._cb = cb; - } - }; - Multipart.prototype.end = function() { - const self = this; - if (self.parser.writable) { - self.parser.end(); - } else if (!self._boy._done) { - process.nextTick(function() { - self._boy._done = true; - self._boy.emit("finish"); - }); - } - }; - function skipPart(part) { - part.resume(); - } - function FileStream(opts) { - Readable.call(this, opts); - this.bytesRead = 0; - this.truncated = false; - } - inherits(FileStream, Readable); - FileStream.prototype._read = function(n) { - }; - module.exports = Multipart; -}); - -// ../node_modules/@fastify/busboy/lib/utils/Decoder.js -var require_Decoder = __commonJS((exports, module) => { - var RE_PLUS = /\+/g; - var HEX = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ]; - function Decoder() { - this.buffer = undefined; - } - Decoder.prototype.write = function(str) { - str = str.replace(RE_PLUS, " "); - let res = ""; - let i = 0; - let p = 0; - const len = str.length; - for (;i < len; ++i) { - if (this.buffer !== undefined) { - if (!HEX[str.charCodeAt(i)]) { - res += "%" + this.buffer; - this.buffer = undefined; - --i; - } else { - this.buffer += str[i]; - ++p; - if (this.buffer.length === 2) { - res += String.fromCharCode(parseInt(this.buffer, 16)); - this.buffer = undefined; - } - } - } else if (str[i] === "%") { - if (i > p) { - res += str.substring(p, i); - p = i; - } - this.buffer = ""; - ++p; - } - } - if (p < len && this.buffer === undefined) { - res += str.substring(p); - } - return res; - }; - Decoder.prototype.reset = function() { - this.buffer = undefined; - }; - module.exports = Decoder; -}); - -// ../node_modules/@fastify/busboy/lib/types/urlencoded.js -var require_urlencoded = __commonJS((exports, module) => { - var Decoder = require_Decoder(); - var decodeText = require_decodeText(); - var getLimit = require_getLimit(); - var RE_CHARSET = /^charset$/i; - UrlEncoded.detect = /^application\/x-www-form-urlencoded/i; - function UrlEncoded(boy, cfg) { - const limits = cfg.limits; - const parsedConType = cfg.parsedConType; - this.boy = boy; - this.fieldSizeLimit = getLimit(limits, "fieldSize", 1 * 1024 * 1024); - this.fieldNameSizeLimit = getLimit(limits, "fieldNameSize", 100); - this.fieldsLimit = getLimit(limits, "fields", Infinity); - let charset; - for (var i = 0, len = parsedConType.length;i < len; ++i) { - if (Array.isArray(parsedConType[i]) && RE_CHARSET.test(parsedConType[i][0])) { - charset = parsedConType[i][1].toLowerCase(); - break; - } - } - if (charset === undefined) { - charset = cfg.defCharset || "utf8"; - } - this.decoder = new Decoder; - this.charset = charset; - this._fields = 0; - this._state = "key"; - this._checkingBytes = true; - this._bytesKey = 0; - this._bytesVal = 0; - this._key = ""; - this._val = ""; - this._keyTrunc = false; - this._valTrunc = false; - this._hitLimit = false; - } - UrlEncoded.prototype.write = function(data, cb) { - if (this._fields === this.fieldsLimit) { - if (!this.boy.hitFieldsLimit) { - this.boy.hitFieldsLimit = true; - this.boy.emit("fieldsLimit"); - } - return cb(); - } - let idxeq; - let idxamp; - let i; - let p = 0; - const len = data.length; - while (p < len) { - if (this._state === "key") { - idxeq = idxamp = undefined; - for (i = p;i < len; ++i) { - if (!this._checkingBytes) { - ++p; - } - if (data[i] === 61) { - idxeq = i; - break; - } else if (data[i] === 38) { - idxamp = i; - break; - } - if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { - this._hitLimit = true; - break; - } else if (this._checkingBytes) { - ++this._bytesKey; - } - } - if (idxeq !== undefined) { - if (idxeq > p) { - this._key += this.decoder.write(data.toString("binary", p, idxeq)); - } - this._state = "val"; - this._hitLimit = false; - this._checkingBytes = true; - this._val = ""; - this._bytesVal = 0; - this._valTrunc = false; - this.decoder.reset(); - p = idxeq + 1; - } else if (idxamp !== undefined) { - ++this._fields; - let key; - const keyTrunc = this._keyTrunc; - if (idxamp > p) { - key = this._key += this.decoder.write(data.toString("binary", p, idxamp)); - } else { - key = this._key; - } - this._hitLimit = false; - this._checkingBytes = true; - this._key = ""; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - if (key.length) { - this.boy.emit("field", decodeText(key, "binary", this.charset), "", keyTrunc, false); - } - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { - return cb(); - } - } else if (this._hitLimit) { - if (i > p) { - this._key += this.decoder.write(data.toString("binary", p, i)); - } - p = i; - if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { - this._checkingBytes = false; - this._keyTrunc = true; - } - } else { - if (p < len) { - this._key += this.decoder.write(data.toString("binary", p)); - } - p = len; - } - } else { - idxamp = undefined; - for (i = p;i < len; ++i) { - if (!this._checkingBytes) { - ++p; - } - if (data[i] === 38) { - idxamp = i; - break; - } - if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { - this._hitLimit = true; - break; - } else if (this._checkingBytes) { - ++this._bytesVal; - } - } - if (idxamp !== undefined) { - ++this._fields; - if (idxamp > p) { - this._val += this.decoder.write(data.toString("binary", p, idxamp)); - } - this.boy.emit("field", decodeText(this._key, "binary", this.charset), decodeText(this._val, "binary", this.charset), this._keyTrunc, this._valTrunc); - this._state = "key"; - this._hitLimit = false; - this._checkingBytes = true; - this._key = ""; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { - return cb(); - } - } else if (this._hitLimit) { - if (i > p) { - this._val += this.decoder.write(data.toString("binary", p, i)); - } - p = i; - if (this._val === "" && this.fieldSizeLimit === 0 || (this._bytesVal = this._val.length) === this.fieldSizeLimit) { - this._checkingBytes = false; - this._valTrunc = true; - } - } else { - if (p < len) { - this._val += this.decoder.write(data.toString("binary", p)); - } - p = len; - } - } - } - cb(); - }; - UrlEncoded.prototype.end = function() { - if (this.boy._done) { - return; - } - if (this._state === "key" && this._key.length > 0) { - this.boy.emit("field", decodeText(this._key, "binary", this.charset), "", this._keyTrunc, false); - } else if (this._state === "val") { - this.boy.emit("field", decodeText(this._key, "binary", this.charset), decodeText(this._val, "binary", this.charset), this._keyTrunc, this._valTrunc); - } - this.boy._done = true; - this.boy.emit("finish"); - }; - module.exports = UrlEncoded; -}); - -// ../node_modules/@fastify/busboy/lib/main.js -var require_main = __commonJS((exports, module) => { - var WritableStream = __require("node:stream").Writable; - var { inherits } = __require("node:util"); - var Dicer = require_Dicer(); - var MultipartParser = require_multipart(); - var UrlencodedParser = require_urlencoded(); - var parseParams = require_parseParams(); - function Busboy(opts) { - if (!(this instanceof Busboy)) { - return new Busboy(opts); - } - if (typeof opts !== "object") { - throw new TypeError("Busboy expected an options-Object."); - } - if (typeof opts.headers !== "object") { - throw new TypeError("Busboy expected an options-Object with headers-attribute."); - } - if (typeof opts.headers["content-type"] !== "string") { - throw new TypeError("Missing Content-Type-header."); - } - const { - headers, - ...streamOptions - } = opts; - this.opts = { - autoDestroy: false, - ...streamOptions - }; - WritableStream.call(this, this.opts); - this._done = false; - this._parser = this.getParserByHeaders(headers); - this._finished = false; - } - inherits(Busboy, WritableStream); - Busboy.prototype.emit = function(ev) { - if (ev === "finish") { - if (!this._done) { - this._parser?.end(); - return; - } else if (this._finished) { - return; - } - this._finished = true; - } - WritableStream.prototype.emit.apply(this, arguments); - }; - Busboy.prototype.getParserByHeaders = function(headers) { - const parsed = parseParams(headers["content-type"]); - const cfg = { - defCharset: this.opts.defCharset, - fileHwm: this.opts.fileHwm, - headers, - highWaterMark: this.opts.highWaterMark, - isPartAFile: this.opts.isPartAFile, - limits: this.opts.limits, - parsedConType: parsed, - preservePath: this.opts.preservePath - }; - if (MultipartParser.detect.test(parsed[0])) { - return new MultipartParser(this, cfg); - } - if (UrlencodedParser.detect.test(parsed[0])) { - return new UrlencodedParser(this, cfg); - } - throw new Error("Unsupported Content-Type."); - }; - Busboy.prototype._write = function(chunk, encoding, cb) { - this._parser.write(chunk, cb); - }; - module.exports = Busboy; - module.exports.default = Busboy; - module.exports.Busboy = Busboy; - module.exports.Dicer = Dicer; -}); - -// ../node_modules/undici/lib/fetch/constants.js -var require_constants2 = __commonJS((exports, module) => { - var { MessageChannel, receiveMessageOnPort } = __require("worker_threads"); - var corsSafeListedMethods = ["GET", "HEAD", "POST"]; - var corsSafeListedMethodsSet = new Set(corsSafeListedMethods); - var nullBodyStatus = [101, 204, 205, 304]; - var redirectStatus = [301, 302, 303, 307, 308]; - var redirectStatusSet = new Set(redirectStatus); - var badPorts = [ - "1", - "7", - "9", - "11", - "13", - "15", - "17", - "19", - "20", - "21", - "22", - "23", - "25", - "37", - "42", - "43", - "53", - "69", - "77", - "79", - "87", - "95", - "101", - "102", - "103", - "104", - "109", - "110", - "111", - "113", - "115", - "117", - "119", - "123", - "135", - "137", - "139", - "143", - "161", - "179", - "389", - "427", - "465", - "512", - "513", - "514", - "515", - "526", - "530", - "531", - "532", - "540", - "548", - "554", - "556", - "563", - "587", - "601", - "636", - "989", - "990", - "993", - "995", - "1719", - "1720", - "1723", - "2049", - "3659", - "4045", - "5060", - "5061", - "6000", - "6566", - "6665", - "6666", - "6667", - "6668", - "6669", - "6697", - "10080" - ]; - var badPortsSet = new Set(badPorts); - var referrerPolicy = [ - "", - "no-referrer", - "no-referrer-when-downgrade", - "same-origin", - "origin", - "strict-origin", - "origin-when-cross-origin", - "strict-origin-when-cross-origin", - "unsafe-url" - ]; - var referrerPolicySet = new Set(referrerPolicy); - var requestRedirect = ["follow", "manual", "error"]; - var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"]; - var safeMethodsSet = new Set(safeMethods); - var requestMode = ["navigate", "same-origin", "no-cors", "cors"]; - var requestCredentials = ["omit", "same-origin", "include"]; - var requestCache = [ - "default", - "no-store", - "reload", - "no-cache", - "force-cache", - "only-if-cached" - ]; - var requestBodyHeader = [ - "content-encoding", - "content-language", - "content-location", - "content-type", - "content-length" - ]; - var requestDuplex = [ - "half" - ]; - var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; - var forbiddenMethodsSet = new Set(forbiddenMethods); - var subresource = [ - "audio", - "audioworklet", - "font", - "image", - "manifest", - "paintworklet", - "script", - "style", - "track", - "video", - "xslt", - "" - ]; - var subresourceSet = new Set(subresource); - var DOMException2 = globalThis.DOMException ?? (() => { - try { - atob("~"); - } catch (err) { - return Object.getPrototypeOf(err).constructor; - } - })(); - var channel; - var structuredClone = globalThis.structuredClone ?? function structuredClone(value, options = undefined) { - if (arguments.length === 0) { - throw new TypeError("missing argument"); - } - if (!channel) { - channel = new MessageChannel; - } - channel.port1.unref(); - channel.port2.unref(); - channel.port1.postMessage(value, options?.transfer); - return receiveMessageOnPort(channel.port2).message; - }; - module.exports = { - DOMException: DOMException2, - structuredClone, - subresource, - forbiddenMethods, - requestBodyHeader, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - redirectStatus, - corsSafeListedMethods, - nullBodyStatus, - safeMethods, - badPorts, - requestDuplex, - subresourceSet, - badPortsSet, - redirectStatusSet, - corsSafeListedMethodsSet, - safeMethodsSet, - forbiddenMethodsSet, - referrerPolicySet - }; -}); - -// ../node_modules/undici/lib/fetch/global.js -var require_global = __commonJS((exports, module) => { - var globalOrigin = Symbol.for("undici.globalOrigin.1"); - function getGlobalOrigin() { - return globalThis[globalOrigin]; - } - function setGlobalOrigin(newOrigin) { - if (newOrigin === undefined) { - Object.defineProperty(globalThis, globalOrigin, { - value: undefined, - writable: true, - enumerable: false, - configurable: false - }); - return; - } - const parsedURL = new URL(newOrigin); - if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { - throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); - } - Object.defineProperty(globalThis, globalOrigin, { - value: parsedURL, - writable: true, - enumerable: false, - configurable: false - }); - } - module.exports = { - getGlobalOrigin, - setGlobalOrigin - }; -}); - -// ../node_modules/undici/lib/fetch/util.js -var require_util2 = __commonJS((exports, module) => { - var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants2(); - var { getGlobalOrigin } = require_global(); - var { performance: performance2 } = __require("perf_hooks"); - var { isBlobLike, toUSVString, ReadableStreamFrom } = require_util(); - var assert = __require("assert"); - var { isUint8Array } = __require("util/types"); - var supportedHashes = []; - var crypto; - try { - crypto = __require("crypto"); - const possibleRelevantHashes = ["sha256", "sha384", "sha512"]; - supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); - } catch { - } - function responseURL(response) { - const urlList = response.urlList; - const length = urlList.length; - return length === 0 ? null : urlList[length - 1].toString(); - } - function responseLocationURL(response, requestFragment) { - if (!redirectStatusSet.has(response.status)) { - return null; - } - let location = response.headersList.get("location"); - if (location !== null && isValidHeaderValue(location)) { - location = new URL(location, responseURL(response)); - } - if (location && !location.hash) { - location.hash = requestFragment; - } - return location; - } - function requestCurrentURL(request) { - return request.urlList[request.urlList.length - 1]; - } - function requestBadPort(request) { - const url = requestCurrentURL(request); - if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { - return "blocked"; - } - return "allowed"; - } - function isErrorLike(object) { - return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); - } - function isValidReasonPhrase(statusText) { - for (let i = 0;i < statusText.length; ++i) { - const c = statusText.charCodeAt(i); - if (!(c === 9 || c >= 32 && c <= 126 || c >= 128 && c <= 255)) { - return false; - } - } - return true; - } - function isTokenCharCode(c) { - switch (c) { - case 34: - case 40: - case 41: - case 44: - case 47: - case 58: - case 59: - case 60: - case 61: - case 62: - case 63: - case 64: - case 91: - case 92: - case 93: - case 123: - case 125: - return false; - default: - return c >= 33 && c <= 126; - } - } - function isValidHTTPToken(characters) { - if (characters.length === 0) { - return false; - } - for (let i = 0;i < characters.length; ++i) { - if (!isTokenCharCode(characters.charCodeAt(i))) { - return false; - } - } - return true; - } - function isValidHeaderName(potentialValue) { - return isValidHTTPToken(potentialValue); - } - function isValidHeaderValue(potentialValue) { - if (potentialValue.startsWith("\t") || potentialValue.startsWith(" ") || potentialValue.endsWith("\t") || potentialValue.endsWith(" ")) { - return false; - } - if (potentialValue.includes("\0") || potentialValue.includes("\r") || potentialValue.includes("\n")) { - return false; - } - return true; - } - function setRequestReferrerPolicyOnRedirect(request, actualResponse) { - const { headersList } = actualResponse; - const policyHeader = (headersList.get("referrer-policy") ?? "").split(","); - let policy = ""; - if (policyHeader.length > 0) { - for (let i = policyHeader.length;i !== 0; i--) { - const token = policyHeader[i - 1].trim(); - if (referrerPolicyTokens.has(token)) { - policy = token; - break; - } - } - } - if (policy !== "") { - request.referrerPolicy = policy; - } - } - function crossOriginResourcePolicyCheck() { - return "allowed"; - } - function corsCheck() { - return "success"; - } - function TAOCheck() { - return "success"; - } - function appendFetchMetadata(httpRequest) { - let header = null; - header = httpRequest.mode; - httpRequest.headersList.set("sec-fetch-mode", header); - } - function appendRequestOriginHeader(request) { - let serializedOrigin = request.origin; - if (request.responseTainting === "cors" || request.mode === "websocket") { - if (serializedOrigin) { - request.headersList.append("origin", serializedOrigin); - } - } else if (request.method !== "GET" && request.method !== "HEAD") { - switch (request.referrerPolicy) { - case "no-referrer": - serializedOrigin = null; - break; - case "no-referrer-when-downgrade": - case "strict-origin": - case "strict-origin-when-cross-origin": - if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - case "same-origin": - if (!sameOrigin(request, requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - default: - } - if (serializedOrigin) { - request.headersList.append("origin", serializedOrigin); - } - } - } - function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { - return performance2.now(); - } - function createOpaqueTimingInfo(timingInfo) { - return { - startTime: timingInfo.startTime ?? 0, - redirectStartTime: 0, - redirectEndTime: 0, - postRedirectStartTime: timingInfo.startTime ?? 0, - finalServiceWorkerStartTime: 0, - finalNetworkResponseStartTime: 0, - finalNetworkRequestStartTime: 0, - endTime: 0, - encodedBodySize: 0, - decodedBodySize: 0, - finalConnectionTimingInfo: null - }; - } - function makePolicyContainer() { - return { - referrerPolicy: "strict-origin-when-cross-origin" - }; - } - function clonePolicyContainer(policyContainer) { - return { - referrerPolicy: policyContainer.referrerPolicy - }; - } - function determineRequestsReferrer(request) { - const policy = request.referrerPolicy; - assert(policy); - let referrerSource = null; - if (request.referrer === "client") { - const globalOrigin = getGlobalOrigin(); - if (!globalOrigin || globalOrigin.origin === "null") { - return "no-referrer"; - } - referrerSource = new URL(globalOrigin); - } else if (request.referrer instanceof URL) { - referrerSource = request.referrer; - } - let referrerURL = stripURLForReferrer(referrerSource); - const referrerOrigin = stripURLForReferrer(referrerSource, true); - if (referrerURL.toString().length > 4096) { - referrerURL = referrerOrigin; - } - const areSameOrigin = sameOrigin(request, referrerURL); - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url); - switch (policy) { - case "origin": - return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); - case "unsafe-url": - return referrerURL; - case "same-origin": - return areSameOrigin ? referrerOrigin : "no-referrer"; - case "origin-when-cross-origin": - return areSameOrigin ? referrerURL : referrerOrigin; - case "strict-origin-when-cross-origin": { - const currentURL = requestCurrentURL(request); - if (sameOrigin(referrerURL, currentURL)) { - return referrerURL; - } - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return "no-referrer"; - } - return referrerOrigin; - } - case "strict-origin": - case "no-referrer-when-downgrade": - default: - return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; - } - } - function stripURLForReferrer(url, originOnly) { - assert(url instanceof URL); - if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { - return "no-referrer"; - } - url.username = ""; - url.password = ""; - url.hash = ""; - if (originOnly) { - url.pathname = ""; - url.search = ""; - } - return url; - } - function isURLPotentiallyTrustworthy(url) { - if (!(url instanceof URL)) { - return false; - } - if (url.href === "about:blank" || url.href === "about:srcdoc") { - return true; - } - if (url.protocol === "data:") - return true; - if (url.protocol === "file:") - return true; - return isOriginPotentiallyTrustworthy(url.origin); - function isOriginPotentiallyTrustworthy(origin) { - if (origin == null || origin === "null") - return false; - const originAsURL = new URL(origin); - if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { - return true; - } - if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { - return true; - } - return false; - } - } - function bytesMatch(bytes, metadataList) { - if (crypto === undefined) { - return true; - } - const parsedMetadata = parseMetadata(metadataList); - if (parsedMetadata === "no metadata") { - return true; - } - if (parsedMetadata.length === 0) { - return true; - } - const strongest = getStrongestMetadata(parsedMetadata); - const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); - for (const item of metadata) { - const algorithm = item.algo; - const expectedValue = item.hash; - let actualValue = crypto.createHash(algorithm).update(bytes).digest("base64"); - if (actualValue[actualValue.length - 1] === "=") { - if (actualValue[actualValue.length - 2] === "=") { - actualValue = actualValue.slice(0, -2); - } else { - actualValue = actualValue.slice(0, -1); - } - } - if (compareBase64Mixed(actualValue, expectedValue)) { - return true; - } - } - return false; - } - var parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; - function parseMetadata(metadata) { - const result = []; - let empty = true; - for (const token of metadata.split(" ")) { - empty = false; - const parsedToken = parseHashWithOptions.exec(token); - if (parsedToken === null || parsedToken.groups === undefined || parsedToken.groups.algo === undefined) { - continue; - } - const algorithm = parsedToken.groups.algo.toLowerCase(); - if (supportedHashes.includes(algorithm)) { - result.push(parsedToken.groups); - } - } - if (empty === true) { - return "no metadata"; - } - return result; - } - function getStrongestMetadata(metadataList) { - let algorithm = metadataList[0].algo; - if (algorithm[3] === "5") { - return algorithm; - } - for (let i = 1;i < metadataList.length; ++i) { - const metadata = metadataList[i]; - if (metadata.algo[3] === "5") { - algorithm = "sha512"; - break; - } else if (algorithm[3] === "3") { - continue; - } else if (metadata.algo[3] === "3") { - algorithm = "sha384"; - } - } - return algorithm; - } - function filterMetadataListByAlgorithm(metadataList, algorithm) { - if (metadataList.length === 1) { - return metadataList; - } - let pos = 0; - for (let i = 0;i < metadataList.length; ++i) { - if (metadataList[i].algo === algorithm) { - metadataList[pos++] = metadataList[i]; - } - } - metadataList.length = pos; - return metadataList; - } - function compareBase64Mixed(actualValue, expectedValue) { - if (actualValue.length !== expectedValue.length) { - return false; - } - for (let i = 0;i < actualValue.length; ++i) { - if (actualValue[i] !== expectedValue[i]) { - if (actualValue[i] === "+" && expectedValue[i] === "-" || actualValue[i] === "/" && expectedValue[i] === "_") { - continue; - } - return false; - } - } - return true; - } - function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) { - } - function sameOrigin(A, B) { - if (A.origin === B.origin && A.origin === "null") { - return true; - } - if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { - return true; - } - return false; - } - function createDeferredPromise() { - let res; - let rej; - const promise = new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }); - return { promise, resolve: res, reject: rej }; - } - function isAborted(fetchParams) { - return fetchParams.controller.state === "aborted"; - } - function isCancelled(fetchParams) { - return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; - } - var normalizeMethodRecord = { - delete: "DELETE", - DELETE: "DELETE", - get: "GET", - GET: "GET", - head: "HEAD", - HEAD: "HEAD", - options: "OPTIONS", - OPTIONS: "OPTIONS", - post: "POST", - POST: "POST", - put: "PUT", - PUT: "PUT" - }; - Object.setPrototypeOf(normalizeMethodRecord, null); - function normalizeMethod(method) { - return normalizeMethodRecord[method.toLowerCase()] ?? method; - } - function serializeJavascriptValueToJSONString(value) { - const result = JSON.stringify(value); - if (result === undefined) { - throw new TypeError("Value is not JSON serializable"); - } - assert(typeof result === "string"); - return result; - } - var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); - function makeIterator(iterator, name, kind) { - const object = { - index: 0, - kind, - target: iterator - }; - const i = { - next() { - if (Object.getPrototypeOf(this) !== i) { - throw new TypeError(`'next' called on an object that does not implement interface ${name} Iterator.`); - } - const { index, kind: kind2, target } = object; - const values = target(); - const len = values.length; - if (index >= len) { - return { value: undefined, done: true }; - } - const pair = values[index]; - object.index = index + 1; - return iteratorResult(pair, kind2); - }, - [Symbol.toStringTag]: `${name} Iterator` - }; - Object.setPrototypeOf(i, esIteratorPrototype); - return Object.setPrototypeOf({}, i); - } - function iteratorResult(pair, kind) { - let result; - switch (kind) { - case "key": { - result = pair[0]; - break; - } - case "value": { - result = pair[1]; - break; - } - case "key+value": { - result = pair; - break; - } - } - return { value: result, done: false }; - } - async function fullyReadBody(body, processBody, processBodyError) { - const successSteps = processBody; - const errorSteps = processBodyError; - let reader; - try { - reader = body.stream.getReader(); - } catch (e) { - errorSteps(e); - return; - } - try { - const result = await readAllBytes(reader); - successSteps(result); - } catch (e) { - errorSteps(e); - } - } - var ReadableStream = globalThis.ReadableStream; - function isReadableStreamLike(stream) { - if (!ReadableStream) { - ReadableStream = __require("stream/web").ReadableStream; - } - return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; - } - var MAXIMUM_ARGUMENT_LENGTH = 65535; - function isomorphicDecode(input) { - if (input.length < MAXIMUM_ARGUMENT_LENGTH) { - return String.fromCharCode(...input); - } - return input.reduce((previous, current) => previous + String.fromCharCode(current), ""); - } - function readableStreamClose(controller) { - try { - controller.close(); - } catch (err) { - if (!err.message.includes("Controller is already closed")) { - throw err; - } - } - } - function isomorphicEncode(input) { - for (let i = 0;i < input.length; i++) { - assert(input.charCodeAt(i) <= 255); - } - return input; - } - async function readAllBytes(reader) { - const bytes = []; - let byteLength = 0; - while (true) { - const { done, value: chunk } = await reader.read(); - if (done) { - return Buffer.concat(bytes, byteLength); - } - if (!isUint8Array(chunk)) { - throw new TypeError("Received non-Uint8Array chunk"); - } - bytes.push(chunk); - byteLength += chunk.length; - } - } - function urlIsLocal(url) { - assert("protocol" in url); - const protocol = url.protocol; - return protocol === "about:" || protocol === "blob:" || protocol === "data:"; - } - function urlHasHttpsScheme(url) { - if (typeof url === "string") { - return url.startsWith("https:"); - } - return url.protocol === "https:"; - } - function urlIsHttpHttpsScheme(url) { - assert("protocol" in url); - const protocol = url.protocol; - return protocol === "http:" || protocol === "https:"; - } - var hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)); - module.exports = { - isAborted, - isCancelled, - createDeferredPromise, - ReadableStreamFrom, - toUSVString, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - coarsenedSharedCurrentTime, - determineRequestsReferrer, - makePolicyContainer, - clonePolicyContainer, - appendFetchMetadata, - appendRequestOriginHeader, - TAOCheck, - corsCheck, - crossOriginResourcePolicyCheck, - createOpaqueTimingInfo, - setRequestReferrerPolicyOnRedirect, - isValidHTTPToken, - requestBadPort, - requestCurrentURL, - responseURL, - responseLocationURL, - isBlobLike, - isURLPotentiallyTrustworthy, - isValidReasonPhrase, - sameOrigin, - normalizeMethod, - serializeJavascriptValueToJSONString, - makeIterator, - isValidHeaderName, - isValidHeaderValue, - hasOwn, - isErrorLike, - fullyReadBody, - bytesMatch, - isReadableStreamLike, - readableStreamClose, - isomorphicEncode, - isomorphicDecode, - urlIsLocal, - urlHasHttpsScheme, - urlIsHttpHttpsScheme, - readAllBytes, - normalizeMethodRecord, - parseMetadata - }; -}); - -// ../node_modules/undici/lib/fetch/symbols.js -var require_symbols2 = __commonJS((exports, module) => { - module.exports = { - kUrl: Symbol("url"), - kHeaders: Symbol("headers"), - kSignal: Symbol("signal"), - kState: Symbol("state"), - kGuard: Symbol("guard"), - kRealm: Symbol("realm") - }; -}); - -// ../node_modules/undici/lib/fetch/webidl.js -var require_webidl = __commonJS((exports, module) => { - var { types } = __require("util"); - var { hasOwn, toUSVString } = require_util2(); - var webidl = {}; - webidl.converters = {}; - webidl.util = {}; - webidl.errors = {}; - webidl.errors.exception = function(message) { - return new TypeError(`${message.header}: ${message.message}`); - }; - webidl.errors.conversionFailed = function(context) { - const plural = context.types.length === 1 ? "" : " one of"; - const message = `${context.argument} could not be converted to` + `${plural}: ${context.types.join(", ")}.`; - return webidl.errors.exception({ - header: context.prefix, - message - }); - }; - webidl.errors.invalidArgument = function(context) { - return webidl.errors.exception({ - header: context.prefix, - message: `"${context.value}" is an invalid ${context.type}.` - }); - }; - webidl.brandCheck = function(V, I, opts = undefined) { - if (opts?.strict !== false && !(V instanceof I)) { - throw new TypeError("Illegal invocation"); - } else { - return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag]; - } - }; - webidl.argumentLengthCheck = function({ length }, min, ctx) { - if (length < min) { - throw webidl.errors.exception({ - message: `${min} argument${min !== 1 ? "s" : ""} required, ` + `but${length ? " only" : ""} ${length} found.`, - ...ctx - }); - } - }; - webidl.illegalConstructor = function() { - throw webidl.errors.exception({ - header: "TypeError", - message: "Illegal constructor" - }); - }; - webidl.util.Type = function(V) { - switch (typeof V) { - case "undefined": - return "Undefined"; - case "boolean": - return "Boolean"; - case "string": - return "String"; - case "symbol": - return "Symbol"; - case "number": - return "Number"; - case "bigint": - return "BigInt"; - case "function": - case "object": { - if (V === null) { - return "Null"; - } - return "Object"; - } - } - }; - webidl.util.ConvertToInt = function(V, bitLength, signedness, opts = {}) { - let upperBound; - let lowerBound; - if (bitLength === 64) { - upperBound = Math.pow(2, 53) - 1; - if (signedness === "unsigned") { - lowerBound = 0; - } else { - lowerBound = Math.pow(-2, 53) + 1; - } - } else if (signedness === "unsigned") { - lowerBound = 0; - upperBound = Math.pow(2, bitLength) - 1; - } else { - lowerBound = Math.pow(-2, bitLength) - 1; - upperBound = Math.pow(2, bitLength - 1) - 1; - } - let x = Number(V); - if (x === 0) { - x = 0; - } - if (opts.enforceRange === true) { - if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Could not convert ${V} to an integer.` - }); - } - x = webidl.util.IntegerPart(x); - if (x < lowerBound || x > upperBound) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` - }); - } - return x; - } - if (!Number.isNaN(x) && opts.clamp === true) { - x = Math.min(Math.max(x, lowerBound), upperBound); - if (Math.floor(x) % 2 === 0) { - x = Math.floor(x); - } else { - x = Math.ceil(x); - } - return x; - } - if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - return 0; - } - x = webidl.util.IntegerPart(x); - x = x % Math.pow(2, bitLength); - if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { - return x - Math.pow(2, bitLength); - } - return x; - }; - webidl.util.IntegerPart = function(n) { - const r = Math.floor(Math.abs(n)); - if (n < 0) { - return -1 * r; - } - return r; - }; - webidl.sequenceConverter = function(converter) { - return (V) => { - if (webidl.util.Type(V) !== "Object") { - throw webidl.errors.exception({ - header: "Sequence", - message: `Value of type ${webidl.util.Type(V)} is not an Object.` - }); - } - const method = V?.[Symbol.iterator]?.(); - const seq = []; - if (method === undefined || typeof method.next !== "function") { - throw webidl.errors.exception({ - header: "Sequence", - message: "Object is not an iterator." - }); - } - while (true) { - const { done, value } = method.next(); - if (done) { - break; - } - seq.push(converter(value)); - } - return seq; - }; - }; - webidl.recordConverter = function(keyConverter, valueConverter) { - return (O) => { - if (webidl.util.Type(O) !== "Object") { - throw webidl.errors.exception({ - header: "Record", - message: `Value of type ${webidl.util.Type(O)} is not an Object.` - }); - } - const result = {}; - if (!types.isProxy(O)) { - const keys2 = Object.keys(O); - for (const key of keys2) { - const typedKey = keyConverter(key); - const typedValue = valueConverter(O[key]); - result[typedKey] = typedValue; - } - return result; - } - const keys = Reflect.ownKeys(O); - for (const key of keys) { - const desc = Reflect.getOwnPropertyDescriptor(O, key); - if (desc?.enumerable) { - const typedKey = keyConverter(key); - const typedValue = valueConverter(O[key]); - result[typedKey] = typedValue; - } - } - return result; - }; - }; - webidl.interfaceConverter = function(i) { - return (V, opts = {}) => { - if (opts.strict !== false && !(V instanceof i)) { - throw webidl.errors.exception({ - header: i.name, - message: `Expected ${V} to be an instance of ${i.name}.` - }); - } - return V; - }; - }; - webidl.dictionaryConverter = function(converters) { - return (dictionary) => { - const type = webidl.util.Type(dictionary); - const dict = {}; - if (type === "Null" || type === "Undefined") { - return dict; - } else if (type !== "Object") { - throw webidl.errors.exception({ - header: "Dictionary", - message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` - }); - } - for (const options of converters) { - const { key, defaultValue, required, converter } = options; - if (required === true) { - if (!hasOwn(dictionary, key)) { - throw webidl.errors.exception({ - header: "Dictionary", - message: `Missing required key "${key}".` - }); - } - } - let value = dictionary[key]; - const hasDefault = hasOwn(options, "defaultValue"); - if (hasDefault && value !== null) { - value = value ?? defaultValue; - } - if (required || hasDefault || value !== undefined) { - value = converter(value); - if (options.allowedValues && !options.allowedValues.includes(value)) { - throw webidl.errors.exception({ - header: "Dictionary", - message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(", ")}.` - }); - } - dict[key] = value; - } - } - return dict; - }; - }; - webidl.nullableConverter = function(converter) { - return (V) => { - if (V === null) { - return V; - } - return converter(V); - }; - }; - webidl.converters.DOMString = function(V, opts = {}) { - if (V === null && opts.legacyNullToEmptyString) { - return ""; - } - if (typeof V === "symbol") { - throw new TypeError("Could not convert argument of type symbol to string."); - } - return String(V); - }; - webidl.converters.ByteString = function(V) { - const x = webidl.converters.DOMString(V); - for (let index = 0;index < x.length; index++) { - if (x.charCodeAt(index) > 255) { - throw new TypeError("Cannot convert argument to a ByteString because the character at " + `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`); - } - } - return x; - }; - webidl.converters.USVString = toUSVString; - webidl.converters.boolean = function(V) { - const x = Boolean(V); - return x; - }; - webidl.converters.any = function(V) { - return V; - }; - webidl.converters["long long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 64, "signed"); - return x; - }; - webidl.converters["unsigned long long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 64, "unsigned"); - return x; - }; - webidl.converters["unsigned long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 32, "unsigned"); - return x; - }; - webidl.converters["unsigned short"] = function(V, opts) { - const x = webidl.util.ConvertToInt(V, 16, "unsigned", opts); - return x; - }; - webidl.converters.ArrayBuffer = function(V, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { - throw webidl.errors.conversionFailed({ - prefix: `${V}`, - argument: `${V}`, - types: ["ArrayBuffer"] - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.TypedArray = function(V, T, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) { - throw webidl.errors.conversionFailed({ - prefix: `${T.name}`, - argument: `${V}`, - types: [T.name] - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.DataView = function(V, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { - throw webidl.errors.exception({ - header: "DataView", - message: "Object is not a DataView." - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.BufferSource = function(V, opts = {}) { - if (types.isAnyArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, opts); - } - if (types.isTypedArray(V)) { - return webidl.converters.TypedArray(V, V.constructor); - } - if (types.isDataView(V)) { - return webidl.converters.DataView(V, opts); - } - throw new TypeError(`Could not convert ${V} to a BufferSource.`); - }; - webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.ByteString); - webidl.converters["sequence>"] = webidl.sequenceConverter(webidl.converters["sequence"]); - webidl.converters["record"] = webidl.recordConverter(webidl.converters.ByteString, webidl.converters.ByteString); - module.exports = { - webidl - }; -}); - -// ../node_modules/undici/lib/fetch/dataURL.js -var require_dataURL = __commonJS((exports, module) => { - var assert = __require("assert"); - var { atob: atob2 } = __require("buffer"); - var { isomorphicDecode } = require_util2(); - var encoder = new TextEncoder; - var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; - var HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/; - var HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/; - function dataURLProcessor(dataURL) { - assert(dataURL.protocol === "data:"); - let input = URLSerializer(dataURL, true); - input = input.slice(5); - const position = { position: 0 }; - let mimeType = collectASequenceOfCodePointsFast(",", input, position); - const mimeTypeLength = mimeType.length; - mimeType = removeASCIIWhitespace(mimeType, true, true); - if (position.position >= input.length) { - return "failure"; - } - position.position++; - const encodedBody = input.slice(mimeTypeLength + 1); - let body = stringPercentDecode(encodedBody); - if (/;(\u0020){0,}base64$/i.test(mimeType)) { - const stringBody = isomorphicDecode(body); - body = forgivingBase64(stringBody); - if (body === "failure") { - return "failure"; - } - mimeType = mimeType.slice(0, -6); - mimeType = mimeType.replace(/(\u0020)+$/, ""); - mimeType = mimeType.slice(0, -1); - } - if (mimeType.startsWith(";")) { - mimeType = "text/plain" + mimeType; - } - let mimeTypeRecord = parseMIMEType(mimeType); - if (mimeTypeRecord === "failure") { - mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); - } - return { mimeType: mimeTypeRecord, body }; - } - function URLSerializer(url, excludeFragment = false) { - if (!excludeFragment) { - return url.href; - } - const href = url.href; - const hashLength = url.hash.length; - return hashLength === 0 ? href : href.substring(0, href.length - hashLength); - } - function collectASequenceOfCodePoints(condition, input, position) { - let result = ""; - while (position.position < input.length && condition(input[position.position])) { - result += input[position.position]; - position.position++; - } - return result; - } - function collectASequenceOfCodePointsFast(char, input, position) { - const idx = input.indexOf(char, position.position); - const start = position.position; - if (idx === -1) { - position.position = input.length; - return input.slice(start); - } - position.position = idx; - return input.slice(start, position.position); - } - function stringPercentDecode(input) { - const bytes = encoder.encode(input); - return percentDecode(bytes); - } - function percentDecode(input) { - const output = []; - for (let i = 0;i < input.length; i++) { - const byte = input[i]; - if (byte !== 37) { - output.push(byte); - } else if (byte === 37 && !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2]))) { - output.push(37); - } else { - const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]); - const bytePoint = Number.parseInt(nextTwoBytes, 16); - output.push(bytePoint); - i += 2; - } - } - return Uint8Array.from(output); - } - function parseMIMEType(input) { - input = removeHTTPWhitespace(input, true, true); - const position = { position: 0 }; - const type = collectASequenceOfCodePointsFast("/", input, position); - if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { - return "failure"; - } - if (position.position > input.length) { - return "failure"; - } - position.position++; - let subtype = collectASequenceOfCodePointsFast(";", input, position); - subtype = removeHTTPWhitespace(subtype, false, true); - if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { - return "failure"; - } - const typeLowercase = type.toLowerCase(); - const subtypeLowercase = subtype.toLowerCase(); - const mimeType = { - type: typeLowercase, - subtype: subtypeLowercase, - parameters: new Map, - essence: `${typeLowercase}/${subtypeLowercase}` - }; - while (position.position < input.length) { - position.position++; - collectASequenceOfCodePoints((char) => HTTP_WHITESPACE_REGEX.test(char), input, position); - let parameterName = collectASequenceOfCodePoints((char) => char !== ";" && char !== "=", input, position); - parameterName = parameterName.toLowerCase(); - if (position.position < input.length) { - if (input[position.position] === ";") { - continue; - } - position.position++; - } - if (position.position > input.length) { - break; - } - let parameterValue = null; - if (input[position.position] === '"') { - parameterValue = collectAnHTTPQuotedString(input, position, true); - collectASequenceOfCodePointsFast(";", input, position); - } else { - parameterValue = collectASequenceOfCodePointsFast(";", input, position); - parameterValue = removeHTTPWhitespace(parameterValue, false, true); - if (parameterValue.length === 0) { - continue; - } - } - if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { - mimeType.parameters.set(parameterName, parameterValue); - } - } - return mimeType; - } - function forgivingBase64(data) { - data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, ""); - if (data.length % 4 === 0) { - data = data.replace(/=?=$/, ""); - } - if (data.length % 4 === 1) { - return "failure"; - } - if (/[^+/0-9A-Za-z]/.test(data)) { - return "failure"; - } - const binary = atob2(data); - const bytes = new Uint8Array(binary.length); - for (let byte = 0;byte < binary.length; byte++) { - bytes[byte] = binary.charCodeAt(byte); - } - return bytes; - } - function collectAnHTTPQuotedString(input, position, extractValue) { - const positionStart = position.position; - let value = ""; - assert(input[position.position] === '"'); - position.position++; - while (true) { - value += collectASequenceOfCodePoints((char) => char !== '"' && char !== "\\", input, position); - if (position.position >= input.length) { - break; - } - const quoteOrBackslash = input[position.position]; - position.position++; - if (quoteOrBackslash === "\\") { - if (position.position >= input.length) { - value += "\\"; - break; - } - value += input[position.position]; - position.position++; - } else { - assert(quoteOrBackslash === '"'); - break; - } - } - if (extractValue) { - return value; - } - return input.slice(positionStart, position.position); - } - function serializeAMimeType(mimeType) { - assert(mimeType !== "failure"); - const { parameters, essence } = mimeType; - let serialization = essence; - for (let [name, value] of parameters.entries()) { - serialization += ";"; - serialization += name; - serialization += "="; - if (!HTTP_TOKEN_CODEPOINTS.test(value)) { - value = value.replace(/(\\|")/g, "\\$1"); - value = '"' + value; - value += '"'; - } - serialization += value; - } - return serialization; - } - function isHTTPWhiteSpace(char) { - return char === "\r" || char === "\n" || char === "\t" || char === " "; - } - function removeHTTPWhitespace(str, leading = true, trailing = true) { - let lead = 0; - let trail = str.length - 1; - if (leading) { - for (;lead < str.length && isHTTPWhiteSpace(str[lead]); lead++) - ; - } - if (trailing) { - for (;trail > 0 && isHTTPWhiteSpace(str[trail]); trail--) - ; - } - return str.slice(lead, trail + 1); - } - function isASCIIWhitespace(char) { - return char === "\r" || char === "\n" || char === "\t" || char === "\f" || char === " "; - } - function removeASCIIWhitespace(str, leading = true, trailing = true) { - let lead = 0; - let trail = str.length - 1; - if (leading) { - for (;lead < str.length && isASCIIWhitespace(str[lead]); lead++) - ; - } - if (trailing) { - for (;trail > 0 && isASCIIWhitespace(str[trail]); trail--) - ; - } - return str.slice(lead, trail + 1); - } - module.exports = { - dataURLProcessor, - URLSerializer, - collectASequenceOfCodePoints, - collectASequenceOfCodePointsFast, - stringPercentDecode, - parseMIMEType, - collectAnHTTPQuotedString, - serializeAMimeType - }; -}); - -// ../node_modules/undici/lib/fetch/file.js -var require_file = __commonJS((exports, module) => { - var { Blob: Blob2, File: NativeFile } = __require("buffer"); - var { types } = __require("util"); - var { kState } = require_symbols2(); - var { isBlobLike } = require_util2(); - var { webidl } = require_webidl(); - var { parseMIMEType, serializeAMimeType } = require_dataURL(); - var { kEnumerableProperty } = require_util(); - var encoder = new TextEncoder; - - class File extends Blob2 { - constructor(fileBits, fileName, options = {}) { - webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" }); - fileBits = webidl.converters["sequence"](fileBits); - fileName = webidl.converters.USVString(fileName); - options = webidl.converters.FilePropertyBag(options); - const n = fileName; - let t = options.type; - let d; - substep: { - if (t) { - t = parseMIMEType(t); - if (t === "failure") { - t = ""; - break substep; - } - t = serializeAMimeType(t).toLowerCase(); - } - d = options.lastModified; - } - super(processBlobParts(fileBits, options), { type: t }); - this[kState] = { - name: n, - lastModified: d, - type: t - }; - } - get name() { - webidl.brandCheck(this, File); - return this[kState].name; - } - get lastModified() { - webidl.brandCheck(this, File); - return this[kState].lastModified; - } - get type() { - webidl.brandCheck(this, File); - return this[kState].type; - } - } - - class FileLike { - constructor(blobLike, fileName, options = {}) { - const n = fileName; - const t = options.type; - const d = options.lastModified ?? Date.now(); - this[kState] = { - blobLike, - name: n, - type: t, - lastModified: d - }; - } - stream(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.stream(...args); - } - arrayBuffer(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.arrayBuffer(...args); - } - slice(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.slice(...args); - } - text(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.text(...args); - } - get size() { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.size; - } - get type() { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.type; - } - get name() { - webidl.brandCheck(this, FileLike); - return this[kState].name; - } - get lastModified() { - webidl.brandCheck(this, FileLike); - return this[kState].lastModified; - } - get [Symbol.toStringTag]() { - return "File"; - } - } - Object.defineProperties(File.prototype, { - [Symbol.toStringTag]: { - value: "File", - configurable: true - }, - name: kEnumerableProperty, - lastModified: kEnumerableProperty - }); - webidl.converters.Blob = webidl.interfaceConverter(Blob2); - webidl.converters.BlobPart = function(V, opts) { - if (webidl.util.Type(V) === "Object") { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); - } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { - return webidl.converters.BufferSource(V, opts); - } - } - return webidl.converters.USVString(V, opts); - }; - webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.BlobPart); - webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ - { - key: "lastModified", - converter: webidl.converters["long long"], - get defaultValue() { - return Date.now(); - } - }, - { - key: "type", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "endings", - converter: (value) => { - value = webidl.converters.DOMString(value); - value = value.toLowerCase(); - if (value !== "native") { - value = "transparent"; - } - return value; - }, - defaultValue: "transparent" - } - ]); - function processBlobParts(parts, options) { - const bytes = []; - for (const element of parts) { - if (typeof element === "string") { - let s = element; - if (options.endings === "native") { - s = convertLineEndingsNative(s); - } - bytes.push(encoder.encode(s)); - } else if (types.isAnyArrayBuffer(element) || types.isTypedArray(element)) { - if (!element.buffer) { - bytes.push(new Uint8Array(element)); - } else { - bytes.push(new Uint8Array(element.buffer, element.byteOffset, element.byteLength)); - } - } else if (isBlobLike(element)) { - bytes.push(element); - } - } - return bytes; - } - function convertLineEndingsNative(s) { - let nativeLineEnding = "\n"; - if (process.platform === "win32") { - nativeLineEnding = "\r\n"; - } - return s.replace(/\r?\n/g, nativeLineEnding); - } - function isFileLike(object) { - return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; - } - module.exports = { File, FileLike, isFileLike }; -}); - -// ../node_modules/undici/lib/fetch/formdata.js -var require_formdata = __commonJS((exports, module) => { - var { isBlobLike, toUSVString, makeIterator } = require_util2(); - var { kState } = require_symbols2(); - var { File: UndiciFile, FileLike, isFileLike } = require_file(); - var { webidl } = require_webidl(); - var { Blob: Blob2, File: NativeFile } = __require("buffer"); - var File = NativeFile ?? UndiciFile; - - class FormData { - constructor(form) { - if (form !== undefined) { - throw webidl.errors.conversionFailed({ - prefix: "FormData constructor", - argument: "Argument 1", - types: ["undefined"] - }); - } - this[kState] = []; - } - append(name, value, filename = undefined) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.append" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError("Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'"); - } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? webidl.converters.USVString(filename) : undefined; - const entry = makeEntry(name, value, filename); - this[kState].push(entry); - } - delete(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" }); - name = webidl.converters.USVString(name); - this[kState] = this[kState].filter((entry) => entry.name !== name); - } - get(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" }); - name = webidl.converters.USVString(name); - const idx = this[kState].findIndex((entry) => entry.name === name); - if (idx === -1) { - return null; - } - return this[kState][idx].value; - } - getAll(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" }); - name = webidl.converters.USVString(name); - return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); - } - has(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" }); - name = webidl.converters.USVString(name); - return this[kState].findIndex((entry) => entry.name === name) !== -1; - } - set(name, value, filename = undefined) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.set" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError("Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'"); - } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? toUSVString(filename) : undefined; - const entry = makeEntry(name, value, filename); - const idx = this[kState].findIndex((entry2) => entry2.name === name); - if (idx !== -1) { - this[kState] = [ - ...this[kState].slice(0, idx), - entry, - ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) - ]; - } else { - this[kState].push(entry); - } - } - entries() { - webidl.brandCheck(this, FormData); - return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "key+value"); - } - keys() { - webidl.brandCheck(this, FormData); - return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "key"); - } - values() { - webidl.brandCheck(this, FormData); - return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "value"); - } - forEach(callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.forEach" }); - if (typeof callbackFn !== "function") { - throw new TypeError("Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'."); - } - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); - } - } - } - FormData.prototype[Symbol.iterator] = FormData.prototype.entries; - Object.defineProperties(FormData.prototype, { - [Symbol.toStringTag]: { - value: "FormData", - configurable: true - } - }); - function makeEntry(name, value, filename) { - name = Buffer.from(name).toString("utf8"); - if (typeof value === "string") { - value = Buffer.from(value).toString("utf8"); - } else { - if (!isFileLike(value)) { - value = value instanceof Blob2 ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); - } - if (filename !== undefined) { - const options = { - type: value.type, - lastModified: value.lastModified - }; - value = NativeFile && value instanceof NativeFile || value instanceof UndiciFile ? new File([value], filename, options) : new FileLike(value, filename, options); - } - } - return { name, value }; - } - module.exports = { FormData }; -}); - -// ../node_modules/undici/lib/fetch/body.js -var require_body = __commonJS((exports, module) => { - var Busboy = require_main(); - var util = require_util(); - var { - ReadableStreamFrom, - isBlobLike, - isReadableStreamLike, - readableStreamClose, - createDeferredPromise, - fullyReadBody - } = require_util2(); - var { FormData } = require_formdata(); - var { kState } = require_symbols2(); - var { webidl } = require_webidl(); - var { DOMException: DOMException2, structuredClone } = require_constants2(); - var { Blob: Blob2, File: NativeFile } = __require("buffer"); - var { kBodyUsed } = require_symbols(); - var assert = __require("assert"); - var { isErrored } = require_util(); - var { isUint8Array, isArrayBuffer } = __require("util/types"); - var { File: UndiciFile } = require_file(); - var { parseMIMEType, serializeAMimeType } = require_dataURL(); - var ReadableStream = globalThis.ReadableStream; - var File = NativeFile ?? UndiciFile; - var textEncoder = new TextEncoder; - var textDecoder = new TextDecoder; - function extractBody(object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = __require("stream/web").ReadableStream; - } - let stream = null; - if (object instanceof ReadableStream) { - stream = object; - } else if (isBlobLike(object)) { - stream = object.stream(); - } else { - stream = new ReadableStream({ - async pull(controller) { - controller.enqueue(typeof source === "string" ? textEncoder.encode(source) : source); - queueMicrotask(() => readableStreamClose(controller)); - }, - start() { - }, - type: undefined - }); - } - assert(isReadableStreamLike(stream)); - let action = null; - let source = null; - let length = null; - let type = null; - if (typeof object === "string") { - source = object; - type = "text/plain;charset=UTF-8"; - } else if (object instanceof URLSearchParams) { - source = object.toString(); - type = "application/x-www-form-urlencoded;charset=UTF-8"; - } else if (isArrayBuffer(object)) { - source = new Uint8Array(object.slice()); - } else if (ArrayBuffer.isView(object)) { - source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); - } else if (util.isFormDataLike(object)) { - const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 100000000000)}`.padStart(11, "0")}`; - const prefix = `--${boundary}\r\nContent-Disposition: form-data`; - /*! formdata-polyfill. MIT License. Jimmy Wärting */ - const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); - const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); - const blobParts = []; - const rn = new Uint8Array([13, 10]); - length = 0; - let hasUnknownSizeValue = false; - for (const [name, value] of object) { - if (typeof value === "string") { - const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"` + `\r\n\r\n${normalizeLinefeeds(value)}\r\n`); - blobParts.push(chunk2); - length += chunk2.byteLength; - } else { - const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + "\r\n" + `Content-Type: ${value.type || "application/octet-stream"}\r\n\r\n`); - blobParts.push(chunk2, value, rn); - if (typeof value.size === "number") { - length += chunk2.byteLength + value.size + rn.byteLength; - } else { - hasUnknownSizeValue = true; - } - } - } - const chunk = textEncoder.encode(`--${boundary}--`); - blobParts.push(chunk); - length += chunk.byteLength; - if (hasUnknownSizeValue) { - length = null; - } - source = object; - action = async function* () { - for (const part of blobParts) { - if (part.stream) { - yield* part.stream(); - } else { - yield part; - } - } - }; - type = "multipart/form-data; boundary=" + boundary; - } else if (isBlobLike(object)) { - source = object; - length = object.size; - if (object.type) { - type = object.type; - } - } else if (typeof object[Symbol.asyncIterator] === "function") { - if (keepalive) { - throw new TypeError("keepalive"); - } - if (util.isDisturbed(object) || object.locked) { - throw new TypeError("Response body object should not be disturbed or locked"); - } - stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); - } - if (typeof source === "string" || util.isBuffer(source)) { - length = Buffer.byteLength(source); - } - if (action != null) { - let iterator; - stream = new ReadableStream({ - async start() { - iterator = action(object)[Symbol.asyncIterator](); - }, - async pull(controller) { - const { value, done } = await iterator.next(); - if (done) { - queueMicrotask(() => { - controller.close(); - }); - } else { - if (!isErrored(stream)) { - controller.enqueue(new Uint8Array(value)); - } - } - return controller.desiredSize > 0; - }, - async cancel(reason) { - await iterator.return(); - }, - type: undefined - }); - } - const body = { stream, source, length }; - return [body, type]; - } - function safelyExtractBody(object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = __require("stream/web").ReadableStream; - } - if (object instanceof ReadableStream) { - assert(!util.isDisturbed(object), "The body has already been consumed."); - assert(!object.locked, "The stream is locked."); - } - return extractBody(object, keepalive); - } - function cloneBody(body) { - const [out1, out2] = body.stream.tee(); - const out2Clone = structuredClone(out2, { transfer: [out2] }); - const [, finalClone] = out2Clone.tee(); - body.stream = out1; - return { - stream: finalClone, - length: body.length, - source: body.source - }; - } - async function* consumeBody(body) { - if (body) { - if (isUint8Array(body)) { - yield body; - } else { - const stream = body.stream; - if (util.isDisturbed(stream)) { - throw new TypeError("The body has already been consumed."); - } - if (stream.locked) { - throw new TypeError("The stream is locked."); - } - stream[kBodyUsed] = true; - yield* stream; - } - } - } - function throwIfAborted(state) { - if (state.aborted) { - throw new DOMException2("The operation was aborted.", "AbortError"); - } - } - function bodyMixinMethods(instance) { - const methods = { - blob() { - return specConsumeBody(this, (bytes) => { - let mimeType = bodyMimeType(this); - if (mimeType === "failure") { - mimeType = ""; - } else if (mimeType) { - mimeType = serializeAMimeType(mimeType); - } - return new Blob2([bytes], { type: mimeType }); - }, instance); - }, - arrayBuffer() { - return specConsumeBody(this, (bytes) => { - return new Uint8Array(bytes).buffer; - }, instance); - }, - text() { - return specConsumeBody(this, utf8DecodeBytes, instance); - }, - json() { - return specConsumeBody(this, parseJSONFromBytes, instance); - }, - async formData() { - webidl.brandCheck(this, instance); - throwIfAborted(this[kState]); - const contentType = this.headers.get("Content-Type"); - if (/multipart\/form-data/.test(contentType)) { - const headers = {}; - for (const [key, value] of this.headers) - headers[key.toLowerCase()] = value; - const responseFormData = new FormData; - let busboy; - try { - busboy = new Busboy({ - headers, - preservePath: true - }); - } catch (err) { - throw new DOMException2(`${err}`, "AbortError"); - } - busboy.on("field", (name, value) => { - responseFormData.append(name, value); - }); - busboy.on("file", (name, value, filename, encoding, mimeType) => { - const chunks = []; - if (encoding === "base64" || encoding.toLowerCase() === "base64") { - let base64chunk = ""; - value.on("data", (chunk) => { - base64chunk += chunk.toString().replace(/[\r\n]/gm, ""); - const end = base64chunk.length - base64chunk.length % 4; - chunks.push(Buffer.from(base64chunk.slice(0, end), "base64")); - base64chunk = base64chunk.slice(end); - }); - value.on("end", () => { - chunks.push(Buffer.from(base64chunk, "base64")); - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } else { - value.on("data", (chunk) => { - chunks.push(chunk); - }); - value.on("end", () => { - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } - }); - const busboyResolve = new Promise((resolve, reject) => { - busboy.on("finish", resolve); - busboy.on("error", (err) => reject(new TypeError(err))); - }); - if (this.body !== null) - for await (const chunk of consumeBody(this[kState].body)) - busboy.write(chunk); - busboy.end(); - await busboyResolve; - return responseFormData; - } else if (/application\/x-www-form-urlencoded/.test(contentType)) { - let entries; - try { - let text = ""; - const streamingDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); - for await (const chunk of consumeBody(this[kState].body)) { - if (!isUint8Array(chunk)) { - throw new TypeError("Expected Uint8Array chunk"); - } - text += streamingDecoder.decode(chunk, { stream: true }); - } - text += streamingDecoder.decode(); - entries = new URLSearchParams(text); - } catch (err) { - throw Object.assign(new TypeError, { cause: err }); - } - const formData = new FormData; - for (const [name, value] of entries) { - formData.append(name, value); - } - return formData; - } else { - await Promise.resolve(); - throwIfAborted(this[kState]); - throw webidl.errors.exception({ - header: `${instance.name}.formData`, - message: "Could not parse content as FormData." - }); - } - } - }; - return methods; - } - function mixinBody(prototype) { - Object.assign(prototype.prototype, bodyMixinMethods(prototype)); - } - async function specConsumeBody(object, convertBytesToJSValue, instance) { - webidl.brandCheck(object, instance); - throwIfAborted(object[kState]); - if (bodyUnusable(object[kState].body)) { - throw new TypeError("Body is unusable"); - } - const promise = createDeferredPromise(); - const errorSteps = (error) => promise.reject(error); - const successSteps = (data) => { - try { - promise.resolve(convertBytesToJSValue(data)); - } catch (e) { - errorSteps(e); - } - }; - if (object[kState].body == null) { - successSteps(new Uint8Array); - return promise.promise; - } - await fullyReadBody(object[kState].body, successSteps, errorSteps); - return promise.promise; - } - function bodyUnusable(body) { - return body != null && (body.stream.locked || util.isDisturbed(body.stream)); - } - function utf8DecodeBytes(buffer) { - if (buffer.length === 0) { - return ""; - } - if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { - buffer = buffer.subarray(3); - } - const output = textDecoder.decode(buffer); - return output; - } - function parseJSONFromBytes(bytes) { - return JSON.parse(utf8DecodeBytes(bytes)); - } - function bodyMimeType(object) { - const { headersList } = object[kState]; - const contentType = headersList.get("content-type"); - if (contentType === null) { - return "failure"; - } - return parseMIMEType(contentType); - } - module.exports = { - extractBody, - safelyExtractBody, - cloneBody, - mixinBody - }; -}); - -// ../node_modules/undici/lib/core/request.js -var require_request = __commonJS((exports, module) => { - var { - InvalidArgumentError, - NotSupportedError - } = require_errors(); - var assert = __require("assert"); - var { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require_symbols(); - var util = require_util(); - var tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; - var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - var invalidPathRegex = /[^\u0021-\u00ff]/; - var kHandler = Symbol("handler"); - var channels = {}; - var extractBody; - try { - const diagnosticsChannel = __require("diagnostics_channel"); - channels.create = diagnosticsChannel.channel("undici:request:create"); - channels.bodySent = diagnosticsChannel.channel("undici:request:bodySent"); - channels.headers = diagnosticsChannel.channel("undici:request:headers"); - channels.trailers = diagnosticsChannel.channel("undici:request:trailers"); - channels.error = diagnosticsChannel.channel("undici:request:error"); - } catch { - channels.create = { hasSubscribers: false }; - channels.bodySent = { hasSubscribers: false }; - channels.headers = { hasSubscribers: false }; - channels.trailers = { hasSubscribers: false }; - channels.error = { hasSubscribers: false }; - } - - class Request { - constructor(origin, { - path, - method, - body, - headers, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - throwOnError, - expectContinue - }, handler) { - if (typeof path !== "string") { - throw new InvalidArgumentError("path must be a string"); - } else if (path[0] !== "/" && !(path.startsWith("http://") || path.startsWith("https://")) && method !== "CONNECT") { - throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); - } else if (invalidPathRegex.exec(path) !== null) { - throw new InvalidArgumentError("invalid request path"); - } - if (typeof method !== "string") { - throw new InvalidArgumentError("method must be a string"); - } else if (tokenRegExp.exec(method) === null) { - throw new InvalidArgumentError("invalid request method"); - } - if (upgrade && typeof upgrade !== "string") { - throw new InvalidArgumentError("upgrade must be a string"); - } - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("invalid headersTimeout"); - } - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("invalid bodyTimeout"); - } - if (reset != null && typeof reset !== "boolean") { - throw new InvalidArgumentError("invalid reset"); - } - if (expectContinue != null && typeof expectContinue !== "boolean") { - throw new InvalidArgumentError("invalid expectContinue"); - } - this.headersTimeout = headersTimeout; - this.bodyTimeout = bodyTimeout; - this.throwOnError = throwOnError === true; - this.method = method; - this.abort = null; - if (body == null) { - this.body = null; - } else if (util.isStream(body)) { - this.body = body; - const rState = this.body._readableState; - if (!rState || !rState.autoDestroy) { - this.endHandler = function autoDestroy() { - util.destroy(this); - }; - this.body.on("end", this.endHandler); - } - this.errorHandler = (err) => { - if (this.abort) { - this.abort(err); - } else { - this.error = err; - } - }; - this.body.on("error", this.errorHandler); - } else if (util.isBuffer(body)) { - this.body = body.byteLength ? body : null; - } else if (ArrayBuffer.isView(body)) { - this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; - } else if (body instanceof ArrayBuffer) { - this.body = body.byteLength ? Buffer.from(body) : null; - } else if (typeof body === "string") { - this.body = body.length ? Buffer.from(body) : null; - } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { - this.body = body; - } else { - throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); - } - this.completed = false; - this.aborted = false; - this.upgrade = upgrade || null; - this.path = query ? util.buildURL(path, query) : path; - this.origin = origin; - this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; - this.blocking = blocking == null ? false : blocking; - this.reset = reset == null ? null : reset; - this.host = null; - this.contentLength = null; - this.contentType = null; - this.headers = ""; - this.expectContinue = expectContinue != null ? expectContinue : false; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); - } - for (let i = 0;i < headers.length; i += 2) { - processHeader(this, headers[i], headers[i + 1]); - } - } else if (headers && typeof headers === "object") { - const keys = Object.keys(headers); - for (let i = 0;i < keys.length; i++) { - const key = keys[i]; - processHeader(this, key, headers[key]); - } - } else if (headers != null) { - throw new InvalidArgumentError("headers must be an object or an array"); - } - if (util.isFormDataLike(this.body)) { - if (util.nodeMajor < 16 || util.nodeMajor === 16 && util.nodeMinor < 8) { - throw new InvalidArgumentError("Form-Data bodies are only supported in node v16.8 and newer."); - } - if (!extractBody) { - extractBody = require_body().extractBody; - } - const [bodyStream, contentType] = extractBody(body); - if (this.contentType == null) { - this.contentType = contentType; - this.headers += `content-type: ${contentType}\r\n`; - } - this.body = bodyStream.stream; - this.contentLength = bodyStream.length; - } else if (util.isBlobLike(body) && this.contentType == null && body.type) { - this.contentType = body.type; - this.headers += `content-type: ${body.type}\r\n`; - } - util.validateHandler(handler, method, upgrade); - this.servername = util.getServerName(this.host); - this[kHandler] = handler; - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }); - } - } - onBodySent(chunk) { - if (this[kHandler].onBodySent) { - try { - return this[kHandler].onBodySent(chunk); - } catch (err) { - this.abort(err); - } - } - } - onRequestSent() { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }); - } - if (this[kHandler].onRequestSent) { - try { - return this[kHandler].onRequestSent(); - } catch (err) { - this.abort(err); - } - } - } - onConnect(abort) { - assert(!this.aborted); - assert(!this.completed); - if (this.error) { - abort(this.error); - } else { - this.abort = abort; - return this[kHandler].onConnect(abort); - } - } - onHeaders(statusCode, headers, resume, statusText) { - assert(!this.aborted); - assert(!this.completed); - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); - } - try { - return this[kHandler].onHeaders(statusCode, headers, resume, statusText); - } catch (err) { - this.abort(err); - } - } - onData(chunk) { - assert(!this.aborted); - assert(!this.completed); - try { - return this[kHandler].onData(chunk); - } catch (err) { - this.abort(err); - return false; - } - } - onUpgrade(statusCode, headers, socket) { - assert(!this.aborted); - assert(!this.completed); - return this[kHandler].onUpgrade(statusCode, headers, socket); - } - onComplete(trailers) { - this.onFinally(); - assert(!this.aborted); - this.completed = true; - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }); - } - try { - return this[kHandler].onComplete(trailers); - } catch (err) { - this.onError(err); - } - } - onError(error) { - this.onFinally(); - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }); - } - if (this.aborted) { - return; - } - this.aborted = true; - return this[kHandler].onError(error); - } - onFinally() { - if (this.errorHandler) { - this.body.off("error", this.errorHandler); - this.errorHandler = null; - } - if (this.endHandler) { - this.body.off("end", this.endHandler); - this.endHandler = null; - } - } - addHeader(key, value) { - processHeader(this, key, value); - return this; - } - static [kHTTP1BuildRequest](origin, opts, handler) { - return new Request(origin, opts, handler); - } - static [kHTTP2BuildRequest](origin, opts, handler) { - const headers = opts.headers; - opts = { ...opts, headers: null }; - const request = new Request(origin, opts, handler); - request.headers = {}; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); - } - for (let i = 0;i < headers.length; i += 2) { - processHeader(request, headers[i], headers[i + 1], true); - } - } else if (headers && typeof headers === "object") { - const keys = Object.keys(headers); - for (let i = 0;i < keys.length; i++) { - const key = keys[i]; - processHeader(request, key, headers[key], true); - } - } else if (headers != null) { - throw new InvalidArgumentError("headers must be an object or an array"); - } - return request; - } - static [kHTTP2CopyHeaders](raw) { - const rawHeaders = raw.split("\r\n"); - const headers = {}; - for (const header of rawHeaders) { - const [key, value] = header.split(": "); - if (value == null || value.length === 0) - continue; - if (headers[key]) - headers[key] += `,${value}`; - else - headers[key] = value; - } - return headers; - } - } - function processHeaderValue(key, val, skipAppend) { - if (val && typeof val === "object") { - throw new InvalidArgumentError(`invalid ${key} header`); - } - val = val != null ? `${val}` : ""; - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); - } - return skipAppend ? val : `${key}: ${val}\r\n`; - } - function processHeader(request, key, val, skipAppend = false) { - if (val && (typeof val === "object" && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`); - } else if (val === undefined) { - return; - } - if (request.host === null && key.length === 4 && key.toLowerCase() === "host") { - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); - } - request.host = val; - } else if (request.contentLength === null && key.length === 14 && key.toLowerCase() === "content-length") { - request.contentLength = parseInt(val, 10); - if (!Number.isFinite(request.contentLength)) { - throw new InvalidArgumentError("invalid content-length header"); - } - } else if (request.contentType === null && key.length === 12 && key.toLowerCase() === "content-type") { - request.contentType = val; - if (skipAppend) - request.headers[key] = processHeaderValue(key, val, skipAppend); - else - request.headers += processHeaderValue(key, val); - } else if (key.length === 17 && key.toLowerCase() === "transfer-encoding") { - throw new InvalidArgumentError("invalid transfer-encoding header"); - } else if (key.length === 10 && key.toLowerCase() === "connection") { - const value = typeof val === "string" ? val.toLowerCase() : null; - if (value !== "close" && value !== "keep-alive") { - throw new InvalidArgumentError("invalid connection header"); - } else if (value === "close") { - request.reset = true; - } - } else if (key.length === 10 && key.toLowerCase() === "keep-alive") { - throw new InvalidArgumentError("invalid keep-alive header"); - } else if (key.length === 7 && key.toLowerCase() === "upgrade") { - throw new InvalidArgumentError("invalid upgrade header"); - } else if (key.length === 6 && key.toLowerCase() === "expect") { - throw new NotSupportedError("expect header not supported"); - } else if (tokenRegExp.exec(key) === null) { - throw new InvalidArgumentError("invalid header key"); - } else { - if (Array.isArray(val)) { - for (let i = 0;i < val.length; i++) { - if (skipAppend) { - if (request.headers[key]) - request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`; - else - request.headers[key] = processHeaderValue(key, val[i], skipAppend); - } else { - request.headers += processHeaderValue(key, val[i]); - } - } - } else { - if (skipAppend) - request.headers[key] = processHeaderValue(key, val, skipAppend); - else - request.headers += processHeaderValue(key, val); - } - } - } - module.exports = Request; -}); - -// ../node_modules/undici/lib/dispatcher.js -var require_dispatcher = __commonJS((exports, module) => { - var EventEmitter = __require("events"); - - class Dispatcher extends EventEmitter { - dispatch() { - throw new Error("not implemented"); - } - close() { - throw new Error("not implemented"); - } - destroy() { - throw new Error("not implemented"); - } - } - module.exports = Dispatcher; -}); - -// ../node_modules/undici/lib/dispatcher-base.js -var require_dispatcher_base = __commonJS((exports, module) => { - var Dispatcher = require_dispatcher(); - var { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError - } = require_errors(); - var { kDestroy, kClose, kDispatch, kInterceptors } = require_symbols(); - var kDestroyed = Symbol("destroyed"); - var kClosed = Symbol("closed"); - var kOnDestroyed = Symbol("onDestroyed"); - var kOnClosed = Symbol("onClosed"); - var kInterceptedDispatch = Symbol("Intercepted Dispatch"); - - class DispatcherBase extends Dispatcher { - constructor() { - super(); - this[kDestroyed] = false; - this[kOnDestroyed] = null; - this[kClosed] = false; - this[kOnClosed] = []; - } - get destroyed() { - return this[kDestroyed]; - } - get closed() { - return this[kClosed]; - } - get interceptors() { - return this[kInterceptors]; - } - set interceptors(newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1;i >= 0; i--) { - const interceptor = this[kInterceptors][i]; - if (typeof interceptor !== "function") { - throw new InvalidArgumentError("interceptor must be an function"); - } - } - } - this[kInterceptors] = newInterceptors; - } - close(callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError, null)); - return; - } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return; - } - this[kClosed] = true; - this[kOnClosed].push(callback); - const onClosed = () => { - const callbacks = this[kOnClosed]; - this[kOnClosed] = null; - for (let i = 0;i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; - this[kClose]().then(() => this.destroy()).then(() => { - queueMicrotask(onClosed); - }); - } - destroy(err, callback) { - if (typeof err === "function") { - callback = err; - err = null; - } - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.destroy(err, (err2, data) => { - return err2 ? reject(err2) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return; - } - if (!err) { - err = new ClientDestroyedError; - } - this[kDestroyed] = true; - this[kOnDestroyed] = this[kOnDestroyed] || []; - this[kOnDestroyed].push(callback); - const onDestroyed = () => { - const callbacks = this[kOnDestroyed]; - this[kOnDestroyed] = null; - for (let i = 0;i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed); - }); - } - [kInterceptedDispatch](opts, handler) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch]; - return this[kDispatch](opts, handler); - } - let dispatch = this[kDispatch].bind(this); - for (let i = this[kInterceptors].length - 1;i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch); - } - this[kInterceptedDispatch] = dispatch; - return dispatch(opts, handler); - } - dispatch(opts, handler) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - try { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object."); - } - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError; - } - if (this[kClosed]) { - throw new ClientClosedError; - } - return this[kInterceptedDispatch](opts, handler); - } catch (err) { - if (typeof handler.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); - } - handler.onError(err); - return false; - } - } - } - module.exports = DispatcherBase; -}); - -// ../node_modules/undici/lib/core/connect.js -var require_connect = __commonJS((exports, module) => { - var net = __require("net"); - var assert = __require("assert"); - var util = require_util(); - var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); - var tls; - var SessionCache; - if (global.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) { - SessionCache = class WeakSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = new Map; - this._sessionRegistry = new global.FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return; - } - const ref = this._sessionCache.get(key); - if (ref !== undefined && ref.deref() === undefined) { - this._sessionCache.delete(key); - } - }); - } - get(sessionKey) { - const ref = this._sessionCache.get(sessionKey); - return ref ? ref.deref() : null; - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; - } - this._sessionCache.set(sessionKey, new WeakRef(session)); - this._sessionRegistry.register(session, sessionKey); - } - }; - } else { - SessionCache = class SimpleSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = new Map; - } - get(sessionKey) { - return this._sessionCache.get(sessionKey); - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; - } - if (this._sessionCache.size >= this._maxCachedSessions) { - const { value: oldestKey } = this._sessionCache.keys().next(); - this._sessionCache.delete(oldestKey); - } - this._sessionCache.set(sessionKey, session); - } - }; - } - function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); - } - const options = { path: socketPath, ...opts }; - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); - timeout = timeout == null ? 1e4 : timeout; - allowH2 = allowH2 != null ? allowH2 : false; - return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket; - if (protocol === "https:") { - if (!tls) { - tls = __require("tls"); - } - servername = servername || options.servername || util.getServerName(host) || null; - const sessionKey = servername || hostname; - const session = sessionCache.get(sessionKey) || null; - assert(sessionKey); - socket = tls.connect({ - highWaterMark: 16384, - ...options, - servername, - session, - localAddress, - ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], - socket: httpSocket, - port: port || 443, - host: hostname - }); - socket.on("session", function(session2) { - sessionCache.set(sessionKey, session2); - }); - } else { - assert(!httpSocket, "httpSocket can only be sent on TLS update"); - socket = net.connect({ - highWaterMark: 64 * 1024, - ...options, - localAddress, - port: port || 80, - host: hostname - }); - } - if (options.keepAlive == null || options.keepAlive) { - const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60000 : options.keepAliveInitialDelay; - socket.setKeepAlive(true, keepAliveInitialDelay); - } - const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); - socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(null, this); - } - }).on("error", function(err) { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(err); - } - }); - return socket; - }; - } - function setupTimeout(onConnectTimeout2, timeout) { - if (!timeout) { - return () => { - }; - } - let s1 = null; - let s2 = null; - const timeoutId = setTimeout(() => { - s1 = setImmediate(() => { - if (process.platform === "win32") { - s2 = setImmediate(() => onConnectTimeout2()); - } else { - onConnectTimeout2(); - } - }); - }, timeout); - return () => { - clearTimeout(timeoutId); - clearImmediate(s1); - clearImmediate(s2); - }; - } - function onConnectTimeout(socket) { - util.destroy(socket, new ConnectTimeoutError); - } - module.exports = buildConnector; -}); - -// ../node_modules/undici/lib/llhttp/utils.js -var require_utils2 = __commonJS((exports) => { - Object.defineProperty(exports, "__esModule", { value: true }); - exports.enumToMap = undefined; - function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === "number") { - res[key] = value; - } - }); - return res; - } - exports.enumToMap = enumToMap; -}); - -// ../node_modules/undici/lib/llhttp/constants.js -var require_constants3 = __commonJS((exports) => { - Object.defineProperty(exports, "__esModule", { value: true }); - exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = undefined; - var utils_1 = require_utils2(); - var ERROR; - (function(ERROR2) { - ERROR2[ERROR2["OK"] = 0] = "OK"; - ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL"; - ERROR2[ERROR2["STRICT"] = 2] = "STRICT"; - ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED"; - ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR2[ERROR2["USER"] = 24] = "USER"; - })(ERROR = exports.ERROR || (exports.ERROR = {})); - var TYPE; - (function(TYPE2) { - TYPE2[TYPE2["BOTH"] = 0] = "BOTH"; - TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST"; - TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE"; - })(TYPE = exports.TYPE || (exports.TYPE = {})); - var FLAGS; - (function(FLAGS2) { - FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED"; - FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE"; - FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING"; - FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; - })(FLAGS = exports.FLAGS || (exports.FLAGS = {})); - var LENIENT_FLAGS; - (function(LENIENT_FLAGS2) { - LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; - })(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {})); - var METHODS; - (function(METHODS2) { - METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; - METHODS2[METHODS2["GET"] = 1] = "GET"; - METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; - METHODS2[METHODS2["POST"] = 3] = "POST"; - METHODS2[METHODS2["PUT"] = 4] = "PUT"; - METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; - METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; - METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; - METHODS2[METHODS2["COPY"] = 8] = "COPY"; - METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; - METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; - METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; - METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; - METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; - METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; - METHODS2[METHODS2["BIND"] = 16] = "BIND"; - METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; - METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; - METHODS2[METHODS2["ACL"] = 19] = "ACL"; - METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; - METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; - METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; - METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; - METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; - METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; - METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; - METHODS2[METHODS2["LINK"] = 31] = "LINK"; - METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; - METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; - METHODS2[METHODS2["PRI"] = 34] = "PRI"; - METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; - METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; - METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; - METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; - METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; - METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; - })(METHODS = exports.METHODS || (exports.METHODS = {})); - exports.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS["M-SEARCH"], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, - METHODS.SOURCE - ]; - exports.METHODS_ICE = [ - METHODS.SOURCE - ]; - exports.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, - METHODS.GET, - METHODS.POST - ]; - exports.METHOD_MAP = utils_1.enumToMap(METHODS); - exports.H_METHOD_MAP = {}; - Object.keys(exports.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key]; - } - }); - var FINISH; - (function(FINISH2) { - FINISH2[FINISH2["SAFE"] = 0] = "SAFE"; - FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE"; - })(FINISH = exports.FINISH || (exports.FINISH = {})); - exports.ALPHA = []; - for (let i = "A".charCodeAt(0);i <= "Z".charCodeAt(0); i++) { - exports.ALPHA.push(String.fromCharCode(i)); - exports.ALPHA.push(String.fromCharCode(i + 32)); - } - exports.NUM_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9 - }; - exports.HEX_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - A: 10, - B: 11, - C: 12, - D: 13, - E: 14, - F: 15, - a: 10, - b: 11, - c: 12, - d: 13, - e: 14, - f: 15 - }; - exports.NUM = [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ]; - exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); - exports.MARK = ["-", "_", ".", "!", "~", "*", "\'", "(", ")"]; - exports.USERINFO_CHARS = exports.ALPHANUM.concat(exports.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); - exports.STRICT_URL_CHAR = [ - "!", - '"', - "$", - "%", - "&", - "\'", - "(", - ")", - "*", - "+", - ",", - "-", - ".", - "/", - ":", - ";", - "<", - "=", - ">", - "@", - "[", - "\\", - "]", - "^", - "_", - "`", - "{", - "|", - "}", - "~" - ].concat(exports.ALPHANUM); - exports.URL_CHAR = exports.STRICT_URL_CHAR.concat(["\t", "\f"]); - for (let i = 128;i <= 255; i++) { - exports.URL_CHAR.push(i); - } - exports.HEX = exports.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); - exports.STRICT_TOKEN = [ - "!", - "#", - "$", - "%", - "&", - "\'", - "*", - "+", - "-", - ".", - "^", - "_", - "`", - "|", - "~" - ].concat(exports.ALPHANUM); - exports.TOKEN = exports.STRICT_TOKEN.concat([" "]); - exports.HEADER_CHARS = ["\t"]; - for (let i = 32;i <= 255; i++) { - if (i !== 127) { - exports.HEADER_CHARS.push(i); - } - } - exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44); - exports.MAJOR = exports.NUM_MAP; - exports.MINOR = exports.MAJOR; - var HEADER_STATE; - (function(HEADER_STATE2) { - HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; - })(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {})); - exports.SPECIAL_HEADERS = { - connection: HEADER_STATE.CONNECTION, - "content-length": HEADER_STATE.CONTENT_LENGTH, - "proxy-connection": HEADER_STATE.CONNECTION, - "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, - upgrade: HEADER_STATE.UPGRADE - }; -}); - -// ../node_modules/undici/lib/handler/RedirectHandler.js -var require_RedirectHandler = __commonJS((exports, module) => { - var util = require_util(); - var { kBodyUsed } = require_symbols(); - var assert = __require("assert"); - var { InvalidArgumentError } = require_errors(); - var EE = __require("events"); - var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; - var kBody = Symbol("body"); - - class BodyAsyncIterable { - constructor(body) { - this[kBody] = body; - this[kBodyUsed] = false; - } - async* [Symbol.asyncIterator]() { - assert(!this[kBodyUsed], "disturbed"); - this[kBodyUsed] = true; - yield* this[kBody]; - } - } - - class RedirectHandler { - constructor(dispatch, maxRedirections, opts, handler) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } - util.validateHandler(handler, opts.method, opts.upgrade); - this.dispatch = dispatch; - this.location = null; - this.abort = null; - this.opts = { ...opts, maxRedirections: 0 }; - this.maxRedirections = maxRedirections; - this.handler = handler; - this.history = []; - if (util.isStream(this.opts.body)) { - if (util.bodyLength(this.opts.body) === 0) { - this.opts.body.on("data", function() { - assert(false); - }); - } - if (typeof this.opts.body.readableDidRead !== "boolean") { - this.opts.body[kBodyUsed] = false; - EE.prototype.on.call(this.opts.body, "data", function() { - this[kBodyUsed] = true; - }); - } - } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { - this.opts.body = new BodyAsyncIterable(this.opts.body); - } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util.isIterable(this.opts.body)) { - this.opts.body = new BodyAsyncIterable(this.opts.body); - } - } - onConnect(abort) { - this.abort = abort; - this.handler.onConnect(abort, { history: this.history }); - } - onUpgrade(statusCode, headers, socket) { - this.handler.onUpgrade(statusCode, headers, socket); - } - onError(error) { - this.handler.onError(error); - } - onHeaders(statusCode, headers, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers); - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)); - } - if (!this.location) { - return this.handler.onHeaders(statusCode, headers, resume, statusText); - } - const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); - const path = search ? `${pathname}${search}` : pathname; - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); - this.opts.path = path; - this.opts.origin = origin; - this.opts.maxRedirections = 0; - this.opts.query = null; - if (statusCode === 303 && this.opts.method !== "HEAD") { - this.opts.method = "GET"; - this.opts.body = null; - } - } - onData(chunk) { - if (this.location) { - } else { - return this.handler.onData(chunk); - } - } - onComplete(trailers) { - if (this.location) { - this.location = null; - this.abort = null; - this.dispatch(this.opts, this); - } else { - this.handler.onComplete(trailers); - } - } - onBodySent(chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk); - } - } - } - function parseLocation(statusCode, headers) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null; - } - for (let i = 0;i < headers.length; i += 2) { - if (headers[i].toString().toLowerCase() === "location") { - return headers[i + 1]; - } - } - } - function shouldRemoveHeader(header, removeContent, unknownOrigin) { - if (header.length === 4) { - return util.headerNameToString(header) === "host"; - } - if (removeContent && util.headerNameToString(header).startsWith("content-")) { - return true; - } - if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { - const name = util.headerNameToString(header); - return name === "authorization" || name === "cookie" || name === "proxy-authorization"; - } - return false; - } - function cleanRequestHeaders(headers, removeContent, unknownOrigin) { - const ret = []; - if (Array.isArray(headers)) { - for (let i = 0;i < headers.length; i += 2) { - if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { - ret.push(headers[i], headers[i + 1]); - } - } - } else if (headers && typeof headers === "object") { - for (const key of Object.keys(headers)) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers[key]); - } - } - } else { - assert(headers == null, "headers must be an object or an array"); - } - return ret; - } - module.exports = RedirectHandler; -}); - -// ../node_modules/undici/lib/interceptor/redirectInterceptor.js -var require_redirectInterceptor = __commonJS((exports, module) => { - var RedirectHandler = require_RedirectHandler(); - function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return function Intercept(opts, handler) { - const { maxRedirections = defaultMaxRedirections } = opts; - if (!maxRedirections) { - return dispatch(opts, handler); - } - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); - opts = { ...opts, maxRedirections: 0 }; - return dispatch(opts, redirectHandler); - }; - }; - } - module.exports = createRedirectInterceptor; -}); - -// ../node_modules/undici/lib/llhttp/llhttp-wasm.js -var require_llhttp_wasm = __commonJS((exports, module) => { - module.exports = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAUNgIUIAAgATYCDEEAIRAMogELIABBADYCHCAAIBQ2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKEBCyAAQQA2AhwgACABNgIUIABBw4+AgAA2AhAgAEEHNgIMQQAhEAygAQtBACEQIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgwMnwELIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgxBACEQDJ4BCyAAQQA2AhwgACAUNgIUIABB/pGAgAA2AhAgAEEHNgIMQQAhEAydAQsgAEEANgIcIAAgATYCFCAAQY6bgIAANgIQIABBBjYCDEEAIRAMnAELIBBBFUYNVyAAQQA2AhwgACABNgIUIABBzI6AgAA2AhAgAEEgNgIMQQAhEAybAQsgAEEANgIAIBBBAWohAUEkIRALIAAgEDoAKSAAKAIEIRAgAEEANgIEIAAgECABEKuAgIAAIhANVCABIQEMPgsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQfGbgIAANgIQIABBBjYCDAyXAQsgAUEVRg1QIABBADYCHCAAIAU2AhQgAEHwjICAADYCECAAQRs2AgxBACEQDJYBCyAAKAIEIQUgAEEANgIEIAAgBSAQEKmAgIAAIgUNASAQQQFqIQULQa0BIRAMewsgAEHBATYCHCAAIAU2AgwgACAQQQFqNgIUQQAhEAyTAQsgACgCBCEGIABBADYCBCAAIAYgEBCpgICAACIGDQEgEEEBaiEGC0GuASEQDHgLIABBwgE2AhwgACAGNgIMIAAgEEEBajYCFEEAIRAMkAELIABBADYCHCAAIAc2AhQgAEGXi4CAADYCECAAQQ02AgxBACEQDI8BCyAAQQA2AhwgACAINgIUIABB45CAgAA2AhAgAEEJNgIMQQAhEAyOAQsgAEEANgIcIAAgCDYCFCAAQZSNgIAANgIQIABBITYCDEEAIRAMjQELQQEhFkEAIRdBACEUQQEhEAsgACAQOgArIAlBAWohCAJAAkAgAC0ALUEQcQ0AAkACQAJAIAAtACoOAwEAAgQLIBZFDQMMAgsgFA0BDAILIBdFDQELIAAoAgQhECAAQQA2AgQgACAQIAgQrYCAgAAiEEUNPSAAQckBNgIcIAAgCDYCFCAAIBA2AgxBACEQDIwBCyAAKAIEIQQgAEEANgIEIAAgBCAIEK2AgIAAIgRFDXYgAEHKATYCHCAAIAg2AhQgACAENgIMQQAhEAyLAQsgACgCBCEEIABBADYCBCAAIAQgCRCtgICAACIERQ10IABBywE2AhwgACAJNgIUIAAgBDYCDEEAIRAMigELIAAoAgQhBCAAQQA2AgQgACAEIAoQrYCAgAAiBEUNciAAQc0BNgIcIAAgCjYCFCAAIAQ2AgxBACEQDIkBCwJAIAstAABBUGoiEEH/AXFBCk8NACAAIBA6ACogC0EBaiEKQbYBIRAMcAsgACgCBCEEIABBADYCBCAAIAQgCxCtgICAACIERQ1wIABBzwE2AhwgACALNgIUIAAgBDYCDEEAIRAMiAELIABBADYCHCAAIAQ2AhQgAEGQs4CAADYCECAAQQg2AgwgAEEANgIAQQAhEAyHAQsgAUEVRg0/IABBADYCHCAAIAw2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDIYBCyAAQYEEOwEoIAAoAgQhECAAQgA3AwAgACAQIAxBAWoiDBCrgICAACIQRQ04IABB0wE2AhwgACAMNgIUIAAgEDYCDEEAIRAMhQELIABBADYCAAtBACEQIABBADYCHCAAIAQ2AhQgAEHYm4CAADYCECAAQQg2AgwMgwELIAAoAgQhECAAQgA3AwAgACAQIAtBAWoiCxCrgICAACIQDQFBxgEhEAxpCyAAQQI6ACgMVQsgAEHVATYCHCAAIAs2AhQgACAQNgIMQQAhEAyAAQsgEEEVRg03IABBADYCHCAAIAQ2AhQgAEGkjICAADYCECAAQRA2AgxBACEQDH8LIAAtADRBAUcNNCAAIAQgAhC8gICAACIQRQ00IBBBFUcNNSAAQdwBNgIcIAAgBDYCFCAAQdWWgIAANgIQIABBFTYCDEEAIRAMfgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQMfQtBACEQDGMLQQIhEAxiC0ENIRAMYQtBDyEQDGALQSUhEAxfC0ETIRAMXgtBFSEQDF0LQRYhEAxcC0EXIRAMWwtBGCEQDFoLQRkhEAxZC0EaIRAMWAtBGyEQDFcLQRwhEAxWC0EdIRAMVQtBHyEQDFQLQSEhEAxTC0EjIRAMUgtBxgAhEAxRC0EuIRAMUAtBLyEQDE8LQTshEAxOC0E9IRAMTQtByAAhEAxMC0HJACEQDEsLQcsAIRAMSgtBzAAhEAxJC0HOACEQDEgLQdEAIRAMRwtB1QAhEAxGC0HYACEQDEULQdkAIRAMRAtB2wAhEAxDC0HkACEQDEILQeUAIRAMQQtB8QAhEAxAC0H0ACEQDD8LQY0BIRAMPgtBlwEhEAw9C0GpASEQDDwLQawBIRAMOwtBwAEhEAw6C0G5ASEQDDkLQa8BIRAMOAtBsQEhEAw3C0GyASEQDDYLQbQBIRAMNQtBtQEhEAw0C0G6ASEQDDMLQb0BIRAMMgtBvwEhEAwxC0HBASEQDDALIABBADYCHCAAIAQ2AhQgAEHpi4CAADYCECAAQR82AgxBACEQDEgLIABB2wE2AhwgACAENgIUIABB+paAgAA2AhAgAEEVNgIMQQAhEAxHCyAAQfgANgIcIAAgDDYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMRgsgAEHRADYCHCAAIAU2AhQgAEGwl4CAADYCECAAQRU2AgxBACEQDEULIABB+QA2AhwgACABNgIUIAAgEDYCDEEAIRAMRAsgAEH4ADYCHCAAIAE2AhQgAEHKmICAADYCECAAQRU2AgxBACEQDEMLIABB5AA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAxCCyAAQdcANgIcIAAgATYCFCAAQcmXgIAANgIQIABBFTYCDEEAIRAMQQsgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMQAsgAEHCADYCHCAAIAE2AhQgAEHjmICAADYCECAAQRU2AgxBACEQDD8LIABBADYCBCAAIA8gDxCxgICAACIERQ0BIABBOjYCHCAAIAQ2AgwgACAPQQFqNgIUQQAhEAw+CyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBEUNACAAQTs2AhwgACAENgIMIAAgAUEBajYCFEEAIRAMPgsgAUEBaiEBDC0LIA9BAWohAQwtCyAAQQA2AhwgACAPNgIUIABB5JKAgAA2AhAgAEEENgIMQQAhEAw7CyAAQTY2AhwgACAENgIUIAAgAjYCDEEAIRAMOgsgAEEuNgIcIAAgDjYCFCAAIAQ2AgxBACEQDDkLIABB0AA2AhwgACABNgIUIABBkZiAgAA2AhAgAEEVNgIMQQAhEAw4CyANQQFqIQEMLAsgAEEVNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMNgsgAEEbNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNQsgAEEPNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNAsgAEELNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMMwsgAEEaNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMgsgAEELNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMQsgAEEKNgIcIAAgATYCFCAAQeSWgIAANgIQIABBFTYCDEEAIRAMMAsgAEEeNgIcIAAgATYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAMLwsgAEEANgIcIAAgEDYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMLgsgAEEENgIcIAAgATYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMLQsgAEEANgIAIAtBAWohCwtBuAEhEAwSCyAAQQA2AgAgEEEBaiEBQfUAIRAMEQsgASEBAkAgAC0AKUEFRw0AQeMAIRAMEQtB4gAhEAwQC0EAIRAgAEEANgIcIABB5JGAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAwoCyAAQQA2AgAgF0EBaiEBQcAAIRAMDgtBASEBCyAAIAE6ACwgAEEANgIAIBdBAWohAQtBKCEQDAsLIAEhAQtBOCEQDAkLAkAgASIPIAJGDQADQAJAIA8tAABBgL6AgABqLQAAIgFBAUYNACABQQJHDQMgD0EBaiEBDAQLIA9BAWoiDyACRw0AC0E+IRAMIgtBPiEQDCELIABBADoALCAPIQEMAQtBCyEQDAYLQTohEAwFCyABQQFqIQFBLSEQDAQLIAAgAToALCAAQQA2AgAgFkEBaiEBQQwhEAwDCyAAQQA2AgAgF0EBaiEBQQohEAwCCyAAQQA2AgALIABBADoALCANIQFBCSEQDAALC0EAIRAgAEEANgIcIAAgCzYCFCAAQc2QgIAANgIQIABBCTYCDAwXC0EAIRAgAEEANgIcIAAgCjYCFCAAQemKgIAANgIQIABBCTYCDAwWC0EAIRAgAEEANgIcIAAgCTYCFCAAQbeQgIAANgIQIABBCTYCDAwVC0EAIRAgAEEANgIcIAAgCDYCFCAAQZyRgIAANgIQIABBCTYCDAwUC0EAIRAgAEEANgIcIAAgATYCFCAAQc2QgIAANgIQIABBCTYCDAwTC0EAIRAgAEEANgIcIAAgATYCFCAAQemKgIAANgIQIABBCTYCDAwSC0EAIRAgAEEANgIcIAAgATYCFCAAQbeQgIAANgIQIABBCTYCDAwRC0EAIRAgAEEANgIcIAAgATYCFCAAQZyRgIAANgIQIABBCTYCDAwQC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwPC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwOC0EAIRAgAEEANgIcIAAgATYCFCAAQcCSgIAANgIQIABBCzYCDAwNC0EAIRAgAEEANgIcIAAgATYCFCAAQZWJgIAANgIQIABBCzYCDAwMC0EAIRAgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDAwLC0EAIRAgAEEANgIcIAAgATYCFCAAQfuPgIAANgIQIABBCjYCDAwKC0EAIRAgAEEANgIcIAAgATYCFCAAQfGZgIAANgIQIABBAjYCDAwJC0EAIRAgAEEANgIcIAAgATYCFCAAQcSUgIAANgIQIABBAjYCDAwIC0EAIRAgAEEANgIcIAAgATYCFCAAQfKVgIAANgIQIABBAjYCDAwHCyAAQQI2AhwgACABNgIUIABBnJqAgAA2AhAgAEEWNgIMQQAhEAwGC0EBIRAMBQtB1AAhECABIgQgAkYNBCADQQhqIAAgBCACQdjCgIAAQQoQxYCAgAAgAygCDCEEIAMoAggOAwEEAgALEMqAgIAAAAsgAEEANgIcIABBtZqAgAA2AhAgAEEXNgIMIAAgBEEBajYCFEEAIRAMAgsgAEEANgIcIAAgBDYCFCAAQcqagIAANgIQIABBCTYCDEEAIRAMAQsCQCABIgQgAkcNAEEiIRAMAQsgAEGJgICAADYCCCAAIAQ2AgRBISEQCyADQRBqJICAgIAAIBALrwEBAn8gASgCACEGAkACQCACIANGDQAgBCAGaiEEIAYgA2ogAmshByACIAZBf3MgBWoiBmohBQNAAkAgAi0AACAELQAARg0AQQIhBAwDCwJAIAYNAEEAIQQgBSECDAMLIAZBf2ohBiAEQQFqIQQgAkEBaiICIANHDQALIAchBiADIQILIABBATYCACABIAY2AgAgACACNgIEDwsgAUEANgIAIAAgBDYCACAAIAI2AgQLCgAgABDHgICAAAvyNgELfyOAgICAAEEQayIBJICAgIAAAkBBACgCoNCAgAANAEEAEMuAgIAAQYDUhIAAayICQdkASQ0AQQAhAwJAQQAoAuDTgIAAIgQNAEEAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEIakFwcUHYqtWqBXMiBDYC4NOAgABBAEEANgL004CAAEEAQQA2AsTTgIAAC0EAIAI2AszTgIAAQQBBgNSEgAA2AsjTgIAAQQBBgNSEgAA2ApjQgIAAQQAgBDYCrNCAgABBAEF/NgKo0ICAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALQYDUhIAAQXhBgNSEgABrQQ9xQQBBgNSEgABBCGpBD3EbIgNqIgRBBGogAkFIaiIFIANrIgNBAXI2AgBBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAQYDUhIAAIAVqQTg2AgQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFLDQACQEEAKAKI0ICAACIGQRAgAEETakFwcSAAQQtJGyICQQN2IgR2IgNBA3FFDQACQAJAIANBAXEgBHJBAXMiBUEDdCIEQbDQgIAAaiIDIARBuNCAgABqKAIAIgQoAggiAkcNAEEAIAZBfiAFd3E2AojQgIAADAELIAMgAjYCCCACIAM2AgwLIARBCGohAyAEIAVBA3QiBUEDcjYCBCAEIAVqIgQgBCgCBEEBcjYCBAwMCyACQQAoApDQgIAAIgdNDQECQCADRQ0AAkACQCADIAR0QQIgBHQiA0EAIANrcnEiA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqIgRBA3QiA0Gw0ICAAGoiBSADQbjQgIAAaigCACIDKAIIIgBHDQBBACAGQX4gBHdxIgY2AojQgIAADAELIAUgADYCCCAAIAU2AgwLIAMgAkEDcjYCBCADIARBA3QiBGogBCACayIFNgIAIAMgAmoiACAFQQFyNgIEAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQQCQAJAIAZBASAHQQN2dCIIcQ0AQQAgBiAIcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCAENgIMIAIgBDYCCCAEIAI2AgwgBCAINgIICyADQQhqIQNBACAANgKc0ICAAEEAIAU2ApDQgIAADAwLQQAoAozQgIAAIglFDQEgCUEAIAlrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqQQJ0QbjSgIAAaigCACIAKAIEQXhxIAJrIQQgACEFAkADQAJAIAUoAhAiAw0AIAVBFGooAgAiA0UNAgsgAygCBEF4cSACayIFIAQgBSAESSIFGyEEIAMgACAFGyEAIAMhBQwACwsgACgCGCEKAkAgACgCDCIIIABGDQAgACgCCCIDQQAoApjQgIAASRogCCADNgIIIAMgCDYCDAwLCwJAIABBFGoiBSgCACIDDQAgACgCECIDRQ0DIABBEGohBQsDQCAFIQsgAyIIQRRqIgUoAgAiAw0AIAhBEGohBSAIKAIQIgMNAAsgC0EANgIADAoLQX8hAiAAQb9/Sw0AIABBE2oiA0FwcSECQQAoAozQgIAAIgdFDQBBACELAkAgAkGAAkkNAEEfIQsgAkH///8HSw0AIANBCHYiAyADQYD+P2pBEHZBCHEiA3QiBCAEQYDgH2pBEHZBBHEiBHQiBSAFQYCAD2pBEHZBAnEiBXRBD3YgAyAEciAFcmsiA0EBdCACIANBFWp2QQFxckEcaiELC0EAIAJrIQQCQAJAAkACQCALQQJ0QbjSgIAAaigCACIFDQBBACEDQQAhCAwBC0EAIQMgAkEAQRkgC0EBdmsgC0EfRht0IQBBACEIA0ACQCAFKAIEQXhxIAJrIgYgBE8NACAGIQQgBSEIIAYNAEEAIQQgBSEIIAUhAwwDCyADIAVBFGooAgAiBiAGIAUgAEEddkEEcWpBEGooAgAiBUYbIAMgBhshAyAAQQF0IQAgBQ0ACwsCQCADIAhyDQBBACEIQQIgC3QiA0EAIANrciAHcSIDRQ0DIANBACADa3FBf2oiAyADQQx2QRBxIgN2IgVBBXZBCHEiACADciAFIAB2IgNBAnZBBHEiBXIgAyAFdiIDQQF2QQJxIgVyIAMgBXYiA0EBdkEBcSIFciADIAV2akECdEG40oCAAGooAgAhAwsgA0UNAQsDQCADKAIEQXhxIAJrIgYgBEkhAAJAIAMoAhAiBQ0AIANBFGooAgAhBQsgBiAEIAAbIQQgAyAIIAAbIQggBSEDIAUNAAsLIAhFDQAgBEEAKAKQ0ICAACACa08NACAIKAIYIQsCQCAIKAIMIgAgCEYNACAIKAIIIgNBACgCmNCAgABJGiAAIAM2AgggAyAANgIMDAkLAkAgCEEUaiIFKAIAIgMNACAIKAIQIgNFDQMgCEEQaiEFCwNAIAUhBiADIgBBFGoiBSgCACIDDQAgAEEQaiEFIAAoAhAiAw0ACyAGQQA2AgAMCAsCQEEAKAKQ0ICAACIDIAJJDQBBACgCnNCAgAAhBAJAAkAgAyACayIFQRBJDQAgBCACaiIAIAVBAXI2AgRBACAFNgKQ0ICAAEEAIAA2ApzQgIAAIAQgA2ogBTYCACAEIAJBA3I2AgQMAQsgBCADQQNyNgIEIAQgA2oiAyADKAIEQQFyNgIEQQBBADYCnNCAgABBAEEANgKQ0ICAAAsgBEEIaiEDDAoLAkBBACgClNCAgAAiACACTQ0AQQAoAqDQgIAAIgMgAmoiBCAAIAJrIgVBAXI2AgRBACAFNgKU0ICAAEEAIAQ2AqDQgIAAIAMgAkEDcjYCBCADQQhqIQMMCgsCQAJAQQAoAuDTgIAARQ0AQQAoAujTgIAAIQQMAQtBAEJ/NwLs04CAAEEAQoCAhICAgMAANwLk04CAAEEAIAFBDGpBcHFB2KrVqgVzNgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgABBgIAEIQQLQQAhAwJAIAQgAkHHAGoiB2oiBkEAIARrIgtxIgggAksNAEEAQTA2AvjTgIAADAoLAkBBACgCwNOAgAAiA0UNAAJAQQAoArjTgIAAIgQgCGoiBSAETQ0AIAUgA00NAQtBACEDQQBBMDYC+NOAgAAMCgtBAC0AxNOAgABBBHENBAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQAJAIAMoAgAiBSAESw0AIAUgAygCBGogBEsNAwsgAygCCCIDDQALC0EAEMuAgIAAIgBBf0YNBSAIIQYCQEEAKALk04CAACIDQX9qIgQgAHFFDQAgCCAAayAEIABqQQAgA2txaiEGCyAGIAJNDQUgBkH+////B0sNBQJAQQAoAsDTgIAAIgNFDQBBACgCuNOAgAAiBCAGaiIFIARNDQYgBSADSw0GCyAGEMuAgIAAIgMgAEcNAQwHCyAGIABrIAtxIgZB/v///wdLDQQgBhDLgICAACIAIAMoAgAgAygCBGpGDQMgACEDCwJAIANBf0YNACACQcgAaiAGTQ0AAkAgByAGa0EAKALo04CAACIEakEAIARrcSIEQf7///8HTQ0AIAMhAAwHCwJAIAQQy4CAgABBf0YNACAEIAZqIQYgAyEADAcLQQAgBmsQy4CAgAAaDAQLIAMhACADQX9HDQUMAwtBACEIDAcLQQAhAAwFCyAAQX9HDQILQQBBACgCxNOAgABBBHI2AsTTgIAACyAIQf7///8HSw0BIAgQy4CAgAAhAEEAEMuAgIAAIQMgAEF/Rg0BIANBf0YNASAAIANPDQEgAyAAayIGIAJBOGpNDQELQQBBACgCuNOAgAAgBmoiAzYCuNOAgAACQCADQQAoArzTgIAATQ0AQQAgAzYCvNOAgAALAkACQAJAAkBBACgCoNCAgAAiBEUNAEHI04CAACEDA0AgACADKAIAIgUgAygCBCIIakYNAiADKAIIIgMNAAwDCwsCQAJAQQAoApjQgIAAIgNFDQAgACADTw0BC0EAIAA2ApjQgIAAC0EAIQNBACAGNgLM04CAAEEAIAA2AsjTgIAAQQBBfzYCqNCAgABBAEEAKALg04CAADYCrNCAgABBAEEANgLU04CAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgQgBkFIaiIFIANrIgNBAXI2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAIAAgBWpBODYCBAwCCyADLQAMQQhxDQAgBCAFSQ0AIAQgAE8NACAEQXggBGtBD3FBACAEQQhqQQ9xGyIFaiIAQQAoApTQgIAAIAZqIgsgBWsiBUEBcjYCBCADIAggBmo2AgRBAEEAKALw04CAADYCpNCAgABBACAFNgKU0ICAAEEAIAA2AqDQgIAAIAQgC2pBODYCBAwBCwJAIABBACgCmNCAgAAiCE8NAEEAIAA2ApjQgIAAIAAhCAsgACAGaiEFQcjTgIAAIQMCQAJAAkACQAJAAkACQANAIAMoAgAgBUYNASADKAIIIgMNAAwCCwsgAy0ADEEIcUUNAQtByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiIFIARLDQMLIAMoAgghAwwACwsgAyAANgIAIAMgAygCBCAGajYCBCAAQXggAGtBD3FBACAAQQhqQQ9xG2oiCyACQQNyNgIEIAVBeCAFa0EPcUEAIAVBCGpBD3EbaiIGIAsgAmoiAmshAwJAIAYgBEcNAEEAIAI2AqDQgIAAQQBBACgClNCAgAAgA2oiAzYClNCAgAAgAiADQQFyNgIEDAMLAkAgBkEAKAKc0ICAAEcNAEEAIAI2ApzQgIAAQQBBACgCkNCAgAAgA2oiAzYCkNCAgAAgAiADQQFyNgIEIAIgA2ogAzYCAAwDCwJAIAYoAgQiBEEDcUEBRw0AIARBeHEhBwJAAkAgBEH/AUsNACAGKAIIIgUgBEEDdiIIQQN0QbDQgIAAaiIARhoCQCAGKAIMIgQgBUcNAEEAQQAoAojQgIAAQX4gCHdxNgKI0ICAAAwCCyAEIABGGiAEIAU2AgggBSAENgIMDAELIAYoAhghCQJAAkAgBigCDCIAIAZGDQAgBigCCCIEIAhJGiAAIAQ2AgggBCAANgIMDAELAkAgBkEUaiIEKAIAIgUNACAGQRBqIgQoAgAiBQ0AQQAhAAwBCwNAIAQhCCAFIgBBFGoiBCgCACIFDQAgAEEQaiEEIAAoAhAiBQ0ACyAIQQA2AgALIAlFDQACQAJAIAYgBigCHCIFQQJ0QbjSgIAAaiIEKAIARw0AIAQgADYCACAADQFBAEEAKAKM0ICAAEF+IAV3cTYCjNCAgAAMAgsgCUEQQRQgCSgCECAGRhtqIAA2AgAgAEUNAQsgACAJNgIYAkAgBigCECIERQ0AIAAgBDYCECAEIAA2AhgLIAYoAhQiBEUNACAAQRRqIAQ2AgAgBCAANgIYCyAHIANqIQMgBiAHaiIGKAIEIQQLIAYgBEF+cTYCBCACIANqIAM2AgAgAiADQQFyNgIEAkAgA0H/AUsNACADQXhxQbDQgIAAaiEEAkACQEEAKAKI0ICAACIFQQEgA0EDdnQiA3ENAEEAIAUgA3I2AojQgIAAIAQhAwwBCyAEKAIIIQMLIAMgAjYCDCAEIAI2AgggAiAENgIMIAIgAzYCCAwDC0EfIQQCQCADQf///wdLDQAgA0EIdiIEIARBgP4/akEQdkEIcSIEdCIFIAVBgOAfakEQdkEEcSIFdCIAIABBgIAPakEQdkECcSIAdEEPdiAEIAVyIAByayIEQQF0IAMgBEEVanZBAXFyQRxqIQQLIAIgBDYCHCACQgA3AhAgBEECdEG40oCAAGohBQJAQQAoAozQgIAAIgBBASAEdCIIcQ0AIAUgAjYCAEEAIAAgCHI2AozQgIAAIAIgBTYCGCACIAI2AgggAiACNgIMDAMLIANBAEEZIARBAXZrIARBH0YbdCEEIAUoAgAhAANAIAAiBSgCBEF4cSADRg0CIARBHXYhACAEQQF0IQQgBSAAQQRxakEQaiIIKAIAIgANAAsgCCACNgIAIAIgBTYCGCACIAI2AgwgAiACNgIIDAILIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgsgBkFIaiIIIANrIgNBAXI2AgQgACAIakE4NgIEIAQgBUE3IAVrQQ9xQQAgBUFJakEPcRtqQUFqIgggCCAEQRBqSRsiCEEjNgIEQQBBACgC8NOAgAA2AqTQgIAAQQAgAzYClNCAgABBACALNgKg0ICAACAIQRBqQQApAtDTgIAANwIAIAhBACkCyNOAgAA3AghBACAIQQhqNgLQ04CAAEEAIAY2AszTgIAAQQAgADYCyNOAgABBAEEANgLU04CAACAIQSRqIQMDQCADQQc2AgAgA0EEaiIDIAVJDQALIAggBEYNAyAIIAgoAgRBfnE2AgQgCCAIIARrIgA2AgAgBCAAQQFyNgIEAkAgAEH/AUsNACAAQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgAEEDdnQiAHENAEEAIAUgAHI2AojQgIAAIAMhBQwBCyADKAIIIQULIAUgBDYCDCADIAQ2AgggBCADNgIMIAQgBTYCCAwEC0EfIQMCQCAAQf///wdLDQAgAEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCIIIAhBgIAPakEQdkECcSIIdEEPdiADIAVyIAhyayIDQQF0IAAgA0EVanZBAXFyQRxqIQMLIAQgAzYCHCAEQgA3AhAgA0ECdEG40oCAAGohBQJAQQAoAozQgIAAIghBASADdCIGcQ0AIAUgBDYCAEEAIAggBnI2AozQgIAAIAQgBTYCGCAEIAQ2AgggBCAENgIMDAQLIABBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhCANAIAgiBSgCBEF4cSAARg0DIANBHXYhCCADQQF0IQMgBSAIQQRxakEQaiIGKAIAIggNAAsgBiAENgIAIAQgBTYCGCAEIAQ2AgwgBCAENgIIDAMLIAUoAggiAyACNgIMIAUgAjYCCCACQQA2AhggAiAFNgIMIAIgAzYCCAsgC0EIaiEDDAULIAUoAggiAyAENgIMIAUgBDYCCCAEQQA2AhggBCAFNgIMIAQgAzYCCAtBACgClNCAgAAiAyACTQ0AQQAoAqDQgIAAIgQgAmoiBSADIAJrIgNBAXI2AgRBACADNgKU0ICAAEEAIAU2AqDQgIAAIAQgAkEDcjYCBCAEQQhqIQMMAwtBACEDQQBBMDYC+NOAgAAMAgsCQCALRQ0AAkACQCAIIAgoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAA2AgAgAA0BQQAgB0F+IAV3cSIHNgKM0ICAAAwCCyALQRBBFCALKAIQIAhGG2ogADYCACAARQ0BCyAAIAs2AhgCQCAIKAIQIgNFDQAgACADNgIQIAMgADYCGAsgCEEUaigCACIDRQ0AIABBFGogAzYCACADIAA2AhgLAkACQCAEQQ9LDQAgCCAEIAJqIgNBA3I2AgQgCCADaiIDIAMoAgRBAXI2AgQMAQsgCCACaiIAIARBAXI2AgQgCCACQQNyNgIEIAAgBGogBDYCAAJAIARB/wFLDQAgBEF4cUGw0ICAAGohAwJAAkBBACgCiNCAgAAiBUEBIARBA3Z0IgRxDQBBACAFIARyNgKI0ICAACADIQQMAQsgAygCCCEECyAEIAA2AgwgAyAANgIIIAAgAzYCDCAAIAQ2AggMAQtBHyEDAkAgBEH///8HSw0AIARBCHYiAyADQYD+P2pBEHZBCHEiA3QiBSAFQYDgH2pBEHZBBHEiBXQiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAFciACcmsiA0EBdCAEIANBFWp2QQFxckEcaiEDCyAAIAM2AhwgAEIANwIQIANBAnRBuNKAgABqIQUCQCAHQQEgA3QiAnENACAFIAA2AgBBACAHIAJyNgKM0ICAACAAIAU2AhggACAANgIIIAAgADYCDAwBCyAEQQBBGSADQQF2ayADQR9GG3QhAyAFKAIAIQICQANAIAIiBSgCBEF4cSAERg0BIANBHXYhAiADQQF0IQMgBSACQQRxakEQaiIGKAIAIgINAAsgBiAANgIAIAAgBTYCGCAAIAA2AgwgACAANgIIDAELIAUoAggiAyAANgIMIAUgADYCCCAAQQA2AhggACAFNgIMIAAgAzYCCAsgCEEIaiEDDAELAkAgCkUNAAJAAkAgACAAKAIcIgVBAnRBuNKAgABqIgMoAgBHDQAgAyAINgIAIAgNAUEAIAlBfiAFd3E2AozQgIAADAILIApBEEEUIAooAhAgAEYbaiAINgIAIAhFDQELIAggCjYCGAJAIAAoAhAiA0UNACAIIAM2AhAgAyAINgIYCyAAQRRqKAIAIgNFDQAgCEEUaiADNgIAIAMgCDYCGAsCQAJAIARBD0sNACAAIAQgAmoiA0EDcjYCBCAAIANqIgMgAygCBEEBcjYCBAwBCyAAIAJqIgUgBEEBcjYCBCAAIAJBA3I2AgQgBSAEaiAENgIAAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQMCQAJAQQEgB0EDdnQiCCAGcQ0AQQAgCCAGcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCADNgIMIAIgAzYCCCADIAI2AgwgAyAINgIIC0EAIAU2ApzQgIAAQQAgBDYCkNCAgAALIABBCGohAwsgAUEQaiSAgICAACADCwoAIAAQyYCAgAAL4g0BB38CQCAARQ0AIABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAIAJBAXENACACQQNxRQ0BIAEgASgCACICayIBQQAoApjQgIAAIgRJDQEgAiAAaiEAAkAgAUEAKAKc0ICAAEYNAAJAIAJB/wFLDQAgASgCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgASgCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAwsgAiAGRhogAiAENgIIIAQgAjYCDAwCCyABKAIYIQcCQAJAIAEoAgwiBiABRg0AIAEoAggiAiAESRogBiACNgIIIAIgBjYCDAwBCwJAIAFBFGoiAigCACIEDQAgAUEQaiICKAIAIgQNAEEAIQYMAQsDQCACIQUgBCIGQRRqIgIoAgAiBA0AIAZBEGohAiAGKAIQIgQNAAsgBUEANgIACyAHRQ0BAkACQCABIAEoAhwiBEECdEG40oCAAGoiAigCAEcNACACIAY2AgAgBg0BQQBBACgCjNCAgABBfiAEd3E2AozQgIAADAMLIAdBEEEUIAcoAhAgAUYbaiAGNgIAIAZFDQILIAYgBzYCGAJAIAEoAhAiAkUNACAGIAI2AhAgAiAGNgIYCyABKAIUIgJFDQEgBkEUaiACNgIAIAIgBjYCGAwBCyADKAIEIgJBA3FBA0cNACADIAJBfnE2AgRBACAANgKQ0ICAACABIABqIAA2AgAgASAAQQFyNgIEDwsgASADTw0AIAMoAgQiAkEBcUUNAAJAAkAgAkECcQ0AAkAgA0EAKAKg0ICAAEcNAEEAIAE2AqDQgIAAQQBBACgClNCAgAAgAGoiADYClNCAgAAgASAAQQFyNgIEIAFBACgCnNCAgABHDQNBAEEANgKQ0ICAAEEAQQA2ApzQgIAADwsCQCADQQAoApzQgIAARw0AQQAgATYCnNCAgABBAEEAKAKQ0ICAACAAaiIANgKQ0ICAACABIABBAXI2AgQgASAAaiAANgIADwsgAkF4cSAAaiEAAkACQCACQf8BSw0AIAMoAggiBCACQQN2IgVBA3RBsNCAgABqIgZGGgJAIAMoAgwiAiAERw0AQQBBACgCiNCAgABBfiAFd3E2AojQgIAADAILIAIgBkYaIAIgBDYCCCAEIAI2AgwMAQsgAygCGCEHAkACQCADKAIMIgYgA0YNACADKAIIIgJBACgCmNCAgABJGiAGIAI2AgggAiAGNgIMDAELAkAgA0EUaiICKAIAIgQNACADQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQACQAJAIAMgAygCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAgsgB0EQQRQgBygCECADRhtqIAY2AgAgBkUNAQsgBiAHNgIYAkAgAygCECICRQ0AIAYgAjYCECACIAY2AhgLIAMoAhQiAkUNACAGQRRqIAI2AgAgAiAGNgIYCyABIABqIAA2AgAgASAAQQFyNgIEIAFBACgCnNCAgABHDQFBACAANgKQ0ICAAA8LIAMgAkF+cTYCBCABIABqIAA2AgAgASAAQQFyNgIECwJAIABB/wFLDQAgAEF4cUGw0ICAAGohAgJAAkBBACgCiNCAgAAiBEEBIABBA3Z0IgBxDQBBACAEIAByNgKI0ICAACACIQAMAQsgAigCCCEACyAAIAE2AgwgAiABNgIIIAEgAjYCDCABIAA2AggPC0EfIQICQCAAQf///wdLDQAgAEEIdiICIAJBgP4/akEQdkEIcSICdCIEIARBgOAfakEQdkEEcSIEdCIGIAZBgIAPakEQdkECcSIGdEEPdiACIARyIAZyayICQQF0IAAgAkEVanZBAXFyQRxqIQILIAEgAjYCHCABQgA3AhAgAkECdEG40oCAAGohBAJAAkBBACgCjNCAgAAiBkEBIAJ0IgNxDQAgBCABNgIAQQAgBiADcjYCjNCAgAAgASAENgIYIAEgATYCCCABIAE2AgwMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgBCgCACEGAkADQCAGIgQoAgRBeHEgAEYNASACQR12IQYgAkEBdCECIAQgBkEEcWpBEGoiAygCACIGDQALIAMgATYCACABIAQ2AhggASABNgIMIAEgATYCCAwBCyAEKAIIIgAgATYCDCAEIAE2AgggAUEANgIYIAEgBDYCDCABIAA2AggLQQBBACgCqNCAgABBf2oiAUF/IAEbNgKo0ICAAAsLBAAAAAtOAAJAIAANAD8AQRB0DwsCQCAAQf//A3ENACAAQX9MDQACQCAAQRB2QAAiAEF/Rw0AQQBBMDYC+NOAgABBfw8LIABBEHQPCxDKgICAAAAL8gICA38BfgJAIAJFDQAgACABOgAAIAIgAGoiA0F/aiABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBfWogAToAACADQX5qIAE6AAAgAkEHSQ0AIAAgAToAAyADQXxqIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIFayICQSBJDQAgAa1CgYCAgBB+IQYgAyAFaiEBA0AgASAGNwMYIAEgBjcDECABIAY3AwggASAGNwMAIAFBIGohASACQWBqIgJBH0sNAAsLIAALC45IAQBBgAgLhkgBAAAAAgAAAAMAAAAAAAAAAAAAAAQAAAAFAAAAAAAAAAAAAAAGAAAABwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEludmFsaWQgY2hhciBpbiB1cmwgcXVlcnkAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9ib2R5AENvbnRlbnQtTGVuZ3RoIG92ZXJmbG93AENodW5rIHNpemUgb3ZlcmZsb3cAUmVzcG9uc2Ugb3ZlcmZsb3cASW52YWxpZCBtZXRob2QgZm9yIEhUVFAveC54IHJlcXVlc3QASW52YWxpZCBtZXRob2QgZm9yIFJUU1AveC54IHJlcXVlc3QARXhwZWN0ZWQgU09VUkNFIG1ldGhvZCBmb3IgSUNFL3gueCByZXF1ZXN0AEludmFsaWQgY2hhciBpbiB1cmwgZnJhZ21lbnQgc3RhcnQARXhwZWN0ZWQgZG90AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fc3RhdHVzAEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8="; -}); - -// ../node_modules/undici/lib/llhttp/llhttp_simd-wasm.js -var require_llhttp_simd_wasm = __commonJS((exports, module) => { - module.exports = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=="; -}); - -// ../node_modules/undici/lib/client.js -var require_client = __commonJS((exports, module) => { - var assert = __require("assert"); - var net = __require("net"); - var http = __require("http"); - var { pipeline } = __require("stream"); - var util = require_util(); - var timers = require_timers(); - var Request = require_request(); - var DispatcherBase = require_dispatcher_base(); - var { - RequestContentLengthMismatchError, - ResponseContentLengthMismatchError, - InvalidArgumentError, - RequestAbortedError, - HeadersTimeoutError, - HeadersOverflowError, - SocketError, - InformationalError, - BodyTimeoutError, - HTTPParserError, - ResponseExceededMaxSizeError, - ClientDestroyedError - } = require_errors(); - var buildConnector = require_connect(); - var { - kUrl, - kReset, - kServerName, - kClient, - kBusy, - kParser, - kConnect, - kBlocking, - kResuming, - kRunning, - kPending, - kSize, - kWriting, - kQueue, - kConnected, - kConnecting, - kNeedDrain, - kNoRef, - kKeepAliveDefaultTimeout, - kHostHeader, - kPendingIdx, - kRunningIdx, - kError, - kPipelining, - kSocket, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, - kStrictContentLength, - kConnector, - kMaxRedirections, - kMaxRequests, - kCounter, - kClose, - kDestroy, - kDispatch, - kInterceptors, - kLocalAddress, - kMaxResponseSize, - kHTTPConnVersion, - kHost, - kHTTP2Session, - kHTTP2SessionState, - kHTTP2BuildRequest, - kHTTP2CopyHeaders, - kHTTP1BuildRequest - } = require_symbols(); - var http2; - try { - http2 = __require("http2"); - } catch { - http2 = { constants: {} }; - } - var { - constants: { - HTTP2_HEADER_AUTHORITY, - HTTP2_HEADER_METHOD, - HTTP2_HEADER_PATH, - HTTP2_HEADER_SCHEME, - HTTP2_HEADER_CONTENT_LENGTH, - HTTP2_HEADER_EXPECT, - HTTP2_HEADER_STATUS - } - } = http2; - var h2ExperimentalWarned = false; - var FastBuffer = Buffer[Symbol.species]; - var kClosedResolve = Symbol("kClosedResolve"); - var channels = {}; - try { - const diagnosticsChannel = __require("diagnostics_channel"); - channels.sendHeaders = diagnosticsChannel.channel("undici:client:sendHeaders"); - channels.beforeConnect = diagnosticsChannel.channel("undici:client:beforeConnect"); - channels.connectError = diagnosticsChannel.channel("undici:client:connectError"); - channels.connected = diagnosticsChannel.channel("undici:client:connected"); - } catch { - channels.sendHeaders = { hasSubscribers: false }; - channels.beforeConnect = { hasSubscribers: false }; - channels.connectError = { hasSubscribers: false }; - channels.connected = { hasSubscribers: false }; - } - - class Client extends DispatcherBase { - constructor(url, { - interceptors, - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - maxRedirections, - connect: connect2, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - allowH2, - maxConcurrentStreams - } = {}) { - super(); - if (keepAlive !== undefined) { - throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); - } - if (socketTimeout !== undefined) { - throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); - } - if (requestTimeout !== undefined) { - throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); - } - if (idleTimeout !== undefined) { - throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); - } - if (maxKeepAliveTimeout !== undefined) { - throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); - } - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError("invalid maxHeaderSize"); - } - if (socketPath != null && typeof socketPath !== "string") { - throw new InvalidArgumentError("invalid socketPath"); - } - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError("invalid connectTimeout"); - } - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveTimeout"); - } - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); - } - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); - } - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); - } - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); - } - if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); - } - if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError("localAddress must be valid string IP address"); - } - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError("maxResponseSize must be a positive number"); - } - if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { - throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); - } - if (allowH2 != null && typeof allowH2 !== "boolean") { - throw new InvalidArgumentError("allowH2 must be a valid boolean value"); - } - if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { - throw new InvalidArgumentError("maxConcurrentStreams must be a possitive integer, greater than 0"); - } - if (typeof connect2 !== "function") { - connect2 = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined, - ...connect2 - }); - } - this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) ? interceptors.Client : [createRedirectInterceptor({ maxRedirections })]; - this[kUrl] = util.parseOrigin(url); - this[kConnector] = connect2; - this[kSocket] = null; - this[kPipelining] = pipelining != null ? pipelining : 1; - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4000 : keepAliveTimeout; - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600000 : keepAliveMaxTimeout; - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1000 : keepAliveTimeoutThreshold; - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; - this[kServerName] = null; - this[kLocalAddress] = localAddress != null ? localAddress : null; - this[kResuming] = 0; - this[kNeedDrain] = 0; - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r\n`; - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300000; - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300000; - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; - this[kMaxRedirections] = maxRedirections; - this[kMaxRequests] = maxRequestsPerClient; - this[kClosedResolve] = null; - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; - this[kHTTPConnVersion] = "h1"; - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = !allowH2 ? null : { - openStreams: 0, - maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 - }; - this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}`; - this[kQueue] = []; - this[kRunningIdx] = 0; - this[kPendingIdx] = 0; - } - get pipelining() { - return this[kPipelining]; - } - set pipelining(value) { - this[kPipelining] = value; - resume(this, true); - } - get [kPending]() { - return this[kQueue].length - this[kPendingIdx]; - } - get [kRunning]() { - return this[kPendingIdx] - this[kRunningIdx]; - } - get [kSize]() { - return this[kQueue].length - this[kRunningIdx]; - } - get [kConnected]() { - return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed; - } - get [kBusy]() { - const socket = this[kSocket]; - return socket && (socket[kReset] || socket[kWriting] || socket[kBlocking]) || this[kSize] >= (this[kPipelining] || 1) || this[kPending] > 0; - } - [kConnect](cb) { - connect(this); - this.once("connect", cb); - } - [kDispatch](opts, handler) { - const origin = opts.origin || this[kUrl].origin; - const request = this[kHTTPConnVersion] === "h2" ? Request[kHTTP2BuildRequest](origin, opts, handler) : Request[kHTTP1BuildRequest](origin, opts, handler); - this[kQueue].push(request); - if (this[kResuming]) { - } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { - this[kResuming] = 1; - process.nextTick(resume, this); - } else { - resume(this, true); - } - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2; - } - return this[kNeedDrain] < 2; - } - async[kClose]() { - return new Promise((resolve) => { - if (!this[kSize]) { - resolve(null); - } else { - this[kClosedResolve] = resolve; - } - }); - } - async[kDestroy](err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]); - for (let i = 0;i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); - } - const callback = () => { - if (this[kClosedResolve]) { - this[kClosedResolve](); - this[kClosedResolve] = null; - } - resolve(); - }; - if (this[kHTTP2Session] != null) { - util.destroy(this[kHTTP2Session], err); - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = null; - } - if (!this[kSocket]) { - queueMicrotask(callback); - } else { - util.destroy(this[kSocket].on("close", callback), err); - } - resume(this); - }); - } - } - function onHttp2SessionError(err) { - assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - this[kSocket][kError] = err; - onError(this[kClient], err); - } - function onHttp2FrameError(type, code, id) { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - if (id === 0) { - this[kSocket][kError] = err; - onError(this[kClient], err); - } - } - function onHttp2SessionEnd() { - util.destroy(this, new SocketError("other side closed")); - util.destroy(this[kSocket], new SocketError("other side closed")); - } - function onHTTP2GoAway(code) { - const client = this[kClient]; - const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`); - client[kSocket] = null; - client[kHTTP2Session] = null; - if (client.destroyed) { - assert(this[kPending] === 0); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0;i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); - } - } else if (client[kRunning] > 0) { - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - errorRequest(client, request, err); - } - client[kPendingIdx] = client[kRunningIdx]; - assert(client[kRunning] === 0); - client.emit("disconnect", client[kUrl], [client], err); - resume(client); - } - var constants = require_constants3(); - var createRedirectInterceptor = require_redirectInterceptor(); - var EMPTY_BUF = Buffer.alloc(0); - async function lazyllhttp() { - const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : undefined; - let mod; - try { - mod = await WebAssembly.compile(Buffer.from(require_llhttp_simd_wasm(), "base64")); - } catch (e) { - mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || require_llhttp_wasm(), "base64")); - } - return await WebAssembly.instantiate(mod, { - env: { - wasm_on_url: (p, at, len) => { - return 0; - }, - wasm_on_status: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_begin: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageBegin() || 0; - }, - wasm_on_header_field: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_header_value: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; - }, - wasm_on_body: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_complete: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageComplete() || 0; - } - } - }); - } - var llhttpInstance = null; - var llhttpPromise = lazyllhttp(); - llhttpPromise.catch(); - var currentParser = null; - var currentBufferRef = null; - var currentBufferSize = 0; - var currentBufferPtr = null; - var TIMEOUT_HEADERS = 1; - var TIMEOUT_BODY = 2; - var TIMEOUT_IDLE = 3; - - class Parser { - constructor(client, socket, { exports: exports2 }) { - assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); - this.llhttp = exports2; - this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); - this.client = client; - this.socket = socket; - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.statusCode = null; - this.statusText = ""; - this.upgrade = false; - this.headers = []; - this.headersSize = 0; - this.headersMaxSize = client[kMaxHeadersSize]; - this.shouldKeepAlive = false; - this.paused = false; - this.resume = this.resume.bind(this); - this.bytesRead = 0; - this.keepAlive = ""; - this.contentLength = ""; - this.connection = ""; - this.maxResponseSize = client[kMaxResponseSize]; - } - setTimeout(value, type) { - this.timeoutType = type; - if (value !== this.timeoutValue) { - timers.clearTimeout(this.timeout); - if (value) { - this.timeout = timers.setTimeout(onParserTimeout, value, this); - if (this.timeout.unref) { - this.timeout.unref(); - } - } else { - this.timeout = null; - } - this.timeoutValue = value; - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - } - resume() { - if (this.socket.destroyed || !this.paused) { - return; - } - assert(this.ptr != null); - assert(currentParser == null); - this.llhttp.llhttp_resume(this.ptr); - assert(this.timeoutType === TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - this.paused = false; - this.execute(this.socket.read() || EMPTY_BUF); - this.readMore(); - } - readMore() { - while (!this.paused && this.ptr) { - const chunk = this.socket.read(); - if (chunk === null) { - break; - } - this.execute(chunk); - } - } - execute(data) { - assert(this.ptr != null); - assert(currentParser == null); - assert(!this.paused); - const { socket, llhttp } = this; - if (data.length > currentBufferSize) { - if (currentBufferPtr) { - llhttp.free(currentBufferPtr); - } - currentBufferSize = Math.ceil(data.length / 4096) * 4096; - currentBufferPtr = llhttp.malloc(currentBufferSize); - } - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); - try { - let ret; - try { - currentBufferRef = data; - currentParser = this; - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); - } catch (err) { - throw err; - } finally { - currentParser = null; - currentBufferRef = null; - } - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)); - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true; - socket.unshift(data.slice(offset)); - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr); - let message = ""; - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); - message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; - } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)); - } - } catch (err) { - util.destroy(socket, err); - } - } - destroy() { - assert(this.ptr != null); - assert(currentParser == null); - this.llhttp.llhttp_free(this.ptr); - this.ptr = null; - timers.clearTimeout(this.timeout); - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.paused = false; - } - onStatus(buf) { - this.statusText = buf.toString(); - } - onMessageBegin() { - const { socket, client } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1; - } - } - onHeaderField(buf) { - const len = this.headers.length; - if ((len & 1) === 0) { - this.headers.push(buf); - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); - } - this.trackHeader(buf.length); - } - onHeaderValue(buf) { - let len = this.headers.length; - if ((len & 1) === 1) { - this.headers.push(buf); - len += 1; - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); - } - const key = this.headers[len - 2]; - if (key.length === 10 && key.toString().toLowerCase() === "keep-alive") { - this.keepAlive += buf.toString(); - } else if (key.length === 10 && key.toString().toLowerCase() === "connection") { - this.connection += buf.toString(); - } else if (key.length === 14 && key.toString().toLowerCase() === "content-length") { - this.contentLength += buf.toString(); - } - this.trackHeader(buf.length); - } - trackHeader(len) { - this.headersSize += len; - if (this.headersSize >= this.headersMaxSize) { - util.destroy(this.socket, new HeadersOverflowError); - } - } - onUpgrade(head) { - const { upgrade, client, socket, headers, statusCode } = this; - assert(upgrade); - const request = client[kQueue][client[kRunningIdx]]; - assert(request); - assert(!socket.destroyed); - assert(socket === client[kSocket]); - assert(!this.paused); - assert(request.upgrade || request.method === "CONNECT"); - this.statusCode = null; - this.statusText = ""; - this.shouldKeepAlive = null; - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - socket.unshift(head); - socket[kParser].destroy(); - socket[kParser] = null; - socket[kClient] = null; - socket[kError] = null; - socket.removeListener("error", onSocketError).removeListener("readable", onSocketReadable).removeListener("end", onSocketEnd).removeListener("close", onSocketClose); - client[kSocket] = null; - client[kQueue][client[kRunningIdx]++] = null; - client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade")); - try { - request.onUpgrade(statusCode, headers, socket); - } catch (err) { - util.destroy(socket, err); - } - resume(client); - } - onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { - const { client, socket, headers, statusText } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1; - } - assert(!this.upgrade); - assert(this.statusCode < 200); - if (statusCode === 100) { - util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket))); - return -1; - } - if (upgrade && !request.upgrade) { - util.destroy(socket, new SocketError("bad upgrade", util.getSocketInfo(socket))); - return -1; - } - assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS); - this.statusCode = statusCode; - this.shouldKeepAlive = shouldKeepAlive || request.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; - if (this.statusCode >= 200) { - const bodyTimeout = request.bodyTimeout != null ? request.bodyTimeout : client[kBodyTimeout]; - this.setTimeout(bodyTimeout, TIMEOUT_BODY); - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - if (request.method === "CONNECT") { - assert(client[kRunning] === 1); - this.upgrade = true; - return 2; - } - if (upgrade) { - assert(client[kRunning] === 1); - this.upgrade = true; - return 2; - } - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - if (this.shouldKeepAlive && client[kPipelining]) { - const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; - if (keepAliveTimeout != null) { - const timeout = Math.min(keepAliveTimeout - client[kKeepAliveTimeoutThreshold], client[kKeepAliveMaxTimeout]); - if (timeout <= 0) { - socket[kReset] = true; - } else { - client[kKeepAliveTimeoutValue] = timeout; - } - } else { - client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; - } - } else { - socket[kReset] = true; - } - const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; - if (request.aborted) { - return -1; - } - if (request.method === "HEAD") { - return 1; - } - if (statusCode < 200) { - return 1; - } - if (socket[kBlocking]) { - socket[kBlocking] = false; - resume(client); - } - return pause ? constants.ERROR.PAUSED : 0; - } - onBody(buf) { - const { client, socket, statusCode, maxResponseSize } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - assert(request); - assert.strictEqual(this.timeoutType, TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - assert(statusCode >= 200); - if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { - util.destroy(socket, new ResponseExceededMaxSizeError); - return -1; - } - this.bytesRead += buf.length; - if (request.onData(buf) === false) { - return constants.ERROR.PAUSED; - } - } - onMessageComplete() { - const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; - if (socket.destroyed && (!statusCode || shouldKeepAlive)) { - return -1; - } - if (upgrade) { - return; - } - const request = client[kQueue][client[kRunningIdx]]; - assert(request); - assert(statusCode >= 100); - this.statusCode = null; - this.statusText = ""; - this.bytesRead = 0; - this.contentLength = ""; - this.keepAlive = ""; - this.connection = ""; - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - if (statusCode < 200) { - return; - } - if (request.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { - util.destroy(socket, new ResponseContentLengthMismatchError); - return -1; - } - request.onComplete(headers); - client[kQueue][client[kRunningIdx]++] = null; - if (socket[kWriting]) { - assert.strictEqual(client[kRunning], 0); - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (!shouldKeepAlive) { - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (socket[kReset] && client[kRunning] === 0) { - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (client[kPipelining] === 1) { - setImmediate(resume, client); - } else { - resume(client); - } - } - } - function onParserTimeout(parser) { - const { socket, timeoutType, client } = parser; - if (timeoutType === TIMEOUT_HEADERS) { - if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { - assert(!parser.paused, "cannot be paused while waiting for headers"); - util.destroy(socket, new HeadersTimeoutError); - } - } else if (timeoutType === TIMEOUT_BODY) { - if (!parser.paused) { - util.destroy(socket, new BodyTimeoutError); - } - } else if (timeoutType === TIMEOUT_IDLE) { - assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); - util.destroy(socket, new InformationalError("socket idle timeout")); - } - } - function onSocketReadable() { - const { [kParser]: parser } = this; - if (parser) { - parser.readMore(); - } - } - function onSocketError(err) { - const { [kClient]: client, [kParser]: parser } = this; - assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - if (client[kHTTPConnVersion] !== "h2") { - if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; - } - } - this[kError] = err; - onError(this[kClient], err); - } - function onError(client, err) { - if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { - assert(client[kPendingIdx] === client[kRunningIdx]); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0;i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); - } - assert(client[kSize] === 0); - } - } - function onSocketEnd() { - const { [kParser]: parser, [kClient]: client } = this; - if (client[kHTTPConnVersion] !== "h2") { - if (parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; - } - } - util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); - } - function onSocketClose() { - const { [kClient]: client, [kParser]: parser } = this; - if (client[kHTTPConnVersion] === "h1" && parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - } - this[kParser].destroy(); - this[kParser] = null; - } - const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); - client[kSocket] = null; - if (client.destroyed) { - assert(client[kPending] === 0); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0;i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); - } - } else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") { - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - errorRequest(client, request, err); - } - client[kPendingIdx] = client[kRunningIdx]; - assert(client[kRunning] === 0); - client.emit("disconnect", client[kUrl], [client], err); - resume(client); - } - async function connect(client) { - assert(!client[kConnecting]); - assert(!client[kSocket]); - let { host, hostname, protocol, port } = client[kUrl]; - if (hostname[0] === "[") { - const idx = hostname.indexOf("]"); - assert(idx !== -1); - const ip = hostname.substring(1, idx); - assert(net.isIP(ip)); - hostname = ip; - } - client[kConnecting] = true; - if (channels.beforeConnect.hasSubscribers) { - channels.beforeConnect.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector] - }); - } - try { - const socket = await new Promise((resolve, reject) => { - client[kConnector]({ - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, (err, socket2) => { - if (err) { - reject(err); - } else { - resolve(socket2); - } - }); - }); - if (client.destroyed) { - util.destroy(socket.on("error", () => { - }), new ClientDestroyedError); - return; - } - client[kConnecting] = false; - assert(socket); - const isH2 = socket.alpnProtocol === "h2"; - if (isH2) { - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true; - process.emitWarning("H2 support is experimental, expect them to change at any time.", { - code: "UNDICI-H2" - }); - } - const session = http2.connect(client[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams - }); - client[kHTTPConnVersion] = "h2"; - session[kClient] = client; - session[kSocket] = socket; - session.on("error", onHttp2SessionError); - session.on("frameError", onHttp2FrameError); - session.on("end", onHttp2SessionEnd); - session.on("goaway", onHTTP2GoAway); - session.on("close", onSocketClose); - session.unref(); - client[kHTTP2Session] = session; - socket[kHTTP2Session] = session; - } else { - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise; - llhttpPromise = null; - } - socket[kNoRef] = false; - socket[kWriting] = false; - socket[kReset] = false; - socket[kBlocking] = false; - socket[kParser] = new Parser(client, socket, llhttpInstance); - } - socket[kCounter] = 0; - socket[kMaxRequests] = client[kMaxRequests]; - socket[kClient] = client; - socket[kError] = null; - socket.on("error", onSocketError).on("readable", onSocketReadable).on("end", onSocketEnd).on("close", onSocketClose); - client[kSocket] = socket; - if (channels.connected.hasSubscribers) { - channels.connected.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - socket - }); - } - client.emit("connect", client[kUrl], [client]); - } catch (err) { - if (client.destroyed) { - return; - } - client[kConnecting] = false; - if (channels.connectError.hasSubscribers) { - channels.connectError.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - error: err - }); - } - if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { - assert(client[kRunning] === 0); - while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { - const request = client[kQueue][client[kPendingIdx]++]; - errorRequest(client, request, err); - } - } else { - onError(client, err); - } - client.emit("connectionError", client[kUrl], [client], err); - } - resume(client); - } - function emitDrain(client) { - client[kNeedDrain] = 0; - client.emit("drain", client[kUrl], [client]); - } - function resume(client, sync) { - if (client[kResuming] === 2) { - return; - } - client[kResuming] = 2; - _resume(client, sync); - client[kResuming] = 0; - if (client[kRunningIdx] > 256) { - client[kQueue].splice(0, client[kRunningIdx]); - client[kPendingIdx] -= client[kRunningIdx]; - client[kRunningIdx] = 0; - } - } - function _resume(client, sync) { - while (true) { - if (client.destroyed) { - assert(client[kPending] === 0); - return; - } - if (client[kClosedResolve] && !client[kSize]) { - client[kClosedResolve](); - client[kClosedResolve] = null; - return; - } - const socket = client[kSocket]; - if (socket && !socket.destroyed && socket.alpnProtocol !== "h2") { - if (client[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref(); - socket[kNoRef] = true; - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref(); - socket[kNoRef] = false; - } - if (client[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { - socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE); - } - } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request2 = client[kQueue][client[kRunningIdx]]; - const headersTimeout = request2.headersTimeout != null ? request2.headersTimeout : client[kHeadersTimeout]; - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); - } - } - } - if (client[kBusy]) { - client[kNeedDrain] = 2; - } else if (client[kNeedDrain] === 2) { - if (sync) { - client[kNeedDrain] = 1; - process.nextTick(emitDrain, client); - } else { - emitDrain(client); - } - continue; - } - if (client[kPending] === 0) { - return; - } - if (client[kRunning] >= (client[kPipelining] || 1)) { - return; - } - const request = client[kQueue][client[kPendingIdx]]; - if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) { - if (client[kRunning] > 0) { - return; - } - client[kServerName] = request.servername; - if (socket && socket.servername !== request.servername) { - util.destroy(socket, new InformationalError("servername changed")); - return; - } - } - if (client[kConnecting]) { - return; - } - if (!socket && !client[kHTTP2Session]) { - connect(client); - return; - } - if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { - return; - } - if (client[kRunning] > 0 && !request.idempotent) { - return; - } - if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) { - return; - } - if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body))) { - return; - } - if (!request.aborted && write(client, request)) { - client[kPendingIdx]++; - } else { - client[kQueue].splice(client[kPendingIdx], 1); - } - } - } - function shouldSendContentLength(method) { - return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; - } - function write(client, request) { - if (client[kHTTPConnVersion] === "h2") { - writeH2(client, client[kHTTP2Session], request); - return; - } - const { body, method, path, host, upgrade, headers, blocking, reset } = request; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; - if (body && typeof body.read === "function") { - body.read(0); - } - const bodyLength = util.bodyLength(body); - let contentLength = bodyLength; - if (contentLength === null) { - contentLength = request.contentLength; - } - if (contentLength === 0 && !expectsPayload) { - contentLength = null; - } - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError); - return false; - } - process.emitWarning(new RequestContentLengthMismatchError); - } - const socket = client[kSocket]; - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return; - } - errorRequest(client, request, err || new RequestAbortedError); - util.destroy(socket, new InformationalError("aborted")); - }); - } catch (err) { - errorRequest(client, request, err); - } - if (request.aborted) { - return false; - } - if (method === "HEAD") { - socket[kReset] = true; - } - if (upgrade || method === "CONNECT") { - socket[kReset] = true; - } - if (reset != null) { - socket[kReset] = reset; - } - if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { - socket[kReset] = true; - } - if (blocking) { - socket[kBlocking] = true; - } - let header = `${method} ${path} HTTP/1.1\r\n`; - if (typeof host === "string") { - header += `host: ${host}\r\n`; - } else { - header += client[kHostHeader]; - } - if (upgrade) { - header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n`; - } else if (client[kPipelining] && !socket[kReset]) { - header += "connection: keep-alive\r\n"; - } else { - header += "connection: close\r\n"; - } - if (headers) { - header += headers; - } - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request, headers: header, socket }); - } - if (!body || bodyLength === 0) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r\n\r\n`, "latin1"); - } else { - assert(contentLength === null, "no body must not have content length"); - socket.write(`${header}\r\n`, "latin1"); - } - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, "buffer body must have content length"); - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, "latin1"); - socket.write(body); - socket.uncork(); - request.onBodySent(body); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - } else if (util.isBlobLike(body)) { - if (typeof body.stream === "function") { - writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }); - } else { - writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }); - } - } else if (util.isStream(body)) { - writeStream({ body, client, request, socket, contentLength, header, expectsPayload }); - } else if (util.isIterable(body)) { - writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }); - } else { - assert(false); - } - return true; - } - function writeH2(client, session, request) { - const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; - let headers; - if (typeof reqHeaders === "string") - headers = Request[kHTTP2CopyHeaders](reqHeaders.trim()); - else - headers = reqHeaders; - if (upgrade) { - errorRequest(client, request, new Error("Upgrade not supported for H2")); - return false; - } - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return; - } - errorRequest(client, request, err || new RequestAbortedError); - }); - } catch (err) { - errorRequest(client, request, err); - } - if (request.aborted) { - return false; - } - let stream; - const h2State = client[kHTTP2SessionState]; - headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost]; - headers[HTTP2_HEADER_METHOD] = method; - if (method === "CONNECT") { - session.ref(); - stream = session.request(headers, { endStream: false, signal }); - if (stream.id && !stream.pending) { - request.onUpgrade(null, null, stream); - ++h2State.openStreams; - } else { - stream.once("ready", () => { - request.onUpgrade(null, null, stream); - ++h2State.openStreams; - }); - } - stream.once("close", () => { - h2State.openStreams -= 1; - if (h2State.openStreams === 0) - session.unref(); - }); - return true; - } - headers[HTTP2_HEADER_PATH] = path; - headers[HTTP2_HEADER_SCHEME] = "https"; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; - if (body && typeof body.read === "function") { - body.read(0); - } - let contentLength = util.bodyLength(body); - if (contentLength == null) { - contentLength = request.contentLength; - } - if (contentLength === 0 || !expectsPayload) { - contentLength = null; - } - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError); - return false; - } - process.emitWarning(new RequestContentLengthMismatchError); - } - if (contentLength != null) { - assert(body, "no body must not have content length"); - headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; - } - session.ref(); - const shouldEndStream = method === "GET" || method === "HEAD"; - if (expectContinue) { - headers[HTTP2_HEADER_EXPECT] = "100-continue"; - stream = session.request(headers, { endStream: shouldEndStream, signal }); - stream.once("continue", writeBodyH2); - } else { - stream = session.request(headers, { - endStream: shouldEndStream, - signal - }); - writeBodyH2(); - } - ++h2State.openStreams; - stream.once("response", (headers2) => { - const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; - if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), "") === false) { - stream.pause(); - } - }); - stream.once("end", () => { - request.onComplete([]); - }); - stream.on("data", (chunk) => { - if (request.onData(chunk) === false) { - stream.pause(); - } - }); - stream.once("close", () => { - h2State.openStreams -= 1; - if (h2State.openStreams === 0) { - session.unref(); - } - }); - stream.once("error", function(err) { - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); - } - }); - stream.once("frameError", (type, code) => { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - errorRequest(client, request, err); - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); - } - }); - return true; - function writeBodyH2() { - if (!body) { - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, "buffer body must have content length"); - stream.cork(); - stream.write(body); - stream.uncork(); - stream.end(); - request.onBodySent(body); - request.onRequestSent(); - } else if (util.isBlobLike(body)) { - if (typeof body.stream === "function") { - writeIterable({ - client, - request, - contentLength, - h2stream: stream, - expectsPayload, - body: body.stream(), - socket: client[kSocket], - header: "" - }); - } else { - writeBlob({ - body, - client, - request, - contentLength, - expectsPayload, - h2stream: stream, - header: "", - socket: client[kSocket] - }); - } - } else if (util.isStream(body)) { - writeStream({ - body, - client, - request, - contentLength, - expectsPayload, - socket: client[kSocket], - h2stream: stream, - header: "" - }); - } else if (util.isIterable(body)) { - writeIterable({ - body, - client, - request, - contentLength, - expectsPayload, - header: "", - h2stream: stream, - socket: client[kSocket] - }); - } else { - assert(false); - } - } - } - function writeStream({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); - if (client[kHTTPConnVersion] === "h2") { - let onPipeData = function(chunk) { - request.onBodySent(chunk); - }; - const pipe = pipeline(body, h2stream, (err) => { - if (err) { - util.destroy(body, err); - util.destroy(h2stream, err); - } else { - request.onRequestSent(); - } - }); - pipe.on("data", onPipeData); - pipe.once("end", () => { - pipe.removeListener("data", onPipeData); - util.destroy(pipe); - }); - return; - } - let finished = false; - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); - const onData = function(chunk) { - if (finished) { - return; - } - try { - if (!writer.write(chunk) && this.pause) { - this.pause(); - } - } catch (err) { - util.destroy(this, err); - } - }; - const onDrain = function() { - if (finished) { - return; - } - if (body.resume) { - body.resume(); - } - }; - const onAbort = function() { - if (finished) { - return; - } - const err = new RequestAbortedError; - queueMicrotask(() => onFinished(err)); - }; - const onFinished = function(err) { - if (finished) { - return; - } - finished = true; - assert(socket.destroyed || socket[kWriting] && client[kRunning] <= 1); - socket.off("drain", onDrain).off("error", onFinished); - body.removeListener("data", onData).removeListener("end", onFinished).removeListener("error", onFinished).removeListener("close", onAbort); - if (!err) { - try { - writer.end(); - } catch (er) { - err = er; - } - } - writer.destroy(err); - if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { - util.destroy(body, err); - } else { - util.destroy(body); - } - }; - body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onAbort); - if (body.resume) { - body.resume(); - } - socket.on("drain", onDrain).on("error", onFinished); - } - async function writeBlob({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength === body.size, "blob body must have content length"); - const isH2 = client[kHTTPConnVersion] === "h2"; - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError; - } - const buffer = Buffer.from(await body.arrayBuffer()); - if (isH2) { - h2stream.cork(); - h2stream.write(buffer); - h2stream.uncork(); - } else { - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, "latin1"); - socket.write(buffer); - socket.uncork(); - } - request.onBodySent(buffer); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - resume(client); - } catch (err) { - util.destroy(isH2 ? h2stream : socket, err); - } - } - async function writeIterable({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); - let callback = null; - function onDrain() { - if (callback) { - const cb = callback; - callback = null; - cb(); - } - } - const waitForDrain = () => new Promise((resolve, reject) => { - assert(callback === null); - if (socket[kError]) { - reject(socket[kError]); - } else { - callback = resolve; - } - }); - if (client[kHTTPConnVersion] === "h2") { - h2stream.on("close", onDrain).on("drain", onDrain); - try { - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError]; - } - const res = h2stream.write(chunk); - request.onBodySent(chunk); - if (!res) { - await waitForDrain(); - } - } - } catch (err) { - h2stream.destroy(err); - } finally { - request.onRequestSent(); - h2stream.end(); - h2stream.off("close", onDrain).off("drain", onDrain); - } - return; - } - socket.on("close", onDrain).on("drain", onDrain); - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); - try { - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError]; - } - if (!writer.write(chunk)) { - await waitForDrain(); - } - } - writer.end(); - } catch (err) { - writer.destroy(err); - } finally { - socket.off("close", onDrain).off("drain", onDrain); - } - } - - class AsyncWriter { - constructor({ socket, request, contentLength, client, expectsPayload, header }) { - this.socket = socket; - this.request = request; - this.contentLength = contentLength; - this.client = client; - this.bytesWritten = 0; - this.expectsPayload = expectsPayload; - this.header = header; - socket[kWriting] = true; - } - write(chunk) { - const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; - if (socket[kError]) { - throw socket[kError]; - } - if (socket.destroyed) { - return false; - } - const len = Buffer.byteLength(chunk); - if (!len) { - return true; - } - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError; - } - process.emitWarning(new RequestContentLengthMismatchError); - } - socket.cork(); - if (bytesWritten === 0) { - if (!expectsPayload) { - socket[kReset] = true; - } - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r\n`, "latin1"); - } else { - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, "latin1"); - } - } - if (contentLength === null) { - socket.write(`\r\n${len.toString(16)}\r\n`, "latin1"); - } - this.bytesWritten += len; - const ret = socket.write(chunk); - socket.uncork(); - request.onBodySent(chunk); - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } - } - } - return ret; - } - end() { - const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; - request.onRequestSent(); - socket[kWriting] = false; - if (socket[kError]) { - throw socket[kError]; - } - if (socket.destroyed) { - return; - } - if (bytesWritten === 0) { - if (expectsPayload) { - socket.write(`${header}content-length: 0\r\n\r\n`, "latin1"); - } else { - socket.write(`${header}\r\n`, "latin1"); - } - } else if (contentLength === null) { - socket.write("\r\n0\r\n\r\n", "latin1"); - } - if (contentLength !== null && bytesWritten !== contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError; - } else { - process.emitWarning(new RequestContentLengthMismatchError); - } - } - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } - } - resume(client); - } - destroy(err) { - const { socket, client } = this; - socket[kWriting] = false; - if (err) { - assert(client[kRunning] <= 1, "pipeline should only contain this request"); - util.destroy(socket, err); - } - } - } - function errorRequest(client, request, err) { - try { - request.onError(err); - assert(request.aborted); - } catch (err2) { - client.emit("error", err2); - } - } - module.exports = Client; -}); - -// ../node_modules/undici/lib/node/fixed-queue.js -var require_fixed_queue = __commonJS((exports, module) => { - var kSize = 2048; - var kMask = kSize - 1; - - class FixedCircularBuffer { - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; - } - isEmpty() { - return this.top === this.bottom; - } - isFull() { - return (this.top + 1 & kMask) === this.bottom; - } - push(data) { - this.list[this.top] = data; - this.top = this.top + 1 & kMask; - } - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === undefined) - return null; - this.list[this.bottom] = undefined; - this.bottom = this.bottom + 1 & kMask; - return nextItem; - } - } - module.exports = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer; - } - isEmpty() { - return this.head.isEmpty(); - } - push(data) { - if (this.head.isFull()) { - this.head = this.head.next = new FixedCircularBuffer; - } - this.head.push(data); - } - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - this.tail = tail.next; - } - return next; - } - }; -}); - -// ../node_modules/undici/lib/pool-stats.js -var require_pool_stats = __commonJS((exports, module) => { - var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); - var kPool = Symbol("pool"); - - class PoolStats { - constructor(pool) { - this[kPool] = pool; - } - get connected() { - return this[kPool][kConnected]; - } - get free() { - return this[kPool][kFree]; - } - get pending() { - return this[kPool][kPending]; - } - get queued() { - return this[kPool][kQueued]; - } - get running() { - return this[kPool][kRunning]; - } - get size() { - return this[kPool][kSize]; - } - } - module.exports = PoolStats; -}); - -// ../node_modules/undici/lib/pool-base.js -var require_pool_base = __commonJS((exports, module) => { - var DispatcherBase = require_dispatcher_base(); - var FixedQueue = require_fixed_queue(); - var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); - var PoolStats = require_pool_stats(); - var kClients = Symbol("clients"); - var kNeedDrain = Symbol("needDrain"); - var kQueue = Symbol("queue"); - var kClosedResolve = Symbol("closed resolve"); - var kOnDrain = Symbol("onDrain"); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kGetDispatcher = Symbol("get dispatcher"); - var kAddClient = Symbol("add client"); - var kRemoveClient = Symbol("remove client"); - var kStats = Symbol("stats"); - - class PoolBase extends DispatcherBase { - constructor() { - super(); - this[kQueue] = new FixedQueue; - this[kClients] = []; - this[kQueued] = 0; - const pool = this; - this[kOnDrain] = function onDrain(origin, targets) { - const queue = pool[kQueue]; - let needDrain = false; - while (!needDrain) { - const item = queue.shift(); - if (!item) { - break; - } - pool[kQueued]--; - needDrain = !this.dispatch(item.opts, item.handler); - } - this[kNeedDrain] = needDrain; - if (!this[kNeedDrain] && pool[kNeedDrain]) { - pool[kNeedDrain] = false; - pool.emit("drain", origin, [pool, ...targets]); - } - if (pool[kClosedResolve] && queue.isEmpty()) { - Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]); - } - }; - this[kOnConnect] = (origin, targets) => { - pool.emit("connect", origin, [pool, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - pool.emit("disconnect", origin, [pool, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - pool.emit("connectionError", origin, [pool, ...targets], err); - }; - this[kStats] = new PoolStats(this); - } - get [kBusy]() { - return this[kNeedDrain]; - } - get [kConnected]() { - return this[kClients].filter((client) => client[kConnected]).length; - } - get [kFree]() { - return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length; - } - get [kPending]() { - let ret = this[kQueued]; - for (const { [kPending]: pending } of this[kClients]) { - ret += pending; - } - return ret; - } - get [kRunning]() { - let ret = 0; - for (const { [kRunning]: running } of this[kClients]) { - ret += running; - } - return ret; - } - get [kSize]() { - let ret = this[kQueued]; - for (const { [kSize]: size } of this[kClients]) { - ret += size; - } - return ret; - } - get stats() { - return this[kStats]; - } - async[kClose]() { - if (this[kQueue].isEmpty()) { - return Promise.all(this[kClients].map((c) => c.close())); - } else { - return new Promise((resolve) => { - this[kClosedResolve] = resolve; - }); - } - } - async[kDestroy](err) { - while (true) { - const item = this[kQueue].shift(); - if (!item) { - break; - } - item.handler.onError(err); - } - return Promise.all(this[kClients].map((c) => c.destroy(err))); - } - [kDispatch](opts, handler) { - const dispatcher = this[kGetDispatcher](); - if (!dispatcher) { - this[kNeedDrain] = true; - this[kQueue].push({ opts, handler }); - this[kQueued]++; - } else if (!dispatcher.dispatch(opts, handler)) { - dispatcher[kNeedDrain] = true; - this[kNeedDrain] = !this[kGetDispatcher](); - } - return !this[kNeedDrain]; - } - [kAddClient](client) { - client.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].push(client); - if (this[kNeedDrain]) { - process.nextTick(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client[kUrl], [this, client]); - } - }); - } - return this; - } - [kRemoveClient](client) { - client.close(() => { - const idx = this[kClients].indexOf(client); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - }); - this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); - } - } - module.exports = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - }; -}); - -// ../node_modules/undici/lib/pool.js -var require_pool = __commonJS((exports, module) => { - var { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kGetDispatcher - } = require_pool_base(); - var Client = require_client(); - var { - InvalidArgumentError - } = require_errors(); - var util = require_util(); - var { kUrl, kInterceptors } = require_symbols(); - var buildConnector = require_connect(); - var kOptions = Symbol("options"); - var kConnections = Symbol("connections"); - var kFactory = Symbol("factory"); - function defaultFactory(origin, opts) { - return new Client(origin, opts); - } - - class Pool extends PoolBase { - constructor(origin, { - connections, - factory = defaultFactory, - connect, - connectTimeout, - tls, - maxCachedSessions, - socketPath, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - allowH2, - ...options - } = {}) { - super(); - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { - throw new InvalidArgumentError("invalid connections"); - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - if (connect != null && typeof connect !== "function" && typeof connect !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (typeof connect !== "function") { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined, - ...connect - }); - } - this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool) ? options.interceptors.Pool : []; - this[kConnections] = connections || null; - this[kUrl] = util.parseOrigin(origin); - this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; - this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : undefined; - this[kFactory] = factory; - } - [kGetDispatcher]() { - let dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain]); - if (dispatcher) { - return dispatcher; - } - if (!this[kConnections] || this[kClients].length < this[kConnections]) { - dispatcher = this[kFactory](this[kUrl], this[kOptions]); - this[kAddClient](dispatcher); - } - return dispatcher; - } - } - module.exports = Pool; -}); - -// ../node_modules/undici/lib/balanced-pool.js -var require_balanced_pool = __commonJS((exports, module) => { - var { - BalancedPoolMissingUpstreamError, - InvalidArgumentError - } = require_errors(); - var { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - } = require_pool_base(); - var Pool = require_pool(); - var { kUrl, kInterceptors } = require_symbols(); - var { parseOrigin } = require_util(); - var kFactory = Symbol("factory"); - var kOptions = Symbol("options"); - var kGreatestCommonDivisor = Symbol("kGreatestCommonDivisor"); - var kCurrentWeight = Symbol("kCurrentWeight"); - var kIndex = Symbol("kIndex"); - var kWeight = Symbol("kWeight"); - var kMaxWeightPerServer = Symbol("kMaxWeightPerServer"); - var kErrorPenalty = Symbol("kErrorPenalty"); - function getGreatestCommonDivisor(a, b) { - if (b === 0) - return a; - return getGreatestCommonDivisor(b, a % b); - } - function defaultFactory(origin, opts) { - return new Pool(origin, opts); - } - - class BalancedPool extends PoolBase { - constructor(upstreams = [], { factory = defaultFactory, ...opts } = {}) { - super(); - this[kOptions] = opts; - this[kIndex] = -1; - this[kCurrentWeight] = 0; - this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; - this[kErrorPenalty] = this[kOptions].errorPenalty || 15; - if (!Array.isArray(upstreams)) { - upstreams = [upstreams]; - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) ? opts.interceptors.BalancedPool : []; - this[kFactory] = factory; - for (const upstream of upstreams) { - this.addUpstream(upstream); - } - this._updateBalancedPoolStats(); - } - addUpstream(upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; - if (this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true)) { - return this; - } - const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); - this[kAddClient](pool); - pool.on("connect", () => { - pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); - }); - pool.on("connectionError", () => { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); - }); - pool.on("disconnect", (...args) => { - const err = args[2]; - if (err && err.code === "UND_ERR_SOCKET") { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); - } - }); - for (const client of this[kClients]) { - client[kWeight] = this[kMaxWeightPerServer]; - } - this._updateBalancedPoolStats(); - return this; - } - _updateBalancedPoolStats() { - this[kGreatestCommonDivisor] = this[kClients].map((p) => p[kWeight]).reduce(getGreatestCommonDivisor, 0); - } - removeUpstream(upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; - const pool = this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true); - if (pool) { - this[kRemoveClient](pool); - } - return this; - } - get upstreams() { - return this[kClients].filter((dispatcher) => dispatcher.closed !== true && dispatcher.destroyed !== true).map((p) => p[kUrl].origin); - } - [kGetDispatcher]() { - if (this[kClients].length === 0) { - throw new BalancedPoolMissingUpstreamError; - } - const dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain] && dispatcher2.closed !== true && dispatcher2.destroyed !== true); - if (!dispatcher) { - return; - } - const allClientsBusy = this[kClients].map((pool) => pool[kNeedDrain]).reduce((a, b) => a && b, true); - if (allClientsBusy) { - return; - } - let counter = 0; - let maxWeightIndex = this[kClients].findIndex((pool) => !pool[kNeedDrain]); - while (counter++ < this[kClients].length) { - this[kIndex] = (this[kIndex] + 1) % this[kClients].length; - const pool = this[kClients][this[kIndex]]; - if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { - maxWeightIndex = this[kIndex]; - } - if (this[kIndex] === 0) { - this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; - if (this[kCurrentWeight] <= 0) { - this[kCurrentWeight] = this[kMaxWeightPerServer]; - } - } - if (pool[kWeight] >= this[kCurrentWeight] && !pool[kNeedDrain]) { - return pool; - } - } - this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; - this[kIndex] = maxWeightIndex; - return this[kClients][maxWeightIndex]; - } - } - module.exports = BalancedPool; -}); - -// ../node_modules/undici/lib/compat/dispatcher-weakref.js -var require_dispatcher_weakref = __commonJS((exports, module) => { - var { kConnected, kSize } = require_symbols(); - - class CompatWeakRef { - constructor(value) { - this.value = value; - } - deref() { - return this.value[kConnected] === 0 && this.value[kSize] === 0 ? undefined : this.value; - } - } - - class CompatFinalizer { - constructor(finalizer) { - this.finalizer = finalizer; - } - register(dispatcher, key) { - if (dispatcher.on) { - dispatcher.on("disconnect", () => { - if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { - this.finalizer(key); - } - }); - } - } - } - module.exports = function() { - if (process.env.NODE_V8_COVERAGE) { - return { - WeakRef: CompatWeakRef, - FinalizationRegistry: CompatFinalizer - }; - } - return { - WeakRef: global.WeakRef || CompatWeakRef, - FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer - }; - }; -}); - -// ../node_modules/undici/lib/agent.js -var require_agent = __commonJS((exports, module) => { - var { InvalidArgumentError } = require_errors(); - var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); - var DispatcherBase = require_dispatcher_base(); - var Pool = require_pool(); - var Client = require_client(); - var util = require_util(); - var createRedirectInterceptor = require_redirectInterceptor(); - var { WeakRef: WeakRef2, FinalizationRegistry } = require_dispatcher_weakref()(); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kMaxRedirections = Symbol("maxRedirections"); - var kOnDrain = Symbol("onDrain"); - var kFactory = Symbol("factory"); - var kFinalizer = Symbol("finalizer"); - var kOptions = Symbol("options"); - function defaultFactory(origin, opts) { - return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); - } - - class Agent extends DispatcherBase { - constructor({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { - super(); - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - if (connect != null && typeof connect !== "function" && typeof connect !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } - if (connect && typeof connect !== "function") { - connect = { ...connect }; - } - this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })]; - this[kOptions] = { ...util.deepClone(options), connect }; - this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : undefined; - this[kMaxRedirections] = maxRedirections; - this[kFactory] = factory; - this[kClients] = new Map; - this[kFinalizer] = new FinalizationRegistry((key) => { - const ref = this[kClients].get(key); - if (ref !== undefined && ref.deref() === undefined) { - this[kClients].delete(key); - } - }); - const agent = this; - this[kOnDrain] = (origin, targets) => { - agent.emit("drain", origin, [agent, ...targets]); - }; - this[kOnConnect] = (origin, targets) => { - agent.emit("connect", origin, [agent, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - agent.emit("disconnect", origin, [agent, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - agent.emit("connectionError", origin, [agent, ...targets], err); - }; - } - get [kRunning]() { - let ret = 0; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - if (client) { - ret += client[kRunning]; - } - } - return ret; - } - [kDispatch](opts, handler) { - let key; - if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { - key = String(opts.origin); - } else { - throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); - } - const ref = this[kClients].get(key); - let dispatcher = ref ? ref.deref() : null; - if (!dispatcher) { - dispatcher = this[kFactory](opts.origin, this[kOptions]).on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].set(key, new WeakRef2(dispatcher)); - this[kFinalizer].register(dispatcher, key); - } - return dispatcher.dispatch(opts, handler); - } - async[kClose]() { - const closePromises = []; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - if (client) { - closePromises.push(client.close()); - } - } - await Promise.all(closePromises); - } - async[kDestroy](err) { - const destroyPromises = []; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - if (client) { - destroyPromises.push(client.destroy(err)); - } - } - await Promise.all(destroyPromises); - } - } - module.exports = Agent; -}); - -// ../node_modules/undici/lib/api/readable.js -var require_readable = __commonJS((exports, module) => { - var assert = __require("assert"); - var { Readable } = __require("stream"); - var { RequestAbortedError, NotSupportedError, InvalidArgumentError } = require_errors(); - var util = require_util(); - var { ReadableStreamFrom, toUSVString } = require_util(); - var Blob2; - var kConsume = Symbol("kConsume"); - var kReading = Symbol("kReading"); - var kBody = Symbol("kBody"); - var kAbort = Symbol("abort"); - var kContentType = Symbol("kContentType"); - var noop = () => { - }; - module.exports = class BodyReadable extends Readable { - constructor({ - resume, - abort, - contentType = "", - highWaterMark = 64 * 1024 - }) { - super({ - autoDestroy: true, - read: resume, - highWaterMark - }); - this._readableState.dataEmitted = false; - this[kAbort] = abort; - this[kConsume] = null; - this[kBody] = null; - this[kContentType] = contentType; - this[kReading] = false; - } - destroy(err) { - if (this.destroyed) { - return this; - } - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError; - } - if (err) { - this[kAbort](); - } - return super.destroy(err); - } - emit(ev, ...args) { - if (ev === "data") { - this._readableState.dataEmitted = true; - } else if (ev === "error") { - this._readableState.errorEmitted = true; - } - return super.emit(ev, ...args); - } - on(ev, ...args) { - if (ev === "data" || ev === "readable") { - this[kReading] = true; - } - return super.on(ev, ...args); - } - addListener(ev, ...args) { - return this.on(ev, ...args); - } - off(ev, ...args) { - const ret = super.off(ev, ...args); - if (ev === "data" || ev === "readable") { - this[kReading] = this.listenerCount("data") > 0 || this.listenerCount("readable") > 0; - } - return ret; - } - removeListener(ev, ...args) { - return this.off(ev, ...args); - } - push(chunk) { - if (this[kConsume] && chunk !== null && this.readableLength === 0) { - consumePush(this[kConsume], chunk); - return this[kReading] ? super.push(chunk) : true; - } - return super.push(chunk); - } - async text() { - return consume(this, "text"); - } - async json() { - return consume(this, "json"); - } - async blob() { - return consume(this, "blob"); - } - async arrayBuffer() { - return consume(this, "arrayBuffer"); - } - async formData() { - throw new NotSupportedError; - } - get bodyUsed() { - return util.isDisturbed(this); - } - get body() { - if (!this[kBody]) { - this[kBody] = ReadableStreamFrom(this); - if (this[kConsume]) { - this[kBody].getReader(); - assert(this[kBody].locked); - } - } - return this[kBody]; - } - dump(opts) { - let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144; - const signal = opts && opts.signal; - if (signal) { - try { - if (typeof signal !== "object" || !("aborted" in signal)) { - throw new InvalidArgumentError("signal must be an AbortSignal"); - } - util.throwIfAborted(signal); - } catch (err) { - return Promise.reject(err); - } - } - if (this.closed) { - return Promise.resolve(null); - } - return new Promise((resolve, reject) => { - const signalListenerCleanup = signal ? util.addAbortListener(signal, () => { - this.destroy(); - }) : noop; - this.on("close", function() { - signalListenerCleanup(); - if (signal && signal.aborted) { - reject(signal.reason || Object.assign(new Error("The operation was aborted"), { name: "AbortError" })); - } else { - resolve(null); - } - }).on("error", noop).on("data", function(chunk) { - limit -= chunk.length; - if (limit <= 0) { - this.destroy(); - } - }).resume(); - }); - } - }; - function isLocked(self) { - return self[kBody] && self[kBody].locked === true || self[kConsume]; - } - function isUnusable(self) { - return util.isDisturbed(self) || isLocked(self); - } - async function consume(stream, type) { - if (isUnusable(stream)) { - throw new TypeError("unusable"); - } - assert(!stream[kConsume]); - return new Promise((resolve, reject) => { - stream[kConsume] = { - type, - stream, - resolve, - reject, - length: 0, - body: [] - }; - stream.on("error", function(err) { - consumeFinish(this[kConsume], err); - }).on("close", function() { - if (this[kConsume].body !== null) { - consumeFinish(this[kConsume], new RequestAbortedError); - } - }); - process.nextTick(consumeStart, stream[kConsume]); - }); - } - function consumeStart(consume2) { - if (consume2.body === null) { - return; - } - const { _readableState: state } = consume2.stream; - for (const chunk of state.buffer) { - consumePush(consume2, chunk); - } - if (state.endEmitted) { - consumeEnd(this[kConsume]); - } else { - consume2.stream.on("end", function() { - consumeEnd(this[kConsume]); - }); - } - consume2.stream.resume(); - while (consume2.stream.read() != null) { - } - } - function consumeEnd(consume2) { - const { type, body, resolve, stream, length } = consume2; - try { - if (type === "text") { - resolve(toUSVString(Buffer.concat(body))); - } else if (type === "json") { - resolve(JSON.parse(Buffer.concat(body))); - } else if (type === "arrayBuffer") { - const dst = new Uint8Array(length); - let pos = 0; - for (const buf of body) { - dst.set(buf, pos); - pos += buf.byteLength; - } - resolve(dst.buffer); - } else if (type === "blob") { - if (!Blob2) { - Blob2 = __require("buffer").Blob; - } - resolve(new Blob2(body, { type: stream[kContentType] })); - } - consumeFinish(consume2); - } catch (err) { - stream.destroy(err); - } - } - function consumePush(consume2, chunk) { - consume2.length += chunk.length; - consume2.body.push(chunk); - } - function consumeFinish(consume2, err) { - if (consume2.body === null) { - return; - } - if (err) { - consume2.reject(err); - } else { - consume2.resolve(); - } - consume2.type = null; - consume2.stream = null; - consume2.resolve = null; - consume2.reject = null; - consume2.length = 0; - consume2.body = null; - } -}); - -// ../node_modules/undici/lib/api/util.js -var require_util3 = __commonJS((exports, module) => { - var assert = __require("assert"); - var { - ResponseStatusCodeError - } = require_errors(); - var { toUSVString } = require_util(); - async function getResolveErrorBodyCallback({ callback, body, contentType, statusCode, statusMessage, headers }) { - assert(body); - let chunks = []; - let limit = 0; - for await (const chunk of body) { - chunks.push(chunk); - limit += chunk.length; - if (limit > 128 * 1024) { - chunks = null; - break; - } - } - if (statusCode === 204 || !contentType || !chunks) { - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers)); - return; - } - try { - if (contentType.startsWith("application/json")) { - const payload = JSON.parse(toUSVString(Buffer.concat(chunks))); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers, payload)); - return; - } - if (contentType.startsWith("text/")) { - const payload = toUSVString(Buffer.concat(chunks)); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers, payload)); - return; - } - } catch (err) { - } - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers)); - } - module.exports = { getResolveErrorBodyCallback }; -}); - -// ../node_modules/undici/lib/api/abort-signal.js -var require_abort_signal = __commonJS((exports, module) => { - var { addAbortListener } = require_util(); - var { RequestAbortedError } = require_errors(); - var kListener = Symbol("kListener"); - var kSignal = Symbol("kSignal"); - function abort(self) { - if (self.abort) { - self.abort(); - } else { - self.onError(new RequestAbortedError); - } - } - function addSignal(self, signal) { - self[kSignal] = null; - self[kListener] = null; - if (!signal) { - return; - } - if (signal.aborted) { - abort(self); - return; - } - self[kSignal] = signal; - self[kListener] = () => { - abort(self); - }; - addAbortListener(self[kSignal], self[kListener]); - } - function removeSignal(self) { - if (!self[kSignal]) { - return; - } - if ("removeEventListener" in self[kSignal]) { - self[kSignal].removeEventListener("abort", self[kListener]); - } else { - self[kSignal].removeListener("abort", self[kListener]); - } - self[kSignal] = null; - self[kListener] = null; - } - module.exports = { - addSignal, - removeSignal - }; -}); - -// ../node_modules/undici/lib/api/api-request.js -var require_api_request = __commonJS((exports, module) => { - var Readable = require_readable(); - var { - InvalidArgumentError, - RequestAbortedError - } = require_errors(); - var util = require_util(); - var { getResolveErrorBodyCallback } = require_util3(); - var { AsyncResource } = __require("async_hooks"); - var { addSignal, removeSignal } = require_abort_signal(); - - class RequestHandler extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts; - try { - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (highWaterMark && (typeof highWaterMark !== "number" || highWaterMark < 0)) { - throw new InvalidArgumentError("invalid highWaterMark"); - } - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_REQUEST"); - } catch (err) { - if (util.isStream(body)) { - util.destroy(body.on("error", util.nop), err); - } - throw err; - } - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.callback = callback; - this.res = null; - this.abort = null; - this.body = body; - this.trailers = {}; - this.context = null; - this.onInfo = onInfo || null; - this.throwOnError = throwOnError; - this.highWaterMark = highWaterMark; - if (util.isStream(body)) { - body.on("error", (err) => { - this.onError(err); - }); - } - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError; - } - this.abort = abort; - this.context = context; - } - onHeaders(statusCode, rawHeaders, resume, statusMessage) { - const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this; - const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers }); - } - return; - } - const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; - const contentType = parsedHeaders["content-type"]; - const body = new Readable({ resume, abort, contentType, highWaterMark }); - this.callback = null; - this.res = body; - if (callback !== null) { - if (this.throwOnError && statusCode >= 400) { - this.runInAsyncScope(getResolveErrorBodyCallback, null, { callback, body, contentType, statusCode, statusMessage, headers }); - } else { - this.runInAsyncScope(callback, null, null, { - statusCode, - headers, - trailers: this.trailers, - opaque, - body, - context - }); - } - } - } - onData(chunk) { - const { res } = this; - return res.push(chunk); - } - onComplete(trailers) { - const { res } = this; - removeSignal(this); - util.parseHeaders(trailers, this.trailers); - res.push(null); - } - onError(err) { - const { res, callback, body, opaque } = this; - removeSignal(this); - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - if (res) { - this.res = null; - queueMicrotask(() => { - util.destroy(res, err); - }); - } - if (body) { - this.body = null; - util.destroy(body, err); - } - } - } - function request(opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - request.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - this.dispatch(opts, new RequestHandler(opts, callback)); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module.exports = request; - module.exports.RequestHandler = RequestHandler; -}); - -// ../node_modules/undici/lib/api/api-stream.js -var require_api_stream = __commonJS((exports, module) => { - var { finished, PassThrough } = __require("stream"); - var { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = require_errors(); - var util = require_util(); - var { getResolveErrorBodyCallback } = require_util3(); - var { AsyncResource } = __require("async_hooks"); - var { addSignal, removeSignal } = require_abort_signal(); - - class StreamHandler extends AsyncResource { - constructor(opts, factory, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; - try { - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("invalid factory"); - } - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_STREAM"); - } catch (err) { - if (util.isStream(body)) { - util.destroy(body.on("error", util.nop), err); - } - throw err; - } - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.factory = factory; - this.callback = callback; - this.res = null; - this.abort = null; - this.context = null; - this.trailers = null; - this.body = body; - this.onInfo = onInfo || null; - this.throwOnError = throwOnError || false; - if (util.isStream(body)) { - body.on("error", (err) => { - this.onError(err); - }); - } - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError; - } - this.abort = abort; - this.context = context; - } - onHeaders(statusCode, rawHeaders, resume, statusMessage) { - const { factory, opaque, context, callback, responseHeaders } = this; - const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers }); - } - return; - } - this.factory = null; - let res; - if (this.throwOnError && statusCode >= 400) { - const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; - const contentType = parsedHeaders["content-type"]; - res = new PassThrough; - this.callback = null; - this.runInAsyncScope(getResolveErrorBodyCallback, null, { callback, body: res, contentType, statusCode, statusMessage, headers }); - } else { - if (factory === null) { - return; - } - res = this.runInAsyncScope(factory, null, { - statusCode, - headers, - opaque, - context - }); - if (!res || typeof res.write !== "function" || typeof res.end !== "function" || typeof res.on !== "function") { - throw new InvalidReturnValueError("expected Writable"); - } - finished(res, { readable: false }, (err) => { - const { callback: callback2, res: res2, opaque: opaque2, trailers, abort } = this; - this.res = null; - if (err || !res2.readable) { - util.destroy(res2, err); - } - this.callback = null; - this.runInAsyncScope(callback2, null, err || null, { opaque: opaque2, trailers }); - if (err) { - abort(); - } - }); - } - res.on("drain", resume); - this.res = res; - const needDrain = res.writableNeedDrain !== undefined ? res.writableNeedDrain : res._writableState && res._writableState.needDrain; - return needDrain !== true; - } - onData(chunk) { - const { res } = this; - return res ? res.write(chunk) : true; - } - onComplete(trailers) { - const { res } = this; - removeSignal(this); - if (!res) { - return; - } - this.trailers = util.parseHeaders(trailers); - res.end(); - } - onError(err) { - const { res, callback, opaque, body } = this; - removeSignal(this); - this.factory = null; - if (res) { - this.res = null; - util.destroy(res, err); - } else if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - if (body) { - this.body = null; - util.destroy(body, err); - } - } - } - function stream(opts, factory, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - stream.call(this, opts, factory, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - this.dispatch(opts, new StreamHandler(opts, factory, callback)); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module.exports = stream; -}); - -// ../node_modules/undici/lib/api/api-pipeline.js -var require_api_pipeline = __commonJS((exports, module) => { - var { - Readable, - Duplex, - PassThrough - } = __require("stream"); - var { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = require_errors(); - var util = require_util(); - var { AsyncResource } = __require("async_hooks"); - var { addSignal, removeSignal } = require_abort_signal(); - var assert = __require("assert"); - var kResume = Symbol("resume"); - - class PipelineRequest extends Readable { - constructor() { - super({ autoDestroy: true }); - this[kResume] = null; - } - _read() { - const { [kResume]: resume } = this; - if (resume) { - this[kResume] = null; - resume(); - } - } - _destroy(err, callback) { - this._read(); - callback(err); - } - } - - class PipelineResponse extends Readable { - constructor(resume) { - super({ autoDestroy: true }); - this[kResume] = resume; - } - _read() { - this[kResume](); - } - _destroy(err, callback) { - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError; - } - callback(err); - } - } - - class PipelineHandler extends AsyncResource { - constructor(opts, handler) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (typeof handler !== "function") { - throw new InvalidArgumentError("invalid handler"); - } - const { signal, method, opaque, onInfo, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_PIPELINE"); - this.opaque = opaque || null; - this.responseHeaders = responseHeaders || null; - this.handler = handler; - this.abort = null; - this.context = null; - this.onInfo = onInfo || null; - this.req = new PipelineRequest().on("error", util.nop); - this.ret = new Duplex({ - readableObjectMode: opts.objectMode, - autoDestroy: true, - read: () => { - const { body } = this; - if (body && body.resume) { - body.resume(); - } - }, - write: (chunk, encoding, callback) => { - const { req } = this; - if (req.push(chunk, encoding) || req._readableState.destroyed) { - callback(); - } else { - req[kResume] = callback; - } - }, - destroy: (err, callback) => { - const { body, req, res, ret, abort } = this; - if (!err && !ret._readableState.endEmitted) { - err = new RequestAbortedError; - } - if (abort && err) { - abort(); - } - util.destroy(body, err); - util.destroy(req, err); - util.destroy(res, err); - removeSignal(this); - callback(err); - } - }).on("prefinish", () => { - const { req } = this; - req.push(null); - }); - this.res = null; - addSignal(this, signal); - } - onConnect(abort, context) { - const { ret, res } = this; - assert(!res, "pipeline cannot be retried"); - if (ret.destroyed) { - throw new RequestAbortedError; - } - this.abort = abort; - this.context = context; - } - onHeaders(statusCode, rawHeaders, resume) { - const { opaque, handler, context } = this; - if (statusCode < 200) { - if (this.onInfo) { - const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - this.onInfo({ statusCode, headers }); - } - return; - } - this.res = new PipelineResponse(resume); - let body; - try { - this.handler = null; - const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - body = this.runInAsyncScope(handler, null, { - statusCode, - headers, - opaque, - body: this.res, - context - }); - } catch (err) { - this.res.on("error", util.nop); - throw err; - } - if (!body || typeof body.on !== "function") { - throw new InvalidReturnValueError("expected Readable"); - } - body.on("data", (chunk) => { - const { ret, body: body2 } = this; - if (!ret.push(chunk) && body2.pause) { - body2.pause(); - } - }).on("error", (err) => { - const { ret } = this; - util.destroy(ret, err); - }).on("end", () => { - const { ret } = this; - ret.push(null); - }).on("close", () => { - const { ret } = this; - if (!ret._readableState.ended) { - util.destroy(ret, new RequestAbortedError); - } - }); - this.body = body; - } - onData(chunk) { - const { res } = this; - return res.push(chunk); - } - onComplete(trailers) { - const { res } = this; - res.push(null); - } - onError(err) { - const { ret } = this; - this.handler = null; - util.destroy(ret, err); - } - } - function pipeline(opts, handler) { - try { - const pipelineHandler = new PipelineHandler(opts, handler); - this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); - return pipelineHandler.ret; - } catch (err) { - return new PassThrough().destroy(err); - } - } - module.exports = pipeline; -}); - -// ../node_modules/undici/lib/api/api-upgrade.js -var require_api_upgrade = __commonJS((exports, module) => { - var { InvalidArgumentError, RequestAbortedError, SocketError } = require_errors(); - var { AsyncResource } = __require("async_hooks"); - var util = require_util(); - var { addSignal, removeSignal } = require_abort_signal(); - var assert = __require("assert"); - - class UpgradeHandler extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - const { signal, opaque, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - super("UNDICI_UPGRADE"); - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.callback = callback; - this.abort = null; - this.context = null; - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError; - } - this.abort = abort; - this.context = null; - } - onHeaders() { - throw new SocketError("bad upgrade", null); - } - onUpgrade(statusCode, rawHeaders, socket) { - const { callback, opaque, context } = this; - assert.strictEqual(statusCode, 101); - removeSignal(this); - this.callback = null; - const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - this.runInAsyncScope(callback, null, null, { - headers, - socket, - opaque, - context - }); - } - onError(err) { - const { callback, opaque } = this; - removeSignal(this); - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - } - } - function upgrade(opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - upgrade.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - const upgradeHandler = new UpgradeHandler(opts, callback); - this.dispatch({ - ...opts, - method: opts.method || "GET", - upgrade: opts.protocol || "Websocket" - }, upgradeHandler); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module.exports = upgrade; -}); - -// ../node_modules/undici/lib/api/api-connect.js -var require_api_connect = __commonJS((exports, module) => { - var { AsyncResource } = __require("async_hooks"); - var { InvalidArgumentError, RequestAbortedError, SocketError } = require_errors(); - var util = require_util(); - var { addSignal, removeSignal } = require_abort_signal(); - - class ConnectHandler extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - const { signal, opaque, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - super("UNDICI_CONNECT"); - this.opaque = opaque || null; - this.responseHeaders = responseHeaders || null; - this.callback = callback; - this.abort = null; - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError; - } - this.abort = abort; - this.context = context; - } - onHeaders() { - throw new SocketError("bad connect", null); - } - onUpgrade(statusCode, rawHeaders, socket) { - const { callback, opaque, context } = this; - removeSignal(this); - this.callback = null; - let headers = rawHeaders; - if (headers != null) { - headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - } - this.runInAsyncScope(callback, null, null, { - statusCode, - headers, - socket, - opaque, - context - }); - } - onError(err) { - const { callback, opaque } = this; - removeSignal(this); - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - } - } - function connect(opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - connect.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - const connectHandler = new ConnectHandler(opts, callback); - this.dispatch({ ...opts, method: "CONNECT" }, connectHandler); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module.exports = connect; -}); - -// ../node_modules/undici/lib/api/index.js -var require_api = __commonJS((exports, module) => { - exports.request = require_api_request(); - exports.stream = require_api_stream(); - exports.pipeline = require_api_pipeline(); - exports.upgrade = require_api_upgrade(); - exports.connect = require_api_connect(); -}); - -// ../node_modules/undici/lib/mock/mock-errors.js -var require_mock_errors = __commonJS((exports, module) => { - var { UndiciError } = require_errors(); - - class MockNotMatchedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, MockNotMatchedError); - this.name = "MockNotMatchedError"; - this.message = message || "The request does not match any registered mock dispatches"; - this.code = "UND_MOCK_ERR_MOCK_NOT_MATCHED"; - } - } - module.exports = { - MockNotMatchedError - }; -}); - -// ../node_modules/undici/lib/mock/mock-symbols.js -var require_mock_symbols = __commonJS((exports, module) => { - module.exports = { - kAgent: Symbol("agent"), - kOptions: Symbol("options"), - kFactory: Symbol("factory"), - kDispatches: Symbol("dispatches"), - kDispatchKey: Symbol("dispatch key"), - kDefaultHeaders: Symbol("default headers"), - kDefaultTrailers: Symbol("default trailers"), - kContentLength: Symbol("content length"), - kMockAgent: Symbol("mock agent"), - kMockAgentSet: Symbol("mock agent set"), - kMockAgentGet: Symbol("mock agent get"), - kMockDispatch: Symbol("mock dispatch"), - kClose: Symbol("close"), - kOriginalClose: Symbol("original agent close"), - kOrigin: Symbol("origin"), - kIsMockActive: Symbol("is mock active"), - kNetConnect: Symbol("net connect"), - kGetNetConnect: Symbol("get net connect"), - kConnected: Symbol("connected") - }; -}); - -// ../node_modules/undici/lib/mock/mock-utils.js -var require_mock_utils = __commonJS((exports, module) => { - var { MockNotMatchedError } = require_mock_errors(); - var { - kDispatches, - kMockAgent, - kOriginalDispatch, - kOrigin, - kGetNetConnect - } = require_mock_symbols(); - var { buildURL, nop } = require_util(); - var { STATUS_CODES } = __require("http"); - var { - types: { - isPromise - } - } = __require("util"); - function matchValue(match, value) { - if (typeof match === "string") { - return match === value; - } - if (match instanceof RegExp) { - return match.test(value); - } - if (typeof match === "function") { - return match(value) === true; - } - return false; - } - function lowerCaseEntries(headers) { - return Object.fromEntries(Object.entries(headers).map(([headerName, headerValue]) => { - return [headerName.toLocaleLowerCase(), headerValue]; - })); - } - function getHeaderByName(headers, key) { - if (Array.isArray(headers)) { - for (let i = 0;i < headers.length; i += 2) { - if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { - return headers[i + 1]; - } - } - return; - } else if (typeof headers.get === "function") { - return headers.get(key); - } else { - return lowerCaseEntries(headers)[key.toLocaleLowerCase()]; - } - } - function buildHeadersFromArray(headers) { - const clone = headers.slice(); - const entries = []; - for (let index = 0;index < clone.length; index += 2) { - entries.push([clone[index], clone[index + 1]]); - } - return Object.fromEntries(entries); - } - function matchHeaders(mockDispatch2, headers) { - if (typeof mockDispatch2.headers === "function") { - if (Array.isArray(headers)) { - headers = buildHeadersFromArray(headers); - } - return mockDispatch2.headers(headers ? lowerCaseEntries(headers) : {}); - } - if (typeof mockDispatch2.headers === "undefined") { - return true; - } - if (typeof headers !== "object" || typeof mockDispatch2.headers !== "object") { - return false; - } - for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch2.headers)) { - const headerValue = getHeaderByName(headers, matchHeaderName); - if (!matchValue(matchHeaderValue, headerValue)) { - return false; - } - } - return true; - } - function safeUrl(path) { - if (typeof path !== "string") { - return path; - } - const pathSegments = path.split("?"); - if (pathSegments.length !== 2) { - return path; - } - const qp = new URLSearchParams(pathSegments.pop()); - qp.sort(); - return [...pathSegments, qp.toString()].join("?"); - } - function matchKey(mockDispatch2, { path, method, body, headers }) { - const pathMatch = matchValue(mockDispatch2.path, path); - const methodMatch = matchValue(mockDispatch2.method, method); - const bodyMatch = typeof mockDispatch2.body !== "undefined" ? matchValue(mockDispatch2.body, body) : true; - const headersMatch = matchHeaders(mockDispatch2, headers); - return pathMatch && methodMatch && bodyMatch && headersMatch; - } - function getResponseData(data) { - if (Buffer.isBuffer(data)) { - return data; - } else if (typeof data === "object") { - return JSON.stringify(data); - } else { - return data.toString(); - } - } - function getMockDispatch(mockDispatches, key) { - const basePath = key.query ? buildURL(key.path, key.query) : key.path; - const resolvedPath = typeof basePath === "string" ? safeUrl(basePath) : basePath; - let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`); - } - matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`); - } - matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== "undefined" ? matchValue(body, key.body) : true); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`); - } - matchedMockDispatches = matchedMockDispatches.filter((mockDispatch2) => matchHeaders(mockDispatch2, key.headers)); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === "object" ? JSON.stringify(key.headers) : key.headers}'`); - } - return matchedMockDispatches[0]; - } - function addMockDispatch(mockDispatches, key, data) { - const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false }; - const replyData = typeof data === "function" ? { callback: data } : { ...data }; - const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }; - mockDispatches.push(newMockDispatch); - return newMockDispatch; - } - function deleteMockDispatch(mockDispatches, key) { - const index = mockDispatches.findIndex((dispatch) => { - if (!dispatch.consumed) { - return false; - } - return matchKey(dispatch, key); - }); - if (index !== -1) { - mockDispatches.splice(index, 1); - } - } - function buildKey(opts) { - const { path, method, body, headers, query } = opts; - return { - path, - method, - body, - headers, - query - }; - } - function generateKeyValues(data) { - return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ - ...keyValuePairs, - Buffer.from(`${key}`), - Array.isArray(value) ? value.map((x) => Buffer.from(`${x}`)) : Buffer.from(`${value}`) - ], []); - } - function getStatusText(statusCode) { - return STATUS_CODES[statusCode] || "unknown"; - } - async function getResponse(body) { - const buffers = []; - for await (const data of body) { - buffers.push(data); - } - return Buffer.concat(buffers).toString("utf8"); - } - function mockDispatch(opts, handler) { - const key = buildKey(opts); - const mockDispatch2 = getMockDispatch(this[kDispatches], key); - mockDispatch2.timesInvoked++; - if (mockDispatch2.data.callback) { - mockDispatch2.data = { ...mockDispatch2.data, ...mockDispatch2.data.callback(opts) }; - } - const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch2; - const { timesInvoked, times } = mockDispatch2; - mockDispatch2.consumed = !persist && timesInvoked >= times; - mockDispatch2.pending = timesInvoked < times; - if (error !== null) { - deleteMockDispatch(this[kDispatches], key); - handler.onError(error); - return true; - } - if (typeof delay === "number" && delay > 0) { - setTimeout(() => { - handleReply(this[kDispatches]); - }, delay); - } else { - handleReply(this[kDispatches]); - } - function handleReply(mockDispatches, _data = data) { - const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; - const body = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data; - if (isPromise(body)) { - body.then((newData) => handleReply(mockDispatches, newData)); - return; - } - const responseData = getResponseData(body); - const responseHeaders = generateKeyValues(headers); - const responseTrailers = generateKeyValues(trailers); - handler.abort = nop; - handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)); - handler.onData(Buffer.from(responseData)); - handler.onComplete(responseTrailers); - deleteMockDispatch(mockDispatches, key); - } - function resume() { - } - return true; - } - function buildMockDispatch() { - const agent = this[kMockAgent]; - const origin = this[kOrigin]; - const originalDispatch = this[kOriginalDispatch]; - return function dispatch(opts, handler) { - if (agent.isMockActive) { - try { - mockDispatch.call(this, opts, handler); - } catch (error) { - if (error instanceof MockNotMatchedError) { - const netConnect = agent[kGetNetConnect](); - if (netConnect === false) { - throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`); - } - if (checkNetConnect(netConnect, origin)) { - originalDispatch.call(this, opts, handler); - } else { - throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`); - } - } else { - throw error; - } - } - } else { - originalDispatch.call(this, opts, handler); - } - }; - } - function checkNetConnect(netConnect, origin) { - const url = new URL(origin); - if (netConnect === true) { - return true; - } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { - return true; - } - return false; - } - function buildMockOptions(opts) { - if (opts) { - const { agent, ...mockOptions } = opts; - return mockOptions; - } - } - module.exports = { - getResponseData, - getMockDispatch, - addMockDispatch, - deleteMockDispatch, - buildKey, - generateKeyValues, - matchValue, - getResponse, - getStatusText, - mockDispatch, - buildMockDispatch, - checkNetConnect, - buildMockOptions, - getHeaderByName - }; -}); - -// ../node_modules/undici/lib/mock/mock-interceptor.js -var require_mock_interceptor = __commonJS((exports, module) => { - var { getResponseData, buildKey, addMockDispatch } = require_mock_utils(); - var { - kDispatches, - kDispatchKey, - kDefaultHeaders, - kDefaultTrailers, - kContentLength, - kMockDispatch - } = require_mock_symbols(); - var { InvalidArgumentError } = require_errors(); - var { buildURL } = require_util(); - - class MockScope { - constructor(mockDispatch) { - this[kMockDispatch] = mockDispatch; - } - delay(waitInMs) { - if (typeof waitInMs !== "number" || !Number.isInteger(waitInMs) || waitInMs <= 0) { - throw new InvalidArgumentError("waitInMs must be a valid integer > 0"); - } - this[kMockDispatch].delay = waitInMs; - return this; - } - persist() { - this[kMockDispatch].persist = true; - return this; - } - times(repeatTimes) { - if (typeof repeatTimes !== "number" || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { - throw new InvalidArgumentError("repeatTimes must be a valid integer > 0"); - } - this[kMockDispatch].times = repeatTimes; - return this; - } - } - - class MockInterceptor { - constructor(opts, mockDispatches) { - if (typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object"); - } - if (typeof opts.path === "undefined") { - throw new InvalidArgumentError("opts.path must be defined"); - } - if (typeof opts.method === "undefined") { - opts.method = "GET"; - } - if (typeof opts.path === "string") { - if (opts.query) { - opts.path = buildURL(opts.path, opts.query); - } else { - const parsedURL = new URL(opts.path, "data://"); - opts.path = parsedURL.pathname + parsedURL.search; - } - } - if (typeof opts.method === "string") { - opts.method = opts.method.toUpperCase(); - } - this[kDispatchKey] = buildKey(opts); - this[kDispatches] = mockDispatches; - this[kDefaultHeaders] = {}; - this[kDefaultTrailers] = {}; - this[kContentLength] = false; - } - createMockScopeDispatchData(statusCode, data, responseOptions = {}) { - const responseData = getResponseData(data); - const contentLength = this[kContentLength] ? { "content-length": responseData.length } : {}; - const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; - const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }; - return { statusCode, data, headers, trailers }; - } - validateReplyParameters(statusCode, data, responseOptions) { - if (typeof statusCode === "undefined") { - throw new InvalidArgumentError("statusCode must be defined"); - } - if (typeof data === "undefined") { - throw new InvalidArgumentError("data must be defined"); - } - if (typeof responseOptions !== "object") { - throw new InvalidArgumentError("responseOptions must be an object"); - } - } - reply(replyData) { - if (typeof replyData === "function") { - const wrappedDefaultsCallback = (opts) => { - const resolvedData = replyData(opts); - if (typeof resolvedData !== "object") { - throw new InvalidArgumentError("reply options callback must return an object"); - } - const { statusCode: statusCode2, data: data2 = "", responseOptions: responseOptions2 = {} } = resolvedData; - this.validateReplyParameters(statusCode2, data2, responseOptions2); - return { - ...this.createMockScopeDispatchData(statusCode2, data2, responseOptions2) - }; - }; - const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback); - return new MockScope(newMockDispatch2); - } - const [statusCode, data = "", responseOptions = {}] = [...arguments]; - this.validateReplyParameters(statusCode, data, responseOptions); - const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions); - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData); - return new MockScope(newMockDispatch); - } - replyWithError(error) { - if (typeof error === "undefined") { - throw new InvalidArgumentError("error must be defined"); - } - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }); - return new MockScope(newMockDispatch); - } - defaultReplyHeaders(headers) { - if (typeof headers === "undefined") { - throw new InvalidArgumentError("headers must be defined"); - } - this[kDefaultHeaders] = headers; - return this; - } - defaultReplyTrailers(trailers) { - if (typeof trailers === "undefined") { - throw new InvalidArgumentError("trailers must be defined"); - } - this[kDefaultTrailers] = trailers; - return this; - } - replyContentLength() { - this[kContentLength] = true; - return this; - } - } - exports.MockInterceptor = MockInterceptor; - exports.MockScope = MockScope; -}); - -// ../node_modules/undici/lib/mock/mock-client.js -var require_mock_client = __commonJS((exports, module) => { - var { promisify } = __require("util"); - var Client = require_client(); - var { buildMockDispatch } = require_mock_utils(); - var { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected - } = require_mock_symbols(); - var { MockInterceptor } = require_mock_interceptor(); - var Symbols = require_symbols(); - var { InvalidArgumentError } = require_errors(); - - class MockClient extends Client { - constructor(origin, opts) { - super(origin, opts); - if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - this[kMockAgent] = opts.agent; - this[kOrigin] = origin; - this[kDispatches] = []; - this[kConnected] = 1; - this[kOriginalDispatch] = this.dispatch; - this[kOriginalClose] = this.close.bind(this); - this.dispatch = buildMockDispatch.call(this); - this.close = this[kClose]; - } - get [Symbols.kConnected]() { - return this[kConnected]; - } - intercept(opts) { - return new MockInterceptor(opts, this[kDispatches]); - } - async[kClose]() { - await promisify(this[kOriginalClose])(); - this[kConnected] = 0; - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); - } - } - module.exports = MockClient; -}); - -// ../node_modules/undici/lib/mock/mock-pool.js -var require_mock_pool = __commonJS((exports, module) => { - var { promisify } = __require("util"); - var Pool = require_pool(); - var { buildMockDispatch } = require_mock_utils(); - var { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected - } = require_mock_symbols(); - var { MockInterceptor } = require_mock_interceptor(); - var Symbols = require_symbols(); - var { InvalidArgumentError } = require_errors(); - - class MockPool extends Pool { - constructor(origin, opts) { - super(origin, opts); - if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - this[kMockAgent] = opts.agent; - this[kOrigin] = origin; - this[kDispatches] = []; - this[kConnected] = 1; - this[kOriginalDispatch] = this.dispatch; - this[kOriginalClose] = this.close.bind(this); - this.dispatch = buildMockDispatch.call(this); - this.close = this[kClose]; - } - get [Symbols.kConnected]() { - return this[kConnected]; - } - intercept(opts) { - return new MockInterceptor(opts, this[kDispatches]); - } - async[kClose]() { - await promisify(this[kOriginalClose])(); - this[kConnected] = 0; - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); - } - } - module.exports = MockPool; -}); - -// ../node_modules/undici/lib/mock/pluralizer.js -var require_pluralizer = __commonJS((exports, module) => { - var singulars = { - pronoun: "it", - is: "is", - was: "was", - this: "this" - }; - var plurals = { - pronoun: "they", - is: "are", - was: "were", - this: "these" - }; - module.exports = class Pluralizer { - constructor(singular, plural) { - this.singular = singular; - this.plural = plural; - } - pluralize(count) { - const one = count === 1; - const keys = one ? singulars : plurals; - const noun = one ? this.singular : this.plural; - return { ...keys, count, noun }; - } - }; -}); - -// ../node_modules/undici/lib/mock/pending-interceptors-formatter.js -var require_pending_interceptors_formatter = __commonJS((exports, module) => { - var { Transform } = __require("stream"); - var { Console } = __require("console"); - module.exports = class PendingInterceptorsFormatter { - constructor({ disableColors } = {}) { - this.transform = new Transform({ - transform(chunk, _enc, cb) { - cb(null, chunk); - } - }); - this.logger = new Console({ - stdout: this.transform, - inspectOptions: { - colors: !disableColors && !process.env.CI - } - }); - } - format(pendingInterceptors) { - const withPrettyHeaders = pendingInterceptors.map(({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ - Method: method, - Origin: origin, - Path: path, - "Status code": statusCode, - Persistent: persist ? "\u2705" : "\u274C", - Invocations: timesInvoked, - Remaining: persist ? Infinity : times - timesInvoked - })); - this.logger.table(withPrettyHeaders); - return this.transform.read().toString(); - } - }; -}); - -// ../node_modules/undici/lib/mock/mock-agent.js -var require_mock_agent = __commonJS((exports, module) => { - var { kClients } = require_symbols(); - var Agent = require_agent(); - var { - kAgent, - kMockAgentSet, - kMockAgentGet, - kDispatches, - kIsMockActive, - kNetConnect, - kGetNetConnect, - kOptions, - kFactory - } = require_mock_symbols(); - var MockClient = require_mock_client(); - var MockPool = require_mock_pool(); - var { matchValue, buildMockOptions } = require_mock_utils(); - var { InvalidArgumentError, UndiciError } = require_errors(); - var Dispatcher = require_dispatcher(); - var Pluralizer = require_pluralizer(); - var PendingInterceptorsFormatter = require_pending_interceptors_formatter(); - - class FakeWeakRef { - constructor(value) { - this.value = value; - } - deref() { - return this.value; - } - } - - class MockAgent extends Dispatcher { - constructor(opts) { - super(opts); - this[kNetConnect] = true; - this[kIsMockActive] = true; - if (opts && opts.agent && typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - const agent = opts && opts.agent ? opts.agent : new Agent(opts); - this[kAgent] = agent; - this[kClients] = agent[kClients]; - this[kOptions] = buildMockOptions(opts); - } - get(origin) { - let dispatcher = this[kMockAgentGet](origin); - if (!dispatcher) { - dispatcher = this[kFactory](origin); - this[kMockAgentSet](origin, dispatcher); - } - return dispatcher; - } - dispatch(opts, handler) { - this.get(opts.origin); - return this[kAgent].dispatch(opts, handler); - } - async close() { - await this[kAgent].close(); - this[kClients].clear(); - } - deactivate() { - this[kIsMockActive] = false; - } - activate() { - this[kIsMockActive] = true; - } - enableNetConnect(matcher) { - if (typeof matcher === "string" || typeof matcher === "function" || matcher instanceof RegExp) { - if (Array.isArray(this[kNetConnect])) { - this[kNetConnect].push(matcher); - } else { - this[kNetConnect] = [matcher]; - } - } else if (typeof matcher === "undefined") { - this[kNetConnect] = true; - } else { - throw new InvalidArgumentError("Unsupported matcher. Must be one of String|Function|RegExp."); - } - } - disableNetConnect() { - this[kNetConnect] = false; - } - get isMockActive() { - return this[kIsMockActive]; - } - [kMockAgentSet](origin, dispatcher) { - this[kClients].set(origin, new FakeWeakRef(dispatcher)); - } - [kFactory](origin) { - const mockOptions = Object.assign({ agent: this }, this[kOptions]); - return this[kOptions] && this[kOptions].connections === 1 ? new MockClient(origin, mockOptions) : new MockPool(origin, mockOptions); - } - [kMockAgentGet](origin) { - const ref = this[kClients].get(origin); - if (ref) { - return ref.deref(); - } - if (typeof origin !== "string") { - const dispatcher = this[kFactory]("http://localhost:9999"); - this[kMockAgentSet](origin, dispatcher); - return dispatcher; - } - for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { - const nonExplicitDispatcher = nonExplicitRef.deref(); - if (nonExplicitDispatcher && typeof keyMatcher !== "string" && matchValue(keyMatcher, origin)) { - const dispatcher = this[kFactory](origin); - this[kMockAgentSet](origin, dispatcher); - dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches]; - return dispatcher; - } - } - } - [kGetNetConnect]() { - return this[kNetConnect]; - } - pendingInterceptors() { - const mockAgentClients = this[kClients]; - return Array.from(mockAgentClients.entries()).flatMap(([origin, scope]) => scope.deref()[kDispatches].map((dispatch) => ({ ...dispatch, origin }))).filter(({ pending }) => pending); - } - assertNoPendingInterceptors({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter } = {}) { - const pending = this.pendingInterceptors(); - if (pending.length === 0) { - return; - } - const pluralizer = new Pluralizer("interceptor", "interceptors").pluralize(pending.length); - throw new UndiciError(` -${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: - -${pendingInterceptorsFormatter.format(pending)} -`.trim()); - } - } - module.exports = MockAgent; -}); - -// ../node_modules/undici/lib/proxy-agent.js -var require_proxy_agent = __commonJS((exports, module) => { - var { kProxy, kClose, kDestroy, kInterceptors } = require_symbols(); - var { URL: URL2 } = __require("url"); - var Agent = require_agent(); - var Pool = require_pool(); - var DispatcherBase = require_dispatcher_base(); - var { InvalidArgumentError, RequestAbortedError } = require_errors(); - var buildConnector = require_connect(); - var kAgent = Symbol("proxy agent"); - var kClient = Symbol("proxy client"); - var kProxyHeaders = Symbol("proxy headers"); - var kRequestTls = Symbol("request tls settings"); - var kProxyTls = Symbol("proxy tls settings"); - var kConnectEndpoint = Symbol("connect endpoint function"); - function defaultProtocolPort(protocol) { - return protocol === "https:" ? 443 : 80; - } - function buildProxyOptions(opts) { - if (typeof opts === "string") { - opts = { uri: opts }; - } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); - } - return { - uri: opts.uri, - protocol: opts.protocol || "https" - }; - } - function defaultFactory(origin, opts) { - return new Pool(origin, opts); - } - - class ProxyAgent extends DispatcherBase { - constructor(opts) { - super(opts); - this[kProxy] = buildProxyOptions(opts); - this[kAgent] = new Agent(opts); - this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; - if (typeof opts === "string") { - opts = { uri: opts }; - } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); - } - const { clientFactory = defaultFactory } = opts; - if (typeof clientFactory !== "function") { - throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); - } - this[kRequestTls] = opts.requestTls; - this[kProxyTls] = opts.proxyTls; - this[kProxyHeaders] = opts.headers || {}; - const resolvedUrl = new URL2(opts.uri); - const { origin, port, host, username, password } = resolvedUrl; - if (opts.auth && opts.token) { - throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); - } else if (opts.auth) { - this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; - } else if (opts.token) { - this[kProxyHeaders]["proxy-authorization"] = opts.token; - } else if (username && password) { - this[kProxyHeaders]["proxy-authorization"] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString("base64")}`; - } - const connect = buildConnector({ ...opts.proxyTls }); - this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); - this[kClient] = clientFactory(resolvedUrl, { connect }); - this[kAgent] = new Agent({ - ...opts, - connect: async (opts2, callback) => { - let requestedHost = opts2.host; - if (!opts2.port) { - requestedHost += `:${defaultProtocolPort(opts2.protocol)}`; - } - try { - const { socket, statusCode } = await this[kClient].connect({ - origin, - port, - path: requestedHost, - signal: opts2.signal, - headers: { - ...this[kProxyHeaders], - host - } - }); - if (statusCode !== 200) { - socket.on("error", () => { - }).destroy(); - callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); - } - if (opts2.protocol !== "https:") { - callback(null, socket); - return; - } - let servername; - if (this[kRequestTls]) { - servername = this[kRequestTls].servername; - } else { - servername = opts2.servername; - } - this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback); - } catch (err) { - callback(err); - } - } - }); - } - dispatch(opts, handler) { - const { host } = new URL2(opts.origin); - const headers = buildHeaders(opts.headers); - throwIfProxyAuthIsSent(headers); - return this[kAgent].dispatch({ - ...opts, - headers: { - ...headers, - host - } - }, handler); - } - async[kClose]() { - await this[kAgent].close(); - await this[kClient].close(); - } - async[kDestroy]() { - await this[kAgent].destroy(); - await this[kClient].destroy(); - } - } - function buildHeaders(headers) { - if (Array.isArray(headers)) { - const headersPair = {}; - for (let i = 0;i < headers.length; i += 2) { - headersPair[headers[i]] = headers[i + 1]; - } - return headersPair; - } - return headers; - } - function throwIfProxyAuthIsSent(headers) { - const existProxyAuth = headers && Object.keys(headers).find((key) => key.toLowerCase() === "proxy-authorization"); - if (existProxyAuth) { - throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); - } - } - module.exports = ProxyAgent; -}); - -// ../node_modules/undici/lib/handler/RetryHandler.js -var require_RetryHandler = __commonJS((exports, module) => { - var assert = __require("assert"); - var { kRetryHandlerDefaultRetry } = require_symbols(); - var { RequestRetryError } = require_errors(); - var { isDisturbed, parseHeaders, parseRangeHeader } = require_util(); - function calculateRetryAfterHeader(retryAfter) { - const current = Date.now(); - const diff = new Date(retryAfter).getTime() - current; - return diff; - } - - class RetryHandler { - constructor(opts, handlers) { - const { retryOptions, ...dispatchOpts } = opts; - const { - retry: retryFn, - maxRetries, - maxTimeout, - minTimeout, - timeoutFactor, - methods, - errorCodes, - retryAfter, - statusCodes - } = retryOptions ?? {}; - this.dispatch = handlers.dispatch; - this.handler = handlers.handler; - this.opts = dispatchOpts; - this.abort = null; - this.aborted = false; - this.retryOpts = { - retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], - retryAfter: retryAfter ?? true, - maxTimeout: maxTimeout ?? 30 * 1000, - timeout: minTimeout ?? 500, - timeoutFactor: timeoutFactor ?? 2, - maxRetries: maxRetries ?? 5, - methods: methods ?? ["GET", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"], - statusCodes: statusCodes ?? [500, 502, 503, 504, 429], - errorCodes: errorCodes ?? [ - "ECONNRESET", - "ECONNREFUSED", - "ENOTFOUND", - "ENETDOWN", - "ENETUNREACH", - "EHOSTDOWN", - "EHOSTUNREACH", - "EPIPE" - ] - }; - this.retryCount = 0; - this.start = 0; - this.end = null; - this.etag = null; - this.resume = null; - this.handler.onConnect((reason) => { - this.aborted = true; - if (this.abort) { - this.abort(reason); - } else { - this.reason = reason; - } - }); - } - onRequestSent() { - if (this.handler.onRequestSent) { - this.handler.onRequestSent(); - } - } - onUpgrade(statusCode, headers, socket) { - if (this.handler.onUpgrade) { - this.handler.onUpgrade(statusCode, headers, socket); - } - } - onConnect(abort) { - if (this.aborted) { - abort(this.reason); - } else { - this.abort = abort; - } - } - onBodySent(chunk) { - if (this.handler.onBodySent) - return this.handler.onBodySent(chunk); - } - static [kRetryHandlerDefaultRetry](err, { state, opts }, cb) { - const { statusCode, code, headers } = err; - const { method, retryOptions } = opts; - const { - maxRetries, - timeout, - maxTimeout, - timeoutFactor, - statusCodes, - errorCodes, - methods - } = retryOptions; - let { counter, currentTimeout } = state; - currentTimeout = currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout; - if (code && code !== "UND_ERR_REQ_RETRY" && code !== "UND_ERR_SOCKET" && !errorCodes.includes(code)) { - cb(err); - return; - } - if (Array.isArray(methods) && !methods.includes(method)) { - cb(err); - return; - } - if (statusCode != null && Array.isArray(statusCodes) && !statusCodes.includes(statusCode)) { - cb(err); - return; - } - if (counter > maxRetries) { - cb(err); - return; - } - let retryAfterHeader = headers != null && headers["retry-after"]; - if (retryAfterHeader) { - retryAfterHeader = Number(retryAfterHeader); - retryAfterHeader = isNaN(retryAfterHeader) ? calculateRetryAfterHeader(retryAfterHeader) : retryAfterHeader * 1000; - } - const retryTimeout = retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout); - state.currentTimeout = retryTimeout; - setTimeout(() => cb(null), retryTimeout); - } - onHeaders(statusCode, rawHeaders, resume, statusMessage) { - const headers = parseHeaders(rawHeaders); - this.retryCount += 1; - if (statusCode >= 300) { - this.abort(new RequestRetryError("Request failed", statusCode, { - headers, - count: this.retryCount - })); - return false; - } - if (this.resume != null) { - this.resume = null; - if (statusCode !== 206) { - return true; - } - const contentRange = parseRangeHeader(headers["content-range"]); - if (!contentRange) { - this.abort(new RequestRetryError("Content-Range mismatch", statusCode, { - headers, - count: this.retryCount - })); - return false; - } - if (this.etag != null && this.etag !== headers.etag) { - this.abort(new RequestRetryError("ETag mismatch", statusCode, { - headers, - count: this.retryCount - })); - return false; - } - const { start, size, end = size } = contentRange; - assert(this.start === start, "content-range mismatch"); - assert(this.end == null || this.end === end, "content-range mismatch"); - this.resume = resume; - return true; - } - if (this.end == null) { - if (statusCode === 206) { - const range = parseRangeHeader(headers["content-range"]); - if (range == null) { - return this.handler.onHeaders(statusCode, rawHeaders, resume, statusMessage); - } - const { start, size, end = size } = range; - assert(start != null && Number.isFinite(start) && this.start !== start, "content-range mismatch"); - assert(Number.isFinite(start)); - assert(end != null && Number.isFinite(end) && this.end !== end, "invalid content-length"); - this.start = start; - this.end = end; - } - if (this.end == null) { - const contentLength = headers["content-length"]; - this.end = contentLength != null ? Number(contentLength) : null; - } - assert(Number.isFinite(this.start)); - assert(this.end == null || Number.isFinite(this.end), "invalid content-length"); - this.resume = resume; - this.etag = headers.etag != null ? headers.etag : null; - return this.handler.onHeaders(statusCode, rawHeaders, resume, statusMessage); - } - const err = new RequestRetryError("Request failed", statusCode, { - headers, - count: this.retryCount - }); - this.abort(err); - return false; - } - onData(chunk) { - this.start += chunk.length; - return this.handler.onData(chunk); - } - onComplete(rawTrailers) { - this.retryCount = 0; - return this.handler.onComplete(rawTrailers); - } - onError(err) { - if (this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err); - } - this.retryOpts.retry(err, { - state: { counter: this.retryCount++, currentTimeout: this.retryAfter }, - opts: { retryOptions: this.retryOpts, ...this.opts } - }, onRetry.bind(this)); - function onRetry(err2) { - if (err2 != null || this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err2); - } - if (this.start !== 0) { - this.opts = { - ...this.opts, - headers: { - ...this.opts.headers, - range: `bytes=${this.start}-${this.end ?? ""}` - } - }; - } - try { - this.dispatch(this.opts, this); - } catch (err3) { - this.handler.onError(err3); - } - } - } - } - module.exports = RetryHandler; -}); - -// ../node_modules/undici/lib/global.js -var require_global2 = __commonJS((exports, module) => { - var globalDispatcher = Symbol.for("undici.globalDispatcher.1"); - var { InvalidArgumentError } = require_errors(); - var Agent = require_agent(); - if (getGlobalDispatcher() === undefined) { - setGlobalDispatcher(new Agent); - } - function setGlobalDispatcher(agent) { - if (!agent || typeof agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument agent must implement Agent"); - } - Object.defineProperty(globalThis, globalDispatcher, { - value: agent, - writable: true, - enumerable: false, - configurable: false - }); - } - function getGlobalDispatcher() { - return globalThis[globalDispatcher]; - } - module.exports = { - setGlobalDispatcher, - getGlobalDispatcher - }; -}); - -// ../node_modules/undici/lib/handler/DecoratorHandler.js -var require_DecoratorHandler = __commonJS((exports, module) => { - module.exports = class DecoratorHandler { - constructor(handler) { - this.handler = handler; - } - onConnect(...args) { - return this.handler.onConnect(...args); - } - onError(...args) { - return this.handler.onError(...args); - } - onUpgrade(...args) { - return this.handler.onUpgrade(...args); - } - onHeaders(...args) { - return this.handler.onHeaders(...args); - } - onData(...args) { - return this.handler.onData(...args); - } - onComplete(...args) { - return this.handler.onComplete(...args); - } - onBodySent(...args) { - return this.handler.onBodySent(...args); - } - }; -}); - -// ../node_modules/undici/lib/fetch/headers.js -var require_headers = __commonJS((exports, module) => { - var { kHeadersList, kConstruct } = require_symbols(); - var { kGuard } = require_symbols2(); - var { kEnumerableProperty } = require_util(); - var { - makeIterator, - isValidHeaderName, - isValidHeaderValue - } = require_util2(); - var { webidl } = require_webidl(); - var assert = __require("assert"); - var kHeadersMap = Symbol("headers map"); - var kHeadersSortedMap = Symbol("headers map sorted"); - function isHTTPWhiteSpaceCharCode(code) { - return code === 10 || code === 13 || code === 9 || code === 32; - } - function headerValueNormalize(potentialValue) { - let i = 0; - let j = potentialValue.length; - while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) - --j; - while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) - ++i; - return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j); - } - function fill(headers, object) { - if (Array.isArray(object)) { - for (let i = 0;i < object.length; ++i) { - const header = object[i]; - if (header.length !== 2) { - throw webidl.errors.exception({ - header: "Headers constructor", - message: `expected name/value pair to be length 2, found ${header.length}.` - }); - } - appendHeader(headers, header[0], header[1]); - } - } else if (typeof object === "object" && object !== null) { - const keys = Object.keys(object); - for (let i = 0;i < keys.length; ++i) { - appendHeader(headers, keys[i], object[keys[i]]); - } - } else { - throw webidl.errors.conversionFailed({ - prefix: "Headers constructor", - argument: "Argument 1", - types: ["sequence>", "record"] - }); - } - } - function appendHeader(headers, name, value) { - value = headerValueNormalize(value); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.append", - value: name, - type: "header name" - }); - } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.append", - value, - type: "header value" - }); - } - if (headers[kGuard] === "immutable") { - throw new TypeError("immutable"); - } else if (headers[kGuard] === "request-no-cors") { - } - return headers[kHeadersList].append(name, value); - } - - class HeadersList { - cookies = null; - constructor(init) { - if (init instanceof HeadersList) { - this[kHeadersMap] = new Map(init[kHeadersMap]); - this[kHeadersSortedMap] = init[kHeadersSortedMap]; - this.cookies = init.cookies === null ? null : [...init.cookies]; - } else { - this[kHeadersMap] = new Map(init); - this[kHeadersSortedMap] = null; - } - } - contains(name) { - name = name.toLowerCase(); - return this[kHeadersMap].has(name); - } - clear() { - this[kHeadersMap].clear(); - this[kHeadersSortedMap] = null; - this.cookies = null; - } - append(name, value) { - this[kHeadersSortedMap] = null; - const lowercaseName = name.toLowerCase(); - const exists = this[kHeadersMap].get(lowercaseName); - if (exists) { - const delimiter = lowercaseName === "cookie" ? "; " : ", "; - this[kHeadersMap].set(lowercaseName, { - name: exists.name, - value: `${exists.value}${delimiter}${value}` - }); - } else { - this[kHeadersMap].set(lowercaseName, { name, value }); - } - if (lowercaseName === "set-cookie") { - this.cookies ??= []; - this.cookies.push(value); - } - } - set(name, value) { - this[kHeadersSortedMap] = null; - const lowercaseName = name.toLowerCase(); - if (lowercaseName === "set-cookie") { - this.cookies = [value]; - } - this[kHeadersMap].set(lowercaseName, { name, value }); - } - delete(name) { - this[kHeadersSortedMap] = null; - name = name.toLowerCase(); - if (name === "set-cookie") { - this.cookies = null; - } - this[kHeadersMap].delete(name); - } - get(name) { - const value = this[kHeadersMap].get(name.toLowerCase()); - return value === undefined ? null : value.value; - } - *[Symbol.iterator]() { - for (const [name, { value }] of this[kHeadersMap]) { - yield [name, value]; - } - } - get entries() { - const headers = {}; - if (this[kHeadersMap].size) { - for (const { name, value } of this[kHeadersMap].values()) { - headers[name] = value; - } - } - return headers; - } - } - - class Headers { - constructor(init = undefined) { - if (init === kConstruct) { - return; - } - this[kHeadersList] = new HeadersList; - this[kGuard] = "none"; - if (init !== undefined) { - init = webidl.converters.HeadersInit(init); - fill(this, init); - } - } - append(name, value) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 2, { header: "Headers.append" }); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); - return appendHeader(this, name, value); - } - delete(name) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.delete" }); - name = webidl.converters.ByteString(name); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.delete", - value: name, - type: "header name" - }); - } - if (this[kGuard] === "immutable") { - throw new TypeError("immutable"); - } else if (this[kGuard] === "request-no-cors") { - } - if (!this[kHeadersList].contains(name)) { - return; - } - this[kHeadersList].delete(name); - } - get(name) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.get" }); - name = webidl.converters.ByteString(name); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.get", - value: name, - type: "header name" - }); - } - return this[kHeadersList].get(name); - } - has(name) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.has" }); - name = webidl.converters.ByteString(name); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.has", - value: name, - type: "header name" - }); - } - return this[kHeadersList].contains(name); - } - set(name, value) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 2, { header: "Headers.set" }); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); - value = headerValueNormalize(value); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.set", - value: name, - type: "header name" - }); - } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.set", - value, - type: "header value" - }); - } - if (this[kGuard] === "immutable") { - throw new TypeError("immutable"); - } else if (this[kGuard] === "request-no-cors") { - } - this[kHeadersList].set(name, value); - } - getSetCookie() { - webidl.brandCheck(this, Headers); - const list = this[kHeadersList].cookies; - if (list) { - return [...list]; - } - return []; - } - get [kHeadersSortedMap]() { - if (this[kHeadersList][kHeadersSortedMap]) { - return this[kHeadersList][kHeadersSortedMap]; - } - const headers = []; - const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1); - const cookies = this[kHeadersList].cookies; - for (let i = 0;i < names.length; ++i) { - const [name, value] = names[i]; - if (name === "set-cookie") { - for (let j = 0;j < cookies.length; ++j) { - headers.push([name, cookies[j]]); - } - } else { - assert(value !== null); - headers.push([name, value]); - } - } - this[kHeadersList][kHeadersSortedMap] = headers; - return headers; - } - keys() { - webidl.brandCheck(this, Headers); - if (this[kGuard] === "immutable") { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, "Headers", "key"); - } - return makeIterator(() => [...this[kHeadersSortedMap].values()], "Headers", "key"); - } - values() { - webidl.brandCheck(this, Headers); - if (this[kGuard] === "immutable") { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, "Headers", "value"); - } - return makeIterator(() => [...this[kHeadersSortedMap].values()], "Headers", "value"); - } - entries() { - webidl.brandCheck(this, Headers); - if (this[kGuard] === "immutable") { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, "Headers", "key+value"); - } - return makeIterator(() => [...this[kHeadersSortedMap].values()], "Headers", "key+value"); - } - forEach(callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.forEach" }); - if (typeof callbackFn !== "function") { - throw new TypeError("Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'."); - } - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); - } - } - [Symbol.for("nodejs.util.inspect.custom")]() { - webidl.brandCheck(this, Headers); - return this[kHeadersList]; - } - } - Headers.prototype[Symbol.iterator] = Headers.prototype.entries; - Object.defineProperties(Headers.prototype, { - append: kEnumerableProperty, - delete: kEnumerableProperty, - get: kEnumerableProperty, - has: kEnumerableProperty, - set: kEnumerableProperty, - getSetCookie: kEnumerableProperty, - keys: kEnumerableProperty, - values: kEnumerableProperty, - entries: kEnumerableProperty, - forEach: kEnumerableProperty, - [Symbol.iterator]: { enumerable: false }, - [Symbol.toStringTag]: { - value: "Headers", - configurable: true - } - }); - webidl.converters.HeadersInit = function(V) { - if (webidl.util.Type(V) === "Object") { - if (V[Symbol.iterator]) { - return webidl.converters["sequence>"](V); - } - return webidl.converters["record"](V); - } - throw webidl.errors.conversionFailed({ - prefix: "Headers constructor", - argument: "Argument 1", - types: ["sequence>", "record"] - }); - }; - module.exports = { - fill, - Headers, - HeadersList - }; -}); - -// ../node_modules/undici/lib/fetch/response.js -var require_response = __commonJS((exports, module) => { - var { Headers, HeadersList, fill } = require_headers(); - var { extractBody, cloneBody, mixinBody } = require_body(); - var util = require_util(); - var { kEnumerableProperty } = util; - var { - isValidReasonPhrase, - isCancelled, - isAborted, - isBlobLike, - serializeJavascriptValueToJSONString, - isErrorLike, - isomorphicEncode - } = require_util2(); - var { - redirectStatusSet, - nullBodyStatus, - DOMException: DOMException2 - } = require_constants2(); - var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); - var { webidl } = require_webidl(); - var { FormData } = require_formdata(); - var { getGlobalOrigin } = require_global(); - var { URLSerializer } = require_dataURL(); - var { kHeadersList, kConstruct } = require_symbols(); - var assert = __require("assert"); - var { types } = __require("util"); - var ReadableStream = globalThis.ReadableStream || __require("stream/web").ReadableStream; - var textEncoder = new TextEncoder("utf-8"); - - class Response { - static error() { - const relevantRealm = { settingsObject: {} }; - const responseObject = new Response; - responseObject[kState] = makeNetworkError(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; - return responseObject; - } - static json(data, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "Response.json" }); - if (init !== null) { - init = webidl.converters.ResponseInit(init); - } - const bytes = textEncoder.encode(serializeJavascriptValueToJSONString(data)); - const body = extractBody(bytes); - const relevantRealm = { settingsObject: {} }; - const responseObject = new Response; - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = "response"; - responseObject[kHeaders][kRealm] = relevantRealm; - initializeResponse(responseObject, init, { body: body[0], type: "application/json" }); - return responseObject; - } - static redirect(url, status = 302) { - const relevantRealm = { settingsObject: {} }; - webidl.argumentLengthCheck(arguments, 1, { header: "Response.redirect" }); - url = webidl.converters.USVString(url); - status = webidl.converters["unsigned short"](status); - let parsedURL; - try { - parsedURL = new URL(url, getGlobalOrigin()); - } catch (err) { - throw Object.assign(new TypeError("Failed to parse URL from " + url), { - cause: err - }); - } - if (!redirectStatusSet.has(status)) { - throw new RangeError("Invalid status code " + status); - } - const responseObject = new Response; - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; - responseObject[kState].status = status; - const value = isomorphicEncode(URLSerializer(parsedURL)); - responseObject[kState].headersList.append("location", value); - return responseObject; - } - constructor(body = null, init = {}) { - if (body !== null) { - body = webidl.converters.BodyInit(body); - } - init = webidl.converters.ResponseInit(init); - this[kRealm] = { settingsObject: {} }; - this[kState] = makeResponse({}); - this[kHeaders] = new Headers(kConstruct); - this[kHeaders][kGuard] = "response"; - this[kHeaders][kHeadersList] = this[kState].headersList; - this[kHeaders][kRealm] = this[kRealm]; - let bodyWithType = null; - if (body != null) { - const [extractedBody, type] = extractBody(body); - bodyWithType = { body: extractedBody, type }; - } - initializeResponse(this, init, bodyWithType); - } - get type() { - webidl.brandCheck(this, Response); - return this[kState].type; - } - get url() { - webidl.brandCheck(this, Response); - const urlList = this[kState].urlList; - const url = urlList[urlList.length - 1] ?? null; - if (url === null) { - return ""; - } - return URLSerializer(url, true); - } - get redirected() { - webidl.brandCheck(this, Response); - return this[kState].urlList.length > 1; - } - get status() { - webidl.brandCheck(this, Response); - return this[kState].status; - } - get ok() { - webidl.brandCheck(this, Response); - return this[kState].status >= 200 && this[kState].status <= 299; - } - get statusText() { - webidl.brandCheck(this, Response); - return this[kState].statusText; - } - get headers() { - webidl.brandCheck(this, Response); - return this[kHeaders]; - } - get body() { - webidl.brandCheck(this, Response); - return this[kState].body ? this[kState].body.stream : null; - } - get bodyUsed() { - webidl.brandCheck(this, Response); - return !!this[kState].body && util.isDisturbed(this[kState].body.stream); - } - clone() { - webidl.brandCheck(this, Response); - if (this.bodyUsed || this.body && this.body.locked) { - throw webidl.errors.exception({ - header: "Response.clone", - message: "Body has already been consumed." - }); - } - const clonedResponse = cloneResponse(this[kState]); - const clonedResponseObject = new Response; - clonedResponseObject[kState] = clonedResponse; - clonedResponseObject[kRealm] = this[kRealm]; - clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList; - clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]; - return clonedResponseObject; - } - } - mixinBody(Response); - Object.defineProperties(Response.prototype, { - type: kEnumerableProperty, - url: kEnumerableProperty, - status: kEnumerableProperty, - ok: kEnumerableProperty, - redirected: kEnumerableProperty, - statusText: kEnumerableProperty, - headers: kEnumerableProperty, - clone: kEnumerableProperty, - body: kEnumerableProperty, - bodyUsed: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "Response", - configurable: true - } - }); - Object.defineProperties(Response, { - json: kEnumerableProperty, - redirect: kEnumerableProperty, - error: kEnumerableProperty - }); - function cloneResponse(response) { - if (response.internalResponse) { - return filterResponse(cloneResponse(response.internalResponse), response.type); - } - const newResponse = makeResponse({ ...response, body: null }); - if (response.body != null) { - newResponse.body = cloneBody(response.body); - } - return newResponse; - } - function makeResponse(init) { - return { - aborted: false, - rangeRequested: false, - timingAllowPassed: false, - requestIncludesCredentials: false, - type: "default", - status: 200, - timingInfo: null, - cacheState: "", - statusText: "", - ...init, - headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList, - urlList: init.urlList ? [...init.urlList] : [] - }; - } - function makeNetworkError(reason) { - const isError = isErrorLike(reason); - return makeResponse({ - type: "error", - status: 0, - error: isError ? reason : new Error(reason ? String(reason) : reason), - aborted: reason && reason.name === "AbortError" - }); - } - function makeFilteredResponse(response, state) { - state = { - internalResponse: response, - ...state - }; - return new Proxy(response, { - get(target, p) { - return p in state ? state[p] : target[p]; - }, - set(target, p, value) { - assert(!(p in state)); - target[p] = value; - return true; - } - }); - } - function filterResponse(response, type) { - if (type === "basic") { - return makeFilteredResponse(response, { - type: "basic", - headersList: response.headersList - }); - } else if (type === "cors") { - return makeFilteredResponse(response, { - type: "cors", - headersList: response.headersList - }); - } else if (type === "opaque") { - return makeFilteredResponse(response, { - type: "opaque", - urlList: Object.freeze([]), - status: 0, - statusText: "", - body: null - }); - } else if (type === "opaqueredirect") { - return makeFilteredResponse(response, { - type: "opaqueredirect", - status: 0, - statusText: "", - headersList: [], - body: null - }); - } else { - assert(false); - } - } - function makeAppropriateNetworkError(fetchParams, err = null) { - assert(isCancelled(fetchParams)); - return isAborted(fetchParams) ? makeNetworkError(Object.assign(new DOMException2("The operation was aborted.", "AbortError"), { cause: err })) : makeNetworkError(Object.assign(new DOMException2("Request was cancelled."), { cause: err })); - } - function initializeResponse(response, init, body) { - if (init.status !== null && (init.status < 200 || init.status > 599)) { - throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.'); - } - if ("statusText" in init && init.statusText != null) { - if (!isValidReasonPhrase(String(init.statusText))) { - throw new TypeError("Invalid statusText"); - } - } - if ("status" in init && init.status != null) { - response[kState].status = init.status; - } - if ("statusText" in init && init.statusText != null) { - response[kState].statusText = init.statusText; - } - if ("headers" in init && init.headers != null) { - fill(response[kHeaders], init.headers); - } - if (body) { - if (nullBodyStatus.includes(response.status)) { - throw webidl.errors.exception({ - header: "Response constructor", - message: "Invalid response status code " + response.status - }); - } - response[kState].body = body.body; - if (body.type != null && !response[kState].headersList.contains("Content-Type")) { - response[kState].headersList.append("content-type", body.type); - } - } - } - webidl.converters.ReadableStream = webidl.interfaceConverter(ReadableStream); - webidl.converters.FormData = webidl.interfaceConverter(FormData); - webidl.converters.URLSearchParams = webidl.interfaceConverter(URLSearchParams); - webidl.converters.XMLHttpRequestBodyInit = function(V) { - if (typeof V === "string") { - return webidl.converters.USVString(V); - } - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); - } - if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) { - return webidl.converters.BufferSource(V); - } - if (util.isFormDataLike(V)) { - return webidl.converters.FormData(V, { strict: false }); - } - if (V instanceof URLSearchParams) { - return webidl.converters.URLSearchParams(V); - } - return webidl.converters.DOMString(V); - }; - webidl.converters.BodyInit = function(V) { - if (V instanceof ReadableStream) { - return webidl.converters.ReadableStream(V); - } - if (V?.[Symbol.asyncIterator]) { - return V; - } - return webidl.converters.XMLHttpRequestBodyInit(V); - }; - webidl.converters.ResponseInit = webidl.dictionaryConverter([ - { - key: "status", - converter: webidl.converters["unsigned short"], - defaultValue: 200 - }, - { - key: "statusText", - converter: webidl.converters.ByteString, - defaultValue: "" - }, - { - key: "headers", - converter: webidl.converters.HeadersInit - } - ]); - module.exports = { - makeNetworkError, - makeResponse, - makeAppropriateNetworkError, - filterResponse, - Response, - cloneResponse - }; -}); - -// ../node_modules/undici/lib/fetch/request.js -var require_request2 = __commonJS((exports, module) => { - var { extractBody, mixinBody, cloneBody } = require_body(); - var { Headers, fill: fillHeaders, HeadersList } = require_headers(); - var { FinalizationRegistry } = require_dispatcher_weakref()(); - var util = require_util(); - var { - isValidHTTPToken, - sameOrigin, - normalizeMethod, - makePolicyContainer, - normalizeMethodRecord - } = require_util2(); - var { - forbiddenMethodsSet, - corsSafeListedMethodsSet, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - requestDuplex - } = require_constants2(); - var { kEnumerableProperty } = util; - var { kHeaders, kSignal, kState, kGuard, kRealm } = require_symbols2(); - var { webidl } = require_webidl(); - var { getGlobalOrigin } = require_global(); - var { URLSerializer } = require_dataURL(); - var { kHeadersList, kConstruct } = require_symbols(); - var assert = __require("assert"); - var { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __require("events"); - var TransformStream = globalThis.TransformStream; - var kAbortController = Symbol("abortController"); - var requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { - signal.removeEventListener("abort", abort); - }); - - class Request { - constructor(input, init = {}) { - if (input === kConstruct) { - return; - } - webidl.argumentLengthCheck(arguments, 1, { header: "Request constructor" }); - input = webidl.converters.RequestInfo(input); - init = webidl.converters.RequestInit(init); - this[kRealm] = { - settingsObject: { - baseUrl: getGlobalOrigin(), - get origin() { - return this.baseUrl?.origin; - }, - policyContainer: makePolicyContainer() - } - }; - let request = null; - let fallbackMode = null; - const baseUrl = this[kRealm].settingsObject.baseUrl; - let signal = null; - if (typeof input === "string") { - let parsedURL; - try { - parsedURL = new URL(input, baseUrl); - } catch (err) { - throw new TypeError("Failed to parse URL from " + input, { cause: err }); - } - if (parsedURL.username || parsedURL.password) { - throw new TypeError("Request cannot be constructed from a URL that includes credentials: " + input); - } - request = makeRequest({ urlList: [parsedURL] }); - fallbackMode = "cors"; - } else { - assert(input instanceof Request); - request = input[kState]; - signal = input[kSignal]; - } - const origin = this[kRealm].settingsObject.origin; - let window = "client"; - if (request.window?.constructor?.name === "EnvironmentSettingsObject" && sameOrigin(request.window, origin)) { - window = request.window; - } - if (init.window != null) { - throw new TypeError(`'window' option '${window}' must be null`); - } - if ("window" in init) { - window = "no-window"; - } - request = makeRequest({ - method: request.method, - headersList: request.headersList, - unsafeRequest: request.unsafeRequest, - client: this[kRealm].settingsObject, - window, - priority: request.priority, - origin: request.origin, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - mode: request.mode, - credentials: request.credentials, - cache: request.cache, - redirect: request.redirect, - integrity: request.integrity, - keepalive: request.keepalive, - reloadNavigation: request.reloadNavigation, - historyNavigation: request.historyNavigation, - urlList: [...request.urlList] - }); - const initHasKey = Object.keys(init).length !== 0; - if (initHasKey) { - if (request.mode === "navigate") { - request.mode = "same-origin"; - } - request.reloadNavigation = false; - request.historyNavigation = false; - request.origin = "client"; - request.referrer = "client"; - request.referrerPolicy = ""; - request.url = request.urlList[request.urlList.length - 1]; - request.urlList = [request.url]; - } - if (init.referrer !== undefined) { - const referrer = init.referrer; - if (referrer === "") { - request.referrer = "no-referrer"; - } else { - let parsedReferrer; - try { - parsedReferrer = new URL(referrer, baseUrl); - } catch (err) { - throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }); - } - if (parsedReferrer.protocol === "about:" && parsedReferrer.hostname === "client" || origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) { - request.referrer = "client"; - } else { - request.referrer = parsedReferrer; - } - } - } - if (init.referrerPolicy !== undefined) { - request.referrerPolicy = init.referrerPolicy; - } - let mode; - if (init.mode !== undefined) { - mode = init.mode; - } else { - mode = fallbackMode; - } - if (mode === "navigate") { - throw webidl.errors.exception({ - header: "Request constructor", - message: "invalid request mode navigate." - }); - } - if (mode != null) { - request.mode = mode; - } - if (init.credentials !== undefined) { - request.credentials = init.credentials; - } - if (init.cache !== undefined) { - request.cache = init.cache; - } - if (request.cache === "only-if-cached" && request.mode !== "same-origin") { - throw new TypeError("'only-if-cached' can be set only with 'same-origin' mode"); - } - if (init.redirect !== undefined) { - request.redirect = init.redirect; - } - if (init.integrity != null) { - request.integrity = String(init.integrity); - } - if (init.keepalive !== undefined) { - request.keepalive = Boolean(init.keepalive); - } - if (init.method !== undefined) { - let method = init.method; - if (!isValidHTTPToken(method)) { - throw new TypeError(`'${method}' is not a valid HTTP method.`); - } - if (forbiddenMethodsSet.has(method.toUpperCase())) { - throw new TypeError(`'${method}' HTTP method is unsupported.`); - } - method = normalizeMethodRecord[method] ?? normalizeMethod(method); - request.method = method; - } - if (init.signal !== undefined) { - signal = init.signal; - } - this[kState] = request; - const ac = new AbortController; - this[kSignal] = ac.signal; - this[kSignal][kRealm] = this[kRealm]; - if (signal != null) { - if (!signal || typeof signal.aborted !== "boolean" || typeof signal.addEventListener !== "function") { - throw new TypeError("Failed to construct 'Request': member signal is not of type AbortSignal."); - } - if (signal.aborted) { - ac.abort(signal.reason); - } else { - this[kAbortController] = ac; - const acRef = new WeakRef(ac); - const abort = function() { - const ac2 = acRef.deref(); - if (ac2 !== undefined) { - ac2.abort(this.reason); - } - }; - try { - if (typeof getMaxListeners === "function" && getMaxListeners(signal) === defaultMaxListeners) { - setMaxListeners(100, signal); - } else if (getEventListeners(signal, "abort").length >= defaultMaxListeners) { - setMaxListeners(100, signal); - } - } catch { - } - util.addAbortListener(signal, abort); - requestFinalizer.register(ac, { signal, abort }); - } - } - this[kHeaders] = new Headers(kConstruct); - this[kHeaders][kHeadersList] = request.headersList; - this[kHeaders][kGuard] = "request"; - this[kHeaders][kRealm] = this[kRealm]; - if (mode === "no-cors") { - if (!corsSafeListedMethodsSet.has(request.method)) { - throw new TypeError(`'${request.method} is unsupported in no-cors mode.`); - } - this[kHeaders][kGuard] = "request-no-cors"; - } - if (initHasKey) { - const headersList = this[kHeaders][kHeadersList]; - const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList); - headersList.clear(); - if (headers instanceof HeadersList) { - for (const [key, val] of headers) { - headersList.append(key, val); - } - headersList.cookies = headers.cookies; - } else { - fillHeaders(this[kHeaders], headers); - } - } - const inputBody = input instanceof Request ? input[kState].body : null; - if ((init.body != null || inputBody != null) && (request.method === "GET" || request.method === "HEAD")) { - throw new TypeError("Request with GET/HEAD method cannot have body."); - } - let initBody = null; - if (init.body != null) { - const [extractedBody, contentType] = extractBody(init.body, request.keepalive); - initBody = extractedBody; - if (contentType && !this[kHeaders][kHeadersList].contains("content-type")) { - this[kHeaders].append("content-type", contentType); - } - } - const inputOrInitBody = initBody ?? inputBody; - if (inputOrInitBody != null && inputOrInitBody.source == null) { - if (initBody != null && init.duplex == null) { - throw new TypeError("RequestInit: duplex option is required when sending a body."); - } - if (request.mode !== "same-origin" && request.mode !== "cors") { - throw new TypeError('If request is made from ReadableStream, mode should be "same-origin" or "cors"'); - } - request.useCORSPreflightFlag = true; - } - let finalBody = inputOrInitBody; - if (initBody == null && inputBody != null) { - if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) { - throw new TypeError("Cannot construct a Request with a Request object that has already been used."); - } - if (!TransformStream) { - TransformStream = __require("stream/web").TransformStream; - } - const identityTransform = new TransformStream; - inputBody.stream.pipeThrough(identityTransform); - finalBody = { - source: inputBody.source, - length: inputBody.length, - stream: identityTransform.readable - }; - } - this[kState].body = finalBody; - } - get method() { - webidl.brandCheck(this, Request); - return this[kState].method; - } - get url() { - webidl.brandCheck(this, Request); - return URLSerializer(this[kState].url); - } - get headers() { - webidl.brandCheck(this, Request); - return this[kHeaders]; - } - get destination() { - webidl.brandCheck(this, Request); - return this[kState].destination; - } - get referrer() { - webidl.brandCheck(this, Request); - if (this[kState].referrer === "no-referrer") { - return ""; - } - if (this[kState].referrer === "client") { - return "about:client"; - } - return this[kState].referrer.toString(); - } - get referrerPolicy() { - webidl.brandCheck(this, Request); - return this[kState].referrerPolicy; - } - get mode() { - webidl.brandCheck(this, Request); - return this[kState].mode; - } - get credentials() { - return this[kState].credentials; - } - get cache() { - webidl.brandCheck(this, Request); - return this[kState].cache; - } - get redirect() { - webidl.brandCheck(this, Request); - return this[kState].redirect; - } - get integrity() { - webidl.brandCheck(this, Request); - return this[kState].integrity; - } - get keepalive() { - webidl.brandCheck(this, Request); - return this[kState].keepalive; - } - get isReloadNavigation() { - webidl.brandCheck(this, Request); - return this[kState].reloadNavigation; - } - get isHistoryNavigation() { - webidl.brandCheck(this, Request); - return this[kState].historyNavigation; - } - get signal() { - webidl.brandCheck(this, Request); - return this[kSignal]; - } - get body() { - webidl.brandCheck(this, Request); - return this[kState].body ? this[kState].body.stream : null; - } - get bodyUsed() { - webidl.brandCheck(this, Request); - return !!this[kState].body && util.isDisturbed(this[kState].body.stream); - } - get duplex() { - webidl.brandCheck(this, Request); - return "half"; - } - clone() { - webidl.brandCheck(this, Request); - if (this.bodyUsed || this.body?.locked) { - throw new TypeError("unusable"); - } - const clonedRequest = cloneRequest(this[kState]); - const clonedRequestObject = new Request(kConstruct); - clonedRequestObject[kState] = clonedRequest; - clonedRequestObject[kRealm] = this[kRealm]; - clonedRequestObject[kHeaders] = new Headers(kConstruct); - clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList; - clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]; - const ac = new AbortController; - if (this.signal.aborted) { - ac.abort(this.signal.reason); - } else { - util.addAbortListener(this.signal, () => { - ac.abort(this.signal.reason); - }); - } - clonedRequestObject[kSignal] = ac.signal; - return clonedRequestObject; - } - } - mixinBody(Request); - function makeRequest(init) { - const request = { - method: "GET", - localURLsOnly: false, - unsafeRequest: false, - body: null, - client: null, - reservedClient: null, - replacesClientId: "", - window: "client", - keepalive: false, - serviceWorkers: "all", - initiator: "", - destination: "", - priority: null, - origin: "client", - policyContainer: "client", - referrer: "client", - referrerPolicy: "", - mode: "no-cors", - useCORSPreflightFlag: false, - credentials: "same-origin", - useCredentials: false, - cache: "default", - redirect: "follow", - integrity: "", - cryptoGraphicsNonceMetadata: "", - parserMetadata: "", - reloadNavigation: false, - historyNavigation: false, - userActivation: false, - taintedOrigin: false, - redirectCount: 0, - responseTainting: "basic", - preventNoCacheCacheControlHeaderModification: false, - done: false, - timingAllowFailed: false, - ...init, - headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList - }; - request.url = request.urlList[0]; - return request; - } - function cloneRequest(request) { - const newRequest = makeRequest({ ...request, body: null }); - if (request.body != null) { - newRequest.body = cloneBody(request.body); - } - return newRequest; - } - Object.defineProperties(Request.prototype, { - method: kEnumerableProperty, - url: kEnumerableProperty, - headers: kEnumerableProperty, - redirect: kEnumerableProperty, - clone: kEnumerableProperty, - signal: kEnumerableProperty, - duplex: kEnumerableProperty, - destination: kEnumerableProperty, - body: kEnumerableProperty, - bodyUsed: kEnumerableProperty, - isHistoryNavigation: kEnumerableProperty, - isReloadNavigation: kEnumerableProperty, - keepalive: kEnumerableProperty, - integrity: kEnumerableProperty, - cache: kEnumerableProperty, - credentials: kEnumerableProperty, - attribute: kEnumerableProperty, - referrerPolicy: kEnumerableProperty, - referrer: kEnumerableProperty, - mode: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "Request", - configurable: true - } - }); - webidl.converters.Request = webidl.interfaceConverter(Request); - webidl.converters.RequestInfo = function(V) { - if (typeof V === "string") { - return webidl.converters.USVString(V); - } - if (V instanceof Request) { - return webidl.converters.Request(V); - } - return webidl.converters.USVString(V); - }; - webidl.converters.AbortSignal = webidl.interfaceConverter(AbortSignal); - webidl.converters.RequestInit = webidl.dictionaryConverter([ - { - key: "method", - converter: webidl.converters.ByteString - }, - { - key: "headers", - converter: webidl.converters.HeadersInit - }, - { - key: "body", - converter: webidl.nullableConverter(webidl.converters.BodyInit) - }, - { - key: "referrer", - converter: webidl.converters.USVString - }, - { - key: "referrerPolicy", - converter: webidl.converters.DOMString, - allowedValues: referrerPolicy - }, - { - key: "mode", - converter: webidl.converters.DOMString, - allowedValues: requestMode - }, - { - key: "credentials", - converter: webidl.converters.DOMString, - allowedValues: requestCredentials - }, - { - key: "cache", - converter: webidl.converters.DOMString, - allowedValues: requestCache - }, - { - key: "redirect", - converter: webidl.converters.DOMString, - allowedValues: requestRedirect - }, - { - key: "integrity", - converter: webidl.converters.DOMString - }, - { - key: "keepalive", - converter: webidl.converters.boolean - }, - { - key: "signal", - converter: webidl.nullableConverter((signal) => webidl.converters.AbortSignal(signal, { strict: false })) - }, - { - key: "window", - converter: webidl.converters.any - }, - { - key: "duplex", - converter: webidl.converters.DOMString, - allowedValues: requestDuplex - } - ]); - module.exports = { Request, makeRequest }; -}); - -// ../node_modules/undici/lib/fetch/index.js -var require_fetch = __commonJS((exports, module) => { - var { - Response, - makeNetworkError, - makeAppropriateNetworkError, - filterResponse, - makeResponse - } = require_response(); - var { Headers } = require_headers(); - var { Request, makeRequest } = require_request2(); - var zlib = __require("zlib"); - var { - bytesMatch, - makePolicyContainer, - clonePolicyContainer, - requestBadPort, - TAOCheck, - appendRequestOriginHeader, - responseLocationURL, - requestCurrentURL, - setRequestReferrerPolicyOnRedirect, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - createOpaqueTimingInfo, - appendFetchMetadata, - corsCheck, - crossOriginResourcePolicyCheck, - determineRequestsReferrer, - coarsenedSharedCurrentTime, - createDeferredPromise, - isBlobLike, - sameOrigin, - isCancelled, - isAborted, - isErrorLike, - fullyReadBody, - readableStreamClose, - isomorphicEncode, - urlIsLocal, - urlIsHttpHttpsScheme, - urlHasHttpsScheme - } = require_util2(); - var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); - var assert = __require("assert"); - var { safelyExtractBody } = require_body(); - var { - redirectStatusSet, - nullBodyStatus, - safeMethodsSet, - requestBodyHeader, - subresourceSet, - DOMException: DOMException2 - } = require_constants2(); - var { kHeadersList } = require_symbols(); - var EE = __require("events"); - var { Readable, pipeline } = __require("stream"); - var { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = require_util(); - var { dataURLProcessor, serializeAMimeType } = require_dataURL(); - var { TransformStream } = __require("stream/web"); - var { getGlobalDispatcher } = require_global2(); - var { webidl } = require_webidl(); - var { STATUS_CODES } = __require("http"); - var GET_OR_HEAD = ["GET", "HEAD"]; - var resolveObjectURL; - var ReadableStream = globalThis.ReadableStream; - - class Fetch extends EE { - constructor(dispatcher) { - super(); - this.dispatcher = dispatcher; - this.connection = null; - this.dump = false; - this.state = "ongoing"; - this.setMaxListeners(21); - } - terminate(reason) { - if (this.state !== "ongoing") { - return; - } - this.state = "terminated"; - this.connection?.destroy(reason); - this.emit("terminated", reason); - } - abort(error) { - if (this.state !== "ongoing") { - return; - } - this.state = "aborted"; - if (!error) { - error = new DOMException2("The operation was aborted.", "AbortError"); - } - this.serializedAbortReason = error; - this.connection?.destroy(error); - this.emit("terminated", error); - } - } - function fetch(input, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "globalThis.fetch" }); - const p = createDeferredPromise(); - let requestObject; - try { - requestObject = new Request(input, init); - } catch (e) { - p.reject(e); - return p.promise; - } - const request = requestObject[kState]; - if (requestObject.signal.aborted) { - abortFetch(p, request, null, requestObject.signal.reason); - return p.promise; - } - const globalObject = request.client.globalObject; - if (globalObject?.constructor?.name === "ServiceWorkerGlobalScope") { - request.serviceWorkers = "none"; - } - let responseObject = null; - const relevantRealm = null; - let locallyAborted = false; - let controller = null; - addAbortListener(requestObject.signal, () => { - locallyAborted = true; - assert(controller != null); - controller.abort(requestObject.signal.reason); - abortFetch(p, request, responseObject, requestObject.signal.reason); - }); - const handleFetchDone = (response) => finalizeAndReportTiming(response, "fetch"); - const processResponse = (response) => { - if (locallyAborted) { - return Promise.resolve(); - } - if (response.aborted) { - abortFetch(p, request, responseObject, controller.serializedAbortReason); - return Promise.resolve(); - } - if (response.type === "error") { - p.reject(Object.assign(new TypeError("fetch failed"), { cause: response.error })); - return Promise.resolve(); - } - responseObject = new Response; - responseObject[kState] = response; - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = response.headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; - p.resolve(responseObject); - }; - controller = fetching({ - request, - processResponseEndOfBody: handleFetchDone, - processResponse, - dispatcher: init.dispatcher ?? getGlobalDispatcher() - }); - return p.promise; - } - function finalizeAndReportTiming(response, initiatorType = "other") { - if (response.type === "error" && response.aborted) { - return; - } - if (!response.urlList?.length) { - return; - } - const originalURL = response.urlList[0]; - let timingInfo = response.timingInfo; - let cacheState = response.cacheState; - if (!urlIsHttpHttpsScheme(originalURL)) { - return; - } - if (timingInfo === null) { - return; - } - if (!response.timingAllowPassed) { - timingInfo = createOpaqueTimingInfo({ - startTime: timingInfo.startTime - }); - cacheState = ""; - } - timingInfo.endTime = coarsenedSharedCurrentTime(); - response.timingInfo = timingInfo; - markResourceTiming(timingInfo, originalURL, initiatorType, globalThis, cacheState); - } - function markResourceTiming(timingInfo, originalURL, initiatorType, globalThis2, cacheState) { - if (nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 2) { - performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis2, cacheState); - } - } - function abortFetch(p, request, responseObject, error) { - if (!error) { - error = new DOMException2("The operation was aborted.", "AbortError"); - } - p.reject(error); - if (request.body != null && isReadable(request.body?.stream)) { - request.body.stream.cancel(error).catch((err) => { - if (err.code === "ERR_INVALID_STATE") { - return; - } - throw err; - }); - } - if (responseObject == null) { - return; - } - const response = responseObject[kState]; - if (response.body != null && isReadable(response.body?.stream)) { - response.body.stream.cancel(error).catch((err) => { - if (err.code === "ERR_INVALID_STATE") { - return; - } - throw err; - }); - } - } - function fetching({ - request, - processRequestBodyChunkLength, - processRequestEndOfBody, - processResponse, - processResponseEndOfBody, - processResponseConsumeBody, - useParallelQueue = false, - dispatcher - }) { - let taskDestination = null; - let crossOriginIsolatedCapability = false; - if (request.client != null) { - taskDestination = request.client.globalObject; - crossOriginIsolatedCapability = request.client.crossOriginIsolatedCapability; - } - const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); - const timingInfo = createOpaqueTimingInfo({ - startTime: currenTime - }); - const fetchParams = { - controller: new Fetch(dispatcher), - request, - timingInfo, - processRequestBodyChunkLength, - processRequestEndOfBody, - processResponse, - processResponseConsumeBody, - processResponseEndOfBody, - taskDestination, - crossOriginIsolatedCapability - }; - assert(!request.body || request.body.stream); - if (request.window === "client") { - request.window = request.client?.globalObject?.constructor?.name === "Window" ? request.client : "no-window"; - } - if (request.origin === "client") { - request.origin = request.client?.origin; - } - if (request.policyContainer === "client") { - if (request.client != null) { - request.policyContainer = clonePolicyContainer(request.client.policyContainer); - } else { - request.policyContainer = makePolicyContainer(); - } - } - if (!request.headersList.contains("accept")) { - const value = "*/*"; - request.headersList.append("accept", value); - } - if (!request.headersList.contains("accept-language")) { - request.headersList.append("accept-language", "*"); - } - if (request.priority === null) { - } - if (subresourceSet.has(request.destination)) { - } - mainFetch(fetchParams).catch((err) => { - fetchParams.controller.terminate(err); - }); - return fetchParams.controller; - } - async function mainFetch(fetchParams, recursive = false) { - const request = fetchParams.request; - let response = null; - if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { - response = makeNetworkError("local URLs only"); - } - tryUpgradeRequestToAPotentiallyTrustworthyURL(request); - if (requestBadPort(request) === "blocked") { - response = makeNetworkError("bad port"); - } - if (request.referrerPolicy === "") { - request.referrerPolicy = request.policyContainer.referrerPolicy; - } - if (request.referrer !== "no-referrer") { - request.referrer = determineRequestsReferrer(request); - } - if (response === null) { - response = await (async () => { - const currentURL = requestCurrentURL(request); - if (sameOrigin(currentURL, request.url) && request.responseTainting === "basic" || currentURL.protocol === "data:" || (request.mode === "navigate" || request.mode === "websocket")) { - request.responseTainting = "basic"; - return await schemeFetch(fetchParams); - } - if (request.mode === "same-origin") { - return makeNetworkError('request mode cannot be "same-origin"'); - } - if (request.mode === "no-cors") { - if (request.redirect !== "follow") { - return makeNetworkError('redirect mode cannot be "follow" for "no-cors" request'); - } - request.responseTainting = "opaque"; - return await schemeFetch(fetchParams); - } - if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { - return makeNetworkError("URL scheme must be a HTTP(S) scheme"); - } - request.responseTainting = "cors"; - return await httpFetch(fetchParams); - })(); - } - if (recursive) { - return response; - } - if (response.status !== 0 && !response.internalResponse) { - if (request.responseTainting === "cors") { - } - if (request.responseTainting === "basic") { - response = filterResponse(response, "basic"); - } else if (request.responseTainting === "cors") { - response = filterResponse(response, "cors"); - } else if (request.responseTainting === "opaque") { - response = filterResponse(response, "opaque"); - } else { - assert(false); - } - } - let internalResponse = response.status === 0 ? response : response.internalResponse; - if (internalResponse.urlList.length === 0) { - internalResponse.urlList.push(...request.urlList); - } - if (!request.timingAllowFailed) { - response.timingAllowPassed = true; - } - if (response.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request.headers.contains("range")) { - response = internalResponse = makeNetworkError(); - } - if (response.status !== 0 && (request.method === "HEAD" || request.method === "CONNECT" || nullBodyStatus.includes(internalResponse.status))) { - internalResponse.body = null; - fetchParams.controller.dump = true; - } - if (request.integrity) { - const processBodyError = (reason) => fetchFinale(fetchParams, makeNetworkError(reason)); - if (request.responseTainting === "opaque" || response.body == null) { - processBodyError(response.error); - return; - } - const processBody = (bytes) => { - if (!bytesMatch(bytes, request.integrity)) { - processBodyError("integrity mismatch"); - return; - } - response.body = safelyExtractBody(bytes)[0]; - fetchFinale(fetchParams, response); - }; - await fullyReadBody(response.body, processBody, processBodyError); - } else { - fetchFinale(fetchParams, response); - } - } - function schemeFetch(fetchParams) { - if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { - return Promise.resolve(makeAppropriateNetworkError(fetchParams)); - } - const { request } = fetchParams; - const { protocol: scheme } = requestCurrentURL(request); - switch (scheme) { - case "about:": { - return Promise.resolve(makeNetworkError("about scheme is not supported")); - } - case "blob:": { - if (!resolveObjectURL) { - resolveObjectURL = __require("buffer").resolveObjectURL; - } - const blobURLEntry = requestCurrentURL(request); - if (blobURLEntry.search.length !== 0) { - return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource.")); - } - const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()); - if (request.method !== "GET" || !isBlobLike(blobURLEntryObject)) { - return Promise.resolve(makeNetworkError("invalid method")); - } - const bodyWithType = safelyExtractBody(blobURLEntryObject); - const body = bodyWithType[0]; - const length = isomorphicEncode(`${body.length}`); - const type = bodyWithType[1] ?? ""; - const response = makeResponse({ - statusText: "OK", - headersList: [ - ["content-length", { name: "Content-Length", value: length }], - ["content-type", { name: "Content-Type", value: type }] - ] - }); - response.body = body; - return Promise.resolve(response); - } - case "data:": { - const currentURL = requestCurrentURL(request); - const dataURLStruct = dataURLProcessor(currentURL); - if (dataURLStruct === "failure") { - return Promise.resolve(makeNetworkError("failed to fetch the data URL")); - } - const mimeType = serializeAMimeType(dataURLStruct.mimeType); - return Promise.resolve(makeResponse({ - statusText: "OK", - headersList: [ - ["content-type", { name: "Content-Type", value: mimeType }] - ], - body: safelyExtractBody(dataURLStruct.body)[0] - })); - } - case "file:": { - return Promise.resolve(makeNetworkError("not implemented... yet...")); - } - case "http:": - case "https:": { - return httpFetch(fetchParams).catch((err) => makeNetworkError(err)); - } - default: { - return Promise.resolve(makeNetworkError("unknown scheme")); - } - } - } - function finalizeResponse(fetchParams, response) { - fetchParams.request.done = true; - if (fetchParams.processResponseDone != null) { - queueMicrotask(() => fetchParams.processResponseDone(response)); - } - } - function fetchFinale(fetchParams, response) { - if (response.type === "error") { - response.urlList = [fetchParams.request.urlList[0]]; - response.timingInfo = createOpaqueTimingInfo({ - startTime: fetchParams.timingInfo.startTime - }); - } - const processResponseEndOfBody = () => { - fetchParams.request.done = true; - if (fetchParams.processResponseEndOfBody != null) { - queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); - } - }; - if (fetchParams.processResponse != null) { - queueMicrotask(() => fetchParams.processResponse(response)); - } - if (response.body == null) { - processResponseEndOfBody(); - } else { - const identityTransformAlgorithm = (chunk, controller) => { - controller.enqueue(chunk); - }; - const transformStream = new TransformStream({ - start() { - }, - transform: identityTransformAlgorithm, - flush: processResponseEndOfBody - }, { - size() { - return 1; - } - }, { - size() { - return 1; - } - }); - response.body = { stream: response.body.stream.pipeThrough(transformStream) }; - } - if (fetchParams.processResponseConsumeBody != null) { - const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes); - const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure); - if (response.body == null) { - queueMicrotask(() => processBody(null)); - } else { - return fullyReadBody(response.body, processBody, processBodyError); - } - return Promise.resolve(); - } - } - async function httpFetch(fetchParams) { - const request = fetchParams.request; - let response = null; - let actualResponse = null; - const timingInfo = fetchParams.timingInfo; - if (request.serviceWorkers === "all") { - } - if (response === null) { - if (request.redirect === "follow") { - request.serviceWorkers = "none"; - } - actualResponse = response = await httpNetworkOrCacheFetch(fetchParams); - if (request.responseTainting === "cors" && corsCheck(request, response) === "failure") { - return makeNetworkError("cors failure"); - } - if (TAOCheck(request, response) === "failure") { - request.timingAllowFailed = true; - } - } - if ((request.responseTainting === "opaque" || response.type === "opaque") && crossOriginResourcePolicyCheck(request.origin, request.client, request.destination, actualResponse) === "blocked") { - return makeNetworkError("blocked"); - } - if (redirectStatusSet.has(actualResponse.status)) { - if (request.redirect !== "manual") { - fetchParams.controller.connection.destroy(); - } - if (request.redirect === "error") { - response = makeNetworkError("unexpected redirect"); - } else if (request.redirect === "manual") { - response = actualResponse; - } else if (request.redirect === "follow") { - response = await httpRedirectFetch(fetchParams, response); - } else { - assert(false); - } - } - response.timingInfo = timingInfo; - return response; - } - function httpRedirectFetch(fetchParams, response) { - const request = fetchParams.request; - const actualResponse = response.internalResponse ? response.internalResponse : response; - let locationURL; - try { - locationURL = responseLocationURL(actualResponse, requestCurrentURL(request).hash); - if (locationURL == null) { - return response; - } - } catch (err) { - return Promise.resolve(makeNetworkError(err)); - } - if (!urlIsHttpHttpsScheme(locationURL)) { - return Promise.resolve(makeNetworkError("URL scheme must be a HTTP(S) scheme")); - } - if (request.redirectCount === 20) { - return Promise.resolve(makeNetworkError("redirect count exceeded")); - } - request.redirectCount += 1; - if (request.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request, locationURL)) { - return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"')); - } - if (request.responseTainting === "cors" && (locationURL.username || locationURL.password)) { - return Promise.resolve(makeNetworkError('URL cannot contain credentials for request mode "cors"')); - } - if (actualResponse.status !== 303 && request.body != null && request.body.source == null) { - return Promise.resolve(makeNetworkError()); - } - if ([301, 302].includes(actualResponse.status) && request.method === "POST" || actualResponse.status === 303 && !GET_OR_HEAD.includes(request.method)) { - request.method = "GET"; - request.body = null; - for (const headerName of requestBodyHeader) { - request.headersList.delete(headerName); - } - } - if (!sameOrigin(requestCurrentURL(request), locationURL)) { - request.headersList.delete("authorization"); - request.headersList.delete("proxy-authorization", true); - request.headersList.delete("cookie"); - request.headersList.delete("host"); - } - if (request.body != null) { - assert(request.body.source != null); - request.body = safelyExtractBody(request.body.source)[0]; - } - const timingInfo = fetchParams.timingInfo; - timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); - if (timingInfo.redirectStartTime === 0) { - timingInfo.redirectStartTime = timingInfo.startTime; - } - request.urlList.push(locationURL); - setRequestReferrerPolicyOnRedirect(request, actualResponse); - return mainFetch(fetchParams, true); - } - async function httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch = false, isNewConnectionFetch = false) { - const request = fetchParams.request; - let httpFetchParams = null; - let httpRequest = null; - let response = null; - const httpCache = null; - const revalidatingFlag = false; - if (request.window === "no-window" && request.redirect === "error") { - httpFetchParams = fetchParams; - httpRequest = request; - } else { - httpRequest = makeRequest(request); - httpFetchParams = { ...fetchParams }; - httpFetchParams.request = httpRequest; - } - const includeCredentials = request.credentials === "include" || request.credentials === "same-origin" && request.responseTainting === "basic"; - const contentLength = httpRequest.body ? httpRequest.body.length : null; - let contentLengthHeaderValue = null; - if (httpRequest.body == null && ["POST", "PUT"].includes(httpRequest.method)) { - contentLengthHeaderValue = "0"; - } - if (contentLength != null) { - contentLengthHeaderValue = isomorphicEncode(`${contentLength}`); - } - if (contentLengthHeaderValue != null) { - httpRequest.headersList.append("content-length", contentLengthHeaderValue); - } - if (contentLength != null && httpRequest.keepalive) { - } - if (httpRequest.referrer instanceof URL) { - httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href)); - } - appendRequestOriginHeader(httpRequest); - appendFetchMetadata(httpRequest); - if (!httpRequest.headersList.contains("user-agent")) { - httpRequest.headersList.append("user-agent", typeof esbuildDetection === "undefined" ? "undici" : "node"); - } - if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since") || httpRequest.headersList.contains("if-none-match") || httpRequest.headersList.contains("if-unmodified-since") || httpRequest.headersList.contains("if-match") || httpRequest.headersList.contains("if-range"))) { - httpRequest.cache = "no-store"; - } - if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.contains("cache-control")) { - httpRequest.headersList.append("cache-control", "max-age=0"); - } - if (httpRequest.cache === "no-store" || httpRequest.cache === "reload") { - if (!httpRequest.headersList.contains("pragma")) { - httpRequest.headersList.append("pragma", "no-cache"); - } - if (!httpRequest.headersList.contains("cache-control")) { - httpRequest.headersList.append("cache-control", "no-cache"); - } - } - if (httpRequest.headersList.contains("range")) { - httpRequest.headersList.append("accept-encoding", "identity"); - } - if (!httpRequest.headersList.contains("accept-encoding")) { - if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { - httpRequest.headersList.append("accept-encoding", "br, gzip, deflate"); - } else { - httpRequest.headersList.append("accept-encoding", "gzip, deflate"); - } - } - httpRequest.headersList.delete("host"); - if (includeCredentials) { - } - if (httpCache == null) { - httpRequest.cache = "no-store"; - } - if (httpRequest.mode !== "no-store" && httpRequest.mode !== "reload") { - } - if (response == null) { - if (httpRequest.mode === "only-if-cached") { - return makeNetworkError("only if cached"); - } - const forwardResponse = await httpNetworkFetch(httpFetchParams, includeCredentials, isNewConnectionFetch); - if (!safeMethodsSet.has(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) { - } - if (revalidatingFlag && forwardResponse.status === 304) { - } - if (response == null) { - response = forwardResponse; - } - } - response.urlList = [...httpRequest.urlList]; - if (httpRequest.headersList.contains("range")) { - response.rangeRequested = true; - } - response.requestIncludesCredentials = includeCredentials; - if (response.status === 407) { - if (request.window === "no-window") { - return makeNetworkError(); - } - if (isCancelled(fetchParams)) { - return makeAppropriateNetworkError(fetchParams); - } - return makeNetworkError("proxy authentication required"); - } - if (response.status === 421 && !isNewConnectionFetch && (request.body == null || request.body.source != null)) { - if (isCancelled(fetchParams)) { - return makeAppropriateNetworkError(fetchParams); - } - fetchParams.controller.connection.destroy(); - response = await httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch, true); - } - if (isAuthenticationFetch) { - } - return response; - } - async function httpNetworkFetch(fetchParams, includeCredentials = false, forceNewConnection = false) { - assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed); - fetchParams.controller.connection = { - abort: null, - destroyed: false, - destroy(err) { - if (!this.destroyed) { - this.destroyed = true; - this.abort?.(err ?? new DOMException2("The operation was aborted.", "AbortError")); - } - } - }; - const request = fetchParams.request; - let response = null; - const timingInfo = fetchParams.timingInfo; - const httpCache = null; - if (httpCache == null) { - request.cache = "no-store"; - } - const newConnection = forceNewConnection ? "yes" : "no"; - if (request.mode === "websocket") { - } else { - } - let requestBody = null; - if (request.body == null && fetchParams.processRequestEndOfBody) { - queueMicrotask(() => fetchParams.processRequestEndOfBody()); - } else if (request.body != null) { - const processBodyChunk = async function* (bytes) { - if (isCancelled(fetchParams)) { - return; - } - yield bytes; - fetchParams.processRequestBodyChunkLength?.(bytes.byteLength); - }; - const processEndOfBody = () => { - if (isCancelled(fetchParams)) { - return; - } - if (fetchParams.processRequestEndOfBody) { - fetchParams.processRequestEndOfBody(); - } - }; - const processBodyError = (e) => { - if (isCancelled(fetchParams)) { - return; - } - if (e.name === "AbortError") { - fetchParams.controller.abort(); - } else { - fetchParams.controller.terminate(e); - } - }; - requestBody = async function* () { - try { - for await (const bytes of request.body.stream) { - yield* processBodyChunk(bytes); - } - processEndOfBody(); - } catch (err) { - processBodyError(err); - } - }(); - } - try { - const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody }); - if (socket) { - response = makeResponse({ status, statusText, headersList, socket }); - } else { - const iterator = body[Symbol.asyncIterator](); - fetchParams.controller.next = () => iterator.next(); - response = makeResponse({ status, statusText, headersList }); - } - } catch (err) { - if (err.name === "AbortError") { - fetchParams.controller.connection.destroy(); - return makeAppropriateNetworkError(fetchParams, err); - } - return makeNetworkError(err); - } - const pullAlgorithm = () => { - fetchParams.controller.resume(); - }; - const cancelAlgorithm = (reason) => { - fetchParams.controller.abort(reason); - }; - if (!ReadableStream) { - ReadableStream = __require("stream/web").ReadableStream; - } - const stream = new ReadableStream({ - async start(controller) { - fetchParams.controller.controller = controller; - }, - async pull(controller) { - await pullAlgorithm(controller); - }, - async cancel(reason) { - await cancelAlgorithm(reason); - } - }, { - highWaterMark: 0, - size() { - return 1; - } - }); - response.body = { stream }; - fetchParams.controller.on("terminated", onAborted); - fetchParams.controller.resume = async () => { - while (true) { - let bytes; - let isFailure; - try { - const { done, value } = await fetchParams.controller.next(); - if (isAborted(fetchParams)) { - break; - } - bytes = done ? undefined : value; - } catch (err) { - if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { - bytes = undefined; - } else { - bytes = err; - isFailure = true; - } - } - if (bytes === undefined) { - readableStreamClose(fetchParams.controller.controller); - finalizeResponse(fetchParams, response); - return; - } - timingInfo.decodedBodySize += bytes?.byteLength ?? 0; - if (isFailure) { - fetchParams.controller.terminate(bytes); - return; - } - fetchParams.controller.controller.enqueue(new Uint8Array(bytes)); - if (isErrored(stream)) { - fetchParams.controller.terminate(); - return; - } - if (!fetchParams.controller.controller.desiredSize) { - return; - } - } - }; - function onAborted(reason) { - if (isAborted(fetchParams)) { - response.aborted = true; - if (isReadable(stream)) { - fetchParams.controller.controller.error(fetchParams.controller.serializedAbortReason); - } - } else { - if (isReadable(stream)) { - fetchParams.controller.controller.error(new TypeError("terminated", { - cause: isErrorLike(reason) ? reason : undefined - })); - } - } - fetchParams.controller.connection.destroy(); - } - return response; - async function dispatch({ body }) { - const url = requestCurrentURL(request); - const agent = fetchParams.controller.dispatcher; - return new Promise((resolve, reject) => agent.dispatch({ - path: url.pathname + url.search, - origin: url.origin, - method: request.method, - body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body, - headers: request.headersList.entries, - maxRedirections: 0, - upgrade: request.mode === "websocket" ? "websocket" : undefined - }, { - body: null, - abort: null, - onConnect(abort) { - const { connection } = fetchParams.controller; - if (connection.destroyed) { - abort(new DOMException2("The operation was aborted.", "AbortError")); - } else { - fetchParams.controller.on("terminated", abort); - this.abort = connection.abort = abort; - } - }, - onHeaders(status, headersList, resume, statusText) { - if (status < 200) { - return; - } - let codings = []; - let location = ""; - const headers = new Headers; - if (Array.isArray(headersList)) { - for (let n = 0;n < headersList.length; n += 2) { - const key = headersList[n + 0].toString("latin1"); - const val = headersList[n + 1].toString("latin1"); - if (key.toLowerCase() === "content-encoding") { - codings = val.toLowerCase().split(",").map((x) => x.trim()); - } else if (key.toLowerCase() === "location") { - location = val; - } - headers[kHeadersList].append(key, val); - } - } else { - const keys = Object.keys(headersList); - for (const key of keys) { - const val = headersList[key]; - if (key.toLowerCase() === "content-encoding") { - codings = val.toLowerCase().split(",").map((x) => x.trim()).reverse(); - } else if (key.toLowerCase() === "location") { - location = val; - } - headers[kHeadersList].append(key, val); - } - } - this.body = new Readable({ read: resume }); - const decoders = []; - const willFollow = request.redirect === "follow" && location && redirectStatusSet.has(status); - if (request.method !== "HEAD" && request.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) { - for (const coding of codings) { - if (coding === "x-gzip" || coding === "gzip") { - decoders.push(zlib.createGunzip({ - flush: zlib.constants.Z_SYNC_FLUSH, - finishFlush: zlib.constants.Z_SYNC_FLUSH - })); - } else if (coding === "deflate") { - decoders.push(zlib.createInflate()); - } else if (coding === "br") { - decoders.push(zlib.createBrotliDecompress()); - } else { - decoders.length = 0; - break; - } - } - } - resolve({ - status, - statusText, - headersList: headers[kHeadersList], - body: decoders.length ? pipeline(this.body, ...decoders, () => { - }) : this.body.on("error", () => { - }) - }); - return true; - }, - onData(chunk) { - if (fetchParams.controller.dump) { - return; - } - const bytes = chunk; - timingInfo.encodedBodySize += bytes.byteLength; - return this.body.push(bytes); - }, - onComplete() { - if (this.abort) { - fetchParams.controller.off("terminated", this.abort); - } - fetchParams.controller.ended = true; - this.body.push(null); - }, - onError(error) { - if (this.abort) { - fetchParams.controller.off("terminated", this.abort); - } - this.body?.destroy(error); - fetchParams.controller.terminate(error); - reject(error); - }, - onUpgrade(status, headersList, socket) { - if (status !== 101) { - return; - } - const headers = new Headers; - for (let n = 0;n < headersList.length; n += 2) { - const key = headersList[n + 0].toString("latin1"); - const val = headersList[n + 1].toString("latin1"); - headers[kHeadersList].append(key, val); - } - resolve({ - status, - statusText: STATUS_CODES[status], - headersList: headers[kHeadersList], - socket - }); - return true; - } - })); - } - } - module.exports = { - fetch, - Fetch, - fetching, - finalizeAndReportTiming - }; -}); - -// ../node_modules/undici/lib/fileapi/symbols.js -var require_symbols3 = __commonJS((exports, module) => { - module.exports = { - kState: Symbol("FileReader state"), - kResult: Symbol("FileReader result"), - kError: Symbol("FileReader error"), - kLastProgressEventFired: Symbol("FileReader last progress event fired timestamp"), - kEvents: Symbol("FileReader events"), - kAborted: Symbol("FileReader aborted") - }; -}); - -// ../node_modules/undici/lib/fileapi/progressevent.js -var require_progressevent = __commonJS((exports, module) => { - var { webidl } = require_webidl(); - var kState = Symbol("ProgressEvent state"); - - class ProgressEvent extends Event { - constructor(type, eventInitDict = {}) { - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}); - super(type, eventInitDict); - this[kState] = { - lengthComputable: eventInitDict.lengthComputable, - loaded: eventInitDict.loaded, - total: eventInitDict.total - }; - } - get lengthComputable() { - webidl.brandCheck(this, ProgressEvent); - return this[kState].lengthComputable; - } - get loaded() { - webidl.brandCheck(this, ProgressEvent); - return this[kState].loaded; - } - get total() { - webidl.brandCheck(this, ProgressEvent); - return this[kState].total; - } - } - webidl.converters.ProgressEventInit = webidl.dictionaryConverter([ - { - key: "lengthComputable", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "loaded", - converter: webidl.converters["unsigned long long"], - defaultValue: 0 - }, - { - key: "total", - converter: webidl.converters["unsigned long long"], - defaultValue: 0 - }, - { - key: "bubbles", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "cancelable", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "composed", - converter: webidl.converters.boolean, - defaultValue: false - } - ]); - module.exports = { - ProgressEvent - }; -}); - -// ../node_modules/undici/lib/fileapi/encoding.js -var require_encoding = __commonJS((exports, module) => { - function getEncoding(label) { - if (!label) { - return "failure"; - } - switch (label.trim().toLowerCase()) { - case "unicode-1-1-utf-8": - case "unicode11utf8": - case "unicode20utf8": - case "utf-8": - case "utf8": - case "x-unicode20utf8": - return "UTF-8"; - case "866": - case "cp866": - case "csibm866": - case "ibm866": - return "IBM866"; - case "csisolatin2": - case "iso-8859-2": - case "iso-ir-101": - case "iso8859-2": - case "iso88592": - case "iso_8859-2": - case "iso_8859-2:1987": - case "l2": - case "latin2": - return "ISO-8859-2"; - case "csisolatin3": - case "iso-8859-3": - case "iso-ir-109": - case "iso8859-3": - case "iso88593": - case "iso_8859-3": - case "iso_8859-3:1988": - case "l3": - case "latin3": - return "ISO-8859-3"; - case "csisolatin4": - case "iso-8859-4": - case "iso-ir-110": - case "iso8859-4": - case "iso88594": - case "iso_8859-4": - case "iso_8859-4:1988": - case "l4": - case "latin4": - return "ISO-8859-4"; - case "csisolatincyrillic": - case "cyrillic": - case "iso-8859-5": - case "iso-ir-144": - case "iso8859-5": - case "iso88595": - case "iso_8859-5": - case "iso_8859-5:1988": - return "ISO-8859-5"; - case "arabic": - case "asmo-708": - case "csiso88596e": - case "csiso88596i": - case "csisolatinarabic": - case "ecma-114": - case "iso-8859-6": - case "iso-8859-6-e": - case "iso-8859-6-i": - case "iso-ir-127": - case "iso8859-6": - case "iso88596": - case "iso_8859-6": - case "iso_8859-6:1987": - return "ISO-8859-6"; - case "csisolatingreek": - case "ecma-118": - case "elot_928": - case "greek": - case "greek8": - case "iso-8859-7": - case "iso-ir-126": - case "iso8859-7": - case "iso88597": - case "iso_8859-7": - case "iso_8859-7:1987": - case "sun_eu_greek": - return "ISO-8859-7"; - case "csiso88598e": - case "csisolatinhebrew": - case "hebrew": - case "iso-8859-8": - case "iso-8859-8-e": - case "iso-ir-138": - case "iso8859-8": - case "iso88598": - case "iso_8859-8": - case "iso_8859-8:1988": - case "visual": - return "ISO-8859-8"; - case "csiso88598i": - case "iso-8859-8-i": - case "logical": - return "ISO-8859-8-I"; - case "csisolatin6": - case "iso-8859-10": - case "iso-ir-157": - case "iso8859-10": - case "iso885910": - case "l6": - case "latin6": - return "ISO-8859-10"; - case "iso-8859-13": - case "iso8859-13": - case "iso885913": - return "ISO-8859-13"; - case "iso-8859-14": - case "iso8859-14": - case "iso885914": - return "ISO-8859-14"; - case "csisolatin9": - case "iso-8859-15": - case "iso8859-15": - case "iso885915": - case "iso_8859-15": - case "l9": - return "ISO-8859-15"; - case "iso-8859-16": - return "ISO-8859-16"; - case "cskoi8r": - case "koi": - case "koi8": - case "koi8-r": - case "koi8_r": - return "KOI8-R"; - case "koi8-ru": - case "koi8-u": - return "KOI8-U"; - case "csmacintosh": - case "mac": - case "macintosh": - case "x-mac-roman": - return "macintosh"; - case "iso-8859-11": - case "iso8859-11": - case "iso885911": - case "tis-620": - case "windows-874": - return "windows-874"; - case "cp1250": - case "windows-1250": - case "x-cp1250": - return "windows-1250"; - case "cp1251": - case "windows-1251": - case "x-cp1251": - return "windows-1251"; - case "ansi_x3.4-1968": - case "ascii": - case "cp1252": - case "cp819": - case "csisolatin1": - case "ibm819": - case "iso-8859-1": - case "iso-ir-100": - case "iso8859-1": - case "iso88591": - case "iso_8859-1": - case "iso_8859-1:1987": - case "l1": - case "latin1": - case "us-ascii": - case "windows-1252": - case "x-cp1252": - return "windows-1252"; - case "cp1253": - case "windows-1253": - case "x-cp1253": - return "windows-1253"; - case "cp1254": - case "csisolatin5": - case "iso-8859-9": - case "iso-ir-148": - case "iso8859-9": - case "iso88599": - case "iso_8859-9": - case "iso_8859-9:1989": - case "l5": - case "latin5": - case "windows-1254": - case "x-cp1254": - return "windows-1254"; - case "cp1255": - case "windows-1255": - case "x-cp1255": - return "windows-1255"; - case "cp1256": - case "windows-1256": - case "x-cp1256": - return "windows-1256"; - case "cp1257": - case "windows-1257": - case "x-cp1257": - return "windows-1257"; - case "cp1258": - case "windows-1258": - case "x-cp1258": - return "windows-1258"; - case "x-mac-cyrillic": - case "x-mac-ukrainian": - return "x-mac-cyrillic"; - case "chinese": - case "csgb2312": - case "csiso58gb231280": - case "gb2312": - case "gb_2312": - case "gb_2312-80": - case "gbk": - case "iso-ir-58": - case "x-gbk": - return "GBK"; - case "gb18030": - return "gb18030"; - case "big5": - case "big5-hkscs": - case "cn-big5": - case "csbig5": - case "x-x-big5": - return "Big5"; - case "cseucpkdfmtjapanese": - case "euc-jp": - case "x-euc-jp": - return "EUC-JP"; - case "csiso2022jp": - case "iso-2022-jp": - return "ISO-2022-JP"; - case "csshiftjis": - case "ms932": - case "ms_kanji": - case "shift-jis": - case "shift_jis": - case "sjis": - case "windows-31j": - case "x-sjis": - return "Shift_JIS"; - case "cseuckr": - case "csksc56011987": - case "euc-kr": - case "iso-ir-149": - case "korean": - case "ks_c_5601-1987": - case "ks_c_5601-1989": - case "ksc5601": - case "ksc_5601": - case "windows-949": - return "EUC-KR"; - case "csiso2022kr": - case "hz-gb-2312": - case "iso-2022-cn": - case "iso-2022-cn-ext": - case "iso-2022-kr": - case "replacement": - return "replacement"; - case "unicodefffe": - case "utf-16be": - return "UTF-16BE"; - case "csunicode": - case "iso-10646-ucs-2": - case "ucs-2": - case "unicode": - case "unicodefeff": - case "utf-16": - case "utf-16le": - return "UTF-16LE"; - case "x-user-defined": - return "x-user-defined"; - default: - return "failure"; - } - } - module.exports = { - getEncoding - }; -}); - -// ../node_modules/undici/lib/fileapi/util.js -var require_util4 = __commonJS((exports, module) => { - var { - kState, - kError, - kResult, - kAborted, - kLastProgressEventFired - } = require_symbols3(); - var { ProgressEvent } = require_progressevent(); - var { getEncoding } = require_encoding(); - var { DOMException: DOMException2 } = require_constants2(); - var { serializeAMimeType, parseMIMEType } = require_dataURL(); - var { types } = __require("util"); - var { StringDecoder } = __require("string_decoder"); - var { btoa } = __require("buffer"); - var staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false - }; - function readOperation(fr, blob, type, encodingName) { - if (fr[kState] === "loading") { - throw new DOMException2("Invalid state", "InvalidStateError"); - } - fr[kState] = "loading"; - fr[kResult] = null; - fr[kError] = null; - const stream = blob.stream(); - const reader = stream.getReader(); - const bytes = []; - let chunkPromise = reader.read(); - let isFirstChunk = true; - (async () => { - while (!fr[kAborted]) { - try { - const { done, value } = await chunkPromise; - if (isFirstChunk && !fr[kAborted]) { - queueMicrotask(() => { - fireAProgressEvent("loadstart", fr); - }); - } - isFirstChunk = false; - if (!done && types.isUint8Array(value)) { - bytes.push(value); - if ((fr[kLastProgressEventFired] === undefined || Date.now() - fr[kLastProgressEventFired] >= 50) && !fr[kAborted]) { - fr[kLastProgressEventFired] = Date.now(); - queueMicrotask(() => { - fireAProgressEvent("progress", fr); - }); - } - chunkPromise = reader.read(); - } else if (done) { - queueMicrotask(() => { - fr[kState] = "done"; - try { - const result = packageData(bytes, type, blob.type, encodingName); - if (fr[kAborted]) { - return; - } - fr[kResult] = result; - fireAProgressEvent("load", fr); - } catch (error) { - fr[kError] = error; - fireAProgressEvent("error", fr); - } - if (fr[kState] !== "loading") { - fireAProgressEvent("loadend", fr); - } - }); - break; - } - } catch (error) { - if (fr[kAborted]) { - return; - } - queueMicrotask(() => { - fr[kState] = "done"; - fr[kError] = error; - fireAProgressEvent("error", fr); - if (fr[kState] !== "loading") { - fireAProgressEvent("loadend", fr); - } - }); - break; - } - } - })(); - } - function fireAProgressEvent(e, reader) { - const event = new ProgressEvent(e, { - bubbles: false, - cancelable: false - }); - reader.dispatchEvent(event); - } - function packageData(bytes, type, mimeType, encodingName) { - switch (type) { - case "DataURL": { - let dataURL = "data:"; - const parsed = parseMIMEType(mimeType || "application/octet-stream"); - if (parsed !== "failure") { - dataURL += serializeAMimeType(parsed); - } - dataURL += ";base64,"; - const decoder = new StringDecoder("latin1"); - for (const chunk of bytes) { - dataURL += btoa(decoder.write(chunk)); - } - dataURL += btoa(decoder.end()); - return dataURL; - } - case "Text": { - let encoding = "failure"; - if (encodingName) { - encoding = getEncoding(encodingName); - } - if (encoding === "failure" && mimeType) { - const type2 = parseMIMEType(mimeType); - if (type2 !== "failure") { - encoding = getEncoding(type2.parameters.get("charset")); - } - } - if (encoding === "failure") { - encoding = "UTF-8"; - } - return decode(bytes, encoding); - } - case "ArrayBuffer": { - const sequence = combineByteSequences(bytes); - return sequence.buffer; - } - case "BinaryString": { - let binaryString = ""; - const decoder = new StringDecoder("latin1"); - for (const chunk of bytes) { - binaryString += decoder.write(chunk); - } - binaryString += decoder.end(); - return binaryString; - } - } - } - function decode(ioQueue, encoding) { - const bytes = combineByteSequences(ioQueue); - const BOMEncoding = BOMSniffing(bytes); - let slice = 0; - if (BOMEncoding !== null) { - encoding = BOMEncoding; - slice = BOMEncoding === "UTF-8" ? 3 : 2; - } - const sliced = bytes.slice(slice); - return new TextDecoder(encoding).decode(sliced); - } - function BOMSniffing(ioQueue) { - const [a, b, c] = ioQueue; - if (a === 239 && b === 187 && c === 191) { - return "UTF-8"; - } else if (a === 254 && b === 255) { - return "UTF-16BE"; - } else if (a === 255 && b === 254) { - return "UTF-16LE"; - } - return null; - } - function combineByteSequences(sequences) { - const size = sequences.reduce((a, b) => { - return a + b.byteLength; - }, 0); - let offset = 0; - return sequences.reduce((a, b) => { - a.set(b, offset); - offset += b.byteLength; - return a; - }, new Uint8Array(size)); - } - module.exports = { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent - }; -}); - -// ../node_modules/undici/lib/fileapi/filereader.js -var require_filereader = __commonJS((exports, module) => { - var { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent - } = require_util4(); - var { - kState, - kError, - kResult, - kEvents, - kAborted - } = require_symbols3(); - var { webidl } = require_webidl(); - var { kEnumerableProperty } = require_util(); - - class FileReader extends EventTarget { - constructor() { - super(); - this[kState] = "empty"; - this[kResult] = null; - this[kError] = null; - this[kEvents] = { - loadend: null, - error: null, - abort: null, - load: null, - progress: null, - loadstart: null - }; - } - readAsArrayBuffer(blob) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsArrayBuffer" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "ArrayBuffer"); - } - readAsBinaryString(blob) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsBinaryString" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "BinaryString"); - } - readAsText(blob, encoding = undefined) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsText" }); - blob = webidl.converters.Blob(blob, { strict: false }); - if (encoding !== undefined) { - encoding = webidl.converters.DOMString(encoding); - } - readOperation(this, blob, "Text", encoding); - } - readAsDataURL(blob) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsDataURL" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "DataURL"); - } - abort() { - if (this[kState] === "empty" || this[kState] === "done") { - this[kResult] = null; - return; - } - if (this[kState] === "loading") { - this[kState] = "done"; - this[kResult] = null; - } - this[kAborted] = true; - fireAProgressEvent("abort", this); - if (this[kState] !== "loading") { - fireAProgressEvent("loadend", this); - } - } - get readyState() { - webidl.brandCheck(this, FileReader); - switch (this[kState]) { - case "empty": - return this.EMPTY; - case "loading": - return this.LOADING; - case "done": - return this.DONE; - } - } - get result() { - webidl.brandCheck(this, FileReader); - return this[kResult]; - } - get error() { - webidl.brandCheck(this, FileReader); - return this[kError]; - } - get onloadend() { - webidl.brandCheck(this, FileReader); - return this[kEvents].loadend; - } - set onloadend(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].loadend) { - this.removeEventListener("loadend", this[kEvents].loadend); - } - if (typeof fn === "function") { - this[kEvents].loadend = fn; - this.addEventListener("loadend", fn); - } else { - this[kEvents].loadend = null; - } - } - get onerror() { - webidl.brandCheck(this, FileReader); - return this[kEvents].error; - } - set onerror(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].error) { - this.removeEventListener("error", this[kEvents].error); - } - if (typeof fn === "function") { - this[kEvents].error = fn; - this.addEventListener("error", fn); - } else { - this[kEvents].error = null; - } - } - get onloadstart() { - webidl.brandCheck(this, FileReader); - return this[kEvents].loadstart; - } - set onloadstart(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].loadstart) { - this.removeEventListener("loadstart", this[kEvents].loadstart); - } - if (typeof fn === "function") { - this[kEvents].loadstart = fn; - this.addEventListener("loadstart", fn); - } else { - this[kEvents].loadstart = null; - } - } - get onprogress() { - webidl.brandCheck(this, FileReader); - return this[kEvents].progress; - } - set onprogress(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].progress) { - this.removeEventListener("progress", this[kEvents].progress); - } - if (typeof fn === "function") { - this[kEvents].progress = fn; - this.addEventListener("progress", fn); - } else { - this[kEvents].progress = null; - } - } - get onload() { - webidl.brandCheck(this, FileReader); - return this[kEvents].load; - } - set onload(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].load) { - this.removeEventListener("load", this[kEvents].load); - } - if (typeof fn === "function") { - this[kEvents].load = fn; - this.addEventListener("load", fn); - } else { - this[kEvents].load = null; - } - } - get onabort() { - webidl.brandCheck(this, FileReader); - return this[kEvents].abort; - } - set onabort(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].abort) { - this.removeEventListener("abort", this[kEvents].abort); - } - if (typeof fn === "function") { - this[kEvents].abort = fn; - this.addEventListener("abort", fn); - } else { - this[kEvents].abort = null; - } - } - } - FileReader.EMPTY = FileReader.prototype.EMPTY = 0; - FileReader.LOADING = FileReader.prototype.LOADING = 1; - FileReader.DONE = FileReader.prototype.DONE = 2; - Object.defineProperties(FileReader.prototype, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors, - readAsArrayBuffer: kEnumerableProperty, - readAsBinaryString: kEnumerableProperty, - readAsText: kEnumerableProperty, - readAsDataURL: kEnumerableProperty, - abort: kEnumerableProperty, - readyState: kEnumerableProperty, - result: kEnumerableProperty, - error: kEnumerableProperty, - onloadstart: kEnumerableProperty, - onprogress: kEnumerableProperty, - onload: kEnumerableProperty, - onabort: kEnumerableProperty, - onerror: kEnumerableProperty, - onloadend: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "FileReader", - writable: false, - enumerable: false, - configurable: true - } - }); - Object.defineProperties(FileReader, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors - }); - module.exports = { - FileReader - }; -}); - -// ../node_modules/undici/lib/cache/symbols.js -var require_symbols4 = __commonJS((exports, module) => { - module.exports = { - kConstruct: require_symbols().kConstruct - }; -}); - -// ../node_modules/undici/lib/cache/util.js -var require_util5 = __commonJS((exports, module) => { - var assert = __require("assert"); - var { URLSerializer } = require_dataURL(); - var { isValidHeaderName } = require_util2(); - function urlEquals(A, B, excludeFragment = false) { - const serializedA = URLSerializer(A, excludeFragment); - const serializedB = URLSerializer(B, excludeFragment); - return serializedA === serializedB; - } - function fieldValues(header) { - assert(header !== null); - const values = []; - for (let value of header.split(",")) { - value = value.trim(); - if (!value.length) { - continue; - } else if (!isValidHeaderName(value)) { - continue; - } - values.push(value); - } - return values; - } - module.exports = { - urlEquals, - fieldValues - }; -}); - -// ../node_modules/undici/lib/cache/cache.js -var require_cache = __commonJS((exports, module) => { - var { kConstruct } = require_symbols4(); - var { urlEquals, fieldValues: getFieldValues } = require_util5(); - var { kEnumerableProperty, isDisturbed } = require_util(); - var { kHeadersList } = require_symbols(); - var { webidl } = require_webidl(); - var { Response, cloneResponse } = require_response(); - var { Request } = require_request2(); - var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); - var { fetching } = require_fetch(); - var { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require_util2(); - var assert = __require("assert"); - var { getGlobalDispatcher } = require_global2(); - - class Cache { - #relevantRequestResponseList; - constructor() { - if (arguments[0] !== kConstruct) { - webidl.illegalConstructor(); - } - this.#relevantRequestResponseList = arguments[1]; - } - async match(request, options = {}) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.match" }); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); - const p = await this.matchAll(request, options); - if (p.length === 0) { - return; - } - return p[0]; - } - async matchAll(request = undefined, options = {}) { - webidl.brandCheck(this, Cache); - if (request !== undefined) - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); - let r = null; - if (request !== undefined) { - if (request instanceof Request) { - r = request[kState]; - if (r.method !== "GET" && !options.ignoreMethod) { - return []; - } - } else if (typeof request === "string") { - r = new Request(request)[kState]; - } - } - const responses = []; - if (request === undefined) { - for (const requestResponse of this.#relevantRequestResponseList) { - responses.push(requestResponse[1]); - } - } else { - const requestResponses = this.#queryCache(r, options); - for (const requestResponse of requestResponses) { - responses.push(requestResponse[1]); - } - } - const responseList = []; - for (const response of responses) { - const responseObject = new Response(response.body?.source ?? null); - const body = responseObject[kState].body; - responseObject[kState] = response; - responseObject[kState].body = body; - responseObject[kHeaders][kHeadersList] = response.headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseList.push(responseObject); - } - return Object.freeze(responseList); - } - async add(request) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.add" }); - request = webidl.converters.RequestInfo(request); - const requests = [request]; - const responseArrayPromise = this.addAll(requests); - return await responseArrayPromise; - } - async addAll(requests) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.addAll" }); - requests = webidl.converters["sequence"](requests); - const responsePromises = []; - const requestList = []; - for (const request of requests) { - if (typeof request === "string") { - continue; - } - const r = request[kState]; - if (!urlIsHttpHttpsScheme(r.url) || r.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.addAll", - message: "Expected http/s scheme when method is not GET." - }); - } - } - const fetchControllers = []; - for (const request of requests) { - const r = new Request(request)[kState]; - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: "Cache.addAll", - message: "Expected http/s scheme." - }); - } - r.initiator = "fetch"; - r.destination = "subresource"; - requestList.push(r); - const responsePromise = createDeferredPromise(); - fetchControllers.push(fetching({ - request: r, - dispatcher: getGlobalDispatcher(), - processResponse(response) { - if (response.type === "error" || response.status === 206 || response.status < 200 || response.status > 299) { - responsePromise.reject(webidl.errors.exception({ - header: "Cache.addAll", - message: "Received an invalid status code or the request failed." - })); - } else if (response.headersList.contains("vary")) { - const fieldValues = getFieldValues(response.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - responsePromise.reject(webidl.errors.exception({ - header: "Cache.addAll", - message: "invalid vary field value" - })); - for (const controller of fetchControllers) { - controller.abort(); - } - return; - } - } - } - }, - processResponseEndOfBody(response) { - if (response.aborted) { - responsePromise.reject(new DOMException("aborted", "AbortError")); - return; - } - responsePromise.resolve(response); - } - })); - responsePromises.push(responsePromise.promise); - } - const p = Promise.all(responsePromises); - const responses = await p; - const operations = []; - let index = 0; - for (const response of responses) { - const operation = { - type: "put", - request: requestList[index], - response - }; - operations.push(operation); - index++; - } - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - try { - this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; - } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(undefined); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; - } - async put(request, response) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 2, { header: "Cache.put" }); - request = webidl.converters.RequestInfo(request); - response = webidl.converters.Response(response); - let innerRequest = null; - if (request instanceof Request) { - innerRequest = request[kState]; - } else { - innerRequest = new Request(request)[kState]; - } - if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Expected an http/s scheme when method is not GET" - }); - } - const innerResponse = response[kState]; - if (innerResponse.status === 206) { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Got 206 status" - }); - } - if (innerResponse.headersList.contains("vary")) { - const fieldValues = getFieldValues(innerResponse.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Got * vary field value" - }); - } - } - } - if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Response body is locked or disturbed" - }); - } - const clonedResponse = cloneResponse(innerResponse); - const bodyReadPromise = createDeferredPromise(); - if (innerResponse.body != null) { - const stream = innerResponse.body.stream; - const reader = stream.getReader(); - readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject); - } else { - bodyReadPromise.resolve(undefined); - } - const operations = []; - const operation = { - type: "put", - request: innerRequest, - response: clonedResponse - }; - operations.push(operation); - const bytes = await bodyReadPromise.promise; - if (clonedResponse.body != null) { - clonedResponse.body.source = bytes; - } - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - try { - this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; - } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; - } - async delete(request, options = {}) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.delete" }); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); - let r = null; - if (request instanceof Request) { - r = request[kState]; - if (r.method !== "GET" && !options.ignoreMethod) { - return false; - } - } else { - assert(typeof request === "string"); - r = new Request(request)[kState]; - } - const operations = []; - const operation = { - type: "delete", - request: r, - options - }; - operations.push(operation); - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - let requestResponses; - try { - requestResponses = this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; - } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(!!requestResponses?.length); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; - } - async keys(request = undefined, options = {}) { - webidl.brandCheck(this, Cache); - if (request !== undefined) - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); - let r = null; - if (request !== undefined) { - if (request instanceof Request) { - r = request[kState]; - if (r.method !== "GET" && !options.ignoreMethod) { - return []; - } - } else if (typeof request === "string") { - r = new Request(request)[kState]; - } - } - const promise = createDeferredPromise(); - const requests = []; - if (request === undefined) { - for (const requestResponse of this.#relevantRequestResponseList) { - requests.push(requestResponse[0]); - } - } else { - const requestResponses = this.#queryCache(r, options); - for (const requestResponse of requestResponses) { - requests.push(requestResponse[0]); - } - } - queueMicrotask(() => { - const requestList = []; - for (const request2 of requests) { - const requestObject = new Request("https://a"); - requestObject[kState] = request2; - requestObject[kHeaders][kHeadersList] = request2.headersList; - requestObject[kHeaders][kGuard] = "immutable"; - requestObject[kRealm] = request2.client; - requestList.push(requestObject); - } - promise.resolve(Object.freeze(requestList)); - }); - return promise.promise; - } - #batchCacheOperations(operations) { - const cache = this.#relevantRequestResponseList; - const backupCache = [...cache]; - const addedItems = []; - const resultList = []; - try { - for (const operation of operations) { - if (operation.type !== "delete" && operation.type !== "put") { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: 'operation type does not match "delete" or "put"' - }); - } - if (operation.type === "delete" && operation.response != null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "delete operation should not have an associated response" - }); - } - if (this.#queryCache(operation.request, operation.options, addedItems).length) { - throw new DOMException("???", "InvalidStateError"); - } - let requestResponses; - if (operation.type === "delete") { - requestResponses = this.#queryCache(operation.request, operation.options); - if (requestResponses.length === 0) { - return []; - } - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse); - assert(idx !== -1); - cache.splice(idx, 1); - } - } else if (operation.type === "put") { - if (operation.response == null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "put operation should have an associated response" - }); - } - const r = operation.request; - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "expected http or https scheme" - }); - } - if (r.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "not get method" - }); - } - if (operation.options != null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "options must not be defined" - }); - } - requestResponses = this.#queryCache(operation.request); - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse); - assert(idx !== -1); - cache.splice(idx, 1); - } - cache.push([operation.request, operation.response]); - addedItems.push([operation.request, operation.response]); - } - resultList.push([operation.request, operation.response]); - } - return resultList; - } catch (e) { - this.#relevantRequestResponseList.length = 0; - this.#relevantRequestResponseList = backupCache; - throw e; - } - } - #queryCache(requestQuery, options, targetStorage) { - const resultList = []; - const storage = targetStorage ?? this.#relevantRequestResponseList; - for (const requestResponse of storage) { - const [cachedRequest, cachedResponse] = requestResponse; - if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { - resultList.push(requestResponse); - } - } - return resultList; - } - #requestMatchesCachedItem(requestQuery, request, response = null, options) { - const queryURL = new URL(requestQuery.url); - const cachedURL = new URL(request.url); - if (options?.ignoreSearch) { - cachedURL.search = ""; - queryURL.search = ""; - } - if (!urlEquals(queryURL, cachedURL, true)) { - return false; - } - if (response == null || options?.ignoreVary || !response.headersList.contains("vary")) { - return true; - } - const fieldValues = getFieldValues(response.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - return false; - } - const requestValue = request.headersList.get(fieldValue); - const queryValue = requestQuery.headersList.get(fieldValue); - if (requestValue !== queryValue) { - return false; - } - } - return true; - } - } - Object.defineProperties(Cache.prototype, { - [Symbol.toStringTag]: { - value: "Cache", - configurable: true - }, - match: kEnumerableProperty, - matchAll: kEnumerableProperty, - add: kEnumerableProperty, - addAll: kEnumerableProperty, - put: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty - }); - var cacheQueryOptionConverters = [ - { - key: "ignoreSearch", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "ignoreMethod", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "ignoreVary", - converter: webidl.converters.boolean, - defaultValue: false - } - ]; - webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters); - webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ - ...cacheQueryOptionConverters, - { - key: "cacheName", - converter: webidl.converters.DOMString - } - ]); - webidl.converters.Response = webidl.interfaceConverter(Response); - webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.RequestInfo); - module.exports = { - Cache - }; -}); - -// ../node_modules/undici/lib/cache/cachestorage.js -var require_cachestorage = __commonJS((exports, module) => { - var { kConstruct } = require_symbols4(); - var { Cache } = require_cache(); - var { webidl } = require_webidl(); - var { kEnumerableProperty } = require_util(); - - class CacheStorage { - #caches = new Map; - constructor() { - if (arguments[0] !== kConstruct) { - webidl.illegalConstructor(); - } - } - async match(request, options = {}) { - webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.match" }); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.MultiCacheQueryOptions(options); - if (options.cacheName != null) { - if (this.#caches.has(options.cacheName)) { - const cacheList = this.#caches.get(options.cacheName); - const cache = new Cache(kConstruct, cacheList); - return await cache.match(request, options); - } - } else { - for (const cacheList of this.#caches.values()) { - const cache = new Cache(kConstruct, cacheList); - const response = await cache.match(request, options); - if (response !== undefined) { - return response; - } - } - } - } - async has(cacheName) { - webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.has" }); - cacheName = webidl.converters.DOMString(cacheName); - return this.#caches.has(cacheName); - } - async open(cacheName) { - webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.open" }); - cacheName = webidl.converters.DOMString(cacheName); - if (this.#caches.has(cacheName)) { - const cache2 = this.#caches.get(cacheName); - return new Cache(kConstruct, cache2); - } - const cache = []; - this.#caches.set(cacheName, cache); - return new Cache(kConstruct, cache); - } - async delete(cacheName) { - webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.delete" }); - cacheName = webidl.converters.DOMString(cacheName); - return this.#caches.delete(cacheName); - } - async keys() { - webidl.brandCheck(this, CacheStorage); - const keys = this.#caches.keys(); - return [...keys]; - } - } - Object.defineProperties(CacheStorage.prototype, { - [Symbol.toStringTag]: { - value: "CacheStorage", - configurable: true - }, - match: kEnumerableProperty, - has: kEnumerableProperty, - open: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty - }); - module.exports = { - CacheStorage - }; -}); - -// ../node_modules/undici/lib/cookies/constants.js -var require_constants4 = __commonJS((exports, module) => { - var maxAttributeValueSize = 1024; - var maxNameValuePairSize = 4096; - module.exports = { - maxAttributeValueSize, - maxNameValuePairSize - }; -}); - -// ../node_modules/undici/lib/cookies/util.js -var require_util6 = __commonJS((exports, module) => { - var assert = __require("assert"); - var { kHeadersList } = require_symbols(); - function isCTLExcludingHtab(value) { - if (value.length === 0) { - return false; - } - for (const char of value) { - const code = char.charCodeAt(0); - if (code >= 0 || code <= 8 || (code >= 10 || code <= 31) || code === 127) { - return false; - } - } - } - function validateCookieName(name) { - for (const char of name) { - const code = char.charCodeAt(0); - if (code <= 32 || code > 127 || char === "(" || char === ")" || char === ">" || char === "<" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}") { - throw new Error("Invalid cookie name"); - } - } - } - function validateCookieValue(value) { - for (const char of value) { - const code = char.charCodeAt(0); - if (code < 33 || code === 34 || code === 44 || code === 59 || code === 92 || code > 126) { - throw new Error("Invalid header value"); - } - } - } - function validateCookiePath(path) { - for (const char of path) { - const code = char.charCodeAt(0); - if (code < 33 || char === ";") { - throw new Error("Invalid cookie path"); - } - } - } - function validateCookieDomain(domain) { - if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { - throw new Error("Invalid cookie domain"); - } - } - function toIMFDate(date) { - if (typeof date === "number") { - date = new Date(date); - } - const days = [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat" - ]; - const months = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" - ]; - const dayName = days[date.getUTCDay()]; - const day = date.getUTCDate().toString().padStart(2, "0"); - const month = months[date.getUTCMonth()]; - const year = date.getUTCFullYear(); - const hour = date.getUTCHours().toString().padStart(2, "0"); - const minute = date.getUTCMinutes().toString().padStart(2, "0"); - const second = date.getUTCSeconds().toString().padStart(2, "0"); - return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT`; - } - function validateCookieMaxAge(maxAge) { - if (maxAge < 0) { - throw new Error("Invalid cookie max-age"); - } - } - function stringify(cookie) { - if (cookie.name.length === 0) { - return null; - } - validateCookieName(cookie.name); - validateCookieValue(cookie.value); - const out = [`${cookie.name}=${cookie.value}`]; - if (cookie.name.startsWith("__Secure-")) { - cookie.secure = true; - } - if (cookie.name.startsWith("__Host-")) { - cookie.secure = true; - cookie.domain = null; - cookie.path = "/"; - } - if (cookie.secure) { - out.push("Secure"); - } - if (cookie.httpOnly) { - out.push("HttpOnly"); - } - if (typeof cookie.maxAge === "number") { - validateCookieMaxAge(cookie.maxAge); - out.push(`Max-Age=${cookie.maxAge}`); - } - if (cookie.domain) { - validateCookieDomain(cookie.domain); - out.push(`Domain=${cookie.domain}`); - } - if (cookie.path) { - validateCookiePath(cookie.path); - out.push(`Path=${cookie.path}`); - } - if (cookie.expires && cookie.expires.toString() !== "Invalid Date") { - out.push(`Expires=${toIMFDate(cookie.expires)}`); - } - if (cookie.sameSite) { - out.push(`SameSite=${cookie.sameSite}`); - } - for (const part of cookie.unparsed) { - if (!part.includes("=")) { - throw new Error("Invalid unparsed"); - } - const [key, ...value] = part.split("="); - out.push(`${key.trim()}=${value.join("=")}`); - } - return out.join("; "); - } - var kHeadersListNode; - function getHeadersList(headers) { - if (headers[kHeadersList]) { - return headers[kHeadersList]; - } - if (!kHeadersListNode) { - kHeadersListNode = Object.getOwnPropertySymbols(headers).find((symbol) => symbol.description === "headers list"); - assert(kHeadersListNode, "Headers cannot be parsed"); - } - const headersList = headers[kHeadersListNode]; - assert(headersList); - return headersList; - } - module.exports = { - isCTLExcludingHtab, - stringify, - getHeadersList - }; -}); - -// ../node_modules/undici/lib/cookies/parse.js -var require_parse = __commonJS((exports, module) => { - var { maxNameValuePairSize, maxAttributeValueSize } = require_constants4(); - var { isCTLExcludingHtab } = require_util6(); - var { collectASequenceOfCodePointsFast } = require_dataURL(); - var assert = __require("assert"); - function parseSetCookie(header) { - if (isCTLExcludingHtab(header)) { - return null; - } - let nameValuePair = ""; - let unparsedAttributes = ""; - let name = ""; - let value = ""; - if (header.includes(";")) { - const position = { position: 0 }; - nameValuePair = collectASequenceOfCodePointsFast(";", header, position); - unparsedAttributes = header.slice(position.position); - } else { - nameValuePair = header; - } - if (!nameValuePair.includes("=")) { - value = nameValuePair; - } else { - const position = { position: 0 }; - name = collectASequenceOfCodePointsFast("=", nameValuePair, position); - value = nameValuePair.slice(position.position + 1); - } - name = name.trim(); - value = value.trim(); - if (name.length + value.length > maxNameValuePairSize) { - return null; - } - return { - name, - value, - ...parseUnparsedAttributes(unparsedAttributes) - }; - } - function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) { - if (unparsedAttributes.length === 0) { - return cookieAttributeList; - } - assert(unparsedAttributes[0] === ";"); - unparsedAttributes = unparsedAttributes.slice(1); - let cookieAv = ""; - if (unparsedAttributes.includes(";")) { - cookieAv = collectASequenceOfCodePointsFast(";", unparsedAttributes, { position: 0 }); - unparsedAttributes = unparsedAttributes.slice(cookieAv.length); - } else { - cookieAv = unparsedAttributes; - unparsedAttributes = ""; - } - let attributeName = ""; - let attributeValue = ""; - if (cookieAv.includes("=")) { - const position = { position: 0 }; - attributeName = collectASequenceOfCodePointsFast("=", cookieAv, position); - attributeValue = cookieAv.slice(position.position + 1); - } else { - attributeName = cookieAv; - } - attributeName = attributeName.trim(); - attributeValue = attributeValue.trim(); - if (attributeValue.length > maxAttributeValueSize) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - const attributeNameLowercase = attributeName.toLowerCase(); - if (attributeNameLowercase === "expires") { - const expiryTime = new Date(attributeValue); - cookieAttributeList.expires = expiryTime; - } else if (attributeNameLowercase === "max-age") { - const charCode = attributeValue.charCodeAt(0); - if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - if (!/^\d+$/.test(attributeValue)) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - const deltaSeconds = Number(attributeValue); - cookieAttributeList.maxAge = deltaSeconds; - } else if (attributeNameLowercase === "domain") { - let cookieDomain = attributeValue; - if (cookieDomain[0] === ".") { - cookieDomain = cookieDomain.slice(1); - } - cookieDomain = cookieDomain.toLowerCase(); - cookieAttributeList.domain = cookieDomain; - } else if (attributeNameLowercase === "path") { - let cookiePath = ""; - if (attributeValue.length === 0 || attributeValue[0] !== "/") { - cookiePath = "/"; - } else { - cookiePath = attributeValue; - } - cookieAttributeList.path = cookiePath; - } else if (attributeNameLowercase === "secure") { - cookieAttributeList.secure = true; - } else if (attributeNameLowercase === "httponly") { - cookieAttributeList.httpOnly = true; - } else if (attributeNameLowercase === "samesite") { - let enforcement = "Default"; - const attributeValueLowercase = attributeValue.toLowerCase(); - if (attributeValueLowercase.includes("none")) { - enforcement = "None"; - } - if (attributeValueLowercase.includes("strict")) { - enforcement = "Strict"; - } - if (attributeValueLowercase.includes("lax")) { - enforcement = "Lax"; - } - cookieAttributeList.sameSite = enforcement; - } else { - cookieAttributeList.unparsed ??= []; - cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`); - } - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - module.exports = { - parseSetCookie, - parseUnparsedAttributes - }; -}); - -// ../node_modules/undici/lib/cookies/index.js -var require_cookies = __commonJS((exports, module) => { - var { parseSetCookie } = require_parse(); - var { stringify, getHeadersList } = require_util6(); - var { webidl } = require_webidl(); - var { Headers } = require_headers(); - function getCookies(headers) { - webidl.argumentLengthCheck(arguments, 1, { header: "getCookies" }); - webidl.brandCheck(headers, Headers, { strict: false }); - const cookie = headers.get("cookie"); - const out = {}; - if (!cookie) { - return out; - } - for (const piece of cookie.split(";")) { - const [name, ...value] = piece.split("="); - out[name.trim()] = value.join("="); - } - return out; - } - function deleteCookie(headers, name, attributes) { - webidl.argumentLengthCheck(arguments, 2, { header: "deleteCookie" }); - webidl.brandCheck(headers, Headers, { strict: false }); - name = webidl.converters.DOMString(name); - attributes = webidl.converters.DeleteCookieAttributes(attributes); - setCookie(headers, { - name, - value: "", - expires: new Date(0), - ...attributes - }); - } - function getSetCookies(headers) { - webidl.argumentLengthCheck(arguments, 1, { header: "getSetCookies" }); - webidl.brandCheck(headers, Headers, { strict: false }); - const cookies = getHeadersList(headers).cookies; - if (!cookies) { - return []; - } - return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)); - } - function setCookie(headers, cookie) { - webidl.argumentLengthCheck(arguments, 2, { header: "setCookie" }); - webidl.brandCheck(headers, Headers, { strict: false }); - cookie = webidl.converters.Cookie(cookie); - const str = stringify(cookie); - if (str) { - headers.append("Set-Cookie", stringify(cookie)); - } - } - webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "path", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "domain", - defaultValue: null - } - ]); - webidl.converters.Cookie = webidl.dictionaryConverter([ - { - converter: webidl.converters.DOMString, - key: "name" - }, - { - converter: webidl.converters.DOMString, - key: "value" - }, - { - converter: webidl.nullableConverter((value) => { - if (typeof value === "number") { - return webidl.converters["unsigned long long"](value); - } - return new Date(value); - }), - key: "expires", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters["long long"]), - key: "maxAge", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "domain", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "path", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: "secure", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: "httpOnly", - defaultValue: null - }, - { - converter: webidl.converters.USVString, - key: "sameSite", - allowedValues: ["Strict", "Lax", "None"] - }, - { - converter: webidl.sequenceConverter(webidl.converters.DOMString), - key: "unparsed", - defaultValue: [] - } - ]); - module.exports = { - getCookies, - deleteCookie, - getSetCookies, - setCookie - }; -}); - -// ../node_modules/undici/lib/websocket/constants.js -var require_constants5 = __commonJS((exports, module) => { - var uid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - var staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false - }; - var states = { - CONNECTING: 0, - OPEN: 1, - CLOSING: 2, - CLOSED: 3 - }; - var opcodes = { - CONTINUATION: 0, - TEXT: 1, - BINARY: 2, - CLOSE: 8, - PING: 9, - PONG: 10 - }; - var maxUnsigned16Bit = 2 ** 16 - 1; - var parserStates = { - INFO: 0, - PAYLOADLENGTH_16: 2, - PAYLOADLENGTH_64: 3, - READ_DATA: 4 - }; - var emptyBuffer = Buffer.allocUnsafe(0); - module.exports = { - uid, - staticPropertyDescriptors, - states, - opcodes, - maxUnsigned16Bit, - parserStates, - emptyBuffer - }; -}); - -// ../node_modules/undici/lib/websocket/symbols.js -var require_symbols5 = __commonJS((exports, module) => { - module.exports = { - kWebSocketURL: Symbol("url"), - kReadyState: Symbol("ready state"), - kController: Symbol("controller"), - kResponse: Symbol("response"), - kBinaryType: Symbol("binary type"), - kSentClose: Symbol("sent close"), - kReceivedClose: Symbol("received close"), - kByteParser: Symbol("byte parser") - }; -}); - -// ../node_modules/undici/lib/websocket/events.js -var require_events = __commonJS((exports, module) => { - var { webidl } = require_webidl(); - var { kEnumerableProperty } = require_util(); - var { MessagePort } = __require("worker_threads"); - - class MessageEvent extends Event { - #eventInit; - constructor(type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent constructor" }); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.MessageEventInit(eventInitDict); - super(type, eventInitDict); - this.#eventInit = eventInitDict; - } - get data() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.data; - } - get origin() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.origin; - } - get lastEventId() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.lastEventId; - } - get source() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.source; - } - get ports() { - webidl.brandCheck(this, MessageEvent); - if (!Object.isFrozen(this.#eventInit.ports)) { - Object.freeze(this.#eventInit.ports); - } - return this.#eventInit.ports; - } - initMessageEvent(type, bubbles = false, cancelable = false, data = null, origin = "", lastEventId = "", source = null, ports = []) { - webidl.brandCheck(this, MessageEvent); - webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent.initMessageEvent" }); - return new MessageEvent(type, { - bubbles, - cancelable, - data, - origin, - lastEventId, - source, - ports - }); - } - } - - class CloseEvent extends Event { - #eventInit; - constructor(type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "CloseEvent constructor" }); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.CloseEventInit(eventInitDict); - super(type, eventInitDict); - this.#eventInit = eventInitDict; - } - get wasClean() { - webidl.brandCheck(this, CloseEvent); - return this.#eventInit.wasClean; - } - get code() { - webidl.brandCheck(this, CloseEvent); - return this.#eventInit.code; - } - get reason() { - webidl.brandCheck(this, CloseEvent); - return this.#eventInit.reason; - } - } - - class ErrorEvent extends Event { - #eventInit; - constructor(type, eventInitDict) { - webidl.argumentLengthCheck(arguments, 1, { header: "ErrorEvent constructor" }); - super(type, eventInitDict); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); - this.#eventInit = eventInitDict; - } - get message() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.message; - } - get filename() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.filename; - } - get lineno() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.lineno; - } - get colno() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.colno; - } - get error() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.error; - } - } - Object.defineProperties(MessageEvent.prototype, { - [Symbol.toStringTag]: { - value: "MessageEvent", - configurable: true - }, - data: kEnumerableProperty, - origin: kEnumerableProperty, - lastEventId: kEnumerableProperty, - source: kEnumerableProperty, - ports: kEnumerableProperty, - initMessageEvent: kEnumerableProperty - }); - Object.defineProperties(CloseEvent.prototype, { - [Symbol.toStringTag]: { - value: "CloseEvent", - configurable: true - }, - reason: kEnumerableProperty, - code: kEnumerableProperty, - wasClean: kEnumerableProperty - }); - Object.defineProperties(ErrorEvent.prototype, { - [Symbol.toStringTag]: { - value: "ErrorEvent", - configurable: true - }, - message: kEnumerableProperty, - filename: kEnumerableProperty, - lineno: kEnumerableProperty, - colno: kEnumerableProperty, - error: kEnumerableProperty - }); - webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort); - webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.MessagePort); - var eventInit = [ - { - key: "bubbles", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "cancelable", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "composed", - converter: webidl.converters.boolean, - defaultValue: false - } - ]; - webidl.converters.MessageEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "data", - converter: webidl.converters.any, - defaultValue: null - }, - { - key: "origin", - converter: webidl.converters.USVString, - defaultValue: "" - }, - { - key: "lastEventId", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "source", - converter: webidl.nullableConverter(webidl.converters.MessagePort), - defaultValue: null - }, - { - key: "ports", - converter: webidl.converters["sequence"], - get defaultValue() { - return []; - } - } - ]); - webidl.converters.CloseEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "wasClean", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "code", - converter: webidl.converters["unsigned short"], - defaultValue: 0 - }, - { - key: "reason", - converter: webidl.converters.USVString, - defaultValue: "" - } - ]); - webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "message", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "filename", - converter: webidl.converters.USVString, - defaultValue: "" - }, - { - key: "lineno", - converter: webidl.converters["unsigned long"], - defaultValue: 0 - }, - { - key: "colno", - converter: webidl.converters["unsigned long"], - defaultValue: 0 - }, - { - key: "error", - converter: webidl.converters.any - } - ]); - module.exports = { - MessageEvent, - CloseEvent, - ErrorEvent - }; -}); - -// ../node_modules/undici/lib/websocket/util.js -var require_util7 = __commonJS((exports, module) => { - var { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require_symbols5(); - var { states, opcodes } = require_constants5(); - var { MessageEvent, ErrorEvent } = require_events(); - function isEstablished(ws) { - return ws[kReadyState] === states.OPEN; - } - function isClosing(ws) { - return ws[kReadyState] === states.CLOSING; - } - function isClosed(ws) { - return ws[kReadyState] === states.CLOSED; - } - function fireEvent(e, target, eventConstructor = Event, eventInitDict) { - const event = new eventConstructor(e, eventInitDict); - target.dispatchEvent(event); - } - function websocketMessageReceived(ws, type, data) { - if (ws[kReadyState] !== states.OPEN) { - return; - } - let dataForEvent; - if (type === opcodes.TEXT) { - try { - dataForEvent = new TextDecoder("utf-8", { fatal: true }).decode(data); - } catch { - failWebsocketConnection(ws, "Received invalid UTF-8 in text frame."); - return; - } - } else if (type === opcodes.BINARY) { - if (ws[kBinaryType] === "blob") { - dataForEvent = new Blob([data]); - } else { - dataForEvent = new Uint8Array(data).buffer; - } - } - fireEvent("message", ws, MessageEvent, { - origin: ws[kWebSocketURL].origin, - data: dataForEvent - }); - } - function isValidSubprotocol(protocol) { - if (protocol.length === 0) { - return false; - } - for (const char of protocol) { - const code = char.charCodeAt(0); - if (code < 33 || code > 126 || char === "(" || char === ")" || char === "<" || char === ">" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}" || code === 32 || code === 9) { - return false; - } - } - return true; - } - function isValidStatusCode(code) { - if (code >= 1000 && code < 1015) { - return code !== 1004 && code !== 1005 && code !== 1006; - } - return code >= 3000 && code <= 4999; - } - function failWebsocketConnection(ws, reason) { - const { [kController]: controller, [kResponse]: response } = ws; - controller.abort(); - if (response?.socket && !response.socket.destroyed) { - response.socket.destroy(); - } - if (reason) { - fireEvent("error", ws, ErrorEvent, { - error: new Error(reason) - }); - } - } - module.exports = { - isEstablished, - isClosing, - isClosed, - fireEvent, - isValidSubprotocol, - isValidStatusCode, - failWebsocketConnection, - websocketMessageReceived - }; -}); - -// ../node_modules/undici/lib/websocket/connection.js -var require_connection = __commonJS((exports, module) => { - var diagnosticsChannel = __require("diagnostics_channel"); - var { uid, states } = require_constants5(); - var { - kReadyState, - kSentClose, - kByteParser, - kReceivedClose - } = require_symbols5(); - var { fireEvent, failWebsocketConnection } = require_util7(); - var { CloseEvent } = require_events(); - var { makeRequest } = require_request2(); - var { fetching } = require_fetch(); - var { Headers } = require_headers(); - var { getGlobalDispatcher } = require_global2(); - var { kHeadersList } = require_symbols(); - var channels = {}; - channels.open = diagnosticsChannel.channel("undici:websocket:open"); - channels.close = diagnosticsChannel.channel("undici:websocket:close"); - channels.socketError = diagnosticsChannel.channel("undici:websocket:socket_error"); - var crypto; - try { - crypto = __require("crypto"); - } catch { - } - function establishWebSocketConnection(url, protocols, ws, onEstablish, options) { - const requestURL = url; - requestURL.protocol = url.protocol === "ws:" ? "http:" : "https:"; - const request = makeRequest({ - urlList: [requestURL], - serviceWorkers: "none", - referrer: "no-referrer", - mode: "websocket", - credentials: "include", - cache: "no-store", - redirect: "error" - }); - if (options.headers) { - const headersList = new Headers(options.headers)[kHeadersList]; - request.headersList = headersList; - } - const keyValue = crypto.randomBytes(16).toString("base64"); - request.headersList.append("sec-websocket-key", keyValue); - request.headersList.append("sec-websocket-version", "13"); - for (const protocol of protocols) { - request.headersList.append("sec-websocket-protocol", protocol); - } - const permessageDeflate = ""; - const controller = fetching({ - request, - useParallelQueue: true, - dispatcher: options.dispatcher ?? getGlobalDispatcher(), - processResponse(response) { - if (response.type === "error" || response.status !== 101) { - failWebsocketConnection(ws, "Received network error or non-101 status code."); - return; - } - if (protocols.length !== 0 && !response.headersList.get("Sec-WebSocket-Protocol")) { - failWebsocketConnection(ws, "Server did not respond with sent protocols."); - return; - } - if (response.headersList.get("Upgrade")?.toLowerCase() !== "websocket") { - failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".'); - return; - } - if (response.headersList.get("Connection")?.toLowerCase() !== "upgrade") { - failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".'); - return; - } - const secWSAccept = response.headersList.get("Sec-WebSocket-Accept"); - const digest = crypto.createHash("sha1").update(keyValue + uid).digest("base64"); - if (secWSAccept !== digest) { - failWebsocketConnection(ws, "Incorrect hash received in Sec-WebSocket-Accept header."); - return; - } - const secExtension = response.headersList.get("Sec-WebSocket-Extensions"); - if (secExtension !== null && secExtension !== permessageDeflate) { - failWebsocketConnection(ws, "Received different permessage-deflate than the one set."); - return; - } - const secProtocol = response.headersList.get("Sec-WebSocket-Protocol"); - if (secProtocol !== null && secProtocol !== request.headersList.get("Sec-WebSocket-Protocol")) { - failWebsocketConnection(ws, "Protocol was not set in the opening handshake."); - return; - } - response.socket.on("data", onSocketData); - response.socket.on("close", onSocketClose); - response.socket.on("error", onSocketError); - if (channels.open.hasSubscribers) { - channels.open.publish({ - address: response.socket.address(), - protocol: secProtocol, - extensions: secExtension - }); - } - onEstablish(response); - } - }); - return controller; - } - function onSocketData(chunk) { - if (!this.ws[kByteParser].write(chunk)) { - this.pause(); - } - } - function onSocketClose() { - const { ws } = this; - const wasClean = ws[kSentClose] && ws[kReceivedClose]; - let code = 1005; - let reason = ""; - const result = ws[kByteParser].closingInfo; - if (result) { - code = result.code ?? 1005; - reason = result.reason; - } else if (!ws[kSentClose]) { - code = 1006; - } - ws[kReadyState] = states.CLOSED; - fireEvent("close", ws, CloseEvent, { - wasClean, - code, - reason - }); - if (channels.close.hasSubscribers) { - channels.close.publish({ - websocket: ws, - code, - reason - }); - } - } - function onSocketError(error) { - const { ws } = this; - ws[kReadyState] = states.CLOSING; - if (channels.socketError.hasSubscribers) { - channels.socketError.publish(error); - } - this.destroy(); - } - module.exports = { - establishWebSocketConnection - }; -}); - -// ../node_modules/undici/lib/websocket/frame.js -var require_frame = __commonJS((exports, module) => { - var { maxUnsigned16Bit } = require_constants5(); - var crypto; - try { - crypto = __require("crypto"); - } catch { - } - - class WebsocketFrameSend { - constructor(data) { - this.frameData = data; - this.maskKey = crypto.randomBytes(4); - } - createFrame(opcode) { - const bodyLength = this.frameData?.byteLength ?? 0; - let payloadLength = bodyLength; - let offset = 6; - if (bodyLength > maxUnsigned16Bit) { - offset += 8; - payloadLength = 127; - } else if (bodyLength > 125) { - offset += 2; - payloadLength = 126; - } - const buffer = Buffer.allocUnsafe(bodyLength + offset); - buffer[0] = buffer[1] = 0; - buffer[0] |= 128; - buffer[0] = (buffer[0] & 240) + opcode; - /*! ws. MIT License. Einar Otto Stangvik */ - buffer[offset - 4] = this.maskKey[0]; - buffer[offset - 3] = this.maskKey[1]; - buffer[offset - 2] = this.maskKey[2]; - buffer[offset - 1] = this.maskKey[3]; - buffer[1] = payloadLength; - if (payloadLength === 126) { - buffer.writeUInt16BE(bodyLength, 2); - } else if (payloadLength === 127) { - buffer[2] = buffer[3] = 0; - buffer.writeUIntBE(bodyLength, 4, 6); - } - buffer[1] |= 128; - for (let i = 0;i < bodyLength; i++) { - buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]; - } - return buffer; - } - } - module.exports = { - WebsocketFrameSend - }; -}); - -// ../node_modules/undici/lib/websocket/receiver.js -var require_receiver = __commonJS((exports, module) => { - var { Writable } = __require("stream"); - var diagnosticsChannel = __require("diagnostics_channel"); - var { parserStates, opcodes, states, emptyBuffer } = require_constants5(); - var { kReadyState, kSentClose, kResponse, kReceivedClose } = require_symbols5(); - var { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = require_util7(); - var { WebsocketFrameSend } = require_frame(); - var channels = {}; - channels.ping = diagnosticsChannel.channel("undici:websocket:ping"); - channels.pong = diagnosticsChannel.channel("undici:websocket:pong"); - - class ByteParser extends Writable { - #buffers = []; - #byteOffset = 0; - #state = parserStates.INFO; - #info = {}; - #fragments = []; - constructor(ws) { - super(); - this.ws = ws; - } - _write(chunk, _, callback) { - this.#buffers.push(chunk); - this.#byteOffset += chunk.length; - this.run(callback); - } - run(callback) { - while (true) { - if (this.#state === parserStates.INFO) { - if (this.#byteOffset < 2) { - return callback(); - } - const buffer = this.consume(2); - this.#info.fin = (buffer[0] & 128) !== 0; - this.#info.opcode = buffer[0] & 15; - this.#info.originalOpcode ??= this.#info.opcode; - this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION; - if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { - failWebsocketConnection(this.ws, "Invalid frame type was fragmented."); - return; - } - const payloadLength = buffer[1] & 127; - if (payloadLength <= 125) { - this.#info.payloadLength = payloadLength; - this.#state = parserStates.READ_DATA; - } else if (payloadLength === 126) { - this.#state = parserStates.PAYLOADLENGTH_16; - } else if (payloadLength === 127) { - this.#state = parserStates.PAYLOADLENGTH_64; - } - if (this.#info.fragmented && payloadLength > 125) { - failWebsocketConnection(this.ws, "Fragmented frame exceeded 125 bytes."); - return; - } else if ((this.#info.opcode === opcodes.PING || this.#info.opcode === opcodes.PONG || this.#info.opcode === opcodes.CLOSE) && payloadLength > 125) { - failWebsocketConnection(this.ws, "Payload length for control frame exceeded 125 bytes."); - return; - } else if (this.#info.opcode === opcodes.CLOSE) { - if (payloadLength === 1) { - failWebsocketConnection(this.ws, "Received close frame with a 1-byte body."); - return; - } - const body = this.consume(payloadLength); - this.#info.closeInfo = this.parseCloseBody(false, body); - if (!this.ws[kSentClose]) { - const body2 = Buffer.allocUnsafe(2); - body2.writeUInt16BE(this.#info.closeInfo.code, 0); - const closeFrame = new WebsocketFrameSend(body2); - this.ws[kResponse].socket.write(closeFrame.createFrame(opcodes.CLOSE), (err) => { - if (!err) { - this.ws[kSentClose] = true; - } - }); - } - this.ws[kReadyState] = states.CLOSING; - this.ws[kReceivedClose] = true; - this.end(); - return; - } else if (this.#info.opcode === opcodes.PING) { - const body = this.consume(payloadLength); - if (!this.ws[kReceivedClose]) { - const frame = new WebsocketFrameSend(body); - this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)); - if (channels.ping.hasSubscribers) { - channels.ping.publish({ - payload: body - }); - } - } - this.#state = parserStates.INFO; - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - return; - } - } else if (this.#info.opcode === opcodes.PONG) { - const body = this.consume(payloadLength); - if (channels.pong.hasSubscribers) { - channels.pong.publish({ - payload: body - }); - } - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - return; - } - } - } else if (this.#state === parserStates.PAYLOADLENGTH_16) { - if (this.#byteOffset < 2) { - return callback(); - } - const buffer = this.consume(2); - this.#info.payloadLength = buffer.readUInt16BE(0); - this.#state = parserStates.READ_DATA; - } else if (this.#state === parserStates.PAYLOADLENGTH_64) { - if (this.#byteOffset < 8) { - return callback(); - } - const buffer = this.consume(8); - const upper = buffer.readUInt32BE(0); - if (upper > 2 ** 31 - 1) { - failWebsocketConnection(this.ws, "Received payload length > 2^31 bytes."); - return; - } - const lower = buffer.readUInt32BE(4); - this.#info.payloadLength = (upper << 8) + lower; - this.#state = parserStates.READ_DATA; - } else if (this.#state === parserStates.READ_DATA) { - if (this.#byteOffset < this.#info.payloadLength) { - return callback(); - } else if (this.#byteOffset >= this.#info.payloadLength) { - const body = this.consume(this.#info.payloadLength); - this.#fragments.push(body); - if (!this.#info.fragmented || this.#info.fin && this.#info.opcode === opcodes.CONTINUATION) { - const fullMessage = Buffer.concat(this.#fragments); - websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage); - this.#info = {}; - this.#fragments.length = 0; - } - this.#state = parserStates.INFO; - } - } - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - break; - } - } - } - consume(n) { - if (n > this.#byteOffset) { - return null; - } else if (n === 0) { - return emptyBuffer; - } - if (this.#buffers[0].length === n) { - this.#byteOffset -= this.#buffers[0].length; - return this.#buffers.shift(); - } - const buffer = Buffer.allocUnsafe(n); - let offset = 0; - while (offset !== n) { - const next = this.#buffers[0]; - const { length } = next; - if (length + offset === n) { - buffer.set(this.#buffers.shift(), offset); - break; - } else if (length + offset > n) { - buffer.set(next.subarray(0, n - offset), offset); - this.#buffers[0] = next.subarray(n - offset); - break; - } else { - buffer.set(this.#buffers.shift(), offset); - offset += next.length; - } - } - this.#byteOffset -= n; - return buffer; - } - parseCloseBody(onlyCode, data) { - let code; - if (data.length >= 2) { - code = data.readUInt16BE(0); - } - if (onlyCode) { - if (!isValidStatusCode(code)) { - return null; - } - return { code }; - } - let reason = data.subarray(2); - if (reason[0] === 239 && reason[1] === 187 && reason[2] === 191) { - reason = reason.subarray(3); - } - if (code !== undefined && !isValidStatusCode(code)) { - return null; - } - try { - reason = new TextDecoder("utf-8", { fatal: true }).decode(reason); - } catch { - return null; - } - return { code, reason }; - } - get closingInfo() { - return this.#info.closeInfo; - } - } - module.exports = { - ByteParser - }; -}); - -// ../node_modules/undici/lib/websocket/websocket.js -var require_websocket = __commonJS((exports, module) => { - var { webidl } = require_webidl(); - var { DOMException: DOMException2 } = require_constants2(); - var { URLSerializer } = require_dataURL(); - var { getGlobalOrigin } = require_global(); - var { staticPropertyDescriptors, states, opcodes, emptyBuffer } = require_constants5(); - var { - kWebSocketURL, - kReadyState, - kController, - kBinaryType, - kResponse, - kSentClose, - kByteParser - } = require_symbols5(); - var { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = require_util7(); - var { establishWebSocketConnection } = require_connection(); - var { WebsocketFrameSend } = require_frame(); - var { ByteParser } = require_receiver(); - var { kEnumerableProperty, isBlobLike } = require_util(); - var { getGlobalDispatcher } = require_global2(); - var { types } = __require("util"); - var experimentalWarned = false; - - class WebSocket extends EventTarget { - #events = { - open: null, - error: null, - close: null, - message: null - }; - #bufferedAmount = 0; - #protocol = ""; - #extensions = ""; - constructor(url, protocols = []) { - super(); - webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket constructor" }); - if (!experimentalWarned) { - experimentalWarned = true; - process.emitWarning("WebSockets are experimental, expect them to change at any time.", { - code: "UNDICI-WS" - }); - } - const options = webidl.converters["DOMString or sequence or WebSocketInit"](protocols); - url = webidl.converters.USVString(url); - protocols = options.protocols; - const baseURL = getGlobalOrigin(); - let urlRecord; - try { - urlRecord = new URL(url, baseURL); - } catch (e) { - throw new DOMException2(e, "SyntaxError"); - } - if (urlRecord.protocol === "http:") { - urlRecord.protocol = "ws:"; - } else if (urlRecord.protocol === "https:") { - urlRecord.protocol = "wss:"; - } - if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { - throw new DOMException2(`Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, "SyntaxError"); - } - if (urlRecord.hash || urlRecord.href.endsWith("#")) { - throw new DOMException2("Got fragment", "SyntaxError"); - } - if (typeof protocols === "string") { - protocols = [protocols]; - } - if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { - throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); - } - if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { - throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); - } - this[kWebSocketURL] = new URL(urlRecord.href); - this[kController] = establishWebSocketConnection(urlRecord, protocols, this, (response) => this.#onConnectionEstablished(response), options); - this[kReadyState] = WebSocket.CONNECTING; - this[kBinaryType] = "blob"; - } - close(code = undefined, reason = undefined) { - webidl.brandCheck(this, WebSocket); - if (code !== undefined) { - code = webidl.converters["unsigned short"](code, { clamp: true }); - } - if (reason !== undefined) { - reason = webidl.converters.USVString(reason); - } - if (code !== undefined) { - if (code !== 1000 && (code < 3000 || code > 4999)) { - throw new DOMException2("invalid code", "InvalidAccessError"); - } - } - let reasonByteLength = 0; - if (reason !== undefined) { - reasonByteLength = Buffer.byteLength(reason); - if (reasonByteLength > 123) { - throw new DOMException2(`Reason must be less than 123 bytes; received ${reasonByteLength}`, "SyntaxError"); - } - } - if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) { - } else if (!isEstablished(this)) { - failWebsocketConnection(this, "Connection was closed before it was established."); - this[kReadyState] = WebSocket.CLOSING; - } else if (!isClosing(this)) { - const frame = new WebsocketFrameSend; - if (code !== undefined && reason === undefined) { - frame.frameData = Buffer.allocUnsafe(2); - frame.frameData.writeUInt16BE(code, 0); - } else if (code !== undefined && reason !== undefined) { - frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength); - frame.frameData.writeUInt16BE(code, 0); - frame.frameData.write(reason, 2, "utf-8"); - } else { - frame.frameData = emptyBuffer; - } - const socket = this[kResponse].socket; - socket.write(frame.createFrame(opcodes.CLOSE), (err) => { - if (!err) { - this[kSentClose] = true; - } - }); - this[kReadyState] = states.CLOSING; - } else { - this[kReadyState] = WebSocket.CLOSING; - } - } - send(data) { - webidl.brandCheck(this, WebSocket); - webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket.send" }); - data = webidl.converters.WebSocketSendData(data); - if (this[kReadyState] === WebSocket.CONNECTING) { - throw new DOMException2("Sent before connected.", "InvalidStateError"); - } - if (!isEstablished(this) || isClosing(this)) { - return; - } - const socket = this[kResponse].socket; - if (typeof data === "string") { - const value = Buffer.from(data); - const frame = new WebsocketFrameSend(value); - const buffer = frame.createFrame(opcodes.TEXT); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - } else if (types.isArrayBuffer(data)) { - const value = Buffer.from(data); - const frame = new WebsocketFrameSend(value); - const buffer = frame.createFrame(opcodes.BINARY); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - } else if (ArrayBuffer.isView(data)) { - const ab = Buffer.from(data, data.byteOffset, data.byteLength); - const frame = new WebsocketFrameSend(ab); - const buffer = frame.createFrame(opcodes.BINARY); - this.#bufferedAmount += ab.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= ab.byteLength; - }); - } else if (isBlobLike(data)) { - const frame = new WebsocketFrameSend; - data.arrayBuffer().then((ab) => { - const value = Buffer.from(ab); - frame.frameData = value; - const buffer = frame.createFrame(opcodes.BINARY); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - }); - } - } - get readyState() { - webidl.brandCheck(this, WebSocket); - return this[kReadyState]; - } - get bufferedAmount() { - webidl.brandCheck(this, WebSocket); - return this.#bufferedAmount; - } - get url() { - webidl.brandCheck(this, WebSocket); - return URLSerializer(this[kWebSocketURL]); - } - get extensions() { - webidl.brandCheck(this, WebSocket); - return this.#extensions; - } - get protocol() { - webidl.brandCheck(this, WebSocket); - return this.#protocol; - } - get onopen() { - webidl.brandCheck(this, WebSocket); - return this.#events.open; - } - set onopen(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.open) { - this.removeEventListener("open", this.#events.open); - } - if (typeof fn === "function") { - this.#events.open = fn; - this.addEventListener("open", fn); - } else { - this.#events.open = null; - } - } - get onerror() { - webidl.brandCheck(this, WebSocket); - return this.#events.error; - } - set onerror(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.error) { - this.removeEventListener("error", this.#events.error); - } - if (typeof fn === "function") { - this.#events.error = fn; - this.addEventListener("error", fn); - } else { - this.#events.error = null; - } - } - get onclose() { - webidl.brandCheck(this, WebSocket); - return this.#events.close; - } - set onclose(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.close) { - this.removeEventListener("close", this.#events.close); - } - if (typeof fn === "function") { - this.#events.close = fn; - this.addEventListener("close", fn); - } else { - this.#events.close = null; - } - } - get onmessage() { - webidl.brandCheck(this, WebSocket); - return this.#events.message; - } - set onmessage(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.message) { - this.removeEventListener("message", this.#events.message); - } - if (typeof fn === "function") { - this.#events.message = fn; - this.addEventListener("message", fn); - } else { - this.#events.message = null; - } - } - get binaryType() { - webidl.brandCheck(this, WebSocket); - return this[kBinaryType]; - } - set binaryType(type) { - webidl.brandCheck(this, WebSocket); - if (type !== "blob" && type !== "arraybuffer") { - this[kBinaryType] = "blob"; - } else { - this[kBinaryType] = type; - } - } - #onConnectionEstablished(response) { - this[kResponse] = response; - const parser = new ByteParser(this); - parser.on("drain", function onParserDrain() { - this.ws[kResponse].socket.resume(); - }); - response.socket.ws = this; - this[kByteParser] = parser; - this[kReadyState] = states.OPEN; - const extensions = response.headersList.get("sec-websocket-extensions"); - if (extensions !== null) { - this.#extensions = extensions; - } - const protocol = response.headersList.get("sec-websocket-protocol"); - if (protocol !== null) { - this.#protocol = protocol; - } - fireEvent("open", this); - } - } - WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING; - WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN; - WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING; - WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED; - Object.defineProperties(WebSocket.prototype, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors, - url: kEnumerableProperty, - readyState: kEnumerableProperty, - bufferedAmount: kEnumerableProperty, - onopen: kEnumerableProperty, - onerror: kEnumerableProperty, - onclose: kEnumerableProperty, - close: kEnumerableProperty, - onmessage: kEnumerableProperty, - binaryType: kEnumerableProperty, - send: kEnumerableProperty, - extensions: kEnumerableProperty, - protocol: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "WebSocket", - writable: false, - enumerable: false, - configurable: true - } - }); - Object.defineProperties(WebSocket, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors - }); - webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.DOMString); - webidl.converters["DOMString or sequence"] = function(V) { - if (webidl.util.Type(V) === "Object" && Symbol.iterator in V) { - return webidl.converters["sequence"](V); - } - return webidl.converters.DOMString(V); - }; - webidl.converters.WebSocketInit = webidl.dictionaryConverter([ - { - key: "protocols", - converter: webidl.converters["DOMString or sequence"], - get defaultValue() { - return []; - } - }, - { - key: "dispatcher", - converter: (V) => V, - get defaultValue() { - return getGlobalDispatcher(); - } - }, - { - key: "headers", - converter: webidl.nullableConverter(webidl.converters.HeadersInit) - } - ]); - webidl.converters["DOMString or sequence or WebSocketInit"] = function(V) { - if (webidl.util.Type(V) === "Object" && !(Symbol.iterator in V)) { - return webidl.converters.WebSocketInit(V); - } - return { protocols: webidl.converters["DOMString or sequence"](V) }; - }; - webidl.converters.WebSocketSendData = function(V) { - if (webidl.util.Type(V) === "Object") { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); - } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { - return webidl.converters.BufferSource(V); - } - } - return webidl.converters.USVString(V); - }; - module.exports = { - WebSocket - }; -}); - -// ../node_modules/undici/index.js -var require_undici = __commonJS((exports, module) => { - var Client = require_client(); - var Dispatcher = require_dispatcher(); - var errors = require_errors(); - var Pool = require_pool(); - var BalancedPool = require_balanced_pool(); - var Agent = require_agent(); - var util = require_util(); - var { InvalidArgumentError } = errors; - var api = require_api(); - var buildConnector = require_connect(); - var MockClient = require_mock_client(); - var MockAgent = require_mock_agent(); - var MockPool = require_mock_pool(); - var mockErrors = require_mock_errors(); - var ProxyAgent = require_proxy_agent(); - var RetryHandler = require_RetryHandler(); - var { getGlobalDispatcher, setGlobalDispatcher } = require_global2(); - var DecoratorHandler = require_DecoratorHandler(); - var RedirectHandler = require_RedirectHandler(); - var createRedirectInterceptor = require_redirectInterceptor(); - var hasCrypto; - try { - __require("crypto"); - hasCrypto = true; - } catch { - hasCrypto = false; - } - Object.assign(Dispatcher.prototype, api); - exports.Dispatcher = Dispatcher; - exports.Client = Client; - exports.Pool = Pool; - exports.BalancedPool = BalancedPool; - exports.Agent = Agent; - exports.ProxyAgent = ProxyAgent; - exports.RetryHandler = RetryHandler; - exports.DecoratorHandler = DecoratorHandler; - exports.RedirectHandler = RedirectHandler; - exports.createRedirectInterceptor = createRedirectInterceptor; - exports.buildConnector = buildConnector; - exports.errors = errors; - function makeDispatcher(fn) { - return (url, opts, handler) => { - if (typeof opts === "function") { - handler = opts; - opts = null; - } - if (!url || typeof url !== "string" && typeof url !== "object" && !(url instanceof URL)) { - throw new InvalidArgumentError("invalid url"); - } - if (opts != null && typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (opts && opts.path != null) { - if (typeof opts.path !== "string") { - throw new InvalidArgumentError("invalid opts.path"); - } - let path = opts.path; - if (!opts.path.startsWith("/")) { - path = `/${path}`; - } - url = new URL(util.parseOrigin(url).origin + path); - } else { - if (!opts) { - opts = typeof url === "object" ? url : {}; - } - url = util.parseURL(url); - } - const { agent, dispatcher = getGlobalDispatcher() } = opts; - if (agent) { - throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?"); - } - return fn.call(dispatcher, { - ...opts, - origin: url.origin, - path: url.search ? `${url.pathname}${url.search}` : url.pathname, - method: opts.method || (opts.body ? "PUT" : "GET") - }, handler); - }; - } - exports.setGlobalDispatcher = setGlobalDispatcher; - exports.getGlobalDispatcher = getGlobalDispatcher; - if (util.nodeMajor > 16 || util.nodeMajor === 16 && util.nodeMinor >= 8) { - let fetchImpl = null; - exports.fetch = async function fetch(resource) { - if (!fetchImpl) { - fetchImpl = require_fetch().fetch; - } - try { - return await fetchImpl(...arguments); - } catch (err) { - if (typeof err === "object") { - Error.captureStackTrace(err, this); - } - throw err; - } - }; - exports.Headers = require_headers().Headers; - exports.Response = require_response().Response; - exports.Request = require_request2().Request; - exports.FormData = require_formdata().FormData; - exports.File = require_file().File; - exports.FileReader = require_filereader().FileReader; - const { setGlobalOrigin, getGlobalOrigin } = require_global(); - exports.setGlobalOrigin = setGlobalOrigin; - exports.getGlobalOrigin = getGlobalOrigin; - const { CacheStorage } = require_cachestorage(); - const { kConstruct } = require_symbols4(); - exports.caches = new CacheStorage(kConstruct); - } - if (util.nodeMajor >= 16) { - const { deleteCookie, getCookies, getSetCookies, setCookie } = require_cookies(); - exports.deleteCookie = deleteCookie; - exports.getCookies = getCookies; - exports.getSetCookies = getSetCookies; - exports.setCookie = setCookie; - const { parseMIMEType, serializeAMimeType } = require_dataURL(); - exports.parseMIMEType = parseMIMEType; - exports.serializeAMimeType = serializeAMimeType; - } - if (util.nodeMajor >= 18 && hasCrypto) { - const { WebSocket } = require_websocket(); - exports.WebSocket = WebSocket; - } - exports.request = makeDispatcher(api.request); - exports.stream = makeDispatcher(api.stream); - exports.pipeline = makeDispatcher(api.pipeline); - exports.connect = makeDispatcher(api.connect); - exports.upgrade = makeDispatcher(api.upgrade); - exports.MockClient = MockClient; - exports.MockPool = MockPool; - exports.MockAgent = MockAgent; - exports.mockErrors = mockErrors; -}); - -// ../node_modules/@actions/http-client/lib/index.js -var require_lib = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = undefined; - var http = __importStar(__require("http")); - var https = __importStar(__require("https")); - var pm = __importStar(require_proxy()); - var tunnel = __importStar(require_tunnel()); - var undici_1 = require_undici(); - var HttpCodes; - (function(HttpCodes2) { - HttpCodes2[HttpCodes2["OK"] = 200] = "OK"; - HttpCodes2[HttpCodes2["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes2[HttpCodes2["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes2[HttpCodes2["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes2[HttpCodes2["SeeOther"] = 303] = "SeeOther"; - HttpCodes2[HttpCodes2["NotModified"] = 304] = "NotModified"; - HttpCodes2[HttpCodes2["UseProxy"] = 305] = "UseProxy"; - HttpCodes2[HttpCodes2["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes2[HttpCodes2["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes2[HttpCodes2["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes2[HttpCodes2["BadRequest"] = 400] = "BadRequest"; - HttpCodes2[HttpCodes2["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes2[HttpCodes2["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes2[HttpCodes2["Forbidden"] = 403] = "Forbidden"; - HttpCodes2[HttpCodes2["NotFound"] = 404] = "NotFound"; - HttpCodes2[HttpCodes2["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes2[HttpCodes2["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes2[HttpCodes2["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes2[HttpCodes2["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes2[HttpCodes2["Conflict"] = 409] = "Conflict"; - HttpCodes2[HttpCodes2["Gone"] = 410] = "Gone"; - HttpCodes2[HttpCodes2["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes2[HttpCodes2["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes2[HttpCodes2["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes2[HttpCodes2["BadGateway"] = 502] = "BadGateway"; - HttpCodes2[HttpCodes2["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes2[HttpCodes2["GatewayTimeout"] = 504] = "GatewayTimeout"; - })(HttpCodes || (exports.HttpCodes = HttpCodes = {})); - var Headers; - (function(Headers2) { - Headers2["Accept"] = "accept"; - Headers2["ContentType"] = "content-type"; - })(Headers || (exports.Headers = Headers = {})); - var MediaTypes; - (function(MediaTypes2) { - MediaTypes2["ApplicationJson"] = "application/json"; - })(MediaTypes || (exports.MediaTypes = MediaTypes = {})); - function getProxyUrl(serverUrl) { - const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); - return proxyUrl ? proxyUrl.href : ""; - } - exports.getProxyUrl = getProxyUrl; - var HttpRedirectCodes = [ - HttpCodes.MovedPermanently, - HttpCodes.ResourceMoved, - HttpCodes.SeeOther, - HttpCodes.TemporaryRedirect, - HttpCodes.PermanentRedirect - ]; - var HttpResponseRetryCodes = [ - HttpCodes.BadGateway, - HttpCodes.ServiceUnavailable, - HttpCodes.GatewayTimeout - ]; - var RetryableHttpVerbs = ["OPTIONS", "GET", "DELETE", "HEAD"]; - var ExponentialBackoffCeiling = 10; - var ExponentialBackoffTimeSlice = 5; - - class HttpClientError extends Error { - constructor(message, statusCode) { - super(message); - this.name = "HttpClientError"; - this.statusCode = statusCode; - Object.setPrototypeOf(this, HttpClientError.prototype); - } - } - exports.HttpClientError = HttpClientError; - - class HttpClientResponse { - constructor(message) { - this.message = message; - } - readBody() { - return __awaiter(this, undefined, undefined, function* () { - return new Promise((resolve) => __awaiter(this, undefined, undefined, function* () { - let output = Buffer.alloc(0); - this.message.on("data", (chunk) => { - output = Buffer.concat([output, chunk]); - }); - this.message.on("end", () => { - resolve(output.toString()); - }); - })); - }); - } - readBodyBuffer() { - return __awaiter(this, undefined, undefined, function* () { - return new Promise((resolve) => __awaiter(this, undefined, undefined, function* () { - const chunks = []; - this.message.on("data", (chunk) => { - chunks.push(chunk); - }); - this.message.on("end", () => { - resolve(Buffer.concat(chunks)); - }); - })); - }); - } - } - exports.HttpClientResponse = HttpClientResponse; - function isHttps(requestUrl) { - const parsedUrl = new URL(requestUrl); - return parsedUrl.protocol === "https:"; - } - exports.isHttps = isHttps; - - class HttpClient { - constructor(userAgent, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent; - this.handlers = handlers || []; - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; - } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; - } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); - } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; - } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; - } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; - } - } - } - options(requestUrl, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("OPTIONS", requestUrl, null, additionalHeaders || {}); - }); - } - get(requestUrl, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("GET", requestUrl, null, additionalHeaders || {}); - }); - } - del(requestUrl, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("DELETE", requestUrl, null, additionalHeaders || {}); - }); - } - post(requestUrl, data, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("POST", requestUrl, data, additionalHeaders || {}); - }); - } - patch(requestUrl, data, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("PATCH", requestUrl, data, additionalHeaders || {}); - }); - } - put(requestUrl, data, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("PUT", requestUrl, data, additionalHeaders || {}); - }); - } - head(requestUrl, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("HEAD", requestUrl, null, additionalHeaders || {}); - }); - } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request(verb, requestUrl, stream, additionalHeaders); - }); - } - getJson(requestUrl, additionalHeaders = {}) { - return __awaiter(this, undefined, undefined, function* () { - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - const res = yield this.get(requestUrl, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - postJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, undefined, undefined, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.post(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - putJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, undefined, undefined, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.put(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - patchJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, undefined, undefined, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.patch(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - request(verb, requestUrl, data, headers) { - return __awaiter(this, undefined, undefined, function* () { - if (this._disposed) { - throw new Error("Client has already been disposed."); - } - const parsedUrl = new URL(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers); - const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) ? this._maxRetries + 1 : 1; - let numTries = 0; - let response; - do { - response = yield this.requestRaw(info, data); - if (response && response.message && response.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (const handler of this.handlers) { - if (handler.canHandleAuthentication(response)) { - authenticationHandler = handler; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } else { - return response; - } - } - let redirectsRemaining = this._maxRedirects; - while (response.message.statusCode && HttpRedirectCodes.includes(response.message.statusCode) && this._allowRedirects && redirectsRemaining > 0) { - const redirectUrl = response.message.headers["location"]; - if (!redirectUrl) { - break; - } - const parsedRedirectUrl = new URL(redirectUrl); - if (parsedUrl.protocol === "https:" && parsedUrl.protocol !== parsedRedirectUrl.protocol && !this._allowRedirectDowngrade) { - throw new Error("Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true."); - } - yield response.readBody(); - if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { - for (const header in headers) { - if (header.toLowerCase() === "authorization") { - delete headers[header]; - } - } - } - info = this._prepareRequest(verb, parsedRedirectUrl, headers); - response = yield this.requestRaw(info, data); - redirectsRemaining--; - } - if (!response.message.statusCode || !HttpResponseRetryCodes.includes(response.message.statusCode)) { - return response; - } - numTries += 1; - if (numTries < maxTries) { - yield response.readBody(); - yield this._performExponentialBackoff(numTries); - } - } while (numTries < maxTries); - return response; - }); - } - dispose() { - if (this._agent) { - this._agent.destroy(); - } - this._disposed = true; - } - requestRaw(info, data) { - return __awaiter(this, undefined, undefined, function* () { - return new Promise((resolve, reject) => { - function callbackForResult(err, res) { - if (err) { - reject(err); - } else if (!res) { - reject(new Error("Unknown error")); - } else { - resolve(res); - } - } - this.requestRawWithCallback(info, data, callbackForResult); - }); - }); - } - requestRawWithCallback(info, data, onResult) { - if (typeof data === "string") { - if (!info.options.headers) { - info.options.headers = {}; - } - info.options.headers["Content-Length"] = Buffer.byteLength(data, "utf8"); - } - let callbackCalled = false; - function handleResult(err, res) { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); - } - } - const req = info.httpModule.request(info.options, (msg) => { - const res = new HttpClientResponse(msg); - handleResult(undefined, res); - }); - let socket; - req.on("socket", (sock) => { - socket = sock; - }); - req.setTimeout(this._socketTimeout || 3 * 60000, () => { - if (socket) { - socket.end(); - } - handleResult(new Error(`Request timeout: ${info.options.path}`)); - }); - req.on("error", function(err) { - handleResult(err); - }); - if (data && typeof data === "string") { - req.write(data, "utf8"); - } - if (data && typeof data !== "string") { - data.on("close", function() { - req.end(); - }); - data.pipe(req); - } else { - req.end(); - } - } - getAgent(serverUrl) { - const parsedUrl = new URL(serverUrl); - return this._getAgent(parsedUrl); - } - getAgentDispatcher(serverUrl) { - const parsedUrl = new URL(serverUrl); - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (!useProxy) { - return; - } - return this._getProxyAgentDispatcher(parsedUrl, proxyUrl); - } - _prepareRequest(method, requestUrl, headers) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === "https:"; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort; - info.options.path = (info.parsedUrl.pathname || "") + (info.parsedUrl.search || ""); - info.options.method = method; - info.options.headers = this._mergeHeaders(headers); - if (this.userAgent != null) { - info.options.headers["user-agent"] = this.userAgent; - } - info.options.agent = this._getAgent(info.parsedUrl); - if (this.handlers) { - for (const handler of this.handlers) { - handler.prepareRequest(info.options); - } - } - return info; - } - _mergeHeaders(headers) { - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); - } - return lowercaseKeys(headers || {}); - } - _getExistingOrDefaultHeader(additionalHeaders, header, _default) { - let clientHeader; - if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; - } - return additionalHeaders[header] || clientHeader || _default; - } - _getAgent(parsedUrl) { - let agent; - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (this._keepAlive && useProxy) { - agent = this._proxyAgent; - } - if (!useProxy) { - agent = this._agent; - } - if (agent) { - return agent; - } - const usingSsl = parsedUrl.protocol === "https:"; - let maxSockets = 100; - if (this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; - } - if (proxyUrl && proxyUrl.hostname) { - const agentOptions = { - maxSockets, - keepAlive: this._keepAlive, - proxy: Object.assign(Object.assign({}, (proxyUrl.username || proxyUrl.password) && { - proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` - }), { host: proxyUrl.hostname, port: proxyUrl.port }) - }; - let tunnelAgent; - const overHttps = proxyUrl.protocol === "https:"; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; - } else { - tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; - } - agent = tunnelAgent(agentOptions); - this._proxyAgent = agent; - } - if (!agent) { - const options = { keepAlive: this._keepAlive, maxSockets }; - agent = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent; - } - if (usingSsl && this._ignoreSslError) { - agent.options = Object.assign(agent.options || {}, { - rejectUnauthorized: false - }); - } - return agent; - } - _getProxyAgentDispatcher(parsedUrl, proxyUrl) { - let proxyAgent; - if (this._keepAlive) { - proxyAgent = this._proxyAgentDispatcher; - } - if (proxyAgent) { - return proxyAgent; - } - const usingSsl = parsedUrl.protocol === "https:"; - proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, (proxyUrl.username || proxyUrl.password) && { - token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString("base64")}` - })); - this._proxyAgentDispatcher = proxyAgent; - if (usingSsl && this._ignoreSslError) { - proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, { - rejectUnauthorized: false - }); - } - return proxyAgent; - } - _performExponentialBackoff(retryNumber) { - return __awaiter(this, undefined, undefined, function* () { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise((resolve) => setTimeout(() => resolve(), ms)); - }); - } - _processResponse(res, options) { - return __awaiter(this, undefined, undefined, function* () { - return new Promise((resolve, reject) => __awaiter(this, undefined, undefined, function* () { - const statusCode = res.message.statusCode || 0; - const response = { - statusCode, - result: null, - headers: {} - }; - if (statusCode === HttpCodes.NotFound) { - resolve(response); - } - function dateTimeDeserializer(key, value) { - if (typeof value === "string") { - const a = new Date(value); - if (!isNaN(a.valueOf())) { - return a; - } - } - return value; - } - let obj; - let contents; - try { - contents = yield res.readBody(); - if (contents && contents.length > 0) { - if (options && options.deserializeDates) { - obj = JSON.parse(contents, dateTimeDeserializer); - } else { - obj = JSON.parse(contents); - } - response.result = obj; - } - response.headers = res.message.headers; - } catch (err) { - } - if (statusCode > 299) { - let msg; - if (obj && obj.message) { - msg = obj.message; - } else if (contents && contents.length > 0) { - msg = contents; - } else { - msg = `Failed request: (${statusCode})`; - } - const err = new HttpClientError(msg, statusCode); - err.result = response.result; - reject(err); - } else { - resolve(response); - } - })); - }); - } - } - exports.HttpClient = HttpClient; - var lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {}); -}); - -// ../node_modules/@actions/http-client/lib/auth.js -var require_auth = __commonJS((exports) => { - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = undefined; - - class BasicCredentialHandler { - constructor(username, password) { - this.username = username; - this.password = password; - } - prepareRequest(options) { - if (!options.headers) { - throw Error("The request has no headers"); - } - options.headers["Authorization"] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString("base64")}`; - } - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, undefined, undefined, function* () { - throw new Error("not implemented"); - }); - } - } - exports.BasicCredentialHandler = BasicCredentialHandler; - - class BearerCredentialHandler { - constructor(token) { - this.token = token; - } - prepareRequest(options) { - if (!options.headers) { - throw Error("The request has no headers"); - } - options.headers["Authorization"] = `Bearer ${this.token}`; - } - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, undefined, undefined, function* () { - throw new Error("not implemented"); - }); - } - } - exports.BearerCredentialHandler = BearerCredentialHandler; - - class PersonalAccessTokenCredentialHandler { - constructor(token) { - this.token = token; - } - prepareRequest(options) { - if (!options.headers) { - throw Error("The request has no headers"); - } - options.headers["Authorization"] = `Basic ${Buffer.from(`PAT:${this.token}`).toString("base64")}`; - } - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, undefined, undefined, function* () { - throw new Error("not implemented"); - }); - } - } - exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; -}); - -// ../node_modules/@actions/core/lib/oidc-utils.js -var require_oidc_utils = __commonJS((exports) => { - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.OidcClient = undefined; - var http_client_1 = require_lib(); - var auth_1 = require_auth(); - var core_1 = require_core(); - - class OidcClient { - static createHttpClient(allowRetry = true, maxRetry = 10) { - const requestOptions = { - allowRetries: allowRetry, - maxRetries: maxRetry - }; - return new http_client_1.HttpClient("actions/oidc-client", [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); - } - static getRequestToken() { - const token = process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"]; - if (!token) { - throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable"); - } - return token; - } - static getIDTokenUrl() { - const runtimeUrl = process.env["ACTIONS_ID_TOKEN_REQUEST_URL"]; - if (!runtimeUrl) { - throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable"); - } - return runtimeUrl; - } - static getCall(id_token_url) { - var _a; - return __awaiter(this, undefined, undefined, function* () { - const httpclient = OidcClient.createHttpClient(); - const res = yield httpclient.getJson(id_token_url).catch((error) => { - throw new Error(`Failed to get ID Token. \n - Error Code : ${error.statusCode}\n - Error Message: ${error.message}`); - }); - const id_token = (_a = res.result) === null || _a === undefined ? undefined : _a.value; - if (!id_token) { - throw new Error("Response json body do not have ID Token field"); - } - return id_token; - }); - } - static getIDToken(audience) { - return __awaiter(this, undefined, undefined, function* () { - try { - let id_token_url = OidcClient.getIDTokenUrl(); - if (audience) { - const encodedAudience = encodeURIComponent(audience); - id_token_url = `${id_token_url}&audience=${encodedAudience}`; - } - (0, core_1.debug)(`ID token url is ${id_token_url}`); - const id_token = yield OidcClient.getCall(id_token_url); - (0, core_1.setSecret)(id_token); - return id_token; - } catch (error) { - throw new Error(`Error message: ${error.message}`); - } - }); - } - } - exports.OidcClient = OidcClient; -}); - -// ../node_modules/@actions/core/lib/summary.js -var require_summary = __commonJS((exports) => { - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = undefined; - var os_1 = __require("os"); - var fs_1 = __require("fs"); - var { access, appendFile, writeFile } = fs_1.promises; - exports.SUMMARY_ENV_VAR = "GITHUB_STEP_SUMMARY"; - exports.SUMMARY_DOCS_URL = "https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary"; - - class Summary { - constructor() { - this._buffer = ""; - } - filePath() { - return __awaiter(this, undefined, undefined, function* () { - if (this._filePath) { - return this._filePath; - } - const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR]; - if (!pathFromEnv) { - throw new Error(`Unable to find environment variable for \$${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); - } - try { - yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); - } catch (_a) { - throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); - } - this._filePath = pathFromEnv; - return this._filePath; - }); - } - wrap(tag, content, attrs = {}) { - const htmlAttrs = Object.entries(attrs).map(([key, value]) => ` ${key}="${value}"`).join(""); - if (!content) { - return `<${tag}${htmlAttrs}>`; - } - return `<${tag}${htmlAttrs}>${content}`; - } - write(options) { - return __awaiter(this, undefined, undefined, function* () { - const overwrite = !!(options === null || options === undefined ? undefined : options.overwrite); - const filePath = yield this.filePath(); - const writeFunc = overwrite ? writeFile : appendFile; - yield writeFunc(filePath, this._buffer, { encoding: "utf8" }); - return this.emptyBuffer(); - }); - } - clear() { - return __awaiter(this, undefined, undefined, function* () { - return this.emptyBuffer().write({ overwrite: true }); - }); - } - stringify() { - return this._buffer; - } - isEmptyBuffer() { - return this._buffer.length === 0; - } - emptyBuffer() { - this._buffer = ""; - return this; - } - addRaw(text, addEOL = false) { - this._buffer += text; - return addEOL ? this.addEOL() : this; - } - addEOL() { - return this.addRaw(os_1.EOL); - } - addCodeBlock(code, lang) { - const attrs = Object.assign({}, lang && { lang }); - const element = this.wrap("pre", this.wrap("code", code), attrs); - return this.addRaw(element).addEOL(); - } - addList(items, ordered = false) { - const tag = ordered ? "ol" : "ul"; - const listItems = items.map((item) => this.wrap("li", item)).join(""); - const element = this.wrap(tag, listItems); - return this.addRaw(element).addEOL(); - } - addTable(rows) { - const tableBody = rows.map((row) => { - const cells = row.map((cell) => { - if (typeof cell === "string") { - return this.wrap("td", cell); - } - const { header, data, colspan, rowspan } = cell; - const tag = header ? "th" : "td"; - const attrs = Object.assign(Object.assign({}, colspan && { colspan }), rowspan && { rowspan }); - return this.wrap(tag, data, attrs); - }).join(""); - return this.wrap("tr", cells); - }).join(""); - const element = this.wrap("table", tableBody); - return this.addRaw(element).addEOL(); - } - addDetails(label, content) { - const element = this.wrap("details", this.wrap("summary", label) + content); - return this.addRaw(element).addEOL(); - } - addImage(src, alt, options) { - const { width, height } = options || {}; - const attrs = Object.assign(Object.assign({}, width && { width }), height && { height }); - const element = this.wrap("img", null, Object.assign({ src, alt }, attrs)); - return this.addRaw(element).addEOL(); - } - addHeading(text, level) { - const tag = `h${level}`; - const allowedTag = ["h1", "h2", "h3", "h4", "h5", "h6"].includes(tag) ? tag : "h1"; - const element = this.wrap(allowedTag, text); - return this.addRaw(element).addEOL(); - } - addSeparator() { - const element = this.wrap("hr", null); - return this.addRaw(element).addEOL(); - } - addBreak() { - const element = this.wrap("br", null); - return this.addRaw(element).addEOL(); - } - addQuote(text, cite) { - const attrs = Object.assign({}, cite && { cite }); - const element = this.wrap("blockquote", text, attrs); - return this.addRaw(element).addEOL(); - } - addLink(text, href) { - const element = this.wrap("a", text, { href }); - return this.addRaw(element).addEOL(); - } - } - var _summary = new Summary; - exports.markdownSummary = _summary; - exports.summary = _summary; -}); - -// ../node_modules/@actions/core/lib/path-utils.js -var require_path_utils = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = undefined; - var path = __importStar(__require("path")); - function toPosixPath(pth) { - return pth.replace(/[\\]/g, "/"); - } - exports.toPosixPath = toPosixPath; - function toWin32Path(pth) { - return pth.replace(/[/]/g, "\\"); - } - exports.toWin32Path = toWin32Path; - function toPlatformPath(pth) { - return pth.replace(/[/\\]/g, path.sep); - } - exports.toPlatformPath = toPlatformPath; -}); - -// ../node_modules/@actions/io/lib/io-util.js -var require_io_util = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var _a; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getCmdPath = exports.tryGetExecutablePath = exports.isRooted = exports.isDirectory = exports.exists = exports.READONLY = exports.UV_FS_O_EXLOCK = exports.IS_WINDOWS = exports.unlink = exports.symlink = exports.stat = exports.rmdir = exports.rm = exports.rename = exports.readlink = exports.readdir = exports.open = exports.mkdir = exports.lstat = exports.copyFile = exports.chmod = undefined; - var fs = __importStar(__require("fs")); - var path = __importStar(__require("path")); - _a = fs.promises, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.open = _a.open, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rm = _a.rm, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink; - exports.IS_WINDOWS = process.platform === "win32"; - exports.UV_FS_O_EXLOCK = 268435456; - exports.READONLY = fs.constants.O_RDONLY; - function exists(fsPath) { - return __awaiter(this, undefined, undefined, function* () { - try { - yield exports.stat(fsPath); - } catch (err) { - if (err.code === "ENOENT") { - return false; - } - throw err; - } - return true; - }); - } - exports.exists = exists; - function isDirectory(fsPath, useStat = false) { - return __awaiter(this, undefined, undefined, function* () { - const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath); - return stats.isDirectory(); - }); - } - exports.isDirectory = isDirectory; - function isRooted(p) { - p = normalizeSeparators(p); - if (!p) { - throw new Error('isRooted() parameter "p" cannot be empty'); - } - if (exports.IS_WINDOWS) { - return p.startsWith("\\") || /^[A-Z]:/i.test(p); - } - return p.startsWith("/"); - } - exports.isRooted = isRooted; - function tryGetExecutablePath(filePath, extensions) { - return __awaiter(this, undefined, undefined, function* () { - let stats = undefined; - try { - stats = yield exports.stat(filePath); - } catch (err) { - if (err.code !== "ENOENT") { - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports.IS_WINDOWS) { - const upperExt = path.extname(filePath).toUpperCase(); - if (extensions.some((validExt) => validExt.toUpperCase() === upperExt)) { - return filePath; - } - } else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - const originalFilePath = filePath; - for (const extension of extensions) { - filePath = originalFilePath + extension; - stats = undefined; - try { - stats = yield exports.stat(filePath); - } catch (err) { - if (err.code !== "ENOENT") { - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports.IS_WINDOWS) { - try { - const directory = path.dirname(filePath); - const upperName = path.basename(filePath).toUpperCase(); - for (const actualName of yield exports.readdir(directory)) { - if (upperName === actualName.toUpperCase()) { - filePath = path.join(directory, actualName); - break; - } - } - } catch (err) { - console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); - } - return filePath; - } else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - } - return ""; - }); - } - exports.tryGetExecutablePath = tryGetExecutablePath; - function normalizeSeparators(p) { - p = p || ""; - if (exports.IS_WINDOWS) { - p = p.replace(/\//g, "\\"); - return p.replace(/\\\\+/g, "\\"); - } - return p.replace(/\/\/+/g, "/"); - } - function isUnixExecutable(stats) { - return (stats.mode & 1) > 0 || (stats.mode & 8) > 0 && stats.gid === process.getgid() || (stats.mode & 64) > 0 && stats.uid === process.getuid(); - } - function getCmdPath() { - var _a2; - return (_a2 = process.env["COMSPEC"]) !== null && _a2 !== undefined ? _a2 : `cmd.exe`; - } - exports.getCmdPath = getCmdPath; -}); - -// ../node_modules/@actions/io/lib/io.js -var require_io = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.findInPath = exports.which = exports.mkdirP = exports.rmRF = exports.mv = exports.cp = undefined; - var assert_1 = __require("assert"); - var path = __importStar(__require("path")); - var ioUtil = __importStar(require_io_util()); - function cp(source, dest, options = {}) { - return __awaiter(this, undefined, undefined, function* () { - const { force, recursive, copySourceDirectory } = readCopyOptions(options); - const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; - if (destStat && destStat.isFile() && !force) { - return; - } - const newDest = destStat && destStat.isDirectory() && copySourceDirectory ? path.join(dest, path.basename(source)) : dest; - if (!(yield ioUtil.exists(source))) { - throw new Error(`no such file or directory: ${source}`); - } - const sourceStat = yield ioUtil.stat(source); - if (sourceStat.isDirectory()) { - if (!recursive) { - throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); - } else { - yield cpDirRecursive(source, newDest, 0, force); - } - } else { - if (path.relative(source, newDest) === "") { - throw new Error(`'${newDest}' and '${source}' are the same file`); - } - yield copyFile(source, newDest, force); - } - }); - } - exports.cp = cp; - function mv(source, dest, options = {}) { - return __awaiter(this, undefined, undefined, function* () { - if (yield ioUtil.exists(dest)) { - let destExists = true; - if (yield ioUtil.isDirectory(dest)) { - dest = path.join(dest, path.basename(source)); - destExists = yield ioUtil.exists(dest); - } - if (destExists) { - if (options.force == null || options.force) { - yield rmRF(dest); - } else { - throw new Error("Destination already exists"); - } - } - } - yield mkdirP(path.dirname(dest)); - yield ioUtil.rename(source, dest); - }); - } - exports.mv = mv; - function rmRF(inputPath) { - return __awaiter(this, undefined, undefined, function* () { - if (ioUtil.IS_WINDOWS) { - if (/[*"<>|]/.test(inputPath)) { - throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows'); - } - } - try { - yield ioUtil.rm(inputPath, { - force: true, - maxRetries: 3, - recursive: true, - retryDelay: 300 - }); - } catch (err) { - throw new Error(`File was unable to be removed ${err}`); - } - }); - } - exports.rmRF = rmRF; - function mkdirP(fsPath) { - return __awaiter(this, undefined, undefined, function* () { - assert_1.ok(fsPath, "a path argument must be provided"); - yield ioUtil.mkdir(fsPath, { recursive: true }); - }); - } - exports.mkdirP = mkdirP; - function which(tool, check) { - return __awaiter(this, undefined, undefined, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - if (check) { - const result = yield which(tool, false); - if (!result) { - if (ioUtil.IS_WINDOWS) { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); - } else { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`); - } - } - return result; - } - const matches = yield findInPath(tool); - if (matches && matches.length > 0) { - return matches[0]; - } - return ""; - }); - } - exports.which = which; - function findInPath(tool) { - return __awaiter(this, undefined, undefined, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - const extensions = []; - if (ioUtil.IS_WINDOWS && process.env["PATHEXT"]) { - for (const extension of process.env["PATHEXT"].split(path.delimiter)) { - if (extension) { - extensions.push(extension); - } - } - } - if (ioUtil.isRooted(tool)) { - const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); - if (filePath) { - return [filePath]; - } - return []; - } - if (tool.includes(path.sep)) { - return []; - } - const directories = []; - if (process.env.PATH) { - for (const p of process.env.PATH.split(path.delimiter)) { - if (p) { - directories.push(p); - } - } - } - const matches = []; - for (const directory of directories) { - const filePath = yield ioUtil.tryGetExecutablePath(path.join(directory, tool), extensions); - if (filePath) { - matches.push(filePath); - } - } - return matches; - }); - } - exports.findInPath = findInPath; - function readCopyOptions(options) { - const force = options.force == null ? true : options.force; - const recursive = Boolean(options.recursive); - const copySourceDirectory = options.copySourceDirectory == null ? true : Boolean(options.copySourceDirectory); - return { force, recursive, copySourceDirectory }; - } - function cpDirRecursive(sourceDir, destDir, currentDepth, force) { - return __awaiter(this, undefined, undefined, function* () { - if (currentDepth >= 255) - return; - currentDepth++; - yield mkdirP(destDir); - const files = yield ioUtil.readdir(sourceDir); - for (const fileName of files) { - const srcFile = `${sourceDir}/${fileName}`; - const destFile = `${destDir}/${fileName}`; - const srcFileStat = yield ioUtil.lstat(srcFile); - if (srcFileStat.isDirectory()) { - yield cpDirRecursive(srcFile, destFile, currentDepth, force); - } else { - yield copyFile(srcFile, destFile, force); - } - } - yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode); - }); - } - function copyFile(srcFile, destFile, force) { - return __awaiter(this, undefined, undefined, function* () { - if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) { - try { - yield ioUtil.lstat(destFile); - yield ioUtil.unlink(destFile); - } catch (e) { - if (e.code === "EPERM") { - yield ioUtil.chmod(destFile, "0666"); - yield ioUtil.unlink(destFile); - } - } - const symlinkFull = yield ioUtil.readlink(srcFile); - yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? "junction" : null); - } else if (!(yield ioUtil.exists(destFile)) || force) { - yield ioUtil.copyFile(srcFile, destFile); - } - }); - } -}); - -// ../node_modules/@actions/exec/lib/toolrunner.js -var require_toolrunner = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.argStringToArray = exports.ToolRunner = undefined; - var os = __importStar(__require("os")); - var events = __importStar(__require("events")); - var child = __importStar(__require("child_process")); - var path = __importStar(__require("path")); - var io = __importStar(require_io()); - var ioUtil = __importStar(require_io_util()); - var timers_1 = __require("timers"); - var IS_WINDOWS = process.platform === "win32"; - - class ToolRunner extends events.EventEmitter { - constructor(toolPath, args, options) { - super(); - if (!toolPath) { - throw new Error("Parameter 'toolPath' cannot be null or empty."); - } - this.toolPath = toolPath; - this.args = args || []; - this.options = options || {}; - } - _debug(message) { - if (this.options.listeners && this.options.listeners.debug) { - this.options.listeners.debug(message); - } - } - _getCommandString(options, noPrefix) { - const toolPath = this._getSpawnFileName(); - const args = this._getSpawnArgs(options); - let cmd = noPrefix ? "" : "[command]"; - if (IS_WINDOWS) { - if (this._isCmdFile()) { - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } else if (options.windowsVerbatimArguments) { - cmd += `"${toolPath}"`; - for (const a of args) { - cmd += ` ${a}`; - } - } else { - cmd += this._windowsQuoteCmdArg(toolPath); - for (const a of args) { - cmd += ` ${this._windowsQuoteCmdArg(a)}`; - } - } - } else { - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } - return cmd; - } - _processLineBuffer(data, strBuffer, onLine) { - try { - let s = strBuffer + data.toString(); - let n = s.indexOf(os.EOL); - while (n > -1) { - const line = s.substring(0, n); - onLine(line); - s = s.substring(n + os.EOL.length); - n = s.indexOf(os.EOL); - } - return s; - } catch (err) { - this._debug(`error processing line. Failed with error ${err}`); - return ""; - } - } - _getSpawnFileName() { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - return process.env["COMSPEC"] || "cmd.exe"; - } - } - return this.toolPath; - } - _getSpawnArgs(options) { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; - for (const a of this.args) { - argline += " "; - argline += options.windowsVerbatimArguments ? a : this._windowsQuoteCmdArg(a); - } - argline += '"'; - return [argline]; - } - } - return this.args; - } - _endsWith(str, end) { - return str.endsWith(end); - } - _isCmdFile() { - const upperToolPath = this.toolPath.toUpperCase(); - return this._endsWith(upperToolPath, ".CMD") || this._endsWith(upperToolPath, ".BAT"); - } - _windowsQuoteCmdArg(arg) { - if (!this._isCmdFile()) { - return this._uvQuoteCmdArg(arg); - } - if (!arg) { - return '""'; - } - const cmdSpecialChars = [ - " ", - "\t", - "&", - "(", - ")", - "[", - "]", - "{", - "}", - "^", - "=", - ";", - "!", - "'", - "+", - ",", - "`", - "~", - "|", - "<", - ">", - '"' - ]; - let needsQuotes = false; - for (const char of arg) { - if (cmdSpecialChars.some((x) => x === char)) { - needsQuotes = true; - break; - } - } - if (!needsQuotes) { - return arg; - } - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length;i > 0; i--) { - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === "\\") { - reverse += "\\"; - } else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += '"'; - } else { - quoteHit = false; - } - } - reverse += '"'; - return reverse.split("").reverse().join(""); - } - _uvQuoteCmdArg(arg) { - if (!arg) { - return '""'; - } - if (!arg.includes(" ") && !arg.includes("\t") && !arg.includes('"')) { - return arg; - } - if (!arg.includes('"') && !arg.includes("\\")) { - return `"${arg}"`; - } - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length;i > 0; i--) { - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === "\\") { - reverse += "\\"; - } else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += "\\"; - } else { - quoteHit = false; - } - } - reverse += '"'; - return reverse.split("").reverse().join(""); - } - _cloneExecOptions(options) { - options = options || {}; - const result = { - cwd: options.cwd || process.cwd(), - env: options.env || process.env, - silent: options.silent || false, - windowsVerbatimArguments: options.windowsVerbatimArguments || false, - failOnStdErr: options.failOnStdErr || false, - ignoreReturnCode: options.ignoreReturnCode || false, - delay: options.delay || 1e4 - }; - result.outStream = options.outStream || process.stdout; - result.errStream = options.errStream || process.stderr; - return result; - } - _getSpawnOptions(options, toolPath) { - options = options || {}; - const result = {}; - result.cwd = options.cwd; - result.env = options.env; - result["windowsVerbatimArguments"] = options.windowsVerbatimArguments || this._isCmdFile(); - if (options.windowsVerbatimArguments) { - result.argv0 = `"${toolPath}"`; - } - return result; - } - exec() { - return __awaiter(this, undefined, undefined, function* () { - if (!ioUtil.isRooted(this.toolPath) && (this.toolPath.includes("/") || IS_WINDOWS && this.toolPath.includes("\\"))) { - this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath); - } - this.toolPath = yield io.which(this.toolPath, true); - return new Promise((resolve, reject) => __awaiter(this, undefined, undefined, function* () { - this._debug(`exec tool: ${this.toolPath}`); - this._debug("arguments:"); - for (const arg of this.args) { - this._debug(` ${arg}`); - } - const optionsNonNull = this._cloneExecOptions(this.options); - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); - } - const state = new ExecState(optionsNonNull, this.toolPath); - state.on("debug", (message) => { - this._debug(message); - }); - if (this.options.cwd && !(yield ioUtil.exists(this.options.cwd))) { - return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`)); - } - const fileName = this._getSpawnFileName(); - const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); - let stdbuffer = ""; - if (cp.stdout) { - cp.stdout.on("data", (data) => { - if (this.options.listeners && this.options.listeners.stdout) { - this.options.listeners.stdout(data); - } - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(data); - } - stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => { - if (this.options.listeners && this.options.listeners.stdline) { - this.options.listeners.stdline(line); - } - }); - }); - } - let errbuffer = ""; - if (cp.stderr) { - cp.stderr.on("data", (data) => { - state.processStderr = true; - if (this.options.listeners && this.options.listeners.stderr) { - this.options.listeners.stderr(data); - } - if (!optionsNonNull.silent && optionsNonNull.errStream && optionsNonNull.outStream) { - const s = optionsNonNull.failOnStdErr ? optionsNonNull.errStream : optionsNonNull.outStream; - s.write(data); - } - errbuffer = this._processLineBuffer(data, errbuffer, (line) => { - if (this.options.listeners && this.options.listeners.errline) { - this.options.listeners.errline(line); - } - }); - }); - } - cp.on("error", (err) => { - state.processError = err.message; - state.processExited = true; - state.processClosed = true; - state.CheckComplete(); - }); - cp.on("exit", (code) => { - state.processExitCode = code; - state.processExited = true; - this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); - state.CheckComplete(); - }); - cp.on("close", (code) => { - state.processExitCode = code; - state.processExited = true; - state.processClosed = true; - this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); - state.CheckComplete(); - }); - state.on("done", (error, exitCode) => { - if (stdbuffer.length > 0) { - this.emit("stdline", stdbuffer); - } - if (errbuffer.length > 0) { - this.emit("errline", errbuffer); - } - cp.removeAllListeners(); - if (error) { - reject(error); - } else { - resolve(exitCode); - } - }); - if (this.options.input) { - if (!cp.stdin) { - throw new Error("child process missing stdin"); - } - cp.stdin.end(this.options.input); - } - })); - }); - } - } - exports.ToolRunner = ToolRunner; - function argStringToArray(argString) { - const args = []; - let inQuotes = false; - let escaped = false; - let arg = ""; - function append(c) { - if (escaped && c !== '"') { - arg += "\\"; - } - arg += c; - escaped = false; - } - for (let i = 0;i < argString.length; i++) { - const c = argString.charAt(i); - if (c === '"') { - if (!escaped) { - inQuotes = !inQuotes; - } else { - append(c); - } - continue; - } - if (c === "\\" && escaped) { - append(c); - continue; - } - if (c === "\\" && inQuotes) { - escaped = true; - continue; - } - if (c === " " && !inQuotes) { - if (arg.length > 0) { - args.push(arg); - arg = ""; - } - continue; - } - append(c); - } - if (arg.length > 0) { - args.push(arg.trim()); - } - return args; - } - exports.argStringToArray = argStringToArray; - - class ExecState extends events.EventEmitter { - constructor(options, toolPath) { - super(); - this.processClosed = false; - this.processError = ""; - this.processExitCode = 0; - this.processExited = false; - this.processStderr = false; - this.delay = 1e4; - this.done = false; - this.timeout = null; - if (!toolPath) { - throw new Error("toolPath must not be empty"); - } - this.options = options; - this.toolPath = toolPath; - if (options.delay) { - this.delay = options.delay; - } - } - CheckComplete() { - if (this.done) { - return; - } - if (this.processClosed) { - this._setResult(); - } else if (this.processExited) { - this.timeout = timers_1.setTimeout(ExecState.HandleTimeout, this.delay, this); - } - } - _debug(message) { - this.emit("debug", message); - } - _setResult() { - let error; - if (this.processExited) { - if (this.processError) { - error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`); - } else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { - error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); - } else if (this.processStderr && this.options.failOnStdErr) { - error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); - } - } - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } - this.done = true; - this.emit("done", error, this.processExitCode); - } - static HandleTimeout(state) { - if (state.done) { - return; - } - if (!state.processClosed && state.processExited) { - const message = `The STDIO streams did not close within ${state.delay / 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`; - state._debug(message); - } - state._setResult(); - } - } -}); - -// ../node_modules/@actions/exec/lib/exec.js -var require_exec = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getExecOutput = exports.exec = undefined; - var string_decoder_1 = __require("string_decoder"); - var tr = __importStar(require_toolrunner()); - function exec(commandLine, args, options) { - return __awaiter(this, undefined, undefined, function* () { - const commandArgs = tr.argStringToArray(commandLine); - if (commandArgs.length === 0) { - throw new Error(`Parameter 'commandLine' cannot be null or empty.`); - } - const toolPath = commandArgs[0]; - args = commandArgs.slice(1).concat(args || []); - const runner = new tr.ToolRunner(toolPath, args, options); - return runner.exec(); - }); - } - exports.exec = exec; - function getExecOutput(commandLine, args, options) { - var _a, _b; - return __awaiter(this, undefined, undefined, function* () { - let stdout = ""; - let stderr = ""; - const stdoutDecoder = new string_decoder_1.StringDecoder("utf8"); - const stderrDecoder = new string_decoder_1.StringDecoder("utf8"); - const originalStdoutListener = (_a = options === null || options === undefined ? undefined : options.listeners) === null || _a === undefined ? undefined : _a.stdout; - const originalStdErrListener = (_b = options === null || options === undefined ? undefined : options.listeners) === null || _b === undefined ? undefined : _b.stderr; - const stdErrListener = (data) => { - stderr += stderrDecoder.write(data); - if (originalStdErrListener) { - originalStdErrListener(data); - } - }; - const stdOutListener = (data) => { - stdout += stdoutDecoder.write(data); - if (originalStdoutListener) { - originalStdoutListener(data); - } - }; - const listeners = Object.assign(Object.assign({}, options === null || options === undefined ? undefined : options.listeners), { stdout: stdOutListener, stderr: stdErrListener }); - const exitCode = yield exec(commandLine, args, Object.assign(Object.assign({}, options), { listeners })); - stdout += stdoutDecoder.end(); - stderr += stderrDecoder.end(); - return { - exitCode, - stdout, - stderr - }; - }); - } - exports.getExecOutput = getExecOutput; -}); - -// ../node_modules/@actions/core/lib/platform.js -var require_platform = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __importDefault = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { default: mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getDetails = exports.isLinux = exports.isMacOS = exports.isWindows = exports.arch = exports.platform = undefined; - var os_1 = __importDefault(__require("os")); - var exec = __importStar(require_exec()); - var getWindowsInfo = () => __awaiter(undefined, undefined, undefined, function* () { - const { stdout: version } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', undefined, { - silent: true - }); - const { stdout: name } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"', undefined, { - silent: true - }); - return { - name: name.trim(), - version: version.trim() - }; - }); - var getMacOsInfo = () => __awaiter(undefined, undefined, undefined, function* () { - var _a, _b, _c, _d; - const { stdout } = yield exec.getExecOutput("sw_vers", undefined, { - silent: true - }); - const version = (_b = (_a = stdout.match(/ProductVersion:\s*(.+)/)) === null || _a === undefined ? undefined : _a[1]) !== null && _b !== undefined ? _b : ""; - const name = (_d = (_c = stdout.match(/ProductName:\s*(.+)/)) === null || _c === undefined ? undefined : _c[1]) !== null && _d !== undefined ? _d : ""; - return { - name, - version - }; - }); - var getLinuxInfo = () => __awaiter(undefined, undefined, undefined, function* () { - const { stdout } = yield exec.getExecOutput("lsb_release", ["-i", "-r", "-s"], { - silent: true - }); - const [name, version] = stdout.trim().split("\n"); - return { - name, - version - }; - }); - exports.platform = os_1.default.platform(); - exports.arch = os_1.default.arch(); - exports.isWindows = exports.platform === "win32"; - exports.isMacOS = exports.platform === "darwin"; - exports.isLinux = exports.platform === "linux"; - function getDetails() { - return __awaiter(this, undefined, undefined, function* () { - return Object.assign(Object.assign({}, yield exports.isWindows ? getWindowsInfo() : exports.isMacOS ? getMacOsInfo() : getLinuxInfo()), { - platform: exports.platform, - arch: exports.arch, - isWindows: exports.isWindows, - isMacOS: exports.isMacOS, - isLinux: exports.isLinux - }); - }); - } - exports.getDetails = getDetails; -}); - -// ../node_modules/@actions/core/lib/core.js -var require_core = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.platform = exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = exports.markdownSummary = exports.summary = exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = undefined; - var command_1 = require_command(); - var file_command_1 = require_file_command(); - var utils_1 = require_utils(); - var os = __importStar(__require("os")); - var path = __importStar(__require("path")); - var oidc_utils_1 = require_oidc_utils(); - var ExitCode; - (function(ExitCode2) { - ExitCode2[ExitCode2["Success"] = 0] = "Success"; - ExitCode2[ExitCode2["Failure"] = 1] = "Failure"; - })(ExitCode || (exports.ExitCode = ExitCode = {})); - function exportVariable(name, val) { - const convertedVal = (0, utils_1.toCommandValue)(val); - process.env[name] = convertedVal; - const filePath = process.env["GITHUB_ENV"] || ""; - if (filePath) { - return (0, file_command_1.issueFileCommand)("ENV", (0, file_command_1.prepareKeyValueMessage)(name, val)); - } - (0, command_1.issueCommand)("set-env", { name }, convertedVal); - } - exports.exportVariable = exportVariable; - function setSecret(secret) { - (0, command_1.issueCommand)("add-mask", {}, secret); - } - exports.setSecret = setSecret; - function addPath(inputPath) { - const filePath = process.env["GITHUB_PATH"] || ""; - if (filePath) { - (0, file_command_1.issueFileCommand)("PATH", inputPath); - } else { - (0, command_1.issueCommand)("add-path", {}, inputPath); - } - process.env["PATH"] = `${inputPath}${path.delimiter}${process.env["PATH"]}`; - } - exports.addPath = addPath; - function getInput(name, options) { - const val = process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] || ""; - if (options && options.required && !val) { - throw new Error(`Input required and not supplied: ${name}`); - } - if (options && options.trimWhitespace === false) { - return val; - } - return val.trim(); - } - exports.getInput = getInput; - function getMultilineInput(name, options) { - const inputs = getInput(name, options).split("\n").filter((x) => x !== ""); - if (options && options.trimWhitespace === false) { - return inputs; - } - return inputs.map((input) => input.trim()); - } - exports.getMultilineInput = getMultilineInput; - function getBooleanInput(name, options) { - const trueValue = ["true", "True", "TRUE"]; - const falseValue = ["false", "False", "FALSE"]; - const val = getInput(name, options); - if (trueValue.includes(val)) - return true; - if (falseValue.includes(val)) - return false; - throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); - } - exports.getBooleanInput = getBooleanInput; - function setOutput(name, value) { - const filePath = process.env["GITHUB_OUTPUT"] || ""; - if (filePath) { - return (0, file_command_1.issueFileCommand)("OUTPUT", (0, file_command_1.prepareKeyValueMessage)(name, value)); - } - process.stdout.write(os.EOL); - (0, command_1.issueCommand)("set-output", { name }, (0, utils_1.toCommandValue)(value)); - } - exports.setOutput = setOutput; - function setCommandEcho(enabled) { - (0, command_1.issue)("echo", enabled ? "on" : "off"); - } - exports.setCommandEcho = setCommandEcho; - function setFailed(message) { - process.exitCode = ExitCode.Failure; - error(message); - } - exports.setFailed = setFailed; - function isDebug() { - return process.env["RUNNER_DEBUG"] === "1"; - } - exports.isDebug = isDebug; - function debug(message) { - (0, command_1.issueCommand)("debug", {}, message); - } - exports.debug = debug; - function error(message, properties = {}) { - (0, command_1.issueCommand)("error", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports.error = error; - function warning(message, properties = {}) { - (0, command_1.issueCommand)("warning", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports.warning = warning; - function notice(message, properties = {}) { - (0, command_1.issueCommand)("notice", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports.notice = notice; - function info(message) { - process.stdout.write(message + os.EOL); - } - exports.info = info; - function startGroup(name) { - (0, command_1.issue)("group", name); - } - exports.startGroup = startGroup; - function endGroup() { - (0, command_1.issue)("endgroup"); - } - exports.endGroup = endGroup; - function group(name, fn) { - return __awaiter(this, undefined, undefined, function* () { - startGroup(name); - let result; - try { - result = yield fn(); - } finally { - endGroup(); - } - return result; - }); - } - exports.group = group; - function saveState(name, value) { - const filePath = process.env["GITHUB_STATE"] || ""; - if (filePath) { - return (0, file_command_1.issueFileCommand)("STATE", (0, file_command_1.prepareKeyValueMessage)(name, value)); - } - (0, command_1.issueCommand)("save-state", { name }, (0, utils_1.toCommandValue)(value)); - } - exports.saveState = saveState; - function getState(name) { - return process.env[`STATE_${name}`] || ""; - } - exports.getState = getState; - function getIDToken(aud) { - return __awaiter(this, undefined, undefined, function* () { - return yield oidc_utils_1.OidcClient.getIDToken(aud); - }); - } - exports.getIDToken = getIDToken; - var summary_1 = require_summary(); - Object.defineProperty(exports, "summary", { enumerable: true, get: function() { - return summary_1.summary; - } }); - var summary_2 = require_summary(); - Object.defineProperty(exports, "markdownSummary", { enumerable: true, get: function() { - return summary_2.markdownSummary; - } }); - var path_utils_1 = require_path_utils(); - Object.defineProperty(exports, "toPosixPath", { enumerable: true, get: function() { - return path_utils_1.toPosixPath; - } }); - Object.defineProperty(exports, "toWin32Path", { enumerable: true, get: function() { - return path_utils_1.toWin32Path; - } }); - Object.defineProperty(exports, "toPlatformPath", { enumerable: true, get: function() { - return path_utils_1.toPlatformPath; - } }); - exports.platform = __importStar(require_platform()); -}); - -// src/jobs/main.ts -var import_core = __toESM(require_core(), 1); -var import_exec = __toESM(require_exec(), 1); -import * as fs from "node:fs"; -import * as path from "node:path"; - -// src/constants.ts -var HOST = "localhost"; -var YDB_GRPC_PORT = 2135; -var YDB_MON_PORT = 8765; -var YDB_IC_PORT = 19001; -var YDB_TENANT = "/Root/testdb"; -var YDB_ENDPOINT = `grpc://${HOST}:${YDB_GRPC_PORT}`; -var YBD_CONNECTION_STRING = `${YDB_ENDPOINT}${YDB_TENANT}`; -var PROMETHEUS_PORT = 9090; -var PROMETHEUS_PUSHGATEWAY_PORT = 9091; -var PROMETHEUS_URL = `http://${HOST}:${PROMETHEUS_PORT}`; -var PROMETHEUS_PUSHGATEWAY_URL = `http://${HOST}:${PROMETHEUS_PUSHGATEWAY_PORT}`; - -// src/configs.ts -var prometheusConfig = ` -global: - scrape_interval: 1s - evaluation_interval: 1s - -scrape_configs: - - job_name: 'pushgateway' - static_configs: - - targets: ['${HOST}:${PROMETHEUS_PUSHGATEWAY_PORT}'] -`; -var ydbConfig = ` -actor_system_config: - cpu_count: 1 - node_type: STORAGE - use_auto_config: true -blob_storage_config: - service_set: - groups: - - erasure_species: none - rings: - - fail_domains: - - vdisk_locations: - - node_id: 1 - path: SectorMap:1:64 - pdisk_category: SSD -channel_profile_config: - profile: - - channel: - - erasure_species: none - pdisk_category: 0 - storage_pool_kind: ssd - - erasure_species: none - pdisk_category: 0 - storage_pool_kind: ssd - - erasure_species: none - pdisk_category: 0 - storage_pool_kind: ssd - profile_id: 0 -domains_config: - domain: - - name: Root - storage_pool_types: - - kind: ssd - pool_config: - box_id: 1 - erasure_species: none - kind: ssd - pdisk_filter: - - property: - - type: SSD - vdisk_kind: Default - state_storage: - - ring: - node: - - 1 - nto_select: 1 - ssid: 1 -grpc_config: - port: ${YDB_GRPC_PORT} -host_configs: - - drive: - - path: SectorMap:1:64 - type: SSD - host_config_id: 1 -hosts: - - host: ${HOST} - host_config_id: 1 - node_id: 1 - port: ${YDB_IC_PORT} - walle_location: - body: 1 - data_center: az-1 - rack: "0" -static_erasure: none -`; -var generateStaticNode = () => ` - static-0: - <<: *ydb-common - container_name: ydb-static-0 - command: - - /opt/ydb/bin/ydbd - - server - - --grpc-port - - "${YDB_GRPC_PORT}" - - --mon-port - - "${YDB_MON_PORT}" - - --ic-port - - "${YDB_IC_PORT}" - - --yaml-config - - /opt/ydb/cfg/config.yaml - - --node - - static - - --label - - deployment=docker - ports: - - ${YDB_GRPC_PORT}:${YDB_GRPC_PORT} - - ${YDB_MON_PORT}:${YDB_MON_PORT} - - ${YDB_IC_PORT}:${YDB_IC_PORT} - healthcheck: - test: bash -c "exec 6<> /dev/tcp/${HOST}/${YDB_GRPC_PORT}" - interval: 10s - timeout: 1s - retries: 3 - start_period: 30s - deploy: - <<: *ydb-deploy - - static-init: - <<: *ydb-common - restart: on-failure - container_name: ydb-static-init - command: - - /opt/ydb/bin/ydbd - - -s - - ${YDB_ENDPOINT} - - admin - - blobstorage - - config - - init - - --yaml-file - - /opt/ydb/cfg/config.yaml - depends_on: - static-0: - condition: service_healthy - - tenant-init: - <<: *ydb-common - restart: on-failure - container_name: ydb-tenant-init - command: - - /opt/ydb/bin/ydbd - - -s - - ${YDB_ENDPOINT} - - admin - - database - - ${YDB_TENANT} - - create - - ssd:1 - depends_on: - static-init: - condition: service_completed_successfully -`.slice(1); -var generateDynamicNode = (idx) => ` - dynamic-${idx}: - <<: *ydb-common - container_name: ydb-dynamic-${idx} - command: - - /opt/ydb/bin/ydbd - - server - - --grpc-port - - "${YDB_GRPC_PORT + idx}" - - --mon-port - - "${YDB_MON_PORT + idx}" - - --ic-port - - "${YDB_IC_PORT + idx}" - - --yaml-config - - /opt/ydb/cfg/config.yaml - - --tenant - - ${YDB_TENANT} - - --node-broker - - ${YDB_ENDPOINT} - - --label - - deployment=docker - ports: - - ${YDB_GRPC_PORT + idx}:${YDB_GRPC_PORT + idx} - - ${YDB_MON_PORT + idx}:${YDB_MON_PORT + idx} - - ${YDB_IC_PORT + idx}:${YDB_IC_PORT + idx} - healthcheck: - test: bash -c "exec 6<> /dev/tcp/${HOST}/${YDB_GRPC_PORT + idx}" - interval: 10s - timeout: 1s - retries: 3 - start_period: 30s - depends_on: - static-0: - condition: service_healthy - static-init: - condition: service_completed_successfully - tenant-init: - condition: service_completed_successfully - deploy: - <<: *ydb-deploy -`.slice(1); -var generateMonitoring = () => ` - prometheus: - image: prom/prometheus - restart: unless-stopped - <<: *runtime - ports: - - "${PROMETHEUS_PORT}:${PROMETHEUS_PORT}" - volumes: - - ./prometheus.yml:/etc/prometheus/prometheus.yml - deploy: &monitoring-deploy - resources: - limits: - cpus: '0.1' - memory: 1000M - reservations: - cpus: '0.001' - memory: 50M - - prometheus-pushgateway: - image: prom/pushgateway - restart: unless-stopped - <<: *runtime - ports: - - "${PROMETHEUS_PUSHGATEWAY_PORT}:${PROMETHEUS_PUSHGATEWAY_PORT}" - network_mode: host - deploy: - <<: *monitoring-deploy -`.slice(1); -var generateComposeFile = (ydbDatabaseNodeCount) => `# Code generated by Github Action; DO NOT EDIT. - -x-runtime: &runtime - platform: linux/amd64 - privileged: true - network_mode: host - -x-node: &ydb-common - image: cr.yandex/crptqonuodf51kdj7a7d/ydb:24.2.7 - restart: always - hostname: ${HOST} - <<: *runtime - volumes: - - ./ydb.yaml:/opt/ydb/cfg/config.yaml - -x-deploy: &ydb-deploy - restart_policy: - condition: any - resources: - limits: - cpus: '1' - memory: 1000M - reservations: - cpus: '0.1' - memory: 250M - -name: ydb - -services: -${generateStaticNode()} -${Array.from({ length: ydbDatabaseNodeCount }, (_, i) => i + 1).map(generateDynamicNode).join("\n")} -${generateMonitoring()} -`; - -// src/jobs/main.ts -(async function main() { - let cwd = path.join(process.cwd(), ".slo"); - import_core.saveState("CWD", cwd); - import_core.debug("Creating working directory..."); - fs.mkdirSync(cwd, { recursive: true }); - { - import_core.debug("Creating ydb config..."); - let configPath = path.join(cwd, "ydb.yaml"); - let configContent = ydbConfig; - fs.writeFileSync(configPath, configContent, { encoding: "utf-8" }); - import_core.debug(`Created config for ydb: ${configPath}`); - } - { - import_core.debug("Creating prometheus config..."); - let configPath = path.join(cwd, "prometheus.yml"); - let configContent = prometheusConfig; - fs.writeFileSync(configPath, configContent, { encoding: "utf-8" }); - import_core.debug(`Created config for prometheus: ${configPath}`); - } - { - import_core.debug("Creating compose config..."); - let composePath = path.join(cwd, "compose.yaml"); - let composeContent = generateComposeFile(parseInt(import_core.getInput("YDB_DATABASE_NODE_COUNT", { required: true }))); - fs.writeFileSync(composePath, composeContent, { encoding: "utf-8" }); - import_core.debug(`Created compose.yaml: ${composePath}`); - } - import_core.debug("Starting YDB..."); - await import_exec.exec(`docker`, [`compose`, `-f`, `compose.yaml`, `up`, `--quiet-pull`, `-d`], { cwd }); - let start = new Date; - import_core.debug(`YDB started at ${start}`); - import_core.saveState("YDB_START_TIME", start.toISOString()); -})(); - -//# debugId=C4B9F9D28B0648F164756E2164756E21 -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL3V0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9jb21tYW5kLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9maWxlLWNvbW1hbmQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9wcm94eS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdHVubmVsL2xpYi90dW5uZWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS9zeW1ib2xzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvcmUvZXJyb3JzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvcmUvY29uc3RhbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvcmUvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi90aW1lcnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9kZXBzL3N0cmVhbXNlYXJjaC9zYm1oLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvZGVwcy9kaWNlci9saWIvUGFydFN0cmVhbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi91dGlscy9nZXRMaW1pdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2RlcHMvZGljZXIvbGliL0hlYWRlclBhcnNlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2RlcHMvZGljZXIvbGliL0RpY2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvbGliL3V0aWxzL2RlY29kZVRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvcGFyc2VQYXJhbXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvYmFzZW5hbWUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdHlwZXMvbXVsdGlwYXJ0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvbGliL3V0aWxzL0RlY29kZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdHlwZXMvdXJsZW5jb2RlZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi9tYWluLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2NvbnN0YW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9nbG9iYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9zeW1ib2xzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL3dlYmlkbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9kYXRhVVJMLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2ZpbGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvZm9ybWRhdGEuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvYm9keS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL3JlcXVlc3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZGlzcGF0Y2hlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9kaXNwYXRjaGVyLWJhc2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS9jb25uZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2xsaHR0cC91dGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9sbGh0dHAvY29uc3RhbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2hhbmRsZXIvUmVkaXJlY3RIYW5kbGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbGxodHRwL2xsaHR0cC13YXNtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2xsaHR0cC9sbGh0dHBfc2ltZC13YXNtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NsaWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9ub2RlL2ZpeGVkLXF1ZXVlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3Bvb2wtc3RhdHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvcG9vbC1iYXNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3Bvb2wuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYmFsYW5jZWQtcG9vbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb21wYXQvZGlzcGF0Y2hlci13ZWFrcmVmLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FnZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9yZWFkYWJsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvYWJvcnQtc2lnbmFsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktcmVxdWVzdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvYXBpLXN0cmVhbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvYXBpLXBpcGVsaW5lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktdXBncmFkZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvYXBpLWNvbm5lY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYXBpL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1lcnJvcnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9tb2NrLXN5bWJvbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9tb2NrLXV0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1pbnRlcmNlcHRvci5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stY2xpZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1wb29sLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svcGx1cmFsaXplci5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL3BlbmRpbmctaW50ZXJjZXB0b3JzLWZvcm1hdHRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stYWdlbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvcHJveHktYWdlbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvaGFuZGxlci9SZXRyeUhhbmRsZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZ2xvYmFsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2hhbmRsZXIvRGVjb3JhdG9ySGFuZGxlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9oZWFkZXJzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL3Jlc3BvbnNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL3JlcXVlc3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmlsZWFwaS9zeW1ib2xzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvcHJvZ3Jlc3NldmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9maWxlYXBpL2VuY29kaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9maWxlYXBpL2ZpbGVyZWFkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY2FjaGUvc3ltYm9scy5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jYWNoZS91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NhY2hlL2NhY2hlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NhY2hlL2NhY2hlc3RvcmFnZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb29raWVzL2NvbnN0YW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb29raWVzL3V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29va2llcy9wYXJzZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb29raWVzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC9jb25zdGFudHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L3N5bWJvbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L2V2ZW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvY29ubmVjdGlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvZnJhbWUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L3JlY2VpdmVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC93ZWJzb2NrZXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvaHR0cC1jbGllbnQvbGliL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9odHRwLWNsaWVudC9saWIvYXV0aC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvb2lkYy11dGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvc3VtbWFyeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvcGF0aC11dGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvaW8vbGliL2lvLXV0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2lvL2xpYi9pby5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZXhlYy9saWIvdG9vbHJ1bm5lci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZXhlYy9saWIvZXhlYy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvcGxhdGZvcm0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL2NvcmUuanMiLCAic3JjL2pvYnMvbWFpbi50cyIsICJzcmMvY29uc3RhbnRzLnRzIiwgInNyYy9jb25maWdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gV2UgdXNlIGFueSBhcyBhIHZhbGlkIGlucHV0IHR5cGVcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudG9Db21tYW5kUHJvcGVydGllcyA9IGV4cG9ydHMudG9Db21tYW5kVmFsdWUgPSB2b2lkIDA7XG4vKipcbiAqIFNhbml0aXplcyBhbiBpbnB1dCBpbnRvIGEgc3RyaW5nIHNvIGl0IGNhbiBiZSBwYXNzZWQgaW50byBpc3N1ZUNvbW1hbmQgc2FmZWx5XG4gKiBAcGFyYW0gaW5wdXQgaW5wdXQgdG8gc2FuaXRpemUgaW50byBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiB0b0NvbW1hbmRWYWx1ZShpbnB1dCkge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShpbnB1dCk7XG59XG5leHBvcnRzLnRvQ29tbWFuZFZhbHVlID0gdG9Db21tYW5kVmFsdWU7XG4vKipcbiAqXG4gKiBAcGFyYW0gYW5ub3RhdGlvblByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kIHByb3BlcnRpZXMgdG8gc2VuZCB3aXRoIHRoZSBhY3R1YWwgYW5ub3RhdGlvbiBjb21tYW5kXG4gKiBTZWUgSXNzdWVDb21tYW5kUHJvcGVydGllczogaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL2Jsb2IvbWFpbi9zcmMvUnVubmVyLldvcmtlci9BY3Rpb25Db21tYW5kTWFuYWdlci5jcyNMNjQ2XG4gKi9cbmZ1bmN0aW9uIHRvQ29tbWFuZFByb3BlcnRpZXMoYW5ub3RhdGlvblByb3BlcnRpZXMpIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKGFubm90YXRpb25Qcm9wZXJ0aWVzKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogYW5ub3RhdGlvblByb3BlcnRpZXMudGl0bGUsXG4gICAgICAgIGZpbGU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLmZpbGUsXG4gICAgICAgIGxpbmU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLnN0YXJ0TGluZSxcbiAgICAgICAgZW5kTGluZTogYW5ub3RhdGlvblByb3BlcnRpZXMuZW5kTGluZSxcbiAgICAgICAgY29sOiBhbm5vdGF0aW9uUHJvcGVydGllcy5zdGFydENvbHVtbixcbiAgICAgICAgZW5kQ29sdW1uOiBhbm5vdGF0aW9uUHJvcGVydGllcy5lbmRDb2x1bW5cbiAgICB9O1xufVxuZXhwb3J0cy50b0NvbW1hbmRQcm9wZXJ0aWVzID0gdG9Db21tYW5kUHJvcGVydGllcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNzdWUgPSBleHBvcnRzLmlzc3VlQ29tbWFuZCA9IHZvaWQgMDtcbmNvbnN0IG9zID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG4vKipcbiAqIENvbW1hbmRzXG4gKlxuICogQ29tbWFuZCBGb3JtYXQ6XG4gKiAgIDo6bmFtZSBrZXk9dmFsdWUsa2V5PXZhbHVlOjptZXNzYWdlXG4gKlxuICogRXhhbXBsZXM6XG4gKiAgIDo6d2FybmluZzo6VGhpcyBpcyB0aGUgbWVzc2FnZVxuICogICA6OnNldC1lbnYgbmFtZT1NWV9WQVI6OnNvbWUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNzdWVDb21tYW5kKGNvbW1hbmQsIHByb3BlcnRpZXMsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjbWQgPSBuZXcgQ29tbWFuZChjb21tYW5kLCBwcm9wZXJ0aWVzLCBtZXNzYWdlKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjbWQudG9TdHJpbmcoKSArIG9zLkVPTCk7XG59XG5leHBvcnRzLmlzc3VlQ29tbWFuZCA9IGlzc3VlQ29tbWFuZDtcbmZ1bmN0aW9uIGlzc3VlKG5hbWUsIG1lc3NhZ2UgPSAnJykge1xuICAgIGlzc3VlQ29tbWFuZChuYW1lLCB7fSwgbWVzc2FnZSk7XG59XG5leHBvcnRzLmlzc3VlID0gaXNzdWU7XG5jb25zdCBDTURfU1RSSU5HID0gJzo6JztcbmNsYXNzIENvbW1hbmQge1xuICAgIGNvbnN0cnVjdG9yKGNvbW1hbmQsIHByb3BlcnRpZXMsIG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKCFjb21tYW5kKSB7XG4gICAgICAgICAgICBjb21tYW5kID0gJ21pc3NpbmcuY29tbWFuZCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBjbWRTdHIgPSBDTURfU1RSSU5HICsgdGhpcy5jb21tYW5kO1xuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKHRoaXMucHJvcGVydGllcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY21kU3RyICs9ICcgJztcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRTdHIgKz0gJywnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY21kU3RyICs9IGAke2tleX09JHtlc2NhcGVQcm9wZXJ0eSh2YWwpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY21kU3RyICs9IGAke0NNRF9TVFJJTkd9JHtlc2NhcGVEYXRhKHRoaXMubWVzc2FnZSl9YDtcbiAgICAgICAgcmV0dXJuIGNtZFN0cjtcbiAgICB9XG59XG5mdW5jdGlvbiBlc2NhcGVEYXRhKHMpIHtcbiAgICByZXR1cm4gKDAsIHV0aWxzXzEudG9Db21tYW5kVmFsdWUpKHMpXG4gICAgICAgIC5yZXBsYWNlKC8lL2csICclMjUnKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csICclMEQnKVxuICAgICAgICAucmVwbGFjZSgvXFxuL2csICclMEEnKTtcbn1cbmZ1bmN0aW9uIGVzY2FwZVByb3BlcnR5KHMpIHtcbiAgICByZXR1cm4gKDAsIHV0aWxzXzEudG9Db21tYW5kVmFsdWUpKHMpXG4gICAgICAgIC5yZXBsYWNlKC8lL2csICclMjUnKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csICclMEQnKVxuICAgICAgICAucmVwbGFjZSgvXFxuL2csICclMEEnKVxuICAgICAgICAucmVwbGFjZSgvOi9nLCAnJTNBJylcbiAgICAgICAgLnJlcGxhY2UoLywvZywgJyUyQycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbWFuZC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gRm9yIGludGVybmFsIHVzZSwgc3ViamVjdCB0byBjaGFuZ2UuXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHJlcGFyZUtleVZhbHVlTWVzc2FnZSA9IGV4cG9ydHMuaXNzdWVGaWxlQ29tbWFuZCA9IHZvaWQgMDtcbi8vIFdlIHVzZSBhbnkgYXMgYSB2YWxpZCBpbnB1dCB0eXBlXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5jb25zdCBjcnlwdG8gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImNyeXB0b1wiKSk7XG5jb25zdCBmcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZnNcIikpO1xuY29uc3Qgb3MgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm9zXCIpKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmZ1bmN0aW9uIGlzc3VlRmlsZUNvbW1hbmQoY29tbWFuZCwgbWVzc2FnZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbYEdJVEhVQl8ke2NvbW1hbmR9YF07XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBmaWxlIGNvbW1hbmQgJHtjb21tYW5kfWApO1xuICAgIH1cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBmaWxlIGF0IHBhdGg6ICR7ZmlsZVBhdGh9YCk7XG4gICAgfVxuICAgIGZzLmFwcGVuZEZpbGVTeW5jKGZpbGVQYXRoLCBgJHsoMCwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSkobWVzc2FnZSl9JHtvcy5FT0x9YCwge1xuICAgICAgICBlbmNvZGluZzogJ3V0ZjgnXG4gICAgfSk7XG59XG5leHBvcnRzLmlzc3VlRmlsZUNvbW1hbmQgPSBpc3N1ZUZpbGVDb21tYW5kO1xuZnVuY3Rpb24gcHJlcGFyZUtleVZhbHVlTWVzc2FnZShrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgZGVsaW1pdGVyID0gYGdoYWRlbGltaXRlcl8ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgICBjb25zdCBjb252ZXJ0ZWRWYWx1ZSA9ICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWx1ZSk7XG4gICAgLy8gVGhlc2Ugc2hvdWxkIHJlYWxpc3RpY2FsbHkgbmV2ZXIgaGFwcGVuLCBidXQganVzdCBpbiBjYXNlIHNvbWVvbmUgZmluZHMgYVxuICAgIC8vIHdheSB0byBleHBsb2l0IHV1aWQgZ2VuZXJhdGlvbiBsZXQncyBub3QgYWxsb3cga2V5cyBvciB2YWx1ZXMgdGhhdCBjb250YWluXG4gICAgLy8gdGhlIGRlbGltaXRlci5cbiAgICBpZiAoa2V5LmluY2x1ZGVzKGRlbGltaXRlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGlucHV0OiBuYW1lIHNob3VsZCBub3QgY29udGFpbiB0aGUgZGVsaW1pdGVyIFwiJHtkZWxpbWl0ZXJ9XCJgKTtcbiAgICB9XG4gICAgaWYgKGNvbnZlcnRlZFZhbHVlLmluY2x1ZGVzKGRlbGltaXRlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGlucHV0OiB2YWx1ZSBzaG91bGQgbm90IGNvbnRhaW4gdGhlIGRlbGltaXRlciBcIiR7ZGVsaW1pdGVyfVwiYCk7XG4gICAgfVxuICAgIHJldHVybiBgJHtrZXl9PDwke2RlbGltaXRlcn0ke29zLkVPTH0ke2NvbnZlcnRlZFZhbHVlfSR7b3MuRU9MfSR7ZGVsaW1pdGVyfWA7XG59XG5leHBvcnRzLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UgPSBwcmVwYXJlS2V5VmFsdWVNZXNzYWdlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZS1jb21tYW5kLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNoZWNrQnlwYXNzID0gZXhwb3J0cy5nZXRQcm94eVVybCA9IHZvaWQgMDtcbmZ1bmN0aW9uIGdldFByb3h5VXJsKHJlcVVybCkge1xuICAgIGNvbnN0IHVzaW5nU3NsID0gcmVxVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICBpZiAoY2hlY2tCeXBhc3MocmVxVXJsKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBwcm94eVZhciA9ICgoKSA9PiB7XG4gICAgICAgIGlmICh1c2luZ1NzbCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydodHRwc19wcm94eSddIHx8IHByb2Nlc3MuZW52WydIVFRQU19QUk9YWSddO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydodHRwX3Byb3h5J10gfHwgcHJvY2Vzcy5lbnZbJ0hUVFBfUFJPWFknXTtcbiAgICAgICAgfVxuICAgIH0pKCk7XG4gICAgaWYgKHByb3h5VmFyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERlY29kZWRVUkwocHJveHlWYXIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgaWYgKCFwcm94eVZhci5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIXByb3h5VmFyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWNvZGVkVVJMKGBodHRwOi8vJHtwcm94eVZhcn1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnRzLmdldFByb3h5VXJsID0gZ2V0UHJveHlVcmw7XG5mdW5jdGlvbiBjaGVja0J5cGFzcyhyZXFVcmwpIHtcbiAgICBpZiAoIXJlcVVybC5ob3N0bmFtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJlcUhvc3QgPSByZXFVcmwuaG9zdG5hbWU7XG4gICAgaWYgKGlzTG9vcGJhY2tBZGRyZXNzKHJlcUhvc3QpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBub1Byb3h5ID0gcHJvY2Vzcy5lbnZbJ25vX3Byb3h5J10gfHwgcHJvY2Vzcy5lbnZbJ05PX1BST1hZJ10gfHwgJyc7XG4gICAgaWYgKCFub1Byb3h5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRGV0ZXJtaW5lIHRoZSByZXF1ZXN0IHBvcnRcbiAgICBsZXQgcmVxUG9ydDtcbiAgICBpZiAocmVxVXJsLnBvcnQpIHtcbiAgICAgICAgcmVxUG9ydCA9IE51bWJlcihyZXFVcmwucG9ydCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgICAgICByZXFQb3J0ID0gODA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgcmVxUG9ydCA9IDQ0MztcbiAgICB9XG4gICAgLy8gRm9ybWF0IHRoZSByZXF1ZXN0IGhvc3RuYW1lIGFuZCBob3N0bmFtZSB3aXRoIHBvcnRcbiAgICBjb25zdCB1cHBlclJlcUhvc3RzID0gW3JlcVVybC5ob3N0bmFtZS50b1VwcGVyQ2FzZSgpXTtcbiAgICBpZiAodHlwZW9mIHJlcVBvcnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVwcGVyUmVxSG9zdHMucHVzaChgJHt1cHBlclJlcUhvc3RzWzBdfToke3JlcVBvcnR9YCk7XG4gICAgfVxuICAgIC8vIENvbXBhcmUgcmVxdWVzdCBob3N0IGFnYWluc3Qgbm9wcm94eVxuICAgIGZvciAoY29uc3QgdXBwZXJOb1Byb3h5SXRlbSBvZiBub1Byb3h5XG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAoeCA9PiB4LnRyaW0oKS50b1VwcGVyQ2FzZSgpKVxuICAgICAgICAuZmlsdGVyKHggPT4geCkpIHtcbiAgICAgICAgaWYgKHVwcGVyTm9Qcm94eUl0ZW0gPT09ICcqJyB8fFxuICAgICAgICAgICAgdXBwZXJSZXFIb3N0cy5zb21lKHggPT4geCA9PT0gdXBwZXJOb1Byb3h5SXRlbSB8fFxuICAgICAgICAgICAgICAgIHguZW5kc1dpdGgoYC4ke3VwcGVyTm9Qcm94eUl0ZW19YCkgfHxcbiAgICAgICAgICAgICAgICAodXBwZXJOb1Byb3h5SXRlbS5zdGFydHNXaXRoKCcuJykgJiZcbiAgICAgICAgICAgICAgICAgICAgeC5lbmRzV2l0aChgJHt1cHBlck5vUHJveHlJdGVtfWApKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuY2hlY2tCeXBhc3MgPSBjaGVja0J5cGFzcztcbmZ1bmN0aW9uIGlzTG9vcGJhY2tBZGRyZXNzKGhvc3QpIHtcbiAgICBjb25zdCBob3N0TG93ZXIgPSBob3N0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChob3N0TG93ZXIgPT09ICdsb2NhbGhvc3QnIHx8XG4gICAgICAgIGhvc3RMb3dlci5zdGFydHNXaXRoKCcxMjcuJykgfHxcbiAgICAgICAgaG9zdExvd2VyLnN0YXJ0c1dpdGgoJ1s6OjFdJykgfHxcbiAgICAgICAgaG9zdExvd2VyLnN0YXJ0c1dpdGgoJ1swOjA6MDowOjA6MDowOjFdJykpO1xufVxuY2xhc3MgRGVjb2RlZFVSTCBleHRlbmRzIFVSTCB7XG4gICAgY29uc3RydWN0b3IodXJsLCBiYXNlKSB7XG4gICAgICAgIHN1cGVyKHVybCwgYmFzZSk7XG4gICAgICAgIHRoaXMuX2RlY29kZWRVc2VybmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChzdXBlci51c2VybmFtZSk7XG4gICAgICAgIHRoaXMuX2RlY29kZWRQYXNzd29yZCA9IGRlY29kZVVSSUNvbXBvbmVudChzdXBlci5wYXNzd29yZCk7XG4gICAgfVxuICAgIGdldCB1c2VybmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29kZWRVc2VybmFtZTtcbiAgICB9XG4gICAgZ2V0IHBhc3N3b3JkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlZFBhc3N3b3JkO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3h5LmpzLm1hcCIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7XG52YXIgdGxzID0gcmVxdWlyZSgndGxzJyk7XG52YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcbnZhciBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG52YXIgZXZlbnRzID0gcmVxdWlyZSgnZXZlbnRzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuXG5leHBvcnRzLmh0dHBPdmVySHR0cCA9IGh0dHBPdmVySHR0cDtcbmV4cG9ydHMuaHR0cHNPdmVySHR0cCA9IGh0dHBzT3Zlckh0dHA7XG5leHBvcnRzLmh0dHBPdmVySHR0cHMgPSBodHRwT3Zlckh0dHBzO1xuZXhwb3J0cy5odHRwc092ZXJIdHRwcyA9IGh0dHBzT3Zlckh0dHBzO1xuXG5cbmZ1bmN0aW9uIGh0dHBPdmVySHR0cChvcHRpb25zKSB7XG4gIHZhciBhZ2VudCA9IG5ldyBUdW5uZWxpbmdBZ2VudChvcHRpb25zKTtcbiAgYWdlbnQucmVxdWVzdCA9IGh0dHAucmVxdWVzdDtcbiAgcmV0dXJuIGFnZW50O1xufVxuXG5mdW5jdGlvbiBodHRwc092ZXJIdHRwKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpO1xuICBhZ2VudC5yZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0O1xuICBhZ2VudC5jcmVhdGVTb2NrZXQgPSBjcmVhdGVTZWN1cmVTb2NrZXQ7XG4gIGFnZW50LmRlZmF1bHRQb3J0ID0gNDQzO1xuICByZXR1cm4gYWdlbnQ7XG59XG5cbmZ1bmN0aW9uIGh0dHBPdmVySHR0cHMob3B0aW9ucykge1xuICB2YXIgYWdlbnQgPSBuZXcgVHVubmVsaW5nQWdlbnQob3B0aW9ucyk7XG4gIGFnZW50LnJlcXVlc3QgPSBodHRwcy5yZXF1ZXN0O1xuICByZXR1cm4gYWdlbnQ7XG59XG5cbmZ1bmN0aW9uIGh0dHBzT3Zlckh0dHBzKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpO1xuICBhZ2VudC5yZXF1ZXN0ID0gaHR0cHMucmVxdWVzdDtcbiAgYWdlbnQuY3JlYXRlU29ja2V0ID0gY3JlYXRlU2VjdXJlU29ja2V0O1xuICBhZ2VudC5kZWZhdWx0UG9ydCA9IDQ0MztcbiAgcmV0dXJuIGFnZW50O1xufVxuXG5cbmZ1bmN0aW9uIFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBzZWxmLnByb3h5T3B0aW9ucyA9IHNlbGYub3B0aW9ucy5wcm94eSB8fCB7fTtcbiAgc2VsZi5tYXhTb2NrZXRzID0gc2VsZi5vcHRpb25zLm1heFNvY2tldHMgfHwgaHR0cC5BZ2VudC5kZWZhdWx0TWF4U29ja2V0cztcbiAgc2VsZi5yZXF1ZXN0cyA9IFtdO1xuICBzZWxmLnNvY2tldHMgPSBbXTtcblxuICBzZWxmLm9uKCdmcmVlJywgZnVuY3Rpb24gb25GcmVlKHNvY2tldCwgaG9zdCwgcG9ydCwgbG9jYWxBZGRyZXNzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0b09wdGlvbnMoaG9zdCwgcG9ydCwgbG9jYWxBZGRyZXNzKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc2VsZi5yZXF1ZXN0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgdmFyIHBlbmRpbmcgPSBzZWxmLnJlcXVlc3RzW2ldO1xuICAgICAgaWYgKHBlbmRpbmcuaG9zdCA9PT0gb3B0aW9ucy5ob3N0ICYmIHBlbmRpbmcucG9ydCA9PT0gb3B0aW9ucy5wb3J0KSB7XG4gICAgICAgIC8vIERldGVjdCB0aGUgcmVxdWVzdCB0byBjb25uZWN0IHNhbWUgb3JpZ2luIHNlcnZlcixcbiAgICAgICAgLy8gcmV1c2UgdGhlIGNvbm5lY3Rpb24uXG4gICAgICAgIHNlbGYucmVxdWVzdHMuc3BsaWNlKGksIDEpO1xuICAgICAgICBwZW5kaW5nLnJlcXVlc3Qub25Tb2NrZXQoc29ja2V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgIHNlbGYucmVtb3ZlU29ja2V0KHNvY2tldCk7XG4gIH0pO1xufVxudXRpbC5pbmhlcml0cyhUdW5uZWxpbmdBZ2VudCwgZXZlbnRzLkV2ZW50RW1pdHRlcik7XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5hZGRSZXF1ZXN0ID0gZnVuY3Rpb24gYWRkUmVxdWVzdChyZXEsIGhvc3QsIHBvcnQsIGxvY2FsQWRkcmVzcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBvcHRpb25zID0gbWVyZ2VPcHRpb25zKHtyZXF1ZXN0OiByZXF9LCBzZWxmLm9wdGlvbnMsIHRvT3B0aW9ucyhob3N0LCBwb3J0LCBsb2NhbEFkZHJlc3MpKTtcblxuICBpZiAoc2VsZi5zb2NrZXRzLmxlbmd0aCA+PSB0aGlzLm1heFNvY2tldHMpIHtcbiAgICAvLyBXZSBhcmUgb3ZlciBsaW1pdCBzbyB3ZSdsbCBhZGQgaXQgdG8gdGhlIHF1ZXVlLlxuICAgIHNlbGYucmVxdWVzdHMucHVzaChvcHRpb25zKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiB3ZSBhcmUgdW5kZXIgbWF4U29ja2V0cyBjcmVhdGUgYSBuZXcgb25lLlxuICBzZWxmLmNyZWF0ZVNvY2tldChvcHRpb25zLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICBzb2NrZXQub24oJ2ZyZWUnLCBvbkZyZWUpO1xuICAgIHNvY2tldC5vbignY2xvc2UnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgIHNvY2tldC5vbignYWdlbnRSZW1vdmUnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgIHJlcS5vblNvY2tldChzb2NrZXQpO1xuXG4gICAgZnVuY3Rpb24gb25GcmVlKCkge1xuICAgICAgc2VsZi5lbWl0KCdmcmVlJywgc29ja2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsb3NlT3JSZW1vdmUoZXJyKSB7XG4gICAgICBzZWxmLnJlbW92ZVNvY2tldChzb2NrZXQpO1xuICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdmcmVlJywgb25GcmVlKTtcbiAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdhZ2VudFJlbW92ZScsIG9uQ2xvc2VPclJlbW92ZSk7XG4gICAgfVxuICB9KTtcbn07XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQgPSBmdW5jdGlvbiBjcmVhdGVTb2NrZXQob3B0aW9ucywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcGxhY2Vob2xkZXIgPSB7fTtcbiAgc2VsZi5zb2NrZXRzLnB1c2gocGxhY2Vob2xkZXIpO1xuXG4gIHZhciBjb25uZWN0T3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh7fSwgc2VsZi5wcm94eU9wdGlvbnMsIHtcbiAgICBtZXRob2Q6ICdDT05ORUNUJyxcbiAgICBwYXRoOiBvcHRpb25zLmhvc3QgKyAnOicgKyBvcHRpb25zLnBvcnQsXG4gICAgYWdlbnQ6IGZhbHNlLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIGhvc3Q6IG9wdGlvbnMuaG9zdCArICc6JyArIG9wdGlvbnMucG9ydFxuICAgIH1cbiAgfSk7XG4gIGlmIChvcHRpb25zLmxvY2FsQWRkcmVzcykge1xuICAgIGNvbm5lY3RPcHRpb25zLmxvY2FsQWRkcmVzcyA9IG9wdGlvbnMubG9jYWxBZGRyZXNzO1xuICB9XG4gIGlmIChjb25uZWN0T3B0aW9ucy5wcm94eUF1dGgpIHtcbiAgICBjb25uZWN0T3B0aW9ucy5oZWFkZXJzID0gY29ubmVjdE9wdGlvbnMuaGVhZGVycyB8fCB7fTtcbiAgICBjb25uZWN0T3B0aW9ucy5oZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSAnQmFzaWMgJyArXG4gICAgICAgIG5ldyBCdWZmZXIoY29ubmVjdE9wdGlvbnMucHJveHlBdXRoKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICBkZWJ1ZygnbWFraW5nIENPTk5FQ1QgcmVxdWVzdCcpO1xuICB2YXIgY29ubmVjdFJlcSA9IHNlbGYucmVxdWVzdChjb25uZWN0T3B0aW9ucyk7XG4gIGNvbm5lY3RSZXEudXNlQ2h1bmtlZEVuY29kaW5nQnlEZWZhdWx0ID0gZmFsc2U7IC8vIGZvciB2MC42XG4gIGNvbm5lY3RSZXEub25jZSgncmVzcG9uc2UnLCBvblJlc3BvbnNlKTsgLy8gZm9yIHYwLjZcbiAgY29ubmVjdFJlcS5vbmNlKCd1cGdyYWRlJywgb25VcGdyYWRlKTsgICAvLyBmb3IgdjAuNlxuICBjb25uZWN0UmVxLm9uY2UoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpOyAgIC8vIGZvciB2MC43IG9yIGxhdGVyXG4gIGNvbm5lY3RSZXEub25jZSgnZXJyb3InLCBvbkVycm9yKTtcbiAgY29ubmVjdFJlcS5lbmQoKTtcblxuICBmdW5jdGlvbiBvblJlc3BvbnNlKHJlcykge1xuICAgIC8vIFZlcnkgaGFja3kuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGh0dHAtcGFyc2VyIGxlYWtzLlxuICAgIHJlcy51cGdyYWRlID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVXBncmFkZShyZXMsIHNvY2tldCwgaGVhZCkge1xuICAgIC8vIEhhY2t5LlxuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBvbkNvbm5lY3QocmVzLCBzb2NrZXQsIGhlYWQpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Db25uZWN0KHJlcywgc29ja2V0LCBoZWFkKSB7XG4gICAgY29ubmVjdFJlcS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgZGVidWcoJ3R1bm5lbGluZyBzb2NrZXQgY291bGQgbm90IGJlIGVzdGFibGlzaGVkLCBzdGF0dXNDb2RlPSVkJyxcbiAgICAgICAgcmVzLnN0YXR1c0NvZGUpO1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigndHVubmVsaW5nIHNvY2tldCBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQsICcgK1xuICAgICAgICAnc3RhdHVzQ29kZT0nICsgcmVzLnN0YXR1c0NvZGUpO1xuICAgICAgZXJyb3IuY29kZSA9ICdFQ09OTlJFU0VUJztcbiAgICAgIG9wdGlvbnMucmVxdWVzdC5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgIHNlbGYucmVtb3ZlU29ja2V0KHBsYWNlaG9sZGVyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGhlYWQubGVuZ3RoID4gMCkge1xuICAgICAgZGVidWcoJ2dvdCBpbGxlZ2FsIHJlc3BvbnNlIGJvZHkgZnJvbSBwcm94eScpO1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignZ290IGlsbGVnYWwgcmVzcG9uc2UgYm9keSBmcm9tIHByb3h5Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnO1xuICAgICAgb3B0aW9ucy5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgc2VsZi5yZW1vdmVTb2NrZXQocGxhY2Vob2xkZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1ZygndHVubmVsaW5nIGNvbm5lY3Rpb24gaGFzIGVzdGFibGlzaGVkJyk7XG4gICAgc2VsZi5zb2NrZXRzW3NlbGYuc29ja2V0cy5pbmRleE9mKHBsYWNlaG9sZGVyKV0gPSBzb2NrZXQ7XG4gICAgcmV0dXJuIGNiKHNvY2tldCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkVycm9yKGNhdXNlKSB7XG4gICAgY29ubmVjdFJlcS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcblxuICAgIGRlYnVnKCd0dW5uZWxpbmcgc29ja2V0IGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCwgY2F1c2U9JXNcXG4nLFxuICAgICAgICAgIGNhdXNlLm1lc3NhZ2UsIGNhdXNlLnN0YWNrKTtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ3R1bm5lbGluZyBzb2NrZXQgY291bGQgbm90IGJlIGVzdGFibGlzaGVkLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhdXNlPScgKyBjYXVzZS5tZXNzYWdlKTtcbiAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnO1xuICAgIG9wdGlvbnMucmVxdWVzdC5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICBzZWxmLnJlbW92ZVNvY2tldChwbGFjZWhvbGRlcik7XG4gIH1cbn07XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5yZW1vdmVTb2NrZXQgPSBmdW5jdGlvbiByZW1vdmVTb2NrZXQoc29ja2V0KSB7XG4gIHZhciBwb3MgPSB0aGlzLnNvY2tldHMuaW5kZXhPZihzb2NrZXQpXG4gIGlmIChwb3MgPT09IC0xKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuc29ja2V0cy5zcGxpY2UocG9zLCAxKTtcblxuICB2YXIgcGVuZGluZyA9IHRoaXMucmVxdWVzdHMuc2hpZnQoKTtcbiAgaWYgKHBlbmRpbmcpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgcmVxdWVzdHMgYW5kIGEgc29ja2V0IGdldHMgY2xvc2VkIGEgbmV3IG9uZVxuICAgIC8vIG5lZWRzIHRvIGJlIGNyZWF0ZWQgdG8gdGFrZSBvdmVyIGluIHRoZSBwb29sIGZvciB0aGUgb25lIHRoYXQgY2xvc2VkLlxuICAgIHRoaXMuY3JlYXRlU29ja2V0KHBlbmRpbmcsIGZ1bmN0aW9uKHNvY2tldCkge1xuICAgICAgcGVuZGluZy5yZXF1ZXN0Lm9uU29ja2V0KHNvY2tldCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlY3VyZVNvY2tldChvcHRpb25zLCBjYikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIFR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQuY2FsbChzZWxmLCBvcHRpb25zLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICB2YXIgaG9zdEhlYWRlciA9IG9wdGlvbnMucmVxdWVzdC5nZXRIZWFkZXIoJ2hvc3QnKTtcbiAgICB2YXIgdGxzT3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh7fSwgc2VsZi5vcHRpb25zLCB7XG4gICAgICBzb2NrZXQ6IHNvY2tldCxcbiAgICAgIHNlcnZlcm5hbWU6IGhvc3RIZWFkZXIgPyBob3N0SGVhZGVyLnJlcGxhY2UoLzouKiQvLCAnJykgOiBvcHRpb25zLmhvc3RcbiAgICB9KTtcblxuICAgIC8vIDAgaXMgZHVtbXkgcG9ydCBmb3IgdjAuNlxuICAgIHZhciBzZWN1cmVTb2NrZXQgPSB0bHMuY29ubmVjdCgwLCB0bHNPcHRpb25zKTtcbiAgICBzZWxmLnNvY2tldHNbc2VsZi5zb2NrZXRzLmluZGV4T2Yoc29ja2V0KV0gPSBzZWN1cmVTb2NrZXQ7XG4gICAgY2Ioc2VjdXJlU29ja2V0KTtcbiAgfSk7XG59XG5cblxuZnVuY3Rpb24gdG9PcHRpb25zKGhvc3QsIHBvcnQsIGxvY2FsQWRkcmVzcykge1xuICBpZiAodHlwZW9mIGhvc3QgPT09ICdzdHJpbmcnKSB7IC8vIHNpbmNlIHYwLjEwXG4gICAgcmV0dXJuIHtcbiAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICBwb3J0OiBwb3J0LFxuICAgICAgbG9jYWxBZGRyZXNzOiBsb2NhbEFkZHJlc3NcbiAgICB9O1xuICB9XG4gIHJldHVybiBob3N0OyAvLyBmb3IgdjAuMTEgb3IgbGF0ZXJcbn1cblxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIG92ZXJyaWRlcyA9IGFyZ3VtZW50c1tpXTtcbiAgICBpZiAodHlwZW9mIG92ZXJyaWRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3ZlcnJpZGVzKTtcbiAgICAgIGZvciAodmFyIGogPSAwLCBrZXlMZW4gPSBrZXlzLmxlbmd0aDsgaiA8IGtleUxlbjsgKytqKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1tqXTtcbiAgICAgICAgaWYgKG92ZXJyaWRlc1trXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGFyZ2V0W2tdID0gb3ZlcnJpZGVzW2tdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cblxudmFyIGRlYnVnO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiYgL1xcYnR1bm5lbFxcYi8udGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKSkge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBhcmdzWzBdID0gJ1RVTk5FTDogJyArIGFyZ3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MudW5zaGlmdCgnVFVOTkVMOicpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICB9XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge307XG59XG5leHBvcnRzLmRlYnVnID0gZGVidWc7IC8vIGZvciB0ZXN0XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0ge1xuICBrQ2xvc2U6IFN5bWJvbCgnY2xvc2UnKSxcbiAga0Rlc3Ryb3k6IFN5bWJvbCgnZGVzdHJveScpLFxuICBrRGlzcGF0Y2g6IFN5bWJvbCgnZGlzcGF0Y2gnKSxcbiAga1VybDogU3ltYm9sKCd1cmwnKSxcbiAga1dyaXRpbmc6IFN5bWJvbCgnd3JpdGluZycpLFxuICBrUmVzdW1pbmc6IFN5bWJvbCgncmVzdW1pbmcnKSxcbiAga1F1ZXVlOiBTeW1ib2woJ3F1ZXVlJyksXG4gIGtDb25uZWN0OiBTeW1ib2woJ2Nvbm5lY3QnKSxcbiAga0Nvbm5lY3Rpbmc6IFN5bWJvbCgnY29ubmVjdGluZycpLFxuICBrSGVhZGVyc0xpc3Q6IFN5bWJvbCgnaGVhZGVycyBsaXN0JyksXG4gIGtLZWVwQWxpdmVEZWZhdWx0VGltZW91dDogU3ltYm9sKCdkZWZhdWx0IGtlZXAgYWxpdmUgdGltZW91dCcpLFxuICBrS2VlcEFsaXZlTWF4VGltZW91dDogU3ltYm9sKCdtYXgga2VlcCBhbGl2ZSB0aW1lb3V0JyksXG4gIGtLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkOiBTeW1ib2woJ2tlZXAgYWxpdmUgdGltZW91dCB0aHJlc2hvbGQnKSxcbiAga0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZTogU3ltYm9sKCdrZWVwIGFsaXZlIHRpbWVvdXQnKSxcbiAga0tlZXBBbGl2ZTogU3ltYm9sKCdrZWVwIGFsaXZlJyksXG4gIGtIZWFkZXJzVGltZW91dDogU3ltYm9sKCdoZWFkZXJzIHRpbWVvdXQnKSxcbiAga0JvZHlUaW1lb3V0OiBTeW1ib2woJ2JvZHkgdGltZW91dCcpLFxuICBrU2VydmVyTmFtZTogU3ltYm9sKCdzZXJ2ZXIgbmFtZScpLFxuICBrTG9jYWxBZGRyZXNzOiBTeW1ib2woJ2xvY2FsIGFkZHJlc3MnKSxcbiAga0hvc3Q6IFN5bWJvbCgnaG9zdCcpLFxuICBrTm9SZWY6IFN5bWJvbCgnbm8gcmVmJyksXG4gIGtCb2R5VXNlZDogU3ltYm9sKCd1c2VkJyksXG4gIGtSdW5uaW5nOiBTeW1ib2woJ3J1bm5pbmcnKSxcbiAga0Jsb2NraW5nOiBTeW1ib2woJ2Jsb2NraW5nJyksXG4gIGtQZW5kaW5nOiBTeW1ib2woJ3BlbmRpbmcnKSxcbiAga1NpemU6IFN5bWJvbCgnc2l6ZScpLFxuICBrQnVzeTogU3ltYm9sKCdidXN5JyksXG4gIGtRdWV1ZWQ6IFN5bWJvbCgncXVldWVkJyksXG4gIGtGcmVlOiBTeW1ib2woJ2ZyZWUnKSxcbiAga0Nvbm5lY3RlZDogU3ltYm9sKCdjb25uZWN0ZWQnKSxcbiAga0Nsb3NlZDogU3ltYm9sKCdjbG9zZWQnKSxcbiAga05lZWREcmFpbjogU3ltYm9sKCduZWVkIGRyYWluJyksXG4gIGtSZXNldDogU3ltYm9sKCdyZXNldCcpLFxuICBrRGVzdHJveWVkOiBTeW1ib2wuZm9yKCdub2RlanMuc3RyZWFtLmRlc3Ryb3llZCcpLFxuICBrTWF4SGVhZGVyc1NpemU6IFN5bWJvbCgnbWF4IGhlYWRlcnMgc2l6ZScpLFxuICBrUnVubmluZ0lkeDogU3ltYm9sKCdydW5uaW5nIGluZGV4JyksXG4gIGtQZW5kaW5nSWR4OiBTeW1ib2woJ3BlbmRpbmcgaW5kZXgnKSxcbiAga0Vycm9yOiBTeW1ib2woJ2Vycm9yJyksXG4gIGtDbGllbnRzOiBTeW1ib2woJ2NsaWVudHMnKSxcbiAga0NsaWVudDogU3ltYm9sKCdjbGllbnQnKSxcbiAga1BhcnNlcjogU3ltYm9sKCdwYXJzZXInKSxcbiAga09uRGVzdHJveWVkOiBTeW1ib2woJ2Rlc3Ryb3kgY2FsbGJhY2tzJyksXG4gIGtQaXBlbGluaW5nOiBTeW1ib2woJ3BpcGVsaW5pbmcnKSxcbiAga1NvY2tldDogU3ltYm9sKCdzb2NrZXQnKSxcbiAga0hvc3RIZWFkZXI6IFN5bWJvbCgnaG9zdCBoZWFkZXInKSxcbiAga0Nvbm5lY3RvcjogU3ltYm9sKCdjb25uZWN0b3InKSxcbiAga1N0cmljdENvbnRlbnRMZW5ndGg6IFN5bWJvbCgnc3RyaWN0IGNvbnRlbnQgbGVuZ3RoJyksXG4gIGtNYXhSZWRpcmVjdGlvbnM6IFN5bWJvbCgnbWF4UmVkaXJlY3Rpb25zJyksXG4gIGtNYXhSZXF1ZXN0czogU3ltYm9sKCdtYXhSZXF1ZXN0c1BlckNsaWVudCcpLFxuICBrUHJveHk6IFN5bWJvbCgncHJveHkgYWdlbnQgb3B0aW9ucycpLFxuICBrQ291bnRlcjogU3ltYm9sKCdzb2NrZXQgcmVxdWVzdCBjb3VudGVyJyksXG4gIGtJbnRlcmNlcHRvcnM6IFN5bWJvbCgnZGlzcGF0Y2ggaW50ZXJjZXB0b3JzJyksXG4gIGtNYXhSZXNwb25zZVNpemU6IFN5bWJvbCgnbWF4IHJlc3BvbnNlIHNpemUnKSxcbiAga0hUVFAyU2Vzc2lvbjogU3ltYm9sKCdodHRwMlNlc3Npb24nKSxcbiAga0hUVFAyU2Vzc2lvblN0YXRlOiBTeW1ib2woJ2h0dHAyU2Vzc2lvbiBzdGF0ZScpLFxuICBrSFRUUDJCdWlsZFJlcXVlc3Q6IFN5bWJvbCgnaHR0cDIgYnVpbGQgcmVxdWVzdCcpLFxuICBrSFRUUDFCdWlsZFJlcXVlc3Q6IFN5bWJvbCgnaHR0cDEgYnVpbGQgcmVxdWVzdCcpLFxuICBrSFRUUDJDb3B5SGVhZGVyczogU3ltYm9sKCdodHRwMiBjb3B5IGhlYWRlcnMnKSxcbiAga0hUVFBDb25uVmVyc2lvbjogU3ltYm9sKCdodHRwIGNvbm5lY3Rpb24gdmVyc2lvbicpLFxuICBrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5OiBTeW1ib2woJ3JldHJ5IGFnZW50IGRlZmF1bHQgcmV0cnknKSxcbiAga0NvbnN0cnVjdDogU3ltYm9sKCdjb25zdHJ1Y3RhYmxlJylcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNsYXNzIFVuZGljaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ1VuZGljaUVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSJ1xuICB9XG59XG5cbmNsYXNzIENvbm5lY3RUaW1lb3V0RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBDb25uZWN0VGltZW91dEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdDb25uZWN0VGltZW91dEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ0Nvbm5lY3QgVGltZW91dCBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9DT05ORUNUX1RJTUVPVVQnXG4gIH1cbn1cblxuY2xhc3MgSGVhZGVyc1RpbWVvdXRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhlYWRlcnNUaW1lb3V0RXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0hlYWRlcnNUaW1lb3V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnSGVhZGVycyBUaW1lb3V0IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0hFQURFUlNfVElNRU9VVCdcbiAgfVxufVxuXG5jbGFzcyBIZWFkZXJzT3ZlcmZsb3dFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhlYWRlcnNPdmVyZmxvd0Vycm9yKVxuICAgIHRoaXMubmFtZSA9ICdIZWFkZXJzT3ZlcmZsb3dFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdIZWFkZXJzIE92ZXJmbG93IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0hFQURFUlNfT1ZFUkZMT1cnXG4gIH1cbn1cblxuY2xhc3MgQm9keVRpbWVvdXRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEJvZHlUaW1lb3V0RXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0JvZHlUaW1lb3V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnQm9keSBUaW1lb3V0IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0JPRFlfVElNRU9VVCdcbiAgfVxufVxuXG5jbGFzcyBSZXNwb25zZVN0YXR1c0NvZGVFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGhlYWRlcnMsIGJvZHkpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZVN0YXR1c0NvZGVFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXNwb25zZSBTdGF0dXMgQ29kZSBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVNQT05TRV9TVEFUVVNfQ09ERSdcbiAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNDb2RlXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnNcbiAgfVxufVxuXG5jbGFzcyBJbnZhbGlkQXJndW1lbnRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEludmFsaWRBcmd1bWVudEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkQXJndW1lbnRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdJbnZhbGlkIEFyZ3VtZW50IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0lOVkFMSURfQVJHJ1xuICB9XG59XG5cbmNsYXNzIEludmFsaWRSZXR1cm5WYWx1ZUVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgSW52YWxpZFJldHVyblZhbHVlRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0ludmFsaWRSZXR1cm5WYWx1ZUVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ0ludmFsaWQgUmV0dXJuIFZhbHVlIEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFJ1xuICB9XG59XG5cbmNsYXNzIFJlcXVlc3RBYm9ydGVkRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXF1ZXN0QWJvcnRlZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdBYm9ydEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgYWJvcnRlZCdcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9BQk9SVEVEJ1xuICB9XG59XG5cbmNsYXNzIEluZm9ybWF0aW9uYWxFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEluZm9ybWF0aW9uYWxFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnSW5mb3JtYXRpb25hbEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgaW5mb3JtYXRpb24nXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfSU5GTydcbiAgfVxufVxuXG5jbGFzcyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ1JlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXF1ZXN0IGJvZHkgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGNvbnRlbnQtbGVuZ3RoIGhlYWRlcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVFfQ09OVEVOVF9MRU5HVEhfTUlTTUFUQ0gnXG4gIH1cbn1cblxuY2xhc3MgUmVzcG9uc2VDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ1Jlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnUmVzcG9uc2UgYm9keSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggY29udGVudC1sZW5ndGggaGVhZGVyJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1JFU19DT05URU5UX0xFTkdUSF9NSVNNQVRDSCdcbiAgfVxufVxuXG5jbGFzcyBDbGllbnREZXN0cm95ZWRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIENsaWVudERlc3Ryb3llZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdDbGllbnREZXN0cm95ZWRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdUaGUgY2xpZW50IGlzIGRlc3Ryb3llZCdcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9ERVNUUk9ZRUQnXG4gIH1cbn1cblxuY2xhc3MgQ2xpZW50Q2xvc2VkRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBDbGllbnRDbG9zZWRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnQ2xpZW50Q2xvc2VkRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGhlIGNsaWVudCBpcyBjbG9zZWQnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfQ0xPU0VEJ1xuICB9XG59XG5cbmNsYXNzIFNvY2tldEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSwgc29ja2V0KSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBTb2NrZXRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnU29ja2V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnU29ja2V0IGVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1NPQ0tFVCdcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuICB9XG59XG5cbmNsYXNzIE5vdFN1cHBvcnRlZEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgTm90U3VwcG9ydGVkRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ05vdFN1cHBvcnRlZEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ05vdCBzdXBwb3J0ZWQgZXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfTk9UX1NVUFBPUlRFRCdcbiAgfVxufVxuXG5jbGFzcyBCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE5vdFN1cHBvcnRlZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdNaXNzaW5nVXBzdHJlYW1FcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdObyB1cHN0cmVhbSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgQmFsYW5jZWRQb29sJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0JQTF9NSVNTSU5HX1VQU1RSRUFNJ1xuICB9XG59XG5cbmNsYXNzIEhUVFBQYXJzZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UsIGNvZGUsIGRhdGEpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhUVFBQYXJzZXJFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnSFRUUFBhcnNlckVycm9yJ1xuICAgIHRoaXMuY29kZSA9IGNvZGUgPyBgSFBFXyR7Y29kZX1gIDogdW5kZWZpbmVkXG4gICAgdGhpcy5kYXRhID0gZGF0YSA/IGRhdGEudG9TdHJpbmcoKSA6IHVuZGVmaW5lZFxuICB9XG59XG5cbmNsYXNzIFJlc3BvbnNlRXhjZWVkZWRNYXhTaXplRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1Jlc3BvbnNlIGNvbnRlbnQgZXhjZWVkZWQgbWF4IHNpemUnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfUkVTX0VYQ0VFREVEX01BWF9TSVpFJ1xuICB9XG59XG5cbmNsYXNzIFJlcXVlc3RSZXRyeUVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSwgY29kZSwgeyBoZWFkZXJzLCBkYXRhIH0pIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlcXVlc3RSZXRyeUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXF1ZXN0UmV0cnlFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXF1ZXN0IHJldHJ5IGVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1JFUV9SRVRSWSdcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBjb2RlXG4gICAgdGhpcy5kYXRhID0gZGF0YVxuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSFRUUFBhcnNlckVycm9yLFxuICBVbmRpY2lFcnJvcixcbiAgSGVhZGVyc1RpbWVvdXRFcnJvcixcbiAgSGVhZGVyc092ZXJmbG93RXJyb3IsXG4gIEJvZHlUaW1lb3V0RXJyb3IsXG4gIFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcixcbiAgQ29ubmVjdFRpbWVvdXRFcnJvcixcbiAgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvcixcbiAgQ2xpZW50RGVzdHJveWVkRXJyb3IsXG4gIENsaWVudENsb3NlZEVycm9yLFxuICBJbmZvcm1hdGlvbmFsRXJyb3IsXG4gIFNvY2tldEVycm9yLFxuICBOb3RTdXBwb3J0ZWRFcnJvcixcbiAgUmVzcG9uc2VDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcixcbiAgQmFsYW5jZWRQb29sTWlzc2luZ1Vwc3RyZWFtRXJyb3IsXG4gIFJlc3BvbnNlRXhjZWVkZWRNYXhTaXplRXJyb3IsXG4gIFJlcXVlc3RSZXRyeUVycm9yXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD59ICovXG5jb25zdCBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZCA9IHt9XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUVFAvSGVhZGVyc1xuY29uc3Qgd2VsbGtub3duSGVhZGVyTmFtZXMgPSBbXG4gICdBY2NlcHQnLFxuICAnQWNjZXB0LUVuY29kaW5nJyxcbiAgJ0FjY2VwdC1MYW5ndWFnZScsXG4gICdBY2NlcHQtUmFuZ2VzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcycsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLFxuICAnQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtTWF4LUFnZScsXG4gICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1NZXRob2QnLFxuICAnQWdlJyxcbiAgJ0FsbG93JyxcbiAgJ0FsdC1TdmMnLFxuICAnQWx0LVVzZWQnLFxuICAnQXV0aG9yaXphdGlvbicsXG4gICdDYWNoZS1Db250cm9sJyxcbiAgJ0NsZWFyLVNpdGUtRGF0YScsXG4gICdDb25uZWN0aW9uJyxcbiAgJ0NvbnRlbnQtRGlzcG9zaXRpb24nLFxuICAnQ29udGVudC1FbmNvZGluZycsXG4gICdDb250ZW50LUxhbmd1YWdlJyxcbiAgJ0NvbnRlbnQtTGVuZ3RoJyxcbiAgJ0NvbnRlbnQtTG9jYXRpb24nLFxuICAnQ29udGVudC1SYW5nZScsXG4gICdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsXG4gICdDb250ZW50LVNlY3VyaXR5LVBvbGljeS1SZXBvcnQtT25seScsXG4gICdDb250ZW50LVR5cGUnLFxuICAnQ29va2llJyxcbiAgJ0Nyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3knLFxuICAnQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3knLFxuICAnQ3Jvc3MtT3JpZ2luLVJlc291cmNlLVBvbGljeScsXG4gICdEYXRlJyxcbiAgJ0RldmljZS1NZW1vcnknLFxuICAnRG93bmxpbmsnLFxuICAnRUNUJyxcbiAgJ0VUYWcnLFxuICAnRXhwZWN0JyxcbiAgJ0V4cGVjdC1DVCcsXG4gICdFeHBpcmVzJyxcbiAgJ0ZvcndhcmRlZCcsXG4gICdGcm9tJyxcbiAgJ0hvc3QnLFxuICAnSWYtTWF0Y2gnLFxuICAnSWYtTW9kaWZpZWQtU2luY2UnLFxuICAnSWYtTm9uZS1NYXRjaCcsXG4gICdJZi1SYW5nZScsXG4gICdJZi1Vbm1vZGlmaWVkLVNpbmNlJyxcbiAgJ0tlZXAtQWxpdmUnLFxuICAnTGFzdC1Nb2RpZmllZCcsXG4gICdMaW5rJyxcbiAgJ0xvY2F0aW9uJyxcbiAgJ01heC1Gb3J3YXJkcycsXG4gICdPcmlnaW4nLFxuICAnUGVybWlzc2lvbnMtUG9saWN5JyxcbiAgJ1ByYWdtYScsXG4gICdQcm94eS1BdXRoZW50aWNhdGUnLFxuICAnUHJveHktQXV0aG9yaXphdGlvbicsXG4gICdSVFQnLFxuICAnUmFuZ2UnLFxuICAnUmVmZXJlcicsXG4gICdSZWZlcnJlci1Qb2xpY3knLFxuICAnUmVmcmVzaCcsXG4gICdSZXRyeS1BZnRlcicsXG4gICdTZWMtV2ViU29ja2V0LUFjY2VwdCcsXG4gICdTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMnLFxuICAnU2VjLVdlYlNvY2tldC1LZXknLFxuICAnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcsXG4gICdTZWMtV2ViU29ja2V0LVZlcnNpb24nLFxuICAnU2VydmVyJyxcbiAgJ1NlcnZlci1UaW1pbmcnLFxuICAnU2VydmljZS1Xb3JrZXItQWxsb3dlZCcsXG4gICdTZXJ2aWNlLVdvcmtlci1OYXZpZ2F0aW9uLVByZWxvYWQnLFxuICAnU2V0LUNvb2tpZScsXG4gICdTb3VyY2VNYXAnLFxuICAnU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eScsXG4gICdTdXBwb3J0cy1Mb2FkaW5nLU1vZGUnLFxuICAnVEUnLFxuICAnVGltaW5nLUFsbG93LU9yaWdpbicsXG4gICdUcmFpbGVyJyxcbiAgJ1RyYW5zZmVyLUVuY29kaW5nJyxcbiAgJ1VwZ3JhZGUnLFxuICAnVXBncmFkZS1JbnNlY3VyZS1SZXF1ZXN0cycsXG4gICdVc2VyLUFnZW50JyxcbiAgJ1ZhcnknLFxuICAnVmlhJyxcbiAgJ1dXVy1BdXRoZW50aWNhdGUnLFxuICAnWC1Db250ZW50LVR5cGUtT3B0aW9ucycsXG4gICdYLUROUy1QcmVmZXRjaC1Db250cm9sJyxcbiAgJ1gtRnJhbWUtT3B0aW9ucycsXG4gICdYLVBlcm1pdHRlZC1Dcm9zcy1Eb21haW4tUG9saWNpZXMnLFxuICAnWC1Qb3dlcmVkLUJ5JyxcbiAgJ1gtUmVxdWVzdGVkLVdpdGgnLFxuICAnWC1YU1MtUHJvdGVjdGlvbidcbl1cblxuZm9yIChsZXQgaSA9IDA7IGkgPCB3ZWxsa25vd25IZWFkZXJOYW1lcy5sZW5ndGg7ICsraSkge1xuICBjb25zdCBrZXkgPSB3ZWxsa25vd25IZWFkZXJOYW1lc1tpXVxuICBjb25zdCBsb3dlckNhc2VkS2V5ID0ga2V5LnRvTG93ZXJDYXNlKClcbiAgaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRba2V5XSA9IGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkW2xvd2VyQ2FzZWRLZXldID1cbiAgICBsb3dlckNhc2VkS2V5XG59XG5cbi8vIE5vdGU6IG9iamVjdCBwcm90b3R5cGVzIHNob3VsZCBub3QgYmUgYWJsZSB0byBiZSByZWZlcmVuY2VkLiBlLmcuIGBPYmplY3QjaGFzT3duUHJvcGVydHlgLlxuT2JqZWN0LnNldFByb3RvdHlwZU9mKGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkLCBudWxsKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgd2VsbGtub3duSGVhZGVyTmFtZXMsXG4gIGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBrRGVzdHJveWVkLCBrQm9keVVzZWQgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IEluY29taW5nTWVzc2FnZSB9ID0gcmVxdWlyZSgnaHR0cCcpXG5jb25zdCBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0JylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3JzJylcbmNvbnN0IHsgQmxvYiB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IG5vZGVVdGlsID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCB7IHN0cmluZ2lmeSB9ID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKVxuY29uc3QgeyBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZCB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuXG5jb25zdCBbbm9kZU1ham9yLCBub2RlTWlub3JdID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KCcuJykubWFwKHYgPT4gTnVtYmVyKHYpKVxuXG5mdW5jdGlvbiBub3AgKCkge31cblxuZnVuY3Rpb24gaXNTdHJlYW0gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoucGlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nXG59XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlLWZldGNoL2ZldGNoLWJsb2IvYmxvYi84YWI1ODdkMzQwODBkZTk0MTQwYjU0ZjA3MTY4NDUxZTdkMGI2NTVlL2luZGV4LmpzI0wyMjktTDI0MSAoTUlUIExpY2Vuc2UpXG5mdW5jdGlvbiBpc0Jsb2JMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIChCbG9iICYmIG9iamVjdCBpbnN0YW5jZW9mIEJsb2IpIHx8IChcbiAgICBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgICh0eXBlb2Ygb2JqZWN0LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdHlwZW9mIG9iamVjdC5hcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAvXihCbG9ifEZpbGUpJC8udGVzdChvYmplY3RbU3ltYm9sLnRvU3RyaW5nVGFnXSlcbiAgKVxufVxuXG5mdW5jdGlvbiBidWlsZFVSTCAodXJsLCBxdWVyeVBhcmFtcykge1xuICBpZiAodXJsLmluY2x1ZGVzKCc/JykgfHwgdXJsLmluY2x1ZGVzKCcjJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IHBhcmFtcyBjYW5ub3QgYmUgcGFzc2VkIHdoZW4gdXJsIGFscmVhZHkgY29udGFpbnMgXCI/XCIgb3IgXCIjXCIuJylcbiAgfVxuXG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5KHF1ZXJ5UGFyYW1zKVxuXG4gIGlmIChzdHJpbmdpZmllZCkge1xuICAgIHVybCArPSAnPycgKyBzdHJpbmdpZmllZFxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBwYXJzZVVSTCAodXJsKSB7XG4gIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykge1xuICAgIHVybCA9IG5ldyBVUkwodXJsKVxuXG4gICAgaWYgKCEvXmh0dHBzPzovLnRlc3QodXJsLm9yaWdpbiB8fCB1cmwucHJvdG9jb2wpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIHByb3RvY29sOiB0aGUgVVJMIG11c3Qgc3RhcnQgd2l0aCBgaHR0cDpgIG9yIGBodHRwczpgLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHVybFxuICB9XG5cbiAgaWYgKCF1cmwgfHwgdHlwZW9mIHVybCAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMOiBUaGUgVVJMIGFyZ3VtZW50IG11c3QgYmUgYSBub24tbnVsbCBvYmplY3QuJylcbiAgfVxuXG4gIGlmICghL15odHRwcz86Ly50ZXN0KHVybC5vcmlnaW4gfHwgdXJsLnByb3RvY29sKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcHJvdG9jb2w6IHRoZSBVUkwgbXVzdCBzdGFydCB3aXRoIGBodHRwOmAgb3IgYGh0dHBzOmAuJylcbiAgfVxuXG4gIGlmICghKHVybCBpbnN0YW5jZW9mIFVSTCkpIHtcbiAgICBpZiAodXJsLnBvcnQgIT0gbnVsbCAmJiB1cmwucG9ydCAhPT0gJycgJiYgIU51bWJlci5pc0Zpbml0ZShwYXJzZUludCh1cmwucG9ydCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMOiBwb3J0IG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyIG9yIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuJylcbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGggIT0gbnVsbCAmJiB0eXBlb2YgdXJsLnBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIHBhdGg6IHRoZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWQuJylcbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lICE9IG51bGwgJiYgdHlwZW9mIHVybC5wYXRobmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcGF0aG5hbWU6IHRoZSBwYXRobmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgaWYgKHVybC5ob3N0bmFtZSAhPSBudWxsICYmIHR5cGVvZiB1cmwuaG9zdG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIGhvc3RuYW1lOiB0aGUgaG9zdG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZC4nKVxuICAgIH1cblxuICAgIGlmICh1cmwub3JpZ2luICE9IG51bGwgJiYgdHlwZW9mIHVybC5vcmlnaW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIG9yaWdpbjogdGhlIG9yaWdpbiBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHVybC5wb3J0ICE9IG51bGxcbiAgICAgID8gdXJsLnBvcnRcbiAgICAgIDogKHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MClcbiAgICBsZXQgb3JpZ2luID0gdXJsLm9yaWdpbiAhPSBudWxsXG4gICAgICA/IHVybC5vcmlnaW5cbiAgICAgIDogYCR7dXJsLnByb3RvY29sfS8vJHt1cmwuaG9zdG5hbWV9OiR7cG9ydH1gXG4gICAgbGV0IHBhdGggPSB1cmwucGF0aCAhPSBudWxsXG4gICAgICA/IHVybC5wYXRoXG4gICAgICA6IGAke3VybC5wYXRobmFtZSB8fCAnJ30ke3VybC5zZWFyY2ggfHwgJyd9YFxuXG4gICAgaWYgKG9yaWdpbi5lbmRzV2l0aCgnLycpKSB7XG4gICAgICBvcmlnaW4gPSBvcmlnaW4uc3Vic3RyaW5nKDAsIG9yaWdpbi5sZW5ndGggLSAxKVxuICAgIH1cblxuICAgIGlmIChwYXRoICYmICFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgcGF0aCA9IGAvJHtwYXRofWBcbiAgICB9XG4gICAgLy8gbmV3IFVSTChwYXRoLCBvcmlnaW4pIGlzIHVuc2FmZSB3aGVuIGBwYXRoYCBjb250YWlucyBhbiBhYnNvbHV0ZSBVUkxcbiAgICAvLyBGcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvVVJMOlxuICAgIC8vIElmIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJlbGF0aXZlIFVSTCwgc2Vjb25kIHBhcmFtIGlzIHJlcXVpcmVkLCBhbmQgd2lsbCBiZSB1c2VkIGFzIHRoZSBiYXNlIFVSTC5cbiAgICAvLyBJZiBmaXJzdCBwYXJhbWV0ZXIgaXMgYW4gYWJzb2x1dGUgVVJMLCBhIGdpdmVuIHNlY29uZCBwYXJhbSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgdXJsID0gbmV3IFVSTChvcmlnaW4gKyBwYXRoKVxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBwYXJzZU9yaWdpbiAodXJsKSB7XG4gIHVybCA9IHBhcnNlVVJMKHVybClcblxuICBpZiAodXJsLnBhdGhuYW1lICE9PSAnLycgfHwgdXJsLnNlYXJjaCB8fCB1cmwuaGFzaCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCB1cmwnKVxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBnZXRIb3N0bmFtZSAoaG9zdCkge1xuICBpZiAoaG9zdFswXSA9PT0gJ1snKSB7XG4gICAgY29uc3QgaWR4ID0gaG9zdC5pbmRleE9mKCddJylcblxuICAgIGFzc2VydChpZHggIT09IC0xKVxuICAgIHJldHVybiBob3N0LnN1YnN0cmluZygxLCBpZHgpXG4gIH1cblxuICBjb25zdCBpZHggPSBob3N0LmluZGV4T2YoJzonKVxuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGhvc3RcblxuICByZXR1cm4gaG9zdC5zdWJzdHJpbmcoMCwgaWR4KVxufVxuXG4vLyBJUCBhZGRyZXNzZXMgYXJlIG5vdCB2YWxpZCBzZXJ2ZXIgbmFtZXMgcGVyIFJGQzYwNjZcbi8vID4gQ3VycmVudGx5LCB0aGUgb25seSBzZXJ2ZXIgbmFtZXMgc3VwcG9ydGVkIGFyZSBETlMgaG9zdG5hbWVzXG5mdW5jdGlvbiBnZXRTZXJ2ZXJOYW1lIChob3N0KSB7XG4gIGlmICghaG9zdCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIGhvc3QsICdzdHJpbmcnKVxuXG4gIGNvbnN0IHNlcnZlcm5hbWUgPSBnZXRIb3N0bmFtZShob3N0KVxuICBpZiAobmV0LmlzSVAoc2VydmVybmFtZSkpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiBzZXJ2ZXJuYW1lXG59XG5cbmZ1bmN0aW9uIGRlZXBDbG9uZSAob2JqKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpXG59XG5cbmZ1bmN0aW9uIGlzQXN5bmNJdGVyYWJsZSAob2JqKSB7XG4gIHJldHVybiAhIShvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJylcbn1cblxuZnVuY3Rpb24gaXNJdGVyYWJsZSAob2JqKSB7XG4gIHJldHVybiAhIShvYmogIT0gbnVsbCAmJiAodHlwZW9mIG9ialtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSlcbn1cblxuZnVuY3Rpb24gYm9keUxlbmd0aCAoYm9keSkge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDBcbiAgfSBlbHNlIGlmIChpc1N0cmVhbShib2R5KSkge1xuICAgIGNvbnN0IHN0YXRlID0gYm9keS5fcmVhZGFibGVTdGF0ZVxuICAgIHJldHVybiBzdGF0ZSAmJiBzdGF0ZS5vYmplY3RNb2RlID09PSBmYWxzZSAmJiBzdGF0ZS5lbmRlZCA9PT0gdHJ1ZSAmJiBOdW1iZXIuaXNGaW5pdGUoc3RhdGUubGVuZ3RoKVxuICAgICAgPyBzdGF0ZS5sZW5ndGhcbiAgICAgIDogbnVsbFxuICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5zaXplICE9IG51bGwgPyBib2R5LnNpemUgOiBudWxsXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5ieXRlTGVuZ3RoXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0Rlc3Ryb3llZCAoc3RyZWFtKSB7XG4gIHJldHVybiAhc3RyZWFtIHx8ICEhKHN0cmVhbS5kZXN0cm95ZWQgfHwgc3RyZWFtW2tEZXN0cm95ZWRdKVxufVxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlQWJvcnRlZCAoc3RyZWFtKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtICYmIHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICByZXR1cm4gaXNEZXN0cm95ZWQoc3RyZWFtKSAmJiBzdGF0ZSAmJiAhc3RhdGUuZW5kRW1pdHRlZFxufVxuXG5mdW5jdGlvbiBkZXN0cm95IChzdHJlYW0sIGVycikge1xuICBpZiAoc3RyZWFtID09IG51bGwgfHwgIWlzU3RyZWFtKHN0cmVhbSkgfHwgaXNEZXN0cm95ZWQoc3RyZWFtKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0uZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc3RyZWFtKS5jb25zdHJ1Y3RvciA9PT0gSW5jb21pbmdNZXNzYWdlKSB7XG4gICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM4NTA1L2ZpbGVzXG4gICAgICBzdHJlYW0uc29ja2V0ID0gbnVsbFxuICAgIH1cblxuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKChzdHJlYW0sIGVycikgPT4ge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgIH0sIHN0cmVhbSwgZXJyKVxuICB9XG5cbiAgaWYgKHN0cmVhbS5kZXN0cm95ZWQgIT09IHRydWUpIHtcbiAgICBzdHJlYW1ba0Rlc3Ryb3llZF0gPSB0cnVlXG4gIH1cbn1cblxuY29uc3QgS0VFUEFMSVZFX1RJTUVPVVRfRVhQUiA9IC90aW1lb3V0PShcXGQrKS9cbmZ1bmN0aW9uIHBhcnNlS2VlcEFsaXZlVGltZW91dCAodmFsKSB7XG4gIGNvbnN0IG0gPSB2YWwudG9TdHJpbmcoKS5tYXRjaChLRUVQQUxJVkVfVElNRU9VVF9FWFBSKVxuICByZXR1cm4gbSA/IHBhcnNlSW50KG1bMV0sIDEwKSAqIDEwMDAgOiBudWxsXG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgaGVhZGVyIG5hbWUgYW5kIHJldHVybnMgaXRzIGxvd2VyY2FzZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSB2YWx1ZSBIZWFkZXIgbmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaGVhZGVyTmFtZVRvU3RyaW5nICh2YWx1ZSkge1xuICByZXR1cm4gaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRbdmFsdWVdIHx8IHZhbHVlLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gcGFyc2VIZWFkZXJzIChoZWFkZXJzLCBvYmogPSB7fSkge1xuICAvLyBGb3IgSDIgc3VwcG9ydFxuICBpZiAoIUFycmF5LmlzQXJyYXkoaGVhZGVycykpIHJldHVybiBoZWFkZXJzXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgY29uc3Qga2V5ID0gaGVhZGVyc1tpXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKClcbiAgICBsZXQgdmFsID0gb2JqW2tleV1cblxuICAgIGlmICghdmFsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzW2kgKyAxXSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBoZWFkZXJzW2kgKyAxXS5tYXAoeCA9PiB4LnRvU3RyaW5nKCd1dGY4JykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IGhlYWRlcnNbaSArIDFdLnRvU3RyaW5nKCd1dGY4JylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFsID0gW3ZhbF1cbiAgICAgICAgb2JqW2tleV0gPSB2YWxcbiAgICAgIH1cbiAgICAgIHZhbC5wdXNoKGhlYWRlcnNbaSArIDFdLnRvU3RyaW5nKCd1dGY4JykpXG4gICAgfVxuICB9XG5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzQ2NTI4XG4gIGlmICgnY29udGVudC1sZW5ndGgnIGluIG9iaiAmJiAnY29udGVudC1kaXNwb3NpdGlvbicgaW4gb2JqKSB7XG4gICAgb2JqWydjb250ZW50LWRpc3Bvc2l0aW9uJ10gPSBCdWZmZXIuZnJvbShvYmpbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSkudG9TdHJpbmcoJ2xhdGluMScpXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmZ1bmN0aW9uIHBhcnNlUmF3SGVhZGVycyAoaGVhZGVycykge1xuICBjb25zdCByZXQgPSBbXVxuICBsZXQgaGFzQ29udGVudExlbmd0aCA9IGZhbHNlXG4gIGxldCBjb250ZW50RGlzcG9zaXRpb25JZHggPSAtMVxuXG4gIGZvciAobGV0IG4gPSAwOyBuIDwgaGVhZGVycy5sZW5ndGg7IG4gKz0gMikge1xuICAgIGNvbnN0IGtleSA9IGhlYWRlcnNbbiArIDBdLnRvU3RyaW5nKClcbiAgICBjb25zdCB2YWwgPSBoZWFkZXJzW24gKyAxXS50b1N0cmluZygndXRmOCcpXG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMTQgJiYgKGtleSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJyB8fCBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJykpIHtcbiAgICAgIHJldC5wdXNoKGtleSwgdmFsKVxuICAgICAgaGFzQ29udGVudExlbmd0aCA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPT09IDE5ICYmIChrZXkgPT09ICdjb250ZW50LWRpc3Bvc2l0aW9uJyB8fCBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtZGlzcG9zaXRpb24nKSkge1xuICAgICAgY29udGVudERpc3Bvc2l0aW9uSWR4ID0gcmV0LnB1c2goa2V5LCB2YWwpIC0gMVxuICAgIH0gZWxzZSB7XG4gICAgICByZXQucHVzaChrZXksIHZhbClcbiAgICB9XG4gIH1cblxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvNDY1MjhcbiAgaWYgKGhhc0NvbnRlbnRMZW5ndGggJiYgY29udGVudERpc3Bvc2l0aW9uSWR4ICE9PSAtMSkge1xuICAgIHJldFtjb250ZW50RGlzcG9zaXRpb25JZHhdID0gQnVmZmVyLmZyb20ocmV0W2NvbnRlbnREaXNwb3NpdGlvbklkeF0pLnRvU3RyaW5nKCdsYXRpbjEnKVxuICB9XG5cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAoYnVmZmVyKSB7XG4gIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL21jb2xsaW5hL3VuZGljaS9wdWxsLzMxOVxuICByZXR1cm4gYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCBCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUhhbmRsZXIgKGhhbmRsZXIsIG1ldGhvZCwgdXBncmFkZSkge1xuICBpZiAoIWhhbmRsZXIgfHwgdHlwZW9mIGhhbmRsZXIgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoYW5kbGVyIG11c3QgYmUgYW4gb2JqZWN0JylcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5vbkNvbm5lY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25Db25uZWN0IG1ldGhvZCcpXG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIub25FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkVycm9yIG1ldGhvZCcpXG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIub25Cb2R5U2VudCAhPT0gJ2Z1bmN0aW9uJyAmJiBoYW5kbGVyLm9uQm9keVNlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkJvZHlTZW50IG1ldGhvZCcpXG4gIH1cblxuICBpZiAodXBncmFkZSB8fCBtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlci5vblVwZ3JhZGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvblVwZ3JhZGUgbWV0aG9kJylcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyLm9uSGVhZGVycyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSGVhZGVycyBtZXRob2QnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlci5vbkRhdGEgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkRhdGEgbWV0aG9kJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIub25Db21wbGV0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uQ29tcGxldGUgbWV0aG9kJylcbiAgICB9XG4gIH1cbn1cblxuLy8gQSBib2R5IGlzIGRpc3R1cmJlZCBpZiBpdCBoYXMgYmVlbiByZWFkIGZyb20gYW5kIGl0IGNhbm5vdFxuLy8gYmUgcmUtdXNlZCB3aXRob3V0IGxvc2luZyBzdGF0ZSBvciBkYXRhLlxuZnVuY3Rpb24gaXNEaXN0dXJiZWQgKGJvZHkpIHtcbiAgcmV0dXJuICEhKGJvZHkgJiYgKFxuICAgIHN0cmVhbS5pc0Rpc3R1cmJlZFxuICAgICAgPyBzdHJlYW0uaXNEaXN0dXJiZWQoYm9keSkgfHwgYm9keVtrQm9keVVzZWRdIC8vIFRPRE8gKGZpeCk6IFdoeSBpcyBib2R5W2tCb2R5VXNlZF0gbmVlZGVkP1xuICAgICAgOiBib2R5W2tCb2R5VXNlZF0gfHxcbiAgICAgICAgYm9keS5yZWFkYWJsZURpZFJlYWQgfHxcbiAgICAgICAgKGJvZHkuX3JlYWRhYmxlU3RhdGUgJiYgYm9keS5fcmVhZGFibGVTdGF0ZS5kYXRhRW1pdHRlZCkgfHxcbiAgICAgICAgaXNSZWFkYWJsZUFib3J0ZWQoYm9keSlcbiAgKSlcbn1cblxuZnVuY3Rpb24gaXNFcnJvcmVkIChib2R5KSB7XG4gIHJldHVybiAhIShib2R5ICYmIChcbiAgICBzdHJlYW0uaXNFcnJvcmVkXG4gICAgICA/IHN0cmVhbS5pc0Vycm9yZWQoYm9keSlcbiAgICAgIDogL3N0YXRlOiAnZXJyb3JlZCcvLnRlc3Qobm9kZVV0aWwuaW5zcGVjdChib2R5KVxuICAgICAgKSkpXG59XG5cbmZ1bmN0aW9uIGlzUmVhZGFibGUgKGJvZHkpIHtcbiAgcmV0dXJuICEhKGJvZHkgJiYgKFxuICAgIHN0cmVhbS5pc1JlYWRhYmxlXG4gICAgICA/IHN0cmVhbS5pc1JlYWRhYmxlKGJvZHkpXG4gICAgICA6IC9zdGF0ZTogJ3JlYWRhYmxlJy8udGVzdChub2RlVXRpbC5pbnNwZWN0KGJvZHkpXG4gICAgICApKSlcbn1cblxuZnVuY3Rpb24gZ2V0U29ja2V0SW5mbyAoc29ja2V0KSB7XG4gIHJldHVybiB7XG4gICAgbG9jYWxBZGRyZXNzOiBzb2NrZXQubG9jYWxBZGRyZXNzLFxuICAgIGxvY2FsUG9ydDogc29ja2V0LmxvY2FsUG9ydCxcbiAgICByZW1vdGVBZGRyZXNzOiBzb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICByZW1vdGVQb3J0OiBzb2NrZXQucmVtb3RlUG9ydCxcbiAgICByZW1vdGVGYW1pbHk6IHNvY2tldC5yZW1vdGVGYW1pbHksXG4gICAgdGltZW91dDogc29ja2V0LnRpbWVvdXQsXG4gICAgYnl0ZXNXcml0dGVuOiBzb2NrZXQuYnl0ZXNXcml0dGVuLFxuICAgIGJ5dGVzUmVhZDogc29ja2V0LmJ5dGVzUmVhZFxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uICogY29udmVydEl0ZXJhYmxlVG9CdWZmZXIgKGl0ZXJhYmxlKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCBCdWZmZXIuaXNCdWZmZXIoY2h1bmspID8gY2h1bmsgOiBCdWZmZXIuZnJvbShjaHVuaylcbiAgfVxufVxuXG5sZXQgUmVhZGFibGVTdHJlYW1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnJvbSAoaXRlcmFibGUpIHtcbiAgaWYgKCFSZWFkYWJsZVN0cmVhbSkge1xuICAgIFJlYWRhYmxlU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtL3dlYicpLlJlYWRhYmxlU3RyZWFtXG4gIH1cblxuICBpZiAoUmVhZGFibGVTdHJlYW0uZnJvbSkge1xuICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbS5mcm9tKGNvbnZlcnRJdGVyYWJsZVRvQnVmZmVyKGl0ZXJhYmxlKSlcbiAgfVxuXG4gIGxldCBpdGVyYXRvclxuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKFxuICAgIHtcbiAgICAgIGFzeW5jIHN0YXJ0ICgpIHtcbiAgICAgICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHB1bGwgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpXG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBidWYgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpID8gdmFsdWUgOiBCdWZmZXIuZnJvbSh2YWx1ZSlcbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kZXNpcmVkU2l6ZSA+IDBcbiAgICAgIH0sXG4gICAgICBhc3luYyBjYW5jZWwgKHJlYXNvbikge1xuICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKVxuICAgICAgfVxuICAgIH0sXG4gICAgMFxuICApXG59XG5cbi8vIFRoZSBjaHVuayBzaG91bGQgYmUgYSBGb3JtRGF0YSBpbnN0YW5jZSBhbmQgY29udGFpbnNcbi8vIGFsbCB0aGUgcmVxdWlyZWQgbWV0aG9kcy5cbmZ1bmN0aW9uIGlzRm9ybURhdGFMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIChcbiAgICBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiBvYmplY3QuYXBwZW5kID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdC5kZWxldGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LmdldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBvYmplY3QuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdC5oYXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LnNldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIG9iamVjdFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnXG4gIClcbn1cblxuZnVuY3Rpb24gdGhyb3dJZkFib3J0ZWQgKHNpZ25hbCkge1xuICBpZiAoIXNpZ25hbCkgeyByZXR1cm4gfVxuICBpZiAodHlwZW9mIHNpZ25hbC50aHJvd0lmQWJvcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNpZ25hbC50aHJvd0lmQWJvcnRlZCgpXG4gIH0gZWxzZSB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAvLyBET01FeGNlcHRpb24gbm90IGF2YWlsYWJsZSA8IHYxNy4wLjBcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCcpXG4gICAgICBlcnIubmFtZSA9ICdBYm9ydEVycm9yJ1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEFib3J0TGlzdGVuZXIgKHNpZ25hbCwgbGlzdGVuZXIpIHtcbiAgaWYgKCdhZGRFdmVudExpc3RlbmVyJyBpbiBzaWduYWwpIHtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pXG4gICAgcmV0dXJuICgpID0+IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyKVxuICB9XG4gIHNpZ25hbC5hZGRMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lcilcbiAgcmV0dXJuICgpID0+IHNpZ25hbC5yZW1vdmVMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lcilcbn1cblxuY29uc3QgaGFzVG9XZWxsRm9ybWVkID0gISFTdHJpbmcucHJvdG90eXBlLnRvV2VsbEZvcm1lZFxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqL1xuZnVuY3Rpb24gdG9VU1ZTdHJpbmcgKHZhbCkge1xuICBpZiAoaGFzVG9XZWxsRm9ybWVkKSB7XG4gICAgcmV0dXJuIGAke3ZhbH1gLnRvV2VsbEZvcm1lZCgpXG4gIH0gZWxzZSBpZiAobm9kZVV0aWwudG9VU1ZTdHJpbmcpIHtcbiAgICByZXR1cm4gbm9kZVV0aWwudG9VU1ZTdHJpbmcodmFsKVxuICB9XG5cbiAgcmV0dXJuIGAke3ZhbH1gXG59XG5cbi8vIFBhcnNlZCBhY2NvcmRpbmdseSB0byBSRkMgOTExMFxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAjZmllbGQuY29udGVudC1yYW5nZVxuZnVuY3Rpb24gcGFyc2VSYW5nZUhlYWRlciAocmFuZ2UpIHtcbiAgaWYgKHJhbmdlID09IG51bGwgfHwgcmFuZ2UgPT09ICcnKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiBudWxsLCBzaXplOiBudWxsIH1cblxuICBjb25zdCBtID0gcmFuZ2UgPyByYW5nZS5tYXRjaCgvXmJ5dGVzIChcXGQrKS0oXFxkKylcXC8oXFxkKyk/JC8pIDogbnVsbFxuICByZXR1cm4gbVxuICAgID8ge1xuICAgICAgICBzdGFydDogcGFyc2VJbnQobVsxXSksXG4gICAgICAgIGVuZDogbVsyXSA/IHBhcnNlSW50KG1bMl0pIDogbnVsbCxcbiAgICAgICAgc2l6ZTogbVszXSA/IHBhcnNlSW50KG1bM10pIDogbnVsbFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuXG5jb25zdCBrRW51bWVyYWJsZVByb3BlcnR5ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxua0VudW1lcmFibGVQcm9wZXJ0eS5lbnVtZXJhYmxlID0gdHJ1ZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbm9wLFxuICBpc0Rpc3R1cmJlZCxcbiAgaXNFcnJvcmVkLFxuICBpc1JlYWRhYmxlLFxuICB0b1VTVlN0cmluZyxcbiAgaXNSZWFkYWJsZUFib3J0ZWQsXG4gIGlzQmxvYkxpa2UsXG4gIHBhcnNlT3JpZ2luLFxuICBwYXJzZVVSTCxcbiAgZ2V0U2VydmVyTmFtZSxcbiAgaXNTdHJlYW0sXG4gIGlzSXRlcmFibGUsXG4gIGlzQXN5bmNJdGVyYWJsZSxcbiAgaXNEZXN0cm95ZWQsXG4gIGhlYWRlck5hbWVUb1N0cmluZyxcbiAgcGFyc2VSYXdIZWFkZXJzLFxuICBwYXJzZUhlYWRlcnMsXG4gIHBhcnNlS2VlcEFsaXZlVGltZW91dCxcbiAgZGVzdHJveSxcbiAgYm9keUxlbmd0aCxcbiAgZGVlcENsb25lLFxuICBSZWFkYWJsZVN0cmVhbUZyb20sXG4gIGlzQnVmZmVyLFxuICB2YWxpZGF0ZUhhbmRsZXIsXG4gIGdldFNvY2tldEluZm8sXG4gIGlzRm9ybURhdGFMaWtlLFxuICBidWlsZFVSTCxcbiAgdGhyb3dJZkFib3J0ZWQsXG4gIGFkZEFib3J0TGlzdGVuZXIsXG4gIHBhcnNlUmFuZ2VIZWFkZXIsXG4gIG5vZGVNYWpvcixcbiAgbm9kZU1pbm9yLFxuICBub2RlSGFzQXV0b1NlbGVjdEZhbWlseTogbm9kZU1ham9yID4gMTggfHwgKG5vZGVNYWpvciA9PT0gMTggJiYgbm9kZU1pbm9yID49IDEzKSxcbiAgc2FmZUhUVFBNZXRob2RzOiBbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnVFJBQ0UnXVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubGV0IGZhc3ROb3cgPSBEYXRlLm5vdygpXG5sZXQgZmFzdE5vd1RpbWVvdXRcblxuY29uc3QgZmFzdFRpbWVycyA9IFtdXG5cbmZ1bmN0aW9uIG9uVGltZW91dCAoKSB7XG4gIGZhc3ROb3cgPSBEYXRlLm5vdygpXG5cbiAgbGV0IGxlbiA9IGZhc3RUaW1lcnMubGVuZ3RoXG4gIGxldCBpZHggPSAwXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBjb25zdCB0aW1lciA9IGZhc3RUaW1lcnNbaWR4XVxuXG4gICAgaWYgKHRpbWVyLnN0YXRlID09PSAwKSB7XG4gICAgICB0aW1lci5zdGF0ZSA9IGZhc3ROb3cgKyB0aW1lci5kZWxheVxuICAgIH0gZWxzZSBpZiAodGltZXIuc3RhdGUgPiAwICYmIGZhc3ROb3cgPj0gdGltZXIuc3RhdGUpIHtcbiAgICAgIHRpbWVyLnN0YXRlID0gLTFcbiAgICAgIHRpbWVyLmNhbGxiYWNrKHRpbWVyLm9wYXF1ZSlcbiAgICB9XG5cbiAgICBpZiAodGltZXIuc3RhdGUgPT09IC0xKSB7XG4gICAgICB0aW1lci5zdGF0ZSA9IC0yXG4gICAgICBpZiAoaWR4ICE9PSBsZW4gLSAxKSB7XG4gICAgICAgIGZhc3RUaW1lcnNbaWR4XSA9IGZhc3RUaW1lcnMucG9wKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhc3RUaW1lcnMucG9wKClcbiAgICAgIH1cbiAgICAgIGxlbiAtPSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIGlkeCArPSAxXG4gICAgfVxuICB9XG5cbiAgaWYgKGZhc3RUaW1lcnMubGVuZ3RoID4gMCkge1xuICAgIHJlZnJlc2hUaW1lb3V0KClcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoVGltZW91dCAoKSB7XG4gIGlmIChmYXN0Tm93VGltZW91dCAmJiBmYXN0Tm93VGltZW91dC5yZWZyZXNoKSB7XG4gICAgZmFzdE5vd1RpbWVvdXQucmVmcmVzaCgpXG4gIH0gZWxzZSB7XG4gICAgY2xlYXJUaW1lb3V0KGZhc3ROb3dUaW1lb3V0KVxuICAgIGZhc3ROb3dUaW1lb3V0ID0gc2V0VGltZW91dChvblRpbWVvdXQsIDFlMylcbiAgICBpZiAoZmFzdE5vd1RpbWVvdXQudW5yZWYpIHtcbiAgICAgIGZhc3ROb3dUaW1lb3V0LnVucmVmKClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgVGltZW91dCB7XG4gIGNvbnN0cnVjdG9yIChjYWxsYmFjaywgZGVsYXksIG9wYXF1ZSkge1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuZGVsYXkgPSBkZWxheVxuICAgIHRoaXMub3BhcXVlID0gb3BhcXVlXG5cbiAgICAvLyAgLTIgbm90IGluIHRpbWVyIGxpc3RcbiAgICAvLyAgLTEgaW4gdGltZXIgbGlzdCBidXQgaW5hY3RpdmVcbiAgICAvLyAgIDAgaW4gdGltZXIgbGlzdCB3YWl0aW5nIGZvciB0aW1lXG4gICAgLy8gPiAwIGluIHRpbWVyIGxpc3Qgd2FpdGluZyBmb3IgdGltZSB0byBleHBpcmVcbiAgICB0aGlzLnN0YXRlID0gLTJcblxuICAgIHRoaXMucmVmcmVzaCgpXG4gIH1cblxuICByZWZyZXNoICgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gLTIpIHtcbiAgICAgIGZhc3RUaW1lcnMucHVzaCh0aGlzKVxuICAgICAgaWYgKCFmYXN0Tm93VGltZW91dCB8fCBmYXN0VGltZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZWZyZXNoVGltZW91dCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IDBcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aGlzLnN0YXRlID0gLTFcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0VGltZW91dCAoY2FsbGJhY2ssIGRlbGF5LCBvcGFxdWUpIHtcbiAgICByZXR1cm4gZGVsYXkgPCAxZTNcbiAgICAgID8gc2V0VGltZW91dChjYWxsYmFjaywgZGVsYXksIG9wYXF1ZSlcbiAgICAgIDogbmV3IFRpbWVvdXQoY2FsbGJhY2ssIGRlbGF5LCBvcGFxdWUpXG4gIH0sXG4gIGNsZWFyVGltZW91dCAodGltZW91dCkge1xuICAgIGlmICh0aW1lb3V0IGluc3RhbmNlb2YgVGltZW91dCkge1xuICAgICAgdGltZW91dC5jbGVhcigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgIH1cbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLyoqXG4gKiBDb3B5cmlnaHQgQnJpYW4gV2hpdGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXNjZGV4L3N0cmVhbXNlYXJjaFxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4gKiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4gKiBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4gKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4gKiBJTiBUSEUgU09GVFdBUkUuXG4gKlxuICogQmFzZWQgaGVhdmlseSBvbiB0aGUgU3RyZWFtaW5nIEJveWVyLU1vb3JlLUhvcnNwb29sIEMrKyBpbXBsZW1lbnRhdGlvblxuICogYnkgSG9uZ2xpIExhaSBhdDogaHR0cHM6Ly9naXRodWIuY29tL0Zvb0JhcldpZGdldC9ib3llci1tb29yZS1ob3JzcG9vbFxuICovXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdub2RlOmV2ZW50cycpLkV2ZW50RW1pdHRlclxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdub2RlOnV0aWwnKS5pbmhlcml0c1xuXG5mdW5jdGlvbiBTQk1IIChuZWVkbGUpIHtcbiAgaWYgKHR5cGVvZiBuZWVkbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgbmVlZGxlID0gQnVmZmVyLmZyb20obmVlZGxlKVxuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIobmVlZGxlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBuZWVkbGUgaGFzIHRvIGJlIGEgU3RyaW5nIG9yIGEgQnVmZmVyLicpXG4gIH1cblxuICBjb25zdCBuZWVkbGVMZW5ndGggPSBuZWVkbGUubGVuZ3RoXG5cbiAgaWYgKG5lZWRsZUxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG5lZWRsZSBjYW5ub3QgYmUgYW4gZW1wdHkgU3RyaW5nL0J1ZmZlci4nKVxuICB9XG5cbiAgaWYgKG5lZWRsZUxlbmd0aCA+IDI1Nikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG5lZWRsZSBjYW5ub3QgaGF2ZSBhIGxlbmd0aCBiaWdnZXIgdGhhbiAyNTYuJylcbiAgfVxuXG4gIHRoaXMubWF4TWF0Y2hlcyA9IEluZmluaXR5XG4gIHRoaXMubWF0Y2hlcyA9IDBcblxuICB0aGlzLl9vY2MgPSBuZXcgQXJyYXkoMjU2KVxuICAgIC5maWxsKG5lZWRsZUxlbmd0aCkgLy8gSW5pdGlhbGl6ZSBvY2N1cnJlbmNlIHRhYmxlLlxuICB0aGlzLl9sb29rYmVoaW5kX3NpemUgPSAwXG4gIHRoaXMuX25lZWRsZSA9IG5lZWRsZVxuICB0aGlzLl9idWZwb3MgPSAwXG5cbiAgdGhpcy5fbG9va2JlaGluZCA9IEJ1ZmZlci5hbGxvYyhuZWVkbGVMZW5ndGgpXG5cbiAgLy8gUG9wdWxhdGUgb2NjdXJyZW5jZSB0YWJsZSB3aXRoIGFuYWx5c2lzIG9mIHRoZSBuZWVkbGUsXG4gIC8vIGlnbm9yaW5nIGxhc3QgbGV0dGVyLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5lZWRsZUxlbmd0aCAtIDE7ICsraSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXZhclxuICAgIHRoaXMuX29jY1tuZWVkbGVbaV1dID0gbmVlZGxlTGVuZ3RoIC0gMSAtIGlcbiAgfVxufVxuaW5oZXJpdHMoU0JNSCwgRXZlbnRFbWl0dGVyKVxuXG5TQk1ILnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fbG9va2JlaGluZF9zaXplID0gMFxuICB0aGlzLm1hdGNoZXMgPSAwXG4gIHRoaXMuX2J1ZnBvcyA9IDBcbn1cblxuU0JNSC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgcG9zKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssICdiaW5hcnknKVxuICB9XG4gIGNvbnN0IGNobGVuID0gY2h1bmsubGVuZ3RoXG4gIHRoaXMuX2J1ZnBvcyA9IHBvcyB8fCAwXG4gIGxldCByXG4gIHdoaWxlIChyICE9PSBjaGxlbiAmJiB0aGlzLm1hdGNoZXMgPCB0aGlzLm1heE1hdGNoZXMpIHsgciA9IHRoaXMuX3NibWhfZmVlZChjaHVuaykgfVxuICByZXR1cm4gclxufVxuXG5TQk1ILnByb3RvdHlwZS5fc2JtaF9mZWVkID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGhcbiAgY29uc3QgbmVlZGxlID0gdGhpcy5fbmVlZGxlXG4gIGNvbnN0IG5lZWRsZUxlbmd0aCA9IG5lZWRsZS5sZW5ndGhcbiAgY29uc3QgbGFzdE5lZWRsZUNoYXIgPSBuZWVkbGVbbmVlZGxlTGVuZ3RoIC0gMV1cblxuICAvLyBQb3NpdGl2ZTogcG9pbnRzIHRvIGEgcG9zaXRpb24gaW4gYGRhdGFgXG4gIC8vICAgICAgICAgICBwb3MgPT0gMyBwb2ludHMgdG8gZGF0YVszXVxuICAvLyBOZWdhdGl2ZTogcG9pbnRzIHRvIGEgcG9zaXRpb24gaW4gdGhlIGxvb2tiZWhpbmQgYnVmZmVyXG4gIC8vICAgICAgICAgICBwb3MgPT0gLTIgcG9pbnRzIHRvIGxvb2tiZWhpbmRbbG9va2JlaGluZF9zaXplIC0gMl1cbiAgbGV0IHBvcyA9IC10aGlzLl9sb29rYmVoaW5kX3NpemVcbiAgbGV0IGNoXG5cbiAgaWYgKHBvcyA8IDApIHtcbiAgICAvLyBMb29rYmVoaW5kIGJ1ZmZlciBpcyBub3QgZW1wdHkuIFBlcmZvcm0gQm95ZXItTW9vcmUtSG9yc3Bvb2xcbiAgICAvLyBzZWFyY2ggd2l0aCBjaGFyYWN0ZXIgbG9va3VwIGNvZGUgdGhhdCBjb25zaWRlcnMgYm90aCB0aGVcbiAgICAvLyBsb29rYmVoaW5kIGJ1ZmZlciBhbmQgdGhlIGN1cnJlbnQgcm91bmQncyBoYXlzdGFjayBkYXRhLlxuICAgIC8vXG4gICAgLy8gTG9vcCB1bnRpbFxuICAgIC8vICAgdGhlcmUgaXMgYSBtYXRjaC5cbiAgICAvLyBvciB1bnRpbFxuICAgIC8vICAgd2UndmUgbW92ZWQgcGFzdCB0aGUgcG9zaXRpb24gdGhhdCByZXF1aXJlcyB0aGVcbiAgICAvLyAgIGxvb2tiZWhpbmQgYnVmZmVyLiBJbiB0aGlzIGNhc2Ugd2Ugc3dpdGNoIHRvIHRoZVxuICAgIC8vICAgb3B0aW1pemVkIGxvb3AuXG4gICAgLy8gb3IgdW50aWxcbiAgICAvLyAgIHRoZSBjaGFyYWN0ZXIgdG8gbG9vayBhdCBsaWVzIG91dHNpZGUgdGhlIGhheXN0YWNrLlxuICAgIHdoaWxlIChwb3MgPCAwICYmIHBvcyA8PSBsZW4gLSBuZWVkbGVMZW5ndGgpIHtcbiAgICAgIGNoID0gdGhpcy5fc2JtaF9sb29rdXBfY2hhcihkYXRhLCBwb3MgKyBuZWVkbGVMZW5ndGggLSAxKVxuXG4gICAgICBpZiAoXG4gICAgICAgIGNoID09PSBsYXN0TmVlZGxlQ2hhciAmJlxuICAgICAgICB0aGlzLl9zYm1oX21lbWNtcChkYXRhLCBwb3MsIG5lZWRsZUxlbmd0aCAtIDEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fbG9va2JlaGluZF9zaXplID0gMFxuICAgICAgICArK3RoaXMubWF0Y2hlc1xuICAgICAgICB0aGlzLmVtaXQoJ2luZm8nLCB0cnVlKVxuXG4gICAgICAgIHJldHVybiAodGhpcy5fYnVmcG9zID0gcG9zICsgbmVlZGxlTGVuZ3RoKVxuICAgICAgfVxuICAgICAgcG9zICs9IHRoaXMuX29jY1tjaF1cbiAgICB9XG5cbiAgICAvLyBObyBtYXRjaC5cblxuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICAvLyBUaGVyZSdzIHRvbyBmZXcgZGF0YSBmb3IgQm95ZXItTW9vcmUtSG9yc3Bvb2wgdG8gcnVuLFxuICAgICAgLy8gc28gbGV0J3MgdXNlIGEgZGlmZmVyZW50IGFsZ29yaXRobSB0byBza2lwIGFzIG11Y2ggYXNcbiAgICAgIC8vIHdlIGNhbi5cbiAgICAgIC8vIEZvcndhcmQgcG9zIHVudGlsXG4gICAgICAvLyAgIHRoZSB0cmFpbGluZyBwYXJ0IG9mIGxvb2tiZWhpbmQgKyBkYXRhXG4gICAgICAvLyAgIGxvb2tzIGxpa2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmVlZGxlXG4gICAgICAvLyBvciB1bnRpbFxuICAgICAgLy8gICBwb3MgPT0gMFxuICAgICAgd2hpbGUgKHBvcyA8IDAgJiYgIXRoaXMuX3NibWhfbWVtY21wKGRhdGEsIHBvcywgbGVuIC0gcG9zKSkgeyArK3BvcyB9XG4gICAgfVxuXG4gICAgaWYgKHBvcyA+PSAwKSB7XG4gICAgICAvLyBEaXNjYXJkIGxvb2tiZWhpbmQgYnVmZmVyLlxuICAgICAgdGhpcy5lbWl0KCdpbmZvJywgZmFsc2UsIHRoaXMuX2xvb2tiZWhpbmQsIDAsIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSlcbiAgICAgIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSA9IDBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3V0IG9mZiBwYXJ0IG9mIHRoZSBsb29rYmVoaW5kIGJ1ZmZlciB0aGF0IGhhc1xuICAgICAgLy8gYmVlbiBwcm9jZXNzZWQgYW5kIGFwcGVuZCB0aGUgZW50aXJlIGhheXN0YWNrXG4gICAgICAvLyBpbnRvIGl0LlxuICAgICAgY29uc3QgYnl0ZXNUb0N1dE9mZiA9IHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSArIHBvc1xuICAgICAgaWYgKGJ5dGVzVG9DdXRPZmYgPiAwKSB7XG4gICAgICAgIC8vIFRoZSBjdXQgb2ZmIGRhdGEgaXMgZ3VhcmFudGVlZCBub3QgdG8gY29udGFpbiB0aGUgbmVlZGxlLlxuICAgICAgICB0aGlzLmVtaXQoJ2luZm8nLCBmYWxzZSwgdGhpcy5fbG9va2JlaGluZCwgMCwgYnl0ZXNUb0N1dE9mZilcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbG9va2JlaGluZC5jb3B5KHRoaXMuX2xvb2tiZWhpbmQsIDAsIGJ5dGVzVG9DdXRPZmYsXG4gICAgICAgIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSAtIGJ5dGVzVG9DdXRPZmYpXG4gICAgICB0aGlzLl9sb29rYmVoaW5kX3NpemUgLT0gYnl0ZXNUb0N1dE9mZlxuXG4gICAgICBkYXRhLmNvcHkodGhpcy5fbG9va2JlaGluZCwgdGhpcy5fbG9va2JlaGluZF9zaXplKVxuICAgICAgdGhpcy5fbG9va2JlaGluZF9zaXplICs9IGxlblxuXG4gICAgICB0aGlzLl9idWZwb3MgPSBsZW5cbiAgICAgIHJldHVybiBsZW5cbiAgICB9XG4gIH1cblxuICBwb3MgKz0gKHBvcyA+PSAwKSAqIHRoaXMuX2J1ZnBvc1xuXG4gIC8vIExvb2tiZWhpbmQgYnVmZmVyIGlzIG5vdyBlbXB0eS4gV2Ugb25seSBuZWVkIHRvIGNoZWNrIGlmIHRoZVxuICAvLyBuZWVkbGUgaXMgaW4gdGhlIGhheXN0YWNrLlxuICBpZiAoZGF0YS5pbmRleE9mKG5lZWRsZSwgcG9zKSAhPT0gLTEpIHtcbiAgICBwb3MgPSBkYXRhLmluZGV4T2YobmVlZGxlLCBwb3MpXG4gICAgKyt0aGlzLm1hdGNoZXNcbiAgICBpZiAocG9zID4gMCkgeyB0aGlzLmVtaXQoJ2luZm8nLCB0cnVlLCBkYXRhLCB0aGlzLl9idWZwb3MsIHBvcykgfSBlbHNlIHsgdGhpcy5lbWl0KCdpbmZvJywgdHJ1ZSkgfVxuXG4gICAgcmV0dXJuICh0aGlzLl9idWZwb3MgPSBwb3MgKyBuZWVkbGVMZW5ndGgpXG4gIH0gZWxzZSB7XG4gICAgcG9zID0gbGVuIC0gbmVlZGxlTGVuZ3RoXG4gIH1cblxuICAvLyBUaGVyZSB3YXMgbm8gbWF0Y2guIElmIHRoZXJlJ3MgdHJhaWxpbmcgaGF5c3RhY2sgZGF0YSB0aGF0IHdlIGNhbm5vdFxuICAvLyBtYXRjaCB5ZXQgdXNpbmcgdGhlIEJveWVyLU1vb3JlLUhvcnNwb29sIGFsZ29yaXRobSAoYmVjYXVzZSB0aGUgdHJhaWxpbmdcbiAgLy8gZGF0YSBpcyBsZXNzIHRoYW4gdGhlIG5lZWRsZSBzaXplKSB0aGVuIG1hdGNoIHVzaW5nIGEgbW9kaWZpZWRcbiAgLy8gYWxnb3JpdGhtIHRoYXQgc3RhcnRzIG1hdGNoaW5nIGZyb20gdGhlIGJlZ2lubmluZyBpbnN0ZWFkIG9mIHRoZSBlbmQuXG4gIC8vIFdoYXRldmVyIHRyYWlsaW5nIGRhdGEgaXMgbGVmdCBhZnRlciBydW5uaW5nIHRoaXMgYWxnb3JpdGhtIGlzIGFkZGVkIHRvXG4gIC8vIHRoZSBsb29rYmVoaW5kIGJ1ZmZlci5cbiAgd2hpbGUgKFxuICAgIHBvcyA8IGxlbiAmJlxuICAgIChcbiAgICAgIGRhdGFbcG9zXSAhPT0gbmVlZGxlWzBdIHx8XG4gICAgICAoXG4gICAgICAgIChCdWZmZXIuY29tcGFyZShcbiAgICAgICAgICBkYXRhLnN1YmFycmF5KHBvcywgcG9zICsgbGVuIC0gcG9zKSxcbiAgICAgICAgICBuZWVkbGUuc3ViYXJyYXkoMCwgbGVuIC0gcG9zKVxuICAgICAgICApICE9PSAwKVxuICAgICAgKVxuICAgIClcbiAgKSB7XG4gICAgKytwb3NcbiAgfVxuICBpZiAocG9zIDwgbGVuKSB7XG4gICAgZGF0YS5jb3B5KHRoaXMuX2xvb2tiZWhpbmQsIDAsIHBvcywgcG9zICsgKGxlbiAtIHBvcykpXG4gICAgdGhpcy5fbG9va2JlaGluZF9zaXplID0gbGVuIC0gcG9zXG4gIH1cblxuICAvLyBFdmVyeXRoaW5nIHVudGlsIHBvcyBpcyBndWFyYW50ZWVkIG5vdCB0byBjb250YWluIG5lZWRsZSBkYXRhLlxuICBpZiAocG9zID4gMCkgeyB0aGlzLmVtaXQoJ2luZm8nLCBmYWxzZSwgZGF0YSwgdGhpcy5fYnVmcG9zLCBwb3MgPCBsZW4gPyBwb3MgOiBsZW4pIH1cblxuICB0aGlzLl9idWZwb3MgPSBsZW5cbiAgcmV0dXJuIGxlblxufVxuXG5TQk1ILnByb3RvdHlwZS5fc2JtaF9sb29rdXBfY2hhciA9IGZ1bmN0aW9uIChkYXRhLCBwb3MpIHtcbiAgcmV0dXJuIChwb3MgPCAwKVxuICAgID8gdGhpcy5fbG9va2JlaGluZFt0aGlzLl9sb29rYmVoaW5kX3NpemUgKyBwb3NdXG4gICAgOiBkYXRhW3Bvc11cbn1cblxuU0JNSC5wcm90b3R5cGUuX3NibWhfbWVtY21wID0gZnVuY3Rpb24gKGRhdGEsIHBvcywgbGVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby12YXJcbiAgICBpZiAodGhpcy5fc2JtaF9sb29rdXBfY2hhcihkYXRhLCBwb3MgKyBpKSAhPT0gdGhpcy5fbmVlZGxlW2ldKSB7IHJldHVybiBmYWxzZSB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTQk1IXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5jb25zdCBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJykuUmVhZGFibGVcblxuZnVuY3Rpb24gUGFydFN0cmVhbSAob3B0cykge1xuICBSZWFkYWJsZVN0cmVhbS5jYWxsKHRoaXMsIG9wdHMpXG59XG5pbmhlcml0cyhQYXJ0U3RyZWFtLCBSZWFkYWJsZVN0cmVhbSlcblxuUGFydFN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge31cblxubW9kdWxlLmV4cG9ydHMgPSBQYXJ0U3RyZWFtXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldExpbWl0IChsaW1pdHMsIG5hbWUsIGRlZmF1bHRMaW1pdCkge1xuICBpZiAoXG4gICAgIWxpbWl0cyB8fFxuICAgIGxpbWl0c1tuYW1lXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgbGltaXRzW25hbWVdID09PSBudWxsXG4gICkgeyByZXR1cm4gZGVmYXVsdExpbWl0IH1cblxuICBpZiAoXG4gICAgdHlwZW9mIGxpbWl0c1tuYW1lXSAhPT0gJ251bWJlcicgfHxcbiAgICBpc05hTihsaW1pdHNbbmFtZV0pXG4gICkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW1pdCAnICsgbmFtZSArICcgaXMgbm90IGEgdmFsaWQgbnVtYmVyJykgfVxuXG4gIHJldHVybiBsaW1pdHNbbmFtZV1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ25vZGU6ZXZlbnRzJykuRXZlbnRFbWl0dGVyXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5jb25zdCBnZXRMaW1pdCA9IHJlcXVpcmUoJy4uLy4uLy4uL2xpYi91dGlscy9nZXRMaW1pdCcpXG5cbmNvbnN0IFN0cmVhbVNlYXJjaCA9IHJlcXVpcmUoJy4uLy4uL3N0cmVhbXNlYXJjaC9zYm1oJylcblxuY29uc3QgQl9EQ1JMRiA9IEJ1ZmZlci5mcm9tKCdcXHJcXG5cXHJcXG4nKVxuY29uc3QgUkVfQ1JMRiA9IC9cXHJcXG4vZ1xuY29uc3QgUkVfSERSID0gL14oW146XSspOlsgXFx0XT8oW1xceDAwLVxceEZGXSspPyQvIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuXG5mdW5jdGlvbiBIZWFkZXJQYXJzZXIgKGNmZykge1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKVxuXG4gIGNmZyA9IGNmZyB8fCB7fVxuICBjb25zdCBzZWxmID0gdGhpc1xuICB0aGlzLm5yZWFkID0gMFxuICB0aGlzLm1heGVkID0gZmFsc2VcbiAgdGhpcy5ucGFpcnMgPSAwXG4gIHRoaXMubWF4SGVhZGVyUGFpcnMgPSBnZXRMaW1pdChjZmcsICdtYXhIZWFkZXJQYWlycycsIDIwMDApXG4gIHRoaXMubWF4SGVhZGVyU2l6ZSA9IGdldExpbWl0KGNmZywgJ21heEhlYWRlclNpemUnLCA4MCAqIDEwMjQpXG4gIHRoaXMuYnVmZmVyID0gJydcbiAgdGhpcy5oZWFkZXIgPSB7fVxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2VcbiAgdGhpcy5zcyA9IG5ldyBTdHJlYW1TZWFyY2goQl9EQ1JMRilcbiAgdGhpcy5zcy5vbignaW5mbycsIGZ1bmN0aW9uIChpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgaWYgKGRhdGEgJiYgIXNlbGYubWF4ZWQpIHtcbiAgICAgIGlmIChzZWxmLm5yZWFkICsgZW5kIC0gc3RhcnQgPj0gc2VsZi5tYXhIZWFkZXJTaXplKSB7XG4gICAgICAgIGVuZCA9IHNlbGYubWF4SGVhZGVyU2l6ZSAtIHNlbGYubnJlYWQgKyBzdGFydFxuICAgICAgICBzZWxmLm5yZWFkID0gc2VsZi5tYXhIZWFkZXJTaXplXG4gICAgICAgIHNlbGYubWF4ZWQgPSB0cnVlXG4gICAgICB9IGVsc2UgeyBzZWxmLm5yZWFkICs9IChlbmQgLSBzdGFydCkgfVxuXG4gICAgICBzZWxmLmJ1ZmZlciArPSBkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBzdGFydCwgZW5kKVxuICAgIH1cbiAgICBpZiAoaXNNYXRjaCkgeyBzZWxmLl9maW5pc2goKSB9XG4gIH0pXG59XG5pbmhlcml0cyhIZWFkZXJQYXJzZXIsIEV2ZW50RW1pdHRlcilcblxuSGVhZGVyUGFyc2VyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgY29uc3QgciA9IHRoaXMuc3MucHVzaChkYXRhKVxuICBpZiAodGhpcy5maW5pc2hlZCkgeyByZXR1cm4gciB9XG59XG5cbkhlYWRlclBhcnNlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZVxuICB0aGlzLmJ1ZmZlciA9ICcnXG4gIHRoaXMuaGVhZGVyID0ge31cbiAgdGhpcy5zcy5yZXNldCgpXG59XG5cbkhlYWRlclBhcnNlci5wcm90b3R5cGUuX2ZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYnVmZmVyKSB7IHRoaXMuX3BhcnNlSGVhZGVyKCkgfVxuICB0aGlzLnNzLm1hdGNoZXMgPSB0aGlzLnNzLm1heE1hdGNoZXNcbiAgY29uc3QgaGVhZGVyID0gdGhpcy5oZWFkZXJcbiAgdGhpcy5oZWFkZXIgPSB7fVxuICB0aGlzLmJ1ZmZlciA9ICcnXG4gIHRoaXMuZmluaXNoZWQgPSB0cnVlXG4gIHRoaXMubnJlYWQgPSB0aGlzLm5wYWlycyA9IDBcbiAgdGhpcy5tYXhlZCA9IGZhbHNlXG4gIHRoaXMuZW1pdCgnaGVhZGVyJywgaGVhZGVyKVxufVxuXG5IZWFkZXJQYXJzZXIucHJvdG90eXBlLl9wYXJzZUhlYWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubnBhaXJzID09PSB0aGlzLm1heEhlYWRlclBhaXJzKSB7IHJldHVybiB9XG5cbiAgY29uc3QgbGluZXMgPSB0aGlzLmJ1ZmZlci5zcGxpdChSRV9DUkxGKVxuICBjb25zdCBsZW4gPSBsaW5lcy5sZW5ndGhcbiAgbGV0IG0sIGhcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdmFyXG4gICAgaWYgKGxpbmVzW2ldLmxlbmd0aCA9PT0gMCkgeyBjb250aW51ZSB9XG4gICAgaWYgKGxpbmVzW2ldWzBdID09PSAnXFx0JyB8fCBsaW5lc1tpXVswXSA9PT0gJyAnKSB7XG4gICAgICAvLyBmb2xkZWQgaGVhZGVyIGNvbnRlbnRcbiAgICAgIC8vIFJGQzI4MjIgc2F5cyB0byBqdXN0IHJlbW92ZSB0aGUgQ1JMRiBhbmQgbm90IHRoZSB3aGl0ZXNwYWNlIGZvbGxvd2luZ1xuICAgICAgLy8gaXQsIHNvIHdlIGZvbGxvdyB0aGUgUkZDIGFuZCBpbmNsdWRlIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UgLi4uXG4gICAgICBpZiAoaCkge1xuICAgICAgICB0aGlzLmhlYWRlcltoXVt0aGlzLmhlYWRlcltoXS5sZW5ndGggLSAxXSArPSBsaW5lc1tpXVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBvc0NvbG9uID0gbGluZXNbaV0uaW5kZXhPZignOicpXG4gICAgaWYgKFxuICAgICAgcG9zQ29sb24gPT09IC0xIHx8XG4gICAgICBwb3NDb2xvbiA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIG0gPSBSRV9IRFIuZXhlYyhsaW5lc1tpXSlcbiAgICBoID0gbVsxXS50b0xvd2VyQ2FzZSgpXG4gICAgdGhpcy5oZWFkZXJbaF0gPSB0aGlzLmhlYWRlcltoXSB8fCBbXVxuICAgIHRoaXMuaGVhZGVyW2hdLnB1c2goKG1bMl0gfHwgJycpKVxuICAgIGlmICgrK3RoaXMubnBhaXJzID09PSB0aGlzLm1heEhlYWRlclBhaXJzKSB7IGJyZWFrIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhlYWRlclBhcnNlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgV3JpdGFibGVTdHJlYW0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpLldyaXRhYmxlXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5cbmNvbnN0IFN0cmVhbVNlYXJjaCA9IHJlcXVpcmUoJy4uLy4uL3N0cmVhbXNlYXJjaC9zYm1oJylcblxuY29uc3QgUGFydFN0cmVhbSA9IHJlcXVpcmUoJy4vUGFydFN0cmVhbScpXG5jb25zdCBIZWFkZXJQYXJzZXIgPSByZXF1aXJlKCcuL0hlYWRlclBhcnNlcicpXG5cbmNvbnN0IERBU0ggPSA0NVxuY29uc3QgQl9PTkVEQVNIID0gQnVmZmVyLmZyb20oJy0nKVxuY29uc3QgQl9DUkxGID0gQnVmZmVyLmZyb20oJ1xcclxcbicpXG5jb25zdCBFTVBUWV9GTiA9IGZ1bmN0aW9uICgpIHt9XG5cbmZ1bmN0aW9uIERpY2VyIChjZmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERpY2VyKSkgeyByZXR1cm4gbmV3IERpY2VyKGNmZykgfVxuICBXcml0YWJsZVN0cmVhbS5jYWxsKHRoaXMsIGNmZylcblxuICBpZiAoIWNmZyB8fCAoIWNmZy5oZWFkZXJGaXJzdCAmJiB0eXBlb2YgY2ZnLmJvdW5kYXJ5ICE9PSAnc3RyaW5nJykpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQm91bmRhcnkgcmVxdWlyZWQnKSB9XG5cbiAgaWYgKHR5cGVvZiBjZmcuYm91bmRhcnkgPT09ICdzdHJpbmcnKSB7IHRoaXMuc2V0Qm91bmRhcnkoY2ZnLmJvdW5kYXJ5KSB9IGVsc2UgeyB0aGlzLl9icGFyc2VyID0gdW5kZWZpbmVkIH1cblxuICB0aGlzLl9oZWFkZXJGaXJzdCA9IGNmZy5oZWFkZXJGaXJzdFxuXG4gIHRoaXMuX2Rhc2hlcyA9IDBcbiAgdGhpcy5fcGFydHMgPSAwXG4gIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2VcbiAgdGhpcy5fcmVhbEZpbmlzaCA9IGZhbHNlXG4gIHRoaXMuX2lzUHJlYW1ibGUgPSB0cnVlXG4gIHRoaXMuX2p1c3RNYXRjaGVkID0gZmFsc2VcbiAgdGhpcy5fZmlyc3RXcml0ZSA9IHRydWVcbiAgdGhpcy5faW5IZWFkZXIgPSB0cnVlXG4gIHRoaXMuX3BhcnQgPSB1bmRlZmluZWRcbiAgdGhpcy5fY2IgPSB1bmRlZmluZWRcbiAgdGhpcy5faWdub3JlRGF0YSA9IGZhbHNlXG4gIHRoaXMuX3BhcnRPcHRzID0geyBoaWdoV2F0ZXJNYXJrOiBjZmcucGFydEh3bSB9XG4gIHRoaXMuX3BhdXNlID0gZmFsc2VcblxuICBjb25zdCBzZWxmID0gdGhpc1xuICB0aGlzLl9ocGFyc2VyID0gbmV3IEhlYWRlclBhcnNlcihjZmcpXG4gIHRoaXMuX2hwYXJzZXIub24oJ2hlYWRlcicsIGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICBzZWxmLl9pbkhlYWRlciA9IGZhbHNlXG4gICAgc2VsZi5fcGFydC5lbWl0KCdoZWFkZXInLCBoZWFkZXIpXG4gIH0pXG59XG5pbmhlcml0cyhEaWNlciwgV3JpdGFibGVTdHJlYW0pXG5cbkRpY2VyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKGV2KSB7XG4gIGlmIChldiA9PT0gJ2ZpbmlzaCcgJiYgIXRoaXMuX3JlYWxGaW5pc2gpIHtcbiAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIG11bHRpcGFydCBkYXRhJykpXG4gICAgICAgIGlmIChzZWxmLl9wYXJ0ICYmICFzZWxmLl9pZ25vcmVEYXRhKSB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IChzZWxmLl9pc1ByZWFtYmxlID8gJ1ByZWFtYmxlJyA6ICdQYXJ0JylcbiAgICAgICAgICBzZWxmLl9wYXJ0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKHR5cGUgKyAnIHRlcm1pbmF0ZWQgZWFybHkgZHVlIHRvIHVuZXhwZWN0ZWQgZW5kIG9mIG11bHRpcGFydCBkYXRhJykpXG4gICAgICAgICAgc2VsZi5fcGFydC5wdXNoKG51bGwpXG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gdHJ1ZVxuICAgICAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gdHJ1ZVxuICAgICAgICBzZWxmLmVtaXQoJ2ZpbmlzaCcpXG4gICAgICAgIHNlbGYuX3JlYWxGaW5pc2ggPSBmYWxzZVxuICAgICAgfSlcbiAgICB9XG4gIH0gZWxzZSB7IFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZS5lbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nLCBjYikge1xuICAvLyBpZ25vcmUgdW5leHBlY3RlZCBkYXRhIChlLmcuIGV4dHJhIHRyYWlsZXIgZGF0YSBhZnRlciBmaW5pc2hlZClcbiAgaWYgKCF0aGlzLl9ocGFyc2VyICYmICF0aGlzLl9icGFyc2VyKSB7IHJldHVybiBjYigpIH1cblxuICBpZiAodGhpcy5faGVhZGVyRmlyc3QgJiYgdGhpcy5faXNQcmVhbWJsZSkge1xuICAgIGlmICghdGhpcy5fcGFydCkge1xuICAgICAgdGhpcy5fcGFydCA9IG5ldyBQYXJ0U3RyZWFtKHRoaXMuX3BhcnRPcHRzKVxuICAgICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudCgncHJlYW1ibGUnKSAhPT0gMCkgeyB0aGlzLmVtaXQoJ3ByZWFtYmxlJywgdGhpcy5fcGFydCkgfSBlbHNlIHsgdGhpcy5faWdub3JlKCkgfVxuICAgIH1cbiAgICBjb25zdCByID0gdGhpcy5faHBhcnNlci5wdXNoKGRhdGEpXG4gICAgaWYgKCF0aGlzLl9pbkhlYWRlciAmJiByICE9PSB1bmRlZmluZWQgJiYgciA8IGRhdGEubGVuZ3RoKSB7IGRhdGEgPSBkYXRhLnNsaWNlKHIpIH0gZWxzZSB7IHJldHVybiBjYigpIH1cbiAgfVxuXG4gIC8vIGFsbG93cyBmb3IgXCJlYXNpZXJcIiB0ZXN0aW5nXG4gIGlmICh0aGlzLl9maXJzdFdyaXRlKSB7XG4gICAgdGhpcy5fYnBhcnNlci5wdXNoKEJfQ1JMRilcbiAgICB0aGlzLl9maXJzdFdyaXRlID0gZmFsc2VcbiAgfVxuXG4gIHRoaXMuX2JwYXJzZXIucHVzaChkYXRhKVxuXG4gIGlmICh0aGlzLl9wYXVzZSkgeyB0aGlzLl9jYiA9IGNiIH0gZWxzZSB7IGNiKCkgfVxufVxuXG5EaWNlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX3BhcnQgPSB1bmRlZmluZWRcbiAgdGhpcy5fYnBhcnNlciA9IHVuZGVmaW5lZFxuICB0aGlzLl9ocGFyc2VyID0gdW5kZWZpbmVkXG59XG5cbkRpY2VyLnByb3RvdHlwZS5zZXRCb3VuZGFyeSA9IGZ1bmN0aW9uIChib3VuZGFyeSkge1xuICBjb25zdCBzZWxmID0gdGhpc1xuICB0aGlzLl9icGFyc2VyID0gbmV3IFN0cmVhbVNlYXJjaCgnXFxyXFxuLS0nICsgYm91bmRhcnkpXG4gIHRoaXMuX2JwYXJzZXIub24oJ2luZm8nLCBmdW5jdGlvbiAoaXNNYXRjaCwgZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgIHNlbGYuX29uaW5mbyhpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKVxuICB9KVxufVxuXG5EaWNlci5wcm90b3R5cGUuX2lnbm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX3BhcnQgJiYgIXRoaXMuX2lnbm9yZURhdGEpIHtcbiAgICB0aGlzLl9pZ25vcmVEYXRhID0gdHJ1ZVxuICAgIHRoaXMuX3BhcnQub24oJ2Vycm9yJywgRU1QVFlfRk4pXG4gICAgLy8gd2UgbXVzdCBwZXJmb3JtIHNvbWUga2luZCBvZiByZWFkIG9uIHRoZSBzdHJlYW0gZXZlbiB0aG91Z2ggd2UgYXJlXG4gICAgLy8gaWdub3JpbmcgdGhlIGRhdGEsIG90aGVyd2lzZSBub2RlJ3MgUmVhZGFibGUgc3RyZWFtIHdpbGwgbm90IGVtaXQgJ2VuZCdcbiAgICAvLyBhZnRlciBwdXNoaW5nIG51bGwgdG8gdGhlIHN0cmVhbVxuICAgIHRoaXMuX3BhcnQucmVzdW1lKClcbiAgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX29uaW5mbyA9IGZ1bmN0aW9uIChpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gIGxldCBidWY7IGNvbnN0IHNlbGYgPSB0aGlzOyBsZXQgaSA9IDA7IGxldCByOyBsZXQgc2hvdWxkV3JpdGVNb3JlID0gdHJ1ZVxuXG4gIGlmICghdGhpcy5fcGFydCAmJiB0aGlzLl9qdXN0TWF0Y2hlZCAmJiBkYXRhKSB7XG4gICAgd2hpbGUgKHRoaXMuX2Rhc2hlcyA8IDIgJiYgKHN0YXJ0ICsgaSkgPCBlbmQpIHtcbiAgICAgIGlmIChkYXRhW3N0YXJ0ICsgaV0gPT09IERBU0gpIHtcbiAgICAgICAgKytpXG4gICAgICAgICsrdGhpcy5fZGFzaGVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fZGFzaGVzKSB7IGJ1ZiA9IEJfT05FREFTSCB9XG4gICAgICAgIHRoaXMuX2Rhc2hlcyA9IDBcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2Rhc2hlcyA9PT0gMikge1xuICAgICAgaWYgKChzdGFydCArIGkpIDwgZW5kICYmIHRoaXMubGlzdGVuZXJDb3VudCgndHJhaWxlcicpICE9PSAwKSB7IHRoaXMuZW1pdCgndHJhaWxlcicsIGRhdGEuc2xpY2Uoc3RhcnQgKyBpLCBlbmQpKSB9XG4gICAgICB0aGlzLnJlc2V0KClcbiAgICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZVxuICAgICAgLy8gbm8gbW9yZSBwYXJ0cyB3aWxsIGJlIGFkZGVkXG4gICAgICBpZiAoc2VsZi5fcGFydHMgPT09IDApIHtcbiAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IHRydWVcbiAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2Rhc2hlcykgeyByZXR1cm4gfVxuICB9XG4gIGlmICh0aGlzLl9qdXN0TWF0Y2hlZCkgeyB0aGlzLl9qdXN0TWF0Y2hlZCA9IGZhbHNlIH1cbiAgaWYgKCF0aGlzLl9wYXJ0KSB7XG4gICAgdGhpcy5fcGFydCA9IG5ldyBQYXJ0U3RyZWFtKHRoaXMuX3BhcnRPcHRzKVxuICAgIHRoaXMuX3BhcnQuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgICAgc2VsZi5fdW5wYXVzZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1ByZWFtYmxlICYmIHRoaXMubGlzdGVuZXJDb3VudCgncHJlYW1ibGUnKSAhPT0gMCkge1xuICAgICAgdGhpcy5lbWl0KCdwcmVhbWJsZScsIHRoaXMuX3BhcnQpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9pc1ByZWFtYmxlICE9PSB0cnVlICYmIHRoaXMubGlzdGVuZXJDb3VudCgncGFydCcpICE9PSAwKSB7XG4gICAgICB0aGlzLmVtaXQoJ3BhcnQnLCB0aGlzLl9wYXJ0KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pZ25vcmUoKVxuICAgIH1cbiAgICBpZiAoIXRoaXMuX2lzUHJlYW1ibGUpIHsgdGhpcy5faW5IZWFkZXIgPSB0cnVlIH1cbiAgfVxuICBpZiAoZGF0YSAmJiBzdGFydCA8IGVuZCAmJiAhdGhpcy5faWdub3JlRGF0YSkge1xuICAgIGlmICh0aGlzLl9pc1ByZWFtYmxlIHx8ICF0aGlzLl9pbkhlYWRlcikge1xuICAgICAgaWYgKGJ1ZikgeyBzaG91bGRXcml0ZU1vcmUgPSB0aGlzLl9wYXJ0LnB1c2goYnVmKSB9XG4gICAgICBzaG91bGRXcml0ZU1vcmUgPSB0aGlzLl9wYXJ0LnB1c2goZGF0YS5zbGljZShzdGFydCwgZW5kKSlcbiAgICAgIGlmICghc2hvdWxkV3JpdGVNb3JlKSB7IHRoaXMuX3BhdXNlID0gdHJ1ZSB9XG4gICAgfSBlbHNlIGlmICghdGhpcy5faXNQcmVhbWJsZSAmJiB0aGlzLl9pbkhlYWRlcikge1xuICAgICAgaWYgKGJ1ZikgeyB0aGlzLl9ocGFyc2VyLnB1c2goYnVmKSB9XG4gICAgICByID0gdGhpcy5faHBhcnNlci5wdXNoKGRhdGEuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gICAgICBpZiAoIXRoaXMuX2luSGVhZGVyICYmIHIgIT09IHVuZGVmaW5lZCAmJiByIDwgZW5kKSB7IHRoaXMuX29uaW5mbyhmYWxzZSwgZGF0YSwgc3RhcnQgKyByLCBlbmQpIH1cbiAgICB9XG4gIH1cbiAgaWYgKGlzTWF0Y2gpIHtcbiAgICB0aGlzLl9ocGFyc2VyLnJlc2V0KClcbiAgICBpZiAodGhpcy5faXNQcmVhbWJsZSkgeyB0aGlzLl9pc1ByZWFtYmxlID0gZmFsc2UgfSBlbHNlIHtcbiAgICAgIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgICAgICsrdGhpcy5fcGFydHNcbiAgICAgICAgdGhpcy5fcGFydC5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICgtLXNlbGYuX3BhcnRzID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IHRydWVcbiAgICAgICAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gZmFsc2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYuX3VucGF1c2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcGFydC5wdXNoKG51bGwpXG4gICAgdGhpcy5fcGFydCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2lnbm9yZURhdGEgPSBmYWxzZVxuICAgIHRoaXMuX2p1c3RNYXRjaGVkID0gdHJ1ZVxuICAgIHRoaXMuX2Rhc2hlcyA9IDBcbiAgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX3VucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5fcGF1c2UpIHsgcmV0dXJuIH1cblxuICB0aGlzLl9wYXVzZSA9IGZhbHNlXG4gIGlmICh0aGlzLl9jYikge1xuICAgIGNvbnN0IGNiID0gdGhpcy5fY2JcbiAgICB0aGlzLl9jYiA9IHVuZGVmaW5lZFxuICAgIGNiKClcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERpY2VyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBOb2RlIGhhcyBhbHdheXMgdXRmLThcbmNvbnN0IHV0ZjhEZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpXG5jb25zdCB0ZXh0RGVjb2RlcnMgPSBuZXcgTWFwKFtcbiAgWyd1dGYtOCcsIHV0ZjhEZWNvZGVyXSxcbiAgWyd1dGY4JywgdXRmOERlY29kZXJdXG5dKVxuXG5mdW5jdGlvbiBnZXREZWNvZGVyIChjaGFyc2V0KSB7XG4gIGxldCBsY1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoY2hhcnNldCkge1xuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy51dGY4XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYXNjaWknOiAvLyBUT0RPOiBNYWtlIHRoZXNlIGEgc2VwYXJhdGUsIHN0cmljdCBkZWNvZGVyP1xuICAgICAgY2FzZSAndXMtYXNjaWknOlxuICAgICAgY2FzZSAnaXNvLTg4NTktMSc6XG4gICAgICBjYXNlICdpc284ODU5LTEnOlxuICAgICAgY2FzZSAnaXNvODg1OTEnOlxuICAgICAgY2FzZSAnaXNvXzg4NTktMSc6XG4gICAgICBjYXNlICd3aW5kb3dzLTEyNTInOlxuICAgICAgY2FzZSAnaXNvXzg4NTktMToxOTg3JzpcbiAgICAgIGNhc2UgJ2NwMTI1Mic6XG4gICAgICBjYXNlICd4LWNwMTI1Mic6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy5sYXRpbjFcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy51dGYxNmxlXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gZGVjb2RlcnMuYmFzZTY0XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobGMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxjID0gdHJ1ZVxuICAgICAgICAgIGNoYXJzZXQgPSBjaGFyc2V0LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWNvZGVycy5vdGhlci5iaW5kKGNoYXJzZXQpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGRlY29kZXJzID0ge1xuICB1dGY4OiAoZGF0YSwgc291cmNlRW5jb2RpbmcpID0+IHtcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkYXRhID0gQnVmZmVyLmZyb20oZGF0YSwgc291cmNlRW5jb2RpbmcpXG4gICAgfVxuICAgIHJldHVybiBkYXRhLnV0ZjhTbGljZSgwLCBkYXRhLmxlbmd0aClcbiAgfSxcblxuICBsYXRpbjE6IChkYXRhLCBzb3VyY2VFbmNvZGluZykgPT4ge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuICAgIHJldHVybiBkYXRhLmxhdGluMVNsaWNlKDAsIGRhdGEubGVuZ3RoKVxuICB9LFxuXG4gIHV0ZjE2bGU6IChkYXRhLCBzb3VyY2VFbmNvZGluZykgPT4ge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCBzb3VyY2VFbmNvZGluZylcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEudWNzMlNsaWNlKDAsIGRhdGEubGVuZ3RoKVxuICB9LFxuXG4gIGJhc2U2NDogKGRhdGEsIHNvdXJjZUVuY29kaW5nKSA9PiB7XG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsIHNvdXJjZUVuY29kaW5nKVxuICAgIH1cbiAgICByZXR1cm4gZGF0YS5iYXNlNjRTbGljZSgwLCBkYXRhLmxlbmd0aClcbiAgfSxcblxuICBvdGhlcjogKGRhdGEsIHNvdXJjZUVuY29kaW5nKSA9PiB7XG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsIHNvdXJjZUVuY29kaW5nKVxuICAgIH1cblxuICAgIGlmICh0ZXh0RGVjb2RlcnMuaGFzKHRoaXMudG9TdHJpbmcoKSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0ZXh0RGVjb2RlcnMuZ2V0KHRoaXMpLmRlY29kZShkYXRhKVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnXG4gICAgICA/IGRhdGFcbiAgICAgIDogZGF0YS50b1N0cmluZygpXG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlVGV4dCAodGV4dCwgc291cmNlRW5jb2RpbmcsIGRlc3RFbmNvZGluZykge1xuICBpZiAodGV4dCkge1xuICAgIHJldHVybiBnZXREZWNvZGVyKGRlc3RFbmNvZGluZykodGV4dCwgc291cmNlRW5jb2RpbmcpXG4gIH1cbiAgcmV0dXJuIHRleHRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWNvZGVUZXh0XG4iLAogICAgIi8qIGVzbGludC1kaXNhYmxlIG9iamVjdC1wcm9wZXJ0eS1uZXdsaW5lICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgZGVjb2RlVGV4dCA9IHJlcXVpcmUoJy4vZGVjb2RlVGV4dCcpXG5cbmNvbnN0IFJFX0VOQ09ERUQgPSAvJVthLWZBLUYwLTldW2EtZkEtRjAtOV0vZ1xuXG5jb25zdCBFbmNvZGVkTG9va3VwID0ge1xuICAnJTAwJzogJ1xceDAwJywgJyUwMSc6ICdcXHgwMScsICclMDInOiAnXFx4MDInLCAnJTAzJzogJ1xceDAzJywgJyUwNCc6ICdcXHgwNCcsXG4gICclMDUnOiAnXFx4MDUnLCAnJTA2JzogJ1xceDA2JywgJyUwNyc6ICdcXHgwNycsICclMDgnOiAnXFx4MDgnLCAnJTA5JzogJ1xceDA5JyxcbiAgJyUwYSc6ICdcXHgwYScsICclMEEnOiAnXFx4MGEnLCAnJTBiJzogJ1xceDBiJywgJyUwQic6ICdcXHgwYicsICclMGMnOiAnXFx4MGMnLFxuICAnJTBDJzogJ1xceDBjJywgJyUwZCc6ICdcXHgwZCcsICclMEQnOiAnXFx4MGQnLCAnJTBlJzogJ1xceDBlJywgJyUwRSc6ICdcXHgwZScsXG4gICclMGYnOiAnXFx4MGYnLCAnJTBGJzogJ1xceDBmJywgJyUxMCc6ICdcXHgxMCcsICclMTEnOiAnXFx4MTEnLCAnJTEyJzogJ1xceDEyJyxcbiAgJyUxMyc6ICdcXHgxMycsICclMTQnOiAnXFx4MTQnLCAnJTE1JzogJ1xceDE1JywgJyUxNic6ICdcXHgxNicsICclMTcnOiAnXFx4MTcnLFxuICAnJTE4JzogJ1xceDE4JywgJyUxOSc6ICdcXHgxOScsICclMWEnOiAnXFx4MWEnLCAnJTFBJzogJ1xceDFhJywgJyUxYic6ICdcXHgxYicsXG4gICclMUInOiAnXFx4MWInLCAnJTFjJzogJ1xceDFjJywgJyUxQyc6ICdcXHgxYycsICclMWQnOiAnXFx4MWQnLCAnJTFEJzogJ1xceDFkJyxcbiAgJyUxZSc6ICdcXHgxZScsICclMUUnOiAnXFx4MWUnLCAnJTFmJzogJ1xceDFmJywgJyUxRic6ICdcXHgxZicsICclMjAnOiAnXFx4MjAnLFxuICAnJTIxJzogJ1xceDIxJywgJyUyMic6ICdcXHgyMicsICclMjMnOiAnXFx4MjMnLCAnJTI0JzogJ1xceDI0JywgJyUyNSc6ICdcXHgyNScsXG4gICclMjYnOiAnXFx4MjYnLCAnJTI3JzogJ1xceDI3JywgJyUyOCc6ICdcXHgyOCcsICclMjknOiAnXFx4MjknLCAnJTJhJzogJ1xceDJhJyxcbiAgJyUyQSc6ICdcXHgyYScsICclMmInOiAnXFx4MmInLCAnJTJCJzogJ1xceDJiJywgJyUyYyc6ICdcXHgyYycsICclMkMnOiAnXFx4MmMnLFxuICAnJTJkJzogJ1xceDJkJywgJyUyRCc6ICdcXHgyZCcsICclMmUnOiAnXFx4MmUnLCAnJTJFJzogJ1xceDJlJywgJyUyZic6ICdcXHgyZicsXG4gICclMkYnOiAnXFx4MmYnLCAnJTMwJzogJ1xceDMwJywgJyUzMSc6ICdcXHgzMScsICclMzInOiAnXFx4MzInLCAnJTMzJzogJ1xceDMzJyxcbiAgJyUzNCc6ICdcXHgzNCcsICclMzUnOiAnXFx4MzUnLCAnJTM2JzogJ1xceDM2JywgJyUzNyc6ICdcXHgzNycsICclMzgnOiAnXFx4MzgnLFxuICAnJTM5JzogJ1xceDM5JywgJyUzYSc6ICdcXHgzYScsICclM0EnOiAnXFx4M2EnLCAnJTNiJzogJ1xceDNiJywgJyUzQic6ICdcXHgzYicsXG4gICclM2MnOiAnXFx4M2MnLCAnJTNDJzogJ1xceDNjJywgJyUzZCc6ICdcXHgzZCcsICclM0QnOiAnXFx4M2QnLCAnJTNlJzogJ1xceDNlJyxcbiAgJyUzRSc6ICdcXHgzZScsICclM2YnOiAnXFx4M2YnLCAnJTNGJzogJ1xceDNmJywgJyU0MCc6ICdcXHg0MCcsICclNDEnOiAnXFx4NDEnLFxuICAnJTQyJzogJ1xceDQyJywgJyU0Myc6ICdcXHg0MycsICclNDQnOiAnXFx4NDQnLCAnJTQ1JzogJ1xceDQ1JywgJyU0Nic6ICdcXHg0NicsXG4gICclNDcnOiAnXFx4NDcnLCAnJTQ4JzogJ1xceDQ4JywgJyU0OSc6ICdcXHg0OScsICclNGEnOiAnXFx4NGEnLCAnJTRBJzogJ1xceDRhJyxcbiAgJyU0Yic6ICdcXHg0YicsICclNEInOiAnXFx4NGInLCAnJTRjJzogJ1xceDRjJywgJyU0Qyc6ICdcXHg0YycsICclNGQnOiAnXFx4NGQnLFxuICAnJTREJzogJ1xceDRkJywgJyU0ZSc6ICdcXHg0ZScsICclNEUnOiAnXFx4NGUnLCAnJTRmJzogJ1xceDRmJywgJyU0Ric6ICdcXHg0ZicsXG4gICclNTAnOiAnXFx4NTAnLCAnJTUxJzogJ1xceDUxJywgJyU1Mic6ICdcXHg1MicsICclNTMnOiAnXFx4NTMnLCAnJTU0JzogJ1xceDU0JyxcbiAgJyU1NSc6ICdcXHg1NScsICclNTYnOiAnXFx4NTYnLCAnJTU3JzogJ1xceDU3JywgJyU1OCc6ICdcXHg1OCcsICclNTknOiAnXFx4NTknLFxuICAnJTVhJzogJ1xceDVhJywgJyU1QSc6ICdcXHg1YScsICclNWInOiAnXFx4NWInLCAnJTVCJzogJ1xceDViJywgJyU1Yyc6ICdcXHg1YycsXG4gICclNUMnOiAnXFx4NWMnLCAnJTVkJzogJ1xceDVkJywgJyU1RCc6ICdcXHg1ZCcsICclNWUnOiAnXFx4NWUnLCAnJTVFJzogJ1xceDVlJyxcbiAgJyU1Zic6ICdcXHg1ZicsICclNUYnOiAnXFx4NWYnLCAnJTYwJzogJ1xceDYwJywgJyU2MSc6ICdcXHg2MScsICclNjInOiAnXFx4NjInLFxuICAnJTYzJzogJ1xceDYzJywgJyU2NCc6ICdcXHg2NCcsICclNjUnOiAnXFx4NjUnLCAnJTY2JzogJ1xceDY2JywgJyU2Nyc6ICdcXHg2NycsXG4gICclNjgnOiAnXFx4NjgnLCAnJTY5JzogJ1xceDY5JywgJyU2YSc6ICdcXHg2YScsICclNkEnOiAnXFx4NmEnLCAnJTZiJzogJ1xceDZiJyxcbiAgJyU2Qic6ICdcXHg2YicsICclNmMnOiAnXFx4NmMnLCAnJTZDJzogJ1xceDZjJywgJyU2ZCc6ICdcXHg2ZCcsICclNkQnOiAnXFx4NmQnLFxuICAnJTZlJzogJ1xceDZlJywgJyU2RSc6ICdcXHg2ZScsICclNmYnOiAnXFx4NmYnLCAnJTZGJzogJ1xceDZmJywgJyU3MCc6ICdcXHg3MCcsXG4gICclNzEnOiAnXFx4NzEnLCAnJTcyJzogJ1xceDcyJywgJyU3Myc6ICdcXHg3MycsICclNzQnOiAnXFx4NzQnLCAnJTc1JzogJ1xceDc1JyxcbiAgJyU3Nic6ICdcXHg3NicsICclNzcnOiAnXFx4NzcnLCAnJTc4JzogJ1xceDc4JywgJyU3OSc6ICdcXHg3OScsICclN2EnOiAnXFx4N2EnLFxuICAnJTdBJzogJ1xceDdhJywgJyU3Yic6ICdcXHg3YicsICclN0InOiAnXFx4N2InLCAnJTdjJzogJ1xceDdjJywgJyU3Qyc6ICdcXHg3YycsXG4gICclN2QnOiAnXFx4N2QnLCAnJTdEJzogJ1xceDdkJywgJyU3ZSc6ICdcXHg3ZScsICclN0UnOiAnXFx4N2UnLCAnJTdmJzogJ1xceDdmJyxcbiAgJyU3Ric6ICdcXHg3ZicsICclODAnOiAnXFx4ODAnLCAnJTgxJzogJ1xceDgxJywgJyU4Mic6ICdcXHg4MicsICclODMnOiAnXFx4ODMnLFxuICAnJTg0JzogJ1xceDg0JywgJyU4NSc6ICdcXHg4NScsICclODYnOiAnXFx4ODYnLCAnJTg3JzogJ1xceDg3JywgJyU4OCc6ICdcXHg4OCcsXG4gICclODknOiAnXFx4ODknLCAnJThhJzogJ1xceDhhJywgJyU4QSc6ICdcXHg4YScsICclOGInOiAnXFx4OGInLCAnJThCJzogJ1xceDhiJyxcbiAgJyU4Yyc6ICdcXHg4YycsICclOEMnOiAnXFx4OGMnLCAnJThkJzogJ1xceDhkJywgJyU4RCc6ICdcXHg4ZCcsICclOGUnOiAnXFx4OGUnLFxuICAnJThFJzogJ1xceDhlJywgJyU4Zic6ICdcXHg4ZicsICclOEYnOiAnXFx4OGYnLCAnJTkwJzogJ1xceDkwJywgJyU5MSc6ICdcXHg5MScsXG4gICclOTInOiAnXFx4OTInLCAnJTkzJzogJ1xceDkzJywgJyU5NCc6ICdcXHg5NCcsICclOTUnOiAnXFx4OTUnLCAnJTk2JzogJ1xceDk2JyxcbiAgJyU5Nyc6ICdcXHg5NycsICclOTgnOiAnXFx4OTgnLCAnJTk5JzogJ1xceDk5JywgJyU5YSc6ICdcXHg5YScsICclOUEnOiAnXFx4OWEnLFxuICAnJTliJzogJ1xceDliJywgJyU5Qic6ICdcXHg5YicsICclOWMnOiAnXFx4OWMnLCAnJTlDJzogJ1xceDljJywgJyU5ZCc6ICdcXHg5ZCcsXG4gICclOUQnOiAnXFx4OWQnLCAnJTllJzogJ1xceDllJywgJyU5RSc6ICdcXHg5ZScsICclOWYnOiAnXFx4OWYnLCAnJTlGJzogJ1xceDlmJyxcbiAgJyVhMCc6ICdcXHhhMCcsICclQTAnOiAnXFx4YTAnLCAnJWExJzogJ1xceGExJywgJyVBMSc6ICdcXHhhMScsICclYTInOiAnXFx4YTInLFxuICAnJUEyJzogJ1xceGEyJywgJyVhMyc6ICdcXHhhMycsICclQTMnOiAnXFx4YTMnLCAnJWE0JzogJ1xceGE0JywgJyVBNCc6ICdcXHhhNCcsXG4gICclYTUnOiAnXFx4YTUnLCAnJUE1JzogJ1xceGE1JywgJyVhNic6ICdcXHhhNicsICclQTYnOiAnXFx4YTYnLCAnJWE3JzogJ1xceGE3JyxcbiAgJyVBNyc6ICdcXHhhNycsICclYTgnOiAnXFx4YTgnLCAnJUE4JzogJ1xceGE4JywgJyVhOSc6ICdcXHhhOScsICclQTknOiAnXFx4YTknLFxuICAnJWFhJzogJ1xceGFhJywgJyVBYSc6ICdcXHhhYScsICclYUEnOiAnXFx4YWEnLCAnJUFBJzogJ1xceGFhJywgJyVhYic6ICdcXHhhYicsXG4gICclQWInOiAnXFx4YWInLCAnJWFCJzogJ1xceGFiJywgJyVBQic6ICdcXHhhYicsICclYWMnOiAnXFx4YWMnLCAnJUFjJzogJ1xceGFjJyxcbiAgJyVhQyc6ICdcXHhhYycsICclQUMnOiAnXFx4YWMnLCAnJWFkJzogJ1xceGFkJywgJyVBZCc6ICdcXHhhZCcsICclYUQnOiAnXFx4YWQnLFxuICAnJUFEJzogJ1xceGFkJywgJyVhZSc6ICdcXHhhZScsICclQWUnOiAnXFx4YWUnLCAnJWFFJzogJ1xceGFlJywgJyVBRSc6ICdcXHhhZScsXG4gICclYWYnOiAnXFx4YWYnLCAnJUFmJzogJ1xceGFmJywgJyVhRic6ICdcXHhhZicsICclQUYnOiAnXFx4YWYnLCAnJWIwJzogJ1xceGIwJyxcbiAgJyVCMCc6ICdcXHhiMCcsICclYjEnOiAnXFx4YjEnLCAnJUIxJzogJ1xceGIxJywgJyViMic6ICdcXHhiMicsICclQjInOiAnXFx4YjInLFxuICAnJWIzJzogJ1xceGIzJywgJyVCMyc6ICdcXHhiMycsICclYjQnOiAnXFx4YjQnLCAnJUI0JzogJ1xceGI0JywgJyViNSc6ICdcXHhiNScsXG4gICclQjUnOiAnXFx4YjUnLCAnJWI2JzogJ1xceGI2JywgJyVCNic6ICdcXHhiNicsICclYjcnOiAnXFx4YjcnLCAnJUI3JzogJ1xceGI3JyxcbiAgJyViOCc6ICdcXHhiOCcsICclQjgnOiAnXFx4YjgnLCAnJWI5JzogJ1xceGI5JywgJyVCOSc6ICdcXHhiOScsICclYmEnOiAnXFx4YmEnLFxuICAnJUJhJzogJ1xceGJhJywgJyViQSc6ICdcXHhiYScsICclQkEnOiAnXFx4YmEnLCAnJWJiJzogJ1xceGJiJywgJyVCYic6ICdcXHhiYicsXG4gICclYkInOiAnXFx4YmInLCAnJUJCJzogJ1xceGJiJywgJyViYyc6ICdcXHhiYycsICclQmMnOiAnXFx4YmMnLCAnJWJDJzogJ1xceGJjJyxcbiAgJyVCQyc6ICdcXHhiYycsICclYmQnOiAnXFx4YmQnLCAnJUJkJzogJ1xceGJkJywgJyViRCc6ICdcXHhiZCcsICclQkQnOiAnXFx4YmQnLFxuICAnJWJlJzogJ1xceGJlJywgJyVCZSc6ICdcXHhiZScsICclYkUnOiAnXFx4YmUnLCAnJUJFJzogJ1xceGJlJywgJyViZic6ICdcXHhiZicsXG4gICclQmYnOiAnXFx4YmYnLCAnJWJGJzogJ1xceGJmJywgJyVCRic6ICdcXHhiZicsICclYzAnOiAnXFx4YzAnLCAnJUMwJzogJ1xceGMwJyxcbiAgJyVjMSc6ICdcXHhjMScsICclQzEnOiAnXFx4YzEnLCAnJWMyJzogJ1xceGMyJywgJyVDMic6ICdcXHhjMicsICclYzMnOiAnXFx4YzMnLFxuICAnJUMzJzogJ1xceGMzJywgJyVjNCc6ICdcXHhjNCcsICclQzQnOiAnXFx4YzQnLCAnJWM1JzogJ1xceGM1JywgJyVDNSc6ICdcXHhjNScsXG4gICclYzYnOiAnXFx4YzYnLCAnJUM2JzogJ1xceGM2JywgJyVjNyc6ICdcXHhjNycsICclQzcnOiAnXFx4YzcnLCAnJWM4JzogJ1xceGM4JyxcbiAgJyVDOCc6ICdcXHhjOCcsICclYzknOiAnXFx4YzknLCAnJUM5JzogJ1xceGM5JywgJyVjYSc6ICdcXHhjYScsICclQ2EnOiAnXFx4Y2EnLFxuICAnJWNBJzogJ1xceGNhJywgJyVDQSc6ICdcXHhjYScsICclY2InOiAnXFx4Y2InLCAnJUNiJzogJ1xceGNiJywgJyVjQic6ICdcXHhjYicsXG4gICclQ0InOiAnXFx4Y2InLCAnJWNjJzogJ1xceGNjJywgJyVDYyc6ICdcXHhjYycsICclY0MnOiAnXFx4Y2MnLCAnJUNDJzogJ1xceGNjJyxcbiAgJyVjZCc6ICdcXHhjZCcsICclQ2QnOiAnXFx4Y2QnLCAnJWNEJzogJ1xceGNkJywgJyVDRCc6ICdcXHhjZCcsICclY2UnOiAnXFx4Y2UnLFxuICAnJUNlJzogJ1xceGNlJywgJyVjRSc6ICdcXHhjZScsICclQ0UnOiAnXFx4Y2UnLCAnJWNmJzogJ1xceGNmJywgJyVDZic6ICdcXHhjZicsXG4gICclY0YnOiAnXFx4Y2YnLCAnJUNGJzogJ1xceGNmJywgJyVkMCc6ICdcXHhkMCcsICclRDAnOiAnXFx4ZDAnLCAnJWQxJzogJ1xceGQxJyxcbiAgJyVEMSc6ICdcXHhkMScsICclZDInOiAnXFx4ZDInLCAnJUQyJzogJ1xceGQyJywgJyVkMyc6ICdcXHhkMycsICclRDMnOiAnXFx4ZDMnLFxuICAnJWQ0JzogJ1xceGQ0JywgJyVENCc6ICdcXHhkNCcsICclZDUnOiAnXFx4ZDUnLCAnJUQ1JzogJ1xceGQ1JywgJyVkNic6ICdcXHhkNicsXG4gICclRDYnOiAnXFx4ZDYnLCAnJWQ3JzogJ1xceGQ3JywgJyVENyc6ICdcXHhkNycsICclZDgnOiAnXFx4ZDgnLCAnJUQ4JzogJ1xceGQ4JyxcbiAgJyVkOSc6ICdcXHhkOScsICclRDknOiAnXFx4ZDknLCAnJWRhJzogJ1xceGRhJywgJyVEYSc6ICdcXHhkYScsICclZEEnOiAnXFx4ZGEnLFxuICAnJURBJzogJ1xceGRhJywgJyVkYic6ICdcXHhkYicsICclRGInOiAnXFx4ZGInLCAnJWRCJzogJ1xceGRiJywgJyVEQic6ICdcXHhkYicsXG4gICclZGMnOiAnXFx4ZGMnLCAnJURjJzogJ1xceGRjJywgJyVkQyc6ICdcXHhkYycsICclREMnOiAnXFx4ZGMnLCAnJWRkJzogJ1xceGRkJyxcbiAgJyVEZCc6ICdcXHhkZCcsICclZEQnOiAnXFx4ZGQnLCAnJUREJzogJ1xceGRkJywgJyVkZSc6ICdcXHhkZScsICclRGUnOiAnXFx4ZGUnLFxuICAnJWRFJzogJ1xceGRlJywgJyVERSc6ICdcXHhkZScsICclZGYnOiAnXFx4ZGYnLCAnJURmJzogJ1xceGRmJywgJyVkRic6ICdcXHhkZicsXG4gICclREYnOiAnXFx4ZGYnLCAnJWUwJzogJ1xceGUwJywgJyVFMCc6ICdcXHhlMCcsICclZTEnOiAnXFx4ZTEnLCAnJUUxJzogJ1xceGUxJyxcbiAgJyVlMic6ICdcXHhlMicsICclRTInOiAnXFx4ZTInLCAnJWUzJzogJ1xceGUzJywgJyVFMyc6ICdcXHhlMycsICclZTQnOiAnXFx4ZTQnLFxuICAnJUU0JzogJ1xceGU0JywgJyVlNSc6ICdcXHhlNScsICclRTUnOiAnXFx4ZTUnLCAnJWU2JzogJ1xceGU2JywgJyVFNic6ICdcXHhlNicsXG4gICclZTcnOiAnXFx4ZTcnLCAnJUU3JzogJ1xceGU3JywgJyVlOCc6ICdcXHhlOCcsICclRTgnOiAnXFx4ZTgnLCAnJWU5JzogJ1xceGU5JyxcbiAgJyVFOSc6ICdcXHhlOScsICclZWEnOiAnXFx4ZWEnLCAnJUVhJzogJ1xceGVhJywgJyVlQSc6ICdcXHhlYScsICclRUEnOiAnXFx4ZWEnLFxuICAnJWViJzogJ1xceGViJywgJyVFYic6ICdcXHhlYicsICclZUInOiAnXFx4ZWInLCAnJUVCJzogJ1xceGViJywgJyVlYyc6ICdcXHhlYycsXG4gICclRWMnOiAnXFx4ZWMnLCAnJWVDJzogJ1xceGVjJywgJyVFQyc6ICdcXHhlYycsICclZWQnOiAnXFx4ZWQnLCAnJUVkJzogJ1xceGVkJyxcbiAgJyVlRCc6ICdcXHhlZCcsICclRUQnOiAnXFx4ZWQnLCAnJWVlJzogJ1xceGVlJywgJyVFZSc6ICdcXHhlZScsICclZUUnOiAnXFx4ZWUnLFxuICAnJUVFJzogJ1xceGVlJywgJyVlZic6ICdcXHhlZicsICclRWYnOiAnXFx4ZWYnLCAnJWVGJzogJ1xceGVmJywgJyVFRic6ICdcXHhlZicsXG4gICclZjAnOiAnXFx4ZjAnLCAnJUYwJzogJ1xceGYwJywgJyVmMSc6ICdcXHhmMScsICclRjEnOiAnXFx4ZjEnLCAnJWYyJzogJ1xceGYyJyxcbiAgJyVGMic6ICdcXHhmMicsICclZjMnOiAnXFx4ZjMnLCAnJUYzJzogJ1xceGYzJywgJyVmNCc6ICdcXHhmNCcsICclRjQnOiAnXFx4ZjQnLFxuICAnJWY1JzogJ1xceGY1JywgJyVGNSc6ICdcXHhmNScsICclZjYnOiAnXFx4ZjYnLCAnJUY2JzogJ1xceGY2JywgJyVmNyc6ICdcXHhmNycsXG4gICclRjcnOiAnXFx4ZjcnLCAnJWY4JzogJ1xceGY4JywgJyVGOCc6ICdcXHhmOCcsICclZjknOiAnXFx4ZjknLCAnJUY5JzogJ1xceGY5JyxcbiAgJyVmYSc6ICdcXHhmYScsICclRmEnOiAnXFx4ZmEnLCAnJWZBJzogJ1xceGZhJywgJyVGQSc6ICdcXHhmYScsICclZmInOiAnXFx4ZmInLFxuICAnJUZiJzogJ1xceGZiJywgJyVmQic6ICdcXHhmYicsICclRkInOiAnXFx4ZmInLCAnJWZjJzogJ1xceGZjJywgJyVGYyc6ICdcXHhmYycsXG4gICclZkMnOiAnXFx4ZmMnLCAnJUZDJzogJ1xceGZjJywgJyVmZCc6ICdcXHhmZCcsICclRmQnOiAnXFx4ZmQnLCAnJWZEJzogJ1xceGZkJyxcbiAgJyVGRCc6ICdcXHhmZCcsICclZmUnOiAnXFx4ZmUnLCAnJUZlJzogJ1xceGZlJywgJyVmRSc6ICdcXHhmZScsICclRkUnOiAnXFx4ZmUnLFxuICAnJWZmJzogJ1xceGZmJywgJyVGZic6ICdcXHhmZicsICclZkYnOiAnXFx4ZmYnLCAnJUZGJzogJ1xceGZmJ1xufVxuXG5mdW5jdGlvbiBlbmNvZGVkUmVwbGFjZXIgKG1hdGNoKSB7XG4gIHJldHVybiBFbmNvZGVkTG9va3VwW21hdGNoXVxufVxuXG5jb25zdCBTVEFURV9LRVkgPSAwXG5jb25zdCBTVEFURV9WQUxVRSA9IDFcbmNvbnN0IFNUQVRFX0NIQVJTRVQgPSAyXG5jb25zdCBTVEFURV9MQU5HID0gM1xuXG5mdW5jdGlvbiBwYXJzZVBhcmFtcyAoc3RyKSB7XG4gIGNvbnN0IHJlcyA9IFtdXG4gIGxldCBzdGF0ZSA9IFNUQVRFX0tFWVxuICBsZXQgY2hhcnNldCA9ICcnXG4gIGxldCBpbnF1b3RlID0gZmFsc2VcbiAgbGV0IGVzY2FwaW5nID0gZmFsc2VcbiAgbGV0IHAgPSAwXG4gIGxldCB0bXAgPSAnJ1xuICBjb25zdCBsZW4gPSBzdHIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXZhclxuICAgIGNvbnN0IGNoYXIgPSBzdHJbaV1cbiAgICBpZiAoY2hhciA9PT0gJ1xcXFwnICYmIGlucXVvdGUpIHtcbiAgICAgIGlmIChlc2NhcGluZykgeyBlc2NhcGluZyA9IGZhbHNlIH0gZWxzZSB7XG4gICAgICAgIGVzY2FwaW5nID0gdHJ1ZVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgaWYgKCFlc2NhcGluZykge1xuICAgICAgICBpZiAoaW5xdW90ZSkge1xuICAgICAgICAgIGlucXVvdGUgPSBmYWxzZVxuICAgICAgICAgIHN0YXRlID0gU1RBVEVfS0VZXG4gICAgICAgIH0gZWxzZSB7IGlucXVvdGUgPSB0cnVlIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7IGVzY2FwaW5nID0gZmFsc2UgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXNjYXBpbmcgJiYgaW5xdW90ZSkgeyB0bXAgKz0gJ1xcXFwnIH1cbiAgICAgIGVzY2FwaW5nID0gZmFsc2VcbiAgICAgIGlmICgoc3RhdGUgPT09IFNUQVRFX0NIQVJTRVQgfHwgc3RhdGUgPT09IFNUQVRFX0xBTkcpICYmIGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEVfQ0hBUlNFVCkge1xuICAgICAgICAgIHN0YXRlID0gU1RBVEVfTEFOR1xuICAgICAgICAgIGNoYXJzZXQgPSB0bXAuc3Vic3RyaW5nKDEpXG4gICAgICAgIH0gZWxzZSB7IHN0YXRlID0gU1RBVEVfVkFMVUUgfVxuICAgICAgICB0bXAgPSAnJ1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEVfS0VZICYmXG4gICAgICAgIChjaGFyID09PSAnKicgfHwgY2hhciA9PT0gJz0nKSAmJlxuICAgICAgICByZXMubGVuZ3RoKSB7XG4gICAgICAgIHN0YXRlID0gY2hhciA9PT0gJyonXG4gICAgICAgICAgPyBTVEFURV9DSEFSU0VUXG4gICAgICAgICAgOiBTVEFURV9WQUxVRVxuICAgICAgICByZXNbcF0gPSBbdG1wLCB1bmRlZmluZWRdXG4gICAgICAgIHRtcCA9ICcnXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKCFpbnF1b3RlICYmIGNoYXIgPT09ICc7Jykge1xuICAgICAgICBzdGF0ZSA9IFNUQVRFX0tFWVxuICAgICAgICBpZiAoY2hhcnNldCkge1xuICAgICAgICAgIGlmICh0bXAubGVuZ3RoKSB7XG4gICAgICAgICAgICB0bXAgPSBkZWNvZGVUZXh0KHRtcC5yZXBsYWNlKFJFX0VOQ09ERUQsIGVuY29kZWRSZXBsYWNlciksXG4gICAgICAgICAgICAgICdiaW5hcnknLFxuICAgICAgICAgICAgICBjaGFyc2V0KVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGFyc2V0ID0gJydcbiAgICAgICAgfSBlbHNlIGlmICh0bXAubGVuZ3RoKSB7XG4gICAgICAgICAgdG1wID0gZGVjb2RlVGV4dCh0bXAsICdiaW5hcnknLCAndXRmOCcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc1twXSA9PT0gdW5kZWZpbmVkKSB7IHJlc1twXSA9IHRtcCB9IGVsc2UgeyByZXNbcF1bMV0gPSB0bXAgfVxuICAgICAgICB0bXAgPSAnJ1xuICAgICAgICArK3BcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoIWlucXVvdGUgJiYgKGNoYXIgPT09ICcgJyB8fCBjaGFyID09PSAnXFx0JykpIHsgY29udGludWUgfVxuICAgIH1cbiAgICB0bXAgKz0gY2hhclxuICB9XG4gIGlmIChjaGFyc2V0ICYmIHRtcC5sZW5ndGgpIHtcbiAgICB0bXAgPSBkZWNvZGVUZXh0KHRtcC5yZXBsYWNlKFJFX0VOQ09ERUQsIGVuY29kZWRSZXBsYWNlciksXG4gICAgICAnYmluYXJ5JyxcbiAgICAgIGNoYXJzZXQpXG4gIH0gZWxzZSBpZiAodG1wKSB7XG4gICAgdG1wID0gZGVjb2RlVGV4dCh0bXAsICdiaW5hcnknLCAndXRmOCcpXG4gIH1cblxuICBpZiAocmVzW3BdID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodG1wKSB7IHJlc1twXSA9IHRtcCB9XG4gIH0gZWxzZSB7IHJlc1twXVsxXSA9IHRtcCB9XG5cbiAgcmV0dXJuIHJlc1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlUGFyYW1zXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJhc2VuYW1lIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHsgcmV0dXJuICcnIH1cbiAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby12YXJcbiAgICBzd2l0Y2ggKHBhdGguY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSAweDJGOiAvLyAnLydcbiAgICAgIGNhc2UgMHg1QzogLy8gJ1xcJ1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZShpICsgMSlcbiAgICAgICAgcmV0dXJuIChwYXRoID09PSAnLi4nIHx8IHBhdGggPT09ICcuJyA/ICcnIDogcGF0aClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChwYXRoID09PSAnLi4nIHx8IHBhdGggPT09ICcuJyA/ICcnIDogcGF0aClcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIFRPRE86XG4vLyAgKiBzdXBwb3J0IDEgbmVzdGVkIG11bHRpcGFydCBsZXZlbFxuLy8gICAgKHNlZSBzZWNvbmQgbXVsdGlwYXJ0IGV4YW1wbGUgaGVyZTpcbi8vICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjZGlkeC1tdWx0aXBhcnRmb3JtLWRhdGEpXG4vLyAgKiBzdXBwb3J0IGxpbWl0cy5maWVsZE5hbWVTaXplXG4vLyAgICAgLS0gdGhpcyB3aWxsIHJlcXVpcmUgbW9kaWZpY2F0aW9ucyB0byB1dGlscy5wYXJzZVBhcmFtc1xuXG5jb25zdCB7IFJlYWRhYmxlIH0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCB7IGluaGVyaXRzIH0gPSByZXF1aXJlKCdub2RlOnV0aWwnKVxuXG5jb25zdCBEaWNlciA9IHJlcXVpcmUoJy4uLy4uL2RlcHMvZGljZXIvbGliL0RpY2VyJylcblxuY29uc3QgcGFyc2VQYXJhbXMgPSByZXF1aXJlKCcuLi91dGlscy9wYXJzZVBhcmFtcycpXG5jb25zdCBkZWNvZGVUZXh0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZGVjb2RlVGV4dCcpXG5jb25zdCBiYXNlbmFtZSA9IHJlcXVpcmUoJy4uL3V0aWxzL2Jhc2VuYW1lJylcbmNvbnN0IGdldExpbWl0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0TGltaXQnKVxuXG5jb25zdCBSRV9CT1VOREFSWSA9IC9eYm91bmRhcnkkL2lcbmNvbnN0IFJFX0ZJRUxEID0gL15mb3JtLWRhdGEkL2lcbmNvbnN0IFJFX0NIQVJTRVQgPSAvXmNoYXJzZXQkL2lcbmNvbnN0IFJFX0ZJTEVOQU1FID0gL15maWxlbmFtZSQvaVxuY29uc3QgUkVfTkFNRSA9IC9ebmFtZSQvaVxuXG5NdWx0aXBhcnQuZGV0ZWN0ID0gL15tdWx0aXBhcnRcXC9mb3JtLWRhdGEvaVxuZnVuY3Rpb24gTXVsdGlwYXJ0IChib3ksIGNmZykge1xuICBsZXQgaVxuICBsZXQgbGVuXG4gIGNvbnN0IHNlbGYgPSB0aGlzXG4gIGxldCBib3VuZGFyeVxuICBjb25zdCBsaW1pdHMgPSBjZmcubGltaXRzXG4gIGNvbnN0IGlzUGFydEFGaWxlID0gY2ZnLmlzUGFydEFGaWxlIHx8ICgoZmllbGROYW1lLCBjb250ZW50VHlwZSwgZmlsZU5hbWUpID0+IChjb250ZW50VHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfHwgZmlsZU5hbWUgIT09IHVuZGVmaW5lZCkpXG4gIGNvbnN0IHBhcnNlZENvblR5cGUgPSBjZmcucGFyc2VkQ29uVHlwZSB8fCBbXVxuICBjb25zdCBkZWZDaGFyc2V0ID0gY2ZnLmRlZkNoYXJzZXQgfHwgJ3V0ZjgnXG4gIGNvbnN0IHByZXNlcnZlUGF0aCA9IGNmZy5wcmVzZXJ2ZVBhdGhcbiAgY29uc3QgZmlsZU9wdHMgPSB7IGhpZ2hXYXRlck1hcms6IGNmZy5maWxlSHdtIH1cblxuICBmb3IgKGkgPSAwLCBsZW4gPSBwYXJzZWRDb25UeXBlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkQ29uVHlwZVtpXSkgJiZcbiAgICAgIFJFX0JPVU5EQVJZLnRlc3QocGFyc2VkQ29uVHlwZVtpXVswXSkpIHtcbiAgICAgIGJvdW5kYXJ5ID0gcGFyc2VkQ29uVHlwZVtpXVsxXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0ZpbmlzaGVkICgpIHtcbiAgICBpZiAobmVuZHMgPT09IDAgJiYgZmluaXNoZWQgJiYgIWJveS5fZG9uZSkge1xuICAgICAgZmluaXNoZWQgPSBmYWxzZVxuICAgICAgc2VsZi5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgYm91bmRhcnkgIT09ICdzdHJpbmcnKSB7IHRocm93IG5ldyBFcnJvcignTXVsdGlwYXJ0OiBCb3VuZGFyeSBub3QgZm91bmQnKSB9XG5cbiAgY29uc3QgZmllbGRTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZFNpemUnLCAxICogMTAyNCAqIDEwMjQpXG4gIGNvbnN0IGZpbGVTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWxlU2l6ZScsIEluZmluaXR5KVxuICBjb25zdCBmaWxlc0xpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmlsZXMnLCBJbmZpbml0eSlcbiAgY29uc3QgZmllbGRzTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZHMnLCBJbmZpbml0eSlcbiAgY29uc3QgcGFydHNMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ3BhcnRzJywgSW5maW5pdHkpXG4gIGNvbnN0IGhlYWRlclBhaXJzTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdoZWFkZXJQYWlycycsIDIwMDApXG4gIGNvbnN0IGhlYWRlclNpemVMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ2hlYWRlclNpemUnLCA4MCAqIDEwMjQpXG5cbiAgbGV0IG5maWxlcyA9IDBcbiAgbGV0IG5maWVsZHMgPSAwXG4gIGxldCBuZW5kcyA9IDBcbiAgbGV0IGN1ckZpbGVcbiAgbGV0IGN1ckZpZWxkXG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlXG5cbiAgdGhpcy5fbmVlZERyYWluID0gZmFsc2VcbiAgdGhpcy5fcGF1c2UgPSBmYWxzZVxuICB0aGlzLl9jYiA9IHVuZGVmaW5lZFxuICB0aGlzLl9ucGFydHMgPSAwXG4gIHRoaXMuX2JveSA9IGJveVxuXG4gIGNvbnN0IHBhcnNlckNmZyA9IHtcbiAgICBib3VuZGFyeSxcbiAgICBtYXhIZWFkZXJQYWlyczogaGVhZGVyUGFpcnNMaW1pdCxcbiAgICBtYXhIZWFkZXJTaXplOiBoZWFkZXJTaXplTGltaXQsXG4gICAgcGFydEh3bTogZmlsZU9wdHMuaGlnaFdhdGVyTWFyayxcbiAgICBoaWdoV2F0ZXJNYXJrOiBjZmcuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgdGhpcy5wYXJzZXIgPSBuZXcgRGljZXIocGFyc2VyQ2ZnKVxuICB0aGlzLnBhcnNlci5vbignZHJhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5fbmVlZERyYWluID0gZmFsc2VcbiAgICBpZiAoc2VsZi5fY2IgJiYgIXNlbGYuX3BhdXNlKSB7XG4gICAgICBjb25zdCBjYiA9IHNlbGYuX2NiXG4gICAgICBzZWxmLl9jYiA9IHVuZGVmaW5lZFxuICAgICAgY2IoKVxuICAgIH1cbiAgfSkub24oJ3BhcnQnLCBmdW5jdGlvbiBvblBhcnQgKHBhcnQpIHtcbiAgICBpZiAoKytzZWxmLl9ucGFydHMgPiBwYXJ0c0xpbWl0KSB7XG4gICAgICBzZWxmLnBhcnNlci5yZW1vdmVMaXN0ZW5lcigncGFydCcsIG9uUGFydClcbiAgICAgIHNlbGYucGFyc2VyLm9uKCdwYXJ0Jywgc2tpcFBhcnQpXG4gICAgICBib3kuaGl0UGFydHNMaW1pdCA9IHRydWVcbiAgICAgIGJveS5lbWl0KCdwYXJ0c0xpbWl0JylcbiAgICAgIHJldHVybiBza2lwUGFydChwYXJ0KVxuICAgIH1cblxuICAgIC8vIGhhY2sgYmVjYXVzZSBzdHJlYW1zMiBfYWx3YXlzXyBkb2Vzbid0IGVtaXQgJ2VuZCcgdW50aWwgbmV4dFRpY2ssIHNvIGxldFxuICAgIC8vIHVzIGVtaXQgJ2VuZCcgZWFybHkgc2luY2Ugd2Uga25vdyB0aGUgcGFydCBoYXMgZW5kZWQgaWYgd2UgYXJlIGFscmVhZHlcbiAgICAvLyBzZWVpbmcgdGhlIG5leHQgcGFydFxuICAgIGlmIChjdXJGaWVsZCkge1xuICAgICAgY29uc3QgZmllbGQgPSBjdXJGaWVsZFxuICAgICAgZmllbGQuZW1pdCgnZW5kJylcbiAgICAgIGZpZWxkLnJlbW92ZUFsbExpc3RlbmVycygnZW5kJylcbiAgICB9XG5cbiAgICBwYXJ0Lm9uKCdoZWFkZXInLCBmdW5jdGlvbiAoaGVhZGVyKSB7XG4gICAgICBsZXQgY29udHlwZVxuICAgICAgbGV0IGZpZWxkbmFtZVxuICAgICAgbGV0IHBhcnNlZFxuICAgICAgbGV0IGNoYXJzZXRcbiAgICAgIGxldCBlbmNvZGluZ1xuICAgICAgbGV0IGZpbGVuYW1lXG4gICAgICBsZXQgbnNpemUgPSAwXG5cbiAgICAgIGlmIChoZWFkZXJbJ2NvbnRlbnQtdHlwZSddKSB7XG4gICAgICAgIHBhcnNlZCA9IHBhcnNlUGFyYW1zKGhlYWRlclsnY29udGVudC10eXBlJ11bMF0pXG4gICAgICAgIGlmIChwYXJzZWRbMF0pIHtcbiAgICAgICAgICBjb250eXBlID0gcGFyc2VkWzBdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwYXJzZWQubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChSRV9DSEFSU0VULnRlc3QocGFyc2VkW2ldWzBdKSkge1xuICAgICAgICAgICAgICBjaGFyc2V0ID0gcGFyc2VkW2ldWzFdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnR5cGUgPT09IHVuZGVmaW5lZCkgeyBjb250eXBlID0gJ3RleHQvcGxhaW4nIH1cbiAgICAgIGlmIChjaGFyc2V0ID09PSB1bmRlZmluZWQpIHsgY2hhcnNldCA9IGRlZkNoYXJzZXQgfVxuXG4gICAgICBpZiAoaGVhZGVyWydjb250ZW50LWRpc3Bvc2l0aW9uJ10pIHtcbiAgICAgICAgcGFyc2VkID0gcGFyc2VQYXJhbXMoaGVhZGVyWydjb250ZW50LWRpc3Bvc2l0aW9uJ11bMF0pXG4gICAgICAgIGlmICghUkVfRklFTEQudGVzdChwYXJzZWRbMF0pKSB7IHJldHVybiBza2lwUGFydChwYXJ0KSB9XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHBhcnNlZC5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgIGlmIChSRV9OQU1FLnRlc3QocGFyc2VkW2ldWzBdKSkge1xuICAgICAgICAgICAgZmllbGRuYW1lID0gcGFyc2VkW2ldWzFdXG4gICAgICAgICAgfSBlbHNlIGlmIChSRV9GSUxFTkFNRS50ZXN0KHBhcnNlZFtpXVswXSkpIHtcbiAgICAgICAgICAgIGZpbGVuYW1lID0gcGFyc2VkW2ldWzFdXG4gICAgICAgICAgICBpZiAoIXByZXNlcnZlUGF0aCkgeyBmaWxlbmFtZSA9IGJhc2VuYW1lKGZpbGVuYW1lKSB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyByZXR1cm4gc2tpcFBhcnQocGFydCkgfVxuXG4gICAgICBpZiAoaGVhZGVyWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10pIHsgZW5jb2RpbmcgPSBoZWFkZXJbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXVswXS50b0xvd2VyQ2FzZSgpIH0gZWxzZSB7IGVuY29kaW5nID0gJzdiaXQnIH1cblxuICAgICAgbGV0IG9uRGF0YSxcbiAgICAgICAgb25FbmRcblxuICAgICAgaWYgKGlzUGFydEFGaWxlKGZpZWxkbmFtZSwgY29udHlwZSwgZmlsZW5hbWUpKSB7XG4gICAgICAgIC8vIGZpbGUvYmluYXJ5IGZpZWxkXG4gICAgICAgIGlmIChuZmlsZXMgPT09IGZpbGVzTGltaXQpIHtcbiAgICAgICAgICBpZiAoIWJveS5oaXRGaWxlc0xpbWl0KSB7XG4gICAgICAgICAgICBib3kuaGl0RmlsZXNMaW1pdCA9IHRydWVcbiAgICAgICAgICAgIGJveS5lbWl0KCdmaWxlc0xpbWl0JylcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNraXBQYXJ0KHBhcnQpXG4gICAgICAgIH1cblxuICAgICAgICArK25maWxlc1xuXG4gICAgICAgIGlmIChib3kubGlzdGVuZXJDb3VudCgnZmlsZScpID09PSAwKSB7XG4gICAgICAgICAgc2VsZi5wYXJzZXIuX2lnbm9yZSgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICArK25lbmRzXG4gICAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZVN0cmVhbShmaWxlT3B0cylcbiAgICAgICAgY3VyRmlsZSA9IGZpbGVcbiAgICAgICAgZmlsZS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC0tbmVuZHNcbiAgICAgICAgICBzZWxmLl9wYXVzZSA9IGZhbHNlXG4gICAgICAgICAgY2hlY2tGaW5pc2hlZCgpXG4gICAgICAgICAgaWYgKHNlbGYuX2NiICYmICFzZWxmLl9uZWVkRHJhaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGNiID0gc2VsZi5fY2JcbiAgICAgICAgICAgIHNlbGYuX2NiID0gdW5kZWZpbmVkXG4gICAgICAgICAgICBjYigpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBmaWxlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICBpZiAoIXNlbGYuX3BhdXNlKSB7IHJldHVybiB9XG4gICAgICAgICAgc2VsZi5fcGF1c2UgPSBmYWxzZVxuICAgICAgICAgIGlmIChzZWxmLl9jYiAmJiAhc2VsZi5fbmVlZERyYWluKSB7XG4gICAgICAgICAgICBjb25zdCBjYiA9IHNlbGYuX2NiXG4gICAgICAgICAgICBzZWxmLl9jYiA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgY2IoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBib3kuZW1pdCgnZmlsZScsIGZpZWxkbmFtZSwgZmlsZSwgZmlsZW5hbWUsIGVuY29kaW5nLCBjb250eXBlKVxuXG4gICAgICAgIG9uRGF0YSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgaWYgKChuc2l6ZSArPSBkYXRhLmxlbmd0aCkgPiBmaWxlU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYWxlbiA9IGZpbGVTaXplTGltaXQgLSBuc2l6ZSArIGRhdGEubGVuZ3RoXG4gICAgICAgICAgICBpZiAoZXh0cmFsZW4gPiAwKSB7IGZpbGUucHVzaChkYXRhLnNsaWNlKDAsIGV4dHJhbGVuKSkgfVxuICAgICAgICAgICAgZmlsZS50cnVuY2F0ZWQgPSB0cnVlXG4gICAgICAgICAgICBmaWxlLmJ5dGVzUmVhZCA9IGZpbGVTaXplTGltaXRcbiAgICAgICAgICAgIHBhcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJylcbiAgICAgICAgICAgIGZpbGUuZW1pdCgnbGltaXQnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfSBlbHNlIGlmICghZmlsZS5wdXNoKGRhdGEpKSB7IHNlbGYuX3BhdXNlID0gdHJ1ZSB9XG5cbiAgICAgICAgICBmaWxlLmJ5dGVzUmVhZCA9IG5zaXplXG4gICAgICAgIH1cblxuICAgICAgICBvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjdXJGaWxlID0gdW5kZWZpbmVkXG4gICAgICAgICAgZmlsZS5wdXNoKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vbi1maWxlIGZpZWxkXG4gICAgICAgIGlmIChuZmllbGRzID09PSBmaWVsZHNMaW1pdCkge1xuICAgICAgICAgIGlmICghYm95LmhpdEZpZWxkc0xpbWl0KSB7XG4gICAgICAgICAgICBib3kuaGl0RmllbGRzTGltaXQgPSB0cnVlXG4gICAgICAgICAgICBib3kuZW1pdCgnZmllbGRzTGltaXQnKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2tpcFBhcnQocGFydClcbiAgICAgICAgfVxuXG4gICAgICAgICsrbmZpZWxkc1xuICAgICAgICArK25lbmRzXG4gICAgICAgIGxldCBidWZmZXIgPSAnJ1xuICAgICAgICBsZXQgdHJ1bmNhdGVkID0gZmFsc2VcbiAgICAgICAgY3VyRmllbGQgPSBwYXJ0XG5cbiAgICAgICAgb25EYXRhID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICBpZiAoKG5zaXplICs9IGRhdGEubGVuZ3RoKSA+IGZpZWxkU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYWxlbiA9IChmaWVsZFNpemVMaW1pdCAtIChuc2l6ZSAtIGRhdGEubGVuZ3RoKSlcbiAgICAgICAgICAgIGJ1ZmZlciArPSBkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCAwLCBleHRyYWxlbilcbiAgICAgICAgICAgIHRydW5jYXRlZCA9IHRydWVcbiAgICAgICAgICAgIHBhcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJylcbiAgICAgICAgICB9IGVsc2UgeyBidWZmZXIgKz0gZGF0YS50b1N0cmluZygnYmluYXJ5JykgfVxuICAgICAgICB9XG5cbiAgICAgICAgb25FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY3VyRmllbGQgPSB1bmRlZmluZWRcbiAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCkgeyBidWZmZXIgPSBkZWNvZGVUZXh0KGJ1ZmZlciwgJ2JpbmFyeScsIGNoYXJzZXQpIH1cbiAgICAgICAgICBib3kuZW1pdCgnZmllbGQnLCBmaWVsZG5hbWUsIGJ1ZmZlciwgZmFsc2UsIHRydW5jYXRlZCwgZW5jb2RpbmcsIGNvbnR5cGUpXG4gICAgICAgICAgLS1uZW5kc1xuICAgICAgICAgIGNoZWNrRmluaXNoZWQoKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIEFzIG9mIG5vZGVAMmVmZTRhYjc2MTY2NiAodjAuMTAuMjkrL3YwLjExLjE0KyksIGJ1c2JveSBoYWQgYmVjb21lXG4gICAgICAgICBicm9rZW4uIFN0cmVhbXMyL3N0cmVhbXMzIGlzIGEgaHVnZSBibGFjayBib3ggb2YgY29uZnVzaW9uLCBidXRcbiAgICAgICAgIHNvbWVob3cgb3ZlcnJpZGluZyB0aGUgc3luYyBzdGF0ZSBzZWVtcyB0byBmaXggdGhpbmdzIGFnYWluIChhbmQgc3RpbGxcbiAgICAgICAgIHNlZW1zIHRvIHdvcmsgZm9yIHByZXZpb3VzIG5vZGUgdmVyc2lvbnMpLlxuICAgICAgKi9cbiAgICAgIHBhcnQuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlXG5cbiAgICAgIHBhcnQub24oJ2RhdGEnLCBvbkRhdGEpXG4gICAgICBwYXJ0Lm9uKCdlbmQnLCBvbkVuZClcbiAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoY3VyRmlsZSkgeyBjdXJGaWxlLmVtaXQoJ2Vycm9yJywgZXJyKSB9XG4gICAgfSlcbiAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGJveS5lbWl0KCdlcnJvcicsIGVycilcbiAgfSkub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBmaW5pc2hlZCA9IHRydWVcbiAgICBjaGVja0ZpbmlzaGVkKClcbiAgfSlcbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgY2IpIHtcbiAgY29uc3QgciA9IHRoaXMucGFyc2VyLndyaXRlKGNodW5rKVxuICBpZiAociAmJiAhdGhpcy5fcGF1c2UpIHtcbiAgICBjYigpXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fbmVlZERyYWluID0gIXJcbiAgICB0aGlzLl9jYiA9IGNiXG4gIH1cbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzXG5cbiAgaWYgKHNlbGYucGFyc2VyLndyaXRhYmxlKSB7XG4gICAgc2VsZi5wYXJzZXIuZW5kKClcbiAgfSBlbHNlIGlmICghc2VsZi5fYm95Ll9kb25lKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9ib3kuX2RvbmUgPSB0cnVlXG4gICAgICBzZWxmLl9ib3kuZW1pdCgnZmluaXNoJylcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHNraXBQYXJ0IChwYXJ0KSB7XG4gIHBhcnQucmVzdW1lKClcbn1cblxuZnVuY3Rpb24gRmlsZVN0cmVhbSAob3B0cykge1xuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdHMpXG5cbiAgdGhpcy5ieXRlc1JlYWQgPSAwXG5cbiAgdGhpcy50cnVuY2F0ZWQgPSBmYWxzZVxufVxuXG5pbmhlcml0cyhGaWxlU3RyZWFtLCBSZWFkYWJsZSlcblxuRmlsZVN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge31cblxubW9kdWxlLmV4cG9ydHMgPSBNdWx0aXBhcnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJFX1BMVVMgPSAvXFwrL2dcblxuY29uc3QgSEVYID0gW1xuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXG5dXG5cbmZ1bmN0aW9uIERlY29kZXIgKCkge1xuICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZFxufVxuRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIC8vIFJlcGxhY2UgJysnIHdpdGggJyAnIGJlZm9yZSBkZWNvZGluZ1xuICBzdHIgPSBzdHIucmVwbGFjZShSRV9QTFVTLCAnICcpXG4gIGxldCByZXMgPSAnJ1xuICBsZXQgaSA9IDA7IGxldCBwID0gMDsgY29uc3QgbGVuID0gc3RyLmxlbmd0aFxuICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghSEVYW3N0ci5jaGFyQ29kZUF0KGkpXSkge1xuICAgICAgICByZXMgKz0gJyUnICsgdGhpcy5idWZmZXJcbiAgICAgICAgdGhpcy5idWZmZXIgPSB1bmRlZmluZWRcbiAgICAgICAgLS1pIC8vIHJldHJ5IGNoYXJhY3RlclxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWZmZXIgKz0gc3RyW2ldXG4gICAgICAgICsrcFxuICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQodGhpcy5idWZmZXIsIDE2KSlcbiAgICAgICAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICclJykge1xuICAgICAgaWYgKGkgPiBwKSB7XG4gICAgICAgIHJlcyArPSBzdHIuc3Vic3RyaW5nKHAsIGkpXG4gICAgICAgIHAgPSBpXG4gICAgICB9XG4gICAgICB0aGlzLmJ1ZmZlciA9ICcnXG4gICAgICArK3BcbiAgICB9XG4gIH1cbiAgaWYgKHAgPCBsZW4gJiYgdGhpcy5idWZmZXIgPT09IHVuZGVmaW5lZCkgeyByZXMgKz0gc3RyLnN1YnN0cmluZyhwKSB9XG4gIHJldHVybiByZXNcbn1cbkRlY29kZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERlY29kZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IERlY29kZXIgPSByZXF1aXJlKCcuLi91dGlscy9EZWNvZGVyJylcbmNvbnN0IGRlY29kZVRleHQgPSByZXF1aXJlKCcuLi91dGlscy9kZWNvZGVUZXh0JylcbmNvbnN0IGdldExpbWl0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0TGltaXQnKVxuXG5jb25zdCBSRV9DSEFSU0VUID0gL15jaGFyc2V0JC9pXG5cblVybEVuY29kZWQuZGV0ZWN0ID0gL15hcHBsaWNhdGlvblxcL3gtd3d3LWZvcm0tdXJsZW5jb2RlZC9pXG5mdW5jdGlvbiBVcmxFbmNvZGVkIChib3ksIGNmZykge1xuICBjb25zdCBsaW1pdHMgPSBjZmcubGltaXRzXG4gIGNvbnN0IHBhcnNlZENvblR5cGUgPSBjZmcucGFyc2VkQ29uVHlwZVxuICB0aGlzLmJveSA9IGJveVxuXG4gIHRoaXMuZmllbGRTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZFNpemUnLCAxICogMTAyNCAqIDEwMjQpXG4gIHRoaXMuZmllbGROYW1lU2l6ZUxpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmllbGROYW1lU2l6ZScsIDEwMClcbiAgdGhpcy5maWVsZHNMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ2ZpZWxkcycsIEluZmluaXR5KVxuXG4gIGxldCBjaGFyc2V0XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJzZWRDb25UeXBlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdmFyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkQ29uVHlwZVtpXSkgJiZcbiAgICAgICAgUkVfQ0hBUlNFVC50ZXN0KHBhcnNlZENvblR5cGVbaV1bMF0pKSB7XG4gICAgICBjaGFyc2V0ID0gcGFyc2VkQ29uVHlwZVtpXVsxXS50b0xvd2VyQ2FzZSgpXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGFyc2V0ID09PSB1bmRlZmluZWQpIHsgY2hhcnNldCA9IGNmZy5kZWZDaGFyc2V0IHx8ICd1dGY4JyB9XG5cbiAgdGhpcy5kZWNvZGVyID0gbmV3IERlY29kZXIoKVxuICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0XG4gIHRoaXMuX2ZpZWxkcyA9IDBcbiAgdGhpcy5fc3RhdGUgPSAna2V5J1xuICB0aGlzLl9jaGVja2luZ0J5dGVzID0gdHJ1ZVxuICB0aGlzLl9ieXRlc0tleSA9IDBcbiAgdGhpcy5fYnl0ZXNWYWwgPSAwXG4gIHRoaXMuX2tleSA9ICcnXG4gIHRoaXMuX3ZhbCA9ICcnXG4gIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgdGhpcy5fdmFsVHJ1bmMgPSBmYWxzZVxuICB0aGlzLl9oaXRMaW1pdCA9IGZhbHNlXG59XG5cblVybEVuY29kZWQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGNiKSB7XG4gIGlmICh0aGlzLl9maWVsZHMgPT09IHRoaXMuZmllbGRzTGltaXQpIHtcbiAgICBpZiAoIXRoaXMuYm95LmhpdEZpZWxkc0xpbWl0KSB7XG4gICAgICB0aGlzLmJveS5oaXRGaWVsZHNMaW1pdCA9IHRydWVcbiAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkc0xpbWl0JylcbiAgICB9XG4gICAgcmV0dXJuIGNiKClcbiAgfVxuXG4gIGxldCBpZHhlcTsgbGV0IGlkeGFtcDsgbGV0IGk7IGxldCBwID0gMDsgY29uc3QgbGVuID0gZGF0YS5sZW5ndGhcblxuICB3aGlsZSAocCA8IGxlbikge1xuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ2tleScpIHtcbiAgICAgIGlkeGVxID0gaWR4YW1wID0gdW5kZWZpbmVkXG4gICAgICBmb3IgKGkgPSBwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrcCB9XG4gICAgICAgIGlmIChkYXRhW2ldID09PSAweDNELyogPSAqLykge1xuICAgICAgICAgIGlkeGVxID0gaVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA9PT0gMHgyNi8qICYgKi8pIHtcbiAgICAgICAgICBpZHhhbXAgPSBpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY2hlY2tpbmdCeXRlcyAmJiB0aGlzLl9ieXRlc0tleSA9PT0gdGhpcy5maWVsZE5hbWVTaXplTGltaXQpIHtcbiAgICAgICAgICB0aGlzLl9oaXRMaW1pdCA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NoZWNraW5nQnl0ZXMpIHsgKyt0aGlzLl9ieXRlc0tleSB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpZHhlcSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGtleSB3aXRoIGFzc2lnbm1lbnRcbiAgICAgICAgaWYgKGlkeGVxID4gcCkgeyB0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGlkeGVxKSkgfVxuICAgICAgICB0aGlzLl9zdGF0ZSA9ICd2YWwnXG5cbiAgICAgICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZVxuICAgICAgICB0aGlzLl9jaGVja2luZ0J5dGVzID0gdHJ1ZVxuICAgICAgICB0aGlzLl92YWwgPSAnJ1xuICAgICAgICB0aGlzLl9ieXRlc1ZhbCA9IDBcbiAgICAgICAgdGhpcy5fdmFsVHJ1bmMgPSBmYWxzZVxuICAgICAgICB0aGlzLmRlY29kZXIucmVzZXQoKVxuXG4gICAgICAgIHAgPSBpZHhlcSArIDFcbiAgICAgIH0gZWxzZSBpZiAoaWR4YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8ga2V5IHdpdGggbm8gYXNzaWdubWVudFxuICAgICAgICArK3RoaXMuX2ZpZWxkc1xuICAgICAgICBsZXQga2V5OyBjb25zdCBrZXlUcnVuYyA9IHRoaXMuX2tleVRydW5jXG4gICAgICAgIGlmIChpZHhhbXAgPiBwKSB7IGtleSA9ICh0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGlkeGFtcCkpKSB9IGVsc2UgeyBrZXkgPSB0aGlzLl9rZXkgfVxuXG4gICAgICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2VcbiAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IHRydWVcbiAgICAgICAgdGhpcy5fa2V5ID0gJydcbiAgICAgICAgdGhpcy5fYnl0ZXNLZXkgPSAwXG4gICAgICAgIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgICAgICAgdGhpcy5kZWNvZGVyLnJlc2V0KClcblxuICAgICAgICBpZiAoa2V5Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dChrZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICBrZXlUcnVuYyxcbiAgICAgICAgICAgIGZhbHNlKVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IGlkeGFtcCArIDFcbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcyA9PT0gdGhpcy5maWVsZHNMaW1pdCkgeyByZXR1cm4gY2IoKSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2hpdExpbWl0KSB7XG4gICAgICAgIC8vIHdlIG1heSBub3QgaGF2ZSBoaXQgdGhlIGFjdHVhbCBsaW1pdCBpZiB0aGVyZSBhcmUgZW5jb2RlZCBieXRlcy4uLlxuICAgICAgICBpZiAoaSA+IHApIHsgdGhpcy5fa2V5ICs9IHRoaXMuZGVjb2Rlci53cml0ZShkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBwLCBpKSkgfVxuICAgICAgICBwID0gaVxuICAgICAgICBpZiAoKHRoaXMuX2J5dGVzS2V5ID0gdGhpcy5fa2V5Lmxlbmd0aCkgPT09IHRoaXMuZmllbGROYW1lU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgLy8geWVwLCB3ZSBhY3R1YWxseSBkaWQgaGl0IHRoZSBsaW1pdFxuICAgICAgICAgIHRoaXMuX2NoZWNraW5nQnl0ZXMgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuX2tleVRydW5jID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocCA8IGxlbikgeyB0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHApKSB9XG4gICAgICAgIHAgPSBsZW5cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWR4YW1wID0gdW5kZWZpbmVkXG4gICAgICBmb3IgKGkgPSBwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrcCB9XG4gICAgICAgIGlmIChkYXRhW2ldID09PSAweDI2LyogJiAqLykge1xuICAgICAgICAgIGlkeGFtcCA9IGlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaGVja2luZ0J5dGVzICYmIHRoaXMuX2J5dGVzVmFsID09PSB0aGlzLmZpZWxkU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgdGhpcy5faGl0TGltaXQgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrdGhpcy5fYnl0ZXNWYWwgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaWR4YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKyt0aGlzLl9maWVsZHNcbiAgICAgICAgaWYgKGlkeGFtcCA+IHApIHsgdGhpcy5fdmFsICs9IHRoaXMuZGVjb2Rlci53cml0ZShkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBwLCBpZHhhbXApKSB9XG4gICAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgICAgIGRlY29kZVRleHQodGhpcy5fdmFsLCAnYmluYXJ5JywgdGhpcy5jaGFyc2V0KSxcbiAgICAgICAgICB0aGlzLl9rZXlUcnVuYyxcbiAgICAgICAgICB0aGlzLl92YWxUcnVuYylcbiAgICAgICAgdGhpcy5fc3RhdGUgPSAna2V5J1xuXG4gICAgICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2VcbiAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IHRydWVcbiAgICAgICAgdGhpcy5fa2V5ID0gJydcbiAgICAgICAgdGhpcy5fYnl0ZXNLZXkgPSAwXG4gICAgICAgIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgICAgICAgdGhpcy5kZWNvZGVyLnJlc2V0KClcblxuICAgICAgICBwID0gaWR4YW1wICsgMVxuICAgICAgICBpZiAodGhpcy5fZmllbGRzID09PSB0aGlzLmZpZWxkc0xpbWl0KSB7IHJldHVybiBjYigpIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5faGl0TGltaXQpIHtcbiAgICAgICAgLy8gd2UgbWF5IG5vdCBoYXZlIGhpdCB0aGUgYWN0dWFsIGxpbWl0IGlmIHRoZXJlIGFyZSBlbmNvZGVkIGJ5dGVzLi4uXG4gICAgICAgIGlmIChpID4gcCkgeyB0aGlzLl92YWwgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGkpKSB9XG4gICAgICAgIHAgPSBpXG4gICAgICAgIGlmICgodGhpcy5fdmFsID09PSAnJyAmJiB0aGlzLmZpZWxkU2l6ZUxpbWl0ID09PSAwKSB8fFxuICAgICAgICAgICAgKHRoaXMuX2J5dGVzVmFsID0gdGhpcy5fdmFsLmxlbmd0aCkgPT09IHRoaXMuZmllbGRTaXplTGltaXQpIHtcbiAgICAgICAgICAvLyB5ZXAsIHdlIGFjdHVhbGx5IGRpZCBoaXQgdGhlIGxpbWl0XG4gICAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5fdmFsVHJ1bmMgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwIDwgbGVuKSB7IHRoaXMuX3ZhbCArPSB0aGlzLmRlY29kZXIud3JpdGUoZGF0YS50b1N0cmluZygnYmluYXJ5JywgcCkpIH1cbiAgICAgICAgcCA9IGxlblxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYigpXG59XG5cblVybEVuY29kZWQucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYm95Ll9kb25lKSB7IHJldHVybiB9XG5cbiAgaWYgKHRoaXMuX3N0YXRlID09PSAna2V5JyAmJiB0aGlzLl9rZXkubGVuZ3RoID4gMCkge1xuICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgJycsXG4gICAgICB0aGlzLl9rZXlUcnVuYyxcbiAgICAgIGZhbHNlKVxuICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlID09PSAndmFsJykge1xuICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgZGVjb2RlVGV4dCh0aGlzLl92YWwsICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgdGhpcy5fa2V5VHJ1bmMsXG4gICAgICB0aGlzLl92YWxUcnVuYylcbiAgfVxuICB0aGlzLmJveS5fZG9uZSA9IHRydWVcbiAgdGhpcy5ib3kuZW1pdCgnZmluaXNoJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBVcmxFbmNvZGVkXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBXcml0YWJsZVN0cmVhbSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJykuV3JpdGFibGVcbmNvbnN0IHsgaW5oZXJpdHMgfSA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpXG5jb25zdCBEaWNlciA9IHJlcXVpcmUoJy4uL2RlcHMvZGljZXIvbGliL0RpY2VyJylcblxuY29uc3QgTXVsdGlwYXJ0UGFyc2VyID0gcmVxdWlyZSgnLi90eXBlcy9tdWx0aXBhcnQnKVxuY29uc3QgVXJsZW5jb2RlZFBhcnNlciA9IHJlcXVpcmUoJy4vdHlwZXMvdXJsZW5jb2RlZCcpXG5jb25zdCBwYXJzZVBhcmFtcyA9IHJlcXVpcmUoJy4vdXRpbHMvcGFyc2VQYXJhbXMnKVxuXG5mdW5jdGlvbiBCdXNib3kgKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1c2JveSkpIHsgcmV0dXJuIG5ldyBCdXNib3kob3B0cykgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdXNib3kgZXhwZWN0ZWQgYW4gb3B0aW9ucy1PYmplY3QuJylcbiAgfVxuICBpZiAodHlwZW9mIG9wdHMuaGVhZGVycyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdXNib3kgZXhwZWN0ZWQgYW4gb3B0aW9ucy1PYmplY3Qgd2l0aCBoZWFkZXJzLWF0dHJpYnV0ZS4nKVxuICB9XG4gIGlmICh0eXBlb2Ygb3B0cy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIENvbnRlbnQtVHlwZS1oZWFkZXIuJylcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBoZWFkZXJzLFxuICAgIC4uLnN0cmVhbU9wdGlvbnNcbiAgfSA9IG9wdHNcblxuICB0aGlzLm9wdHMgPSB7XG4gICAgYXV0b0Rlc3Ryb3k6IGZhbHNlLFxuICAgIC4uLnN0cmVhbU9wdGlvbnNcbiAgfVxuICBXcml0YWJsZVN0cmVhbS5jYWxsKHRoaXMsIHRoaXMub3B0cylcblxuICB0aGlzLl9kb25lID0gZmFsc2VcbiAgdGhpcy5fcGFyc2VyID0gdGhpcy5nZXRQYXJzZXJCeUhlYWRlcnMoaGVhZGVycylcbiAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZVxufVxuaW5oZXJpdHMoQnVzYm95LCBXcml0YWJsZVN0cmVhbSlcblxuQnVzYm95LnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKGV2KSB7XG4gIGlmIChldiA9PT0gJ2ZpbmlzaCcpIHtcbiAgICBpZiAoIXRoaXMuX2RvbmUpIHtcbiAgICAgIHRoaXMuX3BhcnNlcj8uZW5kKClcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSBpZiAodGhpcy5fZmluaXNoZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLl9maW5pc2hlZCA9IHRydWVcbiAgfVxuICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuZW1pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1c2JveS5wcm90b3R5cGUuZ2V0UGFyc2VyQnlIZWFkZXJzID0gZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VQYXJhbXMoaGVhZGVyc1snY29udGVudC10eXBlJ10pXG5cbiAgY29uc3QgY2ZnID0ge1xuICAgIGRlZkNoYXJzZXQ6IHRoaXMub3B0cy5kZWZDaGFyc2V0LFxuICAgIGZpbGVId206IHRoaXMub3B0cy5maWxlSHdtLFxuICAgIGhlYWRlcnMsXG4gICAgaGlnaFdhdGVyTWFyazogdGhpcy5vcHRzLmhpZ2hXYXRlck1hcmssXG4gICAgaXNQYXJ0QUZpbGU6IHRoaXMub3B0cy5pc1BhcnRBRmlsZSxcbiAgICBsaW1pdHM6IHRoaXMub3B0cy5saW1pdHMsXG4gICAgcGFyc2VkQ29uVHlwZTogcGFyc2VkLFxuICAgIHByZXNlcnZlUGF0aDogdGhpcy5vcHRzLnByZXNlcnZlUGF0aFxuICB9XG5cbiAgaWYgKE11bHRpcGFydFBhcnNlci5kZXRlY3QudGVzdChwYXJzZWRbMF0pKSB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aXBhcnRQYXJzZXIodGhpcywgY2ZnKVxuICB9XG4gIGlmIChVcmxlbmNvZGVkUGFyc2VyLmRldGVjdC50ZXN0KHBhcnNlZFswXSkpIHtcbiAgICByZXR1cm4gbmV3IFVybGVuY29kZWRQYXJzZXIodGhpcywgY2ZnKVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgQ29udGVudC1UeXBlLicpXG59XG5cbkJ1c2JveS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5fcGFyc2VyLndyaXRlKGNodW5rLCBjYilcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBCdXNib3lcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBCdXNib3lcbm1vZHVsZS5leHBvcnRzLkJ1c2JveSA9IEJ1c2JveVxuXG5tb2R1bGUuZXhwb3J0cy5EaWNlciA9IERpY2VyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE1lc3NhZ2VDaGFubmVsLCByZWNlaXZlTWVzc2FnZU9uUG9ydCB9ID0gcmVxdWlyZSgnd29ya2VyX3RocmVhZHMnKVxuXG5jb25zdCBjb3JzU2FmZUxpc3RlZE1ldGhvZHMgPSBbJ0dFVCcsICdIRUFEJywgJ1BPU1QnXVxuY29uc3QgY29yc1NhZmVMaXN0ZWRNZXRob2RzU2V0ID0gbmV3IFNldChjb3JzU2FmZUxpc3RlZE1ldGhvZHMpXG5cbmNvbnN0IG51bGxCb2R5U3RhdHVzID0gWzEwMSwgMjA0LCAyMDUsIDMwNF1cblxuY29uc3QgcmVkaXJlY3RTdGF0dXMgPSBbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdXG5jb25zdCByZWRpcmVjdFN0YXR1c1NldCA9IG5ldyBTZXQocmVkaXJlY3RTdGF0dXMpXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNibG9jay1iYWQtcG9ydFxuY29uc3QgYmFkUG9ydHMgPSBbXG4gICcxJywgJzcnLCAnOScsICcxMScsICcxMycsICcxNScsICcxNycsICcxOScsICcyMCcsICcyMScsICcyMicsICcyMycsICcyNScsICczNycsICc0MicsICc0MycsICc1MycsICc2OScsICc3NycsICc3OScsXG4gICc4NycsICc5NScsICcxMDEnLCAnMTAyJywgJzEwMycsICcxMDQnLCAnMTA5JywgJzExMCcsICcxMTEnLCAnMTEzJywgJzExNScsICcxMTcnLCAnMTE5JywgJzEyMycsICcxMzUnLCAnMTM3JyxcbiAgJzEzOScsICcxNDMnLCAnMTYxJywgJzE3OScsICczODknLCAnNDI3JywgJzQ2NScsICc1MTInLCAnNTEzJywgJzUxNCcsICc1MTUnLCAnNTI2JywgJzUzMCcsICc1MzEnLCAnNTMyJyxcbiAgJzU0MCcsICc1NDgnLCAnNTU0JywgJzU1NicsICc1NjMnLCAnNTg3JywgJzYwMScsICc2MzYnLCAnOTg5JywgJzk5MCcsICc5OTMnLCAnOTk1JywgJzE3MTknLCAnMTcyMCcsICcxNzIzJyxcbiAgJzIwNDknLCAnMzY1OScsICc0MDQ1JywgJzUwNjAnLCAnNTA2MScsICc2MDAwJywgJzY1NjYnLCAnNjY2NScsICc2NjY2JywgJzY2NjcnLCAnNjY2OCcsICc2NjY5JywgJzY2OTcnLFxuICAnMTAwODAnXG5dXG5cbmNvbnN0IGJhZFBvcnRzU2V0ID0gbmV3IFNldChiYWRQb3J0cylcblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1yZWZlcnJlci1wb2xpY3kvI3JlZmVycmVyLXBvbGljaWVzXG5jb25zdCByZWZlcnJlclBvbGljeSA9IFtcbiAgJycsXG4gICduby1yZWZlcnJlcicsXG4gICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZScsXG4gICdzYW1lLW9yaWdpbicsXG4gICdvcmlnaW4nLFxuICAnc3RyaWN0LW9yaWdpbicsXG4gICdvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nLFxuICAnc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbicsXG4gICd1bnNhZmUtdXJsJ1xuXVxuY29uc3QgcmVmZXJyZXJQb2xpY3lTZXQgPSBuZXcgU2V0KHJlZmVycmVyUG9saWN5KVxuXG5jb25zdCByZXF1ZXN0UmVkaXJlY3QgPSBbJ2ZvbGxvdycsICdtYW51YWwnLCAnZXJyb3InXVxuXG5jb25zdCBzYWZlTWV0aG9kcyA9IFsnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdUUkFDRSddXG5jb25zdCBzYWZlTWV0aG9kc1NldCA9IG5ldyBTZXQoc2FmZU1ldGhvZHMpXG5cbmNvbnN0IHJlcXVlc3RNb2RlID0gWyduYXZpZ2F0ZScsICdzYW1lLW9yaWdpbicsICduby1jb3JzJywgJ2NvcnMnXVxuXG5jb25zdCByZXF1ZXN0Q3JlZGVudGlhbHMgPSBbJ29taXQnLCAnc2FtZS1vcmlnaW4nLCAnaW5jbHVkZSddXG5cbmNvbnN0IHJlcXVlc3RDYWNoZSA9IFtcbiAgJ2RlZmF1bHQnLFxuICAnbm8tc3RvcmUnLFxuICAncmVsb2FkJyxcbiAgJ25vLWNhY2hlJyxcbiAgJ2ZvcmNlLWNhY2hlJyxcbiAgJ29ubHktaWYtY2FjaGVkJ1xuXVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdC1ib2R5LWhlYWRlci1uYW1lXG5jb25zdCByZXF1ZXN0Qm9keUhlYWRlciA9IFtcbiAgJ2NvbnRlbnQtZW5jb2RpbmcnLFxuICAnY29udGVudC1sYW5ndWFnZScsXG4gICdjb250ZW50LWxvY2F0aW9uJyxcbiAgJ2NvbnRlbnQtdHlwZScsXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMjAyMVxuICAvLyAnQ29udGVudC1MZW5ndGgnIGlzIGEgZm9yYmlkZGVuIGhlYWRlciBuYW1lLCB3aGljaCBpcyB0eXBpY2FsbHlcbiAgLy8gcmVtb3ZlZCBpbiB0aGUgSGVhZGVycyBpbXBsZW1lbnRhdGlvbi4gSG93ZXZlciwgdW5kaWNpIGRvZXNuJ3RcbiAgLy8gZmlsdGVyIG91dCBoZWFkZXJzLCBzbyB3ZSBhZGQgaXQgaGVyZS5cbiAgJ2NvbnRlbnQtbGVuZ3RoJ1xuXVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZW51bWRlZi1yZXF1ZXN0ZHVwbGV4XG5jb25zdCByZXF1ZXN0RHVwbGV4ID0gW1xuICAnaGFsZidcbl1cblxuLy8gaHR0cDovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZm9yYmlkZGVuLW1ldGhvZFxuY29uc3QgZm9yYmlkZGVuTWV0aG9kcyA9IFsnQ09OTkVDVCcsICdUUkFDRScsICdUUkFDSyddXG5jb25zdCBmb3JiaWRkZW5NZXRob2RzU2V0ID0gbmV3IFNldChmb3JiaWRkZW5NZXRob2RzKVxuXG5jb25zdCBzdWJyZXNvdXJjZSA9IFtcbiAgJ2F1ZGlvJyxcbiAgJ2F1ZGlvd29ya2xldCcsXG4gICdmb250JyxcbiAgJ2ltYWdlJyxcbiAgJ21hbmlmZXN0JyxcbiAgJ3BhaW50d29ya2xldCcsXG4gICdzY3JpcHQnLFxuICAnc3R5bGUnLFxuICAndHJhY2snLFxuICAndmlkZW8nLFxuICAneHNsdCcsXG4gICcnXG5dXG5jb25zdCBzdWJyZXNvdXJjZVNldCA9IG5ldyBTZXQoc3VicmVzb3VyY2UpXG5cbi8qKiBAdHlwZSB7Z2xvYmFsVGhpc1snRE9NRXhjZXB0aW9uJ119ICovXG5jb25zdCBET01FeGNlcHRpb24gPSBnbG9iYWxUaGlzLkRPTUV4Y2VwdGlvbiA/PyAoKCkgPT4ge1xuICAvLyBET01FeGNlcHRpb24gd2FzIG9ubHkgbWFkZSBhIGdsb2JhbCBpbiBOb2RlIHYxNy4wLjAsXG4gIC8vIGJ1dCBmZXRjaCBzdXBwb3J0cyA+PSB2MTYuOC5cbiAgdHJ5IHtcbiAgICBhdG9iKCd+JylcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihlcnIpLmNvbnN0cnVjdG9yXG4gIH1cbn0pKClcblxubGV0IGNoYW5uZWxcblxuLyoqIEB0eXBlIHtnbG9iYWxUaGlzWydzdHJ1Y3R1cmVkQ2xvbmUnXX0gKi9cbmNvbnN0IHN0cnVjdHVyZWRDbG9uZSA9XG4gIGdsb2JhbFRoaXMuc3RydWN0dXJlZENsb25lID8/XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL2IyN2FlMjRkY2M0MjUxYmFkNzI2ZDlkODRiYWY2NzhkMWY3MDdmZWQvbGliL2ludGVybmFsL3N0cnVjdHVyZWRfY2xvbmUuanNcbiAgLy8gc3RydWN0dXJlZENsb25lIHdhcyBhZGRlZCBpbiB2MTcuMC4wLCBidXQgZmV0Y2ggc3VwcG9ydHMgdjE2LjhcbiAgZnVuY3Rpb24gc3RydWN0dXJlZENsb25lICh2YWx1ZSwgb3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNzaW5nIGFyZ3VtZW50JylcbiAgICB9XG5cbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKVxuICAgIH1cbiAgICBjaGFubmVsLnBvcnQxLnVucmVmKClcbiAgICBjaGFubmVsLnBvcnQyLnVucmVmKClcbiAgICBjaGFubmVsLnBvcnQxLnBvc3RNZXNzYWdlKHZhbHVlLCBvcHRpb25zPy50cmFuc2ZlcilcbiAgICByZXR1cm4gcmVjZWl2ZU1lc3NhZ2VPblBvcnQoY2hhbm5lbC5wb3J0MikubWVzc2FnZVxuICB9XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBET01FeGNlcHRpb24sXG4gIHN0cnVjdHVyZWRDbG9uZSxcbiAgc3VicmVzb3VyY2UsXG4gIGZvcmJpZGRlbk1ldGhvZHMsXG4gIHJlcXVlc3RCb2R5SGVhZGVyLFxuICByZWZlcnJlclBvbGljeSxcbiAgcmVxdWVzdFJlZGlyZWN0LFxuICByZXF1ZXN0TW9kZSxcbiAgcmVxdWVzdENyZWRlbnRpYWxzLFxuICByZXF1ZXN0Q2FjaGUsXG4gIHJlZGlyZWN0U3RhdHVzLFxuICBjb3JzU2FmZUxpc3RlZE1ldGhvZHMsXG4gIG51bGxCb2R5U3RhdHVzLFxuICBzYWZlTWV0aG9kcyxcbiAgYmFkUG9ydHMsXG4gIHJlcXVlc3REdXBsZXgsXG4gIHN1YnJlc291cmNlU2V0LFxuICBiYWRQb3J0c1NldCxcbiAgcmVkaXJlY3RTdGF0dXNTZXQsXG4gIGNvcnNTYWZlTGlzdGVkTWV0aG9kc1NldCxcbiAgc2FmZU1ldGhvZHNTZXQsXG4gIGZvcmJpZGRlbk1ldGhvZHNTZXQsXG4gIHJlZmVycmVyUG9saWN5U2V0XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBJbiBjYXNlIG9mIGJyZWFraW5nIGNoYW5nZXMsIGluY3JlYXNlIHRoZSB2ZXJzaW9uXG4vLyBudW1iZXIgdG8gYXZvaWQgY29uZmxpY3RzLlxuY29uc3QgZ2xvYmFsT3JpZ2luID0gU3ltYm9sLmZvcigndW5kaWNpLmdsb2JhbE9yaWdpbi4xJylcblxuZnVuY3Rpb24gZ2V0R2xvYmFsT3JpZ2luICgpIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXNbZ2xvYmFsT3JpZ2luXVxufVxuXG5mdW5jdGlvbiBzZXRHbG9iYWxPcmlnaW4gKG5ld09yaWdpbikge1xuICBpZiAobmV3T3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgZ2xvYmFsT3JpZ2luLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgICB9KVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBwYXJzZWRVUkwgPSBuZXcgVVJMKG5ld09yaWdpbilcblxuICBpZiAocGFyc2VkVVJMLnByb3RvY29sICE9PSAnaHR0cDonICYmIHBhcnNlZFVSTC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBPbmx5IGh0dHAgJiBodHRwcyB1cmxzIGFyZSBhbGxvd2VkLCByZWNlaXZlZCAke3BhcnNlZFVSTC5wcm90b2NvbH1gKVxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIGdsb2JhbE9yaWdpbiwge1xuICAgIHZhbHVlOiBwYXJzZWRVUkwsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0R2xvYmFsT3JpZ2luLFxuICBzZXRHbG9iYWxPcmlnaW5cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcmVkaXJlY3RTdGF0dXNTZXQsIHJlZmVycmVyUG9saWN5U2V0OiByZWZlcnJlclBvbGljeVRva2VucywgYmFkUG9ydHNTZXQgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2dsb2JhbCcpXG5jb25zdCB7IHBlcmZvcm1hbmNlIH0gPSByZXF1aXJlKCdwZXJmX2hvb2tzJylcbmNvbnN0IHsgaXNCbG9iTGlrZSwgdG9VU1ZTdHJpbmcsIFJlYWRhYmxlU3RyZWFtRnJvbSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGlzVWludDhBcnJheSB9ID0gcmVxdWlyZSgndXRpbC90eXBlcycpXG5cbmxldCBzdXBwb3J0ZWRIYXNoZXMgPSBbXVxuXG4vLyBodHRwczovL25vZGVqcy5vcmcvYXBpL2NyeXB0by5odG1sI2RldGVybWluaW5nLWlmLWNyeXB0by1zdXBwb3J0LWlzLXVuYXZhaWxhYmxlXG4vKiogQHR5cGUge2ltcG9ydCgnY3J5cHRvJyl8dW5kZWZpbmVkfSAqL1xubGV0IGNyeXB0b1xuXG50cnkge1xuICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKVxuICBjb25zdCBwb3NzaWJsZVJlbGV2YW50SGFzaGVzID0gWydzaGEyNTYnLCAnc2hhMzg0JywgJ3NoYTUxMiddXG4gIHN1cHBvcnRlZEhhc2hlcyA9IGNyeXB0by5nZXRIYXNoZXMoKS5maWx0ZXIoKGhhc2gpID0+IHBvc3NpYmxlUmVsZXZhbnRIYXNoZXMuaW5jbHVkZXMoaGFzaCkpXG4vKiBjOCBpZ25vcmUgbmV4dCAzICovXG59IGNhdGNoIHtcbn1cblxuZnVuY3Rpb24gcmVzcG9uc2VVUkwgKHJlc3BvbnNlKSB7XG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZXNcbiAgLy8gQSByZXNwb25zZSBoYXMgYW4gYXNzb2NpYXRlZCBVUkwuIEl0IGlzIGEgcG9pbnRlciB0byB0aGUgbGFzdCBVUkxcbiAgLy8gaW4gcmVzcG9uc2XigJlzIFVSTCBsaXN0IGFuZCBudWxsIGlmIHJlc3BvbnNl4oCZcyBVUkwgbGlzdCBpcyBlbXB0eS5cbiAgY29uc3QgdXJsTGlzdCA9IHJlc3BvbnNlLnVybExpc3RcbiAgY29uc3QgbGVuZ3RoID0gdXJsTGlzdC5sZW5ndGhcbiAgcmV0dXJuIGxlbmd0aCA9PT0gMCA/IG51bGwgOiB1cmxMaXN0W2xlbmd0aCAtIDFdLnRvU3RyaW5nKClcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtcmVzcG9uc2UtbG9jYXRpb24tdXJsXG5mdW5jdGlvbiByZXNwb25zZUxvY2F0aW9uVVJMIChyZXNwb25zZSwgcmVxdWVzdEZyYWdtZW50KSB7XG4gIC8vIDEuIElmIHJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgbm90IGEgcmVkaXJlY3Qgc3RhdHVzLCB0aGVuIHJldHVybiBudWxsLlxuICBpZiAoIXJlZGlyZWN0U3RhdHVzU2V0LmhhcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIDIuIExldCBsb2NhdGlvbiBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzIGdpdmVuXG4gIC8vIGBMb2NhdGlvbmAgYW5kIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdC5cbiAgbGV0IGxvY2F0aW9uID0gcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdsb2NhdGlvbicpXG5cbiAgLy8gMy4gSWYgbG9jYXRpb24gaXMgYSBoZWFkZXIgdmFsdWUsIHRoZW4gc2V0IGxvY2F0aW9uIHRvIHRoZSByZXN1bHQgb2ZcbiAgLy8gICAgcGFyc2luZyBsb2NhdGlvbiB3aXRoIHJlc3BvbnNl4oCZcyBVUkwuXG4gIGlmIChsb2NhdGlvbiAhPT0gbnVsbCAmJiBpc1ZhbGlkSGVhZGVyVmFsdWUobG9jYXRpb24pKSB7XG4gICAgbG9jYXRpb24gPSBuZXcgVVJMKGxvY2F0aW9uLCByZXNwb25zZVVSTChyZXNwb25zZSkpXG4gIH1cblxuICAvLyA0LiBJZiBsb2NhdGlvbiBpcyBhIFVSTCB3aG9zZSBmcmFnbWVudCBpcyBudWxsLCB0aGVuIHNldCBsb2NhdGlvbuKAmXNcbiAgLy8gZnJhZ21lbnQgdG8gcmVxdWVzdEZyYWdtZW50LlxuICBpZiAobG9jYXRpb24gJiYgIWxvY2F0aW9uLmhhc2gpIHtcbiAgICBsb2NhdGlvbi5oYXNoID0gcmVxdWVzdEZyYWdtZW50XG4gIH1cblxuICAvLyA1LiBSZXR1cm4gbG9jYXRpb24uXG4gIHJldHVybiBsb2NhdGlvblxufVxuXG4vKiogQHJldHVybnMge1VSTH0gKi9cbmZ1bmN0aW9uIHJlcXVlc3RDdXJyZW50VVJMIChyZXF1ZXN0KSB7XG4gIHJldHVybiByZXF1ZXN0LnVybExpc3RbcmVxdWVzdC51cmxMaXN0Lmxlbmd0aCAtIDFdXG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RCYWRQb3J0IChyZXF1ZXN0KSB7XG4gIC8vIDEuIExldCB1cmwgYmUgcmVxdWVzdOKAmXMgY3VycmVudCBVUkwuXG4gIGNvbnN0IHVybCA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG5cbiAgLy8gMi4gSWYgdXJs4oCZcyBzY2hlbWUgaXMgYW4gSFRUUChTKSBzY2hlbWUgYW5kIHVybOKAmXMgcG9ydCBpcyBhIGJhZCBwb3J0LFxuICAvLyB0aGVuIHJldHVybiBibG9ja2VkLlxuICBpZiAodXJsSXNIdHRwSHR0cHNTY2hlbWUodXJsKSAmJiBiYWRQb3J0c1NldC5oYXModXJsLnBvcnQpKSB7XG4gICAgcmV0dXJuICdibG9ja2VkJ1xuICB9XG5cbiAgLy8gMy4gUmV0dXJuIGFsbG93ZWQuXG4gIHJldHVybiAnYWxsb3dlZCdcbn1cblxuZnVuY3Rpb24gaXNFcnJvckxpa2UgKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgRXJyb3IgfHwgKFxuICAgIG9iamVjdD8uY29uc3RydWN0b3I/Lm5hbWUgPT09ICdFcnJvcicgfHxcbiAgICBvYmplY3Q/LmNvbnN0cnVjdG9yPy5uYW1lID09PSAnRE9NRXhjZXB0aW9uJ1xuICApXG59XG5cbi8vIENoZWNrIHdoZXRoZXIgfHN0YXR1c1RleHR8IGlzIGEgQnl0ZVN0cmluZyBhbmRcbi8vIG1hdGNoZXMgdGhlIFJlYXNvbi1QaHJhc2UgdG9rZW4gcHJvZHVjdGlvbi5cbi8vIFJGQyAyNjE2OiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjYxNlxuLy8gUkZDIDcyMzA6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwXG4vLyBcInJlYXNvbi1waHJhc2UgPSAqKCBIVEFCIC8gU1AgLyBWQ0hBUiAvIG9icy10ZXh0IClcIlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Nocm9taXVtL2Nocm9taXVtL2Jsb2IvOTQuMC40NjA0LjEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9mZXRjaC9yZXNwb25zZS5jYyNMMTE2XG5mdW5jdGlvbiBpc1ZhbGlkUmVhc29uUGhyYXNlIChzdGF0dXNUZXh0KSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdHVzVGV4dC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGMgPSBzdGF0dXNUZXh0LmNoYXJDb2RlQXQoaSlcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICAoXG4gICAgICAgICAgYyA9PT0gMHgwOSB8fCAvLyBIVEFCXG4gICAgICAgICAgKGMgPj0gMHgyMCAmJiBjIDw9IDB4N2UpIHx8IC8vIFNQIC8gVkNIQVJcbiAgICAgICAgICAoYyA+PSAweDgwICYmIGMgPD0gMHhmZilcbiAgICAgICAgKSAvLyBvYnMtdGV4dFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMi42XG4gKiBAcGFyYW0ge251bWJlcn0gY1xuICovXG5mdW5jdGlvbiBpc1Rva2VuQ2hhckNvZGUgKGMpIHtcbiAgc3dpdGNoIChjKSB7XG4gICAgY2FzZSAweDIyOlxuICAgIGNhc2UgMHgyODpcbiAgICBjYXNlIDB4Mjk6XG4gICAgY2FzZSAweDJjOlxuICAgIGNhc2UgMHgyZjpcbiAgICBjYXNlIDB4M2E6XG4gICAgY2FzZSAweDNiOlxuICAgIGNhc2UgMHgzYzpcbiAgICBjYXNlIDB4M2Q6XG4gICAgY2FzZSAweDNlOlxuICAgIGNhc2UgMHgzZjpcbiAgICBjYXNlIDB4NDA6XG4gICAgY2FzZSAweDViOlxuICAgIGNhc2UgMHg1YzpcbiAgICBjYXNlIDB4NWQ6XG4gICAgY2FzZSAweDdiOlxuICAgIGNhc2UgMHg3ZDpcbiAgICAgIC8vIERRVU9URSBhbmQgXCIoKSwvOjs8PT4/QFtcXF17fVwiXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVkNIQVIgJXgyMS03RVxuICAgICAgcmV0dXJuIGMgPj0gMHgyMSAmJiBjIDw9IDB4N2VcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRIVFRQVG9rZW4gKGNoYXJhY3RlcnMpIHtcbiAgaWYgKGNoYXJhY3RlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyYWN0ZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCFpc1Rva2VuQ2hhckNvZGUoY2hhcmFjdGVycy5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLW5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwb3RlbnRpYWxWYWx1ZVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkSGVhZGVyTmFtZSAocG90ZW50aWFsVmFsdWUpIHtcbiAgcmV0dXJuIGlzVmFsaWRIVFRQVG9rZW4ocG90ZW50aWFsVmFsdWUpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLXZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcG90ZW50aWFsVmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEhlYWRlclZhbHVlIChwb3RlbnRpYWxWYWx1ZSkge1xuICAvLyAtIEhhcyBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIEhUVFAgdGFiIG9yIHNwYWNlIGJ5dGVzLlxuICAvLyAtIENvbnRhaW5zIG5vIDB4MDAgKE5VTCkgb3IgSFRUUCBuZXdsaW5lIGJ5dGVzLlxuICBpZiAoXG4gICAgcG90ZW50aWFsVmFsdWUuc3RhcnRzV2l0aCgnXFx0JykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5zdGFydHNXaXRoKCcgJykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5lbmRzV2l0aCgnXFx0JykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5lbmRzV2l0aCgnICcpXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXDAnKSB8fFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXHInKSB8fFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXG4nKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtcmVmZXJyZXItcG9saWN5LyNzZXQtcmVxdWVzdHMtcmVmZXJyZXItcG9saWN5LW9uLXJlZGlyZWN0XG5mdW5jdGlvbiBzZXRSZXF1ZXN0UmVmZXJyZXJQb2xpY3lPblJlZGlyZWN0IChyZXF1ZXN0LCBhY3R1YWxSZXNwb25zZSkge1xuICAvLyAgR2l2ZW4gYSByZXF1ZXN0IHJlcXVlc3QgYW5kIGEgcmVzcG9uc2UgYWN0dWFsUmVzcG9uc2UsIHRoaXMgYWxnb3JpdGhtXG4gIC8vICB1cGRhdGVzIHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSBhY2NvcmRpbmcgdG8gdGhlIFJlZmVycmVyLVBvbGljeVxuICAvLyAgaGVhZGVyIChpZiBhbnkpIGluIGFjdHVhbFJlc3BvbnNlLlxuXG4gIC8vIDEuIExldCBwb2xpY3kgYmUgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgwqcgOC4xIFBhcnNlIGEgcmVmZXJyZXIgcG9saWN5XG4gIC8vIGZyb20gYSBSZWZlcnJlci1Qb2xpY3kgaGVhZGVyIG9uIGFjdHVhbFJlc3BvbnNlLlxuXG4gIC8vIDguMSBQYXJzZSBhIHJlZmVycmVyIHBvbGljeSBmcm9tIGEgUmVmZXJyZXItUG9saWN5IGhlYWRlclxuICAvLyAxLiBMZXQgcG9saWN5LXRva2VucyBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzIGdpdmVuIGBSZWZlcnJlci1Qb2xpY3lgIGFuZCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gIGNvbnN0IHsgaGVhZGVyc0xpc3QgfSA9IGFjdHVhbFJlc3BvbnNlXG4gIC8vIDIuIExldCBwb2xpY3kgYmUgdGhlIGVtcHR5IHN0cmluZy5cbiAgLy8gMy4gRm9yIGVhY2ggdG9rZW4gaW4gcG9saWN5LXRva2VucywgaWYgdG9rZW4gaXMgYSByZWZlcnJlciBwb2xpY3kgYW5kIHRva2VuIGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCBwb2xpY3kgdG8gdG9rZW4uXG4gIC8vIDQuIFJldHVybiBwb2xpY3kuXG4gIGNvbnN0IHBvbGljeUhlYWRlciA9IChoZWFkZXJzTGlzdC5nZXQoJ3JlZmVycmVyLXBvbGljeScpID8/ICcnKS5zcGxpdCgnLCcpXG5cbiAgLy8gTm90ZTogQXMgdGhlIHJlZmVycmVyLXBvbGljeSBjYW4gY29udGFpbiBtdWx0aXBsZSBwb2xpY2llc1xuICAvLyBzZXBhcmF0ZWQgYnkgY29tbWEsIHdlIG5lZWQgdG8gbG9vcCB0aHJvdWdoIGFsbCBvZiB0aGVtXG4gIC8vIGFuZCBwaWNrIHRoZSBmaXJzdCB2YWxpZCBvbmUuXG4gIC8vIFJlZjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL1JlZmVycmVyLVBvbGljeSNzcGVjaWZ5X2FfZmFsbGJhY2tfcG9saWN5XG4gIGxldCBwb2xpY3kgPSAnJ1xuICBpZiAocG9saWN5SGVhZGVyLmxlbmd0aCA+IDApIHtcbiAgICAvLyBUaGUgcmlnaHQtbW9zdCBwb2xpY3kgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAvLyBUaGUgbGVmdC1tb3N0IHBvbGljeSBpcyB0aGUgZmFsbGJhY2suXG4gICAgZm9yIChsZXQgaSA9IHBvbGljeUhlYWRlci5sZW5ndGg7IGkgIT09IDA7IGktLSkge1xuICAgICAgY29uc3QgdG9rZW4gPSBwb2xpY3lIZWFkZXJbaSAtIDFdLnRyaW0oKVxuICAgICAgaWYgKHJlZmVycmVyUG9saWN5VG9rZW5zLmhhcyh0b2tlbikpIHtcbiAgICAgICAgcG9saWN5ID0gdG9rZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAyLiBJZiBwb2xpY3kgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSB0byBwb2xpY3kuXG4gIGlmIChwb2xpY3kgIT09ICcnKSB7XG4gICAgcmVxdWVzdC5yZWZlcnJlclBvbGljeSA9IHBvbGljeVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjcm9zcy1vcmlnaW4tcmVzb3VyY2UtcG9saWN5LWNoZWNrXG5mdW5jdGlvbiBjcm9zc09yaWdpblJlc291cmNlUG9saWN5Q2hlY2sgKCkge1xuICAvLyBUT0RPXG4gIHJldHVybiAnYWxsb3dlZCdcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtY29ycy1jaGVja1xuZnVuY3Rpb24gY29yc0NoZWNrICgpIHtcbiAgLy8gVE9ET1xuICByZXR1cm4gJ3N1Y2Nlc3MnXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXRhby1jaGVja1xuZnVuY3Rpb24gVEFPQ2hlY2sgKCkge1xuICAvLyBUT0RPXG4gIHJldHVybiAnc3VjY2Vzcydcbn1cblxuZnVuY3Rpb24gYXBwZW5kRmV0Y2hNZXRhZGF0YSAoaHR0cFJlcXVlc3QpIHtcbiAgLy8gIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtZmV0Y2gtbWV0YWRhdGEvI3NlYy1mZXRjaC1kZXN0LWhlYWRlclxuICAvLyAgVE9ET1xuXG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtbW9kZS1oZWFkZXJcblxuICAvLyAgMS4gQXNzZXJ0OiBy4oCZcyB1cmwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwuXG4gIC8vICBUT0RPXG5cbiAgLy8gIDIuIExldCBoZWFkZXIgYmUgYSBTdHJ1Y3R1cmVkIEhlYWRlciB3aG9zZSB2YWx1ZSBpcyBhIHRva2VuLlxuICBsZXQgaGVhZGVyID0gbnVsbFxuXG4gIC8vICAzLiBTZXQgaGVhZGVy4oCZcyB2YWx1ZSB0byBy4oCZcyBtb2RlLlxuICBoZWFkZXIgPSBodHRwUmVxdWVzdC5tb2RlXG5cbiAgLy8gIDQuIFNldCBhIHN0cnVjdHVyZWQgZmllbGQgdmFsdWUgYFNlYy1GZXRjaC1Nb2RlYC9oZWFkZXIgaW4gcuKAmXMgaGVhZGVyIGxpc3QuXG4gIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LnNldCgnc2VjLWZldGNoLW1vZGUnLCBoZWFkZXIpXG5cbiAgLy8gIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtZmV0Y2gtbWV0YWRhdGEvI3NlYy1mZXRjaC1zaXRlLWhlYWRlclxuICAvLyAgVE9ET1xuXG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtdXNlci1oZWFkZXJcbiAgLy8gIFRPRE9cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2FwcGVuZC1hLXJlcXVlc3Qtb3JpZ2luLWhlYWRlclxuZnVuY3Rpb24gYXBwZW5kUmVxdWVzdE9yaWdpbkhlYWRlciAocmVxdWVzdCkge1xuICAvLyAxLiBMZXQgc2VyaWFsaXplZE9yaWdpbiBiZSB0aGUgcmVzdWx0IG9mIGJ5dGUtc2VyaWFsaXppbmcgYSByZXF1ZXN0IG9yaWdpbiB3aXRoIHJlcXVlc3QuXG4gIGxldCBzZXJpYWxpemVkT3JpZ2luID0gcmVxdWVzdC5vcmlnaW5cblxuICAvLyAyLiBJZiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBcImNvcnNcIiBvciByZXF1ZXN04oCZcyBtb2RlIGlzIFwid2Vic29ja2V0XCIsIHRoZW4gYXBwZW5kIChgT3JpZ2luYCwgc2VyaWFsaXplZE9yaWdpbikgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmIChyZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJyB8fCByZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgaWYgKHNlcmlhbGl6ZWRPcmlnaW4pIHtcbiAgICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdvcmlnaW4nLCBzZXJpYWxpemVkT3JpZ2luKVxuICAgIH1cblxuICAvLyAzLiBPdGhlcndpc2UsIGlmIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBuZWl0aGVyIGBHRVRgIG5vciBgSEVBRGAsIHRoZW46XG4gIH0gZWxzZSBpZiAocmVxdWVzdC5tZXRob2QgIT09ICdHRVQnICYmIHJlcXVlc3QubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAvLyAxLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgcmVmZXJyZXIgcG9saWN5OlxuICAgIHN3aXRjaCAocmVxdWVzdC5yZWZlcnJlclBvbGljeSkge1xuICAgICAgY2FzZSAnbm8tcmVmZXJyZXInOlxuICAgICAgICAvLyBTZXQgc2VyaWFsaXplZE9yaWdpbiB0byBgbnVsbGAuXG4gICAgICAgIHNlcmlhbGl6ZWRPcmlnaW4gPSBudWxsXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSc6XG4gICAgICBjYXNlICdzdHJpY3Qtb3JpZ2luJzpcbiAgICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nOlxuICAgICAgICAvLyBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgYSB0dXBsZSBvcmlnaW4sIGl0cyBzY2hlbWUgaXMgXCJodHRwc1wiLCBhbmQgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBpcyBub3QgXCJodHRwc1wiLCB0aGVuIHNldCBzZXJpYWxpemVkT3JpZ2luIHRvIGBudWxsYC5cbiAgICAgICAgaWYgKHJlcXVlc3Qub3JpZ2luICYmIHVybEhhc0h0dHBzU2NoZW1lKHJlcXVlc3Qub3JpZ2luKSAmJiAhdXJsSGFzSHR0cHNTY2hlbWUocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZE9yaWdpbiA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnc2FtZS1vcmlnaW4nOlxuICAgICAgICAvLyBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIG9yaWdpbiwgdGhlbiBzZXQgc2VyaWFsaXplZE9yaWdpbiB0byBgbnVsbGAuXG4gICAgICAgIGlmICghc2FtZU9yaWdpbihyZXF1ZXN0LCByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KSkpIHtcbiAgICAgICAgICBzZXJpYWxpemVkT3JpZ2luID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBEbyBub3RoaW5nLlxuICAgIH1cblxuICAgIGlmIChzZXJpYWxpemVkT3JpZ2luKSB7XG4gICAgICAvLyAyLiBBcHBlbmQgKGBPcmlnaW5gLCBzZXJpYWxpemVkT3JpZ2luKSB0byByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdvcmlnaW4nLCBzZXJpYWxpemVkT3JpZ2luKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZSAoY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkpIHtcbiAgLy8gVE9ET1xuICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KClcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NyZWF0ZS1hbi1vcGFxdWUtdGltaW5nLWluZm9cbmZ1bmN0aW9uIGNyZWF0ZU9wYXF1ZVRpbWluZ0luZm8gKHRpbWluZ0luZm8pIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydFRpbWU6IHRpbWluZ0luZm8uc3RhcnRUaW1lID8/IDAsXG4gICAgcmVkaXJlY3RTdGFydFRpbWU6IDAsXG4gICAgcmVkaXJlY3RFbmRUaW1lOiAwLFxuICAgIHBvc3RSZWRpcmVjdFN0YXJ0VGltZTogdGltaW5nSW5mby5zdGFydFRpbWUgPz8gMCxcbiAgICBmaW5hbFNlcnZpY2VXb3JrZXJTdGFydFRpbWU6IDAsXG4gICAgZmluYWxOZXR3b3JrUmVzcG9uc2VTdGFydFRpbWU6IDAsXG4gICAgZmluYWxOZXR3b3JrUmVxdWVzdFN0YXJ0VGltZTogMCxcbiAgICBlbmRUaW1lOiAwLFxuICAgIGVuY29kZWRCb2R5U2l6ZTogMCxcbiAgICBkZWNvZGVkQm9keVNpemU6IDAsXG4gICAgZmluYWxDb25uZWN0aW9uVGltaW5nSW5mbzogbnVsbFxuICB9XG59XG5cbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL29yaWdpbi5odG1sI3BvbGljeS1jb250YWluZXJcbmZ1bmN0aW9uIG1ha2VQb2xpY3lDb250YWluZXIgKCkge1xuICAvLyBOb3RlOiB0aGUgZmV0Y2ggc3BlYyBkb2Vzbid0IG1ha2UgdXNlIG9mIGVtYmVkZGVyIHBvbGljeSBvciBDU1AgbGlzdFxuICByZXR1cm4ge1xuICAgIHJlZmVycmVyUG9saWN5OiAnc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbidcbiAgfVxufVxuXG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9vcmlnaW4uaHRtbCNjbG9uZS1hLXBvbGljeS1jb250YWluZXJcbmZ1bmN0aW9uIGNsb25lUG9saWN5Q29udGFpbmVyIChwb2xpY3lDb250YWluZXIpIHtcbiAgcmV0dXJuIHtcbiAgICByZWZlcnJlclBvbGljeTogcG9saWN5Q29udGFpbmVyLnJlZmVycmVyUG9saWN5XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1yZWZlcnJlci1wb2xpY3kvI2RldGVybWluZS1yZXF1ZXN0cy1yZWZlcnJlclxuZnVuY3Rpb24gZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlciAocmVxdWVzdCkge1xuICAvLyAxLiBMZXQgcG9saWN5IGJlIHJlcXVlc3QncyByZWZlcnJlciBwb2xpY3kuXG4gIGNvbnN0IHBvbGljeSA9IHJlcXVlc3QucmVmZXJyZXJQb2xpY3lcblxuICAvLyBOb3RlOiBwb2xpY3kgY2Fubm90IChzaG91bGRuJ3QpIGJlIG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICBhc3NlcnQocG9saWN5KVxuXG4gIC8vIDIuIExldCBlbnZpcm9ubWVudCBiZSByZXF1ZXN04oCZcyBjbGllbnQuXG5cbiAgbGV0IHJlZmVycmVyU291cmNlID0gbnVsbFxuXG4gIC8vIDMuIFN3aXRjaCBvbiByZXF1ZXN04oCZcyByZWZlcnJlcjpcbiAgaWYgKHJlcXVlc3QucmVmZXJyZXIgPT09ICdjbGllbnQnKSB7XG4gICAgLy8gTm90ZTogbm9kZSBpc24ndCBhIGJyb3dzZXIgYW5kIGRvZXNuJ3QgaW1wbGVtZW50IGRvY3VtZW50L2lmcmFtZXMsXG4gICAgLy8gc28gd2UgYnlwYXNzIHRoaXMgc3RlcCBhbmQgcmVwbGFjZSBpdCB3aXRoIG91ciBvd24uXG5cbiAgICBjb25zdCBnbG9iYWxPcmlnaW4gPSBnZXRHbG9iYWxPcmlnaW4oKVxuXG4gICAgaWYgKCFnbG9iYWxPcmlnaW4gfHwgZ2xvYmFsT3JpZ2luLm9yaWdpbiA9PT0gJ251bGwnKSB7XG4gICAgICByZXR1cm4gJ25vLXJlZmVycmVyJ1xuICAgIH1cblxuICAgIC8vIG5vdGU6IHdlIG5lZWQgdG8gY2xvbmUgaXQgYXMgaXQncyBtdXRhdGVkXG4gICAgcmVmZXJyZXJTb3VyY2UgPSBuZXcgVVJMKGdsb2JhbE9yaWdpbilcbiAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZmVycmVyIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgLy8gTGV0IHJlZmVycmVyU291cmNlIGJlIHJlcXVlc3TigJlzIHJlZmVycmVyLlxuICAgIHJlZmVycmVyU291cmNlID0gcmVxdWVzdC5yZWZlcnJlclxuICB9XG5cbiAgLy8gNC4gTGV0IHJlcXVlc3TigJlzIHJlZmVycmVyVVJMIGJlIHRoZSByZXN1bHQgb2Ygc3RyaXBwaW5nIHJlZmVycmVyU291cmNlIGZvclxuICAvLyAgICB1c2UgYXMgYSByZWZlcnJlci5cbiAgbGV0IHJlZmVycmVyVVJMID0gc3RyaXBVUkxGb3JSZWZlcnJlcihyZWZlcnJlclNvdXJjZSlcblxuICAvLyA1LiBMZXQgcmVmZXJyZXJPcmlnaW4gYmUgdGhlIHJlc3VsdCBvZiBzdHJpcHBpbmcgcmVmZXJyZXJTb3VyY2UgZm9yIHVzZSBhc1xuICAvLyAgICBhIHJlZmVycmVyLCB3aXRoIHRoZSBvcmlnaW4tb25seSBmbGFnIHNldCB0byB0cnVlLlxuICBjb25zdCByZWZlcnJlck9yaWdpbiA9IHN0cmlwVVJMRm9yUmVmZXJyZXIocmVmZXJyZXJTb3VyY2UsIHRydWUpXG5cbiAgLy8gNi4gSWYgdGhlIHJlc3VsdCBvZiBzZXJpYWxpemluZyByZWZlcnJlclVSTCBpcyBhIHN0cmluZyB3aG9zZSBsZW5ndGggaXNcbiAgLy8gICAgZ3JlYXRlciB0aGFuIDQwOTYsIHNldCByZWZlcnJlclVSTCB0byByZWZlcnJlck9yaWdpbi5cbiAgaWYgKHJlZmVycmVyVVJMLnRvU3RyaW5nKCkubGVuZ3RoID4gNDA5Nikge1xuICAgIHJlZmVycmVyVVJMID0gcmVmZXJyZXJPcmlnaW5cbiAgfVxuXG4gIGNvbnN0IGFyZVNhbWVPcmlnaW4gPSBzYW1lT3JpZ2luKHJlcXVlc3QsIHJlZmVycmVyVVJMKVxuICBjb25zdCBpc05vblBvdGVudGlhbGx5VHJ1c3RXb3J0aHkgPSBpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkocmVmZXJyZXJVUkwpICYmXG4gICAgIWlzVVJMUG90ZW50aWFsbHlUcnVzdHdvcnRoeShyZXF1ZXN0LnVybClcblxuICAvLyA4LiBFeGVjdXRlIHRoZSBzd2l0Y2ggc3RhdGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZSBvZiBwb2xpY3k6XG4gIHN3aXRjaCAocG9saWN5KSB7XG4gICAgY2FzZSAnb3JpZ2luJzogcmV0dXJuIHJlZmVycmVyT3JpZ2luICE9IG51bGwgPyByZWZlcnJlck9yaWdpbiA6IHN0cmlwVVJMRm9yUmVmZXJyZXIocmVmZXJyZXJTb3VyY2UsIHRydWUpXG4gICAgY2FzZSAndW5zYWZlLXVybCc6IHJldHVybiByZWZlcnJlclVSTFxuICAgIGNhc2UgJ3NhbWUtb3JpZ2luJzpcbiAgICAgIHJldHVybiBhcmVTYW1lT3JpZ2luID8gcmVmZXJyZXJPcmlnaW4gOiAnbm8tcmVmZXJyZXInXG4gICAgY2FzZSAnb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luJzpcbiAgICAgIHJldHVybiBhcmVTYW1lT3JpZ2luID8gcmVmZXJyZXJVUkwgOiByZWZlcnJlck9yaWdpblxuICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nOiB7XG4gICAgICBjb25zdCBjdXJyZW50VVJMID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcblxuICAgICAgLy8gMS4gSWYgdGhlIG9yaWdpbiBvZiByZWZlcnJlclVSTCBhbmQgdGhlIG9yaWdpbiBvZiByZXF1ZXN04oCZcyBjdXJyZW50XG4gICAgICAvLyAgICBVUkwgYXJlIHRoZSBzYW1lLCB0aGVuIHJldHVybiByZWZlcnJlclVSTC5cbiAgICAgIGlmIChzYW1lT3JpZ2luKHJlZmVycmVyVVJMLCBjdXJyZW50VVJMKSkge1xuICAgICAgICByZXR1cm4gcmVmZXJyZXJVUkxcbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgcmVmZXJyZXJVUkwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwgYW5kIHJlcXVlc3TigJlzXG4gICAgICAvLyAgICBjdXJyZW50IFVSTCBpcyBub3QgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwsIHRoZW4gcmV0dXJuIG5vXG4gICAgICAvLyAgICByZWZlcnJlci5cbiAgICAgIGlmIChpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkocmVmZXJyZXJVUkwpICYmICFpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkoY3VycmVudFVSTCkpIHtcbiAgICAgICAgcmV0dXJuICduby1yZWZlcnJlcidcbiAgICAgIH1cblxuICAgICAgLy8gMy4gUmV0dXJuIHJlZmVycmVyT3JpZ2luLlxuICAgICAgcmV0dXJuIHJlZmVycmVyT3JpZ2luXG4gICAgfVxuICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4nOiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAvKipcbiAgICAgICAgICogMS4gSWYgcmVmZXJyZXJVUkwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwgYW5kXG4gICAgICAgICAqIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMIGlzIG5vdCBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCxcbiAgICAgICAgICogdGhlbiByZXR1cm4gbm8gcmVmZXJyZXIuXG4gICAgICAgICAqIDIuIFJldHVybiByZWZlcnJlck9yaWdpblxuICAgICAgICAqL1xuICAgIGNhc2UgJ25vLXJlZmVycmVyLXdoZW4tZG93bmdyYWRlJzogLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLyoqXG4gICAgICAgKiAxLiBJZiByZWZlcnJlclVSTCBpcyBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCBhbmRcbiAgICAgICAqIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMIGlzIG5vdCBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCxcbiAgICAgICAqIHRoZW4gcmV0dXJuIG5vIHJlZmVycmVyLlxuICAgICAgICogMi4gUmV0dXJuIHJlZmVycmVyT3JpZ2luXG4gICAgICAqL1xuXG4gICAgZGVmYXVsdDogLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgcmV0dXJuIGlzTm9uUG90ZW50aWFsbHlUcnVzdFdvcnRoeSA/ICduby1yZWZlcnJlcicgOiByZWZlcnJlck9yaWdpblxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXJlZmVycmVyLXBvbGljeS8jc3RyaXAtdXJsXG4gKiBAcGFyYW0ge1VSTH0gdXJsXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBvcmlnaW5Pbmx5XG4gKi9cbmZ1bmN0aW9uIHN0cmlwVVJMRm9yUmVmZXJyZXIgKHVybCwgb3JpZ2luT25seSkge1xuICAvLyAxLiBBc3NlcnQ6IHVybCBpcyBhIFVSTC5cbiAgYXNzZXJ0KHVybCBpbnN0YW5jZW9mIFVSTClcblxuICAvLyAyLiBJZiB1cmzigJlzIHNjaGVtZSBpcyBhIGxvY2FsIHNjaGVtZSwgdGhlbiByZXR1cm4gbm8gcmVmZXJyZXIuXG4gIGlmICh1cmwucHJvdG9jb2wgPT09ICdmaWxlOicgfHwgdXJsLnByb3RvY29sID09PSAnYWJvdXQ6JyB8fCB1cmwucHJvdG9jb2wgPT09ICdibGFuazonKSB7XG4gICAgcmV0dXJuICduby1yZWZlcnJlcidcbiAgfVxuXG4gIC8vIDMuIFNldCB1cmzigJlzIHVzZXJuYW1lIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gIHVybC51c2VybmFtZSA9ICcnXG5cbiAgLy8gNC4gU2V0IHVybOKAmXMgcGFzc3dvcmQgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgdXJsLnBhc3N3b3JkID0gJydcblxuICAvLyA1LiBTZXQgdXJs4oCZcyBmcmFnbWVudCB0byBudWxsLlxuICB1cmwuaGFzaCA9ICcnXG5cbiAgLy8gNi4gSWYgdGhlIG9yaWdpbi1vbmx5IGZsYWcgaXMgdHJ1ZSwgdGhlbjpcbiAgaWYgKG9yaWdpbk9ubHkpIHtcbiAgICAvLyAxLiBTZXQgdXJs4oCZcyBwYXRoIHRvIMKrIHRoZSBlbXB0eSBzdHJpbmcgwrsuXG4gICAgdXJsLnBhdGhuYW1lID0gJydcblxuICAgIC8vIDIuIFNldCB1cmzigJlzIHF1ZXJ5IHRvIG51bGwuXG4gICAgdXJsLnNlYXJjaCA9ICcnXG4gIH1cblxuICAvLyA3LiBSZXR1cm4gdXJsLlxuICByZXR1cm4gdXJsXG59XG5cbmZ1bmN0aW9uIGlzVVJMUG90ZW50aWFsbHlUcnVzdHdvcnRoeSAodXJsKSB7XG4gIGlmICghKHVybCBpbnN0YW5jZW9mIFVSTCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIElmIGNoaWxkIG9mIGFib3V0LCByZXR1cm4gdHJ1ZVxuICBpZiAodXJsLmhyZWYgPT09ICdhYm91dDpibGFuaycgfHwgdXJsLmhyZWYgPT09ICdhYm91dDpzcmNkb2MnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIElmIHNjaGVtZSBpcyBkYXRhLCByZXR1cm4gdHJ1ZVxuICBpZiAodXJsLnByb3RvY29sID09PSAnZGF0YTonKSByZXR1cm4gdHJ1ZVxuXG4gIC8vIElmIGZpbGUsIHJldHVybiB0cnVlXG4gIGlmICh1cmwucHJvdG9jb2wgPT09ICdmaWxlOicpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIGlzT3JpZ2luUG90ZW50aWFsbHlUcnVzdHdvcnRoeSh1cmwub3JpZ2luKVxuXG4gIGZ1bmN0aW9uIGlzT3JpZ2luUG90ZW50aWFsbHlUcnVzdHdvcnRoeSAob3JpZ2luKSB7XG4gICAgLy8gSWYgb3JpZ2luIGlzIGV4cGxpY2l0bHkgbnVsbCwgcmV0dXJuIGZhbHNlXG4gICAgaWYgKG9yaWdpbiA9PSBudWxsIHx8IG9yaWdpbiA9PT0gJ251bGwnKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IG9yaWdpbkFzVVJMID0gbmV3IFVSTChvcmlnaW4pXG5cbiAgICAvLyBJZiBzZWN1cmUsIHJldHVybiB0cnVlXG4gICAgaWYgKG9yaWdpbkFzVVJMLnByb3RvY29sID09PSAnaHR0cHM6JyB8fCBvcmlnaW5Bc1VSTC5wcm90b2NvbCA9PT0gJ3dzczonKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIGxvY2FsaG9zdCBvciB2YXJpYW50cywgcmV0dXJuIHRydWVcbiAgICBpZiAoL14xMjcoPzpcXC5bMC05XSspezAsMn1cXC5bMC05XSskfF5cXFsoPzowKjopKj86PzAqMVxcXSQvLnRlc3Qob3JpZ2luQXNVUkwuaG9zdG5hbWUpIHx8XG4gICAgIChvcmlnaW5Bc1VSTC5ob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgfHwgb3JpZ2luQXNVUkwuaG9zdG5hbWUuaW5jbHVkZXMoJ2xvY2FsaG9zdC4nKSkgfHxcbiAgICAgKG9yaWdpbkFzVVJMLmhvc3RuYW1lLmVuZHNXaXRoKCcubG9jYWxob3N0JykpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIGFueSBvdGhlciwgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtc3VicmVzb3VyY2UtaW50ZWdyaXR5LyNkb2VzLXJlc3BvbnNlLW1hdGNoLW1ldGFkYXRhbGlzdFxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICogQHBhcmFtIHtzdHJpbmd9IG1ldGFkYXRhTGlzdFxuICovXG5mdW5jdGlvbiBieXRlc01hdGNoIChieXRlcywgbWV0YWRhdGFMaXN0KSB7XG4gIC8vIElmIG5vZGUgaXMgbm90IGJ1aWx0IHdpdGggT3BlblNTTCBzdXBwb3J0LCB3ZSBjYW5ub3QgY2hlY2tcbiAgLy8gYSByZXF1ZXN0J3MgaW50ZWdyaXR5LCBzbyBhbGxvdyBpdCBieSBkZWZhdWx0ICh0aGUgc3BlYyB3aWxsXG4gIC8vIGFsbG93IHJlcXVlc3RzIGlmIGFuIGludmFsaWQgaGFzaCBpcyBnaXZlbiwgYXMgcHJlY2VkZW5jZSkuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZjogb25seSBpZiBub2RlIGlzIGJ1aWx0IHdpdGggLS13aXRob3V0LXNzbCAqL1xuICBpZiAoY3J5cHRvID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gMS4gTGV0IHBhcnNlZE1ldGFkYXRhIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyBtZXRhZGF0YUxpc3QuXG4gIGNvbnN0IHBhcnNlZE1ldGFkYXRhID0gcGFyc2VNZXRhZGF0YShtZXRhZGF0YUxpc3QpXG5cbiAgLy8gMi4gSWYgcGFyc2VkTWV0YWRhdGEgaXMgbm8gbWV0YWRhdGEsIHJldHVybiB0cnVlLlxuICBpZiAocGFyc2VkTWV0YWRhdGEgPT09ICdubyBtZXRhZGF0YScpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gMy4gSWYgcmVzcG9uc2UgaXMgbm90IGVsaWdpYmxlIGZvciBpbnRlZ3JpdHkgdmFsaWRhdGlvbiwgcmV0dXJuIGZhbHNlLlxuICAvLyBUT0RPXG5cbiAgLy8gNC4gSWYgcGFyc2VkTWV0YWRhdGEgaXMgdGhlIGVtcHR5IHNldCwgcmV0dXJuIHRydWUuXG4gIGlmIChwYXJzZWRNZXRhZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gNS4gTGV0IG1ldGFkYXRhIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyB0aGUgc3Ryb25nZXN0XG4gIC8vICAgIG1ldGFkYXRhIGZyb20gcGFyc2VkTWV0YWRhdGEuXG4gIGNvbnN0IHN0cm9uZ2VzdCA9IGdldFN0cm9uZ2VzdE1ldGFkYXRhKHBhcnNlZE1ldGFkYXRhKVxuICBjb25zdCBtZXRhZGF0YSA9IGZpbHRlck1ldGFkYXRhTGlzdEJ5QWxnb3JpdGhtKHBhcnNlZE1ldGFkYXRhLCBzdHJvbmdlc3QpXG5cbiAgLy8gNi4gRm9yIGVhY2ggaXRlbSBpbiBtZXRhZGF0YTpcbiAgZm9yIChjb25zdCBpdGVtIG9mIG1ldGFkYXRhKSB7XG4gICAgLy8gMS4gTGV0IGFsZ29yaXRobSBiZSB0aGUgYWxnIGNvbXBvbmVudCBvZiBpdGVtLlxuICAgIGNvbnN0IGFsZ29yaXRobSA9IGl0ZW0uYWxnb1xuXG4gICAgLy8gMi4gTGV0IGV4cGVjdGVkVmFsdWUgYmUgdGhlIHZhbCBjb21wb25lbnQgb2YgaXRlbS5cbiAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gaXRlbS5oYXNoXG5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYi1wbGF0Zm9ybS10ZXN0cy93cHQvY29tbWl0L2U0YzVjYzdhNWU0ODA5MzIyMDUyOGRmZGQxYzQwMTJkYzM4MzdhMGVcbiAgICAvLyBcImJlIGxpYmVyYWwgd2l0aCBwYWRkaW5nXCIuIFRoaXMgaXMgYW5ub3lpbmcsIGFuZCBpdCdzIG5vdCBldmVuIGluIHRoZSBzcGVjLlxuXG4gICAgLy8gMy4gTGV0IGFjdHVhbFZhbHVlIGJlIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYWxnb3JpdGhtIHRvIGJ5dGVzLlxuICAgIGxldCBhY3R1YWxWYWx1ZSA9IGNyeXB0by5jcmVhdGVIYXNoKGFsZ29yaXRobSkudXBkYXRlKGJ5dGVzKS5kaWdlc3QoJ2Jhc2U2NCcpXG5cbiAgICBpZiAoYWN0dWFsVmFsdWVbYWN0dWFsVmFsdWUubGVuZ3RoIC0gMV0gPT09ICc9Jykge1xuICAgICAgaWYgKGFjdHVhbFZhbHVlW2FjdHVhbFZhbHVlLmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgYWN0dWFsVmFsdWUgPSBhY3R1YWxWYWx1ZS5zbGljZSgwLCAtMilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdHVhbFZhbHVlID0gYWN0dWFsVmFsdWUuc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gSWYgYWN0dWFsVmFsdWUgaXMgYSBjYXNlLXNlbnNpdGl2ZSBtYXRjaCBmb3IgZXhwZWN0ZWRWYWx1ZSxcbiAgICAvLyAgICByZXR1cm4gdHJ1ZS5cbiAgICBpZiAoY29tcGFyZUJhc2U2NE1peGVkKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvLyA3LiBSZXR1cm4gZmFsc2UuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXN1YnJlc291cmNlLWludGVncml0eS8jZ3JhbW1hcmRlZi1oYXNoLXdpdGgtb3B0aW9uc1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDIvI3NvdXJjZS1saXN0LXN5bnRheFxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzUyMzQjYXBwZW5kaXgtQi4xXG5jb25zdCBwYXJzZUhhc2hXaXRoT3B0aW9ucyA9IC8oPzxhbGdvPnNoYTI1NnxzaGEzODR8c2hhNTEyKS0oKD88aGFzaD5bQS1aYS16MC05Ky9dK3xbQS1aYS16MC05Xy1dKyk9ezAsMn0oPzpcXHN8JCkoICtbIS1+XSopPyk/L2lcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtc3VicmVzb3VyY2UtaW50ZWdyaXR5LyNwYXJzZS1tZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGFkYXRhXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEgKG1ldGFkYXRhKSB7XG4gIC8vIDEuIExldCByZXN1bHQgYmUgdGhlIGVtcHR5IHNldC5cbiAgLyoqIEB0eXBlIHt7IGFsZ286IHN0cmluZywgaGFzaDogc3RyaW5nIH1bXX0gKi9cbiAgY29uc3QgcmVzdWx0ID0gW11cblxuICAvLyAyLiBMZXQgZW1wdHkgYmUgZXF1YWwgdG8gdHJ1ZS5cbiAgbGV0IGVtcHR5ID0gdHJ1ZVxuXG4gIC8vIDMuIEZvciBlYWNoIHRva2VuIHJldHVybmVkIGJ5IHNwbGl0dGluZyBtZXRhZGF0YSBvbiBzcGFjZXM6XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgbWV0YWRhdGEuc3BsaXQoJyAnKSkge1xuICAgIC8vIDEuIFNldCBlbXB0eSB0byBmYWxzZS5cbiAgICBlbXB0eSA9IGZhbHNlXG5cbiAgICAvLyAyLiBQYXJzZSB0b2tlbiBhcyBhIGhhc2gtd2l0aC1vcHRpb25zLlxuICAgIGNvbnN0IHBhcnNlZFRva2VuID0gcGFyc2VIYXNoV2l0aE9wdGlvbnMuZXhlYyh0b2tlbilcblxuICAgIC8vIDMuIElmIHRva2VuIGRvZXMgbm90IHBhcnNlLCBjb250aW51ZSB0byB0aGUgbmV4dCB0b2tlbi5cbiAgICBpZiAoXG4gICAgICBwYXJzZWRUb2tlbiA9PT0gbnVsbCB8fFxuICAgICAgcGFyc2VkVG9rZW4uZ3JvdXBzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHBhcnNlZFRva2VuLmdyb3Vwcy5hbGdvID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIC8vIE5vdGU6IENocm9taXVtIGJsb2NrcyB0aGUgcmVxdWVzdCBhdCB0aGlzIHBvaW50LCBidXQgRmlyZWZveFxuICAgICAgLy8gZ2l2ZXMgYSB3YXJuaW5nIHRoYXQgYW4gaW52YWxpZCBpbnRlZ3JpdHkgd2FzIGdpdmVuLiBUaGVcbiAgICAgIC8vIGNvcnJlY3QgYmVoYXZpb3IgaXMgdG8gaWdub3JlIHRoZXNlLCBhbmQgc3Vic2VxdWVudGx5IG5vdFxuICAgICAgLy8gY2hlY2sgdGhlIGludGVncml0eSBvZiB0aGUgcmVzb3VyY2UuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIDQuIExldCBhbGdvcml0aG0gYmUgdGhlIGhhc2gtYWxnbyBjb21wb25lbnQgb2YgdG9rZW4uXG4gICAgY29uc3QgYWxnb3JpdGhtID0gcGFyc2VkVG9rZW4uZ3JvdXBzLmFsZ28udG9Mb3dlckNhc2UoKVxuXG4gICAgLy8gNS4gSWYgYWxnb3JpdGhtIGlzIGEgaGFzaCBmdW5jdGlvbiByZWNvZ25pemVkIGJ5IHRoZSB1c2VyXG4gICAgLy8gICAgYWdlbnQsIGFkZCB0aGUgcGFyc2VkIHRva2VuIHRvIHJlc3VsdC5cbiAgICBpZiAoc3VwcG9ydGVkSGFzaGVzLmluY2x1ZGVzKGFsZ29yaXRobSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHBhcnNlZFRva2VuLmdyb3VwcylcbiAgICB9XG4gIH1cblxuICAvLyA0LiBSZXR1cm4gbm8gbWV0YWRhdGEgaWYgZW1wdHkgaXMgdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiByZXN1bHQuXG4gIGlmIChlbXB0eSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAnbm8gbWV0YWRhdGEnXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogQHBhcmFtIHt7IGFsZ286ICdzaGEyNTYnIHwgJ3NoYTM4NCcgfCAnc2hhNTEyJyB9W119IG1ldGFkYXRhTGlzdFxuICovXG5mdW5jdGlvbiBnZXRTdHJvbmdlc3RNZXRhZGF0YSAobWV0YWRhdGFMaXN0KSB7XG4gIC8vIExldCBhbGdvcml0aG0gYmUgdGhlIGFsZ28gY29tcG9uZW50IG9mIHRoZSBmaXJzdCBpdGVtIGluIG1ldGFkYXRhTGlzdC5cbiAgLy8gQ2FuIGJlIHNoYTI1NlxuICBsZXQgYWxnb3JpdGhtID0gbWV0YWRhdGFMaXN0WzBdLmFsZ29cbiAgLy8gSWYgdGhlIGFsZ29yaXRobSBpcyBzaGE1MTIsIHRoZW4gaXQgaXMgdGhlIHN0cm9uZ2VzdFxuICAvLyBhbmQgd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseVxuICBpZiAoYWxnb3JpdGhtWzNdID09PSAnNScpIHtcbiAgICByZXR1cm4gYWxnb3JpdGhtXG4gIH1cblxuICBmb3IgKGxldCBpID0gMTsgaSA8IG1ldGFkYXRhTGlzdC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gbWV0YWRhdGFMaXN0W2ldXG4gICAgLy8gSWYgdGhlIGFsZ29yaXRobSBpcyBzaGE1MTIsIHRoZW4gaXQgaXMgdGhlIHN0cm9uZ2VzdFxuICAgIC8vIGFuZCB3ZSBjYW4gYnJlYWsgdGhlIGxvb3AgaW1tZWRpYXRlbHlcbiAgICBpZiAobWV0YWRhdGEuYWxnb1szXSA9PT0gJzUnKSB7XG4gICAgICBhbGdvcml0aG0gPSAnc2hhNTEyJ1xuICAgICAgYnJlYWtcbiAgICAvLyBJZiB0aGUgYWxnb3JpdGhtIGlzIHNoYTM4NCwgdGhlbiBhIHBvdGVudGlhbCBzaGEyNTYgb3Igc2hhMzg0IGlzIGlnbm9yZWRcbiAgICB9IGVsc2UgaWYgKGFsZ29yaXRobVszXSA9PT0gJzMnKSB7XG4gICAgICBjb250aW51ZVxuICAgIC8vIGFsZ29yaXRobSBpcyBzaGEyNTYsIGNoZWNrIGlmIGFsZ29yaXRobSBpcyBzaGEzODQgYW5kIGlmIHNvLCBzZXQgaXQgYXNcbiAgICAvLyB0aGUgc3Ryb25nZXN0XG4gICAgfSBlbHNlIGlmIChtZXRhZGF0YS5hbGdvWzNdID09PSAnMycpIHtcbiAgICAgIGFsZ29yaXRobSA9ICdzaGEzODQnXG4gICAgfVxuICB9XG4gIHJldHVybiBhbGdvcml0aG1cbn1cblxuZnVuY3Rpb24gZmlsdGVyTWV0YWRhdGFMaXN0QnlBbGdvcml0aG0gKG1ldGFkYXRhTGlzdCwgYWxnb3JpdGhtKSB7XG4gIGlmIChtZXRhZGF0YUxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhTGlzdFxuICB9XG5cbiAgbGV0IHBvcyA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRhZGF0YUxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobWV0YWRhdGFMaXN0W2ldLmFsZ28gPT09IGFsZ29yaXRobSkge1xuICAgICAgbWV0YWRhdGFMaXN0W3BvcysrXSA9IG1ldGFkYXRhTGlzdFtpXVxuICAgIH1cbiAgfVxuXG4gIG1ldGFkYXRhTGlzdC5sZW5ndGggPSBwb3NcblxuICByZXR1cm4gbWV0YWRhdGFMaXN0XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGJhc2U2NCBzdHJpbmdzLCBhbGxvd2luZyBmb3IgYmFzZTY0dXJsXG4gKiBpbiB0aGUgc2Vjb25kIHN0cmluZy5cbiAqXG4qIEBwYXJhbSB7c3RyaW5nfSBhY3R1YWxWYWx1ZSBhbHdheXMgYmFzZTY0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRWYWx1ZSBiYXNlNjQgb3IgYmFzZTY0dXJsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJhc2U2NE1peGVkIChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkge1xuICBpZiAoYWN0dWFsVmFsdWUubGVuZ3RoICE9PSBleHBlY3RlZFZhbHVlLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsVmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoYWN0dWFsVmFsdWVbaV0gIT09IGV4cGVjdGVkVmFsdWVbaV0pIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGFjdHVhbFZhbHVlW2ldID09PSAnKycgJiYgZXhwZWN0ZWRWYWx1ZVtpXSA9PT0gJy0nKSB8fFxuICAgICAgICAoYWN0dWFsVmFsdWVbaV0gPT09ICcvJyAmJiBleHBlY3RlZFZhbHVlW2ldID09PSAnXycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtdXBncmFkZS1pbnNlY3VyZS1yZXF1ZXN0cy8jdXBncmFkZS1yZXF1ZXN0XG5mdW5jdGlvbiB0cnlVcGdyYWRlUmVxdWVzdFRvQVBvdGVudGlhbGx5VHJ1c3R3b3J0aHlVUkwgKHJlcXVlc3QpIHtcbiAgLy8gVE9ET1xufVxuXG4vKipcbiAqIEBsaW5rIHtodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9vcmlnaW4uaHRtbCNzYW1lLW9yaWdpbn1cbiAqIEBwYXJhbSB7VVJMfSBBXG4gKiBAcGFyYW0ge1VSTH0gQlxuICovXG5mdW5jdGlvbiBzYW1lT3JpZ2luIChBLCBCKSB7XG4gIC8vIDEuIElmIEEgYW5kIEIgYXJlIHRoZSBzYW1lIG9wYXF1ZSBvcmlnaW4sIHRoZW4gcmV0dXJuIHRydWUuXG4gIGlmIChBLm9yaWdpbiA9PT0gQi5vcmlnaW4gJiYgQS5vcmlnaW4gPT09ICdudWxsJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyAyLiBJZiBBIGFuZCBCIGFyZSBib3RoIHR1cGxlIG9yaWdpbnMgYW5kIHRoZWlyIHNjaGVtZXMsXG4gIC8vICAgIGhvc3RzLCBhbmQgcG9ydCBhcmUgaWRlbnRpY2FsLCB0aGVuIHJldHVybiB0cnVlLlxuICBpZiAoQS5wcm90b2NvbCA9PT0gQi5wcm90b2NvbCAmJiBBLmhvc3RuYW1lID09PSBCLmhvc3RuYW1lICYmIEEucG9ydCA9PT0gQi5wb3J0KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIDMuIFJldHVybiBmYWxzZS5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmVycmVkUHJvbWlzZSAoKSB7XG4gIGxldCByZXNcbiAgbGV0IHJlalxuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlcyA9IHJlc29sdmVcbiAgICByZWogPSByZWplY3RcbiAgfSlcblxuICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlOiByZXMsIHJlamVjdDogcmVqIH1cbn1cblxuZnVuY3Rpb24gaXNBYm9ydGVkIChmZXRjaFBhcmFtcykge1xuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ2Fib3J0ZWQnXG59XG5cbmZ1bmN0aW9uIGlzQ2FuY2VsbGVkIChmZXRjaFBhcmFtcykge1xuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ2Fib3J0ZWQnIHx8XG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ3Rlcm1pbmF0ZWQnXG59XG5cbmNvbnN0IG5vcm1hbGl6ZU1ldGhvZFJlY29yZCA9IHtcbiAgZGVsZXRlOiAnREVMRVRFJyxcbiAgREVMRVRFOiAnREVMRVRFJyxcbiAgZ2V0OiAnR0VUJyxcbiAgR0VUOiAnR0VUJyxcbiAgaGVhZDogJ0hFQUQnLFxuICBIRUFEOiAnSEVBRCcsXG4gIG9wdGlvbnM6ICdPUFRJT05TJyxcbiAgT1BUSU9OUzogJ09QVElPTlMnLFxuICBwb3N0OiAnUE9TVCcsXG4gIFBPU1Q6ICdQT1NUJyxcbiAgcHV0OiAnUFVUJyxcbiAgUFVUOiAnUFVUJ1xufVxuXG4vLyBOb3RlOiBvYmplY3QgcHJvdG90eXBlcyBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgcmVmZXJlbmNlZC4gZS5nLiBgT2JqZWN0I2hhc093blByb3BlcnR5YC5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihub3JtYWxpemVNZXRob2RSZWNvcmQsIG51bGwpXG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1tZXRob2Qtbm9ybWFsaXplXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZCAobWV0aG9kKSB7XG4gIHJldHVybiBub3JtYWxpemVNZXRob2RSZWNvcmRbbWV0aG9kLnRvTG93ZXJDYXNlKCldID8/IG1ldGhvZFxufVxuXG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc2VyaWFsaXplLWEtamF2YXNjcmlwdC12YWx1ZS10by1hLWpzb24tc3RyaW5nXG5mdW5jdGlvbiBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcgKHZhbHVlKSB7XG4gIC8vIDEuIExldCByZXN1bHQgYmUgPyBDYWxsKCVKU09OLnN0cmluZ2lmeSUsIHVuZGVmaW5lZCwgwqsgdmFsdWUgwrspLlxuICBjb25zdCByZXN1bHQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcblxuICAvLyAyLiBJZiByZXN1bHQgaXMgdW5kZWZpbmVkLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdWYWx1ZSBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUnKVxuICB9XG5cbiAgLy8gMy4gQXNzZXJ0OiByZXN1bHQgaXMgYSBzdHJpbmcuXG4gIGFzc2VydCh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJylcblxuICAvLyA0LiBSZXR1cm4gcmVzdWx0LlxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJTI1aXRlcmF0b3Jwcm90b3R5cGUlMjUtb2JqZWN0XG5jb25zdCBlc0l0ZXJhdG9yUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihbXVtTeW1ib2wuaXRlcmF0b3JdKCkpKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNkZm4taXRlcmF0b3ItcHJvdG90eXBlLW9iamVjdFxuICogQHBhcmFtIHsoKSA9PiB1bmtub3duW119IGl0ZXJhdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBpbnN0YW5jZVxuICogQHBhcmFtIHsna2V5J3wndmFsdWUnfCdrZXkrdmFsdWUnfSBraW5kXG4gKi9cbmZ1bmN0aW9uIG1ha2VJdGVyYXRvciAoaXRlcmF0b3IsIG5hbWUsIGtpbmQpIHtcbiAgY29uc3Qgb2JqZWN0ID0ge1xuICAgIGluZGV4OiAwLFxuICAgIGtpbmQsXG4gICAgdGFyZ2V0OiBpdGVyYXRvclxuICB9XG5cbiAgY29uc3QgaSA9IHtcbiAgICBuZXh0ICgpIHtcbiAgICAgIC8vIDEuIExldCBpbnRlcmZhY2UgYmUgdGhlIGludGVyZmFjZSBmb3Igd2hpY2ggdGhlIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgZXhpc3RzLlxuXG4gICAgICAvLyAyLiBMZXQgdGhpc1ZhbHVlIGJlIHRoZSB0aGlzIHZhbHVlLlxuXG4gICAgICAvLyAzLiBMZXQgb2JqZWN0IGJlID8gVG9PYmplY3QodGhpc1ZhbHVlKS5cblxuICAgICAgLy8gNC4gSWYgb2JqZWN0IGlzIGEgcGxhdGZvcm0gb2JqZWN0LCB0aGVuIHBlcmZvcm0gYSBzZWN1cml0eVxuICAgICAgLy8gICAgY2hlY2ssIHBhc3Npbmc6XG5cbiAgICAgIC8vIDUuIElmIG9iamVjdCBpcyBub3QgYSBkZWZhdWx0IGl0ZXJhdG9yIG9iamVjdCBmb3IgaW50ZXJmYWNlLFxuICAgICAgLy8gICAgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykgIT09IGkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgJ25leHQnIGNhbGxlZCBvbiBhbiBvYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgaW50ZXJmYWNlICR7bmFtZX0gSXRlcmF0b3IuYFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDYuIExldCBpbmRleCBiZSBvYmplY3TigJlzIGluZGV4LlxuICAgICAgLy8gNy4gTGV0IGtpbmQgYmUgb2JqZWN04oCZcyBraW5kLlxuICAgICAgLy8gOC4gTGV0IHZhbHVlcyBiZSBvYmplY3TigJlzIHRhcmdldCdzIHZhbHVlIHBhaXJzIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgIGNvbnN0IHsgaW5kZXgsIGtpbmQsIHRhcmdldCB9ID0gb2JqZWN0XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0YXJnZXQoKVxuXG4gICAgICAvLyA5LiBMZXQgbGVuIGJlIHRoZSBsZW5ndGggb2YgdmFsdWVzLlxuICAgICAgY29uc3QgbGVuID0gdmFsdWVzLmxlbmd0aFxuXG4gICAgICAvLyAxMC4gSWYgaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGxlbiwgdGhlbiByZXR1cm5cbiAgICAgIC8vICAgICBDcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSkuXG4gICAgICBpZiAoaW5kZXggPj0gbGVuKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfVxuICAgICAgfVxuXG4gICAgICAvLyAxMS4gTGV0IHBhaXIgYmUgdGhlIGVudHJ5IGluIHZhbHVlcyBhdCBpbmRleCBpbmRleC5cbiAgICAgIGNvbnN0IHBhaXIgPSB2YWx1ZXNbaW5kZXhdXG5cbiAgICAgIC8vIDEyLiBTZXQgb2JqZWN04oCZcyBpbmRleCB0byBpbmRleCArIDEuXG4gICAgICBvYmplY3QuaW5kZXggPSBpbmRleCArIDFcblxuICAgICAgLy8gMTMuIFJldHVybiB0aGUgaXRlcmF0b3IgcmVzdWx0IGZvciBwYWlyIGFuZCBraW5kLlxuICAgICAgcmV0dXJuIGl0ZXJhdG9yUmVzdWx0KHBhaXIsIGtpbmQpXG4gICAgfSxcbiAgICAvLyBUaGUgY2xhc3Mgc3RyaW5nIG9mIGFuIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgZm9yIGEgZ2l2ZW4gaW50ZXJmYWNlIGlzIHRoZVxuICAgIC8vIHJlc3VsdCBvZiBjb25jYXRlbmF0aW5nIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBzdHJpbmcgXCIgSXRlcmF0b3JcIi5cbiAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogYCR7bmFtZX0gSXRlcmF0b3JgXG4gIH1cblxuICAvLyBUaGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBzbG90IG9mIGFuIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgbXVzdCBiZSAlSXRlcmF0b3JQcm90b3R5cGUlLlxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoaSwgZXNJdGVyYXRvclByb3RvdHlwZSlcbiAgLy8gZXNJdGVyYXRvclByb3RvdHlwZSBuZWVkcyB0byBiZSB0aGUgcHJvdG90eXBlIG9mIGlcbiAgLy8gd2hpY2ggaXMgdGhlIHByb3RvdHlwZSBvZiBhbiBlbXB0eSBvYmplY3QuIFllcywgaXQncyBjb25mdXNpbmcuXG4gIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yoe30sIGkpXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jaXRlcmF0b3ItcmVzdWx0XG5mdW5jdGlvbiBpdGVyYXRvclJlc3VsdCAocGFpciwga2luZCkge1xuICBsZXQgcmVzdWx0XG5cbiAgLy8gMS4gTGV0IHJlc3VsdCBiZSBhIHZhbHVlIGRldGVybWluZWQgYnkgdGhlIHZhbHVlIG9mIGtpbmQ6XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ2tleSc6IHtcbiAgICAgIC8vIDEuIExldCBpZGxLZXkgYmUgcGFpcuKAmXMga2V5LlxuICAgICAgLy8gMi4gTGV0IGtleSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsS2V5IHRvIGFuXG4gICAgICAvLyAgICBFQ01BU2NyaXB0IHZhbHVlLlxuICAgICAgLy8gMy4gcmVzdWx0IGlzIGtleS5cbiAgICAgIHJlc3VsdCA9IHBhaXJbMF1cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgJ3ZhbHVlJzoge1xuICAgICAgLy8gMS4gTGV0IGlkbFZhbHVlIGJlIHBhaXLigJlzIHZhbHVlLlxuICAgICAgLy8gMi4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBpZGxWYWx1ZSB0b1xuICAgICAgLy8gICAgYW4gRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgIC8vIDMuIHJlc3VsdCBpcyB2YWx1ZS5cbiAgICAgIHJlc3VsdCA9IHBhaXJbMV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgJ2tleSt2YWx1ZSc6IHtcbiAgICAgIC8vIDEuIExldCBpZGxLZXkgYmUgcGFpcuKAmXMga2V5LlxuICAgICAgLy8gMi4gTGV0IGlkbFZhbHVlIGJlIHBhaXLigJlzIHZhbHVlLlxuICAgICAgLy8gMy4gTGV0IGtleSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsS2V5IHRvIGFuXG4gICAgICAvLyAgICBFQ01BU2NyaXB0IHZhbHVlLlxuICAgICAgLy8gNC4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBpZGxWYWx1ZSB0b1xuICAgICAgLy8gICAgYW4gRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgIC8vIDUuIExldCBhcnJheSBiZSAhIEFycmF5Q3JlYXRlKDIpLlxuICAgICAgLy8gNi4gQ2FsbCAhIENyZWF0ZURhdGFQcm9wZXJ0eShhcnJheSwgXCIwXCIsIGtleSkuXG4gICAgICAvLyA3LiBDYWxsICEgQ3JlYXRlRGF0YVByb3BlcnR5KGFycmF5LCBcIjFcIiwgdmFsdWUpLlxuICAgICAgLy8gOC4gcmVzdWx0IGlzIGFycmF5LlxuICAgICAgcmVzdWx0ID0gcGFpclxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyAyLiBSZXR1cm4gQ3JlYXRlSXRlclJlc3VsdE9iamVjdChyZXN1bHQsIGZhbHNlKS5cbiAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2JvZHktZnVsbHktcmVhZFxuICovXG5hc3luYyBmdW5jdGlvbiBmdWxseVJlYWRCb2R5IChib2R5LCBwcm9jZXNzQm9keSwgcHJvY2Vzc0JvZHlFcnJvcikge1xuICAvLyAxLiBJZiB0YXNrRGVzdGluYXRpb24gaXMgbnVsbCwgdGhlbiBzZXQgdGFza0Rlc3RpbmF0aW9uIHRvXG4gIC8vICAgIHRoZSByZXN1bHQgb2Ygc3RhcnRpbmcgYSBuZXcgcGFyYWxsZWwgcXVldWUuXG5cbiAgLy8gMi4gTGV0IHN1Y2Nlc3NTdGVwcyBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgYnl0ZXMgYmUgdG8gcXVldWUgYVxuICAvLyAgICBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keSBnaXZlbiBieXRlcywgd2l0aCB0YXNrRGVzdGluYXRpb24uXG4gIGNvbnN0IHN1Y2Nlc3NTdGVwcyA9IHByb2Nlc3NCb2R5XG5cbiAgLy8gMy4gTGV0IGVycm9yU3RlcHMgYmUgdG8gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keUVycm9yLFxuICAvLyAgICB3aXRoIHRhc2tEZXN0aW5hdGlvbi5cbiAgY29uc3QgZXJyb3JTdGVwcyA9IHByb2Nlc3NCb2R5RXJyb3JcblxuICAvLyA0LiBMZXQgcmVhZGVyIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBhIHJlYWRlciBmb3IgYm9keeKAmXMgc3RyZWFtLlxuICAvLyAgICBJZiB0aGF0IHRocmV3IGFuIGV4Y2VwdGlvbiwgdGhlbiBydW4gZXJyb3JTdGVwcyB3aXRoIHRoYXRcbiAgLy8gICAgZXhjZXB0aW9uIGFuZCByZXR1cm4uXG4gIGxldCByZWFkZXJcblxuICB0cnkge1xuICAgIHJlYWRlciA9IGJvZHkuc3RyZWFtLmdldFJlYWRlcigpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvclN0ZXBzKGUpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA1LiBSZWFkIGFsbCBieXRlcyBmcm9tIHJlYWRlciwgZ2l2ZW4gc3VjY2Vzc1N0ZXBzIGFuZCBlcnJvclN0ZXBzLlxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRBbGxCeXRlcyhyZWFkZXIpXG4gICAgc3VjY2Vzc1N0ZXBzKHJlc3VsdClcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yU3RlcHMoZSlcbiAgfVxufVxuXG4vKiogQHR5cGUge1JlYWRhYmxlU3RyZWFtfSAqL1xubGV0IFJlYWRhYmxlU3RyZWFtID0gZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbVxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtTGlrZSAoc3RyZWFtKSB7XG4gIGlmICghUmVhZGFibGVTdHJlYW0pIHtcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgcmV0dXJuIHN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtIHx8IChcbiAgICBzdHJlYW1bU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ1JlYWRhYmxlU3RyZWFtJyAmJlxuICAgIHR5cGVvZiBzdHJlYW0udGVlID09PSAnZnVuY3Rpb24nXG4gIClcbn1cblxuY29uc3QgTUFYSU1VTV9BUkdVTUVOVF9MRU5HVEggPSA2NTUzNVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2lzb21vcnBoaWMtZGVjb2RlXG4gKiBAcGFyYW0ge251bWJlcltdfFVpbnQ4QXJyYXl9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGlzb21vcnBoaWNEZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIFRvIGlzb21vcnBoaWMgZGVjb2RlIGEgYnl0ZSBzZXF1ZW5jZSBpbnB1dCwgcmV0dXJuIGEgc3RyaW5nIHdob3NlIGNvZGUgcG9pbnRcbiAgLy8gICAgbGVuZ3RoIGlzIGVxdWFsIHRvIGlucHV04oCZcyBsZW5ndGggYW5kIHdob3NlIGNvZGUgcG9pbnRzIGhhdmUgdGhlIHNhbWUgdmFsdWVzXG4gIC8vICAgIGFzIHRoZSB2YWx1ZXMgb2YgaW5wdXTigJlzIGJ5dGVzLCBpbiB0aGUgc2FtZSBvcmRlci5cblxuICBpZiAoaW5wdXQubGVuZ3RoIDwgTUFYSU1VTV9BUkdVTUVOVF9MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pbnB1dClcbiAgfVxuXG4gIHJldHVybiBpbnB1dC5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiBwcmV2aW91cyArIFN0cmluZy5mcm9tQ2hhckNvZGUoY3VycmVudCksICcnKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVhZGFibGVTdHJlYW1Db250cm9sbGVyPFVpbnQ4QXJyYXk+fSBjb250cm9sbGVyXG4gKi9cbmZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtQ2xvc2UgKGNvbnRyb2xsZXIpIHtcbiAgdHJ5IHtcbiAgICBjb250cm9sbGVyLmNsb3NlKClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gVE9ETzogYWRkIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgdGhpcyBlcnJvciBvY2N1cnMuXG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcygnQ29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZCcpKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNpc29tb3JwaGljLWVuY29kZVxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGlzb21vcnBoaWNFbmNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIEFzc2VydDogaW5wdXQgY29udGFpbnMgbm8gY29kZSBwb2ludHMgZ3JlYXRlciB0aGFuIFUrMDBGRi5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGFzc2VydChpbnB1dC5jaGFyQ29kZUF0KGkpIDw9IDB4RkYpXG4gIH1cblxuICAvLyAyLiBSZXR1cm4gYSBieXRlIHNlcXVlbmNlIHdob3NlIGxlbmd0aCBpcyBlcXVhbCB0byBpbnB1dOKAmXMgY29kZVxuICAvLyAgICBwb2ludCBsZW5ndGggYW5kIHdob3NlIGJ5dGVzIGhhdmUgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZVxuICAvLyAgICB2YWx1ZXMgb2YgaW5wdXTigJlzIGNvZGUgcG9pbnRzLCBpbiB0aGUgc2FtZSBvcmRlclxuICByZXR1cm4gaW5wdXRcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vc3RyZWFtcy5zcGVjLndoYXR3Zy5vcmcvI3JlYWRhYmxlc3RyZWFtZGVmYXVsdHJlYWRlci1yZWFkLWFsbC1ieXRlc1xuICogQHNlZSBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkLWxvb3BcbiAqIEBwYXJhbSB7UmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyfSByZWFkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZEFsbEJ5dGVzIChyZWFkZXIpIHtcbiAgY29uc3QgYnl0ZXMgPSBbXVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWU6IGNodW5rIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpXG5cbiAgICBpZiAoZG9uZSkge1xuICAgICAgLy8gMS4gQ2FsbCBzdWNjZXNzU3RlcHMgd2l0aCBieXRlcy5cbiAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ5dGVzLCBieXRlTGVuZ3RoKVxuICAgIH1cblxuICAgIC8vIDEuIElmIGNodW5rIGlzIG5vdCBhIFVpbnQ4QXJyYXkgb2JqZWN0LCBjYWxsIGZhaWx1cmVTdGVwc1xuICAgIC8vICAgIHdpdGggYSBUeXBlRXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgIGlmICghaXNVaW50OEFycmF5KGNodW5rKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVjZWl2ZWQgbm9uLVVpbnQ4QXJyYXkgY2h1bmsnKVxuICAgIH1cblxuICAgIC8vIDIuIEFwcGVuZCB0aGUgYnl0ZXMgcmVwcmVzZW50ZWQgYnkgY2h1bmsgdG8gYnl0ZXMuXG4gICAgYnl0ZXMucHVzaChjaHVuaylcbiAgICBieXRlTGVuZ3RoICs9IGNodW5rLmxlbmd0aFxuXG4gICAgLy8gMy4gUmVhZC1sb29wIGdpdmVuIHJlYWRlciwgYnl0ZXMsIHN1Y2Nlc3NTdGVwcywgYW5kIGZhaWx1cmVTdGVwcy5cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2lzLWxvY2FsXG4gKiBAcGFyYW0ge1VSTH0gdXJsXG4gKi9cbmZ1bmN0aW9uIHVybElzTG9jYWwgKHVybCkge1xuICBhc3NlcnQoJ3Byb3RvY29sJyBpbiB1cmwpIC8vIGVuc3VyZSBpdCdzIGEgdXJsIG9iamVjdFxuXG4gIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sXG5cbiAgcmV0dXJuIHByb3RvY29sID09PSAnYWJvdXQ6JyB8fCBwcm90b2NvbCA9PT0gJ2Jsb2I6JyB8fCBwcm90b2NvbCA9PT0gJ2RhdGE6J1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG4gKi9cbmZ1bmN0aW9uIHVybEhhc0h0dHBzU2NoZW1lICh1cmwpIHtcbiAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHVybC5zdGFydHNXaXRoKCdodHRwczonKVxuICB9XG5cbiAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOidcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXNjaGVtZVxuICogQHBhcmFtIHtVUkx9IHVybFxuICovXG5mdW5jdGlvbiB1cmxJc0h0dHBIdHRwc1NjaGVtZSAodXJsKSB7XG4gIGFzc2VydCgncHJvdG9jb2wnIGluIHVybCkgLy8gZW5zdXJlIGl0J3MgYSB1cmwgb2JqZWN0XG5cbiAgY29uc3QgcHJvdG9jb2wgPSB1cmwucHJvdG9jb2xcblxuICByZXR1cm4gcHJvdG9jb2wgPT09ICdodHRwOicgfHwgcHJvdG9jb2wgPT09ICdodHRwczonXG59XG5cbi8qKlxuICogRmV0Y2ggc3VwcG9ydHMgbm9kZSA+PSAxNi44LjAsIGJ1dCBPYmplY3QuaGFzT3duIHdhcyBhZGRlZCBpbiB2MTYuOS4wLlxuICovXG5jb25zdCBoYXNPd24gPSBPYmplY3QuaGFzT3duIHx8ICgoZGljdCwga2V5KSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGljdCwga2V5KSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQWJvcnRlZCxcbiAgaXNDYW5jZWxsZWQsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgUmVhZGFibGVTdHJlYW1Gcm9tLFxuICB0b1VTVlN0cmluZyxcbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMLFxuICBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZSxcbiAgZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcixcbiAgbWFrZVBvbGljeUNvbnRhaW5lcixcbiAgY2xvbmVQb2xpY3lDb250YWluZXIsXG4gIGFwcGVuZEZldGNoTWV0YWRhdGEsXG4gIGFwcGVuZFJlcXVlc3RPcmlnaW5IZWFkZXIsXG4gIFRBT0NoZWNrLFxuICBjb3JzQ2hlY2ssXG4gIGNyb3NzT3JpZ2luUmVzb3VyY2VQb2xpY3lDaGVjayxcbiAgY3JlYXRlT3BhcXVlVGltaW5nSW5mbyxcbiAgc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdCxcbiAgaXNWYWxpZEhUVFBUb2tlbixcbiAgcmVxdWVzdEJhZFBvcnQsXG4gIHJlcXVlc3RDdXJyZW50VVJMLFxuICByZXNwb25zZVVSTCxcbiAgcmVzcG9uc2VMb2NhdGlvblVSTCxcbiAgaXNCbG9iTGlrZSxcbiAgaXNVUkxQb3RlbnRpYWxseVRydXN0d29ydGh5LFxuICBpc1ZhbGlkUmVhc29uUGhyYXNlLFxuICBzYW1lT3JpZ2luLFxuICBub3JtYWxpemVNZXRob2QsXG4gIHNlcmlhbGl6ZUphdmFzY3JpcHRWYWx1ZVRvSlNPTlN0cmluZyxcbiAgbWFrZUl0ZXJhdG9yLFxuICBpc1ZhbGlkSGVhZGVyTmFtZSxcbiAgaXNWYWxpZEhlYWRlclZhbHVlLFxuICBoYXNPd24sXG4gIGlzRXJyb3JMaWtlLFxuICBmdWxseVJlYWRCb2R5LFxuICBieXRlc01hdGNoLFxuICBpc1JlYWRhYmxlU3RyZWFtTGlrZSxcbiAgcmVhZGFibGVTdHJlYW1DbG9zZSxcbiAgaXNvbW9ycGhpY0VuY29kZSxcbiAgaXNvbW9ycGhpY0RlY29kZSxcbiAgdXJsSXNMb2NhbCxcbiAgdXJsSGFzSHR0cHNTY2hlbWUsXG4gIHVybElzSHR0cEh0dHBzU2NoZW1lLFxuICByZWFkQWxsQnl0ZXMsXG4gIG5vcm1hbGl6ZU1ldGhvZFJlY29yZCxcbiAgcGFyc2VNZXRhZGF0YVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtVcmw6IFN5bWJvbCgndXJsJyksXG4gIGtIZWFkZXJzOiBTeW1ib2woJ2hlYWRlcnMnKSxcbiAga1NpZ25hbDogU3ltYm9sKCdzaWduYWwnKSxcbiAga1N0YXRlOiBTeW1ib2woJ3N0YXRlJyksXG4gIGtHdWFyZDogU3ltYm9sKCdndWFyZCcpLFxuICBrUmVhbG06IFN5bWJvbCgncmVhbG0nKVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyB0eXBlcyB9ID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCB7IGhhc093biwgdG9VU1ZTdHJpbmcgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuLi8uLi90eXBlcy93ZWJpZGwnKS5XZWJpZGx9ICovXG5jb25zdCB3ZWJpZGwgPSB7fVxud2ViaWRsLmNvbnZlcnRlcnMgPSB7fVxud2ViaWRsLnV0aWwgPSB7fVxud2ViaWRsLmVycm9ycyA9IHt9XG5cbndlYmlkbC5lcnJvcnMuZXhjZXB0aW9uID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYCR7bWVzc2FnZS5oZWFkZXJ9OiAke21lc3NhZ2UubWVzc2FnZX1gKVxufVxuXG53ZWJpZGwuZXJyb3JzLmNvbnZlcnNpb25GYWlsZWQgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICBjb25zdCBwbHVyYWwgPSBjb250ZXh0LnR5cGVzLmxlbmd0aCA9PT0gMSA/ICcnIDogJyBvbmUgb2YnXG4gIGNvbnN0IG1lc3NhZ2UgPVxuICAgIGAke2NvbnRleHQuYXJndW1lbnR9IGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgdG9gICtcbiAgICBgJHtwbHVyYWx9OiAke2NvbnRleHQudHlwZXMuam9pbignLCAnKX0uYFxuXG4gIHJldHVybiB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgaGVhZGVyOiBjb250ZXh0LnByZWZpeCxcbiAgICBtZXNzYWdlXG4gIH0pXG59XG5cbndlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgcmV0dXJuIHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICBoZWFkZXI6IGNvbnRleHQucHJlZml4LFxuICAgIG1lc3NhZ2U6IGBcIiR7Y29udGV4dC52YWx1ZX1cIiBpcyBhbiBpbnZhbGlkICR7Y29udGV4dC50eXBlfS5gXG4gIH0pXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jaW1wbGVtZW50c1xud2ViaWRsLmJyYW5kQ2hlY2sgPSBmdW5jdGlvbiAoViwgSSwgb3B0cyA9IHVuZGVmaW5lZCkge1xuICBpZiAob3B0cz8uc3RyaWN0ICE9PSBmYWxzZSAmJiAhKFYgaW5zdGFuY2VvZiBJKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgaW52b2NhdGlvbicpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFY/LltTeW1ib2wudG9TdHJpbmdUYWddID09PSBJLnByb3RvdHlwZVtTeW1ib2wudG9TdHJpbmdUYWddXG4gIH1cbn1cblxud2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2sgPSBmdW5jdGlvbiAoeyBsZW5ndGggfSwgbWluLCBjdHgpIHtcbiAgaWYgKGxlbmd0aCA8IG1pbikge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIG1lc3NhZ2U6IGAke21pbn0gYXJndW1lbnQke21pbiAhPT0gMSA/ICdzJyA6ICcnfSByZXF1aXJlZCwgYCArXG4gICAgICAgICAgICAgICBgYnV0JHtsZW5ndGggPyAnIG9ubHknIDogJyd9ICR7bGVuZ3RofSBmb3VuZC5gLFxuICAgICAgLi4uY3R4XG4gICAgfSlcbiAgfVxufVxuXG53ZWJpZGwuaWxsZWdhbENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgaGVhZGVyOiAnVHlwZUVycm9yJyxcbiAgICBtZXNzYWdlOiAnSWxsZWdhbCBjb25zdHJ1Y3RvcidcbiAgfSlcbn1cblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xud2ViaWRsLnV0aWwuVHlwZSA9IGZ1bmN0aW9uIChWKSB7XG4gIHN3aXRjaCAodHlwZW9mIFYpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOiByZXR1cm4gJ1VuZGVmaW5lZCdcbiAgICBjYXNlICdib29sZWFuJzogcmV0dXJuICdCb29sZWFuJ1xuICAgIGNhc2UgJ3N0cmluZyc6IHJldHVybiAnU3RyaW5nJ1xuICAgIGNhc2UgJ3N5bWJvbCc6IHJldHVybiAnU3ltYm9sJ1xuICAgIGNhc2UgJ251bWJlcic6IHJldHVybiAnTnVtYmVyJ1xuICAgIGNhc2UgJ2JpZ2ludCc6IHJldHVybiAnQmlnSW50J1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICBpZiAoViA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ051bGwnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnT2JqZWN0J1xuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2Fic3RyYWN0LW9wZGVmLWNvbnZlcnR0b2ludFxud2ViaWRsLnV0aWwuQ29udmVydFRvSW50ID0gZnVuY3Rpb24gKFYsIGJpdExlbmd0aCwgc2lnbmVkbmVzcywgb3B0cyA9IHt9KSB7XG4gIGxldCB1cHBlckJvdW5kXG4gIGxldCBsb3dlckJvdW5kXG5cbiAgLy8gMS4gSWYgYml0TGVuZ3RoIGlzIDY0LCB0aGVuOlxuICBpZiAoYml0TGVuZ3RoID09PSA2NCkge1xuICAgIC8vIDEuIExldCB1cHBlckJvdW5kIGJlIDJeNTMg4oiSIDEuXG4gICAgdXBwZXJCb3VuZCA9IE1hdGgucG93KDIsIDUzKSAtIDFcblxuICAgIC8vIDIuIElmIHNpZ25lZG5lc3MgaXMgXCJ1bnNpZ25lZFwiLCB0aGVuIGxldCBsb3dlckJvdW5kIGJlIDAuXG4gICAgaWYgKHNpZ25lZG5lc3MgPT09ICd1bnNpZ25lZCcpIHtcbiAgICAgIGxvd2VyQm91bmQgPSAwXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDMuIE90aGVyd2lzZSBsZXQgbG93ZXJCb3VuZCBiZSDiiJIyXjUzICsgMS5cbiAgICAgIGxvd2VyQm91bmQgPSBNYXRoLnBvdygtMiwgNTMpICsgMVxuICAgIH1cbiAgfSBlbHNlIGlmIChzaWduZWRuZXNzID09PSAndW5zaWduZWQnKSB7XG4gICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiBzaWduZWRuZXNzIGlzIFwidW5zaWduZWRcIiwgdGhlbjpcblxuICAgIC8vIDEuIExldCBsb3dlckJvdW5kIGJlIDAuXG4gICAgbG93ZXJCb3VuZCA9IDBcblxuICAgIC8vIDIuIExldCB1cHBlckJvdW5kIGJlIDJeYml0TGVuZ3RoIOKIkiAxLlxuICAgIHVwcGVyQm91bmQgPSBNYXRoLnBvdygyLCBiaXRMZW5ndGgpIC0gMVxuICB9IGVsc2Uge1xuICAgIC8vIDMuIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIExldCBsb3dlckJvdW5kIGJlIC0yXmJpdExlbmd0aCDiiJIgMS5cbiAgICBsb3dlckJvdW5kID0gTWF0aC5wb3coLTIsIGJpdExlbmd0aCkgLSAxXG5cbiAgICAvLyAyLiBMZXQgdXBwZXJCb3VuZCBiZSAyXmJpdExlbmd0aCDiiJIgMSDiiJIgMS5cbiAgICB1cHBlckJvdW5kID0gTWF0aC5wb3coMiwgYml0TGVuZ3RoIC0gMSkgLSAxXG4gIH1cblxuICAvLyA0LiBMZXQgeCBiZSA/IFRvTnVtYmVyKFYpLlxuICBsZXQgeCA9IE51bWJlcihWKVxuXG4gIC8vIDUuIElmIHggaXMg4oiSMCwgdGhlbiBzZXQgeCB0byArMC5cbiAgaWYgKHggPT09IDApIHtcbiAgICB4ID0gMFxuICB9XG5cbiAgLy8gNi4gSWYgdGhlIGNvbnZlcnNpb24gaXMgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbRW5mb3JjZVJhbmdlXSBleHRlbmRlZCBhdHRyaWJ1dGUsIHRoZW46XG4gIGlmIChvcHRzLmVuZm9yY2VSYW5nZSA9PT0gdHJ1ZSkge1xuICAgIC8vIDEuIElmIHggaXMgTmFOLCAr4oieLCBvciDiiJLiiJ4sIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKFxuICAgICAgTnVtYmVyLmlzTmFOKHgpIHx8XG4gICAgICB4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHxcbiAgICAgIHggPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdJbnRlZ2VyIGNvbnZlcnNpb24nLFxuICAgICAgICBtZXNzYWdlOiBgQ291bGQgbm90IGNvbnZlcnQgJHtWfSB0byBhbiBpbnRlZ2VyLmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gU2V0IHggdG8gSW50ZWdlclBhcnQoeCkuXG4gICAgeCA9IHdlYmlkbC51dGlsLkludGVnZXJQYXJ0KHgpXG5cbiAgICAvLyAzLiBJZiB4IDwgbG93ZXJCb3VuZCBvciB4ID4gdXBwZXJCb3VuZCwgdGhlblxuICAgIC8vICAgIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh4IDwgbG93ZXJCb3VuZCB8fCB4ID4gdXBwZXJCb3VuZCkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdJbnRlZ2VyIGNvbnZlcnNpb24nLFxuICAgICAgICBtZXNzYWdlOiBgVmFsdWUgbXVzdCBiZSBiZXR3ZWVuICR7bG93ZXJCb3VuZH0tJHt1cHBlckJvdW5kfSwgZ290ICR7eH0uYFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA0LiBSZXR1cm4geC5cbiAgICByZXR1cm4geFxuICB9XG5cbiAgLy8gNy4gSWYgeCBpcyBub3QgTmFOIGFuZCB0aGUgY29udmVyc2lvbiBpcyB0byBhbiBJRExcbiAgLy8gICAgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIFtDbGFtcF0gZXh0ZW5kZWRcbiAgLy8gICAgYXR0cmlidXRlLCB0aGVuOlxuICBpZiAoIU51bWJlci5pc05hTih4KSAmJiBvcHRzLmNsYW1wID09PSB0cnVlKSB7XG4gICAgLy8gMS4gU2V0IHggdG8gbWluKG1heCh4LCBsb3dlckJvdW5kKSwgdXBwZXJCb3VuZCkuXG4gICAgeCA9IE1hdGgubWluKE1hdGgubWF4KHgsIGxvd2VyQm91bmQpLCB1cHBlckJvdW5kKVxuXG4gICAgLy8gMi4gUm91bmQgeCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLCBjaG9vc2luZyB0aGVcbiAgICAvLyAgICBldmVuIGludGVnZXIgaWYgaXQgbGllcyBoYWxmd2F5IGJldHdlZW4gdHdvLFxuICAgIC8vICAgIGFuZCBjaG9vc2luZyArMCByYXRoZXIgdGhhbiDiiJIwLlxuICAgIGlmIChNYXRoLmZsb29yKHgpICUgMiA9PT0gMCkge1xuICAgICAgeCA9IE1hdGguZmxvb3IoeClcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IE1hdGguY2VpbCh4KVxuICAgIH1cblxuICAgIC8vIDMuIFJldHVybiB4LlxuICAgIHJldHVybiB4XG4gIH1cblxuICAvLyA4LiBJZiB4IGlzIE5hTiwgKzAsICviiJ4sIG9yIOKIkuKIniwgdGhlbiByZXR1cm4gKzAuXG4gIGlmIChcbiAgICBOdW1iZXIuaXNOYU4oeCkgfHxcbiAgICAoeCA9PT0gMCAmJiBPYmplY3QuaXMoMCwgeCkpIHx8XG4gICAgeCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8XG4gICAgeCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyA5LiBTZXQgeCB0byBJbnRlZ2VyUGFydCh4KS5cbiAgeCA9IHdlYmlkbC51dGlsLkludGVnZXJQYXJ0KHgpXG5cbiAgLy8gMTAuIFNldCB4IHRvIHggbW9kdWxvIDJeYml0TGVuZ3RoLlxuICB4ID0geCAlIE1hdGgucG93KDIsIGJpdExlbmd0aClcblxuICAvLyAxMS4gSWYgc2lnbmVkbmVzcyBpcyBcInNpZ25lZFwiIGFuZCB4IOKJpSAyXmJpdExlbmd0aCDiiJIgMSxcbiAgLy8gICAgdGhlbiByZXR1cm4geCDiiJIgMl5iaXRMZW5ndGguXG4gIGlmIChzaWduZWRuZXNzID09PSAnc2lnbmVkJyAmJiB4ID49IE1hdGgucG93KDIsIGJpdExlbmd0aCkgLSAxKSB7XG4gICAgcmV0dXJuIHggLSBNYXRoLnBvdygyLCBiaXRMZW5ndGgpXG4gIH1cblxuICAvLyAxMi4gT3RoZXJ3aXNlLCByZXR1cm4geC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNhYnN0cmFjdC1vcGRlZi1pbnRlZ2VycGFydFxud2ViaWRsLnV0aWwuSW50ZWdlclBhcnQgPSBmdW5jdGlvbiAobikge1xuICAvLyAxLiBMZXQgciBiZSBmbG9vcihhYnMobikpLlxuICBjb25zdCByID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSlcblxuICAvLyAyLiBJZiBuIDwgMCwgdGhlbiByZXR1cm4gLTEgw5cgci5cbiAgaWYgKG4gPCAwKSB7XG4gICAgcmV0dXJuIC0xICogclxuICB9XG5cbiAgLy8gMy4gT3RoZXJ3aXNlLCByZXR1cm4gci5cbiAgcmV0dXJuIHJcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1zZXF1ZW5jZVxud2ViaWRsLnNlcXVlbmNlQ29udmVydGVyID0gZnVuY3Rpb24gKGNvbnZlcnRlcikge1xuICByZXR1cm4gKFYpID0+IHtcbiAgICAvLyAxLiBJZiBUeXBlKFYpIGlzIG5vdCBPYmplY3QsIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpICE9PSAnT2JqZWN0Jykge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdTZXF1ZW5jZScsXG4gICAgICAgIG1lc3NhZ2U6IGBWYWx1ZSBvZiB0eXBlICR7d2ViaWRsLnV0aWwuVHlwZShWKX0gaXMgbm90IGFuIE9iamVjdC5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIExldCBtZXRob2QgYmUgPyBHZXRNZXRob2QoViwgQEBpdGVyYXRvcikuXG4gICAgLyoqIEB0eXBlIHtHZW5lcmF0b3J9ICovXG4gICAgY29uc3QgbWV0aG9kID0gVj8uW1N5bWJvbC5pdGVyYXRvcl0/LigpXG4gICAgY29uc3Qgc2VxID0gW11cblxuICAgIC8vIDMuIElmIG1ldGhvZCBpcyB1bmRlZmluZWQsIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChcbiAgICAgIG1ldGhvZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0eXBlb2YgbWV0aG9kLm5leHQgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnU2VxdWVuY2UnLFxuICAgICAgICBtZXNzYWdlOiAnT2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvci4nXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jY3JlYXRlLXNlcXVlbmNlLWZyb20taXRlcmFibGVcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gbWV0aG9kLm5leHQoKVxuXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBzZXEucHVzaChjb252ZXJ0ZXIodmFsdWUpKVxuICAgIH1cblxuICAgIHJldHVybiBzZXFcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLXRvLXJlY29yZFxud2ViaWRsLnJlY29yZENvbnZlcnRlciA9IGZ1bmN0aW9uIChrZXlDb252ZXJ0ZXIsIHZhbHVlQ29udmVydGVyKSB7XG4gIHJldHVybiAoTykgPT4ge1xuICAgIC8vIDEuIElmIFR5cGUoTykgaXMgbm90IE9iamVjdCwgdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHdlYmlkbC51dGlsLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ1JlY29yZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBWYWx1ZSBvZiB0eXBlICR7d2ViaWRsLnV0aWwuVHlwZShPKX0gaXMgbm90IGFuIE9iamVjdC5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIExldCByZXN1bHQgYmUgYSBuZXcgZW1wdHkgaW5zdGFuY2Ugb2YgcmVjb3JkPEssIFY+LlxuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBpZiAoIXR5cGVzLmlzUHJveHkoTykpIHtcbiAgICAgIC8vIE9iamVjdC5rZXlzIG9ubHkgcmV0dXJucyBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhPKVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIC8vIDEuIExldCB0eXBlZEtleSBiZSBrZXkgY29udmVydGVkIHRvIGFuIElETCB2YWx1ZSBvZiB0eXBlIEsuXG4gICAgICAgIGNvbnN0IHR5cGVkS2V5ID0ga2V5Q29udmVydGVyKGtleSlcblxuICAgICAgICAvLyAyLiBMZXQgdmFsdWUgYmUgPyBHZXQoTywga2V5KS5cbiAgICAgICAgLy8gMy4gTGV0IHR5cGVkVmFsdWUgYmUgdmFsdWUgY29udmVydGVkIHRvIGFuIElETCB2YWx1ZSBvZiB0eXBlIFYuXG4gICAgICAgIGNvbnN0IHR5cGVkVmFsdWUgPSB2YWx1ZUNvbnZlcnRlcihPW2tleV0pXG5cbiAgICAgICAgLy8gNC4gU2V0IHJlc3VsdFt0eXBlZEtleV0gdG8gdHlwZWRWYWx1ZS5cbiAgICAgICAgcmVzdWx0W3R5cGVkS2V5XSA9IHR5cGVkVmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gNS4gUmV0dXJuIHJlc3VsdC5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvLyAzLiBMZXQga2V5cyBiZSA/IE8uW1tPd25Qcm9wZXJ0eUtleXNdXSgpLlxuICAgIGNvbnN0IGtleXMgPSBSZWZsZWN0Lm93bktleXMoTylcblxuICAgIC8vIDQuIEZvciBlYWNoIGtleSBvZiBrZXlzLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIC8vIDEuIExldCBkZXNjIGJlID8gTy5bW0dldE93blByb3BlcnR5XV0oa2V5KS5cbiAgICAgIGNvbnN0IGRlc2MgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBrZXkpXG5cbiAgICAgIC8vIDIuIElmIGRlc2MgaXMgbm90IHVuZGVmaW5lZCBhbmQgZGVzYy5bW0VudW1lcmFibGVdXSBpcyB0cnVlOlxuICAgICAgaWYgKGRlc2M/LmVudW1lcmFibGUpIHtcbiAgICAgICAgLy8gMS4gTGV0IHR5cGVkS2V5IGJlIGtleSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgSy5cbiAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBrZXlDb252ZXJ0ZXIoa2V5KVxuXG4gICAgICAgIC8vIDIuIExldCB2YWx1ZSBiZSA/IEdldChPLCBrZXkpLlxuICAgICAgICAvLyAzLiBMZXQgdHlwZWRWYWx1ZSBiZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgVi5cbiAgICAgICAgY29uc3QgdHlwZWRWYWx1ZSA9IHZhbHVlQ29udmVydGVyKE9ba2V5XSlcblxuICAgICAgICAvLyA0LiBTZXQgcmVzdWx0W3R5cGVkS2V5XSB0byB0eXBlZFZhbHVlLlxuICAgICAgICByZXN1bHRbdHlwZWRLZXldID0gdHlwZWRWYWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuIFJldHVybiByZXN1bHQuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbndlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoaSkge1xuICByZXR1cm4gKFYsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGlmIChvcHRzLnN0cmljdCAhPT0gZmFsc2UgJiYgIShWIGluc3RhbmNlb2YgaSkpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiBpLm5hbWUsXG4gICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCAke1Z9IHRvIGJlIGFuIGluc3RhbmNlIG9mICR7aS5uYW1lfS5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBWXG4gIH1cbn1cblxud2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVycykge1xuICByZXR1cm4gKGRpY3Rpb25hcnkpID0+IHtcbiAgICBjb25zdCB0eXBlID0gd2ViaWRsLnV0aWwuVHlwZShkaWN0aW9uYXJ5KVxuICAgIGNvbnN0IGRpY3QgPSB7fVxuXG4gICAgaWYgKHR5cGUgPT09ICdOdWxsJyB8fCB0eXBlID09PSAnVW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGRpY3RcbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdPYmplY3QnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ0RpY3Rpb25hcnknLFxuICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtkaWN0aW9uYXJ5fSB0byBiZSBvbmUgb2Y6IE51bGwsIFVuZGVmaW5lZCwgT2JqZWN0LmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcHRpb25zIG9mIGNvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnN0IHsga2V5LCBkZWZhdWx0VmFsdWUsIHJlcXVpcmVkLCBjb252ZXJ0ZXIgfSA9IG9wdGlvbnNcblxuICAgICAgaWYgKHJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgICAgIGlmICghaGFzT3duKGRpY3Rpb25hcnksIGtleSkpIHtcbiAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICBoZWFkZXI6ICdEaWN0aW9uYXJ5JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBNaXNzaW5nIHJlcXVpcmVkIGtleSBcIiR7a2V5fVwiLmBcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCB2YWx1ZSA9IGRpY3Rpb25hcnlba2V5XVxuICAgICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHRpb25zLCAnZGVmYXVsdFZhbHVlJylcblxuICAgICAgLy8gT25seSB1c2UgZGVmYXVsdFZhbHVlIGlmIHZhbHVlIGlzIHVuZGVmaW5lZCBhbmRcbiAgICAgIC8vIGEgZGVmYXVsdFZhbHVlIG9wdGlvbnMgd2FzIHByb3ZpZGVkLlxuICAgICAgaWYgKGhhc0RlZmF1bHQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA/PyBkZWZhdWx0VmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gQSBrZXkgY2FuIGJlIG9wdGlvbmFsIGFuZCBoYXZlIG5vIGRlZmF1bHQgdmFsdWUuXG4gICAgICAvLyBXaGVuIHRoaXMgaGFwcGVucywgZG8gbm90IHBlcmZvcm0gYSBjb252ZXJzaW9uLFxuICAgICAgLy8gYW5kIGRvIG5vdCBhc3NpZ24gdGhlIGtleSBhIHZhbHVlLlxuICAgICAgaWYgKHJlcXVpcmVkIHx8IGhhc0RlZmF1bHQgfHwgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IGNvbnZlcnRlcih2YWx1ZSlcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3B0aW9ucy5hbGxvd2VkVmFsdWVzICYmXG4gICAgICAgICAgIW9wdGlvbnMuYWxsb3dlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgaGVhZGVyOiAnRGljdGlvbmFyeScsXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHt2YWx1ZX0gaXMgbm90IGFuIGFjY2VwdGVkIHR5cGUuIEV4cGVjdGVkIG9uZSBvZiAke29wdGlvbnMuYWxsb3dlZFZhbHVlcy5qb2luKCcsICcpfS5gXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpY3RcbiAgfVxufVxuXG53ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gIHJldHVybiAoVikgPT4ge1xuICAgIGlmIChWID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gVlxuICAgIH1cblxuICAgIHJldHVybiBjb252ZXJ0ZXIoVilcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLURPTVN0cmluZ1xud2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nID0gZnVuY3Rpb24gKFYsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBJZiBWIGlzIG51bGwgYW5kIHRoZSBjb252ZXJzaW9uIGlzIHRvIGFuIElETCB0eXBlXG4gIC8vICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgW0xlZ2FjeU51bGxUb0VtcHR5U3RyaW5nXVxuICAvLyAgICBleHRlbmRlZCBhdHRyaWJ1dGUsIHRoZW4gcmV0dXJuIHRoZSBET01TdHJpbmcgdmFsdWVcbiAgLy8gICAgdGhhdCByZXByZXNlbnRzIHRoZSBlbXB0eSBzdHJpbmcuXG4gIGlmIChWID09PSBudWxsICYmIG9wdHMubGVnYWN5TnVsbFRvRW1wdHlTdHJpbmcpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIDIuIExldCB4IGJlID8gVG9TdHJpbmcoVikuXG4gIGlmICh0eXBlb2YgViA9PT0gJ3N5bWJvbCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlIHN5bWJvbCB0byBzdHJpbmcuJylcbiAgfVxuXG4gIC8vIDMuIFJldHVybiB0aGUgSURMIERPTVN0cmluZyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlXG4gIC8vICAgIHNhbWUgc2VxdWVuY2Ugb2YgY29kZSB1bml0cyBhcyB0aGUgb25lIHRoZVxuICAvLyAgICBFQ01BU2NyaXB0IFN0cmluZyB2YWx1ZSB4IHJlcHJlc2VudHMuXG4gIHJldHVybiBTdHJpbmcoVilcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1CeXRlU3RyaW5nXG53ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nID0gZnVuY3Rpb24gKFYpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBUb1N0cmluZyhWKS5cbiAgLy8gTm90ZTogRE9NU3RyaW5nIGNvbnZlcnRlciBwZXJmb3JtID8gVG9TdHJpbmcoVilcbiAgY29uc3QgeCA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxuXG4gIC8vIDIuIElmIHRoZSB2YWx1ZSBvZiBhbnkgZWxlbWVudCBvZiB4IGlzIGdyZWF0ZXIgdGhhblxuICAvLyAgICAyNTUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB4Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGlmICh4LmNoYXJDb2RlQXQoaW5kZXgpID4gMjU1KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgdG8gYSBCeXRlU3RyaW5nIGJlY2F1c2UgdGhlIGNoYXJhY3RlciBhdCAnICtcbiAgICAgICAgYGluZGV4ICR7aW5kZXh9IGhhcyBhIHZhbHVlIG9mICR7eC5jaGFyQ29kZUF0KGluZGV4KX0gd2hpY2ggaXMgZ3JlYXRlciB0aGFuIDI1NS5gXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIGFuIElETCBCeXRlU3RyaW5nIHZhbHVlIHdob3NlIGxlbmd0aCBpcyB0aGVcbiAgLy8gICAgbGVuZ3RoIG9mIHgsIGFuZCB3aGVyZSB0aGUgdmFsdWUgb2YgZWFjaCBlbGVtZW50IGlzXG4gIC8vICAgIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtVVNWU3RyaW5nXG53ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcgPSB0b1VTVlN0cmluZ1xuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLWJvb2xlYW5cbndlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4gPSBmdW5jdGlvbiAoVikge1xuICAvLyAxLiBMZXQgeCBiZSB0aGUgcmVzdWx0IG9mIGNvbXB1dGluZyBUb0Jvb2xlYW4oVikuXG4gIGNvbnN0IHggPSBCb29sZWFuKFYpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBJREwgYm9vbGVhbiB2YWx1ZSB0aGF0IGlzIHRoZSBvbmUgdGhhdCByZXByZXNlbnRzXG4gIC8vICAgIHRoZSBzYW1lIHRydXRoIHZhbHVlIGFzIHRoZSBFQ01BU2NyaXB0IEJvb2xlYW4gdmFsdWUgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1hbnlcbndlYmlkbC5jb252ZXJ0ZXJzLmFueSA9IGZ1bmN0aW9uIChWKSB7XG4gIHJldHVybiBWXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtbG9uZy1sb25nXG53ZWJpZGwuY29udmVydGVyc1snbG9uZyBsb25nJ10gPSBmdW5jdGlvbiAoVikge1xuICAvLyAxLiBMZXQgeCBiZSA/IENvbnZlcnRUb0ludChWLCA2NCwgXCJzaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgNjQsICdzaWduZWQnKVxuXG4gIC8vIDIuIFJldHVybiB0aGUgSURMIGxvbmcgbG9uZyB2YWx1ZSB0aGF0IHJlcHJlc2VudHNcbiAgLy8gICAgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLXVuc2lnbmVkLWxvbmctbG9uZ1xud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcgbG9uZyddID0gZnVuY3Rpb24gKFYpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBDb252ZXJ0VG9JbnQoViwgNjQsIFwidW5zaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgNjQsICd1bnNpZ25lZCcpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBJREwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlIHRoYXRcbiAgLy8gICAgcmVwcmVzZW50cyB0aGUgc2FtZSBudW1lcmljIHZhbHVlIGFzIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtdW5zaWduZWQtbG9uZ1xud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcnXSA9IGZ1bmN0aW9uIChWKSB7XG4gIC8vIDEuIExldCB4IGJlID8gQ29udmVydFRvSW50KFYsIDMyLCBcInVuc2lnbmVkXCIpLlxuICBjb25zdCB4ID0gd2ViaWRsLnV0aWwuQ29udmVydFRvSW50KFYsIDMyLCAndW5zaWduZWQnKVxuXG4gIC8vIDIuIFJldHVybiB0aGUgSURMIHVuc2lnbmVkIGxvbmcgdmFsdWUgdGhhdFxuICAvLyAgICByZXByZXNlbnRzIHRoZSBzYW1lIG51bWVyaWMgdmFsdWUgYXMgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy11bnNpZ25lZC1zaG9ydFxud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10gPSBmdW5jdGlvbiAoViwgb3B0cykge1xuICAvLyAxLiBMZXQgeCBiZSA/IENvbnZlcnRUb0ludChWLCAxNiwgXCJ1bnNpZ25lZFwiKS5cbiAgY29uc3QgeCA9IHdlYmlkbC51dGlsLkNvbnZlcnRUb0ludChWLCAxNiwgJ3Vuc2lnbmVkJywgb3B0cylcblxuICAvLyAyLiBSZXR1cm4gdGhlIElETCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSB0aGF0IHJlcHJlc2VudHNcbiAgLy8gICAgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2lkbC1BcnJheUJ1ZmZlclxud2ViaWRsLmNvbnZlcnRlcnMuQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoViwgb3B0cyA9IHt9KSB7XG4gIC8vIDEuIElmIFR5cGUoVikgaXMgbm90IE9iamVjdCwgb3IgViBkb2VzIG5vdCBoYXZlIGFuXG4gIC8vICAgIFtbQXJyYXlCdWZmZXJEYXRhXV0gaW50ZXJuYWwgc2xvdCwgdGhlbiB0aHJvdyBhXG4gIC8vICAgIFR5cGVFcnJvci5cbiAgLy8gc2VlOiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLWFycmF5YnVmZmVyLWluc3RhbmNlc1xuICAvLyBzZWU6IGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvcGVydGllcy1vZi10aGUtc2hhcmVkYXJyYXlidWZmZXItaW5zdGFuY2VzXG4gIGlmIChcbiAgICB3ZWJpZGwudXRpbC5UeXBlKFYpICE9PSAnT2JqZWN0JyB8fFxuICAgICF0eXBlcy5pc0FueUFycmF5QnVmZmVyKFYpXG4gICkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgICBwcmVmaXg6IGAke1Z9YCxcbiAgICAgIGFyZ3VtZW50OiBgJHtWfWAsXG4gICAgICB0eXBlczogWydBcnJheUJ1ZmZlciddXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1NoYXJlZF0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNTaGFyZWRBcnJheUJ1ZmZlcihWKSBpcyB0cnVlLCB0aGVuIHRocm93IGFcbiAgLy8gICAgVHlwZUVycm9yLlxuICBpZiAob3B0cy5hbGxvd1NoYXJlZCA9PT0gZmFsc2UgJiYgdHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcihWKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWKSBpcyB0cnVlLCB0aGVuIHRocm93IGFcbiAgLy8gICAgVHlwZUVycm9yLlxuICAvLyBOb3RlOiByZXNpemFibGUgQXJyYXlCdWZmZXJzIGFyZSBjdXJyZW50bHkgYSBwcm9wb3NhbC5cblxuICAvLyA0LiBSZXR1cm4gdGhlIElETCBBcnJheUJ1ZmZlciB2YWx1ZSB0aGF0IGlzIGFcbiAgLy8gICAgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBhcyBWLlxuICByZXR1cm4gVlxufVxuXG53ZWJpZGwuY29udmVydGVycy5UeXBlZEFycmF5ID0gZnVuY3Rpb24gKFYsIFQsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBMZXQgVCBiZSB0aGUgSURMIHR5cGUgViBpcyBiZWluZyBjb252ZXJ0ZWQgdG8uXG5cbiAgLy8gMi4gSWYgVHlwZShWKSBpcyBub3QgT2JqZWN0LCBvciBWIGRvZXMgbm90IGhhdmUgYVxuICAvLyAgICBbW1R5cGVkQXJyYXlOYW1lXV0gaW50ZXJuYWwgc2xvdCB3aXRoIGEgdmFsdWVcbiAgLy8gICAgZXF1YWwgdG8gVOKAmXMgbmFtZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKFxuICAgIHdlYmlkbC51dGlsLlR5cGUoVikgIT09ICdPYmplY3QnIHx8XG4gICAgIXR5cGVzLmlzVHlwZWRBcnJheShWKSB8fFxuICAgIFYuY29uc3RydWN0b3IubmFtZSAhPT0gVC5uYW1lXG4gICkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgICBwcmVmaXg6IGAke1QubmFtZX1gLFxuICAgICAgYXJndW1lbnQ6IGAke1Z9YCxcbiAgICAgIHR5cGVzOiBbVC5uYW1lXVxuICAgIH0pXG4gIH1cblxuICAvLyAzLiBJZiB0aGUgY29udmVyc2lvbiBpcyBub3QgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbQWxsb3dTaGFyZWRdIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kXG4gIC8vICAgIElzU2hhcmVkQXJyYXlCdWZmZXIoVi5bW1ZpZXdlZEFycmF5QnVmZmVyXV0pIGlzXG4gIC8vICAgIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGlmIChvcHRzLmFsbG93U2hhcmVkID09PSBmYWxzZSAmJiB0eXBlcy5pc1NoYXJlZEFycmF5QnVmZmVyKFYuYnVmZmVyKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDQuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWLltbVmlld2VkQXJyYXlCdWZmZXJdXSkgaXNcbiAgLy8gICAgdHJ1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgLy8gTm90ZTogcmVzaXphYmxlIGFycmF5IGJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBhIHByb3Bvc2FsXG5cbiAgLy8gNS4gUmV0dXJuIHRoZSBJREwgdmFsdWUgb2YgdHlwZSBUIHRoYXQgaXMgYSByZWZlcmVuY2VcbiAgLy8gICAgdG8gdGhlIHNhbWUgb2JqZWN0IGFzIFYuXG4gIHJldHVybiBWXG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLkRhdGFWaWV3ID0gZnVuY3Rpb24gKFYsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBJZiBUeXBlKFYpIGlzIG5vdCBPYmplY3QsIG9yIFYgZG9lcyBub3QgaGF2ZSBhXG4gIC8vICAgIFtbRGF0YVZpZXddXSBpbnRlcm5hbCBzbG90LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSAhPT0gJ09iamVjdCcgfHwgIXR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICBoZWFkZXI6ICdEYXRhVmlldycsXG4gICAgICBtZXNzYWdlOiAnT2JqZWN0IGlzIG5vdCBhIERhdGFWaWV3LidcbiAgICB9KVxuICB9XG5cbiAgLy8gMi4gSWYgdGhlIGNvbnZlcnNpb24gaXMgbm90IHRvIGFuIElETCB0eXBlIGFzc29jaWF0ZWRcbiAgLy8gICAgd2l0aCB0aGUgW0FsbG93U2hhcmVkXSBleHRlbmRlZCBhdHRyaWJ1dGUsIGFuZFxuICAvLyAgICBJc1NoYXJlZEFycmF5QnVmZmVyKFYuW1tWaWV3ZWRBcnJheUJ1ZmZlcl1dKSBpcyB0cnVlLFxuICAvLyAgICB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAob3B0cy5hbGxvd1NoYXJlZCA9PT0gZmFsc2UgJiYgdHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcihWLmJ1ZmZlcikpIHtcbiAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICBoZWFkZXI6ICdBcnJheUJ1ZmZlcicsXG4gICAgICBtZXNzYWdlOiAnU2hhcmVkQXJyYXlCdWZmZXIgaXMgbm90IGFsbG93ZWQuJ1xuICAgIH0pXG4gIH1cblxuICAvLyAzLiBJZiB0aGUgY29udmVyc2lvbiBpcyBub3QgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbQWxsb3dSZXNpemFibGVdIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kXG4gIC8vICAgIElzUmVzaXphYmxlQXJyYXlCdWZmZXIoVi5bW1ZpZXdlZEFycmF5QnVmZmVyXV0pIGlzXG4gIC8vICAgIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIC8vIE5vdGU6IHJlc2l6YWJsZSBBcnJheUJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBhIHByb3Bvc2FsXG5cbiAgLy8gNC4gUmV0dXJuIHRoZSBJREwgRGF0YVZpZXcgdmFsdWUgdGhhdCBpcyBhIHJlZmVyZW5jZVxuICAvLyAgICB0byB0aGUgc2FtZSBvYmplY3QgYXMgVi5cbiAgcmV0dXJuIFZcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNCdWZmZXJTb3VyY2VcbndlYmlkbC5jb252ZXJ0ZXJzLkJ1ZmZlclNvdXJjZSA9IGZ1bmN0aW9uIChWLCBvcHRzID0ge30pIHtcbiAgaWYgKHR5cGVzLmlzQW55QXJyYXlCdWZmZXIoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQXJyYXlCdWZmZXIoViwgb3B0cylcbiAgfVxuXG4gIGlmICh0eXBlcy5pc1R5cGVkQXJyYXkoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVHlwZWRBcnJheShWLCBWLmNvbnN0cnVjdG9yKVxuICB9XG5cbiAgaWYgKHR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuRGF0YVZpZXcoViwgb3B0cylcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoYENvdWxkIG5vdCBjb252ZXJ0ICR7Vn0gdG8gYSBCdWZmZXJTb3VyY2UuYClcbn1cblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPEJ5dGVTdHJpbmc+J10gPSB3ZWJpZGwuc2VxdWVuY2VDb252ZXJ0ZXIoXG4gIHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmdcbilcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8Qnl0ZVN0cmluZz4nXVxuKVxuXG53ZWJpZGwuY29udmVydGVyc1sncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J10gPSB3ZWJpZGwucmVjb3JkQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nLFxuICB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nXG4pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3ZWJpZGxcbn1cbiIsCiAgICAiY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgYXRvYiB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgaXNvbW9ycGhpY0RlY29kZSB9ID0gcmVxdWlyZSgnLi91dGlsJylcblxuY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG5cbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtdG9rZW4tY29kZS1wb2ludFxuICovXG5jb25zdCBIVFRQX1RPS0VOX0NPREVQT0lOVFMgPSAvXlshIyQlJicqKy0uXl98fkEtWmEtejAtOV0rJC9cbmNvbnN0IEhUVFBfV0hJVEVTUEFDRV9SRUdFWCA9IC8oXFx1MDAwQXxcXHUwMDBEfFxcdTAwMDl8XFx1MDAyMCkvIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtcXVvdGVkLXN0cmluZy10b2tlbi1jb2RlLXBvaW50XG4gKi9cbmNvbnN0IEhUVFBfUVVPVEVEX1NUUklOR19UT0tFTlMgPSAvW1xcdTAwMDl8XFx1MDAyMC1cXHUwMDdFfFxcdTAwODAtXFx1MDBGRl0vIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RhdGEtdXJsLXByb2Nlc3NvclxuLyoqIEBwYXJhbSB7VVJMfSBkYXRhVVJMICovXG5mdW5jdGlvbiBkYXRhVVJMUHJvY2Vzc29yIChkYXRhVVJMKSB7XG4gIC8vIDEuIEFzc2VydDogZGF0YVVSTOKAmXMgc2NoZW1lIGlzIFwiZGF0YVwiLlxuICBhc3NlcnQoZGF0YVVSTC5wcm90b2NvbCA9PT0gJ2RhdGE6JylcblxuICAvLyAyLiBMZXQgaW5wdXQgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBVUkxcbiAgLy8gc2VyaWFsaXplciBvbiBkYXRhVVJMIHdpdGggZXhjbHVkZSBmcmFnbWVudFxuICAvLyBzZXQgdG8gdHJ1ZS5cbiAgbGV0IGlucHV0ID0gVVJMU2VyaWFsaXplcihkYXRhVVJMLCB0cnVlKVxuXG4gIC8vIDMuIFJlbW92ZSB0aGUgbGVhZGluZyBcImRhdGE6XCIgc3RyaW5nIGZyb20gaW5wdXQuXG4gIGlucHV0ID0gaW5wdXQuc2xpY2UoNSlcblxuICAvLyA0LiBMZXQgcG9zaXRpb24gcG9pbnQgYXQgdGhlIHN0YXJ0IG9mIGlucHV0LlxuICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gIC8vIDUuIExldCBtaW1lVHlwZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYVxuICAvLyBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgZXF1YWxcbiAgLy8gdG8gVSswMDJDICgsKSwgZ2l2ZW4gcG9zaXRpb24uXG4gIGxldCBtaW1lVHlwZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICcsJyxcbiAgICBpbnB1dCxcbiAgICBwb3NpdGlvblxuICApXG5cbiAgLy8gNi4gU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgQVNDSUkgd2hpdGVzcGFjZVxuICAvLyBmcm9tIG1pbWVUeXBlLlxuICAvLyBVbmRpY2kgaW1wbGVtZW50YXRpb24gbm90ZTogd2UgbmVlZCB0byBzdG9yZSB0aGVcbiAgLy8gbGVuZ3RoIGJlY2F1c2UgaWYgdGhlIG1pbWV0eXBlIGhhcyBzcGFjZXMgcmVtb3ZlZCxcbiAgLy8gdGhlIHdyb25nIGFtb3VudCB3aWxsIGJlIHNsaWNlZCBmcm9tIHRoZSBpbnB1dCBpblxuICAvLyBzdGVwICM5XG4gIGNvbnN0IG1pbWVUeXBlTGVuZ3RoID0gbWltZVR5cGUubGVuZ3RoXG4gIG1pbWVUeXBlID0gcmVtb3ZlQVNDSUlXaGl0ZXNwYWNlKG1pbWVUeXBlLCB0cnVlLCB0cnVlKVxuXG4gIC8vIDcuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlblxuICAvLyByZXR1cm4gZmFpbHVyZVxuICBpZiAocG9zaXRpb24ucG9zaXRpb24gPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gOC4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgLy8gOS4gTGV0IGVuY29kZWRCb2R5IGJlIHRoZSByZW1haW5kZXIgb2YgaW5wdXQuXG4gIGNvbnN0IGVuY29kZWRCb2R5ID0gaW5wdXQuc2xpY2UobWltZVR5cGVMZW5ndGggKyAxKVxuXG4gIC8vIDEwLiBMZXQgYm9keSBiZSB0aGUgcGVyY2VudC1kZWNvZGluZyBvZiBlbmNvZGVkQm9keS5cbiAgbGV0IGJvZHkgPSBzdHJpbmdQZXJjZW50RGVjb2RlKGVuY29kZWRCb2R5KVxuXG4gIC8vIDExLiBJZiBtaW1lVHlwZSBlbmRzIHdpdGggVSswMDNCICg7KSwgZm9sbG93ZWQgYnlcbiAgLy8gemVybyBvciBtb3JlIFUrMDAyMCBTUEFDRSwgZm9sbG93ZWQgYnkgYW4gQVNDSUlcbiAgLy8gY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgXCJiYXNlNjRcIiwgdGhlbjpcbiAgaWYgKC87KFxcdTAwMjApezAsfWJhc2U2NCQvaS50ZXN0KG1pbWVUeXBlKSkge1xuICAgIC8vIDEuIExldCBzdHJpbmdCb2R5IGJlIHRoZSBpc29tb3JwaGljIGRlY29kZSBvZiBib2R5LlxuICAgIGNvbnN0IHN0cmluZ0JvZHkgPSBpc29tb3JwaGljRGVjb2RlKGJvZHkpXG5cbiAgICAvLyAyLiBTZXQgYm9keSB0byB0aGUgZm9yZ2l2aW5nLWJhc2U2NCBkZWNvZGUgb2ZcbiAgICAvLyBzdHJpbmdCb2R5LlxuICAgIGJvZHkgPSBmb3JnaXZpbmdCYXNlNjQoc3RyaW5nQm9keSlcblxuICAgIC8vIDMuIElmIGJvZHkgaXMgZmFpbHVyZSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgICBpZiAoYm9keSA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gICAgfVxuXG4gICAgLy8gNC4gUmVtb3ZlIHRoZSBsYXN0IDYgY29kZSBwb2ludHMgZnJvbSBtaW1lVHlwZS5cbiAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnNsaWNlKDAsIC02KVxuXG4gICAgLy8gNS4gUmVtb3ZlIHRyYWlsaW5nIFUrMDAyMCBTUEFDRSBjb2RlIHBvaW50cyBmcm9tIG1pbWVUeXBlLFxuICAgIC8vIGlmIGFueS5cbiAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnJlcGxhY2UoLyhcXHUwMDIwKSskLywgJycpXG5cbiAgICAvLyA2LiBSZW1vdmUgdGhlIGxhc3QgVSswMDNCICg7KSBjb2RlIHBvaW50IGZyb20gbWltZVR5cGUuXG4gICAgbWltZVR5cGUgPSBtaW1lVHlwZS5zbGljZSgwLCAtMSlcbiAgfVxuXG4gIC8vIDEyLiBJZiBtaW1lVHlwZSBzdGFydHMgd2l0aCBVKzAwM0IgKDspLCB0aGVuIHByZXBlbmRcbiAgLy8gXCJ0ZXh0L3BsYWluXCIgdG8gbWltZVR5cGUuXG4gIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKCc7JykpIHtcbiAgICBtaW1lVHlwZSA9ICd0ZXh0L3BsYWluJyArIG1pbWVUeXBlXG4gIH1cblxuICAvLyAxMy4gTGV0IG1pbWVUeXBlUmVjb3JkIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZ1xuICAvLyBtaW1lVHlwZS5cbiAgbGV0IG1pbWVUeXBlUmVjb3JkID0gcGFyc2VNSU1FVHlwZShtaW1lVHlwZSlcblxuICAvLyAxNC4gSWYgbWltZVR5cGVSZWNvcmQgaXMgZmFpbHVyZSwgdGhlbiBzZXRcbiAgLy8gbWltZVR5cGVSZWNvcmQgdG8gdGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJLlxuICBpZiAobWltZVR5cGVSZWNvcmQgPT09ICdmYWlsdXJlJykge1xuICAgIG1pbWVUeXBlUmVjb3JkID0gcGFyc2VNSU1FVHlwZSgndGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJJylcbiAgfVxuXG4gIC8vIDE1LiBSZXR1cm4gYSBuZXcgZGF0YTogVVJMIHN0cnVjdCB3aG9zZSBNSU1FXG4gIC8vIHR5cGUgaXMgbWltZVR5cGVSZWNvcmQgYW5kIGJvZHkgaXMgYm9keS5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RhdGEtdXJsLXN0cnVjdFxuICByZXR1cm4geyBtaW1lVHlwZTogbWltZVR5cGVSZWNvcmQsIGJvZHkgfVxufVxuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtdXJsLXNlcmlhbGl6ZXJcbi8qKlxuICogQHBhcmFtIHtVUkx9IHVybFxuICogQHBhcmFtIHtib29sZWFufSBleGNsdWRlRnJhZ21lbnRcbiAqL1xuZnVuY3Rpb24gVVJMU2VyaWFsaXplciAodXJsLCBleGNsdWRlRnJhZ21lbnQgPSBmYWxzZSkge1xuICBpZiAoIWV4Y2x1ZGVGcmFnbWVudCkge1xuICAgIHJldHVybiB1cmwuaHJlZlxuICB9XG5cbiAgY29uc3QgaHJlZiA9IHVybC5ocmVmXG4gIGNvbnN0IGhhc2hMZW5ndGggPSB1cmwuaGFzaC5sZW5ndGhcblxuICByZXR1cm4gaGFzaExlbmd0aCA9PT0gMCA/IGhyZWYgOiBocmVmLnN1YnN0cmluZygwLCBocmVmLmxlbmd0aCAtIGhhc2hMZW5ndGgpXG59XG5cbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNjb2xsZWN0LWEtc2VxdWVuY2Utb2YtY29kZS1wb2ludHNcbi8qKlxuICogQHBhcmFtIHsoY2hhcjogc3RyaW5nKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHt7IHBvc2l0aW9uOiBudW1iZXIgfX0gcG9zaXRpb25cbiAqL1xuZnVuY3Rpb24gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyAoY29uZGl0aW9uLCBpbnB1dCwgcG9zaXRpb24pIHtcbiAgLy8gMS4gTGV0IHJlc3VsdCBiZSB0aGUgZW1wdHkgc3RyaW5nLlxuICBsZXQgcmVzdWx0ID0gJydcblxuICAvLyAyLiBXaGlsZSBwb3NpdGlvbiBkb2VzbuKAmXQgcG9pbnQgcGFzdCB0aGUgZW5kIG9mIGlucHV0IGFuZCB0aGVcbiAgLy8gY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXQgbWVldHMgdGhlIGNvbmRpdGlvbiBjb25kaXRpb246XG4gIHdoaWxlIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCAmJiBjb25kaXRpb24oaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dKSkge1xuICAgIC8vIDEuIEFwcGVuZCB0aGF0IGNvZGUgcG9pbnQgdG8gdGhlIGVuZCBvZiByZXN1bHQuXG4gICAgcmVzdWx0ICs9IGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXVxuXG4gICAgLy8gMi4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcbiAgfVxuXG4gIC8vIDMuIFJldHVybiByZXN1bHQuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBBIGZhc3RlciBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzIHRoYXQgb25seSB3b3JrcyB3aGVuIGNvbXBhcmluZyBhIHNpbmdsZSBjaGFyYWN0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhclxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge3sgcG9zaXRpb246IG51bWJlciB9fSBwb3NpdGlvblxuICovXG5mdW5jdGlvbiBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdCAoY2hhciwgaW5wdXQsIHBvc2l0aW9uKSB7XG4gIGNvbnN0IGlkeCA9IGlucHV0LmluZGV4T2YoY2hhciwgcG9zaXRpb24ucG9zaXRpb24pXG4gIGNvbnN0IHN0YXJ0ID0gcG9zaXRpb24ucG9zaXRpb25cblxuICBpZiAoaWR4ID09PSAtMSkge1xuICAgIHBvc2l0aW9uLnBvc2l0aW9uID0gaW5wdXQubGVuZ3RoXG4gICAgcmV0dXJuIGlucHV0LnNsaWNlKHN0YXJ0KVxuICB9XG5cbiAgcG9zaXRpb24ucG9zaXRpb24gPSBpZHhcbiAgcmV0dXJuIGlucHV0LnNsaWNlKHN0YXJ0LCBwb3NpdGlvbi5wb3NpdGlvbilcbn1cblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzdHJpbmctcGVyY2VudC1kZWNvZGVcbi8qKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgKi9cbmZ1bmN0aW9uIHN0cmluZ1BlcmNlbnREZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIExldCBieXRlcyBiZSB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgaW5wdXQuXG4gIGNvbnN0IGJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoaW5wdXQpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBwZXJjZW50LWRlY29kaW5nIG9mIGJ5dGVzLlxuICByZXR1cm4gcGVyY2VudERlY29kZShieXRlcylcbn1cblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNwZXJjZW50LWRlY29kZVxuLyoqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgKi9cbmZ1bmN0aW9uIHBlcmNlbnREZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIExldCBvdXRwdXQgYmUgYW4gZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgY29uc3Qgb3V0cHV0ID0gW11cblxuICAvLyAyLiBGb3IgZWFjaCBieXRlIGJ5dGUgaW4gaW5wdXQ6XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBieXRlID0gaW5wdXRbaV1cblxuICAgIC8vIDEuIElmIGJ5dGUgaXMgbm90IDB4MjUgKCUpLCB0aGVuIGFwcGVuZCBieXRlIHRvIG91dHB1dC5cbiAgICBpZiAoYnl0ZSAhPT0gMHgyNSkge1xuICAgICAgb3V0cHV0LnB1c2goYnl0ZSlcblxuICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgYnl0ZSBpcyAweDI1ICglKSBhbmQgdGhlIG5leHQgdHdvIGJ5dGVzXG4gICAgLy8gYWZ0ZXIgYnl0ZSBpbiBpbnB1dCBhcmUgbm90IGluIHRoZSByYW5nZXNcbiAgICAvLyAweDMwICgwKSB0byAweDM5ICg5KSwgMHg0MSAoQSkgdG8gMHg0NiAoRiksXG4gICAgLy8gYW5kIDB4NjEgKGEpIHRvIDB4NjYgKGYpLCBhbGwgaW5jbHVzaXZlLCBhcHBlbmQgYnl0ZVxuICAgIC8vIHRvIG91dHB1dC5cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnl0ZSA9PT0gMHgyNSAmJlxuICAgICAgIS9eWzAtOUEtRmEtZl17Mn0kL2kudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGlucHV0W2kgKyAxXSwgaW5wdXRbaSArIDJdKSlcbiAgICApIHtcbiAgICAgIG91dHB1dC5wdXNoKDB4MjUpXG5cbiAgICAvLyAzLiBPdGhlcndpc2U6XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDEuIExldCBieXRlUG9pbnQgYmUgdGhlIHR3byBieXRlcyBhZnRlciBieXRlIGluIGlucHV0LFxuICAgICAgLy8gZGVjb2RlZCwgYW5kIHRoZW4gaW50ZXJwcmV0ZWQgYXMgaGV4YWRlY2ltYWwgbnVtYmVyLlxuICAgICAgY29uc3QgbmV4dFR3b0J5dGVzID0gU3RyaW5nLmZyb21DaGFyQ29kZShpbnB1dFtpICsgMV0sIGlucHV0W2kgKyAyXSlcbiAgICAgIGNvbnN0IGJ5dGVQb2ludCA9IE51bWJlci5wYXJzZUludChuZXh0VHdvQnl0ZXMsIDE2KVxuXG4gICAgICAvLyAyLiBBcHBlbmQgYSBieXRlIHdob3NlIHZhbHVlIGlzIGJ5dGVQb2ludCB0byBvdXRwdXQuXG4gICAgICBvdXRwdXQucHVzaChieXRlUG9pbnQpXG5cbiAgICAgIC8vIDMuIFNraXAgdGhlIG5leHQgdHdvIGJ5dGVzIGluIGlucHV0LlxuICAgICAgaSArPSAyXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIG91dHB1dC5cbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShvdXRwdXQpXG59XG5cbi8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jcGFyc2UtYS1taW1lLXR5cGVcbi8qKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgKi9cbmZ1bmN0aW9uIHBhcnNlTUlNRVR5cGUgKGlucHV0KSB7XG4gIC8vIDEuIFJlbW92ZSBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlXG4gIC8vIGZyb20gaW5wdXQuXG4gIGlucHV0ID0gcmVtb3ZlSFRUUFdoaXRlc3BhY2UoaW5wdXQsIHRydWUsIHRydWUpXG5cbiAgLy8gMi4gTGV0IHBvc2l0aW9uIGJlIGEgcG9zaXRpb24gdmFyaWFibGUgZm9yIGlucHV0LFxuICAvLyBpbml0aWFsbHkgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mIGlucHV0LlxuICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gIC8vIDMuIExldCB0eXBlIGJlIHRoZSByZXN1bHQgb2YgY29sbGVjdGluZyBhIHNlcXVlbmNlXG4gIC8vIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCBVKzAwMkYgKC8pIGZyb21cbiAgLy8gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICBjb25zdCB0eXBlID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgJy8nLFxuICAgIGlucHV0LFxuICAgIHBvc2l0aW9uXG4gIClcblxuICAvLyA0LiBJZiB0eXBlIGlzIHRoZSBlbXB0eSBzdHJpbmcgb3IgZG9lcyBub3Qgc29sZWx5XG4gIC8vIGNvbnRhaW4gSFRUUCB0b2tlbiBjb2RlIHBvaW50cywgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgLy8gaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNodHRwLXRva2VuLWNvZGUtcG9pbnRcbiAgaWYgKHR5cGUubGVuZ3RoID09PSAwIHx8ICFIVFRQX1RPS0VOX0NPREVQT0lOVFMudGVzdCh0eXBlKSkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDUuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiByZXR1cm5cbiAgLy8gZmFpbHVyZVxuICBpZiAocG9zaXRpb24ucG9zaXRpb24gPiBpbnB1dC5sZW5ndGgpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyA2LiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuIChUaGlzIHNraXBzIHBhc3QgVSswMDJGICgvKS4pXG4gIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAvLyA3LiBMZXQgc3VidHlwZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYSBzZXF1ZW5jZSBvZlxuICAvLyBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgVSswMDNCICg7KSBmcm9tIGlucHV0LCBnaXZlblxuICAvLyBwb3NpdGlvbi5cbiAgbGV0IHN1YnR5cGUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAnOycsXG4gICAgaW5wdXQsXG4gICAgcG9zaXRpb25cbiAgKVxuXG4gIC8vIDguIFJlbW92ZSBhbnkgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlIGZyb20gc3VidHlwZS5cbiAgc3VidHlwZSA9IHJlbW92ZUhUVFBXaGl0ZXNwYWNlKHN1YnR5cGUsIGZhbHNlLCB0cnVlKVxuXG4gIC8vIDkuIElmIHN1YnR5cGUgaXMgdGhlIGVtcHR5IHN0cmluZyBvciBkb2VzIG5vdCBzb2xlbHlcbiAgLy8gY29udGFpbiBIVFRQIHRva2VuIGNvZGUgcG9pbnRzLCB0aGVuIHJldHVybiBmYWlsdXJlLlxuICBpZiAoc3VidHlwZS5sZW5ndGggPT09IDAgfHwgIUhUVFBfVE9LRU5fQ09ERVBPSU5UUy50ZXN0KHN1YnR5cGUpKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgY29uc3QgdHlwZUxvd2VyY2FzZSA9IHR5cGUudG9Mb3dlckNhc2UoKVxuICBjb25zdCBzdWJ0eXBlTG93ZXJjYXNlID0gc3VidHlwZS50b0xvd2VyQ2FzZSgpXG5cbiAgLy8gMTAuIExldCBtaW1lVHlwZSBiZSBhIG5ldyBNSU1FIHR5cGUgcmVjb3JkIHdob3NlIHR5cGVcbiAgLy8gaXMgdHlwZSwgaW4gQVNDSUkgbG93ZXJjYXNlLCBhbmQgc3VidHlwZSBpcyBzdWJ0eXBlLFxuICAvLyBpbiBBU0NJSSBsb3dlcmNhc2UuXG4gIC8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jbWltZS10eXBlXG4gIGNvbnN0IG1pbWVUeXBlID0ge1xuICAgIHR5cGU6IHR5cGVMb3dlcmNhc2UsXG4gICAgc3VidHlwZTogc3VidHlwZUxvd2VyY2FzZSxcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgcGFyYW1ldGVyczogbmV3IE1hcCgpLFxuICAgIC8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jbWltZS10eXBlLWVzc2VuY2VcbiAgICBlc3NlbmNlOiBgJHt0eXBlTG93ZXJjYXNlfS8ke3N1YnR5cGVMb3dlcmNhc2V9YFxuICB9XG5cbiAgLy8gMTEuIFdoaWxlIHBvc2l0aW9uIGlzIG5vdCBwYXN0IHRoZSBlbmQgb2YgaW5wdXQ6XG4gIHdoaWxlIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCkge1xuICAgIC8vIDEuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS4gKFRoaXMgc2tpcHMgcGFzdCBVKzAwM0IgKDspLilcbiAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgICAvLyAyLiBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgSFRUUFxuICAgIC8vIHdoaXRlc3BhY2UgZnJvbSBpbnB1dCBnaXZlbiBwb3NpdGlvbi5cbiAgICBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzKFxuICAgICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtd2hpdGVzcGFjZVxuICAgICAgY2hhciA9PiBIVFRQX1dISVRFU1BBQ0VfUkVHRVgudGVzdChjaGFyKSxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyAzLiBMZXQgcGFyYW1ldGVyTmFtZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYVxuICAgIC8vIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCBVKzAwM0IgKDspXG4gICAgLy8gb3IgVSswMDNEICg9KSBmcm9tIGlucHV0LCBnaXZlbiBwb3NpdGlvbi5cbiAgICBsZXQgcGFyYW1ldGVyTmFtZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMoXG4gICAgICAoY2hhcikgPT4gY2hhciAhPT0gJzsnICYmIGNoYXIgIT09ICc9JyxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyA0LiBTZXQgcGFyYW1ldGVyTmFtZSB0byBwYXJhbWV0ZXJOYW1lLCBpbiBBU0NJSVxuICAgIC8vIGxvd2VyY2FzZS5cbiAgICBwYXJhbWV0ZXJOYW1lID0gcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgICAvLyA1LiBJZiBwb3NpdGlvbiBpcyBub3QgcGFzdCB0aGUgZW5kIG9mIGlucHV0LCB0aGVuOlxuICAgIGlmIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgLy8gMS4gSWYgdGhlIGNvZGUgcG9pbnQgYXQgcG9zaXRpb24gd2l0aGluIGlucHV0IGlzXG4gICAgICAvLyBVKzAwM0IgKDspLCB0aGVuIGNvbnRpbnVlLlxuICAgICAgaWYgKGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSA9PT0gJzsnKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS4gKFRoaXMgc2tpcHMgcGFzdCBVKzAwM0QgKD0pLilcbiAgICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcbiAgICB9XG5cbiAgICAvLyA2LiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW4gYnJlYWsuXG4gICAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uID4gaW5wdXQubGVuZ3RoKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIC8vIDcuIExldCBwYXJhbWV0ZXJWYWx1ZSBiZSBudWxsLlxuICAgIGxldCBwYXJhbWV0ZXJWYWx1ZSA9IG51bGxcblxuICAgIC8vIDguIElmIHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpbiBpbnB1dCBpc1xuICAgIC8vIFUrMDAyMiAoXCIpLCB0aGVuOlxuICAgIGlmIChpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl0gPT09ICdcIicpIHtcbiAgICAgIC8vIDEuIFNldCBwYXJhbWV0ZXJWYWx1ZSB0byB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmdcbiAgICAgIC8vIGFuIEhUVFAgcXVvdGVkIHN0cmluZyBmcm9tIGlucHV0LCBnaXZlbiBwb3NpdGlvblxuICAgICAgLy8gYW5kIHRoZSBleHRyYWN0LXZhbHVlIGZsYWcuXG4gICAgICBwYXJhbWV0ZXJWYWx1ZSA9IGNvbGxlY3RBbkhUVFBRdW90ZWRTdHJpbmcoaW5wdXQsIHBvc2l0aW9uLCB0cnVlKVxuXG4gICAgICAvLyAyLiBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90XG4gICAgICAvLyBVKzAwM0IgKDspIGZyb20gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgICAgICc7JyxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHBvc2l0aW9uXG4gICAgICApXG5cbiAgICAvLyA5LiBPdGhlcndpc2U6XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDEuIFNldCBwYXJhbWV0ZXJWYWx1ZSB0byB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmdcbiAgICAgIC8vIGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IFUrMDAzQiAoOylcbiAgICAgIC8vIGZyb20gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgcGFyYW1ldGVyVmFsdWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAgICAgJzsnLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcG9zaXRpb25cbiAgICAgIClcblxuICAgICAgLy8gMi4gUmVtb3ZlIGFueSB0cmFpbGluZyBIVFRQIHdoaXRlc3BhY2UgZnJvbSBwYXJhbWV0ZXJWYWx1ZS5cbiAgICAgIHBhcmFtZXRlclZhbHVlID0gcmVtb3ZlSFRUUFdoaXRlc3BhY2UocGFyYW1ldGVyVmFsdWUsIGZhbHNlLCB0cnVlKVxuXG4gICAgICAvLyAzLiBJZiBwYXJhbWV0ZXJWYWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIGNvbnRpbnVlLlxuICAgICAgaWYgKHBhcmFtZXRlclZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDEwLiBJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZVxuICAgIC8vIC0gcGFyYW1ldGVyTmFtZSBpcyBub3QgdGhlIGVtcHR5IHN0cmluZ1xuICAgIC8vIC0gcGFyYW1ldGVyTmFtZSBzb2xlbHkgY29udGFpbnMgSFRUUCB0b2tlbiBjb2RlIHBvaW50c1xuICAgIC8vIC0gcGFyYW1ldGVyVmFsdWUgc29sZWx5IGNvbnRhaW5zIEhUVFAgcXVvdGVkLXN0cmluZyB0b2tlbiBjb2RlIHBvaW50c1xuICAgIC8vIC0gbWltZVR5cGXigJlzIHBhcmFtZXRlcnNbcGFyYW1ldGVyTmFtZV0gZG9lcyBub3QgZXhpc3RcbiAgICAvLyB0aGVuIHNldCBtaW1lVHlwZeKAmXMgcGFyYW1ldGVyc1twYXJhbWV0ZXJOYW1lXSB0byBwYXJhbWV0ZXJWYWx1ZS5cbiAgICBpZiAoXG4gICAgICBwYXJhbWV0ZXJOYW1lLmxlbmd0aCAhPT0gMCAmJlxuICAgICAgSFRUUF9UT0tFTl9DT0RFUE9JTlRTLnRlc3QocGFyYW1ldGVyTmFtZSkgJiZcbiAgICAgIChwYXJhbWV0ZXJWYWx1ZS5sZW5ndGggPT09IDAgfHwgSFRUUF9RVU9URURfU1RSSU5HX1RPS0VOUy50ZXN0KHBhcmFtZXRlclZhbHVlKSkgJiZcbiAgICAgICFtaW1lVHlwZS5wYXJhbWV0ZXJzLmhhcyhwYXJhbWV0ZXJOYW1lKVxuICAgICkge1xuICAgICAgbWltZVR5cGUucGFyYW1ldGVycy5zZXQocGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyVmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gMTIuIFJldHVybiBtaW1lVHlwZS5cbiAgcmV0dXJuIG1pbWVUeXBlXG59XG5cbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNmb3JnaXZpbmctYmFzZTY0LWRlY29kZVxuLyoqIEBwYXJhbSB7c3RyaW5nfSBkYXRhICovXG5mdW5jdGlvbiBmb3JnaXZpbmdCYXNlNjQgKGRhdGEpIHtcbiAgLy8gMS4gUmVtb3ZlIGFsbCBBU0NJSSB3aGl0ZXNwYWNlIGZyb20gZGF0YS5cbiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvW1xcdTAwMDlcXHUwMDBBXFx1MDAwQ1xcdTAwMERcXHUwMDIwXS9nLCAnJykgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICAvLyAyLiBJZiBkYXRh4oCZcyBjb2RlIHBvaW50IGxlbmd0aCBkaXZpZGVzIGJ5IDQgbGVhdmluZ1xuICAvLyBubyByZW1haW5kZXIsIHRoZW46XG4gIGlmIChkYXRhLmxlbmd0aCAlIDQgPT09IDApIHtcbiAgICAvLyAxLiBJZiBkYXRhIGVuZHMgd2l0aCBvbmUgb3IgdHdvIFUrMDAzRCAoPSkgY29kZSBwb2ludHMsXG4gICAgLy8gdGhlbiByZW1vdmUgdGhlbSBmcm9tIGRhdGEuXG4gICAgZGF0YSA9IGRhdGEucmVwbGFjZSgvPT89JC8sICcnKVxuICB9XG5cbiAgLy8gMy4gSWYgZGF0YeKAmXMgY29kZSBwb2ludCBsZW5ndGggZGl2aWRlcyBieSA0IGxlYXZpbmdcbiAgLy8gYSByZW1haW5kZXIgb2YgMSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgaWYgKGRhdGEubGVuZ3RoICUgNCA9PT0gMSkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDQuIElmIGRhdGEgY29udGFpbnMgYSBjb2RlIHBvaW50IHRoYXQgaXMgbm90IG9uZSBvZlxuICAvLyAgVSswMDJCICgrKVxuICAvLyAgVSswMDJGICgvKVxuICAvLyAgQVNDSUkgYWxwaGFudW1lcmljXG4gIC8vIHRoZW4gcmV0dXJuIGZhaWx1cmUuXG4gIGlmICgvW14rLzAtOUEtWmEtel0vLnRlc3QoZGF0YSkpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICBjb25zdCBiaW5hcnkgPSBhdG9iKGRhdGEpXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aClcblxuICBmb3IgKGxldCBieXRlID0gMDsgYnl0ZSA8IGJpbmFyeS5sZW5ndGg7IGJ5dGUrKykge1xuICAgIGJ5dGVzW2J5dGVdID0gYmluYXJ5LmNoYXJDb2RlQXQoYnl0ZSlcbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29sbGVjdC1hbi1odHRwLXF1b3RlZC1zdHJpbmdcbi8vIHRlc3RzOiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZXhhbXBsZS1odHRwLXF1b3RlZC1zdHJpbmdcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge3sgcG9zaXRpb246IG51bWJlciB9fSBwb3NpdGlvblxuICogQHBhcmFtIHtib29sZWFuP30gZXh0cmFjdFZhbHVlXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RBbkhUVFBRdW90ZWRTdHJpbmcgKGlucHV0LCBwb3NpdGlvbiwgZXh0cmFjdFZhbHVlKSB7XG4gIC8vIDEuIExldCBwb3NpdGlvblN0YXJ0IGJlIHBvc2l0aW9uLlxuICBjb25zdCBwb3NpdGlvblN0YXJ0ID0gcG9zaXRpb24ucG9zaXRpb25cblxuICAvLyAyLiBMZXQgdmFsdWUgYmUgdGhlIGVtcHR5IHN0cmluZy5cbiAgbGV0IHZhbHVlID0gJydcblxuICAvLyAzLiBBc3NlcnQ6IHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpbiBpbnB1dFxuICAvLyBpcyBVKzAwMjIgKFwiKS5cbiAgYXNzZXJ0KGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSA9PT0gJ1wiJylcblxuICAvLyA0LiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuXG4gIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAvLyA1LiBXaGlsZSB0cnVlOlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIDEuIEFwcGVuZCB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYSBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50c1xuICAgIC8vIHRoYXQgYXJlIG5vdCBVKzAwMjIgKFwiKSBvciBVKzAwNUMgKFxcKSBmcm9tIGlucHV0LCBnaXZlblxuICAgIC8vIHBvc2l0aW9uLCB0byB2YWx1ZS5cbiAgICB2YWx1ZSArPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzKFxuICAgICAgKGNoYXIpID0+IGNoYXIgIT09ICdcIicgJiYgY2hhciAhPT0gJ1xcXFwnLFxuICAgICAgaW5wdXQsXG4gICAgICBwb3NpdGlvblxuICAgIClcblxuICAgIC8vIDIuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiBicmVhay5cbiAgICBpZiAocG9zaXRpb24ucG9zaXRpb24gPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIC8vIDMuIExldCBxdW90ZU9yQmFja3NsYXNoIGJlIHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpblxuICAgIC8vIGlucHV0LlxuICAgIGNvbnN0IHF1b3RlT3JCYWNrc2xhc2ggPSBpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl1cblxuICAgIC8vIDQuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS5cbiAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgICAvLyA1LiBJZiBxdW90ZU9yQmFja3NsYXNoIGlzIFUrMDA1QyAoXFwpLCB0aGVuOlxuICAgIGlmIChxdW90ZU9yQmFja3NsYXNoID09PSAnXFxcXCcpIHtcbiAgICAgIC8vIDEuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiBhcHBlbmRcbiAgICAgIC8vIFUrMDA1QyAoXFwpIHRvIHZhbHVlIGFuZCBicmVhay5cbiAgICAgIGlmIChwb3NpdGlvbi5wb3NpdGlvbiA+PSBpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWUgKz0gJ1xcXFwnXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEFwcGVuZCB0aGUgY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXQgdG8gdmFsdWUuXG4gICAgICB2YWx1ZSArPSBpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl1cblxuICAgICAgLy8gMy4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICAgICAgcG9zaXRpb24ucG9zaXRpb24rK1xuXG4gICAgLy8gNi4gT3RoZXJ3aXNlOlxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAxLiBBc3NlcnQ6IHF1b3RlT3JCYWNrc2xhc2ggaXMgVSswMDIyIChcIikuXG4gICAgICBhc3NlcnQocXVvdGVPckJhY2tzbGFzaCA9PT0gJ1wiJylcblxuICAgICAgLy8gMi4gQnJlYWsuXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIDYuIElmIHRoZSBleHRyYWN0LXZhbHVlIGZsYWcgaXMgc2V0LCB0aGVuIHJldHVybiB2YWx1ZS5cbiAgaWYgKGV4dHJhY3RWYWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLy8gNy4gUmV0dXJuIHRoZSBjb2RlIHBvaW50cyBmcm9tIHBvc2l0aW9uU3RhcnQgdG8gcG9zaXRpb24sXG4gIC8vIGluY2x1c2l2ZSwgd2l0aGluIGlucHV0LlxuICByZXR1cm4gaW5wdXQuc2xpY2UocG9zaXRpb25TdGFydCwgcG9zaXRpb24ucG9zaXRpb24pXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI3NlcmlhbGl6ZS1hLW1pbWUtdHlwZVxuICovXG5mdW5jdGlvbiBzZXJpYWxpemVBTWltZVR5cGUgKG1pbWVUeXBlKSB7XG4gIGFzc2VydChtaW1lVHlwZSAhPT0gJ2ZhaWx1cmUnKVxuICBjb25zdCB7IHBhcmFtZXRlcnMsIGVzc2VuY2UgfSA9IG1pbWVUeXBlXG5cbiAgLy8gMS4gTGV0IHNlcmlhbGl6YXRpb24gYmUgdGhlIGNvbmNhdGVuYXRpb24gb2YgbWltZVR5cGXigJlzXG4gIC8vICAgIHR5cGUsIFUrMDAyRiAoLyksIGFuZCBtaW1lVHlwZeKAmXMgc3VidHlwZS5cbiAgbGV0IHNlcmlhbGl6YXRpb24gPSBlc3NlbmNlXG5cbiAgLy8gMi4gRm9yIGVhY2ggbmFtZSDihpIgdmFsdWUgb2YgbWltZVR5cGXigJlzIHBhcmFtZXRlcnM6XG4gIGZvciAobGV0IFtuYW1lLCB2YWx1ZV0gb2YgcGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAvLyAxLiBBcHBlbmQgVSswMDNCICg7KSB0byBzZXJpYWxpemF0aW9uLlxuICAgIHNlcmlhbGl6YXRpb24gKz0gJzsnXG5cbiAgICAvLyAyLiBBcHBlbmQgbmFtZSB0byBzZXJpYWxpemF0aW9uLlxuICAgIHNlcmlhbGl6YXRpb24gKz0gbmFtZVxuXG4gICAgLy8gMy4gQXBwZW5kIFUrMDAzRCAoPSkgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9ICc9J1xuXG4gICAgLy8gNC4gSWYgdmFsdWUgZG9lcyBub3Qgc29sZWx5IGNvbnRhaW4gSFRUUCB0b2tlbiBjb2RlXG4gICAgLy8gICAgcG9pbnRzIG9yIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHRoZW46XG4gICAgaWYgKCFIVFRQX1RPS0VOX0NPREVQT0lOVFMudGVzdCh2YWx1ZSkpIHtcbiAgICAgIC8vIDEuIFByZWNlZGUgZWFjaCBvY2N1cmVuY2Ugb2YgVSswMDIyIChcIikgb3JcbiAgICAgIC8vICAgIFUrMDA1QyAoXFwpIGluIHZhbHVlIHdpdGggVSswMDVDIChcXCkuXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLyhcXFxcfFwiKS9nLCAnXFxcXCQxJylcblxuICAgICAgLy8gMi4gUHJlcGVuZCBVKzAwMjIgKFwiKSB0byB2YWx1ZS5cbiAgICAgIHZhbHVlID0gJ1wiJyArIHZhbHVlXG5cbiAgICAgIC8vIDMuIEFwcGVuZCBVKzAwMjIgKFwiKSB0byB2YWx1ZS5cbiAgICAgIHZhbHVlICs9ICdcIidcbiAgICB9XG5cbiAgICAvLyA1LiBBcHBlbmQgdmFsdWUgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9IHZhbHVlXG4gIH1cblxuICAvLyAzLiBSZXR1cm4gc2VyaWFsaXphdGlvbi5cbiAgcmV0dXJuIHNlcmlhbGl6YXRpb25cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXdoaXRlc3BhY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyXG4gKi9cbmZ1bmN0aW9uIGlzSFRUUFdoaXRlU3BhY2UgKGNoYXIpIHtcbiAgcmV0dXJuIGNoYXIgPT09ICdcXHInIHx8IGNoYXIgPT09ICdcXG4nIHx8IGNoYXIgPT09ICdcXHQnIHx8IGNoYXIgPT09ICcgJ1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtd2hpdGVzcGFjZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICovXG5mdW5jdGlvbiByZW1vdmVIVFRQV2hpdGVzcGFjZSAoc3RyLCBsZWFkaW5nID0gdHJ1ZSwgdHJhaWxpbmcgPSB0cnVlKSB7XG4gIGxldCBsZWFkID0gMFxuICBsZXQgdHJhaWwgPSBzdHIubGVuZ3RoIC0gMVxuXG4gIGlmIChsZWFkaW5nKSB7XG4gICAgZm9yICg7IGxlYWQgPCBzdHIubGVuZ3RoICYmIGlzSFRUUFdoaXRlU3BhY2Uoc3RyW2xlYWRdKTsgbGVhZCsrKTtcbiAgfVxuXG4gIGlmICh0cmFpbGluZykge1xuICAgIGZvciAoOyB0cmFpbCA+IDAgJiYgaXNIVFRQV2hpdGVTcGFjZShzdHJbdHJhaWxdKTsgdHJhaWwtLSk7XG4gIH1cblxuICByZXR1cm4gc3RyLnNsaWNlKGxlYWQsIHRyYWlsICsgMSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS13aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhclxuICovXG5mdW5jdGlvbiBpc0FTQ0lJV2hpdGVzcGFjZSAoY2hhcikge1xuICByZXR1cm4gY2hhciA9PT0gJ1xccicgfHwgY2hhciA9PT0gJ1xcbicgfHwgY2hhciA9PT0gJ1xcdCcgfHwgY2hhciA9PT0gJ1xcZicgfHwgY2hhciA9PT0gJyAnXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtbGVhZGluZy1hbmQtdHJhaWxpbmctYXNjaWktd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiByZW1vdmVBU0NJSVdoaXRlc3BhY2UgKHN0ciwgbGVhZGluZyA9IHRydWUsIHRyYWlsaW5nID0gdHJ1ZSkge1xuICBsZXQgbGVhZCA9IDBcbiAgbGV0IHRyYWlsID0gc3RyLmxlbmd0aCAtIDFcblxuICBpZiAobGVhZGluZykge1xuICAgIGZvciAoOyBsZWFkIDwgc3RyLmxlbmd0aCAmJiBpc0FTQ0lJV2hpdGVzcGFjZShzdHJbbGVhZF0pOyBsZWFkKyspO1xuICB9XG5cbiAgaWYgKHRyYWlsaW5nKSB7XG4gICAgZm9yICg7IHRyYWlsID4gMCAmJiBpc0FTQ0lJV2hpdGVzcGFjZShzdHJbdHJhaWxdKTsgdHJhaWwtLSk7XG4gIH1cblxuICByZXR1cm4gc3RyLnNsaWNlKGxlYWQsIHRyYWlsICsgMSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRhdGFVUkxQcm9jZXNzb3IsXG4gIFVSTFNlcmlhbGl6ZXIsXG4gIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMsXG4gIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0LFxuICBzdHJpbmdQZXJjZW50RGVjb2RlLFxuICBwYXJzZU1JTUVUeXBlLFxuICBjb2xsZWN0QW5IVFRQUXVvdGVkU3RyaW5nLFxuICBzZXJpYWxpemVBTWltZVR5cGVcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgQmxvYiwgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuY29uc3QgeyBrU3RhdGUgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGlzQmxvYkxpa2UgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi93ZWJpZGwnKVxuY29uc3QgeyBwYXJzZU1JTUVUeXBlLCBzZXJpYWxpemVBTWltZVR5cGUgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKClcblxuY2xhc3MgRmlsZSBleHRlbmRzIEJsb2Ige1xuICBjb25zdHJ1Y3RvciAoZmlsZUJpdHMsIGZpbGVOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAvLyBUaGUgRmlsZSBjb25zdHJ1Y3RvciBpcyBpbnZva2VkIHdpdGggdHdvIG9yIHRocmVlIHBhcmFtZXRlcnMsIGRlcGVuZGluZ1xuICAgIC8vIG9uIHdoZXRoZXIgdGhlIG9wdGlvbmFsIGRpY3Rpb25hcnkgcGFyYW1ldGVyIGlzIHVzZWQuIFdoZW4gdGhlIEZpbGUoKVxuICAgIC8vIGNvbnN0cnVjdG9yIGlzIGludm9rZWQsIHVzZXIgYWdlbnRzIG11c3QgcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0ZpbGUgY29uc3RydWN0b3InIH0pXG5cbiAgICBmaWxlQml0cyA9IHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxCbG9iUGFydD4nXShmaWxlQml0cylcbiAgICBmaWxlTmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhmaWxlTmFtZSlcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuRmlsZVByb3BlcnR5QmFnKG9wdGlvbnMpXG5cbiAgICAvLyAxLiBMZXQgYnl0ZXMgYmUgdGhlIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGJsb2IgcGFydHMgZ2l2ZW4gZmlsZUJpdHMgYW5kXG4gICAgLy8gb3B0aW9ucy5cbiAgICAvLyBOb3RlOiBCbG9iIGhhbmRsZXMgdGhpcyBmb3IgdXNcblxuICAgIC8vIDIuIExldCBuIGJlIHRoZSBmaWxlTmFtZSBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgY29uc3QgbiA9IGZpbGVOYW1lXG5cbiAgICAvLyAzLiBQcm9jZXNzIEZpbGVQcm9wZXJ0eUJhZyBkaWN0aW9uYXJ5IGFyZ3VtZW50IGJ5IHJ1bm5pbmcgdGhlIGZvbGxvd2luZ1xuICAgIC8vIHN1YnN0ZXBzOlxuXG4gICAgLy8gICAgMS4gSWYgdGhlIHR5cGUgbWVtYmVyIGlzIHByb3ZpZGVkIGFuZCBpcyBub3QgdGhlIGVtcHR5IHN0cmluZywgbGV0IHRcbiAgICAvLyAgICBiZSBzZXQgdG8gdGhlIHR5cGUgZGljdGlvbmFyeSBtZW1iZXIuIElmIHQgY29udGFpbnMgYW55IGNoYXJhY3RlcnNcbiAgICAvLyAgICBvdXRzaWRlIHRoZSByYW5nZSBVKzAwMjAgdG8gVSswMDdFLCB0aGVuIHNldCB0IHRvIHRoZSBlbXB0eSBzdHJpbmdcbiAgICAvLyAgICBhbmQgcmV0dXJuIGZyb20gdGhlc2Ugc3Vic3RlcHMuXG4gICAgLy8gICAgMi4gQ29udmVydCBldmVyeSBjaGFyYWN0ZXIgaW4gdCB0byBBU0NJSSBsb3dlcmNhc2UuXG4gICAgbGV0IHQgPSBvcHRpb25zLnR5cGVcbiAgICBsZXQgZFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxhYmVsc1xuICAgIHN1YnN0ZXA6IHtcbiAgICAgIGlmICh0KSB7XG4gICAgICAgIHQgPSBwYXJzZU1JTUVUeXBlKHQpXG5cbiAgICAgICAgaWYgKHQgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIHQgPSAnJ1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sYWJlbHNcbiAgICAgICAgICBicmVhayBzdWJzdGVwXG4gICAgICAgIH1cblxuICAgICAgICB0ID0gc2VyaWFsaXplQU1pbWVUeXBlKHQpLnRvTG93ZXJDYXNlKClcbiAgICAgIH1cblxuICAgICAgLy8gICAgMy4gSWYgdGhlIGxhc3RNb2RpZmllZCBtZW1iZXIgaXMgcHJvdmlkZWQsIGxldCBkIGJlIHNldCB0byB0aGVcbiAgICAgIC8vICAgIGxhc3RNb2RpZmllZCBkaWN0aW9uYXJ5IG1lbWJlci4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCBzZXQgZCB0byB0aGVcbiAgICAgIC8vICAgIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSByZXByZXNlbnRlZCBhcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZVxuICAgICAgLy8gICAgdGhlIFVuaXggRXBvY2ggKHdoaWNoIGlzIHRoZSBlcXVpdmFsZW50IG9mIERhdGUubm93KCkgW0VDTUEtMjYyXSkuXG4gICAgICBkID0gb3B0aW9ucy5sYXN0TW9kaWZpZWRcbiAgICB9XG5cbiAgICAvLyA0LiBSZXR1cm4gYSBuZXcgRmlsZSBvYmplY3QgRiBzdWNoIHRoYXQ6XG4gICAgLy8gRiByZWZlcnMgdG8gdGhlIGJ5dGVzIGJ5dGUgc2VxdWVuY2UuXG4gICAgLy8gRi5zaXplIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIGluIGJ5dGVzLlxuICAgIC8vIEYubmFtZSBpcyBzZXQgdG8gbi5cbiAgICAvLyBGLnR5cGUgaXMgc2V0IHRvIHQuXG4gICAgLy8gRi5sYXN0TW9kaWZpZWQgaXMgc2V0IHRvIGQuXG5cbiAgICBzdXBlcihwcm9jZXNzQmxvYlBhcnRzKGZpbGVCaXRzLCBvcHRpb25zKSwgeyB0eXBlOiB0IH0pXG4gICAgdGhpc1trU3RhdGVdID0ge1xuICAgICAgbmFtZTogbixcbiAgICAgIGxhc3RNb2RpZmllZDogZCxcbiAgICAgIHR5cGU6IHRcbiAgICB9XG4gIH1cblxuICBnZXQgbmFtZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubmFtZVxuICB9XG5cbiAgZ2V0IGxhc3RNb2RpZmllZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubGFzdE1vZGlmaWVkXG4gIH1cblxuICBnZXQgdHlwZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0udHlwZVxuICB9XG59XG5cbmNsYXNzIEZpbGVMaWtlIHtcbiAgY29uc3RydWN0b3IgKGJsb2JMaWtlLCBmaWxlTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gVE9ETzogYXJndW1lbnQgaWRsIHR5cGUgY2hlY2tcblxuICAgIC8vIFRoZSBGaWxlIGNvbnN0cnVjdG9yIGlzIGludm9rZWQgd2l0aCB0d28gb3IgdGhyZWUgcGFyYW1ldGVycywgZGVwZW5kaW5nXG4gICAgLy8gb24gd2hldGhlciB0aGUgb3B0aW9uYWwgZGljdGlvbmFyeSBwYXJhbWV0ZXIgaXMgdXNlZC4gV2hlbiB0aGUgRmlsZSgpXG4gICAgLy8gY29uc3RydWN0b3IgaXMgaW52b2tlZCwgdXNlciBhZ2VudHMgbXVzdCBydW4gdGhlIGZvbGxvd2luZyBzdGVwczpcblxuICAgIC8vIDEuIExldCBieXRlcyBiZSB0aGUgcmVzdWx0IG9mIHByb2Nlc3NpbmcgYmxvYiBwYXJ0cyBnaXZlbiBmaWxlQml0cyBhbmRcbiAgICAvLyBvcHRpb25zLlxuXG4gICAgLy8gMi4gTGV0IG4gYmUgdGhlIGZpbGVOYW1lIGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBjb25zdCBuID0gZmlsZU5hbWVcblxuICAgIC8vIDMuIFByb2Nlc3MgRmlsZVByb3BlcnR5QmFnIGRpY3Rpb25hcnkgYXJndW1lbnQgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nXG4gICAgLy8gc3Vic3RlcHM6XG5cbiAgICAvLyAgICAxLiBJZiB0aGUgdHlwZSBtZW1iZXIgaXMgcHJvdmlkZWQgYW5kIGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nLCBsZXQgdFxuICAgIC8vICAgIGJlIHNldCB0byB0aGUgdHlwZSBkaWN0aW9uYXJ5IG1lbWJlci4gSWYgdCBjb250YWlucyBhbnkgY2hhcmFjdGVyc1xuICAgIC8vICAgIG91dHNpZGUgdGhlIHJhbmdlIFUrMDAyMCB0byBVKzAwN0UsIHRoZW4gc2V0IHQgdG8gdGhlIGVtcHR5IHN0cmluZ1xuICAgIC8vICAgIGFuZCByZXR1cm4gZnJvbSB0aGVzZSBzdWJzdGVwcy5cbiAgICAvLyAgICBUT0RPXG4gICAgY29uc3QgdCA9IG9wdGlvbnMudHlwZVxuXG4gICAgLy8gICAgMi4gQ29udmVydCBldmVyeSBjaGFyYWN0ZXIgaW4gdCB0byBBU0NJSSBsb3dlcmNhc2UuXG4gICAgLy8gICAgVE9ET1xuXG4gICAgLy8gICAgMy4gSWYgdGhlIGxhc3RNb2RpZmllZCBtZW1iZXIgaXMgcHJvdmlkZWQsIGxldCBkIGJlIHNldCB0byB0aGVcbiAgICAvLyAgICBsYXN0TW9kaWZpZWQgZGljdGlvbmFyeSBtZW1iZXIuIElmIGl0IGlzIG5vdCBwcm92aWRlZCwgc2V0IGQgdG8gdGhlXG4gICAgLy8gICAgY3VycmVudCBkYXRlIGFuZCB0aW1lIHJlcHJlc2VudGVkIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlXG4gICAgLy8gICAgdGhlIFVuaXggRXBvY2ggKHdoaWNoIGlzIHRoZSBlcXVpdmFsZW50IG9mIERhdGUubm93KCkgW0VDTUEtMjYyXSkuXG4gICAgY29uc3QgZCA9IG9wdGlvbnMubGFzdE1vZGlmaWVkID8/IERhdGUubm93KClcblxuICAgIC8vIDQuIFJldHVybiBhIG5ldyBGaWxlIG9iamVjdCBGIHN1Y2ggdGhhdDpcbiAgICAvLyBGIHJlZmVycyB0byB0aGUgYnl0ZXMgYnl0ZSBzZXF1ZW5jZS5cbiAgICAvLyBGLnNpemUgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgdG90YWwgYnl0ZXMgaW4gYnl0ZXMuXG4gICAgLy8gRi5uYW1lIGlzIHNldCB0byBuLlxuICAgIC8vIEYudHlwZSBpcyBzZXQgdG8gdC5cbiAgICAvLyBGLmxhc3RNb2RpZmllZCBpcyBzZXQgdG8gZC5cblxuICAgIHRoaXNba1N0YXRlXSA9IHtcbiAgICAgIGJsb2JMaWtlLFxuICAgICAgbmFtZTogbixcbiAgICAgIHR5cGU6IHQsXG4gICAgICBsYXN0TW9kaWZpZWQ6IGRcbiAgICB9XG4gIH1cblxuICBzdHJlYW0gKC4uLmFyZ3MpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2Uuc3RyZWFtKC4uLmFyZ3MpXG4gIH1cblxuICBhcnJheUJ1ZmZlciAoLi4uYXJncykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS5hcnJheUJ1ZmZlciguLi5hcmdzKVxuICB9XG5cbiAgc2xpY2UgKC4uLmFyZ3MpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2Uuc2xpY2UoLi4uYXJncylcbiAgfVxuXG4gIHRleHQgKC4uLmFyZ3MpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2UudGV4dCguLi5hcmdzKVxuICB9XG5cbiAgZ2V0IHNpemUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS5zaXplXG4gIH1cblxuICBnZXQgdHlwZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJsb2JMaWtlLnR5cGVcbiAgfVxuXG4gIGdldCBuYW1lICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubmFtZVxuICB9XG5cbiAgZ2V0IGxhc3RNb2RpZmllZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmxhc3RNb2RpZmllZFxuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddICgpIHtcbiAgICByZXR1cm4gJ0ZpbGUnXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRmlsZS5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0ZpbGUnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBuYW1lOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBsYXN0TW9kaWZpZWQ6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkJsb2IgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKEJsb2IpXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkJsb2JQYXJ0ID0gZnVuY3Rpb24gKFYsIG9wdHMpIHtcbiAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgPT09ICdPYmplY3QnKSB7XG4gICAgaWYgKGlzQmxvYkxpa2UoVikpIHtcbiAgICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5CbG9iKFYsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIEFycmF5QnVmZmVyLmlzVmlldyhWKSB8fFxuICAgICAgdHlwZXMuaXNBbnlBcnJheUJ1ZmZlcihWKVxuICAgICkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkJ1ZmZlclNvdXJjZShWLCBvcHRzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcoViwgb3B0cylcbn1cblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPEJsb2JQYXJ0PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5CbG9iUGFydFxuKVxuXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvRmlsZUFQSS8jZGZuLUZpbGVQcm9wZXJ0eUJhZ1xud2ViaWRsLmNvbnZlcnRlcnMuRmlsZVByb3BlcnR5QmFnID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAnbGFzdE1vZGlmaWVkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydsb25nIGxvbmcnXSxcbiAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgIHJldHVybiBEYXRlLm5vdygpXG4gICAgfVxuICB9LFxuICB7XG4gICAga2V5OiAndHlwZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnZW5kaW5ncycsXG4gICAgY29udmVydGVyOiAodmFsdWUpID0+IHtcbiAgICAgIHZhbHVlID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKHZhbHVlKVxuICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpXG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gJ25hdGl2ZScpIHtcbiAgICAgICAgdmFsdWUgPSAndHJhbnNwYXJlbnQnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG4gICAgZGVmYXVsdFZhbHVlOiAndHJhbnNwYXJlbnQnXG4gIH1cbl0pXG5cbi8qKlxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvRmlsZUFQSS8jcHJvY2Vzcy1ibG9iLXBhcnRzXG4gKiBAcGFyYW0geyhOb2RlSlMuVHlwZWRBcnJheXxCbG9ifHN0cmluZylbXX0gcGFydHNcbiAqIEBwYXJhbSB7eyB0eXBlOiBzdHJpbmcsIGVuZGluZ3M6IHN0cmluZyB9fSBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NCbG9iUGFydHMgKHBhcnRzLCBvcHRpb25zKSB7XG4gIC8vIDEuIExldCBieXRlcyBiZSBhbiBlbXB0eSBzZXF1ZW5jZSBvZiBieXRlcy5cbiAgLyoqIEB0eXBlIHtOb2RlSlMuVHlwZWRBcnJheVtdfSAqL1xuICBjb25zdCBieXRlcyA9IFtdXG5cbiAgLy8gMi4gRm9yIGVhY2ggZWxlbWVudCBpbiBwYXJ0czpcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHBhcnRzKSB7XG4gICAgLy8gMS4gSWYgZWxlbWVudCBpcyBhIFVTVlN0cmluZywgcnVuIHRoZSBmb2xsb3dpbmcgc3Vic3RlcHM6XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gMS4gTGV0IHMgYmUgZWxlbWVudC5cbiAgICAgIGxldCBzID0gZWxlbWVudFxuXG4gICAgICAvLyAyLiBJZiB0aGUgZW5kaW5ncyBtZW1iZXIgb2Ygb3B0aW9ucyBpcyBcIm5hdGl2ZVwiLCBzZXQgc1xuICAgICAgLy8gICAgdG8gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIGxpbmUgZW5kaW5ncyB0byBuYXRpdmVcbiAgICAgIC8vICAgIG9mIGVsZW1lbnQuXG4gICAgICBpZiAob3B0aW9ucy5lbmRpbmdzID09PSAnbmF0aXZlJykge1xuICAgICAgICBzID0gY29udmVydExpbmVFbmRpbmdzTmF0aXZlKHMpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIEFwcGVuZCB0aGUgcmVzdWx0IG9mIFVURi04IGVuY29kaW5nIHMgdG8gYnl0ZXMuXG4gICAgICBieXRlcy5wdXNoKGVuY29kZXIuZW5jb2RlKHMpKVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlcy5pc0FueUFycmF5QnVmZmVyKGVsZW1lbnQpIHx8XG4gICAgICB0eXBlcy5pc1R5cGVkQXJyYXkoZWxlbWVudClcbiAgICApIHtcbiAgICAgIC8vIDIuIElmIGVsZW1lbnQgaXMgYSBCdWZmZXJTb3VyY2UsIGdldCBhIGNvcHkgb2YgdGhlXG4gICAgICAvLyAgICBieXRlcyBoZWxkIGJ5IHRoZSBidWZmZXIgc291cmNlLCBhbmQgYXBwZW5kIHRob3NlXG4gICAgICAvLyAgICBieXRlcyB0byBieXRlcy5cbiAgICAgIGlmICghZWxlbWVudC5idWZmZXIpIHsgLy8gQXJyYXlCdWZmZXJcbiAgICAgICAgYnl0ZXMucHVzaChuZXcgVWludDhBcnJheShlbGVtZW50KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoZWxlbWVudC5idWZmZXIsIGVsZW1lbnQuYnl0ZU9mZnNldCwgZWxlbWVudC5ieXRlTGVuZ3RoKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0Jsb2JMaWtlKGVsZW1lbnQpKSB7XG4gICAgICAvLyAzLiBJZiBlbGVtZW50IGlzIGEgQmxvYiwgYXBwZW5kIHRoZSBieXRlcyBpdCByZXByZXNlbnRzXG4gICAgICAvLyAgICB0byBieXRlcy5cbiAgICAgIGJ5dGVzLnB1c2goZWxlbWVudClcbiAgICB9XG4gIH1cblxuICAvLyAzLiBSZXR1cm4gYnl0ZXMuXG4gIHJldHVybiBieXRlc1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL0ZpbGVBUEkvI2NvbnZlcnQtbGluZS1lbmRpbmdzLXRvLW5hdGl2ZVxuICogQHBhcmFtIHtzdHJpbmd9IHNcbiAqL1xuZnVuY3Rpb24gY29udmVydExpbmVFbmRpbmdzTmF0aXZlIChzKSB7XG4gIC8vIDEuIExldCBuYXRpdmUgbGluZSBlbmRpbmcgYmUgYmUgdGhlIGNvZGUgcG9pbnQgVSswMDBBIExGLlxuICBsZXQgbmF0aXZlTGluZUVuZGluZyA9ICdcXG4nXG5cbiAgLy8gMi4gSWYgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm3igJlzIGNvbnZlbnRpb25zIGFyZSB0b1xuICAvLyAgICByZXByZXNlbnQgbmV3bGluZXMgYXMgYSBjYXJyaWFnZSByZXR1cm4gYW5kIGxpbmUgZmVlZFxuICAvLyAgICBzZXF1ZW5jZSwgc2V0IG5hdGl2ZSBsaW5lIGVuZGluZyB0byB0aGUgY29kZSBwb2ludFxuICAvLyAgICBVKzAwMEQgQ1IgZm9sbG93ZWQgYnkgdGhlIGNvZGUgcG9pbnQgVSswMDBBIExGLlxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIG5hdGl2ZUxpbmVFbmRpbmcgPSAnXFxyXFxuJ1xuICB9XG5cbiAgcmV0dXJuIHMucmVwbGFjZSgvXFxyP1xcbi9nLCBuYXRpdmVMaW5lRW5kaW5nKVxufVxuXG4vLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIG1vdmVkIHRvIC4vdXRpbC5qcywgc29tZSB0b29scyAoc3VjaCBhc1xuLy8gcm9sbHVwKSB3aWxsIHdhcm4gYWJvdXQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLiBTZWU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTYyOVxuZnVuY3Rpb24gaXNGaWxlTGlrZSAob2JqZWN0KSB7XG4gIHJldHVybiAoXG4gICAgKE5hdGl2ZUZpbGUgJiYgb2JqZWN0IGluc3RhbmNlb2YgTmF0aXZlRmlsZSkgfHxcbiAgICBvYmplY3QgaW5zdGFuY2VvZiBGaWxlIHx8IChcbiAgICAgIG9iamVjdCAmJlxuICAgICAgKHR5cGVvZiBvYmplY3Quc3RyZWFtID09PSAnZnVuY3Rpb24nIHx8XG4gICAgICB0eXBlb2Ygb2JqZWN0LmFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nKSAmJlxuICAgICAgb2JqZWN0W1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdGaWxlJ1xuICAgIClcbiAgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgRmlsZSwgRmlsZUxpa2UsIGlzRmlsZUxpa2UgfVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBpc0Jsb2JMaWtlLCB0b1VTVlN0cmluZywgbWFrZUl0ZXJhdG9yIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBrU3RhdGUgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IEZpbGU6IFVuZGljaUZpbGUsIEZpbGVMaWtlLCBpc0ZpbGVMaWtlIH0gPSByZXF1aXJlKCcuL2ZpbGUnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgQmxvYiwgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcblxuLyoqIEB0eXBlIHtnbG9iYWxUaGlzWydGaWxlJ119ICovXG5jb25zdCBGaWxlID0gTmF0aXZlRmlsZSA/PyBVbmRpY2lGaWxlXG5cbi8vIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jZm9ybWRhdGFcbmNsYXNzIEZvcm1EYXRhIHtcbiAgY29uc3RydWN0b3IgKGZvcm0pIHtcbiAgICBpZiAoZm9ybSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmNvbnZlcnNpb25GYWlsZWQoe1xuICAgICAgICBwcmVmaXg6ICdGb3JtRGF0YSBjb25zdHJ1Y3RvcicsXG4gICAgICAgIGFyZ3VtZW50OiAnQXJndW1lbnQgMScsXG4gICAgICAgIHR5cGVzOiBbJ3VuZGVmaW5lZCddXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXNba1N0YXRlXSA9IFtdXG4gIH1cblxuICBhcHBlbmQgKG5hbWUsIHZhbHVlLCBmaWxlbmFtZSA9IHVuZGVmaW5lZCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmFwcGVuZCcgfSlcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICFpc0Jsb2JMaWtlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kJyBvbiAnRm9ybURhdGEnOiBwYXJhbWV0ZXIgMiBpcyBub3Qgb2YgdHlwZSAnQmxvYidcIlxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIDEuIExldCB2YWx1ZSBiZSB2YWx1ZSBpZiBnaXZlbjsgb3RoZXJ3aXNlIGJsb2JWYWx1ZS5cblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcbiAgICB2YWx1ZSA9IGlzQmxvYkxpa2UodmFsdWUpXG4gICAgICA/IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IodmFsdWUsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICAgICAgOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcodmFsdWUpXG4gICAgZmlsZW5hbWUgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzXG4gICAgICA/IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhmaWxlbmFtZSlcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAvLyAyLiBMZXQgZW50cnkgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBlbnRyeSB3aXRoXG4gICAgLy8gbmFtZSwgdmFsdWUsIGFuZCBmaWxlbmFtZSBpZiBnaXZlbi5cbiAgICBjb25zdCBlbnRyeSA9IG1ha2VFbnRyeShuYW1lLCB2YWx1ZSwgZmlsZW5hbWUpXG5cbiAgICAvLyAzLiBBcHBlbmQgZW50cnkgdG8gdGhpc+KAmXMgZW50cnkgbGlzdC5cbiAgICB0aGlzW2tTdGF0ZV0ucHVzaChlbnRyeSlcbiAgfVxuXG4gIGRlbGV0ZSAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmRlbGV0ZScgfSlcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcblxuICAgIC8vIFRoZSBkZWxldGUobmFtZSkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZW1vdmUgYWxsIGVudHJpZXMgd2hvc2UgbmFtZVxuICAgIC8vIGlzIG5hbWUgZnJvbSB0aGlz4oCZcyBlbnRyeSBsaXN0LlxuICAgIHRoaXNba1N0YXRlXSA9IHRoaXNba1N0YXRlXS5maWx0ZXIoZW50cnkgPT4gZW50cnkubmFtZSAhPT0gbmFtZSlcbiAgfVxuXG4gIGdldCAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmdldCcgfSlcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IHdob3NlIG5hbWUgaXMgbmFtZSBpbiB0aGlz4oCZcyBlbnRyeSBsaXN0LFxuICAgIC8vIHRoZW4gcmV0dXJuIG51bGwuXG4gICAgY29uc3QgaWR4ID0gdGhpc1trU3RhdGVdLmZpbmRJbmRleCgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpXG4gICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZW50cnkgd2hvc2UgbmFtZSBpcyBuYW1lIGZyb21cbiAgICAvLyB0aGlz4oCZcyBlbnRyeSBsaXN0LlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV1baWR4XS52YWx1ZVxuICB9XG5cbiAgZ2V0QWxsIChuYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRm9ybURhdGEuZ2V0QWxsJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lKVxuXG4gICAgLy8gMS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgd2hvc2UgbmFtZSBpcyBuYW1lIGluIHRoaXPigJlzIGVudHJ5IGxpc3QsXG4gICAgLy8gdGhlbiByZXR1cm4gdGhlIGVtcHR5IGxpc3QuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGVudHJpZXMgd2hvc2UgbmFtZSBpcyBuYW1lLCBpbiBvcmRlcixcbiAgICAvLyBmcm9tIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXVxuICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpXG4gICAgICAubWFwKChlbnRyeSkgPT4gZW50cnkudmFsdWUpXG4gIH1cblxuICBoYXMgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGb3JtRGF0YS5oYXMnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKG5hbWUpXG5cbiAgICAvLyBUaGUgaGFzKG5hbWUpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYW4gZW50cnlcbiAgICAvLyB3aG9zZSBuYW1lIGlzIG5hbWUgaW4gdGhpc+KAmXMgZW50cnkgbGlzdDsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gbmFtZSkgIT09IC0xXG4gIH1cblxuICBzZXQgKG5hbWUsIHZhbHVlLCBmaWxlbmFtZSA9IHVuZGVmaW5lZCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLnNldCcgfSlcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICFpc0Jsb2JMaWtlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2V0JyBvbiAnRm9ybURhdGEnOiBwYXJhbWV0ZXIgMiBpcyBub3Qgb2YgdHlwZSAnQmxvYidcIlxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFRoZSBzZXQobmFtZSwgdmFsdWUpIGFuZCBzZXQobmFtZSwgYmxvYlZhbHVlLCBmaWxlbmFtZSkgbWV0aG9kIHN0ZXBzXG4gICAgLy8gYXJlOlxuXG4gICAgLy8gMS4gTGV0IHZhbHVlIGJlIHZhbHVlIGlmIGdpdmVuOyBvdGhlcndpc2UgYmxvYlZhbHVlLlxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lKVxuICAgIHZhbHVlID0gaXNCbG9iTGlrZSh2YWx1ZSlcbiAgICAgID8gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYih2YWx1ZSwgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgICA6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh2YWx1ZSlcbiAgICBmaWxlbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDNcbiAgICAgID8gdG9VU1ZTdHJpbmcoZmlsZW5hbWUpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgLy8gMi4gTGV0IGVudHJ5IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gZW50cnkgd2l0aCBuYW1lLCB2YWx1ZSwgYW5kXG4gICAgLy8gZmlsZW5hbWUgaWYgZ2l2ZW4uXG4gICAgY29uc3QgZW50cnkgPSBtYWtlRW50cnkobmFtZSwgdmFsdWUsIGZpbGVuYW1lKVxuXG4gICAgLy8gMy4gSWYgdGhlcmUgYXJlIGVudHJpZXMgaW4gdGhpc+KAmXMgZW50cnkgbGlzdCB3aG9zZSBuYW1lIGlzIG5hbWUsIHRoZW5cbiAgICAvLyByZXBsYWNlIHRoZSBmaXJzdCBzdWNoIGVudHJ5IHdpdGggZW50cnkgYW5kIHJlbW92ZSB0aGUgb3RoZXJzLlxuICAgIGNvbnN0IGlkeCA9IHRoaXNba1N0YXRlXS5maW5kSW5kZXgoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSBuYW1lKVxuICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICB0aGlzW2tTdGF0ZV0gPSBbXG4gICAgICAgIC4uLnRoaXNba1N0YXRlXS5zbGljZSgwLCBpZHgpLFxuICAgICAgICBlbnRyeSxcbiAgICAgICAgLi4udGhpc1trU3RhdGVdLnNsaWNlKGlkeCArIDEpLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgIT09IG5hbWUpXG4gICAgICBdXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgYXBwZW5kIGVudHJ5IHRvIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgICB0aGlzW2tTdGF0ZV0ucHVzaChlbnRyeSlcbiAgICB9XG4gIH1cblxuICBlbnRyaWVzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHJldHVybiBtYWtlSXRlcmF0b3IoXG4gICAgICAoKSA9PiB0aGlzW2tTdGF0ZV0ubWFwKHBhaXIgPT4gW3BhaXIubmFtZSwgcGFpci52YWx1ZV0pLFxuICAgICAgJ0Zvcm1EYXRhJyxcbiAgICAgICdrZXkrdmFsdWUnXG4gICAgKVxuICB9XG5cbiAga2V5cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFxuICAgICAgKCkgPT4gdGhpc1trU3RhdGVdLm1hcChwYWlyID0+IFtwYWlyLm5hbWUsIHBhaXIudmFsdWVdKSxcbiAgICAgICdGb3JtRGF0YScsXG4gICAgICAna2V5J1xuICAgIClcbiAgfVxuXG4gIHZhbHVlcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFxuICAgICAgKCkgPT4gdGhpc1trU3RhdGVdLm1hcChwYWlyID0+IFtwYWlyLm5hbWUsIHBhaXIudmFsdWVdKSxcbiAgICAgICdGb3JtRGF0YScsXG4gICAgICAndmFsdWUnXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nLCBzZWxmOiBGb3JtRGF0YSkgPT4gdm9pZH0gY2FsbGJhY2tGblxuICAgKiBAcGFyYW0ge3Vua25vd259IHRoaXNBcmdcbiAgICovXG4gIGZvckVhY2ggKGNhbGxiYWNrRm4sIHRoaXNBcmcgPSBnbG9iYWxUaGlzKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRm9ybURhdGEuZm9yRWFjaCcgfSlcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2tGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnZm9yRWFjaCcgb24gJ0Zvcm1EYXRhJzogcGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgJ0Z1bmN0aW9uJy5cIlxuICAgICAgKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMpIHtcbiAgICAgIGNhbGxiYWNrRm4uYXBwbHkodGhpc0FyZywgW3ZhbHVlLCBrZXksIHRoaXNdKVxuICAgIH1cbiAgfVxufVxuXG5Gb3JtRGF0YS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEZvcm1EYXRhLnByb3RvdHlwZS5lbnRyaWVzXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZvcm1EYXRhLnByb3RvdHlwZSwge1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnRm9ybURhdGEnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybS1jb250cm9sLWluZnJhc3RydWN0dXJlLmh0bWwjY3JlYXRlLWFuLWVudHJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtzdHJpbmd8QmxvYn0gdmFsdWVcbiAqIEBwYXJhbSB7P3N0cmluZ30gZmlsZW5hbWVcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIG1ha2VFbnRyeSAobmFtZSwgdmFsdWUsIGZpbGVuYW1lKSB7XG4gIC8vIDEuIFNldCBuYW1lIHRvIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBuYW1lIGludG8gYSBzY2FsYXIgdmFsdWUgc3RyaW5nLlxuICAvLyBcIlRvIGNvbnZlcnQgYSBzdHJpbmcgaW50byBhIHNjYWxhciB2YWx1ZSBzdHJpbmcsIHJlcGxhY2UgYW55IHN1cnJvZ2F0ZXNcbiAgLy8gIHdpdGggVStGRkZELlwiXG4gIC8vIHNlZTogaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0LXYxOC54L2RvY3MvYXBpL2J1ZmZlci5odG1sI2J1ZnRvc3RyaW5nZW5jb2Rpbmctc3RhcnQtZW5kXG4gIG5hbWUgPSBCdWZmZXIuZnJvbShuYW1lKS50b1N0cmluZygndXRmOCcpXG5cbiAgLy8gMi4gSWYgdmFsdWUgaXMgYSBzdHJpbmcsIHRoZW4gc2V0IHZhbHVlIHRvIHRoZSByZXN1bHQgb2YgY29udmVydGluZ1xuICAvLyAgICB2YWx1ZSBpbnRvIGEgc2NhbGFyIHZhbHVlIHN0cmluZy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZSA9IEJ1ZmZlci5mcm9tKHZhbHVlKS50b1N0cmluZygndXRmOCcpXG4gIH0gZWxzZSB7XG4gICAgLy8gMy4gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gSWYgdmFsdWUgaXMgbm90IGEgRmlsZSBvYmplY3QsIHRoZW4gc2V0IHZhbHVlIHRvIGEgbmV3IEZpbGUgb2JqZWN0LFxuICAgIC8vICAgIHJlcHJlc2VudGluZyB0aGUgc2FtZSBieXRlcywgd2hvc2UgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgaXMgXCJibG9iXCJcbiAgICBpZiAoIWlzRmlsZUxpa2UodmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgQmxvYlxuICAgICAgICA/IG5ldyBGaWxlKFt2YWx1ZV0sICdibG9iJywgeyB0eXBlOiB2YWx1ZS50eXBlIH0pXG4gICAgICAgIDogbmV3IEZpbGVMaWtlKHZhbHVlLCAnYmxvYicsIHsgdHlwZTogdmFsdWUudHlwZSB9KVxuICAgIH1cblxuICAgIC8vIDIuIElmIGZpbGVuYW1lIGlzIGdpdmVuLCB0aGVuIHNldCB2YWx1ZSB0byBhIG5ldyBGaWxlIG9iamVjdCxcbiAgICAvLyAgICByZXByZXNlbnRpbmcgdGhlIHNhbWUgYnl0ZXMsIHdob3NlIG5hbWUgYXR0cmlidXRlIGlzIGZpbGVuYW1lLlxuICAgIGlmIChmaWxlbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiogQHR5cGUge0ZpbGVQcm9wZXJ0eUJhZ30gKi9cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgIGxhc3RNb2RpZmllZDogdmFsdWUubGFzdE1vZGlmaWVkXG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gKE5hdGl2ZUZpbGUgJiYgdmFsdWUgaW5zdGFuY2VvZiBOYXRpdmVGaWxlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVuZGljaUZpbGVcbiAgICAgICAgPyBuZXcgRmlsZShbdmFsdWVdLCBmaWxlbmFtZSwgb3B0aW9ucylcbiAgICAgICAgOiBuZXcgRmlsZUxpa2UodmFsdWUsIGZpbGVuYW1lLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIFJldHVybiBhbiBlbnRyeSB3aG9zZSBuYW1lIGlzIG5hbWUgYW5kIHdob3NlIHZhbHVlIGlzIHZhbHVlLlxuICByZXR1cm4geyBuYW1lLCB2YWx1ZSB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBGb3JtRGF0YSB9XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBCdXNib3kgPSByZXF1aXJlKCdAZmFzdGlmeS9idXNib3knKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7XG4gIFJlYWRhYmxlU3RyZWFtRnJvbSxcbiAgaXNCbG9iTGlrZSxcbiAgaXNSZWFkYWJsZVN0cmVhbUxpa2UsXG4gIHJlYWRhYmxlU3RyZWFtQ2xvc2UsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgZnVsbHlSZWFkQm9keVxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEZvcm1EYXRhIH0gPSByZXF1aXJlKCcuL2Zvcm1kYXRhJylcbmNvbnN0IHsga1N0YXRlIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgRE9NRXhjZXB0aW9uLCBzdHJ1Y3R1cmVkQ2xvbmUgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgQmxvYiwgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsga0JvZHlVc2VkIH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgaXNFcnJvcmVkIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBpc1VpbnQ4QXJyYXksIGlzQXJyYXlCdWZmZXIgfSA9IHJlcXVpcmUoJ3V0aWwvdHlwZXMnKVxuY29uc3QgeyBGaWxlOiBVbmRpY2lGaWxlIH0gPSByZXF1aXJlKCcuL2ZpbGUnKVxuY29uc3QgeyBwYXJzZU1JTUVUeXBlLCBzZXJpYWxpemVBTWltZVR5cGUgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5cbmxldCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW1cblxuLyoqIEB0eXBlIHtnbG9iYWxUaGlzWydGaWxlJ119ICovXG5jb25zdCBGaWxlID0gTmF0aXZlRmlsZSA/PyBVbmRpY2lGaWxlXG5jb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHlpbml0LWV4dHJhY3RcbmZ1bmN0aW9uIGV4dHJhY3RCb2R5IChvYmplY3QsIGtlZXBhbGl2ZSA9IGZhbHNlKSB7XG4gIGlmICghUmVhZGFibGVTdHJlYW0pIHtcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgLy8gMS4gTGV0IHN0cmVhbSBiZSBudWxsLlxuICBsZXQgc3RyZWFtID0gbnVsbFxuXG4gIC8vIDIuIElmIG9iamVjdCBpcyBhIFJlYWRhYmxlU3RyZWFtIG9iamVjdCwgdGhlbiBzZXQgc3RyZWFtIHRvIG9iamVjdC5cbiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtKSB7XG4gICAgc3RyZWFtID0gb2JqZWN0XG4gIH0gZWxzZSBpZiAoaXNCbG9iTGlrZShvYmplY3QpKSB7XG4gICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBvYmplY3QgaXMgYSBCbG9iIG9iamVjdCwgc2V0IHN0cmVhbSB0byB0aGVcbiAgICAvLyAgICByZXN1bHQgb2YgcnVubmluZyBvYmplY3TigJlzIGdldCBzdHJlYW0uXG4gICAgc3RyZWFtID0gb2JqZWN0LnN0cmVhbSgpXG4gIH0gZWxzZSB7XG4gICAgLy8gNC4gT3RoZXJ3aXNlLCBzZXQgc3RyZWFtIHRvIGEgbmV3IFJlYWRhYmxlU3RyZWFtIG9iamVjdCwgYW5kIHNldFxuICAgIC8vICAgIHVwIHN0cmVhbS5cbiAgICBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgYXN5bmMgcHVsbCAoY29udHJvbGxlcikge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoXG4gICAgICAgICAgdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgPyB0ZXh0RW5jb2Rlci5lbmNvZGUoc291cmNlKSA6IHNvdXJjZVxuICAgICAgICApXG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHJlYWRhYmxlU3RyZWFtQ2xvc2UoY29udHJvbGxlcikpXG4gICAgICB9LFxuICAgICAgc3RhcnQgKCkge30sXG4gICAgICB0eXBlOiB1bmRlZmluZWRcbiAgICB9KVxuICB9XG5cbiAgLy8gNS4gQXNzZXJ0OiBzdHJlYW0gaXMgYSBSZWFkYWJsZVN0cmVhbSBvYmplY3QuXG4gIGFzc2VydChpc1JlYWRhYmxlU3RyZWFtTGlrZShzdHJlYW0pKVxuXG4gIC8vIDYuIExldCBhY3Rpb24gYmUgbnVsbC5cbiAgbGV0IGFjdGlvbiA9IG51bGxcblxuICAvLyA3LiBMZXQgc291cmNlIGJlIG51bGwuXG4gIGxldCBzb3VyY2UgPSBudWxsXG5cbiAgLy8gOC4gTGV0IGxlbmd0aCBiZSBudWxsLlxuICBsZXQgbGVuZ3RoID0gbnVsbFxuXG4gIC8vIDkuIExldCB0eXBlIGJlIG51bGwuXG4gIGxldCB0eXBlID0gbnVsbFxuXG4gIC8vIDEwLiBTd2l0Y2ggb24gb2JqZWN0OlxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBTZXQgc291cmNlIHRvIHRoZSBVVEYtOCBlbmNvZGluZyBvZiBvYmplY3QuXG4gICAgLy8gTm90ZTogc2V0dGluZyBzb3VyY2UgdG8gYSBVaW50OEFycmF5IGhlcmUgYnJlYWtzIHNvbWUgbW9ja2luZyBhc3N1bXB0aW9ucy5cbiAgICBzb3VyY2UgPSBvYmplY3RcblxuICAgIC8vIFNldCB0eXBlIHRvIGB0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLThgLlxuICAgIHR5cGUgPSAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04J1xuICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgIC8vIFVSTFNlYXJjaFBhcmFtc1xuXG4gICAgLy8gc3BlYyBzYXlzIHRvIHJ1biBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgb24gYm9keS5saXN0XG4gICAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBpbiBOb2RlLmpzIGFzIGFwYXJ0IG9mIGFuIFVSTFNlYXJjaFBhcmFtcyBpbnN0YW5jZSB0b1N0cmluZyBtZXRob2RcbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL2U0NmM2ODBiZjJiMjExYmJkNTJjZjk1OWNhMTdlZTk4YzdmNjU3ZjUvbGliL2ludGVybmFsL3VybC5qcyNMNDkwXG4gICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL2U0NmM2ODBiZjJiMjExYmJkNTJjZjk1OWNhMTdlZTk4YzdmNjU3ZjUvbGliL2ludGVybmFsL3VybC5qcyNMMTEwMFxuXG4gICAgLy8gU2V0IHNvdXJjZSB0byB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBzZXJpYWxpemVyIHdpdGggb2JqZWN04oCZcyBsaXN0LlxuICAgIHNvdXJjZSA9IG9iamVjdC50b1N0cmluZygpXG5cbiAgICAvLyBTZXQgdHlwZSB0byBgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLThgLlxuICAgIHR5cGUgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnXG4gIH0gZWxzZSBpZiAoaXNBcnJheUJ1ZmZlcihvYmplY3QpKSB7XG4gICAgLy8gQnVmZmVyU291cmNlL0FycmF5QnVmZmVyXG5cbiAgICAvLyBTZXQgc291cmNlIHRvIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSBvYmplY3QuXG4gICAgc291cmNlID0gbmV3IFVpbnQ4QXJyYXkob2JqZWN0LnNsaWNlKCkpXG4gIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KG9iamVjdCkpIHtcbiAgICAvLyBCdWZmZXJTb3VyY2UvQXJyYXlCdWZmZXJWaWV3XG5cbiAgICAvLyBTZXQgc291cmNlIHRvIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSBvYmplY3QuXG4gICAgc291cmNlID0gbmV3IFVpbnQ4QXJyYXkob2JqZWN0LmJ1ZmZlci5zbGljZShvYmplY3QuYnl0ZU9mZnNldCwgb2JqZWN0LmJ5dGVPZmZzZXQgKyBvYmplY3QuYnl0ZUxlbmd0aCkpXG4gIH0gZWxzZSBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShvYmplY3QpKSB7XG4gICAgY29uc3QgYm91bmRhcnkgPSBgLS0tLWZvcm1kYXRhLXVuZGljaS0wJHtgJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTExKX1gLnBhZFN0YXJ0KDExLCAnMCcpfWBcbiAgICBjb25zdCBwcmVmaXggPSBgLS0ke2JvdW5kYXJ5fVxcclxcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YWBcblxuICAgIC8qISBmb3JtZGF0YS1wb2x5ZmlsbC4gTUlUIExpY2Vuc2UuIEppbW15IFfDpHJ0aW5nIDxodHRwczovL2ppbW15LndhcnRpbmcuc2Uvb3BlbnNvdXJjZT4gKi9cbiAgICBjb25zdCBlc2NhcGUgPSAoc3RyKSA9PlxuICAgICAgc3RyLnJlcGxhY2UoL1xcbi9nLCAnJTBBJykucmVwbGFjZSgvXFxyL2csICclMEQnKS5yZXBsYWNlKC9cIi9nLCAnJTIyJylcbiAgICBjb25zdCBub3JtYWxpemVMaW5lZmVlZHMgPSAodmFsdWUpID0+IHZhbHVlLnJlcGxhY2UoL1xccj9cXG58XFxyL2csICdcXHJcXG4nKVxuXG4gICAgLy8gU2V0IGFjdGlvbiB0byB0aGlzIHN0ZXA6IHJ1biB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgIC8vIGVuY29kaW5nIGFsZ29yaXRobSwgd2l0aCBvYmplY3TigJlzIGVudHJ5IGxpc3QgYW5kIFVURi04LlxuICAgIC8vIC0gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGJvZHkgaXMgaW1tdXRhYmxlIGFuZCBjYW4ndCBiZSBjaGFuZ2VkIGFmdGVyd29yZHNcbiAgICAvLyAtIFRoYXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGlzIGNhbGN1bGF0ZWQgaW4gYWR2YW5jZS5cbiAgICAvLyAtIEFuZCB0aGF0IGFsbCBwYXJ0cyBhcmUgcHJlLWVuY29kZWQgYW5kIHJlYWR5IHRvIGJlIHNlbnQuXG5cbiAgICBjb25zdCBibG9iUGFydHMgPSBbXVxuICAgIGNvbnN0IHJuID0gbmV3IFVpbnQ4QXJyYXkoWzEzLCAxMF0pIC8vICdcXHJcXG4nXG4gICAgbGVuZ3RoID0gMFxuICAgIGxldCBoYXNVbmtub3duU2l6ZVZhbHVlID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBvYmplY3QpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gdGV4dEVuY29kZXIuZW5jb2RlKHByZWZpeCArXG4gICAgICAgICAgYDsgbmFtZT1cIiR7ZXNjYXBlKG5vcm1hbGl6ZUxpbmVmZWVkcyhuYW1lKSl9XCJgICtcbiAgICAgICAgICBgXFxyXFxuXFxyXFxuJHtub3JtYWxpemVMaW5lZmVlZHModmFsdWUpfVxcclxcbmApXG4gICAgICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rKVxuICAgICAgICBsZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoYCR7cHJlZml4fTsgbmFtZT1cIiR7ZXNjYXBlKG5vcm1hbGl6ZUxpbmVmZWVkcyhuYW1lKSl9XCJgICtcbiAgICAgICAgICAodmFsdWUubmFtZSA/IGA7IGZpbGVuYW1lPVwiJHtlc2NhcGUodmFsdWUubmFtZSl9XCJgIDogJycpICsgJ1xcclxcbicgK1xuICAgICAgICAgIGBDb250ZW50LVR5cGU6ICR7XG4gICAgICAgICAgICB2YWx1ZS50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gICAgICAgICAgfVxcclxcblxcclxcbmApXG4gICAgICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rLCB2YWx1ZSwgcm4pXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuc2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aCArIHZhbHVlLnNpemUgKyBybi5ieXRlTGVuZ3RoXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzVW5rbm93blNpemVWYWx1ZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNodW5rID0gdGV4dEVuY29kZXIuZW5jb2RlKGAtLSR7Ym91bmRhcnl9LS1gKVxuICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rKVxuICAgIGxlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoXG4gICAgaWYgKGhhc1Vua25vd25TaXplVmFsdWUpIHtcbiAgICAgIGxlbmd0aCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBTZXQgc291cmNlIHRvIG9iamVjdC5cbiAgICBzb3VyY2UgPSBvYmplY3RcblxuICAgIGFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uICogKCkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGJsb2JQYXJ0cykge1xuICAgICAgICBpZiAocGFydC5zdHJlYW0pIHtcbiAgICAgICAgICB5aWVsZCAqIHBhcnQuc3RyZWFtKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB5aWVsZCBwYXJ0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdHlwZSB0byBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9YCxcbiAgICAvLyBmb2xsb3dlZCBieSB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBib3VuZGFyeSBzdHJpbmcgZ2VuZXJhdGVkXG4gICAgLy8gYnkgdGhlIG11bHRpcGFydC9mb3JtLWRhdGEgZW5jb2RpbmcgYWxnb3JpdGhtLlxuICAgIHR5cGUgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JyArIGJvdW5kYXJ5XG4gIH0gZWxzZSBpZiAoaXNCbG9iTGlrZShvYmplY3QpKSB7XG4gICAgLy8gQmxvYlxuXG4gICAgLy8gU2V0IHNvdXJjZSB0byBvYmplY3QuXG4gICAgc291cmNlID0gb2JqZWN0XG5cbiAgICAvLyBTZXQgbGVuZ3RoIHRvIG9iamVjdOKAmXMgc2l6ZS5cbiAgICBsZW5ndGggPSBvYmplY3Quc2l6ZVxuXG4gICAgLy8gSWYgb2JqZWN04oCZcyB0eXBlIGF0dHJpYnV0ZSBpcyBub3QgdGhlIGVtcHR5IGJ5dGUgc2VxdWVuY2UsIHNldFxuICAgIC8vIHR5cGUgdG8gaXRzIHZhbHVlLlxuICAgIGlmIChvYmplY3QudHlwZSkge1xuICAgICAgdHlwZSA9IG9iamVjdC50eXBlXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYga2VlcGFsaXZlIGlzIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKGtlZXBhbGl2ZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigna2VlcGFsaXZlJylcbiAgICB9XG5cbiAgICAvLyBJZiBvYmplY3QgaXMgZGlzdHVyYmVkIG9yIGxvY2tlZCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAodXRpbC5pc0Rpc3R1cmJlZChvYmplY3QpIHx8IG9iamVjdC5sb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdSZXNwb25zZSBib2R5IG9iamVjdCBzaG91bGQgbm90IGJlIGRpc3R1cmJlZCBvciBsb2NrZWQnXG4gICAgICApXG4gICAgfVxuXG4gICAgc3RyZWFtID1cbiAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtID8gb2JqZWN0IDogUmVhZGFibGVTdHJlYW1Gcm9tKG9iamVjdClcbiAgfVxuXG4gIC8vIDExLiBJZiBzb3VyY2UgaXMgYSBieXRlIHNlcXVlbmNlLCB0aGVuIHNldCBhY3Rpb24gdG8gYVxuICAvLyBzdGVwIHRoYXQgcmV0dXJucyBzb3VyY2UgYW5kIGxlbmd0aCB0byBzb3VyY2XigJlzIGxlbmd0aC5cbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnIHx8IHV0aWwuaXNCdWZmZXIoc291cmNlKSkge1xuICAgIGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHNvdXJjZSlcbiAgfVxuXG4gIC8vIDEyLiBJZiBhY3Rpb24gaXMgbm9uLW51bGwsIHRoZW4gcnVuIHRoZXNlIHN0ZXBzIGluIGluIHBhcmFsbGVsOlxuICBpZiAoYWN0aW9uICE9IG51bGwpIHtcbiAgICAvLyBSdW4gYWN0aW9uLlxuICAgIGxldCBpdGVyYXRvclxuICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICBhc3luYyBzdGFydCAoKSB7XG4gICAgICAgIGl0ZXJhdG9yID0gYWN0aW9uKG9iamVjdClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsIChjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIC8vIFdoZW4gcnVubmluZyBhY3Rpb24gaXMgZG9uZSwgY2xvc2Ugc3RyZWFtLlxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2hlbmV2ZXIgb25lIG9yIG1vcmUgYnl0ZXMgYXJlIGF2YWlsYWJsZSBhbmQgc3RyZWFtIGlzIG5vdCBlcnJvcmVkLFxuICAgICAgICAgIC8vIGVucXVldWUgYSBVaW50OEFycmF5IHdyYXBwaW5nIGFuIEFycmF5QnVmZmVyIGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZVxuICAgICAgICAgIC8vIGJ5dGVzIGludG8gc3RyZWFtLlxuICAgICAgICAgIGlmICghaXNFcnJvcmVkKHN0cmVhbSkpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRlc2lyZWRTaXplID4gMFxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNhbmNlbCAocmVhc29uKSB7XG4gICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpXG4gICAgICB9LFxuICAgICAgdHlwZTogdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuXG4gIC8vIDEzLiBMZXQgYm9keSBiZSBhIGJvZHkgd2hvc2Ugc3RyZWFtIGlzIHN0cmVhbSwgc291cmNlIGlzIHNvdXJjZSxcbiAgLy8gYW5kIGxlbmd0aCBpcyBsZW5ndGguXG4gIGNvbnN0IGJvZHkgPSB7IHN0cmVhbSwgc291cmNlLCBsZW5ndGggfVxuXG4gIC8vIDE0LiBSZXR1cm4gKGJvZHksIHR5cGUpLlxuICByZXR1cm4gW2JvZHksIHR5cGVdXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5aW5pdC1zYWZlbHktZXh0cmFjdFxuZnVuY3Rpb24gc2FmZWx5RXh0cmFjdEJvZHkgKG9iamVjdCwga2VlcGFsaXZlID0gZmFsc2UpIHtcbiAgaWYgKCFSZWFkYWJsZVN0cmVhbSkge1xuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0vd2ViJykuUmVhZGFibGVTdHJlYW1cbiAgfVxuXG4gIC8vIFRvIHNhZmVseSBleHRyYWN0IGEgYm9keSBhbmQgYSBgQ29udGVudC1UeXBlYCB2YWx1ZSBmcm9tXG4gIC8vIGEgYnl0ZSBzZXF1ZW5jZSBvciBCb2R5SW5pdCBvYmplY3Qgb2JqZWN0LCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gMS4gSWYgb2JqZWN0IGlzIGEgUmVhZGFibGVTdHJlYW0gb2JqZWN0LCB0aGVuOlxuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0pIHtcbiAgICAvLyBBc3NlcnQ6IG9iamVjdCBpcyBuZWl0aGVyIGRpc3R1cmJlZCBub3IgbG9ja2VkLlxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgYXNzZXJ0KCF1dGlsLmlzRGlzdHVyYmVkKG9iamVjdCksICdUaGUgYm9keSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLicpXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICBhc3NlcnQoIW9iamVjdC5sb2NrZWQsICdUaGUgc3RyZWFtIGlzIGxvY2tlZC4nKVxuICB9XG5cbiAgLy8gMi4gUmV0dXJuIHRoZSByZXN1bHRzIG9mIGV4dHJhY3Rpbmcgb2JqZWN0LlxuICByZXR1cm4gZXh0cmFjdEJvZHkob2JqZWN0LCBrZWVwYWxpdmUpXG59XG5cbmZ1bmN0aW9uIGNsb25lQm9keSAoYm9keSkge1xuICAvLyBUbyBjbG9uZSBhIGJvZHkgYm9keSwgcnVuIHRoZXNlIHN0ZXBzOlxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktY2xvbmVcblxuICAvLyAxLiBMZXQgwqsgb3V0MSwgb3V0MiDCuyBiZSB0aGUgcmVzdWx0IG9mIHRlZWluZyBib2R54oCZcyBzdHJlYW0uXG4gIGNvbnN0IFtvdXQxLCBvdXQyXSA9IGJvZHkuc3RyZWFtLnRlZSgpXG4gIGNvbnN0IG91dDJDbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShvdXQyLCB7IHRyYW5zZmVyOiBbb3V0Ml0gfSlcbiAgLy8gVGhpcywgZm9yIHdoYXRldmVyIHJlYXNvbnMsIHVucmVmcyBvdXQyQ2xvbmUgd2hpY2ggYWxsb3dzXG4gIC8vIHRoZSBwcm9jZXNzIHRvIGV4aXQgYnkgaXRzZWxmLlxuICBjb25zdCBbLCBmaW5hbENsb25lXSA9IG91dDJDbG9uZS50ZWUoKVxuXG4gIC8vIDIuIFNldCBib2R54oCZcyBzdHJlYW0gdG8gb3V0MS5cbiAgYm9keS5zdHJlYW0gPSBvdXQxXG5cbiAgLy8gMy4gUmV0dXJuIGEgYm9keSB3aG9zZSBzdHJlYW0gaXMgb3V0MiBhbmQgb3RoZXIgbWVtYmVycyBhcmUgY29waWVkIGZyb20gYm9keS5cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW06IGZpbmFsQ2xvbmUsXG4gICAgbGVuZ3RoOiBib2R5Lmxlbmd0aCxcbiAgICBzb3VyY2U6IGJvZHkuc291cmNlXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gKiBjb25zdW1lQm9keSAoYm9keSkge1xuICBpZiAoYm9keSkge1xuICAgIGlmIChpc1VpbnQ4QXJyYXkoYm9keSkpIHtcbiAgICAgIHlpZWxkIGJvZHlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyZWFtID0gYm9keS5zdHJlYW1cblxuICAgICAgaWYgKHV0aWwuaXNEaXN0dXJiZWQoc3RyZWFtKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgYm9keSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLicpXG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJlYW0ubG9ja2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaXMgbG9ja2VkLicpXG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBhdC5cbiAgICAgIHN0cmVhbVtrQm9keVVzZWRdID0gdHJ1ZVxuXG4gICAgICB5aWVsZCAqIHN0cmVhbVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0lmQWJvcnRlZCAoc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLicsICdBYm9ydEVycm9yJylcbiAgfVxufVxuXG5mdW5jdGlvbiBib2R5TWl4aW5NZXRob2RzIChpbnN0YW5jZSkge1xuICBjb25zdCBtZXRob2RzID0ge1xuICAgIGJsb2IgKCkge1xuICAgICAgLy8gVGhlIGJsb2IoKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mXG4gICAgICAvLyBydW5uaW5nIGNvbnN1bWUgYm9keSB3aXRoIHRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgc3RlcFxuICAgICAgLy8gZ2l2ZW4gYSBieXRlIHNlcXVlbmNlIGJ5dGVzOiByZXR1cm4gYSBCbG9iIHdob3NlXG4gICAgICAvLyBjb250ZW50cyBhcmUgYnl0ZXMgYW5kIHdob3NlIHR5cGUgYXR0cmlidXRlIGlzIHRoaXPigJlzXG4gICAgICAvLyBNSU1FIHR5cGUuXG4gICAgICByZXR1cm4gc3BlY0NvbnN1bWVCb2R5KHRoaXMsIChieXRlcykgPT4ge1xuICAgICAgICBsZXQgbWltZVR5cGUgPSBib2R5TWltZVR5cGUodGhpcylcblxuICAgICAgICBpZiAobWltZVR5cGUgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIG1pbWVUeXBlID0gJydcbiAgICAgICAgfSBlbHNlIGlmIChtaW1lVHlwZSkge1xuICAgICAgICAgIG1pbWVUeXBlID0gc2VyaWFsaXplQU1pbWVUeXBlKG1pbWVUeXBlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIGEgQmxvYiB3aG9zZSBjb250ZW50cyBhcmUgYnl0ZXMgYW5kIHR5cGUgYXR0cmlidXRlXG4gICAgICAgIC8vIGlzIG1pbWVUeXBlLlxuICAgICAgICByZXR1cm4gbmV3IEJsb2IoW2J5dGVzXSwgeyB0eXBlOiBtaW1lVHlwZSB9KVxuICAgICAgfSwgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIGFycmF5QnVmZmVyICgpIHtcbiAgICAgIC8vIFRoZSBhcnJheUJ1ZmZlcigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHRcbiAgICAgIC8vIG9mIHJ1bm5pbmcgY29uc3VtZSBib2R5IHdpdGggdGhpcyBhbmQgdGhlIGZvbGxvd2luZyBzdGVwXG4gICAgICAvLyBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgYnl0ZXM6IHJldHVybiBhIG5ldyBBcnJheUJ1ZmZlclxuICAgICAgLy8gd2hvc2UgY29udGVudHMgYXJlIGJ5dGVzLlxuICAgICAgcmV0dXJuIHNwZWNDb25zdW1lQm9keSh0aGlzLCAoYnl0ZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXJcbiAgICAgIH0sIGluc3RhbmNlKVxuICAgIH0sXG5cbiAgICB0ZXh0ICgpIHtcbiAgICAgIC8vIFRoZSB0ZXh0KCkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgICAvLyBjb25zdW1lIGJvZHkgd2l0aCB0aGlzIGFuZCBVVEYtOCBkZWNvZGUuXG4gICAgICByZXR1cm4gc3BlY0NvbnN1bWVCb2R5KHRoaXMsIHV0ZjhEZWNvZGVCeXRlcywgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIGpzb24gKCkge1xuICAgICAgLy8gVGhlIGpzb24oKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgIC8vIGNvbnN1bWUgYm9keSB3aXRoIHRoaXMgYW5kIHBhcnNlIEpTT04gZnJvbSBieXRlcy5cbiAgICAgIHJldHVybiBzcGVjQ29uc3VtZUJvZHkodGhpcywgcGFyc2VKU09ORnJvbUJ5dGVzLCBpbnN0YW5jZSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9ybURhdGEgKCkge1xuICAgICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgaW5zdGFuY2UpXG5cbiAgICAgIHRocm93SWZBYm9ydGVkKHRoaXNba1N0YXRlXSlcblxuICAgICAgY29uc3QgY29udGVudFR5cGUgPSB0aGlzLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKVxuXG4gICAgICAvLyBJZiBtaW1lVHlwZeKAmXMgZXNzZW5jZSBpcyBcIm11bHRpcGFydC9mb3JtLWRhdGFcIiwgdGhlbjpcbiAgICAgIGlmICgvbXVsdGlwYXJ0XFwvZm9ybS1kYXRhLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge31cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5oZWFkZXJzKSBoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlXG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG5cbiAgICAgICAgbGV0IGJ1c2JveVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYnVzYm95ID0gbmV3IEJ1c2JveSh7XG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgcHJlc2VydmVQYXRoOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihgJHtlcnJ9YCwgJ0Fib3J0RXJyb3InKVxuICAgICAgICB9XG5cbiAgICAgICAgYnVzYm95Lm9uKCdmaWVsZCcsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlRm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9KVxuICAgICAgICBidXNib3kub24oJ2ZpbGUnLCAobmFtZSwgdmFsdWUsIGZpbGVuYW1lLCBlbmNvZGluZywgbWltZVR5cGUpID0+IHtcbiAgICAgICAgICBjb25zdCBjaHVua3MgPSBbXVxuXG4gICAgICAgICAgaWYgKGVuY29kaW5nID09PSAnYmFzZTY0JyB8fCBlbmNvZGluZy50b0xvd2VyQ2FzZSgpID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgbGV0IGJhc2U2NGNodW5rID0gJydcblxuICAgICAgICAgICAgdmFsdWUub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgYmFzZTY0Y2h1bmsgKz0gY2h1bmsudG9TdHJpbmcoKS5yZXBsYWNlKC9bXFxyXFxuXS9nbSwgJycpXG5cbiAgICAgICAgICAgICAgY29uc3QgZW5kID0gYmFzZTY0Y2h1bmsubGVuZ3RoIC0gYmFzZTY0Y2h1bmsubGVuZ3RoICUgNFxuICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShiYXNlNjRjaHVuay5zbGljZSgwLCBlbmQpLCAnYmFzZTY0JykpXG5cbiAgICAgICAgICAgICAgYmFzZTY0Y2h1bmsgPSBiYXNlNjRjaHVuay5zbGljZShlbmQpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdmFsdWUub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oYmFzZTY0Y2h1bmssICdiYXNlNjQnKSlcbiAgICAgICAgICAgICAgcmVzcG9uc2VGb3JtRGF0YS5hcHBlbmQobmFtZSwgbmV3IEZpbGUoY2h1bmtzLCBmaWxlbmFtZSwgeyB0eXBlOiBtaW1lVHlwZSB9KSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHZhbHVlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlRm9ybURhdGEuYXBwZW5kKG5hbWUsIG5ldyBGaWxlKGNodW5rcywgZmlsZW5hbWUsIHsgdHlwZTogbWltZVR5cGUgfSkpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBidXNib3lSZXNvbHZlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGJ1c2JveS5vbignZmluaXNoJywgcmVzb2x2ZSlcbiAgICAgICAgICBidXNib3kub24oJ2Vycm9yJywgKGVycikgPT4gcmVqZWN0KG5ldyBUeXBlRXJyb3IoZXJyKSkpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuYm9keSAhPT0gbnVsbCkgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBjb25zdW1lQm9keSh0aGlzW2tTdGF0ZV0uYm9keSkpIGJ1c2JveS53cml0ZShjaHVuaylcbiAgICAgICAgYnVzYm95LmVuZCgpXG4gICAgICAgIGF3YWl0IGJ1c2JveVJlc29sdmVcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2VGb3JtRGF0YVxuICAgICAgfSBlbHNlIGlmICgvYXBwbGljYXRpb25cXC94LXd3dy1mb3JtLXVybGVuY29kZWQvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgaWYgbWltZVR5cGXigJlzIGVzc2VuY2UgaXMgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiwgdGhlbjpcblxuICAgICAgICAvLyAxLiBMZXQgZW50cmllcyBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgYnl0ZXMuXG4gICAgICAgIGxldCBlbnRyaWVzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHRleHQgPSAnJ1xuICAgICAgICAgIC8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBwYXJzZXIgd2lsbCBrZWVwIHRoZSBCT00uXG4gICAgICAgICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXVybGVuY29kZWQtcGFyc2VyXG4gICAgICAgICAgLy8gTm90ZSB0aGF0IHN0cmVhbWluZyBkZWNvZGVyIGlzIHN0YXRlZnVsIGFuZCBjYW5ub3QgYmUgcmV1c2VkXG4gICAgICAgICAgY29uc3Qgc3RyZWFtaW5nRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7IGlnbm9yZUJPTTogdHJ1ZSB9KVxuXG4gICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBjb25zdW1lQm9keSh0aGlzW2tTdGF0ZV0uYm9keSkpIHtcbiAgICAgICAgICAgIGlmICghaXNVaW50OEFycmF5KGNodW5rKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBVaW50OEFycmF5IGNodW5rJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHQgKz0gc3RyZWFtaW5nRGVjb2Rlci5kZWNvZGUoY2h1bmssIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHRleHQgKz0gc3RyZWFtaW5nRGVjb2Rlci5kZWNvZGUoKVxuICAgICAgICAgIGVudHJpZXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRleHQpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBVbmNsZWFyIHdoZW4gbmV3IFVSTFNlYXJjaFBhcmFtcyBjYW4gZmFpbCBvbiBhIHN0cmluZy5cbiAgICAgICAgICAvLyAyLiBJZiBlbnRyaWVzIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgVHlwZUVycm9yKCksIHsgY2F1c2U6IGVyciB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gUmV0dXJuIGEgbmV3IEZvcm1EYXRhIG9iamVjdCB3aG9zZSBlbnRyaWVzIGFyZSBlbnRyaWVzLlxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtRGF0YVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2FpdCBhIHRpY2sgYmVmb3JlIGNoZWNraW5nIGlmIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgYSBUeXBlRXJyb3IgY2FuIGJlIHRocm93biB3aGVuIGFuIEFib3J0RXJyb3Igc2hvdWxkLlxuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgICAgIHRocm93SWZBYm9ydGVkKHRoaXNba1N0YXRlXSlcblxuICAgICAgICAvLyBPdGhlcndpc2UsIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgaGVhZGVyOiBgJHtpbnN0YW5jZS5uYW1lfS5mb3JtRGF0YWAsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBwYXJzZSBjb250ZW50IGFzIEZvcm1EYXRhLidcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWV0aG9kc1xufVxuXG5mdW5jdGlvbiBtaXhpbkJvZHkgKHByb3RvdHlwZSkge1xuICBPYmplY3QuYXNzaWduKHByb3RvdHlwZS5wcm90b3R5cGUsIGJvZHlNaXhpbk1ldGhvZHMocHJvdG90eXBlKSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktY29uc3VtZS1ib2R5XG4gKiBAcGFyYW0ge1Jlc3BvbnNlfFJlcXVlc3R9IG9iamVjdFxuICogQHBhcmFtIHsodmFsdWU6IHVua25vd24pID0+IHVua25vd259IGNvbnZlcnRCeXRlc1RvSlNWYWx1ZVxuICogQHBhcmFtIHtSZXNwb25zZXxSZXF1ZXN0fSBpbnN0YW5jZVxuICovXG5hc3luYyBmdW5jdGlvbiBzcGVjQ29uc3VtZUJvZHkgKG9iamVjdCwgY29udmVydEJ5dGVzVG9KU1ZhbHVlLCBpbnN0YW5jZSkge1xuICB3ZWJpZGwuYnJhbmRDaGVjayhvYmplY3QsIGluc3RhbmNlKVxuXG4gIHRocm93SWZBYm9ydGVkKG9iamVjdFtrU3RhdGVdKVxuXG4gIC8vIDEuIElmIG9iamVjdCBpcyB1bnVzYWJsZSwgdGhlbiByZXR1cm4gYSBwcm9taXNlIHJlamVjdGVkXG4gIC8vICAgIHdpdGggYSBUeXBlRXJyb3IuXG4gIGlmIChib2R5VW51c2FibGUob2JqZWN0W2tTdGF0ZV0uYm9keSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb2R5IGlzIHVudXNhYmxlJylcbiAgfVxuXG4gIC8vIDIuIExldCBwcm9taXNlIGJlIGEgbmV3IHByb21pc2UuXG4gIGNvbnN0IHByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gIC8vIDMuIExldCBlcnJvclN0ZXBzIGdpdmVuIGVycm9yIGJlIHRvIHJlamVjdCBwcm9taXNlIHdpdGggZXJyb3IuXG4gIGNvbnN0IGVycm9yU3RlcHMgPSAoZXJyb3IpID0+IHByb21pc2UucmVqZWN0KGVycm9yKVxuXG4gIC8vIDQuIExldCBzdWNjZXNzU3RlcHMgZ2l2ZW4gYSBieXRlIHNlcXVlbmNlIGRhdGEgYmUgdG8gcmVzb2x2ZVxuICAvLyAgICBwcm9taXNlIHdpdGggdGhlIHJlc3VsdCBvZiBydW5uaW5nIGNvbnZlcnRCeXRlc1RvSlNWYWx1ZVxuICAvLyAgICB3aXRoIGRhdGEuIElmIHRoYXQgdGhyZXcgYW4gZXhjZXB0aW9uLCB0aGVuIHJ1biBlcnJvclN0ZXBzXG4gIC8vICAgIHdpdGggdGhhdCBleGNlcHRpb24uXG4gIGNvbnN0IHN1Y2Nlc3NTdGVwcyA9IChkYXRhKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2UucmVzb2x2ZShjb252ZXJ0Qnl0ZXNUb0pTVmFsdWUoZGF0YSkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JTdGVwcyhlKVxuICAgIH1cbiAgfVxuXG4gIC8vIDUuIElmIG9iamVjdOKAmXMgYm9keSBpcyBudWxsLCB0aGVuIHJ1biBzdWNjZXNzU3RlcHMgd2l0aCBhblxuICAvLyAgICBlbXB0eSBieXRlIHNlcXVlbmNlLlxuICBpZiAob2JqZWN0W2tTdGF0ZV0uYm9keSA9PSBudWxsKSB7XG4gICAgc3VjY2Vzc1N0ZXBzKG5ldyBVaW50OEFycmF5KCkpXG4gICAgcmV0dXJuIHByb21pc2UucHJvbWlzZVxuICB9XG5cbiAgLy8gNi4gT3RoZXJ3aXNlLCBmdWxseSByZWFkIG9iamVjdOKAmXMgYm9keSBnaXZlbiBzdWNjZXNzU3RlcHMsXG4gIC8vICAgIGVycm9yU3RlcHMsIGFuZCBvYmplY3TigJlzIHJlbGV2YW50IGdsb2JhbCBvYmplY3QuXG4gIGF3YWl0IGZ1bGx5UmVhZEJvZHkob2JqZWN0W2tTdGF0ZV0uYm9keSwgc3VjY2Vzc1N0ZXBzLCBlcnJvclN0ZXBzKVxuXG4gIC8vIDcuIFJldHVybiBwcm9taXNlLlxuICByZXR1cm4gcHJvbWlzZS5wcm9taXNlXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5LXVudXNhYmxlXG5mdW5jdGlvbiBib2R5VW51c2FibGUgKGJvZHkpIHtcbiAgLy8gQW4gb2JqZWN0IGluY2x1ZGluZyB0aGUgQm9keSBpbnRlcmZhY2UgbWl4aW4gaXNcbiAgLy8gc2FpZCB0byBiZSB1bnVzYWJsZSBpZiBpdHMgYm9keSBpcyBub24tbnVsbCBhbmRcbiAgLy8gaXRzIGJvZHnigJlzIHN0cmVhbSBpcyBkaXN0dXJiZWQgb3IgbG9ja2VkLlxuICByZXR1cm4gYm9keSAhPSBudWxsICYmIChib2R5LnN0cmVhbS5sb2NrZWQgfHwgdXRpbC5pc0Rpc3R1cmJlZChib2R5LnN0cmVhbSkpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jdXRmLTgtZGVjb2RlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyXG4gKi9cbmZ1bmN0aW9uIHV0ZjhEZWNvZGVCeXRlcyAoYnVmZmVyKSB7XG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyAxLiBMZXQgYnVmZmVyIGJlIHRoZSByZXN1bHQgb2YgcGVla2luZyB0aHJlZSBieXRlcyBmcm9tXG4gIC8vICAgIGlvUXVldWUsIGNvbnZlcnRlZCB0byBhIGJ5dGUgc2VxdWVuY2UuXG5cbiAgLy8gMi4gSWYgYnVmZmVyIGlzIDB4RUYgMHhCQiAweEJGLCB0aGVuIHJlYWQgdGhyZWVcbiAgLy8gICAgYnl0ZXMgZnJvbSBpb1F1ZXVlLiAoRG8gbm90aGluZyB3aXRoIHRob3NlIGJ5dGVzLilcbiAgaWYgKGJ1ZmZlclswXSA9PT0gMHhFRiAmJiBidWZmZXJbMV0gPT09IDB4QkIgJiYgYnVmZmVyWzJdID09PSAweEJGKSB7XG4gICAgYnVmZmVyID0gYnVmZmVyLnN1YmFycmF5KDMpXG4gIH1cblxuICAvLyAzLiBQcm9jZXNzIGEgcXVldWUgd2l0aCBhbiBpbnN0YW5jZSBvZiBVVEYtOOKAmXNcbiAgLy8gICAgZGVjb2RlciwgaW9RdWV1ZSwgb3V0cHV0LCBhbmQgXCJyZXBsYWNlbWVudFwiLlxuICBjb25zdCBvdXRwdXQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnVmZmVyKVxuXG4gIC8vIDQuIFJldHVybiBvdXRwdXQuXG4gIHJldHVybiBvdXRwdXRcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNwYXJzZS1qc29uLWJ5dGVzLXRvLWEtamF2YXNjcmlwdC12YWx1ZVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICovXG5mdW5jdGlvbiBwYXJzZUpTT05Gcm9tQnl0ZXMgKGJ5dGVzKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHV0ZjhEZWNvZGVCeXRlcyhieXRlcykpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5LW1pbWUtdHlwZVxuICogQHBhcmFtIHtpbXBvcnQoJy4vcmVzcG9uc2UnKS5SZXNwb25zZXxpbXBvcnQoJy4vcmVxdWVzdCcpLlJlcXVlc3R9IG9iamVjdFxuICovXG5mdW5jdGlvbiBib2R5TWltZVR5cGUgKG9iamVjdCkge1xuICBjb25zdCB7IGhlYWRlcnNMaXN0IH0gPSBvYmplY3Rba1N0YXRlXVxuICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnNMaXN0LmdldCgnY29udGVudC10eXBlJylcblxuICBpZiAoY29udGVudFR5cGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICByZXR1cm4gcGFyc2VNSU1FVHlwZShjb250ZW50VHlwZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGV4dHJhY3RCb2R5LFxuICBzYWZlbHlFeHRyYWN0Qm9keSxcbiAgY2xvbmVCb2R5LFxuICBtaXhpbkJvZHlcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3IsXG4gIE5vdFN1cHBvcnRlZEVycm9yXG59ID0gcmVxdWlyZSgnLi9lcnJvcnMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsga0hUVFAyQnVpbGRSZXF1ZXN0LCBrSFRUUDJDb3B5SGVhZGVycywga0hUVFAxQnVpbGRSZXF1ZXN0IH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8vIHRva2VuUmVnRXhwIGFuZCBoZWFkZXJDaGFyUmVnZXggaGF2ZSBiZWVuIGxpZnRlZCBmcm9tXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYWluL2xpYi9faHR0cF9jb21tb24uanNcblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiB2YWwgaXMgYSB2YWxpZCBIVFRQIHRva2VuXG4gKiBwZXIgdGhlIHJ1bGVzIGRlZmluZWQgaW4gUkZDIDcyMzBcbiAqIFNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMi42XG4gKi9cbmNvbnN0IHRva2VuUmVnRXhwID0gL15bXFxeX2BhLXpBLVpcXC0wLTkhIyQlJicqKy58fl0rJC9cblxuLyoqXG4gKiBNYXRjaGVzIGlmIHZhbCBjb250YWlucyBhbiBpbnZhbGlkIGZpZWxkLXZjaGFyXG4gKiAgZmllbGQtdmFsdWUgICAgPSAqKCBmaWVsZC1jb250ZW50IC8gb2JzLWZvbGQgKVxuICogIGZpZWxkLWNvbnRlbnQgID0gZmllbGQtdmNoYXIgWyAxKiggU1AgLyBIVEFCICkgZmllbGQtdmNoYXIgXVxuICogIGZpZWxkLXZjaGFyICAgID0gVkNIQVIgLyBvYnMtdGV4dFxuICovXG5jb25zdCBoZWFkZXJDaGFyUmVnZXggPSAvW15cXHRcXHgyMC1cXHg3ZVxceDgwLVxceGZmXS9cblxuLy8gVmVyaWZpZXMgdGhhdCBhIGdpdmVuIHBhdGggaXMgdmFsaWQgZG9lcyBub3QgY29udGFpbiBjb250cm9sIGNoYXJzIFxceDAwIHRvIFxceDIwXG5jb25zdCBpbnZhbGlkUGF0aFJlZ2V4ID0gL1teXFx1MDAyMS1cXHUwMGZmXS9cblxuY29uc3Qga0hhbmRsZXIgPSBTeW1ib2woJ2hhbmRsZXInKVxuXG5jb25zdCBjaGFubmVscyA9IHt9XG5cbmxldCBleHRyYWN0Qm9keVxuXG50cnkge1xuICBjb25zdCBkaWFnbm9zdGljc0NoYW5uZWwgPSByZXF1aXJlKCdkaWFnbm9zdGljc19jaGFubmVsJylcbiAgY2hhbm5lbHMuY3JlYXRlID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OmNyZWF0ZScpXG4gIGNoYW5uZWxzLmJvZHlTZW50ID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OmJvZHlTZW50JylcbiAgY2hhbm5lbHMuaGVhZGVycyA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDpoZWFkZXJzJylcbiAgY2hhbm5lbHMudHJhaWxlcnMgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOnJlcXVlc3Q6dHJhaWxlcnMnKVxuICBjaGFubmVscy5lcnJvciA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDplcnJvcicpXG59IGNhdGNoIHtcbiAgY2hhbm5lbHMuY3JlYXRlID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5ib2R5U2VudCA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMuaGVhZGVycyA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMudHJhaWxlcnMgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG4gIGNoYW5uZWxzLmVycm9yID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxufVxuXG5jbGFzcyBSZXF1ZXN0IHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwge1xuICAgIHBhdGgsXG4gICAgbWV0aG9kLFxuICAgIGJvZHksXG4gICAgaGVhZGVycyxcbiAgICBxdWVyeSxcbiAgICBpZGVtcG90ZW50LFxuICAgIGJsb2NraW5nLFxuICAgIHVwZ3JhZGUsXG4gICAgaGVhZGVyc1RpbWVvdXQsXG4gICAgYm9keVRpbWVvdXQsXG4gICAgcmVzZXQsXG4gICAgdGhyb3dPbkVycm9yLFxuICAgIGV4cGVjdENvbnRpbnVlXG4gIH0sIGhhbmRsZXIpIHtcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3BhdGggbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHBhdGhbMF0gIT09ICcvJyAmJlxuICAgICAgIShwYXRoLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpICYmXG4gICAgICBtZXRob2QgIT09ICdDT05ORUNUJ1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdwYXRoIG11c3QgYmUgYW4gYWJzb2x1dGUgVVJMIG9yIHN0YXJ0IHdpdGggYSBzbGFzaCcpXG4gICAgfSBlbHNlIGlmIChpbnZhbGlkUGF0aFJlZ2V4LmV4ZWMocGF0aCkgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXF1ZXN0IHBhdGgnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtZXRob2QgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfSBlbHNlIGlmICh0b2tlblJlZ0V4cC5leGVjKG1ldGhvZCkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXF1ZXN0IG1ldGhvZCcpXG4gICAgfVxuXG4gICAgaWYgKHVwZ3JhZGUgJiYgdHlwZW9mIHVwZ3JhZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3VwZ3JhZGUgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlcnNUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoaGVhZGVyc1RpbWVvdXQpIHx8IGhlYWRlcnNUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBoZWFkZXJzVGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGJvZHlUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoYm9keVRpbWVvdXQpIHx8IGJvZHlUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBib2R5VGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKHJlc2V0ICE9IG51bGwgJiYgdHlwZW9mIHJlc2V0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXNldCcpXG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdENvbnRpbnVlICE9IG51bGwgJiYgdHlwZW9mIGV4cGVjdENvbnRpbnVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBleHBlY3RDb250aW51ZScpXG4gICAgfVxuXG4gICAgdGhpcy5oZWFkZXJzVGltZW91dCA9IGhlYWRlcnNUaW1lb3V0XG5cbiAgICB0aGlzLmJvZHlUaW1lb3V0ID0gYm9keVRpbWVvdXRcblxuICAgIHRoaXMudGhyb3dPbkVycm9yID0gdGhyb3dPbkVycm9yID09PSB0cnVlXG5cbiAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZFxuXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcblxuICAgIGlmIChib2R5ID09IG51bGwpIHtcbiAgICAgIHRoaXMuYm9keSA9IG51bGxcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHlcblxuICAgICAgY29uc3QgclN0YXRlID0gdGhpcy5ib2R5Ll9yZWFkYWJsZVN0YXRlXG4gICAgICBpZiAoIXJTdGF0ZSB8fCAhclN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAgIHRoaXMuZW5kSGFuZGxlciA9IGZ1bmN0aW9uIGF1dG9EZXN0cm95ICgpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3kodGhpcylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvZHkub24oJ2VuZCcsIHRoaXMuZW5kSGFuZGxlcilcbiAgICAgIH1cblxuICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnIgPT4ge1xuICAgICAgICBpZiAodGhpcy5hYm9ydCkge1xuICAgICAgICAgIHRoaXMuYWJvcnQoZXJyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5ib2R5Lm9uKCdlcnJvcicsIHRoaXMuZXJyb3JIYW5kbGVyKVxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0J1ZmZlcihib2R5KSkge1xuICAgICAgdGhpcy5ib2R5ID0gYm9keS5ieXRlTGVuZ3RoID8gYm9keSA6IG51bGxcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhib2R5KSkge1xuICAgICAgdGhpcy5ib2R5ID0gYm9keS5idWZmZXIuYnl0ZUxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkuYnVmZmVyLCBib2R5LmJ5dGVPZmZzZXQsIGJvZHkuYnl0ZUxlbmd0aCkgOiBudWxsXG4gICAgfSBlbHNlIGlmIChib2R5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHkuYnl0ZUxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkpIDogbnVsbFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5Lmxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkpIDogbnVsbFxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShib2R5KSB8fCB1dGlsLmlzSXRlcmFibGUoYm9keSkgfHwgdXRpbC5pc0Jsb2JMaWtlKGJvZHkpKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignYm9keSBtdXN0IGJlIGEgc3RyaW5nLCBhIEJ1ZmZlciwgYSBSZWFkYWJsZSBzdHJlYW0sIGFuIGl0ZXJhYmxlLCBvciBhbiBhc3luYyBpdGVyYWJsZScpXG4gICAgfVxuXG4gICAgdGhpcy5jb21wbGV0ZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2VcblxuICAgIHRoaXMudXBncmFkZSA9IHVwZ3JhZGUgfHwgbnVsbFxuXG4gICAgdGhpcy5wYXRoID0gcXVlcnkgPyB1dGlsLmJ1aWxkVVJMKHBhdGgsIHF1ZXJ5KSA6IHBhdGhcblxuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luXG5cbiAgICB0aGlzLmlkZW1wb3RlbnQgPSBpZGVtcG90ZW50ID09IG51bGxcbiAgICAgID8gbWV0aG9kID09PSAnSEVBRCcgfHwgbWV0aG9kID09PSAnR0VUJ1xuICAgICAgOiBpZGVtcG90ZW50XG5cbiAgICB0aGlzLmJsb2NraW5nID0gYmxvY2tpbmcgPT0gbnVsbCA/IGZhbHNlIDogYmxvY2tpbmdcblxuICAgIHRoaXMucmVzZXQgPSByZXNldCA9PSBudWxsID8gbnVsbCA6IHJlc2V0XG5cbiAgICB0aGlzLmhvc3QgPSBudWxsXG5cbiAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSBudWxsXG5cbiAgICB0aGlzLmNvbnRlbnRUeXBlID0gbnVsbFxuXG4gICAgdGhpcy5oZWFkZXJzID0gJydcblxuICAgIC8vIE9ubHkgZm9yIEgyXG4gICAgdGhpcy5leHBlY3RDb250aW51ZSA9IGV4cGVjdENvbnRpbnVlICE9IG51bGwgPyBleHBlY3RDb250aW51ZSA6IGZhbHNlXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoICUgMiAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnMgYXJyYXkgbXVzdCBiZSBldmVuJylcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBwcm9jZXNzSGVhZGVyKHRoaXMsIGhlYWRlcnNbaV0sIGhlYWRlcnNbaSArIDFdKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVycyAmJiB0eXBlb2YgaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV1cbiAgICAgICAgcHJvY2Vzc0hlYWRlcih0aGlzLCBrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhlYWRlcnMgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoZWFkZXJzIG11c3QgYmUgYW4gb2JqZWN0IG9yIGFuIGFycmF5JylcbiAgICB9XG5cbiAgICBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZSh0aGlzLmJvZHkpKSB7XG4gICAgICBpZiAodXRpbC5ub2RlTWFqb3IgPCAxNiB8fCAodXRpbC5ub2RlTWFqb3IgPT09IDE2ICYmIHV0aWwubm9kZU1pbm9yIDwgOCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdGb3JtLURhdGEgYm9kaWVzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBub2RlIHYxNi44IGFuZCBuZXdlci4nKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWV4dHJhY3RCb2R5KSB7XG4gICAgICAgIGV4dHJhY3RCb2R5ID0gcmVxdWlyZSgnLi4vZmV0Y2gvYm9keS5qcycpLmV4dHJhY3RCb2R5XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtib2R5U3RyZWFtLCBjb250ZW50VHlwZV0gPSBleHRyYWN0Qm9keShib2R5KVxuICAgICAgaWYgKHRoaXMuY29udGVudFR5cGUgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGVcbiAgICAgICAgdGhpcy5oZWFkZXJzICs9IGBjb250ZW50LXR5cGU6ICR7Y29udGVudFR5cGV9XFxyXFxuYFxuICAgICAgfVxuICAgICAgdGhpcy5ib2R5ID0gYm9keVN0cmVhbS5zdHJlYW1cbiAgICAgIHRoaXMuY29udGVudExlbmd0aCA9IGJvZHlTdHJlYW0ubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzQmxvYkxpa2UoYm9keSkgJiYgdGhpcy5jb250ZW50VHlwZSA9PSBudWxsICYmIGJvZHkudHlwZSkge1xuICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGJvZHkudHlwZVxuICAgICAgdGhpcy5oZWFkZXJzICs9IGBjb250ZW50LXR5cGU6ICR7Ym9keS50eXBlfVxcclxcbmBcbiAgICB9XG5cbiAgICB1dGlsLnZhbGlkYXRlSGFuZGxlcihoYW5kbGVyLCBtZXRob2QsIHVwZ3JhZGUpXG5cbiAgICB0aGlzLnNlcnZlcm5hbWUgPSB1dGlsLmdldFNlcnZlck5hbWUodGhpcy5ob3N0KVxuXG4gICAgdGhpc1trSGFuZGxlcl0gPSBoYW5kbGVyXG5cbiAgICBpZiAoY2hhbm5lbHMuY3JlYXRlLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy5jcmVhdGUucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMgfSlcbiAgICB9XG4gIH1cblxuICBvbkJvZHlTZW50IChjaHVuaykge1xuICAgIGlmICh0aGlzW2tIYW5kbGVyXS5vbkJvZHlTZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25Cb2R5U2VudChjaHVuaylcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblJlcXVlc3RTZW50ICgpIHtcbiAgICBpZiAoY2hhbm5lbHMuYm9keVNlbnQuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmJvZHlTZW50LnB1Ymxpc2goeyByZXF1ZXN0OiB0aGlzIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXNba0hhbmRsZXJdLm9uUmVxdWVzdFNlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vblJlcXVlc3RTZW50KClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNvbm5lY3QgKGFib3J0KSB7XG4gICAgYXNzZXJ0KCF0aGlzLmFib3J0ZWQpXG4gICAgYXNzZXJ0KCF0aGlzLmNvbXBsZXRlZClcblxuICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICBhYm9ydCh0aGlzLmVycm9yKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkNvbm5lY3QoYWJvcnQpXG4gICAgfVxuICB9XG5cbiAgb25IZWFkZXJzIChzdGF0dXNDb2RlLCBoZWFkZXJzLCByZXN1bWUsIHN0YXR1c1RleHQpIHtcbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcbiAgICBhc3NlcnQoIXRoaXMuY29tcGxldGVkKVxuXG4gICAgaWYgKGNoYW5uZWxzLmhlYWRlcnMuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmhlYWRlcnMucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIHJlc3BvbnNlOiB7IHN0YXR1c0NvZGUsIGhlYWRlcnMsIHN0YXR1c1RleHQgfSB9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25IZWFkZXJzKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHJlc3VtZSwgc3RhdHVzVGV4dClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuYWJvcnQoZXJyKVxuICAgIH1cbiAgfVxuXG4gIG9uRGF0YSAoY2h1bmspIHtcbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcbiAgICBhc3NlcnQoIXRoaXMuY29tcGxldGVkKVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkRhdGEoY2h1bmspXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIG9uVXBncmFkZSAoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KSB7XG4gICAgYXNzZXJ0KCF0aGlzLmFib3J0ZWQpXG4gICAgYXNzZXJ0KCF0aGlzLmNvbXBsZXRlZClcblxuICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICB0aGlzLm9uRmluYWxseSgpXG5cbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcblxuICAgIHRoaXMuY29tcGxldGVkID0gdHJ1ZVxuICAgIGlmIChjaGFubmVscy50cmFpbGVycy5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMudHJhaWxlcnMucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIHRyYWlsZXJzIH0pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkNvbXBsZXRlKHRyYWlsZXJzKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gVE9ETyAoZml4KTogVGhpcyBtaWdodCBiZSBhIGJhZCBpZGVhP1xuICAgICAgdGhpcy5vbkVycm9yKGVycilcbiAgICB9XG4gIH1cblxuICBvbkVycm9yIChlcnJvcikge1xuICAgIHRoaXMub25GaW5hbGx5KClcblxuICAgIGlmIChjaGFubmVscy5lcnJvci5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuZXJyb3IucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIGVycm9yIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcblxuICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkVycm9yKGVycm9yKVxuICB9XG5cbiAgb25GaW5hbGx5ICgpIHtcbiAgICBpZiAodGhpcy5lcnJvckhhbmRsZXIpIHtcbiAgICAgIHRoaXMuYm9keS5vZmYoJ2Vycm9yJywgdGhpcy5lcnJvckhhbmRsZXIpXG4gICAgICB0aGlzLmVycm9ySGFuZGxlciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJvZHkub2ZmKCdlbmQnLCB0aGlzLmVuZEhhbmRsZXIpXG4gICAgICB0aGlzLmVuZEhhbmRsZXIgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogYWRqdXN0IHRvIHN1cHBvcnQgSDJcbiAgYWRkSGVhZGVyIChrZXksIHZhbHVlKSB7XG4gICAgcHJvY2Vzc0hlYWRlcih0aGlzLCBrZXksIHZhbHVlKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGF0aWMgW2tIVFRQMUJ1aWxkUmVxdWVzdF0gKG9yaWdpbiwgb3B0cywgaGFuZGxlcikge1xuICAgIC8vIFRPRE86IE1pZ3JhdGUgaGVhZGVyIHBhcnNpbmcgaGVyZSwgdG8gbWFrZSBSZXF1ZXN0c1xuICAgIC8vIEhUVFAgYWdub3N0aWNcbiAgICByZXR1cm4gbmV3IFJlcXVlc3Qob3JpZ2luLCBvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgc3RhdGljIFtrSFRUUDJCdWlsZFJlcXVlc3RdIChvcmlnaW4sIG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gb3B0cy5oZWFkZXJzXG4gICAgb3B0cyA9IHsgLi4ub3B0cywgaGVhZGVyczogbnVsbCB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3Qob3JpZ2luLCBvcHRzLCBoYW5kbGVyKVxuXG4gICAgcmVxdWVzdC5oZWFkZXJzID0ge31cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgICBpZiAoaGVhZGVycy5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGVhZGVycyBhcnJheSBtdXN0IGJlIGV2ZW4nKVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHByb2Nlc3NIZWFkZXIocmVxdWVzdCwgaGVhZGVyc1tpXSwgaGVhZGVyc1tpICsgMV0sIHRydWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgICAgICBwcm9jZXNzSGVhZGVyKHJlcXVlc3QsIGtleSwgaGVhZGVyc1trZXldLCB0cnVlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVycyAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnMgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYW4gYXJyYXknKVxuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0XG4gIH1cblxuICBzdGF0aWMgW2tIVFRQMkNvcHlIZWFkZXJzXSAocmF3KSB7XG4gICAgY29uc3QgcmF3SGVhZGVycyA9IHJhdy5zcGxpdCgnXFxyXFxuJylcbiAgICBjb25zdCBoZWFkZXJzID0ge31cblxuICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIHJhd0hlYWRlcnMpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGhlYWRlci5zcGxpdCgnOiAnKVxuXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICAgIGlmIChoZWFkZXJzW2tleV0pIGhlYWRlcnNba2V5XSArPSBgLCR7dmFsdWV9YFxuICAgICAgZWxzZSBoZWFkZXJzW2tleV0gPSB2YWx1ZVxuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0hlYWRlclZhbHVlIChrZXksIHZhbCwgc2tpcEFwcGVuZCkge1xuICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBpbnZhbGlkICR7a2V5fSBoZWFkZXJgKVxuICB9XG5cbiAgdmFsID0gdmFsICE9IG51bGwgPyBgJHt2YWx9YCA6ICcnXG5cbiAgaWYgKGhlYWRlckNoYXJSZWdleC5leGVjKHZhbCkgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYGludmFsaWQgJHtrZXl9IGhlYWRlcmApXG4gIH1cblxuICByZXR1cm4gc2tpcEFwcGVuZCA/IHZhbCA6IGAke2tleX06ICR7dmFsfVxcclxcbmBcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0hlYWRlciAocmVxdWVzdCwga2V5LCB2YWwsIHNraXBBcHBlbmQgPSBmYWxzZSkge1xuICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihgaW52YWxpZCAke2tleX0gaGVhZGVyYClcbiAgfSBlbHNlIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKFxuICAgIHJlcXVlc3QuaG9zdCA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDQgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2hvc3QnXG4gICkge1xuICAgIGlmIChoZWFkZXJDaGFyUmVnZXguZXhlYyh2YWwpICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYGludmFsaWQgJHtrZXl9IGhlYWRlcmApXG4gICAgfVxuICAgIC8vIENvbnN1bWVkIGJ5IENsaWVudFxuICAgIHJlcXVlc3QuaG9zdCA9IHZhbFxuICB9IGVsc2UgaWYgKFxuICAgIHJlcXVlc3QuY29udGVudExlbmd0aCA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDE0ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LWxlbmd0aCdcbiAgKSB7XG4gICAgcmVxdWVzdC5jb250ZW50TGVuZ3RoID0gcGFyc2VJbnQodmFsLCAxMClcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXF1ZXN0LmNvbnRlbnRMZW5ndGgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY29udGVudC1sZW5ndGggaGVhZGVyJylcbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAgcmVxdWVzdC5jb250ZW50VHlwZSA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDEyICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnXG4gICkge1xuICAgIHJlcXVlc3QuY29udGVudFR5cGUgPSB2YWxcbiAgICBpZiAoc2tpcEFwcGVuZCkgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwsIHNraXBBcHBlbmQpXG4gICAgZWxzZSByZXF1ZXN0LmhlYWRlcnMgKz0gcHJvY2Vzc0hlYWRlclZhbHVlKGtleSwgdmFsKVxuICB9IGVsc2UgaWYgKFxuICAgIGtleS5sZW5ndGggPT09IDE3ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICd0cmFuc2Zlci1lbmNvZGluZydcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIHRyYW5zZmVyLWVuY29kaW5nIGhlYWRlcicpXG4gIH0gZWxzZSBpZiAoXG4gICAga2V5Lmxlbmd0aCA9PT0gMTAgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2Nvbm5lY3Rpb24nXG4gICkge1xuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyB2YWwudG9Mb3dlckNhc2UoKSA6IG51bGxcbiAgICBpZiAodmFsdWUgIT09ICdjbG9zZScgJiYgdmFsdWUgIT09ICdrZWVwLWFsaXZlJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNvbm5lY3Rpb24gaGVhZGVyJylcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnY2xvc2UnKSB7XG4gICAgICByZXF1ZXN0LnJlc2V0ID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIGlmIChcbiAgICBrZXkubGVuZ3RoID09PSAxMCAmJlxuICAgIGtleS50b0xvd2VyQ2FzZSgpID09PSAna2VlcC1hbGl2ZSdcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGtlZXAtYWxpdmUgaGVhZGVyJylcbiAgfSBlbHNlIGlmIChcbiAgICBrZXkubGVuZ3RoID09PSA3ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICd1cGdyYWRlJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgdXBncmFkZSBoZWFkZXInKVxuICB9IGVsc2UgaWYgKFxuICAgIGtleS5sZW5ndGggPT09IDYgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2V4cGVjdCdcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEVycm9yKCdleHBlY3QgaGVhZGVyIG5vdCBzdXBwb3J0ZWQnKVxuICB9IGVsc2UgaWYgKHRva2VuUmVnRXhwLmV4ZWMoa2V5KSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBoZWFkZXIga2V5JylcbiAgfSBlbHNlIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2tpcEFwcGVuZCkge1xuICAgICAgICAgIGlmIChyZXF1ZXN0LmhlYWRlcnNba2V5XSkgcmVxdWVzdC5oZWFkZXJzW2tleV0gKz0gYCwke3Byb2Nlc3NIZWFkZXJWYWx1ZShrZXksIHZhbFtpXSwgc2tpcEFwcGVuZCl9YFxuICAgICAgICAgIGVsc2UgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWxbaV0sIHNraXBBcHBlbmQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVxdWVzdC5oZWFkZXJzICs9IHByb2Nlc3NIZWFkZXJWYWx1ZShrZXksIHZhbFtpXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2tpcEFwcGVuZCkgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwsIHNraXBBcHBlbmQpXG4gICAgICBlbHNlIHJlcXVlc3QuaGVhZGVycyArPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwpXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVxdWVzdFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJylcblxuY2xhc3MgRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGRpc3BhdGNoICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBjbG9zZSAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgZGVzdHJveSAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRGlzcGF0Y2hlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlcicpXG5jb25zdCB7XG4gIENsaWVudERlc3Ryb3llZEVycm9yLFxuICBDbGllbnRDbG9zZWRFcnJvcixcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3Jcbn0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsga0Rlc3Ryb3ksIGtDbG9zZSwga0Rpc3BhdGNoLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5cbmNvbnN0IGtEZXN0cm95ZWQgPSBTeW1ib2woJ2Rlc3Ryb3llZCcpXG5jb25zdCBrQ2xvc2VkID0gU3ltYm9sKCdjbG9zZWQnKVxuY29uc3Qga09uRGVzdHJveWVkID0gU3ltYm9sKCdvbkRlc3Ryb3llZCcpXG5jb25zdCBrT25DbG9zZWQgPSBTeW1ib2woJ29uQ2xvc2VkJylcbmNvbnN0IGtJbnRlcmNlcHRlZERpc3BhdGNoID0gU3ltYm9sKCdJbnRlcmNlcHRlZCBEaXNwYXRjaCcpXG5cbmNsYXNzIERpc3BhdGNoZXJCYXNlIGV4dGVuZHMgRGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tEZXN0cm95ZWRdID0gZmFsc2VcbiAgICB0aGlzW2tPbkRlc3Ryb3llZF0gPSBudWxsXG4gICAgdGhpc1trQ2xvc2VkXSA9IGZhbHNlXG4gICAgdGhpc1trT25DbG9zZWRdID0gW11cbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQgKCkge1xuICAgIHJldHVybiB0aGlzW2tEZXN0cm95ZWRdXG4gIH1cblxuICBnZXQgY2xvc2VkICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ2xvc2VkXVxuICB9XG5cbiAgZ2V0IGludGVyY2VwdG9ycyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0ludGVyY2VwdG9yc11cbiAgfVxuXG4gIHNldCBpbnRlcmNlcHRvcnMgKG5ld0ludGVyY2VwdG9ycykge1xuICAgIGlmIChuZXdJbnRlcmNlcHRvcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSBuZXdJbnRlcmNlcHRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSB0aGlzW2tJbnRlcmNlcHRvcnNdW2ldXG4gICAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludGVyY2VwdG9yIG11c3QgYmUgYW4gZnVuY3Rpb24nKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG5ld0ludGVyY2VwdG9yc1xuICB9XG5cbiAgY2xvc2UgKGNhbGxiYWNrKSB7XG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2UoKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICB9XG5cbiAgICBpZiAodGhpc1trRGVzdHJveWVkXSkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2sobmV3IENsaWVudERlc3Ryb3llZEVycm9yKCksIG51bGwpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXNba0Nsb3NlZF0pIHtcbiAgICAgIGlmICh0aGlzW2tPbkNsb3NlZF0pIHtcbiAgICAgICAgdGhpc1trT25DbG9zZWRdLnB1c2goY2FsbGJhY2spXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhudWxsLCBudWxsKSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXNba0Nsb3NlZF0gPSB0cnVlXG4gICAgdGhpc1trT25DbG9zZWRdLnB1c2goY2FsbGJhY2spXG5cbiAgICBjb25zdCBvbkNsb3NlZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXNba09uQ2xvc2VkXVxuICAgICAgdGhpc1trT25DbG9zZWRdID0gbnVsbFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2ldKG51bGwsIG51bGwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2hvdWxkIG5vdCBlcnJvci5cbiAgICB0aGlzW2tDbG9zZV0oKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5kZXN0cm95KCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKG9uQ2xvc2VkKVxuICAgICAgfSlcbiAgfVxuXG4gIGRlc3Ryb3kgKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBlcnJcbiAgICAgIGVyciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5kZXN0cm95KGVyciwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBlcnIgPyAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogc2hvdWxkIG5ldmVyIGVycm9yICovIHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGlmICh0aGlzW2tEZXN0cm95ZWRdKSB7XG4gICAgICBpZiAodGhpc1trT25EZXN0cm95ZWRdKSB7XG4gICAgICAgIHRoaXNba09uRGVzdHJveWVkXS5wdXNoKGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2sobnVsbCwgbnVsbCkpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWVycikge1xuICAgICAgZXJyID0gbmV3IENsaWVudERlc3Ryb3llZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzW2tEZXN0cm95ZWRdID0gdHJ1ZVxuICAgIHRoaXNba09uRGVzdHJveWVkXSA9IHRoaXNba09uRGVzdHJveWVkXSB8fCBbXVxuICAgIHRoaXNba09uRGVzdHJveWVkXS5wdXNoKGNhbGxiYWNrKVxuXG4gICAgY29uc3Qgb25EZXN0cm95ZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzW2tPbkRlc3Ryb3llZF1cbiAgICAgIHRoaXNba09uRGVzdHJveWVkXSA9IG51bGxcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tpXShudWxsLCBudWxsKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNob3VsZCBub3QgZXJyb3IuXG4gICAgdGhpc1trRGVzdHJveV0oZXJyKS50aGVuKCgpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKG9uRGVzdHJveWVkKVxuICAgIH0pXG4gIH1cblxuICBba0ludGVyY2VwdGVkRGlzcGF0Y2hdIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgaWYgKCF0aGlzW2tJbnRlcmNlcHRvcnNdIHx8IHRoaXNba0ludGVyY2VwdG9yc10ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzW2tJbnRlcmNlcHRlZERpc3BhdGNoXSA9IHRoaXNba0Rpc3BhdGNoXVxuICAgICAgcmV0dXJuIHRoaXNba0Rpc3BhdGNoXShvcHRzLCBoYW5kbGVyKVxuICAgIH1cblxuICAgIGxldCBkaXNwYXRjaCA9IHRoaXNba0Rpc3BhdGNoXS5iaW5kKHRoaXMpXG4gICAgZm9yIChsZXQgaSA9IHRoaXNba0ludGVyY2VwdG9yc10ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGRpc3BhdGNoID0gdGhpc1trSW50ZXJjZXB0b3JzXVtpXShkaXNwYXRjaClcbiAgICB9XG4gICAgdGhpc1trSW50ZXJjZXB0ZWREaXNwYXRjaF0gPSBkaXNwYXRjaFxuICAgIHJldHVybiBkaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAoIWhhbmRsZXIgfHwgdHlwZW9mIGhhbmRsZXIgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hhbmRsZXIgbXVzdCBiZSBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoIW9wdHMgfHwgdHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cyBtdXN0IGJlIGFuIG9iamVjdC4nKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpc1trRGVzdHJveWVkXSB8fCB0aGlzW2tPbkRlc3Ryb3llZF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IENsaWVudERlc3Ryb3llZEVycm9yKClcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXNba0Nsb3NlZF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IENsaWVudENsb3NlZEVycm9yKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXNba0ludGVyY2VwdGVkRGlzcGF0Y2hdKG9wdHMsIGhhbmRsZXIpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodHlwZW9mIGhhbmRsZXIub25FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25FcnJvciBtZXRob2QnKVxuICAgICAgfVxuXG4gICAgICBoYW5kbGVyLm9uRXJyb3IoZXJyKVxuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEaXNwYXRjaGVyQmFzZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0JylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIENvbm5lY3RUaW1lb3V0RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3JzJylcblxubGV0IHRscyAvLyBpbmNsdWRlIHRscyBjb25kaXRpb25hbGx5IHNpbmNlIGl0IGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlXG5cbi8vIFRPRE86IHNlc3Npb24gcmUtdXNlIGRvZXMgbm90IHdhaXQgZm9yIHRoZSBmaXJzdFxuLy8gY29ubmVjdGlvbiB0byByZXNvbHZlIHRoZSBzZXNzaW9uIGFuZCBtaWdodCB0aGVyZWZvcmVcbi8vIHJlc29sdmUgdGhlIHNhbWUgc2VydmVybmFtZSBtdWx0aXBsZSB0aW1lcyBldmVuIHdoZW5cbi8vIHJlLXVzZSBpcyBlbmFibGVkLlxuXG5sZXQgU2Vzc2lvbkNhY2hlXG4vLyBGSVhNRTogcmVtb3ZlIHdvcmthcm91bmQgd2hlbiB0aGUgTm9kZSBidWcgaXMgZml4ZWRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDkzNDQjaXNzdWVjb21tZW50LTE3NDE3NzYzMDhcbmlmIChnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgIXByb2Nlc3MuZW52Lk5PREVfVjhfQ09WRVJBR0UpIHtcbiAgU2Vzc2lvbkNhY2hlID0gY2xhc3MgV2Vha1Nlc3Npb25DYWNoZSB7XG4gICAgY29uc3RydWN0b3IgKG1heENhY2hlZFNlc3Npb25zKSB7XG4gICAgICB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucyA9IG1heENhY2hlZFNlc3Npb25zXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUgPSBuZXcgTWFwKClcbiAgICAgIHRoaXMuX3Nlc3Npb25SZWdpc3RyeSA9IG5ldyBnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkoKGtleSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbkNhY2hlLnNpemUgPCB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5fc2Vzc2lvbkNhY2hlLmdldChrZXkpXG4gICAgICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCAmJiByZWYuZGVyZWYoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlLmRlbGV0ZShrZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZ2V0IChzZXNzaW9uS2V5KSB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzLl9zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpXG4gICAgICByZXR1cm4gcmVmID8gcmVmLmRlcmVmKCkgOiBudWxsXG4gICAgfVxuXG4gICAgc2V0IChzZXNzaW9uS2V5LCBzZXNzaW9uKSB7XG4gICAgICBpZiAodGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgbmV3IFdlYWtSZWYoc2Vzc2lvbikpXG4gICAgICB0aGlzLl9zZXNzaW9uUmVnaXN0cnkucmVnaXN0ZXIoc2Vzc2lvbiwgc2Vzc2lvbktleSlcbiAgICB9XG4gIH1cbn0gZWxzZSB7XG4gIFNlc3Npb25DYWNoZSA9IGNsYXNzIFNpbXBsZVNlc3Npb25DYWNoZSB7XG4gICAgY29uc3RydWN0b3IgKG1heENhY2hlZFNlc3Npb25zKSB7XG4gICAgICB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucyA9IG1heENhY2hlZFNlc3Npb25zXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUgPSBuZXcgTWFwKClcbiAgICB9XG5cbiAgICBnZXQgKHNlc3Npb25LZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpXG4gICAgfVxuXG4gICAgc2V0IChzZXNzaW9uS2V5LCBzZXNzaW9uKSB7XG4gICAgICBpZiAodGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9zZXNzaW9uQ2FjaGUuc2l6ZSA+PSB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgICAvLyByZW1vdmUgdGhlIG9sZGVzdCBzZXNzaW9uXG4gICAgICAgIGNvbnN0IHsgdmFsdWU6IG9sZGVzdEtleSB9ID0gdGhpcy5fc2Vzc2lvbkNhY2hlLmtleXMoKS5uZXh0KClcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlLmRlbGV0ZShvbGRlc3RLZXkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgc2Vzc2lvbilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDb25uZWN0b3IgKHsgYWxsb3dIMiwgbWF4Q2FjaGVkU2Vzc2lvbnMsIHNvY2tldFBhdGgsIHRpbWVvdXQsIC4uLm9wdHMgfSkge1xuICBpZiAobWF4Q2FjaGVkU2Vzc2lvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4Q2FjaGVkU2Vzc2lvbnMpIHx8IG1heENhY2hlZFNlc3Npb25zIDwgMCkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heENhY2hlZFNlc3Npb25zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIHplcm8nKVxuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHsgcGF0aDogc29ja2V0UGF0aCwgLi4ub3B0cyB9XG4gIGNvbnN0IHNlc3Npb25DYWNoZSA9IG5ldyBTZXNzaW9uQ2FjaGUobWF4Q2FjaGVkU2Vzc2lvbnMgPT0gbnVsbCA/IDEwMCA6IG1heENhY2hlZFNlc3Npb25zKVxuICB0aW1lb3V0ID0gdGltZW91dCA9PSBudWxsID8gMTBlMyA6IHRpbWVvdXRcbiAgYWxsb3dIMiA9IGFsbG93SDIgIT0gbnVsbCA/IGFsbG93SDIgOiBmYWxzZVxuICByZXR1cm4gZnVuY3Rpb24gY29ubmVjdCAoeyBob3N0bmFtZSwgaG9zdCwgcHJvdG9jb2wsIHBvcnQsIHNlcnZlcm5hbWUsIGxvY2FsQWRkcmVzcywgaHR0cFNvY2tldCB9LCBjYWxsYmFjaykge1xuICAgIGxldCBzb2NrZXRcbiAgICBpZiAocHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICBpZiAoIXRscykge1xuICAgICAgICB0bHMgPSByZXF1aXJlKCd0bHMnKVxuICAgICAgfVxuICAgICAgc2VydmVybmFtZSA9IHNlcnZlcm5hbWUgfHwgb3B0aW9ucy5zZXJ2ZXJuYW1lIHx8IHV0aWwuZ2V0U2VydmVyTmFtZShob3N0KSB8fCBudWxsXG5cbiAgICAgIGNvbnN0IHNlc3Npb25LZXkgPSBzZXJ2ZXJuYW1lIHx8IGhvc3RuYW1lXG4gICAgICBjb25zdCBzZXNzaW9uID0gc2Vzc2lvbkNhY2hlLmdldChzZXNzaW9uS2V5KSB8fCBudWxsXG5cbiAgICAgIGFzc2VydChzZXNzaW9uS2V5KVxuXG4gICAgICBzb2NrZXQgPSB0bHMuY29ubmVjdCh7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IDE2Mzg0LCAvLyBUTFMgaW4gbm9kZSBjYW4ndCBoYXZlIGJpZ2dlciBIV00gYW55d2F5Li4uXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHNlcnZlcm5hbWUsXG4gICAgICAgIHNlc3Npb24sXG4gICAgICAgIGxvY2FsQWRkcmVzcyxcbiAgICAgICAgLy8gVE9ETyhIVFRQLzIpOiBBZGQgc3VwcG9ydCBmb3IgaDJjXG4gICAgICAgIEFMUE5Qcm90b2NvbHM6IGFsbG93SDIgPyBbJ2h0dHAvMS4xJywgJ2gyJ10gOiBbJ2h0dHAvMS4xJ10sXG4gICAgICAgIHNvY2tldDogaHR0cFNvY2tldCwgLy8gdXBncmFkZSBzb2NrZXQgY29ubmVjdGlvblxuICAgICAgICBwb3J0OiBwb3J0IHx8IDQ0MyxcbiAgICAgICAgaG9zdDogaG9zdG5hbWVcbiAgICAgIH0pXG5cbiAgICAgIHNvY2tldFxuICAgICAgICAub24oJ3Nlc3Npb24nLCBmdW5jdGlvbiAoc2Vzc2lvbikge1xuICAgICAgICAgIC8vIFRPRE8gKGZpeCk6IENhbiBhIHNlc3Npb24gYmVjb21lIGludmFsaWQgb25jZSBlc3RhYmxpc2hlZD8gRG9uJ3QgdGhpbmsgc28/XG4gICAgICAgICAgc2Vzc2lvbkNhY2hlLnNldChzZXNzaW9uS2V5LCBzZXNzaW9uKVxuICAgICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoIWh0dHBTb2NrZXQsICdodHRwU29ja2V0IGNhbiBvbmx5IGJlIHNlbnQgb24gVExTIHVwZGF0ZScpXG4gICAgICBzb2NrZXQgPSBuZXQuY29ubmVjdCh7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IDY0ICogMTAyNCwgLy8gU2FtZSBhcyBub2RlanMgZnMgc3RyZWFtcy5cbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbG9jYWxBZGRyZXNzLFxuICAgICAgICBwb3J0OiBwb3J0IHx8IDgwLFxuICAgICAgICBob3N0OiBob3N0bmFtZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBTZXQgVENQIGtlZXAgYWxpdmUgb3B0aW9ucyBvbiB0aGUgc29ja2V0IGhlcmUgaW5zdGVhZCBvZiBpbiBjb25uZWN0KCkgZm9yIHRoZSBjYXNlIG9mIGFzc2lnbmluZyB0aGUgc29ja2V0XG4gICAgaWYgKG9wdGlvbnMua2VlcEFsaXZlID09IG51bGwgfHwgb3B0aW9ucy5rZWVwQWxpdmUpIHtcbiAgICAgIGNvbnN0IGtlZXBBbGl2ZUluaXRpYWxEZWxheSA9IG9wdGlvbnMua2VlcEFsaXZlSW5pdGlhbERlbGF5ID09PSB1bmRlZmluZWQgPyA2MGUzIDogb3B0aW9ucy5rZWVwQWxpdmVJbml0aWFsRGVsYXlcbiAgICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSwga2VlcEFsaXZlSW5pdGlhbERlbGF5KVxuICAgIH1cblxuICAgIGNvbnN0IGNhbmNlbFRpbWVvdXQgPSBzZXR1cFRpbWVvdXQoKCkgPT4gb25Db25uZWN0VGltZW91dChzb2NrZXQpLCB0aW1lb3V0KVxuXG4gICAgc29ja2V0XG4gICAgICAuc2V0Tm9EZWxheSh0cnVlKVxuICAgICAgLm9uY2UocHJvdG9jb2wgPT09ICdodHRwczonID8gJ3NlY3VyZUNvbm5lY3QnIDogJ2Nvbm5lY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbmNlbFRpbWVvdXQoKVxuXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNvbnN0IGNiID0gY2FsbGJhY2tcbiAgICAgICAgICBjYWxsYmFjayA9IG51bGxcbiAgICAgICAgICBjYihudWxsLCB0aGlzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgY2FuY2VsVGltZW91dCgpXG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY29uc3QgY2IgPSBjYWxsYmFja1xuICAgICAgICAgIGNhbGxiYWNrID0gbnVsbFxuICAgICAgICAgIGNiKGVycilcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgIHJldHVybiBzb2NrZXRcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXR1cFRpbWVvdXQgKG9uQ29ubmVjdFRpbWVvdXQsIHRpbWVvdXQpIHtcbiAgaWYgKCF0aW1lb3V0KSB7XG4gICAgcmV0dXJuICgpID0+IHt9XG4gIH1cblxuICBsZXQgczEgPSBudWxsXG4gIGxldCBzMiA9IG51bGxcbiAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gc2V0SW1tZWRpYXRlIGlzIGFkZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHByaW90b3Jpc2Ugc29ja2V0IGVycm9yIGV2ZW50cyBvdmVyIHRpbWVvdXRzXG4gICAgczEgPSBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgLy8gV2luZG93cyBuZWVkcyBhbiBleHRyYSBzZXRJbW1lZGlhdGUgcHJvYmFibHkgZHVlIHRvIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzIGluIHRoZSBzb2NrZXQgbG9naWNcbiAgICAgICAgczIgPSBzZXRJbW1lZGlhdGUoKCkgPT4gb25Db25uZWN0VGltZW91dCgpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25Db25uZWN0VGltZW91dCgpXG4gICAgICB9XG4gICAgfSlcbiAgfSwgdGltZW91dClcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgIGNsZWFySW1tZWRpYXRlKHMxKVxuICAgIGNsZWFySW1tZWRpYXRlKHMyKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uQ29ubmVjdFRpbWVvdXQgKHNvY2tldCkge1xuICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgQ29ubmVjdFRpbWVvdXRFcnJvcigpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1aWxkQ29ubmVjdG9yXG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5lbnVtVG9NYXAgPSB2b2lkIDA7XG5mdW5jdGlvbiBlbnVtVG9NYXAob2JqKSB7XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5lbnVtVG9NYXAgPSBlbnVtVG9NYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TUEVDSUFMX0hFQURFUlMgPSBleHBvcnRzLkhFQURFUl9TVEFURSA9IGV4cG9ydHMuTUlOT1IgPSBleHBvcnRzLk1BSk9SID0gZXhwb3J0cy5DT05ORUNUSU9OX1RPS0VOX0NIQVJTID0gZXhwb3J0cy5IRUFERVJfQ0hBUlMgPSBleHBvcnRzLlRPS0VOID0gZXhwb3J0cy5TVFJJQ1RfVE9LRU4gPSBleHBvcnRzLkhFWCA9IGV4cG9ydHMuVVJMX0NIQVIgPSBleHBvcnRzLlNUUklDVF9VUkxfQ0hBUiA9IGV4cG9ydHMuVVNFUklORk9fQ0hBUlMgPSBleHBvcnRzLk1BUksgPSBleHBvcnRzLkFMUEhBTlVNID0gZXhwb3J0cy5OVU0gPSBleHBvcnRzLkhFWF9NQVAgPSBleHBvcnRzLk5VTV9NQVAgPSBleHBvcnRzLkFMUEhBID0gZXhwb3J0cy5GSU5JU0ggPSBleHBvcnRzLkhfTUVUSE9EX01BUCA9IGV4cG9ydHMuTUVUSE9EX01BUCA9IGV4cG9ydHMuTUVUSE9EU19SVFNQID0gZXhwb3J0cy5NRVRIT0RTX0lDRSA9IGV4cG9ydHMuTUVUSE9EU19IVFRQID0gZXhwb3J0cy5NRVRIT0RTID0gZXhwb3J0cy5MRU5JRU5UX0ZMQUdTID0gZXhwb3J0cy5GTEFHUyA9IGV4cG9ydHMuVFlQRSA9IGV4cG9ydHMuRVJST1IgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG4vLyBDIGhlYWRlcnNcbnZhciBFUlJPUjtcbihmdW5jdGlvbiAoRVJST1IpIHtcbiAgICBFUlJPUltFUlJPUltcIk9LXCJdID0gMF0gPSBcIk9LXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlRFUk5BTFwiXSA9IDFdID0gXCJJTlRFUk5BTFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiU1RSSUNUXCJdID0gMl0gPSBcIlNUUklDVFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiTEZfRVhQRUNURURcIl0gPSAzXSA9IFwiTEZfRVhQRUNURURcIjtcbiAgICBFUlJPUltFUlJPUltcIlVORVhQRUNURURfQ09OVEVOVF9MRU5HVEhcIl0gPSA0XSA9IFwiVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0xPU0VEX0NPTk5FQ1RJT05cIl0gPSA1XSA9IFwiQ0xPU0VEX0NPTk5FQ1RJT05cIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfTUVUSE9EXCJdID0gNl0gPSBcIklOVkFMSURfTUVUSE9EXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1VSTFwiXSA9IDddID0gXCJJTlZBTElEX1VSTFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9DT05TVEFOVFwiXSA9IDhdID0gXCJJTlZBTElEX0NPTlNUQU5UXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1ZFUlNJT05cIl0gPSA5XSA9IFwiSU5WQUxJRF9WRVJTSU9OXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX0hFQURFUl9UT0tFTlwiXSA9IDEwXSA9IFwiSU5WQUxJRF9IRUFERVJfVE9LRU5cIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfQ09OVEVOVF9MRU5HVEhcIl0gPSAxMV0gPSBcIklOVkFMSURfQ09OVEVOVF9MRU5HVEhcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfQ0hVTktfU0laRVwiXSA9IDEyXSA9IFwiSU5WQUxJRF9DSFVOS19TSVpFXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1NUQVRVU1wiXSA9IDEzXSA9IFwiSU5WQUxJRF9TVEFUVVNcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfRU9GX1NUQVRFXCJdID0gMTRdID0gXCJJTlZBTElEX0VPRl9TVEFURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElOR1wiXSA9IDE1XSA9IFwiSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElOR1wiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfTUVTU0FHRV9CRUdJTlwiXSA9IDE2XSA9IFwiQ0JfTUVTU0FHRV9CRUdJTlwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfSEVBREVSU19DT01QTEVURVwiXSA9IDE3XSA9IFwiQ0JfSEVBREVSU19DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfTUVTU0FHRV9DT01QTEVURVwiXSA9IDE4XSA9IFwiQ0JfTUVTU0FHRV9DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfQ0hVTktfSEVBREVSXCJdID0gMTldID0gXCJDQl9DSFVOS19IRUFERVJcIjtcbiAgICBFUlJPUltFUlJPUltcIkNCX0NIVU5LX0NPTVBMRVRFXCJdID0gMjBdID0gXCJDQl9DSFVOS19DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiUEFVU0VEXCJdID0gMjFdID0gXCJQQVVTRURcIjtcbiAgICBFUlJPUltFUlJPUltcIlBBVVNFRF9VUEdSQURFXCJdID0gMjJdID0gXCJQQVVTRURfVVBHUkFERVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiUEFVU0VEX0gyX1VQR1JBREVcIl0gPSAyM10gPSBcIlBBVVNFRF9IMl9VUEdSQURFXCI7XG4gICAgRVJST1JbRVJST1JbXCJVU0VSXCJdID0gMjRdID0gXCJVU0VSXCI7XG59KShFUlJPUiA9IGV4cG9ydHMuRVJST1IgfHwgKGV4cG9ydHMuRVJST1IgPSB7fSkpO1xudmFyIFRZUEU7XG4oZnVuY3Rpb24gKFRZUEUpIHtcbiAgICBUWVBFW1RZUEVbXCJCT1RIXCJdID0gMF0gPSBcIkJPVEhcIjtcbiAgICBUWVBFW1RZUEVbXCJSRVFVRVNUXCJdID0gMV0gPSBcIlJFUVVFU1RcIjtcbiAgICBUWVBFW1RZUEVbXCJSRVNQT05TRVwiXSA9IDJdID0gXCJSRVNQT05TRVwiO1xufSkoVFlQRSA9IGV4cG9ydHMuVFlQRSB8fCAoZXhwb3J0cy5UWVBFID0ge30pKTtcbnZhciBGTEFHUztcbihmdW5jdGlvbiAoRkxBR1MpIHtcbiAgICBGTEFHU1tGTEFHU1tcIkNPTk5FQ1RJT05fS0VFUF9BTElWRVwiXSA9IDFdID0gXCJDT05ORUNUSU9OX0tFRVBfQUxJVkVcIjtcbiAgICBGTEFHU1tGTEFHU1tcIkNPTk5FQ1RJT05fQ0xPU0VcIl0gPSAyXSA9IFwiQ09OTkVDVElPTl9DTE9TRVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiQ09OTkVDVElPTl9VUEdSQURFXCJdID0gNF0gPSBcIkNPTk5FQ1RJT05fVVBHUkFERVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiQ0hVTktFRFwiXSA9IDhdID0gXCJDSFVOS0VEXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJVUEdSQURFXCJdID0gMTZdID0gXCJVUEdSQURFXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJDT05URU5UX0xFTkdUSFwiXSA9IDMyXSA9IFwiQ09OVEVOVF9MRU5HVEhcIjtcbiAgICBGTEFHU1tGTEFHU1tcIlNLSVBCT0RZXCJdID0gNjRdID0gXCJTS0lQQk9EWVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiVFJBSUxJTkdcIl0gPSAxMjhdID0gXCJUUkFJTElOR1wiO1xuICAgIC8vIDEgPDwgOCBpcyB1bnVzZWRcbiAgICBGTEFHU1tGTEFHU1tcIlRSQU5TRkVSX0VOQ09ESU5HXCJdID0gNTEyXSA9IFwiVFJBTlNGRVJfRU5DT0RJTkdcIjtcbn0pKEZMQUdTID0gZXhwb3J0cy5GTEFHUyB8fCAoZXhwb3J0cy5GTEFHUyA9IHt9KSk7XG52YXIgTEVOSUVOVF9GTEFHUztcbihmdW5jdGlvbiAoTEVOSUVOVF9GTEFHUykge1xuICAgIExFTklFTlRfRkxBR1NbTEVOSUVOVF9GTEFHU1tcIkhFQURFUlNcIl0gPSAxXSA9IFwiSEVBREVSU1wiO1xuICAgIExFTklFTlRfRkxBR1NbTEVOSUVOVF9GTEFHU1tcIkNIVU5LRURfTEVOR1RIXCJdID0gMl0gPSBcIkNIVU5LRURfTEVOR1RIXCI7XG4gICAgTEVOSUVOVF9GTEFHU1tMRU5JRU5UX0ZMQUdTW1wiS0VFUF9BTElWRVwiXSA9IDRdID0gXCJLRUVQX0FMSVZFXCI7XG59KShMRU5JRU5UX0ZMQUdTID0gZXhwb3J0cy5MRU5JRU5UX0ZMQUdTIHx8IChleHBvcnRzLkxFTklFTlRfRkxBR1MgPSB7fSkpO1xudmFyIE1FVEhPRFM7XG4oZnVuY3Rpb24gKE1FVEhPRFMpIHtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJERUxFVEVcIl0gPSAwXSA9IFwiREVMRVRFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiR0VUXCJdID0gMV0gPSBcIkdFVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkhFQURcIl0gPSAyXSA9IFwiSEVBRFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBPU1RcIl0gPSAzXSA9IFwiUE9TVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBVVFwiXSA9IDRdID0gXCJQVVRcIjtcbiAgICAvKiBwYXRob2xvZ2ljYWwgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJDT05ORUNUXCJdID0gNV0gPSBcIkNPTk5FQ1RcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJPUFRJT05TXCJdID0gNl0gPSBcIk9QVElPTlNcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJUUkFDRVwiXSA9IDddID0gXCJUUkFDRVwiO1xuICAgIC8qIFdlYkRBViAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkNPUFlcIl0gPSA4XSA9IFwiQ09QWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkxPQ0tcIl0gPSA5XSA9IFwiTE9DS1wiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1LQ09MXCJdID0gMTBdID0gXCJNS0NPTFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1PVkVcIl0gPSAxMV0gPSBcIk1PVkVcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQUk9QRklORFwiXSA9IDEyXSA9IFwiUFJPUEZJTkRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQUk9QUEFUQ0hcIl0gPSAxM10gPSBcIlBST1BQQVRDSFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlNFQVJDSFwiXSA9IDE0XSA9IFwiU0VBUkNIXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5MT0NLXCJdID0gMTVdID0gXCJVTkxPQ0tcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJCSU5EXCJdID0gMTZdID0gXCJCSU5EXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVCSU5EXCJdID0gMTddID0gXCJSRUJJTkRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJVTkJJTkRcIl0gPSAxOF0gPSBcIlVOQklORFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkFDTFwiXSA9IDE5XSA9IFwiQUNMXCI7XG4gICAgLyogc3VidmVyc2lvbiAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlJFUE9SVFwiXSA9IDIwXSA9IFwiUkVQT1JUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTUtBQ1RJVklUWVwiXSA9IDIxXSA9IFwiTUtBQ1RJVklUWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkNIRUNLT1VUXCJdID0gMjJdID0gXCJDSEVDS09VVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1FUkdFXCJdID0gMjNdID0gXCJNRVJHRVwiO1xuICAgIC8qIHVwbnAgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNLVNFQVJDSFwiXSA9IDI0XSA9IFwiTS1TRUFSQ0hcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJOT1RJRllcIl0gPSAyNV0gPSBcIk5PVElGWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlNVQlNDUklCRVwiXSA9IDI2XSA9IFwiU1VCU0NSSUJFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5TVUJTQ1JJQkVcIl0gPSAyN10gPSBcIlVOU1VCU0NSSUJFXCI7XG4gICAgLyogUkZDLTU3ODkgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQQVRDSFwiXSA9IDI4XSA9IFwiUEFUQ0hcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQVVJHRVwiXSA9IDI5XSA9IFwiUFVSR0VcIjtcbiAgICAvKiBDYWxEQVYgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNS0NBTEVOREFSXCJdID0gMzBdID0gXCJNS0NBTEVOREFSXCI7XG4gICAgLyogUkZDLTIwNjgsIHNlY3Rpb24gMTkuNi4xLjIgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJMSU5LXCJdID0gMzFdID0gXCJMSU5LXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5MSU5LXCJdID0gMzJdID0gXCJVTkxJTktcIjtcbiAgICAvKiBpY2VjYXN0ICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiU09VUkNFXCJdID0gMzNdID0gXCJTT1VSQ0VcIjtcbiAgICAvKiBSRkMtNzU0MCwgc2VjdGlvbiAxMS42ICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUFJJXCJdID0gMzRdID0gXCJQUklcIjtcbiAgICAvKiBSRkMtMjMyNiBSVFNQICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiREVTQ1JJQkVcIl0gPSAzNV0gPSBcIkRFU0NSSUJFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiQU5OT1VOQ0VcIl0gPSAzNl0gPSBcIkFOTk9VTkNFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiU0VUVVBcIl0gPSAzN10gPSBcIlNFVFVQXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUExBWVwiXSA9IDM4XSA9IFwiUExBWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBBVVNFXCJdID0gMzldID0gXCJQQVVTRVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlRFQVJET1dOXCJdID0gNDBdID0gXCJURUFSRE9XTlwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkdFVF9QQVJBTUVURVJcIl0gPSA0MV0gPSBcIkdFVF9QQVJBTUVURVJcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJTRVRfUEFSQU1FVEVSXCJdID0gNDJdID0gXCJTRVRfUEFSQU1FVEVSXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVESVJFQ1RcIl0gPSA0M10gPSBcIlJFRElSRUNUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVDT1JEXCJdID0gNDRdID0gXCJSRUNPUkRcIjtcbiAgICAvKiBSQU9QICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiRkxVU0hcIl0gPSA0NV0gPSBcIkZMVVNIXCI7XG59KShNRVRIT0RTID0gZXhwb3J0cy5NRVRIT0RTIHx8IChleHBvcnRzLk1FVEhPRFMgPSB7fSkpO1xuZXhwb3J0cy5NRVRIT0RTX0hUVFAgPSBbXG4gICAgTUVUSE9EUy5ERUxFVEUsXG4gICAgTUVUSE9EUy5HRVQsXG4gICAgTUVUSE9EUy5IRUFELFxuICAgIE1FVEhPRFMuUE9TVCxcbiAgICBNRVRIT0RTLlBVVCxcbiAgICBNRVRIT0RTLkNPTk5FQ1QsXG4gICAgTUVUSE9EUy5PUFRJT05TLFxuICAgIE1FVEhPRFMuVFJBQ0UsXG4gICAgTUVUSE9EUy5DT1BZLFxuICAgIE1FVEhPRFMuTE9DSyxcbiAgICBNRVRIT0RTLk1LQ09MLFxuICAgIE1FVEhPRFMuTU9WRSxcbiAgICBNRVRIT0RTLlBST1BGSU5ELFxuICAgIE1FVEhPRFMuUFJPUFBBVENILFxuICAgIE1FVEhPRFMuU0VBUkNILFxuICAgIE1FVEhPRFMuVU5MT0NLLFxuICAgIE1FVEhPRFMuQklORCxcbiAgICBNRVRIT0RTLlJFQklORCxcbiAgICBNRVRIT0RTLlVOQklORCxcbiAgICBNRVRIT0RTLkFDTCxcbiAgICBNRVRIT0RTLlJFUE9SVCxcbiAgICBNRVRIT0RTLk1LQUNUSVZJVFksXG4gICAgTUVUSE9EUy5DSEVDS09VVCxcbiAgICBNRVRIT0RTLk1FUkdFLFxuICAgIE1FVEhPRFNbJ00tU0VBUkNIJ10sXG4gICAgTUVUSE9EUy5OT1RJRlksXG4gICAgTUVUSE9EUy5TVUJTQ1JJQkUsXG4gICAgTUVUSE9EUy5VTlNVQlNDUklCRSxcbiAgICBNRVRIT0RTLlBBVENILFxuICAgIE1FVEhPRFMuUFVSR0UsXG4gICAgTUVUSE9EUy5NS0NBTEVOREFSLFxuICAgIE1FVEhPRFMuTElOSyxcbiAgICBNRVRIT0RTLlVOTElOSyxcbiAgICBNRVRIT0RTLlBSSSxcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBzaG91bGQgd2UgYWxsb3cgaXQgd2l0aCBIVFRQP1xuICAgIE1FVEhPRFMuU09VUkNFLFxuXTtcbmV4cG9ydHMuTUVUSE9EU19JQ0UgPSBbXG4gICAgTUVUSE9EUy5TT1VSQ0UsXG5dO1xuZXhwb3J0cy5NRVRIT0RTX1JUU1AgPSBbXG4gICAgTUVUSE9EUy5PUFRJT05TLFxuICAgIE1FVEhPRFMuREVTQ1JJQkUsXG4gICAgTUVUSE9EUy5BTk5PVU5DRSxcbiAgICBNRVRIT0RTLlNFVFVQLFxuICAgIE1FVEhPRFMuUExBWSxcbiAgICBNRVRIT0RTLlBBVVNFLFxuICAgIE1FVEhPRFMuVEVBUkRPV04sXG4gICAgTUVUSE9EUy5HRVRfUEFSQU1FVEVSLFxuICAgIE1FVEhPRFMuU0VUX1BBUkFNRVRFUixcbiAgICBNRVRIT0RTLlJFRElSRUNULFxuICAgIE1FVEhPRFMuUkVDT1JELFxuICAgIE1FVEhPRFMuRkxVU0gsXG4gICAgLy8gRm9yIEFpclBsYXlcbiAgICBNRVRIT0RTLkdFVCxcbiAgICBNRVRIT0RTLlBPU1QsXG5dO1xuZXhwb3J0cy5NRVRIT0RfTUFQID0gdXRpbHNfMS5lbnVtVG9NYXAoTUVUSE9EUyk7XG5leHBvcnRzLkhfTUVUSE9EX01BUCA9IHt9O1xuT2JqZWN0LmtleXMoZXhwb3J0cy5NRVRIT0RfTUFQKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoL15ILy50ZXN0KGtleSkpIHtcbiAgICAgICAgZXhwb3J0cy5IX01FVEhPRF9NQVBba2V5XSA9IGV4cG9ydHMuTUVUSE9EX01BUFtrZXldO1xuICAgIH1cbn0pO1xudmFyIEZJTklTSDtcbihmdW5jdGlvbiAoRklOSVNIKSB7XG4gICAgRklOSVNIW0ZJTklTSFtcIlNBRkVcIl0gPSAwXSA9IFwiU0FGRVwiO1xuICAgIEZJTklTSFtGSU5JU0hbXCJTQUZFX1dJVEhfQ0JcIl0gPSAxXSA9IFwiU0FGRV9XSVRIX0NCXCI7XG4gICAgRklOSVNIW0ZJTklTSFtcIlVOU0FGRVwiXSA9IDJdID0gXCJVTlNBRkVcIjtcbn0pKEZJTklTSCA9IGV4cG9ydHMuRklOSVNIIHx8IChleHBvcnRzLkZJTklTSCA9IHt9KSk7XG5leHBvcnRzLkFMUEhBID0gW107XG5mb3IgKGxldCBpID0gJ0EnLmNoYXJDb2RlQXQoMCk7IGkgPD0gJ1onLmNoYXJDb2RlQXQoMCk7IGkrKykge1xuICAgIC8vIFVwcGVyIGNhc2VcbiAgICBleHBvcnRzLkFMUEhBLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShpKSk7XG4gICAgLy8gTG93ZXIgY2FzZVxuICAgIGV4cG9ydHMuQUxQSEEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGkgKyAweDIwKSk7XG59XG5leHBvcnRzLk5VTV9NQVAgPSB7XG4gICAgMDogMCwgMTogMSwgMjogMiwgMzogMywgNDogNCxcbiAgICA1OiA1LCA2OiA2LCA3OiA3LCA4OiA4LCA5OiA5LFxufTtcbmV4cG9ydHMuSEVYX01BUCA9IHtcbiAgICAwOiAwLCAxOiAxLCAyOiAyLCAzOiAzLCA0OiA0LFxuICAgIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDgsIDk6IDksXG4gICAgQTogMFhBLCBCOiAwWEIsIEM6IDBYQywgRDogMFhELCBFOiAwWEUsIEY6IDBYRixcbiAgICBhOiAweGEsIGI6IDB4YiwgYzogMHhjLCBkOiAweGQsIGU6IDB4ZSwgZjogMHhmLFxufTtcbmV4cG9ydHMuTlVNID0gW1xuICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5Jyxcbl07XG5leHBvcnRzLkFMUEhBTlVNID0gZXhwb3J0cy5BTFBIQS5jb25jYXQoZXhwb3J0cy5OVU0pO1xuZXhwb3J0cy5NQVJLID0gWyctJywgJ18nLCAnLicsICchJywgJ34nLCAnKicsICdcXCcnLCAnKCcsICcpJ107XG5leHBvcnRzLlVTRVJJTkZPX0NIQVJTID0gZXhwb3J0cy5BTFBIQU5VTVxuICAgIC5jb25jYXQoZXhwb3J0cy5NQVJLKVxuICAgIC5jb25jYXQoWyclJywgJzsnLCAnOicsICcmJywgJz0nLCAnKycsICckJywgJywnXSk7XG4vLyBUT0RPKGluZHV0bnkpOiB1c2UgUkZDXG5leHBvcnRzLlNUUklDVF9VUkxfQ0hBUiA9IFtcbiAgICAnIScsICdcIicsICckJywgJyUnLCAnJicsICdcXCcnLFxuICAgICcoJywgJyknLCAnKicsICcrJywgJywnLCAnLScsICcuJywgJy8nLFxuICAgICc6JywgJzsnLCAnPCcsICc9JywgJz4nLFxuICAgICdAJywgJ1snLCAnXFxcXCcsICddJywgJ14nLCAnXycsXG4gICAgJ2AnLFxuICAgICd7JywgJ3wnLCAnfScsICd+Jyxcbl0uY29uY2F0KGV4cG9ydHMuQUxQSEFOVU0pO1xuZXhwb3J0cy5VUkxfQ0hBUiA9IGV4cG9ydHMuU1RSSUNUX1VSTF9DSEFSXG4gICAgLmNvbmNhdChbJ1xcdCcsICdcXGYnXSk7XG4vLyBBbGwgY2hhcmFjdGVycyB3aXRoIDB4ODAgYml0IHNldCB0byAxXG5mb3IgKGxldCBpID0gMHg4MDsgaSA8PSAweGZmOyBpKyspIHtcbiAgICBleHBvcnRzLlVSTF9DSEFSLnB1c2goaSk7XG59XG5leHBvcnRzLkhFWCA9IGV4cG9ydHMuTlVNLmNvbmNhdChbJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJ10pO1xuLyogVG9rZW5zIGFzIGRlZmluZWQgYnkgcmZjIDI2MTYuIEFsc28gbG93ZXJjYXNlcyB0aGVtLlxuICogICAgICAgIHRva2VuICAgICAgID0gMSo8YW55IENIQVIgZXhjZXB0IENUTHMgb3Igc2VwYXJhdG9ycz5cbiAqICAgICBzZXBhcmF0b3JzICAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAqICAgICAgICAgICAgICAgICAgICB8IFwiLFwiIHwgXCI7XCIgfCBcIjpcIiB8IFwiXFxcIiB8IDxcIj5cbiAqICAgICAgICAgICAgICAgICAgICB8IFwiL1wiIHwgXCJbXCIgfCBcIl1cIiB8IFwiP1wiIHwgXCI9XCJcbiAqICAgICAgICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKi9cbmV4cG9ydHMuU1RSSUNUX1RPS0VOID0gW1xuICAgICchJywgJyMnLCAnJCcsICclJywgJyYnLCAnXFwnJyxcbiAgICAnKicsICcrJywgJy0nLCAnLicsXG4gICAgJ14nLCAnXycsICdgJyxcbiAgICAnfCcsICd+Jyxcbl0uY29uY2F0KGV4cG9ydHMuQUxQSEFOVU0pO1xuZXhwb3J0cy5UT0tFTiA9IGV4cG9ydHMuU1RSSUNUX1RPS0VOLmNvbmNhdChbJyAnXSk7XG4vKlxuICogVmVyaWZ5IHRoYXQgYSBjaGFyIGlzIGEgdmFsaWQgdmlzaWJsZSAocHJpbnRhYmxlKSBVUy1BU0NJSVxuICogY2hhcmFjdGVyIG9yICV4ODAtRkZcbiAqL1xuZXhwb3J0cy5IRUFERVJfQ0hBUlMgPSBbJ1xcdCddO1xuZm9yIChsZXQgaSA9IDMyOyBpIDw9IDI1NTsgaSsrKSB7XG4gICAgaWYgKGkgIT09IDEyNykge1xuICAgICAgICBleHBvcnRzLkhFQURFUl9DSEFSUy5wdXNoKGkpO1xuICAgIH1cbn1cbi8vICcsJyA9IFxceDQ0XG5leHBvcnRzLkNPTk5FQ1RJT05fVE9LRU5fQ0hBUlMgPSBleHBvcnRzLkhFQURFUl9DSEFSUy5maWx0ZXIoKGMpID0+IGMgIT09IDQ0KTtcbmV4cG9ydHMuTUFKT1IgPSBleHBvcnRzLk5VTV9NQVA7XG5leHBvcnRzLk1JTk9SID0gZXhwb3J0cy5NQUpPUjtcbnZhciBIRUFERVJfU1RBVEU7XG4oZnVuY3Rpb24gKEhFQURFUl9TVEFURSkge1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJHRU5FUkFMXCJdID0gMF0gPSBcIkdFTkVSQUxcIjtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiQ09OTkVDVElPTlwiXSA9IDFdID0gXCJDT05ORUNUSU9OXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkNPTlRFTlRfTEVOR1RIXCJdID0gMl0gPSBcIkNPTlRFTlRfTEVOR1RIXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlRSQU5TRkVSX0VOQ09ESU5HXCJdID0gM10gPSBcIlRSQU5TRkVSX0VOQ09ESU5HXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlVQR1JBREVcIl0gPSA0XSA9IFwiVVBHUkFERVwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJDT05ORUNUSU9OX0tFRVBfQUxJVkVcIl0gPSA1XSA9IFwiQ09OTkVDVElPTl9LRUVQX0FMSVZFXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkNPTk5FQ1RJT05fQ0xPU0VcIl0gPSA2XSA9IFwiQ09OTkVDVElPTl9DTE9TRVwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJDT05ORUNUSU9OX1VQR1JBREVcIl0gPSA3XSA9IFwiQ09OTkVDVElPTl9VUEdSQURFXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlRSQU5TRkVSX0VOQ09ESU5HX0NIVU5LRURcIl0gPSA4XSA9IFwiVFJBTlNGRVJfRU5DT0RJTkdfQ0hVTktFRFwiO1xufSkoSEVBREVSX1NUQVRFID0gZXhwb3J0cy5IRUFERVJfU1RBVEUgfHwgKGV4cG9ydHMuSEVBREVSX1NUQVRFID0ge30pKTtcbmV4cG9ydHMuU1BFQ0lBTF9IRUFERVJTID0ge1xuICAgICdjb25uZWN0aW9uJzogSEVBREVSX1NUQVRFLkNPTk5FQ1RJT04sXG4gICAgJ2NvbnRlbnQtbGVuZ3RoJzogSEVBREVSX1NUQVRFLkNPTlRFTlRfTEVOR1RILFxuICAgICdwcm94eS1jb25uZWN0aW9uJzogSEVBREVSX1NUQVRFLkNPTk5FQ1RJT04sXG4gICAgJ3RyYW5zZmVyLWVuY29kaW5nJzogSEVBREVSX1NUQVRFLlRSQU5TRkVSX0VOQ09ESU5HLFxuICAgICd1cGdyYWRlJzogSEVBREVSX1NUQVRFLlVQR1JBREUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBrQm9keVVzZWQgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgRUUgPSByZXF1aXJlKCdldmVudHMnKVxuXG5jb25zdCByZWRpcmVjdGFibGVTdGF0dXNDb2RlcyA9IFszMDAsIDMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XVxuXG5jb25zdCBrQm9keSA9IFN5bWJvbCgnYm9keScpXG5cbmNsYXNzIEJvZHlBc3luY0l0ZXJhYmxlIHtcbiAgY29uc3RydWN0b3IgKGJvZHkpIHtcbiAgICB0aGlzW2tCb2R5XSA9IGJvZHlcbiAgICB0aGlzW2tCb2R5VXNlZF0gPSBmYWxzZVxuICB9XG5cbiAgYXN5bmMgKiBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBhc3NlcnQoIXRoaXNba0JvZHlVc2VkXSwgJ2Rpc3R1cmJlZCcpXG4gICAgdGhpc1trQm9keVVzZWRdID0gdHJ1ZVxuICAgIHlpZWxkICogdGhpc1trQm9keV1cbiAgfVxufVxuXG5jbGFzcyBSZWRpcmVjdEhhbmRsZXIge1xuICBjb25zdHJ1Y3RvciAoZGlzcGF0Y2gsIG1heFJlZGlyZWN0aW9ucywgb3B0cywgaGFuZGxlcikge1xuICAgIGlmIChtYXhSZWRpcmVjdGlvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVkaXJlY3Rpb25zKSB8fCBtYXhSZWRpcmVjdGlvbnMgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhSZWRpcmVjdGlvbnMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gICAgfVxuXG4gICAgdXRpbC52YWxpZGF0ZUhhbmRsZXIoaGFuZGxlciwgb3B0cy5tZXRob2QsIG9wdHMudXBncmFkZSlcblxuICAgIHRoaXMuZGlzcGF0Y2ggPSBkaXNwYXRjaFxuICAgIHRoaXMubG9jYXRpb24gPSBudWxsXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLm9wdHMgPSB7IC4uLm9wdHMsIG1heFJlZGlyZWN0aW9uczogMCB9IC8vIG9wdHMgbXVzdCBiZSBhIGNvcHlcbiAgICB0aGlzLm1heFJlZGlyZWN0aW9ucyA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgICB0aGlzLmhpc3RvcnkgPSBbXVxuXG4gICAgaWYgKHV0aWwuaXNTdHJlYW0odGhpcy5vcHRzLmJvZHkpKSB7XG4gICAgICAvLyBUT0RPIChmaXgpOiBQcm92aWRlIHNvbWUgd2F5IGZvciB0aGUgdXNlciB0byBjYWNoZSB0aGUgZmlsZSB0byBlLmcuIC90bXBcbiAgICAgIC8vIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BhdGNoZWQgYWdhaW4/XG4gICAgICAvLyBUT0RPIChmaXgpOiBEbyB3ZSBuZWVkIDEwMC1leHBlY3Qgc3VwcG9ydCB0byBwcm92aWRlIGEgd2F5IHRvIGRvIHRoaXMgcHJvcGVybHk/XG4gICAgICBpZiAodXRpbC5ib2R5TGVuZ3RoKHRoaXMub3B0cy5ib2R5KSA9PT0gMCkge1xuICAgICAgICB0aGlzLm9wdHMuYm9keVxuICAgICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSlcbiAgICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5ib2R5LnJlYWRhYmxlRGlkUmVhZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRoaXMub3B0cy5ib2R5W2tCb2R5VXNlZF0gPSBmYWxzZVxuICAgICAgICBFRS5wcm90b3R5cGUub24uY2FsbCh0aGlzLm9wdHMuYm9keSwgJ2RhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpc1trQm9keVVzZWRdID0gdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmJvZHkgJiYgdHlwZW9mIHRoaXMub3B0cy5ib2R5LnBpcGVUbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETyAoZml4KTogV2UgY2FuJ3QgYWNjZXNzIFJlYWRhYmxlU3RyZWFtIGludGVybmFsIHN0YXRlXG4gICAgICAvLyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgaXQgaGFzIGJlZW4gZGlzdHVyYmVkLiBUaGlzIGlzIGp1c3RcbiAgICAgIC8vIGEgd29ya2Fyb3VuZC5cbiAgICAgIHRoaXMub3B0cy5ib2R5ID0gbmV3IEJvZHlBc3luY0l0ZXJhYmxlKHRoaXMub3B0cy5ib2R5KVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLm9wdHMuYm9keSAmJlxuICAgICAgdHlwZW9mIHRoaXMub3B0cy5ib2R5ICE9PSAnc3RyaW5nJyAmJlxuICAgICAgIUFycmF5QnVmZmVyLmlzVmlldyh0aGlzLm9wdHMuYm9keSkgJiZcbiAgICAgIHV0aWwuaXNJdGVyYWJsZSh0aGlzLm9wdHMuYm9keSlcbiAgICApIHtcbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBhbGxvdyByZS11c2luZyBpdGVyYWJsZSBpZiAhdGhpcy5vcHRzLmlkZW1wb3RlbnRcbiAgICAgIC8vIG9yIHRocm91Z2ggc29tZSBvdGhlciBmbGFnP1xuICAgICAgdGhpcy5vcHRzLmJvZHkgPSBuZXcgQm9keUFzeW5jSXRlcmFibGUodGhpcy5vcHRzLmJvZHkpXG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCkge1xuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuaGFuZGxlci5vbkNvbm5lY3QoYWJvcnQsIHsgaGlzdG9yeTogdGhpcy5oaXN0b3J5IH0pXG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHNvY2tldCkge1xuICAgIHRoaXMuaGFuZGxlci5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICB9XG5cbiAgb25FcnJvciAoZXJyb3IpIHtcbiAgICB0aGlzLmhhbmRsZXIub25FcnJvcihlcnJvcilcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgaGVhZGVycywgcmVzdW1lLCBzdGF0dXNUZXh0KSB7XG4gICAgdGhpcy5sb2NhdGlvbiA9IHRoaXMuaGlzdG9yeS5sZW5ndGggPj0gdGhpcy5tYXhSZWRpcmVjdGlvbnMgfHwgdXRpbC5pc0Rpc3R1cmJlZCh0aGlzLm9wdHMuYm9keSlcbiAgICAgID8gbnVsbFxuICAgICAgOiBwYXJzZUxvY2F0aW9uKHN0YXR1c0NvZGUsIGhlYWRlcnMpXG5cbiAgICBpZiAodGhpcy5vcHRzLm9yaWdpbikge1xuICAgICAgdGhpcy5oaXN0b3J5LnB1c2gobmV3IFVSTCh0aGlzLm9wdHMucGF0aCwgdGhpcy5vcHRzLm9yaWdpbikpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uSGVhZGVycyhzdGF0dXNDb2RlLCBoZWFkZXJzLCByZXN1bWUsIHN0YXR1c1RleHQpXG4gICAgfVxuXG4gICAgY29uc3QgeyBvcmlnaW4sIHBhdGhuYW1lLCBzZWFyY2ggfSA9IHV0aWwucGFyc2VVUkwobmV3IFVSTCh0aGlzLmxvY2F0aW9uLCB0aGlzLm9wdHMub3JpZ2luICYmIG5ldyBVUkwodGhpcy5vcHRzLnBhdGgsIHRoaXMub3B0cy5vcmlnaW4pKSlcbiAgICBjb25zdCBwYXRoID0gc2VhcmNoID8gYCR7cGF0aG5hbWV9JHtzZWFyY2h9YCA6IHBhdGhuYW1lXG5cbiAgICAvLyBSZW1vdmUgaGVhZGVycyByZWZlcnJpbmcgdG8gdGhlIG9yaWdpbmFsIFVSTC5cbiAgICAvLyBCeSBkZWZhdWx0IGl0IGlzIEhvc3Qgb25seSwgdW5sZXNzIGl0J3MgYSAzMDMgKHNlZSBiZWxvdyksIHdoaWNoIHJlbW92ZXMgYWxzbyBhbGwgQ29udGVudC0qIGhlYWRlcnMuXG4gICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjRcbiAgICB0aGlzLm9wdHMuaGVhZGVycyA9IGNsZWFuUmVxdWVzdEhlYWRlcnModGhpcy5vcHRzLmhlYWRlcnMsIHN0YXR1c0NvZGUgPT09IDMwMywgdGhpcy5vcHRzLm9yaWdpbiAhPT0gb3JpZ2luKVxuICAgIHRoaXMub3B0cy5wYXRoID0gcGF0aFxuICAgIHRoaXMub3B0cy5vcmlnaW4gPSBvcmlnaW5cbiAgICB0aGlzLm9wdHMubWF4UmVkaXJlY3Rpb25zID0gMFxuICAgIHRoaXMub3B0cy5xdWVyeSA9IG51bGxcblxuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjRcbiAgICAvLyBJbiBjYXNlIG9mIEhUVFAgMzAzLCBhbHdheXMgcmVwbGFjZSBtZXRob2QgdG8gYmUgZWl0aGVyIEhFQUQgb3IgR0VUXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDMwMyAmJiB0aGlzLm9wdHMubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAgIHRoaXMub3B0cy5tZXRob2QgPSAnR0VUJ1xuICAgICAgdGhpcy5vcHRzLmJvZHkgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAvKlxuICAgICAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNFxuXG4gICAgICAgIFRMRFI6IHVuZGljaSBhbHdheXMgaWdub3JlcyAzeHggcmVzcG9uc2UgYm9kaWVzLlxuXG4gICAgICAgIFJlZGlyZWN0aW9uIGlzIHVzZWQgdG8gc2VydmUgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBmcm9tIGFub3RoZXIgVVJMLCBzbyBpdCBpcyBhc3N1bWVzIHRoYXRcbiAgICAgICAgbm8gYm9keSBpcyBnZW5lcmF0ZWQgKGFuZCB0aHVzIGNhbiBiZSBpZ25vcmVkKS4gRXZlbiB0aG91Z2ggZ2VuZXJhdGluZyBhIGJvZHkgaXMgbm90IHByb2hpYml0ZWQuXG5cbiAgICAgICAgRm9yIHN0YXR1cyAzMDEsIDMwMiwgMzAzLCAzMDcgYW5kIDMwOCAodGhlIGxhdHRlciBmcm9tIFJGQyA3MjM4KSwgdGhlIHNwZWNzIG1lbnRpb24gdGhhdCB0aGUgYm9keSB1c3VhbGx5XG4gICAgICAgICh3aGljaCBtZWFucyBpdCdzIG9wdGlvbmFsIGFuZCBub3QgbWFuZGF0ZWQpIGNvbnRhaW4ganVzdCBhbiBoeXBlcmxpbmsgdG8gdGhlIHZhbHVlIG9mXG4gICAgICAgIHRoZSBMb2NhdGlvbiByZXNwb25zZSBoZWFkZXIsIHNvIHRoZSBib2R5IGNhbiBiZSBpZ25vcmVkIHNhZmVseS5cblxuICAgICAgICBGb3Igc3RhdHVzIDMwMCwgd2hpY2ggaXMgXCJNdWx0aXBsZSBDaG9pY2VzXCIsIHRoZSBzcGVjIG1lbnRpb25zIGJvdGggZ2VuZXJhdGluZyBhIExvY2F0aW9uXG4gICAgICAgIHJlc3BvbnNlIGhlYWRlciBBTkQgYSByZXNwb25zZSBib2R5IHdpdGggdGhlIG90aGVyIHBvc3NpYmxlIGxvY2F0aW9uIHRvIGZvbGxvdy5cbiAgICAgICAgU2luY2UgdGhlIHNwZWMgZXhwbGljaXRpbHkgY2hvb3NlcyBub3QgdG8gc3BlY2lmeSBhIGZvcm1hdCBmb3Igc3VjaCBib2R5IGFuZCBsZWF2ZSBpdCB0b1xuICAgICAgICBzZXJ2ZXJzIGFuZCBicm93c2VycyBpbXBsZW1lbnRvcnMsIHdlIGlnbm9yZSB0aGUgYm9keSBhcyB0aGVyZSBpcyBubyBzcGVjaWZpZWQgd2F5IHRvIGV2ZW50dWFsbHkgcGFyc2UgaXQuXG4gICAgICAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRGF0YShjaHVuaylcbiAgICB9XG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAvKlxuICAgICAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNFxuXG4gICAgICAgIFRMRFI6IHVuZGljaSBhbHdheXMgaWdub3JlcyAzeHggcmVzcG9uc2UgdHJhaWxlcnMgYXMgdGhleSBhcmUgbm90IGV4cGVjdGVkIGluIGNhc2Ugb2YgcmVkaXJlY3Rpb25zXG4gICAgICAgIGFuZCBuZWl0aGVyIGFyZSB1c2VmdWwgaWYgcHJlc2VudC5cblxuICAgICAgICBTZWUgY29tbWVudCBvbiBvbkRhdGEgbWV0aG9kIGFib3ZlIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9ucy5cbiAgICAgICovXG5cbiAgICAgIHRoaXMubG9jYXRpb24gPSBudWxsXG4gICAgICB0aGlzLmFib3J0ID0gbnVsbFxuXG4gICAgICB0aGlzLmRpc3BhdGNoKHRoaXMub3B0cywgdGhpcylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVyLm9uQ29tcGxldGUodHJhaWxlcnMpXG4gICAgfVxuICB9XG5cbiAgb25Cb2R5U2VudCAoY2h1bmspIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyLm9uQm9keVNlbnQpIHtcbiAgICAgIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KGNodW5rKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2F0aW9uIChzdGF0dXNDb2RlLCBoZWFkZXJzKSB7XG4gIGlmIChyZWRpcmVjdGFibGVTdGF0dXNDb2Rlcy5pbmRleE9mKHN0YXR1c0NvZGUpID09PSAtMSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBpZiAoaGVhZGVyc1tpXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdsb2NhdGlvbicpIHtcbiAgICAgIHJldHVybiBoZWFkZXJzW2kgKyAxXVxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNC40XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVIZWFkZXIgKGhlYWRlciwgcmVtb3ZlQ29udGVudCwgdW5rbm93bk9yaWdpbikge1xuICBpZiAoaGVhZGVyLmxlbmd0aCA9PT0gNCkge1xuICAgIHJldHVybiB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpID09PSAnaG9zdCdcbiAgfVxuICBpZiAocmVtb3ZlQ29udGVudCAmJiB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpLnN0YXJ0c1dpdGgoJ2NvbnRlbnQtJykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmICh1bmtub3duT3JpZ2luICYmIChoZWFkZXIubGVuZ3RoID09PSAxMyB8fCBoZWFkZXIubGVuZ3RoID09PSA2IHx8IGhlYWRlci5sZW5ndGggPT09IDE5KSkge1xuICAgIGNvbnN0IG5hbWUgPSB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpXG4gICAgcmV0dXJuIG5hbWUgPT09ICdhdXRob3JpemF0aW9uJyB8fCBuYW1lID09PSAnY29va2llJyB8fCBuYW1lID09PSAncHJveHktYXV0aG9yaXphdGlvbidcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjRcbmZ1bmN0aW9uIGNsZWFuUmVxdWVzdEhlYWRlcnMgKGhlYWRlcnMsIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pIHtcbiAgY29uc3QgcmV0ID0gW11cbiAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGlmICghc2hvdWxkUmVtb3ZlSGVhZGVyKGhlYWRlcnNbaV0sIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pKSB7XG4gICAgICAgIHJldC5wdXNoKGhlYWRlcnNbaV0sIGhlYWRlcnNbaSArIDFdKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGhlYWRlcnMpKSB7XG4gICAgICBpZiAoIXNob3VsZFJlbW92ZUhlYWRlcihrZXksIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pKSB7XG4gICAgICAgIHJldC5wdXNoKGtleSwgaGVhZGVyc1trZXldKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoaGVhZGVycyA9PSBudWxsLCAnaGVhZGVycyBtdXN0IGJlIGFuIG9iamVjdCBvciBhbiBhcnJheScpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlZGlyZWN0SGFuZGxlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmVkaXJlY3RIYW5kbGVyID0gcmVxdWlyZSgnLi4vaGFuZGxlci9SZWRpcmVjdEhhbmRsZXInKVxuXG5mdW5jdGlvbiBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yICh7IG1heFJlZGlyZWN0aW9uczogZGVmYXVsdE1heFJlZGlyZWN0aW9ucyB9KSB7XG4gIHJldHVybiAoZGlzcGF0Y2gpID0+IHtcbiAgICByZXR1cm4gZnVuY3Rpb24gSW50ZXJjZXB0IChvcHRzLCBoYW5kbGVyKSB7XG4gICAgICBjb25zdCB7IG1heFJlZGlyZWN0aW9ucyA9IGRlZmF1bHRNYXhSZWRpcmVjdGlvbnMgfSA9IG9wdHNcblxuICAgICAgaWYgKCFtYXhSZWRpcmVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoKG9wdHMsIGhhbmRsZXIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlZGlyZWN0SGFuZGxlciA9IG5ldyBSZWRpcmVjdEhhbmRsZXIoZGlzcGF0Y2gsIG1heFJlZGlyZWN0aW9ucywgb3B0cywgaGFuZGxlcilcbiAgICAgIG9wdHMgPSB7IC4uLm9wdHMsIG1heFJlZGlyZWN0aW9uczogMCB9IC8vIFN0b3Agc3ViIGRpc3BhdGNoZXIgZnJvbSBhbHNvIHJlZGlyZWN0aW5nLlxuICAgICAgcmV0dXJuIGRpc3BhdGNoKG9wdHMsIHJlZGlyZWN0SGFuZGxlcilcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yXG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0gJ0FHRnpiUUVBQUFBQk1BaGdBWDhCZjJBRGYzOS9BWDlnQkg5L2YzOEJmMkFBQUdBRGYzOS9BR0FCZndCZ0FuOS9BR0FHZjM5L2YzOS9BQUxMQVFnRFpXNTJHSGRoYzIxZmIyNWZhR1ZoWkdWeWMxOWpiMjF3YkdWMFpRQUNBMlZ1ZGhWM1lYTnRYMjl1WDIxbGMzTmhaMlZmWW1WbmFXNEFBQU5sYm5ZTGQyRnpiVjl2Ymw5MWNtd0FBUU5sYm5ZT2QyRnpiVjl2Ymw5emRHRjBkWE1BQVFObGJuWVVkMkZ6YlY5dmJsOW9aV0ZrWlhKZlptbGxiR1FBQVFObGJuWVVkMkZ6YlY5dmJsOW9aV0ZrWlhKZmRtRnNkV1VBQVFObGJuWU1kMkZ6YlY5dmJsOWliMlI1QUFFRFpXNTJHSGRoYzIxZmIyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpRQUFBMFpGQXdNRUFBQUZBQUFBQUFBQUJRRUZBQVVGQlFBQUJnQUFBQUFHQmdZR0FRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFBQUJBUWNBQUFVRkF3QUJCQVVCY0FFU0VnVURBUUFDQmdnQmZ3RkJnTlFFQ3dmUkJTSUdiV1Z0YjNKNUFnQUxYMmx1YVhScFlXeHBlbVVBQ1JsZlgybHVaR2x5WldOMFgyWjFibU4wYVc5dVgzUmhZbXhsQVFBTGJHeG9kSFJ3WDJsdWFYUUFDaGhzYkdoMGRIQmZjMmh2ZFd4a1gydGxaWEJmWVd4cGRtVUFRUXhzYkdoMGRIQmZZV3hzYjJNQURBWnRZV3hzYjJNQVJndHNiR2gwZEhCZlpuSmxaUUFOQkdaeVpXVUFTQTlzYkdoMGRIQmZaMlYwWDNSNWNHVUFEaFZzYkdoMGRIQmZaMlYwWDJoMGRIQmZiV0ZxYjNJQUR4VnNiR2gwZEhCZloyVjBYMmgwZEhCZmJXbHViM0lBRUJGc2JHaDBkSEJmWjJWMFgyMWxkR2h2WkFBUkZteHNhSFIwY0Y5blpYUmZjM1JoZEhWelgyTnZaR1VBRWhKc2JHaDBkSEJmWjJWMFgzVndaM0poWkdVQUV3eHNiR2gwZEhCZmNtVnpaWFFBRkE1c2JHaDBkSEJmWlhobFkzVjBaUUFWRkd4c2FIUjBjRjl6WlhSMGFXNW5jMTlwYm1sMEFCWU5iR3hvZEhSd1gyWnBibWx6YUFBWERHeHNhSFIwY0Y5d1lYVnpaUUFZRFd4c2FIUjBjRjl5WlhOMWJXVUFHUnRzYkdoMGRIQmZjbVZ6ZFcxbFgyRm1kR1Z5WDNWd1ozSmhaR1VBR2hCc2JHaDBkSEJmWjJWMFgyVnljbTV2QUJzWGJHeG9kSFJ3WDJkbGRGOWxjbkp2Y2w5eVpXRnpiMjRBSEJkc2JHaDBkSEJmYzJWMFgyVnljbTl5WDNKbFlYTnZiZ0FkRkd4c2FIUjBjRjluWlhSZlpYSnliM0pmY0c5ekFCNFJiR3hvZEhSd1gyVnljbTV2WDI1aGJXVUFIeEpzYkdoMGRIQmZiV1YwYUc5a1gyNWhiV1VBSUJKc2JHaDBkSEJmYzNSaGRIVnpYMjVoYldVQUlScHNiR2gwZEhCZmMyVjBYMnhsYm1sbGJuUmZhR1ZoWkdWeWN3QWlJV3hzYUhSMGNGOXpaWFJmYkdWdWFXVnVkRjlqYUhWdWEyVmtYMnhsYm1kMGFBQWpIV3hzYUhSMGNGOXpaWFJmYkdWdWFXVnVkRjlyWldWd1gyRnNhWFpsQUNRa2JHeG9kSFJ3WDNObGRGOXNaVzVwWlc1MFgzUnlZVzV6Wm1WeVgyVnVZMjlrYVc1bkFDVVliR3hvZEhSd1gyMWxjM05oWjJWZmJtVmxaSE5mWlc5bUFEOEpGd0VBUVFFTEVRRUNBd1FGQ3dZSE5UazNNUzh0SnlzcENzTGdBa1VDQUFzSUFCQ0lnSUNBQUFzWkFDQUFFTUtBZ0lBQUdpQUFJQUkyQWpnZ0FDQUJPZ0FvQ3h3QUlBQWdBQzhCTWlBQUxRQXVJQUFRd1lDQWdBQVFnSUNBZ0FBTEtnRUJmMEhBQUJER2dJQ0FBQ0lCRU1LQWdJQUFHaUFCUVlDSWdJQUFOZ0k0SUFFZ0FEb0FLQ0FCQ3dvQUlBQVF5SUNBZ0FBTEJ3QWdBQzBBS0FzSEFDQUFMUUFxQ3djQUlBQXRBQ3NMQndBZ0FDMEFLUXNIQUNBQUx3RXlDd2NBSUFBdEFDNExSUUVFZnlBQUtBSVlJUUVnQUMwQUxTRUNJQUF0QUNnaEF5QUFLQUk0SVFRZ0FCRENnSUNBQUJvZ0FDQUVOZ0k0SUFBZ0F6b0FLQ0FBSUFJNkFDMGdBQ0FCTmdJWUN4RUFJQUFnQVNBQklBSnFFTU9BZ0lBQUN4QUFJQUJCQUVIY0FCRE1nSUNBQUJvTFp3RUJmMEVBSVFFQ1FDQUFLQUlNRFFBQ1FBSkFBa0FDUUNBQUxRQXZEZ01CQUFNQ0N5QUFLQUk0SWdGRkRRQWdBU2dDTENJQlJRMEFJQUFnQVJHQWdJQ0FBQUFpQVEwREMwRUFEd3NReW9DQWdBQUFDeUFBUWNPV2dJQUFOZ0lRUVE0aEFRc2dBUXNlQUFKQUlBQW9BZ3dOQUNBQVFkR2JnSUFBTmdJUUlBQkJGVFlDREFzTEZnQUNRQ0FBS0FJTVFSVkhEUUFnQUVFQU5nSU1Dd3NXQUFKQUlBQW9BZ3hCRmtjTkFDQUFRUUEyQWd3TEN3Y0FJQUFvQWd3TEJ3QWdBQ2dDRUFzSkFDQUFJQUUyQWhBTEJ3QWdBQ2dDRkFzaUFBSkFJQUJCSkVrTkFCREtnSUNBQUFBTElBQkJBblJCb0xPQWdBQnFLQUlBQ3lJQUFrQWdBRUV1U1EwQUVNcUFnSUFBQUFzZ0FFRUNkRUd3dElDQUFHb29BZ0FMN2dzQkFYOUI2NmlBZ0FBaEFRSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCbkg5cUR2UURZMklBQVdGaFlXRmhZUUlEQkFWaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhCZ2NJQ1FvTERBME9EMkZoWVdGaEVHRmhZV0ZoWVdGaFlXRmhFV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZUklURkJVV0Z4Z1pHaHRoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoSEIwZUh5QWhJaU1rSlNZbktDa3FLeXd0TGk4d01USXpORFUyWVRjNE9UcGhZV0ZoWVdGaFlUdGhZV0U4WVdGaFlUMCtQMkZoWVdGaFlXRmhRR0ZoUVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlVSkRSRVZHUjBoSlNrdE1UVTVQVUZGU1UyRmhZV0ZoWVdGaFZGVldWMWhaV2x0aFhGMWhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZlWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWDJCaEMwSGhwNENBQUE4TFFhU2hnSUFBRHd0Qnk2eUFnQUFQQzBIK3NZQ0FBQThMUWNDa2dJQUFEd3RCcTZTQWdBQVBDMEdOcUlDQUFBOExRZUttZ0lBQUR3dEJnTENBZ0FBUEMwRzVyNENBQUE4TFFkZWtnSUFBRHd0Qjc1K0FnQUFQQzBIaG40Q0FBQThMUWZxZmdJQUFEd3RCOHFDQWdBQVBDMEdvcjRDQUFBOExRYTZ5Z0lBQUR3dEJpTENBZ0FBUEMwSHNwNENBQUE4TFFZS2lnSUFBRHd0QmpwMkFnQUFQQzBIUXJvQ0FBQThMUWNxamdJQUFEd3RCeGJLQWdBQVBDMEhmbklDQUFBOExRZEtjZ0lBQUR3dEJ4S0NBZ0FBUEMwSFhvSUNBQUE4TFFhS2ZnSUFBRHd0QjdhNkFnQUFQQzBHcnNJQ0FBQThMUWRTbGdJQUFEd3RCeks2QWdBQVBDMEg2cm9DQUFBOExRZnlyZ0lBQUR3dEIwckNBZ0FBUEMwSHhuWUNBQUE4TFFidWdnSUFBRHd0Qjk2dUFnQUFQQzBHUXNZQ0FBQThMUWRleGdJQUFEd3RCb3EyQWdBQVBDMEhVcDRDQUFBOExRZUNyZ0lBQUR3dEJuNnlBZ0FBUEMwSHJzWUNBQUE4TFFkV2ZnSUFBRHd0QnlyR0FnQUFQQzBIZXBZQ0FBQThMUWRTZWdJQUFEd3RCOUp5QWdBQVBDMEduc29DQUFBOExRYkdkZ0lBQUR3dEJvSjJBZ0FBUEMwRzVzWUNBQUE4TFFieXdnSUFBRHd0QmtxR0FnQUFQQzBHenBvQ0FBQThMUWVtc2dJQUFEd3RCcko2QWdBQVBDMEhVcTRDQUFBOExRZmVtZ0lBQUR3dEJnS2FBZ0FBUEMwR3dvWUNBQUE4TFFmNmVnSUFBRHd0QmphT0FnQUFQQzBHSnJZQ0FBQThMUWZlaWdJQUFEd3RCb0xHQWdBQVBDMEd1bjRDQUFBOExRY2FsZ0lBQUR3dEI2SjZBZ0FBUEMwR1Rvb0NBQUE4TFFjS3ZnSUFBRHd0Qnc1MkFnQUFQQzBHTHJJQ0FBQThMUWVHZGdJQUFEd3RCamErQWdBQVBDMEhxb1lDQUFBOExRYlN0Z0lBQUR3dEIwcStBZ0FBUEMwSGZzb0NBQUE4TFFkS3lnSUFBRHd0QjhMQ0FnQUFQQzBHcG9vQ0FBQThMUWZtamdJQUFEd3RCbVo2QWdBQVBDMEcxcklDQUFBOExRWnV3Z0lBQUR3dEJrcktBZ0FBUEMwRzJxNENBQUE4TFFjS2lnSUFBRHd0QitMS0FnQUFQQzBHZXBZQ0FBQThMUWRDaWdJQUFEd3RCdXA2QWdBQVBDMEdCbm9DQUFBOExFTXFBZ0lBQUFBdEIxcUdBZ0FBaEFRc2dBUXNXQUNBQUlBQXRBQzFCL2dGeElBRkJBRWR5T2dBdEN4a0FJQUFnQUMwQUxVSDlBWEVnQVVFQVIwRUJkSEk2QUMwTEdRQWdBQ0FBTFFBdFFmc0JjU0FCUVFCSFFRSjBjam9BTFFzWkFDQUFJQUF0QUMxQjl3RnhJQUZCQUVkQkEzUnlPZ0F0Q3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BZ0FpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDQkNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRY2FSZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJd0lnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDMGtCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FnZ2lCRVVOQUNBQUlBRWdBaUFCYXlBRUVZR0FnSUFBQUNJRFFYOUhEUUFnQUVIMmlvQ0FBRFlDRUVFWUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NOQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0SkFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlNSWdSRkRRQWdBQ0FCSUFJZ0FXc2dCQkdCZ0lDQUFBQWlBMEYvUncwQUlBQkI3WnFBZ0FBMkFoQkJHQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWpnaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxTUUVDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ0VDSUVSUTBBSUFBZ0FTQUNJQUZySUFRUmdZQ0FnQUFBSWdOQmYwY05BQ0FBUVpXUWdJQUFOZ0lRUVJnaEF3c2dBd3N1QVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSThJZ1JGRFFBZ0FDQUVFWUNBZ0lBQUFDRURDeUFEQzBrQkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BaFFpQkVVTkFDQUFJQUVnQWlBQmF5QUVFWUdBZ0lBQUFDSURRWDlIRFFBZ0FFR3FtNENBQURZQ0VFRVlJUU1MSUFNTExnRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDUUNJRVJRMEFJQUFnQkJHQWdJQ0FBQUFoQXdzZ0F3dEpBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJWUlnUkZEUUFnQUNBQklBSWdBV3NnQkJHQmdJQ0FBQUFpQTBGL1J3MEFJQUJCN1pPQWdBQTJBaEJCR0NFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FrUWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NKQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlzSWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREMwa0JBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWlnaUJFVU5BQ0FBSUFFZ0FpQUJheUFFRVlHQWdJQUFBQ0lEUVg5SERRQWdBRUgyaUlDQUFEWUNFRUVZSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ1VDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RKQVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSWNJZ1JGRFFBZ0FDQUJJQUlnQVdzZ0JCR0JnSUNBQUFBaUEwRi9SdzBBSUFCQndwbUFnQUEyQWhCQkdDRURDeUFEQ3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9Ba2dpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDSUNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRWlNVZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FKTUlnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FsUWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NXQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0RkFRRi9Ba0FDUUNBQUx3RXdRUlJ4UVJSSERRQkJBU0VESUFBdEFDaEJBVVlOQVNBQUx3RXlRZVVBUmlFRERBRUxJQUF0QUNsQkJVWWhBd3NnQUNBRE9nQXVRUUFML2dFQkEzOUJBU0VEQWtBZ0FDOEJNQ0lFUVFoeERRQWdBQ2tESUVJQVVpRURDd0pBQWtBZ0FDMEFMa1VOQUVFQklRVWdBQzBBS1VFRlJnMEJRUUVoQlNBRVFjQUFjVVVnQTNGQkFVY05BUXRCQUNFRklBUkJ3QUJ4RFFCQkFpRUZJQVJCLy84RGNTSURRUWh4RFFBQ1FDQURRWUFFY1VVTkFBSkFJQUF0QUNoQkFVY05BQ0FBTFFBdFFRcHhEUUJCQlE4TFFRUVBDd0pBSUFOQklIRU5BQUpBSUFBdEFDaEJBVVlOQUNBQUx3RXlRZi8vQTNFaUFFR2NmMnBCNUFCSkRRQWdBRUhNQVVZTkFDQUFRYkFDUmcwQVFRUWhCU0FFUVNoeFJRMENJQU5CaUFSeFFZQUVSZzBDQzBFQUR3dEJBRUVESUFBcEF5QlFHeUVGQ3lBRkMySUJBbjlCQUNFQkFrQWdBQzBBS0VFQlJnMEFJQUF2QVRKQi8vOERjU0lDUVp4L2FrSGtBRWtOQUNBQ1Fjd0JSZzBBSUFKQnNBSkdEUUFnQUM4Qk1DSUFRY0FBY1EwQVFRRWhBU0FBUVlnRWNVR0FCRVlOQUNBQVFTaHhSU0VCQ3lBQkM2Y0JBUU4vQWtBQ1FBSkFJQUF0QUNwRkRRQWdBQzBBSzBVTkFFRUFJUU1nQUM4Qk1DSUVRUUp4UlEwQkRBSUxRUUFoQXlBQUx3RXdJZ1JCQVhGRkRRRUxRUUVoQXlBQUxRQW9RUUZHRFFBZ0FDOEJNa0gvL3dOeElnVkJuSDlxUWVRQVNRMEFJQVZCekFGR0RRQWdCVUd3QWtZTkFDQUVRY0FBY1EwQVFRQWhBeUFFUVlnRWNVR0FCRVlOQUNBRVFTaHhRUUJISVFNTElBQkJBRHNCTUNBQVFRQTZBQzhnQXd1WkFRRUNmd0pBQWtBQ1FDQUFMUUFxUlEwQUlBQXRBQ3RGRFFCQkFDRUJJQUF2QVRBaUFrRUNjVVVOQVF3Q0MwRUFJUUVnQUM4Qk1DSUNRUUZ4UlEwQkMwRUJJUUVnQUMwQUtFRUJSZzBBSUFBdkFUSkIvLzhEY1NJQVFaeC9ha0hrQUVrTkFDQUFRY3dCUmcwQUlBQkJzQUpHRFFBZ0FrSEFBSEVOQUVFQUlRRWdBa0dJQkhGQmdBUkdEUUFnQWtFb2NVRUFSeUVCQ3lBQkMxa0FJQUJCR0dwQ0FEY0RBQ0FBUWdBM0F3QWdBRUU0YWtJQU53TUFJQUJCTUdwQ0FEY0RBQ0FBUVNocVFnQTNBd0FnQUVFZ2FrSUFOd01BSUFCQkVHcENBRGNEQUNBQVFRaHFRZ0EzQXdBZ0FFSGRBVFlDSEVFQUMzc0JBWDhDUUNBQUtBSU1JZ01OQUFKQUlBQW9BZ1JGRFFBZ0FDQUJOZ0lFQ3dKQUlBQWdBU0FDRU1TQWdJQUFJZ01OQUNBQUtBSU1Ed3NnQUNBRE5nSWNRUUFoQXlBQUtBSUVJZ0ZGRFFBZ0FDQUJJQUlnQUNnQ0NCR0JnSUNBQUFBaUFVVU5BQ0FBSUFJMkFoUWdBQ0FCTmdJTUlBRWhBd3NnQXd2azh3RUREbjhEZmdSL0k0Q0FnSUFBUVJCcklnTWtnSUNBZ0FBZ0FTRUVJQUVoQlNBQklRWWdBU0VISUFFaENDQUJJUWtnQVNFS0lBRWhDeUFCSVF3Z0FTRU5JQUVoRGlBQklROENRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBQ2dDSENJUVFYOXFEdDBCMmdFQjJRRUNBd1FGQmdjSUNRb0xEQTBPMkFFUEVOY0JFUkxXQVJNVUZSWVhHQmthRytBQjN3RWNIUjdWQVI4Z0lTSWpKQ1hVQVNZbktDa3FLeXpUQWRJQkxTN1JBZEFCTHpBeE1qTTBOVFkzT0RrNk96dzlQajlBUVVKRFJFVkcyd0ZIU0VsS3p3SE9BVXZOQVV6TUFVMU9UMUJSVWxOVVZWWlhXRmxhVzF4ZFhsOWdZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYcDdmSDErZjRBQmdRR0NBWU1CaEFHRkFZWUJod0dJQVlrQmlnR0xBWXdCalFHT0FZOEJrQUdSQVpJQmt3R1VBWlVCbGdHWEFaZ0JtUUdhQVpzQm5BR2RBWjRCbndHZ0FhRUJvZ0dqQWFRQnBRR21BYWNCcUFHcEFhb0Jxd0dzQWEwQnJnR3ZBYkFCc1FHeUFiTUJ0QUcxQWJZQnR3SExBY29CdUFISkFia0J5QUc2QWJzQnZBRzlBYjRCdndIQUFjRUJ3Z0hEQWNRQnhRSEdBUURjQVF0QkFDRVFETVlCQzBFT0lSQU14UUVMUVEwaEVBekVBUXRCRHlFUURNTUJDMEVRSVJBTXdnRUxRUk1oRUF6QkFRdEJGQ0VRRE1BQkMwRVZJUkFNdndFTFFSWWhFQXkrQVF0QkZ5RVFETDBCQzBFWUlSQU12QUVMUVJraEVBeTdBUXRCR2lFUURMb0JDMEViSVJBTXVRRUxRUndoRUF5NEFRdEJDQ0VRRExjQkMwRWRJUkFNdGdFTFFTQWhFQXkxQVF0Qkh5RVFETFFCQzBFSElSQU1zd0VMUVNFaEVBeXlBUXRCSWlFUURMRUJDMEVlSVJBTXNBRUxRU01oRUF5dkFRdEJFaUVRREs0QkMwRVJJUkFNclFFTFFTUWhFQXlzQVF0QkpTRVFES3NCQzBFbUlSQU1xZ0VMUVNjaEVBeXBBUXRCd3dFaEVBeW9BUXRCS1NFUURLY0JDMEVySVJBTXBnRUxRU3doRUF5bEFRdEJMU0VRREtRQkMwRXVJUkFNb3dFTFFTOGhFQXlpQVF0QnhBRWhFQXloQVF0Qk1DRVFES0FCQzBFMElSQU1ud0VMUVF3aEVBeWVBUXRCTVNFUURKMEJDMEV5SVJBTW5BRUxRVE1oRUF5YkFRdEJPU0VRREpvQkMwRTFJUkFNbVFFTFFjVUJJUkFNbUFFTFFRc2hFQXlYQVF0Qk9pRVFESllCQzBFMklSQU1sUUVMUVFvaEVBeVVBUXRCTnlFUURKTUJDMEU0SVJBTWtnRUxRVHdoRUF5UkFRdEJPeUVRREpBQkMwRTlJUkFNandFTFFRa2hFQXlPQVF0QktDRVFESTBCQzBFK0lSQU1qQUVMUVQ4aEVBeUxBUXRCd0FBaEVBeUtBUXRCd1FBaEVBeUpBUXRCd2dBaEVBeUlBUXRCd3dBaEVBeUhBUXRCeEFBaEVBeUdBUXRCeFFBaEVBeUZBUXRCeGdBaEVBeUVBUXRCS2lFUURJTUJDMEhIQUNFUURJSUJDMEhJQUNFUURJRUJDMEhKQUNFUURJQUJDMEhLQUNFUURIOExRY3NBSVJBTWZndEJ6UUFoRUF4OUMwSE1BQ0VRREh3TFFjNEFJUkFNZXd0Qnp3QWhFQXg2QzBIUUFDRVFESGtMUWRFQUlSQU1lQXRCMGdBaEVBeDNDMEhUQUNFUURIWUxRZFFBSVJBTWRRdEIxZ0FoRUF4MEMwSFZBQ0VRREhNTFFRWWhFQXh5QzBIWEFDRVFESEVMUVFVaEVBeHdDMEhZQUNFUURHOExRUVFoRUF4dUMwSFpBQ0VRREcwTFFkb0FJUkFNYkF0QjJ3QWhFQXhyQzBIY0FDRVFER29MUVFNaEVBeHBDMEhkQUNFUURHZ0xRZDRBSVJBTVp3dEIzd0FoRUF4bUMwSGhBQ0VRREdVTFFlQUFJUkFNWkF0QjRnQWhFQXhqQzBIakFDRVFER0lMUVFJaEVBeGhDMEhrQUNFUURHQUxRZVVBSVJBTVh3dEI1Z0FoRUF4ZUMwSG5BQ0VRREYwTFFlZ0FJUkFNWEF0QjZRQWhFQXhiQzBIcUFDRVFERm9MUWVzQUlSQU1XUXRCN0FBaEVBeFlDMEh0QUNFUURGY0xRZTRBSVJBTVZndEI3d0FoRUF4VkMwSHdBQ0VRREZRTFFmRUFJUkFNVXd0QjhnQWhFQXhTQzBIekFDRVFERkVMUWZRQUlSQU1VQXRCOVFBaEVBeFBDMEgyQUNFUURFNExRZmNBSVJBTVRRdEIrQUFoRUF4TUMwSDVBQ0VRREVzTFFmb0FJUkFNU2d0Qit3QWhFQXhKQzBIOEFDRVFERWdMUWYwQUlSQU1Sd3RCL2dBaEVBeEdDMEgvQUNFUURFVUxRWUFCSVJBTVJBdEJnUUVoRUF4REMwR0NBU0VRREVJTFFZTUJJUkFNUVF0QmhBRWhFQXhBQzBHRkFTRVFERDhMUVlZQklSQU1QZ3RCaHdFaEVBdzlDMEdJQVNFUUREd0xRWWtCSVJBTU93dEJpZ0VoRUF3NkMwR0xBU0VRRERrTFFZd0JJUkFNT0F0QmpRRWhFQXczQzBHT0FTRVFERFlMUVk4QklSQU1OUXRCa0FFaEVBdzBDMEdSQVNFUURETUxRWklCSVJBTU1ndEJrd0VoRUF3eEMwR1VBU0VRRERBTFFaVUJJUkFNTHd0QmxnRWhFQXd1QzBHWEFTRVFEQzBMUVpnQklSQU1MQXRCbVFFaEVBd3JDMEdhQVNFUURDb0xRWnNCSVJBTUtRdEJuQUVoRUF3b0MwR2RBU0VRRENjTFFaNEJJUkFNSmd0Qm53RWhFQXdsQzBHZ0FTRVFEQ1FMUWFFQklSQU1Jd3RCb2dFaEVBd2lDMEdqQVNFUURDRUxRYVFCSVJBTUlBdEJwUUVoRUF3ZkMwR21BU0VRREI0TFFhY0JJUkFNSFF0QnFBRWhFQXdjQzBHcEFTRVFEQnNMUWFvQklSQU1HZ3RCcXdFaEVBd1pDMEdzQVNFUURCZ0xRYTBCSVJBTUZ3dEJyZ0VoRUF3V0MwRUJJUkFNRlF0QnJ3RWhFQXdVQzBHd0FTRVFEQk1MUWJFQklSQU1FZ3RCc3dFaEVBd1JDMEd5QVNFUURCQUxRYlFCSVJBTUR3dEJ0UUVoRUF3T0MwRzJBU0VRREEwTFFiY0JJUkFNREF0QnVBRWhFQXdMQzBHNUFTRVFEQW9MUWJvQklSQU1DUXRCdXdFaEVBd0lDMEhHQVNFUURBY0xRYndCSVJBTUJndEJ2UUVoRUF3RkMwRytBU0VRREFRTFFiOEJJUkFNQXd0QndBRWhFQXdDQzBIQ0FTRVFEQUVMUWNFQklSQUxBMEFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBUURzY0JBQUVDQXdRRkJnY0lDUW9MREEwT0R4QVJFaE1VRlJZWEdCa2FHeHdlSHlBaEl5VW9QMEJCUkVWR1IwaEpTa3RNVFU5UVVWSlQzZ05YV1Z0Y1hXQmlaV1puYUdscWEyeHRiM0J4Y25OMGRYWjNlSGw2ZTN4OWZvQUJnZ0dGQVlZQmh3R0pBWXNCakFHTkFZNEJqd0dRQVpFQmxBR1ZBWllCbHdHWUFaa0JtZ0diQVp3Qm5RR2VBWjhCb0FHaEFhSUJvd0drQWFVQnBnR25BYWdCcVFHcUFhc0JyQUd0QWE0QnJ3R3dBYkVCc2dHekFiUUJ0UUcyQWJjQnVBRzVBYm9CdXdHOEFiMEJ2Z0cvQWNBQndRSENBY01CeEFIRkFjWUJ4d0hJQWNrQnlnSExBY3dCelFIT0FjOEIwQUhSQWRJQjB3SFVBZFVCMWdIWEFkZ0IyUUhhQWRzQjNBSGRBZDRCNEFIaEFlSUI0d0hrQWVVQjVnSG5BZWdCNlFIcUFlc0I3QUh0QWU0Qjd3SHdBZkVCOGdIekFaa0NwQUt3QXY0Qy9nSUxJQUVpQkNBQ1J3M3pBVUhkQVNFUURQOERDeUFCSWhBZ0FrY04zUUZCd3dFaEVBeitBd3NnQVNJQklBSkhEWkFCUWZjQUlSQU0vUU1MSUFFaUFTQUNSdzJHQVVIdkFDRVFEUHdEQ3lBQklnRWdBa2NOZjBIcUFDRVFEUHNEQ3lBQklnRWdBa2NOZTBIb0FDRVFEUG9EQ3lBQklnRWdBa2NOZUVIbUFDRVFEUGtEQ3lBQklnRWdBa2NOR2tFWUlSQU0rQU1MSUFFaUFTQUNSdzBVUVJJaEVBejNBd3NnQVNJQklBSkhEVmxCeFFBaEVBejJBd3NnQVNJQklBSkhEVXBCUHlFUURQVURDeUFCSWdFZ0FrY05TRUU4SVJBTTlBTUxJQUVpQVNBQ1J3MUJRVEVoRUF6ekF3c2dBQzBBTGtFQlJnM3JBd3lIQWdzZ0FDQUJJZ0VnQWhEQWdJQ0FBRUVCUnczbUFTQUFRZ0EzQXlBTTV3RUxJQUFnQVNJQklBSVF0SUNBZ0FBaUVBM25BU0FCSVFFTTlRSUxBa0FnQVNJQklBSkhEUUJCQmlFUURQQURDeUFBSUFGQkFXb2lBU0FDRUx1QWdJQUFJaEFONkFFZ0FTRUJEREVMSUFCQ0FEY0RJRUVTSVJBTTFRTUxJQUVpRUNBQ1J3MHJRUjBoRUF6dEF3c0NRQ0FCSWdFZ0FrWU5BQ0FCUVFGcUlRRkJFQ0VRRE5RREMwRUhJUkFNN0FNTElBQkNBQ0FBS1FNZ0loRWdBaUFCSWhCcnJTSVNmU0lUSUJNZ0VWWWJOd01nSUJFZ0VsWWlGRVVONVFGQkNDRVFET3NEQ3dKQUlBRWlBU0FDUmcwQUlBQkJpWUNBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUVVSVJBTTBnTUxRUWtoRUF6cUF3c2dBU0VCSUFBcEF5QlFEZVFCSUFFaEFRenlBZ3NDUUNBQklnRWdBa2NOQUVFTElSQU02UU1MSUFBZ0FVRUJhaUlCSUFJUXRvQ0FnQUFpRUEzbEFTQUJJUUVNOGdJTElBQWdBU0lCSUFJUXVJQ0FnQUFpRUEzbEFTQUJJUUVNOGdJTElBQWdBU0lCSUFJUXVJQ0FnQUFpRUEzbUFTQUJJUUVNRFFzZ0FDQUJJZ0VnQWhDNmdJQ0FBQ0lRRGVjQklBRWhBUXp3QWdzQ1FDQUJJZ0VnQWtjTkFFRVBJUkFNNVFNTElBRXRBQUFpRUVFN1JnMElJQkJCRFVjTjZBRWdBVUVCYWlFQkRPOENDeUFBSUFFaUFTQUNFTHFBZ0lBQUloQU42QUVnQVNFQkRQSUNDd05BQWtBZ0FTMEFBRUh3dFlDQUFHb3RBQUFpRUVFQlJnMEFJQkJCQWtjTjZ3RWdBQ2dDQkNFUUlBQkJBRFlDQkNBQUlCQWdBVUVCYWlJQkVMbUFnSUFBSWhBTjZnRWdBU0VCRFBRQ0N5QUJRUUZxSWdFZ0FrY05BQXRCRWlFUURPSURDeUFBSUFFaUFTQUNFTHFBZ0lBQUloQU42UUVnQVNFQkRBb0xJQUVpQVNBQ1J3MEdRUnNoRUF6Z0F3c0NRQ0FCSWdFZ0FrY05BRUVXSVJBTTRBTUxJQUJCaW9DQWdBQTJBZ2dnQUNBQk5nSUVJQUFnQVNBQ0VMaUFnSUFBSWhBTjZnRWdBU0VCUVNBaEVBekdBd3NDUUNBQklnRWdBa1lOQUFOQUFrQWdBUzBBQUVId3Q0Q0FBR290QUFBaUVFRUNSZzBBQWtBZ0VFRi9hZzRFNVFIc0FRRHJBZXdCQ3lBQlFRRnFJUUZCQ0NFUURNZ0RDeUFCUVFGcUlnRWdBa2NOQUF0QkZTRVFETjhEQzBFVklSQU0zZ01MQTBBQ1FDQUJMUUFBUWZDNWdJQUFhaTBBQUNJUVFRSkdEUUFnRUVGL2FnNEUzZ0hzQWVBQjZ3SHNBUXNnQVVFQmFpSUJJQUpIRFFBTFFSZ2hFQXpkQXdzQ1FDQUJJZ0VnQWtZTkFDQUFRWXVBZ0lBQU5nSUlJQUFnQVRZQ0JDQUJJUUZCQnlFUURNUURDMEVaSVJBTTNBTUxJQUZCQVdvaEFRd0NDd0pBSUFFaUZDQUNSdzBBUVJvaEVBemJBd3NnRkNFQkFrQWdGQzBBQUVGemFnNFUzUUx1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0lBN2dJTFFRQWhFQ0FBUVFBMkFod2dBRUd2aTRDQUFEWUNFQ0FBUVFJMkFnd2dBQ0FVUVFGcU5nSVVETm9EQ3dKQUlBRXRBQUFpRUVFN1JnMEFJQkJCRFVjTjZBRWdBVUVCYWlFQkRPVUNDeUFCUVFGcUlRRUxRU0loRUF5L0F3c0NRQ0FCSWhBZ0FrY05BRUVjSVJBTTJBTUxRZ0FoRVNBUUlRRWdFQzBBQUVGUWFnNDM1d0htQVFFQ0F3UUZCZ2NJQUFBQUFBQUFBQWtLQ3d3TkRnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR4QVJFaE1VQUF0QkhpRVFETDBEQzBJQ0lSRU01UUVMUWdNaEVRemtBUXRDQkNFUkRPTUJDMElGSVJFTTRnRUxRZ1loRVF6aEFRdENCeUVSRE9BQkMwSUlJUkVNM3dFTFFna2hFUXplQVF0Q0NpRVJETjBCQzBJTElSRU0zQUVMUWd3aEVRemJBUXRDRFNFUkROb0JDMElPSVJFTTJRRUxRZzhoRVF6WUFRdENDaUVSRE5jQkMwSUxJUkVNMWdFTFFnd2hFUXpWQVF0Q0RTRVJETlFCQzBJT0lSRU0wd0VMUWc4aEVRelNBUXRDQUNFUkFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FRTFFBQVFWQnFEamZsQWVRQkFBRUNBd1FGQmdmbUFlWUI1Z0htQWVZQjVnSG1BUWdKQ2dzTURlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdFT0R4QVJFaFBtQVF0Q0FpRVJET1FCQzBJRElSRU00d0VMUWdRaEVRemlBUXRDQlNFUkRPRUJDMElHSVJFTTRBRUxRZ2NoRVF6ZkFRdENDQ0VSRE40QkMwSUpJUkVNM1FFTFFnb2hFUXpjQVF0Q0N5RVJETnNCQzBJTUlSRU0yZ0VMUWcwaEVRelpBUXRDRGlFUkROZ0JDMElQSVJFTTF3RUxRZ29oRVF6V0FRdENDeUVSRE5VQkMwSU1JUkVNMUFFTFFnMGhFUXpUQVF0Q0RpRVJETklCQzBJUElSRU0wUUVMSUFCQ0FDQUFLUU1nSWhFZ0FpQUJJaEJyclNJU2ZTSVRJQk1nRVZZYk53TWdJQkVnRWxZaUZFVU4wZ0ZCSHlFUURNQURDd0pBSUFFaUFTQUNSZzBBSUFCQmlZQ0FnQUEyQWdnZ0FDQUJOZ0lFSUFFaEFVRWtJUkFNcHdNTFFTQWhFQXkvQXdzZ0FDQUJJaEFnQWhDK2dJQ0FBRUYvYWc0RnRnRUF4UUlCMFFIU0FRdEJFU0VRREtRREN5QUFRUUU2QUM4Z0VDRUJETHNEQ3lBQklnRWdBa2NOMGdGQkpDRVFETHNEQ3lBQklnMGdBa2NOSGtIR0FDRVFETG9EQ3lBQUlBRWlBU0FDRUxLQWdJQUFJaEFOMUFFZ0FTRUJETFVCQ3lBQkloQWdBa2NOSmtIUUFDRVFETGdEQ3dKQUlBRWlBU0FDUncwQVFTZ2hFQXk0QXdzZ0FFRUFOZ0lFSUFCQmpJQ0FnQUEyQWdnZ0FDQUJJQUVRc1lDQWdBQWlFQTNUQVNBQklRRU0yQUVMQWtBZ0FTSVFJQUpIRFFCQktTRVFETGNEQ3lBUUxRQUFJZ0ZCSUVZTkZDQUJRUWxIRGRNQklCQkJBV29oQVF3VkN3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFRd1hDMEVxSVJBTXRRTUxBa0FnQVNJUUlBSkhEUUJCS3lFUURMVURDd0pBSUJBdEFBQWlBVUVKUmcwQUlBRkJJRWNOMVFFTElBQXRBQ3hCQ0VZTjB3RWdFQ0VCREpFREN3SkFJQUVpQVNBQ1J3MEFRU3doRUF5MEF3c2dBUzBBQUVFS1J3M1ZBU0FCUVFGcUlRRU15UUlMSUFFaURpQUNSdzNWQVVFdklSQU1zZ01MQTBBQ1FDQUJMUUFBSWhCQklFWU5BQUpBSUJCQmRtb09CQURjQWR3QkFOb0JDeUFCSVFFTTRBRUxJQUZCQVdvaUFTQUNSdzBBQzBFeElSQU1zUU1MUVRJaEVDQUJJaFFnQWtZTnNBTWdBaUFVYXlBQUtBSUFJZ0ZxSVJVZ0ZDQUJhMEVEYWlFV0FrQURRQ0FVTFFBQUloZEJJSElnRnlBWFFiOS9ha0gvQVhGQkdra2JRZjhCY1NBQlFmQzdnSUFBYWkwQUFFY05BUUpBSUFGQkEwY05BRUVHSVFFTWxnTUxJQUZCQVdvaEFTQVVRUUZxSWhRZ0FrY05BQXNnQUNBVk5nSUFETEVEQ3lBQVFRQTJBZ0FnRkNFQkROa0JDMEV6SVJBZ0FTSVVJQUpHRGE4RElBSWdGR3NnQUNnQ0FDSUJhaUVWSUJRZ0FXdEJDR29oRmdKQUEwQWdGQzBBQUNJWFFTQnlJQmNnRjBHL2YycEIvd0Z4UVJwSkcwSC9BWEVnQVVIMHU0Q0FBR290QUFCSERRRUNRQ0FCUVFoSERRQkJCU0VCREpVREN5QUJRUUZxSVFFZ0ZFRUJhaUlVSUFKSERRQUxJQUFnRlRZQ0FBeXdBd3NnQUVFQU5nSUFJQlFoQVF6WUFRdEJOQ0VRSUFFaUZDQUNSZzJ1QXlBQ0lCUnJJQUFvQWdBaUFXb2hGU0FVSUFGclFRVnFJUllDUUFOQUlCUXRBQUFpRjBFZ2NpQVhJQmRCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCME1LQWdBQnFMUUFBUncwQkFrQWdBVUVGUncwQVFRY2hBUXlVQXdzZ0FVRUJhaUVCSUJSQkFXb2lGQ0FDUncwQUN5QUFJQlUyQWdBTXJ3TUxJQUJCQURZQ0FDQVVJUUVNMXdFTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQkJnTDZBZ0FCcUxRQUFJaEJCQVVZTkFDQVFRUUpHRFFvZ0FTRUJETjBCQ3lBQlFRRnFJZ0VnQWtjTkFBdEJNQ0VRREs0REMwRXdJUkFNclFNTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQWlFRUVnUmcwQUlCQkJkbW9PQk5rQjJnSGFBZGtCMmdFTElBRkJBV29pQVNBQ1J3MEFDMEU0SVJBTXJRTUxRVGdoRUF5c0F3c0RRQUpBSUFFdEFBQWlFRUVnUmcwQUlCQkJDVWNOQXdzZ0FVRUJhaUlCSUFKSERRQUxRVHdoRUF5ckF3c0RRQUpBSUFFdEFBQWlFRUVnUmcwQUFrQUNRQ0FRUVhacURnVGFBUUVCMmdFQUN5QVFRU3hHRGRzQkN5QUJJUUVNQkFzZ0FVRUJhaUlCSUFKSERRQUxRVDhoRUF5cUF3c2dBU0VCRE5zQkMwSEFBQ0VRSUFFaUZDQUNSZzJvQXlBQ0lCUnJJQUFvQWdBaUFXb2hGaUFVSUFGclFRWnFJUmNDUUFOQUlCUXRBQUJCSUhJZ0FVR0F3SUNBQUdvdEFBQkhEUUVnQVVFR1JnMk9BeUFCUVFGcUlRRWdGRUVCYWlJVUlBSkhEUUFMSUFBZ0ZqWUNBQXlwQXdzZ0FFRUFOZ0lBSUJRaEFRdEJOaUVRREk0REN3SkFJQUVpRHlBQ1J3MEFRY0VBSVJBTXB3TUxJQUJCaklDQWdBQTJBZ2dnQUNBUE5nSUVJQThoQVNBQUxRQXNRWDlxRGdUTkFkVUIxd0haQVljREN5QUJRUUZxSVFFTXpBRUxBa0FnQVNJQklBSkdEUUFEUUFKQUlBRXRBQUFpRUVFZ2NpQVFJQkJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJaEJCQ1VZTkFDQVFRU0JHRFFBQ1FBSkFBa0FDUUNBUVFaMS9hZzRUQUFNREF3TURBd01CQXdNREF3TURBd01EQWdNTElBRkJBV29oQVVFeElSQU1rUU1MSUFGQkFXb2hBVUV5SVJBTWtBTUxJQUZCQVdvaEFVRXpJUkFNandNTElBRWhBUXpRQVFzZ0FVRUJhaUlCSUFKSERRQUxRVFVoRUF5bEF3dEJOU0VRREtRREN3SkFJQUVpQVNBQ1JnMEFBMEFDUUNBQkxRQUFRWUM4Z0lBQWFpMEFBRUVCUmcwQUlBRWhBUXpUQVFzZ0FVRUJhaUlCSUFKSERRQUxRVDBoRUF5a0F3dEJQU0VRREtNREN5QUFJQUVpQVNBQ0VMQ0FnSUFBSWhBTjFnRWdBU0VCREFFTElCQkJBV29oQVF0QlBDRVFESWNEQ3dKQUlBRWlBU0FDUncwQVFjSUFJUkFNb0FNTEFrQURRQUpBSUFFdEFBQkJkMm9PR0FBQy9nTCtBb1FEL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDQVA0Q0N5QUJRUUZxSWdFZ0FrY05BQXRCd2dBaEVBeWdBd3NnQVVFQmFpRUJJQUF0QUMxQkFYRkZEYjBCSUFFaEFRdEJMQ0VRRElVREN5QUJJZ0VnQWtjTjB3RkJ4QUFoRUF5ZEF3c0RRQUpBSUFFdEFBQkJrTUNBZ0FCcUxRQUFRUUZHRFFBZ0FTRUJETGNDQ3lBQlFRRnFJZ0VnQWtjTkFBdEJ4UUFoRUF5Y0F3c2dEUzBBQUNJUVFTQkdEYk1CSUJCQk9rY05nUU1nQUNnQ0JDRUJJQUJCQURZQ0JDQUFJQUVnRFJDdmdJQ0FBQ0lCRGRBQklBMUJBV29oQVF5ekFndEJ4d0FoRUNBQklnMGdBa1lObWdNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRUZhaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdRd29DQUFHb3RBQUJIRFlBRElBRkJCVVlOOUFJZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTW1nTUxRY2dBSVJBZ0FTSU5JQUpHRFprRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJDV29oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCbHNLQWdBQnFMUUFBUnczL0FnSkFJQUZCQ1VjTkFFRUNJUUVNOVFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKa0RDd0pBSUFFaURTQUNSdzBBUWNrQUlSQU1tUU1MQWtBQ1FDQU5MUUFBSWdGQklISWdBU0FCUWI5L2FrSC9BWEZCR2trYlFmOEJjVUdTZjJvT0J3Q0FBNEFEZ0FPQUE0QURBWUFEQ3lBTlFRRnFJUUZCUGlFUURJQURDeUFOUVFGcUlRRkJQeUVRRFA4Q0MwSEtBQ0VRSUFFaURTQUNSZzJYQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRRnFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRYURDZ0lBQWFpMEFBRWNOL1FJZ0FVRUJSZzN3QWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5WEF3dEJ5d0FoRUNBQklnMGdBa1lObGdNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRU9haUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdpd29DQUFHb3RBQUJIRGZ3Q0lBRkJEa1lOOEFJZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTWxnTUxRY3dBSVJBZ0FTSU5JQUpHRFpVRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJEMm9oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCd01LQWdBQnFMUUFBUnczN0FnSkFJQUZCRDBjTkFFRURJUUVNOFFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKVURDMEhOQUNFUUlBRWlEU0FDUmcyVUF5QUNJQTFySUFBb0FnQWlBV29oRmlBTklBRnJRUVZxSVJjRFFDQU5MUUFBSWhSQklISWdGQ0FVUWI5L2FrSC9BWEZCR2trYlFmOEJjU0FCUWREQ2dJQUFhaTBBQUVjTitnSUNRQ0FCUVFWSERRQkJCQ0VCRFBBQ0N5QUJRUUZxSVFFZ0RVRUJhaUlOSUFKSERRQUxJQUFnRmpZQ0FBeVVBd3NDUUNBQklnMGdBa2NOQUVIT0FDRVFESlFEQ3dKQUFrQUNRQUpBSUEwdEFBQWlBVUVnY2lBQklBRkJ2MzlxUWY4QmNVRWFTUnRCL3dGeFFaMS9hZzRUQVAwQy9RTDlBdjBDL1FMOUF2MEMvUUw5QXYwQy9RTDlBZ0g5QXYwQy9RSUNBLzBDQ3lBTlFRRnFJUUZCd1FBaEVBejlBZ3NnRFVFQmFpRUJRY0lBSVJBTS9BSUxJQTFCQVdvaEFVSERBQ0VRRFBzQ0N5QU5RUUZxSVFGQnhBQWhFQXo2QWdzQ1FDQUJJZ0VnQWtZTkFDQUFRWTJBZ0lBQU5nSUlJQUFnQVRZQ0JDQUJJUUZCeFFBaEVBejZBZ3RCendBaEVBeVNBd3NnRUNFQkFrQUNRQ0FRTFFBQVFYWnFEZ1FCcUFLb0FnQ29BZ3NnRUVFQmFpRUJDMEVuSVJBTStBSUxBa0FnQVNJQklBSkhEUUJCMFFBaEVBeVJBd3NDUUNBQkxRQUFRU0JHRFFBZ0FTRUJESTBCQ3lBQlFRRnFJUUVnQUMwQUxVRUJjVVVOeHdFZ0FTRUJESXdCQ3lBQkloY2dBa2NOeUFGQjBnQWhFQXlQQXd0QjB3QWhFQ0FCSWhRZ0FrWU5qZ01nQWlBVWF5QUFLQUlBSWdGcUlSWWdGQ0FCYTBFQmFpRVhBMEFnRkMwQUFDQUJRZGJDZ0lBQWFpMEFBRWNOekFFZ0FVRUJSZzNIQVNBQlFRRnFJUUVnRkVFQmFpSVVJQUpIRFFBTElBQWdGallDQUF5T0F3c0NRQ0FCSWdFZ0FrY05BRUhWQUNFUURJNERDeUFCTFFBQVFRcEhEY3dCSUFGQkFXb2hBUXpIQVFzQ1FDQUJJZ0VnQWtjTkFFSFdBQ0VRREkwREN3SkFBa0FnQVMwQUFFRjJhZzRFQU0wQnpRRUJ6UUVMSUFGQkFXb2hBUXpIQVFzZ0FVRUJhaUVCUWNvQUlSQU04d0lMSUFBZ0FTSUJJQUlRcm9DQWdBQWlFQTNMQVNBQklRRkJ6UUFoRUF6eUFnc2dBQzBBS1VFaVJnMkZBd3ltQWdzQ1FDQUJJZ0VnQWtjTkFFSGJBQ0VRRElvREMwRUFJUlJCQVNFWFFRRWhGa0VBSVJBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FTMEFBRUZRYWc0SzFBSFRBUUFCQWdNRUJRWUkxUUVMUVFJaEVBd0dDMEVESVJBTUJRdEJCQ0VRREFRTFFRVWhFQXdEQzBFR0lSQU1BZ3RCQnlFUURBRUxRUWdoRUF0QkFDRVhRUUFoRmtFQUlSUU16QUVMUVFraEVFRUJJUlJCQUNFWFFRQWhGZ3pMQVFzQ1FDQUJJZ0VnQWtjTkFFSGRBQ0VRRElrREN5QUJMUUFBUVM1SERjd0JJQUZCQVdvaEFReW1BZ3NnQVNJQklBSkhEY3dCUWQ4QUlSQU1od01MQWtBZ0FTSUJJQUpHRFFBZ0FFR09nSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJRZEFBSVJBTTdnSUxRZUFBSVJBTWhnTUxRZUVBSVJBZ0FTSUJJQUpHRFlVRElBSWdBV3NnQUNnQ0FDSVVhaUVXSUFFZ0ZHdEJBMm9oRndOQUlBRXRBQUFnRkVIaXdvQ0FBR290QUFCSERjMEJJQlJCQTBZTnpBRWdGRUVCYWlFVUlBRkJBV29pQVNBQ1J3MEFDeUFBSUJZMkFnQU1oUU1MUWVJQUlSQWdBU0lCSUFKR0RZUURJQUlnQVdzZ0FDZ0NBQ0lVYWlFV0lBRWdGR3RCQW1vaEZ3TkFJQUV0QUFBZ0ZFSG13b0NBQUdvdEFBQkhEY3dCSUJSQkFrWU56Z0VnRkVFQmFpRVVJQUZCQVdvaUFTQUNSdzBBQ3lBQUlCWTJBZ0FNaEFNTFFlTUFJUkFnQVNJQklBSkdEWU1ESUFJZ0FXc2dBQ2dDQUNJVWFpRVdJQUVnRkd0QkEyb2hGd05BSUFFdEFBQWdGRUhwd29DQUFHb3RBQUJIRGNzQklCUkJBMFlOemdFZ0ZFRUJhaUVVSUFGQkFXb2lBU0FDUncwQUN5QUFJQlkyQWdBTWd3TUxBa0FnQVNJQklBSkhEUUJCNVFBaEVBeURBd3NnQUNBQlFRRnFJZ0VnQWhDb2dJQ0FBQ0lRRGMwQklBRWhBVUhXQUNFUURPa0NDd0pBSUFFaUFTQUNSZzBBQTBBQ1FDQUJMUUFBSWhCQklFWU5BQUpBQWtBQ1FDQVFRYmgvYWc0TEFBSFBBYzhCendIUEFjOEJ6d0hQQWM4QkFzOEJDeUFCUVFGcUlRRkIwZ0FoRUF6dEFnc2dBVUVCYWlFQlFkTUFJUkFNN0FJTElBRkJBV29oQVVIVUFDRVFET3NDQ3lBQlFRRnFJZ0VnQWtjTkFBdEI1QUFoRUF5Q0F3dEI1QUFoRUF5QkF3c0RRQUpBSUFFdEFBQkI4TUtBZ0FCcUxRQUFJaEJCQVVZTkFDQVFRWDVxRGdQUEFkQUIwUUhTQVFzZ0FVRUJhaUlCSUFKSERRQUxRZVlBSVJBTWdBTUxBa0FnQVNJQklBSkdEUUFnQVVFQmFpRUJEQU1MUWVjQUlSQU0vd0lMQTBBQ1FDQUJMUUFBUWZERWdJQUFhaTBBQUNJUVFRRkdEUUFDUUNBUVFYNXFEZ1RTQWRNQjFBRUExUUVMSUFFaEFVSFhBQ0VRRE9jQ0N5QUJRUUZxSWdFZ0FrY05BQXRCNkFBaEVBeitBZ3NDUUNBQklnRWdBa2NOQUVIcEFDRVFEUDRDQ3dKQUlBRXRBQUFpRUVGMmFnNGF1Z0hWQWRVQnZBSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSEtBZFVCMVFFQTB3RUxJQUZCQVdvaEFRdEJCaUVRRE9NQ0N3TkFBa0FnQVMwQUFFSHd4b0NBQUdvdEFBQkJBVVlOQUNBQklRRU1uZ0lMSUFGQkFXb2lBU0FDUncwQUMwSHFBQ0VRRFBzQ0N3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFRd0RDMEhyQUNFUURQb0NDd0pBSUFFaUFTQUNSdzBBUWV3QUlSQU0rZ0lMSUFGQkFXb2hBUXdCQ3dKQUlBRWlBU0FDUncwQVFlMEFJUkFNK1FJTElBRkJBV29oQVF0QkJDRVFETjRDQ3dKQUlBRWlGQ0FDUncwQVFlNEFJUkFNOXdJTElCUWhBUUpBQWtBQ1FDQVVMUUFBUWZESWdJQUFhaTBBQUVGL2FnNEgxQUhWQWRZQkFKd0NBUUxYQVFzZ0ZFRUJhaUVCREFvTElCUkJBV29oQVF6TkFRdEJBQ0VRSUFCQkFEWUNIQ0FBUVp1U2dJQUFOZ0lRSUFCQkJ6WUNEQ0FBSUJSQkFXbzJBaFFNOWdJTEFrQURRQUpBSUFFdEFBQkI4TWlBZ0FCcUxRQUFJaEJCQkVZTkFBSkFBa0FnRUVGL2FnNEgwZ0hUQWRRQjJRRUFCQUhaQVFzZ0FTRUJRZG9BSVJBTTRBSUxJQUZCQVdvaEFVSGNBQ0VRRE44Q0N5QUJRUUZxSWdFZ0FrY05BQXRCN3dBaEVBejJBZ3NnQVVFQmFpRUJETXNCQ3dKQUlBRWlGQ0FDUncwQVFmQUFJUkFNOVFJTElCUXRBQUJCTDBjTjFBRWdGRUVCYWlFQkRBWUxBa0FnQVNJVUlBSkhEUUJCOFFBaEVBejBBZ3NDUUNBVUxRQUFJZ0ZCTDBjTkFDQVVRUUZxSVFGQjNRQWhFQXpiQWdzZ0FVRjJhaUlFUVJaTERkTUJRUUVnQkhSQmlZQ0FBbkZGRGRNQkRNb0NDd0pBSUFFaUFTQUNSZzBBSUFGQkFXb2hBVUhlQUNFUUROb0NDMEh5QUNFUURQSUNDd0pBSUFFaUZDQUNSdzBBUWZRQUlSQU04Z0lMSUJRaEFRSkFJQlF0QUFCQjhNeUFnQUJxTFFBQVFYOXFEZ1BKQXBRQ0FOUUJDMEhoQUNFUUROZ0NDd0pBSUFFaUZDQUNSZzBBQTBBQ1FDQVVMUUFBUWZES2dJQUFhaTBBQUNJQlFRTkdEUUFDUUNBQlFYOXFEZ0xMQWdEVkFRc2dGQ0VCUWQ4QUlSQU0yZ0lMSUJSQkFXb2lGQ0FDUncwQUMwSHpBQ0VRRFBFQ0MwSHpBQ0VRRFBBQ0N3SkFJQUVpQVNBQ1JnMEFJQUJCajRDQWdBQTJBZ2dnQUNBQk5nSUVJQUVoQVVIZ0FDRVFETmNDQzBIMUFDRVFETzhDQ3dKQUlBRWlBU0FDUncwQVFmWUFJUkFNN3dJTElBQkJqNENBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBUXRCQXlFUUROUUNDd05BSUFFdEFBQkJJRWNOd3dJZ0FVRUJhaUlCSUFKSERRQUxRZmNBSVJBTTdBSUxBa0FnQVNJQklBSkhEUUJCK0FBaEVBenNBZ3NnQVMwQUFFRWdSdzNPQVNBQlFRRnFJUUVNN3dFTElBQWdBU0lCSUFJUXJJQ0FnQUFpRUEzT0FTQUJJUUVNamdJTEFrQWdBU0lFSUFKSERRQkIrZ0FoRUF6cUFnc2dCQzBBQUVITUFFY04wUUVnQkVFQmFpRUJRUk1oRUF6UEFRc0NRQ0FCSWdRZ0FrY05BRUg3QUNFUURPa0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFWcUlSQURRQ0FFTFFBQUlBRkI4TTZBZ0FCcUxRQUFSdzNRQVNBQlFRVkdEYzRCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWZzQUlSQU02QUlMQWtBZ0FTSUVJQUpIRFFCQi9BQWhFQXpvQWdzQ1FBSkFJQVF0QUFCQnZYOXFEZ3dBMFFIUkFkRUIwUUhSQWRFQjBRSFJBZEVCMFFFQjBRRUxJQVJCQVdvaEFVSG1BQ0VRRE04Q0N5QUVRUUZxSVFGQjV3QWhFQXpPQWdzQ1FDQUJJZ1FnQWtjTkFFSDlBQ0VRRE9jQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSHR6NENBQUdvdEFBQkhEYzhCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUg5QUNFUURPY0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFSQWhFQXpNQVFzQ1FDQUJJZ1FnQWtjTkFFSCtBQ0VRRE9ZQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUVZxSVJBQ1FBTkFJQVF0QUFBZ0FVSDJ6b0NBQUdvdEFBQkhEYzRCSUFGQkJVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUgrQUNFUURPWUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFSWWhFQXpMQVFzQ1FDQUJJZ1FnQWtjTkFFSC9BQ0VRRE9VQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUU5xSVJBQ1FBTkFJQVF0QUFBZ0FVSDh6b0NBQUdvdEFBQkhEYzBCSUFGQkEwWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUgvQUNFUURPVUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFRVWhFQXpLQVFzQ1FDQUJJZ1FnQWtjTkFFR0FBU0VRRE9RQ0N5QUVMUUFBUWRrQVJ3M0xBU0FFUVFGcUlRRkJDQ0VRRE1rQkN3SkFJQUVpQkNBQ1J3MEFRWUVCSVJBTTR3SUxBa0FDUUNBRUxRQUFRYkovYWc0REFNd0JBY3dCQ3lBRVFRRnFJUUZCNndBaEVBektBZ3NnQkVFQmFpRUJRZXdBSVJBTXlRSUxBa0FnQVNJRUlBSkhEUUJCZ2dFaEVBemlBZ3NDUUFKQUlBUXRBQUJCdUg5cURnZ0F5d0hMQWNzQnl3SExBY3NCQWNzQkN5QUVRUUZxSVFGQjZnQWhFQXpKQWdzZ0JFRUJhaUVCUWUwQUlSQU15QUlMQWtBZ0FTSUVJQUpIRFFCQmd3RWhFQXpoQWdzZ0FpQUVheUFBS0FJQUlnRnFJUkFnQkNBQmEwRUNhaUVVQWtBRFFDQUVMUUFBSUFGQmdNK0FnQUJxTFFBQVJ3M0pBU0FCUVFKR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJBMkFnQkJnd0VoRUF6aEFndEJBQ0VRSUFCQkFEWUNBQ0FVUVFGcUlRRU14Z0VMQWtBZ0FTSUVJQUpIRFFCQmhBRWhFQXpnQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQmc4K0FnQUJxTFFBQVJ3M0lBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJoQUVoRUF6Z0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFaklSQU14UUVMQWtBZ0FTSUVJQUpIRFFCQmhRRWhFQXpmQWdzQ1FBSkFJQVF0QUFCQnRIOXFEZ2dBeUFISUFjZ0J5QUhJQWNnQkFjZ0JDeUFFUVFGcUlRRkI3d0FoRUF6R0Fnc2dCRUVCYWlFQlFmQUFJUkFNeFFJTEFrQWdBU0lFSUFKSERRQkJoZ0VoRUF6ZUFnc2dCQzBBQUVIRkFFY054UUVnQkVFQmFpRUJESU1DQ3dKQUlBRWlCQ0FDUncwQVFZY0JJUkFNM1FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBMm9oRUFKQUEwQWdCQzBBQUNBQlFZalBnSUFBYWkwQUFFY054UUVnQVVFRFJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWWNCSVJBTTNRSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkxTRVFETUlCQ3dKQUlBRWlCQ0FDUncwQVFZZ0JJUkFNM0FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJDR29oRUFKQUEwQWdCQzBBQUNBQlFkRFBnSUFBYWkwQUFFY054QUVnQVVFSVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWWdCSVJBTTNBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQktTRVFETUVCQ3dKQUlBRWlBU0FDUncwQVFZa0JJUkFNMndJTFFRRWhFQ0FCTFFBQVFkOEFSdzNBQVNBQlFRRnFJUUVNZ1FJTEFrQWdBU0lFSUFKSERRQkJpZ0VoRUF6YUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVCYWlFUUEwQWdCQzBBQUNBQlFZelBnSUFBYWkwQUFFY053UUVnQVVFQlJnMnZBaUFCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdLQVNFUUROa0NDd0pBSUFFaUJDQUNSdzBBUVlzQklSQU0yUUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUVk3UGdJQUFhaTBBQUVjTndRRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZc0JJUkFNMlFJTElBQkJBRFlDQUNBUVFRRnFJUUZCQWlFUURMNEJDd0pBSUFFaUJDQUNSdzBBUVl3QklSQU0yQUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZEUGdJQUFhaTBBQUVjTndBRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZd0JJUkFNMkFJTElBQkJBRFlDQUNBUVFRRnFJUUZCSHlFUURMMEJDd0pBSUFFaUJDQUNSdzBBUVkwQklSQU0xd0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZMUGdJQUFhaTBBQUVjTnZ3RWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZMEJJUkFNMXdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQ1NFUURMd0JDd0pBSUFFaUJDQUNSdzBBUVk0QklSQU0xZ0lMQWtBQ1FDQUVMUUFBUWJkL2FnNEhBTDhCdndHL0FiOEJ2d0VCdndFTElBUkJBV29oQVVINEFDRVFETDBDQ3lBRVFRRnFJUUZCK1FBaEVBeThBZ3NDUUNBQklnUWdBa2NOQUVHUEFTRVFETlVDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHUno0Q0FBR290QUFCSERiMEJJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1BBU0VRRE5VQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJnaEVBeTZBUXNDUUNBQklnUWdBa2NOQUVHUUFTRVFETlFDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRSnFJUkFDUUFOQUlBUXRBQUFnQVVHWHo0Q0FBR290QUFCSERid0JJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1FBU0VRRE5RQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJjaEVBeTVBUXNDUUNBQklnUWdBa2NOQUVHUkFTRVFETk1DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRWnFJUkFDUUFOQUlBUXRBQUFnQVVHYXo0Q0FBR290QUFCSERic0JJQUZCQmtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1JBU0VRRE5NQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJVaEVBeTRBUXNDUUNBQklnUWdBa2NOQUVHU0FTRVFETklDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHaHo0Q0FBR290QUFCSERib0JJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1NBU0VRRE5JQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVI0aEVBeTNBUXNDUUNBQklnUWdBa2NOQUVHVEFTRVFETkVDQ3lBRUxRQUFRY3dBUncyNEFTQUVRUUZxSVFGQkNpRVFETFlCQ3dKQUlBUWdBa2NOQUVHVUFTRVFETkFDQ3dKQUFrQWdCQzBBQUVHL2Yyb09Ed0M1QWJrQnVRRzVBYmtCdVFHNUFia0J1UUc1QWJrQnVRRzVBUUc1QVFzZ0JFRUJhaUVCUWY0QUlSQU10d0lMSUFSQkFXb2hBVUgvQUNFUURMWUNDd0pBSUFRZ0FrY05BRUdWQVNFUURNOENDd0pBQWtBZ0JDMEFBRUcvZjJvT0F3QzRBUUc0QVFzZ0JFRUJhaUVCUWYwQUlSQU10Z0lMSUFSQkFXb2hCRUdBQVNFUURMVUNDd0pBSUFRZ0FrY05BRUdXQVNFUURNNENDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFGcUlSQUNRQU5BSUFRdEFBQWdBVUduejRDQUFHb3RBQUJIRGJZQklBRkJBVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHV0FTRVFETTRDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUXNoRUF5ekFRc0NRQ0FFSUFKSERRQkJsd0VoRUF6TkFnc0NRQUpBQWtBQ1FDQUVMUUFBUVZOcURpTUF1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBUUc0QWJnQnVBRzRBYmdCQXJnQnVBRzRBUU80QVFzZ0JFRUJhaUVCUWZzQUlSQU10Z0lMSUFSQkFXb2hBVUg4QUNFUURMVUNDeUFFUVFGcUlRUkJnUUVoRUF5MEFnc2dCRUVCYWlFRVFZSUJJUkFNc3dJTEFrQWdCQ0FDUncwQVFaZ0JJUkFNekFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCR29oRUFKQUEwQWdCQzBBQUNBQlFhblBnSUFBYWkwQUFFY050QUVnQVVFRVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWmdCSVJBTXpBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkdTRVFETEVCQ3dKQUlBUWdBa2NOQUVHWkFTRVFETXNDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHdXo0Q0FBR290QUFCSERiTUJJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1pBU0VRRE1zQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVFZaEVBeXdBUXNDUUNBRUlBSkhEUUJCbWdFaEVBektBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCdE0rQWdBQnFMUUFBUncyeUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQm1nRWhFQXpLQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVjSVJBTXJ3RUxBa0FnQkNBQ1J3MEFRWnNCSVJBTXlRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRYmJQZ0lBQWFpMEFBRWNOc1FFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVpzQklSQU15UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJKeUVRREs0QkN3SkFJQVFnQWtjTkFFR2NBU0VRRE1nQ0N3SkFBa0FnQkMwQUFFR3NmMm9PQWdBQnNRRUxJQVJCQVdvaEJFR0dBU0VRREs4Q0N5QUVRUUZxSVFSQmh3RWhFQXl1QWdzQ1FDQUVJQUpIRFFCQm5RRWhFQXpIQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQWtBRFFDQUVMUUFBSUFGQnVNK0FnQUJxTFFBQVJ3MnZBU0FCUVFGR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJuUUVoRUF6SEFnc2dBRUVBTmdJQUlCQkJBV29oQVVFbUlSQU1yQUVMQWtBZ0JDQUNSdzBBUVo0QklSQU14Z0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWJyUGdJQUFhaTBBQUVjTnJnRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaNEJJUkFNeGdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQXlFUURLc0JDd0pBSUFRZ0FrY05BRUdmQVNFUURNVUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUh0ejRDQUFHb3RBQUJIRGEwQklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHZkFTRVFETVVDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUXdoRUF5cUFRc0NRQ0FFSUFKSERRQkJvQUVoRUF6RUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVEYWlFUUFrQURRQ0FFTFFBQUlBRkJ2TStBZ0FCcUxRQUFSdzJzQVNBQlFRTkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCb0FFaEVBekVBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRU5JUkFNcVFFTEFrQWdCQ0FDUncwQVFhRUJJUkFNd3dJTEFrQUNRQ0FFTFFBQVFicC9hZzRMQUt3QnJBR3NBYXdCckFHc0Fhd0JyQUdzQVFHc0FRc2dCRUVCYWlFRVFZc0JJUkFNcWdJTElBUkJBV29oQkVHTUFTRVFES2tDQ3dKQUlBUWdBa2NOQUVHaUFTRVFETUlDQ3lBRUxRQUFRZEFBUncycEFTQUVRUUZxSVFRTTZRRUxBa0FnQkNBQ1J3MEFRYU1CSVJBTXdRSUxBa0FDUUNBRUxRQUFRYmQvYWc0SEFhb0JxZ0dxQWFvQnFnRUFxZ0VMSUFSQkFXb2hCRUdPQVNFUURLZ0NDeUFFUVFGcUlRRkJJaUVRREtZQkN3SkFJQVFnQWtjTkFFR2tBU0VRRE1BQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUZxSVJBQ1FBTkFJQVF0QUFBZ0FVSEF6NENBQUdvdEFBQkhEYWdCSUFGQkFVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdrQVNFUURNQUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFSMGhFQXlsQVFzQ1FDQUVJQUpIRFFCQnBRRWhFQXkvQWdzQ1FBSkFJQVF0QUFCQnJuOXFEZ01BcUFFQnFBRUxJQVJCQVdvaEJFR1FBU0VRREtZQ0N5QUVRUUZxSVFGQkJDRVFES1FCQ3dKQUlBUWdBa2NOQUVHbUFTRVFETDRDQ3dKQUFrQUNRQUpBQWtBZ0JDMEFBRUcvZjJvT0ZRQ3FBYW9CcWdHcUFhb0JxZ0dxQWFvQnFnR3FBUUdxQWFvQkFxb0JxZ0VEcWdHcUFRU3FBUXNnQkVFQmFpRUVRWWdCSVJBTXFBSUxJQVJCQVdvaEJFR0pBU0VRREtjQ0N5QUVRUUZxSVFSQmlnRWhFQXltQWdzZ0JFRUJhaUVFUVk4QklSQU1wUUlMSUFSQkFXb2hCRUdSQVNFUURLUUNDd0pBSUFRZ0FrY05BRUduQVNFUURMMENDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUh0ejRDQUFHb3RBQUJIRGFVQklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHbkFTRVFETDBDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUkVoRUF5aUFRc0NRQ0FFSUFKSERRQkJxQUVoRUF5OEFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVDYWlFUUFrQURRQ0FFTFFBQUlBRkJ3cytBZ0FCcUxRQUFSdzJrQVNBQlFRSkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCcUFFaEVBeThBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRXNJUkFNb1FFTEFrQWdCQ0FDUncwQVFha0JJUkFNdXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCR29oRUFKQUEwQWdCQzBBQUNBQlFjWFBnSUFBYWkwQUFFY05vd0VnQVVFRVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYWtCSVJBTXV3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQkt5RVFES0FCQ3dKQUlBUWdBa2NOQUVHcUFTRVFETG9DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRSnFJUkFDUUFOQUlBUXRBQUFnQVVIS3o0Q0FBR290QUFCSERhSUJJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR3FBU0VRRExvQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJRaEVBeWZBUXNDUUNBRUlBSkhEUUJCcXdFaEVBeTVBZ3NDUUFKQUFrQUNRQ0FFTFFBQVFiNS9hZzRQQUFFQ3BBR2tBYVFCcEFHa0FhUUJwQUdrQWFRQnBBR2tBUU9rQVFzZ0JFRUJhaUVFUVpNQklSQU1vZ0lMSUFSQkFXb2hCRUdVQVNFUURLRUNDeUFFUVFGcUlRUkJsUUVoRUF5Z0Fnc2dCRUVCYWlFRVFaWUJJUkFNbndJTEFrQWdCQ0FDUncwQVFhd0JJUkFNdUFJTElBUXRBQUJCeFFCSERaOEJJQVJCQVdvaEJBemdBUXNDUUNBRUlBSkhEUUJCclFFaEVBeTNBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQ2FpRVFBa0FEUUNBRUxRQUFJQUZCemMrQWdBQnFMUUFBUncyZkFTQUJRUUpHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQnJRRWhFQXkzQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVPSVJBTW5BRUxBa0FnQkNBQ1J3MEFRYTRCSVJBTXRnSUxJQVF0QUFCQjBBQkhEWjBCSUFSQkFXb2hBVUVsSVJBTW13RUxBa0FnQkNBQ1J3MEFRYThCSVJBTXRRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQ0dvaEVBSkFBMEFnQkMwQUFDQUJRZERQZ0lBQWFpMEFBRWNOblFFZ0FVRUlSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWE4QklSQU10UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJLaUVRREpvQkN3SkFJQVFnQWtjTkFFR3dBU0VRRExRQ0N3SkFBa0FnQkMwQUFFR3JmMm9PQ3dDZEFaMEJuUUdkQVowQm5RR2RBWjBCblFFQm5RRUxJQVJCQVdvaEJFR2FBU0VRREpzQ0N5QUVRUUZxSVFSQm13RWhFQXlhQWdzQ1FDQUVJQUpIRFFCQnNRRWhFQXl6QWdzQ1FBSkFJQVF0QUFCQnYzOXFEaFFBbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCQVp3QkN5QUVRUUZxSVFSQm1RRWhFQXlhQWdzZ0JFRUJhaUVFUVp3QklSQU1tUUlMQWtBZ0JDQUNSdzBBUWJJQklSQU1zZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkEyb2hFQUpBQTBBZ0JDMEFBQ0FCUWRuUGdJQUFhaTBBQUVjTm1nRWdBVUVEUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFiSUJJUkFNc2dJTElBQkJBRFlDQUNBUVFRRnFJUUZCSVNFUURKY0JDd0pBSUFRZ0FrY05BRUd6QVNFUURMRUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFacUlSQUNRQU5BSUFRdEFBQWdBVUhkejRDQUFHb3RBQUJIRFprQklBRkJCa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHekFTRVFETEVDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUm9oRUF5V0FRc0NRQ0FFSUFKSERRQkJ0QUVoRUF5d0Fnc0NRQUpBQWtBZ0JDMEFBRUc3ZjJvT0VRQ2FBWm9CbWdHYUFab0JtZ0dhQVpvQm1nRUJtZ0dhQVpvQm1nR2FBUUthQVFzZ0JFRUJhaUVFUVowQklSQU1tQUlMSUFSQkFXb2hCRUdlQVNFUURKY0NDeUFFUVFGcUlRUkJud0VoRUF5V0Fnc0NRQ0FFSUFKSERRQkJ0UUVoRUF5dkFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVGYWlFUUFrQURRQ0FFTFFBQUlBRkI1TStBZ0FCcUxRQUFSdzJYQVNBQlFRVkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCdFFFaEVBeXZBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRW9JUkFNbEFFTEFrQWdCQ0FDUncwQVFiWUJJUkFNcmdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBbW9oRUFKQUEwQWdCQzBBQUNBQlFlclBnSUFBYWkwQUFFY05sZ0VnQVVFQ1JnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYllCSVJBTXJnSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkJ5RVFESk1CQ3dKQUlBUWdBa2NOQUVHM0FTRVFESzBDQ3dKQUFrQWdCQzBBQUVHN2Yyb09EZ0NXQVpZQmxnR1dBWllCbGdHV0FaWUJsZ0dXQVpZQmxnRUJsZ0VMSUFSQkFXb2hCRUdoQVNFUURKUUNDeUFFUVFGcUlRUkJvZ0VoRUF5VEFnc0NRQ0FFSUFKSERRQkJ1QUVoRUF5c0Fnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVDYWlFUUFrQURRQ0FFTFFBQUlBRkI3YytBZ0FCcUxRQUFSdzJVQVNBQlFRSkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCdUFFaEVBeXNBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRVNJUkFNa1FFTEFrQWdCQ0FDUncwQVFia0JJUkFNcXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBV29oRUFKQUEwQWdCQzBBQUNBQlFmRFBnSUFBYWkwQUFFY05rd0VnQVVFQlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYmtCSVJBTXF3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQklDRVFESkFCQ3dKQUlBUWdBa2NOQUVHNkFTRVFES29DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRRnFJUkFDUUFOQUlBUXRBQUFnQVVIeXo0Q0FBR290QUFCSERaSUJJQUZCQVVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFRzZBU0VRREtvQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVE4aEVBeVBBUXNDUUNBRUlBSkhEUUJCdXdFaEVBeXBBZ3NDUUFKQUlBUXRBQUJCdDM5cURnY0FrZ0dTQVpJQmtnR1NBUUdTQVFzZ0JFRUJhaUVFUWFVQklSQU1rQUlMSUFSQkFXb2hCRUdtQVNFUURJOENDd0pBSUFRZ0FrY05BRUc4QVNFUURLZ0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFkcUlSQUNRQU5BSUFRdEFBQWdBVUgwejRDQUFHb3RBQUJIRFpBQklBRkJCMFlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHOEFTRVFES2dDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUnNoRUF5TkFRc0NRQ0FFSUFKSERRQkJ2UUVoRUF5bkFnc0NRQUpBQWtBZ0JDMEFBRUcrZjJvT0VnQ1JBWkVCa1FHUkFaRUJrUUdSQVpFQmtRRUJrUUdSQVpFQmtRR1JBWkVCQXBFQkN5QUVRUUZxSVFSQnBBRWhFQXlQQWdzZ0JFRUJhaUVFUWFjQklSQU1qZ0lMSUFSQkFXb2hCRUdvQVNFUURJMENDd0pBSUFRZ0FrY05BRUcrQVNFUURLWUNDeUFFTFFBQVFjNEFSdzJOQVNBRVFRRnFJUVFNendFTEFrQWdCQ0FDUncwQVFiOEJJUkFNcFFJTEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQkMwQUFFRy9mMm9PRlFBQkFnT2NBUVFGQnB3Qm5BR2NBUWNJQ1FvTG5BRU1EUTRQbkFFTElBUkJBV29oQVVIb0FDRVFESm9DQ3lBRVFRRnFJUUZCNlFBaEVBeVpBZ3NnQkVFQmFpRUJRZTRBSVJBTW1BSUxJQVJCQVdvaEFVSHlBQ0VRREpjQ0N5QUVRUUZxSVFGQjh3QWhFQXlXQWdzZ0JFRUJhaUVCUWZZQUlSQU1sUUlMSUFSQkFXb2hBVUgzQUNFUURKUUNDeUFFUVFGcUlRRkIrZ0FoRUF5VEFnc2dCRUVCYWlFRVFZTUJJUkFNa2dJTElBUkJBV29oQkVHRUFTRVFESkVDQ3lBRVFRRnFJUVJCaFFFaEVBeVFBZ3NnQkVFQmFpRUVRWklCSVJBTWp3SUxJQVJCQVdvaEJFR1lBU0VRREk0Q0N5QUVRUUZxSVFSQm9BRWhFQXlOQWdzZ0JFRUJhaUVFUWFNQklSQU1qQUlMSUFSQkFXb2hCRUdxQVNFUURJc0NDd0pBSUFRZ0FrWU5BQ0FBUVpDQWdJQUFOZ0lJSUFBZ0JEWUNCRUdyQVNFUURJc0NDMEhBQVNFUURLTUNDeUFBSUFVZ0FoQ3FnSUNBQUNJQkRZc0JJQVVoQVF4Y0N3SkFJQVlnQWtZTkFDQUdRUUZxSVFVTWpRRUxRY0lCSVJBTW9RSUxBMEFDUUNBUUxRQUFRWFpxRGdTTUFRQUFqd0VBQ3lBUVFRRnFJaEFnQWtjTkFBdEJ3d0VoRUF5Z0Fnc0NRQ0FISUFKR0RRQWdBRUdSZ0lDQUFEWUNDQ0FBSUFjMkFnUWdCeUVCUVFFaEVBeUhBZ3RCeEFFaEVBeWZBZ3NDUUNBSElBSkhEUUJCeFFFaEVBeWZBZ3NDUUFKQUlBY3RBQUJCZG1vT0JBSE9BYzRCQU00QkN5QUhRUUZxSVFZTWpRRUxJQWRCQVdvaEJReUpBUXNDUUNBSElBSkhEUUJCeGdFaEVBeWVBZ3NDUUFKQUlBY3RBQUJCZG1vT0Z3R1BBWThCQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVFDUEFRc2dCMEVCYWlFSEMwR3dBU0VRRElRQ0N3SkFJQWdnQWtjTkFFSElBU0VRREowQ0N5QUlMUUFBUVNCSERZMEJJQUJCQURzQk1pQUlRUUZxSVFGQnN3RWhFQXlEQWdzZ0FTRVhBa0FEUUNBWElnY2dBa1lOQVNBSExRQUFRVkJxUWY4QmNTSVFRUXBQRGN3QkFrQWdBQzhCTWlJVVFaa3pTdzBBSUFBZ0ZFRUtiQ0lVT3dFeUlCQkIvLzhEY3lBVVFmNy9BM0ZKRFFBZ0IwRUJhaUVYSUFBZ0ZDQVFhaUlRT3dFeUlCQkIvLzhEY1VIb0Iwa05BUXNMUVFBaEVDQUFRUUEyQWh3Z0FFSEJpWUNBQURZQ0VDQUFRUTAyQWd3Z0FDQUhRUUZxTmdJVURKd0NDMEhIQVNFUURKc0NDeUFBSUFnZ0FoQ3VnSUNBQUNJUVJRM0tBU0FRUVJWSERZd0JJQUJCeUFFMkFod2dBQ0FJTmdJVUlBQkJ5WmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXlhQWdzQ1FDQUpJQUpIRFFCQnpBRWhFQXlhQWd0QkFDRVVRUUVoRjBFQklSWkJBQ0VRQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFrdEFBQkJVR29PQ3BZQmxRRUFBUUlEQkFVR0NKY0JDMEVDSVJBTUJndEJBeUVRREFVTFFRUWhFQXdFQzBFRklSQU1Bd3RCQmlFUURBSUxRUWNoRUF3QkMwRUlJUkFMUVFBaEYwRUFJUlpCQUNFVURJNEJDMEVKSVJCQkFTRVVRUUFoRjBFQUlSWU1qUUVMQWtBZ0NpQUNSdzBBUWM0QklSQU1tUUlMSUFvdEFBQkJMa2NOamdFZ0NrRUJhaUVKRE1vQkN5QUxJQUpIRFk0QlFkQUJJUkFNbHdJTEFrQWdDeUFDUmcwQUlBQkJqb0NBZ0FBMkFnZ2dBQ0FMTmdJRVFiY0JJUkFNL2dFTFFkRUJJUkFNbGdJTEFrQWdCQ0FDUncwQVFkSUJJUkFNbGdJTElBSWdCR3NnQUNnQ0FDSVFhaUVVSUFRZ0VHdEJCR29oQ3dOQUlBUXRBQUFnRUVIOHo0Q0FBR290QUFCSERZNEJJQkJCQkVZTjZRRWdFRUVCYWlFUUlBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkIwZ0VoRUF5VkFnc2dBQ0FNSUFJUXJJQ0FnQUFpQVEyTkFTQU1JUUVNdUFFTEFrQWdCQ0FDUncwQVFkUUJJUkFNbEFJTElBSWdCR3NnQUNnQ0FDSVFhaUVVSUFRZ0VHdEJBV29oREFOQUlBUXRBQUFnRUVHQjBJQ0FBR290QUFCSERZOEJJQkJCQVVZTmpnRWdFRUVCYWlFUUlBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkIxQUVoRUF5VEFnc0NRQ0FFSUFKSERRQkIxZ0VoRUF5VEFnc2dBaUFFYXlBQUtBSUFJaEJxSVJRZ0JDQVFhMEVDYWlFTEEwQWdCQzBBQUNBUVFZUFFnSUFBYWkwQUFFY05qZ0VnRUVFQ1JnMlFBU0FRUVFGcUlSQWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUhXQVNFUURKSUNDd0pBSUFRZ0FrY05BRUhYQVNFUURKSUNDd0pBQWtBZ0JDMEFBRUc3ZjJvT0VBQ1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJBWThCQ3lBRVFRRnFJUVJCdXdFaEVBejVBUXNnQkVFQmFpRUVRYndCSVJBTStBRUxBa0FnQkNBQ1J3MEFRZGdCSVJBTWtRSUxJQVF0QUFCQnlBQkhEWXdCSUFSQkFXb2hCQXpFQVFzQ1FDQUVJQUpHRFFBZ0FFR1FnSUNBQURZQ0NDQUFJQVEyQWdSQnZnRWhFQXozQVF0QjJRRWhFQXlQQWdzQ1FDQUVJQUpIRFFCQjJnRWhFQXlQQWdzZ0JDMEFBRUhJQUVZTnd3RWdBRUVCT2dBb0RMa0JDeUFBUVFJNkFDOGdBQ0FFSUFJUXBvQ0FnQUFpRUEyTkFVSENBU0VRRFBRQkN5QUFMUUFvUVg5cURnSzNBYmtCdUFFTEEwQUNRQ0FFTFFBQVFYWnFEZ1FBamdHT0FRQ09BUXNnQkVFQmFpSUVJQUpIRFFBTFFkMEJJUkFNaXdJTElBQkJBRG9BTHlBQUxRQXRRUVJ4UlEyRUFnc2dBRUVBT2dBdklBQkJBVG9BTkNBQklRRU1qQUVMSUJCQkZVWU4yZ0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYWVPZ0lBQU5nSVFJQUJCRWpZQ0RFRUFJUkFNaUFJTEFrQWdBQ0FRSUFJUXRJQ0FnQUFpQkEwQUlCQWhBUXlCQWdzQ1FDQUVRUlZIRFFBZ0FFRUROZ0ljSUFBZ0VEWUNGQ0FBUWJDWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTWlBSUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR25qb0NBQURZQ0VDQUFRUkkyQWd4QkFDRVFESWNDQ3lBUVFSVkdEZFlCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUhhallDQUFEWUNFQ0FBUVJRMkFneEJBQ0VRRElZQ0N5QUFLQUlFSVJjZ0FFRUFOZ0lFSUJBZ0VhZHFJaFloQVNBQUlCY2dFQ0FXSUJRYkloQVF0WUNBZ0FBaUZFVU5qUUVnQUVFSE5nSWNJQUFnRURZQ0ZDQUFJQlEyQWd4QkFDRVFESVVDQ3lBQUlBQXZBVEJCZ0FGeU93RXdJQUVoQVF0QktpRVFET29CQ3lBUVFSVkdEZEVCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdEaklDQUFEWUNFQ0FBUVJNMkFneEJBQ0VRRElJQ0N5QVFRUlZHRGM4QklBQkJBRFlDSENBQUlBRTJBaFFnQUVHYWo0Q0FBRFlDRUNBQVFTSTJBZ3hCQUNFUURJRUNDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXQ0Q0FnQUFpRUEwQUlBRkJBV29oQVF5TkFRc2dBRUVNTmdJY0lBQWdFRFlDRENBQUlBRkJBV28yQWhSQkFDRVFESUFDQ3lBUVFSVkdEY3dCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdhajRDQUFEWUNFQ0FBUVNJMkFneEJBQ0VRRFA4QkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRdDRDQWdBQWlFQTBBSUFGQkFXb2hBUXlNQVFzZ0FFRU5OZ0ljSUFBZ0VEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQNEJDeUFRUVJWR0Rja0JJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUDBCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF1WUNBZ0FBaUVBMEFJQUZCQVdvaEFReUxBUXNnQUVFT05nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFB3QkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQndKV0FnQUEyQWhBZ0FFRUNOZ0lNUVFBaEVBejdBUXNnRUVFVlJnM0ZBU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ4b3lBZ0FBMkFoQWdBRUVqTmdJTVFRQWhFQXo2QVFzZ0FFRVFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRFBrQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdVlDQWdBQWlCQTBBSUFGQkFXb2hBUXp4QVFzZ0FFRVJOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQZ0JDeUFRUVJWR0RjRUJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUGNCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF1WUNBZ0FBaUVBMEFJQUZCQVdvaEFReUlBUXNnQUVFVE5nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFBZQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdVlDQWdBQWlCQTBBSUFGQkFXb2hBUXp0QVFzZ0FFRVVOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQVUJDeUFRUVJWR0RiMEJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR2FqNENBQURZQ0VDQUFRU0kyQWd4QkFDRVFEUFFCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF0NENBZ0FBaUVBMEFJQUZCQVdvaEFReUdBUXNnQUVFV05nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFBNQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdDRDQWdBQWlCQTBBSUFGQkFXb2hBUXpwQVFzZ0FFRVhOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQSUJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ6Wk9BZ0FBMkFoQWdBRUVNTmdJTVFRQWhFQXp4QVF0Q0FTRVJDeUFRUVFGcUlRRUNRQ0FBS1FNZ0loSkMvLy8vLy8vLy8vOFBWZzBBSUFBZ0VrSUVoaUFSaERjRElDQUJJUUVNaEFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHdGlZQ0FBRFlDRUNBQVFRdzJBZ3hCQUNFUURPOEJDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJ6Wk9BZ0FBMkFoQWdBRUVNTmdJTVFRQWhFQXp1QVFzZ0FDZ0NCQ0VYSUFCQkFEWUNCQ0FRSUJHbmFpSVdJUUVnQUNBWElCQWdGaUFVR3lJUUVMV0FnSUFBSWhSRkRYTWdBRUVGTmdJY0lBQWdFRFlDRkNBQUlCUTJBZ3hCQUNFUURPMEJDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJxcHlBZ0FBMkFoQWdBRUVQTmdJTVFRQWhFQXpzQVFzZ0FDQVFJQUlRdElDQWdBQWlBUTBCSUJBaEFRdEJEaUVRRE5FQkN3SkFJQUZCRlVjTkFDQUFRUUkyQWh3Z0FDQVFOZ0lVSUFCQnNKaUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBenFBUXNnQUVFQU5nSWNJQUFnRURZQ0ZDQUFRYWVPZ0lBQU5nSVFJQUJCRWpZQ0RFRUFJUkFNNlFFTElBRkJBV29oRUFKQUlBQXZBVEFpQVVHQUFYRkZEUUFDUUNBQUlCQWdBaEM3Z0lDQUFDSUJEUUFnRUNFQkRIQUxJQUZCRlVjTnVnRWdBRUVGTmdJY0lBQWdFRFlDRkNBQVFmbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU02UUVMQWtBZ0FVR2dCSEZCb0FSSERRQWdBQzBBTFVFQ2NRMEFJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR1drNENBQURZQ0VDQUFRUVEyQWd4QkFDRVFET2tCQ3lBQUlCQWdBaEM5Z0lDQUFCb2dFQ0VCQWtBQ1FBSkFBa0FDUUNBQUlCQWdBaEN6Z0lDQUFBNFdBZ0VBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQXdRTElBQkJBVG9BTGdzZ0FDQUFMd0V3UWNBQWNqc0JNQ0FRSVFFTFFTWWhFQXpSQVFzZ0FFRWpOZ0ljSUFBZ0VEWUNGQ0FBUWFXV2dJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTTZRRUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFSFZpNENBQURZQ0VDQUFRUkUyQWd4QkFDRVFET2dCQ3lBQUxRQXRRUUZ4UlEwQlFjTUJJUkFNemdFTEFrQWdEU0FDUmcwQUEwQUNRQ0FOTFFBQVFTQkdEUUFnRFNFQkRNUUJDeUFOUVFGcUlnMGdBa2NOQUF0QkpTRVFET2NCQzBFbElSQU01Z0VMSUFBb0FnUWhCQ0FBUVFBMkFnUWdBQ0FFSUEwUXI0Q0FnQUFpQkVVTnJRRWdBRUVtTmdJY0lBQWdCRFlDRENBQUlBMUJBV28yQWhSQkFDRVFET1VCQ3lBUVFSVkdEYXNCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUg5allDQUFEWUNFQ0FBUVIwMkFneEJBQ0VRRE9RQkN5QUFRU2MyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTTR3RUxJQkFoQVVFQklSUUNRQUpBQWtBQ1FBSkFBa0FDUUNBQUxRQXNRWDVxRGdjR0JRVURBUUlBQlFzZ0FDQUFMd0V3UVFoeU93RXdEQU1MUVFJaEZBd0JDMEVFSVJRTElBQkJBVG9BTENBQUlBQXZBVEFnRkhJN0FUQUxJQkFoQVF0Qkt5RVFETW9CQ3lBQVFRQTJBaHdnQUNBUU5nSVVJQUJCcTVLQWdBQTJBaEFnQUVFTE5nSU1RUUFoRUF6aUFRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFlR1BnSUFBTmdJUUlBQkJDallDREVFQUlSQU00UUVMSUFCQkFEb0FMQ0FRSVFFTXZRRUxJQkFoQVVFQklSUUNRQUpBQWtBQ1FBSkFJQUF0QUN4QmUyb09CQU1CQWdBRkN5QUFJQUF2QVRCQkNISTdBVEFNQXd0QkFpRVVEQUVMUVFRaEZBc2dBRUVCT2dBc0lBQWdBQzhCTUNBVWNqc0JNQXNnRUNFQkMwRXBJUkFNeFFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVId2xJQ0FBRFlDRUNBQVFRTTJBZ3hCQUNFUUROMEJDd0pBSUE0dEFBQkJEVWNOQUNBQUtBSUVJUUVnQUVFQU5nSUVBa0FnQUNBQklBNFFzWUNBZ0FBaUFRMEFJQTVCQVdvaEFReDFDeUFBUVN3MkFod2dBQ0FCTmdJTUlBQWdEa0VCYWpZQ0ZFRUFJUkFNM1FFTElBQXRBQzFCQVhGRkRRRkJ4QUVoRUF6REFRc0NRQ0FPSUFKSERRQkJMU0VRRE53QkN3SkFBa0FEUUFKQUlBNHRBQUJCZG1vT0JBSUFBQU1BQ3lBT1FRRnFJZzRnQWtjTkFBdEJMU0VRRE4wQkN5QUFLQUlFSVFFZ0FFRUFOZ0lFQWtBZ0FDQUJJQTRRc1lDQWdBQWlBUTBBSUE0aEFReDBDeUFBUVN3MkFod2dBQ0FPTmdJVUlBQWdBVFlDREVFQUlSQU0zQUVMSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0RoQ3hnSUNBQUNJQkRRQWdEa0VCYWlFQkRITUxJQUJCTERZQ0hDQUFJQUUyQWd3Z0FDQU9RUUZxTmdJVVFRQWhFQXpiQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQ0FBSUFRZ0RoQ3hnSUNBQUNJRURhQUJJQTRoQVF6T0FRc2dFRUVzUncwQklBRkJBV29oRUVFQklRRUNRQUpBQWtBQ1FBSkFJQUF0QUN4QmUyb09CQU1CQWdRQUN5QVFJUUVNQkF0QkFpRUJEQUVMUVFRaEFRc2dBRUVCT2dBc0lBQWdBQzhCTUNBQmNqc0JNQ0FRSVFFTUFRc2dBQ0FBTHdFd1FRaHlPd0V3SUJBaEFRdEJPU0VRREw4QkN5QUFRUUE2QUN3Z0FTRUJDMEUwSVJBTXZRRUxJQUFnQUM4Qk1FRWdjanNCTUNBQklRRU1BZ3NnQUNnQ0JDRUVJQUJCQURZQ0JBSkFJQUFnQkNBQkVMR0FnSUFBSWdRTkFDQUJJUUVNeHdFTElBQkJOellDSENBQUlBRTJBaFFnQUNBRU5nSU1RUUFoRUF6VUFRc2dBRUVJT2dBc0lBRWhBUXRCTUNFUURMa0JDd0pBSUFBdEFDaEJBVVlOQUNBQklRRU1CQXNnQUMwQUxVRUljVVVOa3dFZ0FTRUJEQU1MSUFBdEFEQkJJSEVObEFGQnhRRWhFQXkzQVFzQ1FDQVBJQUpHRFFBQ1FBTkFBa0FnRHkwQUFFRlFhaUlCUWY4QmNVRUtTUTBBSUE4aEFVRTFJUkFNdWdFTElBQXBBeUFpRVVLWnMrYk1tYlBtekJsV0RRRWdBQ0FSUWdwK0loRTNBeUFnRVNBQnJVTC9BWU1pRWtKL2hWWU5BU0FBSUJFZ0VudzNBeUFnRDBFQmFpSVBJQUpIRFFBTFFUa2hFQXpSQVFzZ0FDZ0NCQ0VDSUFCQkFEWUNCQ0FBSUFJZ0QwRUJhaUlFRUxHQWdJQUFJZ0lObFFFZ0JDRUJETU1CQzBFNUlSQU16d0VMQWtBZ0FDOEJNQ0lCUVFoeFJRMEFJQUF0QUNoQkFVY05BQ0FBTFFBdFFRaHhSUTJRQVFzZ0FDQUJRZmY3QTNGQmdBUnlPd0V3SUE4aEFRdEJOeUVRRExRQkN5QUFJQUF2QVRCQkVISTdBVEFNcXdFTElCQkJGVVlOaXdFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZDT2dJQUFOZ0lRSUFCQkhEWUNERUVBSVJBTXl3RUxJQUJCd3dBMkFod2dBQ0FCTmdJTUlBQWdEVUVCYWpZQ0ZFRUFJUkFNeWdFTEFrQWdBUzBBQUVFNlJ3MEFJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDdmdJQ0FBQ0lRRFFBZ0FVRUJhaUVCREdNTElBQkJ3d0EyQWh3Z0FDQVFOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU15Z0VMSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUd4a1lDQUFEWUNFQ0FBUVFvMkFneEJBQ0VRRE1rQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQm9KbUFnQUEyQWhBZ0FFRWVOZ0lNUVFBaEVBeklBUXNnQUVFQU5nSUFDeUFBUVlBU093RXFJQUFnRjBFQmFpSUJJQUlRcUlDQWdBQWlFQTBCSUFFaEFRdEJ4d0FoRUF5c0FRc2dFRUVWUncyREFTQUFRZEVBTmdJY0lBQWdBVFlDRkNBQVFlT1hnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU14QUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREY0TElBQkIwZ0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXd3RUxJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFSEJxSUNBQURZQ0VDQUFRUWMyQWd3Z0FFRUFOZ0lBUVFBaEVBekNBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNWFFzZ0FFSFRBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6QkFRdEJBQ0VRSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdBa1lDQUFEWUNFQ0FBUVFrMkFnd013QUVMSUJCQkZVWU5mU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJsSTJBZ0FBMkFoQWdBRUVoTmdJTVFRQWhFQXkvQVF0QkFTRVdRUUFoRjBFQUlSUkJBU0VRQ3lBQUlCQTZBQ3NnQVVFQmFpRUJBa0FDUUNBQUxRQXRRUkJ4RFFBQ1FBSkFBa0FnQUMwQUtnNERBUUFDQkFzZ0ZrVU5Bd3dDQ3lBVURRRU1BZ3NnRjBVTkFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUsyQWdJQUFJaEFOQUNBQklRRU1YQXNnQUVIWUFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXkrQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQUpBSUFBZ0JDQUJFSzJBZ0lBQUlnUU5BQ0FCSVFFTXJRRUxJQUJCMlFBMkFod2dBQ0FCTmdJVUlBQWdCRFlDREVFQUlSQU12UUVMSUFBb0FnUWhCQ0FBUVFBMkFnUUNRQ0FBSUFRZ0FSQ3RnSUNBQUNJRURRQWdBU0VCREtzQkN5QUFRZG9BTmdJY0lBQWdBVFlDRkNBQUlBUTJBZ3hCQUNFUURMd0JDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXJZQ0FnQUFpQkEwQUlBRWhBUXlwQVFzZ0FFSGNBRFlDSENBQUlBRTJBaFFnQUNBRU5nSU1RUUFoRUF5N0FRc0NRQ0FCTFFBQVFWQnFJaEJCL3dGeFFRcFBEUUFnQUNBUU9nQXFJQUZCQVdvaEFVSFBBQ0VRREtJQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRcllDQWdBQWlCQTBBSUFFaEFReW5BUXNnQUVIZUFEWUNIQ0FBSUFFMkFoUWdBQ0FFTmdJTVFRQWhFQXk2QVFzZ0FFRUFOZ0lBSUJkQkFXb2hBUUpBSUFBdEFDbEJJMDhOQUNBQklRRU1XUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZE9KZ0lBQU5nSVFJQUJCQ0RZQ0RFRUFJUkFNdVFFTElBQkJBRFlDQUF0QkFDRVFJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR1FzNENBQURZQ0VDQUFRUWcyQWd3TXR3RUxJQUJCQURZQ0FDQVhRUUZxSVFFQ1FDQUFMUUFwUVNGSERRQWdBU0VCREZZTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHYmlvQ0FBRFlDRUNBQVFRZzJBZ3hCQUNFUURMWUJDeUFBUVFBMkFnQWdGMEVCYWlFQkFrQWdBQzBBS1NJUVFWMXFRUXRQRFFBZ0FTRUJERlVMQWtBZ0VFRUdTdzBBUVFFZ0VIUkJ5Z0J4UlEwQUlBRWhBUXhWQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFmZUpnSUFBTmdJUUlBQkJDRFlDREF5MUFRc2dFRUVWUmcxeElBQkJBRFlDSENBQUlBRTJBaFFnQUVHNWpZQ0FBRFlDRUNBQVFSbzJBZ3hCQUNFUURMUUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhVQ3lBQVFlVUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRExNQkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcDRDQWdBQWlFQTBBSUFFaEFReE5DeUFBUWRJQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFETElCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVFwNENBZ0FBaUVBMEFJQUVoQVF4TkN5QUFRZE1BTmdJY0lBQWdBVFlDRkNBQUlCQTJBZ3hCQUNFUURMRUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhSQ3lBQVFlVUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRExBQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQnhvcUFnQUEyQWhBZ0FFRUhOZ0lNUVFBaEVBeXZBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNU1FzZ0FFSFNBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF5dUFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUtlQWdJQUFJaEFOQUNBQklRRU1TUXNnQUVIVEFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXl0QVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFS2VBZ0lBQUloQU5BQ0FCSVFFTVRRc2dBRUhsQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeXNBUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZHlJZ0lBQU5nSVFJQUJCQnpZQ0RFRUFJUkFNcXdFTElCQkJQMGNOQVNBQlFRRnFJUUVMUVFVaEVBeVFBUXRCQUNFUUlBQkJBRFlDSENBQUlBRTJBaFFnQUVIOWtvQ0FBRFlDRUNBQVFRYzJBZ3dNcUFFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkNuZ0lDQUFDSVFEUUFnQVNFQkRFSUxJQUJCMGdBMkFod2dBQ0FCTmdJVUlBQWdFRFlDREVFQUlSQU1wd0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREVJTElBQkIwd0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXBnRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERVlMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNcFFFTElBQW9BZ1FoQVNBQVFRQTJBZ1FDUUNBQUlBRWdGQkNuZ0lDQUFDSUJEUUFnRkNFQkREOExJQUJCMGdBMkFod2dBQ0FVTmdJVUlBQWdBVFlDREVFQUlSQU1wQUVMSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0ZCQ25nSUNBQUNJQkRRQWdGQ0VCREQ4TElBQkIwd0EyQWh3Z0FDQVVOZ0lVSUFBZ0FUWUNERUVBSVJBTW93RUxJQUFvQWdRaEFTQUFRUUEyQWdRQ1FDQUFJQUVnRkJDbmdJQ0FBQ0lCRFFBZ0ZDRUJERU1MSUFCQjVRQTJBaHdnQUNBVU5nSVVJQUFnQVRZQ0RFRUFJUkFNb2dFTElBQkJBRFlDSENBQUlCUTJBaFFnQUVIRGo0Q0FBRFlDRUNBQVFRYzJBZ3hCQUNFUURLRUJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ3NCtBZ0FBMkFoQWdBRUVITmdJTVFRQWhFQXlnQVF0QkFDRVFJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFR01uSUNBQURZQ0VDQUFRUWMyQWd3TW53RUxJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFR01uSUNBQURZQ0VDQUFRUWMyQWd4QkFDRVFESjRCQ3lBQVFRQTJBaHdnQUNBVU5nSVVJQUJCL3BHQWdBQTJBaEFnQUVFSE5nSU1RUUFoRUF5ZEFRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFZNmJnSUFBTmdJUUlBQkJCallDREVFQUlSQU1uQUVMSUJCQkZVWU5WeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ6STZBZ0FBMkFoQWdBRUVnTmdJTVFRQWhFQXliQVFzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVrSVJBTElBQWdFRG9BS1NBQUtBSUVJUkFnQUVFQU5nSUVJQUFnRUNBQkVLdUFnSUFBSWhBTlZDQUJJUUVNUGdzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdCRFlDRkNBQVFmR2JnSUFBTmdJUUlBQkJCallDREF5WEFRc2dBVUVWUmcxUUlBQkJBRFlDSENBQUlBVTJBaFFnQUVId2pJQ0FBRFlDRUNBQVFSczJBZ3hCQUNFUURKWUJDeUFBS0FJRUlRVWdBRUVBTmdJRUlBQWdCU0FRRUttQWdJQUFJZ1VOQVNBUVFRRnFJUVVMUWEwQklSQU1ld3NnQUVIQkFUWUNIQ0FBSUFVMkFnd2dBQ0FRUVFGcU5nSVVRUUFoRUF5VEFRc2dBQ2dDQkNFR0lBQkJBRFlDQkNBQUlBWWdFQkNwZ0lDQUFDSUdEUUVnRUVFQmFpRUdDMEd1QVNFUURIZ0xJQUJCd2dFMkFod2dBQ0FHTmdJTUlBQWdFRUVCYWpZQ0ZFRUFJUkFNa0FFTElBQkJBRFlDSENBQUlBYzJBaFFnQUVHWGk0Q0FBRFlDRUNBQVFRMDJBZ3hCQUNFUURJOEJDeUFBUVFBMkFod2dBQ0FJTmdJVUlBQkI0NUNBZ0FBMkFoQWdBRUVKTmdJTVFRQWhFQXlPQVFzZ0FFRUFOZ0ljSUFBZ0NEWUNGQ0FBUVpTTmdJQUFOZ0lRSUFCQklUWUNERUVBSVJBTWpRRUxRUUVoRmtFQUlSZEJBQ0VVUVFFaEVBc2dBQ0FRT2dBcklBbEJBV29oQ0FKQUFrQWdBQzBBTFVFUWNRMEFBa0FDUUFKQUlBQXRBQ29PQXdFQUFnUUxJQlpGRFFNTUFnc2dGQTBCREFJTElCZEZEUUVMSUFBb0FnUWhFQ0FBUVFBMkFnUWdBQ0FRSUFnUXJZQ0FnQUFpRUVVTlBTQUFRY2tCTmdJY0lBQWdDRFlDRkNBQUlCQTJBZ3hCQUNFUURJd0JDeUFBS0FJRUlRUWdBRUVBTmdJRUlBQWdCQ0FJRUsyQWdJQUFJZ1JGRFhZZ0FFSEtBVFlDSENBQUlBZzJBaFFnQUNBRU5nSU1RUUFoRUF5TEFRc2dBQ2dDQkNFRUlBQkJBRFlDQkNBQUlBUWdDUkN0Z0lDQUFDSUVSUTEwSUFCQnl3RTJBaHdnQUNBSk5nSVVJQUFnQkRZQ0RFRUFJUkFNaWdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FnQUNBRUlBb1FyWUNBZ0FBaUJFVU5jaUFBUWMwQk5nSWNJQUFnQ2pZQ0ZDQUFJQVEyQWd4QkFDRVFESWtCQ3dKQUlBc3RBQUJCVUdvaUVFSC9BWEZCQ2s4TkFDQUFJQkE2QUNvZ0MwRUJhaUVLUWJZQklSQU1jQXNnQUNnQ0JDRUVJQUJCQURZQ0JDQUFJQVFnQ3hDdGdJQ0FBQ0lFUlExd0lBQkJ6d0UyQWh3Z0FDQUxOZ0lVSUFBZ0JEWUNERUVBSVJBTWlBRUxJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFR1FzNENBQURZQ0VDQUFRUWcyQWd3Z0FFRUFOZ0lBUVFBaEVBeUhBUXNnQVVFVlJnMC9JQUJCQURZQ0hDQUFJQXcyQWhRZ0FFSE1qb0NBQURZQ0VDQUFRU0EyQWd4QkFDRVFESVlCQ3lBQVFZRUVPd0VvSUFBb0FnUWhFQ0FBUWdBM0F3QWdBQ0FRSUF4QkFXb2lEQkNyZ0lDQUFDSVFSUTA0SUFCQjB3RTJBaHdnQUNBTU5nSVVJQUFnRURZQ0RFRUFJUkFNaFFFTElBQkJBRFlDQUF0QkFDRVFJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFSFltNENBQURZQ0VDQUFRUWcyQWd3TWd3RUxJQUFvQWdRaEVDQUFRZ0EzQXdBZ0FDQVFJQXRCQVdvaUN4Q3JnSUNBQUNJUURRRkJ4Z0VoRUF4cEN5QUFRUUk2QUNnTVZRc2dBRUhWQVRZQ0hDQUFJQXMyQWhRZ0FDQVFOZ0lNUVFBaEVBeUFBUXNnRUVFVlJnMDNJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFR2tqSUNBQURZQ0VDQUFRUkEyQWd4QkFDRVFESDhMSUFBdEFEUkJBVWNOTkNBQUlBUWdBaEM4Z0lDQUFDSVFSUTAwSUJCQkZVY05OU0FBUWR3Qk5nSWNJQUFnQkRZQ0ZDQUFRZFdXZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNZmd0QkFDRVFJQUJCQURZQ0hDQUFRYStMZ0lBQU5nSVFJQUJCQWpZQ0RDQUFJQlJCQVdvMkFoUU1mUXRCQUNFUURHTUxRUUloRUF4aUMwRU5JUkFNWVF0QkR5RVFER0FMUVNVaEVBeGZDMEVUSVJBTVhndEJGU0VRREYwTFFSWWhFQXhjQzBFWElSQU1Xd3RCR0NFUURGb0xRUmtoRUF4WkMwRWFJUkFNV0F0Qkd5RVFERmNMUVJ3aEVBeFdDMEVkSVJBTVZRdEJIeUVRREZRTFFTRWhFQXhUQzBFaklSQU1VZ3RCeGdBaEVBeFJDMEV1SVJBTVVBdEJMeUVRREU4TFFUc2hFQXhPQzBFOUlSQU1UUXRCeUFBaEVBeE1DMEhKQUNFUURFc0xRY3NBSVJBTVNndEJ6QUFoRUF4SkMwSE9BQ0VRREVnTFFkRUFJUkFNUnd0QjFRQWhFQXhHQzBIWUFDRVFERVVMUWRrQUlSQU1SQXRCMndBaEVBeERDMEhrQUNFUURFSUxRZVVBSVJBTVFRdEI4UUFoRUF4QUMwSDBBQ0VRREQ4TFFZMEJJUkFNUGd0Qmx3RWhFQXc5QzBHcEFTRVFERHdMUWF3QklSQU1Pd3RCd0FFaEVBdzZDMEc1QVNFUUREa0xRYThCSVJBTU9BdEJzUUVoRUF3M0MwR3lBU0VRRERZTFFiUUJJUkFNTlF0QnRRRWhFQXcwQzBHNkFTRVFERE1MUWIwQklSQU1NZ3RCdndFaEVBd3hDMEhCQVNFUUREQUxJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFSHBpNENBQURZQ0VDQUFRUjgyQWd4QkFDRVFERWdMSUFCQjJ3RTJBaHdnQUNBRU5nSVVJQUJCK3BhQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF4SEN5QUFRZmdBTmdJY0lBQWdERFlDRkNBQVFjcVlnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1SZ3NnQUVIUkFEWUNIQ0FBSUFVMkFoUWdBRUd3bDRDQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVVTElBQkIrUUEyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTVJBc2dBRUg0QURZQ0hDQUFJQUUyQWhRZ0FFSEttSUNBQURZQ0VDQUFRUlUyQWd4QkFDRVFERU1MSUFCQjVBQTJBaHdnQUNBQk5nSVVJQUJCNDVlQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF4Q0N5QUFRZGNBTmdJY0lBQWdBVFlDRkNBQVFjbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1RUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYm1OZ0lBQU5nSVFJQUJCR2pZQ0RFRUFJUkFNUUFzZ0FFSENBRFlDSENBQUlBRTJBaFFnQUVIam1JQ0FBRFlDRUNBQVFSVTJBZ3hCQUNFUUREOExJQUJCQURZQ0JDQUFJQThnRHhDeGdJQ0FBQ0lFUlEwQklBQkJPallDSENBQUlBUTJBZ3dnQUNBUFFRRnFOZ0lVUVFBaEVBdytDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXNZQ0FnQUFpQkVVTkFDQUFRVHMyQWh3Z0FDQUVOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU1QZ3NnQVVFQmFpRUJEQzBMSUE5QkFXb2hBUXd0Q3lBQVFRQTJBaHdnQUNBUE5nSVVJQUJCNUpLQWdBQTJBaEFnQUVFRU5nSU1RUUFoRUF3N0N5QUFRVFkyQWh3Z0FDQUVOZ0lVSUFBZ0FqWUNERUVBSVJBTU9nc2dBRUV1TmdJY0lBQWdEallDRkNBQUlBUTJBZ3hCQUNFUUREa0xJQUJCMEFBMkFod2dBQ0FCTmdJVUlBQkJrWmlBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXc0Q3lBTlFRRnFJUUVNTEFzZ0FFRVZOZ0ljSUFBZ0FUWUNGQ0FBUVlLWmdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU5nc2dBRUViTmdJY0lBQWdBVFlDRkNBQVFaR1hnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1OUXNnQUVFUE5nSWNJQUFnQVRZQ0ZDQUFRWkdYZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTkFzZ0FFRUxOZ0ljSUFBZ0FUWUNGQ0FBUVpHWGdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU13c2dBRUVhTmdJY0lBQWdBVFlDRkNBQVFZS1pnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1NZ3NnQUVFTE5nSWNJQUFnQVRZQ0ZDQUFRWUtaZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTVFzZ0FFRUtOZ0ljSUFBZ0FUWUNGQ0FBUWVTV2dJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU1Bc2dBRUVlTmdJY0lBQWdBVFlDRkNBQVFmbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1Md3NnQUVFQU5nSWNJQUFnRURZQ0ZDQUFRZHFOZ0lBQU5nSVFJQUJCRkRZQ0RFRUFJUkFNTGdzZ0FFRUVOZ0ljSUFBZ0FUWUNGQ0FBUWJDWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTUxRc2dBRUVBTmdJQUlBdEJBV29oQ3d0QnVBRWhFQXdTQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRZlVBSVJBTUVRc2dBU0VCQWtBZ0FDMEFLVUVGUncwQVFlTUFJUkFNRVF0QjRnQWhFQXdRQzBFQUlSQWdBRUVBTmdJY0lBQkI1SkdBZ0FBMkFoQWdBRUVITmdJTUlBQWdGRUVCYWpZQ0ZBd29DeUFBUVFBMkFnQWdGMEVCYWlFQlFjQUFJUkFNRGd0QkFTRUJDeUFBSUFFNkFDd2dBRUVBTmdJQUlCZEJBV29oQVF0QktDRVFEQXNMSUFFaEFRdEJPQ0VRREFrTEFrQWdBU0lQSUFKR0RRQURRQUpBSUE4dEFBQkJnTDZBZ0FCcUxRQUFJZ0ZCQVVZTkFDQUJRUUpIRFFNZ0QwRUJhaUVCREFRTElBOUJBV29pRHlBQ1J3MEFDMEUrSVJBTUlndEJQaUVRRENFTElBQkJBRG9BTENBUElRRU1BUXRCQ3lFUURBWUxRVG9oRUF3RkN5QUJRUUZxSVFGQkxTRVFEQVFMSUFBZ0FUb0FMQ0FBUVFBMkFnQWdGa0VCYWlFQlFRd2hFQXdEQ3lBQVFRQTJBZ0FnRjBFQmFpRUJRUW9oRUF3Q0N5QUFRUUEyQWdBTElBQkJBRG9BTENBTklRRkJDU0VRREFBTEMwRUFJUkFnQUVFQU5nSWNJQUFnQ3pZQ0ZDQUFRYzJRZ0lBQU5nSVFJQUJCQ1RZQ0RBd1hDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0NqWUNGQ0FBUWVtS2dJQUFOZ0lRSUFCQkNUWUNEQXdXQzBFQUlSQWdBRUVBTmdJY0lBQWdDVFlDRkNBQVFiZVFnSUFBTmdJUUlBQkJDVFlDREF3VkMwRUFJUkFnQUVFQU5nSWNJQUFnQ0RZQ0ZDQUFRWnlSZ0lBQU5nSVFJQUJCQ1RZQ0RBd1VDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWMyUWdJQUFOZ0lRSUFCQkNUWUNEQXdUQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFlbUtnSUFBTmdJUUlBQkJDVFlDREF3U0MwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYmVRZ0lBQU5nSVFJQUJCQ1RZQ0RBd1JDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVp5UmdJQUFOZ0lRSUFCQkNUWUNEQXdRQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaZVZnSUFBTmdJUUlBQkJEellDREF3UEMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWmVWZ0lBQU5nSVFJQUJCRHpZQ0RBd09DMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWNDU2dJQUFOZ0lRSUFCQkN6WUNEQXdOQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaV0pnSUFBTmdJUUlBQkJDellDREF3TUMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZUdQZ0lBQU5nSVFJQUJCQ2pZQ0RBd0xDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZ1UGdJQUFOZ0lRSUFCQkNqWUNEQXdLQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFmR1pnSUFBTmdJUUlBQkJBallDREF3SkMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRY1NVZ0lBQU5nSVFJQUJCQWpZQ0RBd0lDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZLVmdJQUFOZ0lRSUFCQkFqWUNEQXdIQ3lBQVFRSTJBaHdnQUNBQk5nSVVJQUJCbkpxQWdBQTJBaEFnQUVFV05nSU1RUUFoRUF3R0MwRUJJUkFNQlF0QjFBQWhFQ0FCSWdRZ0FrWU5CQ0FEUVFocUlBQWdCQ0FDUWRqQ2dJQUFRUW9ReFlDQWdBQWdBeWdDRENFRUlBTW9BZ2dPQXdFRUFnQUxFTXFBZ0lBQUFBc2dBRUVBTmdJY0lBQkJ0WnFBZ0FBMkFoQWdBRUVYTmdJTUlBQWdCRUVCYWpZQ0ZFRUFJUkFNQWdzZ0FFRUFOZ0ljSUFBZ0JEWUNGQ0FBUWNxYWdJQUFOZ0lRSUFCQkNUWUNERUVBSVJBTUFRc0NRQ0FCSWdRZ0FrY05BRUVpSVJBTUFRc2dBRUdKZ0lDQUFEWUNDQ0FBSUFRMkFnUkJJU0VRQ3lBRFFSQnFKSUNBZ0lBQUlCQUxyd0VCQW44Z0FTZ0NBQ0VHQWtBQ1FDQUNJQU5HRFFBZ0JDQUdhaUVFSUFZZ0Eyb2dBbXNoQnlBQ0lBWkJmM01nQldvaUJtb2hCUU5BQWtBZ0FpMEFBQ0FFTFFBQVJnMEFRUUloQkF3REN3SkFJQVlOQUVFQUlRUWdCU0VDREFNTElBWkJmMm9oQmlBRVFRRnFJUVFnQWtFQmFpSUNJQU5IRFFBTElBY2hCaUFESVFJTElBQkJBVFlDQUNBQklBWTJBZ0FnQUNBQ05nSUVEd3NnQVVFQU5nSUFJQUFnQkRZQ0FDQUFJQUkyQWdRTENnQWdBQkRIZ0lDQUFBdnlOZ0VMZnlPQWdJQ0FBRUVRYXlJQkpJQ0FnSUFBQWtCQkFDZ0NvTkNBZ0FBTkFFRUFFTXVBZ0lBQVFZRFVoSUFBYXlJQ1Fka0FTUTBBUVFBaEF3SkFRUUFvQXVEVGdJQUFJZ1FOQUVFQVFuODNBdXpUZ0lBQVFRQkNnSUNFZ0lDQXdBQTNBdVRUZ0lBQVFRQWdBVUVJYWtGd2NVSFlxdFdxQlhNaUJEWUM0Tk9BZ0FCQkFFRUFOZ0wwMDRDQUFFRUFRUUEyQXNUVGdJQUFDMEVBSUFJMkFzelRnSUFBUVFCQmdOU0VnQUEyQXNqVGdJQUFRUUJCZ05TRWdBQTJBcGpRZ0lBQVFRQWdCRFlDck5DQWdBQkJBRUYvTmdLbzBJQ0FBQU5BSUFOQnhOQ0FnQUJxSUFOQnVOQ0FnQUJxSWdRMkFnQWdCQ0FEUWJEUWdJQUFhaUlGTmdJQUlBTkJ2TkNBZ0FCcUlBVTJBZ0FnQTBITTBJQ0FBR29nQTBIQTBJQ0FBR29pQlRZQ0FDQUZJQVEyQWdBZ0EwSFUwSUNBQUdvZ0EwSEkwSUNBQUdvaUJEWUNBQ0FFSUFVMkFnQWdBMEhRMElDQUFHb2dCRFlDQUNBRFFTQnFJZ05CZ0FKSERRQUxRWURVaElBQVFYaEJnTlNFZ0FCclFROXhRUUJCZ05TRWdBQkJDR3BCRDNFYklnTnFJZ1JCQkdvZ0FrRklhaUlGSUFOcklnTkJBWEkyQWdCQkFFRUFLQUx3MDRDQUFEWUNwTkNBZ0FCQkFDQUROZ0tVMElDQUFFRUFJQVEyQXFEUWdJQUFRWURVaElBQUlBVnFRVGcyQWdRTEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFCQjdBRkxEUUFDUUVFQUtBS0kwSUNBQUNJR1FSQWdBRUVUYWtGd2NTQUFRUXRKR3lJQ1FRTjJJZ1IySWdOQkEzRkZEUUFDUUFKQUlBTkJBWEVnQkhKQkFYTWlCVUVEZENJRVFiRFFnSUFBYWlJRElBUkJ1TkNBZ0FCcUtBSUFJZ1FvQWdnaUFrY05BRUVBSUFaQmZpQUZkM0UyQW9qUWdJQUFEQUVMSUFNZ0FqWUNDQ0FDSUFNMkFnd0xJQVJCQ0dvaEF5QUVJQVZCQTNRaUJVRURjallDQkNBRUlBVnFJZ1FnQkNnQ0JFRUJjallDQkF3TUN5QUNRUUFvQXBEUWdJQUFJZ2RORFFFQ1FDQURSUTBBQWtBQ1FDQURJQVIwUVFJZ0JIUWlBMEVBSUFOcmNuRWlBMEVBSUFOcmNVRi9haUlESUFOQkRIWkJFSEVpQTNZaUJFRUZka0VJY1NJRklBTnlJQVFnQlhZaUEwRUNka0VFY1NJRWNpQURJQVIySWdOQkFYWkJBbkVpQkhJZ0F5QUVkaUlEUVFGMlFRRnhJZ1J5SUFNZ0JIWnFJZ1JCQTNRaUEwR3cwSUNBQUdvaUJTQURRYmpRZ0lBQWFpZ0NBQ0lES0FJSUlnQkhEUUJCQUNBR1FYNGdCSGR4SWdZMkFvalFnSUFBREFFTElBVWdBRFlDQ0NBQUlBVTJBZ3dMSUFNZ0FrRURjallDQkNBRElBUkJBM1FpQkdvZ0JDQUNheUlGTmdJQUlBTWdBbW9pQUNBRlFRRnlOZ0lFQWtBZ0IwVU5BQ0FIUVhoeFFiRFFnSUFBYWlFQ1FRQW9BcHpRZ0lBQUlRUUNRQUpBSUFaQkFTQUhRUU4yZENJSWNRMEFRUUFnQmlBSWNqWUNpTkNBZ0FBZ0FpRUlEQUVMSUFJb0FnZ2hDQXNnQ0NBRU5nSU1JQUlnQkRZQ0NDQUVJQUkyQWd3Z0JDQUlOZ0lJQ3lBRFFRaHFJUU5CQUNBQU5nS2MwSUNBQUVFQUlBVTJBcERRZ0lBQURBd0xRUUFvQW96UWdJQUFJZ2xGRFFFZ0NVRUFJQWxyY1VGL2FpSURJQU5CREhaQkVIRWlBM1lpQkVFRmRrRUljU0lGSUFOeUlBUWdCWFlpQTBFQ2RrRUVjU0lFY2lBRElBUjJJZ05CQVhaQkFuRWlCSElnQXlBRWRpSURRUUYyUVFGeElnUnlJQU1nQkhacVFRSjBRYmpTZ0lBQWFpZ0NBQ0lBS0FJRVFYaHhJQUpySVFRZ0FDRUZBa0FEUUFKQUlBVW9BaEFpQXcwQUlBVkJGR29vQWdBaUEwVU5BZ3NnQXlnQ0JFRjRjU0FDYXlJRklBUWdCU0FFU1NJRkd5RUVJQU1nQUNBRkd5RUFJQU1oQlF3QUN3c2dBQ2dDR0NFS0FrQWdBQ2dDRENJSUlBQkdEUUFnQUNnQ0NDSURRUUFvQXBqUWdJQUFTUm9nQ0NBRE5nSUlJQU1nQ0RZQ0RBd0xDd0pBSUFCQkZHb2lCU2dDQUNJRERRQWdBQ2dDRUNJRFJRMERJQUJCRUdvaEJRc0RRQ0FGSVFzZ0F5SUlRUlJxSWdVb0FnQWlBdzBBSUFoQkVHb2hCU0FJS0FJUUlnTU5BQXNnQzBFQU5nSUFEQW9MUVg4aEFpQUFRYjkvU3cwQUlBQkJFMm9pQTBGd2NTRUNRUUFvQW96UWdJQUFJZ2RGRFFCQkFDRUxBa0FnQWtHQUFra05BRUVmSVFzZ0FrSC8vLzhIU3cwQUlBTkJDSFlpQXlBRFFZRCtQMnBCRUhaQkNIRWlBM1FpQkNBRVFZRGdIMnBCRUhaQkJIRWlCSFFpQlNBRlFZQ0FEMnBCRUhaQkFuRWlCWFJCRDNZZ0F5QUVjaUFGY21zaUEwRUJkQ0FDSUFOQkZXcDJRUUZ4Y2tFY2FpRUxDMEVBSUFKcklRUUNRQUpBQWtBQ1FDQUxRUUowUWJqU2dJQUFhaWdDQUNJRkRRQkJBQ0VEUVFBaENBd0JDMEVBSVFNZ0FrRUFRUmtnQzBFQmRtc2dDMEVmUmh0MElRQkJBQ0VJQTBBQ1FDQUZLQUlFUVhoeElBSnJJZ1lnQkU4TkFDQUdJUVFnQlNFSUlBWU5BRUVBSVFRZ0JTRUlJQVVoQXd3REN5QURJQVZCRkdvb0FnQWlCaUFHSUFVZ0FFRWRka0VFY1dwQkVHb29BZ0FpQlVZYklBTWdCaHNoQXlBQVFRRjBJUUFnQlEwQUN3c0NRQ0FESUFoeURRQkJBQ0VJUVFJZ0MzUWlBMEVBSUFOcmNpQUhjU0lEUlEwRElBTkJBQ0FEYTNGQmYyb2lBeUFEUVF4MlFSQnhJZ04ySWdWQkJYWkJDSEVpQUNBRGNpQUZJQUIySWdOQkFuWkJCSEVpQlhJZ0F5QUZkaUlEUVFGMlFRSnhJZ1Z5SUFNZ0JYWWlBMEVCZGtFQmNTSUZjaUFESUFWMmFrRUNkRUc0MG9DQUFHb29BZ0FoQXdzZ0EwVU5BUXNEUUNBREtBSUVRWGh4SUFKcklnWWdCRWtoQUFKQUlBTW9BaEFpQlEwQUlBTkJGR29vQWdBaEJRc2dCaUFFSUFBYklRUWdBeUFJSUFBYklRZ2dCU0VESUFVTkFBc0xJQWhGRFFBZ0JFRUFLQUtRMElDQUFDQUNhMDhOQUNBSUtBSVlJUXNDUUNBSUtBSU1JZ0FnQ0VZTkFDQUlLQUlJSWdOQkFDZ0NtTkNBZ0FCSkdpQUFJQU0yQWdnZ0F5QUFOZ0lNREFrTEFrQWdDRUVVYWlJRktBSUFJZ01OQUNBSUtBSVFJZ05GRFFNZ0NFRVFhaUVGQ3dOQUlBVWhCaUFESWdCQkZHb2lCU2dDQUNJRERRQWdBRUVRYWlFRklBQW9BaEFpQXcwQUN5QUdRUUEyQWdBTUNBc0NRRUVBS0FLUTBJQ0FBQ0lESUFKSkRRQkJBQ2dDbk5DQWdBQWhCQUpBQWtBZ0F5QUNheUlGUVJCSkRRQWdCQ0FDYWlJQUlBVkJBWEkyQWdSQkFDQUZOZ0tRMElDQUFFRUFJQUEyQXB6UWdJQUFJQVFnQTJvZ0JUWUNBQ0FFSUFKQkEzSTJBZ1FNQVFzZ0JDQURRUU55TmdJRUlBUWdBMm9pQXlBREtBSUVRUUZ5TmdJRVFRQkJBRFlDbk5DQWdBQkJBRUVBTmdLUTBJQ0FBQXNnQkVFSWFpRUREQW9MQWtCQkFDZ0NsTkNBZ0FBaUFDQUNUUTBBUVFBb0FxRFFnSUFBSWdNZ0Ftb2lCQ0FBSUFKcklnVkJBWEkyQWdSQkFDQUZOZ0tVMElDQUFFRUFJQVEyQXFEUWdJQUFJQU1nQWtFRGNqWUNCQ0FEUVFocUlRTU1DZ3NDUUFKQVFRQW9BdURUZ0lBQVJRMEFRUUFvQXVqVGdJQUFJUVFNQVF0QkFFSi9Od0xzMDRDQUFFRUFRb0NBaElDQWdNQUFOd0xrMDRDQUFFRUFJQUZCREdwQmNIRkIyS3JWcWdWek5nTGcwNENBQUVFQVFRQTJBdlRUZ0lBQVFRQkJBRFlDeE5PQWdBQkJnSUFFSVFRTFFRQWhBd0pBSUFRZ0FrSEhBR29pQjJvaUJrRUFJQVJySWd0eElnZ2dBa3NOQUVFQVFUQTJBdmpUZ0lBQURBb0xBa0JCQUNnQ3dOT0FnQUFpQTBVTkFBSkFRUUFvQXJqVGdJQUFJZ1FnQ0dvaUJTQUVUUTBBSUFVZ0EwME5BUXRCQUNFRFFRQkJNRFlDK05PQWdBQU1DZ3RCQUMwQXhOT0FnQUJCQkhFTkJBSkFBa0FDUUVFQUtBS2cwSUNBQUNJRVJRMEFRY2pUZ0lBQUlRTURRQUpBSUFNb0FnQWlCU0FFU3cwQUlBVWdBeWdDQkdvZ0JFc05Bd3NnQXlnQ0NDSUREUUFMQzBFQUVNdUFnSUFBSWdCQmYwWU5CU0FJSVFZQ1FFRUFLQUxrMDRDQUFDSURRWDlxSWdRZ0FIRkZEUUFnQ0NBQWF5QUVJQUJxUVFBZ0EydHhhaUVHQ3lBR0lBSk5EUVVnQmtIKy8vLy9CMHNOQlFKQVFRQW9Bc0RUZ0lBQUlnTkZEUUJCQUNnQ3VOT0FnQUFpQkNBR2FpSUZJQVJORFFZZ0JTQURTdzBHQ3lBR0VNdUFnSUFBSWdNZ0FFY05BUXdIQ3lBR0lBQnJJQXR4SWdaQi92Ly8vd2RMRFFRZ0JoRExnSUNBQUNJQUlBTW9BZ0FnQXlnQ0JHcEdEUU1nQUNFREN3SkFJQU5CZjBZTkFDQUNRY2dBYWlBR1RRMEFBa0FnQnlBR2EwRUFLQUxvMDRDQUFDSUVha0VBSUFScmNTSUVRZjcvLy84SFRRMEFJQU1oQUF3SEN3SkFJQVFReTRDQWdBQkJmMFlOQUNBRUlBWnFJUVlnQXlFQURBY0xRUUFnQm1zUXk0Q0FnQUFhREFRTElBTWhBQ0FEUVg5SERRVU1Bd3RCQUNFSURBY0xRUUFoQUF3RkN5QUFRWDlIRFFJTFFRQkJBQ2dDeE5PQWdBQkJCSEkyQXNUVGdJQUFDeUFJUWY3Ly8vOEhTdzBCSUFnUXk0Q0FnQUFoQUVFQUVNdUFnSUFBSVFNZ0FFRi9SZzBCSUFOQmYwWU5BU0FBSUFOUERRRWdBeUFBYXlJR0lBSkJPR3BORFFFTFFRQkJBQ2dDdU5PQWdBQWdCbW9pQXpZQ3VOT0FnQUFDUUNBRFFRQW9BcnpUZ0lBQVRRMEFRUUFnQXpZQ3ZOT0FnQUFMQWtBQ1FBSkFBa0JCQUNnQ29OQ0FnQUFpQkVVTkFFSEkwNENBQUNFREEwQWdBQ0FES0FJQUlnVWdBeWdDQkNJSWFrWU5BaUFES0FJSUlnTU5BQXdEQ3dzQ1FBSkFRUUFvQXBqUWdJQUFJZ05GRFFBZ0FDQURUdzBCQzBFQUlBQTJBcGpRZ0lBQUMwRUFJUU5CQUNBR05nTE0wNENBQUVFQUlBQTJBc2pUZ0lBQVFRQkJmellDcU5DQWdBQkJBRUVBS0FMZzA0Q0FBRFlDck5DQWdBQkJBRUVBTmdMVTA0Q0FBQU5BSUFOQnhOQ0FnQUJxSUFOQnVOQ0FnQUJxSWdRMkFnQWdCQ0FEUWJEUWdJQUFhaUlGTmdJQUlBTkJ2TkNBZ0FCcUlBVTJBZ0FnQTBITTBJQ0FBR29nQTBIQTBJQ0FBR29pQlRZQ0FDQUZJQVEyQWdBZ0EwSFUwSUNBQUdvZ0EwSEkwSUNBQUdvaUJEWUNBQ0FFSUFVMkFnQWdBMEhRMElDQUFHb2dCRFlDQUNBRFFTQnFJZ05CZ0FKSERRQUxJQUJCZUNBQWEwRVBjVUVBSUFCQkNHcEJEM0ViSWdOcUlnUWdCa0ZJYWlJRklBTnJJZ05CQVhJMkFnUkJBRUVBS0FMdzA0Q0FBRFlDcE5DQWdBQkJBQ0FETmdLVTBJQ0FBRUVBSUFRMkFxRFFnSUFBSUFBZ0JXcEJPRFlDQkF3Q0N5QURMUUFNUVFoeERRQWdCQ0FGU1EwQUlBUWdBRThOQUNBRVFYZ2dCR3RCRDNGQkFDQUVRUWhxUVE5eEd5SUZhaUlBUVFBb0FwVFFnSUFBSUFacUlnc2dCV3NpQlVFQmNqWUNCQ0FESUFnZ0JtbzJBZ1JCQUVFQUtBTHcwNENBQURZQ3BOQ0FnQUJCQUNBRk5nS1UwSUNBQUVFQUlBQTJBcURRZ0lBQUlBUWdDMnBCT0RZQ0JBd0JDd0pBSUFCQkFDZ0NtTkNBZ0FBaUNFOE5BRUVBSUFBMkFwalFnSUFBSUFBaENBc2dBQ0FHYWlFRlFjalRnSUFBSVFNQ1FBSkFBa0FDUUFKQUFrQUNRQU5BSUFNb0FnQWdCVVlOQVNBREtBSUlJZ01OQUF3Q0N3c2dBeTBBREVFSWNVVU5BUXRCeU5PQWdBQWhBd05BQWtBZ0F5Z0NBQ0lGSUFSTERRQWdCU0FES0FJRWFpSUZJQVJMRFFNTElBTW9BZ2doQXd3QUN3c2dBeUFBTmdJQUlBTWdBeWdDQkNBR2FqWUNCQ0FBUVhnZ0FHdEJEM0ZCQUNBQVFRaHFRUTl4RzJvaUN5QUNRUU55TmdJRUlBVkJlQ0FGYTBFUGNVRUFJQVZCQ0dwQkQzRWJhaUlHSUFzZ0Ftb2lBbXNoQXdKQUlBWWdCRWNOQUVFQUlBSTJBcURRZ0lBQVFRQkJBQ2dDbE5DQWdBQWdBMm9pQXpZQ2xOQ0FnQUFnQWlBRFFRRnlOZ0lFREFNTEFrQWdCa0VBS0FLYzBJQ0FBRWNOQUVFQUlBSTJBcHpRZ0lBQVFRQkJBQ2dDa05DQWdBQWdBMm9pQXpZQ2tOQ0FnQUFnQWlBRFFRRnlOZ0lFSUFJZ0Eyb2dBellDQUF3REN3SkFJQVlvQWdRaUJFRURjVUVCUncwQUlBUkJlSEVoQndKQUFrQWdCRUgvQVVzTkFDQUdLQUlJSWdVZ0JFRURkaUlJUVFOMFFiRFFnSUFBYWlJQVJob0NRQ0FHS0FJTUlnUWdCVWNOQUVFQVFRQW9Bb2pRZ0lBQVFYNGdDSGR4TmdLSTBJQ0FBQXdDQ3lBRUlBQkdHaUFFSUFVMkFnZ2dCU0FFTmdJTURBRUxJQVlvQWhnaENRSkFBa0FnQmlnQ0RDSUFJQVpHRFFBZ0JpZ0NDQ0lFSUFoSkdpQUFJQVEyQWdnZ0JDQUFOZ0lNREFFTEFrQWdCa0VVYWlJRUtBSUFJZ1VOQUNBR1FSQnFJZ1FvQWdBaUJRMEFRUUFoQUF3QkN3TkFJQVFoQ0NBRklnQkJGR29pQkNnQ0FDSUZEUUFnQUVFUWFpRUVJQUFvQWhBaUJRMEFDeUFJUVFBMkFnQUxJQWxGRFFBQ1FBSkFJQVlnQmlnQ0hDSUZRUUowUWJqU2dJQUFhaUlFS0FJQVJ3MEFJQVFnQURZQ0FDQUFEUUZCQUVFQUtBS00wSUNBQUVGK0lBVjNjVFlDak5DQWdBQU1BZ3NnQ1VFUVFSUWdDU2dDRUNBR1JodHFJQUEyQWdBZ0FFVU5BUXNnQUNBSk5nSVlBa0FnQmlnQ0VDSUVSUTBBSUFBZ0JEWUNFQ0FFSUFBMkFoZ0xJQVlvQWhRaUJFVU5BQ0FBUVJScUlBUTJBZ0FnQkNBQU5nSVlDeUFISUFOcUlRTWdCaUFIYWlJR0tBSUVJUVFMSUFZZ0JFRitjVFlDQkNBQ0lBTnFJQU0yQWdBZ0FpQURRUUZ5TmdJRUFrQWdBMEgvQVVzTkFDQURRWGh4UWJEUWdJQUFhaUVFQWtBQ1FFRUFLQUtJMElDQUFDSUZRUUVnQTBFRGRuUWlBM0VOQUVFQUlBVWdBM0kyQW9qUWdJQUFJQVFoQXd3QkN5QUVLQUlJSVFNTElBTWdBallDRENBRUlBSTJBZ2dnQWlBRU5nSU1JQUlnQXpZQ0NBd0RDMEVmSVFRQ1FDQURRZi8vL3dkTERRQWdBMEVJZGlJRUlBUkJnUDQvYWtFUWRrRUljU0lFZENJRklBVkJnT0FmYWtFUWRrRUVjU0lGZENJQUlBQkJnSUFQYWtFUWRrRUNjU0lBZEVFUGRpQUVJQVZ5SUFCeWF5SUVRUUYwSUFNZ0JFRVZhblpCQVhGeVFSeHFJUVFMSUFJZ0JEWUNIQ0FDUWdBM0FoQWdCRUVDZEVHNDBvQ0FBR29oQlFKQVFRQW9Bb3pRZ0lBQUlnQkJBU0FFZENJSWNRMEFJQVVnQWpZQ0FFRUFJQUFnQ0hJMkFvelFnSUFBSUFJZ0JUWUNHQ0FDSUFJMkFnZ2dBaUFDTmdJTURBTUxJQU5CQUVFWklBUkJBWFpySUFSQkgwWWJkQ0VFSUFVb0FnQWhBQU5BSUFBaUJTZ0NCRUY0Y1NBRFJnMENJQVJCSFhZaEFDQUVRUUYwSVFRZ0JTQUFRUVJ4YWtFUWFpSUlLQUlBSWdBTkFBc2dDQ0FDTmdJQUlBSWdCVFlDR0NBQ0lBSTJBZ3dnQWlBQ05nSUlEQUlMSUFCQmVDQUFhMEVQY1VFQUlBQkJDR3BCRDNFYklnTnFJZ3NnQmtGSWFpSUlJQU5ySWdOQkFYSTJBZ1FnQUNBSWFrRTROZ0lFSUFRZ0JVRTNJQVZyUVE5eFFRQWdCVUZKYWtFUGNSdHFRVUZxSWdnZ0NDQUVRUkJxU1JzaUNFRWpOZ0lFUVFCQkFDZ0M4Tk9BZ0FBMkFxVFFnSUFBUVFBZ0F6WUNsTkNBZ0FCQkFDQUxOZ0tnMElDQUFDQUlRUkJxUVFBcEF0RFRnSUFBTndJQUlBaEJBQ2tDeU5PQWdBQTNBZ2hCQUNBSVFRaHFOZ0xRMDRDQUFFRUFJQVkyQXN6VGdJQUFRUUFnQURZQ3lOT0FnQUJCQUVFQU5nTFUwNENBQUNBSVFTUnFJUU1EUUNBRFFRYzJBZ0FnQTBFRWFpSURJQVZKRFFBTElBZ2dCRVlOQXlBSUlBZ29BZ1JCZm5FMkFnUWdDQ0FJSUFScklnQTJBZ0FnQkNBQVFRRnlOZ0lFQWtBZ0FFSC9BVXNOQUNBQVFYaHhRYkRRZ0lBQWFpRURBa0FDUUVFQUtBS0kwSUNBQUNJRlFRRWdBRUVEZG5RaUFIRU5BRUVBSUFVZ0FISTJBb2pRZ0lBQUlBTWhCUXdCQ3lBREtBSUlJUVVMSUFVZ0JEWUNEQ0FESUFRMkFnZ2dCQ0FETmdJTUlBUWdCVFlDQ0F3RUMwRWZJUU1DUUNBQVFmLy8vd2RMRFFBZ0FFRUlkaUlESUFOQmdQNC9ha0VRZGtFSWNTSURkQ0lGSUFWQmdPQWZha0VRZGtFRWNTSUZkQ0lJSUFoQmdJQVBha0VRZGtFQ2NTSUlkRUVQZGlBRElBVnlJQWh5YXlJRFFRRjBJQUFnQTBFVmFuWkJBWEZ5UVJ4cUlRTUxJQVFnQXpZQ0hDQUVRZ0EzQWhBZ0EwRUNkRUc0MG9DQUFHb2hCUUpBUVFBb0FvelFnSUFBSWdoQkFTQURkQ0lHY1EwQUlBVWdCRFlDQUVFQUlBZ2dCbkkyQW96UWdJQUFJQVFnQlRZQ0dDQUVJQVEyQWdnZ0JDQUVOZ0lNREFRTElBQkJBRUVaSUFOQkFYWnJJQU5CSDBZYmRDRURJQVVvQWdBaENBTkFJQWdpQlNnQ0JFRjRjU0FBUmcwRElBTkJIWFloQ0NBRFFRRjBJUU1nQlNBSVFRUnhha0VRYWlJR0tBSUFJZ2dOQUFzZ0JpQUVOZ0lBSUFRZ0JUWUNHQ0FFSUFRMkFnd2dCQ0FFTmdJSURBTUxJQVVvQWdnaUF5QUNOZ0lNSUFVZ0FqWUNDQ0FDUVFBMkFoZ2dBaUFGTmdJTUlBSWdBellDQ0FzZ0MwRUlhaUVEREFVTElBVW9BZ2dpQXlBRU5nSU1JQVVnQkRZQ0NDQUVRUUEyQWhnZ0JDQUZOZ0lNSUFRZ0F6WUNDQXRCQUNnQ2xOQ0FnQUFpQXlBQ1RRMEFRUUFvQXFEUWdJQUFJZ1FnQW1vaUJTQURJQUpySWdOQkFYSTJBZ1JCQUNBRE5nS1UwSUNBQUVFQUlBVTJBcURRZ0lBQUlBUWdBa0VEY2pZQ0JDQUVRUWhxSVFNTUF3dEJBQ0VEUVFCQk1EWUMrTk9BZ0FBTUFnc0NRQ0FMUlEwQUFrQUNRQ0FJSUFnb0Fod2lCVUVDZEVHNDBvQ0FBR29pQXlnQ0FFY05BQ0FESUFBMkFnQWdBQTBCUVFBZ0IwRitJQVYzY1NJSE5nS00wSUNBQUF3Q0N5QUxRUkJCRkNBTEtBSVFJQWhHRzJvZ0FEWUNBQ0FBUlEwQkN5QUFJQXMyQWhnQ1FDQUlLQUlRSWdORkRRQWdBQ0FETmdJUUlBTWdBRFlDR0FzZ0NFRVVhaWdDQUNJRFJRMEFJQUJCRkdvZ0F6WUNBQ0FESUFBMkFoZ0xBa0FDUUNBRVFROUxEUUFnQ0NBRUlBSnFJZ05CQTNJMkFnUWdDQ0FEYWlJRElBTW9BZ1JCQVhJMkFnUU1BUXNnQ0NBQ2FpSUFJQVJCQVhJMkFnUWdDQ0FDUVFOeU5nSUVJQUFnQkdvZ0JEWUNBQUpBSUFSQi93RkxEUUFnQkVGNGNVR3cwSUNBQUdvaEF3SkFBa0JCQUNnQ2lOQ0FnQUFpQlVFQklBUkJBM1owSWdSeERRQkJBQ0FGSUFSeU5nS0kwSUNBQUNBRElRUU1BUXNnQXlnQ0NDRUVDeUFFSUFBMkFnd2dBeUFBTmdJSUlBQWdBellDRENBQUlBUTJBZ2dNQVF0Qkh5RURBa0FnQkVILy8vOEhTdzBBSUFSQkNIWWlBeUFEUVlEK1AycEJFSFpCQ0hFaUEzUWlCU0FGUVlEZ0gycEJFSFpCQkhFaUJYUWlBaUFDUVlDQUQycEJFSFpCQW5FaUFuUkJEM1lnQXlBRmNpQUNjbXNpQTBFQmRDQUVJQU5CRldwMlFRRnhja0VjYWlFREN5QUFJQU0yQWh3Z0FFSUFOd0lRSUFOQkFuUkJ1TktBZ0FCcUlRVUNRQ0FIUVFFZ0EzUWlBbkVOQUNBRklBQTJBZ0JCQUNBSElBSnlOZ0tNMElDQUFDQUFJQVUyQWhnZ0FDQUFOZ0lJSUFBZ0FEWUNEQXdCQ3lBRVFRQkJHU0FEUVFGMmF5QURRUjlHRzNRaEF5QUZLQUlBSVFJQ1FBTkFJQUlpQlNnQ0JFRjRjU0FFUmcwQklBTkJIWFloQWlBRFFRRjBJUU1nQlNBQ1FRUnhha0VRYWlJR0tBSUFJZ0lOQUFzZ0JpQUFOZ0lBSUFBZ0JUWUNHQ0FBSUFBMkFnd2dBQ0FBTmdJSURBRUxJQVVvQWdnaUF5QUFOZ0lNSUFVZ0FEWUNDQ0FBUVFBMkFoZ2dBQ0FGTmdJTUlBQWdBellDQ0FzZ0NFRUlhaUVEREFFTEFrQWdDa1VOQUFKQUFrQWdBQ0FBS0FJY0lnVkJBblJCdU5LQWdBQnFJZ01vQWdCSERRQWdBeUFJTmdJQUlBZ05BVUVBSUFsQmZpQUZkM0UyQW96UWdJQUFEQUlMSUFwQkVFRVVJQW9vQWhBZ0FFWWJhaUFJTmdJQUlBaEZEUUVMSUFnZ0NqWUNHQUpBSUFBb0FoQWlBMFVOQUNBSUlBTTJBaEFnQXlBSU5nSVlDeUFBUVJScUtBSUFJZ05GRFFBZ0NFRVVhaUFETmdJQUlBTWdDRFlDR0FzQ1FBSkFJQVJCRDBzTkFDQUFJQVFnQW1vaUEwRURjallDQkNBQUlBTnFJZ01nQXlnQ0JFRUJjallDQkF3QkN5QUFJQUpxSWdVZ0JFRUJjallDQkNBQUlBSkJBM0kyQWdRZ0JTQUVhaUFFTmdJQUFrQWdCMFVOQUNBSFFYaHhRYkRRZ0lBQWFpRUNRUUFvQXB6UWdJQUFJUU1DUUFKQVFRRWdCMEVEZG5RaUNDQUdjUTBBUVFBZ0NDQUdjallDaU5DQWdBQWdBaUVJREFFTElBSW9BZ2doQ0FzZ0NDQUROZ0lNSUFJZ0F6WUNDQ0FESUFJMkFnd2dBeUFJTmdJSUMwRUFJQVUyQXB6UWdJQUFRUUFnQkRZQ2tOQ0FnQUFMSUFCQkNHb2hBd3NnQVVFUWFpU0FnSUNBQUNBREN3b0FJQUFReVlDQWdBQUw0ZzBCQjM4Q1FDQUFSUTBBSUFCQmVHb2lBU0FBUVh4cUtBSUFJZ0pCZUhFaUFHb2hBd0pBSUFKQkFYRU5BQ0FDUVFOeFJRMEJJQUVnQVNnQ0FDSUNheUlCUVFBb0FwalFnSUFBSWdSSkRRRWdBaUFBYWlFQUFrQWdBVUVBS0FLYzBJQ0FBRVlOQUFKQUlBSkIvd0ZMRFFBZ0FTZ0NDQ0lFSUFKQkEzWWlCVUVEZEVHdzBJQ0FBR29pQmtZYUFrQWdBU2dDRENJQ0lBUkhEUUJCQUVFQUtBS0kwSUNBQUVGK0lBVjNjVFlDaU5DQWdBQU1Bd3NnQWlBR1Job2dBaUFFTmdJSUlBUWdBallDREF3Q0N5QUJLQUlZSVFjQ1FBSkFJQUVvQWd3aUJpQUJSZzBBSUFFb0FnZ2lBaUFFU1JvZ0JpQUNOZ0lJSUFJZ0JqWUNEQXdCQ3dKQUlBRkJGR29pQWlnQ0FDSUVEUUFnQVVFUWFpSUNLQUlBSWdRTkFFRUFJUVlNQVFzRFFDQUNJUVVnQkNJR1FSUnFJZ0lvQWdBaUJBMEFJQVpCRUdvaEFpQUdLQUlRSWdRTkFBc2dCVUVBTmdJQUN5QUhSUTBCQWtBQ1FDQUJJQUVvQWh3aUJFRUNkRUc0MG9DQUFHb2lBaWdDQUVjTkFDQUNJQVkyQWdBZ0JnMEJRUUJCQUNnQ2pOQ0FnQUJCZmlBRWQzRTJBb3pRZ0lBQURBTUxJQWRCRUVFVUlBY29BaEFnQVVZYmFpQUdOZ0lBSUFaRkRRSUxJQVlnQnpZQ0dBSkFJQUVvQWhBaUFrVU5BQ0FHSUFJMkFoQWdBaUFHTmdJWUN5QUJLQUlVSWdKRkRRRWdCa0VVYWlBQ05nSUFJQUlnQmpZQ0dBd0JDeUFES0FJRUlnSkJBM0ZCQTBjTkFDQURJQUpCZm5FMkFnUkJBQ0FBTmdLUTBJQ0FBQ0FCSUFCcUlBQTJBZ0FnQVNBQVFRRnlOZ0lFRHdzZ0FTQURUdzBBSUFNb0FnUWlBa0VCY1VVTkFBSkFBa0FnQWtFQ2NRMEFBa0FnQTBFQUtBS2cwSUNBQUVjTkFFRUFJQUUyQXFEUWdJQUFRUUJCQUNnQ2xOQ0FnQUFnQUdvaUFEWUNsTkNBZ0FBZ0FTQUFRUUZ5TmdJRUlBRkJBQ2dDbk5DQWdBQkhEUU5CQUVFQU5nS1EwSUNBQUVFQVFRQTJBcHpRZ0lBQUR3c0NRQ0FEUVFBb0FwelFnSUFBUncwQVFRQWdBVFlDbk5DQWdBQkJBRUVBS0FLUTBJQ0FBQ0FBYWlJQU5nS1EwSUNBQUNBQklBQkJBWEkyQWdRZ0FTQUFhaUFBTmdJQUR3c2dBa0Y0Y1NBQWFpRUFBa0FDUUNBQ1FmOEJTdzBBSUFNb0FnZ2lCQ0FDUVFOMklnVkJBM1JCc05DQWdBQnFJZ1pHR2dKQUlBTW9BZ3dpQWlBRVJ3MEFRUUJCQUNnQ2lOQ0FnQUJCZmlBRmQzRTJBb2pRZ0lBQURBSUxJQUlnQmtZYUlBSWdCRFlDQ0NBRUlBSTJBZ3dNQVFzZ0F5Z0NHQ0VIQWtBQ1FDQURLQUlNSWdZZ0EwWU5BQ0FES0FJSUlnSkJBQ2dDbU5DQWdBQkpHaUFHSUFJMkFnZ2dBaUFHTmdJTURBRUxBa0FnQTBFVWFpSUNLQUlBSWdRTkFDQURRUkJxSWdJb0FnQWlCQTBBUVFBaEJnd0JDd05BSUFJaEJTQUVJZ1pCRkdvaUFpZ0NBQ0lFRFFBZ0JrRVFhaUVDSUFZb0FoQWlCQTBBQ3lBRlFRQTJBZ0FMSUFkRkRRQUNRQUpBSUFNZ0F5Z0NIQ0lFUVFKMFFialNnSUFBYWlJQ0tBSUFSdzBBSUFJZ0JqWUNBQ0FHRFFGQkFFRUFLQUtNMElDQUFFRitJQVIzY1RZQ2pOQ0FnQUFNQWdzZ0IwRVFRUlFnQnlnQ0VDQURSaHRxSUFZMkFnQWdCa1VOQVFzZ0JpQUhOZ0lZQWtBZ0F5Z0NFQ0lDUlEwQUlBWWdBallDRUNBQ0lBWTJBaGdMSUFNb0FoUWlBa1VOQUNBR1FSUnFJQUkyQWdBZ0FpQUdOZ0lZQ3lBQklBQnFJQUEyQWdBZ0FTQUFRUUZ5TmdJRUlBRkJBQ2dDbk5DQWdBQkhEUUZCQUNBQU5nS1EwSUNBQUE4TElBTWdBa0YrY1RZQ0JDQUJJQUJxSUFBMkFnQWdBU0FBUVFGeU5nSUVDd0pBSUFCQi93RkxEUUFnQUVGNGNVR3cwSUNBQUdvaEFnSkFBa0JCQUNnQ2lOQ0FnQUFpQkVFQklBQkJBM1owSWdCeERRQkJBQ0FFSUFCeU5nS0kwSUNBQUNBQ0lRQU1BUXNnQWlnQ0NDRUFDeUFBSUFFMkFnd2dBaUFCTmdJSUlBRWdBallDRENBQklBQTJBZ2dQQzBFZklRSUNRQ0FBUWYvLy93ZExEUUFnQUVFSWRpSUNJQUpCZ1A0L2FrRVFka0VJY1NJQ2RDSUVJQVJCZ09BZmFrRVFka0VFY1NJRWRDSUdJQVpCZ0lBUGFrRVFka0VDY1NJR2RFRVBkaUFDSUFSeUlBWnlheUlDUVFGMElBQWdBa0VWYW5aQkFYRnlRUnhxSVFJTElBRWdBallDSENBQlFnQTNBaEFnQWtFQ2RFRzQwb0NBQUdvaEJBSkFBa0JCQUNnQ2pOQ0FnQUFpQmtFQklBSjBJZ054RFFBZ0JDQUJOZ0lBUVFBZ0JpQURjallDak5DQWdBQWdBU0FFTmdJWUlBRWdBVFlDQ0NBQklBRTJBZ3dNQVFzZ0FFRUFRUmtnQWtFQmRtc2dBa0VmUmh0MElRSWdCQ2dDQUNFR0FrQURRQ0FHSWdRb0FnUkJlSEVnQUVZTkFTQUNRUjEySVFZZ0FrRUJkQ0VDSUFRZ0JrRUVjV3BCRUdvaUF5Z0NBQ0lHRFFBTElBTWdBVFlDQUNBQklBUTJBaGdnQVNBQk5nSU1JQUVnQVRZQ0NBd0JDeUFFS0FJSUlnQWdBVFlDRENBRUlBRTJBZ2dnQVVFQU5nSVlJQUVnQkRZQ0RDQUJJQUEyQWdnTFFRQkJBQ2dDcU5DQWdBQkJmMm9pQVVGL0lBRWJOZ0tvMElDQUFBc0xCQUFBQUF0T0FBSkFJQUFOQUQ4QVFSQjBEd3NDUUNBQVFmLy9BM0VOQUNBQVFYOU1EUUFDUUNBQVFSQjJRQUFpQUVGL1J3MEFRUUJCTURZQytOT0FnQUJCZnc4TElBQkJFSFFQQ3hES2dJQ0FBQUFMOGdJQ0EzOEJmZ0pBSUFKRkRRQWdBQ0FCT2dBQUlBSWdBR29pQTBGL2FpQUJPZ0FBSUFKQkEwa05BQ0FBSUFFNkFBSWdBQ0FCT2dBQklBTkJmV29nQVRvQUFDQURRWDVxSUFFNkFBQWdBa0VIU1EwQUlBQWdBVG9BQXlBRFFYeHFJQUU2QUFBZ0FrRUpTUTBBSUFCQkFDQUFhMEVEY1NJRWFpSURJQUZCL3dGeFFZR0NoQWhzSWdFMkFnQWdBeUFDSUFSclFYeHhJZ1JxSWdKQmZHb2dBVFlDQUNBRVFRbEpEUUFnQXlBQk5nSUlJQU1nQVRZQ0JDQUNRWGhxSUFFMkFnQWdBa0YwYWlBQk5nSUFJQVJCR1VrTkFDQURJQUUyQWhnZ0F5QUJOZ0lVSUFNZ0FUWUNFQ0FESUFFMkFnd2dBa0Z3YWlBQk5nSUFJQUpCYkdvZ0FUWUNBQ0FDUVdocUlBRTJBZ0FnQWtGa2FpQUJOZ0lBSUFRZ0EwRUVjVUVZY2lJRmF5SUNRU0JKRFFBZ0FhMUNnWUNBZ0JCK0lRWWdBeUFGYWlFQkEwQWdBU0FHTndNWUlBRWdCamNERUNBQklBWTNBd2dnQVNBR053TUFJQUZCSUdvaEFTQUNRV0JxSWdKQkgwc05BQXNMSUFBTEM0NUlBUUJCZ0FnTGhrZ0JBQUFBQWdBQUFBTUFBQUFBQUFBQUFBQUFBQVFBQUFBRkFBQUFBQUFBQUFBQUFBQUdBQUFBQndBQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRWx1ZG1Gc2FXUWdZMmhoY2lCcGJpQjFjbXdnY1hWbGNua0FVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOWliMlI1QUVOdmJuUmxiblF0VEdWdVozUm9JRzkyWlhKbWJHOTNBRU5vZFc1cklITnBlbVVnYjNabGNtWnNiM2NBVW1WemNHOXVjMlVnYjNabGNtWnNiM2NBU1c1MllXeHBaQ0J0WlhSb2IyUWdabTl5SUVoVVZGQXZlQzU0SUhKbGNYVmxjM1FBU1c1MllXeHBaQ0J0WlhSb2IyUWdabTl5SUZKVVUxQXZlQzU0SUhKbGNYVmxjM1FBUlhod1pXTjBaV1FnVTA5VlVrTkZJRzFsZEdodlpDQm1iM0lnU1VORkwzZ3VlQ0J5WlhGMVpYTjBBRWx1ZG1Gc2FXUWdZMmhoY2lCcGJpQjFjbXdnWm5KaFoyMWxiblFnYzNSaGNuUUFSWGh3WldOMFpXUWdaRzkwQUZOd1lXNGdZMkZzYkdKaFkyc2daWEp5YjNJZ2FXNGdiMjVmYzNSaGRIVnpBRWx1ZG1Gc2FXUWdjbVZ6Y0c5dWMyVWdjM1JoZEhWekFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklHVjRkR1Z1YzJsdmJuTUFWWE5sY2lCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmNtVnpaWFJnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5amFIVnVhMTlvWldGa1pYSmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDl0WlhOellXZGxYMkpsWjJsdVlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZZMmgxYm10ZlpYaDBaVzV6YVc5dVgzWmhiSFZsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmMzUmhkSFZ6WDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmRtVnljMmx2Ymw5amIyMXdiR1YwWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgzVnliRjlqYjIxd2JHVjBaV0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDJOb2RXNXJYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmYUdWaFpHVnlYM1poYkhWbFgyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpXQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMjFsZEdodlpGOWpiMjF3YkdWMFpXQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMmhsWVdSbGNsOW1hV1ZzWkY5amIyMXdiR1YwWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgyTm9kVzVyWDJWNGRHVnVjMmx2Ymw5dVlXMWxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQlZibVY0Y0dWamRHVmtJR05vWVhJZ2FXNGdkWEpzSUhObGNuWmxjZ0JKYm5aaGJHbGtJR2hsWVdSbGNpQjJZV3gxWlNCamFHRnlBRWx1ZG1Gc2FXUWdhR1ZoWkdWeUlHWnBaV3hrSUdOb1lYSUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOTJaWEp6YVc5dUFFbHVkbUZzYVdRZ2JXbHViM0lnZG1WeWMybHZiZ0JKYm5aaGJHbGtJRzFoYW05eUlIWmxjbk5wYjI0QVJYaHdaV04wWldRZ2MzQmhZMlVnWVdaMFpYSWdkbVZ5YzJsdmJnQkZlSEJsWTNSbFpDQkRVa3hHSUdGbWRHVnlJSFpsY25OcGIyNEFTVzUyWVd4cFpDQklWRlJRSUhabGNuTnBiMjRBU1c1MllXeHBaQ0JvWldGa1pYSWdkRzlyWlc0QVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5MWNtd0FTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSnpJR2x1SUhWeWJBQlZibVY0Y0dWamRHVmtJSE4wWVhKMElHTm9ZWElnYVc0Z2RYSnNBRVJ2ZFdKc1pTQkFJR2x1SUhWeWJBQkZiWEIwZVNCRGIyNTBaVzUwTFV4bGJtZDBhQUJKYm5aaGJHbGtJR05vWVhKaFkzUmxjaUJwYmlCRGIyNTBaVzUwTFV4bGJtZDBhQUJFZFhCc2FXTmhkR1VnUTI5dWRHVnVkQzFNWlc1bmRHZ0FTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0J3WVhSb0FFTnZiblJsYm5RdFRHVnVaM1JvSUdOaGJpZDBJR0psSUhCeVpYTmxiblFnZDJsMGFDQlVjbUZ1YzJabGNpMUZibU52WkdsdVp3QkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJqYUhWdWF5QnphWHBsQUZOd1lXNGdZMkZzYkdKaFkyc2daWEp5YjNJZ2FXNGdiMjVmYUdWaFpHVnlYM1poYkhWbEFGTndZVzRnWTJGc2JHSmhZMnNnWlhKeWIzSWdhVzRnYjI1ZlkyaDFibXRmWlhoMFpXNXphVzl1WDNaaGJIVmxBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJR1Y0ZEdWdWMybHZibk1nZG1Gc2RXVUFUV2x6YzJsdVp5QmxlSEJsWTNSbFpDQk1SaUJoWm5SbGNpQm9aV0ZrWlhJZ2RtRnNkV1VBU1c1MllXeHBaQ0JnVkhKaGJuTm1aWEl0Ulc1amIyUnBibWRnSUdobFlXUmxjaUIyWVd4MVpRQkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJqYUhWdWF5QmxlSFJsYm5OcGIyNXpJSEYxYjNSbElIWmhiSFZsQUVsdWRtRnNhV1FnWTJoaGNtRmpkR1Z5SUdsdUlHTm9kVzVySUdWNGRHVnVjMmx2Ym5NZ2NYVnZkR1ZrSUhaaGJIVmxBRkJoZFhObFpDQmllU0J2Ymw5b1pXRmtaWEp6WDJOdmJYQnNaWFJsQUVsdWRtRnNhV1FnUlU5R0lITjBZWFJsQUc5dVgzSmxjMlYwSUhCaGRYTmxBRzl1WDJOb2RXNXJYMmhsWVdSbGNpQndZWFZ6WlFCdmJsOXRaWE56WVdkbFgySmxaMmx1SUhCaGRYTmxBRzl1WDJOb2RXNXJYMlY0ZEdWdWMybHZibDkyWVd4MVpTQndZWFZ6WlFCdmJsOXpkR0YwZFhOZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmRtVnljMmx2Ymw5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5MWNteGZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZZMmgxYm10ZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmFHVmhaR1Z5WDNaaGJIVmxYMk52YlhCc1pYUmxJSEJoZFhObEFHOXVYMjFsYzNOaFoyVmZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZiV1YwYUc5a1gyTnZiWEJzWlhSbElIQmhkWE5sQUc5dVgyaGxZV1JsY2w5bWFXVnNaRjlqYjIxd2JHVjBaU0J3WVhWelpRQnZibDlqYUhWdWExOWxlSFJsYm5OcGIyNWZibUZ0WlNCd1lYVnpaUUJWYm1WNGNHVmpkR1ZrSUhOd1lXTmxJR0ZtZEdWeUlITjBZWEowSUd4cGJtVUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmJtRnRaUUJKYm5aaGJHbGtJR05vWVhKaFkzUmxjaUJwYmlCamFIVnVheUJsZUhSbGJuTnBiMjV6SUc1aGJXVUFVR0YxYzJVZ2IyNGdRMDlPVGtWRFZDOVZjR2R5WVdSbEFGQmhkWE5sSUc5dUlGQlNTUzlWY0dkeVlXUmxBRVY0Y0dWamRHVmtJRWhVVkZBdk1pQkRiMjV1WldOMGFXOXVJRkJ5WldaaFkyVUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOXRaWFJvYjJRQVJYaHdaV04wWldRZ2MzQmhZMlVnWVdaMFpYSWdiV1YwYUc5a0FGTndZVzRnWTJGc2JHSmhZMnNnWlhKeWIzSWdhVzRnYjI1ZmFHVmhaR1Z5WDJacFpXeGtBRkJoZFhObFpBQkpiblpoYkdsa0lIZHZjbVFnWlc1amIzVnVkR1Z5WldRQVNXNTJZV3hwWkNCdFpYUm9iMlFnWlc1amIzVnVkR1Z5WldRQVZXNWxlSEJsWTNSbFpDQmphR0Z5SUdsdUlIVnliQ0J6WTJobGJXRUFVbVZ4ZFdWemRDQm9ZWE1nYVc1MllXeHBaQ0JnVkhKaGJuTm1aWEl0Ulc1amIyUnBibWRnQUZOWFNWUkRTRjlRVWs5WVdRQlZVMFZmVUZKUFdGa0FUVXRCUTFSSlZrbFVXUUJWVGxCU1QwTkZVMU5CUWt4RlgwVk9WRWxVV1FCRFQxQlpBRTFQVmtWRVgxQkZVazFCVGtWT1ZFeFpBRlJQVDE5RlFWSk1XUUJPVDFSSlJsa0FSa0ZKVEVWRVgwUkZVRVZPUkVWT1Exa0FRa0ZFWDBkQlZFVlhRVmtBVUV4QldRQlFWVlFBUTBoRlEwdFBWVlFBUjBGVVJWZEJXVjlVU1UxRlQxVlVBRkpGVVZWRlUxUmZWRWxOUlU5VlZBQk9SVlJYVDFKTFgwTlBUazVGUTFSZlZFbE5SVTlWVkFCRFQwNU9SVU5VU1U5T1gxUkpUVVZQVlZRQVRFOUhTVTVmVkVsTlJVOVZWQUJPUlZSWFQxSkxYMUpGUVVSZlZFbE5SVTlWVkFCUVQxTlVBRTFKVTBSSlVrVkRWRVZFWDFKRlVWVkZVMVFBUTB4SlJVNVVYME5NVDFORlJGOVNSVkZWUlZOVUFFTk1TVVZPVkY5RFRFOVRSVVJmVEU5QlJGOUNRVXhCVGtORlJGOVNSVkZWUlZOVUFFSkJSRjlTUlZGVlJWTlVBRWhVVkZCZlVrVlJWVVZUVkY5VFJVNVVYMVJQWDBoVVZGQlRYMUJQVWxRQVVrVlFUMUpVQUVsTlgwRmZWRVZCVUU5VUFGSkZVMFZVWDBOUFRsUkZUbFFBVGs5ZlEwOU9WRVZPVkFCUVFWSlVTVUZNWDBOUFRsUkZUbFFBU0ZCRlgwbE9Wa0ZNU1VSZlEwOU9VMVJCVGxRQVNGQkZYME5DWDFKRlUwVlVBRWRGVkFCSVVFVmZVMVJTU1VOVUFFTlBUa1pNU1VOVUFGUkZUVkJQVWtGU1dWOVNSVVJKVWtWRFZBQlFSVkpOUVU1RlRsUmZVa1ZFU1ZKRlExUUFRMDlPVGtWRFZBQk5WVXhVU1Y5VFZFRlVWVk1BU0ZCRlgwbE9Wa0ZNU1VSZlUxUkJWRlZUQUZSUFQxOU5RVTVaWDFKRlVWVkZVMVJUQUVWQlVreFpYMGhKVGxSVEFGVk9RVlpCU1V4QlFreEZYMFpQVWw5TVJVZEJURjlTUlVGVFQwNVRBRTlRVkVsUFRsTUFVMWRKVkVOSVNVNUhYMUJTVDFSUFEwOU1Vd0JXUVZKSlFVNVVYMEZNVTA5ZlRrVkhUMVJKUVZSRlV3Qk5WVXhVU1ZCTVJWOURTRTlKUTBWVEFFbE9WRVZTVGtGTVgxTkZVbFpGVWw5RlVsSlBVZ0JYUlVKZlUwVlNWa1ZTWDFWT1MwNVBWMDVmUlZKU1QxSUFVa0ZKVEVkVlRsOUZVbEpQVWdCSlJFVk9WRWxVV1Y5UVVrOVdTVVJGVWw5QlZWUklSVTVVU1VOQlZFbFBUbDlGVWxKUFVnQlRVMHhmUTBWU1ZFbEdTVU5CVkVWZlJWSlNUMUlBU1U1V1FVeEpSRjlZWDBaUFVsZEJVa1JGUkY5R1QxSUFVMFZVWDFCQlVrRk5SVlJGVWdCSFJWUmZVRUZTUVUxRlZFVlNBRWhRUlY5VlUwVlNBRk5GUlY5UFZFaEZVZ0JJVUVWZlEwSmZRMGhWVGt0ZlNFVkJSRVZTQUUxTFEwRk1SVTVFUVZJQVUwVlVWVkFBVjBWQ1gxTkZVbFpGVWw5SlUxOUVUMWRPQUZSRlFWSkVUMWRPQUVoUVJWOURURTlUUlVSZlEwOU9Ua1ZEVkVsUFRnQklSVlZTU1ZOVVNVTmZSVmhRU1ZKQlZFbFBUZ0JFU1ZORFQwNU9SVU5VUlVSZlQxQkZVa0ZVU1U5T0FFNVBUbDlCVlZSSVQxSkpWRUZVU1ZaRlgwbE9SazlTVFVGVVNVOU9BRWhRUlY5SlRsWkJURWxFWDFaRlVsTkpUMDRBU0ZCRlgwTkNYMDFGVTFOQlIwVmZRa1ZIU1U0QVUwbFVSVjlKVTE5R1VrOWFSVTRBU0ZCRlgwbE9Wa0ZNU1VSZlNFVkJSRVZTWDFSUFMwVk9BRWxPVmtGTVNVUmZWRTlMUlU0QVJrOVNRa2xFUkVWT0FFVk9TRUZPUTBWZldVOVZVbDlEUVV4TkFFaFFSVjlKVGxaQlRFbEVYMVZTVEFCQ1RFOURTMFZFWDBKWlgxQkJVa1ZPVkVGTVgwTlBUbFJTVDB3QVRVdERUMHdBUVVOTUFFaFFSVjlKVGxSRlVrNUJUQUJTUlZGVlJWTlVYMGhGUVVSRlVsOUdTVVZNUkZOZlZFOVBYMHhCVWtkRlgxVk9UMFpHU1VOSlFVd0FTRkJGWDA5TEFGVk9URWxPU3dCVlRreFBRMHNBVUZKSkFGSkZWRkpaWDFkSlZFZ0FTRkJGWDBsT1ZrRk1TVVJmUTA5T1ZFVk9WRjlNUlU1SFZFZ0FTRkJGWDFWT1JWaFFSVU5VUlVSZlEwOU9WRVZPVkY5TVJVNUhWRWdBUmt4VlUwZ0FVRkpQVUZCQlZFTklBRTB0VTBWQlVrTklBRlZTU1Y5VVQwOWZURTlPUndCUVVrOURSVk5UU1U1SEFFMUpVME5GVEV4QlRrVlBWVk5mVUVWU1UwbFRWRVZPVkY5WFFWSk9TVTVIQUUxSlUwTkZURXhCVGtWUFZWTmZWMEZTVGtsT1J3QklVRVZmU1U1V1FVeEpSRjlVVWtGT1UwWkZVbDlGVGtOUFJFbE9Sd0JGZUhCbFkzUmxaQ0JEVWt4R0FFaFFSVjlKVGxaQlRFbEVYME5JVlU1TFgxTkpXa1VBVFU5V1JRQkRUMDVVU1U1VlJRQklVRVZmUTBKZlUxUkJWRlZUWDBOUFRWQk1SVlJGQUVoUVJWOURRbDlJUlVGRVJWSlRYME5QVFZCTVJWUkZBRWhRUlY5RFFsOVdSVkpUU1U5T1gwTlBUVkJNUlZSRkFFaFFSVjlEUWw5VlVreGZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gwTklWVTVMWDBOUFRWQk1SVlJGQUVoUVJWOURRbDlJUlVGRVJWSmZWa0ZNVlVWZlEwOU5VRXhGVkVVQVNGQkZYME5DWDBOSVZVNUxYMFZZVkVWT1UwbFBUbDlXUVV4VlJWOURUMDFRVEVWVVJRQklVRVZmUTBKZlEwaFZUa3RmUlZoVVJVNVRTVTlPWDA1QlRVVmZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gwMUZVMU5CUjBWZlEwOU5VRXhGVkVVQVNGQkZYME5DWDAxRlZFaFBSRjlEVDAxUVRFVlVSUUJJVUVWZlEwSmZTRVZCUkVWU1gwWkpSVXhFWDBOUFRWQk1SVlJGQUVSRlRFVlVSUUJJVUVWZlNVNVdRVXhKUkY5RlQwWmZVMVJCVkVVQVNVNVdRVXhKUkY5VFUweGZRMFZTVkVsR1NVTkJWRVVBVUVGVlUwVUFUazlmVWtWVFVFOU9VMFVBVlU1VFZWQlFUMUpVUlVSZlRVVkVTVUZmVkZsUVJRQkhUMDVGQUU1UFZGOUJRME5GVUZSQlFreEZBRk5GVWxaSlEwVmZWVTVCVmtGSlRFRkNURVVBVWtGT1IwVmZUazlVWDFOQlZFbFRSa2xCUWt4RkFFOVNTVWRKVGw5SlUxOVZUbEpGUVVOSVFVSk1SUUJTUlZOUVQwNVRSVjlKVTE5VFZFRk1SUUJRVlZKSFJRQk5SVkpIUlFCU1JWRlZSVk5VWDBoRlFVUkZVbDlHU1VWTVJGTmZWRTlQWDB4QlVrZEZBRkpGVVZWRlUxUmZTRVZCUkVWU1gxUlBUMTlNUVZKSFJRQlFRVmxNVDBGRVgxUlBUMTlNUVZKSFJRQkpUbE5WUmtaSlEwbEZUbFJmVTFSUFVrRkhSUUJJVUVWZlVFRlZVMFZFWDFWUVIxSkJSRVVBU0ZCRlgxQkJWVk5GUkY5SU1sOVZVRWRTUVVSRkFGTlBWVkpEUlFCQlRrNVBWVTVEUlFCVVVrRkRSUUJJVUVWZlZVNUZXRkJGUTFSRlJGOVRVRUZEUlFCRVJWTkRVa2xDUlFCVlRsTlZRbE5EVWtsQ1JRQlNSVU5QVWtRQVNGQkZYMGxPVmtGTVNVUmZUVVZVU0U5RUFFNVBWRjlHVDFWT1JBQlFVazlRUmtsT1JBQlZUa0pKVGtRQVVrVkNTVTVFQUZWT1FWVlVTRTlTU1ZwRlJBQk5SVlJJVDBSZlRrOVVYMEZNVEU5WFJVUUFTRlJVVUY5V1JWSlRTVTlPWDA1UFZGOVRWVkJRVDFKVVJVUUFRVXhTUlVGRVdWOVNSVkJQVWxSRlJBQkJRME5GVUZSRlJBQk9UMVJmU1UxUVRFVk5SVTVVUlVRQVRFOVBVRjlFUlZSRlExUkZSQUJJVUVWZlExSmZSVmhRUlVOVVJVUUFTRkJGWDB4R1gwVllVRVZEVkVWRUFFTlNSVUZVUlVRQVNVMWZWVk5GUkFCSVVFVmZVRUZWVTBWRUFGUkpUVVZQVlZSZlQwTkRWVkpGUkFCUVFWbE5SVTVVWDFKRlVWVkpVa1ZFQUZCU1JVTlBUa1JKVkVsUFRsOVNSVkZWU1ZKRlJBQlFVazlZV1Y5QlZWUklSVTVVU1VOQlZFbFBUbDlTUlZGVlNWSkZSQUJPUlZSWFQxSkxYMEZWVkVoRlRsUkpRMEZVU1U5T1gxSkZVVlZKVWtWRUFFeEZUa2RVU0Y5U1JWRlZTVkpGUkFCVFUweGZRMFZTVkVsR1NVTkJWRVZmVWtWUlZVbFNSVVFBVlZCSFVrRkVSVjlTUlZGVlNWSkZSQUJRUVVkRlgwVllVRWxTUlVRQVVGSkZRMDlPUkVsVVNVOU9YMFpCU1V4RlJBQkZXRkJGUTFSQlZFbFBUbDlHUVVsTVJVUUFVa1ZXUVV4SlJFRlVTVTlPWDBaQlNVeEZSQUJUVTB4ZlNFRk9SRk5JUVV0RlgwWkJTVXhGUkFCTVQwTkxSVVFBVkZKQlRsTkdUMUpOUVZSSlQwNWZRVkJRVEVsRlJBQk9UMVJmVFU5RVNVWkpSVVFBVGs5VVgwVllWRVZPUkVWRUFFSkJUa1JYU1VSVVNGOU1TVTFKVkY5RldFTkZSVVJGUkFCVFNWUkZYMGxUWDA5V1JWSk1UMEZFUlVRQVNFVkJSQUJGZUhCbFkzUmxaQ0JJVkZSUUx3QUFYaE1BQUNZVEFBQXdFQUFBOEJjQUFKMFRBQUFWRWdBQU9SY0FBUEFTQUFBS0VBQUFkUklBQUswU0FBQ0NFd0FBVHhRQUFIOFFBQUNnRlFBQUl4UUFBSWtTQUFDTEZBQUFUUlVBQU5RUkFBRFBGQUFBRUJnQUFNa1dBQURjRmdBQXdSRUFBT0FYQUFDN0ZBQUFkQlFBQUh3VkFBRGxGQUFBQ0JjQUFCOFFBQUJsRlFBQW94UUFBQ2dWQUFBQ0ZRQUFtUlVBQUN3UUFBQ0xHUUFBVHc4QUFOUU9BQUJxRUFBQXpoQUFBQUlYQUFDSkRnQUFiaE1BQUJ3VEFBQm1GQUFBVmhjQUFNRVRBQURORXdBQWJCTUFBR2dYQUFCbUZ3QUFYeGNBQUNJVEFBRE9Ed0FBYVE0QUFOZ09BQUJqRmdBQXl4TUFBS29PQUFBb0Z3QUFKaGNBQU1VVEFBQmRGZ0FBNkJFQUFHY1RBQUJsRXdBQThoWUFBSE1UQUFBZEZ3QUErUllBQVBNUkFBRFBEZ0FBemhVQUFBd1NBQUN6RVFBQXBSRUFBR0VRQUFBeUZ3QUF1eE1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBUUlCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJREFnSUNBZ0lBQUFJQ0FBSUNBQUlDQWdJQ0FnSUNBZ0lBQkFBQUFBQUFBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFBQUFDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdBQ0FBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBQUlDQWdJQ0FBQUNBZ0FDQWdBQ0FnSUNBZ0lDQWdJQ0FBTUFCQUFBQUFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUFBQUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFBZ0FDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWJHOXpaV1ZsY0MxaGJHbDJaUUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQkFRRUJBUUVCQVFFQkFRSUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCWTJoMWJtdGxaQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRRUFBUUVCQVFFQUFBRUJBQUVCQUFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQUFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCbFkzUnBiMjVsYm5RdGJHVnVaM1JvYjI1eWIzaDVMV052Ym01bFkzUnBiMjRBQUFBQUFBQUFBQUFBQUFBQUFBQnlZVzV6Wm1WeUxXVnVZMjlrYVc1bmNHZHlZV1JsRFFvTkNnMEtVMDBOQ2cwS1ZGUlFMME5GTDFSVFVDOEFBQUFBQUFBQUFBQUFBQUFCQWdBQkF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBQUFBQUFBQUFBQUFRSUFBUU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQVFFRkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFBQUFBQUFBQUFBQUVBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQUFBQUFRQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1FQUFBRUJBUUVCQVFFQkFRRUJBVUVCQVFFQkFRRUJBUUVCQVFBQkFBR0J3UUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVBQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQUFBQUFBQUFEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd0FBQUFBQUFBTURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUlBQUFBQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNQUFBQUFBQUFEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQk9UMVZPUTBWRlEwdFBWVlJPUlVOVVJWUkZRMUpKUWtWTVZWTklSVlJGUVVSVFJVRlNRMGhTUjBWRFZFbFdTVlJaVEVWT1JFRlNWa1ZQVkVsR1dWQlVTVTlPVTBOSVUwVkJXVk5VUVZSRFNFZEZUMUpFU1ZKRlExUlBVbFJTUTBoUVFWSkJUVVZVUlZKVlVrTkZRbE5EVWtsQ1JVRlNSRTlYVGtGRFJVbE9SRTVMUTB0VlFsTkRVa2xDUlVoVVZGQXZRVVJVVUM4PSdcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSAnQUdGemJRRUFBQUFCTUFoZ0FYOEJmMkFEZjM5L0FYOWdCSDkvZjM4QmYyQUFBR0FEZjM5L0FHQUJmd0JnQW45L0FHQUdmMzkvZjM5L0FBTExBUWdEWlc1MkdIZGhjMjFmYjI1ZmFHVmhaR1Z5YzE5amIyMXdiR1YwWlFBQ0EyVnVkaFYzWVhOdFgyOXVYMjFsYzNOaFoyVmZZbVZuYVc0QUFBTmxibllMZDJGemJWOXZibDkxY213QUFRTmxibllPZDJGemJWOXZibDl6ZEdGMGRYTUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmWm1sbGJHUUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmZG1Gc2RXVUFBUU5sYm5ZTWQyRnpiVjl2Ymw5aWIyUjVBQUVEWlc1MkdIZGhjMjFmYjI1ZmJXVnpjMkZuWlY5amIyMXdiR1YwWlFBQUEwWkZBd01FQUFBRkFBQUFBQUFBQlFFRkFBVUZCUUFBQmdBQUFBQUdCZ1lHQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQUFBQkFRY0FBQVVGQXdBQkJBVUJjQUVTRWdVREFRQUNCZ2dCZndGQmdOUUVDd2ZSQlNJR2JXVnRiM0o1QWdBTFgybHVhWFJwWVd4cGVtVUFDUmxmWDJsdVpHbHlaV04wWDJaMWJtTjBhVzl1WDNSaFlteGxBUUFMYkd4b2RIUndYMmx1YVhRQUNoaHNiR2gwZEhCZmMyaHZkV3hrWDJ0bFpYQmZZV3hwZG1VQVFReHNiR2gwZEhCZllXeHNiMk1BREFadFlXeHNiMk1BUmd0c2JHaDBkSEJmWm5KbFpRQU5CR1p5WldVQVNBOXNiR2gwZEhCZloyVjBYM1I1Y0dVQURoVnNiR2gwZEhCZloyVjBYMmgwZEhCZmJXRnFiM0lBRHhWc2JHaDBkSEJmWjJWMFgyaDBkSEJmYldsdWIzSUFFQkZzYkdoMGRIQmZaMlYwWDIxbGRHaHZaQUFSRm14c2FIUjBjRjluWlhSZmMzUmhkSFZ6WDJOdlpHVUFFaEpzYkdoMGRIQmZaMlYwWDNWd1ozSmhaR1VBRXd4c2JHaDBkSEJmY21WelpYUUFGQTVzYkdoMGRIQmZaWGhsWTNWMFpRQVZGR3hzYUhSMGNGOXpaWFIwYVc1bmMxOXBibWwwQUJZTmJHeG9kSFJ3WDJacGJtbHphQUFYREd4c2FIUjBjRjl3WVhWelpRQVlEV3hzYUhSMGNGOXlaWE4xYldVQUdSdHNiR2gwZEhCZmNtVnpkVzFsWDJGbWRHVnlYM1Z3WjNKaFpHVUFHaEJzYkdoMGRIQmZaMlYwWDJWeWNtNXZBQnNYYkd4b2RIUndYMmRsZEY5bGNuSnZjbDl5WldGemIyNEFIQmRzYkdoMGRIQmZjMlYwWDJWeWNtOXlYM0psWVhOdmJnQWRGR3hzYUhSMGNGOW5aWFJmWlhKeWIzSmZjRzl6QUI0UmJHeG9kSFJ3WDJWeWNtNXZYMjVoYldVQUh4SnNiR2gwZEhCZmJXVjBhRzlrWDI1aGJXVUFJQkpzYkdoMGRIQmZjM1JoZEhWelgyNWhiV1VBSVJwc2JHaDBkSEJmYzJWMFgyeGxibWxsYm5SZmFHVmhaR1Z5Y3dBaUlXeHNhSFIwY0Y5elpYUmZiR1Z1YVdWdWRGOWphSFZ1YTJWa1gyeGxibWQwYUFBakhXeHNhSFIwY0Y5elpYUmZiR1Z1YVdWdWRGOXJaV1Z3WDJGc2FYWmxBQ1FrYkd4b2RIUndYM05sZEY5c1pXNXBaVzUwWDNSeVlXNXpabVZ5WDJWdVkyOWthVzVuQUNVWWJHeG9kSFJ3WDIxbGMzTmhaMlZmYm1WbFpITmZaVzltQUQ4SkZ3RUFRUUVMRVFFQ0F3UUZDd1lITlRrM01TOHRKeXNwQ3JMZ0FrVUNBQXNJQUJDSWdJQ0FBQXNaQUNBQUVNS0FnSUFBR2lBQUlBSTJBamdnQUNBQk9nQW9DeHdBSUFBZ0FDOEJNaUFBTFFBdUlBQVF3WUNBZ0FBUWdJQ0FnQUFMS2dFQmYwSEFBQkRHZ0lDQUFDSUJFTUtBZ0lBQUdpQUJRWUNJZ0lBQU5nSTRJQUVnQURvQUtDQUJDd29BSUFBUXlJQ0FnQUFMQndBZ0FDMEFLQXNIQUNBQUxRQXFDd2NBSUFBdEFDc0xCd0FnQUMwQUtRc0hBQ0FBTHdFeUN3Y0FJQUF0QUM0TFJRRUVmeUFBS0FJWUlRRWdBQzBBTFNFQ0lBQXRBQ2doQXlBQUtBSTRJUVFnQUJEQ2dJQ0FBQm9nQUNBRU5nSTRJQUFnQXpvQUtDQUFJQUk2QUMwZ0FDQUJOZ0lZQ3hFQUlBQWdBU0FCSUFKcUVNT0FnSUFBQ3hBQUlBQkJBRUhjQUJETWdJQ0FBQm9MWndFQmYwRUFJUUVDUUNBQUtBSU1EUUFDUUFKQUFrQUNRQ0FBTFFBdkRnTUJBQU1DQ3lBQUtBSTRJZ0ZGRFFBZ0FTZ0NMQ0lCUlEwQUlBQWdBUkdBZ0lDQUFBQWlBUTBEQzBFQUR3c1F5b0NBZ0FBQUN5QUFRY09XZ0lBQU5nSVFRUTRoQVFzZ0FRc2VBQUpBSUFBb0Fnd05BQ0FBUWRHYmdJQUFOZ0lRSUFCQkZUWUNEQXNMRmdBQ1FDQUFLQUlNUVJWSERRQWdBRUVBTmdJTUN3c1dBQUpBSUFBb0FneEJGa2NOQUNBQVFRQTJBZ3dMQ3djQUlBQW9BZ3dMQndBZ0FDZ0NFQXNKQUNBQUlBRTJBaEFMQndBZ0FDZ0NGQXNpQUFKQUlBQkJKRWtOQUJES2dJQ0FBQUFMSUFCQkFuUkJvTE9BZ0FCcUtBSUFDeUlBQWtBZ0FFRXVTUTBBRU1xQWdJQUFBQXNnQUVFQ2RFR3d0SUNBQUdvb0FnQUw3Z3NCQVg5QjY2aUFnQUFoQVFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQkJuSDlxRHZRRFkySUFBV0ZoWVdGaFlRSURCQVZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaEJnY0lDUW9MREEwT0QyRmhZV0ZoRUdGaFlXRmhZV0ZoWVdGaEVXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlSSVRGQlVXRnhnWkdodGhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhIQjBlSHlBaElpTWtKU1luS0NrcUt5d3RMaTh3TVRJek5EVTJZVGM0T1RwaFlXRmhZV0ZoWVR0aFlXRThZV0ZoWVQwK1AyRmhZV0ZoWVdGaFFHRmhRV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVVKRFJFVkdSMGhKU2t0TVRVNVBVRkZTVTJGaFlXRmhZV0ZoVkZWV1YxaFpXbHRoWEYxaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmVZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhYMkJoQzBIaHA0Q0FBQThMUWFTaGdJQUFEd3RCeTZ5QWdBQVBDMEgrc1lDQUFBOExRY0NrZ0lBQUR3dEJxNlNBZ0FBUEMwR05xSUNBQUE4TFFlS21nSUFBRHd0QmdMQ0FnQUFQQzBHNXI0Q0FBQThMUWRla2dJQUFEd3RCNzUrQWdBQVBDMEhobjRDQUFBOExRZnFmZ0lBQUR3dEI4cUNBZ0FBUEMwR29yNENBQUE4TFFhNnlnSUFBRHd0QmlMQ0FnQUFQQzBIc3A0Q0FBQThMUVlLaWdJQUFEd3RCanAyQWdBQVBDMEhRcm9DQUFBOExRY3FqZ0lBQUR3dEJ4YktBZ0FBUEMwSGZuSUNBQUE4TFFkS2NnSUFBRHd0QnhLQ0FnQUFQQzBIWG9JQ0FBQThMUWFLZmdJQUFEd3RCN2E2QWdBQVBDMEdyc0lDQUFBOExRZFNsZ0lBQUR3dEJ6SzZBZ0FBUEMwSDZyb0NBQUE4TFFmeXJnSUFBRHd0QjByQ0FnQUFQQzBIeG5ZQ0FBQThMUWJ1Z2dJQUFEd3RCOTZ1QWdBQVBDMEdRc1lDQUFBOExRZGV4Z0lBQUR3dEJvcTJBZ0FBUEMwSFVwNENBQUE4TFFlQ3JnSUFBRHd0Qm42eUFnQUFQQzBIcnNZQ0FBQThMUWRXZmdJQUFEd3RCeXJHQWdBQVBDMEhlcFlDQUFBOExRZFNlZ0lBQUR3dEI5SnlBZ0FBUEMwR25zb0NBQUE4TFFiR2RnSUFBRHd0Qm9KMkFnQUFQQzBHNXNZQ0FBQThMUWJ5d2dJQUFEd3RCa3FHQWdBQVBDMEd6cG9DQUFBOExRZW1zZ0lBQUR3dEJySjZBZ0FBUEMwSFVxNENBQUE4TFFmZW1nSUFBRHd0QmdLYUFnQUFQQzBHd29ZQ0FBQThMUWY2ZWdJQUFEd3RCamFPQWdBQVBDMEdKcllDQUFBOExRZmVpZ0lBQUR3dEJvTEdBZ0FBUEMwR3VuNENBQUE4TFFjYWxnSUFBRHd0QjZKNkFnQUFQQzBHVG9vQ0FBQThMUWNLdmdJQUFEd3RCdzUyQWdBQVBDMEdMcklDQUFBOExRZUdkZ0lBQUR3dEJqYStBZ0FBUEMwSHFvWUNBQUE4TFFiU3RnSUFBRHd0QjBxK0FnQUFQQzBIZnNvQ0FBQThMUWRLeWdJQUFEd3RCOExDQWdBQVBDMEdwb29DQUFBOExRZm1qZ0lBQUR3dEJtWjZBZ0FBUEMwRzFySUNBQUE4TFFadXdnSUFBRHd0QmtyS0FnQUFQQzBHMnE0Q0FBQThMUWNLaWdJQUFEd3RCK0xLQWdBQVBDMEdlcFlDQUFBOExRZENpZ0lBQUR3dEJ1cDZBZ0FBUEMwR0Jub0NBQUE4TEVNcUFnSUFBQUF0QjFxR0FnQUFoQVFzZ0FRc1dBQ0FBSUFBdEFDMUIvZ0Z4SUFGQkFFZHlPZ0F0Q3hrQUlBQWdBQzBBTFVIOUFYRWdBVUVBUjBFQmRISTZBQzBMR1FBZ0FDQUFMUUF0UWZzQmNTQUJRUUJIUVFKMGNqb0FMUXNaQUNBQUlBQXRBQzFCOXdGeElBRkJBRWRCQTNSeU9nQXRDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FnQWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MU1FFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NCQ0lFUlEwQUlBQWdBU0FDSUFGcklBUVJnWUNBZ0FBQUlnTkJmMGNOQUNBQVFjYVJnSUFBTmdJUVFSZ2hBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUl3SWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREMwa0JBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWdnaUJFVU5BQ0FBSUFFZ0FpQUJheUFFRVlHQWdJQUFBQ0lEUVg5SERRQWdBRUgyaW9DQUFEWUNFRUVZSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ05DSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RKQVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSU1JZ1JGRFFBZ0FDQUJJQUlnQVdzZ0JCR0JnSUNBQUFBaUEwRi9SdzBBSUFCQjdacUFnQUEyQWhCQkdDRURDeUFEQ3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BamdpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDRUNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRWldRZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJOElnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDMGtCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FoUWlCRVVOQUNBQUlBRWdBaUFCYXlBRUVZR0FnSUFBQUNJRFFYOUhEUUFnQUVHcW00Q0FBRFlDRUVFWUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NRQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0SkFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlZSWdSRkRRQWdBQ0FCSUFJZ0FXc2dCQkdCZ0lDQUFBQWlBMEYvUncwQUlBQkI3Wk9BZ0FBMkFoQkJHQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWtRaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ0pDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3N1QVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSXNJZ1JGRFFBZ0FDQUVFWUNBZ0lBQUFDRURDeUFEQzBrQkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BaWdpQkVVTkFDQUFJQUVnQWlBQmF5QUVFWUdBZ0lBQUFDSURRWDlIRFFBZ0FFSDJpSUNBQURZQ0VFRVlJUU1MSUFNTExnRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDVUNJRVJRMEFJQUFnQkJHQWdJQ0FBQUFoQXdzZ0F3dEpBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJY0lnUkZEUUFnQUNBQklBSWdBV3NnQkJHQmdJQ0FBQUFpQTBGL1J3MEFJQUJCd3BtQWdBQTJBaEJCR0NFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FrZ2lCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MU1FFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NJQ0lFUlEwQUlBQWdBU0FDSUFGcklBUVJnWUNBZ0FBQUlnTkJmMGNOQUNBQVFaU1VnSUFBTmdJUVFSZ2hBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUpNSWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWxRaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ1dDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RGQVFGL0FrQUNRQ0FBTHdFd1FSUnhRUlJIRFFCQkFTRURJQUF0QUNoQkFVWU5BU0FBTHdFeVFlVUFSaUVEREFFTElBQXRBQ2xCQlVZaEF3c2dBQ0FET2dBdVFRQUwvZ0VCQTM5QkFTRURBa0FnQUM4Qk1DSUVRUWh4RFFBZ0FDa0RJRUlBVWlFREN3SkFBa0FnQUMwQUxrVU5BRUVCSVFVZ0FDMEFLVUVGUmcwQlFRRWhCU0FFUWNBQWNVVWdBM0ZCQVVjTkFRdEJBQ0VGSUFSQndBQnhEUUJCQWlFRklBUkIvLzhEY1NJRFFRaHhEUUFDUUNBRFFZQUVjVVVOQUFKQUlBQXRBQ2hCQVVjTkFDQUFMUUF0UVFweERRQkJCUThMUVFRUEN3SkFJQU5CSUhFTkFBSkFJQUF0QUNoQkFVWU5BQ0FBTHdFeVFmLy9BM0VpQUVHY2YycEI1QUJKRFFBZ0FFSE1BVVlOQUNBQVFiQUNSZzBBUVFRaEJTQUVRU2h4UlEwQ0lBTkJpQVJ4UVlBRVJnMENDMEVBRHd0QkFFRURJQUFwQXlCUUd5RUZDeUFGQzJJQkFuOUJBQ0VCQWtBZ0FDMEFLRUVCUmcwQUlBQXZBVEpCLy84RGNTSUNRWngvYWtIa0FFa05BQ0FDUWN3QlJnMEFJQUpCc0FKR0RRQWdBQzhCTUNJQVFjQUFjUTBBUVFFaEFTQUFRWWdFY1VHQUJFWU5BQ0FBUVNoeFJTRUJDeUFCQzZjQkFRTi9Ba0FDUUFKQUlBQXRBQ3BGRFFBZ0FDMEFLMFVOQUVFQUlRTWdBQzhCTUNJRVFRSnhSUTBCREFJTFFRQWhBeUFBTHdFd0lnUkJBWEZGRFFFTFFRRWhBeUFBTFFBb1FRRkdEUUFnQUM4Qk1rSC8vd054SWdWQm5IOXFRZVFBU1EwQUlBVkJ6QUZHRFFBZ0JVR3dBa1lOQUNBRVFjQUFjUTBBUVFBaEF5QUVRWWdFY1VHQUJFWU5BQ0FFUVNoeFFRQkhJUU1MSUFCQkFEc0JNQ0FBUVFBNkFDOGdBd3VaQVFFQ2Z3SkFBa0FDUUNBQUxRQXFSUTBBSUFBdEFDdEZEUUJCQUNFQklBQXZBVEFpQWtFQ2NVVU5BUXdDQzBFQUlRRWdBQzhCTUNJQ1FRRnhSUTBCQzBFQklRRWdBQzBBS0VFQlJnMEFJQUF2QVRKQi8vOERjU0lBUVp4L2FrSGtBRWtOQUNBQVFjd0JSZzBBSUFCQnNBSkdEUUFnQWtIQUFIRU5BRUVBSVFFZ0FrR0lCSEZCZ0FSR0RRQWdBa0VvY1VFQVJ5RUJDeUFCQzBrQkFYc2dBRUVRYXYwTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNJQi9Rc0RBQ0FBSUFIOUN3TUFJQUJCTUdvZ0FmMExBd0FnQUVFZ2FpQUIvUXNEQUNBQVFkMEJOZ0ljUVFBTGV3RUJmd0pBSUFBb0Fnd2lBdzBBQWtBZ0FDZ0NCRVVOQUNBQUlBRTJBZ1FMQWtBZ0FDQUJJQUlReElDQWdBQWlBdzBBSUFBb0Fnd1BDeUFBSUFNMkFoeEJBQ0VESUFBb0FnUWlBVVVOQUNBQUlBRWdBaUFBS0FJSUVZR0FnSUFBQUNJQlJRMEFJQUFnQWpZQ0ZDQUFJQUUyQWd3Z0FTRURDeUFEQytUekFRTU9md04rQkg4amdJQ0FnQUJCRUdzaUF5U0FnSUNBQUNBQklRUWdBU0VGSUFFaEJpQUJJUWNnQVNFSUlBRWhDU0FCSVFvZ0FTRUxJQUVoRENBQklRMGdBU0VPSUFFaER3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUFLQUljSWhCQmYyb08zUUhhQVFIWkFRSURCQVVHQndnSkNnc01EUTdZQVE4UTF3RVJFdFlCRXhRVkZoY1lHUm9iNEFIZkFSd2RIdFVCSHlBaElpTWtKZFFCSmljb0tTb3JMTk1CMGdFdEx0RUIwQUV2TURFeU16UTFOamM0T1RvN1BEMCtQMEJCUWtORVJVYmJBVWRJU1VyUEFjNEJTODBCVE13QlRVNVBVRkZTVTFSVlZsZFlXVnBiWEYxZVgyQmhZbU5rWldabmFHbHFhMnh0Ym05d2NYSnpkSFYyZDNoNWVudDhmWDUvZ0FHQkFZSUJnd0dFQVlVQmhnR0hBWWdCaVFHS0FZc0JqQUdOQVk0Qmp3R1FBWkVCa2dHVEFaUUJsUUdXQVpjQm1BR1pBWm9CbXdHY0FaMEJuZ0dmQWFBQm9RR2lBYU1CcEFHbEFhWUJwd0dvQWFrQnFnR3JBYXdCclFHdUFhOEJzQUd4QWJJQnN3RzBBYlVCdGdHM0Fjc0J5Z0c0QWNrQnVRSElBYm9CdXdHOEFiMEJ2Z0cvQWNBQndRSENBY01CeEFIRkFjWUJBTndCQzBFQUlSQU14Z0VMUVE0aEVBekZBUXRCRFNFUURNUUJDMEVQSVJBTXd3RUxRUkFoRUF6Q0FRdEJFeUVRRE1FQkMwRVVJUkFNd0FFTFFSVWhFQXkvQVF0QkZpRVFETDRCQzBFWElSQU12UUVMUVJnaEVBeThBUXRCR1NFUURMc0JDMEVhSVJBTXVnRUxRUnNoRUF5NUFRdEJIQ0VRRExnQkMwRUlJUkFNdHdFTFFSMGhFQXkyQVF0QklDRVFETFVCQzBFZklSQU10QUVMUVFjaEVBeXpBUXRCSVNFUURMSUJDMEVpSVJBTXNRRUxRUjRoRUF5d0FRdEJJeUVRREs4QkMwRVNJUkFNcmdFTFFSRWhFQXl0QVF0QkpDRVFES3dCQzBFbElSQU1xd0VMUVNZaEVBeXFBUXRCSnlFUURLa0JDMEhEQVNFUURLZ0JDMEVwSVJBTXB3RUxRU3NoRUF5bUFRdEJMQ0VRREtVQkMwRXRJUkFNcEFFTFFTNGhFQXlqQVF0Qkx5RVFES0lCQzBIRUFTRVFES0VCQzBFd0lSQU1vQUVMUVRRaEVBeWZBUXRCRENFUURKNEJDMEV4SVJBTW5RRUxRVEloRUF5Y0FRdEJNeUVRREpzQkMwRTVJUkFNbWdFTFFUVWhFQXlaQVF0QnhRRWhFQXlZQVF0QkN5RVFESmNCQzBFNklSQU1sZ0VMUVRZaEVBeVZBUXRCQ2lFUURKUUJDMEUzSVJBTWt3RUxRVGdoRUF5U0FRdEJQQ0VRREpFQkMwRTdJUkFNa0FFTFFUMGhFQXlQQVF0QkNTRVFESTRCQzBFb0lSQU1qUUVMUVQ0aEVBeU1BUXRCUHlFUURJc0JDMEhBQUNFUURJb0JDMEhCQUNFUURJa0JDMEhDQUNFUURJZ0JDMEhEQUNFUURJY0JDMEhFQUNFUURJWUJDMEhGQUNFUURJVUJDMEhHQUNFUURJUUJDMEVxSVJBTWd3RUxRY2NBSVJBTWdnRUxRY2dBSVJBTWdRRUxRY2tBSVJBTWdBRUxRY29BSVJBTWZ3dEJ5d0FoRUF4K0MwSE5BQ0VRREgwTFFjd0FJUkFNZkF0QnpnQWhFQXg3QzBIUEFDRVFESG9MUWRBQUlSQU1lUXRCMFFBaEVBeDRDMEhTQUNFUURIY0xRZE1BSVJBTWRndEIxQUFoRUF4MUMwSFdBQ0VRREhRTFFkVUFJUkFNY3d0QkJpRVFESElMUWRjQUlSQU1jUXRCQlNFUURIQUxRZGdBSVJBTWJ3dEJCQ0VRREc0TFFka0FJUkFNYlF0QjJnQWhFQXhzQzBIYkFDRVFER3NMUWR3QUlSQU1hZ3RCQXlFUURHa0xRZDBBSVJBTWFBdEIzZ0FoRUF4bkMwSGZBQ0VRREdZTFFlRUFJUkFNWlF0QjRBQWhFQXhrQzBIaUFDRVFER01MUWVNQUlSQU1ZZ3RCQWlFUURHRUxRZVFBSVJBTVlBdEI1UUFoRUF4ZkMwSG1BQ0VRREY0TFFlY0FJUkFNWFF0QjZBQWhFQXhjQzBIcEFDRVFERnNMUWVvQUlSQU1XZ3RCNndBaEVBeFpDMEhzQUNFUURGZ0xRZTBBSVJBTVZ3dEI3Z0FoRUF4V0MwSHZBQ0VRREZVTFFmQUFJUkFNVkF0QjhRQWhFQXhUQzBIeUFDRVFERklMUWZNQUlSQU1VUXRCOUFBaEVBeFFDMEgxQUNFUURFOExRZllBSVJBTVRndEI5d0FoRUF4TkMwSDRBQ0VRREV3TFFma0FJUkFNU3d0QitnQWhFQXhLQzBIN0FDRVFERWtMUWZ3QUlSQU1TQXRCL1FBaEVBeEhDMEgrQUNFUURFWUxRZjhBSVJBTVJRdEJnQUVoRUF4RUMwR0JBU0VRREVNTFFZSUJJUkFNUWd0Qmd3RWhFQXhCQzBHRUFTRVFERUFMUVlVQklSQU1Qd3RCaGdFaEVBdytDMEdIQVNFUUREMExRWWdCSVJBTVBBdEJpUUVoRUF3N0MwR0tBU0VRRERvTFFZc0JJUkFNT1F0QmpBRWhFQXc0QzBHTkFTRVFERGNMUVk0QklSQU1OZ3RCandFaEVBdzFDMEdRQVNFUUREUUxRWkVCSVJBTU13dEJrZ0VoRUF3eUMwR1RBU0VRRERFTFFaUUJJUkFNTUF0QmxRRWhFQXd2QzBHV0FTRVFEQzRMUVpjQklSQU1MUXRCbUFFaEVBd3NDMEdaQVNFUURDc0xRWm9CSVJBTUtndEJtd0VoRUF3cEMwR2NBU0VRRENnTFFaMEJJUkFNSnd0Qm5nRWhFQXdtQzBHZkFTRVFEQ1VMUWFBQklSQU1KQXRCb1FFaEVBd2pDMEdpQVNFUURDSUxRYU1CSVJBTUlRdEJwQUVoRUF3Z0MwR2xBU0VRREI4TFFhWUJJUkFNSGd0QnB3RWhFQXdkQzBHb0FTRVFEQndMUWFrQklSQU1Hd3RCcWdFaEVBd2FDMEdyQVNFUURCa0xRYXdCSVJBTUdBdEJyUUVoRUF3WEMwR3VBU0VRREJZTFFRRWhFQXdWQzBHdkFTRVFEQlFMUWJBQklSQU1Fd3RCc1FFaEVBd1NDMEd6QVNFUURCRUxRYklCSVJBTUVBdEJ0QUVoRUF3UEMwRzFBU0VRREE0TFFiWUJJUkFNRFF0QnR3RWhFQXdNQzBHNEFTRVFEQXNMUWJrQklSQU1DZ3RCdWdFaEVBd0pDMEc3QVNFUURBZ0xRY1lCSVJBTUJ3dEJ2QUVoRUF3R0MwRzlBU0VRREFVTFFiNEJJUkFNQkF0QnZ3RWhFQXdEQzBIQUFTRVFEQUlMUWNJQklSQU1BUXRCd1FFaEVBc0RRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUJBT3h3RUFBUUlEQkFVR0J3Z0pDZ3NNRFE0UEVCRVNFeFFWRmhjWUdSb2JIQjRmSUNFakpTZy9RRUZFUlVaSFNFbEtTMHhOVDFCUlVsUGVBMWRaVzF4ZFlHSmxabWRvYVdwcmJHMXZjSEZ5YzNSMWRuZDRlWHA3ZkgxK2dBR0NBWVVCaGdHSEFZa0Jpd0dNQVkwQmpnR1BBWkFCa1FHVUFaVUJsZ0dYQVpnQm1RR2FBWnNCbkFHZEFaNEJud0dnQWFFQm9nR2pBYVFCcFFHbUFhY0JxQUdwQWFvQnF3R3NBYTBCcmdHdkFiQUJzUUd5QWJNQnRBRzFBYllCdHdHNEFia0J1Z0c3QWJ3QnZRRytBYjhCd0FIQkFjSUJ3d0hFQWNVQnhnSEhBY2dCeVFIS0Fjc0J6QUhOQWM0Qnp3SFFBZEVCMGdIVEFkUUIxUUhXQWRjQjJBSFpBZG9CMndIY0FkMEIzZ0hnQWVFQjRnSGpBZVFCNVFIbUFlY0I2QUhwQWVvQjZ3SHNBZTBCN2dIdkFmQUI4UUh5QWZNQm1RS2tBckFDL2dMK0Fnc2dBU0lFSUFKSERmTUJRZDBCSVJBTS93TUxJQUVpRUNBQ1J3M2RBVUhEQVNFUURQNERDeUFCSWdFZ0FrY05rQUZCOXdBaEVBejlBd3NnQVNJQklBSkhEWVlCUWU4QUlSQU0vQU1MSUFFaUFTQUNSdzEvUWVvQUlSQU0rd01MSUFFaUFTQUNSdzE3UWVnQUlSQU0rZ01MSUFFaUFTQUNSdzE0UWVZQUlSQU0rUU1MSUFFaUFTQUNSdzBhUVJnaEVBejRBd3NnQVNJQklBSkhEUlJCRWlFUURQY0RDeUFCSWdFZ0FrY05XVUhGQUNFUURQWURDeUFCSWdFZ0FrY05Ta0UvSVJBTTlRTUxJQUVpQVNBQ1J3MUlRVHdoRUF6MEF3c2dBU0lCSUFKSERVRkJNU0VRRFBNREN5QUFMUUF1UVFGR0Rlc0RESWNDQ3lBQUlBRWlBU0FDRU1DQWdJQUFRUUZIRGVZQklBQkNBRGNESUF6bkFRc2dBQ0FCSWdFZ0FoQzBnSUNBQUNJUURlY0JJQUVoQVF6MUFnc0NRQ0FCSWdFZ0FrY05BRUVHSVJBTThBTUxJQUFnQVVFQmFpSUJJQUlRdTRDQWdBQWlFQTNvQVNBQklRRU1NUXNnQUVJQU53TWdRUkloRUF6VkF3c2dBU0lRSUFKSERTdEJIU0VRRE8wREN3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFVRVFJUkFNMUFNTFFRY2hFQXpzQXdzZ0FFSUFJQUFwQXlBaUVTQUNJQUVpRUd1dEloSjlJaE1nRXlBUlZoczNBeUFnRVNBU1ZpSVVSUTNsQVVFSUlSQU02d01MQWtBZ0FTSUJJQUpHRFFBZ0FFR0pnSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJRUlFoRUF6U0F3dEJDU0VRRE9vREN5QUJJUUVnQUNrRElGQU41QUVnQVNFQkRQSUNDd0pBSUFFaUFTQUNSdzBBUVFzaEVBenBBd3NnQUNBQlFRRnFJZ0VnQWhDMmdJQ0FBQ0lRRGVVQklBRWhBUXp5QWdzZ0FDQUJJZ0VnQWhDNGdJQ0FBQ0lRRGVVQklBRWhBUXp5QWdzZ0FDQUJJZ0VnQWhDNGdJQ0FBQ0lRRGVZQklBRWhBUXdOQ3lBQUlBRWlBU0FDRUxxQWdJQUFJaEFONXdFZ0FTRUJEUEFDQ3dKQUlBRWlBU0FDUncwQVFROGhFQXpsQXdzZ0FTMEFBQ0lRUVR0R0RRZ2dFRUVOUnczb0FTQUJRUUZxSVFFTTd3SUxJQUFnQVNJQklBSVF1b0NBZ0FBaUVBM29BU0FCSVFFTThnSUxBMEFDUUNBQkxRQUFRZkMxZ0lBQWFpMEFBQ0lRUVFGR0RRQWdFRUVDUnczckFTQUFLQUlFSVJBZ0FFRUFOZ0lFSUFBZ0VDQUJRUUZxSWdFUXVZQ0FnQUFpRUEzcUFTQUJJUUVNOUFJTElBRkJBV29pQVNBQ1J3MEFDMEVTSVJBTTRnTUxJQUFnQVNJQklBSVF1b0NBZ0FBaUVBM3BBU0FCSVFFTUNnc2dBU0lCSUFKSERRWkJHeUVRRE9BREN3SkFJQUVpQVNBQ1J3MEFRUlloRUF6Z0F3c2dBRUdLZ0lDQUFEWUNDQ0FBSUFFMkFnUWdBQ0FCSUFJUXVJQ0FnQUFpRUEzcUFTQUJJUUZCSUNFUURNWURDd0pBSUFFaUFTQUNSZzBBQTBBQ1FDQUJMUUFBUWZDM2dJQUFhaTBBQUNJUVFRSkdEUUFDUUNBUVFYOXFEZ1RsQWV3QkFPc0I3QUVMSUFGQkFXb2hBVUVJSVJBTXlBTUxJQUZCQVdvaUFTQUNSdzBBQzBFVklSQU0zd01MUVJVaEVBemVBd3NEUUFKQUlBRXRBQUJCOExtQWdBQnFMUUFBSWhCQkFrWU5BQ0FRUVg5cURnVGVBZXdCNEFIckFld0JDeUFCUVFGcUlnRWdBa2NOQUF0QkdDRVFETjBEQ3dKQUlBRWlBU0FDUmcwQUlBQkJpNENBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUVISVJBTXhBTUxRUmtoRUF6Y0F3c2dBVUVCYWlFQkRBSUxBa0FnQVNJVUlBSkhEUUJCR2lFUUROc0RDeUFVSVFFQ1FDQVVMUUFBUVhOcURoVGRBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBZ0R1QWd0QkFDRVFJQUJCQURZQ0hDQUFRYStMZ0lBQU5nSVFJQUJCQWpZQ0RDQUFJQlJCQVdvMkFoUU0yZ01MQWtBZ0FTMEFBQ0lRUVR0R0RRQWdFRUVOUnczb0FTQUJRUUZxSVFFTTVRSUxJQUZCQVdvaEFRdEJJaUVRREw4REN3SkFJQUVpRUNBQ1J3MEFRUndoRUF6WUF3dENBQ0VSSUJBaEFTQVFMUUFBUVZCcURqZm5BZVlCQVFJREJBVUdCd2dBQUFBQUFBQUFDUW9MREEwT0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUEVCRVNFeFFBQzBFZUlSQU12UU1MUWdJaEVRemxBUXRDQXlFUkRPUUJDMElFSVJFTTR3RUxRZ1VoRVF6aUFRdENCaUVSRE9FQkMwSUhJUkVNNEFFTFFnZ2hFUXpmQVF0Q0NTRVJETjRCQzBJS0lSRU0zUUVMUWdzaEVRemNBUXRDRENFUkROc0JDMElOSVJFTTJnRUxRZzRoRVF6WkFRdENEeUVSRE5nQkMwSUtJUkVNMXdFTFFnc2hFUXpXQVF0Q0RDRVJETlVCQzBJTklSRU0xQUVMUWc0aEVRelRBUXRDRHlFUkROSUJDMElBSVJFQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQkF0QUFCQlVHb09OK1VCNUFFQUFRSURCQVVHQitZQjVnSG1BZVlCNWdIbUFlWUJDQWtLQ3d3TjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQVE0UEVCRVNFK1lCQzBJQ0lSRU01QUVMUWdNaEVRempBUXRDQkNFUkRPSUJDMElGSVJFTTRRRUxRZ1loRVF6Z0FRdENCeUVSRE44QkMwSUlJUkVNM2dFTFFna2hFUXpkQVF0Q0NpRVJETndCQzBJTElSRU0yd0VMUWd3aEVRemFBUXRDRFNFUkROa0JDMElPSVJFTTJBRUxRZzhoRVF6WEFRdENDaUVSRE5ZQkMwSUxJUkVNMVFFTFFnd2hFUXpVQVF0Q0RTRVJETk1CQzBJT0lSRU0wZ0VMUWc4aEVRelJBUXNnQUVJQUlBQXBBeUFpRVNBQ0lBRWlFR3V0SWhKOUloTWdFeUFSVmhzM0F5QWdFU0FTVmlJVVJRM1NBVUVmSVJBTXdBTUxBa0FnQVNJQklBSkdEUUFnQUVHSmdJQ0FBRFlDQ0NBQUlBRTJBZ1FnQVNFQlFTUWhFQXluQXd0QklDRVFETDhEQ3lBQUlBRWlFQ0FDRUw2QWdJQUFRWDlxRGdXMkFRREZBZ0hSQWRJQkMwRVJJUkFNcEFNTElBQkJBVG9BTHlBUUlRRU11d01MSUFFaUFTQUNSdzNTQVVFa0lSQU11d01MSUFFaURTQUNSdzBlUWNZQUlSQU11Z01MSUFBZ0FTSUJJQUlRc29DQWdBQWlFQTNVQVNBQklRRU10UUVMSUFFaUVDQUNSdzBtUWRBQUlSQU11QU1MQWtBZ0FTSUJJQUpIRFFCQktDRVFETGdEQ3lBQVFRQTJBZ1FnQUVHTWdJQ0FBRFlDQ0NBQUlBRWdBUkN4Z0lDQUFDSVFEZE1CSUFFaEFRellBUXNDUUNBQkloQWdBa2NOQUVFcElSQU10d01MSUJBdEFBQWlBVUVnUmcwVUlBRkJDVWNOMHdFZ0VFRUJhaUVCREJVTEFrQWdBU0lCSUFKR0RRQWdBVUVCYWlFQkRCY0xRU29oRUF5MUF3c0NRQ0FCSWhBZ0FrY05BRUVySVJBTXRRTUxBa0FnRUMwQUFDSUJRUWxHRFFBZ0FVRWdSdzNWQVFzZ0FDMEFMRUVJUmczVEFTQVFJUUVNa1FNTEFrQWdBU0lCSUFKSERRQkJMQ0VRRExRREN5QUJMUUFBUVFwSERkVUJJQUZCQVdvaEFRekpBZ3NnQVNJT0lBSkhEZFVCUVM4aEVBeXlBd3NEUUFKQUlBRXRBQUFpRUVFZ1JnMEFBa0FnRUVGMmFnNEVBTndCM0FFQTJnRUxJQUVoQVF6Z0FRc2dBVUVCYWlJQklBSkhEUUFMUVRFaEVBeXhBd3RCTWlFUUlBRWlGQ0FDUmcyd0F5QUNJQlJySUFBb0FnQWlBV29oRlNBVUlBRnJRUU5xSVJZQ1FBTkFJQlF0QUFBaUYwRWdjaUFYSUJkQnYzOXFRZjhCY1VFYVNSdEIvd0Z4SUFGQjhMdUFnQUJxTFFBQVJ3MEJBa0FnQVVFRFJ3MEFRUVloQVF5V0F3c2dBVUVCYWlFQklCUkJBV29pRkNBQ1J3MEFDeUFBSUJVMkFnQU1zUU1MSUFCQkFEWUNBQ0FVSVFFTTJRRUxRVE1oRUNBQkloUWdBa1lOcndNZ0FpQVVheUFBS0FJQUlnRnFJUlVnRkNBQmEwRUlhaUVXQWtBRFFDQVVMUUFBSWhkQklISWdGeUFYUWI5L2FrSC9BWEZCR2trYlFmOEJjU0FCUWZTN2dJQUFhaTBBQUVjTkFRSkFJQUZCQ0VjTkFFRUZJUUVNbFFNTElBRkJBV29oQVNBVVFRRnFJaFFnQWtjTkFBc2dBQ0FWTmdJQURMQURDeUFBUVFBMkFnQWdGQ0VCRE5nQkMwRTBJUkFnQVNJVUlBSkdEYTRESUFJZ0ZHc2dBQ2dDQUNJQmFpRVZJQlFnQVd0QkJXb2hGZ0pBQTBBZ0ZDMEFBQ0lYUVNCeUlCY2dGMEcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUhRd29DQUFHb3RBQUJIRFFFQ1FDQUJRUVZIRFFCQkJ5RUJESlFEQ3lBQlFRRnFJUUVnRkVFQmFpSVVJQUpIRFFBTElBQWdGVFlDQUF5dkF3c2dBRUVBTmdJQUlCUWhBUXpYQVFzQ1FDQUJJZ0VnQWtZTkFBTkFBa0FnQVMwQUFFR0F2b0NBQUdvdEFBQWlFRUVCUmcwQUlCQkJBa1lOQ2lBQklRRU0zUUVMSUFGQkFXb2lBU0FDUncwQUMwRXdJUkFNcmdNTFFUQWhFQXl0QXdzQ1FDQUJJZ0VnQWtZTkFBTkFBa0FnQVMwQUFDSVFRU0JHRFFBZ0VFRjJhZzRFMlFIYUFkb0IyUUhhQVFzZ0FVRUJhaUlCSUFKSERRQUxRVGdoRUF5dEF3dEJPQ0VRREt3REN3TkFBa0FnQVMwQUFDSVFRU0JHRFFBZ0VFRUpSdzBEQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQQ0VRREtzREN3TkFBa0FnQVMwQUFDSVFRU0JHRFFBQ1FBSkFJQkJCZG1vT0JOb0JBUUhhQVFBTElCQkJMRVlOMndFTElBRWhBUXdFQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQeUVRREtvREN5QUJJUUVNMndFTFFjQUFJUkFnQVNJVUlBSkdEYWdESUFJZ0ZHc2dBQ2dDQUNJQmFpRVdJQlFnQVd0QkJtb2hGd0pBQTBBZ0ZDMEFBRUVnY2lBQlFZREFnSUFBYWkwQUFFY05BU0FCUVFaR0RZNERJQUZCQVdvaEFTQVVRUUZxSWhRZ0FrY05BQXNnQUNBV05nSUFES2tEQ3lBQVFRQTJBZ0FnRkNFQkMwRTJJUkFNamdNTEFrQWdBU0lQSUFKSERRQkJ3UUFoRUF5bkF3c2dBRUdNZ0lDQUFEWUNDQ0FBSUE4MkFnUWdEeUVCSUFBdEFDeEJmMm9PQk0wQjFRSFhBZGtCaHdNTElBRkJBV29oQVF6TUFRc0NRQ0FCSWdFZ0FrWU5BQU5BQWtBZ0FTMEFBQ0lRUVNCeUlCQWdFRUcvZjJwQi93RnhRUnBKRzBIL0FYRWlFRUVKUmcwQUlCQkJJRVlOQUFKQUFrQUNRQUpBSUJCQm5YOXFEaE1BQXdNREF3TURBd0VEQXdNREF3TURBd01DQXdzZ0FVRUJhaUVCUVRFaEVBeVJBd3NnQVVFQmFpRUJRVEloRUF5UUF3c2dBVUVCYWlFQlFUTWhFQXlQQXdzZ0FTRUJETkFCQ3lBQlFRRnFJZ0VnQWtjTkFBdEJOU0VRREtVREMwRTFJUkFNcEFNTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQkJnTHlBZ0FCcUxRQUFRUUZHRFFBZ0FTRUJETk1CQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQU0VRREtRREMwRTlJUkFNb3dNTElBQWdBU0lCSUFJUXNJQ0FnQUFpRUEzV0FTQUJJUUVNQVFzZ0VFRUJhaUVCQzBFOElSQU1od01MQWtBZ0FTSUJJQUpIRFFCQndnQWhFQXlnQXdzQ1FBTkFBa0FnQVMwQUFFRjNhZzRZQUFMK0F2NENoQVArQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0lBL2dJTElBRkJBV29pQVNBQ1J3MEFDMEhDQUNFUURLQURDeUFCUVFGcUlRRWdBQzBBTFVFQmNVVU52UUVnQVNFQkMwRXNJUkFNaFFNTElBRWlBU0FDUnczVEFVSEVBQ0VRREowREN3TkFBa0FnQVMwQUFFR1F3SUNBQUdvdEFBQkJBVVlOQUNBQklRRU10d0lMSUFGQkFXb2lBU0FDUncwQUMwSEZBQ0VRREp3REN5QU5MUUFBSWhCQklFWU5zd0VnRUVFNlJ3MkJBeUFBS0FJRUlRRWdBRUVBTmdJRUlBQWdBU0FORUsrQWdJQUFJZ0VOMEFFZ0RVRUJhaUVCRExNQ0MwSEhBQ0VRSUFFaURTQUNSZzJhQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRVnFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRWkRDZ0lBQWFpMEFBRWNOZ0FNZ0FVRUZSZzMwQWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5YUF3dEJ5QUFoRUNBQklnMGdBa1lObVFNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRUphaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdXd29DQUFHb3RBQUJIRGY4Q0FrQWdBVUVKUncwQVFRSWhBUXoxQWdzZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTW1RTUxBa0FnQVNJTklBSkhEUUJCeVFBaEVBeVpBd3NDUUFKQUlBMHRBQUFpQVVFZ2NpQUJJQUZCdjM5cVFmOEJjVUVhU1J0Qi93RnhRWkovYWc0SEFJQURnQU9BQTRBRGdBTUJnQU1MSUExQkFXb2hBVUUrSVJBTWdBTUxJQTFCQVdvaEFVRS9JUkFNL3dJTFFjb0FJUkFnQVNJTklBSkdEWmNESUFJZ0RXc2dBQ2dDQUNJQmFpRVdJQTBnQVd0QkFXb2hGd05BSUEwdEFBQWlGRUVnY2lBVUlCUkJ2MzlxUWY4QmNVRWFTUnRCL3dGeElBRkJvTUtBZ0FCcUxRQUFSdzM5QWlBQlFRRkdEZkFDSUFGQkFXb2hBU0FOUVFGcUlnMGdBa2NOQUFzZ0FDQVdOZ0lBREpjREMwSExBQ0VRSUFFaURTQUNSZzJXQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRNXFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRYUxDZ0lBQWFpMEFBRWNOL0FJZ0FVRU9SZzN3QWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5V0F3dEJ6QUFoRUNBQklnMGdBa1lObFFNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRVBhaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUhBd29DQUFHb3RBQUJIRGZzQ0FrQWdBVUVQUncwQVFRTWhBUXp4QWdzZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTWxRTUxRYzBBSVJBZ0FTSU5JQUpHRFpRRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJCV29oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCME1LQWdBQnFMUUFBUnczNkFnSkFJQUZCQlVjTkFFRUVJUUVNOEFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKUURDd0pBSUFFaURTQUNSdzBBUWM0QUlSQU1sQU1MQWtBQ1FBSkFBa0FnRFMwQUFDSUJRU0J5SUFFZ0FVRy9mMnBCL3dGeFFScEpHMEgvQVhGQm5YOXFEaE1BL1FMOUF2MEMvUUw5QXYwQy9RTDlBdjBDL1FMOUF2MENBZjBDL1FMOUFnSUQvUUlMSUExQkFXb2hBVUhCQUNFUURQMENDeUFOUVFGcUlRRkJ3Z0FoRUF6OEFnc2dEVUVCYWlFQlFjTUFJUkFNK3dJTElBMUJBV29oQVVIRUFDRVFEUG9DQ3dKQUlBRWlBU0FDUmcwQUlBQkJqWUNBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUhGQUNFUURQb0NDMEhQQUNFUURKSURDeUFRSVFFQ1FBSkFJQkF0QUFCQmRtb09CQUdvQXFnQ0FLZ0NDeUFRUVFGcUlRRUxRU2NoRUF6NEFnc0NRQ0FCSWdFZ0FrY05BRUhSQUNFUURKRURDd0pBSUFFdEFBQkJJRVlOQUNBQklRRU1qUUVMSUFGQkFXb2hBU0FBTFFBdFFRRnhSUTNIQVNBQklRRU1qQUVMSUFFaUZ5QUNSdzNJQVVIU0FDRVFESThEQzBIVEFDRVFJQUVpRkNBQ1JnMk9BeUFDSUJScklBQW9BZ0FpQVdvaEZpQVVJQUZyUVFGcUlSY0RRQ0FVTFFBQUlBRkIxc0tBZ0FCcUxRQUFSdzNNQVNBQlFRRkdEY2NCSUFGQkFXb2hBU0FVUVFGcUloUWdBa2NOQUFzZ0FDQVdOZ0lBREk0REN3SkFJQUVpQVNBQ1J3MEFRZFVBSVJBTWpnTUxJQUV0QUFCQkNrY056QUVnQVVFQmFpRUJETWNCQ3dKQUlBRWlBU0FDUncwQVFkWUFJUkFNalFNTEFrQUNRQ0FCTFFBQVFYWnFEZ1FBelFITkFRSE5BUXNnQVVFQmFpRUJETWNCQ3lBQlFRRnFJUUZCeWdBaEVBenpBZ3NnQUNBQklnRWdBaEN1Z0lDQUFDSVFEY3NCSUFFaEFVSE5BQ0VRRFBJQ0N5QUFMUUFwUVNKR0RZVURES1lDQ3dKQUlBRWlBU0FDUncwQVFkc0FJUkFNaWdNTFFRQWhGRUVCSVJkQkFTRVdRUUFoRUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQkxRQUFRVkJxRGdyVUFkTUJBQUVDQXdRRkJnalZBUXRCQWlFUURBWUxRUU1oRUF3RkMwRUVJUkFNQkF0QkJTRVFEQU1MUVFZaEVBd0NDMEVISVJBTUFRdEJDQ0VRQzBFQUlSZEJBQ0VXUVFBaEZBek1BUXRCQ1NFUVFRRWhGRUVBSVJkQkFDRVdETXNCQ3dKQUlBRWlBU0FDUncwQVFkMEFJUkFNaVFNTElBRXRBQUJCTGtjTnpBRWdBVUVCYWlFQkRLWUNDeUFCSWdFZ0FrY056QUZCM3dBaEVBeUhBd3NDUUNBQklnRWdBa1lOQUNBQVFZNkFnSUFBTmdJSUlBQWdBVFlDQkNBQklRRkIwQUFoRUF6dUFndEI0QUFoRUF5R0F3dEI0UUFoRUNBQklnRWdBa1lOaFFNZ0FpQUJheUFBS0FJQUloUnFJUllnQVNBVWEwRURhaUVYQTBBZ0FTMEFBQ0FVUWVMQ2dJQUFhaTBBQUVjTnpRRWdGRUVEUmczTUFTQVVRUUZxSVJRZ0FVRUJhaUlCSUFKSERRQUxJQUFnRmpZQ0FBeUZBd3RCNGdBaEVDQUJJZ0VnQWtZTmhBTWdBaUFCYXlBQUtBSUFJaFJxSVJZZ0FTQVVhMEVDYWlFWEEwQWdBUzBBQUNBVVFlYkNnSUFBYWkwQUFFY056QUVnRkVFQ1JnM09BU0FVUVFGcUlSUWdBVUVCYWlJQklBSkhEUUFMSUFBZ0ZqWUNBQXlFQXd0QjR3QWhFQ0FCSWdFZ0FrWU5nd01nQWlBQmF5QUFLQUlBSWhScUlSWWdBU0FVYTBFRGFpRVhBMEFnQVMwQUFDQVVRZW5DZ0lBQWFpMEFBRWNOeXdFZ0ZFRURSZzNPQVNBVVFRRnFJUlFnQVVFQmFpSUJJQUpIRFFBTElBQWdGallDQUF5REF3c0NRQ0FCSWdFZ0FrY05BRUhsQUNFUURJTURDeUFBSUFGQkFXb2lBU0FDRUtpQWdJQUFJaEFOelFFZ0FTRUJRZFlBSVJBTTZRSUxBa0FnQVNJQklBSkdEUUFEUUFKQUlBRXRBQUFpRUVFZ1JnMEFBa0FDUUFKQUlCQkJ1SDlxRGdzQUFjOEJ6d0hQQWM4Qnp3SFBBYzhCendFQ3p3RUxJQUZCQVdvaEFVSFNBQ0VRRE8wQ0N5QUJRUUZxSVFGQjB3QWhFQXpzQWdzZ0FVRUJhaUVCUWRRQUlSQU02d0lMSUFGQkFXb2lBU0FDUncwQUMwSGtBQ0VRRElJREMwSGtBQ0VRRElFREN3TkFBa0FnQVMwQUFFSHd3b0NBQUdvdEFBQWlFRUVCUmcwQUlCQkJmbW9PQTg4QjBBSFJBZElCQ3lBQlFRRnFJZ0VnQWtjTkFBdEI1Z0FoRUF5QUF3c0NRQ0FCSWdFZ0FrWU5BQ0FCUVFGcUlRRU1Bd3RCNXdBaEVBei9BZ3NEUUFKQUlBRXRBQUJCOE1TQWdBQnFMUUFBSWhCQkFVWU5BQUpBSUJCQmZtb09CTklCMHdIVUFRRFZBUXNnQVNFQlFkY0FJUkFNNXdJTElBRkJBV29pQVNBQ1J3MEFDMEhvQUNFUURQNENDd0pBSUFFaUFTQUNSdzBBUWVrQUlSQU0vZ0lMQWtBZ0FTMEFBQ0lRUVhacURocTZBZFVCMVFHOEFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFjb0IxUUhWQVFEVEFRc2dBVUVCYWlFQkMwRUdJUkFNNHdJTEEwQUNRQ0FCTFFBQVFmREdnSUFBYWkwQUFFRUJSZzBBSUFFaEFReWVBZ3NnQVVFQmFpSUJJQUpIRFFBTFFlb0FJUkFNK3dJTEFrQWdBU0lCSUFKR0RRQWdBVUVCYWlFQkRBTUxRZXNBSVJBTStnSUxBa0FnQVNJQklBSkhEUUJCN0FBaEVBejZBZ3NnQVVFQmFpRUJEQUVMQWtBZ0FTSUJJQUpIRFFCQjdRQWhFQXo1QWdzZ0FVRUJhaUVCQzBFRUlSQU0zZ0lMQWtBZ0FTSVVJQUpIRFFCQjdnQWhFQXozQWdzZ0ZDRUJBa0FDUUFKQUlCUXRBQUJCOE1pQWdBQnFMUUFBUVg5cURnZlVBZFVCMWdFQW5BSUJBdGNCQ3lBVVFRRnFJUUVNQ2dzZ0ZFRUJhaUVCRE0wQkMwRUFJUkFnQUVFQU5nSWNJQUJCbTVLQWdBQTJBaEFnQUVFSE5nSU1JQUFnRkVFQmFqWUNGQXoyQWdzQ1FBTkFBa0FnQVMwQUFFSHd5SUNBQUdvdEFBQWlFRUVFUmcwQUFrQUNRQ0FRUVg5cURnZlNBZE1CMUFIWkFRQUVBZGtCQ3lBQklRRkIyZ0FoRUF6Z0Fnc2dBVUVCYWlFQlFkd0FJUkFNM3dJTElBRkJBV29pQVNBQ1J3MEFDMEh2QUNFUURQWUNDeUFCUVFGcUlRRU15d0VMQWtBZ0FTSVVJQUpIRFFCQjhBQWhFQXoxQWdzZ0ZDMEFBRUV2UnczVUFTQVVRUUZxSVFFTUJnc0NRQ0FCSWhRZ0FrY05BRUh4QUNFUURQUUNDd0pBSUJRdEFBQWlBVUV2UncwQUlCUkJBV29oQVVIZEFDRVFETnNDQ3lBQlFYWnFJZ1JCRmtzTjB3RkJBU0FFZEVHSmdJQUNjVVVOMHdFTXlnSUxBa0FnQVNJQklBSkdEUUFnQVVFQmFpRUJRZDRBSVJBTTJnSUxRZklBSVJBTThnSUxBa0FnQVNJVUlBSkhEUUJCOUFBaEVBenlBZ3NnRkNFQkFrQWdGQzBBQUVId3pJQ0FBR290QUFCQmYyb09BOGtDbEFJQTFBRUxRZUVBSVJBTTJBSUxBa0FnQVNJVUlBSkdEUUFEUUFKQUlCUXRBQUJCOE1xQWdBQnFMUUFBSWdGQkEwWU5BQUpBSUFGQmYyb09Bc3NDQU5VQkN5QVVJUUZCM3dBaEVBemFBZ3NnRkVFQmFpSVVJQUpIRFFBTFFmTUFJUkFNOFFJTFFmTUFJUkFNOEFJTEFrQWdBU0lCSUFKR0RRQWdBRUdQZ0lDQUFEWUNDQ0FBSUFFMkFnUWdBU0VCUWVBQUlSQU0xd0lMUWZVQUlSQU03d0lMQWtBZ0FTSUJJQUpIRFFCQjlnQWhFQXp2QWdzZ0FFR1BnSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJDMEVESVJBTTFBSUxBMEFnQVMwQUFFRWdSdzNEQWlBQlFRRnFJZ0VnQWtjTkFBdEI5d0FoRUF6c0Fnc0NRQ0FCSWdFZ0FrY05BRUg0QUNFUURPd0NDeUFCTFFBQVFTQkhEYzRCSUFGQkFXb2hBUXp2QVFzZ0FDQUJJZ0VnQWhDc2dJQ0FBQ0lRRGM0QklBRWhBUXlPQWdzQ1FDQUJJZ1FnQWtjTkFFSDZBQ0VRRE9vQ0N5QUVMUUFBUWN3QVJ3M1JBU0FFUVFGcUlRRkJFeUVRRE04QkN3SkFJQUVpQkNBQ1J3MEFRZnNBSVJBTTZRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQldvaEVBTkFJQVF0QUFBZ0FVSHd6b0NBQUdvdEFBQkhEZEFCSUFGQkJVWU56Z0VnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCK3dBaEVBem9BZ3NDUUNBQklnUWdBa2NOQUVIOEFDRVFET2dDQ3dKQUFrQWdCQzBBQUVHOWYyb09EQURSQWRFQjBRSFJBZEVCMFFIUkFkRUIwUUhSQVFIUkFRc2dCRUVCYWlFQlFlWUFJUkFNendJTElBUkJBV29oQVVIbkFDRVFETTRDQ3dKQUlBRWlCQ0FDUncwQVFmMEFJUkFNNXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBbW9oRUFKQUEwQWdCQzBBQUNBQlFlM1BnSUFBYWkwQUFFY056d0VnQVVFQ1JnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjBBSVJBTTV3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQkVDRVFETXdCQ3dKQUlBRWlCQ0FDUncwQVFmNEFJUkFNNWdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCV29oRUFKQUEwQWdCQzBBQUNBQlFmYk9nSUFBYWkwQUFFY056Z0VnQVVFRlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjRBSVJBTTVnSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkZpRVFETXNCQ3dKQUlBRWlCQ0FDUncwQVFmOEFJUkFNNVFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBMm9oRUFKQUEwQWdCQzBBQUNBQlFmek9nSUFBYWkwQUFFY056UUVnQVVFRFJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjhBSVJBTTVRSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkJTRVFETW9CQ3dKQUlBRWlCQ0FDUncwQVFZQUJJUkFNNUFJTElBUXRBQUJCMlFCSERjc0JJQVJCQVdvaEFVRUlJUkFNeVFFTEFrQWdBU0lFSUFKSERRQkJnUUVoRUF6akFnc0NRQUpBSUFRdEFBQkJzbjlxRGdNQXpBRUJ6QUVMSUFSQkFXb2hBVUhyQUNFUURNb0NDeUFFUVFGcUlRRkI3QUFoRUF6SkFnc0NRQ0FCSWdRZ0FrY05BRUdDQVNFUURPSUNDd0pBQWtBZ0JDMEFBRUc0ZjJvT0NBRExBY3NCeXdITEFjc0J5d0VCeXdFTElBUkJBV29oQVVIcUFDRVFETWtDQ3lBRVFRRnFJUUZCN1FBaEVBeklBZ3NDUUNBQklnUWdBa2NOQUVHREFTRVFET0VDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hFQ0FFSUFGclFRSnFJUlFDUUFOQUlBUXRBQUFnQVVHQXo0Q0FBR290QUFCSERja0JJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRURZQ0FFR0RBU0VRRE9FQ0MwRUFJUkFnQUVFQU5nSUFJQlJCQVdvaEFRekdBUXNDUUNBQklnUWdBa2NOQUVHRUFTRVFET0FDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRUnFJUkFDUUFOQUlBUXRBQUFnQVVHRHo0Q0FBR290QUFCSERjZ0JJQUZCQkVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR0VBU0VRRE9BQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVNNaEVBekZBUXNDUUNBQklnUWdBa2NOQUVHRkFTRVFETjhDQ3dKQUFrQWdCQzBBQUVHMGYyb09DQURJQWNnQnlBSElBY2dCeUFFQnlBRUxJQVJCQVdvaEFVSHZBQ0VRRE1ZQ0N5QUVRUUZxSVFGQjhBQWhFQXpGQWdzQ1FDQUJJZ1FnQWtjTkFFR0dBU0VRRE40Q0N5QUVMUUFBUWNVQVJ3M0ZBU0FFUVFGcUlRRU1nd0lMQWtBZ0FTSUVJQUpIRFFCQmh3RWhFQXpkQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRURhaUVRQWtBRFFDQUVMUUFBSUFGQmlNK0FnQUJxTFFBQVJ3M0ZBU0FCUVFOR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJod0VoRUF6ZEFnc2dBRUVBTmdJQUlCQkJBV29oQVVFdElSQU13Z0VMQWtBZ0FTSUVJQUpIRFFCQmlBRWhFQXpjQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUlhaUVRQWtBRFFDQUVMUUFBSUFGQjBNK0FnQUJxTFFBQVJ3M0VBU0FCUVFoR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJpQUVoRUF6Y0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFcElSQU13UUVMQWtBZ0FTSUJJQUpIRFFCQmlRRWhFQXpiQWd0QkFTRVFJQUV0QUFCQjN3QkhEY0FCSUFGQkFXb2hBUXlCQWdzQ1FDQUJJZ1FnQWtjTkFFR0tBU0VRRE5vQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUZxSVJBRFFDQUVMUUFBSUFGQmpNK0FnQUJxTFFBQVJ3M0JBU0FCUVFGR0RhOENJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWW9CSVJBTTJRSUxBa0FnQVNJRUlBSkhEUUJCaXdFaEVBelpBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQ2FpRVFBa0FEUUNBRUxRQUFJQUZCanMrQWdBQnFMUUFBUnczQkFTQUJRUUpHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQml3RWhFQXpaQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVDSVJBTXZnRUxBa0FnQVNJRUlBSkhEUUJCakFFaEVBellBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCOE0rQWdBQnFMUUFBUnczQUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQmpBRWhFQXpZQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVmSVJBTXZRRUxBa0FnQVNJRUlBSkhEUUJCalFFaEVBelhBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCOHMrQWdBQnFMUUFBUncyL0FTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQmpRRWhFQXpYQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVKSVJBTXZBRUxBa0FnQVNJRUlBSkhEUUJCamdFaEVBeldBZ3NDUUFKQUlBUXRBQUJCdDM5cURnY0F2d0cvQWI4QnZ3Ry9BUUcvQVFzZ0JFRUJhaUVCUWZnQUlSQU12UUlMSUFSQkFXb2hBVUg1QUNFUURMd0NDd0pBSUFFaUJDQUNSdzBBUVk4QklSQU0xUUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUVpIUGdJQUFhaTBBQUVjTnZRRWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZOEJJUkFNMVFJTElBQkJBRFlDQUNBUVFRRnFJUUZCR0NFUURMb0JDd0pBSUFFaUJDQUNSdzBBUVpBQklSQU0xQUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUVpmUGdJQUFhaTBBQUVjTnZBRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaQUJJUkFNMUFJTElBQkJBRFlDQUNBUVFRRnFJUUZCRnlFUURMa0JDd0pBSUFFaUJDQUNSdzBBUVpFQklSQU0wd0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJtb2hFQUpBQTBBZ0JDMEFBQ0FCUVpyUGdJQUFhaTBBQUVjTnV3RWdBVUVHUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaRUJJUkFNMHdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRlNFUURMZ0JDd0pBSUFFaUJDQUNSdzBBUVpJQklSQU0wZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUWFIUGdJQUFhaTBBQUVjTnVnRWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaSUJJUkFNMGdJTElBQkJBRFlDQUNBUVFRRnFJUUZCSGlFUURMY0JDd0pBSUFFaUJDQUNSdzBBUVpNQklSQU0wUUlMSUFRdEFBQkJ6QUJIRGJnQklBUkJBV29oQVVFS0lSQU10Z0VMQWtBZ0JDQUNSdzBBUVpRQklSQU0wQUlMQWtBQ1FDQUVMUUFBUWI5L2FnNFBBTGtCdVFHNUFia0J1UUc1QWJrQnVRRzVBYmtCdVFHNUFia0JBYmtCQ3lBRVFRRnFJUUZCL2dBaEVBeTNBZ3NnQkVFQmFpRUJRZjhBSVJBTXRnSUxBa0FnQkNBQ1J3MEFRWlVCSVJBTXp3SUxBa0FDUUNBRUxRQUFRYjkvYWc0REFMZ0JBYmdCQ3lBRVFRRnFJUUZCL1FBaEVBeTJBZ3NnQkVFQmFpRUVRWUFCSVJBTXRRSUxBa0FnQkNBQ1J3MEFRWllCSVJBTXpnSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRYWZQZ0lBQWFpMEFBRWNOdGdFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVpZQklSQU16Z0lMSUFCQkFEWUNBQ0FRUVFGcUlRRkJDeUVRRExNQkN3SkFJQVFnQWtjTkFFR1hBU0VRRE0wQ0N3SkFBa0FDUUFKQUlBUXRBQUJCVTJvT0l3QzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0JBYmdCdUFHNEFiZ0J1QUVDdUFHNEFiZ0JBN2dCQ3lBRVFRRnFJUUZCK3dBaEVBeTJBZ3NnQkVFQmFpRUJRZndBSVJBTXRRSUxJQVJCQVdvaEJFR0JBU0VRRExRQ0N5QUVRUUZxSVFSQmdnRWhFQXl6QWdzQ1FDQUVJQUpIRFFCQm1BRWhFQXpNQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQnFjK0FnQUJxTFFBQVJ3MjBBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJtQUVoRUF6TUFnc2dBRUVBTmdJQUlCQkJBV29oQVVFWklSQU1zUUVMQWtBZ0JDQUNSdzBBUVprQklSQU15d0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUWE3UGdJQUFhaTBBQUVjTnN3RWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaa0JJUkFNeXdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQmlFUURMQUJDd0pBSUFRZ0FrY05BRUdhQVNFUURNb0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFGcUlSQUNRQU5BSUFRdEFBQWdBVUcwejRDQUFHb3RBQUJIRGJJQklBRkJBVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHYUFTRVFETW9DQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUndoRUF5dkFRc0NRQ0FFSUFKSERRQkJtd0VoRUF6SkFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVCYWlFUUFrQURRQ0FFTFFBQUlBRkJ0cytBZ0FCcUxRQUFSdzJ4QVNBQlFRRkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCbXdFaEVBekpBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRW5JUkFNcmdFTEFrQWdCQ0FDUncwQVFad0JJUkFNeUFJTEFrQUNRQ0FFTFFBQVFheC9hZzRDQUFHeEFRc2dCRUVCYWlFRVFZWUJJUkFNcndJTElBUkJBV29oQkVHSEFTRVFESzRDQ3dKQUlBUWdBa2NOQUVHZEFTRVFETWNDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRRnFJUkFDUUFOQUlBUXRBQUFnQVVHNHo0Q0FBR290QUFCSERhOEJJQUZCQVVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR2RBU0VRRE1jQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVNZaEVBeXNBUXNDUUNBRUlBSkhEUUJCbmdFaEVBekdBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCdXMrQWdBQnFMUUFBUncydUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQm5nRWhFQXpHQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVESVJBTXF3RUxBa0FnQkNBQ1J3MEFRWjhCSVJBTXhRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQW1vaEVBSkFBMEFnQkMwQUFDQUJRZTNQZ0lBQWFpMEFBRWNOclFFZ0FVRUNSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVo4QklSQU14UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJEQ0VRREtvQkN3SkFJQVFnQWtjTkFFR2dBU0VRRE1RQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUU5xSVJBQ1FBTkFJQVF0QUFBZ0FVRzh6NENBQUdvdEFBQkhEYXdCSUFGQkEwWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdnQVNFUURNUUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFRMGhFQXlwQVFzQ1FDQUVJQUpIRFFCQm9RRWhFQXpEQWdzQ1FBSkFJQVF0QUFCQnVuOXFEZ3NBckFHc0Fhd0JyQUdzQWF3QnJBR3NBYXdCQWF3QkN5QUVRUUZxSVFSQml3RWhFQXlxQWdzZ0JFRUJhaUVFUVl3QklSQU1xUUlMQWtBZ0JDQUNSdzBBUWFJQklSQU13Z0lMSUFRdEFBQkIwQUJIRGFrQklBUkJBV29oQkF6cEFRc0NRQ0FFSUFKSERRQkJvd0VoRUF6QkFnc0NRQUpBSUFRdEFBQkJ0MzlxRGdjQnFnR3FBYW9CcWdHcUFRQ3FBUXNnQkVFQmFpRUVRWTRCSVJBTXFBSUxJQVJCQVdvaEFVRWlJUkFNcGdFTEFrQWdCQ0FDUncwQVFhUUJJUkFNd0FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBV29oRUFKQUEwQWdCQzBBQUNBQlFjRFBnSUFBYWkwQUFFY05xQUVnQVVFQlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYVFCSVJBTXdBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkhTRVFES1VCQ3dKQUlBUWdBa2NOQUVHbEFTRVFETDhDQ3dKQUFrQWdCQzBBQUVHdWYyb09Bd0NvQVFHb0FRc2dCRUVCYWlFRVFaQUJJUkFNcGdJTElBUkJBV29oQVVFRUlSQU1wQUVMQWtBZ0JDQUNSdzBBUWFZQklSQU12Z0lMQWtBQ1FBSkFBa0FDUUNBRUxRQUFRYjkvYWc0VkFLb0JxZ0dxQWFvQnFnR3FBYW9CcWdHcUFhb0JBYW9CcWdFQ3FnR3FBUU9xQWFvQkJLb0JDeUFFUVFGcUlRUkJpQUVoRUF5b0Fnc2dCRUVCYWlFRVFZa0JJUkFNcHdJTElBUkJBV29oQkVHS0FTRVFES1lDQ3lBRVFRRnFJUVJCandFaEVBeWxBZ3NnQkVFQmFpRUVRWkVCSVJBTXBBSUxBa0FnQkNBQ1J3MEFRYWNCSVJBTXZRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQW1vaEVBSkFBMEFnQkMwQUFDQUJRZTNQZ0lBQWFpMEFBRWNOcFFFZ0FVRUNSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWFjQklSQU12UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJFU0VRREtJQkN3SkFJQVFnQWtjTkFFR29BU0VRREx3Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSEN6NENBQUdvdEFBQkhEYVFCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdvQVNFUURMd0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFTd2hFQXloQVFzQ1FDQUVJQUpIRFFCQnFRRWhFQXk3QWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQnhjK0FnQUJxTFFBQVJ3MmpBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJxUUVoRUF5N0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFcklSQU1vQUVMQWtBZ0JDQUNSdzBBUWFvQklSQU11Z0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUWNyUGdJQUFhaTBBQUVjTm9nRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFhb0JJUkFNdWdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRkNFUURKOEJDd0pBSUFRZ0FrY05BRUdyQVNFUURMa0NDd0pBQWtBQ1FBSkFJQVF0QUFCQnZuOXFEZzhBQVFLa0FhUUJwQUdrQWFRQnBBR2tBYVFCcEFHa0FhUUJBNlFCQ3lBRVFRRnFJUVJCa3dFaEVBeWlBZ3NnQkVFQmFpRUVRWlFCSVJBTW9RSUxJQVJCQVdvaEJFR1ZBU0VRREtBQ0N5QUVRUUZxSVFSQmxnRWhFQXlmQWdzQ1FDQUVJQUpIRFFCQnJBRWhFQXk0QWdzZ0JDMEFBRUhGQUVjTm53RWdCRUVCYWlFRURPQUJDd0pBSUFRZ0FrY05BRUd0QVNFUURMY0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUhOejRDQUFHb3RBQUJIRFo4QklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHdEFTRVFETGNDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUTRoRUF5Y0FRc0NRQ0FFSUFKSERRQkJyZ0VoRUF5MkFnc2dCQzBBQUVIUUFFY05uUUVnQkVFQmFpRUJRU1VoRUF5YkFRc0NRQ0FFSUFKSERRQkJyd0VoRUF5MUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVJYWlFUUFrQURRQ0FFTFFBQUlBRkIwTStBZ0FCcUxRQUFSdzJkQVNBQlFRaEdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCcndFaEVBeTFBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRXFJUkFNbWdFTEFrQWdCQ0FDUncwQVFiQUJJUkFNdEFJTEFrQUNRQ0FFTFFBQVFhdC9hZzRMQUowQm5RR2RBWjBCblFHZEFaMEJuUUdkQVFHZEFRc2dCRUVCYWlFRVFab0JJUkFNbXdJTElBUkJBV29oQkVHYkFTRVFESm9DQ3dKQUlBUWdBa2NOQUVHeEFTRVFETE1DQ3dKQUFrQWdCQzBBQUVHL2Yyb09GQUNjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUVCbkFFTElBUkJBV29oQkVHWkFTRVFESm9DQ3lBRVFRRnFJUVJCbkFFaEVBeVpBZ3NDUUNBRUlBSkhEUUJCc2dFaEVBeXlBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFRGFpRVFBa0FEUUNBRUxRQUFJQUZCMmMrQWdBQnFMUUFBUncyYUFTQUJRUU5HRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQnNnRWhFQXl5QWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVoSVJBTWx3RUxBa0FnQkNBQ1J3MEFRYk1CSVJBTXNRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQm1vaEVBSkFBMEFnQkMwQUFDQUJRZDNQZ0lBQWFpMEFBRWNObVFFZ0FVRUdSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWJNQklSQU1zUUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJHaUVRREpZQkN3SkFJQVFnQWtjTkFFRzBBU0VRRExBQ0N3SkFBa0FDUUNBRUxRQUFRYnQvYWc0UkFKb0JtZ0dhQVpvQm1nR2FBWm9CbWdHYUFRR2FBWm9CbWdHYUFab0JBcG9CQ3lBRVFRRnFJUVJCblFFaEVBeVlBZ3NnQkVFQmFpRUVRWjRCSVJBTWx3SUxJQVJCQVdvaEJFR2ZBU0VRREpZQ0N3SkFJQVFnQWtjTkFFRzFBU0VRREs4Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUVZxSVJBQ1FBTkFJQVF0QUFBZ0FVSGt6NENBQUdvdEFBQkhEWmNCSUFGQkJVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUcxQVNFUURLOENDeUFBUVFBMkFnQWdFRUVCYWlFQlFTZ2hFQXlVQVFzQ1FDQUVJQUpIRFFCQnRnRWhFQXl1QWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUNhaUVRQWtBRFFDQUVMUUFBSUFGQjZzK0FnQUJxTFFBQVJ3MldBU0FCUVFKR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJ0Z0VoRUF5dUFnc2dBRUVBTmdJQUlCQkJBV29oQVVFSElSQU1rd0VMQWtBZ0JDQUNSdzBBUWJjQklSQU1yUUlMQWtBQ1FDQUVMUUFBUWJ0L2FnNE9BSllCbGdHV0FaWUJsZ0dXQVpZQmxnR1dBWllCbGdHV0FRR1dBUXNnQkVFQmFpRUVRYUVCSVJBTWxBSUxJQVJCQVdvaEJFR2lBU0VRREpNQ0N3SkFJQVFnQWtjTkFFRzRBU0VRREt3Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSHR6NENBQUdvdEFBQkhEWlFCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUc0QVNFUURLd0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFSSWhFQXlSQVFzQ1FDQUVJQUpIRFFCQnVRRWhFQXlyQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQWtBRFFDQUVMUUFBSUFGQjhNK0FnQUJxTFFBQVJ3MlRBU0FCUVFGR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJ1UUVoRUF5ckFnc2dBRUVBTmdJQUlCQkJBV29oQVVFZ0lSQU1rQUVMQWtBZ0JDQUNSdzBBUWJvQklSQU1xZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZMUGdJQUFhaTBBQUVjTmtnRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFib0JJUkFNcWdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRHlFUURJOEJDd0pBSUFRZ0FrY05BRUc3QVNFUURLa0NDd0pBQWtBZ0JDMEFBRUczZjJvT0J3Q1NBWklCa2dHU0FaSUJBWklCQ3lBRVFRRnFJUVJCcFFFaEVBeVFBZ3NnQkVFQmFpRUVRYVlCSVJBTWp3SUxBa0FnQkNBQ1J3MEFRYndCSVJBTXFBSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQjJvaEVBSkFBMEFnQkMwQUFDQUJRZlRQZ0lBQWFpMEFBRWNOa0FFZ0FVRUhSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWJ3QklSQU1xQUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJHeUVRREkwQkN3SkFJQVFnQWtjTkFFRzlBU0VRREtjQ0N3SkFBa0FDUUNBRUxRQUFRYjUvYWc0U0FKRUJrUUdSQVpFQmtRR1JBWkVCa1FHUkFRR1JBWkVCa1FHUkFaRUJrUUVDa1FFTElBUkJBV29oQkVHa0FTRVFESThDQ3lBRVFRRnFJUVJCcHdFaEVBeU9BZ3NnQkVFQmFpRUVRYWdCSVJBTWpRSUxBa0FnQkNBQ1J3MEFRYjRCSVJBTXBnSUxJQVF0QUFCQnpnQkhEWTBCSUFSQkFXb2hCQXpQQVFzQ1FDQUVJQUpIRFFCQnZ3RWhFQXlsQWdzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFTFFBQVFiOS9hZzRWQUFFQ0E1d0JCQVVHbkFHY0Fad0JCd2dKQ2d1Y0FRd05EZytjQVFzZ0JFRUJhaUVCUWVnQUlSQU1tZ0lMSUFSQkFXb2hBVUhwQUNFUURKa0NDeUFFUVFGcUlRRkI3Z0FoRUF5WUFnc2dCRUVCYWlFQlFmSUFJUkFNbHdJTElBUkJBV29oQVVIekFDRVFESllDQ3lBRVFRRnFJUUZCOWdBaEVBeVZBZ3NnQkVFQmFpRUJRZmNBSVJBTWxBSUxJQVJCQVdvaEFVSDZBQ0VRREpNQ0N5QUVRUUZxSVFSQmd3RWhFQXlTQWdzZ0JFRUJhaUVFUVlRQklSQU1rUUlMSUFSQkFXb2hCRUdGQVNFUURKQUNDeUFFUVFGcUlRUkJrZ0VoRUF5UEFnc2dCRUVCYWlFRVFaZ0JJUkFNamdJTElBUkJBV29oQkVHZ0FTRVFESTBDQ3lBRVFRRnFJUVJCb3dFaEVBeU1BZ3NnQkVFQmFpRUVRYW9CSVJBTWl3SUxBa0FnQkNBQ1JnMEFJQUJCa0lDQWdBQTJBZ2dnQUNBRU5nSUVRYXNCSVJBTWl3SUxRY0FCSVJBTW93SUxJQUFnQlNBQ0VLcUFnSUFBSWdFTml3RWdCU0VCREZ3TEFrQWdCaUFDUmcwQUlBWkJBV29oQlF5TkFRdEJ3Z0VoRUF5aEFnc0RRQUpBSUJBdEFBQkJkbW9PQkl3QkFBQ1BBUUFMSUJCQkFXb2lFQ0FDUncwQUMwSERBU0VRREtBQ0N3SkFJQWNnQWtZTkFDQUFRWkdBZ0lBQU5nSUlJQUFnQnpZQ0JDQUhJUUZCQVNFUURJY0NDMEhFQVNFUURKOENDd0pBSUFjZ0FrY05BRUhGQVNFUURKOENDd0pBQWtBZ0J5MEFBRUYyYWc0RUFjNEJ6Z0VBemdFTElBZEJBV29oQmd5TkFRc2dCMEVCYWlFRkRJa0JDd0pBSUFjZ0FrY05BRUhHQVNFUURKNENDd0pBQWtBZ0J5MEFBRUYyYWc0WEFZOEJqd0VCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCQUk4QkN5QUhRUUZxSVFjTFFiQUJJUkFNaEFJTEFrQWdDQ0FDUncwQVFjZ0JJUkFNblFJTElBZ3RBQUJCSUVjTmpRRWdBRUVBT3dFeUlBaEJBV29oQVVHekFTRVFESU1DQ3lBQklSY0NRQU5BSUJjaUJ5QUNSZzBCSUFjdEFBQkJVR3BCL3dGeEloQkJDazhOekFFQ1FDQUFMd0V5SWhSQm1UTkxEUUFnQUNBVVFRcHNJaFE3QVRJZ0VFSC8vd056SUJSQi92OERjVWtOQUNBSFFRRnFJUmNnQUNBVUlCQnFJaEE3QVRJZ0VFSC8vd054UWVnSFNRMEJDd3RCQUNFUUlBQkJBRFlDSENBQVFjR0pnSUFBTmdJUUlBQkJEVFlDRENBQUlBZEJBV28yQWhRTW5BSUxRY2NCSVJBTW13SUxJQUFnQ0NBQ0VLNkFnSUFBSWhCRkRjb0JJQkJCRlVjTmpBRWdBRUhJQVRZQ0hDQUFJQWcyQWhRZ0FFSEpsNENBQURZQ0VDQUFRUlUyQWd4QkFDRVFESm9DQ3dKQUlBa2dBa2NOQUVITUFTRVFESm9DQzBFQUlSUkJBU0VYUVFFaEZrRUFJUkFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQ1MwQUFFRlFhZzRLbGdHVkFRQUJBZ01FQlFZSWx3RUxRUUloRUF3R0MwRURJUkFNQlF0QkJDRVFEQVFMUVFVaEVBd0RDMEVHSVJBTUFndEJCeUVRREFFTFFRZ2hFQXRCQUNFWFFRQWhGa0VBSVJRTWpnRUxRUWtoRUVFQklSUkJBQ0VYUVFBaEZneU5BUXNDUUNBS0lBSkhEUUJCemdFaEVBeVpBZ3NnQ2kwQUFFRXVSdzJPQVNBS1FRRnFJUWtNeWdFTElBc2dBa2NOamdGQjBBRWhFQXlYQWdzQ1FDQUxJQUpHRFFBZ0FFR09nSUNBQURZQ0NDQUFJQXMyQWdSQnR3RWhFQXorQVF0QjBRRWhFQXlXQWdzQ1FDQUVJQUpIRFFCQjBnRWhFQXlXQWdzZ0FpQUVheUFBS0FJQUloQnFJUlFnQkNBUWEwRUVhaUVMQTBBZ0JDMEFBQ0FRUWZ6UGdJQUFhaTBBQUVjTmpnRWdFRUVFUmczcEFTQVFRUUZxSVJBZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSFNBU0VRREpVQ0N5QUFJQXdnQWhDc2dJQ0FBQ0lCRFkwQklBd2hBUXk0QVFzQ1FDQUVJQUpIRFFCQjFBRWhFQXlVQWdzZ0FpQUVheUFBS0FJQUloQnFJUlFnQkNBUWEwRUJhaUVNQTBBZ0JDMEFBQ0FRUVlIUWdJQUFhaTBBQUVjTmp3RWdFRUVCUmcyT0FTQVFRUUZxSVJBZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSFVBU0VRREpNQ0N3SkFJQVFnQWtjTkFFSFdBU0VRREpNQ0N5QUNJQVJySUFBb0FnQWlFR29oRkNBRUlCQnJRUUpxSVFzRFFDQUVMUUFBSUJCQmc5Q0FnQUJxTFFBQVJ3Mk9BU0FRUVFKR0RaQUJJQkJCQVdvaEVDQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZFlCSVJBTWtnSUxBa0FnQkNBQ1J3MEFRZGNCSVJBTWtnSUxBa0FDUUNBRUxRQUFRYnQvYWc0UUFJOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3RUJqd0VMSUFSQkFXb2hCRUc3QVNFUURQa0JDeUFFUVFGcUlRUkJ2QUVoRUF6NEFRc0NRQ0FFSUFKSERRQkIyQUVoRUF5UkFnc2dCQzBBQUVISUFFY05qQUVnQkVFQmFpRUVETVFCQ3dKQUlBUWdBa1lOQUNBQVFaQ0FnSUFBTmdJSUlBQWdCRFlDQkVHK0FTRVFEUGNCQzBIWkFTRVFESThDQ3dKQUlBUWdBa2NOQUVIYUFTRVFESThDQ3lBRUxRQUFRY2dBUmczREFTQUFRUUU2QUNnTXVRRUxJQUJCQWpvQUx5QUFJQVFnQWhDbWdJQ0FBQ0lRRFkwQlFjSUJJUkFNOUFFTElBQXRBQ2hCZjJvT0FyY0J1UUc0QVFzRFFBSkFJQVF0QUFCQmRtb09CQUNPQVk0QkFJNEJDeUFFUVFGcUlnUWdBa2NOQUF0QjNRRWhFQXlMQWdzZ0FFRUFPZ0F2SUFBdEFDMUJCSEZGRFlRQ0N5QUFRUUE2QUM4Z0FFRUJPZ0EwSUFFaEFReU1BUXNnRUVFVlJnM2FBU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJwNDZBZ0FBMkFoQWdBRUVTTmdJTVFRQWhFQXlJQWdzQ1FDQUFJQkFnQWhDMGdJQ0FBQ0lFRFFBZ0VDRUJESUVDQ3dKQUlBUkJGVWNOQUNBQVFRTTJBaHdnQUNBUU5nSVVJQUJCc0ppQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF5SUFnc2dBRUVBTmdJY0lBQWdFRFlDRkNBQVFhZU9nSUFBTmdJUUlBQkJFallDREVFQUlSQU1od0lMSUJCQkZVWU4xZ0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZHFOZ0lBQU5nSVFJQUJCRkRZQ0RFRUFJUkFNaGdJTElBQW9BZ1FoRnlBQVFRQTJBZ1FnRUNBUnAyb2lGaUVCSUFBZ0Z5QVFJQllnRkJzaUVCQzFnSUNBQUNJVVJRMk5BU0FBUVFjMkFod2dBQ0FRTmdJVUlBQWdGRFlDREVFQUlSQU1oUUlMSUFBZ0FDOEJNRUdBQVhJN0FUQWdBU0VCQzBFcUlSQU02Z0VMSUJCQkZVWU4wUUVnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWU9NZ0lBQU5nSVFJQUJCRXpZQ0RFRUFJUkFNZ2dJTElCQkJGVVlOendFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVpxUGdJQUFOZ0lRSUFCQklqWUNERUVBSVJBTWdRSUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDM2dJQ0FBQ0lRRFFBZ0FVRUJhaUVCREkwQkN5QUFRUXcyQWh3Z0FDQVFOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU1nQUlMSUJCQkZVWU56QUVnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWnFQZ0lBQU5nSVFJQUJCSWpZQ0RFRUFJUkFNL3dFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkMzZ0lDQUFDSVFEUUFnQVVFQmFpRUJESXdCQ3lBQVFRMDJBaHdnQUNBUU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTS9nRUxJQkJCRlVZTnlRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFjYU1nSUFBTmdJUUlBQkJJellDREVFQUlSQU0vUUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzVnSUNBQUNJUURRQWdBVUVCYWlFQkRJc0JDeUFBUVE0MkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNL0FFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVIQWxZQ0FBRFlDRUNBQVFRSTJBZ3hCQUNFUURQc0JDeUFRUVJWR0RjVUJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUG9CQ3lBQVFSQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNK1FFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkM1Z0lDQUFDSUVEUUFnQVVFQmFpRUJEUEVCQ3lBQVFSRTJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTStBRUxJQkJCRlVZTndRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFjYU1nSUFBTmdJUUlBQkJJellDREVFQUlSQU05d0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzVnSUNBQUNJUURRQWdBVUVCYWlFQkRJZ0JDeUFBUVJNMkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNOWdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkM1Z0lDQUFDSUVEUUFnQVVFQmFpRUJETzBCQ3lBQVFSUTJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTTlRRUxJQkJCRlVZTnZRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFacVBnSUFBTmdJUUlBQkJJallDREVFQUlSQU05QUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzNnSUNBQUNJUURRQWdBVUVCYWlFQkRJWUJDeUFBUVJZMkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNOHdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkMzZ0lDQUFDSUVEUUFnQVVFQmFpRUJET2tCQ3lBQVFSYzJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTThnRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSE5rNENBQURZQ0VDQUFRUXcyQWd4QkFDRVFEUEVCQzBJQklSRUxJQkJCQVdvaEFRSkFJQUFwQXlBaUVrTC8vLy8vLy8vLy93OVdEUUFnQUNBU1FnU0dJQkdFTndNZ0lBRWhBUXlFQVFzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWEySmdJQUFOZ0lRSUFCQkREWUNERUVBSVJBTTd3RUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFSE5rNENBQURZQ0VDQUFRUXcyQWd4QkFDRVFETzRCQ3lBQUtBSUVJUmNnQUVFQU5nSUVJQkFnRWFkcUloWWhBU0FBSUJjZ0VDQVdJQlFiSWhBUXRZQ0FnQUFpRkVVTmN5QUFRUVUyQWh3Z0FDQVFOZ0lVSUFBZ0ZEWUNERUVBSVJBTTdRRUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR3FuSUNBQURZQ0VDQUFRUTgyQWd4QkFDRVFET3dCQ3lBQUlCQWdBaEMwZ0lDQUFDSUJEUUVnRUNFQkMwRU9JUkFNMFFFTEFrQWdBVUVWUncwQUlBQkJBallDSENBQUlCQTJBaFFnQUVHd21JQ0FBRFlDRUNBQVFSVTJBZ3hCQUNFUURPb0JDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJwNDZBZ0FBMkFoQWdBRUVTTmdJTVFRQWhFQXpwQVFzZ0FVRUJhaUVRQWtBZ0FDOEJNQ0lCUVlBQmNVVU5BQUpBSUFBZ0VDQUNFTHVBZ0lBQUlnRU5BQ0FRSVFFTWNBc2dBVUVWUncyNkFTQUFRUVUyQWh3Z0FDQVFOZ0lVSUFCQitaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBenBBUXNDUUNBQlFhQUVjVUdnQkVjTkFDQUFMUUF0UVFKeERRQWdBRUVBTmdJY0lBQWdFRFlDRkNBQVFaYVRnSUFBTmdJUUlBQkJCRFlDREVFQUlSQU02UUVMSUFBZ0VDQUNFTDJBZ0lBQUdpQVFJUUVDUUFKQUFrQUNRQUpBSUFBZ0VDQUNFTE9BZ0lBQURoWUNBUUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFEQkFzZ0FFRUJPZ0F1Q3lBQUlBQXZBVEJCd0FCeU93RXdJQkFoQVF0QkppRVFETkVCQ3lBQVFTTTJBaHdnQUNBUU5nSVVJQUJCcFphQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF6cEFRc2dBRUVBTmdJY0lBQWdFRFlDRkNBQVFkV0xnSUFBTmdJUUlBQkJFVFlDREVFQUlSQU02QUVMSUFBdEFDMUJBWEZGRFFGQnd3RWhFQXpPQVFzQ1FDQU5JQUpHRFFBRFFBSkFJQTB0QUFCQklFWU5BQ0FOSVFFTXhBRUxJQTFCQVdvaURTQUNSdzBBQzBFbElSQU01d0VMUVNVaEVBem1BUXNnQUNnQ0JDRUVJQUJCQURZQ0JDQUFJQVFnRFJDdmdJQ0FBQ0lFUlEydEFTQUFRU1kyQWh3Z0FDQUVOZ0lNSUFBZ0RVRUJhallDRkVFQUlSQU01UUVMSUJCQkZVWU5xd0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZjJOZ0lBQU5nSVFJQUJCSFRZQ0RFRUFJUkFNNUFFTElBQkJKellDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6akFRc2dFQ0VCUVFFaEZBSkFBa0FDUUFKQUFrQUNRQUpBSUFBdEFDeEJmbW9PQndZRkJRTUJBZ0FGQ3lBQUlBQXZBVEJCQ0hJN0FUQU1Bd3RCQWlFVURBRUxRUVFoRkFzZ0FFRUJPZ0FzSUFBZ0FDOEJNQ0FVY2pzQk1Bc2dFQ0VCQzBFcklSQU15Z0VMSUFCQkFEWUNIQ0FBSUJBMkFoUWdBRUdya29DQUFEWUNFQ0FBUVFzMkFneEJBQ0VRRE9JQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjRZK0FnQUEyQWhBZ0FFRUtOZ0lNUVFBaEVBemhBUXNnQUVFQU9nQXNJQkFoQVF5OUFRc2dFQ0VCUVFFaEZBSkFBa0FDUUFKQUFrQWdBQzBBTEVGN2FnNEVBd0VDQUFVTElBQWdBQzhCTUVFSWNqc0JNQXdEQzBFQ0lSUU1BUXRCQkNFVUN5QUFRUUU2QUN3Z0FDQUFMd0V3SUJSeU93RXdDeUFRSVFFTFFTa2hFQXpGQVFzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZDVWdJQUFOZ0lRSUFCQkF6WUNERUVBSVJBTTNRRUxBa0FnRGkwQUFFRU5SdzBBSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0RoQ3hnSUNBQUNJQkRRQWdEa0VCYWlFQkRIVUxJQUJCTERZQ0hDQUFJQUUyQWd3Z0FDQU9RUUZxTmdJVVFRQWhFQXpkQVFzZ0FDMEFMVUVCY1VVTkFVSEVBU0VRRE1NQkN3SkFJQTRnQWtjTkFFRXRJUkFNM0FFTEFrQUNRQU5BQWtBZ0RpMEFBRUYyYWc0RUFnQUFBd0FMSUE1QkFXb2lEaUFDUncwQUMwRXRJUkFNM1FFTElBQW9BZ1FoQVNBQVFRQTJBZ1FDUUNBQUlBRWdEaEN4Z0lDQUFDSUJEUUFnRGlFQkRIUUxJQUJCTERZQ0hDQUFJQTQyQWhRZ0FDQUJOZ0lNUVFBaEVBemNBUXNnQUNnQ0JDRUJJQUJCQURZQ0JBSkFJQUFnQVNBT0VMR0FnSUFBSWdFTkFDQU9RUUZxSVFFTWN3c2dBRUVzTmdJY0lBQWdBVFlDRENBQUlBNUJBV28yQWhSQkFDRVFETnNCQ3lBQUtBSUVJUVFnQUVFQU5nSUVJQUFnQkNBT0VMR0FnSUFBSWdRTm9BRWdEaUVCRE00QkN5QVFRU3hIRFFFZ0FVRUJhaUVRUVFFaEFRSkFBa0FDUUFKQUFrQWdBQzBBTEVGN2FnNEVBd0VDQkFBTElCQWhBUXdFQzBFQ0lRRU1BUXRCQkNFQkN5QUFRUUU2QUN3Z0FDQUFMd0V3SUFGeU93RXdJQkFoQVF3QkN5QUFJQUF2QVRCQkNISTdBVEFnRUNFQkMwRTVJUkFNdndFTElBQkJBRG9BTENBQklRRUxRVFFoRUF5OUFRc2dBQ0FBTHdFd1FTQnlPd0V3SUFFaEFRd0NDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXNZQ0FnQUFpQkEwQUlBRWhBUXpIQVFzZ0FFRTNOZ0ljSUFBZ0FUWUNGQ0FBSUFRMkFneEJBQ0VRRE5RQkN5QUFRUWc2QUN3Z0FTRUJDMEV3SVJBTXVRRUxBa0FnQUMwQUtFRUJSZzBBSUFFaEFRd0VDeUFBTFFBdFFRaHhSUTJUQVNBQklRRU1Bd3NnQUMwQU1FRWdjUTJVQVVIRkFTRVFETGNCQ3dKQUlBOGdBa1lOQUFKQUEwQUNRQ0FQTFFBQVFWQnFJZ0ZCL3dGeFFRcEpEUUFnRHlFQlFUVWhFQXk2QVFzZ0FDa0RJQ0lSUXBtejVzeVpzK2JNR1ZZTkFTQUFJQkZDQ240aUVUY0RJQ0FSSUFHdFF2OEJneUlTUW4rRlZnMEJJQUFnRVNBU2ZEY0RJQ0FQUVFGcUlnOGdBa2NOQUF0Qk9TRVFETkVCQ3lBQUtBSUVJUUlnQUVFQU5nSUVJQUFnQWlBUFFRRnFJZ1FRc1lDQWdBQWlBZzJWQVNBRUlRRU13d0VMUVRraEVBelBBUXNDUUNBQUx3RXdJZ0ZCQ0hGRkRRQWdBQzBBS0VFQlJ3MEFJQUF0QUMxQkNIRkZEWkFCQ3lBQUlBRkI5L3NEY1VHQUJISTdBVEFnRHlFQkMwRTNJUkFNdEFFTElBQWdBQzhCTUVFUWNqc0JNQXlyQVFzZ0VFRVZSZzJMQVNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCOEk2QWdBQTJBaEFnQUVFY05nSU1RUUFoRUF6TEFRc2dBRUhEQURZQ0hDQUFJQUUyQWd3Z0FDQU5RUUZxTmdJVVFRQWhFQXpLQVFzQ1FDQUJMUUFBUVRwSERRQWdBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUsrQWdJQUFJaEFOQUNBQlFRRnFJUUVNWXdzZ0FFSERBRFlDSENBQUlCQTJBZ3dnQUNBQlFRRnFOZ0lVUVFBaEVBektBUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYkdSZ0lBQU5nSVFJQUJCQ2pZQ0RFRUFJUkFNeVFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHZ21ZQ0FBRFlDRUNBQVFSNDJBZ3hCQUNFUURNZ0JDeUFBUVFBMkFnQUxJQUJCZ0JJN0FTb2dBQ0FYUVFGcUlnRWdBaENvZ0lDQUFDSVFEUUVnQVNFQkMwSEhBQ0VRREt3QkN5QVFRUlZIRFlNQklBQkIwUUEyQWh3Z0FDQUJOZ0lVSUFCQjQ1ZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBekVBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNWGdzZ0FFSFNBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6REFRc2dBRUVBTmdJY0lBQWdGRFlDRkNBQVFjR29nSUFBTmdJUUlBQkJCellDRENBQVFRQTJBZ0JCQUNFUURNSUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhkQ3lBQVFkTUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRE1FQkMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWUNSZ0lBQU5nSVFJQUJCQ1RZQ0RBekFBUXNnRUVFVlJnMTlJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR1VqWUNBQURZQ0VDQUFRU0UyQWd4QkFDRVFETDhCQzBFQklSWkJBQ0VYUVFBaEZFRUJJUkFMSUFBZ0VEb0FLeUFCUVFGcUlRRUNRQUpBSUFBdEFDMUJFSEVOQUFKQUFrQUNRQ0FBTFFBcURnTUJBQUlFQ3lBV1JRMEREQUlMSUJRTkFRd0NDeUFYUlEwQkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcllDQWdBQWlFQTBBSUFFaEFReGNDeUFBUWRnQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFETDRCQ3lBQUtBSUVJUVFnQUVFQU5nSUVBa0FnQUNBRUlBRVFyWUNBZ0FBaUJBMEFJQUVoQVF5dEFRc2dBRUhaQURZQ0hDQUFJQUUyQWhRZ0FDQUVOZ0lNUVFBaEVBeTlBUXNnQUNnQ0JDRUVJQUJCQURZQ0JBSkFJQUFnQkNBQkVLMkFnSUFBSWdRTkFDQUJJUUVNcXdFTElBQkIyZ0EyQWh3Z0FDQUJOZ0lVSUFBZ0JEWUNERUVBSVJBTXZBRUxJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDdGdJQ0FBQ0lFRFFBZ0FTRUJES2tCQ3lBQVFkd0FOZ0ljSUFBZ0FUWUNGQ0FBSUFRMkFneEJBQ0VRRExzQkN3SkFJQUV0QUFCQlVHb2lFRUgvQVhGQkNrOE5BQ0FBSUJBNkFDb2dBVUVCYWlFQlFjOEFJUkFNb2dFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkN0Z0lDQUFDSUVEUUFnQVNFQkRLY0JDeUFBUWQ0QU5nSWNJQUFnQVRZQ0ZDQUFJQVEyQWd4QkFDRVFETG9CQ3lBQVFRQTJBZ0FnRjBFQmFpRUJBa0FnQUMwQUtVRWpUdzBBSUFFaEFReFpDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkIwNG1BZ0FBMkFoQWdBRUVJTmdJTVFRQWhFQXk1QVFzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaQ3pnSUFBTmdJUUlBQkJDRFlDREF5M0FRc2dBRUVBTmdJQUlCZEJBV29oQVFKQUlBQXRBQ2xCSVVjTkFDQUJJUUVNVmdzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVp1S2dJQUFOZ0lRSUFCQkNEWUNERUVBSVJBTXRnRUxJQUJCQURZQ0FDQVhRUUZxSVFFQ1FDQUFMUUFwSWhCQlhXcEJDMDhOQUNBQklRRU1WUXNDUUNBUVFRWkxEUUJCQVNBUWRFSEtBSEZGRFFBZ0FTRUJERlVMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjk0bUFnQUEyQWhBZ0FFRUlOZ0lNRExVQkN5QVFRUlZHRFhFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWJtTmdJQUFOZ0lRSUFCQkdqWUNERUVBSVJBTXRBRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERlFMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNc3dFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkNuZ0lDQUFDSVFEUUFnQVNFQkRFMExJQUJCMGdBMkFod2dBQ0FCTmdJVUlBQWdFRFlDREVFQUlSQU1zZ0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREUwTElBQkIwd0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXNRRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERkVMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNc0FFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVIR2lvQ0FBRFlDRUNBQVFRYzJBZ3hCQUNFUURLOEJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhKQ3lBQVFkSUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRREs0QkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcDRDQWdBQWlFQTBBSUFFaEFReEpDeUFBUWRNQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFESzBCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVFwNENBZ0FBaUVBMEFJQUVoQVF4TkN5QUFRZVVBTmdJY0lBQWdBVFlDRkNBQUlCQTJBZ3hCQUNFUURLd0JDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkIzSWlBZ0FBMkFoQWdBRUVITmdJTVFRQWhFQXlyQVFzZ0VFRS9SdzBCSUFGQkFXb2hBUXRCQlNFUURKQUJDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWYyU2dJQUFOZ0lRSUFCQkJ6WUNEQXlvQVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFS2VBZ0lBQUloQU5BQ0FCSVFFTVFnc2dBRUhTQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeW5BUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNUWdzZ0FFSFRBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF5bUFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUtlQWdJQUFJaEFOQUNBQklRRU1SZ3NnQUVIbEFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXlsQVFzZ0FDZ0NCQ0VCSUFCQkFEWUNCQUpBSUFBZ0FTQVVFS2VBZ0lBQUlnRU5BQ0FVSVFFTVB3c2dBRUhTQURZQ0hDQUFJQlEyQWhRZ0FDQUJOZ0lNUVFBaEVBeWtBUXNnQUNnQ0JDRUJJQUJCQURZQ0JBSkFJQUFnQVNBVUVLZUFnSUFBSWdFTkFDQVVJUUVNUHdzZ0FFSFRBRFlDSENBQUlCUTJBaFFnQUNBQk5nSU1RUUFoRUF5akFRc2dBQ2dDQkNFQklBQkJBRFlDQkFKQUlBQWdBU0FVRUtlQWdJQUFJZ0VOQUNBVUlRRU1Rd3NnQUVIbEFEWUNIQ0FBSUJRMkFoUWdBQ0FCTmdJTVFRQWhFQXlpQVFzZ0FFRUFOZ0ljSUFBZ0ZEWUNGQ0FBUWNPUGdJQUFOZ0lRSUFCQkJ6WUNERUVBSVJBTW9RRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSERqNENBQURZQ0VDQUFRUWMyQWd4QkFDRVFES0FCQzBFQUlSQWdBRUVBTmdJY0lBQWdGRFlDRkNBQVFZeWNnSUFBTmdJUUlBQkJCellDREF5ZkFRc2dBRUVBTmdJY0lBQWdGRFlDRkNBQVFZeWNnSUFBTmdJUUlBQkJCellDREVFQUlSQU1uZ0VMSUFCQkFEWUNIQ0FBSUJRMkFoUWdBRUgra1lDQUFEWUNFQ0FBUVFjMkFneEJBQ0VRREowQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmpwdUFnQUEyQWhBZ0FFRUdOZ0lNUVFBaEVBeWNBUXNnRUVFVlJnMVhJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSE1qb0NBQURZQ0VDQUFRU0EyQWd4QkFDRVFESnNCQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRU1FoRUFzZ0FDQVFPZ0FwSUFBb0FnUWhFQ0FBUVFBMkFnUWdBQ0FRSUFFUXE0Q0FnQUFpRUExVUlBRWhBUXcrQ3lBQVFRQTJBZ0FMUVFBaEVDQUFRUUEyQWh3Z0FDQUVOZ0lVSUFCQjhadUFnQUEyQWhBZ0FFRUdOZ0lNREpjQkN5QUJRUlZHRFZBZ0FFRUFOZ0ljSUFBZ0JUWUNGQ0FBUWZDTWdJQUFOZ0lRSUFCQkd6WUNERUVBSVJBTWxnRUxJQUFvQWdRaEJTQUFRUUEyQWdRZ0FDQUZJQkFRcVlDQWdBQWlCUTBCSUJCQkFXb2hCUXRCclFFaEVBeDdDeUFBUWNFQk5nSWNJQUFnQlRZQ0RDQUFJQkJCQVdvMkFoUkJBQ0VRREpNQkN5QUFLQUlFSVFZZ0FFRUFOZ0lFSUFBZ0JpQVFFS21BZ0lBQUlnWU5BU0FRUVFGcUlRWUxRYTRCSVJBTWVBc2dBRUhDQVRZQ0hDQUFJQVkyQWd3Z0FDQVFRUUZxTmdJVVFRQWhFQXlRQVFzZ0FFRUFOZ0ljSUFBZ0J6WUNGQ0FBUVplTGdJQUFOZ0lRSUFCQkRUWUNERUVBSVJBTWp3RUxJQUJCQURZQ0hDQUFJQWcyQWhRZ0FFSGprSUNBQURZQ0VDQUFRUWsyQWd4QkFDRVFESTRCQ3lBQVFRQTJBaHdnQUNBSU5nSVVJQUJCbEkyQWdBQTJBaEFnQUVFaE5nSU1RUUFoRUF5TkFRdEJBU0VXUVFBaEYwRUFJUlJCQVNFUUN5QUFJQkE2QUNzZ0NVRUJhaUVJQWtBQ1FDQUFMUUF0UVJCeERRQUNRQUpBQWtBZ0FDMEFLZzREQVFBQ0JBc2dGa1VOQXd3Q0N5QVVEUUVNQWdzZ0YwVU5BUXNnQUNnQ0JDRVFJQUJCQURZQ0JDQUFJQkFnQ0JDdGdJQ0FBQ0lRUlEwOUlBQkJ5UUUyQWh3Z0FDQUlOZ0lVSUFBZ0VEWUNERUVBSVJBTWpBRUxJQUFvQWdRaEJDQUFRUUEyQWdRZ0FDQUVJQWdRcllDQWdBQWlCRVVOZGlBQVFjb0JOZ0ljSUFBZ0NEWUNGQ0FBSUFRMkFneEJBQ0VRRElzQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFSUFBZ0JDQUpFSzJBZ0lBQUlnUkZEWFFnQUVITEFUWUNIQ0FBSUFrMkFoUWdBQ0FFTmdJTVFRQWhFQXlLQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQ0FBSUFRZ0NoQ3RnSUNBQUNJRVJRMXlJQUJCelFFMkFod2dBQ0FLTmdJVUlBQWdCRFlDREVFQUlSQU1pUUVMQWtBZ0N5MEFBRUZRYWlJUVFmOEJjVUVLVHcwQUlBQWdFRG9BS2lBTFFRRnFJUXBCdGdFaEVBeHdDeUFBS0FJRUlRUWdBRUVBTmdJRUlBQWdCQ0FMRUsyQWdJQUFJZ1JGRFhBZ0FFSFBBVFlDSENBQUlBczJBaFFnQUNBRU5nSU1RUUFoRUF5SUFRc2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFaQ3pnSUFBTmdJUUlBQkJDRFlDRENBQVFRQTJBZ0JCQUNFUURJY0JDeUFCUVJWR0RUOGdBRUVBTmdJY0lBQWdERFlDRkNBQVFjeU9nSUFBTmdJUUlBQkJJRFlDREVFQUlSQU1oZ0VMSUFCQmdRUTdBU2dnQUNnQ0JDRVFJQUJDQURjREFDQUFJQkFnREVFQmFpSU1FS3VBZ0lBQUloQkZEVGdnQUVIVEFUWUNIQ0FBSUF3MkFoUWdBQ0FRTmdJTVFRQWhFQXlGQVFzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdCRFlDRkNBQVFkaWJnSUFBTmdJUUlBQkJDRFlDREF5REFRc2dBQ2dDQkNFUUlBQkNBRGNEQUNBQUlCQWdDMEVCYWlJTEVLdUFnSUFBSWhBTkFVSEdBU0VRREdrTElBQkJBam9BS0F4VkN5QUFRZFVCTmdJY0lBQWdDellDRkNBQUlCQTJBZ3hCQUNFUURJQUJDeUFRUVJWR0RUY2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFhU01nSUFBTmdJUUlBQkJFRFlDREVFQUlSQU1md3NnQUMwQU5FRUJSdzAwSUFBZ0JDQUNFTHlBZ0lBQUloQkZEVFFnRUVFVlJ3MDFJQUJCM0FFMkFod2dBQ0FFTmdJVUlBQkIxWmFBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXgrQzBFQUlSQWdBRUVBTmdJY0lBQkJyNHVBZ0FBMkFoQWdBRUVDTmdJTUlBQWdGRUVCYWpZQ0ZBeDlDMEVBSVJBTVl3dEJBaUVRREdJTFFRMGhFQXhoQzBFUElSQU1ZQXRCSlNFUURGOExRUk1oRUF4ZUMwRVZJUkFNWFF0QkZpRVFERndMUVJjaEVBeGJDMEVZSVJBTVdndEJHU0VRREZrTFFSb2hFQXhZQzBFYklSQU1Wd3RCSENFUURGWUxRUjBoRUF4VkMwRWZJUkFNVkF0QklTRVFERk1MUVNNaEVBeFNDMEhHQUNFUURGRUxRUzRoRUF4UUMwRXZJUkFNVHd0Qk95RVFERTRMUVQwaEVBeE5DMEhJQUNFUURFd0xRY2tBSVJBTVN3dEJ5d0FoRUF4S0MwSE1BQ0VRREVrTFFjNEFJUkFNU0F0QjBRQWhFQXhIQzBIVkFDRVFERVlMUWRnQUlSQU1SUXRCMlFBaEVBeEVDMEhiQUNFUURFTUxRZVFBSVJBTVFndEI1UUFoRUF4QkMwSHhBQ0VRREVBTFFmUUFJUkFNUHd0QmpRRWhFQXcrQzBHWEFTRVFERDBMUWFrQklSQU1QQXRCckFFaEVBdzdDMEhBQVNFUUREb0xRYmtCSVJBTU9RdEJyd0VoRUF3NEMwR3hBU0VRRERjTFFiSUJJUkFNTmd0QnRBRWhFQXcxQzBHMUFTRVFERFFMUWJvQklSQU1Nd3RCdlFFaEVBd3lDMEcvQVNFUURERUxRY0VCSVJBTU1Bc2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFlbUxnSUFBTmdJUUlBQkJIellDREVFQUlSQU1TQXNnQUVIYkFUWUNIQ0FBSUFRMkFoUWdBRUg2bG9DQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVjTElBQkIrQUEyQWh3Z0FDQU1OZ0lVSUFCQnlwaUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBeEdDeUFBUWRFQU5nSWNJQUFnQlRZQ0ZDQUFRYkNYZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNUlFzZ0FFSDVBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF4RUN5QUFRZmdBTmdJY0lBQWdBVFlDRkNBQVFjcVlnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1Rd3NnQUVIa0FEWUNIQ0FBSUFFMkFoUWdBRUhqbDRDQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVJTElBQkIxd0EyQWh3Z0FDQUJOZ0lVSUFCQnlaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBeEJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ1WTJBZ0FBMkFoQWdBRUVhTmdJTVFRQWhFQXhBQ3lBQVFjSUFOZ0ljSUFBZ0FUWUNGQ0FBUWVPWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTVB3c2dBRUVBTmdJRUlBQWdEeUFQRUxHQWdJQUFJZ1JGRFFFZ0FFRTZOZ0ljSUFBZ0JEWUNEQ0FBSUE5QkFXbzJBaFJCQUNFUURENExJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDeGdJQ0FBQ0lFUlEwQUlBQkJPellDSENBQUlBUTJBZ3dnQUNBQlFRRnFOZ0lVUVFBaEVBdytDeUFCUVFGcUlRRU1MUXNnRDBFQmFpRUJEQzBMSUFCQkFEWUNIQ0FBSUE4MkFoUWdBRUhra29DQUFEWUNFQ0FBUVFRMkFneEJBQ0VRRERzTElBQkJOallDSENBQUlBUTJBaFFnQUNBQ05nSU1RUUFoRUF3NkN5QUFRUzQyQWh3Z0FDQU9OZ0lVSUFBZ0JEWUNERUVBSVJBTU9Rc2dBRUhRQURZQ0hDQUFJQUUyQWhRZ0FFR1JtSUNBQURZQ0VDQUFRUlUyQWd4QkFDRVFERGdMSUExQkFXb2hBUXdzQ3lBQVFSVTJBaHdnQUNBQk5nSVVJQUJCZ3BtQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3MkN5QUFRUnMyQWh3Z0FDQUJOZ0lVSUFCQmtaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBdzFDeUFBUVE4MkFod2dBQ0FCTmdJVUlBQkJrWmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXcwQ3lBQVFRczJBaHdnQUNBQk5nSVVJQUJCa1plQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3ekN5QUFRUm8yQWh3Z0FDQUJOZ0lVSUFCQmdwbUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBd3lDeUFBUVFzMkFod2dBQ0FCTmdJVUlBQkJncG1BZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXd4Q3lBQVFRbzJBaHdnQUNBQk5nSVVJQUJCNUphQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3d0N5QUFRUjQyQWh3Z0FDQUJOZ0lVSUFCQitaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBd3ZDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkIybzJBZ0FBMkFoQWdBRUVVTmdJTVFRQWhFQXd1Q3lBQVFRUTJBaHdnQUNBQk5nSVVJQUJCc0ppQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3dEN5QUFRUUEyQWdBZ0MwRUJhaUVMQzBHNEFTRVFEQklMSUFCQkFEWUNBQ0FRUVFGcUlRRkI5UUFoRUF3UkN5QUJJUUVDUUNBQUxRQXBRUVZIRFFCQjR3QWhFQXdSQzBIaUFDRVFEQkFMUVFBaEVDQUFRUUEyQWh3Z0FFSGtrWUNBQURZQ0VDQUFRUWMyQWd3Z0FDQVVRUUZxTmdJVURDZ0xJQUJCQURZQ0FDQVhRUUZxSVFGQndBQWhFQXdPQzBFQklRRUxJQUFnQVRvQUxDQUFRUUEyQWdBZ0YwRUJhaUVCQzBFb0lSQU1Dd3NnQVNFQkMwRTRJUkFNQ1FzQ1FDQUJJZzhnQWtZTkFBTkFBa0FnRHkwQUFFR0F2b0NBQUdvdEFBQWlBVUVCUmcwQUlBRkJBa2NOQXlBUFFRRnFJUUVNQkFzZ0QwRUJhaUlQSUFKSERRQUxRVDRoRUF3aUMwRStJUkFNSVFzZ0FFRUFPZ0FzSUE4aEFRd0JDMEVMSVJBTUJndEJPaUVRREFVTElBRkJBV29oQVVFdElSQU1CQXNnQUNBQk9nQXNJQUJCQURZQ0FDQVdRUUZxSVFGQkRDRVFEQU1MSUFCQkFEWUNBQ0FYUVFGcUlRRkJDaUVRREFJTElBQkJBRFlDQUFzZ0FFRUFPZ0FzSUEwaEFVRUpJUkFNQUFzTFFRQWhFQ0FBUVFBMkFod2dBQ0FMTmdJVUlBQkJ6WkNBZ0FBMkFoQWdBRUVKTmdJTURCY0xRUUFoRUNBQVFRQTJBaHdnQUNBS05nSVVJQUJCNllxQWdBQTJBaEFnQUVFSk5nSU1EQllMUVFBaEVDQUFRUUEyQWh3Z0FDQUpOZ0lVSUFCQnQ1Q0FnQUEyQWhBZ0FFRUpOZ0lNREJVTFFRQWhFQ0FBUVFBMkFod2dBQ0FJTmdJVUlBQkJuSkdBZ0FBMkFoQWdBRUVKTmdJTURCUUxRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCelpDQWdBQTJBaEFnQUVFSk5nSU1EQk1MUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjZZcUFnQUEyQWhBZ0FFRUpOZ0lNREJJTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ0NUNBZ0FBMkFoQWdBRUVKTmdJTURCRUxRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCbkpHQWdBQTJBaEFnQUVFSk5nSU1EQkFMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmw1V0FnQUEyQWhBZ0FFRVBOZ0lNREE4TFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJsNVdBZ0FBMkFoQWdBRUVQTmdJTURBNExRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCd0pLQWdBQTJBaEFnQUVFTE5nSU1EQTBMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmxZbUFnQUEyQWhBZ0FFRUxOZ0lNREF3TFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkI0WStBZ0FBMkFoQWdBRUVLTmdJTURBc0xRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCKzQrQWdBQTJBaEFnQUVFS05nSU1EQW9MUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjhabUFnQUEyQWhBZ0FFRUNOZ0lNREFrTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ4SlNBZ0FBMkFoQWdBRUVDTmdJTURBZ0xRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCOHBXQWdBQTJBaEFnQUVFQ05nSU1EQWNMSUFCQkFqWUNIQ0FBSUFFMkFoUWdBRUdjbW9DQUFEWUNFQ0FBUVJZMkFneEJBQ0VRREFZTFFRRWhFQXdGQzBIVUFDRVFJQUVpQkNBQ1JnMEVJQU5CQ0dvZ0FDQUVJQUpCMk1LQWdBQkJDaERGZ0lDQUFDQURLQUlNSVFRZ0F5Z0NDQTREQVFRQ0FBc1F5b0NBZ0FBQUN5QUFRUUEyQWh3Z0FFRzFtb0NBQURZQ0VDQUFRUmMyQWd3Z0FDQUVRUUZxTmdJVVFRQWhFQXdDQ3lBQVFRQTJBaHdnQUNBRU5nSVVJQUJCeXBxQWdBQTJBaEFnQUVFSk5nSU1RUUFoRUF3QkN3SkFJQUVpQkNBQ1J3MEFRU0loRUF3QkN5QUFRWW1BZ0lBQU5nSUlJQUFnQkRZQ0JFRWhJUkFMSUFOQkVHb2tnSUNBZ0FBZ0VBdXZBUUVDZnlBQktBSUFJUVlDUUFKQUlBSWdBMFlOQUNBRUlBWnFJUVFnQmlBRGFpQUNheUVISUFJZ0JrRi9jeUFGYWlJR2FpRUZBMEFDUUNBQ0xRQUFJQVF0QUFCR0RRQkJBaUVFREFNTEFrQWdCZzBBUVFBaEJDQUZJUUlNQXdzZ0JrRi9haUVHSUFSQkFXb2hCQ0FDUVFGcUlnSWdBMGNOQUFzZ0J5RUdJQU1oQWdzZ0FFRUJOZ0lBSUFFZ0JqWUNBQ0FBSUFJMkFnUVBDeUFCUVFBMkFnQWdBQ0FFTmdJQUlBQWdBallDQkFzS0FDQUFFTWVBZ0lBQUMvSTJBUXQvSTRDQWdJQUFRUkJySWdFa2dJQ0FnQUFDUUVFQUtBS2cwSUNBQUEwQVFRQVF5NENBZ0FCQmdOU0VnQUJySWdKQjJRQkpEUUJCQUNFREFrQkJBQ2dDNE5PQWdBQWlCQTBBUVFCQ2Z6Y0M3Tk9BZ0FCQkFFS0FnSVNBZ0lEQUFEY0M1Tk9BZ0FCQkFDQUJRUWhxUVhCeFFkaXExYW9GY3lJRU5nTGcwNENBQUVFQVFRQTJBdlRUZ0lBQVFRQkJBRFlDeE5PQWdBQUxRUUFnQWpZQ3pOT0FnQUJCQUVHQTFJU0FBRFlDeU5PQWdBQkJBRUdBMUlTQUFEWUNtTkNBZ0FCQkFDQUVOZ0tzMElDQUFFRUFRWDgyQXFqUWdJQUFBMEFnQTBIRTBJQ0FBR29nQTBHNDBJQ0FBR29pQkRZQ0FDQUVJQU5Cc05DQWdBQnFJZ1UyQWdBZ0EwRzgwSUNBQUdvZ0JUWUNBQ0FEUWN6UWdJQUFhaUFEUWNEUWdJQUFhaUlGTmdJQUlBVWdCRFlDQUNBRFFkVFFnSUFBYWlBRFFjalFnSUFBYWlJRU5nSUFJQVFnQlRZQ0FDQURRZERRZ0lBQWFpQUVOZ0lBSUFOQklHb2lBMEdBQWtjTkFBdEJnTlNFZ0FCQmVFR0ExSVNBQUd0QkQzRkJBRUdBMUlTQUFFRUlha0VQY1JzaUEyb2lCRUVFYWlBQ1FVaHFJZ1VnQTJzaUEwRUJjallDQUVFQVFRQW9BdkRUZ0lBQU5nS2swSUNBQUVFQUlBTTJBcFRRZ0lBQVFRQWdCRFlDb05DQWdBQkJnTlNFZ0FBZ0JXcEJPRFlDQkFzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQUVIc0FVc05BQUpBUVFBb0FvalFnSUFBSWdaQkVDQUFRUk5xUVhCeElBQkJDMGtiSWdKQkEzWWlCSFlpQTBFRGNVVU5BQUpBQWtBZ0EwRUJjU0FFY2tFQmN5SUZRUU4wSWdSQnNOQ0FnQUJxSWdNZ0JFRzQwSUNBQUdvb0FnQWlCQ2dDQ0NJQ1J3MEFRUUFnQmtGK0lBVjNjVFlDaU5DQWdBQU1BUXNnQXlBQ05nSUlJQUlnQXpZQ0RBc2dCRUVJYWlFRElBUWdCVUVEZENJRlFRTnlOZ0lFSUFRZ0JXb2lCQ0FFS0FJRVFRRnlOZ0lFREF3TElBSkJBQ2dDa05DQWdBQWlCMDBOQVFKQUlBTkZEUUFDUUFKQUlBTWdCSFJCQWlBRWRDSURRUUFnQTJ0eWNTSURRUUFnQTJ0eFFYOXFJZ01nQTBFTWRrRVFjU0lEZGlJRVFRVjJRUWh4SWdVZ0EzSWdCQ0FGZGlJRFFRSjJRUVJ4SWdSeUlBTWdCSFlpQTBFQmRrRUNjU0lFY2lBRElBUjJJZ05CQVhaQkFYRWlCSElnQXlBRWRtb2lCRUVEZENJRFFiRFFnSUFBYWlJRklBTkJ1TkNBZ0FCcUtBSUFJZ01vQWdnaUFFY05BRUVBSUFaQmZpQUVkM0VpQmpZQ2lOQ0FnQUFNQVFzZ0JTQUFOZ0lJSUFBZ0JUWUNEQXNnQXlBQ1FRTnlOZ0lFSUFNZ0JFRURkQ0lFYWlBRUlBSnJJZ1UyQWdBZ0F5QUNhaUlBSUFWQkFYSTJBZ1FDUUNBSFJRMEFJQWRCZUhGQnNOQ0FnQUJxSVFKQkFDZ0NuTkNBZ0FBaEJBSkFBa0FnQmtFQklBZEJBM1owSWdoeERRQkJBQ0FHSUFoeU5nS0kwSUNBQUNBQ0lRZ01BUXNnQWlnQ0NDRUlDeUFJSUFRMkFnd2dBaUFFTmdJSUlBUWdBallDRENBRUlBZzJBZ2dMSUFOQkNHb2hBMEVBSUFBMkFwelFnSUFBUVFBZ0JUWUNrTkNBZ0FBTURBdEJBQ2dDak5DQWdBQWlDVVVOQVNBSlFRQWdDV3R4UVg5cUlnTWdBMEVNZGtFUWNTSURkaUlFUVFWMlFRaHhJZ1VnQTNJZ0JDQUZkaUlEUVFKMlFRUnhJZ1J5SUFNZ0JIWWlBMEVCZGtFQ2NTSUVjaUFESUFSMklnTkJBWFpCQVhFaUJISWdBeUFFZG1wQkFuUkJ1TktBZ0FCcUtBSUFJZ0FvQWdSQmVIRWdBbXNoQkNBQUlRVUNRQU5BQWtBZ0JTZ0NFQ0lERFFBZ0JVRVVhaWdDQUNJRFJRMENDeUFES0FJRVFYaHhJQUpySWdVZ0JDQUZJQVJKSWdVYklRUWdBeUFBSUFVYklRQWdBeUVGREFBTEN5QUFLQUlZSVFvQ1FDQUFLQUlNSWdnZ0FFWU5BQ0FBS0FJSUlnTkJBQ2dDbU5DQWdBQkpHaUFJSUFNMkFnZ2dBeUFJTmdJTURBc0xBa0FnQUVFVWFpSUZLQUlBSWdNTkFDQUFLQUlRSWdORkRRTWdBRUVRYWlFRkN3TkFJQVVoQ3lBRElnaEJGR29pQlNnQ0FDSUREUUFnQ0VFUWFpRUZJQWdvQWhBaUF3MEFDeUFMUVFBMkFnQU1DZ3RCZnlFQ0lBQkJ2MzlMRFFBZ0FFRVRhaUlEUVhCeElRSkJBQ2dDak5DQWdBQWlCMFVOQUVFQUlRc0NRQ0FDUVlBQ1NRMEFRUjhoQ3lBQ1FmLy8vd2RMRFFBZ0EwRUlkaUlESUFOQmdQNC9ha0VRZGtFSWNTSURkQ0lFSUFSQmdPQWZha0VRZGtFRWNTSUVkQ0lGSUFWQmdJQVBha0VRZGtFQ2NTSUZkRUVQZGlBRElBUnlJQVZ5YXlJRFFRRjBJQUlnQTBFVmFuWkJBWEZ5UVJ4cUlRc0xRUUFnQW1zaEJBSkFBa0FDUUFKQUlBdEJBblJCdU5LQWdBQnFLQUlBSWdVTkFFRUFJUU5CQUNFSURBRUxRUUFoQXlBQ1FRQkJHU0FMUVFGMmF5QUxRUjlHRzNRaEFFRUFJUWdEUUFKQUlBVW9BZ1JCZUhFZ0Ftc2lCaUFFVHcwQUlBWWhCQ0FGSVFnZ0JnMEFRUUFoQkNBRklRZ2dCU0VEREFNTElBTWdCVUVVYWlnQ0FDSUdJQVlnQlNBQVFSMTJRUVJ4YWtFUWFpZ0NBQ0lGUmhzZ0F5QUdHeUVESUFCQkFYUWhBQ0FGRFFBTEN3SkFJQU1nQ0hJTkFFRUFJUWhCQWlBTGRDSURRUUFnQTJ0eUlBZHhJZ05GRFFNZ0EwRUFJQU5yY1VGL2FpSURJQU5CREhaQkVIRWlBM1lpQlVFRmRrRUljU0lBSUFOeUlBVWdBSFlpQTBFQ2RrRUVjU0lGY2lBRElBVjJJZ05CQVhaQkFuRWlCWElnQXlBRmRpSURRUUYyUVFGeElnVnlJQU1nQlhacVFRSjBRYmpTZ0lBQWFpZ0NBQ0VEQ3lBRFJRMEJDd05BSUFNb0FnUkJlSEVnQW1zaUJpQUVTU0VBQWtBZ0F5Z0NFQ0lGRFFBZ0EwRVVhaWdDQUNFRkN5QUdJQVFnQUJzaEJDQURJQWdnQUJzaENDQUZJUU1nQlEwQUN3c2dDRVVOQUNBRVFRQW9BcERRZ0lBQUlBSnJUdzBBSUFnb0FoZ2hDd0pBSUFnb0Fnd2lBQ0FJUmcwQUlBZ29BZ2dpQTBFQUtBS1kwSUNBQUVrYUlBQWdBellDQ0NBRElBQTJBZ3dNQ1FzQ1FDQUlRUlJxSWdVb0FnQWlBdzBBSUFnb0FoQWlBMFVOQXlBSVFSQnFJUVVMQTBBZ0JTRUdJQU1pQUVFVWFpSUZLQUlBSWdNTkFDQUFRUkJxSVFVZ0FDZ0NFQ0lERFFBTElBWkJBRFlDQUF3SUN3SkFRUUFvQXBEUWdJQUFJZ01nQWtrTkFFRUFLQUtjMElDQUFDRUVBa0FDUUNBRElBSnJJZ1ZCRUVrTkFDQUVJQUpxSWdBZ0JVRUJjallDQkVFQUlBVTJBcERRZ0lBQVFRQWdBRFlDbk5DQWdBQWdCQ0FEYWlBRk5nSUFJQVFnQWtFRGNqWUNCQXdCQ3lBRUlBTkJBM0kyQWdRZ0JDQURhaUlESUFNb0FnUkJBWEkyQWdSQkFFRUFOZ0tjMElDQUFFRUFRUUEyQXBEUWdJQUFDeUFFUVFocUlRTU1DZ3NDUUVFQUtBS1UwSUNBQUNJQUlBSk5EUUJCQUNnQ29OQ0FnQUFpQXlBQ2FpSUVJQUFnQW1zaUJVRUJjallDQkVFQUlBVTJBcFRRZ0lBQVFRQWdCRFlDb05DQWdBQWdBeUFDUVFOeU5nSUVJQU5CQ0dvaEF3d0tDd0pBQWtCQkFDZ0M0Tk9BZ0FCRkRRQkJBQ2dDNk5PQWdBQWhCQXdCQzBFQVFuODNBdXpUZ0lBQVFRQkNnSUNFZ0lDQXdBQTNBdVRUZ0lBQVFRQWdBVUVNYWtGd2NVSFlxdFdxQlhNMkF1RFRnSUFBUVFCQkFEWUM5Tk9BZ0FCQkFFRUFOZ0xFMDRDQUFFR0FnQVFoQkF0QkFDRURBa0FnQkNBQ1FjY0FhaUlIYWlJR1FRQWdCR3NpQzNFaUNDQUNTdzBBUVFCQk1EWUMrTk9BZ0FBTUNnc0NRRUVBS0FMQTA0Q0FBQ0lEUlEwQUFrQkJBQ2dDdU5PQWdBQWlCQ0FJYWlJRklBUk5EUUFnQlNBRFRRMEJDMEVBSVFOQkFFRXdOZ0w0MDRDQUFBd0tDMEVBTFFERTA0Q0FBRUVFY1EwRUFrQUNRQUpBUVFBb0FxRFFnSUFBSWdSRkRRQkJ5Tk9BZ0FBaEF3TkFBa0FnQXlnQ0FDSUZJQVJMRFFBZ0JTQURLQUlFYWlBRVN3MERDeUFES0FJSUlnTU5BQXNMUVFBUXk0Q0FnQUFpQUVGL1JnMEZJQWdoQmdKQVFRQW9BdVRUZ0lBQUlnTkJmMm9pQkNBQWNVVU5BQ0FJSUFCcklBUWdBR3BCQUNBRGEzRnFJUVlMSUFZZ0FrME5CU0FHUWY3Ly8vOEhTdzBGQWtCQkFDZ0N3Tk9BZ0FBaUEwVU5BRUVBS0FLNDA0Q0FBQ0lFSUFacUlnVWdCRTBOQmlBRklBTkxEUVlMSUFZUXk0Q0FnQUFpQXlBQVJ3MEJEQWNMSUFZZ0FHc2dDM0VpQmtIKy8vLy9CMHNOQkNBR0VNdUFnSUFBSWdBZ0F5Z0NBQ0FES0FJRWFrWU5BeUFBSVFNTEFrQWdBMEYvUmcwQUlBSkJ5QUJxSUFaTkRRQUNRQ0FISUFaclFRQW9BdWpUZ0lBQUlnUnFRUUFnQkd0eElnUkIvdi8vL3dkTkRRQWdBeUVBREFjTEFrQWdCQkRMZ0lDQUFFRi9SZzBBSUFRZ0Jtb2hCaUFESVFBTUJ3dEJBQ0FHYXhETGdJQ0FBQm9NQkFzZ0F5RUFJQU5CZjBjTkJRd0RDMEVBSVFnTUJ3dEJBQ0VBREFVTElBQkJmMGNOQWd0QkFFRUFLQUxFMDRDQUFFRUVjallDeE5PQWdBQUxJQWhCL3YvLy93ZExEUUVnQ0JETGdJQ0FBQ0VBUVFBUXk0Q0FnQUFoQXlBQVFYOUdEUUVnQTBGL1JnMEJJQUFnQTA4TkFTQURJQUJySWdZZ0FrRTRhazBOQVF0QkFFRUFLQUs0MDRDQUFDQUdhaUlETmdLNDA0Q0FBQUpBSUFOQkFDZ0N2Tk9BZ0FCTkRRQkJBQ0FETmdLODA0Q0FBQXNDUUFKQUFrQUNRRUVBS0FLZzBJQ0FBQ0lFUlEwQVFjalRnSUFBSVFNRFFDQUFJQU1vQWdBaUJTQURLQUlFSWdocVJnMENJQU1vQWdnaUF3MEFEQU1MQ3dKQUFrQkJBQ2dDbU5DQWdBQWlBMFVOQUNBQUlBTlBEUUVMUVFBZ0FEWUNtTkNBZ0FBTFFRQWhBMEVBSUFZMkFzelRnSUFBUVFBZ0FEWUN5Tk9BZ0FCQkFFRi9OZ0tvMElDQUFFRUFRUUFvQXVEVGdJQUFOZ0tzMElDQUFFRUFRUUEyQXRUVGdJQUFBMEFnQTBIRTBJQ0FBR29nQTBHNDBJQ0FBR29pQkRZQ0FDQUVJQU5Cc05DQWdBQnFJZ1UyQWdBZ0EwRzgwSUNBQUdvZ0JUWUNBQ0FEUWN6UWdJQUFhaUFEUWNEUWdJQUFhaUlGTmdJQUlBVWdCRFlDQUNBRFFkVFFnSUFBYWlBRFFjalFnSUFBYWlJRU5nSUFJQVFnQlRZQ0FDQURRZERRZ0lBQWFpQUVOZ0lBSUFOQklHb2lBMEdBQWtjTkFBc2dBRUY0SUFCclFROXhRUUFnQUVFSWFrRVBjUnNpQTJvaUJDQUdRVWhxSWdVZ0Eyc2lBMEVCY2pZQ0JFRUFRUUFvQXZEVGdJQUFOZ0trMElDQUFFRUFJQU0yQXBUUWdJQUFRUUFnQkRZQ29OQ0FnQUFnQUNBRmFrRTROZ0lFREFJTElBTXRBQXhCQ0hFTkFDQUVJQVZKRFFBZ0JDQUFUdzBBSUFSQmVDQUVhMEVQY1VFQUlBUkJDR3BCRDNFYklnVnFJZ0JCQUNnQ2xOQ0FnQUFnQm1vaUN5QUZheUlGUVFGeU5nSUVJQU1nQ0NBR2FqWUNCRUVBUVFBb0F2RFRnSUFBTmdLazBJQ0FBRUVBSUFVMkFwVFFnSUFBUVFBZ0FEWUNvTkNBZ0FBZ0JDQUxha0U0TmdJRURBRUxBa0FnQUVFQUtBS1kwSUNBQUNJSVR3MEFRUUFnQURZQ21OQ0FnQUFnQUNFSUN5QUFJQVpxSVFWQnlOT0FnQUFoQXdKQUFrQUNRQUpBQWtBQ1FBSkFBMEFnQXlnQ0FDQUZSZzBCSUFNb0FnZ2lBdzBBREFJTEN5QURMUUFNUVFoeFJRMEJDMEhJMDRDQUFDRURBMEFDUUNBREtBSUFJZ1VnQkVzTkFDQUZJQU1vQWdScUlnVWdCRXNOQXdzZ0F5Z0NDQ0VEREFBTEN5QURJQUEyQWdBZ0F5QURLQUlFSUFacU5nSUVJQUJCZUNBQWEwRVBjVUVBSUFCQkNHcEJEM0ViYWlJTElBSkJBM0kyQWdRZ0JVRjRJQVZyUVE5eFFRQWdCVUVJYWtFUGNSdHFJZ1lnQ3lBQ2FpSUNheUVEQWtBZ0JpQUVSdzBBUVFBZ0FqWUNvTkNBZ0FCQkFFRUFLQUtVMElDQUFDQURhaUlETmdLVTBJQ0FBQ0FDSUFOQkFYSTJBZ1FNQXdzQ1FDQUdRUUFvQXB6UWdJQUFSdzBBUVFBZ0FqWUNuTkNBZ0FCQkFFRUFLQUtRMElDQUFDQURhaUlETmdLUTBJQ0FBQ0FDSUFOQkFYSTJBZ1FnQWlBRGFpQUROZ0lBREFNTEFrQWdCaWdDQkNJRVFRTnhRUUZIRFFBZ0JFRjRjU0VIQWtBQ1FDQUVRZjhCU3cwQUlBWW9BZ2dpQlNBRVFRTjJJZ2hCQTNSQnNOQ0FnQUJxSWdCR0dnSkFJQVlvQWd3aUJDQUZSdzBBUVFCQkFDZ0NpTkNBZ0FCQmZpQUlkM0UyQW9qUWdJQUFEQUlMSUFRZ0FFWWFJQVFnQlRZQ0NDQUZJQVEyQWd3TUFRc2dCaWdDR0NFSkFrQUNRQ0FHS0FJTUlnQWdCa1lOQUNBR0tBSUlJZ1FnQ0VrYUlBQWdCRFlDQ0NBRUlBQTJBZ3dNQVFzQ1FDQUdRUlJxSWdRb0FnQWlCUTBBSUFaQkVHb2lCQ2dDQUNJRkRRQkJBQ0VBREFFTEEwQWdCQ0VJSUFVaUFFRVVhaUlFS0FJQUlnVU5BQ0FBUVJCcUlRUWdBQ2dDRUNJRkRRQUxJQWhCQURZQ0FBc2dDVVVOQUFKQUFrQWdCaUFHS0FJY0lnVkJBblJCdU5LQWdBQnFJZ1FvQWdCSERRQWdCQ0FBTmdJQUlBQU5BVUVBUVFBb0FvelFnSUFBUVg0Z0JYZHhOZ0tNMElDQUFBd0NDeUFKUVJCQkZDQUpLQUlRSUFaR0cyb2dBRFlDQUNBQVJRMEJDeUFBSUFrMkFoZ0NRQ0FHS0FJUUlnUkZEUUFnQUNBRU5nSVFJQVFnQURZQ0dBc2dCaWdDRkNJRVJRMEFJQUJCRkdvZ0JEWUNBQ0FFSUFBMkFoZ0xJQWNnQTJvaEF5QUdJQWRxSWdZb0FnUWhCQXNnQmlBRVFYNXhOZ0lFSUFJZ0Eyb2dBellDQUNBQ0lBTkJBWEkyQWdRQ1FDQURRZjhCU3cwQUlBTkJlSEZCc05DQWdBQnFJUVFDUUFKQVFRQW9Bb2pRZ0lBQUlnVkJBU0FEUVFOMmRDSURjUTBBUVFBZ0JTQURjallDaU5DQWdBQWdCQ0VEREFFTElBUW9BZ2doQXdzZ0F5QUNOZ0lNSUFRZ0FqWUNDQ0FDSUFRMkFnd2dBaUFETmdJSURBTUxRUjhoQkFKQUlBTkIvLy8vQjBzTkFDQURRUWgySWdRZ0JFR0EvajlxUVJCMlFRaHhJZ1IwSWdVZ0JVR0E0QjlxUVJCMlFRUnhJZ1YwSWdBZ0FFR0FnQTlxUVJCMlFRSnhJZ0IwUVE5MklBUWdCWElnQUhKcklnUkJBWFFnQXlBRVFSVnFka0VCY1hKQkhHb2hCQXNnQWlBRU5nSWNJQUpDQURjQ0VDQUVRUUowUWJqU2dJQUFhaUVGQWtCQkFDZ0NqTkNBZ0FBaUFFRUJJQVIwSWdoeERRQWdCU0FDTmdJQVFRQWdBQ0FJY2pZQ2pOQ0FnQUFnQWlBRk5nSVlJQUlnQWpZQ0NDQUNJQUkyQWd3TUF3c2dBMEVBUVJrZ0JFRUJkbXNnQkVFZlJodDBJUVFnQlNnQ0FDRUFBMEFnQUNJRktBSUVRWGh4SUFOR0RRSWdCRUVkZGlFQUlBUkJBWFFoQkNBRklBQkJCSEZxUVJCcUlnZ29BZ0FpQUEwQUN5QUlJQUkyQWdBZ0FpQUZOZ0lZSUFJZ0FqWUNEQ0FDSUFJMkFnZ01BZ3NnQUVGNElBQnJRUTl4UVFBZ0FFRUlha0VQY1JzaUEyb2lDeUFHUVVocUlnZ2dBMnNpQTBFQmNqWUNCQ0FBSUFocVFUZzJBZ1FnQkNBRlFUY2dCV3RCRDNGQkFDQUZRVWxxUVE5eEcycEJRV29pQ0NBSUlBUkJFR3BKR3lJSVFTTTJBZ1JCQUVFQUtBTHcwNENBQURZQ3BOQ0FnQUJCQUNBRE5nS1UwSUNBQUVFQUlBczJBcURRZ0lBQUlBaEJFR3BCQUNrQzBOT0FnQUEzQWdBZ0NFRUFLUUxJMDRDQUFEY0NDRUVBSUFoQkNHbzJBdERUZ0lBQVFRQWdCallDek5PQWdBQkJBQ0FBTmdMSTA0Q0FBRUVBUVFBMkF0VFRnSUFBSUFoQkpHb2hBd05BSUFOQkJ6WUNBQ0FEUVFScUlnTWdCVWtOQUFzZ0NDQUVSZzBESUFnZ0NDZ0NCRUYrY1RZQ0JDQUlJQWdnQkdzaUFEWUNBQ0FFSUFCQkFYSTJBZ1FDUUNBQVFmOEJTdzBBSUFCQmVIRkJzTkNBZ0FCcUlRTUNRQUpBUVFBb0FvalFnSUFBSWdWQkFTQUFRUU4yZENJQWNRMEFRUUFnQlNBQWNqWUNpTkNBZ0FBZ0F5RUZEQUVMSUFNb0FnZ2hCUXNnQlNBRU5nSU1JQU1nQkRZQ0NDQUVJQU0yQWd3Z0JDQUZOZ0lJREFRTFFSOGhBd0pBSUFCQi8vLy9CMHNOQUNBQVFRaDJJZ01nQTBHQS9qOXFRUkIyUVFoeElnTjBJZ1VnQlVHQTRCOXFRUkIyUVFSeElnVjBJZ2dnQ0VHQWdBOXFRUkIyUVFKeElnaDBRUTkySUFNZ0JYSWdDSEpySWdOQkFYUWdBQ0FEUVJWcWRrRUJjWEpCSEdvaEF3c2dCQ0FETmdJY0lBUkNBRGNDRUNBRFFRSjBRYmpTZ0lBQWFpRUZBa0JCQUNnQ2pOQ0FnQUFpQ0VFQklBTjBJZ1p4RFFBZ0JTQUVOZ0lBUVFBZ0NDQUdjallDak5DQWdBQWdCQ0FGTmdJWUlBUWdCRFlDQ0NBRUlBUTJBZ3dNQkFzZ0FFRUFRUmtnQTBFQmRtc2dBMEVmUmh0MElRTWdCU2dDQUNFSUEwQWdDQ0lGS0FJRVFYaHhJQUJHRFFNZ0EwRWRkaUVJSUFOQkFYUWhBeUFGSUFoQkJIRnFRUkJxSWdZb0FnQWlDQTBBQ3lBR0lBUTJBZ0FnQkNBRk5nSVlJQVFnQkRZQ0RDQUVJQVEyQWdnTUF3c2dCU2dDQ0NJRElBSTJBZ3dnQlNBQ05nSUlJQUpCQURZQ0dDQUNJQVUyQWd3Z0FpQUROZ0lJQ3lBTFFRaHFJUU1NQlFzZ0JTZ0NDQ0lESUFRMkFnd2dCU0FFTmdJSUlBUkJBRFlDR0NBRUlBVTJBZ3dnQkNBRE5nSUlDMEVBS0FLVTBJQ0FBQ0lESUFKTkRRQkJBQ2dDb05DQWdBQWlCQ0FDYWlJRklBTWdBbXNpQTBFQmNqWUNCRUVBSUFNMkFwVFFnSUFBUVFBZ0JUWUNvTkNBZ0FBZ0JDQUNRUU55TmdJRUlBUkJDR29oQXd3REMwRUFJUU5CQUVFd05nTDQwNENBQUF3Q0N3SkFJQXRGRFFBQ1FBSkFJQWdnQ0NnQ0hDSUZRUUowUWJqU2dJQUFhaUlES0FJQVJ3MEFJQU1nQURZQ0FDQUFEUUZCQUNBSFFYNGdCWGR4SWdjMkFvelFnSUFBREFJTElBdEJFRUVVSUFzb0FoQWdDRVliYWlBQU5nSUFJQUJGRFFFTElBQWdDellDR0FKQUlBZ29BaEFpQTBVTkFDQUFJQU0yQWhBZ0F5QUFOZ0lZQ3lBSVFSUnFLQUlBSWdORkRRQWdBRUVVYWlBRE5nSUFJQU1nQURZQ0dBc0NRQUpBSUFSQkQwc05BQ0FJSUFRZ0Ftb2lBMEVEY2pZQ0JDQUlJQU5xSWdNZ0F5Z0NCRUVCY2pZQ0JBd0JDeUFJSUFKcUlnQWdCRUVCY2pZQ0JDQUlJQUpCQTNJMkFnUWdBQ0FFYWlBRU5nSUFBa0FnQkVIL0FVc05BQ0FFUVhoeFFiRFFnSUFBYWlFREFrQUNRRUVBS0FLSTBJQ0FBQ0lGUVFFZ0JFRURkblFpQkhFTkFFRUFJQVVnQkhJMkFvalFnSUFBSUFNaEJBd0JDeUFES0FJSUlRUUxJQVFnQURZQ0RDQURJQUEyQWdnZ0FDQUROZ0lNSUFBZ0JEWUNDQXdCQzBFZklRTUNRQ0FFUWYvLy93ZExEUUFnQkVFSWRpSURJQU5CZ1A0L2FrRVFka0VJY1NJRGRDSUZJQVZCZ09BZmFrRVFka0VFY1NJRmRDSUNJQUpCZ0lBUGFrRVFka0VDY1NJQ2RFRVBkaUFESUFWeUlBSnlheUlEUVFGMElBUWdBMEVWYW5aQkFYRnlRUnhxSVFNTElBQWdBellDSENBQVFnQTNBaEFnQTBFQ2RFRzQwb0NBQUdvaEJRSkFJQWRCQVNBRGRDSUNjUTBBSUFVZ0FEWUNBRUVBSUFjZ0FuSTJBb3pRZ0lBQUlBQWdCVFlDR0NBQUlBQTJBZ2dnQUNBQU5nSU1EQUVMSUFSQkFFRVpJQU5CQVhacklBTkJIMFliZENFRElBVW9BZ0FoQWdKQUEwQWdBaUlGS0FJRVFYaHhJQVJHRFFFZ0EwRWRkaUVDSUFOQkFYUWhBeUFGSUFKQkJIRnFRUkJxSWdZb0FnQWlBZzBBQ3lBR0lBQTJBZ0FnQUNBRk5nSVlJQUFnQURZQ0RDQUFJQUEyQWdnTUFRc2dCU2dDQ0NJRElBQTJBZ3dnQlNBQU5nSUlJQUJCQURZQ0dDQUFJQVUyQWd3Z0FDQUROZ0lJQ3lBSVFRaHFJUU1NQVFzQ1FDQUtSUTBBQWtBQ1FDQUFJQUFvQWh3aUJVRUNkRUc0MG9DQUFHb2lBeWdDQUVjTkFDQURJQWcyQWdBZ0NBMEJRUUFnQ1VGK0lBVjNjVFlDak5DQWdBQU1BZ3NnQ2tFUVFSUWdDaWdDRUNBQVJodHFJQWcyQWdBZ0NFVU5BUXNnQ0NBS05nSVlBa0FnQUNnQ0VDSURSUTBBSUFnZ0F6WUNFQ0FESUFnMkFoZ0xJQUJCRkdvb0FnQWlBMFVOQUNBSVFSUnFJQU0yQWdBZ0F5QUlOZ0lZQ3dKQUFrQWdCRUVQU3cwQUlBQWdCQ0FDYWlJRFFRTnlOZ0lFSUFBZ0Eyb2lBeUFES0FJRVFRRnlOZ0lFREFFTElBQWdBbW9pQlNBRVFRRnlOZ0lFSUFBZ0FrRURjallDQkNBRklBUnFJQVEyQWdBQ1FDQUhSUTBBSUFkQmVIRkJzTkNBZ0FCcUlRSkJBQ2dDbk5DQWdBQWhBd0pBQWtCQkFTQUhRUU4yZENJSUlBWnhEUUJCQUNBSUlBWnlOZ0tJMElDQUFDQUNJUWdNQVFzZ0FpZ0NDQ0VJQ3lBSUlBTTJBZ3dnQWlBRE5nSUlJQU1nQWpZQ0RDQURJQWcyQWdnTFFRQWdCVFlDbk5DQWdBQkJBQ0FFTmdLUTBJQ0FBQXNnQUVFSWFpRURDeUFCUVJCcUpJQ0FnSUFBSUFNTENnQWdBQkRKZ0lDQUFBdmlEUUVIZndKQUlBQkZEUUFnQUVGNGFpSUJJQUJCZkdvb0FnQWlBa0Y0Y1NJQWFpRURBa0FnQWtFQmNRMEFJQUpCQTNGRkRRRWdBU0FCS0FJQUlnSnJJZ0ZCQUNnQ21OQ0FnQUFpQkVrTkFTQUNJQUJxSVFBQ1FDQUJRUUFvQXB6UWdJQUFSZzBBQWtBZ0FrSC9BVXNOQUNBQktBSUlJZ1FnQWtFRGRpSUZRUU4wUWJEUWdJQUFhaUlHUmhvQ1FDQUJLQUlNSWdJZ0JFY05BRUVBUVFBb0FvalFnSUFBUVg0Z0JYZHhOZ0tJMElDQUFBd0RDeUFDSUFaR0dpQUNJQVEyQWdnZ0JDQUNOZ0lNREFJTElBRW9BaGdoQndKQUFrQWdBU2dDRENJR0lBRkdEUUFnQVNnQ0NDSUNJQVJKR2lBR0lBSTJBZ2dnQWlBR05nSU1EQUVMQWtBZ0FVRVVhaUlDS0FJQUlnUU5BQ0FCUVJCcUlnSW9BZ0FpQkEwQVFRQWhCZ3dCQ3dOQUlBSWhCU0FFSWdaQkZHb2lBaWdDQUNJRURRQWdCa0VRYWlFQ0lBWW9BaEFpQkEwQUN5QUZRUUEyQWdBTElBZEZEUUVDUUFKQUlBRWdBU2dDSENJRVFRSjBRYmpTZ0lBQWFpSUNLQUlBUncwQUlBSWdCallDQUNBR0RRRkJBRUVBS0FLTTBJQ0FBRUYrSUFSM2NUWUNqTkNBZ0FBTUF3c2dCMEVRUVJRZ0J5Z0NFQ0FCUmh0cUlBWTJBZ0FnQmtVTkFnc2dCaUFITmdJWUFrQWdBU2dDRUNJQ1JRMEFJQVlnQWpZQ0VDQUNJQVkyQWhnTElBRW9BaFFpQWtVTkFTQUdRUlJxSUFJMkFnQWdBaUFHTmdJWURBRUxJQU1vQWdRaUFrRURjVUVEUncwQUlBTWdBa0YrY1RZQ0JFRUFJQUEyQXBEUWdJQUFJQUVnQUdvZ0FEWUNBQ0FCSUFCQkFYSTJBZ1FQQ3lBQklBTlBEUUFnQXlnQ0JDSUNRUUZ4UlEwQUFrQUNRQ0FDUVFKeERRQUNRQ0FEUVFBb0FxRFFnSUFBUncwQVFRQWdBVFlDb05DQWdBQkJBRUVBS0FLVTBJQ0FBQ0FBYWlJQU5nS1UwSUNBQUNBQklBQkJBWEkyQWdRZ0FVRUFLQUtjMElDQUFFY05BMEVBUVFBMkFwRFFnSUFBUVFCQkFEWUNuTkNBZ0FBUEN3SkFJQU5CQUNnQ25OQ0FnQUJIRFFCQkFDQUJOZ0tjMElDQUFFRUFRUUFvQXBEUWdJQUFJQUJxSWdBMkFwRFFnSUFBSUFFZ0FFRUJjallDQkNBQklBQnFJQUEyQWdBUEN5QUNRWGh4SUFCcUlRQUNRQUpBSUFKQi93RkxEUUFnQXlnQ0NDSUVJQUpCQTNZaUJVRURkRUd3MElDQUFHb2lCa1lhQWtBZ0F5Z0NEQ0lDSUFSSERRQkJBRUVBS0FLSTBJQ0FBRUYrSUFWM2NUWUNpTkNBZ0FBTUFnc2dBaUFHUmhvZ0FpQUVOZ0lJSUFRZ0FqWUNEQXdCQ3lBREtBSVlJUWNDUUFKQUlBTW9BZ3dpQmlBRFJnMEFJQU1vQWdnaUFrRUFLQUtZMElDQUFFa2FJQVlnQWpZQ0NDQUNJQVkyQWd3TUFRc0NRQ0FEUVJScUlnSW9BZ0FpQkEwQUlBTkJFR29pQWlnQ0FDSUVEUUJCQUNFR0RBRUxBMEFnQWlFRklBUWlCa0VVYWlJQ0tBSUFJZ1FOQUNBR1FSQnFJUUlnQmlnQ0VDSUVEUUFMSUFWQkFEWUNBQXNnQjBVTkFBSkFBa0FnQXlBREtBSWNJZ1JCQW5SQnVOS0FnQUJxSWdJb0FnQkhEUUFnQWlBR05nSUFJQVlOQVVFQVFRQW9Bb3pRZ0lBQVFYNGdCSGR4TmdLTTBJQ0FBQXdDQ3lBSFFSQkJGQ0FIS0FJUUlBTkdHMm9nQmpZQ0FDQUdSUTBCQ3lBR0lBYzJBaGdDUUNBREtBSVFJZ0pGRFFBZ0JpQUNOZ0lRSUFJZ0JqWUNHQXNnQXlnQ0ZDSUNSUTBBSUFaQkZHb2dBallDQUNBQ0lBWTJBaGdMSUFFZ0FHb2dBRFlDQUNBQklBQkJBWEkyQWdRZ0FVRUFLQUtjMElDQUFFY05BVUVBSUFBMkFwRFFnSUFBRHdzZ0F5QUNRWDV4TmdJRUlBRWdBR29nQURZQ0FDQUJJQUJCQVhJMkFnUUxBa0FnQUVIL0FVc05BQ0FBUVhoeFFiRFFnSUFBYWlFQ0FrQUNRRUVBS0FLSTBJQ0FBQ0lFUVFFZ0FFRURkblFpQUhFTkFFRUFJQVFnQUhJMkFvalFnSUFBSUFJaEFBd0JDeUFDS0FJSUlRQUxJQUFnQVRZQ0RDQUNJQUUyQWdnZ0FTQUNOZ0lNSUFFZ0FEWUNDQThMUVI4aEFnSkFJQUJCLy8vL0Iwc05BQ0FBUVFoMklnSWdBa0dBL2o5cVFSQjJRUWh4SWdKMElnUWdCRUdBNEI5cVFSQjJRUVJ4SWdSMElnWWdCa0dBZ0E5cVFSQjJRUUp4SWdaMFFROTJJQUlnQkhJZ0JuSnJJZ0pCQVhRZ0FDQUNRUlZxZGtFQmNYSkJIR29oQWdzZ0FTQUNOZ0ljSUFGQ0FEY0NFQ0FDUVFKMFFialNnSUFBYWlFRUFrQUNRRUVBS0FLTTBJQ0FBQ0lHUVFFZ0FuUWlBM0VOQUNBRUlBRTJBZ0JCQUNBR0lBTnlOZ0tNMElDQUFDQUJJQVEyQWhnZ0FTQUJOZ0lJSUFFZ0FUWUNEQXdCQ3lBQVFRQkJHU0FDUVFGMmF5QUNRUjlHRzNRaEFpQUVLQUlBSVFZQ1FBTkFJQVlpQkNnQ0JFRjRjU0FBUmcwQklBSkJIWFloQmlBQ1FRRjBJUUlnQkNBR1FRUnhha0VRYWlJREtBSUFJZ1lOQUFzZ0F5QUJOZ0lBSUFFZ0JEWUNHQ0FCSUFFMkFnd2dBU0FCTmdJSURBRUxJQVFvQWdnaUFDQUJOZ0lNSUFRZ0FUWUNDQ0FCUVFBMkFoZ2dBU0FFTmdJTUlBRWdBRFlDQ0F0QkFFRUFLQUtvMElDQUFFRi9haUlCUVg4Z0FSczJBcWpRZ0lBQUN3c0VBQUFBQzA0QUFrQWdBQTBBUHdCQkVIUVBDd0pBSUFCQi8vOERjUTBBSUFCQmYwd05BQUpBSUFCQkVIWkFBQ0lBUVg5SERRQkJBRUV3TmdMNDA0Q0FBRUYvRHdzZ0FFRVFkQThMRU1xQWdJQUFBQXZ5QWdJRGZ3RitBa0FnQWtVTkFDQUFJQUU2QUFBZ0FpQUFhaUlEUVg5cUlBRTZBQUFnQWtFRFNRMEFJQUFnQVRvQUFpQUFJQUU2QUFFZ0EwRjlhaUFCT2dBQUlBTkJmbW9nQVRvQUFDQUNRUWRKRFFBZ0FDQUJPZ0FESUFOQmZHb2dBVG9BQUNBQ1FRbEpEUUFnQUVFQUlBQnJRUU54SWdScUlnTWdBVUgvQVhGQmdZS0VDR3dpQVRZQ0FDQURJQUlnQkd0QmZIRWlCR29pQWtGOGFpQUJOZ0lBSUFSQkNVa05BQ0FESUFFMkFnZ2dBeUFCTmdJRUlBSkJlR29nQVRZQ0FDQUNRWFJxSUFFMkFnQWdCRUVaU1EwQUlBTWdBVFlDR0NBRElBRTJBaFFnQXlBQk5nSVFJQU1nQVRZQ0RDQUNRWEJxSUFFMkFnQWdBa0ZzYWlBQk5nSUFJQUpCYUdvZ0FUWUNBQ0FDUVdScUlBRTJBZ0FnQkNBRFFRUnhRUmh5SWdWcklnSkJJRWtOQUNBQnJVS0JnSUNBRUg0aEJpQURJQVZxSVFFRFFDQUJJQVkzQXhnZ0FTQUdOd01RSUFFZ0JqY0RDQ0FCSUFZM0F3QWdBVUVnYWlFQklBSkJZR29pQWtFZlN3MEFDd3NnQUFzTGprZ0JBRUdBQ0F1R1NBRUFBQUFDQUFBQUF3QUFBQUFBQUFBQUFBQUFCQUFBQUFVQUFBQUFBQUFBQUFBQUFBWUFBQUFIQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0J4ZFdWeWVRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgySnZaSGtBUTI5dWRHVnVkQzFNWlc1bmRHZ2diM1psY21ac2IzY0FRMmgxYm1zZ2MybDZaU0J2ZG1WeVpteHZkd0JTWlhOd2IyNXpaU0J2ZG1WeVpteHZkd0JKYm5aaGJHbGtJRzFsZEdodlpDQm1iM0lnU0ZSVVVDOTRMbmdnY21WeGRXVnpkQUJKYm5aaGJHbGtJRzFsZEdodlpDQm1iM0lnVWxSVFVDOTRMbmdnY21WeGRXVnpkQUJGZUhCbFkzUmxaQ0JUVDFWU1EwVWdiV1YwYUc5a0lHWnZjaUJKUTBVdmVDNTRJSEpsY1hWbGMzUUFTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0JtY21GbmJXVnVkQ0J6ZEdGeWRBQkZlSEJsWTNSbFpDQmtiM1FBVTNCaGJpQmpZV3hzWW1GamF5Qmxjbkp2Y2lCcGJpQnZibDl6ZEdGMGRYTUFTVzUyWVd4cFpDQnlaWE53YjI1elpTQnpkR0YwZFhNQVNXNTJZV3hwWkNCamFHRnlZV04wWlhJZ2FXNGdZMmgxYm1zZ1pYaDBaVzV6YVc5dWN3QlZjMlZ5SUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5eVpYTmxkR0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDJOb2RXNXJYMmhsWVdSbGNtQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMjFsYzNOaFoyVmZZbVZuYVc1Z0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmRtRnNkV1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5emRHRjBkWE5mWTI5dGNHeGxkR1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5MlpYSnphVzl1WDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmRYSnNYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmWTJoMWJtdGZZMjl0Y0d4bGRHVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDlvWldGa1pYSmZkbUZzZFdWZlkyOXRjR3hsZEdWZ0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOXRaWE56WVdkbFgyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZiV1YwYUc5a1gyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZhR1ZoWkdWeVgyWnBaV3hrWDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZlkyaDFibXRmWlhoMFpXNXphVzl1WDI1aGJXVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFGVnVaWGh3WldOMFpXUWdZMmhoY2lCcGJpQjFjbXdnYzJWeWRtVnlBRWx1ZG1Gc2FXUWdhR1ZoWkdWeUlIWmhiSFZsSUdOb1lYSUFTVzUyWVd4cFpDQm9aV0ZrWlhJZ1ptbGxiR1FnWTJoaGNnQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgzWmxjbk5wYjI0QVNXNTJZV3hwWkNCdGFXNXZjaUIyWlhKemFXOXVBRWx1ZG1Gc2FXUWdiV0ZxYjNJZ2RtVnljMmx2YmdCRmVIQmxZM1JsWkNCemNHRmpaU0JoWm5SbGNpQjJaWEp6YVc5dUFFVjRjR1ZqZEdWa0lFTlNURVlnWVdaMFpYSWdkbVZ5YzJsdmJnQkpiblpoYkdsa0lFaFVWRkFnZG1WeWMybHZiZ0JKYm5aaGJHbGtJR2hsWVdSbGNpQjBiMnRsYmdCVGNHRnVJR05oYkd4aVlXTnJJR1Z5Y205eUlHbHVJRzl1WDNWeWJBQkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNuTWdhVzRnZFhKc0FGVnVaWGh3WldOMFpXUWdjM1JoY25RZ1kyaGhjaUJwYmlCMWNtd0FSRzkxWW14bElFQWdhVzRnZFhKc0FFVnRjSFI1SUVOdmJuUmxiblF0VEdWdVozUm9BRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUVOdmJuUmxiblF0VEdWdVozUm9BRVIxY0d4cFkyRjBaU0JEYjI1MFpXNTBMVXhsYm1kMGFBQkpiblpoYkdsa0lHTm9ZWElnYVc0Z2RYSnNJSEJoZEdnQVEyOXVkR1Z1ZEMxTVpXNW5kR2dnWTJGdUozUWdZbVVnY0hKbGMyVnVkQ0IzYVhSb0lGUnlZVzV6Wm1WeUxVVnVZMjlrYVc1bkFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklITnBlbVVBVTNCaGJpQmpZV3hzWW1GamF5Qmxjbkp2Y2lCcGJpQnZibDlvWldGa1pYSmZkbUZzZFdVQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5amFIVnVhMTlsZUhSbGJuTnBiMjVmZG1Gc2RXVUFTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSWdhVzRnWTJoMWJtc2daWGgwWlc1emFXOXVjeUIyWVd4MVpRQk5hWE56YVc1bklHVjRjR1ZqZEdWa0lFeEdJR0ZtZEdWeUlHaGxZV1JsY2lCMllXeDFaUUJKYm5aaGJHbGtJR0JVY21GdWMyWmxjaTFGYm1OdlpHbHVaMkFnYUdWaFpHVnlJSFpoYkhWbEFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklHVjRkR1Z1YzJsdmJuTWdjWFZ2ZEdVZ2RtRnNkV1VBU1c1MllXeHBaQ0JqYUdGeVlXTjBaWElnYVc0Z1kyaDFibXNnWlhoMFpXNXphVzl1Y3lCeGRXOTBaV1FnZG1Gc2RXVUFVR0YxYzJWa0lHSjVJRzl1WDJobFlXUmxjbk5mWTI5dGNHeGxkR1VBU1c1MllXeHBaQ0JGVDBZZ2MzUmhkR1VBYjI1ZmNtVnpaWFFnY0dGMWMyVUFiMjVmWTJoMWJtdGZhR1ZoWkdWeUlIQmhkWE5sQUc5dVgyMWxjM05oWjJWZlltVm5hVzRnY0dGMWMyVUFiMjVmWTJoMWJtdGZaWGgwWlc1emFXOXVYM1poYkhWbElIQmhkWE5sQUc5dVgzTjBZWFIxYzE5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5MlpYSnphVzl1WDJOdmJYQnNaWFJsSUhCaGRYTmxBRzl1WDNWeWJGOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOWphSFZ1YTE5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5b1pXRmtaWEpmZG1Gc2RXVmZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOXRaWFJvYjJSZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmFHVmhaR1Z5WDJacFpXeGtYMk52YlhCc1pYUmxJSEJoZFhObEFHOXVYMk5vZFc1clgyVjRkR1Z1YzJsdmJsOXVZVzFsSUhCaGRYTmxBRlZ1Wlhod1pXTjBaV1FnYzNCaFkyVWdZV1owWlhJZ2MzUmhjblFnYkdsdVpRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyTm9kVzVyWDJWNGRHVnVjMmx2Ymw5dVlXMWxBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJR1Y0ZEdWdWMybHZibk1nYm1GdFpRQlFZWFZ6WlNCdmJpQkRUMDVPUlVOVUwxVndaM0poWkdVQVVHRjFjMlVnYjI0Z1VGSkpMMVZ3WjNKaFpHVUFSWGh3WldOMFpXUWdTRlJVVUM4eUlFTnZibTVsWTNScGIyNGdVSEpsWm1GalpRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyMWxkR2h2WkFCRmVIQmxZM1JsWkNCemNHRmpaU0JoWm5SbGNpQnRaWFJvYjJRQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5b1pXRmtaWEpmWm1sbGJHUUFVR0YxYzJWa0FFbHVkbUZzYVdRZ2QyOXlaQ0JsYm1OdmRXNTBaWEpsWkFCSmJuWmhiR2xrSUcxbGRHaHZaQ0JsYm1OdmRXNTBaWEpsWkFCVmJtVjRjR1ZqZEdWa0lHTm9ZWElnYVc0Z2RYSnNJSE5qYUdWdFlRQlNaWEYxWlhOMElHaGhjeUJwYm5aaGJHbGtJR0JVY21GdWMyWmxjaTFGYm1OdlpHbHVaMkFBVTFkSlZFTklYMUJTVDFoWkFGVlRSVjlRVWs5WVdRQk5TMEZEVkVsV1NWUlpBRlZPVUZKUFEwVlRVMEZDVEVWZlJVNVVTVlJaQUVOUFVGa0FUVTlXUlVSZlVFVlNUVUZPUlU1VVRGa0FWRTlQWDBWQlVreFpBRTVQVkVsR1dRQkdRVWxNUlVSZlJFVlFSVTVFUlU1RFdRQkNRVVJmUjBGVVJWZEJXUUJRVEVGWkFGQlZWQUJEU0VWRFMwOVZWQUJIUVZSRlYwRlpYMVJKVFVWUFZWUUFVa1ZSVlVWVFZGOVVTVTFGVDFWVUFFNUZWRmRQVWt0ZlEwOU9Ua1ZEVkY5VVNVMUZUMVZVQUVOUFRrNUZRMVJKVDA1ZlZFbE5SVTlWVkFCTVQwZEpUbDlVU1UxRlQxVlVBRTVGVkZkUFVrdGZVa1ZCUkY5VVNVMUZUMVZVQUZCUFUxUUFUVWxUUkVsU1JVTlVSVVJmVWtWUlZVVlRWQUJEVEVsRlRsUmZRMHhQVTBWRVgxSkZVVlZGVTFRQVEweEpSVTVVWDBOTVQxTkZSRjlNVDBGRVgwSkJURUZPUTBWRVgxSkZVVlZGVTFRQVFrRkVYMUpGVVZWRlUxUUFTRlJVVUY5U1JWRlZSVk5VWDFORlRsUmZWRTlmU0ZSVVVGTmZVRTlTVkFCU1JWQlBVbFFBU1UxZlFWOVVSVUZRVDFRQVVrVlRSVlJmUTA5T1ZFVk9WQUJPVDE5RFQwNVVSVTVVQUZCQlVsUkpRVXhmUTA5T1ZFVk9WQUJJVUVWZlNVNVdRVXhKUkY5RFQwNVRWRUZPVkFCSVVFVmZRMEpmVWtWVFJWUUFSMFZVQUVoUVJWOVRWRkpKUTFRQVEwOU9Sa3hKUTFRQVZFVk5VRTlTUVZKWlgxSkZSRWxTUlVOVUFGQkZVazFCVGtWT1ZGOVNSVVJKVWtWRFZBQkRUMDVPUlVOVUFFMVZURlJKWDFOVVFWUlZVd0JJVUVWZlNVNVdRVXhKUkY5VFZFRlVWVk1BVkU5UFgwMUJUbGxmVWtWUlZVVlRWRk1BUlVGU1RGbGZTRWxPVkZNQVZVNUJWa0ZKVEVGQ1RFVmZSazlTWDB4RlIwRk1YMUpGUVZOUFRsTUFUMUJVU1U5T1V3QlRWMGxVUTBoSlRrZGZVRkpQVkU5RFQweFRBRlpCVWtsQlRsUmZRVXhUVDE5T1JVZFBWRWxCVkVWVEFFMVZURlJKVUV4RlgwTklUMGxEUlZNQVNVNVVSVkpPUVV4ZlUwVlNWa1ZTWDBWU1VrOVNBRmRGUWw5VFJWSldSVkpmVlU1TFRrOVhUbDlGVWxKUFVnQlNRVWxNUjFWT1gwVlNVazlTQUVsRVJVNVVTVlJaWDFCU1QxWkpSRVZTWDBGVlZFaEZUbFJKUTBGVVNVOU9YMFZTVWs5U0FGTlRURjlEUlZKVVNVWkpRMEZVUlY5RlVsSlBVZ0JKVGxaQlRFbEVYMWhmUms5U1YwRlNSRVZFWDBaUFVnQlRSVlJmVUVGU1FVMUZWRVZTQUVkRlZGOVFRVkpCVFVWVVJWSUFTRkJGWDFWVFJWSUFVMFZGWDA5VVNFVlNBRWhRUlY5RFFsOURTRlZPUzE5SVJVRkVSVklBVFV0RFFVeEZUa1JCVWdCVFJWUlZVQUJYUlVKZlUwVlNWa1ZTWDBsVFgwUlBWMDRBVkVWQlVrUlBWMDRBU0ZCRlgwTk1UMU5GUkY5RFQwNU9SVU5VU1U5T0FFaEZWVkpKVTFSSlExOUZXRkJKVWtGVVNVOU9BRVJKVTBOUFRrNUZRMVJGUkY5UFVFVlNRVlJKVDA0QVRrOU9YMEZWVkVoUFVrbFVRVlJKVmtWZlNVNUdUMUpOUVZSSlQwNEFTRkJGWDBsT1ZrRk1TVVJmVmtWU1UwbFBUZ0JJVUVWZlEwSmZUVVZUVTBGSFJWOUNSVWRKVGdCVFNWUkZYMGxUWDBaU1QxcEZUZ0JJVUVWZlNVNVdRVXhKUkY5SVJVRkVSVkpmVkU5TFJVNEFTVTVXUVV4SlJGOVVUMHRGVGdCR1QxSkNTVVJFUlU0QVJVNUlRVTVEUlY5WlQxVlNYME5CVEUwQVNGQkZYMGxPVmtGTVNVUmZWVkpNQUVKTVQwTkxSVVJmUWxsZlVFRlNSVTVVUVV4ZlEwOU9WRkpQVEFCTlMwTlBUQUJCUTB3QVNGQkZYMGxPVkVWU1RrRk1BRkpGVVZWRlUxUmZTRVZCUkVWU1gwWkpSVXhFVTE5VVQwOWZURUZTUjBWZlZVNVBSa1pKUTBsQlRBQklVRVZmVDBzQVZVNU1TVTVMQUZWT1RFOURTd0JRVWtrQVVrVlVVbGxmVjBsVVNBQklVRVZmU1U1V1FVeEpSRjlEVDA1VVJVNVVYMHhGVGtkVVNBQklVRVZmVlU1RldGQkZRMVJGUkY5RFQwNVVSVTVVWDB4RlRrZFVTQUJHVEZWVFNBQlFVazlRVUVGVVEwZ0FUUzFUUlVGU1EwZ0FWVkpKWDFSUFQxOU1UMDVIQUZCU1QwTkZVMU5KVGtjQVRVbFRRMFZNVEVGT1JVOVZVMTlRUlZKVFNWTlVSVTVVWDFkQlVrNUpUa2NBVFVsVFEwVk1URUZPUlU5VlUxOVhRVkpPU1U1SEFFaFFSVjlKVGxaQlRFbEVYMVJTUVU1VFJrVlNYMFZPUTA5RVNVNUhBRVY0Y0dWamRHVmtJRU5TVEVZQVNGQkZYMGxPVmtGTVNVUmZRMGhWVGt0ZlUwbGFSUUJOVDFaRkFFTlBUbFJKVGxWRkFFaFFSVjlEUWw5VFZFRlVWVk5mUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMGhGUVVSRlVsTmZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gxWkZVbE5KVDA1ZlEwOU5VRXhGVkVVQVNGQkZYME5DWDFWU1RGOURUMDFRVEVWVVJRQklVRVZmUTBKZlEwaFZUa3RmUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMGhGUVVSRlVsOVdRVXhWUlY5RFQwMVFURVZVUlFCSVVFVmZRMEpmUTBoVlRrdGZSVmhVUlU1VFNVOU9YMVpCVEZWRlgwTlBUVkJNUlZSRkFFaFFSVjlEUWw5RFNGVk9TMTlGV0ZSRlRsTkpUMDVmVGtGTlJWOURUMDFRVEVWVVJRQklVRVZmUTBKZlRVVlRVMEZIUlY5RFQwMVFURVZVUlFCSVVFVmZRMEpmVFVWVVNFOUVYME5QVFZCTVJWUkZBRWhRUlY5RFFsOUlSVUZFUlZKZlJrbEZURVJmUTA5TlVFeEZWRVVBUkVWTVJWUkZBRWhRUlY5SlRsWkJURWxFWDBWUFJsOVRWRUZVUlFCSlRsWkJURWxFWDFOVFRGOURSVkpVU1VaSlEwRlVSUUJRUVZWVFJRQk9UMTlTUlZOUVQwNVRSUUJWVGxOVlVGQlBVbFJGUkY5TlJVUkpRVjlVV1ZCRkFFZFBUa1VBVGs5VVgwRkRRMFZRVkVGQ1RFVUFVMFZTVmtsRFJWOVZUa0ZXUVVsTVFVSk1SUUJTUVU1SFJWOU9UMVJmVTBGVVNWTkdTVUZDVEVVQVQxSkpSMGxPWDBsVFgxVk9Va1ZCUTBoQlFreEZBRkpGVTFCUFRsTkZYMGxUWDFOVVFVeEZBRkJWVWtkRkFFMUZVa2RGQUZKRlVWVkZVMVJmU0VWQlJFVlNYMFpKUlV4RVUxOVVUMDlmVEVGU1IwVUFVa1ZSVlVWVFZGOUlSVUZFUlZKZlZFOVBYMHhCVWtkRkFGQkJXVXhQUVVSZlZFOVBYMHhCVWtkRkFFbE9VMVZHUmtsRFNVVk9WRjlUVkU5U1FVZEZBRWhRUlY5UVFWVlRSVVJmVlZCSFVrRkVSUUJJVUVWZlVFRlZVMFZFWDBneVgxVlFSMUpCUkVVQVUwOVZVa05GQUVGT1RrOVZUa05GQUZSU1FVTkZBRWhRUlY5VlRrVllVRVZEVkVWRVgxTlFRVU5GQUVSRlUwTlNTVUpGQUZWT1UxVkNVME5TU1VKRkFGSkZRMDlTUkFCSVVFVmZTVTVXUVV4SlJGOU5SVlJJVDBRQVRrOVVYMFpQVlU1RUFGQlNUMUJHU1U1RUFGVk9Ra2xPUkFCU1JVSkpUa1FBVlU1QlZWUklUMUpKV2tWRUFFMUZWRWhQUkY5T1QxUmZRVXhNVDFkRlJBQklWRlJRWDFaRlVsTkpUMDVmVGs5VVgxTlZVRkJQVWxSRlJBQkJURkpGUVVSWlgxSkZVRTlTVkVWRUFFRkRRMFZRVkVWRUFFNVBWRjlKVFZCTVJVMUZUbFJGUkFCTVQwOVFYMFJGVkVWRFZFVkVBRWhRUlY5RFVsOUZXRkJGUTFSRlJBQklVRVZmVEVaZlJWaFFSVU5VUlVRQVExSkZRVlJGUkFCSlRWOVZVMFZFQUVoUVJWOVFRVlZUUlVRQVZFbE5SVTlWVkY5UFEwTlZVa1ZFQUZCQldVMUZUbFJmVWtWUlZVbFNSVVFBVUZKRlEwOU9SRWxVU1U5T1gxSkZVVlZKVWtWRUFGQlNUMWhaWDBGVlZFaEZUbFJKUTBGVVNVOU9YMUpGVVZWSlVrVkVBRTVGVkZkUFVrdGZRVlZVU0VWT1ZFbERRVlJKVDA1ZlVrVlJWVWxTUlVRQVRFVk9SMVJJWDFKRlVWVkpVa1ZFQUZOVFRGOURSVkpVU1VaSlEwRlVSVjlTUlZGVlNWSkZSQUJWVUVkU1FVUkZYMUpGVVZWSlVrVkVBRkJCUjBWZlJWaFFTVkpGUkFCUVVrVkRUMDVFU1ZSSlQwNWZSa0ZKVEVWRUFFVllVRVZEVkVGVVNVOU9YMFpCU1V4RlJBQlNSVlpCVEVsRVFWUkpUMDVmUmtGSlRFVkVBRk5UVEY5SVFVNUVVMGhCUzBWZlJrRkpURVZFQUV4UFEwdEZSQUJVVWtGT1UwWlBVazFCVkVsUFRsOUJVRkJNU1VWRUFFNVBWRjlOVDBSSlJrbEZSQUJPVDFSZlJWaFVSVTVFUlVRQVFrRk9SRmRKUkZSSVgweEpUVWxVWDBWWVEwVkZSRVZFQUZOSlZFVmZTVk5mVDFaRlVreFBRVVJGUkFCSVJVRkVBRVY0Y0dWamRHVmtJRWhVVkZBdkFBQmVFd0FBSmhNQUFEQVFBQUR3RndBQW5STUFBQlVTQUFBNUZ3QUE4QklBQUFvUUFBQjFFZ0FBclJJQUFJSVRBQUJQRkFBQWZ4QUFBS0FWQUFBakZBQUFpUklBQUlzVUFBQk5GUUFBMUJFQUFNOFVBQUFRR0FBQXlSWUFBTndXQUFEQkVRQUE0QmNBQUxzVUFBQjBGQUFBZkJVQUFPVVVBQUFJRndBQUh4QUFBR1VWQUFDakZBQUFLQlVBQUFJVkFBQ1pGUUFBTEJBQUFJc1pBQUJQRHdBQTFBNEFBR29RQUFET0VBQUFBaGNBQUlrT0FBQnVFd0FBSEJNQUFHWVVBQUJXRndBQXdSTUFBTTBUQUFCc0V3QUFhQmNBQUdZWEFBQmZGd0FBSWhNQUFNNFBBQUJwRGdBQTJBNEFBR01XQUFETEV3QUFxZzRBQUNnWEFBQW1Gd0FBeFJNQUFGMFdBQURvRVFBQVp4TUFBR1VUQUFEeUZnQUFjeE1BQUIwWEFBRDVGZ0FBOHhFQUFNOE9BQURPRlFBQURCSUFBTE1SQUFDbEVRQUFZUkFBQURJWEFBQzdFd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUJBZ0VCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdNQ0FnSUNBZ0FBQWdJQUFnSUFBZ0lDQWdJQ0FnSUNBZ0FFQUFBQUFBQUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQUFBQUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUFJQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUFBZ0lDQWdJQUFBSUNBQUlDQUFJQ0FnSUNBZ0lDQWdJQUF3QUVBQUFBQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBQUFBQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQUNBQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCc2IzTmxaV1Z3TFdGc2FYWmxBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFFQkFRRUJBUUVCQVFFQkFnRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUZqYUhWdWEyVmtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFRQUJBUUVCQVFBQUFRRUFBUUVBQVFFQkFRRUJBUUVCQVFBQUFBQUFBQUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFBQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdWamRHbHZibVZ1ZEMxc1pXNW5kR2h2Ym5KdmVIa3RZMjl1Ym1WamRHbHZiZ0FBQUFBQUFBQUFBQUFBQUFBQUFISmhibk5tWlhJdFpXNWpiMlJwYm1kd1ozSmhaR1VOQ2cwS0RRcFRUUTBLRFFwVVZGQXZRMFV2VkZOUUx3QUFBQUFBQUFBQUFBQUFBQUVDQUFFREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQUFBQkFnQUJBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFCQVFVQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUFBQUFBQUFBQUFBUUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRRUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQUFBQUFBQUFBQUFBQkFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd1FBQUFRRUJBUUVCQVFFQkFRRUJRUUVCQVFFQkFRRUJBUUVCQUFFQUFZSEJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBUUFCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdBQUFBQUFBQU1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBQUFBQUFBQUF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdBQUFBQUFBQU1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFNVBWVTVEUlVWRFMwOVZWRTVGUTFSRlZFVkRVa2xDUlV4VlUwaEZWRVZCUkZORlFWSkRTRkpIUlVOVVNWWkpWRmxNUlU1RVFWSldSVTlVU1VaWlVGUkpUMDVUUTBoVFJVRlpVMVJCVkVOSVIwVlBVa1JKVWtWRFZFOVNWRkpEU0ZCQlVrRk5SVlJGVWxWU1EwVkNVME5TU1VKRlFWSkVUMWRPUVVORlNVNUVUa3REUzFWQ1UwTlNTVUpGU0ZSVVVDOUJSRlJRTHc9PSdcbiIsCiAgICAiLy8gQHRzLWNoZWNrXG5cbid1c2Ugc3RyaWN0J1xuXG4vKiBnbG9iYWwgV2ViQXNzZW1ibHkgKi9cblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IG5ldCA9IHJlcXVpcmUoJ25ldCcpXG5jb25zdCBodHRwID0gcmVxdWlyZSgnaHR0cCcpXG5jb25zdCB7IHBpcGVsaW5lIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IHRpbWVycyA9IHJlcXVpcmUoJy4vdGltZXJzJylcbmNvbnN0IFJlcXVlc3QgPSByZXF1aXJlKCcuL2NvcmUvcmVxdWVzdCcpXG5jb25zdCBEaXNwYXRjaGVyQmFzZSA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlci1iYXNlJylcbmNvbnN0IHtcbiAgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yLFxuICBSZXNwb25zZUNvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yLFxuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvcixcbiAgSGVhZGVyc1RpbWVvdXRFcnJvcixcbiAgSGVhZGVyc092ZXJmbG93RXJyb3IsXG4gIFNvY2tldEVycm9yLFxuICBJbmZvcm1hdGlvbmFsRXJyb3IsXG4gIEJvZHlUaW1lb3V0RXJyb3IsXG4gIEhUVFBQYXJzZXJFcnJvcixcbiAgUmVzcG9uc2VFeGNlZWRlZE1heFNpemVFcnJvcixcbiAgQ2xpZW50RGVzdHJveWVkRXJyb3Jcbn0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IGJ1aWxkQ29ubmVjdG9yID0gcmVxdWlyZSgnLi9jb3JlL2Nvbm5lY3QnKVxuY29uc3Qge1xuICBrVXJsLFxuICBrUmVzZXQsXG4gIGtTZXJ2ZXJOYW1lLFxuICBrQ2xpZW50LFxuICBrQnVzeSxcbiAga1BhcnNlcixcbiAga0Nvbm5lY3QsXG4gIGtCbG9ja2luZyxcbiAga1Jlc3VtaW5nLFxuICBrUnVubmluZyxcbiAga1BlbmRpbmcsXG4gIGtTaXplLFxuICBrV3JpdGluZyxcbiAga1F1ZXVlLFxuICBrQ29ubmVjdGVkLFxuICBrQ29ubmVjdGluZyxcbiAga05lZWREcmFpbixcbiAga05vUmVmLFxuICBrS2VlcEFsaXZlRGVmYXVsdFRpbWVvdXQsXG4gIGtIb3N0SGVhZGVyLFxuICBrUGVuZGluZ0lkeCxcbiAga1J1bm5pbmdJZHgsXG4gIGtFcnJvcixcbiAga1BpcGVsaW5pbmcsXG4gIGtTb2NrZXQsXG4gIGtLZWVwQWxpdmVUaW1lb3V0VmFsdWUsXG4gIGtNYXhIZWFkZXJzU2l6ZSxcbiAga0tlZXBBbGl2ZU1heFRpbWVvdXQsXG4gIGtLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkLFxuICBrSGVhZGVyc1RpbWVvdXQsXG4gIGtCb2R5VGltZW91dCxcbiAga1N0cmljdENvbnRlbnRMZW5ndGgsXG4gIGtDb25uZWN0b3IsXG4gIGtNYXhSZWRpcmVjdGlvbnMsXG4gIGtNYXhSZXF1ZXN0cyxcbiAga0NvdW50ZXIsXG4gIGtDbG9zZSxcbiAga0Rlc3Ryb3ksXG4gIGtEaXNwYXRjaCxcbiAga0ludGVyY2VwdG9ycyxcbiAga0xvY2FsQWRkcmVzcyxcbiAga01heFJlc3BvbnNlU2l6ZSxcbiAga0hUVFBDb25uVmVyc2lvbixcbiAgLy8gSFRUUDJcbiAga0hvc3QsXG4gIGtIVFRQMlNlc3Npb24sXG4gIGtIVFRQMlNlc3Npb25TdGF0ZSxcbiAga0hUVFAyQnVpbGRSZXF1ZXN0LFxuICBrSFRUUDJDb3B5SGVhZGVycyxcbiAga0hUVFAxQnVpbGRSZXF1ZXN0XG59ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuXG4vKiogQHR5cGUge2ltcG9ydCgnaHR0cDInKX0gKi9cbmxldCBodHRwMlxudHJ5IHtcbiAgaHR0cDIgPSByZXF1aXJlKCdodHRwMicpXG59IGNhdGNoIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBodHRwMiA9IHsgY29uc3RhbnRzOiB7fSB9XG59XG5cbmNvbnN0IHtcbiAgY29uc3RhbnRzOiB7XG4gICAgSFRUUDJfSEVBREVSX0FVVEhPUklUWSxcbiAgICBIVFRQMl9IRUFERVJfTUVUSE9ELFxuICAgIEhUVFAyX0hFQURFUl9QQVRILFxuICAgIEhUVFAyX0hFQURFUl9TQ0hFTUUsXG4gICAgSFRUUDJfSEVBREVSX0NPTlRFTlRfTEVOR1RILFxuICAgIEhUVFAyX0hFQURFUl9FWFBFQ1QsXG4gICAgSFRUUDJfSEVBREVSX1NUQVRVU1xuICB9XG59ID0gaHR0cDJcblxuLy8gRXhwZXJpbWVudGFsXG5sZXQgaDJFeHBlcmltZW50YWxXYXJuZWQgPSBmYWxzZVxuXG5jb25zdCBGYXN0QnVmZmVyID0gQnVmZmVyW1N5bWJvbC5zcGVjaWVzXVxuXG5jb25zdCBrQ2xvc2VkUmVzb2x2ZSA9IFN5bWJvbCgna0Nsb3NlZFJlc29sdmUnKVxuXG5jb25zdCBjaGFubmVscyA9IHt9XG5cbnRyeSB7XG4gIGNvbnN0IGRpYWdub3N0aWNzQ2hhbm5lbCA9IHJlcXVpcmUoJ2RpYWdub3N0aWNzX2NoYW5uZWwnKVxuICBjaGFubmVscy5zZW5kSGVhZGVycyA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OnNlbmRIZWFkZXJzJylcbiAgY2hhbm5lbHMuYmVmb3JlQ29ubmVjdCA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OmJlZm9yZUNvbm5lY3QnKVxuICBjaGFubmVscy5jb25uZWN0RXJyb3IgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOmNsaWVudDpjb25uZWN0RXJyb3InKVxuICBjaGFubmVscy5jb25uZWN0ZWQgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOmNsaWVudDpjb25uZWN0ZWQnKVxufSBjYXRjaCB7XG4gIGNoYW5uZWxzLnNlbmRIZWFkZXJzID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5iZWZvcmVDb25uZWN0ID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5jb25uZWN0RXJyb3IgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG4gIGNoYW5uZWxzLmNvbm5lY3RlZCA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7aW1wb3J0KCcuLi90eXBlcy9jbGllbnQnKS5kZWZhdWx0fVxuICovXG5jbGFzcyBDbGllbnQgZXh0ZW5kcyBEaXNwYXRjaGVyQmFzZSB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xVUkx9IHVybFxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vdHlwZXMvY2xpZW50JykuQ2xpZW50Lk9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yICh1cmwsIHtcbiAgICBpbnRlcmNlcHRvcnMsXG4gICAgbWF4SGVhZGVyU2l6ZSxcbiAgICBoZWFkZXJzVGltZW91dCxcbiAgICBzb2NrZXRUaW1lb3V0LFxuICAgIHJlcXVlc3RUaW1lb3V0LFxuICAgIGNvbm5lY3RUaW1lb3V0LFxuICAgIGJvZHlUaW1lb3V0LFxuICAgIGlkbGVUaW1lb3V0LFxuICAgIGtlZXBBbGl2ZSxcbiAgICBrZWVwQWxpdmVUaW1lb3V0LFxuICAgIG1heEtlZXBBbGl2ZVRpbWVvdXQsXG4gICAga2VlcEFsaXZlTWF4VGltZW91dCxcbiAgICBrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkLFxuICAgIHNvY2tldFBhdGgsXG4gICAgcGlwZWxpbmluZyxcbiAgICB0bHMsXG4gICAgc3RyaWN0Q29udGVudExlbmd0aCxcbiAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICBtYXhSZWRpcmVjdGlvbnMsXG4gICAgY29ubmVjdCxcbiAgICBtYXhSZXF1ZXN0c1BlckNsaWVudCxcbiAgICBsb2NhbEFkZHJlc3MsXG4gICAgbWF4UmVzcG9uc2VTaXplLFxuICAgIGF1dG9TZWxlY3RGYW1pbHksXG4gICAgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0LFxuICAgIC8vIGgyXG4gICAgYWxsb3dIMixcbiAgICBtYXhDb25jdXJyZW50U3RyZWFtc1xuICB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICBpZiAoa2VlcEFsaXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQga2VlcEFsaXZlLCB1c2UgcGlwZWxpbmluZz0wIGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChzb2NrZXRUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQgc29ja2V0VGltZW91dCwgdXNlIGhlYWRlcnNUaW1lb3V0ICYgYm9keVRpbWVvdXQgaW5zdGVhZCcpXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQgcmVxdWVzdFRpbWVvdXQsIHVzZSBoZWFkZXJzVGltZW91dCAmIGJvZHlUaW1lb3V0IGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChpZGxlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIGlkbGVUaW1lb3V0LCB1c2Uga2VlcEFsaXZlVGltZW91dCBpbnN0ZWFkJylcbiAgICB9XG5cbiAgICBpZiAobWF4S2VlcEFsaXZlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIG1heEtlZXBBbGl2ZVRpbWVvdXQsIHVzZSBrZWVwQWxpdmVNYXhUaW1lb3V0IGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChtYXhIZWFkZXJTaXplICE9IG51bGwgJiYgIU51bWJlci5pc0Zpbml0ZShtYXhIZWFkZXJTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG1heEhlYWRlclNpemUnKVxuICAgIH1cblxuICAgIGlmIChzb2NrZXRQYXRoICE9IG51bGwgJiYgdHlwZW9mIHNvY2tldFBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgc29ja2V0UGF0aCcpXG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3RUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoY29ubmVjdFRpbWVvdXQpIHx8IGNvbm5lY3RUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjb25uZWN0VGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGtlZXBBbGl2ZVRpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShrZWVwQWxpdmVUaW1lb3V0KSB8fCBrZWVwQWxpdmVUaW1lb3V0IDw9IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQga2VlcEFsaXZlVGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGtlZXBBbGl2ZU1heFRpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShrZWVwQWxpdmVNYXhUaW1lb3V0KSB8fCBrZWVwQWxpdmVNYXhUaW1lb3V0IDw9IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQga2VlcEFsaXZlTWF4VGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQgIT0gbnVsbCAmJiAhTnVtYmVyLmlzRmluaXRlKGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQga2VlcEFsaXZlVGltZW91dFRocmVzaG9sZCcpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlcnNUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGhlYWRlcnNUaW1lb3V0KSB8fCBoZWFkZXJzVGltZW91dCA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnNUaW1lb3V0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIHplcm8nKVxuICAgIH1cblxuICAgIGlmIChib2R5VGltZW91dCAhPSBudWxsICYmICghTnVtYmVyLmlzSW50ZWdlcihib2R5VGltZW91dCkgfHwgYm9keVRpbWVvdXQgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdib2R5VGltZW91dCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciB6ZXJvJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAhPSBudWxsICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdjb25uZWN0IG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIGlmIChtYXhSZWRpcmVjdGlvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVkaXJlY3Rpb25zKSB8fCBtYXhSZWRpcmVjdGlvbnMgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhSZWRpcmVjdGlvbnMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gICAgfVxuXG4gICAgaWYgKG1heFJlcXVlc3RzUGVyQ2xpZW50ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlcXVlc3RzUGVyQ2xpZW50KSB8fCBtYXhSZXF1ZXN0c1BlckNsaWVudCA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heFJlcXVlc3RzUGVyQ2xpZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIGlmIChsb2NhbEFkZHJlc3MgIT0gbnVsbCAmJiAodHlwZW9mIGxvY2FsQWRkcmVzcyAhPT0gJ3N0cmluZycgfHwgbmV0LmlzSVAobG9jYWxBZGRyZXNzKSA9PT0gMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbG9jYWxBZGRyZXNzIG11c3QgYmUgdmFsaWQgc3RyaW5nIElQIGFkZHJlc3MnKVxuICAgIH1cblxuICAgIGlmIChtYXhSZXNwb25zZVNpemUgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVzcG9uc2VTaXplKSB8fCBtYXhSZXNwb25zZVNpemUgPCAtMSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4UmVzcG9uc2VTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCAhPSBudWxsICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIoYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0KSB8fCBhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQgPCAtMSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIC8vIGgyXG4gICAgaWYgKGFsbG93SDIgIT0gbnVsbCAmJiB0eXBlb2YgYWxsb3dIMiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2FsbG93SDIgbXVzdCBiZSBhIHZhbGlkIGJvb2xlYW4gdmFsdWUnKVxuICAgIH1cblxuICAgIGlmIChtYXhDb25jdXJyZW50U3RyZWFtcyAhPSBudWxsICYmICh0eXBlb2YgbWF4Q29uY3VycmVudFN0cmVhbXMgIT09ICdudW1iZXInIHx8IG1heENvbmN1cnJlbnRTdHJlYW1zIDwgMSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4Q29uY3VycmVudFN0cmVhbXMgbXVzdCBiZSBhIHBvc3NpdGl2ZSBpbnRlZ2VyLCBncmVhdGVyIHRoYW4gMCcpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25uZWN0ID0gYnVpbGRDb25uZWN0b3Ioe1xuICAgICAgICAuLi50bHMsXG4gICAgICAgIG1heENhY2hlZFNlc3Npb25zLFxuICAgICAgICBhbGxvd0gyLFxuICAgICAgICBzb2NrZXRQYXRoLFxuICAgICAgICB0aW1lb3V0OiBjb25uZWN0VGltZW91dCxcbiAgICAgICAgLi4uKHV0aWwubm9kZUhhc0F1dG9TZWxlY3RGYW1pbHkgJiYgYXV0b1NlbGVjdEZhbWlseSA/IHsgYXV0b1NlbGVjdEZhbWlseSwgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0IH0gOiB1bmRlZmluZWQpLFxuICAgICAgICAuLi5jb25uZWN0XG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXNba0ludGVyY2VwdG9yc10gPSBpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLkNsaWVudCAmJiBBcnJheS5pc0FycmF5KGludGVyY2VwdG9ycy5DbGllbnQpXG4gICAgICA/IGludGVyY2VwdG9ycy5DbGllbnRcbiAgICAgIDogW2NyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IoeyBtYXhSZWRpcmVjdGlvbnMgfSldXG4gICAgdGhpc1trVXJsXSA9IHV0aWwucGFyc2VPcmlnaW4odXJsKVxuICAgIHRoaXNba0Nvbm5lY3Rvcl0gPSBjb25uZWN0XG4gICAgdGhpc1trU29ja2V0XSA9IG51bGxcbiAgICB0aGlzW2tQaXBlbGluaW5nXSA9IHBpcGVsaW5pbmcgIT0gbnVsbCA/IHBpcGVsaW5pbmcgOiAxXG4gICAgdGhpc1trTWF4SGVhZGVyc1NpemVdID0gbWF4SGVhZGVyU2l6ZSB8fCBodHRwLm1heEhlYWRlclNpemVcbiAgICB0aGlzW2tLZWVwQWxpdmVEZWZhdWx0VGltZW91dF0gPSBrZWVwQWxpdmVUaW1lb3V0ID09IG51bGwgPyA0ZTMgOiBrZWVwQWxpdmVUaW1lb3V0XG4gICAgdGhpc1trS2VlcEFsaXZlTWF4VGltZW91dF0gPSBrZWVwQWxpdmVNYXhUaW1lb3V0ID09IG51bGwgPyA2MDBlMyA6IGtlZXBBbGl2ZU1heFRpbWVvdXRcbiAgICB0aGlzW2tLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkXSA9IGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQgPT0gbnVsbCA/IDFlMyA6IGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGRcbiAgICB0aGlzW2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdID0gdGhpc1trS2VlcEFsaXZlRGVmYXVsdFRpbWVvdXRdXG4gICAgdGhpc1trU2VydmVyTmFtZV0gPSBudWxsXG4gICAgdGhpc1trTG9jYWxBZGRyZXNzXSA9IGxvY2FsQWRkcmVzcyAhPSBudWxsID8gbG9jYWxBZGRyZXNzIDogbnVsbFxuICAgIHRoaXNba1Jlc3VtaW5nXSA9IDAgLy8gMCwgaWRsZSwgMSwgc2NoZWR1bGVkLCAyIHJlc3VtaW5nXG4gICAgdGhpc1trTmVlZERyYWluXSA9IDAgLy8gMCwgaWRsZSwgMSwgc2NoZWR1bGVkLCAyIHJlc3VtaW5nXG4gICAgdGhpc1trSG9zdEhlYWRlcl0gPSBgaG9zdDogJHt0aGlzW2tVcmxdLmhvc3RuYW1lfSR7dGhpc1trVXJsXS5wb3J0ID8gYDoke3RoaXNba1VybF0ucG9ydH1gIDogJyd9XFxyXFxuYFxuICAgIHRoaXNba0JvZHlUaW1lb3V0XSA9IGJvZHlUaW1lb3V0ICE9IG51bGwgPyBib2R5VGltZW91dCA6IDMwMGUzXG4gICAgdGhpc1trSGVhZGVyc1RpbWVvdXRdID0gaGVhZGVyc1RpbWVvdXQgIT0gbnVsbCA/IGhlYWRlcnNUaW1lb3V0IDogMzAwZTNcbiAgICB0aGlzW2tTdHJpY3RDb250ZW50TGVuZ3RoXSA9IHN0cmljdENvbnRlbnRMZW5ndGggPT0gbnVsbCA/IHRydWUgOiBzdHJpY3RDb250ZW50TGVuZ3RoXG4gICAgdGhpc1trTWF4UmVkaXJlY3Rpb25zXSA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXNba01heFJlcXVlc3RzXSA9IG1heFJlcXVlc3RzUGVyQ2xpZW50XG4gICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0gPSBudWxsXG4gICAgdGhpc1trTWF4UmVzcG9uc2VTaXplXSA9IG1heFJlc3BvbnNlU2l6ZSA+IC0xID8gbWF4UmVzcG9uc2VTaXplIDogLTFcbiAgICB0aGlzW2tIVFRQQ29ublZlcnNpb25dID0gJ2gxJ1xuXG4gICAgLy8gSFRUUC8yXG4gICAgdGhpc1trSFRUUDJTZXNzaW9uXSA9IG51bGxcbiAgICB0aGlzW2tIVFRQMlNlc3Npb25TdGF0ZV0gPSAhYWxsb3dIMlxuICAgICAgPyBudWxsXG4gICAgICA6IHtcbiAgICAgICAgLy8gc3RyZWFtczogbnVsbCwgLy8gRml4ZWQgcXVldWUgb2Ygc3RyZWFtcyAtIEZvciBmdXR1cmUgc3VwcG9ydCBvZiBgcHVzaGBcbiAgICAgICAgICBvcGVuU3RyZWFtczogMCwgLy8gS2VlcCB0cmFjayBvZiB0aGVtIHRvIGRlY2lkZSB3ZXRoZXIgb3Igbm90IHVucmVmIHRoZSBzZXNzaW9uXG4gICAgICAgICAgbWF4Q29uY3VycmVudFN0cmVhbXM6IG1heENvbmN1cnJlbnRTdHJlYW1zICE9IG51bGwgPyBtYXhDb25jdXJyZW50U3RyZWFtcyA6IDEwMCAvLyBNYXggcGVlckNvbmN1cnJlbnRTdHJlYW1zIGZvciBhIE5vZGUgaDIgc2VydmVyXG4gICAgICAgIH1cbiAgICB0aGlzW2tIb3N0XSA9IGAke3RoaXNba1VybF0uaG9zdG5hbWV9JHt0aGlzW2tVcmxdLnBvcnQgPyBgOiR7dGhpc1trVXJsXS5wb3J0fWAgOiAnJ31gXG5cbiAgICAvLyBrUXVldWUgaXMgYnVpbHQgdXAgb2YgMyBzZWN0aW9ucyBzZXBhcmF0ZWQgYnlcbiAgICAvLyB0aGUga1J1bm5pbmdJZHggYW5kIGtQZW5kaW5nSWR4IGluZGljZXMuXG4gICAgLy8gfCAgIGNvbXBsZXRlICAgfCAgIHJ1bm5pbmcgICB8ICAgcGVuZGluZyAgIHxcbiAgICAvLyAgICAgICAgICAgICAgICBeIGtSdW5uaW5nSWR4IF4ga1BlbmRpbmdJZHggXiBrUXVldWUubGVuZ3RoXG4gICAgLy8ga1J1bm5pbmdJZHggcG9pbnRzIHRvIHRoZSBmaXJzdCBydW5uaW5nIGVsZW1lbnQuXG4gICAgLy8ga1BlbmRpbmdJZHggcG9pbnRzIHRvIHRoZSBmaXJzdCBwZW5kaW5nIGVsZW1lbnQuXG4gICAgLy8gVGhpcyBpbXBsZW1lbnRzIGEgZmFzdCBxdWV1ZSB3aXRoIGFuIGFtb3J0aXplZFxuICAgIC8vIHRpbWUgb2YgTygxKS5cblxuICAgIHRoaXNba1F1ZXVlXSA9IFtdXG4gICAgdGhpc1trUnVubmluZ0lkeF0gPSAwXG4gICAgdGhpc1trUGVuZGluZ0lkeF0gPSAwXG4gIH1cblxuICBnZXQgcGlwZWxpbmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1BpcGVsaW5pbmddXG4gIH1cblxuICBzZXQgcGlwZWxpbmluZyAodmFsdWUpIHtcbiAgICB0aGlzW2tQaXBlbGluaW5nXSA9IHZhbHVlXG4gICAgcmVzdW1lKHRoaXMsIHRydWUpXG4gIH1cblxuICBnZXQgW2tQZW5kaW5nXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1F1ZXVlXS5sZW5ndGggLSB0aGlzW2tQZW5kaW5nSWR4XVxuICB9XG5cbiAgZ2V0IFtrUnVubmluZ10gKCkge1xuICAgIHJldHVybiB0aGlzW2tQZW5kaW5nSWR4XSAtIHRoaXNba1J1bm5pbmdJZHhdXG4gIH1cblxuICBnZXQgW2tTaXplXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1F1ZXVlXS5sZW5ndGggLSB0aGlzW2tSdW5uaW5nSWR4XVxuICB9XG5cbiAgZ2V0IFtrQ29ubmVjdGVkXSAoKSB7XG4gICAgcmV0dXJuICEhdGhpc1trU29ja2V0XSAmJiAhdGhpc1trQ29ubmVjdGluZ10gJiYgIXRoaXNba1NvY2tldF0uZGVzdHJveWVkXG4gIH1cblxuICBnZXQgW2tCdXN5XSAoKSB7XG4gICAgY29uc3Qgc29ja2V0ID0gdGhpc1trU29ja2V0XVxuICAgIHJldHVybiAoXG4gICAgICAoc29ja2V0ICYmIChzb2NrZXRba1Jlc2V0XSB8fCBzb2NrZXRba1dyaXRpbmddIHx8IHNvY2tldFtrQmxvY2tpbmddKSkgfHxcbiAgICAgICh0aGlzW2tTaXplXSA+PSAodGhpc1trUGlwZWxpbmluZ10gfHwgMSkpIHx8XG4gICAgICB0aGlzW2tQZW5kaW5nXSA+IDBcbiAgICApXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmU6IG9ubHkgdXNlZCBmb3IgdGVzdCAqL1xuICBba0Nvbm5lY3RdIChjYikge1xuICAgIGNvbm5lY3QodGhpcylcbiAgICB0aGlzLm9uY2UoJ2Nvbm5lY3QnLCBjYilcbiAgfVxuXG4gIFtrRGlzcGF0Y2hdIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgY29uc3Qgb3JpZ2luID0gb3B0cy5vcmlnaW4gfHwgdGhpc1trVXJsXS5vcmlnaW5cblxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzW2tIVFRQQ29ublZlcnNpb25dID09PSAnaDInXG4gICAgICA/IFJlcXVlc3Rba0hUVFAyQnVpbGRSZXF1ZXN0XShvcmlnaW4sIG9wdHMsIGhhbmRsZXIpXG4gICAgICA6IFJlcXVlc3Rba0hUVFAxQnVpbGRSZXF1ZXN0XShvcmlnaW4sIG9wdHMsIGhhbmRsZXIpXG5cbiAgICB0aGlzW2tRdWV1ZV0ucHVzaChyZXF1ZXN0KVxuICAgIGlmICh0aGlzW2tSZXN1bWluZ10pIHtcbiAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgfSBlbHNlIGlmICh1dGlsLmJvZHlMZW5ndGgocmVxdWVzdC5ib2R5KSA9PSBudWxsICYmIHV0aWwuaXNJdGVyYWJsZShyZXF1ZXN0LmJvZHkpKSB7XG4gICAgICAvLyBXYWl0IGEgdGljayBpbiBjYXNlIHN0cmVhbS9pdGVyYXRvciBpcyBlbmRlZCBpbiB0aGUgc2FtZSB0aWNrLlxuICAgICAgdGhpc1trUmVzdW1pbmddID0gMVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhyZXN1bWUsIHRoaXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VtZSh0aGlzLCB0cnVlKVxuICAgIH1cblxuICAgIGlmICh0aGlzW2tSZXN1bWluZ10gJiYgdGhpc1trTmVlZERyYWluXSAhPT0gMiAmJiB0aGlzW2tCdXN5XSkge1xuICAgICAgdGhpc1trTmVlZERyYWluXSA9IDJcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1trTmVlZERyYWluXSA8IDJcbiAgfVxuXG4gIGFzeW5jIFtrQ2xvc2VdICgpIHtcbiAgICAvLyBUT0RPOiBmb3IgSDIgd2UgbmVlZCB0byBncmFjZWZ1bGx5IGZsdXNoIHRoZSByZW1haW5pbmcgZW5xdWV1ZWRcbiAgICAvLyByZXF1ZXN0IGFuZCBjbG9zZSBlYWNoIHN0cmVhbS5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICghdGhpc1trU2l6ZV0pIHtcbiAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0gPSByZXNvbHZlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIFtrRGVzdHJveV0gKGVycikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdHMgPSB0aGlzW2tRdWV1ZV0uc3BsaWNlKHRoaXNba1BlbmRpbmdJZHhdKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdHNbaV1cbiAgICAgICAgZXJyb3JSZXF1ZXN0KHRoaXMsIHJlcXVlc3QsIGVycilcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzW2tDbG9zZWRSZXNvbHZlXSkge1xuICAgICAgICAgIC8vIFRPRE8gKGZpeCk6IFNob3VsZCB3ZSBlcnJvciBoZXJlIHdpdGggQ2xpZW50RGVzdHJveWVkRXJyb3I/XG4gICAgICAgICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0oKVxuICAgICAgICAgIHRoaXNba0Nsb3NlZFJlc29sdmVdID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpc1trSFRUUDJTZXNzaW9uXSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuZGVzdHJveSh0aGlzW2tIVFRQMlNlc3Npb25dLCBlcnIpXG4gICAgICAgIHRoaXNba0hUVFAyU2Vzc2lvbl0gPSBudWxsXG4gICAgICAgIHRoaXNba0hUVFAyU2Vzc2lvblN0YXRlXSA9IG51bGxcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzW2tTb2NrZXRdKSB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXRpbC5kZXN0cm95KHRoaXNba1NvY2tldF0ub24oJ2Nsb3NlJywgY2FsbGJhY2spLCBlcnIpXG4gICAgICB9XG5cbiAgICAgIHJlc3VtZSh0aGlzKVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gb25IdHRwMlNlc3Npb25FcnJvciAoZXJyKSB7XG4gIGFzc2VydChlcnIuY29kZSAhPT0gJ0VSUl9UTFNfQ0VSVF9BTFROQU1FX0lOVkFMSUQnKVxuXG4gIHRoaXNba1NvY2tldF1ba0Vycm9yXSA9IGVyclxuXG4gIG9uRXJyb3IodGhpc1trQ2xpZW50XSwgZXJyKVxufVxuXG5mdW5jdGlvbiBvbkh0dHAyRnJhbWVFcnJvciAodHlwZSwgY29kZSwgaWQpIHtcbiAgY29uc3QgZXJyID0gbmV3IEluZm9ybWF0aW9uYWxFcnJvcihgSFRUUC8yOiBcImZyYW1lRXJyb3JcIiByZWNlaXZlZCAtIHR5cGUgJHt0eXBlfSwgY29kZSAke2NvZGV9YClcblxuICBpZiAoaWQgPT09IDApIHtcbiAgICB0aGlzW2tTb2NrZXRdW2tFcnJvcl0gPSBlcnJcbiAgICBvbkVycm9yKHRoaXNba0NsaWVudF0sIGVycilcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkh0dHAyU2Vzc2lvbkVuZCAoKSB7XG4gIHV0aWwuZGVzdHJveSh0aGlzLCBuZXcgU29ja2V0RXJyb3IoJ290aGVyIHNpZGUgY2xvc2VkJykpXG4gIHV0aWwuZGVzdHJveSh0aGlzW2tTb2NrZXRdLCBuZXcgU29ja2V0RXJyb3IoJ290aGVyIHNpZGUgY2xvc2VkJykpXG59XG5cbmZ1bmN0aW9uIG9uSFRUUDJHb0F3YXkgKGNvZGUpIHtcbiAgY29uc3QgY2xpZW50ID0gdGhpc1trQ2xpZW50XVxuICBjb25zdCBlcnIgPSBuZXcgSW5mb3JtYXRpb25hbEVycm9yKGBIVFRQLzI6IFwiR09BV0FZXCIgZnJhbWUgcmVjZWl2ZWQgd2l0aCBjb2RlICR7Y29kZX1gKVxuICBjbGllbnRba1NvY2tldF0gPSBudWxsXG4gIGNsaWVudFtrSFRUUDJTZXNzaW9uXSA9IG51bGxcblxuICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgIGFzc2VydCh0aGlzW2tQZW5kaW5nXSA9PT0gMClcblxuICAgIC8vIEZhaWwgZW50aXJlIHF1ZXVlLlxuICAgIGNvbnN0IHJlcXVlc3RzID0gY2xpZW50W2tRdWV1ZV0uc3BsaWNlKGNsaWVudFtrUnVubmluZ0lkeF0pXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RzW2ldXG4gICAgICBlcnJvclJlcXVlc3QodGhpcywgcmVxdWVzdCwgZXJyKVxuICAgIH1cbiAgfSBlbHNlIGlmIChjbGllbnRba1J1bm5pbmddID4gMCkge1xuICAgIC8vIEZhaWwgaGVhZCBvZiBwaXBlbGluZS5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdKytdID0gbnVsbFxuXG4gICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICB9XG5cbiAgY2xpZW50W2tQZW5kaW5nSWR4XSA9IGNsaWVudFtrUnVubmluZ0lkeF1cblxuICBhc3NlcnQoY2xpZW50W2tSdW5uaW5nXSA9PT0gMClcblxuICBjbGllbnQuZW1pdCgnZGlzY29ubmVjdCcsXG4gICAgY2xpZW50W2tVcmxdLFxuICAgIFtjbGllbnRdLFxuICAgIGVyclxuICApXG5cbiAgcmVzdW1lKGNsaWVudClcbn1cblxuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9sbGh0dHAvY29uc3RhbnRzJylcbmNvbnN0IGNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSByZXF1aXJlKCcuL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3InKVxuY29uc3QgRU1QVFlfQlVGID0gQnVmZmVyLmFsbG9jKDApXG5cbmFzeW5jIGZ1bmN0aW9uIGxhenlsbGh0dHAgKCkge1xuICBjb25zdCBsbGh0dHBXYXNtRGF0YSA9IHByb2Nlc3MuZW52LkpFU1RfV09SS0VSX0lEID8gcmVxdWlyZSgnLi9sbGh0dHAvbGxodHRwLXdhc20uanMnKSA6IHVuZGVmaW5lZFxuXG4gIGxldCBtb2RcbiAgdHJ5IHtcbiAgICBtb2QgPSBhd2FpdCBXZWJBc3NlbWJseS5jb21waWxlKEJ1ZmZlci5mcm9tKHJlcXVpcmUoJy4vbGxodHRwL2xsaHR0cF9zaW1kLXdhc20uanMnKSwgJ2Jhc2U2NCcpKVxuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgIC8vIFdlIGNvdWxkIGNoZWNrIGlmIHRoZSBlcnJvciB3YXMgY2F1c2VkIGJ5IHRoZSBzaW1kIG9wdGlvbiBub3RcbiAgICAvLyBiZWluZyBlbmFibGVkLCBidXQgdGhlIG9jY3VycmluZyBvZiB0aGlzIG90aGVyIGVycm9yXG4gICAgLy8gKiBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vaXNzdWVzLzExNDk1XG4gICAgLy8gZ290IG1lIHRvIHJlbW92ZSB0aGF0IGNoZWNrIHRvIGF2b2lkIGJyZWFraW5nIE5vZGUgMTIuXG4gICAgbW9kID0gYXdhaXQgV2ViQXNzZW1ibHkuY29tcGlsZShCdWZmZXIuZnJvbShsbGh0dHBXYXNtRGF0YSB8fCByZXF1aXJlKCcuL2xsaHR0cC9sbGh0dHAtd2FzbS5qcycpLCAnYmFzZTY0JykpXG4gIH1cblxuICByZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUobW9kLCB7XG4gICAgZW52OiB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cblxuICAgICAgd2FzbV9vbl91cmw6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHJldHVybiAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9zdGF0dXM6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhdCAtIGN1cnJlbnRCdWZmZXJQdHIgKyBjdXJyZW50QnVmZmVyUmVmLmJ5dGVPZmZzZXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25TdGF0dXMobmV3IEZhc3RCdWZmZXIoY3VycmVudEJ1ZmZlclJlZi5idWZmZXIsIHN0YXJ0LCBsZW4pKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9tZXNzYWdlX2JlZ2luOiAocCkgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VycmVudFBhcnNlci5wdHIsIHApXG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uTWVzc2FnZUJlZ2luKCkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25faGVhZGVyX2ZpZWxkOiAocCwgYXQsIGxlbikgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VycmVudFBhcnNlci5wdHIsIHApXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYXQgLSBjdXJyZW50QnVmZmVyUHRyICsgY3VycmVudEJ1ZmZlclJlZi5ieXRlT2Zmc2V0XG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uSGVhZGVyRmllbGQobmV3IEZhc3RCdWZmZXIoY3VycmVudEJ1ZmZlclJlZi5idWZmZXIsIHN0YXJ0LCBsZW4pKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9oZWFkZXJfdmFsdWU6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhdCAtIGN1cnJlbnRCdWZmZXJQdHIgKyBjdXJyZW50QnVmZmVyUmVmLmJ5dGVPZmZzZXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25IZWFkZXJWYWx1ZShuZXcgRmFzdEJ1ZmZlcihjdXJyZW50QnVmZmVyUmVmLmJ1ZmZlciwgc3RhcnQsIGxlbikpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX2hlYWRlcnNfY29tcGxldGU6IChwLCBzdGF0dXNDb2RlLCB1cGdyYWRlLCBzaG91bGRLZWVwQWxpdmUpID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN1cnJlbnRQYXJzZXIucHRyLCBwKVxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbkhlYWRlcnNDb21wbGV0ZShzdGF0dXNDb2RlLCBCb29sZWFuKHVwZ3JhZGUpLCBCb29sZWFuKHNob3VsZEtlZXBBbGl2ZSkpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX2JvZHk6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhdCAtIGN1cnJlbnRCdWZmZXJQdHIgKyBjdXJyZW50QnVmZmVyUmVmLmJ5dGVPZmZzZXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25Cb2R5KG5ldyBGYXN0QnVmZmVyKGN1cnJlbnRCdWZmZXJSZWYuYnVmZmVyLCBzdGFydCwgbGVuKSkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZTogKHApID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN1cnJlbnRQYXJzZXIucHRyLCBwKVxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbk1lc3NhZ2VDb21wbGV0ZSgpIHx8IDBcbiAgICAgIH1cblxuICAgICAgLyogZXNsaW50LWVuYWJsZSBjYW1lbGNhc2UgKi9cbiAgICB9XG4gIH0pXG59XG5cbmxldCBsbGh0dHBJbnN0YW5jZSA9IG51bGxcbmxldCBsbGh0dHBQcm9taXNlID0gbGF6eWxsaHR0cCgpXG5sbGh0dHBQcm9taXNlLmNhdGNoKClcblxubGV0IGN1cnJlbnRQYXJzZXIgPSBudWxsXG5sZXQgY3VycmVudEJ1ZmZlclJlZiA9IG51bGxcbmxldCBjdXJyZW50QnVmZmVyU2l6ZSA9IDBcbmxldCBjdXJyZW50QnVmZmVyUHRyID0gbnVsbFxuXG5jb25zdCBUSU1FT1VUX0hFQURFUlMgPSAxXG5jb25zdCBUSU1FT1VUX0JPRFkgPSAyXG5jb25zdCBUSU1FT1VUX0lETEUgPSAzXG5cbmNsYXNzIFBhcnNlciB7XG4gIGNvbnN0cnVjdG9yIChjbGllbnQsIHNvY2tldCwgeyBleHBvcnRzIH0pIHtcbiAgICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGNsaWVudFtrTWF4SGVhZGVyc1NpemVdKSAmJiBjbGllbnRba01heEhlYWRlcnNTaXplXSA+IDApXG5cbiAgICB0aGlzLmxsaHR0cCA9IGV4cG9ydHNcbiAgICB0aGlzLnB0ciA9IHRoaXMubGxodHRwLmxsaHR0cF9hbGxvYyhjb25zdGFudHMuVFlQRS5SRVNQT05TRSlcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy50aW1lb3V0ID0gbnVsbFxuICAgIHRoaXMudGltZW91dFZhbHVlID0gbnVsbFxuICAgIHRoaXMudGltZW91dFR5cGUgPSBudWxsXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVsbFxuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICcnXG4gICAgdGhpcy51cGdyYWRlID0gZmFsc2VcbiAgICB0aGlzLmhlYWRlcnMgPSBbXVxuICAgIHRoaXMuaGVhZGVyc1NpemUgPSAwXG4gICAgdGhpcy5oZWFkZXJzTWF4U2l6ZSA9IGNsaWVudFtrTWF4SGVhZGVyc1NpemVdXG4gICAgdGhpcy5zaG91bGRLZWVwQWxpdmUgPSBmYWxzZVxuICAgIHRoaXMucGF1c2VkID0gZmFsc2VcbiAgICB0aGlzLnJlc3VtZSA9IHRoaXMucmVzdW1lLmJpbmQodGhpcylcblxuICAgIHRoaXMuYnl0ZXNSZWFkID0gMFxuXG4gICAgdGhpcy5rZWVwQWxpdmUgPSAnJ1xuICAgIHRoaXMuY29udGVudExlbmd0aCA9ICcnXG4gICAgdGhpcy5jb25uZWN0aW9uID0gJydcbiAgICB0aGlzLm1heFJlc3BvbnNlU2l6ZSA9IGNsaWVudFtrTWF4UmVzcG9uc2VTaXplXVxuICB9XG5cbiAgc2V0VGltZW91dCAodmFsdWUsIHR5cGUpIHtcbiAgICB0aGlzLnRpbWVvdXRUeXBlID0gdHlwZVxuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy50aW1lb3V0VmFsdWUpIHtcbiAgICAgIHRpbWVycy5jbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KVxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVycy5zZXRUaW1lb3V0KG9uUGFyc2VyVGltZW91dCwgdmFsdWUsIHRoaXMpXG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICAgIGlmICh0aGlzLnRpbWVvdXQudW5yZWYpIHtcbiAgICAgICAgICB0aGlzLnRpbWVvdXQudW5yZWYoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSBudWxsXG4gICAgICB9XG4gICAgICB0aGlzLnRpbWVvdXRWYWx1ZSA9IHZhbHVlXG4gICAgfSBlbHNlIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICBpZiAodGhpcy50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0LnJlZnJlc2goKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlc3VtZSAoKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0LmRlc3Ryb3llZCB8fCAhdGhpcy5wYXVzZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG5cbiAgICB0aGlzLmxsaHR0cC5sbGh0dHBfcmVzdW1lKHRoaXMucHRyKVxuXG4gICAgYXNzZXJ0KHRoaXMudGltZW91dFR5cGUgPT09IFRJTUVPVVRfQk9EWSlcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHRoaXMudGltZW91dC5yZWZyZXNoKSB7XG4gICAgICAgIHRoaXMudGltZW91dC5yZWZyZXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlXG4gICAgdGhpcy5leGVjdXRlKHRoaXMuc29ja2V0LnJlYWQoKSB8fCBFTVBUWV9CVUYpIC8vIEZsdXNoIHBhcnNlci5cbiAgICB0aGlzLnJlYWRNb3JlKClcbiAgfVxuXG4gIHJlYWRNb3JlICgpIHtcbiAgICB3aGlsZSAoIXRoaXMucGF1c2VkICYmIHRoaXMucHRyKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuc29ja2V0LnJlYWQoKVxuICAgICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICB0aGlzLmV4ZWN1dGUoY2h1bmspXG4gICAgfVxuICB9XG5cbiAgZXhlY3V0ZSAoZGF0YSkge1xuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG4gICAgYXNzZXJ0KCF0aGlzLnBhdXNlZClcblxuICAgIGNvbnN0IHsgc29ja2V0LCBsbGh0dHAgfSA9IHRoaXNcblxuICAgIGlmIChkYXRhLmxlbmd0aCA+IGN1cnJlbnRCdWZmZXJTaXplKSB7XG4gICAgICBpZiAoY3VycmVudEJ1ZmZlclB0cikge1xuICAgICAgICBsbGh0dHAuZnJlZShjdXJyZW50QnVmZmVyUHRyKVxuICAgICAgfVxuICAgICAgY3VycmVudEJ1ZmZlclNpemUgPSBNYXRoLmNlaWwoZGF0YS5sZW5ndGggLyA0MDk2KSAqIDQwOTZcbiAgICAgIGN1cnJlbnRCdWZmZXJQdHIgPSBsbGh0dHAubWFsbG9jKGN1cnJlbnRCdWZmZXJTaXplKVxuICAgIH1cblxuICAgIG5ldyBVaW50OEFycmF5KGxsaHR0cC5tZW1vcnkuYnVmZmVyLCBjdXJyZW50QnVmZmVyUHRyLCBjdXJyZW50QnVmZmVyU2l6ZSkuc2V0KGRhdGEpXG5cbiAgICAvLyBDYWxsIGBleGVjdXRlYCBvbiB0aGUgd2FzbSBwYXJzZXIuXG4gICAgLy8gV2UgcGFzcyB0aGUgYGxsaHR0cF9wYXJzZXJgIHBvaW50ZXIgYWRkcmVzcywgdGhlIHBvaW50ZXIgYWRkcmVzcyBvZiBidWZmZXIgdmlldyBkYXRhLFxuICAgIC8vIGFuZCBmaW5hbGx5IHRoZSBsZW5ndGggb2YgYnl0ZXMgdG8gcGFyc2UuXG4gICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBlcnJvciBjb2RlIG9yIGBjb25zdGFudHMuRVJST1IuT0tgLlxuICAgIHRyeSB7XG4gICAgICBsZXQgcmV0XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGN1cnJlbnRCdWZmZXJSZWYgPSBkYXRhXG4gICAgICAgIGN1cnJlbnRQYXJzZXIgPSB0aGlzXG4gICAgICAgIHJldCA9IGxsaHR0cC5sbGh0dHBfZXhlY3V0ZSh0aGlzLnB0ciwgY3VycmVudEJ1ZmZlclB0ciwgZGF0YS5sZW5ndGgpXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWNhdGNoICovXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGN1cnJlbnRQYXJzZXIgPSBudWxsXG4gICAgICAgIGN1cnJlbnRCdWZmZXJSZWYgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9mZnNldCA9IGxsaHR0cC5sbGh0dHBfZ2V0X2Vycm9yX3Bvcyh0aGlzLnB0cikgLSBjdXJyZW50QnVmZmVyUHRyXG5cbiAgICAgIGlmIChyZXQgPT09IGNvbnN0YW50cy5FUlJPUi5QQVVTRURfVVBHUkFERSkge1xuICAgICAgICB0aGlzLm9uVXBncmFkZShkYXRhLnNsaWNlKG9mZnNldCkpXG4gICAgICB9IGVsc2UgaWYgKHJldCA9PT0gY29uc3RhbnRzLkVSUk9SLlBBVVNFRCkge1xuICAgICAgICB0aGlzLnBhdXNlZCA9IHRydWVcbiAgICAgICAgc29ja2V0LnVuc2hpZnQoZGF0YS5zbGljZShvZmZzZXQpKVxuICAgICAgfSBlbHNlIGlmIChyZXQgIT09IGNvbnN0YW50cy5FUlJPUi5PSykge1xuICAgICAgICBjb25zdCBwdHIgPSBsbGh0dHAubGxodHRwX2dldF9lcnJvcl9yZWFzb24odGhpcy5wdHIpXG4gICAgICAgIGxldCBtZXNzYWdlID0gJydcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2U6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgICAgICBpZiAocHRyKSB7XG4gICAgICAgICAgY29uc3QgbGVuID0gbmV3IFVpbnQ4QXJyYXkobGxodHRwLm1lbW9yeS5idWZmZXIsIHB0cikuaW5kZXhPZigwKVxuICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgJ1Jlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHRoZSBIVFRQLzEuMSBwcm90b2NvbCAoJyArXG4gICAgICAgICAgICBCdWZmZXIuZnJvbShsbGh0dHAubWVtb3J5LmJ1ZmZlciwgcHRyLCBsZW4pLnRvU3RyaW5nKCkgK1xuICAgICAgICAgICAgJyknXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEhUVFBQYXJzZXJFcnJvcihtZXNzYWdlLCBjb25zdGFudHMuRVJST1JbcmV0XSwgZGF0YS5zbGljZShvZmZzZXQpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgZXJyKVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3kgKCkge1xuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG5cbiAgICB0aGlzLmxsaHR0cC5sbGh0dHBfZnJlZSh0aGlzLnB0cilcbiAgICB0aGlzLnB0ciA9IG51bGxcblxuICAgIHRpbWVycy5jbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KVxuICAgIHRoaXMudGltZW91dCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXRWYWx1ZSA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXRUeXBlID0gbnVsbFxuXG4gICAgdGhpcy5wYXVzZWQgPSBmYWxzZVxuICB9XG5cbiAgb25TdGF0dXMgKGJ1Zikge1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9IGJ1Zi50b1N0cmluZygpXG4gIH1cblxuICBvbk1lc3NhZ2VCZWdpbiAoKSB7XG4gICAgY29uc3QgeyBzb2NrZXQsIGNsaWVudCB9ID0gdGhpc1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgfVxuXG4gIG9uSGVhZGVyRmllbGQgKGJ1Zikge1xuICAgIGNvbnN0IGxlbiA9IHRoaXMuaGVhZGVycy5sZW5ndGhcblxuICAgIGlmICgobGVuICYgMSkgPT09IDApIHtcbiAgICAgIHRoaXMuaGVhZGVycy5wdXNoKGJ1ZilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkZXJzW2xlbiAtIDFdID0gQnVmZmVyLmNvbmNhdChbdGhpcy5oZWFkZXJzW2xlbiAtIDFdLCBidWZdKVxuICAgIH1cblxuICAgIHRoaXMudHJhY2tIZWFkZXIoYnVmLmxlbmd0aClcbiAgfVxuXG4gIG9uSGVhZGVyVmFsdWUgKGJ1Zikge1xuICAgIGxldCBsZW4gPSB0aGlzLmhlYWRlcnMubGVuZ3RoXG5cbiAgICBpZiAoKGxlbiAmIDEpID09PSAxKSB7XG4gICAgICB0aGlzLmhlYWRlcnMucHVzaChidWYpXG4gICAgICBsZW4gKz0gMVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNbbGVuIC0gMV0gPSBCdWZmZXIuY29uY2F0KFt0aGlzLmhlYWRlcnNbbGVuIC0gMV0sIGJ1Zl0pXG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdGhpcy5oZWFkZXJzW2xlbiAtIDJdXG4gICAgaWYgKGtleS5sZW5ndGggPT09IDEwICYmIGtleS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdrZWVwLWFsaXZlJykge1xuICAgICAgdGhpcy5rZWVwQWxpdmUgKz0gYnVmLnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPT09IDEwICYmIGtleS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdjb25uZWN0aW9uJykge1xuICAgICAgdGhpcy5jb25uZWN0aW9uICs9IGJ1Zi50b1N0cmluZygpXG4gICAgfSBlbHNlIGlmIChrZXkubGVuZ3RoID09PSAxNCAmJiBrZXkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC1sZW5ndGgnKSB7XG4gICAgICB0aGlzLmNvbnRlbnRMZW5ndGggKz0gYnVmLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICB0aGlzLnRyYWNrSGVhZGVyKGJ1Zi5sZW5ndGgpXG4gIH1cblxuICB0cmFja0hlYWRlciAobGVuKSB7XG4gICAgdGhpcy5oZWFkZXJzU2l6ZSArPSBsZW5cbiAgICBpZiAodGhpcy5oZWFkZXJzU2l6ZSA+PSB0aGlzLmhlYWRlcnNNYXhTaXplKSB7XG4gICAgICB1dGlsLmRlc3Ryb3kodGhpcy5zb2NrZXQsIG5ldyBIZWFkZXJzT3ZlcmZsb3dFcnJvcigpKVxuICAgIH1cbiAgfVxuXG4gIG9uVXBncmFkZSAoaGVhZCkge1xuICAgIGNvbnN0IHsgdXBncmFkZSwgY2xpZW50LCBzb2NrZXQsIGhlYWRlcnMsIHN0YXR1c0NvZGUgfSA9IHRoaXNcblxuICAgIGFzc2VydCh1cGdyYWRlKVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgYXNzZXJ0KHJlcXVlc3QpXG5cbiAgICBhc3NlcnQoIXNvY2tldC5kZXN0cm95ZWQpXG4gICAgYXNzZXJ0KHNvY2tldCA9PT0gY2xpZW50W2tTb2NrZXRdKVxuICAgIGFzc2VydCghdGhpcy5wYXVzZWQpXG4gICAgYXNzZXJ0KHJlcXVlc3QudXBncmFkZSB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0NPTk5FQ1QnKVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVsbFxuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICcnXG4gICAgdGhpcy5zaG91bGRLZWVwQWxpdmUgPSBudWxsXG5cbiAgICBhc3NlcnQodGhpcy5oZWFkZXJzLmxlbmd0aCAlIDIgPT09IDApXG4gICAgdGhpcy5oZWFkZXJzID0gW11cbiAgICB0aGlzLmhlYWRlcnNTaXplID0gMFxuXG4gICAgc29ja2V0LnVuc2hpZnQoaGVhZClcblxuICAgIHNvY2tldFtrUGFyc2VyXS5kZXN0cm95KClcbiAgICBzb2NrZXRba1BhcnNlcl0gPSBudWxsXG5cbiAgICBzb2NrZXRba0NsaWVudF0gPSBudWxsXG4gICAgc29ja2V0W2tFcnJvcl0gPSBudWxsXG4gICAgc29ja2V0XG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25Tb2NrZXRFcnJvcilcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCBvblNvY2tldFJlYWRhYmxlKVxuICAgICAgLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvblNvY2tldEVuZClcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvblNvY2tldENsb3NlKVxuXG4gICAgY2xpZW50W2tTb2NrZXRdID0gbnVsbFxuICAgIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF0rK10gPSBudWxsXG4gICAgY2xpZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLCBjbGllbnRba1VybF0sIFtjbGllbnRdLCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCd1cGdyYWRlJykpXG5cbiAgICB0cnkge1xuICAgICAgcmVxdWVzdC5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgZXJyKVxuICAgIH1cblxuICAgIHJlc3VtZShjbGllbnQpXG4gIH1cblxuICBvbkhlYWRlcnNDb21wbGV0ZSAoc3RhdHVzQ29kZSwgdXBncmFkZSwgc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgY29uc3QgeyBjbGllbnQsIHNvY2tldCwgaGVhZGVycywgc3RhdHVzVGV4dCB9ID0gdGhpc1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkaWZmaWN1bHQgdG8gbWFrZSBhIHRlc3QgY2FzZSBmb3IgKi9cbiAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGFzc2VydCghdGhpcy51cGdyYWRlKVxuICAgIGFzc2VydCh0aGlzLnN0YXR1c0NvZGUgPCAyMDApXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gMTAwKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgU29ja2V0RXJyb3IoJ2JhZCByZXNwb25zZScsIHV0aWwuZ2V0U29ja2V0SW5mbyhzb2NrZXQpKSlcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIC8qIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHNlcnZlciBpcyBtaXNiZWhhdmluZyAqL1xuICAgIGlmICh1cGdyYWRlICYmICFyZXF1ZXN0LnVwZ3JhZGUpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBTb2NrZXRFcnJvcignYmFkIHVwZ3JhZGUnLCB1dGlsLmdldFNvY2tldEluZm8oc29ja2V0KSkpXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGhpcy50aW1lb3V0VHlwZSwgVElNRU9VVF9IRUFERVJTKVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICAgIHRoaXMuc2hvdWxkS2VlcEFsaXZlID0gKFxuICAgICAgc2hvdWxkS2VlcEFsaXZlIHx8XG4gICAgICAvLyBPdmVycmlkZSBsbGh0dHAgdmFsdWUgd2hpY2ggZG9lcyBub3QgYWxsb3cga2VlcEFsaXZlIGZvciBIRUFELlxuICAgICAgKHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcgJiYgIXNvY2tldFtrUmVzZXRdICYmIHRoaXMuY29ubmVjdGlvbi50b0xvd2VyQ2FzZSgpID09PSAna2VlcC1hbGl2ZScpXG4gICAgKVxuXG4gICAgaWYgKHRoaXMuc3RhdHVzQ29kZSA+PSAyMDApIHtcbiAgICAgIGNvbnN0IGJvZHlUaW1lb3V0ID0gcmVxdWVzdC5ib2R5VGltZW91dCAhPSBudWxsXG4gICAgICAgID8gcmVxdWVzdC5ib2R5VGltZW91dFxuICAgICAgICA6IGNsaWVudFtrQm9keVRpbWVvdXRdXG4gICAgICB0aGlzLnNldFRpbWVvdXQoYm9keVRpbWVvdXQsIFRJTUVPVVRfQk9EWSlcbiAgICB9IGVsc2UgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgIGlmICh0aGlzLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAgIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAxKVxuICAgICAgdGhpcy51cGdyYWRlID0gdHJ1ZVxuICAgICAgcmV0dXJuIDJcbiAgICB9XG5cbiAgICBpZiAodXBncmFkZSkge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDEpXG4gICAgICB0aGlzLnVwZ3JhZGUgPSB0cnVlXG4gICAgICByZXR1cm4gMlxuICAgIH1cblxuICAgIGFzc2VydCh0aGlzLmhlYWRlcnMubGVuZ3RoICUgMiA9PT0gMClcbiAgICB0aGlzLmhlYWRlcnMgPSBbXVxuICAgIHRoaXMuaGVhZGVyc1NpemUgPSAwXG5cbiAgICBpZiAodGhpcy5zaG91bGRLZWVwQWxpdmUgJiYgY2xpZW50W2tQaXBlbGluaW5nXSkge1xuICAgICAgY29uc3Qga2VlcEFsaXZlVGltZW91dCA9IHRoaXMua2VlcEFsaXZlID8gdXRpbC5wYXJzZUtlZXBBbGl2ZVRpbWVvdXQodGhpcy5rZWVwQWxpdmUpIDogbnVsbFxuXG4gICAgICBpZiAoa2VlcEFsaXZlVGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBNYXRoLm1pbihcbiAgICAgICAgICBrZWVwQWxpdmVUaW1lb3V0IC0gY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkXSxcbiAgICAgICAgICBjbGllbnRba0tlZXBBbGl2ZU1heFRpbWVvdXRdXG4gICAgICAgIClcbiAgICAgICAgaWYgKHRpbWVvdXQgPD0gMCkge1xuICAgICAgICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsaWVudFtrS2VlcEFsaXZlVGltZW91dFZhbHVlXSA9IHRpbWVvdXRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdID0gY2xpZW50W2tLZWVwQWxpdmVEZWZhdWx0VGltZW91dF1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RvcCBtb3JlIHJlcXVlc3RzIGZyb20gYmVpbmcgZGlzcGF0Y2hlZC5cbiAgICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHBhdXNlID0gcmVxdWVzdC5vbkhlYWRlcnMoc3RhdHVzQ29kZSwgaGVhZGVycywgdGhpcy5yZXN1bWUsIHN0YXR1c1RleHQpID09PSBmYWxzZVxuXG4gICAgaWYgKHJlcXVlc3QuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfVxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIHJldHVybiAxXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldFtrQmxvY2tpbmddKSB7XG4gICAgICBzb2NrZXRba0Jsb2NraW5nXSA9IGZhbHNlXG4gICAgICByZXN1bWUoY2xpZW50KVxuICAgIH1cblxuICAgIHJldHVybiBwYXVzZSA/IGNvbnN0YW50cy5FUlJPUi5QQVVTRUQgOiAwXG4gIH1cblxuICBvbkJvZHkgKGJ1Zikge1xuICAgIGNvbnN0IHsgY2xpZW50LCBzb2NrZXQsIHN0YXR1c0NvZGUsIG1heFJlc3BvbnNlU2l6ZSB9ID0gdGhpc1xuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgIGFzc2VydChyZXF1ZXN0KVxuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRoaXMudGltZW91dFR5cGUsIFRJTUVPVVRfQk9EWSlcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHRoaXMudGltZW91dC5yZWZyZXNoKSB7XG4gICAgICAgIHRoaXMudGltZW91dC5yZWZyZXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3NlcnQoc3RhdHVzQ29kZSA+PSAyMDApXG5cbiAgICBpZiAobWF4UmVzcG9uc2VTaXplID4gLTEgJiYgdGhpcy5ieXRlc1JlYWQgKyBidWYubGVuZ3RoID4gbWF4UmVzcG9uc2VTaXplKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgUmVzcG9uc2VFeGNlZWRlZE1heFNpemVFcnJvcigpKVxuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgdGhpcy5ieXRlc1JlYWQgKz0gYnVmLmxlbmd0aFxuXG4gICAgaWYgKHJlcXVlc3Qub25EYXRhKGJ1ZikgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gY29uc3RhbnRzLkVSUk9SLlBBVVNFRFxuICAgIH1cbiAgfVxuXG4gIG9uTWVzc2FnZUNvbXBsZXRlICgpIHtcbiAgICBjb25zdCB7IGNsaWVudCwgc29ja2V0LCBzdGF0dXNDb2RlLCB1cGdyYWRlLCBoZWFkZXJzLCBjb250ZW50TGVuZ3RoLCBieXRlc1JlYWQsIHNob3VsZEtlZXBBbGl2ZSB9ID0gdGhpc1xuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQgJiYgKCFzdGF0dXNDb2RlIHx8IHNob3VsZEtlZXBBbGl2ZSkpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGlmICh1cGdyYWRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBhc3NlcnQocmVxdWVzdClcblxuICAgIGFzc2VydChzdGF0dXNDb2RlID49IDEwMClcblxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IG51bGxcbiAgICB0aGlzLnN0YXR1c1RleHQgPSAnJ1xuICAgIHRoaXMuYnl0ZXNSZWFkID0gMFxuICAgIHRoaXMuY29udGVudExlbmd0aCA9ICcnXG4gICAgdGhpcy5rZWVwQWxpdmUgPSAnJ1xuICAgIHRoaXMuY29ubmVjdGlvbiA9ICcnXG5cbiAgICBhc3NlcnQodGhpcy5oZWFkZXJzLmxlbmd0aCAlIDIgPT09IDApXG4gICAgdGhpcy5oZWFkZXJzID0gW11cbiAgICB0aGlzLmhlYWRlcnNTaXplID0gMFxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBzaG91bGQgYmUgaGFuZGxlZCBieSBsbGh0dHA/ICovXG4gICAgaWYgKHJlcXVlc3QubWV0aG9kICE9PSAnSEVBRCcgJiYgY29udGVudExlbmd0aCAmJiBieXRlc1JlYWQgIT09IHBhcnNlSW50KGNvbnRlbnRMZW5ndGgsIDEwKSkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IFJlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIHJlcXVlc3Qub25Db21wbGV0ZShoZWFkZXJzKVxuXG4gICAgY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XSsrXSA9IG51bGxcblxuICAgIGlmIChzb2NrZXRba1dyaXRpbmddKSB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2xpZW50W2tSdW5uaW5nXSwgMClcbiAgICAgIC8vIFJlc3BvbnNlIGNvbXBsZXRlZCBiZWZvcmUgcmVxdWVzdC5cbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3Jlc2V0JykpXG4gICAgICByZXR1cm4gY29uc3RhbnRzLkVSUk9SLlBBVVNFRFxuICAgIH0gZWxzZSBpZiAoIXNob3VsZEtlZXBBbGl2ZSkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IEluZm9ybWF0aW9uYWxFcnJvcigncmVzZXQnKSlcbiAgICAgIHJldHVybiBjb25zdGFudHMuRVJST1IuUEFVU0VEXG4gICAgfSBlbHNlIGlmIChzb2NrZXRba1Jlc2V0XSAmJiBjbGllbnRba1J1bm5pbmddID09PSAwKSB7XG4gICAgICAvLyBEZXN0cm95IHNvY2tldCBvbmNlIGFsbCByZXF1ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgIC8vIFRoZSByZXF1ZXN0IGF0IHRoZSB0YWlsIG9mIHRoZSBwaXBlbGluZSBpcyB0aGUgb25lXG4gICAgICAvLyB0aGF0IHJlcXVlc3RlZCByZXNldCBhbmQgbm8gZnVydGhlciByZXF1ZXN0cyBzaG91bGRcbiAgICAgIC8vIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlbi5cbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3Jlc2V0JykpXG4gICAgICByZXR1cm4gY29uc3RhbnRzLkVSUk9SLlBBVVNFRFxuICAgIH0gZWxzZSBpZiAoY2xpZW50W2tQaXBlbGluaW5nXSA9PT0gMSkge1xuICAgICAgLy8gV2UgbXVzdCB3YWl0IGEgZnVsbCBldmVudCBsb29wIGN5Y2xlIHRvIHJldXNlIHRoaXMgc29ja2V0IHRvIG1ha2Ugc3VyZVxuICAgICAgLy8gdGhhdCBub24tc3BlYyBjb21wbGlhbnQgc2VydmVycyBhcmUgbm90IGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24gZXZlbiBpZiB0aGV5XG4gICAgICAvLyBzYWlkIHRoZXkgd29uJ3QuXG4gICAgICBzZXRJbW1lZGlhdGUocmVzdW1lLCBjbGllbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VtZShjbGllbnQpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uUGFyc2VyVGltZW91dCAocGFyc2VyKSB7XG4gIGNvbnN0IHsgc29ja2V0LCB0aW1lb3V0VHlwZSwgY2xpZW50IH0gPSBwYXJzZXJcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAodGltZW91dFR5cGUgPT09IFRJTUVPVVRfSEVBREVSUykge1xuICAgIGlmICghc29ja2V0W2tXcml0aW5nXSB8fCBzb2NrZXQud3JpdGFibGVOZWVkRHJhaW4gfHwgY2xpZW50W2tSdW5uaW5nXSA+IDEpIHtcbiAgICAgIGFzc2VydCghcGFyc2VyLnBhdXNlZCwgJ2Nhbm5vdCBiZSBwYXVzZWQgd2hpbGUgd2FpdGluZyBmb3IgaGVhZGVycycpXG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSGVhZGVyc1RpbWVvdXRFcnJvcigpKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9CT0RZKSB7XG4gICAgaWYgKCFwYXJzZXIucGF1c2VkKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgQm9keVRpbWVvdXRFcnJvcigpKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9JRExFKSB7XG4gICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDAgJiYgY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdKVxuICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3NvY2tldCBpZGxlIHRpbWVvdXQnKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBvblNvY2tldFJlYWRhYmxlICgpIHtcbiAgY29uc3QgeyBba1BhcnNlcl06IHBhcnNlciB9ID0gdGhpc1xuICBpZiAocGFyc2VyKSB7XG4gICAgcGFyc2VyLnJlYWRNb3JlKClcbiAgfVxufVxuXG5mdW5jdGlvbiBvblNvY2tldEVycm9yIChlcnIpIHtcbiAgY29uc3QgeyBba0NsaWVudF06IGNsaWVudCwgW2tQYXJzZXJdOiBwYXJzZXIgfSA9IHRoaXNcblxuICBhc3NlcnQoZXJyLmNvZGUgIT09ICdFUlJfVExTX0NFUlRfQUxUTkFNRV9JTlZBTElEJylcblxuICBpZiAoY2xpZW50W2tIVFRQQ29ublZlcnNpb25dICE9PSAnaDInKSB7XG4gICAgLy8gT24gTWFjIE9TLCB3ZSBnZXQgYW4gRUNPTk5SRVNFVCBldmVuIGlmIHRoZXJlIGlzIGEgZnVsbCBib2R5IHRvIGJlIGZvcndhcmRlZFxuICAgIC8vIHRvIHRoZSB1c2VyLlxuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VDT05OUkVTRVQnICYmIHBhcnNlci5zdGF0dXNDb2RlICYmICFwYXJzZXIuc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgICAvLyBXZSB0cmVhdCBhbGwgaW5jb21pbmcgZGF0YSBzbyBmb3IgYXMgYSB2YWxpZCByZXNwb25zZS5cbiAgICAgIHBhcnNlci5vbk1lc3NhZ2VDb21wbGV0ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICB0aGlzW2tFcnJvcl0gPSBlcnJcblxuICBvbkVycm9yKHRoaXNba0NsaWVudF0sIGVycilcbn1cblxuZnVuY3Rpb24gb25FcnJvciAoY2xpZW50LCBlcnIpIHtcbiAgaWYgKFxuICAgIGNsaWVudFtrUnVubmluZ10gPT09IDAgJiZcbiAgICBlcnIuY29kZSAhPT0gJ1VORF9FUlJfSU5GTycgJiZcbiAgICBlcnIuY29kZSAhPT0gJ1VORF9FUlJfU09DS0VUJ1xuICApIHtcbiAgICAvLyBFcnJvciBpcyBub3QgY2F1c2VkIGJ5IHJ1bm5pbmcgcmVxdWVzdCBhbmQgbm90IGEgcmVjb3ZlcmFibGVcbiAgICAvLyBzb2NrZXQgZXJyb3IuXG5cbiAgICBhc3NlcnQoY2xpZW50W2tQZW5kaW5nSWR4XSA9PT0gY2xpZW50W2tSdW5uaW5nSWR4XSlcblxuICAgIGNvbnN0IHJlcXVlc3RzID0gY2xpZW50W2tRdWV1ZV0uc3BsaWNlKGNsaWVudFtrUnVubmluZ0lkeF0pXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RzW2ldXG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gICAgfVxuICAgIGFzc2VydChjbGllbnRba1NpemVdID09PSAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0RW5kICgpIHtcbiAgY29uc3QgeyBba1BhcnNlcl06IHBhcnNlciwgW2tDbGllbnRdOiBjbGllbnQgfSA9IHRoaXNcblxuICBpZiAoY2xpZW50W2tIVFRQQ29ublZlcnNpb25dICE9PSAnaDInKSB7XG4gICAgaWYgKHBhcnNlci5zdGF0dXNDb2RlICYmICFwYXJzZXIuc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgICAvLyBXZSB0cmVhdCBhbGwgaW5jb21pbmcgZGF0YSBzbyBmYXIgYXMgYSB2YWxpZCByZXNwb25zZS5cbiAgICAgIHBhcnNlci5vbk1lc3NhZ2VDb21wbGV0ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICB1dGlsLmRlc3Ryb3kodGhpcywgbmV3IFNvY2tldEVycm9yKCdvdGhlciBzaWRlIGNsb3NlZCcsIHV0aWwuZ2V0U29ja2V0SW5mbyh0aGlzKSkpXG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0Q2xvc2UgKCkge1xuICBjb25zdCB7IFtrQ2xpZW50XTogY2xpZW50LCBba1BhcnNlcl06IHBhcnNlciB9ID0gdGhpc1xuXG4gIGlmIChjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gPT09ICdoMScgJiYgcGFyc2VyKSB7XG4gICAgaWYgKCF0aGlzW2tFcnJvcl0gJiYgcGFyc2VyLnN0YXR1c0NvZGUgJiYgIXBhcnNlci5zaG91bGRLZWVwQWxpdmUpIHtcbiAgICAgIC8vIFdlIHRyZWF0IGFsbCBpbmNvbWluZyBkYXRhIHNvIGZhciBhcyBhIHZhbGlkIHJlc3BvbnNlLlxuICAgICAgcGFyc2VyLm9uTWVzc2FnZUNvbXBsZXRlKClcbiAgICB9XG5cbiAgICB0aGlzW2tQYXJzZXJdLmRlc3Ryb3koKVxuICAgIHRoaXNba1BhcnNlcl0gPSBudWxsXG4gIH1cblxuICBjb25zdCBlcnIgPSB0aGlzW2tFcnJvcl0gfHwgbmV3IFNvY2tldEVycm9yKCdjbG9zZWQnLCB1dGlsLmdldFNvY2tldEluZm8odGhpcykpXG5cbiAgY2xpZW50W2tTb2NrZXRdID0gbnVsbFxuXG4gIGlmIChjbGllbnQuZGVzdHJveWVkKSB7XG4gICAgYXNzZXJ0KGNsaWVudFtrUGVuZGluZ10gPT09IDApXG5cbiAgICAvLyBGYWlsIGVudGlyZSBxdWV1ZS5cbiAgICBjb25zdCByZXF1ZXN0cyA9IGNsaWVudFtrUXVldWVdLnNwbGljZShjbGllbnRba1J1bm5pbmdJZHhdKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0c1tpXVxuICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICAgIH1cbiAgfSBlbHNlIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiBlcnIuY29kZSAhPT0gJ1VORF9FUlJfSU5GTycpIHtcbiAgICAvLyBGYWlsIGhlYWQgb2YgcGlwZWxpbmUuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XSsrXSA9IG51bGxcblxuICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgfVxuXG4gIGNsaWVudFtrUGVuZGluZ0lkeF0gPSBjbGllbnRba1J1bm5pbmdJZHhdXG5cbiAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDApXG5cbiAgY2xpZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLCBjbGllbnRba1VybF0sIFtjbGllbnRdLCBlcnIpXG5cbiAgcmVzdW1lKGNsaWVudClcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29ubmVjdCAoY2xpZW50KSB7XG4gIGFzc2VydCghY2xpZW50W2tDb25uZWN0aW5nXSlcbiAgYXNzZXJ0KCFjbGllbnRba1NvY2tldF0pXG5cbiAgbGV0IHsgaG9zdCwgaG9zdG5hbWUsIHByb3RvY29sLCBwb3J0IH0gPSBjbGllbnRba1VybF1cblxuICAvLyBSZXNvbHZlIGlwdjZcbiAgaWYgKGhvc3RuYW1lWzBdID09PSAnWycpIHtcbiAgICBjb25zdCBpZHggPSBob3N0bmFtZS5pbmRleE9mKCddJylcblxuICAgIGFzc2VydChpZHggIT09IC0xKVxuICAgIGNvbnN0IGlwID0gaG9zdG5hbWUuc3Vic3RyaW5nKDEsIGlkeClcblxuICAgIGFzc2VydChuZXQuaXNJUChpcCkpXG4gICAgaG9zdG5hbWUgPSBpcFxuICB9XG5cbiAgY2xpZW50W2tDb25uZWN0aW5nXSA9IHRydWVcblxuICBpZiAoY2hhbm5lbHMuYmVmb3JlQ29ubmVjdC5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLmJlZm9yZUNvbm5lY3QucHVibGlzaCh7XG4gICAgICBjb25uZWN0UGFyYW1zOiB7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGhvc3RuYW1lLFxuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgc2VydmVybmFtZTogY2xpZW50W2tTZXJ2ZXJOYW1lXSxcbiAgICAgICAgbG9jYWxBZGRyZXNzOiBjbGllbnRba0xvY2FsQWRkcmVzc11cbiAgICAgIH0sXG4gICAgICBjb25uZWN0b3I6IGNsaWVudFtrQ29ubmVjdG9yXVxuICAgIH0pXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHNvY2tldCA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNsaWVudFtrQ29ubmVjdG9yXSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGhvc3RuYW1lLFxuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgc2VydmVybmFtZTogY2xpZW50W2tTZXJ2ZXJOYW1lXSxcbiAgICAgICAgbG9jYWxBZGRyZXNzOiBjbGllbnRba0xvY2FsQWRkcmVzc11cbiAgICAgIH0sIChlcnIsIHNvY2tldCkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHNvY2tldClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaWYgKGNsaWVudC5kZXN0cm95ZWQpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQub24oJ2Vycm9yJywgKCkgPT4ge30pLCBuZXcgQ2xpZW50RGVzdHJveWVkRXJyb3IoKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNsaWVudFtrQ29ubmVjdGluZ10gPSBmYWxzZVxuXG4gICAgYXNzZXJ0KHNvY2tldClcblxuICAgIGNvbnN0IGlzSDIgPSBzb2NrZXQuYWxwblByb3RvY29sID09PSAnaDInXG4gICAgaWYgKGlzSDIpIHtcbiAgICAgIGlmICghaDJFeHBlcmltZW50YWxXYXJuZWQpIHtcbiAgICAgICAgaDJFeHBlcmltZW50YWxXYXJuZWQgPSB0cnVlXG4gICAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoJ0gyIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsLCBleHBlY3QgdGhlbSB0byBjaGFuZ2UgYXQgYW55IHRpbWUuJywge1xuICAgICAgICAgIGNvZGU6ICdVTkRJQ0ktSDInXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlc3Npb24gPSBodHRwMi5jb25uZWN0KGNsaWVudFtrVXJsXSwge1xuICAgICAgICBjcmVhdGVDb25uZWN0aW9uOiAoKSA9PiBzb2NrZXQsXG4gICAgICAgIHBlZXJNYXhDb25jdXJyZW50U3RyZWFtczogY2xpZW50W2tIVFRQMlNlc3Npb25TdGF0ZV0ubWF4Q29uY3VycmVudFN0cmVhbXNcbiAgICAgIH0pXG5cbiAgICAgIGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9ICdoMidcbiAgICAgIHNlc3Npb25ba0NsaWVudF0gPSBjbGllbnRcbiAgICAgIHNlc3Npb25ba1NvY2tldF0gPSBzb2NrZXRcbiAgICAgIHNlc3Npb24ub24oJ2Vycm9yJywgb25IdHRwMlNlc3Npb25FcnJvcilcbiAgICAgIHNlc3Npb24ub24oJ2ZyYW1lRXJyb3InLCBvbkh0dHAyRnJhbWVFcnJvcilcbiAgICAgIHNlc3Npb24ub24oJ2VuZCcsIG9uSHR0cDJTZXNzaW9uRW5kKVxuICAgICAgc2Vzc2lvbi5vbignZ29hd2F5Jywgb25IVFRQMkdvQXdheSlcbiAgICAgIHNlc3Npb24ub24oJ2Nsb3NlJywgb25Tb2NrZXRDbG9zZSlcbiAgICAgIHNlc3Npb24udW5yZWYoKVxuXG4gICAgICBjbGllbnRba0hUVFAyU2Vzc2lvbl0gPSBzZXNzaW9uXG4gICAgICBzb2NrZXRba0hUVFAyU2Vzc2lvbl0gPSBzZXNzaW9uXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghbGxodHRwSW5zdGFuY2UpIHtcbiAgICAgICAgbGxodHRwSW5zdGFuY2UgPSBhd2FpdCBsbGh0dHBQcm9taXNlXG4gICAgICAgIGxsaHR0cFByb21pc2UgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIHNvY2tldFtrTm9SZWZdID0gZmFsc2VcbiAgICAgIHNvY2tldFtrV3JpdGluZ10gPSBmYWxzZVxuICAgICAgc29ja2V0W2tSZXNldF0gPSBmYWxzZVxuICAgICAgc29ja2V0W2tCbG9ja2luZ10gPSBmYWxzZVxuICAgICAgc29ja2V0W2tQYXJzZXJdID0gbmV3IFBhcnNlcihjbGllbnQsIHNvY2tldCwgbGxodHRwSW5zdGFuY2UpXG4gICAgfVxuXG4gICAgc29ja2V0W2tDb3VudGVyXSA9IDBcbiAgICBzb2NrZXRba01heFJlcXVlc3RzXSA9IGNsaWVudFtrTWF4UmVxdWVzdHNdXG4gICAgc29ja2V0W2tDbGllbnRdID0gY2xpZW50XG4gICAgc29ja2V0W2tFcnJvcl0gPSBudWxsXG5cbiAgICBzb2NrZXRcbiAgICAgIC5vbignZXJyb3InLCBvblNvY2tldEVycm9yKVxuICAgICAgLm9uKCdyZWFkYWJsZScsIG9uU29ja2V0UmVhZGFibGUpXG4gICAgICAub24oJ2VuZCcsIG9uU29ja2V0RW5kKVxuICAgICAgLm9uKCdjbG9zZScsIG9uU29ja2V0Q2xvc2UpXG5cbiAgICBjbGllbnRba1NvY2tldF0gPSBzb2NrZXRcblxuICAgIGlmIChjaGFubmVscy5jb25uZWN0ZWQuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmNvbm5lY3RlZC5wdWJsaXNoKHtcbiAgICAgICAgY29ubmVjdFBhcmFtczoge1xuICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgICAgcG9ydCxcbiAgICAgICAgICBzZXJ2ZXJuYW1lOiBjbGllbnRba1NlcnZlck5hbWVdLFxuICAgICAgICAgIGxvY2FsQWRkcmVzczogY2xpZW50W2tMb2NhbEFkZHJlc3NdXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3RvcjogY2xpZW50W2tDb25uZWN0b3JdLFxuICAgICAgICBzb2NrZXRcbiAgICAgIH0pXG4gICAgfVxuICAgIGNsaWVudC5lbWl0KCdjb25uZWN0JywgY2xpZW50W2tVcmxdLCBbY2xpZW50XSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGNsaWVudC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNsaWVudFtrQ29ubmVjdGluZ10gPSBmYWxzZVxuXG4gICAgaWYgKGNoYW5uZWxzLmNvbm5lY3RFcnJvci5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuY29ubmVjdEVycm9yLnB1Ymxpc2goe1xuICAgICAgICBjb25uZWN0UGFyYW1zOiB7XG4gICAgICAgICAgaG9zdCxcbiAgICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgICBwb3J0LFxuICAgICAgICAgIHNlcnZlcm5hbWU6IGNsaWVudFtrU2VydmVyTmFtZV0sXG4gICAgICAgICAgbG9jYWxBZGRyZXNzOiBjbGllbnRba0xvY2FsQWRkcmVzc11cbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdG9yOiBjbGllbnRba0Nvbm5lY3Rvcl0sXG4gICAgICAgIGVycm9yOiBlcnJcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGVyci5jb2RlID09PSAnRVJSX1RMU19DRVJUX0FMVE5BTUVfSU5WQUxJRCcpIHtcbiAgICAgIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAwKVxuICAgICAgd2hpbGUgKGNsaWVudFtrUGVuZGluZ10gPiAwICYmIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUGVuZGluZ0lkeF1dLnNlcnZlcm5hbWUgPT09IGNsaWVudFtrU2VydmVyTmFtZV0pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUGVuZGluZ0lkeF0rK11cbiAgICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvbkVycm9yKGNsaWVudCwgZXJyKVxuICAgIH1cblxuICAgIGNsaWVudC5lbWl0KCdjb25uZWN0aW9uRXJyb3InLCBjbGllbnRba1VybF0sIFtjbGllbnRdLCBlcnIpXG4gIH1cblxuICByZXN1bWUoY2xpZW50KVxufVxuXG5mdW5jdGlvbiBlbWl0RHJhaW4gKGNsaWVudCkge1xuICBjbGllbnRba05lZWREcmFpbl0gPSAwXG4gIGNsaWVudC5lbWl0KCdkcmFpbicsIGNsaWVudFtrVXJsXSwgW2NsaWVudF0pXG59XG5cbmZ1bmN0aW9uIHJlc3VtZSAoY2xpZW50LCBzeW5jKSB7XG4gIGlmIChjbGllbnRba1Jlc3VtaW5nXSA9PT0gMikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY2xpZW50W2tSZXN1bWluZ10gPSAyXG5cbiAgX3Jlc3VtZShjbGllbnQsIHN5bmMpXG4gIGNsaWVudFtrUmVzdW1pbmddID0gMFxuXG4gIGlmIChjbGllbnRba1J1bm5pbmdJZHhdID4gMjU2KSB7XG4gICAgY2xpZW50W2tRdWV1ZV0uc3BsaWNlKDAsIGNsaWVudFtrUnVubmluZ0lkeF0pXG4gICAgY2xpZW50W2tQZW5kaW5nSWR4XSAtPSBjbGllbnRba1J1bm5pbmdJZHhdXG4gICAgY2xpZW50W2tSdW5uaW5nSWR4XSA9IDBcbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVzdW1lIChjbGllbnQsIHN5bmMpIHtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUGVuZGluZ10gPT09IDApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tDbG9zZWRSZXNvbHZlXSAmJiAhY2xpZW50W2tTaXplXSkge1xuICAgICAgY2xpZW50W2tDbG9zZWRSZXNvbHZlXSgpXG4gICAgICBjbGllbnRba0Nsb3NlZFJlc29sdmVdID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc29ja2V0ID0gY2xpZW50W2tTb2NrZXRdXG5cbiAgICBpZiAoc29ja2V0ICYmICFzb2NrZXQuZGVzdHJveWVkICYmIHNvY2tldC5hbHBuUHJvdG9jb2wgIT09ICdoMicpIHtcbiAgICAgIGlmIChjbGllbnRba1NpemVdID09PSAwKSB7XG4gICAgICAgIGlmICghc29ja2V0W2tOb1JlZl0gJiYgc29ja2V0LnVucmVmKSB7XG4gICAgICAgICAgc29ja2V0LnVucmVmKClcbiAgICAgICAgICBzb2NrZXRba05vUmVmXSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzb2NrZXRba05vUmVmXSAmJiBzb2NrZXQucmVmKSB7XG4gICAgICAgIHNvY2tldC5yZWYoKVxuICAgICAgICBzb2NrZXRba05vUmVmXSA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGlmIChjbGllbnRba1NpemVdID09PSAwKSB7XG4gICAgICAgIGlmIChzb2NrZXRba1BhcnNlcl0udGltZW91dFR5cGUgIT09IFRJTUVPVVRfSURMRSkge1xuICAgICAgICAgIHNvY2tldFtrUGFyc2VyXS5zZXRUaW1lb3V0KGNsaWVudFtrS2VlcEFsaXZlVGltZW91dFZhbHVlXSwgVElNRU9VVF9JRExFKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwICYmIHNvY2tldFtrUGFyc2VyXS5zdGF0dXNDb2RlIDwgMjAwKSB7XG4gICAgICAgIGlmIChzb2NrZXRba1BhcnNlcl0udGltZW91dFR5cGUgIT09IFRJTUVPVVRfSEVBREVSUykge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgICAgICAgIGNvbnN0IGhlYWRlcnNUaW1lb3V0ID0gcmVxdWVzdC5oZWFkZXJzVGltZW91dCAhPSBudWxsXG4gICAgICAgICAgICA/IHJlcXVlc3QuaGVhZGVyc1RpbWVvdXRcbiAgICAgICAgICAgIDogY2xpZW50W2tIZWFkZXJzVGltZW91dF1cbiAgICAgICAgICBzb2NrZXRba1BhcnNlcl0uc2V0VGltZW91dChoZWFkZXJzVGltZW91dCwgVElNRU9VVF9IRUFERVJTKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrQnVzeV0pIHtcbiAgICAgIGNsaWVudFtrTmVlZERyYWluXSA9IDJcbiAgICB9IGVsc2UgaWYgKGNsaWVudFtrTmVlZERyYWluXSA9PT0gMikge1xuICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgY2xpZW50W2tOZWVkRHJhaW5dID0gMVxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXREcmFpbiwgY2xpZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1pdERyYWluKGNsaWVudClcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUGVuZGluZ10gPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjbGllbnRba1J1bm5pbmddID49IChjbGllbnRba1BpcGVsaW5pbmddIHx8IDEpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tQZW5kaW5nSWR4XV1cblxuICAgIGlmIChjbGllbnRba1VybF0ucHJvdG9jb2wgPT09ICdodHRwczonICYmIGNsaWVudFtrU2VydmVyTmFtZV0gIT09IHJlcXVlc3Quc2VydmVybmFtZSkge1xuICAgICAgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjbGllbnRba1NlcnZlck5hbWVdID0gcmVxdWVzdC5zZXJ2ZXJuYW1lXG5cbiAgICAgIGlmIChzb2NrZXQgJiYgc29ja2V0LnNlcnZlcm5hbWUgIT09IHJlcXVlc3Quc2VydmVybmFtZSkge1xuICAgICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdzZXJ2ZXJuYW1lIGNoYW5nZWQnKSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrQ29ubmVjdGluZ10pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghc29ja2V0ICYmICFjbGllbnRba0hUVFAyU2Vzc2lvbl0pIHtcbiAgICAgIGNvbm5lY3QoY2xpZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQgfHwgc29ja2V0W2tXcml0aW5nXSB8fCBzb2NrZXRba1Jlc2V0XSB8fCBzb2NrZXRba0Jsb2NraW5nXSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwICYmICFyZXF1ZXN0LmlkZW1wb3RlbnQpIHtcbiAgICAgIC8vIE5vbi1pZGVtcG90ZW50IHJlcXVlc3QgY2Fubm90IGJlIHJldHJpZWQuXG4gICAgICAvLyBFbnN1cmUgdGhhdCBubyBvdGhlciByZXF1ZXN0cyBhcmUgaW5mbGlnaHQgYW5kXG4gICAgICAvLyBjb3VsZCBjYXVzZSBmYWlsdXJlLlxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwICYmIChyZXF1ZXN0LnVwZ3JhZGUgfHwgcmVxdWVzdC5tZXRob2QgPT09ICdDT05ORUNUJykpIHtcbiAgICAgIC8vIERvbid0IGRpc3BhdGNoIGFuIHVwZ3JhZGUgdW50aWwgYWxsIHByZWNlZGluZyByZXF1ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgIC8vIEEgbWlzYmVoYXZpbmcgc2VydmVyIG1pZ2h0IHVwZ3JhZGUgdGhlIGNvbm5lY3Rpb24gYmVmb3JlIGFsbCBwaXBlbGluZWRcbiAgICAgIC8vIHJlcXVlc3QgaGFzIGNvbXBsZXRlZC5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiB1dGlsLmJvZHlMZW5ndGgocmVxdWVzdC5ib2R5KSAhPT0gMCAmJlxuICAgICAgKHV0aWwuaXNTdHJlYW0ocmVxdWVzdC5ib2R5KSB8fCB1dGlsLmlzQXN5bmNJdGVyYWJsZShyZXF1ZXN0LmJvZHkpKSkge1xuICAgICAgLy8gUmVxdWVzdCB3aXRoIHN0cmVhbSBvciBpdGVyYXRvciBib2R5IGNhbiBlcnJvciB3aGlsZSBvdGhlciByZXF1ZXN0c1xuICAgICAgLy8gYXJlIGluZmxpZ2h0IGFuZCBpbmRpcmVjdGx5IGVycm9yIHRob3NlIGFzIHdlbGwuXG4gICAgICAvLyBFbnN1cmUgdGhpcyBkb2Vzbid0IGhhcHBlbiBieSB3YWl0aW5nIGZvciBpbmZsaWdodFxuICAgICAgLy8gdG8gY29tcGxldGUgYmVmb3JlIGRpc3BhdGNoaW5nLlxuXG4gICAgICAvLyBSZXF1ZXN0IHdpdGggc3RyZWFtIG9yIGl0ZXJhdG9yIGJvZHkgY2Fubm90IGJlIHJldHJpZWQuXG4gICAgICAvLyBFbnN1cmUgdGhhdCBubyBvdGhlciByZXF1ZXN0cyBhcmUgaW5mbGlnaHQgYW5kXG4gICAgICAvLyBjb3VsZCBjYXVzZSBmYWlsdXJlLlxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0LmFib3J0ZWQgJiYgd3JpdGUoY2xpZW50LCByZXF1ZXN0KSkge1xuICAgICAgY2xpZW50W2tQZW5kaW5nSWR4XSsrXG4gICAgfSBlbHNlIHtcbiAgICAgIGNsaWVudFtrUXVldWVdLnNwbGljZShjbGllbnRba1BlbmRpbmdJZHhdLCAxKVxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzMCNzZWN0aW9uLTMuMy4yXG5mdW5jdGlvbiBzaG91bGRTZW5kQ29udGVudExlbmd0aCAobWV0aG9kKSB7XG4gIHJldHVybiBtZXRob2QgIT09ICdHRVQnICYmIG1ldGhvZCAhPT0gJ0hFQUQnICYmIG1ldGhvZCAhPT0gJ09QVElPTlMnICYmIG1ldGhvZCAhPT0gJ1RSQUNFJyAmJiBtZXRob2QgIT09ICdDT05ORUNUJ1xufVxuXG5mdW5jdGlvbiB3cml0ZSAoY2xpZW50LCByZXF1ZXN0KSB7XG4gIGlmIChjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gPT09ICdoMicpIHtcbiAgICB3cml0ZUgyKGNsaWVudCwgY2xpZW50W2tIVFRQMlNlc3Npb25dLCByZXF1ZXN0KVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBib2R5LCBtZXRob2QsIHBhdGgsIGhvc3QsIHVwZ3JhZGUsIGhlYWRlcnMsIGJsb2NraW5nLCByZXNldCB9ID0gcmVxdWVzdFxuXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjFcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuMlxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy41XG5cbiAgLy8gU2VuZGluZyBhIHBheWxvYWQgYm9keSBvbiBhIHJlcXVlc3QgdGhhdCBkb2VzIG5vdFxuICAvLyBleHBlY3QgaXQgY2FuIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvciBvbiBzb21lXG4gIC8vIHNlcnZlcnMgYW5kIGNvcnJ1cHQgY29ubmVjdGlvbiBzdGF0ZS4gRG8gbm90XG4gIC8vIHJlLXVzZSB0aGUgY29ubmVjdGlvbiBmb3IgZnVydGhlciByZXF1ZXN0cy5cblxuICBjb25zdCBleHBlY3RzUGF5bG9hZCA9IChcbiAgICBtZXRob2QgPT09ICdQVVQnIHx8XG4gICAgbWV0aG9kID09PSAnUE9TVCcgfHxcbiAgICBtZXRob2QgPT09ICdQQVRDSCdcbiAgKVxuXG4gIGlmIChib2R5ICYmIHR5cGVvZiBib2R5LnJlYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUcnkgdG8gcmVhZCBFT0YgaW4gb3JkZXIgdG8gZ2V0IGxlbmd0aC5cbiAgICBib2R5LnJlYWQoMClcbiAgfVxuXG4gIGNvbnN0IGJvZHlMZW5ndGggPSB1dGlsLmJvZHlMZW5ndGgoYm9keSlcblxuICBsZXQgY29udGVudExlbmd0aCA9IGJvZHlMZW5ndGhcblxuICBpZiAoY29udGVudExlbmd0aCA9PT0gbnVsbCkge1xuICAgIGNvbnRlbnRMZW5ndGggPSByZXF1ZXN0LmNvbnRlbnRMZW5ndGhcbiAgfVxuXG4gIGlmIChjb250ZW50TGVuZ3RoID09PSAwICYmICFleHBlY3RzUGF5bG9hZCkge1xuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4zLjJcbiAgICAvLyBBIHVzZXIgYWdlbnQgU0hPVUxEIE5PVCBzZW5kIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIGZpZWxkIHdoZW5cbiAgICAvLyB0aGUgcmVxdWVzdCBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBwYXlsb2FkIGJvZHkgYW5kIHRoZSBtZXRob2RcbiAgICAvLyBzZW1hbnRpY3MgZG8gbm90IGFudGljaXBhdGUgc3VjaCBhIGJvZHkuXG5cbiAgICBjb250ZW50TGVuZ3RoID0gbnVsbFxuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzIwNDZcbiAgLy8gQSB1c2VyIGFnZW50IG1heSBzZW5kIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIHdpdGggMCB2YWx1ZSwgdGhpcyBzaG91bGQgYmUgYWxsb3dlZC5cbiAgaWYgKHNob3VsZFNlbmRDb250ZW50TGVuZ3RoKG1ldGhvZCkgJiYgY29udGVudExlbmd0aCA+IDAgJiYgcmVxdWVzdC5jb250ZW50TGVuZ3RoICE9PSBudWxsICYmIHJlcXVlc3QuY29udGVudExlbmd0aCAhPT0gY29udGVudExlbmd0aCkge1xuICAgIGlmIChjbGllbnRba1N0cmljdENvbnRlbnRMZW5ndGhdKSB7XG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgfVxuXG4gIGNvbnN0IHNvY2tldCA9IGNsaWVudFtrU29ja2V0XVxuXG4gIHRyeSB7XG4gICAgcmVxdWVzdC5vbkNvbm5lY3QoKGVycikgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QuYWJvcnRlZCB8fCByZXF1ZXN0LmNvbXBsZXRlZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyIHx8IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKCkpXG5cbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ2Fib3J0ZWQnKSlcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gIH1cblxuICBpZiAocmVxdWVzdC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAobWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWNvbGxpbmEvdW5kaWNpL2lzc3Vlcy8yNThcbiAgICAvLyBDbG9zZSBhZnRlciBhIEhFQUQgcmVxdWVzdCB0byBpbnRlcm9wIHdpdGggbWlzYmVoYXZpbmcgc2VydmVyc1xuICAgIC8vIHRoYXQgbWF5IHNlbmQgYSBib2R5IGluIHRoZSByZXNwb25zZS5cblxuICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHVwZ3JhZGUgfHwgbWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAvLyBPbiBDT05ORUNUIG9yIHVwZ3JhZGUsIGJsb2NrIHBpcGVsaW5lIGZyb20gZGlzcGF0Y2hpbmcgZnVydGhlclxuICAgIC8vIHJlcXVlc3RzIG9uIHRoaXMgY29ubmVjdGlvbi5cblxuICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHJlc2V0ICE9IG51bGwpIHtcbiAgICBzb2NrZXRba1Jlc2V0XSA9IHJlc2V0XG4gIH1cblxuICBpZiAoY2xpZW50W2tNYXhSZXF1ZXN0c10gJiYgc29ja2V0W2tDb3VudGVyXSsrID49IGNsaWVudFtrTWF4UmVxdWVzdHNdKSB7XG4gICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gIH1cblxuICBpZiAoYmxvY2tpbmcpIHtcbiAgICBzb2NrZXRba0Jsb2NraW5nXSA9IHRydWVcbiAgfVxuXG4gIGxldCBoZWFkZXIgPSBgJHttZXRob2R9ICR7cGF0aH0gSFRUUC8xLjFcXHJcXG5gXG5cbiAgaWYgKHR5cGVvZiBob3N0ID09PSAnc3RyaW5nJykge1xuICAgIGhlYWRlciArPSBgaG9zdDogJHtob3N0fVxcclxcbmBcbiAgfSBlbHNlIHtcbiAgICBoZWFkZXIgKz0gY2xpZW50W2tIb3N0SGVhZGVyXVxuICB9XG5cbiAgaWYgKHVwZ3JhZGUpIHtcbiAgICBoZWFkZXIgKz0gYGNvbm5lY3Rpb246IHVwZ3JhZGVcXHJcXG51cGdyYWRlOiAke3VwZ3JhZGV9XFxyXFxuYFxuICB9IGVsc2UgaWYgKGNsaWVudFtrUGlwZWxpbmluZ10gJiYgIXNvY2tldFtrUmVzZXRdKSB7XG4gICAgaGVhZGVyICs9ICdjb25uZWN0aW9uOiBrZWVwLWFsaXZlXFxyXFxuJ1xuICB9IGVsc2Uge1xuICAgIGhlYWRlciArPSAnY29ubmVjdGlvbjogY2xvc2VcXHJcXG4nXG4gIH1cblxuICBpZiAoaGVhZGVycykge1xuICAgIGhlYWRlciArPSBoZWFkZXJzXG4gIH1cblxuICBpZiAoY2hhbm5lbHMuc2VuZEhlYWRlcnMuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICBjaGFubmVscy5zZW5kSGVhZGVycy5wdWJsaXNoKHsgcmVxdWVzdCwgaGVhZGVyczogaGVhZGVyLCBzb2NrZXQgfSlcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBhc3NlcnRpb24gKi9cbiAgaWYgKCFib2R5IHx8IGJvZHlMZW5ndGggPT09IDApIHtcbiAgICBpZiAoY29udGVudExlbmd0aCA9PT0gMCkge1xuICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1jb250ZW50LWxlbmd0aDogMFxcclxcblxcclxcbmAsICdsYXRpbjEnKVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gbnVsbCwgJ25vIGJvZHkgbXVzdCBub3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG4gICAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfVxcclxcbmAsICdsYXRpbjEnKVxuICAgIH1cbiAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuICB9IGVsc2UgaWYgKHV0aWwuaXNCdWZmZXIoYm9keSkpIHtcbiAgICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gYm9keS5ieXRlTGVuZ3RoLCAnYnVmZmVyIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcblxuICAgIHNvY2tldC5jb3JrKClcbiAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfWNvbnRlbnQtbGVuZ3RoOiAke2NvbnRlbnRMZW5ndGh9XFxyXFxuXFxyXFxuYCwgJ2xhdGluMScpXG4gICAgc29ja2V0LndyaXRlKGJvZHkpXG4gICAgc29ja2V0LnVuY29yaygpXG4gICAgcmVxdWVzdC5vbkJvZHlTZW50KGJvZHkpXG4gICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcbiAgICBpZiAoIWV4cGVjdHNQYXlsb2FkKSB7XG4gICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSBpZiAodXRpbC5pc0Jsb2JMaWtlKGJvZHkpKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd3JpdGVJdGVyYWJsZSh7IGJvZHk6IGJvZHkuc3RyZWFtKCksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHdyaXRlQmxvYih7IGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gICAgfVxuICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICB3cml0ZVN0cmVhbSh7IGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gIH0gZWxzZSBpZiAodXRpbC5pc0l0ZXJhYmxlKGJvZHkpKSB7XG4gICAgd3JpdGVJdGVyYWJsZSh7IGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0KGZhbHNlKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gd3JpdGVIMiAoY2xpZW50LCBzZXNzaW9uLCByZXF1ZXN0KSB7XG4gIGNvbnN0IHsgYm9keSwgbWV0aG9kLCBwYXRoLCBob3N0LCB1cGdyYWRlLCBleHBlY3RDb250aW51ZSwgc2lnbmFsLCBoZWFkZXJzOiByZXFIZWFkZXJzIH0gPSByZXF1ZXN0XG5cbiAgbGV0IGhlYWRlcnNcbiAgaWYgKHR5cGVvZiByZXFIZWFkZXJzID09PSAnc3RyaW5nJykgaGVhZGVycyA9IFJlcXVlc3Rba0hUVFAyQ29weUhlYWRlcnNdKHJlcUhlYWRlcnMudHJpbSgpKVxuICBlbHNlIGhlYWRlcnMgPSByZXFIZWFkZXJzXG5cbiAgaWYgKHVwZ3JhZGUpIHtcbiAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBuZXcgRXJyb3IoJ1VwZ3JhZGUgbm90IHN1cHBvcnRlZCBmb3IgSDInKSlcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVE9ETyhIVFRQLzIpOiBTaG91bGQgd2UgY2FsbCBvbkNvbm5lY3QgaW1tZWRpYXRlbHkgb3Igb24gc3RyZWFtIHJlYWR5IGV2ZW50P1xuICAgIHJlcXVlc3Qub25Db25uZWN0KChlcnIpID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0LmFib3J0ZWQgfHwgcmVxdWVzdC5jb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVyciB8fCBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgfVxuXG4gIGlmIChyZXF1ZXN0LmFib3J0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCdub2RlOmh0dHAyJykuQ2xpZW50SHR0cDJTdHJlYW19ICovXG4gIGxldCBzdHJlYW1cbiAgY29uc3QgaDJTdGF0ZSA9IGNsaWVudFtrSFRUUDJTZXNzaW9uU3RhdGVdXG5cbiAgaGVhZGVyc1tIVFRQMl9IRUFERVJfQVVUSE9SSVRZXSA9IGhvc3QgfHwgY2xpZW50W2tIb3N0XVxuICBoZWFkZXJzW0hUVFAyX0hFQURFUl9NRVRIT0RdID0gbWV0aG9kXG5cbiAgaWYgKG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgc2Vzc2lvbi5yZWYoKVxuICAgIC8vIHdlIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCwgc3RyZWFtcyBhcmUgcGVuZGluZywgZmlyc3QgcmVxdWVzdFxuICAgIC8vIHdpbGwgY3JlYXRlIGEgbmV3IHN0cmVhbS4gV2UgdHJpZ2dlciBhIHJlcXVlc3QgdG8gY3JlYXRlIHRoZSBzdHJlYW0gYW5kIHdhaXQgdW50aWxcbiAgICAvLyBgcmVhZHlgIGV2ZW50IGlzIHRyaWdnZXJlZFxuICAgIC8vIFdlIGRpc2FibGVkIGVuZFN0cmVhbSB0byBhbGxvdyB0aGUgdXNlciB0byB3cml0ZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtID0gc2Vzc2lvbi5yZXF1ZXN0KGhlYWRlcnMsIHsgZW5kU3RyZWFtOiBmYWxzZSwgc2lnbmFsIH0pXG5cbiAgICBpZiAoc3RyZWFtLmlkICYmICFzdHJlYW0ucGVuZGluZykge1xuICAgICAgcmVxdWVzdC5vblVwZ3JhZGUobnVsbCwgbnVsbCwgc3RyZWFtKVxuICAgICAgKytoMlN0YXRlLm9wZW5TdHJlYW1zXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmVhbS5vbmNlKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5vblVwZ3JhZGUobnVsbCwgbnVsbCwgc3RyZWFtKVxuICAgICAgICArK2gyU3RhdGUub3BlblN0cmVhbXNcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgaDJTdGF0ZS5vcGVuU3RyZWFtcyAtPSAxXG4gICAgICAvLyBUT0RPKEhUVFAvMik6IHVucmVmIG9ubHkgaWYgY3VycmVudCBzdHJlYW1zIGNvdW50IGlzIDBcbiAgICAgIGlmIChoMlN0YXRlLm9wZW5TdHJlYW1zID09PSAwKSBzZXNzaW9uLnVucmVmKClcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTQwI3NlY3Rpb24tOC4zXG4gIC8vIDpwYXRoIGFuZCA6c2NoZW1lIGhlYWRlcnMgbXVzdCBiZSBvbWl0ZWQgd2hlbiBzZW5kaW5nIENPTk5FQ1RcblxuICBoZWFkZXJzW0hUVFAyX0hFQURFUl9QQVRIXSA9IHBhdGhcbiAgaGVhZGVyc1tIVFRQMl9IRUFERVJfU0NIRU1FXSA9ICdodHRwcydcblxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy4xXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjJcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuNVxuXG4gIC8vIFNlbmRpbmcgYSBwYXlsb2FkIGJvZHkgb24gYSByZXF1ZXN0IHRoYXQgZG9lcyBub3RcbiAgLy8gZXhwZWN0IGl0IGNhbiBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3Igb24gc29tZVxuICAvLyBzZXJ2ZXJzIGFuZCBjb3JydXB0IGNvbm5lY3Rpb24gc3RhdGUuIERvIG5vdFxuICAvLyByZS11c2UgdGhlIGNvbm5lY3Rpb24gZm9yIGZ1cnRoZXIgcmVxdWVzdHMuXG5cbiAgY29uc3QgZXhwZWN0c1BheWxvYWQgPSAoXG4gICAgbWV0aG9kID09PSAnUFVUJyB8fFxuICAgIG1ldGhvZCA9PT0gJ1BPU1QnIHx8XG4gICAgbWV0aG9kID09PSAnUEFUQ0gnXG4gIClcblxuICBpZiAoYm9keSAmJiB0eXBlb2YgYm9keS5yZWFkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVHJ5IHRvIHJlYWQgRU9GIGluIG9yZGVyIHRvIGdldCBsZW5ndGguXG4gICAgYm9keS5yZWFkKDApXG4gIH1cblxuICBsZXQgY29udGVudExlbmd0aCA9IHV0aWwuYm9keUxlbmd0aChib2R5KVxuXG4gIGlmIChjb250ZW50TGVuZ3RoID09IG51bGwpIHtcbiAgICBjb250ZW50TGVuZ3RoID0gcmVxdWVzdC5jb250ZW50TGVuZ3RoXG4gIH1cblxuICBpZiAoY29udGVudExlbmd0aCA9PT0gMCB8fCAhZXhwZWN0c1BheWxvYWQpIHtcbiAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yXG4gICAgLy8gQSB1c2VyIGFnZW50IFNIT1VMRCBOT1Qgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBmaWVsZCB3aGVuXG4gICAgLy8gdGhlIHJlcXVlc3QgbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIGEgcGF5bG9hZCBib2R5IGFuZCB0aGUgbWV0aG9kXG4gICAgLy8gc2VtYW50aWNzIGRvIG5vdCBhbnRpY2lwYXRlIHN1Y2ggYSBib2R5LlxuXG4gICAgY29udGVudExlbmd0aCA9IG51bGxcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8yMDQ2XG4gIC8vIEEgdXNlciBhZ2VudCBtYXkgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciB3aXRoIDAgdmFsdWUsIHRoaXMgc2hvdWxkIGJlIGFsbG93ZWQuXG4gIGlmIChzaG91bGRTZW5kQ29udGVudExlbmd0aChtZXRob2QpICYmIGNvbnRlbnRMZW5ndGggPiAwICYmIHJlcXVlc3QuY29udGVudExlbmd0aCAhPSBudWxsICYmIHJlcXVlc3QuY29udGVudExlbmd0aCAhPT0gY29udGVudExlbmd0aCkge1xuICAgIGlmIChjbGllbnRba1N0cmljdENvbnRlbnRMZW5ndGhdKSB7XG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgfVxuXG4gIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwpIHtcbiAgICBhc3NlcnQoYm9keSwgJ25vIGJvZHkgbXVzdCBub3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG4gICAgaGVhZGVyc1tIVFRQMl9IRUFERVJfQ09OVEVOVF9MRU5HVEhdID0gYCR7Y29udGVudExlbmd0aH1gXG4gIH1cblxuICBzZXNzaW9uLnJlZigpXG5cbiAgY29uc3Qgc2hvdWxkRW5kU3RyZWFtID0gbWV0aG9kID09PSAnR0VUJyB8fCBtZXRob2QgPT09ICdIRUFEJ1xuICBpZiAoZXhwZWN0Q29udGludWUpIHtcbiAgICBoZWFkZXJzW0hUVFAyX0hFQURFUl9FWFBFQ1RdID0gJzEwMC1jb250aW51ZSdcbiAgICBzdHJlYW0gPSBzZXNzaW9uLnJlcXVlc3QoaGVhZGVycywgeyBlbmRTdHJlYW06IHNob3VsZEVuZFN0cmVhbSwgc2lnbmFsIH0pXG5cbiAgICBzdHJlYW0ub25jZSgnY29udGludWUnLCB3cml0ZUJvZHlIMilcbiAgfSBlbHNlIHtcbiAgICBzdHJlYW0gPSBzZXNzaW9uLnJlcXVlc3QoaGVhZGVycywge1xuICAgICAgZW5kU3RyZWFtOiBzaG91bGRFbmRTdHJlYW0sXG4gICAgICBzaWduYWxcbiAgICB9KVxuICAgIHdyaXRlQm9keUgyKClcbiAgfVxuXG4gIC8vIEluY3JlbWVudCBjb3VudGVyIGFzIHdlIGhhdmUgbmV3IHNldmVyYWwgc3RyZWFtcyBvcGVuXG4gICsraDJTdGF0ZS5vcGVuU3RyZWFtc1xuXG4gIHN0cmVhbS5vbmNlKCdyZXNwb25zZScsIGhlYWRlcnMgPT4ge1xuICAgIGNvbnN0IHsgW0hUVFAyX0hFQURFUl9TVEFUVVNdOiBzdGF0dXNDb2RlLCAuLi5yZWFsSGVhZGVycyB9ID0gaGVhZGVyc1xuXG4gICAgaWYgKHJlcXVlc3Qub25IZWFkZXJzKE51bWJlcihzdGF0dXNDb2RlKSwgcmVhbEhlYWRlcnMsIHN0cmVhbS5yZXN1bWUuYmluZChzdHJlYW0pLCAnJykgPT09IGZhbHNlKSB7XG4gICAgICBzdHJlYW0ucGF1c2UoKVxuICAgIH1cbiAgfSlcblxuICBzdHJlYW0ub25jZSgnZW5kJywgKCkgPT4ge1xuICAgIHJlcXVlc3Qub25Db21wbGV0ZShbXSlcbiAgfSlcblxuICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICBpZiAocmVxdWVzdC5vbkRhdGEoY2h1bmspID09PSBmYWxzZSkge1xuICAgICAgc3RyZWFtLnBhdXNlKClcbiAgICB9XG4gIH0pXG5cbiAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGgyU3RhdGUub3BlblN0cmVhbXMgLT0gMVxuICAgIC8vIFRPRE8oSFRUUC8yKTogdW5yZWYgb25seSBpZiBjdXJyZW50IHN0cmVhbXMgY291bnQgaXMgMFxuICAgIGlmIChoMlN0YXRlLm9wZW5TdHJlYW1zID09PSAwKSB7XG4gICAgICBzZXNzaW9uLnVucmVmKClcbiAgICB9XG4gIH0pXG5cbiAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChjbGllbnRba0hUVFAyU2Vzc2lvbl0gJiYgIWNsaWVudFtrSFRUUDJTZXNzaW9uXS5kZXN0cm95ZWQgJiYgIXRoaXMuY2xvc2VkICYmICF0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgaDJTdGF0ZS5zdHJlYW1zIC09IDFcbiAgICAgIHV0aWwuZGVzdHJveShzdHJlYW0sIGVycilcbiAgICB9XG4gIH0pXG5cbiAgc3RyZWFtLm9uY2UoJ2ZyYW1lRXJyb3InLCAodHlwZSwgY29kZSkgPT4ge1xuICAgIGNvbnN0IGVyciA9IG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoYEhUVFAvMjogXCJmcmFtZUVycm9yXCIgcmVjZWl2ZWQgLSB0eXBlICR7dHlwZX0sIGNvZGUgJHtjb2RlfWApXG4gICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuXG4gICAgaWYgKGNsaWVudFtrSFRUUDJTZXNzaW9uXSAmJiAhY2xpZW50W2tIVFRQMlNlc3Npb25dLmRlc3Ryb3llZCAmJiAhdGhpcy5jbG9zZWQgJiYgIXRoaXMuZGVzdHJveWVkKSB7XG4gICAgICBoMlN0YXRlLnN0cmVhbXMgLT0gMVxuICAgICAgdXRpbC5kZXN0cm95KHN0cmVhbSwgZXJyKVxuICAgIH1cbiAgfSlcblxuICAvLyBzdHJlYW0ub24oJ2Fib3J0ZWQnLCAoKSA9PiB7XG4gIC8vICAgLy8gVE9ETyhIVFRQLzIpOiBTdXBwb3J0IGFib3J0ZWRcbiAgLy8gfSlcblxuICAvLyBzdHJlYW0ub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gIC8vICAgLy8gVE9ETyhIVFRQLzIpOiBTdXBwb3J0IHRpbWVvdXRcbiAgLy8gfSlcblxuICAvLyBzdHJlYW0ub24oJ3B1c2gnLCBoZWFkZXJzID0+IHtcbiAgLy8gICAvLyBUT0RPKEhUVFAvMik6IFN1cHBvciBwdXNoXG4gIC8vIH0pXG5cbiAgLy8gc3RyZWFtLm9uKCd0cmFpbGVycycsIGhlYWRlcnMgPT4ge1xuICAvLyAgIC8vIFRPRE8oSFRUUC8yKTogU3VwcG9ydCB0cmFpbGVyc1xuICAvLyB9KVxuXG4gIHJldHVybiB0cnVlXG5cbiAgZnVuY3Rpb24gd3JpdGVCb2R5SDIgKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBhc3NlcnRpb24gKi9cbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzQnVmZmVyKGJvZHkpKSB7XG4gICAgICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gYm9keS5ieXRlTGVuZ3RoLCAnYnVmZmVyIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcbiAgICAgIHN0cmVhbS5jb3JrKClcbiAgICAgIHN0cmVhbS53cml0ZShib2R5KVxuICAgICAgc3RyZWFtLnVuY29yaygpXG4gICAgICBzdHJlYW0uZW5kKClcbiAgICAgIHJlcXVlc3Qub25Cb2R5U2VudChib2R5KVxuICAgICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNCbG9iTGlrZShib2R5KSkge1xuICAgICAgaWYgKHR5cGVvZiBib2R5LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3cml0ZUl0ZXJhYmxlKHtcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgIGgyc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgICAgZXhwZWN0c1BheWxvYWQsXG4gICAgICAgICAgYm9keTogYm9keS5zdHJlYW0oKSxcbiAgICAgICAgICBzb2NrZXQ6IGNsaWVudFtrU29ja2V0XSxcbiAgICAgICAgICBoZWFkZXI6ICcnXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3cml0ZUJsb2Ioe1xuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICBleHBlY3RzUGF5bG9hZCxcbiAgICAgICAgICBoMnN0cmVhbTogc3RyZWFtLFxuICAgICAgICAgIGhlYWRlcjogJycsXG4gICAgICAgICAgc29ja2V0OiBjbGllbnRba1NvY2tldF1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIHdyaXRlU3RyZWFtKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICBleHBlY3RzUGF5bG9hZCxcbiAgICAgICAgc29ja2V0OiBjbGllbnRba1NvY2tldF0sXG4gICAgICAgIGgyc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgIGhlYWRlcjogJydcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzSXRlcmFibGUoYm9keSkpIHtcbiAgICAgIHdyaXRlSXRlcmFibGUoe1xuICAgICAgICBib2R5LFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgIGV4cGVjdHNQYXlsb2FkLFxuICAgICAgICBoZWFkZXI6ICcnLFxuICAgICAgICBoMnN0cmVhbTogc3RyZWFtLFxuICAgICAgICBzb2NrZXQ6IGNsaWVudFtrU29ja2V0XVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGZhbHNlKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZVN0cmVhbSAoeyBoMnN0cmVhbSwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQgfSkge1xuICBhc3NlcnQoY29udGVudExlbmd0aCAhPT0gMCB8fCBjbGllbnRba1J1bm5pbmddID09PSAwLCAnc3RyZWFtIGJvZHkgY2Fubm90IGJlIHBpcGVsaW5lZCcpXG5cbiAgaWYgKGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9PT0gJ2gyJykge1xuICAgIC8vIEZvciBIVFRQLzIsIGlzIGVub3VnaCB0byBwaXBlIHRoZSBzdHJlYW1cbiAgICBjb25zdCBwaXBlID0gcGlwZWxpbmUoXG4gICAgICBib2R5LFxuICAgICAgaDJzdHJlYW0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3koYm9keSwgZXJyKVxuICAgICAgICAgIHV0aWwuZGVzdHJveShoMnN0cmVhbSwgZXJyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG5cbiAgICBwaXBlLm9uKCdkYXRhJywgb25QaXBlRGF0YSlcbiAgICBwaXBlLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgIHBpcGUucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvblBpcGVEYXRhKVxuICAgICAgdXRpbC5kZXN0cm95KHBpcGUpXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIG9uUGlwZURhdGEgKGNodW5rKSB7XG4gICAgICByZXF1ZXN0Lm9uQm9keVNlbnQoY2h1bmspXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgZmluaXNoZWQgPSBmYWxzZVxuXG4gIGNvbnN0IHdyaXRlciA9IG5ldyBBc3luY1dyaXRlcih7IHNvY2tldCwgcmVxdWVzdCwgY29udGVudExlbmd0aCwgY2xpZW50LCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyIH0pXG5cbiAgY29uc3Qgb25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCF3cml0ZXIud3JpdGUoY2h1bmspICYmIHRoaXMucGF1c2UpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB1dGlsLmRlc3Ryb3kodGhpcywgZXJyKVxuICAgIH1cbiAgfVxuICBjb25zdCBvbkRyYWluID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGJvZHkucmVzdW1lKSB7XG4gICAgICBib2R5LnJlc3VtZSgpXG4gICAgfVxuICB9XG4gIGNvbnN0IG9uQWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZXJyID0gbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IG9uRmluaXNoZWQoZXJyKSlcbiAgfVxuICBjb25zdCBvbkZpbmlzaGVkID0gZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZmluaXNoZWQgPSB0cnVlXG5cbiAgICBhc3NlcnQoc29ja2V0LmRlc3Ryb3llZCB8fCAoc29ja2V0W2tXcml0aW5nXSAmJiBjbGllbnRba1J1bm5pbmddIDw9IDEpKVxuXG4gICAgc29ja2V0XG4gICAgICAub2ZmKCdkcmFpbicsIG9uRHJhaW4pXG4gICAgICAub2ZmKCdlcnJvcicsIG9uRmluaXNoZWQpXG5cbiAgICBib2R5XG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbkRhdGEpXG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uRmluaXNoZWQpXG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25GaW5pc2hlZClcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbkFib3J0KVxuXG4gICAgaWYgKCFlcnIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdyaXRlci5lbmQoKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgZXJyID0gZXJcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZXIuZGVzdHJveShlcnIpXG5cbiAgICBpZiAoZXJyICYmIChlcnIuY29kZSAhPT0gJ1VORF9FUlJfSU5GTycgfHwgZXJyLm1lc3NhZ2UgIT09ICdyZXNldCcpKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koYm9keSwgZXJyKVxuICAgIH0gZWxzZSB7XG4gICAgICB1dGlsLmRlc3Ryb3koYm9keSlcbiAgICB9XG4gIH1cblxuICBib2R5XG4gICAgLm9uKCdkYXRhJywgb25EYXRhKVxuICAgIC5vbignZW5kJywgb25GaW5pc2hlZClcbiAgICAub24oJ2Vycm9yJywgb25GaW5pc2hlZClcbiAgICAub24oJ2Nsb3NlJywgb25BYm9ydClcblxuICBpZiAoYm9keS5yZXN1bWUpIHtcbiAgICBib2R5LnJlc3VtZSgpXG4gIH1cblxuICBzb2NrZXRcbiAgICAub24oJ2RyYWluJywgb25EcmFpbilcbiAgICAub24oJ2Vycm9yJywgb25GaW5pc2hlZClcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVCbG9iICh7IGgyc3RyZWFtLCBib2R5LCBjbGllbnQsIHJlcXVlc3QsIHNvY2tldCwgY29udGVudExlbmd0aCwgaGVhZGVyLCBleHBlY3RzUGF5bG9hZCB9KSB7XG4gIGFzc2VydChjb250ZW50TGVuZ3RoID09PSBib2R5LnNpemUsICdibG9iIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcblxuICBjb25zdCBpc0gyID0gY2xpZW50W2tIVFRQQ29ublZlcnNpb25dID09PSAnaDInXG4gIHRyeSB7XG4gICAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiBjb250ZW50TGVuZ3RoICE9PSBib2R5LnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKVxuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGF3YWl0IGJvZHkuYXJyYXlCdWZmZXIoKSlcblxuICAgIGlmIChpc0gyKSB7XG4gICAgICBoMnN0cmVhbS5jb3JrKClcbiAgICAgIGgyc3RyZWFtLndyaXRlKGJ1ZmZlcilcbiAgICAgIGgyc3RyZWFtLnVuY29yaygpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNvY2tldC5jb3JrKClcbiAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9Y29udGVudC1sZW5ndGg6ICR7Y29udGVudExlbmd0aH1cXHJcXG5cXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIHNvY2tldC53cml0ZShidWZmZXIpXG4gICAgICBzb2NrZXQudW5jb3JrKClcbiAgICB9XG5cbiAgICByZXF1ZXN0Lm9uQm9keVNlbnQoYnVmZmVyKVxuICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG5cbiAgICBpZiAoIWV4cGVjdHNQYXlsb2FkKSB7XG4gICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICB9XG5cbiAgICByZXN1bWUoY2xpZW50KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB1dGlsLmRlc3Ryb3koaXNIMiA/IGgyc3RyZWFtIDogc29ja2V0LCBlcnIpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVJdGVyYWJsZSAoeyBoMnN0cmVhbSwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQgfSkge1xuICBhc3NlcnQoY29udGVudExlbmd0aCAhPT0gMCB8fCBjbGllbnRba1J1bm5pbmddID09PSAwLCAnaXRlcmF0b3IgYm9keSBjYW5ub3QgYmUgcGlwZWxpbmVkJylcblxuICBsZXQgY2FsbGJhY2sgPSBudWxsXG4gIGZ1bmN0aW9uIG9uRHJhaW4gKCkge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY29uc3QgY2IgPSBjYWxsYmFja1xuICAgICAgY2FsbGJhY2sgPSBudWxsXG4gICAgICBjYigpXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgd2FpdEZvckRyYWluID0gKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGFzc2VydChjYWxsYmFjayA9PT0gbnVsbClcblxuICAgIGlmIChzb2NrZXRba0Vycm9yXSkge1xuICAgICAgcmVqZWN0KHNvY2tldFtrRXJyb3JdKVxuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayA9IHJlc29sdmVcbiAgICB9XG4gIH0pXG5cbiAgaWYgKGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9PT0gJ2gyJykge1xuICAgIGgyc3RyZWFtXG4gICAgICAub24oJ2Nsb3NlJywgb25EcmFpbilcbiAgICAgIC5vbignZHJhaW4nLCBvbkRyYWluKVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEl0J3MgdXAgdG8gdGhlIHVzZXIgdG8gc29tZWhvdyBhYm9ydCB0aGUgYXN5bmMgaXRlcmFibGUuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGJvZHkpIHtcbiAgICAgICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICAgICAgdGhyb3cgc29ja2V0W2tFcnJvcl1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlcyA9IGgyc3RyZWFtLndyaXRlKGNodW5rKVxuICAgICAgICByZXF1ZXN0Lm9uQm9keVNlbnQoY2h1bmspXG4gICAgICAgIGlmICghcmVzKSB7XG4gICAgICAgICAgYXdhaXQgd2FpdEZvckRyYWluKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaDJzdHJlYW0uZGVzdHJveShlcnIpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gICAgICBoMnN0cmVhbS5lbmQoKVxuICAgICAgaDJzdHJlYW1cbiAgICAgICAgLm9mZignY2xvc2UnLCBvbkRyYWluKVxuICAgICAgICAub2ZmKCdkcmFpbicsIG9uRHJhaW4pXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBzb2NrZXRcbiAgICAub24oJ2Nsb3NlJywgb25EcmFpbilcbiAgICAub24oJ2RyYWluJywgb25EcmFpbilcblxuICBjb25zdCB3cml0ZXIgPSBuZXcgQXN5bmNXcml0ZXIoeyBzb2NrZXQsIHJlcXVlc3QsIGNvbnRlbnRMZW5ndGgsIGNsaWVudCwgZXhwZWN0c1BheWxvYWQsIGhlYWRlciB9KVxuICB0cnkge1xuICAgIC8vIEl0J3MgdXAgdG8gdGhlIHVzZXIgdG8gc29tZWhvdyBhYm9ydCB0aGUgYXN5bmMgaXRlcmFibGUuXG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBib2R5KSB7XG4gICAgICBpZiAoc29ja2V0W2tFcnJvcl0pIHtcbiAgICAgICAgdGhyb3cgc29ja2V0W2tFcnJvcl1cbiAgICAgIH1cblxuICAgICAgaWYgKCF3cml0ZXIud3JpdGUoY2h1bmspKSB7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JEcmFpbigpXG4gICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVyLmVuZCgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHdyaXRlci5kZXN0cm95KGVycilcbiAgfSBmaW5hbGx5IHtcbiAgICBzb2NrZXRcbiAgICAgIC5vZmYoJ2Nsb3NlJywgb25EcmFpbilcbiAgICAgIC5vZmYoJ2RyYWluJywgb25EcmFpbilcbiAgfVxufVxuXG5jbGFzcyBBc3luY1dyaXRlciB7XG4gIGNvbnN0cnVjdG9yICh7IHNvY2tldCwgcmVxdWVzdCwgY29udGVudExlbmd0aCwgY2xpZW50LCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyIH0pIHtcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RcbiAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLmJ5dGVzV3JpdHRlbiA9IDBcbiAgICB0aGlzLmV4cGVjdHNQYXlsb2FkID0gZXhwZWN0c1BheWxvYWRcbiAgICB0aGlzLmhlYWRlciA9IGhlYWRlclxuXG4gICAgc29ja2V0W2tXcml0aW5nXSA9IHRydWVcbiAgfVxuXG4gIHdyaXRlIChjaHVuaykge1xuICAgIGNvbnN0IHsgc29ja2V0LCByZXF1ZXN0LCBjb250ZW50TGVuZ3RoLCBjbGllbnQsIGJ5dGVzV3JpdHRlbiwgZXhwZWN0c1BheWxvYWQsIGhlYWRlciB9ID0gdGhpc1xuXG4gICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICB0aHJvdyBzb2NrZXRba0Vycm9yXVxuICAgIH1cblxuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBsZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aChjaHVuaylcbiAgICBpZiAoIWxlbikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBXZSBzaG91bGQgZGVmZXIgd3JpdGluZyBjaHVua3MuXG4gICAgaWYgKGNvbnRlbnRMZW5ndGggIT09IG51bGwgJiYgYnl0ZXNXcml0dGVuICsgbGVuID4gY29udGVudExlbmd0aCkge1xuICAgICAgaWYgKGNsaWVudFtrU3RyaWN0Q29udGVudExlbmd0aF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpXG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpKVxuICAgIH1cblxuICAgIHNvY2tldC5jb3JrKClcblxuICAgIGlmIChieXRlc1dyaXR0ZW4gPT09IDApIHtcbiAgICAgIGlmICghZXhwZWN0c1BheWxvYWQpIHtcbiAgICAgICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjb250ZW50TGVuZ3RoID09PSBudWxsKSB7XG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9dHJhbnNmZXItZW5jb2Rpbmc6IGNodW5rZWRcXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9Y29udGVudC1sZW5ndGg6ICR7Y29udGVudExlbmd0aH1cXHJcXG5cXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29udGVudExlbmd0aCA9PT0gbnVsbCkge1xuICAgICAgc29ja2V0LndyaXRlKGBcXHJcXG4ke2xlbi50b1N0cmluZygxNil9XFxyXFxuYCwgJ2xhdGluMScpXG4gICAgfVxuXG4gICAgdGhpcy5ieXRlc1dyaXR0ZW4gKz0gbGVuXG5cbiAgICBjb25zdCByZXQgPSBzb2NrZXQud3JpdGUoY2h1bmspXG5cbiAgICBzb2NrZXQudW5jb3JrKClcblxuICAgIHJlcXVlc3Qub25Cb2R5U2VudChjaHVuaylcblxuICAgIGlmICghcmV0KSB7XG4gICAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQgJiYgc29ja2V0W2tQYXJzZXJdLnRpbWVvdXRUeXBlID09PSBUSU1FT1VUX0hFQURFUlMpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgICBzb2NrZXRba1BhcnNlcl0udGltZW91dC5yZWZyZXNoKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGVuZCAoKSB7XG4gICAgY29uc3QgeyBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGNsaWVudCwgYnl0ZXNXcml0dGVuLCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyLCByZXF1ZXN0IH0gPSB0aGlzXG4gICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcblxuICAgIHNvY2tldFtrV3JpdGluZ10gPSBmYWxzZVxuXG4gICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICB0aHJvdyBzb2NrZXRba0Vycm9yXVxuICAgIH1cblxuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYnl0ZXNXcml0dGVuID09PSAwKSB7XG4gICAgICBpZiAoZXhwZWN0c1BheWxvYWQpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMlxuICAgICAgICAvLyBBIHVzZXIgYWdlbnQgU0hPVUxEIHNlbmQgYSBDb250ZW50LUxlbmd0aCBpbiBhIHJlcXVlc3QgbWVzc2FnZSB3aGVuXG4gICAgICAgIC8vIG5vIFRyYW5zZmVyLUVuY29kaW5nIGlzIHNlbnQgYW5kIHRoZSByZXF1ZXN0IG1ldGhvZCBkZWZpbmVzIGEgbWVhbmluZ1xuICAgICAgICAvLyBmb3IgYW4gZW5jbG9zZWQgcGF5bG9hZCBib2R5LlxuXG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9Y29udGVudC1sZW5ndGg6IDBcXHJcXG5cXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9XFxyXFxuYCwgJ2xhdGluMScpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb250ZW50TGVuZ3RoID09PSBudWxsKSB7XG4gICAgICBzb2NrZXQud3JpdGUoJ1xcclxcbjBcXHJcXG5cXHJcXG4nLCAnbGF0aW4xJylcbiAgICB9XG5cbiAgICBpZiAoY29udGVudExlbmd0aCAhPT0gbnVsbCAmJiBieXRlc1dyaXR0ZW4gIT09IGNvbnRlbnRMZW5ndGgpIHtcbiAgICAgIGlmIChjbGllbnRba1N0cmljdENvbnRlbnRMZW5ndGhdKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0ICYmIHNvY2tldFtrUGFyc2VyXS50aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9IRUFERVJTKSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzdW1lKGNsaWVudClcbiAgfVxuXG4gIGRlc3Ryb3kgKGVycikge1xuICAgIGNvbnN0IHsgc29ja2V0LCBjbGllbnQgfSA9IHRoaXNcblxuICAgIHNvY2tldFtrV3JpdGluZ10gPSBmYWxzZVxuXG4gICAgaWYgKGVycikge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPD0gMSwgJ3BpcGVsaW5lIHNob3VsZCBvbmx5IGNvbnRhaW4gdGhpcyByZXF1ZXN0JylcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIGVycilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZXJyb3JSZXF1ZXN0IChjbGllbnQsIHJlcXVlc3QsIGVycikge1xuICB0cnkge1xuICAgIHJlcXVlc3Qub25FcnJvcihlcnIpXG4gICAgYXNzZXJ0KHJlcXVlc3QuYWJvcnRlZClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2xpZW50LmVtaXQoJ2Vycm9yJywgZXJyKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ2xpZW50XG4iLAogICAgIi8qIGVzbGludC1kaXNhYmxlICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vLyBFeHRyYWN0ZWQgZnJvbSBub2RlL2xpYi9pbnRlcm5hbC9maXhlZF9xdWV1ZS5qc1xuXG4vLyBDdXJyZW50bHkgb3B0aW1hbCBxdWV1ZSBzaXplLCB0ZXN0ZWQgb24gVjggNi4wIC0gNi42LiBNdXN0IGJlIHBvd2VyIG9mIHR3by5cbmNvbnN0IGtTaXplID0gMjA0ODtcbmNvbnN0IGtNYXNrID0ga1NpemUgLSAxO1xuXG4vLyBUaGUgRml4ZWRRdWV1ZSBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBmaXhlZC1zaXplXG4vLyBjaXJjdWxhciBidWZmZXJzLiBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOlxuLy9cbi8vICBoZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxcbi8vICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuLy8gICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2XG4vLyArLS0tLS0tLS0tLS0rIDwtLS0tLVxcICAgICAgICstLS0tLS0tLS0tLSsgPC0tLS0tLVxcICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgW251bGxdICAgfCAgICAgICAgXFwtLS0tLSB8ICAgbmV4dCAgICB8ICAgICAgICAgXFwtLS0tLS0tIHwgICBuZXh0ICAgIHxcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgIGl0ZW0gICAgfCA8LS0gYm90dG9tICAgIHwgICBpdGVtICAgIHwgPC0tIGJvdHRvbSAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgW2VtcHR5XSAgfFxuLy8gfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICBib3R0b20gLS0+IHwgICBpdGVtICAgIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgICAuLi4gICAgfCAgICAgICAgICAgICAgIHwgICAgLi4uICAgIHwgICAgICAgICAgICAgICAgICB8ICAgIC4uLiAgICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgW2VtcHR5XSAgfCA8LS0gdG9wICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8IDwtLSB0b3AgIHRvcCAtLT4gfCAgW2VtcHR5XSAgfFxuLy8gKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4vL1xuLy8gT3IsIGlmIHRoZXJlIGlzIG9ubHkgb25lIGNpcmN1bGFyIGJ1ZmZlciwgaXQgbG9va3Mgc29tZXRoaW5nXG4vLyBsaWtlIGVpdGhlciBvZiB0aGVzZTpcbi8vXG4vLyAgaGVhZCAgIHRhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICAgdGFpbFxuLy8gICAgfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8XG4vLyAgICB2ICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgICAgIHZcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgW251bGxdICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBbbnVsbF0gICB8XG4vLyArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLStcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgW2VtcHR5XSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICAgaXRlbSAgICB8IDwtLSBib3R0b20gICAgICAgICAgICB0b3AgLS0+IHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgW2VtcHR5XSAgfFxuLy8gfCAgW2VtcHR5XSAgfCA8LS0gdG9wICAgICAgICAgICAgYm90dG9tIC0tPiB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy9cbi8vIEFkZGluZyBhIHZhbHVlIG1lYW5zIG1vdmluZyBgdG9wYCBmb3J3YXJkIGJ5IG9uZSwgcmVtb3ZpbmcgbWVhbnNcbi8vIG1vdmluZyBgYm90dG9tYCBmb3J3YXJkIGJ5IG9uZS4gQWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCwgdGhlIHF1ZXVlXG4vLyB3cmFwcyBhcm91bmQuXG4vL1xuLy8gV2hlbiBgdG9wID09PSBib3R0b21gIHRoZSBjdXJyZW50IHF1ZXVlIGlzIGVtcHR5IGFuZCB3aGVuXG4vLyBgdG9wICsgMSA9PT0gYm90dG9tYCBpdCdzIGZ1bGwuIFRoaXMgd2FzdGVzIGEgc2luZ2xlIHNwYWNlIG9mIHN0b3JhZ2Vcbi8vIGJ1dCBhbGxvd3MgbXVjaCBxdWlja2VyIGNoZWNrcy5cblxuY2xhc3MgRml4ZWRDaXJjdWxhckJ1ZmZlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYm90dG9tID0gMDtcbiAgICB0aGlzLnRvcCA9IDA7XG4gICAgdGhpcy5saXN0ID0gbmV3IEFycmF5KGtTaXplKTtcbiAgICB0aGlzLm5leHQgPSBudWxsO1xuICB9XG5cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50b3AgPT09IHRoaXMuYm90dG9tO1xuICB9XG5cbiAgaXNGdWxsKCkge1xuICAgIHJldHVybiAoKHRoaXMudG9wICsgMSkgJiBrTWFzaykgPT09IHRoaXMuYm90dG9tO1xuICB9XG5cbiAgcHVzaChkYXRhKSB7XG4gICAgdGhpcy5saXN0W3RoaXMudG9wXSA9IGRhdGE7XG4gICAgdGhpcy50b3AgPSAodGhpcy50b3AgKyAxKSAmIGtNYXNrO1xuICB9XG5cbiAgc2hpZnQoKSB7XG4gICAgY29uc3QgbmV4dEl0ZW0gPSB0aGlzLmxpc3RbdGhpcy5ib3R0b21dO1xuICAgIGlmIChuZXh0SXRlbSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5saXN0W3RoaXMuYm90dG9tXSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJvdHRvbSA9ICh0aGlzLmJvdHRvbSArIDEpICYga01hc2s7XG4gICAgcmV0dXJuIG5leHRJdGVtO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRml4ZWRRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG5ldyBGaXhlZENpcmN1bGFyQnVmZmVyKCk7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmhlYWQuaXNFbXB0eSgpO1xuICB9XG5cbiAgcHVzaChkYXRhKSB7XG4gICAgaWYgKHRoaXMuaGVhZC5pc0Z1bGwoKSkge1xuICAgICAgLy8gSGVhZCBpcyBmdWxsOiBDcmVhdGVzIGEgbmV3IHF1ZXVlLCBzZXRzIHRoZSBvbGQgcXVldWUncyBgLm5leHRgIHRvIGl0LFxuICAgICAgLy8gYW5kIHNldHMgaXQgYXMgdGhlIG5ldyBtYWluIHF1ZXVlLlxuICAgICAgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQgPSBuZXcgRml4ZWRDaXJjdWxhckJ1ZmZlcigpO1xuICAgIH1cbiAgICB0aGlzLmhlYWQucHVzaChkYXRhKTtcbiAgfVxuXG4gIHNoaWZ0KCkge1xuICAgIGNvbnN0IHRhaWwgPSB0aGlzLnRhaWw7XG4gICAgY29uc3QgbmV4dCA9IHRhaWwuc2hpZnQoKTtcbiAgICBpZiAodGFpbC5pc0VtcHR5KCkgJiYgdGFpbC5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhbm90aGVyIHF1ZXVlLCBpdCBmb3JtcyB0aGUgbmV3IHRhaWwuXG4gICAgICB0aGlzLnRhaWwgPSB0YWlsLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0O1xuICB9XG59O1xuIiwKICAgICJjb25zdCB7IGtGcmVlLCBrQ29ubmVjdGVkLCBrUGVuZGluZywga1F1ZXVlZCwga1J1bm5pbmcsIGtTaXplIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCBrUG9vbCA9IFN5bWJvbCgncG9vbCcpXG5cbmNsYXNzIFBvb2xTdGF0cyB7XG4gIGNvbnN0cnVjdG9yIChwb29sKSB7XG4gICAgdGhpc1trUG9vbF0gPSBwb29sXG4gIH1cblxuICBnZXQgY29ubmVjdGVkICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba0Nvbm5lY3RlZF1cbiAgfVxuXG4gIGdldCBmcmVlICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba0ZyZWVdXG4gIH1cblxuICBnZXQgcGVuZGluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tQZW5kaW5nXVxuICB9XG5cbiAgZ2V0IHF1ZXVlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tRdWV1ZWRdXG4gIH1cblxuICBnZXQgcnVubmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tSdW5uaW5nXVxuICB9XG5cbiAgZ2V0IHNpemUgKCkge1xuICAgIHJldHVybiB0aGlzW2tQb29sXVtrU2l6ZV1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xTdGF0c1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgRGlzcGF0Y2hlckJhc2UgPSByZXF1aXJlKCcuL2Rpc3BhdGNoZXItYmFzZScpXG5jb25zdCBGaXhlZFF1ZXVlID0gcmVxdWlyZSgnLi9ub2RlL2ZpeGVkLXF1ZXVlJylcbmNvbnN0IHsga0Nvbm5lY3RlZCwga1NpemUsIGtSdW5uaW5nLCBrUGVuZGluZywga1F1ZXVlZCwga0J1c3ksIGtGcmVlLCBrVXJsLCBrQ2xvc2UsIGtEZXN0cm95LCBrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vY29yZS9zeW1ib2xzJylcbmNvbnN0IFBvb2xTdGF0cyA9IHJlcXVpcmUoJy4vcG9vbC1zdGF0cycpXG5cbmNvbnN0IGtDbGllbnRzID0gU3ltYm9sKCdjbGllbnRzJylcbmNvbnN0IGtOZWVkRHJhaW4gPSBTeW1ib2woJ25lZWREcmFpbicpXG5jb25zdCBrUXVldWUgPSBTeW1ib2woJ3F1ZXVlJylcbmNvbnN0IGtDbG9zZWRSZXNvbHZlID0gU3ltYm9sKCdjbG9zZWQgcmVzb2x2ZScpXG5jb25zdCBrT25EcmFpbiA9IFN5bWJvbCgnb25EcmFpbicpXG5jb25zdCBrT25Db25uZWN0ID0gU3ltYm9sKCdvbkNvbm5lY3QnKVxuY29uc3Qga09uRGlzY29ubmVjdCA9IFN5bWJvbCgnb25EaXNjb25uZWN0JylcbmNvbnN0IGtPbkNvbm5lY3Rpb25FcnJvciA9IFN5bWJvbCgnb25Db25uZWN0aW9uRXJyb3InKVxuY29uc3Qga0dldERpc3BhdGNoZXIgPSBTeW1ib2woJ2dldCBkaXNwYXRjaGVyJylcbmNvbnN0IGtBZGRDbGllbnQgPSBTeW1ib2woJ2FkZCBjbGllbnQnKVxuY29uc3Qga1JlbW92ZUNsaWVudCA9IFN5bWJvbCgncmVtb3ZlIGNsaWVudCcpXG5jb25zdCBrU3RhdHMgPSBTeW1ib2woJ3N0YXRzJylcblxuY2xhc3MgUG9vbEJhc2UgZXh0ZW5kcyBEaXNwYXRjaGVyQmFzZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tRdWV1ZV0gPSBuZXcgRml4ZWRRdWV1ZSgpXG4gICAgdGhpc1trQ2xpZW50c10gPSBbXVxuICAgIHRoaXNba1F1ZXVlZF0gPSAwXG5cbiAgICBjb25zdCBwb29sID0gdGhpc1xuXG4gICAgdGhpc1trT25EcmFpbl0gPSBmdW5jdGlvbiBvbkRyYWluIChvcmlnaW4sIHRhcmdldHMpIHtcbiAgICAgIGNvbnN0IHF1ZXVlID0gcG9vbFtrUXVldWVdXG5cbiAgICAgIGxldCBuZWVkRHJhaW4gPSBmYWxzZVxuXG4gICAgICB3aGlsZSAoIW5lZWREcmFpbikge1xuICAgICAgICBjb25zdCBpdGVtID0gcXVldWUuc2hpZnQoKVxuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHBvb2xba1F1ZXVlZF0tLVxuICAgICAgICBuZWVkRHJhaW4gPSAhdGhpcy5kaXNwYXRjaChpdGVtLm9wdHMsIGl0ZW0uaGFuZGxlcilcbiAgICAgIH1cblxuICAgICAgdGhpc1trTmVlZERyYWluXSA9IG5lZWREcmFpblxuXG4gICAgICBpZiAoIXRoaXNba05lZWREcmFpbl0gJiYgcG9vbFtrTmVlZERyYWluXSkge1xuICAgICAgICBwb29sW2tOZWVkRHJhaW5dID0gZmFsc2VcbiAgICAgICAgcG9vbC5lbWl0KCdkcmFpbicsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdKVxuICAgICAgfVxuXG4gICAgICBpZiAocG9vbFtrQ2xvc2VkUmVzb2x2ZV0gJiYgcXVldWUuaXNFbXB0eSgpKSB7XG4gICAgICAgIFByb21pc2VcbiAgICAgICAgICAuYWxsKHBvb2xba0NsaWVudHNdLm1hcChjID0+IGMuY2xvc2UoKSkpXG4gICAgICAgICAgLnRoZW4ocG9vbFtrQ2xvc2VkUmVzb2x2ZV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trT25Db25uZWN0XSA9IChvcmlnaW4sIHRhcmdldHMpID0+IHtcbiAgICAgIHBvb2wuZW1pdCgnY29ubmVjdCcsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdKVxuICAgIH1cblxuICAgIHRoaXNba09uRGlzY29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIHBvb2wuZW1pdCgnZGlzY29ubmVjdCcsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdLCBlcnIpXG4gICAgfVxuXG4gICAgdGhpc1trT25Db25uZWN0aW9uRXJyb3JdID0gKG9yaWdpbiwgdGFyZ2V0cywgZXJyKSA9PiB7XG4gICAgICBwb29sLmVtaXQoJ2Nvbm5lY3Rpb25FcnJvcicsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdLCBlcnIpXG4gICAgfVxuXG4gICAgdGhpc1trU3RhdHNdID0gbmV3IFBvb2xTdGF0cyh0aGlzKVxuICB9XG5cbiAgZ2V0IFtrQnVzeV0gKCkge1xuICAgIHJldHVybiB0aGlzW2tOZWVkRHJhaW5dXG4gIH1cblxuICBnZXQgW2tDb25uZWN0ZWRdICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ2xpZW50c10uZmlsdGVyKGNsaWVudCA9PiBjbGllbnRba0Nvbm5lY3RlZF0pLmxlbmd0aFxuICB9XG5cbiAgZ2V0IFtrRnJlZV0gKCkge1xuICAgIHJldHVybiB0aGlzW2tDbGllbnRzXS5maWx0ZXIoY2xpZW50ID0+IGNsaWVudFtrQ29ubmVjdGVkXSAmJiAhY2xpZW50W2tOZWVkRHJhaW5dKS5sZW5ndGhcbiAgfVxuXG4gIGdldCBba1BlbmRpbmddICgpIHtcbiAgICBsZXQgcmV0ID0gdGhpc1trUXVldWVkXVxuICAgIGZvciAoY29uc3QgeyBba1BlbmRpbmddOiBwZW5kaW5nIH0gb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIHJldCArPSBwZW5kaW5nXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGdldCBba1J1bm5pbmddICgpIHtcbiAgICBsZXQgcmV0ID0gMFxuICAgIGZvciAoY29uc3QgeyBba1J1bm5pbmddOiBydW5uaW5nIH0gb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIHJldCArPSBydW5uaW5nXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGdldCBba1NpemVdICgpIHtcbiAgICBsZXQgcmV0ID0gdGhpc1trUXVldWVkXVxuICAgIGZvciAoY29uc3QgeyBba1NpemVdOiBzaXplIH0gb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIHJldCArPSBzaXplXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGdldCBzdGF0cyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1N0YXRzXVxuICB9XG5cbiAgYXN5bmMgW2tDbG9zZV0gKCkge1xuICAgIGlmICh0aGlzW2tRdWV1ZV0uaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpc1trQ2xpZW50c10ubWFwKGMgPT4gYy5jbG9zZSgpKSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXNba0Nsb3NlZFJlc29sdmVdID0gcmVzb2x2ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBba0Rlc3Ryb3ldIChlcnIpIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXNba1F1ZXVlXS5zaGlmdCgpXG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGl0ZW0uaGFuZGxlci5vbkVycm9yKGVycilcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpc1trQ2xpZW50c10ubWFwKGMgPT4gYy5kZXN0cm95KGVycikpKVxuICB9XG5cbiAgW2tEaXNwYXRjaF0gKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpc1trR2V0RGlzcGF0Y2hlcl0oKVxuXG4gICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICB0aGlzW2tOZWVkRHJhaW5dID0gdHJ1ZVxuICAgICAgdGhpc1trUXVldWVdLnB1c2goeyBvcHRzLCBoYW5kbGVyIH0pXG4gICAgICB0aGlzW2tRdWV1ZWRdKytcbiAgICB9IGVsc2UgaWYgKCFkaXNwYXRjaGVyLmRpc3BhdGNoKG9wdHMsIGhhbmRsZXIpKSB7XG4gICAgICBkaXNwYXRjaGVyW2tOZWVkRHJhaW5dID0gdHJ1ZVxuICAgICAgdGhpc1trTmVlZERyYWluXSA9ICF0aGlzW2tHZXREaXNwYXRjaGVyXSgpXG4gICAgfVxuXG4gICAgcmV0dXJuICF0aGlzW2tOZWVkRHJhaW5dXG4gIH1cblxuICBba0FkZENsaWVudF0gKGNsaWVudCkge1xuICAgIGNsaWVudFxuICAgICAgLm9uKCdkcmFpbicsIHRoaXNba09uRHJhaW5dKVxuICAgICAgLm9uKCdjb25uZWN0JywgdGhpc1trT25Db25uZWN0XSlcbiAgICAgIC5vbignZGlzY29ubmVjdCcsIHRoaXNba09uRGlzY29ubmVjdF0pXG4gICAgICAub24oJ2Nvbm5lY3Rpb25FcnJvcicsIHRoaXNba09uQ29ubmVjdGlvbkVycm9yXSlcblxuICAgIHRoaXNba0NsaWVudHNdLnB1c2goY2xpZW50KVxuXG4gICAgaWYgKHRoaXNba05lZWREcmFpbl0pIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBpZiAodGhpc1trTmVlZERyYWluXSkge1xuICAgICAgICAgIHRoaXNba09uRHJhaW5dKGNsaWVudFtrVXJsXSwgW3RoaXMsIGNsaWVudF0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIFtrUmVtb3ZlQ2xpZW50XSAoY2xpZW50KSB7XG4gICAgY2xpZW50LmNsb3NlKCgpID0+IHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXNba0NsaWVudHNdLmluZGV4T2YoY2xpZW50KVxuICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgdGhpc1trQ2xpZW50c10uc3BsaWNlKGlkeCwgMSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpc1trTmVlZERyYWluXSA9IHRoaXNba0NsaWVudHNdLnNvbWUoZGlzcGF0Y2hlciA9PiAoXG4gICAgICAhZGlzcGF0Y2hlcltrTmVlZERyYWluXSAmJlxuICAgICAgZGlzcGF0Y2hlci5jbG9zZWQgIT09IHRydWUgJiZcbiAgICAgIGRpc3BhdGNoZXIuZGVzdHJveWVkICE9PSB0cnVlXG4gICAgKSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgUG9vbEJhc2UsXG4gIGtDbGllbnRzLFxuICBrTmVlZERyYWluLFxuICBrQWRkQ2xpZW50LFxuICBrUmVtb3ZlQ2xpZW50LFxuICBrR2V0RGlzcGF0Y2hlclxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBQb29sQmFzZSxcbiAga0NsaWVudHMsXG4gIGtOZWVkRHJhaW4sXG4gIGtBZGRDbGllbnQsXG4gIGtHZXREaXNwYXRjaGVyXG59ID0gcmVxdWlyZSgnLi9wb29sLWJhc2UnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9jbGllbnQnKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvclxufSA9IHJlcXVpcmUoJy4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IHsga1VybCwga0ludGVyY2VwdG9ycyB9ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuL2NvcmUvY29ubmVjdCcpXG5cbmNvbnN0IGtPcHRpb25zID0gU3ltYm9sKCdvcHRpb25zJylcbmNvbnN0IGtDb25uZWN0aW9ucyA9IFN5bWJvbCgnY29ubmVjdGlvbnMnKVxuY29uc3Qga0ZhY3RvcnkgPSBTeW1ib2woJ2ZhY3RvcnknKVxuXG5mdW5jdGlvbiBkZWZhdWx0RmFjdG9yeSAob3JpZ2luLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgQ2xpZW50KG9yaWdpbiwgb3B0cylcbn1cblxuY2xhc3MgUG9vbCBleHRlbmRzIFBvb2xCYXNlIHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwge1xuICAgIGNvbm5lY3Rpb25zLFxuICAgIGZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSxcbiAgICBjb25uZWN0LFxuICAgIGNvbm5lY3RUaW1lb3V0LFxuICAgIHRscyxcbiAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICBzb2NrZXRQYXRoLFxuICAgIGF1dG9TZWxlY3RGYW1pbHksXG4gICAgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0LFxuICAgIGFsbG93SDIsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICBpZiAoY29ubmVjdGlvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShjb25uZWN0aW9ucykgfHwgY29ubmVjdGlvbnMgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNvbm5lY3Rpb25zJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAhPSBudWxsICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdjb25uZWN0IG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29ubmVjdCA9IGJ1aWxkQ29ubmVjdG9yKHtcbiAgICAgICAgLi4udGxzLFxuICAgICAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICAgICAgYWxsb3dIMixcbiAgICAgICAgc29ja2V0UGF0aCxcbiAgICAgICAgdGltZW91dDogY29ubmVjdFRpbWVvdXQsXG4gICAgICAgIC4uLih1dGlsLm5vZGVIYXNBdXRvU2VsZWN0RmFtaWx5ICYmIGF1dG9TZWxlY3RGYW1pbHkgPyB7IGF1dG9TZWxlY3RGYW1pbHksIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCB9IDogdW5kZWZpbmVkKSxcbiAgICAgICAgLi4uY29ubmVjdFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0aW9ucy5pbnRlcmNlcHRvcnMgJiYgb3B0aW9ucy5pbnRlcmNlcHRvcnMuUG9vbCAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW50ZXJjZXB0b3JzLlBvb2wpXG4gICAgICA/IG9wdGlvbnMuaW50ZXJjZXB0b3JzLlBvb2xcbiAgICAgIDogW11cbiAgICB0aGlzW2tDb25uZWN0aW9uc10gPSBjb25uZWN0aW9ucyB8fCBudWxsXG4gICAgdGhpc1trVXJsXSA9IHV0aWwucGFyc2VPcmlnaW4ob3JpZ2luKVxuICAgIHRoaXNba09wdGlvbnNdID0geyAuLi51dGlsLmRlZXBDbG9uZShvcHRpb25zKSwgY29ubmVjdCwgYWxsb3dIMiB9XG4gICAgdGhpc1trT3B0aW9uc10uaW50ZXJjZXB0b3JzID0gb3B0aW9ucy5pbnRlcmNlcHRvcnNcbiAgICAgID8geyAuLi5vcHRpb25zLmludGVyY2VwdG9ycyB9XG4gICAgICA6IHVuZGVmaW5lZFxuICAgIHRoaXNba0ZhY3RvcnldID0gZmFjdG9yeVxuICB9XG5cbiAgW2tHZXREaXNwYXRjaGVyXSAoKSB7XG4gICAgbGV0IGRpc3BhdGNoZXIgPSB0aGlzW2tDbGllbnRzXS5maW5kKGRpc3BhdGNoZXIgPT4gIWRpc3BhdGNoZXJba05lZWREcmFpbl0pXG5cbiAgICBpZiAoZGlzcGF0Y2hlcikge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgICB9XG5cbiAgICBpZiAoIXRoaXNba0Nvbm5lY3Rpb25zXSB8fCB0aGlzW2tDbGllbnRzXS5sZW5ndGggPCB0aGlzW2tDb25uZWN0aW9uc10pIHtcbiAgICAgIGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XSh0aGlzW2tVcmxdLCB0aGlzW2tPcHRpb25zXSlcbiAgICAgIHRoaXNba0FkZENsaWVudF0oZGlzcGF0Y2hlcilcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzcGF0Y2hlclxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUG9vbFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvcixcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3Jcbn0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IHtcbiAgUG9vbEJhc2UsXG4gIGtDbGllbnRzLFxuICBrTmVlZERyYWluLFxuICBrQWRkQ2xpZW50LFxuICBrUmVtb3ZlQ2xpZW50LFxuICBrR2V0RGlzcGF0Y2hlclxufSA9IHJlcXVpcmUoJy4vcG9vbC1iYXNlJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuL3Bvb2wnKVxuY29uc3QgeyBrVXJsLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IHBhcnNlT3JpZ2luIH0gPSByZXF1aXJlKCcuL2NvcmUvdXRpbCcpXG5jb25zdCBrRmFjdG9yeSA9IFN5bWJvbCgnZmFjdG9yeScpXG5cbmNvbnN0IGtPcHRpb25zID0gU3ltYm9sKCdvcHRpb25zJylcbmNvbnN0IGtHcmVhdGVzdENvbW1vbkRpdmlzb3IgPSBTeW1ib2woJ2tHcmVhdGVzdENvbW1vbkRpdmlzb3InKVxuY29uc3Qga0N1cnJlbnRXZWlnaHQgPSBTeW1ib2woJ2tDdXJyZW50V2VpZ2h0JylcbmNvbnN0IGtJbmRleCA9IFN5bWJvbCgna0luZGV4JylcbmNvbnN0IGtXZWlnaHQgPSBTeW1ib2woJ2tXZWlnaHQnKVxuY29uc3Qga01heFdlaWdodFBlclNlcnZlciA9IFN5bWJvbCgna01heFdlaWdodFBlclNlcnZlcicpXG5jb25zdCBrRXJyb3JQZW5hbHR5ID0gU3ltYm9sKCdrRXJyb3JQZW5hbHR5JylcblxuZnVuY3Rpb24gZ2V0R3JlYXRlc3RDb21tb25EaXZpc29yIChhLCBiKSB7XG4gIGlmIChiID09PSAwKSByZXR1cm4gYVxuICByZXR1cm4gZ2V0R3JlYXRlc3RDb21tb25EaXZpc29yKGIsIGEgJSBiKVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0RmFjdG9yeSAob3JpZ2luLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgUG9vbChvcmlnaW4sIG9wdHMpXG59XG5cbmNsYXNzIEJhbGFuY2VkUG9vbCBleHRlbmRzIFBvb2xCYXNlIHtcbiAgY29uc3RydWN0b3IgKHVwc3RyZWFtcyA9IFtdLCB7IGZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSwgLi4ub3B0cyB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tPcHRpb25zXSA9IG9wdHNcbiAgICB0aGlzW2tJbmRleF0gPSAtMVxuICAgIHRoaXNba0N1cnJlbnRXZWlnaHRdID0gMFxuXG4gICAgdGhpc1trTWF4V2VpZ2h0UGVyU2VydmVyXSA9IHRoaXNba09wdGlvbnNdLm1heFdlaWdodFBlclNlcnZlciB8fCAxMDBcbiAgICB0aGlzW2tFcnJvclBlbmFsdHldID0gdGhpc1trT3B0aW9uc10uZXJyb3JQZW5hbHR5IHx8IDE1XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodXBzdHJlYW1zKSkge1xuICAgICAgdXBzdHJlYW1zID0gW3Vwc3RyZWFtc11cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0cy5pbnRlcmNlcHRvcnMgJiYgb3B0cy5pbnRlcmNlcHRvcnMuQmFsYW5jZWRQb29sICYmIEFycmF5LmlzQXJyYXkob3B0cy5pbnRlcmNlcHRvcnMuQmFsYW5jZWRQb29sKVxuICAgICAgPyBvcHRzLmludGVyY2VwdG9ycy5CYWxhbmNlZFBvb2xcbiAgICAgIDogW11cbiAgICB0aGlzW2tGYWN0b3J5XSA9IGZhY3RvcnlcblxuICAgIGZvciAoY29uc3QgdXBzdHJlYW0gb2YgdXBzdHJlYW1zKSB7XG4gICAgICB0aGlzLmFkZFVwc3RyZWFtKHVwc3RyZWFtKVxuICAgIH1cbiAgICB0aGlzLl91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cygpXG4gIH1cblxuICBhZGRVcHN0cmVhbSAodXBzdHJlYW0pIHtcbiAgICBjb25zdCB1cHN0cmVhbU9yaWdpbiA9IHBhcnNlT3JpZ2luKHVwc3RyZWFtKS5vcmlnaW5cblxuICAgIGlmICh0aGlzW2tDbGllbnRzXS5maW5kKChwb29sKSA9PiAoXG4gICAgICBwb29sW2tVcmxdLm9yaWdpbiA9PT0gdXBzdHJlYW1PcmlnaW4gJiZcbiAgICAgIHBvb2wuY2xvc2VkICE9PSB0cnVlICYmXG4gICAgICBwb29sLmRlc3Ryb3llZCAhPT0gdHJ1ZVxuICAgICkpKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgICBjb25zdCBwb29sID0gdGhpc1trRmFjdG9yeV0odXBzdHJlYW1PcmlnaW4sIE9iamVjdC5hc3NpZ24oe30sIHRoaXNba09wdGlvbnNdKSlcblxuICAgIHRoaXNba0FkZENsaWVudF0ocG9vbClcbiAgICBwb29sLm9uKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgcG9vbFtrV2VpZ2h0XSA9IE1hdGgubWluKHRoaXNba01heFdlaWdodFBlclNlcnZlcl0sIHBvb2xba1dlaWdodF0gKyB0aGlzW2tFcnJvclBlbmFsdHldKVxuICAgIH0pXG5cbiAgICBwb29sLm9uKCdjb25uZWN0aW9uRXJyb3InLCAoKSA9PiB7XG4gICAgICBwb29sW2tXZWlnaHRdID0gTWF0aC5tYXgoMSwgcG9vbFtrV2VpZ2h0XSAtIHRoaXNba0Vycm9yUGVuYWx0eV0pXG4gICAgICB0aGlzLl91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cygpXG4gICAgfSlcblxuICAgIHBvb2wub24oJ2Rpc2Nvbm5lY3QnLCAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgZXJyID0gYXJnc1syXVxuICAgICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ1VORF9FUlJfU09DS0VUJykge1xuICAgICAgICAvLyBkZWNyZWFzZSB0aGUgd2VpZ2h0IG9mIHRoZSBwb29sLlxuICAgICAgICBwb29sW2tXZWlnaHRdID0gTWF0aC5tYXgoMSwgcG9vbFtrV2VpZ2h0XSAtIHRoaXNba0Vycm9yUGVuYWx0eV0pXG4gICAgICAgIHRoaXMuX3VwZGF0ZUJhbGFuY2VkUG9vbFN0YXRzKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBjbGllbnQgb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIGNsaWVudFtrV2VpZ2h0XSA9IHRoaXNba01heFdlaWdodFBlclNlcnZlcl1cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cygpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX3VwZGF0ZUJhbGFuY2VkUG9vbFN0YXRzICgpIHtcbiAgICB0aGlzW2tHcmVhdGVzdENvbW1vbkRpdmlzb3JdID0gdGhpc1trQ2xpZW50c10ubWFwKHAgPT4gcFtrV2VpZ2h0XSkucmVkdWNlKGdldEdyZWF0ZXN0Q29tbW9uRGl2aXNvciwgMClcbiAgfVxuXG4gIHJlbW92ZVVwc3RyZWFtICh1cHN0cmVhbSkge1xuICAgIGNvbnN0IHVwc3RyZWFtT3JpZ2luID0gcGFyc2VPcmlnaW4odXBzdHJlYW0pLm9yaWdpblxuXG4gICAgY29uc3QgcG9vbCA9IHRoaXNba0NsaWVudHNdLmZpbmQoKHBvb2wpID0+IChcbiAgICAgIHBvb2xba1VybF0ub3JpZ2luID09PSB1cHN0cmVhbU9yaWdpbiAmJlxuICAgICAgcG9vbC5jbG9zZWQgIT09IHRydWUgJiZcbiAgICAgIHBvb2wuZGVzdHJveWVkICE9PSB0cnVlXG4gICAgKSlcblxuICAgIGlmIChwb29sKSB7XG4gICAgICB0aGlzW2tSZW1vdmVDbGllbnRdKHBvb2wpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGdldCB1cHN0cmVhbXMgKCkge1xuICAgIHJldHVybiB0aGlzW2tDbGllbnRzXVxuICAgICAgLmZpbHRlcihkaXNwYXRjaGVyID0+IGRpc3BhdGNoZXIuY2xvc2VkICE9PSB0cnVlICYmIGRpc3BhdGNoZXIuZGVzdHJveWVkICE9PSB0cnVlKVxuICAgICAgLm1hcCgocCkgPT4gcFtrVXJsXS5vcmlnaW4pXG4gIH1cblxuICBba0dldERpc3BhdGNoZXJdICgpIHtcbiAgICAvLyBXZSB2YWxpZGF0ZSB0aGF0IHBvb2xzIGlzIGdyZWF0ZXIgdGhhbiAwLFxuICAgIC8vIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHRvIHdhaXQgdW50aWwgYW4gdXBzdHJlYW1cbiAgICAvLyBpcyBhZGRlZCwgd2hpY2ggbWlnaHQgbmV2ZXIgaGFwcGVuLlxuICAgIGlmICh0aGlzW2tDbGllbnRzXS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvcigpXG4gICAgfVxuXG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXNba0NsaWVudHNdLmZpbmQoZGlzcGF0Y2hlciA9PiAoXG4gICAgICAhZGlzcGF0Y2hlcltrTmVlZERyYWluXSAmJlxuICAgICAgZGlzcGF0Y2hlci5jbG9zZWQgIT09IHRydWUgJiZcbiAgICAgIGRpc3BhdGNoZXIuZGVzdHJveWVkICE9PSB0cnVlXG4gICAgKSlcblxuICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYWxsQ2xpZW50c0J1c3kgPSB0aGlzW2tDbGllbnRzXS5tYXAocG9vbCA9PiBwb29sW2tOZWVkRHJhaW5dKS5yZWR1Y2UoKGEsIGIpID0+IGEgJiYgYiwgdHJ1ZSlcblxuICAgIGlmIChhbGxDbGllbnRzQnVzeSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IGNvdW50ZXIgPSAwXG5cbiAgICBsZXQgbWF4V2VpZ2h0SW5kZXggPSB0aGlzW2tDbGllbnRzXS5maW5kSW5kZXgocG9vbCA9PiAhcG9vbFtrTmVlZERyYWluXSlcblxuICAgIHdoaWxlIChjb3VudGVyKysgPCB0aGlzW2tDbGllbnRzXS5sZW5ndGgpIHtcbiAgICAgIHRoaXNba0luZGV4XSA9ICh0aGlzW2tJbmRleF0gKyAxKSAlIHRoaXNba0NsaWVudHNdLmxlbmd0aFxuICAgICAgY29uc3QgcG9vbCA9IHRoaXNba0NsaWVudHNdW3RoaXNba0luZGV4XV1cblxuICAgICAgLy8gZmluZCBwb29sIGluZGV4IHdpdGggdGhlIGxhcmdlc3Qgd2VpZ2h0XG4gICAgICBpZiAocG9vbFtrV2VpZ2h0XSA+IHRoaXNba0NsaWVudHNdW21heFdlaWdodEluZGV4XVtrV2VpZ2h0XSAmJiAhcG9vbFtrTmVlZERyYWluXSkge1xuICAgICAgICBtYXhXZWlnaHRJbmRleCA9IHRoaXNba0luZGV4XVxuICAgICAgfVxuXG4gICAgICAvLyBkZWNyZWFzZSB0aGUgY3VycmVudCB3ZWlnaHQgZXZlcnkgYHRoaXNba0NsaWVudHNdLmxlbmd0aGAuXG4gICAgICBpZiAodGhpc1trSW5kZXhdID09PSAwKSB7XG4gICAgICAgIC8vIFNldCB0aGUgY3VycmVudCB3ZWlnaHQgdG8gdGhlIG5leHQgbG93ZXIgd2VpZ2h0LlxuICAgICAgICB0aGlzW2tDdXJyZW50V2VpZ2h0XSA9IHRoaXNba0N1cnJlbnRXZWlnaHRdIC0gdGhpc1trR3JlYXRlc3RDb21tb25EaXZpc29yXVxuXG4gICAgICAgIGlmICh0aGlzW2tDdXJyZW50V2VpZ2h0XSA8PSAwKSB7XG4gICAgICAgICAgdGhpc1trQ3VycmVudFdlaWdodF0gPSB0aGlzW2tNYXhXZWlnaHRQZXJTZXJ2ZXJdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwb29sW2tXZWlnaHRdID49IHRoaXNba0N1cnJlbnRXZWlnaHRdICYmICghcG9vbFtrTmVlZERyYWluXSkpIHtcbiAgICAgICAgcmV0dXJuIHBvb2xcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzW2tDdXJyZW50V2VpZ2h0XSA9IHRoaXNba0NsaWVudHNdW21heFdlaWdodEluZGV4XVtrV2VpZ2h0XVxuICAgIHRoaXNba0luZGV4XSA9IG1heFdlaWdodEluZGV4XG4gICAgcmV0dXJuIHRoaXNba0NsaWVudHNdW21heFdlaWdodEluZGV4XVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQmFsYW5jZWRQb29sXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZTogb25seSBmb3IgTm9kZSAxMiAqL1xuXG5jb25zdCB7IGtDb25uZWN0ZWQsIGtTaXplIH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuXG5jbGFzcyBDb21wYXRXZWFrUmVmIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICBkZXJlZiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVba0Nvbm5lY3RlZF0gPT09IDAgJiYgdGhpcy52YWx1ZVtrU2l6ZV0gPT09IDBcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMudmFsdWVcbiAgfVxufVxuXG5jbGFzcyBDb21wYXRGaW5hbGl6ZXIge1xuICBjb25zdHJ1Y3RvciAoZmluYWxpemVyKSB7XG4gICAgdGhpcy5maW5hbGl6ZXIgPSBmaW5hbGl6ZXJcbiAgfVxuXG4gIHJlZ2lzdGVyIChkaXNwYXRjaGVyLCBrZXkpIHtcbiAgICBpZiAoZGlzcGF0Y2hlci5vbikge1xuICAgICAgZGlzcGF0Y2hlci5vbignZGlzY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgaWYgKGRpc3BhdGNoZXJba0Nvbm5lY3RlZF0gPT09IDAgJiYgZGlzcGF0Y2hlcltrU2l6ZV0gPT09IDApIHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXplcihrZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICAvLyBGSVhNRTogcmVtb3ZlIHdvcmthcm91bmQgd2hlbiB0aGUgTm9kZSBidWcgaXMgZml4ZWRcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy80OTM0NCNpc3N1ZWNvbW1lbnQtMTc0MTc3NjMwOFxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9WOF9DT1ZFUkFHRSkge1xuICAgIHJldHVybiB7XG4gICAgICBXZWFrUmVmOiBDb21wYXRXZWFrUmVmLFxuICAgICAgRmluYWxpemF0aW9uUmVnaXN0cnk6IENvbXBhdEZpbmFsaXplclxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIFdlYWtSZWY6IGdsb2JhbC5XZWFrUmVmIHx8IENvbXBhdFdlYWtSZWYsXG4gICAgRmluYWxpemF0aW9uUmVnaXN0cnk6IGdsb2JhbC5GaW5hbGl6YXRpb25SZWdpc3RyeSB8fCBDb21wYXRGaW5hbGl6ZXJcbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IGtDbGllbnRzLCBrUnVubmluZywga0Nsb3NlLCBrRGVzdHJveSwga0Rpc3BhdGNoLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCBEaXNwYXRjaGVyQmFzZSA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlci1iYXNlJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuL3Bvb2wnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9jbGllbnQnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IGNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSByZXF1aXJlKCcuL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3InKVxuY29uc3QgeyBXZWFrUmVmLCBGaW5hbGl6YXRpb25SZWdpc3RyeSB9ID0gcmVxdWlyZSgnLi9jb21wYXQvZGlzcGF0Y2hlci13ZWFrcmVmJykoKVxuXG5jb25zdCBrT25Db25uZWN0ID0gU3ltYm9sKCdvbkNvbm5lY3QnKVxuY29uc3Qga09uRGlzY29ubmVjdCA9IFN5bWJvbCgnb25EaXNjb25uZWN0JylcbmNvbnN0IGtPbkNvbm5lY3Rpb25FcnJvciA9IFN5bWJvbCgnb25Db25uZWN0aW9uRXJyb3InKVxuY29uc3Qga01heFJlZGlyZWN0aW9ucyA9IFN5bWJvbCgnbWF4UmVkaXJlY3Rpb25zJylcbmNvbnN0IGtPbkRyYWluID0gU3ltYm9sKCdvbkRyYWluJylcbmNvbnN0IGtGYWN0b3J5ID0gU3ltYm9sKCdmYWN0b3J5JylcbmNvbnN0IGtGaW5hbGl6ZXIgPSBTeW1ib2woJ2ZpbmFsaXplcicpXG5jb25zdCBrT3B0aW9ucyA9IFN5bWJvbCgnb3B0aW9ucycpXG5cbmZ1bmN0aW9uIGRlZmF1bHRGYWN0b3J5IChvcmlnaW4sIG9wdHMpIHtcbiAgcmV0dXJuIG9wdHMgJiYgb3B0cy5jb25uZWN0aW9ucyA9PT0gMVxuICAgID8gbmV3IENsaWVudChvcmlnaW4sIG9wdHMpXG4gICAgOiBuZXcgUG9vbChvcmlnaW4sIG9wdHMpXG59XG5cbmNsYXNzIEFnZW50IGV4dGVuZHMgRGlzcGF0Y2hlckJhc2Uge1xuICBjb25zdHJ1Y3RvciAoeyBmYWN0b3J5ID0gZGVmYXVsdEZhY3RvcnksIG1heFJlZGlyZWN0aW9ucyA9IDAsIGNvbm5lY3QsIC4uLm9wdGlvbnMgfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuXG4gICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ZhY3RvcnkgbXVzdCBiZSBhIGZ1bmN0aW9uLicpXG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3QgIT0gbnVsbCAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignY29ubmVjdCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0JylcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVkaXJlY3Rpb25zKSB8fCBtYXhSZWRpcmVjdGlvbnMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heFJlZGlyZWN0aW9ucyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29ubmVjdCA9IHsgLi4uY29ubmVjdCB9XG4gICAgfVxuXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG9wdGlvbnMuaW50ZXJjZXB0b3JzICYmIG9wdGlvbnMuaW50ZXJjZXB0b3JzLkFnZW50ICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbnRlcmNlcHRvcnMuQWdlbnQpXG4gICAgICA/IG9wdGlvbnMuaW50ZXJjZXB0b3JzLkFnZW50XG4gICAgICA6IFtjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yKHsgbWF4UmVkaXJlY3Rpb25zIH0pXVxuXG4gICAgdGhpc1trT3B0aW9uc10gPSB7IC4uLnV0aWwuZGVlcENsb25lKG9wdGlvbnMpLCBjb25uZWN0IH1cbiAgICB0aGlzW2tPcHRpb25zXS5pbnRlcmNlcHRvcnMgPSBvcHRpb25zLmludGVyY2VwdG9yc1xuICAgICAgPyB7IC4uLm9wdGlvbnMuaW50ZXJjZXB0b3JzIH1cbiAgICAgIDogdW5kZWZpbmVkXG4gICAgdGhpc1trTWF4UmVkaXJlY3Rpb25zXSA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXNba0ZhY3RvcnldID0gZmFjdG9yeVxuICAgIHRoaXNba0NsaWVudHNdID0gbmV3IE1hcCgpXG4gICAgdGhpc1trRmluYWxpemVyXSA9IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZ2MgaXMgdW5kZXRlcm1pbmlzdGljICovIGtleSA9PiB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzW2tDbGllbnRzXS5nZXQoa2V5KVxuICAgICAgaWYgKHJlZiAhPT0gdW5kZWZpbmVkICYmIHJlZi5kZXJlZigpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpc1trQ2xpZW50c10uZGVsZXRlKGtleSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgYWdlbnQgPSB0aGlzXG5cbiAgICB0aGlzW2tPbkRyYWluXSA9IChvcmlnaW4sIHRhcmdldHMpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2RyYWluJywgb3JpZ2luLCBbYWdlbnQsIC4uLnRhcmdldHNdKVxuICAgIH1cblxuICAgIHRoaXNba09uQ29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzKSA9PiB7XG4gICAgICBhZ2VudC5lbWl0KCdjb25uZWN0Jywgb3JpZ2luLCBbYWdlbnQsIC4uLnRhcmdldHNdKVxuICAgIH1cblxuICAgIHRoaXNba09uRGlzY29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLCBvcmlnaW4sIFthZ2VudCwgLi4udGFyZ2V0c10sIGVycilcbiAgICB9XG5cbiAgICB0aGlzW2tPbkNvbm5lY3Rpb25FcnJvcl0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2Nvbm5lY3Rpb25FcnJvcicsIG9yaWdpbiwgW2FnZW50LCAuLi50YXJnZXRzXSwgZXJyKVxuICAgIH1cbiAgfVxuXG4gIGdldCBba1J1bm5pbmddICgpIHtcbiAgICBsZXQgcmV0ID0gMFxuICAgIGZvciAoY29uc3QgcmVmIG9mIHRoaXNba0NsaWVudHNdLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSByZWYuZGVyZWYoKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGdjIGlzIHVuZGV0ZXJtaW5pc3RpYyAqL1xuICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICByZXQgKz0gY2xpZW50W2tSdW5uaW5nXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICBba0Rpc3BhdGNoXSAob3B0cywgaGFuZGxlcikge1xuICAgIGxldCBrZXlcbiAgICBpZiAob3B0cy5vcmlnaW4gJiYgKHR5cGVvZiBvcHRzLm9yaWdpbiA9PT0gJ3N0cmluZycgfHwgb3B0cy5vcmlnaW4gaW5zdGFuY2VvZiBVUkwpKSB7XG4gICAgICBrZXkgPSBTdHJpbmcob3B0cy5vcmlnaW4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cy5vcmlnaW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgVVJMLicpXG4gICAgfVxuXG4gICAgY29uc3QgcmVmID0gdGhpc1trQ2xpZW50c10uZ2V0KGtleSlcblxuICAgIGxldCBkaXNwYXRjaGVyID0gcmVmID8gcmVmLmRlcmVmKCkgOiBudWxsXG4gICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICBkaXNwYXRjaGVyID0gdGhpc1trRmFjdG9yeV0ob3B0cy5vcmlnaW4sIHRoaXNba09wdGlvbnNdKVxuICAgICAgICAub24oJ2RyYWluJywgdGhpc1trT25EcmFpbl0pXG4gICAgICAgIC5vbignY29ubmVjdCcsIHRoaXNba09uQ29ubmVjdF0pXG4gICAgICAgIC5vbignZGlzY29ubmVjdCcsIHRoaXNba09uRGlzY29ubmVjdF0pXG4gICAgICAgIC5vbignY29ubmVjdGlvbkVycm9yJywgdGhpc1trT25Db25uZWN0aW9uRXJyb3JdKVxuXG4gICAgICB0aGlzW2tDbGllbnRzXS5zZXQoa2V5LCBuZXcgV2Vha1JlZihkaXNwYXRjaGVyKSlcbiAgICAgIHRoaXNba0ZpbmFsaXplcl0ucmVnaXN0ZXIoZGlzcGF0Y2hlciwga2V5KVxuICAgIH1cblxuICAgIHJldHVybiBkaXNwYXRjaGVyLmRpc3BhdGNoKG9wdHMsIGhhbmRsZXIpXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgY29uc3QgY2xvc2VQcm9taXNlcyA9IFtdXG4gICAgZm9yIChjb25zdCByZWYgb2YgdGhpc1trQ2xpZW50c10udmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IHJlZi5kZXJlZigpXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogZ2MgaXMgdW5kZXRlcm1pbmlzdGljICovXG4gICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgIGNsb3NlUHJvbWlzZXMucHVzaChjbGllbnQuY2xvc2UoKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChjbG9zZVByb21pc2VzKVxuICB9XG5cbiAgYXN5bmMgW2tEZXN0cm95XSAoZXJyKSB7XG4gICAgY29uc3QgZGVzdHJveVByb21pc2VzID0gW11cbiAgICBmb3IgKGNvbnN0IHJlZiBvZiB0aGlzW2tDbGllbnRzXS52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgY2xpZW50ID0gcmVmLmRlcmVmKClcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBnYyBpcyB1bmRldGVybWluaXN0aWMgKi9cbiAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgZGVzdHJveVByb21pc2VzLnB1c2goY2xpZW50LmRlc3Ryb3koZXJyKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChkZXN0cm95UHJvbWlzZXMpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBZ2VudFxuIiwKICAgICIvLyBQb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9wdWxsLzkwN1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgUmVhZGFibGUgfSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCB7IFJlcXVlc3RBYm9ydGVkRXJyb3IsIE5vdFN1cHBvcnRlZEVycm9yLCBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IFJlYWRhYmxlU3RyZWFtRnJvbSwgdG9VU1ZTdHJpbmcgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmxldCBCbG9iXG5cbmNvbnN0IGtDb25zdW1lID0gU3ltYm9sKCdrQ29uc3VtZScpXG5jb25zdCBrUmVhZGluZyA9IFN5bWJvbCgna1JlYWRpbmcnKVxuY29uc3Qga0JvZHkgPSBTeW1ib2woJ2tCb2R5JylcbmNvbnN0IGtBYm9ydCA9IFN5bWJvbCgnYWJvcnQnKVxuY29uc3Qga0NvbnRlbnRUeXBlID0gU3ltYm9sKCdrQ29udGVudFR5cGUnKVxuXG5jb25zdCBub29wID0gKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBCb2R5UmVhZGFibGUgZXh0ZW5kcyBSZWFkYWJsZSB7XG4gIGNvbnN0cnVjdG9yICh7XG4gICAgcmVzdW1lLFxuICAgIGFib3J0LFxuICAgIGNvbnRlbnRUeXBlID0gJycsXG4gICAgaGlnaFdhdGVyTWFyayA9IDY0ICogMTAyNCAvLyBTYW1lIGFzIG5vZGVqcyBmcyBzdHJlYW1zLlxuICB9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgYXV0b0Rlc3Ryb3k6IHRydWUsXG4gICAgICByZWFkOiByZXN1bWUsXG4gICAgICBoaWdoV2F0ZXJNYXJrXG4gICAgfSlcblxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGF0YUVtaXR0ZWQgPSBmYWxzZVxuXG4gICAgdGhpc1trQWJvcnRdID0gYWJvcnRcbiAgICB0aGlzW2tDb25zdW1lXSA9IG51bGxcbiAgICB0aGlzW2tCb2R5XSA9IG51bGxcbiAgICB0aGlzW2tDb250ZW50VHlwZV0gPSBjb250ZW50VHlwZVxuXG4gICAgLy8gSXMgc3RyZWFtIGJlaW5nIGNvbnN1bWVkIHRocm91Z2ggUmVhZGFibGUgQVBJP1xuICAgIC8vIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHRoYXQgd2UgYXZvaWQgY2hlY2tpbmdcbiAgICAvLyBmb3IgJ2RhdGEnIGFuZCAncmVhZGFibGUnIGxpc3RlbmVycyBpbiB0aGUgaG90IHBhdGhcbiAgICAvLyBpbnNpZGUgcHVzaCgpLlxuICAgIHRoaXNba1JlYWRpbmddID0gZmFsc2VcbiAgfVxuXG4gIGRlc3Ryb3kgKGVycikge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgLy8gTm9kZSA8IDE2XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGlmICghZXJyICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgIGVyciA9IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aGlzW2tBYm9ydF0oKVxuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5kZXN0cm95KGVycilcbiAgfVxuXG4gIGVtaXQgKGV2LCAuLi5hcmdzKSB7XG4gICAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAgIC8vIE5vZGUgPCAxNi43XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRhdGFFbWl0dGVkID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoZXYgPT09ICdlcnJvcicpIHtcbiAgICAgIC8vIE5vZGUgPCAxNlxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlXG4gICAgfVxuICAgIHJldHVybiBzdXBlci5lbWl0KGV2LCAuLi5hcmdzKVxuICB9XG5cbiAgb24gKGV2LCAuLi5hcmdzKSB7XG4gICAgaWYgKGV2ID09PSAnZGF0YScgfHwgZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgIHRoaXNba1JlYWRpbmddID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXIub24oZXYsIC4uLmFyZ3MpXG4gIH1cblxuICBhZGRMaXN0ZW5lciAoZXYsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5vbihldiwgLi4uYXJncylcbiAgfVxuXG4gIG9mZiAoZXYsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZXQgPSBzdXBlci5vZmYoZXYsIC4uLmFyZ3MpXG4gICAgaWYgKGV2ID09PSAnZGF0YScgfHwgZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgIHRoaXNba1JlYWRpbmddID0gKFxuICAgICAgICB0aGlzLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA+IDAgfHxcbiAgICAgICAgdGhpcy5saXN0ZW5lckNvdW50KCdyZWFkYWJsZScpID4gMFxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICByZW1vdmVMaXN0ZW5lciAoZXYsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5vZmYoZXYsIC4uLmFyZ3MpXG4gIH1cblxuICBwdXNoIChjaHVuaykge1xuICAgIGlmICh0aGlzW2tDb25zdW1lXSAmJiBjaHVuayAhPT0gbnVsbCAmJiB0aGlzLnJlYWRhYmxlTGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdW1lUHVzaCh0aGlzW2tDb25zdW1lXSwgY2h1bmspXG4gICAgICByZXR1cm4gdGhpc1trUmVhZGluZ10gPyBzdXBlci5wdXNoKGNodW5rKSA6IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnB1c2goY2h1bmspXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktdGV4dFxuICBhc3luYyB0ZXh0ICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAndGV4dCcpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktanNvblxuICBhc3luYyBqc29uICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAnanNvbicpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktYmxvYlxuICBhc3luYyBibG9iICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAnYmxvYicpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktYXJyYXlidWZmZXJcbiAgYXN5bmMgYXJyYXlCdWZmZXIgKCkge1xuICAgIHJldHVybiBjb25zdW1lKHRoaXMsICdhcnJheUJ1ZmZlcicpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktZm9ybWRhdGFcbiAgYXN5bmMgZm9ybURhdGEgKCkge1xuICAgIC8vIFRPRE86IEltcGxlbWVudC5cbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXJyb3IoKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWJvZHl1c2VkXG4gIGdldCBib2R5VXNlZCAoKSB7XG4gICAgcmV0dXJuIHV0aWwuaXNEaXN0dXJiZWQodGhpcylcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tYm9keS1ib2R5XG4gIGdldCBib2R5ICgpIHtcbiAgICBpZiAoIXRoaXNba0JvZHldKSB7XG4gICAgICB0aGlzW2tCb2R5XSA9IFJlYWRhYmxlU3RyZWFtRnJvbSh0aGlzKVxuICAgICAgaWYgKHRoaXNba0NvbnN1bWVdKSB7XG4gICAgICAgIC8vIFRPRE86IElzIHRoaXMgdGhlIGJlc3Qgd2F5IHRvIGZvcmNlIGEgbG9jaz9cbiAgICAgICAgdGhpc1trQm9keV0uZ2V0UmVhZGVyKCkgLy8gRW5zdXJlIHN0cmVhbSBpcyBsb2NrZWQuXG4gICAgICAgIGFzc2VydCh0aGlzW2tCb2R5XS5sb2NrZWQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzW2tCb2R5XVxuICB9XG5cbiAgZHVtcCAob3B0cykge1xuICAgIGxldCBsaW1pdCA9IG9wdHMgJiYgTnVtYmVyLmlzRmluaXRlKG9wdHMubGltaXQpID8gb3B0cy5saW1pdCA6IDI2MjE0NFxuICAgIGNvbnN0IHNpZ25hbCA9IG9wdHMgJiYgb3B0cy5zaWduYWxcblxuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2lnbmFsICE9PSAnb2JqZWN0JyB8fCAhKCdhYm9ydGVkJyBpbiBzaWduYWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBBYm9ydFNpZ25hbCcpXG4gICAgICAgIH1cbiAgICAgICAgdXRpbC50aHJvd0lmQWJvcnRlZChzaWduYWwpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbClcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsTGlzdGVuZXJDbGVhbnVwID0gc2lnbmFsXG4gICAgICAgID8gdXRpbC5hZGRBYm9ydExpc3RlbmVyKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVzdHJveSgpXG4gICAgICAgIH0pXG4gICAgICAgIDogbm9vcFxuXG4gICAgICB0aGlzXG4gICAgICAgIC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2lnbmFsTGlzdGVuZXJDbGVhbnVwKClcbiAgICAgICAgICBpZiAoc2lnbmFsICYmIHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICByZWplY3Qoc2lnbmFsLnJlYXNvbiB8fCBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCcpLCB7IG5hbWU6ICdBYm9ydEVycm9yJyB9KSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIG5vb3ApXG4gICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgIGxpbWl0IC09IGNodW5rLmxlbmd0aFxuICAgICAgICAgIGlmIChsaW1pdCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnJlc3VtZSgpXG4gICAgfSlcbiAgfVxufVxuXG4vLyBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkYWJsZXN0cmVhbS1sb2NrZWRcbmZ1bmN0aW9uIGlzTG9ja2VkIChzZWxmKSB7XG4gIC8vIENvbnN1bWUgaXMgYW4gaW1wbGljaXQgbG9jay5cbiAgcmV0dXJuIChzZWxmW2tCb2R5XSAmJiBzZWxmW2tCb2R5XS5sb2NrZWQgPT09IHRydWUpIHx8IHNlbGZba0NvbnN1bWVdXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5LXVudXNhYmxlXG5mdW5jdGlvbiBpc1VudXNhYmxlIChzZWxmKSB7XG4gIHJldHVybiB1dGlsLmlzRGlzdHVyYmVkKHNlbGYpIHx8IGlzTG9ja2VkKHNlbGYpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnN1bWUgKHN0cmVhbSwgdHlwZSkge1xuICBpZiAoaXNVbnVzYWJsZShzdHJlYW0pKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW51c2FibGUnKVxuICB9XG5cbiAgYXNzZXJ0KCFzdHJlYW1ba0NvbnN1bWVdKVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc3RyZWFtW2tDb25zdW1lXSA9IHtcbiAgICAgIHR5cGUsXG4gICAgICBzdHJlYW0sXG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgYm9keTogW11cbiAgICB9XG5cbiAgICBzdHJlYW1cbiAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGNvbnN1bWVGaW5pc2godGhpc1trQ29uc3VtZV0sIGVycilcbiAgICAgIH0pXG4gICAgICAub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpc1trQ29uc3VtZV0uYm9keSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN1bWVGaW5pc2godGhpc1trQ29uc3VtZV0sIG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKCkpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICBwcm9jZXNzLm5leHRUaWNrKGNvbnN1bWVTdGFydCwgc3RyZWFtW2tDb25zdW1lXSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gY29uc3VtZVN0YXJ0IChjb25zdW1lKSB7XG4gIGlmIChjb25zdW1lLmJvZHkgPT09IG51bGwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgX3JlYWRhYmxlU3RhdGU6IHN0YXRlIH0gPSBjb25zdW1lLnN0cmVhbVxuXG4gIGZvciAoY29uc3QgY2h1bmsgb2Ygc3RhdGUuYnVmZmVyKSB7XG4gICAgY29uc3VtZVB1c2goY29uc3VtZSwgY2h1bmspXG4gIH1cblxuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIGNvbnN1bWVFbmQodGhpc1trQ29uc3VtZV0pXG4gIH0gZWxzZSB7XG4gICAgY29uc3VtZS5zdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN1bWVFbmQodGhpc1trQ29uc3VtZV0pXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN1bWUuc3RyZWFtLnJlc3VtZSgpXG5cbiAgd2hpbGUgKGNvbnN1bWUuc3RyZWFtLnJlYWQoKSAhPSBudWxsKSB7XG4gICAgLy8gTG9vcFxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVFbmQgKGNvbnN1bWUpIHtcbiAgY29uc3QgeyB0eXBlLCBib2R5LCByZXNvbHZlLCBzdHJlYW0sIGxlbmd0aCB9ID0gY29uc3VtZVxuXG4gIHRyeSB7XG4gICAgaWYgKHR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcmVzb2x2ZSh0b1VTVlN0cmluZyhCdWZmZXIuY29uY2F0KGJvZHkpKSlcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdqc29uJykge1xuICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKEJ1ZmZlci5jb25jYXQoYm9keSkpKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FycmF5QnVmZmVyJykge1xuICAgICAgY29uc3QgZHN0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuXG4gICAgICBsZXQgcG9zID0gMFxuICAgICAgZm9yIChjb25zdCBidWYgb2YgYm9keSkge1xuICAgICAgICBkc3Quc2V0KGJ1ZiwgcG9zKVxuICAgICAgICBwb3MgKz0gYnVmLmJ5dGVMZW5ndGhcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZShkc3QuYnVmZmVyKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgICBpZiAoIUJsb2IpIHtcbiAgICAgICAgQmxvYiA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJsb2JcbiAgICAgIH1cbiAgICAgIHJlc29sdmUobmV3IEJsb2IoYm9keSwgeyB0eXBlOiBzdHJlYW1ba0NvbnRlbnRUeXBlXSB9KSlcbiAgICB9XG5cbiAgICBjb25zdW1lRmluaXNoKGNvbnN1bWUpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdW1lUHVzaCAoY29uc3VtZSwgY2h1bmspIHtcbiAgY29uc3VtZS5sZW5ndGggKz0gY2h1bmsubGVuZ3RoXG4gIGNvbnN1bWUuYm9keS5wdXNoKGNodW5rKVxufVxuXG5mdW5jdGlvbiBjb25zdW1lRmluaXNoIChjb25zdW1lLCBlcnIpIHtcbiAgaWYgKGNvbnN1bWUuYm9keSA9PT0gbnVsbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGVycikge1xuICAgIGNvbnN1bWUucmVqZWN0KGVycilcbiAgfSBlbHNlIHtcbiAgICBjb25zdW1lLnJlc29sdmUoKVxuICB9XG5cbiAgY29uc3VtZS50eXBlID0gbnVsbFxuICBjb25zdW1lLnN0cmVhbSA9IG51bGxcbiAgY29uc3VtZS5yZXNvbHZlID0gbnVsbFxuICBjb25zdW1lLnJlamVjdCA9IG51bGxcbiAgY29uc3VtZS5sZW5ndGggPSAwXG4gIGNvbnN1bWUuYm9keSA9IG51bGxcbn1cbiIsCiAgICAiY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHtcbiAgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IHRvVVNWU3RyaW5nIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuXG5hc3luYyBmdW5jdGlvbiBnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2sgKHsgY2FsbGJhY2ssIGJvZHksIGNvbnRlbnRUeXBlLCBzdGF0dXNDb2RlLCBzdGF0dXNNZXNzYWdlLCBoZWFkZXJzIH0pIHtcbiAgYXNzZXJ0KGJvZHkpXG5cbiAgbGV0IGNodW5rcyA9IFtdXG4gIGxldCBsaW1pdCA9IDBcblxuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGJvZHkpIHtcbiAgICBjaHVua3MucHVzaChjaHVuaylcbiAgICBsaW1pdCArPSBjaHVuay5sZW5ndGhcbiAgICBpZiAobGltaXQgPiAxMjggKiAxMDI0KSB7XG4gICAgICBjaHVua3MgPSBudWxsXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0dXNDb2RlID09PSAyMDQgfHwgIWNvbnRlbnRUeXBlIHx8ICFjaHVua3MpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBuZXcgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IoYFJlc3BvbnNlIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0ke3N0YXR1c01lc3NhZ2UgPyBgOiAke3N0YXR1c01lc3NhZ2V9YCA6ICcnfWAsIHN0YXR1c0NvZGUsIGhlYWRlcnMpKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoY29udGVudFR5cGUuc3RhcnRzV2l0aCgnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZSh0b1VTVlN0cmluZyhCdWZmZXIuY29uY2F0KGNodW5rcykpKVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaywgbmV3IFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKGBSZXNwb25zZSBzdGF0dXMgY29kZSAke3N0YXR1c0NvZGV9JHtzdGF0dXNNZXNzYWdlID8gYDogJHtzdGF0dXNNZXNzYWdlfWAgOiAnJ31gLCBzdGF0dXNDb2RlLCBoZWFkZXJzLCBwYXlsb2FkKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjb250ZW50VHlwZS5zdGFydHNXaXRoKCd0ZXh0LycpKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdG9VU1ZTdHJpbmcoQnVmZmVyLmNvbmNhdChjaHVua3MpKVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaywgbmV3IFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKGBSZXNwb25zZSBzdGF0dXMgY29kZSAke3N0YXR1c0NvZGV9JHtzdGF0dXNNZXNzYWdlID8gYDogJHtzdGF0dXNNZXNzYWdlfWAgOiAnJ31gLCBzdGF0dXNDb2RlLCBoZWFkZXJzLCBwYXlsb2FkKSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gUHJvY2VzcyBpbiBhIGZhbGxiYWNrIGlmIGVycm9yXG4gIH1cblxuICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBuZXcgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IoYFJlc3BvbnNlIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0ke3N0YXR1c01lc3NhZ2UgPyBgOiAke3N0YXR1c01lc3NhZ2V9YCA6ICcnfWAsIHN0YXR1c0NvZGUsIGhlYWRlcnMpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrIH1cbiIsCiAgICAiY29uc3QgeyBhZGRBYm9ydExpc3RlbmVyIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBSZXF1ZXN0QWJvcnRlZEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbmNvbnN0IGtMaXN0ZW5lciA9IFN5bWJvbCgna0xpc3RlbmVyJylcbmNvbnN0IGtTaWduYWwgPSBTeW1ib2woJ2tTaWduYWwnKVxuXG5mdW5jdGlvbiBhYm9ydCAoc2VsZikge1xuICBpZiAoc2VsZi5hYm9ydCkge1xuICAgIHNlbGYuYWJvcnQoKVxuICB9IGVsc2Uge1xuICAgIHNlbGYub25FcnJvcihuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFNpZ25hbCAoc2VsZiwgc2lnbmFsKSB7XG4gIHNlbGZba1NpZ25hbF0gPSBudWxsXG4gIHNlbGZba0xpc3RlbmVyXSA9IG51bGxcblxuICBpZiAoIXNpZ25hbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgYWJvcnQoc2VsZilcbiAgICByZXR1cm5cbiAgfVxuXG4gIHNlbGZba1NpZ25hbF0gPSBzaWduYWxcbiAgc2VsZltrTGlzdGVuZXJdID0gKCkgPT4ge1xuICAgIGFib3J0KHNlbGYpXG4gIH1cblxuICBhZGRBYm9ydExpc3RlbmVyKHNlbGZba1NpZ25hbF0sIHNlbGZba0xpc3RlbmVyXSlcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2lnbmFsIChzZWxmKSB7XG4gIGlmICghc2VsZltrU2lnbmFsXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKCdyZW1vdmVFdmVudExpc3RlbmVyJyBpbiBzZWxmW2tTaWduYWxdKSB7XG4gICAgc2VsZltrU2lnbmFsXS5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHNlbGZba0xpc3RlbmVyXSlcbiAgfSBlbHNlIHtcbiAgICBzZWxmW2tTaWduYWxdLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIHNlbGZba0xpc3RlbmVyXSlcbiAgfVxuXG4gIHNlbGZba1NpZ25hbF0gPSBudWxsXG4gIHNlbGZba0xpc3RlbmVyXSA9IG51bGxcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFkZFNpZ25hbCxcbiAgcmVtb3ZlU2lnbmFsXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vcmVhZGFibGUnKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2sgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEFzeW5jUmVzb3VyY2UgfSA9IHJlcXVpcmUoJ2FzeW5jX2hvb2tzJylcbmNvbnN0IHsgYWRkU2lnbmFsLCByZW1vdmVTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWJvcnQtc2lnbmFsJylcblxuY2xhc3MgUmVxdWVzdEhhbmRsZXIgZXh0ZW5kcyBBc3luY1Jlc291cmNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBtZXRob2QsIG9wYXF1ZSwgYm9keSwgb25JbmZvLCByZXNwb25zZUhlYWRlcnMsIHRocm93T25FcnJvciwgaGlnaFdhdGVyTWFyayB9ID0gb3B0c1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICAgIH1cblxuICAgICAgaWYgKGhpZ2hXYXRlck1hcmsgJiYgKHR5cGVvZiBoaWdoV2F0ZXJNYXJrICE9PSAnbnVtYmVyJyB8fCBoaWdoV2F0ZXJNYXJrIDwgMCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGhpZ2hXYXRlck1hcmsnKVxuICAgICAgfVxuXG4gICAgICBpZiAoc2lnbmFsICYmIHR5cGVvZiBzaWduYWwub24gIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gRXZlbnRFbWl0dGVyIG9yIEV2ZW50VGFyZ2V0JylcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBtZXRob2QnKVxuICAgICAgfVxuXG4gICAgICBpZiAob25JbmZvICYmIHR5cGVvZiBvbkluZm8gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSW5mbyBjYWxsYmFjaycpXG4gICAgICB9XG5cbiAgICAgIHN1cGVyKCdVTkRJQ0lfUkVRVUVTVCcpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgICAgICB1dGlsLmRlc3Ryb3koYm9keS5vbignZXJyb3InLCB1dGlsLm5vcCksIGVycilcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cblxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgdGhpcy5yZXMgPSBudWxsXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgdGhpcy50cmFpbGVycyA9IHt9XG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbFxuICAgIHRoaXMub25JbmZvID0gb25JbmZvIHx8IG51bGxcbiAgICB0aGlzLnRocm93T25FcnJvciA9IHRocm93T25FcnJvclxuICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IGhpZ2hXYXRlck1hcmtcblxuICAgIGlmICh1dGlsLmlzU3RyZWFtKGJvZHkpKSB7XG4gICAgICBib2R5Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycilcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgYWRkU2lnbmFsKHRoaXMsIHNpZ25hbClcbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQsIGNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuY2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHJlc3VtZSwgc3RhdHVzTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgY2FsbGJhY2ssIG9wYXF1ZSwgYWJvcnQsIGNvbnRleHQsIHJlc3BvbnNlSGVhZGVycywgaGlnaFdhdGVyTWFyayB9ID0gdGhpc1xuXG4gICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgaWYgKHRoaXMub25JbmZvKSB7XG4gICAgICAgIHRoaXMub25JbmZvKHsgc3RhdHVzQ29kZSwgaGVhZGVycyB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSA6IGhlYWRlcnNcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHBhcnNlZEhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddXG4gICAgY29uc3QgYm9keSA9IG5ldyBSZWFkYWJsZSh7IHJlc3VtZSwgYWJvcnQsIGNvbnRlbnRUeXBlLCBoaWdoV2F0ZXJNYXJrIH0pXG5cbiAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgIHRoaXMucmVzID0gYm9keVxuICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMudGhyb3dPbkVycm9yICYmIHN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGdldFJlc29sdmVFcnJvckJvZHlDYWxsYmFjaywgbnVsbCxcbiAgICAgICAgICB7IGNhbGxiYWNrLCBib2R5LCBjb250ZW50VHlwZSwgc3RhdHVzQ29kZSwgc3RhdHVzTWVzc2FnZSwgaGVhZGVycyB9XG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGNhbGxiYWNrLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIHRyYWlsZXJzOiB0aGlzLnRyYWlsZXJzLFxuICAgICAgICAgIG9wYXF1ZSxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRhdGEgKGNodW5rKSB7XG4gICAgY29uc3QgeyByZXMgfSA9IHRoaXNcbiAgICByZXR1cm4gcmVzLnB1c2goY2h1bmspXG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIGNvbnN0IHsgcmVzIH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIHV0aWwucGFyc2VIZWFkZXJzKHRyYWlsZXJzLCB0aGlzLnRyYWlsZXJzKVxuXG4gICAgcmVzLnB1c2gobnVsbClcbiAgfVxuXG4gIG9uRXJyb3IgKGVycikge1xuICAgIGNvbnN0IHsgcmVzLCBjYWxsYmFjaywgYm9keSwgb3BhcXVlIH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgLy8gVE9ETzogRG9lcyB0aGlzIG5lZWQgcXVldWVNaWNyb3Rhc2s/XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLnJlcyA9IG51bGxcbiAgICAgIC8vIEVuc3VyZSBhbGwgcXVldWVkIGhhbmRsZXJzIGFyZSBpbnZva2VkIGJlZm9yZSBkZXN0cm95aW5nIHJlcy5cbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdXRpbC5kZXN0cm95KHJlcywgZXJyKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbFxuICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdCAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVxdWVzdC5jYWxsKHRoaXMsIG9wdHMsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICB0aGlzLmRpc3BhdGNoKG9wdHMsIG5ldyBSZXF1ZXN0SGFuZGxlcihvcHRzLCBjYWxsYmFjaykpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVlc3Rcbm1vZHVsZS5leHBvcnRzLlJlcXVlc3RIYW5kbGVyID0gUmVxdWVzdEhhbmRsZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgZmluaXNoZWQsIFBhc3NUaHJvdWdoIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgSW52YWxpZFJldHVyblZhbHVlRXJyb3IsXG4gIFJlcXVlc3RBYm9ydGVkRXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5cbmNsYXNzIFN0cmVhbUhhbmRsZXIgZXh0ZW5kcyBBc3luY1Jlc291cmNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMsIGZhY3RvcnksIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBtZXRob2QsIG9wYXF1ZSwgYm9keSwgb25JbmZvLCByZXNwb25zZUhlYWRlcnMsIHRocm93T25FcnJvciB9ID0gb3B0c1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBmYWN0b3J5JylcbiAgICAgIH1cblxuICAgICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NpZ25hbCBtdXN0IGJlIGFuIEV2ZW50RW1pdHRlciBvciBFdmVudFRhcmdldCcpXG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgbWV0aG9kJylcbiAgICAgIH1cblxuICAgICAgaWYgKG9uSW5mbyAmJiB0eXBlb2Ygb25JbmZvICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkluZm8gY2FsbGJhY2snKVxuICAgICAgfVxuXG4gICAgICBzdXBlcignVU5ESUNJX1NUUkVBTScpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgICAgICB1dGlsLmRlc3Ryb3koYm9keS5vbignZXJyb3InLCB1dGlsLm5vcCksIGVycilcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cblxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeVxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMucmVzID0gbnVsbFxuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbFxuICAgIHRoaXMudHJhaWxlcnMgPSBudWxsXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICAgIHRoaXMub25JbmZvID0gb25JbmZvIHx8IG51bGxcbiAgICB0aGlzLnRocm93T25FcnJvciA9IHRocm93T25FcnJvciB8fCBmYWxzZVxuXG4gICAgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIGJvZHkub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICghdGhpcy5jYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgcmVzdW1lLCBzdGF0dXNNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBmYWN0b3J5LCBvcGFxdWUsIGNvbnRleHQsIGNhbGxiYWNrLCByZXNwb25zZUhlYWRlcnMgfSA9IHRoaXNcblxuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIGlmICh0aGlzLm9uSW5mbykge1xuICAgICAgICB0aGlzLm9uSW5mbyh7IHN0YXR1c0NvZGUsIGhlYWRlcnMgfSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZmFjdG9yeSA9IG51bGxcblxuICAgIGxldCByZXNcblxuICAgIGlmICh0aGlzLnRocm93T25FcnJvciAmJiBzdGF0dXNDb2RlID49IDQwMCkge1xuICAgICAgY29uc3QgcGFyc2VkSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSA6IGhlYWRlcnNcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcGFyc2VkSGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgICAgIHJlcyA9IG5ldyBQYXNzVGhyb3VnaCgpXG5cbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2ssIG51bGwsXG4gICAgICAgIHsgY2FsbGJhY2ssIGJvZHk6IHJlcywgY29udGVudFR5cGUsIHN0YXR1c0NvZGUsIHN0YXR1c01lc3NhZ2UsIGhlYWRlcnMgfVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZmFjdG9yeSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVzID0gdGhpcy5ydW5JbkFzeW5jU2NvcGUoZmFjdG9yeSwgbnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBvcGFxdWUsXG4gICAgICAgIGNvbnRleHRcbiAgICAgIH0pXG5cbiAgICAgIGlmIChcbiAgICAgICAgIXJlcyB8fFxuICAgICAgICB0eXBlb2YgcmVzLndyaXRlICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiByZXMuZW5kICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiByZXMub24gIT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJldHVyblZhbHVlRXJyb3IoJ2V4cGVjdGVkIFdyaXRhYmxlJylcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogQXZvaWQgZmluaXNoZWQuIEl0IHJlZ2lzdGVycyBhbiB1bm5lY2Vzc2FyeSBhbW91bnQgb2YgbGlzdGVuZXJzLlxuICAgICAgZmluaXNoZWQocmVzLCB7IHJlYWRhYmxlOiBmYWxzZSB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHJlcywgb3BhcXVlLCB0cmFpbGVycywgYWJvcnQgfSA9IHRoaXNcblxuICAgICAgICB0aGlzLnJlcyA9IG51bGxcbiAgICAgICAgaWYgKGVyciB8fCAhcmVzLnJlYWRhYmxlKSB7XG4gICAgICAgICAgdXRpbC5kZXN0cm95KHJlcywgZXJyKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIGVyciB8fCBudWxsLCB7IG9wYXF1ZSwgdHJhaWxlcnMgfSlcblxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgYWJvcnQoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIHJlcy5vbignZHJhaW4nLCByZXN1bWUpXG5cbiAgICB0aGlzLnJlcyA9IHJlc1xuXG4gICAgY29uc3QgbmVlZERyYWluID0gcmVzLndyaXRhYmxlTmVlZERyYWluICE9PSB1bmRlZmluZWRcbiAgICAgID8gcmVzLndyaXRhYmxlTmVlZERyYWluXG4gICAgICA6IHJlcy5fd3JpdGFibGVTdGF0ZSAmJiByZXMuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluXG5cbiAgICByZXR1cm4gbmVlZERyYWluICE9PSB0cnVlXG4gIH1cblxuICBvbkRhdGEgKGNodW5rKSB7XG4gICAgY29uc3QgeyByZXMgfSA9IHRoaXNcblxuICAgIHJldHVybiByZXMgPyByZXMud3JpdGUoY2h1bmspIDogdHJ1ZVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICBpZiAoIXJlcykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy50cmFpbGVycyA9IHV0aWwucGFyc2VIZWFkZXJzKHRyYWlsZXJzKVxuXG4gICAgcmVzLmVuZCgpXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IHJlcywgY2FsbGJhY2ssIG9wYXF1ZSwgYm9keSB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICB0aGlzLmZhY3RvcnkgPSBudWxsXG5cbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLnJlcyA9IG51bGxcbiAgICAgIHV0aWwuZGVzdHJveShyZXMsIGVycilcbiAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbFxuICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyZWFtIChvcHRzLCBmYWN0b3J5LCBjYWxsYmFjaykge1xuICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzdHJlYW0uY2FsbCh0aGlzLCBvcHRzLCBmYWN0b3J5LCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgdGhpcy5kaXNwYXRjaChvcHRzLCBuZXcgU3RyZWFtSGFuZGxlcihvcHRzLCBmYWN0b3J5LCBjYWxsYmFjaykpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmVhbVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBSZWFkYWJsZSxcbiAgRHVwbGV4LFxuICBQYXNzVGhyb3VnaFxufSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCB7XG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCBrUmVzdW1lID0gU3ltYm9sKCdyZXN1bWUnKVxuXG5jbGFzcyBQaXBlbGluZVJlcXVlc3QgZXh0ZW5kcyBSZWFkYWJsZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcih7IGF1dG9EZXN0cm95OiB0cnVlIH0pXG5cbiAgICB0aGlzW2tSZXN1bWVdID0gbnVsbFxuICB9XG5cbiAgX3JlYWQgKCkge1xuICAgIGNvbnN0IHsgW2tSZXN1bWVdOiByZXN1bWUgfSA9IHRoaXNcblxuICAgIGlmIChyZXN1bWUpIHtcbiAgICAgIHRoaXNba1Jlc3VtZV0gPSBudWxsXG4gICAgICByZXN1bWUoKVxuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95IChlcnIsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fcmVhZCgpXG5cbiAgICBjYWxsYmFjayhlcnIpXG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmVSZXNwb25zZSBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKHJlc3VtZSkge1xuICAgIHN1cGVyKHsgYXV0b0Rlc3Ryb3k6IHRydWUgfSlcbiAgICB0aGlzW2tSZXN1bWVdID0gcmVzdW1lXG4gIH1cblxuICBfcmVhZCAoKSB7XG4gICAgdGhpc1trUmVzdW1lXSgpXG4gIH1cblxuICBfZGVzdHJveSAoZXJyLCBjYWxsYmFjaykge1xuICAgIGlmICghZXJyICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgIGVyciA9IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICBjYWxsYmFjayhlcnIpXG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmVIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGhhbmRsZXInKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBtZXRob2QsIG9wYXF1ZSwgb25JbmZvLCByZXNwb25zZUhlYWRlcnMgfSA9IG9wdHNcblxuICAgIGlmIChzaWduYWwgJiYgdHlwZW9mIHNpZ25hbC5vbiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gRXZlbnRFbWl0dGVyIG9yIEV2ZW50VGFyZ2V0JylcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBtZXRob2QnKVxuICAgIH1cblxuICAgIGlmIChvbkluZm8gJiYgdHlwZW9mIG9uSW5mbyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSW5mbyBjYWxsYmFjaycpXG4gICAgfVxuXG4gICAgc3VwZXIoJ1VORElDSV9QSVBFTElORScpXG5cbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbFxuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgICB0aGlzLmFib3J0ID0gbnVsbFxuICAgIHRoaXMuY29udGV4dCA9IG51bGxcbiAgICB0aGlzLm9uSW5mbyA9IG9uSW5mbyB8fCBudWxsXG5cbiAgICB0aGlzLnJlcSA9IG5ldyBQaXBlbGluZVJlcXVlc3QoKS5vbignZXJyb3InLCB1dGlsLm5vcClcblxuICAgIHRoaXMucmV0ID0gbmV3IER1cGxleCh7XG4gICAgICByZWFkYWJsZU9iamVjdE1vZGU6IG9wdHMub2JqZWN0TW9kZSxcbiAgICAgIGF1dG9EZXN0cm95OiB0cnVlLFxuICAgICAgcmVhZDogKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGJvZHkgfSA9IHRoaXNcblxuICAgICAgICBpZiAoYm9keSAmJiBib2R5LnJlc3VtZSkge1xuICAgICAgICAgIGJvZHkucmVzdW1lKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdyaXRlOiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcSB9ID0gdGhpc1xuXG4gICAgICAgIGlmIChyZXEucHVzaChjaHVuaywgZW5jb2RpbmcpIHx8IHJlcS5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVxW2tSZXN1bWVdID0gY2FsbGJhY2tcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlc3Ryb3k6IChlcnIsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYm9keSwgcmVxLCByZXMsIHJldCwgYWJvcnQgfSA9IHRoaXNcblxuICAgICAgICBpZiAoIWVyciAmJiAhcmV0Ll9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgICAgICBlcnIgPSBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWJvcnQgJiYgZXJyKSB7XG4gICAgICAgICAgYWJvcnQoKVxuICAgICAgICB9XG5cbiAgICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICAgICAgdXRpbC5kZXN0cm95KHJlcSwgZXJyKVxuICAgICAgICB1dGlsLmRlc3Ryb3kocmVzLCBlcnIpXG5cbiAgICAgICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgfVxuICAgIH0pLm9uKCdwcmVmaW5pc2gnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlcSB9ID0gdGhpc1xuXG4gICAgICAvLyBOb2RlIDwgMTUgZG9lcyBub3QgY2FsbCBfZmluYWwgaW4gc2FtZSB0aWNrLlxuICAgICAgcmVxLnB1c2gobnVsbClcbiAgICB9KVxuXG4gICAgdGhpcy5yZXMgPSBudWxsXG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgcmV0LCByZXMgfSA9IHRoaXNcblxuICAgIGFzc2VydCghcmVzLCAncGlwZWxpbmUgY2Fubm90IGJlIHJldHJpZWQnKVxuXG4gICAgaWYgKHJldC5kZXN0cm95ZWQpIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHJlc3VtZSkge1xuICAgIGNvbnN0IHsgb3BhcXVlLCBoYW5kbGVyLCBjb250ZXh0IH0gPSB0aGlzXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgaWYgKHRoaXMub25JbmZvKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG4gICAgICAgIHRoaXMub25JbmZvKHsgc3RhdHVzQ29kZSwgaGVhZGVycyB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5yZXMgPSBuZXcgUGlwZWxpbmVSZXNwb25zZShyZXN1bWUpXG5cbiAgICBsZXQgYm9keVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmhhbmRsZXIgPSBudWxsXG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5yZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuICAgICAgYm9keSA9IHRoaXMucnVuSW5Bc3luY1Njb3BlKGhhbmRsZXIsIG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgb3BhcXVlLFxuICAgICAgICBib2R5OiB0aGlzLnJlcyxcbiAgICAgICAgY29udGV4dFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMucmVzLm9uKCdlcnJvcicsIHV0aWwubm9wKVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5Lm9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFJldHVyblZhbHVlRXJyb3IoJ2V4cGVjdGVkIFJlYWRhYmxlJylcbiAgICB9XG5cbiAgICBib2R5XG4gICAgICAub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgY29uc3QgeyByZXQsIGJvZHkgfSA9IHRoaXNcblxuICAgICAgICBpZiAoIXJldC5wdXNoKGNodW5rKSAmJiBib2R5LnBhdXNlKSB7XG4gICAgICAgICAgYm9keS5wYXVzZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICBjb25zdCB7IHJldCB9ID0gdGhpc1xuXG4gICAgICAgIHV0aWwuZGVzdHJveShyZXQsIGVycilcbiAgICAgIH0pXG4gICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyByZXQgfSA9IHRoaXNcblxuICAgICAgICByZXQucHVzaChudWxsKVxuICAgICAgfSlcbiAgICAgIC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmV0IH0gPSB0aGlzXG5cbiAgICAgICAgaWYgKCFyZXQuX3JlYWRhYmxlU3RhdGUuZW5kZWQpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3kocmV0LCBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGNvbnN0IHsgcmVzIH0gPSB0aGlzXG4gICAgcmV0dXJuIHJlcy5wdXNoKGNodW5rKVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuICAgIHJlcy5wdXNoKG51bGwpXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IHJldCB9ID0gdGhpc1xuICAgIHRoaXMuaGFuZGxlciA9IG51bGxcbiAgICB1dGlsLmRlc3Ryb3kocmV0LCBlcnIpXG4gIH1cbn1cblxuZnVuY3Rpb24gcGlwZWxpbmUgKG9wdHMsIGhhbmRsZXIpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaXBlbGluZUhhbmRsZXIgPSBuZXcgUGlwZWxpbmVIYW5kbGVyKG9wdHMsIGhhbmRsZXIpXG4gICAgdGhpcy5kaXNwYXRjaCh7IC4uLm9wdHMsIGJvZHk6IHBpcGVsaW5lSGFuZGxlci5yZXEgfSwgcGlwZWxpbmVIYW5kbGVyKVxuICAgIHJldHVybiBwaXBlbGluZUhhbmRsZXIucmV0XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBuZXcgUGFzc1Rocm91Z2goKS5kZXN0cm95KGVycilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBpcGVsaW5lXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBSZXF1ZXN0QWJvcnRlZEVycm9yLCBTb2NrZXRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgYWRkU2lnbmFsLCByZW1vdmVTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWJvcnQtc2lnbmFsJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5cbmNsYXNzIFVwZ3JhZGVIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBvcGFxdWUsIHJlc3BvbnNlSGVhZGVycyB9ID0gb3B0c1xuXG4gICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBFdmVudEVtaXR0ZXIgb3IgRXZlbnRUYXJnZXQnKVxuICAgIH1cblxuICAgIHN1cGVyKCdVTkRJQ0lfVVBHUkFERScpXG5cbiAgICB0aGlzLnJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyB8fCBudWxsXG4gICAgdGhpcy5vcGFxdWUgPSBvcGFxdWUgfHwgbnVsbFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbFxuXG4gICAgYWRkU2lnbmFsKHRoaXMsIHNpZ25hbClcbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQsIGNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuY2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsXG4gIH1cblxuICBvbkhlYWRlcnMgKCkge1xuICAgIHRocm93IG5ldyBTb2NrZXRFcnJvcignYmFkIHVwZ3JhZGUnLCBudWxsKVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCByYXdIZWFkZXJzLCBzb2NrZXQpIHtcbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUsIGNvbnRleHQgfSA9IHRoaXNcblxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzdGF0dXNDb2RlLCAxMDEpXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMucmVzcG9uc2VIZWFkZXJzID09PSAncmF3JyA/IHV0aWwucGFyc2VSYXdIZWFkZXJzKHJhd0hlYWRlcnMpIDogdXRpbC5wYXJzZUhlYWRlcnMocmF3SGVhZGVycylcbiAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgbnVsbCwge1xuICAgICAgaGVhZGVycyxcbiAgICAgIHNvY2tldCxcbiAgICAgIG9wYXF1ZSxcbiAgICAgIGNvbnRleHRcbiAgICB9KVxuICB9XG5cbiAgb25FcnJvciAoZXJyKSB7XG4gICAgY29uc3QgeyBjYWxsYmFjaywgb3BhcXVlIH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIGVyciwgeyBvcGFxdWUgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZ3JhZGUgKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVwZ3JhZGUuY2FsbCh0aGlzLCBvcHRzLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgdXBncmFkZUhhbmRsZXIgPSBuZXcgVXBncmFkZUhhbmRsZXIob3B0cywgY2FsbGJhY2spXG4gICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgbWV0aG9kOiBvcHRzLm1ldGhvZCB8fCAnR0VUJyxcbiAgICAgIHVwZ3JhZGU6IG9wdHMucHJvdG9jb2wgfHwgJ1dlYnNvY2tldCdcbiAgICB9LCB1cGdyYWRlSGFuZGxlcilcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICAgIGNvbnN0IG9wYXF1ZSA9IG9wdHMgJiYgb3B0cy5vcGFxdWVcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhlcnIsIHsgb3BhcXVlIH0pKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdXBncmFkZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBSZXF1ZXN0QWJvcnRlZEVycm9yLCBTb2NrZXRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5cbmNsYXNzIENvbm5lY3RIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBvcGFxdWUsIHJlc3BvbnNlSGVhZGVycyB9ID0gb3B0c1xuXG4gICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBFdmVudEVtaXR0ZXIgb3IgRXZlbnRUYXJnZXQnKVxuICAgIH1cblxuICAgIHN1cGVyKCdVTkRJQ0lfQ09OTkVDVCcpXG5cbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuYWJvcnQgPSBudWxsXG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICghdGhpcy5jYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIG9uSGVhZGVycyAoKSB7XG4gICAgdGhyb3cgbmV3IFNvY2tldEVycm9yKCdiYWQgY29ubmVjdCcsIG51bGwpXG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHNvY2tldCkge1xuICAgIGNvbnN0IHsgY2FsbGJhY2ssIG9wYXF1ZSwgY29udGV4dCB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuXG4gICAgbGV0IGhlYWRlcnMgPSByYXdIZWFkZXJzXG4gICAgLy8gSW5kaWNhdGVzIGlzIGFuIEhUVFAyU2Vzc2lvblxuICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHtcbiAgICAgIGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG4gICAgfVxuXG4gICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzLFxuICAgICAgc29ja2V0LFxuICAgICAgb3BhcXVlLFxuICAgICAgY29udGV4dFxuICAgIH0pXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29ubmVjdCAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29ubmVjdC5jYWxsKHRoaXMsIG9wdHMsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25uZWN0SGFuZGxlciA9IG5ldyBDb25uZWN0SGFuZGxlcihvcHRzLCBjYWxsYmFjaylcbiAgICB0aGlzLmRpc3BhdGNoKHsgLi4ub3B0cywgbWV0aG9kOiAnQ09OTkVDVCcgfSwgY29ubmVjdEhhbmRsZXIpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbm5lY3RcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzLnJlcXVlc3QgPSByZXF1aXJlKCcuL2FwaS1yZXF1ZXN0Jylcbm1vZHVsZS5leHBvcnRzLnN0cmVhbSA9IHJlcXVpcmUoJy4vYXBpLXN0cmVhbScpXG5tb2R1bGUuZXhwb3J0cy5waXBlbGluZSA9IHJlcXVpcmUoJy4vYXBpLXBpcGVsaW5lJylcbm1vZHVsZS5leHBvcnRzLnVwZ3JhZGUgPSByZXF1aXJlKCcuL2FwaS11cGdyYWRlJylcbm1vZHVsZS5leHBvcnRzLmNvbm5lY3QgPSByZXF1aXJlKCcuL2FwaS1jb25uZWN0JylcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgVW5kaWNpRXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcblxuY2xhc3MgTW9ja05vdE1hdGNoZWRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE1vY2tOb3RNYXRjaGVkRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ01vY2tOb3RNYXRjaGVkRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGhlIHJlcXVlc3QgZG9lcyBub3QgbWF0Y2ggYW55IHJlZ2lzdGVyZWQgbW9jayBkaXNwYXRjaGVzJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfTU9DS19FUlJfTU9DS19OT1RfTUFUQ0hFRCdcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTW9ja05vdE1hdGNoZWRFcnJvclxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtBZ2VudDogU3ltYm9sKCdhZ2VudCcpLFxuICBrT3B0aW9uczogU3ltYm9sKCdvcHRpb25zJyksXG4gIGtGYWN0b3J5OiBTeW1ib2woJ2ZhY3RvcnknKSxcbiAga0Rpc3BhdGNoZXM6IFN5bWJvbCgnZGlzcGF0Y2hlcycpLFxuICBrRGlzcGF0Y2hLZXk6IFN5bWJvbCgnZGlzcGF0Y2gga2V5JyksXG4gIGtEZWZhdWx0SGVhZGVyczogU3ltYm9sKCdkZWZhdWx0IGhlYWRlcnMnKSxcbiAga0RlZmF1bHRUcmFpbGVyczogU3ltYm9sKCdkZWZhdWx0IHRyYWlsZXJzJyksXG4gIGtDb250ZW50TGVuZ3RoOiBTeW1ib2woJ2NvbnRlbnQgbGVuZ3RoJyksXG4gIGtNb2NrQWdlbnQ6IFN5bWJvbCgnbW9jayBhZ2VudCcpLFxuICBrTW9ja0FnZW50U2V0OiBTeW1ib2woJ21vY2sgYWdlbnQgc2V0JyksXG4gIGtNb2NrQWdlbnRHZXQ6IFN5bWJvbCgnbW9jayBhZ2VudCBnZXQnKSxcbiAga01vY2tEaXNwYXRjaDogU3ltYm9sKCdtb2NrIGRpc3BhdGNoJyksXG4gIGtDbG9zZTogU3ltYm9sKCdjbG9zZScpLFxuICBrT3JpZ2luYWxDbG9zZTogU3ltYm9sKCdvcmlnaW5hbCBhZ2VudCBjbG9zZScpLFxuICBrT3JpZ2luOiBTeW1ib2woJ29yaWdpbicpLFxuICBrSXNNb2NrQWN0aXZlOiBTeW1ib2woJ2lzIG1vY2sgYWN0aXZlJyksXG4gIGtOZXRDb25uZWN0OiBTeW1ib2woJ25ldCBjb25uZWN0JyksXG4gIGtHZXROZXRDb25uZWN0OiBTeW1ib2woJ2dldCBuZXQgY29ubmVjdCcpLFxuICBrQ29ubmVjdGVkOiBTeW1ib2woJ2Nvbm5lY3RlZCcpXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE1vY2tOb3RNYXRjaGVkRXJyb3IgfSA9IHJlcXVpcmUoJy4vbW9jay1lcnJvcnMnKVxuY29uc3Qge1xuICBrRGlzcGF0Y2hlcyxcbiAga01vY2tBZ2VudCxcbiAga09yaWdpbmFsRGlzcGF0Y2gsXG4gIGtPcmlnaW4sXG4gIGtHZXROZXRDb25uZWN0XG59ID0gcmVxdWlyZSgnLi9tb2NrLXN5bWJvbHMnKVxuY29uc3QgeyBidWlsZFVSTCwgbm9wIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBTVEFUVVNfQ09ERVMgfSA9IHJlcXVpcmUoJ2h0dHAnKVxuY29uc3Qge1xuICB0eXBlczoge1xuICAgIGlzUHJvbWlzZVxuICB9XG59ID0gcmVxdWlyZSgndXRpbCcpXG5cbmZ1bmN0aW9uIG1hdGNoVmFsdWUgKG1hdGNoLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIG1hdGNoID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBtYXRjaCA9PT0gdmFsdWVcbiAgfVxuICBpZiAobWF0Y2ggaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gbWF0Y2gudGVzdCh2YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIG1hdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1hdGNoKHZhbHVlKSA9PT0gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VFbnRyaWVzIChoZWFkZXJzKSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoaGVhZGVycykubWFwKChbaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gW2hlYWRlck5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSwgaGVhZGVyVmFsdWVdXG4gICAgfSlcbiAgKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi9pbmRleCcpLkhlYWRlcnN8c3RyaW5nW118UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaGVhZGVyc1xuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICovXG5mdW5jdGlvbiBnZXRIZWFkZXJCeU5hbWUgKGhlYWRlcnMsIGtleSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgaWYgKGhlYWRlcnNbaV0udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIGhlYWRlcnNbaSArIDFdXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9IGVsc2UgaWYgKHR5cGVvZiBoZWFkZXJzLmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBoZWFkZXJzLmdldChrZXkpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxvd2VyQ2FzZUVudHJpZXMoaGVhZGVycylba2V5LnRvTG9jYWxlTG93ZXJDYXNlKCldXG4gIH1cbn1cblxuLyoqIEBwYXJhbSB7c3RyaW5nW119IGhlYWRlcnMgKi9cbmZ1bmN0aW9uIGJ1aWxkSGVhZGVyc0Zyb21BcnJheSAoaGVhZGVycykgeyAvLyBmZXRjaCBIZWFkZXJzTGlzdFxuICBjb25zdCBjbG9uZSA9IGhlYWRlcnMuc2xpY2UoKVxuICBjb25zdCBlbnRyaWVzID0gW11cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNsb25lLmxlbmd0aDsgaW5kZXggKz0gMikge1xuICAgIGVudHJpZXMucHVzaChbY2xvbmVbaW5kZXhdLCBjbG9uZVtpbmRleCArIDFdXSlcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpXG59XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVycyAobW9ja0Rpc3BhdGNoLCBoZWFkZXJzKSB7XG4gIGlmICh0eXBlb2YgbW9ja0Rpc3BhdGNoLmhlYWRlcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkgeyAvLyBmZXRjaCBIZWFkZXJzTGlzdFxuICAgICAgaGVhZGVycyA9IGJ1aWxkSGVhZGVyc0Zyb21BcnJheShoZWFkZXJzKVxuICAgIH1cbiAgICByZXR1cm4gbW9ja0Rpc3BhdGNoLmhlYWRlcnMoaGVhZGVycyA/IGxvd2VyQ2FzZUVudHJpZXMoaGVhZGVycykgOiB7fSlcbiAgfVxuICBpZiAodHlwZW9mIG1vY2tEaXNwYXRjaC5oZWFkZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKHR5cGVvZiBoZWFkZXJzICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgbW9ja0Rpc3BhdGNoLmhlYWRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IFttYXRjaEhlYWRlck5hbWUsIG1hdGNoSGVhZGVyVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1vY2tEaXNwYXRjaC5oZWFkZXJzKSkge1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gZ2V0SGVhZGVyQnlOYW1lKGhlYWRlcnMsIG1hdGNoSGVhZGVyTmFtZSlcblxuICAgIGlmICghbWF0Y2hWYWx1ZShtYXRjaEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBzYWZlVXJsIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgY29uc3QgcGF0aFNlZ21lbnRzID0gcGF0aC5zcGxpdCgnPycpXG5cbiAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggIT09IDIpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgY29uc3QgcXAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhdGhTZWdtZW50cy5wb3AoKSlcbiAgcXAuc29ydCgpXG4gIHJldHVybiBbLi4ucGF0aFNlZ21lbnRzLCBxcC50b1N0cmluZygpXS5qb2luKCc/Jylcbn1cblxuZnVuY3Rpb24gbWF0Y2hLZXkgKG1vY2tEaXNwYXRjaCwgeyBwYXRoLCBtZXRob2QsIGJvZHksIGhlYWRlcnMgfSkge1xuICBjb25zdCBwYXRoTWF0Y2ggPSBtYXRjaFZhbHVlKG1vY2tEaXNwYXRjaC5wYXRoLCBwYXRoKVxuICBjb25zdCBtZXRob2RNYXRjaCA9IG1hdGNoVmFsdWUobW9ja0Rpc3BhdGNoLm1ldGhvZCwgbWV0aG9kKVxuICBjb25zdCBib2R5TWF0Y2ggPSB0eXBlb2YgbW9ja0Rpc3BhdGNoLmJvZHkgIT09ICd1bmRlZmluZWQnID8gbWF0Y2hWYWx1ZShtb2NrRGlzcGF0Y2guYm9keSwgYm9keSkgOiB0cnVlXG4gIGNvbnN0IGhlYWRlcnNNYXRjaCA9IG1hdGNoSGVhZGVycyhtb2NrRGlzcGF0Y2gsIGhlYWRlcnMpXG4gIHJldHVybiBwYXRoTWF0Y2ggJiYgbWV0aG9kTWF0Y2ggJiYgYm9keU1hdGNoICYmIGhlYWRlcnNNYXRjaFxufVxuXG5mdW5jdGlvbiBnZXRSZXNwb25zZURhdGEgKGRhdGEpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgIHJldHVybiBkYXRhXG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vY2tEaXNwYXRjaCAobW9ja0Rpc3BhdGNoZXMsIGtleSkge1xuICBjb25zdCBiYXNlUGF0aCA9IGtleS5xdWVyeSA/IGJ1aWxkVVJMKGtleS5wYXRoLCBrZXkucXVlcnkpIDoga2V5LnBhdGhcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gdHlwZW9mIGJhc2VQYXRoID09PSAnc3RyaW5nJyA/IHNhZmVVcmwoYmFzZVBhdGgpIDogYmFzZVBhdGhcblxuICAvLyBNYXRjaCBwYXRoXG4gIGxldCBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMgPSBtb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgY29uc3VtZWQgfSkgPT4gIWNvbnN1bWVkKS5maWx0ZXIoKHsgcGF0aCB9KSA9PiBtYXRjaFZhbHVlKHNhZmVVcmwocGF0aCksIHJlc29sdmVkUGF0aCkpXG4gIGlmIChtYXRjaGVkTW9ja0Rpc3BhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYE1vY2sgZGlzcGF0Y2ggbm90IG1hdGNoZWQgZm9yIHBhdGggJyR7cmVzb2x2ZWRQYXRofSdgKVxuICB9XG5cbiAgLy8gTWF0Y2ggbWV0aG9kXG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgbWV0aG9kIH0pID0+IG1hdGNoVmFsdWUobWV0aG9kLCBrZXkubWV0aG9kKSlcbiAgaWYgKG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgTW9ja05vdE1hdGNoZWRFcnJvcihgTW9jayBkaXNwYXRjaCBub3QgbWF0Y2hlZCBmb3IgbWV0aG9kICcke2tleS5tZXRob2R9J2ApXG4gIH1cblxuICAvLyBNYXRjaCBib2R5XG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgYm9keSB9KSA9PiB0eXBlb2YgYm9keSAhPT0gJ3VuZGVmaW5lZCcgPyBtYXRjaFZhbHVlKGJvZHksIGtleS5ib2R5KSA6IHRydWUpXG4gIGlmIChtYXRjaGVkTW9ja0Rpc3BhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYE1vY2sgZGlzcGF0Y2ggbm90IG1hdGNoZWQgZm9yIGJvZHkgJyR7a2V5LmJvZHl9J2ApXG4gIH1cblxuICAvLyBNYXRjaCBoZWFkZXJzXG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKG1vY2tEaXNwYXRjaCkgPT4gbWF0Y2hIZWFkZXJzKG1vY2tEaXNwYXRjaCwga2V5LmhlYWRlcnMpKVxuICBpZiAobWF0Y2hlZE1vY2tEaXNwYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBNb2NrTm90TWF0Y2hlZEVycm9yKGBNb2NrIGRpc3BhdGNoIG5vdCBtYXRjaGVkIGZvciBoZWFkZXJzICcke3R5cGVvZiBrZXkuaGVhZGVycyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShrZXkuaGVhZGVycykgOiBrZXkuaGVhZGVyc30nYClcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVkTW9ja0Rpc3BhdGNoZXNbMF1cbn1cblxuZnVuY3Rpb24gYWRkTW9ja0Rpc3BhdGNoIChtb2NrRGlzcGF0Y2hlcywga2V5LCBkYXRhKSB7XG4gIGNvbnN0IGJhc2VEYXRhID0geyB0aW1lc0ludm9rZWQ6IDAsIHRpbWVzOiAxLCBwZXJzaXN0OiBmYWxzZSwgY29uc3VtZWQ6IGZhbHNlIH1cbiAgY29uc3QgcmVwbHlEYXRhID0gdHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicgPyB7IGNhbGxiYWNrOiBkYXRhIH0gOiB7IC4uLmRhdGEgfVxuICBjb25zdCBuZXdNb2NrRGlzcGF0Y2ggPSB7IC4uLmJhc2VEYXRhLCAuLi5rZXksIHBlbmRpbmc6IHRydWUsIGRhdGE6IHsgZXJyb3I6IG51bGwsIC4uLnJlcGx5RGF0YSB9IH1cbiAgbW9ja0Rpc3BhdGNoZXMucHVzaChuZXdNb2NrRGlzcGF0Y2gpXG4gIHJldHVybiBuZXdNb2NrRGlzcGF0Y2hcbn1cblxuZnVuY3Rpb24gZGVsZXRlTW9ja0Rpc3BhdGNoIChtb2NrRGlzcGF0Y2hlcywga2V5KSB7XG4gIGNvbnN0IGluZGV4ID0gbW9ja0Rpc3BhdGNoZXMuZmluZEluZGV4KGRpc3BhdGNoID0+IHtcbiAgICBpZiAoIWRpc3BhdGNoLmNvbnN1bWVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoS2V5KGRpc3BhdGNoLCBrZXkpXG4gIH0pXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBtb2NrRGlzcGF0Y2hlcy5zcGxpY2UoaW5kZXgsIDEpXG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRLZXkgKG9wdHMpIHtcbiAgY29uc3QgeyBwYXRoLCBtZXRob2QsIGJvZHksIGhlYWRlcnMsIHF1ZXJ5IH0gPSBvcHRzXG4gIHJldHVybiB7XG4gICAgcGF0aCxcbiAgICBtZXRob2QsXG4gICAgYm9keSxcbiAgICBoZWFkZXJzLFxuICAgIHF1ZXJ5XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVLZXlWYWx1ZXMgKGRhdGEpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRhdGEpLnJlZHVjZSgoa2V5VmFsdWVQYWlycywgW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgLi4ua2V5VmFsdWVQYWlycyxcbiAgICBCdWZmZXIuZnJvbShgJHtrZXl9YCksXG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoeCA9PiBCdWZmZXIuZnJvbShgJHt4fWApKSA6IEJ1ZmZlci5mcm9tKGAke3ZhbHVlfWApXG4gIF0sIFtdKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9TdGF0dXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNDb2RlXG4gKi9cbmZ1bmN0aW9uIGdldFN0YXR1c1RleHQgKHN0YXR1c0NvZGUpIHtcbiAgcmV0dXJuIFNUQVRVU19DT0RFU1tzdGF0dXNDb2RlXSB8fCAndW5rbm93bidcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzcG9uc2UgKGJvZHkpIHtcbiAgY29uc3QgYnVmZmVycyA9IFtdXG4gIGZvciBhd2FpdCAoY29uc3QgZGF0YSBvZiBib2R5KSB7XG4gICAgYnVmZmVycy5wdXNoKGRhdGEpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycykudG9TdHJpbmcoJ3V0ZjgnKVxufVxuXG4vKipcbiAqIE1vY2sgZGlzcGF0Y2ggZnVuY3Rpb24gdXNlZCB0byBzaW11bGF0ZSB1bmRpY2kgZGlzcGF0Y2hlc1xuICovXG5mdW5jdGlvbiBtb2NrRGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgLy8gR2V0IG1vY2sgZGlzcGF0Y2ggZnJvbSBidWlsdCBrZXlcbiAgY29uc3Qga2V5ID0gYnVpbGRLZXkob3B0cylcbiAgY29uc3QgbW9ja0Rpc3BhdGNoID0gZ2V0TW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCBrZXkpXG5cbiAgbW9ja0Rpc3BhdGNoLnRpbWVzSW52b2tlZCsrXG5cbiAgLy8gSGVyZSdzIHdoZXJlIHdlIHJlc29sdmUgYSBjYWxsYmFjayBpZiBhIGNhbGxiYWNrIGlzIHByZXNlbnQgZm9yIHRoZSBkaXNwYXRjaCBkYXRhLlxuICBpZiAobW9ja0Rpc3BhdGNoLmRhdGEuY2FsbGJhY2spIHtcbiAgICBtb2NrRGlzcGF0Y2guZGF0YSA9IHsgLi4ubW9ja0Rpc3BhdGNoLmRhdGEsIC4uLm1vY2tEaXNwYXRjaC5kYXRhLmNhbGxiYWNrKG9wdHMpIH1cbiAgfVxuXG4gIC8vIFBhcnNlIG1vY2tEaXNwYXRjaCBkYXRhXG4gIGNvbnN0IHsgZGF0YTogeyBzdGF0dXNDb2RlLCBkYXRhLCBoZWFkZXJzLCB0cmFpbGVycywgZXJyb3IgfSwgZGVsYXksIHBlcnNpc3QgfSA9IG1vY2tEaXNwYXRjaFxuICBjb25zdCB7IHRpbWVzSW52b2tlZCwgdGltZXMgfSA9IG1vY2tEaXNwYXRjaFxuXG4gIC8vIElmIGl0J3MgdXNlZCB1cCBhbmQgbm90IHBlcnNpc3RlbnQsIG1hcmsgYXMgY29uc3VtZWRcbiAgbW9ja0Rpc3BhdGNoLmNvbnN1bWVkID0gIXBlcnNpc3QgJiYgdGltZXNJbnZva2VkID49IHRpbWVzXG4gIG1vY2tEaXNwYXRjaC5wZW5kaW5nID0gdGltZXNJbnZva2VkIDwgdGltZXNcblxuICAvLyBJZiBzcGVjaWZpZWQsIHRyaWdnZXIgZGlzcGF0Y2ggZXJyb3JcbiAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgZGVsZXRlTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCBrZXkpXG4gICAgaGFuZGxlci5vbkVycm9yKGVycm9yKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBIYW5kbGUgdGhlIHJlcXVlc3Qgd2l0aCBhIGRlbGF5IGlmIG5lY2Vzc2FyeVxuICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGhhbmRsZVJlcGx5KHRoaXNba0Rpc3BhdGNoZXNdKVxuICAgIH0sIGRlbGF5KVxuICB9IGVsc2Uge1xuICAgIGhhbmRsZVJlcGx5KHRoaXNba0Rpc3BhdGNoZXNdKVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUmVwbHkgKG1vY2tEaXNwYXRjaGVzLCBfZGF0YSA9IGRhdGEpIHtcbiAgICAvLyBmZXRjaCdzIEhlYWRlcnNMaXN0IGlzIGEgMUQgc3RyaW5nIGFycmF5XG4gICAgY29uc3Qgb3B0c0hlYWRlcnMgPSBBcnJheS5pc0FycmF5KG9wdHMuaGVhZGVycylcbiAgICAgID8gYnVpbGRIZWFkZXJzRnJvbUFycmF5KG9wdHMuaGVhZGVycylcbiAgICAgIDogb3B0cy5oZWFkZXJzXG4gICAgY29uc3QgYm9keSA9IHR5cGVvZiBfZGF0YSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBfZGF0YSh7IC4uLm9wdHMsIGhlYWRlcnM6IG9wdHNIZWFkZXJzIH0pXG4gICAgICA6IF9kYXRhXG5cbiAgICAvLyB1dGlsLnR5cGVzLmlzUHJvbWlzZSBpcyBsaWtlbHkgbmVlZGVkIGZvciBqZXN0LlxuICAgIGlmIChpc1Byb21pc2UoYm9keSkpIHtcbiAgICAgIC8vIElmIGhhbmRsZVJlcGx5IGlzIGFzeW5jaHJvbm91cywgdGhyb3dpbmcgYW4gZXJyb3JcbiAgICAgIC8vIGluIHRoZSBjYWxsYmFjayB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZSwgcmF0aGVyIHRoYW5cbiAgICAgIC8vIHN5bmNocm9ub3VzbHkgdGhyb3cgdGhlIGVycm9yLCB3aGljaCBicmVha3Mgc29tZSB0ZXN0cy5cbiAgICAgIC8vIFJhdGhlciwgd2Ugd2FpdCBmb3IgdGhlIGNhbGxiYWNrIHRvIHJlc29sdmUgaWYgaXQgaXMgYVxuICAgICAgLy8gcHJvbWlzZSwgYW5kIHRoZW4gcmUtcnVuIGhhbmRsZVJlcGx5IHdpdGggdGhlIG5ldyBib2R5LlxuICAgICAgYm9keS50aGVuKChuZXdEYXRhKSA9PiBoYW5kbGVSZXBseShtb2NrRGlzcGF0Y2hlcywgbmV3RGF0YSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZURhdGEgPSBnZXRSZXNwb25zZURhdGEoYm9keSlcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBnZW5lcmF0ZUtleVZhbHVlcyhoZWFkZXJzKVxuICAgIGNvbnN0IHJlc3BvbnNlVHJhaWxlcnMgPSBnZW5lcmF0ZUtleVZhbHVlcyh0cmFpbGVycylcblxuICAgIGhhbmRsZXIuYWJvcnQgPSBub3BcbiAgICBoYW5kbGVyLm9uSGVhZGVycyhzdGF0dXNDb2RlLCByZXNwb25zZUhlYWRlcnMsIHJlc3VtZSwgZ2V0U3RhdHVzVGV4dChzdGF0dXNDb2RlKSlcbiAgICBoYW5kbGVyLm9uRGF0YShCdWZmZXIuZnJvbShyZXNwb25zZURhdGEpKVxuICAgIGhhbmRsZXIub25Db21wbGV0ZShyZXNwb25zZVRyYWlsZXJzKVxuICAgIGRlbGV0ZU1vY2tEaXNwYXRjaChtb2NrRGlzcGF0Y2hlcywga2V5KVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lICgpIHt9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gYnVpbGRNb2NrRGlzcGF0Y2ggKCkge1xuICBjb25zdCBhZ2VudCA9IHRoaXNba01vY2tBZ2VudF1cbiAgY29uc3Qgb3JpZ2luID0gdGhpc1trT3JpZ2luXVxuICBjb25zdCBvcmlnaW5hbERpc3BhdGNoID0gdGhpc1trT3JpZ2luYWxEaXNwYXRjaF1cblxuICByZXR1cm4gZnVuY3Rpb24gZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAoYWdlbnQuaXNNb2NrQWN0aXZlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBtb2NrRGlzcGF0Y2guY2FsbCh0aGlzLCBvcHRzLCBoYW5kbGVyKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTW9ja05vdE1hdGNoZWRFcnJvcikge1xuICAgICAgICAgIGNvbnN0IG5ldENvbm5lY3QgPSBhZ2VudFtrR2V0TmV0Q29ubmVjdF0oKVxuICAgICAgICAgIGlmIChuZXRDb25uZWN0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX06IHN1YnNlcXVlbnQgcmVxdWVzdCB0byBvcmlnaW4gJHtvcmlnaW59IHdhcyBub3QgYWxsb3dlZCAobmV0LmNvbm5lY3QgZGlzYWJsZWQpYClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNoZWNrTmV0Q29ubmVjdChuZXRDb25uZWN0LCBvcmlnaW4pKSB7XG4gICAgICAgICAgICBvcmlnaW5hbERpc3BhdGNoLmNhbGwodGhpcywgb3B0cywgaGFuZGxlcilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX06IHN1YnNlcXVlbnQgcmVxdWVzdCB0byBvcmlnaW4gJHtvcmlnaW59IHdhcyBub3QgYWxsb3dlZCAobmV0LmNvbm5lY3QgaXMgbm90IGVuYWJsZWQgZm9yIHRoaXMgb3JpZ2luKWApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3JpZ2luYWxEaXNwYXRjaC5jYWxsKHRoaXMsIG9wdHMsIGhhbmRsZXIpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrTmV0Q29ubmVjdCAobmV0Q29ubmVjdCwgb3JpZ2luKSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwob3JpZ2luKVxuICBpZiAobmV0Q29ubmVjdCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShuZXRDb25uZWN0KSAmJiBuZXRDb25uZWN0LnNvbWUoKG1hdGNoZXIpID0+IG1hdGNoVmFsdWUobWF0Y2hlciwgdXJsLmhvc3QpKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGJ1aWxkTW9ja09wdGlvbnMgKG9wdHMpIHtcbiAgaWYgKG9wdHMpIHtcbiAgICBjb25zdCB7IGFnZW50LCAuLi5tb2NrT3B0aW9ucyB9ID0gb3B0c1xuICAgIHJldHVybiBtb2NrT3B0aW9uc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRSZXNwb25zZURhdGEsXG4gIGdldE1vY2tEaXNwYXRjaCxcbiAgYWRkTW9ja0Rpc3BhdGNoLFxuICBkZWxldGVNb2NrRGlzcGF0Y2gsXG4gIGJ1aWxkS2V5LFxuICBnZW5lcmF0ZUtleVZhbHVlcyxcbiAgbWF0Y2hWYWx1ZSxcbiAgZ2V0UmVzcG9uc2UsXG4gIGdldFN0YXR1c1RleHQsXG4gIG1vY2tEaXNwYXRjaCxcbiAgYnVpbGRNb2NrRGlzcGF0Y2gsXG4gIGNoZWNrTmV0Q29ubmVjdCxcbiAgYnVpbGRNb2NrT3B0aW9ucyxcbiAgZ2V0SGVhZGVyQnlOYW1lXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGdldFJlc3BvbnNlRGF0YSwgYnVpbGRLZXksIGFkZE1vY2tEaXNwYXRjaCB9ID0gcmVxdWlyZSgnLi9tb2NrLXV0aWxzJylcbmNvbnN0IHtcbiAga0Rpc3BhdGNoZXMsXG4gIGtEaXNwYXRjaEtleSxcbiAga0RlZmF1bHRIZWFkZXJzLFxuICBrRGVmYXVsdFRyYWlsZXJzLFxuICBrQ29udGVudExlbmd0aCxcbiAga01vY2tEaXNwYXRjaFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsgYnVpbGRVUkwgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbi8qKlxuICogRGVmaW5lcyB0aGUgc2NvcGUgQVBJIGZvciBhbiBpbnRlcmNlcHRvciByZXBseVxuICovXG5jbGFzcyBNb2NrU2NvcGUge1xuICBjb25zdHJ1Y3RvciAobW9ja0Rpc3BhdGNoKSB7XG4gICAgdGhpc1trTW9ja0Rpc3BhdGNoXSA9IG1vY2tEaXNwYXRjaFxuICB9XG5cbiAgLyoqXG4gICAqIERlbGF5IGEgcmVwbHkgYnkgYSBzZXQgYW1vdW50IGluIG1zLlxuICAgKi9cbiAgZGVsYXkgKHdhaXRJbk1zKSB7XG4gICAgaWYgKHR5cGVvZiB3YWl0SW5NcyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIod2FpdEluTXMpIHx8IHdhaXRJbk1zIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignd2FpdEluTXMgbXVzdCBiZSBhIHZhbGlkIGludGVnZXIgPiAwJylcbiAgICB9XG5cbiAgICB0aGlzW2tNb2NrRGlzcGF0Y2hdLmRlbGF5ID0gd2FpdEluTXNcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhIGRlZmluZWQgcmVwbHksIG5ldmVyIG1hcmsgYXMgY29uc3VtZWQuXG4gICAqL1xuICBwZXJzaXN0ICgpIHtcbiAgICB0aGlzW2tNb2NrRGlzcGF0Y2hdLnBlcnNpc3QgPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBvbmUgdG8gZGVmaW5lIGEgcmVwbHkgZm9yIGEgc2V0IGFtb3VudCBvZiBtYXRjaGluZyByZXF1ZXN0cy5cbiAgICovXG4gIHRpbWVzIChyZXBlYXRUaW1lcykge1xuICAgIGlmICh0eXBlb2YgcmVwZWF0VGltZXMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJlcGVhdFRpbWVzKSB8fCByZXBlYXRUaW1lcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3JlcGVhdFRpbWVzIG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyID4gMCcpXG4gICAgfVxuXG4gICAgdGhpc1trTW9ja0Rpc3BhdGNoXS50aW1lcyA9IHJlcGVhdFRpbWVzXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG4vKipcbiAqIERlZmluZXMgYW4gaW50ZXJjZXB0b3IgZm9yIGEgTW9ja1xuICovXG5jbGFzcyBNb2NrSW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvciAob3B0cywgbW9ja0Rpc3BhdGNoZXMpIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29wdHMgbXVzdCBiZSBhbiBvYmplY3QnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMucGF0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cy5wYXRoIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0cy5tZXRob2QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRzLm1ldGhvZCA9ICdHRVQnXG4gICAgfVxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTI0NVxuICAgIC8vIEFzIHBlciBSRkMgMzk4NiwgY2xpZW50cyBhcmUgbm90IHN1cHBvc2VkIHRvIHNlbmQgVVJJXG4gICAgLy8gZnJhZ21lbnRzIHRvIHNlcnZlcnMgd2hlbiB0aGV5IHJldHJpZXZlIGEgZG9jdW1lbnQsXG4gICAgaWYgKHR5cGVvZiBvcHRzLnBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAob3B0cy5xdWVyeSkge1xuICAgICAgICBvcHRzLnBhdGggPSBidWlsZFVSTChvcHRzLnBhdGgsIG9wdHMucXVlcnkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNYXRjaGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2Jsb2IvbWFpbi9saWIvZmV0Y2gvaW5kZXguanMjTDE4MTFcbiAgICAgICAgY29uc3QgcGFyc2VkVVJMID0gbmV3IFVSTChvcHRzLnBhdGgsICdkYXRhOi8vJylcbiAgICAgICAgb3B0cy5wYXRoID0gcGFyc2VkVVJMLnBhdGhuYW1lICsgcGFyc2VkVVJMLnNlYXJjaFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMubWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0cy5tZXRob2QgPSBvcHRzLm1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gICAgfVxuXG4gICAgdGhpc1trRGlzcGF0Y2hLZXldID0gYnVpbGRLZXkob3B0cylcbiAgICB0aGlzW2tEaXNwYXRjaGVzXSA9IG1vY2tEaXNwYXRjaGVzXG4gICAgdGhpc1trRGVmYXVsdEhlYWRlcnNdID0ge31cbiAgICB0aGlzW2tEZWZhdWx0VHJhaWxlcnNdID0ge31cbiAgICB0aGlzW2tDb250ZW50TGVuZ3RoXSA9IGZhbHNlXG4gIH1cblxuICBjcmVhdGVNb2NrU2NvcGVEaXNwYXRjaERhdGEgKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZ2V0UmVzcG9uc2VEYXRhKGRhdGEpXG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IHRoaXNba0NvbnRlbnRMZW5ndGhdID8geyAnY29udGVudC1sZW5ndGgnOiByZXNwb25zZURhdGEubGVuZ3RoIH0gOiB7fVxuICAgIGNvbnN0IGhlYWRlcnMgPSB7IC4uLnRoaXNba0RlZmF1bHRIZWFkZXJzXSwgLi4uY29udGVudExlbmd0aCwgLi4ucmVzcG9uc2VPcHRpb25zLmhlYWRlcnMgfVxuICAgIGNvbnN0IHRyYWlsZXJzID0geyAuLi50aGlzW2tEZWZhdWx0VHJhaWxlcnNdLCAuLi5yZXNwb25zZU9wdGlvbnMudHJhaWxlcnMgfVxuXG4gICAgcmV0dXJuIHsgc3RhdHVzQ29kZSwgZGF0YSwgaGVhZGVycywgdHJhaWxlcnMgfVxuICB9XG5cbiAgdmFsaWRhdGVSZXBseVBhcmFtZXRlcnMgKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzQ29kZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc3RhdHVzQ29kZSBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2RhdGEgbXVzdCBiZSBkZWZpbmVkJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXNwb25zZU9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Jlc3BvbnNlT3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vY2sgYW4gdW5kaWNpIHJlcXVlc3Qgd2l0aCBhIGRlZmluZWQgcmVwbHkuXG4gICAqL1xuICByZXBseSAocmVwbHlEYXRhKSB7XG4gICAgLy8gVmFsdWVzIG9mIHJlcGx5IGFyZW4ndCBhdmFpbGFibGUgcmlnaHQgbm93IGFzIHRoZXlcbiAgICAvLyBjYW4gb25seSBiZSBhdmFpbGFibGUgd2hlbiB0aGUgcmVwbHkgY2FsbGJhY2sgaXMgaW52b2tlZC5cbiAgICBpZiAodHlwZW9mIHJlcGx5RGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gV2UnbGwgZmlyc3Qgd3JhcCB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgaW4gYW5vdGhlciBmdW5jdGlvbixcbiAgICAgIC8vIHRoaXMgZnVuY3Rpb24gd2lsbCBwcm9wZXJseSByZXNvbHZlIHRoZSBkYXRhIGZyb20gdGhlIGNhbGxiYWNrXG4gICAgICAvLyB3aGVuIGludm9rZWQuXG4gICAgICBjb25zdCB3cmFwcGVkRGVmYXVsdHNDYWxsYmFjayA9IChvcHRzKSA9PiB7XG4gICAgICAgIC8vIE91ciByZXBseSBvcHRpb25zIGNhbGxiYWNrIGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXIgZm9yIHN0YXR1c0NvZGUsIGRhdGEgYW5kIG9wdGlvbnMuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHJlcGx5RGF0YShvcHRzKVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGluIHRoZSByaWdodCBmb3JtYXRcbiAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZlZERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdyZXBseSBvcHRpb25zIGNhbGxiYWNrIG11c3QgcmV0dXJuIGFuIG9iamVjdCcpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0YXR1c0NvZGUsIGRhdGEgPSAnJywgcmVzcG9uc2VPcHRpb25zID0ge30gfSA9IHJlc29sdmVkRGF0YVxuICAgICAgICB0aGlzLnZhbGlkYXRlUmVwbHlQYXJhbWV0ZXJzKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucylcbiAgICAgICAgLy8gU2luY2UgdGhlIHZhbHVlcyBjYW4gYmUgb2J0YWluZWQgaW1tZWRpYXRlbHkgd2UgcmV0dXJuIHRoZW1cbiAgICAgICAgLy8gZnJvbSB0aGlzIGhpZ2hlciBvcmRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgbGF0ZXIuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy5jcmVhdGVNb2NrU2NvcGVEaXNwYXRjaERhdGEoc3RhdHVzQ29kZSwgZGF0YSwgcmVzcG9uc2VPcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB1c3VhbCBkaXNwYXRjaCBkYXRhLCBidXQgdGhpcyB0aW1lIHNldCB0aGUgZGF0YSBwYXJhbWV0ZXIgdG8gZnVuY3Rpb24gdGhhdCB3aWxsIGV2ZW50dWFsbHkgcHJvdmlkZSBkYXRhLlxuICAgICAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0gYWRkTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCB0aGlzW2tEaXNwYXRjaEtleV0sIHdyYXBwZWREZWZhdWx0c0NhbGxiYWNrKVxuICAgICAgcmV0dXJuIG5ldyBNb2NrU2NvcGUobmV3TW9ja0Rpc3BhdGNoKVxuICAgIH1cblxuICAgIC8vIFdlIGNhbiBoYXZlIGVpdGhlciBvbmUgb3IgdGhyZWUgcGFyYW1ldGVycywgaWYgd2UgZ2V0IGhlcmUsXG4gICAgLy8gd2Ugc2hvdWxkIGhhdmUgMS0zIHBhcmFtZXRlcnMuIFNvIHdlIHNwcmVhZCB0aGUgYXJndW1lbnRzIG9mXG4gICAgLy8gdGhpcyBmdW5jdGlvbiB0byBvYnRhaW4gdGhlIHBhcmFtZXRlcnMsIHNpbmNlIHJlcGx5RGF0YSB3aWxsIGFsd2F5c1xuICAgIC8vIGp1c3QgYmUgdGhlIHN0YXR1c0NvZGUuXG4gICAgY29uc3QgW3N0YXR1c0NvZGUsIGRhdGEgPSAnJywgcmVzcG9uc2VPcHRpb25zID0ge31dID0gWy4uLmFyZ3VtZW50c11cbiAgICB0aGlzLnZhbGlkYXRlUmVwbHlQYXJhbWV0ZXJzKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucylcblxuICAgIC8vIFNlbmQgaW4tYWxyZWFkeSBwcm92aWRlZCBkYXRhIGxpa2UgdXN1YWxcbiAgICBjb25zdCBkaXNwYXRjaERhdGEgPSB0aGlzLmNyZWF0ZU1vY2tTY29wZURpc3BhdGNoRGF0YShzdGF0dXNDb2RlLCBkYXRhLCByZXNwb25zZU9wdGlvbnMpXG4gICAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0gYWRkTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCB0aGlzW2tEaXNwYXRjaEtleV0sIGRpc3BhdGNoRGF0YSlcbiAgICByZXR1cm4gbmV3IE1vY2tTY29wZShuZXdNb2NrRGlzcGF0Y2gpXG4gIH1cblxuICAvKipcbiAgICogTW9jayBhbiB1bmRpY2kgcmVxdWVzdCB3aXRoIGEgZGVmaW5lZCBlcnJvci5cbiAgICovXG4gIHJlcGx5V2l0aEVycm9yIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Vycm9yIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuXG4gICAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0gYWRkTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCB0aGlzW2tEaXNwYXRjaEtleV0sIHsgZXJyb3IgfSlcbiAgICByZXR1cm4gbmV3IE1vY2tTY29wZShuZXdNb2NrRGlzcGF0Y2gpXG4gIH1cblxuICAvKipcbiAgICogU2V0IGRlZmF1bHQgcmVwbHkgaGVhZGVycyBvbiB0aGUgaW50ZXJjZXB0b3IgZm9yIHN1YnNlcXVlbnQgcmVwbGllc1xuICAgKi9cbiAgZGVmYXVsdFJlcGx5SGVhZGVycyAoaGVhZGVycykge1xuICAgIGlmICh0eXBlb2YgaGVhZGVycyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGVhZGVycyBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cblxuICAgIHRoaXNba0RlZmF1bHRIZWFkZXJzXSA9IGhlYWRlcnNcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IHJlcGx5IHRyYWlsZXJzIG9uIHRoZSBpbnRlcmNlcHRvciBmb3Igc3Vic2VxdWVudCByZXBsaWVzXG4gICAqL1xuICBkZWZhdWx0UmVwbHlUcmFpbGVycyAodHJhaWxlcnMpIHtcbiAgICBpZiAodHlwZW9mIHRyYWlsZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd0cmFpbGVycyBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cblxuICAgIHRoaXNba0RlZmF1bHRUcmFpbGVyc10gPSB0cmFpbGVyc1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHJlcGx5IGNvbnRlbnQgbGVuZ3RoIGhlYWRlciBmb3IgcmVwbGllcyBvbiB0aGUgaW50ZXJjZXB0b3JcbiAgICovXG4gIHJlcGx5Q29udGVudExlbmd0aCAoKSB7XG4gICAgdGhpc1trQ29udGVudExlbmd0aF0gPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5Nb2NrSW50ZXJjZXB0b3IgPSBNb2NrSW50ZXJjZXB0b3Jcbm1vZHVsZS5leHBvcnRzLk1vY2tTY29wZSA9IE1vY2tTY29wZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBwcm9taXNpZnkgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi4vY2xpZW50JylcbmNvbnN0IHsgYnVpbGRNb2NrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vbW9jay11dGlscycpXG5jb25zdCB7XG4gIGtEaXNwYXRjaGVzLFxuICBrTW9ja0FnZW50LFxuICBrQ2xvc2UsXG4gIGtPcmlnaW5hbENsb3NlLFxuICBrT3JpZ2luLFxuICBrT3JpZ2luYWxEaXNwYXRjaCxcbiAga0Nvbm5lY3RlZFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgTW9ja0ludGVyY2VwdG9yIH0gPSByZXF1aXJlKCcuL21vY2staW50ZXJjZXB0b3InKVxuY29uc3QgU3ltYm9scyA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbi8qKlxuICogTW9ja0NsaWVudCBwcm92aWRlcyBhbiBBUEkgdGhhdCBleHRlbmRzIHRoZSBDbGllbnQgdG8gaW5mbHVlbmNlIHRoZSBtb2NrRGlzcGF0Y2hlcy5cbiAqL1xuY2xhc3MgTW9ja0NsaWVudCBleHRlbmRzIENsaWVudCB7XG4gIGNvbnN0cnVjdG9yIChvcmlnaW4sIG9wdHMpIHtcbiAgICBzdXBlcihvcmlnaW4sIG9wdHMpXG5cbiAgICBpZiAoIW9wdHMgfHwgIW9wdHMuYWdlbnQgfHwgdHlwZW9mIG9wdHMuYWdlbnQuZGlzcGF0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQXJndW1lbnQgb3B0cy5hZ2VudCBtdXN0IGltcGxlbWVudCBBZ2VudCcpXG4gICAgfVxuXG4gICAgdGhpc1trTW9ja0FnZW50XSA9IG9wdHMuYWdlbnRcbiAgICB0aGlzW2tPcmlnaW5dID0gb3JpZ2luXG4gICAgdGhpc1trRGlzcGF0Y2hlc10gPSBbXVxuICAgIHRoaXNba0Nvbm5lY3RlZF0gPSAxXG4gICAgdGhpc1trT3JpZ2luYWxEaXNwYXRjaF0gPSB0aGlzLmRpc3BhdGNoXG4gICAgdGhpc1trT3JpZ2luYWxDbG9zZV0gPSB0aGlzLmNsb3NlLmJpbmQodGhpcylcblxuICAgIHRoaXMuZGlzcGF0Y2ggPSBidWlsZE1vY2tEaXNwYXRjaC5jYWxsKHRoaXMpXG4gICAgdGhpcy5jbG9zZSA9IHRoaXNba0Nsb3NlXVxuICB9XG5cbiAgZ2V0IFtTeW1ib2xzLmtDb25uZWN0ZWRdICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ29ubmVjdGVkXVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgdGhlIGJhc2UgaW50ZXJjZXB0b3IgZm9yIG1vY2tpbmcgcmVwbGllcyBmcm9tIHVuZGljaS5cbiAgICovXG4gIGludGVyY2VwdCAob3B0cykge1xuICAgIHJldHVybiBuZXcgTW9ja0ludGVyY2VwdG9yKG9wdHMsIHRoaXNba0Rpc3BhdGNoZXNdKVxuICB9XG5cbiAgYXN5bmMgW2tDbG9zZV0gKCkge1xuICAgIGF3YWl0IHByb21pc2lmeSh0aGlzW2tPcmlnaW5hbENsb3NlXSkoKVxuICAgIHRoaXNba0Nvbm5lY3RlZF0gPSAwXG4gICAgdGhpc1trTW9ja0FnZW50XVtTeW1ib2xzLmtDbGllbnRzXS5kZWxldGUodGhpc1trT3JpZ2luXSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1vY2tDbGllbnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcHJvbWlzaWZ5IH0gPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuLi9wb29sJylcbmNvbnN0IHsgYnVpbGRNb2NrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vbW9jay11dGlscycpXG5jb25zdCB7XG4gIGtEaXNwYXRjaGVzLFxuICBrTW9ja0FnZW50LFxuICBrQ2xvc2UsXG4gIGtPcmlnaW5hbENsb3NlLFxuICBrT3JpZ2luLFxuICBrT3JpZ2luYWxEaXNwYXRjaCxcbiAga0Nvbm5lY3RlZFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgTW9ja0ludGVyY2VwdG9yIH0gPSByZXF1aXJlKCcuL21vY2staW50ZXJjZXB0b3InKVxuY29uc3QgU3ltYm9scyA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbi8qKlxuICogTW9ja1Bvb2wgcHJvdmlkZXMgYW4gQVBJIHRoYXQgZXh0ZW5kcyB0aGUgUG9vbCB0byBpbmZsdWVuY2UgdGhlIG1vY2tEaXNwYXRjaGVzLlxuICovXG5jbGFzcyBNb2NrUG9vbCBleHRlbmRzIFBvb2wge1xuICBjb25zdHJ1Y3RvciAob3JpZ2luLCBvcHRzKSB7XG4gICAgc3VwZXIob3JpZ2luLCBvcHRzKVxuXG4gICAgaWYgKCFvcHRzIHx8ICFvcHRzLmFnZW50IHx8IHR5cGVvZiBvcHRzLmFnZW50LmRpc3BhdGNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0FyZ3VtZW50IG9wdHMuYWdlbnQgbXVzdCBpbXBsZW1lbnQgQWdlbnQnKVxuICAgIH1cblxuICAgIHRoaXNba01vY2tBZ2VudF0gPSBvcHRzLmFnZW50XG4gICAgdGhpc1trT3JpZ2luXSA9IG9yaWdpblxuICAgIHRoaXNba0Rpc3BhdGNoZXNdID0gW11cbiAgICB0aGlzW2tDb25uZWN0ZWRdID0gMVxuICAgIHRoaXNba09yaWdpbmFsRGlzcGF0Y2hdID0gdGhpcy5kaXNwYXRjaFxuICAgIHRoaXNba09yaWdpbmFsQ2xvc2VdID0gdGhpcy5jbG9zZS5iaW5kKHRoaXMpXG5cbiAgICB0aGlzLmRpc3BhdGNoID0gYnVpbGRNb2NrRGlzcGF0Y2guY2FsbCh0aGlzKVxuICAgIHRoaXMuY2xvc2UgPSB0aGlzW2tDbG9zZV1cbiAgfVxuXG4gIGdldCBbU3ltYm9scy5rQ29ubmVjdGVkXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0Nvbm5lY3RlZF1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHRoZSBiYXNlIGludGVyY2VwdG9yIGZvciBtb2NraW5nIHJlcGxpZXMgZnJvbSB1bmRpY2kuXG4gICAqL1xuICBpbnRlcmNlcHQgKG9wdHMpIHtcbiAgICByZXR1cm4gbmV3IE1vY2tJbnRlcmNlcHRvcihvcHRzLCB0aGlzW2tEaXNwYXRjaGVzXSlcbiAgfVxuXG4gIGFzeW5jIFtrQ2xvc2VdICgpIHtcbiAgICBhd2FpdCBwcm9taXNpZnkodGhpc1trT3JpZ2luYWxDbG9zZV0pKClcbiAgICB0aGlzW2tDb25uZWN0ZWRdID0gMFxuICAgIHRoaXNba01vY2tBZ2VudF1bU3ltYm9scy5rQ2xpZW50c10uZGVsZXRlKHRoaXNba09yaWdpbl0pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2NrUG9vbFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qgc2luZ3VsYXJzID0ge1xuICBwcm9ub3VuOiAnaXQnLFxuICBpczogJ2lzJyxcbiAgd2FzOiAnd2FzJyxcbiAgdGhpczogJ3RoaXMnXG59XG5cbmNvbnN0IHBsdXJhbHMgPSB7XG4gIHByb25vdW46ICd0aGV5JyxcbiAgaXM6ICdhcmUnLFxuICB3YXM6ICd3ZXJlJyxcbiAgdGhpczogJ3RoZXNlJ1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFBsdXJhbGl6ZXIge1xuICBjb25zdHJ1Y3RvciAoc2luZ3VsYXIsIHBsdXJhbCkge1xuICAgIHRoaXMuc2luZ3VsYXIgPSBzaW5ndWxhclxuICAgIHRoaXMucGx1cmFsID0gcGx1cmFsXG4gIH1cblxuICBwbHVyYWxpemUgKGNvdW50KSB7XG4gICAgY29uc3Qgb25lID0gY291bnQgPT09IDFcbiAgICBjb25zdCBrZXlzID0gb25lID8gc2luZ3VsYXJzIDogcGx1cmFsc1xuICAgIGNvbnN0IG5vdW4gPSBvbmUgPyB0aGlzLnNpbmd1bGFyIDogdGhpcy5wbHVyYWxcbiAgICByZXR1cm4geyAuLi5rZXlzLCBjb3VudCwgbm91biB9XG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgVHJhbnNmb3JtIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgeyBDb25zb2xlIH0gPSByZXF1aXJlKCdjb25zb2xlJylcblxuLyoqXG4gKiBHZXRzIHRoZSBvdXRwdXQgb2YgYGNvbnNvbGUudGFibGUo4oCmKWAgYXMgYSBzdHJpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUGVuZGluZ0ludGVyY2VwdG9yc0Zvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yICh7IGRpc2FibGVDb2xvcnMgfSA9IHt9KSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKHtcbiAgICAgIHRyYW5zZm9ybSAoY2h1bmssIF9lbmMsIGNiKSB7XG4gICAgICAgIGNiKG51bGwsIGNodW5rKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBDb25zb2xlKHtcbiAgICAgIHN0ZG91dDogdGhpcy50cmFuc2Zvcm0sXG4gICAgICBpbnNwZWN0T3B0aW9uczoge1xuICAgICAgICBjb2xvcnM6ICFkaXNhYmxlQ29sb3JzICYmICFwcm9jZXNzLmVudi5DSVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmb3JtYXQgKHBlbmRpbmdJbnRlcmNlcHRvcnMpIHtcbiAgICBjb25zdCB3aXRoUHJldHR5SGVhZGVycyA9IHBlbmRpbmdJbnRlcmNlcHRvcnMubWFwKFxuICAgICAgKHsgbWV0aG9kLCBwYXRoLCBkYXRhOiB7IHN0YXR1c0NvZGUgfSwgcGVyc2lzdCwgdGltZXMsIHRpbWVzSW52b2tlZCwgb3JpZ2luIH0pID0+ICh7XG4gICAgICAgIE1ldGhvZDogbWV0aG9kLFxuICAgICAgICBPcmlnaW46IG9yaWdpbixcbiAgICAgICAgUGF0aDogcGF0aCxcbiAgICAgICAgJ1N0YXR1cyBjb2RlJzogc3RhdHVzQ29kZSxcbiAgICAgICAgUGVyc2lzdGVudDogcGVyc2lzdCA/ICfinIUnIDogJ+KdjCcsXG4gICAgICAgIEludm9jYXRpb25zOiB0aW1lc0ludm9rZWQsXG4gICAgICAgIFJlbWFpbmluZzogcGVyc2lzdCA/IEluZmluaXR5IDogdGltZXMgLSB0aW1lc0ludm9rZWRcbiAgICAgIH0pKVxuXG4gICAgdGhpcy5sb2dnZXIudGFibGUod2l0aFByZXR0eUhlYWRlcnMpXG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnJlYWQoKS50b1N0cmluZygpXG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga0NsaWVudHMgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4uL2FnZW50JylcbmNvbnN0IHtcbiAga0FnZW50LFxuICBrTW9ja0FnZW50U2V0LFxuICBrTW9ja0FnZW50R2V0LFxuICBrRGlzcGF0Y2hlcyxcbiAga0lzTW9ja0FjdGl2ZSxcbiAga05ldENvbm5lY3QsXG4gIGtHZXROZXRDb25uZWN0LFxuICBrT3B0aW9ucyxcbiAga0ZhY3Rvcnlcbn0gPSByZXF1aXJlKCcuL21vY2stc3ltYm9scycpXG5jb25zdCBNb2NrQ2xpZW50ID0gcmVxdWlyZSgnLi9tb2NrLWNsaWVudCcpXG5jb25zdCBNb2NrUG9vbCA9IHJlcXVpcmUoJy4vbW9jay1wb29sJylcbmNvbnN0IHsgbWF0Y2hWYWx1ZSwgYnVpbGRNb2NrT3B0aW9ucyB9ID0gcmVxdWlyZSgnLi9tb2NrLXV0aWxzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIFVuZGljaUVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi4vZGlzcGF0Y2hlcicpXG5jb25zdCBQbHVyYWxpemVyID0gcmVxdWlyZSgnLi9wbHVyYWxpemVyJylcbmNvbnN0IFBlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIgPSByZXF1aXJlKCcuL3BlbmRpbmctaW50ZXJjZXB0b3JzLWZvcm1hdHRlcicpXG5cbmNsYXNzIEZha2VXZWFrUmVmIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICBkZXJlZiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxufVxuXG5jbGFzcyBNb2NrQWdlbnQgZXh0ZW5kcyBEaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuXG4gICAgdGhpc1trTmV0Q29ubmVjdF0gPSB0cnVlXG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IHRydWVcblxuICAgIC8vIEluc3RhbnRpYXRlIEFnZW50IGFuZCBlbmNhcHN1bGF0ZVxuICAgIGlmICgob3B0cyAmJiBvcHRzLmFnZW50ICYmIHR5cGVvZiBvcHRzLmFnZW50LmRpc3BhdGNoICE9PSAnZnVuY3Rpb24nKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBcmd1bWVudCBvcHRzLmFnZW50IG11c3QgaW1wbGVtZW50IEFnZW50JylcbiAgICB9XG4gICAgY29uc3QgYWdlbnQgPSBvcHRzICYmIG9wdHMuYWdlbnQgPyBvcHRzLmFnZW50IDogbmV3IEFnZW50KG9wdHMpXG4gICAgdGhpc1trQWdlbnRdID0gYWdlbnRcblxuICAgIHRoaXNba0NsaWVudHNdID0gYWdlbnRba0NsaWVudHNdXG4gICAgdGhpc1trT3B0aW9uc10gPSBidWlsZE1vY2tPcHRpb25zKG9wdHMpXG4gIH1cblxuICBnZXQgKG9yaWdpbikge1xuICAgIGxldCBkaXNwYXRjaGVyID0gdGhpc1trTW9ja0FnZW50R2V0XShvcmlnaW4pXG5cbiAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgIGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XShvcmlnaW4pXG4gICAgICB0aGlzW2tNb2NrQWdlbnRTZXRdKG9yaWdpbiwgZGlzcGF0Y2hlcilcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgfVxuXG4gIGRpc3BhdGNoIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgLy8gQ2FsbCBNb2NrQWdlbnQuZ2V0IHRvIHBlcmZvcm0gYWRkaXRpb25hbCBzZXR1cCBiZWZvcmUgZGlzcGF0Y2hpbmcgYXMgbm9ybWFsXG4gICAgdGhpcy5nZXQob3B0cy5vcmlnaW4pXG4gICAgcmV0dXJuIHRoaXNba0FnZW50XS5kaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgYXN5bmMgY2xvc2UgKCkge1xuICAgIGF3YWl0IHRoaXNba0FnZW50XS5jbG9zZSgpXG4gICAgdGhpc1trQ2xpZW50c10uY2xlYXIoKVxuICB9XG5cbiAgZGVhY3RpdmF0ZSAoKSB7XG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IGZhbHNlXG4gIH1cblxuICBhY3RpdmF0ZSAoKSB7XG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IHRydWVcbiAgfVxuXG4gIGVuYWJsZU5ldENvbm5lY3QgKG1hdGNoZXIpIHtcbiAgICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXRjaGVyID09PSAnZnVuY3Rpb24nIHx8IG1hdGNoZXIgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXNba05ldENvbm5lY3RdKSkge1xuICAgICAgICB0aGlzW2tOZXRDb25uZWN0XS5wdXNoKG1hdGNoZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW2tOZXRDb25uZWN0XSA9IFttYXRjaGVyXVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzW2tOZXRDb25uZWN0XSA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdVbnN1cHBvcnRlZCBtYXRjaGVyLiBNdXN0IGJlIG9uZSBvZiBTdHJpbmd8RnVuY3Rpb258UmVnRXhwLicpXG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZU5ldENvbm5lY3QgKCkge1xuICAgIHRoaXNba05ldENvbm5lY3RdID0gZmFsc2VcbiAgfVxuXG4gIC8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gYnlwYXNzIGlzc3VlcyBjYXVzZWQgYnkgdXNpbmcgZ2xvYmFsIHN5bWJvbHMgLSBzZWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xNDQ3XG4gIGdldCBpc01vY2tBY3RpdmUgKCkge1xuICAgIHJldHVybiB0aGlzW2tJc01vY2tBY3RpdmVdXG4gIH1cblxuICBba01vY2tBZ2VudFNldF0gKG9yaWdpbiwgZGlzcGF0Y2hlcikge1xuICAgIHRoaXNba0NsaWVudHNdLnNldChvcmlnaW4sIG5ldyBGYWtlV2Vha1JlZihkaXNwYXRjaGVyKSlcbiAgfVxuXG4gIFtrRmFjdG9yeV0gKG9yaWdpbikge1xuICAgIGNvbnN0IG1vY2tPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IGFnZW50OiB0aGlzIH0sIHRoaXNba09wdGlvbnNdKVxuICAgIHJldHVybiB0aGlzW2tPcHRpb25zXSAmJiB0aGlzW2tPcHRpb25zXS5jb25uZWN0aW9ucyA9PT0gMVxuICAgICAgPyBuZXcgTW9ja0NsaWVudChvcmlnaW4sIG1vY2tPcHRpb25zKVxuICAgICAgOiBuZXcgTW9ja1Bvb2wob3JpZ2luLCBtb2NrT3B0aW9ucylcbiAgfVxuXG4gIFtrTW9ja0FnZW50R2V0XSAob3JpZ2luKSB7XG4gICAgLy8gRmlyc3QgY2hlY2sgaWYgd2UgY2FuIGltbWVkaWF0ZWx5IGZpbmQgaXRcbiAgICBjb25zdCByZWYgPSB0aGlzW2tDbGllbnRzXS5nZXQob3JpZ2luKVxuICAgIGlmIChyZWYpIHtcbiAgICAgIHJldHVybiByZWYuZGVyZWYoKVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBvcmlnaW4gaXMgbm90IGEgc3RyaW5nIGNyZWF0ZSBhIGR1bW15IHBhcmVudCBwb29sIGFuZCByZXR1cm4gdG8gdXNlclxuICAgIGlmICh0eXBlb2Ygb3JpZ2luICE9PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXNba0ZhY3RvcnldKCdodHRwOi8vbG9jYWxob3N0Ojk5OTknKVxuICAgICAgdGhpc1trTW9ja0FnZW50U2V0XShvcmlnaW4sIGRpc3BhdGNoZXIpXG4gICAgICByZXR1cm4gZGlzcGF0Y2hlclxuICAgIH1cblxuICAgIC8vIElmIHdlIG1hdGNoLCBjcmVhdGUgYSBwb29sIGFuZCBhc3NpZ24gdGhlIHNhbWUgZGlzcGF0Y2hlc1xuICAgIGZvciAoY29uc3QgW2tleU1hdGNoZXIsIG5vbkV4cGxpY2l0UmVmXSBvZiBBcnJheS5mcm9tKHRoaXNba0NsaWVudHNdKSkge1xuICAgICAgY29uc3Qgbm9uRXhwbGljaXREaXNwYXRjaGVyID0gbm9uRXhwbGljaXRSZWYuZGVyZWYoKVxuICAgICAgaWYgKG5vbkV4cGxpY2l0RGlzcGF0Y2hlciAmJiB0eXBlb2Yga2V5TWF0Y2hlciAhPT0gJ3N0cmluZycgJiYgbWF0Y2hWYWx1ZShrZXlNYXRjaGVyLCBvcmlnaW4pKSB7XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XShvcmlnaW4pXG4gICAgICAgIHRoaXNba01vY2tBZ2VudFNldF0ob3JpZ2luLCBkaXNwYXRjaGVyKVxuICAgICAgICBkaXNwYXRjaGVyW2tEaXNwYXRjaGVzXSA9IG5vbkV4cGxpY2l0RGlzcGF0Y2hlcltrRGlzcGF0Y2hlc11cbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBba0dldE5ldENvbm5lY3RdICgpIHtcbiAgICByZXR1cm4gdGhpc1trTmV0Q29ubmVjdF1cbiAgfVxuXG4gIHBlbmRpbmdJbnRlcmNlcHRvcnMgKCkge1xuICAgIGNvbnN0IG1vY2tBZ2VudENsaWVudHMgPSB0aGlzW2tDbGllbnRzXVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obW9ja0FnZW50Q2xpZW50cy5lbnRyaWVzKCkpXG4gICAgICAuZmxhdE1hcCgoW29yaWdpbiwgc2NvcGVdKSA9PiBzY29wZS5kZXJlZigpW2tEaXNwYXRjaGVzXS5tYXAoZGlzcGF0Y2ggPT4gKHsgLi4uZGlzcGF0Y2gsIG9yaWdpbiB9KSkpXG4gICAgICAuZmlsdGVyKCh7IHBlbmRpbmcgfSkgPT4gcGVuZGluZylcbiAgfVxuXG4gIGFzc2VydE5vUGVuZGluZ0ludGVyY2VwdG9ycyAoeyBwZW5kaW5nSW50ZXJjZXB0b3JzRm9ybWF0dGVyID0gbmV3IFBlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIoKSB9ID0ge30pIHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nSW50ZXJjZXB0b3JzKClcblxuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGx1cmFsaXplciA9IG5ldyBQbHVyYWxpemVyKCdpbnRlcmNlcHRvcicsICdpbnRlcmNlcHRvcnMnKS5wbHVyYWxpemUocGVuZGluZy5sZW5ndGgpXG5cbiAgICB0aHJvdyBuZXcgVW5kaWNpRXJyb3IoYFxuJHtwbHVyYWxpemVyLmNvdW50fSAke3BsdXJhbGl6ZXIubm91bn0gJHtwbHVyYWxpemVyLmlzfSBwZW5kaW5nOlxuXG4ke3BlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIuZm9ybWF0KHBlbmRpbmcpfVxuYC50cmltKCkpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2NrQWdlbnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga1Byb3h5LCBrQ2xvc2UsIGtEZXN0cm95LCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IFVSTCB9ID0gcmVxdWlyZSgndXJsJylcbmNvbnN0IEFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudCcpXG5jb25zdCBQb29sID0gcmVxdWlyZSgnLi9wb29sJylcbmNvbnN0IERpc3BhdGNoZXJCYXNlID0gcmVxdWlyZSgnLi9kaXNwYXRjaGVyLWJhc2UnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgUmVxdWVzdEFib3J0ZWRFcnJvciB9ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCBidWlsZENvbm5lY3RvciA9IHJlcXVpcmUoJy4vY29yZS9jb25uZWN0JylcblxuY29uc3Qga0FnZW50ID0gU3ltYm9sKCdwcm94eSBhZ2VudCcpXG5jb25zdCBrQ2xpZW50ID0gU3ltYm9sKCdwcm94eSBjbGllbnQnKVxuY29uc3Qga1Byb3h5SGVhZGVycyA9IFN5bWJvbCgncHJveHkgaGVhZGVycycpXG5jb25zdCBrUmVxdWVzdFRscyA9IFN5bWJvbCgncmVxdWVzdCB0bHMgc2V0dGluZ3MnKVxuY29uc3Qga1Byb3h5VGxzID0gU3ltYm9sKCdwcm94eSB0bHMgc2V0dGluZ3MnKVxuY29uc3Qga0Nvbm5lY3RFbmRwb2ludCA9IFN5bWJvbCgnY29ubmVjdCBlbmRwb2ludCBmdW5jdGlvbicpXG5cbmZ1bmN0aW9uIGRlZmF1bHRQcm90b2NvbFBvcnQgKHByb3RvY29sKSB7XG4gIHJldHVybiBwcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MFxufVxuXG5mdW5jdGlvbiBidWlsZFByb3h5T3B0aW9ucyAob3B0cykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0cyA9IHsgdXJpOiBvcHRzIH1cbiAgfVxuXG4gIGlmICghb3B0cyB8fCAhb3B0cy51cmkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1Byb3h5IG9wdHMudXJpIGlzIG1hbmRhdG9yeScpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHVyaTogb3B0cy51cmksXG4gICAgcHJvdG9jb2w6IG9wdHMucHJvdG9jb2wgfHwgJ2h0dHBzJ1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRGYWN0b3J5IChvcmlnaW4sIG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBQb29sKG9yaWdpbiwgb3B0cylcbn1cblxuY2xhc3MgUHJveHlBZ2VudCBleHRlbmRzIERpc3BhdGNoZXJCYXNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXNba1Byb3h5XSA9IGJ1aWxkUHJveHlPcHRpb25zKG9wdHMpXG4gICAgdGhpc1trQWdlbnRdID0gbmV3IEFnZW50KG9wdHMpXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG9wdHMuaW50ZXJjZXB0b3JzICYmIG9wdHMuaW50ZXJjZXB0b3JzLlByb3h5QWdlbnQgJiYgQXJyYXkuaXNBcnJheShvcHRzLmludGVyY2VwdG9ycy5Qcm94eUFnZW50KVxuICAgICAgPyBvcHRzLmludGVyY2VwdG9ycy5Qcm94eUFnZW50XG4gICAgICA6IFtdXG5cbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRzID0geyB1cmk6IG9wdHMgfVxuICAgIH1cblxuICAgIGlmICghb3B0cyB8fCAhb3B0cy51cmkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignUHJveHkgb3B0cy51cmkgaXMgbWFuZGF0b3J5JylcbiAgICB9XG5cbiAgICBjb25zdCB7IGNsaWVudEZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSB9ID0gb3B0c1xuXG4gICAgaWYgKHR5cGVvZiBjbGllbnRGYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1Byb3h5IG9wdHMuY2xpZW50RmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICB0aGlzW2tSZXF1ZXN0VGxzXSA9IG9wdHMucmVxdWVzdFRsc1xuICAgIHRoaXNba1Byb3h5VGxzXSA9IG9wdHMucHJveHlUbHNcbiAgICB0aGlzW2tQcm94eUhlYWRlcnNdID0gb3B0cy5oZWFkZXJzIHx8IHt9XG5cbiAgICBjb25zdCByZXNvbHZlZFVybCA9IG5ldyBVUkwob3B0cy51cmkpXG4gICAgY29uc3QgeyBvcmlnaW4sIHBvcnQsIGhvc3QsIHVzZXJuYW1lLCBwYXNzd29yZCB9ID0gcmVzb2x2ZWRVcmxcblxuICAgIGlmIChvcHRzLmF1dGggJiYgb3B0cy50b2tlbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdvcHRzLmF1dGggY2Fubm90IGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBvcHRzLnRva2VuJylcbiAgICB9IGVsc2UgaWYgKG9wdHMuYXV0aCkge1xuICAgICAgLyogQGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIG9wdHMudG9rZW4gKi9cbiAgICAgIHRoaXNba1Byb3h5SGVhZGVyc11bJ3Byb3h5LWF1dGhvcml6YXRpb24nXSA9IGBCYXNpYyAke29wdHMuYXV0aH1gXG4gICAgfSBlbHNlIGlmIChvcHRzLnRva2VuKSB7XG4gICAgICB0aGlzW2tQcm94eUhlYWRlcnNdWydwcm94eS1hdXRob3JpemF0aW9uJ10gPSBvcHRzLnRva2VuXG4gICAgfSBlbHNlIGlmICh1c2VybmFtZSAmJiBwYXNzd29yZCkge1xuICAgICAgdGhpc1trUHJveHlIZWFkZXJzXVsncHJveHktYXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7ZGVjb2RlVVJJQ29tcG9uZW50KHVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQocGFzc3dvcmQpfWApLnRvU3RyaW5nKCdiYXNlNjQnKX1gXG4gICAgfVxuXG4gICAgY29uc3QgY29ubmVjdCA9IGJ1aWxkQ29ubmVjdG9yKHsgLi4ub3B0cy5wcm94eVRscyB9KVxuICAgIHRoaXNba0Nvbm5lY3RFbmRwb2ludF0gPSBidWlsZENvbm5lY3Rvcih7IC4uLm9wdHMucmVxdWVzdFRscyB9KVxuICAgIHRoaXNba0NsaWVudF0gPSBjbGllbnRGYWN0b3J5KHJlc29sdmVkVXJsLCB7IGNvbm5lY3QgfSlcbiAgICB0aGlzW2tBZ2VudF0gPSBuZXcgQWdlbnQoe1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGNvbm5lY3Q6IGFzeW5jIChvcHRzLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBsZXQgcmVxdWVzdGVkSG9zdCA9IG9wdHMuaG9zdFxuICAgICAgICBpZiAoIW9wdHMucG9ydCkge1xuICAgICAgICAgIHJlcXVlc3RlZEhvc3QgKz0gYDoke2RlZmF1bHRQcm90b2NvbFBvcnQob3B0cy5wcm90b2NvbCl9YFxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBzb2NrZXQsIHN0YXR1c0NvZGUgfSA9IGF3YWl0IHRoaXNba0NsaWVudF0uY29ubmVjdCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgcGF0aDogcmVxdWVzdGVkSG9zdCxcbiAgICAgICAgICAgIHNpZ25hbDogb3B0cy5zaWduYWwsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIC4uLnRoaXNba1Byb3h5SGVhZGVyc10sXG4gICAgICAgICAgICAgIGhvc3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmIChzdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICAgIHNvY2tldC5vbignZXJyb3InLCAoKSA9PiB7fSkuZGVzdHJveSgpXG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcihgUHJveHkgcmVzcG9uc2UgKCR7c3RhdHVzQ29kZX0pICE9PSAyMDAgd2hlbiBIVFRQIFR1bm5lbGluZ2ApKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3B0cy5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNvY2tldClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgc2VydmVybmFtZVxuICAgICAgICAgIGlmICh0aGlzW2tSZXF1ZXN0VGxzXSkge1xuICAgICAgICAgICAgc2VydmVybmFtZSA9IHRoaXNba1JlcXVlc3RUbHNdLnNlcnZlcm5hbWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VydmVybmFtZSA9IG9wdHMuc2VydmVybmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzW2tDb25uZWN0RW5kcG9pbnRdKHsgLi4ub3B0cywgc2VydmVybmFtZSwgaHR0cFNvY2tldDogc29ja2V0IH0sIGNhbGxiYWNrKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCB7IGhvc3QgfSA9IG5ldyBVUkwob3B0cy5vcmlnaW4pXG4gICAgY29uc3QgaGVhZGVycyA9IGJ1aWxkSGVhZGVycyhvcHRzLmhlYWRlcnMpXG4gICAgdGhyb3dJZlByb3h5QXV0aElzU2VudChoZWFkZXJzKVxuICAgIHJldHVybiB0aGlzW2tBZ2VudF0uZGlzcGF0Y2goXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICAgIGhvc3RcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXJcbiAgICApXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgYXdhaXQgdGhpc1trQWdlbnRdLmNsb3NlKClcbiAgICBhd2FpdCB0aGlzW2tDbGllbnRdLmNsb3NlKClcbiAgfVxuXG4gIGFzeW5jIFtrRGVzdHJveV0gKCkge1xuICAgIGF3YWl0IHRoaXNba0FnZW50XS5kZXN0cm95KClcbiAgICBhd2FpdCB0aGlzW2tDbGllbnRdLmRlc3Ryb3koKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz59IGhlYWRlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fVxuICovXG5mdW5jdGlvbiBidWlsZEhlYWRlcnMgKGhlYWRlcnMpIHtcbiAgLy8gV2hlbiB1c2luZyB1bmRpY2kuZmV0Y2gsIHRoZSBoZWFkZXJzIGxpc3QgaXMgc3RvcmVkXG4gIC8vIGFzIGFuIGFycmF5LlxuICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBoZWFkZXJzUGFpciA9IHt9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGhlYWRlcnNQYWlyW2hlYWRlcnNbaV1dID0gaGVhZGVyc1tpICsgMV1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyc1BhaXJcbiAgfVxuXG4gIHJldHVybiBoZWFkZXJzXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBoZWFkZXJzXG4gKlxuICogUHJldmlvdXMgdmVyc2lvbnMgb2YgUHJveHlBZ2VudCBzdWdnZXN0cyB0aGUgUHJveHktQXV0aG9yaXphdGlvbiBpbiByZXF1ZXN0IGhlYWRlcnNcbiAqIE5ldmVydGhlbGVzcywgaXQgd2FzIGNoYW5nZWQgYW5kIHRvIGF2b2lkIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBieSBlbmQgdXNlcnNcbiAqIHRoaXMgY2hlY2sgd2FzIGNyZWF0ZWQuXG4gKiBJdCBzaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIGZvciBwZXJmb3JtYW5jZSByZWFzb25zXG4gKi9cbmZ1bmN0aW9uIHRocm93SWZQcm94eUF1dGhJc1NlbnQgKGhlYWRlcnMpIHtcbiAgY29uc3QgZXhpc3RQcm94eUF1dGggPSBoZWFkZXJzICYmIE9iamVjdC5rZXlzKGhlYWRlcnMpXG4gICAgLmZpbmQoKGtleSkgPT4ga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdwcm94eS1hdXRob3JpemF0aW9uJylcbiAgaWYgKGV4aXN0UHJveHlBdXRoKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdQcm94eS1BdXRob3JpemF0aW9uIHNob3VsZCBiZSBzZW50IGluIFByb3h5QWdlbnQgY29uc3RydWN0b3InKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUHJveHlBZ2VudFxuIiwKICAgICJjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCB7IGtSZXRyeUhhbmRsZXJEZWZhdWx0UmV0cnkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IFJlcXVlc3RSZXRyeUVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IGlzRGlzdHVyYmVkLCBwYXJzZUhlYWRlcnMsIHBhcnNlUmFuZ2VIZWFkZXIgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVJldHJ5QWZ0ZXJIZWFkZXIgKHJldHJ5QWZ0ZXIpIHtcbiAgY29uc3QgY3VycmVudCA9IERhdGUubm93KClcbiAgY29uc3QgZGlmZiA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXIpLmdldFRpbWUoKSAtIGN1cnJlbnRcblxuICByZXR1cm4gZGlmZlxufVxuXG5jbGFzcyBSZXRyeUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cywgaGFuZGxlcnMpIHtcbiAgICBjb25zdCB7IHJldHJ5T3B0aW9ucywgLi4uZGlzcGF0Y2hPcHRzIH0gPSBvcHRzXG4gICAgY29uc3Qge1xuICAgICAgLy8gUmV0cnkgc2NvcGVkXG4gICAgICByZXRyeTogcmV0cnlGbixcbiAgICAgIG1heFJldHJpZXMsXG4gICAgICBtYXhUaW1lb3V0LFxuICAgICAgbWluVGltZW91dCxcbiAgICAgIHRpbWVvdXRGYWN0b3IsXG4gICAgICAvLyBSZXNwb25zZSBzY29wZWRcbiAgICAgIG1ldGhvZHMsXG4gICAgICBlcnJvckNvZGVzLFxuICAgICAgcmV0cnlBZnRlcixcbiAgICAgIHN0YXR1c0NvZGVzXG4gICAgfSA9IHJldHJ5T3B0aW9ucyA/PyB7fVxuXG4gICAgdGhpcy5kaXNwYXRjaCA9IGhhbmRsZXJzLmRpc3BhdGNoXG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcnMuaGFuZGxlclxuICAgIHRoaXMub3B0cyA9IGRpc3BhdGNoT3B0c1xuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2VcbiAgICB0aGlzLnJldHJ5T3B0cyA9IHtcbiAgICAgIHJldHJ5OiByZXRyeUZuID8/IFJldHJ5SGFuZGxlcltrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5XSxcbiAgICAgIHJldHJ5QWZ0ZXI6IHJldHJ5QWZ0ZXIgPz8gdHJ1ZSxcbiAgICAgIG1heFRpbWVvdXQ6IG1heFRpbWVvdXQgPz8gMzAgKiAxMDAwLCAvLyAzMHMsXG4gICAgICB0aW1lb3V0OiBtaW5UaW1lb3V0ID8/IDUwMCwgLy8gLjVzXG4gICAgICB0aW1lb3V0RmFjdG9yOiB0aW1lb3V0RmFjdG9yID8/IDIsXG4gICAgICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzID8/IDUsXG4gICAgICAvLyBXaGF0IGVycm9ycyB3ZSBzaG91bGQgcmV0cnlcbiAgICAgIG1ldGhvZHM6IG1ldGhvZHMgPz8gWydHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BVVCcsICdERUxFVEUnLCAnVFJBQ0UnXSxcbiAgICAgIC8vIEluZGljYXRlcyB3aGljaCBlcnJvcnMgdG8gcmV0cnlcbiAgICAgIHN0YXR1c0NvZGVzOiBzdGF0dXNDb2RlcyA/PyBbNTAwLCA1MDIsIDUwMywgNTA0LCA0MjldLFxuICAgICAgLy8gTGlzdCBvZiBlcnJvcnMgdG8gcmV0cnlcbiAgICAgIGVycm9yQ29kZXM6IGVycm9yQ29kZXMgPz8gW1xuICAgICAgICAnRUNPTk5SRVNFVCcsXG4gICAgICAgICdFQ09OTlJFRlVTRUQnLFxuICAgICAgICAnRU5PVEZPVU5EJyxcbiAgICAgICAgJ0VORVRET1dOJyxcbiAgICAgICAgJ0VORVRVTlJFQUNIJyxcbiAgICAgICAgJ0VIT1NURE9XTicsXG4gICAgICAgICdFSE9TVFVOUkVBQ0gnLFxuICAgICAgICAnRVBJUEUnXG4gICAgICBdXG4gICAgfVxuXG4gICAgdGhpcy5yZXRyeUNvdW50ID0gMFxuICAgIHRoaXMuc3RhcnQgPSAwXG4gICAgdGhpcy5lbmQgPSBudWxsXG4gICAgdGhpcy5ldGFnID0gbnVsbFxuICAgIHRoaXMucmVzdW1lID0gbnVsbFxuXG4gICAgLy8gSGFuZGxlIHBvc3NpYmxlIG9uQ29ubmVjdCBkdXBsaWNhdGlvblxuICAgIHRoaXMuaGFuZGxlci5vbkNvbm5lY3QocmVhc29uID0+IHtcbiAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcbiAgICAgIGlmICh0aGlzLmFib3J0KSB7XG4gICAgICAgIHRoaXMuYWJvcnQocmVhc29uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZWFzb24gPSByZWFzb25cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25SZXF1ZXN0U2VudCAoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlci5vblJlcXVlc3RTZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZXIub25SZXF1ZXN0U2VudCgpXG4gICAgfVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyLm9uVXBncmFkZSkge1xuICAgICAgdGhpcy5oYW5kbGVyLm9uVXBncmFkZShzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpXG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCkge1xuICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgIGFib3J0KHRoaXMucmVhc29uKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB9XG4gIH1cblxuICBvbkJvZHlTZW50IChjaHVuaykge1xuICAgIGlmICh0aGlzLmhhbmRsZXIub25Cb2R5U2VudCkgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KGNodW5rKVxuICB9XG5cbiAgc3RhdGljIFtrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5XSAoZXJyLCB7IHN0YXRlLCBvcHRzIH0sIGNiKSB7XG4gICAgY29uc3QgeyBzdGF0dXNDb2RlLCBjb2RlLCBoZWFkZXJzIH0gPSBlcnJcbiAgICBjb25zdCB7IG1ldGhvZCwgcmV0cnlPcHRpb25zIH0gPSBvcHRzXG4gICAgY29uc3Qge1xuICAgICAgbWF4UmV0cmllcyxcbiAgICAgIHRpbWVvdXQsXG4gICAgICBtYXhUaW1lb3V0LFxuICAgICAgdGltZW91dEZhY3RvcixcbiAgICAgIHN0YXR1c0NvZGVzLFxuICAgICAgZXJyb3JDb2RlcyxcbiAgICAgIG1ldGhvZHNcbiAgICB9ID0gcmV0cnlPcHRpb25zXG4gICAgbGV0IHsgY291bnRlciwgY3VycmVudFRpbWVvdXQgfSA9IHN0YXRlXG5cbiAgICBjdXJyZW50VGltZW91dCA9XG4gICAgICBjdXJyZW50VGltZW91dCAhPSBudWxsICYmIGN1cnJlbnRUaW1lb3V0ID4gMCA/IGN1cnJlbnRUaW1lb3V0IDogdGltZW91dFxuXG4gICAgLy8gQW55IGNvZGUgdGhhdCBpcyBub3QgYSBVbmRpY2kncyBvcmlnaW5hdGVkIGFuZCBhbGxvd2VkIHRvIHJldHJ5XG4gICAgaWYgKFxuICAgICAgY29kZSAmJlxuICAgICAgY29kZSAhPT0gJ1VORF9FUlJfUkVRX1JFVFJZJyAmJlxuICAgICAgY29kZSAhPT0gJ1VORF9FUlJfU09DS0VUJyAmJlxuICAgICAgIWVycm9yQ29kZXMuaW5jbHVkZXMoY29kZSlcbiAgICApIHtcbiAgICAgIGNiKGVycilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIGEgc2V0IG9mIG1ldGhvZCBhcmUgcHJvdmlkZWQgYW5kIHRoZSBjdXJyZW50IG1ldGhvZCBpcyBub3QgaW4gdGhlIGxpc3RcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRob2RzKSAmJiAhbWV0aG9kcy5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICBjYihlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiBhIHNldCBvZiBzdGF0dXMgY29kZSBhcmUgcHJvdmlkZWQgYW5kIHRoZSBjdXJyZW50IHN0YXR1cyBjb2RlIGlzIG5vdCBpbiB0aGUgbGlzdFxuICAgIGlmIChcbiAgICAgIHN0YXR1c0NvZGUgIT0gbnVsbCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShzdGF0dXNDb2RlcykgJiZcbiAgICAgICFzdGF0dXNDb2Rlcy5pbmNsdWRlcyhzdGF0dXNDb2RlKVxuICAgICkge1xuICAgICAgY2IoZXJyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgd2UgcmVhY2hlZCB0aGUgbWF4IG51bWJlciBvZiByZXRyaWVzXG4gICAgaWYgKGNvdW50ZXIgPiBtYXhSZXRyaWVzKSB7XG4gICAgICBjYihlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgcmV0cnlBZnRlckhlYWRlciA9IGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzWydyZXRyeS1hZnRlciddXG4gICAgaWYgKHJldHJ5QWZ0ZXJIZWFkZXIpIHtcbiAgICAgIHJldHJ5QWZ0ZXJIZWFkZXIgPSBOdW1iZXIocmV0cnlBZnRlckhlYWRlcilcbiAgICAgIHJldHJ5QWZ0ZXJIZWFkZXIgPSBpc05hTihyZXRyeUFmdGVySGVhZGVyKVxuICAgICAgICA/IGNhbGN1bGF0ZVJldHJ5QWZ0ZXJIZWFkZXIocmV0cnlBZnRlckhlYWRlcilcbiAgICAgICAgOiByZXRyeUFmdGVySGVhZGVyICogMWUzIC8vIFJldHJ5LUFmdGVyIGlzIGluIHNlY29uZHNcbiAgICB9XG5cbiAgICBjb25zdCByZXRyeVRpbWVvdXQgPVxuICAgICAgcmV0cnlBZnRlckhlYWRlciA+IDBcbiAgICAgICAgPyBNYXRoLm1pbihyZXRyeUFmdGVySGVhZGVyLCBtYXhUaW1lb3V0KVxuICAgICAgICA6IE1hdGgubWluKGN1cnJlbnRUaW1lb3V0ICogdGltZW91dEZhY3RvciAqKiBjb3VudGVyLCBtYXhUaW1lb3V0KVxuXG4gICAgc3RhdGUuY3VycmVudFRpbWVvdXQgPSByZXRyeVRpbWVvdXRcblxuICAgIHNldFRpbWVvdXQoKCkgPT4gY2IobnVsbCksIHJldHJ5VGltZW91dClcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgcmVzdW1lLCBzdGF0dXNNZXNzYWdlKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuXG4gICAgdGhpcy5yZXRyeUNvdW50ICs9IDFcblxuICAgIGlmIChzdGF0dXNDb2RlID49IDMwMCkge1xuICAgICAgdGhpcy5hYm9ydChcbiAgICAgICAgbmV3IFJlcXVlc3RSZXRyeUVycm9yKCdSZXF1ZXN0IGZhaWxlZCcsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIGNvdW50OiB0aGlzLnJldHJ5Q291bnRcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrcG9pbnQgZm9yIHJlc3VtZSBmcm9tIHdoZXJlIHdlIGxlZnQgaXRcbiAgICBpZiAodGhpcy5yZXN1bWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5yZXN1bWUgPSBudWxsXG5cbiAgICAgIGlmIChzdGF0dXNDb2RlICE9PSAyMDYpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGVudFJhbmdlID0gcGFyc2VSYW5nZUhlYWRlcihoZWFkZXJzWydjb250ZW50LXJhbmdlJ10pXG4gICAgICAvLyBJZiBubyBjb250ZW50IHJhbmdlXG4gICAgICBpZiAoIWNvbnRlbnRSYW5nZSkge1xuICAgICAgICB0aGlzLmFib3J0KFxuICAgICAgICAgIG5ldyBSZXF1ZXN0UmV0cnlFcnJvcignQ29udGVudC1SYW5nZSBtaXNtYXRjaCcsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBjb3VudDogdGhpcy5yZXRyeUNvdW50XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gTGV0J3Mgc3RhcnQgd2l0aCBhIHdlYWsgZXRhZyBjaGVja1xuICAgICAgaWYgKHRoaXMuZXRhZyAhPSBudWxsICYmIHRoaXMuZXRhZyAhPT0gaGVhZGVycy5ldGFnKSB7XG4gICAgICAgIHRoaXMuYWJvcnQoXG4gICAgICAgICAgbmV3IFJlcXVlc3RSZXRyeUVycm9yKCdFVGFnIG1pc21hdGNoJywgc3RhdHVzQ29kZSwge1xuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGNvdW50OiB0aGlzLnJldHJ5Q291bnRcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHN0YXJ0LCBzaXplLCBlbmQgPSBzaXplIH0gPSBjb250ZW50UmFuZ2VcblxuICAgICAgYXNzZXJ0KHRoaXMuc3RhcnQgPT09IHN0YXJ0LCAnY29udGVudC1yYW5nZSBtaXNtYXRjaCcpXG4gICAgICBhc3NlcnQodGhpcy5lbmQgPT0gbnVsbCB8fCB0aGlzLmVuZCA9PT0gZW5kLCAnY29udGVudC1yYW5nZSBtaXNtYXRjaCcpXG5cbiAgICAgIHRoaXMucmVzdW1lID0gcmVzdW1lXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLmVuZCA9PSBudWxsKSB7XG4gICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gMjA2KSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgd2UgcmVjZWl2ZSAyMDZcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBwYXJzZVJhbmdlSGVhZGVyKGhlYWRlcnNbJ2NvbnRlbnQtcmFuZ2UnXSlcblxuICAgICAgICBpZiAocmFuZ2UgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25IZWFkZXJzKFxuICAgICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgIHJhd0hlYWRlcnMsXG4gICAgICAgICAgICByZXN1bWUsXG4gICAgICAgICAgICBzdGF0dXNNZXNzYWdlXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGFydCwgc2l6ZSwgZW5kID0gc2l6ZSB9ID0gcmFuZ2VcblxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgc3RhcnQgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoc3RhcnQpICYmIHRoaXMuc3RhcnQgIT09IHN0YXJ0LFxuICAgICAgICAgICdjb250ZW50LXJhbmdlIG1pc21hdGNoJ1xuICAgICAgICApXG4gICAgICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUoc3RhcnQpKVxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgZW5kICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKGVuZCkgJiYgdGhpcy5lbmQgIT09IGVuZCxcbiAgICAgICAgICAnaW52YWxpZCBjb250ZW50LWxlbmd0aCdcbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydFxuICAgICAgICB0aGlzLmVuZCA9IGVuZFxuICAgICAgfVxuXG4gICAgICAvLyBXZSBtYWtlIG91ciBiZXN0IHRvIGNoZWNrcG9pbnQgdGhlIGJvZHkgZm9yIGZ1cnRoZXIgcmFuZ2UgaGVhZGVyc1xuICAgICAgaWYgKHRoaXMuZW5kID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ11cbiAgICAgICAgdGhpcy5lbmQgPSBjb250ZW50TGVuZ3RoICE9IG51bGwgPyBOdW1iZXIoY29udGVudExlbmd0aCkgOiBudWxsXG4gICAgICB9XG5cbiAgICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUodGhpcy5zdGFydCkpXG4gICAgICBhc3NlcnQoXG4gICAgICAgIHRoaXMuZW5kID09IG51bGwgfHwgTnVtYmVyLmlzRmluaXRlKHRoaXMuZW5kKSxcbiAgICAgICAgJ2ludmFsaWQgY29udGVudC1sZW5ndGgnXG4gICAgICApXG5cbiAgICAgIHRoaXMucmVzdW1lID0gcmVzdW1lXG4gICAgICB0aGlzLmV0YWcgPSBoZWFkZXJzLmV0YWcgIT0gbnVsbCA/IGhlYWRlcnMuZXRhZyA6IG51bGxcblxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkhlYWRlcnMoXG4gICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgIHJhd0hlYWRlcnMsXG4gICAgICAgIHJlc3VtZSxcbiAgICAgICAgc3RhdHVzTWVzc2FnZVxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGVyciA9IG5ldyBSZXF1ZXN0UmV0cnlFcnJvcignUmVxdWVzdCBmYWlsZWQnLCBzdGF0dXNDb2RlLCB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgY291bnQ6IHRoaXMucmV0cnlDb3VudFxuICAgIH0pXG5cbiAgICB0aGlzLmFib3J0KGVycilcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIHRoaXMuc3RhcnQgKz0gY2h1bmsubGVuZ3RoXG5cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRGF0YShjaHVuaylcbiAgfVxuXG4gIG9uQ29tcGxldGUgKHJhd1RyYWlsZXJzKSB7XG4gICAgdGhpcy5yZXRyeUNvdW50ID0gMFxuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25Db21wbGV0ZShyYXdUcmFpbGVycylcbiAgfVxuXG4gIG9uRXJyb3IgKGVycikge1xuICAgIGlmICh0aGlzLmFib3J0ZWQgfHwgaXNEaXN0dXJiZWQodGhpcy5vcHRzLmJvZHkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgIH1cblxuICAgIHRoaXMucmV0cnlPcHRzLnJldHJ5KFxuICAgICAgZXJyLFxuICAgICAge1xuICAgICAgICBzdGF0ZTogeyBjb3VudGVyOiB0aGlzLnJldHJ5Q291bnQrKywgY3VycmVudFRpbWVvdXQ6IHRoaXMucmV0cnlBZnRlciB9LFxuICAgICAgICBvcHRzOiB7IHJldHJ5T3B0aW9uczogdGhpcy5yZXRyeU9wdHMsIC4uLnRoaXMub3B0cyB9XG4gICAgICB9LFxuICAgICAgb25SZXRyeS5iaW5kKHRoaXMpXG4gICAgKVxuXG4gICAgZnVuY3Rpb24gb25SZXRyeSAoZXJyKSB7XG4gICAgICBpZiAoZXJyICE9IG51bGwgfHwgdGhpcy5hYm9ydGVkIHx8IGlzRGlzdHVyYmVkKHRoaXMub3B0cy5ib2R5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGFydCAhPT0gMCkge1xuICAgICAgICB0aGlzLm9wdHMgPSB7XG4gICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIC4uLnRoaXMub3B0cy5oZWFkZXJzLFxuICAgICAgICAgICAgcmFuZ2U6IGBieXRlcz0ke3RoaXMuc3RhcnR9LSR7dGhpcy5lbmQgPz8gJyd9YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHRoaXMub3B0cywgdGhpcylcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmhhbmRsZXIub25FcnJvcihlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmV0cnlIYW5kbGVyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBXZSBpbmNsdWRlIGEgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBEaXNwYXRjaGVyIEFQSS4gSW4gY2FzZSBvZiBicmVha2luZyBjaGFuZ2VzLFxuLy8gdGhpcyB2ZXJzaW9uIG51bWJlciBtdXN0IGJlIGluY3JlYXNlZCB0byBhdm9pZCBjb25mbGljdHMuXG5jb25zdCBnbG9iYWxEaXNwYXRjaGVyID0gU3ltYm9sLmZvcigndW5kaWNpLmdsb2JhbERpc3BhdGNoZXIuMScpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IEFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudCcpXG5cbmlmIChnZXRHbG9iYWxEaXNwYXRjaGVyKCkgPT09IHVuZGVmaW5lZCkge1xuICBzZXRHbG9iYWxEaXNwYXRjaGVyKG5ldyBBZ2VudCgpKVxufVxuXG5mdW5jdGlvbiBzZXRHbG9iYWxEaXNwYXRjaGVyIChhZ2VudCkge1xuICBpZiAoIWFnZW50IHx8IHR5cGVvZiBhZ2VudC5kaXNwYXRjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQXJndW1lbnQgYWdlbnQgbXVzdCBpbXBsZW1lbnQgQWdlbnQnKVxuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCBnbG9iYWxEaXNwYXRjaGVyLCB7XG4gICAgdmFsdWU6IGFnZW50LFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0R2xvYmFsRGlzcGF0Y2hlciAoKSB7XG4gIHJldHVybiBnbG9iYWxUaGlzW2dsb2JhbERpc3BhdGNoZXJdXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXRHbG9iYWxEaXNwYXRjaGVyLFxuICBnZXRHbG9iYWxEaXNwYXRjaGVyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIERlY29yYXRvckhhbmRsZXIge1xuICBjb25zdHJ1Y3RvciAoaGFuZGxlcikge1xuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgfVxuXG4gIG9uQ29ubmVjdCAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25Db25uZWN0KC4uLmFyZ3MpXG4gIH1cblxuICBvbkVycm9yICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkVycm9yKC4uLmFyZ3MpXG4gIH1cblxuICBvblVwZ3JhZGUgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uVXBncmFkZSguLi5hcmdzKVxuICB9XG5cbiAgb25IZWFkZXJzICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkhlYWRlcnMoLi4uYXJncylcbiAgfVxuXG4gIG9uRGF0YSAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25EYXRhKC4uLmFyZ3MpXG4gIH1cblxuICBvbkNvbXBsZXRlICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkNvbXBsZXRlKC4uLmFyZ3MpXG4gIH1cblxuICBvbkJvZHlTZW50ICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KC4uLmFyZ3MpXG4gIH1cbn1cbiIsCiAgICAiLy8gaHR0cHM6Ly9naXRodWIuY29tL0V0aGFuLUFycm93b29kL3VuZGljaS1mZXRjaFxuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgeyBrSGVhZGVyc0xpc3QsIGtDb25zdHJ1Y3QgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IGtHdWFyZCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHtcbiAgbWFrZUl0ZXJhdG9yLFxuICBpc1ZhbGlkSGVhZGVyTmFtZSxcbiAgaXNWYWxpZEhlYWRlclZhbHVlXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuL3dlYmlkbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCBrSGVhZGVyc01hcCA9IFN5bWJvbCgnaGVhZGVycyBtYXAnKVxuY29uc3Qga0hlYWRlcnNTb3J0ZWRNYXAgPSBTeW1ib2woJ2hlYWRlcnMgbWFwIHNvcnRlZCcpXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvZGVcbiAqL1xuZnVuY3Rpb24gaXNIVFRQV2hpdGVTcGFjZUNoYXJDb2RlIChjb2RlKSB7XG4gIHJldHVybiBjb2RlID09PSAweDAwYSB8fCBjb2RlID09PSAweDAwZCB8fCBjb2RlID09PSAweDAwOSB8fCBjb2RlID09PSAweDAyMFxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLXZhbHVlLW5vcm1hbGl6ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBvdGVudGlhbFZhbHVlXG4gKi9cbmZ1bmN0aW9uIGhlYWRlclZhbHVlTm9ybWFsaXplIChwb3RlbnRpYWxWYWx1ZSkge1xuICAvLyAgVG8gbm9ybWFsaXplIGEgYnl0ZSBzZXF1ZW5jZSBwb3RlbnRpYWxWYWx1ZSwgcmVtb3ZlXG4gIC8vICBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlIGJ5dGVzIGZyb21cbiAgLy8gIHBvdGVudGlhbFZhbHVlLlxuICBsZXQgaSA9IDA7IGxldCBqID0gcG90ZW50aWFsVmFsdWUubGVuZ3RoXG5cbiAgd2hpbGUgKGogPiBpICYmIGlzSFRUUFdoaXRlU3BhY2VDaGFyQ29kZShwb3RlbnRpYWxWYWx1ZS5jaGFyQ29kZUF0KGogLSAxKSkpIC0talxuICB3aGlsZSAoaiA+IGkgJiYgaXNIVFRQV2hpdGVTcGFjZUNoYXJDb2RlKHBvdGVudGlhbFZhbHVlLmNoYXJDb2RlQXQoaSkpKSArK2lcblxuICByZXR1cm4gaSA9PT0gMCAmJiBqID09PSBwb3RlbnRpYWxWYWx1ZS5sZW5ndGggPyBwb3RlbnRpYWxWYWx1ZSA6IHBvdGVudGlhbFZhbHVlLnN1YnN0cmluZyhpLCBqKVxufVxuXG5mdW5jdGlvbiBmaWxsIChoZWFkZXJzLCBvYmplY3QpIHtcbiAgLy8gVG8gZmlsbCBhIEhlYWRlcnMgb2JqZWN0IGhlYWRlcnMgd2l0aCBhIGdpdmVuIG9iamVjdCBvYmplY3QsIHJ1biB0aGVzZSBzdGVwczpcblxuICAvLyAxLiBJZiBvYmplY3QgaXMgYSBzZXF1ZW5jZSwgdGhlbiBmb3IgZWFjaCBoZWFkZXIgaW4gb2JqZWN0OlxuICAvLyBOb3RlOiB3ZWJpZGwgY29udmVyc2lvbiB0byBhcnJheSBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgaGVhZGVyID0gb2JqZWN0W2ldXG4gICAgICAvLyAxLiBJZiBoZWFkZXIgZG9lcyBub3QgY29udGFpbiBleGFjdGx5IHR3byBpdGVtcywgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChoZWFkZXIubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICBoZWFkZXI6ICdIZWFkZXJzIGNvbnN0cnVjdG9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBgZXhwZWN0ZWQgbmFtZS92YWx1ZSBwYWlyIHRvIGJlIGxlbmd0aCAyLCBmb3VuZCAke2hlYWRlci5sZW5ndGh9LmBcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQXBwZW5kIChoZWFkZXLigJlzIGZpcnN0IGl0ZW0sIGhlYWRlcuKAmXMgc2Vjb25kIGl0ZW0pIHRvIGhlYWRlcnMuXG4gICAgICBhcHBlbmRIZWFkZXIoaGVhZGVycywgaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIC8vIE5vdGU6IG51bGwgc2hvdWxkIHRocm93XG5cbiAgICAvLyAyLiBPdGhlcndpc2UsIG9iamVjdCBpcyBhIHJlY29yZCwgdGhlbiBmb3IgZWFjaCBrZXkg4oaSIHZhbHVlIGluIG9iamVjdCxcbiAgICAvLyAgICBhcHBlbmQgKGtleSwgdmFsdWUpIHRvIGhlYWRlcnNcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgYXBwZW5kSGVhZGVyKGhlYWRlcnMsIGtleXNbaV0sIG9iamVjdFtrZXlzW2ldXSlcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5jb252ZXJzaW9uRmFpbGVkKHtcbiAgICAgIHByZWZpeDogJ0hlYWRlcnMgY29uc3RydWN0b3InLFxuICAgICAgYXJndW1lbnQ6ICdBcmd1bWVudCAxJyxcbiAgICAgIHR5cGVzOiBbJ3NlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PicsICdyZWNvcmQ8Qnl0ZVN0cmluZywgQnl0ZVN0cmluZz4nXVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWhlYWRlcnMtYXBwZW5kXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZEhlYWRlciAoaGVhZGVycywgbmFtZSwgdmFsdWUpIHtcbiAgLy8gMS4gTm9ybWFsaXplIHZhbHVlLlxuICB2YWx1ZSA9IGhlYWRlclZhbHVlTm9ybWFsaXplKHZhbHVlKVxuXG4gIC8vIDIuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUgb3IgdmFsdWUgaXMgbm90IGFcbiAgLy8gICAgaGVhZGVyIHZhbHVlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgcHJlZml4OiAnSGVhZGVycy5hcHBlbmQnLFxuICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgfSlcbiAgfSBlbHNlIGlmICghaXNWYWxpZEhlYWRlclZhbHVlKHZhbHVlKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50KHtcbiAgICAgIHByZWZpeDogJ0hlYWRlcnMuYXBwZW5kJyxcbiAgICAgIHZhbHVlLFxuICAgICAgdHlwZTogJ2hlYWRlciB2YWx1ZSdcbiAgICB9KVxuICB9XG5cbiAgLy8gMy4gSWYgaGVhZGVyc+KAmXMgZ3VhcmQgaXMgXCJpbW11dGFibGVcIiwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgLy8gNC4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcInJlcXVlc3RcIiBhbmQgbmFtZSBpcyBhXG4gIC8vICAgIGZvcmJpZGRlbiBoZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IGZvcmJpZGRlbiBoZWFkZXIgbmFtZXNcbiAgaWYgKGhlYWRlcnNba0d1YXJkXSA9PT0gJ2ltbXV0YWJsZScpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbW11dGFibGUnKVxuICB9IGVsc2UgaWYgKGhlYWRlcnNba0d1YXJkXSA9PT0gJ3JlcXVlc3Qtbm8tY29ycycpIHtcbiAgICAvLyA1LiBPdGhlcndpc2UsIGlmIGhlYWRlcnPigJlzIGd1YXJkIGlzIFwicmVxdWVzdC1uby1jb3JzXCI6XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gNi4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcInJlc3BvbnNlXCIgYW5kIG5hbWUgaXMgYVxuICAvLyAgICBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWUsIHJldHVybi5cblxuICAvLyA3LiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBoZWFkZXJz4oCZcyBoZWFkZXIgbGlzdC5cbiAgcmV0dXJuIGhlYWRlcnNba0hlYWRlcnNMaXN0XS5hcHBlbmQobmFtZSwgdmFsdWUpXG5cbiAgLy8gOC4gSWYgaGVhZGVyc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiwgdGhlbiByZW1vdmVcbiAgLy8gICAgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QgaGVhZGVycyBmcm9tIGhlYWRlcnNcbn1cblxuY2xhc3MgSGVhZGVyc0xpc3Qge1xuICAvKiogQHR5cGUge1tzdHJpbmcsIHN0cmluZ11bXXxudWxsfSAqL1xuICBjb29raWVzID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yIChpbml0KSB7XG4gICAgaWYgKGluaXQgaW5zdGFuY2VvZiBIZWFkZXJzTGlzdCkge1xuICAgICAgdGhpc1trSGVhZGVyc01hcF0gPSBuZXcgTWFwKGluaXRba0hlYWRlcnNNYXBdKVxuICAgICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBpbml0W2tIZWFkZXJzU29ydGVkTWFwXVxuICAgICAgdGhpcy5jb29raWVzID0gaW5pdC5jb29raWVzID09PSBudWxsID8gbnVsbCA6IFsuLi5pbml0LmNvb2tpZXNdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0hlYWRlcnNNYXBdID0gbmV3IE1hcChpbml0KVxuICAgICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2hlYWRlci1saXN0LWNvbnRhaW5zXG4gIGNvbnRhaW5zIChuYW1lKSB7XG4gICAgLy8gQSBoZWFkZXIgbGlzdCBsaXN0IGNvbnRhaW5zIGEgaGVhZGVyIG5hbWUgbmFtZSBpZiBsaXN0XG4gICAgLy8gY29udGFpbnMgYSBoZWFkZXIgd2hvc2UgbmFtZSBpcyBhIGJ5dGUtY2FzZS1pbnNlbnNpdGl2ZVxuICAgIC8vIG1hdGNoIGZvciBuYW1lLlxuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTWFwXS5oYXMobmFtZSlcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aGlzW2tIZWFkZXJzTWFwXS5jbGVhcigpXG4gICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG4gICAgdGhpcy5jb29raWVzID0gbnVsbFxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLWxpc3QtYXBwZW5kXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzW2tIZWFkZXJzU29ydGVkTWFwXSA9IG51bGxcblxuICAgIC8vIDEuIElmIGxpc3QgY29udGFpbnMgbmFtZSwgdGhlbiBzZXQgbmFtZSB0byB0aGUgZmlyc3Qgc3VjaFxuICAgIC8vICAgIGhlYWRlcuKAmXMgbmFtZS5cbiAgICBjb25zdCBsb3dlcmNhc2VOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgZXhpc3RzID0gdGhpc1trSGVhZGVyc01hcF0uZ2V0KGxvd2VyY2FzZU5hbWUpXG5cbiAgICAvLyAyLiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBsaXN0LlxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIGNvbnN0IGRlbGltaXRlciA9IGxvd2VyY2FzZU5hbWUgPT09ICdjb29raWUnID8gJzsgJyA6ICcsICdcbiAgICAgIHRoaXNba0hlYWRlcnNNYXBdLnNldChsb3dlcmNhc2VOYW1lLCB7XG4gICAgICAgIG5hbWU6IGV4aXN0cy5uYW1lLFxuICAgICAgICB2YWx1ZTogYCR7ZXhpc3RzLnZhbHVlfSR7ZGVsaW1pdGVyfSR7dmFsdWV9YFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trSGVhZGVyc01hcF0uc2V0KGxvd2VyY2FzZU5hbWUsIHsgbmFtZSwgdmFsdWUgfSlcbiAgICB9XG5cbiAgICBpZiAobG93ZXJjYXNlTmFtZSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICB0aGlzLmNvb2tpZXMgPz89IFtdXG4gICAgICB0aGlzLmNvb2tpZXMucHVzaCh2YWx1ZSlcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1zZXRcbiAgc2V0IChuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdID0gbnVsbFxuICAgIGNvbnN0IGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGlmIChsb3dlcmNhc2VOYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIHRoaXMuY29va2llcyA9IFt2YWx1ZV1cbiAgICB9XG5cbiAgICAvLyAxLiBJZiBsaXN0IGNvbnRhaW5zIG5hbWUsIHRoZW4gc2V0IHRoZSB2YWx1ZSBvZlxuICAgIC8vICAgIHRoZSBmaXJzdCBzdWNoIGhlYWRlciB0byB2YWx1ZSBhbmQgcmVtb3ZlIHRoZVxuICAgIC8vICAgIG90aGVycy5cbiAgICAvLyAyLiBPdGhlcndpc2UsIGFwcGVuZCBoZWFkZXIgKG5hbWUsIHZhbHVlKSB0byBsaXN0LlxuICAgIHRoaXNba0hlYWRlcnNNYXBdLnNldChsb3dlcmNhc2VOYW1lLCB7IG5hbWUsIHZhbHVlIH0pXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1kZWxldGVcbiAgZGVsZXRlIChuYW1lKSB7XG4gICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG5cbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgICBpZiAobmFtZSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICB0aGlzLmNvb2tpZXMgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpc1trSGVhZGVyc01hcF0uZGVsZXRlKG5hbWUpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1nZXRcbiAgZ2V0IChuYW1lKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzW2tIZWFkZXJzTWFwXS5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKVxuXG4gICAgLy8gMS4gSWYgbGlzdCBkb2VzIG5vdCBjb250YWluIG5hbWUsIHRoZW4gcmV0dXJuIG51bGwuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGhlYWRlcnMgaW4gbGlzdCB3aG9zZSBuYW1lXG4gICAgLy8gICAgaXMgYSBieXRlLWNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yIG5hbWUsXG4gICAgLy8gICAgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciBieSAweDJDIDB4MjAsIGluIG9yZGVyLlxuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHZhbHVlLnZhbHVlXG4gIH1cblxuICAqIFtTeW1ib2wuaXRlcmF0b3JdICgpIHtcbiAgICAvLyB1c2UgdGhlIGxvd2VyY2FzZWQgbmFtZVxuICAgIGZvciAoY29uc3QgW25hbWUsIHsgdmFsdWUgfV0gb2YgdGhpc1trSGVhZGVyc01hcF0pIHtcbiAgICAgIHlpZWxkIFtuYW1lLCB2YWx1ZV1cbiAgICB9XG4gIH1cblxuICBnZXQgZW50cmllcyAoKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG5cbiAgICBpZiAodGhpc1trSGVhZGVyc01hcF0uc2l6ZSkge1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgdGhpc1trSGVhZGVyc01hcF0udmFsdWVzKCkpIHtcbiAgICAgICAgaGVhZGVyc1tuYW1lXSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVycy1jbGFzc1xuY2xhc3MgSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yIChpbml0ID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGluaXQgPT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0gPSBuZXcgSGVhZGVyc0xpc3QoKVxuXG4gICAgLy8gVGhlIG5ldyBIZWFkZXJzKGluaXQpIGNvbnN0cnVjdG9yIHN0ZXBzIGFyZTpcblxuICAgIC8vIDEuIFNldCB0aGlz4oCZcyBndWFyZCB0byBcIm5vbmVcIi5cbiAgICB0aGlzW2tHdWFyZF0gPSAnbm9uZSdcblxuICAgIC8vIDIuIElmIGluaXQgaXMgZ2l2ZW4sIHRoZW4gZmlsbCB0aGlzIHdpdGggaW5pdC5cbiAgICBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbml0ID0gd2ViaWRsLmNvbnZlcnRlcnMuSGVhZGVyc0luaXQoaW5pdClcbiAgICAgIGZpbGwodGhpcywgaW5pdClcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtYXBwZW5kXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0hlYWRlcnMuYXBwZW5kJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcbiAgICB2YWx1ZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcodmFsdWUpXG5cbiAgICByZXR1cm4gYXBwZW5kSGVhZGVyKHRoaXMsIG5hbWUsIHZhbHVlKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWRlbGV0ZVxuICBkZWxldGUgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0hlYWRlcnMuZGVsZXRlJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLmRlbGV0ZScsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIElmIHRoaXPigJlzIGd1YXJkIGlzIFwiaW1tdXRhYmxlXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3RcIiBhbmQgbmFtZSBpcyBhXG4gICAgLy8gICAgZm9yYmlkZGVuIGhlYWRlciBuYW1lLCByZXR1cm4uXG4gICAgLy8gNC4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3Qtbm8tY29yc1wiLCBuYW1lXG4gICAgLy8gICAgaXMgbm90IGEgbm8tQ09SUy1zYWZlbGlzdGVkIHJlcXVlc3QtaGVhZGVyIG5hbWUsIGFuZFxuICAgIC8vICAgIG5hbWUgaXMgbm90IGEgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QtaGVhZGVyIG5hbWUsXG4gICAgLy8gICAgcmV0dXJuLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXNwb25zZVwiIGFuZCBuYW1lIGlzXG4gICAgLy8gICAgYSBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWUsIHJldHVybi5cbiAgICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IGZvcmJpZGRlbiBoZWFkZXIgbmFtZXNcbiAgICBpZiAodGhpc1trR3VhcmRdID09PSAnaW1tdXRhYmxlJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW1tdXRhYmxlJylcbiAgICB9IGVsc2UgaWYgKHRoaXNba0d1YXJkXSA9PT0gJ3JlcXVlc3Qtbm8tY29ycycpIHtcbiAgICAgIC8vIFRPRE9cbiAgICB9XG5cbiAgICAvLyA2LiBJZiB0aGlz4oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIG5hbWUsIHRoZW5cbiAgICAvLyAgICByZXR1cm4uXG4gICAgaWYgKCF0aGlzW2tIZWFkZXJzTGlzdF0uY29udGFpbnMobmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDcuIERlbGV0ZSBuYW1lIGZyb20gdGhpc+KAmXMgaGVhZGVyIGxpc3QuXG4gICAgLy8gOC4gSWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiwgdGhlbiByZW1vdmVcbiAgICAvLyAgICBwcml2aWxlZ2VkIG5vLUNPUlMgcmVxdWVzdCBoZWFkZXJzIGZyb20gdGhpcy5cbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0uZGVsZXRlKG5hbWUpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtZ2V0XG4gIGdldCAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnSGVhZGVycy5nZXQnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lKVxuXG4gICAgLy8gMS4gSWYgbmFtZSBpcyBub3QgYSBoZWFkZXIgbmFtZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICAgIHByZWZpeDogJ0hlYWRlcnMuZ2V0JyxcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHR5cGU6ICdoZWFkZXIgbmFtZSdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBuYW1lIGZyb20gdGhpc+KAmXMgaGVhZGVyXG4gICAgLy8gICAgbGlzdC5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc0xpc3RdLmdldChuYW1lKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWhhc1xuICBoYXMgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0hlYWRlcnMuaGFzJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLmhhcycsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIFJldHVybiB0cnVlIGlmIHRoaXPigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIG5hbWU7XG4gICAgLy8gICAgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTGlzdF0uY29udGFpbnMobmFtZSlcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20taGVhZGVycy1zZXRcbiAgc2V0IChuYW1lLCB2YWx1ZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsIHsgaGVhZGVyOiAnSGVhZGVycy5zZXQnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lKVxuICAgIHZhbHVlID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyh2YWx1ZSlcblxuICAgIC8vIDEuIE5vcm1hbGl6ZSB2YWx1ZS5cbiAgICB2YWx1ZSA9IGhlYWRlclZhbHVlTm9ybWFsaXplKHZhbHVlKVxuXG4gICAgLy8gMi4gSWYgbmFtZSBpcyBub3QgYSBoZWFkZXIgbmFtZSBvciB2YWx1ZSBpcyBub3QgYVxuICAgIC8vICAgIGhlYWRlciB2YWx1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICAgIHByZWZpeDogJ0hlYWRlcnMuc2V0JyxcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHR5cGU6ICdoZWFkZXIgbmFtZSdcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmICghaXNWYWxpZEhlYWRlclZhbHVlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLnNldCcsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIHZhbHVlJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAzLiBJZiB0aGlz4oCZcyBndWFyZCBpcyBcImltbXV0YWJsZVwiLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIC8vIDQuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0XCIgYW5kIG5hbWUgaXMgYVxuICAgIC8vICAgIGZvcmJpZGRlbiBoZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiBhbmRcbiAgICAvLyAgICBuYW1lL3ZhbHVlIGlzIG5vdCBhIG5vLUNPUlMtc2FmZWxpc3RlZCByZXF1ZXN0LWhlYWRlcixcbiAgICAvLyAgICByZXR1cm4uXG4gICAgLy8gNi4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlc3BvbnNlXCIgYW5kIG5hbWUgaXMgYVxuICAgIC8vICAgIGZvcmJpZGRlbiByZXNwb25zZS1oZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAgIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgZm9yYmlkZGVuIGhlYWRlciBuYW1lc1xuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbW11dGFibGUnKVxuICAgIH0gZWxzZSBpZiAodGhpc1trR3VhcmRdID09PSAncmVxdWVzdC1uby1jb3JzJykge1xuICAgICAgLy8gVE9ET1xuICAgIH1cblxuICAgIC8vIDcuIFNldCAobmFtZSwgdmFsdWUpIGluIHRoaXPigJlzIGhlYWRlciBsaXN0LlxuICAgIC8vIDguIElmIHRoaXPigJlzIGd1YXJkIGlzIFwicmVxdWVzdC1uby1jb3JzXCIsIHRoZW4gcmVtb3ZlXG4gICAgLy8gICAgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QgaGVhZGVycyBmcm9tIHRoaXNcbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0uc2V0KG5hbWUsIHZhbHVlKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWdldHNldGNvb2tpZVxuICBnZXRTZXRDb29raWUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICAvLyAxLiBJZiB0aGlz4oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBTZXQtQ29va2llYCwgdGhlbiByZXR1cm4gwqsgwrsuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGhlYWRlcnMgaW4gdGhpc+KAmXMgaGVhZGVyIGxpc3Qgd2hvc2UgbmFtZSBpc1xuICAgIC8vICAgIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvciBgU2V0LUNvb2tpZWAsIGluIG9yZGVyLlxuXG4gICAgY29uc3QgbGlzdCA9IHRoaXNba0hlYWRlcnNMaXN0XS5jb29raWVzXG5cbiAgICBpZiAobGlzdCkge1xuICAgICAgcmV0dXJuIFsuLi5saXN0XVxuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLWxpc3Qtc29ydC1hbmQtY29tYmluZVxuICBnZXQgW2tIZWFkZXJzU29ydGVkTWFwXSAoKSB7XG4gICAgaWYgKHRoaXNba0hlYWRlcnNMaXN0XVtrSGVhZGVyc1NvcnRlZE1hcF0pIHtcbiAgICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTGlzdF1ba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgfVxuXG4gICAgLy8gMS4gTGV0IGhlYWRlcnMgYmUgYW4gZW1wdHkgbGlzdCBvZiBoZWFkZXJzIHdpdGggdGhlIGtleSBiZWluZyB0aGUgbmFtZVxuICAgIC8vICAgIGFuZCB2YWx1ZSB0aGUgdmFsdWUuXG4gICAgY29uc3QgaGVhZGVycyA9IFtdXG5cbiAgICAvLyAyLiBMZXQgbmFtZXMgYmUgdGhlIHJlc3VsdCBvZiBjb252ZXJ0IGhlYWRlciBuYW1lcyB0byBhIHNvcnRlZC1sb3dlcmNhc2VcbiAgICAvLyAgICBzZXQgd2l0aCBhbGwgdGhlIG5hbWVzIG9mIHRoZSBoZWFkZXJzIGluIGxpc3QuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4udGhpc1trSGVhZGVyc0xpc3RdXS5zb3J0KChhLCBiKSA9PiBhWzBdIDwgYlswXSA/IC0xIDogMSlcbiAgICBjb25zdCBjb29raWVzID0gdGhpc1trSGVhZGVyc0xpc3RdLmNvb2tpZXNcblxuICAgIC8vIDMuIEZvciBlYWNoIG5hbWUgb2YgbmFtZXM6XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IG5hbWVzW2ldXG4gICAgICAvLyAxLiBJZiBuYW1lIGlzIGBzZXQtY29va2llYCwgdGhlbjpcbiAgICAgIGlmIChuYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgLy8gMS4gTGV0IHZhbHVlcyBiZSBhIGxpc3Qgb2YgYWxsIHZhbHVlcyBvZiBoZWFkZXJzIGluIGxpc3Qgd2hvc2UgbmFtZVxuICAgICAgICAvLyAgICBpcyBhIGJ5dGUtY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgbmFtZSwgaW4gb3JkZXIuXG5cbiAgICAgICAgLy8gMi4gRm9yIGVhY2ggdmFsdWUgb2YgdmFsdWVzOlxuICAgICAgICAvLyAxLiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBoZWFkZXJzLlxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvb2tpZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBoZWFkZXJzLnB1c2goW25hbWUsIGNvb2tpZXNbal1dKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAyLiBPdGhlcndpc2U6XG5cbiAgICAgICAgLy8gMS4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBuYW1lIGZyb20gbGlzdC5cblxuICAgICAgICAvLyAyLiBBc3NlcnQ6IHZhbHVlIGlzIG5vbi1udWxsLlxuICAgICAgICBhc3NlcnQodmFsdWUgIT09IG51bGwpXG5cbiAgICAgICAgLy8gMy4gQXBwZW5kIChuYW1lLCB2YWx1ZSkgdG8gaGVhZGVycy5cbiAgICAgICAgaGVhZGVycy5wdXNoKFtuYW1lLCB2YWx1ZV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trSGVhZGVyc0xpc3RdW2tIZWFkZXJzU29ydGVkTWFwXSA9IGhlYWRlcnNcblxuICAgIC8vIDQuIFJldHVybiBoZWFkZXJzLlxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICBrZXlzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgaWYgKHRoaXNba0d1YXJkXSA9PT0gJ2ltbXV0YWJsZScpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trSGVhZGVyc1NvcnRlZE1hcF1cbiAgICAgIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4gdmFsdWUsICdIZWFkZXJzJyxcbiAgICAgICAgJ2tleScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJdGVyYXRvcihcbiAgICAgICgpID0+IFsuLi50aGlzW2tIZWFkZXJzU29ydGVkTWFwXS52YWx1ZXMoKV0sXG4gICAgICAnSGVhZGVycycsXG4gICAgICAna2V5J1xuICAgIClcbiAgfVxuXG4gIHZhbHVlcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHZhbHVlLCAnSGVhZGVycycsXG4gICAgICAgICd2YWx1ZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJdGVyYXRvcihcbiAgICAgICgpID0+IFsuLi50aGlzW2tIZWFkZXJzU29ydGVkTWFwXS52YWx1ZXMoKV0sXG4gICAgICAnSGVhZGVycycsXG4gICAgICAndmFsdWUnXG4gICAgKVxuICB9XG5cbiAgZW50cmllcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHZhbHVlLCAnSGVhZGVycycsXG4gICAgICAgICdrZXkrdmFsdWUnKVxuICAgIH1cblxuICAgIHJldHVybiBtYWtlSXRlcmF0b3IoXG4gICAgICAoKSA9PiBbLi4udGhpc1trSGVhZGVyc1NvcnRlZE1hcF0udmFsdWVzKCldLFxuICAgICAgJ0hlYWRlcnMnLFxuICAgICAgJ2tleSt2YWx1ZSdcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHNlbGY6IEhlYWRlcnMpID0+IHZvaWR9IGNhbGxiYWNrRm5cbiAgICogQHBhcmFtIHt1bmtub3dufSB0aGlzQXJnXG4gICAqL1xuICBmb3JFYWNoIChjYWxsYmFja0ZuLCB0aGlzQXJnID0gZ2xvYmFsVGhpcykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnSGVhZGVycy5mb3JFYWNoJyB9KVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFja0ZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBleGVjdXRlICdmb3JFYWNoJyBvbiAnSGVhZGVycyc6IHBhcmFtZXRlciAxIGlzIG5vdCBvZiB0eXBlICdGdW5jdGlvbicuXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzKSB7XG4gICAgICBjYWxsYmFja0ZuLmFwcGx5KHRoaXNBcmcsIFt2YWx1ZSwga2V5LCB0aGlzXSlcbiAgICB9XG4gIH1cblxuICBbU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc0xpc3RdXG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXNcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSGVhZGVycy5wcm90b3R5cGUsIHtcbiAgYXBwZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWxldGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGdldDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGFzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzZXQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGdldFNldENvb2tpZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAga2V5czoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgdmFsdWVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBlbnRyaWVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBmb3JFYWNoOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLml0ZXJhdG9yXTogeyBlbnVtZXJhYmxlOiBmYWxzZSB9LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnSGVhZGVycycsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0ID0gZnVuY3Rpb24gKFYpIHtcbiAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgPT09ICdPYmplY3QnKSB7XG4gICAgaWYgKFZbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4nXShWKVxuICAgIH1cblxuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVyc1sncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J10oVilcbiAgfVxuXG4gIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgcHJlZml4OiAnSGVhZGVycyBjb25zdHJ1Y3RvcicsXG4gICAgYXJndW1lbnQ6ICdBcmd1bWVudCAxJyxcbiAgICB0eXBlczogWydzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4nLCAncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J11cbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGZpbGwsXG4gIEhlYWRlcnMsXG4gIEhlYWRlcnNMaXN0XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEhlYWRlcnMsIEhlYWRlcnNMaXN0LCBmaWxsIH0gPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuY29uc3QgeyBleHRyYWN0Qm9keSwgY2xvbmVCb2R5LCBtaXhpbkJvZHkgfSA9IHJlcXVpcmUoJy4vYm9keScpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gdXRpbFxuY29uc3Qge1xuICBpc1ZhbGlkUmVhc29uUGhyYXNlLFxuICBpc0NhbmNlbGxlZCxcbiAgaXNBYm9ydGVkLFxuICBpc0Jsb2JMaWtlLFxuICBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcsXG4gIGlzRXJyb3JMaWtlLFxuICBpc29tb3JwaGljRW5jb2RlXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHtcbiAgcmVkaXJlY3RTdGF0dXNTZXQsXG4gIG51bGxCb2R5U3RhdHVzLFxuICBET01FeGNlcHRpb25cbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IGtTdGF0ZSwga0hlYWRlcnMsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgRm9ybURhdGEgfSA9IHJlcXVpcmUoJy4vZm9ybWRhdGEnKVxuY29uc3QgeyBnZXRHbG9iYWxPcmlnaW4gfSA9IHJlcXVpcmUoJy4vZ2xvYmFsJylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi9kYXRhVVJMJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0LCBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuXG5jb25zdCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gfHwgcmVxdWlyZSgnc3RyZWFtL3dlYicpLlJlYWRhYmxlU3RyZWFtXG5jb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigndXRmLTgnKVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVzcG9uc2UtY2xhc3NcbmNsYXNzIFJlc3BvbnNlIHtcbiAgLy8gQ3JlYXRlcyBuZXR3b3JrIGVycm9yIFJlc3BvbnNlLlxuICBzdGF0aWMgZXJyb3IgKCkge1xuICAgIC8vIFRPRE9cbiAgICBjb25zdCByZWxldmFudFJlYWxtID0geyBzZXR0aW5nc09iamVjdDoge30gfVxuXG4gICAgLy8gVGhlIHN0YXRpYyBlcnJvcigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYVxuICAgIC8vIFJlc3BvbnNlIG9iamVjdCwgZ2l2ZW4gYSBuZXcgbmV0d29yayBlcnJvciwgXCJpbW11dGFibGVcIiwgYW5kIHRoaXPigJlzXG4gICAgLy8gcmVsZXZhbnQgUmVhbG0uXG4gICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UoKVxuICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0gPSBtYWtlTmV0d29ya0Vycm9yKClcbiAgICByZXNwb25zZU9iamVjdFtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5oZWFkZXJzTGlzdFxuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrR3VhcmRdID0gJ2ltbXV0YWJsZSdcbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXR1cm4gcmVzcG9uc2VPYmplY3RcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tcmVzcG9uc2UtanNvblxuICBzdGF0aWMganNvbiAoZGF0YSwgaW5pdCA9IHt9KSB7XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1Jlc3BvbnNlLmpzb24nIH0pXG5cbiAgICBpZiAoaW5pdCAhPT0gbnVsbCkge1xuICAgICAgaW5pdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlc3BvbnNlSW5pdChpbml0KVxuICAgIH1cblxuICAgIC8vIDEuIExldCBieXRlcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgc2VyaWFsaXplIGEgSmF2YVNjcmlwdCB2YWx1ZSB0byBKU09OIGJ5dGVzIG9uIGRhdGEuXG4gICAgY29uc3QgYnl0ZXMgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoXG4gICAgICBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcoZGF0YSlcbiAgICApXG5cbiAgICAvLyAyLiBMZXQgYm9keSBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgYnl0ZXMuXG4gICAgY29uc3QgYm9keSA9IGV4dHJhY3RCb2R5KGJ5dGVzKVxuXG4gICAgLy8gMy4gTGV0IHJlc3BvbnNlT2JqZWN0IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsIGdpdmVuIGEgbmV3IHJlc3BvbnNlLFxuICAgIC8vICAgIFwicmVzcG9uc2VcIiwgYW5kIHRoaXPigJlzIHJlbGV2YW50IFJlYWxtLlxuICAgIGNvbnN0IHJlbGV2YW50UmVhbG0gPSB7IHNldHRpbmdzT2JqZWN0OiB7fSB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UoKVxuICAgIHJlc3BvbnNlT2JqZWN0W2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAncmVzcG9uc2UnXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG5cbiAgICAvLyA0LiBQZXJmb3JtIGluaXRpYWxpemUgYSByZXNwb25zZSBnaXZlbiByZXNwb25zZU9iamVjdCwgaW5pdCwgYW5kIChib2R5LCBcImFwcGxpY2F0aW9uL2pzb25cIikuXG4gICAgaW5pdGlhbGl6ZVJlc3BvbnNlKHJlc3BvbnNlT2JqZWN0LCBpbml0LCB7IGJvZHk6IGJvZHlbMF0sIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KVxuXG4gICAgLy8gNS4gUmV0dXJuIHJlc3BvbnNlT2JqZWN0LlxuICAgIHJldHVybiByZXNwb25zZU9iamVjdFxuICB9XG5cbiAgLy8gQ3JlYXRlcyBhIHJlZGlyZWN0IFJlc3BvbnNlIHRoYXQgcmVkaXJlY3RzIHRvIHVybCB3aXRoIHN0YXR1cyBzdGF0dXMuXG4gIHN0YXRpYyByZWRpcmVjdCAodXJsLCBzdGF0dXMgPSAzMDIpIHtcbiAgICBjb25zdCByZWxldmFudFJlYWxtID0geyBzZXR0aW5nc09iamVjdDoge30gfVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1Jlc3BvbnNlLnJlZGlyZWN0JyB9KVxuXG4gICAgdXJsID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKHVybClcbiAgICBzdGF0dXMgPSB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgc2hvcnQnXShzdGF0dXMpXG5cbiAgICAvLyAxLiBMZXQgcGFyc2VkVVJMIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyB1cmwgd2l0aCBjdXJyZW50IHNldHRpbmdzXG4gICAgLy8gb2JqZWN04oCZcyBBUEkgYmFzZSBVUkwuXG4gICAgLy8gMi4gSWYgcGFyc2VkVVJMIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgLy8gVE9ETzogYmFzZS1VUkw/XG4gICAgbGV0IHBhcnNlZFVSTFxuICAgIHRyeSB7XG4gICAgICBwYXJzZWRVUkwgPSBuZXcgVVJMKHVybCwgZ2V0R2xvYmFsT3JpZ2luKCkpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBVUkwgZnJvbSAnICsgdXJsKSwge1xuICAgICAgICBjYXVzZTogZXJyXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDMuIElmIHN0YXR1cyBpcyBub3QgYSByZWRpcmVjdCBzdGF0dXMsIHRoZW4gdGhyb3cgYSBSYW5nZUVycm9yLlxuICAgIGlmICghcmVkaXJlY3RTdGF0dXNTZXQuaGFzKHN0YXR1cykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlICcgKyBzdGF0dXMpXG4gICAgfVxuXG4gICAgLy8gNC4gTGV0IHJlc3BvbnNlT2JqZWN0IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsXG4gICAgLy8gZ2l2ZW4gYSBuZXcgcmVzcG9uc2UsIFwiaW1tdXRhYmxlXCIsIGFuZCB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cbiAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgcmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9ICdpbW11dGFibGUnXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG5cbiAgICAvLyA1LiBTZXQgcmVzcG9uc2VPYmplY3TigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXMgdG8gc3RhdHVzLlxuICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0uc3RhdHVzID0gc3RhdHVzXG5cbiAgICAvLyA2LiBMZXQgdmFsdWUgYmUgcGFyc2VkVVJMLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQuXG4gICAgY29uc3QgdmFsdWUgPSBpc29tb3JwaGljRW5jb2RlKFVSTFNlcmlhbGl6ZXIocGFyc2VkVVJMKSlcblxuICAgIC8vIDcuIEFwcGVuZCBgTG9jYXRpb25gL3ZhbHVlIHRvIHJlc3BvbnNlT2JqZWN04oCZcyByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gICAgcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5oZWFkZXJzTGlzdC5hcHBlbmQoJ2xvY2F0aW9uJywgdmFsdWUpXG5cbiAgICAvLyA4LiBSZXR1cm4gcmVzcG9uc2VPYmplY3QuXG4gICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlc3BvbnNlXG4gIGNvbnN0cnVjdG9yIChib2R5ID0gbnVsbCwgaW5pdCA9IHt9KSB7XG4gICAgaWYgKGJvZHkgIT09IG51bGwpIHtcbiAgICAgIGJvZHkgPSB3ZWJpZGwuY29udmVydGVycy5Cb2R5SW5pdChib2R5KVxuICAgIH1cblxuICAgIGluaXQgPSB3ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQoaW5pdClcblxuICAgIC8vIFRPRE9cbiAgICB0aGlzW2tSZWFsbV0gPSB7IHNldHRpbmdzT2JqZWN0OiB7fSB9XG5cbiAgICAvLyAxLiBTZXQgdGhpc+KAmXMgcmVzcG9uc2UgdG8gYSBuZXcgcmVzcG9uc2UuXG4gICAgdGhpc1trU3RhdGVdID0gbWFrZVJlc3BvbnNlKHt9KVxuXG4gICAgLy8gMi4gU2V0IHRoaXPigJlzIGhlYWRlcnMgdG8gYSBuZXcgSGVhZGVycyBvYmplY3Qgd2l0aCB0aGlz4oCZcyByZWxldmFudFxuICAgIC8vIFJlYWxtLCB3aG9zZSBoZWFkZXIgbGlzdCBpcyB0aGlz4oCZcyByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QgYW5kIGd1YXJkXG4gICAgLy8gaXMgXCJyZXNwb25zZVwiLlxuICAgIHRoaXNba0hlYWRlcnNdID0gbmV3IEhlYWRlcnMoa0NvbnN0cnVjdClcbiAgICB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdID0gJ3Jlc3BvbnNlJ1xuICAgIHRoaXNba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF0gPSB0aGlzW2tTdGF0ZV0uaGVhZGVyc0xpc3RcbiAgICB0aGlzW2tIZWFkZXJzXVtrUmVhbG1dID0gdGhpc1trUmVhbG1dXG5cbiAgICAvLyAzLiBMZXQgYm9keVdpdGhUeXBlIGJlIG51bGwuXG4gICAgbGV0IGJvZHlXaXRoVHlwZSA9IG51bGxcblxuICAgIC8vIDQuIElmIGJvZHkgaXMgbm9uLW51bGwsIHRoZW4gc2V0IGJvZHlXaXRoVHlwZSB0byB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgYm9keS5cbiAgICBpZiAoYm9keSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBbZXh0cmFjdGVkQm9keSwgdHlwZV0gPSBleHRyYWN0Qm9keShib2R5KVxuICAgICAgYm9keVdpdGhUeXBlID0geyBib2R5OiBleHRyYWN0ZWRCb2R5LCB0eXBlIH1cbiAgICB9XG5cbiAgICAvLyA1LiBQZXJmb3JtIGluaXRpYWxpemUgYSByZXNwb25zZSBnaXZlbiB0aGlzLCBpbml0LCBhbmQgYm9keVdpdGhUeXBlLlxuICAgIGluaXRpYWxpemVSZXNwb25zZSh0aGlzLCBpbml0LCBib2R5V2l0aFR5cGUpXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyB0eXBlLCBlLmcuLCBcImNvcnNcIi5cbiAgZ2V0IHR5cGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHR5cGUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVzcG9uc2XigJlzIHR5cGUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS50eXBlXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBVUkwsIGlmIGl0IGhhcyBvbmU7IG90aGVyd2lzZSB0aGUgZW1wdHkgc3RyaW5nLlxuICBnZXQgdXJsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIGNvbnN0IHVybExpc3QgPSB0aGlzW2tTdGF0ZV0udXJsTGlzdFxuXG4gICAgLy8gVGhlIHVybCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoaXPigJlzXG4gICAgLy8gcmVzcG9uc2XigJlzIFVSTCBpcyBudWxsOyBvdGhlcndpc2UgdGhpc+KAmXMgcmVzcG9uc2XigJlzIFVSTCxcbiAgICAvLyBzZXJpYWxpemVkIHdpdGggZXhjbHVkZSBmcmFnbWVudCBzZXQgdG8gdHJ1ZS5cbiAgICBjb25zdCB1cmwgPSB1cmxMaXN0W3VybExpc3QubGVuZ3RoIC0gMV0gPz8gbnVsbFxuXG4gICAgaWYgKHVybCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgcmV0dXJuIFVSTFNlcmlhbGl6ZXIodXJsLCB0cnVlKVxuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHJlc3BvbnNlIHdhcyBvYnRhaW5lZCB0aHJvdWdoIGEgcmVkaXJlY3QuXG4gIGdldCByZWRpcmVjdGVkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSByZWRpcmVjdGVkIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXMgcmVzcG9uc2XigJlzIFVSTFxuICAgIC8vIGxpc3QgaGFzIG1vcmUgdGhhbiBvbmUgaXRlbTsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0udXJsTGlzdC5sZW5ndGggPiAxXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBzdGF0dXMuXG4gIGdldCBzdGF0dXMgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHN0YXR1cyBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uc3RhdHVzXG4gIH1cblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyBhbiBvayBzdGF0dXMuXG4gIGdldCBvayAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICAvLyBUaGUgb2sgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdHJ1ZSBpZiB0aGlz4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzIGlzIGFuXG4gICAgLy8gb2sgc3RhdHVzOyBvdGhlcndpc2UgZmFsc2UuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5zdGF0dXMgPj0gMjAwICYmIHRoaXNba1N0YXRlXS5zdGF0dXMgPD0gMjk5XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBzdGF0dXMgbWVzc2FnZS5cbiAgZ2V0IHN0YXR1c1RleHQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHN0YXR1c1RleHQgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVzcG9uc2XigJlzIHN0YXR1c1xuICAgIC8vIG1lc3NhZ2UuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5zdGF0dXNUZXh0XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBoZWFkZXJzIGFzIEhlYWRlcnMuXG4gIGdldCBoZWFkZXJzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSBoZWFkZXJzIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIGhlYWRlcnMuXG4gICAgcmV0dXJuIHRoaXNba0hlYWRlcnNdXG4gIH1cblxuICBnZXQgYm9keSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJvZHkgPyB0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0gOiBudWxsXG4gIH1cblxuICBnZXQgYm9keVVzZWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgcmV0dXJuICEhdGhpc1trU3RhdGVdLmJvZHkgJiYgdXRpbC5pc0Rpc3R1cmJlZCh0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0pXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgcmVzcG9uc2UuXG4gIGNsb25lICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIDEuIElmIHRoaXMgaXMgdW51c2FibGUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHRoaXMuYm9keVVzZWQgfHwgKHRoaXMuYm9keSAmJiB0aGlzLmJvZHkubG9ja2VkKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdSZXNwb25zZS5jbG9uZScsXG4gICAgICAgIG1lc3NhZ2U6ICdCb2R5IGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQuJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAyLiBMZXQgY2xvbmVkUmVzcG9uc2UgYmUgdGhlIHJlc3VsdCBvZiBjbG9uaW5nIHRoaXPigJlzIHJlc3BvbnNlLlxuICAgIGNvbnN0IGNsb25lZFJlc3BvbnNlID0gY2xvbmVSZXNwb25zZSh0aGlzW2tTdGF0ZV0pXG5cbiAgICAvLyAzLiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIFJlc3BvbnNlIG9iamVjdCwgZ2l2ZW5cbiAgICAvLyBjbG9uZWRSZXNwb25zZSwgdGhpc+KAmXMgaGVhZGVyc+KAmXMgZ3VhcmQsIGFuZCB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cbiAgICBjb25zdCBjbG9uZWRSZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgY2xvbmVkUmVzcG9uc2VPYmplY3Rba1N0YXRlXSA9IGNsb25lZFJlc3BvbnNlXG4gICAgY2xvbmVkUmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuICAgIGNsb25lZFJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gY2xvbmVkUmVzcG9uc2UuaGVhZGVyc0xpc3RcbiAgICBjbG9uZWRSZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9IHRoaXNba0hlYWRlcnNdW2tHdWFyZF1cbiAgICBjbG9uZWRSZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba1JlYWxtXSA9IHRoaXNba0hlYWRlcnNdW2tSZWFsbV1cblxuICAgIHJldHVybiBjbG9uZWRSZXNwb25zZU9iamVjdFxuICB9XG59XG5cbm1peGluQm9keShSZXNwb25zZSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVzcG9uc2UucHJvdG90eXBlLCB7XG4gIHR5cGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHVybDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgc3RhdHVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvazoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVkaXJlY3RlZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgc3RhdHVzVGV4dDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGVhZGVyczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY2xvbmU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHk6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHlVc2VkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnUmVzcG9uc2UnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXNwb25zZSwge1xuICBqc29uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWRpcmVjdDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXJlc3BvbnNlLWNsb25lXG5mdW5jdGlvbiBjbG9uZVJlc3BvbnNlIChyZXNwb25zZSkge1xuICAvLyBUbyBjbG9uZSBhIHJlc3BvbnNlIHJlc3BvbnNlLCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSwgdGhlbiByZXR1cm4gYSBuZXcgaWRlbnRpY2FsXG4gIC8vIGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIGludGVybmFsIHJlc3BvbnNlIGlzIGEgY2xvbmUgb2YgcmVzcG9uc2XigJlzXG4gIC8vIGludGVybmFsIHJlc3BvbnNlLlxuICBpZiAocmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZSkge1xuICAgIHJldHVybiBmaWx0ZXJSZXNwb25zZShcbiAgICAgIGNsb25lUmVzcG9uc2UocmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZSksXG4gICAgICByZXNwb25zZS50eXBlXG4gICAgKVxuICB9XG5cbiAgLy8gMi4gTGV0IG5ld1Jlc3BvbnNlIGJlIGEgY29weSBvZiByZXNwb25zZSwgZXhjZXB0IGZvciBpdHMgYm9keS5cbiAgY29uc3QgbmV3UmVzcG9uc2UgPSBtYWtlUmVzcG9uc2UoeyAuLi5yZXNwb25zZSwgYm9keTogbnVsbCB9KVxuXG4gIC8vIDMuIElmIHJlc3BvbnNl4oCZcyBib2R5IGlzIG5vbi1udWxsLCB0aGVuIHNldCBuZXdSZXNwb25zZeKAmXMgYm9keSB0byB0aGVcbiAgLy8gcmVzdWx0IG9mIGNsb25pbmcgcmVzcG9uc2XigJlzIGJvZHkuXG4gIGlmIChyZXNwb25zZS5ib2R5ICE9IG51bGwpIHtcbiAgICBuZXdSZXNwb25zZS5ib2R5ID0gY2xvbmVCb2R5KHJlc3BvbnNlLmJvZHkpXG4gIH1cblxuICAvLyA0LiBSZXR1cm4gbmV3UmVzcG9uc2UuXG4gIHJldHVybiBuZXdSZXNwb25zZVxufVxuXG5mdW5jdGlvbiBtYWtlUmVzcG9uc2UgKGluaXQpIHtcbiAgcmV0dXJuIHtcbiAgICBhYm9ydGVkOiBmYWxzZSxcbiAgICByYW5nZVJlcXVlc3RlZDogZmFsc2UsXG4gICAgdGltaW5nQWxsb3dQYXNzZWQ6IGZhbHNlLFxuICAgIHJlcXVlc3RJbmNsdWRlc0NyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgc3RhdHVzOiAyMDAsXG4gICAgdGltaW5nSW5mbzogbnVsbCxcbiAgICBjYWNoZVN0YXRlOiAnJyxcbiAgICBzdGF0dXNUZXh0OiAnJyxcbiAgICAuLi5pbml0LFxuICAgIGhlYWRlcnNMaXN0OiBpbml0LmhlYWRlcnNMaXN0XG4gICAgICA/IG5ldyBIZWFkZXJzTGlzdChpbml0LmhlYWRlcnNMaXN0KVxuICAgICAgOiBuZXcgSGVhZGVyc0xpc3QoKSxcbiAgICB1cmxMaXN0OiBpbml0LnVybExpc3QgPyBbLi4uaW5pdC51cmxMaXN0XSA6IFtdXG4gIH1cbn1cblxuZnVuY3Rpb24gbWFrZU5ldHdvcmtFcnJvciAocmVhc29uKSB7XG4gIGNvbnN0IGlzRXJyb3IgPSBpc0Vycm9yTGlrZShyZWFzb24pXG4gIHJldHVybiBtYWtlUmVzcG9uc2Uoe1xuICAgIHR5cGU6ICdlcnJvcicsXG4gICAgc3RhdHVzOiAwLFxuICAgIGVycm9yOiBpc0Vycm9yXG4gICAgICA/IHJlYXNvblxuICAgICAgOiBuZXcgRXJyb3IocmVhc29uID8gU3RyaW5nKHJlYXNvbikgOiByZWFzb24pLFxuICAgIGFib3J0ZWQ6IHJlYXNvbiAmJiByZWFzb24ubmFtZSA9PT0gJ0Fib3J0RXJyb3InXG4gIH0pXG59XG5cbmZ1bmN0aW9uIG1ha2VGaWx0ZXJlZFJlc3BvbnNlIChyZXNwb25zZSwgc3RhdGUpIHtcbiAgc3RhdGUgPSB7XG4gICAgaW50ZXJuYWxSZXNwb25zZTogcmVzcG9uc2UsXG4gICAgLi4uc3RhdGVcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJveHkocmVzcG9uc2UsIHtcbiAgICBnZXQgKHRhcmdldCwgcCkge1xuICAgICAgcmV0dXJuIHAgaW4gc3RhdGUgPyBzdGF0ZVtwXSA6IHRhcmdldFtwXVxuICAgIH0sXG4gICAgc2V0ICh0YXJnZXQsIHAsIHZhbHVlKSB7XG4gICAgICBhc3NlcnQoIShwIGluIHN0YXRlKSlcbiAgICAgIHRhcmdldFtwXSA9IHZhbHVlXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfSlcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZmlsdGVyZWQtcmVzcG9uc2VcbmZ1bmN0aW9uIGZpbHRlclJlc3BvbnNlIChyZXNwb25zZSwgdHlwZSkge1xuICAvLyBTZXQgcmVzcG9uc2UgdG8gdGhlIGZvbGxvd2luZyBmaWx0ZXJlZCByZXNwb25zZSB3aXRoIHJlc3BvbnNlIGFzIGl0c1xuICAvLyBpbnRlcm5hbCByZXNwb25zZSwgZGVwZW5kaW5nIG9uIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nOlxuICBpZiAodHlwZSA9PT0gJ2Jhc2ljJykge1xuICAgIC8vIEEgYmFzaWMgZmlsdGVyZWQgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSB0eXBlIGlzIFwiYmFzaWNcIlxuICAgIC8vIGFuZCBoZWFkZXIgbGlzdCBleGNsdWRlcyBhbnkgaGVhZGVycyBpbiBpbnRlcm5hbCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3RcbiAgICAvLyB3aG9zZSBuYW1lIGlzIGEgZm9yYmlkZGVuIHJlc3BvbnNlLWhlYWRlciBuYW1lLlxuXG4gICAgLy8gTm90ZTogdW5kaWNpIGRvZXMgbm90IGltcGxlbWVudCBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWVzXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnYmFzaWMnLFxuICAgICAgaGVhZGVyc0xpc3Q6IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnY29ycycpIHtcbiAgICAvLyBBIENPUlMgZmlsdGVyZWQgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSB0eXBlIGlzIFwiY29yc1wiXG4gICAgLy8gYW5kIGhlYWRlciBsaXN0IGV4Y2x1ZGVzIGFueSBoZWFkZXJzIGluIGludGVybmFsIHJlc3BvbnNl4oCZcyBoZWFkZXJcbiAgICAvLyBsaXN0IHdob3NlIG5hbWUgaXMgbm90IGEgQ09SUy1zYWZlbGlzdGVkIHJlc3BvbnNlLWhlYWRlciBuYW1lLCBnaXZlblxuICAgIC8vIGludGVybmFsIHJlc3BvbnNl4oCZcyBDT1JTLWV4cG9zZWQgaGVhZGVyLW5hbWUgbGlzdC5cblxuICAgIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgQ09SUy1zYWZlbGlzdGVkIHJlc3BvbnNlLWhlYWRlciBuYW1lc1xuICAgIHJldHVybiBtYWtlRmlsdGVyZWRSZXNwb25zZShyZXNwb25zZSwge1xuICAgICAgdHlwZTogJ2NvcnMnLFxuICAgICAgaGVhZGVyc0xpc3Q6IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BhcXVlJykge1xuICAgIC8vIEFuIG9wYXF1ZSBmaWx0ZXJlZCByZXNwb25zZSBpcyBhIGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIHR5cGUgaXNcbiAgICAvLyBcIm9wYXF1ZVwiLCBVUkwgbGlzdCBpcyB0aGUgZW1wdHkgbGlzdCwgc3RhdHVzIGlzIDAsIHN0YXR1cyBtZXNzYWdlXG4gICAgLy8gaXMgdGhlIGVtcHR5IGJ5dGUgc2VxdWVuY2UsIGhlYWRlciBsaXN0IGlzIGVtcHR5LCBhbmQgYm9keSBpcyBudWxsLlxuXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnb3BhcXVlJyxcbiAgICAgIHVybExpc3Q6IE9iamVjdC5mcmVlemUoW10pLFxuICAgICAgc3RhdHVzOiAwLFxuICAgICAgc3RhdHVzVGV4dDogJycsXG4gICAgICBib2R5OiBudWxsXG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BhcXVlcmVkaXJlY3QnKSB7XG4gICAgLy8gQW4gb3BhcXVlLXJlZGlyZWN0IGZpbHRlcmVkIHJlc3BvbnNlIGlzIGEgZmlsdGVyZWQgcmVzcG9uc2Ugd2hvc2UgdHlwZVxuICAgIC8vIGlzIFwib3BhcXVlcmVkaXJlY3RcIiwgc3RhdHVzIGlzIDAsIHN0YXR1cyBtZXNzYWdlIGlzIHRoZSBlbXB0eSBieXRlXG4gICAgLy8gc2VxdWVuY2UsIGhlYWRlciBsaXN0IGlzIGVtcHR5LCBhbmQgYm9keSBpcyBudWxsLlxuXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnb3BhcXVlcmVkaXJlY3QnLFxuICAgICAgc3RhdHVzOiAwLFxuICAgICAgc3RhdHVzVGV4dDogJycsXG4gICAgICBoZWFkZXJzTGlzdDogW10sXG4gICAgICBib2R5OiBudWxsXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoZmFsc2UpXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2FwcHJvcHJpYXRlLW5ldHdvcmstZXJyb3JcbmZ1bmN0aW9uIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvciAoZmV0Y2hQYXJhbXMsIGVyciA9IG51bGwpIHtcbiAgLy8gMS4gQXNzZXJ0OiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZC5cbiAgYXNzZXJ0KGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSlcblxuICAvLyAyLiBSZXR1cm4gYW4gYWJvcnRlZCBuZXR3b3JrIGVycm9yIGlmIGZldGNoUGFyYW1zIGlzIGFib3J0ZWQ7XG4gIC8vIG90aGVyd2lzZSByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICByZXR1cm4gaXNBYm9ydGVkKGZldGNoUGFyYW1zKVxuICAgID8gbWFrZU5ldHdvcmtFcnJvcihPYmplY3QuYXNzaWduKG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKSwgeyBjYXVzZTogZXJyIH0pKVxuICAgIDogbWFrZU5ldHdvcmtFcnJvcihPYmplY3QuYXNzaWduKG5ldyBET01FeGNlcHRpb24oJ1JlcXVlc3Qgd2FzIGNhbmNlbGxlZC4nKSwgeyBjYXVzZTogZXJyIH0pKVxufVxuXG4vLyBodHRwczovL3doYXRwci5vcmcvZmV0Y2gvMTM5Mi5odG1sI2luaXRpYWxpemUtYS1yZXNwb25zZVxuZnVuY3Rpb24gaW5pdGlhbGl6ZVJlc3BvbnNlIChyZXNwb25zZSwgaW5pdCwgYm9keSkge1xuICAvLyAxLiBJZiBpbml0W1wic3RhdHVzXCJdIGlzIG5vdCBpbiB0aGUgcmFuZ2UgMjAwIHRvIDU5OSwgaW5jbHVzaXZlLCB0aGVuXG4gIC8vICAgIHRocm93IGEgUmFuZ2VFcnJvci5cbiAgaWYgKGluaXQuc3RhdHVzICE9PSBudWxsICYmIChpbml0LnN0YXR1cyA8IDIwMCB8fCBpbml0LnN0YXR1cyA+IDU5OSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5pdFtcInN0YXR1c1wiXSBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiAyMDAgdG8gNTk5LCBpbmNsdXNpdmUuJylcbiAgfVxuXG4gIC8vIDIuIElmIGluaXRbXCJzdGF0dXNUZXh0XCJdIGRvZXMgbm90IG1hdGNoIHRoZSByZWFzb24tcGhyYXNlIHRva2VuIHByb2R1Y3Rpb24sXG4gIC8vICAgIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGlmICgnc3RhdHVzVGV4dCcgaW4gaW5pdCAmJiBpbml0LnN0YXR1c1RleHQgIT0gbnVsbCkge1xuICAgIC8vIFNlZSwgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4xLjI6XG4gICAgLy8gICByZWFzb24tcGhyYXNlICA9ICooIEhUQUIgLyBTUCAvIFZDSEFSIC8gb2JzLXRleHQgKVxuICAgIGlmICghaXNWYWxpZFJlYXNvblBocmFzZShTdHJpbmcoaW5pdC5zdGF0dXNUZXh0KSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc3RhdHVzVGV4dCcpXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gU2V0IHJlc3BvbnNl4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzIHRvIGluaXRbXCJzdGF0dXNcIl0uXG4gIGlmICgnc3RhdHVzJyBpbiBpbml0ICYmIGluaXQuc3RhdHVzICE9IG51bGwpIHtcbiAgICByZXNwb25zZVtrU3RhdGVdLnN0YXR1cyA9IGluaXQuc3RhdHVzXG4gIH1cblxuICAvLyA0LiBTZXQgcmVzcG9uc2XigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXMgbWVzc2FnZSB0byBpbml0W1wic3RhdHVzVGV4dFwiXS5cbiAgaWYgKCdzdGF0dXNUZXh0JyBpbiBpbml0ICYmIGluaXQuc3RhdHVzVGV4dCAhPSBudWxsKSB7XG4gICAgcmVzcG9uc2Vba1N0YXRlXS5zdGF0dXNUZXh0ID0gaW5pdC5zdGF0dXNUZXh0XG4gIH1cblxuICAvLyA1LiBJZiBpbml0W1wiaGVhZGVyc1wiXSBleGlzdHMsIHRoZW4gZmlsbCByZXNwb25zZeKAmXMgaGVhZGVycyB3aXRoIGluaXRbXCJoZWFkZXJzXCJdLlxuICBpZiAoJ2hlYWRlcnMnIGluIGluaXQgJiYgaW5pdC5oZWFkZXJzICE9IG51bGwpIHtcbiAgICBmaWxsKHJlc3BvbnNlW2tIZWFkZXJzXSwgaW5pdC5oZWFkZXJzKVxuICB9XG5cbiAgLy8gNi4gSWYgYm9keSB3YXMgZ2l2ZW4sIHRoZW46XG4gIGlmIChib2R5KSB7XG4gICAgLy8gMS4gSWYgcmVzcG9uc2UncyBzdGF0dXMgaXMgYSBudWxsIGJvZHkgc3RhdHVzLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChudWxsQm9keVN0YXR1cy5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ1Jlc3BvbnNlIGNvbnN0cnVjdG9yJyxcbiAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1c1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAyLiBTZXQgcmVzcG9uc2UncyBib2R5IHRvIGJvZHkncyBib2R5LlxuICAgIHJlc3BvbnNlW2tTdGF0ZV0uYm9keSA9IGJvZHkuYm9keVxuXG4gICAgLy8gMy4gSWYgYm9keSdzIHR5cGUgaXMgbm9uLW51bGwgYW5kIHJlc3BvbnNlJ3MgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpblxuICAgIC8vICAgIGBDb250ZW50LVR5cGVgLCB0aGVuIGFwcGVuZCAoYENvbnRlbnQtVHlwZWAsIGJvZHkncyB0eXBlKSB0byByZXNwb25zZSdzIGhlYWRlciBsaXN0LlxuICAgIGlmIChib2R5LnR5cGUgIT0gbnVsbCAmJiAhcmVzcG9uc2Vba1N0YXRlXS5oZWFkZXJzTGlzdC5jb250YWlucygnQ29udGVudC1UeXBlJykpIHtcbiAgICAgIHJlc3BvbnNlW2tTdGF0ZV0uaGVhZGVyc0xpc3QuYXBwZW5kKCdjb250ZW50LXR5cGUnLCBib2R5LnR5cGUpXG4gICAgfVxuICB9XG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLlJlYWRhYmxlU3RyZWFtID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihcbiAgUmVhZGFibGVTdHJlYW1cbilcblxud2ViaWRsLmNvbnZlcnRlcnMuRm9ybURhdGEgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBGb3JtRGF0YVxuKVxuXG53ZWJpZGwuY29udmVydGVycy5VUkxTZWFyY2hQYXJhbXMgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBVUkxTZWFyY2hQYXJhbXNcbilcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3R5cGVkZWZkZWYteG1saHR0cHJlcXVlc3Rib2R5aW5pdFxud2ViaWRsLmNvbnZlcnRlcnMuWE1MSHR0cFJlcXVlc3RCb2R5SW5pdCA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh0eXBlb2YgViA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKFYpXG4gIH1cblxuICBpZiAoaXNCbG9iTGlrZShWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5CbG9iKFYsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICB9XG5cbiAgaWYgKHR5cGVzLmlzQXJyYXlCdWZmZXIoVikgfHwgdHlwZXMuaXNUeXBlZEFycmF5KFYpIHx8IHR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQnVmZmVyU291cmNlKFYpXG4gIH1cblxuICBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5Gb3JtRGF0YShWLCB7IHN0cmljdDogZmFsc2UgfSlcbiAgfVxuXG4gIGlmIChWIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVSTFNlYXJjaFBhcmFtcyhWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYm9keWluaXRcbndlYmlkbC5jb252ZXJ0ZXJzLkJvZHlJbml0ID0gZnVuY3Rpb24gKFYpIHtcbiAgaWYgKFYgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5SZWFkYWJsZVN0cmVhbShWKVxuICB9XG5cbiAgLy8gTm90ZTogdGhlIHNwZWMgZG9lc24ndCBpbmNsdWRlIGFzeW5jIGl0ZXJhYmxlcyxcbiAgLy8gdGhpcyBpcyBhbiB1bmRpY2kgZXh0ZW5zaW9uLlxuICBpZiAoVj8uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkge1xuICAgIHJldHVybiBWXG4gIH1cblxuICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuWE1MSHR0cFJlcXVlc3RCb2R5SW5pdChWKVxufVxuXG53ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdzdGF0dXMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10sXG4gICAgZGVmYXVsdFZhbHVlOiAyMDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3N0YXR1c1RleHQnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdoZWFkZXJzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0XG4gIH1cbl0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtYWtlTmV0d29ya0Vycm9yLFxuICBtYWtlUmVzcG9uc2UsXG4gIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvcixcbiAgZmlsdGVyUmVzcG9uc2UsXG4gIFJlc3BvbnNlLFxuICBjbG9uZVJlc3BvbnNlXG59XG4iLAogICAgIi8qIGdsb2JhbHMgQWJvcnRDb250cm9sbGVyICovXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGV4dHJhY3RCb2R5LCBtaXhpbkJvZHksIGNsb25lQm9keSB9ID0gcmVxdWlyZSgnLi9ib2R5JylcbmNvbnN0IHsgSGVhZGVycywgZmlsbDogZmlsbEhlYWRlcnMsIEhlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuY29uc3QgeyBGaW5hbGl6YXRpb25SZWdpc3RyeSB9ID0gcmVxdWlyZSgnLi4vY29tcGF0L2Rpc3BhdGNoZXItd2Vha3JlZicpKClcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3Qge1xuICBpc1ZhbGlkSFRUUFRva2VuLFxuICBzYW1lT3JpZ2luLFxuICBub3JtYWxpemVNZXRob2QsXG4gIG1ha2VQb2xpY3lDb250YWluZXIsXG4gIG5vcm1hbGl6ZU1ldGhvZFJlY29yZFxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7XG4gIGZvcmJpZGRlbk1ldGhvZHNTZXQsXG4gIGNvcnNTYWZlTGlzdGVkTWV0aG9kc1NldCxcbiAgcmVmZXJyZXJQb2xpY3ksXG4gIHJlcXVlc3RSZWRpcmVjdCxcbiAgcmVxdWVzdE1vZGUsXG4gIHJlcXVlc3RDcmVkZW50aWFscyxcbiAgcmVxdWVzdENhY2hlLFxuICByZXF1ZXN0RHVwbGV4XG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5IH0gPSB1dGlsXG5jb25zdCB7IGtIZWFkZXJzLCBrU2lnbmFsLCBrU3RhdGUsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2dsb2JhbCcpXG5jb25zdCB7IFVSTFNlcmlhbGl6ZXIgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5jb25zdCB7IGtIZWFkZXJzTGlzdCwga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGdldE1heExpc3RlbmVycywgc2V0TWF4TGlzdGVuZXJzLCBnZXRFdmVudExpc3RlbmVycywgZGVmYXVsdE1heExpc3RlbmVycyB9ID0gcmVxdWlyZSgnZXZlbnRzJylcblxubGV0IFRyYW5zZm9ybVN0cmVhbSA9IGdsb2JhbFRoaXMuVHJhbnNmb3JtU3RyZWFtXG5cbmNvbnN0IGtBYm9ydENvbnRyb2xsZXIgPSBTeW1ib2woJ2Fib3J0Q29udHJvbGxlcicpXG5cbmNvbnN0IHJlcXVlc3RGaW5hbGl6ZXIgPSBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKHsgc2lnbmFsLCBhYm9ydCB9KSA9PiB7XG4gIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxufSlcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3QtY2xhc3NcbmNsYXNzIFJlcXVlc3Qge1xuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlcXVlc3RcbiAgY29uc3RydWN0b3IgKGlucHV0LCBpbml0ID0ge30pIHtcbiAgICBpZiAoaW5wdXQgPT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdSZXF1ZXN0IGNvbnN0cnVjdG9yJyB9KVxuXG4gICAgaW5wdXQgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhpbnB1dClcbiAgICBpbml0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluaXQoaW5pdClcblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNlbnZpcm9ubWVudC1zZXR0aW5ncy1vYmplY3RcbiAgICB0aGlzW2tSZWFsbV0gPSB7XG4gICAgICBzZXR0aW5nc09iamVjdDoge1xuICAgICAgICBiYXNlVXJsOiBnZXRHbG9iYWxPcmlnaW4oKSxcbiAgICAgICAgZ2V0IG9yaWdpbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVVybD8ub3JpZ2luXG4gICAgICAgIH0sXG4gICAgICAgIHBvbGljeUNvbnRhaW5lcjogbWFrZVBvbGljeUNvbnRhaW5lcigpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMS4gTGV0IHJlcXVlc3QgYmUgbnVsbC5cbiAgICBsZXQgcmVxdWVzdCA9IG51bGxcblxuICAgIC8vIDIuIExldCBmYWxsYmFja01vZGUgYmUgbnVsbC5cbiAgICBsZXQgZmFsbGJhY2tNb2RlID0gbnVsbFxuXG4gICAgLy8gMy4gTGV0IGJhc2VVUkwgYmUgdGhpc+KAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN04oCZcyBBUEkgYmFzZSBVUkwuXG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXNba1JlYWxtXS5zZXR0aW5nc09iamVjdC5iYXNlVXJsXG5cbiAgICAvLyA0LiBMZXQgc2lnbmFsIGJlIG51bGwuXG4gICAgbGV0IHNpZ25hbCA9IG51bGxcblxuICAgIC8vIDUuIElmIGlucHV0IGlzIGEgc3RyaW5nLCB0aGVuOlxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyAxLiBMZXQgcGFyc2VkVVJMIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyBpbnB1dCB3aXRoIGJhc2VVUkwuXG4gICAgICAvLyAyLiBJZiBwYXJzZWRVUkwgaXMgZmFpbHVyZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGxldCBwYXJzZWRVUkxcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZFVSTCA9IG5ldyBVUkwoaW5wdXQsIGJhc2VVcmwpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmFpbGVkIHRvIHBhcnNlIFVSTCBmcm9tICcgKyBpbnB1dCwgeyBjYXVzZTogZXJyIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIElmIHBhcnNlZFVSTCBpbmNsdWRlcyBjcmVkZW50aWFscywgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChwYXJzZWRVUkwudXNlcm5hbWUgfHwgcGFyc2VkVVJMLnBhc3N3b3JkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ1JlcXVlc3QgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGZyb20gYSBVUkwgdGhhdCBpbmNsdWRlcyBjcmVkZW50aWFsczogJyArXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDQuIFNldCByZXF1ZXN0IHRvIGEgbmV3IHJlcXVlc3Qgd2hvc2UgVVJMIGlzIHBhcnNlZFVSTC5cbiAgICAgIHJlcXVlc3QgPSBtYWtlUmVxdWVzdCh7IHVybExpc3Q6IFtwYXJzZWRVUkxdIH0pXG5cbiAgICAgIC8vIDUuIFNldCBmYWxsYmFja01vZGUgdG8gXCJjb3JzXCIuXG4gICAgICBmYWxsYmFja01vZGUgPSAnY29ycydcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gNi4gT3RoZXJ3aXNlOlxuXG4gICAgICAvLyA3LiBBc3NlcnQ6IGlucHV0IGlzIGEgUmVxdWVzdCBvYmplY3QuXG4gICAgICBhc3NlcnQoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KVxuXG4gICAgICAvLyA4LiBTZXQgcmVxdWVzdCB0byBpbnB1dOKAmXMgcmVxdWVzdC5cbiAgICAgIHJlcXVlc3QgPSBpbnB1dFtrU3RhdGVdXG5cbiAgICAgIC8vIDkuIFNldCBzaWduYWwgdG8gaW5wdXTigJlzIHNpZ25hbC5cbiAgICAgIHNpZ25hbCA9IGlucHV0W2tTaWduYWxdXG4gICAgfVxuXG4gICAgLy8gNy4gTGV0IG9yaWdpbiBiZSB0aGlz4oCZcyByZWxldmFudCBzZXR0aW5ncyBvYmplY3TigJlzIG9yaWdpbi5cbiAgICBjb25zdCBvcmlnaW4gPSB0aGlzW2tSZWFsbV0uc2V0dGluZ3NPYmplY3Qub3JpZ2luXG5cbiAgICAvLyA4LiBMZXQgd2luZG93IGJlIFwiY2xpZW50XCIuXG4gICAgbGV0IHdpbmRvdyA9ICdjbGllbnQnXG5cbiAgICAvLyA5LiBJZiByZXF1ZXN04oCZcyB3aW5kb3cgaXMgYW4gZW52aXJvbm1lbnQgc2V0dGluZ3Mgb2JqZWN0IGFuZCBpdHMgb3JpZ2luXG4gICAgLy8gaXMgc2FtZSBvcmlnaW4gd2l0aCBvcmlnaW4sIHRoZW4gc2V0IHdpbmRvdyB0byByZXF1ZXN04oCZcyB3aW5kb3cuXG4gICAgaWYgKFxuICAgICAgcmVxdWVzdC53aW5kb3c/LmNvbnN0cnVjdG9yPy5uYW1lID09PSAnRW52aXJvbm1lbnRTZXR0aW5nc09iamVjdCcgJiZcbiAgICAgIHNhbWVPcmlnaW4ocmVxdWVzdC53aW5kb3csIG9yaWdpbilcbiAgICApIHtcbiAgICAgIHdpbmRvdyA9IHJlcXVlc3Qud2luZG93XG4gICAgfVxuXG4gICAgLy8gMTAuIElmIGluaXRbXCJ3aW5kb3dcIl0gZXhpc3RzIGFuZCBpcyBub24tbnVsbCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoaW5pdC53aW5kb3cgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJ3dpbmRvdycgb3B0aW9uICcke3dpbmRvd30nIG11c3QgYmUgbnVsbGApXG4gICAgfVxuXG4gICAgLy8gMTEuIElmIGluaXRbXCJ3aW5kb3dcIl0gZXhpc3RzLCB0aGVuIHNldCB3aW5kb3cgdG8gXCJuby13aW5kb3dcIi5cbiAgICBpZiAoJ3dpbmRvdycgaW4gaW5pdCkge1xuICAgICAgd2luZG93ID0gJ25vLXdpbmRvdydcbiAgICB9XG5cbiAgICAvLyAxMi4gU2V0IHJlcXVlc3QgdG8gYSBuZXcgcmVxdWVzdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICByZXF1ZXN0ID0gbWFrZVJlcXVlc3Qoe1xuICAgICAgLy8gVVJMIHJlcXVlc3TigJlzIFVSTC5cbiAgICAgIC8vIHVuZGljaSBpbXBsZW1lbnRhdGlvbiBub3RlOiB0aGlzIGlzIHNldCBhcyB0aGUgZmlyc3QgaXRlbSBpbiByZXF1ZXN0J3MgdXJsTGlzdCBpbiBtYWtlUmVxdWVzdFxuICAgICAgLy8gbWV0aG9kIHJlcXVlc3TigJlzIG1ldGhvZC5cbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAvLyBoZWFkZXIgbGlzdCBBIGNvcHkgb2YgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgICAvLyB1bmRpY2kgaW1wbGVtZW50YXRpb24gbm90ZTogaGVhZGVyc0xpc3QgaXMgY2xvbmVkIGluIG1ha2VSZXF1ZXN0XG4gICAgICBoZWFkZXJzTGlzdDogcmVxdWVzdC5oZWFkZXJzTGlzdCxcbiAgICAgIC8vIHVuc2FmZS1yZXF1ZXN0IGZsYWcgU2V0LlxuICAgICAgdW5zYWZlUmVxdWVzdDogcmVxdWVzdC51bnNhZmVSZXF1ZXN0LFxuICAgICAgLy8gY2xpZW50IFRoaXPigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdC5cbiAgICAgIGNsaWVudDogdGhpc1trUmVhbG1dLnNldHRpbmdzT2JqZWN0LFxuICAgICAgLy8gd2luZG93IHdpbmRvdy5cbiAgICAgIHdpbmRvdyxcbiAgICAgIC8vIHByaW9yaXR5IHJlcXVlc3TigJlzIHByaW9yaXR5LlxuICAgICAgcHJpb3JpdHk6IHJlcXVlc3QucHJpb3JpdHksXG4gICAgICAvLyBvcmlnaW4gcmVxdWVzdOKAmXMgb3JpZ2luLiBUaGUgcHJvcGFnYXRpb24gb2YgdGhlIG9yaWdpbiBpcyBvbmx5IHNpZ25pZmljYW50IGZvciBuYXZpZ2F0aW9uIHJlcXVlc3RzXG4gICAgICAvLyBiZWluZyBoYW5kbGVkIGJ5IGEgc2VydmljZSB3b3JrZXIuIEluIHRoaXMgc2NlbmFyaW8gYSByZXF1ZXN0IGNhbiBoYXZlIGFuIG9yaWdpbiB0aGF0IGlzIGRpZmZlcmVudFxuICAgICAgLy8gZnJvbSB0aGUgY3VycmVudCBjbGllbnQuXG4gICAgICBvcmlnaW46IHJlcXVlc3Qub3JpZ2luLFxuICAgICAgLy8gcmVmZXJyZXIgcmVxdWVzdOKAmXMgcmVmZXJyZXIuXG4gICAgICByZWZlcnJlcjogcmVxdWVzdC5yZWZlcnJlcixcbiAgICAgIC8vIHJlZmVycmVyIHBvbGljeSByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kuXG4gICAgICByZWZlcnJlclBvbGljeTogcmVxdWVzdC5yZWZlcnJlclBvbGljeSxcbiAgICAgIC8vIG1vZGUgcmVxdWVzdOKAmXMgbW9kZS5cbiAgICAgIG1vZGU6IHJlcXVlc3QubW9kZSxcbiAgICAgIC8vIGNyZWRlbnRpYWxzIG1vZGUgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZS5cbiAgICAgIGNyZWRlbnRpYWxzOiByZXF1ZXN0LmNyZWRlbnRpYWxzLFxuICAgICAgLy8gY2FjaGUgbW9kZSByZXF1ZXN04oCZcyBjYWNoZSBtb2RlLlxuICAgICAgY2FjaGU6IHJlcXVlc3QuY2FjaGUsXG4gICAgICAvLyByZWRpcmVjdCBtb2RlIHJlcXVlc3TigJlzIHJlZGlyZWN0IG1vZGUuXG4gICAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICAgIC8vIGludGVncml0eSBtZXRhZGF0YSByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEuXG4gICAgICBpbnRlZ3JpdHk6IHJlcXVlc3QuaW50ZWdyaXR5LFxuICAgICAgLy8ga2VlcGFsaXZlIHJlcXVlc3TigJlzIGtlZXBhbGl2ZS5cbiAgICAgIGtlZXBhbGl2ZTogcmVxdWVzdC5rZWVwYWxpdmUsXG4gICAgICAvLyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnIHJlcXVlc3TigJlzIHJlbG9hZC1uYXZpZ2F0aW9uIGZsYWcuXG4gICAgICByZWxvYWROYXZpZ2F0aW9uOiByZXF1ZXN0LnJlbG9hZE5hdmlnYXRpb24sXG4gICAgICAvLyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZyByZXF1ZXN04oCZcyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZy5cbiAgICAgIGhpc3RvcnlOYXZpZ2F0aW9uOiByZXF1ZXN0Lmhpc3RvcnlOYXZpZ2F0aW9uLFxuICAgICAgLy8gVVJMIGxpc3QgQSBjbG9uZSBvZiByZXF1ZXN04oCZcyBVUkwgbGlzdC5cbiAgICAgIHVybExpc3Q6IFsuLi5yZXF1ZXN0LnVybExpc3RdXG4gICAgfSlcblxuICAgIGNvbnN0IGluaXRIYXNLZXkgPSBPYmplY3Qua2V5cyhpbml0KS5sZW5ndGggIT09IDBcblxuICAgIC8vIDEzLiBJZiBpbml0IGlzIG5vdCBlbXB0eSwgdGhlbjpcbiAgICBpZiAoaW5pdEhhc0tleSkge1xuICAgICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgbW9kZSBpcyBcIm5hdmlnYXRlXCIsIHRoZW4gc2V0IGl0IHRvIFwic2FtZS1vcmlnaW5cIi5cbiAgICAgIGlmIChyZXF1ZXN0Lm1vZGUgPT09ICduYXZpZ2F0ZScpIHtcbiAgICAgICAgcmVxdWVzdC5tb2RlID0gJ3NhbWUtb3JpZ2luJ1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBVbnNldCByZXF1ZXN04oCZcyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnLlxuICAgICAgcmVxdWVzdC5yZWxvYWROYXZpZ2F0aW9uID0gZmFsc2VcblxuICAgICAgLy8gMy4gVW5zZXQgcmVxdWVzdOKAmXMgaGlzdG9yeS1uYXZpZ2F0aW9uIGZsYWcuXG4gICAgICByZXF1ZXN0Lmhpc3RvcnlOYXZpZ2F0aW9uID0gZmFsc2VcblxuICAgICAgLy8gNC4gU2V0IHJlcXVlc3TigJlzIG9yaWdpbiB0byBcImNsaWVudFwiLlxuICAgICAgcmVxdWVzdC5vcmlnaW4gPSAnY2xpZW50J1xuXG4gICAgICAvLyA1LiBTZXQgcmVxdWVzdOKAmXMgcmVmZXJyZXIgdG8gXCJjbGllbnRcIlxuICAgICAgcmVxdWVzdC5yZWZlcnJlciA9ICdjbGllbnQnXG5cbiAgICAgIC8vIDYuIFNldCByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgIHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPSAnJ1xuXG4gICAgICAvLyA3LiBTZXQgcmVxdWVzdOKAmXMgVVJMIHRvIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMLlxuICAgICAgcmVxdWVzdC51cmwgPSByZXF1ZXN0LnVybExpc3RbcmVxdWVzdC51cmxMaXN0Lmxlbmd0aCAtIDFdXG5cbiAgICAgIC8vIDguIFNldCByZXF1ZXN04oCZcyBVUkwgbGlzdCB0byDCqyByZXF1ZXN04oCZcyBVUkwgwrsuXG4gICAgICByZXF1ZXN0LnVybExpc3QgPSBbcmVxdWVzdC51cmxdXG4gICAgfVxuXG4gICAgLy8gMTQuIElmIGluaXRbXCJyZWZlcnJlclwiXSBleGlzdHMsIHRoZW46XG4gICAgaWYgKGluaXQucmVmZXJyZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gMS4gTGV0IHJlZmVycmVyIGJlIGluaXRbXCJyZWZlcnJlclwiXS5cbiAgICAgIGNvbnN0IHJlZmVycmVyID0gaW5pdC5yZWZlcnJlclxuXG4gICAgICAvLyAyLiBJZiByZWZlcnJlciBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciB0byBcIm5vLXJlZmVycmVyXCIuXG4gICAgICBpZiAocmVmZXJyZXIgPT09ICcnKSB7XG4gICAgICAgIHJlcXVlc3QucmVmZXJyZXIgPSAnbm8tcmVmZXJyZXInXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAxLiBMZXQgcGFyc2VkUmVmZXJyZXIgYmUgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIHJlZmVycmVyIHdpdGhcbiAgICAgICAgLy8gYmFzZVVSTC5cbiAgICAgICAgLy8gMi4gSWYgcGFyc2VkUmVmZXJyZXIgaXMgZmFpbHVyZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgICAgbGV0IHBhcnNlZFJlZmVycmVyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyc2VkUmVmZXJyZXIgPSBuZXcgVVJMKHJlZmVycmVyLCBiYXNlVXJsKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSZWZlcnJlciBcIiR7cmVmZXJyZXJ9XCIgaXMgbm90IGEgdmFsaWQgVVJMLmAsIHsgY2F1c2U6IGVyciB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZVxuICAgICAgICAvLyAtIHBhcnNlZFJlZmVycmVy4oCZcyBzY2hlbWUgaXMgXCJhYm91dFwiIGFuZCBwYXRoIGlzIHRoZSBzdHJpbmcgXCJjbGllbnRcIlxuICAgICAgICAvLyAtIHBhcnNlZFJlZmVycmVy4oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggb3JpZ2luXG4gICAgICAgIC8vIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHRvIFwiY2xpZW50XCIuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAocGFyc2VkUmVmZXJyZXIucHJvdG9jb2wgPT09ICdhYm91dDonICYmIHBhcnNlZFJlZmVycmVyLmhvc3RuYW1lID09PSAnY2xpZW50JykgfHxcbiAgICAgICAgICAob3JpZ2luICYmICFzYW1lT3JpZ2luKHBhcnNlZFJlZmVycmVyLCB0aGlzW2tSZWFsbV0uc2V0dGluZ3NPYmplY3QuYmFzZVVybCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJlcXVlc3QucmVmZXJyZXIgPSAnY2xpZW50J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIDQuIE90aGVyd2lzZSwgc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHRvIHBhcnNlZFJlZmVycmVyLlxuICAgICAgICAgIHJlcXVlc3QucmVmZXJyZXIgPSBwYXJzZWRSZWZlcnJlclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMTUuIElmIGluaXRbXCJyZWZlcnJlclBvbGljeVwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeVxuICAgIC8vIHRvIGl0LlxuICAgIGlmIChpbml0LnJlZmVycmVyUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPSBpbml0LnJlZmVycmVyUG9saWN5XG4gICAgfVxuXG4gICAgLy8gMTYuIExldCBtb2RlIGJlIGluaXRbXCJtb2RlXCJdIGlmIGl0IGV4aXN0cywgYW5kIGZhbGxiYWNrTW9kZSBvdGhlcndpc2UuXG4gICAgbGV0IG1vZGVcbiAgICBpZiAoaW5pdC5tb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGUgPSBpbml0Lm1vZGVcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kZSA9IGZhbGxiYWNrTW9kZVxuICAgIH1cblxuICAgIC8vIDE3LiBJZiBtb2RlIGlzIFwibmF2aWdhdGVcIiwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAobW9kZSA9PT0gJ25hdmlnYXRlJykge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdSZXF1ZXN0IGNvbnN0cnVjdG9yJyxcbiAgICAgICAgbWVzc2FnZTogJ2ludmFsaWQgcmVxdWVzdCBtb2RlIG5hdmlnYXRlLidcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMTguIElmIG1vZGUgaXMgbm9uLW51bGwsIHNldCByZXF1ZXN04oCZcyBtb2RlIHRvIG1vZGUuXG4gICAgaWYgKG1vZGUgIT0gbnVsbCkge1xuICAgICAgcmVxdWVzdC5tb2RlID0gbW9kZVxuICAgIH1cblxuICAgIC8vIDE5LiBJZiBpbml0W1wiY3JlZGVudGlhbHNcIl0gZXhpc3RzLCB0aGVuIHNldCByZXF1ZXN04oCZcyBjcmVkZW50aWFscyBtb2RlXG4gICAgLy8gdG8gaXQuXG4gICAgaWYgKGluaXQuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdC5jcmVkZW50aWFscyA9IGluaXQuY3JlZGVudGlhbHNcbiAgICB9XG5cbiAgICAvLyAxOC4gSWYgaW5pdFtcImNhY2hlXCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0byBpdC5cbiAgICBpZiAoaW5pdC5jYWNoZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0LmNhY2hlID0gaW5pdC5jYWNoZVxuICAgIH1cblxuICAgIC8vIDIxLiBJZiByZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwib25seS1pZi1jYWNoZWRcIiBhbmQgcmVxdWVzdOKAmXMgbW9kZSBpc1xuICAgIC8vIG5vdCBcInNhbWUtb3JpZ2luXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHJlcXVlc3QuY2FjaGUgPT09ICdvbmx5LWlmLWNhY2hlZCcgJiYgcmVxdWVzdC5tb2RlICE9PSAnc2FtZS1vcmlnaW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIidvbmx5LWlmLWNhY2hlZCcgY2FuIGJlIHNldCBvbmx5IHdpdGggJ3NhbWUtb3JpZ2luJyBtb2RlXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyAyMi4gSWYgaW5pdFtcInJlZGlyZWN0XCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSB0byBpdC5cbiAgICBpZiAoaW5pdC5yZWRpcmVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0LnJlZGlyZWN0ID0gaW5pdC5yZWRpcmVjdFxuICAgIH1cblxuICAgIC8vIDIzLiBJZiBpbml0W1wiaW50ZWdyaXR5XCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgaW50ZWdyaXR5IG1ldGFkYXRhIHRvIGl0LlxuICAgIGlmIChpbml0LmludGVncml0eSAhPSBudWxsKSB7XG4gICAgICByZXF1ZXN0LmludGVncml0eSA9IFN0cmluZyhpbml0LmludGVncml0eSlcbiAgICB9XG5cbiAgICAvLyAyNC4gSWYgaW5pdFtcImtlZXBhbGl2ZVwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGtlZXBhbGl2ZSB0byBpdC5cbiAgICBpZiAoaW5pdC5rZWVwYWxpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdC5rZWVwYWxpdmUgPSBCb29sZWFuKGluaXQua2VlcGFsaXZlKVxuICAgIH1cblxuICAgIC8vIDI1LiBJZiBpbml0W1wibWV0aG9kXCJdIGV4aXN0cywgdGhlbjpcbiAgICBpZiAoaW5pdC5tZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gMS4gTGV0IG1ldGhvZCBiZSBpbml0W1wibWV0aG9kXCJdLlxuICAgICAgbGV0IG1ldGhvZCA9IGluaXQubWV0aG9kXG5cbiAgICAgIC8vIDIuIElmIG1ldGhvZCBpcyBub3QgYSBtZXRob2Qgb3IgbWV0aG9kIGlzIGEgZm9yYmlkZGVuIG1ldGhvZCwgdGhlblxuICAgICAgLy8gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAoIWlzVmFsaWRIVFRQVG9rZW4obWV0aG9kKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAnJHttZXRob2R9JyBpcyBub3QgYSB2YWxpZCBIVFRQIG1ldGhvZC5gKVxuICAgICAgfVxuXG4gICAgICBpZiAoZm9yYmlkZGVuTWV0aG9kc1NldC5oYXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCcke21ldGhvZH0nIEhUVFAgbWV0aG9kIGlzIHVuc3VwcG9ydGVkLmApXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE5vcm1hbGl6ZSBtZXRob2QuXG4gICAgICBtZXRob2QgPSBub3JtYWxpemVNZXRob2RSZWNvcmRbbWV0aG9kXSA/PyBub3JtYWxpemVNZXRob2QobWV0aG9kKVxuXG4gICAgICAvLyA0LiBTZXQgcmVxdWVzdOKAmXMgbWV0aG9kIHRvIG1ldGhvZC5cbiAgICAgIHJlcXVlc3QubWV0aG9kID0gbWV0aG9kXG4gICAgfVxuXG4gICAgLy8gMjYuIElmIGluaXRbXCJzaWduYWxcIl0gZXhpc3RzLCB0aGVuIHNldCBzaWduYWwgdG8gaXQuXG4gICAgaWYgKGluaXQuc2lnbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNpZ25hbCA9IGluaXQuc2lnbmFsXG4gICAgfVxuXG4gICAgLy8gMjcuIFNldCB0aGlz4oCZcyByZXF1ZXN0IHRvIHJlcXVlc3QuXG4gICAgdGhpc1trU3RhdGVdID0gcmVxdWVzdFxuXG4gICAgLy8gMjguIFNldCB0aGlz4oCZcyBzaWduYWwgdG8gYSBuZXcgQWJvcnRTaWduYWwgb2JqZWN0IHdpdGggdGhpc+KAmXMgcmVsZXZhbnRcbiAgICAvLyBSZWFsbS5cbiAgICAvLyBUT0RPOiBjb3VsZCB0aGlzIGJlIHNpbXBsaWZpZWQgd2l0aCBBYm9ydFNpZ25hbC5hbnlcbiAgICAvLyAoaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tYWJvcnRzaWduYWwtYW55KVxuICAgIGNvbnN0IGFjID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgdGhpc1trU2lnbmFsXSA9IGFjLnNpZ25hbFxuICAgIHRoaXNba1NpZ25hbF1ba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuXG4gICAgLy8gMjkuIElmIHNpZ25hbCBpcyBub3QgbnVsbCwgdGhlbiBtYWtlIHRoaXPigJlzIHNpZ25hbCBmb2xsb3cgc2lnbmFsLlxuICAgIGlmIChzaWduYWwgIT0gbnVsbCkge1xuICAgICAgaWYgKFxuICAgICAgICAhc2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBzaWduYWwuYWJvcnRlZCAhPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJGYWlsZWQgdG8gY29uc3RydWN0ICdSZXF1ZXN0JzogbWVtYmVyIHNpZ25hbCBpcyBub3Qgb2YgdHlwZSBBYm9ydFNpZ25hbC5cIlxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICBhYy5hYm9ydChzaWduYWwucmVhc29uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gS2VlcCBhIHN0cm9uZyByZWYgdG8gYWMgd2hpbGUgcmVxdWVzdCBvYmplY3RcbiAgICAgICAgLy8gaXMgYWxpdmUuIFRoaXMgaXMgbmVlZGVkIHRvIHByZXZlbnQgQWJvcnRDb250cm9sbGVyXG4gICAgICAgIC8vIGZyb20gYmVpbmcgcHJlbWF0dXJlbHkgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAgICAgIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzE5MjYuXG4gICAgICAgIHRoaXNba0Fib3J0Q29udHJvbGxlcl0gPSBhY1xuXG4gICAgICAgIGNvbnN0IGFjUmVmID0gbmV3IFdlYWtSZWYoYWMpXG4gICAgICAgIGNvbnN0IGFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IGFjID0gYWNSZWYuZGVyZWYoKVxuICAgICAgICAgIGlmIChhYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhYy5hYm9ydCh0aGlzLnJlYXNvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlyZC1wYXJ0eSBBYm9ydENvbnRyb2xsZXJzIG1heSBub3Qgd29yayB3aXRoIHRoZXNlLlxuICAgICAgICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL3B1bGwvMTkxMCNpc3N1ZWNvbW1lbnQtMTQ2NDQ5NTYxOS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJZiB0aGUgbWF4IGFtb3VudCBvZiBsaXN0ZW5lcnMgaXMgZXF1YWwgdG8gdGhlIGRlZmF1bHQsIGluY3JlYXNlIGl0XG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBub2RlID49IHYxOS45LjBcbiAgICAgICAgICBpZiAodHlwZW9mIGdldE1heExpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJyAmJiBnZXRNYXhMaXN0ZW5lcnMoc2lnbmFsKSA9PT0gZGVmYXVsdE1heExpc3RlbmVycykge1xuICAgICAgICAgICAgc2V0TWF4TGlzdGVuZXJzKDEwMCwgc2lnbmFsKVxuICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0RXZlbnRMaXN0ZW5lcnMoc2lnbmFsLCAnYWJvcnQnKS5sZW5ndGggPj0gZGVmYXVsdE1heExpc3RlbmVycykge1xuICAgICAgICAgICAgc2V0TWF4TGlzdGVuZXJzKDEwMCwgc2lnbmFsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgIHV0aWwuYWRkQWJvcnRMaXN0ZW5lcihzaWduYWwsIGFib3J0KVxuICAgICAgICByZXF1ZXN0RmluYWxpemVyLnJlZ2lzdGVyKGFjLCB7IHNpZ25hbCwgYWJvcnQgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzMC4gU2V0IHRoaXPigJlzIGhlYWRlcnMgdG8gYSBuZXcgSGVhZGVycyBvYmplY3Qgd2l0aCB0aGlz4oCZcyByZWxldmFudFxuICAgIC8vIFJlYWxtLCB3aG9zZSBoZWFkZXIgbGlzdCBpcyByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBhbmQgZ3VhcmQgaXNcbiAgICAvLyBcInJlcXVlc3RcIi5cbiAgICB0aGlzW2tIZWFkZXJzXSA9IG5ldyBIZWFkZXJzKGtDb25zdHJ1Y3QpXG4gICAgdGhpc1trSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IHJlcXVlc3QuaGVhZGVyc0xpc3RcbiAgICB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdID0gJ3JlcXVlc3QnXG4gICAgdGhpc1trSGVhZGVyc11ba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuXG4gICAgLy8gMzEuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJuby1jb3JzXCIsIHRoZW46XG4gICAgaWYgKG1vZGUgPT09ICduby1jb3JzJykge1xuICAgICAgLy8gMS4gSWYgdGhpc+KAmXMgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIG5vdCBhIENPUlMtc2FmZWxpc3RlZCBtZXRob2QsXG4gICAgICAvLyB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgaWYgKCFjb3JzU2FmZUxpc3RlZE1ldGhvZHNTZXQuaGFzKHJlcXVlc3QubWV0aG9kKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGAnJHtyZXF1ZXN0Lm1ldGhvZH0gaXMgdW5zdXBwb3J0ZWQgaW4gbm8tY29ycyBtb2RlLmBcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBTZXQgdGhpc+KAmXMgaGVhZGVyc+KAmXMgZ3VhcmQgdG8gXCJyZXF1ZXN0LW5vLWNvcnNcIi5cbiAgICAgIHRoaXNba0hlYWRlcnNdW2tHdWFyZF0gPSAncmVxdWVzdC1uby1jb3JzJ1xuICAgIH1cblxuICAgIC8vIDMyLiBJZiBpbml0IGlzIG5vdCBlbXB0eSwgdGhlbjpcbiAgICBpZiAoaW5pdEhhc0tleSkge1xuICAgICAgLyoqIEB0eXBlIHtIZWFkZXJzTGlzdH0gKi9cbiAgICAgIGNvbnN0IGhlYWRlcnNMaXN0ID0gdGhpc1trSGVhZGVyc11ba0hlYWRlcnNMaXN0XVxuICAgICAgLy8gMS4gTGV0IGhlYWRlcnMgYmUgYSBjb3B5IG9mIHRoaXPigJlzIGhlYWRlcnMgYW5kIGl0cyBhc3NvY2lhdGVkIGhlYWRlclxuICAgICAgLy8gbGlzdC5cbiAgICAgIC8vIDIuIElmIGluaXRbXCJoZWFkZXJzXCJdIGV4aXN0cywgdGhlbiBzZXQgaGVhZGVycyB0byBpbml0W1wiaGVhZGVyc1wiXS5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBpbml0LmhlYWRlcnMgIT09IHVuZGVmaW5lZCA/IGluaXQuaGVhZGVycyA6IG5ldyBIZWFkZXJzTGlzdChoZWFkZXJzTGlzdClcblxuICAgICAgLy8gMy4gRW1wdHkgdGhpc+KAmXMgaGVhZGVyc+KAmXMgaGVhZGVyIGxpc3QuXG4gICAgICBoZWFkZXJzTGlzdC5jbGVhcigpXG5cbiAgICAgIC8vIDQuIElmIGhlYWRlcnMgaXMgYSBIZWFkZXJzIG9iamVjdCwgdGhlbiBmb3IgZWFjaCBoZWFkZXIgaW4gaXRzIGhlYWRlclxuICAgICAgLy8gbGlzdCwgYXBwZW5kIGhlYWRlcuKAmXMgbmFtZS9oZWFkZXLigJlzIHZhbHVlIHRvIHRoaXPigJlzIGhlYWRlcnMuXG4gICAgICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnNMaXN0KSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBoZWFkZXJzKSB7XG4gICAgICAgICAgaGVhZGVyc0xpc3QuYXBwZW5kKGtleSwgdmFsKVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IENvcHkgdGhlIGBzZXQtY29va2llYCBtZXRhLWRhdGEuXG4gICAgICAgIGhlYWRlcnNMaXN0LmNvb2tpZXMgPSBoZWFkZXJzLmNvb2tpZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIDUuIE90aGVyd2lzZSwgZmlsbCB0aGlz4oCZcyBoZWFkZXJzIHdpdGggaGVhZGVycy5cbiAgICAgICAgZmlsbEhlYWRlcnModGhpc1trSGVhZGVyc10sIGhlYWRlcnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMzMuIExldCBpbnB1dEJvZHkgYmUgaW5wdXTigJlzIHJlcXVlc3TigJlzIGJvZHkgaWYgaW5wdXQgaXMgYSBSZXF1ZXN0XG4gICAgLy8gb2JqZWN0OyBvdGhlcndpc2UgbnVsbC5cbiAgICBjb25zdCBpbnB1dEJvZHkgPSBpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QgPyBpbnB1dFtrU3RhdGVdLmJvZHkgOiBudWxsXG5cbiAgICAvLyAzNC4gSWYgZWl0aGVyIGluaXRbXCJib2R5XCJdIGV4aXN0cyBhbmQgaXMgbm9uLW51bGwgb3IgaW5wdXRCb2R5IGlzXG4gICAgLy8gbm9uLW51bGwsIGFuZCByZXF1ZXN04oCZcyBtZXRob2QgaXMgYEdFVGAgb3IgYEhFQURgLCB0aGVuIHRocm93IGFcbiAgICAvLyBUeXBlRXJyb3IuXG4gICAgaWYgKFxuICAgICAgKGluaXQuYm9keSAhPSBudWxsIHx8IGlucHV0Qm9keSAhPSBudWxsKSAmJlxuICAgICAgKHJlcXVlc3QubWV0aG9kID09PSAnR0VUJyB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0hFQUQnKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWVzdCB3aXRoIEdFVC9IRUFEIG1ldGhvZCBjYW5ub3QgaGF2ZSBib2R5LicpXG4gICAgfVxuXG4gICAgLy8gMzUuIExldCBpbml0Qm9keSBiZSBudWxsLlxuICAgIGxldCBpbml0Qm9keSA9IG51bGxcblxuICAgIC8vIDM2LiBJZiBpbml0W1wiYm9keVwiXSBleGlzdHMgYW5kIGlzIG5vbi1udWxsLCB0aGVuOlxuICAgIGlmIChpbml0LmJvZHkgIT0gbnVsbCkge1xuICAgICAgLy8gMS4gTGV0IENvbnRlbnQtVHlwZSBiZSBudWxsLlxuICAgICAgLy8gMi4gU2V0IGluaXRCb2R5IGFuZCBDb250ZW50LVR5cGUgdG8gdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nXG4gICAgICAvLyBpbml0W1wiYm9keVwiXSwgd2l0aCBrZWVwYWxpdmUgc2V0IHRvIHJlcXVlc3TigJlzIGtlZXBhbGl2ZS5cbiAgICAgIGNvbnN0IFtleHRyYWN0ZWRCb2R5LCBjb250ZW50VHlwZV0gPSBleHRyYWN0Qm9keShcbiAgICAgICAgaW5pdC5ib2R5LFxuICAgICAgICByZXF1ZXN0LmtlZXBhbGl2ZVxuICAgICAgKVxuICAgICAgaW5pdEJvZHkgPSBleHRyYWN0ZWRCb2R5XG5cbiAgICAgIC8vIDMsIElmIENvbnRlbnQtVHlwZSBpcyBub24tbnVsbCBhbmQgdGhpc+KAmXMgaGVhZGVyc+KAmXMgaGVhZGVyIGxpc3QgZG9lc1xuICAgICAgLy8gbm90IGNvbnRhaW4gYENvbnRlbnQtVHlwZWAsIHRoZW4gYXBwZW5kIGBDb250ZW50LVR5cGVgL0NvbnRlbnQtVHlwZSB0b1xuICAgICAgLy8gdGhpc+KAmXMgaGVhZGVycy5cbiAgICAgIGlmIChjb250ZW50VHlwZSAmJiAhdGhpc1trSGVhZGVyc11ba0hlYWRlcnNMaXN0XS5jb250YWlucygnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgdGhpc1trSGVhZGVyc10uYXBwZW5kKCdjb250ZW50LXR5cGUnLCBjb250ZW50VHlwZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzNy4gTGV0IGlucHV0T3JJbml0Qm9keSBiZSBpbml0Qm9keSBpZiBpdCBpcyBub24tbnVsbDsgb3RoZXJ3aXNlXG4gICAgLy8gaW5wdXRCb2R5LlxuICAgIGNvbnN0IGlucHV0T3JJbml0Qm9keSA9IGluaXRCb2R5ID8/IGlucHV0Qm9keVxuXG4gICAgLy8gMzguIElmIGlucHV0T3JJbml0Qm9keSBpcyBub24tbnVsbCBhbmQgaW5wdXRPckluaXRCb2R54oCZcyBzb3VyY2UgaXNcbiAgICAvLyBudWxsLCB0aGVuOlxuICAgIGlmIChpbnB1dE9ySW5pdEJvZHkgIT0gbnVsbCAmJiBpbnB1dE9ySW5pdEJvZHkuc291cmNlID09IG51bGwpIHtcbiAgICAgIC8vIDEuIElmIGluaXRCb2R5IGlzIG5vbi1udWxsIGFuZCBpbml0W1wiZHVwbGV4XCJdIGRvZXMgbm90IGV4aXN0LFxuICAgICAgLy8gICAgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChpbml0Qm9keSAhPSBudWxsICYmIGluaXQuZHVwbGV4ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWVzdEluaXQ6IGR1cGxleCBvcHRpb24gaXMgcmVxdWlyZWQgd2hlbiBzZW5kaW5nIGEgYm9keS4nKVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiB0aGlz4oCZcyByZXF1ZXN04oCZcyBtb2RlIGlzIG5laXRoZXIgXCJzYW1lLW9yaWdpblwiIG5vciBcImNvcnNcIixcbiAgICAgIC8vIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAocmVxdWVzdC5tb2RlICE9PSAnc2FtZS1vcmlnaW4nICYmIHJlcXVlc3QubW9kZSAhPT0gJ2NvcnMnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ0lmIHJlcXVlc3QgaXMgbWFkZSBmcm9tIFJlYWRhYmxlU3RyZWFtLCBtb2RlIHNob3VsZCBiZSBcInNhbWUtb3JpZ2luXCIgb3IgXCJjb3JzXCInXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gMy4gU2V0IHRoaXPigJlzIHJlcXVlc3TigJlzIHVzZS1DT1JTLXByZWZsaWdodCBmbGFnLlxuICAgICAgcmVxdWVzdC51c2VDT1JTUHJlZmxpZ2h0RmxhZyA9IHRydWVcbiAgICB9XG5cbiAgICAvLyAzOS4gTGV0IGZpbmFsQm9keSBiZSBpbnB1dE9ySW5pdEJvZHkuXG4gICAgbGV0IGZpbmFsQm9keSA9IGlucHV0T3JJbml0Qm9keVxuXG4gICAgLy8gNDAuIElmIGluaXRCb2R5IGlzIG51bGwgYW5kIGlucHV0Qm9keSBpcyBub24tbnVsbCwgdGhlbjpcbiAgICBpZiAoaW5pdEJvZHkgPT0gbnVsbCAmJiBpbnB1dEJvZHkgIT0gbnVsbCkge1xuICAgICAgLy8gMS4gSWYgaW5wdXQgaXMgdW51c2FibGUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAodXRpbC5pc0Rpc3R1cmJlZChpbnB1dEJvZHkuc3RyZWFtKSB8fCBpbnB1dEJvZHkuc3RyZWFtLmxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdDYW5ub3QgY29uc3RydWN0IGEgUmVxdWVzdCB3aXRoIGEgUmVxdWVzdCBvYmplY3QgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuJ1xuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFNldCBmaW5hbEJvZHkgdG8gdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIHByb3h5IGZvciBpbnB1dEJvZHkuXG4gICAgICBpZiAoIVRyYW5zZm9ybVN0cmVhbSkge1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0vd2ViJykuVHJhbnNmb3JtU3RyZWFtXG4gICAgICB9XG5cbiAgICAgIC8vIGh0dHBzOi8vc3RyZWFtcy5zcGVjLndoYXR3Zy5vcmcvI3JlYWRhYmxlc3RyZWFtLWNyZWF0ZS1hLXByb3h5XG4gICAgICBjb25zdCBpZGVudGl0eVRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oKVxuICAgICAgaW5wdXRCb2R5LnN0cmVhbS5waXBlVGhyb3VnaChpZGVudGl0eVRyYW5zZm9ybSlcbiAgICAgIGZpbmFsQm9keSA9IHtcbiAgICAgICAgc291cmNlOiBpbnB1dEJvZHkuc291cmNlLFxuICAgICAgICBsZW5ndGg6IGlucHV0Qm9keS5sZW5ndGgsXG4gICAgICAgIHN0cmVhbTogaWRlbnRpdHlUcmFuc2Zvcm0ucmVhZGFibGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0MS4gU2V0IHRoaXPigJlzIHJlcXVlc3TigJlzIGJvZHkgdG8gZmluYWxCb2R5LlxuICAgIHRoaXNba1N0YXRlXS5ib2R5ID0gZmluYWxCb2R5XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlcXVlc3TigJlzIEhUVFAgbWV0aG9kLCB3aGljaCBpcyBcIkdFVFwiIGJ5IGRlZmF1bHQuXG4gIGdldCBtZXRob2QgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgbWV0aG9kIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIG1ldGhvZC5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLm1ldGhvZFxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgVVJMIG9mIHJlcXVlc3QgYXMgYSBzdHJpbmcuXG4gIGdldCB1cmwgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgdXJsIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIFVSTCwgc2VyaWFsaXplZC5cbiAgICByZXR1cm4gVVJMU2VyaWFsaXplcih0aGlzW2tTdGF0ZV0udXJsKVxuICB9XG5cbiAgLy8gUmV0dXJucyBhIEhlYWRlcnMgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QuXG4gIC8vIE5vdGUgdGhhdCBoZWFkZXJzIGFkZGVkIGluIHRoZSBuZXR3b3JrIGxheWVyIGJ5IHRoZSB1c2VyIGFnZW50IHdpbGwgbm90XG4gIC8vIGJlIGFjY291bnRlZCBmb3IgaW4gdGhpcyBvYmplY3QsIGUuZy4sIHRoZSBcIkhvc3RcIiBoZWFkZXIuXG4gIGdldCBoZWFkZXJzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGhlYWRlcnMgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgaGVhZGVycy5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc11cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGtpbmQgb2YgcmVzb3VyY2UgcmVxdWVzdGVkIGJ5IHJlcXVlc3QsIGUuZy4sIFwiZG9jdW1lbnRcIlxuICAvLyBvciBcInNjcmlwdFwiLlxuICBnZXQgZGVzdGluYXRpb24gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgZGVzdGluYXRpb24gZ2V0dGVyIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgZGVzdGluYXRpb24uXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5kZXN0aW5hdGlvblxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVmZXJyZXIgb2YgcmVxdWVzdC4gSXRzIHZhbHVlIGNhbiBiZSBhIHNhbWUtb3JpZ2luIFVSTCBpZlxuICAvLyBleHBsaWNpdGx5IHNldCBpbiBpbml0LCB0aGUgZW1wdHkgc3RyaW5nIHRvIGluZGljYXRlIG5vIHJlZmVycmVyLCBhbmRcbiAgLy8gXCJhYm91dDpjbGllbnRcIiB3aGVuIGRlZmF1bHRpbmcgdG8gdGhlIGdsb2JhbOKAmXMgZGVmYXVsdC4gVGhpcyBpcyB1c2VkXG4gIC8vIGR1cmluZyBmZXRjaGluZyB0byBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZSBgUmVmZXJlcmAgaGVhZGVyIG9mIHRoZVxuICAvLyByZXF1ZXN0IGJlaW5nIG1hZGUuXG4gIGdldCByZWZlcnJlciAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIDEuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyIGlzIFwibm8tcmVmZXJyZXJcIiwgdGhlbiByZXR1cm4gdGhlXG4gICAgLy8gZW1wdHkgc3RyaW5nLlxuICAgIGlmICh0aGlzW2tTdGF0ZV0ucmVmZXJyZXIgPT09ICduby1yZWZlcnJlcicpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIC8vIDIuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyIGlzIFwiY2xpZW50XCIsIHRoZW4gcmV0dXJuXG4gICAgLy8gXCJhYm91dDpjbGllbnRcIi5cbiAgICBpZiAodGhpc1trU3RhdGVdLnJlZmVycmVyID09PSAnY2xpZW50Jykge1xuICAgICAgcmV0dXJuICdhYm91dDpjbGllbnQnXG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyLCBzZXJpYWxpemVkLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ucmVmZXJyZXIudG9TdHJpbmcoKVxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVmZXJyZXIgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LlxuICAvLyBUaGlzIGlzIHVzZWQgZHVyaW5nIGZldGNoaW5nIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN04oCZc1xuICAvLyByZWZlcnJlci5cbiAgZ2V0IHJlZmVycmVyUG9saWN5ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIHJlZmVycmVyUG9saWN5IGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnJlZmVycmVyUG9saWN5XG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBtb2RlIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LCB3aGljaCBpcyBhIHN0cmluZyBpbmRpY2F0aW5nXG4gIC8vIHdoZXRoZXIgdGhlIHJlcXVlc3Qgd2lsbCB1c2UgQ09SUywgb3Igd2lsbCBiZSByZXN0cmljdGVkIHRvIHNhbWUtb3JpZ2luXG4gIC8vIFVSTHMuXG4gIGdldCBtb2RlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIG1vZGUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgbW9kZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLm1vZGVcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGNyZWRlbnRpYWxzIG1vZGUgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QsXG4gIC8vIHdoaWNoIGlzIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciBjcmVkZW50aWFscyB3aWxsIGJlIHNlbnQgd2l0aCB0aGVcbiAgLy8gcmVxdWVzdCBhbHdheXMsIG5ldmVyLCBvciBvbmx5IHdoZW4gc2VudCB0byBhIHNhbWUtb3JpZ2luIFVSTC5cbiAgZ2V0IGNyZWRlbnRpYWxzICgpIHtcbiAgICAvLyBUaGUgY3JlZGVudGlhbHMgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmNyZWRlbnRpYWxzXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBjYWNoZSBtb2RlIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LFxuICAvLyB3aGljaCBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIGhvdyB0aGUgcmVxdWVzdCB3aWxsXG4gIC8vIGludGVyYWN0IHdpdGggdGhlIGJyb3dzZXLigJlzIGNhY2hlIHdoZW4gZmV0Y2hpbmcuXG4gIGdldCBjYWNoZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBjYWNoZSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBjYWNoZSBtb2RlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uY2FjaGVcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHJlZGlyZWN0IG1vZGUgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QsXG4gIC8vIHdoaWNoIGlzIGEgc3RyaW5nIGluZGljYXRpbmcgaG93IHJlZGlyZWN0cyBmb3IgdGhlXG4gIC8vIHJlcXVlc3Qgd2lsbCBiZSBoYW5kbGVkIGR1cmluZyBmZXRjaGluZy4gQSByZXF1ZXN0XG4gIC8vIHdpbGwgZm9sbG93IHJlZGlyZWN0cyBieSBkZWZhdWx0LlxuICBnZXQgcmVkaXJlY3QgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgcmVkaXJlY3QgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnJlZGlyZWN0XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlcXVlc3TigJlzIHN1YnJlc291cmNlIGludGVncml0eSBtZXRhZGF0YSwgd2hpY2ggaXMgYVxuICAvLyBjcnlwdG9ncmFwaGljIGhhc2ggb2YgdGhlIHJlc291cmNlIGJlaW5nIGZldGNoZWQuIEl0cyB2YWx1ZVxuICAvLyBjb25zaXN0cyBvZiBtdWx0aXBsZSBoYXNoZXMgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuIFtTUkldXG4gIGdldCBpbnRlZ3JpdHkgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgaW50ZWdyaXR5IGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIGludGVncml0eVxuICAgIC8vIG1ldGFkYXRhLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uaW50ZWdyaXR5XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHJlcXVlc3QgY2FuIG91dGxpdmUgdGhlXG4gIC8vIGdsb2JhbCBpbiB3aGljaCBpdCB3YXMgY3JlYXRlZC5cbiAgZ2V0IGtlZXBhbGl2ZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBrZWVwYWxpdmUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMga2VlcGFsaXZlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ua2VlcGFsaXZlXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHJlcXVlc3QgaXMgZm9yIGEgcmVsb2FkXG4gIC8vIG5hdmlnYXRpb24uXG4gIGdldCBpc1JlbG9hZE5hdmlnYXRpb24gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgaXNSZWxvYWROYXZpZ2F0aW9uIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXNcbiAgICAvLyByZXF1ZXN04oCZcyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnIGlzIHNldDsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ucmVsb2FkTmF2aWdhdGlvblxuICB9XG5cbiAgLy8gUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCByZXF1ZXN0IGlzIGZvciBhIGhpc3RvcnlcbiAgLy8gbmF2aWdhdGlvbiAoYS5rLmEuIGJhY2stZm93YXJkIG5hdmlnYXRpb24pLlxuICBnZXQgaXNIaXN0b3J5TmF2aWdhdGlvbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBpc0hpc3RvcnlOYXZpZ2F0aW9uIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXMgcmVxdWVzdOKAmXNcbiAgICAvLyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZyBpcyBzZXQ7IG90aGVyd2lzZSBmYWxzZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmhpc3RvcnlOYXZpZ2F0aW9uXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBzaWduYWwgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QsIHdoaWNoIGlzIGFuIEFib3J0U2lnbmFsXG4gIC8vIG9iamVjdCBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZCwgYW5kIGl0c1xuICAvLyBhYm9ydCBldmVudCBoYW5kbGVyLlxuICBnZXQgc2lnbmFsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIHNpZ25hbCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyBzaWduYWwuXG4gICAgcmV0dXJuIHRoaXNba1NpZ25hbF1cbiAgfVxuXG4gIGdldCBib2R5ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ib2R5ID8gdGhpc1trU3RhdGVdLmJvZHkuc3RyZWFtIDogbnVsbFxuICB9XG5cbiAgZ2V0IGJvZHlVc2VkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgcmV0dXJuICEhdGhpc1trU3RhdGVdLmJvZHkgJiYgdXRpbC5pc0Rpc3R1cmJlZCh0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0pXG4gIH1cblxuICBnZXQgZHVwbGV4ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgcmV0dXJuICdoYWxmJ1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHJlcXVlc3QuXG4gIGNsb25lICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gMS4gSWYgdGhpcyBpcyB1bnVzYWJsZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAodGhpcy5ib2R5VXNlZCB8fCB0aGlzLmJvZHk/LmxvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW51c2FibGUnKVxuICAgIH1cblxuICAgIC8vIDIuIExldCBjbG9uZWRSZXF1ZXN0IGJlIHRoZSByZXN1bHQgb2YgY2xvbmluZyB0aGlz4oCZcyByZXF1ZXN0LlxuICAgIGNvbnN0IGNsb25lZFJlcXVlc3QgPSBjbG9uZVJlcXVlc3QodGhpc1trU3RhdGVdKVxuXG4gICAgLy8gMy4gTGV0IGNsb25lZFJlcXVlc3RPYmplY3QgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIFJlcXVlc3Qgb2JqZWN0LFxuICAgIC8vIGdpdmVuIGNsb25lZFJlcXVlc3QsIHRoaXPigJlzIGhlYWRlcnPigJlzIGd1YXJkLCBhbmQgdGhpc+KAmXMgcmVsZXZhbnQgUmVhbG0uXG4gICAgY29uc3QgY2xvbmVkUmVxdWVzdE9iamVjdCA9IG5ldyBSZXF1ZXN0KGtDb25zdHJ1Y3QpXG4gICAgY2xvbmVkUmVxdWVzdE9iamVjdFtrU3RhdGVdID0gY2xvbmVkUmVxdWVzdFxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba0hlYWRlcnNdID0gbmV3IEhlYWRlcnMoa0NvbnN0cnVjdClcbiAgICBjbG9uZWRSZXF1ZXN0T2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gY2xvbmVkUmVxdWVzdC5oZWFkZXJzTGlzdFxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdXG4gICAgY2xvbmVkUmVxdWVzdE9iamVjdFtrSGVhZGVyc11ba1JlYWxtXSA9IHRoaXNba0hlYWRlcnNdW2tSZWFsbV1cblxuICAgIC8vIDQuIE1ha2UgY2xvbmVkUmVxdWVzdE9iamVjdOKAmXMgc2lnbmFsIGZvbGxvdyB0aGlz4oCZcyBzaWduYWwuXG4gICAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBpZiAodGhpcy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgYWMuYWJvcnQodGhpcy5zaWduYWwucmVhc29uKVxuICAgIH0gZWxzZSB7XG4gICAgICB1dGlsLmFkZEFib3J0TGlzdGVuZXIoXG4gICAgICAgIHRoaXMuc2lnbmFsLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYWMuYWJvcnQodGhpcy5zaWduYWwucmVhc29uKVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba1NpZ25hbF0gPSBhYy5zaWduYWxcblxuICAgIC8vIDQuIFJldHVybiBjbG9uZWRSZXF1ZXN0T2JqZWN0LlxuICAgIHJldHVybiBjbG9uZWRSZXF1ZXN0T2JqZWN0XG4gIH1cbn1cblxubWl4aW5Cb2R5KFJlcXVlc3QpXG5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0IChpbml0KSB7XG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0c1xuICBjb25zdCByZXF1ZXN0ID0ge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgbG9jYWxVUkxzT25seTogZmFsc2UsXG4gICAgdW5zYWZlUmVxdWVzdDogZmFsc2UsXG4gICAgYm9keTogbnVsbCxcbiAgICBjbGllbnQ6IG51bGwsXG4gICAgcmVzZXJ2ZWRDbGllbnQ6IG51bGwsXG4gICAgcmVwbGFjZXNDbGllbnRJZDogJycsXG4gICAgd2luZG93OiAnY2xpZW50JyxcbiAgICBrZWVwYWxpdmU6IGZhbHNlLFxuICAgIHNlcnZpY2VXb3JrZXJzOiAnYWxsJyxcbiAgICBpbml0aWF0b3I6ICcnLFxuICAgIGRlc3RpbmF0aW9uOiAnJyxcbiAgICBwcmlvcml0eTogbnVsbCxcbiAgICBvcmlnaW46ICdjbGllbnQnLFxuICAgIHBvbGljeUNvbnRhaW5lcjogJ2NsaWVudCcsXG4gICAgcmVmZXJyZXI6ICdjbGllbnQnLFxuICAgIHJlZmVycmVyUG9saWN5OiAnJyxcbiAgICBtb2RlOiAnbm8tY29ycycsXG4gICAgdXNlQ09SU1ByZWZsaWdodEZsYWc6IGZhbHNlLFxuICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgIHVzZUNyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICBjYWNoZTogJ2RlZmF1bHQnLFxuICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICBpbnRlZ3JpdHk6ICcnLFxuICAgIGNyeXB0b0dyYXBoaWNzTm9uY2VNZXRhZGF0YTogJycsXG4gICAgcGFyc2VyTWV0YWRhdGE6ICcnLFxuICAgIHJlbG9hZE5hdmlnYXRpb246IGZhbHNlLFxuICAgIGhpc3RvcnlOYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICB1c2VyQWN0aXZhdGlvbjogZmFsc2UsXG4gICAgdGFpbnRlZE9yaWdpbjogZmFsc2UsXG4gICAgcmVkaXJlY3RDb3VudDogMCxcbiAgICByZXNwb25zZVRhaW50aW5nOiAnYmFzaWMnLFxuICAgIHByZXZlbnROb0NhY2hlQ2FjaGVDb250cm9sSGVhZGVyTW9kaWZpY2F0aW9uOiBmYWxzZSxcbiAgICBkb25lOiBmYWxzZSxcbiAgICB0aW1pbmdBbGxvd0ZhaWxlZDogZmFsc2UsXG4gICAgLi4uaW5pdCxcbiAgICBoZWFkZXJzTGlzdDogaW5pdC5oZWFkZXJzTGlzdFxuICAgICAgPyBuZXcgSGVhZGVyc0xpc3QoaW5pdC5oZWFkZXJzTGlzdClcbiAgICAgIDogbmV3IEhlYWRlcnNMaXN0KClcbiAgfVxuICByZXF1ZXN0LnVybCA9IHJlcXVlc3QudXJsTGlzdFswXVxuICByZXR1cm4gcmVxdWVzdFxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1yZXF1ZXN0LWNsb25lXG5mdW5jdGlvbiBjbG9uZVJlcXVlc3QgKHJlcXVlc3QpIHtcbiAgLy8gVG8gY2xvbmUgYSByZXF1ZXN0IHJlcXVlc3QsIHJ1biB0aGVzZSBzdGVwczpcblxuICAvLyAxLiBMZXQgbmV3UmVxdWVzdCBiZSBhIGNvcHkgb2YgcmVxdWVzdCwgZXhjZXB0IGZvciBpdHMgYm9keS5cbiAgY29uc3QgbmV3UmVxdWVzdCA9IG1ha2VSZXF1ZXN0KHsgLi4ucmVxdWVzdCwgYm9keTogbnVsbCB9KVxuXG4gIC8vIDIuIElmIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsIHNldCBuZXdSZXF1ZXN04oCZcyBib2R5IHRvIHRoZVxuICAvLyByZXN1bHQgb2YgY2xvbmluZyByZXF1ZXN04oCZcyBib2R5LlxuICBpZiAocmVxdWVzdC5ib2R5ICE9IG51bGwpIHtcbiAgICBuZXdSZXF1ZXN0LmJvZHkgPSBjbG9uZUJvZHkocmVxdWVzdC5ib2R5KVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIG5ld1JlcXVlc3QuXG4gIHJldHVybiBuZXdSZXF1ZXN0XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlcXVlc3QucHJvdG90eXBlLCB7XG4gIG1ldGhvZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgdXJsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBoZWFkZXJzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWRpcmVjdDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY2xvbmU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHNpZ25hbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZHVwbGV4OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZXN0aW5hdGlvbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYm9keToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYm9keVVzZWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGlzSGlzdG9yeU5hdmlnYXRpb246IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGlzUmVsb2FkTmF2aWdhdGlvbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAga2VlcGFsaXZlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBpbnRlZ3JpdHk6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGNhY2hlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjcmVkZW50aWFsczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYXR0cmlidXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWZlcnJlclBvbGljeToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVmZXJyZXI6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG1vZGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdSZXF1ZXN0JyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfVxufSlcblxud2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdCA9IHdlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIoXG4gIFJlcXVlc3RcbilcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3RpbmZvXG53ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh0eXBlb2YgViA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKFYpXG4gIH1cblxuICBpZiAoViBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdChWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhWKVxufVxuXG53ZWJpZGwuY29udmVydGVycy5BYm9ydFNpZ25hbCA9IHdlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIoXG4gIEFib3J0U2lnbmFsXG4pXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0aW5pdFxud2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdtZXRob2QnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZ1xuICB9LFxuICB7XG4gICAga2V5OiAnaGVhZGVycycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5IZWFkZXJzSW5pdFxuICB9LFxuICB7XG4gICAga2V5OiAnYm9keScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIoXG4gICAgICB3ZWJpZGwuY29udmVydGVycy5Cb2R5SW5pdFxuICAgIClcbiAgfSxcbiAge1xuICAgIGtleTogJ3JlZmVycmVyJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZ1xuICB9LFxuICB7XG4gICAga2V5OiAncmVmZXJyZXJQb2xpY3knLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtcmVmZXJyZXItcG9saWN5LyNyZWZlcnJlci1wb2xpY3lcbiAgICBhbGxvd2VkVmFsdWVzOiByZWZlcnJlclBvbGljeVxuICB9LFxuICB7XG4gICAga2V5OiAnbW9kZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtcmVxdWVzdC1tb2RlXG4gICAgYWxsb3dlZFZhbHVlczogcmVxdWVzdE1vZGVcbiAgfSxcbiAge1xuICAgIGtleTogJ2NyZWRlbnRpYWxzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdGNyZWRlbnRpYWxzXG4gICAgYWxsb3dlZFZhbHVlczogcmVxdWVzdENyZWRlbnRpYWxzXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjYWNoZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3RjYWNoZVxuICAgIGFsbG93ZWRWYWx1ZXM6IHJlcXVlc3RDYWNoZVxuICB9LFxuICB7XG4gICAga2V5OiAncmVkaXJlY3QnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0cmVkaXJlY3RcbiAgICBhbGxvd2VkVmFsdWVzOiByZXF1ZXN0UmVkaXJlY3RcbiAgfSxcbiAge1xuICAgIGtleTogJ2ludGVncml0eScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmdcbiAgfSxcbiAge1xuICAgIGtleTogJ2tlZXBhbGl2ZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzaWduYWwnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKFxuICAgICAgKHNpZ25hbCkgPT4gd2ViaWRsLmNvbnZlcnRlcnMuQWJvcnRTaWduYWwoXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICAgeyBzdHJpY3Q6IGZhbHNlIH1cbiAgICAgIClcbiAgICApXG4gIH0sXG4gIHtcbiAgICBrZXk6ICd3aW5kb3cnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYW55XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkdXBsZXgnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIGFsbG93ZWRWYWx1ZXM6IHJlcXVlc3REdXBsZXhcbiAgfVxuXSlcblxubW9kdWxlLmV4cG9ydHMgPSB7IFJlcXVlc3QsIG1ha2VSZXF1ZXN0IH1cbiIsCiAgICAiLy8gaHR0cHM6Ly9naXRodWIuY29tL0V0aGFuLUFycm93b29kL3VuZGljaS1mZXRjaFxuXG4ndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBSZXNwb25zZSxcbiAgbWFrZU5ldHdvcmtFcnJvcixcbiAgbWFrZUFwcHJvcHJpYXRlTmV0d29ya0Vycm9yLFxuICBmaWx0ZXJSZXNwb25zZSxcbiAgbWFrZVJlc3BvbnNlXG59ID0gcmVxdWlyZSgnLi9yZXNwb25zZScpXG5jb25zdCB7IEhlYWRlcnMgfSA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5jb25zdCB7IFJlcXVlc3QsIG1ha2VSZXF1ZXN0IH0gPSByZXF1aXJlKCcuL3JlcXVlc3QnKVxuY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKVxuY29uc3Qge1xuICBieXRlc01hdGNoLFxuICBtYWtlUG9saWN5Q29udGFpbmVyLFxuICBjbG9uZVBvbGljeUNvbnRhaW5lcixcbiAgcmVxdWVzdEJhZFBvcnQsXG4gIFRBT0NoZWNrLFxuICBhcHBlbmRSZXF1ZXN0T3JpZ2luSGVhZGVyLFxuICByZXNwb25zZUxvY2F0aW9uVVJMLFxuICByZXF1ZXN0Q3VycmVudFVSTCxcbiAgc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdCxcbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMLFxuICBjcmVhdGVPcGFxdWVUaW1pbmdJbmZvLFxuICBhcHBlbmRGZXRjaE1ldGFkYXRhLFxuICBjb3JzQ2hlY2ssXG4gIGNyb3NzT3JpZ2luUmVzb3VyY2VQb2xpY3lDaGVjayxcbiAgZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcixcbiAgY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgaXNCbG9iTGlrZSxcbiAgc2FtZU9yaWdpbixcbiAgaXNDYW5jZWxsZWQsXG4gIGlzQWJvcnRlZCxcbiAgaXNFcnJvckxpa2UsXG4gIGZ1bGx5UmVhZEJvZHksXG4gIHJlYWRhYmxlU3RyZWFtQ2xvc2UsXG4gIGlzb21vcnBoaWNFbmNvZGUsXG4gIHVybElzTG9jYWwsXG4gIHVybElzSHR0cEh0dHBzU2NoZW1lLFxuICB1cmxIYXNIdHRwc1NjaGVtZVxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGtTdGF0ZSwga0hlYWRlcnMsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgc2FmZWx5RXh0cmFjdEJvZHkgfSA9IHJlcXVpcmUoJy4vYm9keScpXG5jb25zdCB7XG4gIHJlZGlyZWN0U3RhdHVzU2V0LFxuICBudWxsQm9keVN0YXR1cyxcbiAgc2FmZU1ldGhvZHNTZXQsXG4gIHJlcXVlc3RCb2R5SGVhZGVyLFxuICBzdWJyZXNvdXJjZVNldCxcbiAgRE9NRXhjZXB0aW9uXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrSGVhZGVyc0xpc3QgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpXG5jb25zdCB7IFJlYWRhYmxlLCBwaXBlbGluZSB9ID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IHsgYWRkQWJvcnRMaXN0ZW5lciwgaXNFcnJvcmVkLCBpc1JlYWRhYmxlLCBub2RlTWFqb3IsIG5vZGVNaW5vciB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZGF0YVVSTFByb2Nlc3Nvciwgc2VyaWFsaXplQU1pbWVUeXBlIH0gPSByZXF1aXJlKCcuL2RhdGFVUkwnKVxuY29uc3QgeyBUcmFuc2Zvcm1TdHJlYW0gfSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKVxuY29uc3QgeyBnZXRHbG9iYWxEaXNwYXRjaGVyIH0gPSByZXF1aXJlKCcuLi9nbG9iYWwnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgU1RBVFVTX0NPREVTIH0gPSByZXF1aXJlKCdodHRwJylcbmNvbnN0IEdFVF9PUl9IRUFEID0gWydHRVQnLCAnSEVBRCddXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdidWZmZXInKS5yZXNvbHZlT2JqZWN0VVJMfSAqL1xubGV0IHJlc29sdmVPYmplY3RVUkxcbmxldCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW1cblxuY2xhc3MgRmV0Y2ggZXh0ZW5kcyBFRSB7XG4gIGNvbnN0cnVjdG9yIChkaXNwYXRjaGVyKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlclxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGxcbiAgICB0aGlzLmR1bXAgPSBmYWxzZVxuICAgIHRoaXMuc3RhdGUgPSAnb25nb2luZydcbiAgICAvLyAyIHRlcm1pbmF0ZWQgbGlzdGVuZXJzIGdldCBhZGRlZCBwZXIgcmVxdWVzdCxcbiAgICAvLyBidXQgb25seSAxIGdldHMgcmVtb3ZlZC4gSWYgdGhlcmUgYXJlIDIwIHJlZGlyZWN0cyxcbiAgICAvLyAyMSBsaXN0ZW5lcnMgd2lsbCBiZSBhZGRlZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzE3MTFcbiAgICAvLyBUT0RPIChmaXgpOiBGaW5kIGFuZCBmaXggcm9vdCBjYXVzZSBmb3IgbGVha2VkIGxpc3RlbmVyLlxuICAgIHRoaXMuc2V0TWF4TGlzdGVuZXJzKDIxKVxuICB9XG5cbiAgdGVybWluYXRlIChyZWFzb24pIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29uZ29pbmcnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gJ3Rlcm1pbmF0ZWQnXG4gICAgdGhpcy5jb25uZWN0aW9uPy5kZXN0cm95KHJlYXNvbilcbiAgICB0aGlzLmVtaXQoJ3Rlcm1pbmF0ZWQnLCByZWFzb24pXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmV0Y2gtY29udHJvbGxlci1hYm9ydFxuICBhYm9ydCAoZXJyb3IpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29uZ29pbmcnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAxLiBTZXQgY29udHJvbGxlcuKAmXMgc3RhdGUgdG8gXCJhYm9ydGVkXCIuXG4gICAgdGhpcy5zdGF0ZSA9ICdhYm9ydGVkJ1xuXG4gICAgLy8gMi4gTGV0IGZhbGxiYWNrRXJyb3IgYmUgYW4gXCJBYm9ydEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgIC8vIDMuIFNldCBlcnJvciB0byBmYWxsYmFja0Vycm9yIGlmIGl0IGlzIG5vdCBnaXZlbi5cbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBlcnJvciA9IG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDQuIExldCBzZXJpYWxpemVkRXJyb3IgYmUgU3RydWN0dXJlZFNlcmlhbGl6ZShlcnJvcikuXG4gICAgLy8gICAgSWYgdGhhdCB0aHJldyBhbiBleGNlcHRpb24sIGNhdGNoIGl0LCBhbmQgbGV0XG4gICAgLy8gICAgc2VyaWFsaXplZEVycm9yIGJlIFN0cnVjdHVyZWRTZXJpYWxpemUoZmFsbGJhY2tFcnJvcikuXG5cbiAgICAvLyA1LiBTZXQgY29udHJvbGxlcuKAmXMgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gdG8gc2VyaWFsaXplZEVycm9yLlxuICAgIHRoaXMuc2VyaWFsaXplZEFib3J0UmVhc29uID0gZXJyb3JcblxuICAgIHRoaXMuY29ubmVjdGlvbj8uZGVzdHJveShlcnJvcilcbiAgICB0aGlzLmVtaXQoJ3Rlcm1pbmF0ZWQnLCBlcnJvcilcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmV0Y2gtbWV0aG9kXG5mdW5jdGlvbiBmZXRjaCAoaW5wdXQsIGluaXQgPSB7fSkge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnZ2xvYmFsVGhpcy5mZXRjaCcgfSlcblxuICAvLyAxLiBMZXQgcCBiZSBhIG5ldyBwcm9taXNlLlxuICBjb25zdCBwID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAvLyAyLiBMZXQgcmVxdWVzdE9iamVjdCBiZSB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBpbml0aWFsIHZhbHVlIG9mXG4gIC8vIFJlcXVlc3QgYXMgY29uc3RydWN0b3Igd2l0aCBpbnB1dCBhbmQgaW5pdCBhcyBhcmd1bWVudHMuIElmIHRoaXMgdGhyb3dzXG4gIC8vIGFuIGV4Y2VwdGlvbiwgcmVqZWN0IHAgd2l0aCBpdCBhbmQgcmV0dXJuIHAuXG4gIGxldCByZXF1ZXN0T2JqZWN0XG5cbiAgdHJ5IHtcbiAgICByZXF1ZXN0T2JqZWN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwLnJlamVjdChlKVxuICAgIHJldHVybiBwLnByb21pc2VcbiAgfVxuXG4gIC8vIDMuIExldCByZXF1ZXN0IGJlIHJlcXVlc3RPYmplY3TigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0T2JqZWN0W2tTdGF0ZV1cblxuICAvLyA0LiBJZiByZXF1ZXN0T2JqZWN04oCZcyBzaWduYWzigJlzIGFib3J0ZWQgZmxhZyBpcyBzZXQsIHRoZW46XG4gIGlmIChyZXF1ZXN0T2JqZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgLy8gMS4gQWJvcnQgdGhlIGZldGNoKCkgY2FsbCB3aXRoIHAsIHJlcXVlc3QsIG51bGwsIGFuZFxuICAgIC8vICAgIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbOKAmXMgYWJvcnQgcmVhc29uLlxuICAgIGFib3J0RmV0Y2gocCwgcmVxdWVzdCwgbnVsbCwgcmVxdWVzdE9iamVjdC5zaWduYWwucmVhc29uKVxuXG4gICAgLy8gMi4gUmV0dXJuIHAuXG4gICAgcmV0dXJuIHAucHJvbWlzZVxuICB9XG5cbiAgLy8gNS4gTGV0IGdsb2JhbE9iamVjdCBiZSByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QuXG4gIGNvbnN0IGdsb2JhbE9iamVjdCA9IHJlcXVlc3QuY2xpZW50Lmdsb2JhbE9iamVjdFxuXG4gIC8vIDYuIElmIGdsb2JhbE9iamVjdCBpcyBhIFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZSBvYmplY3QsIHRoZW4gc2V0XG4gIC8vIHJlcXVlc3TigJlzIHNlcnZpY2Utd29ya2VycyBtb2RlIHRvIFwibm9uZVwiLlxuICBpZiAoZ2xvYmFsT2JqZWN0Py5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ1NlcnZpY2VXb3JrZXJHbG9iYWxTY29wZScpIHtcbiAgICByZXF1ZXN0LnNlcnZpY2VXb3JrZXJzID0gJ25vbmUnXG4gIH1cblxuICAvLyA3LiBMZXQgcmVzcG9uc2VPYmplY3QgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlT2JqZWN0ID0gbnVsbFxuXG4gIC8vIDguIExldCByZWxldmFudFJlYWxtIGJlIHRoaXPigJlzIHJlbGV2YW50IFJlYWxtLlxuICBjb25zdCByZWxldmFudFJlYWxtID0gbnVsbFxuXG4gIC8vIDkuIExldCBsb2NhbGx5QWJvcnRlZCBiZSBmYWxzZS5cbiAgbGV0IGxvY2FsbHlBYm9ydGVkID0gZmFsc2VcblxuICAvLyAxMC4gTGV0IGNvbnRyb2xsZXIgYmUgbnVsbC5cbiAgbGV0IGNvbnRyb2xsZXIgPSBudWxsXG5cbiAgLy8gMTEuIEFkZCB0aGUgZm9sbG93aW5nIGFib3J0IHN0ZXBzIHRvIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbDpcbiAgYWRkQWJvcnRMaXN0ZW5lcihcbiAgICByZXF1ZXN0T2JqZWN0LnNpZ25hbCxcbiAgICAoKSA9PiB7XG4gICAgICAvLyAxLiBTZXQgbG9jYWxseUFib3J0ZWQgdG8gdHJ1ZS5cbiAgICAgIGxvY2FsbHlBYm9ydGVkID0gdHJ1ZVxuXG4gICAgICAvLyAyLiBBc3NlcnQ6IGNvbnRyb2xsZXIgaXMgbm9uLW51bGwuXG4gICAgICBhc3NlcnQoY29udHJvbGxlciAhPSBudWxsKVxuXG4gICAgICAvLyAzLiBBYm9ydCBjb250cm9sbGVyIHdpdGggcmVxdWVzdE9iamVjdOKAmXMgc2lnbmFs4oCZcyBhYm9ydCByZWFzb24uXG4gICAgICBjb250cm9sbGVyLmFib3J0KHJlcXVlc3RPYmplY3Quc2lnbmFsLnJlYXNvbilcblxuICAgICAgLy8gNC4gQWJvcnQgdGhlIGZldGNoKCkgY2FsbCB3aXRoIHAsIHJlcXVlc3QsIHJlc3BvbnNlT2JqZWN0LFxuICAgICAgLy8gICAgYW5kIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbOKAmXMgYWJvcnQgcmVhc29uLlxuICAgICAgYWJvcnRGZXRjaChwLCByZXF1ZXN0LCByZXNwb25zZU9iamVjdCwgcmVxdWVzdE9iamVjdC5zaWduYWwucmVhc29uKVxuICAgIH1cbiAgKVxuXG4gIC8vIDEyLiBMZXQgaGFuZGxlRmV0Y2hEb25lIGdpdmVuIHJlc3BvbnNlIHJlc3BvbnNlIGJlIHRvIGZpbmFsaXplIGFuZFxuICAvLyByZXBvcnQgdGltaW5nIHdpdGggcmVzcG9uc2UsIGdsb2JhbE9iamVjdCwgYW5kIFwiZmV0Y2hcIi5cbiAgY29uc3QgaGFuZGxlRmV0Y2hEb25lID0gKHJlc3BvbnNlKSA9PlxuICAgIGZpbmFsaXplQW5kUmVwb3J0VGltaW5nKHJlc3BvbnNlLCAnZmV0Y2gnKVxuXG4gIC8vIDEzLiBTZXQgY29udHJvbGxlciB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgZmV0Y2ggZ2l2ZW4gcmVxdWVzdCxcbiAgLy8gd2l0aCBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkgc2V0IHRvIGhhbmRsZUZldGNoRG9uZSwgYW5kIHByb2Nlc3NSZXNwb25zZVxuICAvLyBnaXZlbiByZXNwb25zZSBiZWluZyB0aGVzZSBzdWJzdGVwczpcblxuICBjb25zdCBwcm9jZXNzUmVzcG9uc2UgPSAocmVzcG9uc2UpID0+IHtcbiAgICAvLyAxLiBJZiBsb2NhbGx5QWJvcnRlZCBpcyB0cnVlLCB0ZXJtaW5hdGUgdGhlc2Ugc3Vic3RlcHMuXG4gICAgaWYgKGxvY2FsbHlBYm9ydGVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG5cbiAgICAvLyAyLiBJZiByZXNwb25zZeKAmXMgYWJvcnRlZCBmbGFnIGlzIHNldCwgdGhlbjpcbiAgICBpZiAocmVzcG9uc2UuYWJvcnRlZCkge1xuICAgICAgLy8gMS4gTGV0IGRlc2VyaWFsaXplZEVycm9yIGJlIHRoZSByZXN1bHQgb2YgZGVzZXJpYWxpemUgYSBzZXJpYWxpemVkXG4gICAgICAvLyAgICBhYm9ydCByZWFzb24gZ2l2ZW4gY29udHJvbGxlcuKAmXMgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gYW5kXG4gICAgICAvLyAgICByZWxldmFudFJlYWxtLlxuXG4gICAgICAvLyAyLiBBYm9ydCB0aGUgZmV0Y2goKSBjYWxsIHdpdGggcCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGFuZFxuICAgICAgLy8gICAgZGVzZXJpYWxpemVkRXJyb3IuXG5cbiAgICAgIGFib3J0RmV0Y2gocCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGNvbnRyb2xsZXIuc2VyaWFsaXplZEFib3J0UmVhc29uKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgLy8gMy4gSWYgcmVzcG9uc2UgaXMgYSBuZXR3b3JrIGVycm9yLCB0aGVuIHJlamVjdCBwIHdpdGggYSBUeXBlRXJyb3JcbiAgICAvLyBhbmQgdGVybWluYXRlIHRoZXNlIHN1YnN0ZXBzLlxuICAgIGlmIChyZXNwb25zZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICBwLnJlamVjdChcbiAgICAgICAgT2JqZWN0LmFzc2lnbihuZXcgVHlwZUVycm9yKCdmZXRjaCBmYWlsZWQnKSwgeyBjYXVzZTogcmVzcG9uc2UuZXJyb3IgfSlcbiAgICAgIClcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cblxuICAgIC8vIDQuIFNldCByZXNwb25zZU9iamVjdCB0byB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgUmVzcG9uc2Ugb2JqZWN0LFxuICAgIC8vIGdpdmVuIHJlc3BvbnNlLCBcImltbXV0YWJsZVwiLCBhbmQgcmVsZXZhbnRSZWFsbS5cbiAgICByZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgcmVzcG9uc2VPYmplY3Rba1N0YXRlXSA9IHJlc3BvbnNlXG4gICAgcmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAnaW1tdXRhYmxlJ1xuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuXG4gICAgLy8gNS4gUmVzb2x2ZSBwIHdpdGggcmVzcG9uc2VPYmplY3QuXG4gICAgcC5yZXNvbHZlKHJlc3BvbnNlT2JqZWN0KVxuICB9XG5cbiAgY29udHJvbGxlciA9IGZldGNoaW5nKHtcbiAgICByZXF1ZXN0LFxuICAgIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keTogaGFuZGxlRmV0Y2hEb25lLFxuICAgIHByb2Nlc3NSZXNwb25zZSxcbiAgICBkaXNwYXRjaGVyOiBpbml0LmRpc3BhdGNoZXIgPz8gZ2V0R2xvYmFsRGlzcGF0Y2hlcigpIC8vIHVuZGljaVxuICB9KVxuXG4gIC8vIDE0LiBSZXR1cm4gcC5cbiAgcmV0dXJuIHAucHJvbWlzZVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmluYWxpemUtYW5kLXJlcG9ydC10aW1pbmdcbmZ1bmN0aW9uIGZpbmFsaXplQW5kUmVwb3J0VGltaW5nIChyZXNwb25zZSwgaW5pdGlhdG9yVHlwZSA9ICdvdGhlcicpIHtcbiAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYW4gYWJvcnRlZCBuZXR3b3JrIGVycm9yLCB0aGVuIHJldHVybi5cbiAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgJiYgcmVzcG9uc2UuYWJvcnRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMi4gSWYgcmVzcG9uc2XigJlzIFVSTCBsaXN0IGlzIG51bGwgb3IgZW1wdHksIHRoZW4gcmV0dXJuLlxuICBpZiAoIXJlc3BvbnNlLnVybExpc3Q/Lmxlbmd0aCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMy4gTGV0IG9yaWdpbmFsVVJMIGJlIHJlc3BvbnNl4oCZcyBVUkwgbGlzdFswXS5cbiAgY29uc3Qgb3JpZ2luYWxVUkwgPSByZXNwb25zZS51cmxMaXN0WzBdXG5cbiAgLy8gNC4gTGV0IHRpbWluZ0luZm8gYmUgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvLlxuICBsZXQgdGltaW5nSW5mbyA9IHJlc3BvbnNlLnRpbWluZ0luZm9cblxuICAvLyA1LiBMZXQgY2FjaGVTdGF0ZSBiZSByZXNwb25zZeKAmXMgY2FjaGUgc3RhdGUuXG4gIGxldCBjYWNoZVN0YXRlID0gcmVzcG9uc2UuY2FjaGVTdGF0ZVxuXG4gIC8vIDYuIElmIG9yaWdpbmFsVVJM4oCZcyBzY2hlbWUgaXMgbm90IGFuIEhUVFAoUykgc2NoZW1lLCB0aGVuIHJldHVybi5cbiAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShvcmlnaW5hbFVSTCkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIDcuIElmIHRpbWluZ0luZm8gaXMgbnVsbCwgdGhlbiByZXR1cm4uXG4gIGlmICh0aW1pbmdJbmZvID09PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA4LiBJZiByZXNwb25zZeKAmXMgdGltaW5nIGFsbG93IHBhc3NlZCBmbGFnIGlzIG5vdCBzZXQsIHRoZW46XG4gIGlmICghcmVzcG9uc2UudGltaW5nQWxsb3dQYXNzZWQpIHtcbiAgICAvLyAgMS4gU2V0IHRpbWluZ0luZm8gdG8gYSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGFuIG9wYXF1ZSB0aW1pbmcgaW5mbyBmb3IgdGltaW5nSW5mby5cbiAgICB0aW1pbmdJbmZvID0gY3JlYXRlT3BhcXVlVGltaW5nSW5mbyh7XG4gICAgICBzdGFydFRpbWU6IHRpbWluZ0luZm8uc3RhcnRUaW1lXG4gICAgfSlcblxuICAgIC8vICAyLiBTZXQgY2FjaGVTdGF0ZSB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICAgIGNhY2hlU3RhdGUgPSAnJ1xuICB9XG5cbiAgLy8gOS4gU2V0IHRpbWluZ0luZm/igJlzIGVuZCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZVxuICAvLyBnaXZlbiBnbG9iYWzigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdOKAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkXG4gIC8vIGNhcGFiaWxpdHkuXG4gIC8vIFRPRE86IGdpdmVuIGdsb2JhbOKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN04oCZcyBjcm9zcy1vcmlnaW4gaXNvbGF0ZWRcbiAgLy8gY2FwYWJpbGl0eT9cbiAgdGltaW5nSW5mby5lbmRUaW1lID0gY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUoKVxuXG4gIC8vIDEwLiBTZXQgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvIHRvIHRpbWluZ0luZm8uXG4gIHJlc3BvbnNlLnRpbWluZ0luZm8gPSB0aW1pbmdJbmZvXG5cbiAgLy8gMTEuIE1hcmsgcmVzb3VyY2UgdGltaW5nIGZvciB0aW1pbmdJbmZvLCBvcmlnaW5hbFVSTCwgaW5pdGlhdG9yVHlwZSxcbiAgLy8gZ2xvYmFsLCBhbmQgY2FjaGVTdGF0ZS5cbiAgbWFya1Jlc291cmNlVGltaW5nKFxuICAgIHRpbWluZ0luZm8sXG4gICAgb3JpZ2luYWxVUkwsXG4gICAgaW5pdGlhdG9yVHlwZSxcbiAgICBnbG9iYWxUaGlzLFxuICAgIGNhY2hlU3RhdGVcbiAgKVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vcmVzb3VyY2UtdGltaW5nLyNkZm4tbWFyay1yZXNvdXJjZS10aW1pbmdcbmZ1bmN0aW9uIG1hcmtSZXNvdXJjZVRpbWluZyAodGltaW5nSW5mbywgb3JpZ2luYWxVUkwsIGluaXRpYXRvclR5cGUsIGdsb2JhbFRoaXMsIGNhY2hlU3RhdGUpIHtcbiAgaWYgKG5vZGVNYWpvciA+IDE4IHx8IChub2RlTWFqb3IgPT09IDE4ICYmIG5vZGVNaW5vciA+PSAyKSkge1xuICAgIHBlcmZvcm1hbmNlLm1hcmtSZXNvdXJjZVRpbWluZyh0aW1pbmdJbmZvLCBvcmlnaW5hbFVSTC5ocmVmLCBpbml0aWF0b3JUeXBlLCBnbG9iYWxUaGlzLCBjYWNoZVN0YXRlKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNhYm9ydC1mZXRjaFxuZnVuY3Rpb24gYWJvcnRGZXRjaCAocCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGVycm9yKSB7XG4gIC8vIE5vdGU6IEFib3J0U2lnbmFsLnJlYXNvbiB3YXMgYWRkZWQgaW4gbm9kZSB2MTcuMi4wXG4gIC8vIHdoaWNoIHdvdWxkIGdpdmUgdXMgYW4gdW5kZWZpbmVkIGVycm9yIHRvIHJlamVjdCB3aXRoLlxuICAvLyBSZW1vdmUgdGhpcyBvbmNlIG5vZGUgdjE2IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4gIGlmICghZXJyb3IpIHtcbiAgICBlcnJvciA9IG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICB9XG5cbiAgLy8gMS4gUmVqZWN0IHByb21pc2Ugd2l0aCBlcnJvci5cbiAgcC5yZWplY3QoZXJyb3IpXG5cbiAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgYm9keSBpcyBub3QgbnVsbCBhbmQgaXMgcmVhZGFibGUsIHRoZW4gY2FuY2VsIHJlcXVlc3TigJlzXG4gIC8vIGJvZHkgd2l0aCBlcnJvci5cbiAgaWYgKHJlcXVlc3QuYm9keSAhPSBudWxsICYmIGlzUmVhZGFibGUocmVxdWVzdC5ib2R5Py5zdHJlYW0pKSB7XG4gICAgcmVxdWVzdC5ib2R5LnN0cmVhbS5jYW5jZWwoZXJyb3IpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VSUl9JTlZBTElEX1NUQVRFJykge1xuICAgICAgICAvLyBOb2RlIGJ1Zz9cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9KVxuICB9XG5cbiAgLy8gMy4gSWYgcmVzcG9uc2VPYmplY3QgaXMgbnVsbCwgdGhlbiByZXR1cm4uXG4gIGlmIChyZXNwb25zZU9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA0LiBMZXQgcmVzcG9uc2UgYmUgcmVzcG9uc2VPYmplY3TigJlzIHJlc3BvbnNlLlxuICBjb25zdCByZXNwb25zZSA9IHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV1cblxuICAvLyA1LiBJZiByZXNwb25zZeKAmXMgYm9keSBpcyBub3QgbnVsbCBhbmQgaXMgcmVhZGFibGUsIHRoZW4gZXJyb3IgcmVzcG9uc2XigJlzXG4gIC8vIGJvZHkgd2l0aCBlcnJvci5cbiAgaWYgKHJlc3BvbnNlLmJvZHkgIT0gbnVsbCAmJiBpc1JlYWRhYmxlKHJlc3BvbnNlLmJvZHk/LnN0cmVhbSkpIHtcbiAgICByZXNwb25zZS5ib2R5LnN0cmVhbS5jYW5jZWwoZXJyb3IpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VSUl9JTlZBTElEX1NUQVRFJykge1xuICAgICAgICAvLyBOb2RlIGJ1Zz9cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9KVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmZXRjaGluZ1xuZnVuY3Rpb24gZmV0Y2hpbmcgKHtcbiAgcmVxdWVzdCxcbiAgcHJvY2Vzc1JlcXVlc3RCb2R5Q2h1bmtMZW5ndGgsXG4gIHByb2Nlc3NSZXF1ZXN0RW5kT2ZCb2R5LFxuICBwcm9jZXNzUmVzcG9uc2UsXG4gIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSxcbiAgcHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHksXG4gIHVzZVBhcmFsbGVsUXVldWUgPSBmYWxzZSxcbiAgZGlzcGF0Y2hlciAvLyB1bmRpY2lcbn0pIHtcbiAgLy8gMS4gTGV0IHRhc2tEZXN0aW5hdGlvbiBiZSBudWxsLlxuICBsZXQgdGFza0Rlc3RpbmF0aW9uID0gbnVsbFxuXG4gIC8vIDIuIExldCBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSBiZSBmYWxzZS5cbiAgbGV0IGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5ID0gZmFsc2VcblxuICAvLyAzLiBJZiByZXF1ZXN04oCZcyBjbGllbnQgaXMgbm9uLW51bGwsIHRoZW46XG4gIGlmIChyZXF1ZXN0LmNsaWVudCAhPSBudWxsKSB7XG4gICAgLy8gMS4gU2V0IHRhc2tEZXN0aW5hdGlvbiB0byByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QuXG4gICAgdGFza0Rlc3RpbmF0aW9uID0gcmVxdWVzdC5jbGllbnQuZ2xvYmFsT2JqZWN0XG5cbiAgICAvLyAyLiBTZXQgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkgdG8gcmVxdWVzdOKAmXMgY2xpZW504oCZcyBjcm9zcy1vcmlnaW5cbiAgICAvLyBpc29sYXRlZCBjYXBhYmlsaXR5LlxuICAgIGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5ID1cbiAgICAgIHJlcXVlc3QuY2xpZW50LmNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5XG4gIH1cblxuICAvLyA0LiBJZiB1c2VQYXJhbGxlbFF1ZXVlIGlzIHRydWUsIHRoZW4gc2V0IHRhc2tEZXN0aW5hdGlvbiB0byB0aGUgcmVzdWx0IG9mXG4gIC8vIHN0YXJ0aW5nIGEgbmV3IHBhcmFsbGVsIHF1ZXVlLlxuICAvLyBUT0RPXG5cbiAgLy8gNS4gTGV0IHRpbWluZ0luZm8gYmUgYSBuZXcgZmV0Y2ggdGltaW5nIGluZm8gd2hvc2Ugc3RhcnQgdGltZSBhbmRcbiAgLy8gcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lIGFyZSB0aGUgY29hcnNlbmVkIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW5cbiAgLy8gY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkuXG4gIGNvbnN0IGN1cnJlblRpbWUgPSBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZShjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSlcbiAgY29uc3QgdGltaW5nSW5mbyA9IGNyZWF0ZU9wYXF1ZVRpbWluZ0luZm8oe1xuICAgIHN0YXJ0VGltZTogY3VycmVuVGltZVxuICB9KVxuXG4gIC8vIDYuIExldCBmZXRjaFBhcmFtcyBiZSBhIG5ldyBmZXRjaCBwYXJhbXMgd2hvc2VcbiAgLy8gcmVxdWVzdCBpcyByZXF1ZXN0LFxuICAvLyB0aW1pbmcgaW5mbyBpcyB0aW1pbmdJbmZvLFxuICAvLyBwcm9jZXNzIHJlcXVlc3QgYm9keSBjaHVuayBsZW5ndGggaXMgcHJvY2Vzc1JlcXVlc3RCb2R5Q2h1bmtMZW5ndGgsXG4gIC8vIHByb2Nlc3MgcmVxdWVzdCBlbmQtb2YtYm9keSBpcyBwcm9jZXNzUmVxdWVzdEVuZE9mQm9keSxcbiAgLy8gcHJvY2VzcyByZXNwb25zZSBpcyBwcm9jZXNzUmVzcG9uc2UsXG4gIC8vIHByb2Nlc3MgcmVzcG9uc2UgY29uc3VtZSBib2R5IGlzIHByb2Nlc3NSZXNwb25zZUNvbnN1bWVCb2R5LFxuICAvLyBwcm9jZXNzIHJlc3BvbnNlIGVuZC1vZi1ib2R5IGlzIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSxcbiAgLy8gdGFzayBkZXN0aW5hdGlvbiBpcyB0YXNrRGVzdGluYXRpb24sXG4gIC8vIGFuZCBjcm9zcy1vcmlnaW4gaXNvbGF0ZWQgY2FwYWJpbGl0eSBpcyBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eS5cbiAgY29uc3QgZmV0Y2hQYXJhbXMgPSB7XG4gICAgY29udHJvbGxlcjogbmV3IEZldGNoKGRpc3BhdGNoZXIpLFxuICAgIHJlcXVlc3QsXG4gICAgdGltaW5nSW5mbyxcbiAgICBwcm9jZXNzUmVxdWVzdEJvZHlDaHVua0xlbmd0aCxcbiAgICBwcm9jZXNzUmVxdWVzdEVuZE9mQm9keSxcbiAgICBwcm9jZXNzUmVzcG9uc2UsXG4gICAgcHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHksXG4gICAgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5LFxuICAgIHRhc2tEZXN0aW5hdGlvbixcbiAgICBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eVxuICB9XG5cbiAgLy8gNy4gSWYgcmVxdWVzdOKAmXMgYm9keSBpcyBhIGJ5dGUgc2VxdWVuY2UsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGJvZHkgdG9cbiAgLy8gICAgcmVxdWVzdOKAmXMgYm9keSBhcyBhIGJvZHkuXG4gIC8vIE5PVEU6IFNpbmNlIGZldGNoaW5nIGlzIG9ubHkgY2FsbGVkIGZyb20gZmV0Y2gsIGJvZHkgc2hvdWxkIGFscmVhZHkgYmVcbiAgLy8gZXh0cmFjdGVkLlxuICBhc3NlcnQoIXJlcXVlc3QuYm9keSB8fCByZXF1ZXN0LmJvZHkuc3RyZWFtKVxuXG4gIC8vIDguIElmIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBcImNsaWVudFwiLCB0aGVuIHNldCByZXF1ZXN04oCZcyB3aW5kb3cgdG8gcmVxdWVzdOKAmXNcbiAgLy8gY2xpZW50LCBpZiByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QgaXMgYSBXaW5kb3cgb2JqZWN0OyBvdGhlcndpc2VcbiAgLy8gXCJuby13aW5kb3dcIi5cbiAgaWYgKHJlcXVlc3Qud2luZG93ID09PSAnY2xpZW50Jykge1xuICAgIC8vIFRPRE86IFdoYXQgaWYgcmVxdWVzdC5jbGllbnQgaXMgbnVsbD9cbiAgICByZXF1ZXN0LndpbmRvdyA9XG4gICAgICByZXF1ZXN0LmNsaWVudD8uZ2xvYmFsT2JqZWN0Py5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ1dpbmRvdydcbiAgICAgICAgPyByZXF1ZXN0LmNsaWVudFxuICAgICAgICA6ICduby13aW5kb3cnXG4gIH1cblxuICAvLyA5LiBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgXCJjbGllbnRcIiwgdGhlbiBzZXQgcmVxdWVzdOKAmXMgb3JpZ2luIHRvIHJlcXVlc3TigJlzXG4gIC8vIGNsaWVudOKAmXMgb3JpZ2luLlxuICBpZiAocmVxdWVzdC5vcmlnaW4gPT09ICdjbGllbnQnKSB7XG4gICAgLy8gVE9ETzogV2hhdCBpZiByZXF1ZXN0LmNsaWVudCBpcyBudWxsP1xuICAgIHJlcXVlc3Qub3JpZ2luID0gcmVxdWVzdC5jbGllbnQ/Lm9yaWdpblxuICB9XG5cbiAgLy8gMTAuIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gIC8vIFRPRE9cblxuICAvLyAxMS4gSWYgcmVxdWVzdOKAmXMgcG9saWN5IGNvbnRhaW5lciBpcyBcImNsaWVudFwiLCB0aGVuOlxuICBpZiAocmVxdWVzdC5wb2xpY3lDb250YWluZXIgPT09ICdjbGllbnQnKSB7XG4gICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgY2xpZW50IGlzIG5vbi1udWxsLCB0aGVuIHNldCByZXF1ZXN04oCZcyBwb2xpY3lcbiAgICAvLyBjb250YWluZXIgdG8gYSBjbG9uZSBvZiByZXF1ZXN04oCZcyBjbGllbnTigJlzIHBvbGljeSBjb250YWluZXIuIFtIVE1MXVxuICAgIGlmIChyZXF1ZXN0LmNsaWVudCAhPSBudWxsKSB7XG4gICAgICByZXF1ZXN0LnBvbGljeUNvbnRhaW5lciA9IGNsb25lUG9saWN5Q29udGFpbmVyKFxuICAgICAgICByZXF1ZXN0LmNsaWVudC5wb2xpY3lDb250YWluZXJcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBzZXQgcmVxdWVzdOKAmXMgcG9saWN5IGNvbnRhaW5lciB0byBhIG5ldyBwb2xpY3lcbiAgICAgIC8vIGNvbnRhaW5lci5cbiAgICAgIHJlcXVlc3QucG9saWN5Q29udGFpbmVyID0gbWFrZVBvbGljeUNvbnRhaW5lcigpXG4gICAgfVxuICB9XG5cbiAgLy8gMTIuIElmIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEFjY2VwdGAsIHRoZW46XG4gIGlmICghcmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnYWNjZXB0JykpIHtcbiAgICAvLyAxLiBMZXQgdmFsdWUgYmUgYCovKmAuXG4gICAgY29uc3QgdmFsdWUgPSAnKi8qJ1xuXG4gICAgLy8gMi4gQSB1c2VyIGFnZW50IHNob3VsZCBzZXQgdmFsdWUgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIHN0YXRlbWVudCwgaWZcbiAgICAvLyBhbnksIHN3aXRjaGluZyBvbiByZXF1ZXN04oCZcyBkZXN0aW5hdGlvbjpcbiAgICAvLyBcImRvY3VtZW50XCJcbiAgICAvLyBcImZyYW1lXCJcbiAgICAvLyBcImlmcmFtZVwiXG4gICAgLy8gYHRleHQvaHRtbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsYXBwbGljYXRpb24veG1sO3E9MC45LCovKjtxPTAuOGBcbiAgICAvLyBcImltYWdlXCJcbiAgICAvLyBgaW1hZ2UvcG5nLGltYWdlL3N2Zyt4bWwsaW1hZ2UvKjtxPTAuOCwqLyo7cT0wLjVgXG4gICAgLy8gXCJzdHlsZVwiXG4gICAgLy8gYHRleHQvY3NzLCovKjtxPTAuMWBcbiAgICAvLyBUT0RPXG5cbiAgICAvLyAzLiBBcHBlbmQgYEFjY2VwdGAvdmFsdWUgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdCcsIHZhbHVlKVxuICB9XG5cbiAgLy8gMTMuIElmIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEFjY2VwdC1MYW5ndWFnZWAsIHRoZW5cbiAgLy8gdXNlciBhZ2VudHMgc2hvdWxkIGFwcGVuZCBgQWNjZXB0LUxhbmd1YWdlYC9hbiBhcHByb3ByaWF0ZSB2YWx1ZSB0b1xuICAvLyByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgaWYgKCFyZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdhY2NlcHQtbGFuZ3VhZ2UnKSkge1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdhY2NlcHQtbGFuZ3VhZ2UnLCAnKicpXG4gIH1cblxuICAvLyAxNC4gSWYgcmVxdWVzdOKAmXMgcHJpb3JpdHkgaXMgbnVsbCwgdGhlbiB1c2UgcmVxdWVzdOKAmXMgaW5pdGlhdG9yIGFuZFxuICAvLyBkZXN0aW5hdGlvbiBhcHByb3ByaWF0ZWx5IGluIHNldHRpbmcgcmVxdWVzdOKAmXMgcHJpb3JpdHkgdG8gYVxuICAvLyB1c2VyLWFnZW50LWRlZmluZWQgb2JqZWN0LlxuICBpZiAocmVxdWVzdC5wcmlvcml0eSA9PT0gbnVsbCkge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDE1LiBJZiByZXF1ZXN0IGlzIGEgc3VicmVzb3VyY2UgcmVxdWVzdCwgdGhlbjpcbiAgaWYgKHN1YnJlc291cmNlU2V0LmhhcyhyZXF1ZXN0LmRlc3RpbmF0aW9uKSkge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDE2LiBSdW4gbWFpbiBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgbWFpbkZldGNoKGZldGNoUGFyYW1zKVxuICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoZXJyKVxuICAgIH0pXG5cbiAgLy8gMTcuIFJldHVybiBmZXRjaFBhcmFtJ3MgY29udHJvbGxlclxuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlclxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1tYWluLWZldGNoXG5hc3luYyBmdW5jdGlvbiBtYWluRmV0Y2ggKGZldGNoUGFyYW1zLCByZWN1cnNpdmUgPSBmYWxzZSkge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDMuIElmIHJlcXVlc3TigJlzIGxvY2FsLVVSTHMtb25seSBmbGFnIGlzIHNldCBhbmQgcmVxdWVzdOKAmXMgY3VycmVudCBVUkwgaXNcbiAgLy8gbm90IGxvY2FsLCB0aGVuIHNldCByZXNwb25zZSB0byBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChyZXF1ZXN0LmxvY2FsVVJMc09ubHkgJiYgIXVybElzTG9jYWwocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgcmVzcG9uc2UgPSBtYWtlTmV0d29ya0Vycm9yKCdsb2NhbCBVUkxzIG9ubHknKVxuICB9XG5cbiAgLy8gNC4gUnVuIHJlcG9ydCBDb250ZW50IFNlY3VyaXR5IFBvbGljeSB2aW9sYXRpb25zIGZvciByZXF1ZXN0LlxuICAvLyBUT0RPXG5cbiAgLy8gNS4gVXBncmFkZSByZXF1ZXN0IHRvIGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgVVJMLCBpZiBhcHByb3ByaWF0ZS5cbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMKHJlcXVlc3QpXG5cbiAgLy8gNi4gSWYgc2hvdWxkIHJlcXVlc3QgYmUgYmxvY2tlZCBkdWUgdG8gYSBiYWQgcG9ydCwgc2hvdWxkIGZldGNoaW5nIHJlcXVlc3RcbiAgLy8gYmUgYmxvY2tlZCBhcyBtaXhlZCBjb250ZW50LCBvciBzaG91bGQgcmVxdWVzdCBiZSBibG9ja2VkIGJ5IENvbnRlbnRcbiAgLy8gU2VjdXJpdHkgUG9saWN5IHJldHVybnMgYmxvY2tlZCwgdGhlbiBzZXQgcmVzcG9uc2UgdG8gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAocmVxdWVzdEJhZFBvcnQocmVxdWVzdCkgPT09ICdibG9ja2VkJykge1xuICAgIHJlc3BvbnNlID0gbWFrZU5ldHdvcmtFcnJvcignYmFkIHBvcnQnKVxuICB9XG4gIC8vIFRPRE86IHNob3VsZCBmZXRjaGluZyByZXF1ZXN0IGJlIGJsb2NrZWQgYXMgbWl4ZWQgY29udGVudD9cbiAgLy8gVE9ETzogc2hvdWxkIHJlcXVlc3QgYmUgYmxvY2tlZCBieSBDb250ZW50IFNlY3VyaXR5IFBvbGljeT9cblxuICAvLyA3LiBJZiByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgaXMgdGhlIGVtcHR5IHN0cmluZywgdGhlbiBzZXQgcmVxdWVzdOKAmXNcbiAgLy8gcmVmZXJyZXIgcG9saWN5IHRvIHJlcXVlc3TigJlzIHBvbGljeSBjb250YWluZXLigJlzIHJlZmVycmVyIHBvbGljeS5cbiAgaWYgKHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPT09ICcnKSB7XG4gICAgcmVxdWVzdC5yZWZlcnJlclBvbGljeSA9IHJlcXVlc3QucG9saWN5Q29udGFpbmVyLnJlZmVycmVyUG9saWN5XG4gIH1cblxuICAvLyA4LiBJZiByZXF1ZXN04oCZcyByZWZlcnJlciBpcyBub3QgXCJuby1yZWZlcnJlclwiLCB0aGVuIHNldCByZXF1ZXN04oCZc1xuICAvLyByZWZlcnJlciB0byB0aGUgcmVzdWx0IG9mIGludm9raW5nIGRldGVybWluZSByZXF1ZXN04oCZcyByZWZlcnJlci5cbiAgaWYgKHJlcXVlc3QucmVmZXJyZXIgIT09ICduby1yZWZlcnJlcicpIHtcbiAgICByZXF1ZXN0LnJlZmVycmVyID0gZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcihyZXF1ZXN0KVxuICB9XG5cbiAgLy8gOS4gU2V0IHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgdG8gXCJodHRwc1wiIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nXG4gIC8vIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gIC8vIC0gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBpcyBcImh0dHBcIlxuICAvLyAtIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBob3N0IGlzIGEgZG9tYWluXG4gIC8vIC0gTWF0Y2hpbmcgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIGhvc3QgcGVyIEtub3duIEhTVFMgSG9zdCBEb21haW4gTmFtZVxuICAvLyAgIE1hdGNoaW5nIHJlc3VsdHMgaW4gZWl0aGVyIGEgc3VwZXJkb21haW4gbWF0Y2ggd2l0aCBhbiBhc3NlcnRlZFxuICAvLyAgIGluY2x1ZGVTdWJEb21haW5zIGRpcmVjdGl2ZSBvciBhIGNvbmdydWVudCBtYXRjaCAod2l0aCBvciB3aXRob3V0IGFuXG4gIC8vICAgYXNzZXJ0ZWQgaW5jbHVkZVN1YkRvbWFpbnMgZGlyZWN0aXZlKS4gW0hTVFNdXG4gIC8vIFRPRE9cblxuICAvLyAxMC4gSWYgcmVjdXJzaXZlIGlzIGZhbHNlLCB0aGVuIHJ1biB0aGUgcmVtYWluaW5nIHN0ZXBzIGluIHBhcmFsbGVsLlxuICAvLyBUT0RPXG5cbiAgLy8gMTEuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW4gc2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZ1xuICAvLyB0aGUgc3RlcHMgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgc3RhdGVtZW50OlxuICBpZiAocmVzcG9uc2UgPT09IG51bGwpIHtcbiAgICByZXNwb25zZSA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VVJMID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcblxuICAgICAgaWYgKFxuICAgICAgICAvLyAtIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBvcmlnaW4gaXMgc2FtZSBvcmlnaW4gd2l0aCByZXF1ZXN04oCZcyBvcmlnaW4sXG4gICAgICAgIC8vICAgYW5kIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIGlzIFwiYmFzaWNcIlxuICAgICAgICAoc2FtZU9yaWdpbihjdXJyZW50VVJMLCByZXF1ZXN0LnVybCkgJiYgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKSB8fFxuICAgICAgICAvLyByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgc2NoZW1lIGlzIFwiZGF0YVwiXG4gICAgICAgIChjdXJyZW50VVJMLnByb3RvY29sID09PSAnZGF0YTonKSB8fFxuICAgICAgICAvLyAtIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJuYXZpZ2F0ZVwiIG9yIFwid2Vic29ja2V0XCJcbiAgICAgICAgKHJlcXVlc3QubW9kZSA9PT0gJ25hdmlnYXRlJyB8fCByZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnKVxuICAgICAgKSB7XG4gICAgICAgIC8vIDEuIFNldCByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyB0byBcImJhc2ljXCIuXG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9ICdiYXNpYydcblxuICAgICAgICAvLyAyLiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nIHNjaGVtZSBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHNjaGVtZUZldGNoKGZldGNoUGFyYW1zKVxuICAgICAgfVxuXG4gICAgICAvLyByZXF1ZXN04oCZcyBtb2RlIGlzIFwic2FtZS1vcmlnaW5cIlxuICAgICAgaWYgKHJlcXVlc3QubW9kZSA9PT0gJ3NhbWUtb3JpZ2luJykge1xuICAgICAgICAvLyAxLiBSZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigncmVxdWVzdCBtb2RlIGNhbm5vdCBiZSBcInNhbWUtb3JpZ2luXCInKVxuICAgICAgfVxuXG4gICAgICAvLyByZXF1ZXN04oCZcyBtb2RlIGlzIFwibm8tY29yc1wiXG4gICAgICBpZiAocmVxdWVzdC5tb2RlID09PSAnbm8tY29ycycpIHtcbiAgICAgICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSBpcyBub3QgXCJmb2xsb3dcIiwgdGhlbiByZXR1cm4gYSBuZXR3b3JrXG4gICAgICAgIC8vIGVycm9yLlxuICAgICAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCAhPT0gJ2ZvbGxvdycpIHtcbiAgICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcihcbiAgICAgICAgICAgICdyZWRpcmVjdCBtb2RlIGNhbm5vdCBiZSBcImZvbGxvd1wiIGZvciBcIm5vLWNvcnNcIiByZXF1ZXN0J1xuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIFNldCByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyB0byBcIm9wYXF1ZVwiLlxuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPSAnb3BhcXVlJ1xuXG4gICAgICAgIC8vIDMuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgc2NoZW1lIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgICAgICByZXR1cm4gYXdhaXQgc2NoZW1lRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgICB9XG5cbiAgICAgIC8vIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgaXMgbm90IGFuIEhUVFAoUykgc2NoZW1lXG4gICAgICBpZiAoIXVybElzSHR0cEh0dHBzU2NoZW1lKHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpKSkge1xuICAgICAgICAvLyBSZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignVVJMIHNjaGVtZSBtdXN0IGJlIGEgSFRUUChTKSBzY2hlbWUnKVxuICAgICAgfVxuXG4gICAgICAvLyAtIHJlcXVlc3TigJlzIHVzZS1DT1JTLXByZWZsaWdodCBmbGFnIGlzIHNldFxuICAgICAgLy8gLSByZXF1ZXN04oCZcyB1bnNhZmUtcmVxdWVzdCBmbGFnIGlzIHNldCBhbmQgZWl0aGVyIHJlcXVlc3TigJlzIG1ldGhvZCBpc1xuICAgICAgLy8gICBub3QgYSBDT1JTLXNhZmVsaXN0ZWQgbWV0aG9kIG9yIENPUlMtdW5zYWZlIHJlcXVlc3QtaGVhZGVyIG5hbWVzIHdpdGhcbiAgICAgIC8vICAgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgaXMgbm90IGVtcHR5XG4gICAgICAvLyAgICAxLiBTZXQgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgdG8gXCJjb3JzXCIuXG4gICAgICAvLyAgICAyLiBMZXQgY29yc1dpdGhQcmVmbGlnaHRSZXNwb25zZSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaFxuICAgICAgLy8gICAgZ2l2ZW4gZmV0Y2hQYXJhbXMgYW5kIHRydWUuXG4gICAgICAvLyAgICAzLiBJZiBjb3JzV2l0aFByZWZsaWdodFJlc3BvbnNlIGlzIGEgbmV0d29yayBlcnJvciwgdGhlbiBjbGVhciBjYWNoZVxuICAgICAgLy8gICAgZW50cmllcyB1c2luZyByZXF1ZXN0LlxuICAgICAgLy8gICAgNC4gUmV0dXJuIGNvcnNXaXRoUHJlZmxpZ2h0UmVzcG9uc2UuXG4gICAgICAvLyBUT0RPXG5cbiAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgLy8gICAgMS4gU2V0IHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIHRvIFwiY29yc1wiLlxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID0gJ2NvcnMnXG5cbiAgICAgIC8vICAgIDIuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgICAgIHJldHVybiBhd2FpdCBodHRwRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgfSkoKVxuICB9XG5cbiAgLy8gMTIuIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGVuIHJldHVybiByZXNwb25zZS5cbiAgaWYgKHJlY3Vyc2l2ZSkge1xuICAgIHJldHVybiByZXNwb25zZVxuICB9XG5cbiAgLy8gMTMuIElmIHJlc3BvbnNlIGlzIG5vdCBhIG5ldHdvcmsgZXJyb3IgYW5kIHJlc3BvbnNlIGlzIG5vdCBhIGZpbHRlcmVkXG4gIC8vIHJlc3BvbnNlLCB0aGVuOlxuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAwICYmICFyZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlKSB7XG4gICAgLy8gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJjb3JzXCIsIHRoZW46XG4gICAgaWYgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ2NvcnMnKSB7XG4gICAgICAvLyAxLiBMZXQgaGVhZGVyTmFtZXMgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGhlYWRlciBsaXN0IHZhbHVlc1xuICAgICAgLy8gZ2l2ZW4gYEFjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzYCBhbmQgcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICAgICAgLy8gVE9ET1xuICAgICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZSBpcyBub3QgXCJpbmNsdWRlXCIgYW5kIGhlYWRlck5hbWVzXG4gICAgICAvLyBjb250YWlucyBgKmAsIHRoZW4gc2V0IHJlc3BvbnNl4oCZcyBDT1JTLWV4cG9zZWQgaGVhZGVyLW5hbWUgbGlzdCB0b1xuICAgICAgLy8gYWxsIHVuaXF1ZSBoZWFkZXIgbmFtZXMgaW4gcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICAgICAgLy8gVE9ET1xuICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJOYW1lcyBpcyBub3QgbnVsbCBvciBmYWlsdXJlLCB0aGVuIHNldFxuICAgICAgLy8gcmVzcG9uc2XigJlzIENPUlMtZXhwb3NlZCBoZWFkZXItbmFtZSBsaXN0IHRvIGhlYWRlck5hbWVzLlxuICAgICAgLy8gVE9ET1xuICAgIH1cblxuICAgIC8vIFNldCByZXNwb25zZSB0byB0aGUgZm9sbG93aW5nIGZpbHRlcmVkIHJlc3BvbnNlIHdpdGggcmVzcG9uc2UgYXMgaXRzXG4gICAgLy8gaW50ZXJuYWwgcmVzcG9uc2UsIGRlcGVuZGluZyBvbiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZzpcbiAgICBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKSB7XG4gICAgICByZXNwb25zZSA9IGZpbHRlclJlc3BvbnNlKHJlc3BvbnNlLCAnYmFzaWMnKVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycpIHtcbiAgICAgIHJlc3BvbnNlID0gZmlsdGVyUmVzcG9uc2UocmVzcG9uc2UsICdjb3JzJylcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ29wYXF1ZScpIHtcbiAgICAgIHJlc3BvbnNlID0gZmlsdGVyUmVzcG9uc2UocmVzcG9uc2UsICdvcGFxdWUnKVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgLy8gMTQuIExldCBpbnRlcm5hbFJlc3BvbnNlIGJlIHJlc3BvbnNlLCBpZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3IsXG4gIC8vIGFuZCByZXNwb25zZeKAmXMgaW50ZXJuYWwgcmVzcG9uc2Ugb3RoZXJ3aXNlLlxuICBsZXQgaW50ZXJuYWxSZXNwb25zZSA9XG4gICAgcmVzcG9uc2Uuc3RhdHVzID09PSAwID8gcmVzcG9uc2UgOiByZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlXG5cbiAgLy8gMTUuIElmIGludGVybmFsUmVzcG9uc2XigJlzIFVSTCBsaXN0IGlzIGVtcHR5LCB0aGVuIHNldCBpdCB0byBhIGNsb25lIG9mXG4gIC8vIHJlcXVlc3TigJlzIFVSTCBsaXN0LlxuICBpZiAoaW50ZXJuYWxSZXNwb25zZS51cmxMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGludGVybmFsUmVzcG9uc2UudXJsTGlzdC5wdXNoKC4uLnJlcXVlc3QudXJsTGlzdClcbiAgfVxuXG4gIC8vIDE2LiBJZiByZXF1ZXN04oCZcyB0aW1pbmcgYWxsb3cgZmFpbGVkIGZsYWcgaXMgdW5zZXQsIHRoZW4gc2V0XG4gIC8vIGludGVybmFsUmVzcG9uc2XigJlzIHRpbWluZyBhbGxvdyBwYXNzZWQgZmxhZy5cbiAgaWYgKCFyZXF1ZXN0LnRpbWluZ0FsbG93RmFpbGVkKSB7XG4gICAgcmVzcG9uc2UudGltaW5nQWxsb3dQYXNzZWQgPSB0cnVlXG4gIH1cblxuICAvLyAxNy4gSWYgcmVzcG9uc2UgaXMgbm90IGEgbmV0d29yayBlcnJvciBhbmQgYW55IG9mIHRoZSBmb2xsb3dpbmcgcmV0dXJuc1xuICAvLyBibG9ja2VkXG4gIC8vIC0gc2hvdWxkIGludGVybmFsUmVzcG9uc2UgdG8gcmVxdWVzdCBiZSBibG9ja2VkIGFzIG1peGVkIGNvbnRlbnRcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgYnkgQ29udGVudCBTZWN1cml0eSBQb2xpY3lcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgZHVlIHRvIGl0cyBNSU1FIHR5cGVcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgZHVlIHRvIG5vc25pZmZcbiAgLy8gVE9ET1xuXG4gIC8vIDE4LiBJZiByZXNwb25zZeKAmXMgdHlwZSBpcyBcIm9wYXF1ZVwiLCBpbnRlcm5hbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMjA2LFxuICAvLyBpbnRlcm5hbFJlc3BvbnNl4oCZcyByYW5nZS1yZXF1ZXN0ZWQgZmxhZyBpcyBzZXQsIGFuZCByZXF1ZXN04oCZcyBoZWFkZXJcbiAgLy8gbGlzdCBkb2VzIG5vdCBjb250YWluIGBSYW5nZWAsIHRoZW4gc2V0IHJlc3BvbnNlIGFuZCBpbnRlcm5hbFJlc3BvbnNlXG4gIC8vIHRvIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIHJlc3BvbnNlLnR5cGUgPT09ICdvcGFxdWUnICYmXG4gICAgaW50ZXJuYWxSZXNwb25zZS5zdGF0dXMgPT09IDIwNiAmJlxuICAgIGludGVybmFsUmVzcG9uc2UucmFuZ2VSZXF1ZXN0ZWQgJiZcbiAgICAhcmVxdWVzdC5oZWFkZXJzLmNvbnRhaW5zKCdyYW5nZScpXG4gICkge1xuICAgIHJlc3BvbnNlID0gaW50ZXJuYWxSZXNwb25zZSA9IG1ha2VOZXR3b3JrRXJyb3IoKVxuICB9XG5cbiAgLy8gMTkuIElmIHJlc3BvbnNlIGlzIG5vdCBhIG5ldHdvcmsgZXJyb3IgYW5kIGVpdGhlciByZXF1ZXN04oCZcyBtZXRob2QgaXNcbiAgLy8gYEhFQURgIG9yIGBDT05ORUNUYCwgb3IgaW50ZXJuYWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIGEgbnVsbCBib2R5IHN0YXR1cyxcbiAgLy8gc2V0IGludGVybmFsUmVzcG9uc2XigJlzIGJvZHkgdG8gbnVsbCBhbmQgZGlzcmVnYXJkIGFueSBlbnF1ZXVpbmcgdG93YXJkXG4gIC8vIGl0IChpZiBhbnkpLlxuICBpZiAoXG4gICAgcmVzcG9uc2Uuc3RhdHVzICE9PSAwICYmXG4gICAgKHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcgfHxcbiAgICAgIHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcgfHxcbiAgICAgIG51bGxCb2R5U3RhdHVzLmluY2x1ZGVzKGludGVybmFsUmVzcG9uc2Uuc3RhdHVzKSlcbiAgKSB7XG4gICAgaW50ZXJuYWxSZXNwb25zZS5ib2R5ID0gbnVsbFxuICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZHVtcCA9IHRydWVcbiAgfVxuXG4gIC8vIDIwLiBJZiByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIHRoZW46XG4gIGlmIChyZXF1ZXN0LmludGVncml0eSkge1xuICAgIC8vIDEuIExldCBwcm9jZXNzQm9keUVycm9yIGJlIHRoaXMgc3RlcDogcnVuIGZldGNoIGZpbmFsZSBnaXZlbiBmZXRjaFBhcmFtc1xuICAgIC8vIGFuZCBhIG5ldHdvcmsgZXJyb3IuXG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChyZWFzb24pID0+XG4gICAgICBmZXRjaEZpbmFsZShmZXRjaFBhcmFtcywgbWFrZU5ldHdvcmtFcnJvcihyZWFzb24pKVxuXG4gICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJvcGFxdWVcIiwgb3IgcmVzcG9uc2XigJlzIGJvZHkgaXMgbnVsbCxcbiAgICAvLyB0aGVuIHJ1biBwcm9jZXNzQm9keUVycm9yIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnb3BhcXVlJyB8fCByZXNwb25zZS5ib2R5ID09IG51bGwpIHtcbiAgICAgIHByb2Nlc3NCb2R5RXJyb3IocmVzcG9uc2UuZXJyb3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAzLiBMZXQgcHJvY2Vzc0JvZHkgZ2l2ZW4gYnl0ZXMgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0JvZHkgPSAoYnl0ZXMpID0+IHtcbiAgICAgIC8vIDEuIElmIGJ5dGVzIGRvIG5vdCBtYXRjaCByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEsXG4gICAgICAvLyB0aGVuIHJ1biBwcm9jZXNzQm9keUVycm9yIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4gW1NSSV1cbiAgICAgIGlmICghYnl0ZXNNYXRjaChieXRlcywgcmVxdWVzdC5pbnRlZ3JpdHkpKSB7XG4gICAgICAgIHByb2Nlc3NCb2R5RXJyb3IoJ2ludGVncml0eSBtaXNtYXRjaCcpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyAyLiBTZXQgcmVzcG9uc2XigJlzIGJvZHkgdG8gYnl0ZXMgYXMgYSBib2R5LlxuICAgICAgcmVzcG9uc2UuYm9keSA9IHNhZmVseUV4dHJhY3RCb2R5KGJ5dGVzKVswXVxuXG4gICAgICAvLyAzLiBSdW4gZmV0Y2ggZmluYWxlIGdpdmVuIGZldGNoUGFyYW1zIGFuZCByZXNwb25zZS5cbiAgICAgIGZldGNoRmluYWxlKGZldGNoUGFyYW1zLCByZXNwb25zZSlcbiAgICB9XG5cbiAgICAvLyA0LiBGdWxseSByZWFkIHJlc3BvbnNl4oCZcyBib2R5IGdpdmVuIHByb2Nlc3NCb2R5IGFuZCBwcm9jZXNzQm9keUVycm9yLlxuICAgIGF3YWl0IGZ1bGx5UmVhZEJvZHkocmVzcG9uc2UuYm9keSwgcHJvY2Vzc0JvZHksIHByb2Nlc3NCb2R5RXJyb3IpXG4gIH0gZWxzZSB7XG4gICAgLy8gMjEuIE90aGVyd2lzZSwgcnVuIGZldGNoIGZpbmFsZSBnaXZlbiBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UuXG4gICAgZmV0Y2hGaW5hbGUoZmV0Y2hQYXJhbXMsIHJlc3BvbnNlKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXNjaGVtZS1mZXRjaFxuLy8gZ2l2ZW4gYSBmZXRjaCBwYXJhbXMgZmV0Y2hQYXJhbXNcbmZ1bmN0aW9uIHNjaGVtZUZldGNoIChmZXRjaFBhcmFtcykge1xuICAvLyBOb3RlOiBzaW5jZSB0aGUgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWQgb24gcmVkaXJlY3QsIHdoaWNoIHNldHMgZmV0Y2hQYXJhbXMgdG8gYVxuICAvLyBjYW5jZWxsZWQgc3RhdGUsIHdlIGRvIG5vdCB3YW50IHRoaXMgY29uZGl0aW9uIHRvIHRyaWdnZXIgKnVubGVzcyogdGhlcmUgaGF2ZSBiZWVuXG4gIC8vIG5vIHJlZGlyZWN0cy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xNzc2XG4gIC8vIDEuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmV0d29yayBlcnJvciBmb3IgZmV0Y2hQYXJhbXMuXG4gIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykgJiYgZmV0Y2hQYXJhbXMucmVxdWVzdC5yZWRpcmVjdENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpKVxuICB9XG5cbiAgLy8gMi4gTGV0IHJlcXVlc3QgYmUgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHsgcmVxdWVzdCB9ID0gZmV0Y2hQYXJhbXNcblxuICBjb25zdCB7IHByb3RvY29sOiBzY2hlbWUgfSA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG5cbiAgLy8gMy4gU3dpdGNoIG9uIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgYW5kIHJ1biB0aGUgYXNzb2NpYXRlZCBzdGVwczpcbiAgc3dpdGNoIChzY2hlbWUpIHtcbiAgICBjYXNlICdhYm91dDonOiB7XG4gICAgICAvLyBJZiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgcGF0aCBpcyB0aGUgc3RyaW5nIFwiYmxhbmtcIiwgdGhlbiByZXR1cm4gYSBuZXcgcmVzcG9uc2VcbiAgICAgIC8vIHdob3NlIHN0YXR1cyBtZXNzYWdlIGlzIGBPS2AsIGhlYWRlciBsaXN0IGlzIMKrIChgQ29udGVudC1UeXBlYCwgYHRleHQvaHRtbDtjaGFyc2V0PXV0Zi04YCkgwrssXG4gICAgICAvLyBhbmQgYm9keSBpcyB0aGUgZW1wdHkgYnl0ZSBzZXF1ZW5jZSBhcyBhIGJvZHkuXG5cbiAgICAgIC8vIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignYWJvdXQgc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQnKSlcbiAgICB9XG4gICAgY2FzZSAnYmxvYjonOiB7XG4gICAgICBpZiAoIXJlc29sdmVPYmplY3RVUkwpIHtcbiAgICAgICAgcmVzb2x2ZU9iamVjdFVSTCA9IHJlcXVpcmUoJ2J1ZmZlcicpLnJlc29sdmVPYmplY3RVUkxcbiAgICAgIH1cblxuICAgICAgLy8gMS4gTGV0IGJsb2JVUkxFbnRyeSBiZSByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgYmxvYiBVUkwgZW50cnkuXG4gICAgICBjb25zdCBibG9iVVJMRW50cnkgPSByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KVxuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2ViLXBsYXRmb3JtLXRlc3RzL3dwdC9ibG9iLzdiMGViYWNjYzYyYjU2NmExOTY1Mzk2ZTViZTdiYjJiYzA2Zjg0MWYvRmlsZUFQSS91cmwvcmVzb3VyY2VzL2ZldGNoLXRlc3RzLmpzI0w1Mi1MNTZcbiAgICAgIC8vIEJ1ZmZlci5yZXNvbHZlT2JqZWN0VVJMIGRvZXMgbm90IGlnbm9yZSBVUkwgcXVlcmllcy5cbiAgICAgIGlmIChibG9iVVJMRW50cnkuc2VhcmNoLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ05ldHdvcmtFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gZmV0Y2ggcmVzb3VyY2UuJykpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsb2JVUkxFbnRyeU9iamVjdCA9IHJlc29sdmVPYmplY3RVUkwoYmxvYlVSTEVudHJ5LnRvU3RyaW5nKCkpXG5cbiAgICAgIC8vIDIuIElmIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBub3QgYEdFVGAsIGJsb2JVUkxFbnRyeSBpcyBudWxsLCBvciBibG9iVVJMRW50cnnigJlzXG4gICAgICAvLyAgICBvYmplY3QgaXMgbm90IGEgQmxvYiBvYmplY3QsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gJ0dFVCcgfHwgIWlzQmxvYkxpa2UoYmxvYlVSTEVudHJ5T2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ2ludmFsaWQgbWV0aG9kJykpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIExldCBib2R5V2l0aFR5cGUgYmUgdGhlIHJlc3VsdCBvZiBzYWZlbHkgZXh0cmFjdGluZyBibG9iVVJMRW50cnnigJlzIG9iamVjdC5cbiAgICAgIGNvbnN0IGJvZHlXaXRoVHlwZSA9IHNhZmVseUV4dHJhY3RCb2R5KGJsb2JVUkxFbnRyeU9iamVjdClcblxuICAgICAgLy8gNC4gTGV0IGJvZHkgYmUgYm9keVdpdGhUeXBl4oCZcyBib2R5LlxuICAgICAgY29uc3QgYm9keSA9IGJvZHlXaXRoVHlwZVswXVxuXG4gICAgICAvLyA1LiBMZXQgbGVuZ3RoIGJlIGJvZHnigJlzIGxlbmd0aCwgc2VyaWFsaXplZCBhbmQgaXNvbW9ycGhpYyBlbmNvZGVkLlxuICAgICAgY29uc3QgbGVuZ3RoID0gaXNvbW9ycGhpY0VuY29kZShgJHtib2R5Lmxlbmd0aH1gKVxuXG4gICAgICAvLyA2LiBMZXQgdHlwZSBiZSBib2R5V2l0aFR5cGXigJlzIHR5cGUgaWYgaXQgaXMgbm9uLW51bGw7IG90aGVyd2lzZSB0aGUgZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgICAgIGNvbnN0IHR5cGUgPSBib2R5V2l0aFR5cGVbMV0gPz8gJydcblxuICAgICAgLy8gNy4gUmV0dXJuIGEgbmV3IHJlc3BvbnNlIHdob3NlIHN0YXR1cyBtZXNzYWdlIGlzIGBPS2AsIGhlYWRlciBsaXN0IGlzXG4gICAgICAvLyAgICDCqyAoYENvbnRlbnQtTGVuZ3RoYCwgbGVuZ3RoKSwgKGBDb250ZW50LVR5cGVgLCB0eXBlKSDCuywgYW5kIGJvZHkgaXMgYm9keS5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHtcbiAgICAgICAgc3RhdHVzVGV4dDogJ09LJyxcbiAgICAgICAgaGVhZGVyc0xpc3Q6IFtcbiAgICAgICAgICBbJ2NvbnRlbnQtbGVuZ3RoJywgeyBuYW1lOiAnQ29udGVudC1MZW5ndGgnLCB2YWx1ZTogbGVuZ3RoIH1dLFxuICAgICAgICAgIFsnY29udGVudC10eXBlJywgeyBuYW1lOiAnQ29udGVudC1UeXBlJywgdmFsdWU6IHR5cGUgfV1cbiAgICAgICAgXVxuICAgICAgfSlcblxuICAgICAgcmVzcG9uc2UuYm9keSA9IGJvZHlcblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSlcbiAgICB9XG4gICAgY2FzZSAnZGF0YTonOiB7XG4gICAgICAvLyAxLiBMZXQgZGF0YVVSTFN0cnVjdCBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlXG4gICAgICAvLyAgICBkYXRhOiBVUkwgcHJvY2Vzc29yIG9uIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMLlxuICAgICAgY29uc3QgY3VycmVudFVSTCA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG4gICAgICBjb25zdCBkYXRhVVJMU3RydWN0ID0gZGF0YVVSTFByb2Nlc3NvcihjdXJyZW50VVJMKVxuXG4gICAgICAvLyAyLiBJZiBkYXRhVVJMU3RydWN0IGlzIGZhaWx1cmUsIHRoZW4gcmV0dXJuIGFcbiAgICAgIC8vICAgIG5ldHdvcmsgZXJyb3IuXG4gICAgICBpZiAoZGF0YVVSTFN0cnVjdCA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignZmFpbGVkIHRvIGZldGNoIHRoZSBkYXRhIFVSTCcpKVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBMZXQgbWltZVR5cGUgYmUgZGF0YVVSTFN0cnVjdOKAmXMgTUlNRSB0eXBlLCBzZXJpYWxpemVkLlxuICAgICAgY29uc3QgbWltZVR5cGUgPSBzZXJpYWxpemVBTWltZVR5cGUoZGF0YVVSTFN0cnVjdC5taW1lVHlwZSlcblxuICAgICAgLy8gNC4gUmV0dXJuIGEgcmVzcG9uc2Ugd2hvc2Ugc3RhdHVzIG1lc3NhZ2UgaXMgYE9LYCxcbiAgICAgIC8vICAgIGhlYWRlciBsaXN0IGlzIMKrIChgQ29udGVudC1UeXBlYCwgbWltZVR5cGUpIMK7LFxuICAgICAgLy8gICAgYW5kIGJvZHkgaXMgZGF0YVVSTFN0cnVjdOKAmXMgYm9keSBhcyBhIGJvZHkuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VSZXNwb25zZSh7XG4gICAgICAgIHN0YXR1c1RleHQ6ICdPSycsXG4gICAgICAgIGhlYWRlcnNMaXN0OiBbXG4gICAgICAgICAgWydjb250ZW50LXR5cGUnLCB7IG5hbWU6ICdDb250ZW50LVR5cGUnLCB2YWx1ZTogbWltZVR5cGUgfV1cbiAgICAgICAgXSxcbiAgICAgICAgYm9keTogc2FmZWx5RXh0cmFjdEJvZHkoZGF0YVVSTFN0cnVjdC5ib2R5KVswXVxuICAgICAgfSkpXG4gICAgfVxuICAgIGNhc2UgJ2ZpbGU6Jzoge1xuICAgICAgLy8gRm9yIG5vdywgdW5mb3J0dW5hdGUgYXMgaXQgaXMsIGZpbGUgVVJMcyBhcmUgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci5cbiAgICAgIC8vIFdoZW4gaW4gZG91YnQsIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ25vdCBpbXBsZW1lbnRlZC4uLiB5ZXQuLi4nKSlcbiAgICB9XG4gICAgY2FzZSAnaHR0cDonOlxuICAgIGNhc2UgJ2h0dHBzOic6IHtcbiAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cblxuICAgICAgcmV0dXJuIGh0dHBGZXRjaChmZXRjaFBhcmFtcylcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IG1ha2VOZXR3b3JrRXJyb3IoZXJyKSlcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCd1bmtub3duIHNjaGVtZScpKVxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmluYWxpemUtcmVzcG9uc2VcbmZ1bmN0aW9uIGZpbmFsaXplUmVzcG9uc2UgKGZldGNoUGFyYW1zLCByZXNwb25zZSkge1xuICAvLyAxLiBTZXQgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3TigJlzIGRvbmUgZmxhZy5cbiAgZmV0Y2hQYXJhbXMucmVxdWVzdC5kb25lID0gdHJ1ZVxuXG4gIC8vIDIsIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGRvbmUgaXMgbm90IG51bGwsIHRoZW4gcXVldWUgYSBmZXRjaFxuICAvLyB0YXNrIHRvIHJ1biBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZSBkb25lIGdpdmVuIHJlc3BvbnNlLCB3aXRoXG4gIC8vIGZldGNoUGFyYW1z4oCZcyB0YXNrIGRlc3RpbmF0aW9uLlxuICBpZiAoZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlRG9uZSAhPSBudWxsKSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlRG9uZShyZXNwb25zZSkpXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2ZldGNoLWZpbmFsZVxuZnVuY3Rpb24gZmV0Y2hGaW5hbGUgKGZldGNoUGFyYW1zLCByZXNwb25zZSkge1xuICAvLyAxLiBJZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3IsIHRoZW46XG4gIGlmIChyZXNwb25zZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgLy8gMS4gU2V0IHJlc3BvbnNl4oCZcyBVUkwgbGlzdCB0byDCqyBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgVVJMIGxpc3RbMF0gwrsuXG4gICAgcmVzcG9uc2UudXJsTGlzdCA9IFtmZXRjaFBhcmFtcy5yZXF1ZXN0LnVybExpc3RbMF1dXG5cbiAgICAvLyAyLiBTZXQgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvIHRvIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gb3BhcXVlIHRpbWluZ1xuICAgIC8vIGluZm8gZm9yIGZldGNoUGFyYW1z4oCZcyB0aW1pbmcgaW5mby5cbiAgICByZXNwb25zZS50aW1pbmdJbmZvID0gY3JlYXRlT3BhcXVlVGltaW5nSW5mbyh7XG4gICAgICBzdGFydFRpbWU6IGZldGNoUGFyYW1zLnRpbWluZ0luZm8uc3RhcnRUaW1lXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIuIExldCBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkgYmUgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgY29uc3QgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5ID0gKCkgPT4ge1xuICAgIC8vIDEuIFNldCBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgZG9uZSBmbGFnLlxuICAgIGZldGNoUGFyYW1zLnJlcXVlc3QuZG9uZSA9IHRydWVcblxuICAgIC8vIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGVuZC1vZi1ib2R5IGlzIG5vdCBudWxsLFxuICAgIC8vIHRoZW4gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZVxuICAgIC8vIGVuZC1vZi1ib2R5IGdpdmVuIHJlc3BvbnNlIHdpdGggZmV0Y2hQYXJhbXPigJlzIHRhc2sgZGVzdGluYXRpb24uXG4gICAgaWYgKGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSAhPSBudWxsKSB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkocmVzcG9uc2UpKVxuICAgIH1cbiAgfVxuXG4gIC8vIDMuIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGlzIG5vbi1udWxsLCB0aGVuIHF1ZXVlIGEgZmV0Y2ggdGFza1xuICAvLyB0byBydW4gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVzcG9uc2UgZ2l2ZW4gcmVzcG9uc2UsIHdpdGggZmV0Y2hQYXJhbXPigJlzXG4gIC8vIHRhc2sgZGVzdGluYXRpb24uXG4gIGlmIChmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2UgIT0gbnVsbCkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSkpXG4gIH1cblxuICAvLyA0LiBJZiByZXNwb25zZeKAmXMgYm9keSBpcyBudWxsLCB0aGVuIHJ1biBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkuXG4gIGlmIChyZXNwb25zZS5ib2R5ID09IG51bGwpIHtcbiAgICBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkoKVxuICB9IGVsc2Uge1xuICAvLyA1LiBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBMZXQgdHJhbnNmb3JtU3RyZWFtIGJlIGEgbmV3IGEgVHJhbnNmb3JtU3RyZWFtLlxuXG4gICAgLy8gMi4gTGV0IGlkZW50aXR5VHJhbnNmb3JtQWxnb3JpdGhtIGJlIGFuIGFsZ29yaXRobSB3aGljaCwgZ2l2ZW4gY2h1bmssXG4gICAgLy8gZW5xdWV1ZXMgY2h1bmsgaW4gdHJhbnNmb3JtU3RyZWFtLlxuICAgIGNvbnN0IGlkZW50aXR5VHJhbnNmb3JtQWxnb3JpdGhtID0gKGNodW5rLCBjb250cm9sbGVyKSA9PiB7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUoY2h1bmspXG4gICAgfVxuXG4gICAgLy8gMy4gU2V0IHVwIHRyYW5zZm9ybVN0cmVhbSB3aXRoIHRyYW5zZm9ybUFsZ29yaXRobSBzZXQgdG8gaWRlbnRpdHlUcmFuc2Zvcm1BbGdvcml0aG1cbiAgICAvLyBhbmQgZmx1c2hBbGdvcml0aG0gc2V0IHRvIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keS5cbiAgICBjb25zdCB0cmFuc2Zvcm1TdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgIHN0YXJ0ICgpIHt9LFxuICAgICAgdHJhbnNmb3JtOiBpZGVudGl0eVRyYW5zZm9ybUFsZ29yaXRobSxcbiAgICAgIGZsdXNoOiBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHlcbiAgICB9LCB7XG4gICAgICBzaXplICgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBzaXplICgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gNC4gU2V0IHJlc3BvbnNl4oCZcyBib2R5IHRvIHRoZSByZXN1bHQgb2YgcGlwaW5nIHJlc3BvbnNl4oCZcyBib2R5IHRocm91Z2ggdHJhbnNmb3JtU3RyZWFtLlxuICAgIHJlc3BvbnNlLmJvZHkgPSB7IHN0cmVhbTogcmVzcG9uc2UuYm9keS5zdHJlYW0ucGlwZVRocm91Z2godHJhbnNmb3JtU3RyZWFtKSB9XG4gIH1cblxuICAvLyA2LiBJZiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZSBjb25zdW1lIGJvZHkgaXMgbm9uLW51bGwsIHRoZW46XG4gIGlmIChmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keSAhPSBudWxsKSB7XG4gICAgLy8gMS4gTGV0IHByb2Nlc3NCb2R5IGdpdmVuIG51bGxPckJ5dGVzIGJlIHRoaXMgc3RlcDogcnVuIGZldGNoUGFyYW1z4oCZc1xuICAgIC8vIHByb2Nlc3MgcmVzcG9uc2UgY29uc3VtZSBib2R5IGdpdmVuIHJlc3BvbnNlIGFuZCBudWxsT3JCeXRlcy5cbiAgICBjb25zdCBwcm9jZXNzQm9keSA9IChudWxsT3JCeXRlcykgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHkocmVzcG9uc2UsIG51bGxPckJ5dGVzKVxuXG4gICAgLy8gMi4gTGV0IHByb2Nlc3NCb2R5RXJyb3IgYmUgdGhpcyBzdGVwOiBydW4gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3NcbiAgICAvLyByZXNwb25zZSBjb25zdW1lIGJvZHkgZ2l2ZW4gcmVzcG9uc2UgYW5kIGZhaWx1cmUuXG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChmYWlsdXJlKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keShyZXNwb25zZSwgZmFpbHVyZSlcblxuICAgIC8vIDMuIElmIHJlc3BvbnNl4oCZcyBib2R5IGlzIG51bGwsIHRoZW4gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keVxuICAgIC8vIGdpdmVuIG51bGwsIHdpdGggZmV0Y2hQYXJhbXPigJlzIHRhc2sgZGVzdGluYXRpb24uXG4gICAgaWYgKHJlc3BvbnNlLmJvZHkgPT0gbnVsbCkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gcHJvY2Vzc0JvZHkobnVsbCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgZnVsbHkgcmVhZCByZXNwb25zZeKAmXMgYm9keSBnaXZlbiBwcm9jZXNzQm9keSwgcHJvY2Vzc0JvZHlFcnJvcixcbiAgICAgIC8vIGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgICAgIHJldHVybiBmdWxseVJlYWRCb2R5KHJlc3BvbnNlLmJvZHksIHByb2Nlc3NCb2R5LCBwcm9jZXNzQm9keUVycm9yKVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaHR0cC1mZXRjaFxuYXN5bmMgZnVuY3Rpb24gaHR0cEZldGNoIChmZXRjaFBhcmFtcykge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDMuIExldCBhY3R1YWxSZXNwb25zZSBiZSBudWxsLlxuICBsZXQgYWN0dWFsUmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gNC4gTGV0IHRpbWluZ0luZm8gYmUgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICBjb25zdCB0aW1pbmdJbmZvID0gZmV0Y2hQYXJhbXMudGltaW5nSW5mb1xuXG4gIC8vIDUuIElmIHJlcXVlc3TigJlzIHNlcnZpY2Utd29ya2VycyBtb2RlIGlzIFwiYWxsXCIsIHRoZW46XG4gIGlmIChyZXF1ZXN0LnNlcnZpY2VXb3JrZXJzID09PSAnYWxsJykge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDYuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW46XG4gIGlmIChyZXNwb25zZSA9PT0gbnVsbCkge1xuICAgIC8vIDEuIElmIG1ha2VDT1JTUHJlZmxpZ2h0IGlzIHRydWUgYW5kIG9uZSBvZiB0aGVzZSBjb25kaXRpb25zIGlzIHRydWU6XG4gICAgLy8gVE9ET1xuXG4gICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSBpcyBcImZvbGxvd1wiLCB0aGVuIHNldCByZXF1ZXN04oCZc1xuICAgIC8vIHNlcnZpY2Utd29ya2VycyBtb2RlIHRvIFwibm9uZVwiLlxuICAgIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnZm9sbG93Jykge1xuICAgICAgcmVxdWVzdC5zZXJ2aWNlV29ya2VycyA9ICdub25lJ1xuICAgIH1cblxuICAgIC8vIDMuIFNldCByZXNwb25zZSBhbmQgYWN0dWFsUmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgLy8gSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgIGFjdHVhbFJlc3BvbnNlID0gcmVzcG9uc2UgPSBhd2FpdCBodHRwTmV0d29ya09yQ2FjaGVGZXRjaChmZXRjaFBhcmFtcylcblxuICAgIC8vIDQuIElmIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIGlzIFwiY29yc1wiIGFuZCBhIENPUlMgY2hlY2tcbiAgICAvLyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmV0dXJucyBmYWlsdXJlLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgaWYgKFxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycgJiZcbiAgICAgIGNvcnNDaGVjayhyZXF1ZXN0LCByZXNwb25zZSkgPT09ICdmYWlsdXJlJ1xuICAgICkge1xuICAgICAgcmV0dXJuIG1ha2VOZXR3b3JrRXJyb3IoJ2NvcnMgZmFpbHVyZScpXG4gICAgfVxuXG4gICAgLy8gNS4gSWYgdGhlIFRBTyBjaGVjayBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmV0dXJucyBmYWlsdXJlLCB0aGVuIHNldFxuICAgIC8vIHJlcXVlc3TigJlzIHRpbWluZyBhbGxvdyBmYWlsZWQgZmxhZy5cbiAgICBpZiAoVEFPQ2hlY2socmVxdWVzdCwgcmVzcG9uc2UpID09PSAnZmFpbHVyZScpIHtcbiAgICAgIHJlcXVlc3QudGltaW5nQWxsb3dGYWlsZWQgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgLy8gNy4gSWYgZWl0aGVyIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIG9yIHJlc3BvbnNl4oCZcyB0eXBlXG4gIC8vIGlzIFwib3BhcXVlXCIsIGFuZCB0aGUgY3Jvc3Mtb3JpZ2luIHJlc291cmNlIHBvbGljeSBjaGVjayB3aXRoXG4gIC8vIHJlcXVlc3TigJlzIG9yaWdpbiwgcmVxdWVzdOKAmXMgY2xpZW50LCByZXF1ZXN04oCZcyBkZXN0aW5hdGlvbixcbiAgLy8gYW5kIGFjdHVhbFJlc3BvbnNlIHJldHVybnMgYmxvY2tlZCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAoXG4gICAgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ29wYXF1ZScgfHwgcmVzcG9uc2UudHlwZSA9PT0gJ29wYXF1ZScpICYmXG4gICAgY3Jvc3NPcmlnaW5SZXNvdXJjZVBvbGljeUNoZWNrKFxuICAgICAgcmVxdWVzdC5vcmlnaW4sXG4gICAgICByZXF1ZXN0LmNsaWVudCxcbiAgICAgIHJlcXVlc3QuZGVzdGluYXRpb24sXG4gICAgICBhY3R1YWxSZXNwb25zZVxuICAgICkgPT09ICdibG9ja2VkJ1xuICApIHtcbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignYmxvY2tlZCcpXG4gIH1cblxuICAvLyA4LiBJZiBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIGEgcmVkaXJlY3Qgc3RhdHVzLCB0aGVuOlxuICBpZiAocmVkaXJlY3RTdGF0dXNTZXQuaGFzKGFjdHVhbFJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAvLyAxLiBJZiBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIG5vdCAzMDMsIHJlcXVlc3TigJlzIGJvZHkgaXMgbm90IG51bGwsXG4gICAgLy8gYW5kIHRoZSBjb25uZWN0aW9uIHVzZXMgSFRUUC8yLCB0aGVuIHVzZXIgYWdlbnRzIG1heSwgYW5kIGFyZSBldmVuXG4gICAgLy8gZW5jb3VyYWdlZCB0bywgdHJhbnNtaXQgYW4gUlNUX1NUUkVBTSBmcmFtZS5cbiAgICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyODhcbiAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCAhPT0gJ21hbnVhbCcpIHtcbiAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbi5kZXN0cm95KClcbiAgICB9XG5cbiAgICAvLyAyLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZTpcbiAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCA9PT0gJ2Vycm9yJykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIGEgbmV0d29yayBlcnJvci5cbiAgICAgIHJlc3BvbnNlID0gbWFrZU5ldHdvcmtFcnJvcigndW5leHBlY3RlZCByZWRpcmVjdCcpXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnbWFudWFsJykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIGFuIG9wYXF1ZS1yZWRpcmVjdCBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSBpbnRlcm5hbFxuICAgICAgLy8gcmVzcG9uc2UgaXMgYWN0dWFsUmVzcG9uc2UuXG4gICAgICAvLyBOT1RFKHNwZWMpOiBPbiB0aGUgd2ViIHRoaXMgd291bGQgcmV0dXJuIGFuIGBvcGFxdWVyZWRpcmVjdGAgcmVzcG9uc2UsXG4gICAgICAvLyBidXQgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2VydmVyIHNpZGUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzExOTMuXG4gICAgICByZXNwb25zZSA9IGFjdHVhbFJlc3BvbnNlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnZm9sbG93Jykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQLXJlZGlyZWN0IGZldGNoIGdpdmVuXG4gICAgICAvLyBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UuXG4gICAgICByZXNwb25zZSA9IGF3YWl0IGh0dHBSZWRpcmVjdEZldGNoKGZldGNoUGFyYW1zLCByZXNwb25zZSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIC8vIDkuIFNldCByZXNwb25zZeKAmXMgdGltaW5nIGluZm8gdG8gdGltaW5nSW5mby5cbiAgcmVzcG9uc2UudGltaW5nSW5mbyA9IHRpbWluZ0luZm9cblxuICAvLyAxMC4gUmV0dXJuIHJlc3BvbnNlLlxuICByZXR1cm4gcmVzcG9uc2Vcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtcmVkaXJlY3QtZmV0Y2hcbmZ1bmN0aW9uIGh0dHBSZWRpcmVjdEZldGNoIChmZXRjaFBhcmFtcywgcmVzcG9uc2UpIHtcbiAgLy8gMS4gTGV0IHJlcXVlc3QgYmUgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHJlcXVlc3QgPSBmZXRjaFBhcmFtcy5yZXF1ZXN0XG5cbiAgLy8gMi4gTGV0IGFjdHVhbFJlc3BvbnNlIGJlIHJlc3BvbnNlLCBpZiByZXNwb25zZSBpcyBub3QgYSBmaWx0ZXJlZCByZXNwb25zZSxcbiAgLy8gYW5kIHJlc3BvbnNl4oCZcyBpbnRlcm5hbCByZXNwb25zZSBvdGhlcndpc2UuXG4gIGNvbnN0IGFjdHVhbFJlc3BvbnNlID0gcmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZVxuICAgID8gcmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZVxuICAgIDogcmVzcG9uc2VcblxuICAvLyAzLiBMZXQgbG9jYXRpb25VUkwgYmUgYWN0dWFsUmVzcG9uc2XigJlzIGxvY2F0aW9uIFVSTCBnaXZlbiByZXF1ZXN04oCZcyBjdXJyZW50XG4gIC8vIFVSTOKAmXMgZnJhZ21lbnQuXG4gIGxldCBsb2NhdGlvblVSTFxuXG4gIHRyeSB7XG4gICAgbG9jYXRpb25VUkwgPSByZXNwb25zZUxvY2F0aW9uVVJMKFxuICAgICAgYWN0dWFsUmVzcG9uc2UsXG4gICAgICByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KS5oYXNoXG4gICAgKVxuXG4gICAgLy8gNC4gSWYgbG9jYXRpb25VUkwgaXMgbnVsbCwgdGhlbiByZXR1cm4gcmVzcG9uc2UuXG4gICAgaWYgKGxvY2F0aW9uVVJMID09IG51bGwpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gNS4gSWYgbG9jYXRpb25VUkwgaXMgZmFpbHVyZSwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcihlcnIpKVxuICB9XG5cbiAgLy8gNi4gSWYgbG9jYXRpb25VUkzigJlzIHNjaGVtZSBpcyBub3QgYW4gSFRUUChTKSBzY2hlbWUsIHRoZW4gcmV0dXJuIGEgbmV0d29ya1xuICAvLyBlcnJvci5cbiAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShsb2NhdGlvblVSTCkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ1VSTCBzY2hlbWUgbXVzdCBiZSBhIEhUVFAoUykgc2NoZW1lJykpXG4gIH1cblxuICAvLyA3LiBJZiByZXF1ZXN04oCZcyByZWRpcmVjdCBjb3VudCBpcyAyMCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAocmVxdWVzdC5yZWRpcmVjdENvdW50ID09PSAyMCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcigncmVkaXJlY3QgY291bnQgZXhjZWVkZWQnKSlcbiAgfVxuXG4gIC8vIDguIEluY3JlYXNlIHJlcXVlc3TigJlzIHJlZGlyZWN0IGNvdW50IGJ5IDEuXG4gIHJlcXVlc3QucmVkaXJlY3RDb3VudCArPSAxXG5cbiAgLy8gOS4gSWYgcmVxdWVzdOKAmXMgbW9kZSBpcyBcImNvcnNcIiwgbG9jYXRpb25VUkwgaW5jbHVkZXMgY3JlZGVudGlhbHMsIGFuZFxuICAvLyByZXF1ZXN04oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggbG9jYXRpb25VUkzigJlzIG9yaWdpbiwgdGhlbiByZXR1cm5cbiAgLy8gIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIHJlcXVlc3QubW9kZSA9PT0gJ2NvcnMnICYmXG4gICAgKGxvY2F0aW9uVVJMLnVzZXJuYW1lIHx8IGxvY2F0aW9uVVJMLnBhc3N3b3JkKSAmJlxuICAgICFzYW1lT3JpZ2luKHJlcXVlc3QsIGxvY2F0aW9uVVJMKVxuICApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ2Nyb3NzIG9yaWdpbiBub3QgYWxsb3dlZCBmb3IgcmVxdWVzdCBtb2RlIFwiY29yc1wiJykpXG4gIH1cblxuICAvLyAxMC4gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJjb3JzXCIgYW5kIGxvY2F0aW9uVVJMIGluY2x1ZGVzXG4gIC8vIGNyZWRlbnRpYWxzLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChcbiAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJyAmJlxuICAgIChsb2NhdGlvblVSTC51c2VybmFtZSB8fCBsb2NhdGlvblVSTC5wYXNzd29yZClcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKFxuICAgICAgJ1VSTCBjYW5ub3QgY29udGFpbiBjcmVkZW50aWFscyBmb3IgcmVxdWVzdCBtb2RlIFwiY29yc1wiJ1xuICAgICkpXG4gIH1cblxuICAvLyAxMS4gSWYgYWN0dWFsUmVzcG9uc2XigJlzIHN0YXR1cyBpcyBub3QgMzAzLCByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLFxuICAvLyBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIGFjdHVhbFJlc3BvbnNlLnN0YXR1cyAhPT0gMzAzICYmXG4gICAgcmVxdWVzdC5ib2R5ICE9IG51bGwgJiZcbiAgICByZXF1ZXN0LmJvZHkuc291cmNlID09IG51bGxcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCkpXG4gIH1cblxuICAvLyAxMi4gSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZVxuICAvLyAtIGFjdHVhbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzAxIG9yIDMwMiBhbmQgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIGBQT1NUYFxuICAvLyAtIGFjdHVhbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzAzIGFuZCByZXF1ZXN04oCZcyBtZXRob2QgaXMgbm90IGBHRVRgIG9yIGBIRUFEYFxuICBpZiAoXG4gICAgKFszMDEsIDMwMl0uaW5jbHVkZXMoYWN0dWFsUmVzcG9uc2Uuc3RhdHVzKSAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnKSB8fFxuICAgIChhY3R1YWxSZXNwb25zZS5zdGF0dXMgPT09IDMwMyAmJlxuICAgICAgIUdFVF9PUl9IRUFELmluY2x1ZGVzKHJlcXVlc3QubWV0aG9kKSlcbiAgKSB7XG4gICAgLy8gdGhlbjpcbiAgICAvLyAxLiBTZXQgcmVxdWVzdOKAmXMgbWV0aG9kIHRvIGBHRVRgIGFuZCByZXF1ZXN04oCZcyBib2R5IHRvIG51bGwuXG4gICAgcmVxdWVzdC5tZXRob2QgPSAnR0VUJ1xuICAgIHJlcXVlc3QuYm9keSA9IG51bGxcblxuICAgIC8vIDIuIEZvciBlYWNoIGhlYWRlck5hbWUgb2YgcmVxdWVzdC1ib2R5LWhlYWRlciBuYW1lLCBkZWxldGUgaGVhZGVyTmFtZSBmcm9tXG4gICAgLy8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgZm9yIChjb25zdCBoZWFkZXJOYW1lIG9mIHJlcXVlc3RCb2R5SGVhZGVyKSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZShoZWFkZXJOYW1lKVxuICAgIH1cbiAgfVxuXG4gIC8vIDEzLiBJZiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgb3JpZ2luIGlzIG5vdCBzYW1lIG9yaWdpbiB3aXRoIGxvY2F0aW9uVVJM4oCZc1xuICAvLyAgICAgb3JpZ2luLCB0aGVuIGZvciBlYWNoIGhlYWRlck5hbWUgb2YgQ09SUyBub24td2lsZGNhcmQgcmVxdWVzdC1oZWFkZXIgbmFtZSxcbiAgLy8gICAgIGRlbGV0ZSBoZWFkZXJOYW1lIGZyb20gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmICghc2FtZU9yaWdpbihyZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KSwgbG9jYXRpb25VUkwpKSB7XG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvcnMtbm9uLXdpbGRjYXJkLXJlcXVlc3QtaGVhZGVyLW5hbWVcbiAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZSgnYXV0aG9yaXphdGlvbicpXG5cbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYXV0aGVudGljYXRpb24tZW50cmllc1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuZGVsZXRlKCdwcm94eS1hdXRob3JpemF0aW9uJywgdHJ1ZSlcblxuICAgIC8vIFwiQ29va2llXCIgYW5kIFwiSG9zdFwiIGFyZSBmb3JiaWRkZW4gcmVxdWVzdC1oZWFkZXJzLCB3aGljaCB1bmRpY2kgZG9lc24ndCBpbXBsZW1lbnQuXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoJ2Nvb2tpZScpXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoJ2hvc3QnKVxuICB9XG5cbiAgLy8gMTQuIElmIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGJvZHkgdG8gdGhlIGZpcnN0IHJldHVyblxuICAvLyB2YWx1ZSBvZiBzYWZlbHkgZXh0cmFjdGluZyByZXF1ZXN04oCZcyBib2R54oCZcyBzb3VyY2UuXG4gIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgIGFzc2VydChyZXF1ZXN0LmJvZHkuc291cmNlICE9IG51bGwpXG4gICAgcmVxdWVzdC5ib2R5ID0gc2FmZWx5RXh0cmFjdEJvZHkocmVxdWVzdC5ib2R5LnNvdXJjZSlbMF1cbiAgfVxuXG4gIC8vIDE1LiBMZXQgdGltaW5nSW5mbyBiZSBmZXRjaFBhcmFtc+KAmXMgdGltaW5nIGluZm8uXG4gIGNvbnN0IHRpbWluZ0luZm8gPSBmZXRjaFBhcmFtcy50aW1pbmdJbmZvXG5cbiAgLy8gMTYuIFNldCB0aW1pbmdJbmZv4oCZcyByZWRpcmVjdCBlbmQgdGltZSBhbmQgcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lIHRvIHRoZVxuICAvLyBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZSBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkXG4gIC8vIGNhcGFiaWxpdHkuXG4gIHRpbWluZ0luZm8ucmVkaXJlY3RFbmRUaW1lID0gdGltaW5nSW5mby5wb3N0UmVkaXJlY3RTdGFydFRpbWUgPVxuICAgIGNvYXJzZW5lZFNoYXJlZEN1cnJlbnRUaW1lKGZldGNoUGFyYW1zLmNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5KVxuXG4gIC8vIDE3LiBJZiB0aW1pbmdJbmZv4oCZcyByZWRpcmVjdCBzdGFydCB0aW1lIGlzIDAsIHRoZW4gc2V0IHRpbWluZ0luZm/igJlzXG4gIC8vICByZWRpcmVjdCBzdGFydCB0aW1lIHRvIHRpbWluZ0luZm/igJlzIHN0YXJ0IHRpbWUuXG4gIGlmICh0aW1pbmdJbmZvLnJlZGlyZWN0U3RhcnRUaW1lID09PSAwKSB7XG4gICAgdGltaW5nSW5mby5yZWRpcmVjdFN0YXJ0VGltZSA9IHRpbWluZ0luZm8uc3RhcnRUaW1lXG4gIH1cblxuICAvLyAxOC4gQXBwZW5kIGxvY2F0aW9uVVJMIHRvIHJlcXVlc3TigJlzIFVSTCBsaXN0LlxuICByZXF1ZXN0LnVybExpc3QucHVzaChsb2NhdGlvblVSTClcblxuICAvLyAxOS4gSW52b2tlIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgb24gcmVkaXJlY3Qgb24gcmVxdWVzdCBhbmRcbiAgLy8gYWN0dWFsUmVzcG9uc2UuXG4gIHNldFJlcXVlc3RSZWZlcnJlclBvbGljeU9uUmVkaXJlY3QocmVxdWVzdCwgYWN0dWFsUmVzcG9uc2UpXG5cbiAgLy8gMjAuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgbWFpbiBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcyBhbmQgdHJ1ZS5cbiAgcmV0dXJuIG1haW5GZXRjaChmZXRjaFBhcmFtcywgdHJ1ZSlcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtbmV0d29yay1vci1jYWNoZS1mZXRjaFxuYXN5bmMgZnVuY3Rpb24gaHR0cE5ldHdvcmtPckNhY2hlRmV0Y2ggKFxuICBmZXRjaFBhcmFtcyxcbiAgaXNBdXRoZW50aWNhdGlvbkZldGNoID0gZmFsc2UsXG4gIGlzTmV3Q29ubmVjdGlvbkZldGNoID0gZmFsc2Vcbikge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgaHR0cEZldGNoUGFyYW1zIGJlIG51bGwuXG4gIGxldCBodHRwRmV0Y2hQYXJhbXMgPSBudWxsXG5cbiAgLy8gMy4gTGV0IGh0dHBSZXF1ZXN0IGJlIG51bGwuXG4gIGxldCBodHRwUmVxdWVzdCA9IG51bGxcblxuICAvLyA0LiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDUuIExldCBzdG9yZWRSZXNwb25zZSBiZSBudWxsLlxuICAvLyBUT0RPOiBjYWNoZVxuXG4gIC8vIDYuIExldCBodHRwQ2FjaGUgYmUgbnVsbC5cbiAgY29uc3QgaHR0cENhY2hlID0gbnVsbFxuXG4gIC8vIDcuIExldCB0aGUgcmV2YWxpZGF0aW5nRmxhZyBiZSB1bnNldC5cbiAgY29uc3QgcmV2YWxpZGF0aW5nRmxhZyA9IGZhbHNlXG5cbiAgLy8gOC4gUnVuIHRoZXNlIHN0ZXBzLCBidXQgYWJvcnQgd2hlbiB0aGUgb25nb2luZyBmZXRjaCBpcyB0ZXJtaW5hdGVkOlxuXG4gIC8vICAgIDEuIElmIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBcIm5vLXdpbmRvd1wiIGFuZCByZXF1ZXN04oCZcyByZWRpcmVjdCBtb2RlIGlzXG4gIC8vICAgIFwiZXJyb3JcIiwgdGhlbiBzZXQgaHR0cEZldGNoUGFyYW1zIHRvIGZldGNoUGFyYW1zIGFuZCBodHRwUmVxdWVzdCB0b1xuICAvLyAgICByZXF1ZXN0LlxuICBpZiAocmVxdWVzdC53aW5kb3cgPT09ICduby13aW5kb3cnICYmIHJlcXVlc3QucmVkaXJlY3QgPT09ICdlcnJvcicpIHtcbiAgICBodHRwRmV0Y2hQYXJhbXMgPSBmZXRjaFBhcmFtc1xuICAgIGh0dHBSZXF1ZXN0ID0gcmVxdWVzdFxuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIFNldCBodHRwUmVxdWVzdCB0byBhIGNsb25lIG9mIHJlcXVlc3QuXG4gICAgaHR0cFJlcXVlc3QgPSBtYWtlUmVxdWVzdChyZXF1ZXN0KVxuXG4gICAgLy8gMi4gU2V0IGh0dHBGZXRjaFBhcmFtcyB0byBhIGNvcHkgb2YgZmV0Y2hQYXJhbXMuXG4gICAgaHR0cEZldGNoUGFyYW1zID0geyAuLi5mZXRjaFBhcmFtcyB9XG5cbiAgICAvLyAzLiBTZXQgaHR0cEZldGNoUGFyYW1z4oCZcyByZXF1ZXN0IHRvIGh0dHBSZXF1ZXN0LlxuICAgIGh0dHBGZXRjaFBhcmFtcy5yZXF1ZXN0ID0gaHR0cFJlcXVlc3RcbiAgfVxuXG4gIC8vICAgIDMuIExldCBpbmNsdWRlQ3JlZGVudGlhbHMgYmUgdHJ1ZSBpZiBvbmUgb2ZcbiAgY29uc3QgaW5jbHVkZUNyZWRlbnRpYWxzID1cbiAgICByZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScgfHxcbiAgICAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ3NhbWUtb3JpZ2luJyAmJlxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKVxuXG4gIC8vICAgIDQuIExldCBjb250ZW50TGVuZ3RoIGJlIGh0dHBSZXF1ZXN04oCZcyBib2R54oCZcyBsZW5ndGgsIGlmIGh0dHBSZXF1ZXN04oCZc1xuICAvLyAgICBib2R5IGlzIG5vbi1udWxsOyBvdGhlcndpc2UgbnVsbC5cbiAgY29uc3QgY29udGVudExlbmd0aCA9IGh0dHBSZXF1ZXN0LmJvZHkgPyBodHRwUmVxdWVzdC5ib2R5Lmxlbmd0aCA6IG51bGxcblxuICAvLyAgICA1LiBMZXQgY29udGVudExlbmd0aEhlYWRlclZhbHVlIGJlIG51bGwuXG4gIGxldCBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSBudWxsXG5cbiAgLy8gICAgNi4gSWYgaHR0cFJlcXVlc3TigJlzIGJvZHkgaXMgbnVsbCBhbmQgaHR0cFJlcXVlc3TigJlzIG1ldGhvZCBpcyBgUE9TVGAgb3JcbiAgLy8gICAgYFBVVGAsIHRoZW4gc2V0IGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSB0byBgMGAuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5ib2R5ID09IG51bGwgJiZcbiAgICBbJ1BPU1QnLCAnUFVUJ10uaW5jbHVkZXMoaHR0cFJlcXVlc3QubWV0aG9kKVxuICApIHtcbiAgICBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSAnMCdcbiAgfVxuXG4gIC8vICAgIDcuIElmIGNvbnRlbnRMZW5ndGggaXMgbm9uLW51bGwsIHRoZW4gc2V0IGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSB0b1xuICAvLyAgICBjb250ZW50TGVuZ3RoLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQuXG4gIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwpIHtcbiAgICBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSBpc29tb3JwaGljRW5jb2RlKGAke2NvbnRlbnRMZW5ndGh9YClcbiAgfVxuXG4gIC8vICAgIDguIElmIGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSBpcyBub24tbnVsbCwgdGhlbiBhcHBlbmRcbiAgLy8gICAgYENvbnRlbnQtTGVuZ3RoYC9jb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0LlxuICBpZiAoY29udGVudExlbmd0aEhlYWRlclZhbHVlICE9IG51bGwpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2NvbnRlbnQtbGVuZ3RoJywgY29udGVudExlbmd0aEhlYWRlclZhbHVlKVxuICB9XG5cbiAgLy8gICAgOS4gSWYgY29udGVudExlbmd0aEhlYWRlclZhbHVlIGlzIG5vbi1udWxsLCB0aGVuIGFwcGVuZCAoYENvbnRlbnQtTGVuZ3RoYCxcbiAgLy8gICAgY29udGVudExlbmd0aEhlYWRlclZhbHVlKSB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG5cbiAgLy8gICAgMTAuIElmIGNvbnRlbnRMZW5ndGggaXMgbm9uLW51bGwgYW5kIGh0dHBSZXF1ZXN04oCZcyBrZWVwYWxpdmUgaXMgdHJ1ZSxcbiAgLy8gICAgdGhlbjpcbiAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiBodHRwUmVxdWVzdC5rZWVwYWxpdmUpIHtcbiAgICAvLyBOT1RFOiBrZWVwYWxpdmUgaXMgYSBub29wIG91dHNpZGUgb2YgYnJvd3NlciBjb250ZXh0LlxuICB9XG5cbiAgLy8gICAgMTEuIElmIGh0dHBSZXF1ZXN04oCZcyByZWZlcnJlciBpcyBhIFVSTCwgdGhlbiBhcHBlbmRcbiAgLy8gICAgYFJlZmVyZXJgL2h0dHBSZXF1ZXN04oCZcyByZWZlcnJlciwgc2VyaWFsaXplZCBhbmQgaXNvbW9ycGhpYyBlbmNvZGVkLFxuICAvLyAgICAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoaHR0cFJlcXVlc3QucmVmZXJyZXIgaW5zdGFuY2VvZiBVUkwpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3JlZmVyZXInLCBpc29tb3JwaGljRW5jb2RlKGh0dHBSZXF1ZXN0LnJlZmVycmVyLmhyZWYpKVxuICB9XG5cbiAgLy8gICAgMTIuIEFwcGVuZCBhIHJlcXVlc3QgYE9yaWdpbmAgaGVhZGVyIGZvciBodHRwUmVxdWVzdC5cbiAgYXBwZW5kUmVxdWVzdE9yaWdpbkhlYWRlcihodHRwUmVxdWVzdClcblxuICAvLyAgICAxMy4gQXBwZW5kIHRoZSBGZXRjaCBtZXRhZGF0YSBoZWFkZXJzIGZvciBodHRwUmVxdWVzdC4gW0ZFVENILU1FVEFEQVRBXVxuICBhcHBlbmRGZXRjaE1ldGFkYXRhKGh0dHBSZXF1ZXN0KVxuXG4gIC8vICAgIDE0LiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgVXNlci1BZ2VudGAsIHRoZW5cbiAgLy8gICAgdXNlciBhZ2VudHMgc2hvdWxkIGFwcGVuZCBgVXNlci1BZ2VudGAvZGVmYXVsdCBgVXNlci1BZ2VudGAgdmFsdWUgdG9cbiAgLy8gICAgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoIWh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCd1c2VyLWFnZW50JykpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3VzZXItYWdlbnQnLCB0eXBlb2YgZXNidWlsZERldGVjdGlvbiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kaWNpJyA6ICdub2RlJylcbiAgfVxuXG4gIC8vICAgIDE1LiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcImRlZmF1bHRcIiBhbmQgaHR0cFJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0IGNvbnRhaW5zIGBJZi1Nb2RpZmllZC1TaW5jZWAsIGBJZi1Ob25lLU1hdGNoYCxcbiAgLy8gICAgYElmLVVubW9kaWZpZWQtU2luY2VgLCBgSWYtTWF0Y2hgLCBvciBgSWYtUmFuZ2VgLCB0aGVuIHNldFxuICAvLyAgICBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0byBcIm5vLXN0b3JlXCIuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5jYWNoZSA9PT0gJ2RlZmF1bHQnICYmXG4gICAgKGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdpZi1tb2RpZmllZC1zaW5jZScpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtbm9uZS1tYXRjaCcpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtdW5tb2RpZmllZC1zaW5jZScpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtbWF0Y2gnKSB8fFxuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2lmLXJhbmdlJykpXG4gICkge1xuICAgIGh0dHBSZXF1ZXN0LmNhY2hlID0gJ25vLXN0b3JlJ1xuICB9XG5cbiAgLy8gICAgMTYuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwibm8tY2FjaGVcIiwgaHR0cFJlcXVlc3TigJlzIHByZXZlbnRcbiAgLy8gICAgbm8tY2FjaGUgY2FjaGUtY29udHJvbCBoZWFkZXIgbW9kaWZpY2F0aW9uIGZsYWcgaXMgdW5zZXQsIGFuZFxuICAvLyAgICBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQ2FjaGUtQ29udHJvbGAsIHRoZW4gYXBwZW5kXG4gIC8vICAgIGBDYWNoZS1Db250cm9sYC9gbWF4LWFnZT0wYCB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5jYWNoZSA9PT0gJ25vLWNhY2hlJyAmJlxuICAgICFodHRwUmVxdWVzdC5wcmV2ZW50Tm9DYWNoZUNhY2hlQ29udHJvbEhlYWRlck1vZGlmaWNhdGlvbiAmJlxuICAgICFodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnY2FjaGUtY29udHJvbCcpXG4gICkge1xuICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnY2FjaGUtY29udHJvbCcsICdtYXgtYWdlPTAnKVxuICB9XG5cbiAgLy8gICAgMTcuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwibm8tc3RvcmVcIiBvciBcInJlbG9hZFwiLCB0aGVuOlxuICBpZiAoaHR0cFJlcXVlc3QuY2FjaGUgPT09ICduby1zdG9yZScgfHwgaHR0cFJlcXVlc3QuY2FjaGUgPT09ICdyZWxvYWQnKSB7XG4gICAgLy8gMS4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYFByYWdtYWAsIHRoZW4gYXBwZW5kXG4gICAgLy8gYFByYWdtYWAvYG5vLWNhY2hlYCB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgaWYgKCFodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygncHJhZ21hJykpIHtcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgncHJhZ21hJywgJ25vLWNhY2hlJylcbiAgICB9XG5cbiAgICAvLyAyLiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQ2FjaGUtQ29udHJvbGAsXG4gICAgLy8gdGhlbiBhcHBlbmQgYENhY2hlLUNvbnRyb2xgL2Buby1jYWNoZWAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAgIGlmICghaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2NhY2hlLWNvbnRyb2wnKSkge1xuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdjYWNoZS1jb250cm9sJywgJ25vLWNhY2hlJylcbiAgICB9XG4gIH1cblxuICAvLyAgICAxOC4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIGBSYW5nZWAsIHRoZW4gYXBwZW5kXG4gIC8vICAgIGBBY2NlcHQtRW5jb2RpbmdgL2BpZGVudGl0eWAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3JhbmdlJykpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdC1lbmNvZGluZycsICdpZGVudGl0eScpXG4gIH1cblxuICAvLyAgICAxOS4gTW9kaWZ5IGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBwZXIgSFRUUC4gRG8gbm90IGFwcGVuZCBhIGdpdmVuXG4gIC8vICAgIGhlYWRlciBpZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgY29udGFpbnMgdGhhdCBoZWFkZXLigJlzIG5hbWUuXG4gIC8vICAgIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyODUjaXNzdWVjb21tZW50LTg5NjU2MDEyOVxuICBpZiAoIWh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdhY2NlcHQtZW5jb2RpbmcnKSkge1xuICAgIGlmICh1cmxIYXNIdHRwc1NjaGVtZShyZXF1ZXN0Q3VycmVudFVSTChodHRwUmVxdWVzdCkpKSB7XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdC1lbmNvZGluZycsICdiciwgZ3ppcCwgZGVmbGF0ZScpXG4gICAgfSBlbHNlIHtcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnYWNjZXB0LWVuY29kaW5nJywgJ2d6aXAsIGRlZmxhdGUnKVxuICAgIH1cbiAgfVxuXG4gIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZSgnaG9zdCcpXG5cbiAgLy8gICAgMjAuIElmIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlLCB0aGVuOlxuICBpZiAoaW5jbHVkZUNyZWRlbnRpYWxzKSB7XG4gICAgLy8gMS4gSWYgdGhlIHVzZXIgYWdlbnQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gYmxvY2sgY29va2llcyBmb3IgaHR0cFJlcXVlc3RcbiAgICAvLyAoc2VlIHNlY3Rpb24gNyBvZiBbQ09PS0lFU10pLCB0aGVuOlxuICAgIC8vIFRPRE86IGNyZWRlbnRpYWxzXG4gICAgLy8gMi4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEF1dGhvcml6YXRpb25gLCB0aGVuOlxuICAgIC8vIFRPRE86IGNyZWRlbnRpYWxzXG4gIH1cblxuICAvLyAgICAyMS4gSWYgdGhlcmXigJlzIGEgcHJveHktYXV0aGVudGljYXRpb24gZW50cnksIHVzZSBpdCBhcyBhcHByb3ByaWF0ZS5cbiAgLy8gICAgVE9ETzogcHJveHktYXV0aGVudGljYXRpb25cblxuICAvLyAgICAyMi4gU2V0IGh0dHBDYWNoZSB0byB0aGUgcmVzdWx0IG9mIGRldGVybWluaW5nIHRoZSBIVFRQIGNhY2hlXG4gIC8vICAgIHBhcnRpdGlvbiwgZ2l2ZW4gaHR0cFJlcXVlc3QuXG4gIC8vICAgIFRPRE86IGNhY2hlXG5cbiAgLy8gICAgMjMuIElmIGh0dHBDYWNoZSBpcyBudWxsLCB0aGVuIHNldCBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0b1xuICAvLyAgICBcIm5vLXN0b3JlXCIuXG4gIGlmIChodHRwQ2FjaGUgPT0gbnVsbCkge1xuICAgIGh0dHBSZXF1ZXN0LmNhY2hlID0gJ25vLXN0b3JlJ1xuICB9XG5cbiAgLy8gICAgMjQuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIG5laXRoZXIgXCJuby1zdG9yZVwiIG5vciBcInJlbG9hZFwiLFxuICAvLyAgICB0aGVuOlxuICBpZiAoaHR0cFJlcXVlc3QubW9kZSAhPT0gJ25vLXN0b3JlJyAmJiBodHRwUmVxdWVzdC5tb2RlICE9PSAncmVsb2FkJykge1xuICAgIC8vIFRPRE86IGNhY2hlXG4gIH1cblxuICAvLyA5LiBJZiBhYm9ydGVkLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmV0d29yayBlcnJvciBmb3IgZmV0Y2hQYXJhbXMuXG4gIC8vIFRPRE9cblxuICAvLyAxMC4gSWYgcmVzcG9uc2UgaXMgbnVsbCwgdGhlbjpcbiAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAvLyAxLiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcIm9ubHktaWYtY2FjaGVkXCIsIHRoZW4gcmV0dXJuIGFcbiAgICAvLyBuZXR3b3JrIGVycm9yLlxuICAgIGlmIChodHRwUmVxdWVzdC5tb2RlID09PSAnb25seS1pZi1jYWNoZWQnKSB7XG4gICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignb25seSBpZiBjYWNoZWQnKVxuICAgIH1cblxuICAgIC8vIDIuIExldCBmb3J3YXJkUmVzcG9uc2UgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIEhUVFAtbmV0d29yayBmZXRjaFxuICAgIC8vIGdpdmVuIGh0dHBGZXRjaFBhcmFtcywgaW5jbHVkZUNyZWRlbnRpYWxzLCBhbmQgaXNOZXdDb25uZWN0aW9uRmV0Y2guXG4gICAgY29uc3QgZm9yd2FyZFJlc3BvbnNlID0gYXdhaXQgaHR0cE5ldHdvcmtGZXRjaChcbiAgICAgIGh0dHBGZXRjaFBhcmFtcyxcbiAgICAgIGluY2x1ZGVDcmVkZW50aWFscyxcbiAgICAgIGlzTmV3Q29ubmVjdGlvbkZldGNoXG4gICAgKVxuXG4gICAgLy8gMy4gSWYgaHR0cFJlcXVlc3TigJlzIG1ldGhvZCBpcyB1bnNhZmUgYW5kIGZvcndhcmRSZXNwb25zZeKAmXMgc3RhdHVzIGlzXG4gICAgLy8gaW4gdGhlIHJhbmdlIDIwMCB0byAzOTksIGluY2x1c2l2ZSwgaW52YWxpZGF0ZSBhcHByb3ByaWF0ZSBzdG9yZWRcbiAgICAvLyByZXNwb25zZXMgaW4gaHR0cENhY2hlLCBhcyBwZXIgdGhlIFwiSW52YWxpZGF0aW9uXCIgY2hhcHRlciBvZiBIVFRQXG4gICAgLy8gQ2FjaGluZywgYW5kIHNldCBzdG9yZWRSZXNwb25zZSB0byBudWxsLiBbSFRUUC1DQUNISU5HXVxuICAgIGlmIChcbiAgICAgICFzYWZlTWV0aG9kc1NldC5oYXMoaHR0cFJlcXVlc3QubWV0aG9kKSAmJlxuICAgICAgZm9yd2FyZFJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiZcbiAgICAgIGZvcndhcmRSZXNwb25zZS5zdGF0dXMgPD0gMzk5XG4gICAgKSB7XG4gICAgICAvLyBUT0RPOiBjYWNoZVxuICAgIH1cblxuICAgIC8vIDQuIElmIHRoZSByZXZhbGlkYXRpbmdGbGFnIGlzIHNldCBhbmQgZm9yd2FyZFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzA0LFxuICAgIC8vIHRoZW46XG4gICAgaWYgKHJldmFsaWRhdGluZ0ZsYWcgJiYgZm9yd2FyZFJlc3BvbnNlLnN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAvLyBUT0RPOiBjYWNoZVxuICAgIH1cblxuICAgIC8vIDUuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW46XG4gICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgIC8vIDEuIFNldCByZXNwb25zZSB0byBmb3J3YXJkUmVzcG9uc2UuXG4gICAgICByZXNwb25zZSA9IGZvcndhcmRSZXNwb25zZVxuXG4gICAgICAvLyAyLiBTdG9yZSBodHRwUmVxdWVzdCBhbmQgZm9yd2FyZFJlc3BvbnNlIGluIGh0dHBDYWNoZSwgYXMgcGVyIHRoZVxuICAgICAgLy8gXCJTdG9yaW5nIFJlc3BvbnNlcyBpbiBDYWNoZXNcIiBjaGFwdGVyIG9mIEhUVFAgQ2FjaGluZy4gW0hUVFAtQ0FDSElOR11cbiAgICAgIC8vIFRPRE86IGNhY2hlXG4gICAgfVxuICB9XG5cbiAgLy8gMTEuIFNldCByZXNwb25zZeKAmXMgVVJMIGxpc3QgdG8gYSBjbG9uZSBvZiBodHRwUmVxdWVzdOKAmXMgVVJMIGxpc3QuXG4gIHJlc3BvbnNlLnVybExpc3QgPSBbLi4uaHR0cFJlcXVlc3QudXJsTGlzdF1cblxuICAvLyAxMi4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIGBSYW5nZWAsIHRoZW4gc2V0IHJlc3BvbnNl4oCZc1xuICAvLyByYW5nZS1yZXF1ZXN0ZWQgZmxhZy5cbiAgaWYgKGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdyYW5nZScpKSB7XG4gICAgcmVzcG9uc2UucmFuZ2VSZXF1ZXN0ZWQgPSB0cnVlXG4gIH1cblxuICAvLyAxMy4gU2V0IHJlc3BvbnNl4oCZcyByZXF1ZXN0LWluY2x1ZGVzLWNyZWRlbnRpYWxzIHRvIGluY2x1ZGVDcmVkZW50aWFscy5cbiAgcmVzcG9uc2UucmVxdWVzdEluY2x1ZGVzQ3JlZGVudGlhbHMgPSBpbmNsdWRlQ3JlZGVudGlhbHNcblxuICAvLyAxNC4gSWYgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyA0MDEsIGh0dHBSZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBub3RcbiAgLy8gXCJjb3JzXCIsIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlLCBhbmQgcmVxdWVzdOKAmXMgd2luZG93IGlzIGFuIGVudmlyb25tZW50XG4gIC8vIHNldHRpbmdzIG9iamVjdCwgdGhlbjpcbiAgLy8gVE9ET1xuXG4gIC8vIDE1LiBJZiByZXNwb25zZeKAmXMgc3RhdHVzIGlzIDQwNywgdGhlbjpcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA3KSB7XG4gICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgd2luZG93IGlzIFwibm8td2luZG93XCIsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICBpZiAocmVxdWVzdC53aW5kb3cgPT09ICduby13aW5kb3cnKSB7XG4gICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigpXG4gICAgfVxuXG4gICAgLy8gMi4gPz8/XG5cbiAgICAvLyAzLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgZXJyb3IgZm9yIGZldGNoUGFyYW1zLlxuICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpXG4gICAgfVxuXG4gICAgLy8gNC4gUHJvbXB0IHRoZSBlbmQgdXNlciBhcyBhcHByb3ByaWF0ZSBpbiByZXF1ZXN04oCZcyB3aW5kb3cgYW5kIHN0b3JlXG4gICAgLy8gdGhlIHJlc3VsdCBhcyBhIHByb3h5LWF1dGhlbnRpY2F0aW9uIGVudHJ5LiBbSFRUUC1BVVRIXVxuICAgIC8vIFRPRE86IEludm9rZSBzb21lIGtpbmQgb2YgY2FsbGJhY2s/XG5cbiAgICAvLyA1LiBTZXQgcmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nIEhUVFAtbmV0d29yay1vci1jYWNoZSBmZXRjaCBnaXZlblxuICAgIC8vIGZldGNoUGFyYW1zLlxuICAgIC8vIFRPRE9cbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigncHJveHkgYXV0aGVudGljYXRpb24gcmVxdWlyZWQnKVxuICB9XG5cbiAgLy8gMTYuIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlXG4gIGlmIChcbiAgICAvLyByZXNwb25zZeKAmXMgc3RhdHVzIGlzIDQyMVxuICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDIxICYmXG4gICAgLy8gaXNOZXdDb25uZWN0aW9uRmV0Y2ggaXMgZmFsc2VcbiAgICAhaXNOZXdDb25uZWN0aW9uRmV0Y2ggJiZcbiAgICAvLyByZXF1ZXN04oCZcyBib2R5IGlzIG51bGwsIG9yIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwgYW5kIHJlcXVlc3TigJlzIGJvZHnigJlzIHNvdXJjZSBpcyBub24tbnVsbFxuICAgIChyZXF1ZXN0LmJvZHkgPT0gbnVsbCB8fCByZXF1ZXN0LmJvZHkuc291cmNlICE9IG51bGwpXG4gICkge1xuICAgIC8vIHRoZW46XG5cbiAgICAvLyAxLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgZXJyb3IgZm9yIGZldGNoUGFyYW1zLlxuICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpXG4gICAgfVxuXG4gICAgLy8gMi4gU2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQLW5ldHdvcmstb3ItY2FjaGVcbiAgICAvLyBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcywgaXNBdXRoZW50aWNhdGlvbkZldGNoLCBhbmQgdHJ1ZS5cblxuICAgIC8vIFRPRE8gKHNwZWMpOiBUaGUgc3BlYyBkb2Vzbid0IHNwZWNpZnkgdGhpcyBidXQgd2UgbmVlZCB0byBjYW5jZWxcbiAgICAvLyB0aGUgYWN0aXZlIHJlc3BvbnNlIGJlZm9yZSB3ZSBjYW4gc3RhcnQgYSBuZXcgb25lLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyOTNcbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24uZGVzdHJveSgpXG5cbiAgICByZXNwb25zZSA9IGF3YWl0IGh0dHBOZXR3b3JrT3JDYWNoZUZldGNoKFxuICAgICAgZmV0Y2hQYXJhbXMsXG4gICAgICBpc0F1dGhlbnRpY2F0aW9uRmV0Y2gsXG4gICAgICB0cnVlXG4gICAgKVxuICB9XG5cbiAgLy8gMTcuIElmIGlzQXV0aGVudGljYXRpb25GZXRjaCBpcyB0cnVlLCB0aGVuIGNyZWF0ZSBhbiBhdXRoZW50aWNhdGlvbiBlbnRyeVxuICBpZiAoaXNBdXRoZW50aWNhdGlvbkZldGNoKSB7XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gMTguIFJldHVybiByZXNwb25zZS5cbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLW5ldHdvcmstZmV0Y2hcbmFzeW5jIGZ1bmN0aW9uIGh0dHBOZXR3b3JrRmV0Y2ggKFxuICBmZXRjaFBhcmFtcyxcbiAgaW5jbHVkZUNyZWRlbnRpYWxzID0gZmFsc2UsXG4gIGZvcmNlTmV3Q29ubmVjdGlvbiA9IGZhbHNlXG4pIHtcbiAgYXNzZXJ0KCFmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24gfHwgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3llZClcblxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24gPSB7XG4gICAgYWJvcnQ6IG51bGwsXG4gICAgZGVzdHJveWVkOiBmYWxzZSxcbiAgICBkZXN0cm95IChlcnIpIHtcbiAgICAgIGlmICghdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuYWJvcnQ/LihlcnIgPz8gbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIDEuIExldCByZXF1ZXN0IGJlIGZldGNoUGFyYW1z4oCZcyByZXF1ZXN0LlxuICBjb25zdCByZXF1ZXN0ID0gZmV0Y2hQYXJhbXMucmVxdWVzdFxuXG4gIC8vIDIuIExldCByZXNwb25zZSBiZSBudWxsLlxuICBsZXQgcmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gMy4gTGV0IHRpbWluZ0luZm8gYmUgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICBjb25zdCB0aW1pbmdJbmZvID0gZmV0Y2hQYXJhbXMudGltaW5nSW5mb1xuXG4gIC8vIDQuIExldCBodHRwQ2FjaGUgYmUgdGhlIHJlc3VsdCBvZiBkZXRlcm1pbmluZyB0aGUgSFRUUCBjYWNoZSBwYXJ0aXRpb24sXG4gIC8vIGdpdmVuIHJlcXVlc3QuXG4gIC8vIFRPRE86IGNhY2hlXG4gIGNvbnN0IGh0dHBDYWNoZSA9IG51bGxcblxuICAvLyA1LiBJZiBodHRwQ2FjaGUgaXMgbnVsbCwgdGhlbiBzZXQgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0byBcIm5vLXN0b3JlXCIuXG4gIGlmIChodHRwQ2FjaGUgPT0gbnVsbCkge1xuICAgIHJlcXVlc3QuY2FjaGUgPSAnbm8tc3RvcmUnXG4gIH1cblxuICAvLyA2LiBMZXQgbmV0d29ya1BhcnRpdGlvbktleSBiZSB0aGUgcmVzdWx0IG9mIGRldGVybWluaW5nIHRoZSBuZXR3b3JrXG4gIC8vIHBhcnRpdGlvbiBrZXkgZ2l2ZW4gcmVxdWVzdC5cbiAgLy8gVE9ET1xuXG4gIC8vIDcuIExldCBuZXdDb25uZWN0aW9uIGJlIFwieWVzXCIgaWYgZm9yY2VOZXdDb25uZWN0aW9uIGlzIHRydWU7IG90aGVyd2lzZVxuICAvLyBcIm5vXCIuXG4gIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSBmb3JjZU5ld0Nvbm5lY3Rpb24gPyAneWVzJyA6ICdubycgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gIC8vIDguIFN3aXRjaCBvbiByZXF1ZXN04oCZcyBtb2RlOlxuICBpZiAocmVxdWVzdC5tb2RlID09PSAnd2Vic29ja2V0Jykge1xuICAgIC8vIExldCBjb25uZWN0aW9uIGJlIHRoZSByZXN1bHQgb2Ygb2J0YWluaW5nIGEgV2ViU29ja2V0IGNvbm5lY3Rpb24sXG4gICAgLy8gZ2l2ZW4gcmVxdWVzdOKAmXMgY3VycmVudCBVUkwuXG4gICAgLy8gVE9ET1xuICB9IGVsc2Uge1xuICAgIC8vIExldCBjb25uZWN0aW9uIGJlIHRoZSByZXN1bHQgb2Ygb2J0YWluaW5nIGEgY29ubmVjdGlvbiwgZ2l2ZW5cbiAgICAvLyBuZXR3b3JrUGFydGl0aW9uS2V5LCByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgb3JpZ2luLFxuICAgIC8vIGluY2x1ZGVDcmVkZW50aWFscywgYW5kIGZvcmNlTmV3Q29ubmVjdGlvbi5cbiAgICAvLyBUT0RPXG4gIH1cblxuICAvLyA5LiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIHRoZSBvbmdvaW5nIGZldGNoIGlzIHRlcm1pbmF0ZWQ6XG5cbiAgLy8gICAgMS4gSWYgY29ubmVjdGlvbiBpcyBmYWlsdXJlLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG5cbiAgLy8gICAgMi4gU2V0IHRpbWluZ0luZm/igJlzIGZpbmFsIGNvbm5lY3Rpb24gdGltaW5nIGluZm8gdG8gdGhlIHJlc3VsdCBvZlxuICAvLyAgICBjYWxsaW5nIGNsYW1wIGFuZCBjb2Fyc2VuIGNvbm5lY3Rpb24gdGltaW5nIGluZm8gd2l0aCBjb25uZWN0aW9u4oCZc1xuICAvLyAgICB0aW1pbmcgaW5mbywgdGltaW5nSW5mb+KAmXMgcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lLCBhbmQgZmV0Y2hQYXJhbXPigJlzXG4gIC8vICAgIGNyb3NzLW9yaWdpbiBpc29sYXRlZCBjYXBhYmlsaXR5LlxuXG4gIC8vICAgIDMuIElmIGNvbm5lY3Rpb24gaXMgbm90IGFuIEhUVFAvMiBjb25uZWN0aW9uLCByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLFxuICAvLyAgICBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsIHRoZW4gYXBwZW5kIChgVHJhbnNmZXItRW5jb2RpbmdgLFxuICAvLyAgICBgY2h1bmtlZGApIHRvIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuXG4gIC8vICAgIDQuIFNldCB0aW1pbmdJbmZv4oCZcyBmaW5hbCBuZXR3b3JrLXJlcXVlc3Qgc3RhcnQgdGltZSB0byB0aGUgY29hcnNlbmVkXG4gIC8vICAgIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzIGNyb3NzLW9yaWdpbiBpc29sYXRlZFxuICAvLyAgICBjYXBhYmlsaXR5LlxuXG4gIC8vICAgIDUuIFNldCByZXNwb25zZSB0byB0aGUgcmVzdWx0IG9mIG1ha2luZyBhbiBIVFRQIHJlcXVlc3Qgb3ZlciBjb25uZWN0aW9uXG4gIC8vICAgIHVzaW5nIHJlcXVlc3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNhdmVhdHM6XG5cbiAgLy8gICAgICAgIC0gRm9sbG93IHRoZSByZWxldmFudCByZXF1aXJlbWVudHMgZnJvbSBIVFRQLiBbSFRUUF0gW0hUVFAtU0VNQU5USUNTXVxuICAvLyAgICAgICAgW0hUVFAtQ09ORF0gW0hUVFAtQ0FDSElOR10gW0hUVFAtQVVUSF1cblxuICAvLyAgICAgICAgLSBJZiByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLCBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsXG4gIC8vICAgICAgICB0aGVuIHRoZSB1c2VyIGFnZW50IG1heSBoYXZlIGEgYnVmZmVyIG9mIHVwIHRvIDY0IGtpYmlieXRlcyBhbmQgc3RvcmVcbiAgLy8gICAgICAgIGEgcGFydCBvZiByZXF1ZXN04oCZcyBib2R5IGluIHRoYXQgYnVmZmVyLiBJZiB0aGUgdXNlciBhZ2VudCByZWFkcyBmcm9tXG4gIC8vICAgICAgICByZXF1ZXN04oCZcyBib2R5IGJleW9uZCB0aGF0IGJ1ZmZlcuKAmXMgc2l6ZSBhbmQgdGhlIHVzZXIgYWdlbnQgbmVlZHMgdG9cbiAgLy8gICAgICAgIHJlc2VuZCByZXF1ZXN0LCB0aGVuIGluc3RlYWQgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cblxuICAvLyAgICAgICAgLSBTZXQgdGltaW5nSW5mb+KAmXMgZmluYWwgbmV0d29yay1yZXNwb25zZSBzdGFydCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWRcbiAgLy8gICAgICAgIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzIGNyb3NzLW9yaWdpbiBpc29sYXRlZCBjYXBhYmlsaXR5LFxuICAvLyAgICAgICAgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZXIgYWdlbnTigJlzIEhUVFAgcGFyc2VyIHJlY2VpdmVzIHRoZSBmaXJzdCBieXRlXG4gIC8vICAgICAgICBvZiB0aGUgcmVzcG9uc2UgKGUuZy4sIGZyYW1lIGhlYWRlciBieXRlcyBmb3IgSFRUUC8yIG9yIHJlc3BvbnNlIHN0YXR1c1xuICAvLyAgICAgICAgbGluZSBmb3IgSFRUUC8xLngpLlxuXG4gIC8vICAgICAgICAtIFdhaXQgdW50aWwgYWxsIHRoZSBoZWFkZXJzIGFyZSB0cmFuc21pdHRlZC5cblxuICAvLyAgICAgICAgLSBBbnkgcmVzcG9uc2VzIHdob3NlIHN0YXR1cyBpcyBpbiB0aGUgcmFuZ2UgMTAwIHRvIDE5OSwgaW5jbHVzaXZlLFxuICAvLyAgICAgICAgYW5kIGlzIG5vdCAxMDEsIGFyZSB0byBiZSBpZ25vcmVkLCBleGNlcHQgZm9yIHRoZSBwdXJwb3NlcyBvZiBzZXR0aW5nXG4gIC8vICAgICAgICB0aW1pbmdJbmZv4oCZcyBmaW5hbCBuZXR3b3JrLXJlc3BvbnNlIHN0YXJ0IHRpbWUgYWJvdmUuXG5cbiAgLy8gICAgLSBJZiByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBjb250YWlucyBgVHJhbnNmZXItRW5jb2RpbmdgL2BjaHVua2VkYCBhbmRcbiAgLy8gICAgcmVzcG9uc2UgaXMgdHJhbnNmZXJyZWQgdmlhIEhUVFAvMS4wIG9yIG9sZGVyLCB0aGVuIHJldHVybiBhIG5ldHdvcmtcbiAgLy8gICAgZXJyb3IuXG5cbiAgLy8gICAgLSBJZiB0aGUgSFRUUCByZXF1ZXN0IHJlc3VsdHMgaW4gYSBUTFMgY2xpZW50IGNlcnRpZmljYXRlIGRpYWxvZywgdGhlbjpcblxuICAvLyAgICAgICAgMS4gSWYgcmVxdWVzdOKAmXMgd2luZG93IGlzIGFuIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdCwgbWFrZSB0aGVcbiAgLy8gICAgICAgIGRpYWxvZyBhdmFpbGFibGUgaW4gcmVxdWVzdOKAmXMgd2luZG93LlxuXG4gIC8vICAgICAgICAyLiBPdGhlcndpc2UsIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG5cbiAgLy8gVG8gdHJhbnNtaXQgcmVxdWVzdOKAmXMgYm9keSBib2R5LCBydW4gdGhlc2Ugc3RlcHM6XG4gIGxldCByZXF1ZXN0Qm9keSA9IG51bGxcbiAgLy8gMS4gSWYgYm9keSBpcyBudWxsIGFuZCBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0IGVuZC1vZi1ib2R5IGlzXG4gIC8vIG5vbi1udWxsLCB0aGVuIHF1ZXVlIGEgZmV0Y2ggdGFzayBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0XG4gIC8vIGVuZC1vZi1ib2R5IGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgaWYgKHJlcXVlc3QuYm9keSA9PSBudWxsICYmIGZldGNoUGFyYW1zLnByb2Nlc3NSZXF1ZXN0RW5kT2ZCb2R5KSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkoKSlcbiAgfSBlbHNlIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgYm9keSBpcyBub24tbnVsbDpcblxuICAgIC8vICAgIDEuIExldCBwcm9jZXNzQm9keUNodW5rIGdpdmVuIGJ5dGVzIGJlIHRoZXNlIHN0ZXBzOlxuICAgIGNvbnN0IHByb2Nlc3NCb2R5Q2h1bmsgPSBhc3luYyBmdW5jdGlvbiAqIChieXRlcykge1xuICAgICAgLy8gMS4gSWYgdGhlIG9uZ29pbmcgZmV0Y2ggaXMgdGVybWluYXRlZCwgdGhlbiBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFJ1biB0aGlzIHN0ZXAgaW4gcGFyYWxsZWw6IHRyYW5zbWl0IGJ5dGVzLlxuICAgICAgeWllbGQgYnl0ZXNcblxuICAgICAgLy8gMy4gSWYgZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBib2R5IGlzIG5vbi1udWxsLCB0aGVuIHJ1blxuICAgICAgLy8gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBib2R5IGdpdmVuIGJ5dGVz4oCZcyBsZW5ndGguXG4gICAgICBmZXRjaFBhcmFtcy5wcm9jZXNzUmVxdWVzdEJvZHlDaHVua0xlbmd0aD8uKGJ5dGVzLmJ5dGVMZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IHByb2Nlc3NFbmRPZkJvZHkgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0VuZE9mQm9keSA9ICgpID0+IHtcbiAgICAgIC8vIDEuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgICAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBlbmQtb2YtYm9keSBpcyBub24tbnVsbCxcbiAgICAgIC8vIHRoZW4gcnVuIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlcXVlc3QgZW5kLW9mLWJvZHkuXG4gICAgICBpZiAoZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkoKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIExldCBwcm9jZXNzQm9keUVycm9yIGdpdmVuIGUgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChlKSA9PiB7XG4gICAgICAvLyAxLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGUgaXMgYW4gXCJBYm9ydEVycm9yXCIgRE9NRXhjZXB0aW9uLCB0aGVuIGFib3J0IGZldGNoUGFyYW1z4oCZcyBjb250cm9sbGVyLlxuICAgICAgaWYgKGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBJbmNyZW1lbnRhbGx5IHJlYWQgcmVxdWVzdOKAmXMgYm9keSBnaXZlbiBwcm9jZXNzQm9keUNodW5rLCBwcm9jZXNzRW5kT2ZCb2R5LFxuICAgIC8vIHByb2Nlc3NCb2R5RXJyb3IsIGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgICByZXF1ZXN0Qm9keSA9IChhc3luYyBmdW5jdGlvbiAqICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgYnl0ZXMgb2YgcmVxdWVzdC5ib2R5LnN0cmVhbSkge1xuICAgICAgICAgIHlpZWxkICogcHJvY2Vzc0JvZHlDaHVuayhieXRlcylcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzRW5kT2ZCb2R5KClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBwcm9jZXNzQm9keUVycm9yKGVycilcbiAgICAgIH1cbiAgICB9KSgpXG4gIH1cblxuICB0cnkge1xuICAgIC8vIHNvY2tldCBpcyBvbmx5IHByb3ZpZGVkIGZvciB3ZWJzb2NrZXRzXG4gICAgY29uc3QgeyBib2R5LCBzdGF0dXMsIHN0YXR1c1RleHQsIGhlYWRlcnNMaXN0LCBzb2NrZXQgfSA9IGF3YWl0IGRpc3BhdGNoKHsgYm9keTogcmVxdWVzdEJvZHkgfSlcblxuICAgIGlmIChzb2NrZXQpIHtcbiAgICAgIHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHsgc3RhdHVzLCBzdGF0dXNUZXh0LCBoZWFkZXJzTGlzdCwgc29ja2V0IH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gYm9keVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKVxuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5uZXh0ID0gKCkgPT4gaXRlcmF0b3IubmV4dCgpXG5cbiAgICAgIHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHsgc3RhdHVzLCBzdGF0dXNUZXh0LCBoZWFkZXJzTGlzdCB9KVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gMTAuIElmIGFib3J0ZWQsIHRoZW46XG4gICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgIC8vIDEuIElmIGNvbm5lY3Rpb24gdXNlcyBIVFRQLzIsIHRoZW4gdHJhbnNtaXQgYW4gUlNUX1NUUkVBTSBmcmFtZS5cbiAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbi5kZXN0cm95KClcblxuICAgICAgLy8gMi4gUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBuZXR3b3JrIGVycm9yIGZvciBmZXRjaFBhcmFtcy5cbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMsIGVycilcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcihlcnIpXG4gIH1cblxuICAvLyAxMS4gTGV0IHB1bGxBbGdvcml0aG0gYmUgYW4gYWN0aW9uIHRoYXQgcmVzdW1lcyB0aGUgb25nb2luZyBmZXRjaFxuICAvLyBpZiBpdCBpcyBzdXNwZW5kZWQuXG4gIGNvbnN0IHB1bGxBbGdvcml0aG0gPSAoKSA9PiB7XG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5yZXN1bWUoKVxuICB9XG5cbiAgLy8gMTIuIExldCBjYW5jZWxBbGdvcml0aG0gYmUgYW4gYWxnb3JpdGhtIHRoYXQgYWJvcnRzIGZldGNoUGFyYW1z4oCZc1xuICAvLyBjb250cm9sbGVyIHdpdGggcmVhc29uLCBnaXZlbiByZWFzb24uXG4gIGNvbnN0IGNhbmNlbEFsZ29yaXRobSA9IChyZWFzb24pID0+IHtcbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmFib3J0KHJlYXNvbilcbiAgfVxuXG4gIC8vIDEzLiBMZXQgaGlnaFdhdGVyTWFyayBiZSBhIG5vbi1uZWdhdGl2ZSwgbm9uLU5hTiBudW1iZXIsIGNob3NlbiBieVxuICAvLyB0aGUgdXNlciBhZ2VudC5cbiAgLy8gVE9ET1xuXG4gIC8vIDE0LiBMZXQgc2l6ZUFsZ29yaXRobSBiZSBhbiBhbGdvcml0aG0gdGhhdCBhY2NlcHRzIGEgY2h1bmsgb2JqZWN0XG4gIC8vIGFuZCByZXR1cm5zIGEgbm9uLW5lZ2F0aXZlLCBub24tTmFOLCBub24taW5maW5pdGUgbnVtYmVyLCBjaG9zZW4gYnkgdGhlIHVzZXIgYWdlbnQuXG4gIC8vIFRPRE9cblxuICAvLyAxNS4gTGV0IHN0cmVhbSBiZSBhIG5ldyBSZWFkYWJsZVN0cmVhbS5cbiAgLy8gMTYuIFNldCB1cCBzdHJlYW0gd2l0aCBwdWxsQWxnb3JpdGhtIHNldCB0byBwdWxsQWxnb3JpdGhtLFxuICAvLyBjYW5jZWxBbGdvcml0aG0gc2V0IHRvIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyayBzZXQgdG9cbiAgLy8gaGlnaFdhdGVyTWFyaywgYW5kIHNpemVBbGdvcml0aG0gc2V0IHRvIHNpemVBbGdvcml0aG0uXG4gIGlmICghUmVhZGFibGVTdHJlYW0pIHtcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgY29uc3Qgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKFxuICAgIHtcbiAgICAgIGFzeW5jIHN0YXJ0IChjb250cm9sbGVyKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlciA9IGNvbnRyb2xsZXJcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsIChjb250cm9sbGVyKSB7XG4gICAgICAgIGF3YWl0IHB1bGxBbGdvcml0aG0oY29udHJvbGxlcilcbiAgICAgIH0sXG4gICAgICBhc3luYyBjYW5jZWwgKHJlYXNvbikge1xuICAgICAgICBhd2FpdCBjYW5jZWxBbGdvcml0aG0ocmVhc29uKVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgaGlnaFdhdGVyTWFyazogMCxcbiAgICAgIHNpemUgKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfVxuICAgIH1cbiAgKVxuXG4gIC8vIDE3LiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIHRoZSBvbmdvaW5nIGZldGNoIGlzIHRlcm1pbmF0ZWQ6XG5cbiAgLy8gICAgMS4gU2V0IHJlc3BvbnNl4oCZcyBib2R5IHRvIGEgbmV3IGJvZHkgd2hvc2Ugc3RyZWFtIGlzIHN0cmVhbS5cbiAgcmVzcG9uc2UuYm9keSA9IHsgc3RyZWFtIH1cblxuICAvLyAgICAyLiBJZiByZXNwb25zZSBpcyBub3QgYSBuZXR3b3JrIGVycm9yIGFuZCByZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzXG4gIC8vICAgIG5vdCBcIm5vLXN0b3JlXCIsIHRoZW4gdXBkYXRlIHJlc3BvbnNlIGluIGh0dHBDYWNoZSBmb3IgcmVxdWVzdC5cbiAgLy8gICAgVE9ET1xuXG4gIC8vICAgIDMuIElmIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlIGFuZCB0aGUgdXNlciBhZ2VudCBpcyBub3QgY29uZmlndXJlZFxuICAvLyAgICB0byBibG9jayBjb29raWVzIGZvciByZXF1ZXN0IChzZWUgc2VjdGlvbiA3IG9mIFtDT09LSUVTXSksIHRoZW4gcnVuIHRoZVxuICAvLyAgICBcInNldC1jb29raWUtc3RyaW5nXCIgcGFyc2luZyBhbGdvcml0aG0gKHNlZSBzZWN0aW9uIDUuMiBvZiBbQ09PS0lFU10pIG9uXG4gIC8vICAgIHRoZSB2YWx1ZSBvZiBlYWNoIGhlYWRlciB3aG9zZSBuYW1lIGlzIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAvLyAgICBgU2V0LUNvb2tpZWAgaW4gcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LCBpZiBhbnksIGFuZCByZXF1ZXN04oCZcyBjdXJyZW50IFVSTC5cbiAgLy8gICAgVE9ET1xuXG4gIC8vIDE4LiBJZiBhYm9ydGVkLCB0aGVuOlxuICAvLyBUT0RPXG5cbiAgLy8gMTkuIFJ1biB0aGVzZSBzdGVwcyBpbiBwYXJhbGxlbDpcblxuICAvLyAgICAxLiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkOlxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm9uKCd0ZXJtaW5hdGVkJywgb25BYm9ydGVkKVxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnJlc3VtZSA9IGFzeW5jICgpID0+IHtcbiAgICAvLyAxLiBXaGlsZSB0cnVlXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIDEtMy4gU2VlIG9uRGF0YS4uLlxuXG4gICAgICAvLyA0LiBTZXQgYnl0ZXMgdG8gdGhlIHJlc3VsdCBvZiBoYW5kbGluZyBjb250ZW50IGNvZGluZ3MgZ2l2ZW5cbiAgICAgIC8vIGNvZGluZ3MgYW5kIGJ5dGVzLlxuICAgICAgbGV0IGJ5dGVzXG4gICAgICBsZXQgaXNGYWlsdXJlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm5leHQoKVxuXG4gICAgICAgIGlmIChpc0Fib3J0ZWQoZmV0Y2hQYXJhbXMpKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ5dGVzID0gZG9uZSA/IHVuZGVmaW5lZCA6IHZhbHVlXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZW5kZWQgJiYgIXRpbWluZ0luZm8uZW5jb2RlZEJvZHlTaXplKSB7XG4gICAgICAgICAgLy8gemxpYiBkb2Vzbid0IGxpa2UgZW1wdHkgc3RyZWFtcy5cbiAgICAgICAgICBieXRlcyA9IHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ5dGVzID0gZXJyXG5cbiAgICAgICAgICAvLyBlcnIgbWF5IGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgcmVhZGFibGVzdHJlYW0uY2FuY2VsLFxuICAgICAgICAgIC8vIHdoaWNoIG1pZ2h0IG5vdCBiZSBhbiBlcnJvci4gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzIwMDlcbiAgICAgICAgICBpc0ZhaWx1cmUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGJ5dGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiB0aGUgYnl0ZXMgdHJhbnNtaXNzaW9uIGZvciByZXNwb25zZeKAmXMgbWVzc2FnZVxuICAgICAgICAvLyBib2R5IGlzIGRvbmUgbm9ybWFsbHkgYW5kIHN0cmVhbSBpcyByZWFkYWJsZSwgdGhlbiBjbG9zZVxuICAgICAgICAvLyBzdHJlYW0sIGZpbmFsaXplIHJlc3BvbnNlIGZvciBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UsIGFuZFxuICAgICAgICAvLyBhYm9ydCB0aGVzZSBpbi1wYXJhbGxlbCBzdGVwcy5cbiAgICAgICAgcmVhZGFibGVTdHJlYW1DbG9zZShmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbnRyb2xsZXIpXG5cbiAgICAgICAgZmluYWxpemVSZXNwb25zZShmZXRjaFBhcmFtcywgcmVzcG9uc2UpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDUuIEluY3JlYXNlIHRpbWluZ0luZm/igJlzIGRlY29kZWQgYm9keSBzaXplIGJ5IGJ5dGVz4oCZcyBsZW5ndGguXG4gICAgICB0aW1pbmdJbmZvLmRlY29kZWRCb2R5U2l6ZSArPSBieXRlcz8uYnl0ZUxlbmd0aCA/PyAwXG5cbiAgICAgIC8vIDYuIElmIGJ5dGVzIGlzIGZhaWx1cmUsIHRoZW4gdGVybWluYXRlIGZldGNoUGFyYW1z4oCZcyBjb250cm9sbGVyLlxuICAgICAgaWYgKGlzRmFpbHVyZSkge1xuICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShieXRlcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDcuIEVucXVldWUgYSBVaW50OEFycmF5IHdyYXBwaW5nIGFuIEFycmF5QnVmZmVyIGNvbnRhaW5pbmcgYnl0ZXNcbiAgICAgIC8vIGludG8gc3RyZWFtLlxuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoYnl0ZXMpKVxuXG4gICAgICAvLyA4LiBJZiBzdHJlYW0gaXMgZXJyb3JlZCwgdGhlbiB0ZXJtaW5hdGUgdGhlIG9uZ29pbmcgZmV0Y2guXG4gICAgICBpZiAoaXNFcnJvcmVkKHN0cmVhbSkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gOS4gSWYgc3RyZWFtIGRvZXNu4oCZdCBuZWVkIG1vcmUgZGF0YSBhc2sgdGhlIHVzZXIgYWdlbnQgdG8gc3VzcGVuZFxuICAgICAgLy8gdGhlIG9uZ29pbmcgZmV0Y2guXG4gICAgICBpZiAoIWZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlci5kZXNpcmVkU2l6ZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAgICAyLiBJZiBhYm9ydGVkLCB0aGVuOlxuICBmdW5jdGlvbiBvbkFib3J0ZWQgKHJlYXNvbikge1xuICAgIC8vIDIuIElmIGZldGNoUGFyYW1zIGlzIGFib3J0ZWQsIHRoZW46XG4gICAgaWYgKGlzQWJvcnRlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIC8vIDEuIFNldCByZXNwb25zZeKAmXMgYWJvcnRlZCBmbGFnLlxuICAgICAgcmVzcG9uc2UuYWJvcnRlZCA9IHRydWVcblxuICAgICAgLy8gMi4gSWYgc3RyZWFtIGlzIHJlYWRhYmxlLCB0aGVuIGVycm9yIHN0cmVhbSB3aXRoIHRoZSByZXN1bHQgb2ZcbiAgICAgIC8vICAgIGRlc2VyaWFsaXplIGEgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzXG4gICAgICAvLyAgICBjb250cm9sbGVy4oCZcyBzZXJpYWxpemVkIGFib3J0IHJlYXNvbiBhbmQgYW5cbiAgICAgIC8vICAgIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmVhbG0uXG4gICAgICBpZiAoaXNSZWFkYWJsZShzdHJlYW0pKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnNlcmlhbGl6ZWRBYm9ydFJlYXNvblxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgc3RyZWFtIGlzIHJlYWRhYmxlLCBlcnJvciBzdHJlYW0gd2l0aCBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChpc1JlYWRhYmxlKHN0cmVhbSkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyLmVycm9yKG5ldyBUeXBlRXJyb3IoJ3Rlcm1pbmF0ZWQnLCB7XG4gICAgICAgICAgY2F1c2U6IGlzRXJyb3JMaWtlKHJlYXNvbikgPyByZWFzb24gOiB1bmRlZmluZWRcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gSWYgY29ubmVjdGlvbiB1c2VzIEhUVFAvMiwgdGhlbiB0cmFuc21pdCBhbiBSU1RfU1RSRUFNIGZyYW1lLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgdGhlIHVzZXIgYWdlbnQgc2hvdWxkIGNsb3NlIGNvbm5lY3Rpb24gdW5sZXNzIGl0IHdvdWxkIGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UgdG8gZG8gc28uXG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3koKVxuICB9XG5cbiAgLy8gMjAuIFJldHVybiByZXNwb25zZS5cbiAgcmV0dXJuIHJlc3BvbnNlXG5cbiAgYXN5bmMgZnVuY3Rpb24gZGlzcGF0Y2ggKHsgYm9keSB9KSB7XG4gICAgY29uc3QgdXJsID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcbiAgICAvKiogQHR5cGUge2ltcG9ydCgnLi4vLi4nKS5BZ2VudH0gKi9cbiAgICBjb25zdCBhZ2VudCA9IGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZGlzcGF0Y2hlclxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IGFnZW50LmRpc3BhdGNoKFxuICAgICAge1xuICAgICAgICBwYXRoOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoLFxuICAgICAgICBvcmlnaW46IHVybC5vcmlnaW4sXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIGJvZHk6IGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZGlzcGF0Y2hlci5pc01vY2tBY3RpdmUgPyByZXF1ZXN0LmJvZHkgJiYgKHJlcXVlc3QuYm9keS5zb3VyY2UgfHwgcmVxdWVzdC5ib2R5LnN0cmVhbSkgOiBib2R5LFxuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnNMaXN0LmVudHJpZXMsXG4gICAgICAgIG1heFJlZGlyZWN0aW9uczogMCxcbiAgICAgICAgdXBncmFkZTogcmVxdWVzdC5tb2RlID09PSAnd2Vic29ja2V0JyA/ICd3ZWJzb2NrZXQnIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBib2R5OiBudWxsLFxuICAgICAgICBhYm9ydDogbnVsbCxcblxuICAgICAgICBvbkNvbm5lY3QgKGFib3J0KSB7XG4gICAgICAgICAgLy8gVE9ETyAoZml4KTogRG8gd2UgbmVlZCBjb25uZWN0aW9uIGhlcmU/XG4gICAgICAgICAgY29uc3QgeyBjb25uZWN0aW9uIH0gPSBmZXRjaFBhcmFtcy5jb250cm9sbGVyXG5cbiAgICAgICAgICBpZiAoY29ubmVjdGlvbi5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIGFib3J0KG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vbigndGVybWluYXRlZCcsIGFib3J0KVxuICAgICAgICAgICAgdGhpcy5hYm9ydCA9IGNvbm5lY3Rpb24uYWJvcnQgPSBhYm9ydFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBvbkhlYWRlcnMgKHN0YXR1cywgaGVhZGVyc0xpc3QsIHJlc3VtZSwgc3RhdHVzVGV4dCkge1xuICAgICAgICAgIGlmIChzdGF0dXMgPCAyMDApIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBjb2RpbmdzID0gW11cbiAgICAgICAgICBsZXQgbG9jYXRpb24gPSAnJ1xuXG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcblxuICAgICAgICAgIC8vIEZvciBIMiwgdGhlIGhlYWRlcnMgYXJlIGEgcGxhaW4gSlMgb2JqZWN0XG4gICAgICAgICAgLy8gV2UgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtIGFuZCBpdGVyYXRlIGFjY29yZGluZ2x5XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVyc0xpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGhlYWRlcnNMaXN0Lmxlbmd0aDsgbiArPSAyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlcnNMaXN0W24gKyAwXS50b1N0cmluZygnbGF0aW4xJylcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gaGVhZGVyc0xpc3RbbiArIDFdLnRvU3RyaW5nKCdsYXRpbjEnKVxuICAgICAgICAgICAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LWVuY29kaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM3MjMxI3NlY3Rpb24tMy4xLjIuMVxuICAgICAgICAgICAgICAgIC8vIFwiQWxsIGNvbnRlbnQtY29kaW5nIHZhbHVlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4uLlwiXG4gICAgICAgICAgICAgICAgY29kaW5ncyA9IHZhbC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcsJykubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2xvY2F0aW9uJykge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gdmFsXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBoZWFkZXJzW2tIZWFkZXJzTGlzdF0uYXBwZW5kKGtleSwgdmFsKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVyc0xpc3QpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGhlYWRlcnNMaXN0W2tleV1cbiAgICAgICAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC1lbmNvZGluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzMSNzZWN0aW9uLTMuMS4yLjFcbiAgICAgICAgICAgICAgICAvLyBcIkFsbCBjb250ZW50LWNvZGluZyB2YWx1ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuLi5cIlxuICAgICAgICAgICAgICAgIGNvZGluZ3MgPSB2YWwudG9Mb3dlckNhc2UoKS5zcGxpdCgnLCcpLm1hcCgoeCkgPT4geC50cmltKCkpLnJldmVyc2UoKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnbG9jYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24gPSB2YWxcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGhlYWRlcnNba0hlYWRlcnNMaXN0XS5hcHBlbmQoa2V5LCB2YWwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5ib2R5ID0gbmV3IFJlYWRhYmxlKHsgcmVhZDogcmVzdW1lIH0pXG5cbiAgICAgICAgICBjb25zdCBkZWNvZGVycyA9IFtdXG5cbiAgICAgICAgICBjb25zdCB3aWxsRm9sbG93ID0gcmVxdWVzdC5yZWRpcmVjdCA9PT0gJ2ZvbGxvdycgJiZcbiAgICAgICAgICAgIGxvY2F0aW9uICYmXG4gICAgICAgICAgICByZWRpcmVjdFN0YXR1c1NldC5oYXMoc3RhdHVzKVxuXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL0NvbnRlbnQtRW5jb2RpbmdcbiAgICAgICAgICBpZiAocmVxdWVzdC5tZXRob2QgIT09ICdIRUFEJyAmJiByZXF1ZXN0Lm1ldGhvZCAhPT0gJ0NPTk5FQ1QnICYmICFudWxsQm9keVN0YXR1cy5pbmNsdWRlcyhzdGF0dXMpICYmICF3aWxsRm9sbG93KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGluZyBvZiBjb2RpbmdzKSB7XG4gICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MTEyLmh0bWwjc2VjdGlvbi03LjJcbiAgICAgICAgICAgICAgaWYgKGNvZGluZyA9PT0gJ3gtZ3ppcCcgfHwgY29kaW5nID09PSAnZ3ppcCcpIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVycy5wdXNoKHpsaWIuY3JlYXRlR3VuemlwKHtcbiAgICAgICAgICAgICAgICAgIC8vIEJlIGxlc3Mgc3RyaWN0IHdoZW4gZGVjb2RpbmcgY29tcHJlc3NlZCByZXNwb25zZXMsIHNpbmNlIHNvbWV0aW1lc1xuICAgICAgICAgICAgICAgICAgLy8gc2VydmVycyBzZW5kIHNsaWdodGx5IGludmFsaWQgcmVzcG9uc2VzIHRoYXQgYXJlIHN0aWxsIGFjY2VwdGVkXG4gICAgICAgICAgICAgICAgICAvLyBieSBjb21tb24gYnJvd3NlcnMuXG4gICAgICAgICAgICAgICAgICAvLyBBbHdheXMgdXNpbmcgWl9TWU5DX0ZMVVNIIGlzIHdoYXQgY1VSTCBkb2VzLlxuICAgICAgICAgICAgICAgICAgZmx1c2g6IHpsaWIuY29uc3RhbnRzLlpfU1lOQ19GTFVTSCxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoOiB6bGliLmNvbnN0YW50cy5aX1NZTkNfRkxVU0hcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RpbmcgPT09ICdkZWZsYXRlJykge1xuICAgICAgICAgICAgICAgIGRlY29kZXJzLnB1c2goemxpYi5jcmVhdGVJbmZsYXRlKCkpXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kaW5nID09PSAnYnInKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlcnMucHVzaCh6bGliLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MoKSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVycy5sZW5ndGggPSAwXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgc3RhdHVzVGV4dCxcbiAgICAgICAgICAgIGhlYWRlcnNMaXN0OiBoZWFkZXJzW2tIZWFkZXJzTGlzdF0sXG4gICAgICAgICAgICBib2R5OiBkZWNvZGVycy5sZW5ndGhcbiAgICAgICAgICAgICAgPyBwaXBlbGluZSh0aGlzLmJvZHksIC4uLmRlY29kZXJzLCAoKSA9PiB7IH0pXG4gICAgICAgICAgICAgIDogdGhpcy5ib2R5Lm9uKCdlcnJvcicsICgpID0+IHt9KVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uRGF0YSAoY2h1bmspIHtcbiAgICAgICAgICBpZiAoZmV0Y2hQYXJhbXMuY29udHJvbGxlci5kdW1wKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAxLiBJZiBvbmUgb3IgbW9yZSBieXRlcyBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQgZnJvbSByZXNwb25zZeKAmXNcbiAgICAgICAgICAvLyBtZXNzYWdlIGJvZHksIHRoZW46XG5cbiAgICAgICAgICAvLyAgMS4gTGV0IGJ5dGVzIGJlIHRoZSB0cmFuc21pdHRlZCBieXRlcy5cbiAgICAgICAgICBjb25zdCBieXRlcyA9IGNodW5rXG5cbiAgICAgICAgICAvLyAgMi4gTGV0IGNvZGluZ3MgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGhlYWRlciBsaXN0IHZhbHVlc1xuICAgICAgICAgIC8vICBnaXZlbiBgQ29udGVudC1FbmNvZGluZ2AgYW5kIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgICAgICAvLyAgU2VlIHB1bGxBbGdvcml0aG0uXG5cbiAgICAgICAgICAvLyAgMy4gSW5jcmVhc2UgdGltaW5nSW5mb+KAmXMgZW5jb2RlZCBib2R5IHNpemUgYnkgYnl0ZXPigJlzIGxlbmd0aC5cbiAgICAgICAgICB0aW1pbmdJbmZvLmVuY29kZWRCb2R5U2l6ZSArPSBieXRlcy5ieXRlTGVuZ3RoXG5cbiAgICAgICAgICAvLyAgNC4gU2VlIHB1bGxBbGdvcml0aG0uLi5cblxuICAgICAgICAgIHJldHVybiB0aGlzLmJvZHkucHVzaChieXRlcylcbiAgICAgICAgfSxcblxuICAgICAgICBvbkNvbXBsZXRlICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5hYm9ydCkge1xuICAgICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vZmYoJ3Rlcm1pbmF0ZWQnLCB0aGlzLmFib3J0KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZW5kZWQgPSB0cnVlXG5cbiAgICAgICAgICB0aGlzLmJvZHkucHVzaChudWxsKVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uRXJyb3IgKGVycm9yKSB7XG4gICAgICAgICAgaWYgKHRoaXMuYWJvcnQpIHtcbiAgICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIub2ZmKCd0ZXJtaW5hdGVkJywgdGhpcy5hYm9ydClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmJvZHk/LmRlc3Ryb3koZXJyb3IpXG5cbiAgICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShlcnJvcilcblxuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSxcblxuICAgICAgICBvblVwZ3JhZGUgKHN0YXR1cywgaGVhZGVyc0xpc3QsIHNvY2tldCkge1xuICAgICAgICAgIGlmIChzdGF0dXMgIT09IDEwMSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcblxuICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgaGVhZGVyc0xpc3QubGVuZ3RoOyBuICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlcnNMaXN0W24gKyAwXS50b1N0cmluZygnbGF0aW4xJylcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGhlYWRlcnNMaXN0W24gKyAxXS50b1N0cmluZygnbGF0aW4xJylcblxuICAgICAgICAgICAgaGVhZGVyc1trSGVhZGVyc0xpc3RdLmFwcGVuZChrZXksIHZhbClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IFNUQVRVU19DT0RFU1tzdGF0dXNdLFxuICAgICAgICAgICAgaGVhZGVyc0xpc3Q6IGhlYWRlcnNba0hlYWRlcnNMaXN0XSxcbiAgICAgICAgICAgIHNvY2tldFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZmV0Y2gsXG4gIEZldGNoLFxuICBmZXRjaGluZyxcbiAgZmluYWxpemVBbmRSZXBvcnRUaW1pbmdcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBrU3RhdGU6IFN5bWJvbCgnRmlsZVJlYWRlciBzdGF0ZScpLFxuICBrUmVzdWx0OiBTeW1ib2woJ0ZpbGVSZWFkZXIgcmVzdWx0JyksXG4gIGtFcnJvcjogU3ltYm9sKCdGaWxlUmVhZGVyIGVycm9yJyksXG4gIGtMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkOiBTeW1ib2woJ0ZpbGVSZWFkZXIgbGFzdCBwcm9ncmVzcyBldmVudCBmaXJlZCB0aW1lc3RhbXAnKSxcbiAga0V2ZW50czogU3ltYm9sKCdGaWxlUmVhZGVyIGV2ZW50cycpLFxuICBrQWJvcnRlZDogU3ltYm9sKCdGaWxlUmVhZGVyIGFib3J0ZWQnKVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5cbmNvbnN0IGtTdGF0ZSA9IFN5bWJvbCgnUHJvZ3Jlc3NFdmVudCBzdGF0ZScpXG5cbi8qKlxuICogQHNlZSBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3Byb2dyZXNzZXZlbnRcbiAqL1xuY2xhc3MgUHJvZ3Jlc3NFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgY29uc3RydWN0b3IgKHR5cGUsIGV2ZW50SW5pdERpY3QgPSB7fSkge1xuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSlcbiAgICBldmVudEluaXREaWN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUHJvZ3Jlc3NFdmVudEluaXQoZXZlbnRJbml0RGljdCA/PyB7fSlcblxuICAgIHN1cGVyKHR5cGUsIGV2ZW50SW5pdERpY3QpXG5cbiAgICB0aGlzW2tTdGF0ZV0gPSB7XG4gICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudEluaXREaWN0Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICBsb2FkZWQ6IGV2ZW50SW5pdERpY3QubG9hZGVkLFxuICAgICAgdG90YWw6IGV2ZW50SW5pdERpY3QudG90YWxcbiAgICB9XG4gIH1cblxuICBnZXQgbGVuZ3RoQ29tcHV0YWJsZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUHJvZ3Jlc3NFdmVudClcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubGVuZ3RoQ29tcHV0YWJsZVxuICB9XG5cbiAgZ2V0IGxvYWRlZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUHJvZ3Jlc3NFdmVudClcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubG9hZGVkXG4gIH1cblxuICBnZXQgdG90YWwgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFByb2dyZXNzRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnRvdGFsXG4gIH1cbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuUHJvZ3Jlc3NFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdsZW5ndGhDb21wdXRhYmxlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnbG9hZGVkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBsb25nIGxvbmcnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3RvdGFsJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBsb25nIGxvbmcnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ2J1YmJsZXMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjYW5jZWxhYmxlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY29tcG9zZWQnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH1cbl0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBQcm9ncmVzc0V2ZW50XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZW5jb2RpbmctZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IGxhYmVsXG4gKi9cbmZ1bmN0aW9uIGdldEVuY29kaW5nIChsYWJlbCkge1xuICBpZiAoIWxhYmVsKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gMS4gUmVtb3ZlIGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyBBU0NJSSB3aGl0ZXNwYWNlIGZyb20gbGFiZWwuXG4gIC8vIDIuIElmIGxhYmVsIGlzIGFuIEFTQ0lJIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yIGFueSBvZiB0aGVcbiAgLy8gICAgbGFiZWxzIGxpc3RlZCBpbiB0aGUgdGFibGUgYmVsb3csIHRoZW4gcmV0dXJuIHRoZVxuICAvLyAgICBjb3JyZXNwb25kaW5nIGVuY29kaW5nOyBvdGhlcndpc2UgcmV0dXJuIGZhaWx1cmUuXG4gIHN3aXRjaCAobGFiZWwudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICd1bmljb2RlLTEtMS11dGYtOCc6XG4gICAgY2FzZSAndW5pY29kZTExdXRmOCc6XG4gICAgY2FzZSAndW5pY29kZTIwdXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3gtdW5pY29kZTIwdXRmOCc6XG4gICAgICByZXR1cm4gJ1VURi04J1xuICAgIGNhc2UgJzg2Nic6XG4gICAgY2FzZSAnY3A4NjYnOlxuICAgIGNhc2UgJ2NzaWJtODY2JzpcbiAgICBjYXNlICdpYm04NjYnOlxuICAgICAgcmV0dXJuICdJQk04NjYnXG4gICAgY2FzZSAnY3Npc29sYXRpbjInOlxuICAgIGNhc2UgJ2lzby04ODU5LTInOlxuICAgIGNhc2UgJ2lzby1pci0xMDEnOlxuICAgIGNhc2UgJ2lzbzg4NTktMic6XG4gICAgY2FzZSAnaXNvODg1OTInOlxuICAgIGNhc2UgJ2lzb184ODU5LTInOlxuICAgIGNhc2UgJ2lzb184ODU5LTI6MTk4Nyc6XG4gICAgY2FzZSAnbDInOlxuICAgIGNhc2UgJ2xhdGluMic6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTInXG4gICAgY2FzZSAnY3Npc29sYXRpbjMnOlxuICAgIGNhc2UgJ2lzby04ODU5LTMnOlxuICAgIGNhc2UgJ2lzby1pci0xMDknOlxuICAgIGNhc2UgJ2lzbzg4NTktMyc6XG4gICAgY2FzZSAnaXNvODg1OTMnOlxuICAgIGNhc2UgJ2lzb184ODU5LTMnOlxuICAgIGNhc2UgJ2lzb184ODU5LTM6MTk4OCc6XG4gICAgY2FzZSAnbDMnOlxuICAgIGNhc2UgJ2xhdGluMyc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTMnXG4gICAgY2FzZSAnY3Npc29sYXRpbjQnOlxuICAgIGNhc2UgJ2lzby04ODU5LTQnOlxuICAgIGNhc2UgJ2lzby1pci0xMTAnOlxuICAgIGNhc2UgJ2lzbzg4NTktNCc6XG4gICAgY2FzZSAnaXNvODg1OTQnOlxuICAgIGNhc2UgJ2lzb184ODU5LTQnOlxuICAgIGNhc2UgJ2lzb184ODU5LTQ6MTk4OCc6XG4gICAgY2FzZSAnbDQnOlxuICAgIGNhc2UgJ2xhdGluNCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTQnXG4gICAgY2FzZSAnY3Npc29sYXRpbmN5cmlsbGljJzpcbiAgICBjYXNlICdjeXJpbGxpYyc6XG4gICAgY2FzZSAnaXNvLTg4NTktNSc6XG4gICAgY2FzZSAnaXNvLWlyLTE0NCc6XG4gICAgY2FzZSAnaXNvODg1OS01JzpcbiAgICBjYXNlICdpc284ODU5NSc6XG4gICAgY2FzZSAnaXNvXzg4NTktNSc6XG4gICAgY2FzZSAnaXNvXzg4NTktNToxOTg4JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktNSdcbiAgICBjYXNlICdhcmFiaWMnOlxuICAgIGNhc2UgJ2FzbW8tNzA4JzpcbiAgICBjYXNlICdjc2lzbzg4NTk2ZSc6XG4gICAgY2FzZSAnY3Npc284ODU5NmknOlxuICAgIGNhc2UgJ2NzaXNvbGF0aW5hcmFiaWMnOlxuICAgIGNhc2UgJ2VjbWEtMTE0JzpcbiAgICBjYXNlICdpc28tODg1OS02JzpcbiAgICBjYXNlICdpc28tODg1OS02LWUnOlxuICAgIGNhc2UgJ2lzby04ODU5LTYtaSc6XG4gICAgY2FzZSAnaXNvLWlyLTEyNyc6XG4gICAgY2FzZSAnaXNvODg1OS02JzpcbiAgICBjYXNlICdpc284ODU5Nic6XG4gICAgY2FzZSAnaXNvXzg4NTktNic6XG4gICAgY2FzZSAnaXNvXzg4NTktNjoxOTg3JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktNidcbiAgICBjYXNlICdjc2lzb2xhdGluZ3JlZWsnOlxuICAgIGNhc2UgJ2VjbWEtMTE4JzpcbiAgICBjYXNlICdlbG90XzkyOCc6XG4gICAgY2FzZSAnZ3JlZWsnOlxuICAgIGNhc2UgJ2dyZWVrOCc6XG4gICAgY2FzZSAnaXNvLTg4NTktNyc6XG4gICAgY2FzZSAnaXNvLWlyLTEyNic6XG4gICAgY2FzZSAnaXNvODg1OS03JzpcbiAgICBjYXNlICdpc284ODU5Nyc6XG4gICAgY2FzZSAnaXNvXzg4NTktNyc6XG4gICAgY2FzZSAnaXNvXzg4NTktNzoxOTg3JzpcbiAgICBjYXNlICdzdW5fZXVfZ3JlZWsnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS03J1xuICAgIGNhc2UgJ2NzaXNvODg1OThlJzpcbiAgICBjYXNlICdjc2lzb2xhdGluaGVicmV3JzpcbiAgICBjYXNlICdoZWJyZXcnOlxuICAgIGNhc2UgJ2lzby04ODU5LTgnOlxuICAgIGNhc2UgJ2lzby04ODU5LTgtZSc6XG4gICAgY2FzZSAnaXNvLWlyLTEzOCc6XG4gICAgY2FzZSAnaXNvODg1OS04JzpcbiAgICBjYXNlICdpc284ODU5OCc6XG4gICAgY2FzZSAnaXNvXzg4NTktOCc6XG4gICAgY2FzZSAnaXNvXzg4NTktODoxOTg4JzpcbiAgICBjYXNlICd2aXN1YWwnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS04J1xuICAgIGNhc2UgJ2NzaXNvODg1OThpJzpcbiAgICBjYXNlICdpc28tODg1OS04LWknOlxuICAgIGNhc2UgJ2xvZ2ljYWwnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS04LUknXG4gICAgY2FzZSAnY3Npc29sYXRpbjYnOlxuICAgIGNhc2UgJ2lzby04ODU5LTEwJzpcbiAgICBjYXNlICdpc28taXItMTU3JzpcbiAgICBjYXNlICdpc284ODU5LTEwJzpcbiAgICBjYXNlICdpc284ODU5MTAnOlxuICAgIGNhc2UgJ2w2JzpcbiAgICBjYXNlICdsYXRpbjYnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS0xMCdcbiAgICBjYXNlICdpc28tODg1OS0xMyc6XG4gICAgY2FzZSAnaXNvODg1OS0xMyc6XG4gICAgY2FzZSAnaXNvODg1OTEzJzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMTMnXG4gICAgY2FzZSAnaXNvLTg4NTktMTQnOlxuICAgIGNhc2UgJ2lzbzg4NTktMTQnOlxuICAgIGNhc2UgJ2lzbzg4NTkxNCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTE0J1xuICAgIGNhc2UgJ2NzaXNvbGF0aW45JzpcbiAgICBjYXNlICdpc28tODg1OS0xNSc6XG4gICAgY2FzZSAnaXNvODg1OS0xNSc6XG4gICAgY2FzZSAnaXNvODg1OTE1JzpcbiAgICBjYXNlICdpc29fODg1OS0xNSc6XG4gICAgY2FzZSAnbDknOlxuICAgICAgcmV0dXJuICdJU08tODg1OS0xNSdcbiAgICBjYXNlICdpc28tODg1OS0xNic6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTE2J1xuICAgIGNhc2UgJ2Nza29pOHInOlxuICAgIGNhc2UgJ2tvaSc6XG4gICAgY2FzZSAna29pOCc6XG4gICAgY2FzZSAna29pOC1yJzpcbiAgICBjYXNlICdrb2k4X3InOlxuICAgICAgcmV0dXJuICdLT0k4LVInXG4gICAgY2FzZSAna29pOC1ydSc6XG4gICAgY2FzZSAna29pOC11JzpcbiAgICAgIHJldHVybiAnS09JOC1VJ1xuICAgIGNhc2UgJ2NzbWFjaW50b3NoJzpcbiAgICBjYXNlICdtYWMnOlxuICAgIGNhc2UgJ21hY2ludG9zaCc6XG4gICAgY2FzZSAneC1tYWMtcm9tYW4nOlxuICAgICAgcmV0dXJuICdtYWNpbnRvc2gnXG4gICAgY2FzZSAnaXNvLTg4NTktMTEnOlxuICAgIGNhc2UgJ2lzbzg4NTktMTEnOlxuICAgIGNhc2UgJ2lzbzg4NTkxMSc6XG4gICAgY2FzZSAndGlzLTYyMCc6XG4gICAgY2FzZSAnd2luZG93cy04NzQnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTg3NCdcbiAgICBjYXNlICdjcDEyNTAnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1MCc6XG4gICAgY2FzZSAneC1jcDEyNTAnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTAnXG4gICAgY2FzZSAnY3AxMjUxJzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTEnOlxuICAgIGNhc2UgJ3gtY3AxMjUxJzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjUxJ1xuICAgIGNhc2UgJ2Fuc2lfeDMuNC0xOTY4JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnY3AxMjUyJzpcbiAgICBjYXNlICdjcDgxOSc6XG4gICAgY2FzZSAnY3Npc29sYXRpbjEnOlxuICAgIGNhc2UgJ2libTgxOSc6XG4gICAgY2FzZSAnaXNvLTg4NTktMSc6XG4gICAgY2FzZSAnaXNvLWlyLTEwMCc6XG4gICAgY2FzZSAnaXNvODg1OS0xJzpcbiAgICBjYXNlICdpc284ODU5MSc6XG4gICAgY2FzZSAnaXNvXzg4NTktMSc6XG4gICAgY2FzZSAnaXNvXzg4NTktMToxOTg3JzpcbiAgICBjYXNlICdsMSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICd1cy1hc2NpaSc6XG4gICAgY2FzZSAnd2luZG93cy0xMjUyJzpcbiAgICBjYXNlICd4LWNwMTI1Mic6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1MidcbiAgICBjYXNlICdjcDEyNTMnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1Myc6XG4gICAgY2FzZSAneC1jcDEyNTMnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTMnXG4gICAgY2FzZSAnY3AxMjU0JzpcbiAgICBjYXNlICdjc2lzb2xhdGluNSc6XG4gICAgY2FzZSAnaXNvLTg4NTktOSc6XG4gICAgY2FzZSAnaXNvLWlyLTE0OCc6XG4gICAgY2FzZSAnaXNvODg1OS05JzpcbiAgICBjYXNlICdpc284ODU5OSc6XG4gICAgY2FzZSAnaXNvXzg4NTktOSc6XG4gICAgY2FzZSAnaXNvXzg4NTktOToxOTg5JzpcbiAgICBjYXNlICdsNSc6XG4gICAgY2FzZSAnbGF0aW41JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTQnOlxuICAgIGNhc2UgJ3gtY3AxMjU0JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU0J1xuICAgIGNhc2UgJ2NwMTI1NSc6XG4gICAgY2FzZSAnd2luZG93cy0xMjU1JzpcbiAgICBjYXNlICd4LWNwMTI1NSc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1NSdcbiAgICBjYXNlICdjcDEyNTYnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1Nic6XG4gICAgY2FzZSAneC1jcDEyNTYnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTYnXG4gICAgY2FzZSAnY3AxMjU3JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTcnOlxuICAgIGNhc2UgJ3gtY3AxMjU3JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU3J1xuICAgIGNhc2UgJ2NwMTI1OCc6XG4gICAgY2FzZSAnd2luZG93cy0xMjU4JzpcbiAgICBjYXNlICd4LWNwMTI1OCc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1OCdcbiAgICBjYXNlICd4LW1hYy1jeXJpbGxpYyc6XG4gICAgY2FzZSAneC1tYWMtdWtyYWluaWFuJzpcbiAgICAgIHJldHVybiAneC1tYWMtY3lyaWxsaWMnXG4gICAgY2FzZSAnY2hpbmVzZSc6XG4gICAgY2FzZSAnY3NnYjIzMTInOlxuICAgIGNhc2UgJ2NzaXNvNThnYjIzMTI4MCc6XG4gICAgY2FzZSAnZ2IyMzEyJzpcbiAgICBjYXNlICdnYl8yMzEyJzpcbiAgICBjYXNlICdnYl8yMzEyLTgwJzpcbiAgICBjYXNlICdnYmsnOlxuICAgIGNhc2UgJ2lzby1pci01OCc6XG4gICAgY2FzZSAneC1nYmsnOlxuICAgICAgcmV0dXJuICdHQksnXG4gICAgY2FzZSAnZ2IxODAzMCc6XG4gICAgICByZXR1cm4gJ2diMTgwMzAnXG4gICAgY2FzZSAnYmlnNSc6XG4gICAgY2FzZSAnYmlnNS1oa3Njcyc6XG4gICAgY2FzZSAnY24tYmlnNSc6XG4gICAgY2FzZSAnY3NiaWc1JzpcbiAgICBjYXNlICd4LXgtYmlnNSc6XG4gICAgICByZXR1cm4gJ0JpZzUnXG4gICAgY2FzZSAnY3NldWNwa2RmbXRqYXBhbmVzZSc6XG4gICAgY2FzZSAnZXVjLWpwJzpcbiAgICBjYXNlICd4LWV1Yy1qcCc6XG4gICAgICByZXR1cm4gJ0VVQy1KUCdcbiAgICBjYXNlICdjc2lzbzIwMjJqcCc6XG4gICAgY2FzZSAnaXNvLTIwMjItanAnOlxuICAgICAgcmV0dXJuICdJU08tMjAyMi1KUCdcbiAgICBjYXNlICdjc3NoaWZ0amlzJzpcbiAgICBjYXNlICdtczkzMic6XG4gICAgY2FzZSAnbXNfa2FuamknOlxuICAgIGNhc2UgJ3NoaWZ0LWppcyc6XG4gICAgY2FzZSAnc2hpZnRfamlzJzpcbiAgICBjYXNlICdzamlzJzpcbiAgICBjYXNlICd3aW5kb3dzLTMxaic6XG4gICAgY2FzZSAneC1zamlzJzpcbiAgICAgIHJldHVybiAnU2hpZnRfSklTJ1xuICAgIGNhc2UgJ2NzZXVja3InOlxuICAgIGNhc2UgJ2Nza3NjNTYwMTE5ODcnOlxuICAgIGNhc2UgJ2V1Yy1rcic6XG4gICAgY2FzZSAnaXNvLWlyLTE0OSc6XG4gICAgY2FzZSAna29yZWFuJzpcbiAgICBjYXNlICdrc19jXzU2MDEtMTk4Nyc6XG4gICAgY2FzZSAna3NfY181NjAxLTE5ODknOlxuICAgIGNhc2UgJ2tzYzU2MDEnOlxuICAgIGNhc2UgJ2tzY181NjAxJzpcbiAgICBjYXNlICd3aW5kb3dzLTk0OSc6XG4gICAgICByZXR1cm4gJ0VVQy1LUidcbiAgICBjYXNlICdjc2lzbzIwMjJrcic6XG4gICAgY2FzZSAnaHotZ2ItMjMxMic6XG4gICAgY2FzZSAnaXNvLTIwMjItY24nOlxuICAgIGNhc2UgJ2lzby0yMDIyLWNuLWV4dCc6XG4gICAgY2FzZSAnaXNvLTIwMjIta3InOlxuICAgIGNhc2UgJ3JlcGxhY2VtZW50JzpcbiAgICAgIHJldHVybiAncmVwbGFjZW1lbnQnXG4gICAgY2FzZSAndW5pY29kZWZmZmUnOlxuICAgIGNhc2UgJ3V0Zi0xNmJlJzpcbiAgICAgIHJldHVybiAnVVRGLTE2QkUnXG4gICAgY2FzZSAnY3N1bmljb2RlJzpcbiAgICBjYXNlICdpc28tMTA2NDYtdWNzLTInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1bmljb2RlJzpcbiAgICBjYXNlICd1bmljb2RlZmVmZic6XG4gICAgY2FzZSAndXRmLTE2JzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gJ1VURi0xNkxFJ1xuICAgIGNhc2UgJ3gtdXNlci1kZWZpbmVkJzpcbiAgICAgIHJldHVybiAneC11c2VyLWRlZmluZWQnXG4gICAgZGVmYXVsdDogcmV0dXJuICdmYWlsdXJlJ1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRFbmNvZGluZ1xufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBrU3RhdGUsXG4gIGtFcnJvcixcbiAga1Jlc3VsdCxcbiAga0Fib3J0ZWQsXG4gIGtMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXG59ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgUHJvZ3Jlc3NFdmVudCB9ID0gcmVxdWlyZSgnLi9wcm9ncmVzc2V2ZW50JylcbmNvbnN0IHsgZ2V0RW5jb2RpbmcgfSA9IHJlcXVpcmUoJy4vZW5jb2RpbmcnKVxuY29uc3QgeyBET01FeGNlcHRpb24gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2NvbnN0YW50cycpXG5jb25zdCB7IHNlcmlhbGl6ZUFNaW1lVHlwZSwgcGFyc2VNSU1FVHlwZSB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YVVSTCcpXG5jb25zdCB7IHR5cGVzIH0gPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IHsgU3RyaW5nRGVjb2RlciB9ID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKVxuY29uc3QgeyBidG9hIH0gPSByZXF1aXJlKCdidWZmZXInKVxuXG4vKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi9cbmNvbnN0IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMgPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI3JlYWRPcGVyYXRpb25cbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ZpbGVyZWFkZXInKS5GaWxlUmVhZGVyfSBmclxuICogQHBhcmFtIHtpbXBvcnQoJ2J1ZmZlcicpLkJsb2J9IGJsb2JcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZz99IGVuY29kaW5nTmFtZVxuICovXG5mdW5jdGlvbiByZWFkT3BlcmF0aW9uIChmciwgYmxvYiwgdHlwZSwgZW5jb2RpbmdOYW1lKSB7XG4gIC8vIDEuIElmIGZy4oCZcyBzdGF0ZSBpcyBcImxvYWRpbmdcIiwgdGhyb3cgYW4gSW52YWxpZFN0YXRlRXJyb3JcbiAgLy8gICAgRE9NRXhjZXB0aW9uLlxuICBpZiAoZnJba1N0YXRlXSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignSW52YWxpZCBzdGF0ZScsICdJbnZhbGlkU3RhdGVFcnJvcicpXG4gIH1cblxuICAvLyAyLiBTZXQgZnLigJlzIHN0YXRlIHRvIFwibG9hZGluZ1wiLlxuICBmcltrU3RhdGVdID0gJ2xvYWRpbmcnXG5cbiAgLy8gMy4gU2V0IGZy4oCZcyByZXN1bHQgdG8gbnVsbC5cbiAgZnJba1Jlc3VsdF0gPSBudWxsXG5cbiAgLy8gNC4gU2V0IGZy4oCZcyBlcnJvciB0byBudWxsLlxuICBmcltrRXJyb3JdID0gbnVsbFxuXG4gIC8vIDUuIExldCBzdHJlYW0gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGdldCBzdHJlYW0gb24gYmxvYi5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbX0gKi9cbiAgY29uc3Qgc3RyZWFtID0gYmxvYi5zdHJlYW0oKVxuXG4gIC8vIDYuIExldCByZWFkZXIgYmUgdGhlIHJlc3VsdCBvZiBnZXR0aW5nIGEgcmVhZGVyIGZyb20gc3RyZWFtLlxuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKClcblxuICAvLyA3LiBMZXQgYnl0ZXMgYmUgYW4gZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgLyoqIEB0eXBlIHtVaW50OEFycmF5W119ICovXG4gIGNvbnN0IGJ5dGVzID0gW11cblxuICAvLyA4LiBMZXQgY2h1bmtQcm9taXNlIGJlIHRoZSByZXN1bHQgb2YgcmVhZGluZyBhIGNodW5rIGZyb21cbiAgLy8gICAgc3RyZWFtIHdpdGggcmVhZGVyLlxuICBsZXQgY2h1bmtQcm9taXNlID0gcmVhZGVyLnJlYWQoKVxuXG4gIC8vIDkuIExldCBpc0ZpcnN0Q2h1bmsgYmUgdHJ1ZS5cbiAgbGV0IGlzRmlyc3RDaHVuayA9IHRydWVcblxuICAvLyAxMC4gSW4gcGFyYWxsZWwsIHdoaWxlIHRydWU6XG4gIC8vIE5vdGU6IFwiSW4gcGFyYWxsZWxcIiBqdXN0IG1lYW5zIG5vbi1ibG9ja2luZ1xuICAvLyBOb3RlIDI6IHJlYWRPcGVyYXRpb24gaXRzZWxmIGNhbm5vdCBiZSBhc3luYyBhcyBkb3VibGVcbiAgLy8gcmVhZGluZyB0aGUgYm9keSB3b3VsZCB0aGVuIHJlamVjdCB0aGUgcHJvbWlzZSwgaW5zdGVhZFxuICAvLyBvZiB0aHJvd2luZyBhbiBlcnJvci5cbiAgOyhhc3luYyAoKSA9PiB7XG4gICAgd2hpbGUgKCFmcltrQWJvcnRlZF0pIHtcbiAgICAgIC8vIDEuIFdhaXQgZm9yIGNodW5rUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgb3IgcmVqZWN0ZWQuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBjaHVua1Byb21pc2VcblxuICAgICAgICAvLyAyLiBJZiBjaHVua1Byb21pc2UgaXMgZnVsZmlsbGVkLCBhbmQgaXNGaXJzdENodW5rIGlzXG4gICAgICAgIC8vICAgIHRydWUsIHF1ZXVlIGEgdGFzayB0byBmaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkXG4gICAgICAgIC8vICAgIGxvYWRzdGFydCBhdCBmci5cbiAgICAgICAgaWYgKGlzRmlyc3RDaHVuayAmJiAhZnJba0Fib3J0ZWRdKSB7XG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2Fkc3RhcnQnLCBmcilcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gU2V0IGlzRmlyc3RDaHVuayB0byBmYWxzZS5cbiAgICAgICAgaXNGaXJzdENodW5rID0gZmFsc2VcblxuICAgICAgICAvLyA0LiBJZiBjaHVua1Byb21pc2UgaXMgZnVsZmlsbGVkIHdpdGggYW4gb2JqZWN0IHdob3NlXG4gICAgICAgIC8vICAgIGRvbmUgcHJvcGVydHkgaXMgZmFsc2UgYW5kIHdob3NlIHZhbHVlIHByb3BlcnR5IGlzXG4gICAgICAgIC8vICAgIGEgVWludDhBcnJheSBvYmplY3QsIHJ1biB0aGVzZSBzdGVwczpcbiAgICAgICAgaWYgKCFkb25lICYmIHR5cGVzLmlzVWludDhBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyAxLiBMZXQgYnMgYmUgdGhlIGJ5dGUgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhlXG4gICAgICAgICAgLy8gICAgVWludDhBcnJheSBvYmplY3QuXG5cbiAgICAgICAgICAvLyAyLiBBcHBlbmQgYnMgdG8gYnl0ZXMuXG4gICAgICAgICAgYnl0ZXMucHVzaCh2YWx1ZSlcblxuICAgICAgICAgIC8vIDMuIElmIHJvdWdobHkgNTBtcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGVzZSBzdGVwc1xuICAgICAgICAgIC8vICAgIHdlcmUgbGFzdCBpbnZva2VkLCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhXG4gICAgICAgICAgLy8gICAgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIHByb2dyZXNzIGF0IGZyLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgZnJba0xhc3RQcm9ncmVzc0V2ZW50RmlyZWRdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGZyW2tMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXSA+PSA1MFxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgIWZyW2tBYm9ydGVkXVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZnJba0xhc3RQcm9ncmVzc0V2ZW50RmlyZWRdID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ3Byb2dyZXNzJywgZnIpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuIFNldCBjaHVua1Byb21pc2UgdG8gdGhlIHJlc3VsdCBvZiByZWFkaW5nIGFcbiAgICAgICAgICAvLyAgICBjaHVuayBmcm9tIHN0cmVhbSB3aXRoIHJlYWRlci5cbiAgICAgICAgICBjaHVua1Byb21pc2UgPSByZWFkZXIucmVhZCgpXG4gICAgICAgIH0gZWxzZSBpZiAoZG9uZSkge1xuICAgICAgICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgY2h1bmtQcm9taXNlIGlzIGZ1bGZpbGxlZCB3aXRoIGFuXG4gICAgICAgICAgLy8gICAgb2JqZWN0IHdob3NlIGRvbmUgcHJvcGVydHkgaXMgdHJ1ZSwgcXVldWUgYSB0YXNrXG4gICAgICAgICAgLy8gICAgdG8gcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgYW5kIGFib3J0IHRoaXMgYWxnb3JpdGhtOlxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIC8vIDEuIFNldCBmcuKAmXMgc3RhdGUgdG8gXCJkb25lXCIuXG4gICAgICAgICAgICBmcltrU3RhdGVdID0gJ2RvbmUnXG5cbiAgICAgICAgICAgIC8vIDIuIExldCByZXN1bHQgYmUgdGhlIHJlc3VsdCBvZiBwYWNrYWdlIGRhdGEgZ2l2ZW5cbiAgICAgICAgICAgIC8vICAgIGJ5dGVzLCB0eXBlLCBibG9i4oCZcyB0eXBlLCBhbmQgZW5jb2RpbmdOYW1lLlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFja2FnZURhdGEoYnl0ZXMsIHR5cGUsIGJsb2IudHlwZSwgZW5jb2RpbmdOYW1lKVxuXG4gICAgICAgICAgICAgIC8vIDQuIEVsc2U6XG5cbiAgICAgICAgICAgICAgaWYgKGZyW2tBYm9ydGVkXSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gMS4gU2V0IGZy4oCZcyByZXN1bHQgdG8gcmVzdWx0LlxuICAgICAgICAgICAgICBmcltrUmVzdWx0XSA9IHJlc3VsdFxuXG4gICAgICAgICAgICAgIC8vIDIuIEZpcmUgYSBwcm9ncmVzcyBldmVudCBjYWxsZWQgbG9hZCBhdCB0aGUgZnIuXG4gICAgICAgICAgICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnbG9hZCcsIGZyKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gMy4gSWYgcGFja2FnZSBkYXRhIHRocmV3IGFuIGV4Y2VwdGlvbiBlcnJvcjpcblxuICAgICAgICAgICAgICAvLyAxLiBTZXQgZnLigJlzIGVycm9yIHRvIGVycm9yLlxuICAgICAgICAgICAgICBmcltrRXJyb3JdID0gZXJyb3JcblxuICAgICAgICAgICAgICAvLyAyLiBGaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIGVycm9yIGF0IGZyLlxuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2Vycm9yJywgZnIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDUuIElmIGZy4oCZcyBzdGF0ZSBpcyBub3QgXCJsb2FkaW5nXCIsIGZpcmUgYSBwcm9ncmVzc1xuICAgICAgICAgICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgdGhlIGZyLlxuICAgICAgICAgICAgaWYgKGZyW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnLCBmcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGZyW2tBYm9ydGVkXSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNi4gT3RoZXJ3aXNlLCBpZiBjaHVua1Byb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCBhblxuICAgICAgICAvLyAgICBlcnJvciBlcnJvciwgcXVldWUgYSB0YXNrIHRvIHJ1biB0aGUgZm9sbG93aW5nXG4gICAgICAgIC8vICAgIHN0ZXBzIGFuZCBhYm9ydCB0aGlzIGFsZ29yaXRobTpcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgIC8vIDEuIFNldCBmcuKAmXMgc3RhdGUgdG8gXCJkb25lXCIuXG4gICAgICAgICAgZnJba1N0YXRlXSA9ICdkb25lJ1xuXG4gICAgICAgICAgLy8gMi4gU2V0IGZy4oCZcyBlcnJvciB0byBlcnJvci5cbiAgICAgICAgICBmcltrRXJyb3JdID0gZXJyb3JcblxuICAgICAgICAgIC8vIDMuIEZpcmUgYSBwcm9ncmVzcyBldmVudCBjYWxsZWQgZXJyb3IgYXQgZnIuXG4gICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdlcnJvcicsIGZyKVxuXG4gICAgICAgICAgLy8gNC4gSWYgZnLigJlzIHN0YXRlIGlzIG5vdCBcImxvYWRpbmdcIiwgZmlyZSBhIHByb2dyZXNzXG4gICAgICAgICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgZnIuXG4gICAgICAgICAgaWYgKGZyW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2FkZW5kJywgZnIpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9KSgpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZmlyZS1hLXByb2dyZXNzLWV2ZW50XG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ldmVudC1maXJlXG4gKiBAcGFyYW0ge3N0cmluZ30gZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ZpbGVyZWFkZXInKS5GaWxlUmVhZGVyfSByZWFkZXJcbiAqL1xuZnVuY3Rpb24gZmlyZUFQcm9ncmVzc0V2ZW50IChlLCByZWFkZXIpIHtcbiAgLy8gVGhlIHByb2dyZXNzIGV2ZW50IGUgZG9lcyBub3QgYnViYmxlLiBlLmJ1YmJsZXMgbXVzdCBiZSBmYWxzZVxuICAvLyBUaGUgcHJvZ3Jlc3MgZXZlbnQgZSBpcyBOT1QgY2FuY2VsYWJsZS4gZS5jYW5jZWxhYmxlIG11c3QgYmUgZmFsc2VcbiAgY29uc3QgZXZlbnQgPSBuZXcgUHJvZ3Jlc3NFdmVudChlLCB7XG4gICAgYnViYmxlczogZmFsc2UsXG4gICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgfSlcblxuICByZWFkZXIuZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNibG9iLXBhY2thZ2UtZGF0YVxuICogQHBhcmFtIHtVaW50OEFycmF5W119IGJ5dGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmc/fSBtaW1lVHlwZVxuICogQHBhcmFtIHtzdHJpbmc/fSBlbmNvZGluZ05hbWVcbiAqL1xuZnVuY3Rpb24gcGFja2FnZURhdGEgKGJ5dGVzLCB0eXBlLCBtaW1lVHlwZSwgZW5jb2RpbmdOYW1lKSB7XG4gIC8vIDEuIEEgQmxvYiBoYXMgYW4gYXNzb2NpYXRlZCBwYWNrYWdlIGRhdGEgYWxnb3JpdGhtLCBnaXZlblxuICAvLyAgICBieXRlcywgYSB0eXBlLCBhIG9wdGlvbmFsIG1pbWVUeXBlLCBhbmQgYSBvcHRpb25hbFxuICAvLyAgICBlbmNvZGluZ05hbWUsIHdoaWNoIHN3aXRjaGVzIG9uIHR5cGUgYW5kIHJ1bnMgdGhlXG4gIC8vICAgIGFzc29jaWF0ZWQgc3RlcHM6XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnRGF0YVVSTCc6IHtcbiAgICAgIC8vIDEuIFJldHVybiBieXRlcyBhcyBhIERhdGFVUkwgW1JGQzIzOTddIHN1YmplY3QgdG9cbiAgICAgIC8vICAgIHRoZSBjb25zaWRlcmF0aW9ucyBiZWxvdzpcbiAgICAgIC8vICAqIFVzZSBtaW1lVHlwZSBhcyBwYXJ0IG9mIHRoZSBEYXRhIFVSTCBpZiBpdCBpc1xuICAgICAgLy8gICAgYXZhaWxhYmxlIGluIGtlZXBpbmcgd2l0aCB0aGUgRGF0YSBVUkxcbiAgICAgIC8vICAgIHNwZWNpZmljYXRpb24gW1JGQzIzOTddLlxuICAgICAgLy8gICogSWYgbWltZVR5cGUgaXMgbm90IGF2YWlsYWJsZSByZXR1cm4gYSBEYXRhIFVSTFxuICAgICAgLy8gICAgd2l0aG91dCBhIG1lZGlhLXR5cGUuIFtSRkMyMzk3XS5cblxuICAgICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMyMzk3I3NlY3Rpb24tM1xuICAgICAgLy8gZGF0YXVybCAgICA6PSBcImRhdGE6XCIgWyBtZWRpYXR5cGUgXSBbIFwiO2Jhc2U2NFwiIF0gXCIsXCIgZGF0YVxuICAgICAgLy8gbWVkaWF0eXBlICA6PSBbIHR5cGUgXCIvXCIgc3VidHlwZSBdICooIFwiO1wiIHBhcmFtZXRlciApXG4gICAgICAvLyBkYXRhICAgICAgIDo9ICp1cmxjaGFyXG4gICAgICAvLyBwYXJhbWV0ZXIgIDo9IGF0dHJpYnV0ZSBcIj1cIiB2YWx1ZVxuICAgICAgbGV0IGRhdGFVUkwgPSAnZGF0YTonXG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTUlNRVR5cGUobWltZVR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpXG5cbiAgICAgIGlmIChwYXJzZWQgIT09ICdmYWlsdXJlJykge1xuICAgICAgICBkYXRhVVJMICs9IHNlcmlhbGl6ZUFNaW1lVHlwZShwYXJzZWQpXG4gICAgICB9XG5cbiAgICAgIGRhdGFVUkwgKz0gJztiYXNlNjQsJ1xuXG4gICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoJ2xhdGluMScpXG5cbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgYnl0ZXMpIHtcbiAgICAgICAgZGF0YVVSTCArPSBidG9hKGRlY29kZXIud3JpdGUoY2h1bmspKVxuICAgICAgfVxuXG4gICAgICBkYXRhVVJMICs9IGJ0b2EoZGVjb2Rlci5lbmQoKSlcblxuICAgICAgcmV0dXJuIGRhdGFVUkxcbiAgICB9XG4gICAgY2FzZSAnVGV4dCc6IHtcbiAgICAgIC8vIDEuIExldCBlbmNvZGluZyBiZSBmYWlsdXJlXG4gICAgICBsZXQgZW5jb2RpbmcgPSAnZmFpbHVyZSdcblxuICAgICAgLy8gMi4gSWYgdGhlIGVuY29kaW5nTmFtZSBpcyBwcmVzZW50LCBzZXQgZW5jb2RpbmcgdG8gdGhlXG4gICAgICAvLyAgICByZXN1bHQgb2YgZ2V0dGluZyBhbiBlbmNvZGluZyBmcm9tIGVuY29kaW5nTmFtZS5cbiAgICAgIGlmIChlbmNvZGluZ05hbWUpIHtcbiAgICAgICAgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyhlbmNvZGluZ05hbWUpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIElmIGVuY29kaW5nIGlzIGZhaWx1cmUsIGFuZCBtaW1lVHlwZSBpcyBwcmVzZW50OlxuICAgICAgaWYgKGVuY29kaW5nID09PSAnZmFpbHVyZScgJiYgbWltZVR5cGUpIHtcbiAgICAgICAgLy8gMS4gTGV0IHR5cGUgYmUgdGhlIHJlc3VsdCBvZiBwYXJzZSBhIE1JTUUgdHlwZVxuICAgICAgICAvLyAgICBnaXZlbiBtaW1lVHlwZS5cbiAgICAgICAgY29uc3QgdHlwZSA9IHBhcnNlTUlNRVR5cGUobWltZVR5cGUpXG5cbiAgICAgICAgLy8gMi4gSWYgdHlwZSBpcyBub3QgZmFpbHVyZSwgc2V0IGVuY29kaW5nIHRvIHRoZSByZXN1bHRcbiAgICAgICAgLy8gICAgb2YgZ2V0dGluZyBhbiBlbmNvZGluZyBmcm9tIHR5cGXigJlzIHBhcmFtZXRlcnNbXCJjaGFyc2V0XCJdLlxuICAgICAgICBpZiAodHlwZSAhPT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyh0eXBlLnBhcmFtZXRlcnMuZ2V0KCdjaGFyc2V0JykpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgZW5jb2RpbmcgaXMgZmFpbHVyZSwgdGhlbiBzZXQgZW5jb2RpbmcgdG8gVVRGLTguXG4gICAgICBpZiAoZW5jb2RpbmcgPT09ICdmYWlsdXJlJykge1xuICAgICAgICBlbmNvZGluZyA9ICdVVEYtOCdcbiAgICAgIH1cblxuICAgICAgLy8gNS4gRGVjb2RlIGJ5dGVzIHVzaW5nIGZhbGxiYWNrIGVuY29kaW5nIGVuY29kaW5nLCBhbmRcbiAgICAgIC8vICAgIHJldHVybiB0aGUgcmVzdWx0LlxuICAgICAgcmV0dXJuIGRlY29kZShieXRlcywgZW5jb2RpbmcpXG4gICAgfVxuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzoge1xuICAgICAgLy8gUmV0dXJuIGEgbmV3IEFycmF5QnVmZmVyIHdob3NlIGNvbnRlbnRzIGFyZSBieXRlcy5cbiAgICAgIGNvbnN0IHNlcXVlbmNlID0gY29tYmluZUJ5dGVTZXF1ZW5jZXMoYnl0ZXMpXG5cbiAgICAgIHJldHVybiBzZXF1ZW5jZS5idWZmZXJcbiAgICB9XG4gICAgY2FzZSAnQmluYXJ5U3RyaW5nJzoge1xuICAgICAgLy8gUmV0dXJuIGJ5dGVzIGFzIGEgYmluYXJ5IHN0cmluZywgaW4gd2hpY2ggZXZlcnkgYnl0ZVxuICAgICAgLy8gIGlzIHJlcHJlc2VudGVkIGJ5IGEgY29kZSB1bml0IG9mIGVxdWFsIHZhbHVlIFswLi4yNTVdLlxuICAgICAgbGV0IGJpbmFyeVN0cmluZyA9ICcnXG5cbiAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcignbGF0aW4xJylcblxuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBieXRlcykge1xuICAgICAgICBiaW5hcnlTdHJpbmcgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICAgIH1cblxuICAgICAgYmluYXJ5U3RyaW5nICs9IGRlY29kZXIuZW5kKClcblxuICAgICAgcmV0dXJuIGJpbmFyeVN0cmluZ1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2RlY29kZVxuICogQHBhcmFtIHtVaW50OEFycmF5W119IGlvUXVldWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZ1xuICovXG5mdW5jdGlvbiBkZWNvZGUgKGlvUXVldWUsIGVuY29kaW5nKSB7XG4gIGNvbnN0IGJ5dGVzID0gY29tYmluZUJ5dGVTZXF1ZW5jZXMoaW9RdWV1ZSlcblxuICAvLyAxLiBMZXQgQk9NRW5jb2RpbmcgYmUgdGhlIHJlc3VsdCBvZiBCT00gc25pZmZpbmcgaW9RdWV1ZS5cbiAgY29uc3QgQk9NRW5jb2RpbmcgPSBCT01TbmlmZmluZyhieXRlcylcblxuICBsZXQgc2xpY2UgPSAwXG5cbiAgLy8gMi4gSWYgQk9NRW5jb2RpbmcgaXMgbm9uLW51bGw6XG4gIGlmIChCT01FbmNvZGluZyAhPT0gbnVsbCkge1xuICAgIC8vIDEuIFNldCBlbmNvZGluZyB0byBCT01FbmNvZGluZy5cbiAgICBlbmNvZGluZyA9IEJPTUVuY29kaW5nXG5cbiAgICAvLyAyLiBSZWFkIHRocmVlIGJ5dGVzIGZyb20gaW9RdWV1ZSwgaWYgQk9NRW5jb2RpbmcgaXNcbiAgICAvLyAgICBVVEYtODsgb3RoZXJ3aXNlIHJlYWQgdHdvIGJ5dGVzLlxuICAgIC8vICAgIChEbyBub3RoaW5nIHdpdGggdGhvc2UgYnl0ZXMuKVxuICAgIHNsaWNlID0gQk9NRW5jb2RpbmcgPT09ICdVVEYtOCcgPyAzIDogMlxuICB9XG5cbiAgLy8gMy4gUHJvY2VzcyBhIHF1ZXVlIHdpdGggYW4gaW5zdGFuY2Ugb2YgZW5jb2RpbmfigJlzXG4gIC8vICAgIGRlY29kZXIsIGlvUXVldWUsIG91dHB1dCwgYW5kIFwicmVwbGFjZW1lbnRcIi5cblxuICAvLyA0LiBSZXR1cm4gb3V0cHV0LlxuXG4gIGNvbnN0IHNsaWNlZCA9IGJ5dGVzLnNsaWNlKHNsaWNlKVxuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKS5kZWNvZGUoc2xpY2VkKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2JvbS1zbmlmZlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpb1F1ZXVlXG4gKi9cbmZ1bmN0aW9uIEJPTVNuaWZmaW5nIChpb1F1ZXVlKSB7XG4gIC8vIDEuIExldCBCT00gYmUgdGhlIHJlc3VsdCBvZiBwZWVraW5nIDMgYnl0ZXMgZnJvbSBpb1F1ZXVlLFxuICAvLyAgICBjb252ZXJ0ZWQgdG8gYSBieXRlIHNlcXVlbmNlLlxuICBjb25zdCBbYSwgYiwgY10gPSBpb1F1ZXVlXG5cbiAgLy8gMi4gRm9yIGVhY2ggb2YgdGhlIHJvd3MgaW4gdGhlIHRhYmxlIGJlbG93LCBzdGFydGluZyB3aXRoXG4gIC8vICAgIHRoZSBmaXJzdCBvbmUgYW5kIGdvaW5nIGRvd24sIGlmIEJPTSBzdGFydHMgd2l0aCB0aGVcbiAgLy8gICAgYnl0ZXMgZ2l2ZW4gaW4gdGhlIGZpcnN0IGNvbHVtbiwgdGhlbiByZXR1cm4gdGhlXG4gIC8vICAgIGVuY29kaW5nIGdpdmVuIGluIHRoZSBjZWxsIGluIHRoZSBzZWNvbmQgY29sdW1uIG9mIHRoYXRcbiAgLy8gICAgcm93LiBPdGhlcndpc2UsIHJldHVybiBudWxsLlxuICBpZiAoYSA9PT0gMHhFRiAmJiBiID09PSAweEJCICYmIGMgPT09IDB4QkYpIHtcbiAgICByZXR1cm4gJ1VURi04J1xuICB9IGVsc2UgaWYgKGEgPT09IDB4RkUgJiYgYiA9PT0gMHhGRikge1xuICAgIHJldHVybiAnVVRGLTE2QkUnXG4gIH0gZWxzZSBpZiAoYSA9PT0gMHhGRiAmJiBiID09PSAweEZFKSB7XG4gICAgcmV0dXJuICdVVEYtMTZMRSdcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5W119IHNlcXVlbmNlc1xuICovXG5mdW5jdGlvbiBjb21iaW5lQnl0ZVNlcXVlbmNlcyAoc2VxdWVuY2VzKSB7XG4gIGNvbnN0IHNpemUgPSBzZXF1ZW5jZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGEgKyBiLmJ5dGVMZW5ndGhcbiAgfSwgMClcblxuICBsZXQgb2Zmc2V0ID0gMFxuXG4gIHJldHVybiBzZXF1ZW5jZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgYS5zZXQoYiwgb2Zmc2V0KVxuICAgIG9mZnNldCArPSBiLmJ5dGVMZW5ndGhcbiAgICByZXR1cm4gYVxuICB9LCBuZXcgVWludDhBcnJheShzaXplKSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHJlYWRPcGVyYXRpb24sXG4gIGZpcmVBUHJvZ3Jlc3NFdmVudFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICByZWFkT3BlcmF0aW9uLFxuICBmaXJlQVByb2dyZXNzRXZlbnRcbn0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3Qge1xuICBrU3RhdGUsXG4gIGtFcnJvcixcbiAga1Jlc3VsdCxcbiAga0V2ZW50cyxcbiAga0Fib3J0ZWRcbn0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmNsYXNzIEZpbGVSZWFkZXIgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tTdGF0ZV0gPSAnZW1wdHknXG4gICAgdGhpc1trUmVzdWx0XSA9IG51bGxcbiAgICB0aGlzW2tFcnJvcl0gPSBudWxsXG4gICAgdGhpc1trRXZlbnRzXSA9IHtcbiAgICAgIGxvYWRlbmQ6IG51bGwsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGFib3J0OiBudWxsLFxuICAgICAgbG9hZDogbnVsbCxcbiAgICAgIHByb2dyZXNzOiBudWxsLFxuICAgICAgbG9hZHN0YXJ0OiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2Rmbi1yZWFkQXNBcnJheUJ1ZmZlclxuICAgKiBAcGFyYW0ge2ltcG9ydCgnYnVmZmVyJykuQmxvYn0gYmxvYlxuICAgKi9cbiAgcmVhZEFzQXJyYXlCdWZmZXIgKGJsb2IpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0ZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXInIH0pXG5cbiAgICBibG9iID0gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihibG9iLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICAgIC8vIFRoZSByZWFkQXNBcnJheUJ1ZmZlcihibG9iKSBtZXRob2QsIHdoZW4gaW52b2tlZCxcbiAgICAvLyBtdXN0IGluaXRpYXRlIGEgcmVhZCBvcGVyYXRpb24gZm9yIGJsb2Igd2l0aCBBcnJheUJ1ZmZlci5cbiAgICByZWFkT3BlcmF0aW9uKHRoaXMsIGJsb2IsICdBcnJheUJ1ZmZlcicpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jcmVhZEFzQmluYXJ5U3RyaW5nXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdidWZmZXInKS5CbG9ifSBibG9iXG4gICAqL1xuICByZWFkQXNCaW5hcnlTdHJpbmcgKGJsb2IpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0ZpbGVSZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nJyB9KVxuXG4gICAgYmxvYiA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoYmxvYiwgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgICAvLyBUaGUgcmVhZEFzQmluYXJ5U3RyaW5nKGJsb2IpIG1ldGhvZCwgd2hlbiBpbnZva2VkLFxuICAgIC8vIG11c3QgaW5pdGlhdGUgYSByZWFkIG9wZXJhdGlvbiBmb3IgYmxvYiB3aXRoIEJpbmFyeVN0cmluZy5cbiAgICByZWFkT3BlcmF0aW9uKHRoaXMsIGJsb2IsICdCaW5hcnlTdHJpbmcnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI3JlYWRBc0RhdGFUZXh0XG4gICAqIEBwYXJhbSB7aW1wb3J0KCdidWZmZXInKS5CbG9ifSBibG9iXG4gICAqIEBwYXJhbSB7c3RyaW5nP30gZW5jb2RpbmdcbiAgICovXG4gIHJlYWRBc1RleHQgKGJsb2IsIGVuY29kaW5nID0gdW5kZWZpbmVkKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGaWxlUmVhZGVyLnJlYWRBc1RleHQnIH0pXG5cbiAgICBibG9iID0gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihibG9iLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmNvZGluZyA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhlbmNvZGluZylcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVhZEFzVGV4dChibG9iLCBlbmNvZGluZykgbWV0aG9kLCB3aGVuIGludm9rZWQsXG4gICAgLy8gbXVzdCBpbml0aWF0ZSBhIHJlYWQgb3BlcmF0aW9uIGZvciBibG9iIHdpdGggVGV4dCBhbmQgZW5jb2RpbmcuXG4gICAgcmVhZE9wZXJhdGlvbih0aGlzLCBibG9iLCAnVGV4dCcsIGVuY29kaW5nKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2Rmbi1yZWFkQXNEYXRhVVJMXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdidWZmZXInKS5CbG9ifSBibG9iXG4gICAqL1xuICByZWFkQXNEYXRhVVJMIChibG9iKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwnIH0pXG5cbiAgICBibG9iID0gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihibG9iLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICAgIC8vIFRoZSByZWFkQXNEYXRhVVJMKGJsb2IpIG1ldGhvZCwgd2hlbiBpbnZva2VkLCBtdXN0XG4gICAgLy8gaW5pdGlhdGUgYSByZWFkIG9wZXJhdGlvbiBmb3IgYmxvYiB3aXRoIERhdGFVUkwuXG4gICAgcmVhZE9wZXJhdGlvbih0aGlzLCBibG9iLCAnRGF0YVVSTCcpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZGZuLWFib3J0XG4gICAqL1xuICBhYm9ydCAoKSB7XG4gICAgLy8gMS4gSWYgdGhpcydzIHN0YXRlIGlzIFwiZW1wdHlcIiBvciBpZiB0aGlzJ3Mgc3RhdGUgaXNcbiAgICAvLyAgICBcImRvbmVcIiBzZXQgdGhpcydzIHJlc3VsdCB0byBudWxsIGFuZCB0ZXJtaW5hdGVcbiAgICAvLyAgICB0aGlzIGFsZ29yaXRobS5cbiAgICBpZiAodGhpc1trU3RhdGVdID09PSAnZW1wdHknIHx8IHRoaXNba1N0YXRlXSA9PT0gJ2RvbmUnKSB7XG4gICAgICB0aGlzW2tSZXN1bHRdID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gMi4gSWYgdGhpcydzIHN0YXRlIGlzIFwibG9hZGluZ1wiIHNldCB0aGlzJ3Mgc3RhdGUgdG9cbiAgICAvLyAgICBcImRvbmVcIiBhbmQgc2V0IHRoaXMncyByZXN1bHQgdG8gbnVsbC5cbiAgICBpZiAodGhpc1trU3RhdGVdID09PSAnbG9hZGluZycpIHtcbiAgICAgIHRoaXNba1N0YXRlXSA9ICdkb25lJ1xuICAgICAgdGhpc1trUmVzdWx0XSA9IG51bGxcbiAgICB9XG5cbiAgICAvLyAzLiBJZiB0aGVyZSBhcmUgYW55IHRhc2tzIGZyb20gdGhpcyBvbiB0aGUgZmlsZSByZWFkaW5nXG4gICAgLy8gICAgdGFzayBzb3VyY2UgaW4gYW4gYWZmaWxpYXRlZCB0YXNrIHF1ZXVlLCB0aGVuIHJlbW92ZVxuICAgIC8vICAgIHRob3NlIHRhc2tzIGZyb20gdGhhdCB0YXNrIHF1ZXVlLlxuICAgIHRoaXNba0Fib3J0ZWRdID0gdHJ1ZVxuXG4gICAgLy8gNC4gVGVybWluYXRlIHRoZSBhbGdvcml0aG0gZm9yIHRoZSByZWFkIG1ldGhvZCBiZWluZyBwcm9jZXNzZWQuXG4gICAgLy8gVE9ET1xuXG4gICAgLy8gNS4gRmlyZSBhIHByb2dyZXNzIGV2ZW50IGNhbGxlZCBhYm9ydCBhdCB0aGlzLlxuICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnYWJvcnQnLCB0aGlzKVxuXG4gICAgLy8gNi4gSWYgdGhpcydzIHN0YXRlIGlzIG5vdCBcImxvYWRpbmdcIiwgZmlyZSBhIHByb2dyZXNzXG4gICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgdGhpcy5cbiAgICBpZiAodGhpc1trU3RhdGVdICE9PSAnbG9hZGluZycpIHtcbiAgICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcsIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLXJlYWR5c3RhdGVcbiAgICovXG4gIGdldCByZWFkeVN0YXRlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgc3dpdGNoICh0aGlzW2tTdGF0ZV0pIHtcbiAgICAgIGNhc2UgJ2VtcHR5JzogcmV0dXJuIHRoaXMuRU1QVFlcbiAgICAgIGNhc2UgJ2xvYWRpbmcnOiByZXR1cm4gdGhpcy5MT0FESU5HXG4gICAgICBjYXNlICdkb25lJzogcmV0dXJuIHRoaXMuRE9ORVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkb20tZmlsZXJlYWRlci1yZXN1bHRcbiAgICovXG4gIGdldCByZXN1bHQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICAvLyBUaGUgcmVzdWx0IGF0dHJpYnV0ZeKAmXMgZ2V0dGVyLCB3aGVuIGludm9rZWQsIG11c3QgcmV0dXJuXG4gICAgLy8gdGhpcydzIHJlc3VsdC5cbiAgICByZXR1cm4gdGhpc1trUmVzdWx0XVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLWVycm9yXG4gICAqL1xuICBnZXQgZXJyb3IgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICAvLyBUaGUgZXJyb3IgYXR0cmlidXRl4oCZcyBnZXR0ZXIsIHdoZW4gaW52b2tlZCwgbXVzdCByZXR1cm5cbiAgICAvLyB0aGlzJ3MgZXJyb3IuXG4gICAgcmV0dXJuIHRoaXNba0Vycm9yXVxuICB9XG5cbiAgZ2V0IG9ubG9hZGVuZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLmxvYWRlbmRcbiAgfVxuXG4gIHNldCBvbmxvYWRlbmQgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLmxvYWRlbmQpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVuZCcsIHRoaXNba0V2ZW50c10ubG9hZGVuZClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmxvYWRlbmQgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdsb2FkZW5kJywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0V2ZW50c10ubG9hZGVuZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25lcnJvciAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLmVycm9yXG4gIH1cblxuICBzZXQgb25lcnJvciAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10uZXJyb3IpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzW2tFdmVudHNdLmVycm9yKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10uZXJyb3IgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmVycm9yID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmxvYWRzdGFydCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLmxvYWRzdGFydFxuICB9XG5cbiAgc2V0IG9ubG9hZHN0YXJ0IChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZHN0YXJ0JywgdGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdsb2Fkc3RhcnQnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9ucHJvZ3Jlc3MgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICByZXR1cm4gdGhpc1trRXZlbnRzXS5wcm9ncmVzc1xuICB9XG5cbiAgc2V0IG9ucHJvZ3Jlc3MgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLnByb2dyZXNzKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdGhpc1trRXZlbnRzXS5wcm9ncmVzcylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLnByb2dyZXNzID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5wcm9ncmVzcyA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25sb2FkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10ubG9hZFxuICB9XG5cbiAgc2V0IG9ubG9hZCAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10ubG9hZCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgdGhpc1trRXZlbnRzXS5sb2FkKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10ubG9hZCA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2FkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmFib3J0ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10uYWJvcnRcbiAgfVxuXG4gIHNldCBvbmFib3J0IChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5hYm9ydCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXNba0V2ZW50c10uYWJvcnQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5hYm9ydCA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0V2ZW50c10uYWJvcnQgPSBudWxsXG4gICAgfVxuICB9XG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkb20tZmlsZXJlYWRlci1lbXB0eVxuRmlsZVJlYWRlci5FTVBUWSA9IEZpbGVSZWFkZXIucHJvdG90eXBlLkVNUFRZID0gMFxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLWxvYWRpbmdcbkZpbGVSZWFkZXIuTE9BRElORyA9IEZpbGVSZWFkZXIucHJvdG90eXBlLkxPQURJTkcgPSAxXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZG9tLWZpbGVyZWFkZXItZG9uZVxuRmlsZVJlYWRlci5ET05FID0gRmlsZVJlYWRlci5wcm90b3R5cGUuRE9ORSA9IDJcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRmlsZVJlYWRlci5wcm90b3R5cGUsIHtcbiAgRU1QVFk6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIExPQURJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIERPTkU6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHJlYWRBc0FycmF5QnVmZmVyOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkQXNCaW5hcnlTdHJpbmc6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlYWRBc1RleHQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlYWRBc0RhdGFVUkw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGFib3J0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkeVN0YXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZXN1bHQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmxvYWRzdGFydDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25wcm9ncmVzczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25sb2FkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmFib3J0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmxvYWRlbmQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdGaWxlUmVhZGVyJyxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZpbGVSZWFkZXIsIHtcbiAgRU1QVFk6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIExPQURJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIERPTkU6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnNcbn0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBGaWxlUmVhZGVyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga0NvbnN0cnVjdDogcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJykua0NvbnN0cnVjdFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YVVSTCcpXG5jb25zdCB7IGlzVmFsaWRIZWFkZXJOYW1lIH0gPSByZXF1aXJlKCcuLi9mZXRjaC91dGlsJylcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC11cmwtZXF1YWxzXG4gKiBAcGFyYW0ge1VSTH0gQVxuICogQHBhcmFtIHtVUkx9IEJcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gZXhjbHVkZUZyYWdtZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdXJsRXF1YWxzIChBLCBCLCBleGNsdWRlRnJhZ21lbnQgPSBmYWxzZSkge1xuICBjb25zdCBzZXJpYWxpemVkQSA9IFVSTFNlcmlhbGl6ZXIoQSwgZXhjbHVkZUZyYWdtZW50KVxuXG4gIGNvbnN0IHNlcmlhbGl6ZWRCID0gVVJMU2VyaWFsaXplcihCLCBleGNsdWRlRnJhZ21lbnQpXG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWRBID09PSBzZXJpYWxpemVkQlxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nocm9taXVtL2Nocm9taXVtL2Jsb2IvNjk0ZDIwZDEzNGNiNTUzZDhkODllNTUwMGI5MTQ4MDEyYjFiYTI5OS9jb250ZW50L2Jyb3dzZXIvY2FjaGVfc3RvcmFnZS9jYWNoZV9zdG9yYWdlX2NhY2hlLmNjI0wyNjAtTDI2MlxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICovXG5mdW5jdGlvbiBmaWVsZFZhbHVlcyAoaGVhZGVyKSB7XG4gIGFzc2VydChoZWFkZXIgIT09IG51bGwpXG5cbiAgY29uc3QgdmFsdWVzID0gW11cblxuICBmb3IgKGxldCB2YWx1ZSBvZiBoZWFkZXIuc3BsaXQoJywnKSkge1xuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpXG5cbiAgICBpZiAoIXZhbHVlLmxlbmd0aCkge1xuICAgICAgY29udGludWVcbiAgICB9IGVsc2UgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZSh2YWx1ZSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdmFsdWVzLnB1c2godmFsdWUpXG4gIH1cblxuICByZXR1cm4gdmFsdWVzXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB1cmxFcXVhbHMsXG4gIGZpZWxkVmFsdWVzXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGtDb25zdHJ1Y3QgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IHVybEVxdWFscywgZmllbGRWYWx1ZXM6IGdldEZpZWxkVmFsdWVzIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5LCBpc0Rpc3R1cmJlZCB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IFJlc3BvbnNlLCBjbG9uZVJlc3BvbnNlIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9yZXNwb25zZScpXG5jb25zdCB7IFJlcXVlc3QgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3JlcXVlc3QnKVxuY29uc3QgeyBrU3RhdGUsIGtIZWFkZXJzLCBrR3VhcmQsIGtSZWFsbSB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvc3ltYm9scycpXG5jb25zdCB7IGZldGNoaW5nIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9pbmRleCcpXG5jb25zdCB7IHVybElzSHR0cEh0dHBzU2NoZW1lLCBjcmVhdGVEZWZlcnJlZFByb21pc2UsIHJlYWRBbGxCeXRlcyB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvdXRpbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBnZXRHbG9iYWxEaXNwYXRjaGVyIH0gPSByZXF1aXJlKCcuLi9nbG9iYWwnKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2Rmbi1jYWNoZS1iYXRjaC1vcGVyYXRpb25cbiAqIEB0eXBlZGVmIHtPYmplY3R9IENhY2hlQmF0Y2hPcGVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7J2RlbGV0ZScgfCAncHV0J30gdHlwZVxuICogQHByb3BlcnR5IHthbnl9IHJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7YW55fSByZXNwb25zZVxuICogQHByb3BlcnR5IHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NhY2hlJykuQ2FjaGVRdWVyeU9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2Rmbi1yZXF1ZXN0LXJlc3BvbnNlLWxpc3RcbiAqIEB0eXBlZGVmIHtbYW55LCBhbnldW119IHJlcXVlc3RSZXNwb25zZUxpc3RcbiAqL1xuXG5jbGFzcyBDYWNoZSB7XG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkZm4tcmVsZXZhbnQtcmVxdWVzdC1yZXNwb25zZS1saXN0XG4gICAqIEB0eXBlIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fVxuICAgKi9cbiAgI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdFxuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBpZiAoYXJndW1lbnRzWzBdICE9PSBrQ29uc3RydWN0KSB7XG4gICAgICB3ZWJpZGwuaWxsZWdhbENvbnN0cnVjdG9yKClcbiAgICB9XG5cbiAgICB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3QgPSBhcmd1bWVudHNbMV1cbiAgfVxuXG4gIGFzeW5jIG1hdGNoIChyZXF1ZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGUubWF0Y2gnIH0pXG5cbiAgICByZXF1ZXN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8ocmVxdWVzdClcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMob3B0aW9ucylcblxuICAgIGNvbnN0IHAgPSBhd2FpdCB0aGlzLm1hdGNoQWxsKHJlcXVlc3QsIG9wdGlvbnMpXG5cbiAgICBpZiAocC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiBwWzBdXG4gIH1cblxuICBhc3luYyBtYXRjaEFsbCAocmVxdWVzdCA9IHVuZGVmaW5lZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG5cbiAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSByZXF1ZXN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8ocmVxdWVzdClcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIDEuXG4gICAgbGV0IHIgPSBudWxsXG5cbiAgICAvLyAyLlxuICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgICAvLyAyLjEuMVxuICAgICAgICByID0gcmVxdWVzdFtrU3RhdGVdXG5cbiAgICAgICAgLy8gMi4xLjJcbiAgICAgICAgaWYgKHIubWV0aG9kICE9PSAnR0VUJyAmJiAhb3B0aW9ucy5pZ25vcmVNZXRob2QpIHtcbiAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gMi4yLjFcbiAgICAgICAgciA9IG5ldyBSZXF1ZXN0KHJlcXVlc3QpW2tTdGF0ZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LlxuICAgIC8vIDUuMVxuICAgIGNvbnN0IHJlc3BvbnNlcyA9IFtdXG5cbiAgICAvLyA1LjJcbiAgICBpZiAocmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyA1LjIuMVxuICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0KSB7XG4gICAgICAgIHJlc3BvbnNlcy5wdXNoKHJlcXVlc3RSZXNwb25zZVsxXSlcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA1LjNcbiAgICAgIC8vIDUuMy4xXG4gICAgICBjb25zdCByZXF1ZXN0UmVzcG9uc2VzID0gdGhpcy4jcXVlcnlDYWNoZShyLCBvcHRpb25zKVxuXG4gICAgICAvLyA1LjMuMlxuICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgcmVxdWVzdFJlc3BvbnNlcykge1xuICAgICAgICByZXNwb25zZXMucHVzaChyZXF1ZXN0UmVzcG9uc2VbMV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS40XG4gICAgLy8gV2UgZG9uJ3QgaW1wbGVtZW50IENPUnMgc28gd2UgZG9uJ3QgbmVlZCB0byBsb29wIG92ZXIgdGhlIHJlc3BvbnNlcywgeWF5IVxuXG4gICAgLy8gNS41LjFcbiAgICBjb25zdCByZXNwb25zZUxpc3QgPSBbXVxuXG4gICAgLy8gNS41LjJcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgLy8gNS41LjIuMVxuICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keT8uc291cmNlID8/IG51bGwpXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5ib2R5XG4gICAgICByZXNwb25zZU9iamVjdFtrU3RhdGVdID0gcmVzcG9uc2VcbiAgICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0uYm9keSA9IGJvZHlcbiAgICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gcmVzcG9uc2UuaGVhZGVyc0xpc3RcbiAgICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrR3VhcmRdID0gJ2ltbXV0YWJsZSdcblxuICAgICAgcmVzcG9uc2VMaXN0LnB1c2gocmVzcG9uc2VPYmplY3QpXG4gICAgfVxuXG4gICAgLy8gNi5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShyZXNwb25zZUxpc3QpXG4gIH1cblxuICBhc3luYyBhZGQgKHJlcXVlc3QpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGUuYWRkJyB9KVxuXG4gICAgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QpXG5cbiAgICAvLyAxLlxuICAgIGNvbnN0IHJlcXVlc3RzID0gW3JlcXVlc3RdXG5cbiAgICAvLyAyLlxuICAgIGNvbnN0IHJlc3BvbnNlQXJyYXlQcm9taXNlID0gdGhpcy5hZGRBbGwocmVxdWVzdHMpXG5cbiAgICAvLyAzLlxuICAgIHJldHVybiBhd2FpdCByZXNwb25zZUFycmF5UHJvbWlzZVxuICB9XG5cbiAgYXN5bmMgYWRkQWxsIChyZXF1ZXN0cykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnIH0pXG5cbiAgICByZXF1ZXN0cyA9IHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxSZXF1ZXN0SW5mbz4nXShyZXF1ZXN0cylcblxuICAgIC8vIDEuXG4gICAgY29uc3QgcmVzcG9uc2VQcm9taXNlcyA9IFtdXG5cbiAgICAvLyAyLlxuICAgIGNvbnN0IHJlcXVlc3RMaXN0ID0gW11cblxuICAgIC8vIDMuXG4gICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIHJlcXVlc3RzKSB7XG4gICAgICBpZiAodHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDMuMVxuICAgICAgY29uc3QgciA9IHJlcXVlc3Rba1N0YXRlXVxuXG4gICAgICAvLyAzLjJcbiAgICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoci51cmwpIHx8IHIubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuYWRkQWxsJyxcbiAgICAgICAgICBtZXNzYWdlOiAnRXhwZWN0ZWQgaHR0cC9zIHNjaGVtZSB3aGVuIG1ldGhvZCBpcyBub3QgR0VULidcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LlxuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgZmV0Y2hpbmc+W119ICovXG4gICAgY29uc3QgZmV0Y2hDb250cm9sbGVycyA9IFtdXG5cbiAgICAvLyA1LlxuICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuICAgICAgLy8gNS4xXG4gICAgICBjb25zdCByID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuXG4gICAgICAvLyA1LjJcbiAgICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoci51cmwpKSB7XG4gICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdFeHBlY3RlZCBodHRwL3Mgc2NoZW1lLidcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gNS40XG4gICAgICByLmluaXRpYXRvciA9ICdmZXRjaCdcbiAgICAgIHIuZGVzdGluYXRpb24gPSAnc3VicmVzb3VyY2UnXG5cbiAgICAgIC8vIDUuNVxuICAgICAgcmVxdWVzdExpc3QucHVzaChyKVxuXG4gICAgICAvLyA1LjZcbiAgICAgIGNvbnN0IHJlc3BvbnNlUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAgIC8vIDUuN1xuICAgICAgZmV0Y2hDb250cm9sbGVycy5wdXNoKGZldGNoaW5nKHtcbiAgICAgICAgcmVxdWVzdDogcixcbiAgICAgICAgZGlzcGF0Y2hlcjogZ2V0R2xvYmFsRGlzcGF0Y2hlcigpLFxuICAgICAgICBwcm9jZXNzUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgLy8gMS5cbiAgICAgICAgICBpZiAocmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwNiB8fCByZXNwb25zZS5zdGF0dXMgPCAyMDAgfHwgcmVzcG9uc2Uuc3RhdHVzID4gMjk5KSB7XG4gICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuYWRkQWxsJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ1JlY2VpdmVkIGFuIGludmFsaWQgc3RhdHVzIGNvZGUgb3IgdGhlIHJlcXVlc3QgZmFpbGVkLidcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3ZhcnknKSkgeyAvLyAyLlxuICAgICAgICAgICAgLy8gMi4xXG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlcyA9IGdldEZpZWxkVmFsdWVzKHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgndmFyeScpKVxuXG4gICAgICAgICAgICAvLyAyLjJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRWYWx1ZSBvZiBmaWVsZFZhbHVlcykge1xuICAgICAgICAgICAgICAvLyAyLjIuMVxuICAgICAgICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdCh3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2ludmFsaWQgdmFyeSBmaWVsZCB2YWx1ZSdcbiAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJvbGxlciBvZiBmZXRjaENvbnRyb2xsZXJzKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFib3J0KClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5IChyZXNwb25zZSkge1xuICAgICAgICAgIC8vIDEuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZWplY3QobmV3IERPTUV4Y2VwdGlvbignYWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAyLlxuICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKVxuICAgICAgICB9XG4gICAgICB9KSlcblxuICAgICAgLy8gNS44XG4gICAgICByZXNwb25zZVByb21pc2VzLnB1c2gocmVzcG9uc2VQcm9taXNlLnByb21pc2UpXG4gICAgfVxuXG4gICAgLy8gNi5cbiAgICBjb25zdCBwID0gUHJvbWlzZS5hbGwocmVzcG9uc2VQcm9taXNlcylcblxuICAgIC8vIDcuXG4gICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgcFxuXG4gICAgLy8gNy4xXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IFtdXG5cbiAgICAvLyA3LjJcbiAgICBsZXQgaW5kZXggPSAwXG5cbiAgICAvLyA3LjNcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgLy8gNy4zLjFcbiAgICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbn0gKi9cbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgICAgdHlwZTogJ3B1dCcsIC8vIDcuMy4yXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RMaXN0W2luZGV4XSwgLy8gNy4zLjNcbiAgICAgICAgcmVzcG9uc2UgLy8gNy4zLjRcbiAgICAgIH1cblxuICAgICAgb3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbikgLy8gNy4zLjVcblxuICAgICAgaW5kZXgrKyAvLyA3LjMuNlxuICAgIH1cblxuICAgIC8vIDcuNVxuICAgIGNvbnN0IGNhY2hlSm9iUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyA3LjYuMVxuICAgIGxldCBlcnJvckRhdGEgPSBudWxsXG5cbiAgICAvLyA3LjYuMlxuICAgIHRyeSB7XG4gICAgICB0aGlzLiNiYXRjaENhY2hlT3BlcmF0aW9ucyhvcGVyYXRpb25zKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRGF0YSA9IGVcbiAgICB9XG5cbiAgICAvLyA3LjYuM1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIDcuNi4zLjFcbiAgICAgIGlmIChlcnJvckRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgY2FjaGVKb2JQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gNy42LjMuMlxuICAgICAgICBjYWNoZUpvYlByb21pc2UucmVqZWN0KGVycm9yRGF0YSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gNy43XG4gICAgcmV0dXJuIGNhY2hlSm9iUHJvbWlzZS5wcm9taXNlXG4gIH1cblxuICBhc3luYyBwdXQgKHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0NhY2hlLnB1dCcgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIHJlc3BvbnNlID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVzcG9uc2UocmVzcG9uc2UpXG5cbiAgICAvLyAxLlxuICAgIGxldCBpbm5lclJlcXVlc3QgPSBudWxsXG5cbiAgICAvLyAyLlxuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgaW5uZXJSZXF1ZXN0ID0gcmVxdWVzdFtrU3RhdGVdXG4gICAgfSBlbHNlIHsgLy8gMy5cbiAgICAgIGlubmVyUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHJlcXVlc3QpW2tTdGF0ZV1cbiAgICB9XG5cbiAgICAvLyA0LlxuICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoaW5uZXJSZXF1ZXN0LnVybCkgfHwgaW5uZXJSZXF1ZXN0Lm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnQ2FjaGUucHV0JyxcbiAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGFuIGh0dHAvcyBzY2hlbWUgd2hlbiBtZXRob2QgaXMgbm90IEdFVCdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gNS5cbiAgICBjb25zdCBpbm5lclJlc3BvbnNlID0gcmVzcG9uc2Vba1N0YXRlXVxuXG4gICAgLy8gNi5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5zdGF0dXMgPT09IDIwNikge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdDYWNoZS5wdXQnLFxuICAgICAgICBtZXNzYWdlOiAnR290IDIwNiBzdGF0dXMnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDcuXG4gICAgaWYgKGlubmVyUmVzcG9uc2UuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3ZhcnknKSkge1xuICAgICAgLy8gNy4xLlxuICAgICAgY29uc3QgZmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlcyhpbm5lclJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgndmFyeScpKVxuXG4gICAgICAvLyA3LjIuXG4gICAgICBmb3IgKGNvbnN0IGZpZWxkVmFsdWUgb2YgZmllbGRWYWx1ZXMpIHtcbiAgICAgICAgLy8gNy4yLjFcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT09ICcqJykge1xuICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLnB1dCcsXG4gICAgICAgICAgICBtZXNzYWdlOiAnR290ICogdmFyeSBmaWVsZCB2YWx1ZSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOC5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5ib2R5ICYmIChpc0Rpc3R1cmJlZChpbm5lclJlc3BvbnNlLmJvZHkuc3RyZWFtKSB8fCBpbm5lclJlc3BvbnNlLmJvZHkuc3RyZWFtLmxvY2tlZCkpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnQ2FjaGUucHV0JyxcbiAgICAgICAgbWVzc2FnZTogJ1Jlc3BvbnNlIGJvZHkgaXMgbG9ja2VkIG9yIGRpc3R1cmJlZCdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gOS5cbiAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IGNsb25lUmVzcG9uc2UoaW5uZXJSZXNwb25zZSlcblxuICAgIC8vIDEwLlxuICAgIGNvbnN0IGJvZHlSZWFkUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyAxMS5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5ib2R5ICE9IG51bGwpIHtcbiAgICAgIC8vIDExLjFcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGlubmVyUmVzcG9uc2UuYm9keS5zdHJlYW1cblxuICAgICAgLy8gMTEuMlxuICAgICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpXG5cbiAgICAgIC8vIDExLjNcbiAgICAgIHJlYWRBbGxCeXRlcyhyZWFkZXIpLnRoZW4oYm9keVJlYWRQcm9taXNlLnJlc29sdmUsIGJvZHlSZWFkUHJvbWlzZS5yZWplY3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJvZHlSZWFkUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICAvLyAxMi5cbiAgICAvKiogQHR5cGUge0NhY2hlQmF0Y2hPcGVyYXRpb25bXX0gKi9cbiAgICBjb25zdCBvcGVyYXRpb25zID0gW11cblxuICAgIC8vIDEzLlxuICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbn0gKi9cbiAgICBjb25zdCBvcGVyYXRpb24gPSB7XG4gICAgICB0eXBlOiAncHV0JywgLy8gMTQuXG4gICAgICByZXF1ZXN0OiBpbm5lclJlcXVlc3QsIC8vIDE1LlxuICAgICAgcmVzcG9uc2U6IGNsb25lZFJlc3BvbnNlIC8vIDE2LlxuICAgIH1cblxuICAgIC8vIDE3LlxuICAgIG9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pXG5cbiAgICAvLyAxOS5cbiAgICBjb25zdCBieXRlcyA9IGF3YWl0IGJvZHlSZWFkUHJvbWlzZS5wcm9taXNlXG5cbiAgICBpZiAoY2xvbmVkUmVzcG9uc2UuYm9keSAhPSBudWxsKSB7XG4gICAgICBjbG9uZWRSZXNwb25zZS5ib2R5LnNvdXJjZSA9IGJ5dGVzXG4gICAgfVxuXG4gICAgLy8gMTkuMVxuICAgIGNvbnN0IGNhY2hlSm9iUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyAxOS4yLjFcbiAgICBsZXQgZXJyb3JEYXRhID0gbnVsbFxuXG4gICAgLy8gMTkuMi4yXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuI2JhdGNoQ2FjaGVPcGVyYXRpb25zKG9wZXJhdGlvbnMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JEYXRhID0gZVxuICAgIH1cblxuICAgIC8vIDE5LjIuM1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIDE5LjIuMy4xXG4gICAgICBpZiAoZXJyb3JEYXRhID09PSBudWxsKSB7XG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIH0gZWxzZSB7IC8vIDE5LjIuMy4yXG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZWplY3QoZXJyb3JEYXRhKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gY2FjaGVKb2JQcm9taXNlLnByb21pc2VcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZSAocmVxdWVzdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlLmRlbGV0ZScgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyhvcHRpb25zKVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge1JlcXVlc3R9XG4gICAgICovXG4gICAgbGV0IHIgPSBudWxsXG5cbiAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIHIgPSByZXF1ZXN0W2tTdGF0ZV1cblxuICAgICAgaWYgKHIubWV0aG9kICE9PSAnR0VUJyAmJiAhb3B0aW9ucy5pZ25vcmVNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydCh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpXG5cbiAgICAgIHIgPSBuZXcgUmVxdWVzdChyZXF1ZXN0KVtrU3RhdGVdXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtDYWNoZUJhdGNoT3BlcmF0aW9uW119ICovXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IFtdXG5cbiAgICAvKiogQHR5cGUge0NhY2hlQmF0Y2hPcGVyYXRpb259ICovXG4gICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAgdHlwZTogJ2RlbGV0ZScsXG4gICAgICByZXF1ZXN0OiByLFxuICAgICAgb3B0aW9uc1xuICAgIH1cblxuICAgIG9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pXG5cbiAgICBjb25zdCBjYWNoZUpvYlByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gICAgbGV0IGVycm9yRGF0YSA9IG51bGxcbiAgICBsZXQgcmVxdWVzdFJlc3BvbnNlc1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlcXVlc3RSZXNwb25zZXMgPSB0aGlzLiNiYXRjaENhY2hlT3BlcmF0aW9ucyhvcGVyYXRpb25zKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRGF0YSA9IGVcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBpZiAoZXJyb3JEYXRhID09PSBudWxsKSB7XG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZXNvbHZlKCEhcmVxdWVzdFJlc3BvbnNlcz8ubGVuZ3RoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FjaGVKb2JQcm9taXNlLnJlamVjdChlcnJvckRhdGEpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBjYWNoZUpvYlByb21pc2UucHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2RvbS1jYWNoZS1rZXlzXG4gICAqIEBwYXJhbSB7YW55fSByZXF1ZXN0XG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi90eXBlcy9jYWNoZScpLkNhY2hlUXVlcnlPcHRpb25zfSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtyZWFkb25seSBSZXF1ZXN0W119XG4gICAqL1xuICBhc3luYyBrZXlzIChyZXF1ZXN0ID0gdW5kZWZpbmVkLCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcblxuICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyhvcHRpb25zKVxuXG4gICAgLy8gMS5cbiAgICBsZXQgciA9IG51bGxcblxuICAgIC8vIDIuXG4gICAgaWYgKHJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gMi4xXG4gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgICAgLy8gMi4xLjFcbiAgICAgICAgciA9IHJlcXVlc3Rba1N0YXRlXVxuXG4gICAgICAgIC8vIDIuMS4yXG4gICAgICAgIGlmIChyLm1ldGhvZCAhPT0gJ0dFVCcgJiYgIW9wdGlvbnMuaWdub3JlTWV0aG9kKSB7XG4gICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnKSB7IC8vIDIuMlxuICAgICAgICByID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDQuXG4gICAgY29uc3QgcHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyA1LlxuICAgIC8vIDUuMVxuICAgIGNvbnN0IHJlcXVlc3RzID0gW11cblxuICAgIC8vIDUuMlxuICAgIGlmIChyZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDUuMi4xXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3QpIHtcbiAgICAgICAgLy8gNS4yLjEuMVxuICAgICAgICByZXF1ZXN0cy5wdXNoKHJlcXVlc3RSZXNwb25zZVswXSlcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA1LjNcbiAgICAgIC8vIDUuMy4xXG4gICAgICBjb25zdCByZXF1ZXN0UmVzcG9uc2VzID0gdGhpcy4jcXVlcnlDYWNoZShyLCBvcHRpb25zKVxuXG4gICAgICAvLyA1LjMuMlxuICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgcmVxdWVzdFJlc3BvbnNlcykge1xuICAgICAgICAvLyA1LjMuMi4xXG4gICAgICAgIHJlcXVlc3RzLnB1c2gocmVxdWVzdFJlc3BvbnNlWzBdKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuNFxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIDUuNC4xXG4gICAgICBjb25zdCByZXF1ZXN0TGlzdCA9IFtdXG5cbiAgICAgIC8vIDUuNC4yXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgcmVxdWVzdHMpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdE9iamVjdCA9IG5ldyBSZXF1ZXN0KCdodHRwczovL2EnKVxuICAgICAgICByZXF1ZXN0T2JqZWN0W2tTdGF0ZV0gPSByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3RPYmplY3Rba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF0gPSByZXF1ZXN0LmhlYWRlcnNMaXN0XG4gICAgICAgIHJlcXVlc3RPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAnaW1tdXRhYmxlJ1xuICAgICAgICByZXF1ZXN0T2JqZWN0W2tSZWFsbV0gPSByZXF1ZXN0LmNsaWVudFxuXG4gICAgICAgIC8vIDUuNC4yLjFcbiAgICAgICAgcmVxdWVzdExpc3QucHVzaChyZXF1ZXN0T2JqZWN0KVxuICAgICAgfVxuXG4gICAgICAvLyA1LjQuM1xuICAgICAgcHJvbWlzZS5yZXNvbHZlKE9iamVjdC5mcmVlemUocmVxdWVzdExpc3QpKVxuICAgIH0pXG5cbiAgICByZXR1cm4gcHJvbWlzZS5wcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jYmF0Y2gtY2FjaGUtb3BlcmF0aW9ucy1hbGdvcml0aG1cbiAgICogQHBhcmFtIHtDYWNoZUJhdGNoT3BlcmF0aW9uW119IG9wZXJhdGlvbnNcbiAgICogQHJldHVybnMge3JlcXVlc3RSZXNwb25zZUxpc3R9XG4gICAqL1xuICAjYmF0Y2hDYWNoZU9wZXJhdGlvbnMgKG9wZXJhdGlvbnMpIHtcbiAgICAvLyAxLlxuICAgIGNvbnN0IGNhY2hlID0gdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0XG5cbiAgICAvLyAyLlxuICAgIGNvbnN0IGJhY2t1cENhY2hlID0gWy4uLmNhY2hlXVxuXG4gICAgLy8gMy5cbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gW11cblxuICAgIC8vIDQuMVxuICAgIGNvbnN0IHJlc3VsdExpc3QgPSBbXVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDQuMlxuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICAvLyA0LjIuMVxuICAgICAgICBpZiAob3BlcmF0aW9uLnR5cGUgIT09ICdkZWxldGUnICYmIG9wZXJhdGlvbi50eXBlICE9PSAncHV0Jykge1xuICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLiNiYXRjaENhY2hlT3BlcmF0aW9ucycsXG4gICAgICAgICAgICBtZXNzYWdlOiAnb3BlcmF0aW9uIHR5cGUgZG9lcyBub3QgbWF0Y2ggXCJkZWxldGVcIiBvciBcInB1dFwiJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjIuMlxuICAgICAgICBpZiAob3BlcmF0aW9uLnR5cGUgPT09ICdkZWxldGUnICYmIG9wZXJhdGlvbi5yZXNwb25zZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdkZWxldGUgb3BlcmF0aW9uIHNob3VsZCBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIHJlc3BvbnNlJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjIuM1xuICAgICAgICBpZiAodGhpcy4jcXVlcnlDYWNoZShvcGVyYXRpb24ucmVxdWVzdCwgb3BlcmF0aW9uLm9wdGlvbnMsIGFkZGVkSXRlbXMpLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJz8/PycsICdJbnZhbGlkU3RhdGVFcnJvcicpXG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjIuNFxuICAgICAgICBsZXQgcmVxdWVzdFJlc3BvbnNlc1xuXG4gICAgICAgIC8vIDQuMi41XG4gICAgICAgIGlmIChvcGVyYXRpb24udHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgICAvLyA0LjIuNS4xXG4gICAgICAgICAgcmVxdWVzdFJlc3BvbnNlcyA9IHRoaXMuI3F1ZXJ5Q2FjaGUob3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5vcHRpb25zKVxuXG4gICAgICAgICAgLy8gVE9ETzogdGhlIHNwZWMgaXMgd3JvbmcsIHRoaXMgaXMgbmVlZGVkIHRvIHBhc3MgV1BUc1xuICAgICAgICAgIGlmIChyZXF1ZXN0UmVzcG9uc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gNC4yLjUuMlxuICAgICAgICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHJlcXVlc3RSZXNwb25zZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGNhY2hlLmluZGV4T2YocmVxdWVzdFJlc3BvbnNlKVxuICAgICAgICAgICAgYXNzZXJ0KGlkeCAhPT0gLTEpXG5cbiAgICAgICAgICAgIC8vIDQuMi41LjIuMVxuICAgICAgICAgICAgY2FjaGUuc3BsaWNlKGlkeCwgMSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLnR5cGUgPT09ICdwdXQnKSB7IC8vIDQuMi42XG4gICAgICAgICAgLy8gNC4yLjYuMVxuICAgICAgICAgIGlmIChvcGVyYXRpb24ucmVzcG9uc2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAncHV0IG9wZXJhdGlvbiBzaG91bGQgaGF2ZSBhbiBhc3NvY2lhdGVkIHJlc3BvbnNlJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi4yXG4gICAgICAgICAgY29uc3QgciA9IG9wZXJhdGlvbi5yZXF1ZXN0XG5cbiAgICAgICAgICAvLyA0LjIuNi4zXG4gICAgICAgICAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShyLnVybCkpIHtcbiAgICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ2V4cGVjdGVkIGh0dHAgb3IgaHR0cHMgc2NoZW1lJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi40XG4gICAgICAgICAgaWYgKHIubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbm90IGdldCBtZXRob2QnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuMi42LjVcbiAgICAgICAgICBpZiAob3BlcmF0aW9uLm9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnb3B0aW9ucyBtdXN0IG5vdCBiZSBkZWZpbmVkJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi42XG4gICAgICAgICAgcmVxdWVzdFJlc3BvbnNlcyA9IHRoaXMuI3F1ZXJ5Q2FjaGUob3BlcmF0aW9uLnJlcXVlc3QpXG5cbiAgICAgICAgICAvLyA0LjIuNi43XG4gICAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgcmVxdWVzdFJlc3BvbnNlcykge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gY2FjaGUuaW5kZXhPZihyZXF1ZXN0UmVzcG9uc2UpXG4gICAgICAgICAgICBhc3NlcnQoaWR4ICE9PSAtMSlcblxuICAgICAgICAgICAgLy8gNC4yLjYuNy4xXG4gICAgICAgICAgICBjYWNoZS5zcGxpY2UoaWR4LCAxKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuMi42LjhcbiAgICAgICAgICBjYWNoZS5wdXNoKFtvcGVyYXRpb24ucmVxdWVzdCwgb3BlcmF0aW9uLnJlc3BvbnNlXSlcblxuICAgICAgICAgIC8vIDQuMi42LjEwXG4gICAgICAgICAgYWRkZWRJdGVtcy5wdXNoKFtvcGVyYXRpb24ucmVxdWVzdCwgb3BlcmF0aW9uLnJlc3BvbnNlXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuMi43XG4gICAgICAgIHJlc3VsdExpc3QucHVzaChbb3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5yZXNwb25zZV0pXG4gICAgICB9XG5cbiAgICAgIC8vIDQuM1xuICAgICAgcmV0dXJuIHJlc3VsdExpc3RcbiAgICB9IGNhdGNoIChlKSB7IC8vIDUuXG4gICAgICAvLyA1LjFcbiAgICAgIHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdC5sZW5ndGggPSAwXG5cbiAgICAgIC8vIDUuMlxuICAgICAgdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0ID0gYmFja3VwQ2FjaGVcblxuICAgICAgLy8gNS4zXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI3F1ZXJ5LWNhY2hlXG4gICAqIEBwYXJhbSB7YW55fSByZXF1ZXN0UXVlcnlcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NhY2hlJykuQ2FjaGVRdWVyeU9wdGlvbnN9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fSB0YXJnZXRTdG9yYWdlXG4gICAqIEByZXR1cm5zIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fVxuICAgKi9cbiAgI3F1ZXJ5Q2FjaGUgKHJlcXVlc3RRdWVyeSwgb3B0aW9ucywgdGFyZ2V0U3RvcmFnZSkge1xuICAgIC8qKiBAdHlwZSB7cmVxdWVzdFJlc3BvbnNlTGlzdH0gKi9cbiAgICBjb25zdCByZXN1bHRMaXN0ID0gW11cblxuICAgIGNvbnN0IHN0b3JhZ2UgPSB0YXJnZXRTdG9yYWdlID8/IHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdFxuXG4gICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2Ygc3RvcmFnZSkge1xuICAgICAgY29uc3QgW2NhY2hlZFJlcXVlc3QsIGNhY2hlZFJlc3BvbnNlXSA9IHJlcXVlc3RSZXNwb25zZVxuICAgICAgaWYgKHRoaXMuI3JlcXVlc3RNYXRjaGVzQ2FjaGVkSXRlbShyZXF1ZXN0UXVlcnksIGNhY2hlZFJlcXVlc3QsIGNhY2hlZFJlc3BvbnNlLCBvcHRpb25zKSkge1xuICAgICAgICByZXN1bHRMaXN0LnB1c2gocmVxdWVzdFJlc3BvbnNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRMaXN0XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jcmVxdWVzdC1tYXRjaGVzLWNhY2hlZC1pdGVtLWFsZ29yaXRobVxuICAgKiBAcGFyYW0ge2FueX0gcmVxdWVzdFF1ZXJ5XG4gICAqIEBwYXJhbSB7YW55fSByZXF1ZXN0XG4gICAqIEBwYXJhbSB7YW55IHwgbnVsbH0gcmVzcG9uc2VcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NhY2hlJykuQ2FjaGVRdWVyeU9wdGlvbnMgfCB1bmRlZmluZWR9IG9wdGlvbnNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAjcmVxdWVzdE1hdGNoZXNDYWNoZWRJdGVtIChyZXF1ZXN0UXVlcnksIHJlcXVlc3QsIHJlc3BvbnNlID0gbnVsbCwgb3B0aW9ucykge1xuICAgIC8vIGlmIChvcHRpb25zPy5pZ25vcmVNZXRob2QgPT09IGZhbHNlICYmIHJlcXVlc3QubWV0aG9kID09PSAnR0VUJykge1xuICAgIC8vICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gfVxuXG4gICAgY29uc3QgcXVlcnlVUkwgPSBuZXcgVVJMKHJlcXVlc3RRdWVyeS51cmwpXG5cbiAgICBjb25zdCBjYWNoZWRVUkwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuXG4gICAgaWYgKG9wdGlvbnM/Lmlnbm9yZVNlYXJjaCkge1xuICAgICAgY2FjaGVkVVJMLnNlYXJjaCA9ICcnXG5cbiAgICAgIHF1ZXJ5VVJMLnNlYXJjaCA9ICcnXG4gICAgfVxuXG4gICAgaWYgKCF1cmxFcXVhbHMocXVlcnlVUkwsIGNhY2hlZFVSTCwgdHJ1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHJlc3BvbnNlID09IG51bGwgfHxcbiAgICAgIG9wdGlvbnM/Lmlnbm9yZVZhcnkgfHxcbiAgICAgICFyZXNwb25zZS5oZWFkZXJzTGlzdC5jb250YWlucygndmFyeScpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZ2V0RmllbGRWYWx1ZXMocmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCd2YXJ5JykpXG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkVmFsdWUgb2YgZmllbGRWYWx1ZXMpIHtcbiAgICAgIGlmIChmaWVsZFZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RWYWx1ZSA9IHJlcXVlc3QuaGVhZGVyc0xpc3QuZ2V0KGZpZWxkVmFsdWUpXG4gICAgICBjb25zdCBxdWVyeVZhbHVlID0gcmVxdWVzdFF1ZXJ5LmhlYWRlcnNMaXN0LmdldChmaWVsZFZhbHVlKVxuXG4gICAgICAvLyBJZiBvbmUgaGFzIHRoZSBoZWFkZXIgYW5kIHRoZSBvdGhlciBkb2Vzbid0LCBvciBvbmUgaGFzXG4gICAgICAvLyBhIGRpZmZlcmVudCB2YWx1ZSB0aGFuIHRoZSBvdGhlciwgcmV0dXJuIGZhbHNlXG4gICAgICBpZiAocmVxdWVzdFZhbHVlICE9PSBxdWVyeVZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ2FjaGUucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDYWNoZScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIG1hdGNoOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBtYXRjaEFsbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYWRkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBhZGRBbGw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHB1dDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZGVsZXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBrZXlzOiBrRW51bWVyYWJsZVByb3BlcnR5XG59KVxuXG5jb25zdCBjYWNoZVF1ZXJ5T3B0aW9uQ29udmVydGVycyA9IFtcbiAge1xuICAgIGtleTogJ2lnbm9yZVNlYXJjaCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2lnbm9yZU1ldGhvZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2lnbm9yZVZhcnknLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH1cbl1cblxud2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihjYWNoZVF1ZXJ5T3B0aW9uQ29udmVydGVycylcblxud2ViaWRsLmNvbnZlcnRlcnMuTXVsdGlDYWNoZVF1ZXJ5T3B0aW9ucyA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAgLi4uY2FjaGVRdWVyeU9wdGlvbkNvbnZlcnRlcnMsXG4gIHtcbiAgICBrZXk6ICdjYWNoZU5hbWUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nXG4gIH1cbl0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLlJlc3BvbnNlID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihSZXNwb25zZSlcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPFJlcXVlc3RJbmZvPiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mb1xuKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ2FjaGVcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgQ2FjaGUgfSA9IHJlcXVpcmUoJy4vY2FjaGUnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmNsYXNzIENhY2hlU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkZm4tcmVsZXZhbnQtbmFtZS10by1jYWNoZS1tYXBcbiAgICogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydCgnLi9jYWNoZScpLnJlcXVlc3RSZXNwb25zZUxpc3R9XG4gICAqL1xuICAjY2FjaGVzID0gbmV3IE1hcCgpXG5cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIGlmIChhcmd1bWVudHNbMF0gIT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHdlYmlkbC5pbGxlZ2FsQ29uc3RydWN0b3IoKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG1hdGNoIChyZXF1ZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZVN0b3JhZ2UpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlU3RvcmFnZS5tYXRjaCcgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5NdWx0aUNhY2hlUXVlcnlPcHRpb25zKG9wdGlvbnMpXG5cbiAgICAvLyAxLlxuICAgIGlmIChvcHRpb25zLmNhY2hlTmFtZSAhPSBudWxsKSB7XG4gICAgICAvLyAxLjEuMS4xXG4gICAgICBpZiAodGhpcy4jY2FjaGVzLmhhcyhvcHRpb25zLmNhY2hlTmFtZSkpIHtcbiAgICAgICAgLy8gMS4xLjEuMS4xXG4gICAgICAgIGNvbnN0IGNhY2hlTGlzdCA9IHRoaXMuI2NhY2hlcy5nZXQob3B0aW9ucy5jYWNoZU5hbWUpXG4gICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IENhY2hlKGtDb25zdHJ1Y3QsIGNhY2hlTGlzdClcblxuICAgICAgICByZXR1cm4gYXdhaXQgY2FjaGUubWF0Y2gocmVxdWVzdCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyAyLlxuICAgICAgLy8gMi4yXG4gICAgICBmb3IgKGNvbnN0IGNhY2hlTGlzdCBvZiB0aGlzLiNjYWNoZXMudmFsdWVzKCkpIHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGVMaXN0KVxuXG4gICAgICAgIC8vIDIuMi4xLjJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjYWNoZS5tYXRjaChyZXF1ZXN0LCBvcHRpb25zKVxuXG4gICAgICAgIGlmIChyZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jY2FjaGUtc3RvcmFnZS1oYXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhcyAoY2FjaGVOYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZVN0b3JhZ2UuaGFzJyB9KVxuXG4gICAgY2FjaGVOYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKGNhY2hlTmFtZSlcblxuICAgIC8vIDIuMS4xXG4gICAgLy8gMi4yXG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlcy5oYXMoY2FjaGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2RvbS1jYWNoZXN0b3JhZ2Utb3BlblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENhY2hlPn1cbiAgICovXG4gIGFzeW5jIG9wZW4gKGNhY2hlTmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlU3RvcmFnZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGVTdG9yYWdlLm9wZW4nIH0pXG5cbiAgICBjYWNoZU5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoY2FjaGVOYW1lKVxuXG4gICAgLy8gMi4xXG4gICAgaWYgKHRoaXMuI2NhY2hlcy5oYXMoY2FjaGVOYW1lKSkge1xuICAgICAgLy8gYXdhaXQgY2FjaGVzLm9wZW4oJ3YxJykgIT09IGF3YWl0IGNhY2hlcy5vcGVuKCd2MScpXG5cbiAgICAgIC8vIDIuMS4xXG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuI2NhY2hlcy5nZXQoY2FjaGVOYW1lKVxuXG4gICAgICAvLyAyLjEuMS4xXG4gICAgICByZXR1cm4gbmV3IENhY2hlKGtDb25zdHJ1Y3QsIGNhY2hlKVxuICAgIH1cblxuICAgIC8vIDIuMlxuICAgIGNvbnN0IGNhY2hlID0gW11cblxuICAgIC8vIDIuM1xuICAgIHRoaXMuI2NhY2hlcy5zZXQoY2FjaGVOYW1lLCBjYWNoZSlcblxuICAgIC8vIDIuNFxuICAgIHJldHVybiBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGUpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jY2FjaGUtc3RvcmFnZS1kZWxldGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZSAoY2FjaGVOYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZVN0b3JhZ2UuZGVsZXRlJyB9KVxuXG4gICAgY2FjaGVOYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKGNhY2hlTmFtZSlcblxuICAgIHJldHVybiB0aGlzLiNjYWNoZXMuZGVsZXRlKGNhY2hlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNjYWNoZS1zdG9yYWdlLWtleXNcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgYXN5bmMga2V5cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuXG4gICAgLy8gMi4xXG4gICAgY29uc3Qga2V5cyA9IHRoaXMuI2NhY2hlcy5rZXlzKClcblxuICAgIC8vIDIuMlxuICAgIHJldHVybiBbLi4ua2V5c11cbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhDYWNoZVN0b3JhZ2UucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDYWNoZVN0b3JhZ2UnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBtYXRjaDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGFzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvcGVuOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWxldGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGtleXM6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDYWNoZVN0b3JhZ2Vcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vY29va2llLXN0b3JlLyNjb29raWUtbWF4aW11bS1hdHRyaWJ1dGUtdmFsdWUtc2l6ZVxuY29uc3QgbWF4QXR0cmlidXRlVmFsdWVTaXplID0gMTAyNFxuXG4vLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2Nvb2tpZS1zdG9yZS8jY29va2llLW1heGltdW0tbmFtZS12YWx1ZS1wYWlyLXNpemVcbmNvbnN0IG1heE5hbWVWYWx1ZVBhaXJTaXplID0gNDA5NlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWF4QXR0cmlidXRlVmFsdWVTaXplLFxuICBtYXhOYW1lVmFsdWVQYWlyU2l6ZVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsga0hlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuXG5mdW5jdGlvbiBpc0NUTEV4Y2x1ZGluZ0h0YWIgKHZhbHVlKSB7XG4gIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAoY29uc3QgY2hhciBvZiB2YWx1ZSkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChcbiAgICAgIChjb2RlID49IDB4MDAgfHwgY29kZSA8PSAweDA4KSB8fFxuICAgICAgKGNvZGUgPj0gMHgwQSB8fCBjb2RlIDw9IDB4MUYpIHx8XG4gICAgICBjb2RlID09PSAweDdGXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gQ0hBUiAgICAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPlxuIHRva2VuICAgICAgICAgID0gMSo8YW55IENIQVIgZXhjZXB0IENUTHMgb3Igc2VwYXJhdG9ycz5cbiBzZXBhcmF0b3JzICAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAgICAgICAgICAgICAgICB8IFwiLFwiIHwgXCI7XCIgfCBcIjpcIiB8IFwiXFxcIiB8IDxcIj5cbiAgICAgICAgICAgICAgICB8IFwiL1wiIHwgXCJbXCIgfCBcIl1cIiB8IFwiP1wiIHwgXCI9XCJcbiAgICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZU5hbWUgKG5hbWUpIHtcbiAgZm9yIChjb25zdCBjaGFyIG9mIG5hbWUpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApXG5cbiAgICBpZiAoXG4gICAgICAoY29kZSA8PSAweDIwIHx8IGNvZGUgPiAweDdGKSB8fFxuICAgICAgY2hhciA9PT0gJygnIHx8XG4gICAgICBjaGFyID09PSAnKScgfHxcbiAgICAgIGNoYXIgPT09ICc+JyB8fFxuICAgICAgY2hhciA9PT0gJzwnIHx8XG4gICAgICBjaGFyID09PSAnQCcgfHxcbiAgICAgIGNoYXIgPT09ICcsJyB8fFxuICAgICAgY2hhciA9PT0gJzsnIHx8XG4gICAgICBjaGFyID09PSAnOicgfHxcbiAgICAgIGNoYXIgPT09ICdcXFxcJyB8fFxuICAgICAgY2hhciA9PT0gJ1wiJyB8fFxuICAgICAgY2hhciA9PT0gJy8nIHx8XG4gICAgICBjaGFyID09PSAnWycgfHxcbiAgICAgIGNoYXIgPT09ICddJyB8fFxuICAgICAgY2hhciA9PT0gJz8nIHx8XG4gICAgICBjaGFyID09PSAnPScgfHxcbiAgICAgIGNoYXIgPT09ICd7JyB8fFxuICAgICAgY2hhciA9PT0gJ30nXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29va2llIG5hbWUnKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiBjb29raWUtdmFsdWUgICAgICA9ICpjb29raWUtb2N0ZXQgLyAoIERRVU9URSAqY29va2llLW9jdGV0IERRVU9URSApXG4gY29va2llLW9jdGV0ICAgICAgPSAleDIxIC8gJXgyMy0yQiAvICV4MkQtM0EgLyAleDNDLTVCIC8gJXg1RC03RVxuICAgICAgICAgICAgICAgICAgICAgICA7IFVTLUFTQ0lJIGNoYXJhY3RlcnMgZXhjbHVkaW5nIENUTHMsXG4gICAgICAgICAgICAgICAgICAgICAgIDsgd2hpdGVzcGFjZSBEUVVPVEUsIGNvbW1hLCBzZW1pY29sb24sXG4gICAgICAgICAgICAgICAgICAgICAgIDsgYW5kIGJhY2tzbGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29va2llVmFsdWUgKHZhbHVlKSB7XG4gIGZvciAoY29uc3QgY2hhciBvZiB2YWx1ZSkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChcbiAgICAgIGNvZGUgPCAweDIxIHx8IC8vIGV4Y2x1ZGUgQ1RMcyAoMC0zMSlcbiAgICAgIGNvZGUgPT09IDB4MjIgfHxcbiAgICAgIGNvZGUgPT09IDB4MkMgfHxcbiAgICAgIGNvZGUgPT09IDB4M0IgfHxcbiAgICAgIGNvZGUgPT09IDB4NUMgfHxcbiAgICAgIGNvZGUgPiAweDdFIC8vIG5vbi1hc2NpaVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhlYWRlciB2YWx1ZScpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcGF0aC12YWx1ZSAgICAgICAgPSA8YW55IENIQVIgZXhjZXB0IENUTHMgb3IgXCI7XCI+XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZVBhdGggKHBhdGgpIHtcbiAgZm9yIChjb25zdCBjaGFyIG9mIHBhdGgpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApXG5cbiAgICBpZiAoY29kZSA8IDB4MjEgfHwgY2hhciA9PT0gJzsnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29va2llIHBhdGgnKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEkgaGF2ZSBubyBpZGVhIHdoeSB0aGVzZSB2YWx1ZXMgYXJlbid0IGFsbG93ZWQgdG8gYmUgaG9uZXN0LFxuICogYnV0IERlbm8gdGVzdHMgdGhlc2UuIC0gS2hhZnJhXG4gKiBAcGFyYW0ge3N0cmluZ30gZG9tYWluXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29va2llRG9tYWluIChkb21haW4pIHtcbiAgaWYgKFxuICAgIGRvbWFpbi5zdGFydHNXaXRoKCctJykgfHxcbiAgICBkb21haW4uZW5kc1dpdGgoJy4nKSB8fFxuICAgIGRvbWFpbi5lbmRzV2l0aCgnLScpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb29raWUgZG9tYWluJylcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzcyMzEjc2VjdGlvbi03LjEuMS4xXG4gKiBAcGFyYW0ge251bWJlcnxEYXRlfSBkYXRlXG4gIElNRi1maXhkYXRlICA9IGRheS1uYW1lIFwiLFwiIFNQIGRhdGUxIFNQIHRpbWUtb2YtZGF5IFNQIEdNVFxuICA7IGZpeGVkIGxlbmd0aC96b25lL2NhcGl0YWxpemF0aW9uIHN1YnNldCBvZiB0aGUgZm9ybWF0XG4gIDsgc2VlIFNlY3Rpb24gMy4zIG9mIFtSRkM1MzIyXVxuXG4gIGRheS1uYW1lICAgICA9ICV4NEQuNkYuNkUgOyBcIk1vblwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTQuNzUuNjUgOyBcIlR1ZVwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTcuNjUuNjQgOyBcIldlZFwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTQuNjguNzUgOyBcIlRodVwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NDYuNzIuNjkgOyBcIkZyaVwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTMuNjEuNzQgOyBcIlNhdFwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTMuNzUuNkUgOyBcIlN1blwiLCBjYXNlLXNlbnNpdGl2ZVxuICBkYXRlMSAgICAgICAgPSBkYXkgU1AgbW9udGggU1AgeWVhclxuICAgICAgICAgICAgICAgICAgOyBlLmcuLCAwMiBKdW4gMTk4MlxuXG4gIGRheSAgICAgICAgICA9IDJESUdJVFxuICBtb250aCAgICAgICAgPSAleDRBLjYxLjZFIDsgXCJKYW5cIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQ2LjY1LjYyIDsgXCJGZWJcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRELjYxLjcyIDsgXCJNYXJcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQxLjcwLjcyIDsgXCJBcHJcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRELjYxLjc5IDsgXCJNYXlcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRBLjc1LjZFIDsgXCJKdW5cIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRBLjc1LjZDIDsgXCJKdWxcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQxLjc1LjY3IDsgXCJBdWdcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDUzLjY1LjcwIDsgXCJTZXBcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRGLjYzLjc0IDsgXCJPY3RcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRFLjZGLjc2IDsgXCJOb3ZcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQ0LjY1LjYzIDsgXCJEZWNcIiwgY2FzZS1zZW5zaXRpdmVcbiAgeWVhciAgICAgICAgID0gNERJR0lUXG5cbiAgR01UICAgICAgICAgID0gJXg0Ny40RC41NCA7IFwiR01UXCIsIGNhc2Utc2Vuc2l0aXZlXG5cbiAgdGltZS1vZi1kYXkgID0gaG91ciBcIjpcIiBtaW51dGUgXCI6XCIgc2Vjb25kXG4gICAgICAgICAgICAgIDsgMDA6MDA6MDAgLSAyMzo1OTo2MCAobGVhcCBzZWNvbmQpXG5cbiAgaG91ciAgICAgICAgID0gMkRJR0lUXG4gIG1pbnV0ZSAgICAgICA9IDJESUdJVFxuICBzZWNvbmQgICAgICAgPSAyRElHSVRcbiAqL1xuZnVuY3Rpb24gdG9JTUZEYXRlIChkYXRlKSB7XG4gIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ251bWJlcicpIHtcbiAgICBkYXRlID0gbmV3IERhdGUoZGF0ZSlcbiAgfVxuXG4gIGNvbnN0IGRheXMgPSBbXG4gICAgJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsXG4gICAgJ1RodScsICdGcmknLCAnU2F0J1xuICBdXG5cbiAgY29uc3QgbW9udGhzID0gW1xuICAgICdKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsXG4gICAgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ1xuICBdXG5cbiAgY29uc3QgZGF5TmFtZSA9IGRheXNbZGF0ZS5nZXRVVENEYXkoKV1cbiAgY29uc3QgZGF5ID0gZGF0ZS5nZXRVVENEYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IG1vbnRoID0gbW9udGhzW2RhdGUuZ2V0VVRDTW9udGgoKV1cbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKVxuICBjb25zdCBob3VyID0gZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxuICBjb25zdCBtaW51dGUgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3Qgc2Vjb25kID0gZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXG5cbiAgcmV0dXJuIGAke2RheU5hbWV9LCAke2RheX0gJHttb250aH0gJHt5ZWFyfSAke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH0gR01UYFxufVxuXG4vKipcbiBtYXgtYWdlLWF2ICAgICAgICA9IFwiTWF4LUFnZT1cIiBub24temVyby1kaWdpdCAqRElHSVRcbiAgICAgICAgICAgICAgICAgICAgICAgOyBJbiBwcmFjdGljZSwgYm90aCBleHBpcmVzLWF2IGFuZCBtYXgtYWdlLWF2XG4gICAgICAgICAgICAgICAgICAgICAgIDsgYXJlIGxpbWl0ZWQgdG8gZGF0ZXMgcmVwcmVzZW50YWJsZSBieSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgOyB1c2VyIGFnZW50LlxuICogQHBhcmFtIHtudW1iZXJ9IG1heEFnZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZU1heEFnZSAobWF4QWdlKSB7XG4gIGlmIChtYXhBZ2UgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvb2tpZSBtYXgtYWdlJylcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUjc2VjdGlvbi00LjEuMVxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5Db29raWV9IGNvb2tpZVxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnkgKGNvb2tpZSkge1xuICBpZiAoY29va2llLm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHZhbGlkYXRlQ29va2llTmFtZShjb29raWUubmFtZSlcbiAgdmFsaWRhdGVDb29raWVWYWx1ZShjb29raWUudmFsdWUpXG5cbiAgY29uc3Qgb3V0ID0gW2Ake2Nvb2tpZS5uYW1lfT0ke2Nvb2tpZS52YWx1ZX1gXVxuXG4gIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLWNvb2tpZS1wcmVmaXhlcy0wMCNzZWN0aW9uLTMuMVxuICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1jb29raWUtcHJlZml4ZXMtMDAjc2VjdGlvbi0zLjJcbiAgaWYgKGNvb2tpZS5uYW1lLnN0YXJ0c1dpdGgoJ19fU2VjdXJlLScpKSB7XG4gICAgY29va2llLnNlY3VyZSA9IHRydWVcbiAgfVxuXG4gIGlmIChjb29raWUubmFtZS5zdGFydHNXaXRoKCdfX0hvc3QtJykpIHtcbiAgICBjb29raWUuc2VjdXJlID0gdHJ1ZVxuICAgIGNvb2tpZS5kb21haW4gPSBudWxsXG4gICAgY29va2llLnBhdGggPSAnLydcbiAgfVxuXG4gIGlmIChjb29raWUuc2VjdXJlKSB7XG4gICAgb3V0LnB1c2goJ1NlY3VyZScpXG4gIH1cblxuICBpZiAoY29va2llLmh0dHBPbmx5KSB7XG4gICAgb3V0LnB1c2goJ0h0dHBPbmx5JylcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29va2llLm1heEFnZSA9PT0gJ251bWJlcicpIHtcbiAgICB2YWxpZGF0ZUNvb2tpZU1heEFnZShjb29raWUubWF4QWdlKVxuICAgIG91dC5wdXNoKGBNYXgtQWdlPSR7Y29va2llLm1heEFnZX1gKVxuICB9XG5cbiAgaWYgKGNvb2tpZS5kb21haW4pIHtcbiAgICB2YWxpZGF0ZUNvb2tpZURvbWFpbihjb29raWUuZG9tYWluKVxuICAgIG91dC5wdXNoKGBEb21haW49JHtjb29raWUuZG9tYWlufWApXG4gIH1cblxuICBpZiAoY29va2llLnBhdGgpIHtcbiAgICB2YWxpZGF0ZUNvb2tpZVBhdGgoY29va2llLnBhdGgpXG4gICAgb3V0LnB1c2goYFBhdGg9JHtjb29raWUucGF0aH1gKVxuICB9XG5cbiAgaWYgKGNvb2tpZS5leHBpcmVzICYmIGNvb2tpZS5leHBpcmVzLnRvU3RyaW5nKCkgIT09ICdJbnZhbGlkIERhdGUnKSB7XG4gICAgb3V0LnB1c2goYEV4cGlyZXM9JHt0b0lNRkRhdGUoY29va2llLmV4cGlyZXMpfWApXG4gIH1cblxuICBpZiAoY29va2llLnNhbWVTaXRlKSB7XG4gICAgb3V0LnB1c2goYFNhbWVTaXRlPSR7Y29va2llLnNhbWVTaXRlfWApXG4gIH1cblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgY29va2llLnVucGFyc2VkKSB7XG4gICAgaWYgKCFwYXJ0LmluY2x1ZGVzKCc9JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1bnBhcnNlZCcpXG4gICAgfVxuXG4gICAgY29uc3QgW2tleSwgLi4udmFsdWVdID0gcGFydC5zcGxpdCgnPScpXG5cbiAgICBvdXQucHVzaChgJHtrZXkudHJpbSgpfT0ke3ZhbHVlLmpvaW4oJz0nKX1gKVxuICB9XG5cbiAgcmV0dXJuIG91dC5qb2luKCc7ICcpXG59XG5cbmxldCBrSGVhZGVyc0xpc3ROb2RlXG5cbmZ1bmN0aW9uIGdldEhlYWRlcnNMaXN0IChoZWFkZXJzKSB7XG4gIGlmIChoZWFkZXJzW2tIZWFkZXJzTGlzdF0pIHtcbiAgICByZXR1cm4gaGVhZGVyc1trSGVhZGVyc0xpc3RdXG4gIH1cblxuICBpZiAoIWtIZWFkZXJzTGlzdE5vZGUpIHtcbiAgICBrSGVhZGVyc0xpc3ROb2RlID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhoZWFkZXJzKS5maW5kKFxuICAgICAgKHN5bWJvbCkgPT4gc3ltYm9sLmRlc2NyaXB0aW9uID09PSAnaGVhZGVycyBsaXN0J1xuICAgIClcblxuICAgIGFzc2VydChrSGVhZGVyc0xpc3ROb2RlLCAnSGVhZGVycyBjYW5ub3QgYmUgcGFyc2VkJylcbiAgfVxuXG4gIGNvbnN0IGhlYWRlcnNMaXN0ID0gaGVhZGVyc1trSGVhZGVyc0xpc3ROb2RlXVxuICBhc3NlcnQoaGVhZGVyc0xpc3QpXG5cbiAgcmV0dXJuIGhlYWRlcnNMaXN0XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0NUTEV4Y2x1ZGluZ0h0YWIsXG4gIHN0cmluZ2lmeSxcbiAgZ2V0SGVhZGVyc0xpc3Rcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgbWF4TmFtZVZhbHVlUGFpclNpemUsIG1heEF0dHJpYnV0ZVZhbHVlU2l6ZSB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBpc0NUTEV4Y2x1ZGluZ0h0YWIgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0IH0gPSByZXF1aXJlKCcuLi9mZXRjaC9kYXRhVVJMJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhcnNlcyB0aGUgZmllbGQtdmFsdWUgYXR0cmlidXRlcyBvZiBhIHNldC1jb29raWUgaGVhZGVyIHN0cmluZy5cbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNFxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICogQHJldHVybnMgaWYgdGhlIGhlYWRlciBpcyBpbnZhbGlkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VTZXRDb29raWUgKGhlYWRlcikge1xuICAvLyAxLiBJZiB0aGUgc2V0LWNvb2tpZS1zdHJpbmcgY29udGFpbnMgYSAleDAwLTA4IC8gJXgwQS0xRiAvICV4N0ZcbiAgLy8gICAgY2hhcmFjdGVyIChDVEwgY2hhcmFjdGVycyBleGNsdWRpbmcgSFRBQik6IEFib3J0IHRoZXNlIHN0ZXBzIGFuZFxuICAvLyAgICBpZ25vcmUgdGhlIHNldC1jb29raWUtc3RyaW5nIGVudGlyZWx5LlxuICBpZiAoaXNDVExFeGNsdWRpbmdIdGFiKGhlYWRlcikpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgbGV0IG5hbWVWYWx1ZVBhaXIgPSAnJ1xuICBsZXQgdW5wYXJzZWRBdHRyaWJ1dGVzID0gJydcbiAgbGV0IG5hbWUgPSAnJ1xuICBsZXQgdmFsdWUgPSAnJ1xuXG4gIC8vIDIuIElmIHRoZSBzZXQtY29va2llLXN0cmluZyBjb250YWlucyBhICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXI6XG4gIGlmIChoZWFkZXIuaW5jbHVkZXMoJzsnKSkge1xuICAgIC8vIDEuIFRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBjaGFyYWN0ZXJzIHVwIHRvLFxuICAgIC8vICAgIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzQiAoXCI7XCIpLCBhbmQgdGhlIHVucGFyc2VkLVxuICAgIC8vICAgIGF0dHJpYnV0ZXMgY29uc2lzdCBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZXQtY29va2llLXN0cmluZ1xuICAgIC8vICAgIChpbmNsdWRpbmcgdGhlICV4M0IgKFwiO1wiKSBpbiBxdWVzdGlvbikuXG4gICAgY29uc3QgcG9zaXRpb24gPSB7IHBvc2l0aW9uOiAwIH1cblxuICAgIG5hbWVWYWx1ZVBhaXIgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdCgnOycsIGhlYWRlciwgcG9zaXRpb24pXG4gICAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gaGVhZGVyLnNsaWNlKHBvc2l0aW9uLnBvc2l0aW9uKVxuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIFRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGNvbnNpc3RzIG9mIGFsbCB0aGUgY2hhcmFjdGVyc1xuICAgIC8vICAgIGNvbnRhaW5lZCBpbiB0aGUgc2V0LWNvb2tpZS1zdHJpbmcsIGFuZCB0aGUgdW5wYXJzZWQtXG4gICAgLy8gICAgYXR0cmlidXRlcyBpcyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgIG5hbWVWYWx1ZVBhaXIgPSBoZWFkZXJcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGxhY2tzIGEgJXgzRCAoXCI9XCIpIGNoYXJhY3RlciwgdGhlblxuICAvLyAgICB0aGUgbmFtZSBzdHJpbmcgaXMgZW1wdHksIGFuZCB0aGUgdmFsdWUgc3RyaW5nIGlzIHRoZSB2YWx1ZSBvZlxuICAvLyAgICBuYW1lLXZhbHVlLXBhaXIuXG4gIGlmICghbmFtZVZhbHVlUGFpci5pbmNsdWRlcygnPScpKSB7XG4gICAgdmFsdWUgPSBuYW1lVmFsdWVQYWlyXG4gIH0gZWxzZSB7XG4gICAgLy8gICAgT3RoZXJ3aXNlLCB0aGUgbmFtZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgdXAgdG8sIGJ1dFxuICAgIC8vICAgIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNEIChcIj1cIikgY2hhcmFjdGVyLCBhbmQgdGhlIChwb3NzaWJseVxuICAgIC8vICAgIGVtcHR5KSB2YWx1ZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGZpcnN0XG4gICAgLy8gICAgJXgzRCAoXCI9XCIpIGNoYXJhY3Rlci5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuICAgIG5hbWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAgICc9JyxcbiAgICAgIG5hbWVWYWx1ZVBhaXIsXG4gICAgICBwb3NpdGlvblxuICAgIClcbiAgICB2YWx1ZSA9IG5hbWVWYWx1ZVBhaXIuc2xpY2UocG9zaXRpb24ucG9zaXRpb24gKyAxKVxuICB9XG5cbiAgLy8gNC4gUmVtb3ZlIGFueSBsZWFkaW5nIG9yIHRyYWlsaW5nIFdTUCBjaGFyYWN0ZXJzIGZyb20gdGhlIG5hbWVcbiAgLy8gICAgc3RyaW5nIGFuZCB0aGUgdmFsdWUgc3RyaW5nLlxuICBuYW1lID0gbmFtZS50cmltKClcbiAgdmFsdWUgPSB2YWx1ZS50cmltKClcblxuICAvLyA1LiBJZiB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIHN0cmluZ1xuICAvLyAgICBpcyBtb3JlIHRoYW4gNDA5NiBvY3RldHMsIGFib3J0IHRoZXNlIHN0ZXBzIGFuZCBpZ25vcmUgdGhlIHNldC1cbiAgLy8gICAgY29va2llLXN0cmluZyBlbnRpcmVseS5cbiAgaWYgKG5hbWUubGVuZ3RoICsgdmFsdWUubGVuZ3RoID4gbWF4TmFtZVZhbHVlUGFpclNpemUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gNi4gVGhlIGNvb2tpZS1uYW1lIGlzIHRoZSBuYW1lIHN0cmluZywgYW5kIHRoZSBjb29raWUtdmFsdWUgaXMgdGhlXG4gIC8vICAgIHZhbHVlIHN0cmluZy5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLCB2YWx1ZSwgLi4ucGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzKVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSByZW1haW5pbmcgYXR0cmlidXRlcyBvZiBhIHNldC1jb29raWUgaGVhZGVyXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjRcbiAqIEBwYXJhbSB7c3RyaW5nfSB1bnBhcnNlZEF0dHJpYnV0ZXNcbiAqIEBwYXJhbSB7W09iamVjdC48c3RyaW5nLCB1bmtub3duPl09e319IGNvb2tpZUF0dHJpYnV0ZUxpc3RcbiAqL1xuZnVuY3Rpb24gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXMgKHVucGFyc2VkQXR0cmlidXRlcywgY29va2llQXR0cmlidXRlTGlzdCA9IHt9KSB7XG4gIC8vIDEuIElmIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHN0cmluZyBpcyBlbXB0eSwgc2tpcCB0aGUgcmVzdCBvZlxuICAvLyAgICB0aGVzZSBzdGVwcy5cbiAgaWYgKHVucGFyc2VkQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gY29va2llQXR0cmlidXRlTGlzdFxuICB9XG5cbiAgLy8gMi4gRGlzY2FyZCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzICh3aGljaFxuICAvLyAgICB3aWxsIGJlIGEgJXgzQiAoXCI7XCIpIGNoYXJhY3RlcikuXG4gIGFzc2VydCh1bnBhcnNlZEF0dHJpYnV0ZXNbMF0gPT09ICc7JylcbiAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gdW5wYXJzZWRBdHRyaWJ1dGVzLnNsaWNlKDEpXG5cbiAgbGV0IGNvb2tpZUF2ID0gJydcblxuICAvLyAzLiBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcbiAgLy8gICAgY2hhcmFjdGVyOlxuICBpZiAodW5wYXJzZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKCc7JykpIHtcbiAgICAvLyAxLiBDb25zdW1lIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHVwIHRvLCBidXRcbiAgICAvLyAgICBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzQiAoXCI7XCIpIGNoYXJhY3Rlci5cbiAgICBjb29raWVBdiA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICAgJzsnLFxuICAgICAgdW5wYXJzZWRBdHRyaWJ1dGVzLFxuICAgICAgeyBwb3NpdGlvbjogMCB9XG4gICAgKVxuICAgIHVucGFyc2VkQXR0cmlidXRlcyA9IHVucGFyc2VkQXR0cmlidXRlcy5zbGljZShjb29raWVBdi5sZW5ndGgpXG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gQ29uc3VtZSB0aGUgcmVtYWluZGVyIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzLlxuICAgIGNvb2tpZUF2ID0gdW5wYXJzZWRBdHRyaWJ1dGVzXG4gICAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gJydcbiAgfVxuXG4gIC8vIExldCB0aGUgY29va2llLWF2IHN0cmluZyBiZSB0aGUgY2hhcmFjdGVycyBjb25zdW1lZCBpbiB0aGlzIHN0ZXAuXG5cbiAgbGV0IGF0dHJpYnV0ZU5hbWUgPSAnJ1xuICBsZXQgYXR0cmlidXRlVmFsdWUgPSAnJ1xuXG4gIC8vIDQuIElmIHRoZSBjb29raWUtYXYgc3RyaW5nIGNvbnRhaW5zIGEgJXgzRCAoXCI9XCIpIGNoYXJhY3RlcjpcbiAgaWYgKGNvb2tpZUF2LmluY2x1ZGVzKCc9JykpIHtcbiAgICAvLyAxLiBUaGUgKHBvc3NpYmx5IGVtcHR5KSBhdHRyaWJ1dGUtbmFtZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlXG4gICAgLy8gICAgY2hhcmFjdGVycyB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNEIChcIj1cIilcbiAgICAvLyAgICBjaGFyYWN0ZXIsIGFuZCB0aGUgKHBvc3NpYmx5IGVtcHR5KSBhdHRyaWJ1dGUtdmFsdWUgc3RyaW5nXG4gICAgLy8gICAgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGZpcnN0ICV4M0QgKFwiPVwiKVxuICAgIC8vICAgIGNoYXJhY3Rlci5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gICAgYXR0cmlidXRlTmFtZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICAgJz0nLFxuICAgICAgY29va2llQXYsXG4gICAgICBwb3NpdGlvblxuICAgIClcbiAgICBhdHRyaWJ1dGVWYWx1ZSA9IGNvb2tpZUF2LnNsaWNlKHBvc2l0aW9uLnBvc2l0aW9uICsgMSlcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBUaGUgYXR0cmlidXRlLW5hbWUgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBlbnRpcmUgY29va2llLWF2XG4gICAgLy8gICAgc3RyaW5nLCBhbmQgdGhlIGF0dHJpYnV0ZS12YWx1ZSBzdHJpbmcgaXMgZW1wdHkuXG4gICAgYXR0cmlidXRlTmFtZSA9IGNvb2tpZUF2XG4gIH1cblxuICAvLyA1LiBSZW1vdmUgYW55IGxlYWRpbmcgb3IgdHJhaWxpbmcgV1NQIGNoYXJhY3RlcnMgZnJvbSB0aGUgYXR0cmlidXRlLVxuICAvLyAgICBuYW1lIHN0cmluZyBhbmQgdGhlIGF0dHJpYnV0ZS12YWx1ZSBzdHJpbmcuXG4gIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lLnRyaW0oKVxuICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuXG4gIC8vIDYuIElmIHRoZSBhdHRyaWJ1dGUtdmFsdWUgaXMgbG9uZ2VyIHRoYW4gMTAyNCBvY3RldHMsIGlnbm9yZSB0aGVcbiAgLy8gICAgY29va2llLWF2IHN0cmluZyBhbmQgcmV0dXJuIHRvIFN0ZXAgMSBvZiB0aGlzIGFsZ29yaXRobS5cbiAgaWYgKGF0dHJpYnV0ZVZhbHVlLmxlbmd0aCA+IG1heEF0dHJpYnV0ZVZhbHVlU2l6ZSkge1xuICAgIHJldHVybiBwYXJzZVVucGFyc2VkQXR0cmlidXRlcyh1bnBhcnNlZEF0dHJpYnV0ZXMsIGNvb2tpZUF0dHJpYnV0ZUxpc3QpXG4gIH1cblxuICAvLyA3LiBQcm9jZXNzIHRoZSBhdHRyaWJ1dGUtbmFtZSBhbmQgYXR0cmlidXRlLXZhbHVlIGFjY29yZGluZyB0byB0aGVcbiAgLy8gICAgcmVxdWlyZW1lbnRzIGluIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbnMuICAoTm90aWNlIHRoYXRcbiAgLy8gICAgYXR0cmlidXRlcyB3aXRoIHVucmVjb2duaXplZCBhdHRyaWJ1dGUtbmFtZXMgYXJlIGlnbm9yZWQuKVxuICBjb25zdCBhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID0gYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC4xXG4gIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nXG4gIC8vIFwiRXhwaXJlc1wiLCB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLlxuICBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ2V4cGlyZXMnKSB7XG4gICAgLy8gMS4gTGV0IHRoZSBleHBpcnktdGltZSBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGF0dHJpYnV0ZS12YWx1ZVxuICAgIC8vICAgIGFzIGNvb2tpZS1kYXRlIChzZWUgU2VjdGlvbiA1LjEuMSkuXG4gICAgY29uc3QgZXhwaXJ5VGltZSA9IG5ldyBEYXRlKGF0dHJpYnV0ZVZhbHVlKVxuXG4gICAgLy8gMi4gSWYgdGhlIGF0dHJpYnV0ZS12YWx1ZSBmYWlsZWQgdG8gcGFyc2UgYXMgYSBjb29raWUgZGF0ZSwgaWdub3JlXG4gICAgLy8gICAgdGhlIGNvb2tpZS1hdi5cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QuZXhwaXJlcyA9IGV4cGlyeVRpbWVcbiAgfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID09PSAnbWF4LWFnZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjJcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyBcIk1heC1cbiAgICAvLyBBZ2VcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93cy5cblxuICAgIC8vIDEuIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGF0dHJpYnV0ZS12YWx1ZSBpcyBub3QgYSBESUdJVCBvciBhXG4gICAgLy8gICAgXCItXCIgY2hhcmFjdGVyLCBpZ25vcmUgdGhlIGNvb2tpZS1hdi5cbiAgICBjb25zdCBjaGFyQ29kZSA9IGF0dHJpYnV0ZVZhbHVlLmNoYXJDb2RlQXQoMClcblxuICAgIGlmICgoY2hhckNvZGUgPCA0OCB8fCBjaGFyQ29kZSA+IDU3KSAmJiBhdHRyaWJ1dGVWYWx1ZVswXSAhPT0gJy0nKSB7XG4gICAgICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxuICAgIH1cblxuICAgIC8vIDIuIElmIHRoZSByZW1haW5kZXIgb2YgYXR0cmlidXRlLXZhbHVlIGNvbnRhaW5zIGEgbm9uLURJR0lUXG4gICAgLy8gICAgY2hhcmFjdGVyLCBpZ25vcmUgdGhlIGNvb2tpZS1hdi5cbiAgICBpZiAoIS9eXFxkKyQvLnRlc3QoYXR0cmlidXRlVmFsdWUpKSB7XG4gICAgICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxuICAgIH1cblxuICAgIC8vIDMuIExldCBkZWx0YS1zZWNvbmRzIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUgY29udmVydGVkIHRvIGFuIGludGVnZXIuXG4gICAgY29uc3QgZGVsdGFTZWNvbmRzID0gTnVtYmVyKGF0dHJpYnV0ZVZhbHVlKVxuXG4gICAgLy8gNC4gTGV0IGNvb2tpZS1hZ2UtbGltaXQgYmUgdGhlIG1heGltdW0gYWdlIG9mIHRoZSBjb29raWUgKHdoaWNoXG4gICAgLy8gICAgU0hPVUxEIGJlIDQwMCBkYXlzIG9yIGxlc3MsIHNlZSBTZWN0aW9uIDQuMS4yLjIpLlxuXG4gICAgLy8gNS4gU2V0IGRlbHRhLXNlY29uZHMgdG8gdGhlIHNtYWxsZXIgb2YgaXRzIHByZXNlbnQgdmFsdWUgYW5kIGNvb2tpZS1cbiAgICAvLyAgICBhZ2UtbGltaXQuXG4gICAgLy8gZGVsdGFTZWNvbmRzID0gTWF0aC5taW4oZGVsdGFTZWNvbmRzICogMTAwMCwgbWF4RXhwaXJlc01zKVxuXG4gICAgLy8gNi4gSWYgZGVsdGEtc2Vjb25kcyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybyAoMCksIGxldCBleHBpcnktXG4gICAgLy8gICAgdGltZSBiZSB0aGUgZWFybGllc3QgcmVwcmVzZW50YWJsZSBkYXRlIGFuZCB0aW1lLiAgT3RoZXJ3aXNlLCBsZXRcbiAgICAvLyAgICB0aGUgZXhwaXJ5LXRpbWUgYmUgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBwbHVzIGRlbHRhLXNlY29uZHNcbiAgICAvLyAgICBzZWNvbmRzLlxuICAgIC8vIGNvbnN0IGV4cGlyeVRpbWUgPSBkZWx0YVNlY29uZHMgPD0gMCA/IERhdGUubm93KCkgOiBEYXRlLm5vdygpICsgZGVsdGFTZWNvbmRzXG5cbiAgICAvLyA3LiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIE1heC1BZ2UgYW5kIGFuIGF0dHJpYnV0ZS12YWx1ZSBvZiBleHBpcnktdGltZS5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0Lm1heEFnZSA9IGRlbHRhU2Vjb25kc1xuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdkb21haW4nKSB7XG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC4zXG4gICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRoZSBzdHJpbmcgXCJEb21haW5cIixcbiAgICAvLyB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLlxuXG4gICAgLy8gMS4gTGV0IGNvb2tpZS1kb21haW4gYmUgdGhlIGF0dHJpYnV0ZS12YWx1ZS5cbiAgICBsZXQgY29va2llRG9tYWluID0gYXR0cmlidXRlVmFsdWVcblxuICAgIC8vIDIuIElmIGNvb2tpZS1kb21haW4gc3RhcnRzIHdpdGggJXgyRSAoXCIuXCIpLCBsZXQgY29va2llLWRvbWFpbiBiZVxuICAgIC8vICAgIGNvb2tpZS1kb21haW4gd2l0aG91dCBpdHMgbGVhZGluZyAleDJFIChcIi5cIikuXG4gICAgaWYgKGNvb2tpZURvbWFpblswXSA9PT0gJy4nKSB7XG4gICAgICBjb29raWVEb21haW4gPSBjb29raWVEb21haW4uc2xpY2UoMSlcbiAgICB9XG5cbiAgICAvLyAzLiBDb252ZXJ0IHRoZSBjb29raWUtZG9tYWluIHRvIGxvd2VyIGNhc2UuXG4gICAgY29va2llRG9tYWluID0gY29va2llRG9tYWluLnRvTG93ZXJDYXNlKClcblxuICAgIC8vIDQuIEFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdCB3aXRoIGFuXG4gICAgLy8gICAgYXR0cmlidXRlLW5hbWUgb2YgRG9tYWluIGFuZCBhbiBhdHRyaWJ1dGUtdmFsdWUgb2YgY29va2llLWRvbWFpbi5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LmRvbWFpbiA9IGNvb2tpZURvbWFpblxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdwYXRoJykge1xuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjQuNFxuICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nIFwiUGF0aFwiLFxuICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1QgcHJvY2VzcyB0aGUgY29va2llLWF2IGFzIGZvbGxvd3MuXG5cbiAgICAvLyAxLiBJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlXG4gICAgLy8gICAgYXR0cmlidXRlLXZhbHVlIGlzIG5vdCAleDJGIChcIi9cIik6XG4gICAgbGV0IGNvb2tpZVBhdGggPSAnJ1xuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZS5sZW5ndGggPT09IDAgfHwgYXR0cmlidXRlVmFsdWVbMF0gIT09ICcvJykge1xuICAgICAgLy8gMS4gTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBkZWZhdWx0LXBhdGguXG4gICAgICBjb29raWVQYXRoID0gJy8nXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZTpcblxuICAgICAgLy8gMS4gTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUuXG4gICAgICBjb29raWVQYXRoID0gYXR0cmlidXRlVmFsdWVcbiAgICB9XG5cbiAgICAvLyAyLiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIFBhdGggYW5kIGFuIGF0dHJpYnV0ZS12YWx1ZSBvZiBjb29raWUtcGF0aC5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LnBhdGggPSBjb29raWVQYXRoXG4gIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ3NlY3VyZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjVcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyBcIlNlY3VyZVwiLFxuICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1QgYXBwZW5kIGFuIGF0dHJpYnV0ZSB0byB0aGUgY29va2llLWF0dHJpYnV0ZS1saXN0XG4gICAgLy8gd2l0aCBhbiBhdHRyaWJ1dGUtbmFtZSBvZiBTZWN1cmUgYW5kIGFuIGVtcHR5IGF0dHJpYnV0ZS12YWx1ZS5cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3Quc2VjdXJlID0gdHJ1ZVxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdodHRwb25seScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjZcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZ1xuICAgIC8vIFwiSHR0cE9ubHlcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBhcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtXG4gICAgLy8gYXR0cmlidXRlLWxpc3Qgd2l0aCBhbiBhdHRyaWJ1dGUtbmFtZSBvZiBIdHRwT25seSBhbmQgYW4gZW1wdHlcbiAgICAvLyBhdHRyaWJ1dGUtdmFsdWUuXG5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0Lmh0dHBPbmx5ID0gdHJ1ZVxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdzYW1lc2l0ZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjdcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZ1xuICAgIC8vIFwiU2FtZVNpdGVcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93czpcblxuICAgIC8vIDEuIExldCBlbmZvcmNlbWVudCBiZSBcIkRlZmF1bHRcIi5cbiAgICBsZXQgZW5mb3JjZW1lbnQgPSAnRGVmYXVsdCdcblxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlTG93ZXJjYXNlID0gYXR0cmlidXRlVmFsdWUudG9Mb3dlckNhc2UoKVxuICAgIC8vIDIuIElmIGNvb2tpZS1hdidzIGF0dHJpYnV0ZS12YWx1ZSBpcyBhIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yXG4gICAgLy8gICAgXCJOb25lXCIsIHNldCBlbmZvcmNlbWVudCB0byBcIk5vbmVcIi5cbiAgICBpZiAoYXR0cmlidXRlVmFsdWVMb3dlcmNhc2UuaW5jbHVkZXMoJ25vbmUnKSkge1xuICAgICAgZW5mb3JjZW1lbnQgPSAnTm9uZSdcbiAgICB9XG5cbiAgICAvLyAzLiBJZiBjb29raWUtYXYncyBhdHRyaWJ1dGUtdmFsdWUgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAgIC8vICAgIFwiU3RyaWN0XCIsIHNldCBlbmZvcmNlbWVudCB0byBcIlN0cmljdFwiLlxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZUxvd2VyY2FzZS5pbmNsdWRlcygnc3RyaWN0JykpIHtcbiAgICAgIGVuZm9yY2VtZW50ID0gJ1N0cmljdCdcbiAgICB9XG5cbiAgICAvLyA0LiBJZiBjb29raWUtYXYncyBhdHRyaWJ1dGUtdmFsdWUgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAgIC8vICAgIFwiTGF4XCIsIHNldCBlbmZvcmNlbWVudCB0byBcIkxheFwiLlxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZUxvd2VyY2FzZS5pbmNsdWRlcygnbGF4JykpIHtcbiAgICAgIGVuZm9yY2VtZW50ID0gJ0xheCdcbiAgICB9XG5cbiAgICAvLyA1LiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIFwiU2FtZVNpdGVcIiBhbmQgYW4gYXR0cmlidXRlLXZhbHVlIG9mXG4gICAgLy8gICAgZW5mb3JjZW1lbnQuXG4gICAgY29va2llQXR0cmlidXRlTGlzdC5zYW1lU2l0ZSA9IGVuZm9yY2VtZW50XG4gIH0gZWxzZSB7XG4gICAgY29va2llQXR0cmlidXRlTGlzdC51bnBhcnNlZCA/Pz0gW11cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QudW5wYXJzZWQucHVzaChgJHthdHRyaWJ1dGVOYW1lfT0ke2F0dHJpYnV0ZVZhbHVlfWApXG4gIH1cblxuICAvLyA4LiBSZXR1cm4gdG8gU3RlcCAxIG9mIHRoaXMgYWxnb3JpdGhtLlxuICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2VTZXRDb29raWUsXG4gIHBhcnNlVW5wYXJzZWRBdHRyaWJ1dGVzXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHBhcnNlU2V0Q29va2llIH0gPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHsgc3RyaW5naWZ5LCBnZXRIZWFkZXJzTGlzdCB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBIZWFkZXJzIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9oZWFkZXJzJylcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb29raWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7RGF0ZXxudW1iZXJ8dW5kZWZpbmVkfSBleHBpcmVzXG4gKiBAcHJvcGVydHkge251bWJlcnx1bmRlZmluZWR9IG1heEFnZVxuICogQHByb3BlcnR5IHtzdHJpbmd8dW5kZWZpbmVkfSBkb21haW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfHVuZGVmaW5lZH0gcGF0aFxuICogQHByb3BlcnR5IHtib29sZWFufHVuZGVmaW5lZH0gc2VjdXJlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW58dW5kZWZpbmVkfSBodHRwT25seVxuICogQHByb3BlcnR5IHsnU3RyaWN0J3wnTGF4J3wnTm9uZSd9IHNhbWVTaXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSB1bnBhcnNlZFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtIZWFkZXJzfSBoZWFkZXJzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn1cbiAqL1xuZnVuY3Rpb24gZ2V0Q29va2llcyAoaGVhZGVycykge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnZ2V0Q29va2llcycgfSlcblxuICB3ZWJpZGwuYnJhbmRDaGVjayhoZWFkZXJzLCBIZWFkZXJzLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICBjb25zdCBjb29raWUgPSBoZWFkZXJzLmdldCgnY29va2llJylcbiAgY29uc3Qgb3V0ID0ge31cblxuICBpZiAoIWNvb2tpZSkge1xuICAgIHJldHVybiBvdXRcbiAgfVxuXG4gIGZvciAoY29uc3QgcGllY2Ugb2YgY29va2llLnNwbGl0KCc7JykpIHtcbiAgICBjb25zdCBbbmFtZSwgLi4udmFsdWVdID0gcGllY2Uuc3BsaXQoJz0nKVxuXG4gICAgb3V0W25hbWUudHJpbSgpXSA9IHZhbHVlLmpvaW4oJz0nKVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyc1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7eyBwYXRoPzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcgfXx1bmRlZmluZWR9IGF0dHJpYnV0ZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBkZWxldGVDb29raWUgKGhlYWRlcnMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ2RlbGV0ZUNvb2tpZScgfSlcblxuICB3ZWJpZGwuYnJhbmRDaGVjayhoZWFkZXJzLCBIZWFkZXJzLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKG5hbWUpXG4gIGF0dHJpYnV0ZXMgPSB3ZWJpZGwuY29udmVydGVycy5EZWxldGVDb29raWVBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpXG5cbiAgLy8gTWF0Y2hlcyBiZWhhdmlvciBvZlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGVub2xhbmQvZGVub19zdGQvYmxvYi82MzgyN2IxNjMzMGI4MjQ4OWEwNDYxNDAyN2MzM2I3OTA0ZTA4YmU1L2h0dHAvY29va2llLnRzI0wyNzhcbiAgc2V0Q29va2llKGhlYWRlcnMsIHtcbiAgICBuYW1lLFxuICAgIHZhbHVlOiAnJyxcbiAgICBleHBpcmVzOiBuZXcgRGF0ZSgwKSxcbiAgICAuLi5hdHRyaWJ1dGVzXG4gIH0pXG59XG5cbi8qKlxuICogQHBhcmFtIHtIZWFkZXJzfSBoZWFkZXJzXG4gKiBAcmV0dXJucyB7Q29va2llW119XG4gKi9cbmZ1bmN0aW9uIGdldFNldENvb2tpZXMgKGhlYWRlcnMpIHtcbiAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ2dldFNldENvb2tpZXMnIH0pXG5cbiAgd2ViaWRsLmJyYW5kQ2hlY2soaGVhZGVycywgSGVhZGVycywgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgY29uc3QgY29va2llcyA9IGdldEhlYWRlcnNMaXN0KGhlYWRlcnMpLmNvb2tpZXNcblxuICBpZiAoIWNvb2tpZXMpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIC8vIEluIG9sZGVyIHZlcnNpb25zIG9mIHVuZGljaSwgY29va2llcyBpcyBhIGxpc3Qgb2YgbmFtZTp2YWx1ZS5cbiAgcmV0dXJuIGNvb2tpZXMubWFwKChwYWlyKSA9PiBwYXJzZVNldENvb2tpZShBcnJheS5pc0FycmF5KHBhaXIpID8gcGFpclsxXSA6IHBhaXIpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyc1xuICogQHBhcmFtIHtDb29raWV9IGNvb2tpZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHNldENvb2tpZSAoaGVhZGVycywgY29va2llKSB7XG4gIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMiwgeyBoZWFkZXI6ICdzZXRDb29raWUnIH0pXG5cbiAgd2ViaWRsLmJyYW5kQ2hlY2soaGVhZGVycywgSGVhZGVycywgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgY29va2llID0gd2ViaWRsLmNvbnZlcnRlcnMuQ29va2llKGNvb2tpZSlcblxuICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoY29va2llKVxuXG4gIGlmIChzdHIpIHtcbiAgICBoZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZScsIHN0cmluZ2lmeShjb29raWUpKVxuICB9XG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLkRlbGV0ZUNvb2tpZUF0dHJpYnV0ZXMgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcpLFxuICAgIGtleTogJ3BhdGgnLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKSxcbiAgICBrZXk6ICdkb21haW4nLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVycy5Db29raWUgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICBrZXk6ICduYW1lJ1xuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAga2V5OiAndmFsdWUnXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcigodmFsdWUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyBsb25nJ10odmFsdWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSlcbiAgICB9KSxcbiAgICBrZXk6ICdleHBpcmVzJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzWydsb25nIGxvbmcnXSksXG4gICAga2V5OiAnbWF4QWdlJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAnZG9tYWluJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAncGF0aCcsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ib29sZWFuKSxcbiAgICBrZXk6ICdzZWN1cmUnLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbiksXG4gICAga2V5OiAnaHR0cE9ubHknLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcsXG4gICAga2V5OiAnc2FtZVNpdGUnLFxuICAgIGFsbG93ZWRWYWx1ZXM6IFsnU3RyaWN0JywgJ0xheCcsICdOb25lJ11cbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAndW5wYXJzZWQnLFxuICAgIGRlZmF1bHRWYWx1ZTogW11cbiAgfVxuXSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvb2tpZXMsXG4gIGRlbGV0ZUNvb2tpZSxcbiAgZ2V0U2V0Q29va2llcyxcbiAgc2V0Q29va2llXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBUaGlzIGlzIGEgR2xvYmFsbHkgVW5pcXVlIElkZW50aWZpZXIgdW5pcXVlIHVzZWRcbi8vIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGVuZHBvaW50IGFjY2VwdHMgd2Vic29ja2V0XG4vLyBjb25uZWN0aW9ucy5cbi8vIFNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjQ1NS5odG1sI3NlY3Rpb24tMS4zXG5jb25zdCB1aWQgPSAnMjU4RUFGQTUtRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExJ1xuXG4vKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi9cbmNvbnN0IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMgPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZVxufVxuXG5jb25zdCBzdGF0ZXMgPSB7XG4gIENPTk5FQ1RJTkc6IDAsXG4gIE9QRU46IDEsXG4gIENMT1NJTkc6IDIsXG4gIENMT1NFRDogM1xufVxuXG5jb25zdCBvcGNvZGVzID0ge1xuICBDT05USU5VQVRJT046IDB4MCxcbiAgVEVYVDogMHgxLFxuICBCSU5BUlk6IDB4MixcbiAgQ0xPU0U6IDB4OCxcbiAgUElORzogMHg5LFxuICBQT05HOiAweEFcbn1cblxuY29uc3QgbWF4VW5zaWduZWQxNkJpdCA9IDIgKiogMTYgLSAxIC8vIDY1NTM1XG5cbmNvbnN0IHBhcnNlclN0YXRlcyA9IHtcbiAgSU5GTzogMCxcbiAgUEFZTE9BRExFTkdUSF8xNjogMixcbiAgUEFZTE9BRExFTkdUSF82NDogMyxcbiAgUkVBRF9EQVRBOiA0XG59XG5cbmNvbnN0IGVtcHR5QnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKDApXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB1aWQsXG4gIHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHN0YXRlcyxcbiAgb3Bjb2RlcyxcbiAgbWF4VW5zaWduZWQxNkJpdCxcbiAgcGFyc2VyU3RhdGVzLFxuICBlbXB0eUJ1ZmZlclxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtXZWJTb2NrZXRVUkw6IFN5bWJvbCgndXJsJyksXG4gIGtSZWFkeVN0YXRlOiBTeW1ib2woJ3JlYWR5IHN0YXRlJyksXG4gIGtDb250cm9sbGVyOiBTeW1ib2woJ2NvbnRyb2xsZXInKSxcbiAga1Jlc3BvbnNlOiBTeW1ib2woJ3Jlc3BvbnNlJyksXG4gIGtCaW5hcnlUeXBlOiBTeW1ib2woJ2JpbmFyeSB0eXBlJyksXG4gIGtTZW50Q2xvc2U6IFN5bWJvbCgnc2VudCBjbG9zZScpLFxuICBrUmVjZWl2ZWRDbG9zZTogU3ltYm9sKCdyZWNlaXZlZCBjbG9zZScpLFxuICBrQnl0ZVBhcnNlcjogU3ltYm9sKCdieXRlIHBhcnNlcicpXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvd2ViaWRsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgTWVzc2FnZVBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJylcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NvbW1zLmh0bWwjbWVzc2FnZWV2ZW50XG4gKi9cbmNsYXNzIE1lc3NhZ2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnTWVzc2FnZUV2ZW50IGNvbnN0cnVjdG9yJyB9KVxuXG4gICAgdHlwZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyh0eXBlKVxuICAgIGV2ZW50SW5pdERpY3QgPSB3ZWJpZGwuY29udmVydGVycy5NZXNzYWdlRXZlbnRJbml0KGV2ZW50SW5pdERpY3QpXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICB9XG5cbiAgZ2V0IGRhdGEgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuZGF0YVxuICB9XG5cbiAgZ2V0IG9yaWdpbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5vcmlnaW5cbiAgfVxuXG4gIGdldCBsYXN0RXZlbnRJZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5sYXN0RXZlbnRJZFxuICB9XG5cbiAgZ2V0IHNvdXJjZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5zb3VyY2VcbiAgfVxuXG4gIGdldCBwb3J0cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4odGhpcy4jZXZlbnRJbml0LnBvcnRzKSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLiNldmVudEluaXQucG9ydHMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5wb3J0c1xuICB9XG5cbiAgaW5pdE1lc3NhZ2VFdmVudCAoXG4gICAgdHlwZSxcbiAgICBidWJibGVzID0gZmFsc2UsXG4gICAgY2FuY2VsYWJsZSA9IGZhbHNlLFxuICAgIGRhdGEgPSBudWxsLFxuICAgIG9yaWdpbiA9ICcnLFxuICAgIGxhc3RFdmVudElkID0gJycsXG4gICAgc291cmNlID0gbnVsbCxcbiAgICBwb3J0cyA9IFtdXG4gICkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdNZXNzYWdlRXZlbnQuaW5pdE1lc3NhZ2VFdmVudCcgfSlcblxuICAgIHJldHVybiBuZXcgTWVzc2FnZUV2ZW50KHR5cGUsIHtcbiAgICAgIGJ1YmJsZXMsIGNhbmNlbGFibGUsIGRhdGEsIG9yaWdpbiwgbGFzdEV2ZW50SWQsIHNvdXJjZSwgcG9ydHNcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyN0aGUtY2xvc2VldmVudC1pbnRlcmZhY2VcbiAqL1xuY2xhc3MgQ2xvc2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2xvc2VFdmVudCBjb25zdHJ1Y3RvcicgfSlcblxuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSlcbiAgICBldmVudEluaXREaWN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2xvc2VFdmVudEluaXQoZXZlbnRJbml0RGljdClcblxuICAgIHN1cGVyKHR5cGUsIGV2ZW50SW5pdERpY3QpXG5cbiAgICB0aGlzLiNldmVudEluaXQgPSBldmVudEluaXREaWN0XG4gIH1cblxuICBnZXQgd2FzQ2xlYW4gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENsb3NlRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lndhc0NsZWFuXG4gIH1cblxuICBnZXQgY29kZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2xvc2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuY29kZVxuICB9XG5cbiAgZ2V0IHJlYXNvbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2xvc2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQucmVhc29uXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI3RoZS1lcnJvcmV2ZW50LWludGVyZmFjZVxuY2xhc3MgRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0KSB7XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Vycm9yRXZlbnQgY29uc3RydWN0b3InIH0pXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdHlwZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyh0eXBlKVxuICAgIGV2ZW50SW5pdERpY3QgPSB3ZWJpZGwuY29udmVydGVycy5FcnJvckV2ZW50SW5pdChldmVudEluaXREaWN0ID8/IHt9KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICB9XG5cbiAgZ2V0IG1lc3NhZ2UgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEVycm9yRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lm1lc3NhZ2VcbiAgfVxuXG4gIGdldCBmaWxlbmFtZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRXJyb3JFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuZmlsZW5hbWVcbiAgfVxuXG4gIGdldCBsaW5lbm8gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEVycm9yRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0LmxpbmVub1xuICB9XG5cbiAgZ2V0IGNvbG5vICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5jb2xub1xuICB9XG5cbiAgZ2V0IGVycm9yICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5lcnJvclxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE1lc3NhZ2VFdmVudC5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ01lc3NhZ2VFdmVudCcsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIGRhdGE6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9yaWdpbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbGFzdEV2ZW50SWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHNvdXJjZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcG9ydHM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGluaXRNZXNzYWdlRXZlbnQ6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENsb3NlRXZlbnQucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDbG9zZUV2ZW50JyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSxcbiAgcmVhc29uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjb2RlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICB3YXNDbGVhbjoga0VudW1lcmFibGVQcm9wZXJ0eVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRXJyb3JFdmVudC5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0Vycm9yRXZlbnQnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBtZXNzYWdlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBmaWxlbmFtZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbGluZW5vOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjb2xubzoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VQb3J0ID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihNZXNzYWdlUG9ydClcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPE1lc3NhZ2VQb3J0PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5NZXNzYWdlUG9ydFxuKVxuXG5jb25zdCBldmVudEluaXQgPSBbXG4gIHtcbiAgICBrZXk6ICdidWJibGVzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY2FuY2VsYWJsZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBvc2VkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9XG5dXG5cbndlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIC4uLmV2ZW50SW5pdCxcbiAge1xuICAgIGtleTogJ2RhdGEnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYW55LFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAga2V5OiAnb3JpZ2luJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdsYXN0RXZlbnRJZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnc291cmNlJyxcbiAgICAvLyBOb2RlIGRvZXNuJ3QgaW1wbGVtZW50IFdpbmRvd1Byb3h5IG9yIFNlcnZpY2VXb3JrZXIsIHNvIHRoZSBvbmx5XG4gICAgLy8gdmFsaWQgdmFsdWUgZm9yIHNvdXJjZSBpcyBhIE1lc3NhZ2VQb3J0LlxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VQb3J0KSxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGtleTogJ3BvcnRzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxNZXNzYWdlUG9ydD4nXSxcbiAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXSlcblxud2ViaWRsLmNvbnZlcnRlcnMuQ2xvc2VFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIC4uLmV2ZW50SW5pdCxcbiAge1xuICAgIGtleTogJ3dhc0NsZWFuJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY29kZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgc2hvcnQnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3JlYXNvbicsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVycy5FcnJvckV2ZW50SW5pdCA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAgLi4uZXZlbnRJbml0LFxuICB7XG4gICAga2V5OiAnbWVzc2FnZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnZmlsZW5hbWUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogJydcbiAgfSxcbiAge1xuICAgIGtleTogJ2xpbmVubycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyddLFxuICAgIGRlZmF1bHRWYWx1ZTogMFxuICB9LFxuICB7XG4gICAga2V5OiAnY29sbm8nLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ2Vycm9yJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmFueVxuICB9XG5dKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTWVzc2FnZUV2ZW50LFxuICBDbG9zZUV2ZW50LFxuICBFcnJvckV2ZW50XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGtSZWFkeVN0YXRlLCBrQ29udHJvbGxlciwga1Jlc3BvbnNlLCBrQmluYXJ5VHlwZSwga1dlYlNvY2tldFVSTCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgc3RhdGVzLCBvcGNvZGVzIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IE1lc3NhZ2VFdmVudCwgRXJyb3JFdmVudCB9ID0gcmVxdWlyZSgnLi9ldmVudHMnKVxuXG4vKiBnbG9iYWxzIEJsb2IgKi9cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKi9cbmZ1bmN0aW9uIGlzRXN0YWJsaXNoZWQgKHdzKSB7XG4gIC8vIElmIHRoZSBzZXJ2ZXIncyByZXNwb25zZSBpcyB2YWxpZGF0ZWQgYXMgcHJvdmlkZWQgZm9yIGFib3ZlLCBpdCBpc1xuICAvLyBzYWlkIHRoYXQgX1RoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbiBpcyBFc3RhYmxpc2hlZF8gYW5kIHRoYXQgdGhlXG4gIC8vIFdlYlNvY2tldCBDb25uZWN0aW9uIGlzIGluIHRoZSBPUEVOIHN0YXRlLlxuICByZXR1cm4gd3Nba1JlYWR5U3RhdGVdID09PSBzdGF0ZXMuT1BFTlxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqL1xuZnVuY3Rpb24gaXNDbG9zaW5nICh3cykge1xuICAvLyBVcG9uIGVpdGhlciBzZW5kaW5nIG9yIHJlY2VpdmluZyBhIENsb3NlIGNvbnRyb2wgZnJhbWUsIGl0IGlzIHNhaWRcbiAgLy8gdGhhdCBfVGhlIFdlYlNvY2tldCBDbG9zaW5nIEhhbmRzaGFrZSBpcyBTdGFydGVkXyBhbmQgdGhhdCB0aGVcbiAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgaW4gdGhlIENMT1NJTkcgc3RhdGUuXG4gIHJldHVybiB3c1trUmVhZHlTdGF0ZV0gPT09IHN0YXRlcy5DTE9TSU5HXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vd2Vic29ja2V0JykuV2ViU29ja2V0fSB3c1xuICovXG5mdW5jdGlvbiBpc0Nsb3NlZCAod3MpIHtcbiAgcmV0dXJuIHdzW2tSZWFkeVN0YXRlXSA9PT0gc3RhdGVzLkNMT1NFRFxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWV2ZW50LWZpcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBlXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAqIEBwYXJhbSB7RXZlbnRJbml0IHwgdW5kZWZpbmVkfSBldmVudEluaXREaWN0XG4gKi9cbmZ1bmN0aW9uIGZpcmVFdmVudCAoZSwgdGFyZ2V0LCBldmVudENvbnN0cnVjdG9yID0gRXZlbnQsIGV2ZW50SW5pdERpY3QpIHtcbiAgLy8gMS4gSWYgZXZlbnRDb25zdHJ1Y3RvciBpcyBub3QgZ2l2ZW4sIHRoZW4gbGV0IGV2ZW50Q29uc3RydWN0b3IgYmUgRXZlbnQuXG5cbiAgLy8gMi4gTGV0IGV2ZW50IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gZXZlbnQgZ2l2ZW4gZXZlbnRDb25zdHJ1Y3RvcixcbiAgLy8gICAgaW4gdGhlIHJlbGV2YW50IHJlYWxtIG9mIHRhcmdldC5cbiAgLy8gMy4gSW5pdGlhbGl6ZSBldmVudOKAmXMgdHlwZSBhdHRyaWJ1dGUgdG8gZS5cbiAgY29uc3QgZXZlbnQgPSBuZXcgZXZlbnRDb25zdHJ1Y3RvcihlLCBldmVudEluaXREaWN0KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcblxuICAvLyA0LiBJbml0aWFsaXplIGFueSBvdGhlciBJREwgYXR0cmlidXRlcyBvZiBldmVudCBhcyBkZXNjcmliZWQgaW4gdGhlXG4gIC8vICAgIGludm9jYXRpb24gb2YgdGhpcyBhbGdvcml0aG0uXG5cbiAgLy8gNS4gUmV0dXJuIHRoZSByZXN1bHQgb2YgZGlzcGF0Y2hpbmcgZXZlbnQgYXQgdGFyZ2V0LCB3aXRoIGxlZ2FjeSB0YXJnZXRcbiAgLy8gICAgb3ZlcnJpZGUgZmxhZyBzZXQgaWYgc2V0LlxuICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2ZlZWRiYWNrLWZyb20tdGhlLXByb3RvY29sXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZSBPcGNvZGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIGFwcGxpY2F0aW9uIGRhdGFcbiAqL1xuZnVuY3Rpb24gd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkICh3cywgdHlwZSwgZGF0YSkge1xuICAvLyAxLiBJZiByZWFkeSBzdGF0ZSBpcyBub3QgT1BFTiAoMSksIHRoZW4gcmV0dXJuLlxuICBpZiAod3Nba1JlYWR5U3RhdGVdICE9PSBzdGF0ZXMuT1BFTikge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMi4gTGV0IGRhdGFGb3JFdmVudCBiZSBkZXRlcm1pbmVkIGJ5IHN3aXRjaGluZyBvbiB0eXBlIGFuZCBiaW5hcnkgdHlwZTpcbiAgbGV0IGRhdGFGb3JFdmVudFxuXG4gIGlmICh0eXBlID09PSBvcGNvZGVzLlRFWFQpIHtcbiAgICAvLyAtPiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIGlzIFRleHRcbiAgICAvLyAgICAgIGEgbmV3IERPTVN0cmluZyBjb250YWluaW5nIGRhdGFcbiAgICB0cnkge1xuICAgICAgZGF0YUZvckV2ZW50ID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcsIHsgZmF0YWw6IHRydWUgfSkuZGVjb2RlKGRhdGEpXG4gICAgfSBjYXRjaCB7XG4gICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1JlY2VpdmVkIGludmFsaWQgVVRGLTggaW4gdGV4dCBmcmFtZS4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09IG9wY29kZXMuQklOQVJZKSB7XG4gICAgaWYgKHdzW2tCaW5hcnlUeXBlXSA9PT0gJ2Jsb2InKSB7XG4gICAgICAvLyAtPiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIGlzIEJpbmFyeSBhbmQgYmluYXJ5IHR5cGUgaXMgXCJibG9iXCJcbiAgICAgIC8vICAgICAgYSBuZXcgQmxvYiBvYmplY3QsIGNyZWF0ZWQgaW4gdGhlIHJlbGV2YW50IFJlYWxtIG9mIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vICAgICAgb2JqZWN0LCB0aGF0IHJlcHJlc2VudHMgZGF0YSBhcyBpdHMgcmF3IGRhdGFcbiAgICAgIGRhdGFGb3JFdmVudCA9IG5ldyBCbG9iKFtkYXRhXSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gLT4gdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBpcyBCaW5hcnkgYW5kIGJpbmFyeSB0eXBlIGlzIFwiYXJyYXlidWZmZXJcIlxuICAgICAgLy8gICAgICBhIG5ldyBBcnJheUJ1ZmZlciBvYmplY3QsIGNyZWF0ZWQgaW4gdGhlIHJlbGV2YW50IFJlYWxtIG9mIHRoZVxuICAgICAgLy8gICAgICBXZWJTb2NrZXQgb2JqZWN0LCB3aG9zZSBjb250ZW50cyBhcmUgZGF0YVxuICAgICAgZGF0YUZvckV2ZW50ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSkuYnVmZmVyXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gRmlyZSBhbiBldmVudCBuYW1lZCBtZXNzYWdlIGF0IHRoZSBXZWJTb2NrZXQgb2JqZWN0LCB1c2luZyBNZXNzYWdlRXZlbnQsXG4gIC8vICAgIHdpdGggdGhlIG9yaWdpbiBhdHRyaWJ1dGUgaW5pdGlhbGl6ZWQgdG8gdGhlIHNlcmlhbGl6YXRpb24gb2YgdGhlIFdlYlNvY2tldFxuICAvLyAgICBvYmplY3TigJlzIHVybCdzIG9yaWdpbiwgYW5kIHRoZSBkYXRhIGF0dHJpYnV0ZSBpbml0aWFsaXplZCB0byBkYXRhRm9yRXZlbnQuXG4gIGZpcmVFdmVudCgnbWVzc2FnZScsIHdzLCBNZXNzYWdlRXZlbnQsIHtcbiAgICBvcmlnaW46IHdzW2tXZWJTb2NrZXRVUkxdLm9yaWdpbixcbiAgICBkYXRhOiBkYXRhRm9yRXZlbnRcbiAgfSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NVxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzI2MTZcbiAqIEBzZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzk4NDA3XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvdG9jb2xcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN1YnByb3RvY29sIChwcm90b2NvbCkge1xuICAvLyBJZiBwcmVzZW50LCB0aGlzIHZhbHVlIGluZGljYXRlcyBvbmVcbiAgLy8gb3IgbW9yZSBjb21tYS1zZXBhcmF0ZWQgc3VicHJvdG9jb2wgdGhlIGNsaWVudCB3aXNoZXMgdG8gc3BlYWssXG4gIC8vIG9yZGVyZWQgYnkgcHJlZmVyZW5jZS4gIFRoZSBlbGVtZW50cyB0aGF0IGNvbXByaXNlIHRoaXMgdmFsdWVcbiAgLy8gTVVTVCBiZSBub24tZW1wdHkgc3RyaW5ncyB3aXRoIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFUrMDAyMSB0b1xuICAvLyBVKzAwN0Ugbm90IGluY2x1ZGluZyBzZXBhcmF0b3IgY2hhcmFjdGVycyBhcyBkZWZpbmVkIGluXG4gIC8vIFtSRkMyNjE2XSBhbmQgTVVTVCBhbGwgYmUgdW5pcXVlIHN0cmluZ3MuXG4gIGlmIChwcm90b2NvbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAoY29uc3QgY2hhciBvZiBwcm90b2NvbCkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChcbiAgICAgIGNvZGUgPCAweDIxIHx8XG4gICAgICBjb2RlID4gMHg3RSB8fFxuICAgICAgY2hhciA9PT0gJygnIHx8XG4gICAgICBjaGFyID09PSAnKScgfHxcbiAgICAgIGNoYXIgPT09ICc8JyB8fFxuICAgICAgY2hhciA9PT0gJz4nIHx8XG4gICAgICBjaGFyID09PSAnQCcgfHxcbiAgICAgIGNoYXIgPT09ICcsJyB8fFxuICAgICAgY2hhciA9PT0gJzsnIHx8XG4gICAgICBjaGFyID09PSAnOicgfHxcbiAgICAgIGNoYXIgPT09ICdcXFxcJyB8fFxuICAgICAgY2hhciA9PT0gJ1wiJyB8fFxuICAgICAgY2hhciA9PT0gJy8nIHx8XG4gICAgICBjaGFyID09PSAnWycgfHxcbiAgICAgIGNoYXIgPT09ICddJyB8fFxuICAgICAgY2hhciA9PT0gJz8nIHx8XG4gICAgICBjaGFyID09PSAnPScgfHxcbiAgICAgIGNoYXIgPT09ICd7JyB8fFxuICAgICAgY2hhciA9PT0gJ30nIHx8XG4gICAgICBjb2RlID09PSAzMiB8fCAvLyBTUFxuICAgICAgY29kZSA9PT0gOSAvLyBIVFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTctNFxuICogQHBhcmFtIHtudW1iZXJ9IGNvZGVcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN0YXR1c0NvZGUgKGNvZGUpIHtcbiAgaWYgKGNvZGUgPj0gMTAwMCAmJiBjb2RlIDwgMTAxNSkge1xuICAgIHJldHVybiAoXG4gICAgICBjb2RlICE9PSAxMDA0ICYmIC8vIHJlc2VydmVkXG4gICAgICBjb2RlICE9PSAxMDA1ICYmIC8vIFwiTVVTVCBOT1QgYmUgc2V0IGFzIGEgc3RhdHVzIGNvZGVcIlxuICAgICAgY29kZSAhPT0gMTAwNiAvLyBcIk1VU1QgTk9UIGJlIHNldCBhcyBhIHN0YXR1cyBjb2RlXCJcbiAgICApXG4gIH1cblxuICByZXR1cm4gY29kZSA+PSAzMDAwICYmIGNvZGUgPD0gNDk5OVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gcmVhc29uXG4gKi9cbmZ1bmN0aW9uIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uICh3cywgcmVhc29uKSB7XG4gIGNvbnN0IHsgW2tDb250cm9sbGVyXTogY29udHJvbGxlciwgW2tSZXNwb25zZV06IHJlc3BvbnNlIH0gPSB3c1xuXG4gIGNvbnRyb2xsZXIuYWJvcnQoKVxuXG4gIGlmIChyZXNwb25zZT8uc29ja2V0ICYmICFyZXNwb25zZS5zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgcmVzcG9uc2Uuc29ja2V0LmRlc3Ryb3koKVxuICB9XG5cbiAgaWYgKHJlYXNvbikge1xuICAgIGZpcmVFdmVudCgnZXJyb3InLCB3cywgRXJyb3JFdmVudCwge1xuICAgICAgZXJyb3I6IG5ldyBFcnJvcihyZWFzb24pXG4gICAgfSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNFc3RhYmxpc2hlZCxcbiAgaXNDbG9zaW5nLFxuICBpc0Nsb3NlZCxcbiAgZmlyZUV2ZW50LFxuICBpc1ZhbGlkU3VicHJvdG9jb2wsXG4gIGlzVmFsaWRTdGF0dXNDb2RlLFxuICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbixcbiAgd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBkaWFnbm9zdGljc0NoYW5uZWwgPSByZXF1aXJlKCdkaWFnbm9zdGljc19jaGFubmVsJylcbmNvbnN0IHsgdWlkLCBzdGF0ZXMgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHtcbiAga1JlYWR5U3RhdGUsXG4gIGtTZW50Q2xvc2UsXG4gIGtCeXRlUGFyc2VyLFxuICBrUmVjZWl2ZWRDbG9zZVxufSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGZpcmVFdmVudCwgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24gfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IENsb3NlRXZlbnQgfSA9IHJlcXVpcmUoJy4vZXZlbnRzJylcbmNvbnN0IHsgbWFrZVJlcXVlc3QgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3JlcXVlc3QnKVxuY29uc3QgeyBmZXRjaGluZyB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvaW5kZXgnKVxuY29uc3QgeyBIZWFkZXJzIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9oZWFkZXJzJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi4vZ2xvYmFsJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuXG5jb25zdCBjaGFubmVscyA9IHt9XG5jaGFubmVscy5vcGVuID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6b3BlbicpXG5jaGFubmVscy5jbG9zZSA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6d2Vic29ja2V0OmNsb3NlJylcbmNoYW5uZWxzLnNvY2tldEVycm9yID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6c29ja2V0X2Vycm9yJylcblxuLyoqIEB0eXBlIHtpbXBvcnQoJ2NyeXB0bycpfSAqL1xubGV0IGNyeXB0b1xudHJ5IHtcbiAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbn0gY2F0Y2gge1xuXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXdlYnNvY2tldC1lc3RhYmxpc2hcbiAqIEBwYXJhbSB7VVJMfSB1cmxcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBwcm90b2NvbHNcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqIEBwYXJhbSB7KHJlc3BvbnNlOiBhbnkpID0+IHZvaWR9IG9uRXN0YWJsaXNoXG4gKiBAcGFyYW0ge1BhcnRpYWw8aW1wb3J0KCcuLi8uLi90eXBlcy93ZWJzb2NrZXQnKS5XZWJTb2NrZXRJbml0Pn0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBlc3RhYmxpc2hXZWJTb2NrZXRDb25uZWN0aW9uICh1cmwsIHByb3RvY29scywgd3MsIG9uRXN0YWJsaXNoLCBvcHRpb25zKSB7XG4gIC8vIDEuIExldCByZXF1ZXN0VVJMIGJlIGEgY29weSBvZiB1cmwsIHdpdGggaXRzIHNjaGVtZSBzZXQgdG8gXCJodHRwXCIsIGlmIHVybOKAmXNcbiAgLy8gICAgc2NoZW1lIGlzIFwid3NcIiwgYW5kIHRvIFwiaHR0cHNcIiBvdGhlcndpc2UuXG4gIGNvbnN0IHJlcXVlc3RVUkwgPSB1cmxcblxuICByZXF1ZXN0VVJMLnByb3RvY29sID0gdXJsLnByb3RvY29sID09PSAnd3M6JyA/ICdodHRwOicgOiAnaHR0cHM6J1xuXG4gIC8vIDIuIExldCByZXF1ZXN0IGJlIGEgbmV3IHJlcXVlc3QsIHdob3NlIFVSTCBpcyByZXF1ZXN0VVJMLCBjbGllbnQgaXMgY2xpZW50LFxuICAvLyAgICBzZXJ2aWNlLXdvcmtlcnMgbW9kZSBpcyBcIm5vbmVcIiwgcmVmZXJyZXIgaXMgXCJuby1yZWZlcnJlclwiLCBtb2RlIGlzXG4gIC8vICAgIFwid2Vic29ja2V0XCIsIGNyZWRlbnRpYWxzIG1vZGUgaXMgXCJpbmNsdWRlXCIsIGNhY2hlIG1vZGUgaXMgXCJuby1zdG9yZVwiICxcbiAgLy8gICAgYW5kIHJlZGlyZWN0IG1vZGUgaXMgXCJlcnJvclwiLlxuICBjb25zdCByZXF1ZXN0ID0gbWFrZVJlcXVlc3Qoe1xuICAgIHVybExpc3Q6IFtyZXF1ZXN0VVJMXSxcbiAgICBzZXJ2aWNlV29ya2VyczogJ25vbmUnLFxuICAgIHJlZmVycmVyOiAnbm8tcmVmZXJyZXInLFxuICAgIG1vZGU6ICd3ZWJzb2NrZXQnLFxuICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgY2FjaGU6ICduby1zdG9yZScsXG4gICAgcmVkaXJlY3Q6ICdlcnJvcidcbiAgfSlcblxuICAvLyBOb3RlOiB1bmRpY2kgZXh0ZW5zaW9uLCBhbGxvdyBzZXR0aW5nIGN1c3RvbSBoZWFkZXJzLlxuICBpZiAob3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgY29uc3QgaGVhZGVyc0xpc3QgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpW2tIZWFkZXJzTGlzdF1cblxuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QgPSBoZWFkZXJzTGlzdFxuICB9XG5cbiAgLy8gMy4gQXBwZW5kIChgVXBncmFkZWAsIGB3ZWJzb2NrZXRgKSB0byByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgLy8gNC4gQXBwZW5kIChgQ29ubmVjdGlvbmAsIGBVcGdyYWRlYCkgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIC8vIE5vdGU6IGJvdGggb2YgdGhlc2UgYXJlIGhhbmRsZWQgYnkgdW5kaWNpIGN1cnJlbnRseS5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvYmxvYi82OGMyNjljNDE0NGM0NDZmM2YxMjIwOTUxMzM4ZGFlZjRhNmI1ZWM0L2xpYi9jbGllbnQuanMjTDEzOTdcblxuICAvLyA1LiBMZXQga2V5VmFsdWUgYmUgYSBub25jZSBjb25zaXN0aW5nIG9mIGEgcmFuZG9tbHkgc2VsZWN0ZWRcbiAgLy8gICAgMTYtYnl0ZSB2YWx1ZSB0aGF0IGhhcyBiZWVuIGZvcmdpdmluZy1iYXNlNjQtZW5jb2RlZCBhbmRcbiAgLy8gICAgaXNvbW9ycGhpYyBlbmNvZGVkLlxuICBjb25zdCBrZXlWYWx1ZSA9IGNyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2Jhc2U2NCcpXG5cbiAgLy8gNi4gQXBwZW5kIChgU2VjLVdlYlNvY2tldC1LZXlgLCBrZXlWYWx1ZSkgdG8gcmVxdWVzdOKAmXNcbiAgLy8gICAgaGVhZGVyIGxpc3QuXG4gIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdzZWMtd2Vic29ja2V0LWtleScsIGtleVZhbHVlKVxuXG4gIC8vIDcuIEFwcGVuZCAoYFNlYy1XZWJTb2NrZXQtVmVyc2lvbmAsIGAxM2ApIHRvIHJlcXVlc3TigJlzXG4gIC8vICAgIGhlYWRlciBsaXN0LlxuICByZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnc2VjLXdlYnNvY2tldC12ZXJzaW9uJywgJzEzJylcblxuICAvLyA4LiBGb3IgZWFjaCBwcm90b2NvbCBpbiBwcm90b2NvbHMsIGNvbWJpbmVcbiAgLy8gICAgKGBTZWMtV2ViU29ja2V0LVByb3RvY29sYCwgcHJvdG9jb2wpIGluIHJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0LlxuICBmb3IgKGNvbnN0IHByb3RvY29sIG9mIHByb3RvY29scykge1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdzZWMtd2Vic29ja2V0LXByb3RvY29sJywgcHJvdG9jb2wpXG4gIH1cblxuICAvLyA5LiBMZXQgcGVybWVzc2FnZURlZmxhdGUgYmUgYSB1c2VyLWFnZW50IGRlZmluZWRcbiAgLy8gICAgXCJwZXJtZXNzYWdlLWRlZmxhdGVcIiBleHRlbnNpb24gaGVhZGVyIHZhbHVlLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9nZWNrby1kZXYvYmxvYi9jZTc4MjM0ZjVlNjUzYTVkMzkxNjgxM2ZmOTkwZjA1MzUxMDIyN2JjL25ldHdlcmsvcHJvdG9jb2wvd2Vic29ja2V0L1dlYlNvY2tldENoYW5uZWwuY3BwI0wyNjczXG4gIC8vIFRPRE86IGVuYWJsZSBvbmNlIHBlcm1lc3NhZ2UtZGVmbGF0ZSBpcyBzdXBwb3J0ZWRcbiAgY29uc3QgcGVybWVzc2FnZURlZmxhdGUgPSAnJyAvLyAncGVybWVzc2FnZS1kZWZsYXRlOyAxNSdcblxuICAvLyAxMC4gQXBwZW5kIChgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zYCwgcGVybWVzc2FnZURlZmxhdGUpIHRvXG4gIC8vICAgICByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgLy8gcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3NlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucycsIHBlcm1lc3NhZ2VEZWZsYXRlKVxuXG4gIC8vIDExLiBGZXRjaCByZXF1ZXN0IHdpdGggdXNlUGFyYWxsZWxRdWV1ZSBzZXQgdG8gdHJ1ZSwgYW5kXG4gIC8vICAgICBwcm9jZXNzUmVzcG9uc2UgZ2l2ZW4gcmVzcG9uc2UgYmVpbmcgdGhlc2Ugc3RlcHM6XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBmZXRjaGluZyh7XG4gICAgcmVxdWVzdCxcbiAgICB1c2VQYXJhbGxlbFF1ZXVlOiB0cnVlLFxuICAgIGRpc3BhdGNoZXI6IG9wdGlvbnMuZGlzcGF0Y2hlciA/PyBnZXRHbG9iYWxEaXNwYXRjaGVyKCksXG4gICAgcHJvY2Vzc1Jlc3BvbnNlIChyZXNwb25zZSkge1xuICAgICAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYSBuZXR3b3JrIGVycm9yIG9yIGl0cyBzdGF0dXMgaXMgbm90IDEwMSxcbiAgICAgIC8vICAgIGZhaWwgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgfHwgcmVzcG9uc2Uuc3RhdHVzICE9PSAxMDEpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdSZWNlaXZlZCBuZXR3b3JrIGVycm9yIG9yIG5vbi0xMDEgc3RhdHVzIGNvZGUuJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIHByb3RvY29scyBpcyBub3QgdGhlIGVtcHR5IGxpc3QgYW5kIGV4dHJhY3RpbmcgaGVhZGVyXG4gICAgICAvLyAgICBsaXN0IHZhbHVlcyBnaXZlbiBgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAgYW5kIHJlc3BvbnNl4oCZc1xuICAgICAgLy8gICAgaGVhZGVyIGxpc3QgcmVzdWx0cyBpbiBudWxsLCBmYWlsdXJlLCBvciB0aGUgZW1wdHkgYnl0ZVxuICAgICAgLy8gICAgc2VxdWVuY2UsIHRoZW4gZmFpbCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICBpZiAocHJvdG9jb2xzLmxlbmd0aCAhPT0gMCAmJiAhcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdTZWMtV2ViU29ja2V0LVByb3RvY29sJykpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdTZXJ2ZXIgZGlkIG5vdCByZXNwb25kIHdpdGggc2VudCBwcm90b2NvbHMuJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIEZvbGxvdyB0aGUgcmVxdWlyZW1lbnRzIHN0YXRlZCBzdGVwIDIgdG8gc3RlcCA2LCBpbmNsdXNpdmUsXG4gICAgICAvLyAgICBvZiB0aGUgbGFzdCBzZXQgb2Ygc3RlcHMgaW4gc2VjdGlvbiA0LjEgb2YgVGhlIFdlYlNvY2tldFxuICAgICAgLy8gICAgUHJvdG9jb2wgdG8gdmFsaWRhdGUgcmVzcG9uc2UuIFRoaXMgZWl0aGVyIHJlc3VsdHMgaW4gZmFpbFxuICAgICAgLy8gICAgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG9yIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpc1xuICAgICAgLy8gICAgZXN0YWJsaXNoZWQuXG5cbiAgICAgIC8vIDIuIElmIHRoZSByZXNwb25zZSBsYWNrcyBhbiB8VXBncmFkZXwgaGVhZGVyIGZpZWxkIG9yIHRoZSB8VXBncmFkZXxcbiAgICAgIC8vICAgIGhlYWRlciBmaWVsZCBjb250YWlucyBhIHZhbHVlIHRoYXQgaXMgbm90IGFuIEFTQ0lJIGNhc2UtXG4gICAgICAvLyAgICBpbnNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlIHZhbHVlIFwid2Vic29ja2V0XCIsIHRoZSBjbGllbnQgTVVTVFxuICAgICAgLy8gICAgX0ZhaWwgdGhlIFdlYlNvY2tldCBDb25uZWN0aW9uXy5cbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1VwZ3JhZGUnKT8udG9Mb3dlckNhc2UoKSAhPT0gJ3dlYnNvY2tldCcpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdTZXJ2ZXIgZGlkIG5vdCBzZXQgVXBncmFkZSBoZWFkZXIgdG8gXCJ3ZWJzb2NrZXRcIi4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMy4gSWYgdGhlIHJlc3BvbnNlIGxhY2tzIGEgfENvbm5lY3Rpb258IGhlYWRlciBmaWVsZCBvciB0aGVcbiAgICAgIC8vICAgIHxDb25uZWN0aW9ufCBoZWFkZXIgZmllbGQgZG9lc24ndCBjb250YWluIGEgdG9rZW4gdGhhdCBpcyBhblxuICAgICAgLy8gICAgQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlIHZhbHVlIFwiVXBncmFkZVwiLCB0aGUgY2xpZW50XG4gICAgICAvLyAgICBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uXG4gICAgICBpZiAocmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdDb25uZWN0aW9uJyk/LnRvTG93ZXJDYXNlKCkgIT09ICd1cGdyYWRlJykge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1NlcnZlciBkaWQgbm90IHNldCBDb25uZWN0aW9uIGhlYWRlciB0byBcInVwZ3JhZGVcIi4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgdGhlIHJlc3BvbnNlIGxhY2tzIGEgfFNlYy1XZWJTb2NrZXQtQWNjZXB0fCBoZWFkZXIgZmllbGQgb3JcbiAgICAgIC8vICAgIHRoZSB8U2VjLVdlYlNvY2tldC1BY2NlcHR8IGNvbnRhaW5zIGEgdmFsdWUgb3RoZXIgdGhhbiB0aGVcbiAgICAgIC8vICAgIGJhc2U2NC1lbmNvZGVkIFNIQS0xIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB8U2VjLVdlYlNvY2tldC1cbiAgICAgIC8vICAgIEtleXwgKGFzIGEgc3RyaW5nLCBub3QgYmFzZTY0LWRlY29kZWQpIHdpdGggdGhlIHN0cmluZyBcIjI1OEVBRkE1LVxuICAgICAgLy8gICAgRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExXCIgYnV0IGlnbm9yaW5nIGFueSBsZWFkaW5nIGFuZFxuICAgICAgLy8gICAgdHJhaWxpbmcgd2hpdGVzcGFjZSwgdGhlIGNsaWVudCBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vICAgIENvbm5lY3Rpb25fLlxuICAgICAgY29uc3Qgc2VjV1NBY2NlcHQgPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtQWNjZXB0JylcbiAgICAgIGNvbnN0IGRpZ2VzdCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJykudXBkYXRlKGtleVZhbHVlICsgdWlkKS5kaWdlc3QoJ2Jhc2U2NCcpXG4gICAgICBpZiAoc2VjV1NBY2NlcHQgIT09IGRpZ2VzdCkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ0luY29ycmVjdCBoYXNoIHJlY2VpdmVkIGluIFNlYy1XZWJTb2NrZXQtQWNjZXB0IGhlYWRlci4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNS4gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgfFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uc3wgaGVhZGVyXG4gICAgICAvLyAgICBmaWVsZCBhbmQgdGhpcyBoZWFkZXIgZmllbGQgaW5kaWNhdGVzIHRoZSB1c2Ugb2YgYW4gZXh0ZW5zaW9uXG4gICAgICAvLyAgICB0aGF0IHdhcyBub3QgcHJlc2VudCBpbiB0aGUgY2xpZW50J3MgaGFuZHNoYWtlICh0aGUgc2VydmVyIGhhc1xuICAgICAgLy8gICAgaW5kaWNhdGVkIGFuIGV4dGVuc2lvbiBub3QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQpLCB0aGUgY2xpZW50XG4gICAgICAvLyAgICBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uICAoVGhlIHBhcnNpbmcgb2YgdGhpc1xuICAgICAgLy8gICAgaGVhZGVyIGZpZWxkIHRvIGRldGVybWluZSB3aGljaCBleHRlbnNpb25zIGFyZSByZXF1ZXN0ZWQgaXNcbiAgICAgIC8vICAgIGRpc2N1c3NlZCBpbiBTZWN0aW9uIDkuMS4pXG4gICAgICBjb25zdCBzZWNFeHRlbnNpb24gPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucycpXG5cbiAgICAgIGlmIChzZWNFeHRlbnNpb24gIT09IG51bGwgJiYgc2VjRXh0ZW5zaW9uICE9PSBwZXJtZXNzYWdlRGVmbGF0ZSkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1JlY2VpdmVkIGRpZmZlcmVudCBwZXJtZXNzYWdlLWRlZmxhdGUgdGhhbiB0aGUgb25lIHNldC4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNi4gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgfFNlYy1XZWJTb2NrZXQtUHJvdG9jb2x8IGhlYWRlciBmaWVsZFxuICAgICAgLy8gICAgYW5kIHRoaXMgaGVhZGVyIGZpZWxkIGluZGljYXRlcyB0aGUgdXNlIG9mIGEgc3VicHJvdG9jb2wgdGhhdCB3YXNcbiAgICAgIC8vICAgIG5vdCBwcmVzZW50IGluIHRoZSBjbGllbnQncyBoYW5kc2hha2UgKHRoZSBzZXJ2ZXIgaGFzIGluZGljYXRlZCBhXG4gICAgICAvLyAgICBzdWJwcm90b2NvbCBub3QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQpLCB0aGUgY2xpZW50IE1VU1QgX0ZhaWxcbiAgICAgIC8vICAgIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uXG4gICAgICBjb25zdCBzZWNQcm90b2NvbCA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcpXG5cbiAgICAgIGlmIChzZWNQcm90b2NvbCAhPT0gbnVsbCAmJiBzZWNQcm90b2NvbCAhPT0gcmVxdWVzdC5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtUHJvdG9jb2wnKSkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1Byb3RvY29sIHdhcyBub3Qgc2V0IGluIHRoZSBvcGVuaW5nIGhhbmRzaGFrZS4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVzcG9uc2Uuc29ja2V0Lm9uKCdkYXRhJywgb25Tb2NrZXREYXRhKVxuICAgICAgcmVzcG9uc2Uuc29ja2V0Lm9uKCdjbG9zZScsIG9uU29ja2V0Q2xvc2UpXG4gICAgICByZXNwb25zZS5zb2NrZXQub24oJ2Vycm9yJywgb25Tb2NrZXRFcnJvcilcblxuICAgICAgaWYgKGNoYW5uZWxzLm9wZW4uaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgY2hhbm5lbHMub3Blbi5wdWJsaXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiByZXNwb25zZS5zb2NrZXQuYWRkcmVzcygpLFxuICAgICAgICAgIHByb3RvY29sOiBzZWNQcm90b2NvbCxcbiAgICAgICAgICBleHRlbnNpb25zOiBzZWNFeHRlbnNpb25cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgb25Fc3RhYmxpc2gocmVzcG9uc2UpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBjb250cm9sbGVyXG59XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJ9IGNodW5rXG4gKi9cbmZ1bmN0aW9uIG9uU29ja2V0RGF0YSAoY2h1bmspIHtcbiAgaWYgKCF0aGlzLndzW2tCeXRlUGFyc2VyXS53cml0ZShjaHVuaykpIHtcbiAgICB0aGlzLnBhdXNlKClcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZmVlZGJhY2stZnJvbS10aGUtcHJvdG9jb2xcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tNy4xLjRcbiAqL1xuZnVuY3Rpb24gb25Tb2NrZXRDbG9zZSAoKSB7XG4gIGNvbnN0IHsgd3MgfSA9IHRoaXNcblxuICAvLyBJZiB0aGUgVENQIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBhZnRlciB0aGVcbiAgLy8gV2ViU29ja2V0IGNsb3NpbmcgaGFuZHNoYWtlIHdhcyBjb21wbGV0ZWQsIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAvLyBpcyBzYWlkIHRvIGhhdmUgYmVlbiBjbG9zZWQgX2NsZWFubHlfLlxuICBjb25zdCB3YXNDbGVhbiA9IHdzW2tTZW50Q2xvc2VdICYmIHdzW2tSZWNlaXZlZENsb3NlXVxuXG4gIGxldCBjb2RlID0gMTAwNVxuICBsZXQgcmVhc29uID0gJydcblxuICBjb25zdCByZXN1bHQgPSB3c1trQnl0ZVBhcnNlcl0uY2xvc2luZ0luZm9cblxuICBpZiAocmVzdWx0KSB7XG4gICAgY29kZSA9IHJlc3VsdC5jb2RlID8/IDEwMDVcbiAgICByZWFzb24gPSByZXN1bHQucmVhc29uXG4gIH0gZWxzZSBpZiAoIXdzW2tTZW50Q2xvc2VdKSB7XG4gICAgLy8gSWYgX1RoZSBXZWJTb2NrZXRcbiAgICAvLyBDb25uZWN0aW9uIGlzIENsb3NlZF8gYW5kIG5vIENsb3NlIGNvbnRyb2wgZnJhbWUgd2FzIHJlY2VpdmVkIGJ5IHRoZVxuICAgIC8vIGVuZHBvaW50IChzdWNoIGFzIGNvdWxkIG9jY3VyIGlmIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBjb25uZWN0aW9uXG4gICAgLy8gaXMgbG9zdCksIF9UaGUgV2ViU29ja2V0IENvbm5lY3Rpb24gQ2xvc2UgQ29kZV8gaXMgY29uc2lkZXJlZCB0byBiZVxuICAgIC8vIDEwMDYuXG4gICAgY29kZSA9IDEwMDZcbiAgfVxuXG4gIC8vIDEuIENoYW5nZSB0aGUgcmVhZHkgc3RhdGUgdG8gQ0xPU0VEICgzKS5cbiAgd3Nba1JlYWR5U3RhdGVdID0gc3RhdGVzLkNMT1NFRFxuXG4gIC8vIDIuIElmIHRoZSB1c2VyIGFnZW50IHdhcyByZXF1aXJlZCB0byBmYWlsIHRoZSBXZWJTb2NrZXRcbiAgLy8gICAgY29ubmVjdGlvbiwgb3IgaWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHdhcyBjbG9zZWRcbiAgLy8gICAgYWZ0ZXIgYmVpbmcgZmxhZ2dlZCBhcyBmdWxsLCBmaXJlIGFuIGV2ZW50IG5hbWVkIGVycm9yXG4gIC8vICAgIGF0IHRoZSBXZWJTb2NrZXQgb2JqZWN0LlxuICAvLyBUT0RPXG5cbiAgLy8gMy4gRmlyZSBhbiBldmVudCBuYW1lZCBjbG9zZSBhdCB0aGUgV2ViU29ja2V0IG9iamVjdCxcbiAgLy8gICAgdXNpbmcgQ2xvc2VFdmVudCwgd2l0aCB0aGUgd2FzQ2xlYW4gYXR0cmlidXRlXG4gIC8vICAgIGluaXRpYWxpemVkIHRvIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gY2xvc2VkIGNsZWFubHlcbiAgLy8gICAgYW5kIGZhbHNlIG90aGVyd2lzZSwgdGhlIGNvZGUgYXR0cmlidXRlIGluaXRpYWxpemVkIHRvXG4gIC8vICAgIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBjbG9zZSBjb2RlLCBhbmQgdGhlIHJlYXNvblxuICAvLyAgICBhdHRyaWJ1dGUgaW5pdGlhbGl6ZWQgdG8gdGhlIHJlc3VsdCBvZiBhcHBseWluZyBVVEYtOFxuICAvLyAgICBkZWNvZGUgd2l0aG91dCBCT00gdG8gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGNsb3NlXG4gIC8vICAgIHJlYXNvbi5cbiAgZmlyZUV2ZW50KCdjbG9zZScsIHdzLCBDbG9zZUV2ZW50LCB7XG4gICAgd2FzQ2xlYW4sIGNvZGUsIHJlYXNvblxuICB9KVxuXG4gIGlmIChjaGFubmVscy5jbG9zZS5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLmNsb3NlLnB1Ymxpc2goe1xuICAgICAgd2Vic29ja2V0OiB3cyxcbiAgICAgIGNvZGUsXG4gICAgICByZWFzb25cbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0RXJyb3IgKGVycm9yKSB7XG4gIGNvbnN0IHsgd3MgfSA9IHRoaXNcblxuICB3c1trUmVhZHlTdGF0ZV0gPSBzdGF0ZXMuQ0xPU0lOR1xuXG4gIGlmIChjaGFubmVscy5zb2NrZXRFcnJvci5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLnNvY2tldEVycm9yLnB1Ymxpc2goZXJyb3IpXG4gIH1cblxuICB0aGlzLmRlc3Ryb3koKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZXN0YWJsaXNoV2ViU29ja2V0Q29ubmVjdGlvblxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBtYXhVbnNpZ25lZDE2Qml0IH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdjcnlwdG8nKX0gKi9cbmxldCBjcnlwdG9cbnRyeSB7XG4gIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpXG59IGNhdGNoIHtcblxufVxuXG5jbGFzcyBXZWJzb2NrZXRGcmFtZVNlbmQge1xuICAvKipcbiAgICogQHBhcmFtIHtCdWZmZXJ8dW5kZWZpbmVkfSBkYXRhXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoZGF0YSkge1xuICAgIHRoaXMuZnJhbWVEYXRhID0gZGF0YVxuICAgIHRoaXMubWFza0tleSA9IGNyeXB0by5yYW5kb21CeXRlcyg0KVxuICB9XG5cbiAgY3JlYXRlRnJhbWUgKG9wY29kZSkge1xuICAgIGNvbnN0IGJvZHlMZW5ndGggPSB0aGlzLmZyYW1lRGF0YT8uYnl0ZUxlbmd0aCA/PyAwXG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICBsZXQgcGF5bG9hZExlbmd0aCA9IGJvZHlMZW5ndGggLy8gMC0xMjVcbiAgICBsZXQgb2Zmc2V0ID0gNlxuXG4gICAgaWYgKGJvZHlMZW5ndGggPiBtYXhVbnNpZ25lZDE2Qml0KSB7XG4gICAgICBvZmZzZXQgKz0gOCAvLyBwYXlsb2FkIGxlbmd0aCBpcyBuZXh0IDggYnl0ZXNcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjdcbiAgICB9IGVsc2UgaWYgKGJvZHlMZW5ndGggPiAxMjUpIHtcbiAgICAgIG9mZnNldCArPSAyIC8vIHBheWxvYWQgbGVuZ3RoIGlzIG5leHQgMiBieXRlc1xuICAgICAgcGF5bG9hZExlbmd0aCA9IDEyNlxuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShib2R5TGVuZ3RoICsgb2Zmc2V0KVxuXG4gICAgLy8gQ2xlYXIgZmlyc3QgMiBieXRlcywgZXZlcnl0aGluZyBlbHNlIGlzIG92ZXJ3cml0dGVuXG4gICAgYnVmZmVyWzBdID0gYnVmZmVyWzFdID0gMFxuICAgIGJ1ZmZlclswXSB8PSAweDgwIC8vIEZJTlxuICAgIGJ1ZmZlclswXSA9IChidWZmZXJbMF0gJiAweEYwKSArIG9wY29kZSAvLyBvcGNvZGVcblxuICAgIC8qISB3cy4gTUlUIExpY2Vuc2UuIEVpbmFyIE90dG8gU3Rhbmd2aWsgPGVpbmFyb3NAZ21haWwuY29tPiAqL1xuICAgIGJ1ZmZlcltvZmZzZXQgLSA0XSA9IHRoaXMubWFza0tleVswXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAzXSA9IHRoaXMubWFza0tleVsxXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAyXSA9IHRoaXMubWFza0tleVsyXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAxXSA9IHRoaXMubWFza0tleVszXVxuXG4gICAgYnVmZmVyWzFdID0gcGF5bG9hZExlbmd0aFxuXG4gICAgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNikge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2QkUoYm9keUxlbmd0aCwgMilcbiAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgLy8gQ2xlYXIgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGhcbiAgICAgIGJ1ZmZlclsyXSA9IGJ1ZmZlclszXSA9IDBcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnRCRShib2R5TGVuZ3RoLCA0LCA2KVxuICAgIH1cblxuICAgIGJ1ZmZlclsxXSB8PSAweDgwIC8vIE1BU0tcblxuICAgIC8vIG1hc2sgYm9keVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7XG4gICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSB0aGlzLmZyYW1lRGF0YVtpXSBeIHRoaXMubWFza0tleVtpICUgNF1cbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFdlYnNvY2tldEZyYW1lU2VuZFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBXcml0YWJsZSB9ID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IGRpYWdub3N0aWNzQ2hhbm5lbCA9IHJlcXVpcmUoJ2RpYWdub3N0aWNzX2NoYW5uZWwnKVxuY29uc3QgeyBwYXJzZXJTdGF0ZXMsIG9wY29kZXMsIHN0YXRlcywgZW1wdHlCdWZmZXIgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsga1JlYWR5U3RhdGUsIGtTZW50Q2xvc2UsIGtSZXNwb25zZSwga1JlY2VpdmVkQ2xvc2UgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGlzVmFsaWRTdGF0dXNDb2RlLCBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbiwgd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBXZWJzb2NrZXRGcmFtZVNlbmQgfSA9IHJlcXVpcmUoJy4vZnJhbWUnKVxuXG4vLyBUaGlzIGNvZGUgd2FzIGluZmx1ZW5jZWQgYnkgd3MgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLy8gQ29weXJpZ2h0IChjKSAyMDExIEVpbmFyIE90dG8gU3Rhbmd2aWsgPGVpbmFyb3NAZ21haWwuY29tPlxuLy8gQ29weXJpZ2h0IChjKSAyMDEzIEFybm91dCBLYXplbWllciBhbmQgY29udHJpYnV0b3JzXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTYgTHVpZ2kgUGluY2EgYW5kIGNvbnRyaWJ1dG9yc1xuXG5jb25zdCBjaGFubmVscyA9IHt9XG5jaGFubmVscy5waW5nID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6cGluZycpXG5jaGFubmVscy5wb25nID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6cG9uZycpXG5cbmNsYXNzIEJ5dGVQYXJzZXIgZXh0ZW5kcyBXcml0YWJsZSB7XG4gICNidWZmZXJzID0gW11cbiAgI2J5dGVPZmZzZXQgPSAwXG5cbiAgI3N0YXRlID0gcGFyc2VyU3RhdGVzLklORk9cblxuICAjaW5mbyA9IHt9XG4gICNmcmFnbWVudHMgPSBbXVxuXG4gIGNvbnN0cnVjdG9yICh3cykge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXMud3MgPSB3c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBjaHVua1xuICAgKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrXG4gICAqL1xuICBfd3JpdGUgKGNodW5rLCBfLCBjYWxsYmFjaykge1xuICAgIHRoaXMuI2J1ZmZlcnMucHVzaChjaHVuaylcbiAgICB0aGlzLiNieXRlT2Zmc2V0ICs9IGNodW5rLmxlbmd0aFxuXG4gICAgdGhpcy5ydW4oY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aGVuZXZlciBhIG5ldyBjaHVuayBpcyByZWNlaXZlZC5cbiAgICogQ2FsbGJhY2sgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGFyZSBubyBtb3JlIGNodW5rcyBidWZmZXJpbmcsXG4gICAqIG9yIG5vdCBlbm91Z2ggYnl0ZXMgYXJlIGJ1ZmZlcmVkIHRvIHBhcnNlLlxuICAgKi9cbiAgcnVuIChjYWxsYmFjaykge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy4jc3RhdGUgPT09IHBhcnNlclN0YXRlcy5JTkZPKSB7XG4gICAgICAgIC8vIElmIHRoZXJlIGFyZW4ndCBlbm91Z2ggYnl0ZXMgdG8gcGFyc2UgdGhlIHBheWxvYWQgbGVuZ3RoLCBldGMuXG4gICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0IDwgMikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmNvbnN1bWUoMilcblxuICAgICAgICB0aGlzLiNpbmZvLmZpbiA9IChidWZmZXJbMF0gJiAweDgwKSAhPT0gMFxuICAgICAgICB0aGlzLiNpbmZvLm9wY29kZSA9IGJ1ZmZlclswXSAmIDB4MEZcblxuICAgICAgICAvLyBJZiB3ZSByZWNlaXZlIGEgZnJhZ21lbnRlZCBtZXNzYWdlLCB3ZSB1c2UgdGhlIHR5cGUgb2YgdGhlIGZpcnN0XG4gICAgICAgIC8vIGZyYW1lIHRvIHBhcnNlIHRoZSBmdWxsIG1lc3NhZ2UgYXMgYmluYXJ5L3RleHQsIHdoZW4gaXQncyB0ZXJtaW5hdGVkXG4gICAgICAgIHRoaXMuI2luZm8ub3JpZ2luYWxPcGNvZGUgPz89IHRoaXMuI2luZm8ub3Bjb2RlXG5cbiAgICAgICAgdGhpcy4jaW5mby5mcmFnbWVudGVkID0gIXRoaXMuI2luZm8uZmluICYmIHRoaXMuI2luZm8ub3Bjb2RlICE9PSBvcGNvZGVzLkNPTlRJTlVBVElPTlxuXG4gICAgICAgIGlmICh0aGlzLiNpbmZvLmZyYWdtZW50ZWQgJiYgdGhpcy4jaW5mby5vcGNvZGUgIT09IG9wY29kZXMuQklOQVJZICYmIHRoaXMuI2luZm8ub3Bjb2RlICE9PSBvcGNvZGVzLlRFWFQpIHtcbiAgICAgICAgICAvLyBPbmx5IHRleHQgYW5kIGJpbmFyeSBmcmFtZXMgY2FuIGJlIGZyYWdtZW50ZWRcbiAgICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih0aGlzLndzLCAnSW52YWxpZCBmcmFtZSB0eXBlIHdhcyBmcmFnbWVudGVkLicpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXlsb2FkTGVuZ3RoID0gYnVmZmVyWzFdICYgMHg3RlxuXG4gICAgICAgIGlmIChwYXlsb2FkTGVuZ3RoIDw9IDEyNSkge1xuICAgICAgICAgIHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCA9IHBheWxvYWRMZW5ndGhcbiAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5SRUFEX0RBVEFcbiAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5QQVlMT0FETEVOR1RIXzE2XG4gICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUEFZTE9BRExFTkdUSF82NFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuI2luZm8uZnJhZ21lbnRlZCAmJiBwYXlsb2FkTGVuZ3RoID4gMTI1KSB7XG4gICAgICAgICAgLy8gQSBmcmFnbWVudGVkIGZyYW1lIGNhbid0IGJlIGZyYWdtZW50ZWQgaXRzZWxmXG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ0ZyYWdtZW50ZWQgZnJhbWUgZXhjZWVkZWQgMTI1IGJ5dGVzLicpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgKHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLlBJTkcgfHxcbiAgICAgICAgICAgIHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLlBPTkcgfHxcbiAgICAgICAgICAgIHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLkNMT1NFKSAmJlxuICAgICAgICAgIHBheWxvYWRMZW5ndGggPiAxMjVcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQ29udHJvbCBmcmFtZXMgY2FuIGhhdmUgYSBwYXlsb2FkIGxlbmd0aCBvZiAxMjUgYnl0ZXMgTUFYXG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ1BheWxvYWQgbGVuZ3RoIGZvciBjb250cm9sIGZyYW1lIGV4Y2VlZGVkIDEyNSBieXRlcy4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLkNMT1NFKSB7XG4gICAgICAgICAgaWYgKHBheWxvYWRMZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHRoaXMud3MsICdSZWNlaXZlZCBjbG9zZSBmcmFtZSB3aXRoIGEgMS1ieXRlIGJvZHkuJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmNvbnN1bWUocGF5bG9hZExlbmd0aClcblxuICAgICAgICAgIHRoaXMuI2luZm8uY2xvc2VJbmZvID0gdGhpcy5wYXJzZUNsb3NlQm9keShmYWxzZSwgYm9keSlcblxuICAgICAgICAgIGlmICghdGhpcy53c1trU2VudENsb3NlXSkge1xuICAgICAgICAgICAgLy8gSWYgYW4gZW5kcG9pbnQgcmVjZWl2ZXMgYSBDbG9zZSBmcmFtZSBhbmQgZGlkIG5vdCBwcmV2aW91c2x5IHNlbmQgYVxuICAgICAgICAgICAgLy8gQ2xvc2UgZnJhbWUsIHRoZSBlbmRwb2ludCBNVVNUIHNlbmQgYSBDbG9zZSBmcmFtZSBpbiByZXNwb25zZS4gIChXaGVuXG4gICAgICAgICAgICAvLyBzZW5kaW5nIGEgQ2xvc2UgZnJhbWUgaW4gcmVzcG9uc2UsIHRoZSBlbmRwb2ludCB0eXBpY2FsbHkgZWNob3MgdGhlXG4gICAgICAgICAgICAvLyBzdGF0dXMgY29kZSBpdCByZWNlaXZlZC4pXG4gICAgICAgICAgICBjb25zdCBib2R5ID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIpXG4gICAgICAgICAgICBib2R5LndyaXRlVUludDE2QkUodGhpcy4jaW5mby5jbG9zZUluZm8uY29kZSwgMClcbiAgICAgICAgICAgIGNvbnN0IGNsb3NlRnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKGJvZHkpXG5cbiAgICAgICAgICAgIHRoaXMud3Nba1Jlc3BvbnNlXS5zb2NrZXQud3JpdGUoXG4gICAgICAgICAgICAgIGNsb3NlRnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5DTE9TRSksXG4gICAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgICAgdGhpcy53c1trU2VudENsb3NlXSA9IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcG9uIGVpdGhlciBzZW5kaW5nIG9yIHJlY2VpdmluZyBhIENsb3NlIGNvbnRyb2wgZnJhbWUsIGl0IGlzIHNhaWRcbiAgICAgICAgICAvLyB0aGF0IF9UaGUgV2ViU29ja2V0IENsb3NpbmcgSGFuZHNoYWtlIGlzIFN0YXJ0ZWRfIGFuZCB0aGF0IHRoZVxuICAgICAgICAgIC8vIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGluIHRoZSBDTE9TSU5HIHN0YXRlLlxuICAgICAgICAgIHRoaXMud3Nba1JlYWR5U3RhdGVdID0gc3RhdGVzLkNMT1NJTkdcbiAgICAgICAgICB0aGlzLndzW2tSZWNlaXZlZENsb3NlXSA9IHRydWVcblxuICAgICAgICAgIHRoaXMuZW5kKClcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLlBJTkcpIHtcbiAgICAgICAgICAvLyBVcG9uIHJlY2VpcHQgb2YgYSBQaW5nIGZyYW1lLCBhbiBlbmRwb2ludCBNVVNUIHNlbmQgYSBQb25nIGZyYW1lIGluXG4gICAgICAgICAgLy8gcmVzcG9uc2UsIHVubGVzcyBpdCBhbHJlYWR5IHJlY2VpdmVkIGEgQ2xvc2UgZnJhbWUuXG4gICAgICAgICAgLy8gQSBQb25nIGZyYW1lIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBQaW5nIGZyYW1lIG11c3QgaGF2ZSBpZGVudGljYWxcbiAgICAgICAgICAvLyBcIkFwcGxpY2F0aW9uIGRhdGFcIlxuXG4gICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuY29uc3VtZShwYXlsb2FkTGVuZ3RoKVxuXG4gICAgICAgICAgaWYgKCF0aGlzLndzW2tSZWNlaXZlZENsb3NlXSkge1xuICAgICAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKGJvZHkpXG5cbiAgICAgICAgICAgIHRoaXMud3Nba1Jlc3BvbnNlXS5zb2NrZXQud3JpdGUoZnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5QT05HKSlcblxuICAgICAgICAgICAgaWYgKGNoYW5uZWxzLnBpbmcuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgY2hhbm5lbHMucGluZy5wdWJsaXNoKHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBib2R5XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuSU5GT1xuXG4gICAgICAgICAgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy4jaW5mby5vcGNvZGUgPT09IG9wY29kZXMuUE9ORykge1xuICAgICAgICAgIC8vIEEgUG9uZyBmcmFtZSBNQVkgYmUgc2VudCB1bnNvbGljaXRlZC4gIFRoaXMgc2VydmVzIGFzIGFcbiAgICAgICAgICAvLyB1bmlkaXJlY3Rpb25hbCBoZWFydGJlYXQuICBBIHJlc3BvbnNlIHRvIGFuIHVuc29saWNpdGVkIFBvbmcgZnJhbWUgaXNcbiAgICAgICAgICAvLyBub3QgZXhwZWN0ZWQuXG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5jb25zdW1lKHBheWxvYWRMZW5ndGgpXG5cbiAgICAgICAgICBpZiAoY2hhbm5lbHMucG9uZy5oYXNTdWJzY3JpYmVycykge1xuICAgICAgICAgICAgY2hhbm5lbHMucG9uZy5wdWJsaXNoKHtcbiAgICAgICAgICAgICAgcGF5bG9hZDogYm9keVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA+IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLiNzdGF0ZSA9PT0gcGFyc2VyU3RhdGVzLlBBWUxPQURMRU5HVEhfMTYpIHtcbiAgICAgICAgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuY29uc3VtZSgyKVxuXG4gICAgICAgIHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCA9IGJ1ZmZlci5yZWFkVUludDE2QkUoMClcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI3N0YXRlID09PSBwYXJzZXJTdGF0ZXMuUEFZTE9BRExFTkdUSF82NCkge1xuICAgICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA8IDgpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5jb25zdW1lKDgpXG4gICAgICAgIGNvbnN0IHVwcGVyID0gYnVmZmVyLnJlYWRVSW50MzJCRSgwKVxuXG4gICAgICAgIC8vIDJeMzEgaXMgdGhlIG1heGluaW11bSBieXRlcyBhbiBhcnJheWJ1ZmZlciBjYW4gY29udGFpblxuICAgICAgICAvLyBvbiAzMi1iaXQgc3lzdGVtcy4gQWx0aG91Z2gsIG9uIDY0LWJpdCBzeXN0ZW1zLCB0aGlzIGlzXG4gICAgICAgIC8vIDJeNTMtMSBieXRlcy5cbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvRXJyb3JzL0ludmFsaWRfYXJyYXlfbGVuZ3RoXG4gICAgICAgIC8vIGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYWluOnY4L3NyYy9jb21tb24vZ2xvYmFscy5oO2RyYz0xOTQ2MjEyYWMwMTAwNjY4ZjE0ZWI5ZTI4NDNiZGQ4NDZlNTEwYTFlO2Jwdj0xO2JwdD0xO2w9MTI3NVxuICAgICAgICAvLyBodHRwczovL3NvdXJjZS5jaHJvbWl1bS5vcmcvY2hyb21pdW0vY2hyb21pdW0vc3JjLysvbWFpbjp2OC9zcmMvb2JqZWN0cy9qcy1hcnJheS1idWZmZXIuaDtsPTM0O2RyYz0xOTQ2MjEyYWMwMTAwNjY4ZjE0ZWI5ZTI4NDNiZGQ4NDZlNTEwYTFlXG4gICAgICAgIGlmICh1cHBlciA+IDIgKiogMzEgLSAxKSB7XG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ1JlY2VpdmVkIHBheWxvYWQgbGVuZ3RoID4gMl4zMSBieXRlcy4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG93ZXIgPSBidWZmZXIucmVhZFVJbnQzMkJFKDQpXG5cbiAgICAgICAgdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoID0gKHVwcGVyIDw8IDgpICsgbG93ZXJcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI3N0YXRlID09PSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBKSB7XG4gICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0IDwgdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgbW9yZSBkYXRhIGluIHRoaXMgY2h1bmsgdGhhdCBuZWVkcyB0byBiZSByZWFkXG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNieXRlT2Zmc2V0ID49IHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCkge1xuICAgICAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgc2VudCBtdWx0aXBsZSBmcmFtZXMgaW4gYSBzaW5nbGUgY2h1bmtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmNvbnN1bWUodGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoKVxuXG4gICAgICAgICAgdGhpcy4jZnJhZ21lbnRzLnB1c2goYm9keSlcblxuICAgICAgICAgIC8vIElmIHRoZSBmcmFtZSBpcyB1bmZyYWdtZW50ZWQsIG9yIGEgZnJhZ21lbnRlZCBmcmFtZSB3YXMgdGVybWluYXRlZCxcbiAgICAgICAgICAvLyBhIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkXG4gICAgICAgICAgaWYgKCF0aGlzLiNpbmZvLmZyYWdtZW50ZWQgfHwgKHRoaXMuI2luZm8uZmluICYmIHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLkNPTlRJTlVBVElPTikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxNZXNzYWdlID0gQnVmZmVyLmNvbmNhdCh0aGlzLiNmcmFnbWVudHMpXG5cbiAgICAgICAgICAgIHdlYnNvY2tldE1lc3NhZ2VSZWNlaXZlZCh0aGlzLndzLCB0aGlzLiNpbmZvLm9yaWdpbmFsT3Bjb2RlLCBmdWxsTWVzc2FnZSlcblxuICAgICAgICAgICAgdGhpcy4jaW5mbyA9IHt9XG4gICAgICAgICAgICB0aGlzLiNmcmFnbWVudHMubGVuZ3RoID0gMFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuI3N0YXRlID0gcGFyc2VyU3RhdGVzLklORk9cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA+IDApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBuIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlcmVkIEJ1ZmZlcnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5cbiAgICogQHJldHVybnMge0J1ZmZlcnxudWxsfVxuICAgKi9cbiAgY29uc3VtZSAobikge1xuICAgIGlmIChuID4gdGhpcy4jYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9IGVsc2UgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVybiBlbXB0eUJ1ZmZlclxuICAgIH1cblxuICAgIGlmICh0aGlzLiNidWZmZXJzWzBdLmxlbmd0aCA9PT0gbikge1xuICAgICAgdGhpcy4jYnl0ZU9mZnNldCAtPSB0aGlzLiNidWZmZXJzWzBdLmxlbmd0aFxuICAgICAgcmV0dXJuIHRoaXMuI2J1ZmZlcnMuc2hpZnQoKVxuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB3aGlsZSAob2Zmc2V0ICE9PSBuKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy4jYnVmZmVyc1swXVxuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IG5leHRcblxuICAgICAgaWYgKGxlbmd0aCArIG9mZnNldCA9PT0gbikge1xuICAgICAgICBidWZmZXIuc2V0KHRoaXMuI2J1ZmZlcnMuc2hpZnQoKSwgb2Zmc2V0KVxuICAgICAgICBicmVha1xuICAgICAgfSBlbHNlIGlmIChsZW5ndGggKyBvZmZzZXQgPiBuKSB7XG4gICAgICAgIGJ1ZmZlci5zZXQobmV4dC5zdWJhcnJheSgwLCBuIC0gb2Zmc2V0KSwgb2Zmc2V0KVxuICAgICAgICB0aGlzLiNidWZmZXJzWzBdID0gbmV4dC5zdWJhcnJheShuIC0gb2Zmc2V0KVxuICAgICAgICBicmVha1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyLnNldCh0aGlzLiNidWZmZXJzLnNoaWZ0KCksIG9mZnNldClcbiAgICAgICAgb2Zmc2V0ICs9IG5leHQubGVuZ3RoXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy4jYnl0ZU9mZnNldCAtPSBuXG5cbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cblxuICBwYXJzZUNsb3NlQm9keSAob25seUNvZGUsIGRhdGEpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi03LjEuNVxuICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgY29kZVxuXG4gICAgaWYgKGRhdGEubGVuZ3RoID49IDIpIHtcbiAgICAgIC8vIF9UaGUgV2ViU29ja2V0IENvbm5lY3Rpb24gQ2xvc2UgQ29kZV8gaXNcbiAgICAgIC8vIGRlZmluZWQgYXMgdGhlIHN0YXR1cyBjb2RlIChTZWN0aW9uIDcuNCkgY29udGFpbmVkIGluIHRoZSBmaXJzdCBDbG9zZVxuICAgICAgLy8gY29udHJvbCBmcmFtZSByZWNlaXZlZCBieSB0aGUgYXBwbGljYXRpb25cbiAgICAgIGNvZGUgPSBkYXRhLnJlYWRVSW50MTZCRSgwKVxuICAgIH1cblxuICAgIGlmIChvbmx5Q29kZSkge1xuICAgICAgaWYgKCFpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBjb2RlIH1cbiAgICB9XG5cbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi03LjEuNlxuICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgIGxldCByZWFzb24gPSBkYXRhLnN1YmFycmF5KDIpXG5cbiAgICAvLyBSZW1vdmUgQk9NXG4gICAgaWYgKHJlYXNvblswXSA9PT0gMHhFRiAmJiByZWFzb25bMV0gPT09IDB4QkIgJiYgcmVhc29uWzJdID09PSAweEJGKSB7XG4gICAgICByZWFzb24gPSByZWFzb24uc3ViYXJyYXkoMylcbiAgICB9XG5cbiAgICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkICYmICFpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVE9ETzogb3B0aW1pemUgdGhpc1xuICAgICAgcmVhc29uID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcsIHsgZmF0YWw6IHRydWUgfSkuZGVjb2RlKHJlYXNvbilcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSwgcmVhc29uIH1cbiAgfVxuXG4gIGdldCBjbG9zaW5nSW5mbyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2luZm8uY2xvc2VJbmZvXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEJ5dGVQYXJzZXJcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBET01FeGNlcHRpb24gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2NvbnN0YW50cycpXG5jb25zdCB7IFVSTFNlcmlhbGl6ZXIgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2RhdGFVUkwnKVxuY29uc3QgeyBnZXRHbG9iYWxPcmlnaW4gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2dsb2JhbCcpXG5jb25zdCB7IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsIHN0YXRlcywgb3Bjb2RlcywgZW1wdHlCdWZmZXIgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHtcbiAga1dlYlNvY2tldFVSTCxcbiAga1JlYWR5U3RhdGUsXG4gIGtDb250cm9sbGVyLFxuICBrQmluYXJ5VHlwZSxcbiAga1Jlc3BvbnNlLFxuICBrU2VudENsb3NlLFxuICBrQnl0ZVBhcnNlclxufSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGlzRXN0YWJsaXNoZWQsIGlzQ2xvc2luZywgaXNWYWxpZFN1YnByb3RvY29sLCBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbiwgZmlyZUV2ZW50IH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBlc3RhYmxpc2hXZWJTb2NrZXRDb25uZWN0aW9uIH0gPSByZXF1aXJlKCcuL2Nvbm5lY3Rpb24nKVxuY29uc3QgeyBXZWJzb2NrZXRGcmFtZVNlbmQgfSA9IHJlcXVpcmUoJy4vZnJhbWUnKVxuY29uc3QgeyBCeXRlUGFyc2VyIH0gPSByZXF1aXJlKCcuL3JlY2VpdmVyJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSwgaXNCbG9iTGlrZSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi4vZ2xvYmFsJylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuXG5sZXQgZXhwZXJpbWVudGFsV2FybmVkID0gZmFsc2VcblxuLy8gaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jaW50ZXJmYWNlLWRlZmluaXRpb25cbmNsYXNzIFdlYlNvY2tldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgI2V2ZW50cyA9IHtcbiAgICBvcGVuOiBudWxsLFxuICAgIGVycm9yOiBudWxsLFxuICAgIGNsb3NlOiBudWxsLFxuICAgIG1lc3NhZ2U6IG51bGxcbiAgfVxuXG4gICNidWZmZXJlZEFtb3VudCA9IDBcbiAgI3Byb3RvY29sID0gJydcbiAgI2V4dGVuc2lvbnMgPSAnJ1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBwcm90b2NvbHNcbiAgICovXG4gIGNvbnN0cnVjdG9yICh1cmwsIHByb3RvY29scyA9IFtdKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1dlYlNvY2tldCBjb25zdHJ1Y3RvcicgfSlcblxuICAgIGlmICghZXhwZXJpbWVudGFsV2FybmVkKSB7XG4gICAgICBleHBlcmltZW50YWxXYXJuZWQgPSB0cnVlXG4gICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKCdXZWJTb2NrZXRzIGFyZSBleHBlcmltZW50YWwsIGV4cGVjdCB0aGVtIHRvIGNoYW5nZSBhdCBhbnkgdGltZS4nLCB7XG4gICAgICAgIGNvZGU6ICdVTkRJQ0ktV1MnXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVyc1snRE9NU3RyaW5nIG9yIHNlcXVlbmNlPERPTVN0cmluZz4gb3IgV2ViU29ja2V0SW5pdCddKHByb3RvY29scylcblxuICAgIHVybCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh1cmwpXG4gICAgcHJvdG9jb2xzID0gb3B0aW9ucy5wcm90b2NvbHNcblxuICAgIC8vIDEuIExldCBiYXNlVVJMIGJlIHRoaXMncyByZWxldmFudCBzZXR0aW5ncyBvYmplY3QncyBBUEkgYmFzZSBVUkwuXG4gICAgY29uc3QgYmFzZVVSTCA9IGdldEdsb2JhbE9yaWdpbigpXG5cbiAgICAvLyAxLiBMZXQgdXJsUmVjb3JkIGJlIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIFVSTCBwYXJzZXIgdG8gdXJsIHdpdGggYmFzZVVSTC5cbiAgICBsZXQgdXJsUmVjb3JkXG5cbiAgICB0cnkge1xuICAgICAgdXJsUmVjb3JkID0gbmV3IFVSTCh1cmwsIGJhc2VVUkwpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gMy4gSWYgdXJsUmVjb3JkIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBcIlN5bnRheEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihlLCAnU3ludGF4RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDQuIElmIHVybFJlY29yZOKAmXMgc2NoZW1lIGlzIFwiaHR0cFwiLCB0aGVuIHNldCB1cmxSZWNvcmTigJlzIHNjaGVtZSB0byBcIndzXCIuXG4gICAgaWYgKHVybFJlY29yZC5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgICAgdXJsUmVjb3JkLnByb3RvY29sID0gJ3dzOidcbiAgICB9IGVsc2UgaWYgKHVybFJlY29yZC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgaXMgXCJodHRwc1wiLCBzZXQgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgdG8gXCJ3c3NcIi5cbiAgICAgIHVybFJlY29yZC5wcm90b2NvbCA9ICd3c3M6J1xuICAgIH1cblxuICAgIC8vIDYuIElmIHVybFJlY29yZOKAmXMgc2NoZW1lIGlzIG5vdCBcIndzXCIgb3IgXCJ3c3NcIiwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKHVybFJlY29yZC5wcm90b2NvbCAhPT0gJ3dzOicgJiYgdXJsUmVjb3JkLnByb3RvY29sICE9PSAnd3NzOicpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oXG4gICAgICAgIGBFeHBlY3RlZCBhIHdzOiBvciB3c3M6IHByb3RvY29sLCBnb3QgJHt1cmxSZWNvcmQucHJvdG9jb2x9YCxcbiAgICAgICAgJ1N5bnRheEVycm9yJ1xuICAgICAgKVxuICAgIH1cblxuICAgIC8vIDcuIElmIHVybFJlY29yZOKAmXMgZnJhZ21lbnQgaXMgbm9uLW51bGwsIHRoZW4gdGhyb3cgYSBcIlN5bnRheEVycm9yXCJcbiAgICAvLyAgICBET01FeGNlcHRpb24uXG4gICAgaWYgKHVybFJlY29yZC5oYXNoIHx8IHVybFJlY29yZC5ocmVmLmVuZHNXaXRoKCcjJykpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0dvdCBmcmFnbWVudCcsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgLy8gOC4gSWYgcHJvdG9jb2xzIGlzIGEgc3RyaW5nLCBzZXQgcHJvdG9jb2xzIHRvIGEgc2VxdWVuY2UgY29uc2lzdGluZ1xuICAgIC8vICAgIG9mIGp1c3QgdGhhdCBzdHJpbmcuXG4gICAgaWYgKHR5cGVvZiBwcm90b2NvbHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcm90b2NvbHMgPSBbcHJvdG9jb2xzXVxuICAgIH1cblxuICAgIC8vIDkuIElmIGFueSBvZiB0aGUgdmFsdWVzIGluIHByb3RvY29scyBvY2N1ciBtb3JlIHRoYW4gb25jZSBvciBvdGhlcndpc2VcbiAgICAvLyAgICBmYWlsIHRvIG1hdGNoIHRoZSByZXF1aXJlbWVudHMgZm9yIGVsZW1lbnRzIHRoYXQgY29tcHJpc2UgdGhlIHZhbHVlXG4gICAgLy8gICAgb2YgYFNlYy1XZWJTb2NrZXQtUHJvdG9jb2xgIGZpZWxkcyBhcyBkZWZpbmVkIGJ5IFRoZSBXZWJTb2NrZXRcbiAgICAvLyAgICBwcm90b2NvbCwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKHByb3RvY29scy5sZW5ndGggIT09IG5ldyBTZXQocHJvdG9jb2xzLm1hcChwID0+IHAudG9Mb3dlckNhc2UoKSkpLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1Qcm90b2NvbCB2YWx1ZScsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgaWYgKHByb3RvY29scy5sZW5ndGggPiAwICYmICFwcm90b2NvbHMuZXZlcnkocCA9PiBpc1ZhbGlkU3VicHJvdG9jb2wocCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgdmFsdWUnLCAnU3ludGF4RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDEwLiBTZXQgdGhpcydzIHVybCB0byB1cmxSZWNvcmQuXG4gICAgdGhpc1trV2ViU29ja2V0VVJMXSA9IG5ldyBVUkwodXJsUmVjb3JkLmhyZWYpXG5cbiAgICAvLyAxMS4gTGV0IGNsaWVudCBiZSB0aGlzJ3MgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LlxuXG4gICAgLy8gMTIuIFJ1biB0aGlzIHN0ZXAgaW4gcGFyYWxsZWw6XG5cbiAgICAvLyAgICAxLiBFc3RhYmxpc2ggYSBXZWJTb2NrZXQgY29ubmVjdGlvbiBnaXZlbiB1cmxSZWNvcmQsIHByb3RvY29scyxcbiAgICAvLyAgICAgICBhbmQgY2xpZW50LlxuICAgIHRoaXNba0NvbnRyb2xsZXJdID0gZXN0YWJsaXNoV2ViU29ja2V0Q29ubmVjdGlvbihcbiAgICAgIHVybFJlY29yZCxcbiAgICAgIHByb3RvY29scyxcbiAgICAgIHRoaXMsXG4gICAgICAocmVzcG9uc2UpID0+IHRoaXMuI29uQ29ubmVjdGlvbkVzdGFibGlzaGVkKHJlc3BvbnNlKSxcbiAgICAgIG9wdGlvbnNcbiAgICApXG5cbiAgICAvLyBFYWNoIFdlYlNvY2tldCBvYmplY3QgaGFzIGFuIGFzc29jaWF0ZWQgcmVhZHkgc3RhdGUsIHdoaWNoIGlzIGFcbiAgICAvLyBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbi4gSW5pdGlhbGx5IGl0IG11c3RcbiAgICAvLyBiZSBDT05ORUNUSU5HICgwKS5cbiAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IFdlYlNvY2tldC5DT05ORUNUSU5HXG5cbiAgICAvLyBUaGUgZXh0ZW5zaW9ucyBhdHRyaWJ1dGUgbXVzdCBpbml0aWFsbHkgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuXG5cbiAgICAvLyBUaGUgcHJvdG9jb2wgYXR0cmlidXRlIG11c3QgaW5pdGlhbGx5IHJldHVybiB0aGUgZW1wdHkgc3RyaW5nLlxuXG4gICAgLy8gRWFjaCBXZWJTb2NrZXQgb2JqZWN0IGhhcyBhbiBhc3NvY2lhdGVkIGJpbmFyeSB0eXBlLCB3aGljaCBpcyBhXG4gICAgLy8gQmluYXJ5VHlwZS4gSW5pdGlhbGx5IGl0IG11c3QgYmUgXCJibG9iXCIuXG4gICAgdGhpc1trQmluYXJ5VHlwZV0gPSAnYmxvYidcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtY2xvc2VcbiAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gcmVhc29uXG4gICAqL1xuICBjbG9zZSAoY29kZSA9IHVuZGVmaW5lZCwgcmVhc29uID0gdW5kZWZpbmVkKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29kZSA9IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBzaG9ydCddKGNvZGUsIHsgY2xhbXA6IHRydWUgfSlcbiAgICB9XG5cbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlYXNvbiA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhyZWFzb24pXG4gICAgfVxuXG4gICAgLy8gMS4gSWYgY29kZSBpcyBwcmVzZW50LCBidXQgaXMgbmVpdGhlciBhbiBpbnRlZ2VyIGVxdWFsIHRvIDEwMDAgbm9yIGFuXG4gICAgLy8gICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgMzAwMCB0byA0OTk5LCBpbmNsdXNpdmUsIHRocm93IGFuXG4gICAgLy8gICAgXCJJbnZhbGlkQWNjZXNzRXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvZGUgIT09IDEwMDAgJiYgKGNvZGUgPCAzMDAwIHx8IGNvZGUgPiA0OTk5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdpbnZhbGlkIGNvZGUnLCAnSW52YWxpZEFjY2Vzc0Vycm9yJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVhc29uQnl0ZUxlbmd0aCA9IDBcblxuICAgIC8vIDIuIElmIHJlYXNvbiBpcyBwcmVzZW50LCB0aGVuIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDEuIExldCByZWFzb25CeXRlcyBiZSB0aGUgcmVzdWx0IG9mIGVuY29kaW5nIHJlYXNvbi5cbiAgICAgIC8vIDIuIElmIHJlYXNvbkJ5dGVzIGlzIGxvbmdlciB0aGFuIDEyMyBieXRlcywgdGhlbiB0aHJvdyBhXG4gICAgICAvLyAgICBcIlN5bnRheEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgICAgcmVhc29uQnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHJlYXNvbilcblxuICAgICAgaWYgKHJlYXNvbkJ5dGVMZW5ndGggPiAxMjMpIHtcbiAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihcbiAgICAgICAgICBgUmVhc29uIG11c3QgYmUgbGVzcyB0aGFuIDEyMyBieXRlczsgcmVjZWl2ZWQgJHtyZWFzb25CeXRlTGVuZ3RofWAsXG4gICAgICAgICAgJ1N5bnRheEVycm9yJ1xuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gUnVuIHRoZSBmaXJzdCBtYXRjaGluZyBzdGVwcyBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDpcbiAgICBpZiAodGhpc1trUmVhZHlTdGF0ZV0gPT09IFdlYlNvY2tldC5DTE9TSU5HIHx8IHRoaXNba1JlYWR5U3RhdGVdID09PSBXZWJTb2NrZXQuQ0xPU0VEKSB7XG4gICAgICAvLyBJZiB0aGlzJ3MgcmVhZHkgc3RhdGUgaXMgQ0xPU0lORyAoMikgb3IgQ0xPU0VEICgzKVxuICAgICAgLy8gRG8gbm90aGluZy5cbiAgICB9IGVsc2UgaWYgKCFpc0VzdGFibGlzaGVkKHRoaXMpKSB7XG4gICAgICAvLyBJZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgbm90IHlldCBlc3RhYmxpc2hlZFxuICAgICAgLy8gRmFpbCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gYW5kIHNldCB0aGlzJ3MgcmVhZHkgc3RhdGVcbiAgICAgIC8vIHRvIENMT1NJTkcgKDIpLlxuICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcywgJ0Nvbm5lY3Rpb24gd2FzIGNsb3NlZCBiZWZvcmUgaXQgd2FzIGVzdGFibGlzaGVkLicpXG4gICAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IFdlYlNvY2tldC5DTE9TSU5HXG4gICAgfSBlbHNlIGlmICghaXNDbG9zaW5nKHRoaXMpKSB7XG4gICAgICAvLyBJZiB0aGUgV2ViU29ja2V0IGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZFxuICAgICAgLy8gU3RhcnQgdGhlIFdlYlNvY2tldCBjbG9zaW5nIGhhbmRzaGFrZSBhbmQgc2V0IHRoaXMncyByZWFkeVxuICAgICAgLy8gc3RhdGUgdG8gQ0xPU0lORyAoMikuXG4gICAgICAvLyAtIElmIG5laXRoZXIgY29kZSBub3IgcmVhc29uIGlzIHByZXNlbnQsIHRoZSBXZWJTb2NrZXQgQ2xvc2VcbiAgICAgIC8vICAgbWVzc2FnZSBtdXN0IG5vdCBoYXZlIGEgYm9keS5cbiAgICAgIC8vIC0gSWYgY29kZSBpcyBwcmVzZW50LCB0aGVuIHRoZSBzdGF0dXMgY29kZSB0byB1c2UgaW4gdGhlXG4gICAgICAvLyAgIFdlYlNvY2tldCBDbG9zZSBtZXNzYWdlIG11c3QgYmUgdGhlIGludGVnZXIgZ2l2ZW4gYnkgY29kZS5cbiAgICAgIC8vIC0gSWYgcmVhc29uIGlzIGFsc28gcHJlc2VudCwgdGhlbiByZWFzb25CeXRlcyBtdXN0IGJlXG4gICAgICAvLyAgIHByb3ZpZGVkIGluIHRoZSBDbG9zZSBtZXNzYWdlIGFmdGVyIHRoZSBzdGF0dXMgY29kZS5cblxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKClcblxuICAgICAgLy8gSWYgbmVpdGhlciBjb2RlIG5vciByZWFzb24gaXMgcHJlc2VudCwgdGhlIFdlYlNvY2tldCBDbG9zZVxuICAgICAgLy8gbWVzc2FnZSBtdXN0IG5vdCBoYXZlIGEgYm9keS5cblxuICAgICAgLy8gSWYgY29kZSBpcyBwcmVzZW50LCB0aGVuIHRoZSBzdGF0dXMgY29kZSB0byB1c2UgaW4gdGhlXG4gICAgICAvLyBXZWJTb2NrZXQgQ2xvc2UgbWVzc2FnZSBtdXN0IGJlIHRoZSBpbnRlZ2VyIGdpdmVuIGJ5IGNvZGUuXG4gICAgICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkICYmIHJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZyYW1lLmZyYW1lRGF0YSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGVVSW50MTZCRShjb2RlLCAwKVxuICAgICAgfSBlbHNlIGlmIChjb2RlICE9PSB1bmRlZmluZWQgJiYgcmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gSWYgcmVhc29uIGlzIGFsc28gcHJlc2VudCwgdGhlbiByZWFzb25CeXRlcyBtdXN0IGJlXG4gICAgICAgIC8vIHByb3ZpZGVkIGluIHRoZSBDbG9zZSBtZXNzYWdlIGFmdGVyIHRoZSBzdGF0dXMgY29kZS5cbiAgICAgICAgZnJhbWUuZnJhbWVEYXRhID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIgKyByZWFzb25CeXRlTGVuZ3RoKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGVVSW50MTZCRShjb2RlLCAwKVxuICAgICAgICAvLyB0aGUgYm9keSBNQVkgY29udGFpbiBVVEYtOC1lbmNvZGVkIGRhdGEgd2l0aCB2YWx1ZSAvcmVhc29uL1xuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGUocmVhc29uLCAyLCAndXRmLTgnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnJhbWUuZnJhbWVEYXRhID0gZW1wdHlCdWZmZXJcbiAgICAgIH1cblxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbScpLkR1cGxleH0gKi9cbiAgICAgIGNvbnN0IHNvY2tldCA9IHRoaXNba1Jlc3BvbnNlXS5zb2NrZXRcblxuICAgICAgc29ja2V0LndyaXRlKGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuQ0xPU0UpLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgdGhpc1trU2VudENsb3NlXSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gVXBvbiBlaXRoZXIgc2VuZGluZyBvciByZWNlaXZpbmcgYSBDbG9zZSBjb250cm9sIGZyYW1lLCBpdCBpcyBzYWlkXG4gICAgICAvLyB0aGF0IF9UaGUgV2ViU29ja2V0IENsb3NpbmcgSGFuZHNoYWtlIGlzIFN0YXJ0ZWRfIGFuZCB0aGF0IHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgaW4gdGhlIENMT1NJTkcgc3RhdGUuXG4gICAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IHN0YXRlcy5DTE9TSU5HXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgLy8gU2V0IHRoaXMncyByZWFkeSBzdGF0ZSB0byBDTE9TSU5HICgyKS5cbiAgICAgIHRoaXNba1JlYWR5U3RhdGVdID0gV2ViU29ja2V0LkNMT1NJTkdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LXNlbmRcbiAgICogQHBhcmFtIHtOb2RlSlMuVHlwZWRBcnJheXxBcnJheUJ1ZmZlcnxCbG9ifHN0cmluZ30gZGF0YVxuICAgKi9cbiAgc2VuZCAoZGF0YSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdXZWJTb2NrZXQuc2VuZCcgfSlcblxuICAgIGRhdGEgPSB3ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRTZW5kRGF0YShkYXRhKVxuXG4gICAgLy8gMS4gSWYgdGhpcydzIHJlYWR5IHN0YXRlIGlzIENPTk5FQ1RJTkcsIHRoZW4gdGhyb3cgYW5cbiAgICAvLyAgICBcIkludmFsaWRTdGF0ZUVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgIGlmICh0aGlzW2tSZWFkeVN0YXRlXSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ1NlbnQgYmVmb3JlIGNvbm5lY3RlZC4nLCAnSW52YWxpZFN0YXRlRXJyb3InKVxuICAgIH1cblxuICAgIC8vIDIuIFJ1biB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHN0ZXBzIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OlxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTYuMVxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTUuMlxuXG4gICAgaWYgKCFpc0VzdGFibGlzaGVkKHRoaXMpIHx8IGlzQ2xvc2luZyh0aGlzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbScpLkR1cGxleH0gKi9cbiAgICBjb25zdCBzb2NrZXQgPSB0aGlzW2tSZXNwb25zZV0uc29ja2V0XG5cbiAgICAvLyBJZiBkYXRhIGlzIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIGFuZCB0aGUgV2ViU29ja2V0XG4gICAgICAvLyBjbG9zaW5nIGhhbmRzaGFrZSBoYXMgbm90IHlldCBzdGFydGVkLCB0aGVuIHRoZSB1c2VyIGFnZW50XG4gICAgICAvLyBtdXN0IHNlbmQgYSBXZWJTb2NrZXQgTWVzc2FnZSBjb21wcmlzZWQgb2YgdGhlIGRhdGEgYXJndW1lbnRcbiAgICAgIC8vIHVzaW5nIGEgdGV4dCBmcmFtZSBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuXG4gICAgICAvLyBiZWNhdXNlIGl0IHdvdWxkIG5lZWQgdG8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCxcbiAgICAgIC8vIHRoZSB1c2VyIGFnZW50IG11c3QgZmxhZyB0aGUgV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2VcbiAgICAgIC8vIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi4gQW55IGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhXG4gICAgICAvLyBzdHJpbmcgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdCBpbmNyZWFzZVxuICAgICAgLy8gdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0b1xuICAgICAgLy8gZXhwcmVzcyB0aGUgYXJndW1lbnQgYXMgVVRGLTguXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmZyb20oZGF0YSlcbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCh2YWx1ZSlcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuVEVYVClcblxuICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgKz0gdmFsdWUuYnl0ZUxlbmd0aFxuICAgICAgc29ja2V0LndyaXRlKGJ1ZmZlciwgKCkgPT4ge1xuICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCAtPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAodHlwZXMuaXNBcnJheUJ1ZmZlcihkYXRhKSkge1xuICAgICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBhbmQgdGhlIFdlYlNvY2tldFxuICAgICAgLy8gY2xvc2luZyBoYW5kc2hha2UgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgdGhlbiB0aGUgdXNlciBhZ2VudCBtdXN0XG4gICAgICAvLyBzZW5kIGEgV2ViU29ja2V0IE1lc3NhZ2UgY29tcHJpc2VkIG9mIGRhdGEgdXNpbmcgYSBiaW5hcnkgZnJhbWVcbiAgICAgIC8vIG9wY29kZTsgaWYgdGhlIGRhdGEgY2Fubm90IGJlIHNlbnQsIGUuZy4gYmVjYXVzZSBpdCB3b3VsZCBuZWVkXG4gICAgICAvLyB0byBiZSBidWZmZXJlZCBidXQgdGhlIGJ1ZmZlciBpcyBmdWxsLCB0aGUgdXNlciBhZ2VudCBtdXN0IGZsYWdcbiAgICAgIC8vIHRoZSBXZWJTb2NrZXQgYXMgZnVsbCBhbmQgdGhlbiBjbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICAvLyBUaGUgZGF0YSB0byBiZSBzZW50IGlzIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgYnVmZmVyIGRlc2NyaWJlZFxuICAgICAgLy8gYnkgdGhlIEFycmF5QnVmZmVyIG9iamVjdC4gQW55IGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhblxuICAgICAgLy8gQXJyYXlCdWZmZXIgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdFxuICAgICAgLy8gaW5jcmVhc2UgdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgbGVuZ3RoIG9mIHRoZVxuICAgICAgLy8gQXJyYXlCdWZmZXIgaW4gYnl0ZXMuXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmZyb20oZGF0YSlcbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCh2YWx1ZSlcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuQklOQVJZKVxuXG4gICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCArPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICBzb2NrZXQud3JpdGUoYnVmZmVyLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50IC09IHZhbHVlLmJ5dGVMZW5ndGhcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSkpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYW5kIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vIGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHRoZW4gdGhlIHVzZXIgYWdlbnQgbXVzdFxuICAgICAgLy8gc2VuZCBhIFdlYlNvY2tldCBNZXNzYWdlIGNvbXByaXNlZCBvZiBkYXRhIHVzaW5nIGEgYmluYXJ5IGZyYW1lXG4gICAgICAvLyBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuIGJlY2F1c2UgaXQgd291bGQgbmVlZCB0b1xuICAgICAgLy8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIHVzZXIgYWdlbnQgbXVzdCBmbGFnIHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBUaGVcbiAgICAgIC8vIGRhdGEgdG8gYmUgc2VudCBpcyB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIHNlY3Rpb24gb2YgdGhlIGJ1ZmZlclxuICAgICAgLy8gZGVzY3JpYmVkIGJ5IHRoZSBBcnJheUJ1ZmZlciBvYmplY3QgdGhhdCBkYXRhIHJlZmVyZW5jZXMuIEFueVxuICAgICAgLy8gaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aXRoIHRoaXMga2luZCBvZiBhcmd1bWVudCB0aGF0IGRvZXNcbiAgICAgIC8vIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdCBpbmNyZWFzZSB0aGUgYnVmZmVyZWRBbW91bnQgYXR0cmlidXRlXG4gICAgICAvLyBieSB0aGUgbGVuZ3RoIG9mIGRhdGHigJlzIGJ1ZmZlciBpbiBieXRlcy5cblxuICAgICAgY29uc3QgYWIgPSBCdWZmZXIuZnJvbShkYXRhLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEuYnl0ZUxlbmd0aClcblxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKGFiKVxuICAgICAgY29uc3QgYnVmZmVyID0gZnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5CSU5BUlkpXG5cbiAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50ICs9IGFiLmJ5dGVMZW5ndGhcbiAgICAgIHNvY2tldC53cml0ZShidWZmZXIsICgpID0+IHtcbiAgICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgLT0gYWIuYnl0ZUxlbmd0aFxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UoZGF0YSkpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYW5kIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vIGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHRoZW4gdGhlIHVzZXIgYWdlbnQgbXVzdFxuICAgICAgLy8gc2VuZCBhIFdlYlNvY2tldCBNZXNzYWdlIGNvbXByaXNlZCBvZiBkYXRhIHVzaW5nIGEgYmluYXJ5IGZyYW1lXG4gICAgICAvLyBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuIGJlY2F1c2UgaXQgd291bGQgbmVlZCB0b1xuICAgICAgLy8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIHVzZXIgYWdlbnQgbXVzdCBmbGFnIHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBUaGUgZGF0YVxuICAgICAgLy8gdG8gYmUgc2VudCBpcyB0aGUgcmF3IGRhdGEgcmVwcmVzZW50ZWQgYnkgdGhlIEJsb2Igb2JqZWN0LiBBbnlcbiAgICAgIC8vIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhIEJsb2IgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvd1xuICAgICAgLy8gYW4gZXhjZXB0aW9uIG11c3QgaW5jcmVhc2UgdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgc2l6ZVxuICAgICAgLy8gb2YgdGhlIEJsb2Igb2JqZWN04oCZcyByYXcgZGF0YSwgaW4gYnl0ZXMuXG5cbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCgpXG5cbiAgICAgIGRhdGEuYXJyYXlCdWZmZXIoKS50aGVuKChhYikgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IEJ1ZmZlci5mcm9tKGFiKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEgPSB2YWx1ZVxuICAgICAgICBjb25zdCBidWZmZXIgPSBmcmFtZS5jcmVhdGVGcmFtZShvcGNvZGVzLkJJTkFSWSlcblxuICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCArPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICAgIHNvY2tldC53cml0ZShidWZmZXIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCAtPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldCByZWFkeVN0YXRlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICAvLyBUaGUgcmVhZHlTdGF0ZSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlzJ3MgcmVhZHkgc3RhdGUuXG4gICAgcmV0dXJuIHRoaXNba1JlYWR5U3RhdGVdXG4gIH1cblxuICBnZXQgYnVmZmVyZWRBbW91bnQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNidWZmZXJlZEFtb3VudFxuICB9XG5cbiAgZ2V0IHVybCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgLy8gVGhlIHVybCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlzJ3MgdXJsLCBzZXJpYWxpemVkLlxuICAgIHJldHVybiBVUkxTZXJpYWxpemVyKHRoaXNba1dlYlNvY2tldFVSTF0pXG4gIH1cblxuICBnZXQgZXh0ZW5zaW9ucyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V4dGVuc2lvbnNcbiAgfVxuXG4gIGdldCBwcm90b2NvbCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI3Byb3RvY29sXG4gIH1cblxuICBnZXQgb25vcGVuICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLm9wZW5cbiAgfVxuXG4gIHNldCBvbm9wZW4gKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKHRoaXMuI2V2ZW50cy5vcGVuKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29wZW4nLCB0aGlzLiNldmVudHMub3BlbilcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNldmVudHMub3BlbiA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLm9wZW4gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uZXJyb3IgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNldmVudHMuZXJyb3JcbiAgfVxuXG4gIHNldCBvbmVycm9yIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIGlmICh0aGlzLiNldmVudHMuZXJyb3IpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLiNldmVudHMuZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy4jZXZlbnRzLmVycm9yID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLmVycm9yID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmNsb3NlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLmNsb3NlXG4gIH1cblxuICBzZXQgb25jbG9zZSAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodGhpcy4jZXZlbnRzLmNsb3NlKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy4jZXZlbnRzLmNsb3NlKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5jbG9zZSA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5jbG9zZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25tZXNzYWdlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLm1lc3NhZ2VcbiAgfVxuXG4gIHNldCBvbm1lc3NhZ2UgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKHRoaXMuI2V2ZW50cy5tZXNzYWdlKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLiNldmVudHMubWVzc2FnZSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNldmVudHMubWVzc2FnZSA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLm1lc3NhZ2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IGJpbmFyeVR5cGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzW2tCaW5hcnlUeXBlXVxuICB9XG5cbiAgc2V0IGJpbmFyeVR5cGUgKHR5cGUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodHlwZSAhPT0gJ2Jsb2InICYmIHR5cGUgIT09ICdhcnJheWJ1ZmZlcicpIHtcbiAgICAgIHRoaXNba0JpbmFyeVR5cGVdID0gJ2Jsb2InXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0JpbmFyeVR5cGVdID0gdHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2ZlZWRiYWNrLWZyb20tdGhlLXByb3RvY29sXG4gICAqL1xuICAjb25Db25uZWN0aW9uRXN0YWJsaXNoZWQgKHJlc3BvbnNlKSB7XG4gICAgLy8gcHJvY2Vzc1Jlc3BvbnNlIGlzIGNhbGxlZCB3aGVuIHRoZSBcInJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdCBoYXMgYmVlbiByZWNlaXZlZCBhbmQgaW5pdGlhbGl6ZWQuXCJcbiAgICAvLyBvbmNlIHRoaXMgaGFwcGVucywgdGhlIGNvbm5lY3Rpb24gaXMgb3BlblxuICAgIHRoaXNba1Jlc3BvbnNlXSA9IHJlc3BvbnNlXG5cbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgQnl0ZVBhcnNlcih0aGlzKVxuICAgIHBhcnNlci5vbignZHJhaW4nLCBmdW5jdGlvbiBvblBhcnNlckRyYWluICgpIHtcbiAgICAgIHRoaXMud3Nba1Jlc3BvbnNlXS5zb2NrZXQucmVzdW1lKClcbiAgICB9KVxuXG4gICAgcmVzcG9uc2Uuc29ja2V0LndzID0gdGhpc1xuICAgIHRoaXNba0J5dGVQYXJzZXJdID0gcGFyc2VyXG5cbiAgICAvLyAxLiBDaGFuZ2UgdGhlIHJlYWR5IHN0YXRlIHRvIE9QRU4gKDEpLlxuICAgIHRoaXNba1JlYWR5U3RhdGVdID0gc3RhdGVzLk9QRU5cblxuICAgIC8vIDIuIENoYW5nZSB0aGUgZXh0ZW5zaW9ucyBhdHRyaWJ1dGXigJlzIHZhbHVlIHRvIHRoZSBleHRlbnNpb25zIGluIHVzZSwgaWZcbiAgICAvLyAgICBpdCBpcyBub3QgdGhlIG51bGwgdmFsdWUuXG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tOS4xXG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnc2VjLXdlYnNvY2tldC1leHRlbnNpb25zJylcblxuICAgIGlmIChleHRlbnNpb25zICE9PSBudWxsKSB7XG4gICAgICB0aGlzLiNleHRlbnNpb25zID0gZXh0ZW5zaW9uc1xuICAgIH1cblxuICAgIC8vIDMuIENoYW5nZSB0aGUgcHJvdG9jb2wgYXR0cmlidXRl4oCZcyB2YWx1ZSB0byB0aGUgc3VicHJvdG9jb2wgaW4gdXNlLCBpZlxuICAgIC8vICAgIGl0IGlzIG5vdCB0aGUgbnVsbCB2YWx1ZS5cbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi0xLjlcbiAgICBjb25zdCBwcm90b2NvbCA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnc2VjLXdlYnNvY2tldC1wcm90b2NvbCcpXG5cbiAgICBpZiAocHJvdG9jb2wgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuI3Byb3RvY29sID0gcHJvdG9jb2xcbiAgICB9XG5cbiAgICAvLyA0LiBGaXJlIGFuIGV2ZW50IG5hbWVkIG9wZW4gYXQgdGhlIFdlYlNvY2tldCBvYmplY3QuXG4gICAgZmlyZUV2ZW50KCdvcGVuJywgdGhpcylcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LWNvbm5lY3RpbmdcbldlYlNvY2tldC5DT05ORUNUSU5HID0gV2ViU29ja2V0LnByb3RvdHlwZS5DT05ORUNUSU5HID0gc3RhdGVzLkNPTk5FQ1RJTkdcbi8vIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtb3BlblxuV2ViU29ja2V0Lk9QRU4gPSBXZWJTb2NrZXQucHJvdG90eXBlLk9QRU4gPSBzdGF0ZXMuT1BFTlxuLy8gaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZG9tLXdlYnNvY2tldC1jbG9zaW5nXG5XZWJTb2NrZXQuQ0xPU0lORyA9IFdlYlNvY2tldC5wcm90b3R5cGUuQ0xPU0lORyA9IHN0YXRlcy5DTE9TSU5HXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LWNsb3NlZFxuV2ViU29ja2V0LkNMT1NFRCA9IFdlYlNvY2tldC5wcm90b3R5cGUuQ0xPU0VEID0gc3RhdGVzLkNMT1NFRFxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZWJTb2NrZXQucHJvdG90eXBlLCB7XG4gIENPTk5FQ1RJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIE9QRU46IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIENMT1NJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIENMT1NFRDogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgdXJsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkeVN0YXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBidWZmZXJlZEFtb3VudDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25vcGVuOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmNsb3NlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjbG9zZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25tZXNzYWdlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBiaW5hcnlUeXBlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBleHRlbnNpb25zOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBwcm90b2NvbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ1dlYlNvY2tldCcsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZWJTb2NrZXQsIHtcbiAgQ09OTkVDVElORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgT1BFTjogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0lORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0VEOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzXG59KVxuXG53ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8RE9NU3RyaW5nPiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmdcbilcblxud2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+J10gPSBmdW5jdGlvbiAoVikge1xuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSA9PT0gJ09iamVjdCcgJiYgU3ltYm9sLml0ZXJhdG9yIGluIFYpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPERPTVN0cmluZz4nXShWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxufVxuXG4vLyBUaGlzIGltcGxlbWVudHMgdGhlIHByb3BzYWwgbWFkZSBpbiBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL3dlYnNvY2tldHMvaXNzdWVzLzQyXG53ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAncHJvdG9jb2xzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPiddLFxuICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hlcicsXG4gICAgY29udmVydGVyOiAoVikgPT4gVixcbiAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgIHJldHVybiBnZXRHbG9iYWxEaXNwYXRjaGVyKClcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdoZWFkZXJzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5IZWFkZXJzSW5pdClcbiAgfVxuXSlcblxud2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+IG9yIFdlYlNvY2tldEluaXQnXSA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpID09PSAnT2JqZWN0JyAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiBWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRJbml0KFYpXG4gIH1cblxuICByZXR1cm4geyBwcm90b2NvbHM6IHdlYmlkbC5jb252ZXJ0ZXJzWydET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPiddKFYpIH1cbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuV2ViU29ja2V0U2VuZERhdGEgPSBmdW5jdGlvbiAoVikge1xuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSA9PT0gJ09iamVjdCcpIHtcbiAgICBpZiAoaXNCbG9iTGlrZShWKSkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoViwgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgfVxuXG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhWKSB8fCB0eXBlcy5pc0FueUFycmF5QnVmZmVyKFYpKSB7XG4gICAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQnVmZmVyU291cmNlKFYpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhWKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgV2ViU29ja2V0XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBDbGllbnQgPSByZXF1aXJlKCcuL2xpYi9jbGllbnQnKVxuY29uc3QgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4vbGliL2Rpc3BhdGNoZXInKVxuY29uc3QgZXJyb3JzID0gcmVxdWlyZSgnLi9saWIvY29yZS9lcnJvcnMnKVxuY29uc3QgUG9vbCA9IHJlcXVpcmUoJy4vbGliL3Bvb2wnKVxuY29uc3QgQmFsYW5jZWRQb29sID0gcmVxdWlyZSgnLi9saWIvYmFsYW5jZWQtcG9vbCcpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4vbGliL2FnZW50JylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuL2xpYi9jb3JlL3V0aWwnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gZXJyb3JzXG5jb25zdCBhcGkgPSByZXF1aXJlKCcuL2xpYi9hcGknKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuL2xpYi9jb3JlL2Nvbm5lY3QnKVxuY29uc3QgTW9ja0NsaWVudCA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1jbGllbnQnKVxuY29uc3QgTW9ja0FnZW50ID0gcmVxdWlyZSgnLi9saWIvbW9jay9tb2NrLWFnZW50JylcbmNvbnN0IE1vY2tQb29sID0gcmVxdWlyZSgnLi9saWIvbW9jay9tb2NrLXBvb2wnKVxuY29uc3QgbW9ja0Vycm9ycyA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1lcnJvcnMnKVxuY29uc3QgUHJveHlBZ2VudCA9IHJlcXVpcmUoJy4vbGliL3Byb3h5LWFnZW50JylcbmNvbnN0IFJldHJ5SGFuZGxlciA9IHJlcXVpcmUoJy4vbGliL2hhbmRsZXIvUmV0cnlIYW5kbGVyJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciwgc2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi9saWIvZ2xvYmFsJylcbmNvbnN0IERlY29yYXRvckhhbmRsZXIgPSByZXF1aXJlKCcuL2xpYi9oYW5kbGVyL0RlY29yYXRvckhhbmRsZXInKVxuY29uc3QgUmVkaXJlY3RIYW5kbGVyID0gcmVxdWlyZSgnLi9saWIvaGFuZGxlci9SZWRpcmVjdEhhbmRsZXInKVxuY29uc3QgY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvciA9IHJlcXVpcmUoJy4vbGliL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3InKVxuXG5sZXQgaGFzQ3J5cHRvXG50cnkge1xuICByZXF1aXJlKCdjcnlwdG8nKVxuICBoYXNDcnlwdG8gPSB0cnVlXG59IGNhdGNoIHtcbiAgaGFzQ3J5cHRvID0gZmFsc2Vcbn1cblxuT2JqZWN0LmFzc2lnbihEaXNwYXRjaGVyLnByb3RvdHlwZSwgYXBpKVxuXG5tb2R1bGUuZXhwb3J0cy5EaXNwYXRjaGVyID0gRGlzcGF0Y2hlclxubW9kdWxlLmV4cG9ydHMuQ2xpZW50ID0gQ2xpZW50XG5tb2R1bGUuZXhwb3J0cy5Qb29sID0gUG9vbFxubW9kdWxlLmV4cG9ydHMuQmFsYW5jZWRQb29sID0gQmFsYW5jZWRQb29sXG5tb2R1bGUuZXhwb3J0cy5BZ2VudCA9IEFnZW50XG5tb2R1bGUuZXhwb3J0cy5Qcm94eUFnZW50ID0gUHJveHlBZ2VudFxubW9kdWxlLmV4cG9ydHMuUmV0cnlIYW5kbGVyID0gUmV0cnlIYW5kbGVyXG5cbm1vZHVsZS5leHBvcnRzLkRlY29yYXRvckhhbmRsZXIgPSBEZWNvcmF0b3JIYW5kbGVyXG5tb2R1bGUuZXhwb3J0cy5SZWRpcmVjdEhhbmRsZXIgPSBSZWRpcmVjdEhhbmRsZXJcbm1vZHVsZS5leHBvcnRzLmNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yXG5cbm1vZHVsZS5leHBvcnRzLmJ1aWxkQ29ubmVjdG9yID0gYnVpbGRDb25uZWN0b3Jcbm1vZHVsZS5leHBvcnRzLmVycm9ycyA9IGVycm9yc1xuXG5mdW5jdGlvbiBtYWtlRGlzcGF0Y2hlciAoZm4pIHtcbiAgcmV0dXJuICh1cmwsIG9wdHMsIGhhbmRsZXIpID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGhhbmRsZXIgPSBvcHRzXG4gICAgICBvcHRzID0gbnVsbFxuICAgIH1cblxuICAgIGlmICghdXJsIHx8ICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdXJsICE9PSAnb2JqZWN0JyAmJiAhKHVybCBpbnN0YW5jZW9mIFVSTCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgdXJsJylcbiAgICB9XG5cbiAgICBpZiAob3B0cyAhPSBudWxsICYmIHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmIChvcHRzICYmIG9wdHMucGF0aCAhPSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMucGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMucGF0aCcpXG4gICAgICB9XG5cbiAgICAgIGxldCBwYXRoID0gb3B0cy5wYXRoXG4gICAgICBpZiAoIW9wdHMucGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcGF0aCA9IGAvJHtwYXRofWBcbiAgICAgIH1cblxuICAgICAgdXJsID0gbmV3IFVSTCh1dGlsLnBhcnNlT3JpZ2luKHVybCkub3JpZ2luICsgcGF0aClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIG9wdHMgPSB0eXBlb2YgdXJsID09PSAnb2JqZWN0JyA/IHVybCA6IHt9XG4gICAgICB9XG5cbiAgICAgIHVybCA9IHV0aWwucGFyc2VVUkwodXJsKVxuICAgIH1cblxuICAgIGNvbnN0IHsgYWdlbnQsIGRpc3BhdGNoZXIgPSBnZXRHbG9iYWxEaXNwYXRjaGVyKCkgfSA9IG9wdHNcblxuICAgIGlmIChhZ2VudCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCBvcHRzLmFnZW50LiBEaWQgeW91IG1lYW4gb3B0cy5jbGllbnQ/JylcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uY2FsbChkaXNwYXRjaGVyLCB7XG4gICAgICAuLi5vcHRzLFxuICAgICAgb3JpZ2luOiB1cmwub3JpZ2luLFxuICAgICAgcGF0aDogdXJsLnNlYXJjaCA/IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9YCA6IHVybC5wYXRobmFtZSxcbiAgICAgIG1ldGhvZDogb3B0cy5tZXRob2QgfHwgKG9wdHMuYm9keSA/ICdQVVQnIDogJ0dFVCcpXG4gICAgfSwgaGFuZGxlcilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5zZXRHbG9iYWxEaXNwYXRjaGVyID0gc2V0R2xvYmFsRGlzcGF0Y2hlclxubW9kdWxlLmV4cG9ydHMuZ2V0R2xvYmFsRGlzcGF0Y2hlciA9IGdldEdsb2JhbERpc3BhdGNoZXJcblxuaWYgKHV0aWwubm9kZU1ham9yID4gMTYgfHwgKHV0aWwubm9kZU1ham9yID09PSAxNiAmJiB1dGlsLm5vZGVNaW5vciA+PSA4KSkge1xuICBsZXQgZmV0Y2hJbXBsID0gbnVsbFxuICBtb2R1bGUuZXhwb3J0cy5mZXRjaCA9IGFzeW5jIGZ1bmN0aW9uIGZldGNoIChyZXNvdXJjZSkge1xuICAgIGlmICghZmV0Y2hJbXBsKSB7XG4gICAgICBmZXRjaEltcGwgPSByZXF1aXJlKCcuL2xpYi9mZXRjaCcpLmZldGNoXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmZXRjaEltcGwoLi4uYXJndW1lbnRzKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgdGhpcylcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG4gIG1vZHVsZS5leHBvcnRzLkhlYWRlcnMgPSByZXF1aXJlKCcuL2xpYi9mZXRjaC9oZWFkZXJzJykuSGVhZGVyc1xuICBtb2R1bGUuZXhwb3J0cy5SZXNwb25zZSA9IHJlcXVpcmUoJy4vbGliL2ZldGNoL3Jlc3BvbnNlJykuUmVzcG9uc2VcbiAgbW9kdWxlLmV4cG9ydHMuUmVxdWVzdCA9IHJlcXVpcmUoJy4vbGliL2ZldGNoL3JlcXVlc3QnKS5SZXF1ZXN0XG4gIG1vZHVsZS5leHBvcnRzLkZvcm1EYXRhID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZm9ybWRhdGEnKS5Gb3JtRGF0YVxuICBtb2R1bGUuZXhwb3J0cy5GaWxlID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZmlsZScpLkZpbGVcbiAgbW9kdWxlLmV4cG9ydHMuRmlsZVJlYWRlciA9IHJlcXVpcmUoJy4vbGliL2ZpbGVhcGkvZmlsZXJlYWRlcicpLkZpbGVSZWFkZXJcblxuICBjb25zdCB7IHNldEdsb2JhbE9yaWdpbiwgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2xpYi9mZXRjaC9nbG9iYWwnKVxuXG4gIG1vZHVsZS5leHBvcnRzLnNldEdsb2JhbE9yaWdpbiA9IHNldEdsb2JhbE9yaWdpblxuICBtb2R1bGUuZXhwb3J0cy5nZXRHbG9iYWxPcmlnaW4gPSBnZXRHbG9iYWxPcmlnaW5cblxuICBjb25zdCB7IENhY2hlU3RvcmFnZSB9ID0gcmVxdWlyZSgnLi9saWIvY2FjaGUvY2FjaGVzdG9yYWdlJylcbiAgY29uc3QgeyBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuL2xpYi9jYWNoZS9zeW1ib2xzJylcblxuICAvLyBDYWNoZSAmIENhY2hlU3RvcmFnZSBhcmUgdGlnaHRseSBjb3VwbGVkIHdpdGggZmV0Y2guIEV2ZW4gaWYgaXQgbWF5IHJ1blxuICAvLyBpbiBhbiBvbGRlciB2ZXJzaW9uIG9mIE5vZGUsIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgdXNlIHdpdGhvdXQgZmV0Y2guXG4gIG1vZHVsZS5leHBvcnRzLmNhY2hlcyA9IG5ldyBDYWNoZVN0b3JhZ2Uoa0NvbnN0cnVjdClcbn1cblxuaWYgKHV0aWwubm9kZU1ham9yID49IDE2KSB7XG4gIGNvbnN0IHsgZGVsZXRlQ29va2llLCBnZXRDb29raWVzLCBnZXRTZXRDb29raWVzLCBzZXRDb29raWUgfSA9IHJlcXVpcmUoJy4vbGliL2Nvb2tpZXMnKVxuXG4gIG1vZHVsZS5leHBvcnRzLmRlbGV0ZUNvb2tpZSA9IGRlbGV0ZUNvb2tpZVxuICBtb2R1bGUuZXhwb3J0cy5nZXRDb29raWVzID0gZ2V0Q29va2llc1xuICBtb2R1bGUuZXhwb3J0cy5nZXRTZXRDb29raWVzID0gZ2V0U2V0Q29va2llc1xuICBtb2R1bGUuZXhwb3J0cy5zZXRDb29raWUgPSBzZXRDb29raWVcblxuICBjb25zdCB7IHBhcnNlTUlNRVR5cGUsIHNlcmlhbGl6ZUFNaW1lVHlwZSB9ID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZGF0YVVSTCcpXG5cbiAgbW9kdWxlLmV4cG9ydHMucGFyc2VNSU1FVHlwZSA9IHBhcnNlTUlNRVR5cGVcbiAgbW9kdWxlLmV4cG9ydHMuc2VyaWFsaXplQU1pbWVUeXBlID0gc2VyaWFsaXplQU1pbWVUeXBlXG59XG5cbmlmICh1dGlsLm5vZGVNYWpvciA+PSAxOCAmJiBoYXNDcnlwdG8pIHtcbiAgY29uc3QgeyBXZWJTb2NrZXQgfSA9IHJlcXVpcmUoJy4vbGliL3dlYnNvY2tldC93ZWJzb2NrZXQnKVxuXG4gIG1vZHVsZS5leHBvcnRzLldlYlNvY2tldCA9IFdlYlNvY2tldFxufVxuXG5tb2R1bGUuZXhwb3J0cy5yZXF1ZXN0ID0gbWFrZURpc3BhdGNoZXIoYXBpLnJlcXVlc3QpXG5tb2R1bGUuZXhwb3J0cy5zdHJlYW0gPSBtYWtlRGlzcGF0Y2hlcihhcGkuc3RyZWFtKVxubW9kdWxlLmV4cG9ydHMucGlwZWxpbmUgPSBtYWtlRGlzcGF0Y2hlcihhcGkucGlwZWxpbmUpXG5tb2R1bGUuZXhwb3J0cy5jb25uZWN0ID0gbWFrZURpc3BhdGNoZXIoYXBpLmNvbm5lY3QpXG5tb2R1bGUuZXhwb3J0cy51cGdyYWRlID0gbWFrZURpc3BhdGNoZXIoYXBpLnVwZ3JhZGUpXG5cbm1vZHVsZS5leHBvcnRzLk1vY2tDbGllbnQgPSBNb2NrQ2xpZW50XG5tb2R1bGUuZXhwb3J0cy5Nb2NrUG9vbCA9IE1vY2tQb29sXG5tb2R1bGUuZXhwb3J0cy5Nb2NrQWdlbnQgPSBNb2NrQWdlbnRcbm1vZHVsZS5leHBvcnRzLm1vY2tFcnJvcnMgPSBtb2NrRXJyb3JzXG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cENsaWVudCA9IGV4cG9ydHMuaXNIdHRwcyA9IGV4cG9ydHMuSHR0cENsaWVudFJlc3BvbnNlID0gZXhwb3J0cy5IdHRwQ2xpZW50RXJyb3IgPSBleHBvcnRzLmdldFByb3h5VXJsID0gZXhwb3J0cy5NZWRpYVR5cGVzID0gZXhwb3J0cy5IZWFkZXJzID0gZXhwb3J0cy5IdHRwQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBodHRwID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwXCIpKTtcbmNvbnN0IGh0dHBzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwc1wiKSk7XG5jb25zdCBwbSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wcm94eVwiKSk7XG5jb25zdCB0dW5uZWwgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInR1bm5lbFwiKSk7XG5jb25zdCB1bmRpY2lfMSA9IHJlcXVpcmUoXCJ1bmRpY2lcIik7XG52YXIgSHR0cENvZGVzO1xuKGZ1bmN0aW9uIChIdHRwQ29kZXMpIHtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiT0tcIl0gPSAyMDBdID0gXCJPS1wiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJNdWx0aXBsZUNob2ljZXNcIl0gPSAzMDBdID0gXCJNdWx0aXBsZUNob2ljZXNcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiTW92ZWRQZXJtYW5lbnRseVwiXSA9IDMwMV0gPSBcIk1vdmVkUGVybWFuZW50bHlcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUmVzb3VyY2VNb3ZlZFwiXSA9IDMwMl0gPSBcIlJlc291cmNlTW92ZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiU2VlT3RoZXJcIl0gPSAzMDNdID0gXCJTZWVPdGhlclwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RNb2RpZmllZFwiXSA9IDMwNF0gPSBcIk5vdE1vZGlmaWVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlVzZVByb3h5XCJdID0gMzA1XSA9IFwiVXNlUHJveHlcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiU3dpdGNoUHJveHlcIl0gPSAzMDZdID0gXCJTd2l0Y2hQcm94eVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJUZW1wb3JhcnlSZWRpcmVjdFwiXSA9IDMwN10gPSBcIlRlbXBvcmFyeVJlZGlyZWN0XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlBlcm1hbmVudFJlZGlyZWN0XCJdID0gMzA4XSA9IFwiUGVybWFuZW50UmVkaXJlY3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiQmFkUmVxdWVzdFwiXSA9IDQwMF0gPSBcIkJhZFJlcXVlc3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiVW5hdXRob3JpemVkXCJdID0gNDAxXSA9IFwiVW5hdXRob3JpemVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlBheW1lbnRSZXF1aXJlZFwiXSA9IDQwMl0gPSBcIlBheW1lbnRSZXF1aXJlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJGb3JiaWRkZW5cIl0gPSA0MDNdID0gXCJGb3JiaWRkZW5cIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiTm90Rm91bmRcIl0gPSA0MDRdID0gXCJOb3RGb3VuZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJNZXRob2ROb3RBbGxvd2VkXCJdID0gNDA1XSA9IFwiTWV0aG9kTm90QWxsb3dlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RBY2NlcHRhYmxlXCJdID0gNDA2XSA9IFwiTm90QWNjZXB0YWJsZVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWRcIl0gPSA0MDddID0gXCJQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUmVxdWVzdFRpbWVvdXRcIl0gPSA0MDhdID0gXCJSZXF1ZXN0VGltZW91dFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJDb25mbGljdFwiXSA9IDQwOV0gPSBcIkNvbmZsaWN0XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkdvbmVcIl0gPSA0MTBdID0gXCJHb25lXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlRvb01hbnlSZXF1ZXN0c1wiXSA9IDQyOV0gPSBcIlRvb01hbnlSZXF1ZXN0c1wiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJJbnRlcm5hbFNlcnZlckVycm9yXCJdID0gNTAwXSA9IFwiSW50ZXJuYWxTZXJ2ZXJFcnJvclwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RJbXBsZW1lbnRlZFwiXSA9IDUwMV0gPSBcIk5vdEltcGxlbWVudGVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkJhZEdhdGV3YXlcIl0gPSA1MDJdID0gXCJCYWRHYXRld2F5XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlNlcnZpY2VVbmF2YWlsYWJsZVwiXSA9IDUwM10gPSBcIlNlcnZpY2VVbmF2YWlsYWJsZVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJHYXRld2F5VGltZW91dFwiXSA9IDUwNF0gPSBcIkdhdGV3YXlUaW1lb3V0XCI7XG59KShIdHRwQ29kZXMgfHwgKGV4cG9ydHMuSHR0cENvZGVzID0gSHR0cENvZGVzID0ge30pKTtcbnZhciBIZWFkZXJzO1xuKGZ1bmN0aW9uIChIZWFkZXJzKSB7XG4gICAgSGVhZGVyc1tcIkFjY2VwdFwiXSA9IFwiYWNjZXB0XCI7XG4gICAgSGVhZGVyc1tcIkNvbnRlbnRUeXBlXCJdID0gXCJjb250ZW50LXR5cGVcIjtcbn0pKEhlYWRlcnMgfHwgKGV4cG9ydHMuSGVhZGVycyA9IEhlYWRlcnMgPSB7fSkpO1xudmFyIE1lZGlhVHlwZXM7XG4oZnVuY3Rpb24gKE1lZGlhVHlwZXMpIHtcbiAgICBNZWRpYVR5cGVzW1wiQXBwbGljYXRpb25Kc29uXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG59KShNZWRpYVR5cGVzIHx8IChleHBvcnRzLk1lZGlhVHlwZXMgPSBNZWRpYVR5cGVzID0ge30pKTtcbi8qKlxuICogUmV0dXJucyB0aGUgcHJveHkgVVJMLCBkZXBlbmRpbmcgdXBvbiB0aGUgc3VwcGxpZWQgdXJsIGFuZCBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiBAcGFyYW0gc2VydmVyVXJsICBUaGUgc2VydmVyIFVSTCB3aGVyZSB0aGUgcmVxdWVzdCB3aWxsIGJlIHNlbnQuIEZvciBleGFtcGxlLCBodHRwczovL2FwaS5naXRodWIuY29tXG4gKi9cbmZ1bmN0aW9uIGdldFByb3h5VXJsKHNlcnZlclVybCkge1xuICAgIGNvbnN0IHByb3h5VXJsID0gcG0uZ2V0UHJveHlVcmwobmV3IFVSTChzZXJ2ZXJVcmwpKTtcbiAgICByZXR1cm4gcHJveHlVcmwgPyBwcm94eVVybC5ocmVmIDogJyc7XG59XG5leHBvcnRzLmdldFByb3h5VXJsID0gZ2V0UHJveHlVcmw7XG5jb25zdCBIdHRwUmVkaXJlY3RDb2RlcyA9IFtcbiAgICBIdHRwQ29kZXMuTW92ZWRQZXJtYW5lbnRseSxcbiAgICBIdHRwQ29kZXMuUmVzb3VyY2VNb3ZlZCxcbiAgICBIdHRwQ29kZXMuU2VlT3RoZXIsXG4gICAgSHR0cENvZGVzLlRlbXBvcmFyeVJlZGlyZWN0LFxuICAgIEh0dHBDb2Rlcy5QZXJtYW5lbnRSZWRpcmVjdFxuXTtcbmNvbnN0IEh0dHBSZXNwb25zZVJldHJ5Q29kZXMgPSBbXG4gICAgSHR0cENvZGVzLkJhZEdhdGV3YXksXG4gICAgSHR0cENvZGVzLlNlcnZpY2VVbmF2YWlsYWJsZSxcbiAgICBIdHRwQ29kZXMuR2F0ZXdheVRpbWVvdXRcbl07XG5jb25zdCBSZXRyeWFibGVIdHRwVmVyYnMgPSBbJ09QVElPTlMnLCAnR0VUJywgJ0RFTEVURScsICdIRUFEJ107XG5jb25zdCBFeHBvbmVudGlhbEJhY2tvZmZDZWlsaW5nID0gMTA7XG5jb25zdCBFeHBvbmVudGlhbEJhY2tvZmZUaW1lU2xpY2UgPSA1O1xuY2xhc3MgSHR0cENsaWVudEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1c0NvZGUpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdIdHRwQ2xpZW50RXJyb3InO1xuICAgICAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSHR0cENsaWVudEVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwQ2xpZW50RXJyb3IgPSBIdHRwQ2xpZW50RXJyb3I7XG5jbGFzcyBIdHRwQ2xpZW50UmVzcG9uc2Uge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgcmVhZEJvZHkoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgb3V0cHV0ID0gQnVmZmVyLmFsbG9jKDApO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBCdWZmZXIuY29uY2F0KFtvdXRwdXQsIGNodW5rXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3V0cHV0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZEJvZHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY2h1bmtzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuSHR0cENsaWVudFJlc3BvbnNlID0gSHR0cENsaWVudFJlc3BvbnNlO1xuZnVuY3Rpb24gaXNIdHRwcyhyZXF1ZXN0VXJsKSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChyZXF1ZXN0VXJsKTtcbiAgICByZXR1cm4gcGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6Jztcbn1cbmV4cG9ydHMuaXNIdHRwcyA9IGlzSHR0cHM7XG5jbGFzcyBIdHRwQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1c2VyQWdlbnQsIGhhbmRsZXJzLCByZXF1ZXN0T3B0aW9ucykge1xuICAgICAgICB0aGlzLl9pZ25vcmVTc2xFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0cyA9IHRydWU7XG4gICAgICAgIHRoaXMuX2FsbG93UmVkaXJlY3REb3duZ3JhZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbWF4UmVkaXJlY3RzID0gNTA7XG4gICAgICAgIHRoaXMuX2FsbG93UmV0cmllcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9tYXhSZXRyaWVzID0gMTtcbiAgICAgICAgdGhpcy5fa2VlcEFsaXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXNlckFnZW50ID0gdXNlckFnZW50O1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gaGFuZGxlcnMgfHwgW107XG4gICAgICAgIHRoaXMucmVxdWVzdE9wdGlvbnMgPSByZXF1ZXN0T3B0aW9ucztcbiAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMuaWdub3JlU3NsRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lnbm9yZVNzbEVycm9yID0gcmVxdWVzdE9wdGlvbnMuaWdub3JlU3NsRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zb2NrZXRUaW1lb3V0ID0gcmVxdWVzdE9wdGlvbnMuc29ja2V0VGltZW91dDtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWxsb3dSZWRpcmVjdHMgPSByZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0RG93bmdyYWRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0RG93bmdyYWRlID0gcmVxdWVzdE9wdGlvbnMuYWxsb3dSZWRpcmVjdERvd25ncmFkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5tYXhSZWRpcmVjdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21heFJlZGlyZWN0cyA9IE1hdGgubWF4KHJlcXVlc3RPcHRpb25zLm1heFJlZGlyZWN0cywgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMua2VlcEFsaXZlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9rZWVwQWxpdmUgPSByZXF1ZXN0T3B0aW9ucy5rZWVwQWxpdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMuYWxsb3dSZXRyaWVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JldHJpZXMgPSByZXF1ZXN0T3B0aW9ucy5hbGxvd1JldHJpZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMubWF4UmV0cmllcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4UmV0cmllcyA9IHJlcXVlc3RPcHRpb25zLm1heFJldHJpZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3B0aW9ucyhyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnT1BUSU9OUycsIHJlcXVlc3RVcmwsIG51bGwsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldChyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgcmVxdWVzdFVybCwgbnVsbCwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVsKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCByZXF1ZXN0VXJsLCBudWxsLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwb3N0KHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQT1NUJywgcmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGF0Y2gocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BBVENIJywgcmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHV0KHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQVVQnLCByZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoZWFkKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdIRUFEJywgcmVxdWVzdFVybCwgbnVsbCwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2VuZFN0cmVhbSh2ZXJiLCByZXF1ZXN0VXJsLCBzdHJlYW0sIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHZlcmIsIHJlcXVlc3RVcmwsIHN0cmVhbSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHR5cGVkIG9iamVjdCBmcm9tIGFuIGVuZHBvaW50XG4gICAgICogQmUgYXdhcmUgdGhhdCBub3QgZm91bmQgcmV0dXJucyBhIG51bGwuICBPdGhlciBlcnJvcnMgKDR4eCwgNXh4KSByZWplY3QgdGhlIHByb21pc2VcbiAgICAgKi9cbiAgICBnZXRKc29uKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5nZXQocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zdEpzb24ocmVxdWVzdFVybCwgb2JqLCBhZGRpdGlvbmFsSGVhZGVycyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5Db250ZW50VHlwZV0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5Db250ZW50VHlwZSwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5wb3N0KHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzUmVzcG9uc2UocmVzLCB0aGlzLnJlcXVlc3RPcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1dEpzb24ocmVxdWVzdFVybCwgb2JqLCBhZGRpdGlvbmFsSGVhZGVycyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5Db250ZW50VHlwZV0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5Db250ZW50VHlwZSwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5wdXQocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGF0Y2hKc29uKHJlcXVlc3RVcmwsIG9iaiwgYWRkaXRpb25hbEhlYWRlcnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkFjY2VwdF0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5BY2NlcHQsIE1lZGlhVHlwZXMuQXBwbGljYXRpb25Kc29uKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQ29udGVudFR5cGVdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQ29udGVudFR5cGUsIE1lZGlhVHlwZXMuQXBwbGljYXRpb25Kc29uKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIHRoaXMucGF0Y2gocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgYSByYXcgaHR0cCByZXF1ZXN0LlxuICAgICAqIEFsbCBvdGhlciBtZXRob2RzIHN1Y2ggYXMgZ2V0LCBwb3N0LCBwYXRjaCwgYW5kIHJlcXVlc3QgdWx0aW1hdGVseSBjYWxsIHRoaXMuXG4gICAgICogUHJlZmVyIGdldCwgZGVsLCBwb3N0IGFuZCBwYXRjaFxuICAgICAqL1xuICAgIHJlcXVlc3QodmVyYiwgcmVxdWVzdFVybCwgZGF0YSwgaGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDbGllbnQgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwocmVxdWVzdFVybCk7XG4gICAgICAgICAgICBsZXQgaW5mbyA9IHRoaXMuX3ByZXBhcmVSZXF1ZXN0KHZlcmIsIHBhcnNlZFVybCwgaGVhZGVycyk7XG4gICAgICAgICAgICAvLyBPbmx5IHBlcmZvcm0gcmV0cmllcyBvbiByZWFkcyBzaW5jZSB3cml0ZXMgbWF5IG5vdCBiZSBpZGVtcG90ZW50LlxuICAgICAgICAgICAgY29uc3QgbWF4VHJpZXMgPSB0aGlzLl9hbGxvd1JldHJpZXMgJiYgUmV0cnlhYmxlSHR0cFZlcmJzLmluY2x1ZGVzKHZlcmIpXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tYXhSZXRyaWVzICsgMVxuICAgICAgICAgICAgICAgIDogMTtcbiAgICAgICAgICAgIGxldCBudW1UcmllcyA9IDA7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCB0aGlzLnJlcXVlc3RSYXcoaW5mbywgZGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2VcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSAmJlxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGUgPT09IEh0dHBDb2Rlcy5VbmF1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhlbnRpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLmNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1dGhlbnRpY2F0aW9uSGFuZGxlci5oYW5kbGVBdXRoZW50aWNhdGlvbih0aGlzLCBpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgcmVjZWl2ZWQgYW4gdW5hdXRob3JpemVkIHJlc3BvbnNlIGJ1dCBoYXZlIG5vIGhhbmRsZXJzIHRvIGhhbmRsZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCB0aGUgcmVzcG9uc2UgcmV0dXJuIHRvIHRoZSBjYWxsZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlZGlyZWN0c1JlbWFpbmluZyA9IHRoaXMuX21heFJlZGlyZWN0cztcbiAgICAgICAgICAgICAgICB3aGlsZSAocmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlICYmXG4gICAgICAgICAgICAgICAgICAgIEh0dHBSZWRpcmVjdENvZGVzLmluY2x1ZGVzKHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWxsb3dSZWRpcmVjdHMgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RzUmVtYWluaW5nID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWRpcmVjdFVybCA9IHJlc3BvbnNlLm1lc3NhZ2UuaGVhZGVyc1snbG9jYXRpb24nXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdFVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBubyBsb2NhdGlvbiB0byByZWRpcmVjdCB0bywgd2Ugd29uJ3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFJlZGlyZWN0VXJsID0gbmV3IFVSTChyZWRpcmVjdFVybCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRVcmwucHJvdG9jb2wgIT09IHBhcnNlZFJlZGlyZWN0VXJsLnByb3RvY29sICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5fYWxsb3dSZWRpcmVjdERvd25ncmFkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWRpcmVjdCBmcm9tIEhUVFBTIHRvIEhUVFAgcHJvdG9jb2wuIFRoaXMgZG93bmdyYWRlIGlzIG5vdCBhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLiBJZiB5b3Ugd2FudCB0byBhbGxvdyB0aGlzIGJlaGF2aW9yLCBzZXQgdGhlIGFsbG93UmVkaXJlY3REb3duZ3JhZGUgb3B0aW9uIHRvIHRydWUuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBmaW5pc2ggcmVhZGluZyB0aGUgcmVzcG9uc2UgYmVmb3JlIHJlYXNzaWduaW5nIHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdpbGwgbGVhayB0aGUgb3BlbiBzb2NrZXQuXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlc3BvbnNlLnJlYWRCb2R5KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cmlwIGF1dGhvcml6YXRpb24gaGVhZGVyIGlmIHJlZGlyZWN0ZWQgdG8gYSBkaWZmZXJlbnQgaG9zdG5hbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFJlZGlyZWN0VXJsLmhvc3RuYW1lICE9PSBwYXJzZWRVcmwuaG9zdG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXIgbmFtZXMgYXJlIGNhc2UgaW5zZW5zaXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLnRvTG93ZXJDYXNlKCkgPT09ICdhdXRob3JpemF0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaGVhZGVyc1toZWFkZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBsZXQncyBtYWtlIHRoZSByZXF1ZXN0IHdpdGggdGhlIG5ldyByZWRpcmVjdFVybFxuICAgICAgICAgICAgICAgICAgICBpbmZvID0gdGhpcy5fcHJlcGFyZVJlcXVlc3QodmVyYiwgcGFyc2VkUmVkaXJlY3RVcmwsIGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHRoaXMucmVxdWVzdFJhdyhpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RzUmVtYWluaW5nLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgICFIdHRwUmVzcG9uc2VSZXRyeUNvZGVzLmluY2x1ZGVzKHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90IGEgcmV0cnkgY29kZSwgcmV0dXJuIGltbWVkaWF0ZWx5IGluc3RlYWQgb2YgcmV0cnlpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBudW1UcmllcyArPSAxO1xuICAgICAgICAgICAgICAgIGlmIChudW1UcmllcyA8IG1heFRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlc3BvbnNlLnJlYWRCb2R5KCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuX3BlcmZvcm1FeHBvbmVudGlhbEJhY2tvZmYobnVtVHJpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKG51bVRyaWVzIDwgbWF4VHJpZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTmVlZHMgdG8gYmUgY2FsbGVkIGlmIGtlZXBBbGl2ZSBpcyBzZXQgdG8gdHJ1ZSBpbiByZXF1ZXN0IG9wdGlvbnMuXG4gICAgICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FnZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9hZ2VudC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSYXcgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gaW5mb1xuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdFJhdyhpbmZvLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrRm9yUmVzdWx0KGVyciwgcmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGBlcnJgIGlzIG5vdCBwYXNzZWQsIHRoZW4gYHJlc2AgbXVzdCBiZSBwYXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdVbmtub3duIGVycm9yJykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFJhd1dpdGhDYWxsYmFjayhpbmZvLCBkYXRhLCBjYWxsYmFja0ZvclJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJhdyByZXF1ZXN0IHdpdGggY2FsbGJhY2suXG4gICAgICogQHBhcmFtIGluZm9cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqIEBwYXJhbSBvblJlc3VsdFxuICAgICAqL1xuICAgIHJlcXVlc3RSYXdXaXRoQ2FsbGJhY2soaW5mbywgZGF0YSwgb25SZXN1bHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCFpbmZvLm9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgICAgIGluZm8ub3B0aW9ucy5oZWFkZXJzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmZvLm9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEsICd1dGY4Jyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhbGxiYWNrQ2FsbGVkID0gZmFsc2U7XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlc3VsdChlcnIsIHJlcykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFja0NhbGxlZCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrQ2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBvblJlc3VsdChlcnIsIHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxID0gaW5mby5odHRwTW9kdWxlLnJlcXVlc3QoaW5mby5vcHRpb25zLCAobXNnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBuZXcgSHR0cENsaWVudFJlc3BvbnNlKG1zZyk7XG4gICAgICAgICAgICBoYW5kbGVSZXN1bHQodW5kZWZpbmVkLCByZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHNvY2tldDtcbiAgICAgICAgcmVxLm9uKCdzb2NrZXQnLCBzb2NrID0+IHtcbiAgICAgICAgICAgIHNvY2tldCA9IHNvY2s7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJZiB3ZSBldmVyIGdldCBkaXNjb25uZWN0ZWQsIHdlIHdhbnQgdGhlIHNvY2tldCB0byB0aW1lb3V0IGV2ZW50dWFsbHlcbiAgICAgICAgcmVxLnNldFRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dCB8fCAzICogNjAwMDAsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzb2NrZXQpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQuZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVSZXN1bHQobmV3IEVycm9yKGBSZXF1ZXN0IHRpbWVvdXQ6ICR7aW5mby5vcHRpb25zLnBhdGh9YCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIC8vIGVyciBoYXMgc3RhdHVzQ29kZSBwcm9wZXJ0eVxuICAgICAgICAgICAgLy8gcmVzIHNob3VsZCBoYXZlIGhlYWRlcnNcbiAgICAgICAgICAgIGhhbmRsZVJlc3VsdChlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXEud3JpdGUoZGF0YSwgJ3V0ZjgnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGRhdGEub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlcS5lbmQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGF0YS5waXBlKHJlcSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXEuZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBodHRwIGFnZW50LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIGFuIGh0dHAgYWdlbnQgdGhhdCBoYW5kbGVzXG4gICAgICogcm91dGluZyB0aHJvdWdoIGEgcHJveHkgc2VydmVyIC0gZGVwZW5kaW5nIHVwb24gdGhlIHVybCBhbmQgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgICAqIEBwYXJhbSBzZXJ2ZXJVcmwgIFRoZSBzZXJ2ZXIgVVJMIHdoZXJlIHRoZSByZXF1ZXN0IHdpbGwgYmUgc2VudC4gRm9yIGV4YW1wbGUsIGh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cbiAgICAgKi9cbiAgICBnZXRBZ2VudChzZXJ2ZXJVcmwpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChzZXJ2ZXJVcmwpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QWdlbnQocGFyc2VkVXJsKTtcbiAgICB9XG4gICAgZ2V0QWdlbnREaXNwYXRjaGVyKHNlcnZlclVybCkge1xuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHNlcnZlclVybCk7XG4gICAgICAgIGNvbnN0IHByb3h5VXJsID0gcG0uZ2V0UHJveHlVcmwocGFyc2VkVXJsKTtcbiAgICAgICAgY29uc3QgdXNlUHJveHkgPSBwcm94eVVybCAmJiBwcm94eVVybC5ob3N0bmFtZTtcbiAgICAgICAgaWYgKCF1c2VQcm94eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQcm94eUFnZW50RGlzcGF0Y2hlcihwYXJzZWRVcmwsIHByb3h5VXJsKTtcbiAgICB9XG4gICAgX3ByZXBhcmVSZXF1ZXN0KG1ldGhvZCwgcmVxdWVzdFVybCwgaGVhZGVycykge1xuICAgICAgICBjb25zdCBpbmZvID0ge307XG4gICAgICAgIGluZm8ucGFyc2VkVXJsID0gcmVxdWVzdFVybDtcbiAgICAgICAgY29uc3QgdXNpbmdTc2wgPSBpbmZvLnBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgICAgIGluZm8uaHR0cE1vZHVsZSA9IHVzaW5nU3NsID8gaHR0cHMgOiBodHRwO1xuICAgICAgICBjb25zdCBkZWZhdWx0UG9ydCA9IHVzaW5nU3NsID8gNDQzIDogODA7XG4gICAgICAgIGluZm8ub3B0aW9ucyA9IHt9O1xuICAgICAgICBpbmZvLm9wdGlvbnMuaG9zdCA9IGluZm8ucGFyc2VkVXJsLmhvc3RuYW1lO1xuICAgICAgICBpbmZvLm9wdGlvbnMucG9ydCA9IGluZm8ucGFyc2VkVXJsLnBvcnRcbiAgICAgICAgICAgID8gcGFyc2VJbnQoaW5mby5wYXJzZWRVcmwucG9ydClcbiAgICAgICAgICAgIDogZGVmYXVsdFBvcnQ7XG4gICAgICAgIGluZm8ub3B0aW9ucy5wYXRoID1cbiAgICAgICAgICAgIChpbmZvLnBhcnNlZFVybC5wYXRobmFtZSB8fCAnJykgKyAoaW5mby5wYXJzZWRVcmwuc2VhcmNoIHx8ICcnKTtcbiAgICAgICAgaW5mby5vcHRpb25zLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgaW5mby5vcHRpb25zLmhlYWRlcnMgPSB0aGlzLl9tZXJnZUhlYWRlcnMoaGVhZGVycyk7XG4gICAgICAgIGlmICh0aGlzLnVzZXJBZ2VudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbmZvLm9wdGlvbnMuaGVhZGVyc1sndXNlci1hZ2VudCddID0gdGhpcy51c2VyQWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5vcHRpb25zLmFnZW50ID0gdGhpcy5fZ2V0QWdlbnQoaW5mby5wYXJzZWRVcmwpO1xuICAgICAgICAvLyBnaXZlcyBoYW5kbGVycyBhbiBvcHBvcnR1bml0eSB0byBwYXJ0aWNpcGF0ZVxuICAgICAgICBpZiAodGhpcy5oYW5kbGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLnByZXBhcmVSZXF1ZXN0KGluZm8ub3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuICAgIF9tZXJnZUhlYWRlcnMoaGVhZGVycykge1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0T3B0aW9ucyAmJiB0aGlzLnJlcXVlc3RPcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBsb3dlcmNhc2VLZXlzKHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycyksIGxvd2VyY2FzZUtleXMoaGVhZGVycyB8fCB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb3dlcmNhc2VLZXlzKGhlYWRlcnMgfHwge30pO1xuICAgIH1cbiAgICBfZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIGhlYWRlciwgX2RlZmF1bHQpIHtcbiAgICAgICAgbGV0IGNsaWVudEhlYWRlcjtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdE9wdGlvbnMgJiYgdGhpcy5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICBjbGllbnRIZWFkZXIgPSBsb3dlcmNhc2VLZXlzKHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycylbaGVhZGVyXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkaXRpb25hbEhlYWRlcnNbaGVhZGVyXSB8fCBjbGllbnRIZWFkZXIgfHwgX2RlZmF1bHQ7XG4gICAgfVxuICAgIF9nZXRBZ2VudChwYXJzZWRVcmwpIHtcbiAgICAgICAgbGV0IGFnZW50O1xuICAgICAgICBjb25zdCBwcm94eVVybCA9IHBtLmdldFByb3h5VXJsKHBhcnNlZFVybCk7XG4gICAgICAgIGNvbnN0IHVzZVByb3h5ID0gcHJveHlVcmwgJiYgcHJveHlVcmwuaG9zdG5hbWU7XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUgJiYgdXNlUHJveHkpIHtcbiAgICAgICAgICAgIGFnZW50ID0gdGhpcy5fcHJveHlBZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXVzZVByb3h5KSB7XG4gICAgICAgICAgICBhZ2VudCA9IHRoaXMuX2FnZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFnZW50IGlzIGFscmVhZHkgYXNzaWduZWQgdXNlIHRoYXQgYWdlbnQuXG4gICAgICAgIGlmIChhZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzaW5nU3NsID0gcGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgbGV0IG1heFNvY2tldHMgPSAxMDA7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICBtYXhTb2NrZXRzID0gdGhpcy5yZXF1ZXN0T3B0aW9ucy5tYXhTb2NrZXRzIHx8IGh0dHAuZ2xvYmFsQWdlbnQubWF4U29ja2V0cztcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIGB1c2VQcm94eWAgYWdhaW4sIGJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGBwcm94eVVSbGAgZGlyZWN0bHkgZm9yIFR5cGVTY3JpcHRzJ3MgZmxvdyBhbmFseXNpcy5cbiAgICAgICAgaWYgKHByb3h5VXJsICYmIHByb3h5VXJsLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBhZ2VudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgbWF4U29ja2V0cyxcbiAgICAgICAgICAgICAgICBrZWVwQWxpdmU6IHRoaXMuX2tlZXBBbGl2ZSxcbiAgICAgICAgICAgICAgICBwcm94eTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoKHByb3h5VXJsLnVzZXJuYW1lIHx8IHByb3h5VXJsLnBhc3N3b3JkKSAmJiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3h5QXV0aDogYCR7cHJveHlVcmwudXNlcm5hbWV9OiR7cHJveHlVcmwucGFzc3dvcmR9YFxuICAgICAgICAgICAgICAgIH0pKSwgeyBob3N0OiBwcm94eVVybC5ob3N0bmFtZSwgcG9ydDogcHJveHlVcmwucG9ydCB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCB0dW5uZWxBZ2VudDtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJIdHRwcyA9IHByb3h5VXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgICAgIGlmICh1c2luZ1NzbCkge1xuICAgICAgICAgICAgICAgIHR1bm5lbEFnZW50ID0gb3Zlckh0dHBzID8gdHVubmVsLmh0dHBzT3Zlckh0dHBzIDogdHVubmVsLmh0dHBzT3Zlckh0dHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0dW5uZWxBZ2VudCA9IG92ZXJIdHRwcyA/IHR1bm5lbC5odHRwT3Zlckh0dHBzIDogdHVubmVsLmh0dHBPdmVySHR0cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFnZW50ID0gdHVubmVsQWdlbnQoYWdlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3h5QWdlbnQgPSBhZ2VudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB0dW5uZWxpbmcgYWdlbnQgaXNuJ3QgYXNzaWduZWQgY3JlYXRlIGEgbmV3IGFnZW50XG4gICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IGtlZXBBbGl2ZTogdGhpcy5fa2VlcEFsaXZlLCBtYXhTb2NrZXRzIH07XG4gICAgICAgICAgICBhZ2VudCA9IHVzaW5nU3NsID8gbmV3IGh0dHBzLkFnZW50KG9wdGlvbnMpIDogbmV3IGh0dHAuQWdlbnQob3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLl9hZ2VudCA9IGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2luZ1NzbCAmJiB0aGlzLl9pZ25vcmVTc2xFcnJvcikge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzZXQgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRD0wIHNpbmNlIHRoYXQgd2lsbCBhZmZlY3QgcmVxdWVzdCBmb3IgZW50aXJlIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGh0dHAuUmVxdWVzdE9wdGlvbnMgZG9lc24ndCBleHBvc2UgYSB3YXkgdG8gbW9kaWZ5IFJlcXVlc3RPcHRpb25zLmFnZW50Lm9wdGlvbnNcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2FzdCBpdCB0byBhbnkgYW5kIGNoYW5nZSBpdCBkaXJlY3RseVxuICAgICAgICAgICAgYWdlbnQub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oYWdlbnQub3B0aW9ucyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gICAgX2dldFByb3h5QWdlbnREaXNwYXRjaGVyKHBhcnNlZFVybCwgcHJveHlVcmwpIHtcbiAgICAgICAgbGV0IHByb3h5QWdlbnQ7XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUpIHtcbiAgICAgICAgICAgIHByb3h5QWdlbnQgPSB0aGlzLl9wcm94eUFnZW50RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhZ2VudCBpcyBhbHJlYWR5IGFzc2lnbmVkIHVzZSB0aGF0IGFnZW50LlxuICAgICAgICBpZiAocHJveHlBZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3h5QWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNpbmdTc2wgPSBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICBwcm94eUFnZW50ID0gbmV3IHVuZGljaV8xLlByb3h5QWdlbnQoT2JqZWN0LmFzc2lnbih7IHVyaTogcHJveHlVcmwuaHJlZiwgcGlwZWxpbmluZzogIXRoaXMuX2tlZXBBbGl2ZSA/IDAgOiAxIH0sICgocHJveHlVcmwudXNlcm5hbWUgfHwgcHJveHlVcmwucGFzc3dvcmQpICYmIHtcbiAgICAgICAgICAgIHRva2VuOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtwcm94eVVybC51c2VybmFtZX06JHtwcm94eVVybC5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyl9YFxuICAgICAgICB9KSkpO1xuICAgICAgICB0aGlzLl9wcm94eUFnZW50RGlzcGF0Y2hlciA9IHByb3h5QWdlbnQ7XG4gICAgICAgIGlmICh1c2luZ1NzbCAmJiB0aGlzLl9pZ25vcmVTc2xFcnJvcikge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzZXQgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRD0wIHNpbmNlIHRoYXQgd2lsbCBhZmZlY3QgcmVxdWVzdCBmb3IgZW50aXJlIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGh0dHAuUmVxdWVzdE9wdGlvbnMgZG9lc24ndCBleHBvc2UgYSB3YXkgdG8gbW9kaWZ5IFJlcXVlc3RPcHRpb25zLmFnZW50Lm9wdGlvbnNcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2FzdCBpdCB0byBhbnkgYW5kIGNoYW5nZSBpdCBkaXJlY3RseVxuICAgICAgICAgICAgcHJveHlBZ2VudC5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihwcm94eUFnZW50Lm9wdGlvbnMucmVxdWVzdFRscyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm94eUFnZW50O1xuICAgIH1cbiAgICBfcGVyZm9ybUV4cG9uZW50aWFsQmFja29mZihyZXRyeU51bWJlcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0cnlOdW1iZXIgPSBNYXRoLm1pbihFeHBvbmVudGlhbEJhY2tvZmZDZWlsaW5nLCByZXRyeU51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBtcyA9IEV4cG9uZW50aWFsQmFja29mZlRpbWVTbGljZSAqIE1hdGgucG93KDIsIHJldHJ5TnVtYmVyKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3Byb2Nlc3NSZXNwb25zZShyZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHJlcy5tZXNzYWdlLnN0YXR1c0NvZGUgfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gbm90IGZvdW5kIGxlYWRzIHRvIG51bGwgb2JqIHJldHVybmVkXG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IEh0dHBDb2Rlcy5Ob3RGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXN1bHQgZnJvbSB0aGUgYm9keVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRhdGVUaW1lRGVzZXJpYWxpemVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGEudmFsdWVPZigpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG9iajtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudHM7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSB5aWVsZCByZXMucmVhZEJvZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRzICYmIGNvbnRlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVzZXJpYWxpemVEYXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoY29udGVudHMsIGRhdGVUaW1lRGVzZXJpYWxpemVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoY29udGVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb2JqO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSByZXMubWVzc2FnZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgcmVzb3VyY2UgKGNvbnRlbnRzIG5vdCBqc29uKTsgIGxlYXZpbmcgcmVzdWx0IG9iaiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCAzeHggcmVkaXJlY3RzIGFyZSBoYW5kbGVkIGJ5IHRoZSBodHRwIGxheWVyLlxuICAgICAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlID4gMjk5KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2c7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGV4Y2VwdGlvbi9lcnJvciBpbiBib2R5LCBhdHRlbXB0IHRvIGdldCBiZXR0ZXIgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiAmJiBvYmoubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gb2JqLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udGVudHMgJiYgY29udGVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgbWF5IGJlIHRoZSBjYXNlIHRoYXQgdGhlIGV4Y2VwdGlvbiBpcyBpbiB0aGUgYm9keSBtZXNzYWdlIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gY29udGVudHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBgRmFpbGVkIHJlcXVlc3Q6ICgke3N0YXR1c0NvZGV9KWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEh0dHBDbGllbnRFcnJvcihtc2csIHN0YXR1c0NvZGUpO1xuICAgICAgICAgICAgICAgICAgICBlcnIucmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwQ2xpZW50ID0gSHR0cENsaWVudDtcbmNvbnN0IGxvd2VyY2FzZUtleXMgPSAob2JqKSA9PiBPYmplY3Qua2V5cyhvYmopLnJlZHVjZSgoYywgaykgPT4gKChjW2sudG9Mb3dlckNhc2UoKV0gPSBvYmpba10pLCBjKSwge30pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QZXJzb25hbEFjY2Vzc1Rva2VuQ3JlZGVudGlhbEhhbmRsZXIgPSBleHBvcnRzLkJlYXJlckNyZWRlbnRpYWxIYW5kbGVyID0gZXhwb3J0cy5CYXNpY0NyZWRlbnRpYWxIYW5kbGVyID0gdm9pZCAwO1xuY2xhc3MgQmFzaWNDcmVkZW50aWFsSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IodXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICAgIH1cbiAgICBwcmVwYXJlUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIG5vIGhlYWRlcnMnKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke3RoaXMudXNlcm5hbWV9OiR7dGhpcy5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICB9XG4gICAgLy8gVGhpcyBoYW5kbGVyIGNhbm5vdCBoYW5kbGUgNDAxXG4gICAgY2FuSGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkJhc2ljQ3JlZGVudGlhbEhhbmRsZXIgPSBCYXNpY0NyZWRlbnRpYWxIYW5kbGVyO1xuY2xhc3MgQmVhcmVyQ3JlZGVudGlhbEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKHRva2VuKSB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICB9XG4gICAgLy8gY3VycmVudGx5IGltcGxlbWVudHMgcHJlLWF1dGhvcml6YXRpb25cbiAgICAvLyBUT0RPOiBzdXBwb3J0IHByZUF1dGggPSBmYWxzZSB3aGVyZSBpdCBob29rcyBvbiA0MDFcbiAgICBwcmVwYXJlUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIG5vIGhlYWRlcnMnKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0aGlzLnRva2VufWA7XG4gICAgfVxuICAgIC8vIFRoaXMgaGFuZGxlciBjYW5ub3QgaGFuZGxlIDQwMVxuICAgIGNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5CZWFyZXJDcmVkZW50aWFsSGFuZGxlciA9IEJlYXJlckNyZWRlbnRpYWxIYW5kbGVyO1xuY2xhc3MgUGVyc29uYWxBY2Nlc3NUb2tlbkNyZWRlbnRpYWxIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b2tlbikge1xuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgfVxuICAgIC8vIGN1cnJlbnRseSBpbXBsZW1lbnRzIHByZS1hdXRob3JpemF0aW9uXG4gICAgLy8gVE9ETzogc3VwcG9ydCBwcmVBdXRoID0gZmFsc2Ugd2hlcmUgaXQgaG9va3Mgb24gNDAxXG4gICAgcHJlcGFyZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBubyBoZWFkZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShgUEFUOiR7dGhpcy50b2tlbn1gKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICB9XG4gICAgLy8gVGhpcyBoYW5kbGVyIGNhbm5vdCBoYW5kbGUgNDAxXG4gICAgY2FuSGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlBlcnNvbmFsQWNjZXNzVG9rZW5DcmVkZW50aWFsSGFuZGxlciA9IFBlcnNvbmFsQWNjZXNzVG9rZW5DcmVkZW50aWFsSGFuZGxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF1dGguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5PaWRjQ2xpZW50ID0gdm9pZCAwO1xuY29uc3QgaHR0cF9jbGllbnRfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudFwiKTtcbmNvbnN0IGF1dGhfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudC9saWIvYXV0aFwiKTtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCIuL2NvcmVcIik7XG5jbGFzcyBPaWRjQ2xpZW50IHtcbiAgICBzdGF0aWMgY3JlYXRlSHR0cENsaWVudChhbGxvd1JldHJ5ID0gdHJ1ZSwgbWF4UmV0cnkgPSAxMCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGFsbG93UmV0cmllczogYWxsb3dSZXRyeSxcbiAgICAgICAgICAgIG1heFJldHJpZXM6IG1heFJldHJ5XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgaHR0cF9jbGllbnRfMS5IdHRwQ2xpZW50KCdhY3Rpb25zL29pZGMtY2xpZW50JywgW25ldyBhdXRoXzEuQmVhcmVyQ3JlZGVudGlhbEhhbmRsZXIoT2lkY0NsaWVudC5nZXRSZXF1ZXN0VG9rZW4oKSldLCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSZXF1ZXN0VG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnZbJ0FDVElPTlNfSURfVE9LRU5fUkVRVUVTVF9UT0tFTiddO1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZXQgQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1RPS0VOIGVudiB2YXJpYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgc3RhdGljIGdldElEVG9rZW5VcmwoKSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWVVcmwgPSBwcm9jZXNzLmVudlsnQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1VSTCddO1xuICAgICAgICBpZiAoIXJ1bnRpbWVVcmwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCBBQ1RJT05TX0lEX1RPS0VOX1JFUVVFU1RfVVJMIGVudiB2YXJpYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydW50aW1lVXJsO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q2FsbChpZF90b2tlbl91cmwpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgaHR0cGNsaWVudCA9IE9pZGNDbGllbnQuY3JlYXRlSHR0cENsaWVudCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgaHR0cGNsaWVudFxuICAgICAgICAgICAgICAgIC5nZXRKc29uKGlkX3Rva2VuX3VybClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBJRCBUb2tlbi4gXFxuIFxuICAgICAgICBFcnJvciBDb2RlIDogJHtlcnJvci5zdGF0dXNDb2RlfVxcbiBcbiAgICAgICAgRXJyb3IgTWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpZF90b2tlbiA9IChfYSA9IHJlcy5yZXN1bHQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZTtcbiAgICAgICAgICAgIGlmICghaWRfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3BvbnNlIGpzb24gYm9keSBkbyBub3QgaGF2ZSBJRCBUb2tlbiBmaWVsZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlkX3Rva2VuO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGdldElEVG9rZW4oYXVkaWVuY2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IElEIFRva2VuIGlzIHJlcXVlc3RlZCBmcm9tIGFjdGlvbiBzZXJ2aWNlXG4gICAgICAgICAgICAgICAgbGV0IGlkX3Rva2VuX3VybCA9IE9pZGNDbGllbnQuZ2V0SURUb2tlblVybCgpO1xuICAgICAgICAgICAgICAgIGlmIChhdWRpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVkQXVkaWVuY2UgPSBlbmNvZGVVUklDb21wb25lbnQoYXVkaWVuY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZF90b2tlbl91cmwgPSBgJHtpZF90b2tlbl91cmx9JmF1ZGllbmNlPSR7ZW5jb2RlZEF1ZGllbmNlfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICgwLCBjb3JlXzEuZGVidWcpKGBJRCB0b2tlbiB1cmwgaXMgJHtpZF90b2tlbl91cmx9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRfdG9rZW4gPSB5aWVsZCBPaWRjQ2xpZW50LmdldENhbGwoaWRfdG9rZW5fdXJsKTtcbiAgICAgICAgICAgICAgICAoMCwgY29yZV8xLnNldFNlY3JldCkoaWRfdG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBpZF90b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgbWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLk9pZGNDbGllbnQgPSBPaWRjQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2lkYy11dGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnN1bW1hcnkgPSBleHBvcnRzLm1hcmtkb3duU3VtbWFyeSA9IGV4cG9ydHMuU1VNTUFSWV9ET0NTX1VSTCA9IGV4cG9ydHMuU1VNTUFSWV9FTlZfVkFSID0gdm9pZCAwO1xuY29uc3Qgb3NfMSA9IHJlcXVpcmUoXCJvc1wiKTtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCB7IGFjY2VzcywgYXBwZW5kRmlsZSwgd3JpdGVGaWxlIH0gPSBmc18xLnByb21pc2VzO1xuZXhwb3J0cy5TVU1NQVJZX0VOVl9WQVIgPSAnR0lUSFVCX1NURVBfU1VNTUFSWSc7XG5leHBvcnRzLlNVTU1BUllfRE9DU19VUkwgPSAnaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vYWN0aW9ucy91c2luZy13b3JrZmxvd3Mvd29ya2Zsb3ctY29tbWFuZHMtZm9yLWdpdGh1Yi1hY3Rpb25zI2FkZGluZy1hLWpvYi1zdW1tYXJ5JztcbmNsYXNzIFN1bW1hcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9idWZmZXIgPSAnJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIHN1bW1hcnkgZmlsZSBwYXRoIGZyb20gdGhlIGVudmlyb25tZW50LCByZWplY3RzIGlmIGVudiB2YXIgaXMgbm90IGZvdW5kIG9yIGZpbGUgZG9lcyBub3QgZXhpc3RcbiAgICAgKiBBbHNvIGNoZWNrcyByL3cgcGVybWlzc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBzdGVwIHN1bW1hcnkgZmlsZSBwYXRoXG4gICAgICovXG4gICAgZmlsZVBhdGgoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmlsZVBhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXRoRnJvbUVudiA9IHByb2Nlc3MuZW52W2V4cG9ydHMuU1VNTUFSWV9FTlZfVkFSXTtcbiAgICAgICAgICAgIGlmICghcGF0aEZyb21FbnYpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciAkJHtleHBvcnRzLlNVTU1BUllfRU5WX1ZBUn0uIENoZWNrIGlmIHlvdXIgcnVudGltZSBlbnZpcm9ubWVudCBzdXBwb3J0cyBqb2Igc3VtbWFyaWVzLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB5aWVsZCBhY2Nlc3MocGF0aEZyb21FbnYsIGZzXzEuY29uc3RhbnRzLlJfT0sgfCBmc18xLmNvbnN0YW50cy5XX09LKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGFjY2VzcyBzdW1tYXJ5IGZpbGU6ICcke3BhdGhGcm9tRW52fScuIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjb3JyZWN0IHJlYWQvd3JpdGUgcGVybWlzc2lvbnMuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9maWxlUGF0aCA9IHBhdGhGcm9tRW52O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVQYXRoO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JhcHMgY29udGVudCBpbiBhbiBIVE1MIHRhZywgYWRkaW5nIGFueSBIVE1MIGF0dHJpYnV0ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgSFRNTCB0YWcgdG8gd3JhcFxuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gY29udGVudCBjb250ZW50IHdpdGhpbiB0aGUgdGFnXG4gICAgICogQHBhcmFtIHtbYXR0cmlidXRlOiBzdHJpbmddOiBzdHJpbmd9IGF0dHJzIGtleS12YWx1ZSBsaXN0IG9mIEhUTUwgYXR0cmlidXRlcyB0byBhZGRcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IGNvbnRlbnQgd3JhcHBlZCBpbiBIVE1MIGVsZW1lbnRcbiAgICAgKi9cbiAgICB3cmFwKHRhZywgY29udGVudCwgYXR0cnMgPSB7fSkge1xuICAgICAgICBjb25zdCBodG1sQXR0cnMgPSBPYmplY3QuZW50cmllcyhhdHRycylcbiAgICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCAke2tleX09XCIke3ZhbHVlfVwiYClcbiAgICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYDwke3RhZ30ke2h0bWxBdHRyc30+YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYDwke3RhZ30ke2h0bWxBdHRyc30+JHtjb250ZW50fTwvJHt0YWd9PmA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyB0ZXh0IGluIHRoZSBidWZmZXIgdG8gdGhlIHN1bW1hcnkgYnVmZmVyIGZpbGUgYW5kIGVtcHRpZXMgYnVmZmVyLiBXaWxsIGFwcGVuZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdW1tYXJ5V3JpdGVPcHRpb25zfSBbb3B0aW9uc10gKG9wdGlvbmFsKSBvcHRpb25zIGZvciB3cml0ZSBvcGVyYXRpb25cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN1bW1hcnk+fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgd3JpdGUob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcndyaXRlID0gISEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm92ZXJ3cml0ZSk7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHlpZWxkIHRoaXMuZmlsZVBhdGgoKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRlRnVuYyA9IG92ZXJ3cml0ZSA/IHdyaXRlRmlsZSA6IGFwcGVuZEZpbGU7XG4gICAgICAgICAgICB5aWVsZCB3cml0ZUZ1bmMoZmlsZVBhdGgsIHRoaXMuX2J1ZmZlciwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlCdWZmZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgc3VtbWFyeSBidWZmZXIgYW5kIHdpcGVzIHRoZSBzdW1tYXJ5IGZpbGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpLndyaXRlKHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdW1tYXJ5IGJ1ZmZlciBhcyBhIHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gc3RyaW5nIG9mIHN1bW1hcnkgYnVmZmVyXG4gICAgICovXG4gICAgc3RyaW5naWZ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgc3VtbWFyeSBidWZmZXIgaXMgZW1wdHlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZW59IHRydWUgaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eVxuICAgICAqL1xuICAgIGlzRW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHN1bW1hcnkgYnVmZmVyIHdpdGhvdXQgd3JpdGluZyB0byBzdW1tYXJ5IGZpbGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlciA9ICcnO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyByYXcgdGV4dCB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IGNvbnRlbnQgdG8gYWRkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYWRkRU9MPWZhbHNlXSAob3B0aW9uYWwpIGFwcGVuZCBhbiBFT0wgdG8gdGhlIHJhdyB0ZXh0IChkZWZhdWx0OiBmYWxzZSlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkUmF3KHRleHQsIGFkZEVPTCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlciArPSB0ZXh0O1xuICAgICAgICByZXR1cm4gYWRkRU9MID8gdGhpcy5hZGRFT0woKSA6IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgZW5kLW9mLWxpbmUgbWFya2VyIHRvIHRoZSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkRU9MKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcob3NfMS5FT0wpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgY29kZWJsb2NrIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgY29udGVudCB0byByZW5kZXIgd2l0aGluIGZlbmNlZCBjb2RlIGJsb2NrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmcgKG9wdGlvbmFsKSBsYW5ndWFnZSB0byBzeW50YXggaGlnaGxpZ2h0IGNvZGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkQ29kZUJsb2NrKGNvZGUsIGxhbmcpIHtcbiAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuYXNzaWduKHt9LCAobGFuZyAmJiB7IGxhbmcgfSkpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdwcmUnLCB0aGlzLndyYXAoJ2NvZGUnLCBjb2RlKSwgYXR0cnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBsaXN0IHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gaXRlbXMgbGlzdCBvZiBpdGVtcyB0byByZW5kZXJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcmRlcmVkPWZhbHNlXSAob3B0aW9uYWwpIGlmIHRoZSByZW5kZXJlZCBsaXN0IHNob3VsZCBiZSBvcmRlcmVkIG9yIG5vdCAoZGVmYXVsdDogZmFsc2UpXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZExpc3QoaXRlbXMsIG9yZGVyZWQgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB0YWcgPSBvcmRlcmVkID8gJ29sJyA6ICd1bCc7XG4gICAgICAgIGNvbnN0IGxpc3RJdGVtcyA9IGl0ZW1zLm1hcChpdGVtID0+IHRoaXMud3JhcCgnbGknLCBpdGVtKSkuam9pbignJyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAodGFnLCBsaXN0SXRlbXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCB0YWJsZSB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3VtbWFyeVRhYmxlQ2VsbFtdfSByb3dzIHRhYmxlIHJvd3NcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkVGFibGUocm93cykge1xuICAgICAgICBjb25zdCB0YWJsZUJvZHkgPSByb3dzXG4gICAgICAgICAgICAubWFwKHJvdyA9PiB7XG4gICAgICAgICAgICBjb25zdCBjZWxscyA9IHJvd1xuICAgICAgICAgICAgICAgIC5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjZWxsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwKCd0ZCcsIGNlbGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IGhlYWRlciwgZGF0YSwgY29sc3Bhbiwgcm93c3BhbiB9ID0gY2VsbDtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBoZWFkZXIgPyAndGgnIDogJ3RkJztcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKGNvbHNwYW4gJiYgeyBjb2xzcGFuIH0pKSwgKHJvd3NwYW4gJiYgeyByb3dzcGFuIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwKHRhZywgZGF0YSwgYXR0cnMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwKCd0cicsIGNlbGxzKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgndGFibGUnLCB0YWJsZUJvZHkpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2xsYXBzYWJsZSBIVE1MIGRldGFpbHMgZWxlbWVudCB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCB0ZXh0IGZvciB0aGUgY2xvc2VkIHN0YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgY29sbGFwc2FibGUgY29udGVudFxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGREZXRhaWxzKGxhYmVsLCBjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2RldGFpbHMnLCB0aGlzLndyYXAoJ3N1bW1hcnknLCBsYWJlbCkgKyBjb250ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgaW1hZ2UgdGFnIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNyYyBwYXRoIHRvIHRoZSBpbWFnZSB5b3UgdG8gZW1iZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWx0IHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGltYWdlXG4gICAgICogQHBhcmFtIHtTdW1tYXJ5SW1hZ2VPcHRpb25zfSBvcHRpb25zIChvcHRpb25hbCkgYWRkaXRpb24gaW1hZ2UgYXR0cmlidXRlc1xuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRJbWFnZShzcmMsIGFsdCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAod2lkdGggJiYgeyB3aWR0aCB9KSksIChoZWlnaHQgJiYgeyBoZWlnaHQgfSkpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdpbWcnLCBudWxsLCBPYmplY3QuYXNzaWduKHsgc3JjLCBhbHQgfSwgYXR0cnMpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgc2VjdGlvbiBoZWFkaW5nIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IGhlYWRpbmcgdGV4dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBbbGV2ZWw9MV0gKG9wdGlvbmFsKSB0aGUgaGVhZGluZyBsZXZlbCwgZGVmYXVsdDogMVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRIZWFkaW5nKHRleHQsIGxldmVsKSB7XG4gICAgICAgIGNvbnN0IHRhZyA9IGBoJHtsZXZlbH1gO1xuICAgICAgICBjb25zdCBhbGxvd2VkVGFnID0gWydoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNiddLmluY2x1ZGVzKHRhZylcbiAgICAgICAgICAgID8gdGFnXG4gICAgICAgICAgICA6ICdoMSc7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoYWxsb3dlZFRhZywgdGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIHRoZW1hdGljIGJyZWFrICg8aHI+KSB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkU2VwYXJhdG9yKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdocicsIG51bGwpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBsaW5lIGJyZWFrICg8YnI+KSB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkQnJlYWsoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2JyJywgbnVsbCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGJsb2NrcXVvdGUgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBxdW90ZSB0ZXh0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNpdGUgKG9wdGlvbmFsKSBjaXRhdGlvbiB1cmxcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkUXVvdGUodGV4dCwgY2l0ZSkge1xuICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5hc3NpZ24oe30sIChjaXRlICYmIHsgY2l0ZSB9KSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2Jsb2NrcXVvdGUnLCB0ZXh0LCBhdHRycyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGFuY2hvciB0YWcgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBsaW5rIHRleHQvY29udGVudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIGh5cGVybGlua1xuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRMaW5rKHRleHQsIGhyZWYpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnYScsIHRleHQsIHsgaHJlZiB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbn1cbmNvbnN0IF9zdW1tYXJ5ID0gbmV3IFN1bW1hcnkoKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGBjb3JlLnN1bW1hcnlgXG4gKi9cbmV4cG9ydHMubWFya2Rvd25TdW1tYXJ5ID0gX3N1bW1hcnk7XG5leHBvcnRzLnN1bW1hcnkgPSBfc3VtbWFyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1bW1hcnkuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50b1BsYXRmb3JtUGF0aCA9IGV4cG9ydHMudG9XaW4zMlBhdGggPSBleHBvcnRzLnRvUG9zaXhQYXRoID0gdm9pZCAwO1xuY29uc3QgcGF0aCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicGF0aFwiKSk7XG4vKipcbiAqIHRvUG9zaXhQYXRoIGNvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoZSBwb3NpeCBmb3JtLiBPbiBXaW5kb3dzLCBcXFxcIHdpbGwgYmVcbiAqIHJlcGxhY2VkIHdpdGggLy5cbiAqXG4gKiBAcGFyYW0gcHRoLiBQYXRoIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4gc3RyaW5nIFBvc2l4IHBhdGguXG4gKi9cbmZ1bmN0aW9uIHRvUG9zaXhQYXRoKHB0aCkge1xuICAgIHJldHVybiBwdGgucmVwbGFjZSgvW1xcXFxdL2csICcvJyk7XG59XG5leHBvcnRzLnRvUG9zaXhQYXRoID0gdG9Qb3NpeFBhdGg7XG4vKipcbiAqIHRvV2luMzJQYXRoIGNvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoZSB3aW4zMiBmb3JtLiBPbiBMaW51eCwgLyB3aWxsIGJlXG4gKiByZXBsYWNlZCB3aXRoIFxcXFwuXG4gKlxuICogQHBhcmFtIHB0aC4gUGF0aCB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHN0cmluZyBXaW4zMiBwYXRoLlxuICovXG5mdW5jdGlvbiB0b1dpbjMyUGF0aChwdGgpIHtcbiAgICByZXR1cm4gcHRoLnJlcGxhY2UoL1svXS9nLCAnXFxcXCcpO1xufVxuZXhwb3J0cy50b1dpbjMyUGF0aCA9IHRvV2luMzJQYXRoO1xuLyoqXG4gKiB0b1BsYXRmb3JtUGF0aCBjb252ZXJ0cyB0aGUgZ2l2ZW4gcGF0aCB0byBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGguIEl0IGRvZXNcbiAqIHRoaXMgYnkgcmVwbGFjaW5nIGluc3RhbmNlcyBvZiAvIGFuZCBcXCB3aXRoIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoXG4gKiBzZXBhcmF0b3IuXG4gKlxuICogQHBhcmFtIHB0aCBUaGUgcGF0aCB0byBwbGF0Zm9ybWl6ZS5cbiAqIEByZXR1cm4gc3RyaW5nIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoLlxuICovXG5mdW5jdGlvbiB0b1BsYXRmb3JtUGF0aChwdGgpIHtcbiAgICByZXR1cm4gcHRoLnJlcGxhY2UoL1svXFxcXF0vZywgcGF0aC5zZXApO1xufVxuZXhwb3J0cy50b1BsYXRmb3JtUGF0aCA9IHRvUGxhdGZvcm1QYXRoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGF0aC11dGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRDbWRQYXRoID0gZXhwb3J0cy50cnlHZXRFeGVjdXRhYmxlUGF0aCA9IGV4cG9ydHMuaXNSb290ZWQgPSBleHBvcnRzLmlzRGlyZWN0b3J5ID0gZXhwb3J0cy5leGlzdHMgPSBleHBvcnRzLlJFQURPTkxZID0gZXhwb3J0cy5VVl9GU19PX0VYTE9DSyA9IGV4cG9ydHMuSVNfV0lORE9XUyA9IGV4cG9ydHMudW5saW5rID0gZXhwb3J0cy5zeW1saW5rID0gZXhwb3J0cy5zdGF0ID0gZXhwb3J0cy5ybWRpciA9IGV4cG9ydHMucm0gPSBleHBvcnRzLnJlbmFtZSA9IGV4cG9ydHMucmVhZGxpbmsgPSBleHBvcnRzLnJlYWRkaXIgPSBleHBvcnRzLm9wZW4gPSBleHBvcnRzLm1rZGlyID0gZXhwb3J0cy5sc3RhdCA9IGV4cG9ydHMuY29weUZpbGUgPSBleHBvcnRzLmNobW9kID0gdm9pZCAwO1xuY29uc3QgZnMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImZzXCIpKTtcbmNvbnN0IHBhdGggPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInBhdGhcIikpO1xuX2EgPSBmcy5wcm9taXNlc1xuLy8gZXhwb3J0IGNvbnN0IHtvcGVufSA9ICdmcydcbiwgZXhwb3J0cy5jaG1vZCA9IF9hLmNobW9kLCBleHBvcnRzLmNvcHlGaWxlID0gX2EuY29weUZpbGUsIGV4cG9ydHMubHN0YXQgPSBfYS5sc3RhdCwgZXhwb3J0cy5ta2RpciA9IF9hLm1rZGlyLCBleHBvcnRzLm9wZW4gPSBfYS5vcGVuLCBleHBvcnRzLnJlYWRkaXIgPSBfYS5yZWFkZGlyLCBleHBvcnRzLnJlYWRsaW5rID0gX2EucmVhZGxpbmssIGV4cG9ydHMucmVuYW1lID0gX2EucmVuYW1lLCBleHBvcnRzLnJtID0gX2Eucm0sIGV4cG9ydHMucm1kaXIgPSBfYS5ybWRpciwgZXhwb3J0cy5zdGF0ID0gX2Euc3RhdCwgZXhwb3J0cy5zeW1saW5rID0gX2Euc3ltbGluaywgZXhwb3J0cy51bmxpbmsgPSBfYS51bmxpbms7XG4vLyBleHBvcnQgY29uc3Qge29wZW59ID0gJ2ZzJ1xuZXhwb3J0cy5JU19XSU5ET1dTID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9kMDE1M2FlZTM2NzQyMmQwODU4MTA1YWJlYzE4NmRhNGRmZjBhMGM1L2RlcHMvdXYvaW5jbHVkZS91di93aW4uaCNMNjkxXG5leHBvcnRzLlVWX0ZTX09fRVhMT0NLID0gMHgxMDAwMDAwMDtcbmV4cG9ydHMuUkVBRE9OTFkgPSBmcy5jb25zdGFudHMuT19SRE9OTFk7XG5mdW5jdGlvbiBleGlzdHMoZnNQYXRoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHlpZWxkIGV4cG9ydHMuc3RhdChmc1BhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG59XG5leHBvcnRzLmV4aXN0cyA9IGV4aXN0cztcbmZ1bmN0aW9uIGlzRGlyZWN0b3J5KGZzUGF0aCwgdXNlU3RhdCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB1c2VTdGF0ID8geWllbGQgZXhwb3J0cy5zdGF0KGZzUGF0aCkgOiB5aWVsZCBleHBvcnRzLmxzdGF0KGZzUGF0aCk7XG4gICAgICAgIHJldHVybiBzdGF0cy5pc0RpcmVjdG9yeSgpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5pc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5O1xuLyoqXG4gKiBPbiBPU1gvTGludXgsIHRydWUgaWYgcGF0aCBzdGFydHMgd2l0aCAnLycuIE9uIFdpbmRvd3MsIHRydWUgZm9yIHBhdGhzIGxpa2U6XG4gKiBcXCwgXFxoZWxsbywgXFxcXGhlbGxvXFxzaGFyZSwgQzosIGFuZCBDOlxcaGVsbG8gKGFuZCBjb3JyZXNwb25kaW5nIGFsdGVybmF0ZSBzZXBhcmF0b3IgY2FzZXMpLlxuICovXG5mdW5jdGlvbiBpc1Jvb3RlZChwKSB7XG4gICAgcCA9IG5vcm1hbGl6ZVNlcGFyYXRvcnMocCk7XG4gICAgaWYgKCFwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaXNSb290ZWQoKSBwYXJhbWV0ZXIgXCJwXCIgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuICAgIGlmIChleHBvcnRzLklTX1dJTkRPV1MpIHtcbiAgICAgICAgcmV0dXJuIChwLnN0YXJ0c1dpdGgoJ1xcXFwnKSB8fCAvXltBLVpdOi9pLnRlc3QocCkgLy8gZS5nLiBcXCBvciBcXGhlbGxvIG9yIFxcXFxoZWxsb1xuICAgICAgICApOyAvLyBlLmcuIEM6IG9yIEM6XFxoZWxsb1xuICAgIH1cbiAgICByZXR1cm4gcC5zdGFydHNXaXRoKCcvJyk7XG59XG5leHBvcnRzLmlzUm9vdGVkID0gaXNSb290ZWQ7XG4vKipcbiAqIEJlc3QgZWZmb3J0IGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWxlIGV4aXN0cyBhbmQgaXMgZXhlY3V0YWJsZS5cbiAqIEBwYXJhbSBmaWxlUGF0aCAgICBmaWxlIHBhdGggdG8gY2hlY2tcbiAqIEBwYXJhbSBleHRlbnNpb25zICBhZGRpdGlvbmFsIGZpbGUgZXh0ZW5zaW9ucyB0byB0cnlcbiAqIEByZXR1cm4gaWYgZmlsZSBleGlzdHMgYW5kIGlzIGV4ZWN1dGFibGUsIHJldHVybnMgdGhlIGZpbGUgcGF0aC4gb3RoZXJ3aXNlIGVtcHR5IHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gdHJ5R2V0RXhlY3V0YWJsZVBhdGgoZmlsZVBhdGgsIGV4dGVuc2lvbnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgc3RhdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB0ZXN0IGZpbGUgZXhpc3RzXG4gICAgICAgICAgICBzdGF0cyA9IHlpZWxkIGV4cG9ydHMuc3RhdChmaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFVuZXhwZWN0ZWQgZXJyb3IgYXR0ZW1wdGluZyB0byBkZXRlcm1pbmUgaWYgZXhlY3V0YWJsZSBmaWxlIGV4aXN0cyAnJHtmaWxlUGF0aH0nOiAke2Vycn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgIGlmIChleHBvcnRzLklTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgICAgICAvLyBvbiBXaW5kb3dzLCB0ZXN0IGZvciB2YWxpZCBleHRlbnNpb25cbiAgICAgICAgICAgICAgICBjb25zdCB1cHBlckV4dCA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zb21lKHZhbGlkRXh0ID0+IHZhbGlkRXh0LnRvVXBwZXJDYXNlKCkgPT09IHVwcGVyRXh0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzVW5peEV4ZWN1dGFibGUoc3RhdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHJ5IGVhY2ggZXh0ZW5zaW9uXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRmlsZVBhdGggPSBmaWxlUGF0aDtcbiAgICAgICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgZmlsZVBhdGggPSBvcmlnaW5hbEZpbGVQYXRoICsgZXh0ZW5zaW9uO1xuICAgICAgICAgICAgc3RhdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0YXRzID0geWllbGQgZXhwb3J0cy5zdGF0KGZpbGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBVbmV4cGVjdGVkIGVycm9yIGF0dGVtcHRpbmcgdG8gZGV0ZXJtaW5lIGlmIGV4ZWN1dGFibGUgZmlsZSBleGlzdHMgJyR7ZmlsZVBhdGh9JzogJHtlcnJ9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRzICYmIHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cG9ydHMuSVNfV0lORE9XUykge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZSB0aGUgY2FzZSBvZiB0aGUgYWN0dWFsIGZpbGUgKHNpbmNlIGFuIGV4dGVuc2lvbiB3YXMgYXBwZW5kZWQpXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBwZXJOYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYWN0dWFsTmFtZSBvZiB5aWVsZCBleHBvcnRzLnJlYWRkaXIoZGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cHBlck5hbWUgPT09IGFjdHVhbE5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGFjdHVhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBVbmV4cGVjdGVkIGVycm9yIGF0dGVtcHRpbmcgdG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgY2FzZSBvZiB0aGUgZmlsZSAnJHtmaWxlUGF0aH0nOiAke2Vycn1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNVbml4RXhlY3V0YWJsZShzdGF0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG59XG5leHBvcnRzLnRyeUdldEV4ZWN1dGFibGVQYXRoID0gdHJ5R2V0RXhlY3V0YWJsZVBhdGg7XG5mdW5jdGlvbiBub3JtYWxpemVTZXBhcmF0b3JzKHApIHtcbiAgICBwID0gcCB8fCAnJztcbiAgICBpZiAoZXhwb3J0cy5JU19XSU5ET1dTKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgc2xhc2hlcyBvbiBXaW5kb3dzXG4gICAgICAgIHAgPSBwLnJlcGxhY2UoL1xcLy9nLCAnXFxcXCcpO1xuICAgICAgICAvLyByZW1vdmUgcmVkdW5kYW50IHNsYXNoZXNcbiAgICAgICAgcmV0dXJuIHAucmVwbGFjZSgvXFxcXFxcXFwrL2csICdcXFxcJyk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSByZWR1bmRhbnQgc2xhc2hlc1xuICAgIHJldHVybiBwLnJlcGxhY2UoL1xcL1xcLysvZywgJy8nKTtcbn1cbi8vIG9uIE1hYy9MaW51eCwgdGVzdCB0aGUgZXhlY3V0ZSBiaXRcbi8vICAgICBSICAgVyAgWCAgUiAgVyBYIFIgVyBYXG4vLyAgIDI1NiAxMjggNjQgMzIgMTYgOCA0IDIgMVxuZnVuY3Rpb24gaXNVbml4RXhlY3V0YWJsZShzdGF0cykge1xuICAgIHJldHVybiAoKHN0YXRzLm1vZGUgJiAxKSA+IDAgfHxcbiAgICAgICAgKChzdGF0cy5tb2RlICYgOCkgPiAwICYmIHN0YXRzLmdpZCA9PT0gcHJvY2Vzcy5nZXRnaWQoKSkgfHxcbiAgICAgICAgKChzdGF0cy5tb2RlICYgNjQpID4gMCAmJiBzdGF0cy51aWQgPT09IHByb2Nlc3MuZ2V0dWlkKCkpKTtcbn1cbi8vIEdldCB0aGUgcGF0aCBvZiBjbWQuZXhlIGluIHdpbmRvd3NcbmZ1bmN0aW9uIGdldENtZFBhdGgoKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBwcm9jZXNzLmVudlsnQ09NU1BFQyddKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBgY21kLmV4ZWA7XG59XG5leHBvcnRzLmdldENtZFBhdGggPSBnZXRDbWRQYXRoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW8tdXRpbC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5maW5kSW5QYXRoID0gZXhwb3J0cy53aGljaCA9IGV4cG9ydHMubWtkaXJQID0gZXhwb3J0cy5ybVJGID0gZXhwb3J0cy5tdiA9IGV4cG9ydHMuY3AgPSB2b2lkIDA7XG5jb25zdCBhc3NlcnRfMSA9IHJlcXVpcmUoXCJhc3NlcnRcIik7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbmNvbnN0IGlvVXRpbCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9pby11dGlsXCIpKTtcbi8qKlxuICogQ29waWVzIGEgZmlsZSBvciBmb2xkZXIuXG4gKiBCYXNlZCBvZmYgb2Ygc2hlbGxqcyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9zaGVsbGpzL3NoZWxsanMvYmxvYi85MjM3ZjY2YzUyZTVkYWE0MDQ1OGY5NGY5NTY1ZTE4ZTgxMzJmNWE2L3NyYy9jcC5qc1xuICpcbiAqIEBwYXJhbSAgICAgc291cmNlICAgIHNvdXJjZSBwYXRoXG4gKiBAcGFyYW0gICAgIGRlc3QgICAgICBkZXN0aW5hdGlvbiBwYXRoXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgICBvcHRpb25hbC4gU2VlIENvcHlPcHRpb25zLlxuICovXG5mdW5jdGlvbiBjcChzb3VyY2UsIGRlc3QsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHsgZm9yY2UsIHJlY3Vyc2l2ZSwgY29weVNvdXJjZURpcmVjdG9yeSB9ID0gcmVhZENvcHlPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBkZXN0U3RhdCA9ICh5aWVsZCBpb1V0aWwuZXhpc3RzKGRlc3QpKSA/IHlpZWxkIGlvVXRpbC5zdGF0KGRlc3QpIDogbnVsbDtcbiAgICAgICAgLy8gRGVzdCBpcyBhbiBleGlzdGluZyBmaWxlLCBidXQgbm90IGZvcmNpbmdcbiAgICAgICAgaWYgKGRlc3RTdGF0ICYmIGRlc3RTdGF0LmlzRmlsZSgpICYmICFmb3JjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGRlc3QgaXMgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LCBzaG91bGQgY29weSBpbnNpZGUuXG4gICAgICAgIGNvbnN0IG5ld0Rlc3QgPSBkZXN0U3RhdCAmJiBkZXN0U3RhdC5pc0RpcmVjdG9yeSgpICYmIGNvcHlTb3VyY2VEaXJlY3RvcnlcbiAgICAgICAgICAgID8gcGF0aC5qb2luKGRlc3QsIHBhdGguYmFzZW5hbWUoc291cmNlKSlcbiAgICAgICAgICAgIDogZGVzdDtcbiAgICAgICAgaWYgKCEoeWllbGQgaW9VdGlsLmV4aXN0cyhzb3VyY2UpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5OiAke3NvdXJjZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VTdGF0ID0geWllbGQgaW9VdGlsLnN0YXQoc291cmNlKTtcbiAgICAgICAgaWYgKHNvdXJjZVN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgaWYgKCFyZWN1cnNpdmUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjb3B5LiAke3NvdXJjZX0gaXMgYSBkaXJlY3RvcnksIGJ1dCB0cmllZCB0byBjb3B5IHdpdGhvdXQgcmVjdXJzaXZlIGZsYWcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBjcERpclJlY3Vyc2l2ZShzb3VyY2UsIG5ld0Rlc3QsIDAsIGZvcmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwYXRoLnJlbGF0aXZlKHNvdXJjZSwgbmV3RGVzdCkgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgLy8gYSBmaWxlIGNhbm5vdCBiZSBjb3BpZWQgdG8gaXRzZWxmXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuZXdEZXN0fScgYW5kICcke3NvdXJjZX0nIGFyZSB0aGUgc2FtZSBmaWxlYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCBjb3B5RmlsZShzb3VyY2UsIG5ld0Rlc3QsIGZvcmNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0cy5jcCA9IGNwO1xuLyoqXG4gKiBNb3ZlcyBhIHBhdGguXG4gKlxuICogQHBhcmFtICAgICBzb3VyY2UgICAgc291cmNlIHBhdGhcbiAqIEBwYXJhbSAgICAgZGVzdCAgICAgIGRlc3RpbmF0aW9uIHBhdGhcbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgIG9wdGlvbmFsLiBTZWUgTW92ZU9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG12KHNvdXJjZSwgZGVzdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKHlpZWxkIGlvVXRpbC5leGlzdHMoZGVzdCkpIHtcbiAgICAgICAgICAgIGxldCBkZXN0RXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh5aWVsZCBpb1V0aWwuaXNEaXJlY3RvcnkoZGVzdCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBkZXN0IGlzIGRpcmVjdG9yeSBjb3B5IHNyYyBpbnRvIGRlc3RcbiAgICAgICAgICAgICAgICBkZXN0ID0gcGF0aC5qb2luKGRlc3QsIHBhdGguYmFzZW5hbWUoc291cmNlKSk7XG4gICAgICAgICAgICAgICAgZGVzdEV4aXN0cyA9IHlpZWxkIGlvVXRpbC5leGlzdHMoZGVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVzdEV4aXN0cykge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcmNlID09IG51bGwgfHwgb3B0aW9ucy5mb3JjZSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBybVJGKGRlc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZXN0aW5hdGlvbiBhbHJlYWR5IGV4aXN0cycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBta2RpclAocGF0aC5kaXJuYW1lKGRlc3QpKTtcbiAgICAgICAgeWllbGQgaW9VdGlsLnJlbmFtZShzb3VyY2UsIGRlc3QpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5tdiA9IG12O1xuLyoqXG4gKiBSZW1vdmUgYSBwYXRoIHJlY3Vyc2l2ZWx5IHdpdGggZm9yY2VcbiAqXG4gKiBAcGFyYW0gaW5wdXRQYXRoIHBhdGggdG8gcmVtb3ZlXG4gKi9cbmZ1bmN0aW9uIHJtUkYoaW5wdXRQYXRoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKGlvVXRpbC5JU19XSU5ET1dTKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzXG4gICAgICAgICAgICAvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL3dpbjMyL2ZpbGVpby9uYW1pbmctYS1maWxlXG4gICAgICAgICAgICBpZiAoL1sqXCI8PnxdLy50ZXN0KGlucHV0UGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGUgcGF0aCBtdXN0IG5vdCBjb250YWluIGAqYCwgYFwiYCwgYDxgLCBgPmAgb3IgYHxgIG9uIFdpbmRvd3MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gbm90ZSBpZiBwYXRoIGRvZXMgbm90IGV4aXN0LCBlcnJvciBpcyBzaWxlbnRcbiAgICAgICAgICAgIHlpZWxkIGlvVXRpbC5ybShpbnB1dFBhdGgsIHtcbiAgICAgICAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXhSZXRyaWVzOiAzLFxuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXRyeURlbGF5OiAzMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSB3YXMgdW5hYmxlIHRvIGJlIHJlbW92ZWQgJHtlcnJ9YCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydHMucm1SRiA9IHJtUkY7XG4vKipcbiAqIE1ha2UgYSBkaXJlY3RvcnkuICBDcmVhdGVzIHRoZSBmdWxsIHBhdGggd2l0aCBmb2xkZXJzIGluIGJldHdlZW5cbiAqIFdpbGwgdGhyb3cgaWYgaXQgZmFpbHNcbiAqXG4gKiBAcGFyYW0gICBmc1BhdGggICAgICAgIHBhdGggdG8gY3JlYXRlXG4gKiBAcmV0dXJucyBQcm9taXNlPHZvaWQ+XG4gKi9cbmZ1bmN0aW9uIG1rZGlyUChmc1BhdGgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBhc3NlcnRfMS5vayhmc1BhdGgsICdhIHBhdGggYXJndW1lbnQgbXVzdCBiZSBwcm92aWRlZCcpO1xuICAgICAgICB5aWVsZCBpb1V0aWwubWtkaXIoZnNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMubWtkaXJQID0gbWtkaXJQO1xuLyoqXG4gKiBSZXR1cm5zIHBhdGggb2YgYSB0b29sIGhhZCB0aGUgdG9vbCBhY3R1YWxseSBiZWVuIGludm9rZWQuICBSZXNvbHZlcyB2aWEgcGF0aHMuXG4gKiBJZiB5b3UgY2hlY2sgYW5kIHRoZSB0b29sIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIHRocm93LlxuICpcbiAqIEBwYXJhbSAgICAgdG9vbCAgICAgICAgICAgICAgbmFtZSBvZiB0aGUgdG9vbFxuICogQHBhcmFtICAgICBjaGVjayAgICAgICAgICAgICB3aGV0aGVyIHRvIGNoZWNrIGlmIHRvb2wgZXhpc3RzXG4gKiBAcmV0dXJucyAgIFByb21pc2U8c3RyaW5nPiAgIHBhdGggdG8gdG9vbFxuICovXG5mdW5jdGlvbiB3aGljaCh0b29sLCBjaGVjaykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghdG9vbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyICd0b29sJyBpcyByZXF1aXJlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWN1cnNpdmUgd2hlbiBjaGVjaz10cnVlXG4gICAgICAgIGlmIChjaGVjaykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgd2hpY2godG9vbCwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW9VdGlsLklTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbG9jYXRlIGV4ZWN1dGFibGUgZmlsZTogJHt0b29sfS4gUGxlYXNlIHZlcmlmeSBlaXRoZXIgdGhlIGZpbGUgcGF0aCBleGlzdHMgb3IgdGhlIGZpbGUgY2FuIGJlIGZvdW5kIHdpdGhpbiBhIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuIEFsc28gdmVyaWZ5IHRoZSBmaWxlIGhhcyBhIHZhbGlkIGV4dGVuc2lvbiBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbG9jYXRlIGV4ZWN1dGFibGUgZmlsZTogJHt0b29sfS4gUGxlYXNlIHZlcmlmeSBlaXRoZXIgdGhlIGZpbGUgcGF0aCBleGlzdHMgb3IgdGhlIGZpbGUgY2FuIGJlIGZvdW5kIHdpdGhpbiBhIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuIEFsc28gY2hlY2sgdGhlIGZpbGUgbW9kZSB0byB2ZXJpZnkgdGhlIGZpbGUgaXMgZXhlY3V0YWJsZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSB5aWVsZCBmaW5kSW5QYXRoKHRvb2wpO1xuICAgICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcbn1cbmV4cG9ydHMud2hpY2ggPSB3aGljaDtcbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBnaXZlbiB0b29sIG9uIHRoZSBzeXN0ZW0gcGF0aC5cbiAqXG4gKiBAcmV0dXJucyAgIFByb21pc2U8c3RyaW5nW10+ICB0aGUgcGF0aHMgb2YgdGhlIHRvb2xcbiAqL1xuZnVuY3Rpb24gZmluZEluUGF0aCh0b29sKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCF0b29sKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgJ3Rvb2wnIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJ1aWxkIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgdG8gdHJ5XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbXTtcbiAgICAgICAgaWYgKGlvVXRpbC5JU19XSU5ET1dTICYmIHByb2Nlc3MuZW52WydQQVRIRVhUJ10pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXh0ZW5zaW9uIG9mIHByb2Nlc3MuZW52WydQQVRIRVhUJ10uc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnB1c2goZXh0ZW5zaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgaXQncyByb290ZWQsIHJldHVybiBpdCBpZiBleGlzdHMuIG90aGVyd2lzZSByZXR1cm4gZW1wdHkuXG4gICAgICAgIGlmIChpb1V0aWwuaXNSb290ZWQodG9vbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0geWllbGQgaW9VdGlsLnRyeUdldEV4ZWN1dGFibGVQYXRoKHRvb2wsIGV4dGVuc2lvbnMpO1xuICAgICAgICAgICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYW55IHBhdGggc2VwYXJhdG9ycywgcmV0dXJuIGVtcHR5XG4gICAgICAgIGlmICh0b29sLmluY2x1ZGVzKHBhdGguc2VwKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJ1aWxkIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vdGUsIHRlY2huaWNhbGx5IFwid2hlcmVcIiBjaGVja3MgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9uIFdpbmRvd3MuIEZyb20gYSB0b29sa2l0IHBlcnNwZWN0aXZlLFxuICAgICAgICAvLyBpdCBmZWVscyBsaWtlIHdlIHNob3VsZCBub3QgZG8gdGhpcy4gQ2hlY2tpbmcgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNlZW1zIGxpa2UgbW9yZSBvZiBhIHVzZVxuICAgICAgICAvLyBjYXNlIG9mIGEgc2hlbGwsIGFuZCB0aGUgd2hpY2goKSBmdW5jdGlvbiBleHBvc2VkIGJ5IHRoZSB0b29sa2l0IHNob3VsZCBzdHJpdmUgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgIC8vIGFjcm9zcyBwbGF0Zm9ybXMuXG4gICAgICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gW107XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5QQVRIKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcHJvY2Vzcy5lbnYuUEFUSC5zcGxpdChwYXRoLmRlbGltaXRlcikpIHtcbiAgICAgICAgICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rvcmllcy5wdXNoKHApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIGFsbCBtYXRjaGVzXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0geWllbGQgaW9VdGlsLnRyeUdldEV4ZWN1dGFibGVQYXRoKHBhdGguam9pbihkaXJlY3RvcnksIHRvb2wpLCBleHRlbnNpb25zKTtcbiAgICAgICAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgfSk7XG59XG5leHBvcnRzLmZpbmRJblBhdGggPSBmaW5kSW5QYXRoO1xuZnVuY3Rpb24gcmVhZENvcHlPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmb3JjZSA9IG9wdGlvbnMuZm9yY2UgPT0gbnVsbCA/IHRydWUgOiBvcHRpb25zLmZvcmNlO1xuICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IEJvb2xlYW4ob3B0aW9ucy5yZWN1cnNpdmUpO1xuICAgIGNvbnN0IGNvcHlTb3VyY2VEaXJlY3RvcnkgPSBvcHRpb25zLmNvcHlTb3VyY2VEaXJlY3RvcnkgPT0gbnVsbFxuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBCb29sZWFuKG9wdGlvbnMuY29weVNvdXJjZURpcmVjdG9yeSk7XG4gICAgcmV0dXJuIHsgZm9yY2UsIHJlY3Vyc2l2ZSwgY29weVNvdXJjZURpcmVjdG9yeSB9O1xufVxuZnVuY3Rpb24gY3BEaXJSZWN1cnNpdmUoc291cmNlRGlyLCBkZXN0RGlyLCBjdXJyZW50RGVwdGgsIGZvcmNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlIGlzIG5vdCBhIHJ1biBhd2F5IHJlY3Vyc2l2ZSBjb3B5XG4gICAgICAgIGlmIChjdXJyZW50RGVwdGggPj0gMjU1KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjdXJyZW50RGVwdGgrKztcbiAgICAgICAgeWllbGQgbWtkaXJQKGRlc3REaXIpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IHlpZWxkIGlvVXRpbC5yZWFkZGlyKHNvdXJjZURpcik7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyY0ZpbGUgPSBgJHtzb3VyY2VEaXJ9LyR7ZmlsZU5hbWV9YDtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RGaWxlID0gYCR7ZGVzdERpcn0vJHtmaWxlTmFtZX1gO1xuICAgICAgICAgICAgY29uc3Qgc3JjRmlsZVN0YXQgPSB5aWVsZCBpb1V0aWwubHN0YXQoc3JjRmlsZSk7XG4gICAgICAgICAgICBpZiAoc3JjRmlsZVN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2VcbiAgICAgICAgICAgICAgICB5aWVsZCBjcERpclJlY3Vyc2l2ZShzcmNGaWxlLCBkZXN0RmlsZSwgY3VycmVudERlcHRoLCBmb3JjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBjb3B5RmlsZShzcmNGaWxlLCBkZXN0RmlsZSwgZm9yY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoYW5nZSB0aGUgbW9kZSBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3J5XG4gICAgICAgIHlpZWxkIGlvVXRpbC5jaG1vZChkZXN0RGlyLCAoeWllbGQgaW9VdGlsLnN0YXQoc291cmNlRGlyKSkubW9kZSk7XG4gICAgfSk7XG59XG4vLyBCdWZmZXJlZCBmaWxlIGNvcHlcbmZ1bmN0aW9uIGNvcHlGaWxlKHNyY0ZpbGUsIGRlc3RGaWxlLCBmb3JjZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICgoeWllbGQgaW9VdGlsLmxzdGF0KHNyY0ZpbGUpKS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAvLyB1bmxpbmsvcmUtbGluayBpdFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB5aWVsZCBpb1V0aWwubHN0YXQoZGVzdEZpbGUpO1xuICAgICAgICAgICAgICAgIHlpZWxkIGlvVXRpbC51bmxpbmsoZGVzdEZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgdG8gb3ZlcnJpZGUgZmlsZSBwZXJtaXNzaW9uXG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gJ0VQRVJNJykge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBpb1V0aWwuY2htb2QoZGVzdEZpbGUsICcwNjY2Jyk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGlvVXRpbC51bmxpbmsoZGVzdEZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBvdGhlciBlcnJvcnMgPSBpdCBkb2Vzbid0IGV4aXN0LCBubyB3b3JrIHRvIGRvXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb3B5IG92ZXIgc3ltbGlua1xuICAgICAgICAgICAgY29uc3Qgc3ltbGlua0Z1bGwgPSB5aWVsZCBpb1V0aWwucmVhZGxpbmsoc3JjRmlsZSk7XG4gICAgICAgICAgICB5aWVsZCBpb1V0aWwuc3ltbGluayhzeW1saW5rRnVsbCwgZGVzdEZpbGUsIGlvVXRpbC5JU19XSU5ET1dTID8gJ2p1bmN0aW9uJyA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoeWllbGQgaW9VdGlsLmV4aXN0cyhkZXN0RmlsZSkpIHx8IGZvcmNlKSB7XG4gICAgICAgICAgICB5aWVsZCBpb1V0aWwuY29weUZpbGUoc3JjRmlsZSwgZGVzdEZpbGUpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pby5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hcmdTdHJpbmdUb0FycmF5ID0gZXhwb3J0cy5Ub29sUnVubmVyID0gdm9pZCAwO1xuY29uc3Qgb3MgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm9zXCIpKTtcbmNvbnN0IGV2ZW50cyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZXZlbnRzXCIpKTtcbmNvbnN0IGNoaWxkID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJjaGlsZF9wcm9jZXNzXCIpKTtcbmNvbnN0IHBhdGggPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInBhdGhcIikpO1xuY29uc3QgaW8gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2lvXCIpKTtcbmNvbnN0IGlvVXRpbCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvaW8vbGliL2lvLXV0aWxcIikpO1xuY29uc3QgdGltZXJzXzEgPSByZXF1aXJlKFwidGltZXJzXCIpO1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kICovXG5jb25zdCBJU19XSU5ET1dTID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbi8qXG4gKiBDbGFzcyBmb3IgcnVubmluZyBjb21tYW5kIGxpbmUgdG9vbHMuIEhhbmRsZXMgcXVvdGluZyBhbmQgYXJnIHBhcnNpbmcgaW4gYSBwbGF0Zm9ybSBhZ25vc3RpYyB3YXkuXG4gKi9cbmNsYXNzIFRvb2xSdW5uZXIgZXh0ZW5kcyBldmVudHMuRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b29sUGF0aCwgYXJncywgb3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZiAoIXRvb2xQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgJ3Rvb2xQYXRoJyBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b29sUGF0aCA9IHRvb2xQYXRoO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzIHx8IFtdO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIH1cbiAgICBfZGVidWcobWVzc2FnZSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpc3RlbmVycyAmJiB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmRlYnVnKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9nZXRDb21tYW5kU3RyaW5nKG9wdGlvbnMsIG5vUHJlZml4KSB7XG4gICAgICAgIGNvbnN0IHRvb2xQYXRoID0gdGhpcy5fZ2V0U3Bhd25GaWxlTmFtZSgpO1xuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5fZ2V0U3Bhd25BcmdzKG9wdGlvbnMpO1xuICAgICAgICBsZXQgY21kID0gbm9QcmVmaXggPyAnJyA6ICdbY29tbWFuZF0nOyAvLyBvbWl0IHByZWZpeCB3aGVuIHBpcGVkIHRvIGEgc2Vjb25kIHRvb2xcbiAgICAgICAgaWYgKElTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgIC8vIFdpbmRvd3MgKyBjbWQgZmlsZVxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ21kRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgY21kICs9IHRvb2xQYXRoO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCArPSBgICR7YX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdpbmRvd3MgKyB2ZXJiYXRpbVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICBjbWQgKz0gYFwiJHt0b29sUGF0aH1cImA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY21kICs9IGAgJHthfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2luZG93cyAocmVndWxhcilcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNtZCArPSB0aGlzLl93aW5kb3dzUXVvdGVDbWRBcmcodG9vbFBhdGgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCArPSBgICR7dGhpcy5fd2luZG93c1F1b3RlQ21kQXJnKGEpfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gT1NYL0xpbnV4IC0gdGhpcyBjYW4gbGlrZWx5IGJlIGltcHJvdmVkIHdpdGggc29tZSBmb3JtIG9mIHF1b3RpbmcuXG4gICAgICAgICAgICAvLyBjcmVhdGluZyBwcm9jZXNzZXMgb24gVW5peCBpcyBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCB0aGFuIFdpbmRvd3MuXG4gICAgICAgICAgICAvLyBvbiBVbml4LCBleGVjdnAoKSB0YWtlcyBhbiBhcmcgYXJyYXkuXG4gICAgICAgICAgICBjbWQgKz0gdG9vbFBhdGg7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIGNtZCArPSBgICR7YX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfVxuICAgIF9wcm9jZXNzTGluZUJ1ZmZlcihkYXRhLCBzdHJCdWZmZXIsIG9uTGluZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHMgPSBzdHJCdWZmZXIgKyBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBsZXQgbiA9IHMuaW5kZXhPZihvcy5FT0wpO1xuICAgICAgICAgICAgd2hpbGUgKG4gPiAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBzLnN1YnN0cmluZygwLCBuKTtcbiAgICAgICAgICAgICAgICBvbkxpbmUobGluZSk7XG4gICAgICAgICAgICAgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAuLi5cbiAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcobiArIG9zLkVPTC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIG4gPSBzLmluZGV4T2Yob3MuRU9MKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIHN0cmVhbWluZyBsaW5lcyB0byBjb25zb2xlIGlzIGJlc3QgZWZmb3J0LiAgRG9uJ3QgZmFpbCBhIGJ1aWxkLlxuICAgICAgICAgICAgdGhpcy5fZGVidWcoYGVycm9yIHByb2Nlc3NpbmcgbGluZS4gRmFpbGVkIHdpdGggZXJyb3IgJHtlcnJ9YCk7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2dldFNwYXduRmlsZU5hbWUoKSB7XG4gICAgICAgIGlmIChJU19XSU5ET1dTKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNDbWRGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ0NPTVNQRUMnXSB8fCAnY21kLmV4ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudG9vbFBhdGg7XG4gICAgfVxuICAgIF9nZXRTcGF3bkFyZ3Mob3B0aW9ucykge1xuICAgICAgICBpZiAoSVNfV0lORE9XUykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ21kRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFyZ2xpbmUgPSBgL0QgL1MgL0MgXCIke3RoaXMuX3dpbmRvd3NRdW90ZUNtZEFyZyh0aGlzLnRvb2xQYXRoKX1gO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnbGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgIGFyZ2xpbmUgKz0gb3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl93aW5kb3dzUXVvdGVDbWRBcmcoYSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFyZ2xpbmUgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICByZXR1cm4gW2FyZ2xpbmVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3M7XG4gICAgfVxuICAgIF9lbmRzV2l0aChzdHIsIGVuZCkge1xuICAgICAgICByZXR1cm4gc3RyLmVuZHNXaXRoKGVuZCk7XG4gICAgfVxuICAgIF9pc0NtZEZpbGUoKSB7XG4gICAgICAgIGNvbnN0IHVwcGVyVG9vbFBhdGggPSB0aGlzLnRvb2xQYXRoLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fZW5kc1dpdGgodXBwZXJUb29sUGF0aCwgJy5DTUQnKSB8fFxuICAgICAgICAgICAgdGhpcy5fZW5kc1dpdGgodXBwZXJUb29sUGF0aCwgJy5CQVQnKSk7XG4gICAgfVxuICAgIF93aW5kb3dzUXVvdGVDbWRBcmcoYXJnKSB7XG4gICAgICAgIC8vIGZvciAuZXhlLCBhcHBseSB0aGUgbm9ybWFsIHF1b3RpbmcgcnVsZXMgdGhhdCBsaWJ1diBhcHBsaWVzXG4gICAgICAgIGlmICghdGhpcy5faXNDbWRGaWxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91dlF1b3RlQ21kQXJnKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIGFwcGx5IHF1b3RpbmcgcnVsZXMgc3BlY2lmaWMgdG8gdGhlIGNtZC5leGUgY29tbWFuZCBsaW5lIHBhcnNlci5cbiAgICAgICAgLy8gdGhlIGxpYnV2IHJ1bGVzIGFyZSBnZW5lcmljIGFuZCBhcmUgbm90IGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgY21kLmV4ZVxuICAgICAgICAvLyBjb21tYW5kIGxpbmUgcGFyc2VyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgY21kLmV4ZSBjb21tYW5kIGxpbmUgcGFyc2VyLCByZWZlciB0b1xuICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwOTQ2OTkvaG93LWRvZXMtdGhlLXdpbmRvd3MtY29tbWFuZC1pbnRlcnByZXRlci1jbWQtZXhlLXBhcnNlLXNjcmlwdHMvNzk3MDkxMiM3OTcwOTEyXG4gICAgICAgIC8vIG5lZWQgcXVvdGVzIGZvciBlbXB0eSBhcmdcbiAgICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiAnXCJcIic7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZyBuZWVkcyB0byBiZSBxdW90ZWRcbiAgICAgICAgY29uc3QgY21kU3BlY2lhbENoYXJzID0gW1xuICAgICAgICAgICAgJyAnLFxuICAgICAgICAgICAgJ1xcdCcsXG4gICAgICAgICAgICAnJicsXG4gICAgICAgICAgICAnKCcsXG4gICAgICAgICAgICAnKScsXG4gICAgICAgICAgICAnWycsXG4gICAgICAgICAgICAnXScsXG4gICAgICAgICAgICAneycsXG4gICAgICAgICAgICAnfScsXG4gICAgICAgICAgICAnXicsXG4gICAgICAgICAgICAnPScsXG4gICAgICAgICAgICAnOycsXG4gICAgICAgICAgICAnIScsXG4gICAgICAgICAgICBcIidcIixcbiAgICAgICAgICAgICcrJyxcbiAgICAgICAgICAgICcsJyxcbiAgICAgICAgICAgICdgJyxcbiAgICAgICAgICAgICd+JyxcbiAgICAgICAgICAgICd8JyxcbiAgICAgICAgICAgICc8JyxcbiAgICAgICAgICAgICc+JyxcbiAgICAgICAgICAgICdcIidcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IG5lZWRzUXVvdGVzID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiBhcmcpIHtcbiAgICAgICAgICAgIGlmIChjbWRTcGVjaWFsQ2hhcnMuc29tZSh4ID0+IHggPT09IGNoYXIpKSB7XG4gICAgICAgICAgICAgICAgbmVlZHNRdW90ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaWYgcXVvdGVzIG5vdCBuZWVkZWRcbiAgICAgICAgaWYgKCFuZWVkc1F1b3Rlcykge1xuICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHF1b3RpbmcgcnVsZXMgYXJlIHZlcnkgc2ltaWxhciB0byB0aGUgcnVsZXMgdGhhdCBieSBsaWJ1diBhcHBsaWVzLlxuICAgICAgICAvL1xuICAgICAgICAvLyAxKSB3cmFwIHRoZSBzdHJpbmcgaW4gcXVvdGVzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIDIpIGRvdWJsZS11cCBxdW90ZXMgLSBpLmUuIFwiID0+IFwiXCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbGlidXYgcXVvdGluZyBydWxlcy4gbGlidXYgcmVwbGFjZXMgXCIgd2l0aCBcXFwiLCB3aGljaCB1bmZvcnR1bmF0ZWx5XG4gICAgICAgIC8vICAgIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggYSBjbWQuZXhlIGNvbW1hbmQgbGluZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgbm90ZSwgcmVwbGFjaW5nIFwiIHdpdGggXCJcIiBhbHNvIHdvcmtzIHdlbGwgaWYgdGhlIGFyZyBpcyBwYXNzZWQgdG8gYSBkb3duc3RyZWFtIC5ORVQgY29uc29sZSBhcHAuXG4gICAgICAgIC8vICAgIGZvciBleGFtcGxlLCB0aGUgY29tbWFuZCBsaW5lOlxuICAgICAgICAvLyAgICAgICAgICBmb28uZXhlIFwibXlhcmc6XCJcIm15IHZhbFwiXCJcIlxuICAgICAgICAvLyAgICBpcyBwYXJzZWQgYnkgYSAuTkVUIGNvbnNvbGUgYXBwIGludG8gYW4gYXJnIGFycmF5OlxuICAgICAgICAvLyAgICAgICAgICBbIFwibXlhcmc6XFxcIm15IHZhbFxcXCJcIiBdXG4gICAgICAgIC8vICAgIHdoaWNoIGlzIHRoZSBzYW1lIGVuZCByZXN1bHQgd2hlbiBhcHBseWluZyBsaWJ1diBxdW90aW5nIHJ1bGVzLiBhbHRob3VnaCB0aGUgYWN0dWFsXG4gICAgICAgIC8vICAgIGNvbW1hbmQgbGluZSBmcm9tIGxpYnV2IHF1b3RpbmcgcnVsZXMgd291bGQgbG9vayBsaWtlOlxuICAgICAgICAvLyAgICAgICAgICBmb28uZXhlIFwibXlhcmc6XFxcIm15IHZhbFxcXCJcIlxuICAgICAgICAvL1xuICAgICAgICAvLyAzKSBkb3VibGUtdXAgc2xhc2hlcyB0aGF0IHByZWNlZGUgYSBxdW90ZSxcbiAgICAgICAgLy8gICAgZS5nLiAgaGVsbG8gXFx3b3JsZCAgICA9PiBcImhlbGxvIFxcd29ybGRcIlxuICAgICAgICAvLyAgICAgICAgICBoZWxsb1xcXCJ3b3JsZCAgICA9PiBcImhlbGxvXFxcXFwiXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgICAgICAgIGhlbGxvXFxcXFwid29ybGQgICA9PiBcImhlbGxvXFxcXFxcXFxcIlwid29ybGRcIlxuICAgICAgICAvLyAgICAgICAgICBoZWxsbyB3b3JsZFxcICAgID0+IFwiaGVsbG8gd29ybGRcXFxcXCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgdGVjaG5pY2FsbHkgdGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIGEgY21kLmV4ZSBjb21tYW5kIGxpbmUsIG9yIHRoZSBiYXRjaCBhcmd1bWVudCBwYXJzZXIuXG4gICAgICAgIC8vICAgIHRoZSByZWFzb25zIGZvciBpbmNsdWRpbmcgdGhpcyBhcyBhIC5jbWQgcXVvdGluZyBydWxlIGFyZTpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgYSkgdGhpcyBpcyBvcHRpbWl6ZWQgZm9yIHRoZSBzY2VuYXJpbyB3aGVyZSB0aGUgYXJndW1lbnQgaXMgcGFzc2VkIGZyb20gdGhlIC5jbWQgZmlsZSB0byBhblxuICAgICAgICAvLyAgICAgICBleHRlcm5hbCBwcm9ncmFtLiBtYW55IHByb2dyYW1zIChlLmcuIC5ORVQgY29uc29sZSBhcHBzKSByZWx5IG9uIHRoZSBzbGFzaC1kb3VibGluZyBydWxlLlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICBiKSBpdCdzIHdoYXQgd2UndmUgYmVlbiBkb2luZyBwcmV2aW91c2x5IChieSBkZWZlcnJpbmcgdG8gbm9kZSBkZWZhdWx0IGJlaGF2aW9yKSBhbmQgd2VcbiAgICAgICAgLy8gICAgICAgaGF2ZW4ndCBoZWFyZCBhbnkgY29tcGxhaW50cyBhYm91dCB0aGF0IGFzcGVjdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gbm90ZSwgYSB3ZWFrbmVzcyBvZiB0aGUgcXVvdGluZyBydWxlcyBjaG9zZW4gaGVyZSwgaXMgdGhhdCAlIGlzIG5vdCBlc2NhcGVkLiBpbiBmYWN0LCAlIGNhbm5vdCBiZVxuICAgICAgICAvLyBlc2NhcGVkIHdoZW4gdXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGRpcmVjdGx5IC0gZXZlbiB0aG91Z2ggd2l0aGluIGEgLmNtZCBmaWxlICUgY2FuIGJlIGVzY2FwZWRcbiAgICAgICAgLy8gYnkgdXNpbmcgJSUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIHRoZSBzYXZpbmcgZ3JhY2UgaXMsIG9uIHRoZSBjb21tYW5kIGxpbmUsICV2YXIlIGlzIGxlZnQgYXMtaXMgaWYgdmFyIGlzIG5vdCBkZWZpbmVkLiB0aGlzIGNvbnRyYXN0c1xuICAgICAgICAvLyB0aGUgbGluZSBwYXJzaW5nIHJ1bGVzIHdpdGhpbiBhIC5jbWQgZmlsZSwgd2hlcmUgaWYgdmFyIGlzIG5vdCBkZWZpbmVkIGl0IGlzIHJlcGxhY2VkIHdpdGggbm90aGluZy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gb25lIG9wdGlvbiB0aGF0IHdhcyBleHBsb3JlZCB3YXMgcmVwbGFjaW5nICUgd2l0aCBeJSAtIGkuZS4gJXZhciUgPT4gXiV2YXJeJS4gdGhpcyBoYWNrIHdvdWxkXG4gICAgICAgIC8vIG9mdGVuIHdvcmssIHNpbmNlIGl0IGlzIHVubGlrZWx5IHRoYXQgdmFyXiB3b3VsZCBleGlzdCwgYW5kIHRoZSBeIGNoYXJhY3RlciBpcyByZW1vdmVkIHdoZW4gdGhlXG4gICAgICAgIC8vIHZhcmlhYmxlIGlzIHVzZWQuIHRoZSBwcm9ibGVtLCBob3dldmVyLCBpcyB0aGF0IF4gaXMgbm90IHJlbW92ZWQgd2hlbiAlKiBpcyB1c2VkIHRvIHBhc3MgdGhlIGFyZ3NcbiAgICAgICAgLy8gdG8gYW4gZXh0ZXJuYWwgcHJvZ3JhbS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYW4gdW5leHBsb3JlZCBwb3RlbnRpYWwgc29sdXRpb24gZm9yIHRoZSAlIGVzY2FwaW5nIHByb2JsZW0sIGlzIHRvIGNyZWF0ZSBhIHdyYXBwZXIgLmNtZCBmaWxlLlxuICAgICAgICAvLyAlIGNhbiBiZSBlc2NhcGVkIHdpdGhpbiBhIC5jbWQgZmlsZS5cbiAgICAgICAgbGV0IHJldmVyc2UgPSAnXCInO1xuICAgICAgICBsZXQgcXVvdGVIaXQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gYXJnLmxlbmd0aDsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgLy8gd2FsayB0aGUgc3RyaW5nIGluIHJldmVyc2VcbiAgICAgICAgICAgIHJldmVyc2UgKz0gYXJnW2kgLSAxXTtcbiAgICAgICAgICAgIGlmIChxdW90ZUhpdCAmJiBhcmdbaSAtIDFdID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICByZXZlcnNlICs9ICdcXFxcJzsgLy8gZG91YmxlIHRoZSBzbGFzaFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnW2kgLSAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIHF1b3RlSGl0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXZlcnNlICs9ICdcIic7IC8vIGRvdWJsZSB0aGUgcXVvdGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1b3RlSGl0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV2ZXJzZSArPSAnXCInO1xuICAgICAgICByZXR1cm4gcmV2ZXJzZVxuICAgICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgIH1cbiAgICBfdXZRdW90ZUNtZEFyZyhhcmcpIHtcbiAgICAgICAgLy8gVG9vbCBydW5uZXIgd3JhcHMgY2hpbGRfcHJvY2Vzcy5zcGF3bigpIGFuZCBuZWVkcyB0byBhcHBseSB0aGUgc2FtZSBxdW90aW5nIGFzXG4gICAgICAgIC8vIE5vZGUgaW4gY2VydGFpbiBjYXNlcyB3aGVyZSB0aGUgdW5kb2N1bWVudGVkIHNwYXduIG9wdGlvbiB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHNcbiAgICAgICAgLy8gaXMgdXNlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBhIHBvcnQgb2YgcXVvdGVfY21kX2FyZyBmcm9tIE5vZGUgNC54ICh0ZWNobmljYWxseSwgbGliIFVWLFxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvdjQueC9kZXBzL3V2L3NyYy93aW4vcHJvY2Vzcy5jIGZvciBkZXRhaWxzKSxcbiAgICAgICAgLy8gcGFzdGluZyBjb3B5cmlnaHQgbm90aWNlIGZyb20gTm9kZSB3aXRoaW4gdGhpcyBmdW5jdGlvbjpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gICAgICAgIC8vICAgICAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbiAgICAgICAgLy8gICAgICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuICAgICAgICAvLyAgICAgIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuICAgICAgICAvLyAgICAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gICAgICAgIC8vICAgICAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICAgICAgICAvLyAgICAgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgICAgICAgLy8gICAgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAgICAgICAgLy8gICAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgICAgICAgLy8gICAgICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gICAgICAgIC8vICAgICAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiAgICAgICAgLy8gICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4gICAgICAgIC8vICAgICAgSU4gVEhFIFNPRlRXQVJFLlxuICAgICAgICBpZiAoIWFyZykge1xuICAgICAgICAgICAgLy8gTmVlZCBkb3VibGUgcXVvdGF0aW9uIGZvciBlbXB0eSBhcmd1bWVudFxuICAgICAgICAgICAgcmV0dXJuICdcIlwiJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFyZy5pbmNsdWRlcygnICcpICYmICFhcmcuaW5jbHVkZXMoJ1xcdCcpICYmICFhcmcuaW5jbHVkZXMoJ1wiJykpIHtcbiAgICAgICAgICAgIC8vIE5vIHF1b3RhdGlvbiBuZWVkZWRcbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmcuaW5jbHVkZXMoJ1wiJykgJiYgIWFyZy5pbmNsdWRlcygnXFxcXCcpKSB7XG4gICAgICAgICAgICAvLyBObyBlbWJlZGRlZCBkb3VibGUgcXVvdGVzIG9yIGJhY2tzbGFzaGVzLCBzbyBJIGNhbiBqdXN0IHdyYXBcbiAgICAgICAgICAgIC8vIHF1b3RlIG1hcmtzIGFyb3VuZCB0aGUgd2hvbGUgdGhpbmcuXG4gICAgICAgICAgICByZXR1cm4gYFwiJHthcmd9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4cGVjdGVkIGlucHV0L291dHB1dDpcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXCJ3b3JsZFxuICAgICAgICAvLyAgIG91dHB1dDogXCJoZWxsb1xcXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgaW5wdXQgOiBoZWxsb1wiXCJ3b3JsZFxuICAgICAgICAvLyAgIG91dHB1dDogXCJoZWxsb1xcXCJcXFwid29ybGRcIlxuICAgICAgICAvLyAgIGlucHV0IDogaGVsbG9cXHdvcmxkXG4gICAgICAgIC8vICAgb3V0cHV0OiBoZWxsb1xcd29ybGRcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXFxcXHdvcmxkXG4gICAgICAgIC8vICAgb3V0cHV0OiBoZWxsb1xcXFx3b3JsZFxuICAgICAgICAvLyAgIGlucHV0IDogaGVsbG9cXFwid29ybGRcbiAgICAgICAgLy8gICBvdXRwdXQ6IFwiaGVsbG9cXFxcXFxcIndvcmxkXCJcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXFxcXFwid29ybGRcbiAgICAgICAgLy8gICBvdXRwdXQ6IFwiaGVsbG9cXFxcXFxcXFxcXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgaW5wdXQgOiBoZWxsbyB3b3JsZFxcXG4gICAgICAgIC8vICAgb3V0cHV0OiBcImhlbGxvIHdvcmxkXFxcXFwiIC0gbm90ZSB0aGUgY29tbWVudCBpbiBsaWJ1diBhY3R1YWxseSByZWFkcyBcImhlbGxvIHdvcmxkXFxcIlxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGFwcGVhcnMgdGhlIGNvbW1lbnQgaXMgd3JvbmcsIGl0IHNob3VsZCBiZSBcImhlbGxvIHdvcmxkXFxcXFwiXG4gICAgICAgIGxldCByZXZlcnNlID0gJ1wiJztcbiAgICAgICAgbGV0IHF1b3RlSGl0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFyZy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIC8vIHdhbGsgdGhlIHN0cmluZyBpbiByZXZlcnNlXG4gICAgICAgICAgICByZXZlcnNlICs9IGFyZ1tpIC0gMV07XG4gICAgICAgICAgICBpZiAocXVvdGVIaXQgJiYgYXJnW2kgLSAxXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgcmV2ZXJzZSArPSAnXFxcXCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmdbaSAtIDFdID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgcXVvdGVIaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldmVyc2UgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVvdGVIaXQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXZlcnNlICs9ICdcIic7XG4gICAgICAgIHJldHVybiByZXZlcnNlXG4gICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgfVxuICAgIF9jbG9uZUV4ZWNPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGN3ZDogb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIGVudjogb3B0aW9ucy5lbnYgfHwgcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgICBzaWxlbnQ6IG9wdGlvbnMuc2lsZW50IHx8IGZhbHNlLFxuICAgICAgICAgICAgd2luZG93c1ZlcmJhdGltQXJndW1lbnRzOiBvcHRpb25zLndpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyB8fCBmYWxzZSxcbiAgICAgICAgICAgIGZhaWxPblN0ZEVycjogb3B0aW9ucy5mYWlsT25TdGRFcnIgfHwgZmFsc2UsXG4gICAgICAgICAgICBpZ25vcmVSZXR1cm5Db2RlOiBvcHRpb25zLmlnbm9yZVJldHVybkNvZGUgfHwgZmFsc2UsXG4gICAgICAgICAgICBkZWxheTogb3B0aW9ucy5kZWxheSB8fCAxMDAwMFxuICAgICAgICB9O1xuICAgICAgICByZXN1bHQub3V0U3RyZWFtID0gb3B0aW9ucy5vdXRTdHJlYW0gfHwgcHJvY2Vzcy5zdGRvdXQ7XG4gICAgICAgIHJlc3VsdC5lcnJTdHJlYW0gPSBvcHRpb25zLmVyclN0cmVhbSB8fCBwcm9jZXNzLnN0ZGVycjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgX2dldFNwYXduT3B0aW9ucyhvcHRpb25zLCB0b29sUGF0aCkge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIHJlc3VsdC5jd2QgPSBvcHRpb25zLmN3ZDtcbiAgICAgICAgcmVzdWx0LmVudiA9IG9wdGlvbnMuZW52O1xuICAgICAgICByZXN1bHRbJ3dpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyddID1cbiAgICAgICAgICAgIG9wdGlvbnMud2luZG93c1ZlcmJhdGltQXJndW1lbnRzIHx8IHRoaXMuX2lzQ21kRmlsZSgpO1xuICAgICAgICBpZiAob3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcmd2MCA9IGBcIiR7dG9vbFBhdGh9XCJgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWMgYSB0b29sLlxuICAgICAqIE91dHB1dCB3aWxsIGJlIHN0cmVhbWVkIHRvIHRoZSBsaXZlIGNvbnNvbGUuXG4gICAgICogUmV0dXJucyBwcm9taXNlIHdpdGggcmV0dXJuIGNvZGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAgICAgdG9vbCAgICAgcGF0aCB0byB0b29sIHRvIGV4ZWNcbiAgICAgKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsIGV4ZWMgb3B0aW9ucy4gIFNlZSBFeGVjT3B0aW9uc1xuICAgICAqIEByZXR1cm5zICAgbnVtYmVyXG4gICAgICovXG4gICAgZXhlYygpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIHJvb3QgdGhlIHRvb2wgcGF0aCBpZiBpdCBpcyB1bnJvb3RlZCBhbmQgY29udGFpbnMgcmVsYXRpdmUgcGF0aGluZ1xuICAgICAgICAgICAgaWYgKCFpb1V0aWwuaXNSb290ZWQodGhpcy50b29sUGF0aCkgJiZcbiAgICAgICAgICAgICAgICAodGhpcy50b29sUGF0aC5pbmNsdWRlcygnLycpIHx8XG4gICAgICAgICAgICAgICAgICAgIChJU19XSU5ET1dTICYmIHRoaXMudG9vbFBhdGguaW5jbHVkZXMoJ1xcXFwnKSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJlZmVyIG9wdGlvbnMuY3dkIGlmIGl0IGlzIHNwZWNpZmllZCwgaG93ZXZlciBvcHRpb25zLmN3ZCBtYXkgYWxzbyBuZWVkIHRvIGJlIHJvb3RlZFxuICAgICAgICAgICAgICAgIHRoaXMudG9vbFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgdGhpcy5vcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLCB0aGlzLnRvb2xQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHRoZSB0b29sIGlzIG9ubHkgYSBmaWxlIG5hbWUsIHRoZW4gcmVzb2x2ZSBpdCBmcm9tIHRoZSBQQVRIXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgdmVyaWZ5IGl0IGV4aXN0cyAoYWRkIGV4dGVuc2lvbiBvbiBXaW5kb3dzIGlmIG5lY2Vzc2FyeSlcbiAgICAgICAgICAgIHRoaXMudG9vbFBhdGggPSB5aWVsZCBpby53aGljaCh0aGlzLnRvb2xQYXRoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYGV4ZWMgdG9vbDogJHt0aGlzLnRvb2xQYXRofWApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdhcmd1bWVudHM6Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGAgICAke2FyZ31gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uc05vbk51bGwgPSB0aGlzLl9jbG9uZUV4ZWNPcHRpb25zKHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zTm9uTnVsbC5zaWxlbnQgJiYgb3B0aW9uc05vbk51bGwub3V0U3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLm91dFN0cmVhbS53cml0ZSh0aGlzLl9nZXRDb21tYW5kU3RyaW5nKG9wdGlvbnNOb25OdWxsKSArIG9zLkVPTCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gbmV3IEV4ZWNTdGF0ZShvcHRpb25zTm9uTnVsbCwgdGhpcy50b29sUGF0aCk7XG4gICAgICAgICAgICAgICAgc3RhdGUub24oJ2RlYnVnJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jd2QgJiYgISh5aWVsZCBpb1V0aWwuZXhpc3RzKHRoaXMub3B0aW9ucy5jd2QpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgVGhlIGN3ZDogJHt0aGlzLm9wdGlvbnMuY3dkfSBkb2VzIG5vdCBleGlzdCFgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5fZ2V0U3Bhd25GaWxlTmFtZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNwID0gY2hpbGQuc3Bhd24oZmlsZU5hbWUsIHRoaXMuX2dldFNwYXduQXJncyhvcHRpb25zTm9uTnVsbCksIHRoaXMuX2dldFNwYXduT3B0aW9ucyh0aGlzLm9wdGlvbnMsIGZpbGVOYW1lKSk7XG4gICAgICAgICAgICAgICAgbGV0IHN0ZGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgICAgIGlmIChjcC5zdGRvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3Auc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGlzdGVuZXJzICYmIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3Rkb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRvdXQoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNOb25OdWxsLnNpbGVudCAmJiBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW0ud3JpdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGRidWZmZXIgPSB0aGlzLl9wcm9jZXNzTGluZUJ1ZmZlcihkYXRhLCBzdGRidWZmZXIsIChsaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saXN0ZW5lcnMgJiYgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3RkbGluZShsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBlcnJidWZmZXIgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoY3Auc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNwLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzU3RkZXJyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGlzdGVuZXJzICYmIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRlcnIoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNOb25OdWxsLnNpbGVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLmVyclN0cmVhbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLm91dFN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBvcHRpb25zTm9uTnVsbC5mYWlsT25TdGRFcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvcHRpb25zTm9uTnVsbC5lcnJTdHJlYW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy53cml0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVycmJ1ZmZlciA9IHRoaXMuX3Byb2Nlc3NMaW5lQnVmZmVyKGRhdGEsIGVycmJ1ZmZlciwgKGxpbmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpc3RlbmVycyAmJiB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmVycmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5lcnJsaW5lKGxpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3Aub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXJyb3IgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0V4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5DaGVja0NvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY3Aub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXhpdENvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYEV4aXQgY29kZSAke2NvZGV9IHJlY2VpdmVkIGZyb20gdG9vbCAnJHt0aGlzLnRvb2xQYXRofSdgKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuQ2hlY2tDb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNwLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NFeGl0Q29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NFeGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYFNURElPIHN0cmVhbXMgaGF2ZSBjbG9zZWQgZm9yIHRvb2wgJyR7dGhpcy50b29sUGF0aH0nYCk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLkNoZWNrQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5vbignZG9uZScsIChlcnJvciwgZXhpdENvZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3N0ZGxpbmUnLCBzdGRidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJsaW5lJywgZXJyYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjcC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShleGl0Q29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Auc3RkaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2hpbGQgcHJvY2VzcyBtaXNzaW5nIHN0ZGluJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3Auc3RkaW4uZW5kKHRoaXMub3B0aW9ucy5pbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlRvb2xSdW5uZXIgPSBUb29sUnVubmVyO1xuLyoqXG4gKiBDb252ZXJ0IGFuIGFyZyBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgYXJncy4gSGFuZGxlcyBlc2NhcGluZ1xuICpcbiAqIEBwYXJhbSAgICBhcmdTdHJpbmcgICBzdHJpbmcgb2YgYXJndW1lbnRzXG4gKiBAcmV0dXJucyAgc3RyaW5nW10gICAgYXJyYXkgb2YgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGFyZ1N0cmluZ1RvQXJyYXkoYXJnU3RyaW5nKSB7XG4gICAgY29uc3QgYXJncyA9IFtdO1xuICAgIGxldCBpblF1b3RlcyA9IGZhbHNlO1xuICAgIGxldCBlc2NhcGVkID0gZmFsc2U7XG4gICAgbGV0IGFyZyA9ICcnO1xuICAgIGZ1bmN0aW9uIGFwcGVuZChjKSB7XG4gICAgICAgIC8vIHdlIG9ubHkgZXNjYXBlIGRvdWJsZSBxdW90ZXMuXG4gICAgICAgIGlmIChlc2NhcGVkICYmIGMgIT09ICdcIicpIHtcbiAgICAgICAgICAgIGFyZyArPSAnXFxcXCc7XG4gICAgICAgIH1cbiAgICAgICAgYXJnICs9IGM7XG4gICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGFyZ1N0cmluZy5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChjID09PSAnXCInKSB7XG4gICAgICAgICAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICBpblF1b3RlcyA9ICFpblF1b3RlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFwcGVuZChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjID09PSAnXFxcXCcgJiYgZXNjYXBlZCkge1xuICAgICAgICAgICAgYXBwZW5kKGMpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09ICdcXFxcJyAmJiBpblF1b3Rlcykge1xuICAgICAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA9PT0gJyAnICYmICFpblF1b3Rlcykge1xuICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKGFyZyk7XG4gICAgICAgICAgICAgICAgYXJnID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBhcHBlbmQoYyk7XG4gICAgfVxuICAgIGlmIChhcmcubGVuZ3RoID4gMCkge1xuICAgICAgICBhcmdzLnB1c2goYXJnLnRyaW0oKSk7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuZXhwb3J0cy5hcmdTdHJpbmdUb0FycmF5ID0gYXJnU3RyaW5nVG9BcnJheTtcbmNsYXNzIEV4ZWNTdGF0ZSBleHRlbmRzIGV2ZW50cy5FdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIHRvb2xQYXRoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0Nsb3NlZCA9IGZhbHNlOyAvLyB0cmFja3Mgd2hldGhlciB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCBzdGRpbyBpcyBjbG9zZWRcbiAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IgPSAnJztcbiAgICAgICAgdGhpcy5wcm9jZXNzRXhpdENvZGUgPSAwO1xuICAgICAgICB0aGlzLnByb2Nlc3NFeGl0ZWQgPSBmYWxzZTsgLy8gdHJhY2tzIHdoZXRoZXIgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZFxuICAgICAgICB0aGlzLnByb2Nlc3NTdGRlcnIgPSBmYWxzZTsgLy8gdHJhY2tzIHdoZXRoZXIgc3RkZXJyIHdhcyB3cml0dGVuIHRvXG4gICAgICAgIHRoaXMuZGVsYXkgPSAxMDAwMDsgLy8gMTAgc2Vjb25kc1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgaWYgKCF0b29sUGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b29sUGF0aCBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMudG9vbFBhdGggPSB0b29sUGF0aDtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVsYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBvcHRpb25zLmRlbGF5O1xuICAgICAgICB9XG4gICAgfVxuICAgIENoZWNrQ29tcGxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9jZXNzQ2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRSZXN1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb2Nlc3NFeGl0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVyc18xLnNldFRpbWVvdXQoRXhlY1N0YXRlLkhhbmRsZVRpbWVvdXQsIHRoaXMuZGVsYXksIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9kZWJ1ZyhtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZGVidWcnLCBtZXNzYWdlKTtcbiAgICB9XG4gICAgX3NldFJlc3VsdCgpIHtcbiAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgaXMgYW4gZXJyb3JcbiAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICBpZiAodGhpcy5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9jZXNzRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihgVGhlcmUgd2FzIGFuIGVycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBleGVjdXRlIHRoZSBwcm9jZXNzICcke3RoaXMudG9vbFBhdGh9Jy4gVGhpcyBtYXkgaW5kaWNhdGUgdGhlIHByb2Nlc3MgZmFpbGVkIHRvIHN0YXJ0LiBFcnJvcjogJHt0aGlzLnByb2Nlc3NFcnJvcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucHJvY2Vzc0V4aXRDb2RlICE9PSAwICYmICF0aGlzLm9wdGlvbnMuaWdub3JlUmV0dXJuQ29kZSkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKGBUaGUgcHJvY2VzcyAnJHt0aGlzLnRvb2xQYXRofScgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7dGhpcy5wcm9jZXNzRXhpdENvZGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnByb2Nlc3NTdGRlcnIgJiYgdGhpcy5vcHRpb25zLmZhaWxPblN0ZEVycikge1xuICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKGBUaGUgcHJvY2VzcyAnJHt0aGlzLnRvb2xQYXRofScgZmFpbGVkIGJlY2F1c2Ugb25lIG9yIG1vcmUgbGluZXMgd2VyZSB3cml0dGVuIHRvIHRoZSBTVERFUlIgc3RyZWFtYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2xlYXIgdGhlIHRpbWVvdXRcbiAgICAgICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZW1pdCgnZG9uZScsIGVycm9yLCB0aGlzLnByb2Nlc3NFeGl0Q29kZSk7XG4gICAgfVxuICAgIHN0YXRpYyBIYW5kbGVUaW1lb3V0KHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGF0ZS5wcm9jZXNzQ2xvc2VkICYmIHN0YXRlLnByb2Nlc3NFeGl0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVGhlIFNURElPIHN0cmVhbXMgZGlkIG5vdCBjbG9zZSB3aXRoaW4gJHtzdGF0ZS5kZWxheSAvXG4gICAgICAgICAgICAgICAgMTAwMH0gc2Vjb25kcyBvZiB0aGUgZXhpdCBldmVudCBmcm9tIHByb2Nlc3MgJyR7c3RhdGUudG9vbFBhdGh9Jy4gVGhpcyBtYXkgaW5kaWNhdGUgYSBjaGlsZCBwcm9jZXNzIGluaGVyaXRlZCB0aGUgU1RESU8gc3RyZWFtcyBhbmQgaGFzIG5vdCB5ZXQgZXhpdGVkLmA7XG4gICAgICAgICAgICBzdGF0ZS5fZGVidWcobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuX3NldFJlc3VsdCgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRvb2xydW5uZXIuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0RXhlY091dHB1dCA9IGV4cG9ydHMuZXhlYyA9IHZvaWQgMDtcbmNvbnN0IHN0cmluZ19kZWNvZGVyXzEgPSByZXF1aXJlKFwic3RyaW5nX2RlY29kZXJcIik7XG5jb25zdCB0ciA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi90b29scnVubmVyXCIpKTtcbi8qKlxuICogRXhlYyBhIGNvbW1hbmQuXG4gKiBPdXRwdXQgd2lsbCBiZSBzdHJlYW1lZCB0byB0aGUgbGl2ZSBjb25zb2xlLlxuICogUmV0dXJucyBwcm9taXNlIHdpdGggcmV0dXJuIGNvZGVcbiAqXG4gKiBAcGFyYW0gICAgIGNvbW1hbmRMaW5lICAgICAgICBjb21tYW5kIHRvIGV4ZWN1dGUgKGNhbiBpbmNsdWRlIGFkZGl0aW9uYWwgYXJncykuIE11c3QgYmUgY29ycmVjdGx5IGVzY2FwZWQuXG4gKiBAcGFyYW0gICAgIGFyZ3MgICAgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHMgZm9yIHRvb2wuIEVzY2FwaW5nIGlzIGhhbmRsZWQgYnkgdGhlIGxpYi5cbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgICAgICAgICAgIG9wdGlvbmFsIGV4ZWMgb3B0aW9ucy4gIFNlZSBFeGVjT3B0aW9uc1xuICogQHJldHVybnMgICBQcm9taXNlPG51bWJlcj4gICAgZXhpdCBjb2RlXG4gKi9cbmZ1bmN0aW9uIGV4ZWMoY29tbWFuZExpbmUsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBjb21tYW5kQXJncyA9IHRyLmFyZ1N0cmluZ1RvQXJyYXkoY29tbWFuZExpbmUpO1xuICAgICAgICBpZiAoY29tbWFuZEFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmFtZXRlciAnY29tbWFuZExpbmUnIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5LmApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhdGggdG8gdG9vbCB0byBleGVjdXRlIHNob3VsZCBiZSBmaXJzdCBhcmdcbiAgICAgICAgY29uc3QgdG9vbFBhdGggPSBjb21tYW5kQXJnc1swXTtcbiAgICAgICAgYXJncyA9IGNvbW1hbmRBcmdzLnNsaWNlKDEpLmNvbmNhdChhcmdzIHx8IFtdKTtcbiAgICAgICAgY29uc3QgcnVubmVyID0gbmV3IHRyLlRvb2xSdW5uZXIodG9vbFBhdGgsIGFyZ3MsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gcnVubmVyLmV4ZWMoKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZXhlYyA9IGV4ZWM7XG4vKipcbiAqIEV4ZWMgYSBjb21tYW5kIGFuZCBnZXQgdGhlIG91dHB1dC5cbiAqIE91dHB1dCB3aWxsIGJlIHN0cmVhbWVkIHRvIHRoZSBsaXZlIGNvbnNvbGUuXG4gKiBSZXR1cm5zIHByb21pc2Ugd2l0aCB0aGUgZXhpdCBjb2RlIGFuZCBjb2xsZWN0ZWQgc3Rkb3V0IGFuZCBzdGRlcnJcbiAqXG4gKiBAcGFyYW0gICAgIGNvbW1hbmRMaW5lICAgICAgICAgICBjb21tYW5kIHRvIGV4ZWN1dGUgKGNhbiBpbmNsdWRlIGFkZGl0aW9uYWwgYXJncykuIE11c3QgYmUgY29ycmVjdGx5IGVzY2FwZWQuXG4gKiBAcGFyYW0gICAgIGFyZ3MgICAgICAgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHMgZm9yIHRvb2wuIEVzY2FwaW5nIGlzIGhhbmRsZWQgYnkgdGhlIGxpYi5cbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgICAgICAgICAgICAgIG9wdGlvbmFsIGV4ZWMgb3B0aW9ucy4gIFNlZSBFeGVjT3B0aW9uc1xuICogQHJldHVybnMgICBQcm9taXNlPEV4ZWNPdXRwdXQ+ICAgZXhpdCBjb2RlLCBzdGRvdXQsIGFuZCBzdGRlcnJcbiAqL1xuZnVuY3Rpb24gZ2V0RXhlY091dHB1dChjb21tYW5kTGluZSwgYXJncywgb3B0aW9ucykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICAgIC8vVXNpbmcgc3RyaW5nIGRlY29kZXIgY292ZXJzIHRoZSBjYXNlIHdoZXJlIGEgbXVsdC1ieXRlIGNoYXJhY3RlciBpcyBzcGxpdFxuICAgICAgICBjb25zdCBzdGRvdXREZWNvZGVyID0gbmV3IHN0cmluZ19kZWNvZGVyXzEuU3RyaW5nRGVjb2RlcigndXRmOCcpO1xuICAgICAgICBjb25zdCBzdGRlcnJEZWNvZGVyID0gbmV3IHN0cmluZ19kZWNvZGVyXzEuU3RyaW5nRGVjb2RlcigndXRmOCcpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbFN0ZG91dExpc3RlbmVyID0gKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxpc3RlbmVycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0ZG91dDtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGRFcnJMaXN0ZW5lciA9IChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5saXN0ZW5lcnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zdGRlcnI7XG4gICAgICAgIGNvbnN0IHN0ZEVyckxpc3RlbmVyID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHN0ZGVyciArPSBzdGRlcnJEZWNvZGVyLndyaXRlKGRhdGEpO1xuICAgICAgICAgICAgaWYgKG9yaWdpbmFsU3RkRXJyTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFN0ZEVyckxpc3RlbmVyKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdGRPdXRMaXN0ZW5lciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBzdGRvdXQgKz0gc3Rkb3V0RGVjb2Rlci53cml0ZShkYXRhKTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0ZG91dExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxTdGRvdXRMaXN0ZW5lcihkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubGlzdGVuZXJzKSwgeyBzdGRvdXQ6IHN0ZE91dExpc3RlbmVyLCBzdGRlcnI6IHN0ZEVyckxpc3RlbmVyIH0pO1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IHlpZWxkIGV4ZWMoY29tbWFuZExpbmUsIGFyZ3MsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgbGlzdGVuZXJzIH0pKTtcbiAgICAgICAgLy9mbHVzaCBhbnkgcmVtYWluaW5nIGNoYXJhY3RlcnNcbiAgICAgICAgc3Rkb3V0ICs9IHN0ZG91dERlY29kZXIuZW5kKCk7XG4gICAgICAgIHN0ZGVyciArPSBzdGRlcnJEZWNvZGVyLmVuZCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXhpdENvZGUsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnJcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RXhlY091dHB1dCA9IGdldEV4ZWNPdXRwdXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leGVjLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXREZXRhaWxzID0gZXhwb3J0cy5pc0xpbnV4ID0gZXhwb3J0cy5pc01hY09TID0gZXhwb3J0cy5pc1dpbmRvd3MgPSBleHBvcnRzLmFyY2ggPSBleHBvcnRzLnBsYXRmb3JtID0gdm9pZCAwO1xuY29uc3Qgb3NfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwib3NcIikpO1xuY29uc3QgZXhlYyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvZXhlY1wiKSk7XG5jb25zdCBnZXRXaW5kb3dzSW5mbyA9ICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHsgc3Rkb3V0OiB2ZXJzaW9uIH0gPSB5aWVsZCBleGVjLmdldEV4ZWNPdXRwdXQoJ3Bvd2Vyc2hlbGwgLWNvbW1hbmQgXCIoR2V0LUNpbUluc3RhbmNlIC1DbGFzc05hbWUgV2luMzJfT3BlcmF0aW5nU3lzdGVtKS5WZXJzaW9uXCInLCB1bmRlZmluZWQsIHtcbiAgICAgICAgc2lsZW50OiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgeyBzdGRvdXQ6IG5hbWUgfSA9IHlpZWxkIGV4ZWMuZ2V0RXhlY091dHB1dCgncG93ZXJzaGVsbCAtY29tbWFuZCBcIihHZXQtQ2ltSW5zdGFuY2UgLUNsYXNzTmFtZSBXaW4zMl9PcGVyYXRpbmdTeXN0ZW0pLkNhcHRpb25cIicsIHVuZGVmaW5lZCwge1xuICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBuYW1lLnRyaW0oKSxcbiAgICAgICAgdmVyc2lvbjogdmVyc2lvbi50cmltKClcbiAgICB9O1xufSk7XG5jb25zdCBnZXRNYWNPc0luZm8gPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IHlpZWxkIGV4ZWMuZ2V0RXhlY091dHB1dCgnc3dfdmVycycsIHVuZGVmaW5lZCwge1xuICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gKF9iID0gKF9hID0gc3Rkb3V0Lm1hdGNoKC9Qcm9kdWN0VmVyc2lvbjpcXHMqKC4rKS8pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbMV0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xuICAgIGNvbnN0IG5hbWUgPSAoX2QgPSAoX2MgPSBzdGRvdXQubWF0Y2goL1Byb2R1Y3ROYW1lOlxccyooLispLykpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY1sxXSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdmVyc2lvblxuICAgIH07XG59KTtcbmNvbnN0IGdldExpbnV4SW5mbyA9ICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSB5aWVsZCBleGVjLmdldEV4ZWNPdXRwdXQoJ2xzYl9yZWxlYXNlJywgWyctaScsICctcicsICctcyddLCB7XG4gICAgICAgIHNpbGVudDogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IFtuYW1lLCB2ZXJzaW9uXSA9IHN0ZG91dC50cmltKCkuc3BsaXQoJ1xcbicpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHZlcnNpb25cbiAgICB9O1xufSk7XG5leHBvcnRzLnBsYXRmb3JtID0gb3NfMS5kZWZhdWx0LnBsYXRmb3JtKCk7XG5leHBvcnRzLmFyY2ggPSBvc18xLmRlZmF1bHQuYXJjaCgpO1xuZXhwb3J0cy5pc1dpbmRvd3MgPSBleHBvcnRzLnBsYXRmb3JtID09PSAnd2luMzInO1xuZXhwb3J0cy5pc01hY09TID0gZXhwb3J0cy5wbGF0Zm9ybSA9PT0gJ2Rhcndpbic7XG5leHBvcnRzLmlzTGludXggPSBleHBvcnRzLnBsYXRmb3JtID09PSAnbGludXgnO1xuZnVuY3Rpb24gZ2V0RGV0YWlscygpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoeWllbGQgKGV4cG9ydHMuaXNXaW5kb3dzXG4gICAgICAgICAgICA/IGdldFdpbmRvd3NJbmZvKClcbiAgICAgICAgICAgIDogZXhwb3J0cy5pc01hY09TXG4gICAgICAgICAgICAgICAgPyBnZXRNYWNPc0luZm8oKVxuICAgICAgICAgICAgICAgIDogZ2V0TGludXhJbmZvKCkpKSksIHsgcGxhdGZvcm06IGV4cG9ydHMucGxhdGZvcm0sXG4gICAgICAgICAgICBhcmNoOiBleHBvcnRzLmFyY2gsXG4gICAgICAgICAgICBpc1dpbmRvd3M6IGV4cG9ydHMuaXNXaW5kb3dzLFxuICAgICAgICAgICAgaXNNYWNPUzogZXhwb3J0cy5pc01hY09TLFxuICAgICAgICAgICAgaXNMaW51eDogZXhwb3J0cy5pc0xpbnV4IH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXREZXRhaWxzID0gZ2V0RGV0YWlscztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBsYXRmb3JtLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wbGF0Zm9ybSA9IGV4cG9ydHMudG9QbGF0Zm9ybVBhdGggPSBleHBvcnRzLnRvV2luMzJQYXRoID0gZXhwb3J0cy50b1Bvc2l4UGF0aCA9IGV4cG9ydHMubWFya2Rvd25TdW1tYXJ5ID0gZXhwb3J0cy5zdW1tYXJ5ID0gZXhwb3J0cy5nZXRJRFRva2VuID0gZXhwb3J0cy5nZXRTdGF0ZSA9IGV4cG9ydHMuc2F2ZVN0YXRlID0gZXhwb3J0cy5ncm91cCA9IGV4cG9ydHMuZW5kR3JvdXAgPSBleHBvcnRzLnN0YXJ0R3JvdXAgPSBleHBvcnRzLmluZm8gPSBleHBvcnRzLm5vdGljZSA9IGV4cG9ydHMud2FybmluZyA9IGV4cG9ydHMuZXJyb3IgPSBleHBvcnRzLmRlYnVnID0gZXhwb3J0cy5pc0RlYnVnID0gZXhwb3J0cy5zZXRGYWlsZWQgPSBleHBvcnRzLnNldENvbW1hbmRFY2hvID0gZXhwb3J0cy5zZXRPdXRwdXQgPSBleHBvcnRzLmdldEJvb2xlYW5JbnB1dCA9IGV4cG9ydHMuZ2V0TXVsdGlsaW5lSW5wdXQgPSBleHBvcnRzLmdldElucHV0ID0gZXhwb3J0cy5hZGRQYXRoID0gZXhwb3J0cy5zZXRTZWNyZXQgPSBleHBvcnRzLmV4cG9ydFZhcmlhYmxlID0gZXhwb3J0cy5FeGl0Q29kZSA9IHZvaWQgMDtcbmNvbnN0IGNvbW1hbmRfMSA9IHJlcXVpcmUoXCIuL2NvbW1hbmRcIik7XG5jb25zdCBmaWxlX2NvbW1hbmRfMSA9IHJlcXVpcmUoXCIuL2ZpbGUtY29tbWFuZFwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmNvbnN0IG9zID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbmNvbnN0IG9pZGNfdXRpbHNfMSA9IHJlcXVpcmUoXCIuL29pZGMtdXRpbHNcIik7XG4vKipcbiAqIFRoZSBjb2RlIHRvIGV4aXQgYW4gYWN0aW9uXG4gKi9cbnZhciBFeGl0Q29kZTtcbihmdW5jdGlvbiAoRXhpdENvZGUpIHtcbiAgICAvKipcbiAgICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWxcbiAgICAgKi9cbiAgICBFeGl0Q29kZVtFeGl0Q29kZVtcIlN1Y2Nlc3NcIl0gPSAwXSA9IFwiU3VjY2Vzc1wiO1xuICAgIC8qKlxuICAgICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFjdGlvbiB3YXMgYSBmYWlsdXJlXG4gICAgICovXG4gICAgRXhpdENvZGVbRXhpdENvZGVbXCJGYWlsdXJlXCJdID0gMV0gPSBcIkZhaWx1cmVcIjtcbn0pKEV4aXRDb2RlIHx8IChleHBvcnRzLkV4aXRDb2RlID0gRXhpdENvZGUgPSB7fSkpO1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVmFyaWFibGVzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIFNldHMgZW52IHZhcmlhYmxlIGZvciB0aGlzIGFjdGlvbiBhbmQgZnV0dXJlIGFjdGlvbnMgaW4gdGhlIGpvYlxuICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHNldFxuICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLiBOb24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB2aWEgSlNPTi5zdHJpbmdpZnlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIGV4cG9ydFZhcmlhYmxlKG5hbWUsIHZhbCkge1xuICAgIGNvbnN0IGNvbnZlcnRlZFZhbCA9ICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWwpO1xuICAgIHByb2Nlc3MuZW52W25hbWVdID0gY29udmVydGVkVmFsO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9FTlYnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBmaWxlX2NvbW1hbmRfMS5pc3N1ZUZpbGVDb21tYW5kKSgnRU5WJywgKDAsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UpKG5hbWUsIHZhbCkpO1xuICAgIH1cbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCkoJ3NldC1lbnYnLCB7IG5hbWUgfSwgY29udmVydGVkVmFsKTtcbn1cbmV4cG9ydHMuZXhwb3J0VmFyaWFibGUgPSBleHBvcnRWYXJpYWJsZTtcbi8qKlxuICogUmVnaXN0ZXJzIGEgc2VjcmV0IHdoaWNoIHdpbGwgZ2V0IG1hc2tlZCBmcm9tIGxvZ3NcbiAqIEBwYXJhbSBzZWNyZXQgdmFsdWUgb2YgdGhlIHNlY3JldFxuICovXG5mdW5jdGlvbiBzZXRTZWNyZXQoc2VjcmV0KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdhZGQtbWFzaycsIHt9LCBzZWNyZXQpO1xufVxuZXhwb3J0cy5zZXRTZWNyZXQgPSBzZXRTZWNyZXQ7XG4vKipcbiAqIFByZXBlbmRzIGlucHV0UGF0aCB0byB0aGUgUEFUSCAoZm9yIHRoaXMgYWN0aW9uIGFuZCBmdXR1cmUgYWN0aW9ucylcbiAqIEBwYXJhbSBpbnB1dFBhdGhcbiAqL1xuZnVuY3Rpb24gYWRkUGF0aChpbnB1dFBhdGgpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuZW52WydHSVRIVUJfUEFUSCddIHx8ICcnO1xuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICAoMCwgZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCkoJ1BBVEgnLCBpbnB1dFBhdGgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdhZGQtcGF0aCcsIHt9LCBpbnB1dFBhdGgpO1xuICAgIH1cbiAgICBwcm9jZXNzLmVudlsnUEFUSCddID0gYCR7aW5wdXRQYXRofSR7cGF0aC5kZWxpbWl0ZXJ9JHtwcm9jZXNzLmVudlsnUEFUSCddfWA7XG59XG5leHBvcnRzLmFkZFBhdGggPSBhZGRQYXRoO1xuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dC5cbiAqIFVubGVzcyB0cmltV2hpdGVzcGFjZSBpcyBzZXQgdG8gZmFsc2UgaW4gSW5wdXRPcHRpb25zLCB0aGUgdmFsdWUgaXMgYWxzbyB0cmltbWVkLlxuICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgaW5wdXQgdG8gZ2V0XG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsLiBTZWUgSW5wdXRPcHRpb25zLlxuICogQHJldHVybnMgICBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0SW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHZhbCA9IHByb2Nlc3MuZW52W2BJTlBVVF8ke25hbWUucmVwbGFjZSgvIC9nLCAnXycpLnRvVXBwZXJDYXNlKCl9YF0gfHwgJyc7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXF1aXJlZCAmJiAhdmFsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgcmVxdWlyZWQgYW5kIG5vdCBzdXBwbGllZDogJHtuYW1lfWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyaW1XaGl0ZXNwYWNlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsLnRyaW0oKTtcbn1cbmV4cG9ydHMuZ2V0SW5wdXQgPSBnZXRJbnB1dDtcbi8qKlxuICogR2V0cyB0aGUgdmFsdWVzIG9mIGFuIG11bHRpbGluZSBpbnB1dC4gIEVhY2ggdmFsdWUgaXMgYWxzbyB0cmltbWVkLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgaW5wdXQgdG8gZ2V0XG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsLiBTZWUgSW5wdXRPcHRpb25zLlxuICogQHJldHVybnMgICBzdHJpbmdbXVxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0TXVsdGlsaW5lSW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGlucHV0cyA9IGdldElucHV0KG5hbWUsIG9wdGlvbnMpXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLmZpbHRlcih4ID0+IHggIT09ICcnKTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyaW1XaGl0ZXNwYWNlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gaW5wdXRzO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzLm1hcChpbnB1dCA9PiBpbnB1dC50cmltKCkpO1xufVxuZXhwb3J0cy5nZXRNdWx0aWxpbmVJbnB1dCA9IGdldE11bHRpbGluZUlucHV0O1xuLyoqXG4gKiBHZXRzIHRoZSBpbnB1dCB2YWx1ZSBvZiB0aGUgYm9vbGVhbiB0eXBlIGluIHRoZSBZQU1MIDEuMiBcImNvcmUgc2NoZW1hXCIgc3BlY2lmaWNhdGlvbi5cbiAqIFN1cHBvcnQgYm9vbGVhbiBpbnB1dCBsaXN0OiBgdHJ1ZSB8IFRydWUgfCBUUlVFIHwgZmFsc2UgfCBGYWxzZSB8IEZBTFNFYCAuXG4gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsc28gaW4gYm9vbGVhbiB0eXBlLlxuICogcmVmOiBodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDQ5MjNcbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIGlucHV0IHRvIGdldFxuICogQHBhcmFtICAgICBvcHRpb25zICBvcHRpb25hbC4gU2VlIElucHV0T3B0aW9ucy5cbiAqIEByZXR1cm5zICAgYm9vbGVhblxuICovXG5mdW5jdGlvbiBnZXRCb29sZWFuSW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHRydWVWYWx1ZSA9IFsndHJ1ZScsICdUcnVlJywgJ1RSVUUnXTtcbiAgICBjb25zdCBmYWxzZVZhbHVlID0gWydmYWxzZScsICdGYWxzZScsICdGQUxTRSddO1xuICAgIGNvbnN0IHZhbCA9IGdldElucHV0KG5hbWUsIG9wdGlvbnMpO1xuICAgIGlmICh0cnVlVmFsdWUuaW5jbHVkZXModmFsKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGZhbHNlVmFsdWUuaW5jbHVkZXModmFsKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYElucHV0IGRvZXMgbm90IG1lZXQgWUFNTCAxLjIgXCJDb3JlIFNjaGVtYVwiIHNwZWNpZmljYXRpb246ICR7bmFtZX1cXG5gICtcbiAgICAgICAgYFN1cHBvcnQgYm9vbGVhbiBpbnB1dCBsaXN0OiBcXGB0cnVlIHwgVHJ1ZSB8IFRSVUUgfCBmYWxzZSB8IEZhbHNlIHwgRkFMU0VcXGBgKTtcbn1cbmV4cG9ydHMuZ2V0Qm9vbGVhbklucHV0ID0gZ2V0Qm9vbGVhbklucHV0O1xuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBvdXRwdXQuXG4gKlxuICogQHBhcmFtICAgICBuYW1lICAgICBuYW1lIG9mIHRoZSBvdXRwdXQgdG8gc2V0XG4gKiBAcGFyYW0gICAgIHZhbHVlICAgIHZhbHVlIHRvIHN0b3JlLiBOb24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB2aWEgSlNPTi5zdHJpbmdpZnlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIHNldE91dHB1dChuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9PVVRQVVQnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBmaWxlX2NvbW1hbmRfMS5pc3N1ZUZpbGVDb21tYW5kKSgnT1VUUFVUJywgKDAsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UpKG5hbWUsIHZhbHVlKSk7XG4gICAgfVxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG9zLkVPTCk7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdzZXQtb3V0cHV0JywgeyBuYW1lIH0sICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWx1ZSkpO1xufVxuZXhwb3J0cy5zZXRPdXRwdXQgPSBzZXRPdXRwdXQ7XG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGVjaG9pbmcgb2YgY29tbWFuZHMgaW50byBzdGRvdXQgZm9yIHRoZSByZXN0IG9mIHRoZSBzdGVwLlxuICogRWNob2luZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGlmIEFDVElPTlNfU1RFUF9ERUJVRyBpcyBub3Qgc2V0LlxuICpcbiAqL1xuZnVuY3Rpb24gc2V0Q29tbWFuZEVjaG8oZW5hYmxlZCkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWUpKCdlY2hvJywgZW5hYmxlZCA/ICdvbicgOiAnb2ZmJyk7XG59XG5leHBvcnRzLnNldENvbW1hbmRFY2hvID0gc2V0Q29tbWFuZEVjaG87XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXN1bHRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIFNldHMgdGhlIGFjdGlvbiBzdGF0dXMgdG8gZmFpbGVkLlxuICogV2hlbiB0aGUgYWN0aW9uIGV4aXRzIGl0IHdpbGwgYmUgd2l0aCBhbiBleGl0IGNvZGUgb2YgMVxuICogQHBhcmFtIG1lc3NhZ2UgYWRkIGVycm9yIGlzc3VlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gc2V0RmFpbGVkKG1lc3NhZ2UpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gRXhpdENvZGUuRmFpbHVyZTtcbiAgICBlcnJvcihtZXNzYWdlKTtcbn1cbmV4cG9ydHMuc2V0RmFpbGVkID0gc2V0RmFpbGVkO1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTG9nZ2luZyBDb21tYW5kc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBHZXRzIHdoZXRoZXIgQWN0aW9ucyBTdGVwIERlYnVnIGlzIG9uIG9yIG5vdFxuICovXG5mdW5jdGlvbiBpc0RlYnVnKCkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudlsnUlVOTkVSX0RFQlVHJ10gPT09ICcxJztcbn1cbmV4cG9ydHMuaXNEZWJ1ZyA9IGlzRGVidWc7XG4vKipcbiAqIFdyaXRlcyBkZWJ1ZyBtZXNzYWdlIHRvIHVzZXIgbG9nXG4gKiBAcGFyYW0gbWVzc2FnZSBkZWJ1ZyBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGRlYnVnKG1lc3NhZ2UpIHtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCkoJ2RlYnVnJywge30sIG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5kZWJ1ZyA9IGRlYnVnO1xuLyoqXG4gKiBBZGRzIGFuIGVycm9yIGlzc3VlXG4gKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBpc3N1ZSBtZXNzYWdlLiBFcnJvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHZpYSB0b1N0cmluZygpXG4gKiBAcGFyYW0gcHJvcGVydGllcyBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZXJyb3IobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdlcnJvcicsICgwLCB1dGlsc18xLnRvQ29tbWFuZFByb3BlcnRpZXMpKHByb3BlcnRpZXMpLCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IgPyBtZXNzYWdlLnRvU3RyaW5nKCkgOiBtZXNzYWdlKTtcbn1cbmV4cG9ydHMuZXJyb3IgPSBlcnJvcjtcbi8qKlxuICogQWRkcyBhIHdhcm5pbmcgaXNzdWVcbiAqIEBwYXJhbSBtZXNzYWdlIHdhcm5pbmcgaXNzdWUgbWVzc2FnZS4gRXJyb3JzIHdpbGwgYmUgY29udmVydGVkIHRvIHN0cmluZyB2aWEgdG9TdHJpbmcoKVxuICogQHBhcmFtIHByb3BlcnRpZXMgb3B0aW9uYWwgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIGFubm90YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCd3YXJuaW5nJywgKDAsIHV0aWxzXzEudG9Db21tYW5kUHJvcGVydGllcykocHJvcGVydGllcyksIG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvciA/IG1lc3NhZ2UudG9TdHJpbmcoKSA6IG1lc3NhZ2UpO1xufVxuZXhwb3J0cy53YXJuaW5nID0gd2FybmluZztcbi8qKlxuICogQWRkcyBhIG5vdGljZSBpc3N1ZVxuICogQHBhcmFtIG1lc3NhZ2Ugbm90aWNlIGlzc3VlIG1lc3NhZ2UuIEVycm9ycyB3aWxsIGJlIGNvbnZlcnRlZCB0byBzdHJpbmcgdmlhIHRvU3RyaW5nKClcbiAqIEBwYXJhbSBwcm9wZXJ0aWVzIG9wdGlvbmFsIHByb3BlcnRpZXMgdG8gYWRkIHRvIHRoZSBhbm5vdGF0aW9uLlxuICovXG5mdW5jdGlvbiBub3RpY2UobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdub3RpY2UnLCAoMCwgdXRpbHNfMS50b0NvbW1hbmRQcm9wZXJ0aWVzKShwcm9wZXJ0aWVzKSwgbWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yID8gbWVzc2FnZS50b1N0cmluZygpIDogbWVzc2FnZSk7XG59XG5leHBvcnRzLm5vdGljZSA9IG5vdGljZTtcbi8qKlxuICogV3JpdGVzIGluZm8gdG8gbG9nIHdpdGggY29uc29sZS5sb2cuXG4gKiBAcGFyYW0gbWVzc2FnZSBpbmZvIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gaW5mbyhtZXNzYWdlKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobWVzc2FnZSArIG9zLkVPTCk7XG59XG5leHBvcnRzLmluZm8gPSBpbmZvO1xuLyoqXG4gKiBCZWdpbiBhbiBvdXRwdXQgZ3JvdXAuXG4gKlxuICogT3V0cHV0IHVudGlsIHRoZSBuZXh0IGBncm91cEVuZGAgd2lsbCBiZSBmb2xkYWJsZSBpbiB0aGlzIGdyb3VwXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBncm91cFxuICovXG5mdW5jdGlvbiBzdGFydEdyb3VwKG5hbWUpIHtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlKSgnZ3JvdXAnLCBuYW1lKTtcbn1cbmV4cG9ydHMuc3RhcnRHcm91cCA9IHN0YXJ0R3JvdXA7XG4vKipcbiAqIEVuZCBhbiBvdXRwdXQgZ3JvdXAuXG4gKi9cbmZ1bmN0aW9uIGVuZEdyb3VwKCkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWUpKCdlbmRncm91cCcpO1xufVxuZXhwb3J0cy5lbmRHcm91cCA9IGVuZEdyb3VwO1xuLyoqXG4gKiBXcmFwIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjYWxsIGluIGEgZ3JvdXAuXG4gKlxuICogUmV0dXJucyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBmdW5jdGlvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGdyb3VwXG4gKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIHdyYXAgaW4gdGhlIGdyb3VwXG4gKi9cbmZ1bmN0aW9uIGdyb3VwKG5hbWUsIGZuKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgc3RhcnRHcm91cChuYW1lKTtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHlpZWxkIGZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBlbmRHcm91cCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG59XG5leHBvcnRzLmdyb3VwID0gZ3JvdXA7XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXcmFwcGVyIGFjdGlvbiBzdGF0ZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBTYXZlcyBzdGF0ZSBmb3IgY3VycmVudCBhY3Rpb24sIHRoZSBzdGF0ZSBjYW4gb25seSBiZSByZXRyaWV2ZWQgYnkgdGhpcyBhY3Rpb24ncyBwb3N0IGpvYiBleGVjdXRpb24uXG4gKlxuICogQHBhcmFtICAgICBuYW1lICAgICBuYW1lIG9mIHRoZSBzdGF0ZSB0byBzdG9yZVxuICogQHBhcmFtICAgICB2YWx1ZSAgICB2YWx1ZSB0byBzdG9yZS4gTm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdmlhIEpTT04uc3RyaW5naWZ5XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBzYXZlU3RhdGUobmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuZW52WydHSVRIVUJfU1RBVEUnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBmaWxlX2NvbW1hbmRfMS5pc3N1ZUZpbGVDb21tYW5kKSgnU1RBVEUnLCAoMCwgZmlsZV9jb21tYW5kXzEucHJlcGFyZUtleVZhbHVlTWVzc2FnZSkobmFtZSwgdmFsdWUpKTtcbiAgICB9XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdzYXZlLXN0YXRlJywgeyBuYW1lIH0sICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWx1ZSkpO1xufVxuZXhwb3J0cy5zYXZlU3RhdGUgPSBzYXZlU3RhdGU7XG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIHN0YXRlIHNldCBieSB0aGlzIGFjdGlvbidzIG1haW4gZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgc3RhdGUgdG8gZ2V0XG4gKiBAcmV0dXJucyAgIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRTdGF0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W2BTVEFURV8ke25hbWV9YF0gfHwgJyc7XG59XG5leHBvcnRzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG5mdW5jdGlvbiBnZXRJRFRva2VuKGF1ZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiB5aWVsZCBvaWRjX3V0aWxzXzEuT2lkY0NsaWVudC5nZXRJRFRva2VuKGF1ZCk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldElEVG9rZW4gPSBnZXRJRFRva2VuO1xuLyoqXG4gKiBTdW1tYXJ5IGV4cG9ydHNcbiAqL1xudmFyIHN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuL3N1bW1hcnlcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdW1tYXJ5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdW1tYXJ5XzEuc3VtbWFyeTsgfSB9KTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGNvcmUuc3VtbWFyeVxuICovXG52YXIgc3VtbWFyeV8yID0gcmVxdWlyZShcIi4vc3VtbWFyeVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm1hcmtkb3duU3VtbWFyeVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3VtbWFyeV8yLm1hcmtkb3duU3VtbWFyeTsgfSB9KTtcbi8qKlxuICogUGF0aCBleHBvcnRzXG4gKi9cbnZhciBwYXRoX3V0aWxzXzEgPSByZXF1aXJlKFwiLi9wYXRoLXV0aWxzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidG9Qb3NpeFBhdGhcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBhdGhfdXRpbHNfMS50b1Bvc2l4UGF0aDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInRvV2luMzJQYXRoXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXRoX3V0aWxzXzEudG9XaW4zMlBhdGg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0b1BsYXRmb3JtUGF0aFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGF0aF91dGlsc18xLnRvUGxhdGZvcm1QYXRoOyB9IH0pO1xuLyoqXG4gKiBQbGF0Zm9ybSB1dGlsaXRpZXMgZXhwb3J0c1xuICovXG5leHBvcnRzLnBsYXRmb3JtID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3BsYXRmb3JtXCIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvcmUuanMubWFwIiwKICAgICJpbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5pbXBvcnQgeyBkZWJ1ZywgZ2V0SW5wdXQsIHNhdmVTdGF0ZSB9IGZyb20gJ0BhY3Rpb25zL2NvcmUnXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnQGFjdGlvbnMvZXhlYydcbmltcG9ydCB7IGdlbmVyYXRlQ29tcG9zZUZpbGUsIHByb21ldGhldXNDb25maWcsIHlkYkNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZ3MnXG5cbihhc3luYyBmdW5jdGlvbiBtYWluKCkge1xuXHRsZXQgY3dkID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLnNsb1wiKVxuXHRzYXZlU3RhdGUoXCJDV0RcIiwgY3dkKVxuXG5cdGRlYnVnKFwiQ3JlYXRpbmcgd29ya2luZyBkaXJlY3RvcnkuLi5cIilcblx0ZnMubWtkaXJTeW5jKGN3ZCwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuXHR7XG5cdFx0ZGVidWcoXCJDcmVhdGluZyB5ZGIgY29uZmlnLi4uXCIpXG5cdFx0bGV0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oY3dkLCBcInlkYi55YW1sXCIpXG5cdFx0bGV0IGNvbmZpZ0NvbnRlbnQgPSB5ZGJDb25maWdcblx0XHRmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGNvbmZpZ0NvbnRlbnQsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9KVxuXHRcdGRlYnVnKGBDcmVhdGVkIGNvbmZpZyBmb3IgeWRiOiAke2NvbmZpZ1BhdGh9YClcblx0fVxuXG5cdHtcblx0XHRkZWJ1ZyhcIkNyZWF0aW5nIHByb21ldGhldXMgY29uZmlnLi4uXCIpXG5cdFx0bGV0IGNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oY3dkLCBcInByb21ldGhldXMueW1sXCIpXG5cdFx0bGV0IGNvbmZpZ0NvbnRlbnQgPSBwcm9tZXRoZXVzQ29uZmlnXG5cdFx0ZnMud3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBjb25maWdDb250ZW50LCB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSlcblx0XHRkZWJ1ZyhgQ3JlYXRlZCBjb25maWcgZm9yIHByb21ldGhldXM6ICR7Y29uZmlnUGF0aH1gKVxuXHR9XG5cblx0e1xuXHRcdGRlYnVnKFwiQ3JlYXRpbmcgY29tcG9zZSBjb25maWcuLi5cIilcblx0XHRsZXQgY29tcG9zZVBhdGggPSBwYXRoLmpvaW4oY3dkLCBcImNvbXBvc2UueWFtbFwiKVxuXHRcdGxldCBjb21wb3NlQ29udGVudCA9IGdlbmVyYXRlQ29tcG9zZUZpbGUocGFyc2VJbnQoZ2V0SW5wdXQoXCJZREJfREFUQUJBU0VfTk9ERV9DT1VOVFwiLCB7IHJlcXVpcmVkOiB0cnVlIH0pKSlcblx0XHRmcy53cml0ZUZpbGVTeW5jKGNvbXBvc2VQYXRoLCBjb21wb3NlQ29udGVudCwgeyBlbmNvZGluZzogXCJ1dGYtOFwiIH0pXG5cdFx0ZGVidWcoYENyZWF0ZWQgY29tcG9zZS55YW1sOiAke2NvbXBvc2VQYXRofWApXG5cdH1cblxuXHRkZWJ1ZyhcIlN0YXJ0aW5nIFlEQi4uLlwiKVxuXHRhd2FpdCBleGVjKGBkb2NrZXJgLCBbYGNvbXBvc2VgLCBgLWZgLCBgY29tcG9zZS55YW1sYCwgYHVwYCwgYC0tcXVpZXQtcHVsbGAsIGAtZGBdLCB7IGN3ZCB9KVxuXG5cdGxldCBzdGFydCA9IG5ldyBEYXRlKClcblx0ZGVidWcoYFlEQiBzdGFydGVkIGF0ICR7c3RhcnR9YClcblx0c2F2ZVN0YXRlKFwiWURCX1NUQVJUX1RJTUVcIiwgc3RhcnQudG9JU09TdHJpbmcoKSlcbn0pKClcbiIsCiAgICAiLy8gSG9zdFxuZXhwb3J0IGNvbnN0IEhPU1QgPSAnbG9jYWxob3N0J1xuXG4vLyBZREIgU3RhdGljIG5vZGUgY29uZmlndXJhdGlvbi4gUHJlZmVyZSBkbyBub3QgZWRpdC5cbmV4cG9ydCBjb25zdCBZREJfR1JQQ19QT1JUID0gMjEzNVxuZXhwb3J0IGNvbnN0IFlEQl9NT05fUE9SVCA9IDg3NjVcbmV4cG9ydCBjb25zdCBZREJfSUNfUE9SVCA9IDE5MDAxXG5leHBvcnQgY29uc3QgWURCX1RFTkFOVCA9ICcvUm9vdC90ZXN0ZGInXG5cbi8vIFBhc3MgaW50byB3b3JrbG9hZFxuZXhwb3J0IGNvbnN0IFlEQl9FTkRQT0lOVCA9IGBncnBjOi8vJHtIT1NUfToke1lEQl9HUlBDX1BPUlR9YFxuZXhwb3J0IGNvbnN0IFlCRF9DT05ORUNUSU9OX1NUUklORyA9IGAke1lEQl9FTkRQT0lOVH0ke1lEQl9URU5BTlR9YFxuXG5leHBvcnQgY29uc3QgUFJPTUVUSEVVU19QT1JUID0gOTA5MFxuZXhwb3J0IGNvbnN0IFBST01FVEhFVVNfUFVTSEdBVEVXQVlfUE9SVCA9IDkwOTFcblxuZXhwb3J0IGNvbnN0IFBST01FVEhFVVNfVVJMID0gYGh0dHA6Ly8ke0hPU1R9OiR7UFJPTUVUSEVVU19QT1JUfWBcbmV4cG9ydCBjb25zdCBQUk9NRVRIRVVTX1BVU0hHQVRFV0FZX1VSTCA9IGBodHRwOi8vJHtIT1NUfToke1BST01FVEhFVVNfUFVTSEdBVEVXQVlfUE9SVH1gXG4iLAogICAgImltcG9ydCB7XG5cdEhPU1QsXG5cdFBST01FVEhFVVNfUE9SVCxcblx0UFJPTUVUSEVVU19QVVNIR0FURVdBWV9QT1JULFxuXHRZREJfRU5EUE9JTlQsXG5cdFlEQl9HUlBDX1BPUlQsXG5cdFlEQl9JQ19QT1JULFxuXHRZREJfTU9OX1BPUlQsXG5cdFlEQl9URU5BTlQsXG59IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5leHBvcnQgY29uc3QgcHJvbWV0aGV1c0NvbmZpZyA9IC8qKiBZQU1MICovIGBcbmdsb2JhbDpcbiAgc2NyYXBlX2ludGVydmFsOiAxc1xuICBldmFsdWF0aW9uX2ludGVydmFsOiAxc1xuXG5zY3JhcGVfY29uZmlnczpcbiAgLSBqb2JfbmFtZTogJ3B1c2hnYXRld2F5J1xuICAgIHN0YXRpY19jb25maWdzOlxuICAgICAgLSB0YXJnZXRzOiBbJyR7SE9TVH06JHtQUk9NRVRIRVVTX1BVU0hHQVRFV0FZX1BPUlR9J11cbmBcblxuZXhwb3J0IGNvbnN0IHlkYkNvbmZpZyA9IC8qKiBZQU1MICovIGBcbmFjdG9yX3N5c3RlbV9jb25maWc6XG4gIGNwdV9jb3VudDogMVxuICBub2RlX3R5cGU6IFNUT1JBR0VcbiAgdXNlX2F1dG9fY29uZmlnOiB0cnVlXG5ibG9iX3N0b3JhZ2VfY29uZmlnOlxuICBzZXJ2aWNlX3NldDpcbiAgICBncm91cHM6XG4gICAgICAtIGVyYXN1cmVfc3BlY2llczogbm9uZVxuICAgICAgICByaW5nczpcbiAgICAgICAgICAtIGZhaWxfZG9tYWluczpcbiAgICAgICAgICAgICAgLSB2ZGlza19sb2NhdGlvbnM6XG4gICAgICAgICAgICAgICAgICAtIG5vZGVfaWQ6IDFcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogU2VjdG9yTWFwOjE6NjRcbiAgICAgICAgICAgICAgICAgICAgcGRpc2tfY2F0ZWdvcnk6IFNTRFxuY2hhbm5lbF9wcm9maWxlX2NvbmZpZzpcbiAgcHJvZmlsZTpcbiAgICAtIGNoYW5uZWw6XG4gICAgICAgIC0gZXJhc3VyZV9zcGVjaWVzOiBub25lXG4gICAgICAgICAgcGRpc2tfY2F0ZWdvcnk6IDBcbiAgICAgICAgICBzdG9yYWdlX3Bvb2xfa2luZDogc3NkXG4gICAgICAgIC0gZXJhc3VyZV9zcGVjaWVzOiBub25lXG4gICAgICAgICAgcGRpc2tfY2F0ZWdvcnk6IDBcbiAgICAgICAgICBzdG9yYWdlX3Bvb2xfa2luZDogc3NkXG4gICAgICAgIC0gZXJhc3VyZV9zcGVjaWVzOiBub25lXG4gICAgICAgICAgcGRpc2tfY2F0ZWdvcnk6IDBcbiAgICAgICAgICBzdG9yYWdlX3Bvb2xfa2luZDogc3NkXG4gICAgICBwcm9maWxlX2lkOiAwXG5kb21haW5zX2NvbmZpZzpcbiAgZG9tYWluOlxuICAgIC0gbmFtZTogUm9vdFxuICAgICAgc3RvcmFnZV9wb29sX3R5cGVzOlxuICAgICAgICAtIGtpbmQ6IHNzZFxuICAgICAgICAgIHBvb2xfY29uZmlnOlxuICAgICAgICAgICAgYm94X2lkOiAxXG4gICAgICAgICAgICBlcmFzdXJlX3NwZWNpZXM6IG5vbmVcbiAgICAgICAgICAgIGtpbmQ6IHNzZFxuICAgICAgICAgICAgcGRpc2tfZmlsdGVyOlxuICAgICAgICAgICAgICAtIHByb3BlcnR5OlxuICAgICAgICAgICAgICAgICAgLSB0eXBlOiBTU0RcbiAgICAgICAgICAgIHZkaXNrX2tpbmQ6IERlZmF1bHRcbiAgc3RhdGVfc3RvcmFnZTpcbiAgICAtIHJpbmc6XG4gICAgICAgIG5vZGU6XG4gICAgICAgICAgLSAxXG4gICAgICAgIG50b19zZWxlY3Q6IDFcbiAgICAgIHNzaWQ6IDFcbmdycGNfY29uZmlnOlxuICBwb3J0OiAke1lEQl9HUlBDX1BPUlR9XG5ob3N0X2NvbmZpZ3M6XG4gIC0gZHJpdmU6XG4gICAgICAtIHBhdGg6IFNlY3Rvck1hcDoxOjY0XG4gICAgICAgIHR5cGU6IFNTRFxuICAgIGhvc3RfY29uZmlnX2lkOiAxXG5ob3N0czpcbiAgLSBob3N0OiAke0hPU1R9XG4gICAgaG9zdF9jb25maWdfaWQ6IDFcbiAgICBub2RlX2lkOiAxXG4gICAgcG9ydDogJHtZREJfSUNfUE9SVH1cbiAgICB3YWxsZV9sb2NhdGlvbjpcbiAgICAgIGJvZHk6IDFcbiAgICAgIGRhdGFfY2VudGVyOiBhei0xXG4gICAgICByYWNrOiBcIjBcIlxuc3RhdGljX2VyYXN1cmU6IG5vbmVcbmBcblxuLy8gR2VuZXJhdGUgWURCIFN0YXRpYyBOb2RlXG5sZXQgZ2VuZXJhdGVTdGF0aWNOb2RlID0gKCkgPT5cblx0LyoqIFlBTUwgKi8gYFxuICBzdGF0aWMtMDpcbiAgICA8PDogKnlkYi1jb21tb25cbiAgICBjb250YWluZXJfbmFtZTogeWRiLXN0YXRpYy0wXG4gICAgY29tbWFuZDpcbiAgICAgIC0gL29wdC95ZGIvYmluL3lkYmRcbiAgICAgIC0gc2VydmVyXG4gICAgICAtIC0tZ3JwYy1wb3J0XG4gICAgICAtIFwiJHtZREJfR1JQQ19QT1JUfVwiXG4gICAgICAtIC0tbW9uLXBvcnRcbiAgICAgIC0gXCIke1lEQl9NT05fUE9SVH1cIlxuICAgICAgLSAtLWljLXBvcnRcbiAgICAgIC0gXCIke1lEQl9JQ19QT1JUfVwiXG4gICAgICAtIC0teWFtbC1jb25maWdcbiAgICAgIC0gL29wdC95ZGIvY2ZnL2NvbmZpZy55YW1sXG4gICAgICAtIC0tbm9kZVxuICAgICAgLSBzdGF0aWNcbiAgICAgIC0gLS1sYWJlbFxuICAgICAgLSBkZXBsb3ltZW50PWRvY2tlclxuICAgIHBvcnRzOlxuICAgICAgLSAke1lEQl9HUlBDX1BPUlR9OiR7WURCX0dSUENfUE9SVH1cbiAgICAgIC0gJHtZREJfTU9OX1BPUlR9OiR7WURCX01PTl9QT1JUfVxuICAgICAgLSAke1lEQl9JQ19QT1JUfToke1lEQl9JQ19QT1JUfVxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogYmFzaCAtYyBcImV4ZWMgNjw+IC9kZXYvdGNwLyR7SE9TVH0vJHtZREJfR1JQQ19QT1JUfVwiXG4gICAgICBpbnRlcnZhbDogMTBzXG4gICAgICB0aW1lb3V0OiAxc1xuICAgICAgcmV0cmllczogM1xuICAgICAgc3RhcnRfcGVyaW9kOiAzMHNcbiAgICBkZXBsb3k6XG4gICAgICA8PDogKnlkYi1kZXBsb3lcblxuICBzdGF0aWMtaW5pdDpcbiAgICA8PDogKnlkYi1jb21tb25cbiAgICByZXN0YXJ0OiBvbi1mYWlsdXJlXG4gICAgY29udGFpbmVyX25hbWU6IHlkYi1zdGF0aWMtaW5pdFxuICAgIGNvbW1hbmQ6XG4gICAgICAtIC9vcHQveWRiL2Jpbi95ZGJkXG4gICAgICAtIC1zXG4gICAgICAtICR7WURCX0VORFBPSU5UfVxuICAgICAgLSBhZG1pblxuICAgICAgLSBibG9ic3RvcmFnZVxuICAgICAgLSBjb25maWdcbiAgICAgIC0gaW5pdFxuICAgICAgLSAtLXlhbWwtZmlsZVxuICAgICAgLSAvb3B0L3lkYi9jZmcvY29uZmlnLnlhbWxcbiAgICBkZXBlbmRzX29uOlxuICAgICAgc3RhdGljLTA6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG5cbiAgdGVuYW50LWluaXQ6XG4gICAgPDw6ICp5ZGItY29tbW9uXG4gICAgcmVzdGFydDogb24tZmFpbHVyZVxuICAgIGNvbnRhaW5lcl9uYW1lOiB5ZGItdGVuYW50LWluaXRcbiAgICBjb21tYW5kOlxuICAgICAgLSAvb3B0L3lkYi9iaW4veWRiZFxuICAgICAgLSAtc1xuICAgICAgLSAke1lEQl9FTkRQT0lOVH1cbiAgICAgIC0gYWRtaW5cbiAgICAgIC0gZGF0YWJhc2VcbiAgICAgIC0gJHtZREJfVEVOQU5UfVxuICAgICAgLSBjcmVhdGVcbiAgICAgIC0gc3NkOjFcbiAgICBkZXBlbmRzX29uOlxuICAgICAgc3RhdGljLWluaXQ6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9jb21wbGV0ZWRfc3VjY2Vzc2Z1bGx5XG5gLnNsaWNlKDEpXG5cbi8vIEdlbmVyYXRlIFlEQiBEeW5hbWljIE5vZGVcbmxldCBnZW5lcmF0ZUR5bmFtaWNOb2RlID0gKGlkeDogbnVtYmVyKSA9PlxuXHQvKiogWUFNTCAqLyBgXG4gIGR5bmFtaWMtJHtpZHh9OlxuICAgIDw8OiAqeWRiLWNvbW1vblxuICAgIGNvbnRhaW5lcl9uYW1lOiB5ZGItZHluYW1pYy0ke2lkeH1cbiAgICBjb21tYW5kOlxuICAgICAgLSAvb3B0L3lkYi9iaW4veWRiZFxuICAgICAgLSBzZXJ2ZXJcbiAgICAgIC0gLS1ncnBjLXBvcnRcbiAgICAgIC0gXCIke1lEQl9HUlBDX1BPUlQgKyBpZHh9XCJcbiAgICAgIC0gLS1tb24tcG9ydFxuICAgICAgLSBcIiR7WURCX01PTl9QT1JUICsgaWR4fVwiXG4gICAgICAtIC0taWMtcG9ydFxuICAgICAgLSBcIiR7WURCX0lDX1BPUlQgKyBpZHh9XCJcbiAgICAgIC0gLS15YW1sLWNvbmZpZ1xuICAgICAgLSAvb3B0L3lkYi9jZmcvY29uZmlnLnlhbWxcbiAgICAgIC0gLS10ZW5hbnRcbiAgICAgIC0gJHtZREJfVEVOQU5UfVxuICAgICAgLSAtLW5vZGUtYnJva2VyXG4gICAgICAtICR7WURCX0VORFBPSU5UfVxuICAgICAgLSAtLWxhYmVsXG4gICAgICAtIGRlcGxveW1lbnQ9ZG9ja2VyXG4gICAgcG9ydHM6XG4gICAgICAtICR7WURCX0dSUENfUE9SVCArIGlkeH06JHtZREJfR1JQQ19QT1JUICsgaWR4fVxuICAgICAgLSAke1lEQl9NT05fUE9SVCArIGlkeH06JHtZREJfTU9OX1BPUlQgKyBpZHh9XG4gICAgICAtICR7WURCX0lDX1BPUlQgKyBpZHh9OiR7WURCX0lDX1BPUlQgKyBpZHh9XG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OiBiYXNoIC1jIFwiZXhlYyA2PD4gL2Rldi90Y3AvJHtIT1NUfS8ke1lEQl9HUlBDX1BPUlQgKyBpZHh9XCJcbiAgICAgIGludGVydmFsOiAxMHNcbiAgICAgIHRpbWVvdXQ6IDFzXG4gICAgICByZXRyaWVzOiAzXG4gICAgICBzdGFydF9wZXJpb2Q6IDMwc1xuICAgIGRlcGVuZHNfb246XG4gICAgICBzdGF0aWMtMDpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICAgIHN0YXRpYy1pbml0OlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfY29tcGxldGVkX3N1Y2Nlc3NmdWxseVxuICAgICAgdGVuYW50LWluaXQ6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9jb21wbGV0ZWRfc3VjY2Vzc2Z1bGx5XG4gICAgZGVwbG95OlxuICAgICAgPDw6ICp5ZGItZGVwbG95XG5gLnNsaWNlKDEpXG5cbi8vIEdlbmVyYXRlIE1vbml0b3JpbmdcbmxldCBnZW5lcmF0ZU1vbml0b3JpbmcgPSAoKSA9PlxuXHQvKiogWUFNTCAqLyBgXG4gIHByb21ldGhldXM6XG4gICAgaW1hZ2U6IHByb20vcHJvbWV0aGV1c1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgPDw6ICpydW50aW1lXG4gICAgcG9ydHM6XG4gICAgICAtIFwiJHtQUk9NRVRIRVVTX1BPUlR9OiR7UFJPTUVUSEVVU19QT1JUfVwiXG4gICAgdm9sdW1lczpcbiAgICAgIC0gLi9wcm9tZXRoZXVzLnltbDovZXRjL3Byb21ldGhldXMvcHJvbWV0aGV1cy55bWxcbiAgICBkZXBsb3k6ICZtb25pdG9yaW5nLWRlcGxveVxuICAgICAgcmVzb3VyY2VzOlxuICAgICAgICBsaW1pdHM6XG4gICAgICAgICAgY3B1czogJzAuMSdcbiAgICAgICAgICBtZW1vcnk6IDEwMDBNXG4gICAgICAgIHJlc2VydmF0aW9uczpcbiAgICAgICAgICBjcHVzOiAnMC4wMDEnXG4gICAgICAgICAgbWVtb3J5OiA1ME1cblxuICBwcm9tZXRoZXVzLXB1c2hnYXRld2F5OlxuICAgIGltYWdlOiBwcm9tL3B1c2hnYXRld2F5XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICA8PDogKnJ1bnRpbWVcbiAgICBwb3J0czpcbiAgICAgIC0gXCIke1BST01FVEhFVVNfUFVTSEdBVEVXQVlfUE9SVH06JHtQUk9NRVRIRVVTX1BVU0hHQVRFV0FZX1BPUlR9XCJcbiAgICBuZXR3b3JrX21vZGU6IGhvc3RcbiAgICBkZXBsb3k6XG4gICAgICA8PDogKm1vbml0b3JpbmctZGVwbG95XG5gLnNsaWNlKDEpXG5cbi8vIEdlbmVyYXRlIENvbXBvc2VcbmV4cG9ydCBsZXQgZ2VuZXJhdGVDb21wb3NlRmlsZSA9IChcblx0eWRiRGF0YWJhc2VOb2RlQ291bnQ6IG51bWJlclxuKSA9PiAvKiogWUFNTCAqLyBgIyBDb2RlIGdlbmVyYXRlZCBieSBHaXRodWIgQWN0aW9uOyBETyBOT1QgRURJVC5cblxueC1ydW50aW1lOiAmcnVudGltZVxuICBwbGF0Zm9ybTogbGludXgvYW1kNjRcbiAgcHJpdmlsZWdlZDogdHJ1ZVxuICBuZXR3b3JrX21vZGU6IGhvc3RcblxueC1ub2RlOiAmeWRiLWNvbW1vblxuICBpbWFnZTogY3IueWFuZGV4L2NycHRxb251b2RmNTFrZGo3YTdkL3lkYjoyNC4yLjdcbiAgcmVzdGFydDogYWx3YXlzXG4gIGhvc3RuYW1lOiAke0hPU1R9XG4gIDw8OiAqcnVudGltZVxuICB2b2x1bWVzOlxuICAgIC0gLi95ZGIueWFtbDovb3B0L3lkYi9jZmcvY29uZmlnLnlhbWxcblxueC1kZXBsb3k6ICZ5ZGItZGVwbG95XG4gIHJlc3RhcnRfcG9saWN5OlxuICAgIGNvbmRpdGlvbjogYW55XG4gIHJlc291cmNlczpcbiAgICBsaW1pdHM6XG4gICAgICBjcHVzOiAnMSdcbiAgICAgIG1lbW9yeTogMTAwME1cbiAgICByZXNlcnZhdGlvbnM6XG4gICAgICBjcHVzOiAnMC4xJ1xuICAgICAgbWVtb3J5OiAyNTBNXG5cbm5hbWU6IHlkYlxuXG5zZXJ2aWNlczpcbiR7Z2VuZXJhdGVTdGF0aWNOb2RlKCl9XG4ke0FycmF5LmZyb20oeyBsZW5ndGg6IHlkYkRhdGFiYXNlTm9kZUNvdW50IH0sIChfLCBpKSA9PiBpICsgMSlcblx0Lm1hcChnZW5lcmF0ZUR5bmFtaWNOb2RlKVxuXHQuam9pbignXFxuJyl9XG4ke2dlbmVyYXRlTW9uaXRvcmluZygpfVxuYFxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxTQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsRUFBUSw4QkFBOEIseUJBQXNCO0FBSzVELFdBQVMsY0FBYyxDQUFDLE9BQU87QUFDM0IsUUFBSSxVQUFVLFFBQVEsVUFBVSxXQUFXO0FBQ3ZDLGFBQU87QUFBQSxJQUNYLGtCQUNnQixVQUFVLFlBQVksaUJBQWlCLFFBQVE7QUFDM0QsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPLEtBQUssVUFBVSxLQUFLO0FBQUE7QUFFL0IsRUFBUSx5QkFBaUI7QUFPekIsV0FBUyxtQkFBbUIsQ0FBQyxz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T0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FB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QUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUM3QztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQzdDO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDN0M7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUM3QztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQzdDO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDN0M7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEs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QUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUVSLFFBQVE7QUFBQSxFQUNaO0FBQ0EsRUFBUSxzQkFBYztBQUFBLElBQ2xCLFFBQVE7QUFBQSxFQUNaO0FBQ0EsRUFBUSx1QkFBZTtBQUFBLElBQ25CLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUVSLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxFQUNaO0FBQ0EsRUFBUSxxQkFBYSxRQUFRLFVBQVUsT0FBTztBQUM5QyxFQUFRLHVCQUFlLENBQUM7QUFDeEIsU0FBTyxLQUFhLGtCQUFVLEVBQUUsUUFBUSxDQUFDLFFBQVE7QUFDN0MsUUFBSSxLQUFLLEtBQUssR0FBRyxHQUFHO0FBQ2hCLE1BQVEs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QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQ0gsZUFBTztBQUFBO0FBQ0EsZUFBTztBQUFBO0FBQUE7QUFJcEIsU0FBTyxVQUFVO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFBQTs7OztBQy9SQTtBQUFBLElBQ0U7QUFBQSxJQUNBO0FBQUEs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 diff --git a/init/post.js b/init/post.js index 6fb3a83..e69de29 100644 --- a/init/post.js +++ b/init/post.js @@ -1,18785 +0,0 @@ -/* eslint-disable */ -import { createRequire } from "node:module"; -var __create = Object.create; -var __getProtoOf = Object.getPrototypeOf; -var __defProp = Object.defineProperty; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __toESM = (mod, isNodeMode, target) => { - target = mod != null ? __create(__getProtoOf(mod)) : {}; - const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target; - for (let key of __getOwnPropNames(mod)) - if (!__hasOwnProp.call(to, key)) - __defProp(to, key, { - get: () => mod[key], - enumerable: true - }); - return to; -}; -var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports); -var __require = /* @__PURE__ */ createRequire(import.meta.url); - -// ../node_modules/@actions/io/lib/io-util.js -var require_io_util = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var _a; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getCmdPath = exports.tryGetExecutablePath = exports.isRooted = exports.isDirectory = exports.exists = exports.READONLY = exports.UV_FS_O_EXLOCK = exports.IS_WINDOWS = exports.unlink = exports.symlink = exports.stat = exports.rmdir = exports.rm = exports.rename = exports.readlink = exports.readdir = exports.open = exports.mkdir = exports.lstat = exports.copyFile = exports.chmod = undefined; - var fs = __importStar(__require("fs")); - var path = __importStar(__require("path")); - _a = fs.promises, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.open = _a.open, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rm = _a.rm, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink; - exports.IS_WINDOWS = process.platform === "win32"; - exports.UV_FS_O_EXLOCK = 268435456; - exports.READONLY = fs.constants.O_RDONLY; - function exists(fsPath) { - return __awaiter(this, undefined, undefined, function* () { - try { - yield exports.stat(fsPath); - } catch (err) { - if (err.code === "ENOENT") { - return false; - } - throw err; - } - return true; - }); - } - exports.exists = exists; - function isDirectory(fsPath, useStat = false) { - return __awaiter(this, undefined, undefined, function* () { - const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath); - return stats.isDirectory(); - }); - } - exports.isDirectory = isDirectory; - function isRooted(p) { - p = normalizeSeparators(p); - if (!p) { - throw new Error('isRooted() parameter "p" cannot be empty'); - } - if (exports.IS_WINDOWS) { - return p.startsWith("\\") || /^[A-Z]:/i.test(p); - } - return p.startsWith("/"); - } - exports.isRooted = isRooted; - function tryGetExecutablePath(filePath, extensions) { - return __awaiter(this, undefined, undefined, function* () { - let stats = undefined; - try { - stats = yield exports.stat(filePath); - } catch (err) { - if (err.code !== "ENOENT") { - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports.IS_WINDOWS) { - const upperExt = path.extname(filePath).toUpperCase(); - if (extensions.some((validExt) => validExt.toUpperCase() === upperExt)) { - return filePath; - } - } else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - const originalFilePath = filePath; - for (const extension of extensions) { - filePath = originalFilePath + extension; - stats = undefined; - try { - stats = yield exports.stat(filePath); - } catch (err) { - if (err.code !== "ENOENT") { - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports.IS_WINDOWS) { - try { - const directory = path.dirname(filePath); - const upperName = path.basename(filePath).toUpperCase(); - for (const actualName of yield exports.readdir(directory)) { - if (upperName === actualName.toUpperCase()) { - filePath = path.join(directory, actualName); - break; - } - } - } catch (err) { - console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); - } - return filePath; - } else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - } - return ""; - }); - } - exports.tryGetExecutablePath = tryGetExecutablePath; - function normalizeSeparators(p) { - p = p || ""; - if (exports.IS_WINDOWS) { - p = p.replace(/\//g, "\\"); - return p.replace(/\\\\+/g, "\\"); - } - return p.replace(/\/\/+/g, "/"); - } - function isUnixExecutable(stats) { - return (stats.mode & 1) > 0 || (stats.mode & 8) > 0 && stats.gid === process.getgid() || (stats.mode & 64) > 0 && stats.uid === process.getuid(); - } - function getCmdPath() { - var _a2; - return (_a2 = process.env["COMSPEC"]) !== null && _a2 !== undefined ? _a2 : `cmd.exe`; - } - exports.getCmdPath = getCmdPath; -}); - -// ../node_modules/@actions/io/lib/io.js -var require_io = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.findInPath = exports.which = exports.mkdirP = exports.rmRF = exports.mv = exports.cp = undefined; - var assert_1 = __require("assert"); - var path = __importStar(__require("path")); - var ioUtil = __importStar(require_io_util()); - function cp(source, dest, options = {}) { - return __awaiter(this, undefined, undefined, function* () { - const { force, recursive, copySourceDirectory } = readCopyOptions(options); - const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; - if (destStat && destStat.isFile() && !force) { - return; - } - const newDest = destStat && destStat.isDirectory() && copySourceDirectory ? path.join(dest, path.basename(source)) : dest; - if (!(yield ioUtil.exists(source))) { - throw new Error(`no such file or directory: ${source}`); - } - const sourceStat = yield ioUtil.stat(source); - if (sourceStat.isDirectory()) { - if (!recursive) { - throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); - } else { - yield cpDirRecursive(source, newDest, 0, force); - } - } else { - if (path.relative(source, newDest) === "") { - throw new Error(`'${newDest}' and '${source}' are the same file`); - } - yield copyFile(source, newDest, force); - } - }); - } - exports.cp = cp; - function mv(source, dest, options = {}) { - return __awaiter(this, undefined, undefined, function* () { - if (yield ioUtil.exists(dest)) { - let destExists = true; - if (yield ioUtil.isDirectory(dest)) { - dest = path.join(dest, path.basename(source)); - destExists = yield ioUtil.exists(dest); - } - if (destExists) { - if (options.force == null || options.force) { - yield rmRF(dest); - } else { - throw new Error("Destination already exists"); - } - } - } - yield mkdirP(path.dirname(dest)); - yield ioUtil.rename(source, dest); - }); - } - exports.mv = mv; - function rmRF(inputPath) { - return __awaiter(this, undefined, undefined, function* () { - if (ioUtil.IS_WINDOWS) { - if (/[*"<>|]/.test(inputPath)) { - throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows'); - } - } - try { - yield ioUtil.rm(inputPath, { - force: true, - maxRetries: 3, - recursive: true, - retryDelay: 300 - }); - } catch (err) { - throw new Error(`File was unable to be removed ${err}`); - } - }); - } - exports.rmRF = rmRF; - function mkdirP(fsPath) { - return __awaiter(this, undefined, undefined, function* () { - assert_1.ok(fsPath, "a path argument must be provided"); - yield ioUtil.mkdir(fsPath, { recursive: true }); - }); - } - exports.mkdirP = mkdirP; - function which(tool, check) { - return __awaiter(this, undefined, undefined, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - if (check) { - const result = yield which(tool, false); - if (!result) { - if (ioUtil.IS_WINDOWS) { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); - } else { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`); - } - } - return result; - } - const matches = yield findInPath(tool); - if (matches && matches.length > 0) { - return matches[0]; - } - return ""; - }); - } - exports.which = which; - function findInPath(tool) { - return __awaiter(this, undefined, undefined, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - const extensions = []; - if (ioUtil.IS_WINDOWS && process.env["PATHEXT"]) { - for (const extension of process.env["PATHEXT"].split(path.delimiter)) { - if (extension) { - extensions.push(extension); - } - } - } - if (ioUtil.isRooted(tool)) { - const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); - if (filePath) { - return [filePath]; - } - return []; - } - if (tool.includes(path.sep)) { - return []; - } - const directories = []; - if (process.env.PATH) { - for (const p of process.env.PATH.split(path.delimiter)) { - if (p) { - directories.push(p); - } - } - } - const matches = []; - for (const directory of directories) { - const filePath = yield ioUtil.tryGetExecutablePath(path.join(directory, tool), extensions); - if (filePath) { - matches.push(filePath); - } - } - return matches; - }); - } - exports.findInPath = findInPath; - function readCopyOptions(options) { - const force = options.force == null ? true : options.force; - const recursive = Boolean(options.recursive); - const copySourceDirectory = options.copySourceDirectory == null ? true : Boolean(options.copySourceDirectory); - return { force, recursive, copySourceDirectory }; - } - function cpDirRecursive(sourceDir, destDir, currentDepth, force) { - return __awaiter(this, undefined, undefined, function* () { - if (currentDepth >= 255) - return; - currentDepth++; - yield mkdirP(destDir); - const files = yield ioUtil.readdir(sourceDir); - for (const fileName of files) { - const srcFile = `${sourceDir}/${fileName}`; - const destFile = `${destDir}/${fileName}`; - const srcFileStat = yield ioUtil.lstat(srcFile); - if (srcFileStat.isDirectory()) { - yield cpDirRecursive(srcFile, destFile, currentDepth, force); - } else { - yield copyFile(srcFile, destFile, force); - } - } - yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode); - }); - } - function copyFile(srcFile, destFile, force) { - return __awaiter(this, undefined, undefined, function* () { - if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) { - try { - yield ioUtil.lstat(destFile); - yield ioUtil.unlink(destFile); - } catch (e) { - if (e.code === "EPERM") { - yield ioUtil.chmod(destFile, "0666"); - yield ioUtil.unlink(destFile); - } - } - const symlinkFull = yield ioUtil.readlink(srcFile); - yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? "junction" : null); - } else if (!(yield ioUtil.exists(destFile)) || force) { - yield ioUtil.copyFile(srcFile, destFile); - } - }); - } -}); - -// ../node_modules/@actions/exec/lib/toolrunner.js -var require_toolrunner = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.argStringToArray = exports.ToolRunner = undefined; - var os = __importStar(__require("os")); - var events = __importStar(__require("events")); - var child = __importStar(__require("child_process")); - var path = __importStar(__require("path")); - var io = __importStar(require_io()); - var ioUtil = __importStar(require_io_util()); - var timers_1 = __require("timers"); - var IS_WINDOWS = process.platform === "win32"; - - class ToolRunner extends events.EventEmitter { - constructor(toolPath, args, options) { - super(); - if (!toolPath) { - throw new Error("Parameter 'toolPath' cannot be null or empty."); - } - this.toolPath = toolPath; - this.args = args || []; - this.options = options || {}; - } - _debug(message) { - if (this.options.listeners && this.options.listeners.debug) { - this.options.listeners.debug(message); - } - } - _getCommandString(options, noPrefix) { - const toolPath = this._getSpawnFileName(); - const args = this._getSpawnArgs(options); - let cmd = noPrefix ? "" : "[command]"; - if (IS_WINDOWS) { - if (this._isCmdFile()) { - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } else if (options.windowsVerbatimArguments) { - cmd += `"${toolPath}"`; - for (const a of args) { - cmd += ` ${a}`; - } - } else { - cmd += this._windowsQuoteCmdArg(toolPath); - for (const a of args) { - cmd += ` ${this._windowsQuoteCmdArg(a)}`; - } - } - } else { - cmd += toolPath; - for (const a of args) { - cmd += ` ${a}`; - } - } - return cmd; - } - _processLineBuffer(data, strBuffer, onLine) { - try { - let s = strBuffer + data.toString(); - let n = s.indexOf(os.EOL); - while (n > -1) { - const line = s.substring(0, n); - onLine(line); - s = s.substring(n + os.EOL.length); - n = s.indexOf(os.EOL); - } - return s; - } catch (err) { - this._debug(`error processing line. Failed with error ${err}`); - return ""; - } - } - _getSpawnFileName() { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - return process.env["COMSPEC"] || "cmd.exe"; - } - } - return this.toolPath; - } - _getSpawnArgs(options) { - if (IS_WINDOWS) { - if (this._isCmdFile()) { - let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; - for (const a of this.args) { - argline += " "; - argline += options.windowsVerbatimArguments ? a : this._windowsQuoteCmdArg(a); - } - argline += '"'; - return [argline]; - } - } - return this.args; - } - _endsWith(str, end) { - return str.endsWith(end); - } - _isCmdFile() { - const upperToolPath = this.toolPath.toUpperCase(); - return this._endsWith(upperToolPath, ".CMD") || this._endsWith(upperToolPath, ".BAT"); - } - _windowsQuoteCmdArg(arg) { - if (!this._isCmdFile()) { - return this._uvQuoteCmdArg(arg); - } - if (!arg) { - return '""'; - } - const cmdSpecialChars = [ - " ", - "\t", - "&", - "(", - ")", - "[", - "]", - "{", - "}", - "^", - "=", - ";", - "!", - "'", - "+", - ",", - "`", - "~", - "|", - "<", - ">", - '"' - ]; - let needsQuotes = false; - for (const char of arg) { - if (cmdSpecialChars.some((x) => x === char)) { - needsQuotes = true; - break; - } - } - if (!needsQuotes) { - return arg; - } - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length;i > 0; i--) { - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === "\\") { - reverse += "\\"; - } else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += '"'; - } else { - quoteHit = false; - } - } - reverse += '"'; - return reverse.split("").reverse().join(""); - } - _uvQuoteCmdArg(arg) { - if (!arg) { - return '""'; - } - if (!arg.includes(" ") && !arg.includes("\t") && !arg.includes('"')) { - return arg; - } - if (!arg.includes('"') && !arg.includes("\\")) { - return `"${arg}"`; - } - let reverse = '"'; - let quoteHit = true; - for (let i = arg.length;i > 0; i--) { - reverse += arg[i - 1]; - if (quoteHit && arg[i - 1] === "\\") { - reverse += "\\"; - } else if (arg[i - 1] === '"') { - quoteHit = true; - reverse += "\\"; - } else { - quoteHit = false; - } - } - reverse += '"'; - return reverse.split("").reverse().join(""); - } - _cloneExecOptions(options) { - options = options || {}; - const result = { - cwd: options.cwd || process.cwd(), - env: options.env || process.env, - silent: options.silent || false, - windowsVerbatimArguments: options.windowsVerbatimArguments || false, - failOnStdErr: options.failOnStdErr || false, - ignoreReturnCode: options.ignoreReturnCode || false, - delay: options.delay || 1e4 - }; - result.outStream = options.outStream || process.stdout; - result.errStream = options.errStream || process.stderr; - return result; - } - _getSpawnOptions(options, toolPath) { - options = options || {}; - const result = {}; - result.cwd = options.cwd; - result.env = options.env; - result["windowsVerbatimArguments"] = options.windowsVerbatimArguments || this._isCmdFile(); - if (options.windowsVerbatimArguments) { - result.argv0 = `"${toolPath}"`; - } - return result; - } - exec() { - return __awaiter(this, undefined, undefined, function* () { - if (!ioUtil.isRooted(this.toolPath) && (this.toolPath.includes("/") || IS_WINDOWS && this.toolPath.includes("\\"))) { - this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath); - } - this.toolPath = yield io.which(this.toolPath, true); - return new Promise((resolve, reject) => __awaiter(this, undefined, undefined, function* () { - this._debug(`exec tool: ${this.toolPath}`); - this._debug("arguments:"); - for (const arg of this.args) { - this._debug(` ${arg}`); - } - const optionsNonNull = this._cloneExecOptions(this.options); - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); - } - const state = new ExecState(optionsNonNull, this.toolPath); - state.on("debug", (message) => { - this._debug(message); - }); - if (this.options.cwd && !(yield ioUtil.exists(this.options.cwd))) { - return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`)); - } - const fileName = this._getSpawnFileName(); - const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); - let stdbuffer = ""; - if (cp.stdout) { - cp.stdout.on("data", (data) => { - if (this.options.listeners && this.options.listeners.stdout) { - this.options.listeners.stdout(data); - } - if (!optionsNonNull.silent && optionsNonNull.outStream) { - optionsNonNull.outStream.write(data); - } - stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => { - if (this.options.listeners && this.options.listeners.stdline) { - this.options.listeners.stdline(line); - } - }); - }); - } - let errbuffer = ""; - if (cp.stderr) { - cp.stderr.on("data", (data) => { - state.processStderr = true; - if (this.options.listeners && this.options.listeners.stderr) { - this.options.listeners.stderr(data); - } - if (!optionsNonNull.silent && optionsNonNull.errStream && optionsNonNull.outStream) { - const s = optionsNonNull.failOnStdErr ? optionsNonNull.errStream : optionsNonNull.outStream; - s.write(data); - } - errbuffer = this._processLineBuffer(data, errbuffer, (line) => { - if (this.options.listeners && this.options.listeners.errline) { - this.options.listeners.errline(line); - } - }); - }); - } - cp.on("error", (err) => { - state.processError = err.message; - state.processExited = true; - state.processClosed = true; - state.CheckComplete(); - }); - cp.on("exit", (code) => { - state.processExitCode = code; - state.processExited = true; - this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); - state.CheckComplete(); - }); - cp.on("close", (code) => { - state.processExitCode = code; - state.processExited = true; - state.processClosed = true; - this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); - state.CheckComplete(); - }); - state.on("done", (error, exitCode) => { - if (stdbuffer.length > 0) { - this.emit("stdline", stdbuffer); - } - if (errbuffer.length > 0) { - this.emit("errline", errbuffer); - } - cp.removeAllListeners(); - if (error) { - reject(error); - } else { - resolve(exitCode); - } - }); - if (this.options.input) { - if (!cp.stdin) { - throw new Error("child process missing stdin"); - } - cp.stdin.end(this.options.input); - } - })); - }); - } - } - exports.ToolRunner = ToolRunner; - function argStringToArray(argString) { - const args = []; - let inQuotes = false; - let escaped = false; - let arg = ""; - function append(c) { - if (escaped && c !== '"') { - arg += "\\"; - } - arg += c; - escaped = false; - } - for (let i = 0;i < argString.length; i++) { - const c = argString.charAt(i); - if (c === '"') { - if (!escaped) { - inQuotes = !inQuotes; - } else { - append(c); - } - continue; - } - if (c === "\\" && escaped) { - append(c); - continue; - } - if (c === "\\" && inQuotes) { - escaped = true; - continue; - } - if (c === " " && !inQuotes) { - if (arg.length > 0) { - args.push(arg); - arg = ""; - } - continue; - } - append(c); - } - if (arg.length > 0) { - args.push(arg.trim()); - } - return args; - } - exports.argStringToArray = argStringToArray; - - class ExecState extends events.EventEmitter { - constructor(options, toolPath) { - super(); - this.processClosed = false; - this.processError = ""; - this.processExitCode = 0; - this.processExited = false; - this.processStderr = false; - this.delay = 1e4; - this.done = false; - this.timeout = null; - if (!toolPath) { - throw new Error("toolPath must not be empty"); - } - this.options = options; - this.toolPath = toolPath; - if (options.delay) { - this.delay = options.delay; - } - } - CheckComplete() { - if (this.done) { - return; - } - if (this.processClosed) { - this._setResult(); - } else if (this.processExited) { - this.timeout = timers_1.setTimeout(ExecState.HandleTimeout, this.delay, this); - } - } - _debug(message) { - this.emit("debug", message); - } - _setResult() { - let error; - if (this.processExited) { - if (this.processError) { - error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`); - } else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { - error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); - } else if (this.processStderr && this.options.failOnStdErr) { - error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); - } - } - if (this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } - this.done = true; - this.emit("done", error, this.processExitCode); - } - static HandleTimeout(state) { - if (state.done) { - return; - } - if (!state.processClosed && state.processExited) { - const message = `The STDIO streams did not close within ${state.delay / 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`; - state._debug(message); - } - state._setResult(); - } - } -}); - -// ../node_modules/@actions/exec/lib/exec.js -var require_exec = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { - return m[k]; - } }); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getExecOutput = exports.exec = undefined; - var string_decoder_1 = __require("string_decoder"); - var tr = __importStar(require_toolrunner()); - function exec(commandLine, args, options) { - return __awaiter(this, undefined, undefined, function* () { - const commandArgs = tr.argStringToArray(commandLine); - if (commandArgs.length === 0) { - throw new Error(`Parameter 'commandLine' cannot be null or empty.`); - } - const toolPath = commandArgs[0]; - args = commandArgs.slice(1).concat(args || []); - const runner = new tr.ToolRunner(toolPath, args, options); - return runner.exec(); - }); - } - exports.exec = exec; - function getExecOutput(commandLine, args, options) { - var _a, _b; - return __awaiter(this, undefined, undefined, function* () { - let stdout = ""; - let stderr = ""; - const stdoutDecoder = new string_decoder_1.StringDecoder("utf8"); - const stderrDecoder = new string_decoder_1.StringDecoder("utf8"); - const originalStdoutListener = (_a = options === null || options === undefined ? undefined : options.listeners) === null || _a === undefined ? undefined : _a.stdout; - const originalStdErrListener = (_b = options === null || options === undefined ? undefined : options.listeners) === null || _b === undefined ? undefined : _b.stderr; - const stdErrListener = (data) => { - stderr += stderrDecoder.write(data); - if (originalStdErrListener) { - originalStdErrListener(data); - } - }; - const stdOutListener = (data) => { - stdout += stdoutDecoder.write(data); - if (originalStdoutListener) { - originalStdoutListener(data); - } - }; - const listeners = Object.assign(Object.assign({}, options === null || options === undefined ? undefined : options.listeners), { stdout: stdOutListener, stderr: stdErrListener }); - const exitCode = yield exec(commandLine, args, Object.assign(Object.assign({}, options), { listeners })); - stdout += stdoutDecoder.end(); - stderr += stderrDecoder.end(); - return { - exitCode, - stdout, - stderr - }; - }); - } - exports.getExecOutput = getExecOutput; -}); - -// ../node_modules/@actions/core/lib/utils.js -var require_utils = __commonJS((exports) => { - Object.defineProperty(exports, "__esModule", { value: true }); - exports.toCommandProperties = exports.toCommandValue = undefined; - function toCommandValue(input) { - if (input === null || input === undefined) { - return ""; - } else if (typeof input === "string" || input instanceof String) { - return input; - } - return JSON.stringify(input); - } - exports.toCommandValue = toCommandValue; - function toCommandProperties(annotationProperties) { - if (!Object.keys(annotationProperties).length) { - return {}; - } - return { - title: annotationProperties.title, - file: annotationProperties.file, - line: annotationProperties.startLine, - endLine: annotationProperties.endLine, - col: annotationProperties.startColumn, - endColumn: annotationProperties.endColumn - }; - } - exports.toCommandProperties = toCommandProperties; -}); - -// ../node_modules/@actions/core/lib/command.js -var require_command = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.issue = exports.issueCommand = undefined; - var os = __importStar(__require("os")); - var utils_1 = require_utils(); - function issueCommand(command, properties, message) { - const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os.EOL); - } - exports.issueCommand = issueCommand; - function issue(name, message = "") { - issueCommand(name, {}, message); - } - exports.issue = issue; - var CMD_STRING = "::"; - - class Command { - constructor(command, properties, message) { - if (!command) { - command = "missing.command"; - } - this.command = command; - this.properties = properties; - this.message = message; - } - toString() { - let cmdStr = CMD_STRING + this.command; - if (this.properties && Object.keys(this.properties).length > 0) { - cmdStr += " "; - let first = true; - for (const key in this.properties) { - if (this.properties.hasOwnProperty(key)) { - const val = this.properties[key]; - if (val) { - if (first) { - first = false; - } else { - cmdStr += ","; - } - cmdStr += `${key}=${escapeProperty(val)}`; - } - } - } - } - cmdStr += `${CMD_STRING}${escapeData(this.message)}`; - return cmdStr; - } - } - function escapeData(s) { - return (0, utils_1.toCommandValue)(s).replace(/%/g, "%25").replace(/\r/g, "%0D").replace(/\n/g, "%0A"); - } - function escapeProperty(s) { - return (0, utils_1.toCommandValue)(s).replace(/%/g, "%25").replace(/\r/g, "%0D").replace(/\n/g, "%0A").replace(/:/g, "%3A").replace(/,/g, "%2C"); - } -}); - -// ../node_modules/@actions/core/lib/file-command.js -var require_file_command = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.prepareKeyValueMessage = exports.issueFileCommand = undefined; - var crypto = __importStar(__require("crypto")); - var fs = __importStar(__require("fs")); - var os = __importStar(__require("os")); - var utils_1 = require_utils(); - function issueFileCommand(command, message) { - const filePath = process.env[`GITHUB_${command}`]; - if (!filePath) { - throw new Error(`Unable to find environment variable for file command ${command}`); - } - if (!fs.existsSync(filePath)) { - throw new Error(`Missing file at path: ${filePath}`); - } - fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, { - encoding: "utf8" - }); - } - exports.issueFileCommand = issueFileCommand; - function prepareKeyValueMessage(key, value) { - const delimiter = `ghadelimiter_${crypto.randomUUID()}`; - const convertedValue = (0, utils_1.toCommandValue)(value); - if (key.includes(delimiter)) { - throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`); - } - if (convertedValue.includes(delimiter)) { - throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); - } - return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; - } - exports.prepareKeyValueMessage = prepareKeyValueMessage; -}); - -// ../node_modules/@actions/http-client/lib/proxy.js -var require_proxy = __commonJS((exports) => { - Object.defineProperty(exports, "__esModule", { value: true }); - exports.checkBypass = exports.getProxyUrl = undefined; - function getProxyUrl(reqUrl) { - const usingSsl = reqUrl.protocol === "https:"; - if (checkBypass(reqUrl)) { - return; - } - const proxyVar = (() => { - if (usingSsl) { - return process.env["https_proxy"] || process.env["HTTPS_PROXY"]; - } else { - return process.env["http_proxy"] || process.env["HTTP_PROXY"]; - } - })(); - if (proxyVar) { - try { - return new DecodedURL(proxyVar); - } catch (_a) { - if (!proxyVar.startsWith("http://") && !proxyVar.startsWith("https://")) - return new DecodedURL(`http://${proxyVar}`); - } - } else { - return; - } - } - exports.getProxyUrl = getProxyUrl; - function checkBypass(reqUrl) { - if (!reqUrl.hostname) { - return false; - } - const reqHost = reqUrl.hostname; - if (isLoopbackAddress(reqHost)) { - return true; - } - const noProxy = process.env["no_proxy"] || process.env["NO_PROXY"] || ""; - if (!noProxy) { - return false; - } - let reqPort; - if (reqUrl.port) { - reqPort = Number(reqUrl.port); - } else if (reqUrl.protocol === "http:") { - reqPort = 80; - } else if (reqUrl.protocol === "https:") { - reqPort = 443; - } - const upperReqHosts = [reqUrl.hostname.toUpperCase()]; - if (typeof reqPort === "number") { - upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); - } - for (const upperNoProxyItem of noProxy.split(",").map((x) => x.trim().toUpperCase()).filter((x) => x)) { - if (upperNoProxyItem === "*" || upperReqHosts.some((x) => x === upperNoProxyItem || x.endsWith(`.${upperNoProxyItem}`) || upperNoProxyItem.startsWith(".") && x.endsWith(`${upperNoProxyItem}`))) { - return true; - } - } - return false; - } - exports.checkBypass = checkBypass; - function isLoopbackAddress(host) { - const hostLower = host.toLowerCase(); - return hostLower === "localhost" || hostLower.startsWith("127.") || hostLower.startsWith("[::1]") || hostLower.startsWith("[0:0:0:0:0:0:0:1]"); - } - - class DecodedURL extends URL { - constructor(url, base) { - super(url, base); - this._decodedUsername = decodeURIComponent(super.username); - this._decodedPassword = decodeURIComponent(super.password); - } - get username() { - return this._decodedUsername; - } - get password() { - return this._decodedPassword; - } - } -}); - -// ../node_modules/tunnel/lib/tunnel.js -var require_tunnel = __commonJS((exports) => { - var net = __require("net"); - var tls = __require("tls"); - var http = __require("http"); - var https = __require("https"); - var events = __require("events"); - var assert = __require("assert"); - var util = __require("util"); - exports.httpOverHttp = httpOverHttp; - exports.httpsOverHttp = httpsOverHttp; - exports.httpOverHttps = httpOverHttps; - exports.httpsOverHttps = httpsOverHttps; - function httpOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - return agent; - } - function httpsOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; - } - function httpOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - return agent; - } - function httpsOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; - } - function TunnelingAgent(options) { - var self = this; - self.options = options || {}; - self.proxyOptions = self.options.proxy || {}; - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; - self.requests = []; - self.sockets = []; - self.on("free", function onFree(socket, host, port, localAddress) { - var options2 = toOptions(host, port, localAddress); - for (var i = 0, len = self.requests.length;i < len; ++i) { - var pending = self.requests[i]; - if (pending.host === options2.host && pending.port === options2.port) { - self.requests.splice(i, 1); - pending.request.onSocket(socket); - return; - } - } - socket.destroy(); - self.removeSocket(socket); - }); - } - util.inherits(TunnelingAgent, events.EventEmitter); - TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { - var self = this; - var options = mergeOptions({ request: req }, self.options, toOptions(host, port, localAddress)); - if (self.sockets.length >= this.maxSockets) { - self.requests.push(options); - return; - } - self.createSocket(options, function(socket) { - socket.on("free", onFree); - socket.on("close", onCloseOrRemove); - socket.on("agentRemove", onCloseOrRemove); - req.onSocket(socket); - function onFree() { - self.emit("free", socket, options); - } - function onCloseOrRemove(err) { - self.removeSocket(socket); - socket.removeListener("free", onFree); - socket.removeListener("close", onCloseOrRemove); - socket.removeListener("agentRemove", onCloseOrRemove); - } - }); - }; - TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this; - var placeholder = {}; - self.sockets.push(placeholder); - var connectOptions = mergeOptions({}, self.proxyOptions, { - method: "CONNECT", - path: options.host + ":" + options.port, - agent: false, - headers: { - host: options.host + ":" + options.port - } - }); - if (options.localAddress) { - connectOptions.localAddress = options.localAddress; - } - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {}; - connectOptions.headers["Proxy-Authorization"] = "Basic " + new Buffer(connectOptions.proxyAuth).toString("base64"); - } - debug("making CONNECT request"); - var connectReq = self.request(connectOptions); - connectReq.useChunkedEncodingByDefault = false; - connectReq.once("response", onResponse); - connectReq.once("upgrade", onUpgrade); - connectReq.once("connect", onConnect); - connectReq.once("error", onError); - connectReq.end(); - function onResponse(res) { - res.upgrade = true; - } - function onUpgrade(res, socket, head) { - process.nextTick(function() { - onConnect(res, socket, head); - }); - } - function onConnect(res, socket, head) { - connectReq.removeAllListeners(); - socket.removeAllListeners(); - if (res.statusCode !== 200) { - debug("tunneling socket could not be established, statusCode=%d", res.statusCode); - socket.destroy(); - var error = new Error("tunneling socket could not be established, " + "statusCode=" + res.statusCode); - error.code = "ECONNRESET"; - options.request.emit("error", error); - self.removeSocket(placeholder); - return; - } - if (head.length > 0) { - debug("got illegal response body from proxy"); - socket.destroy(); - var error = new Error("got illegal response body from proxy"); - error.code = "ECONNRESET"; - options.request.emit("error", error); - self.removeSocket(placeholder); - return; - } - debug("tunneling connection has established"); - self.sockets[self.sockets.indexOf(placeholder)] = socket; - return cb(socket); - } - function onError(cause) { - connectReq.removeAllListeners(); - debug("tunneling socket could not be established, cause=%s\n", cause.message, cause.stack); - var error = new Error("tunneling socket could not be established, " + "cause=" + cause.message); - error.code = "ECONNRESET"; - options.request.emit("error", error); - self.removeSocket(placeholder); - } - }; - TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket); - if (pos === -1) { - return; - } - this.sockets.splice(pos, 1); - var pending = this.requests.shift(); - if (pending) { - this.createSocket(pending, function(socket2) { - pending.request.onSocket(socket2); - }); - } - }; - function createSecureSocket(options, cb) { - var self = this; - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - var hostHeader = options.request.getHeader("host"); - var tlsOptions = mergeOptions({}, self.options, { - socket, - servername: hostHeader ? hostHeader.replace(/:.*$/, "") : options.host - }); - var secureSocket = tls.connect(0, tlsOptions); - self.sockets[self.sockets.indexOf(socket)] = secureSocket; - cb(secureSocket); - }); - } - function toOptions(host, port, localAddress) { - if (typeof host === "string") { - return { - host, - port, - localAddress - }; - } - return host; - } - function mergeOptions(target) { - for (var i = 1, len = arguments.length;i < len; ++i) { - var overrides = arguments[i]; - if (typeof overrides === "object") { - var keys = Object.keys(overrides); - for (var j = 0, keyLen = keys.length;j < keyLen; ++j) { - var k = keys[j]; - if (overrides[k] !== undefined) { - target[k] = overrides[k]; - } - } - } - } - return target; - } - var debug; - if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments); - if (typeof args[0] === "string") { - args[0] = "TUNNEL: " + args[0]; - } else { - args.unshift("TUNNEL:"); - } - console.error.apply(console, args); - }; - } else { - debug = function() { - }; - } - exports.debug = debug; -}); - -// ../node_modules/undici/lib/core/symbols.js -var require_symbols = __commonJS((exports, module) => { - module.exports = { - kClose: Symbol("close"), - kDestroy: Symbol("destroy"), - kDispatch: Symbol("dispatch"), - kUrl: Symbol("url"), - kWriting: Symbol("writing"), - kResuming: Symbol("resuming"), - kQueue: Symbol("queue"), - kConnect: Symbol("connect"), - kConnecting: Symbol("connecting"), - kHeadersList: Symbol("headers list"), - kKeepAliveDefaultTimeout: Symbol("default keep alive timeout"), - kKeepAliveMaxTimeout: Symbol("max keep alive timeout"), - kKeepAliveTimeoutThreshold: Symbol("keep alive timeout threshold"), - kKeepAliveTimeoutValue: Symbol("keep alive timeout"), - kKeepAlive: Symbol("keep alive"), - kHeadersTimeout: Symbol("headers timeout"), - kBodyTimeout: Symbol("body timeout"), - kServerName: Symbol("server name"), - kLocalAddress: Symbol("local address"), - kHost: Symbol("host"), - kNoRef: Symbol("no ref"), - kBodyUsed: Symbol("used"), - kRunning: Symbol("running"), - kBlocking: Symbol("blocking"), - kPending: Symbol("pending"), - kSize: Symbol("size"), - kBusy: Symbol("busy"), - kQueued: Symbol("queued"), - kFree: Symbol("free"), - kConnected: Symbol("connected"), - kClosed: Symbol("closed"), - kNeedDrain: Symbol("need drain"), - kReset: Symbol("reset"), - kDestroyed: Symbol.for("nodejs.stream.destroyed"), - kMaxHeadersSize: Symbol("max headers size"), - kRunningIdx: Symbol("running index"), - kPendingIdx: Symbol("pending index"), - kError: Symbol("error"), - kClients: Symbol("clients"), - kClient: Symbol("client"), - kParser: Symbol("parser"), - kOnDestroyed: Symbol("destroy callbacks"), - kPipelining: Symbol("pipelining"), - kSocket: Symbol("socket"), - kHostHeader: Symbol("host header"), - kConnector: Symbol("connector"), - kStrictContentLength: Symbol("strict content length"), - kMaxRedirections: Symbol("maxRedirections"), - kMaxRequests: Symbol("maxRequestsPerClient"), - kProxy: Symbol("proxy agent options"), - kCounter: Symbol("socket request counter"), - kInterceptors: Symbol("dispatch interceptors"), - kMaxResponseSize: Symbol("max response size"), - kHTTP2Session: Symbol("http2Session"), - kHTTP2SessionState: Symbol("http2Session state"), - kHTTP2BuildRequest: Symbol("http2 build request"), - kHTTP1BuildRequest: Symbol("http1 build request"), - kHTTP2CopyHeaders: Symbol("http2 copy headers"), - kHTTPConnVersion: Symbol("http connection version"), - kRetryHandlerDefaultRetry: Symbol("retry agent default retry"), - kConstruct: Symbol("constructable") - }; -}); - -// ../node_modules/undici/lib/core/errors.js -var require_errors = __commonJS((exports, module) => { - class UndiciError extends Error { - constructor(message) { - super(message); - this.name = "UndiciError"; - this.code = "UND_ERR"; - } - } - - class ConnectTimeoutError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, ConnectTimeoutError); - this.name = "ConnectTimeoutError"; - this.message = message || "Connect Timeout Error"; - this.code = "UND_ERR_CONNECT_TIMEOUT"; - } - } - - class HeadersTimeoutError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, HeadersTimeoutError); - this.name = "HeadersTimeoutError"; - this.message = message || "Headers Timeout Error"; - this.code = "UND_ERR_HEADERS_TIMEOUT"; - } - } - - class HeadersOverflowError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, HeadersOverflowError); - this.name = "HeadersOverflowError"; - this.message = message || "Headers Overflow Error"; - this.code = "UND_ERR_HEADERS_OVERFLOW"; - } - } - - class BodyTimeoutError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, BodyTimeoutError); - this.name = "BodyTimeoutError"; - this.message = message || "Body Timeout Error"; - this.code = "UND_ERR_BODY_TIMEOUT"; - } - } - - class ResponseStatusCodeError extends UndiciError { - constructor(message, statusCode, headers, body) { - super(message); - Error.captureStackTrace(this, ResponseStatusCodeError); - this.name = "ResponseStatusCodeError"; - this.message = message || "Response Status Code Error"; - this.code = "UND_ERR_RESPONSE_STATUS_CODE"; - this.body = body; - this.status = statusCode; - this.statusCode = statusCode; - this.headers = headers; - } - } - - class InvalidArgumentError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, InvalidArgumentError); - this.name = "InvalidArgumentError"; - this.message = message || "Invalid Argument Error"; - this.code = "UND_ERR_INVALID_ARG"; - } - } - - class InvalidReturnValueError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, InvalidReturnValueError); - this.name = "InvalidReturnValueError"; - this.message = message || "Invalid Return Value Error"; - this.code = "UND_ERR_INVALID_RETURN_VALUE"; - } - } - - class RequestAbortedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, RequestAbortedError); - this.name = "AbortError"; - this.message = message || "Request aborted"; - this.code = "UND_ERR_ABORTED"; - } - } - - class InformationalError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, InformationalError); - this.name = "InformationalError"; - this.message = message || "Request information"; - this.code = "UND_ERR_INFO"; - } - } - - class RequestContentLengthMismatchError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, RequestContentLengthMismatchError); - this.name = "RequestContentLengthMismatchError"; - this.message = message || "Request body length does not match content-length header"; - this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; - } - } - - class ResponseContentLengthMismatchError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, ResponseContentLengthMismatchError); - this.name = "ResponseContentLengthMismatchError"; - this.message = message || "Response body length does not match content-length header"; - this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; - } - } - - class ClientDestroyedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, ClientDestroyedError); - this.name = "ClientDestroyedError"; - this.message = message || "The client is destroyed"; - this.code = "UND_ERR_DESTROYED"; - } - } - - class ClientClosedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, ClientClosedError); - this.name = "ClientClosedError"; - this.message = message || "The client is closed"; - this.code = "UND_ERR_CLOSED"; - } - } - - class SocketError extends UndiciError { - constructor(message, socket) { - super(message); - Error.captureStackTrace(this, SocketError); - this.name = "SocketError"; - this.message = message || "Socket error"; - this.code = "UND_ERR_SOCKET"; - this.socket = socket; - } - } - - class NotSupportedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, NotSupportedError); - this.name = "NotSupportedError"; - this.message = message || "Not supported error"; - this.code = "UND_ERR_NOT_SUPPORTED"; - } - } - - class BalancedPoolMissingUpstreamError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, NotSupportedError); - this.name = "MissingUpstreamError"; - this.message = message || "No upstream has been added to the BalancedPool"; - this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; - } - } - - class HTTPParserError extends Error { - constructor(message, code, data) { - super(message); - Error.captureStackTrace(this, HTTPParserError); - this.name = "HTTPParserError"; - this.code = code ? `HPE_${code}` : undefined; - this.data = data ? data.toString() : undefined; - } - } - - class ResponseExceededMaxSizeError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, ResponseExceededMaxSizeError); - this.name = "ResponseExceededMaxSizeError"; - this.message = message || "Response content exceeded max size"; - this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; - } - } - - class RequestRetryError extends UndiciError { - constructor(message, code, { headers, data }) { - super(message); - Error.captureStackTrace(this, RequestRetryError); - this.name = "RequestRetryError"; - this.message = message || "Request retry error"; - this.code = "UND_ERR_REQ_RETRY"; - this.statusCode = code; - this.data = data; - this.headers = headers; - } - } - module.exports = { - HTTPParserError, - UndiciError, - HeadersTimeoutError, - HeadersOverflowError, - BodyTimeoutError, - RequestContentLengthMismatchError, - ConnectTimeoutError, - ResponseStatusCodeError, - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError, - ClientDestroyedError, - ClientClosedError, - InformationalError, - SocketError, - NotSupportedError, - ResponseContentLengthMismatchError, - BalancedPoolMissingUpstreamError, - ResponseExceededMaxSizeError, - RequestRetryError - }; -}); - -// ../node_modules/undici/lib/core/constants.js -var require_constants = __commonJS((exports, module) => { - var headerNameLowerCasedRecord = {}; - var wellknownHeaderNames = [ - "Accept", - "Accept-Encoding", - "Accept-Language", - "Accept-Ranges", - "Access-Control-Allow-Credentials", - "Access-Control-Allow-Headers", - "Access-Control-Allow-Methods", - "Access-Control-Allow-Origin", - "Access-Control-Expose-Headers", - "Access-Control-Max-Age", - "Access-Control-Request-Headers", - "Access-Control-Request-Method", - "Age", - "Allow", - "Alt-Svc", - "Alt-Used", - "Authorization", - "Cache-Control", - "Clear-Site-Data", - "Connection", - "Content-Disposition", - "Content-Encoding", - "Content-Language", - "Content-Length", - "Content-Location", - "Content-Range", - "Content-Security-Policy", - "Content-Security-Policy-Report-Only", - "Content-Type", - "Cookie", - "Cross-Origin-Embedder-Policy", - "Cross-Origin-Opener-Policy", - "Cross-Origin-Resource-Policy", - "Date", - "Device-Memory", - "Downlink", - "ECT", - "ETag", - "Expect", - "Expect-CT", - "Expires", - "Forwarded", - "From", - "Host", - "If-Match", - "If-Modified-Since", - "If-None-Match", - "If-Range", - "If-Unmodified-Since", - "Keep-Alive", - "Last-Modified", - "Link", - "Location", - "Max-Forwards", - "Origin", - "Permissions-Policy", - "Pragma", - "Proxy-Authenticate", - "Proxy-Authorization", - "RTT", - "Range", - "Referer", - "Referrer-Policy", - "Refresh", - "Retry-After", - "Sec-WebSocket-Accept", - "Sec-WebSocket-Extensions", - "Sec-WebSocket-Key", - "Sec-WebSocket-Protocol", - "Sec-WebSocket-Version", - "Server", - "Server-Timing", - "Service-Worker-Allowed", - "Service-Worker-Navigation-Preload", - "Set-Cookie", - "SourceMap", - "Strict-Transport-Security", - "Supports-Loading-Mode", - "TE", - "Timing-Allow-Origin", - "Trailer", - "Transfer-Encoding", - "Upgrade", - "Upgrade-Insecure-Requests", - "User-Agent", - "Vary", - "Via", - "WWW-Authenticate", - "X-Content-Type-Options", - "X-DNS-Prefetch-Control", - "X-Frame-Options", - "X-Permitted-Cross-Domain-Policies", - "X-Powered-By", - "X-Requested-With", - "X-XSS-Protection" - ]; - for (let i = 0;i < wellknownHeaderNames.length; ++i) { - const key = wellknownHeaderNames[i]; - const lowerCasedKey = key.toLowerCase(); - headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; - } - Object.setPrototypeOf(headerNameLowerCasedRecord, null); - module.exports = { - wellknownHeaderNames, - headerNameLowerCasedRecord - }; -}); - -// ../node_modules/undici/lib/core/util.js -var require_util = __commonJS((exports, module) => { - var assert = __require("assert"); - var { kDestroyed, kBodyUsed } = require_symbols(); - var { IncomingMessage } = __require("http"); - var stream = __require("stream"); - var net = __require("net"); - var { InvalidArgumentError } = require_errors(); - var { Blob: Blob2 } = __require("buffer"); - var nodeUtil = __require("util"); - var { stringify } = __require("querystring"); - var { headerNameLowerCasedRecord } = require_constants(); - var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); - function nop() { - } - function isStream(obj) { - return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; - } - function isBlobLike(object) { - return Blob2 && object instanceof Blob2 || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]); - } - function buildURL(url, queryParams) { - if (url.includes("?") || url.includes("#")) { - throw new Error('Query params cannot be passed when url already contains "?" or "#".'); - } - const stringified = stringify(queryParams); - if (stringified) { - url += "?" + stringified; - } - return url; - } - function parseURL(url) { - if (typeof url === "string") { - url = new URL(url); - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - return url; - } - if (!url || typeof url !== "object") { - throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); - } - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - if (!(url instanceof URL)) { - if (url.port != null && url.port !== "" && !Number.isFinite(parseInt(url.port))) { - throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); - } - if (url.path != null && typeof url.path !== "string") { - throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); - } - if (url.pathname != null && typeof url.pathname !== "string") { - throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); - } - if (url.hostname != null && typeof url.hostname !== "string") { - throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); - } - if (url.origin != null && typeof url.origin !== "string") { - throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); - } - const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; - let origin = url.origin != null ? url.origin : `${url.protocol}//${url.hostname}:${port}`; - let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; - if (origin.endsWith("/")) { - origin = origin.substring(0, origin.length - 1); - } - if (path && !path.startsWith("/")) { - path = `/${path}`; - } - url = new URL(origin + path); - } - return url; - } - function parseOrigin(url) { - url = parseURL(url); - if (url.pathname !== "/" || url.search || url.hash) { - throw new InvalidArgumentError("invalid url"); - } - return url; - } - function getHostname(host) { - if (host[0] === "[") { - const idx2 = host.indexOf("]"); - assert(idx2 !== -1); - return host.substring(1, idx2); - } - const idx = host.indexOf(":"); - if (idx === -1) - return host; - return host.substring(0, idx); - } - function getServerName(host) { - if (!host) { - return null; - } - assert.strictEqual(typeof host, "string"); - const servername = getHostname(host); - if (net.isIP(servername)) { - return ""; - } - return servername; - } - function deepClone(obj) { - return JSON.parse(JSON.stringify(obj)); - } - function isAsyncIterable(obj) { - return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); - } - function isIterable(obj) { - return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); - } - function bodyLength(body) { - if (body == null) { - return 0; - } else if (isStream(body)) { - const state = body._readableState; - return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null; - } else if (isBlobLike(body)) { - return body.size != null ? body.size : null; - } else if (isBuffer(body)) { - return body.byteLength; - } - return null; - } - function isDestroyed(stream2) { - return !stream2 || !!(stream2.destroyed || stream2[kDestroyed]); - } - function isReadableAborted(stream2) { - const state = stream2 && stream2._readableState; - return isDestroyed(stream2) && state && !state.endEmitted; - } - function destroy(stream2, err) { - if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { - return; - } - if (typeof stream2.destroy === "function") { - if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { - stream2.socket = null; - } - stream2.destroy(err); - } else if (err) { - process.nextTick((stream3, err2) => { - stream3.emit("error", err2); - }, stream2, err); - } - if (stream2.destroyed !== true) { - stream2[kDestroyed] = true; - } - } - var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; - function parseKeepAliveTimeout(val) { - const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR); - return m ? parseInt(m[1], 10) * 1000 : null; - } - function headerNameToString(value) { - return headerNameLowerCasedRecord[value] || value.toLowerCase(); - } - function parseHeaders(headers, obj = {}) { - if (!Array.isArray(headers)) - return headers; - for (let i = 0;i < headers.length; i += 2) { - const key = headers[i].toString().toLowerCase(); - let val = obj[key]; - if (!val) { - if (Array.isArray(headers[i + 1])) { - obj[key] = headers[i + 1].map((x) => x.toString("utf8")); - } else { - obj[key] = headers[i + 1].toString("utf8"); - } - } else { - if (!Array.isArray(val)) { - val = [val]; - obj[key] = val; - } - val.push(headers[i + 1].toString("utf8")); - } - } - if ("content-length" in obj && "content-disposition" in obj) { - obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1"); - } - return obj; - } - function parseRawHeaders(headers) { - const ret = []; - let hasContentLength = false; - let contentDispositionIdx = -1; - for (let n = 0;n < headers.length; n += 2) { - const key = headers[n + 0].toString(); - const val = headers[n + 1].toString("utf8"); - if (key.length === 14 && (key === "content-length" || key.toLowerCase() === "content-length")) { - ret.push(key, val); - hasContentLength = true; - } else if (key.length === 19 && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { - contentDispositionIdx = ret.push(key, val) - 1; - } else { - ret.push(key, val); - } - } - if (hasContentLength && contentDispositionIdx !== -1) { - ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); - } - return ret; - } - function isBuffer(buffer) { - return buffer instanceof Uint8Array || Buffer.isBuffer(buffer); - } - function validateHandler(handler, method, upgrade) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - if (typeof handler.onConnect !== "function") { - throw new InvalidArgumentError("invalid onConnect method"); - } - if (typeof handler.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); - } - if (typeof handler.onBodySent !== "function" && handler.onBodySent !== undefined) { - throw new InvalidArgumentError("invalid onBodySent method"); - } - if (upgrade || method === "CONNECT") { - if (typeof handler.onUpgrade !== "function") { - throw new InvalidArgumentError("invalid onUpgrade method"); - } - } else { - if (typeof handler.onHeaders !== "function") { - throw new InvalidArgumentError("invalid onHeaders method"); - } - if (typeof handler.onData !== "function") { - throw new InvalidArgumentError("invalid onData method"); - } - if (typeof handler.onComplete !== "function") { - throw new InvalidArgumentError("invalid onComplete method"); - } - } - } - function isDisturbed(body) { - return !!(body && (stream.isDisturbed ? stream.isDisturbed(body) || body[kBodyUsed] : body[kBodyUsed] || body.readableDidRead || body._readableState && body._readableState.dataEmitted || isReadableAborted(body))); - } - function isErrored(body) { - return !!(body && (stream.isErrored ? stream.isErrored(body) : /state: 'errored'/.test(nodeUtil.inspect(body)))); - } - function isReadable(body) { - return !!(body && (stream.isReadable ? stream.isReadable(body) : /state: 'readable'/.test(nodeUtil.inspect(body)))); - } - function getSocketInfo(socket) { - return { - localAddress: socket.localAddress, - localPort: socket.localPort, - remoteAddress: socket.remoteAddress, - remotePort: socket.remotePort, - remoteFamily: socket.remoteFamily, - timeout: socket.timeout, - bytesWritten: socket.bytesWritten, - bytesRead: socket.bytesRead - }; - } - async function* convertIterableToBuffer(iterable) { - for await (const chunk of iterable) { - yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); - } - } - var ReadableStream; - function ReadableStreamFrom(iterable) { - if (!ReadableStream) { - ReadableStream = __require("stream/web").ReadableStream; - } - if (ReadableStream.from) { - return ReadableStream.from(convertIterableToBuffer(iterable)); - } - let iterator; - return new ReadableStream({ - async start() { - iterator = iterable[Symbol.asyncIterator](); - }, - async pull(controller) { - const { done, value } = await iterator.next(); - if (done) { - queueMicrotask(() => { - controller.close(); - }); - } else { - const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); - controller.enqueue(new Uint8Array(buf)); - } - return controller.desiredSize > 0; - }, - async cancel(reason) { - await iterator.return(); - } - }, 0); - } - function isFormDataLike(object) { - return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; - } - function throwIfAborted(signal) { - if (!signal) { - return; - } - if (typeof signal.throwIfAborted === "function") { - signal.throwIfAborted(); - } else { - if (signal.aborted) { - const err = new Error("The operation was aborted"); - err.name = "AbortError"; - throw err; - } - } - } - function addAbortListener(signal, listener) { - if ("addEventListener" in signal) { - signal.addEventListener("abort", listener, { once: true }); - return () => signal.removeEventListener("abort", listener); - } - signal.addListener("abort", listener); - return () => signal.removeListener("abort", listener); - } - var hasToWellFormed = !!String.prototype.toWellFormed; - function toUSVString(val) { - if (hasToWellFormed) { - return `${val}`.toWellFormed(); - } else if (nodeUtil.toUSVString) { - return nodeUtil.toUSVString(val); - } - return `${val}`; - } - function parseRangeHeader(range) { - if (range == null || range === "") - return { start: 0, end: null, size: null }; - const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null; - return m ? { - start: parseInt(m[1]), - end: m[2] ? parseInt(m[2]) : null, - size: m[3] ? parseInt(m[3]) : null - } : null; - } - var kEnumerableProperty = Object.create(null); - kEnumerableProperty.enumerable = true; - module.exports = { - kEnumerableProperty, - nop, - isDisturbed, - isErrored, - isReadable, - toUSVString, - isReadableAborted, - isBlobLike, - parseOrigin, - parseURL, - getServerName, - isStream, - isIterable, - isAsyncIterable, - isDestroyed, - headerNameToString, - parseRawHeaders, - parseHeaders, - parseKeepAliveTimeout, - destroy, - bodyLength, - deepClone, - ReadableStreamFrom, - isBuffer, - validateHandler, - getSocketInfo, - isFormDataLike, - buildURL, - throwIfAborted, - addAbortListener, - parseRangeHeader, - nodeMajor, - nodeMinor, - nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13, - safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"] - }; -}); - -// ../node_modules/undici/lib/timers.js -var require_timers = __commonJS((exports, module) => { - var fastNow = Date.now(); - var fastNowTimeout; - var fastTimers = []; - function onTimeout() { - fastNow = Date.now(); - let len = fastTimers.length; - let idx = 0; - while (idx < len) { - const timer = fastTimers[idx]; - if (timer.state === 0) { - timer.state = fastNow + timer.delay; - } else if (timer.state > 0 && fastNow >= timer.state) { - timer.state = -1; - timer.callback(timer.opaque); - } - if (timer.state === -1) { - timer.state = -2; - if (idx !== len - 1) { - fastTimers[idx] = fastTimers.pop(); - } else { - fastTimers.pop(); - } - len -= 1; - } else { - idx += 1; - } - } - if (fastTimers.length > 0) { - refreshTimeout(); - } - } - function refreshTimeout() { - if (fastNowTimeout && fastNowTimeout.refresh) { - fastNowTimeout.refresh(); - } else { - clearTimeout(fastNowTimeout); - fastNowTimeout = setTimeout(onTimeout, 1000); - if (fastNowTimeout.unref) { - fastNowTimeout.unref(); - } - } - } - - class Timeout { - constructor(callback, delay, opaque) { - this.callback = callback; - this.delay = delay; - this.opaque = opaque; - this.state = -2; - this.refresh(); - } - refresh() { - if (this.state === -2) { - fastTimers.push(this); - if (!fastNowTimeout || fastTimers.length === 1) { - refreshTimeout(); - } - } - this.state = 0; - } - clear() { - this.state = -1; - } - } - module.exports = { - setTimeout(callback, delay, opaque) { - return delay < 1000 ? setTimeout(callback, delay, opaque) : new Timeout(callback, delay, opaque); - }, - clearTimeout(timeout) { - if (timeout instanceof Timeout) { - timeout.clear(); - } else { - clearTimeout(timeout); - } - } - }; -}); - -// ../node_modules/@fastify/busboy/deps/streamsearch/sbmh.js -var require_sbmh = __commonJS((exports, module) => { - var EventEmitter = __require("node:events").EventEmitter; - var inherits = __require("node:util").inherits; - function SBMH(needle) { - if (typeof needle === "string") { - needle = Buffer.from(needle); - } - if (!Buffer.isBuffer(needle)) { - throw new TypeError("The needle has to be a String or a Buffer."); - } - const needleLength = needle.length; - if (needleLength === 0) { - throw new Error("The needle cannot be an empty String/Buffer."); - } - if (needleLength > 256) { - throw new Error("The needle cannot have a length bigger than 256."); - } - this.maxMatches = Infinity; - this.matches = 0; - this._occ = new Array(256).fill(needleLength); - this._lookbehind_size = 0; - this._needle = needle; - this._bufpos = 0; - this._lookbehind = Buffer.alloc(needleLength); - for (var i = 0;i < needleLength - 1; ++i) { - this._occ[needle[i]] = needleLength - 1 - i; - } - } - inherits(SBMH, EventEmitter); - SBMH.prototype.reset = function() { - this._lookbehind_size = 0; - this.matches = 0; - this._bufpos = 0; - }; - SBMH.prototype.push = function(chunk, pos) { - if (!Buffer.isBuffer(chunk)) { - chunk = Buffer.from(chunk, "binary"); - } - const chlen = chunk.length; - this._bufpos = pos || 0; - let r; - while (r !== chlen && this.matches < this.maxMatches) { - r = this._sbmh_feed(chunk); - } - return r; - }; - SBMH.prototype._sbmh_feed = function(data) { - const len = data.length; - const needle = this._needle; - const needleLength = needle.length; - const lastNeedleChar = needle[needleLength - 1]; - let pos = -this._lookbehind_size; - let ch; - if (pos < 0) { - while (pos < 0 && pos <= len - needleLength) { - ch = this._sbmh_lookup_char(data, pos + needleLength - 1); - if (ch === lastNeedleChar && this._sbmh_memcmp(data, pos, needleLength - 1)) { - this._lookbehind_size = 0; - ++this.matches; - this.emit("info", true); - return this._bufpos = pos + needleLength; - } - pos += this._occ[ch]; - } - if (pos < 0) { - while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { - ++pos; - } - } - if (pos >= 0) { - this.emit("info", false, this._lookbehind, 0, this._lookbehind_size); - this._lookbehind_size = 0; - } else { - const bytesToCutOff = this._lookbehind_size + pos; - if (bytesToCutOff > 0) { - this.emit("info", false, this._lookbehind, 0, bytesToCutOff); - } - this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff, this._lookbehind_size - bytesToCutOff); - this._lookbehind_size -= bytesToCutOff; - data.copy(this._lookbehind, this._lookbehind_size); - this._lookbehind_size += len; - this._bufpos = len; - return len; - } - } - pos += (pos >= 0) * this._bufpos; - if (data.indexOf(needle, pos) !== -1) { - pos = data.indexOf(needle, pos); - ++this.matches; - if (pos > 0) { - this.emit("info", true, data, this._bufpos, pos); - } else { - this.emit("info", true); - } - return this._bufpos = pos + needleLength; - } else { - pos = len - needleLength; - } - while (pos < len && (data[pos] !== needle[0] || Buffer.compare(data.subarray(pos, pos + len - pos), needle.subarray(0, len - pos)) !== 0)) { - ++pos; - } - if (pos < len) { - data.copy(this._lookbehind, 0, pos, pos + (len - pos)); - this._lookbehind_size = len - pos; - } - if (pos > 0) { - this.emit("info", false, data, this._bufpos, pos < len ? pos : len); - } - this._bufpos = len; - return len; - }; - SBMH.prototype._sbmh_lookup_char = function(data, pos) { - return pos < 0 ? this._lookbehind[this._lookbehind_size + pos] : data[pos]; - }; - SBMH.prototype._sbmh_memcmp = function(data, pos, len) { - for (var i = 0;i < len; ++i) { - if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { - return false; - } - } - return true; - }; - module.exports = SBMH; -}); - -// ../node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js -var require_PartStream = __commonJS((exports, module) => { - var inherits = __require("node:util").inherits; - var ReadableStream = __require("node:stream").Readable; - function PartStream(opts) { - ReadableStream.call(this, opts); - } - inherits(PartStream, ReadableStream); - PartStream.prototype._read = function(n) { - }; - module.exports = PartStream; -}); - -// ../node_modules/@fastify/busboy/lib/utils/getLimit.js -var require_getLimit = __commonJS((exports, module) => { - module.exports = function getLimit(limits, name, defaultLimit) { - if (!limits || limits[name] === undefined || limits[name] === null) { - return defaultLimit; - } - if (typeof limits[name] !== "number" || isNaN(limits[name])) { - throw new TypeError("Limit " + name + " is not a valid number"); - } - return limits[name]; - }; -}); - -// ../node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js -var require_HeaderParser = __commonJS((exports, module) => { - var EventEmitter = __require("node:events").EventEmitter; - var inherits = __require("node:util").inherits; - var getLimit = require_getLimit(); - var StreamSearch = require_sbmh(); - var B_DCRLF = Buffer.from("\r\n\r\n"); - var RE_CRLF = /\r\n/g; - var RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/; - function HeaderParser(cfg) { - EventEmitter.call(this); - cfg = cfg || {}; - const self = this; - this.nread = 0; - this.maxed = false; - this.npairs = 0; - this.maxHeaderPairs = getLimit(cfg, "maxHeaderPairs", 2000); - this.maxHeaderSize = getLimit(cfg, "maxHeaderSize", 80 * 1024); - this.buffer = ""; - this.header = {}; - this.finished = false; - this.ss = new StreamSearch(B_DCRLF); - this.ss.on("info", function(isMatch, data, start, end) { - if (data && !self.maxed) { - if (self.nread + end - start >= self.maxHeaderSize) { - end = self.maxHeaderSize - self.nread + start; - self.nread = self.maxHeaderSize; - self.maxed = true; - } else { - self.nread += end - start; - } - self.buffer += data.toString("binary", start, end); - } - if (isMatch) { - self._finish(); - } - }); - } - inherits(HeaderParser, EventEmitter); - HeaderParser.prototype.push = function(data) { - const r = this.ss.push(data); - if (this.finished) { - return r; - } - }; - HeaderParser.prototype.reset = function() { - this.finished = false; - this.buffer = ""; - this.header = {}; - this.ss.reset(); - }; - HeaderParser.prototype._finish = function() { - if (this.buffer) { - this._parseHeader(); - } - this.ss.matches = this.ss.maxMatches; - const header = this.header; - this.header = {}; - this.buffer = ""; - this.finished = true; - this.nread = this.npairs = 0; - this.maxed = false; - this.emit("header", header); - }; - HeaderParser.prototype._parseHeader = function() { - if (this.npairs === this.maxHeaderPairs) { - return; - } - const lines = this.buffer.split(RE_CRLF); - const len = lines.length; - let m, h; - for (var i = 0;i < len; ++i) { - if (lines[i].length === 0) { - continue; - } - if (lines[i][0] === "\t" || lines[i][0] === " ") { - if (h) { - this.header[h][this.header[h].length - 1] += lines[i]; - continue; - } - } - const posColon = lines[i].indexOf(":"); - if (posColon === -1 || posColon === 0) { - return; - } - m = RE_HDR.exec(lines[i]); - h = m[1].toLowerCase(); - this.header[h] = this.header[h] || []; - this.header[h].push(m[2] || ""); - if (++this.npairs === this.maxHeaderPairs) { - break; - } - } - }; - module.exports = HeaderParser; -}); - -// ../node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js -var require_Dicer = __commonJS((exports, module) => { - var WritableStream = __require("node:stream").Writable; - var inherits = __require("node:util").inherits; - var StreamSearch = require_sbmh(); - var PartStream = require_PartStream(); - var HeaderParser = require_HeaderParser(); - var DASH = 45; - var B_ONEDASH = Buffer.from("-"); - var B_CRLF = Buffer.from("\r\n"); - var EMPTY_FN = function() { - }; - function Dicer(cfg) { - if (!(this instanceof Dicer)) { - return new Dicer(cfg); - } - WritableStream.call(this, cfg); - if (!cfg || !cfg.headerFirst && typeof cfg.boundary !== "string") { - throw new TypeError("Boundary required"); - } - if (typeof cfg.boundary === "string") { - this.setBoundary(cfg.boundary); - } else { - this._bparser = undefined; - } - this._headerFirst = cfg.headerFirst; - this._dashes = 0; - this._parts = 0; - this._finished = false; - this._realFinish = false; - this._isPreamble = true; - this._justMatched = false; - this._firstWrite = true; - this._inHeader = true; - this._part = undefined; - this._cb = undefined; - this._ignoreData = false; - this._partOpts = { highWaterMark: cfg.partHwm }; - this._pause = false; - const self = this; - this._hparser = new HeaderParser(cfg); - this._hparser.on("header", function(header) { - self._inHeader = false; - self._part.emit("header", header); - }); - } - inherits(Dicer, WritableStream); - Dicer.prototype.emit = function(ev) { - if (ev === "finish" && !this._realFinish) { - if (!this._finished) { - const self = this; - process.nextTick(function() { - self.emit("error", new Error("Unexpected end of multipart data")); - if (self._part && !self._ignoreData) { - const type = self._isPreamble ? "Preamble" : "Part"; - self._part.emit("error", new Error(type + " terminated early due to unexpected end of multipart data")); - self._part.push(null); - process.nextTick(function() { - self._realFinish = true; - self.emit("finish"); - self._realFinish = false; - }); - return; - } - self._realFinish = true; - self.emit("finish"); - self._realFinish = false; - }); - } - } else { - WritableStream.prototype.emit.apply(this, arguments); - } - }; - Dicer.prototype._write = function(data, encoding, cb) { - if (!this._hparser && !this._bparser) { - return cb(); - } - if (this._headerFirst && this._isPreamble) { - if (!this._part) { - this._part = new PartStream(this._partOpts); - if (this.listenerCount("preamble") !== 0) { - this.emit("preamble", this._part); - } else { - this._ignore(); - } - } - const r = this._hparser.push(data); - if (!this._inHeader && r !== undefined && r < data.length) { - data = data.slice(r); - } else { - return cb(); - } - } - if (this._firstWrite) { - this._bparser.push(B_CRLF); - this._firstWrite = false; - } - this._bparser.push(data); - if (this._pause) { - this._cb = cb; - } else { - cb(); - } - }; - Dicer.prototype.reset = function() { - this._part = undefined; - this._bparser = undefined; - this._hparser = undefined; - }; - Dicer.prototype.setBoundary = function(boundary) { - const self = this; - this._bparser = new StreamSearch("\r\n--" + boundary); - this._bparser.on("info", function(isMatch, data, start, end) { - self._oninfo(isMatch, data, start, end); - }); - }; - Dicer.prototype._ignore = function() { - if (this._part && !this._ignoreData) { - this._ignoreData = true; - this._part.on("error", EMPTY_FN); - this._part.resume(); - } - }; - Dicer.prototype._oninfo = function(isMatch, data, start, end) { - let buf; - const self = this; - let i = 0; - let r; - let shouldWriteMore = true; - if (!this._part && this._justMatched && data) { - while (this._dashes < 2 && start + i < end) { - if (data[start + i] === DASH) { - ++i; - ++this._dashes; - } else { - if (this._dashes) { - buf = B_ONEDASH; - } - this._dashes = 0; - break; - } - } - if (this._dashes === 2) { - if (start + i < end && this.listenerCount("trailer") !== 0) { - this.emit("trailer", data.slice(start + i, end)); - } - this.reset(); - this._finished = true; - if (self._parts === 0) { - self._realFinish = true; - self.emit("finish"); - self._realFinish = false; - } - } - if (this._dashes) { - return; - } - } - if (this._justMatched) { - this._justMatched = false; - } - if (!this._part) { - this._part = new PartStream(this._partOpts); - this._part._read = function(n) { - self._unpause(); - }; - if (this._isPreamble && this.listenerCount("preamble") !== 0) { - this.emit("preamble", this._part); - } else if (this._isPreamble !== true && this.listenerCount("part") !== 0) { - this.emit("part", this._part); - } else { - this._ignore(); - } - if (!this._isPreamble) { - this._inHeader = true; - } - } - if (data && start < end && !this._ignoreData) { - if (this._isPreamble || !this._inHeader) { - if (buf) { - shouldWriteMore = this._part.push(buf); - } - shouldWriteMore = this._part.push(data.slice(start, end)); - if (!shouldWriteMore) { - this._pause = true; - } - } else if (!this._isPreamble && this._inHeader) { - if (buf) { - this._hparser.push(buf); - } - r = this._hparser.push(data.slice(start, end)); - if (!this._inHeader && r !== undefined && r < end) { - this._oninfo(false, data, start + r, end); - } - } - } - if (isMatch) { - this._hparser.reset(); - if (this._isPreamble) { - this._isPreamble = false; - } else { - if (start !== end) { - ++this._parts; - this._part.on("end", function() { - if (--self._parts === 0) { - if (self._finished) { - self._realFinish = true; - self.emit("finish"); - self._realFinish = false; - } else { - self._unpause(); - } - } - }); - } - } - this._part.push(null); - this._part = undefined; - this._ignoreData = false; - this._justMatched = true; - this._dashes = 0; - } - }; - Dicer.prototype._unpause = function() { - if (!this._pause) { - return; - } - this._pause = false; - if (this._cb) { - const cb = this._cb; - this._cb = undefined; - cb(); - } - }; - module.exports = Dicer; -}); - -// ../node_modules/@fastify/busboy/lib/utils/decodeText.js -var require_decodeText = __commonJS((exports, module) => { - var utf8Decoder = new TextDecoder("utf-8"); - var textDecoders = new Map([ - ["utf-8", utf8Decoder], - ["utf8", utf8Decoder] - ]); - function getDecoder(charset) { - let lc; - while (true) { - switch (charset) { - case "utf-8": - case "utf8": - return decoders.utf8; - case "latin1": - case "ascii": - case "us-ascii": - case "iso-8859-1": - case "iso8859-1": - case "iso88591": - case "iso_8859-1": - case "windows-1252": - case "iso_8859-1:1987": - case "cp1252": - case "x-cp1252": - return decoders.latin1; - case "utf16le": - case "utf-16le": - case "ucs2": - case "ucs-2": - return decoders.utf16le; - case "base64": - return decoders.base64; - default: - if (lc === undefined) { - lc = true; - charset = charset.toLowerCase(); - continue; - } - return decoders.other.bind(charset); - } - } - } - var decoders = { - utf8: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - return data.utf8Slice(0, data.length); - }, - latin1: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - return data; - } - return data.latin1Slice(0, data.length); - }, - utf16le: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - return data.ucs2Slice(0, data.length); - }, - base64: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - return data.base64Slice(0, data.length); - }, - other: (data, sourceEncoding) => { - if (data.length === 0) { - return ""; - } - if (typeof data === "string") { - data = Buffer.from(data, sourceEncoding); - } - if (textDecoders.has(exports.toString())) { - try { - return textDecoders.get(exports).decode(data); - } catch { - } - } - return typeof data === "string" ? data : data.toString(); - } - }; - function decodeText(text, sourceEncoding, destEncoding) { - if (text) { - return getDecoder(destEncoding)(text, sourceEncoding); - } - return text; - } - module.exports = decodeText; -}); - -// ../node_modules/@fastify/busboy/lib/utils/parseParams.js -var require_parseParams = __commonJS((exports, module) => { - var decodeText = require_decodeText(); - var RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g; - var EncodedLookup = { - "%00": "\0", - "%01": "\x01", - "%02": "\x02", - "%03": "\x03", - "%04": "\x04", - "%05": "\x05", - "%06": "\x06", - "%07": "\x07", - "%08": "\b", - "%09": "\t", - "%0a": ` -`, - "%0A": ` -`, - "%0b": "\v", - "%0B": "\v", - "%0c": "\f", - "%0C": "\f", - "%0d": `\r`, - "%0D": `\r`, - "%0e": "\x0E", - "%0E": "\x0E", - "%0f": "\x0F", - "%0F": "\x0F", - "%10": "\x10", - "%11": "\x11", - "%12": "\x12", - "%13": "\x13", - "%14": "\x14", - "%15": "\x15", - "%16": "\x16", - "%17": "\x17", - "%18": "\x18", - "%19": "\x19", - "%1a": "\x1A", - "%1A": "\x1A", - "%1b": "\x1B", - "%1B": "\x1B", - "%1c": "\x1C", - "%1C": "\x1C", - "%1d": "\x1D", - "%1D": "\x1D", - "%1e": "\x1E", - "%1E": "\x1E", - "%1f": "\x1F", - "%1F": "\x1F", - "%20": " ", - "%21": "!", - "%22": '"', - "%23": "#", - "%24": "$", - "%25": "%", - "%26": "&", - "%27": "'", - "%28": "(", - "%29": ")", - "%2a": "*", - "%2A": "*", - "%2b": "+", - "%2B": "+", - "%2c": ",", - "%2C": ",", - "%2d": "-", - "%2D": "-", - "%2e": ".", - "%2E": ".", - "%2f": "/", - "%2F": "/", - "%30": "0", - "%31": "1", - "%32": "2", - "%33": "3", - "%34": "4", - "%35": "5", - "%36": "6", - "%37": "7", - "%38": "8", - "%39": "9", - "%3a": ":", - "%3A": ":", - "%3b": ";", - "%3B": ";", - "%3c": "<", - "%3C": "<", - "%3d": "=", - "%3D": "=", - "%3e": ">", - "%3E": ">", - "%3f": "?", - "%3F": "?", - "%40": "@", - "%41": "A", - "%42": "B", - "%43": "C", - "%44": "D", - "%45": "E", - "%46": "F", - "%47": "G", - "%48": "H", - "%49": "I", - "%4a": "J", - "%4A": "J", - "%4b": "K", - "%4B": "K", - "%4c": "L", - "%4C": "L", - "%4d": "M", - "%4D": "M", - "%4e": "N", - "%4E": "N", - "%4f": "O", - "%4F": "O", - "%50": "P", - "%51": "Q", - "%52": "R", - "%53": "S", - "%54": "T", - "%55": "U", - "%56": "V", - "%57": "W", - "%58": "X", - "%59": "Y", - "%5a": "Z", - "%5A": "Z", - "%5b": "[", - "%5B": "[", - "%5c": "\\", - "%5C": "\\", - "%5d": "]", - "%5D": "]", - "%5e": "^", - "%5E": "^", - "%5f": "_", - "%5F": "_", - "%60": "`", - "%61": "a", - "%62": "b", - "%63": "c", - "%64": "d", - "%65": "e", - "%66": "f", - "%67": "g", - "%68": "h", - "%69": "i", - "%6a": "j", - "%6A": "j", - "%6b": "k", - "%6B": "k", - "%6c": "l", - "%6C": "l", - "%6d": "m", - "%6D": "m", - "%6e": "n", - "%6E": "n", - "%6f": "o", - "%6F": "o", - "%70": "p", - "%71": "q", - "%72": "r", - "%73": "s", - "%74": "t", - "%75": "u", - "%76": "v", - "%77": "w", - "%78": "x", - "%79": "y", - "%7a": "z", - "%7A": "z", - "%7b": "{", - "%7B": "{", - "%7c": "|", - "%7C": "|", - "%7d": "}", - "%7D": "}", - "%7e": "~", - "%7E": "~", - "%7f": "\x7F", - "%7F": "\x7F", - "%80": "\x80", - "%81": "\x81", - "%82": "\x82", - "%83": "\x83", - "%84": "\x84", - "%85": "\x85", - "%86": "\x86", - "%87": "\x87", - "%88": "\x88", - "%89": "\x89", - "%8a": "\x8A", - "%8A": "\x8A", - "%8b": "\x8B", - "%8B": "\x8B", - "%8c": "\x8C", - "%8C": "\x8C", - "%8d": "\x8D", - "%8D": "\x8D", - "%8e": "\x8E", - "%8E": "\x8E", - "%8f": "\x8F", - "%8F": "\x8F", - "%90": "\x90", - "%91": "\x91", - "%92": "\x92", - "%93": "\x93", - "%94": "\x94", - "%95": "\x95", - "%96": "\x96", - "%97": "\x97", - "%98": "\x98", - "%99": "\x99", - "%9a": "\x9A", - "%9A": "\x9A", - "%9b": "\x9B", - "%9B": "\x9B", - "%9c": "\x9C", - "%9C": "\x9C", - "%9d": "\x9D", - "%9D": "\x9D", - "%9e": "\x9E", - "%9E": "\x9E", - "%9f": "\x9F", - "%9F": "\x9F", - "%a0": "\xA0", - "%A0": "\xA0", - "%a1": "\xA1", - "%A1": "\xA1", - "%a2": "\xA2", - "%A2": "\xA2", - "%a3": "\xA3", - "%A3": "\xA3", - "%a4": "\xA4", - "%A4": "\xA4", - "%a5": "\xA5", - "%A5": "\xA5", - "%a6": "\xA6", - "%A6": "\xA6", - "%a7": "\xA7", - "%A7": "\xA7", - "%a8": "\xA8", - "%A8": "\xA8", - "%a9": "\xA9", - "%A9": "\xA9", - "%aa": "\xAA", - "%Aa": "\xAA", - "%aA": "\xAA", - "%AA": "\xAA", - "%ab": "\xAB", - "%Ab": "\xAB", - "%aB": "\xAB", - "%AB": "\xAB", - "%ac": "\xAC", - "%Ac": "\xAC", - "%aC": "\xAC", - "%AC": "\xAC", - "%ad": "\xAD", - "%Ad": "\xAD", - "%aD": "\xAD", - "%AD": "\xAD", - "%ae": "\xAE", - "%Ae": "\xAE", - "%aE": "\xAE", - "%AE": "\xAE", - "%af": "\xAF", - "%Af": "\xAF", - "%aF": "\xAF", - "%AF": "\xAF", - "%b0": "\xB0", - "%B0": "\xB0", - "%b1": "\xB1", - "%B1": "\xB1", - "%b2": "\xB2", - "%B2": "\xB2", - "%b3": "\xB3", - "%B3": "\xB3", - "%b4": "\xB4", - "%B4": "\xB4", - "%b5": "\xB5", - "%B5": "\xB5", - "%b6": "\xB6", - "%B6": "\xB6", - "%b7": "\xB7", - "%B7": "\xB7", - "%b8": "\xB8", - "%B8": "\xB8", - "%b9": "\xB9", - "%B9": "\xB9", - "%ba": "\xBA", - "%Ba": "\xBA", - "%bA": "\xBA", - "%BA": "\xBA", - "%bb": "\xBB", - "%Bb": "\xBB", - "%bB": "\xBB", - "%BB": "\xBB", - "%bc": "\xBC", - "%Bc": "\xBC", - "%bC": "\xBC", - "%BC": "\xBC", - "%bd": "\xBD", - "%Bd": "\xBD", - "%bD": "\xBD", - "%BD": "\xBD", - "%be": "\xBE", - "%Be": "\xBE", - "%bE": "\xBE", - "%BE": "\xBE", - "%bf": "\xBF", - "%Bf": "\xBF", - "%bF": "\xBF", - "%BF": "\xBF", - "%c0": "\xC0", - "%C0": "\xC0", - "%c1": "\xC1", - "%C1": "\xC1", - "%c2": "\xC2", - "%C2": "\xC2", - "%c3": "\xC3", - "%C3": "\xC3", - "%c4": "\xC4", - "%C4": "\xC4", - "%c5": "\xC5", - "%C5": "\xC5", - "%c6": "\xC6", - "%C6": "\xC6", - "%c7": "\xC7", - "%C7": "\xC7", - "%c8": "\xC8", - "%C8": "\xC8", - "%c9": "\xC9", - "%C9": "\xC9", - "%ca": "\xCA", - "%Ca": "\xCA", - "%cA": "\xCA", - "%CA": "\xCA", - "%cb": "\xCB", - "%Cb": "\xCB", - "%cB": "\xCB", - "%CB": "\xCB", - "%cc": "\xCC", - "%Cc": "\xCC", - "%cC": "\xCC", - "%CC": "\xCC", - "%cd": "\xCD", - "%Cd": "\xCD", - "%cD": "\xCD", - "%CD": "\xCD", - "%ce": "\xCE", - "%Ce": "\xCE", - "%cE": "\xCE", - "%CE": "\xCE", - "%cf": "\xCF", - "%Cf": "\xCF", - "%cF": "\xCF", - "%CF": "\xCF", - "%d0": "\xD0", - "%D0": "\xD0", - "%d1": "\xD1", - "%D1": "\xD1", - "%d2": "\xD2", - "%D2": "\xD2", - "%d3": "\xD3", - "%D3": "\xD3", - "%d4": "\xD4", - "%D4": "\xD4", - "%d5": "\xD5", - "%D5": "\xD5", - "%d6": "\xD6", - "%D6": "\xD6", - "%d7": "\xD7", - "%D7": "\xD7", - "%d8": "\xD8", - "%D8": "\xD8", - "%d9": "\xD9", - "%D9": "\xD9", - "%da": "\xDA", - "%Da": "\xDA", - "%dA": "\xDA", - "%DA": "\xDA", - "%db": "\xDB", - "%Db": "\xDB", - "%dB": "\xDB", - "%DB": "\xDB", - "%dc": "\xDC", - "%Dc": "\xDC", - "%dC": "\xDC", - "%DC": "\xDC", - "%dd": "\xDD", - "%Dd": "\xDD", - "%dD": "\xDD", - "%DD": "\xDD", - "%de": "\xDE", - "%De": "\xDE", - "%dE": "\xDE", - "%DE": "\xDE", - "%df": "\xDF", - "%Df": "\xDF", - "%dF": "\xDF", - "%DF": "\xDF", - "%e0": "\xE0", - "%E0": "\xE0", - "%e1": "\xE1", - "%E1": "\xE1", - "%e2": "\xE2", - "%E2": "\xE2", - "%e3": "\xE3", - "%E3": "\xE3", - "%e4": "\xE4", - "%E4": "\xE4", - "%e5": "\xE5", - "%E5": "\xE5", - "%e6": "\xE6", - "%E6": "\xE6", - "%e7": "\xE7", - "%E7": "\xE7", - "%e8": "\xE8", - "%E8": "\xE8", - "%e9": "\xE9", - "%E9": "\xE9", - "%ea": "\xEA", - "%Ea": "\xEA", - "%eA": "\xEA", - "%EA": "\xEA", - "%eb": "\xEB", - "%Eb": "\xEB", - "%eB": "\xEB", - "%EB": "\xEB", - "%ec": "\xEC", - "%Ec": "\xEC", - "%eC": "\xEC", - "%EC": "\xEC", - "%ed": "\xED", - "%Ed": "\xED", - "%eD": "\xED", - "%ED": "\xED", - "%ee": "\xEE", - "%Ee": "\xEE", - "%eE": "\xEE", - "%EE": "\xEE", - "%ef": "\xEF", - "%Ef": "\xEF", - "%eF": "\xEF", - "%EF": "\xEF", - "%f0": "\xF0", - "%F0": "\xF0", - "%f1": "\xF1", - "%F1": "\xF1", - "%f2": "\xF2", - "%F2": "\xF2", - "%f3": "\xF3", - "%F3": "\xF3", - "%f4": "\xF4", - "%F4": "\xF4", - "%f5": "\xF5", - "%F5": "\xF5", - "%f6": "\xF6", - "%F6": "\xF6", - "%f7": "\xF7", - "%F7": "\xF7", - "%f8": "\xF8", - "%F8": "\xF8", - "%f9": "\xF9", - "%F9": "\xF9", - "%fa": "\xFA", - "%Fa": "\xFA", - "%fA": "\xFA", - "%FA": "\xFA", - "%fb": "\xFB", - "%Fb": "\xFB", - "%fB": "\xFB", - "%FB": "\xFB", - "%fc": "\xFC", - "%Fc": "\xFC", - "%fC": "\xFC", - "%FC": "\xFC", - "%fd": "\xFD", - "%Fd": "\xFD", - "%fD": "\xFD", - "%FD": "\xFD", - "%fe": "\xFE", - "%Fe": "\xFE", - "%fE": "\xFE", - "%FE": "\xFE", - "%ff": "\xFF", - "%Ff": "\xFF", - "%fF": "\xFF", - "%FF": "\xFF" - }; - function encodedReplacer(match) { - return EncodedLookup[match]; - } - var STATE_KEY = 0; - var STATE_VALUE = 1; - var STATE_CHARSET = 2; - var STATE_LANG = 3; - function parseParams(str) { - const res = []; - let state = STATE_KEY; - let charset = ""; - let inquote = false; - let escaping = false; - let p = 0; - let tmp = ""; - const len = str.length; - for (var i = 0;i < len; ++i) { - const char = str[i]; - if (char === "\\" && inquote) { - if (escaping) { - escaping = false; - } else { - escaping = true; - continue; - } - } else if (char === '"') { - if (!escaping) { - if (inquote) { - inquote = false; - state = STATE_KEY; - } else { - inquote = true; - } - continue; - } else { - escaping = false; - } - } else { - if (escaping && inquote) { - tmp += "\\"; - } - escaping = false; - if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") { - if (state === STATE_CHARSET) { - state = STATE_LANG; - charset = tmp.substring(1); - } else { - state = STATE_VALUE; - } - tmp = ""; - continue; - } else if (state === STATE_KEY && (char === "*" || char === "=") && res.length) { - state = char === "*" ? STATE_CHARSET : STATE_VALUE; - res[p] = [tmp, undefined]; - tmp = ""; - continue; - } else if (!inquote && char === ";") { - state = STATE_KEY; - if (charset) { - if (tmp.length) { - tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), "binary", charset); - } - charset = ""; - } else if (tmp.length) { - tmp = decodeText(tmp, "binary", "utf8"); - } - if (res[p] === undefined) { - res[p] = tmp; - } else { - res[p][1] = tmp; - } - tmp = ""; - ++p; - continue; - } else if (!inquote && (char === " " || char === "\t")) { - continue; - } - } - tmp += char; - } - if (charset && tmp.length) { - tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), "binary", charset); - } else if (tmp) { - tmp = decodeText(tmp, "binary", "utf8"); - } - if (res[p] === undefined) { - if (tmp) { - res[p] = tmp; - } - } else { - res[p][1] = tmp; - } - return res; - } - module.exports = parseParams; -}); - -// ../node_modules/@fastify/busboy/lib/utils/basename.js -var require_basename = __commonJS((exports, module) => { - module.exports = function basename(path) { - if (typeof path !== "string") { - return ""; - } - for (var i = path.length - 1;i >= 0; --i) { - switch (path.charCodeAt(i)) { - case 47: - case 92: - path = path.slice(i + 1); - return path === ".." || path === "." ? "" : path; - } - } - return path === ".." || path === "." ? "" : path; - }; -}); - -// ../node_modules/@fastify/busboy/lib/types/multipart.js -var require_multipart = __commonJS((exports, module) => { - var { Readable } = __require("node:stream"); - var { inherits } = __require("node:util"); - var Dicer = require_Dicer(); - var parseParams = require_parseParams(); - var decodeText = require_decodeText(); - var basename = require_basename(); - var getLimit = require_getLimit(); - var RE_BOUNDARY = /^boundary$/i; - var RE_FIELD = /^form-data$/i; - var RE_CHARSET = /^charset$/i; - var RE_FILENAME = /^filename$/i; - var RE_NAME = /^name$/i; - Multipart.detect = /^multipart\/form-data/i; - function Multipart(boy, cfg) { - let i; - let len; - const self = this; - let boundary; - const limits = cfg.limits; - const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => contentType === "application/octet-stream" || fileName !== undefined); - const parsedConType = cfg.parsedConType || []; - const defCharset = cfg.defCharset || "utf8"; - const preservePath = cfg.preservePath; - const fileOpts = { highWaterMark: cfg.fileHwm }; - for (i = 0, len = parsedConType.length;i < len; ++i) { - if (Array.isArray(parsedConType[i]) && RE_BOUNDARY.test(parsedConType[i][0])) { - boundary = parsedConType[i][1]; - break; - } - } - function checkFinished() { - if (nends === 0 && finished && !boy._done) { - finished = false; - self.end(); - } - } - if (typeof boundary !== "string") { - throw new Error("Multipart: Boundary not found"); - } - const fieldSizeLimit = getLimit(limits, "fieldSize", 1 * 1024 * 1024); - const fileSizeLimit = getLimit(limits, "fileSize", Infinity); - const filesLimit = getLimit(limits, "files", Infinity); - const fieldsLimit = getLimit(limits, "fields", Infinity); - const partsLimit = getLimit(limits, "parts", Infinity); - const headerPairsLimit = getLimit(limits, "headerPairs", 2000); - const headerSizeLimit = getLimit(limits, "headerSize", 80 * 1024); - let nfiles = 0; - let nfields = 0; - let nends = 0; - let curFile; - let curField; - let finished = false; - this._needDrain = false; - this._pause = false; - this._cb = undefined; - this._nparts = 0; - this._boy = boy; - const parserCfg = { - boundary, - maxHeaderPairs: headerPairsLimit, - maxHeaderSize: headerSizeLimit, - partHwm: fileOpts.highWaterMark, - highWaterMark: cfg.highWaterMark - }; - this.parser = new Dicer(parserCfg); - this.parser.on("drain", function() { - self._needDrain = false; - if (self._cb && !self._pause) { - const cb = self._cb; - self._cb = undefined; - cb(); - } - }).on("part", function onPart(part) { - if (++self._nparts > partsLimit) { - self.parser.removeListener("part", onPart); - self.parser.on("part", skipPart); - boy.hitPartsLimit = true; - boy.emit("partsLimit"); - return skipPart(part); - } - if (curField) { - const field = curField; - field.emit("end"); - field.removeAllListeners("end"); - } - part.on("header", function(header) { - let contype; - let fieldname; - let parsed; - let charset; - let encoding; - let filename; - let nsize = 0; - if (header["content-type"]) { - parsed = parseParams(header["content-type"][0]); - if (parsed[0]) { - contype = parsed[0].toLowerCase(); - for (i = 0, len = parsed.length;i < len; ++i) { - if (RE_CHARSET.test(parsed[i][0])) { - charset = parsed[i][1].toLowerCase(); - break; - } - } - } - } - if (contype === undefined) { - contype = "text/plain"; - } - if (charset === undefined) { - charset = defCharset; - } - if (header["content-disposition"]) { - parsed = parseParams(header["content-disposition"][0]); - if (!RE_FIELD.test(parsed[0])) { - return skipPart(part); - } - for (i = 0, len = parsed.length;i < len; ++i) { - if (RE_NAME.test(parsed[i][0])) { - fieldname = parsed[i][1]; - } else if (RE_FILENAME.test(parsed[i][0])) { - filename = parsed[i][1]; - if (!preservePath) { - filename = basename(filename); - } - } - } - } else { - return skipPart(part); - } - if (header["content-transfer-encoding"]) { - encoding = header["content-transfer-encoding"][0].toLowerCase(); - } else { - encoding = "7bit"; - } - let onData, onEnd; - if (isPartAFile(fieldname, contype, filename)) { - if (nfiles === filesLimit) { - if (!boy.hitFilesLimit) { - boy.hitFilesLimit = true; - boy.emit("filesLimit"); - } - return skipPart(part); - } - ++nfiles; - if (boy.listenerCount("file") === 0) { - self.parser._ignore(); - return; - } - ++nends; - const file = new FileStream(fileOpts); - curFile = file; - file.on("end", function() { - --nends; - self._pause = false; - checkFinished(); - if (self._cb && !self._needDrain) { - const cb = self._cb; - self._cb = undefined; - cb(); - } - }); - file._read = function(n) { - if (!self._pause) { - return; - } - self._pause = false; - if (self._cb && !self._needDrain) { - const cb = self._cb; - self._cb = undefined; - cb(); - } - }; - boy.emit("file", fieldname, file, filename, encoding, contype); - onData = function(data) { - if ((nsize += data.length) > fileSizeLimit) { - const extralen = fileSizeLimit - nsize + data.length; - if (extralen > 0) { - file.push(data.slice(0, extralen)); - } - file.truncated = true; - file.bytesRead = fileSizeLimit; - part.removeAllListeners("data"); - file.emit("limit"); - return; - } else if (!file.push(data)) { - self._pause = true; - } - file.bytesRead = nsize; - }; - onEnd = function() { - curFile = undefined; - file.push(null); - }; - } else { - if (nfields === fieldsLimit) { - if (!boy.hitFieldsLimit) { - boy.hitFieldsLimit = true; - boy.emit("fieldsLimit"); - } - return skipPart(part); - } - ++nfields; - ++nends; - let buffer = ""; - let truncated = false; - curField = part; - onData = function(data) { - if ((nsize += data.length) > fieldSizeLimit) { - const extralen = fieldSizeLimit - (nsize - data.length); - buffer += data.toString("binary", 0, extralen); - truncated = true; - part.removeAllListeners("data"); - } else { - buffer += data.toString("binary"); - } - }; - onEnd = function() { - curField = undefined; - if (buffer.length) { - buffer = decodeText(buffer, "binary", charset); - } - boy.emit("field", fieldname, buffer, false, truncated, encoding, contype); - --nends; - checkFinished(); - }; - } - part._readableState.sync = false; - part.on("data", onData); - part.on("end", onEnd); - }).on("error", function(err) { - if (curFile) { - curFile.emit("error", err); - } - }); - }).on("error", function(err) { - boy.emit("error", err); - }).on("finish", function() { - finished = true; - checkFinished(); - }); - } - Multipart.prototype.write = function(chunk, cb) { - const r = this.parser.write(chunk); - if (r && !this._pause) { - cb(); - } else { - this._needDrain = !r; - this._cb = cb; - } - }; - Multipart.prototype.end = function() { - const self = this; - if (self.parser.writable) { - self.parser.end(); - } else if (!self._boy._done) { - process.nextTick(function() { - self._boy._done = true; - self._boy.emit("finish"); - }); - } - }; - function skipPart(part) { - part.resume(); - } - function FileStream(opts) { - Readable.call(this, opts); - this.bytesRead = 0; - this.truncated = false; - } - inherits(FileStream, Readable); - FileStream.prototype._read = function(n) { - }; - module.exports = Multipart; -}); - -// ../node_modules/@fastify/busboy/lib/utils/Decoder.js -var require_Decoder = __commonJS((exports, module) => { - var RE_PLUS = /\+/g; - var HEX = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ]; - function Decoder() { - this.buffer = undefined; - } - Decoder.prototype.write = function(str) { - str = str.replace(RE_PLUS, " "); - let res = ""; - let i = 0; - let p = 0; - const len = str.length; - for (;i < len; ++i) { - if (this.buffer !== undefined) { - if (!HEX[str.charCodeAt(i)]) { - res += "%" + this.buffer; - this.buffer = undefined; - --i; - } else { - this.buffer += str[i]; - ++p; - if (this.buffer.length === 2) { - res += String.fromCharCode(parseInt(this.buffer, 16)); - this.buffer = undefined; - } - } - } else if (str[i] === "%") { - if (i > p) { - res += str.substring(p, i); - p = i; - } - this.buffer = ""; - ++p; - } - } - if (p < len && this.buffer === undefined) { - res += str.substring(p); - } - return res; - }; - Decoder.prototype.reset = function() { - this.buffer = undefined; - }; - module.exports = Decoder; -}); - -// ../node_modules/@fastify/busboy/lib/types/urlencoded.js -var require_urlencoded = __commonJS((exports, module) => { - var Decoder = require_Decoder(); - var decodeText = require_decodeText(); - var getLimit = require_getLimit(); - var RE_CHARSET = /^charset$/i; - UrlEncoded.detect = /^application\/x-www-form-urlencoded/i; - function UrlEncoded(boy, cfg) { - const limits = cfg.limits; - const parsedConType = cfg.parsedConType; - this.boy = boy; - this.fieldSizeLimit = getLimit(limits, "fieldSize", 1 * 1024 * 1024); - this.fieldNameSizeLimit = getLimit(limits, "fieldNameSize", 100); - this.fieldsLimit = getLimit(limits, "fields", Infinity); - let charset; - for (var i = 0, len = parsedConType.length;i < len; ++i) { - if (Array.isArray(parsedConType[i]) && RE_CHARSET.test(parsedConType[i][0])) { - charset = parsedConType[i][1].toLowerCase(); - break; - } - } - if (charset === undefined) { - charset = cfg.defCharset || "utf8"; - } - this.decoder = new Decoder; - this.charset = charset; - this._fields = 0; - this._state = "key"; - this._checkingBytes = true; - this._bytesKey = 0; - this._bytesVal = 0; - this._key = ""; - this._val = ""; - this._keyTrunc = false; - this._valTrunc = false; - this._hitLimit = false; - } - UrlEncoded.prototype.write = function(data, cb) { - if (this._fields === this.fieldsLimit) { - if (!this.boy.hitFieldsLimit) { - this.boy.hitFieldsLimit = true; - this.boy.emit("fieldsLimit"); - } - return cb(); - } - let idxeq; - let idxamp; - let i; - let p = 0; - const len = data.length; - while (p < len) { - if (this._state === "key") { - idxeq = idxamp = undefined; - for (i = p;i < len; ++i) { - if (!this._checkingBytes) { - ++p; - } - if (data[i] === 61) { - idxeq = i; - break; - } else if (data[i] === 38) { - idxamp = i; - break; - } - if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { - this._hitLimit = true; - break; - } else if (this._checkingBytes) { - ++this._bytesKey; - } - } - if (idxeq !== undefined) { - if (idxeq > p) { - this._key += this.decoder.write(data.toString("binary", p, idxeq)); - } - this._state = "val"; - this._hitLimit = false; - this._checkingBytes = true; - this._val = ""; - this._bytesVal = 0; - this._valTrunc = false; - this.decoder.reset(); - p = idxeq + 1; - } else if (idxamp !== undefined) { - ++this._fields; - let key; - const keyTrunc = this._keyTrunc; - if (idxamp > p) { - key = this._key += this.decoder.write(data.toString("binary", p, idxamp)); - } else { - key = this._key; - } - this._hitLimit = false; - this._checkingBytes = true; - this._key = ""; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - if (key.length) { - this.boy.emit("field", decodeText(key, "binary", this.charset), "", keyTrunc, false); - } - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { - return cb(); - } - } else if (this._hitLimit) { - if (i > p) { - this._key += this.decoder.write(data.toString("binary", p, i)); - } - p = i; - if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { - this._checkingBytes = false; - this._keyTrunc = true; - } - } else { - if (p < len) { - this._key += this.decoder.write(data.toString("binary", p)); - } - p = len; - } - } else { - idxamp = undefined; - for (i = p;i < len; ++i) { - if (!this._checkingBytes) { - ++p; - } - if (data[i] === 38) { - idxamp = i; - break; - } - if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { - this._hitLimit = true; - break; - } else if (this._checkingBytes) { - ++this._bytesVal; - } - } - if (idxamp !== undefined) { - ++this._fields; - if (idxamp > p) { - this._val += this.decoder.write(data.toString("binary", p, idxamp)); - } - this.boy.emit("field", decodeText(this._key, "binary", this.charset), decodeText(this._val, "binary", this.charset), this._keyTrunc, this._valTrunc); - this._state = "key"; - this._hitLimit = false; - this._checkingBytes = true; - this._key = ""; - this._bytesKey = 0; - this._keyTrunc = false; - this.decoder.reset(); - p = idxamp + 1; - if (this._fields === this.fieldsLimit) { - return cb(); - } - } else if (this._hitLimit) { - if (i > p) { - this._val += this.decoder.write(data.toString("binary", p, i)); - } - p = i; - if (this._val === "" && this.fieldSizeLimit === 0 || (this._bytesVal = this._val.length) === this.fieldSizeLimit) { - this._checkingBytes = false; - this._valTrunc = true; - } - } else { - if (p < len) { - this._val += this.decoder.write(data.toString("binary", p)); - } - p = len; - } - } - } - cb(); - }; - UrlEncoded.prototype.end = function() { - if (this.boy._done) { - return; - } - if (this._state === "key" && this._key.length > 0) { - this.boy.emit("field", decodeText(this._key, "binary", this.charset), "", this._keyTrunc, false); - } else if (this._state === "val") { - this.boy.emit("field", decodeText(this._key, "binary", this.charset), decodeText(this._val, "binary", this.charset), this._keyTrunc, this._valTrunc); - } - this.boy._done = true; - this.boy.emit("finish"); - }; - module.exports = UrlEncoded; -}); - -// ../node_modules/@fastify/busboy/lib/main.js -var require_main = __commonJS((exports, module) => { - var WritableStream = __require("node:stream").Writable; - var { inherits } = __require("node:util"); - var Dicer = require_Dicer(); - var MultipartParser = require_multipart(); - var UrlencodedParser = require_urlencoded(); - var parseParams = require_parseParams(); - function Busboy(opts) { - if (!(this instanceof Busboy)) { - return new Busboy(opts); - } - if (typeof opts !== "object") { - throw new TypeError("Busboy expected an options-Object."); - } - if (typeof opts.headers !== "object") { - throw new TypeError("Busboy expected an options-Object with headers-attribute."); - } - if (typeof opts.headers["content-type"] !== "string") { - throw new TypeError("Missing Content-Type-header."); - } - const { - headers, - ...streamOptions - } = opts; - this.opts = { - autoDestroy: false, - ...streamOptions - }; - WritableStream.call(this, this.opts); - this._done = false; - this._parser = this.getParserByHeaders(headers); - this._finished = false; - } - inherits(Busboy, WritableStream); - Busboy.prototype.emit = function(ev) { - if (ev === "finish") { - if (!this._done) { - this._parser?.end(); - return; - } else if (this._finished) { - return; - } - this._finished = true; - } - WritableStream.prototype.emit.apply(this, arguments); - }; - Busboy.prototype.getParserByHeaders = function(headers) { - const parsed = parseParams(headers["content-type"]); - const cfg = { - defCharset: this.opts.defCharset, - fileHwm: this.opts.fileHwm, - headers, - highWaterMark: this.opts.highWaterMark, - isPartAFile: this.opts.isPartAFile, - limits: this.opts.limits, - parsedConType: parsed, - preservePath: this.opts.preservePath - }; - if (MultipartParser.detect.test(parsed[0])) { - return new MultipartParser(this, cfg); - } - if (UrlencodedParser.detect.test(parsed[0])) { - return new UrlencodedParser(this, cfg); - } - throw new Error("Unsupported Content-Type."); - }; - Busboy.prototype._write = function(chunk, encoding, cb) { - this._parser.write(chunk, cb); - }; - module.exports = Busboy; - module.exports.default = Busboy; - module.exports.Busboy = Busboy; - module.exports.Dicer = Dicer; -}); - -// ../node_modules/undici/lib/fetch/constants.js -var require_constants2 = __commonJS((exports, module) => { - var { MessageChannel, receiveMessageOnPort } = __require("worker_threads"); - var corsSafeListedMethods = ["GET", "HEAD", "POST"]; - var corsSafeListedMethodsSet = new Set(corsSafeListedMethods); - var nullBodyStatus = [101, 204, 205, 304]; - var redirectStatus = [301, 302, 303, 307, 308]; - var redirectStatusSet = new Set(redirectStatus); - var badPorts = [ - "1", - "7", - "9", - "11", - "13", - "15", - "17", - "19", - "20", - "21", - "22", - "23", - "25", - "37", - "42", - "43", - "53", - "69", - "77", - "79", - "87", - "95", - "101", - "102", - "103", - "104", - "109", - "110", - "111", - "113", - "115", - "117", - "119", - "123", - "135", - "137", - "139", - "143", - "161", - "179", - "389", - "427", - "465", - "512", - "513", - "514", - "515", - "526", - "530", - "531", - "532", - "540", - "548", - "554", - "556", - "563", - "587", - "601", - "636", - "989", - "990", - "993", - "995", - "1719", - "1720", - "1723", - "2049", - "3659", - "4045", - "5060", - "5061", - "6000", - "6566", - "6665", - "6666", - "6667", - "6668", - "6669", - "6697", - "10080" - ]; - var badPortsSet = new Set(badPorts); - var referrerPolicy = [ - "", - "no-referrer", - "no-referrer-when-downgrade", - "same-origin", - "origin", - "strict-origin", - "origin-when-cross-origin", - "strict-origin-when-cross-origin", - "unsafe-url" - ]; - var referrerPolicySet = new Set(referrerPolicy); - var requestRedirect = ["follow", "manual", "error"]; - var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"]; - var safeMethodsSet = new Set(safeMethods); - var requestMode = ["navigate", "same-origin", "no-cors", "cors"]; - var requestCredentials = ["omit", "same-origin", "include"]; - var requestCache = [ - "default", - "no-store", - "reload", - "no-cache", - "force-cache", - "only-if-cached" - ]; - var requestBodyHeader = [ - "content-encoding", - "content-language", - "content-location", - "content-type", - "content-length" - ]; - var requestDuplex = [ - "half" - ]; - var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; - var forbiddenMethodsSet = new Set(forbiddenMethods); - var subresource = [ - "audio", - "audioworklet", - "font", - "image", - "manifest", - "paintworklet", - "script", - "style", - "track", - "video", - "xslt", - "" - ]; - var subresourceSet = new Set(subresource); - var DOMException2 = globalThis.DOMException ?? (() => { - try { - atob("~"); - } catch (err) { - return Object.getPrototypeOf(err).constructor; - } - })(); - var channel; - var structuredClone = globalThis.structuredClone ?? function structuredClone(value, options = undefined) { - if (arguments.length === 0) { - throw new TypeError("missing argument"); - } - if (!channel) { - channel = new MessageChannel; - } - channel.port1.unref(); - channel.port2.unref(); - channel.port1.postMessage(value, options?.transfer); - return receiveMessageOnPort(channel.port2).message; - }; - module.exports = { - DOMException: DOMException2, - structuredClone, - subresource, - forbiddenMethods, - requestBodyHeader, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - redirectStatus, - corsSafeListedMethods, - nullBodyStatus, - safeMethods, - badPorts, - requestDuplex, - subresourceSet, - badPortsSet, - redirectStatusSet, - corsSafeListedMethodsSet, - safeMethodsSet, - forbiddenMethodsSet, - referrerPolicySet - }; -}); - -// ../node_modules/undici/lib/fetch/global.js -var require_global = __commonJS((exports, module) => { - var globalOrigin = Symbol.for("undici.globalOrigin.1"); - function getGlobalOrigin() { - return globalThis[globalOrigin]; - } - function setGlobalOrigin(newOrigin) { - if (newOrigin === undefined) { - Object.defineProperty(globalThis, globalOrigin, { - value: undefined, - writable: true, - enumerable: false, - configurable: false - }); - return; - } - const parsedURL = new URL(newOrigin); - if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { - throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); - } - Object.defineProperty(globalThis, globalOrigin, { - value: parsedURL, - writable: true, - enumerable: false, - configurable: false - }); - } - module.exports = { - getGlobalOrigin, - setGlobalOrigin - }; -}); - -// ../node_modules/undici/lib/fetch/util.js -var require_util2 = __commonJS((exports, module) => { - var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants2(); - var { getGlobalOrigin } = require_global(); - var { performance: performance2 } = __require("perf_hooks"); - var { isBlobLike, toUSVString, ReadableStreamFrom } = require_util(); - var assert = __require("assert"); - var { isUint8Array } = __require("util/types"); - var supportedHashes = []; - var crypto; - try { - crypto = __require("crypto"); - const possibleRelevantHashes = ["sha256", "sha384", "sha512"]; - supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); - } catch { - } - function responseURL(response) { - const urlList = response.urlList; - const length = urlList.length; - return length === 0 ? null : urlList[length - 1].toString(); - } - function responseLocationURL(response, requestFragment) { - if (!redirectStatusSet.has(response.status)) { - return null; - } - let location = response.headersList.get("location"); - if (location !== null && isValidHeaderValue(location)) { - location = new URL(location, responseURL(response)); - } - if (location && !location.hash) { - location.hash = requestFragment; - } - return location; - } - function requestCurrentURL(request) { - return request.urlList[request.urlList.length - 1]; - } - function requestBadPort(request) { - const url = requestCurrentURL(request); - if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { - return "blocked"; - } - return "allowed"; - } - function isErrorLike(object) { - return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); - } - function isValidReasonPhrase(statusText) { - for (let i = 0;i < statusText.length; ++i) { - const c = statusText.charCodeAt(i); - if (!(c === 9 || c >= 32 && c <= 126 || c >= 128 && c <= 255)) { - return false; - } - } - return true; - } - function isTokenCharCode(c) { - switch (c) { - case 34: - case 40: - case 41: - case 44: - case 47: - case 58: - case 59: - case 60: - case 61: - case 62: - case 63: - case 64: - case 91: - case 92: - case 93: - case 123: - case 125: - return false; - default: - return c >= 33 && c <= 126; - } - } - function isValidHTTPToken(characters) { - if (characters.length === 0) { - return false; - } - for (let i = 0;i < characters.length; ++i) { - if (!isTokenCharCode(characters.charCodeAt(i))) { - return false; - } - } - return true; - } - function isValidHeaderName(potentialValue) { - return isValidHTTPToken(potentialValue); - } - function isValidHeaderValue(potentialValue) { - if (potentialValue.startsWith("\t") || potentialValue.startsWith(" ") || potentialValue.endsWith("\t") || potentialValue.endsWith(" ")) { - return false; - } - if (potentialValue.includes("\0") || potentialValue.includes("\r") || potentialValue.includes("\n")) { - return false; - } - return true; - } - function setRequestReferrerPolicyOnRedirect(request, actualResponse) { - const { headersList } = actualResponse; - const policyHeader = (headersList.get("referrer-policy") ?? "").split(","); - let policy = ""; - if (policyHeader.length > 0) { - for (let i = policyHeader.length;i !== 0; i--) { - const token = policyHeader[i - 1].trim(); - if (referrerPolicyTokens.has(token)) { - policy = token; - break; - } - } - } - if (policy !== "") { - request.referrerPolicy = policy; - } - } - function crossOriginResourcePolicyCheck() { - return "allowed"; - } - function corsCheck() { - return "success"; - } - function TAOCheck() { - return "success"; - } - function appendFetchMetadata(httpRequest) { - let header = null; - header = httpRequest.mode; - httpRequest.headersList.set("sec-fetch-mode", header); - } - function appendRequestOriginHeader(request) { - let serializedOrigin = request.origin; - if (request.responseTainting === "cors" || request.mode === "websocket") { - if (serializedOrigin) { - request.headersList.append("origin", serializedOrigin); - } - } else if (request.method !== "GET" && request.method !== "HEAD") { - switch (request.referrerPolicy) { - case "no-referrer": - serializedOrigin = null; - break; - case "no-referrer-when-downgrade": - case "strict-origin": - case "strict-origin-when-cross-origin": - if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - case "same-origin": - if (!sameOrigin(request, requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - default: - } - if (serializedOrigin) { - request.headersList.append("origin", serializedOrigin); - } - } - } - function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { - return performance2.now(); - } - function createOpaqueTimingInfo(timingInfo) { - return { - startTime: timingInfo.startTime ?? 0, - redirectStartTime: 0, - redirectEndTime: 0, - postRedirectStartTime: timingInfo.startTime ?? 0, - finalServiceWorkerStartTime: 0, - finalNetworkResponseStartTime: 0, - finalNetworkRequestStartTime: 0, - endTime: 0, - encodedBodySize: 0, - decodedBodySize: 0, - finalConnectionTimingInfo: null - }; - } - function makePolicyContainer() { - return { - referrerPolicy: "strict-origin-when-cross-origin" - }; - } - function clonePolicyContainer(policyContainer) { - return { - referrerPolicy: policyContainer.referrerPolicy - }; - } - function determineRequestsReferrer(request) { - const policy = request.referrerPolicy; - assert(policy); - let referrerSource = null; - if (request.referrer === "client") { - const globalOrigin = getGlobalOrigin(); - if (!globalOrigin || globalOrigin.origin === "null") { - return "no-referrer"; - } - referrerSource = new URL(globalOrigin); - } else if (request.referrer instanceof URL) { - referrerSource = request.referrer; - } - let referrerURL = stripURLForReferrer(referrerSource); - const referrerOrigin = stripURLForReferrer(referrerSource, true); - if (referrerURL.toString().length > 4096) { - referrerURL = referrerOrigin; - } - const areSameOrigin = sameOrigin(request, referrerURL); - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url); - switch (policy) { - case "origin": - return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); - case "unsafe-url": - return referrerURL; - case "same-origin": - return areSameOrigin ? referrerOrigin : "no-referrer"; - case "origin-when-cross-origin": - return areSameOrigin ? referrerURL : referrerOrigin; - case "strict-origin-when-cross-origin": { - const currentURL = requestCurrentURL(request); - if (sameOrigin(referrerURL, currentURL)) { - return referrerURL; - } - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return "no-referrer"; - } - return referrerOrigin; - } - case "strict-origin": - case "no-referrer-when-downgrade": - default: - return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; - } - } - function stripURLForReferrer(url, originOnly) { - assert(url instanceof URL); - if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { - return "no-referrer"; - } - url.username = ""; - url.password = ""; - url.hash = ""; - if (originOnly) { - url.pathname = ""; - url.search = ""; - } - return url; - } - function isURLPotentiallyTrustworthy(url) { - if (!(url instanceof URL)) { - return false; - } - if (url.href === "about:blank" || url.href === "about:srcdoc") { - return true; - } - if (url.protocol === "data:") - return true; - if (url.protocol === "file:") - return true; - return isOriginPotentiallyTrustworthy(url.origin); - function isOriginPotentiallyTrustworthy(origin) { - if (origin == null || origin === "null") - return false; - const originAsURL = new URL(origin); - if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { - return true; - } - if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { - return true; - } - return false; - } - } - function bytesMatch(bytes, metadataList) { - if (crypto === undefined) { - return true; - } - const parsedMetadata = parseMetadata(metadataList); - if (parsedMetadata === "no metadata") { - return true; - } - if (parsedMetadata.length === 0) { - return true; - } - const strongest = getStrongestMetadata(parsedMetadata); - const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); - for (const item of metadata) { - const algorithm = item.algo; - const expectedValue = item.hash; - let actualValue = crypto.createHash(algorithm).update(bytes).digest("base64"); - if (actualValue[actualValue.length - 1] === "=") { - if (actualValue[actualValue.length - 2] === "=") { - actualValue = actualValue.slice(0, -2); - } else { - actualValue = actualValue.slice(0, -1); - } - } - if (compareBase64Mixed(actualValue, expectedValue)) { - return true; - } - } - return false; - } - var parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; - function parseMetadata(metadata) { - const result = []; - let empty = true; - for (const token of metadata.split(" ")) { - empty = false; - const parsedToken = parseHashWithOptions.exec(token); - if (parsedToken === null || parsedToken.groups === undefined || parsedToken.groups.algo === undefined) { - continue; - } - const algorithm = parsedToken.groups.algo.toLowerCase(); - if (supportedHashes.includes(algorithm)) { - result.push(parsedToken.groups); - } - } - if (empty === true) { - return "no metadata"; - } - return result; - } - function getStrongestMetadata(metadataList) { - let algorithm = metadataList[0].algo; - if (algorithm[3] === "5") { - return algorithm; - } - for (let i = 1;i < metadataList.length; ++i) { - const metadata = metadataList[i]; - if (metadata.algo[3] === "5") { - algorithm = "sha512"; - break; - } else if (algorithm[3] === "3") { - continue; - } else if (metadata.algo[3] === "3") { - algorithm = "sha384"; - } - } - return algorithm; - } - function filterMetadataListByAlgorithm(metadataList, algorithm) { - if (metadataList.length === 1) { - return metadataList; - } - let pos = 0; - for (let i = 0;i < metadataList.length; ++i) { - if (metadataList[i].algo === algorithm) { - metadataList[pos++] = metadataList[i]; - } - } - metadataList.length = pos; - return metadataList; - } - function compareBase64Mixed(actualValue, expectedValue) { - if (actualValue.length !== expectedValue.length) { - return false; - } - for (let i = 0;i < actualValue.length; ++i) { - if (actualValue[i] !== expectedValue[i]) { - if (actualValue[i] === "+" && expectedValue[i] === "-" || actualValue[i] === "/" && expectedValue[i] === "_") { - continue; - } - return false; - } - } - return true; - } - function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) { - } - function sameOrigin(A, B) { - if (A.origin === B.origin && A.origin === "null") { - return true; - } - if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { - return true; - } - return false; - } - function createDeferredPromise() { - let res; - let rej; - const promise = new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }); - return { promise, resolve: res, reject: rej }; - } - function isAborted(fetchParams) { - return fetchParams.controller.state === "aborted"; - } - function isCancelled(fetchParams) { - return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; - } - var normalizeMethodRecord = { - delete: "DELETE", - DELETE: "DELETE", - get: "GET", - GET: "GET", - head: "HEAD", - HEAD: "HEAD", - options: "OPTIONS", - OPTIONS: "OPTIONS", - post: "POST", - POST: "POST", - put: "PUT", - PUT: "PUT" - }; - Object.setPrototypeOf(normalizeMethodRecord, null); - function normalizeMethod(method) { - return normalizeMethodRecord[method.toLowerCase()] ?? method; - } - function serializeJavascriptValueToJSONString(value) { - const result = JSON.stringify(value); - if (result === undefined) { - throw new TypeError("Value is not JSON serializable"); - } - assert(typeof result === "string"); - return result; - } - var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); - function makeIterator(iterator, name, kind) { - const object = { - index: 0, - kind, - target: iterator - }; - const i = { - next() { - if (Object.getPrototypeOf(this) !== i) { - throw new TypeError(`'next' called on an object that does not implement interface ${name} Iterator.`); - } - const { index, kind: kind2, target } = object; - const values = target(); - const len = values.length; - if (index >= len) { - return { value: undefined, done: true }; - } - const pair = values[index]; - object.index = index + 1; - return iteratorResult(pair, kind2); - }, - [Symbol.toStringTag]: `${name} Iterator` - }; - Object.setPrototypeOf(i, esIteratorPrototype); - return Object.setPrototypeOf({}, i); - } - function iteratorResult(pair, kind) { - let result; - switch (kind) { - case "key": { - result = pair[0]; - break; - } - case "value": { - result = pair[1]; - break; - } - case "key+value": { - result = pair; - break; - } - } - return { value: result, done: false }; - } - async function fullyReadBody(body, processBody, processBodyError) { - const successSteps = processBody; - const errorSteps = processBodyError; - let reader; - try { - reader = body.stream.getReader(); - } catch (e) { - errorSteps(e); - return; - } - try { - const result = await readAllBytes(reader); - successSteps(result); - } catch (e) { - errorSteps(e); - } - } - var ReadableStream = globalThis.ReadableStream; - function isReadableStreamLike(stream) { - if (!ReadableStream) { - ReadableStream = __require("stream/web").ReadableStream; - } - return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; - } - var MAXIMUM_ARGUMENT_LENGTH = 65535; - function isomorphicDecode(input) { - if (input.length < MAXIMUM_ARGUMENT_LENGTH) { - return String.fromCharCode(...input); - } - return input.reduce((previous, current) => previous + String.fromCharCode(current), ""); - } - function readableStreamClose(controller) { - try { - controller.close(); - } catch (err) { - if (!err.message.includes("Controller is already closed")) { - throw err; - } - } - } - function isomorphicEncode(input) { - for (let i = 0;i < input.length; i++) { - assert(input.charCodeAt(i) <= 255); - } - return input; - } - async function readAllBytes(reader) { - const bytes = []; - let byteLength = 0; - while (true) { - const { done, value: chunk } = await reader.read(); - if (done) { - return Buffer.concat(bytes, byteLength); - } - if (!isUint8Array(chunk)) { - throw new TypeError("Received non-Uint8Array chunk"); - } - bytes.push(chunk); - byteLength += chunk.length; - } - } - function urlIsLocal(url) { - assert("protocol" in url); - const protocol = url.protocol; - return protocol === "about:" || protocol === "blob:" || protocol === "data:"; - } - function urlHasHttpsScheme(url) { - if (typeof url === "string") { - return url.startsWith("https:"); - } - return url.protocol === "https:"; - } - function urlIsHttpHttpsScheme(url) { - assert("protocol" in url); - const protocol = url.protocol; - return protocol === "http:" || protocol === "https:"; - } - var hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)); - module.exports = { - isAborted, - isCancelled, - createDeferredPromise, - ReadableStreamFrom, - toUSVString, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - coarsenedSharedCurrentTime, - determineRequestsReferrer, - makePolicyContainer, - clonePolicyContainer, - appendFetchMetadata, - appendRequestOriginHeader, - TAOCheck, - corsCheck, - crossOriginResourcePolicyCheck, - createOpaqueTimingInfo, - setRequestReferrerPolicyOnRedirect, - isValidHTTPToken, - requestBadPort, - requestCurrentURL, - responseURL, - responseLocationURL, - isBlobLike, - isURLPotentiallyTrustworthy, - isValidReasonPhrase, - sameOrigin, - normalizeMethod, - serializeJavascriptValueToJSONString, - makeIterator, - isValidHeaderName, - isValidHeaderValue, - hasOwn, - isErrorLike, - fullyReadBody, - bytesMatch, - isReadableStreamLike, - readableStreamClose, - isomorphicEncode, - isomorphicDecode, - urlIsLocal, - urlHasHttpsScheme, - urlIsHttpHttpsScheme, - readAllBytes, - normalizeMethodRecord, - parseMetadata - }; -}); - -// ../node_modules/undici/lib/fetch/symbols.js -var require_symbols2 = __commonJS((exports, module) => { - module.exports = { - kUrl: Symbol("url"), - kHeaders: Symbol("headers"), - kSignal: Symbol("signal"), - kState: Symbol("state"), - kGuard: Symbol("guard"), - kRealm: Symbol("realm") - }; -}); - -// ../node_modules/undici/lib/fetch/webidl.js -var require_webidl = __commonJS((exports, module) => { - var { types } = __require("util"); - var { hasOwn, toUSVString } = require_util2(); - var webidl = {}; - webidl.converters = {}; - webidl.util = {}; - webidl.errors = {}; - webidl.errors.exception = function(message) { - return new TypeError(`${message.header}: ${message.message}`); - }; - webidl.errors.conversionFailed = function(context) { - const plural = context.types.length === 1 ? "" : " one of"; - const message = `${context.argument} could not be converted to` + `${plural}: ${context.types.join(", ")}.`; - return webidl.errors.exception({ - header: context.prefix, - message - }); - }; - webidl.errors.invalidArgument = function(context) { - return webidl.errors.exception({ - header: context.prefix, - message: `"${context.value}" is an invalid ${context.type}.` - }); - }; - webidl.brandCheck = function(V, I, opts = undefined) { - if (opts?.strict !== false && !(V instanceof I)) { - throw new TypeError("Illegal invocation"); - } else { - return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag]; - } - }; - webidl.argumentLengthCheck = function({ length }, min, ctx) { - if (length < min) { - throw webidl.errors.exception({ - message: `${min} argument${min !== 1 ? "s" : ""} required, ` + `but${length ? " only" : ""} ${length} found.`, - ...ctx - }); - } - }; - webidl.illegalConstructor = function() { - throw webidl.errors.exception({ - header: "TypeError", - message: "Illegal constructor" - }); - }; - webidl.util.Type = function(V) { - switch (typeof V) { - case "undefined": - return "Undefined"; - case "boolean": - return "Boolean"; - case "string": - return "String"; - case "symbol": - return "Symbol"; - case "number": - return "Number"; - case "bigint": - return "BigInt"; - case "function": - case "object": { - if (V === null) { - return "Null"; - } - return "Object"; - } - } - }; - webidl.util.ConvertToInt = function(V, bitLength, signedness, opts = {}) { - let upperBound; - let lowerBound; - if (bitLength === 64) { - upperBound = Math.pow(2, 53) - 1; - if (signedness === "unsigned") { - lowerBound = 0; - } else { - lowerBound = Math.pow(-2, 53) + 1; - } - } else if (signedness === "unsigned") { - lowerBound = 0; - upperBound = Math.pow(2, bitLength) - 1; - } else { - lowerBound = Math.pow(-2, bitLength) - 1; - upperBound = Math.pow(2, bitLength - 1) - 1; - } - let x = Number(V); - if (x === 0) { - x = 0; - } - if (opts.enforceRange === true) { - if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Could not convert ${V} to an integer.` - }); - } - x = webidl.util.IntegerPart(x); - if (x < lowerBound || x > upperBound) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` - }); - } - return x; - } - if (!Number.isNaN(x) && opts.clamp === true) { - x = Math.min(Math.max(x, lowerBound), upperBound); - if (Math.floor(x) % 2 === 0) { - x = Math.floor(x); - } else { - x = Math.ceil(x); - } - return x; - } - if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - return 0; - } - x = webidl.util.IntegerPart(x); - x = x % Math.pow(2, bitLength); - if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { - return x - Math.pow(2, bitLength); - } - return x; - }; - webidl.util.IntegerPart = function(n) { - const r = Math.floor(Math.abs(n)); - if (n < 0) { - return -1 * r; - } - return r; - }; - webidl.sequenceConverter = function(converter) { - return (V) => { - if (webidl.util.Type(V) !== "Object") { - throw webidl.errors.exception({ - header: "Sequence", - message: `Value of type ${webidl.util.Type(V)} is not an Object.` - }); - } - const method = V?.[Symbol.iterator]?.(); - const seq = []; - if (method === undefined || typeof method.next !== "function") { - throw webidl.errors.exception({ - header: "Sequence", - message: "Object is not an iterator." - }); - } - while (true) { - const { done, value } = method.next(); - if (done) { - break; - } - seq.push(converter(value)); - } - return seq; - }; - }; - webidl.recordConverter = function(keyConverter, valueConverter) { - return (O) => { - if (webidl.util.Type(O) !== "Object") { - throw webidl.errors.exception({ - header: "Record", - message: `Value of type ${webidl.util.Type(O)} is not an Object.` - }); - } - const result = {}; - if (!types.isProxy(O)) { - const keys2 = Object.keys(O); - for (const key of keys2) { - const typedKey = keyConverter(key); - const typedValue = valueConverter(O[key]); - result[typedKey] = typedValue; - } - return result; - } - const keys = Reflect.ownKeys(O); - for (const key of keys) { - const desc = Reflect.getOwnPropertyDescriptor(O, key); - if (desc?.enumerable) { - const typedKey = keyConverter(key); - const typedValue = valueConverter(O[key]); - result[typedKey] = typedValue; - } - } - return result; - }; - }; - webidl.interfaceConverter = function(i) { - return (V, opts = {}) => { - if (opts.strict !== false && !(V instanceof i)) { - throw webidl.errors.exception({ - header: i.name, - message: `Expected ${V} to be an instance of ${i.name}.` - }); - } - return V; - }; - }; - webidl.dictionaryConverter = function(converters) { - return (dictionary) => { - const type = webidl.util.Type(dictionary); - const dict = {}; - if (type === "Null" || type === "Undefined") { - return dict; - } else if (type !== "Object") { - throw webidl.errors.exception({ - header: "Dictionary", - message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` - }); - } - for (const options of converters) { - const { key, defaultValue, required, converter } = options; - if (required === true) { - if (!hasOwn(dictionary, key)) { - throw webidl.errors.exception({ - header: "Dictionary", - message: `Missing required key "${key}".` - }); - } - } - let value = dictionary[key]; - const hasDefault = hasOwn(options, "defaultValue"); - if (hasDefault && value !== null) { - value = value ?? defaultValue; - } - if (required || hasDefault || value !== undefined) { - value = converter(value); - if (options.allowedValues && !options.allowedValues.includes(value)) { - throw webidl.errors.exception({ - header: "Dictionary", - message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(", ")}.` - }); - } - dict[key] = value; - } - } - return dict; - }; - }; - webidl.nullableConverter = function(converter) { - return (V) => { - if (V === null) { - return V; - } - return converter(V); - }; - }; - webidl.converters.DOMString = function(V, opts = {}) { - if (V === null && opts.legacyNullToEmptyString) { - return ""; - } - if (typeof V === "symbol") { - throw new TypeError("Could not convert argument of type symbol to string."); - } - return String(V); - }; - webidl.converters.ByteString = function(V) { - const x = webidl.converters.DOMString(V); - for (let index = 0;index < x.length; index++) { - if (x.charCodeAt(index) > 255) { - throw new TypeError("Cannot convert argument to a ByteString because the character at " + `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`); - } - } - return x; - }; - webidl.converters.USVString = toUSVString; - webidl.converters.boolean = function(V) { - const x = Boolean(V); - return x; - }; - webidl.converters.any = function(V) { - return V; - }; - webidl.converters["long long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 64, "signed"); - return x; - }; - webidl.converters["unsigned long long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 64, "unsigned"); - return x; - }; - webidl.converters["unsigned long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 32, "unsigned"); - return x; - }; - webidl.converters["unsigned short"] = function(V, opts) { - const x = webidl.util.ConvertToInt(V, 16, "unsigned", opts); - return x; - }; - webidl.converters.ArrayBuffer = function(V, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { - throw webidl.errors.conversionFailed({ - prefix: `${V}`, - argument: `${V}`, - types: ["ArrayBuffer"] - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.TypedArray = function(V, T, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) { - throw webidl.errors.conversionFailed({ - prefix: `${T.name}`, - argument: `${V}`, - types: [T.name] - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.DataView = function(V, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { - throw webidl.errors.exception({ - header: "DataView", - message: "Object is not a DataView." - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.BufferSource = function(V, opts = {}) { - if (types.isAnyArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, opts); - } - if (types.isTypedArray(V)) { - return webidl.converters.TypedArray(V, V.constructor); - } - if (types.isDataView(V)) { - return webidl.converters.DataView(V, opts); - } - throw new TypeError(`Could not convert ${V} to a BufferSource.`); - }; - webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.ByteString); - webidl.converters["sequence>"] = webidl.sequenceConverter(webidl.converters["sequence"]); - webidl.converters["record"] = webidl.recordConverter(webidl.converters.ByteString, webidl.converters.ByteString); - module.exports = { - webidl - }; -}); - -// ../node_modules/undici/lib/fetch/dataURL.js -var require_dataURL = __commonJS((exports, module) => { - var assert = __require("assert"); - var { atob: atob2 } = __require("buffer"); - var { isomorphicDecode } = require_util2(); - var encoder = new TextEncoder; - var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; - var HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/; - var HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/; - function dataURLProcessor(dataURL) { - assert(dataURL.protocol === "data:"); - let input = URLSerializer(dataURL, true); - input = input.slice(5); - const position = { position: 0 }; - let mimeType = collectASequenceOfCodePointsFast(",", input, position); - const mimeTypeLength = mimeType.length; - mimeType = removeASCIIWhitespace(mimeType, true, true); - if (position.position >= input.length) { - return "failure"; - } - position.position++; - const encodedBody = input.slice(mimeTypeLength + 1); - let body = stringPercentDecode(encodedBody); - if (/;(\u0020){0,}base64$/i.test(mimeType)) { - const stringBody = isomorphicDecode(body); - body = forgivingBase64(stringBody); - if (body === "failure") { - return "failure"; - } - mimeType = mimeType.slice(0, -6); - mimeType = mimeType.replace(/(\u0020)+$/, ""); - mimeType = mimeType.slice(0, -1); - } - if (mimeType.startsWith(";")) { - mimeType = "text/plain" + mimeType; - } - let mimeTypeRecord = parseMIMEType(mimeType); - if (mimeTypeRecord === "failure") { - mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); - } - return { mimeType: mimeTypeRecord, body }; - } - function URLSerializer(url, excludeFragment = false) { - if (!excludeFragment) { - return url.href; - } - const href = url.href; - const hashLength = url.hash.length; - return hashLength === 0 ? href : href.substring(0, href.length - hashLength); - } - function collectASequenceOfCodePoints(condition, input, position) { - let result = ""; - while (position.position < input.length && condition(input[position.position])) { - result += input[position.position]; - position.position++; - } - return result; - } - function collectASequenceOfCodePointsFast(char, input, position) { - const idx = input.indexOf(char, position.position); - const start = position.position; - if (idx === -1) { - position.position = input.length; - return input.slice(start); - } - position.position = idx; - return input.slice(start, position.position); - } - function stringPercentDecode(input) { - const bytes = encoder.encode(input); - return percentDecode(bytes); - } - function percentDecode(input) { - const output = []; - for (let i = 0;i < input.length; i++) { - const byte = input[i]; - if (byte !== 37) { - output.push(byte); - } else if (byte === 37 && !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2]))) { - output.push(37); - } else { - const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]); - const bytePoint = Number.parseInt(nextTwoBytes, 16); - output.push(bytePoint); - i += 2; - } - } - return Uint8Array.from(output); - } - function parseMIMEType(input) { - input = removeHTTPWhitespace(input, true, true); - const position = { position: 0 }; - const type = collectASequenceOfCodePointsFast("/", input, position); - if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { - return "failure"; - } - if (position.position > input.length) { - return "failure"; - } - position.position++; - let subtype = collectASequenceOfCodePointsFast(";", input, position); - subtype = removeHTTPWhitespace(subtype, false, true); - if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { - return "failure"; - } - const typeLowercase = type.toLowerCase(); - const subtypeLowercase = subtype.toLowerCase(); - const mimeType = { - type: typeLowercase, - subtype: subtypeLowercase, - parameters: new Map, - essence: `${typeLowercase}/${subtypeLowercase}` - }; - while (position.position < input.length) { - position.position++; - collectASequenceOfCodePoints((char) => HTTP_WHITESPACE_REGEX.test(char), input, position); - let parameterName = collectASequenceOfCodePoints((char) => char !== ";" && char !== "=", input, position); - parameterName = parameterName.toLowerCase(); - if (position.position < input.length) { - if (input[position.position] === ";") { - continue; - } - position.position++; - } - if (position.position > input.length) { - break; - } - let parameterValue = null; - if (input[position.position] === '"') { - parameterValue = collectAnHTTPQuotedString(input, position, true); - collectASequenceOfCodePointsFast(";", input, position); - } else { - parameterValue = collectASequenceOfCodePointsFast(";", input, position); - parameterValue = removeHTTPWhitespace(parameterValue, false, true); - if (parameterValue.length === 0) { - continue; - } - } - if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { - mimeType.parameters.set(parameterName, parameterValue); - } - } - return mimeType; - } - function forgivingBase64(data) { - data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, ""); - if (data.length % 4 === 0) { - data = data.replace(/=?=$/, ""); - } - if (data.length % 4 === 1) { - return "failure"; - } - if (/[^+/0-9A-Za-z]/.test(data)) { - return "failure"; - } - const binary = atob2(data); - const bytes = new Uint8Array(binary.length); - for (let byte = 0;byte < binary.length; byte++) { - bytes[byte] = binary.charCodeAt(byte); - } - return bytes; - } - function collectAnHTTPQuotedString(input, position, extractValue) { - const positionStart = position.position; - let value = ""; - assert(input[position.position] === '"'); - position.position++; - while (true) { - value += collectASequenceOfCodePoints((char) => char !== '"' && char !== "\\", input, position); - if (position.position >= input.length) { - break; - } - const quoteOrBackslash = input[position.position]; - position.position++; - if (quoteOrBackslash === "\\") { - if (position.position >= input.length) { - value += "\\"; - break; - } - value += input[position.position]; - position.position++; - } else { - assert(quoteOrBackslash === '"'); - break; - } - } - if (extractValue) { - return value; - } - return input.slice(positionStart, position.position); - } - function serializeAMimeType(mimeType) { - assert(mimeType !== "failure"); - const { parameters, essence } = mimeType; - let serialization = essence; - for (let [name, value] of parameters.entries()) { - serialization += ";"; - serialization += name; - serialization += "="; - if (!HTTP_TOKEN_CODEPOINTS.test(value)) { - value = value.replace(/(\\|")/g, "\\$1"); - value = '"' + value; - value += '"'; - } - serialization += value; - } - return serialization; - } - function isHTTPWhiteSpace(char) { - return char === "\r" || char === "\n" || char === "\t" || char === " "; - } - function removeHTTPWhitespace(str, leading = true, trailing = true) { - let lead = 0; - let trail = str.length - 1; - if (leading) { - for (;lead < str.length && isHTTPWhiteSpace(str[lead]); lead++) - ; - } - if (trailing) { - for (;trail > 0 && isHTTPWhiteSpace(str[trail]); trail--) - ; - } - return str.slice(lead, trail + 1); - } - function isASCIIWhitespace(char) { - return char === "\r" || char === "\n" || char === "\t" || char === "\f" || char === " "; - } - function removeASCIIWhitespace(str, leading = true, trailing = true) { - let lead = 0; - let trail = str.length - 1; - if (leading) { - for (;lead < str.length && isASCIIWhitespace(str[lead]); lead++) - ; - } - if (trailing) { - for (;trail > 0 && isASCIIWhitespace(str[trail]); trail--) - ; - } - return str.slice(lead, trail + 1); - } - module.exports = { - dataURLProcessor, - URLSerializer, - collectASequenceOfCodePoints, - collectASequenceOfCodePointsFast, - stringPercentDecode, - parseMIMEType, - collectAnHTTPQuotedString, - serializeAMimeType - }; -}); - -// ../node_modules/undici/lib/fetch/file.js -var require_file = __commonJS((exports, module) => { - var { Blob: Blob2, File: NativeFile } = __require("buffer"); - var { types } = __require("util"); - var { kState } = require_symbols2(); - var { isBlobLike } = require_util2(); - var { webidl } = require_webidl(); - var { parseMIMEType, serializeAMimeType } = require_dataURL(); - var { kEnumerableProperty } = require_util(); - var encoder = new TextEncoder; - - class File extends Blob2 { - constructor(fileBits, fileName, options = {}) { - webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" }); - fileBits = webidl.converters["sequence"](fileBits); - fileName = webidl.converters.USVString(fileName); - options = webidl.converters.FilePropertyBag(options); - const n = fileName; - let t = options.type; - let d; - substep: { - if (t) { - t = parseMIMEType(t); - if (t === "failure") { - t = ""; - break substep; - } - t = serializeAMimeType(t).toLowerCase(); - } - d = options.lastModified; - } - super(processBlobParts(fileBits, options), { type: t }); - this[kState] = { - name: n, - lastModified: d, - type: t - }; - } - get name() { - webidl.brandCheck(this, File); - return this[kState].name; - } - get lastModified() { - webidl.brandCheck(this, File); - return this[kState].lastModified; - } - get type() { - webidl.brandCheck(this, File); - return this[kState].type; - } - } - - class FileLike { - constructor(blobLike, fileName, options = {}) { - const n = fileName; - const t = options.type; - const d = options.lastModified ?? Date.now(); - this[kState] = { - blobLike, - name: n, - type: t, - lastModified: d - }; - } - stream(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.stream(...args); - } - arrayBuffer(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.arrayBuffer(...args); - } - slice(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.slice(...args); - } - text(...args) { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.text(...args); - } - get size() { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.size; - } - get type() { - webidl.brandCheck(this, FileLike); - return this[kState].blobLike.type; - } - get name() { - webidl.brandCheck(this, FileLike); - return this[kState].name; - } - get lastModified() { - webidl.brandCheck(this, FileLike); - return this[kState].lastModified; - } - get [Symbol.toStringTag]() { - return "File"; - } - } - Object.defineProperties(File.prototype, { - [Symbol.toStringTag]: { - value: "File", - configurable: true - }, - name: kEnumerableProperty, - lastModified: kEnumerableProperty - }); - webidl.converters.Blob = webidl.interfaceConverter(Blob2); - webidl.converters.BlobPart = function(V, opts) { - if (webidl.util.Type(V) === "Object") { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); - } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { - return webidl.converters.BufferSource(V, opts); - } - } - return webidl.converters.USVString(V, opts); - }; - webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.BlobPart); - webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ - { - key: "lastModified", - converter: webidl.converters["long long"], - get defaultValue() { - return Date.now(); - } - }, - { - key: "type", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "endings", - converter: (value) => { - value = webidl.converters.DOMString(value); - value = value.toLowerCase(); - if (value !== "native") { - value = "transparent"; - } - return value; - }, - defaultValue: "transparent" - } - ]); - function processBlobParts(parts, options) { - const bytes = []; - for (const element of parts) { - if (typeof element === "string") { - let s = element; - if (options.endings === "native") { - s = convertLineEndingsNative(s); - } - bytes.push(encoder.encode(s)); - } else if (types.isAnyArrayBuffer(element) || types.isTypedArray(element)) { - if (!element.buffer) { - bytes.push(new Uint8Array(element)); - } else { - bytes.push(new Uint8Array(element.buffer, element.byteOffset, element.byteLength)); - } - } else if (isBlobLike(element)) { - bytes.push(element); - } - } - return bytes; - } - function convertLineEndingsNative(s) { - let nativeLineEnding = "\n"; - if (process.platform === "win32") { - nativeLineEnding = "\r\n"; - } - return s.replace(/\r?\n/g, nativeLineEnding); - } - function isFileLike(object) { - return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; - } - module.exports = { File, FileLike, isFileLike }; -}); - -// ../node_modules/undici/lib/fetch/formdata.js -var require_formdata = __commonJS((exports, module) => { - var { isBlobLike, toUSVString, makeIterator } = require_util2(); - var { kState } = require_symbols2(); - var { File: UndiciFile, FileLike, isFileLike } = require_file(); - var { webidl } = require_webidl(); - var { Blob: Blob2, File: NativeFile } = __require("buffer"); - var File = NativeFile ?? UndiciFile; - - class FormData { - constructor(form) { - if (form !== undefined) { - throw webidl.errors.conversionFailed({ - prefix: "FormData constructor", - argument: "Argument 1", - types: ["undefined"] - }); - } - this[kState] = []; - } - append(name, value, filename = undefined) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.append" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError("Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'"); - } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? webidl.converters.USVString(filename) : undefined; - const entry = makeEntry(name, value, filename); - this[kState].push(entry); - } - delete(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" }); - name = webidl.converters.USVString(name); - this[kState] = this[kState].filter((entry) => entry.name !== name); - } - get(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" }); - name = webidl.converters.USVString(name); - const idx = this[kState].findIndex((entry) => entry.name === name); - if (idx === -1) { - return null; - } - return this[kState][idx].value; - } - getAll(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" }); - name = webidl.converters.USVString(name); - return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); - } - has(name) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" }); - name = webidl.converters.USVString(name); - return this[kState].findIndex((entry) => entry.name === name) !== -1; - } - set(name, value, filename = undefined) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.set" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError("Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'"); - } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? toUSVString(filename) : undefined; - const entry = makeEntry(name, value, filename); - const idx = this[kState].findIndex((entry2) => entry2.name === name); - if (idx !== -1) { - this[kState] = [ - ...this[kState].slice(0, idx), - entry, - ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) - ]; - } else { - this[kState].push(entry); - } - } - entries() { - webidl.brandCheck(this, FormData); - return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "key+value"); - } - keys() { - webidl.brandCheck(this, FormData); - return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "key"); - } - values() { - webidl.brandCheck(this, FormData); - return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "value"); - } - forEach(callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.forEach" }); - if (typeof callbackFn !== "function") { - throw new TypeError("Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'."); - } - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); - } - } - } - FormData.prototype[Symbol.iterator] = FormData.prototype.entries; - Object.defineProperties(FormData.prototype, { - [Symbol.toStringTag]: { - value: "FormData", - configurable: true - } - }); - function makeEntry(name, value, filename) { - name = Buffer.from(name).toString("utf8"); - if (typeof value === "string") { - value = Buffer.from(value).toString("utf8"); - } else { - if (!isFileLike(value)) { - value = value instanceof Blob2 ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); - } - if (filename !== undefined) { - const options = { - type: value.type, - lastModified: value.lastModified - }; - value = NativeFile && value instanceof NativeFile || value instanceof UndiciFile ? new File([value], filename, options) : new FileLike(value, filename, options); - } - } - return { name, value }; - } - module.exports = { FormData }; -}); - -// ../node_modules/undici/lib/fetch/body.js -var require_body = __commonJS((exports, module) => { - var Busboy = require_main(); - var util = require_util(); - var { - ReadableStreamFrom, - isBlobLike, - isReadableStreamLike, - readableStreamClose, - createDeferredPromise, - fullyReadBody - } = require_util2(); - var { FormData } = require_formdata(); - var { kState } = require_symbols2(); - var { webidl } = require_webidl(); - var { DOMException: DOMException2, structuredClone } = require_constants2(); - var { Blob: Blob2, File: NativeFile } = __require("buffer"); - var { kBodyUsed } = require_symbols(); - var assert = __require("assert"); - var { isErrored } = require_util(); - var { isUint8Array, isArrayBuffer } = __require("util/types"); - var { File: UndiciFile } = require_file(); - var { parseMIMEType, serializeAMimeType } = require_dataURL(); - var ReadableStream = globalThis.ReadableStream; - var File = NativeFile ?? UndiciFile; - var textEncoder = new TextEncoder; - var textDecoder = new TextDecoder; - function extractBody(object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = __require("stream/web").ReadableStream; - } - let stream = null; - if (object instanceof ReadableStream) { - stream = object; - } else if (isBlobLike(object)) { - stream = object.stream(); - } else { - stream = new ReadableStream({ - async pull(controller) { - controller.enqueue(typeof source === "string" ? textEncoder.encode(source) : source); - queueMicrotask(() => readableStreamClose(controller)); - }, - start() { - }, - type: undefined - }); - } - assert(isReadableStreamLike(stream)); - let action = null; - let source = null; - let length = null; - let type = null; - if (typeof object === "string") { - source = object; - type = "text/plain;charset=UTF-8"; - } else if (object instanceof URLSearchParams) { - source = object.toString(); - type = "application/x-www-form-urlencoded;charset=UTF-8"; - } else if (isArrayBuffer(object)) { - source = new Uint8Array(object.slice()); - } else if (ArrayBuffer.isView(object)) { - source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); - } else if (util.isFormDataLike(object)) { - const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 100000000000)}`.padStart(11, "0")}`; - const prefix = `--${boundary}\r\nContent-Disposition: form-data`; - /*! formdata-polyfill. MIT License. Jimmy Wärting */ - const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); - const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); - const blobParts = []; - const rn = new Uint8Array([13, 10]); - length = 0; - let hasUnknownSizeValue = false; - for (const [name, value] of object) { - if (typeof value === "string") { - const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"` + `\r\n\r\n${normalizeLinefeeds(value)}\r\n`); - blobParts.push(chunk2); - length += chunk2.byteLength; - } else { - const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + "\r\n" + `Content-Type: ${value.type || "application/octet-stream"}\r\n\r\n`); - blobParts.push(chunk2, value, rn); - if (typeof value.size === "number") { - length += chunk2.byteLength + value.size + rn.byteLength; - } else { - hasUnknownSizeValue = true; - } - } - } - const chunk = textEncoder.encode(`--${boundary}--`); - blobParts.push(chunk); - length += chunk.byteLength; - if (hasUnknownSizeValue) { - length = null; - } - source = object; - action = async function* () { - for (const part of blobParts) { - if (part.stream) { - yield* part.stream(); - } else { - yield part; - } - } - }; - type = "multipart/form-data; boundary=" + boundary; - } else if (isBlobLike(object)) { - source = object; - length = object.size; - if (object.type) { - type = object.type; - } - } else if (typeof object[Symbol.asyncIterator] === "function") { - if (keepalive) { - throw new TypeError("keepalive"); - } - if (util.isDisturbed(object) || object.locked) { - throw new TypeError("Response body object should not be disturbed or locked"); - } - stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); - } - if (typeof source === "string" || util.isBuffer(source)) { - length = Buffer.byteLength(source); - } - if (action != null) { - let iterator; - stream = new ReadableStream({ - async start() { - iterator = action(object)[Symbol.asyncIterator](); - }, - async pull(controller) { - const { value, done } = await iterator.next(); - if (done) { - queueMicrotask(() => { - controller.close(); - }); - } else { - if (!isErrored(stream)) { - controller.enqueue(new Uint8Array(value)); - } - } - return controller.desiredSize > 0; - }, - async cancel(reason) { - await iterator.return(); - }, - type: undefined - }); - } - const body = { stream, source, length }; - return [body, type]; - } - function safelyExtractBody(object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = __require("stream/web").ReadableStream; - } - if (object instanceof ReadableStream) { - assert(!util.isDisturbed(object), "The body has already been consumed."); - assert(!object.locked, "The stream is locked."); - } - return extractBody(object, keepalive); - } - function cloneBody(body) { - const [out1, out2] = body.stream.tee(); - const out2Clone = structuredClone(out2, { transfer: [out2] }); - const [, finalClone] = out2Clone.tee(); - body.stream = out1; - return { - stream: finalClone, - length: body.length, - source: body.source - }; - } - async function* consumeBody(body) { - if (body) { - if (isUint8Array(body)) { - yield body; - } else { - const stream = body.stream; - if (util.isDisturbed(stream)) { - throw new TypeError("The body has already been consumed."); - } - if (stream.locked) { - throw new TypeError("The stream is locked."); - } - stream[kBodyUsed] = true; - yield* stream; - } - } - } - function throwIfAborted(state) { - if (state.aborted) { - throw new DOMException2("The operation was aborted.", "AbortError"); - } - } - function bodyMixinMethods(instance) { - const methods = { - blob() { - return specConsumeBody(this, (bytes) => { - let mimeType = bodyMimeType(this); - if (mimeType === "failure") { - mimeType = ""; - } else if (mimeType) { - mimeType = serializeAMimeType(mimeType); - } - return new Blob2([bytes], { type: mimeType }); - }, instance); - }, - arrayBuffer() { - return specConsumeBody(this, (bytes) => { - return new Uint8Array(bytes).buffer; - }, instance); - }, - text() { - return specConsumeBody(this, utf8DecodeBytes, instance); - }, - json() { - return specConsumeBody(this, parseJSONFromBytes, instance); - }, - async formData() { - webidl.brandCheck(this, instance); - throwIfAborted(this[kState]); - const contentType = this.headers.get("Content-Type"); - if (/multipart\/form-data/.test(contentType)) { - const headers = {}; - for (const [key, value] of this.headers) - headers[key.toLowerCase()] = value; - const responseFormData = new FormData; - let busboy; - try { - busboy = new Busboy({ - headers, - preservePath: true - }); - } catch (err) { - throw new DOMException2(`${err}`, "AbortError"); - } - busboy.on("field", (name, value) => { - responseFormData.append(name, value); - }); - busboy.on("file", (name, value, filename, encoding, mimeType) => { - const chunks = []; - if (encoding === "base64" || encoding.toLowerCase() === "base64") { - let base64chunk = ""; - value.on("data", (chunk) => { - base64chunk += chunk.toString().replace(/[\r\n]/gm, ""); - const end = base64chunk.length - base64chunk.length % 4; - chunks.push(Buffer.from(base64chunk.slice(0, end), "base64")); - base64chunk = base64chunk.slice(end); - }); - value.on("end", () => { - chunks.push(Buffer.from(base64chunk, "base64")); - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } else { - value.on("data", (chunk) => { - chunks.push(chunk); - }); - value.on("end", () => { - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } - }); - const busboyResolve = new Promise((resolve, reject) => { - busboy.on("finish", resolve); - busboy.on("error", (err) => reject(new TypeError(err))); - }); - if (this.body !== null) - for await (const chunk of consumeBody(this[kState].body)) - busboy.write(chunk); - busboy.end(); - await busboyResolve; - return responseFormData; - } else if (/application\/x-www-form-urlencoded/.test(contentType)) { - let entries; - try { - let text = ""; - const streamingDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); - for await (const chunk of consumeBody(this[kState].body)) { - if (!isUint8Array(chunk)) { - throw new TypeError("Expected Uint8Array chunk"); - } - text += streamingDecoder.decode(chunk, { stream: true }); - } - text += streamingDecoder.decode(); - entries = new URLSearchParams(text); - } catch (err) { - throw Object.assign(new TypeError, { cause: err }); - } - const formData = new FormData; - for (const [name, value] of entries) { - formData.append(name, value); - } - return formData; - } else { - await Promise.resolve(); - throwIfAborted(this[kState]); - throw webidl.errors.exception({ - header: `${instance.name}.formData`, - message: "Could not parse content as FormData." - }); - } - } - }; - return methods; - } - function mixinBody(prototype) { - Object.assign(prototype.prototype, bodyMixinMethods(prototype)); - } - async function specConsumeBody(object, convertBytesToJSValue, instance) { - webidl.brandCheck(object, instance); - throwIfAborted(object[kState]); - if (bodyUnusable(object[kState].body)) { - throw new TypeError("Body is unusable"); - } - const promise = createDeferredPromise(); - const errorSteps = (error) => promise.reject(error); - const successSteps = (data) => { - try { - promise.resolve(convertBytesToJSValue(data)); - } catch (e) { - errorSteps(e); - } - }; - if (object[kState].body == null) { - successSteps(new Uint8Array); - return promise.promise; - } - await fullyReadBody(object[kState].body, successSteps, errorSteps); - return promise.promise; - } - function bodyUnusable(body) { - return body != null && (body.stream.locked || util.isDisturbed(body.stream)); - } - function utf8DecodeBytes(buffer) { - if (buffer.length === 0) { - return ""; - } - if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { - buffer = buffer.subarray(3); - } - const output = textDecoder.decode(buffer); - return output; - } - function parseJSONFromBytes(bytes) { - return JSON.parse(utf8DecodeBytes(bytes)); - } - function bodyMimeType(object) { - const { headersList } = object[kState]; - const contentType = headersList.get("content-type"); - if (contentType === null) { - return "failure"; - } - return parseMIMEType(contentType); - } - module.exports = { - extractBody, - safelyExtractBody, - cloneBody, - mixinBody - }; -}); - -// ../node_modules/undici/lib/core/request.js -var require_request = __commonJS((exports, module) => { - var { - InvalidArgumentError, - NotSupportedError - } = require_errors(); - var assert = __require("assert"); - var { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require_symbols(); - var util = require_util(); - var tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; - var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - var invalidPathRegex = /[^\u0021-\u00ff]/; - var kHandler = Symbol("handler"); - var channels = {}; - var extractBody; - try { - const diagnosticsChannel = __require("diagnostics_channel"); - channels.create = diagnosticsChannel.channel("undici:request:create"); - channels.bodySent = diagnosticsChannel.channel("undici:request:bodySent"); - channels.headers = diagnosticsChannel.channel("undici:request:headers"); - channels.trailers = diagnosticsChannel.channel("undici:request:trailers"); - channels.error = diagnosticsChannel.channel("undici:request:error"); - } catch { - channels.create = { hasSubscribers: false }; - channels.bodySent = { hasSubscribers: false }; - channels.headers = { hasSubscribers: false }; - channels.trailers = { hasSubscribers: false }; - channels.error = { hasSubscribers: false }; - } - - class Request { - constructor(origin, { - path, - method, - body, - headers, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - throwOnError, - expectContinue - }, handler) { - if (typeof path !== "string") { - throw new InvalidArgumentError("path must be a string"); - } else if (path[0] !== "/" && !(path.startsWith("http://") || path.startsWith("https://")) && method !== "CONNECT") { - throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); - } else if (invalidPathRegex.exec(path) !== null) { - throw new InvalidArgumentError("invalid request path"); - } - if (typeof method !== "string") { - throw new InvalidArgumentError("method must be a string"); - } else if (tokenRegExp.exec(method) === null) { - throw new InvalidArgumentError("invalid request method"); - } - if (upgrade && typeof upgrade !== "string") { - throw new InvalidArgumentError("upgrade must be a string"); - } - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("invalid headersTimeout"); - } - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("invalid bodyTimeout"); - } - if (reset != null && typeof reset !== "boolean") { - throw new InvalidArgumentError("invalid reset"); - } - if (expectContinue != null && typeof expectContinue !== "boolean") { - throw new InvalidArgumentError("invalid expectContinue"); - } - this.headersTimeout = headersTimeout; - this.bodyTimeout = bodyTimeout; - this.throwOnError = throwOnError === true; - this.method = method; - this.abort = null; - if (body == null) { - this.body = null; - } else if (util.isStream(body)) { - this.body = body; - const rState = this.body._readableState; - if (!rState || !rState.autoDestroy) { - this.endHandler = function autoDestroy() { - util.destroy(this); - }; - this.body.on("end", this.endHandler); - } - this.errorHandler = (err) => { - if (this.abort) { - this.abort(err); - } else { - this.error = err; - } - }; - this.body.on("error", this.errorHandler); - } else if (util.isBuffer(body)) { - this.body = body.byteLength ? body : null; - } else if (ArrayBuffer.isView(body)) { - this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; - } else if (body instanceof ArrayBuffer) { - this.body = body.byteLength ? Buffer.from(body) : null; - } else if (typeof body === "string") { - this.body = body.length ? Buffer.from(body) : null; - } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { - this.body = body; - } else { - throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); - } - this.completed = false; - this.aborted = false; - this.upgrade = upgrade || null; - this.path = query ? util.buildURL(path, query) : path; - this.origin = origin; - this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; - this.blocking = blocking == null ? false : blocking; - this.reset = reset == null ? null : reset; - this.host = null; - this.contentLength = null; - this.contentType = null; - this.headers = ""; - this.expectContinue = expectContinue != null ? expectContinue : false; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); - } - for (let i = 0;i < headers.length; i += 2) { - processHeader(this, headers[i], headers[i + 1]); - } - } else if (headers && typeof headers === "object") { - const keys = Object.keys(headers); - for (let i = 0;i < keys.length; i++) { - const key = keys[i]; - processHeader(this, key, headers[key]); - } - } else if (headers != null) { - throw new InvalidArgumentError("headers must be an object or an array"); - } - if (util.isFormDataLike(this.body)) { - if (util.nodeMajor < 16 || util.nodeMajor === 16 && util.nodeMinor < 8) { - throw new InvalidArgumentError("Form-Data bodies are only supported in node v16.8 and newer."); - } - if (!extractBody) { - extractBody = require_body().extractBody; - } - const [bodyStream, contentType] = extractBody(body); - if (this.contentType == null) { - this.contentType = contentType; - this.headers += `content-type: ${contentType}\r\n`; - } - this.body = bodyStream.stream; - this.contentLength = bodyStream.length; - } else if (util.isBlobLike(body) && this.contentType == null && body.type) { - this.contentType = body.type; - this.headers += `content-type: ${body.type}\r\n`; - } - util.validateHandler(handler, method, upgrade); - this.servername = util.getServerName(this.host); - this[kHandler] = handler; - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }); - } - } - onBodySent(chunk) { - if (this[kHandler].onBodySent) { - try { - return this[kHandler].onBodySent(chunk); - } catch (err) { - this.abort(err); - } - } - } - onRequestSent() { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }); - } - if (this[kHandler].onRequestSent) { - try { - return this[kHandler].onRequestSent(); - } catch (err) { - this.abort(err); - } - } - } - onConnect(abort) { - assert(!this.aborted); - assert(!this.completed); - if (this.error) { - abort(this.error); - } else { - this.abort = abort; - return this[kHandler].onConnect(abort); - } - } - onHeaders(statusCode, headers, resume, statusText) { - assert(!this.aborted); - assert(!this.completed); - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); - } - try { - return this[kHandler].onHeaders(statusCode, headers, resume, statusText); - } catch (err) { - this.abort(err); - } - } - onData(chunk) { - assert(!this.aborted); - assert(!this.completed); - try { - return this[kHandler].onData(chunk); - } catch (err) { - this.abort(err); - return false; - } - } - onUpgrade(statusCode, headers, socket) { - assert(!this.aborted); - assert(!this.completed); - return this[kHandler].onUpgrade(statusCode, headers, socket); - } - onComplete(trailers) { - this.onFinally(); - assert(!this.aborted); - this.completed = true; - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }); - } - try { - return this[kHandler].onComplete(trailers); - } catch (err) { - this.onError(err); - } - } - onError(error) { - this.onFinally(); - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }); - } - if (this.aborted) { - return; - } - this.aborted = true; - return this[kHandler].onError(error); - } - onFinally() { - if (this.errorHandler) { - this.body.off("error", this.errorHandler); - this.errorHandler = null; - } - if (this.endHandler) { - this.body.off("end", this.endHandler); - this.endHandler = null; - } - } - addHeader(key, value) { - processHeader(this, key, value); - return this; - } - static [kHTTP1BuildRequest](origin, opts, handler) { - return new Request(origin, opts, handler); - } - static [kHTTP2BuildRequest](origin, opts, handler) { - const headers = opts.headers; - opts = { ...opts, headers: null }; - const request = new Request(origin, opts, handler); - request.headers = {}; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); - } - for (let i = 0;i < headers.length; i += 2) { - processHeader(request, headers[i], headers[i + 1], true); - } - } else if (headers && typeof headers === "object") { - const keys = Object.keys(headers); - for (let i = 0;i < keys.length; i++) { - const key = keys[i]; - processHeader(request, key, headers[key], true); - } - } else if (headers != null) { - throw new InvalidArgumentError("headers must be an object or an array"); - } - return request; - } - static [kHTTP2CopyHeaders](raw) { - const rawHeaders = raw.split("\r\n"); - const headers = {}; - for (const header of rawHeaders) { - const [key, value] = header.split(": "); - if (value == null || value.length === 0) - continue; - if (headers[key]) - headers[key] += `,${value}`; - else - headers[key] = value; - } - return headers; - } - } - function processHeaderValue(key, val, skipAppend) { - if (val && typeof val === "object") { - throw new InvalidArgumentError(`invalid ${key} header`); - } - val = val != null ? `${val}` : ""; - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); - } - return skipAppend ? val : `${key}: ${val}\r\n`; - } - function processHeader(request, key, val, skipAppend = false) { - if (val && (typeof val === "object" && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`); - } else if (val === undefined) { - return; - } - if (request.host === null && key.length === 4 && key.toLowerCase() === "host") { - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); - } - request.host = val; - } else if (request.contentLength === null && key.length === 14 && key.toLowerCase() === "content-length") { - request.contentLength = parseInt(val, 10); - if (!Number.isFinite(request.contentLength)) { - throw new InvalidArgumentError("invalid content-length header"); - } - } else if (request.contentType === null && key.length === 12 && key.toLowerCase() === "content-type") { - request.contentType = val; - if (skipAppend) - request.headers[key] = processHeaderValue(key, val, skipAppend); - else - request.headers += processHeaderValue(key, val); - } else if (key.length === 17 && key.toLowerCase() === "transfer-encoding") { - throw new InvalidArgumentError("invalid transfer-encoding header"); - } else if (key.length === 10 && key.toLowerCase() === "connection") { - const value = typeof val === "string" ? val.toLowerCase() : null; - if (value !== "close" && value !== "keep-alive") { - throw new InvalidArgumentError("invalid connection header"); - } else if (value === "close") { - request.reset = true; - } - } else if (key.length === 10 && key.toLowerCase() === "keep-alive") { - throw new InvalidArgumentError("invalid keep-alive header"); - } else if (key.length === 7 && key.toLowerCase() === "upgrade") { - throw new InvalidArgumentError("invalid upgrade header"); - } else if (key.length === 6 && key.toLowerCase() === "expect") { - throw new NotSupportedError("expect header not supported"); - } else if (tokenRegExp.exec(key) === null) { - throw new InvalidArgumentError("invalid header key"); - } else { - if (Array.isArray(val)) { - for (let i = 0;i < val.length; i++) { - if (skipAppend) { - if (request.headers[key]) - request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`; - else - request.headers[key] = processHeaderValue(key, val[i], skipAppend); - } else { - request.headers += processHeaderValue(key, val[i]); - } - } - } else { - if (skipAppend) - request.headers[key] = processHeaderValue(key, val, skipAppend); - else - request.headers += processHeaderValue(key, val); - } - } - } - module.exports = Request; -}); - -// ../node_modules/undici/lib/dispatcher.js -var require_dispatcher = __commonJS((exports, module) => { - var EventEmitter = __require("events"); - - class Dispatcher extends EventEmitter { - dispatch() { - throw new Error("not implemented"); - } - close() { - throw new Error("not implemented"); - } - destroy() { - throw new Error("not implemented"); - } - } - module.exports = Dispatcher; -}); - -// ../node_modules/undici/lib/dispatcher-base.js -var require_dispatcher_base = __commonJS((exports, module) => { - var Dispatcher = require_dispatcher(); - var { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError - } = require_errors(); - var { kDestroy, kClose, kDispatch, kInterceptors } = require_symbols(); - var kDestroyed = Symbol("destroyed"); - var kClosed = Symbol("closed"); - var kOnDestroyed = Symbol("onDestroyed"); - var kOnClosed = Symbol("onClosed"); - var kInterceptedDispatch = Symbol("Intercepted Dispatch"); - - class DispatcherBase extends Dispatcher { - constructor() { - super(); - this[kDestroyed] = false; - this[kOnDestroyed] = null; - this[kClosed] = false; - this[kOnClosed] = []; - } - get destroyed() { - return this[kDestroyed]; - } - get closed() { - return this[kClosed]; - } - get interceptors() { - return this[kInterceptors]; - } - set interceptors(newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1;i >= 0; i--) { - const interceptor = this[kInterceptors][i]; - if (typeof interceptor !== "function") { - throw new InvalidArgumentError("interceptor must be an function"); - } - } - } - this[kInterceptors] = newInterceptors; - } - close(callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError, null)); - return; - } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return; - } - this[kClosed] = true; - this[kOnClosed].push(callback); - const onClosed = () => { - const callbacks = this[kOnClosed]; - this[kOnClosed] = null; - for (let i = 0;i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; - this[kClose]().then(() => this.destroy()).then(() => { - queueMicrotask(onClosed); - }); - } - destroy(err, callback) { - if (typeof err === "function") { - callback = err; - err = null; - } - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.destroy(err, (err2, data) => { - return err2 ? reject(err2) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return; - } - if (!err) { - err = new ClientDestroyedError; - } - this[kDestroyed] = true; - this[kOnDestroyed] = this[kOnDestroyed] || []; - this[kOnDestroyed].push(callback); - const onDestroyed = () => { - const callbacks = this[kOnDestroyed]; - this[kOnDestroyed] = null; - for (let i = 0;i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed); - }); - } - [kInterceptedDispatch](opts, handler) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch]; - return this[kDispatch](opts, handler); - } - let dispatch = this[kDispatch].bind(this); - for (let i = this[kInterceptors].length - 1;i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch); - } - this[kInterceptedDispatch] = dispatch; - return dispatch(opts, handler); - } - dispatch(opts, handler) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - try { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object."); - } - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError; - } - if (this[kClosed]) { - throw new ClientClosedError; - } - return this[kInterceptedDispatch](opts, handler); - } catch (err) { - if (typeof handler.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); - } - handler.onError(err); - return false; - } - } - } - module.exports = DispatcherBase; -}); - -// ../node_modules/undici/lib/core/connect.js -var require_connect = __commonJS((exports, module) => { - var net = __require("net"); - var assert = __require("assert"); - var util = require_util(); - var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); - var tls; - var SessionCache; - if (global.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) { - SessionCache = class WeakSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = new Map; - this._sessionRegistry = new global.FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return; - } - const ref = this._sessionCache.get(key); - if (ref !== undefined && ref.deref() === undefined) { - this._sessionCache.delete(key); - } - }); - } - get(sessionKey) { - const ref = this._sessionCache.get(sessionKey); - return ref ? ref.deref() : null; - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; - } - this._sessionCache.set(sessionKey, new WeakRef(session)); - this._sessionRegistry.register(session, sessionKey); - } - }; - } else { - SessionCache = class SimpleSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = new Map; - } - get(sessionKey) { - return this._sessionCache.get(sessionKey); - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; - } - if (this._sessionCache.size >= this._maxCachedSessions) { - const { value: oldestKey } = this._sessionCache.keys().next(); - this._sessionCache.delete(oldestKey); - } - this._sessionCache.set(sessionKey, session); - } - }; - } - function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); - } - const options = { path: socketPath, ...opts }; - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); - timeout = timeout == null ? 1e4 : timeout; - allowH2 = allowH2 != null ? allowH2 : false; - return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket; - if (protocol === "https:") { - if (!tls) { - tls = __require("tls"); - } - servername = servername || options.servername || util.getServerName(host) || null; - const sessionKey = servername || hostname; - const session = sessionCache.get(sessionKey) || null; - assert(sessionKey); - socket = tls.connect({ - highWaterMark: 16384, - ...options, - servername, - session, - localAddress, - ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], - socket: httpSocket, - port: port || 443, - host: hostname - }); - socket.on("session", function(session2) { - sessionCache.set(sessionKey, session2); - }); - } else { - assert(!httpSocket, "httpSocket can only be sent on TLS update"); - socket = net.connect({ - highWaterMark: 64 * 1024, - ...options, - localAddress, - port: port || 80, - host: hostname - }); - } - if (options.keepAlive == null || options.keepAlive) { - const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60000 : options.keepAliveInitialDelay; - socket.setKeepAlive(true, keepAliveInitialDelay); - } - const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); - socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(null, this); - } - }).on("error", function(err) { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(err); - } - }); - return socket; - }; - } - function setupTimeout(onConnectTimeout2, timeout) { - if (!timeout) { - return () => { - }; - } - let s1 = null; - let s2 = null; - const timeoutId = setTimeout(() => { - s1 = setImmediate(() => { - if (process.platform === "win32") { - s2 = setImmediate(() => onConnectTimeout2()); - } else { - onConnectTimeout2(); - } - }); - }, timeout); - return () => { - clearTimeout(timeoutId); - clearImmediate(s1); - clearImmediate(s2); - }; - } - function onConnectTimeout(socket) { - util.destroy(socket, new ConnectTimeoutError); - } - module.exports = buildConnector; -}); - -// ../node_modules/undici/lib/llhttp/utils.js -var require_utils2 = __commonJS((exports) => { - Object.defineProperty(exports, "__esModule", { value: true }); - exports.enumToMap = undefined; - function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === "number") { - res[key] = value; - } - }); - return res; - } - exports.enumToMap = enumToMap; -}); - -// ../node_modules/undici/lib/llhttp/constants.js -var require_constants3 = __commonJS((exports) => { - Object.defineProperty(exports, "__esModule", { value: true }); - exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = undefined; - var utils_1 = require_utils2(); - var ERROR; - (function(ERROR2) { - ERROR2[ERROR2["OK"] = 0] = "OK"; - ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL"; - ERROR2[ERROR2["STRICT"] = 2] = "STRICT"; - ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED"; - ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR2[ERROR2["USER"] = 24] = "USER"; - })(ERROR = exports.ERROR || (exports.ERROR = {})); - var TYPE; - (function(TYPE2) { - TYPE2[TYPE2["BOTH"] = 0] = "BOTH"; - TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST"; - TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE"; - })(TYPE = exports.TYPE || (exports.TYPE = {})); - var FLAGS; - (function(FLAGS2) { - FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED"; - FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE"; - FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING"; - FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; - })(FLAGS = exports.FLAGS || (exports.FLAGS = {})); - var LENIENT_FLAGS; - (function(LENIENT_FLAGS2) { - LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; - })(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {})); - var METHODS; - (function(METHODS2) { - METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; - METHODS2[METHODS2["GET"] = 1] = "GET"; - METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; - METHODS2[METHODS2["POST"] = 3] = "POST"; - METHODS2[METHODS2["PUT"] = 4] = "PUT"; - METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; - METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; - METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; - METHODS2[METHODS2["COPY"] = 8] = "COPY"; - METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; - METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; - METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; - METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; - METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; - METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; - METHODS2[METHODS2["BIND"] = 16] = "BIND"; - METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; - METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; - METHODS2[METHODS2["ACL"] = 19] = "ACL"; - METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; - METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; - METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; - METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; - METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; - METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; - METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; - METHODS2[METHODS2["LINK"] = 31] = "LINK"; - METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; - METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; - METHODS2[METHODS2["PRI"] = 34] = "PRI"; - METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; - METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; - METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; - METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; - METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; - METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; - })(METHODS = exports.METHODS || (exports.METHODS = {})); - exports.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS["M-SEARCH"], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, - METHODS.SOURCE - ]; - exports.METHODS_ICE = [ - METHODS.SOURCE - ]; - exports.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, - METHODS.GET, - METHODS.POST - ]; - exports.METHOD_MAP = utils_1.enumToMap(METHODS); - exports.H_METHOD_MAP = {}; - Object.keys(exports.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key]; - } - }); - var FINISH; - (function(FINISH2) { - FINISH2[FINISH2["SAFE"] = 0] = "SAFE"; - FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE"; - })(FINISH = exports.FINISH || (exports.FINISH = {})); - exports.ALPHA = []; - for (let i = "A".charCodeAt(0);i <= "Z".charCodeAt(0); i++) { - exports.ALPHA.push(String.fromCharCode(i)); - exports.ALPHA.push(String.fromCharCode(i + 32)); - } - exports.NUM_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9 - }; - exports.HEX_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - A: 10, - B: 11, - C: 12, - D: 13, - E: 14, - F: 15, - a: 10, - b: 11, - c: 12, - d: 13, - e: 14, - f: 15 - }; - exports.NUM = [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ]; - exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); - exports.MARK = ["-", "_", ".", "!", "~", "*", "\'", "(", ")"]; - exports.USERINFO_CHARS = exports.ALPHANUM.concat(exports.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); - exports.STRICT_URL_CHAR = [ - "!", - '"', - "$", - "%", - "&", - "\'", - "(", - ")", - "*", - "+", - ",", - "-", - ".", - "/", - ":", - ";", - "<", - "=", - ">", - "@", - "[", - "\\", - "]", - "^", - "_", - "`", - "{", - "|", - "}", - "~" - ].concat(exports.ALPHANUM); - exports.URL_CHAR = exports.STRICT_URL_CHAR.concat(["\t", "\f"]); - for (let i = 128;i <= 255; i++) { - exports.URL_CHAR.push(i); - } - exports.HEX = exports.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); - exports.STRICT_TOKEN = [ - "!", - "#", - "$", - "%", - "&", - "\'", - "*", - "+", - "-", - ".", - "^", - "_", - "`", - "|", - "~" - ].concat(exports.ALPHANUM); - exports.TOKEN = exports.STRICT_TOKEN.concat([" "]); - exports.HEADER_CHARS = ["\t"]; - for (let i = 32;i <= 255; i++) { - if (i !== 127) { - exports.HEADER_CHARS.push(i); - } - } - exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44); - exports.MAJOR = exports.NUM_MAP; - exports.MINOR = exports.MAJOR; - var HEADER_STATE; - (function(HEADER_STATE2) { - HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; - })(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {})); - exports.SPECIAL_HEADERS = { - connection: HEADER_STATE.CONNECTION, - "content-length": HEADER_STATE.CONTENT_LENGTH, - "proxy-connection": HEADER_STATE.CONNECTION, - "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, - upgrade: HEADER_STATE.UPGRADE - }; -}); - -// ../node_modules/undici/lib/handler/RedirectHandler.js -var require_RedirectHandler = __commonJS((exports, module) => { - var util = require_util(); - var { kBodyUsed } = require_symbols(); - var assert = __require("assert"); - var { InvalidArgumentError } = require_errors(); - var EE = __require("events"); - var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; - var kBody = Symbol("body"); - - class BodyAsyncIterable { - constructor(body) { - this[kBody] = body; - this[kBodyUsed] = false; - } - async* [Symbol.asyncIterator]() { - assert(!this[kBodyUsed], "disturbed"); - this[kBodyUsed] = true; - yield* this[kBody]; - } - } - - class RedirectHandler { - constructor(dispatch, maxRedirections, opts, handler) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } - util.validateHandler(handler, opts.method, opts.upgrade); - this.dispatch = dispatch; - this.location = null; - this.abort = null; - this.opts = { ...opts, maxRedirections: 0 }; - this.maxRedirections = maxRedirections; - this.handler = handler; - this.history = []; - if (util.isStream(this.opts.body)) { - if (util.bodyLength(this.opts.body) === 0) { - this.opts.body.on("data", function() { - assert(false); - }); - } - if (typeof this.opts.body.readableDidRead !== "boolean") { - this.opts.body[kBodyUsed] = false; - EE.prototype.on.call(this.opts.body, "data", function() { - this[kBodyUsed] = true; - }); - } - } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { - this.opts.body = new BodyAsyncIterable(this.opts.body); - } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util.isIterable(this.opts.body)) { - this.opts.body = new BodyAsyncIterable(this.opts.body); - } - } - onConnect(abort) { - this.abort = abort; - this.handler.onConnect(abort, { history: this.history }); - } - onUpgrade(statusCode, headers, socket) { - this.handler.onUpgrade(statusCode, headers, socket); - } - onError(error) { - this.handler.onError(error); - } - onHeaders(statusCode, headers, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers); - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)); - } - if (!this.location) { - return this.handler.onHeaders(statusCode, headers, resume, statusText); - } - const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); - const path = search ? `${pathname}${search}` : pathname; - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); - this.opts.path = path; - this.opts.origin = origin; - this.opts.maxRedirections = 0; - this.opts.query = null; - if (statusCode === 303 && this.opts.method !== "HEAD") { - this.opts.method = "GET"; - this.opts.body = null; - } - } - onData(chunk) { - if (this.location) { - } else { - return this.handler.onData(chunk); - } - } - onComplete(trailers) { - if (this.location) { - this.location = null; - this.abort = null; - this.dispatch(this.opts, this); - } else { - this.handler.onComplete(trailers); - } - } - onBodySent(chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk); - } - } - } - function parseLocation(statusCode, headers) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null; - } - for (let i = 0;i < headers.length; i += 2) { - if (headers[i].toString().toLowerCase() === "location") { - return headers[i + 1]; - } - } - } - function shouldRemoveHeader(header, removeContent, unknownOrigin) { - if (header.length === 4) { - return util.headerNameToString(header) === "host"; - } - if (removeContent && util.headerNameToString(header).startsWith("content-")) { - return true; - } - if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { - const name = util.headerNameToString(header); - return name === "authorization" || name === "cookie" || name === "proxy-authorization"; - } - return false; - } - function cleanRequestHeaders(headers, removeContent, unknownOrigin) { - const ret = []; - if (Array.isArray(headers)) { - for (let i = 0;i < headers.length; i += 2) { - if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { - ret.push(headers[i], headers[i + 1]); - } - } - } else if (headers && typeof headers === "object") { - for (const key of Object.keys(headers)) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers[key]); - } - } - } else { - assert(headers == null, "headers must be an object or an array"); - } - return ret; - } - module.exports = RedirectHandler; -}); - -// ../node_modules/undici/lib/interceptor/redirectInterceptor.js -var require_redirectInterceptor = __commonJS((exports, module) => { - var RedirectHandler = require_RedirectHandler(); - function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return function Intercept(opts, handler) { - const { maxRedirections = defaultMaxRedirections } = opts; - if (!maxRedirections) { - return dispatch(opts, handler); - } - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); - opts = { ...opts, maxRedirections: 0 }; - return dispatch(opts, redirectHandler); - }; - }; - } - module.exports = createRedirectInterceptor; -}); - -// ../node_modules/undici/lib/llhttp/llhttp-wasm.js -var require_llhttp_wasm = __commonJS((exports, module) => { - module.exports = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQDscBAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxweHyAhIyUoP0BBREVGR0hJSktMTU9QUVJT3gNXWVtcXWBiZWZnaGlqa2xtb3BxcnN0dXZ3eHl6e3x9foABggGFAYYBhwGJAYsBjAGNAY4BjwGQAZEBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAZkCpAKwAv4C/gILIAEiBCACRw3zAUHdASEQDP8DCyABIhAgAkcN3QFBwwEhEAz+AwsgASIBIAJHDZABQfcAIRAM/QMLIAEiASACRw2GAUHvACEQDPwDCyABIgEgAkcNf0HqACEQDPsDCyABIgEgAkcNe0HoACEQDPoDCyABIgEgAkcNeEHmACEQDPkDCyABIgEgAkcNGkEYIRAM+AMLIAEiASACRw0UQRIhEAz3AwsgASIBIAJHDVlBxQAhEAz2AwsgASIBIAJHDUpBPyEQDPUDCyABIgEgAkcNSEE8IRAM9AMLIAEiASACRw1BQTEhEAzzAwsgAC0ALkEBRg3rAwyHAgsgACABIgEgAhDAgICAAEEBRw3mASAAQgA3AyAM5wELIAAgASIBIAIQtICAgAAiEA3nASABIQEM9QILAkAgASIBIAJHDQBBBiEQDPADCyAAIAFBAWoiASACELuAgIAAIhAN6AEgASEBDDELIABCADcDIEESIRAM1QMLIAEiECACRw0rQR0hEAztAwsCQCABIgEgAkYNACABQQFqIQFBECEQDNQDC0EHIRAM7AMLIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN5QFBCCEQDOsDCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEUIRAM0gMLQQkhEAzqAwsgASEBIAApAyBQDeQBIAEhAQzyAgsCQCABIgEgAkcNAEELIRAM6QMLIAAgAUEBaiIBIAIQtoCAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3mASABIQEMDQsgACABIgEgAhC6gICAACIQDecBIAEhAQzwAgsCQCABIgEgAkcNAEEPIRAM5QMLIAEtAAAiEEE7Rg0IIBBBDUcN6AEgAUEBaiEBDO8CCyAAIAEiASACELqAgIAAIhAN6AEgASEBDPICCwNAAkAgAS0AAEHwtYCAAGotAAAiEEEBRg0AIBBBAkcN6wEgACgCBCEQIABBADYCBCAAIBAgAUEBaiIBELmAgIAAIhAN6gEgASEBDPQCCyABQQFqIgEgAkcNAAtBEiEQDOIDCyAAIAEiASACELqAgIAAIhAN6QEgASEBDAoLIAEiASACRw0GQRshEAzgAwsCQCABIgEgAkcNAEEWIRAM4AMLIABBioCAgAA2AgggACABNgIEIAAgASACELiAgIAAIhAN6gEgASEBQSAhEAzGAwsCQCABIgEgAkYNAANAAkAgAS0AAEHwt4CAAGotAAAiEEECRg0AAkAgEEF/ag4E5QHsAQDrAewBCyABQQFqIQFBCCEQDMgDCyABQQFqIgEgAkcNAAtBFSEQDN8DC0EVIRAM3gMLA0ACQCABLQAAQfC5gIAAai0AACIQQQJGDQAgEEF/ag4E3gHsAeAB6wHsAQsgAUEBaiIBIAJHDQALQRghEAzdAwsCQCABIgEgAkYNACAAQYuAgIAANgIIIAAgATYCBCABIQFBByEQDMQDC0EZIRAM3AMLIAFBAWohAQwCCwJAIAEiFCACRw0AQRohEAzbAwsgFCEBAkAgFC0AAEFzag4U3QLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gIA7gILQQAhECAAQQA2AhwgAEGvi4CAADYCECAAQQI2AgwgACAUQQFqNgIUDNoDCwJAIAEtAAAiEEE7Rg0AIBBBDUcN6AEgAUEBaiEBDOUCCyABQQFqIQELQSIhEAy/AwsCQCABIhAgAkcNAEEcIRAM2AMLQgAhESAQIQEgEC0AAEFQag435wHmAQECAwQFBgcIAAAAAAAAAAkKCwwNDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAREhMUAAtBHiEQDL0DC0ICIREM5QELQgMhEQzkAQtCBCERDOMBC0IFIREM4gELQgYhEQzhAQtCByERDOABC0IIIREM3wELQgkhEQzeAQtCCiERDN0BC0ILIREM3AELQgwhEQzbAQtCDSERDNoBC0IOIREM2QELQg8hEQzYAQtCCiERDNcBC0ILIREM1gELQgwhEQzVAQtCDSERDNQBC0IOIREM0wELQg8hEQzSAQtCACERAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQLQAAQVBqDjflAeQBAAECAwQFBgfmAeYB5gHmAeYB5gHmAQgJCgsMDeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gEODxAREhPmAQtCAiERDOQBC0IDIREM4wELQgQhEQziAQtCBSERDOEBC0IGIREM4AELQgchEQzfAQtCCCERDN4BC0IJIREM3QELQgohEQzcAQtCCyERDNsBC0IMIREM2gELQg0hEQzZAQtCDiERDNgBC0IPIREM1wELQgohEQzWAQtCCyERDNUBC0IMIREM1AELQg0hEQzTAQtCDiERDNIBC0IPIREM0QELIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN0gFBHyEQDMADCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEkIRAMpwMLQSAhEAy/AwsgACABIhAgAhC+gICAAEF/ag4FtgEAxQIB0QHSAQtBESEQDKQDCyAAQQE6AC8gECEBDLsDCyABIgEgAkcN0gFBJCEQDLsDCyABIg0gAkcNHkHGACEQDLoDCyAAIAEiASACELKAgIAAIhAN1AEgASEBDLUBCyABIhAgAkcNJkHQACEQDLgDCwJAIAEiASACRw0AQSghEAy4AwsgAEEANgIEIABBjICAgAA2AgggACABIAEQsYCAgAAiEA3TASABIQEM2AELAkAgASIQIAJHDQBBKSEQDLcDCyAQLQAAIgFBIEYNFCABQQlHDdMBIBBBAWohAQwVCwJAIAEiASACRg0AIAFBAWohAQwXC0EqIRAMtQMLAkAgASIQIAJHDQBBKyEQDLUDCwJAIBAtAAAiAUEJRg0AIAFBIEcN1QELIAAtACxBCEYN0wEgECEBDJEDCwJAIAEiASACRw0AQSwhEAy0AwsgAS0AAEEKRw3VASABQQFqIQEMyQILIAEiDiACRw3VAUEvIRAMsgMLA0ACQCABLQAAIhBBIEYNAAJAIBBBdmoOBADcAdwBANoBCyABIQEM4AELIAFBAWoiASACRw0AC0ExIRAMsQMLQTIhECABIhQgAkYNsAMgAiAUayAAKAIAIgFqIRUgFCABa0EDaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfC7gIAAai0AAEcNAQJAIAFBA0cNAEEGIQEMlgMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLEDCyAAQQA2AgAgFCEBDNkBC0EzIRAgASIUIAJGDa8DIAIgFGsgACgCACIBaiEVIBQgAWtBCGohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUH0u4CAAGotAABHDQECQCABQQhHDQBBBSEBDJUDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAywAwsgAEEANgIAIBQhAQzYAQtBNCEQIAEiFCACRg2uAyACIBRrIAAoAgAiAWohFSAUIAFrQQVqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw0BAkAgAUEFRw0AQQchAQyUAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMrwMLIABBADYCACAUIQEM1wELAkAgASIBIAJGDQADQAJAIAEtAABBgL6AgABqLQAAIhBBAUYNACAQQQJGDQogASEBDN0BCyABQQFqIgEgAkcNAAtBMCEQDK4DC0EwIRAMrQMLAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AIBBBdmoOBNkB2gHaAdkB2gELIAFBAWoiASACRw0AC0E4IRAMrQMLQTghEAysAwsDQAJAIAEtAAAiEEEgRg0AIBBBCUcNAwsgAUEBaiIBIAJHDQALQTwhEAyrAwsDQAJAIAEtAAAiEEEgRg0AAkACQCAQQXZqDgTaAQEB2gEACyAQQSxGDdsBCyABIQEMBAsgAUEBaiIBIAJHDQALQT8hEAyqAwsgASEBDNsBC0HAACEQIAEiFCACRg2oAyACIBRrIAAoAgAiAWohFiAUIAFrQQZqIRcCQANAIBQtAABBIHIgAUGAwICAAGotAABHDQEgAUEGRg2OAyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAypAwsgAEEANgIAIBQhAQtBNiEQDI4DCwJAIAEiDyACRw0AQcEAIRAMpwMLIABBjICAgAA2AgggACAPNgIEIA8hASAALQAsQX9qDgTNAdUB1wHZAYcDCyABQQFqIQEMzAELAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgciAQIBBBv39qQf8BcUEaSRtB/wFxIhBBCUYNACAQQSBGDQACQAJAAkACQCAQQZ1/ag4TAAMDAwMDAwMBAwMDAwMDAwMDAgMLIAFBAWohAUExIRAMkQMLIAFBAWohAUEyIRAMkAMLIAFBAWohAUEzIRAMjwMLIAEhAQzQAQsgAUEBaiIBIAJHDQALQTUhEAylAwtBNSEQDKQDCwJAIAEiASACRg0AA0ACQCABLQAAQYC8gIAAai0AAEEBRg0AIAEhAQzTAQsgAUEBaiIBIAJHDQALQT0hEAykAwtBPSEQDKMDCyAAIAEiASACELCAgIAAIhAN1gEgASEBDAELIBBBAWohAQtBPCEQDIcDCwJAIAEiASACRw0AQcIAIRAMoAMLAkADQAJAIAEtAABBd2oOGAAC/gL+AoQD/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4CAP4CCyABQQFqIgEgAkcNAAtBwgAhEAygAwsgAUEBaiEBIAAtAC1BAXFFDb0BIAEhAQtBLCEQDIUDCyABIgEgAkcN0wFBxAAhEAydAwsDQAJAIAEtAABBkMCAgABqLQAAQQFGDQAgASEBDLcCCyABQQFqIgEgAkcNAAtBxQAhEAycAwsgDS0AACIQQSBGDbMBIBBBOkcNgQMgACgCBCEBIABBADYCBCAAIAEgDRCvgICAACIBDdABIA1BAWohAQyzAgtBxwAhECABIg0gAkYNmgMgAiANayAAKAIAIgFqIRYgDSABa0EFaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGQwoCAAGotAABHDYADIAFBBUYN9AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmgMLQcgAIRAgASINIAJGDZkDIAIgDWsgACgCACIBaiEWIA0gAWtBCWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBlsKAgABqLQAARw3/AgJAIAFBCUcNAEECIQEM9QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJkDCwJAIAEiDSACRw0AQckAIRAMmQMLAkACQCANLQAAIgFBIHIgASABQb9/akH/AXFBGkkbQf8BcUGSf2oOBwCAA4ADgAOAA4ADAYADCyANQQFqIQFBPiEQDIADCyANQQFqIQFBPyEQDP8CC0HKACEQIAEiDSACRg2XAyACIA1rIAAoAgAiAWohFiANIAFrQQFqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaDCgIAAai0AAEcN/QIgAUEBRg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyXAwtBywAhECABIg0gAkYNlgMgAiANayAAKAIAIgFqIRYgDSABa0EOaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGiwoCAAGotAABHDfwCIAFBDkYN8AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlgMLQcwAIRAgASINIAJGDZUDIAIgDWsgACgCACIBaiEWIA0gAWtBD2ohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBwMKAgABqLQAARw37AgJAIAFBD0cNAEEDIQEM8QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJUDC0HNACEQIAEiDSACRg2UAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQdDCgIAAai0AAEcN+gICQCABQQVHDQBBBCEBDPACCyABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyUAwsCQCABIg0gAkcNAEHOACEQDJQDCwJAAkACQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZ1/ag4TAP0C/QL9Av0C/QL9Av0C/QL9Av0C/QL9AgH9Av0C/QICA/0CCyANQQFqIQFBwQAhEAz9AgsgDUEBaiEBQcIAIRAM/AILIA1BAWohAUHDACEQDPsCCyANQQFqIQFBxAAhEAz6AgsCQCABIgEgAkYNACAAQY2AgIAANgIIIAAgATYCBCABIQFBxQAhEAz6AgtBzwAhEAySAwsgECEBAkACQCAQLQAAQXZqDgQBqAKoAgCoAgsgEEEBaiEBC0EnIRAM+AILAkAgASIBIAJHDQBB0QAhEAyRAwsCQCABLQAAQSBGDQAgASEBDI0BCyABQQFqIQEgAC0ALUEBcUUNxwEgASEBDIwBCyABIhcgAkcNyAFB0gAhEAyPAwtB0wAhECABIhQgAkYNjgMgAiAUayAAKAIAIgFqIRYgFCABa0EBaiEXA0AgFC0AACABQdbCgIAAai0AAEcNzAEgAUEBRg3HASABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAyOAwsCQCABIgEgAkcNAEHVACEQDI4DCyABLQAAQQpHDcwBIAFBAWohAQzHAQsCQCABIgEgAkcNAEHWACEQDI0DCwJAAkAgAS0AAEF2ag4EAM0BzQEBzQELIAFBAWohAQzHAQsgAUEBaiEBQcoAIRAM8wILIAAgASIBIAIQroCAgAAiEA3LASABIQFBzQAhEAzyAgsgAC0AKUEiRg2FAwymAgsCQCABIgEgAkcNAEHbACEQDIoDC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgAS0AAEFQag4K1AHTAQABAgMEBQYI1QELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMzAELQQkhEEEBIRRBACEXQQAhFgzLAQsCQCABIgEgAkcNAEHdACEQDIkDCyABLQAAQS5HDcwBIAFBAWohAQymAgsgASIBIAJHDcwBQd8AIRAMhwMLAkAgASIBIAJGDQAgAEGOgICAADYCCCAAIAE2AgQgASEBQdAAIRAM7gILQeAAIRAMhgMLQeEAIRAgASIBIAJGDYUDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHiwoCAAGotAABHDc0BIBRBA0YNzAEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhQMLQeIAIRAgASIBIAJGDYQDIAIgAWsgACgCACIUaiEWIAEgFGtBAmohFwNAIAEtAAAgFEHmwoCAAGotAABHDcwBIBRBAkYNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhAMLQeMAIRAgASIBIAJGDYMDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHpwoCAAGotAABHDcsBIBRBA0YNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMgwMLAkAgASIBIAJHDQBB5QAhEAyDAwsgACABQQFqIgEgAhCogICAACIQDc0BIAEhAUHWACEQDOkCCwJAIAEiASACRg0AA0ACQCABLQAAIhBBIEYNAAJAAkACQCAQQbh/ag4LAAHPAc8BzwHPAc8BzwHPAc8BAs8BCyABQQFqIQFB0gAhEAztAgsgAUEBaiEBQdMAIRAM7AILIAFBAWohAUHUACEQDOsCCyABQQFqIgEgAkcNAAtB5AAhEAyCAwtB5AAhEAyBAwsDQAJAIAEtAABB8MKAgABqLQAAIhBBAUYNACAQQX5qDgPPAdAB0QHSAQsgAUEBaiIBIAJHDQALQeYAIRAMgAMLAkAgASIBIAJGDQAgAUEBaiEBDAMLQecAIRAM/wILA0ACQCABLQAAQfDEgIAAai0AACIQQQFGDQACQCAQQX5qDgTSAdMB1AEA1QELIAEhAUHXACEQDOcCCyABQQFqIgEgAkcNAAtB6AAhEAz+AgsCQCABIgEgAkcNAEHpACEQDP4CCwJAIAEtAAAiEEF2ag4augHVAdUBvAHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHKAdUB1QEA0wELIAFBAWohAQtBBiEQDOMCCwNAAkAgAS0AAEHwxoCAAGotAABBAUYNACABIQEMngILIAFBAWoiASACRw0AC0HqACEQDPsCCwJAIAEiASACRg0AIAFBAWohAQwDC0HrACEQDPoCCwJAIAEiASACRw0AQewAIRAM+gILIAFBAWohAQwBCwJAIAEiASACRw0AQe0AIRAM+QILIAFBAWohAQtBBCEQDN4CCwJAIAEiFCACRw0AQe4AIRAM9wILIBQhAQJAAkACQCAULQAAQfDIgIAAai0AAEF/ag4H1AHVAdYBAJwCAQLXAQsgFEEBaiEBDAoLIBRBAWohAQzNAQtBACEQIABBADYCHCAAQZuSgIAANgIQIABBBzYCDCAAIBRBAWo2AhQM9gILAkADQAJAIAEtAABB8MiAgABqLQAAIhBBBEYNAAJAAkAgEEF/ag4H0gHTAdQB2QEABAHZAQsgASEBQdoAIRAM4AILIAFBAWohAUHcACEQDN8CCyABQQFqIgEgAkcNAAtB7wAhEAz2AgsgAUEBaiEBDMsBCwJAIAEiFCACRw0AQfAAIRAM9QILIBQtAABBL0cN1AEgFEEBaiEBDAYLAkAgASIUIAJHDQBB8QAhEAz0AgsCQCAULQAAIgFBL0cNACAUQQFqIQFB3QAhEAzbAgsgAUF2aiIEQRZLDdMBQQEgBHRBiYCAAnFFDdMBDMoCCwJAIAEiASACRg0AIAFBAWohAUHeACEQDNoCC0HyACEQDPICCwJAIAEiFCACRw0AQfQAIRAM8gILIBQhAQJAIBQtAABB8MyAgABqLQAAQX9qDgPJApQCANQBC0HhACEQDNgCCwJAIAEiFCACRg0AA0ACQCAULQAAQfDKgIAAai0AACIBQQNGDQACQCABQX9qDgLLAgDVAQsgFCEBQd8AIRAM2gILIBRBAWoiFCACRw0AC0HzACEQDPECC0HzACEQDPACCwJAIAEiASACRg0AIABBj4CAgAA2AgggACABNgIEIAEhAUHgACEQDNcCC0H1ACEQDO8CCwJAIAEiASACRw0AQfYAIRAM7wILIABBj4CAgAA2AgggACABNgIEIAEhAQtBAyEQDNQCCwNAIAEtAABBIEcNwwIgAUEBaiIBIAJHDQALQfcAIRAM7AILAkAgASIBIAJHDQBB+AAhEAzsAgsgAS0AAEEgRw3OASABQQFqIQEM7wELIAAgASIBIAIQrICAgAAiEA3OASABIQEMjgILAkAgASIEIAJHDQBB+gAhEAzqAgsgBC0AAEHMAEcN0QEgBEEBaiEBQRMhEAzPAQsCQCABIgQgAkcNAEH7ACEQDOkCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRADQCAELQAAIAFB8M6AgABqLQAARw3QASABQQVGDc4BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQfsAIRAM6AILAkAgASIEIAJHDQBB/AAhEAzoAgsCQAJAIAQtAABBvX9qDgwA0QHRAdEB0QHRAdEB0QHRAdEB0QEB0QELIARBAWohAUHmACEQDM8CCyAEQQFqIQFB5wAhEAzOAgsCQCABIgQgAkcNAEH9ACEQDOcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDc8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH9ACEQDOcCCyAAQQA2AgAgEEEBaiEBQRAhEAzMAQsCQCABIgQgAkcNAEH+ACEQDOYCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUH2zoCAAGotAABHDc4BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH+ACEQDOYCCyAAQQA2AgAgEEEBaiEBQRYhEAzLAQsCQCABIgQgAkcNAEH/ACEQDOUCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUH8zoCAAGotAABHDc0BIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH/ACEQDOUCCyAAQQA2AgAgEEEBaiEBQQUhEAzKAQsCQCABIgQgAkcNAEGAASEQDOQCCyAELQAAQdkARw3LASAEQQFqIQFBCCEQDMkBCwJAIAEiBCACRw0AQYEBIRAM4wILAkACQCAELQAAQbJ/ag4DAMwBAcwBCyAEQQFqIQFB6wAhEAzKAgsgBEEBaiEBQewAIRAMyQILAkAgASIEIAJHDQBBggEhEAziAgsCQAJAIAQtAABBuH9qDggAywHLAcsBywHLAcsBAcsBCyAEQQFqIQFB6gAhEAzJAgsgBEEBaiEBQe0AIRAMyAILAkAgASIEIAJHDQBBgwEhEAzhAgsgAiAEayAAKAIAIgFqIRAgBCABa0ECaiEUAkADQCAELQAAIAFBgM+AgABqLQAARw3JASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBA2AgBBgwEhEAzhAgtBACEQIABBADYCACAUQQFqIQEMxgELAkAgASIEIAJHDQBBhAEhEAzgAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBg8+AgABqLQAARw3IASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhAEhEAzgAgsgAEEANgIAIBBBAWohAUEjIRAMxQELAkAgASIEIAJHDQBBhQEhEAzfAgsCQAJAIAQtAABBtH9qDggAyAHIAcgByAHIAcgBAcgBCyAEQQFqIQFB7wAhEAzGAgsgBEEBaiEBQfAAIRAMxQILAkAgASIEIAJHDQBBhgEhEAzeAgsgBC0AAEHFAEcNxQEgBEEBaiEBDIMCCwJAIAEiBCACRw0AQYcBIRAM3QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQYjPgIAAai0AAEcNxQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYcBIRAM3QILIABBADYCACAQQQFqIQFBLSEQDMIBCwJAIAEiBCACRw0AQYgBIRAM3AILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNxAEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYgBIRAM3AILIABBADYCACAQQQFqIQFBKSEQDMEBCwJAIAEiASACRw0AQYkBIRAM2wILQQEhECABLQAAQd8ARw3AASABQQFqIQEMgQILAkAgASIEIAJHDQBBigEhEAzaAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQA0AgBC0AACABQYzPgIAAai0AAEcNwQEgAUEBRg2vAiABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGKASEQDNkCCwJAIAEiBCACRw0AQYsBIRAM2QILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQY7PgIAAai0AAEcNwQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYsBIRAM2QILIABBADYCACAQQQFqIQFBAiEQDL4BCwJAIAEiBCACRw0AQYwBIRAM2AILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNwAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYwBIRAM2AILIABBADYCACAQQQFqIQFBHyEQDL0BCwJAIAEiBCACRw0AQY0BIRAM1wILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNvwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY0BIRAM1wILIABBADYCACAQQQFqIQFBCSEQDLwBCwJAIAEiBCACRw0AQY4BIRAM1gILAkACQCAELQAAQbd/ag4HAL8BvwG/Ab8BvwEBvwELIARBAWohAUH4ACEQDL0CCyAEQQFqIQFB+QAhEAy8AgsCQCABIgQgAkcNAEGPASEQDNUCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGRz4CAAGotAABHDb0BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGPASEQDNUCCyAAQQA2AgAgEEEBaiEBQRghEAy6AQsCQCABIgQgAkcNAEGQASEQDNQCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUGXz4CAAGotAABHDbwBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGQASEQDNQCCyAAQQA2AgAgEEEBaiEBQRchEAy5AQsCQCABIgQgAkcNAEGRASEQDNMCCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUGaz4CAAGotAABHDbsBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGRASEQDNMCCyAAQQA2AgAgEEEBaiEBQRUhEAy4AQsCQCABIgQgAkcNAEGSASEQDNICCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGhz4CAAGotAABHDboBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGSASEQDNICCyAAQQA2AgAgEEEBaiEBQR4hEAy3AQsCQCABIgQgAkcNAEGTASEQDNECCyAELQAAQcwARw24ASAEQQFqIQFBCiEQDLYBCwJAIAQgAkcNAEGUASEQDNACCwJAAkAgBC0AAEG/f2oODwC5AbkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AQG5AQsgBEEBaiEBQf4AIRAMtwILIARBAWohAUH/ACEQDLYCCwJAIAQgAkcNAEGVASEQDM8CCwJAAkAgBC0AAEG/f2oOAwC4AQG4AQsgBEEBaiEBQf0AIRAMtgILIARBAWohBEGAASEQDLUCCwJAIAQgAkcNAEGWASEQDM4CCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUGnz4CAAGotAABHDbYBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGWASEQDM4CCyAAQQA2AgAgEEEBaiEBQQshEAyzAQsCQCAEIAJHDQBBlwEhEAzNAgsCQAJAAkACQCAELQAAQVNqDiMAuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AQG4AbgBuAG4AbgBArgBuAG4AQO4AQsgBEEBaiEBQfsAIRAMtgILIARBAWohAUH8ACEQDLUCCyAEQQFqIQRBgQEhEAy0AgsgBEEBaiEEQYIBIRAMswILAkAgBCACRw0AQZgBIRAMzAILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQanPgIAAai0AAEcNtAEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZgBIRAMzAILIABBADYCACAQQQFqIQFBGSEQDLEBCwJAIAQgAkcNAEGZASEQDMsCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGuz4CAAGotAABHDbMBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGZASEQDMsCCyAAQQA2AgAgEEEBaiEBQQYhEAywAQsCQCAEIAJHDQBBmgEhEAzKAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBtM+AgABqLQAARw2yASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmgEhEAzKAgsgAEEANgIAIBBBAWohAUEcIRAMrwELAkAgBCACRw0AQZsBIRAMyQILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbbPgIAAai0AAEcNsQEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZsBIRAMyQILIABBADYCACAQQQFqIQFBJyEQDK4BCwJAIAQgAkcNAEGcASEQDMgCCwJAAkAgBC0AAEGsf2oOAgABsQELIARBAWohBEGGASEQDK8CCyAEQQFqIQRBhwEhEAyuAgsCQCAEIAJHDQBBnQEhEAzHAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBuM+AgABqLQAARw2vASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBnQEhEAzHAgsgAEEANgIAIBBBAWohAUEmIRAMrAELAkAgBCACRw0AQZ4BIRAMxgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbrPgIAAai0AAEcNrgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ4BIRAMxgILIABBADYCACAQQQFqIQFBAyEQDKsBCwJAIAQgAkcNAEGfASEQDMUCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDa0BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGfASEQDMUCCyAAQQA2AgAgEEEBaiEBQQwhEAyqAQsCQCAEIAJHDQBBoAEhEAzEAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBvM+AgABqLQAARw2sASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBoAEhEAzEAgsgAEEANgIAIBBBAWohAUENIRAMqQELAkAgBCACRw0AQaEBIRAMwwILAkACQCAELQAAQbp/ag4LAKwBrAGsAawBrAGsAawBrAGsAQGsAQsgBEEBaiEEQYsBIRAMqgILIARBAWohBEGMASEQDKkCCwJAIAQgAkcNAEGiASEQDMICCyAELQAAQdAARw2pASAEQQFqIQQM6QELAkAgBCACRw0AQaMBIRAMwQILAkACQCAELQAAQbd/ag4HAaoBqgGqAaoBqgEAqgELIARBAWohBEGOASEQDKgCCyAEQQFqIQFBIiEQDKYBCwJAIAQgAkcNAEGkASEQDMACCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHAz4CAAGotAABHDagBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGkASEQDMACCyAAQQA2AgAgEEEBaiEBQR0hEAylAQsCQCAEIAJHDQBBpQEhEAy/AgsCQAJAIAQtAABBrn9qDgMAqAEBqAELIARBAWohBEGQASEQDKYCCyAEQQFqIQFBBCEQDKQBCwJAIAQgAkcNAEGmASEQDL4CCwJAAkACQAJAAkAgBC0AAEG/f2oOFQCqAaoBqgGqAaoBqgGqAaoBqgGqAQGqAaoBAqoBqgEDqgGqAQSqAQsgBEEBaiEEQYgBIRAMqAILIARBAWohBEGJASEQDKcCCyAEQQFqIQRBigEhEAymAgsgBEEBaiEEQY8BIRAMpQILIARBAWohBEGRASEQDKQCCwJAIAQgAkcNAEGnASEQDL0CCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDaUBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGnASEQDL0CCyAAQQA2AgAgEEEBaiEBQREhEAyiAQsCQCAEIAJHDQBBqAEhEAy8AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBws+AgABqLQAARw2kASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqAEhEAy8AgsgAEEANgIAIBBBAWohAUEsIRAMoQELAkAgBCACRw0AQakBIRAMuwILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQcXPgIAAai0AAEcNowEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQakBIRAMuwILIABBADYCACAQQQFqIQFBKyEQDKABCwJAIAQgAkcNAEGqASEQDLoCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHKz4CAAGotAABHDaIBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGqASEQDLoCCyAAQQA2AgAgEEEBaiEBQRQhEAyfAQsCQCAEIAJHDQBBqwEhEAy5AgsCQAJAAkACQCAELQAAQb5/ag4PAAECpAGkAaQBpAGkAaQBpAGkAaQBpAGkAQOkAQsgBEEBaiEEQZMBIRAMogILIARBAWohBEGUASEQDKECCyAEQQFqIQRBlQEhEAygAgsgBEEBaiEEQZYBIRAMnwILAkAgBCACRw0AQawBIRAMuAILIAQtAABBxQBHDZ8BIARBAWohBAzgAQsCQCAEIAJHDQBBrQEhEAy3AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBzc+AgABqLQAARw2fASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrQEhEAy3AgsgAEEANgIAIBBBAWohAUEOIRAMnAELAkAgBCACRw0AQa4BIRAMtgILIAQtAABB0ABHDZ0BIARBAWohAUElIRAMmwELAkAgBCACRw0AQa8BIRAMtQILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNnQEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQa8BIRAMtQILIABBADYCACAQQQFqIQFBKiEQDJoBCwJAIAQgAkcNAEGwASEQDLQCCwJAAkAgBC0AAEGrf2oOCwCdAZ0BnQGdAZ0BnQGdAZ0BnQEBnQELIARBAWohBEGaASEQDJsCCyAEQQFqIQRBmwEhEAyaAgsCQCAEIAJHDQBBsQEhEAyzAgsCQAJAIAQtAABBv39qDhQAnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBAZwBCyAEQQFqIQRBmQEhEAyaAgsgBEEBaiEEQZwBIRAMmQILAkAgBCACRw0AQbIBIRAMsgILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQdnPgIAAai0AAEcNmgEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbIBIRAMsgILIABBADYCACAQQQFqIQFBISEQDJcBCwJAIAQgAkcNAEGzASEQDLECCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUHdz4CAAGotAABHDZkBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGzASEQDLECCyAAQQA2AgAgEEEBaiEBQRohEAyWAQsCQCAEIAJHDQBBtAEhEAywAgsCQAJAAkAgBC0AAEG7f2oOEQCaAZoBmgGaAZoBmgGaAZoBmgEBmgGaAZoBmgGaAQKaAQsgBEEBaiEEQZ0BIRAMmAILIARBAWohBEGeASEQDJcCCyAEQQFqIQRBnwEhEAyWAgsCQCAEIAJHDQBBtQEhEAyvAgsgAiAEayAAKAIAIgFqIRQgBCABa0EFaiEQAkADQCAELQAAIAFB5M+AgABqLQAARw2XASABQQVGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtQEhEAyvAgsgAEEANgIAIBBBAWohAUEoIRAMlAELAkAgBCACRw0AQbYBIRAMrgILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQerPgIAAai0AAEcNlgEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbYBIRAMrgILIABBADYCACAQQQFqIQFBByEQDJMBCwJAIAQgAkcNAEG3ASEQDK0CCwJAAkAgBC0AAEG7f2oODgCWAZYBlgGWAZYBlgGWAZYBlgGWAZYBlgEBlgELIARBAWohBEGhASEQDJQCCyAEQQFqIQRBogEhEAyTAgsCQCAEIAJHDQBBuAEhEAysAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB7c+AgABqLQAARw2UASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuAEhEAysAgsgAEEANgIAIBBBAWohAUESIRAMkQELAkAgBCACRw0AQbkBIRAMqwILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNkwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbkBIRAMqwILIABBADYCACAQQQFqIQFBICEQDJABCwJAIAQgAkcNAEG6ASEQDKoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHyz4CAAGotAABHDZIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG6ASEQDKoCCyAAQQA2AgAgEEEBaiEBQQ8hEAyPAQsCQCAEIAJHDQBBuwEhEAypAgsCQAJAIAQtAABBt39qDgcAkgGSAZIBkgGSAQGSAQsgBEEBaiEEQaUBIRAMkAILIARBAWohBEGmASEQDI8CCwJAIAQgAkcNAEG8ASEQDKgCCyACIARrIAAoAgAiAWohFCAEIAFrQQdqIRACQANAIAQtAAAgAUH0z4CAAGotAABHDZABIAFBB0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG8ASEQDKgCCyAAQQA2AgAgEEEBaiEBQRshEAyNAQsCQCAEIAJHDQBBvQEhEAynAgsCQAJAAkAgBC0AAEG+f2oOEgCRAZEBkQGRAZEBkQGRAZEBkQEBkQGRAZEBkQGRAZEBApEBCyAEQQFqIQRBpAEhEAyPAgsgBEEBaiEEQacBIRAMjgILIARBAWohBEGoASEQDI0CCwJAIAQgAkcNAEG+ASEQDKYCCyAELQAAQc4ARw2NASAEQQFqIQQMzwELAkAgBCACRw0AQb8BIRAMpQILAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBC0AAEG/f2oOFQABAgOcAQQFBpwBnAGcAQcICQoLnAEMDQ4PnAELIARBAWohAUHoACEQDJoCCyAEQQFqIQFB6QAhEAyZAgsgBEEBaiEBQe4AIRAMmAILIARBAWohAUHyACEQDJcCCyAEQQFqIQFB8wAhEAyWAgsgBEEBaiEBQfYAIRAMlQILIARBAWohAUH3ACEQDJQCCyAEQQFqIQFB+gAhEAyTAgsgBEEBaiEEQYMBIRAMkgILIARBAWohBEGEASEQDJECCyAEQQFqIQRBhQEhEAyQAgsgBEEBaiEEQZIBIRAMjwILIARBAWohBEGYASEQDI4CCyAEQQFqIQRBoAEhEAyNAgsgBEEBaiEEQaMBIRAMjAILIARBAWohBEGqASEQDIsCCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEGrASEQDIsCC0HAASEQDKMCCyAAIAUgAhCqgICAACIBDYsBIAUhAQxcCwJAIAYgAkYNACAGQQFqIQUMjQELQcIBIRAMoQILA0ACQCAQLQAAQXZqDgSMAQAAjwEACyAQQQFqIhAgAkcNAAtBwwEhEAygAgsCQCAHIAJGDQAgAEGRgICAADYCCCAAIAc2AgQgByEBQQEhEAyHAgtBxAEhEAyfAgsCQCAHIAJHDQBBxQEhEAyfAgsCQAJAIActAABBdmoOBAHOAc4BAM4BCyAHQQFqIQYMjQELIAdBAWohBQyJAQsCQCAHIAJHDQBBxgEhEAyeAgsCQAJAIActAABBdmoOFwGPAY8BAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAQCPAQsgB0EBaiEHC0GwASEQDIQCCwJAIAggAkcNAEHIASEQDJ0CCyAILQAAQSBHDY0BIABBADsBMiAIQQFqIQFBswEhEAyDAgsgASEXAkADQCAXIgcgAkYNASAHLQAAQVBqQf8BcSIQQQpPDcwBAkAgAC8BMiIUQZkzSw0AIAAgFEEKbCIUOwEyIBBB//8DcyAUQf7/A3FJDQAgB0EBaiEXIAAgFCAQaiIQOwEyIBBB//8DcUHoB0kNAQsLQQAhECAAQQA2AhwgAEHBiYCAADYCECAAQQ02AgwgACAHQQFqNgIUDJwCC0HHASEQDJsCCyAAIAggAhCugICAACIQRQ3KASAQQRVHDYwBIABByAE2AhwgACAINgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAyaAgsCQCAJIAJHDQBBzAEhEAyaAgtBACEUQQEhF0EBIRZBACEQAkACQAJAAkACQAJAAkACQAJAIAktAABBUGoOCpYBlQEAAQIDBAUGCJcBC0ECIRAMBgtBAyEQDAULQQQhEAwEC0EFIRAMAwtBBiEQDAILQQchEAwBC0EIIRALQQAhF0EAIRZBACEUDI4BC0EJIRBBASEUQQAhF0EAIRYMjQELAkAgCiACRw0AQc4BIRAMmQILIAotAABBLkcNjgEgCkEBaiEJDMoBCyALIAJHDY4BQdABIRAMlwILAkAgCyACRg0AIABBjoCAgAA2AgggACALNgIEQbcBIRAM/gELQdEBIRAMlgILAkAgBCACRw0AQdIBIRAMlgILIAIgBGsgACgCACIQaiEUIAQgEGtBBGohCwNAIAQtAAAgEEH8z4CAAGotAABHDY4BIBBBBEYN6QEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB0gEhEAyVAgsgACAMIAIQrICAgAAiAQ2NASAMIQEMuAELAkAgBCACRw0AQdQBIRAMlAILIAIgBGsgACgCACIQaiEUIAQgEGtBAWohDANAIAQtAAAgEEGB0ICAAGotAABHDY8BIBBBAUYNjgEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB1AEhEAyTAgsCQCAEIAJHDQBB1gEhEAyTAgsgAiAEayAAKAIAIhBqIRQgBCAQa0ECaiELA0AgBC0AACAQQYPQgIAAai0AAEcNjgEgEEECRg2QASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHWASEQDJICCwJAIAQgAkcNAEHXASEQDJICCwJAAkAgBC0AAEG7f2oOEACPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAY8BCyAEQQFqIQRBuwEhEAz5AQsgBEEBaiEEQbwBIRAM+AELAkAgBCACRw0AQdgBIRAMkQILIAQtAABByABHDYwBIARBAWohBAzEAQsCQCAEIAJGDQAgAEGQgICAADYCCCAAIAQ2AgRBvgEhEAz3AQtB2QEhEAyPAgsCQCAEIAJHDQBB2gEhEAyPAgsgBC0AAEHIAEYNwwEgAEEBOgAoDLkBCyAAQQI6AC8gACAEIAIQpoCAgAAiEA2NAUHCASEQDPQBCyAALQAoQX9qDgK3AbkBuAELA0ACQCAELQAAQXZqDgQAjgGOAQCOAQsgBEEBaiIEIAJHDQALQd0BIRAMiwILIABBADoALyAALQAtQQRxRQ2EAgsgAEEAOgAvIABBAToANCABIQEMjAELIBBBFUYN2gEgAEEANgIcIAAgATYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMiAILAkAgACAQIAIQtICAgAAiBA0AIBAhAQyBAgsCQCAEQRVHDQAgAEEDNgIcIAAgEDYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMiAILIABBADYCHCAAIBA2AhQgAEGnjoCAADYCECAAQRI2AgxBACEQDIcCCyAQQRVGDdYBIABBADYCHCAAIAE2AhQgAEHajYCAADYCECAAQRQ2AgxBACEQDIYCCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNjQEgAEEHNgIcIAAgEDYCFCAAIBQ2AgxBACEQDIUCCyAAIAAvATBBgAFyOwEwIAEhAQtBKiEQDOoBCyAQQRVGDdEBIABBADYCHCAAIAE2AhQgAEGDjICAADYCECAAQRM2AgxBACEQDIICCyAQQRVGDc8BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDIECCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyNAQsgAEEMNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDIACCyAQQRVGDcwBIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDP8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyMAQsgAEENNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDP4BCyAQQRVGDckBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDP0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyLAQsgAEEONgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPwBCyAAQQA2AhwgACABNgIUIABBwJWAgAA2AhAgAEECNgIMQQAhEAz7AQsgEEEVRg3FASAAQQA2AhwgACABNgIUIABBxoyAgAA2AhAgAEEjNgIMQQAhEAz6AQsgAEEQNgIcIAAgATYCFCAAIBA2AgxBACEQDPkBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQzxAQsgAEERNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPgBCyAQQRVGDcEBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPcBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyIAQsgAEETNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPYBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQztAQsgAEEUNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPUBCyAQQRVGDb0BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDPQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyGAQsgAEEWNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPMBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQt4CAgAAiBA0AIAFBAWohAQzpAQsgAEEXNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPIBCyAAQQA2AhwgACABNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzxAQtCASERCyAQQQFqIQECQCAAKQMgIhJC//////////8PVg0AIAAgEkIEhiARhDcDICABIQEMhAELIABBADYCHCAAIAE2AhQgAEGtiYCAADYCECAAQQw2AgxBACEQDO8BCyAAQQA2AhwgACAQNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzuAQsgACgCBCEXIABBADYCBCAQIBGnaiIWIQEgACAXIBAgFiAUGyIQELWAgIAAIhRFDXMgAEEFNgIcIAAgEDYCFCAAIBQ2AgxBACEQDO0BCyAAQQA2AhwgACAQNgIUIABBqpyAgAA2AhAgAEEPNgIMQQAhEAzsAQsgACAQIAIQtICAgAAiAQ0BIBAhAQtBDiEQDNEBCwJAIAFBFUcNACAAQQI2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAzqAQsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAM6QELIAFBAWohEAJAIAAvATAiAUGAAXFFDQACQCAAIBAgAhC7gICAACIBDQAgECEBDHALIAFBFUcNugEgAEEFNgIcIAAgEDYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAM6QELAkAgAUGgBHFBoARHDQAgAC0ALUECcQ0AIABBADYCHCAAIBA2AhQgAEGWk4CAADYCECAAQQQ2AgxBACEQDOkBCyAAIBAgAhC9gICAABogECEBAkACQAJAAkACQCAAIBAgAhCzgICAAA4WAgEABAQEBAQEBAQEBAQEBAQEBAQEAwQLIABBAToALgsgACAALwEwQcAAcjsBMCAQIQELQSYhEAzRAQsgAEEjNgIcIAAgEDYCFCAAQaWWgIAANgIQIABBFTYCDEEAIRAM6QELIABBADYCHCAAIBA2AhQgAEHVi4CAADYCECAAQRE2AgxBACEQDOgBCyAALQAtQQFxRQ0BQcMBIRAMzgELAkAgDSACRg0AA0ACQCANLQAAQSBGDQAgDSEBDMQBCyANQQFqIg0gAkcNAAtBJSEQDOcBC0ElIRAM5gELIAAoAgQhBCAAQQA2AgQgACAEIA0Qr4CAgAAiBEUNrQEgAEEmNgIcIAAgBDYCDCAAIA1BAWo2AhRBACEQDOUBCyAQQRVGDasBIABBADYCHCAAIAE2AhQgAEH9jYCAADYCECAAQR02AgxBACEQDOQBCyAAQSc2AhwgACABNgIUIAAgEDYCDEEAIRAM4wELIBAhAUEBIRQCQAJAAkACQAJAAkACQCAALQAsQX5qDgcGBQUDAQIABQsgACAALwEwQQhyOwEwDAMLQQIhFAwBC0EEIRQLIABBAToALCAAIAAvATAgFHI7ATALIBAhAQtBKyEQDMoBCyAAQQA2AhwgACAQNgIUIABBq5KAgAA2AhAgAEELNgIMQQAhEAziAQsgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDEEAIRAM4QELIABBADoALCAQIQEMvQELIBAhAUEBIRQCQAJAAkACQAJAIAAtACxBe2oOBAMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0EpIRAMxQELIABBADYCHCAAIAE2AhQgAEHwlICAADYCECAAQQM2AgxBACEQDN0BCwJAIA4tAABBDUcNACAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA5BAWohAQx1CyAAQSw2AhwgACABNgIMIAAgDkEBajYCFEEAIRAM3QELIAAtAC1BAXFFDQFBxAEhEAzDAQsCQCAOIAJHDQBBLSEQDNwBCwJAAkADQAJAIA4tAABBdmoOBAIAAAMACyAOQQFqIg4gAkcNAAtBLSEQDN0BCyAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA4hAQx0CyAAQSw2AhwgACAONgIUIAAgATYCDEEAIRAM3AELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHMLIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzbAQsgACgCBCEEIABBADYCBCAAIAQgDhCxgICAACIEDaABIA4hAQzOAQsgEEEsRw0BIAFBAWohEEEBIQECQAJAAkACQAJAIAAtACxBe2oOBAMBAgQACyAQIQEMBAtBAiEBDAELQQQhAQsgAEEBOgAsIAAgAC8BMCABcjsBMCAQIQEMAQsgACAALwEwQQhyOwEwIBAhAQtBOSEQDL8BCyAAQQA6ACwgASEBC0E0IRAMvQELIAAgAC8BMEEgcjsBMCABIQEMAgsgACgCBCEEIABBADYCBAJAIAAgBCABELGAgIAAIgQNACABIQEMxwELIABBNzYCHCAAIAE2AhQgACAENgIMQQAhEAzUAQsgAEEIOgAsIAEhAQtBMCEQDLkBCwJAIAAtAChBAUYNACABIQEMBAsgAC0ALUEIcUUNkwEgASEBDAMLIAAtADBBIHENlAFBxQEhEAy3AQsCQCAPIAJGDQACQANAAkAgDy0AAEFQaiIBQf8BcUEKSQ0AIA8hAUE1IRAMugELIAApAyAiEUKZs+bMmbPmzBlWDQEgACARQgp+IhE3AyAgESABrUL/AYMiEkJ/hVYNASAAIBEgEnw3AyAgD0EBaiIPIAJHDQALQTkhEAzRAQsgACgCBCECIABBADYCBCAAIAIgD0EBaiIEELGAgIAAIgINlQEgBCEBDMMBC0E5IRAMzwELAkAgAC8BMCIBQQhxRQ0AIAAtAChBAUcNACAALQAtQQhxRQ2QAQsgACABQff7A3FBgARyOwEwIA8hAQtBNyEQDLQBCyAAIAAvATBBEHI7ATAMqwELIBBBFUYNiwEgAEEANgIcIAAgATYCFCAAQfCOgIAANgIQIABBHDYCDEEAIRAMywELIABBwwA2AhwgACABNgIMIAAgDUEBajYCFEEAIRAMygELAkAgAS0AAEE6Rw0AIAAoAgQhECAAQQA2AgQCQCAAIBAgARCvgICAACIQDQAgAUEBaiEBDGMLIABBwwA2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMygELIABBADYCHCAAIAE2AhQgAEGxkYCAADYCECAAQQo2AgxBACEQDMkBCyAAQQA2AhwgACABNgIUIABBoJmAgAA2AhAgAEEeNgIMQQAhEAzIAQsgAEEANgIACyAAQYASOwEqIAAgF0EBaiIBIAIQqICAgAAiEA0BIAEhAQtBxwAhEAysAQsgEEEVRw2DASAAQdEANgIcIAAgATYCFCAAQeOXgIAANgIQIABBFTYCDEEAIRAMxAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDF4LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMwwELIABBADYCHCAAIBQ2AhQgAEHBqICAADYCECAAQQc2AgwgAEEANgIAQQAhEAzCAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAzBAQtBACEQIABBADYCHCAAIAE2AhQgAEGAkYCAADYCECAAQQk2AgwMwAELIBBBFUYNfSAAQQA2AhwgACABNgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAy/AQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgAUEBaiEBAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBAJAIAAgECABEK2AgIAAIhANACABIQEMXAsgAEHYADYCHCAAIAE2AhQgACAQNgIMQQAhEAy+AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMrQELIABB2QA2AhwgACABNgIUIAAgBDYCDEEAIRAMvQELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKsBCyAAQdoANgIcIAAgATYCFCAAIAQ2AgxBACEQDLwBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQypAQsgAEHcADYCHCAAIAE2AhQgACAENgIMQQAhEAy7AQsCQCABLQAAQVBqIhBB/wFxQQpPDQAgACAQOgAqIAFBAWohAUHPACEQDKIBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQynAQsgAEHeADYCHCAAIAE2AhQgACAENgIMQQAhEAy6AQsgAEEANgIAIBdBAWohAQJAIAAtAClBI08NACABIQEMWQsgAEEANgIcIAAgATYCFCAAQdOJgIAANgIQIABBCDYCDEEAIRAMuQELIABBADYCAAtBACEQIABBADYCHCAAIAE2AhQgAEGQs4CAADYCECAAQQg2AgwMtwELIABBADYCACAXQQFqIQECQCAALQApQSFHDQAgASEBDFYLIABBADYCHCAAIAE2AhQgAEGbioCAADYCECAAQQg2AgxBACEQDLYBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKSIQQV1qQQtPDQAgASEBDFULAkAgEEEGSw0AQQEgEHRBygBxRQ0AIAEhAQxVC0EAIRAgAEEANgIcIAAgATYCFCAAQfeJgIAANgIQIABBCDYCDAy1AQsgEEEVRg1xIABBADYCHCAAIAE2AhQgAEG5jYCAADYCECAAQRo2AgxBACEQDLQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxUCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLMBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8="; -}); - -// ../node_modules/undici/lib/llhttp/llhttp_simd-wasm.js -var require_llhttp_simd_wasm = __commonJS((exports, module) => { - module.exports = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCrLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC0kBAXsgAEEQav0MAAAAAAAAAAAAAAAAAAAAACIB/QsDACAAIAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=="; -}); - -// ../node_modules/undici/lib/client.js -var require_client = __commonJS((exports, module) => { - var assert = __require("assert"); - var net = __require("net"); - var http = __require("http"); - var { pipeline } = __require("stream"); - var util = require_util(); - var timers = require_timers(); - var Request = require_request(); - var DispatcherBase = require_dispatcher_base(); - var { - RequestContentLengthMismatchError, - ResponseContentLengthMismatchError, - InvalidArgumentError, - RequestAbortedError, - HeadersTimeoutError, - HeadersOverflowError, - SocketError, - InformationalError, - BodyTimeoutError, - HTTPParserError, - ResponseExceededMaxSizeError, - ClientDestroyedError - } = require_errors(); - var buildConnector = require_connect(); - var { - kUrl, - kReset, - kServerName, - kClient, - kBusy, - kParser, - kConnect, - kBlocking, - kResuming, - kRunning, - kPending, - kSize, - kWriting, - kQueue, - kConnected, - kConnecting, - kNeedDrain, - kNoRef, - kKeepAliveDefaultTimeout, - kHostHeader, - kPendingIdx, - kRunningIdx, - kError, - kPipelining, - kSocket, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, - kStrictContentLength, - kConnector, - kMaxRedirections, - kMaxRequests, - kCounter, - kClose, - kDestroy, - kDispatch, - kInterceptors, - kLocalAddress, - kMaxResponseSize, - kHTTPConnVersion, - kHost, - kHTTP2Session, - kHTTP2SessionState, - kHTTP2BuildRequest, - kHTTP2CopyHeaders, - kHTTP1BuildRequest - } = require_symbols(); - var http2; - try { - http2 = __require("http2"); - } catch { - http2 = { constants: {} }; - } - var { - constants: { - HTTP2_HEADER_AUTHORITY, - HTTP2_HEADER_METHOD, - HTTP2_HEADER_PATH, - HTTP2_HEADER_SCHEME, - HTTP2_HEADER_CONTENT_LENGTH, - HTTP2_HEADER_EXPECT, - HTTP2_HEADER_STATUS - } - } = http2; - var h2ExperimentalWarned = false; - var FastBuffer = Buffer[Symbol.species]; - var kClosedResolve = Symbol("kClosedResolve"); - var channels = {}; - try { - const diagnosticsChannel = __require("diagnostics_channel"); - channels.sendHeaders = diagnosticsChannel.channel("undici:client:sendHeaders"); - channels.beforeConnect = diagnosticsChannel.channel("undici:client:beforeConnect"); - channels.connectError = diagnosticsChannel.channel("undici:client:connectError"); - channels.connected = diagnosticsChannel.channel("undici:client:connected"); - } catch { - channels.sendHeaders = { hasSubscribers: false }; - channels.beforeConnect = { hasSubscribers: false }; - channels.connectError = { hasSubscribers: false }; - channels.connected = { hasSubscribers: false }; - } - - class Client extends DispatcherBase { - constructor(url, { - interceptors, - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - maxRedirections, - connect: connect2, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - allowH2, - maxConcurrentStreams - } = {}) { - super(); - if (keepAlive !== undefined) { - throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); - } - if (socketTimeout !== undefined) { - throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); - } - if (requestTimeout !== undefined) { - throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); - } - if (idleTimeout !== undefined) { - throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); - } - if (maxKeepAliveTimeout !== undefined) { - throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); - } - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError("invalid maxHeaderSize"); - } - if (socketPath != null && typeof socketPath !== "string") { - throw new InvalidArgumentError("invalid socketPath"); - } - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError("invalid connectTimeout"); - } - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveTimeout"); - } - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); - } - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); - } - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); - } - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); - } - if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); - } - if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError("localAddress must be valid string IP address"); - } - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError("maxResponseSize must be a positive number"); - } - if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { - throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); - } - if (allowH2 != null && typeof allowH2 !== "boolean") { - throw new InvalidArgumentError("allowH2 must be a valid boolean value"); - } - if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { - throw new InvalidArgumentError("maxConcurrentStreams must be a possitive integer, greater than 0"); - } - if (typeof connect2 !== "function") { - connect2 = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined, - ...connect2 - }); - } - this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) ? interceptors.Client : [createRedirectInterceptor({ maxRedirections })]; - this[kUrl] = util.parseOrigin(url); - this[kConnector] = connect2; - this[kSocket] = null; - this[kPipelining] = pipelining != null ? pipelining : 1; - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4000 : keepAliveTimeout; - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600000 : keepAliveMaxTimeout; - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1000 : keepAliveTimeoutThreshold; - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; - this[kServerName] = null; - this[kLocalAddress] = localAddress != null ? localAddress : null; - this[kResuming] = 0; - this[kNeedDrain] = 0; - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r\n`; - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300000; - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300000; - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; - this[kMaxRedirections] = maxRedirections; - this[kMaxRequests] = maxRequestsPerClient; - this[kClosedResolve] = null; - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; - this[kHTTPConnVersion] = "h1"; - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = !allowH2 ? null : { - openStreams: 0, - maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 - }; - this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}`; - this[kQueue] = []; - this[kRunningIdx] = 0; - this[kPendingIdx] = 0; - } - get pipelining() { - return this[kPipelining]; - } - set pipelining(value) { - this[kPipelining] = value; - resume(this, true); - } - get [kPending]() { - return this[kQueue].length - this[kPendingIdx]; - } - get [kRunning]() { - return this[kPendingIdx] - this[kRunningIdx]; - } - get [kSize]() { - return this[kQueue].length - this[kRunningIdx]; - } - get [kConnected]() { - return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed; - } - get [kBusy]() { - const socket = this[kSocket]; - return socket && (socket[kReset] || socket[kWriting] || socket[kBlocking]) || this[kSize] >= (this[kPipelining] || 1) || this[kPending] > 0; - } - [kConnect](cb) { - connect(this); - this.once("connect", cb); - } - [kDispatch](opts, handler) { - const origin = opts.origin || this[kUrl].origin; - const request = this[kHTTPConnVersion] === "h2" ? Request[kHTTP2BuildRequest](origin, opts, handler) : Request[kHTTP1BuildRequest](origin, opts, handler); - this[kQueue].push(request); - if (this[kResuming]) { - } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { - this[kResuming] = 1; - process.nextTick(resume, this); - } else { - resume(this, true); - } - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2; - } - return this[kNeedDrain] < 2; - } - async[kClose]() { - return new Promise((resolve) => { - if (!this[kSize]) { - resolve(null); - } else { - this[kClosedResolve] = resolve; - } - }); - } - async[kDestroy](err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]); - for (let i = 0;i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); - } - const callback = () => { - if (this[kClosedResolve]) { - this[kClosedResolve](); - this[kClosedResolve] = null; - } - resolve(); - }; - if (this[kHTTP2Session] != null) { - util.destroy(this[kHTTP2Session], err); - this[kHTTP2Session] = null; - this[kHTTP2SessionState] = null; - } - if (!this[kSocket]) { - queueMicrotask(callback); - } else { - util.destroy(this[kSocket].on("close", callback), err); - } - resume(this); - }); - } - } - function onHttp2SessionError(err) { - assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - this[kSocket][kError] = err; - onError(this[kClient], err); - } - function onHttp2FrameError(type, code, id) { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - if (id === 0) { - this[kSocket][kError] = err; - onError(this[kClient], err); - } - } - function onHttp2SessionEnd() { - util.destroy(this, new SocketError("other side closed")); - util.destroy(this[kSocket], new SocketError("other side closed")); - } - function onHTTP2GoAway(code) { - const client = this[kClient]; - const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`); - client[kSocket] = null; - client[kHTTP2Session] = null; - if (client.destroyed) { - assert(this[kPending] === 0); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0;i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); - } - } else if (client[kRunning] > 0) { - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - errorRequest(client, request, err); - } - client[kPendingIdx] = client[kRunningIdx]; - assert(client[kRunning] === 0); - client.emit("disconnect", client[kUrl], [client], err); - resume(client); - } - var constants = require_constants3(); - var createRedirectInterceptor = require_redirectInterceptor(); - var EMPTY_BUF = Buffer.alloc(0); - async function lazyllhttp() { - const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : undefined; - let mod; - try { - mod = await WebAssembly.compile(Buffer.from(require_llhttp_simd_wasm(), "base64")); - } catch (e) { - mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || require_llhttp_wasm(), "base64")); - } - return await WebAssembly.instantiate(mod, { - env: { - wasm_on_url: (p, at, len) => { - return 0; - }, - wasm_on_status: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_begin: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageBegin() || 0; - }, - wasm_on_header_field: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_header_value: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; - }, - wasm_on_body: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_complete: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageComplete() || 0; - } - } - }); - } - var llhttpInstance = null; - var llhttpPromise = lazyllhttp(); - llhttpPromise.catch(); - var currentParser = null; - var currentBufferRef = null; - var currentBufferSize = 0; - var currentBufferPtr = null; - var TIMEOUT_HEADERS = 1; - var TIMEOUT_BODY = 2; - var TIMEOUT_IDLE = 3; - - class Parser { - constructor(client, socket, { exports: exports2 }) { - assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); - this.llhttp = exports2; - this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); - this.client = client; - this.socket = socket; - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.statusCode = null; - this.statusText = ""; - this.upgrade = false; - this.headers = []; - this.headersSize = 0; - this.headersMaxSize = client[kMaxHeadersSize]; - this.shouldKeepAlive = false; - this.paused = false; - this.resume = this.resume.bind(this); - this.bytesRead = 0; - this.keepAlive = ""; - this.contentLength = ""; - this.connection = ""; - this.maxResponseSize = client[kMaxResponseSize]; - } - setTimeout(value, type) { - this.timeoutType = type; - if (value !== this.timeoutValue) { - timers.clearTimeout(this.timeout); - if (value) { - this.timeout = timers.setTimeout(onParserTimeout, value, this); - if (this.timeout.unref) { - this.timeout.unref(); - } - } else { - this.timeout = null; - } - this.timeoutValue = value; - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - } - resume() { - if (this.socket.destroyed || !this.paused) { - return; - } - assert(this.ptr != null); - assert(currentParser == null); - this.llhttp.llhttp_resume(this.ptr); - assert(this.timeoutType === TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - this.paused = false; - this.execute(this.socket.read() || EMPTY_BUF); - this.readMore(); - } - readMore() { - while (!this.paused && this.ptr) { - const chunk = this.socket.read(); - if (chunk === null) { - break; - } - this.execute(chunk); - } - } - execute(data) { - assert(this.ptr != null); - assert(currentParser == null); - assert(!this.paused); - const { socket, llhttp } = this; - if (data.length > currentBufferSize) { - if (currentBufferPtr) { - llhttp.free(currentBufferPtr); - } - currentBufferSize = Math.ceil(data.length / 4096) * 4096; - currentBufferPtr = llhttp.malloc(currentBufferSize); - } - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); - try { - let ret; - try { - currentBufferRef = data; - currentParser = this; - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); - } catch (err) { - throw err; - } finally { - currentParser = null; - currentBufferRef = null; - } - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)); - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true; - socket.unshift(data.slice(offset)); - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr); - let message = ""; - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); - message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; - } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)); - } - } catch (err) { - util.destroy(socket, err); - } - } - destroy() { - assert(this.ptr != null); - assert(currentParser == null); - this.llhttp.llhttp_free(this.ptr); - this.ptr = null; - timers.clearTimeout(this.timeout); - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.paused = false; - } - onStatus(buf) { - this.statusText = buf.toString(); - } - onMessageBegin() { - const { socket, client } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1; - } - } - onHeaderField(buf) { - const len = this.headers.length; - if ((len & 1) === 0) { - this.headers.push(buf); - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); - } - this.trackHeader(buf.length); - } - onHeaderValue(buf) { - let len = this.headers.length; - if ((len & 1) === 1) { - this.headers.push(buf); - len += 1; - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); - } - const key = this.headers[len - 2]; - if (key.length === 10 && key.toString().toLowerCase() === "keep-alive") { - this.keepAlive += buf.toString(); - } else if (key.length === 10 && key.toString().toLowerCase() === "connection") { - this.connection += buf.toString(); - } else if (key.length === 14 && key.toString().toLowerCase() === "content-length") { - this.contentLength += buf.toString(); - } - this.trackHeader(buf.length); - } - trackHeader(len) { - this.headersSize += len; - if (this.headersSize >= this.headersMaxSize) { - util.destroy(this.socket, new HeadersOverflowError); - } - } - onUpgrade(head) { - const { upgrade, client, socket, headers, statusCode } = this; - assert(upgrade); - const request = client[kQueue][client[kRunningIdx]]; - assert(request); - assert(!socket.destroyed); - assert(socket === client[kSocket]); - assert(!this.paused); - assert(request.upgrade || request.method === "CONNECT"); - this.statusCode = null; - this.statusText = ""; - this.shouldKeepAlive = null; - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - socket.unshift(head); - socket[kParser].destroy(); - socket[kParser] = null; - socket[kClient] = null; - socket[kError] = null; - socket.removeListener("error", onSocketError).removeListener("readable", onSocketReadable).removeListener("end", onSocketEnd).removeListener("close", onSocketClose); - client[kSocket] = null; - client[kQueue][client[kRunningIdx]++] = null; - client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade")); - try { - request.onUpgrade(statusCode, headers, socket); - } catch (err) { - util.destroy(socket, err); - } - resume(client); - } - onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { - const { client, socket, headers, statusText } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1; - } - assert(!this.upgrade); - assert(this.statusCode < 200); - if (statusCode === 100) { - util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket))); - return -1; - } - if (upgrade && !request.upgrade) { - util.destroy(socket, new SocketError("bad upgrade", util.getSocketInfo(socket))); - return -1; - } - assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS); - this.statusCode = statusCode; - this.shouldKeepAlive = shouldKeepAlive || request.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; - if (this.statusCode >= 200) { - const bodyTimeout = request.bodyTimeout != null ? request.bodyTimeout : client[kBodyTimeout]; - this.setTimeout(bodyTimeout, TIMEOUT_BODY); - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - if (request.method === "CONNECT") { - assert(client[kRunning] === 1); - this.upgrade = true; - return 2; - } - if (upgrade) { - assert(client[kRunning] === 1); - this.upgrade = true; - return 2; - } - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - if (this.shouldKeepAlive && client[kPipelining]) { - const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; - if (keepAliveTimeout != null) { - const timeout = Math.min(keepAliveTimeout - client[kKeepAliveTimeoutThreshold], client[kKeepAliveMaxTimeout]); - if (timeout <= 0) { - socket[kReset] = true; - } else { - client[kKeepAliveTimeoutValue] = timeout; - } - } else { - client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; - } - } else { - socket[kReset] = true; - } - const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; - if (request.aborted) { - return -1; - } - if (request.method === "HEAD") { - return 1; - } - if (statusCode < 200) { - return 1; - } - if (socket[kBlocking]) { - socket[kBlocking] = false; - resume(client); - } - return pause ? constants.ERROR.PAUSED : 0; - } - onBody(buf) { - const { client, socket, statusCode, maxResponseSize } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - assert(request); - assert.strictEqual(this.timeoutType, TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - assert(statusCode >= 200); - if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { - util.destroy(socket, new ResponseExceededMaxSizeError); - return -1; - } - this.bytesRead += buf.length; - if (request.onData(buf) === false) { - return constants.ERROR.PAUSED; - } - } - onMessageComplete() { - const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; - if (socket.destroyed && (!statusCode || shouldKeepAlive)) { - return -1; - } - if (upgrade) { - return; - } - const request = client[kQueue][client[kRunningIdx]]; - assert(request); - assert(statusCode >= 100); - this.statusCode = null; - this.statusText = ""; - this.bytesRead = 0; - this.contentLength = ""; - this.keepAlive = ""; - this.connection = ""; - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - if (statusCode < 200) { - return; - } - if (request.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { - util.destroy(socket, new ResponseContentLengthMismatchError); - return -1; - } - request.onComplete(headers); - client[kQueue][client[kRunningIdx]++] = null; - if (socket[kWriting]) { - assert.strictEqual(client[kRunning], 0); - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (!shouldKeepAlive) { - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (socket[kReset] && client[kRunning] === 0) { - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (client[kPipelining] === 1) { - setImmediate(resume, client); - } else { - resume(client); - } - } - } - function onParserTimeout(parser) { - const { socket, timeoutType, client } = parser; - if (timeoutType === TIMEOUT_HEADERS) { - if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { - assert(!parser.paused, "cannot be paused while waiting for headers"); - util.destroy(socket, new HeadersTimeoutError); - } - } else if (timeoutType === TIMEOUT_BODY) { - if (!parser.paused) { - util.destroy(socket, new BodyTimeoutError); - } - } else if (timeoutType === TIMEOUT_IDLE) { - assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); - util.destroy(socket, new InformationalError("socket idle timeout")); - } - } - function onSocketReadable() { - const { [kParser]: parser } = this; - if (parser) { - parser.readMore(); - } - } - function onSocketError(err) { - const { [kClient]: client, [kParser]: parser } = this; - assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - if (client[kHTTPConnVersion] !== "h2") { - if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; - } - } - this[kError] = err; - onError(this[kClient], err); - } - function onError(client, err) { - if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { - assert(client[kPendingIdx] === client[kRunningIdx]); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0;i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); - } - assert(client[kSize] === 0); - } - } - function onSocketEnd() { - const { [kParser]: parser, [kClient]: client } = this; - if (client[kHTTPConnVersion] !== "h2") { - if (parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; - } - } - util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); - } - function onSocketClose() { - const { [kClient]: client, [kParser]: parser } = this; - if (client[kHTTPConnVersion] === "h1" && parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - } - this[kParser].destroy(); - this[kParser] = null; - } - const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); - client[kSocket] = null; - if (client.destroyed) { - assert(client[kPending] === 0); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0;i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); - } - } else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") { - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - errorRequest(client, request, err); - } - client[kPendingIdx] = client[kRunningIdx]; - assert(client[kRunning] === 0); - client.emit("disconnect", client[kUrl], [client], err); - resume(client); - } - async function connect(client) { - assert(!client[kConnecting]); - assert(!client[kSocket]); - let { host, hostname, protocol, port } = client[kUrl]; - if (hostname[0] === "[") { - const idx = hostname.indexOf("]"); - assert(idx !== -1); - const ip = hostname.substring(1, idx); - assert(net.isIP(ip)); - hostname = ip; - } - client[kConnecting] = true; - if (channels.beforeConnect.hasSubscribers) { - channels.beforeConnect.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector] - }); - } - try { - const socket = await new Promise((resolve, reject) => { - client[kConnector]({ - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, (err, socket2) => { - if (err) { - reject(err); - } else { - resolve(socket2); - } - }); - }); - if (client.destroyed) { - util.destroy(socket.on("error", () => { - }), new ClientDestroyedError); - return; - } - client[kConnecting] = false; - assert(socket); - const isH2 = socket.alpnProtocol === "h2"; - if (isH2) { - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true; - process.emitWarning("H2 support is experimental, expect them to change at any time.", { - code: "UNDICI-H2" - }); - } - const session = http2.connect(client[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams - }); - client[kHTTPConnVersion] = "h2"; - session[kClient] = client; - session[kSocket] = socket; - session.on("error", onHttp2SessionError); - session.on("frameError", onHttp2FrameError); - session.on("end", onHttp2SessionEnd); - session.on("goaway", onHTTP2GoAway); - session.on("close", onSocketClose); - session.unref(); - client[kHTTP2Session] = session; - socket[kHTTP2Session] = session; - } else { - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise; - llhttpPromise = null; - } - socket[kNoRef] = false; - socket[kWriting] = false; - socket[kReset] = false; - socket[kBlocking] = false; - socket[kParser] = new Parser(client, socket, llhttpInstance); - } - socket[kCounter] = 0; - socket[kMaxRequests] = client[kMaxRequests]; - socket[kClient] = client; - socket[kError] = null; - socket.on("error", onSocketError).on("readable", onSocketReadable).on("end", onSocketEnd).on("close", onSocketClose); - client[kSocket] = socket; - if (channels.connected.hasSubscribers) { - channels.connected.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - socket - }); - } - client.emit("connect", client[kUrl], [client]); - } catch (err) { - if (client.destroyed) { - return; - } - client[kConnecting] = false; - if (channels.connectError.hasSubscribers) { - channels.connectError.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - error: err - }); - } - if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { - assert(client[kRunning] === 0); - while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { - const request = client[kQueue][client[kPendingIdx]++]; - errorRequest(client, request, err); - } - } else { - onError(client, err); - } - client.emit("connectionError", client[kUrl], [client], err); - } - resume(client); - } - function emitDrain(client) { - client[kNeedDrain] = 0; - client.emit("drain", client[kUrl], [client]); - } - function resume(client, sync) { - if (client[kResuming] === 2) { - return; - } - client[kResuming] = 2; - _resume(client, sync); - client[kResuming] = 0; - if (client[kRunningIdx] > 256) { - client[kQueue].splice(0, client[kRunningIdx]); - client[kPendingIdx] -= client[kRunningIdx]; - client[kRunningIdx] = 0; - } - } - function _resume(client, sync) { - while (true) { - if (client.destroyed) { - assert(client[kPending] === 0); - return; - } - if (client[kClosedResolve] && !client[kSize]) { - client[kClosedResolve](); - client[kClosedResolve] = null; - return; - } - const socket = client[kSocket]; - if (socket && !socket.destroyed && socket.alpnProtocol !== "h2") { - if (client[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref(); - socket[kNoRef] = true; - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref(); - socket[kNoRef] = false; - } - if (client[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { - socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE); - } - } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request2 = client[kQueue][client[kRunningIdx]]; - const headersTimeout = request2.headersTimeout != null ? request2.headersTimeout : client[kHeadersTimeout]; - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); - } - } - } - if (client[kBusy]) { - client[kNeedDrain] = 2; - } else if (client[kNeedDrain] === 2) { - if (sync) { - client[kNeedDrain] = 1; - process.nextTick(emitDrain, client); - } else { - emitDrain(client); - } - continue; - } - if (client[kPending] === 0) { - return; - } - if (client[kRunning] >= (client[kPipelining] || 1)) { - return; - } - const request = client[kQueue][client[kPendingIdx]]; - if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) { - if (client[kRunning] > 0) { - return; - } - client[kServerName] = request.servername; - if (socket && socket.servername !== request.servername) { - util.destroy(socket, new InformationalError("servername changed")); - return; - } - } - if (client[kConnecting]) { - return; - } - if (!socket && !client[kHTTP2Session]) { - connect(client); - return; - } - if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { - return; - } - if (client[kRunning] > 0 && !request.idempotent) { - return; - } - if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) { - return; - } - if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body))) { - return; - } - if (!request.aborted && write(client, request)) { - client[kPendingIdx]++; - } else { - client[kQueue].splice(client[kPendingIdx], 1); - } - } - } - function shouldSendContentLength(method) { - return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; - } - function write(client, request) { - if (client[kHTTPConnVersion] === "h2") { - writeH2(client, client[kHTTP2Session], request); - return; - } - const { body, method, path, host, upgrade, headers, blocking, reset } = request; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; - if (body && typeof body.read === "function") { - body.read(0); - } - const bodyLength = util.bodyLength(body); - let contentLength = bodyLength; - if (contentLength === null) { - contentLength = request.contentLength; - } - if (contentLength === 0 && !expectsPayload) { - contentLength = null; - } - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError); - return false; - } - process.emitWarning(new RequestContentLengthMismatchError); - } - const socket = client[kSocket]; - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return; - } - errorRequest(client, request, err || new RequestAbortedError); - util.destroy(socket, new InformationalError("aborted")); - }); - } catch (err) { - errorRequest(client, request, err); - } - if (request.aborted) { - return false; - } - if (method === "HEAD") { - socket[kReset] = true; - } - if (upgrade || method === "CONNECT") { - socket[kReset] = true; - } - if (reset != null) { - socket[kReset] = reset; - } - if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { - socket[kReset] = true; - } - if (blocking) { - socket[kBlocking] = true; - } - let header = `${method} ${path} HTTP/1.1\r\n`; - if (typeof host === "string") { - header += `host: ${host}\r\n`; - } else { - header += client[kHostHeader]; - } - if (upgrade) { - header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n`; - } else if (client[kPipelining] && !socket[kReset]) { - header += "connection: keep-alive\r\n"; - } else { - header += "connection: close\r\n"; - } - if (headers) { - header += headers; - } - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request, headers: header, socket }); - } - if (!body || bodyLength === 0) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r\n\r\n`, "latin1"); - } else { - assert(contentLength === null, "no body must not have content length"); - socket.write(`${header}\r\n`, "latin1"); - } - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, "buffer body must have content length"); - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, "latin1"); - socket.write(body); - socket.uncork(); - request.onBodySent(body); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - } else if (util.isBlobLike(body)) { - if (typeof body.stream === "function") { - writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }); - } else { - writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }); - } - } else if (util.isStream(body)) { - writeStream({ body, client, request, socket, contentLength, header, expectsPayload }); - } else if (util.isIterable(body)) { - writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }); - } else { - assert(false); - } - return true; - } - function writeH2(client, session, request) { - const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; - let headers; - if (typeof reqHeaders === "string") - headers = Request[kHTTP2CopyHeaders](reqHeaders.trim()); - else - headers = reqHeaders; - if (upgrade) { - errorRequest(client, request, new Error("Upgrade not supported for H2")); - return false; - } - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return; - } - errorRequest(client, request, err || new RequestAbortedError); - }); - } catch (err) { - errorRequest(client, request, err); - } - if (request.aborted) { - return false; - } - let stream; - const h2State = client[kHTTP2SessionState]; - headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost]; - headers[HTTP2_HEADER_METHOD] = method; - if (method === "CONNECT") { - session.ref(); - stream = session.request(headers, { endStream: false, signal }); - if (stream.id && !stream.pending) { - request.onUpgrade(null, null, stream); - ++h2State.openStreams; - } else { - stream.once("ready", () => { - request.onUpgrade(null, null, stream); - ++h2State.openStreams; - }); - } - stream.once("close", () => { - h2State.openStreams -= 1; - if (h2State.openStreams === 0) - session.unref(); - }); - return true; - } - headers[HTTP2_HEADER_PATH] = path; - headers[HTTP2_HEADER_SCHEME] = "https"; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; - if (body && typeof body.read === "function") { - body.read(0); - } - let contentLength = util.bodyLength(body); - if (contentLength == null) { - contentLength = request.contentLength; - } - if (contentLength === 0 || !expectsPayload) { - contentLength = null; - } - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError); - return false; - } - process.emitWarning(new RequestContentLengthMismatchError); - } - if (contentLength != null) { - assert(body, "no body must not have content length"); - headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; - } - session.ref(); - const shouldEndStream = method === "GET" || method === "HEAD"; - if (expectContinue) { - headers[HTTP2_HEADER_EXPECT] = "100-continue"; - stream = session.request(headers, { endStream: shouldEndStream, signal }); - stream.once("continue", writeBodyH2); - } else { - stream = session.request(headers, { - endStream: shouldEndStream, - signal - }); - writeBodyH2(); - } - ++h2State.openStreams; - stream.once("response", (headers2) => { - const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; - if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), "") === false) { - stream.pause(); - } - }); - stream.once("end", () => { - request.onComplete([]); - }); - stream.on("data", (chunk) => { - if (request.onData(chunk) === false) { - stream.pause(); - } - }); - stream.once("close", () => { - h2State.openStreams -= 1; - if (h2State.openStreams === 0) { - session.unref(); - } - }); - stream.once("error", function(err) { - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); - } - }); - stream.once("frameError", (type, code) => { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); - errorRequest(client, request, err); - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1; - util.destroy(stream, err); - } - }); - return true; - function writeBodyH2() { - if (!body) { - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, "buffer body must have content length"); - stream.cork(); - stream.write(body); - stream.uncork(); - stream.end(); - request.onBodySent(body); - request.onRequestSent(); - } else if (util.isBlobLike(body)) { - if (typeof body.stream === "function") { - writeIterable({ - client, - request, - contentLength, - h2stream: stream, - expectsPayload, - body: body.stream(), - socket: client[kSocket], - header: "" - }); - } else { - writeBlob({ - body, - client, - request, - contentLength, - expectsPayload, - h2stream: stream, - header: "", - socket: client[kSocket] - }); - } - } else if (util.isStream(body)) { - writeStream({ - body, - client, - request, - contentLength, - expectsPayload, - socket: client[kSocket], - h2stream: stream, - header: "" - }); - } else if (util.isIterable(body)) { - writeIterable({ - body, - client, - request, - contentLength, - expectsPayload, - header: "", - h2stream: stream, - socket: client[kSocket] - }); - } else { - assert(false); - } - } - } - function writeStream({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); - if (client[kHTTPConnVersion] === "h2") { - let onPipeData = function(chunk) { - request.onBodySent(chunk); - }; - const pipe = pipeline(body, h2stream, (err) => { - if (err) { - util.destroy(body, err); - util.destroy(h2stream, err); - } else { - request.onRequestSent(); - } - }); - pipe.on("data", onPipeData); - pipe.once("end", () => { - pipe.removeListener("data", onPipeData); - util.destroy(pipe); - }); - return; - } - let finished = false; - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); - const onData = function(chunk) { - if (finished) { - return; - } - try { - if (!writer.write(chunk) && this.pause) { - this.pause(); - } - } catch (err) { - util.destroy(this, err); - } - }; - const onDrain = function() { - if (finished) { - return; - } - if (body.resume) { - body.resume(); - } - }; - const onAbort = function() { - if (finished) { - return; - } - const err = new RequestAbortedError; - queueMicrotask(() => onFinished(err)); - }; - const onFinished = function(err) { - if (finished) { - return; - } - finished = true; - assert(socket.destroyed || socket[kWriting] && client[kRunning] <= 1); - socket.off("drain", onDrain).off("error", onFinished); - body.removeListener("data", onData).removeListener("end", onFinished).removeListener("error", onFinished).removeListener("close", onAbort); - if (!err) { - try { - writer.end(); - } catch (er) { - err = er; - } - } - writer.destroy(err); - if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { - util.destroy(body, err); - } else { - util.destroy(body); - } - }; - body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onAbort); - if (body.resume) { - body.resume(); - } - socket.on("drain", onDrain).on("error", onFinished); - } - async function writeBlob({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength === body.size, "blob body must have content length"); - const isH2 = client[kHTTPConnVersion] === "h2"; - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError; - } - const buffer = Buffer.from(await body.arrayBuffer()); - if (isH2) { - h2stream.cork(); - h2stream.write(buffer); - h2stream.uncork(); - } else { - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, "latin1"); - socket.write(buffer); - socket.uncork(); - } - request.onBodySent(buffer); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - resume(client); - } catch (err) { - util.destroy(isH2 ? h2stream : socket, err); - } - } - async function writeIterable({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); - let callback = null; - function onDrain() { - if (callback) { - const cb = callback; - callback = null; - cb(); - } - } - const waitForDrain = () => new Promise((resolve, reject) => { - assert(callback === null); - if (socket[kError]) { - reject(socket[kError]); - } else { - callback = resolve; - } - }); - if (client[kHTTPConnVersion] === "h2") { - h2stream.on("close", onDrain).on("drain", onDrain); - try { - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError]; - } - const res = h2stream.write(chunk); - request.onBodySent(chunk); - if (!res) { - await waitForDrain(); - } - } - } catch (err) { - h2stream.destroy(err); - } finally { - request.onRequestSent(); - h2stream.end(); - h2stream.off("close", onDrain).off("drain", onDrain); - } - return; - } - socket.on("close", onDrain).on("drain", onDrain); - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); - try { - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError]; - } - if (!writer.write(chunk)) { - await waitForDrain(); - } - } - writer.end(); - } catch (err) { - writer.destroy(err); - } finally { - socket.off("close", onDrain).off("drain", onDrain); - } - } - - class AsyncWriter { - constructor({ socket, request, contentLength, client, expectsPayload, header }) { - this.socket = socket; - this.request = request; - this.contentLength = contentLength; - this.client = client; - this.bytesWritten = 0; - this.expectsPayload = expectsPayload; - this.header = header; - socket[kWriting] = true; - } - write(chunk) { - const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; - if (socket[kError]) { - throw socket[kError]; - } - if (socket.destroyed) { - return false; - } - const len = Buffer.byteLength(chunk); - if (!len) { - return true; - } - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError; - } - process.emitWarning(new RequestContentLengthMismatchError); - } - socket.cork(); - if (bytesWritten === 0) { - if (!expectsPayload) { - socket[kReset] = true; - } - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r\n`, "latin1"); - } else { - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, "latin1"); - } - } - if (contentLength === null) { - socket.write(`\r\n${len.toString(16)}\r\n`, "latin1"); - } - this.bytesWritten += len; - const ret = socket.write(chunk); - socket.uncork(); - request.onBodySent(chunk); - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } - } - } - return ret; - } - end() { - const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; - request.onRequestSent(); - socket[kWriting] = false; - if (socket[kError]) { - throw socket[kError]; - } - if (socket.destroyed) { - return; - } - if (bytesWritten === 0) { - if (expectsPayload) { - socket.write(`${header}content-length: 0\r\n\r\n`, "latin1"); - } else { - socket.write(`${header}\r\n`, "latin1"); - } - } else if (contentLength === null) { - socket.write("\r\n0\r\n\r\n", "latin1"); - } - if (contentLength !== null && bytesWritten !== contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError; - } else { - process.emitWarning(new RequestContentLengthMismatchError); - } - } - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } - } - resume(client); - } - destroy(err) { - const { socket, client } = this; - socket[kWriting] = false; - if (err) { - assert(client[kRunning] <= 1, "pipeline should only contain this request"); - util.destroy(socket, err); - } - } - } - function errorRequest(client, request, err) { - try { - request.onError(err); - assert(request.aborted); - } catch (err2) { - client.emit("error", err2); - } - } - module.exports = Client; -}); - -// ../node_modules/undici/lib/node/fixed-queue.js -var require_fixed_queue = __commonJS((exports, module) => { - var kSize = 2048; - var kMask = kSize - 1; - - class FixedCircularBuffer { - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; - } - isEmpty() { - return this.top === this.bottom; - } - isFull() { - return (this.top + 1 & kMask) === this.bottom; - } - push(data) { - this.list[this.top] = data; - this.top = this.top + 1 & kMask; - } - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === undefined) - return null; - this.list[this.bottom] = undefined; - this.bottom = this.bottom + 1 & kMask; - return nextItem; - } - } - module.exports = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer; - } - isEmpty() { - return this.head.isEmpty(); - } - push(data) { - if (this.head.isFull()) { - this.head = this.head.next = new FixedCircularBuffer; - } - this.head.push(data); - } - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - this.tail = tail.next; - } - return next; - } - }; -}); - -// ../node_modules/undici/lib/pool-stats.js -var require_pool_stats = __commonJS((exports, module) => { - var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); - var kPool = Symbol("pool"); - - class PoolStats { - constructor(pool) { - this[kPool] = pool; - } - get connected() { - return this[kPool][kConnected]; - } - get free() { - return this[kPool][kFree]; - } - get pending() { - return this[kPool][kPending]; - } - get queued() { - return this[kPool][kQueued]; - } - get running() { - return this[kPool][kRunning]; - } - get size() { - return this[kPool][kSize]; - } - } - module.exports = PoolStats; -}); - -// ../node_modules/undici/lib/pool-base.js -var require_pool_base = __commonJS((exports, module) => { - var DispatcherBase = require_dispatcher_base(); - var FixedQueue = require_fixed_queue(); - var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); - var PoolStats = require_pool_stats(); - var kClients = Symbol("clients"); - var kNeedDrain = Symbol("needDrain"); - var kQueue = Symbol("queue"); - var kClosedResolve = Symbol("closed resolve"); - var kOnDrain = Symbol("onDrain"); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kGetDispatcher = Symbol("get dispatcher"); - var kAddClient = Symbol("add client"); - var kRemoveClient = Symbol("remove client"); - var kStats = Symbol("stats"); - - class PoolBase extends DispatcherBase { - constructor() { - super(); - this[kQueue] = new FixedQueue; - this[kClients] = []; - this[kQueued] = 0; - const pool = this; - this[kOnDrain] = function onDrain(origin, targets) { - const queue = pool[kQueue]; - let needDrain = false; - while (!needDrain) { - const item = queue.shift(); - if (!item) { - break; - } - pool[kQueued]--; - needDrain = !this.dispatch(item.opts, item.handler); - } - this[kNeedDrain] = needDrain; - if (!this[kNeedDrain] && pool[kNeedDrain]) { - pool[kNeedDrain] = false; - pool.emit("drain", origin, [pool, ...targets]); - } - if (pool[kClosedResolve] && queue.isEmpty()) { - Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]); - } - }; - this[kOnConnect] = (origin, targets) => { - pool.emit("connect", origin, [pool, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - pool.emit("disconnect", origin, [pool, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - pool.emit("connectionError", origin, [pool, ...targets], err); - }; - this[kStats] = new PoolStats(this); - } - get [kBusy]() { - return this[kNeedDrain]; - } - get [kConnected]() { - return this[kClients].filter((client) => client[kConnected]).length; - } - get [kFree]() { - return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length; - } - get [kPending]() { - let ret = this[kQueued]; - for (const { [kPending]: pending } of this[kClients]) { - ret += pending; - } - return ret; - } - get [kRunning]() { - let ret = 0; - for (const { [kRunning]: running } of this[kClients]) { - ret += running; - } - return ret; - } - get [kSize]() { - let ret = this[kQueued]; - for (const { [kSize]: size } of this[kClients]) { - ret += size; - } - return ret; - } - get stats() { - return this[kStats]; - } - async[kClose]() { - if (this[kQueue].isEmpty()) { - return Promise.all(this[kClients].map((c) => c.close())); - } else { - return new Promise((resolve) => { - this[kClosedResolve] = resolve; - }); - } - } - async[kDestroy](err) { - while (true) { - const item = this[kQueue].shift(); - if (!item) { - break; - } - item.handler.onError(err); - } - return Promise.all(this[kClients].map((c) => c.destroy(err))); - } - [kDispatch](opts, handler) { - const dispatcher = this[kGetDispatcher](); - if (!dispatcher) { - this[kNeedDrain] = true; - this[kQueue].push({ opts, handler }); - this[kQueued]++; - } else if (!dispatcher.dispatch(opts, handler)) { - dispatcher[kNeedDrain] = true; - this[kNeedDrain] = !this[kGetDispatcher](); - } - return !this[kNeedDrain]; - } - [kAddClient](client) { - client.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].push(client); - if (this[kNeedDrain]) { - process.nextTick(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client[kUrl], [this, client]); - } - }); - } - return this; - } - [kRemoveClient](client) { - client.close(() => { - const idx = this[kClients].indexOf(client); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - }); - this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); - } - } - module.exports = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - }; -}); - -// ../node_modules/undici/lib/pool.js -var require_pool = __commonJS((exports, module) => { - var { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kGetDispatcher - } = require_pool_base(); - var Client = require_client(); - var { - InvalidArgumentError - } = require_errors(); - var util = require_util(); - var { kUrl, kInterceptors } = require_symbols(); - var buildConnector = require_connect(); - var kOptions = Symbol("options"); - var kConnections = Symbol("connections"); - var kFactory = Symbol("factory"); - function defaultFactory(origin, opts) { - return new Client(origin, opts); - } - - class Pool extends PoolBase { - constructor(origin, { - connections, - factory = defaultFactory, - connect, - connectTimeout, - tls, - maxCachedSessions, - socketPath, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - allowH2, - ...options - } = {}) { - super(); - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { - throw new InvalidArgumentError("invalid connections"); - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - if (connect != null && typeof connect !== "function" && typeof connect !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (typeof connect !== "function") { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined, - ...connect - }); - } - this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool) ? options.interceptors.Pool : []; - this[kConnections] = connections || null; - this[kUrl] = util.parseOrigin(origin); - this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; - this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : undefined; - this[kFactory] = factory; - } - [kGetDispatcher]() { - let dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain]); - if (dispatcher) { - return dispatcher; - } - if (!this[kConnections] || this[kClients].length < this[kConnections]) { - dispatcher = this[kFactory](this[kUrl], this[kOptions]); - this[kAddClient](dispatcher); - } - return dispatcher; - } - } - module.exports = Pool; -}); - -// ../node_modules/undici/lib/balanced-pool.js -var require_balanced_pool = __commonJS((exports, module) => { - var { - BalancedPoolMissingUpstreamError, - InvalidArgumentError - } = require_errors(); - var { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - } = require_pool_base(); - var Pool = require_pool(); - var { kUrl, kInterceptors } = require_symbols(); - var { parseOrigin } = require_util(); - var kFactory = Symbol("factory"); - var kOptions = Symbol("options"); - var kGreatestCommonDivisor = Symbol("kGreatestCommonDivisor"); - var kCurrentWeight = Symbol("kCurrentWeight"); - var kIndex = Symbol("kIndex"); - var kWeight = Symbol("kWeight"); - var kMaxWeightPerServer = Symbol("kMaxWeightPerServer"); - var kErrorPenalty = Symbol("kErrorPenalty"); - function getGreatestCommonDivisor(a, b) { - if (b === 0) - return a; - return getGreatestCommonDivisor(b, a % b); - } - function defaultFactory(origin, opts) { - return new Pool(origin, opts); - } - - class BalancedPool extends PoolBase { - constructor(upstreams = [], { factory = defaultFactory, ...opts } = {}) { - super(); - this[kOptions] = opts; - this[kIndex] = -1; - this[kCurrentWeight] = 0; - this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; - this[kErrorPenalty] = this[kOptions].errorPenalty || 15; - if (!Array.isArray(upstreams)) { - upstreams = [upstreams]; - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) ? opts.interceptors.BalancedPool : []; - this[kFactory] = factory; - for (const upstream of upstreams) { - this.addUpstream(upstream); - } - this._updateBalancedPoolStats(); - } - addUpstream(upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; - if (this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true)) { - return this; - } - const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); - this[kAddClient](pool); - pool.on("connect", () => { - pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); - }); - pool.on("connectionError", () => { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); - }); - pool.on("disconnect", (...args) => { - const err = args[2]; - if (err && err.code === "UND_ERR_SOCKET") { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); - } - }); - for (const client of this[kClients]) { - client[kWeight] = this[kMaxWeightPerServer]; - } - this._updateBalancedPoolStats(); - return this; - } - _updateBalancedPoolStats() { - this[kGreatestCommonDivisor] = this[kClients].map((p) => p[kWeight]).reduce(getGreatestCommonDivisor, 0); - } - removeUpstream(upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; - const pool = this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true); - if (pool) { - this[kRemoveClient](pool); - } - return this; - } - get upstreams() { - return this[kClients].filter((dispatcher) => dispatcher.closed !== true && dispatcher.destroyed !== true).map((p) => p[kUrl].origin); - } - [kGetDispatcher]() { - if (this[kClients].length === 0) { - throw new BalancedPoolMissingUpstreamError; - } - const dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain] && dispatcher2.closed !== true && dispatcher2.destroyed !== true); - if (!dispatcher) { - return; - } - const allClientsBusy = this[kClients].map((pool) => pool[kNeedDrain]).reduce((a, b) => a && b, true); - if (allClientsBusy) { - return; - } - let counter = 0; - let maxWeightIndex = this[kClients].findIndex((pool) => !pool[kNeedDrain]); - while (counter++ < this[kClients].length) { - this[kIndex] = (this[kIndex] + 1) % this[kClients].length; - const pool = this[kClients][this[kIndex]]; - if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { - maxWeightIndex = this[kIndex]; - } - if (this[kIndex] === 0) { - this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; - if (this[kCurrentWeight] <= 0) { - this[kCurrentWeight] = this[kMaxWeightPerServer]; - } - } - if (pool[kWeight] >= this[kCurrentWeight] && !pool[kNeedDrain]) { - return pool; - } - } - this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; - this[kIndex] = maxWeightIndex; - return this[kClients][maxWeightIndex]; - } - } - module.exports = BalancedPool; -}); - -// ../node_modules/undici/lib/compat/dispatcher-weakref.js -var require_dispatcher_weakref = __commonJS((exports, module) => { - var { kConnected, kSize } = require_symbols(); - - class CompatWeakRef { - constructor(value) { - this.value = value; - } - deref() { - return this.value[kConnected] === 0 && this.value[kSize] === 0 ? undefined : this.value; - } - } - - class CompatFinalizer { - constructor(finalizer) { - this.finalizer = finalizer; - } - register(dispatcher, key) { - if (dispatcher.on) { - dispatcher.on("disconnect", () => { - if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { - this.finalizer(key); - } - }); - } - } - } - module.exports = function() { - if (process.env.NODE_V8_COVERAGE) { - return { - WeakRef: CompatWeakRef, - FinalizationRegistry: CompatFinalizer - }; - } - return { - WeakRef: global.WeakRef || CompatWeakRef, - FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer - }; - }; -}); - -// ../node_modules/undici/lib/agent.js -var require_agent = __commonJS((exports, module) => { - var { InvalidArgumentError } = require_errors(); - var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); - var DispatcherBase = require_dispatcher_base(); - var Pool = require_pool(); - var Client = require_client(); - var util = require_util(); - var createRedirectInterceptor = require_redirectInterceptor(); - var { WeakRef: WeakRef2, FinalizationRegistry } = require_dispatcher_weakref()(); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kMaxRedirections = Symbol("maxRedirections"); - var kOnDrain = Symbol("onDrain"); - var kFactory = Symbol("factory"); - var kFinalizer = Symbol("finalizer"); - var kOptions = Symbol("options"); - function defaultFactory(origin, opts) { - return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); - } - - class Agent extends DispatcherBase { - constructor({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { - super(); - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - if (connect != null && typeof connect !== "function" && typeof connect !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } - if (connect && typeof connect !== "function") { - connect = { ...connect }; - } - this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })]; - this[kOptions] = { ...util.deepClone(options), connect }; - this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : undefined; - this[kMaxRedirections] = maxRedirections; - this[kFactory] = factory; - this[kClients] = new Map; - this[kFinalizer] = new FinalizationRegistry((key) => { - const ref = this[kClients].get(key); - if (ref !== undefined && ref.deref() === undefined) { - this[kClients].delete(key); - } - }); - const agent = this; - this[kOnDrain] = (origin, targets) => { - agent.emit("drain", origin, [agent, ...targets]); - }; - this[kOnConnect] = (origin, targets) => { - agent.emit("connect", origin, [agent, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - agent.emit("disconnect", origin, [agent, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - agent.emit("connectionError", origin, [agent, ...targets], err); - }; - } - get [kRunning]() { - let ret = 0; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - if (client) { - ret += client[kRunning]; - } - } - return ret; - } - [kDispatch](opts, handler) { - let key; - if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { - key = String(opts.origin); - } else { - throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); - } - const ref = this[kClients].get(key); - let dispatcher = ref ? ref.deref() : null; - if (!dispatcher) { - dispatcher = this[kFactory](opts.origin, this[kOptions]).on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].set(key, new WeakRef2(dispatcher)); - this[kFinalizer].register(dispatcher, key); - } - return dispatcher.dispatch(opts, handler); - } - async[kClose]() { - const closePromises = []; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - if (client) { - closePromises.push(client.close()); - } - } - await Promise.all(closePromises); - } - async[kDestroy](err) { - const destroyPromises = []; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - if (client) { - destroyPromises.push(client.destroy(err)); - } - } - await Promise.all(destroyPromises); - } - } - module.exports = Agent; -}); - -// ../node_modules/undici/lib/api/readable.js -var require_readable = __commonJS((exports, module) => { - var assert = __require("assert"); - var { Readable } = __require("stream"); - var { RequestAbortedError, NotSupportedError, InvalidArgumentError } = require_errors(); - var util = require_util(); - var { ReadableStreamFrom, toUSVString } = require_util(); - var Blob2; - var kConsume = Symbol("kConsume"); - var kReading = Symbol("kReading"); - var kBody = Symbol("kBody"); - var kAbort = Symbol("abort"); - var kContentType = Symbol("kContentType"); - var noop = () => { - }; - module.exports = class BodyReadable extends Readable { - constructor({ - resume, - abort, - contentType = "", - highWaterMark = 64 * 1024 - }) { - super({ - autoDestroy: true, - read: resume, - highWaterMark - }); - this._readableState.dataEmitted = false; - this[kAbort] = abort; - this[kConsume] = null; - this[kBody] = null; - this[kContentType] = contentType; - this[kReading] = false; - } - destroy(err) { - if (this.destroyed) { - return this; - } - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError; - } - if (err) { - this[kAbort](); - } - return super.destroy(err); - } - emit(ev, ...args) { - if (ev === "data") { - this._readableState.dataEmitted = true; - } else if (ev === "error") { - this._readableState.errorEmitted = true; - } - return super.emit(ev, ...args); - } - on(ev, ...args) { - if (ev === "data" || ev === "readable") { - this[kReading] = true; - } - return super.on(ev, ...args); - } - addListener(ev, ...args) { - return this.on(ev, ...args); - } - off(ev, ...args) { - const ret = super.off(ev, ...args); - if (ev === "data" || ev === "readable") { - this[kReading] = this.listenerCount("data") > 0 || this.listenerCount("readable") > 0; - } - return ret; - } - removeListener(ev, ...args) { - return this.off(ev, ...args); - } - push(chunk) { - if (this[kConsume] && chunk !== null && this.readableLength === 0) { - consumePush(this[kConsume], chunk); - return this[kReading] ? super.push(chunk) : true; - } - return super.push(chunk); - } - async text() { - return consume(this, "text"); - } - async json() { - return consume(this, "json"); - } - async blob() { - return consume(this, "blob"); - } - async arrayBuffer() { - return consume(this, "arrayBuffer"); - } - async formData() { - throw new NotSupportedError; - } - get bodyUsed() { - return util.isDisturbed(this); - } - get body() { - if (!this[kBody]) { - this[kBody] = ReadableStreamFrom(this); - if (this[kConsume]) { - this[kBody].getReader(); - assert(this[kBody].locked); - } - } - return this[kBody]; - } - dump(opts) { - let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144; - const signal = opts && opts.signal; - if (signal) { - try { - if (typeof signal !== "object" || !("aborted" in signal)) { - throw new InvalidArgumentError("signal must be an AbortSignal"); - } - util.throwIfAborted(signal); - } catch (err) { - return Promise.reject(err); - } - } - if (this.closed) { - return Promise.resolve(null); - } - return new Promise((resolve, reject) => { - const signalListenerCleanup = signal ? util.addAbortListener(signal, () => { - this.destroy(); - }) : noop; - this.on("close", function() { - signalListenerCleanup(); - if (signal && signal.aborted) { - reject(signal.reason || Object.assign(new Error("The operation was aborted"), { name: "AbortError" })); - } else { - resolve(null); - } - }).on("error", noop).on("data", function(chunk) { - limit -= chunk.length; - if (limit <= 0) { - this.destroy(); - } - }).resume(); - }); - } - }; - function isLocked(self) { - return self[kBody] && self[kBody].locked === true || self[kConsume]; - } - function isUnusable(self) { - return util.isDisturbed(self) || isLocked(self); - } - async function consume(stream, type) { - if (isUnusable(stream)) { - throw new TypeError("unusable"); - } - assert(!stream[kConsume]); - return new Promise((resolve, reject) => { - stream[kConsume] = { - type, - stream, - resolve, - reject, - length: 0, - body: [] - }; - stream.on("error", function(err) { - consumeFinish(this[kConsume], err); - }).on("close", function() { - if (this[kConsume].body !== null) { - consumeFinish(this[kConsume], new RequestAbortedError); - } - }); - process.nextTick(consumeStart, stream[kConsume]); - }); - } - function consumeStart(consume2) { - if (consume2.body === null) { - return; - } - const { _readableState: state } = consume2.stream; - for (const chunk of state.buffer) { - consumePush(consume2, chunk); - } - if (state.endEmitted) { - consumeEnd(this[kConsume]); - } else { - consume2.stream.on("end", function() { - consumeEnd(this[kConsume]); - }); - } - consume2.stream.resume(); - while (consume2.stream.read() != null) { - } - } - function consumeEnd(consume2) { - const { type, body, resolve, stream, length } = consume2; - try { - if (type === "text") { - resolve(toUSVString(Buffer.concat(body))); - } else if (type === "json") { - resolve(JSON.parse(Buffer.concat(body))); - } else if (type === "arrayBuffer") { - const dst = new Uint8Array(length); - let pos = 0; - for (const buf of body) { - dst.set(buf, pos); - pos += buf.byteLength; - } - resolve(dst.buffer); - } else if (type === "blob") { - if (!Blob2) { - Blob2 = __require("buffer").Blob; - } - resolve(new Blob2(body, { type: stream[kContentType] })); - } - consumeFinish(consume2); - } catch (err) { - stream.destroy(err); - } - } - function consumePush(consume2, chunk) { - consume2.length += chunk.length; - consume2.body.push(chunk); - } - function consumeFinish(consume2, err) { - if (consume2.body === null) { - return; - } - if (err) { - consume2.reject(err); - } else { - consume2.resolve(); - } - consume2.type = null; - consume2.stream = null; - consume2.resolve = null; - consume2.reject = null; - consume2.length = 0; - consume2.body = null; - } -}); - -// ../node_modules/undici/lib/api/util.js -var require_util3 = __commonJS((exports, module) => { - var assert = __require("assert"); - var { - ResponseStatusCodeError - } = require_errors(); - var { toUSVString } = require_util(); - async function getResolveErrorBodyCallback({ callback, body, contentType, statusCode, statusMessage, headers }) { - assert(body); - let chunks = []; - let limit = 0; - for await (const chunk of body) { - chunks.push(chunk); - limit += chunk.length; - if (limit > 128 * 1024) { - chunks = null; - break; - } - } - if (statusCode === 204 || !contentType || !chunks) { - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers)); - return; - } - try { - if (contentType.startsWith("application/json")) { - const payload = JSON.parse(toUSVString(Buffer.concat(chunks))); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers, payload)); - return; - } - if (contentType.startsWith("text/")) { - const payload = toUSVString(Buffer.concat(chunks)); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers, payload)); - return; - } - } catch (err) { - } - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers)); - } - module.exports = { getResolveErrorBodyCallback }; -}); - -// ../node_modules/undici/lib/api/abort-signal.js -var require_abort_signal = __commonJS((exports, module) => { - var { addAbortListener } = require_util(); - var { RequestAbortedError } = require_errors(); - var kListener = Symbol("kListener"); - var kSignal = Symbol("kSignal"); - function abort(self) { - if (self.abort) { - self.abort(); - } else { - self.onError(new RequestAbortedError); - } - } - function addSignal(self, signal) { - self[kSignal] = null; - self[kListener] = null; - if (!signal) { - return; - } - if (signal.aborted) { - abort(self); - return; - } - self[kSignal] = signal; - self[kListener] = () => { - abort(self); - }; - addAbortListener(self[kSignal], self[kListener]); - } - function removeSignal(self) { - if (!self[kSignal]) { - return; - } - if ("removeEventListener" in self[kSignal]) { - self[kSignal].removeEventListener("abort", self[kListener]); - } else { - self[kSignal].removeListener("abort", self[kListener]); - } - self[kSignal] = null; - self[kListener] = null; - } - module.exports = { - addSignal, - removeSignal - }; -}); - -// ../node_modules/undici/lib/api/api-request.js -var require_api_request = __commonJS((exports, module) => { - var Readable = require_readable(); - var { - InvalidArgumentError, - RequestAbortedError - } = require_errors(); - var util = require_util(); - var { getResolveErrorBodyCallback } = require_util3(); - var { AsyncResource } = __require("async_hooks"); - var { addSignal, removeSignal } = require_abort_signal(); - - class RequestHandler extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts; - try { - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (highWaterMark && (typeof highWaterMark !== "number" || highWaterMark < 0)) { - throw new InvalidArgumentError("invalid highWaterMark"); - } - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_REQUEST"); - } catch (err) { - if (util.isStream(body)) { - util.destroy(body.on("error", util.nop), err); - } - throw err; - } - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.callback = callback; - this.res = null; - this.abort = null; - this.body = body; - this.trailers = {}; - this.context = null; - this.onInfo = onInfo || null; - this.throwOnError = throwOnError; - this.highWaterMark = highWaterMark; - if (util.isStream(body)) { - body.on("error", (err) => { - this.onError(err); - }); - } - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError; - } - this.abort = abort; - this.context = context; - } - onHeaders(statusCode, rawHeaders, resume, statusMessage) { - const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this; - const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers }); - } - return; - } - const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; - const contentType = parsedHeaders["content-type"]; - const body = new Readable({ resume, abort, contentType, highWaterMark }); - this.callback = null; - this.res = body; - if (callback !== null) { - if (this.throwOnError && statusCode >= 400) { - this.runInAsyncScope(getResolveErrorBodyCallback, null, { callback, body, contentType, statusCode, statusMessage, headers }); - } else { - this.runInAsyncScope(callback, null, null, { - statusCode, - headers, - trailers: this.trailers, - opaque, - body, - context - }); - } - } - } - onData(chunk) { - const { res } = this; - return res.push(chunk); - } - onComplete(trailers) { - const { res } = this; - removeSignal(this); - util.parseHeaders(trailers, this.trailers); - res.push(null); - } - onError(err) { - const { res, callback, body, opaque } = this; - removeSignal(this); - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - if (res) { - this.res = null; - queueMicrotask(() => { - util.destroy(res, err); - }); - } - if (body) { - this.body = null; - util.destroy(body, err); - } - } - } - function request(opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - request.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - this.dispatch(opts, new RequestHandler(opts, callback)); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module.exports = request; - module.exports.RequestHandler = RequestHandler; -}); - -// ../node_modules/undici/lib/api/api-stream.js -var require_api_stream = __commonJS((exports, module) => { - var { finished, PassThrough } = __require("stream"); - var { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = require_errors(); - var util = require_util(); - var { getResolveErrorBodyCallback } = require_util3(); - var { AsyncResource } = __require("async_hooks"); - var { addSignal, removeSignal } = require_abort_signal(); - - class StreamHandler extends AsyncResource { - constructor(opts, factory, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; - try { - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("invalid factory"); - } - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_STREAM"); - } catch (err) { - if (util.isStream(body)) { - util.destroy(body.on("error", util.nop), err); - } - throw err; - } - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.factory = factory; - this.callback = callback; - this.res = null; - this.abort = null; - this.context = null; - this.trailers = null; - this.body = body; - this.onInfo = onInfo || null; - this.throwOnError = throwOnError || false; - if (util.isStream(body)) { - body.on("error", (err) => { - this.onError(err); - }); - } - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError; - } - this.abort = abort; - this.context = context; - } - onHeaders(statusCode, rawHeaders, resume, statusMessage) { - const { factory, opaque, context, callback, responseHeaders } = this; - const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers }); - } - return; - } - this.factory = null; - let res; - if (this.throwOnError && statusCode >= 400) { - const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; - const contentType = parsedHeaders["content-type"]; - res = new PassThrough; - this.callback = null; - this.runInAsyncScope(getResolveErrorBodyCallback, null, { callback, body: res, contentType, statusCode, statusMessage, headers }); - } else { - if (factory === null) { - return; - } - res = this.runInAsyncScope(factory, null, { - statusCode, - headers, - opaque, - context - }); - if (!res || typeof res.write !== "function" || typeof res.end !== "function" || typeof res.on !== "function") { - throw new InvalidReturnValueError("expected Writable"); - } - finished(res, { readable: false }, (err) => { - const { callback: callback2, res: res2, opaque: opaque2, trailers, abort } = this; - this.res = null; - if (err || !res2.readable) { - util.destroy(res2, err); - } - this.callback = null; - this.runInAsyncScope(callback2, null, err || null, { opaque: opaque2, trailers }); - if (err) { - abort(); - } - }); - } - res.on("drain", resume); - this.res = res; - const needDrain = res.writableNeedDrain !== undefined ? res.writableNeedDrain : res._writableState && res._writableState.needDrain; - return needDrain !== true; - } - onData(chunk) { - const { res } = this; - return res ? res.write(chunk) : true; - } - onComplete(trailers) { - const { res } = this; - removeSignal(this); - if (!res) { - return; - } - this.trailers = util.parseHeaders(trailers); - res.end(); - } - onError(err) { - const { res, callback, opaque, body } = this; - removeSignal(this); - this.factory = null; - if (res) { - this.res = null; - util.destroy(res, err); - } else if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - if (body) { - this.body = null; - util.destroy(body, err); - } - } - } - function stream(opts, factory, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - stream.call(this, opts, factory, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - this.dispatch(opts, new StreamHandler(opts, factory, callback)); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module.exports = stream; -}); - -// ../node_modules/undici/lib/api/api-pipeline.js -var require_api_pipeline = __commonJS((exports, module) => { - var { - Readable, - Duplex, - PassThrough - } = __require("stream"); - var { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = require_errors(); - var util = require_util(); - var { AsyncResource } = __require("async_hooks"); - var { addSignal, removeSignal } = require_abort_signal(); - var assert = __require("assert"); - var kResume = Symbol("resume"); - - class PipelineRequest extends Readable { - constructor() { - super({ autoDestroy: true }); - this[kResume] = null; - } - _read() { - const { [kResume]: resume } = this; - if (resume) { - this[kResume] = null; - resume(); - } - } - _destroy(err, callback) { - this._read(); - callback(err); - } - } - - class PipelineResponse extends Readable { - constructor(resume) { - super({ autoDestroy: true }); - this[kResume] = resume; - } - _read() { - this[kResume](); - } - _destroy(err, callback) { - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError; - } - callback(err); - } - } - - class PipelineHandler extends AsyncResource { - constructor(opts, handler) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (typeof handler !== "function") { - throw new InvalidArgumentError("invalid handler"); - } - const { signal, method, opaque, onInfo, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_PIPELINE"); - this.opaque = opaque || null; - this.responseHeaders = responseHeaders || null; - this.handler = handler; - this.abort = null; - this.context = null; - this.onInfo = onInfo || null; - this.req = new PipelineRequest().on("error", util.nop); - this.ret = new Duplex({ - readableObjectMode: opts.objectMode, - autoDestroy: true, - read: () => { - const { body } = this; - if (body && body.resume) { - body.resume(); - } - }, - write: (chunk, encoding, callback) => { - const { req } = this; - if (req.push(chunk, encoding) || req._readableState.destroyed) { - callback(); - } else { - req[kResume] = callback; - } - }, - destroy: (err, callback) => { - const { body, req, res, ret, abort } = this; - if (!err && !ret._readableState.endEmitted) { - err = new RequestAbortedError; - } - if (abort && err) { - abort(); - } - util.destroy(body, err); - util.destroy(req, err); - util.destroy(res, err); - removeSignal(this); - callback(err); - } - }).on("prefinish", () => { - const { req } = this; - req.push(null); - }); - this.res = null; - addSignal(this, signal); - } - onConnect(abort, context) { - const { ret, res } = this; - assert(!res, "pipeline cannot be retried"); - if (ret.destroyed) { - throw new RequestAbortedError; - } - this.abort = abort; - this.context = context; - } - onHeaders(statusCode, rawHeaders, resume) { - const { opaque, handler, context } = this; - if (statusCode < 200) { - if (this.onInfo) { - const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - this.onInfo({ statusCode, headers }); - } - return; - } - this.res = new PipelineResponse(resume); - let body; - try { - this.handler = null; - const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - body = this.runInAsyncScope(handler, null, { - statusCode, - headers, - opaque, - body: this.res, - context - }); - } catch (err) { - this.res.on("error", util.nop); - throw err; - } - if (!body || typeof body.on !== "function") { - throw new InvalidReturnValueError("expected Readable"); - } - body.on("data", (chunk) => { - const { ret, body: body2 } = this; - if (!ret.push(chunk) && body2.pause) { - body2.pause(); - } - }).on("error", (err) => { - const { ret } = this; - util.destroy(ret, err); - }).on("end", () => { - const { ret } = this; - ret.push(null); - }).on("close", () => { - const { ret } = this; - if (!ret._readableState.ended) { - util.destroy(ret, new RequestAbortedError); - } - }); - this.body = body; - } - onData(chunk) { - const { res } = this; - return res.push(chunk); - } - onComplete(trailers) { - const { res } = this; - res.push(null); - } - onError(err) { - const { ret } = this; - this.handler = null; - util.destroy(ret, err); - } - } - function pipeline(opts, handler) { - try { - const pipelineHandler = new PipelineHandler(opts, handler); - this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); - return pipelineHandler.ret; - } catch (err) { - return new PassThrough().destroy(err); - } - } - module.exports = pipeline; -}); - -// ../node_modules/undici/lib/api/api-upgrade.js -var require_api_upgrade = __commonJS((exports, module) => { - var { InvalidArgumentError, RequestAbortedError, SocketError } = require_errors(); - var { AsyncResource } = __require("async_hooks"); - var util = require_util(); - var { addSignal, removeSignal } = require_abort_signal(); - var assert = __require("assert"); - - class UpgradeHandler extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - const { signal, opaque, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - super("UNDICI_UPGRADE"); - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.callback = callback; - this.abort = null; - this.context = null; - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError; - } - this.abort = abort; - this.context = null; - } - onHeaders() { - throw new SocketError("bad upgrade", null); - } - onUpgrade(statusCode, rawHeaders, socket) { - const { callback, opaque, context } = this; - assert.strictEqual(statusCode, 101); - removeSignal(this); - this.callback = null; - const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - this.runInAsyncScope(callback, null, null, { - headers, - socket, - opaque, - context - }); - } - onError(err) { - const { callback, opaque } = this; - removeSignal(this); - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - } - } - function upgrade(opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - upgrade.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - const upgradeHandler = new UpgradeHandler(opts, callback); - this.dispatch({ - ...opts, - method: opts.method || "GET", - upgrade: opts.protocol || "Websocket" - }, upgradeHandler); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module.exports = upgrade; -}); - -// ../node_modules/undici/lib/api/api-connect.js -var require_api_connect = __commonJS((exports, module) => { - var { AsyncResource } = __require("async_hooks"); - var { InvalidArgumentError, RequestAbortedError, SocketError } = require_errors(); - var util = require_util(); - var { addSignal, removeSignal } = require_abort_signal(); - - class ConnectHandler extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - const { signal, opaque, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - super("UNDICI_CONNECT"); - this.opaque = opaque || null; - this.responseHeaders = responseHeaders || null; - this.callback = callback; - this.abort = null; - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError; - } - this.abort = abort; - this.context = context; - } - onHeaders() { - throw new SocketError("bad connect", null); - } - onUpgrade(statusCode, rawHeaders, socket) { - const { callback, opaque, context } = this; - removeSignal(this); - this.callback = null; - let headers = rawHeaders; - if (headers != null) { - headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - } - this.runInAsyncScope(callback, null, null, { - statusCode, - headers, - socket, - opaque, - context - }); - } - onError(err) { - const { callback, opaque } = this; - removeSignal(this); - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - } - } - function connect(opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - connect.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - const connectHandler = new ConnectHandler(opts, callback); - this.dispatch({ ...opts, method: "CONNECT" }, connectHandler); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module.exports = connect; -}); - -// ../node_modules/undici/lib/api/index.js -var require_api = __commonJS((exports, module) => { - exports.request = require_api_request(); - exports.stream = require_api_stream(); - exports.pipeline = require_api_pipeline(); - exports.upgrade = require_api_upgrade(); - exports.connect = require_api_connect(); -}); - -// ../node_modules/undici/lib/mock/mock-errors.js -var require_mock_errors = __commonJS((exports, module) => { - var { UndiciError } = require_errors(); - - class MockNotMatchedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, MockNotMatchedError); - this.name = "MockNotMatchedError"; - this.message = message || "The request does not match any registered mock dispatches"; - this.code = "UND_MOCK_ERR_MOCK_NOT_MATCHED"; - } - } - module.exports = { - MockNotMatchedError - }; -}); - -// ../node_modules/undici/lib/mock/mock-symbols.js -var require_mock_symbols = __commonJS((exports, module) => { - module.exports = { - kAgent: Symbol("agent"), - kOptions: Symbol("options"), - kFactory: Symbol("factory"), - kDispatches: Symbol("dispatches"), - kDispatchKey: Symbol("dispatch key"), - kDefaultHeaders: Symbol("default headers"), - kDefaultTrailers: Symbol("default trailers"), - kContentLength: Symbol("content length"), - kMockAgent: Symbol("mock agent"), - kMockAgentSet: Symbol("mock agent set"), - kMockAgentGet: Symbol("mock agent get"), - kMockDispatch: Symbol("mock dispatch"), - kClose: Symbol("close"), - kOriginalClose: Symbol("original agent close"), - kOrigin: Symbol("origin"), - kIsMockActive: Symbol("is mock active"), - kNetConnect: Symbol("net connect"), - kGetNetConnect: Symbol("get net connect"), - kConnected: Symbol("connected") - }; -}); - -// ../node_modules/undici/lib/mock/mock-utils.js -var require_mock_utils = __commonJS((exports, module) => { - var { MockNotMatchedError } = require_mock_errors(); - var { - kDispatches, - kMockAgent, - kOriginalDispatch, - kOrigin, - kGetNetConnect - } = require_mock_symbols(); - var { buildURL, nop } = require_util(); - var { STATUS_CODES } = __require("http"); - var { - types: { - isPromise - } - } = __require("util"); - function matchValue(match, value) { - if (typeof match === "string") { - return match === value; - } - if (match instanceof RegExp) { - return match.test(value); - } - if (typeof match === "function") { - return match(value) === true; - } - return false; - } - function lowerCaseEntries(headers) { - return Object.fromEntries(Object.entries(headers).map(([headerName, headerValue]) => { - return [headerName.toLocaleLowerCase(), headerValue]; - })); - } - function getHeaderByName(headers, key) { - if (Array.isArray(headers)) { - for (let i = 0;i < headers.length; i += 2) { - if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { - return headers[i + 1]; - } - } - return; - } else if (typeof headers.get === "function") { - return headers.get(key); - } else { - return lowerCaseEntries(headers)[key.toLocaleLowerCase()]; - } - } - function buildHeadersFromArray(headers) { - const clone = headers.slice(); - const entries = []; - for (let index = 0;index < clone.length; index += 2) { - entries.push([clone[index], clone[index + 1]]); - } - return Object.fromEntries(entries); - } - function matchHeaders(mockDispatch2, headers) { - if (typeof mockDispatch2.headers === "function") { - if (Array.isArray(headers)) { - headers = buildHeadersFromArray(headers); - } - return mockDispatch2.headers(headers ? lowerCaseEntries(headers) : {}); - } - if (typeof mockDispatch2.headers === "undefined") { - return true; - } - if (typeof headers !== "object" || typeof mockDispatch2.headers !== "object") { - return false; - } - for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch2.headers)) { - const headerValue = getHeaderByName(headers, matchHeaderName); - if (!matchValue(matchHeaderValue, headerValue)) { - return false; - } - } - return true; - } - function safeUrl(path) { - if (typeof path !== "string") { - return path; - } - const pathSegments = path.split("?"); - if (pathSegments.length !== 2) { - return path; - } - const qp = new URLSearchParams(pathSegments.pop()); - qp.sort(); - return [...pathSegments, qp.toString()].join("?"); - } - function matchKey(mockDispatch2, { path, method, body, headers }) { - const pathMatch = matchValue(mockDispatch2.path, path); - const methodMatch = matchValue(mockDispatch2.method, method); - const bodyMatch = typeof mockDispatch2.body !== "undefined" ? matchValue(mockDispatch2.body, body) : true; - const headersMatch = matchHeaders(mockDispatch2, headers); - return pathMatch && methodMatch && bodyMatch && headersMatch; - } - function getResponseData(data) { - if (Buffer.isBuffer(data)) { - return data; - } else if (typeof data === "object") { - return JSON.stringify(data); - } else { - return data.toString(); - } - } - function getMockDispatch(mockDispatches, key) { - const basePath = key.query ? buildURL(key.path, key.query) : key.path; - const resolvedPath = typeof basePath === "string" ? safeUrl(basePath) : basePath; - let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`); - } - matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`); - } - matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== "undefined" ? matchValue(body, key.body) : true); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`); - } - matchedMockDispatches = matchedMockDispatches.filter((mockDispatch2) => matchHeaders(mockDispatch2, key.headers)); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === "object" ? JSON.stringify(key.headers) : key.headers}'`); - } - return matchedMockDispatches[0]; - } - function addMockDispatch(mockDispatches, key, data) { - const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false }; - const replyData = typeof data === "function" ? { callback: data } : { ...data }; - const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }; - mockDispatches.push(newMockDispatch); - return newMockDispatch; - } - function deleteMockDispatch(mockDispatches, key) { - const index = mockDispatches.findIndex((dispatch) => { - if (!dispatch.consumed) { - return false; - } - return matchKey(dispatch, key); - }); - if (index !== -1) { - mockDispatches.splice(index, 1); - } - } - function buildKey(opts) { - const { path, method, body, headers, query } = opts; - return { - path, - method, - body, - headers, - query - }; - } - function generateKeyValues(data) { - return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ - ...keyValuePairs, - Buffer.from(`${key}`), - Array.isArray(value) ? value.map((x) => Buffer.from(`${x}`)) : Buffer.from(`${value}`) - ], []); - } - function getStatusText(statusCode) { - return STATUS_CODES[statusCode] || "unknown"; - } - async function getResponse(body) { - const buffers = []; - for await (const data of body) { - buffers.push(data); - } - return Buffer.concat(buffers).toString("utf8"); - } - function mockDispatch(opts, handler) { - const key = buildKey(opts); - const mockDispatch2 = getMockDispatch(this[kDispatches], key); - mockDispatch2.timesInvoked++; - if (mockDispatch2.data.callback) { - mockDispatch2.data = { ...mockDispatch2.data, ...mockDispatch2.data.callback(opts) }; - } - const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch2; - const { timesInvoked, times } = mockDispatch2; - mockDispatch2.consumed = !persist && timesInvoked >= times; - mockDispatch2.pending = timesInvoked < times; - if (error !== null) { - deleteMockDispatch(this[kDispatches], key); - handler.onError(error); - return true; - } - if (typeof delay === "number" && delay > 0) { - setTimeout(() => { - handleReply(this[kDispatches]); - }, delay); - } else { - handleReply(this[kDispatches]); - } - function handleReply(mockDispatches, _data = data) { - const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; - const body = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data; - if (isPromise(body)) { - body.then((newData) => handleReply(mockDispatches, newData)); - return; - } - const responseData = getResponseData(body); - const responseHeaders = generateKeyValues(headers); - const responseTrailers = generateKeyValues(trailers); - handler.abort = nop; - handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)); - handler.onData(Buffer.from(responseData)); - handler.onComplete(responseTrailers); - deleteMockDispatch(mockDispatches, key); - } - function resume() { - } - return true; - } - function buildMockDispatch() { - const agent = this[kMockAgent]; - const origin = this[kOrigin]; - const originalDispatch = this[kOriginalDispatch]; - return function dispatch(opts, handler) { - if (agent.isMockActive) { - try { - mockDispatch.call(this, opts, handler); - } catch (error) { - if (error instanceof MockNotMatchedError) { - const netConnect = agent[kGetNetConnect](); - if (netConnect === false) { - throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`); - } - if (checkNetConnect(netConnect, origin)) { - originalDispatch.call(this, opts, handler); - } else { - throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`); - } - } else { - throw error; - } - } - } else { - originalDispatch.call(this, opts, handler); - } - }; - } - function checkNetConnect(netConnect, origin) { - const url = new URL(origin); - if (netConnect === true) { - return true; - } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { - return true; - } - return false; - } - function buildMockOptions(opts) { - if (opts) { - const { agent, ...mockOptions } = opts; - return mockOptions; - } - } - module.exports = { - getResponseData, - getMockDispatch, - addMockDispatch, - deleteMockDispatch, - buildKey, - generateKeyValues, - matchValue, - getResponse, - getStatusText, - mockDispatch, - buildMockDispatch, - checkNetConnect, - buildMockOptions, - getHeaderByName - }; -}); - -// ../node_modules/undici/lib/mock/mock-interceptor.js -var require_mock_interceptor = __commonJS((exports, module) => { - var { getResponseData, buildKey, addMockDispatch } = require_mock_utils(); - var { - kDispatches, - kDispatchKey, - kDefaultHeaders, - kDefaultTrailers, - kContentLength, - kMockDispatch - } = require_mock_symbols(); - var { InvalidArgumentError } = require_errors(); - var { buildURL } = require_util(); - - class MockScope { - constructor(mockDispatch) { - this[kMockDispatch] = mockDispatch; - } - delay(waitInMs) { - if (typeof waitInMs !== "number" || !Number.isInteger(waitInMs) || waitInMs <= 0) { - throw new InvalidArgumentError("waitInMs must be a valid integer > 0"); - } - this[kMockDispatch].delay = waitInMs; - return this; - } - persist() { - this[kMockDispatch].persist = true; - return this; - } - times(repeatTimes) { - if (typeof repeatTimes !== "number" || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { - throw new InvalidArgumentError("repeatTimes must be a valid integer > 0"); - } - this[kMockDispatch].times = repeatTimes; - return this; - } - } - - class MockInterceptor { - constructor(opts, mockDispatches) { - if (typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object"); - } - if (typeof opts.path === "undefined") { - throw new InvalidArgumentError("opts.path must be defined"); - } - if (typeof opts.method === "undefined") { - opts.method = "GET"; - } - if (typeof opts.path === "string") { - if (opts.query) { - opts.path = buildURL(opts.path, opts.query); - } else { - const parsedURL = new URL(opts.path, "data://"); - opts.path = parsedURL.pathname + parsedURL.search; - } - } - if (typeof opts.method === "string") { - opts.method = opts.method.toUpperCase(); - } - this[kDispatchKey] = buildKey(opts); - this[kDispatches] = mockDispatches; - this[kDefaultHeaders] = {}; - this[kDefaultTrailers] = {}; - this[kContentLength] = false; - } - createMockScopeDispatchData(statusCode, data, responseOptions = {}) { - const responseData = getResponseData(data); - const contentLength = this[kContentLength] ? { "content-length": responseData.length } : {}; - const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; - const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }; - return { statusCode, data, headers, trailers }; - } - validateReplyParameters(statusCode, data, responseOptions) { - if (typeof statusCode === "undefined") { - throw new InvalidArgumentError("statusCode must be defined"); - } - if (typeof data === "undefined") { - throw new InvalidArgumentError("data must be defined"); - } - if (typeof responseOptions !== "object") { - throw new InvalidArgumentError("responseOptions must be an object"); - } - } - reply(replyData) { - if (typeof replyData === "function") { - const wrappedDefaultsCallback = (opts) => { - const resolvedData = replyData(opts); - if (typeof resolvedData !== "object") { - throw new InvalidArgumentError("reply options callback must return an object"); - } - const { statusCode: statusCode2, data: data2 = "", responseOptions: responseOptions2 = {} } = resolvedData; - this.validateReplyParameters(statusCode2, data2, responseOptions2); - return { - ...this.createMockScopeDispatchData(statusCode2, data2, responseOptions2) - }; - }; - const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback); - return new MockScope(newMockDispatch2); - } - const [statusCode, data = "", responseOptions = {}] = [...arguments]; - this.validateReplyParameters(statusCode, data, responseOptions); - const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions); - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData); - return new MockScope(newMockDispatch); - } - replyWithError(error) { - if (typeof error === "undefined") { - throw new InvalidArgumentError("error must be defined"); - } - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }); - return new MockScope(newMockDispatch); - } - defaultReplyHeaders(headers) { - if (typeof headers === "undefined") { - throw new InvalidArgumentError("headers must be defined"); - } - this[kDefaultHeaders] = headers; - return this; - } - defaultReplyTrailers(trailers) { - if (typeof trailers === "undefined") { - throw new InvalidArgumentError("trailers must be defined"); - } - this[kDefaultTrailers] = trailers; - return this; - } - replyContentLength() { - this[kContentLength] = true; - return this; - } - } - exports.MockInterceptor = MockInterceptor; - exports.MockScope = MockScope; -}); - -// ../node_modules/undici/lib/mock/mock-client.js -var require_mock_client = __commonJS((exports, module) => { - var { promisify } = __require("util"); - var Client = require_client(); - var { buildMockDispatch } = require_mock_utils(); - var { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected - } = require_mock_symbols(); - var { MockInterceptor } = require_mock_interceptor(); - var Symbols = require_symbols(); - var { InvalidArgumentError } = require_errors(); - - class MockClient extends Client { - constructor(origin, opts) { - super(origin, opts); - if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - this[kMockAgent] = opts.agent; - this[kOrigin] = origin; - this[kDispatches] = []; - this[kConnected] = 1; - this[kOriginalDispatch] = this.dispatch; - this[kOriginalClose] = this.close.bind(this); - this.dispatch = buildMockDispatch.call(this); - this.close = this[kClose]; - } - get [Symbols.kConnected]() { - return this[kConnected]; - } - intercept(opts) { - return new MockInterceptor(opts, this[kDispatches]); - } - async[kClose]() { - await promisify(this[kOriginalClose])(); - this[kConnected] = 0; - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); - } - } - module.exports = MockClient; -}); - -// ../node_modules/undici/lib/mock/mock-pool.js -var require_mock_pool = __commonJS((exports, module) => { - var { promisify } = __require("util"); - var Pool = require_pool(); - var { buildMockDispatch } = require_mock_utils(); - var { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected - } = require_mock_symbols(); - var { MockInterceptor } = require_mock_interceptor(); - var Symbols = require_symbols(); - var { InvalidArgumentError } = require_errors(); - - class MockPool extends Pool { - constructor(origin, opts) { - super(origin, opts); - if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - this[kMockAgent] = opts.agent; - this[kOrigin] = origin; - this[kDispatches] = []; - this[kConnected] = 1; - this[kOriginalDispatch] = this.dispatch; - this[kOriginalClose] = this.close.bind(this); - this.dispatch = buildMockDispatch.call(this); - this.close = this[kClose]; - } - get [Symbols.kConnected]() { - return this[kConnected]; - } - intercept(opts) { - return new MockInterceptor(opts, this[kDispatches]); - } - async[kClose]() { - await promisify(this[kOriginalClose])(); - this[kConnected] = 0; - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); - } - } - module.exports = MockPool; -}); - -// ../node_modules/undici/lib/mock/pluralizer.js -var require_pluralizer = __commonJS((exports, module) => { - var singulars = { - pronoun: "it", - is: "is", - was: "was", - this: "this" - }; - var plurals = { - pronoun: "they", - is: "are", - was: "were", - this: "these" - }; - module.exports = class Pluralizer { - constructor(singular, plural) { - this.singular = singular; - this.plural = plural; - } - pluralize(count) { - const one = count === 1; - const keys = one ? singulars : plurals; - const noun = one ? this.singular : this.plural; - return { ...keys, count, noun }; - } - }; -}); - -// ../node_modules/undici/lib/mock/pending-interceptors-formatter.js -var require_pending_interceptors_formatter = __commonJS((exports, module) => { - var { Transform } = __require("stream"); - var { Console } = __require("console"); - module.exports = class PendingInterceptorsFormatter { - constructor({ disableColors } = {}) { - this.transform = new Transform({ - transform(chunk, _enc, cb) { - cb(null, chunk); - } - }); - this.logger = new Console({ - stdout: this.transform, - inspectOptions: { - colors: !disableColors && !process.env.CI - } - }); - } - format(pendingInterceptors) { - const withPrettyHeaders = pendingInterceptors.map(({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ - Method: method, - Origin: origin, - Path: path, - "Status code": statusCode, - Persistent: persist ? "\u2705" : "\u274C", - Invocations: timesInvoked, - Remaining: persist ? Infinity : times - timesInvoked - })); - this.logger.table(withPrettyHeaders); - return this.transform.read().toString(); - } - }; -}); - -// ../node_modules/undici/lib/mock/mock-agent.js -var require_mock_agent = __commonJS((exports, module) => { - var { kClients } = require_symbols(); - var Agent = require_agent(); - var { - kAgent, - kMockAgentSet, - kMockAgentGet, - kDispatches, - kIsMockActive, - kNetConnect, - kGetNetConnect, - kOptions, - kFactory - } = require_mock_symbols(); - var MockClient = require_mock_client(); - var MockPool = require_mock_pool(); - var { matchValue, buildMockOptions } = require_mock_utils(); - var { InvalidArgumentError, UndiciError } = require_errors(); - var Dispatcher = require_dispatcher(); - var Pluralizer = require_pluralizer(); - var PendingInterceptorsFormatter = require_pending_interceptors_formatter(); - - class FakeWeakRef { - constructor(value) { - this.value = value; - } - deref() { - return this.value; - } - } - - class MockAgent extends Dispatcher { - constructor(opts) { - super(opts); - this[kNetConnect] = true; - this[kIsMockActive] = true; - if (opts && opts.agent && typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - const agent = opts && opts.agent ? opts.agent : new Agent(opts); - this[kAgent] = agent; - this[kClients] = agent[kClients]; - this[kOptions] = buildMockOptions(opts); - } - get(origin) { - let dispatcher = this[kMockAgentGet](origin); - if (!dispatcher) { - dispatcher = this[kFactory](origin); - this[kMockAgentSet](origin, dispatcher); - } - return dispatcher; - } - dispatch(opts, handler) { - this.get(opts.origin); - return this[kAgent].dispatch(opts, handler); - } - async close() { - await this[kAgent].close(); - this[kClients].clear(); - } - deactivate() { - this[kIsMockActive] = false; - } - activate() { - this[kIsMockActive] = true; - } - enableNetConnect(matcher) { - if (typeof matcher === "string" || typeof matcher === "function" || matcher instanceof RegExp) { - if (Array.isArray(this[kNetConnect])) { - this[kNetConnect].push(matcher); - } else { - this[kNetConnect] = [matcher]; - } - } else if (typeof matcher === "undefined") { - this[kNetConnect] = true; - } else { - throw new InvalidArgumentError("Unsupported matcher. Must be one of String|Function|RegExp."); - } - } - disableNetConnect() { - this[kNetConnect] = false; - } - get isMockActive() { - return this[kIsMockActive]; - } - [kMockAgentSet](origin, dispatcher) { - this[kClients].set(origin, new FakeWeakRef(dispatcher)); - } - [kFactory](origin) { - const mockOptions = Object.assign({ agent: this }, this[kOptions]); - return this[kOptions] && this[kOptions].connections === 1 ? new MockClient(origin, mockOptions) : new MockPool(origin, mockOptions); - } - [kMockAgentGet](origin) { - const ref = this[kClients].get(origin); - if (ref) { - return ref.deref(); - } - if (typeof origin !== "string") { - const dispatcher = this[kFactory]("http://localhost:9999"); - this[kMockAgentSet](origin, dispatcher); - return dispatcher; - } - for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { - const nonExplicitDispatcher = nonExplicitRef.deref(); - if (nonExplicitDispatcher && typeof keyMatcher !== "string" && matchValue(keyMatcher, origin)) { - const dispatcher = this[kFactory](origin); - this[kMockAgentSet](origin, dispatcher); - dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches]; - return dispatcher; - } - } - } - [kGetNetConnect]() { - return this[kNetConnect]; - } - pendingInterceptors() { - const mockAgentClients = this[kClients]; - return Array.from(mockAgentClients.entries()).flatMap(([origin, scope]) => scope.deref()[kDispatches].map((dispatch) => ({ ...dispatch, origin }))).filter(({ pending }) => pending); - } - assertNoPendingInterceptors({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter } = {}) { - const pending = this.pendingInterceptors(); - if (pending.length === 0) { - return; - } - const pluralizer = new Pluralizer("interceptor", "interceptors").pluralize(pending.length); - throw new UndiciError(` -${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: - -${pendingInterceptorsFormatter.format(pending)} -`.trim()); - } - } - module.exports = MockAgent; -}); - -// ../node_modules/undici/lib/proxy-agent.js -var require_proxy_agent = __commonJS((exports, module) => { - var { kProxy, kClose, kDestroy, kInterceptors } = require_symbols(); - var { URL: URL2 } = __require("url"); - var Agent = require_agent(); - var Pool = require_pool(); - var DispatcherBase = require_dispatcher_base(); - var { InvalidArgumentError, RequestAbortedError } = require_errors(); - var buildConnector = require_connect(); - var kAgent = Symbol("proxy agent"); - var kClient = Symbol("proxy client"); - var kProxyHeaders = Symbol("proxy headers"); - var kRequestTls = Symbol("request tls settings"); - var kProxyTls = Symbol("proxy tls settings"); - var kConnectEndpoint = Symbol("connect endpoint function"); - function defaultProtocolPort(protocol) { - return protocol === "https:" ? 443 : 80; - } - function buildProxyOptions(opts) { - if (typeof opts === "string") { - opts = { uri: opts }; - } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); - } - return { - uri: opts.uri, - protocol: opts.protocol || "https" - }; - } - function defaultFactory(origin, opts) { - return new Pool(origin, opts); - } - - class ProxyAgent extends DispatcherBase { - constructor(opts) { - super(opts); - this[kProxy] = buildProxyOptions(opts); - this[kAgent] = new Agent(opts); - this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; - if (typeof opts === "string") { - opts = { uri: opts }; - } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); - } - const { clientFactory = defaultFactory } = opts; - if (typeof clientFactory !== "function") { - throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); - } - this[kRequestTls] = opts.requestTls; - this[kProxyTls] = opts.proxyTls; - this[kProxyHeaders] = opts.headers || {}; - const resolvedUrl = new URL2(opts.uri); - const { origin, port, host, username, password } = resolvedUrl; - if (opts.auth && opts.token) { - throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); - } else if (opts.auth) { - this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; - } else if (opts.token) { - this[kProxyHeaders]["proxy-authorization"] = opts.token; - } else if (username && password) { - this[kProxyHeaders]["proxy-authorization"] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString("base64")}`; - } - const connect = buildConnector({ ...opts.proxyTls }); - this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); - this[kClient] = clientFactory(resolvedUrl, { connect }); - this[kAgent] = new Agent({ - ...opts, - connect: async (opts2, callback) => { - let requestedHost = opts2.host; - if (!opts2.port) { - requestedHost += `:${defaultProtocolPort(opts2.protocol)}`; - } - try { - const { socket, statusCode } = await this[kClient].connect({ - origin, - port, - path: requestedHost, - signal: opts2.signal, - headers: { - ...this[kProxyHeaders], - host - } - }); - if (statusCode !== 200) { - socket.on("error", () => { - }).destroy(); - callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); - } - if (opts2.protocol !== "https:") { - callback(null, socket); - return; - } - let servername; - if (this[kRequestTls]) { - servername = this[kRequestTls].servername; - } else { - servername = opts2.servername; - } - this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback); - } catch (err) { - callback(err); - } - } - }); - } - dispatch(opts, handler) { - const { host } = new URL2(opts.origin); - const headers = buildHeaders(opts.headers); - throwIfProxyAuthIsSent(headers); - return this[kAgent].dispatch({ - ...opts, - headers: { - ...headers, - host - } - }, handler); - } - async[kClose]() { - await this[kAgent].close(); - await this[kClient].close(); - } - async[kDestroy]() { - await this[kAgent].destroy(); - await this[kClient].destroy(); - } - } - function buildHeaders(headers) { - if (Array.isArray(headers)) { - const headersPair = {}; - for (let i = 0;i < headers.length; i += 2) { - headersPair[headers[i]] = headers[i + 1]; - } - return headersPair; - } - return headers; - } - function throwIfProxyAuthIsSent(headers) { - const existProxyAuth = headers && Object.keys(headers).find((key) => key.toLowerCase() === "proxy-authorization"); - if (existProxyAuth) { - throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); - } - } - module.exports = ProxyAgent; -}); - -// ../node_modules/undici/lib/handler/RetryHandler.js -var require_RetryHandler = __commonJS((exports, module) => { - var assert = __require("assert"); - var { kRetryHandlerDefaultRetry } = require_symbols(); - var { RequestRetryError } = require_errors(); - var { isDisturbed, parseHeaders, parseRangeHeader } = require_util(); - function calculateRetryAfterHeader(retryAfter) { - const current = Date.now(); - const diff = new Date(retryAfter).getTime() - current; - return diff; - } - - class RetryHandler { - constructor(opts, handlers) { - const { retryOptions, ...dispatchOpts } = opts; - const { - retry: retryFn, - maxRetries, - maxTimeout, - minTimeout, - timeoutFactor, - methods, - errorCodes, - retryAfter, - statusCodes - } = retryOptions ?? {}; - this.dispatch = handlers.dispatch; - this.handler = handlers.handler; - this.opts = dispatchOpts; - this.abort = null; - this.aborted = false; - this.retryOpts = { - retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], - retryAfter: retryAfter ?? true, - maxTimeout: maxTimeout ?? 30 * 1000, - timeout: minTimeout ?? 500, - timeoutFactor: timeoutFactor ?? 2, - maxRetries: maxRetries ?? 5, - methods: methods ?? ["GET", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"], - statusCodes: statusCodes ?? [500, 502, 503, 504, 429], - errorCodes: errorCodes ?? [ - "ECONNRESET", - "ECONNREFUSED", - "ENOTFOUND", - "ENETDOWN", - "ENETUNREACH", - "EHOSTDOWN", - "EHOSTUNREACH", - "EPIPE" - ] - }; - this.retryCount = 0; - this.start = 0; - this.end = null; - this.etag = null; - this.resume = null; - this.handler.onConnect((reason) => { - this.aborted = true; - if (this.abort) { - this.abort(reason); - } else { - this.reason = reason; - } - }); - } - onRequestSent() { - if (this.handler.onRequestSent) { - this.handler.onRequestSent(); - } - } - onUpgrade(statusCode, headers, socket) { - if (this.handler.onUpgrade) { - this.handler.onUpgrade(statusCode, headers, socket); - } - } - onConnect(abort) { - if (this.aborted) { - abort(this.reason); - } else { - this.abort = abort; - } - } - onBodySent(chunk) { - if (this.handler.onBodySent) - return this.handler.onBodySent(chunk); - } - static [kRetryHandlerDefaultRetry](err, { state, opts }, cb) { - const { statusCode, code, headers } = err; - const { method, retryOptions } = opts; - const { - maxRetries, - timeout, - maxTimeout, - timeoutFactor, - statusCodes, - errorCodes, - methods - } = retryOptions; - let { counter, currentTimeout } = state; - currentTimeout = currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout; - if (code && code !== "UND_ERR_REQ_RETRY" && code !== "UND_ERR_SOCKET" && !errorCodes.includes(code)) { - cb(err); - return; - } - if (Array.isArray(methods) && !methods.includes(method)) { - cb(err); - return; - } - if (statusCode != null && Array.isArray(statusCodes) && !statusCodes.includes(statusCode)) { - cb(err); - return; - } - if (counter > maxRetries) { - cb(err); - return; - } - let retryAfterHeader = headers != null && headers["retry-after"]; - if (retryAfterHeader) { - retryAfterHeader = Number(retryAfterHeader); - retryAfterHeader = isNaN(retryAfterHeader) ? calculateRetryAfterHeader(retryAfterHeader) : retryAfterHeader * 1000; - } - const retryTimeout = retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout); - state.currentTimeout = retryTimeout; - setTimeout(() => cb(null), retryTimeout); - } - onHeaders(statusCode, rawHeaders, resume, statusMessage) { - const headers = parseHeaders(rawHeaders); - this.retryCount += 1; - if (statusCode >= 300) { - this.abort(new RequestRetryError("Request failed", statusCode, { - headers, - count: this.retryCount - })); - return false; - } - if (this.resume != null) { - this.resume = null; - if (statusCode !== 206) { - return true; - } - const contentRange = parseRangeHeader(headers["content-range"]); - if (!contentRange) { - this.abort(new RequestRetryError("Content-Range mismatch", statusCode, { - headers, - count: this.retryCount - })); - return false; - } - if (this.etag != null && this.etag !== headers.etag) { - this.abort(new RequestRetryError("ETag mismatch", statusCode, { - headers, - count: this.retryCount - })); - return false; - } - const { start, size, end = size } = contentRange; - assert(this.start === start, "content-range mismatch"); - assert(this.end == null || this.end === end, "content-range mismatch"); - this.resume = resume; - return true; - } - if (this.end == null) { - if (statusCode === 206) { - const range = parseRangeHeader(headers["content-range"]); - if (range == null) { - return this.handler.onHeaders(statusCode, rawHeaders, resume, statusMessage); - } - const { start, size, end = size } = range; - assert(start != null && Number.isFinite(start) && this.start !== start, "content-range mismatch"); - assert(Number.isFinite(start)); - assert(end != null && Number.isFinite(end) && this.end !== end, "invalid content-length"); - this.start = start; - this.end = end; - } - if (this.end == null) { - const contentLength = headers["content-length"]; - this.end = contentLength != null ? Number(contentLength) : null; - } - assert(Number.isFinite(this.start)); - assert(this.end == null || Number.isFinite(this.end), "invalid content-length"); - this.resume = resume; - this.etag = headers.etag != null ? headers.etag : null; - return this.handler.onHeaders(statusCode, rawHeaders, resume, statusMessage); - } - const err = new RequestRetryError("Request failed", statusCode, { - headers, - count: this.retryCount - }); - this.abort(err); - return false; - } - onData(chunk) { - this.start += chunk.length; - return this.handler.onData(chunk); - } - onComplete(rawTrailers) { - this.retryCount = 0; - return this.handler.onComplete(rawTrailers); - } - onError(err) { - if (this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err); - } - this.retryOpts.retry(err, { - state: { counter: this.retryCount++, currentTimeout: this.retryAfter }, - opts: { retryOptions: this.retryOpts, ...this.opts } - }, onRetry.bind(this)); - function onRetry(err2) { - if (err2 != null || this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err2); - } - if (this.start !== 0) { - this.opts = { - ...this.opts, - headers: { - ...this.opts.headers, - range: `bytes=${this.start}-${this.end ?? ""}` - } - }; - } - try { - this.dispatch(this.opts, this); - } catch (err3) { - this.handler.onError(err3); - } - } - } - } - module.exports = RetryHandler; -}); - -// ../node_modules/undici/lib/global.js -var require_global2 = __commonJS((exports, module) => { - var globalDispatcher = Symbol.for("undici.globalDispatcher.1"); - var { InvalidArgumentError } = require_errors(); - var Agent = require_agent(); - if (getGlobalDispatcher() === undefined) { - setGlobalDispatcher(new Agent); - } - function setGlobalDispatcher(agent) { - if (!agent || typeof agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument agent must implement Agent"); - } - Object.defineProperty(globalThis, globalDispatcher, { - value: agent, - writable: true, - enumerable: false, - configurable: false - }); - } - function getGlobalDispatcher() { - return globalThis[globalDispatcher]; - } - module.exports = { - setGlobalDispatcher, - getGlobalDispatcher - }; -}); - -// ../node_modules/undici/lib/handler/DecoratorHandler.js -var require_DecoratorHandler = __commonJS((exports, module) => { - module.exports = class DecoratorHandler { - constructor(handler) { - this.handler = handler; - } - onConnect(...args) { - return this.handler.onConnect(...args); - } - onError(...args) { - return this.handler.onError(...args); - } - onUpgrade(...args) { - return this.handler.onUpgrade(...args); - } - onHeaders(...args) { - return this.handler.onHeaders(...args); - } - onData(...args) { - return this.handler.onData(...args); - } - onComplete(...args) { - return this.handler.onComplete(...args); - } - onBodySent(...args) { - return this.handler.onBodySent(...args); - } - }; -}); - -// ../node_modules/undici/lib/fetch/headers.js -var require_headers = __commonJS((exports, module) => { - var { kHeadersList, kConstruct } = require_symbols(); - var { kGuard } = require_symbols2(); - var { kEnumerableProperty } = require_util(); - var { - makeIterator, - isValidHeaderName, - isValidHeaderValue - } = require_util2(); - var { webidl } = require_webidl(); - var assert = __require("assert"); - var kHeadersMap = Symbol("headers map"); - var kHeadersSortedMap = Symbol("headers map sorted"); - function isHTTPWhiteSpaceCharCode(code) { - return code === 10 || code === 13 || code === 9 || code === 32; - } - function headerValueNormalize(potentialValue) { - let i = 0; - let j = potentialValue.length; - while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) - --j; - while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) - ++i; - return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j); - } - function fill(headers, object) { - if (Array.isArray(object)) { - for (let i = 0;i < object.length; ++i) { - const header = object[i]; - if (header.length !== 2) { - throw webidl.errors.exception({ - header: "Headers constructor", - message: `expected name/value pair to be length 2, found ${header.length}.` - }); - } - appendHeader(headers, header[0], header[1]); - } - } else if (typeof object === "object" && object !== null) { - const keys = Object.keys(object); - for (let i = 0;i < keys.length; ++i) { - appendHeader(headers, keys[i], object[keys[i]]); - } - } else { - throw webidl.errors.conversionFailed({ - prefix: "Headers constructor", - argument: "Argument 1", - types: ["sequence>", "record"] - }); - } - } - function appendHeader(headers, name, value) { - value = headerValueNormalize(value); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.append", - value: name, - type: "header name" - }); - } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.append", - value, - type: "header value" - }); - } - if (headers[kGuard] === "immutable") { - throw new TypeError("immutable"); - } else if (headers[kGuard] === "request-no-cors") { - } - return headers[kHeadersList].append(name, value); - } - - class HeadersList { - cookies = null; - constructor(init) { - if (init instanceof HeadersList) { - this[kHeadersMap] = new Map(init[kHeadersMap]); - this[kHeadersSortedMap] = init[kHeadersSortedMap]; - this.cookies = init.cookies === null ? null : [...init.cookies]; - } else { - this[kHeadersMap] = new Map(init); - this[kHeadersSortedMap] = null; - } - } - contains(name) { - name = name.toLowerCase(); - return this[kHeadersMap].has(name); - } - clear() { - this[kHeadersMap].clear(); - this[kHeadersSortedMap] = null; - this.cookies = null; - } - append(name, value) { - this[kHeadersSortedMap] = null; - const lowercaseName = name.toLowerCase(); - const exists = this[kHeadersMap].get(lowercaseName); - if (exists) { - const delimiter = lowercaseName === "cookie" ? "; " : ", "; - this[kHeadersMap].set(lowercaseName, { - name: exists.name, - value: `${exists.value}${delimiter}${value}` - }); - } else { - this[kHeadersMap].set(lowercaseName, { name, value }); - } - if (lowercaseName === "set-cookie") { - this.cookies ??= []; - this.cookies.push(value); - } - } - set(name, value) { - this[kHeadersSortedMap] = null; - const lowercaseName = name.toLowerCase(); - if (lowercaseName === "set-cookie") { - this.cookies = [value]; - } - this[kHeadersMap].set(lowercaseName, { name, value }); - } - delete(name) { - this[kHeadersSortedMap] = null; - name = name.toLowerCase(); - if (name === "set-cookie") { - this.cookies = null; - } - this[kHeadersMap].delete(name); - } - get(name) { - const value = this[kHeadersMap].get(name.toLowerCase()); - return value === undefined ? null : value.value; - } - *[Symbol.iterator]() { - for (const [name, { value }] of this[kHeadersMap]) { - yield [name, value]; - } - } - get entries() { - const headers = {}; - if (this[kHeadersMap].size) { - for (const { name, value } of this[kHeadersMap].values()) { - headers[name] = value; - } - } - return headers; - } - } - - class Headers { - constructor(init = undefined) { - if (init === kConstruct) { - return; - } - this[kHeadersList] = new HeadersList; - this[kGuard] = "none"; - if (init !== undefined) { - init = webidl.converters.HeadersInit(init); - fill(this, init); - } - } - append(name, value) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 2, { header: "Headers.append" }); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); - return appendHeader(this, name, value); - } - delete(name) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.delete" }); - name = webidl.converters.ByteString(name); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.delete", - value: name, - type: "header name" - }); - } - if (this[kGuard] === "immutable") { - throw new TypeError("immutable"); - } else if (this[kGuard] === "request-no-cors") { - } - if (!this[kHeadersList].contains(name)) { - return; - } - this[kHeadersList].delete(name); - } - get(name) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.get" }); - name = webidl.converters.ByteString(name); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.get", - value: name, - type: "header name" - }); - } - return this[kHeadersList].get(name); - } - has(name) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.has" }); - name = webidl.converters.ByteString(name); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.has", - value: name, - type: "header name" - }); - } - return this[kHeadersList].contains(name); - } - set(name, value) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 2, { header: "Headers.set" }); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); - value = headerValueNormalize(value); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.set", - value: name, - type: "header name" - }); - } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.set", - value, - type: "header value" - }); - } - if (this[kGuard] === "immutable") { - throw new TypeError("immutable"); - } else if (this[kGuard] === "request-no-cors") { - } - this[kHeadersList].set(name, value); - } - getSetCookie() { - webidl.brandCheck(this, Headers); - const list = this[kHeadersList].cookies; - if (list) { - return [...list]; - } - return []; - } - get [kHeadersSortedMap]() { - if (this[kHeadersList][kHeadersSortedMap]) { - return this[kHeadersList][kHeadersSortedMap]; - } - const headers = []; - const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1); - const cookies = this[kHeadersList].cookies; - for (let i = 0;i < names.length; ++i) { - const [name, value] = names[i]; - if (name === "set-cookie") { - for (let j = 0;j < cookies.length; ++j) { - headers.push([name, cookies[j]]); - } - } else { - assert(value !== null); - headers.push([name, value]); - } - } - this[kHeadersList][kHeadersSortedMap] = headers; - return headers; - } - keys() { - webidl.brandCheck(this, Headers); - if (this[kGuard] === "immutable") { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, "Headers", "key"); - } - return makeIterator(() => [...this[kHeadersSortedMap].values()], "Headers", "key"); - } - values() { - webidl.brandCheck(this, Headers); - if (this[kGuard] === "immutable") { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, "Headers", "value"); - } - return makeIterator(() => [...this[kHeadersSortedMap].values()], "Headers", "value"); - } - entries() { - webidl.brandCheck(this, Headers); - if (this[kGuard] === "immutable") { - const value = this[kHeadersSortedMap]; - return makeIterator(() => value, "Headers", "key+value"); - } - return makeIterator(() => [...this[kHeadersSortedMap].values()], "Headers", "key+value"); - } - forEach(callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.forEach" }); - if (typeof callbackFn !== "function") { - throw new TypeError("Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'."); - } - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); - } - } - [Symbol.for("nodejs.util.inspect.custom")]() { - webidl.brandCheck(this, Headers); - return this[kHeadersList]; - } - } - Headers.prototype[Symbol.iterator] = Headers.prototype.entries; - Object.defineProperties(Headers.prototype, { - append: kEnumerableProperty, - delete: kEnumerableProperty, - get: kEnumerableProperty, - has: kEnumerableProperty, - set: kEnumerableProperty, - getSetCookie: kEnumerableProperty, - keys: kEnumerableProperty, - values: kEnumerableProperty, - entries: kEnumerableProperty, - forEach: kEnumerableProperty, - [Symbol.iterator]: { enumerable: false }, - [Symbol.toStringTag]: { - value: "Headers", - configurable: true - } - }); - webidl.converters.HeadersInit = function(V) { - if (webidl.util.Type(V) === "Object") { - if (V[Symbol.iterator]) { - return webidl.converters["sequence>"](V); - } - return webidl.converters["record"](V); - } - throw webidl.errors.conversionFailed({ - prefix: "Headers constructor", - argument: "Argument 1", - types: ["sequence>", "record"] - }); - }; - module.exports = { - fill, - Headers, - HeadersList - }; -}); - -// ../node_modules/undici/lib/fetch/response.js -var require_response = __commonJS((exports, module) => { - var { Headers, HeadersList, fill } = require_headers(); - var { extractBody, cloneBody, mixinBody } = require_body(); - var util = require_util(); - var { kEnumerableProperty } = util; - var { - isValidReasonPhrase, - isCancelled, - isAborted, - isBlobLike, - serializeJavascriptValueToJSONString, - isErrorLike, - isomorphicEncode - } = require_util2(); - var { - redirectStatusSet, - nullBodyStatus, - DOMException: DOMException2 - } = require_constants2(); - var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); - var { webidl } = require_webidl(); - var { FormData } = require_formdata(); - var { getGlobalOrigin } = require_global(); - var { URLSerializer } = require_dataURL(); - var { kHeadersList, kConstruct } = require_symbols(); - var assert = __require("assert"); - var { types } = __require("util"); - var ReadableStream = globalThis.ReadableStream || __require("stream/web").ReadableStream; - var textEncoder = new TextEncoder("utf-8"); - - class Response { - static error() { - const relevantRealm = { settingsObject: {} }; - const responseObject = new Response; - responseObject[kState] = makeNetworkError(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; - return responseObject; - } - static json(data, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "Response.json" }); - if (init !== null) { - init = webidl.converters.ResponseInit(init); - } - const bytes = textEncoder.encode(serializeJavascriptValueToJSONString(data)); - const body = extractBody(bytes); - const relevantRealm = { settingsObject: {} }; - const responseObject = new Response; - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = "response"; - responseObject[kHeaders][kRealm] = relevantRealm; - initializeResponse(responseObject, init, { body: body[0], type: "application/json" }); - return responseObject; - } - static redirect(url, status = 302) { - const relevantRealm = { settingsObject: {} }; - webidl.argumentLengthCheck(arguments, 1, { header: "Response.redirect" }); - url = webidl.converters.USVString(url); - status = webidl.converters["unsigned short"](status); - let parsedURL; - try { - parsedURL = new URL(url, getGlobalOrigin()); - } catch (err) { - throw Object.assign(new TypeError("Failed to parse URL from " + url), { - cause: err - }); - } - if (!redirectStatusSet.has(status)) { - throw new RangeError("Invalid status code " + status); - } - const responseObject = new Response; - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; - responseObject[kState].status = status; - const value = isomorphicEncode(URLSerializer(parsedURL)); - responseObject[kState].headersList.append("location", value); - return responseObject; - } - constructor(body = null, init = {}) { - if (body !== null) { - body = webidl.converters.BodyInit(body); - } - init = webidl.converters.ResponseInit(init); - this[kRealm] = { settingsObject: {} }; - this[kState] = makeResponse({}); - this[kHeaders] = new Headers(kConstruct); - this[kHeaders][kGuard] = "response"; - this[kHeaders][kHeadersList] = this[kState].headersList; - this[kHeaders][kRealm] = this[kRealm]; - let bodyWithType = null; - if (body != null) { - const [extractedBody, type] = extractBody(body); - bodyWithType = { body: extractedBody, type }; - } - initializeResponse(this, init, bodyWithType); - } - get type() { - webidl.brandCheck(this, Response); - return this[kState].type; - } - get url() { - webidl.brandCheck(this, Response); - const urlList = this[kState].urlList; - const url = urlList[urlList.length - 1] ?? null; - if (url === null) { - return ""; - } - return URLSerializer(url, true); - } - get redirected() { - webidl.brandCheck(this, Response); - return this[kState].urlList.length > 1; - } - get status() { - webidl.brandCheck(this, Response); - return this[kState].status; - } - get ok() { - webidl.brandCheck(this, Response); - return this[kState].status >= 200 && this[kState].status <= 299; - } - get statusText() { - webidl.brandCheck(this, Response); - return this[kState].statusText; - } - get headers() { - webidl.brandCheck(this, Response); - return this[kHeaders]; - } - get body() { - webidl.brandCheck(this, Response); - return this[kState].body ? this[kState].body.stream : null; - } - get bodyUsed() { - webidl.brandCheck(this, Response); - return !!this[kState].body && util.isDisturbed(this[kState].body.stream); - } - clone() { - webidl.brandCheck(this, Response); - if (this.bodyUsed || this.body && this.body.locked) { - throw webidl.errors.exception({ - header: "Response.clone", - message: "Body has already been consumed." - }); - } - const clonedResponse = cloneResponse(this[kState]); - const clonedResponseObject = new Response; - clonedResponseObject[kState] = clonedResponse; - clonedResponseObject[kRealm] = this[kRealm]; - clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList; - clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]; - return clonedResponseObject; - } - } - mixinBody(Response); - Object.defineProperties(Response.prototype, { - type: kEnumerableProperty, - url: kEnumerableProperty, - status: kEnumerableProperty, - ok: kEnumerableProperty, - redirected: kEnumerableProperty, - statusText: kEnumerableProperty, - headers: kEnumerableProperty, - clone: kEnumerableProperty, - body: kEnumerableProperty, - bodyUsed: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "Response", - configurable: true - } - }); - Object.defineProperties(Response, { - json: kEnumerableProperty, - redirect: kEnumerableProperty, - error: kEnumerableProperty - }); - function cloneResponse(response) { - if (response.internalResponse) { - return filterResponse(cloneResponse(response.internalResponse), response.type); - } - const newResponse = makeResponse({ ...response, body: null }); - if (response.body != null) { - newResponse.body = cloneBody(response.body); - } - return newResponse; - } - function makeResponse(init) { - return { - aborted: false, - rangeRequested: false, - timingAllowPassed: false, - requestIncludesCredentials: false, - type: "default", - status: 200, - timingInfo: null, - cacheState: "", - statusText: "", - ...init, - headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList, - urlList: init.urlList ? [...init.urlList] : [] - }; - } - function makeNetworkError(reason) { - const isError = isErrorLike(reason); - return makeResponse({ - type: "error", - status: 0, - error: isError ? reason : new Error(reason ? String(reason) : reason), - aborted: reason && reason.name === "AbortError" - }); - } - function makeFilteredResponse(response, state) { - state = { - internalResponse: response, - ...state - }; - return new Proxy(response, { - get(target, p) { - return p in state ? state[p] : target[p]; - }, - set(target, p, value) { - assert(!(p in state)); - target[p] = value; - return true; - } - }); - } - function filterResponse(response, type) { - if (type === "basic") { - return makeFilteredResponse(response, { - type: "basic", - headersList: response.headersList - }); - } else if (type === "cors") { - return makeFilteredResponse(response, { - type: "cors", - headersList: response.headersList - }); - } else if (type === "opaque") { - return makeFilteredResponse(response, { - type: "opaque", - urlList: Object.freeze([]), - status: 0, - statusText: "", - body: null - }); - } else if (type === "opaqueredirect") { - return makeFilteredResponse(response, { - type: "opaqueredirect", - status: 0, - statusText: "", - headersList: [], - body: null - }); - } else { - assert(false); - } - } - function makeAppropriateNetworkError(fetchParams, err = null) { - assert(isCancelled(fetchParams)); - return isAborted(fetchParams) ? makeNetworkError(Object.assign(new DOMException2("The operation was aborted.", "AbortError"), { cause: err })) : makeNetworkError(Object.assign(new DOMException2("Request was cancelled."), { cause: err })); - } - function initializeResponse(response, init, body) { - if (init.status !== null && (init.status < 200 || init.status > 599)) { - throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.'); - } - if ("statusText" in init && init.statusText != null) { - if (!isValidReasonPhrase(String(init.statusText))) { - throw new TypeError("Invalid statusText"); - } - } - if ("status" in init && init.status != null) { - response[kState].status = init.status; - } - if ("statusText" in init && init.statusText != null) { - response[kState].statusText = init.statusText; - } - if ("headers" in init && init.headers != null) { - fill(response[kHeaders], init.headers); - } - if (body) { - if (nullBodyStatus.includes(response.status)) { - throw webidl.errors.exception({ - header: "Response constructor", - message: "Invalid response status code " + response.status - }); - } - response[kState].body = body.body; - if (body.type != null && !response[kState].headersList.contains("Content-Type")) { - response[kState].headersList.append("content-type", body.type); - } - } - } - webidl.converters.ReadableStream = webidl.interfaceConverter(ReadableStream); - webidl.converters.FormData = webidl.interfaceConverter(FormData); - webidl.converters.URLSearchParams = webidl.interfaceConverter(URLSearchParams); - webidl.converters.XMLHttpRequestBodyInit = function(V) { - if (typeof V === "string") { - return webidl.converters.USVString(V); - } - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); - } - if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) { - return webidl.converters.BufferSource(V); - } - if (util.isFormDataLike(V)) { - return webidl.converters.FormData(V, { strict: false }); - } - if (V instanceof URLSearchParams) { - return webidl.converters.URLSearchParams(V); - } - return webidl.converters.DOMString(V); - }; - webidl.converters.BodyInit = function(V) { - if (V instanceof ReadableStream) { - return webidl.converters.ReadableStream(V); - } - if (V?.[Symbol.asyncIterator]) { - return V; - } - return webidl.converters.XMLHttpRequestBodyInit(V); - }; - webidl.converters.ResponseInit = webidl.dictionaryConverter([ - { - key: "status", - converter: webidl.converters["unsigned short"], - defaultValue: 200 - }, - { - key: "statusText", - converter: webidl.converters.ByteString, - defaultValue: "" - }, - { - key: "headers", - converter: webidl.converters.HeadersInit - } - ]); - module.exports = { - makeNetworkError, - makeResponse, - makeAppropriateNetworkError, - filterResponse, - Response, - cloneResponse - }; -}); - -// ../node_modules/undici/lib/fetch/request.js -var require_request2 = __commonJS((exports, module) => { - var { extractBody, mixinBody, cloneBody } = require_body(); - var { Headers, fill: fillHeaders, HeadersList } = require_headers(); - var { FinalizationRegistry } = require_dispatcher_weakref()(); - var util = require_util(); - var { - isValidHTTPToken, - sameOrigin, - normalizeMethod, - makePolicyContainer, - normalizeMethodRecord - } = require_util2(); - var { - forbiddenMethodsSet, - corsSafeListedMethodsSet, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - requestDuplex - } = require_constants2(); - var { kEnumerableProperty } = util; - var { kHeaders, kSignal, kState, kGuard, kRealm } = require_symbols2(); - var { webidl } = require_webidl(); - var { getGlobalOrigin } = require_global(); - var { URLSerializer } = require_dataURL(); - var { kHeadersList, kConstruct } = require_symbols(); - var assert = __require("assert"); - var { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __require("events"); - var TransformStream = globalThis.TransformStream; - var kAbortController = Symbol("abortController"); - var requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { - signal.removeEventListener("abort", abort); - }); - - class Request { - constructor(input, init = {}) { - if (input === kConstruct) { - return; - } - webidl.argumentLengthCheck(arguments, 1, { header: "Request constructor" }); - input = webidl.converters.RequestInfo(input); - init = webidl.converters.RequestInit(init); - this[kRealm] = { - settingsObject: { - baseUrl: getGlobalOrigin(), - get origin() { - return this.baseUrl?.origin; - }, - policyContainer: makePolicyContainer() - } - }; - let request = null; - let fallbackMode = null; - const baseUrl = this[kRealm].settingsObject.baseUrl; - let signal = null; - if (typeof input === "string") { - let parsedURL; - try { - parsedURL = new URL(input, baseUrl); - } catch (err) { - throw new TypeError("Failed to parse URL from " + input, { cause: err }); - } - if (parsedURL.username || parsedURL.password) { - throw new TypeError("Request cannot be constructed from a URL that includes credentials: " + input); - } - request = makeRequest({ urlList: [parsedURL] }); - fallbackMode = "cors"; - } else { - assert(input instanceof Request); - request = input[kState]; - signal = input[kSignal]; - } - const origin = this[kRealm].settingsObject.origin; - let window = "client"; - if (request.window?.constructor?.name === "EnvironmentSettingsObject" && sameOrigin(request.window, origin)) { - window = request.window; - } - if (init.window != null) { - throw new TypeError(`'window' option '${window}' must be null`); - } - if ("window" in init) { - window = "no-window"; - } - request = makeRequest({ - method: request.method, - headersList: request.headersList, - unsafeRequest: request.unsafeRequest, - client: this[kRealm].settingsObject, - window, - priority: request.priority, - origin: request.origin, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - mode: request.mode, - credentials: request.credentials, - cache: request.cache, - redirect: request.redirect, - integrity: request.integrity, - keepalive: request.keepalive, - reloadNavigation: request.reloadNavigation, - historyNavigation: request.historyNavigation, - urlList: [...request.urlList] - }); - const initHasKey = Object.keys(init).length !== 0; - if (initHasKey) { - if (request.mode === "navigate") { - request.mode = "same-origin"; - } - request.reloadNavigation = false; - request.historyNavigation = false; - request.origin = "client"; - request.referrer = "client"; - request.referrerPolicy = ""; - request.url = request.urlList[request.urlList.length - 1]; - request.urlList = [request.url]; - } - if (init.referrer !== undefined) { - const referrer = init.referrer; - if (referrer === "") { - request.referrer = "no-referrer"; - } else { - let parsedReferrer; - try { - parsedReferrer = new URL(referrer, baseUrl); - } catch (err) { - throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }); - } - if (parsedReferrer.protocol === "about:" && parsedReferrer.hostname === "client" || origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) { - request.referrer = "client"; - } else { - request.referrer = parsedReferrer; - } - } - } - if (init.referrerPolicy !== undefined) { - request.referrerPolicy = init.referrerPolicy; - } - let mode; - if (init.mode !== undefined) { - mode = init.mode; - } else { - mode = fallbackMode; - } - if (mode === "navigate") { - throw webidl.errors.exception({ - header: "Request constructor", - message: "invalid request mode navigate." - }); - } - if (mode != null) { - request.mode = mode; - } - if (init.credentials !== undefined) { - request.credentials = init.credentials; - } - if (init.cache !== undefined) { - request.cache = init.cache; - } - if (request.cache === "only-if-cached" && request.mode !== "same-origin") { - throw new TypeError("'only-if-cached' can be set only with 'same-origin' mode"); - } - if (init.redirect !== undefined) { - request.redirect = init.redirect; - } - if (init.integrity != null) { - request.integrity = String(init.integrity); - } - if (init.keepalive !== undefined) { - request.keepalive = Boolean(init.keepalive); - } - if (init.method !== undefined) { - let method = init.method; - if (!isValidHTTPToken(method)) { - throw new TypeError(`'${method}' is not a valid HTTP method.`); - } - if (forbiddenMethodsSet.has(method.toUpperCase())) { - throw new TypeError(`'${method}' HTTP method is unsupported.`); - } - method = normalizeMethodRecord[method] ?? normalizeMethod(method); - request.method = method; - } - if (init.signal !== undefined) { - signal = init.signal; - } - this[kState] = request; - const ac = new AbortController; - this[kSignal] = ac.signal; - this[kSignal][kRealm] = this[kRealm]; - if (signal != null) { - if (!signal || typeof signal.aborted !== "boolean" || typeof signal.addEventListener !== "function") { - throw new TypeError("Failed to construct 'Request': member signal is not of type AbortSignal."); - } - if (signal.aborted) { - ac.abort(signal.reason); - } else { - this[kAbortController] = ac; - const acRef = new WeakRef(ac); - const abort = function() { - const ac2 = acRef.deref(); - if (ac2 !== undefined) { - ac2.abort(this.reason); - } - }; - try { - if (typeof getMaxListeners === "function" && getMaxListeners(signal) === defaultMaxListeners) { - setMaxListeners(100, signal); - } else if (getEventListeners(signal, "abort").length >= defaultMaxListeners) { - setMaxListeners(100, signal); - } - } catch { - } - util.addAbortListener(signal, abort); - requestFinalizer.register(ac, { signal, abort }); - } - } - this[kHeaders] = new Headers(kConstruct); - this[kHeaders][kHeadersList] = request.headersList; - this[kHeaders][kGuard] = "request"; - this[kHeaders][kRealm] = this[kRealm]; - if (mode === "no-cors") { - if (!corsSafeListedMethodsSet.has(request.method)) { - throw new TypeError(`'${request.method} is unsupported in no-cors mode.`); - } - this[kHeaders][kGuard] = "request-no-cors"; - } - if (initHasKey) { - const headersList = this[kHeaders][kHeadersList]; - const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList); - headersList.clear(); - if (headers instanceof HeadersList) { - for (const [key, val] of headers) { - headersList.append(key, val); - } - headersList.cookies = headers.cookies; - } else { - fillHeaders(this[kHeaders], headers); - } - } - const inputBody = input instanceof Request ? input[kState].body : null; - if ((init.body != null || inputBody != null) && (request.method === "GET" || request.method === "HEAD")) { - throw new TypeError("Request with GET/HEAD method cannot have body."); - } - let initBody = null; - if (init.body != null) { - const [extractedBody, contentType] = extractBody(init.body, request.keepalive); - initBody = extractedBody; - if (contentType && !this[kHeaders][kHeadersList].contains("content-type")) { - this[kHeaders].append("content-type", contentType); - } - } - const inputOrInitBody = initBody ?? inputBody; - if (inputOrInitBody != null && inputOrInitBody.source == null) { - if (initBody != null && init.duplex == null) { - throw new TypeError("RequestInit: duplex option is required when sending a body."); - } - if (request.mode !== "same-origin" && request.mode !== "cors") { - throw new TypeError('If request is made from ReadableStream, mode should be "same-origin" or "cors"'); - } - request.useCORSPreflightFlag = true; - } - let finalBody = inputOrInitBody; - if (initBody == null && inputBody != null) { - if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) { - throw new TypeError("Cannot construct a Request with a Request object that has already been used."); - } - if (!TransformStream) { - TransformStream = __require("stream/web").TransformStream; - } - const identityTransform = new TransformStream; - inputBody.stream.pipeThrough(identityTransform); - finalBody = { - source: inputBody.source, - length: inputBody.length, - stream: identityTransform.readable - }; - } - this[kState].body = finalBody; - } - get method() { - webidl.brandCheck(this, Request); - return this[kState].method; - } - get url() { - webidl.brandCheck(this, Request); - return URLSerializer(this[kState].url); - } - get headers() { - webidl.brandCheck(this, Request); - return this[kHeaders]; - } - get destination() { - webidl.brandCheck(this, Request); - return this[kState].destination; - } - get referrer() { - webidl.brandCheck(this, Request); - if (this[kState].referrer === "no-referrer") { - return ""; - } - if (this[kState].referrer === "client") { - return "about:client"; - } - return this[kState].referrer.toString(); - } - get referrerPolicy() { - webidl.brandCheck(this, Request); - return this[kState].referrerPolicy; - } - get mode() { - webidl.brandCheck(this, Request); - return this[kState].mode; - } - get credentials() { - return this[kState].credentials; - } - get cache() { - webidl.brandCheck(this, Request); - return this[kState].cache; - } - get redirect() { - webidl.brandCheck(this, Request); - return this[kState].redirect; - } - get integrity() { - webidl.brandCheck(this, Request); - return this[kState].integrity; - } - get keepalive() { - webidl.brandCheck(this, Request); - return this[kState].keepalive; - } - get isReloadNavigation() { - webidl.brandCheck(this, Request); - return this[kState].reloadNavigation; - } - get isHistoryNavigation() { - webidl.brandCheck(this, Request); - return this[kState].historyNavigation; - } - get signal() { - webidl.brandCheck(this, Request); - return this[kSignal]; - } - get body() { - webidl.brandCheck(this, Request); - return this[kState].body ? this[kState].body.stream : null; - } - get bodyUsed() { - webidl.brandCheck(this, Request); - return !!this[kState].body && util.isDisturbed(this[kState].body.stream); - } - get duplex() { - webidl.brandCheck(this, Request); - return "half"; - } - clone() { - webidl.brandCheck(this, Request); - if (this.bodyUsed || this.body?.locked) { - throw new TypeError("unusable"); - } - const clonedRequest = cloneRequest(this[kState]); - const clonedRequestObject = new Request(kConstruct); - clonedRequestObject[kState] = clonedRequest; - clonedRequestObject[kRealm] = this[kRealm]; - clonedRequestObject[kHeaders] = new Headers(kConstruct); - clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList; - clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]; - const ac = new AbortController; - if (this.signal.aborted) { - ac.abort(this.signal.reason); - } else { - util.addAbortListener(this.signal, () => { - ac.abort(this.signal.reason); - }); - } - clonedRequestObject[kSignal] = ac.signal; - return clonedRequestObject; - } - } - mixinBody(Request); - function makeRequest(init) { - const request = { - method: "GET", - localURLsOnly: false, - unsafeRequest: false, - body: null, - client: null, - reservedClient: null, - replacesClientId: "", - window: "client", - keepalive: false, - serviceWorkers: "all", - initiator: "", - destination: "", - priority: null, - origin: "client", - policyContainer: "client", - referrer: "client", - referrerPolicy: "", - mode: "no-cors", - useCORSPreflightFlag: false, - credentials: "same-origin", - useCredentials: false, - cache: "default", - redirect: "follow", - integrity: "", - cryptoGraphicsNonceMetadata: "", - parserMetadata: "", - reloadNavigation: false, - historyNavigation: false, - userActivation: false, - taintedOrigin: false, - redirectCount: 0, - responseTainting: "basic", - preventNoCacheCacheControlHeaderModification: false, - done: false, - timingAllowFailed: false, - ...init, - headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList - }; - request.url = request.urlList[0]; - return request; - } - function cloneRequest(request) { - const newRequest = makeRequest({ ...request, body: null }); - if (request.body != null) { - newRequest.body = cloneBody(request.body); - } - return newRequest; - } - Object.defineProperties(Request.prototype, { - method: kEnumerableProperty, - url: kEnumerableProperty, - headers: kEnumerableProperty, - redirect: kEnumerableProperty, - clone: kEnumerableProperty, - signal: kEnumerableProperty, - duplex: kEnumerableProperty, - destination: kEnumerableProperty, - body: kEnumerableProperty, - bodyUsed: kEnumerableProperty, - isHistoryNavigation: kEnumerableProperty, - isReloadNavigation: kEnumerableProperty, - keepalive: kEnumerableProperty, - integrity: kEnumerableProperty, - cache: kEnumerableProperty, - credentials: kEnumerableProperty, - attribute: kEnumerableProperty, - referrerPolicy: kEnumerableProperty, - referrer: kEnumerableProperty, - mode: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "Request", - configurable: true - } - }); - webidl.converters.Request = webidl.interfaceConverter(Request); - webidl.converters.RequestInfo = function(V) { - if (typeof V === "string") { - return webidl.converters.USVString(V); - } - if (V instanceof Request) { - return webidl.converters.Request(V); - } - return webidl.converters.USVString(V); - }; - webidl.converters.AbortSignal = webidl.interfaceConverter(AbortSignal); - webidl.converters.RequestInit = webidl.dictionaryConverter([ - { - key: "method", - converter: webidl.converters.ByteString - }, - { - key: "headers", - converter: webidl.converters.HeadersInit - }, - { - key: "body", - converter: webidl.nullableConverter(webidl.converters.BodyInit) - }, - { - key: "referrer", - converter: webidl.converters.USVString - }, - { - key: "referrerPolicy", - converter: webidl.converters.DOMString, - allowedValues: referrerPolicy - }, - { - key: "mode", - converter: webidl.converters.DOMString, - allowedValues: requestMode - }, - { - key: "credentials", - converter: webidl.converters.DOMString, - allowedValues: requestCredentials - }, - { - key: "cache", - converter: webidl.converters.DOMString, - allowedValues: requestCache - }, - { - key: "redirect", - converter: webidl.converters.DOMString, - allowedValues: requestRedirect - }, - { - key: "integrity", - converter: webidl.converters.DOMString - }, - { - key: "keepalive", - converter: webidl.converters.boolean - }, - { - key: "signal", - converter: webidl.nullableConverter((signal) => webidl.converters.AbortSignal(signal, { strict: false })) - }, - { - key: "window", - converter: webidl.converters.any - }, - { - key: "duplex", - converter: webidl.converters.DOMString, - allowedValues: requestDuplex - } - ]); - module.exports = { Request, makeRequest }; -}); - -// ../node_modules/undici/lib/fetch/index.js -var require_fetch = __commonJS((exports, module) => { - var { - Response, - makeNetworkError, - makeAppropriateNetworkError, - filterResponse, - makeResponse - } = require_response(); - var { Headers } = require_headers(); - var { Request, makeRequest } = require_request2(); - var zlib = __require("zlib"); - var { - bytesMatch, - makePolicyContainer, - clonePolicyContainer, - requestBadPort, - TAOCheck, - appendRequestOriginHeader, - responseLocationURL, - requestCurrentURL, - setRequestReferrerPolicyOnRedirect, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - createOpaqueTimingInfo, - appendFetchMetadata, - corsCheck, - crossOriginResourcePolicyCheck, - determineRequestsReferrer, - coarsenedSharedCurrentTime, - createDeferredPromise, - isBlobLike, - sameOrigin, - isCancelled, - isAborted, - isErrorLike, - fullyReadBody, - readableStreamClose, - isomorphicEncode, - urlIsLocal, - urlIsHttpHttpsScheme, - urlHasHttpsScheme - } = require_util2(); - var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); - var assert = __require("assert"); - var { safelyExtractBody } = require_body(); - var { - redirectStatusSet, - nullBodyStatus, - safeMethodsSet, - requestBodyHeader, - subresourceSet, - DOMException: DOMException2 - } = require_constants2(); - var { kHeadersList } = require_symbols(); - var EE = __require("events"); - var { Readable, pipeline } = __require("stream"); - var { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = require_util(); - var { dataURLProcessor, serializeAMimeType } = require_dataURL(); - var { TransformStream } = __require("stream/web"); - var { getGlobalDispatcher } = require_global2(); - var { webidl } = require_webidl(); - var { STATUS_CODES } = __require("http"); - var GET_OR_HEAD = ["GET", "HEAD"]; - var resolveObjectURL; - var ReadableStream = globalThis.ReadableStream; - - class Fetch extends EE { - constructor(dispatcher) { - super(); - this.dispatcher = dispatcher; - this.connection = null; - this.dump = false; - this.state = "ongoing"; - this.setMaxListeners(21); - } - terminate(reason) { - if (this.state !== "ongoing") { - return; - } - this.state = "terminated"; - this.connection?.destroy(reason); - this.emit("terminated", reason); - } - abort(error) { - if (this.state !== "ongoing") { - return; - } - this.state = "aborted"; - if (!error) { - error = new DOMException2("The operation was aborted.", "AbortError"); - } - this.serializedAbortReason = error; - this.connection?.destroy(error); - this.emit("terminated", error); - } - } - function fetch(input, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "globalThis.fetch" }); - const p = createDeferredPromise(); - let requestObject; - try { - requestObject = new Request(input, init); - } catch (e) { - p.reject(e); - return p.promise; - } - const request = requestObject[kState]; - if (requestObject.signal.aborted) { - abortFetch(p, request, null, requestObject.signal.reason); - return p.promise; - } - const globalObject = request.client.globalObject; - if (globalObject?.constructor?.name === "ServiceWorkerGlobalScope") { - request.serviceWorkers = "none"; - } - let responseObject = null; - const relevantRealm = null; - let locallyAborted = false; - let controller = null; - addAbortListener(requestObject.signal, () => { - locallyAborted = true; - assert(controller != null); - controller.abort(requestObject.signal.reason); - abortFetch(p, request, responseObject, requestObject.signal.reason); - }); - const handleFetchDone = (response) => finalizeAndReportTiming(response, "fetch"); - const processResponse = (response) => { - if (locallyAborted) { - return Promise.resolve(); - } - if (response.aborted) { - abortFetch(p, request, responseObject, controller.serializedAbortReason); - return Promise.resolve(); - } - if (response.type === "error") { - p.reject(Object.assign(new TypeError("fetch failed"), { cause: response.error })); - return Promise.resolve(); - } - responseObject = new Response; - responseObject[kState] = response; - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = response.headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; - p.resolve(responseObject); - }; - controller = fetching({ - request, - processResponseEndOfBody: handleFetchDone, - processResponse, - dispatcher: init.dispatcher ?? getGlobalDispatcher() - }); - return p.promise; - } - function finalizeAndReportTiming(response, initiatorType = "other") { - if (response.type === "error" && response.aborted) { - return; - } - if (!response.urlList?.length) { - return; - } - const originalURL = response.urlList[0]; - let timingInfo = response.timingInfo; - let cacheState = response.cacheState; - if (!urlIsHttpHttpsScheme(originalURL)) { - return; - } - if (timingInfo === null) { - return; - } - if (!response.timingAllowPassed) { - timingInfo = createOpaqueTimingInfo({ - startTime: timingInfo.startTime - }); - cacheState = ""; - } - timingInfo.endTime = coarsenedSharedCurrentTime(); - response.timingInfo = timingInfo; - markResourceTiming(timingInfo, originalURL, initiatorType, globalThis, cacheState); - } - function markResourceTiming(timingInfo, originalURL, initiatorType, globalThis2, cacheState) { - if (nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 2) { - performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis2, cacheState); - } - } - function abortFetch(p, request, responseObject, error) { - if (!error) { - error = new DOMException2("The operation was aborted.", "AbortError"); - } - p.reject(error); - if (request.body != null && isReadable(request.body?.stream)) { - request.body.stream.cancel(error).catch((err) => { - if (err.code === "ERR_INVALID_STATE") { - return; - } - throw err; - }); - } - if (responseObject == null) { - return; - } - const response = responseObject[kState]; - if (response.body != null && isReadable(response.body?.stream)) { - response.body.stream.cancel(error).catch((err) => { - if (err.code === "ERR_INVALID_STATE") { - return; - } - throw err; - }); - } - } - function fetching({ - request, - processRequestBodyChunkLength, - processRequestEndOfBody, - processResponse, - processResponseEndOfBody, - processResponseConsumeBody, - useParallelQueue = false, - dispatcher - }) { - let taskDestination = null; - let crossOriginIsolatedCapability = false; - if (request.client != null) { - taskDestination = request.client.globalObject; - crossOriginIsolatedCapability = request.client.crossOriginIsolatedCapability; - } - const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); - const timingInfo = createOpaqueTimingInfo({ - startTime: currenTime - }); - const fetchParams = { - controller: new Fetch(dispatcher), - request, - timingInfo, - processRequestBodyChunkLength, - processRequestEndOfBody, - processResponse, - processResponseConsumeBody, - processResponseEndOfBody, - taskDestination, - crossOriginIsolatedCapability - }; - assert(!request.body || request.body.stream); - if (request.window === "client") { - request.window = request.client?.globalObject?.constructor?.name === "Window" ? request.client : "no-window"; - } - if (request.origin === "client") { - request.origin = request.client?.origin; - } - if (request.policyContainer === "client") { - if (request.client != null) { - request.policyContainer = clonePolicyContainer(request.client.policyContainer); - } else { - request.policyContainer = makePolicyContainer(); - } - } - if (!request.headersList.contains("accept")) { - const value = "*/*"; - request.headersList.append("accept", value); - } - if (!request.headersList.contains("accept-language")) { - request.headersList.append("accept-language", "*"); - } - if (request.priority === null) { - } - if (subresourceSet.has(request.destination)) { - } - mainFetch(fetchParams).catch((err) => { - fetchParams.controller.terminate(err); - }); - return fetchParams.controller; - } - async function mainFetch(fetchParams, recursive = false) { - const request = fetchParams.request; - let response = null; - if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { - response = makeNetworkError("local URLs only"); - } - tryUpgradeRequestToAPotentiallyTrustworthyURL(request); - if (requestBadPort(request) === "blocked") { - response = makeNetworkError("bad port"); - } - if (request.referrerPolicy === "") { - request.referrerPolicy = request.policyContainer.referrerPolicy; - } - if (request.referrer !== "no-referrer") { - request.referrer = determineRequestsReferrer(request); - } - if (response === null) { - response = await (async () => { - const currentURL = requestCurrentURL(request); - if (sameOrigin(currentURL, request.url) && request.responseTainting === "basic" || currentURL.protocol === "data:" || (request.mode === "navigate" || request.mode === "websocket")) { - request.responseTainting = "basic"; - return await schemeFetch(fetchParams); - } - if (request.mode === "same-origin") { - return makeNetworkError('request mode cannot be "same-origin"'); - } - if (request.mode === "no-cors") { - if (request.redirect !== "follow") { - return makeNetworkError('redirect mode cannot be "follow" for "no-cors" request'); - } - request.responseTainting = "opaque"; - return await schemeFetch(fetchParams); - } - if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { - return makeNetworkError("URL scheme must be a HTTP(S) scheme"); - } - request.responseTainting = "cors"; - return await httpFetch(fetchParams); - })(); - } - if (recursive) { - return response; - } - if (response.status !== 0 && !response.internalResponse) { - if (request.responseTainting === "cors") { - } - if (request.responseTainting === "basic") { - response = filterResponse(response, "basic"); - } else if (request.responseTainting === "cors") { - response = filterResponse(response, "cors"); - } else if (request.responseTainting === "opaque") { - response = filterResponse(response, "opaque"); - } else { - assert(false); - } - } - let internalResponse = response.status === 0 ? response : response.internalResponse; - if (internalResponse.urlList.length === 0) { - internalResponse.urlList.push(...request.urlList); - } - if (!request.timingAllowFailed) { - response.timingAllowPassed = true; - } - if (response.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request.headers.contains("range")) { - response = internalResponse = makeNetworkError(); - } - if (response.status !== 0 && (request.method === "HEAD" || request.method === "CONNECT" || nullBodyStatus.includes(internalResponse.status))) { - internalResponse.body = null; - fetchParams.controller.dump = true; - } - if (request.integrity) { - const processBodyError = (reason) => fetchFinale(fetchParams, makeNetworkError(reason)); - if (request.responseTainting === "opaque" || response.body == null) { - processBodyError(response.error); - return; - } - const processBody = (bytes) => { - if (!bytesMatch(bytes, request.integrity)) { - processBodyError("integrity mismatch"); - return; - } - response.body = safelyExtractBody(bytes)[0]; - fetchFinale(fetchParams, response); - }; - await fullyReadBody(response.body, processBody, processBodyError); - } else { - fetchFinale(fetchParams, response); - } - } - function schemeFetch(fetchParams) { - if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { - return Promise.resolve(makeAppropriateNetworkError(fetchParams)); - } - const { request } = fetchParams; - const { protocol: scheme } = requestCurrentURL(request); - switch (scheme) { - case "about:": { - return Promise.resolve(makeNetworkError("about scheme is not supported")); - } - case "blob:": { - if (!resolveObjectURL) { - resolveObjectURL = __require("buffer").resolveObjectURL; - } - const blobURLEntry = requestCurrentURL(request); - if (blobURLEntry.search.length !== 0) { - return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource.")); - } - const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()); - if (request.method !== "GET" || !isBlobLike(blobURLEntryObject)) { - return Promise.resolve(makeNetworkError("invalid method")); - } - const bodyWithType = safelyExtractBody(blobURLEntryObject); - const body = bodyWithType[0]; - const length = isomorphicEncode(`${body.length}`); - const type = bodyWithType[1] ?? ""; - const response = makeResponse({ - statusText: "OK", - headersList: [ - ["content-length", { name: "Content-Length", value: length }], - ["content-type", { name: "Content-Type", value: type }] - ] - }); - response.body = body; - return Promise.resolve(response); - } - case "data:": { - const currentURL = requestCurrentURL(request); - const dataURLStruct = dataURLProcessor(currentURL); - if (dataURLStruct === "failure") { - return Promise.resolve(makeNetworkError("failed to fetch the data URL")); - } - const mimeType = serializeAMimeType(dataURLStruct.mimeType); - return Promise.resolve(makeResponse({ - statusText: "OK", - headersList: [ - ["content-type", { name: "Content-Type", value: mimeType }] - ], - body: safelyExtractBody(dataURLStruct.body)[0] - })); - } - case "file:": { - return Promise.resolve(makeNetworkError("not implemented... yet...")); - } - case "http:": - case "https:": { - return httpFetch(fetchParams).catch((err) => makeNetworkError(err)); - } - default: { - return Promise.resolve(makeNetworkError("unknown scheme")); - } - } - } - function finalizeResponse(fetchParams, response) { - fetchParams.request.done = true; - if (fetchParams.processResponseDone != null) { - queueMicrotask(() => fetchParams.processResponseDone(response)); - } - } - function fetchFinale(fetchParams, response) { - if (response.type === "error") { - response.urlList = [fetchParams.request.urlList[0]]; - response.timingInfo = createOpaqueTimingInfo({ - startTime: fetchParams.timingInfo.startTime - }); - } - const processResponseEndOfBody = () => { - fetchParams.request.done = true; - if (fetchParams.processResponseEndOfBody != null) { - queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); - } - }; - if (fetchParams.processResponse != null) { - queueMicrotask(() => fetchParams.processResponse(response)); - } - if (response.body == null) { - processResponseEndOfBody(); - } else { - const identityTransformAlgorithm = (chunk, controller) => { - controller.enqueue(chunk); - }; - const transformStream = new TransformStream({ - start() { - }, - transform: identityTransformAlgorithm, - flush: processResponseEndOfBody - }, { - size() { - return 1; - } - }, { - size() { - return 1; - } - }); - response.body = { stream: response.body.stream.pipeThrough(transformStream) }; - } - if (fetchParams.processResponseConsumeBody != null) { - const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes); - const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure); - if (response.body == null) { - queueMicrotask(() => processBody(null)); - } else { - return fullyReadBody(response.body, processBody, processBodyError); - } - return Promise.resolve(); - } - } - async function httpFetch(fetchParams) { - const request = fetchParams.request; - let response = null; - let actualResponse = null; - const timingInfo = fetchParams.timingInfo; - if (request.serviceWorkers === "all") { - } - if (response === null) { - if (request.redirect === "follow") { - request.serviceWorkers = "none"; - } - actualResponse = response = await httpNetworkOrCacheFetch(fetchParams); - if (request.responseTainting === "cors" && corsCheck(request, response) === "failure") { - return makeNetworkError("cors failure"); - } - if (TAOCheck(request, response) === "failure") { - request.timingAllowFailed = true; - } - } - if ((request.responseTainting === "opaque" || response.type === "opaque") && crossOriginResourcePolicyCheck(request.origin, request.client, request.destination, actualResponse) === "blocked") { - return makeNetworkError("blocked"); - } - if (redirectStatusSet.has(actualResponse.status)) { - if (request.redirect !== "manual") { - fetchParams.controller.connection.destroy(); - } - if (request.redirect === "error") { - response = makeNetworkError("unexpected redirect"); - } else if (request.redirect === "manual") { - response = actualResponse; - } else if (request.redirect === "follow") { - response = await httpRedirectFetch(fetchParams, response); - } else { - assert(false); - } - } - response.timingInfo = timingInfo; - return response; - } - function httpRedirectFetch(fetchParams, response) { - const request = fetchParams.request; - const actualResponse = response.internalResponse ? response.internalResponse : response; - let locationURL; - try { - locationURL = responseLocationURL(actualResponse, requestCurrentURL(request).hash); - if (locationURL == null) { - return response; - } - } catch (err) { - return Promise.resolve(makeNetworkError(err)); - } - if (!urlIsHttpHttpsScheme(locationURL)) { - return Promise.resolve(makeNetworkError("URL scheme must be a HTTP(S) scheme")); - } - if (request.redirectCount === 20) { - return Promise.resolve(makeNetworkError("redirect count exceeded")); - } - request.redirectCount += 1; - if (request.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request, locationURL)) { - return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"')); - } - if (request.responseTainting === "cors" && (locationURL.username || locationURL.password)) { - return Promise.resolve(makeNetworkError('URL cannot contain credentials for request mode "cors"')); - } - if (actualResponse.status !== 303 && request.body != null && request.body.source == null) { - return Promise.resolve(makeNetworkError()); - } - if ([301, 302].includes(actualResponse.status) && request.method === "POST" || actualResponse.status === 303 && !GET_OR_HEAD.includes(request.method)) { - request.method = "GET"; - request.body = null; - for (const headerName of requestBodyHeader) { - request.headersList.delete(headerName); - } - } - if (!sameOrigin(requestCurrentURL(request), locationURL)) { - request.headersList.delete("authorization"); - request.headersList.delete("proxy-authorization", true); - request.headersList.delete("cookie"); - request.headersList.delete("host"); - } - if (request.body != null) { - assert(request.body.source != null); - request.body = safelyExtractBody(request.body.source)[0]; - } - const timingInfo = fetchParams.timingInfo; - timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); - if (timingInfo.redirectStartTime === 0) { - timingInfo.redirectStartTime = timingInfo.startTime; - } - request.urlList.push(locationURL); - setRequestReferrerPolicyOnRedirect(request, actualResponse); - return mainFetch(fetchParams, true); - } - async function httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch = false, isNewConnectionFetch = false) { - const request = fetchParams.request; - let httpFetchParams = null; - let httpRequest = null; - let response = null; - const httpCache = null; - const revalidatingFlag = false; - if (request.window === "no-window" && request.redirect === "error") { - httpFetchParams = fetchParams; - httpRequest = request; - } else { - httpRequest = makeRequest(request); - httpFetchParams = { ...fetchParams }; - httpFetchParams.request = httpRequest; - } - const includeCredentials = request.credentials === "include" || request.credentials === "same-origin" && request.responseTainting === "basic"; - const contentLength = httpRequest.body ? httpRequest.body.length : null; - let contentLengthHeaderValue = null; - if (httpRequest.body == null && ["POST", "PUT"].includes(httpRequest.method)) { - contentLengthHeaderValue = "0"; - } - if (contentLength != null) { - contentLengthHeaderValue = isomorphicEncode(`${contentLength}`); - } - if (contentLengthHeaderValue != null) { - httpRequest.headersList.append("content-length", contentLengthHeaderValue); - } - if (contentLength != null && httpRequest.keepalive) { - } - if (httpRequest.referrer instanceof URL) { - httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href)); - } - appendRequestOriginHeader(httpRequest); - appendFetchMetadata(httpRequest); - if (!httpRequest.headersList.contains("user-agent")) { - httpRequest.headersList.append("user-agent", typeof esbuildDetection === "undefined" ? "undici" : "node"); - } - if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since") || httpRequest.headersList.contains("if-none-match") || httpRequest.headersList.contains("if-unmodified-since") || httpRequest.headersList.contains("if-match") || httpRequest.headersList.contains("if-range"))) { - httpRequest.cache = "no-store"; - } - if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.contains("cache-control")) { - httpRequest.headersList.append("cache-control", "max-age=0"); - } - if (httpRequest.cache === "no-store" || httpRequest.cache === "reload") { - if (!httpRequest.headersList.contains("pragma")) { - httpRequest.headersList.append("pragma", "no-cache"); - } - if (!httpRequest.headersList.contains("cache-control")) { - httpRequest.headersList.append("cache-control", "no-cache"); - } - } - if (httpRequest.headersList.contains("range")) { - httpRequest.headersList.append("accept-encoding", "identity"); - } - if (!httpRequest.headersList.contains("accept-encoding")) { - if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { - httpRequest.headersList.append("accept-encoding", "br, gzip, deflate"); - } else { - httpRequest.headersList.append("accept-encoding", "gzip, deflate"); - } - } - httpRequest.headersList.delete("host"); - if (includeCredentials) { - } - if (httpCache == null) { - httpRequest.cache = "no-store"; - } - if (httpRequest.mode !== "no-store" && httpRequest.mode !== "reload") { - } - if (response == null) { - if (httpRequest.mode === "only-if-cached") { - return makeNetworkError("only if cached"); - } - const forwardResponse = await httpNetworkFetch(httpFetchParams, includeCredentials, isNewConnectionFetch); - if (!safeMethodsSet.has(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) { - } - if (revalidatingFlag && forwardResponse.status === 304) { - } - if (response == null) { - response = forwardResponse; - } - } - response.urlList = [...httpRequest.urlList]; - if (httpRequest.headersList.contains("range")) { - response.rangeRequested = true; - } - response.requestIncludesCredentials = includeCredentials; - if (response.status === 407) { - if (request.window === "no-window") { - return makeNetworkError(); - } - if (isCancelled(fetchParams)) { - return makeAppropriateNetworkError(fetchParams); - } - return makeNetworkError("proxy authentication required"); - } - if (response.status === 421 && !isNewConnectionFetch && (request.body == null || request.body.source != null)) { - if (isCancelled(fetchParams)) { - return makeAppropriateNetworkError(fetchParams); - } - fetchParams.controller.connection.destroy(); - response = await httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch, true); - } - if (isAuthenticationFetch) { - } - return response; - } - async function httpNetworkFetch(fetchParams, includeCredentials = false, forceNewConnection = false) { - assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed); - fetchParams.controller.connection = { - abort: null, - destroyed: false, - destroy(err) { - if (!this.destroyed) { - this.destroyed = true; - this.abort?.(err ?? new DOMException2("The operation was aborted.", "AbortError")); - } - } - }; - const request = fetchParams.request; - let response = null; - const timingInfo = fetchParams.timingInfo; - const httpCache = null; - if (httpCache == null) { - request.cache = "no-store"; - } - const newConnection = forceNewConnection ? "yes" : "no"; - if (request.mode === "websocket") { - } else { - } - let requestBody = null; - if (request.body == null && fetchParams.processRequestEndOfBody) { - queueMicrotask(() => fetchParams.processRequestEndOfBody()); - } else if (request.body != null) { - const processBodyChunk = async function* (bytes) { - if (isCancelled(fetchParams)) { - return; - } - yield bytes; - fetchParams.processRequestBodyChunkLength?.(bytes.byteLength); - }; - const processEndOfBody = () => { - if (isCancelled(fetchParams)) { - return; - } - if (fetchParams.processRequestEndOfBody) { - fetchParams.processRequestEndOfBody(); - } - }; - const processBodyError = (e) => { - if (isCancelled(fetchParams)) { - return; - } - if (e.name === "AbortError") { - fetchParams.controller.abort(); - } else { - fetchParams.controller.terminate(e); - } - }; - requestBody = async function* () { - try { - for await (const bytes of request.body.stream) { - yield* processBodyChunk(bytes); - } - processEndOfBody(); - } catch (err) { - processBodyError(err); - } - }(); - } - try { - const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody }); - if (socket) { - response = makeResponse({ status, statusText, headersList, socket }); - } else { - const iterator = body[Symbol.asyncIterator](); - fetchParams.controller.next = () => iterator.next(); - response = makeResponse({ status, statusText, headersList }); - } - } catch (err) { - if (err.name === "AbortError") { - fetchParams.controller.connection.destroy(); - return makeAppropriateNetworkError(fetchParams, err); - } - return makeNetworkError(err); - } - const pullAlgorithm = () => { - fetchParams.controller.resume(); - }; - const cancelAlgorithm = (reason) => { - fetchParams.controller.abort(reason); - }; - if (!ReadableStream) { - ReadableStream = __require("stream/web").ReadableStream; - } - const stream = new ReadableStream({ - async start(controller) { - fetchParams.controller.controller = controller; - }, - async pull(controller) { - await pullAlgorithm(controller); - }, - async cancel(reason) { - await cancelAlgorithm(reason); - } - }, { - highWaterMark: 0, - size() { - return 1; - } - }); - response.body = { stream }; - fetchParams.controller.on("terminated", onAborted); - fetchParams.controller.resume = async () => { - while (true) { - let bytes; - let isFailure; - try { - const { done, value } = await fetchParams.controller.next(); - if (isAborted(fetchParams)) { - break; - } - bytes = done ? undefined : value; - } catch (err) { - if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { - bytes = undefined; - } else { - bytes = err; - isFailure = true; - } - } - if (bytes === undefined) { - readableStreamClose(fetchParams.controller.controller); - finalizeResponse(fetchParams, response); - return; - } - timingInfo.decodedBodySize += bytes?.byteLength ?? 0; - if (isFailure) { - fetchParams.controller.terminate(bytes); - return; - } - fetchParams.controller.controller.enqueue(new Uint8Array(bytes)); - if (isErrored(stream)) { - fetchParams.controller.terminate(); - return; - } - if (!fetchParams.controller.controller.desiredSize) { - return; - } - } - }; - function onAborted(reason) { - if (isAborted(fetchParams)) { - response.aborted = true; - if (isReadable(stream)) { - fetchParams.controller.controller.error(fetchParams.controller.serializedAbortReason); - } - } else { - if (isReadable(stream)) { - fetchParams.controller.controller.error(new TypeError("terminated", { - cause: isErrorLike(reason) ? reason : undefined - })); - } - } - fetchParams.controller.connection.destroy(); - } - return response; - async function dispatch({ body }) { - const url = requestCurrentURL(request); - const agent = fetchParams.controller.dispatcher; - return new Promise((resolve, reject) => agent.dispatch({ - path: url.pathname + url.search, - origin: url.origin, - method: request.method, - body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body, - headers: request.headersList.entries, - maxRedirections: 0, - upgrade: request.mode === "websocket" ? "websocket" : undefined - }, { - body: null, - abort: null, - onConnect(abort) { - const { connection } = fetchParams.controller; - if (connection.destroyed) { - abort(new DOMException2("The operation was aborted.", "AbortError")); - } else { - fetchParams.controller.on("terminated", abort); - this.abort = connection.abort = abort; - } - }, - onHeaders(status, headersList, resume, statusText) { - if (status < 200) { - return; - } - let codings = []; - let location = ""; - const headers = new Headers; - if (Array.isArray(headersList)) { - for (let n = 0;n < headersList.length; n += 2) { - const key = headersList[n + 0].toString("latin1"); - const val = headersList[n + 1].toString("latin1"); - if (key.toLowerCase() === "content-encoding") { - codings = val.toLowerCase().split(",").map((x) => x.trim()); - } else if (key.toLowerCase() === "location") { - location = val; - } - headers[kHeadersList].append(key, val); - } - } else { - const keys = Object.keys(headersList); - for (const key of keys) { - const val = headersList[key]; - if (key.toLowerCase() === "content-encoding") { - codings = val.toLowerCase().split(",").map((x) => x.trim()).reverse(); - } else if (key.toLowerCase() === "location") { - location = val; - } - headers[kHeadersList].append(key, val); - } - } - this.body = new Readable({ read: resume }); - const decoders = []; - const willFollow = request.redirect === "follow" && location && redirectStatusSet.has(status); - if (request.method !== "HEAD" && request.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) { - for (const coding of codings) { - if (coding === "x-gzip" || coding === "gzip") { - decoders.push(zlib.createGunzip({ - flush: zlib.constants.Z_SYNC_FLUSH, - finishFlush: zlib.constants.Z_SYNC_FLUSH - })); - } else if (coding === "deflate") { - decoders.push(zlib.createInflate()); - } else if (coding === "br") { - decoders.push(zlib.createBrotliDecompress()); - } else { - decoders.length = 0; - break; - } - } - } - resolve({ - status, - statusText, - headersList: headers[kHeadersList], - body: decoders.length ? pipeline(this.body, ...decoders, () => { - }) : this.body.on("error", () => { - }) - }); - return true; - }, - onData(chunk) { - if (fetchParams.controller.dump) { - return; - } - const bytes = chunk; - timingInfo.encodedBodySize += bytes.byteLength; - return this.body.push(bytes); - }, - onComplete() { - if (this.abort) { - fetchParams.controller.off("terminated", this.abort); - } - fetchParams.controller.ended = true; - this.body.push(null); - }, - onError(error) { - if (this.abort) { - fetchParams.controller.off("terminated", this.abort); - } - this.body?.destroy(error); - fetchParams.controller.terminate(error); - reject(error); - }, - onUpgrade(status, headersList, socket) { - if (status !== 101) { - return; - } - const headers = new Headers; - for (let n = 0;n < headersList.length; n += 2) { - const key = headersList[n + 0].toString("latin1"); - const val = headersList[n + 1].toString("latin1"); - headers[kHeadersList].append(key, val); - } - resolve({ - status, - statusText: STATUS_CODES[status], - headersList: headers[kHeadersList], - socket - }); - return true; - } - })); - } - } - module.exports = { - fetch, - Fetch, - fetching, - finalizeAndReportTiming - }; -}); - -// ../node_modules/undici/lib/fileapi/symbols.js -var require_symbols3 = __commonJS((exports, module) => { - module.exports = { - kState: Symbol("FileReader state"), - kResult: Symbol("FileReader result"), - kError: Symbol("FileReader error"), - kLastProgressEventFired: Symbol("FileReader last progress event fired timestamp"), - kEvents: Symbol("FileReader events"), - kAborted: Symbol("FileReader aborted") - }; -}); - -// ../node_modules/undici/lib/fileapi/progressevent.js -var require_progressevent = __commonJS((exports, module) => { - var { webidl } = require_webidl(); - var kState = Symbol("ProgressEvent state"); - - class ProgressEvent extends Event { - constructor(type, eventInitDict = {}) { - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}); - super(type, eventInitDict); - this[kState] = { - lengthComputable: eventInitDict.lengthComputable, - loaded: eventInitDict.loaded, - total: eventInitDict.total - }; - } - get lengthComputable() { - webidl.brandCheck(this, ProgressEvent); - return this[kState].lengthComputable; - } - get loaded() { - webidl.brandCheck(this, ProgressEvent); - return this[kState].loaded; - } - get total() { - webidl.brandCheck(this, ProgressEvent); - return this[kState].total; - } - } - webidl.converters.ProgressEventInit = webidl.dictionaryConverter([ - { - key: "lengthComputable", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "loaded", - converter: webidl.converters["unsigned long long"], - defaultValue: 0 - }, - { - key: "total", - converter: webidl.converters["unsigned long long"], - defaultValue: 0 - }, - { - key: "bubbles", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "cancelable", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "composed", - converter: webidl.converters.boolean, - defaultValue: false - } - ]); - module.exports = { - ProgressEvent - }; -}); - -// ../node_modules/undici/lib/fileapi/encoding.js -var require_encoding = __commonJS((exports, module) => { - function getEncoding(label) { - if (!label) { - return "failure"; - } - switch (label.trim().toLowerCase()) { - case "unicode-1-1-utf-8": - case "unicode11utf8": - case "unicode20utf8": - case "utf-8": - case "utf8": - case "x-unicode20utf8": - return "UTF-8"; - case "866": - case "cp866": - case "csibm866": - case "ibm866": - return "IBM866"; - case "csisolatin2": - case "iso-8859-2": - case "iso-ir-101": - case "iso8859-2": - case "iso88592": - case "iso_8859-2": - case "iso_8859-2:1987": - case "l2": - case "latin2": - return "ISO-8859-2"; - case "csisolatin3": - case "iso-8859-3": - case "iso-ir-109": - case "iso8859-3": - case "iso88593": - case "iso_8859-3": - case "iso_8859-3:1988": - case "l3": - case "latin3": - return "ISO-8859-3"; - case "csisolatin4": - case "iso-8859-4": - case "iso-ir-110": - case "iso8859-4": - case "iso88594": - case "iso_8859-4": - case "iso_8859-4:1988": - case "l4": - case "latin4": - return "ISO-8859-4"; - case "csisolatincyrillic": - case "cyrillic": - case "iso-8859-5": - case "iso-ir-144": - case "iso8859-5": - case "iso88595": - case "iso_8859-5": - case "iso_8859-5:1988": - return "ISO-8859-5"; - case "arabic": - case "asmo-708": - case "csiso88596e": - case "csiso88596i": - case "csisolatinarabic": - case "ecma-114": - case "iso-8859-6": - case "iso-8859-6-e": - case "iso-8859-6-i": - case "iso-ir-127": - case "iso8859-6": - case "iso88596": - case "iso_8859-6": - case "iso_8859-6:1987": - return "ISO-8859-6"; - case "csisolatingreek": - case "ecma-118": - case "elot_928": - case "greek": - case "greek8": - case "iso-8859-7": - case "iso-ir-126": - case "iso8859-7": - case "iso88597": - case "iso_8859-7": - case "iso_8859-7:1987": - case "sun_eu_greek": - return "ISO-8859-7"; - case "csiso88598e": - case "csisolatinhebrew": - case "hebrew": - case "iso-8859-8": - case "iso-8859-8-e": - case "iso-ir-138": - case "iso8859-8": - case "iso88598": - case "iso_8859-8": - case "iso_8859-8:1988": - case "visual": - return "ISO-8859-8"; - case "csiso88598i": - case "iso-8859-8-i": - case "logical": - return "ISO-8859-8-I"; - case "csisolatin6": - case "iso-8859-10": - case "iso-ir-157": - case "iso8859-10": - case "iso885910": - case "l6": - case "latin6": - return "ISO-8859-10"; - case "iso-8859-13": - case "iso8859-13": - case "iso885913": - return "ISO-8859-13"; - case "iso-8859-14": - case "iso8859-14": - case "iso885914": - return "ISO-8859-14"; - case "csisolatin9": - case "iso-8859-15": - case "iso8859-15": - case "iso885915": - case "iso_8859-15": - case "l9": - return "ISO-8859-15"; - case "iso-8859-16": - return "ISO-8859-16"; - case "cskoi8r": - case "koi": - case "koi8": - case "koi8-r": - case "koi8_r": - return "KOI8-R"; - case "koi8-ru": - case "koi8-u": - return "KOI8-U"; - case "csmacintosh": - case "mac": - case "macintosh": - case "x-mac-roman": - return "macintosh"; - case "iso-8859-11": - case "iso8859-11": - case "iso885911": - case "tis-620": - case "windows-874": - return "windows-874"; - case "cp1250": - case "windows-1250": - case "x-cp1250": - return "windows-1250"; - case "cp1251": - case "windows-1251": - case "x-cp1251": - return "windows-1251"; - case "ansi_x3.4-1968": - case "ascii": - case "cp1252": - case "cp819": - case "csisolatin1": - case "ibm819": - case "iso-8859-1": - case "iso-ir-100": - case "iso8859-1": - case "iso88591": - case "iso_8859-1": - case "iso_8859-1:1987": - case "l1": - case "latin1": - case "us-ascii": - case "windows-1252": - case "x-cp1252": - return "windows-1252"; - case "cp1253": - case "windows-1253": - case "x-cp1253": - return "windows-1253"; - case "cp1254": - case "csisolatin5": - case "iso-8859-9": - case "iso-ir-148": - case "iso8859-9": - case "iso88599": - case "iso_8859-9": - case "iso_8859-9:1989": - case "l5": - case "latin5": - case "windows-1254": - case "x-cp1254": - return "windows-1254"; - case "cp1255": - case "windows-1255": - case "x-cp1255": - return "windows-1255"; - case "cp1256": - case "windows-1256": - case "x-cp1256": - return "windows-1256"; - case "cp1257": - case "windows-1257": - case "x-cp1257": - return "windows-1257"; - case "cp1258": - case "windows-1258": - case "x-cp1258": - return "windows-1258"; - case "x-mac-cyrillic": - case "x-mac-ukrainian": - return "x-mac-cyrillic"; - case "chinese": - case "csgb2312": - case "csiso58gb231280": - case "gb2312": - case "gb_2312": - case "gb_2312-80": - case "gbk": - case "iso-ir-58": - case "x-gbk": - return "GBK"; - case "gb18030": - return "gb18030"; - case "big5": - case "big5-hkscs": - case "cn-big5": - case "csbig5": - case "x-x-big5": - return "Big5"; - case "cseucpkdfmtjapanese": - case "euc-jp": - case "x-euc-jp": - return "EUC-JP"; - case "csiso2022jp": - case "iso-2022-jp": - return "ISO-2022-JP"; - case "csshiftjis": - case "ms932": - case "ms_kanji": - case "shift-jis": - case "shift_jis": - case "sjis": - case "windows-31j": - case "x-sjis": - return "Shift_JIS"; - case "cseuckr": - case "csksc56011987": - case "euc-kr": - case "iso-ir-149": - case "korean": - case "ks_c_5601-1987": - case "ks_c_5601-1989": - case "ksc5601": - case "ksc_5601": - case "windows-949": - return "EUC-KR"; - case "csiso2022kr": - case "hz-gb-2312": - case "iso-2022-cn": - case "iso-2022-cn-ext": - case "iso-2022-kr": - case "replacement": - return "replacement"; - case "unicodefffe": - case "utf-16be": - return "UTF-16BE"; - case "csunicode": - case "iso-10646-ucs-2": - case "ucs-2": - case "unicode": - case "unicodefeff": - case "utf-16": - case "utf-16le": - return "UTF-16LE"; - case "x-user-defined": - return "x-user-defined"; - default: - return "failure"; - } - } - module.exports = { - getEncoding - }; -}); - -// ../node_modules/undici/lib/fileapi/util.js -var require_util4 = __commonJS((exports, module) => { - var { - kState, - kError, - kResult, - kAborted, - kLastProgressEventFired - } = require_symbols3(); - var { ProgressEvent } = require_progressevent(); - var { getEncoding } = require_encoding(); - var { DOMException: DOMException2 } = require_constants2(); - var { serializeAMimeType, parseMIMEType } = require_dataURL(); - var { types } = __require("util"); - var { StringDecoder } = __require("string_decoder"); - var { btoa } = __require("buffer"); - var staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false - }; - function readOperation(fr, blob, type, encodingName) { - if (fr[kState] === "loading") { - throw new DOMException2("Invalid state", "InvalidStateError"); - } - fr[kState] = "loading"; - fr[kResult] = null; - fr[kError] = null; - const stream = blob.stream(); - const reader = stream.getReader(); - const bytes = []; - let chunkPromise = reader.read(); - let isFirstChunk = true; - (async () => { - while (!fr[kAborted]) { - try { - const { done, value } = await chunkPromise; - if (isFirstChunk && !fr[kAborted]) { - queueMicrotask(() => { - fireAProgressEvent("loadstart", fr); - }); - } - isFirstChunk = false; - if (!done && types.isUint8Array(value)) { - bytes.push(value); - if ((fr[kLastProgressEventFired] === undefined || Date.now() - fr[kLastProgressEventFired] >= 50) && !fr[kAborted]) { - fr[kLastProgressEventFired] = Date.now(); - queueMicrotask(() => { - fireAProgressEvent("progress", fr); - }); - } - chunkPromise = reader.read(); - } else if (done) { - queueMicrotask(() => { - fr[kState] = "done"; - try { - const result = packageData(bytes, type, blob.type, encodingName); - if (fr[kAborted]) { - return; - } - fr[kResult] = result; - fireAProgressEvent("load", fr); - } catch (error) { - fr[kError] = error; - fireAProgressEvent("error", fr); - } - if (fr[kState] !== "loading") { - fireAProgressEvent("loadend", fr); - } - }); - break; - } - } catch (error) { - if (fr[kAborted]) { - return; - } - queueMicrotask(() => { - fr[kState] = "done"; - fr[kError] = error; - fireAProgressEvent("error", fr); - if (fr[kState] !== "loading") { - fireAProgressEvent("loadend", fr); - } - }); - break; - } - } - })(); - } - function fireAProgressEvent(e, reader) { - const event = new ProgressEvent(e, { - bubbles: false, - cancelable: false - }); - reader.dispatchEvent(event); - } - function packageData(bytes, type, mimeType, encodingName) { - switch (type) { - case "DataURL": { - let dataURL = "data:"; - const parsed = parseMIMEType(mimeType || "application/octet-stream"); - if (parsed !== "failure") { - dataURL += serializeAMimeType(parsed); - } - dataURL += ";base64,"; - const decoder = new StringDecoder("latin1"); - for (const chunk of bytes) { - dataURL += btoa(decoder.write(chunk)); - } - dataURL += btoa(decoder.end()); - return dataURL; - } - case "Text": { - let encoding = "failure"; - if (encodingName) { - encoding = getEncoding(encodingName); - } - if (encoding === "failure" && mimeType) { - const type2 = parseMIMEType(mimeType); - if (type2 !== "failure") { - encoding = getEncoding(type2.parameters.get("charset")); - } - } - if (encoding === "failure") { - encoding = "UTF-8"; - } - return decode(bytes, encoding); - } - case "ArrayBuffer": { - const sequence = combineByteSequences(bytes); - return sequence.buffer; - } - case "BinaryString": { - let binaryString = ""; - const decoder = new StringDecoder("latin1"); - for (const chunk of bytes) { - binaryString += decoder.write(chunk); - } - binaryString += decoder.end(); - return binaryString; - } - } - } - function decode(ioQueue, encoding) { - const bytes = combineByteSequences(ioQueue); - const BOMEncoding = BOMSniffing(bytes); - let slice = 0; - if (BOMEncoding !== null) { - encoding = BOMEncoding; - slice = BOMEncoding === "UTF-8" ? 3 : 2; - } - const sliced = bytes.slice(slice); - return new TextDecoder(encoding).decode(sliced); - } - function BOMSniffing(ioQueue) { - const [a, b, c] = ioQueue; - if (a === 239 && b === 187 && c === 191) { - return "UTF-8"; - } else if (a === 254 && b === 255) { - return "UTF-16BE"; - } else if (a === 255 && b === 254) { - return "UTF-16LE"; - } - return null; - } - function combineByteSequences(sequences) { - const size = sequences.reduce((a, b) => { - return a + b.byteLength; - }, 0); - let offset = 0; - return sequences.reduce((a, b) => { - a.set(b, offset); - offset += b.byteLength; - return a; - }, new Uint8Array(size)); - } - module.exports = { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent - }; -}); - -// ../node_modules/undici/lib/fileapi/filereader.js -var require_filereader = __commonJS((exports, module) => { - var { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent - } = require_util4(); - var { - kState, - kError, - kResult, - kEvents, - kAborted - } = require_symbols3(); - var { webidl } = require_webidl(); - var { kEnumerableProperty } = require_util(); - - class FileReader extends EventTarget { - constructor() { - super(); - this[kState] = "empty"; - this[kResult] = null; - this[kError] = null; - this[kEvents] = { - loadend: null, - error: null, - abort: null, - load: null, - progress: null, - loadstart: null - }; - } - readAsArrayBuffer(blob) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsArrayBuffer" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "ArrayBuffer"); - } - readAsBinaryString(blob) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsBinaryString" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "BinaryString"); - } - readAsText(blob, encoding = undefined) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsText" }); - blob = webidl.converters.Blob(blob, { strict: false }); - if (encoding !== undefined) { - encoding = webidl.converters.DOMString(encoding); - } - readOperation(this, blob, "Text", encoding); - } - readAsDataURL(blob) { - webidl.brandCheck(this, FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsDataURL" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "DataURL"); - } - abort() { - if (this[kState] === "empty" || this[kState] === "done") { - this[kResult] = null; - return; - } - if (this[kState] === "loading") { - this[kState] = "done"; - this[kResult] = null; - } - this[kAborted] = true; - fireAProgressEvent("abort", this); - if (this[kState] !== "loading") { - fireAProgressEvent("loadend", this); - } - } - get readyState() { - webidl.brandCheck(this, FileReader); - switch (this[kState]) { - case "empty": - return this.EMPTY; - case "loading": - return this.LOADING; - case "done": - return this.DONE; - } - } - get result() { - webidl.brandCheck(this, FileReader); - return this[kResult]; - } - get error() { - webidl.brandCheck(this, FileReader); - return this[kError]; - } - get onloadend() { - webidl.brandCheck(this, FileReader); - return this[kEvents].loadend; - } - set onloadend(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].loadend) { - this.removeEventListener("loadend", this[kEvents].loadend); - } - if (typeof fn === "function") { - this[kEvents].loadend = fn; - this.addEventListener("loadend", fn); - } else { - this[kEvents].loadend = null; - } - } - get onerror() { - webidl.brandCheck(this, FileReader); - return this[kEvents].error; - } - set onerror(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].error) { - this.removeEventListener("error", this[kEvents].error); - } - if (typeof fn === "function") { - this[kEvents].error = fn; - this.addEventListener("error", fn); - } else { - this[kEvents].error = null; - } - } - get onloadstart() { - webidl.brandCheck(this, FileReader); - return this[kEvents].loadstart; - } - set onloadstart(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].loadstart) { - this.removeEventListener("loadstart", this[kEvents].loadstart); - } - if (typeof fn === "function") { - this[kEvents].loadstart = fn; - this.addEventListener("loadstart", fn); - } else { - this[kEvents].loadstart = null; - } - } - get onprogress() { - webidl.brandCheck(this, FileReader); - return this[kEvents].progress; - } - set onprogress(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].progress) { - this.removeEventListener("progress", this[kEvents].progress); - } - if (typeof fn === "function") { - this[kEvents].progress = fn; - this.addEventListener("progress", fn); - } else { - this[kEvents].progress = null; - } - } - get onload() { - webidl.brandCheck(this, FileReader); - return this[kEvents].load; - } - set onload(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].load) { - this.removeEventListener("load", this[kEvents].load); - } - if (typeof fn === "function") { - this[kEvents].load = fn; - this.addEventListener("load", fn); - } else { - this[kEvents].load = null; - } - } - get onabort() { - webidl.brandCheck(this, FileReader); - return this[kEvents].abort; - } - set onabort(fn) { - webidl.brandCheck(this, FileReader); - if (this[kEvents].abort) { - this.removeEventListener("abort", this[kEvents].abort); - } - if (typeof fn === "function") { - this[kEvents].abort = fn; - this.addEventListener("abort", fn); - } else { - this[kEvents].abort = null; - } - } - } - FileReader.EMPTY = FileReader.prototype.EMPTY = 0; - FileReader.LOADING = FileReader.prototype.LOADING = 1; - FileReader.DONE = FileReader.prototype.DONE = 2; - Object.defineProperties(FileReader.prototype, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors, - readAsArrayBuffer: kEnumerableProperty, - readAsBinaryString: kEnumerableProperty, - readAsText: kEnumerableProperty, - readAsDataURL: kEnumerableProperty, - abort: kEnumerableProperty, - readyState: kEnumerableProperty, - result: kEnumerableProperty, - error: kEnumerableProperty, - onloadstart: kEnumerableProperty, - onprogress: kEnumerableProperty, - onload: kEnumerableProperty, - onabort: kEnumerableProperty, - onerror: kEnumerableProperty, - onloadend: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "FileReader", - writable: false, - enumerable: false, - configurable: true - } - }); - Object.defineProperties(FileReader, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors - }); - module.exports = { - FileReader - }; -}); - -// ../node_modules/undici/lib/cache/symbols.js -var require_symbols4 = __commonJS((exports, module) => { - module.exports = { - kConstruct: require_symbols().kConstruct - }; -}); - -// ../node_modules/undici/lib/cache/util.js -var require_util5 = __commonJS((exports, module) => { - var assert = __require("assert"); - var { URLSerializer } = require_dataURL(); - var { isValidHeaderName } = require_util2(); - function urlEquals(A, B, excludeFragment = false) { - const serializedA = URLSerializer(A, excludeFragment); - const serializedB = URLSerializer(B, excludeFragment); - return serializedA === serializedB; - } - function fieldValues(header) { - assert(header !== null); - const values = []; - for (let value of header.split(",")) { - value = value.trim(); - if (!value.length) { - continue; - } else if (!isValidHeaderName(value)) { - continue; - } - values.push(value); - } - return values; - } - module.exports = { - urlEquals, - fieldValues - }; -}); - -// ../node_modules/undici/lib/cache/cache.js -var require_cache = __commonJS((exports, module) => { - var { kConstruct } = require_symbols4(); - var { urlEquals, fieldValues: getFieldValues } = require_util5(); - var { kEnumerableProperty, isDisturbed } = require_util(); - var { kHeadersList } = require_symbols(); - var { webidl } = require_webidl(); - var { Response, cloneResponse } = require_response(); - var { Request } = require_request2(); - var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); - var { fetching } = require_fetch(); - var { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require_util2(); - var assert = __require("assert"); - var { getGlobalDispatcher } = require_global2(); - - class Cache { - #relevantRequestResponseList; - constructor() { - if (arguments[0] !== kConstruct) { - webidl.illegalConstructor(); - } - this.#relevantRequestResponseList = arguments[1]; - } - async match(request, options = {}) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.match" }); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); - const p = await this.matchAll(request, options); - if (p.length === 0) { - return; - } - return p[0]; - } - async matchAll(request = undefined, options = {}) { - webidl.brandCheck(this, Cache); - if (request !== undefined) - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); - let r = null; - if (request !== undefined) { - if (request instanceof Request) { - r = request[kState]; - if (r.method !== "GET" && !options.ignoreMethod) { - return []; - } - } else if (typeof request === "string") { - r = new Request(request)[kState]; - } - } - const responses = []; - if (request === undefined) { - for (const requestResponse of this.#relevantRequestResponseList) { - responses.push(requestResponse[1]); - } - } else { - const requestResponses = this.#queryCache(r, options); - for (const requestResponse of requestResponses) { - responses.push(requestResponse[1]); - } - } - const responseList = []; - for (const response of responses) { - const responseObject = new Response(response.body?.source ?? null); - const body = responseObject[kState].body; - responseObject[kState] = response; - responseObject[kState].body = body; - responseObject[kHeaders][kHeadersList] = response.headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseList.push(responseObject); - } - return Object.freeze(responseList); - } - async add(request) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.add" }); - request = webidl.converters.RequestInfo(request); - const requests = [request]; - const responseArrayPromise = this.addAll(requests); - return await responseArrayPromise; - } - async addAll(requests) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.addAll" }); - requests = webidl.converters["sequence"](requests); - const responsePromises = []; - const requestList = []; - for (const request of requests) { - if (typeof request === "string") { - continue; - } - const r = request[kState]; - if (!urlIsHttpHttpsScheme(r.url) || r.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.addAll", - message: "Expected http/s scheme when method is not GET." - }); - } - } - const fetchControllers = []; - for (const request of requests) { - const r = new Request(request)[kState]; - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: "Cache.addAll", - message: "Expected http/s scheme." - }); - } - r.initiator = "fetch"; - r.destination = "subresource"; - requestList.push(r); - const responsePromise = createDeferredPromise(); - fetchControllers.push(fetching({ - request: r, - dispatcher: getGlobalDispatcher(), - processResponse(response) { - if (response.type === "error" || response.status === 206 || response.status < 200 || response.status > 299) { - responsePromise.reject(webidl.errors.exception({ - header: "Cache.addAll", - message: "Received an invalid status code or the request failed." - })); - } else if (response.headersList.contains("vary")) { - const fieldValues = getFieldValues(response.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - responsePromise.reject(webidl.errors.exception({ - header: "Cache.addAll", - message: "invalid vary field value" - })); - for (const controller of fetchControllers) { - controller.abort(); - } - return; - } - } - } - }, - processResponseEndOfBody(response) { - if (response.aborted) { - responsePromise.reject(new DOMException("aborted", "AbortError")); - return; - } - responsePromise.resolve(response); - } - })); - responsePromises.push(responsePromise.promise); - } - const p = Promise.all(responsePromises); - const responses = await p; - const operations = []; - let index = 0; - for (const response of responses) { - const operation = { - type: "put", - request: requestList[index], - response - }; - operations.push(operation); - index++; - } - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - try { - this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; - } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(undefined); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; - } - async put(request, response) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 2, { header: "Cache.put" }); - request = webidl.converters.RequestInfo(request); - response = webidl.converters.Response(response); - let innerRequest = null; - if (request instanceof Request) { - innerRequest = request[kState]; - } else { - innerRequest = new Request(request)[kState]; - } - if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Expected an http/s scheme when method is not GET" - }); - } - const innerResponse = response[kState]; - if (innerResponse.status === 206) { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Got 206 status" - }); - } - if (innerResponse.headersList.contains("vary")) { - const fieldValues = getFieldValues(innerResponse.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Got * vary field value" - }); - } - } - } - if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Response body is locked or disturbed" - }); - } - const clonedResponse = cloneResponse(innerResponse); - const bodyReadPromise = createDeferredPromise(); - if (innerResponse.body != null) { - const stream = innerResponse.body.stream; - const reader = stream.getReader(); - readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject); - } else { - bodyReadPromise.resolve(undefined); - } - const operations = []; - const operation = { - type: "put", - request: innerRequest, - response: clonedResponse - }; - operations.push(operation); - const bytes = await bodyReadPromise.promise; - if (clonedResponse.body != null) { - clonedResponse.body.source = bytes; - } - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - try { - this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; - } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; - } - async delete(request, options = {}) { - webidl.brandCheck(this, Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.delete" }); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); - let r = null; - if (request instanceof Request) { - r = request[kState]; - if (r.method !== "GET" && !options.ignoreMethod) { - return false; - } - } else { - assert(typeof request === "string"); - r = new Request(request)[kState]; - } - const operations = []; - const operation = { - type: "delete", - request: r, - options - }; - operations.push(operation); - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - let requestResponses; - try { - requestResponses = this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; - } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(!!requestResponses?.length); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; - } - async keys(request = undefined, options = {}) { - webidl.brandCheck(this, Cache); - if (request !== undefined) - request = webidl.converters.RequestInfo(request); - options = webidl.converters.CacheQueryOptions(options); - let r = null; - if (request !== undefined) { - if (request instanceof Request) { - r = request[kState]; - if (r.method !== "GET" && !options.ignoreMethod) { - return []; - } - } else if (typeof request === "string") { - r = new Request(request)[kState]; - } - } - const promise = createDeferredPromise(); - const requests = []; - if (request === undefined) { - for (const requestResponse of this.#relevantRequestResponseList) { - requests.push(requestResponse[0]); - } - } else { - const requestResponses = this.#queryCache(r, options); - for (const requestResponse of requestResponses) { - requests.push(requestResponse[0]); - } - } - queueMicrotask(() => { - const requestList = []; - for (const request2 of requests) { - const requestObject = new Request("https://a"); - requestObject[kState] = request2; - requestObject[kHeaders][kHeadersList] = request2.headersList; - requestObject[kHeaders][kGuard] = "immutable"; - requestObject[kRealm] = request2.client; - requestList.push(requestObject); - } - promise.resolve(Object.freeze(requestList)); - }); - return promise.promise; - } - #batchCacheOperations(operations) { - const cache = this.#relevantRequestResponseList; - const backupCache = [...cache]; - const addedItems = []; - const resultList = []; - try { - for (const operation of operations) { - if (operation.type !== "delete" && operation.type !== "put") { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: 'operation type does not match "delete" or "put"' - }); - } - if (operation.type === "delete" && operation.response != null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "delete operation should not have an associated response" - }); - } - if (this.#queryCache(operation.request, operation.options, addedItems).length) { - throw new DOMException("???", "InvalidStateError"); - } - let requestResponses; - if (operation.type === "delete") { - requestResponses = this.#queryCache(operation.request, operation.options); - if (requestResponses.length === 0) { - return []; - } - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse); - assert(idx !== -1); - cache.splice(idx, 1); - } - } else if (operation.type === "put") { - if (operation.response == null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "put operation should have an associated response" - }); - } - const r = operation.request; - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "expected http or https scheme" - }); - } - if (r.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "not get method" - }); - } - if (operation.options != null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "options must not be defined" - }); - } - requestResponses = this.#queryCache(operation.request); - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse); - assert(idx !== -1); - cache.splice(idx, 1); - } - cache.push([operation.request, operation.response]); - addedItems.push([operation.request, operation.response]); - } - resultList.push([operation.request, operation.response]); - } - return resultList; - } catch (e) { - this.#relevantRequestResponseList.length = 0; - this.#relevantRequestResponseList = backupCache; - throw e; - } - } - #queryCache(requestQuery, options, targetStorage) { - const resultList = []; - const storage = targetStorage ?? this.#relevantRequestResponseList; - for (const requestResponse of storage) { - const [cachedRequest, cachedResponse] = requestResponse; - if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { - resultList.push(requestResponse); - } - } - return resultList; - } - #requestMatchesCachedItem(requestQuery, request, response = null, options) { - const queryURL = new URL(requestQuery.url); - const cachedURL = new URL(request.url); - if (options?.ignoreSearch) { - cachedURL.search = ""; - queryURL.search = ""; - } - if (!urlEquals(queryURL, cachedURL, true)) { - return false; - } - if (response == null || options?.ignoreVary || !response.headersList.contains("vary")) { - return true; - } - const fieldValues = getFieldValues(response.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - return false; - } - const requestValue = request.headersList.get(fieldValue); - const queryValue = requestQuery.headersList.get(fieldValue); - if (requestValue !== queryValue) { - return false; - } - } - return true; - } - } - Object.defineProperties(Cache.prototype, { - [Symbol.toStringTag]: { - value: "Cache", - configurable: true - }, - match: kEnumerableProperty, - matchAll: kEnumerableProperty, - add: kEnumerableProperty, - addAll: kEnumerableProperty, - put: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty - }); - var cacheQueryOptionConverters = [ - { - key: "ignoreSearch", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "ignoreMethod", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "ignoreVary", - converter: webidl.converters.boolean, - defaultValue: false - } - ]; - webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters); - webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ - ...cacheQueryOptionConverters, - { - key: "cacheName", - converter: webidl.converters.DOMString - } - ]); - webidl.converters.Response = webidl.interfaceConverter(Response); - webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.RequestInfo); - module.exports = { - Cache - }; -}); - -// ../node_modules/undici/lib/cache/cachestorage.js -var require_cachestorage = __commonJS((exports, module) => { - var { kConstruct } = require_symbols4(); - var { Cache } = require_cache(); - var { webidl } = require_webidl(); - var { kEnumerableProperty } = require_util(); - - class CacheStorage { - #caches = new Map; - constructor() { - if (arguments[0] !== kConstruct) { - webidl.illegalConstructor(); - } - } - async match(request, options = {}) { - webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.match" }); - request = webidl.converters.RequestInfo(request); - options = webidl.converters.MultiCacheQueryOptions(options); - if (options.cacheName != null) { - if (this.#caches.has(options.cacheName)) { - const cacheList = this.#caches.get(options.cacheName); - const cache = new Cache(kConstruct, cacheList); - return await cache.match(request, options); - } - } else { - for (const cacheList of this.#caches.values()) { - const cache = new Cache(kConstruct, cacheList); - const response = await cache.match(request, options); - if (response !== undefined) { - return response; - } - } - } - } - async has(cacheName) { - webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.has" }); - cacheName = webidl.converters.DOMString(cacheName); - return this.#caches.has(cacheName); - } - async open(cacheName) { - webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.open" }); - cacheName = webidl.converters.DOMString(cacheName); - if (this.#caches.has(cacheName)) { - const cache2 = this.#caches.get(cacheName); - return new Cache(kConstruct, cache2); - } - const cache = []; - this.#caches.set(cacheName, cache); - return new Cache(kConstruct, cache); - } - async delete(cacheName) { - webidl.brandCheck(this, CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.delete" }); - cacheName = webidl.converters.DOMString(cacheName); - return this.#caches.delete(cacheName); - } - async keys() { - webidl.brandCheck(this, CacheStorage); - const keys = this.#caches.keys(); - return [...keys]; - } - } - Object.defineProperties(CacheStorage.prototype, { - [Symbol.toStringTag]: { - value: "CacheStorage", - configurable: true - }, - match: kEnumerableProperty, - has: kEnumerableProperty, - open: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty - }); - module.exports = { - CacheStorage - }; -}); - -// ../node_modules/undici/lib/cookies/constants.js -var require_constants4 = __commonJS((exports, module) => { - var maxAttributeValueSize = 1024; - var maxNameValuePairSize = 4096; - module.exports = { - maxAttributeValueSize, - maxNameValuePairSize - }; -}); - -// ../node_modules/undici/lib/cookies/util.js -var require_util6 = __commonJS((exports, module) => { - var assert = __require("assert"); - var { kHeadersList } = require_symbols(); - function isCTLExcludingHtab(value) { - if (value.length === 0) { - return false; - } - for (const char of value) { - const code = char.charCodeAt(0); - if (code >= 0 || code <= 8 || (code >= 10 || code <= 31) || code === 127) { - return false; - } - } - } - function validateCookieName(name) { - for (const char of name) { - const code = char.charCodeAt(0); - if (code <= 32 || code > 127 || char === "(" || char === ")" || char === ">" || char === "<" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}") { - throw new Error("Invalid cookie name"); - } - } - } - function validateCookieValue(value) { - for (const char of value) { - const code = char.charCodeAt(0); - if (code < 33 || code === 34 || code === 44 || code === 59 || code === 92 || code > 126) { - throw new Error("Invalid header value"); - } - } - } - function validateCookiePath(path) { - for (const char of path) { - const code = char.charCodeAt(0); - if (code < 33 || char === ";") { - throw new Error("Invalid cookie path"); - } - } - } - function validateCookieDomain(domain) { - if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { - throw new Error("Invalid cookie domain"); - } - } - function toIMFDate(date) { - if (typeof date === "number") { - date = new Date(date); - } - const days = [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat" - ]; - const months = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" - ]; - const dayName = days[date.getUTCDay()]; - const day = date.getUTCDate().toString().padStart(2, "0"); - const month = months[date.getUTCMonth()]; - const year = date.getUTCFullYear(); - const hour = date.getUTCHours().toString().padStart(2, "0"); - const minute = date.getUTCMinutes().toString().padStart(2, "0"); - const second = date.getUTCSeconds().toString().padStart(2, "0"); - return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT`; - } - function validateCookieMaxAge(maxAge) { - if (maxAge < 0) { - throw new Error("Invalid cookie max-age"); - } - } - function stringify(cookie) { - if (cookie.name.length === 0) { - return null; - } - validateCookieName(cookie.name); - validateCookieValue(cookie.value); - const out = [`${cookie.name}=${cookie.value}`]; - if (cookie.name.startsWith("__Secure-")) { - cookie.secure = true; - } - if (cookie.name.startsWith("__Host-")) { - cookie.secure = true; - cookie.domain = null; - cookie.path = "/"; - } - if (cookie.secure) { - out.push("Secure"); - } - if (cookie.httpOnly) { - out.push("HttpOnly"); - } - if (typeof cookie.maxAge === "number") { - validateCookieMaxAge(cookie.maxAge); - out.push(`Max-Age=${cookie.maxAge}`); - } - if (cookie.domain) { - validateCookieDomain(cookie.domain); - out.push(`Domain=${cookie.domain}`); - } - if (cookie.path) { - validateCookiePath(cookie.path); - out.push(`Path=${cookie.path}`); - } - if (cookie.expires && cookie.expires.toString() !== "Invalid Date") { - out.push(`Expires=${toIMFDate(cookie.expires)}`); - } - if (cookie.sameSite) { - out.push(`SameSite=${cookie.sameSite}`); - } - for (const part of cookie.unparsed) { - if (!part.includes("=")) { - throw new Error("Invalid unparsed"); - } - const [key, ...value] = part.split("="); - out.push(`${key.trim()}=${value.join("=")}`); - } - return out.join("; "); - } - var kHeadersListNode; - function getHeadersList(headers) { - if (headers[kHeadersList]) { - return headers[kHeadersList]; - } - if (!kHeadersListNode) { - kHeadersListNode = Object.getOwnPropertySymbols(headers).find((symbol) => symbol.description === "headers list"); - assert(kHeadersListNode, "Headers cannot be parsed"); - } - const headersList = headers[kHeadersListNode]; - assert(headersList); - return headersList; - } - module.exports = { - isCTLExcludingHtab, - stringify, - getHeadersList - }; -}); - -// ../node_modules/undici/lib/cookies/parse.js -var require_parse = __commonJS((exports, module) => { - var { maxNameValuePairSize, maxAttributeValueSize } = require_constants4(); - var { isCTLExcludingHtab } = require_util6(); - var { collectASequenceOfCodePointsFast } = require_dataURL(); - var assert = __require("assert"); - function parseSetCookie(header) { - if (isCTLExcludingHtab(header)) { - return null; - } - let nameValuePair = ""; - let unparsedAttributes = ""; - let name = ""; - let value = ""; - if (header.includes(";")) { - const position = { position: 0 }; - nameValuePair = collectASequenceOfCodePointsFast(";", header, position); - unparsedAttributes = header.slice(position.position); - } else { - nameValuePair = header; - } - if (!nameValuePair.includes("=")) { - value = nameValuePair; - } else { - const position = { position: 0 }; - name = collectASequenceOfCodePointsFast("=", nameValuePair, position); - value = nameValuePair.slice(position.position + 1); - } - name = name.trim(); - value = value.trim(); - if (name.length + value.length > maxNameValuePairSize) { - return null; - } - return { - name, - value, - ...parseUnparsedAttributes(unparsedAttributes) - }; - } - function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) { - if (unparsedAttributes.length === 0) { - return cookieAttributeList; - } - assert(unparsedAttributes[0] === ";"); - unparsedAttributes = unparsedAttributes.slice(1); - let cookieAv = ""; - if (unparsedAttributes.includes(";")) { - cookieAv = collectASequenceOfCodePointsFast(";", unparsedAttributes, { position: 0 }); - unparsedAttributes = unparsedAttributes.slice(cookieAv.length); - } else { - cookieAv = unparsedAttributes; - unparsedAttributes = ""; - } - let attributeName = ""; - let attributeValue = ""; - if (cookieAv.includes("=")) { - const position = { position: 0 }; - attributeName = collectASequenceOfCodePointsFast("=", cookieAv, position); - attributeValue = cookieAv.slice(position.position + 1); - } else { - attributeName = cookieAv; - } - attributeName = attributeName.trim(); - attributeValue = attributeValue.trim(); - if (attributeValue.length > maxAttributeValueSize) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - const attributeNameLowercase = attributeName.toLowerCase(); - if (attributeNameLowercase === "expires") { - const expiryTime = new Date(attributeValue); - cookieAttributeList.expires = expiryTime; - } else if (attributeNameLowercase === "max-age") { - const charCode = attributeValue.charCodeAt(0); - if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - if (!/^\d+$/.test(attributeValue)) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - const deltaSeconds = Number(attributeValue); - cookieAttributeList.maxAge = deltaSeconds; - } else if (attributeNameLowercase === "domain") { - let cookieDomain = attributeValue; - if (cookieDomain[0] === ".") { - cookieDomain = cookieDomain.slice(1); - } - cookieDomain = cookieDomain.toLowerCase(); - cookieAttributeList.domain = cookieDomain; - } else if (attributeNameLowercase === "path") { - let cookiePath = ""; - if (attributeValue.length === 0 || attributeValue[0] !== "/") { - cookiePath = "/"; - } else { - cookiePath = attributeValue; - } - cookieAttributeList.path = cookiePath; - } else if (attributeNameLowercase === "secure") { - cookieAttributeList.secure = true; - } else if (attributeNameLowercase === "httponly") { - cookieAttributeList.httpOnly = true; - } else if (attributeNameLowercase === "samesite") { - let enforcement = "Default"; - const attributeValueLowercase = attributeValue.toLowerCase(); - if (attributeValueLowercase.includes("none")) { - enforcement = "None"; - } - if (attributeValueLowercase.includes("strict")) { - enforcement = "Strict"; - } - if (attributeValueLowercase.includes("lax")) { - enforcement = "Lax"; - } - cookieAttributeList.sameSite = enforcement; - } else { - cookieAttributeList.unparsed ??= []; - cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`); - } - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - module.exports = { - parseSetCookie, - parseUnparsedAttributes - }; -}); - -// ../node_modules/undici/lib/cookies/index.js -var require_cookies = __commonJS((exports, module) => { - var { parseSetCookie } = require_parse(); - var { stringify, getHeadersList } = require_util6(); - var { webidl } = require_webidl(); - var { Headers } = require_headers(); - function getCookies(headers) { - webidl.argumentLengthCheck(arguments, 1, { header: "getCookies" }); - webidl.brandCheck(headers, Headers, { strict: false }); - const cookie = headers.get("cookie"); - const out = {}; - if (!cookie) { - return out; - } - for (const piece of cookie.split(";")) { - const [name, ...value] = piece.split("="); - out[name.trim()] = value.join("="); - } - return out; - } - function deleteCookie(headers, name, attributes) { - webidl.argumentLengthCheck(arguments, 2, { header: "deleteCookie" }); - webidl.brandCheck(headers, Headers, { strict: false }); - name = webidl.converters.DOMString(name); - attributes = webidl.converters.DeleteCookieAttributes(attributes); - setCookie(headers, { - name, - value: "", - expires: new Date(0), - ...attributes - }); - } - function getSetCookies(headers) { - webidl.argumentLengthCheck(arguments, 1, { header: "getSetCookies" }); - webidl.brandCheck(headers, Headers, { strict: false }); - const cookies = getHeadersList(headers).cookies; - if (!cookies) { - return []; - } - return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)); - } - function setCookie(headers, cookie) { - webidl.argumentLengthCheck(arguments, 2, { header: "setCookie" }); - webidl.brandCheck(headers, Headers, { strict: false }); - cookie = webidl.converters.Cookie(cookie); - const str = stringify(cookie); - if (str) { - headers.append("Set-Cookie", stringify(cookie)); - } - } - webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "path", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "domain", - defaultValue: null - } - ]); - webidl.converters.Cookie = webidl.dictionaryConverter([ - { - converter: webidl.converters.DOMString, - key: "name" - }, - { - converter: webidl.converters.DOMString, - key: "value" - }, - { - converter: webidl.nullableConverter((value) => { - if (typeof value === "number") { - return webidl.converters["unsigned long long"](value); - } - return new Date(value); - }), - key: "expires", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters["long long"]), - key: "maxAge", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "domain", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "path", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: "secure", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: "httpOnly", - defaultValue: null - }, - { - converter: webidl.converters.USVString, - key: "sameSite", - allowedValues: ["Strict", "Lax", "None"] - }, - { - converter: webidl.sequenceConverter(webidl.converters.DOMString), - key: "unparsed", - defaultValue: [] - } - ]); - module.exports = { - getCookies, - deleteCookie, - getSetCookies, - setCookie - }; -}); - -// ../node_modules/undici/lib/websocket/constants.js -var require_constants5 = __commonJS((exports, module) => { - var uid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - var staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false - }; - var states = { - CONNECTING: 0, - OPEN: 1, - CLOSING: 2, - CLOSED: 3 - }; - var opcodes = { - CONTINUATION: 0, - TEXT: 1, - BINARY: 2, - CLOSE: 8, - PING: 9, - PONG: 10 - }; - var maxUnsigned16Bit = 2 ** 16 - 1; - var parserStates = { - INFO: 0, - PAYLOADLENGTH_16: 2, - PAYLOADLENGTH_64: 3, - READ_DATA: 4 - }; - var emptyBuffer = Buffer.allocUnsafe(0); - module.exports = { - uid, - staticPropertyDescriptors, - states, - opcodes, - maxUnsigned16Bit, - parserStates, - emptyBuffer - }; -}); - -// ../node_modules/undici/lib/websocket/symbols.js -var require_symbols5 = __commonJS((exports, module) => { - module.exports = { - kWebSocketURL: Symbol("url"), - kReadyState: Symbol("ready state"), - kController: Symbol("controller"), - kResponse: Symbol("response"), - kBinaryType: Symbol("binary type"), - kSentClose: Symbol("sent close"), - kReceivedClose: Symbol("received close"), - kByteParser: Symbol("byte parser") - }; -}); - -// ../node_modules/undici/lib/websocket/events.js -var require_events = __commonJS((exports, module) => { - var { webidl } = require_webidl(); - var { kEnumerableProperty } = require_util(); - var { MessagePort } = __require("worker_threads"); - - class MessageEvent extends Event { - #eventInit; - constructor(type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent constructor" }); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.MessageEventInit(eventInitDict); - super(type, eventInitDict); - this.#eventInit = eventInitDict; - } - get data() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.data; - } - get origin() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.origin; - } - get lastEventId() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.lastEventId; - } - get source() { - webidl.brandCheck(this, MessageEvent); - return this.#eventInit.source; - } - get ports() { - webidl.brandCheck(this, MessageEvent); - if (!Object.isFrozen(this.#eventInit.ports)) { - Object.freeze(this.#eventInit.ports); - } - return this.#eventInit.ports; - } - initMessageEvent(type, bubbles = false, cancelable = false, data = null, origin = "", lastEventId = "", source = null, ports = []) { - webidl.brandCheck(this, MessageEvent); - webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent.initMessageEvent" }); - return new MessageEvent(type, { - bubbles, - cancelable, - data, - origin, - lastEventId, - source, - ports - }); - } - } - - class CloseEvent extends Event { - #eventInit; - constructor(type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "CloseEvent constructor" }); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.CloseEventInit(eventInitDict); - super(type, eventInitDict); - this.#eventInit = eventInitDict; - } - get wasClean() { - webidl.brandCheck(this, CloseEvent); - return this.#eventInit.wasClean; - } - get code() { - webidl.brandCheck(this, CloseEvent); - return this.#eventInit.code; - } - get reason() { - webidl.brandCheck(this, CloseEvent); - return this.#eventInit.reason; - } - } - - class ErrorEvent extends Event { - #eventInit; - constructor(type, eventInitDict) { - webidl.argumentLengthCheck(arguments, 1, { header: "ErrorEvent constructor" }); - super(type, eventInitDict); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); - this.#eventInit = eventInitDict; - } - get message() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.message; - } - get filename() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.filename; - } - get lineno() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.lineno; - } - get colno() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.colno; - } - get error() { - webidl.brandCheck(this, ErrorEvent); - return this.#eventInit.error; - } - } - Object.defineProperties(MessageEvent.prototype, { - [Symbol.toStringTag]: { - value: "MessageEvent", - configurable: true - }, - data: kEnumerableProperty, - origin: kEnumerableProperty, - lastEventId: kEnumerableProperty, - source: kEnumerableProperty, - ports: kEnumerableProperty, - initMessageEvent: kEnumerableProperty - }); - Object.defineProperties(CloseEvent.prototype, { - [Symbol.toStringTag]: { - value: "CloseEvent", - configurable: true - }, - reason: kEnumerableProperty, - code: kEnumerableProperty, - wasClean: kEnumerableProperty - }); - Object.defineProperties(ErrorEvent.prototype, { - [Symbol.toStringTag]: { - value: "ErrorEvent", - configurable: true - }, - message: kEnumerableProperty, - filename: kEnumerableProperty, - lineno: kEnumerableProperty, - colno: kEnumerableProperty, - error: kEnumerableProperty - }); - webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort); - webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.MessagePort); - var eventInit = [ - { - key: "bubbles", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "cancelable", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "composed", - converter: webidl.converters.boolean, - defaultValue: false - } - ]; - webidl.converters.MessageEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "data", - converter: webidl.converters.any, - defaultValue: null - }, - { - key: "origin", - converter: webidl.converters.USVString, - defaultValue: "" - }, - { - key: "lastEventId", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "source", - converter: webidl.nullableConverter(webidl.converters.MessagePort), - defaultValue: null - }, - { - key: "ports", - converter: webidl.converters["sequence"], - get defaultValue() { - return []; - } - } - ]); - webidl.converters.CloseEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "wasClean", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "code", - converter: webidl.converters["unsigned short"], - defaultValue: 0 - }, - { - key: "reason", - converter: webidl.converters.USVString, - defaultValue: "" - } - ]); - webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "message", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "filename", - converter: webidl.converters.USVString, - defaultValue: "" - }, - { - key: "lineno", - converter: webidl.converters["unsigned long"], - defaultValue: 0 - }, - { - key: "colno", - converter: webidl.converters["unsigned long"], - defaultValue: 0 - }, - { - key: "error", - converter: webidl.converters.any - } - ]); - module.exports = { - MessageEvent, - CloseEvent, - ErrorEvent - }; -}); - -// ../node_modules/undici/lib/websocket/util.js -var require_util7 = __commonJS((exports, module) => { - var { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require_symbols5(); - var { states, opcodes } = require_constants5(); - var { MessageEvent, ErrorEvent } = require_events(); - function isEstablished(ws) { - return ws[kReadyState] === states.OPEN; - } - function isClosing(ws) { - return ws[kReadyState] === states.CLOSING; - } - function isClosed(ws) { - return ws[kReadyState] === states.CLOSED; - } - function fireEvent(e, target, eventConstructor = Event, eventInitDict) { - const event = new eventConstructor(e, eventInitDict); - target.dispatchEvent(event); - } - function websocketMessageReceived(ws, type, data) { - if (ws[kReadyState] !== states.OPEN) { - return; - } - let dataForEvent; - if (type === opcodes.TEXT) { - try { - dataForEvent = new TextDecoder("utf-8", { fatal: true }).decode(data); - } catch { - failWebsocketConnection(ws, "Received invalid UTF-8 in text frame."); - return; - } - } else if (type === opcodes.BINARY) { - if (ws[kBinaryType] === "blob") { - dataForEvent = new Blob([data]); - } else { - dataForEvent = new Uint8Array(data).buffer; - } - } - fireEvent("message", ws, MessageEvent, { - origin: ws[kWebSocketURL].origin, - data: dataForEvent - }); - } - function isValidSubprotocol(protocol) { - if (protocol.length === 0) { - return false; - } - for (const char of protocol) { - const code = char.charCodeAt(0); - if (code < 33 || code > 126 || char === "(" || char === ")" || char === "<" || char === ">" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}" || code === 32 || code === 9) { - return false; - } - } - return true; - } - function isValidStatusCode(code) { - if (code >= 1000 && code < 1015) { - return code !== 1004 && code !== 1005 && code !== 1006; - } - return code >= 3000 && code <= 4999; - } - function failWebsocketConnection(ws, reason) { - const { [kController]: controller, [kResponse]: response } = ws; - controller.abort(); - if (response?.socket && !response.socket.destroyed) { - response.socket.destroy(); - } - if (reason) { - fireEvent("error", ws, ErrorEvent, { - error: new Error(reason) - }); - } - } - module.exports = { - isEstablished, - isClosing, - isClosed, - fireEvent, - isValidSubprotocol, - isValidStatusCode, - failWebsocketConnection, - websocketMessageReceived - }; -}); - -// ../node_modules/undici/lib/websocket/connection.js -var require_connection = __commonJS((exports, module) => { - var diagnosticsChannel = __require("diagnostics_channel"); - var { uid, states } = require_constants5(); - var { - kReadyState, - kSentClose, - kByteParser, - kReceivedClose - } = require_symbols5(); - var { fireEvent, failWebsocketConnection } = require_util7(); - var { CloseEvent } = require_events(); - var { makeRequest } = require_request2(); - var { fetching } = require_fetch(); - var { Headers } = require_headers(); - var { getGlobalDispatcher } = require_global2(); - var { kHeadersList } = require_symbols(); - var channels = {}; - channels.open = diagnosticsChannel.channel("undici:websocket:open"); - channels.close = diagnosticsChannel.channel("undici:websocket:close"); - channels.socketError = diagnosticsChannel.channel("undici:websocket:socket_error"); - var crypto; - try { - crypto = __require("crypto"); - } catch { - } - function establishWebSocketConnection(url, protocols, ws, onEstablish, options) { - const requestURL = url; - requestURL.protocol = url.protocol === "ws:" ? "http:" : "https:"; - const request = makeRequest({ - urlList: [requestURL], - serviceWorkers: "none", - referrer: "no-referrer", - mode: "websocket", - credentials: "include", - cache: "no-store", - redirect: "error" - }); - if (options.headers) { - const headersList = new Headers(options.headers)[kHeadersList]; - request.headersList = headersList; - } - const keyValue = crypto.randomBytes(16).toString("base64"); - request.headersList.append("sec-websocket-key", keyValue); - request.headersList.append("sec-websocket-version", "13"); - for (const protocol of protocols) { - request.headersList.append("sec-websocket-protocol", protocol); - } - const permessageDeflate = ""; - const controller = fetching({ - request, - useParallelQueue: true, - dispatcher: options.dispatcher ?? getGlobalDispatcher(), - processResponse(response) { - if (response.type === "error" || response.status !== 101) { - failWebsocketConnection(ws, "Received network error or non-101 status code."); - return; - } - if (protocols.length !== 0 && !response.headersList.get("Sec-WebSocket-Protocol")) { - failWebsocketConnection(ws, "Server did not respond with sent protocols."); - return; - } - if (response.headersList.get("Upgrade")?.toLowerCase() !== "websocket") { - failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".'); - return; - } - if (response.headersList.get("Connection")?.toLowerCase() !== "upgrade") { - failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".'); - return; - } - const secWSAccept = response.headersList.get("Sec-WebSocket-Accept"); - const digest = crypto.createHash("sha1").update(keyValue + uid).digest("base64"); - if (secWSAccept !== digest) { - failWebsocketConnection(ws, "Incorrect hash received in Sec-WebSocket-Accept header."); - return; - } - const secExtension = response.headersList.get("Sec-WebSocket-Extensions"); - if (secExtension !== null && secExtension !== permessageDeflate) { - failWebsocketConnection(ws, "Received different permessage-deflate than the one set."); - return; - } - const secProtocol = response.headersList.get("Sec-WebSocket-Protocol"); - if (secProtocol !== null && secProtocol !== request.headersList.get("Sec-WebSocket-Protocol")) { - failWebsocketConnection(ws, "Protocol was not set in the opening handshake."); - return; - } - response.socket.on("data", onSocketData); - response.socket.on("close", onSocketClose); - response.socket.on("error", onSocketError); - if (channels.open.hasSubscribers) { - channels.open.publish({ - address: response.socket.address(), - protocol: secProtocol, - extensions: secExtension - }); - } - onEstablish(response); - } - }); - return controller; - } - function onSocketData(chunk) { - if (!this.ws[kByteParser].write(chunk)) { - this.pause(); - } - } - function onSocketClose() { - const { ws } = this; - const wasClean = ws[kSentClose] && ws[kReceivedClose]; - let code = 1005; - let reason = ""; - const result = ws[kByteParser].closingInfo; - if (result) { - code = result.code ?? 1005; - reason = result.reason; - } else if (!ws[kSentClose]) { - code = 1006; - } - ws[kReadyState] = states.CLOSED; - fireEvent("close", ws, CloseEvent, { - wasClean, - code, - reason - }); - if (channels.close.hasSubscribers) { - channels.close.publish({ - websocket: ws, - code, - reason - }); - } - } - function onSocketError(error) { - const { ws } = this; - ws[kReadyState] = states.CLOSING; - if (channels.socketError.hasSubscribers) { - channels.socketError.publish(error); - } - this.destroy(); - } - module.exports = { - establishWebSocketConnection - }; -}); - -// ../node_modules/undici/lib/websocket/frame.js -var require_frame = __commonJS((exports, module) => { - var { maxUnsigned16Bit } = require_constants5(); - var crypto; - try { - crypto = __require("crypto"); - } catch { - } - - class WebsocketFrameSend { - constructor(data) { - this.frameData = data; - this.maskKey = crypto.randomBytes(4); - } - createFrame(opcode) { - const bodyLength = this.frameData?.byteLength ?? 0; - let payloadLength = bodyLength; - let offset = 6; - if (bodyLength > maxUnsigned16Bit) { - offset += 8; - payloadLength = 127; - } else if (bodyLength > 125) { - offset += 2; - payloadLength = 126; - } - const buffer = Buffer.allocUnsafe(bodyLength + offset); - buffer[0] = buffer[1] = 0; - buffer[0] |= 128; - buffer[0] = (buffer[0] & 240) + opcode; - /*! ws. MIT License. Einar Otto Stangvik */ - buffer[offset - 4] = this.maskKey[0]; - buffer[offset - 3] = this.maskKey[1]; - buffer[offset - 2] = this.maskKey[2]; - buffer[offset - 1] = this.maskKey[3]; - buffer[1] = payloadLength; - if (payloadLength === 126) { - buffer.writeUInt16BE(bodyLength, 2); - } else if (payloadLength === 127) { - buffer[2] = buffer[3] = 0; - buffer.writeUIntBE(bodyLength, 4, 6); - } - buffer[1] |= 128; - for (let i = 0;i < bodyLength; i++) { - buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]; - } - return buffer; - } - } - module.exports = { - WebsocketFrameSend - }; -}); - -// ../node_modules/undici/lib/websocket/receiver.js -var require_receiver = __commonJS((exports, module) => { - var { Writable } = __require("stream"); - var diagnosticsChannel = __require("diagnostics_channel"); - var { parserStates, opcodes, states, emptyBuffer } = require_constants5(); - var { kReadyState, kSentClose, kResponse, kReceivedClose } = require_symbols5(); - var { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = require_util7(); - var { WebsocketFrameSend } = require_frame(); - var channels = {}; - channels.ping = diagnosticsChannel.channel("undici:websocket:ping"); - channels.pong = diagnosticsChannel.channel("undici:websocket:pong"); - - class ByteParser extends Writable { - #buffers = []; - #byteOffset = 0; - #state = parserStates.INFO; - #info = {}; - #fragments = []; - constructor(ws) { - super(); - this.ws = ws; - } - _write(chunk, _, callback) { - this.#buffers.push(chunk); - this.#byteOffset += chunk.length; - this.run(callback); - } - run(callback) { - while (true) { - if (this.#state === parserStates.INFO) { - if (this.#byteOffset < 2) { - return callback(); - } - const buffer = this.consume(2); - this.#info.fin = (buffer[0] & 128) !== 0; - this.#info.opcode = buffer[0] & 15; - this.#info.originalOpcode ??= this.#info.opcode; - this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION; - if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { - failWebsocketConnection(this.ws, "Invalid frame type was fragmented."); - return; - } - const payloadLength = buffer[1] & 127; - if (payloadLength <= 125) { - this.#info.payloadLength = payloadLength; - this.#state = parserStates.READ_DATA; - } else if (payloadLength === 126) { - this.#state = parserStates.PAYLOADLENGTH_16; - } else if (payloadLength === 127) { - this.#state = parserStates.PAYLOADLENGTH_64; - } - if (this.#info.fragmented && payloadLength > 125) { - failWebsocketConnection(this.ws, "Fragmented frame exceeded 125 bytes."); - return; - } else if ((this.#info.opcode === opcodes.PING || this.#info.opcode === opcodes.PONG || this.#info.opcode === opcodes.CLOSE) && payloadLength > 125) { - failWebsocketConnection(this.ws, "Payload length for control frame exceeded 125 bytes."); - return; - } else if (this.#info.opcode === opcodes.CLOSE) { - if (payloadLength === 1) { - failWebsocketConnection(this.ws, "Received close frame with a 1-byte body."); - return; - } - const body = this.consume(payloadLength); - this.#info.closeInfo = this.parseCloseBody(false, body); - if (!this.ws[kSentClose]) { - const body2 = Buffer.allocUnsafe(2); - body2.writeUInt16BE(this.#info.closeInfo.code, 0); - const closeFrame = new WebsocketFrameSend(body2); - this.ws[kResponse].socket.write(closeFrame.createFrame(opcodes.CLOSE), (err) => { - if (!err) { - this.ws[kSentClose] = true; - } - }); - } - this.ws[kReadyState] = states.CLOSING; - this.ws[kReceivedClose] = true; - this.end(); - return; - } else if (this.#info.opcode === opcodes.PING) { - const body = this.consume(payloadLength); - if (!this.ws[kReceivedClose]) { - const frame = new WebsocketFrameSend(body); - this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)); - if (channels.ping.hasSubscribers) { - channels.ping.publish({ - payload: body - }); - } - } - this.#state = parserStates.INFO; - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - return; - } - } else if (this.#info.opcode === opcodes.PONG) { - const body = this.consume(payloadLength); - if (channels.pong.hasSubscribers) { - channels.pong.publish({ - payload: body - }); - } - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - return; - } - } - } else if (this.#state === parserStates.PAYLOADLENGTH_16) { - if (this.#byteOffset < 2) { - return callback(); - } - const buffer = this.consume(2); - this.#info.payloadLength = buffer.readUInt16BE(0); - this.#state = parserStates.READ_DATA; - } else if (this.#state === parserStates.PAYLOADLENGTH_64) { - if (this.#byteOffset < 8) { - return callback(); - } - const buffer = this.consume(8); - const upper = buffer.readUInt32BE(0); - if (upper > 2 ** 31 - 1) { - failWebsocketConnection(this.ws, "Received payload length > 2^31 bytes."); - return; - } - const lower = buffer.readUInt32BE(4); - this.#info.payloadLength = (upper << 8) + lower; - this.#state = parserStates.READ_DATA; - } else if (this.#state === parserStates.READ_DATA) { - if (this.#byteOffset < this.#info.payloadLength) { - return callback(); - } else if (this.#byteOffset >= this.#info.payloadLength) { - const body = this.consume(this.#info.payloadLength); - this.#fragments.push(body); - if (!this.#info.fragmented || this.#info.fin && this.#info.opcode === opcodes.CONTINUATION) { - const fullMessage = Buffer.concat(this.#fragments); - websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage); - this.#info = {}; - this.#fragments.length = 0; - } - this.#state = parserStates.INFO; - } - } - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - break; - } - } - } - consume(n) { - if (n > this.#byteOffset) { - return null; - } else if (n === 0) { - return emptyBuffer; - } - if (this.#buffers[0].length === n) { - this.#byteOffset -= this.#buffers[0].length; - return this.#buffers.shift(); - } - const buffer = Buffer.allocUnsafe(n); - let offset = 0; - while (offset !== n) { - const next = this.#buffers[0]; - const { length } = next; - if (length + offset === n) { - buffer.set(this.#buffers.shift(), offset); - break; - } else if (length + offset > n) { - buffer.set(next.subarray(0, n - offset), offset); - this.#buffers[0] = next.subarray(n - offset); - break; - } else { - buffer.set(this.#buffers.shift(), offset); - offset += next.length; - } - } - this.#byteOffset -= n; - return buffer; - } - parseCloseBody(onlyCode, data) { - let code; - if (data.length >= 2) { - code = data.readUInt16BE(0); - } - if (onlyCode) { - if (!isValidStatusCode(code)) { - return null; - } - return { code }; - } - let reason = data.subarray(2); - if (reason[0] === 239 && reason[1] === 187 && reason[2] === 191) { - reason = reason.subarray(3); - } - if (code !== undefined && !isValidStatusCode(code)) { - return null; - } - try { - reason = new TextDecoder("utf-8", { fatal: true }).decode(reason); - } catch { - return null; - } - return { code, reason }; - } - get closingInfo() { - return this.#info.closeInfo; - } - } - module.exports = { - ByteParser - }; -}); - -// ../node_modules/undici/lib/websocket/websocket.js -var require_websocket = __commonJS((exports, module) => { - var { webidl } = require_webidl(); - var { DOMException: DOMException2 } = require_constants2(); - var { URLSerializer } = require_dataURL(); - var { getGlobalOrigin } = require_global(); - var { staticPropertyDescriptors, states, opcodes, emptyBuffer } = require_constants5(); - var { - kWebSocketURL, - kReadyState, - kController, - kBinaryType, - kResponse, - kSentClose, - kByteParser - } = require_symbols5(); - var { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = require_util7(); - var { establishWebSocketConnection } = require_connection(); - var { WebsocketFrameSend } = require_frame(); - var { ByteParser } = require_receiver(); - var { kEnumerableProperty, isBlobLike } = require_util(); - var { getGlobalDispatcher } = require_global2(); - var { types } = __require("util"); - var experimentalWarned = false; - - class WebSocket extends EventTarget { - #events = { - open: null, - error: null, - close: null, - message: null - }; - #bufferedAmount = 0; - #protocol = ""; - #extensions = ""; - constructor(url, protocols = []) { - super(); - webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket constructor" }); - if (!experimentalWarned) { - experimentalWarned = true; - process.emitWarning("WebSockets are experimental, expect them to change at any time.", { - code: "UNDICI-WS" - }); - } - const options = webidl.converters["DOMString or sequence or WebSocketInit"](protocols); - url = webidl.converters.USVString(url); - protocols = options.protocols; - const baseURL = getGlobalOrigin(); - let urlRecord; - try { - urlRecord = new URL(url, baseURL); - } catch (e) { - throw new DOMException2(e, "SyntaxError"); - } - if (urlRecord.protocol === "http:") { - urlRecord.protocol = "ws:"; - } else if (urlRecord.protocol === "https:") { - urlRecord.protocol = "wss:"; - } - if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { - throw new DOMException2(`Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, "SyntaxError"); - } - if (urlRecord.hash || urlRecord.href.endsWith("#")) { - throw new DOMException2("Got fragment", "SyntaxError"); - } - if (typeof protocols === "string") { - protocols = [protocols]; - } - if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { - throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); - } - if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { - throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); - } - this[kWebSocketURL] = new URL(urlRecord.href); - this[kController] = establishWebSocketConnection(urlRecord, protocols, this, (response) => this.#onConnectionEstablished(response), options); - this[kReadyState] = WebSocket.CONNECTING; - this[kBinaryType] = "blob"; - } - close(code = undefined, reason = undefined) { - webidl.brandCheck(this, WebSocket); - if (code !== undefined) { - code = webidl.converters["unsigned short"](code, { clamp: true }); - } - if (reason !== undefined) { - reason = webidl.converters.USVString(reason); - } - if (code !== undefined) { - if (code !== 1000 && (code < 3000 || code > 4999)) { - throw new DOMException2("invalid code", "InvalidAccessError"); - } - } - let reasonByteLength = 0; - if (reason !== undefined) { - reasonByteLength = Buffer.byteLength(reason); - if (reasonByteLength > 123) { - throw new DOMException2(`Reason must be less than 123 bytes; received ${reasonByteLength}`, "SyntaxError"); - } - } - if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) { - } else if (!isEstablished(this)) { - failWebsocketConnection(this, "Connection was closed before it was established."); - this[kReadyState] = WebSocket.CLOSING; - } else if (!isClosing(this)) { - const frame = new WebsocketFrameSend; - if (code !== undefined && reason === undefined) { - frame.frameData = Buffer.allocUnsafe(2); - frame.frameData.writeUInt16BE(code, 0); - } else if (code !== undefined && reason !== undefined) { - frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength); - frame.frameData.writeUInt16BE(code, 0); - frame.frameData.write(reason, 2, "utf-8"); - } else { - frame.frameData = emptyBuffer; - } - const socket = this[kResponse].socket; - socket.write(frame.createFrame(opcodes.CLOSE), (err) => { - if (!err) { - this[kSentClose] = true; - } - }); - this[kReadyState] = states.CLOSING; - } else { - this[kReadyState] = WebSocket.CLOSING; - } - } - send(data) { - webidl.brandCheck(this, WebSocket); - webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket.send" }); - data = webidl.converters.WebSocketSendData(data); - if (this[kReadyState] === WebSocket.CONNECTING) { - throw new DOMException2("Sent before connected.", "InvalidStateError"); - } - if (!isEstablished(this) || isClosing(this)) { - return; - } - const socket = this[kResponse].socket; - if (typeof data === "string") { - const value = Buffer.from(data); - const frame = new WebsocketFrameSend(value); - const buffer = frame.createFrame(opcodes.TEXT); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - } else if (types.isArrayBuffer(data)) { - const value = Buffer.from(data); - const frame = new WebsocketFrameSend(value); - const buffer = frame.createFrame(opcodes.BINARY); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - } else if (ArrayBuffer.isView(data)) { - const ab = Buffer.from(data, data.byteOffset, data.byteLength); - const frame = new WebsocketFrameSend(ab); - const buffer = frame.createFrame(opcodes.BINARY); - this.#bufferedAmount += ab.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= ab.byteLength; - }); - } else if (isBlobLike(data)) { - const frame = new WebsocketFrameSend; - data.arrayBuffer().then((ab) => { - const value = Buffer.from(ab); - frame.frameData = value; - const buffer = frame.createFrame(opcodes.BINARY); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - }); - } - } - get readyState() { - webidl.brandCheck(this, WebSocket); - return this[kReadyState]; - } - get bufferedAmount() { - webidl.brandCheck(this, WebSocket); - return this.#bufferedAmount; - } - get url() { - webidl.brandCheck(this, WebSocket); - return URLSerializer(this[kWebSocketURL]); - } - get extensions() { - webidl.brandCheck(this, WebSocket); - return this.#extensions; - } - get protocol() { - webidl.brandCheck(this, WebSocket); - return this.#protocol; - } - get onopen() { - webidl.brandCheck(this, WebSocket); - return this.#events.open; - } - set onopen(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.open) { - this.removeEventListener("open", this.#events.open); - } - if (typeof fn === "function") { - this.#events.open = fn; - this.addEventListener("open", fn); - } else { - this.#events.open = null; - } - } - get onerror() { - webidl.brandCheck(this, WebSocket); - return this.#events.error; - } - set onerror(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.error) { - this.removeEventListener("error", this.#events.error); - } - if (typeof fn === "function") { - this.#events.error = fn; - this.addEventListener("error", fn); - } else { - this.#events.error = null; - } - } - get onclose() { - webidl.brandCheck(this, WebSocket); - return this.#events.close; - } - set onclose(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.close) { - this.removeEventListener("close", this.#events.close); - } - if (typeof fn === "function") { - this.#events.close = fn; - this.addEventListener("close", fn); - } else { - this.#events.close = null; - } - } - get onmessage() { - webidl.brandCheck(this, WebSocket); - return this.#events.message; - } - set onmessage(fn) { - webidl.brandCheck(this, WebSocket); - if (this.#events.message) { - this.removeEventListener("message", this.#events.message); - } - if (typeof fn === "function") { - this.#events.message = fn; - this.addEventListener("message", fn); - } else { - this.#events.message = null; - } - } - get binaryType() { - webidl.brandCheck(this, WebSocket); - return this[kBinaryType]; - } - set binaryType(type) { - webidl.brandCheck(this, WebSocket); - if (type !== "blob" && type !== "arraybuffer") { - this[kBinaryType] = "blob"; - } else { - this[kBinaryType] = type; - } - } - #onConnectionEstablished(response) { - this[kResponse] = response; - const parser = new ByteParser(this); - parser.on("drain", function onParserDrain() { - this.ws[kResponse].socket.resume(); - }); - response.socket.ws = this; - this[kByteParser] = parser; - this[kReadyState] = states.OPEN; - const extensions = response.headersList.get("sec-websocket-extensions"); - if (extensions !== null) { - this.#extensions = extensions; - } - const protocol = response.headersList.get("sec-websocket-protocol"); - if (protocol !== null) { - this.#protocol = protocol; - } - fireEvent("open", this); - } - } - WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING; - WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN; - WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING; - WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED; - Object.defineProperties(WebSocket.prototype, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors, - url: kEnumerableProperty, - readyState: kEnumerableProperty, - bufferedAmount: kEnumerableProperty, - onopen: kEnumerableProperty, - onerror: kEnumerableProperty, - onclose: kEnumerableProperty, - close: kEnumerableProperty, - onmessage: kEnumerableProperty, - binaryType: kEnumerableProperty, - send: kEnumerableProperty, - extensions: kEnumerableProperty, - protocol: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "WebSocket", - writable: false, - enumerable: false, - configurable: true - } - }); - Object.defineProperties(WebSocket, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors - }); - webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.DOMString); - webidl.converters["DOMString or sequence"] = function(V) { - if (webidl.util.Type(V) === "Object" && Symbol.iterator in V) { - return webidl.converters["sequence"](V); - } - return webidl.converters.DOMString(V); - }; - webidl.converters.WebSocketInit = webidl.dictionaryConverter([ - { - key: "protocols", - converter: webidl.converters["DOMString or sequence"], - get defaultValue() { - return []; - } - }, - { - key: "dispatcher", - converter: (V) => V, - get defaultValue() { - return getGlobalDispatcher(); - } - }, - { - key: "headers", - converter: webidl.nullableConverter(webidl.converters.HeadersInit) - } - ]); - webidl.converters["DOMString or sequence or WebSocketInit"] = function(V) { - if (webidl.util.Type(V) === "Object" && !(Symbol.iterator in V)) { - return webidl.converters.WebSocketInit(V); - } - return { protocols: webidl.converters["DOMString or sequence"](V) }; - }; - webidl.converters.WebSocketSendData = function(V) { - if (webidl.util.Type(V) === "Object") { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); - } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { - return webidl.converters.BufferSource(V); - } - } - return webidl.converters.USVString(V); - }; - module.exports = { - WebSocket - }; -}); - -// ../node_modules/undici/index.js -var require_undici = __commonJS((exports, module) => { - var Client = require_client(); - var Dispatcher = require_dispatcher(); - var errors = require_errors(); - var Pool = require_pool(); - var BalancedPool = require_balanced_pool(); - var Agent = require_agent(); - var util = require_util(); - var { InvalidArgumentError } = errors; - var api = require_api(); - var buildConnector = require_connect(); - var MockClient = require_mock_client(); - var MockAgent = require_mock_agent(); - var MockPool = require_mock_pool(); - var mockErrors = require_mock_errors(); - var ProxyAgent = require_proxy_agent(); - var RetryHandler = require_RetryHandler(); - var { getGlobalDispatcher, setGlobalDispatcher } = require_global2(); - var DecoratorHandler = require_DecoratorHandler(); - var RedirectHandler = require_RedirectHandler(); - var createRedirectInterceptor = require_redirectInterceptor(); - var hasCrypto; - try { - __require("crypto"); - hasCrypto = true; - } catch { - hasCrypto = false; - } - Object.assign(Dispatcher.prototype, api); - exports.Dispatcher = Dispatcher; - exports.Client = Client; - exports.Pool = Pool; - exports.BalancedPool = BalancedPool; - exports.Agent = Agent; - exports.ProxyAgent = ProxyAgent; - exports.RetryHandler = RetryHandler; - exports.DecoratorHandler = DecoratorHandler; - exports.RedirectHandler = RedirectHandler; - exports.createRedirectInterceptor = createRedirectInterceptor; - exports.buildConnector = buildConnector; - exports.errors = errors; - function makeDispatcher(fn) { - return (url, opts, handler) => { - if (typeof opts === "function") { - handler = opts; - opts = null; - } - if (!url || typeof url !== "string" && typeof url !== "object" && !(url instanceof URL)) { - throw new InvalidArgumentError("invalid url"); - } - if (opts != null && typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (opts && opts.path != null) { - if (typeof opts.path !== "string") { - throw new InvalidArgumentError("invalid opts.path"); - } - let path = opts.path; - if (!opts.path.startsWith("/")) { - path = `/${path}`; - } - url = new URL(util.parseOrigin(url).origin + path); - } else { - if (!opts) { - opts = typeof url === "object" ? url : {}; - } - url = util.parseURL(url); - } - const { agent, dispatcher = getGlobalDispatcher() } = opts; - if (agent) { - throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?"); - } - return fn.call(dispatcher, { - ...opts, - origin: url.origin, - path: url.search ? `${url.pathname}${url.search}` : url.pathname, - method: opts.method || (opts.body ? "PUT" : "GET") - }, handler); - }; - } - exports.setGlobalDispatcher = setGlobalDispatcher; - exports.getGlobalDispatcher = getGlobalDispatcher; - if (util.nodeMajor > 16 || util.nodeMajor === 16 && util.nodeMinor >= 8) { - let fetchImpl = null; - exports.fetch = async function fetch(resource) { - if (!fetchImpl) { - fetchImpl = require_fetch().fetch; - } - try { - return await fetchImpl(...arguments); - } catch (err) { - if (typeof err === "object") { - Error.captureStackTrace(err, this); - } - throw err; - } - }; - exports.Headers = require_headers().Headers; - exports.Response = require_response().Response; - exports.Request = require_request2().Request; - exports.FormData = require_formdata().FormData; - exports.File = require_file().File; - exports.FileReader = require_filereader().FileReader; - const { setGlobalOrigin, getGlobalOrigin } = require_global(); - exports.setGlobalOrigin = setGlobalOrigin; - exports.getGlobalOrigin = getGlobalOrigin; - const { CacheStorage } = require_cachestorage(); - const { kConstruct } = require_symbols4(); - exports.caches = new CacheStorage(kConstruct); - } - if (util.nodeMajor >= 16) { - const { deleteCookie, getCookies, getSetCookies, setCookie } = require_cookies(); - exports.deleteCookie = deleteCookie; - exports.getCookies = getCookies; - exports.getSetCookies = getSetCookies; - exports.setCookie = setCookie; - const { parseMIMEType, serializeAMimeType } = require_dataURL(); - exports.parseMIMEType = parseMIMEType; - exports.serializeAMimeType = serializeAMimeType; - } - if (util.nodeMajor >= 18 && hasCrypto) { - const { WebSocket } = require_websocket(); - exports.WebSocket = WebSocket; - } - exports.request = makeDispatcher(api.request); - exports.stream = makeDispatcher(api.stream); - exports.pipeline = makeDispatcher(api.pipeline); - exports.connect = makeDispatcher(api.connect); - exports.upgrade = makeDispatcher(api.upgrade); - exports.MockClient = MockClient; - exports.MockPool = MockPool; - exports.MockAgent = MockAgent; - exports.mockErrors = mockErrors; -}); - -// ../node_modules/@actions/http-client/lib/index.js -var require_lib = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = undefined; - var http = __importStar(__require("http")); - var https = __importStar(__require("https")); - var pm = __importStar(require_proxy()); - var tunnel = __importStar(require_tunnel()); - var undici_1 = require_undici(); - var HttpCodes; - (function(HttpCodes2) { - HttpCodes2[HttpCodes2["OK"] = 200] = "OK"; - HttpCodes2[HttpCodes2["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes2[HttpCodes2["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes2[HttpCodes2["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes2[HttpCodes2["SeeOther"] = 303] = "SeeOther"; - HttpCodes2[HttpCodes2["NotModified"] = 304] = "NotModified"; - HttpCodes2[HttpCodes2["UseProxy"] = 305] = "UseProxy"; - HttpCodes2[HttpCodes2["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes2[HttpCodes2["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes2[HttpCodes2["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes2[HttpCodes2["BadRequest"] = 400] = "BadRequest"; - HttpCodes2[HttpCodes2["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes2[HttpCodes2["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes2[HttpCodes2["Forbidden"] = 403] = "Forbidden"; - HttpCodes2[HttpCodes2["NotFound"] = 404] = "NotFound"; - HttpCodes2[HttpCodes2["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes2[HttpCodes2["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes2[HttpCodes2["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes2[HttpCodes2["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes2[HttpCodes2["Conflict"] = 409] = "Conflict"; - HttpCodes2[HttpCodes2["Gone"] = 410] = "Gone"; - HttpCodes2[HttpCodes2["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes2[HttpCodes2["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes2[HttpCodes2["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes2[HttpCodes2["BadGateway"] = 502] = "BadGateway"; - HttpCodes2[HttpCodes2["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes2[HttpCodes2["GatewayTimeout"] = 504] = "GatewayTimeout"; - })(HttpCodes || (exports.HttpCodes = HttpCodes = {})); - var Headers; - (function(Headers2) { - Headers2["Accept"] = "accept"; - Headers2["ContentType"] = "content-type"; - })(Headers || (exports.Headers = Headers = {})); - var MediaTypes; - (function(MediaTypes2) { - MediaTypes2["ApplicationJson"] = "application/json"; - })(MediaTypes || (exports.MediaTypes = MediaTypes = {})); - function getProxyUrl(serverUrl) { - const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); - return proxyUrl ? proxyUrl.href : ""; - } - exports.getProxyUrl = getProxyUrl; - var HttpRedirectCodes = [ - HttpCodes.MovedPermanently, - HttpCodes.ResourceMoved, - HttpCodes.SeeOther, - HttpCodes.TemporaryRedirect, - HttpCodes.PermanentRedirect - ]; - var HttpResponseRetryCodes = [ - HttpCodes.BadGateway, - HttpCodes.ServiceUnavailable, - HttpCodes.GatewayTimeout - ]; - var RetryableHttpVerbs = ["OPTIONS", "GET", "DELETE", "HEAD"]; - var ExponentialBackoffCeiling = 10; - var ExponentialBackoffTimeSlice = 5; - - class HttpClientError extends Error { - constructor(message, statusCode) { - super(message); - this.name = "HttpClientError"; - this.statusCode = statusCode; - Object.setPrototypeOf(this, HttpClientError.prototype); - } - } - exports.HttpClientError = HttpClientError; - - class HttpClientResponse { - constructor(message) { - this.message = message; - } - readBody() { - return __awaiter(this, undefined, undefined, function* () { - return new Promise((resolve) => __awaiter(this, undefined, undefined, function* () { - let output = Buffer.alloc(0); - this.message.on("data", (chunk) => { - output = Buffer.concat([output, chunk]); - }); - this.message.on("end", () => { - resolve(output.toString()); - }); - })); - }); - } - readBodyBuffer() { - return __awaiter(this, undefined, undefined, function* () { - return new Promise((resolve) => __awaiter(this, undefined, undefined, function* () { - const chunks = []; - this.message.on("data", (chunk) => { - chunks.push(chunk); - }); - this.message.on("end", () => { - resolve(Buffer.concat(chunks)); - }); - })); - }); - } - } - exports.HttpClientResponse = HttpClientResponse; - function isHttps(requestUrl) { - const parsedUrl = new URL(requestUrl); - return parsedUrl.protocol === "https:"; - } - exports.isHttps = isHttps; - - class HttpClient { - constructor(userAgent, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent; - this.handlers = handlers || []; - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; - } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; - } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); - } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; - } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; - } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; - } - } - } - options(requestUrl, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("OPTIONS", requestUrl, null, additionalHeaders || {}); - }); - } - get(requestUrl, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("GET", requestUrl, null, additionalHeaders || {}); - }); - } - del(requestUrl, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("DELETE", requestUrl, null, additionalHeaders || {}); - }); - } - post(requestUrl, data, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("POST", requestUrl, data, additionalHeaders || {}); - }); - } - patch(requestUrl, data, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("PATCH", requestUrl, data, additionalHeaders || {}); - }); - } - put(requestUrl, data, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("PUT", requestUrl, data, additionalHeaders || {}); - }); - } - head(requestUrl, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request("HEAD", requestUrl, null, additionalHeaders || {}); - }); - } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return __awaiter(this, undefined, undefined, function* () { - return this.request(verb, requestUrl, stream, additionalHeaders); - }); - } - getJson(requestUrl, additionalHeaders = {}) { - return __awaiter(this, undefined, undefined, function* () { - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - const res = yield this.get(requestUrl, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - postJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, undefined, undefined, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.post(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - putJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, undefined, undefined, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.put(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - patchJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, undefined, undefined, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.patch(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - request(verb, requestUrl, data, headers) { - return __awaiter(this, undefined, undefined, function* () { - if (this._disposed) { - throw new Error("Client has already been disposed."); - } - const parsedUrl = new URL(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers); - const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) ? this._maxRetries + 1 : 1; - let numTries = 0; - let response; - do { - response = yield this.requestRaw(info, data); - if (response && response.message && response.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (const handler of this.handlers) { - if (handler.canHandleAuthentication(response)) { - authenticationHandler = handler; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } else { - return response; - } - } - let redirectsRemaining = this._maxRedirects; - while (response.message.statusCode && HttpRedirectCodes.includes(response.message.statusCode) && this._allowRedirects && redirectsRemaining > 0) { - const redirectUrl = response.message.headers["location"]; - if (!redirectUrl) { - break; - } - const parsedRedirectUrl = new URL(redirectUrl); - if (parsedUrl.protocol === "https:" && parsedUrl.protocol !== parsedRedirectUrl.protocol && !this._allowRedirectDowngrade) { - throw new Error("Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true."); - } - yield response.readBody(); - if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { - for (const header in headers) { - if (header.toLowerCase() === "authorization") { - delete headers[header]; - } - } - } - info = this._prepareRequest(verb, parsedRedirectUrl, headers); - response = yield this.requestRaw(info, data); - redirectsRemaining--; - } - if (!response.message.statusCode || !HttpResponseRetryCodes.includes(response.message.statusCode)) { - return response; - } - numTries += 1; - if (numTries < maxTries) { - yield response.readBody(); - yield this._performExponentialBackoff(numTries); - } - } while (numTries < maxTries); - return response; - }); - } - dispose() { - if (this._agent) { - this._agent.destroy(); - } - this._disposed = true; - } - requestRaw(info, data) { - return __awaiter(this, undefined, undefined, function* () { - return new Promise((resolve, reject) => { - function callbackForResult(err, res) { - if (err) { - reject(err); - } else if (!res) { - reject(new Error("Unknown error")); - } else { - resolve(res); - } - } - this.requestRawWithCallback(info, data, callbackForResult); - }); - }); - } - requestRawWithCallback(info, data, onResult) { - if (typeof data === "string") { - if (!info.options.headers) { - info.options.headers = {}; - } - info.options.headers["Content-Length"] = Buffer.byteLength(data, "utf8"); - } - let callbackCalled = false; - function handleResult(err, res) { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); - } - } - const req = info.httpModule.request(info.options, (msg) => { - const res = new HttpClientResponse(msg); - handleResult(undefined, res); - }); - let socket; - req.on("socket", (sock) => { - socket = sock; - }); - req.setTimeout(this._socketTimeout || 3 * 60000, () => { - if (socket) { - socket.end(); - } - handleResult(new Error(`Request timeout: ${info.options.path}`)); - }); - req.on("error", function(err) { - handleResult(err); - }); - if (data && typeof data === "string") { - req.write(data, "utf8"); - } - if (data && typeof data !== "string") { - data.on("close", function() { - req.end(); - }); - data.pipe(req); - } else { - req.end(); - } - } - getAgent(serverUrl) { - const parsedUrl = new URL(serverUrl); - return this._getAgent(parsedUrl); - } - getAgentDispatcher(serverUrl) { - const parsedUrl = new URL(serverUrl); - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (!useProxy) { - return; - } - return this._getProxyAgentDispatcher(parsedUrl, proxyUrl); - } - _prepareRequest(method, requestUrl, headers) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === "https:"; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort; - info.options.path = (info.parsedUrl.pathname || "") + (info.parsedUrl.search || ""); - info.options.method = method; - info.options.headers = this._mergeHeaders(headers); - if (this.userAgent != null) { - info.options.headers["user-agent"] = this.userAgent; - } - info.options.agent = this._getAgent(info.parsedUrl); - if (this.handlers) { - for (const handler of this.handlers) { - handler.prepareRequest(info.options); - } - } - return info; - } - _mergeHeaders(headers) { - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); - } - return lowercaseKeys(headers || {}); - } - _getExistingOrDefaultHeader(additionalHeaders, header, _default) { - let clientHeader; - if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; - } - return additionalHeaders[header] || clientHeader || _default; - } - _getAgent(parsedUrl) { - let agent; - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (this._keepAlive && useProxy) { - agent = this._proxyAgent; - } - if (!useProxy) { - agent = this._agent; - } - if (agent) { - return agent; - } - const usingSsl = parsedUrl.protocol === "https:"; - let maxSockets = 100; - if (this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; - } - if (proxyUrl && proxyUrl.hostname) { - const agentOptions = { - maxSockets, - keepAlive: this._keepAlive, - proxy: Object.assign(Object.assign({}, (proxyUrl.username || proxyUrl.password) && { - proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` - }), { host: proxyUrl.hostname, port: proxyUrl.port }) - }; - let tunnelAgent; - const overHttps = proxyUrl.protocol === "https:"; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; - } else { - tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; - } - agent = tunnelAgent(agentOptions); - this._proxyAgent = agent; - } - if (!agent) { - const options = { keepAlive: this._keepAlive, maxSockets }; - agent = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent; - } - if (usingSsl && this._ignoreSslError) { - agent.options = Object.assign(agent.options || {}, { - rejectUnauthorized: false - }); - } - return agent; - } - _getProxyAgentDispatcher(parsedUrl, proxyUrl) { - let proxyAgent; - if (this._keepAlive) { - proxyAgent = this._proxyAgentDispatcher; - } - if (proxyAgent) { - return proxyAgent; - } - const usingSsl = parsedUrl.protocol === "https:"; - proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, (proxyUrl.username || proxyUrl.password) && { - token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString("base64")}` - })); - this._proxyAgentDispatcher = proxyAgent; - if (usingSsl && this._ignoreSslError) { - proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, { - rejectUnauthorized: false - }); - } - return proxyAgent; - } - _performExponentialBackoff(retryNumber) { - return __awaiter(this, undefined, undefined, function* () { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise((resolve) => setTimeout(() => resolve(), ms)); - }); - } - _processResponse(res, options) { - return __awaiter(this, undefined, undefined, function* () { - return new Promise((resolve, reject) => __awaiter(this, undefined, undefined, function* () { - const statusCode = res.message.statusCode || 0; - const response = { - statusCode, - result: null, - headers: {} - }; - if (statusCode === HttpCodes.NotFound) { - resolve(response); - } - function dateTimeDeserializer(key, value) { - if (typeof value === "string") { - const a = new Date(value); - if (!isNaN(a.valueOf())) { - return a; - } - } - return value; - } - let obj; - let contents; - try { - contents = yield res.readBody(); - if (contents && contents.length > 0) { - if (options && options.deserializeDates) { - obj = JSON.parse(contents, dateTimeDeserializer); - } else { - obj = JSON.parse(contents); - } - response.result = obj; - } - response.headers = res.message.headers; - } catch (err) { - } - if (statusCode > 299) { - let msg; - if (obj && obj.message) { - msg = obj.message; - } else if (contents && contents.length > 0) { - msg = contents; - } else { - msg = `Failed request: (${statusCode})`; - } - const err = new HttpClientError(msg, statusCode); - err.result = response.result; - reject(err); - } else { - resolve(response); - } - })); - }); - } - } - exports.HttpClient = HttpClient; - var lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {}); -}); - -// ../node_modules/@actions/http-client/lib/auth.js -var require_auth = __commonJS((exports) => { - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = undefined; - - class BasicCredentialHandler { - constructor(username, password) { - this.username = username; - this.password = password; - } - prepareRequest(options) { - if (!options.headers) { - throw Error("The request has no headers"); - } - options.headers["Authorization"] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString("base64")}`; - } - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, undefined, undefined, function* () { - throw new Error("not implemented"); - }); - } - } - exports.BasicCredentialHandler = BasicCredentialHandler; - - class BearerCredentialHandler { - constructor(token) { - this.token = token; - } - prepareRequest(options) { - if (!options.headers) { - throw Error("The request has no headers"); - } - options.headers["Authorization"] = `Bearer ${this.token}`; - } - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, undefined, undefined, function* () { - throw new Error("not implemented"); - }); - } - } - exports.BearerCredentialHandler = BearerCredentialHandler; - - class PersonalAccessTokenCredentialHandler { - constructor(token) { - this.token = token; - } - prepareRequest(options) { - if (!options.headers) { - throw Error("The request has no headers"); - } - options.headers["Authorization"] = `Basic ${Buffer.from(`PAT:${this.token}`).toString("base64")}`; - } - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, undefined, undefined, function* () { - throw new Error("not implemented"); - }); - } - } - exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; -}); - -// ../node_modules/@actions/core/lib/oidc-utils.js -var require_oidc_utils = __commonJS((exports) => { - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.OidcClient = undefined; - var http_client_1 = require_lib(); - var auth_1 = require_auth(); - var core_1 = require_core(); - - class OidcClient { - static createHttpClient(allowRetry = true, maxRetry = 10) { - const requestOptions = { - allowRetries: allowRetry, - maxRetries: maxRetry - }; - return new http_client_1.HttpClient("actions/oidc-client", [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); - } - static getRequestToken() { - const token = process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"]; - if (!token) { - throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable"); - } - return token; - } - static getIDTokenUrl() { - const runtimeUrl = process.env["ACTIONS_ID_TOKEN_REQUEST_URL"]; - if (!runtimeUrl) { - throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable"); - } - return runtimeUrl; - } - static getCall(id_token_url) { - var _a; - return __awaiter(this, undefined, undefined, function* () { - const httpclient = OidcClient.createHttpClient(); - const res = yield httpclient.getJson(id_token_url).catch((error) => { - throw new Error(`Failed to get ID Token. \n - Error Code : ${error.statusCode}\n - Error Message: ${error.message}`); - }); - const id_token = (_a = res.result) === null || _a === undefined ? undefined : _a.value; - if (!id_token) { - throw new Error("Response json body do not have ID Token field"); - } - return id_token; - }); - } - static getIDToken(audience) { - return __awaiter(this, undefined, undefined, function* () { - try { - let id_token_url = OidcClient.getIDTokenUrl(); - if (audience) { - const encodedAudience = encodeURIComponent(audience); - id_token_url = `${id_token_url}&audience=${encodedAudience}`; - } - (0, core_1.debug)(`ID token url is ${id_token_url}`); - const id_token = yield OidcClient.getCall(id_token_url); - (0, core_1.setSecret)(id_token); - return id_token; - } catch (error) { - throw new Error(`Error message: ${error.message}`); - } - }); - } - } - exports.OidcClient = OidcClient; -}); - -// ../node_modules/@actions/core/lib/summary.js -var require_summary = __commonJS((exports) => { - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = undefined; - var os_1 = __require("os"); - var fs_1 = __require("fs"); - var { access, appendFile, writeFile } = fs_1.promises; - exports.SUMMARY_ENV_VAR = "GITHUB_STEP_SUMMARY"; - exports.SUMMARY_DOCS_URL = "https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary"; - - class Summary { - constructor() { - this._buffer = ""; - } - filePath() { - return __awaiter(this, undefined, undefined, function* () { - if (this._filePath) { - return this._filePath; - } - const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR]; - if (!pathFromEnv) { - throw new Error(`Unable to find environment variable for \$${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); - } - try { - yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); - } catch (_a) { - throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); - } - this._filePath = pathFromEnv; - return this._filePath; - }); - } - wrap(tag, content, attrs = {}) { - const htmlAttrs = Object.entries(attrs).map(([key, value]) => ` ${key}="${value}"`).join(""); - if (!content) { - return `<${tag}${htmlAttrs}>`; - } - return `<${tag}${htmlAttrs}>${content}`; - } - write(options) { - return __awaiter(this, undefined, undefined, function* () { - const overwrite = !!(options === null || options === undefined ? undefined : options.overwrite); - const filePath = yield this.filePath(); - const writeFunc = overwrite ? writeFile : appendFile; - yield writeFunc(filePath, this._buffer, { encoding: "utf8" }); - return this.emptyBuffer(); - }); - } - clear() { - return __awaiter(this, undefined, undefined, function* () { - return this.emptyBuffer().write({ overwrite: true }); - }); - } - stringify() { - return this._buffer; - } - isEmptyBuffer() { - return this._buffer.length === 0; - } - emptyBuffer() { - this._buffer = ""; - return this; - } - addRaw(text, addEOL = false) { - this._buffer += text; - return addEOL ? this.addEOL() : this; - } - addEOL() { - return this.addRaw(os_1.EOL); - } - addCodeBlock(code, lang) { - const attrs = Object.assign({}, lang && { lang }); - const element = this.wrap("pre", this.wrap("code", code), attrs); - return this.addRaw(element).addEOL(); - } - addList(items, ordered = false) { - const tag = ordered ? "ol" : "ul"; - const listItems = items.map((item) => this.wrap("li", item)).join(""); - const element = this.wrap(tag, listItems); - return this.addRaw(element).addEOL(); - } - addTable(rows) { - const tableBody = rows.map((row) => { - const cells = row.map((cell) => { - if (typeof cell === "string") { - return this.wrap("td", cell); - } - const { header, data, colspan, rowspan } = cell; - const tag = header ? "th" : "td"; - const attrs = Object.assign(Object.assign({}, colspan && { colspan }), rowspan && { rowspan }); - return this.wrap(tag, data, attrs); - }).join(""); - return this.wrap("tr", cells); - }).join(""); - const element = this.wrap("table", tableBody); - return this.addRaw(element).addEOL(); - } - addDetails(label, content) { - const element = this.wrap("details", this.wrap("summary", label) + content); - return this.addRaw(element).addEOL(); - } - addImage(src, alt, options) { - const { width, height } = options || {}; - const attrs = Object.assign(Object.assign({}, width && { width }), height && { height }); - const element = this.wrap("img", null, Object.assign({ src, alt }, attrs)); - return this.addRaw(element).addEOL(); - } - addHeading(text, level) { - const tag = `h${level}`; - const allowedTag = ["h1", "h2", "h3", "h4", "h5", "h6"].includes(tag) ? tag : "h1"; - const element = this.wrap(allowedTag, text); - return this.addRaw(element).addEOL(); - } - addSeparator() { - const element = this.wrap("hr", null); - return this.addRaw(element).addEOL(); - } - addBreak() { - const element = this.wrap("br", null); - return this.addRaw(element).addEOL(); - } - addQuote(text, cite) { - const attrs = Object.assign({}, cite && { cite }); - const element = this.wrap("blockquote", text, attrs); - return this.addRaw(element).addEOL(); - } - addLink(text, href) { - const element = this.wrap("a", text, { href }); - return this.addRaw(element).addEOL(); - } - } - var _summary = new Summary; - exports.markdownSummary = _summary; - exports.summary = _summary; -}); - -// ../node_modules/@actions/core/lib/path-utils.js -var require_path_utils = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = undefined; - var path = __importStar(__require("path")); - function toPosixPath(pth) { - return pth.replace(/[\\]/g, "/"); - } - exports.toPosixPath = toPosixPath; - function toWin32Path(pth) { - return pth.replace(/[/]/g, "\\"); - } - exports.toWin32Path = toWin32Path; - function toPlatformPath(pth) { - return pth.replace(/[/\\]/g, path.sep); - } - exports.toPlatformPath = toPlatformPath; -}); - -// ../node_modules/@actions/core/lib/platform.js -var require_platform = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var __importDefault = exports && exports.__importDefault || function(mod) { - return mod && mod.__esModule ? mod : { default: mod }; - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.getDetails = exports.isLinux = exports.isMacOS = exports.isWindows = exports.arch = exports.platform = undefined; - var os_1 = __importDefault(__require("os")); - var exec = __importStar(require_exec()); - var getWindowsInfo = () => __awaiter(undefined, undefined, undefined, function* () { - const { stdout: version } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', undefined, { - silent: true - }); - const { stdout: name } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"', undefined, { - silent: true - }); - return { - name: name.trim(), - version: version.trim() - }; - }); - var getMacOsInfo = () => __awaiter(undefined, undefined, undefined, function* () { - var _a, _b, _c, _d; - const { stdout } = yield exec.getExecOutput("sw_vers", undefined, { - silent: true - }); - const version = (_b = (_a = stdout.match(/ProductVersion:\s*(.+)/)) === null || _a === undefined ? undefined : _a[1]) !== null && _b !== undefined ? _b : ""; - const name = (_d = (_c = stdout.match(/ProductName:\s*(.+)/)) === null || _c === undefined ? undefined : _c[1]) !== null && _d !== undefined ? _d : ""; - return { - name, - version - }; - }); - var getLinuxInfo = () => __awaiter(undefined, undefined, undefined, function* () { - const { stdout } = yield exec.getExecOutput("lsb_release", ["-i", "-r", "-s"], { - silent: true - }); - const [name, version] = stdout.trim().split("\n"); - return { - name, - version - }; - }); - exports.platform = os_1.default.platform(); - exports.arch = os_1.default.arch(); - exports.isWindows = exports.platform === "win32"; - exports.isMacOS = exports.platform === "darwin"; - exports.isLinux = exports.platform === "linux"; - function getDetails() { - return __awaiter(this, undefined, undefined, function* () { - return Object.assign(Object.assign({}, yield exports.isWindows ? getWindowsInfo() : exports.isMacOS ? getMacOsInfo() : getLinuxInfo()), { - platform: exports.platform, - arch: exports.arch, - isWindows: exports.isWindows, - isMacOS: exports.isMacOS, - isLinux: exports.isLinux - }); - }); - } - exports.getDetails = getDetails; -}); - -// ../node_modules/@actions/core/lib/core.js -var require_core = __commonJS((exports) => { - var __createBinding = exports && exports.__createBinding || (Object.create ? function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m[k]; - } }; - } - Object.defineProperty(o, k2, desc); - } : function(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - }); - var __setModuleDefault = exports && exports.__setModuleDefault || (Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }); - var __importStar = exports && exports.__importStar || function(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) { - for (var k in mod) - if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) - __createBinding(result, mod, k); - } - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P ? value : new P(function(resolve) { - resolve(value); - }); - } - return new (P || (P = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.platform = exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = exports.markdownSummary = exports.summary = exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = undefined; - var command_1 = require_command(); - var file_command_1 = require_file_command(); - var utils_1 = require_utils(); - var os = __importStar(__require("os")); - var path = __importStar(__require("path")); - var oidc_utils_1 = require_oidc_utils(); - var ExitCode; - (function(ExitCode2) { - ExitCode2[ExitCode2["Success"] = 0] = "Success"; - ExitCode2[ExitCode2["Failure"] = 1] = "Failure"; - })(ExitCode || (exports.ExitCode = ExitCode = {})); - function exportVariable(name, val) { - const convertedVal = (0, utils_1.toCommandValue)(val); - process.env[name] = convertedVal; - const filePath = process.env["GITHUB_ENV"] || ""; - if (filePath) { - return (0, file_command_1.issueFileCommand)("ENV", (0, file_command_1.prepareKeyValueMessage)(name, val)); - } - (0, command_1.issueCommand)("set-env", { name }, convertedVal); - } - exports.exportVariable = exportVariable; - function setSecret(secret) { - (0, command_1.issueCommand)("add-mask", {}, secret); - } - exports.setSecret = setSecret; - function addPath(inputPath) { - const filePath = process.env["GITHUB_PATH"] || ""; - if (filePath) { - (0, file_command_1.issueFileCommand)("PATH", inputPath); - } else { - (0, command_1.issueCommand)("add-path", {}, inputPath); - } - process.env["PATH"] = `${inputPath}${path.delimiter}${process.env["PATH"]}`; - } - exports.addPath = addPath; - function getInput(name, options) { - const val = process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] || ""; - if (options && options.required && !val) { - throw new Error(`Input required and not supplied: ${name}`); - } - if (options && options.trimWhitespace === false) { - return val; - } - return val.trim(); - } - exports.getInput = getInput; - function getMultilineInput(name, options) { - const inputs = getInput(name, options).split("\n").filter((x) => x !== ""); - if (options && options.trimWhitespace === false) { - return inputs; - } - return inputs.map((input) => input.trim()); - } - exports.getMultilineInput = getMultilineInput; - function getBooleanInput(name, options) { - const trueValue = ["true", "True", "TRUE"]; - const falseValue = ["false", "False", "FALSE"]; - const val = getInput(name, options); - if (trueValue.includes(val)) - return true; - if (falseValue.includes(val)) - return false; - throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); - } - exports.getBooleanInput = getBooleanInput; - function setOutput(name, value) { - const filePath = process.env["GITHUB_OUTPUT"] || ""; - if (filePath) { - return (0, file_command_1.issueFileCommand)("OUTPUT", (0, file_command_1.prepareKeyValueMessage)(name, value)); - } - process.stdout.write(os.EOL); - (0, command_1.issueCommand)("set-output", { name }, (0, utils_1.toCommandValue)(value)); - } - exports.setOutput = setOutput; - function setCommandEcho(enabled) { - (0, command_1.issue)("echo", enabled ? "on" : "off"); - } - exports.setCommandEcho = setCommandEcho; - function setFailed(message) { - process.exitCode = ExitCode.Failure; - error(message); - } - exports.setFailed = setFailed; - function isDebug() { - return process.env["RUNNER_DEBUG"] === "1"; - } - exports.isDebug = isDebug; - function debug(message) { - (0, command_1.issueCommand)("debug", {}, message); - } - exports.debug = debug; - function error(message, properties = {}) { - (0, command_1.issueCommand)("error", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports.error = error; - function warning(message, properties = {}) { - (0, command_1.issueCommand)("warning", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports.warning = warning; - function notice(message, properties = {}) { - (0, command_1.issueCommand)("notice", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); - } - exports.notice = notice; - function info(message) { - process.stdout.write(message + os.EOL); - } - exports.info = info; - function startGroup(name) { - (0, command_1.issue)("group", name); - } - exports.startGroup = startGroup; - function endGroup() { - (0, command_1.issue)("endgroup"); - } - exports.endGroup = endGroup; - function group(name, fn) { - return __awaiter(this, undefined, undefined, function* () { - startGroup(name); - let result; - try { - result = yield fn(); - } finally { - endGroup(); - } - return result; - }); - } - exports.group = group; - function saveState(name, value) { - const filePath = process.env["GITHUB_STATE"] || ""; - if (filePath) { - return (0, file_command_1.issueFileCommand)("STATE", (0, file_command_1.prepareKeyValueMessage)(name, value)); - } - (0, command_1.issueCommand)("save-state", { name }, (0, utils_1.toCommandValue)(value)); - } - exports.saveState = saveState; - function getState(name) { - return process.env[`STATE_${name}`] || ""; - } - exports.getState = getState; - function getIDToken(aud) { - return __awaiter(this, undefined, undefined, function* () { - return yield oidc_utils_1.OidcClient.getIDToken(aud); - }); - } - exports.getIDToken = getIDToken; - var summary_1 = require_summary(); - Object.defineProperty(exports, "summary", { enumerable: true, get: function() { - return summary_1.summary; - } }); - var summary_2 = require_summary(); - Object.defineProperty(exports, "markdownSummary", { enumerable: true, get: function() { - return summary_2.markdownSummary; - } }); - var path_utils_1 = require_path_utils(); - Object.defineProperty(exports, "toPosixPath", { enumerable: true, get: function() { - return path_utils_1.toPosixPath; - } }); - Object.defineProperty(exports, "toWin32Path", { enumerable: true, get: function() { - return path_utils_1.toWin32Path; - } }); - Object.defineProperty(exports, "toPlatformPath", { enumerable: true, get: function() { - return path_utils_1.toPlatformPath; - } }); - exports.platform = __importStar(require_platform()); -}); - -// src/jobs/post.ts -var import_exec = __toESM(require_exec(), 1); -var import_core = __toESM(require_core(), 1); -import * as fs from "node:fs"; -(async function post() { - let cwd = import_core.getState("CWD"); - let start = new Date(import_core.getState("YDB_START_TIME")); - let end = new Date; - import_core.debug("Stopping YDB..."); - await import_exec.exec(`docker`, [`compose`, `-f`, `compose.yaml`, `down`], { cwd }); - import_core.debug(`YDB stopped at ${end}`); - import_core.saveState("YDB_END_TIME", end.toISOString()); - let duration = end.getTime() - start.getTime(); - import_core.debug(`YDB SLO Test duration: ${duration}ms.`); - import_core.debug("Cleaning up temp directory..."); - fs.rmSync(cwd, { recursive: true }); -})(); - -//# debugId=5D8BF783E829BF0064756E2164756E21 -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2lvL2xpYi9pby11dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9pby9saWIvaW8uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2V4ZWMvbGliL3Rvb2xydW5uZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2V4ZWMvbGliL2V4ZWMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL3V0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9jb21tYW5kLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9maWxlLWNvbW1hbmQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9wcm94eS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdHVubmVsL2xpYi90dW5uZWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS9zeW1ib2xzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvcmUvZXJyb3JzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvcmUvY29uc3RhbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvcmUvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi90aW1lcnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9kZXBzL3N0cmVhbXNlYXJjaC9zYm1oLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvZGVwcy9kaWNlci9saWIvUGFydFN0cmVhbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi91dGlscy9nZXRMaW1pdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2RlcHMvZGljZXIvbGliL0hlYWRlclBhcnNlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2RlcHMvZGljZXIvbGliL0RpY2VyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvbGliL3V0aWxzL2RlY29kZVRleHQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvcGFyc2VQYXJhbXMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvYmFzZW5hbWUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdHlwZXMvbXVsdGlwYXJ0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvbGliL3V0aWxzL0RlY29kZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdHlwZXMvdXJsZW5jb2RlZC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi9tYWluLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2NvbnN0YW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9nbG9iYWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9zeW1ib2xzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL3dlYmlkbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9kYXRhVVJMLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2ZpbGUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvZm9ybWRhdGEuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvYm9keS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL3JlcXVlc3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZGlzcGF0Y2hlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9kaXNwYXRjaGVyLWJhc2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS9jb25uZWN0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2xsaHR0cC91dGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9sbGh0dHAvY29uc3RhbnRzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2hhbmRsZXIvUmVkaXJlY3RIYW5kbGVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3IuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbGxodHRwL2xsaHR0cC13YXNtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2xsaHR0cC9sbGh0dHBfc2ltZC13YXNtLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NsaWVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9ub2RlL2ZpeGVkLXF1ZXVlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3Bvb2wtc3RhdHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvcG9vbC1iYXNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3Bvb2wuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYmFsYW5jZWQtcG9vbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb21wYXQvZGlzcGF0Y2hlci13ZWFrcmVmLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FnZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9yZWFkYWJsZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvYWJvcnQtc2lnbmFsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktcmVxdWVzdC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvYXBpLXN0cmVhbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvYXBpLXBpcGVsaW5lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktdXBncmFkZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvYXBpLWNvbm5lY3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYXBpL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1lcnJvcnMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9tb2NrLXN5bWJvbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9tb2NrLXV0aWxzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1pbnRlcmNlcHRvci5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stY2xpZW50LmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1wb29sLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svcGx1cmFsaXplci5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL3BlbmRpbmctaW50ZXJjZXB0b3JzLWZvcm1hdHRlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stYWdlbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvcHJveHktYWdlbnQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvaGFuZGxlci9SZXRyeUhhbmRsZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZ2xvYmFsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2hhbmRsZXIvRGVjb3JhdG9ySGFuZGxlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9oZWFkZXJzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL3Jlc3BvbnNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL3JlcXVlc3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmlsZWFwaS9zeW1ib2xzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvcHJvZ3Jlc3NldmVudC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9maWxlYXBpL2VuY29kaW5nLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9maWxlYXBpL2ZpbGVyZWFkZXIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY2FjaGUvc3ltYm9scy5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jYWNoZS91dGlsLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NhY2hlL2NhY2hlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NhY2hlL2NhY2hlc3RvcmFnZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb29raWVzL2NvbnN0YW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb29raWVzL3V0aWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29va2llcy9wYXJzZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb29raWVzL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC9jb25zdGFudHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L3N5bWJvbHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L2V2ZW50cy5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvY29ubmVjdGlvbi5qcyIsICIuLi9ub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvZnJhbWUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L3JlY2VpdmVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC93ZWJzb2NrZXQuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3VuZGljaS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvaHR0cC1jbGllbnQvbGliL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9AYWN0aW9ucy9odHRwLWNsaWVudC9saWIvYXV0aC5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvb2lkYy11dGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvc3VtbWFyeS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvcGF0aC11dGlscy5qcyIsICIuLi9ub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvcGxhdGZvcm0uanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL2NvcmUuanMiLCAic3JjL2pvYnMvcG9zdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfYTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0Q21kUGF0aCA9IGV4cG9ydHMudHJ5R2V0RXhlY3V0YWJsZVBhdGggPSBleHBvcnRzLmlzUm9vdGVkID0gZXhwb3J0cy5pc0RpcmVjdG9yeSA9IGV4cG9ydHMuZXhpc3RzID0gZXhwb3J0cy5SRUFET05MWSA9IGV4cG9ydHMuVVZfRlNfT19FWExPQ0sgPSBleHBvcnRzLklTX1dJTkRPV1MgPSBleHBvcnRzLnVubGluayA9IGV4cG9ydHMuc3ltbGluayA9IGV4cG9ydHMuc3RhdCA9IGV4cG9ydHMucm1kaXIgPSBleHBvcnRzLnJtID0gZXhwb3J0cy5yZW5hbWUgPSBleHBvcnRzLnJlYWRsaW5rID0gZXhwb3J0cy5yZWFkZGlyID0gZXhwb3J0cy5vcGVuID0gZXhwb3J0cy5ta2RpciA9IGV4cG9ydHMubHN0YXQgPSBleHBvcnRzLmNvcHlGaWxlID0gZXhwb3J0cy5jaG1vZCA9IHZvaWQgMDtcbmNvbnN0IGZzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJmc1wiKSk7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbl9hID0gZnMucHJvbWlzZXNcbi8vIGV4cG9ydCBjb25zdCB7b3Blbn0gPSAnZnMnXG4sIGV4cG9ydHMuY2htb2QgPSBfYS5jaG1vZCwgZXhwb3J0cy5jb3B5RmlsZSA9IF9hLmNvcHlGaWxlLCBleHBvcnRzLmxzdGF0ID0gX2EubHN0YXQsIGV4cG9ydHMubWtkaXIgPSBfYS5ta2RpciwgZXhwb3J0cy5vcGVuID0gX2Eub3BlbiwgZXhwb3J0cy5yZWFkZGlyID0gX2EucmVhZGRpciwgZXhwb3J0cy5yZWFkbGluayA9IF9hLnJlYWRsaW5rLCBleHBvcnRzLnJlbmFtZSA9IF9hLnJlbmFtZSwgZXhwb3J0cy5ybSA9IF9hLnJtLCBleHBvcnRzLnJtZGlyID0gX2Eucm1kaXIsIGV4cG9ydHMuc3RhdCA9IF9hLnN0YXQsIGV4cG9ydHMuc3ltbGluayA9IF9hLnN5bWxpbmssIGV4cG9ydHMudW5saW5rID0gX2EudW5saW5rO1xuLy8gZXhwb3J0IGNvbnN0IHtvcGVufSA9ICdmcydcbmV4cG9ydHMuSVNfV0lORE9XUyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvZDAxNTNhZWUzNjc0MjJkMDg1ODEwNWFiZWMxODZkYTRkZmYwYTBjNS9kZXBzL3V2L2luY2x1ZGUvdXYvd2luLmgjTDY5MVxuZXhwb3J0cy5VVl9GU19PX0VYTE9DSyA9IDB4MTAwMDAwMDA7XG5leHBvcnRzLlJFQURPTkxZID0gZnMuY29uc3RhbnRzLk9fUkRPTkxZO1xuZnVuY3Rpb24gZXhpc3RzKGZzUGF0aCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB5aWVsZCBleHBvcnRzLnN0YXQoZnNQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xufVxuZXhwb3J0cy5leGlzdHMgPSBleGlzdHM7XG5mdW5jdGlvbiBpc0RpcmVjdG9yeShmc1BhdGgsIHVzZVN0YXQgPSBmYWxzZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gdXNlU3RhdCA/IHlpZWxkIGV4cG9ydHMuc3RhdChmc1BhdGgpIDogeWllbGQgZXhwb3J0cy5sc3RhdChmc1BhdGgpO1xuICAgICAgICByZXR1cm4gc3RhdHMuaXNEaXJlY3RvcnkoKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuaXNEaXJlY3RvcnkgPSBpc0RpcmVjdG9yeTtcbi8qKlxuICogT24gT1NYL0xpbnV4LCB0cnVlIGlmIHBhdGggc3RhcnRzIHdpdGggJy8nLiBPbiBXaW5kb3dzLCB0cnVlIGZvciBwYXRocyBsaWtlOlxuICogXFwsIFxcaGVsbG8sIFxcXFxoZWxsb1xcc2hhcmUsIEM6LCBhbmQgQzpcXGhlbGxvIChhbmQgY29ycmVzcG9uZGluZyBhbHRlcm5hdGUgc2VwYXJhdG9yIGNhc2VzKS5cbiAqL1xuZnVuY3Rpb24gaXNSb290ZWQocCkge1xuICAgIHAgPSBub3JtYWxpemVTZXBhcmF0b3JzKHApO1xuICAgIGlmICghcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lzUm9vdGVkKCkgcGFyYW1ldGVyIFwicFwiIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cbiAgICBpZiAoZXhwb3J0cy5JU19XSU5ET1dTKSB7XG4gICAgICAgIHJldHVybiAocC5zdGFydHNXaXRoKCdcXFxcJykgfHwgL15bQS1aXTovaS50ZXN0KHApIC8vIGUuZy4gXFwgb3IgXFxoZWxsbyBvciBcXFxcaGVsbG9cbiAgICAgICAgKTsgLy8gZS5nLiBDOiBvciBDOlxcaGVsbG9cbiAgICB9XG4gICAgcmV0dXJuIHAuc3RhcnRzV2l0aCgnLycpO1xufVxuZXhwb3J0cy5pc1Jvb3RlZCA9IGlzUm9vdGVkO1xuLyoqXG4gKiBCZXN0IGVmZm9ydCBhdHRlbXB0IHRvIGRldGVybWluZSB3aGV0aGVyIGEgZmlsZSBleGlzdHMgYW5kIGlzIGV4ZWN1dGFibGUuXG4gKiBAcGFyYW0gZmlsZVBhdGggICAgZmlsZSBwYXRoIHRvIGNoZWNrXG4gKiBAcGFyYW0gZXh0ZW5zaW9ucyAgYWRkaXRpb25hbCBmaWxlIGV4dGVuc2lvbnMgdG8gdHJ5XG4gKiBAcmV0dXJuIGlmIGZpbGUgZXhpc3RzIGFuZCBpcyBleGVjdXRhYmxlLCByZXR1cm5zIHRoZSBmaWxlIHBhdGguIG90aGVyd2lzZSBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRyeUdldEV4ZWN1dGFibGVQYXRoKGZpbGVQYXRoLCBleHRlbnNpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHN0YXRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gdGVzdCBmaWxlIGV4aXN0c1xuICAgICAgICAgICAgc3RhdHMgPSB5aWVsZCBleHBvcnRzLnN0YXQoZmlsZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBVbmV4cGVjdGVkIGVycm9yIGF0dGVtcHRpbmcgdG8gZGV0ZXJtaW5lIGlmIGV4ZWN1dGFibGUgZmlsZSBleGlzdHMgJyR7ZmlsZVBhdGh9JzogJHtlcnJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRzICYmIHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICBpZiAoZXhwb3J0cy5JU19XSU5ET1dTKSB7XG4gICAgICAgICAgICAgICAgLy8gb24gV2luZG93cywgdGVzdCBmb3IgdmFsaWQgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgY29uc3QgdXBwZXJFeHQgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbnMuc29tZSh2YWxpZEV4dCA9PiB2YWxpZEV4dC50b1VwcGVyQ2FzZSgpID09PSB1cHBlckV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpc1VuaXhFeGVjdXRhYmxlKHN0YXRzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRyeSBlYWNoIGV4dGVuc2lvblxuICAgICAgICBjb25zdCBvcmlnaW5hbEZpbGVQYXRoID0gZmlsZVBhdGg7XG4gICAgICAgIGZvciAoY29uc3QgZXh0ZW5zaW9uIG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgICAgIGZpbGVQYXRoID0gb3JpZ2luYWxGaWxlUGF0aCArIGV4dGVuc2lvbjtcbiAgICAgICAgICAgIHN0YXRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGF0cyA9IHlpZWxkIGV4cG9ydHMuc3RhdChmaWxlUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVW5leHBlY3RlZCBlcnJvciBhdHRlbXB0aW5nIHRvIGRldGVybWluZSBpZiBleGVjdXRhYmxlIGZpbGUgZXhpc3RzICcke2ZpbGVQYXRofSc6ICR7ZXJyfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0cyAmJiBzdGF0cy5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgIGlmIChleHBvcnRzLklTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VydmUgdGhlIGNhc2Ugb2YgdGhlIGFjdHVhbCBmaWxlIChzaW5jZSBhbiBleHRlbnNpb24gd2FzIGFwcGVuZGVkKVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwcGVyTmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFjdHVhbE5hbWUgb2YgeWllbGQgZXhwb3J0cy5yZWFkZGlyKGRpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBwZXJOYW1lID09PSBhY3R1YWxOYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCBhY3R1YWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVW5leHBlY3RlZCBlcnJvciBhdHRlbXB0aW5nIHRvIGRldGVybWluZSB0aGUgYWN0dWFsIGNhc2Ugb2YgdGhlIGZpbGUgJyR7ZmlsZVBhdGh9JzogJHtlcnJ9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5peEV4ZWN1dGFibGUoc3RhdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xufVxuZXhwb3J0cy50cnlHZXRFeGVjdXRhYmxlUGF0aCA9IHRyeUdldEV4ZWN1dGFibGVQYXRoO1xuZnVuY3Rpb24gbm9ybWFsaXplU2VwYXJhdG9ycyhwKSB7XG4gICAgcCA9IHAgfHwgJyc7XG4gICAgaWYgKGV4cG9ydHMuSVNfV0lORE9XUykge1xuICAgICAgICAvLyBjb252ZXJ0IHNsYXNoZXMgb24gV2luZG93c1xuICAgICAgICBwID0gcC5yZXBsYWNlKC9cXC8vZywgJ1xcXFwnKTtcbiAgICAgICAgLy8gcmVtb3ZlIHJlZHVuZGFudCBzbGFzaGVzXG4gICAgICAgIHJldHVybiBwLnJlcGxhY2UoL1xcXFxcXFxcKy9nLCAnXFxcXCcpO1xuICAgIH1cbiAgICAvLyByZW1vdmUgcmVkdW5kYW50IHNsYXNoZXNcbiAgICByZXR1cm4gcC5yZXBsYWNlKC9cXC9cXC8rL2csICcvJyk7XG59XG4vLyBvbiBNYWMvTGludXgsIHRlc3QgdGhlIGV4ZWN1dGUgYml0XG4vLyAgICAgUiAgIFcgIFggIFIgIFcgWCBSIFcgWFxuLy8gICAyNTYgMTI4IDY0IDMyIDE2IDggNCAyIDFcbmZ1bmN0aW9uIGlzVW5peEV4ZWN1dGFibGUoc3RhdHMpIHtcbiAgICByZXR1cm4gKChzdGF0cy5tb2RlICYgMSkgPiAwIHx8XG4gICAgICAgICgoc3RhdHMubW9kZSAmIDgpID4gMCAmJiBzdGF0cy5naWQgPT09IHByb2Nlc3MuZ2V0Z2lkKCkpIHx8XG4gICAgICAgICgoc3RhdHMubW9kZSAmIDY0KSA+IDAgJiYgc3RhdHMudWlkID09PSBwcm9jZXNzLmdldHVpZCgpKSk7XG59XG4vLyBHZXQgdGhlIHBhdGggb2YgY21kLmV4ZSBpbiB3aW5kb3dzXG5mdW5jdGlvbiBnZXRDbWRQYXRoKCkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKF9hID0gcHJvY2Vzcy5lbnZbJ0NPTVNQRUMnXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogYGNtZC5leGVgO1xufVxuZXhwb3J0cy5nZXRDbWRQYXRoID0gZ2V0Q21kUGF0aDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlvLXV0aWwuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZmluZEluUGF0aCA9IGV4cG9ydHMud2hpY2ggPSBleHBvcnRzLm1rZGlyUCA9IGV4cG9ydHMucm1SRiA9IGV4cG9ydHMubXYgPSBleHBvcnRzLmNwID0gdm9pZCAwO1xuY29uc3QgYXNzZXJ0XzEgPSByZXF1aXJlKFwiYXNzZXJ0XCIpO1xuY29uc3QgcGF0aCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicGF0aFwiKSk7XG5jb25zdCBpb1V0aWwgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vaW8tdXRpbFwiKSk7XG4vKipcbiAqIENvcGllcyBhIGZpbGUgb3IgZm9sZGVyLlxuICogQmFzZWQgb2ZmIG9mIHNoZWxsanMgLSBodHRwczovL2dpdGh1Yi5jb20vc2hlbGxqcy9zaGVsbGpzL2Jsb2IvOTIzN2Y2NmM1MmU1ZGFhNDA0NThmOTRmOTU2NWUxOGU4MTMyZjVhNi9zcmMvY3AuanNcbiAqXG4gKiBAcGFyYW0gICAgIHNvdXJjZSAgICBzb3VyY2UgcGF0aFxuICogQHBhcmFtICAgICBkZXN0ICAgICAgZGVzdGluYXRpb24gcGF0aFxuICogQHBhcmFtICAgICBvcHRpb25zICAgb3B0aW9uYWwuIFNlZSBDb3B5T3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gY3Aoc291cmNlLCBkZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCB7IGZvcmNlLCByZWN1cnNpdmUsIGNvcHlTb3VyY2VEaXJlY3RvcnkgfSA9IHJlYWRDb3B5T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZGVzdFN0YXQgPSAoeWllbGQgaW9VdGlsLmV4aXN0cyhkZXN0KSkgPyB5aWVsZCBpb1V0aWwuc3RhdChkZXN0KSA6IG51bGw7XG4gICAgICAgIC8vIERlc3QgaXMgYW4gZXhpc3RpbmcgZmlsZSwgYnV0IG5vdCBmb3JjaW5nXG4gICAgICAgIGlmIChkZXN0U3RhdCAmJiBkZXN0U3RhdC5pc0ZpbGUoKSAmJiAhZm9yY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBkZXN0IGlzIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSwgc2hvdWxkIGNvcHkgaW5zaWRlLlxuICAgICAgICBjb25zdCBuZXdEZXN0ID0gZGVzdFN0YXQgJiYgZGVzdFN0YXQuaXNEaXJlY3RvcnkoKSAmJiBjb3B5U291cmNlRGlyZWN0b3J5XG4gICAgICAgICAgICA/IHBhdGguam9pbihkZXN0LCBwYXRoLmJhc2VuYW1lKHNvdXJjZSkpXG4gICAgICAgICAgICA6IGRlc3Q7XG4gICAgICAgIGlmICghKHlpZWxkIGlvVXRpbC5leGlzdHMoc291cmNlKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeTogJHtzb3VyY2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlU3RhdCA9IHlpZWxkIGlvVXRpbC5zdGF0KHNvdXJjZSk7XG4gICAgICAgIGlmIChzb3VyY2VTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIGlmICghcmVjdXJzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY29weS4gJHtzb3VyY2V9IGlzIGEgZGlyZWN0b3J5LCBidXQgdHJpZWQgdG8gY29weSB3aXRob3V0IHJlY3Vyc2l2ZSBmbGFnLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeWllbGQgY3BEaXJSZWN1cnNpdmUoc291cmNlLCBuZXdEZXN0LCAwLCBmb3JjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocGF0aC5yZWxhdGl2ZShzb3VyY2UsIG5ld0Rlc3QpID09PSAnJykge1xuICAgICAgICAgICAgICAgIC8vIGEgZmlsZSBjYW5ub3QgYmUgY29waWVkIHRvIGl0c2VsZlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmV3RGVzdH0nIGFuZCAnJHtzb3VyY2V9JyBhcmUgdGhlIHNhbWUgZmlsZWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgY29weUZpbGUoc291cmNlLCBuZXdEZXN0LCBmb3JjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydHMuY3AgPSBjcDtcbi8qKlxuICogTW92ZXMgYSBwYXRoLlxuICpcbiAqIEBwYXJhbSAgICAgc291cmNlICAgIHNvdXJjZSBwYXRoXG4gKiBAcGFyYW0gICAgIGRlc3QgICAgICBkZXN0aW5hdGlvbiBwYXRoXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgICBvcHRpb25hbC4gU2VlIE1vdmVPcHRpb25zLlxuICovXG5mdW5jdGlvbiBtdihzb3VyY2UsIGRlc3QsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICh5aWVsZCBpb1V0aWwuZXhpc3RzKGRlc3QpKSB7XG4gICAgICAgICAgICBsZXQgZGVzdEV4aXN0cyA9IHRydWU7XG4gICAgICAgICAgICBpZiAoeWllbGQgaW9VdGlsLmlzRGlyZWN0b3J5KGRlc3QpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgZGVzdCBpcyBkaXJlY3RvcnkgY29weSBzcmMgaW50byBkZXN0XG4gICAgICAgICAgICAgICAgZGVzdCA9IHBhdGguam9pbihkZXN0LCBwYXRoLmJhc2VuYW1lKHNvdXJjZSkpO1xuICAgICAgICAgICAgICAgIGRlc3RFeGlzdHMgPSB5aWVsZCBpb1V0aWwuZXhpc3RzKGRlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlc3RFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JjZSA9PSBudWxsIHx8IG9wdGlvbnMuZm9yY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgcm1SRihkZXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGVzdGluYXRpb24gYWxyZWFkeSBleGlzdHMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgbWtkaXJQKHBhdGguZGlybmFtZShkZXN0KSk7XG4gICAgICAgIHlpZWxkIGlvVXRpbC5yZW5hbWUoc291cmNlLCBkZXN0KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMubXYgPSBtdjtcbi8qKlxuICogUmVtb3ZlIGEgcGF0aCByZWN1cnNpdmVseSB3aXRoIGZvcmNlXG4gKlxuICogQHBhcmFtIGlucHV0UGF0aCBwYXRoIHRvIHJlbW92ZVxuICovXG5mdW5jdGlvbiBybVJGKGlucHV0UGF0aCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmIChpb1V0aWwuSVNfV0lORE9XUykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgY2hhcmFjdGVyc1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy93aW4zMi9maWxlaW8vbmFtaW5nLWEtZmlsZVxuICAgICAgICAgICAgaWYgKC9bKlwiPD58XS8udGVzdChpbnB1dFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIHBhdGggbXVzdCBub3QgY29udGFpbiBgKmAsIGBcImAsIGA8YCwgYD5gIG9yIGB8YCBvbiBXaW5kb3dzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIG5vdGUgaWYgcGF0aCBkb2VzIG5vdCBleGlzdCwgZXJyb3IgaXMgc2lsZW50XG4gICAgICAgICAgICB5aWVsZCBpb1V0aWwucm0oaW5wdXRQYXRoLCB7XG4gICAgICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICAgICAgbWF4UmV0cmllczogMyxcbiAgICAgICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgcmV0cnlEZWxheTogMzAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgd2FzIHVuYWJsZSB0byBiZSByZW1vdmVkICR7ZXJyfWApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnRzLnJtUkYgPSBybVJGO1xuLyoqXG4gKiBNYWtlIGEgZGlyZWN0b3J5LiAgQ3JlYXRlcyB0aGUgZnVsbCBwYXRoIHdpdGggZm9sZGVycyBpbiBiZXR3ZWVuXG4gKiBXaWxsIHRocm93IGlmIGl0IGZhaWxzXG4gKlxuICogQHBhcmFtICAgZnNQYXRoICAgICAgICBwYXRoIHRvIGNyZWF0ZVxuICogQHJldHVybnMgUHJvbWlzZTx2b2lkPlxuICovXG5mdW5jdGlvbiBta2RpclAoZnNQYXRoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgYXNzZXJ0XzEub2soZnNQYXRoLCAnYSBwYXRoIGFyZ3VtZW50IG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgICAgICAgeWllbGQgaW9VdGlsLm1rZGlyKGZzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLm1rZGlyUCA9IG1rZGlyUDtcbi8qKlxuICogUmV0dXJucyBwYXRoIG9mIGEgdG9vbCBoYWQgdGhlIHRvb2wgYWN0dWFsbHkgYmVlbiBpbnZva2VkLiAgUmVzb2x2ZXMgdmlhIHBhdGhzLlxuICogSWYgeW91IGNoZWNrIGFuZCB0aGUgdG9vbCBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCB0aHJvdy5cbiAqXG4gKiBAcGFyYW0gICAgIHRvb2wgICAgICAgICAgICAgIG5hbWUgb2YgdGhlIHRvb2xcbiAqIEBwYXJhbSAgICAgY2hlY2sgICAgICAgICAgICAgd2hldGhlciB0byBjaGVjayBpZiB0b29sIGV4aXN0c1xuICogQHJldHVybnMgICBQcm9taXNlPHN0cmluZz4gICBwYXRoIHRvIHRvb2xcbiAqL1xuZnVuY3Rpb24gd2hpY2godG9vbCwgY2hlY2spIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoIXRvb2wpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciAndG9vbCcgaXMgcmVxdWlyZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVjdXJzaXZlIHdoZW4gY2hlY2s9dHJ1ZVxuICAgICAgICBpZiAoY2hlY2spIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHdoaWNoKHRvb2wsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlvVXRpbC5JU19XSU5ET1dTKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvY2F0ZSBleGVjdXRhYmxlIGZpbGU6ICR7dG9vbH0uIFBsZWFzZSB2ZXJpZnkgZWl0aGVyIHRoZSBmaWxlIHBhdGggZXhpc3RzIG9yIHRoZSBmaWxlIGNhbiBiZSBmb3VuZCB3aXRoaW4gYSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiBBbHNvIHZlcmlmeSB0aGUgZmlsZSBoYXMgYSB2YWxpZCBleHRlbnNpb24gZm9yIGFuIGV4ZWN1dGFibGUgZmlsZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvY2F0ZSBleGVjdXRhYmxlIGZpbGU6ICR7dG9vbH0uIFBsZWFzZSB2ZXJpZnkgZWl0aGVyIHRoZSBmaWxlIHBhdGggZXhpc3RzIG9yIHRoZSBmaWxlIGNhbiBiZSBmb3VuZCB3aXRoaW4gYSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiBBbHNvIGNoZWNrIHRoZSBmaWxlIG1vZGUgdG8gdmVyaWZ5IHRoZSBmaWxlIGlzIGV4ZWN1dGFibGUuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXRjaGVzID0geWllbGQgZmluZEluUGF0aCh0b29sKTtcbiAgICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1swXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG59XG5leHBvcnRzLndoaWNoID0gd2hpY2g7XG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgZ2l2ZW4gdG9vbCBvbiB0aGUgc3lzdGVtIHBhdGguXG4gKlxuICogQHJldHVybnMgICBQcm9taXNlPHN0cmluZ1tdPiAgdGhlIHBhdGhzIG9mIHRoZSB0b29sXG4gKi9cbmZ1bmN0aW9uIGZpbmRJblBhdGgodG9vbCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghdG9vbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyICd0b29sJyBpcyByZXF1aXJlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBidWlsZCB0aGUgbGlzdCBvZiBleHRlbnNpb25zIHRvIHRyeVxuICAgICAgICBjb25zdCBleHRlbnNpb25zID0gW107XG4gICAgICAgIGlmIChpb1V0aWwuSVNfV0lORE9XUyAmJiBwcm9jZXNzLmVudlsnUEFUSEVYVCddKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4dGVuc2lvbiBvZiBwcm9jZXNzLmVudlsnUEFUSEVYVCddLnNwbGl0KHBhdGguZGVsaW1pdGVyKSkge1xuICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5wdXNoKGV4dGVuc2lvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGl0J3Mgcm9vdGVkLCByZXR1cm4gaXQgaWYgZXhpc3RzLiBvdGhlcndpc2UgcmV0dXJuIGVtcHR5LlxuICAgICAgICBpZiAoaW9VdGlsLmlzUm9vdGVkKHRvb2wpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHlpZWxkIGlvVXRpbC50cnlHZXRFeGVjdXRhYmxlUGF0aCh0b29sLCBleHRlbnNpb25zKTtcbiAgICAgICAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFueSBwYXRoIHNlcGFyYXRvcnMsIHJldHVybiBlbXB0eVxuICAgICAgICBpZiAodG9vbC5pbmNsdWRlcyhwYXRoLnNlcCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBidWlsZCB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuICAgICAgICAvL1xuICAgICAgICAvLyBOb3RlLCB0ZWNobmljYWxseSBcIndoZXJlXCIgY2hlY2tzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvbiBXaW5kb3dzLiBGcm9tIGEgdG9vbGtpdCBwZXJzcGVjdGl2ZSxcbiAgICAgICAgLy8gaXQgZmVlbHMgbGlrZSB3ZSBzaG91bGQgbm90IGRvIHRoaXMuIENoZWNraW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBzZWVtcyBsaWtlIG1vcmUgb2YgYSB1c2VcbiAgICAgICAgLy8gY2FzZSBvZiBhIHNoZWxsLCBhbmQgdGhlIHdoaWNoKCkgZnVuY3Rpb24gZXhwb3NlZCBieSB0aGUgdG9vbGtpdCBzaG91bGQgc3RyaXZlIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAvLyBhY3Jvc3MgcGxhdGZvcm1zLlxuICAgICAgICBjb25zdCBkaXJlY3RvcmllcyA9IFtdO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuUEFUSCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHByb2Nlc3MuZW52LlBBVEguc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMucHVzaChwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmluZCBhbGwgbWF0Y2hlc1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHlpZWxkIGlvVXRpbC50cnlHZXRFeGVjdXRhYmxlUGF0aChwYXRoLmpvaW4oZGlyZWN0b3J5LCB0b29sKSwgZXh0ZW5zaW9ucyk7XG4gICAgICAgICAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXRjaGVzO1xuICAgIH0pO1xufVxuZXhwb3J0cy5maW5kSW5QYXRoID0gZmluZEluUGF0aDtcbmZ1bmN0aW9uIHJlYWRDb3B5T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgY29uc3QgZm9yY2UgPSBvcHRpb25zLmZvcmNlID09IG51bGwgPyB0cnVlIDogb3B0aW9ucy5mb3JjZTtcbiAgICBjb25zdCByZWN1cnNpdmUgPSBCb29sZWFuKG9wdGlvbnMucmVjdXJzaXZlKTtcbiAgICBjb25zdCBjb3B5U291cmNlRGlyZWN0b3J5ID0gb3B0aW9ucy5jb3B5U291cmNlRGlyZWN0b3J5ID09IG51bGxcbiAgICAgICAgPyB0cnVlXG4gICAgICAgIDogQm9vbGVhbihvcHRpb25zLmNvcHlTb3VyY2VEaXJlY3RvcnkpO1xuICAgIHJldHVybiB7IGZvcmNlLCByZWN1cnNpdmUsIGNvcHlTb3VyY2VEaXJlY3RvcnkgfTtcbn1cbmZ1bmN0aW9uIGNwRGlyUmVjdXJzaXZlKHNvdXJjZURpciwgZGVzdERpciwgY3VycmVudERlcHRoLCBmb3JjZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBub3QgYSBydW4gYXdheSByZWN1cnNpdmUgY29weVxuICAgICAgICBpZiAoY3VycmVudERlcHRoID49IDI1NSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY3VycmVudERlcHRoKys7XG4gICAgICAgIHlpZWxkIG1rZGlyUChkZXN0RGlyKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSB5aWVsZCBpb1V0aWwucmVhZGRpcihzb3VyY2VEaXIpO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzcmNGaWxlID0gYCR7c291cmNlRGlyfS8ke2ZpbGVOYW1lfWA7XG4gICAgICAgICAgICBjb25zdCBkZXN0RmlsZSA9IGAke2Rlc3REaXJ9LyR7ZmlsZU5hbWV9YDtcbiAgICAgICAgICAgIGNvbnN0IHNyY0ZpbGVTdGF0ID0geWllbGQgaW9VdGlsLmxzdGF0KHNyY0ZpbGUpO1xuICAgICAgICAgICAgaWYgKHNyY0ZpbGVTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICAvLyBSZWN1cnNlXG4gICAgICAgICAgICAgICAgeWllbGQgY3BEaXJSZWN1cnNpdmUoc3JjRmlsZSwgZGVzdEZpbGUsIGN1cnJlbnREZXB0aCwgZm9yY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeWllbGQgY29weUZpbGUoc3JjRmlsZSwgZGVzdEZpbGUsIGZvcmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDaGFuZ2UgdGhlIG1vZGUgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGRpcmVjdG9yeVxuICAgICAgICB5aWVsZCBpb1V0aWwuY2htb2QoZGVzdERpciwgKHlpZWxkIGlvVXRpbC5zdGF0KHNvdXJjZURpcikpLm1vZGUpO1xuICAgIH0pO1xufVxuLy8gQnVmZmVyZWQgZmlsZSBjb3B5XG5mdW5jdGlvbiBjb3B5RmlsZShzcmNGaWxlLCBkZXN0RmlsZSwgZm9yY2UpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAoKHlpZWxkIGlvVXRpbC5sc3RhdChzcmNGaWxlKSkuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgLy8gdW5saW5rL3JlLWxpbmsgaXRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgeWllbGQgaW9VdGlsLmxzdGF0KGRlc3RGaWxlKTtcbiAgICAgICAgICAgICAgICB5aWVsZCBpb1V0aWwudW5saW5rKGRlc3RGaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gVHJ5IHRvIG92ZXJyaWRlIGZpbGUgcGVybWlzc2lvblxuICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgPT09ICdFUEVSTScpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgaW9VdGlsLmNobW9kKGRlc3RGaWxlLCAnMDY2NicpO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBpb1V0aWwudW5saW5rKGRlc3RGaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gb3RoZXIgZXJyb3JzID0gaXQgZG9lc24ndCBleGlzdCwgbm8gd29yayB0byBkb1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ29weSBvdmVyIHN5bWxpbmtcbiAgICAgICAgICAgIGNvbnN0IHN5bWxpbmtGdWxsID0geWllbGQgaW9VdGlsLnJlYWRsaW5rKHNyY0ZpbGUpO1xuICAgICAgICAgICAgeWllbGQgaW9VdGlsLnN5bWxpbmsoc3ltbGlua0Z1bGwsIGRlc3RGaWxlLCBpb1V0aWwuSVNfV0lORE9XUyA/ICdqdW5jdGlvbicgOiBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKHlpZWxkIGlvVXRpbC5leGlzdHMoZGVzdEZpbGUpKSB8fCBmb3JjZSkge1xuICAgICAgICAgICAgeWllbGQgaW9VdGlsLmNvcHlGaWxlKHNyY0ZpbGUsIGRlc3RGaWxlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW8uanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYXJnU3RyaW5nVG9BcnJheSA9IGV4cG9ydHMuVG9vbFJ1bm5lciA9IHZvaWQgMDtcbmNvbnN0IG9zID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCBldmVudHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImV2ZW50c1wiKSk7XG5jb25zdCBjaGlsZCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKSk7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbmNvbnN0IGlvID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9pb1wiKSk7XG5jb25zdCBpb1V0aWwgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2lvL2xpYi9pby11dGlsXCIpKTtcbmNvbnN0IHRpbWVyc18xID0gcmVxdWlyZShcInRpbWVyc1wiKTtcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZCAqL1xuY29uc3QgSVNfV0lORE9XUyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG4vKlxuICogQ2xhc3MgZm9yIHJ1bm5pbmcgY29tbWFuZCBsaW5lIHRvb2xzLiBIYW5kbGVzIHF1b3RpbmcgYW5kIGFyZyBwYXJzaW5nIGluIGEgcGxhdGZvcm0gYWdub3N0aWMgd2F5LlxuICovXG5jbGFzcyBUb29sUnVubmVyIGV4dGVuZHMgZXZlbnRzLkV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IodG9vbFBhdGgsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKCF0b29sUGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFyYW1ldGVyICd0b29sUGF0aCcgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9vbFBhdGggPSB0b29sUGF0aDtcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncyB8fCBbXTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB9XG4gICAgX2RlYnVnKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saXN0ZW5lcnMgJiYgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5kZWJ1ZyhtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZ2V0Q29tbWFuZFN0cmluZyhvcHRpb25zLCBub1ByZWZpeCkge1xuICAgICAgICBjb25zdCB0b29sUGF0aCA9IHRoaXMuX2dldFNwYXduRmlsZU5hbWUoKTtcbiAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuX2dldFNwYXduQXJncyhvcHRpb25zKTtcbiAgICAgICAgbGV0IGNtZCA9IG5vUHJlZml4ID8gJycgOiAnW2NvbW1hbmRdJzsgLy8gb21pdCBwcmVmaXggd2hlbiBwaXBlZCB0byBhIHNlY29uZCB0b29sXG4gICAgICAgIGlmIChJU19XSU5ET1dTKSB7XG4gICAgICAgICAgICAvLyBXaW5kb3dzICsgY21kIGZpbGVcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0NtZEZpbGUoKSkge1xuICAgICAgICAgICAgICAgIGNtZCArPSB0b29sUGF0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYXJncykge1xuICAgICAgICAgICAgICAgICAgICBjbWQgKz0gYCAke2F9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXaW5kb3dzICsgdmVyYmF0aW1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMud2luZG93c1ZlcmJhdGltQXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgY21kICs9IGBcIiR7dG9vbFBhdGh9XCJgO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCArPSBgICR7YX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdpbmRvd3MgKHJlZ3VsYXIpXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbWQgKz0gdGhpcy5fd2luZG93c1F1b3RlQ21kQXJnKHRvb2xQYXRoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYXJncykge1xuICAgICAgICAgICAgICAgICAgICBjbWQgKz0gYCAke3RoaXMuX3dpbmRvd3NRdW90ZUNtZEFyZyhhKX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9TWC9MaW51eCAtIHRoaXMgY2FuIGxpa2VseSBiZSBpbXByb3ZlZCB3aXRoIHNvbWUgZm9ybSBvZiBxdW90aW5nLlxuICAgICAgICAgICAgLy8gY3JlYXRpbmcgcHJvY2Vzc2VzIG9uIFVuaXggaXMgZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgdGhhbiBXaW5kb3dzLlxuICAgICAgICAgICAgLy8gb24gVW5peCwgZXhlY3ZwKCkgdGFrZXMgYW4gYXJnIGFycmF5LlxuICAgICAgICAgICAgY21kICs9IHRvb2xQYXRoO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBjbWQgKz0gYCAke2F9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY21kO1xuICAgIH1cbiAgICBfcHJvY2Vzc0xpbmVCdWZmZXIoZGF0YSwgc3RyQnVmZmVyLCBvbkxpbmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBzID0gc3RyQnVmZmVyICsgZGF0YS50b1N0cmluZygpO1xuICAgICAgICAgICAgbGV0IG4gPSBzLmluZGV4T2Yob3MuRU9MKTtcbiAgICAgICAgICAgIHdoaWxlIChuID4gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gcy5zdWJzdHJpbmcoMCwgbik7XG4gICAgICAgICAgICAgICAgb25MaW5lKGxpbmUpO1xuICAgICAgICAgICAgICAgIC8vIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgLi4uXG4gICAgICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKG4gKyBvcy5FT0wubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBuID0gcy5pbmRleE9mKG9zLkVPTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBzdHJlYW1pbmcgbGluZXMgdG8gY29uc29sZSBpcyBiZXN0IGVmZm9ydC4gIERvbid0IGZhaWwgYSBidWlsZC5cbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKGBlcnJvciBwcm9jZXNzaW5nIGxpbmUuIEZhaWxlZCB3aXRoIGVycm9yICR7ZXJyfWApO1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9nZXRTcGF3bkZpbGVOYW1lKCkge1xuICAgICAgICBpZiAoSVNfV0lORE9XUykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ21kRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydDT01TUEVDJ10gfHwgJ2NtZC5leGUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRvb2xQYXRoO1xuICAgIH1cbiAgICBfZ2V0U3Bhd25BcmdzKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKElTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0NtZEZpbGUoKSkge1xuICAgICAgICAgICAgICAgIGxldCBhcmdsaW5lID0gYC9EIC9TIC9DIFwiJHt0aGlzLl93aW5kb3dzUXVvdGVDbWRBcmcodGhpcy50b29sUGF0aCl9YDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGEgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ2xpbmUgKz0gJyAnO1xuICAgICAgICAgICAgICAgICAgICBhcmdsaW5lICs9IG9wdGlvbnMud2luZG93c1ZlcmJhdGltQXJndW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fd2luZG93c1F1b3RlQ21kQXJnKGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcmdsaW5lICs9ICdcIic7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFthcmdsaW5lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5hcmdzO1xuICAgIH1cbiAgICBfZW5kc1dpdGgoc3RyLCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIHN0ci5lbmRzV2l0aChlbmQpO1xuICAgIH1cbiAgICBfaXNDbWRGaWxlKCkge1xuICAgICAgICBjb25zdCB1cHBlclRvb2xQYXRoID0gdGhpcy50b29sUGF0aC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gKHRoaXMuX2VuZHNXaXRoKHVwcGVyVG9vbFBhdGgsICcuQ01EJykgfHxcbiAgICAgICAgICAgIHRoaXMuX2VuZHNXaXRoKHVwcGVyVG9vbFBhdGgsICcuQkFUJykpO1xuICAgIH1cbiAgICBfd2luZG93c1F1b3RlQ21kQXJnKGFyZykge1xuICAgICAgICAvLyBmb3IgLmV4ZSwgYXBwbHkgdGhlIG5vcm1hbCBxdW90aW5nIHJ1bGVzIHRoYXQgbGlidXYgYXBwbGllc1xuICAgICAgICBpZiAoIXRoaXMuX2lzQ21kRmlsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXZRdW90ZUNtZEFyZyhhcmcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG90aGVyd2lzZSBhcHBseSBxdW90aW5nIHJ1bGVzIHNwZWNpZmljIHRvIHRoZSBjbWQuZXhlIGNvbW1hbmQgbGluZSBwYXJzZXIuXG4gICAgICAgIC8vIHRoZSBsaWJ1diBydWxlcyBhcmUgZ2VuZXJpYyBhbmQgYXJlIG5vdCBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIGNtZC5leGVcbiAgICAgICAgLy8gY29tbWFuZCBsaW5lIHBhcnNlci5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGNtZC5leGUgY29tbWFuZCBsaW5lIHBhcnNlciwgcmVmZXIgdG9cbiAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDk0Njk5L2hvdy1kb2VzLXRoZS13aW5kb3dzLWNvbW1hbmQtaW50ZXJwcmV0ZXItY21kLWV4ZS1wYXJzZS1zY3JpcHRzLzc5NzA5MTIjNzk3MDkxMlxuICAgICAgICAvLyBuZWVkIHF1b3RlcyBmb3IgZW1wdHkgYXJnXG4gICAgICAgIGlmICghYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1wiXCInO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHRoZSBhcmcgbmVlZHMgdG8gYmUgcXVvdGVkXG4gICAgICAgIGNvbnN0IGNtZFNwZWNpYWxDaGFycyA9IFtcbiAgICAgICAgICAgICcgJyxcbiAgICAgICAgICAgICdcXHQnLFxuICAgICAgICAgICAgJyYnLFxuICAgICAgICAgICAgJygnLFxuICAgICAgICAgICAgJyknLFxuICAgICAgICAgICAgJ1snLFxuICAgICAgICAgICAgJ10nLFxuICAgICAgICAgICAgJ3snLFxuICAgICAgICAgICAgJ30nLFxuICAgICAgICAgICAgJ14nLFxuICAgICAgICAgICAgJz0nLFxuICAgICAgICAgICAgJzsnLFxuICAgICAgICAgICAgJyEnLFxuICAgICAgICAgICAgXCInXCIsXG4gICAgICAgICAgICAnKycsXG4gICAgICAgICAgICAnLCcsXG4gICAgICAgICAgICAnYCcsXG4gICAgICAgICAgICAnficsXG4gICAgICAgICAgICAnfCcsXG4gICAgICAgICAgICAnPCcsXG4gICAgICAgICAgICAnPicsXG4gICAgICAgICAgICAnXCInXG4gICAgICAgIF07XG4gICAgICAgIGxldCBuZWVkc1F1b3RlcyA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGNoYXIgb2YgYXJnKSB7XG4gICAgICAgICAgICBpZiAoY21kU3BlY2lhbENoYXJzLnNvbWUoeCA9PiB4ID09PSBjaGFyKSkge1xuICAgICAgICAgICAgICAgIG5lZWRzUXVvdGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBzaG9ydC1jaXJjdWl0IGlmIHF1b3RlcyBub3QgbmVlZGVkXG4gICAgICAgIGlmICghbmVlZHNRdW90ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBxdW90aW5nIHJ1bGVzIGFyZSB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHJ1bGVzIHRoYXQgYnkgbGlidXYgYXBwbGllcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gMSkgd3JhcCB0aGUgc3RyaW5nIGluIHF1b3Rlc1xuICAgICAgICAvL1xuICAgICAgICAvLyAyKSBkb3VibGUtdXAgcXVvdGVzIC0gaS5lLiBcIiA9PiBcIlwiXG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGxpYnV2IHF1b3RpbmcgcnVsZXMuIGxpYnV2IHJlcGxhY2VzIFwiIHdpdGggXFxcIiwgd2hpY2ggdW5mb3J0dW5hdGVseVxuICAgICAgICAvLyAgICBkb2Vzbid0IHdvcmsgd2VsbCB3aXRoIGEgY21kLmV4ZSBjb21tYW5kIGxpbmUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgIG5vdGUsIHJlcGxhY2luZyBcIiB3aXRoIFwiXCIgYWxzbyB3b3JrcyB3ZWxsIGlmIHRoZSBhcmcgaXMgcGFzc2VkIHRvIGEgZG93bnN0cmVhbSAuTkVUIGNvbnNvbGUgYXBwLlxuICAgICAgICAvLyAgICBmb3IgZXhhbXBsZSwgdGhlIGNvbW1hbmQgbGluZTpcbiAgICAgICAgLy8gICAgICAgICAgZm9vLmV4ZSBcIm15YXJnOlwiXCJteSB2YWxcIlwiXCJcbiAgICAgICAgLy8gICAgaXMgcGFyc2VkIGJ5IGEgLk5FVCBjb25zb2xlIGFwcCBpbnRvIGFuIGFyZyBhcnJheTpcbiAgICAgICAgLy8gICAgICAgICAgWyBcIm15YXJnOlxcXCJteSB2YWxcXFwiXCIgXVxuICAgICAgICAvLyAgICB3aGljaCBpcyB0aGUgc2FtZSBlbmQgcmVzdWx0IHdoZW4gYXBwbHlpbmcgbGlidXYgcXVvdGluZyBydWxlcy4gYWx0aG91Z2ggdGhlIGFjdHVhbFxuICAgICAgICAvLyAgICBjb21tYW5kIGxpbmUgZnJvbSBsaWJ1diBxdW90aW5nIHJ1bGVzIHdvdWxkIGxvb2sgbGlrZTpcbiAgICAgICAgLy8gICAgICAgICAgZm9vLmV4ZSBcIm15YXJnOlxcXCJteSB2YWxcXFwiXCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gMykgZG91YmxlLXVwIHNsYXNoZXMgdGhhdCBwcmVjZWRlIGEgcXVvdGUsXG4gICAgICAgIC8vICAgIGUuZy4gIGhlbGxvIFxcd29ybGQgICAgPT4gXCJoZWxsbyBcXHdvcmxkXCJcbiAgICAgICAgLy8gICAgICAgICAgaGVsbG9cXFwid29ybGQgICAgPT4gXCJoZWxsb1xcXFxcIlwid29ybGRcIlxuICAgICAgICAvLyAgICAgICAgICBoZWxsb1xcXFxcIndvcmxkICAgPT4gXCJoZWxsb1xcXFxcXFxcXCJcIndvcmxkXCJcbiAgICAgICAgLy8gICAgICAgICAgaGVsbG8gd29ybGRcXCAgICA9PiBcImhlbGxvIHdvcmxkXFxcXFwiXG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgIHRlY2huaWNhbGx5IHRoaXMgaXMgbm90IHJlcXVpcmVkIGZvciBhIGNtZC5leGUgY29tbWFuZCBsaW5lLCBvciB0aGUgYmF0Y2ggYXJndW1lbnQgcGFyc2VyLlxuICAgICAgICAvLyAgICB0aGUgcmVhc29ucyBmb3IgaW5jbHVkaW5nIHRoaXMgYXMgYSAuY21kIHF1b3RpbmcgcnVsZSBhcmU6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgIGEpIHRoaXMgaXMgb3B0aW1pemVkIGZvciB0aGUgc2NlbmFyaW8gd2hlcmUgdGhlIGFyZ3VtZW50IGlzIHBhc3NlZCBmcm9tIHRoZSAuY21kIGZpbGUgdG8gYW5cbiAgICAgICAgLy8gICAgICAgZXh0ZXJuYWwgcHJvZ3JhbS4gbWFueSBwcm9ncmFtcyAoZS5nLiAuTkVUIGNvbnNvbGUgYXBwcykgcmVseSBvbiB0aGUgc2xhc2gtZG91YmxpbmcgcnVsZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgYikgaXQncyB3aGF0IHdlJ3ZlIGJlZW4gZG9pbmcgcHJldmlvdXNseSAoYnkgZGVmZXJyaW5nIHRvIG5vZGUgZGVmYXVsdCBiZWhhdmlvcikgYW5kIHdlXG4gICAgICAgIC8vICAgICAgIGhhdmVuJ3QgaGVhcmQgYW55IGNvbXBsYWludHMgYWJvdXQgdGhhdCBhc3BlY3QuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIG5vdGUsIGEgd2Vha25lc3Mgb2YgdGhlIHF1b3RpbmcgcnVsZXMgY2hvc2VuIGhlcmUsIGlzIHRoYXQgJSBpcyBub3QgZXNjYXBlZC4gaW4gZmFjdCwgJSBjYW5ub3QgYmVcbiAgICAgICAgLy8gZXNjYXBlZCB3aGVuIHVzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBkaXJlY3RseSAtIGV2ZW4gdGhvdWdoIHdpdGhpbiBhIC5jbWQgZmlsZSAlIGNhbiBiZSBlc2NhcGVkXG4gICAgICAgIC8vIGJ5IHVzaW5nICUlLlxuICAgICAgICAvL1xuICAgICAgICAvLyB0aGUgc2F2aW5nIGdyYWNlIGlzLCBvbiB0aGUgY29tbWFuZCBsaW5lLCAldmFyJSBpcyBsZWZ0IGFzLWlzIGlmIHZhciBpcyBub3QgZGVmaW5lZC4gdGhpcyBjb250cmFzdHNcbiAgICAgICAgLy8gdGhlIGxpbmUgcGFyc2luZyBydWxlcyB3aXRoaW4gYSAuY21kIGZpbGUsIHdoZXJlIGlmIHZhciBpcyBub3QgZGVmaW5lZCBpdCBpcyByZXBsYWNlZCB3aXRoIG5vdGhpbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIG9uZSBvcHRpb24gdGhhdCB3YXMgZXhwbG9yZWQgd2FzIHJlcGxhY2luZyAlIHdpdGggXiUgLSBpLmUuICV2YXIlID0+IF4ldmFyXiUuIHRoaXMgaGFjayB3b3VsZFxuICAgICAgICAvLyBvZnRlbiB3b3JrLCBzaW5jZSBpdCBpcyB1bmxpa2VseSB0aGF0IHZhcl4gd291bGQgZXhpc3QsIGFuZCB0aGUgXiBjaGFyYWN0ZXIgaXMgcmVtb3ZlZCB3aGVuIHRoZVxuICAgICAgICAvLyB2YXJpYWJsZSBpcyB1c2VkLiB0aGUgcHJvYmxlbSwgaG93ZXZlciwgaXMgdGhhdCBeIGlzIG5vdCByZW1vdmVkIHdoZW4gJSogaXMgdXNlZCB0byBwYXNzIHRoZSBhcmdzXG4gICAgICAgIC8vIHRvIGFuIGV4dGVybmFsIHByb2dyYW0uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGFuIHVuZXhwbG9yZWQgcG90ZW50aWFsIHNvbHV0aW9uIGZvciB0aGUgJSBlc2NhcGluZyBwcm9ibGVtLCBpcyB0byBjcmVhdGUgYSB3cmFwcGVyIC5jbWQgZmlsZS5cbiAgICAgICAgLy8gJSBjYW4gYmUgZXNjYXBlZCB3aXRoaW4gYSAuY21kIGZpbGUuXG4gICAgICAgIGxldCByZXZlcnNlID0gJ1wiJztcbiAgICAgICAgbGV0IHF1b3RlSGl0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFyZy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIC8vIHdhbGsgdGhlIHN0cmluZyBpbiByZXZlcnNlXG4gICAgICAgICAgICByZXZlcnNlICs9IGFyZ1tpIC0gMV07XG4gICAgICAgICAgICBpZiAocXVvdGVIaXQgJiYgYXJnW2kgLSAxXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgcmV2ZXJzZSArPSAnXFxcXCc7IC8vIGRvdWJsZSB0aGUgc2xhc2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZ1tpIC0gMV0gPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICBxdW90ZUhpdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV2ZXJzZSArPSAnXCInOyAvLyBkb3VibGUgdGhlIHF1b3RlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBxdW90ZUhpdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldmVyc2UgKz0gJ1wiJztcbiAgICAgICAgcmV0dXJuIHJldmVyc2VcbiAgICAgICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC5qb2luKCcnKTtcbiAgICB9XG4gICAgX3V2UXVvdGVDbWRBcmcoYXJnKSB7XG4gICAgICAgIC8vIFRvb2wgcnVubmVyIHdyYXBzIGNoaWxkX3Byb2Nlc3Muc3Bhd24oKSBhbmQgbmVlZHMgdG8gYXBwbHkgdGhlIHNhbWUgcXVvdGluZyBhc1xuICAgICAgICAvLyBOb2RlIGluIGNlcnRhaW4gY2FzZXMgd2hlcmUgdGhlIHVuZG9jdW1lbnRlZCBzcGF3biBvcHRpb24gd2luZG93c1ZlcmJhdGltQXJndW1lbnRzXG4gICAgICAgIC8vIGlzIHVzZWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgYSBwb3J0IG9mIHF1b3RlX2NtZF9hcmcgZnJvbSBOb2RlIDQueCAodGVjaG5pY2FsbHksIGxpYiBVVixcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL3Y0LngvZGVwcy91di9zcmMvd2luL3Byb2Nlc3MuYyBmb3IgZGV0YWlscyksXG4gICAgICAgIC8vIHBhc3RpbmcgY29weXJpZ2h0IG5vdGljZSBmcm9tIE5vZGUgd2l0aGluIHRoaXMgZnVuY3Rpb246XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICAgICAgICAvLyAgICAgIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4gICAgICAgIC8vICAgICAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbiAgICAgICAgLy8gICAgICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3JcbiAgICAgICAgLy8gICAgICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICAgICAgICAvLyAgICAgIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAgICAgICAgLy8gICAgICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gICAgICAgIC8vICAgICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gICAgICAgIC8vICAgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gICAgICAgIC8vICAgICAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICAgICAgICAvLyAgICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4gICAgICAgIC8vICAgICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuICAgICAgICAvLyAgICAgIElOIFRIRSBTT0ZUV0FSRS5cbiAgICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgICAgIC8vIE5lZWQgZG91YmxlIHF1b3RhdGlvbiBmb3IgZW1wdHkgYXJndW1lbnRcbiAgICAgICAgICAgIHJldHVybiAnXCJcIic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmcuaW5jbHVkZXMoJyAnKSAmJiAhYXJnLmluY2x1ZGVzKCdcXHQnKSAmJiAhYXJnLmluY2x1ZGVzKCdcIicpKSB7XG4gICAgICAgICAgICAvLyBObyBxdW90YXRpb24gbmVlZGVkXG4gICAgICAgICAgICByZXR1cm4gYXJnO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYXJnLmluY2x1ZGVzKCdcIicpICYmICFhcmcuaW5jbHVkZXMoJ1xcXFwnKSkge1xuICAgICAgICAgICAgLy8gTm8gZW1iZWRkZWQgZG91YmxlIHF1b3RlcyBvciBiYWNrc2xhc2hlcywgc28gSSBjYW4ganVzdCB3cmFwXG4gICAgICAgICAgICAvLyBxdW90ZSBtYXJrcyBhcm91bmQgdGhlIHdob2xlIHRoaW5nLlxuICAgICAgICAgICAgcmV0dXJuIGBcIiR7YXJnfVwiYDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHBlY3RlZCBpbnB1dC9vdXRwdXQ6XG4gICAgICAgIC8vICAgaW5wdXQgOiBoZWxsb1wid29ybGRcbiAgICAgICAgLy8gICBvdXRwdXQ6IFwiaGVsbG9cXFwid29ybGRcIlxuICAgICAgICAvLyAgIGlucHV0IDogaGVsbG9cIlwid29ybGRcbiAgICAgICAgLy8gICBvdXRwdXQ6IFwiaGVsbG9cXFwiXFxcIndvcmxkXCJcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXFx3b3JsZFxuICAgICAgICAvLyAgIG91dHB1dDogaGVsbG9cXHdvcmxkXG4gICAgICAgIC8vICAgaW5wdXQgOiBoZWxsb1xcXFx3b3JsZFxuICAgICAgICAvLyAgIG91dHB1dDogaGVsbG9cXFxcd29ybGRcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXFxcIndvcmxkXG4gICAgICAgIC8vICAgb3V0cHV0OiBcImhlbGxvXFxcXFxcXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgaW5wdXQgOiBoZWxsb1xcXFxcIndvcmxkXG4gICAgICAgIC8vICAgb3V0cHV0OiBcImhlbGxvXFxcXFxcXFxcXFwid29ybGRcIlxuICAgICAgICAvLyAgIGlucHV0IDogaGVsbG8gd29ybGRcXFxuICAgICAgICAvLyAgIG91dHB1dDogXCJoZWxsbyB3b3JsZFxcXFxcIiAtIG5vdGUgdGhlIGNvbW1lbnQgaW4gbGlidXYgYWN0dWFsbHkgcmVhZHMgXCJoZWxsbyB3b3JsZFxcXCJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpdCBhcHBlYXJzIHRoZSBjb21tZW50IGlzIHdyb25nLCBpdCBzaG91bGQgYmUgXCJoZWxsbyB3b3JsZFxcXFxcIlxuICAgICAgICBsZXQgcmV2ZXJzZSA9ICdcIic7XG4gICAgICAgIGxldCBxdW90ZUhpdCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSBhcmcubGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAvLyB3YWxrIHRoZSBzdHJpbmcgaW4gcmV2ZXJzZVxuICAgICAgICAgICAgcmV2ZXJzZSArPSBhcmdbaSAtIDFdO1xuICAgICAgICAgICAgaWYgKHF1b3RlSGl0ICYmIGFyZ1tpIC0gMV0gPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgIHJldmVyc2UgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnW2kgLSAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIHF1b3RlSGl0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXZlcnNlICs9ICdcXFxcJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1b3RlSGl0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV2ZXJzZSArPSAnXCInO1xuICAgICAgICByZXR1cm4gcmV2ZXJzZVxuICAgICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgIH1cbiAgICBfY2xvbmVFeGVjT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkIHx8IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICBlbnY6IG9wdGlvbnMuZW52IHx8IHByb2Nlc3MuZW52LFxuICAgICAgICAgICAgc2lsZW50OiBvcHRpb25zLnNpbGVudCB8fCBmYWxzZSxcbiAgICAgICAgICAgIHdpbmRvd3NWZXJiYXRpbUFyZ3VtZW50czogb3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMgfHwgZmFsc2UsXG4gICAgICAgICAgICBmYWlsT25TdGRFcnI6IG9wdGlvbnMuZmFpbE9uU3RkRXJyIHx8IGZhbHNlLFxuICAgICAgICAgICAgaWdub3JlUmV0dXJuQ29kZTogb3B0aW9ucy5pZ25vcmVSZXR1cm5Db2RlIHx8IGZhbHNlLFxuICAgICAgICAgICAgZGVsYXk6IG9wdGlvbnMuZGVsYXkgfHwgMTAwMDBcbiAgICAgICAgfTtcbiAgICAgICAgcmVzdWx0Lm91dFN0cmVhbSA9IG9wdGlvbnMub3V0U3RyZWFtIHx8IHByb2Nlc3Muc3Rkb3V0O1xuICAgICAgICByZXN1bHQuZXJyU3RyZWFtID0gb3B0aW9ucy5lcnJTdHJlYW0gfHwgcHJvY2Vzcy5zdGRlcnI7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIF9nZXRTcGF3bk9wdGlvbnMob3B0aW9ucywgdG9vbFBhdGgpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICByZXN1bHQuY3dkID0gb3B0aW9ucy5jd2Q7XG4gICAgICAgIHJlc3VsdC5lbnYgPSBvcHRpb25zLmVudjtcbiAgICAgICAgcmVzdWx0Wyd3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMnXSA9XG4gICAgICAgICAgICBvcHRpb25zLndpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyB8fCB0aGlzLl9pc0NtZEZpbGUoKTtcbiAgICAgICAgaWYgKG9wdGlvbnMud2luZG93c1ZlcmJhdGltQXJndW1lbnRzKSB7XG4gICAgICAgICAgICByZXN1bHQuYXJndjAgPSBgXCIke3Rvb2xQYXRofVwiYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjIGEgdG9vbC5cbiAgICAgKiBPdXRwdXQgd2lsbCBiZSBzdHJlYW1lZCB0byB0aGUgbGl2ZSBjb25zb2xlLlxuICAgICAqIFJldHVybnMgcHJvbWlzZSB3aXRoIHJldHVybiBjb2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICAgIHRvb2wgICAgIHBhdGggdG8gdG9vbCB0byBleGVjXG4gICAgICogQHBhcmFtICAgICBvcHRpb25zICBvcHRpb25hbCBleGVjIG9wdGlvbnMuICBTZWUgRXhlY09wdGlvbnNcbiAgICAgKiBAcmV0dXJucyAgIG51bWJlclxuICAgICAqL1xuICAgIGV4ZWMoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAvLyByb290IHRoZSB0b29sIHBhdGggaWYgaXQgaXMgdW5yb290ZWQgYW5kIGNvbnRhaW5zIHJlbGF0aXZlIHBhdGhpbmdcbiAgICAgICAgICAgIGlmICghaW9VdGlsLmlzUm9vdGVkKHRoaXMudG9vbFBhdGgpICYmXG4gICAgICAgICAgICAgICAgKHRoaXMudG9vbFBhdGguaW5jbHVkZXMoJy8nKSB8fFxuICAgICAgICAgICAgICAgICAgICAoSVNfV0lORE9XUyAmJiB0aGlzLnRvb2xQYXRoLmluY2x1ZGVzKCdcXFxcJykpKSkge1xuICAgICAgICAgICAgICAgIC8vIHByZWZlciBvcHRpb25zLmN3ZCBpZiBpdCBpcyBzcGVjaWZpZWQsIGhvd2V2ZXIgb3B0aW9ucy5jd2QgbWF5IGFsc28gbmVlZCB0byBiZSByb290ZWRcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2xQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHRoaXMub3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSwgdGhpcy50b29sUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiB0aGUgdG9vbCBpcyBvbmx5IGEgZmlsZSBuYW1lLCB0aGVuIHJlc29sdmUgaXQgZnJvbSB0aGUgUEFUSFxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHZlcmlmeSBpdCBleGlzdHMgKGFkZCBleHRlbnNpb24gb24gV2luZG93cyBpZiBuZWNlc3NhcnkpXG4gICAgICAgICAgICB0aGlzLnRvb2xQYXRoID0geWllbGQgaW8ud2hpY2godGhpcy50b29sUGF0aCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGBleGVjIHRvb2w6ICR7dGhpcy50b29sUGF0aH1gKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZygnYXJndW1lbnRzOicpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuYXJncykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1ZyhgICAgJHthcmd9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnNOb25OdWxsID0gdGhpcy5fY2xvbmVFeGVjT3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc05vbk51bGwuc2lsZW50ICYmIG9wdGlvbnNOb25OdWxsLm91dFN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW0ud3JpdGUodGhpcy5fZ2V0Q29tbWFuZFN0cmluZyhvcHRpb25zTm9uTnVsbCkgKyBvcy5FT0wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IG5ldyBFeGVjU3RhdGUob3B0aW9uc05vbk51bGwsIHRoaXMudG9vbFBhdGgpO1xuICAgICAgICAgICAgICAgIHN0YXRlLm9uKCdkZWJ1ZycsIChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY3dkICYmICEoeWllbGQgaW9VdGlsLmV4aXN0cyh0aGlzLm9wdGlvbnMuY3dkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYFRoZSBjd2Q6ICR7dGhpcy5vcHRpb25zLmN3ZH0gZG9lcyBub3QgZXhpc3QhYCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMuX2dldFNwYXduRmlsZU5hbWUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjcCA9IGNoaWxkLnNwYXduKGZpbGVOYW1lLCB0aGlzLl9nZXRTcGF3bkFyZ3Mob3B0aW9uc05vbk51bGwpLCB0aGlzLl9nZXRTcGF3bk9wdGlvbnModGhpcy5vcHRpb25zLCBmaWxlTmFtZSkpO1xuICAgICAgICAgICAgICAgIGxldCBzdGRidWZmZXIgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoY3Auc3Rkb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNwLnN0ZG91dC5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpc3RlbmVycyAmJiB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLnN0ZG91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3Rkb3V0KGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zTm9uTnVsbC5zaWxlbnQgJiYgb3B0aW9uc05vbk51bGwub3V0U3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc05vbk51bGwub3V0U3RyZWFtLndyaXRlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RkYnVmZmVyID0gdGhpcy5fcHJvY2Vzc0xpbmVCdWZmZXIoZGF0YSwgc3RkYnVmZmVyLCAobGluZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGlzdGVuZXJzICYmIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3RkbGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLnN0ZGxpbmUobGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZXJyYnVmZmVyID0gJyc7XG4gICAgICAgICAgICAgICAgaWYgKGNwLnN0ZGVycikge1xuICAgICAgICAgICAgICAgICAgICBjcC5zdGRlcnIub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc1N0ZGVyciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpc3RlbmVycyAmJiB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLnN0ZGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3RkZXJyKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zTm9uTnVsbC5zaWxlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTm9uTnVsbC5lcnJTdHJlYW0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gb3B0aW9uc05vbk51bGwuZmFpbE9uU3RkRXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3B0aW9uc05vbk51bGwuZXJyU3RyZWFtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3B0aW9uc05vbk51bGwub3V0U3RyZWFtO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMud3JpdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJidWZmZXIgPSB0aGlzLl9wcm9jZXNzTGluZUJ1ZmZlcihkYXRhLCBlcnJidWZmZXIsIChsaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saXN0ZW5lcnMgJiYgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5lcnJsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuZXJybGluZShsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNwLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0Vycm9yID0gZXJyLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NFeGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuQ2hlY2tDb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNwLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0V4aXRDb2RlID0gY29kZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0V4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGBFeGl0IGNvZGUgJHtjb2RlfSByZWNlaXZlZCBmcm9tIHRvb2wgJyR7dGhpcy50b29sUGF0aH0nYCk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLkNoZWNrQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjcC5vbignY2xvc2UnLCAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXhpdENvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGBTVERJTyBzdHJlYW1zIGhhdmUgY2xvc2VkIGZvciB0b29sICcke3RoaXMudG9vbFBhdGh9J2ApO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5DaGVja0NvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdGUub24oJ2RvbmUnLCAoZXJyb3IsIGV4aXRDb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGRidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGRsaW5lJywgc3RkYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyYnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJybGluZScsIGVycmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3AucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXhpdENvZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNwLnN0ZGluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NoaWxkIHByb2Nlc3MgbWlzc2luZyBzdGRpbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNwLnN0ZGluLmVuZCh0aGlzLm9wdGlvbnMuaW5wdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5Ub29sUnVubmVyID0gVG9vbFJ1bm5lcjtcbi8qKlxuICogQ29udmVydCBhbiBhcmcgc3RyaW5nIHRvIGFuIGFycmF5IG9mIGFyZ3MuIEhhbmRsZXMgZXNjYXBpbmdcbiAqXG4gKiBAcGFyYW0gICAgYXJnU3RyaW5nICAgc3RyaW5nIG9mIGFyZ3VtZW50c1xuICogQHJldHVybnMgIHN0cmluZ1tdICAgIGFycmF5IG9mIGFyZ3VtZW50c1xuICovXG5mdW5jdGlvbiBhcmdTdHJpbmdUb0FycmF5KGFyZ1N0cmluZykge1xuICAgIGNvbnN0IGFyZ3MgPSBbXTtcbiAgICBsZXQgaW5RdW90ZXMgPSBmYWxzZTtcbiAgICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuICAgIGxldCBhcmcgPSAnJztcbiAgICBmdW5jdGlvbiBhcHBlbmQoYykge1xuICAgICAgICAvLyB3ZSBvbmx5IGVzY2FwZSBkb3VibGUgcXVvdGVzLlxuICAgICAgICBpZiAoZXNjYXBlZCAmJiBjICE9PSAnXCInKSB7XG4gICAgICAgICAgICBhcmcgKz0gJ1xcXFwnO1xuICAgICAgICB9XG4gICAgICAgIGFyZyArPSBjO1xuICAgICAgICBlc2NhcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnU3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBhcmdTdHJpbmcuY2hhckF0KGkpO1xuICAgICAgICBpZiAoYyA9PT0gJ1wiJykge1xuICAgICAgICAgICAgaWYgKCFlc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgaW5RdW90ZXMgPSAhaW5RdW90ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcHBlbmQoYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA9PT0gJ1xcXFwnICYmIGVzY2FwZWQpIHtcbiAgICAgICAgICAgIGFwcGVuZChjKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjID09PSAnXFxcXCcgJiYgaW5RdW90ZXMpIHtcbiAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09ICcgJyAmJiAhaW5RdW90ZXMpIHtcbiAgICAgICAgICAgIGlmIChhcmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGFyZ3MucHVzaChhcmcpO1xuICAgICAgICAgICAgICAgIGFyZyA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kKGMpO1xuICAgIH1cbiAgICBpZiAoYXJnLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXJncy5wdXNoKGFyZy50cmltKCkpO1xuICAgIH1cbiAgICByZXR1cm4gYXJncztcbn1cbmV4cG9ydHMuYXJnU3RyaW5nVG9BcnJheSA9IGFyZ1N0cmluZ1RvQXJyYXk7XG5jbGFzcyBFeGVjU3RhdGUgZXh0ZW5kcyBldmVudHMuRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCB0b29sUGF0aCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnByb2Nlc3NDbG9zZWQgPSBmYWxzZTsgLy8gdHJhY2tzIHdoZXRoZXIgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCBhbmQgc3RkaW8gaXMgY2xvc2VkXG4gICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yID0gJyc7XG4gICAgICAgIHRoaXMucHJvY2Vzc0V4aXRDb2RlID0gMDtcbiAgICAgICAgdGhpcy5wcm9jZXNzRXhpdGVkID0gZmFsc2U7IC8vIHRyYWNrcyB3aGV0aGVyIHRoZSBwcm9jZXNzIGhhcyBleGl0ZWRcbiAgICAgICAgdGhpcy5wcm9jZXNzU3RkZXJyID0gZmFsc2U7IC8vIHRyYWNrcyB3aGV0aGVyIHN0ZGVyciB3YXMgd3JpdHRlbiB0b1xuICAgICAgICB0aGlzLmRlbGF5ID0gMTAwMDA7IC8vIDEwIHNlY29uZHNcbiAgICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGltZW91dCA9IG51bGw7XG4gICAgICAgIGlmICghdG9vbFBhdGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndG9vbFBhdGggbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLnRvb2xQYXRoID0gdG9vbFBhdGg7XG4gICAgICAgIGlmIChvcHRpb25zLmRlbGF5KSB7XG4gICAgICAgICAgICB0aGlzLmRlbGF5ID0gb3B0aW9ucy5kZWxheTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBDaGVja0NvbXBsZXRlKCkge1xuICAgICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucHJvY2Vzc0Nsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2V0UmVzdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lcnNfMS5zZXRUaW1lb3V0KEV4ZWNTdGF0ZS5IYW5kbGVUaW1lb3V0LCB0aGlzLmRlbGF5LCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZGVidWcobWVzc2FnZSkge1xuICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnJywgbWVzc2FnZSk7XG4gICAgfVxuICAgIF9zZXRSZXN1bHQoKSB7XG4gICAgICAgIC8vIGRldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGFuIGVycm9yXG4gICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgaWYgKHRoaXMucHJvY2Vzc0V4aXRlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvY2Vzc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoYFRoZXJlIHdhcyBhbiBlcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gZXhlY3V0ZSB0aGUgcHJvY2VzcyAnJHt0aGlzLnRvb2xQYXRofScuIFRoaXMgbWF5IGluZGljYXRlIHRoZSBwcm9jZXNzIGZhaWxlZCB0byBzdGFydC4gRXJyb3I6ICR7dGhpcy5wcm9jZXNzRXJyb3J9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnByb2Nlc3NFeGl0Q29kZSAhPT0gMCAmJiAhdGhpcy5vcHRpb25zLmlnbm9yZVJldHVybkNvZGUpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihgVGhlIHByb2Nlc3MgJyR7dGhpcy50b29sUGF0aH0nIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke3RoaXMucHJvY2Vzc0V4aXRDb2RlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wcm9jZXNzU3RkZXJyICYmIHRoaXMub3B0aW9ucy5mYWlsT25TdGRFcnIpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihgVGhlIHByb2Nlc3MgJyR7dGhpcy50b29sUGF0aH0nIGZhaWxlZCBiZWNhdXNlIG9uZSBvciBtb3JlIGxpbmVzIHdlcmUgd3JpdHRlbiB0byB0aGUgU1RERVJSIHN0cmVhbWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNsZWFyIHRoZSB0aW1lb3V0XG4gICAgICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLmVtaXQoJ2RvbmUnLCBlcnJvciwgdGhpcy5wcm9jZXNzRXhpdENvZGUpO1xuICAgIH1cbiAgICBzdGF0aWMgSGFuZGxlVGltZW91dChzdGF0ZSkge1xuICAgICAgICBpZiAoc3RhdGUuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3RhdGUucHJvY2Vzc0Nsb3NlZCAmJiBzdGF0ZS5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYFRoZSBTVERJTyBzdHJlYW1zIGRpZCBub3QgY2xvc2Ugd2l0aGluICR7c3RhdGUuZGVsYXkgL1xuICAgICAgICAgICAgICAgIDEwMDB9IHNlY29uZHMgb2YgdGhlIGV4aXQgZXZlbnQgZnJvbSBwcm9jZXNzICcke3N0YXRlLnRvb2xQYXRofScuIFRoaXMgbWF5IGluZGljYXRlIGEgY2hpbGQgcHJvY2VzcyBpbmhlcml0ZWQgdGhlIFNURElPIHN0cmVhbXMgYW5kIGhhcyBub3QgeWV0IGV4aXRlZC5gO1xuICAgICAgICAgICAgc3RhdGUuX2RlYnVnKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLl9zZXRSZXN1bHQoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b29scnVubmVyLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEV4ZWNPdXRwdXQgPSBleHBvcnRzLmV4ZWMgPSB2b2lkIDA7XG5jb25zdCBzdHJpbmdfZGVjb2Rlcl8xID0gcmVxdWlyZShcInN0cmluZ19kZWNvZGVyXCIpO1xuY29uc3QgdHIgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vdG9vbHJ1bm5lclwiKSk7XG4vKipcbiAqIEV4ZWMgYSBjb21tYW5kLlxuICogT3V0cHV0IHdpbGwgYmUgc3RyZWFtZWQgdG8gdGhlIGxpdmUgY29uc29sZS5cbiAqIFJldHVybnMgcHJvbWlzZSB3aXRoIHJldHVybiBjb2RlXG4gKlxuICogQHBhcmFtICAgICBjb21tYW5kTGluZSAgICAgICAgY29tbWFuZCB0byBleGVjdXRlIChjYW4gaW5jbHVkZSBhZGRpdGlvbmFsIGFyZ3MpLiBNdXN0IGJlIGNvcnJlY3RseSBlc2NhcGVkLlxuICogQHBhcmFtICAgICBhcmdzICAgICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzIGZvciB0b29sLiBFc2NhcGluZyBpcyBoYW5kbGVkIGJ5IHRoZSBsaWIuXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgICAgICAgICAgICBvcHRpb25hbCBleGVjIG9wdGlvbnMuICBTZWUgRXhlY09wdGlvbnNcbiAqIEByZXR1cm5zICAgUHJvbWlzZTxudW1iZXI+ICAgIGV4aXQgY29kZVxuICovXG5mdW5jdGlvbiBleGVjKGNvbW1hbmRMaW5lLCBhcmdzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgY29tbWFuZEFyZ3MgPSB0ci5hcmdTdHJpbmdUb0FycmF5KGNvbW1hbmRMaW5lKTtcbiAgICAgICAgaWYgKGNvbW1hbmRBcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXJhbWV0ZXIgJ2NvbW1hbmRMaW5lJyBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eS5gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQYXRoIHRvIHRvb2wgdG8gZXhlY3V0ZSBzaG91bGQgYmUgZmlyc3QgYXJnXG4gICAgICAgIGNvbnN0IHRvb2xQYXRoID0gY29tbWFuZEFyZ3NbMF07XG4gICAgICAgIGFyZ3MgPSBjb21tYW5kQXJncy5zbGljZSgxKS5jb25jYXQoYXJncyB8fCBbXSk7XG4gICAgICAgIGNvbnN0IHJ1bm5lciA9IG5ldyB0ci5Ub29sUnVubmVyKHRvb2xQYXRoLCBhcmdzLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHJ1bm5lci5leGVjKCk7XG4gICAgfSk7XG59XG5leHBvcnRzLmV4ZWMgPSBleGVjO1xuLyoqXG4gKiBFeGVjIGEgY29tbWFuZCBhbmQgZ2V0IHRoZSBvdXRwdXQuXG4gKiBPdXRwdXQgd2lsbCBiZSBzdHJlYW1lZCB0byB0aGUgbGl2ZSBjb25zb2xlLlxuICogUmV0dXJucyBwcm9taXNlIHdpdGggdGhlIGV4aXQgY29kZSBhbmQgY29sbGVjdGVkIHN0ZG91dCBhbmQgc3RkZXJyXG4gKlxuICogQHBhcmFtICAgICBjb21tYW5kTGluZSAgICAgICAgICAgY29tbWFuZCB0byBleGVjdXRlIChjYW4gaW5jbHVkZSBhZGRpdGlvbmFsIGFyZ3MpLiBNdXN0IGJlIGNvcnJlY3RseSBlc2NhcGVkLlxuICogQHBhcmFtICAgICBhcmdzICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzIGZvciB0b29sLiBFc2NhcGluZyBpcyBoYW5kbGVkIGJ5IHRoZSBsaWIuXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgICAgICAgICAgICAgICBvcHRpb25hbCBleGVjIG9wdGlvbnMuICBTZWUgRXhlY09wdGlvbnNcbiAqIEByZXR1cm5zICAgUHJvbWlzZTxFeGVjT3V0cHV0PiAgIGV4aXQgY29kZSwgc3Rkb3V0LCBhbmQgc3RkZXJyXG4gKi9cbmZ1bmN0aW9uIGdldEV4ZWNPdXRwdXQoY29tbWFuZExpbmUsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgICAvL1VzaW5nIHN0cmluZyBkZWNvZGVyIGNvdmVycyB0aGUgY2FzZSB3aGVyZSBhIG11bHQtYnl0ZSBjaGFyYWN0ZXIgaXMgc3BsaXRcbiAgICAgICAgY29uc3Qgc3Rkb3V0RGVjb2RlciA9IG5ldyBzdHJpbmdfZGVjb2Rlcl8xLlN0cmluZ0RlY29kZXIoJ3V0ZjgnKTtcbiAgICAgICAgY29uc3Qgc3RkZXJyRGVjb2RlciA9IG5ldyBzdHJpbmdfZGVjb2Rlcl8xLlN0cmluZ0RlY29kZXIoJ3V0ZjgnKTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGRvdXRMaXN0ZW5lciA9IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5saXN0ZW5lcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGRvdXQ7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU3RkRXJyTGlzdGVuZXIgPSAoX2IgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubGlzdGVuZXJzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc3RkZXJyO1xuICAgICAgICBjb25zdCBzdGRFcnJMaXN0ZW5lciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBzdGRlcnIgKz0gc3RkZXJyRGVjb2Rlci53cml0ZShkYXRhKTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0ZEVyckxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxTdGRFcnJMaXN0ZW5lcihkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3RkT3V0TGlzdGVuZXIgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgc3Rkb3V0ICs9IHN0ZG91dERlY29kZXIud3JpdGUoZGF0YSk7XG4gICAgICAgICAgICBpZiAob3JpZ2luYWxTdGRvdXRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsU3Rkb3V0TGlzdGVuZXIoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxpc3RlbmVycyksIHsgc3Rkb3V0OiBzdGRPdXRMaXN0ZW5lciwgc3RkZXJyOiBzdGRFcnJMaXN0ZW5lciB9KTtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSB5aWVsZCBleGVjKGNvbW1hbmRMaW5lLCBhcmdzLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGxpc3RlbmVycyB9KSk7XG4gICAgICAgIC8vZmx1c2ggYW55IHJlbWFpbmluZyBjaGFyYWN0ZXJzXG4gICAgICAgIHN0ZG91dCArPSBzdGRvdXREZWNvZGVyLmVuZCgpO1xuICAgICAgICBzdGRlcnIgKz0gc3RkZXJyRGVjb2Rlci5lbmQoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4aXRDb2RlLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5leHBvcnRzLmdldEV4ZWNPdXRwdXQgPSBnZXRFeGVjT3V0cHV0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhlYy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gV2UgdXNlIGFueSBhcyBhIHZhbGlkIGlucHV0IHR5cGVcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudG9Db21tYW5kUHJvcGVydGllcyA9IGV4cG9ydHMudG9Db21tYW5kVmFsdWUgPSB2b2lkIDA7XG4vKipcbiAqIFNhbml0aXplcyBhbiBpbnB1dCBpbnRvIGEgc3RyaW5nIHNvIGl0IGNhbiBiZSBwYXNzZWQgaW50byBpc3N1ZUNvbW1hbmQgc2FmZWx5XG4gKiBAcGFyYW0gaW5wdXQgaW5wdXQgdG8gc2FuaXRpemUgaW50byBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiB0b0NvbW1hbmRWYWx1ZShpbnB1dCkge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShpbnB1dCk7XG59XG5leHBvcnRzLnRvQ29tbWFuZFZhbHVlID0gdG9Db21tYW5kVmFsdWU7XG4vKipcbiAqXG4gKiBAcGFyYW0gYW5ub3RhdGlvblByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kIHByb3BlcnRpZXMgdG8gc2VuZCB3aXRoIHRoZSBhY3R1YWwgYW5ub3RhdGlvbiBjb21tYW5kXG4gKiBTZWUgSXNzdWVDb21tYW5kUHJvcGVydGllczogaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL2Jsb2IvbWFpbi9zcmMvUnVubmVyLldvcmtlci9BY3Rpb25Db21tYW5kTWFuYWdlci5jcyNMNjQ2XG4gKi9cbmZ1bmN0aW9uIHRvQ29tbWFuZFByb3BlcnRpZXMoYW5ub3RhdGlvblByb3BlcnRpZXMpIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKGFubm90YXRpb25Qcm9wZXJ0aWVzKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogYW5ub3RhdGlvblByb3BlcnRpZXMudGl0bGUsXG4gICAgICAgIGZpbGU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLmZpbGUsXG4gICAgICAgIGxpbmU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLnN0YXJ0TGluZSxcbiAgICAgICAgZW5kTGluZTogYW5ub3RhdGlvblByb3BlcnRpZXMuZW5kTGluZSxcbiAgICAgICAgY29sOiBhbm5vdGF0aW9uUHJvcGVydGllcy5zdGFydENvbHVtbixcbiAgICAgICAgZW5kQ29sdW1uOiBhbm5vdGF0aW9uUHJvcGVydGllcy5lbmRDb2x1bW5cbiAgICB9O1xufVxuZXhwb3J0cy50b0NvbW1hbmRQcm9wZXJ0aWVzID0gdG9Db21tYW5kUHJvcGVydGllcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNzdWUgPSBleHBvcnRzLmlzc3VlQ29tbWFuZCA9IHZvaWQgMDtcbmNvbnN0IG9zID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG4vKipcbiAqIENvbW1hbmRzXG4gKlxuICogQ29tbWFuZCBGb3JtYXQ6XG4gKiAgIDo6bmFtZSBrZXk9dmFsdWUsa2V5PXZhbHVlOjptZXNzYWdlXG4gKlxuICogRXhhbXBsZXM6XG4gKiAgIDo6d2FybmluZzo6VGhpcyBpcyB0aGUgbWVzc2FnZVxuICogICA6OnNldC1lbnYgbmFtZT1NWV9WQVI6OnNvbWUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNzdWVDb21tYW5kKGNvbW1hbmQsIHByb3BlcnRpZXMsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjbWQgPSBuZXcgQ29tbWFuZChjb21tYW5kLCBwcm9wZXJ0aWVzLCBtZXNzYWdlKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjbWQudG9TdHJpbmcoKSArIG9zLkVPTCk7XG59XG5leHBvcnRzLmlzc3VlQ29tbWFuZCA9IGlzc3VlQ29tbWFuZDtcbmZ1bmN0aW9uIGlzc3VlKG5hbWUsIG1lc3NhZ2UgPSAnJykge1xuICAgIGlzc3VlQ29tbWFuZChuYW1lLCB7fSwgbWVzc2FnZSk7XG59XG5leHBvcnRzLmlzc3VlID0gaXNzdWU7XG5jb25zdCBDTURfU1RSSU5HID0gJzo6JztcbmNsYXNzIENvbW1hbmQge1xuICAgIGNvbnN0cnVjdG9yKGNvbW1hbmQsIHByb3BlcnRpZXMsIG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKCFjb21tYW5kKSB7XG4gICAgICAgICAgICBjb21tYW5kID0gJ21pc3NpbmcuY29tbWFuZCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBjbWRTdHIgPSBDTURfU1RSSU5HICsgdGhpcy5jb21tYW5kO1xuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKHRoaXMucHJvcGVydGllcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY21kU3RyICs9ICcgJztcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRTdHIgKz0gJywnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY21kU3RyICs9IGAke2tleX09JHtlc2NhcGVQcm9wZXJ0eSh2YWwpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY21kU3RyICs9IGAke0NNRF9TVFJJTkd9JHtlc2NhcGVEYXRhKHRoaXMubWVzc2FnZSl9YDtcbiAgICAgICAgcmV0dXJuIGNtZFN0cjtcbiAgICB9XG59XG5mdW5jdGlvbiBlc2NhcGVEYXRhKHMpIHtcbiAgICByZXR1cm4gKDAsIHV0aWxzXzEudG9Db21tYW5kVmFsdWUpKHMpXG4gICAgICAgIC5yZXBsYWNlKC8lL2csICclMjUnKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csICclMEQnKVxuICAgICAgICAucmVwbGFjZSgvXFxuL2csICclMEEnKTtcbn1cbmZ1bmN0aW9uIGVzY2FwZVByb3BlcnR5KHMpIHtcbiAgICByZXR1cm4gKDAsIHV0aWxzXzEudG9Db21tYW5kVmFsdWUpKHMpXG4gICAgICAgIC5yZXBsYWNlKC8lL2csICclMjUnKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csICclMEQnKVxuICAgICAgICAucmVwbGFjZSgvXFxuL2csICclMEEnKVxuICAgICAgICAucmVwbGFjZSgvOi9nLCAnJTNBJylcbiAgICAgICAgLnJlcGxhY2UoLywvZywgJyUyQycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbWFuZC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gRm9yIGludGVybmFsIHVzZSwgc3ViamVjdCB0byBjaGFuZ2UuXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHJlcGFyZUtleVZhbHVlTWVzc2FnZSA9IGV4cG9ydHMuaXNzdWVGaWxlQ29tbWFuZCA9IHZvaWQgMDtcbi8vIFdlIHVzZSBhbnkgYXMgYSB2YWxpZCBpbnB1dCB0eXBlXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5jb25zdCBjcnlwdG8gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImNyeXB0b1wiKSk7XG5jb25zdCBmcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZnNcIikpO1xuY29uc3Qgb3MgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm9zXCIpKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmZ1bmN0aW9uIGlzc3VlRmlsZUNvbW1hbmQoY29tbWFuZCwgbWVzc2FnZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbYEdJVEhVQl8ke2NvbW1hbmR9YF07XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBmaWxlIGNvbW1hbmQgJHtjb21tYW5kfWApO1xuICAgIH1cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBmaWxlIGF0IHBhdGg6ICR7ZmlsZVBhdGh9YCk7XG4gICAgfVxuICAgIGZzLmFwcGVuZEZpbGVTeW5jKGZpbGVQYXRoLCBgJHsoMCwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSkobWVzc2FnZSl9JHtvcy5FT0x9YCwge1xuICAgICAgICBlbmNvZGluZzogJ3V0ZjgnXG4gICAgfSk7XG59XG5leHBvcnRzLmlzc3VlRmlsZUNvbW1hbmQgPSBpc3N1ZUZpbGVDb21tYW5kO1xuZnVuY3Rpb24gcHJlcGFyZUtleVZhbHVlTWVzc2FnZShrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgZGVsaW1pdGVyID0gYGdoYWRlbGltaXRlcl8ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgICBjb25zdCBjb252ZXJ0ZWRWYWx1ZSA9ICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWx1ZSk7XG4gICAgLy8gVGhlc2Ugc2hvdWxkIHJlYWxpc3RpY2FsbHkgbmV2ZXIgaGFwcGVuLCBidXQganVzdCBpbiBjYXNlIHNvbWVvbmUgZmluZHMgYVxuICAgIC8vIHdheSB0byBleHBsb2l0IHV1aWQgZ2VuZXJhdGlvbiBsZXQncyBub3QgYWxsb3cga2V5cyBvciB2YWx1ZXMgdGhhdCBjb250YWluXG4gICAgLy8gdGhlIGRlbGltaXRlci5cbiAgICBpZiAoa2V5LmluY2x1ZGVzKGRlbGltaXRlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGlucHV0OiBuYW1lIHNob3VsZCBub3QgY29udGFpbiB0aGUgZGVsaW1pdGVyIFwiJHtkZWxpbWl0ZXJ9XCJgKTtcbiAgICB9XG4gICAgaWYgKGNvbnZlcnRlZFZhbHVlLmluY2x1ZGVzKGRlbGltaXRlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGlucHV0OiB2YWx1ZSBzaG91bGQgbm90IGNvbnRhaW4gdGhlIGRlbGltaXRlciBcIiR7ZGVsaW1pdGVyfVwiYCk7XG4gICAgfVxuICAgIHJldHVybiBgJHtrZXl9PDwke2RlbGltaXRlcn0ke29zLkVPTH0ke2NvbnZlcnRlZFZhbHVlfSR7b3MuRU9MfSR7ZGVsaW1pdGVyfWA7XG59XG5leHBvcnRzLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UgPSBwcmVwYXJlS2V5VmFsdWVNZXNzYWdlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZS1jb21tYW5kLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNoZWNrQnlwYXNzID0gZXhwb3J0cy5nZXRQcm94eVVybCA9IHZvaWQgMDtcbmZ1bmN0aW9uIGdldFByb3h5VXJsKHJlcVVybCkge1xuICAgIGNvbnN0IHVzaW5nU3NsID0gcmVxVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICBpZiAoY2hlY2tCeXBhc3MocmVxVXJsKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBwcm94eVZhciA9ICgoKSA9PiB7XG4gICAgICAgIGlmICh1c2luZ1NzbCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydodHRwc19wcm94eSddIHx8IHByb2Nlc3MuZW52WydIVFRQU19QUk9YWSddO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydodHRwX3Byb3h5J10gfHwgcHJvY2Vzcy5lbnZbJ0hUVFBfUFJPWFknXTtcbiAgICAgICAgfVxuICAgIH0pKCk7XG4gICAgaWYgKHByb3h5VmFyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERlY29kZWRVUkwocHJveHlWYXIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgaWYgKCFwcm94eVZhci5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIXByb3h5VmFyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWNvZGVkVVJMKGBodHRwOi8vJHtwcm94eVZhcn1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnRzLmdldFByb3h5VXJsID0gZ2V0UHJveHlVcmw7XG5mdW5jdGlvbiBjaGVja0J5cGFzcyhyZXFVcmwpIHtcbiAgICBpZiAoIXJlcVVybC5ob3N0bmFtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJlcUhvc3QgPSByZXFVcmwuaG9zdG5hbWU7XG4gICAgaWYgKGlzTG9vcGJhY2tBZGRyZXNzKHJlcUhvc3QpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBub1Byb3h5ID0gcHJvY2Vzcy5lbnZbJ25vX3Byb3h5J10gfHwgcHJvY2Vzcy5lbnZbJ05PX1BST1hZJ10gfHwgJyc7XG4gICAgaWYgKCFub1Byb3h5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRGV0ZXJtaW5lIHRoZSByZXF1ZXN0IHBvcnRcbiAgICBsZXQgcmVxUG9ydDtcbiAgICBpZiAocmVxVXJsLnBvcnQpIHtcbiAgICAgICAgcmVxUG9ydCA9IE51bWJlcihyZXFVcmwucG9ydCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgICAgICByZXFQb3J0ID0gODA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgcmVxUG9ydCA9IDQ0MztcbiAgICB9XG4gICAgLy8gRm9ybWF0IHRoZSByZXF1ZXN0IGhvc3RuYW1lIGFuZCBob3N0bmFtZSB3aXRoIHBvcnRcbiAgICBjb25zdCB1cHBlclJlcUhvc3RzID0gW3JlcVVybC5ob3N0bmFtZS50b1VwcGVyQ2FzZSgpXTtcbiAgICBpZiAodHlwZW9mIHJlcVBvcnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVwcGVyUmVxSG9zdHMucHVzaChgJHt1cHBlclJlcUhvc3RzWzBdfToke3JlcVBvcnR9YCk7XG4gICAgfVxuICAgIC8vIENvbXBhcmUgcmVxdWVzdCBob3N0IGFnYWluc3Qgbm9wcm94eVxuICAgIGZvciAoY29uc3QgdXBwZXJOb1Byb3h5SXRlbSBvZiBub1Byb3h5XG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAoeCA9PiB4LnRyaW0oKS50b1VwcGVyQ2FzZSgpKVxuICAgICAgICAuZmlsdGVyKHggPT4geCkpIHtcbiAgICAgICAgaWYgKHVwcGVyTm9Qcm94eUl0ZW0gPT09ICcqJyB8fFxuICAgICAgICAgICAgdXBwZXJSZXFIb3N0cy5zb21lKHggPT4geCA9PT0gdXBwZXJOb1Byb3h5SXRlbSB8fFxuICAgICAgICAgICAgICAgIHguZW5kc1dpdGgoYC4ke3VwcGVyTm9Qcm94eUl0ZW19YCkgfHxcbiAgICAgICAgICAgICAgICAodXBwZXJOb1Byb3h5SXRlbS5zdGFydHNXaXRoKCcuJykgJiZcbiAgICAgICAgICAgICAgICAgICAgeC5lbmRzV2l0aChgJHt1cHBlck5vUHJveHlJdGVtfWApKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuY2hlY2tCeXBhc3MgPSBjaGVja0J5cGFzcztcbmZ1bmN0aW9uIGlzTG9vcGJhY2tBZGRyZXNzKGhvc3QpIHtcbiAgICBjb25zdCBob3N0TG93ZXIgPSBob3N0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChob3N0TG93ZXIgPT09ICdsb2NhbGhvc3QnIHx8XG4gICAgICAgIGhvc3RMb3dlci5zdGFydHNXaXRoKCcxMjcuJykgfHxcbiAgICAgICAgaG9zdExvd2VyLnN0YXJ0c1dpdGgoJ1s6OjFdJykgfHxcbiAgICAgICAgaG9zdExvd2VyLnN0YXJ0c1dpdGgoJ1swOjA6MDowOjA6MDowOjFdJykpO1xufVxuY2xhc3MgRGVjb2RlZFVSTCBleHRlbmRzIFVSTCB7XG4gICAgY29uc3RydWN0b3IodXJsLCBiYXNlKSB7XG4gICAgICAgIHN1cGVyKHVybCwgYmFzZSk7XG4gICAgICAgIHRoaXMuX2RlY29kZWRVc2VybmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChzdXBlci51c2VybmFtZSk7XG4gICAgICAgIHRoaXMuX2RlY29kZWRQYXNzd29yZCA9IGRlY29kZVVSSUNvbXBvbmVudChzdXBlci5wYXNzd29yZCk7XG4gICAgfVxuICAgIGdldCB1c2VybmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29kZWRVc2VybmFtZTtcbiAgICB9XG4gICAgZ2V0IHBhc3N3b3JkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlZFBhc3N3b3JkO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3h5LmpzLm1hcCIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7XG52YXIgdGxzID0gcmVxdWlyZSgndGxzJyk7XG52YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcbnZhciBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG52YXIgZXZlbnRzID0gcmVxdWlyZSgnZXZlbnRzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuXG5leHBvcnRzLmh0dHBPdmVySHR0cCA9IGh0dHBPdmVySHR0cDtcbmV4cG9ydHMuaHR0cHNPdmVySHR0cCA9IGh0dHBzT3Zlckh0dHA7XG5leHBvcnRzLmh0dHBPdmVySHR0cHMgPSBodHRwT3Zlckh0dHBzO1xuZXhwb3J0cy5odHRwc092ZXJIdHRwcyA9IGh0dHBzT3Zlckh0dHBzO1xuXG5cbmZ1bmN0aW9uIGh0dHBPdmVySHR0cChvcHRpb25zKSB7XG4gIHZhciBhZ2VudCA9IG5ldyBUdW5uZWxpbmdBZ2VudChvcHRpb25zKTtcbiAgYWdlbnQucmVxdWVzdCA9IGh0dHAucmVxdWVzdDtcbiAgcmV0dXJuIGFnZW50O1xufVxuXG5mdW5jdGlvbiBodHRwc092ZXJIdHRwKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpO1xuICBhZ2VudC5yZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0O1xuICBhZ2VudC5jcmVhdGVTb2NrZXQgPSBjcmVhdGVTZWN1cmVTb2NrZXQ7XG4gIGFnZW50LmRlZmF1bHRQb3J0ID0gNDQzO1xuICByZXR1cm4gYWdlbnQ7XG59XG5cbmZ1bmN0aW9uIGh0dHBPdmVySHR0cHMob3B0aW9ucykge1xuICB2YXIgYWdlbnQgPSBuZXcgVHVubmVsaW5nQWdlbnQob3B0aW9ucyk7XG4gIGFnZW50LnJlcXVlc3QgPSBodHRwcy5yZXF1ZXN0O1xuICByZXR1cm4gYWdlbnQ7XG59XG5cbmZ1bmN0aW9uIGh0dHBzT3Zlckh0dHBzKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpO1xuICBhZ2VudC5yZXF1ZXN0ID0gaHR0cHMucmVxdWVzdDtcbiAgYWdlbnQuY3JlYXRlU29ja2V0ID0gY3JlYXRlU2VjdXJlU29ja2V0O1xuICBhZ2VudC5kZWZhdWx0UG9ydCA9IDQ0MztcbiAgcmV0dXJuIGFnZW50O1xufVxuXG5cbmZ1bmN0aW9uIFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBzZWxmLnByb3h5T3B0aW9ucyA9IHNlbGYub3B0aW9ucy5wcm94eSB8fCB7fTtcbiAgc2VsZi5tYXhTb2NrZXRzID0gc2VsZi5vcHRpb25zLm1heFNvY2tldHMgfHwgaHR0cC5BZ2VudC5kZWZhdWx0TWF4U29ja2V0cztcbiAgc2VsZi5yZXF1ZXN0cyA9IFtdO1xuICBzZWxmLnNvY2tldHMgPSBbXTtcblxuICBzZWxmLm9uKCdmcmVlJywgZnVuY3Rpb24gb25GcmVlKHNvY2tldCwgaG9zdCwgcG9ydCwgbG9jYWxBZGRyZXNzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0b09wdGlvbnMoaG9zdCwgcG9ydCwgbG9jYWxBZGRyZXNzKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc2VsZi5yZXF1ZXN0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgdmFyIHBlbmRpbmcgPSBzZWxmLnJlcXVlc3RzW2ldO1xuICAgICAgaWYgKHBlbmRpbmcuaG9zdCA9PT0gb3B0aW9ucy5ob3N0ICYmIHBlbmRpbmcucG9ydCA9PT0gb3B0aW9ucy5wb3J0KSB7XG4gICAgICAgIC8vIERldGVjdCB0aGUgcmVxdWVzdCB0byBjb25uZWN0IHNhbWUgb3JpZ2luIHNlcnZlcixcbiAgICAgICAgLy8gcmV1c2UgdGhlIGNvbm5lY3Rpb24uXG4gICAgICAgIHNlbGYucmVxdWVzdHMuc3BsaWNlKGksIDEpO1xuICAgICAgICBwZW5kaW5nLnJlcXVlc3Qub25Tb2NrZXQoc29ja2V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgIHNlbGYucmVtb3ZlU29ja2V0KHNvY2tldCk7XG4gIH0pO1xufVxudXRpbC5pbmhlcml0cyhUdW5uZWxpbmdBZ2VudCwgZXZlbnRzLkV2ZW50RW1pdHRlcik7XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5hZGRSZXF1ZXN0ID0gZnVuY3Rpb24gYWRkUmVxdWVzdChyZXEsIGhvc3QsIHBvcnQsIGxvY2FsQWRkcmVzcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBvcHRpb25zID0gbWVyZ2VPcHRpb25zKHtyZXF1ZXN0OiByZXF9LCBzZWxmLm9wdGlvbnMsIHRvT3B0aW9ucyhob3N0LCBwb3J0LCBsb2NhbEFkZHJlc3MpKTtcblxuICBpZiAoc2VsZi5zb2NrZXRzLmxlbmd0aCA+PSB0aGlzLm1heFNvY2tldHMpIHtcbiAgICAvLyBXZSBhcmUgb3ZlciBsaW1pdCBzbyB3ZSdsbCBhZGQgaXQgdG8gdGhlIHF1ZXVlLlxuICAgIHNlbGYucmVxdWVzdHMucHVzaChvcHRpb25zKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiB3ZSBhcmUgdW5kZXIgbWF4U29ja2V0cyBjcmVhdGUgYSBuZXcgb25lLlxuICBzZWxmLmNyZWF0ZVNvY2tldChvcHRpb25zLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICBzb2NrZXQub24oJ2ZyZWUnLCBvbkZyZWUpO1xuICAgIHNvY2tldC5vbignY2xvc2UnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgIHNvY2tldC5vbignYWdlbnRSZW1vdmUnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgIHJlcS5vblNvY2tldChzb2NrZXQpO1xuXG4gICAgZnVuY3Rpb24gb25GcmVlKCkge1xuICAgICAgc2VsZi5lbWl0KCdmcmVlJywgc29ja2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsb3NlT3JSZW1vdmUoZXJyKSB7XG4gICAgICBzZWxmLnJlbW92ZVNvY2tldChzb2NrZXQpO1xuICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdmcmVlJywgb25GcmVlKTtcbiAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdhZ2VudFJlbW92ZScsIG9uQ2xvc2VPclJlbW92ZSk7XG4gICAgfVxuICB9KTtcbn07XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQgPSBmdW5jdGlvbiBjcmVhdGVTb2NrZXQob3B0aW9ucywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcGxhY2Vob2xkZXIgPSB7fTtcbiAgc2VsZi5zb2NrZXRzLnB1c2gocGxhY2Vob2xkZXIpO1xuXG4gIHZhciBjb25uZWN0T3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh7fSwgc2VsZi5wcm94eU9wdGlvbnMsIHtcbiAgICBtZXRob2Q6ICdDT05ORUNUJyxcbiAgICBwYXRoOiBvcHRpb25zLmhvc3QgKyAnOicgKyBvcHRpb25zLnBvcnQsXG4gICAgYWdlbnQ6IGZhbHNlLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIGhvc3Q6IG9wdGlvbnMuaG9zdCArICc6JyArIG9wdGlvbnMucG9ydFxuICAgIH1cbiAgfSk7XG4gIGlmIChvcHRpb25zLmxvY2FsQWRkcmVzcykge1xuICAgIGNvbm5lY3RPcHRpb25zLmxvY2FsQWRkcmVzcyA9IG9wdGlvbnMubG9jYWxBZGRyZXNzO1xuICB9XG4gIGlmIChjb25uZWN0T3B0aW9ucy5wcm94eUF1dGgpIHtcbiAgICBjb25uZWN0T3B0aW9ucy5oZWFkZXJzID0gY29ubmVjdE9wdGlvbnMuaGVhZGVycyB8fCB7fTtcbiAgICBjb25uZWN0T3B0aW9ucy5oZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSAnQmFzaWMgJyArXG4gICAgICAgIG5ldyBCdWZmZXIoY29ubmVjdE9wdGlvbnMucHJveHlBdXRoKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICBkZWJ1ZygnbWFraW5nIENPTk5FQ1QgcmVxdWVzdCcpO1xuICB2YXIgY29ubmVjdFJlcSA9IHNlbGYucmVxdWVzdChjb25uZWN0T3B0aW9ucyk7XG4gIGNvbm5lY3RSZXEudXNlQ2h1bmtlZEVuY29kaW5nQnlEZWZhdWx0ID0gZmFsc2U7IC8vIGZvciB2MC42XG4gIGNvbm5lY3RSZXEub25jZSgncmVzcG9uc2UnLCBvblJlc3BvbnNlKTsgLy8gZm9yIHYwLjZcbiAgY29ubmVjdFJlcS5vbmNlKCd1cGdyYWRlJywgb25VcGdyYWRlKTsgICAvLyBmb3IgdjAuNlxuICBjb25uZWN0UmVxLm9uY2UoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpOyAgIC8vIGZvciB2MC43IG9yIGxhdGVyXG4gIGNvbm5lY3RSZXEub25jZSgnZXJyb3InLCBvbkVycm9yKTtcbiAgY29ubmVjdFJlcS5lbmQoKTtcblxuICBmdW5jdGlvbiBvblJlc3BvbnNlKHJlcykge1xuICAgIC8vIFZlcnkgaGFja3kuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGh0dHAtcGFyc2VyIGxlYWtzLlxuICAgIHJlcy51cGdyYWRlID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVXBncmFkZShyZXMsIHNvY2tldCwgaGVhZCkge1xuICAgIC8vIEhhY2t5LlxuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBvbkNvbm5lY3QocmVzLCBzb2NrZXQsIGhlYWQpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Db25uZWN0KHJlcywgc29ja2V0LCBoZWFkKSB7XG4gICAgY29ubmVjdFJlcS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgZGVidWcoJ3R1bm5lbGluZyBzb2NrZXQgY291bGQgbm90IGJlIGVzdGFibGlzaGVkLCBzdGF0dXNDb2RlPSVkJyxcbiAgICAgICAgcmVzLnN0YXR1c0NvZGUpO1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigndHVubmVsaW5nIHNvY2tldCBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQsICcgK1xuICAgICAgICAnc3RhdHVzQ29kZT0nICsgcmVzLnN0YXR1c0NvZGUpO1xuICAgICAgZXJyb3IuY29kZSA9ICdFQ09OTlJFU0VUJztcbiAgICAgIG9wdGlvbnMucmVxdWVzdC5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgIHNlbGYucmVtb3ZlU29ja2V0KHBsYWNlaG9sZGVyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGhlYWQubGVuZ3RoID4gMCkge1xuICAgICAgZGVidWcoJ2dvdCBpbGxlZ2FsIHJlc3BvbnNlIGJvZHkgZnJvbSBwcm94eScpO1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignZ290IGlsbGVnYWwgcmVzcG9uc2UgYm9keSBmcm9tIHByb3h5Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnO1xuICAgICAgb3B0aW9ucy5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgc2VsZi5yZW1vdmVTb2NrZXQocGxhY2Vob2xkZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1ZygndHVubmVsaW5nIGNvbm5lY3Rpb24gaGFzIGVzdGFibGlzaGVkJyk7XG4gICAgc2VsZi5zb2NrZXRzW3NlbGYuc29ja2V0cy5pbmRleE9mKHBsYWNlaG9sZGVyKV0gPSBzb2NrZXQ7XG4gICAgcmV0dXJuIGNiKHNvY2tldCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkVycm9yKGNhdXNlKSB7XG4gICAgY29ubmVjdFJlcS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcblxuICAgIGRlYnVnKCd0dW5uZWxpbmcgc29ja2V0IGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCwgY2F1c2U9JXNcXG4nLFxuICAgICAgICAgIGNhdXNlLm1lc3NhZ2UsIGNhdXNlLnN0YWNrKTtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ3R1bm5lbGluZyBzb2NrZXQgY291bGQgbm90IGJlIGVzdGFibGlzaGVkLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhdXNlPScgKyBjYXVzZS5tZXNzYWdlKTtcbiAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnO1xuICAgIG9wdGlvbnMucmVxdWVzdC5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICBzZWxmLnJlbW92ZVNvY2tldChwbGFjZWhvbGRlcik7XG4gIH1cbn07XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5yZW1vdmVTb2NrZXQgPSBmdW5jdGlvbiByZW1vdmVTb2NrZXQoc29ja2V0KSB7XG4gIHZhciBwb3MgPSB0aGlzLnNvY2tldHMuaW5kZXhPZihzb2NrZXQpXG4gIGlmIChwb3MgPT09IC0xKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuc29ja2V0cy5zcGxpY2UocG9zLCAxKTtcblxuICB2YXIgcGVuZGluZyA9IHRoaXMucmVxdWVzdHMuc2hpZnQoKTtcbiAgaWYgKHBlbmRpbmcpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgcmVxdWVzdHMgYW5kIGEgc29ja2V0IGdldHMgY2xvc2VkIGEgbmV3IG9uZVxuICAgIC8vIG5lZWRzIHRvIGJlIGNyZWF0ZWQgdG8gdGFrZSBvdmVyIGluIHRoZSBwb29sIGZvciB0aGUgb25lIHRoYXQgY2xvc2VkLlxuICAgIHRoaXMuY3JlYXRlU29ja2V0KHBlbmRpbmcsIGZ1bmN0aW9uKHNvY2tldCkge1xuICAgICAgcGVuZGluZy5yZXF1ZXN0Lm9uU29ja2V0KHNvY2tldCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlY3VyZVNvY2tldChvcHRpb25zLCBjYikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIFR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQuY2FsbChzZWxmLCBvcHRpb25zLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICB2YXIgaG9zdEhlYWRlciA9IG9wdGlvbnMucmVxdWVzdC5nZXRIZWFkZXIoJ2hvc3QnKTtcbiAgICB2YXIgdGxzT3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh7fSwgc2VsZi5vcHRpb25zLCB7XG4gICAgICBzb2NrZXQ6IHNvY2tldCxcbiAgICAgIHNlcnZlcm5hbWU6IGhvc3RIZWFkZXIgPyBob3N0SGVhZGVyLnJlcGxhY2UoLzouKiQvLCAnJykgOiBvcHRpb25zLmhvc3RcbiAgICB9KTtcblxuICAgIC8vIDAgaXMgZHVtbXkgcG9ydCBmb3IgdjAuNlxuICAgIHZhciBzZWN1cmVTb2NrZXQgPSB0bHMuY29ubmVjdCgwLCB0bHNPcHRpb25zKTtcbiAgICBzZWxmLnNvY2tldHNbc2VsZi5zb2NrZXRzLmluZGV4T2Yoc29ja2V0KV0gPSBzZWN1cmVTb2NrZXQ7XG4gICAgY2Ioc2VjdXJlU29ja2V0KTtcbiAgfSk7XG59XG5cblxuZnVuY3Rpb24gdG9PcHRpb25zKGhvc3QsIHBvcnQsIGxvY2FsQWRkcmVzcykge1xuICBpZiAodHlwZW9mIGhvc3QgPT09ICdzdHJpbmcnKSB7IC8vIHNpbmNlIHYwLjEwXG4gICAgcmV0dXJuIHtcbiAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICBwb3J0OiBwb3J0LFxuICAgICAgbG9jYWxBZGRyZXNzOiBsb2NhbEFkZHJlc3NcbiAgICB9O1xuICB9XG4gIHJldHVybiBob3N0OyAvLyBmb3IgdjAuMTEgb3IgbGF0ZXJcbn1cblxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIG92ZXJyaWRlcyA9IGFyZ3VtZW50c1tpXTtcbiAgICBpZiAodHlwZW9mIG92ZXJyaWRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3ZlcnJpZGVzKTtcbiAgICAgIGZvciAodmFyIGogPSAwLCBrZXlMZW4gPSBrZXlzLmxlbmd0aDsgaiA8IGtleUxlbjsgKytqKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1tqXTtcbiAgICAgICAgaWYgKG92ZXJyaWRlc1trXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGFyZ2V0W2tdID0gb3ZlcnJpZGVzW2tdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cblxudmFyIGRlYnVnO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiYgL1xcYnR1bm5lbFxcYi8udGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKSkge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBhcmdzWzBdID0gJ1RVTk5FTDogJyArIGFyZ3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MudW5zaGlmdCgnVFVOTkVMOicpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICB9XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge307XG59XG5leHBvcnRzLmRlYnVnID0gZGVidWc7IC8vIGZvciB0ZXN0XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0ge1xuICBrQ2xvc2U6IFN5bWJvbCgnY2xvc2UnKSxcbiAga0Rlc3Ryb3k6IFN5bWJvbCgnZGVzdHJveScpLFxuICBrRGlzcGF0Y2g6IFN5bWJvbCgnZGlzcGF0Y2gnKSxcbiAga1VybDogU3ltYm9sKCd1cmwnKSxcbiAga1dyaXRpbmc6IFN5bWJvbCgnd3JpdGluZycpLFxuICBrUmVzdW1pbmc6IFN5bWJvbCgncmVzdW1pbmcnKSxcbiAga1F1ZXVlOiBTeW1ib2woJ3F1ZXVlJyksXG4gIGtDb25uZWN0OiBTeW1ib2woJ2Nvbm5lY3QnKSxcbiAga0Nvbm5lY3Rpbmc6IFN5bWJvbCgnY29ubmVjdGluZycpLFxuICBrSGVhZGVyc0xpc3Q6IFN5bWJvbCgnaGVhZGVycyBsaXN0JyksXG4gIGtLZWVwQWxpdmVEZWZhdWx0VGltZW91dDogU3ltYm9sKCdkZWZhdWx0IGtlZXAgYWxpdmUgdGltZW91dCcpLFxuICBrS2VlcEFsaXZlTWF4VGltZW91dDogU3ltYm9sKCdtYXgga2VlcCBhbGl2ZSB0aW1lb3V0JyksXG4gIGtLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkOiBTeW1ib2woJ2tlZXAgYWxpdmUgdGltZW91dCB0aHJlc2hvbGQnKSxcbiAga0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZTogU3ltYm9sKCdrZWVwIGFsaXZlIHRpbWVvdXQnKSxcbiAga0tlZXBBbGl2ZTogU3ltYm9sKCdrZWVwIGFsaXZlJyksXG4gIGtIZWFkZXJzVGltZW91dDogU3ltYm9sKCdoZWFkZXJzIHRpbWVvdXQnKSxcbiAga0JvZHlUaW1lb3V0OiBTeW1ib2woJ2JvZHkgdGltZW91dCcpLFxuICBrU2VydmVyTmFtZTogU3ltYm9sKCdzZXJ2ZXIgbmFtZScpLFxuICBrTG9jYWxBZGRyZXNzOiBTeW1ib2woJ2xvY2FsIGFkZHJlc3MnKSxcbiAga0hvc3Q6IFN5bWJvbCgnaG9zdCcpLFxuICBrTm9SZWY6IFN5bWJvbCgnbm8gcmVmJyksXG4gIGtCb2R5VXNlZDogU3ltYm9sKCd1c2VkJyksXG4gIGtSdW5uaW5nOiBTeW1ib2woJ3J1bm5pbmcnKSxcbiAga0Jsb2NraW5nOiBTeW1ib2woJ2Jsb2NraW5nJyksXG4gIGtQZW5kaW5nOiBTeW1ib2woJ3BlbmRpbmcnKSxcbiAga1NpemU6IFN5bWJvbCgnc2l6ZScpLFxuICBrQnVzeTogU3ltYm9sKCdidXN5JyksXG4gIGtRdWV1ZWQ6IFN5bWJvbCgncXVldWVkJyksXG4gIGtGcmVlOiBTeW1ib2woJ2ZyZWUnKSxcbiAga0Nvbm5lY3RlZDogU3ltYm9sKCdjb25uZWN0ZWQnKSxcbiAga0Nsb3NlZDogU3ltYm9sKCdjbG9zZWQnKSxcbiAga05lZWREcmFpbjogU3ltYm9sKCduZWVkIGRyYWluJyksXG4gIGtSZXNldDogU3ltYm9sKCdyZXNldCcpLFxuICBrRGVzdHJveWVkOiBTeW1ib2wuZm9yKCdub2RlanMuc3RyZWFtLmRlc3Ryb3llZCcpLFxuICBrTWF4SGVhZGVyc1NpemU6IFN5bWJvbCgnbWF4IGhlYWRlcnMgc2l6ZScpLFxuICBrUnVubmluZ0lkeDogU3ltYm9sKCdydW5uaW5nIGluZGV4JyksXG4gIGtQZW5kaW5nSWR4OiBTeW1ib2woJ3BlbmRpbmcgaW5kZXgnKSxcbiAga0Vycm9yOiBTeW1ib2woJ2Vycm9yJyksXG4gIGtDbGllbnRzOiBTeW1ib2woJ2NsaWVudHMnKSxcbiAga0NsaWVudDogU3ltYm9sKCdjbGllbnQnKSxcbiAga1BhcnNlcjogU3ltYm9sKCdwYXJzZXInKSxcbiAga09uRGVzdHJveWVkOiBTeW1ib2woJ2Rlc3Ryb3kgY2FsbGJhY2tzJyksXG4gIGtQaXBlbGluaW5nOiBTeW1ib2woJ3BpcGVsaW5pbmcnKSxcbiAga1NvY2tldDogU3ltYm9sKCdzb2NrZXQnKSxcbiAga0hvc3RIZWFkZXI6IFN5bWJvbCgnaG9zdCBoZWFkZXInKSxcbiAga0Nvbm5lY3RvcjogU3ltYm9sKCdjb25uZWN0b3InKSxcbiAga1N0cmljdENvbnRlbnRMZW5ndGg6IFN5bWJvbCgnc3RyaWN0IGNvbnRlbnQgbGVuZ3RoJyksXG4gIGtNYXhSZWRpcmVjdGlvbnM6IFN5bWJvbCgnbWF4UmVkaXJlY3Rpb25zJyksXG4gIGtNYXhSZXF1ZXN0czogU3ltYm9sKCdtYXhSZXF1ZXN0c1BlckNsaWVudCcpLFxuICBrUHJveHk6IFN5bWJvbCgncHJveHkgYWdlbnQgb3B0aW9ucycpLFxuICBrQ291bnRlcjogU3ltYm9sKCdzb2NrZXQgcmVxdWVzdCBjb3VudGVyJyksXG4gIGtJbnRlcmNlcHRvcnM6IFN5bWJvbCgnZGlzcGF0Y2ggaW50ZXJjZXB0b3JzJyksXG4gIGtNYXhSZXNwb25zZVNpemU6IFN5bWJvbCgnbWF4IHJlc3BvbnNlIHNpemUnKSxcbiAga0hUVFAyU2Vzc2lvbjogU3ltYm9sKCdodHRwMlNlc3Npb24nKSxcbiAga0hUVFAyU2Vzc2lvblN0YXRlOiBTeW1ib2woJ2h0dHAyU2Vzc2lvbiBzdGF0ZScpLFxuICBrSFRUUDJCdWlsZFJlcXVlc3Q6IFN5bWJvbCgnaHR0cDIgYnVpbGQgcmVxdWVzdCcpLFxuICBrSFRUUDFCdWlsZFJlcXVlc3Q6IFN5bWJvbCgnaHR0cDEgYnVpbGQgcmVxdWVzdCcpLFxuICBrSFRUUDJDb3B5SGVhZGVyczogU3ltYm9sKCdodHRwMiBjb3B5IGhlYWRlcnMnKSxcbiAga0hUVFBDb25uVmVyc2lvbjogU3ltYm9sKCdodHRwIGNvbm5lY3Rpb24gdmVyc2lvbicpLFxuICBrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5OiBTeW1ib2woJ3JldHJ5IGFnZW50IGRlZmF1bHQgcmV0cnknKSxcbiAga0NvbnN0cnVjdDogU3ltYm9sKCdjb25zdHJ1Y3RhYmxlJylcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNsYXNzIFVuZGljaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ1VuZGljaUVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSJ1xuICB9XG59XG5cbmNsYXNzIENvbm5lY3RUaW1lb3V0RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBDb25uZWN0VGltZW91dEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdDb25uZWN0VGltZW91dEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ0Nvbm5lY3QgVGltZW91dCBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9DT05ORUNUX1RJTUVPVVQnXG4gIH1cbn1cblxuY2xhc3MgSGVhZGVyc1RpbWVvdXRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhlYWRlcnNUaW1lb3V0RXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0hlYWRlcnNUaW1lb3V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnSGVhZGVycyBUaW1lb3V0IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0hFQURFUlNfVElNRU9VVCdcbiAgfVxufVxuXG5jbGFzcyBIZWFkZXJzT3ZlcmZsb3dFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhlYWRlcnNPdmVyZmxvd0Vycm9yKVxuICAgIHRoaXMubmFtZSA9ICdIZWFkZXJzT3ZlcmZsb3dFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdIZWFkZXJzIE92ZXJmbG93IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0hFQURFUlNfT1ZFUkZMT1cnXG4gIH1cbn1cblxuY2xhc3MgQm9keVRpbWVvdXRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEJvZHlUaW1lb3V0RXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0JvZHlUaW1lb3V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnQm9keSBUaW1lb3V0IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0JPRFlfVElNRU9VVCdcbiAgfVxufVxuXG5jbGFzcyBSZXNwb25zZVN0YXR1c0NvZGVFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGhlYWRlcnMsIGJvZHkpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZVN0YXR1c0NvZGVFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXNwb25zZSBTdGF0dXMgQ29kZSBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVNQT05TRV9TVEFUVVNfQ09ERSdcbiAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNDb2RlXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnNcbiAgfVxufVxuXG5jbGFzcyBJbnZhbGlkQXJndW1lbnRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEludmFsaWRBcmd1bWVudEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkQXJndW1lbnRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdJbnZhbGlkIEFyZ3VtZW50IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0lOVkFMSURfQVJHJ1xuICB9XG59XG5cbmNsYXNzIEludmFsaWRSZXR1cm5WYWx1ZUVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgSW52YWxpZFJldHVyblZhbHVlRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0ludmFsaWRSZXR1cm5WYWx1ZUVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ0ludmFsaWQgUmV0dXJuIFZhbHVlIEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFJ1xuICB9XG59XG5cbmNsYXNzIFJlcXVlc3RBYm9ydGVkRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXF1ZXN0QWJvcnRlZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdBYm9ydEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgYWJvcnRlZCdcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9BQk9SVEVEJ1xuICB9XG59XG5cbmNsYXNzIEluZm9ybWF0aW9uYWxFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEluZm9ybWF0aW9uYWxFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnSW5mb3JtYXRpb25hbEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgaW5mb3JtYXRpb24nXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfSU5GTydcbiAgfVxufVxuXG5jbGFzcyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ1JlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXF1ZXN0IGJvZHkgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGNvbnRlbnQtbGVuZ3RoIGhlYWRlcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVFfQ09OVEVOVF9MRU5HVEhfTUlTTUFUQ0gnXG4gIH1cbn1cblxuY2xhc3MgUmVzcG9uc2VDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ1Jlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnUmVzcG9uc2UgYm9keSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggY29udGVudC1sZW5ndGggaGVhZGVyJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1JFU19DT05URU5UX0xFTkdUSF9NSVNNQVRDSCdcbiAgfVxufVxuXG5jbGFzcyBDbGllbnREZXN0cm95ZWRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIENsaWVudERlc3Ryb3llZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdDbGllbnREZXN0cm95ZWRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdUaGUgY2xpZW50IGlzIGRlc3Ryb3llZCdcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9ERVNUUk9ZRUQnXG4gIH1cbn1cblxuY2xhc3MgQ2xpZW50Q2xvc2VkRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBDbGllbnRDbG9zZWRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnQ2xpZW50Q2xvc2VkRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGhlIGNsaWVudCBpcyBjbG9zZWQnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfQ0xPU0VEJ1xuICB9XG59XG5cbmNsYXNzIFNvY2tldEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSwgc29ja2V0KSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBTb2NrZXRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnU29ja2V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnU29ja2V0IGVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1NPQ0tFVCdcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuICB9XG59XG5cbmNsYXNzIE5vdFN1cHBvcnRlZEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgTm90U3VwcG9ydGVkRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ05vdFN1cHBvcnRlZEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ05vdCBzdXBwb3J0ZWQgZXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfTk9UX1NVUFBPUlRFRCdcbiAgfVxufVxuXG5jbGFzcyBCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE5vdFN1cHBvcnRlZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdNaXNzaW5nVXBzdHJlYW1FcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdObyB1cHN0cmVhbSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgQmFsYW5jZWRQb29sJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0JQTF9NSVNTSU5HX1VQU1RSRUFNJ1xuICB9XG59XG5cbmNsYXNzIEhUVFBQYXJzZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UsIGNvZGUsIGRhdGEpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhUVFBQYXJzZXJFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnSFRUUFBhcnNlckVycm9yJ1xuICAgIHRoaXMuY29kZSA9IGNvZGUgPyBgSFBFXyR7Y29kZX1gIDogdW5kZWZpbmVkXG4gICAgdGhpcy5kYXRhID0gZGF0YSA/IGRhdGEudG9TdHJpbmcoKSA6IHVuZGVmaW5lZFxuICB9XG59XG5cbmNsYXNzIFJlc3BvbnNlRXhjZWVkZWRNYXhTaXplRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1Jlc3BvbnNlIGNvbnRlbnQgZXhjZWVkZWQgbWF4IHNpemUnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfUkVTX0VYQ0VFREVEX01BWF9TSVpFJ1xuICB9XG59XG5cbmNsYXNzIFJlcXVlc3RSZXRyeUVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSwgY29kZSwgeyBoZWFkZXJzLCBkYXRhIH0pIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlcXVlc3RSZXRyeUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXF1ZXN0UmV0cnlFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXF1ZXN0IHJldHJ5IGVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1JFUV9SRVRSWSdcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBjb2RlXG4gICAgdGhpcy5kYXRhID0gZGF0YVxuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSFRUUFBhcnNlckVycm9yLFxuICBVbmRpY2lFcnJvcixcbiAgSGVhZGVyc1RpbWVvdXRFcnJvcixcbiAgSGVhZGVyc092ZXJmbG93RXJyb3IsXG4gIEJvZHlUaW1lb3V0RXJyb3IsXG4gIFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcixcbiAgQ29ubmVjdFRpbWVvdXRFcnJvcixcbiAgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvcixcbiAgQ2xpZW50RGVzdHJveWVkRXJyb3IsXG4gIENsaWVudENsb3NlZEVycm9yLFxuICBJbmZvcm1hdGlvbmFsRXJyb3IsXG4gIFNvY2tldEVycm9yLFxuICBOb3RTdXBwb3J0ZWRFcnJvcixcbiAgUmVzcG9uc2VDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcixcbiAgQmFsYW5jZWRQb29sTWlzc2luZ1Vwc3RyZWFtRXJyb3IsXG4gIFJlc3BvbnNlRXhjZWVkZWRNYXhTaXplRXJyb3IsXG4gIFJlcXVlc3RSZXRyeUVycm9yXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD59ICovXG5jb25zdCBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZCA9IHt9XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUVFAvSGVhZGVyc1xuY29uc3Qgd2VsbGtub3duSGVhZGVyTmFtZXMgPSBbXG4gICdBY2NlcHQnLFxuICAnQWNjZXB0LUVuY29kaW5nJyxcbiAgJ0FjY2VwdC1MYW5ndWFnZScsXG4gICdBY2NlcHQtUmFuZ2VzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcycsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLFxuICAnQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtTWF4LUFnZScsXG4gICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1NZXRob2QnLFxuICAnQWdlJyxcbiAgJ0FsbG93JyxcbiAgJ0FsdC1TdmMnLFxuICAnQWx0LVVzZWQnLFxuICAnQXV0aG9yaXphdGlvbicsXG4gICdDYWNoZS1Db250cm9sJyxcbiAgJ0NsZWFyLVNpdGUtRGF0YScsXG4gICdDb25uZWN0aW9uJyxcbiAgJ0NvbnRlbnQtRGlzcG9zaXRpb24nLFxuICAnQ29udGVudC1FbmNvZGluZycsXG4gICdDb250ZW50LUxhbmd1YWdlJyxcbiAgJ0NvbnRlbnQtTGVuZ3RoJyxcbiAgJ0NvbnRlbnQtTG9jYXRpb24nLFxuICAnQ29udGVudC1SYW5nZScsXG4gICdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsXG4gICdDb250ZW50LVNlY3VyaXR5LVBvbGljeS1SZXBvcnQtT25seScsXG4gICdDb250ZW50LVR5cGUnLFxuICAnQ29va2llJyxcbiAgJ0Nyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3knLFxuICAnQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3knLFxuICAnQ3Jvc3MtT3JpZ2luLVJlc291cmNlLVBvbGljeScsXG4gICdEYXRlJyxcbiAgJ0RldmljZS1NZW1vcnknLFxuICAnRG93bmxpbmsnLFxuICAnRUNUJyxcbiAgJ0VUYWcnLFxuICAnRXhwZWN0JyxcbiAgJ0V4cGVjdC1DVCcsXG4gICdFeHBpcmVzJyxcbiAgJ0ZvcndhcmRlZCcsXG4gICdGcm9tJyxcbiAgJ0hvc3QnLFxuICAnSWYtTWF0Y2gnLFxuICAnSWYtTW9kaWZpZWQtU2luY2UnLFxuICAnSWYtTm9uZS1NYXRjaCcsXG4gICdJZi1SYW5nZScsXG4gICdJZi1Vbm1vZGlmaWVkLVNpbmNlJyxcbiAgJ0tlZXAtQWxpdmUnLFxuICAnTGFzdC1Nb2RpZmllZCcsXG4gICdMaW5rJyxcbiAgJ0xvY2F0aW9uJyxcbiAgJ01heC1Gb3J3YXJkcycsXG4gICdPcmlnaW4nLFxuICAnUGVybWlzc2lvbnMtUG9saWN5JyxcbiAgJ1ByYWdtYScsXG4gICdQcm94eS1BdXRoZW50aWNhdGUnLFxuICAnUHJveHktQXV0aG9yaXphdGlvbicsXG4gICdSVFQnLFxuICAnUmFuZ2UnLFxuICAnUmVmZXJlcicsXG4gICdSZWZlcnJlci1Qb2xpY3knLFxuICAnUmVmcmVzaCcsXG4gICdSZXRyeS1BZnRlcicsXG4gICdTZWMtV2ViU29ja2V0LUFjY2VwdCcsXG4gICdTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMnLFxuICAnU2VjLVdlYlNvY2tldC1LZXknLFxuICAnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcsXG4gICdTZWMtV2ViU29ja2V0LVZlcnNpb24nLFxuICAnU2VydmVyJyxcbiAgJ1NlcnZlci1UaW1pbmcnLFxuICAnU2VydmljZS1Xb3JrZXItQWxsb3dlZCcsXG4gICdTZXJ2aWNlLVdvcmtlci1OYXZpZ2F0aW9uLVByZWxvYWQnLFxuICAnU2V0LUNvb2tpZScsXG4gICdTb3VyY2VNYXAnLFxuICAnU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eScsXG4gICdTdXBwb3J0cy1Mb2FkaW5nLU1vZGUnLFxuICAnVEUnLFxuICAnVGltaW5nLUFsbG93LU9yaWdpbicsXG4gICdUcmFpbGVyJyxcbiAgJ1RyYW5zZmVyLUVuY29kaW5nJyxcbiAgJ1VwZ3JhZGUnLFxuICAnVXBncmFkZS1JbnNlY3VyZS1SZXF1ZXN0cycsXG4gICdVc2VyLUFnZW50JyxcbiAgJ1ZhcnknLFxuICAnVmlhJyxcbiAgJ1dXVy1BdXRoZW50aWNhdGUnLFxuICAnWC1Db250ZW50LVR5cGUtT3B0aW9ucycsXG4gICdYLUROUy1QcmVmZXRjaC1Db250cm9sJyxcbiAgJ1gtRnJhbWUtT3B0aW9ucycsXG4gICdYLVBlcm1pdHRlZC1Dcm9zcy1Eb21haW4tUG9saWNpZXMnLFxuICAnWC1Qb3dlcmVkLUJ5JyxcbiAgJ1gtUmVxdWVzdGVkLVdpdGgnLFxuICAnWC1YU1MtUHJvdGVjdGlvbidcbl1cblxuZm9yIChsZXQgaSA9IDA7IGkgPCB3ZWxsa25vd25IZWFkZXJOYW1lcy5sZW5ndGg7ICsraSkge1xuICBjb25zdCBrZXkgPSB3ZWxsa25vd25IZWFkZXJOYW1lc1tpXVxuICBjb25zdCBsb3dlckNhc2VkS2V5ID0ga2V5LnRvTG93ZXJDYXNlKClcbiAgaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRba2V5XSA9IGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkW2xvd2VyQ2FzZWRLZXldID1cbiAgICBsb3dlckNhc2VkS2V5XG59XG5cbi8vIE5vdGU6IG9iamVjdCBwcm90b3R5cGVzIHNob3VsZCBub3QgYmUgYWJsZSB0byBiZSByZWZlcmVuY2VkLiBlLmcuIGBPYmplY3QjaGFzT3duUHJvcGVydHlgLlxuT2JqZWN0LnNldFByb3RvdHlwZU9mKGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkLCBudWxsKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgd2VsbGtub3duSGVhZGVyTmFtZXMsXG4gIGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBrRGVzdHJveWVkLCBrQm9keVVzZWQgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IEluY29taW5nTWVzc2FnZSB9ID0gcmVxdWlyZSgnaHR0cCcpXG5jb25zdCBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0JylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3JzJylcbmNvbnN0IHsgQmxvYiB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IG5vZGVVdGlsID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCB7IHN0cmluZ2lmeSB9ID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKVxuY29uc3QgeyBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZCB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuXG5jb25zdCBbbm9kZU1ham9yLCBub2RlTWlub3JdID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KCcuJykubWFwKHYgPT4gTnVtYmVyKHYpKVxuXG5mdW5jdGlvbiBub3AgKCkge31cblxuZnVuY3Rpb24gaXNTdHJlYW0gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoucGlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nXG59XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlLWZldGNoL2ZldGNoLWJsb2IvYmxvYi84YWI1ODdkMzQwODBkZTk0MTQwYjU0ZjA3MTY4NDUxZTdkMGI2NTVlL2luZGV4LmpzI0wyMjktTDI0MSAoTUlUIExpY2Vuc2UpXG5mdW5jdGlvbiBpc0Jsb2JMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIChCbG9iICYmIG9iamVjdCBpbnN0YW5jZW9mIEJsb2IpIHx8IChcbiAgICBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgICh0eXBlb2Ygb2JqZWN0LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdHlwZW9mIG9iamVjdC5hcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAvXihCbG9ifEZpbGUpJC8udGVzdChvYmplY3RbU3ltYm9sLnRvU3RyaW5nVGFnXSlcbiAgKVxufVxuXG5mdW5jdGlvbiBidWlsZFVSTCAodXJsLCBxdWVyeVBhcmFtcykge1xuICBpZiAodXJsLmluY2x1ZGVzKCc/JykgfHwgdXJsLmluY2x1ZGVzKCcjJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IHBhcmFtcyBjYW5ub3QgYmUgcGFzc2VkIHdoZW4gdXJsIGFscmVhZHkgY29udGFpbnMgXCI/XCIgb3IgXCIjXCIuJylcbiAgfVxuXG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5KHF1ZXJ5UGFyYW1zKVxuXG4gIGlmIChzdHJpbmdpZmllZCkge1xuICAgIHVybCArPSAnPycgKyBzdHJpbmdpZmllZFxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBwYXJzZVVSTCAodXJsKSB7XG4gIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykge1xuICAgIHVybCA9IG5ldyBVUkwodXJsKVxuXG4gICAgaWYgKCEvXmh0dHBzPzovLnRlc3QodXJsLm9yaWdpbiB8fCB1cmwucHJvdG9jb2wpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIHByb3RvY29sOiB0aGUgVVJMIG11c3Qgc3RhcnQgd2l0aCBgaHR0cDpgIG9yIGBodHRwczpgLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHVybFxuICB9XG5cbiAgaWYgKCF1cmwgfHwgdHlwZW9mIHVybCAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMOiBUaGUgVVJMIGFyZ3VtZW50IG11c3QgYmUgYSBub24tbnVsbCBvYmplY3QuJylcbiAgfVxuXG4gIGlmICghL15odHRwcz86Ly50ZXN0KHVybC5vcmlnaW4gfHwgdXJsLnByb3RvY29sKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcHJvdG9jb2w6IHRoZSBVUkwgbXVzdCBzdGFydCB3aXRoIGBodHRwOmAgb3IgYGh0dHBzOmAuJylcbiAgfVxuXG4gIGlmICghKHVybCBpbnN0YW5jZW9mIFVSTCkpIHtcbiAgICBpZiAodXJsLnBvcnQgIT0gbnVsbCAmJiB1cmwucG9ydCAhPT0gJycgJiYgIU51bWJlci5pc0Zpbml0ZShwYXJzZUludCh1cmwucG9ydCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMOiBwb3J0IG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyIG9yIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuJylcbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGggIT0gbnVsbCAmJiB0eXBlb2YgdXJsLnBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIHBhdGg6IHRoZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWQuJylcbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lICE9IG51bGwgJiYgdHlwZW9mIHVybC5wYXRobmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcGF0aG5hbWU6IHRoZSBwYXRobmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgaWYgKHVybC5ob3N0bmFtZSAhPSBudWxsICYmIHR5cGVvZiB1cmwuaG9zdG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIGhvc3RuYW1lOiB0aGUgaG9zdG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZC4nKVxuICAgIH1cblxuICAgIGlmICh1cmwub3JpZ2luICE9IG51bGwgJiYgdHlwZW9mIHVybC5vcmlnaW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIG9yaWdpbjogdGhlIG9yaWdpbiBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHVybC5wb3J0ICE9IG51bGxcbiAgICAgID8gdXJsLnBvcnRcbiAgICAgIDogKHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MClcbiAgICBsZXQgb3JpZ2luID0gdXJsLm9yaWdpbiAhPSBudWxsXG4gICAgICA/IHVybC5vcmlnaW5cbiAgICAgIDogYCR7dXJsLnByb3RvY29sfS8vJHt1cmwuaG9zdG5hbWV9OiR7cG9ydH1gXG4gICAgbGV0IHBhdGggPSB1cmwucGF0aCAhPSBudWxsXG4gICAgICA/IHVybC5wYXRoXG4gICAgICA6IGAke3VybC5wYXRobmFtZSB8fCAnJ30ke3VybC5zZWFyY2ggfHwgJyd9YFxuXG4gICAgaWYgKG9yaWdpbi5lbmRzV2l0aCgnLycpKSB7XG4gICAgICBvcmlnaW4gPSBvcmlnaW4uc3Vic3RyaW5nKDAsIG9yaWdpbi5sZW5ndGggLSAxKVxuICAgIH1cblxuICAgIGlmIChwYXRoICYmICFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgcGF0aCA9IGAvJHtwYXRofWBcbiAgICB9XG4gICAgLy8gbmV3IFVSTChwYXRoLCBvcmlnaW4pIGlzIHVuc2FmZSB3aGVuIGBwYXRoYCBjb250YWlucyBhbiBhYnNvbHV0ZSBVUkxcbiAgICAvLyBGcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvVVJMOlxuICAgIC8vIElmIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJlbGF0aXZlIFVSTCwgc2Vjb25kIHBhcmFtIGlzIHJlcXVpcmVkLCBhbmQgd2lsbCBiZSB1c2VkIGFzIHRoZSBiYXNlIFVSTC5cbiAgICAvLyBJZiBmaXJzdCBwYXJhbWV0ZXIgaXMgYW4gYWJzb2x1dGUgVVJMLCBhIGdpdmVuIHNlY29uZCBwYXJhbSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgdXJsID0gbmV3IFVSTChvcmlnaW4gKyBwYXRoKVxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBwYXJzZU9yaWdpbiAodXJsKSB7XG4gIHVybCA9IHBhcnNlVVJMKHVybClcblxuICBpZiAodXJsLnBhdGhuYW1lICE9PSAnLycgfHwgdXJsLnNlYXJjaCB8fCB1cmwuaGFzaCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCB1cmwnKVxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBnZXRIb3N0bmFtZSAoaG9zdCkge1xuICBpZiAoaG9zdFswXSA9PT0gJ1snKSB7XG4gICAgY29uc3QgaWR4ID0gaG9zdC5pbmRleE9mKCddJylcblxuICAgIGFzc2VydChpZHggIT09IC0xKVxuICAgIHJldHVybiBob3N0LnN1YnN0cmluZygxLCBpZHgpXG4gIH1cblxuICBjb25zdCBpZHggPSBob3N0LmluZGV4T2YoJzonKVxuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGhvc3RcblxuICByZXR1cm4gaG9zdC5zdWJzdHJpbmcoMCwgaWR4KVxufVxuXG4vLyBJUCBhZGRyZXNzZXMgYXJlIG5vdCB2YWxpZCBzZXJ2ZXIgbmFtZXMgcGVyIFJGQzYwNjZcbi8vID4gQ3VycmVudGx5LCB0aGUgb25seSBzZXJ2ZXIgbmFtZXMgc3VwcG9ydGVkIGFyZSBETlMgaG9zdG5hbWVzXG5mdW5jdGlvbiBnZXRTZXJ2ZXJOYW1lIChob3N0KSB7XG4gIGlmICghaG9zdCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIGhvc3QsICdzdHJpbmcnKVxuXG4gIGNvbnN0IHNlcnZlcm5hbWUgPSBnZXRIb3N0bmFtZShob3N0KVxuICBpZiAobmV0LmlzSVAoc2VydmVybmFtZSkpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiBzZXJ2ZXJuYW1lXG59XG5cbmZ1bmN0aW9uIGRlZXBDbG9uZSAob2JqKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpXG59XG5cbmZ1bmN0aW9uIGlzQXN5bmNJdGVyYWJsZSAob2JqKSB7XG4gIHJldHVybiAhIShvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJylcbn1cblxuZnVuY3Rpb24gaXNJdGVyYWJsZSAob2JqKSB7XG4gIHJldHVybiAhIShvYmogIT0gbnVsbCAmJiAodHlwZW9mIG9ialtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSlcbn1cblxuZnVuY3Rpb24gYm9keUxlbmd0aCAoYm9keSkge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDBcbiAgfSBlbHNlIGlmIChpc1N0cmVhbShib2R5KSkge1xuICAgIGNvbnN0IHN0YXRlID0gYm9keS5fcmVhZGFibGVTdGF0ZVxuICAgIHJldHVybiBzdGF0ZSAmJiBzdGF0ZS5vYmplY3RNb2RlID09PSBmYWxzZSAmJiBzdGF0ZS5lbmRlZCA9PT0gdHJ1ZSAmJiBOdW1iZXIuaXNGaW5pdGUoc3RhdGUubGVuZ3RoKVxuICAgICAgPyBzdGF0ZS5sZW5ndGhcbiAgICAgIDogbnVsbFxuICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5zaXplICE9IG51bGwgPyBib2R5LnNpemUgOiBudWxsXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5ieXRlTGVuZ3RoXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0Rlc3Ryb3llZCAoc3RyZWFtKSB7XG4gIHJldHVybiAhc3RyZWFtIHx8ICEhKHN0cmVhbS5kZXN0cm95ZWQgfHwgc3RyZWFtW2tEZXN0cm95ZWRdKVxufVxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlQWJvcnRlZCAoc3RyZWFtKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtICYmIHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICByZXR1cm4gaXNEZXN0cm95ZWQoc3RyZWFtKSAmJiBzdGF0ZSAmJiAhc3RhdGUuZW5kRW1pdHRlZFxufVxuXG5mdW5jdGlvbiBkZXN0cm95IChzdHJlYW0sIGVycikge1xuICBpZiAoc3RyZWFtID09IG51bGwgfHwgIWlzU3RyZWFtKHN0cmVhbSkgfHwgaXNEZXN0cm95ZWQoc3RyZWFtKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0uZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc3RyZWFtKS5jb25zdHJ1Y3RvciA9PT0gSW5jb21pbmdNZXNzYWdlKSB7XG4gICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM4NTA1L2ZpbGVzXG4gICAgICBzdHJlYW0uc29ja2V0ID0gbnVsbFxuICAgIH1cblxuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKChzdHJlYW0sIGVycikgPT4ge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgIH0sIHN0cmVhbSwgZXJyKVxuICB9XG5cbiAgaWYgKHN0cmVhbS5kZXN0cm95ZWQgIT09IHRydWUpIHtcbiAgICBzdHJlYW1ba0Rlc3Ryb3llZF0gPSB0cnVlXG4gIH1cbn1cblxuY29uc3QgS0VFUEFMSVZFX1RJTUVPVVRfRVhQUiA9IC90aW1lb3V0PShcXGQrKS9cbmZ1bmN0aW9uIHBhcnNlS2VlcEFsaXZlVGltZW91dCAodmFsKSB7XG4gIGNvbnN0IG0gPSB2YWwudG9TdHJpbmcoKS5tYXRjaChLRUVQQUxJVkVfVElNRU9VVF9FWFBSKVxuICByZXR1cm4gbSA/IHBhcnNlSW50KG1bMV0sIDEwKSAqIDEwMDAgOiBudWxsXG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgaGVhZGVyIG5hbWUgYW5kIHJldHVybnMgaXRzIGxvd2VyY2FzZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSB2YWx1ZSBIZWFkZXIgbmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaGVhZGVyTmFtZVRvU3RyaW5nICh2YWx1ZSkge1xuICByZXR1cm4gaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRbdmFsdWVdIHx8IHZhbHVlLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gcGFyc2VIZWFkZXJzIChoZWFkZXJzLCBvYmogPSB7fSkge1xuICAvLyBGb3IgSDIgc3VwcG9ydFxuICBpZiAoIUFycmF5LmlzQXJyYXkoaGVhZGVycykpIHJldHVybiBoZWFkZXJzXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgY29uc3Qga2V5ID0gaGVhZGVyc1tpXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKClcbiAgICBsZXQgdmFsID0gb2JqW2tleV1cblxuICAgIGlmICghdmFsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzW2kgKyAxXSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBoZWFkZXJzW2kgKyAxXS5tYXAoeCA9PiB4LnRvU3RyaW5nKCd1dGY4JykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IGhlYWRlcnNbaSArIDFdLnRvU3RyaW5nKCd1dGY4JylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFsID0gW3ZhbF1cbiAgICAgICAgb2JqW2tleV0gPSB2YWxcbiAgICAgIH1cbiAgICAgIHZhbC5wdXNoKGhlYWRlcnNbaSArIDFdLnRvU3RyaW5nKCd1dGY4JykpXG4gICAgfVxuICB9XG5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzQ2NTI4XG4gIGlmICgnY29udGVudC1sZW5ndGgnIGluIG9iaiAmJiAnY29udGVudC1kaXNwb3NpdGlvbicgaW4gb2JqKSB7XG4gICAgb2JqWydjb250ZW50LWRpc3Bvc2l0aW9uJ10gPSBCdWZmZXIuZnJvbShvYmpbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSkudG9TdHJpbmcoJ2xhdGluMScpXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmZ1bmN0aW9uIHBhcnNlUmF3SGVhZGVycyAoaGVhZGVycykge1xuICBjb25zdCByZXQgPSBbXVxuICBsZXQgaGFzQ29udGVudExlbmd0aCA9IGZhbHNlXG4gIGxldCBjb250ZW50RGlzcG9zaXRpb25JZHggPSAtMVxuXG4gIGZvciAobGV0IG4gPSAwOyBuIDwgaGVhZGVycy5sZW5ndGg7IG4gKz0gMikge1xuICAgIGNvbnN0IGtleSA9IGhlYWRlcnNbbiArIDBdLnRvU3RyaW5nKClcbiAgICBjb25zdCB2YWwgPSBoZWFkZXJzW24gKyAxXS50b1N0cmluZygndXRmOCcpXG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMTQgJiYgKGtleSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJyB8fCBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJykpIHtcbiAgICAgIHJldC5wdXNoKGtleSwgdmFsKVxuICAgICAgaGFzQ29udGVudExlbmd0aCA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPT09IDE5ICYmIChrZXkgPT09ICdjb250ZW50LWRpc3Bvc2l0aW9uJyB8fCBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtZGlzcG9zaXRpb24nKSkge1xuICAgICAgY29udGVudERpc3Bvc2l0aW9uSWR4ID0gcmV0LnB1c2goa2V5LCB2YWwpIC0gMVxuICAgIH0gZWxzZSB7XG4gICAgICByZXQucHVzaChrZXksIHZhbClcbiAgICB9XG4gIH1cblxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvNDY1MjhcbiAgaWYgKGhhc0NvbnRlbnRMZW5ndGggJiYgY29udGVudERpc3Bvc2l0aW9uSWR4ICE9PSAtMSkge1xuICAgIHJldFtjb250ZW50RGlzcG9zaXRpb25JZHhdID0gQnVmZmVyLmZyb20ocmV0W2NvbnRlbnREaXNwb3NpdGlvbklkeF0pLnRvU3RyaW5nKCdsYXRpbjEnKVxuICB9XG5cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAoYnVmZmVyKSB7XG4gIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL21jb2xsaW5hL3VuZGljaS9wdWxsLzMxOVxuICByZXR1cm4gYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCBCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUhhbmRsZXIgKGhhbmRsZXIsIG1ldGhvZCwgdXBncmFkZSkge1xuICBpZiAoIWhhbmRsZXIgfHwgdHlwZW9mIGhhbmRsZXIgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoYW5kbGVyIG11c3QgYmUgYW4gb2JqZWN0JylcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5vbkNvbm5lY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25Db25uZWN0IG1ldGhvZCcpXG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIub25FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkVycm9yIG1ldGhvZCcpXG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIub25Cb2R5U2VudCAhPT0gJ2Z1bmN0aW9uJyAmJiBoYW5kbGVyLm9uQm9keVNlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkJvZHlTZW50IG1ldGhvZCcpXG4gIH1cblxuICBpZiAodXBncmFkZSB8fCBtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlci5vblVwZ3JhZGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvblVwZ3JhZGUgbWV0aG9kJylcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyLm9uSGVhZGVycyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSGVhZGVycyBtZXRob2QnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlci5vbkRhdGEgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkRhdGEgbWV0aG9kJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIub25Db21wbGV0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uQ29tcGxldGUgbWV0aG9kJylcbiAgICB9XG4gIH1cbn1cblxuLy8gQSBib2R5IGlzIGRpc3R1cmJlZCBpZiBpdCBoYXMgYmVlbiByZWFkIGZyb20gYW5kIGl0IGNhbm5vdFxuLy8gYmUgcmUtdXNlZCB3aXRob3V0IGxvc2luZyBzdGF0ZSBvciBkYXRhLlxuZnVuY3Rpb24gaXNEaXN0dXJiZWQgKGJvZHkpIHtcbiAgcmV0dXJuICEhKGJvZHkgJiYgKFxuICAgIHN0cmVhbS5pc0Rpc3R1cmJlZFxuICAgICAgPyBzdHJlYW0uaXNEaXN0dXJiZWQoYm9keSkgfHwgYm9keVtrQm9keVVzZWRdIC8vIFRPRE8gKGZpeCk6IFdoeSBpcyBib2R5W2tCb2R5VXNlZF0gbmVlZGVkP1xuICAgICAgOiBib2R5W2tCb2R5VXNlZF0gfHxcbiAgICAgICAgYm9keS5yZWFkYWJsZURpZFJlYWQgfHxcbiAgICAgICAgKGJvZHkuX3JlYWRhYmxlU3RhdGUgJiYgYm9keS5fcmVhZGFibGVTdGF0ZS5kYXRhRW1pdHRlZCkgfHxcbiAgICAgICAgaXNSZWFkYWJsZUFib3J0ZWQoYm9keSlcbiAgKSlcbn1cblxuZnVuY3Rpb24gaXNFcnJvcmVkIChib2R5KSB7XG4gIHJldHVybiAhIShib2R5ICYmIChcbiAgICBzdHJlYW0uaXNFcnJvcmVkXG4gICAgICA/IHN0cmVhbS5pc0Vycm9yZWQoYm9keSlcbiAgICAgIDogL3N0YXRlOiAnZXJyb3JlZCcvLnRlc3Qobm9kZVV0aWwuaW5zcGVjdChib2R5KVxuICAgICAgKSkpXG59XG5cbmZ1bmN0aW9uIGlzUmVhZGFibGUgKGJvZHkpIHtcbiAgcmV0dXJuICEhKGJvZHkgJiYgKFxuICAgIHN0cmVhbS5pc1JlYWRhYmxlXG4gICAgICA/IHN0cmVhbS5pc1JlYWRhYmxlKGJvZHkpXG4gICAgICA6IC9zdGF0ZTogJ3JlYWRhYmxlJy8udGVzdChub2RlVXRpbC5pbnNwZWN0KGJvZHkpXG4gICAgICApKSlcbn1cblxuZnVuY3Rpb24gZ2V0U29ja2V0SW5mbyAoc29ja2V0KSB7XG4gIHJldHVybiB7XG4gICAgbG9jYWxBZGRyZXNzOiBzb2NrZXQubG9jYWxBZGRyZXNzLFxuICAgIGxvY2FsUG9ydDogc29ja2V0LmxvY2FsUG9ydCxcbiAgICByZW1vdGVBZGRyZXNzOiBzb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICByZW1vdGVQb3J0OiBzb2NrZXQucmVtb3RlUG9ydCxcbiAgICByZW1vdGVGYW1pbHk6IHNvY2tldC5yZW1vdGVGYW1pbHksXG4gICAgdGltZW91dDogc29ja2V0LnRpbWVvdXQsXG4gICAgYnl0ZXNXcml0dGVuOiBzb2NrZXQuYnl0ZXNXcml0dGVuLFxuICAgIGJ5dGVzUmVhZDogc29ja2V0LmJ5dGVzUmVhZFxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uICogY29udmVydEl0ZXJhYmxlVG9CdWZmZXIgKGl0ZXJhYmxlKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCBCdWZmZXIuaXNCdWZmZXIoY2h1bmspID8gY2h1bmsgOiBCdWZmZXIuZnJvbShjaHVuaylcbiAgfVxufVxuXG5sZXQgUmVhZGFibGVTdHJlYW1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnJvbSAoaXRlcmFibGUpIHtcbiAgaWYgKCFSZWFkYWJsZVN0cmVhbSkge1xuICAgIFJlYWRhYmxlU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtL3dlYicpLlJlYWRhYmxlU3RyZWFtXG4gIH1cblxuICBpZiAoUmVhZGFibGVTdHJlYW0uZnJvbSkge1xuICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbS5mcm9tKGNvbnZlcnRJdGVyYWJsZVRvQnVmZmVyKGl0ZXJhYmxlKSlcbiAgfVxuXG4gIGxldCBpdGVyYXRvclxuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKFxuICAgIHtcbiAgICAgIGFzeW5jIHN0YXJ0ICgpIHtcbiAgICAgICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHB1bGwgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpXG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBidWYgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpID8gdmFsdWUgOiBCdWZmZXIuZnJvbSh2YWx1ZSlcbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kZXNpcmVkU2l6ZSA+IDBcbiAgICAgIH0sXG4gICAgICBhc3luYyBjYW5jZWwgKHJlYXNvbikge1xuICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKVxuICAgICAgfVxuICAgIH0sXG4gICAgMFxuICApXG59XG5cbi8vIFRoZSBjaHVuayBzaG91bGQgYmUgYSBGb3JtRGF0YSBpbnN0YW5jZSBhbmQgY29udGFpbnNcbi8vIGFsbCB0aGUgcmVxdWlyZWQgbWV0aG9kcy5cbmZ1bmN0aW9uIGlzRm9ybURhdGFMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIChcbiAgICBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiBvYmplY3QuYXBwZW5kID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdC5kZWxldGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LmdldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBvYmplY3QuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdC5oYXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LnNldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIG9iamVjdFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnXG4gIClcbn1cblxuZnVuY3Rpb24gdGhyb3dJZkFib3J0ZWQgKHNpZ25hbCkge1xuICBpZiAoIXNpZ25hbCkgeyByZXR1cm4gfVxuICBpZiAodHlwZW9mIHNpZ25hbC50aHJvd0lmQWJvcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNpZ25hbC50aHJvd0lmQWJvcnRlZCgpXG4gIH0gZWxzZSB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAvLyBET01FeGNlcHRpb24gbm90IGF2YWlsYWJsZSA8IHYxNy4wLjBcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCcpXG4gICAgICBlcnIubmFtZSA9ICdBYm9ydEVycm9yJ1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEFib3J0TGlzdGVuZXIgKHNpZ25hbCwgbGlzdGVuZXIpIHtcbiAgaWYgKCdhZGRFdmVudExpc3RlbmVyJyBpbiBzaWduYWwpIHtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pXG4gICAgcmV0dXJuICgpID0+IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyKVxuICB9XG4gIHNpZ25hbC5hZGRMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lcilcbiAgcmV0dXJuICgpID0+IHNpZ25hbC5yZW1vdmVMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lcilcbn1cblxuY29uc3QgaGFzVG9XZWxsRm9ybWVkID0gISFTdHJpbmcucHJvdG90eXBlLnRvV2VsbEZvcm1lZFxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqL1xuZnVuY3Rpb24gdG9VU1ZTdHJpbmcgKHZhbCkge1xuICBpZiAoaGFzVG9XZWxsRm9ybWVkKSB7XG4gICAgcmV0dXJuIGAke3ZhbH1gLnRvV2VsbEZvcm1lZCgpXG4gIH0gZWxzZSBpZiAobm9kZVV0aWwudG9VU1ZTdHJpbmcpIHtcbiAgICByZXR1cm4gbm9kZVV0aWwudG9VU1ZTdHJpbmcodmFsKVxuICB9XG5cbiAgcmV0dXJuIGAke3ZhbH1gXG59XG5cbi8vIFBhcnNlZCBhY2NvcmRpbmdseSB0byBSRkMgOTExMFxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAjZmllbGQuY29udGVudC1yYW5nZVxuZnVuY3Rpb24gcGFyc2VSYW5nZUhlYWRlciAocmFuZ2UpIHtcbiAgaWYgKHJhbmdlID09IG51bGwgfHwgcmFuZ2UgPT09ICcnKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiBudWxsLCBzaXplOiBudWxsIH1cblxuICBjb25zdCBtID0gcmFuZ2UgPyByYW5nZS5tYXRjaCgvXmJ5dGVzIChcXGQrKS0oXFxkKylcXC8oXFxkKyk/JC8pIDogbnVsbFxuICByZXR1cm4gbVxuICAgID8ge1xuICAgICAgICBzdGFydDogcGFyc2VJbnQobVsxXSksXG4gICAgICAgIGVuZDogbVsyXSA/IHBhcnNlSW50KG1bMl0pIDogbnVsbCxcbiAgICAgICAgc2l6ZTogbVszXSA/IHBhcnNlSW50KG1bM10pIDogbnVsbFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuXG5jb25zdCBrRW51bWVyYWJsZVByb3BlcnR5ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxua0VudW1lcmFibGVQcm9wZXJ0eS5lbnVtZXJhYmxlID0gdHJ1ZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbm9wLFxuICBpc0Rpc3R1cmJlZCxcbiAgaXNFcnJvcmVkLFxuICBpc1JlYWRhYmxlLFxuICB0b1VTVlN0cmluZyxcbiAgaXNSZWFkYWJsZUFib3J0ZWQsXG4gIGlzQmxvYkxpa2UsXG4gIHBhcnNlT3JpZ2luLFxuICBwYXJzZVVSTCxcbiAgZ2V0U2VydmVyTmFtZSxcbiAgaXNTdHJlYW0sXG4gIGlzSXRlcmFibGUsXG4gIGlzQXN5bmNJdGVyYWJsZSxcbiAgaXNEZXN0cm95ZWQsXG4gIGhlYWRlck5hbWVUb1N0cmluZyxcbiAgcGFyc2VSYXdIZWFkZXJzLFxuICBwYXJzZUhlYWRlcnMsXG4gIHBhcnNlS2VlcEFsaXZlVGltZW91dCxcbiAgZGVzdHJveSxcbiAgYm9keUxlbmd0aCxcbiAgZGVlcENsb25lLFxuICBSZWFkYWJsZVN0cmVhbUZyb20sXG4gIGlzQnVmZmVyLFxuICB2YWxpZGF0ZUhhbmRsZXIsXG4gIGdldFNvY2tldEluZm8sXG4gIGlzRm9ybURhdGFMaWtlLFxuICBidWlsZFVSTCxcbiAgdGhyb3dJZkFib3J0ZWQsXG4gIGFkZEFib3J0TGlzdGVuZXIsXG4gIHBhcnNlUmFuZ2VIZWFkZXIsXG4gIG5vZGVNYWpvcixcbiAgbm9kZU1pbm9yLFxuICBub2RlSGFzQXV0b1NlbGVjdEZhbWlseTogbm9kZU1ham9yID4gMTggfHwgKG5vZGVNYWpvciA9PT0gMTggJiYgbm9kZU1pbm9yID49IDEzKSxcbiAgc2FmZUhUVFBNZXRob2RzOiBbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnVFJBQ0UnXVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubGV0IGZhc3ROb3cgPSBEYXRlLm5vdygpXG5sZXQgZmFzdE5vd1RpbWVvdXRcblxuY29uc3QgZmFzdFRpbWVycyA9IFtdXG5cbmZ1bmN0aW9uIG9uVGltZW91dCAoKSB7XG4gIGZhc3ROb3cgPSBEYXRlLm5vdygpXG5cbiAgbGV0IGxlbiA9IGZhc3RUaW1lcnMubGVuZ3RoXG4gIGxldCBpZHggPSAwXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBjb25zdCB0aW1lciA9IGZhc3RUaW1lcnNbaWR4XVxuXG4gICAgaWYgKHRpbWVyLnN0YXRlID09PSAwKSB7XG4gICAgICB0aW1lci5zdGF0ZSA9IGZhc3ROb3cgKyB0aW1lci5kZWxheVxuICAgIH0gZWxzZSBpZiAodGltZXIuc3RhdGUgPiAwICYmIGZhc3ROb3cgPj0gdGltZXIuc3RhdGUpIHtcbiAgICAgIHRpbWVyLnN0YXRlID0gLTFcbiAgICAgIHRpbWVyLmNhbGxiYWNrKHRpbWVyLm9wYXF1ZSlcbiAgICB9XG5cbiAgICBpZiAodGltZXIuc3RhdGUgPT09IC0xKSB7XG4gICAgICB0aW1lci5zdGF0ZSA9IC0yXG4gICAgICBpZiAoaWR4ICE9PSBsZW4gLSAxKSB7XG4gICAgICAgIGZhc3RUaW1lcnNbaWR4XSA9IGZhc3RUaW1lcnMucG9wKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhc3RUaW1lcnMucG9wKClcbiAgICAgIH1cbiAgICAgIGxlbiAtPSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIGlkeCArPSAxXG4gICAgfVxuICB9XG5cbiAgaWYgKGZhc3RUaW1lcnMubGVuZ3RoID4gMCkge1xuICAgIHJlZnJlc2hUaW1lb3V0KClcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoVGltZW91dCAoKSB7XG4gIGlmIChmYXN0Tm93VGltZW91dCAmJiBmYXN0Tm93VGltZW91dC5yZWZyZXNoKSB7XG4gICAgZmFzdE5vd1RpbWVvdXQucmVmcmVzaCgpXG4gIH0gZWxzZSB7XG4gICAgY2xlYXJUaW1lb3V0KGZhc3ROb3dUaW1lb3V0KVxuICAgIGZhc3ROb3dUaW1lb3V0ID0gc2V0VGltZW91dChvblRpbWVvdXQsIDFlMylcbiAgICBpZiAoZmFzdE5vd1RpbWVvdXQudW5yZWYpIHtcbiAgICAgIGZhc3ROb3dUaW1lb3V0LnVucmVmKClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgVGltZW91dCB7XG4gIGNvbnN0cnVjdG9yIChjYWxsYmFjaywgZGVsYXksIG9wYXF1ZSkge1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuZGVsYXkgPSBkZWxheVxuICAgIHRoaXMub3BhcXVlID0gb3BhcXVlXG5cbiAgICAvLyAgLTIgbm90IGluIHRpbWVyIGxpc3RcbiAgICAvLyAgLTEgaW4gdGltZXIgbGlzdCBidXQgaW5hY3RpdmVcbiAgICAvLyAgIDAgaW4gdGltZXIgbGlzdCB3YWl0aW5nIGZvciB0aW1lXG4gICAgLy8gPiAwIGluIHRpbWVyIGxpc3Qgd2FpdGluZyBmb3IgdGltZSB0byBleHBpcmVcbiAgICB0aGlzLnN0YXRlID0gLTJcblxuICAgIHRoaXMucmVmcmVzaCgpXG4gIH1cblxuICByZWZyZXNoICgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gLTIpIHtcbiAgICAgIGZhc3RUaW1lcnMucHVzaCh0aGlzKVxuICAgICAgaWYgKCFmYXN0Tm93VGltZW91dCB8fCBmYXN0VGltZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZWZyZXNoVGltZW91dCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IDBcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aGlzLnN0YXRlID0gLTFcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0VGltZW91dCAoY2FsbGJhY2ssIGRlbGF5LCBvcGFxdWUpIHtcbiAgICByZXR1cm4gZGVsYXkgPCAxZTNcbiAgICAgID8gc2V0VGltZW91dChjYWxsYmFjaywgZGVsYXksIG9wYXF1ZSlcbiAgICAgIDogbmV3IFRpbWVvdXQoY2FsbGJhY2ssIGRlbGF5LCBvcGFxdWUpXG4gIH0sXG4gIGNsZWFyVGltZW91dCAodGltZW91dCkge1xuICAgIGlmICh0aW1lb3V0IGluc3RhbmNlb2YgVGltZW91dCkge1xuICAgICAgdGltZW91dC5jbGVhcigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgIH1cbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLyoqXG4gKiBDb3B5cmlnaHQgQnJpYW4gV2hpdGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXNjZGV4L3N0cmVhbXNlYXJjaFxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4gKiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4gKiBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4gKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4gKiBJTiBUSEUgU09GVFdBUkUuXG4gKlxuICogQmFzZWQgaGVhdmlseSBvbiB0aGUgU3RyZWFtaW5nIEJveWVyLU1vb3JlLUhvcnNwb29sIEMrKyBpbXBsZW1lbnRhdGlvblxuICogYnkgSG9uZ2xpIExhaSBhdDogaHR0cHM6Ly9naXRodWIuY29tL0Zvb0JhcldpZGdldC9ib3llci1tb29yZS1ob3JzcG9vbFxuICovXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdub2RlOmV2ZW50cycpLkV2ZW50RW1pdHRlclxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdub2RlOnV0aWwnKS5pbmhlcml0c1xuXG5mdW5jdGlvbiBTQk1IIChuZWVkbGUpIHtcbiAgaWYgKHR5cGVvZiBuZWVkbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgbmVlZGxlID0gQnVmZmVyLmZyb20obmVlZGxlKVxuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIobmVlZGxlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBuZWVkbGUgaGFzIHRvIGJlIGEgU3RyaW5nIG9yIGEgQnVmZmVyLicpXG4gIH1cblxuICBjb25zdCBuZWVkbGVMZW5ndGggPSBuZWVkbGUubGVuZ3RoXG5cbiAgaWYgKG5lZWRsZUxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG5lZWRsZSBjYW5ub3QgYmUgYW4gZW1wdHkgU3RyaW5nL0J1ZmZlci4nKVxuICB9XG5cbiAgaWYgKG5lZWRsZUxlbmd0aCA+IDI1Nikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG5lZWRsZSBjYW5ub3QgaGF2ZSBhIGxlbmd0aCBiaWdnZXIgdGhhbiAyNTYuJylcbiAgfVxuXG4gIHRoaXMubWF4TWF0Y2hlcyA9IEluZmluaXR5XG4gIHRoaXMubWF0Y2hlcyA9IDBcblxuICB0aGlzLl9vY2MgPSBuZXcgQXJyYXkoMjU2KVxuICAgIC5maWxsKG5lZWRsZUxlbmd0aCkgLy8gSW5pdGlhbGl6ZSBvY2N1cnJlbmNlIHRhYmxlLlxuICB0aGlzLl9sb29rYmVoaW5kX3NpemUgPSAwXG4gIHRoaXMuX25lZWRsZSA9IG5lZWRsZVxuICB0aGlzLl9idWZwb3MgPSAwXG5cbiAgdGhpcy5fbG9va2JlaGluZCA9IEJ1ZmZlci5hbGxvYyhuZWVkbGVMZW5ndGgpXG5cbiAgLy8gUG9wdWxhdGUgb2NjdXJyZW5jZSB0YWJsZSB3aXRoIGFuYWx5c2lzIG9mIHRoZSBuZWVkbGUsXG4gIC8vIGlnbm9yaW5nIGxhc3QgbGV0dGVyLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5lZWRsZUxlbmd0aCAtIDE7ICsraSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXZhclxuICAgIHRoaXMuX29jY1tuZWVkbGVbaV1dID0gbmVlZGxlTGVuZ3RoIC0gMSAtIGlcbiAgfVxufVxuaW5oZXJpdHMoU0JNSCwgRXZlbnRFbWl0dGVyKVxuXG5TQk1ILnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fbG9va2JlaGluZF9zaXplID0gMFxuICB0aGlzLm1hdGNoZXMgPSAwXG4gIHRoaXMuX2J1ZnBvcyA9IDBcbn1cblxuU0JNSC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgcG9zKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssICdiaW5hcnknKVxuICB9XG4gIGNvbnN0IGNobGVuID0gY2h1bmsubGVuZ3RoXG4gIHRoaXMuX2J1ZnBvcyA9IHBvcyB8fCAwXG4gIGxldCByXG4gIHdoaWxlIChyICE9PSBjaGxlbiAmJiB0aGlzLm1hdGNoZXMgPCB0aGlzLm1heE1hdGNoZXMpIHsgciA9IHRoaXMuX3NibWhfZmVlZChjaHVuaykgfVxuICByZXR1cm4gclxufVxuXG5TQk1ILnByb3RvdHlwZS5fc2JtaF9mZWVkID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGhcbiAgY29uc3QgbmVlZGxlID0gdGhpcy5fbmVlZGxlXG4gIGNvbnN0IG5lZWRsZUxlbmd0aCA9IG5lZWRsZS5sZW5ndGhcbiAgY29uc3QgbGFzdE5lZWRsZUNoYXIgPSBuZWVkbGVbbmVlZGxlTGVuZ3RoIC0gMV1cblxuICAvLyBQb3NpdGl2ZTogcG9pbnRzIHRvIGEgcG9zaXRpb24gaW4gYGRhdGFgXG4gIC8vICAgICAgICAgICBwb3MgPT0gMyBwb2ludHMgdG8gZGF0YVszXVxuICAvLyBOZWdhdGl2ZTogcG9pbnRzIHRvIGEgcG9zaXRpb24gaW4gdGhlIGxvb2tiZWhpbmQgYnVmZmVyXG4gIC8vICAgICAgICAgICBwb3MgPT0gLTIgcG9pbnRzIHRvIGxvb2tiZWhpbmRbbG9va2JlaGluZF9zaXplIC0gMl1cbiAgbGV0IHBvcyA9IC10aGlzLl9sb29rYmVoaW5kX3NpemVcbiAgbGV0IGNoXG5cbiAgaWYgKHBvcyA8IDApIHtcbiAgICAvLyBMb29rYmVoaW5kIGJ1ZmZlciBpcyBub3QgZW1wdHkuIFBlcmZvcm0gQm95ZXItTW9vcmUtSG9yc3Bvb2xcbiAgICAvLyBzZWFyY2ggd2l0aCBjaGFyYWN0ZXIgbG9va3VwIGNvZGUgdGhhdCBjb25zaWRlcnMgYm90aCB0aGVcbiAgICAvLyBsb29rYmVoaW5kIGJ1ZmZlciBhbmQgdGhlIGN1cnJlbnQgcm91bmQncyBoYXlzdGFjayBkYXRhLlxuICAgIC8vXG4gICAgLy8gTG9vcCB1bnRpbFxuICAgIC8vICAgdGhlcmUgaXMgYSBtYXRjaC5cbiAgICAvLyBvciB1bnRpbFxuICAgIC8vICAgd2UndmUgbW92ZWQgcGFzdCB0aGUgcG9zaXRpb24gdGhhdCByZXF1aXJlcyB0aGVcbiAgICAvLyAgIGxvb2tiZWhpbmQgYnVmZmVyLiBJbiB0aGlzIGNhc2Ugd2Ugc3dpdGNoIHRvIHRoZVxuICAgIC8vICAgb3B0aW1pemVkIGxvb3AuXG4gICAgLy8gb3IgdW50aWxcbiAgICAvLyAgIHRoZSBjaGFyYWN0ZXIgdG8gbG9vayBhdCBsaWVzIG91dHNpZGUgdGhlIGhheXN0YWNrLlxuICAgIHdoaWxlIChwb3MgPCAwICYmIHBvcyA8PSBsZW4gLSBuZWVkbGVMZW5ndGgpIHtcbiAgICAgIGNoID0gdGhpcy5fc2JtaF9sb29rdXBfY2hhcihkYXRhLCBwb3MgKyBuZWVkbGVMZW5ndGggLSAxKVxuXG4gICAgICBpZiAoXG4gICAgICAgIGNoID09PSBsYXN0TmVlZGxlQ2hhciAmJlxuICAgICAgICB0aGlzLl9zYm1oX21lbWNtcChkYXRhLCBwb3MsIG5lZWRsZUxlbmd0aCAtIDEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fbG9va2JlaGluZF9zaXplID0gMFxuICAgICAgICArK3RoaXMubWF0Y2hlc1xuICAgICAgICB0aGlzLmVtaXQoJ2luZm8nLCB0cnVlKVxuXG4gICAgICAgIHJldHVybiAodGhpcy5fYnVmcG9zID0gcG9zICsgbmVlZGxlTGVuZ3RoKVxuICAgICAgfVxuICAgICAgcG9zICs9IHRoaXMuX29jY1tjaF1cbiAgICB9XG5cbiAgICAvLyBObyBtYXRjaC5cblxuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICAvLyBUaGVyZSdzIHRvbyBmZXcgZGF0YSBmb3IgQm95ZXItTW9vcmUtSG9yc3Bvb2wgdG8gcnVuLFxuICAgICAgLy8gc28gbGV0J3MgdXNlIGEgZGlmZmVyZW50IGFsZ29yaXRobSB0byBza2lwIGFzIG11Y2ggYXNcbiAgICAgIC8vIHdlIGNhbi5cbiAgICAgIC8vIEZvcndhcmQgcG9zIHVudGlsXG4gICAgICAvLyAgIHRoZSB0cmFpbGluZyBwYXJ0IG9mIGxvb2tiZWhpbmQgKyBkYXRhXG4gICAgICAvLyAgIGxvb2tzIGxpa2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmVlZGxlXG4gICAgICAvLyBvciB1bnRpbFxuICAgICAgLy8gICBwb3MgPT0gMFxuICAgICAgd2hpbGUgKHBvcyA8IDAgJiYgIXRoaXMuX3NibWhfbWVtY21wKGRhdGEsIHBvcywgbGVuIC0gcG9zKSkgeyArK3BvcyB9XG4gICAgfVxuXG4gICAgaWYgKHBvcyA+PSAwKSB7XG4gICAgICAvLyBEaXNjYXJkIGxvb2tiZWhpbmQgYnVmZmVyLlxuICAgICAgdGhpcy5lbWl0KCdpbmZvJywgZmFsc2UsIHRoaXMuX2xvb2tiZWhpbmQsIDAsIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSlcbiAgICAgIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSA9IDBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3V0IG9mZiBwYXJ0IG9mIHRoZSBsb29rYmVoaW5kIGJ1ZmZlciB0aGF0IGhhc1xuICAgICAgLy8gYmVlbiBwcm9jZXNzZWQgYW5kIGFwcGVuZCB0aGUgZW50aXJlIGhheXN0YWNrXG4gICAgICAvLyBpbnRvIGl0LlxuICAgICAgY29uc3QgYnl0ZXNUb0N1dE9mZiA9IHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSArIHBvc1xuICAgICAgaWYgKGJ5dGVzVG9DdXRPZmYgPiAwKSB7XG4gICAgICAgIC8vIFRoZSBjdXQgb2ZmIGRhdGEgaXMgZ3VhcmFudGVlZCBub3QgdG8gY29udGFpbiB0aGUgbmVlZGxlLlxuICAgICAgICB0aGlzLmVtaXQoJ2luZm8nLCBmYWxzZSwgdGhpcy5fbG9va2JlaGluZCwgMCwgYnl0ZXNUb0N1dE9mZilcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbG9va2JlaGluZC5jb3B5KHRoaXMuX2xvb2tiZWhpbmQsIDAsIGJ5dGVzVG9DdXRPZmYsXG4gICAgICAgIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSAtIGJ5dGVzVG9DdXRPZmYpXG4gICAgICB0aGlzLl9sb29rYmVoaW5kX3NpemUgLT0gYnl0ZXNUb0N1dE9mZlxuXG4gICAgICBkYXRhLmNvcHkodGhpcy5fbG9va2JlaGluZCwgdGhpcy5fbG9va2JlaGluZF9zaXplKVxuICAgICAgdGhpcy5fbG9va2JlaGluZF9zaXplICs9IGxlblxuXG4gICAgICB0aGlzLl9idWZwb3MgPSBsZW5cbiAgICAgIHJldHVybiBsZW5cbiAgICB9XG4gIH1cblxuICBwb3MgKz0gKHBvcyA+PSAwKSAqIHRoaXMuX2J1ZnBvc1xuXG4gIC8vIExvb2tiZWhpbmQgYnVmZmVyIGlzIG5vdyBlbXB0eS4gV2Ugb25seSBuZWVkIHRvIGNoZWNrIGlmIHRoZVxuICAvLyBuZWVkbGUgaXMgaW4gdGhlIGhheXN0YWNrLlxuICBpZiAoZGF0YS5pbmRleE9mKG5lZWRsZSwgcG9zKSAhPT0gLTEpIHtcbiAgICBwb3MgPSBkYXRhLmluZGV4T2YobmVlZGxlLCBwb3MpXG4gICAgKyt0aGlzLm1hdGNoZXNcbiAgICBpZiAocG9zID4gMCkgeyB0aGlzLmVtaXQoJ2luZm8nLCB0cnVlLCBkYXRhLCB0aGlzLl9idWZwb3MsIHBvcykgfSBlbHNlIHsgdGhpcy5lbWl0KCdpbmZvJywgdHJ1ZSkgfVxuXG4gICAgcmV0dXJuICh0aGlzLl9idWZwb3MgPSBwb3MgKyBuZWVkbGVMZW5ndGgpXG4gIH0gZWxzZSB7XG4gICAgcG9zID0gbGVuIC0gbmVlZGxlTGVuZ3RoXG4gIH1cblxuICAvLyBUaGVyZSB3YXMgbm8gbWF0Y2guIElmIHRoZXJlJ3MgdHJhaWxpbmcgaGF5c3RhY2sgZGF0YSB0aGF0IHdlIGNhbm5vdFxuICAvLyBtYXRjaCB5ZXQgdXNpbmcgdGhlIEJveWVyLU1vb3JlLUhvcnNwb29sIGFsZ29yaXRobSAoYmVjYXVzZSB0aGUgdHJhaWxpbmdcbiAgLy8gZGF0YSBpcyBsZXNzIHRoYW4gdGhlIG5lZWRsZSBzaXplKSB0aGVuIG1hdGNoIHVzaW5nIGEgbW9kaWZpZWRcbiAgLy8gYWxnb3JpdGhtIHRoYXQgc3RhcnRzIG1hdGNoaW5nIGZyb20gdGhlIGJlZ2lubmluZyBpbnN0ZWFkIG9mIHRoZSBlbmQuXG4gIC8vIFdoYXRldmVyIHRyYWlsaW5nIGRhdGEgaXMgbGVmdCBhZnRlciBydW5uaW5nIHRoaXMgYWxnb3JpdGhtIGlzIGFkZGVkIHRvXG4gIC8vIHRoZSBsb29rYmVoaW5kIGJ1ZmZlci5cbiAgd2hpbGUgKFxuICAgIHBvcyA8IGxlbiAmJlxuICAgIChcbiAgICAgIGRhdGFbcG9zXSAhPT0gbmVlZGxlWzBdIHx8XG4gICAgICAoXG4gICAgICAgIChCdWZmZXIuY29tcGFyZShcbiAgICAgICAgICBkYXRhLnN1YmFycmF5KHBvcywgcG9zICsgbGVuIC0gcG9zKSxcbiAgICAgICAgICBuZWVkbGUuc3ViYXJyYXkoMCwgbGVuIC0gcG9zKVxuICAgICAgICApICE9PSAwKVxuICAgICAgKVxuICAgIClcbiAgKSB7XG4gICAgKytwb3NcbiAgfVxuICBpZiAocG9zIDwgbGVuKSB7XG4gICAgZGF0YS5jb3B5KHRoaXMuX2xvb2tiZWhpbmQsIDAsIHBvcywgcG9zICsgKGxlbiAtIHBvcykpXG4gICAgdGhpcy5fbG9va2JlaGluZF9zaXplID0gbGVuIC0gcG9zXG4gIH1cblxuICAvLyBFdmVyeXRoaW5nIHVudGlsIHBvcyBpcyBndWFyYW50ZWVkIG5vdCB0byBjb250YWluIG5lZWRsZSBkYXRhLlxuICBpZiAocG9zID4gMCkgeyB0aGlzLmVtaXQoJ2luZm8nLCBmYWxzZSwgZGF0YSwgdGhpcy5fYnVmcG9zLCBwb3MgPCBsZW4gPyBwb3MgOiBsZW4pIH1cblxuICB0aGlzLl9idWZwb3MgPSBsZW5cbiAgcmV0dXJuIGxlblxufVxuXG5TQk1ILnByb3RvdHlwZS5fc2JtaF9sb29rdXBfY2hhciA9IGZ1bmN0aW9uIChkYXRhLCBwb3MpIHtcbiAgcmV0dXJuIChwb3MgPCAwKVxuICAgID8gdGhpcy5fbG9va2JlaGluZFt0aGlzLl9sb29rYmVoaW5kX3NpemUgKyBwb3NdXG4gICAgOiBkYXRhW3Bvc11cbn1cblxuU0JNSC5wcm90b3R5cGUuX3NibWhfbWVtY21wID0gZnVuY3Rpb24gKGRhdGEsIHBvcywgbGVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby12YXJcbiAgICBpZiAodGhpcy5fc2JtaF9sb29rdXBfY2hhcihkYXRhLCBwb3MgKyBpKSAhPT0gdGhpcy5fbmVlZGxlW2ldKSB7IHJldHVybiBmYWxzZSB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTQk1IXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5jb25zdCBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJykuUmVhZGFibGVcblxuZnVuY3Rpb24gUGFydFN0cmVhbSAob3B0cykge1xuICBSZWFkYWJsZVN0cmVhbS5jYWxsKHRoaXMsIG9wdHMpXG59XG5pbmhlcml0cyhQYXJ0U3RyZWFtLCBSZWFkYWJsZVN0cmVhbSlcblxuUGFydFN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge31cblxubW9kdWxlLmV4cG9ydHMgPSBQYXJ0U3RyZWFtXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldExpbWl0IChsaW1pdHMsIG5hbWUsIGRlZmF1bHRMaW1pdCkge1xuICBpZiAoXG4gICAgIWxpbWl0cyB8fFxuICAgIGxpbWl0c1tuYW1lXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgbGltaXRzW25hbWVdID09PSBudWxsXG4gICkgeyByZXR1cm4gZGVmYXVsdExpbWl0IH1cblxuICBpZiAoXG4gICAgdHlwZW9mIGxpbWl0c1tuYW1lXSAhPT0gJ251bWJlcicgfHxcbiAgICBpc05hTihsaW1pdHNbbmFtZV0pXG4gICkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW1pdCAnICsgbmFtZSArICcgaXMgbm90IGEgdmFsaWQgbnVtYmVyJykgfVxuXG4gIHJldHVybiBsaW1pdHNbbmFtZV1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ25vZGU6ZXZlbnRzJykuRXZlbnRFbWl0dGVyXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5jb25zdCBnZXRMaW1pdCA9IHJlcXVpcmUoJy4uLy4uLy4uL2xpYi91dGlscy9nZXRMaW1pdCcpXG5cbmNvbnN0IFN0cmVhbVNlYXJjaCA9IHJlcXVpcmUoJy4uLy4uL3N0cmVhbXNlYXJjaC9zYm1oJylcblxuY29uc3QgQl9EQ1JMRiA9IEJ1ZmZlci5mcm9tKCdcXHJcXG5cXHJcXG4nKVxuY29uc3QgUkVfQ1JMRiA9IC9cXHJcXG4vZ1xuY29uc3QgUkVfSERSID0gL14oW146XSspOlsgXFx0XT8oW1xceDAwLVxceEZGXSspPyQvIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuXG5mdW5jdGlvbiBIZWFkZXJQYXJzZXIgKGNmZykge1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKVxuXG4gIGNmZyA9IGNmZyB8fCB7fVxuICBjb25zdCBzZWxmID0gdGhpc1xuICB0aGlzLm5yZWFkID0gMFxuICB0aGlzLm1heGVkID0gZmFsc2VcbiAgdGhpcy5ucGFpcnMgPSAwXG4gIHRoaXMubWF4SGVhZGVyUGFpcnMgPSBnZXRMaW1pdChjZmcsICdtYXhIZWFkZXJQYWlycycsIDIwMDApXG4gIHRoaXMubWF4SGVhZGVyU2l6ZSA9IGdldExpbWl0KGNmZywgJ21heEhlYWRlclNpemUnLCA4MCAqIDEwMjQpXG4gIHRoaXMuYnVmZmVyID0gJydcbiAgdGhpcy5oZWFkZXIgPSB7fVxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2VcbiAgdGhpcy5zcyA9IG5ldyBTdHJlYW1TZWFyY2goQl9EQ1JMRilcbiAgdGhpcy5zcy5vbignaW5mbycsIGZ1bmN0aW9uIChpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgaWYgKGRhdGEgJiYgIXNlbGYubWF4ZWQpIHtcbiAgICAgIGlmIChzZWxmLm5yZWFkICsgZW5kIC0gc3RhcnQgPj0gc2VsZi5tYXhIZWFkZXJTaXplKSB7XG4gICAgICAgIGVuZCA9IHNlbGYubWF4SGVhZGVyU2l6ZSAtIHNlbGYubnJlYWQgKyBzdGFydFxuICAgICAgICBzZWxmLm5yZWFkID0gc2VsZi5tYXhIZWFkZXJTaXplXG4gICAgICAgIHNlbGYubWF4ZWQgPSB0cnVlXG4gICAgICB9IGVsc2UgeyBzZWxmLm5yZWFkICs9IChlbmQgLSBzdGFydCkgfVxuXG4gICAgICBzZWxmLmJ1ZmZlciArPSBkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBzdGFydCwgZW5kKVxuICAgIH1cbiAgICBpZiAoaXNNYXRjaCkgeyBzZWxmLl9maW5pc2goKSB9XG4gIH0pXG59XG5pbmhlcml0cyhIZWFkZXJQYXJzZXIsIEV2ZW50RW1pdHRlcilcblxuSGVhZGVyUGFyc2VyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgY29uc3QgciA9IHRoaXMuc3MucHVzaChkYXRhKVxuICBpZiAodGhpcy5maW5pc2hlZCkgeyByZXR1cm4gciB9XG59XG5cbkhlYWRlclBhcnNlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZVxuICB0aGlzLmJ1ZmZlciA9ICcnXG4gIHRoaXMuaGVhZGVyID0ge31cbiAgdGhpcy5zcy5yZXNldCgpXG59XG5cbkhlYWRlclBhcnNlci5wcm90b3R5cGUuX2ZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYnVmZmVyKSB7IHRoaXMuX3BhcnNlSGVhZGVyKCkgfVxuICB0aGlzLnNzLm1hdGNoZXMgPSB0aGlzLnNzLm1heE1hdGNoZXNcbiAgY29uc3QgaGVhZGVyID0gdGhpcy5oZWFkZXJcbiAgdGhpcy5oZWFkZXIgPSB7fVxuICB0aGlzLmJ1ZmZlciA9ICcnXG4gIHRoaXMuZmluaXNoZWQgPSB0cnVlXG4gIHRoaXMubnJlYWQgPSB0aGlzLm5wYWlycyA9IDBcbiAgdGhpcy5tYXhlZCA9IGZhbHNlXG4gIHRoaXMuZW1pdCgnaGVhZGVyJywgaGVhZGVyKVxufVxuXG5IZWFkZXJQYXJzZXIucHJvdG90eXBlLl9wYXJzZUhlYWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubnBhaXJzID09PSB0aGlzLm1heEhlYWRlclBhaXJzKSB7IHJldHVybiB9XG5cbiAgY29uc3QgbGluZXMgPSB0aGlzLmJ1ZmZlci5zcGxpdChSRV9DUkxGKVxuICBjb25zdCBsZW4gPSBsaW5lcy5sZW5ndGhcbiAgbGV0IG0sIGhcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdmFyXG4gICAgaWYgKGxpbmVzW2ldLmxlbmd0aCA9PT0gMCkgeyBjb250aW51ZSB9XG4gICAgaWYgKGxpbmVzW2ldWzBdID09PSAnXFx0JyB8fCBsaW5lc1tpXVswXSA9PT0gJyAnKSB7XG4gICAgICAvLyBmb2xkZWQgaGVhZGVyIGNvbnRlbnRcbiAgICAgIC8vIFJGQzI4MjIgc2F5cyB0byBqdXN0IHJlbW92ZSB0aGUgQ1JMRiBhbmQgbm90IHRoZSB3aGl0ZXNwYWNlIGZvbGxvd2luZ1xuICAgICAgLy8gaXQsIHNvIHdlIGZvbGxvdyB0aGUgUkZDIGFuZCBpbmNsdWRlIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UgLi4uXG4gICAgICBpZiAoaCkge1xuICAgICAgICB0aGlzLmhlYWRlcltoXVt0aGlzLmhlYWRlcltoXS5sZW5ndGggLSAxXSArPSBsaW5lc1tpXVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBvc0NvbG9uID0gbGluZXNbaV0uaW5kZXhPZignOicpXG4gICAgaWYgKFxuICAgICAgcG9zQ29sb24gPT09IC0xIHx8XG4gICAgICBwb3NDb2xvbiA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIG0gPSBSRV9IRFIuZXhlYyhsaW5lc1tpXSlcbiAgICBoID0gbVsxXS50b0xvd2VyQ2FzZSgpXG4gICAgdGhpcy5oZWFkZXJbaF0gPSB0aGlzLmhlYWRlcltoXSB8fCBbXVxuICAgIHRoaXMuaGVhZGVyW2hdLnB1c2goKG1bMl0gfHwgJycpKVxuICAgIGlmICgrK3RoaXMubnBhaXJzID09PSB0aGlzLm1heEhlYWRlclBhaXJzKSB7IGJyZWFrIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhlYWRlclBhcnNlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgV3JpdGFibGVTdHJlYW0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpLldyaXRhYmxlXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5cbmNvbnN0IFN0cmVhbVNlYXJjaCA9IHJlcXVpcmUoJy4uLy4uL3N0cmVhbXNlYXJjaC9zYm1oJylcblxuY29uc3QgUGFydFN0cmVhbSA9IHJlcXVpcmUoJy4vUGFydFN0cmVhbScpXG5jb25zdCBIZWFkZXJQYXJzZXIgPSByZXF1aXJlKCcuL0hlYWRlclBhcnNlcicpXG5cbmNvbnN0IERBU0ggPSA0NVxuY29uc3QgQl9PTkVEQVNIID0gQnVmZmVyLmZyb20oJy0nKVxuY29uc3QgQl9DUkxGID0gQnVmZmVyLmZyb20oJ1xcclxcbicpXG5jb25zdCBFTVBUWV9GTiA9IGZ1bmN0aW9uICgpIHt9XG5cbmZ1bmN0aW9uIERpY2VyIChjZmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERpY2VyKSkgeyByZXR1cm4gbmV3IERpY2VyKGNmZykgfVxuICBXcml0YWJsZVN0cmVhbS5jYWxsKHRoaXMsIGNmZylcblxuICBpZiAoIWNmZyB8fCAoIWNmZy5oZWFkZXJGaXJzdCAmJiB0eXBlb2YgY2ZnLmJvdW5kYXJ5ICE9PSAnc3RyaW5nJykpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQm91bmRhcnkgcmVxdWlyZWQnKSB9XG5cbiAgaWYgKHR5cGVvZiBjZmcuYm91bmRhcnkgPT09ICdzdHJpbmcnKSB7IHRoaXMuc2V0Qm91bmRhcnkoY2ZnLmJvdW5kYXJ5KSB9IGVsc2UgeyB0aGlzLl9icGFyc2VyID0gdW5kZWZpbmVkIH1cblxuICB0aGlzLl9oZWFkZXJGaXJzdCA9IGNmZy5oZWFkZXJGaXJzdFxuXG4gIHRoaXMuX2Rhc2hlcyA9IDBcbiAgdGhpcy5fcGFydHMgPSAwXG4gIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2VcbiAgdGhpcy5fcmVhbEZpbmlzaCA9IGZhbHNlXG4gIHRoaXMuX2lzUHJlYW1ibGUgPSB0cnVlXG4gIHRoaXMuX2p1c3RNYXRjaGVkID0gZmFsc2VcbiAgdGhpcy5fZmlyc3RXcml0ZSA9IHRydWVcbiAgdGhpcy5faW5IZWFkZXIgPSB0cnVlXG4gIHRoaXMuX3BhcnQgPSB1bmRlZmluZWRcbiAgdGhpcy5fY2IgPSB1bmRlZmluZWRcbiAgdGhpcy5faWdub3JlRGF0YSA9IGZhbHNlXG4gIHRoaXMuX3BhcnRPcHRzID0geyBoaWdoV2F0ZXJNYXJrOiBjZmcucGFydEh3bSB9XG4gIHRoaXMuX3BhdXNlID0gZmFsc2VcblxuICBjb25zdCBzZWxmID0gdGhpc1xuICB0aGlzLl9ocGFyc2VyID0gbmV3IEhlYWRlclBhcnNlcihjZmcpXG4gIHRoaXMuX2hwYXJzZXIub24oJ2hlYWRlcicsIGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICBzZWxmLl9pbkhlYWRlciA9IGZhbHNlXG4gICAgc2VsZi5fcGFydC5lbWl0KCdoZWFkZXInLCBoZWFkZXIpXG4gIH0pXG59XG5pbmhlcml0cyhEaWNlciwgV3JpdGFibGVTdHJlYW0pXG5cbkRpY2VyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKGV2KSB7XG4gIGlmIChldiA9PT0gJ2ZpbmlzaCcgJiYgIXRoaXMuX3JlYWxGaW5pc2gpIHtcbiAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIG11bHRpcGFydCBkYXRhJykpXG4gICAgICAgIGlmIChzZWxmLl9wYXJ0ICYmICFzZWxmLl9pZ25vcmVEYXRhKSB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IChzZWxmLl9pc1ByZWFtYmxlID8gJ1ByZWFtYmxlJyA6ICdQYXJ0JylcbiAgICAgICAgICBzZWxmLl9wYXJ0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKHR5cGUgKyAnIHRlcm1pbmF0ZWQgZWFybHkgZHVlIHRvIHVuZXhwZWN0ZWQgZW5kIG9mIG11bHRpcGFydCBkYXRhJykpXG4gICAgICAgICAgc2VsZi5fcGFydC5wdXNoKG51bGwpXG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gdHJ1ZVxuICAgICAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gdHJ1ZVxuICAgICAgICBzZWxmLmVtaXQoJ2ZpbmlzaCcpXG4gICAgICAgIHNlbGYuX3JlYWxGaW5pc2ggPSBmYWxzZVxuICAgICAgfSlcbiAgICB9XG4gIH0gZWxzZSB7IFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZS5lbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nLCBjYikge1xuICAvLyBpZ25vcmUgdW5leHBlY3RlZCBkYXRhIChlLmcuIGV4dHJhIHRyYWlsZXIgZGF0YSBhZnRlciBmaW5pc2hlZClcbiAgaWYgKCF0aGlzLl9ocGFyc2VyICYmICF0aGlzLl9icGFyc2VyKSB7IHJldHVybiBjYigpIH1cblxuICBpZiAodGhpcy5faGVhZGVyRmlyc3QgJiYgdGhpcy5faXNQcmVhbWJsZSkge1xuICAgIGlmICghdGhpcy5fcGFydCkge1xuICAgICAgdGhpcy5fcGFydCA9IG5ldyBQYXJ0U3RyZWFtKHRoaXMuX3BhcnRPcHRzKVxuICAgICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudCgncHJlYW1ibGUnKSAhPT0gMCkgeyB0aGlzLmVtaXQoJ3ByZWFtYmxlJywgdGhpcy5fcGFydCkgfSBlbHNlIHsgdGhpcy5faWdub3JlKCkgfVxuICAgIH1cbiAgICBjb25zdCByID0gdGhpcy5faHBhcnNlci5wdXNoKGRhdGEpXG4gICAgaWYgKCF0aGlzLl9pbkhlYWRlciAmJiByICE9PSB1bmRlZmluZWQgJiYgciA8IGRhdGEubGVuZ3RoKSB7IGRhdGEgPSBkYXRhLnNsaWNlKHIpIH0gZWxzZSB7IHJldHVybiBjYigpIH1cbiAgfVxuXG4gIC8vIGFsbG93cyBmb3IgXCJlYXNpZXJcIiB0ZXN0aW5nXG4gIGlmICh0aGlzLl9maXJzdFdyaXRlKSB7XG4gICAgdGhpcy5fYnBhcnNlci5wdXNoKEJfQ1JMRilcbiAgICB0aGlzLl9maXJzdFdyaXRlID0gZmFsc2VcbiAgfVxuXG4gIHRoaXMuX2JwYXJzZXIucHVzaChkYXRhKVxuXG4gIGlmICh0aGlzLl9wYXVzZSkgeyB0aGlzLl9jYiA9IGNiIH0gZWxzZSB7IGNiKCkgfVxufVxuXG5EaWNlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX3BhcnQgPSB1bmRlZmluZWRcbiAgdGhpcy5fYnBhcnNlciA9IHVuZGVmaW5lZFxuICB0aGlzLl9ocGFyc2VyID0gdW5kZWZpbmVkXG59XG5cbkRpY2VyLnByb3RvdHlwZS5zZXRCb3VuZGFyeSA9IGZ1bmN0aW9uIChib3VuZGFyeSkge1xuICBjb25zdCBzZWxmID0gdGhpc1xuICB0aGlzLl9icGFyc2VyID0gbmV3IFN0cmVhbVNlYXJjaCgnXFxyXFxuLS0nICsgYm91bmRhcnkpXG4gIHRoaXMuX2JwYXJzZXIub24oJ2luZm8nLCBmdW5jdGlvbiAoaXNNYXRjaCwgZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgIHNlbGYuX29uaW5mbyhpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKVxuICB9KVxufVxuXG5EaWNlci5wcm90b3R5cGUuX2lnbm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX3BhcnQgJiYgIXRoaXMuX2lnbm9yZURhdGEpIHtcbiAgICB0aGlzLl9pZ25vcmVEYXRhID0gdHJ1ZVxuICAgIHRoaXMuX3BhcnQub24oJ2Vycm9yJywgRU1QVFlfRk4pXG4gICAgLy8gd2UgbXVzdCBwZXJmb3JtIHNvbWUga2luZCBvZiByZWFkIG9uIHRoZSBzdHJlYW0gZXZlbiB0aG91Z2ggd2UgYXJlXG4gICAgLy8gaWdub3JpbmcgdGhlIGRhdGEsIG90aGVyd2lzZSBub2RlJ3MgUmVhZGFibGUgc3RyZWFtIHdpbGwgbm90IGVtaXQgJ2VuZCdcbiAgICAvLyBhZnRlciBwdXNoaW5nIG51bGwgdG8gdGhlIHN0cmVhbVxuICAgIHRoaXMuX3BhcnQucmVzdW1lKClcbiAgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX29uaW5mbyA9IGZ1bmN0aW9uIChpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gIGxldCBidWY7IGNvbnN0IHNlbGYgPSB0aGlzOyBsZXQgaSA9IDA7IGxldCByOyBsZXQgc2hvdWxkV3JpdGVNb3JlID0gdHJ1ZVxuXG4gIGlmICghdGhpcy5fcGFydCAmJiB0aGlzLl9qdXN0TWF0Y2hlZCAmJiBkYXRhKSB7XG4gICAgd2hpbGUgKHRoaXMuX2Rhc2hlcyA8IDIgJiYgKHN0YXJ0ICsgaSkgPCBlbmQpIHtcbiAgICAgIGlmIChkYXRhW3N0YXJ0ICsgaV0gPT09IERBU0gpIHtcbiAgICAgICAgKytpXG4gICAgICAgICsrdGhpcy5fZGFzaGVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fZGFzaGVzKSB7IGJ1ZiA9IEJfT05FREFTSCB9XG4gICAgICAgIHRoaXMuX2Rhc2hlcyA9IDBcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2Rhc2hlcyA9PT0gMikge1xuICAgICAgaWYgKChzdGFydCArIGkpIDwgZW5kICYmIHRoaXMubGlzdGVuZXJDb3VudCgndHJhaWxlcicpICE9PSAwKSB7IHRoaXMuZW1pdCgndHJhaWxlcicsIGRhdGEuc2xpY2Uoc3RhcnQgKyBpLCBlbmQpKSB9XG4gICAgICB0aGlzLnJlc2V0KClcbiAgICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZVxuICAgICAgLy8gbm8gbW9yZSBwYXJ0cyB3aWxsIGJlIGFkZGVkXG4gICAgICBpZiAoc2VsZi5fcGFydHMgPT09IDApIHtcbiAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IHRydWVcbiAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2Rhc2hlcykgeyByZXR1cm4gfVxuICB9XG4gIGlmICh0aGlzLl9qdXN0TWF0Y2hlZCkgeyB0aGlzLl9qdXN0TWF0Y2hlZCA9IGZhbHNlIH1cbiAgaWYgKCF0aGlzLl9wYXJ0KSB7XG4gICAgdGhpcy5fcGFydCA9IG5ldyBQYXJ0U3RyZWFtKHRoaXMuX3BhcnRPcHRzKVxuICAgIHRoaXMuX3BhcnQuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgICAgc2VsZi5fdW5wYXVzZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1ByZWFtYmxlICYmIHRoaXMubGlzdGVuZXJDb3VudCgncHJlYW1ibGUnKSAhPT0gMCkge1xuICAgICAgdGhpcy5lbWl0KCdwcmVhbWJsZScsIHRoaXMuX3BhcnQpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9pc1ByZWFtYmxlICE9PSB0cnVlICYmIHRoaXMubGlzdGVuZXJDb3VudCgncGFydCcpICE9PSAwKSB7XG4gICAgICB0aGlzLmVtaXQoJ3BhcnQnLCB0aGlzLl9wYXJ0KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pZ25vcmUoKVxuICAgIH1cbiAgICBpZiAoIXRoaXMuX2lzUHJlYW1ibGUpIHsgdGhpcy5faW5IZWFkZXIgPSB0cnVlIH1cbiAgfVxuICBpZiAoZGF0YSAmJiBzdGFydCA8IGVuZCAmJiAhdGhpcy5faWdub3JlRGF0YSkge1xuICAgIGlmICh0aGlzLl9pc1ByZWFtYmxlIHx8ICF0aGlzLl9pbkhlYWRlcikge1xuICAgICAgaWYgKGJ1ZikgeyBzaG91bGRXcml0ZU1vcmUgPSB0aGlzLl9wYXJ0LnB1c2goYnVmKSB9XG4gICAgICBzaG91bGRXcml0ZU1vcmUgPSB0aGlzLl9wYXJ0LnB1c2goZGF0YS5zbGljZShzdGFydCwgZW5kKSlcbiAgICAgIGlmICghc2hvdWxkV3JpdGVNb3JlKSB7IHRoaXMuX3BhdXNlID0gdHJ1ZSB9XG4gICAgfSBlbHNlIGlmICghdGhpcy5faXNQcmVhbWJsZSAmJiB0aGlzLl9pbkhlYWRlcikge1xuICAgICAgaWYgKGJ1ZikgeyB0aGlzLl9ocGFyc2VyLnB1c2goYnVmKSB9XG4gICAgICByID0gdGhpcy5faHBhcnNlci5wdXNoKGRhdGEuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gICAgICBpZiAoIXRoaXMuX2luSGVhZGVyICYmIHIgIT09IHVuZGVmaW5lZCAmJiByIDwgZW5kKSB7IHRoaXMuX29uaW5mbyhmYWxzZSwgZGF0YSwgc3RhcnQgKyByLCBlbmQpIH1cbiAgICB9XG4gIH1cbiAgaWYgKGlzTWF0Y2gpIHtcbiAgICB0aGlzLl9ocGFyc2VyLnJlc2V0KClcbiAgICBpZiAodGhpcy5faXNQcmVhbWJsZSkgeyB0aGlzLl9pc1ByZWFtYmxlID0gZmFsc2UgfSBlbHNlIHtcbiAgICAgIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgICAgICsrdGhpcy5fcGFydHNcbiAgICAgICAgdGhpcy5fcGFydC5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICgtLXNlbGYuX3BhcnRzID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IHRydWVcbiAgICAgICAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gZmFsc2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYuX3VucGF1c2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcGFydC5wdXNoKG51bGwpXG4gICAgdGhpcy5fcGFydCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2lnbm9yZURhdGEgPSBmYWxzZVxuICAgIHRoaXMuX2p1c3RNYXRjaGVkID0gdHJ1ZVxuICAgIHRoaXMuX2Rhc2hlcyA9IDBcbiAgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX3VucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5fcGF1c2UpIHsgcmV0dXJuIH1cblxuICB0aGlzLl9wYXVzZSA9IGZhbHNlXG4gIGlmICh0aGlzLl9jYikge1xuICAgIGNvbnN0IGNiID0gdGhpcy5fY2JcbiAgICB0aGlzLl9jYiA9IHVuZGVmaW5lZFxuICAgIGNiKClcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERpY2VyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBOb2RlIGhhcyBhbHdheXMgdXRmLThcbmNvbnN0IHV0ZjhEZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpXG5jb25zdCB0ZXh0RGVjb2RlcnMgPSBuZXcgTWFwKFtcbiAgWyd1dGYtOCcsIHV0ZjhEZWNvZGVyXSxcbiAgWyd1dGY4JywgdXRmOERlY29kZXJdXG5dKVxuXG5mdW5jdGlvbiBnZXREZWNvZGVyIChjaGFyc2V0KSB7XG4gIGxldCBsY1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoY2hhcnNldCkge1xuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy51dGY4XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYXNjaWknOiAvLyBUT0RPOiBNYWtlIHRoZXNlIGEgc2VwYXJhdGUsIHN0cmljdCBkZWNvZGVyP1xuICAgICAgY2FzZSAndXMtYXNjaWknOlxuICAgICAgY2FzZSAnaXNvLTg4NTktMSc6XG4gICAgICBjYXNlICdpc284ODU5LTEnOlxuICAgICAgY2FzZSAnaXNvODg1OTEnOlxuICAgICAgY2FzZSAnaXNvXzg4NTktMSc6XG4gICAgICBjYXNlICd3aW5kb3dzLTEyNTInOlxuICAgICAgY2FzZSAnaXNvXzg4NTktMToxOTg3JzpcbiAgICAgIGNhc2UgJ2NwMTI1Mic6XG4gICAgICBjYXNlICd4LWNwMTI1Mic6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy5sYXRpbjFcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy51dGYxNmxlXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gZGVjb2RlcnMuYmFzZTY0XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobGMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxjID0gdHJ1ZVxuICAgICAgICAgIGNoYXJzZXQgPSBjaGFyc2V0LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWNvZGVycy5vdGhlci5iaW5kKGNoYXJzZXQpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGRlY29kZXJzID0ge1xuICB1dGY4OiAoZGF0YSwgc291cmNlRW5jb2RpbmcpID0+IHtcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkYXRhID0gQnVmZmVyLmZyb20oZGF0YSwgc291cmNlRW5jb2RpbmcpXG4gICAgfVxuICAgIHJldHVybiBkYXRhLnV0ZjhTbGljZSgwLCBkYXRhLmxlbmd0aClcbiAgfSxcblxuICBsYXRpbjE6IChkYXRhLCBzb3VyY2VFbmNvZGluZykgPT4ge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuICAgIHJldHVybiBkYXRhLmxhdGluMVNsaWNlKDAsIGRhdGEubGVuZ3RoKVxuICB9LFxuXG4gIHV0ZjE2bGU6IChkYXRhLCBzb3VyY2VFbmNvZGluZykgPT4ge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCBzb3VyY2VFbmNvZGluZylcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEudWNzMlNsaWNlKDAsIGRhdGEubGVuZ3RoKVxuICB9LFxuXG4gIGJhc2U2NDogKGRhdGEsIHNvdXJjZUVuY29kaW5nKSA9PiB7XG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsIHNvdXJjZUVuY29kaW5nKVxuICAgIH1cbiAgICByZXR1cm4gZGF0YS5iYXNlNjRTbGljZSgwLCBkYXRhLmxlbmd0aClcbiAgfSxcblxuICBvdGhlcjogKGRhdGEsIHNvdXJjZUVuY29kaW5nKSA9PiB7XG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsIHNvdXJjZUVuY29kaW5nKVxuICAgIH1cblxuICAgIGlmICh0ZXh0RGVjb2RlcnMuaGFzKHRoaXMudG9TdHJpbmcoKSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0ZXh0RGVjb2RlcnMuZ2V0KHRoaXMpLmRlY29kZShkYXRhKVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnXG4gICAgICA/IGRhdGFcbiAgICAgIDogZGF0YS50b1N0cmluZygpXG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlVGV4dCAodGV4dCwgc291cmNlRW5jb2RpbmcsIGRlc3RFbmNvZGluZykge1xuICBpZiAodGV4dCkge1xuICAgIHJldHVybiBnZXREZWNvZGVyKGRlc3RFbmNvZGluZykodGV4dCwgc291cmNlRW5jb2RpbmcpXG4gIH1cbiAgcmV0dXJuIHRleHRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWNvZGVUZXh0XG4iLAogICAgIi8qIGVzbGludC1kaXNhYmxlIG9iamVjdC1wcm9wZXJ0eS1uZXdsaW5lICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgZGVjb2RlVGV4dCA9IHJlcXVpcmUoJy4vZGVjb2RlVGV4dCcpXG5cbmNvbnN0IFJFX0VOQ09ERUQgPSAvJVthLWZBLUYwLTldW2EtZkEtRjAtOV0vZ1xuXG5jb25zdCBFbmNvZGVkTG9va3VwID0ge1xuICAnJTAwJzogJ1xceDAwJywgJyUwMSc6ICdcXHgwMScsICclMDInOiAnXFx4MDInLCAnJTAzJzogJ1xceDAzJywgJyUwNCc6ICdcXHgwNCcsXG4gICclMDUnOiAnXFx4MDUnLCAnJTA2JzogJ1xceDA2JywgJyUwNyc6ICdcXHgwNycsICclMDgnOiAnXFx4MDgnLCAnJTA5JzogJ1xceDA5JyxcbiAgJyUwYSc6ICdcXHgwYScsICclMEEnOiAnXFx4MGEnLCAnJTBiJzogJ1xceDBiJywgJyUwQic6ICdcXHgwYicsICclMGMnOiAnXFx4MGMnLFxuICAnJTBDJzogJ1xceDBjJywgJyUwZCc6ICdcXHgwZCcsICclMEQnOiAnXFx4MGQnLCAnJTBlJzogJ1xceDBlJywgJyUwRSc6ICdcXHgwZScsXG4gICclMGYnOiAnXFx4MGYnLCAnJTBGJzogJ1xceDBmJywgJyUxMCc6ICdcXHgxMCcsICclMTEnOiAnXFx4MTEnLCAnJTEyJzogJ1xceDEyJyxcbiAgJyUxMyc6ICdcXHgxMycsICclMTQnOiAnXFx4MTQnLCAnJTE1JzogJ1xceDE1JywgJyUxNic6ICdcXHgxNicsICclMTcnOiAnXFx4MTcnLFxuICAnJTE4JzogJ1xceDE4JywgJyUxOSc6ICdcXHgxOScsICclMWEnOiAnXFx4MWEnLCAnJTFBJzogJ1xceDFhJywgJyUxYic6ICdcXHgxYicsXG4gICclMUInOiAnXFx4MWInLCAnJTFjJzogJ1xceDFjJywgJyUxQyc6ICdcXHgxYycsICclMWQnOiAnXFx4MWQnLCAnJTFEJzogJ1xceDFkJyxcbiAgJyUxZSc6ICdcXHgxZScsICclMUUnOiAnXFx4MWUnLCAnJTFmJzogJ1xceDFmJywgJyUxRic6ICdcXHgxZicsICclMjAnOiAnXFx4MjAnLFxuICAnJTIxJzogJ1xceDIxJywgJyUyMic6ICdcXHgyMicsICclMjMnOiAnXFx4MjMnLCAnJTI0JzogJ1xceDI0JywgJyUyNSc6ICdcXHgyNScsXG4gICclMjYnOiAnXFx4MjYnLCAnJTI3JzogJ1xceDI3JywgJyUyOCc6ICdcXHgyOCcsICclMjknOiAnXFx4MjknLCAnJTJhJzogJ1xceDJhJyxcbiAgJyUyQSc6ICdcXHgyYScsICclMmInOiAnXFx4MmInLCAnJTJCJzogJ1xceDJiJywgJyUyYyc6ICdcXHgyYycsICclMkMnOiAnXFx4MmMnLFxuICAnJTJkJzogJ1xceDJkJywgJyUyRCc6ICdcXHgyZCcsICclMmUnOiAnXFx4MmUnLCAnJTJFJzogJ1xceDJlJywgJyUyZic6ICdcXHgyZicsXG4gICclMkYnOiAnXFx4MmYnLCAnJTMwJzogJ1xceDMwJywgJyUzMSc6ICdcXHgzMScsICclMzInOiAnXFx4MzInLCAnJTMzJzogJ1xceDMzJyxcbiAgJyUzNCc6ICdcXHgzNCcsICclMzUnOiAnXFx4MzUnLCAnJTM2JzogJ1xceDM2JywgJyUzNyc6ICdcXHgzNycsICclMzgnOiAnXFx4MzgnLFxuICAnJTM5JzogJ1xceDM5JywgJyUzYSc6ICdcXHgzYScsICclM0EnOiAnXFx4M2EnLCAnJTNiJzogJ1xceDNiJywgJyUzQic6ICdcXHgzYicsXG4gICclM2MnOiAnXFx4M2MnLCAnJTNDJzogJ1xceDNjJywgJyUzZCc6ICdcXHgzZCcsICclM0QnOiAnXFx4M2QnLCAnJTNlJzogJ1xceDNlJyxcbiAgJyUzRSc6ICdcXHgzZScsICclM2YnOiAnXFx4M2YnLCAnJTNGJzogJ1xceDNmJywgJyU0MCc6ICdcXHg0MCcsICclNDEnOiAnXFx4NDEnLFxuICAnJTQyJzogJ1xceDQyJywgJyU0Myc6ICdcXHg0MycsICclNDQnOiAnXFx4NDQnLCAnJTQ1JzogJ1xceDQ1JywgJyU0Nic6ICdcXHg0NicsXG4gICclNDcnOiAnXFx4NDcnLCAnJTQ4JzogJ1xceDQ4JywgJyU0OSc6ICdcXHg0OScsICclNGEnOiAnXFx4NGEnLCAnJTRBJzogJ1xceDRhJyxcbiAgJyU0Yic6ICdcXHg0YicsICclNEInOiAnXFx4NGInLCAnJTRjJzogJ1xceDRjJywgJyU0Qyc6ICdcXHg0YycsICclNGQnOiAnXFx4NGQnLFxuICAnJTREJzogJ1xceDRkJywgJyU0ZSc6ICdcXHg0ZScsICclNEUnOiAnXFx4NGUnLCAnJTRmJzogJ1xceDRmJywgJyU0Ric6ICdcXHg0ZicsXG4gICclNTAnOiAnXFx4NTAnLCAnJTUxJzogJ1xceDUxJywgJyU1Mic6ICdcXHg1MicsICclNTMnOiAnXFx4NTMnLCAnJTU0JzogJ1xceDU0JyxcbiAgJyU1NSc6ICdcXHg1NScsICclNTYnOiAnXFx4NTYnLCAnJTU3JzogJ1xceDU3JywgJyU1OCc6ICdcXHg1OCcsICclNTknOiAnXFx4NTknLFxuICAnJTVhJzogJ1xceDVhJywgJyU1QSc6ICdcXHg1YScsICclNWInOiAnXFx4NWInLCAnJTVCJzogJ1xceDViJywgJyU1Yyc6ICdcXHg1YycsXG4gICclNUMnOiAnXFx4NWMnLCAnJTVkJzogJ1xceDVkJywgJyU1RCc6ICdcXHg1ZCcsICclNWUnOiAnXFx4NWUnLCAnJTVFJzogJ1xceDVlJyxcbiAgJyU1Zic6ICdcXHg1ZicsICclNUYnOiAnXFx4NWYnLCAnJTYwJzogJ1xceDYwJywgJyU2MSc6ICdcXHg2MScsICclNjInOiAnXFx4NjInLFxuICAnJTYzJzogJ1xceDYzJywgJyU2NCc6ICdcXHg2NCcsICclNjUnOiAnXFx4NjUnLCAnJTY2JzogJ1xceDY2JywgJyU2Nyc6ICdcXHg2NycsXG4gICclNjgnOiAnXFx4NjgnLCAnJTY5JzogJ1xceDY5JywgJyU2YSc6ICdcXHg2YScsICclNkEnOiAnXFx4NmEnLCAnJTZiJzogJ1xceDZiJyxcbiAgJyU2Qic6ICdcXHg2YicsICclNmMnOiAnXFx4NmMnLCAnJTZDJzogJ1xceDZjJywgJyU2ZCc6ICdcXHg2ZCcsICclNkQnOiAnXFx4NmQnLFxuICAnJTZlJzogJ1xceDZlJywgJyU2RSc6ICdcXHg2ZScsICclNmYnOiAnXFx4NmYnLCAnJTZGJzogJ1xceDZmJywgJyU3MCc6ICdcXHg3MCcsXG4gICclNzEnOiAnXFx4NzEnLCAnJTcyJzogJ1xceDcyJywgJyU3Myc6ICdcXHg3MycsICclNzQnOiAnXFx4NzQnLCAnJTc1JzogJ1xceDc1JyxcbiAgJyU3Nic6ICdcXHg3NicsICclNzcnOiAnXFx4NzcnLCAnJTc4JzogJ1xceDc4JywgJyU3OSc6ICdcXHg3OScsICclN2EnOiAnXFx4N2EnLFxuICAnJTdBJzogJ1xceDdhJywgJyU3Yic6ICdcXHg3YicsICclN0InOiAnXFx4N2InLCAnJTdjJzogJ1xceDdjJywgJyU3Qyc6ICdcXHg3YycsXG4gICclN2QnOiAnXFx4N2QnLCAnJTdEJzogJ1xceDdkJywgJyU3ZSc6ICdcXHg3ZScsICclN0UnOiAnXFx4N2UnLCAnJTdmJzogJ1xceDdmJyxcbiAgJyU3Ric6ICdcXHg3ZicsICclODAnOiAnXFx4ODAnLCAnJTgxJzogJ1xceDgxJywgJyU4Mic6ICdcXHg4MicsICclODMnOiAnXFx4ODMnLFxuICAnJTg0JzogJ1xceDg0JywgJyU4NSc6ICdcXHg4NScsICclODYnOiAnXFx4ODYnLCAnJTg3JzogJ1xceDg3JywgJyU4OCc6ICdcXHg4OCcsXG4gICclODknOiAnXFx4ODknLCAnJThhJzogJ1xceDhhJywgJyU4QSc6ICdcXHg4YScsICclOGInOiAnXFx4OGInLCAnJThCJzogJ1xceDhiJyxcbiAgJyU4Yyc6ICdcXHg4YycsICclOEMnOiAnXFx4OGMnLCAnJThkJzogJ1xceDhkJywgJyU4RCc6ICdcXHg4ZCcsICclOGUnOiAnXFx4OGUnLFxuICAnJThFJzogJ1xceDhlJywgJyU4Zic6ICdcXHg4ZicsICclOEYnOiAnXFx4OGYnLCAnJTkwJzogJ1xceDkwJywgJyU5MSc6ICdcXHg5MScsXG4gICclOTInOiAnXFx4OTInLCAnJTkzJzogJ1xceDkzJywgJyU5NCc6ICdcXHg5NCcsICclOTUnOiAnXFx4OTUnLCAnJTk2JzogJ1xceDk2JyxcbiAgJyU5Nyc6ICdcXHg5NycsICclOTgnOiAnXFx4OTgnLCAnJTk5JzogJ1xceDk5JywgJyU5YSc6ICdcXHg5YScsICclOUEnOiAnXFx4OWEnLFxuICAnJTliJzogJ1xceDliJywgJyU5Qic6ICdcXHg5YicsICclOWMnOiAnXFx4OWMnLCAnJTlDJzogJ1xceDljJywgJyU5ZCc6ICdcXHg5ZCcsXG4gICclOUQnOiAnXFx4OWQnLCAnJTllJzogJ1xceDllJywgJyU5RSc6ICdcXHg5ZScsICclOWYnOiAnXFx4OWYnLCAnJTlGJzogJ1xceDlmJyxcbiAgJyVhMCc6ICdcXHhhMCcsICclQTAnOiAnXFx4YTAnLCAnJWExJzogJ1xceGExJywgJyVBMSc6ICdcXHhhMScsICclYTInOiAnXFx4YTInLFxuICAnJUEyJzogJ1xceGEyJywgJyVhMyc6ICdcXHhhMycsICclQTMnOiAnXFx4YTMnLCAnJWE0JzogJ1xceGE0JywgJyVBNCc6ICdcXHhhNCcsXG4gICclYTUnOiAnXFx4YTUnLCAnJUE1JzogJ1xceGE1JywgJyVhNic6ICdcXHhhNicsICclQTYnOiAnXFx4YTYnLCAnJWE3JzogJ1xceGE3JyxcbiAgJyVBNyc6ICdcXHhhNycsICclYTgnOiAnXFx4YTgnLCAnJUE4JzogJ1xceGE4JywgJyVhOSc6ICdcXHhhOScsICclQTknOiAnXFx4YTknLFxuICAnJWFhJzogJ1xceGFhJywgJyVBYSc6ICdcXHhhYScsICclYUEnOiAnXFx4YWEnLCAnJUFBJzogJ1xceGFhJywgJyVhYic6ICdcXHhhYicsXG4gICclQWInOiAnXFx4YWInLCAnJWFCJzogJ1xceGFiJywgJyVBQic6ICdcXHhhYicsICclYWMnOiAnXFx4YWMnLCAnJUFjJzogJ1xceGFjJyxcbiAgJyVhQyc6ICdcXHhhYycsICclQUMnOiAnXFx4YWMnLCAnJWFkJzogJ1xceGFkJywgJyVBZCc6ICdcXHhhZCcsICclYUQnOiAnXFx4YWQnLFxuICAnJUFEJzogJ1xceGFkJywgJyVhZSc6ICdcXHhhZScsICclQWUnOiAnXFx4YWUnLCAnJWFFJzogJ1xceGFlJywgJyVBRSc6ICdcXHhhZScsXG4gICclYWYnOiAnXFx4YWYnLCAnJUFmJzogJ1xceGFmJywgJyVhRic6ICdcXHhhZicsICclQUYnOiAnXFx4YWYnLCAnJWIwJzogJ1xceGIwJyxcbiAgJyVCMCc6ICdcXHhiMCcsICclYjEnOiAnXFx4YjEnLCAnJUIxJzogJ1xceGIxJywgJyViMic6ICdcXHhiMicsICclQjInOiAnXFx4YjInLFxuICAnJWIzJzogJ1xceGIzJywgJyVCMyc6ICdcXHhiMycsICclYjQnOiAnXFx4YjQnLCAnJUI0JzogJ1xceGI0JywgJyViNSc6ICdcXHhiNScsXG4gICclQjUnOiAnXFx4YjUnLCAnJWI2JzogJ1xceGI2JywgJyVCNic6ICdcXHhiNicsICclYjcnOiAnXFx4YjcnLCAnJUI3JzogJ1xceGI3JyxcbiAgJyViOCc6ICdcXHhiOCcsICclQjgnOiAnXFx4YjgnLCAnJWI5JzogJ1xceGI5JywgJyVCOSc6ICdcXHhiOScsICclYmEnOiAnXFx4YmEnLFxuICAnJUJhJzogJ1xceGJhJywgJyViQSc6ICdcXHhiYScsICclQkEnOiAnXFx4YmEnLCAnJWJiJzogJ1xceGJiJywgJyVCYic6ICdcXHhiYicsXG4gICclYkInOiAnXFx4YmInLCAnJUJCJzogJ1xceGJiJywgJyViYyc6ICdcXHhiYycsICclQmMnOiAnXFx4YmMnLCAnJWJDJzogJ1xceGJjJyxcbiAgJyVCQyc6ICdcXHhiYycsICclYmQnOiAnXFx4YmQnLCAnJUJkJzogJ1xceGJkJywgJyViRCc6ICdcXHhiZCcsICclQkQnOiAnXFx4YmQnLFxuICAnJWJlJzogJ1xceGJlJywgJyVCZSc6ICdcXHhiZScsICclYkUnOiAnXFx4YmUnLCAnJUJFJzogJ1xceGJlJywgJyViZic6ICdcXHhiZicsXG4gICclQmYnOiAnXFx4YmYnLCAnJWJGJzogJ1xceGJmJywgJyVCRic6ICdcXHhiZicsICclYzAnOiAnXFx4YzAnLCAnJUMwJzogJ1xceGMwJyxcbiAgJyVjMSc6ICdcXHhjMScsICclQzEnOiAnXFx4YzEnLCAnJWMyJzogJ1xceGMyJywgJyVDMic6ICdcXHhjMicsICclYzMnOiAnXFx4YzMnLFxuICAnJUMzJzogJ1xceGMzJywgJyVjNCc6ICdcXHhjNCcsICclQzQnOiAnXFx4YzQnLCAnJWM1JzogJ1xceGM1JywgJyVDNSc6ICdcXHhjNScsXG4gICclYzYnOiAnXFx4YzYnLCAnJUM2JzogJ1xceGM2JywgJyVjNyc6ICdcXHhjNycsICclQzcnOiAnXFx4YzcnLCAnJWM4JzogJ1xceGM4JyxcbiAgJyVDOCc6ICdcXHhjOCcsICclYzknOiAnXFx4YzknLCAnJUM5JzogJ1xceGM5JywgJyVjYSc6ICdcXHhjYScsICclQ2EnOiAnXFx4Y2EnLFxuICAnJWNBJzogJ1xceGNhJywgJyVDQSc6ICdcXHhjYScsICclY2InOiAnXFx4Y2InLCAnJUNiJzogJ1xceGNiJywgJyVjQic6ICdcXHhjYicsXG4gICclQ0InOiAnXFx4Y2InLCAnJWNjJzogJ1xceGNjJywgJyVDYyc6ICdcXHhjYycsICclY0MnOiAnXFx4Y2MnLCAnJUNDJzogJ1xceGNjJyxcbiAgJyVjZCc6ICdcXHhjZCcsICclQ2QnOiAnXFx4Y2QnLCAnJWNEJzogJ1xceGNkJywgJyVDRCc6ICdcXHhjZCcsICclY2UnOiAnXFx4Y2UnLFxuICAnJUNlJzogJ1xceGNlJywgJyVjRSc6ICdcXHhjZScsICclQ0UnOiAnXFx4Y2UnLCAnJWNmJzogJ1xceGNmJywgJyVDZic6ICdcXHhjZicsXG4gICclY0YnOiAnXFx4Y2YnLCAnJUNGJzogJ1xceGNmJywgJyVkMCc6ICdcXHhkMCcsICclRDAnOiAnXFx4ZDAnLCAnJWQxJzogJ1xceGQxJyxcbiAgJyVEMSc6ICdcXHhkMScsICclZDInOiAnXFx4ZDInLCAnJUQyJzogJ1xceGQyJywgJyVkMyc6ICdcXHhkMycsICclRDMnOiAnXFx4ZDMnLFxuICAnJWQ0JzogJ1xceGQ0JywgJyVENCc6ICdcXHhkNCcsICclZDUnOiAnXFx4ZDUnLCAnJUQ1JzogJ1xceGQ1JywgJyVkNic6ICdcXHhkNicsXG4gICclRDYnOiAnXFx4ZDYnLCAnJWQ3JzogJ1xceGQ3JywgJyVENyc6ICdcXHhkNycsICclZDgnOiAnXFx4ZDgnLCAnJUQ4JzogJ1xceGQ4JyxcbiAgJyVkOSc6ICdcXHhkOScsICclRDknOiAnXFx4ZDknLCAnJWRhJzogJ1xceGRhJywgJyVEYSc6ICdcXHhkYScsICclZEEnOiAnXFx4ZGEnLFxuICAnJURBJzogJ1xceGRhJywgJyVkYic6ICdcXHhkYicsICclRGInOiAnXFx4ZGInLCAnJWRCJzogJ1xceGRiJywgJyVEQic6ICdcXHhkYicsXG4gICclZGMnOiAnXFx4ZGMnLCAnJURjJzogJ1xceGRjJywgJyVkQyc6ICdcXHhkYycsICclREMnOiAnXFx4ZGMnLCAnJWRkJzogJ1xceGRkJyxcbiAgJyVEZCc6ICdcXHhkZCcsICclZEQnOiAnXFx4ZGQnLCAnJUREJzogJ1xceGRkJywgJyVkZSc6ICdcXHhkZScsICclRGUnOiAnXFx4ZGUnLFxuICAnJWRFJzogJ1xceGRlJywgJyVERSc6ICdcXHhkZScsICclZGYnOiAnXFx4ZGYnLCAnJURmJzogJ1xceGRmJywgJyVkRic6ICdcXHhkZicsXG4gICclREYnOiAnXFx4ZGYnLCAnJWUwJzogJ1xceGUwJywgJyVFMCc6ICdcXHhlMCcsICclZTEnOiAnXFx4ZTEnLCAnJUUxJzogJ1xceGUxJyxcbiAgJyVlMic6ICdcXHhlMicsICclRTInOiAnXFx4ZTInLCAnJWUzJzogJ1xceGUzJywgJyVFMyc6ICdcXHhlMycsICclZTQnOiAnXFx4ZTQnLFxuICAnJUU0JzogJ1xceGU0JywgJyVlNSc6ICdcXHhlNScsICclRTUnOiAnXFx4ZTUnLCAnJWU2JzogJ1xceGU2JywgJyVFNic6ICdcXHhlNicsXG4gICclZTcnOiAnXFx4ZTcnLCAnJUU3JzogJ1xceGU3JywgJyVlOCc6ICdcXHhlOCcsICclRTgnOiAnXFx4ZTgnLCAnJWU5JzogJ1xceGU5JyxcbiAgJyVFOSc6ICdcXHhlOScsICclZWEnOiAnXFx4ZWEnLCAnJUVhJzogJ1xceGVhJywgJyVlQSc6ICdcXHhlYScsICclRUEnOiAnXFx4ZWEnLFxuICAnJWViJzogJ1xceGViJywgJyVFYic6ICdcXHhlYicsICclZUInOiAnXFx4ZWInLCAnJUVCJzogJ1xceGViJywgJyVlYyc6ICdcXHhlYycsXG4gICclRWMnOiAnXFx4ZWMnLCAnJWVDJzogJ1xceGVjJywgJyVFQyc6ICdcXHhlYycsICclZWQnOiAnXFx4ZWQnLCAnJUVkJzogJ1xceGVkJyxcbiAgJyVlRCc6ICdcXHhlZCcsICclRUQnOiAnXFx4ZWQnLCAnJWVlJzogJ1xceGVlJywgJyVFZSc6ICdcXHhlZScsICclZUUnOiAnXFx4ZWUnLFxuICAnJUVFJzogJ1xceGVlJywgJyVlZic6ICdcXHhlZicsICclRWYnOiAnXFx4ZWYnLCAnJWVGJzogJ1xceGVmJywgJyVFRic6ICdcXHhlZicsXG4gICclZjAnOiAnXFx4ZjAnLCAnJUYwJzogJ1xceGYwJywgJyVmMSc6ICdcXHhmMScsICclRjEnOiAnXFx4ZjEnLCAnJWYyJzogJ1xceGYyJyxcbiAgJyVGMic6ICdcXHhmMicsICclZjMnOiAnXFx4ZjMnLCAnJUYzJzogJ1xceGYzJywgJyVmNCc6ICdcXHhmNCcsICclRjQnOiAnXFx4ZjQnLFxuICAnJWY1JzogJ1xceGY1JywgJyVGNSc6ICdcXHhmNScsICclZjYnOiAnXFx4ZjYnLCAnJUY2JzogJ1xceGY2JywgJyVmNyc6ICdcXHhmNycsXG4gICclRjcnOiAnXFx4ZjcnLCAnJWY4JzogJ1xceGY4JywgJyVGOCc6ICdcXHhmOCcsICclZjknOiAnXFx4ZjknLCAnJUY5JzogJ1xceGY5JyxcbiAgJyVmYSc6ICdcXHhmYScsICclRmEnOiAnXFx4ZmEnLCAnJWZBJzogJ1xceGZhJywgJyVGQSc6ICdcXHhmYScsICclZmInOiAnXFx4ZmInLFxuICAnJUZiJzogJ1xceGZiJywgJyVmQic6ICdcXHhmYicsICclRkInOiAnXFx4ZmInLCAnJWZjJzogJ1xceGZjJywgJyVGYyc6ICdcXHhmYycsXG4gICclZkMnOiAnXFx4ZmMnLCAnJUZDJzogJ1xceGZjJywgJyVmZCc6ICdcXHhmZCcsICclRmQnOiAnXFx4ZmQnLCAnJWZEJzogJ1xceGZkJyxcbiAgJyVGRCc6ICdcXHhmZCcsICclZmUnOiAnXFx4ZmUnLCAnJUZlJzogJ1xceGZlJywgJyVmRSc6ICdcXHhmZScsICclRkUnOiAnXFx4ZmUnLFxuICAnJWZmJzogJ1xceGZmJywgJyVGZic6ICdcXHhmZicsICclZkYnOiAnXFx4ZmYnLCAnJUZGJzogJ1xceGZmJ1xufVxuXG5mdW5jdGlvbiBlbmNvZGVkUmVwbGFjZXIgKG1hdGNoKSB7XG4gIHJldHVybiBFbmNvZGVkTG9va3VwW21hdGNoXVxufVxuXG5jb25zdCBTVEFURV9LRVkgPSAwXG5jb25zdCBTVEFURV9WQUxVRSA9IDFcbmNvbnN0IFNUQVRFX0NIQVJTRVQgPSAyXG5jb25zdCBTVEFURV9MQU5HID0gM1xuXG5mdW5jdGlvbiBwYXJzZVBhcmFtcyAoc3RyKSB7XG4gIGNvbnN0IHJlcyA9IFtdXG4gIGxldCBzdGF0ZSA9IFNUQVRFX0tFWVxuICBsZXQgY2hhcnNldCA9ICcnXG4gIGxldCBpbnF1b3RlID0gZmFsc2VcbiAgbGV0IGVzY2FwaW5nID0gZmFsc2VcbiAgbGV0IHAgPSAwXG4gIGxldCB0bXAgPSAnJ1xuICBjb25zdCBsZW4gPSBzdHIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXZhclxuICAgIGNvbnN0IGNoYXIgPSBzdHJbaV1cbiAgICBpZiAoY2hhciA9PT0gJ1xcXFwnICYmIGlucXVvdGUpIHtcbiAgICAgIGlmIChlc2NhcGluZykgeyBlc2NhcGluZyA9IGZhbHNlIH0gZWxzZSB7XG4gICAgICAgIGVzY2FwaW5nID0gdHJ1ZVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgaWYgKCFlc2NhcGluZykge1xuICAgICAgICBpZiAoaW5xdW90ZSkge1xuICAgICAgICAgIGlucXVvdGUgPSBmYWxzZVxuICAgICAgICAgIHN0YXRlID0gU1RBVEVfS0VZXG4gICAgICAgIH0gZWxzZSB7IGlucXVvdGUgPSB0cnVlIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7IGVzY2FwaW5nID0gZmFsc2UgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXNjYXBpbmcgJiYgaW5xdW90ZSkgeyB0bXAgKz0gJ1xcXFwnIH1cbiAgICAgIGVzY2FwaW5nID0gZmFsc2VcbiAgICAgIGlmICgoc3RhdGUgPT09IFNUQVRFX0NIQVJTRVQgfHwgc3RhdGUgPT09IFNUQVRFX0xBTkcpICYmIGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEVfQ0hBUlNFVCkge1xuICAgICAgICAgIHN0YXRlID0gU1RBVEVfTEFOR1xuICAgICAgICAgIGNoYXJzZXQgPSB0bXAuc3Vic3RyaW5nKDEpXG4gICAgICAgIH0gZWxzZSB7IHN0YXRlID0gU1RBVEVfVkFMVUUgfVxuICAgICAgICB0bXAgPSAnJ1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEVfS0VZICYmXG4gICAgICAgIChjaGFyID09PSAnKicgfHwgY2hhciA9PT0gJz0nKSAmJlxuICAgICAgICByZXMubGVuZ3RoKSB7XG4gICAgICAgIHN0YXRlID0gY2hhciA9PT0gJyonXG4gICAgICAgICAgPyBTVEFURV9DSEFSU0VUXG4gICAgICAgICAgOiBTVEFURV9WQUxVRVxuICAgICAgICByZXNbcF0gPSBbdG1wLCB1bmRlZmluZWRdXG4gICAgICAgIHRtcCA9ICcnXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKCFpbnF1b3RlICYmIGNoYXIgPT09ICc7Jykge1xuICAgICAgICBzdGF0ZSA9IFNUQVRFX0tFWVxuICAgICAgICBpZiAoY2hhcnNldCkge1xuICAgICAgICAgIGlmICh0bXAubGVuZ3RoKSB7XG4gICAgICAgICAgICB0bXAgPSBkZWNvZGVUZXh0KHRtcC5yZXBsYWNlKFJFX0VOQ09ERUQsIGVuY29kZWRSZXBsYWNlciksXG4gICAgICAgICAgICAgICdiaW5hcnknLFxuICAgICAgICAgICAgICBjaGFyc2V0KVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGFyc2V0ID0gJydcbiAgICAgICAgfSBlbHNlIGlmICh0bXAubGVuZ3RoKSB7XG4gICAgICAgICAgdG1wID0gZGVjb2RlVGV4dCh0bXAsICdiaW5hcnknLCAndXRmOCcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc1twXSA9PT0gdW5kZWZpbmVkKSB7IHJlc1twXSA9IHRtcCB9IGVsc2UgeyByZXNbcF1bMV0gPSB0bXAgfVxuICAgICAgICB0bXAgPSAnJ1xuICAgICAgICArK3BcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoIWlucXVvdGUgJiYgKGNoYXIgPT09ICcgJyB8fCBjaGFyID09PSAnXFx0JykpIHsgY29udGludWUgfVxuICAgIH1cbiAgICB0bXAgKz0gY2hhclxuICB9XG4gIGlmIChjaGFyc2V0ICYmIHRtcC5sZW5ndGgpIHtcbiAgICB0bXAgPSBkZWNvZGVUZXh0KHRtcC5yZXBsYWNlKFJFX0VOQ09ERUQsIGVuY29kZWRSZXBsYWNlciksXG4gICAgICAnYmluYXJ5JyxcbiAgICAgIGNoYXJzZXQpXG4gIH0gZWxzZSBpZiAodG1wKSB7XG4gICAgdG1wID0gZGVjb2RlVGV4dCh0bXAsICdiaW5hcnknLCAndXRmOCcpXG4gIH1cblxuICBpZiAocmVzW3BdID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodG1wKSB7IHJlc1twXSA9IHRtcCB9XG4gIH0gZWxzZSB7IHJlc1twXVsxXSA9IHRtcCB9XG5cbiAgcmV0dXJuIHJlc1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlUGFyYW1zXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJhc2VuYW1lIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHsgcmV0dXJuICcnIH1cbiAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby12YXJcbiAgICBzd2l0Y2ggKHBhdGguY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSAweDJGOiAvLyAnLydcbiAgICAgIGNhc2UgMHg1QzogLy8gJ1xcJ1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZShpICsgMSlcbiAgICAgICAgcmV0dXJuIChwYXRoID09PSAnLi4nIHx8IHBhdGggPT09ICcuJyA/ICcnIDogcGF0aClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChwYXRoID09PSAnLi4nIHx8IHBhdGggPT09ICcuJyA/ICcnIDogcGF0aClcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIFRPRE86XG4vLyAgKiBzdXBwb3J0IDEgbmVzdGVkIG11bHRpcGFydCBsZXZlbFxuLy8gICAgKHNlZSBzZWNvbmQgbXVsdGlwYXJ0IGV4YW1wbGUgaGVyZTpcbi8vICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjZGlkeC1tdWx0aXBhcnRmb3JtLWRhdGEpXG4vLyAgKiBzdXBwb3J0IGxpbWl0cy5maWVsZE5hbWVTaXplXG4vLyAgICAgLS0gdGhpcyB3aWxsIHJlcXVpcmUgbW9kaWZpY2F0aW9ucyB0byB1dGlscy5wYXJzZVBhcmFtc1xuXG5jb25zdCB7IFJlYWRhYmxlIH0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCB7IGluaGVyaXRzIH0gPSByZXF1aXJlKCdub2RlOnV0aWwnKVxuXG5jb25zdCBEaWNlciA9IHJlcXVpcmUoJy4uLy4uL2RlcHMvZGljZXIvbGliL0RpY2VyJylcblxuY29uc3QgcGFyc2VQYXJhbXMgPSByZXF1aXJlKCcuLi91dGlscy9wYXJzZVBhcmFtcycpXG5jb25zdCBkZWNvZGVUZXh0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZGVjb2RlVGV4dCcpXG5jb25zdCBiYXNlbmFtZSA9IHJlcXVpcmUoJy4uL3V0aWxzL2Jhc2VuYW1lJylcbmNvbnN0IGdldExpbWl0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0TGltaXQnKVxuXG5jb25zdCBSRV9CT1VOREFSWSA9IC9eYm91bmRhcnkkL2lcbmNvbnN0IFJFX0ZJRUxEID0gL15mb3JtLWRhdGEkL2lcbmNvbnN0IFJFX0NIQVJTRVQgPSAvXmNoYXJzZXQkL2lcbmNvbnN0IFJFX0ZJTEVOQU1FID0gL15maWxlbmFtZSQvaVxuY29uc3QgUkVfTkFNRSA9IC9ebmFtZSQvaVxuXG5NdWx0aXBhcnQuZGV0ZWN0ID0gL15tdWx0aXBhcnRcXC9mb3JtLWRhdGEvaVxuZnVuY3Rpb24gTXVsdGlwYXJ0IChib3ksIGNmZykge1xuICBsZXQgaVxuICBsZXQgbGVuXG4gIGNvbnN0IHNlbGYgPSB0aGlzXG4gIGxldCBib3VuZGFyeVxuICBjb25zdCBsaW1pdHMgPSBjZmcubGltaXRzXG4gIGNvbnN0IGlzUGFydEFGaWxlID0gY2ZnLmlzUGFydEFGaWxlIHx8ICgoZmllbGROYW1lLCBjb250ZW50VHlwZSwgZmlsZU5hbWUpID0+IChjb250ZW50VHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfHwgZmlsZU5hbWUgIT09IHVuZGVmaW5lZCkpXG4gIGNvbnN0IHBhcnNlZENvblR5cGUgPSBjZmcucGFyc2VkQ29uVHlwZSB8fCBbXVxuICBjb25zdCBkZWZDaGFyc2V0ID0gY2ZnLmRlZkNoYXJzZXQgfHwgJ3V0ZjgnXG4gIGNvbnN0IHByZXNlcnZlUGF0aCA9IGNmZy5wcmVzZXJ2ZVBhdGhcbiAgY29uc3QgZmlsZU9wdHMgPSB7IGhpZ2hXYXRlck1hcms6IGNmZy5maWxlSHdtIH1cblxuICBmb3IgKGkgPSAwLCBsZW4gPSBwYXJzZWRDb25UeXBlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkQ29uVHlwZVtpXSkgJiZcbiAgICAgIFJFX0JPVU5EQVJZLnRlc3QocGFyc2VkQ29uVHlwZVtpXVswXSkpIHtcbiAgICAgIGJvdW5kYXJ5ID0gcGFyc2VkQ29uVHlwZVtpXVsxXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0ZpbmlzaGVkICgpIHtcbiAgICBpZiAobmVuZHMgPT09IDAgJiYgZmluaXNoZWQgJiYgIWJveS5fZG9uZSkge1xuICAgICAgZmluaXNoZWQgPSBmYWxzZVxuICAgICAgc2VsZi5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgYm91bmRhcnkgIT09ICdzdHJpbmcnKSB7IHRocm93IG5ldyBFcnJvcignTXVsdGlwYXJ0OiBCb3VuZGFyeSBub3QgZm91bmQnKSB9XG5cbiAgY29uc3QgZmllbGRTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZFNpemUnLCAxICogMTAyNCAqIDEwMjQpXG4gIGNvbnN0IGZpbGVTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWxlU2l6ZScsIEluZmluaXR5KVxuICBjb25zdCBmaWxlc0xpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmlsZXMnLCBJbmZpbml0eSlcbiAgY29uc3QgZmllbGRzTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZHMnLCBJbmZpbml0eSlcbiAgY29uc3QgcGFydHNMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ3BhcnRzJywgSW5maW5pdHkpXG4gIGNvbnN0IGhlYWRlclBhaXJzTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdoZWFkZXJQYWlycycsIDIwMDApXG4gIGNvbnN0IGhlYWRlclNpemVMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ2hlYWRlclNpemUnLCA4MCAqIDEwMjQpXG5cbiAgbGV0IG5maWxlcyA9IDBcbiAgbGV0IG5maWVsZHMgPSAwXG4gIGxldCBuZW5kcyA9IDBcbiAgbGV0IGN1ckZpbGVcbiAgbGV0IGN1ckZpZWxkXG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlXG5cbiAgdGhpcy5fbmVlZERyYWluID0gZmFsc2VcbiAgdGhpcy5fcGF1c2UgPSBmYWxzZVxuICB0aGlzLl9jYiA9IHVuZGVmaW5lZFxuICB0aGlzLl9ucGFydHMgPSAwXG4gIHRoaXMuX2JveSA9IGJveVxuXG4gIGNvbnN0IHBhcnNlckNmZyA9IHtcbiAgICBib3VuZGFyeSxcbiAgICBtYXhIZWFkZXJQYWlyczogaGVhZGVyUGFpcnNMaW1pdCxcbiAgICBtYXhIZWFkZXJTaXplOiBoZWFkZXJTaXplTGltaXQsXG4gICAgcGFydEh3bTogZmlsZU9wdHMuaGlnaFdhdGVyTWFyayxcbiAgICBoaWdoV2F0ZXJNYXJrOiBjZmcuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgdGhpcy5wYXJzZXIgPSBuZXcgRGljZXIocGFyc2VyQ2ZnKVxuICB0aGlzLnBhcnNlci5vbignZHJhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5fbmVlZERyYWluID0gZmFsc2VcbiAgICBpZiAoc2VsZi5fY2IgJiYgIXNlbGYuX3BhdXNlKSB7XG4gICAgICBjb25zdCBjYiA9IHNlbGYuX2NiXG4gICAgICBzZWxmLl9jYiA9IHVuZGVmaW5lZFxuICAgICAgY2IoKVxuICAgIH1cbiAgfSkub24oJ3BhcnQnLCBmdW5jdGlvbiBvblBhcnQgKHBhcnQpIHtcbiAgICBpZiAoKytzZWxmLl9ucGFydHMgPiBwYXJ0c0xpbWl0KSB7XG4gICAgICBzZWxmLnBhcnNlci5yZW1vdmVMaXN0ZW5lcigncGFydCcsIG9uUGFydClcbiAgICAgIHNlbGYucGFyc2VyLm9uKCdwYXJ0Jywgc2tpcFBhcnQpXG4gICAgICBib3kuaGl0UGFydHNMaW1pdCA9IHRydWVcbiAgICAgIGJveS5lbWl0KCdwYXJ0c0xpbWl0JylcbiAgICAgIHJldHVybiBza2lwUGFydChwYXJ0KVxuICAgIH1cblxuICAgIC8vIGhhY2sgYmVjYXVzZSBzdHJlYW1zMiBfYWx3YXlzXyBkb2Vzbid0IGVtaXQgJ2VuZCcgdW50aWwgbmV4dFRpY2ssIHNvIGxldFxuICAgIC8vIHVzIGVtaXQgJ2VuZCcgZWFybHkgc2luY2Ugd2Uga25vdyB0aGUgcGFydCBoYXMgZW5kZWQgaWYgd2UgYXJlIGFscmVhZHlcbiAgICAvLyBzZWVpbmcgdGhlIG5leHQgcGFydFxuICAgIGlmIChjdXJGaWVsZCkge1xuICAgICAgY29uc3QgZmllbGQgPSBjdXJGaWVsZFxuICAgICAgZmllbGQuZW1pdCgnZW5kJylcbiAgICAgIGZpZWxkLnJlbW92ZUFsbExpc3RlbmVycygnZW5kJylcbiAgICB9XG5cbiAgICBwYXJ0Lm9uKCdoZWFkZXInLCBmdW5jdGlvbiAoaGVhZGVyKSB7XG4gICAgICBsZXQgY29udHlwZVxuICAgICAgbGV0IGZpZWxkbmFtZVxuICAgICAgbGV0IHBhcnNlZFxuICAgICAgbGV0IGNoYXJzZXRcbiAgICAgIGxldCBlbmNvZGluZ1xuICAgICAgbGV0IGZpbGVuYW1lXG4gICAgICBsZXQgbnNpemUgPSAwXG5cbiAgICAgIGlmIChoZWFkZXJbJ2NvbnRlbnQtdHlwZSddKSB7XG4gICAgICAgIHBhcnNlZCA9IHBhcnNlUGFyYW1zKGhlYWRlclsnY29udGVudC10eXBlJ11bMF0pXG4gICAgICAgIGlmIChwYXJzZWRbMF0pIHtcbiAgICAgICAgICBjb250eXBlID0gcGFyc2VkWzBdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwYXJzZWQubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChSRV9DSEFSU0VULnRlc3QocGFyc2VkW2ldWzBdKSkge1xuICAgICAgICAgICAgICBjaGFyc2V0ID0gcGFyc2VkW2ldWzFdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnR5cGUgPT09IHVuZGVmaW5lZCkgeyBjb250eXBlID0gJ3RleHQvcGxhaW4nIH1cbiAgICAgIGlmIChjaGFyc2V0ID09PSB1bmRlZmluZWQpIHsgY2hhcnNldCA9IGRlZkNoYXJzZXQgfVxuXG4gICAgICBpZiAoaGVhZGVyWydjb250ZW50LWRpc3Bvc2l0aW9uJ10pIHtcbiAgICAgICAgcGFyc2VkID0gcGFyc2VQYXJhbXMoaGVhZGVyWydjb250ZW50LWRpc3Bvc2l0aW9uJ11bMF0pXG4gICAgICAgIGlmICghUkVfRklFTEQudGVzdChwYXJzZWRbMF0pKSB7IHJldHVybiBza2lwUGFydChwYXJ0KSB9XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHBhcnNlZC5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgIGlmIChSRV9OQU1FLnRlc3QocGFyc2VkW2ldWzBdKSkge1xuICAgICAgICAgICAgZmllbGRuYW1lID0gcGFyc2VkW2ldWzFdXG4gICAgICAgICAgfSBlbHNlIGlmIChSRV9GSUxFTkFNRS50ZXN0KHBhcnNlZFtpXVswXSkpIHtcbiAgICAgICAgICAgIGZpbGVuYW1lID0gcGFyc2VkW2ldWzFdXG4gICAgICAgICAgICBpZiAoIXByZXNlcnZlUGF0aCkgeyBmaWxlbmFtZSA9IGJhc2VuYW1lKGZpbGVuYW1lKSB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyByZXR1cm4gc2tpcFBhcnQocGFydCkgfVxuXG4gICAgICBpZiAoaGVhZGVyWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10pIHsgZW5jb2RpbmcgPSBoZWFkZXJbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXVswXS50b0xvd2VyQ2FzZSgpIH0gZWxzZSB7IGVuY29kaW5nID0gJzdiaXQnIH1cblxuICAgICAgbGV0IG9uRGF0YSxcbiAgICAgICAgb25FbmRcblxuICAgICAgaWYgKGlzUGFydEFGaWxlKGZpZWxkbmFtZSwgY29udHlwZSwgZmlsZW5hbWUpKSB7XG4gICAgICAgIC8vIGZpbGUvYmluYXJ5IGZpZWxkXG4gICAgICAgIGlmIChuZmlsZXMgPT09IGZpbGVzTGltaXQpIHtcbiAgICAgICAgICBpZiAoIWJveS5oaXRGaWxlc0xpbWl0KSB7XG4gICAgICAgICAgICBib3kuaGl0RmlsZXNMaW1pdCA9IHRydWVcbiAgICAgICAgICAgIGJveS5lbWl0KCdmaWxlc0xpbWl0JylcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNraXBQYXJ0KHBhcnQpXG4gICAgICAgIH1cblxuICAgICAgICArK25maWxlc1xuXG4gICAgICAgIGlmIChib3kubGlzdGVuZXJDb3VudCgnZmlsZScpID09PSAwKSB7XG4gICAgICAgICAgc2VsZi5wYXJzZXIuX2lnbm9yZSgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICArK25lbmRzXG4gICAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZVN0cmVhbShmaWxlT3B0cylcbiAgICAgICAgY3VyRmlsZSA9IGZpbGVcbiAgICAgICAgZmlsZS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC0tbmVuZHNcbiAgICAgICAgICBzZWxmLl9wYXVzZSA9IGZhbHNlXG4gICAgICAgICAgY2hlY2tGaW5pc2hlZCgpXG4gICAgICAgICAgaWYgKHNlbGYuX2NiICYmICFzZWxmLl9uZWVkRHJhaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGNiID0gc2VsZi5fY2JcbiAgICAgICAgICAgIHNlbGYuX2NiID0gdW5kZWZpbmVkXG4gICAgICAgICAgICBjYigpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBmaWxlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICBpZiAoIXNlbGYuX3BhdXNlKSB7IHJldHVybiB9XG4gICAgICAgICAgc2VsZi5fcGF1c2UgPSBmYWxzZVxuICAgICAgICAgIGlmIChzZWxmLl9jYiAmJiAhc2VsZi5fbmVlZERyYWluKSB7XG4gICAgICAgICAgICBjb25zdCBjYiA9IHNlbGYuX2NiXG4gICAgICAgICAgICBzZWxmLl9jYiA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgY2IoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBib3kuZW1pdCgnZmlsZScsIGZpZWxkbmFtZSwgZmlsZSwgZmlsZW5hbWUsIGVuY29kaW5nLCBjb250eXBlKVxuXG4gICAgICAgIG9uRGF0YSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgaWYgKChuc2l6ZSArPSBkYXRhLmxlbmd0aCkgPiBmaWxlU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYWxlbiA9IGZpbGVTaXplTGltaXQgLSBuc2l6ZSArIGRhdGEubGVuZ3RoXG4gICAgICAgICAgICBpZiAoZXh0cmFsZW4gPiAwKSB7IGZpbGUucHVzaChkYXRhLnNsaWNlKDAsIGV4dHJhbGVuKSkgfVxuICAgICAgICAgICAgZmlsZS50cnVuY2F0ZWQgPSB0cnVlXG4gICAgICAgICAgICBmaWxlLmJ5dGVzUmVhZCA9IGZpbGVTaXplTGltaXRcbiAgICAgICAgICAgIHBhcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJylcbiAgICAgICAgICAgIGZpbGUuZW1pdCgnbGltaXQnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfSBlbHNlIGlmICghZmlsZS5wdXNoKGRhdGEpKSB7IHNlbGYuX3BhdXNlID0gdHJ1ZSB9XG5cbiAgICAgICAgICBmaWxlLmJ5dGVzUmVhZCA9IG5zaXplXG4gICAgICAgIH1cblxuICAgICAgICBvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjdXJGaWxlID0gdW5kZWZpbmVkXG4gICAgICAgICAgZmlsZS5wdXNoKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vbi1maWxlIGZpZWxkXG4gICAgICAgIGlmIChuZmllbGRzID09PSBmaWVsZHNMaW1pdCkge1xuICAgICAgICAgIGlmICghYm95LmhpdEZpZWxkc0xpbWl0KSB7XG4gICAgICAgICAgICBib3kuaGl0RmllbGRzTGltaXQgPSB0cnVlXG4gICAgICAgICAgICBib3kuZW1pdCgnZmllbGRzTGltaXQnKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2tpcFBhcnQocGFydClcbiAgICAgICAgfVxuXG4gICAgICAgICsrbmZpZWxkc1xuICAgICAgICArK25lbmRzXG4gICAgICAgIGxldCBidWZmZXIgPSAnJ1xuICAgICAgICBsZXQgdHJ1bmNhdGVkID0gZmFsc2VcbiAgICAgICAgY3VyRmllbGQgPSBwYXJ0XG5cbiAgICAgICAgb25EYXRhID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICBpZiAoKG5zaXplICs9IGRhdGEubGVuZ3RoKSA+IGZpZWxkU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYWxlbiA9IChmaWVsZFNpemVMaW1pdCAtIChuc2l6ZSAtIGRhdGEubGVuZ3RoKSlcbiAgICAgICAgICAgIGJ1ZmZlciArPSBkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCAwLCBleHRyYWxlbilcbiAgICAgICAgICAgIHRydW5jYXRlZCA9IHRydWVcbiAgICAgICAgICAgIHBhcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJylcbiAgICAgICAgICB9IGVsc2UgeyBidWZmZXIgKz0gZGF0YS50b1N0cmluZygnYmluYXJ5JykgfVxuICAgICAgICB9XG5cbiAgICAgICAgb25FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY3VyRmllbGQgPSB1bmRlZmluZWRcbiAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCkgeyBidWZmZXIgPSBkZWNvZGVUZXh0KGJ1ZmZlciwgJ2JpbmFyeScsIGNoYXJzZXQpIH1cbiAgICAgICAgICBib3kuZW1pdCgnZmllbGQnLCBmaWVsZG5hbWUsIGJ1ZmZlciwgZmFsc2UsIHRydW5jYXRlZCwgZW5jb2RpbmcsIGNvbnR5cGUpXG4gICAgICAgICAgLS1uZW5kc1xuICAgICAgICAgIGNoZWNrRmluaXNoZWQoKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIEFzIG9mIG5vZGVAMmVmZTRhYjc2MTY2NiAodjAuMTAuMjkrL3YwLjExLjE0KyksIGJ1c2JveSBoYWQgYmVjb21lXG4gICAgICAgICBicm9rZW4uIFN0cmVhbXMyL3N0cmVhbXMzIGlzIGEgaHVnZSBibGFjayBib3ggb2YgY29uZnVzaW9uLCBidXRcbiAgICAgICAgIHNvbWVob3cgb3ZlcnJpZGluZyB0aGUgc3luYyBzdGF0ZSBzZWVtcyB0byBmaXggdGhpbmdzIGFnYWluIChhbmQgc3RpbGxcbiAgICAgICAgIHNlZW1zIHRvIHdvcmsgZm9yIHByZXZpb3VzIG5vZGUgdmVyc2lvbnMpLlxuICAgICAgKi9cbiAgICAgIHBhcnQuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlXG5cbiAgICAgIHBhcnQub24oJ2RhdGEnLCBvbkRhdGEpXG4gICAgICBwYXJ0Lm9uKCdlbmQnLCBvbkVuZClcbiAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoY3VyRmlsZSkgeyBjdXJGaWxlLmVtaXQoJ2Vycm9yJywgZXJyKSB9XG4gICAgfSlcbiAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGJveS5lbWl0KCdlcnJvcicsIGVycilcbiAgfSkub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBmaW5pc2hlZCA9IHRydWVcbiAgICBjaGVja0ZpbmlzaGVkKClcbiAgfSlcbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgY2IpIHtcbiAgY29uc3QgciA9IHRoaXMucGFyc2VyLndyaXRlKGNodW5rKVxuICBpZiAociAmJiAhdGhpcy5fcGF1c2UpIHtcbiAgICBjYigpXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fbmVlZERyYWluID0gIXJcbiAgICB0aGlzLl9jYiA9IGNiXG4gIH1cbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzXG5cbiAgaWYgKHNlbGYucGFyc2VyLndyaXRhYmxlKSB7XG4gICAgc2VsZi5wYXJzZXIuZW5kKClcbiAgfSBlbHNlIGlmICghc2VsZi5fYm95Ll9kb25lKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9ib3kuX2RvbmUgPSB0cnVlXG4gICAgICBzZWxmLl9ib3kuZW1pdCgnZmluaXNoJylcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHNraXBQYXJ0IChwYXJ0KSB7XG4gIHBhcnQucmVzdW1lKClcbn1cblxuZnVuY3Rpb24gRmlsZVN0cmVhbSAob3B0cykge1xuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdHMpXG5cbiAgdGhpcy5ieXRlc1JlYWQgPSAwXG5cbiAgdGhpcy50cnVuY2F0ZWQgPSBmYWxzZVxufVxuXG5pbmhlcml0cyhGaWxlU3RyZWFtLCBSZWFkYWJsZSlcblxuRmlsZVN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge31cblxubW9kdWxlLmV4cG9ydHMgPSBNdWx0aXBhcnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJFX1BMVVMgPSAvXFwrL2dcblxuY29uc3QgSEVYID0gW1xuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXG5dXG5cbmZ1bmN0aW9uIERlY29kZXIgKCkge1xuICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZFxufVxuRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIC8vIFJlcGxhY2UgJysnIHdpdGggJyAnIGJlZm9yZSBkZWNvZGluZ1xuICBzdHIgPSBzdHIucmVwbGFjZShSRV9QTFVTLCAnICcpXG4gIGxldCByZXMgPSAnJ1xuICBsZXQgaSA9IDA7IGxldCBwID0gMDsgY29uc3QgbGVuID0gc3RyLmxlbmd0aFxuICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghSEVYW3N0ci5jaGFyQ29kZUF0KGkpXSkge1xuICAgICAgICByZXMgKz0gJyUnICsgdGhpcy5idWZmZXJcbiAgICAgICAgdGhpcy5idWZmZXIgPSB1bmRlZmluZWRcbiAgICAgICAgLS1pIC8vIHJldHJ5IGNoYXJhY3RlclxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWZmZXIgKz0gc3RyW2ldXG4gICAgICAgICsrcFxuICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQodGhpcy5idWZmZXIsIDE2KSlcbiAgICAgICAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICclJykge1xuICAgICAgaWYgKGkgPiBwKSB7XG4gICAgICAgIHJlcyArPSBzdHIuc3Vic3RyaW5nKHAsIGkpXG4gICAgICAgIHAgPSBpXG4gICAgICB9XG4gICAgICB0aGlzLmJ1ZmZlciA9ICcnXG4gICAgICArK3BcbiAgICB9XG4gIH1cbiAgaWYgKHAgPCBsZW4gJiYgdGhpcy5idWZmZXIgPT09IHVuZGVmaW5lZCkgeyByZXMgKz0gc3RyLnN1YnN0cmluZyhwKSB9XG4gIHJldHVybiByZXNcbn1cbkRlY29kZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERlY29kZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IERlY29kZXIgPSByZXF1aXJlKCcuLi91dGlscy9EZWNvZGVyJylcbmNvbnN0IGRlY29kZVRleHQgPSByZXF1aXJlKCcuLi91dGlscy9kZWNvZGVUZXh0JylcbmNvbnN0IGdldExpbWl0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0TGltaXQnKVxuXG5jb25zdCBSRV9DSEFSU0VUID0gL15jaGFyc2V0JC9pXG5cblVybEVuY29kZWQuZGV0ZWN0ID0gL15hcHBsaWNhdGlvblxcL3gtd3d3LWZvcm0tdXJsZW5jb2RlZC9pXG5mdW5jdGlvbiBVcmxFbmNvZGVkIChib3ksIGNmZykge1xuICBjb25zdCBsaW1pdHMgPSBjZmcubGltaXRzXG4gIGNvbnN0IHBhcnNlZENvblR5cGUgPSBjZmcucGFyc2VkQ29uVHlwZVxuICB0aGlzLmJveSA9IGJveVxuXG4gIHRoaXMuZmllbGRTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZFNpemUnLCAxICogMTAyNCAqIDEwMjQpXG4gIHRoaXMuZmllbGROYW1lU2l6ZUxpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmllbGROYW1lU2l6ZScsIDEwMClcbiAgdGhpcy5maWVsZHNMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ2ZpZWxkcycsIEluZmluaXR5KVxuXG4gIGxldCBjaGFyc2V0XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJzZWRDb25UeXBlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdmFyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkQ29uVHlwZVtpXSkgJiZcbiAgICAgICAgUkVfQ0hBUlNFVC50ZXN0KHBhcnNlZENvblR5cGVbaV1bMF0pKSB7XG4gICAgICBjaGFyc2V0ID0gcGFyc2VkQ29uVHlwZVtpXVsxXS50b0xvd2VyQ2FzZSgpXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGFyc2V0ID09PSB1bmRlZmluZWQpIHsgY2hhcnNldCA9IGNmZy5kZWZDaGFyc2V0IHx8ICd1dGY4JyB9XG5cbiAgdGhpcy5kZWNvZGVyID0gbmV3IERlY29kZXIoKVxuICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0XG4gIHRoaXMuX2ZpZWxkcyA9IDBcbiAgdGhpcy5fc3RhdGUgPSAna2V5J1xuICB0aGlzLl9jaGVja2luZ0J5dGVzID0gdHJ1ZVxuICB0aGlzLl9ieXRlc0tleSA9IDBcbiAgdGhpcy5fYnl0ZXNWYWwgPSAwXG4gIHRoaXMuX2tleSA9ICcnXG4gIHRoaXMuX3ZhbCA9ICcnXG4gIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgdGhpcy5fdmFsVHJ1bmMgPSBmYWxzZVxuICB0aGlzLl9oaXRMaW1pdCA9IGZhbHNlXG59XG5cblVybEVuY29kZWQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGNiKSB7XG4gIGlmICh0aGlzLl9maWVsZHMgPT09IHRoaXMuZmllbGRzTGltaXQpIHtcbiAgICBpZiAoIXRoaXMuYm95LmhpdEZpZWxkc0xpbWl0KSB7XG4gICAgICB0aGlzLmJveS5oaXRGaWVsZHNMaW1pdCA9IHRydWVcbiAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkc0xpbWl0JylcbiAgICB9XG4gICAgcmV0dXJuIGNiKClcbiAgfVxuXG4gIGxldCBpZHhlcTsgbGV0IGlkeGFtcDsgbGV0IGk7IGxldCBwID0gMDsgY29uc3QgbGVuID0gZGF0YS5sZW5ndGhcblxuICB3aGlsZSAocCA8IGxlbikge1xuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ2tleScpIHtcbiAgICAgIGlkeGVxID0gaWR4YW1wID0gdW5kZWZpbmVkXG4gICAgICBmb3IgKGkgPSBwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrcCB9XG4gICAgICAgIGlmIChkYXRhW2ldID09PSAweDNELyogPSAqLykge1xuICAgICAgICAgIGlkeGVxID0gaVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA9PT0gMHgyNi8qICYgKi8pIHtcbiAgICAgICAgICBpZHhhbXAgPSBpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY2hlY2tpbmdCeXRlcyAmJiB0aGlzLl9ieXRlc0tleSA9PT0gdGhpcy5maWVsZE5hbWVTaXplTGltaXQpIHtcbiAgICAgICAgICB0aGlzLl9oaXRMaW1pdCA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NoZWNraW5nQnl0ZXMpIHsgKyt0aGlzLl9ieXRlc0tleSB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpZHhlcSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGtleSB3aXRoIGFzc2lnbm1lbnRcbiAgICAgICAgaWYgKGlkeGVxID4gcCkgeyB0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGlkeGVxKSkgfVxuICAgICAgICB0aGlzLl9zdGF0ZSA9ICd2YWwnXG5cbiAgICAgICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZVxuICAgICAgICB0aGlzLl9jaGVja2luZ0J5dGVzID0gdHJ1ZVxuICAgICAgICB0aGlzLl92YWwgPSAnJ1xuICAgICAgICB0aGlzLl9ieXRlc1ZhbCA9IDBcbiAgICAgICAgdGhpcy5fdmFsVHJ1bmMgPSBmYWxzZVxuICAgICAgICB0aGlzLmRlY29kZXIucmVzZXQoKVxuXG4gICAgICAgIHAgPSBpZHhlcSArIDFcbiAgICAgIH0gZWxzZSBpZiAoaWR4YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8ga2V5IHdpdGggbm8gYXNzaWdubWVudFxuICAgICAgICArK3RoaXMuX2ZpZWxkc1xuICAgICAgICBsZXQga2V5OyBjb25zdCBrZXlUcnVuYyA9IHRoaXMuX2tleVRydW5jXG4gICAgICAgIGlmIChpZHhhbXAgPiBwKSB7IGtleSA9ICh0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGlkeGFtcCkpKSB9IGVsc2UgeyBrZXkgPSB0aGlzLl9rZXkgfVxuXG4gICAgICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2VcbiAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IHRydWVcbiAgICAgICAgdGhpcy5fa2V5ID0gJydcbiAgICAgICAgdGhpcy5fYnl0ZXNLZXkgPSAwXG4gICAgICAgIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgICAgICAgdGhpcy5kZWNvZGVyLnJlc2V0KClcblxuICAgICAgICBpZiAoa2V5Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dChrZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICBrZXlUcnVuYyxcbiAgICAgICAgICAgIGZhbHNlKVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IGlkeGFtcCArIDFcbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcyA9PT0gdGhpcy5maWVsZHNMaW1pdCkgeyByZXR1cm4gY2IoKSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2hpdExpbWl0KSB7XG4gICAgICAgIC8vIHdlIG1heSBub3QgaGF2ZSBoaXQgdGhlIGFjdHVhbCBsaW1pdCBpZiB0aGVyZSBhcmUgZW5jb2RlZCBieXRlcy4uLlxuICAgICAgICBpZiAoaSA+IHApIHsgdGhpcy5fa2V5ICs9IHRoaXMuZGVjb2Rlci53cml0ZShkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBwLCBpKSkgfVxuICAgICAgICBwID0gaVxuICAgICAgICBpZiAoKHRoaXMuX2J5dGVzS2V5ID0gdGhpcy5fa2V5Lmxlbmd0aCkgPT09IHRoaXMuZmllbGROYW1lU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgLy8geWVwLCB3ZSBhY3R1YWxseSBkaWQgaGl0IHRoZSBsaW1pdFxuICAgICAgICAgIHRoaXMuX2NoZWNraW5nQnl0ZXMgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuX2tleVRydW5jID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocCA8IGxlbikgeyB0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHApKSB9XG4gICAgICAgIHAgPSBsZW5cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWR4YW1wID0gdW5kZWZpbmVkXG4gICAgICBmb3IgKGkgPSBwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrcCB9XG4gICAgICAgIGlmIChkYXRhW2ldID09PSAweDI2LyogJiAqLykge1xuICAgICAgICAgIGlkeGFtcCA9IGlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaGVja2luZ0J5dGVzICYmIHRoaXMuX2J5dGVzVmFsID09PSB0aGlzLmZpZWxkU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgdGhpcy5faGl0TGltaXQgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrdGhpcy5fYnl0ZXNWYWwgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaWR4YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKyt0aGlzLl9maWVsZHNcbiAgICAgICAgaWYgKGlkeGFtcCA+IHApIHsgdGhpcy5fdmFsICs9IHRoaXMuZGVjb2Rlci53cml0ZShkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBwLCBpZHhhbXApKSB9XG4gICAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgICAgIGRlY29kZVRleHQodGhpcy5fdmFsLCAnYmluYXJ5JywgdGhpcy5jaGFyc2V0KSxcbiAgICAgICAgICB0aGlzLl9rZXlUcnVuYyxcbiAgICAgICAgICB0aGlzLl92YWxUcnVuYylcbiAgICAgICAgdGhpcy5fc3RhdGUgPSAna2V5J1xuXG4gICAgICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2VcbiAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IHRydWVcbiAgICAgICAgdGhpcy5fa2V5ID0gJydcbiAgICAgICAgdGhpcy5fYnl0ZXNLZXkgPSAwXG4gICAgICAgIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgICAgICAgdGhpcy5kZWNvZGVyLnJlc2V0KClcblxuICAgICAgICBwID0gaWR4YW1wICsgMVxuICAgICAgICBpZiAodGhpcy5fZmllbGRzID09PSB0aGlzLmZpZWxkc0xpbWl0KSB7IHJldHVybiBjYigpIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5faGl0TGltaXQpIHtcbiAgICAgICAgLy8gd2UgbWF5IG5vdCBoYXZlIGhpdCB0aGUgYWN0dWFsIGxpbWl0IGlmIHRoZXJlIGFyZSBlbmNvZGVkIGJ5dGVzLi4uXG4gICAgICAgIGlmIChpID4gcCkgeyB0aGlzLl92YWwgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGkpKSB9XG4gICAgICAgIHAgPSBpXG4gICAgICAgIGlmICgodGhpcy5fdmFsID09PSAnJyAmJiB0aGlzLmZpZWxkU2l6ZUxpbWl0ID09PSAwKSB8fFxuICAgICAgICAgICAgKHRoaXMuX2J5dGVzVmFsID0gdGhpcy5fdmFsLmxlbmd0aCkgPT09IHRoaXMuZmllbGRTaXplTGltaXQpIHtcbiAgICAgICAgICAvLyB5ZXAsIHdlIGFjdHVhbGx5IGRpZCBoaXQgdGhlIGxpbWl0XG4gICAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5fdmFsVHJ1bmMgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwIDwgbGVuKSB7IHRoaXMuX3ZhbCArPSB0aGlzLmRlY29kZXIud3JpdGUoZGF0YS50b1N0cmluZygnYmluYXJ5JywgcCkpIH1cbiAgICAgICAgcCA9IGxlblxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYigpXG59XG5cblVybEVuY29kZWQucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYm95Ll9kb25lKSB7IHJldHVybiB9XG5cbiAgaWYgKHRoaXMuX3N0YXRlID09PSAna2V5JyAmJiB0aGlzLl9rZXkubGVuZ3RoID4gMCkge1xuICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgJycsXG4gICAgICB0aGlzLl9rZXlUcnVuYyxcbiAgICAgIGZhbHNlKVxuICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlID09PSAndmFsJykge1xuICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgZGVjb2RlVGV4dCh0aGlzLl92YWwsICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgdGhpcy5fa2V5VHJ1bmMsXG4gICAgICB0aGlzLl92YWxUcnVuYylcbiAgfVxuICB0aGlzLmJveS5fZG9uZSA9IHRydWVcbiAgdGhpcy5ib3kuZW1pdCgnZmluaXNoJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBVcmxFbmNvZGVkXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBXcml0YWJsZVN0cmVhbSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJykuV3JpdGFibGVcbmNvbnN0IHsgaW5oZXJpdHMgfSA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpXG5jb25zdCBEaWNlciA9IHJlcXVpcmUoJy4uL2RlcHMvZGljZXIvbGliL0RpY2VyJylcblxuY29uc3QgTXVsdGlwYXJ0UGFyc2VyID0gcmVxdWlyZSgnLi90eXBlcy9tdWx0aXBhcnQnKVxuY29uc3QgVXJsZW5jb2RlZFBhcnNlciA9IHJlcXVpcmUoJy4vdHlwZXMvdXJsZW5jb2RlZCcpXG5jb25zdCBwYXJzZVBhcmFtcyA9IHJlcXVpcmUoJy4vdXRpbHMvcGFyc2VQYXJhbXMnKVxuXG5mdW5jdGlvbiBCdXNib3kgKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1c2JveSkpIHsgcmV0dXJuIG5ldyBCdXNib3kob3B0cykgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdXNib3kgZXhwZWN0ZWQgYW4gb3B0aW9ucy1PYmplY3QuJylcbiAgfVxuICBpZiAodHlwZW9mIG9wdHMuaGVhZGVycyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdXNib3kgZXhwZWN0ZWQgYW4gb3B0aW9ucy1PYmplY3Qgd2l0aCBoZWFkZXJzLWF0dHJpYnV0ZS4nKVxuICB9XG4gIGlmICh0eXBlb2Ygb3B0cy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIENvbnRlbnQtVHlwZS1oZWFkZXIuJylcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBoZWFkZXJzLFxuICAgIC4uLnN0cmVhbU9wdGlvbnNcbiAgfSA9IG9wdHNcblxuICB0aGlzLm9wdHMgPSB7XG4gICAgYXV0b0Rlc3Ryb3k6IGZhbHNlLFxuICAgIC4uLnN0cmVhbU9wdGlvbnNcbiAgfVxuICBXcml0YWJsZVN0cmVhbS5jYWxsKHRoaXMsIHRoaXMub3B0cylcblxuICB0aGlzLl9kb25lID0gZmFsc2VcbiAgdGhpcy5fcGFyc2VyID0gdGhpcy5nZXRQYXJzZXJCeUhlYWRlcnMoaGVhZGVycylcbiAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZVxufVxuaW5oZXJpdHMoQnVzYm95LCBXcml0YWJsZVN0cmVhbSlcblxuQnVzYm95LnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKGV2KSB7XG4gIGlmIChldiA9PT0gJ2ZpbmlzaCcpIHtcbiAgICBpZiAoIXRoaXMuX2RvbmUpIHtcbiAgICAgIHRoaXMuX3BhcnNlcj8uZW5kKClcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSBpZiAodGhpcy5fZmluaXNoZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLl9maW5pc2hlZCA9IHRydWVcbiAgfVxuICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuZW1pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1c2JveS5wcm90b3R5cGUuZ2V0UGFyc2VyQnlIZWFkZXJzID0gZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VQYXJhbXMoaGVhZGVyc1snY29udGVudC10eXBlJ10pXG5cbiAgY29uc3QgY2ZnID0ge1xuICAgIGRlZkNoYXJzZXQ6IHRoaXMub3B0cy5kZWZDaGFyc2V0LFxuICAgIGZpbGVId206IHRoaXMub3B0cy5maWxlSHdtLFxuICAgIGhlYWRlcnMsXG4gICAgaGlnaFdhdGVyTWFyazogdGhpcy5vcHRzLmhpZ2hXYXRlck1hcmssXG4gICAgaXNQYXJ0QUZpbGU6IHRoaXMub3B0cy5pc1BhcnRBRmlsZSxcbiAgICBsaW1pdHM6IHRoaXMub3B0cy5saW1pdHMsXG4gICAgcGFyc2VkQ29uVHlwZTogcGFyc2VkLFxuICAgIHByZXNlcnZlUGF0aDogdGhpcy5vcHRzLnByZXNlcnZlUGF0aFxuICB9XG5cbiAgaWYgKE11bHRpcGFydFBhcnNlci5kZXRlY3QudGVzdChwYXJzZWRbMF0pKSB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aXBhcnRQYXJzZXIodGhpcywgY2ZnKVxuICB9XG4gIGlmIChVcmxlbmNvZGVkUGFyc2VyLmRldGVjdC50ZXN0KHBhcnNlZFswXSkpIHtcbiAgICByZXR1cm4gbmV3IFVybGVuY29kZWRQYXJzZXIodGhpcywgY2ZnKVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgQ29udGVudC1UeXBlLicpXG59XG5cbkJ1c2JveS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5fcGFyc2VyLndyaXRlKGNodW5rLCBjYilcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBCdXNib3lcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBCdXNib3lcbm1vZHVsZS5leHBvcnRzLkJ1c2JveSA9IEJ1c2JveVxuXG5tb2R1bGUuZXhwb3J0cy5EaWNlciA9IERpY2VyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE1lc3NhZ2VDaGFubmVsLCByZWNlaXZlTWVzc2FnZU9uUG9ydCB9ID0gcmVxdWlyZSgnd29ya2VyX3RocmVhZHMnKVxuXG5jb25zdCBjb3JzU2FmZUxpc3RlZE1ldGhvZHMgPSBbJ0dFVCcsICdIRUFEJywgJ1BPU1QnXVxuY29uc3QgY29yc1NhZmVMaXN0ZWRNZXRob2RzU2V0ID0gbmV3IFNldChjb3JzU2FmZUxpc3RlZE1ldGhvZHMpXG5cbmNvbnN0IG51bGxCb2R5U3RhdHVzID0gWzEwMSwgMjA0LCAyMDUsIDMwNF1cblxuY29uc3QgcmVkaXJlY3RTdGF0dXMgPSBbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdXG5jb25zdCByZWRpcmVjdFN0YXR1c1NldCA9IG5ldyBTZXQocmVkaXJlY3RTdGF0dXMpXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNibG9jay1iYWQtcG9ydFxuY29uc3QgYmFkUG9ydHMgPSBbXG4gICcxJywgJzcnLCAnOScsICcxMScsICcxMycsICcxNScsICcxNycsICcxOScsICcyMCcsICcyMScsICcyMicsICcyMycsICcyNScsICczNycsICc0MicsICc0MycsICc1MycsICc2OScsICc3NycsICc3OScsXG4gICc4NycsICc5NScsICcxMDEnLCAnMTAyJywgJzEwMycsICcxMDQnLCAnMTA5JywgJzExMCcsICcxMTEnLCAnMTEzJywgJzExNScsICcxMTcnLCAnMTE5JywgJzEyMycsICcxMzUnLCAnMTM3JyxcbiAgJzEzOScsICcxNDMnLCAnMTYxJywgJzE3OScsICczODknLCAnNDI3JywgJzQ2NScsICc1MTInLCAnNTEzJywgJzUxNCcsICc1MTUnLCAnNTI2JywgJzUzMCcsICc1MzEnLCAnNTMyJyxcbiAgJzU0MCcsICc1NDgnLCAnNTU0JywgJzU1NicsICc1NjMnLCAnNTg3JywgJzYwMScsICc2MzYnLCAnOTg5JywgJzk5MCcsICc5OTMnLCAnOTk1JywgJzE3MTknLCAnMTcyMCcsICcxNzIzJyxcbiAgJzIwNDknLCAnMzY1OScsICc0MDQ1JywgJzUwNjAnLCAnNTA2MScsICc2MDAwJywgJzY1NjYnLCAnNjY2NScsICc2NjY2JywgJzY2NjcnLCAnNjY2OCcsICc2NjY5JywgJzY2OTcnLFxuICAnMTAwODAnXG5dXG5cbmNvbnN0IGJhZFBvcnRzU2V0ID0gbmV3IFNldChiYWRQb3J0cylcblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1yZWZlcnJlci1wb2xpY3kvI3JlZmVycmVyLXBvbGljaWVzXG5jb25zdCByZWZlcnJlclBvbGljeSA9IFtcbiAgJycsXG4gICduby1yZWZlcnJlcicsXG4gICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZScsXG4gICdzYW1lLW9yaWdpbicsXG4gICdvcmlnaW4nLFxuICAnc3RyaWN0LW9yaWdpbicsXG4gICdvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nLFxuICAnc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbicsXG4gICd1bnNhZmUtdXJsJ1xuXVxuY29uc3QgcmVmZXJyZXJQb2xpY3lTZXQgPSBuZXcgU2V0KHJlZmVycmVyUG9saWN5KVxuXG5jb25zdCByZXF1ZXN0UmVkaXJlY3QgPSBbJ2ZvbGxvdycsICdtYW51YWwnLCAnZXJyb3InXVxuXG5jb25zdCBzYWZlTWV0aG9kcyA9IFsnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdUUkFDRSddXG5jb25zdCBzYWZlTWV0aG9kc1NldCA9IG5ldyBTZXQoc2FmZU1ldGhvZHMpXG5cbmNvbnN0IHJlcXVlc3RNb2RlID0gWyduYXZpZ2F0ZScsICdzYW1lLW9yaWdpbicsICduby1jb3JzJywgJ2NvcnMnXVxuXG5jb25zdCByZXF1ZXN0Q3JlZGVudGlhbHMgPSBbJ29taXQnLCAnc2FtZS1vcmlnaW4nLCAnaW5jbHVkZSddXG5cbmNvbnN0IHJlcXVlc3RDYWNoZSA9IFtcbiAgJ2RlZmF1bHQnLFxuICAnbm8tc3RvcmUnLFxuICAncmVsb2FkJyxcbiAgJ25vLWNhY2hlJyxcbiAgJ2ZvcmNlLWNhY2hlJyxcbiAgJ29ubHktaWYtY2FjaGVkJ1xuXVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdC1ib2R5LWhlYWRlci1uYW1lXG5jb25zdCByZXF1ZXN0Qm9keUhlYWRlciA9IFtcbiAgJ2NvbnRlbnQtZW5jb2RpbmcnLFxuICAnY29udGVudC1sYW5ndWFnZScsXG4gICdjb250ZW50LWxvY2F0aW9uJyxcbiAgJ2NvbnRlbnQtdHlwZScsXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMjAyMVxuICAvLyAnQ29udGVudC1MZW5ndGgnIGlzIGEgZm9yYmlkZGVuIGhlYWRlciBuYW1lLCB3aGljaCBpcyB0eXBpY2FsbHlcbiAgLy8gcmVtb3ZlZCBpbiB0aGUgSGVhZGVycyBpbXBsZW1lbnRhdGlvbi4gSG93ZXZlciwgdW5kaWNpIGRvZXNuJ3RcbiAgLy8gZmlsdGVyIG91dCBoZWFkZXJzLCBzbyB3ZSBhZGQgaXQgaGVyZS5cbiAgJ2NvbnRlbnQtbGVuZ3RoJ1xuXVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZW51bWRlZi1yZXF1ZXN0ZHVwbGV4XG5jb25zdCByZXF1ZXN0RHVwbGV4ID0gW1xuICAnaGFsZidcbl1cblxuLy8gaHR0cDovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZm9yYmlkZGVuLW1ldGhvZFxuY29uc3QgZm9yYmlkZGVuTWV0aG9kcyA9IFsnQ09OTkVDVCcsICdUUkFDRScsICdUUkFDSyddXG5jb25zdCBmb3JiaWRkZW5NZXRob2RzU2V0ID0gbmV3IFNldChmb3JiaWRkZW5NZXRob2RzKVxuXG5jb25zdCBzdWJyZXNvdXJjZSA9IFtcbiAgJ2F1ZGlvJyxcbiAgJ2F1ZGlvd29ya2xldCcsXG4gICdmb250JyxcbiAgJ2ltYWdlJyxcbiAgJ21hbmlmZXN0JyxcbiAgJ3BhaW50d29ya2xldCcsXG4gICdzY3JpcHQnLFxuICAnc3R5bGUnLFxuICAndHJhY2snLFxuICAndmlkZW8nLFxuICAneHNsdCcsXG4gICcnXG5dXG5jb25zdCBzdWJyZXNvdXJjZVNldCA9IG5ldyBTZXQoc3VicmVzb3VyY2UpXG5cbi8qKiBAdHlwZSB7Z2xvYmFsVGhpc1snRE9NRXhjZXB0aW9uJ119ICovXG5jb25zdCBET01FeGNlcHRpb24gPSBnbG9iYWxUaGlzLkRPTUV4Y2VwdGlvbiA/PyAoKCkgPT4ge1xuICAvLyBET01FeGNlcHRpb24gd2FzIG9ubHkgbWFkZSBhIGdsb2JhbCBpbiBOb2RlIHYxNy4wLjAsXG4gIC8vIGJ1dCBmZXRjaCBzdXBwb3J0cyA+PSB2MTYuOC5cbiAgdHJ5IHtcbiAgICBhdG9iKCd+JylcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihlcnIpLmNvbnN0cnVjdG9yXG4gIH1cbn0pKClcblxubGV0IGNoYW5uZWxcblxuLyoqIEB0eXBlIHtnbG9iYWxUaGlzWydzdHJ1Y3R1cmVkQ2xvbmUnXX0gKi9cbmNvbnN0IHN0cnVjdHVyZWRDbG9uZSA9XG4gIGdsb2JhbFRoaXMuc3RydWN0dXJlZENsb25lID8/XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL2IyN2FlMjRkY2M0MjUxYmFkNzI2ZDlkODRiYWY2NzhkMWY3MDdmZWQvbGliL2ludGVybmFsL3N0cnVjdHVyZWRfY2xvbmUuanNcbiAgLy8gc3RydWN0dXJlZENsb25lIHdhcyBhZGRlZCBpbiB2MTcuMC4wLCBidXQgZmV0Y2ggc3VwcG9ydHMgdjE2LjhcbiAgZnVuY3Rpb24gc3RydWN0dXJlZENsb25lICh2YWx1ZSwgb3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNzaW5nIGFyZ3VtZW50JylcbiAgICB9XG5cbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKVxuICAgIH1cbiAgICBjaGFubmVsLnBvcnQxLnVucmVmKClcbiAgICBjaGFubmVsLnBvcnQyLnVucmVmKClcbiAgICBjaGFubmVsLnBvcnQxLnBvc3RNZXNzYWdlKHZhbHVlLCBvcHRpb25zPy50cmFuc2ZlcilcbiAgICByZXR1cm4gcmVjZWl2ZU1lc3NhZ2VPblBvcnQoY2hhbm5lbC5wb3J0MikubWVzc2FnZVxuICB9XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBET01FeGNlcHRpb24sXG4gIHN0cnVjdHVyZWRDbG9uZSxcbiAgc3VicmVzb3VyY2UsXG4gIGZvcmJpZGRlbk1ldGhvZHMsXG4gIHJlcXVlc3RCb2R5SGVhZGVyLFxuICByZWZlcnJlclBvbGljeSxcbiAgcmVxdWVzdFJlZGlyZWN0LFxuICByZXF1ZXN0TW9kZSxcbiAgcmVxdWVzdENyZWRlbnRpYWxzLFxuICByZXF1ZXN0Q2FjaGUsXG4gIHJlZGlyZWN0U3RhdHVzLFxuICBjb3JzU2FmZUxpc3RlZE1ldGhvZHMsXG4gIG51bGxCb2R5U3RhdHVzLFxuICBzYWZlTWV0aG9kcyxcbiAgYmFkUG9ydHMsXG4gIHJlcXVlc3REdXBsZXgsXG4gIHN1YnJlc291cmNlU2V0LFxuICBiYWRQb3J0c1NldCxcbiAgcmVkaXJlY3RTdGF0dXNTZXQsXG4gIGNvcnNTYWZlTGlzdGVkTWV0aG9kc1NldCxcbiAgc2FmZU1ldGhvZHNTZXQsXG4gIGZvcmJpZGRlbk1ldGhvZHNTZXQsXG4gIHJlZmVycmVyUG9saWN5U2V0XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBJbiBjYXNlIG9mIGJyZWFraW5nIGNoYW5nZXMsIGluY3JlYXNlIHRoZSB2ZXJzaW9uXG4vLyBudW1iZXIgdG8gYXZvaWQgY29uZmxpY3RzLlxuY29uc3QgZ2xvYmFsT3JpZ2luID0gU3ltYm9sLmZvcigndW5kaWNpLmdsb2JhbE9yaWdpbi4xJylcblxuZnVuY3Rpb24gZ2V0R2xvYmFsT3JpZ2luICgpIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXNbZ2xvYmFsT3JpZ2luXVxufVxuXG5mdW5jdGlvbiBzZXRHbG9iYWxPcmlnaW4gKG5ld09yaWdpbikge1xuICBpZiAobmV3T3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgZ2xvYmFsT3JpZ2luLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgICB9KVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBwYXJzZWRVUkwgPSBuZXcgVVJMKG5ld09yaWdpbilcblxuICBpZiAocGFyc2VkVVJMLnByb3RvY29sICE9PSAnaHR0cDonICYmIHBhcnNlZFVSTC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBPbmx5IGh0dHAgJiBodHRwcyB1cmxzIGFyZSBhbGxvd2VkLCByZWNlaXZlZCAke3BhcnNlZFVSTC5wcm90b2NvbH1gKVxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIGdsb2JhbE9yaWdpbiwge1xuICAgIHZhbHVlOiBwYXJzZWRVUkwsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0R2xvYmFsT3JpZ2luLFxuICBzZXRHbG9iYWxPcmlnaW5cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcmVkaXJlY3RTdGF0dXNTZXQsIHJlZmVycmVyUG9saWN5U2V0OiByZWZlcnJlclBvbGljeVRva2VucywgYmFkUG9ydHNTZXQgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2dsb2JhbCcpXG5jb25zdCB7IHBlcmZvcm1hbmNlIH0gPSByZXF1aXJlKCdwZXJmX2hvb2tzJylcbmNvbnN0IHsgaXNCbG9iTGlrZSwgdG9VU1ZTdHJpbmcsIFJlYWRhYmxlU3RyZWFtRnJvbSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGlzVWludDhBcnJheSB9ID0gcmVxdWlyZSgndXRpbC90eXBlcycpXG5cbmxldCBzdXBwb3J0ZWRIYXNoZXMgPSBbXVxuXG4vLyBodHRwczovL25vZGVqcy5vcmcvYXBpL2NyeXB0by5odG1sI2RldGVybWluaW5nLWlmLWNyeXB0by1zdXBwb3J0LWlzLXVuYXZhaWxhYmxlXG4vKiogQHR5cGUge2ltcG9ydCgnY3J5cHRvJyl8dW5kZWZpbmVkfSAqL1xubGV0IGNyeXB0b1xuXG50cnkge1xuICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKVxuICBjb25zdCBwb3NzaWJsZVJlbGV2YW50SGFzaGVzID0gWydzaGEyNTYnLCAnc2hhMzg0JywgJ3NoYTUxMiddXG4gIHN1cHBvcnRlZEhhc2hlcyA9IGNyeXB0by5nZXRIYXNoZXMoKS5maWx0ZXIoKGhhc2gpID0+IHBvc3NpYmxlUmVsZXZhbnRIYXNoZXMuaW5jbHVkZXMoaGFzaCkpXG4vKiBjOCBpZ25vcmUgbmV4dCAzICovXG59IGNhdGNoIHtcbn1cblxuZnVuY3Rpb24gcmVzcG9uc2VVUkwgKHJlc3BvbnNlKSB7XG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZXNcbiAgLy8gQSByZXNwb25zZSBoYXMgYW4gYXNzb2NpYXRlZCBVUkwuIEl0IGlzIGEgcG9pbnRlciB0byB0aGUgbGFzdCBVUkxcbiAgLy8gaW4gcmVzcG9uc2XigJlzIFVSTCBsaXN0IGFuZCBudWxsIGlmIHJlc3BvbnNl4oCZcyBVUkwgbGlzdCBpcyBlbXB0eS5cbiAgY29uc3QgdXJsTGlzdCA9IHJlc3BvbnNlLnVybExpc3RcbiAgY29uc3QgbGVuZ3RoID0gdXJsTGlzdC5sZW5ndGhcbiAgcmV0dXJuIGxlbmd0aCA9PT0gMCA/IG51bGwgOiB1cmxMaXN0W2xlbmd0aCAtIDFdLnRvU3RyaW5nKClcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtcmVzcG9uc2UtbG9jYXRpb24tdXJsXG5mdW5jdGlvbiByZXNwb25zZUxvY2F0aW9uVVJMIChyZXNwb25zZSwgcmVxdWVzdEZyYWdtZW50KSB7XG4gIC8vIDEuIElmIHJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgbm90IGEgcmVkaXJlY3Qgc3RhdHVzLCB0aGVuIHJldHVybiBudWxsLlxuICBpZiAoIXJlZGlyZWN0U3RhdHVzU2V0LmhhcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIDIuIExldCBsb2NhdGlvbiBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzIGdpdmVuXG4gIC8vIGBMb2NhdGlvbmAgYW5kIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdC5cbiAgbGV0IGxvY2F0aW9uID0gcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdsb2NhdGlvbicpXG5cbiAgLy8gMy4gSWYgbG9jYXRpb24gaXMgYSBoZWFkZXIgdmFsdWUsIHRoZW4gc2V0IGxvY2F0aW9uIHRvIHRoZSByZXN1bHQgb2ZcbiAgLy8gICAgcGFyc2luZyBsb2NhdGlvbiB3aXRoIHJlc3BvbnNl4oCZcyBVUkwuXG4gIGlmIChsb2NhdGlvbiAhPT0gbnVsbCAmJiBpc1ZhbGlkSGVhZGVyVmFsdWUobG9jYXRpb24pKSB7XG4gICAgbG9jYXRpb24gPSBuZXcgVVJMKGxvY2F0aW9uLCByZXNwb25zZVVSTChyZXNwb25zZSkpXG4gIH1cblxuICAvLyA0LiBJZiBsb2NhdGlvbiBpcyBhIFVSTCB3aG9zZSBmcmFnbWVudCBpcyBudWxsLCB0aGVuIHNldCBsb2NhdGlvbuKAmXNcbiAgLy8gZnJhZ21lbnQgdG8gcmVxdWVzdEZyYWdtZW50LlxuICBpZiAobG9jYXRpb24gJiYgIWxvY2F0aW9uLmhhc2gpIHtcbiAgICBsb2NhdGlvbi5oYXNoID0gcmVxdWVzdEZyYWdtZW50XG4gIH1cblxuICAvLyA1LiBSZXR1cm4gbG9jYXRpb24uXG4gIHJldHVybiBsb2NhdGlvblxufVxuXG4vKiogQHJldHVybnMge1VSTH0gKi9cbmZ1bmN0aW9uIHJlcXVlc3RDdXJyZW50VVJMIChyZXF1ZXN0KSB7XG4gIHJldHVybiByZXF1ZXN0LnVybExpc3RbcmVxdWVzdC51cmxMaXN0Lmxlbmd0aCAtIDFdXG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RCYWRQb3J0IChyZXF1ZXN0KSB7XG4gIC8vIDEuIExldCB1cmwgYmUgcmVxdWVzdOKAmXMgY3VycmVudCBVUkwuXG4gIGNvbnN0IHVybCA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG5cbiAgLy8gMi4gSWYgdXJs4oCZcyBzY2hlbWUgaXMgYW4gSFRUUChTKSBzY2hlbWUgYW5kIHVybOKAmXMgcG9ydCBpcyBhIGJhZCBwb3J0LFxuICAvLyB0aGVuIHJldHVybiBibG9ja2VkLlxuICBpZiAodXJsSXNIdHRwSHR0cHNTY2hlbWUodXJsKSAmJiBiYWRQb3J0c1NldC5oYXModXJsLnBvcnQpKSB7XG4gICAgcmV0dXJuICdibG9ja2VkJ1xuICB9XG5cbiAgLy8gMy4gUmV0dXJuIGFsbG93ZWQuXG4gIHJldHVybiAnYWxsb3dlZCdcbn1cblxuZnVuY3Rpb24gaXNFcnJvckxpa2UgKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgRXJyb3IgfHwgKFxuICAgIG9iamVjdD8uY29uc3RydWN0b3I/Lm5hbWUgPT09ICdFcnJvcicgfHxcbiAgICBvYmplY3Q/LmNvbnN0cnVjdG9yPy5uYW1lID09PSAnRE9NRXhjZXB0aW9uJ1xuICApXG59XG5cbi8vIENoZWNrIHdoZXRoZXIgfHN0YXR1c1RleHR8IGlzIGEgQnl0ZVN0cmluZyBhbmRcbi8vIG1hdGNoZXMgdGhlIFJlYXNvbi1QaHJhc2UgdG9rZW4gcHJvZHVjdGlvbi5cbi8vIFJGQyAyNjE2OiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjYxNlxuLy8gUkZDIDcyMzA6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwXG4vLyBcInJlYXNvbi1waHJhc2UgPSAqKCBIVEFCIC8gU1AgLyBWQ0hBUiAvIG9icy10ZXh0IClcIlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Nocm9taXVtL2Nocm9taXVtL2Jsb2IvOTQuMC40NjA0LjEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9mZXRjaC9yZXNwb25zZS5jYyNMMTE2XG5mdW5jdGlvbiBpc1ZhbGlkUmVhc29uUGhyYXNlIChzdGF0dXNUZXh0KSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdHVzVGV4dC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGMgPSBzdGF0dXNUZXh0LmNoYXJDb2RlQXQoaSlcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICAoXG4gICAgICAgICAgYyA9PT0gMHgwOSB8fCAvLyBIVEFCXG4gICAgICAgICAgKGMgPj0gMHgyMCAmJiBjIDw9IDB4N2UpIHx8IC8vIFNQIC8gVkNIQVJcbiAgICAgICAgICAoYyA+PSAweDgwICYmIGMgPD0gMHhmZilcbiAgICAgICAgKSAvLyBvYnMtdGV4dFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMi42XG4gKiBAcGFyYW0ge251bWJlcn0gY1xuICovXG5mdW5jdGlvbiBpc1Rva2VuQ2hhckNvZGUgKGMpIHtcbiAgc3dpdGNoIChjKSB7XG4gICAgY2FzZSAweDIyOlxuICAgIGNhc2UgMHgyODpcbiAgICBjYXNlIDB4Mjk6XG4gICAgY2FzZSAweDJjOlxuICAgIGNhc2UgMHgyZjpcbiAgICBjYXNlIDB4M2E6XG4gICAgY2FzZSAweDNiOlxuICAgIGNhc2UgMHgzYzpcbiAgICBjYXNlIDB4M2Q6XG4gICAgY2FzZSAweDNlOlxuICAgIGNhc2UgMHgzZjpcbiAgICBjYXNlIDB4NDA6XG4gICAgY2FzZSAweDViOlxuICAgIGNhc2UgMHg1YzpcbiAgICBjYXNlIDB4NWQ6XG4gICAgY2FzZSAweDdiOlxuICAgIGNhc2UgMHg3ZDpcbiAgICAgIC8vIERRVU9URSBhbmQgXCIoKSwvOjs8PT4/QFtcXF17fVwiXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVkNIQVIgJXgyMS03RVxuICAgICAgcmV0dXJuIGMgPj0gMHgyMSAmJiBjIDw9IDB4N2VcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRIVFRQVG9rZW4gKGNoYXJhY3RlcnMpIHtcbiAgaWYgKGNoYXJhY3RlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyYWN0ZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCFpc1Rva2VuQ2hhckNvZGUoY2hhcmFjdGVycy5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLW5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwb3RlbnRpYWxWYWx1ZVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkSGVhZGVyTmFtZSAocG90ZW50aWFsVmFsdWUpIHtcbiAgcmV0dXJuIGlzVmFsaWRIVFRQVG9rZW4ocG90ZW50aWFsVmFsdWUpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLXZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcG90ZW50aWFsVmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEhlYWRlclZhbHVlIChwb3RlbnRpYWxWYWx1ZSkge1xuICAvLyAtIEhhcyBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIEhUVFAgdGFiIG9yIHNwYWNlIGJ5dGVzLlxuICAvLyAtIENvbnRhaW5zIG5vIDB4MDAgKE5VTCkgb3IgSFRUUCBuZXdsaW5lIGJ5dGVzLlxuICBpZiAoXG4gICAgcG90ZW50aWFsVmFsdWUuc3RhcnRzV2l0aCgnXFx0JykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5zdGFydHNXaXRoKCcgJykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5lbmRzV2l0aCgnXFx0JykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5lbmRzV2l0aCgnICcpXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXDAnKSB8fFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXHInKSB8fFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXG4nKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtcmVmZXJyZXItcG9saWN5LyNzZXQtcmVxdWVzdHMtcmVmZXJyZXItcG9saWN5LW9uLXJlZGlyZWN0XG5mdW5jdGlvbiBzZXRSZXF1ZXN0UmVmZXJyZXJQb2xpY3lPblJlZGlyZWN0IChyZXF1ZXN0LCBhY3R1YWxSZXNwb25zZSkge1xuICAvLyAgR2l2ZW4gYSByZXF1ZXN0IHJlcXVlc3QgYW5kIGEgcmVzcG9uc2UgYWN0dWFsUmVzcG9uc2UsIHRoaXMgYWxnb3JpdGhtXG4gIC8vICB1cGRhdGVzIHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSBhY2NvcmRpbmcgdG8gdGhlIFJlZmVycmVyLVBvbGljeVxuICAvLyAgaGVhZGVyIChpZiBhbnkpIGluIGFjdHVhbFJlc3BvbnNlLlxuXG4gIC8vIDEuIExldCBwb2xpY3kgYmUgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgwqcgOC4xIFBhcnNlIGEgcmVmZXJyZXIgcG9saWN5XG4gIC8vIGZyb20gYSBSZWZlcnJlci1Qb2xpY3kgaGVhZGVyIG9uIGFjdHVhbFJlc3BvbnNlLlxuXG4gIC8vIDguMSBQYXJzZSBhIHJlZmVycmVyIHBvbGljeSBmcm9tIGEgUmVmZXJyZXItUG9saWN5IGhlYWRlclxuICAvLyAxLiBMZXQgcG9saWN5LXRva2VucyBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzIGdpdmVuIGBSZWZlcnJlci1Qb2xpY3lgIGFuZCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gIGNvbnN0IHsgaGVhZGVyc0xpc3QgfSA9IGFjdHVhbFJlc3BvbnNlXG4gIC8vIDIuIExldCBwb2xpY3kgYmUgdGhlIGVtcHR5IHN0cmluZy5cbiAgLy8gMy4gRm9yIGVhY2ggdG9rZW4gaW4gcG9saWN5LXRva2VucywgaWYgdG9rZW4gaXMgYSByZWZlcnJlciBwb2xpY3kgYW5kIHRva2VuIGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCBwb2xpY3kgdG8gdG9rZW4uXG4gIC8vIDQuIFJldHVybiBwb2xpY3kuXG4gIGNvbnN0IHBvbGljeUhlYWRlciA9IChoZWFkZXJzTGlzdC5nZXQoJ3JlZmVycmVyLXBvbGljeScpID8/ICcnKS5zcGxpdCgnLCcpXG5cbiAgLy8gTm90ZTogQXMgdGhlIHJlZmVycmVyLXBvbGljeSBjYW4gY29udGFpbiBtdWx0aXBsZSBwb2xpY2llc1xuICAvLyBzZXBhcmF0ZWQgYnkgY29tbWEsIHdlIG5lZWQgdG8gbG9vcCB0aHJvdWdoIGFsbCBvZiB0aGVtXG4gIC8vIGFuZCBwaWNrIHRoZSBmaXJzdCB2YWxpZCBvbmUuXG4gIC8vIFJlZjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL1JlZmVycmVyLVBvbGljeSNzcGVjaWZ5X2FfZmFsbGJhY2tfcG9saWN5XG4gIGxldCBwb2xpY3kgPSAnJ1xuICBpZiAocG9saWN5SGVhZGVyLmxlbmd0aCA+IDApIHtcbiAgICAvLyBUaGUgcmlnaHQtbW9zdCBwb2xpY3kgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAvLyBUaGUgbGVmdC1tb3N0IHBvbGljeSBpcyB0aGUgZmFsbGJhY2suXG4gICAgZm9yIChsZXQgaSA9IHBvbGljeUhlYWRlci5sZW5ndGg7IGkgIT09IDA7IGktLSkge1xuICAgICAgY29uc3QgdG9rZW4gPSBwb2xpY3lIZWFkZXJbaSAtIDFdLnRyaW0oKVxuICAgICAgaWYgKHJlZmVycmVyUG9saWN5VG9rZW5zLmhhcyh0b2tlbikpIHtcbiAgICAgICAgcG9saWN5ID0gdG9rZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAyLiBJZiBwb2xpY3kgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSB0byBwb2xpY3kuXG4gIGlmIChwb2xpY3kgIT09ICcnKSB7XG4gICAgcmVxdWVzdC5yZWZlcnJlclBvbGljeSA9IHBvbGljeVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjcm9zcy1vcmlnaW4tcmVzb3VyY2UtcG9saWN5LWNoZWNrXG5mdW5jdGlvbiBjcm9zc09yaWdpblJlc291cmNlUG9saWN5Q2hlY2sgKCkge1xuICAvLyBUT0RPXG4gIHJldHVybiAnYWxsb3dlZCdcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtY29ycy1jaGVja1xuZnVuY3Rpb24gY29yc0NoZWNrICgpIHtcbiAgLy8gVE9ET1xuICByZXR1cm4gJ3N1Y2Nlc3MnXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXRhby1jaGVja1xuZnVuY3Rpb24gVEFPQ2hlY2sgKCkge1xuICAvLyBUT0RPXG4gIHJldHVybiAnc3VjY2Vzcydcbn1cblxuZnVuY3Rpb24gYXBwZW5kRmV0Y2hNZXRhZGF0YSAoaHR0cFJlcXVlc3QpIHtcbiAgLy8gIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtZmV0Y2gtbWV0YWRhdGEvI3NlYy1mZXRjaC1kZXN0LWhlYWRlclxuICAvLyAgVE9ET1xuXG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtbW9kZS1oZWFkZXJcblxuICAvLyAgMS4gQXNzZXJ0OiBy4oCZcyB1cmwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwuXG4gIC8vICBUT0RPXG5cbiAgLy8gIDIuIExldCBoZWFkZXIgYmUgYSBTdHJ1Y3R1cmVkIEhlYWRlciB3aG9zZSB2YWx1ZSBpcyBhIHRva2VuLlxuICBsZXQgaGVhZGVyID0gbnVsbFxuXG4gIC8vICAzLiBTZXQgaGVhZGVy4oCZcyB2YWx1ZSB0byBy4oCZcyBtb2RlLlxuICBoZWFkZXIgPSBodHRwUmVxdWVzdC5tb2RlXG5cbiAgLy8gIDQuIFNldCBhIHN0cnVjdHVyZWQgZmllbGQgdmFsdWUgYFNlYy1GZXRjaC1Nb2RlYC9oZWFkZXIgaW4gcuKAmXMgaGVhZGVyIGxpc3QuXG4gIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LnNldCgnc2VjLWZldGNoLW1vZGUnLCBoZWFkZXIpXG5cbiAgLy8gIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtZmV0Y2gtbWV0YWRhdGEvI3NlYy1mZXRjaC1zaXRlLWhlYWRlclxuICAvLyAgVE9ET1xuXG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtdXNlci1oZWFkZXJcbiAgLy8gIFRPRE9cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2FwcGVuZC1hLXJlcXVlc3Qtb3JpZ2luLWhlYWRlclxuZnVuY3Rpb24gYXBwZW5kUmVxdWVzdE9yaWdpbkhlYWRlciAocmVxdWVzdCkge1xuICAvLyAxLiBMZXQgc2VyaWFsaXplZE9yaWdpbiBiZSB0aGUgcmVzdWx0IG9mIGJ5dGUtc2VyaWFsaXppbmcgYSByZXF1ZXN0IG9yaWdpbiB3aXRoIHJlcXVlc3QuXG4gIGxldCBzZXJpYWxpemVkT3JpZ2luID0gcmVxdWVzdC5vcmlnaW5cblxuICAvLyAyLiBJZiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBcImNvcnNcIiBvciByZXF1ZXN04oCZcyBtb2RlIGlzIFwid2Vic29ja2V0XCIsIHRoZW4gYXBwZW5kIChgT3JpZ2luYCwgc2VyaWFsaXplZE9yaWdpbikgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmIChyZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJyB8fCByZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgaWYgKHNlcmlhbGl6ZWRPcmlnaW4pIHtcbiAgICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdvcmlnaW4nLCBzZXJpYWxpemVkT3JpZ2luKVxuICAgIH1cblxuICAvLyAzLiBPdGhlcndpc2UsIGlmIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBuZWl0aGVyIGBHRVRgIG5vciBgSEVBRGAsIHRoZW46XG4gIH0gZWxzZSBpZiAocmVxdWVzdC5tZXRob2QgIT09ICdHRVQnICYmIHJlcXVlc3QubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAvLyAxLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgcmVmZXJyZXIgcG9saWN5OlxuICAgIHN3aXRjaCAocmVxdWVzdC5yZWZlcnJlclBvbGljeSkge1xuICAgICAgY2FzZSAnbm8tcmVmZXJyZXInOlxuICAgICAgICAvLyBTZXQgc2VyaWFsaXplZE9yaWdpbiB0byBgbnVsbGAuXG4gICAgICAgIHNlcmlhbGl6ZWRPcmlnaW4gPSBudWxsXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSc6XG4gICAgICBjYXNlICdzdHJpY3Qtb3JpZ2luJzpcbiAgICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nOlxuICAgICAgICAvLyBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgYSB0dXBsZSBvcmlnaW4sIGl0cyBzY2hlbWUgaXMgXCJodHRwc1wiLCBhbmQgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBpcyBub3QgXCJodHRwc1wiLCB0aGVuIHNldCBzZXJpYWxpemVkT3JpZ2luIHRvIGBudWxsYC5cbiAgICAgICAgaWYgKHJlcXVlc3Qub3JpZ2luICYmIHVybEhhc0h0dHBzU2NoZW1lKHJlcXVlc3Qub3JpZ2luKSAmJiAhdXJsSGFzSHR0cHNTY2hlbWUocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZE9yaWdpbiA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnc2FtZS1vcmlnaW4nOlxuICAgICAgICAvLyBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIG9yaWdpbiwgdGhlbiBzZXQgc2VyaWFsaXplZE9yaWdpbiB0byBgbnVsbGAuXG4gICAgICAgIGlmICghc2FtZU9yaWdpbihyZXF1ZXN0LCByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KSkpIHtcbiAgICAgICAgICBzZXJpYWxpemVkT3JpZ2luID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBEbyBub3RoaW5nLlxuICAgIH1cblxuICAgIGlmIChzZXJpYWxpemVkT3JpZ2luKSB7XG4gICAgICAvLyAyLiBBcHBlbmQgKGBPcmlnaW5gLCBzZXJpYWxpemVkT3JpZ2luKSB0byByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdvcmlnaW4nLCBzZXJpYWxpemVkT3JpZ2luKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZSAoY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkpIHtcbiAgLy8gVE9ET1xuICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KClcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NyZWF0ZS1hbi1vcGFxdWUtdGltaW5nLWluZm9cbmZ1bmN0aW9uIGNyZWF0ZU9wYXF1ZVRpbWluZ0luZm8gKHRpbWluZ0luZm8pIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydFRpbWU6IHRpbWluZ0luZm8uc3RhcnRUaW1lID8/IDAsXG4gICAgcmVkaXJlY3RTdGFydFRpbWU6IDAsXG4gICAgcmVkaXJlY3RFbmRUaW1lOiAwLFxuICAgIHBvc3RSZWRpcmVjdFN0YXJ0VGltZTogdGltaW5nSW5mby5zdGFydFRpbWUgPz8gMCxcbiAgICBmaW5hbFNlcnZpY2VXb3JrZXJTdGFydFRpbWU6IDAsXG4gICAgZmluYWxOZXR3b3JrUmVzcG9uc2VTdGFydFRpbWU6IDAsXG4gICAgZmluYWxOZXR3b3JrUmVxdWVzdFN0YXJ0VGltZTogMCxcbiAgICBlbmRUaW1lOiAwLFxuICAgIGVuY29kZWRCb2R5U2l6ZTogMCxcbiAgICBkZWNvZGVkQm9keVNpemU6IDAsXG4gICAgZmluYWxDb25uZWN0aW9uVGltaW5nSW5mbzogbnVsbFxuICB9XG59XG5cbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL29yaWdpbi5odG1sI3BvbGljeS1jb250YWluZXJcbmZ1bmN0aW9uIG1ha2VQb2xpY3lDb250YWluZXIgKCkge1xuICAvLyBOb3RlOiB0aGUgZmV0Y2ggc3BlYyBkb2Vzbid0IG1ha2UgdXNlIG9mIGVtYmVkZGVyIHBvbGljeSBvciBDU1AgbGlzdFxuICByZXR1cm4ge1xuICAgIHJlZmVycmVyUG9saWN5OiAnc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbidcbiAgfVxufVxuXG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9vcmlnaW4uaHRtbCNjbG9uZS1hLXBvbGljeS1jb250YWluZXJcbmZ1bmN0aW9uIGNsb25lUG9saWN5Q29udGFpbmVyIChwb2xpY3lDb250YWluZXIpIHtcbiAgcmV0dXJuIHtcbiAgICByZWZlcnJlclBvbGljeTogcG9saWN5Q29udGFpbmVyLnJlZmVycmVyUG9saWN5XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1yZWZlcnJlci1wb2xpY3kvI2RldGVybWluZS1yZXF1ZXN0cy1yZWZlcnJlclxuZnVuY3Rpb24gZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlciAocmVxdWVzdCkge1xuICAvLyAxLiBMZXQgcG9saWN5IGJlIHJlcXVlc3QncyByZWZlcnJlciBwb2xpY3kuXG4gIGNvbnN0IHBvbGljeSA9IHJlcXVlc3QucmVmZXJyZXJQb2xpY3lcblxuICAvLyBOb3RlOiBwb2xpY3kgY2Fubm90IChzaG91bGRuJ3QpIGJlIG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICBhc3NlcnQocG9saWN5KVxuXG4gIC8vIDIuIExldCBlbnZpcm9ubWVudCBiZSByZXF1ZXN04oCZcyBjbGllbnQuXG5cbiAgbGV0IHJlZmVycmVyU291cmNlID0gbnVsbFxuXG4gIC8vIDMuIFN3aXRjaCBvbiByZXF1ZXN04oCZcyByZWZlcnJlcjpcbiAgaWYgKHJlcXVlc3QucmVmZXJyZXIgPT09ICdjbGllbnQnKSB7XG4gICAgLy8gTm90ZTogbm9kZSBpc24ndCBhIGJyb3dzZXIgYW5kIGRvZXNuJ3QgaW1wbGVtZW50IGRvY3VtZW50L2lmcmFtZXMsXG4gICAgLy8gc28gd2UgYnlwYXNzIHRoaXMgc3RlcCBhbmQgcmVwbGFjZSBpdCB3aXRoIG91ciBvd24uXG5cbiAgICBjb25zdCBnbG9iYWxPcmlnaW4gPSBnZXRHbG9iYWxPcmlnaW4oKVxuXG4gICAgaWYgKCFnbG9iYWxPcmlnaW4gfHwgZ2xvYmFsT3JpZ2luLm9yaWdpbiA9PT0gJ251bGwnKSB7XG4gICAgICByZXR1cm4gJ25vLXJlZmVycmVyJ1xuICAgIH1cblxuICAgIC8vIG5vdGU6IHdlIG5lZWQgdG8gY2xvbmUgaXQgYXMgaXQncyBtdXRhdGVkXG4gICAgcmVmZXJyZXJTb3VyY2UgPSBuZXcgVVJMKGdsb2JhbE9yaWdpbilcbiAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZmVycmVyIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgLy8gTGV0IHJlZmVycmVyU291cmNlIGJlIHJlcXVlc3TigJlzIHJlZmVycmVyLlxuICAgIHJlZmVycmVyU291cmNlID0gcmVxdWVzdC5yZWZlcnJlclxuICB9XG5cbiAgLy8gNC4gTGV0IHJlcXVlc3TigJlzIHJlZmVycmVyVVJMIGJlIHRoZSByZXN1bHQgb2Ygc3RyaXBwaW5nIHJlZmVycmVyU291cmNlIGZvclxuICAvLyAgICB1c2UgYXMgYSByZWZlcnJlci5cbiAgbGV0IHJlZmVycmVyVVJMID0gc3RyaXBVUkxGb3JSZWZlcnJlcihyZWZlcnJlclNvdXJjZSlcblxuICAvLyA1LiBMZXQgcmVmZXJyZXJPcmlnaW4gYmUgdGhlIHJlc3VsdCBvZiBzdHJpcHBpbmcgcmVmZXJyZXJTb3VyY2UgZm9yIHVzZSBhc1xuICAvLyAgICBhIHJlZmVycmVyLCB3aXRoIHRoZSBvcmlnaW4tb25seSBmbGFnIHNldCB0byB0cnVlLlxuICBjb25zdCByZWZlcnJlck9yaWdpbiA9IHN0cmlwVVJMRm9yUmVmZXJyZXIocmVmZXJyZXJTb3VyY2UsIHRydWUpXG5cbiAgLy8gNi4gSWYgdGhlIHJlc3VsdCBvZiBzZXJpYWxpemluZyByZWZlcnJlclVSTCBpcyBhIHN0cmluZyB3aG9zZSBsZW5ndGggaXNcbiAgLy8gICAgZ3JlYXRlciB0aGFuIDQwOTYsIHNldCByZWZlcnJlclVSTCB0byByZWZlcnJlck9yaWdpbi5cbiAgaWYgKHJlZmVycmVyVVJMLnRvU3RyaW5nKCkubGVuZ3RoID4gNDA5Nikge1xuICAgIHJlZmVycmVyVVJMID0gcmVmZXJyZXJPcmlnaW5cbiAgfVxuXG4gIGNvbnN0IGFyZVNhbWVPcmlnaW4gPSBzYW1lT3JpZ2luKHJlcXVlc3QsIHJlZmVycmVyVVJMKVxuICBjb25zdCBpc05vblBvdGVudGlhbGx5VHJ1c3RXb3J0aHkgPSBpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkocmVmZXJyZXJVUkwpICYmXG4gICAgIWlzVVJMUG90ZW50aWFsbHlUcnVzdHdvcnRoeShyZXF1ZXN0LnVybClcblxuICAvLyA4LiBFeGVjdXRlIHRoZSBzd2l0Y2ggc3RhdGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZSBvZiBwb2xpY3k6XG4gIHN3aXRjaCAocG9saWN5KSB7XG4gICAgY2FzZSAnb3JpZ2luJzogcmV0dXJuIHJlZmVycmVyT3JpZ2luICE9IG51bGwgPyByZWZlcnJlck9yaWdpbiA6IHN0cmlwVVJMRm9yUmVmZXJyZXIocmVmZXJyZXJTb3VyY2UsIHRydWUpXG4gICAgY2FzZSAndW5zYWZlLXVybCc6IHJldHVybiByZWZlcnJlclVSTFxuICAgIGNhc2UgJ3NhbWUtb3JpZ2luJzpcbiAgICAgIHJldHVybiBhcmVTYW1lT3JpZ2luID8gcmVmZXJyZXJPcmlnaW4gOiAnbm8tcmVmZXJyZXInXG4gICAgY2FzZSAnb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luJzpcbiAgICAgIHJldHVybiBhcmVTYW1lT3JpZ2luID8gcmVmZXJyZXJVUkwgOiByZWZlcnJlck9yaWdpblxuICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nOiB7XG4gICAgICBjb25zdCBjdXJyZW50VVJMID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcblxuICAgICAgLy8gMS4gSWYgdGhlIG9yaWdpbiBvZiByZWZlcnJlclVSTCBhbmQgdGhlIG9yaWdpbiBvZiByZXF1ZXN04oCZcyBjdXJyZW50XG4gICAgICAvLyAgICBVUkwgYXJlIHRoZSBzYW1lLCB0aGVuIHJldHVybiByZWZlcnJlclVSTC5cbiAgICAgIGlmIChzYW1lT3JpZ2luKHJlZmVycmVyVVJMLCBjdXJyZW50VVJMKSkge1xuICAgICAgICByZXR1cm4gcmVmZXJyZXJVUkxcbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgcmVmZXJyZXJVUkwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwgYW5kIHJlcXVlc3TigJlzXG4gICAgICAvLyAgICBjdXJyZW50IFVSTCBpcyBub3QgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwsIHRoZW4gcmV0dXJuIG5vXG4gICAgICAvLyAgICByZWZlcnJlci5cbiAgICAgIGlmIChpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkocmVmZXJyZXJVUkwpICYmICFpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkoY3VycmVudFVSTCkpIHtcbiAgICAgICAgcmV0dXJuICduby1yZWZlcnJlcidcbiAgICAgIH1cblxuICAgICAgLy8gMy4gUmV0dXJuIHJlZmVycmVyT3JpZ2luLlxuICAgICAgcmV0dXJuIHJlZmVycmVyT3JpZ2luXG4gICAgfVxuICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4nOiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAvKipcbiAgICAgICAgICogMS4gSWYgcmVmZXJyZXJVUkwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwgYW5kXG4gICAgICAgICAqIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMIGlzIG5vdCBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCxcbiAgICAgICAgICogdGhlbiByZXR1cm4gbm8gcmVmZXJyZXIuXG4gICAgICAgICAqIDIuIFJldHVybiByZWZlcnJlck9yaWdpblxuICAgICAgICAqL1xuICAgIGNhc2UgJ25vLXJlZmVycmVyLXdoZW4tZG93bmdyYWRlJzogLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLyoqXG4gICAgICAgKiAxLiBJZiByZWZlcnJlclVSTCBpcyBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCBhbmRcbiAgICAgICAqIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMIGlzIG5vdCBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCxcbiAgICAgICAqIHRoZW4gcmV0dXJuIG5vIHJlZmVycmVyLlxuICAgICAgICogMi4gUmV0dXJuIHJlZmVycmVyT3JpZ2luXG4gICAgICAqL1xuXG4gICAgZGVmYXVsdDogLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgcmV0dXJuIGlzTm9uUG90ZW50aWFsbHlUcnVzdFdvcnRoeSA/ICduby1yZWZlcnJlcicgOiByZWZlcnJlck9yaWdpblxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXJlZmVycmVyLXBvbGljeS8jc3RyaXAtdXJsXG4gKiBAcGFyYW0ge1VSTH0gdXJsXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBvcmlnaW5Pbmx5XG4gKi9cbmZ1bmN0aW9uIHN0cmlwVVJMRm9yUmVmZXJyZXIgKHVybCwgb3JpZ2luT25seSkge1xuICAvLyAxLiBBc3NlcnQ6IHVybCBpcyBhIFVSTC5cbiAgYXNzZXJ0KHVybCBpbnN0YW5jZW9mIFVSTClcblxuICAvLyAyLiBJZiB1cmzigJlzIHNjaGVtZSBpcyBhIGxvY2FsIHNjaGVtZSwgdGhlbiByZXR1cm4gbm8gcmVmZXJyZXIuXG4gIGlmICh1cmwucHJvdG9jb2wgPT09ICdmaWxlOicgfHwgdXJsLnByb3RvY29sID09PSAnYWJvdXQ6JyB8fCB1cmwucHJvdG9jb2wgPT09ICdibGFuazonKSB7XG4gICAgcmV0dXJuICduby1yZWZlcnJlcidcbiAgfVxuXG4gIC8vIDMuIFNldCB1cmzigJlzIHVzZXJuYW1lIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gIHVybC51c2VybmFtZSA9ICcnXG5cbiAgLy8gNC4gU2V0IHVybOKAmXMgcGFzc3dvcmQgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgdXJsLnBhc3N3b3JkID0gJydcblxuICAvLyA1LiBTZXQgdXJs4oCZcyBmcmFnbWVudCB0byBudWxsLlxuICB1cmwuaGFzaCA9ICcnXG5cbiAgLy8gNi4gSWYgdGhlIG9yaWdpbi1vbmx5IGZsYWcgaXMgdHJ1ZSwgdGhlbjpcbiAgaWYgKG9yaWdpbk9ubHkpIHtcbiAgICAvLyAxLiBTZXQgdXJs4oCZcyBwYXRoIHRvIMKrIHRoZSBlbXB0eSBzdHJpbmcgwrsuXG4gICAgdXJsLnBhdGhuYW1lID0gJydcblxuICAgIC8vIDIuIFNldCB1cmzigJlzIHF1ZXJ5IHRvIG51bGwuXG4gICAgdXJsLnNlYXJjaCA9ICcnXG4gIH1cblxuICAvLyA3LiBSZXR1cm4gdXJsLlxuICByZXR1cm4gdXJsXG59XG5cbmZ1bmN0aW9uIGlzVVJMUG90ZW50aWFsbHlUcnVzdHdvcnRoeSAodXJsKSB7XG4gIGlmICghKHVybCBpbnN0YW5jZW9mIFVSTCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIElmIGNoaWxkIG9mIGFib3V0LCByZXR1cm4gdHJ1ZVxuICBpZiAodXJsLmhyZWYgPT09ICdhYm91dDpibGFuaycgfHwgdXJsLmhyZWYgPT09ICdhYm91dDpzcmNkb2MnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIElmIHNjaGVtZSBpcyBkYXRhLCByZXR1cm4gdHJ1ZVxuICBpZiAodXJsLnByb3RvY29sID09PSAnZGF0YTonKSByZXR1cm4gdHJ1ZVxuXG4gIC8vIElmIGZpbGUsIHJldHVybiB0cnVlXG4gIGlmICh1cmwucHJvdG9jb2wgPT09ICdmaWxlOicpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIGlzT3JpZ2luUG90ZW50aWFsbHlUcnVzdHdvcnRoeSh1cmwub3JpZ2luKVxuXG4gIGZ1bmN0aW9uIGlzT3JpZ2luUG90ZW50aWFsbHlUcnVzdHdvcnRoeSAob3JpZ2luKSB7XG4gICAgLy8gSWYgb3JpZ2luIGlzIGV4cGxpY2l0bHkgbnVsbCwgcmV0dXJuIGZhbHNlXG4gICAgaWYgKG9yaWdpbiA9PSBudWxsIHx8IG9yaWdpbiA9PT0gJ251bGwnKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IG9yaWdpbkFzVVJMID0gbmV3IFVSTChvcmlnaW4pXG5cbiAgICAvLyBJZiBzZWN1cmUsIHJldHVybiB0cnVlXG4gICAgaWYgKG9yaWdpbkFzVVJMLnByb3RvY29sID09PSAnaHR0cHM6JyB8fCBvcmlnaW5Bc1VSTC5wcm90b2NvbCA9PT0gJ3dzczonKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIGxvY2FsaG9zdCBvciB2YXJpYW50cywgcmV0dXJuIHRydWVcbiAgICBpZiAoL14xMjcoPzpcXC5bMC05XSspezAsMn1cXC5bMC05XSskfF5cXFsoPzowKjopKj86PzAqMVxcXSQvLnRlc3Qob3JpZ2luQXNVUkwuaG9zdG5hbWUpIHx8XG4gICAgIChvcmlnaW5Bc1VSTC5ob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgfHwgb3JpZ2luQXNVUkwuaG9zdG5hbWUuaW5jbHVkZXMoJ2xvY2FsaG9zdC4nKSkgfHxcbiAgICAgKG9yaWdpbkFzVVJMLmhvc3RuYW1lLmVuZHNXaXRoKCcubG9jYWxob3N0JykpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIGFueSBvdGhlciwgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtc3VicmVzb3VyY2UtaW50ZWdyaXR5LyNkb2VzLXJlc3BvbnNlLW1hdGNoLW1ldGFkYXRhbGlzdFxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICogQHBhcmFtIHtzdHJpbmd9IG1ldGFkYXRhTGlzdFxuICovXG5mdW5jdGlvbiBieXRlc01hdGNoIChieXRlcywgbWV0YWRhdGFMaXN0KSB7XG4gIC8vIElmIG5vZGUgaXMgbm90IGJ1aWx0IHdpdGggT3BlblNTTCBzdXBwb3J0LCB3ZSBjYW5ub3QgY2hlY2tcbiAgLy8gYSByZXF1ZXN0J3MgaW50ZWdyaXR5LCBzbyBhbGxvdyBpdCBieSBkZWZhdWx0ICh0aGUgc3BlYyB3aWxsXG4gIC8vIGFsbG93IHJlcXVlc3RzIGlmIGFuIGludmFsaWQgaGFzaCBpcyBnaXZlbiwgYXMgcHJlY2VkZW5jZSkuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZjogb25seSBpZiBub2RlIGlzIGJ1aWx0IHdpdGggLS13aXRob3V0LXNzbCAqL1xuICBpZiAoY3J5cHRvID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gMS4gTGV0IHBhcnNlZE1ldGFkYXRhIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyBtZXRhZGF0YUxpc3QuXG4gIGNvbnN0IHBhcnNlZE1ldGFkYXRhID0gcGFyc2VNZXRhZGF0YShtZXRhZGF0YUxpc3QpXG5cbiAgLy8gMi4gSWYgcGFyc2VkTWV0YWRhdGEgaXMgbm8gbWV0YWRhdGEsIHJldHVybiB0cnVlLlxuICBpZiAocGFyc2VkTWV0YWRhdGEgPT09ICdubyBtZXRhZGF0YScpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gMy4gSWYgcmVzcG9uc2UgaXMgbm90IGVsaWdpYmxlIGZvciBpbnRlZ3JpdHkgdmFsaWRhdGlvbiwgcmV0dXJuIGZhbHNlLlxuICAvLyBUT0RPXG5cbiAgLy8gNC4gSWYgcGFyc2VkTWV0YWRhdGEgaXMgdGhlIGVtcHR5IHNldCwgcmV0dXJuIHRydWUuXG4gIGlmIChwYXJzZWRNZXRhZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gNS4gTGV0IG1ldGFkYXRhIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyB0aGUgc3Ryb25nZXN0XG4gIC8vICAgIG1ldGFkYXRhIGZyb20gcGFyc2VkTWV0YWRhdGEuXG4gIGNvbnN0IHN0cm9uZ2VzdCA9IGdldFN0cm9uZ2VzdE1ldGFkYXRhKHBhcnNlZE1ldGFkYXRhKVxuICBjb25zdCBtZXRhZGF0YSA9IGZpbHRlck1ldGFkYXRhTGlzdEJ5QWxnb3JpdGhtKHBhcnNlZE1ldGFkYXRhLCBzdHJvbmdlc3QpXG5cbiAgLy8gNi4gRm9yIGVhY2ggaXRlbSBpbiBtZXRhZGF0YTpcbiAgZm9yIChjb25zdCBpdGVtIG9mIG1ldGFkYXRhKSB7XG4gICAgLy8gMS4gTGV0IGFsZ29yaXRobSBiZSB0aGUgYWxnIGNvbXBvbmVudCBvZiBpdGVtLlxuICAgIGNvbnN0IGFsZ29yaXRobSA9IGl0ZW0uYWxnb1xuXG4gICAgLy8gMi4gTGV0IGV4cGVjdGVkVmFsdWUgYmUgdGhlIHZhbCBjb21wb25lbnQgb2YgaXRlbS5cbiAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gaXRlbS5oYXNoXG5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYi1wbGF0Zm9ybS10ZXN0cy93cHQvY29tbWl0L2U0YzVjYzdhNWU0ODA5MzIyMDUyOGRmZGQxYzQwMTJkYzM4MzdhMGVcbiAgICAvLyBcImJlIGxpYmVyYWwgd2l0aCBwYWRkaW5nXCIuIFRoaXMgaXMgYW5ub3lpbmcsIGFuZCBpdCdzIG5vdCBldmVuIGluIHRoZSBzcGVjLlxuXG4gICAgLy8gMy4gTGV0IGFjdHVhbFZhbHVlIGJlIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYWxnb3JpdGhtIHRvIGJ5dGVzLlxuICAgIGxldCBhY3R1YWxWYWx1ZSA9IGNyeXB0by5jcmVhdGVIYXNoKGFsZ29yaXRobSkudXBkYXRlKGJ5dGVzKS5kaWdlc3QoJ2Jhc2U2NCcpXG5cbiAgICBpZiAoYWN0dWFsVmFsdWVbYWN0dWFsVmFsdWUubGVuZ3RoIC0gMV0gPT09ICc9Jykge1xuICAgICAgaWYgKGFjdHVhbFZhbHVlW2FjdHVhbFZhbHVlLmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgYWN0dWFsVmFsdWUgPSBhY3R1YWxWYWx1ZS5zbGljZSgwLCAtMilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdHVhbFZhbHVlID0gYWN0dWFsVmFsdWUuc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gSWYgYWN0dWFsVmFsdWUgaXMgYSBjYXNlLXNlbnNpdGl2ZSBtYXRjaCBmb3IgZXhwZWN0ZWRWYWx1ZSxcbiAgICAvLyAgICByZXR1cm4gdHJ1ZS5cbiAgICBpZiAoY29tcGFyZUJhc2U2NE1peGVkKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvLyA3LiBSZXR1cm4gZmFsc2UuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXN1YnJlc291cmNlLWludGVncml0eS8jZ3JhbW1hcmRlZi1oYXNoLXdpdGgtb3B0aW9uc1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDIvI3NvdXJjZS1saXN0LXN5bnRheFxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzUyMzQjYXBwZW5kaXgtQi4xXG5jb25zdCBwYXJzZUhhc2hXaXRoT3B0aW9ucyA9IC8oPzxhbGdvPnNoYTI1NnxzaGEzODR8c2hhNTEyKS0oKD88aGFzaD5bQS1aYS16MC05Ky9dK3xbQS1aYS16MC05Xy1dKyk9ezAsMn0oPzpcXHN8JCkoICtbIS1+XSopPyk/L2lcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtc3VicmVzb3VyY2UtaW50ZWdyaXR5LyNwYXJzZS1tZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGFkYXRhXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEgKG1ldGFkYXRhKSB7XG4gIC8vIDEuIExldCByZXN1bHQgYmUgdGhlIGVtcHR5IHNldC5cbiAgLyoqIEB0eXBlIHt7IGFsZ286IHN0cmluZywgaGFzaDogc3RyaW5nIH1bXX0gKi9cbiAgY29uc3QgcmVzdWx0ID0gW11cblxuICAvLyAyLiBMZXQgZW1wdHkgYmUgZXF1YWwgdG8gdHJ1ZS5cbiAgbGV0IGVtcHR5ID0gdHJ1ZVxuXG4gIC8vIDMuIEZvciBlYWNoIHRva2VuIHJldHVybmVkIGJ5IHNwbGl0dGluZyBtZXRhZGF0YSBvbiBzcGFjZXM6XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgbWV0YWRhdGEuc3BsaXQoJyAnKSkge1xuICAgIC8vIDEuIFNldCBlbXB0eSB0byBmYWxzZS5cbiAgICBlbXB0eSA9IGZhbHNlXG5cbiAgICAvLyAyLiBQYXJzZSB0b2tlbiBhcyBhIGhhc2gtd2l0aC1vcHRpb25zLlxuICAgIGNvbnN0IHBhcnNlZFRva2VuID0gcGFyc2VIYXNoV2l0aE9wdGlvbnMuZXhlYyh0b2tlbilcblxuICAgIC8vIDMuIElmIHRva2VuIGRvZXMgbm90IHBhcnNlLCBjb250aW51ZSB0byB0aGUgbmV4dCB0b2tlbi5cbiAgICBpZiAoXG4gICAgICBwYXJzZWRUb2tlbiA9PT0gbnVsbCB8fFxuICAgICAgcGFyc2VkVG9rZW4uZ3JvdXBzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHBhcnNlZFRva2VuLmdyb3Vwcy5hbGdvID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIC8vIE5vdGU6IENocm9taXVtIGJsb2NrcyB0aGUgcmVxdWVzdCBhdCB0aGlzIHBvaW50LCBidXQgRmlyZWZveFxuICAgICAgLy8gZ2l2ZXMgYSB3YXJuaW5nIHRoYXQgYW4gaW52YWxpZCBpbnRlZ3JpdHkgd2FzIGdpdmVuLiBUaGVcbiAgICAgIC8vIGNvcnJlY3QgYmVoYXZpb3IgaXMgdG8gaWdub3JlIHRoZXNlLCBhbmQgc3Vic2VxdWVudGx5IG5vdFxuICAgICAgLy8gY2hlY2sgdGhlIGludGVncml0eSBvZiB0aGUgcmVzb3VyY2UuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIDQuIExldCBhbGdvcml0aG0gYmUgdGhlIGhhc2gtYWxnbyBjb21wb25lbnQgb2YgdG9rZW4uXG4gICAgY29uc3QgYWxnb3JpdGhtID0gcGFyc2VkVG9rZW4uZ3JvdXBzLmFsZ28udG9Mb3dlckNhc2UoKVxuXG4gICAgLy8gNS4gSWYgYWxnb3JpdGhtIGlzIGEgaGFzaCBmdW5jdGlvbiByZWNvZ25pemVkIGJ5IHRoZSB1c2VyXG4gICAgLy8gICAgYWdlbnQsIGFkZCB0aGUgcGFyc2VkIHRva2VuIHRvIHJlc3VsdC5cbiAgICBpZiAoc3VwcG9ydGVkSGFzaGVzLmluY2x1ZGVzKGFsZ29yaXRobSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHBhcnNlZFRva2VuLmdyb3VwcylcbiAgICB9XG4gIH1cblxuICAvLyA0LiBSZXR1cm4gbm8gbWV0YWRhdGEgaWYgZW1wdHkgaXMgdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiByZXN1bHQuXG4gIGlmIChlbXB0eSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAnbm8gbWV0YWRhdGEnXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogQHBhcmFtIHt7IGFsZ286ICdzaGEyNTYnIHwgJ3NoYTM4NCcgfCAnc2hhNTEyJyB9W119IG1ldGFkYXRhTGlzdFxuICovXG5mdW5jdGlvbiBnZXRTdHJvbmdlc3RNZXRhZGF0YSAobWV0YWRhdGFMaXN0KSB7XG4gIC8vIExldCBhbGdvcml0aG0gYmUgdGhlIGFsZ28gY29tcG9uZW50IG9mIHRoZSBmaXJzdCBpdGVtIGluIG1ldGFkYXRhTGlzdC5cbiAgLy8gQ2FuIGJlIHNoYTI1NlxuICBsZXQgYWxnb3JpdGhtID0gbWV0YWRhdGFMaXN0WzBdLmFsZ29cbiAgLy8gSWYgdGhlIGFsZ29yaXRobSBpcyBzaGE1MTIsIHRoZW4gaXQgaXMgdGhlIHN0cm9uZ2VzdFxuICAvLyBhbmQgd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseVxuICBpZiAoYWxnb3JpdGhtWzNdID09PSAnNScpIHtcbiAgICByZXR1cm4gYWxnb3JpdGhtXG4gIH1cblxuICBmb3IgKGxldCBpID0gMTsgaSA8IG1ldGFkYXRhTGlzdC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gbWV0YWRhdGFMaXN0W2ldXG4gICAgLy8gSWYgdGhlIGFsZ29yaXRobSBpcyBzaGE1MTIsIHRoZW4gaXQgaXMgdGhlIHN0cm9uZ2VzdFxuICAgIC8vIGFuZCB3ZSBjYW4gYnJlYWsgdGhlIGxvb3AgaW1tZWRpYXRlbHlcbiAgICBpZiAobWV0YWRhdGEuYWxnb1szXSA9PT0gJzUnKSB7XG4gICAgICBhbGdvcml0aG0gPSAnc2hhNTEyJ1xuICAgICAgYnJlYWtcbiAgICAvLyBJZiB0aGUgYWxnb3JpdGhtIGlzIHNoYTM4NCwgdGhlbiBhIHBvdGVudGlhbCBzaGEyNTYgb3Igc2hhMzg0IGlzIGlnbm9yZWRcbiAgICB9IGVsc2UgaWYgKGFsZ29yaXRobVszXSA9PT0gJzMnKSB7XG4gICAgICBjb250aW51ZVxuICAgIC8vIGFsZ29yaXRobSBpcyBzaGEyNTYsIGNoZWNrIGlmIGFsZ29yaXRobSBpcyBzaGEzODQgYW5kIGlmIHNvLCBzZXQgaXQgYXNcbiAgICAvLyB0aGUgc3Ryb25nZXN0XG4gICAgfSBlbHNlIGlmIChtZXRhZGF0YS5hbGdvWzNdID09PSAnMycpIHtcbiAgICAgIGFsZ29yaXRobSA9ICdzaGEzODQnXG4gICAgfVxuICB9XG4gIHJldHVybiBhbGdvcml0aG1cbn1cblxuZnVuY3Rpb24gZmlsdGVyTWV0YWRhdGFMaXN0QnlBbGdvcml0aG0gKG1ldGFkYXRhTGlzdCwgYWxnb3JpdGhtKSB7XG4gIGlmIChtZXRhZGF0YUxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhTGlzdFxuICB9XG5cbiAgbGV0IHBvcyA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRhZGF0YUxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobWV0YWRhdGFMaXN0W2ldLmFsZ28gPT09IGFsZ29yaXRobSkge1xuICAgICAgbWV0YWRhdGFMaXN0W3BvcysrXSA9IG1ldGFkYXRhTGlzdFtpXVxuICAgIH1cbiAgfVxuXG4gIG1ldGFkYXRhTGlzdC5sZW5ndGggPSBwb3NcblxuICByZXR1cm4gbWV0YWRhdGFMaXN0XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGJhc2U2NCBzdHJpbmdzLCBhbGxvd2luZyBmb3IgYmFzZTY0dXJsXG4gKiBpbiB0aGUgc2Vjb25kIHN0cmluZy5cbiAqXG4qIEBwYXJhbSB7c3RyaW5nfSBhY3R1YWxWYWx1ZSBhbHdheXMgYmFzZTY0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRWYWx1ZSBiYXNlNjQgb3IgYmFzZTY0dXJsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJhc2U2NE1peGVkIChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkge1xuICBpZiAoYWN0dWFsVmFsdWUubGVuZ3RoICE9PSBleHBlY3RlZFZhbHVlLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsVmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoYWN0dWFsVmFsdWVbaV0gIT09IGV4cGVjdGVkVmFsdWVbaV0pIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGFjdHVhbFZhbHVlW2ldID09PSAnKycgJiYgZXhwZWN0ZWRWYWx1ZVtpXSA9PT0gJy0nKSB8fFxuICAgICAgICAoYWN0dWFsVmFsdWVbaV0gPT09ICcvJyAmJiBleHBlY3RlZFZhbHVlW2ldID09PSAnXycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtdXBncmFkZS1pbnNlY3VyZS1yZXF1ZXN0cy8jdXBncmFkZS1yZXF1ZXN0XG5mdW5jdGlvbiB0cnlVcGdyYWRlUmVxdWVzdFRvQVBvdGVudGlhbGx5VHJ1c3R3b3J0aHlVUkwgKHJlcXVlc3QpIHtcbiAgLy8gVE9ET1xufVxuXG4vKipcbiAqIEBsaW5rIHtodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9vcmlnaW4uaHRtbCNzYW1lLW9yaWdpbn1cbiAqIEBwYXJhbSB7VVJMfSBBXG4gKiBAcGFyYW0ge1VSTH0gQlxuICovXG5mdW5jdGlvbiBzYW1lT3JpZ2luIChBLCBCKSB7XG4gIC8vIDEuIElmIEEgYW5kIEIgYXJlIHRoZSBzYW1lIG9wYXF1ZSBvcmlnaW4sIHRoZW4gcmV0dXJuIHRydWUuXG4gIGlmIChBLm9yaWdpbiA9PT0gQi5vcmlnaW4gJiYgQS5vcmlnaW4gPT09ICdudWxsJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyAyLiBJZiBBIGFuZCBCIGFyZSBib3RoIHR1cGxlIG9yaWdpbnMgYW5kIHRoZWlyIHNjaGVtZXMsXG4gIC8vICAgIGhvc3RzLCBhbmQgcG9ydCBhcmUgaWRlbnRpY2FsLCB0aGVuIHJldHVybiB0cnVlLlxuICBpZiAoQS5wcm90b2NvbCA9PT0gQi5wcm90b2NvbCAmJiBBLmhvc3RuYW1lID09PSBCLmhvc3RuYW1lICYmIEEucG9ydCA9PT0gQi5wb3J0KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIDMuIFJldHVybiBmYWxzZS5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmVycmVkUHJvbWlzZSAoKSB7XG4gIGxldCByZXNcbiAgbGV0IHJlalxuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlcyA9IHJlc29sdmVcbiAgICByZWogPSByZWplY3RcbiAgfSlcblxuICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlOiByZXMsIHJlamVjdDogcmVqIH1cbn1cblxuZnVuY3Rpb24gaXNBYm9ydGVkIChmZXRjaFBhcmFtcykge1xuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ2Fib3J0ZWQnXG59XG5cbmZ1bmN0aW9uIGlzQ2FuY2VsbGVkIChmZXRjaFBhcmFtcykge1xuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ2Fib3J0ZWQnIHx8XG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ3Rlcm1pbmF0ZWQnXG59XG5cbmNvbnN0IG5vcm1hbGl6ZU1ldGhvZFJlY29yZCA9IHtcbiAgZGVsZXRlOiAnREVMRVRFJyxcbiAgREVMRVRFOiAnREVMRVRFJyxcbiAgZ2V0OiAnR0VUJyxcbiAgR0VUOiAnR0VUJyxcbiAgaGVhZDogJ0hFQUQnLFxuICBIRUFEOiAnSEVBRCcsXG4gIG9wdGlvbnM6ICdPUFRJT05TJyxcbiAgT1BUSU9OUzogJ09QVElPTlMnLFxuICBwb3N0OiAnUE9TVCcsXG4gIFBPU1Q6ICdQT1NUJyxcbiAgcHV0OiAnUFVUJyxcbiAgUFVUOiAnUFVUJ1xufVxuXG4vLyBOb3RlOiBvYmplY3QgcHJvdG90eXBlcyBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgcmVmZXJlbmNlZC4gZS5nLiBgT2JqZWN0I2hhc093blByb3BlcnR5YC5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihub3JtYWxpemVNZXRob2RSZWNvcmQsIG51bGwpXG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1tZXRob2Qtbm9ybWFsaXplXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZCAobWV0aG9kKSB7XG4gIHJldHVybiBub3JtYWxpemVNZXRob2RSZWNvcmRbbWV0aG9kLnRvTG93ZXJDYXNlKCldID8/IG1ldGhvZFxufVxuXG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc2VyaWFsaXplLWEtamF2YXNjcmlwdC12YWx1ZS10by1hLWpzb24tc3RyaW5nXG5mdW5jdGlvbiBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcgKHZhbHVlKSB7XG4gIC8vIDEuIExldCByZXN1bHQgYmUgPyBDYWxsKCVKU09OLnN0cmluZ2lmeSUsIHVuZGVmaW5lZCwgwqsgdmFsdWUgwrspLlxuICBjb25zdCByZXN1bHQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcblxuICAvLyAyLiBJZiByZXN1bHQgaXMgdW5kZWZpbmVkLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdWYWx1ZSBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUnKVxuICB9XG5cbiAgLy8gMy4gQXNzZXJ0OiByZXN1bHQgaXMgYSBzdHJpbmcuXG4gIGFzc2VydCh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJylcblxuICAvLyA0LiBSZXR1cm4gcmVzdWx0LlxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJTI1aXRlcmF0b3Jwcm90b3R5cGUlMjUtb2JqZWN0XG5jb25zdCBlc0l0ZXJhdG9yUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihbXVtTeW1ib2wuaXRlcmF0b3JdKCkpKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNkZm4taXRlcmF0b3ItcHJvdG90eXBlLW9iamVjdFxuICogQHBhcmFtIHsoKSA9PiB1bmtub3duW119IGl0ZXJhdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBpbnN0YW5jZVxuICogQHBhcmFtIHsna2V5J3wndmFsdWUnfCdrZXkrdmFsdWUnfSBraW5kXG4gKi9cbmZ1bmN0aW9uIG1ha2VJdGVyYXRvciAoaXRlcmF0b3IsIG5hbWUsIGtpbmQpIHtcbiAgY29uc3Qgb2JqZWN0ID0ge1xuICAgIGluZGV4OiAwLFxuICAgIGtpbmQsXG4gICAgdGFyZ2V0OiBpdGVyYXRvclxuICB9XG5cbiAgY29uc3QgaSA9IHtcbiAgICBuZXh0ICgpIHtcbiAgICAgIC8vIDEuIExldCBpbnRlcmZhY2UgYmUgdGhlIGludGVyZmFjZSBmb3Igd2hpY2ggdGhlIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgZXhpc3RzLlxuXG4gICAgICAvLyAyLiBMZXQgdGhpc1ZhbHVlIGJlIHRoZSB0aGlzIHZhbHVlLlxuXG4gICAgICAvLyAzLiBMZXQgb2JqZWN0IGJlID8gVG9PYmplY3QodGhpc1ZhbHVlKS5cblxuICAgICAgLy8gNC4gSWYgb2JqZWN0IGlzIGEgcGxhdGZvcm0gb2JqZWN0LCB0aGVuIHBlcmZvcm0gYSBzZWN1cml0eVxuICAgICAgLy8gICAgY2hlY2ssIHBhc3Npbmc6XG5cbiAgICAgIC8vIDUuIElmIG9iamVjdCBpcyBub3QgYSBkZWZhdWx0IGl0ZXJhdG9yIG9iamVjdCBmb3IgaW50ZXJmYWNlLFxuICAgICAgLy8gICAgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykgIT09IGkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgJ25leHQnIGNhbGxlZCBvbiBhbiBvYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgaW50ZXJmYWNlICR7bmFtZX0gSXRlcmF0b3IuYFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDYuIExldCBpbmRleCBiZSBvYmplY3TigJlzIGluZGV4LlxuICAgICAgLy8gNy4gTGV0IGtpbmQgYmUgb2JqZWN04oCZcyBraW5kLlxuICAgICAgLy8gOC4gTGV0IHZhbHVlcyBiZSBvYmplY3TigJlzIHRhcmdldCdzIHZhbHVlIHBhaXJzIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgIGNvbnN0IHsgaW5kZXgsIGtpbmQsIHRhcmdldCB9ID0gb2JqZWN0XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0YXJnZXQoKVxuXG4gICAgICAvLyA5LiBMZXQgbGVuIGJlIHRoZSBsZW5ndGggb2YgdmFsdWVzLlxuICAgICAgY29uc3QgbGVuID0gdmFsdWVzLmxlbmd0aFxuXG4gICAgICAvLyAxMC4gSWYgaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGxlbiwgdGhlbiByZXR1cm5cbiAgICAgIC8vICAgICBDcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSkuXG4gICAgICBpZiAoaW5kZXggPj0gbGVuKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfVxuICAgICAgfVxuXG4gICAgICAvLyAxMS4gTGV0IHBhaXIgYmUgdGhlIGVudHJ5IGluIHZhbHVlcyBhdCBpbmRleCBpbmRleC5cbiAgICAgIGNvbnN0IHBhaXIgPSB2YWx1ZXNbaW5kZXhdXG5cbiAgICAgIC8vIDEyLiBTZXQgb2JqZWN04oCZcyBpbmRleCB0byBpbmRleCArIDEuXG4gICAgICBvYmplY3QuaW5kZXggPSBpbmRleCArIDFcblxuICAgICAgLy8gMTMuIFJldHVybiB0aGUgaXRlcmF0b3IgcmVzdWx0IGZvciBwYWlyIGFuZCBraW5kLlxuICAgICAgcmV0dXJuIGl0ZXJhdG9yUmVzdWx0KHBhaXIsIGtpbmQpXG4gICAgfSxcbiAgICAvLyBUaGUgY2xhc3Mgc3RyaW5nIG9mIGFuIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgZm9yIGEgZ2l2ZW4gaW50ZXJmYWNlIGlzIHRoZVxuICAgIC8vIHJlc3VsdCBvZiBjb25jYXRlbmF0aW5nIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBzdHJpbmcgXCIgSXRlcmF0b3JcIi5cbiAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogYCR7bmFtZX0gSXRlcmF0b3JgXG4gIH1cblxuICAvLyBUaGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBzbG90IG9mIGFuIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgbXVzdCBiZSAlSXRlcmF0b3JQcm90b3R5cGUlLlxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoaSwgZXNJdGVyYXRvclByb3RvdHlwZSlcbiAgLy8gZXNJdGVyYXRvclByb3RvdHlwZSBuZWVkcyB0byBiZSB0aGUgcHJvdG90eXBlIG9mIGlcbiAgLy8gd2hpY2ggaXMgdGhlIHByb3RvdHlwZSBvZiBhbiBlbXB0eSBvYmplY3QuIFllcywgaXQncyBjb25mdXNpbmcuXG4gIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yoe30sIGkpXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jaXRlcmF0b3ItcmVzdWx0XG5mdW5jdGlvbiBpdGVyYXRvclJlc3VsdCAocGFpciwga2luZCkge1xuICBsZXQgcmVzdWx0XG5cbiAgLy8gMS4gTGV0IHJlc3VsdCBiZSBhIHZhbHVlIGRldGVybWluZWQgYnkgdGhlIHZhbHVlIG9mIGtpbmQ6XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ2tleSc6IHtcbiAgICAgIC8vIDEuIExldCBpZGxLZXkgYmUgcGFpcuKAmXMga2V5LlxuICAgICAgLy8gMi4gTGV0IGtleSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsS2V5IHRvIGFuXG4gICAgICAvLyAgICBFQ01BU2NyaXB0IHZhbHVlLlxuICAgICAgLy8gMy4gcmVzdWx0IGlzIGtleS5cbiAgICAgIHJlc3VsdCA9IHBhaXJbMF1cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgJ3ZhbHVlJzoge1xuICAgICAgLy8gMS4gTGV0IGlkbFZhbHVlIGJlIHBhaXLigJlzIHZhbHVlLlxuICAgICAgLy8gMi4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBpZGxWYWx1ZSB0b1xuICAgICAgLy8gICAgYW4gRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgIC8vIDMuIHJlc3VsdCBpcyB2YWx1ZS5cbiAgICAgIHJlc3VsdCA9IHBhaXJbMV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgJ2tleSt2YWx1ZSc6IHtcbiAgICAgIC8vIDEuIExldCBpZGxLZXkgYmUgcGFpcuKAmXMga2V5LlxuICAgICAgLy8gMi4gTGV0IGlkbFZhbHVlIGJlIHBhaXLigJlzIHZhbHVlLlxuICAgICAgLy8gMy4gTGV0IGtleSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsS2V5IHRvIGFuXG4gICAgICAvLyAgICBFQ01BU2NyaXB0IHZhbHVlLlxuICAgICAgLy8gNC4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBpZGxWYWx1ZSB0b1xuICAgICAgLy8gICAgYW4gRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgIC8vIDUuIExldCBhcnJheSBiZSAhIEFycmF5Q3JlYXRlKDIpLlxuICAgICAgLy8gNi4gQ2FsbCAhIENyZWF0ZURhdGFQcm9wZXJ0eShhcnJheSwgXCIwXCIsIGtleSkuXG4gICAgICAvLyA3LiBDYWxsICEgQ3JlYXRlRGF0YVByb3BlcnR5KGFycmF5LCBcIjFcIiwgdmFsdWUpLlxuICAgICAgLy8gOC4gcmVzdWx0IGlzIGFycmF5LlxuICAgICAgcmVzdWx0ID0gcGFpclxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyAyLiBSZXR1cm4gQ3JlYXRlSXRlclJlc3VsdE9iamVjdChyZXN1bHQsIGZhbHNlKS5cbiAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2JvZHktZnVsbHktcmVhZFxuICovXG5hc3luYyBmdW5jdGlvbiBmdWxseVJlYWRCb2R5IChib2R5LCBwcm9jZXNzQm9keSwgcHJvY2Vzc0JvZHlFcnJvcikge1xuICAvLyAxLiBJZiB0YXNrRGVzdGluYXRpb24gaXMgbnVsbCwgdGhlbiBzZXQgdGFza0Rlc3RpbmF0aW9uIHRvXG4gIC8vICAgIHRoZSByZXN1bHQgb2Ygc3RhcnRpbmcgYSBuZXcgcGFyYWxsZWwgcXVldWUuXG5cbiAgLy8gMi4gTGV0IHN1Y2Nlc3NTdGVwcyBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgYnl0ZXMgYmUgdG8gcXVldWUgYVxuICAvLyAgICBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keSBnaXZlbiBieXRlcywgd2l0aCB0YXNrRGVzdGluYXRpb24uXG4gIGNvbnN0IHN1Y2Nlc3NTdGVwcyA9IHByb2Nlc3NCb2R5XG5cbiAgLy8gMy4gTGV0IGVycm9yU3RlcHMgYmUgdG8gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keUVycm9yLFxuICAvLyAgICB3aXRoIHRhc2tEZXN0aW5hdGlvbi5cbiAgY29uc3QgZXJyb3JTdGVwcyA9IHByb2Nlc3NCb2R5RXJyb3JcblxuICAvLyA0LiBMZXQgcmVhZGVyIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBhIHJlYWRlciBmb3IgYm9keeKAmXMgc3RyZWFtLlxuICAvLyAgICBJZiB0aGF0IHRocmV3IGFuIGV4Y2VwdGlvbiwgdGhlbiBydW4gZXJyb3JTdGVwcyB3aXRoIHRoYXRcbiAgLy8gICAgZXhjZXB0aW9uIGFuZCByZXR1cm4uXG4gIGxldCByZWFkZXJcblxuICB0cnkge1xuICAgIHJlYWRlciA9IGJvZHkuc3RyZWFtLmdldFJlYWRlcigpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvclN0ZXBzKGUpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA1LiBSZWFkIGFsbCBieXRlcyBmcm9tIHJlYWRlciwgZ2l2ZW4gc3VjY2Vzc1N0ZXBzIGFuZCBlcnJvclN0ZXBzLlxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRBbGxCeXRlcyhyZWFkZXIpXG4gICAgc3VjY2Vzc1N0ZXBzKHJlc3VsdClcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yU3RlcHMoZSlcbiAgfVxufVxuXG4vKiogQHR5cGUge1JlYWRhYmxlU3RyZWFtfSAqL1xubGV0IFJlYWRhYmxlU3RyZWFtID0gZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbVxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtTGlrZSAoc3RyZWFtKSB7XG4gIGlmICghUmVhZGFibGVTdHJlYW0pIHtcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgcmV0dXJuIHN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtIHx8IChcbiAgICBzdHJlYW1bU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ1JlYWRhYmxlU3RyZWFtJyAmJlxuICAgIHR5cGVvZiBzdHJlYW0udGVlID09PSAnZnVuY3Rpb24nXG4gIClcbn1cblxuY29uc3QgTUFYSU1VTV9BUkdVTUVOVF9MRU5HVEggPSA2NTUzNVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2lzb21vcnBoaWMtZGVjb2RlXG4gKiBAcGFyYW0ge251bWJlcltdfFVpbnQ4QXJyYXl9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGlzb21vcnBoaWNEZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIFRvIGlzb21vcnBoaWMgZGVjb2RlIGEgYnl0ZSBzZXF1ZW5jZSBpbnB1dCwgcmV0dXJuIGEgc3RyaW5nIHdob3NlIGNvZGUgcG9pbnRcbiAgLy8gICAgbGVuZ3RoIGlzIGVxdWFsIHRvIGlucHV04oCZcyBsZW5ndGggYW5kIHdob3NlIGNvZGUgcG9pbnRzIGhhdmUgdGhlIHNhbWUgdmFsdWVzXG4gIC8vICAgIGFzIHRoZSB2YWx1ZXMgb2YgaW5wdXTigJlzIGJ5dGVzLCBpbiB0aGUgc2FtZSBvcmRlci5cblxuICBpZiAoaW5wdXQubGVuZ3RoIDwgTUFYSU1VTV9BUkdVTUVOVF9MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pbnB1dClcbiAgfVxuXG4gIHJldHVybiBpbnB1dC5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiBwcmV2aW91cyArIFN0cmluZy5mcm9tQ2hhckNvZGUoY3VycmVudCksICcnKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVhZGFibGVTdHJlYW1Db250cm9sbGVyPFVpbnQ4QXJyYXk+fSBjb250cm9sbGVyXG4gKi9cbmZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtQ2xvc2UgKGNvbnRyb2xsZXIpIHtcbiAgdHJ5IHtcbiAgICBjb250cm9sbGVyLmNsb3NlKClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gVE9ETzogYWRkIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgdGhpcyBlcnJvciBvY2N1cnMuXG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcygnQ29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZCcpKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNpc29tb3JwaGljLWVuY29kZVxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGlzb21vcnBoaWNFbmNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIEFzc2VydDogaW5wdXQgY29udGFpbnMgbm8gY29kZSBwb2ludHMgZ3JlYXRlciB0aGFuIFUrMDBGRi5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGFzc2VydChpbnB1dC5jaGFyQ29kZUF0KGkpIDw9IDB4RkYpXG4gIH1cblxuICAvLyAyLiBSZXR1cm4gYSBieXRlIHNlcXVlbmNlIHdob3NlIGxlbmd0aCBpcyBlcXVhbCB0byBpbnB1dOKAmXMgY29kZVxuICAvLyAgICBwb2ludCBsZW5ndGggYW5kIHdob3NlIGJ5dGVzIGhhdmUgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZVxuICAvLyAgICB2YWx1ZXMgb2YgaW5wdXTigJlzIGNvZGUgcG9pbnRzLCBpbiB0aGUgc2FtZSBvcmRlclxuICByZXR1cm4gaW5wdXRcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vc3RyZWFtcy5zcGVjLndoYXR3Zy5vcmcvI3JlYWRhYmxlc3RyZWFtZGVmYXVsdHJlYWRlci1yZWFkLWFsbC1ieXRlc1xuICogQHNlZSBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkLWxvb3BcbiAqIEBwYXJhbSB7UmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyfSByZWFkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZEFsbEJ5dGVzIChyZWFkZXIpIHtcbiAgY29uc3QgYnl0ZXMgPSBbXVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWU6IGNodW5rIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpXG5cbiAgICBpZiAoZG9uZSkge1xuICAgICAgLy8gMS4gQ2FsbCBzdWNjZXNzU3RlcHMgd2l0aCBieXRlcy5cbiAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ5dGVzLCBieXRlTGVuZ3RoKVxuICAgIH1cblxuICAgIC8vIDEuIElmIGNodW5rIGlzIG5vdCBhIFVpbnQ4QXJyYXkgb2JqZWN0LCBjYWxsIGZhaWx1cmVTdGVwc1xuICAgIC8vICAgIHdpdGggYSBUeXBlRXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgIGlmICghaXNVaW50OEFycmF5KGNodW5rKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVjZWl2ZWQgbm9uLVVpbnQ4QXJyYXkgY2h1bmsnKVxuICAgIH1cblxuICAgIC8vIDIuIEFwcGVuZCB0aGUgYnl0ZXMgcmVwcmVzZW50ZWQgYnkgY2h1bmsgdG8gYnl0ZXMuXG4gICAgYnl0ZXMucHVzaChjaHVuaylcbiAgICBieXRlTGVuZ3RoICs9IGNodW5rLmxlbmd0aFxuXG4gICAgLy8gMy4gUmVhZC1sb29wIGdpdmVuIHJlYWRlciwgYnl0ZXMsIHN1Y2Nlc3NTdGVwcywgYW5kIGZhaWx1cmVTdGVwcy5cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2lzLWxvY2FsXG4gKiBAcGFyYW0ge1VSTH0gdXJsXG4gKi9cbmZ1bmN0aW9uIHVybElzTG9jYWwgKHVybCkge1xuICBhc3NlcnQoJ3Byb3RvY29sJyBpbiB1cmwpIC8vIGVuc3VyZSBpdCdzIGEgdXJsIG9iamVjdFxuXG4gIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sXG5cbiAgcmV0dXJuIHByb3RvY29sID09PSAnYWJvdXQ6JyB8fCBwcm90b2NvbCA9PT0gJ2Jsb2I6JyB8fCBwcm90b2NvbCA9PT0gJ2RhdGE6J1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG4gKi9cbmZ1bmN0aW9uIHVybEhhc0h0dHBzU2NoZW1lICh1cmwpIHtcbiAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHVybC5zdGFydHNXaXRoKCdodHRwczonKVxuICB9XG5cbiAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOidcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXNjaGVtZVxuICogQHBhcmFtIHtVUkx9IHVybFxuICovXG5mdW5jdGlvbiB1cmxJc0h0dHBIdHRwc1NjaGVtZSAodXJsKSB7XG4gIGFzc2VydCgncHJvdG9jb2wnIGluIHVybCkgLy8gZW5zdXJlIGl0J3MgYSB1cmwgb2JqZWN0XG5cbiAgY29uc3QgcHJvdG9jb2wgPSB1cmwucHJvdG9jb2xcblxuICByZXR1cm4gcHJvdG9jb2wgPT09ICdodHRwOicgfHwgcHJvdG9jb2wgPT09ICdodHRwczonXG59XG5cbi8qKlxuICogRmV0Y2ggc3VwcG9ydHMgbm9kZSA+PSAxNi44LjAsIGJ1dCBPYmplY3QuaGFzT3duIHdhcyBhZGRlZCBpbiB2MTYuOS4wLlxuICovXG5jb25zdCBoYXNPd24gPSBPYmplY3QuaGFzT3duIHx8ICgoZGljdCwga2V5KSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGljdCwga2V5KSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQWJvcnRlZCxcbiAgaXNDYW5jZWxsZWQsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgUmVhZGFibGVTdHJlYW1Gcm9tLFxuICB0b1VTVlN0cmluZyxcbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMLFxuICBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZSxcbiAgZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcixcbiAgbWFrZVBvbGljeUNvbnRhaW5lcixcbiAgY2xvbmVQb2xpY3lDb250YWluZXIsXG4gIGFwcGVuZEZldGNoTWV0YWRhdGEsXG4gIGFwcGVuZFJlcXVlc3RPcmlnaW5IZWFkZXIsXG4gIFRBT0NoZWNrLFxuICBjb3JzQ2hlY2ssXG4gIGNyb3NzT3JpZ2luUmVzb3VyY2VQb2xpY3lDaGVjayxcbiAgY3JlYXRlT3BhcXVlVGltaW5nSW5mbyxcbiAgc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdCxcbiAgaXNWYWxpZEhUVFBUb2tlbixcbiAgcmVxdWVzdEJhZFBvcnQsXG4gIHJlcXVlc3RDdXJyZW50VVJMLFxuICByZXNwb25zZVVSTCxcbiAgcmVzcG9uc2VMb2NhdGlvblVSTCxcbiAgaXNCbG9iTGlrZSxcbiAgaXNVUkxQb3RlbnRpYWxseVRydXN0d29ydGh5LFxuICBpc1ZhbGlkUmVhc29uUGhyYXNlLFxuICBzYW1lT3JpZ2luLFxuICBub3JtYWxpemVNZXRob2QsXG4gIHNlcmlhbGl6ZUphdmFzY3JpcHRWYWx1ZVRvSlNPTlN0cmluZyxcbiAgbWFrZUl0ZXJhdG9yLFxuICBpc1ZhbGlkSGVhZGVyTmFtZSxcbiAgaXNWYWxpZEhlYWRlclZhbHVlLFxuICBoYXNPd24sXG4gIGlzRXJyb3JMaWtlLFxuICBmdWxseVJlYWRCb2R5LFxuICBieXRlc01hdGNoLFxuICBpc1JlYWRhYmxlU3RyZWFtTGlrZSxcbiAgcmVhZGFibGVTdHJlYW1DbG9zZSxcbiAgaXNvbW9ycGhpY0VuY29kZSxcbiAgaXNvbW9ycGhpY0RlY29kZSxcbiAgdXJsSXNMb2NhbCxcbiAgdXJsSGFzSHR0cHNTY2hlbWUsXG4gIHVybElzSHR0cEh0dHBzU2NoZW1lLFxuICByZWFkQWxsQnl0ZXMsXG4gIG5vcm1hbGl6ZU1ldGhvZFJlY29yZCxcbiAgcGFyc2VNZXRhZGF0YVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtVcmw6IFN5bWJvbCgndXJsJyksXG4gIGtIZWFkZXJzOiBTeW1ib2woJ2hlYWRlcnMnKSxcbiAga1NpZ25hbDogU3ltYm9sKCdzaWduYWwnKSxcbiAga1N0YXRlOiBTeW1ib2woJ3N0YXRlJyksXG4gIGtHdWFyZDogU3ltYm9sKCdndWFyZCcpLFxuICBrUmVhbG06IFN5bWJvbCgncmVhbG0nKVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyB0eXBlcyB9ID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCB7IGhhc093biwgdG9VU1ZTdHJpbmcgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuLi8uLi90eXBlcy93ZWJpZGwnKS5XZWJpZGx9ICovXG5jb25zdCB3ZWJpZGwgPSB7fVxud2ViaWRsLmNvbnZlcnRlcnMgPSB7fVxud2ViaWRsLnV0aWwgPSB7fVxud2ViaWRsLmVycm9ycyA9IHt9XG5cbndlYmlkbC5lcnJvcnMuZXhjZXB0aW9uID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYCR7bWVzc2FnZS5oZWFkZXJ9OiAke21lc3NhZ2UubWVzc2FnZX1gKVxufVxuXG53ZWJpZGwuZXJyb3JzLmNvbnZlcnNpb25GYWlsZWQgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICBjb25zdCBwbHVyYWwgPSBjb250ZXh0LnR5cGVzLmxlbmd0aCA9PT0gMSA/ICcnIDogJyBvbmUgb2YnXG4gIGNvbnN0IG1lc3NhZ2UgPVxuICAgIGAke2NvbnRleHQuYXJndW1lbnR9IGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgdG9gICtcbiAgICBgJHtwbHVyYWx9OiAke2NvbnRleHQudHlwZXMuam9pbignLCAnKX0uYFxuXG4gIHJldHVybiB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgaGVhZGVyOiBjb250ZXh0LnByZWZpeCxcbiAgICBtZXNzYWdlXG4gIH0pXG59XG5cbndlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgcmV0dXJuIHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICBoZWFkZXI6IGNvbnRleHQucHJlZml4LFxuICAgIG1lc3NhZ2U6IGBcIiR7Y29udGV4dC52YWx1ZX1cIiBpcyBhbiBpbnZhbGlkICR7Y29udGV4dC50eXBlfS5gXG4gIH0pXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jaW1wbGVtZW50c1xud2ViaWRsLmJyYW5kQ2hlY2sgPSBmdW5jdGlvbiAoViwgSSwgb3B0cyA9IHVuZGVmaW5lZCkge1xuICBpZiAob3B0cz8uc3RyaWN0ICE9PSBmYWxzZSAmJiAhKFYgaW5zdGFuY2VvZiBJKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgaW52b2NhdGlvbicpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFY/LltTeW1ib2wudG9TdHJpbmdUYWddID09PSBJLnByb3RvdHlwZVtTeW1ib2wudG9TdHJpbmdUYWddXG4gIH1cbn1cblxud2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2sgPSBmdW5jdGlvbiAoeyBsZW5ndGggfSwgbWluLCBjdHgpIHtcbiAgaWYgKGxlbmd0aCA8IG1pbikge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIG1lc3NhZ2U6IGAke21pbn0gYXJndW1lbnQke21pbiAhPT0gMSA/ICdzJyA6ICcnfSByZXF1aXJlZCwgYCArXG4gICAgICAgICAgICAgICBgYnV0JHtsZW5ndGggPyAnIG9ubHknIDogJyd9ICR7bGVuZ3RofSBmb3VuZC5gLFxuICAgICAgLi4uY3R4XG4gICAgfSlcbiAgfVxufVxuXG53ZWJpZGwuaWxsZWdhbENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgaGVhZGVyOiAnVHlwZUVycm9yJyxcbiAgICBtZXNzYWdlOiAnSWxsZWdhbCBjb25zdHJ1Y3RvcidcbiAgfSlcbn1cblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xud2ViaWRsLnV0aWwuVHlwZSA9IGZ1bmN0aW9uIChWKSB7XG4gIHN3aXRjaCAodHlwZW9mIFYpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOiByZXR1cm4gJ1VuZGVmaW5lZCdcbiAgICBjYXNlICdib29sZWFuJzogcmV0dXJuICdCb29sZWFuJ1xuICAgIGNhc2UgJ3N0cmluZyc6IHJldHVybiAnU3RyaW5nJ1xuICAgIGNhc2UgJ3N5bWJvbCc6IHJldHVybiAnU3ltYm9sJ1xuICAgIGNhc2UgJ251bWJlcic6IHJldHVybiAnTnVtYmVyJ1xuICAgIGNhc2UgJ2JpZ2ludCc6IHJldHVybiAnQmlnSW50J1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICBpZiAoViA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ051bGwnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnT2JqZWN0J1xuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2Fic3RyYWN0LW9wZGVmLWNvbnZlcnR0b2ludFxud2ViaWRsLnV0aWwuQ29udmVydFRvSW50ID0gZnVuY3Rpb24gKFYsIGJpdExlbmd0aCwgc2lnbmVkbmVzcywgb3B0cyA9IHt9KSB7XG4gIGxldCB1cHBlckJvdW5kXG4gIGxldCBsb3dlckJvdW5kXG5cbiAgLy8gMS4gSWYgYml0TGVuZ3RoIGlzIDY0LCB0aGVuOlxuICBpZiAoYml0TGVuZ3RoID09PSA2NCkge1xuICAgIC8vIDEuIExldCB1cHBlckJvdW5kIGJlIDJeNTMg4oiSIDEuXG4gICAgdXBwZXJCb3VuZCA9IE1hdGgucG93KDIsIDUzKSAtIDFcblxuICAgIC8vIDIuIElmIHNpZ25lZG5lc3MgaXMgXCJ1bnNpZ25lZFwiLCB0aGVuIGxldCBsb3dlckJvdW5kIGJlIDAuXG4gICAgaWYgKHNpZ25lZG5lc3MgPT09ICd1bnNpZ25lZCcpIHtcbiAgICAgIGxvd2VyQm91bmQgPSAwXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDMuIE90aGVyd2lzZSBsZXQgbG93ZXJCb3VuZCBiZSDiiJIyXjUzICsgMS5cbiAgICAgIGxvd2VyQm91bmQgPSBNYXRoLnBvdygtMiwgNTMpICsgMVxuICAgIH1cbiAgfSBlbHNlIGlmIChzaWduZWRuZXNzID09PSAndW5zaWduZWQnKSB7XG4gICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiBzaWduZWRuZXNzIGlzIFwidW5zaWduZWRcIiwgdGhlbjpcblxuICAgIC8vIDEuIExldCBsb3dlckJvdW5kIGJlIDAuXG4gICAgbG93ZXJCb3VuZCA9IDBcblxuICAgIC8vIDIuIExldCB1cHBlckJvdW5kIGJlIDJeYml0TGVuZ3RoIOKIkiAxLlxuICAgIHVwcGVyQm91bmQgPSBNYXRoLnBvdygyLCBiaXRMZW5ndGgpIC0gMVxuICB9IGVsc2Uge1xuICAgIC8vIDMuIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIExldCBsb3dlckJvdW5kIGJlIC0yXmJpdExlbmd0aCDiiJIgMS5cbiAgICBsb3dlckJvdW5kID0gTWF0aC5wb3coLTIsIGJpdExlbmd0aCkgLSAxXG5cbiAgICAvLyAyLiBMZXQgdXBwZXJCb3VuZCBiZSAyXmJpdExlbmd0aCDiiJIgMSDiiJIgMS5cbiAgICB1cHBlckJvdW5kID0gTWF0aC5wb3coMiwgYml0TGVuZ3RoIC0gMSkgLSAxXG4gIH1cblxuICAvLyA0LiBMZXQgeCBiZSA/IFRvTnVtYmVyKFYpLlxuICBsZXQgeCA9IE51bWJlcihWKVxuXG4gIC8vIDUuIElmIHggaXMg4oiSMCwgdGhlbiBzZXQgeCB0byArMC5cbiAgaWYgKHggPT09IDApIHtcbiAgICB4ID0gMFxuICB9XG5cbiAgLy8gNi4gSWYgdGhlIGNvbnZlcnNpb24gaXMgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbRW5mb3JjZVJhbmdlXSBleHRlbmRlZCBhdHRyaWJ1dGUsIHRoZW46XG4gIGlmIChvcHRzLmVuZm9yY2VSYW5nZSA9PT0gdHJ1ZSkge1xuICAgIC8vIDEuIElmIHggaXMgTmFOLCAr4oieLCBvciDiiJLiiJ4sIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKFxuICAgICAgTnVtYmVyLmlzTmFOKHgpIHx8XG4gICAgICB4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHxcbiAgICAgIHggPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdJbnRlZ2VyIGNvbnZlcnNpb24nLFxuICAgICAgICBtZXNzYWdlOiBgQ291bGQgbm90IGNvbnZlcnQgJHtWfSB0byBhbiBpbnRlZ2VyLmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gU2V0IHggdG8gSW50ZWdlclBhcnQoeCkuXG4gICAgeCA9IHdlYmlkbC51dGlsLkludGVnZXJQYXJ0KHgpXG5cbiAgICAvLyAzLiBJZiB4IDwgbG93ZXJCb3VuZCBvciB4ID4gdXBwZXJCb3VuZCwgdGhlblxuICAgIC8vICAgIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh4IDwgbG93ZXJCb3VuZCB8fCB4ID4gdXBwZXJCb3VuZCkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdJbnRlZ2VyIGNvbnZlcnNpb24nLFxuICAgICAgICBtZXNzYWdlOiBgVmFsdWUgbXVzdCBiZSBiZXR3ZWVuICR7bG93ZXJCb3VuZH0tJHt1cHBlckJvdW5kfSwgZ290ICR7eH0uYFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA0LiBSZXR1cm4geC5cbiAgICByZXR1cm4geFxuICB9XG5cbiAgLy8gNy4gSWYgeCBpcyBub3QgTmFOIGFuZCB0aGUgY29udmVyc2lvbiBpcyB0byBhbiBJRExcbiAgLy8gICAgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIFtDbGFtcF0gZXh0ZW5kZWRcbiAgLy8gICAgYXR0cmlidXRlLCB0aGVuOlxuICBpZiAoIU51bWJlci5pc05hTih4KSAmJiBvcHRzLmNsYW1wID09PSB0cnVlKSB7XG4gICAgLy8gMS4gU2V0IHggdG8gbWluKG1heCh4LCBsb3dlckJvdW5kKSwgdXBwZXJCb3VuZCkuXG4gICAgeCA9IE1hdGgubWluKE1hdGgubWF4KHgsIGxvd2VyQm91bmQpLCB1cHBlckJvdW5kKVxuXG4gICAgLy8gMi4gUm91bmQgeCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLCBjaG9vc2luZyB0aGVcbiAgICAvLyAgICBldmVuIGludGVnZXIgaWYgaXQgbGllcyBoYWxmd2F5IGJldHdlZW4gdHdvLFxuICAgIC8vICAgIGFuZCBjaG9vc2luZyArMCByYXRoZXIgdGhhbiDiiJIwLlxuICAgIGlmIChNYXRoLmZsb29yKHgpICUgMiA9PT0gMCkge1xuICAgICAgeCA9IE1hdGguZmxvb3IoeClcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IE1hdGguY2VpbCh4KVxuICAgIH1cblxuICAgIC8vIDMuIFJldHVybiB4LlxuICAgIHJldHVybiB4XG4gIH1cblxuICAvLyA4LiBJZiB4IGlzIE5hTiwgKzAsICviiJ4sIG9yIOKIkuKIniwgdGhlbiByZXR1cm4gKzAuXG4gIGlmIChcbiAgICBOdW1iZXIuaXNOYU4oeCkgfHxcbiAgICAoeCA9PT0gMCAmJiBPYmplY3QuaXMoMCwgeCkpIHx8XG4gICAgeCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8XG4gICAgeCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyA5LiBTZXQgeCB0byBJbnRlZ2VyUGFydCh4KS5cbiAgeCA9IHdlYmlkbC51dGlsLkludGVnZXJQYXJ0KHgpXG5cbiAgLy8gMTAuIFNldCB4IHRvIHggbW9kdWxvIDJeYml0TGVuZ3RoLlxuICB4ID0geCAlIE1hdGgucG93KDIsIGJpdExlbmd0aClcblxuICAvLyAxMS4gSWYgc2lnbmVkbmVzcyBpcyBcInNpZ25lZFwiIGFuZCB4IOKJpSAyXmJpdExlbmd0aCDiiJIgMSxcbiAgLy8gICAgdGhlbiByZXR1cm4geCDiiJIgMl5iaXRMZW5ndGguXG4gIGlmIChzaWduZWRuZXNzID09PSAnc2lnbmVkJyAmJiB4ID49IE1hdGgucG93KDIsIGJpdExlbmd0aCkgLSAxKSB7XG4gICAgcmV0dXJuIHggLSBNYXRoLnBvdygyLCBiaXRMZW5ndGgpXG4gIH1cblxuICAvLyAxMi4gT3RoZXJ3aXNlLCByZXR1cm4geC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNhYnN0cmFjdC1vcGRlZi1pbnRlZ2VycGFydFxud2ViaWRsLnV0aWwuSW50ZWdlclBhcnQgPSBmdW5jdGlvbiAobikge1xuICAvLyAxLiBMZXQgciBiZSBmbG9vcihhYnMobikpLlxuICBjb25zdCByID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSlcblxuICAvLyAyLiBJZiBuIDwgMCwgdGhlbiByZXR1cm4gLTEgw5cgci5cbiAgaWYgKG4gPCAwKSB7XG4gICAgcmV0dXJuIC0xICogclxuICB9XG5cbiAgLy8gMy4gT3RoZXJ3aXNlLCByZXR1cm4gci5cbiAgcmV0dXJuIHJcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1zZXF1ZW5jZVxud2ViaWRsLnNlcXVlbmNlQ29udmVydGVyID0gZnVuY3Rpb24gKGNvbnZlcnRlcikge1xuICByZXR1cm4gKFYpID0+IHtcbiAgICAvLyAxLiBJZiBUeXBlKFYpIGlzIG5vdCBPYmplY3QsIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpICE9PSAnT2JqZWN0Jykge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdTZXF1ZW5jZScsXG4gICAgICAgIG1lc3NhZ2U6IGBWYWx1ZSBvZiB0eXBlICR7d2ViaWRsLnV0aWwuVHlwZShWKX0gaXMgbm90IGFuIE9iamVjdC5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIExldCBtZXRob2QgYmUgPyBHZXRNZXRob2QoViwgQEBpdGVyYXRvcikuXG4gICAgLyoqIEB0eXBlIHtHZW5lcmF0b3J9ICovXG4gICAgY29uc3QgbWV0aG9kID0gVj8uW1N5bWJvbC5pdGVyYXRvcl0/LigpXG4gICAgY29uc3Qgc2VxID0gW11cblxuICAgIC8vIDMuIElmIG1ldGhvZCBpcyB1bmRlZmluZWQsIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChcbiAgICAgIG1ldGhvZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0eXBlb2YgbWV0aG9kLm5leHQgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnU2VxdWVuY2UnLFxuICAgICAgICBtZXNzYWdlOiAnT2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvci4nXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jY3JlYXRlLXNlcXVlbmNlLWZyb20taXRlcmFibGVcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gbWV0aG9kLm5leHQoKVxuXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBzZXEucHVzaChjb252ZXJ0ZXIodmFsdWUpKVxuICAgIH1cblxuICAgIHJldHVybiBzZXFcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLXRvLXJlY29yZFxud2ViaWRsLnJlY29yZENvbnZlcnRlciA9IGZ1bmN0aW9uIChrZXlDb252ZXJ0ZXIsIHZhbHVlQ29udmVydGVyKSB7XG4gIHJldHVybiAoTykgPT4ge1xuICAgIC8vIDEuIElmIFR5cGUoTykgaXMgbm90IE9iamVjdCwgdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHdlYmlkbC51dGlsLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ1JlY29yZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBWYWx1ZSBvZiB0eXBlICR7d2ViaWRsLnV0aWwuVHlwZShPKX0gaXMgbm90IGFuIE9iamVjdC5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIExldCByZXN1bHQgYmUgYSBuZXcgZW1wdHkgaW5zdGFuY2Ugb2YgcmVjb3JkPEssIFY+LlxuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBpZiAoIXR5cGVzLmlzUHJveHkoTykpIHtcbiAgICAgIC8vIE9iamVjdC5rZXlzIG9ubHkgcmV0dXJucyBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhPKVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIC8vIDEuIExldCB0eXBlZEtleSBiZSBrZXkgY29udmVydGVkIHRvIGFuIElETCB2YWx1ZSBvZiB0eXBlIEsuXG4gICAgICAgIGNvbnN0IHR5cGVkS2V5ID0ga2V5Q29udmVydGVyKGtleSlcblxuICAgICAgICAvLyAyLiBMZXQgdmFsdWUgYmUgPyBHZXQoTywga2V5KS5cbiAgICAgICAgLy8gMy4gTGV0IHR5cGVkVmFsdWUgYmUgdmFsdWUgY29udmVydGVkIHRvIGFuIElETCB2YWx1ZSBvZiB0eXBlIFYuXG4gICAgICAgIGNvbnN0IHR5cGVkVmFsdWUgPSB2YWx1ZUNvbnZlcnRlcihPW2tleV0pXG5cbiAgICAgICAgLy8gNC4gU2V0IHJlc3VsdFt0eXBlZEtleV0gdG8gdHlwZWRWYWx1ZS5cbiAgICAgICAgcmVzdWx0W3R5cGVkS2V5XSA9IHR5cGVkVmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gNS4gUmV0dXJuIHJlc3VsdC5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvLyAzLiBMZXQga2V5cyBiZSA/IE8uW1tPd25Qcm9wZXJ0eUtleXNdXSgpLlxuICAgIGNvbnN0IGtleXMgPSBSZWZsZWN0Lm93bktleXMoTylcblxuICAgIC8vIDQuIEZvciBlYWNoIGtleSBvZiBrZXlzLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIC8vIDEuIExldCBkZXNjIGJlID8gTy5bW0dldE93blByb3BlcnR5XV0oa2V5KS5cbiAgICAgIGNvbnN0IGRlc2MgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBrZXkpXG5cbiAgICAgIC8vIDIuIElmIGRlc2MgaXMgbm90IHVuZGVmaW5lZCBhbmQgZGVzYy5bW0VudW1lcmFibGVdXSBpcyB0cnVlOlxuICAgICAgaWYgKGRlc2M/LmVudW1lcmFibGUpIHtcbiAgICAgICAgLy8gMS4gTGV0IHR5cGVkS2V5IGJlIGtleSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgSy5cbiAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBrZXlDb252ZXJ0ZXIoa2V5KVxuXG4gICAgICAgIC8vIDIuIExldCB2YWx1ZSBiZSA/IEdldChPLCBrZXkpLlxuICAgICAgICAvLyAzLiBMZXQgdHlwZWRWYWx1ZSBiZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgVi5cbiAgICAgICAgY29uc3QgdHlwZWRWYWx1ZSA9IHZhbHVlQ29udmVydGVyKE9ba2V5XSlcblxuICAgICAgICAvLyA0LiBTZXQgcmVzdWx0W3R5cGVkS2V5XSB0byB0eXBlZFZhbHVlLlxuICAgICAgICByZXN1bHRbdHlwZWRLZXldID0gdHlwZWRWYWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuIFJldHVybiByZXN1bHQuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbndlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoaSkge1xuICByZXR1cm4gKFYsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGlmIChvcHRzLnN0cmljdCAhPT0gZmFsc2UgJiYgIShWIGluc3RhbmNlb2YgaSkpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiBpLm5hbWUsXG4gICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCAke1Z9IHRvIGJlIGFuIGluc3RhbmNlIG9mICR7aS5uYW1lfS5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBWXG4gIH1cbn1cblxud2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVycykge1xuICByZXR1cm4gKGRpY3Rpb25hcnkpID0+IHtcbiAgICBjb25zdCB0eXBlID0gd2ViaWRsLnV0aWwuVHlwZShkaWN0aW9uYXJ5KVxuICAgIGNvbnN0IGRpY3QgPSB7fVxuXG4gICAgaWYgKHR5cGUgPT09ICdOdWxsJyB8fCB0eXBlID09PSAnVW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGRpY3RcbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdPYmplY3QnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ0RpY3Rpb25hcnknLFxuICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtkaWN0aW9uYXJ5fSB0byBiZSBvbmUgb2Y6IE51bGwsIFVuZGVmaW5lZCwgT2JqZWN0LmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcHRpb25zIG9mIGNvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnN0IHsga2V5LCBkZWZhdWx0VmFsdWUsIHJlcXVpcmVkLCBjb252ZXJ0ZXIgfSA9IG9wdGlvbnNcblxuICAgICAgaWYgKHJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgICAgIGlmICghaGFzT3duKGRpY3Rpb25hcnksIGtleSkpIHtcbiAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICBoZWFkZXI6ICdEaWN0aW9uYXJ5JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBNaXNzaW5nIHJlcXVpcmVkIGtleSBcIiR7a2V5fVwiLmBcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCB2YWx1ZSA9IGRpY3Rpb25hcnlba2V5XVxuICAgICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHRpb25zLCAnZGVmYXVsdFZhbHVlJylcblxuICAgICAgLy8gT25seSB1c2UgZGVmYXVsdFZhbHVlIGlmIHZhbHVlIGlzIHVuZGVmaW5lZCBhbmRcbiAgICAgIC8vIGEgZGVmYXVsdFZhbHVlIG9wdGlvbnMgd2FzIHByb3ZpZGVkLlxuICAgICAgaWYgKGhhc0RlZmF1bHQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA/PyBkZWZhdWx0VmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gQSBrZXkgY2FuIGJlIG9wdGlvbmFsIGFuZCBoYXZlIG5vIGRlZmF1bHQgdmFsdWUuXG4gICAgICAvLyBXaGVuIHRoaXMgaGFwcGVucywgZG8gbm90IHBlcmZvcm0gYSBjb252ZXJzaW9uLFxuICAgICAgLy8gYW5kIGRvIG5vdCBhc3NpZ24gdGhlIGtleSBhIHZhbHVlLlxuICAgICAgaWYgKHJlcXVpcmVkIHx8IGhhc0RlZmF1bHQgfHwgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IGNvbnZlcnRlcih2YWx1ZSlcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3B0aW9ucy5hbGxvd2VkVmFsdWVzICYmXG4gICAgICAgICAgIW9wdGlvbnMuYWxsb3dlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgaGVhZGVyOiAnRGljdGlvbmFyeScsXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHt2YWx1ZX0gaXMgbm90IGFuIGFjY2VwdGVkIHR5cGUuIEV4cGVjdGVkIG9uZSBvZiAke29wdGlvbnMuYWxsb3dlZFZhbHVlcy5qb2luKCcsICcpfS5gXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpY3RcbiAgfVxufVxuXG53ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gIHJldHVybiAoVikgPT4ge1xuICAgIGlmIChWID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gVlxuICAgIH1cblxuICAgIHJldHVybiBjb252ZXJ0ZXIoVilcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLURPTVN0cmluZ1xud2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nID0gZnVuY3Rpb24gKFYsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBJZiBWIGlzIG51bGwgYW5kIHRoZSBjb252ZXJzaW9uIGlzIHRvIGFuIElETCB0eXBlXG4gIC8vICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgW0xlZ2FjeU51bGxUb0VtcHR5U3RyaW5nXVxuICAvLyAgICBleHRlbmRlZCBhdHRyaWJ1dGUsIHRoZW4gcmV0dXJuIHRoZSBET01TdHJpbmcgdmFsdWVcbiAgLy8gICAgdGhhdCByZXByZXNlbnRzIHRoZSBlbXB0eSBzdHJpbmcuXG4gIGlmIChWID09PSBudWxsICYmIG9wdHMubGVnYWN5TnVsbFRvRW1wdHlTdHJpbmcpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIDIuIExldCB4IGJlID8gVG9TdHJpbmcoVikuXG4gIGlmICh0eXBlb2YgViA9PT0gJ3N5bWJvbCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlIHN5bWJvbCB0byBzdHJpbmcuJylcbiAgfVxuXG4gIC8vIDMuIFJldHVybiB0aGUgSURMIERPTVN0cmluZyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlXG4gIC8vICAgIHNhbWUgc2VxdWVuY2Ugb2YgY29kZSB1bml0cyBhcyB0aGUgb25lIHRoZVxuICAvLyAgICBFQ01BU2NyaXB0IFN0cmluZyB2YWx1ZSB4IHJlcHJlc2VudHMuXG4gIHJldHVybiBTdHJpbmcoVilcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1CeXRlU3RyaW5nXG53ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nID0gZnVuY3Rpb24gKFYpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBUb1N0cmluZyhWKS5cbiAgLy8gTm90ZTogRE9NU3RyaW5nIGNvbnZlcnRlciBwZXJmb3JtID8gVG9TdHJpbmcoVilcbiAgY29uc3QgeCA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxuXG4gIC8vIDIuIElmIHRoZSB2YWx1ZSBvZiBhbnkgZWxlbWVudCBvZiB4IGlzIGdyZWF0ZXIgdGhhblxuICAvLyAgICAyNTUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB4Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGlmICh4LmNoYXJDb2RlQXQoaW5kZXgpID4gMjU1KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgdG8gYSBCeXRlU3RyaW5nIGJlY2F1c2UgdGhlIGNoYXJhY3RlciBhdCAnICtcbiAgICAgICAgYGluZGV4ICR7aW5kZXh9IGhhcyBhIHZhbHVlIG9mICR7eC5jaGFyQ29kZUF0KGluZGV4KX0gd2hpY2ggaXMgZ3JlYXRlciB0aGFuIDI1NS5gXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIGFuIElETCBCeXRlU3RyaW5nIHZhbHVlIHdob3NlIGxlbmd0aCBpcyB0aGVcbiAgLy8gICAgbGVuZ3RoIG9mIHgsIGFuZCB3aGVyZSB0aGUgdmFsdWUgb2YgZWFjaCBlbGVtZW50IGlzXG4gIC8vICAgIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtVVNWU3RyaW5nXG53ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcgPSB0b1VTVlN0cmluZ1xuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLWJvb2xlYW5cbndlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4gPSBmdW5jdGlvbiAoVikge1xuICAvLyAxLiBMZXQgeCBiZSB0aGUgcmVzdWx0IG9mIGNvbXB1dGluZyBUb0Jvb2xlYW4oVikuXG4gIGNvbnN0IHggPSBCb29sZWFuKFYpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBJREwgYm9vbGVhbiB2YWx1ZSB0aGF0IGlzIHRoZSBvbmUgdGhhdCByZXByZXNlbnRzXG4gIC8vICAgIHRoZSBzYW1lIHRydXRoIHZhbHVlIGFzIHRoZSBFQ01BU2NyaXB0IEJvb2xlYW4gdmFsdWUgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1hbnlcbndlYmlkbC5jb252ZXJ0ZXJzLmFueSA9IGZ1bmN0aW9uIChWKSB7XG4gIHJldHVybiBWXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtbG9uZy1sb25nXG53ZWJpZGwuY29udmVydGVyc1snbG9uZyBsb25nJ10gPSBmdW5jdGlvbiAoVikge1xuICAvLyAxLiBMZXQgeCBiZSA/IENvbnZlcnRUb0ludChWLCA2NCwgXCJzaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgNjQsICdzaWduZWQnKVxuXG4gIC8vIDIuIFJldHVybiB0aGUgSURMIGxvbmcgbG9uZyB2YWx1ZSB0aGF0IHJlcHJlc2VudHNcbiAgLy8gICAgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLXVuc2lnbmVkLWxvbmctbG9uZ1xud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcgbG9uZyddID0gZnVuY3Rpb24gKFYpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBDb252ZXJ0VG9JbnQoViwgNjQsIFwidW5zaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgNjQsICd1bnNpZ25lZCcpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBJREwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlIHRoYXRcbiAgLy8gICAgcmVwcmVzZW50cyB0aGUgc2FtZSBudW1lcmljIHZhbHVlIGFzIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtdW5zaWduZWQtbG9uZ1xud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcnXSA9IGZ1bmN0aW9uIChWKSB7XG4gIC8vIDEuIExldCB4IGJlID8gQ29udmVydFRvSW50KFYsIDMyLCBcInVuc2lnbmVkXCIpLlxuICBjb25zdCB4ID0gd2ViaWRsLnV0aWwuQ29udmVydFRvSW50KFYsIDMyLCAndW5zaWduZWQnKVxuXG4gIC8vIDIuIFJldHVybiB0aGUgSURMIHVuc2lnbmVkIGxvbmcgdmFsdWUgdGhhdFxuICAvLyAgICByZXByZXNlbnRzIHRoZSBzYW1lIG51bWVyaWMgdmFsdWUgYXMgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy11bnNpZ25lZC1zaG9ydFxud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10gPSBmdW5jdGlvbiAoViwgb3B0cykge1xuICAvLyAxLiBMZXQgeCBiZSA/IENvbnZlcnRUb0ludChWLCAxNiwgXCJ1bnNpZ25lZFwiKS5cbiAgY29uc3QgeCA9IHdlYmlkbC51dGlsLkNvbnZlcnRUb0ludChWLCAxNiwgJ3Vuc2lnbmVkJywgb3B0cylcblxuICAvLyAyLiBSZXR1cm4gdGhlIElETCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSB0aGF0IHJlcHJlc2VudHNcbiAgLy8gICAgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2lkbC1BcnJheUJ1ZmZlclxud2ViaWRsLmNvbnZlcnRlcnMuQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoViwgb3B0cyA9IHt9KSB7XG4gIC8vIDEuIElmIFR5cGUoVikgaXMgbm90IE9iamVjdCwgb3IgViBkb2VzIG5vdCBoYXZlIGFuXG4gIC8vICAgIFtbQXJyYXlCdWZmZXJEYXRhXV0gaW50ZXJuYWwgc2xvdCwgdGhlbiB0aHJvdyBhXG4gIC8vICAgIFR5cGVFcnJvci5cbiAgLy8gc2VlOiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLWFycmF5YnVmZmVyLWluc3RhbmNlc1xuICAvLyBzZWU6IGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvcGVydGllcy1vZi10aGUtc2hhcmVkYXJyYXlidWZmZXItaW5zdGFuY2VzXG4gIGlmIChcbiAgICB3ZWJpZGwudXRpbC5UeXBlKFYpICE9PSAnT2JqZWN0JyB8fFxuICAgICF0eXBlcy5pc0FueUFycmF5QnVmZmVyKFYpXG4gICkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgICBwcmVmaXg6IGAke1Z9YCxcbiAgICAgIGFyZ3VtZW50OiBgJHtWfWAsXG4gICAgICB0eXBlczogWydBcnJheUJ1ZmZlciddXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1NoYXJlZF0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNTaGFyZWRBcnJheUJ1ZmZlcihWKSBpcyB0cnVlLCB0aGVuIHRocm93IGFcbiAgLy8gICAgVHlwZUVycm9yLlxuICBpZiAob3B0cy5hbGxvd1NoYXJlZCA9PT0gZmFsc2UgJiYgdHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcihWKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWKSBpcyB0cnVlLCB0aGVuIHRocm93IGFcbiAgLy8gICAgVHlwZUVycm9yLlxuICAvLyBOb3RlOiByZXNpemFibGUgQXJyYXlCdWZmZXJzIGFyZSBjdXJyZW50bHkgYSBwcm9wb3NhbC5cblxuICAvLyA0LiBSZXR1cm4gdGhlIElETCBBcnJheUJ1ZmZlciB2YWx1ZSB0aGF0IGlzIGFcbiAgLy8gICAgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBhcyBWLlxuICByZXR1cm4gVlxufVxuXG53ZWJpZGwuY29udmVydGVycy5UeXBlZEFycmF5ID0gZnVuY3Rpb24gKFYsIFQsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBMZXQgVCBiZSB0aGUgSURMIHR5cGUgViBpcyBiZWluZyBjb252ZXJ0ZWQgdG8uXG5cbiAgLy8gMi4gSWYgVHlwZShWKSBpcyBub3QgT2JqZWN0LCBvciBWIGRvZXMgbm90IGhhdmUgYVxuICAvLyAgICBbW1R5cGVkQXJyYXlOYW1lXV0gaW50ZXJuYWwgc2xvdCB3aXRoIGEgdmFsdWVcbiAgLy8gICAgZXF1YWwgdG8gVOKAmXMgbmFtZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKFxuICAgIHdlYmlkbC51dGlsLlR5cGUoVikgIT09ICdPYmplY3QnIHx8XG4gICAgIXR5cGVzLmlzVHlwZWRBcnJheShWKSB8fFxuICAgIFYuY29uc3RydWN0b3IubmFtZSAhPT0gVC5uYW1lXG4gICkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgICBwcmVmaXg6IGAke1QubmFtZX1gLFxuICAgICAgYXJndW1lbnQ6IGAke1Z9YCxcbiAgICAgIHR5cGVzOiBbVC5uYW1lXVxuICAgIH0pXG4gIH1cblxuICAvLyAzLiBJZiB0aGUgY29udmVyc2lvbiBpcyBub3QgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbQWxsb3dTaGFyZWRdIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kXG4gIC8vICAgIElzU2hhcmVkQXJyYXlCdWZmZXIoVi5bW1ZpZXdlZEFycmF5QnVmZmVyXV0pIGlzXG4gIC8vICAgIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGlmIChvcHRzLmFsbG93U2hhcmVkID09PSBmYWxzZSAmJiB0eXBlcy5pc1NoYXJlZEFycmF5QnVmZmVyKFYuYnVmZmVyKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDQuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWLltbVmlld2VkQXJyYXlCdWZmZXJdXSkgaXNcbiAgLy8gICAgdHJ1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgLy8gTm90ZTogcmVzaXphYmxlIGFycmF5IGJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBhIHByb3Bvc2FsXG5cbiAgLy8gNS4gUmV0dXJuIHRoZSBJREwgdmFsdWUgb2YgdHlwZSBUIHRoYXQgaXMgYSByZWZlcmVuY2VcbiAgLy8gICAgdG8gdGhlIHNhbWUgb2JqZWN0IGFzIFYuXG4gIHJldHVybiBWXG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLkRhdGFWaWV3ID0gZnVuY3Rpb24gKFYsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBJZiBUeXBlKFYpIGlzIG5vdCBPYmplY3QsIG9yIFYgZG9lcyBub3QgaGF2ZSBhXG4gIC8vICAgIFtbRGF0YVZpZXddXSBpbnRlcm5hbCBzbG90LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSAhPT0gJ09iamVjdCcgfHwgIXR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICBoZWFkZXI6ICdEYXRhVmlldycsXG4gICAgICBtZXNzYWdlOiAnT2JqZWN0IGlzIG5vdCBhIERhdGFWaWV3LidcbiAgICB9KVxuICB9XG5cbiAgLy8gMi4gSWYgdGhlIGNvbnZlcnNpb24gaXMgbm90IHRvIGFuIElETCB0eXBlIGFzc29jaWF0ZWRcbiAgLy8gICAgd2l0aCB0aGUgW0FsbG93U2hhcmVkXSBleHRlbmRlZCBhdHRyaWJ1dGUsIGFuZFxuICAvLyAgICBJc1NoYXJlZEFycmF5QnVmZmVyKFYuW1tWaWV3ZWRBcnJheUJ1ZmZlcl1dKSBpcyB0cnVlLFxuICAvLyAgICB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAob3B0cy5hbGxvd1NoYXJlZCA9PT0gZmFsc2UgJiYgdHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcihWLmJ1ZmZlcikpIHtcbiAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICBoZWFkZXI6ICdBcnJheUJ1ZmZlcicsXG4gICAgICBtZXNzYWdlOiAnU2hhcmVkQXJyYXlCdWZmZXIgaXMgbm90IGFsbG93ZWQuJ1xuICAgIH0pXG4gIH1cblxuICAvLyAzLiBJZiB0aGUgY29udmVyc2lvbiBpcyBub3QgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbQWxsb3dSZXNpemFibGVdIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kXG4gIC8vICAgIElzUmVzaXphYmxlQXJyYXlCdWZmZXIoVi5bW1ZpZXdlZEFycmF5QnVmZmVyXV0pIGlzXG4gIC8vICAgIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIC8vIE5vdGU6IHJlc2l6YWJsZSBBcnJheUJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBhIHByb3Bvc2FsXG5cbiAgLy8gNC4gUmV0dXJuIHRoZSBJREwgRGF0YVZpZXcgdmFsdWUgdGhhdCBpcyBhIHJlZmVyZW5jZVxuICAvLyAgICB0byB0aGUgc2FtZSBvYmplY3QgYXMgVi5cbiAgcmV0dXJuIFZcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNCdWZmZXJTb3VyY2VcbndlYmlkbC5jb252ZXJ0ZXJzLkJ1ZmZlclNvdXJjZSA9IGZ1bmN0aW9uIChWLCBvcHRzID0ge30pIHtcbiAgaWYgKHR5cGVzLmlzQW55QXJyYXlCdWZmZXIoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQXJyYXlCdWZmZXIoViwgb3B0cylcbiAgfVxuXG4gIGlmICh0eXBlcy5pc1R5cGVkQXJyYXkoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVHlwZWRBcnJheShWLCBWLmNvbnN0cnVjdG9yKVxuICB9XG5cbiAgaWYgKHR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuRGF0YVZpZXcoViwgb3B0cylcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoYENvdWxkIG5vdCBjb252ZXJ0ICR7Vn0gdG8gYSBCdWZmZXJTb3VyY2UuYClcbn1cblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPEJ5dGVTdHJpbmc+J10gPSB3ZWJpZGwuc2VxdWVuY2VDb252ZXJ0ZXIoXG4gIHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmdcbilcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8Qnl0ZVN0cmluZz4nXVxuKVxuXG53ZWJpZGwuY29udmVydGVyc1sncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J10gPSB3ZWJpZGwucmVjb3JkQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nLFxuICB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nXG4pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3ZWJpZGxcbn1cbiIsCiAgICAiY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgYXRvYiB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgaXNvbW9ycGhpY0RlY29kZSB9ID0gcmVxdWlyZSgnLi91dGlsJylcblxuY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG5cbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtdG9rZW4tY29kZS1wb2ludFxuICovXG5jb25zdCBIVFRQX1RPS0VOX0NPREVQT0lOVFMgPSAvXlshIyQlJicqKy0uXl98fkEtWmEtejAtOV0rJC9cbmNvbnN0IEhUVFBfV0hJVEVTUEFDRV9SRUdFWCA9IC8oXFx1MDAwQXxcXHUwMDBEfFxcdTAwMDl8XFx1MDAyMCkvIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtcXVvdGVkLXN0cmluZy10b2tlbi1jb2RlLXBvaW50XG4gKi9cbmNvbnN0IEhUVFBfUVVPVEVEX1NUUklOR19UT0tFTlMgPSAvW1xcdTAwMDl8XFx1MDAyMC1cXHUwMDdFfFxcdTAwODAtXFx1MDBGRl0vIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RhdGEtdXJsLXByb2Nlc3NvclxuLyoqIEBwYXJhbSB7VVJMfSBkYXRhVVJMICovXG5mdW5jdGlvbiBkYXRhVVJMUHJvY2Vzc29yIChkYXRhVVJMKSB7XG4gIC8vIDEuIEFzc2VydDogZGF0YVVSTOKAmXMgc2NoZW1lIGlzIFwiZGF0YVwiLlxuICBhc3NlcnQoZGF0YVVSTC5wcm90b2NvbCA9PT0gJ2RhdGE6JylcblxuICAvLyAyLiBMZXQgaW5wdXQgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBVUkxcbiAgLy8gc2VyaWFsaXplciBvbiBkYXRhVVJMIHdpdGggZXhjbHVkZSBmcmFnbWVudFxuICAvLyBzZXQgdG8gdHJ1ZS5cbiAgbGV0IGlucHV0ID0gVVJMU2VyaWFsaXplcihkYXRhVVJMLCB0cnVlKVxuXG4gIC8vIDMuIFJlbW92ZSB0aGUgbGVhZGluZyBcImRhdGE6XCIgc3RyaW5nIGZyb20gaW5wdXQuXG4gIGlucHV0ID0gaW5wdXQuc2xpY2UoNSlcblxuICAvLyA0LiBMZXQgcG9zaXRpb24gcG9pbnQgYXQgdGhlIHN0YXJ0IG9mIGlucHV0LlxuICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gIC8vIDUuIExldCBtaW1lVHlwZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYVxuICAvLyBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgZXF1YWxcbiAgLy8gdG8gVSswMDJDICgsKSwgZ2l2ZW4gcG9zaXRpb24uXG4gIGxldCBtaW1lVHlwZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICcsJyxcbiAgICBpbnB1dCxcbiAgICBwb3NpdGlvblxuICApXG5cbiAgLy8gNi4gU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgQVNDSUkgd2hpdGVzcGFjZVxuICAvLyBmcm9tIG1pbWVUeXBlLlxuICAvLyBVbmRpY2kgaW1wbGVtZW50YXRpb24gbm90ZTogd2UgbmVlZCB0byBzdG9yZSB0aGVcbiAgLy8gbGVuZ3RoIGJlY2F1c2UgaWYgdGhlIG1pbWV0eXBlIGhhcyBzcGFjZXMgcmVtb3ZlZCxcbiAgLy8gdGhlIHdyb25nIGFtb3VudCB3aWxsIGJlIHNsaWNlZCBmcm9tIHRoZSBpbnB1dCBpblxuICAvLyBzdGVwICM5XG4gIGNvbnN0IG1pbWVUeXBlTGVuZ3RoID0gbWltZVR5cGUubGVuZ3RoXG4gIG1pbWVUeXBlID0gcmVtb3ZlQVNDSUlXaGl0ZXNwYWNlKG1pbWVUeXBlLCB0cnVlLCB0cnVlKVxuXG4gIC8vIDcuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlblxuICAvLyByZXR1cm4gZmFpbHVyZVxuICBpZiAocG9zaXRpb24ucG9zaXRpb24gPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gOC4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgLy8gOS4gTGV0IGVuY29kZWRCb2R5IGJlIHRoZSByZW1haW5kZXIgb2YgaW5wdXQuXG4gIGNvbnN0IGVuY29kZWRCb2R5ID0gaW5wdXQuc2xpY2UobWltZVR5cGVMZW5ndGggKyAxKVxuXG4gIC8vIDEwLiBMZXQgYm9keSBiZSB0aGUgcGVyY2VudC1kZWNvZGluZyBvZiBlbmNvZGVkQm9keS5cbiAgbGV0IGJvZHkgPSBzdHJpbmdQZXJjZW50RGVjb2RlKGVuY29kZWRCb2R5KVxuXG4gIC8vIDExLiBJZiBtaW1lVHlwZSBlbmRzIHdpdGggVSswMDNCICg7KSwgZm9sbG93ZWQgYnlcbiAgLy8gemVybyBvciBtb3JlIFUrMDAyMCBTUEFDRSwgZm9sbG93ZWQgYnkgYW4gQVNDSUlcbiAgLy8gY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgXCJiYXNlNjRcIiwgdGhlbjpcbiAgaWYgKC87KFxcdTAwMjApezAsfWJhc2U2NCQvaS50ZXN0KG1pbWVUeXBlKSkge1xuICAgIC8vIDEuIExldCBzdHJpbmdCb2R5IGJlIHRoZSBpc29tb3JwaGljIGRlY29kZSBvZiBib2R5LlxuICAgIGNvbnN0IHN0cmluZ0JvZHkgPSBpc29tb3JwaGljRGVjb2RlKGJvZHkpXG5cbiAgICAvLyAyLiBTZXQgYm9keSB0byB0aGUgZm9yZ2l2aW5nLWJhc2U2NCBkZWNvZGUgb2ZcbiAgICAvLyBzdHJpbmdCb2R5LlxuICAgIGJvZHkgPSBmb3JnaXZpbmdCYXNlNjQoc3RyaW5nQm9keSlcblxuICAgIC8vIDMuIElmIGJvZHkgaXMgZmFpbHVyZSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgICBpZiAoYm9keSA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gICAgfVxuXG4gICAgLy8gNC4gUmVtb3ZlIHRoZSBsYXN0IDYgY29kZSBwb2ludHMgZnJvbSBtaW1lVHlwZS5cbiAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnNsaWNlKDAsIC02KVxuXG4gICAgLy8gNS4gUmVtb3ZlIHRyYWlsaW5nIFUrMDAyMCBTUEFDRSBjb2RlIHBvaW50cyBmcm9tIG1pbWVUeXBlLFxuICAgIC8vIGlmIGFueS5cbiAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnJlcGxhY2UoLyhcXHUwMDIwKSskLywgJycpXG5cbiAgICAvLyA2LiBSZW1vdmUgdGhlIGxhc3QgVSswMDNCICg7KSBjb2RlIHBvaW50IGZyb20gbWltZVR5cGUuXG4gICAgbWltZVR5cGUgPSBtaW1lVHlwZS5zbGljZSgwLCAtMSlcbiAgfVxuXG4gIC8vIDEyLiBJZiBtaW1lVHlwZSBzdGFydHMgd2l0aCBVKzAwM0IgKDspLCB0aGVuIHByZXBlbmRcbiAgLy8gXCJ0ZXh0L3BsYWluXCIgdG8gbWltZVR5cGUuXG4gIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKCc7JykpIHtcbiAgICBtaW1lVHlwZSA9ICd0ZXh0L3BsYWluJyArIG1pbWVUeXBlXG4gIH1cblxuICAvLyAxMy4gTGV0IG1pbWVUeXBlUmVjb3JkIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZ1xuICAvLyBtaW1lVHlwZS5cbiAgbGV0IG1pbWVUeXBlUmVjb3JkID0gcGFyc2VNSU1FVHlwZShtaW1lVHlwZSlcblxuICAvLyAxNC4gSWYgbWltZVR5cGVSZWNvcmQgaXMgZmFpbHVyZSwgdGhlbiBzZXRcbiAgLy8gbWltZVR5cGVSZWNvcmQgdG8gdGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJLlxuICBpZiAobWltZVR5cGVSZWNvcmQgPT09ICdmYWlsdXJlJykge1xuICAgIG1pbWVUeXBlUmVjb3JkID0gcGFyc2VNSU1FVHlwZSgndGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJJylcbiAgfVxuXG4gIC8vIDE1LiBSZXR1cm4gYSBuZXcgZGF0YTogVVJMIHN0cnVjdCB3aG9zZSBNSU1FXG4gIC8vIHR5cGUgaXMgbWltZVR5cGVSZWNvcmQgYW5kIGJvZHkgaXMgYm9keS5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RhdGEtdXJsLXN0cnVjdFxuICByZXR1cm4geyBtaW1lVHlwZTogbWltZVR5cGVSZWNvcmQsIGJvZHkgfVxufVxuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtdXJsLXNlcmlhbGl6ZXJcbi8qKlxuICogQHBhcmFtIHtVUkx9IHVybFxuICogQHBhcmFtIHtib29sZWFufSBleGNsdWRlRnJhZ21lbnRcbiAqL1xuZnVuY3Rpb24gVVJMU2VyaWFsaXplciAodXJsLCBleGNsdWRlRnJhZ21lbnQgPSBmYWxzZSkge1xuICBpZiAoIWV4Y2x1ZGVGcmFnbWVudCkge1xuICAgIHJldHVybiB1cmwuaHJlZlxuICB9XG5cbiAgY29uc3QgaHJlZiA9IHVybC5ocmVmXG4gIGNvbnN0IGhhc2hMZW5ndGggPSB1cmwuaGFzaC5sZW5ndGhcblxuICByZXR1cm4gaGFzaExlbmd0aCA9PT0gMCA/IGhyZWYgOiBocmVmLnN1YnN0cmluZygwLCBocmVmLmxlbmd0aCAtIGhhc2hMZW5ndGgpXG59XG5cbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNjb2xsZWN0LWEtc2VxdWVuY2Utb2YtY29kZS1wb2ludHNcbi8qKlxuICogQHBhcmFtIHsoY2hhcjogc3RyaW5nKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHt7IHBvc2l0aW9uOiBudW1iZXIgfX0gcG9zaXRpb25cbiAqL1xuZnVuY3Rpb24gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyAoY29uZGl0aW9uLCBpbnB1dCwgcG9zaXRpb24pIHtcbiAgLy8gMS4gTGV0IHJlc3VsdCBiZSB0aGUgZW1wdHkgc3RyaW5nLlxuICBsZXQgcmVzdWx0ID0gJydcblxuICAvLyAyLiBXaGlsZSBwb3NpdGlvbiBkb2VzbuKAmXQgcG9pbnQgcGFzdCB0aGUgZW5kIG9mIGlucHV0IGFuZCB0aGVcbiAgLy8gY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXQgbWVldHMgdGhlIGNvbmRpdGlvbiBjb25kaXRpb246XG4gIHdoaWxlIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCAmJiBjb25kaXRpb24oaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dKSkge1xuICAgIC8vIDEuIEFwcGVuZCB0aGF0IGNvZGUgcG9pbnQgdG8gdGhlIGVuZCBvZiByZXN1bHQuXG4gICAgcmVzdWx0ICs9IGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXVxuXG4gICAgLy8gMi4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcbiAgfVxuXG4gIC8vIDMuIFJldHVybiByZXN1bHQuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBBIGZhc3RlciBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzIHRoYXQgb25seSB3b3JrcyB3aGVuIGNvbXBhcmluZyBhIHNpbmdsZSBjaGFyYWN0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhclxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge3sgcG9zaXRpb246IG51bWJlciB9fSBwb3NpdGlvblxuICovXG5mdW5jdGlvbiBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdCAoY2hhciwgaW5wdXQsIHBvc2l0aW9uKSB7XG4gIGNvbnN0IGlkeCA9IGlucHV0LmluZGV4T2YoY2hhciwgcG9zaXRpb24ucG9zaXRpb24pXG4gIGNvbnN0IHN0YXJ0ID0gcG9zaXRpb24ucG9zaXRpb25cblxuICBpZiAoaWR4ID09PSAtMSkge1xuICAgIHBvc2l0aW9uLnBvc2l0aW9uID0gaW5wdXQubGVuZ3RoXG4gICAgcmV0dXJuIGlucHV0LnNsaWNlKHN0YXJ0KVxuICB9XG5cbiAgcG9zaXRpb24ucG9zaXRpb24gPSBpZHhcbiAgcmV0dXJuIGlucHV0LnNsaWNlKHN0YXJ0LCBwb3NpdGlvbi5wb3NpdGlvbilcbn1cblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzdHJpbmctcGVyY2VudC1kZWNvZGVcbi8qKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgKi9cbmZ1bmN0aW9uIHN0cmluZ1BlcmNlbnREZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIExldCBieXRlcyBiZSB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgaW5wdXQuXG4gIGNvbnN0IGJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoaW5wdXQpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBwZXJjZW50LWRlY29kaW5nIG9mIGJ5dGVzLlxuICByZXR1cm4gcGVyY2VudERlY29kZShieXRlcylcbn1cblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNwZXJjZW50LWRlY29kZVxuLyoqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgKi9cbmZ1bmN0aW9uIHBlcmNlbnREZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIExldCBvdXRwdXQgYmUgYW4gZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgY29uc3Qgb3V0cHV0ID0gW11cblxuICAvLyAyLiBGb3IgZWFjaCBieXRlIGJ5dGUgaW4gaW5wdXQ6XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBieXRlID0gaW5wdXRbaV1cblxuICAgIC8vIDEuIElmIGJ5dGUgaXMgbm90IDB4MjUgKCUpLCB0aGVuIGFwcGVuZCBieXRlIHRvIG91dHB1dC5cbiAgICBpZiAoYnl0ZSAhPT0gMHgyNSkge1xuICAgICAgb3V0cHV0LnB1c2goYnl0ZSlcblxuICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgYnl0ZSBpcyAweDI1ICglKSBhbmQgdGhlIG5leHQgdHdvIGJ5dGVzXG4gICAgLy8gYWZ0ZXIgYnl0ZSBpbiBpbnB1dCBhcmUgbm90IGluIHRoZSByYW5nZXNcbiAgICAvLyAweDMwICgwKSB0byAweDM5ICg5KSwgMHg0MSAoQSkgdG8gMHg0NiAoRiksXG4gICAgLy8gYW5kIDB4NjEgKGEpIHRvIDB4NjYgKGYpLCBhbGwgaW5jbHVzaXZlLCBhcHBlbmQgYnl0ZVxuICAgIC8vIHRvIG91dHB1dC5cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnl0ZSA9PT0gMHgyNSAmJlxuICAgICAgIS9eWzAtOUEtRmEtZl17Mn0kL2kudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGlucHV0W2kgKyAxXSwgaW5wdXRbaSArIDJdKSlcbiAgICApIHtcbiAgICAgIG91dHB1dC5wdXNoKDB4MjUpXG5cbiAgICAvLyAzLiBPdGhlcndpc2U6XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDEuIExldCBieXRlUG9pbnQgYmUgdGhlIHR3byBieXRlcyBhZnRlciBieXRlIGluIGlucHV0LFxuICAgICAgLy8gZGVjb2RlZCwgYW5kIHRoZW4gaW50ZXJwcmV0ZWQgYXMgaGV4YWRlY2ltYWwgbnVtYmVyLlxuICAgICAgY29uc3QgbmV4dFR3b0J5dGVzID0gU3RyaW5nLmZyb21DaGFyQ29kZShpbnB1dFtpICsgMV0sIGlucHV0W2kgKyAyXSlcbiAgICAgIGNvbnN0IGJ5dGVQb2ludCA9IE51bWJlci5wYXJzZUludChuZXh0VHdvQnl0ZXMsIDE2KVxuXG4gICAgICAvLyAyLiBBcHBlbmQgYSBieXRlIHdob3NlIHZhbHVlIGlzIGJ5dGVQb2ludCB0byBvdXRwdXQuXG4gICAgICBvdXRwdXQucHVzaChieXRlUG9pbnQpXG5cbiAgICAgIC8vIDMuIFNraXAgdGhlIG5leHQgdHdvIGJ5dGVzIGluIGlucHV0LlxuICAgICAgaSArPSAyXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIG91dHB1dC5cbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShvdXRwdXQpXG59XG5cbi8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jcGFyc2UtYS1taW1lLXR5cGVcbi8qKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgKi9cbmZ1bmN0aW9uIHBhcnNlTUlNRVR5cGUgKGlucHV0KSB7XG4gIC8vIDEuIFJlbW92ZSBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlXG4gIC8vIGZyb20gaW5wdXQuXG4gIGlucHV0ID0gcmVtb3ZlSFRUUFdoaXRlc3BhY2UoaW5wdXQsIHRydWUsIHRydWUpXG5cbiAgLy8gMi4gTGV0IHBvc2l0aW9uIGJlIGEgcG9zaXRpb24gdmFyaWFibGUgZm9yIGlucHV0LFxuICAvLyBpbml0aWFsbHkgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mIGlucHV0LlxuICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gIC8vIDMuIExldCB0eXBlIGJlIHRoZSByZXN1bHQgb2YgY29sbGVjdGluZyBhIHNlcXVlbmNlXG4gIC8vIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCBVKzAwMkYgKC8pIGZyb21cbiAgLy8gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICBjb25zdCB0eXBlID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgJy8nLFxuICAgIGlucHV0LFxuICAgIHBvc2l0aW9uXG4gIClcblxuICAvLyA0LiBJZiB0eXBlIGlzIHRoZSBlbXB0eSBzdHJpbmcgb3IgZG9lcyBub3Qgc29sZWx5XG4gIC8vIGNvbnRhaW4gSFRUUCB0b2tlbiBjb2RlIHBvaW50cywgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgLy8gaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNodHRwLXRva2VuLWNvZGUtcG9pbnRcbiAgaWYgKHR5cGUubGVuZ3RoID09PSAwIHx8ICFIVFRQX1RPS0VOX0NPREVQT0lOVFMudGVzdCh0eXBlKSkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDUuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiByZXR1cm5cbiAgLy8gZmFpbHVyZVxuICBpZiAocG9zaXRpb24ucG9zaXRpb24gPiBpbnB1dC5sZW5ndGgpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyA2LiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuIChUaGlzIHNraXBzIHBhc3QgVSswMDJGICgvKS4pXG4gIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAvLyA3LiBMZXQgc3VidHlwZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYSBzZXF1ZW5jZSBvZlxuICAvLyBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgVSswMDNCICg7KSBmcm9tIGlucHV0LCBnaXZlblxuICAvLyBwb3NpdGlvbi5cbiAgbGV0IHN1YnR5cGUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAnOycsXG4gICAgaW5wdXQsXG4gICAgcG9zaXRpb25cbiAgKVxuXG4gIC8vIDguIFJlbW92ZSBhbnkgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlIGZyb20gc3VidHlwZS5cbiAgc3VidHlwZSA9IHJlbW92ZUhUVFBXaGl0ZXNwYWNlKHN1YnR5cGUsIGZhbHNlLCB0cnVlKVxuXG4gIC8vIDkuIElmIHN1YnR5cGUgaXMgdGhlIGVtcHR5IHN0cmluZyBvciBkb2VzIG5vdCBzb2xlbHlcbiAgLy8gY29udGFpbiBIVFRQIHRva2VuIGNvZGUgcG9pbnRzLCB0aGVuIHJldHVybiBmYWlsdXJlLlxuICBpZiAoc3VidHlwZS5sZW5ndGggPT09IDAgfHwgIUhUVFBfVE9LRU5fQ09ERVBPSU5UUy50ZXN0KHN1YnR5cGUpKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgY29uc3QgdHlwZUxvd2VyY2FzZSA9IHR5cGUudG9Mb3dlckNhc2UoKVxuICBjb25zdCBzdWJ0eXBlTG93ZXJjYXNlID0gc3VidHlwZS50b0xvd2VyQ2FzZSgpXG5cbiAgLy8gMTAuIExldCBtaW1lVHlwZSBiZSBhIG5ldyBNSU1FIHR5cGUgcmVjb3JkIHdob3NlIHR5cGVcbiAgLy8gaXMgdHlwZSwgaW4gQVNDSUkgbG93ZXJjYXNlLCBhbmQgc3VidHlwZSBpcyBzdWJ0eXBlLFxuICAvLyBpbiBBU0NJSSBsb3dlcmNhc2UuXG4gIC8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jbWltZS10eXBlXG4gIGNvbnN0IG1pbWVUeXBlID0ge1xuICAgIHR5cGU6IHR5cGVMb3dlcmNhc2UsXG4gICAgc3VidHlwZTogc3VidHlwZUxvd2VyY2FzZSxcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgcGFyYW1ldGVyczogbmV3IE1hcCgpLFxuICAgIC8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jbWltZS10eXBlLWVzc2VuY2VcbiAgICBlc3NlbmNlOiBgJHt0eXBlTG93ZXJjYXNlfS8ke3N1YnR5cGVMb3dlcmNhc2V9YFxuICB9XG5cbiAgLy8gMTEuIFdoaWxlIHBvc2l0aW9uIGlzIG5vdCBwYXN0IHRoZSBlbmQgb2YgaW5wdXQ6XG4gIHdoaWxlIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCkge1xuICAgIC8vIDEuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS4gKFRoaXMgc2tpcHMgcGFzdCBVKzAwM0IgKDspLilcbiAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgICAvLyAyLiBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgSFRUUFxuICAgIC8vIHdoaXRlc3BhY2UgZnJvbSBpbnB1dCBnaXZlbiBwb3NpdGlvbi5cbiAgICBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzKFxuICAgICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtd2hpdGVzcGFjZVxuICAgICAgY2hhciA9PiBIVFRQX1dISVRFU1BBQ0VfUkVHRVgudGVzdChjaGFyKSxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyAzLiBMZXQgcGFyYW1ldGVyTmFtZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYVxuICAgIC8vIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCBVKzAwM0IgKDspXG4gICAgLy8gb3IgVSswMDNEICg9KSBmcm9tIGlucHV0LCBnaXZlbiBwb3NpdGlvbi5cbiAgICBsZXQgcGFyYW1ldGVyTmFtZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMoXG4gICAgICAoY2hhcikgPT4gY2hhciAhPT0gJzsnICYmIGNoYXIgIT09ICc9JyxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyA0LiBTZXQgcGFyYW1ldGVyTmFtZSB0byBwYXJhbWV0ZXJOYW1lLCBpbiBBU0NJSVxuICAgIC8vIGxvd2VyY2FzZS5cbiAgICBwYXJhbWV0ZXJOYW1lID0gcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgICAvLyA1LiBJZiBwb3NpdGlvbiBpcyBub3QgcGFzdCB0aGUgZW5kIG9mIGlucHV0LCB0aGVuOlxuICAgIGlmIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgLy8gMS4gSWYgdGhlIGNvZGUgcG9pbnQgYXQgcG9zaXRpb24gd2l0aGluIGlucHV0IGlzXG4gICAgICAvLyBVKzAwM0IgKDspLCB0aGVuIGNvbnRpbnVlLlxuICAgICAgaWYgKGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSA9PT0gJzsnKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS4gKFRoaXMgc2tpcHMgcGFzdCBVKzAwM0QgKD0pLilcbiAgICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcbiAgICB9XG5cbiAgICAvLyA2LiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW4gYnJlYWsuXG4gICAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uID4gaW5wdXQubGVuZ3RoKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIC8vIDcuIExldCBwYXJhbWV0ZXJWYWx1ZSBiZSBudWxsLlxuICAgIGxldCBwYXJhbWV0ZXJWYWx1ZSA9IG51bGxcblxuICAgIC8vIDguIElmIHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpbiBpbnB1dCBpc1xuICAgIC8vIFUrMDAyMiAoXCIpLCB0aGVuOlxuICAgIGlmIChpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl0gPT09ICdcIicpIHtcbiAgICAgIC8vIDEuIFNldCBwYXJhbWV0ZXJWYWx1ZSB0byB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmdcbiAgICAgIC8vIGFuIEhUVFAgcXVvdGVkIHN0cmluZyBmcm9tIGlucHV0LCBnaXZlbiBwb3NpdGlvblxuICAgICAgLy8gYW5kIHRoZSBleHRyYWN0LXZhbHVlIGZsYWcuXG4gICAgICBwYXJhbWV0ZXJWYWx1ZSA9IGNvbGxlY3RBbkhUVFBRdW90ZWRTdHJpbmcoaW5wdXQsIHBvc2l0aW9uLCB0cnVlKVxuXG4gICAgICAvLyAyLiBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90XG4gICAgICAvLyBVKzAwM0IgKDspIGZyb20gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgICAgICc7JyxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHBvc2l0aW9uXG4gICAgICApXG5cbiAgICAvLyA5LiBPdGhlcndpc2U6XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDEuIFNldCBwYXJhbWV0ZXJWYWx1ZSB0byB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmdcbiAgICAgIC8vIGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IFUrMDAzQiAoOylcbiAgICAgIC8vIGZyb20gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgcGFyYW1ldGVyVmFsdWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAgICAgJzsnLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcG9zaXRpb25cbiAgICAgIClcblxuICAgICAgLy8gMi4gUmVtb3ZlIGFueSB0cmFpbGluZyBIVFRQIHdoaXRlc3BhY2UgZnJvbSBwYXJhbWV0ZXJWYWx1ZS5cbiAgICAgIHBhcmFtZXRlclZhbHVlID0gcmVtb3ZlSFRUUFdoaXRlc3BhY2UocGFyYW1ldGVyVmFsdWUsIGZhbHNlLCB0cnVlKVxuXG4gICAgICAvLyAzLiBJZiBwYXJhbWV0ZXJWYWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIGNvbnRpbnVlLlxuICAgICAgaWYgKHBhcmFtZXRlclZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDEwLiBJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZVxuICAgIC8vIC0gcGFyYW1ldGVyTmFtZSBpcyBub3QgdGhlIGVtcHR5IHN0cmluZ1xuICAgIC8vIC0gcGFyYW1ldGVyTmFtZSBzb2xlbHkgY29udGFpbnMgSFRUUCB0b2tlbiBjb2RlIHBvaW50c1xuICAgIC8vIC0gcGFyYW1ldGVyVmFsdWUgc29sZWx5IGNvbnRhaW5zIEhUVFAgcXVvdGVkLXN0cmluZyB0b2tlbiBjb2RlIHBvaW50c1xuICAgIC8vIC0gbWltZVR5cGXigJlzIHBhcmFtZXRlcnNbcGFyYW1ldGVyTmFtZV0gZG9lcyBub3QgZXhpc3RcbiAgICAvLyB0aGVuIHNldCBtaW1lVHlwZeKAmXMgcGFyYW1ldGVyc1twYXJhbWV0ZXJOYW1lXSB0byBwYXJhbWV0ZXJWYWx1ZS5cbiAgICBpZiAoXG4gICAgICBwYXJhbWV0ZXJOYW1lLmxlbmd0aCAhPT0gMCAmJlxuICAgICAgSFRUUF9UT0tFTl9DT0RFUE9JTlRTLnRlc3QocGFyYW1ldGVyTmFtZSkgJiZcbiAgICAgIChwYXJhbWV0ZXJWYWx1ZS5sZW5ndGggPT09IDAgfHwgSFRUUF9RVU9URURfU1RSSU5HX1RPS0VOUy50ZXN0KHBhcmFtZXRlclZhbHVlKSkgJiZcbiAgICAgICFtaW1lVHlwZS5wYXJhbWV0ZXJzLmhhcyhwYXJhbWV0ZXJOYW1lKVxuICAgICkge1xuICAgICAgbWltZVR5cGUucGFyYW1ldGVycy5zZXQocGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyVmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gMTIuIFJldHVybiBtaW1lVHlwZS5cbiAgcmV0dXJuIG1pbWVUeXBlXG59XG5cbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNmb3JnaXZpbmctYmFzZTY0LWRlY29kZVxuLyoqIEBwYXJhbSB7c3RyaW5nfSBkYXRhICovXG5mdW5jdGlvbiBmb3JnaXZpbmdCYXNlNjQgKGRhdGEpIHtcbiAgLy8gMS4gUmVtb3ZlIGFsbCBBU0NJSSB3aGl0ZXNwYWNlIGZyb20gZGF0YS5cbiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvW1xcdTAwMDlcXHUwMDBBXFx1MDAwQ1xcdTAwMERcXHUwMDIwXS9nLCAnJykgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICAvLyAyLiBJZiBkYXRh4oCZcyBjb2RlIHBvaW50IGxlbmd0aCBkaXZpZGVzIGJ5IDQgbGVhdmluZ1xuICAvLyBubyByZW1haW5kZXIsIHRoZW46XG4gIGlmIChkYXRhLmxlbmd0aCAlIDQgPT09IDApIHtcbiAgICAvLyAxLiBJZiBkYXRhIGVuZHMgd2l0aCBvbmUgb3IgdHdvIFUrMDAzRCAoPSkgY29kZSBwb2ludHMsXG4gICAgLy8gdGhlbiByZW1vdmUgdGhlbSBmcm9tIGRhdGEuXG4gICAgZGF0YSA9IGRhdGEucmVwbGFjZSgvPT89JC8sICcnKVxuICB9XG5cbiAgLy8gMy4gSWYgZGF0YeKAmXMgY29kZSBwb2ludCBsZW5ndGggZGl2aWRlcyBieSA0IGxlYXZpbmdcbiAgLy8gYSByZW1haW5kZXIgb2YgMSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgaWYgKGRhdGEubGVuZ3RoICUgNCA9PT0gMSkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDQuIElmIGRhdGEgY29udGFpbnMgYSBjb2RlIHBvaW50IHRoYXQgaXMgbm90IG9uZSBvZlxuICAvLyAgVSswMDJCICgrKVxuICAvLyAgVSswMDJGICgvKVxuICAvLyAgQVNDSUkgYWxwaGFudW1lcmljXG4gIC8vIHRoZW4gcmV0dXJuIGZhaWx1cmUuXG4gIGlmICgvW14rLzAtOUEtWmEtel0vLnRlc3QoZGF0YSkpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICBjb25zdCBiaW5hcnkgPSBhdG9iKGRhdGEpXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aClcblxuICBmb3IgKGxldCBieXRlID0gMDsgYnl0ZSA8IGJpbmFyeS5sZW5ndGg7IGJ5dGUrKykge1xuICAgIGJ5dGVzW2J5dGVdID0gYmluYXJ5LmNoYXJDb2RlQXQoYnl0ZSlcbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29sbGVjdC1hbi1odHRwLXF1b3RlZC1zdHJpbmdcbi8vIHRlc3RzOiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZXhhbXBsZS1odHRwLXF1b3RlZC1zdHJpbmdcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge3sgcG9zaXRpb246IG51bWJlciB9fSBwb3NpdGlvblxuICogQHBhcmFtIHtib29sZWFuP30gZXh0cmFjdFZhbHVlXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RBbkhUVFBRdW90ZWRTdHJpbmcgKGlucHV0LCBwb3NpdGlvbiwgZXh0cmFjdFZhbHVlKSB7XG4gIC8vIDEuIExldCBwb3NpdGlvblN0YXJ0IGJlIHBvc2l0aW9uLlxuICBjb25zdCBwb3NpdGlvblN0YXJ0ID0gcG9zaXRpb24ucG9zaXRpb25cblxuICAvLyAyLiBMZXQgdmFsdWUgYmUgdGhlIGVtcHR5IHN0cmluZy5cbiAgbGV0IHZhbHVlID0gJydcblxuICAvLyAzLiBBc3NlcnQ6IHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpbiBpbnB1dFxuICAvLyBpcyBVKzAwMjIgKFwiKS5cbiAgYXNzZXJ0KGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSA9PT0gJ1wiJylcblxuICAvLyA0LiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuXG4gIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAvLyA1LiBXaGlsZSB0cnVlOlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIDEuIEFwcGVuZCB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYSBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50c1xuICAgIC8vIHRoYXQgYXJlIG5vdCBVKzAwMjIgKFwiKSBvciBVKzAwNUMgKFxcKSBmcm9tIGlucHV0LCBnaXZlblxuICAgIC8vIHBvc2l0aW9uLCB0byB2YWx1ZS5cbiAgICB2YWx1ZSArPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzKFxuICAgICAgKGNoYXIpID0+IGNoYXIgIT09ICdcIicgJiYgY2hhciAhPT0gJ1xcXFwnLFxuICAgICAgaW5wdXQsXG4gICAgICBwb3NpdGlvblxuICAgIClcblxuICAgIC8vIDIuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiBicmVhay5cbiAgICBpZiAocG9zaXRpb24ucG9zaXRpb24gPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIC8vIDMuIExldCBxdW90ZU9yQmFja3NsYXNoIGJlIHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpblxuICAgIC8vIGlucHV0LlxuICAgIGNvbnN0IHF1b3RlT3JCYWNrc2xhc2ggPSBpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl1cblxuICAgIC8vIDQuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS5cbiAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgICAvLyA1LiBJZiBxdW90ZU9yQmFja3NsYXNoIGlzIFUrMDA1QyAoXFwpLCB0aGVuOlxuICAgIGlmIChxdW90ZU9yQmFja3NsYXNoID09PSAnXFxcXCcpIHtcbiAgICAgIC8vIDEuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiBhcHBlbmRcbiAgICAgIC8vIFUrMDA1QyAoXFwpIHRvIHZhbHVlIGFuZCBicmVhay5cbiAgICAgIGlmIChwb3NpdGlvbi5wb3NpdGlvbiA+PSBpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWUgKz0gJ1xcXFwnXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEFwcGVuZCB0aGUgY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXQgdG8gdmFsdWUuXG4gICAgICB2YWx1ZSArPSBpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl1cblxuICAgICAgLy8gMy4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICAgICAgcG9zaXRpb24ucG9zaXRpb24rK1xuXG4gICAgLy8gNi4gT3RoZXJ3aXNlOlxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAxLiBBc3NlcnQ6IHF1b3RlT3JCYWNrc2xhc2ggaXMgVSswMDIyIChcIikuXG4gICAgICBhc3NlcnQocXVvdGVPckJhY2tzbGFzaCA9PT0gJ1wiJylcblxuICAgICAgLy8gMi4gQnJlYWsuXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIDYuIElmIHRoZSBleHRyYWN0LXZhbHVlIGZsYWcgaXMgc2V0LCB0aGVuIHJldHVybiB2YWx1ZS5cbiAgaWYgKGV4dHJhY3RWYWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLy8gNy4gUmV0dXJuIHRoZSBjb2RlIHBvaW50cyBmcm9tIHBvc2l0aW9uU3RhcnQgdG8gcG9zaXRpb24sXG4gIC8vIGluY2x1c2l2ZSwgd2l0aGluIGlucHV0LlxuICByZXR1cm4gaW5wdXQuc2xpY2UocG9zaXRpb25TdGFydCwgcG9zaXRpb24ucG9zaXRpb24pXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI3NlcmlhbGl6ZS1hLW1pbWUtdHlwZVxuICovXG5mdW5jdGlvbiBzZXJpYWxpemVBTWltZVR5cGUgKG1pbWVUeXBlKSB7XG4gIGFzc2VydChtaW1lVHlwZSAhPT0gJ2ZhaWx1cmUnKVxuICBjb25zdCB7IHBhcmFtZXRlcnMsIGVzc2VuY2UgfSA9IG1pbWVUeXBlXG5cbiAgLy8gMS4gTGV0IHNlcmlhbGl6YXRpb24gYmUgdGhlIGNvbmNhdGVuYXRpb24gb2YgbWltZVR5cGXigJlzXG4gIC8vICAgIHR5cGUsIFUrMDAyRiAoLyksIGFuZCBtaW1lVHlwZeKAmXMgc3VidHlwZS5cbiAgbGV0IHNlcmlhbGl6YXRpb24gPSBlc3NlbmNlXG5cbiAgLy8gMi4gRm9yIGVhY2ggbmFtZSDihpIgdmFsdWUgb2YgbWltZVR5cGXigJlzIHBhcmFtZXRlcnM6XG4gIGZvciAobGV0IFtuYW1lLCB2YWx1ZV0gb2YgcGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAvLyAxLiBBcHBlbmQgVSswMDNCICg7KSB0byBzZXJpYWxpemF0aW9uLlxuICAgIHNlcmlhbGl6YXRpb24gKz0gJzsnXG5cbiAgICAvLyAyLiBBcHBlbmQgbmFtZSB0byBzZXJpYWxpemF0aW9uLlxuICAgIHNlcmlhbGl6YXRpb24gKz0gbmFtZVxuXG4gICAgLy8gMy4gQXBwZW5kIFUrMDAzRCAoPSkgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9ICc9J1xuXG4gICAgLy8gNC4gSWYgdmFsdWUgZG9lcyBub3Qgc29sZWx5IGNvbnRhaW4gSFRUUCB0b2tlbiBjb2RlXG4gICAgLy8gICAgcG9pbnRzIG9yIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHRoZW46XG4gICAgaWYgKCFIVFRQX1RPS0VOX0NPREVQT0lOVFMudGVzdCh2YWx1ZSkpIHtcbiAgICAgIC8vIDEuIFByZWNlZGUgZWFjaCBvY2N1cmVuY2Ugb2YgVSswMDIyIChcIikgb3JcbiAgICAgIC8vICAgIFUrMDA1QyAoXFwpIGluIHZhbHVlIHdpdGggVSswMDVDIChcXCkuXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLyhcXFxcfFwiKS9nLCAnXFxcXCQxJylcblxuICAgICAgLy8gMi4gUHJlcGVuZCBVKzAwMjIgKFwiKSB0byB2YWx1ZS5cbiAgICAgIHZhbHVlID0gJ1wiJyArIHZhbHVlXG5cbiAgICAgIC8vIDMuIEFwcGVuZCBVKzAwMjIgKFwiKSB0byB2YWx1ZS5cbiAgICAgIHZhbHVlICs9ICdcIidcbiAgICB9XG5cbiAgICAvLyA1LiBBcHBlbmQgdmFsdWUgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9IHZhbHVlXG4gIH1cblxuICAvLyAzLiBSZXR1cm4gc2VyaWFsaXphdGlvbi5cbiAgcmV0dXJuIHNlcmlhbGl6YXRpb25cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXdoaXRlc3BhY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyXG4gKi9cbmZ1bmN0aW9uIGlzSFRUUFdoaXRlU3BhY2UgKGNoYXIpIHtcbiAgcmV0dXJuIGNoYXIgPT09ICdcXHInIHx8IGNoYXIgPT09ICdcXG4nIHx8IGNoYXIgPT09ICdcXHQnIHx8IGNoYXIgPT09ICcgJ1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtd2hpdGVzcGFjZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICovXG5mdW5jdGlvbiByZW1vdmVIVFRQV2hpdGVzcGFjZSAoc3RyLCBsZWFkaW5nID0gdHJ1ZSwgdHJhaWxpbmcgPSB0cnVlKSB7XG4gIGxldCBsZWFkID0gMFxuICBsZXQgdHJhaWwgPSBzdHIubGVuZ3RoIC0gMVxuXG4gIGlmIChsZWFkaW5nKSB7XG4gICAgZm9yICg7IGxlYWQgPCBzdHIubGVuZ3RoICYmIGlzSFRUUFdoaXRlU3BhY2Uoc3RyW2xlYWRdKTsgbGVhZCsrKTtcbiAgfVxuXG4gIGlmICh0cmFpbGluZykge1xuICAgIGZvciAoOyB0cmFpbCA+IDAgJiYgaXNIVFRQV2hpdGVTcGFjZShzdHJbdHJhaWxdKTsgdHJhaWwtLSk7XG4gIH1cblxuICByZXR1cm4gc3RyLnNsaWNlKGxlYWQsIHRyYWlsICsgMSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS13aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhclxuICovXG5mdW5jdGlvbiBpc0FTQ0lJV2hpdGVzcGFjZSAoY2hhcikge1xuICByZXR1cm4gY2hhciA9PT0gJ1xccicgfHwgY2hhciA9PT0gJ1xcbicgfHwgY2hhciA9PT0gJ1xcdCcgfHwgY2hhciA9PT0gJ1xcZicgfHwgY2hhciA9PT0gJyAnXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtbGVhZGluZy1hbmQtdHJhaWxpbmctYXNjaWktd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiByZW1vdmVBU0NJSVdoaXRlc3BhY2UgKHN0ciwgbGVhZGluZyA9IHRydWUsIHRyYWlsaW5nID0gdHJ1ZSkge1xuICBsZXQgbGVhZCA9IDBcbiAgbGV0IHRyYWlsID0gc3RyLmxlbmd0aCAtIDFcblxuICBpZiAobGVhZGluZykge1xuICAgIGZvciAoOyBsZWFkIDwgc3RyLmxlbmd0aCAmJiBpc0FTQ0lJV2hpdGVzcGFjZShzdHJbbGVhZF0pOyBsZWFkKyspO1xuICB9XG5cbiAgaWYgKHRyYWlsaW5nKSB7XG4gICAgZm9yICg7IHRyYWlsID4gMCAmJiBpc0FTQ0lJV2hpdGVzcGFjZShzdHJbdHJhaWxdKTsgdHJhaWwtLSk7XG4gIH1cblxuICByZXR1cm4gc3RyLnNsaWNlKGxlYWQsIHRyYWlsICsgMSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRhdGFVUkxQcm9jZXNzb3IsXG4gIFVSTFNlcmlhbGl6ZXIsXG4gIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMsXG4gIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0LFxuICBzdHJpbmdQZXJjZW50RGVjb2RlLFxuICBwYXJzZU1JTUVUeXBlLFxuICBjb2xsZWN0QW5IVFRQUXVvdGVkU3RyaW5nLFxuICBzZXJpYWxpemVBTWltZVR5cGVcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgQmxvYiwgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuY29uc3QgeyBrU3RhdGUgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGlzQmxvYkxpa2UgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi93ZWJpZGwnKVxuY29uc3QgeyBwYXJzZU1JTUVUeXBlLCBzZXJpYWxpemVBTWltZVR5cGUgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKClcblxuY2xhc3MgRmlsZSBleHRlbmRzIEJsb2Ige1xuICBjb25zdHJ1Y3RvciAoZmlsZUJpdHMsIGZpbGVOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAvLyBUaGUgRmlsZSBjb25zdHJ1Y3RvciBpcyBpbnZva2VkIHdpdGggdHdvIG9yIHRocmVlIHBhcmFtZXRlcnMsIGRlcGVuZGluZ1xuICAgIC8vIG9uIHdoZXRoZXIgdGhlIG9wdGlvbmFsIGRpY3Rpb25hcnkgcGFyYW1ldGVyIGlzIHVzZWQuIFdoZW4gdGhlIEZpbGUoKVxuICAgIC8vIGNvbnN0cnVjdG9yIGlzIGludm9rZWQsIHVzZXIgYWdlbnRzIG11c3QgcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0ZpbGUgY29uc3RydWN0b3InIH0pXG5cbiAgICBmaWxlQml0cyA9IHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxCbG9iUGFydD4nXShmaWxlQml0cylcbiAgICBmaWxlTmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhmaWxlTmFtZSlcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuRmlsZVByb3BlcnR5QmFnKG9wdGlvbnMpXG5cbiAgICAvLyAxLiBMZXQgYnl0ZXMgYmUgdGhlIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGJsb2IgcGFydHMgZ2l2ZW4gZmlsZUJpdHMgYW5kXG4gICAgLy8gb3B0aW9ucy5cbiAgICAvLyBOb3RlOiBCbG9iIGhhbmRsZXMgdGhpcyBmb3IgdXNcblxuICAgIC8vIDIuIExldCBuIGJlIHRoZSBmaWxlTmFtZSBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgY29uc3QgbiA9IGZpbGVOYW1lXG5cbiAgICAvLyAzLiBQcm9jZXNzIEZpbGVQcm9wZXJ0eUJhZyBkaWN0aW9uYXJ5IGFyZ3VtZW50IGJ5IHJ1bm5pbmcgdGhlIGZvbGxvd2luZ1xuICAgIC8vIHN1YnN0ZXBzOlxuXG4gICAgLy8gICAgMS4gSWYgdGhlIHR5cGUgbWVtYmVyIGlzIHByb3ZpZGVkIGFuZCBpcyBub3QgdGhlIGVtcHR5IHN0cmluZywgbGV0IHRcbiAgICAvLyAgICBiZSBzZXQgdG8gdGhlIHR5cGUgZGljdGlvbmFyeSBtZW1iZXIuIElmIHQgY29udGFpbnMgYW55IGNoYXJhY3RlcnNcbiAgICAvLyAgICBvdXRzaWRlIHRoZSByYW5nZSBVKzAwMjAgdG8gVSswMDdFLCB0aGVuIHNldCB0IHRvIHRoZSBlbXB0eSBzdHJpbmdcbiAgICAvLyAgICBhbmQgcmV0dXJuIGZyb20gdGhlc2Ugc3Vic3RlcHMuXG4gICAgLy8gICAgMi4gQ29udmVydCBldmVyeSBjaGFyYWN0ZXIgaW4gdCB0byBBU0NJSSBsb3dlcmNhc2UuXG4gICAgbGV0IHQgPSBvcHRpb25zLnR5cGVcbiAgICBsZXQgZFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxhYmVsc1xuICAgIHN1YnN0ZXA6IHtcbiAgICAgIGlmICh0KSB7XG4gICAgICAgIHQgPSBwYXJzZU1JTUVUeXBlKHQpXG5cbiAgICAgICAgaWYgKHQgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIHQgPSAnJ1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sYWJlbHNcbiAgICAgICAgICBicmVhayBzdWJzdGVwXG4gICAgICAgIH1cblxuICAgICAgICB0ID0gc2VyaWFsaXplQU1pbWVUeXBlKHQpLnRvTG93ZXJDYXNlKClcbiAgICAgIH1cblxuICAgICAgLy8gICAgMy4gSWYgdGhlIGxhc3RNb2RpZmllZCBtZW1iZXIgaXMgcHJvdmlkZWQsIGxldCBkIGJlIHNldCB0byB0aGVcbiAgICAgIC8vICAgIGxhc3RNb2RpZmllZCBkaWN0aW9uYXJ5IG1lbWJlci4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCBzZXQgZCB0byB0aGVcbiAgICAgIC8vICAgIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSByZXByZXNlbnRlZCBhcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZVxuICAgICAgLy8gICAgdGhlIFVuaXggRXBvY2ggKHdoaWNoIGlzIHRoZSBlcXVpdmFsZW50IG9mIERhdGUubm93KCkgW0VDTUEtMjYyXSkuXG4gICAgICBkID0gb3B0aW9ucy5sYXN0TW9kaWZpZWRcbiAgICB9XG5cbiAgICAvLyA0LiBSZXR1cm4gYSBuZXcgRmlsZSBvYmplY3QgRiBzdWNoIHRoYXQ6XG4gICAgLy8gRiByZWZlcnMgdG8gdGhlIGJ5dGVzIGJ5dGUgc2VxdWVuY2UuXG4gICAgLy8gRi5zaXplIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIGluIGJ5dGVzLlxuICAgIC8vIEYubmFtZSBpcyBzZXQgdG8gbi5cbiAgICAvLyBGLnR5cGUgaXMgc2V0IHRvIHQuXG4gICAgLy8gRi5sYXN0TW9kaWZpZWQgaXMgc2V0IHRvIGQuXG5cbiAgICBzdXBlcihwcm9jZXNzQmxvYlBhcnRzKGZpbGVCaXRzLCBvcHRpb25zKSwgeyB0eXBlOiB0IH0pXG4gICAgdGhpc1trU3RhdGVdID0ge1xuICAgICAgbmFtZTogbixcbiAgICAgIGxhc3RNb2RpZmllZDogZCxcbiAgICAgIHR5cGU6IHRcbiAgICB9XG4gIH1cblxuICBnZXQgbmFtZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubmFtZVxuICB9XG5cbiAgZ2V0IGxhc3RNb2RpZmllZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubGFzdE1vZGlmaWVkXG4gIH1cblxuICBnZXQgdHlwZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0udHlwZVxuICB9XG59XG5cbmNsYXNzIEZpbGVMaWtlIHtcbiAgY29uc3RydWN0b3IgKGJsb2JMaWtlLCBmaWxlTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gVE9ETzogYXJndW1lbnQgaWRsIHR5cGUgY2hlY2tcblxuICAgIC8vIFRoZSBGaWxlIGNvbnN0cnVjdG9yIGlzIGludm9rZWQgd2l0aCB0d28gb3IgdGhyZWUgcGFyYW1ldGVycywgZGVwZW5kaW5nXG4gICAgLy8gb24gd2hldGhlciB0aGUgb3B0aW9uYWwgZGljdGlvbmFyeSBwYXJhbWV0ZXIgaXMgdXNlZC4gV2hlbiB0aGUgRmlsZSgpXG4gICAgLy8gY29uc3RydWN0b3IgaXMgaW52b2tlZCwgdXNlciBhZ2VudHMgbXVzdCBydW4gdGhlIGZvbGxvd2luZyBzdGVwczpcblxuICAgIC8vIDEuIExldCBieXRlcyBiZSB0aGUgcmVzdWx0IG9mIHByb2Nlc3NpbmcgYmxvYiBwYXJ0cyBnaXZlbiBmaWxlQml0cyBhbmRcbiAgICAvLyBvcHRpb25zLlxuXG4gICAgLy8gMi4gTGV0IG4gYmUgdGhlIGZpbGVOYW1lIGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBjb25zdCBuID0gZmlsZU5hbWVcblxuICAgIC8vIDMuIFByb2Nlc3MgRmlsZVByb3BlcnR5QmFnIGRpY3Rpb25hcnkgYXJndW1lbnQgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nXG4gICAgLy8gc3Vic3RlcHM6XG5cbiAgICAvLyAgICAxLiBJZiB0aGUgdHlwZSBtZW1iZXIgaXMgcHJvdmlkZWQgYW5kIGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nLCBsZXQgdFxuICAgIC8vICAgIGJlIHNldCB0byB0aGUgdHlwZSBkaWN0aW9uYXJ5IG1lbWJlci4gSWYgdCBjb250YWlucyBhbnkgY2hhcmFjdGVyc1xuICAgIC8vICAgIG91dHNpZGUgdGhlIHJhbmdlIFUrMDAyMCB0byBVKzAwN0UsIHRoZW4gc2V0IHQgdG8gdGhlIGVtcHR5IHN0cmluZ1xuICAgIC8vICAgIGFuZCByZXR1cm4gZnJvbSB0aGVzZSBzdWJzdGVwcy5cbiAgICAvLyAgICBUT0RPXG4gICAgY29uc3QgdCA9IG9wdGlvbnMudHlwZVxuXG4gICAgLy8gICAgMi4gQ29udmVydCBldmVyeSBjaGFyYWN0ZXIgaW4gdCB0byBBU0NJSSBsb3dlcmNhc2UuXG4gICAgLy8gICAgVE9ET1xuXG4gICAgLy8gICAgMy4gSWYgdGhlIGxhc3RNb2RpZmllZCBtZW1iZXIgaXMgcHJvdmlkZWQsIGxldCBkIGJlIHNldCB0byB0aGVcbiAgICAvLyAgICBsYXN0TW9kaWZpZWQgZGljdGlvbmFyeSBtZW1iZXIuIElmIGl0IGlzIG5vdCBwcm92aWRlZCwgc2V0IGQgdG8gdGhlXG4gICAgLy8gICAgY3VycmVudCBkYXRlIGFuZCB0aW1lIHJlcHJlc2VudGVkIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlXG4gICAgLy8gICAgdGhlIFVuaXggRXBvY2ggKHdoaWNoIGlzIHRoZSBlcXVpdmFsZW50IG9mIERhdGUubm93KCkgW0VDTUEtMjYyXSkuXG4gICAgY29uc3QgZCA9IG9wdGlvbnMubGFzdE1vZGlmaWVkID8/IERhdGUubm93KClcblxuICAgIC8vIDQuIFJldHVybiBhIG5ldyBGaWxlIG9iamVjdCBGIHN1Y2ggdGhhdDpcbiAgICAvLyBGIHJlZmVycyB0byB0aGUgYnl0ZXMgYnl0ZSBzZXF1ZW5jZS5cbiAgICAvLyBGLnNpemUgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgdG90YWwgYnl0ZXMgaW4gYnl0ZXMuXG4gICAgLy8gRi5uYW1lIGlzIHNldCB0byBuLlxuICAgIC8vIEYudHlwZSBpcyBzZXQgdG8gdC5cbiAgICAvLyBGLmxhc3RNb2RpZmllZCBpcyBzZXQgdG8gZC5cblxuICAgIHRoaXNba1N0YXRlXSA9IHtcbiAgICAgIGJsb2JMaWtlLFxuICAgICAgbmFtZTogbixcbiAgICAgIHR5cGU6IHQsXG4gICAgICBsYXN0TW9kaWZpZWQ6IGRcbiAgICB9XG4gIH1cblxuICBzdHJlYW0gKC4uLmFyZ3MpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2Uuc3RyZWFtKC4uLmFyZ3MpXG4gIH1cblxuICBhcnJheUJ1ZmZlciAoLi4uYXJncykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS5hcnJheUJ1ZmZlciguLi5hcmdzKVxuICB9XG5cbiAgc2xpY2UgKC4uLmFyZ3MpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2Uuc2xpY2UoLi4uYXJncylcbiAgfVxuXG4gIHRleHQgKC4uLmFyZ3MpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2UudGV4dCguLi5hcmdzKVxuICB9XG5cbiAgZ2V0IHNpemUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS5zaXplXG4gIH1cblxuICBnZXQgdHlwZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJsb2JMaWtlLnR5cGVcbiAgfVxuXG4gIGdldCBuYW1lICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubmFtZVxuICB9XG5cbiAgZ2V0IGxhc3RNb2RpZmllZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmxhc3RNb2RpZmllZFxuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddICgpIHtcbiAgICByZXR1cm4gJ0ZpbGUnXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRmlsZS5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0ZpbGUnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBuYW1lOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBsYXN0TW9kaWZpZWQ6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkJsb2IgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKEJsb2IpXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkJsb2JQYXJ0ID0gZnVuY3Rpb24gKFYsIG9wdHMpIHtcbiAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgPT09ICdPYmplY3QnKSB7XG4gICAgaWYgKGlzQmxvYkxpa2UoVikpIHtcbiAgICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5CbG9iKFYsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIEFycmF5QnVmZmVyLmlzVmlldyhWKSB8fFxuICAgICAgdHlwZXMuaXNBbnlBcnJheUJ1ZmZlcihWKVxuICAgICkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkJ1ZmZlclNvdXJjZShWLCBvcHRzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcoViwgb3B0cylcbn1cblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPEJsb2JQYXJ0PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5CbG9iUGFydFxuKVxuXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvRmlsZUFQSS8jZGZuLUZpbGVQcm9wZXJ0eUJhZ1xud2ViaWRsLmNvbnZlcnRlcnMuRmlsZVByb3BlcnR5QmFnID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAnbGFzdE1vZGlmaWVkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydsb25nIGxvbmcnXSxcbiAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgIHJldHVybiBEYXRlLm5vdygpXG4gICAgfVxuICB9LFxuICB7XG4gICAga2V5OiAndHlwZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnZW5kaW5ncycsXG4gICAgY29udmVydGVyOiAodmFsdWUpID0+IHtcbiAgICAgIHZhbHVlID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKHZhbHVlKVxuICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpXG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gJ25hdGl2ZScpIHtcbiAgICAgICAgdmFsdWUgPSAndHJhbnNwYXJlbnQnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG4gICAgZGVmYXVsdFZhbHVlOiAndHJhbnNwYXJlbnQnXG4gIH1cbl0pXG5cbi8qKlxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvRmlsZUFQSS8jcHJvY2Vzcy1ibG9iLXBhcnRzXG4gKiBAcGFyYW0geyhOb2RlSlMuVHlwZWRBcnJheXxCbG9ifHN0cmluZylbXX0gcGFydHNcbiAqIEBwYXJhbSB7eyB0eXBlOiBzdHJpbmcsIGVuZGluZ3M6IHN0cmluZyB9fSBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NCbG9iUGFydHMgKHBhcnRzLCBvcHRpb25zKSB7XG4gIC8vIDEuIExldCBieXRlcyBiZSBhbiBlbXB0eSBzZXF1ZW5jZSBvZiBieXRlcy5cbiAgLyoqIEB0eXBlIHtOb2RlSlMuVHlwZWRBcnJheVtdfSAqL1xuICBjb25zdCBieXRlcyA9IFtdXG5cbiAgLy8gMi4gRm9yIGVhY2ggZWxlbWVudCBpbiBwYXJ0czpcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHBhcnRzKSB7XG4gICAgLy8gMS4gSWYgZWxlbWVudCBpcyBhIFVTVlN0cmluZywgcnVuIHRoZSBmb2xsb3dpbmcgc3Vic3RlcHM6XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gMS4gTGV0IHMgYmUgZWxlbWVudC5cbiAgICAgIGxldCBzID0gZWxlbWVudFxuXG4gICAgICAvLyAyLiBJZiB0aGUgZW5kaW5ncyBtZW1iZXIgb2Ygb3B0aW9ucyBpcyBcIm5hdGl2ZVwiLCBzZXQgc1xuICAgICAgLy8gICAgdG8gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIGxpbmUgZW5kaW5ncyB0byBuYXRpdmVcbiAgICAgIC8vICAgIG9mIGVsZW1lbnQuXG4gICAgICBpZiAob3B0aW9ucy5lbmRpbmdzID09PSAnbmF0aXZlJykge1xuICAgICAgICBzID0gY29udmVydExpbmVFbmRpbmdzTmF0aXZlKHMpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIEFwcGVuZCB0aGUgcmVzdWx0IG9mIFVURi04IGVuY29kaW5nIHMgdG8gYnl0ZXMuXG4gICAgICBieXRlcy5wdXNoKGVuY29kZXIuZW5jb2RlKHMpKVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlcy5pc0FueUFycmF5QnVmZmVyKGVsZW1lbnQpIHx8XG4gICAgICB0eXBlcy5pc1R5cGVkQXJyYXkoZWxlbWVudClcbiAgICApIHtcbiAgICAgIC8vIDIuIElmIGVsZW1lbnQgaXMgYSBCdWZmZXJTb3VyY2UsIGdldCBhIGNvcHkgb2YgdGhlXG4gICAgICAvLyAgICBieXRlcyBoZWxkIGJ5IHRoZSBidWZmZXIgc291cmNlLCBhbmQgYXBwZW5kIHRob3NlXG4gICAgICAvLyAgICBieXRlcyB0byBieXRlcy5cbiAgICAgIGlmICghZWxlbWVudC5idWZmZXIpIHsgLy8gQXJyYXlCdWZmZXJcbiAgICAgICAgYnl0ZXMucHVzaChuZXcgVWludDhBcnJheShlbGVtZW50KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoZWxlbWVudC5idWZmZXIsIGVsZW1lbnQuYnl0ZU9mZnNldCwgZWxlbWVudC5ieXRlTGVuZ3RoKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0Jsb2JMaWtlKGVsZW1lbnQpKSB7XG4gICAgICAvLyAzLiBJZiBlbGVtZW50IGlzIGEgQmxvYiwgYXBwZW5kIHRoZSBieXRlcyBpdCByZXByZXNlbnRzXG4gICAgICAvLyAgICB0byBieXRlcy5cbiAgICAgIGJ5dGVzLnB1c2goZWxlbWVudClcbiAgICB9XG4gIH1cblxuICAvLyAzLiBSZXR1cm4gYnl0ZXMuXG4gIHJldHVybiBieXRlc1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL0ZpbGVBUEkvI2NvbnZlcnQtbGluZS1lbmRpbmdzLXRvLW5hdGl2ZVxuICogQHBhcmFtIHtzdHJpbmd9IHNcbiAqL1xuZnVuY3Rpb24gY29udmVydExpbmVFbmRpbmdzTmF0aXZlIChzKSB7XG4gIC8vIDEuIExldCBuYXRpdmUgbGluZSBlbmRpbmcgYmUgYmUgdGhlIGNvZGUgcG9pbnQgVSswMDBBIExGLlxuICBsZXQgbmF0aXZlTGluZUVuZGluZyA9ICdcXG4nXG5cbiAgLy8gMi4gSWYgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm3igJlzIGNvbnZlbnRpb25zIGFyZSB0b1xuICAvLyAgICByZXByZXNlbnQgbmV3bGluZXMgYXMgYSBjYXJyaWFnZSByZXR1cm4gYW5kIGxpbmUgZmVlZFxuICAvLyAgICBzZXF1ZW5jZSwgc2V0IG5hdGl2ZSBsaW5lIGVuZGluZyB0byB0aGUgY29kZSBwb2ludFxuICAvLyAgICBVKzAwMEQgQ1IgZm9sbG93ZWQgYnkgdGhlIGNvZGUgcG9pbnQgVSswMDBBIExGLlxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIG5hdGl2ZUxpbmVFbmRpbmcgPSAnXFxyXFxuJ1xuICB9XG5cbiAgcmV0dXJuIHMucmVwbGFjZSgvXFxyP1xcbi9nLCBuYXRpdmVMaW5lRW5kaW5nKVxufVxuXG4vLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIG1vdmVkIHRvIC4vdXRpbC5qcywgc29tZSB0b29scyAoc3VjaCBhc1xuLy8gcm9sbHVwKSB3aWxsIHdhcm4gYWJvdXQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLiBTZWU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTYyOVxuZnVuY3Rpb24gaXNGaWxlTGlrZSAob2JqZWN0KSB7XG4gIHJldHVybiAoXG4gICAgKE5hdGl2ZUZpbGUgJiYgb2JqZWN0IGluc3RhbmNlb2YgTmF0aXZlRmlsZSkgfHxcbiAgICBvYmplY3QgaW5zdGFuY2VvZiBGaWxlIHx8IChcbiAgICAgIG9iamVjdCAmJlxuICAgICAgKHR5cGVvZiBvYmplY3Quc3RyZWFtID09PSAnZnVuY3Rpb24nIHx8XG4gICAgICB0eXBlb2Ygb2JqZWN0LmFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nKSAmJlxuICAgICAgb2JqZWN0W1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdGaWxlJ1xuICAgIClcbiAgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgRmlsZSwgRmlsZUxpa2UsIGlzRmlsZUxpa2UgfVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBpc0Jsb2JMaWtlLCB0b1VTVlN0cmluZywgbWFrZUl0ZXJhdG9yIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBrU3RhdGUgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IEZpbGU6IFVuZGljaUZpbGUsIEZpbGVMaWtlLCBpc0ZpbGVMaWtlIH0gPSByZXF1aXJlKCcuL2ZpbGUnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgQmxvYiwgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcblxuLyoqIEB0eXBlIHtnbG9iYWxUaGlzWydGaWxlJ119ICovXG5jb25zdCBGaWxlID0gTmF0aXZlRmlsZSA/PyBVbmRpY2lGaWxlXG5cbi8vIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jZm9ybWRhdGFcbmNsYXNzIEZvcm1EYXRhIHtcbiAgY29uc3RydWN0b3IgKGZvcm0pIHtcbiAgICBpZiAoZm9ybSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmNvbnZlcnNpb25GYWlsZWQoe1xuICAgICAgICBwcmVmaXg6ICdGb3JtRGF0YSBjb25zdHJ1Y3RvcicsXG4gICAgICAgIGFyZ3VtZW50OiAnQXJndW1lbnQgMScsXG4gICAgICAgIHR5cGVzOiBbJ3VuZGVmaW5lZCddXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXNba1N0YXRlXSA9IFtdXG4gIH1cblxuICBhcHBlbmQgKG5hbWUsIHZhbHVlLCBmaWxlbmFtZSA9IHVuZGVmaW5lZCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmFwcGVuZCcgfSlcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICFpc0Jsb2JMaWtlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kJyBvbiAnRm9ybURhdGEnOiBwYXJhbWV0ZXIgMiBpcyBub3Qgb2YgdHlwZSAnQmxvYidcIlxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIDEuIExldCB2YWx1ZSBiZSB2YWx1ZSBpZiBnaXZlbjsgb3RoZXJ3aXNlIGJsb2JWYWx1ZS5cblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcbiAgICB2YWx1ZSA9IGlzQmxvYkxpa2UodmFsdWUpXG4gICAgICA/IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IodmFsdWUsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICAgICAgOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcodmFsdWUpXG4gICAgZmlsZW5hbWUgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzXG4gICAgICA/IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhmaWxlbmFtZSlcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAvLyAyLiBMZXQgZW50cnkgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBlbnRyeSB3aXRoXG4gICAgLy8gbmFtZSwgdmFsdWUsIGFuZCBmaWxlbmFtZSBpZiBnaXZlbi5cbiAgICBjb25zdCBlbnRyeSA9IG1ha2VFbnRyeShuYW1lLCB2YWx1ZSwgZmlsZW5hbWUpXG5cbiAgICAvLyAzLiBBcHBlbmQgZW50cnkgdG8gdGhpc+KAmXMgZW50cnkgbGlzdC5cbiAgICB0aGlzW2tTdGF0ZV0ucHVzaChlbnRyeSlcbiAgfVxuXG4gIGRlbGV0ZSAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmRlbGV0ZScgfSlcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcblxuICAgIC8vIFRoZSBkZWxldGUobmFtZSkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZW1vdmUgYWxsIGVudHJpZXMgd2hvc2UgbmFtZVxuICAgIC8vIGlzIG5hbWUgZnJvbSB0aGlz4oCZcyBlbnRyeSBsaXN0LlxuICAgIHRoaXNba1N0YXRlXSA9IHRoaXNba1N0YXRlXS5maWx0ZXIoZW50cnkgPT4gZW50cnkubmFtZSAhPT0gbmFtZSlcbiAgfVxuXG4gIGdldCAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmdldCcgfSlcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IHdob3NlIG5hbWUgaXMgbmFtZSBpbiB0aGlz4oCZcyBlbnRyeSBsaXN0LFxuICAgIC8vIHRoZW4gcmV0dXJuIG51bGwuXG4gICAgY29uc3QgaWR4ID0gdGhpc1trU3RhdGVdLmZpbmRJbmRleCgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpXG4gICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZW50cnkgd2hvc2UgbmFtZSBpcyBuYW1lIGZyb21cbiAgICAvLyB0aGlz4oCZcyBlbnRyeSBsaXN0LlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV1baWR4XS52YWx1ZVxuICB9XG5cbiAgZ2V0QWxsIChuYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRm9ybURhdGEuZ2V0QWxsJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lKVxuXG4gICAgLy8gMS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgd2hvc2UgbmFtZSBpcyBuYW1lIGluIHRoaXPigJlzIGVudHJ5IGxpc3QsXG4gICAgLy8gdGhlbiByZXR1cm4gdGhlIGVtcHR5IGxpc3QuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGVudHJpZXMgd2hvc2UgbmFtZSBpcyBuYW1lLCBpbiBvcmRlcixcbiAgICAvLyBmcm9tIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXVxuICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpXG4gICAgICAubWFwKChlbnRyeSkgPT4gZW50cnkudmFsdWUpXG4gIH1cblxuICBoYXMgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGb3JtRGF0YS5oYXMnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKG5hbWUpXG5cbiAgICAvLyBUaGUgaGFzKG5hbWUpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYW4gZW50cnlcbiAgICAvLyB3aG9zZSBuYW1lIGlzIG5hbWUgaW4gdGhpc+KAmXMgZW50cnkgbGlzdDsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gbmFtZSkgIT09IC0xXG4gIH1cblxuICBzZXQgKG5hbWUsIHZhbHVlLCBmaWxlbmFtZSA9IHVuZGVmaW5lZCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLnNldCcgfSlcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICFpc0Jsb2JMaWtlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2V0JyBvbiAnRm9ybURhdGEnOiBwYXJhbWV0ZXIgMiBpcyBub3Qgb2YgdHlwZSAnQmxvYidcIlxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFRoZSBzZXQobmFtZSwgdmFsdWUpIGFuZCBzZXQobmFtZSwgYmxvYlZhbHVlLCBmaWxlbmFtZSkgbWV0aG9kIHN0ZXBzXG4gICAgLy8gYXJlOlxuXG4gICAgLy8gMS4gTGV0IHZhbHVlIGJlIHZhbHVlIGlmIGdpdmVuOyBvdGhlcndpc2UgYmxvYlZhbHVlLlxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lKVxuICAgIHZhbHVlID0gaXNCbG9iTGlrZSh2YWx1ZSlcbiAgICAgID8gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYih2YWx1ZSwgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgICA6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh2YWx1ZSlcbiAgICBmaWxlbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDNcbiAgICAgID8gdG9VU1ZTdHJpbmcoZmlsZW5hbWUpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgLy8gMi4gTGV0IGVudHJ5IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gZW50cnkgd2l0aCBuYW1lLCB2YWx1ZSwgYW5kXG4gICAgLy8gZmlsZW5hbWUgaWYgZ2l2ZW4uXG4gICAgY29uc3QgZW50cnkgPSBtYWtlRW50cnkobmFtZSwgdmFsdWUsIGZpbGVuYW1lKVxuXG4gICAgLy8gMy4gSWYgdGhlcmUgYXJlIGVudHJpZXMgaW4gdGhpc+KAmXMgZW50cnkgbGlzdCB3aG9zZSBuYW1lIGlzIG5hbWUsIHRoZW5cbiAgICAvLyByZXBsYWNlIHRoZSBmaXJzdCBzdWNoIGVudHJ5IHdpdGggZW50cnkgYW5kIHJlbW92ZSB0aGUgb3RoZXJzLlxuICAgIGNvbnN0IGlkeCA9IHRoaXNba1N0YXRlXS5maW5kSW5kZXgoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSBuYW1lKVxuICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICB0aGlzW2tTdGF0ZV0gPSBbXG4gICAgICAgIC4uLnRoaXNba1N0YXRlXS5zbGljZSgwLCBpZHgpLFxuICAgICAgICBlbnRyeSxcbiAgICAgICAgLi4udGhpc1trU3RhdGVdLnNsaWNlKGlkeCArIDEpLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgIT09IG5hbWUpXG4gICAgICBdXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgYXBwZW5kIGVudHJ5IHRvIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgICB0aGlzW2tTdGF0ZV0ucHVzaChlbnRyeSlcbiAgICB9XG4gIH1cblxuICBlbnRyaWVzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHJldHVybiBtYWtlSXRlcmF0b3IoXG4gICAgICAoKSA9PiB0aGlzW2tTdGF0ZV0ubWFwKHBhaXIgPT4gW3BhaXIubmFtZSwgcGFpci52YWx1ZV0pLFxuICAgICAgJ0Zvcm1EYXRhJyxcbiAgICAgICdrZXkrdmFsdWUnXG4gICAgKVxuICB9XG5cbiAga2V5cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFxuICAgICAgKCkgPT4gdGhpc1trU3RhdGVdLm1hcChwYWlyID0+IFtwYWlyLm5hbWUsIHBhaXIudmFsdWVdKSxcbiAgICAgICdGb3JtRGF0YScsXG4gICAgICAna2V5J1xuICAgIClcbiAgfVxuXG4gIHZhbHVlcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFxuICAgICAgKCkgPT4gdGhpc1trU3RhdGVdLm1hcChwYWlyID0+IFtwYWlyLm5hbWUsIHBhaXIudmFsdWVdKSxcbiAgICAgICdGb3JtRGF0YScsXG4gICAgICAndmFsdWUnXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nLCBzZWxmOiBGb3JtRGF0YSkgPT4gdm9pZH0gY2FsbGJhY2tGblxuICAgKiBAcGFyYW0ge3Vua25vd259IHRoaXNBcmdcbiAgICovXG4gIGZvckVhY2ggKGNhbGxiYWNrRm4sIHRoaXNBcmcgPSBnbG9iYWxUaGlzKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRm9ybURhdGEuZm9yRWFjaCcgfSlcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2tGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnZm9yRWFjaCcgb24gJ0Zvcm1EYXRhJzogcGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgJ0Z1bmN0aW9uJy5cIlxuICAgICAgKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMpIHtcbiAgICAgIGNhbGxiYWNrRm4uYXBwbHkodGhpc0FyZywgW3ZhbHVlLCBrZXksIHRoaXNdKVxuICAgIH1cbiAgfVxufVxuXG5Gb3JtRGF0YS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEZvcm1EYXRhLnByb3RvdHlwZS5lbnRyaWVzXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZvcm1EYXRhLnByb3RvdHlwZSwge1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnRm9ybURhdGEnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybS1jb250cm9sLWluZnJhc3RydWN0dXJlLmh0bWwjY3JlYXRlLWFuLWVudHJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtzdHJpbmd8QmxvYn0gdmFsdWVcbiAqIEBwYXJhbSB7P3N0cmluZ30gZmlsZW5hbWVcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIG1ha2VFbnRyeSAobmFtZSwgdmFsdWUsIGZpbGVuYW1lKSB7XG4gIC8vIDEuIFNldCBuYW1lIHRvIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBuYW1lIGludG8gYSBzY2FsYXIgdmFsdWUgc3RyaW5nLlxuICAvLyBcIlRvIGNvbnZlcnQgYSBzdHJpbmcgaW50byBhIHNjYWxhciB2YWx1ZSBzdHJpbmcsIHJlcGxhY2UgYW55IHN1cnJvZ2F0ZXNcbiAgLy8gIHdpdGggVStGRkZELlwiXG4gIC8vIHNlZTogaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0LXYxOC54L2RvY3MvYXBpL2J1ZmZlci5odG1sI2J1ZnRvc3RyaW5nZW5jb2Rpbmctc3RhcnQtZW5kXG4gIG5hbWUgPSBCdWZmZXIuZnJvbShuYW1lKS50b1N0cmluZygndXRmOCcpXG5cbiAgLy8gMi4gSWYgdmFsdWUgaXMgYSBzdHJpbmcsIHRoZW4gc2V0IHZhbHVlIHRvIHRoZSByZXN1bHQgb2YgY29udmVydGluZ1xuICAvLyAgICB2YWx1ZSBpbnRvIGEgc2NhbGFyIHZhbHVlIHN0cmluZy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZSA9IEJ1ZmZlci5mcm9tKHZhbHVlKS50b1N0cmluZygndXRmOCcpXG4gIH0gZWxzZSB7XG4gICAgLy8gMy4gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gSWYgdmFsdWUgaXMgbm90IGEgRmlsZSBvYmplY3QsIHRoZW4gc2V0IHZhbHVlIHRvIGEgbmV3IEZpbGUgb2JqZWN0LFxuICAgIC8vICAgIHJlcHJlc2VudGluZyB0aGUgc2FtZSBieXRlcywgd2hvc2UgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgaXMgXCJibG9iXCJcbiAgICBpZiAoIWlzRmlsZUxpa2UodmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgQmxvYlxuICAgICAgICA/IG5ldyBGaWxlKFt2YWx1ZV0sICdibG9iJywgeyB0eXBlOiB2YWx1ZS50eXBlIH0pXG4gICAgICAgIDogbmV3IEZpbGVMaWtlKHZhbHVlLCAnYmxvYicsIHsgdHlwZTogdmFsdWUudHlwZSB9KVxuICAgIH1cblxuICAgIC8vIDIuIElmIGZpbGVuYW1lIGlzIGdpdmVuLCB0aGVuIHNldCB2YWx1ZSB0byBhIG5ldyBGaWxlIG9iamVjdCxcbiAgICAvLyAgICByZXByZXNlbnRpbmcgdGhlIHNhbWUgYnl0ZXMsIHdob3NlIG5hbWUgYXR0cmlidXRlIGlzIGZpbGVuYW1lLlxuICAgIGlmIChmaWxlbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiogQHR5cGUge0ZpbGVQcm9wZXJ0eUJhZ30gKi9cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgIGxhc3RNb2RpZmllZDogdmFsdWUubGFzdE1vZGlmaWVkXG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gKE5hdGl2ZUZpbGUgJiYgdmFsdWUgaW5zdGFuY2VvZiBOYXRpdmVGaWxlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVuZGljaUZpbGVcbiAgICAgICAgPyBuZXcgRmlsZShbdmFsdWVdLCBmaWxlbmFtZSwgb3B0aW9ucylcbiAgICAgICAgOiBuZXcgRmlsZUxpa2UodmFsdWUsIGZpbGVuYW1lLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIFJldHVybiBhbiBlbnRyeSB3aG9zZSBuYW1lIGlzIG5hbWUgYW5kIHdob3NlIHZhbHVlIGlzIHZhbHVlLlxuICByZXR1cm4geyBuYW1lLCB2YWx1ZSB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBGb3JtRGF0YSB9XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBCdXNib3kgPSByZXF1aXJlKCdAZmFzdGlmeS9idXNib3knKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7XG4gIFJlYWRhYmxlU3RyZWFtRnJvbSxcbiAgaXNCbG9iTGlrZSxcbiAgaXNSZWFkYWJsZVN0cmVhbUxpa2UsXG4gIHJlYWRhYmxlU3RyZWFtQ2xvc2UsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgZnVsbHlSZWFkQm9keVxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEZvcm1EYXRhIH0gPSByZXF1aXJlKCcuL2Zvcm1kYXRhJylcbmNvbnN0IHsga1N0YXRlIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgRE9NRXhjZXB0aW9uLCBzdHJ1Y3R1cmVkQ2xvbmUgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgQmxvYiwgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsga0JvZHlVc2VkIH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgaXNFcnJvcmVkIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBpc1VpbnQ4QXJyYXksIGlzQXJyYXlCdWZmZXIgfSA9IHJlcXVpcmUoJ3V0aWwvdHlwZXMnKVxuY29uc3QgeyBGaWxlOiBVbmRpY2lGaWxlIH0gPSByZXF1aXJlKCcuL2ZpbGUnKVxuY29uc3QgeyBwYXJzZU1JTUVUeXBlLCBzZXJpYWxpemVBTWltZVR5cGUgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5cbmxldCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW1cblxuLyoqIEB0eXBlIHtnbG9iYWxUaGlzWydGaWxlJ119ICovXG5jb25zdCBGaWxlID0gTmF0aXZlRmlsZSA/PyBVbmRpY2lGaWxlXG5jb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHlpbml0LWV4dHJhY3RcbmZ1bmN0aW9uIGV4dHJhY3RCb2R5IChvYmplY3QsIGtlZXBhbGl2ZSA9IGZhbHNlKSB7XG4gIGlmICghUmVhZGFibGVTdHJlYW0pIHtcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgLy8gMS4gTGV0IHN0cmVhbSBiZSBudWxsLlxuICBsZXQgc3RyZWFtID0gbnVsbFxuXG4gIC8vIDIuIElmIG9iamVjdCBpcyBhIFJlYWRhYmxlU3RyZWFtIG9iamVjdCwgdGhlbiBzZXQgc3RyZWFtIHRvIG9iamVjdC5cbiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtKSB7XG4gICAgc3RyZWFtID0gb2JqZWN0XG4gIH0gZWxzZSBpZiAoaXNCbG9iTGlrZShvYmplY3QpKSB7XG4gICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBvYmplY3QgaXMgYSBCbG9iIG9iamVjdCwgc2V0IHN0cmVhbSB0byB0aGVcbiAgICAvLyAgICByZXN1bHQgb2YgcnVubmluZyBvYmplY3TigJlzIGdldCBzdHJlYW0uXG4gICAgc3RyZWFtID0gb2JqZWN0LnN0cmVhbSgpXG4gIH0gZWxzZSB7XG4gICAgLy8gNC4gT3RoZXJ3aXNlLCBzZXQgc3RyZWFtIHRvIGEgbmV3IFJlYWRhYmxlU3RyZWFtIG9iamVjdCwgYW5kIHNldFxuICAgIC8vICAgIHVwIHN0cmVhbS5cbiAgICBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgYXN5bmMgcHVsbCAoY29udHJvbGxlcikge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoXG4gICAgICAgICAgdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgPyB0ZXh0RW5jb2Rlci5lbmNvZGUoc291cmNlKSA6IHNvdXJjZVxuICAgICAgICApXG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHJlYWRhYmxlU3RyZWFtQ2xvc2UoY29udHJvbGxlcikpXG4gICAgICB9LFxuICAgICAgc3RhcnQgKCkge30sXG4gICAgICB0eXBlOiB1bmRlZmluZWRcbiAgICB9KVxuICB9XG5cbiAgLy8gNS4gQXNzZXJ0OiBzdHJlYW0gaXMgYSBSZWFkYWJsZVN0cmVhbSBvYmplY3QuXG4gIGFzc2VydChpc1JlYWRhYmxlU3RyZWFtTGlrZShzdHJlYW0pKVxuXG4gIC8vIDYuIExldCBhY3Rpb24gYmUgbnVsbC5cbiAgbGV0IGFjdGlvbiA9IG51bGxcblxuICAvLyA3LiBMZXQgc291cmNlIGJlIG51bGwuXG4gIGxldCBzb3VyY2UgPSBudWxsXG5cbiAgLy8gOC4gTGV0IGxlbmd0aCBiZSBudWxsLlxuICBsZXQgbGVuZ3RoID0gbnVsbFxuXG4gIC8vIDkuIExldCB0eXBlIGJlIG51bGwuXG4gIGxldCB0eXBlID0gbnVsbFxuXG4gIC8vIDEwLiBTd2l0Y2ggb24gb2JqZWN0OlxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBTZXQgc291cmNlIHRvIHRoZSBVVEYtOCBlbmNvZGluZyBvZiBvYmplY3QuXG4gICAgLy8gTm90ZTogc2V0dGluZyBzb3VyY2UgdG8gYSBVaW50OEFycmF5IGhlcmUgYnJlYWtzIHNvbWUgbW9ja2luZyBhc3N1bXB0aW9ucy5cbiAgICBzb3VyY2UgPSBvYmplY3RcblxuICAgIC8vIFNldCB0eXBlIHRvIGB0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLThgLlxuICAgIHR5cGUgPSAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04J1xuICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgIC8vIFVSTFNlYXJjaFBhcmFtc1xuXG4gICAgLy8gc3BlYyBzYXlzIHRvIHJ1biBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgb24gYm9keS5saXN0XG4gICAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBpbiBOb2RlLmpzIGFzIGFwYXJ0IG9mIGFuIFVSTFNlYXJjaFBhcmFtcyBpbnN0YW5jZSB0b1N0cmluZyBtZXRob2RcbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL2U0NmM2ODBiZjJiMjExYmJkNTJjZjk1OWNhMTdlZTk4YzdmNjU3ZjUvbGliL2ludGVybmFsL3VybC5qcyNMNDkwXG4gICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL2U0NmM2ODBiZjJiMjExYmJkNTJjZjk1OWNhMTdlZTk4YzdmNjU3ZjUvbGliL2ludGVybmFsL3VybC5qcyNMMTEwMFxuXG4gICAgLy8gU2V0IHNvdXJjZSB0byB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBzZXJpYWxpemVyIHdpdGggb2JqZWN04oCZcyBsaXN0LlxuICAgIHNvdXJjZSA9IG9iamVjdC50b1N0cmluZygpXG5cbiAgICAvLyBTZXQgdHlwZSB0byBgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLThgLlxuICAgIHR5cGUgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnXG4gIH0gZWxzZSBpZiAoaXNBcnJheUJ1ZmZlcihvYmplY3QpKSB7XG4gICAgLy8gQnVmZmVyU291cmNlL0FycmF5QnVmZmVyXG5cbiAgICAvLyBTZXQgc291cmNlIHRvIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSBvYmplY3QuXG4gICAgc291cmNlID0gbmV3IFVpbnQ4QXJyYXkob2JqZWN0LnNsaWNlKCkpXG4gIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KG9iamVjdCkpIHtcbiAgICAvLyBCdWZmZXJTb3VyY2UvQXJyYXlCdWZmZXJWaWV3XG5cbiAgICAvLyBTZXQgc291cmNlIHRvIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSBvYmplY3QuXG4gICAgc291cmNlID0gbmV3IFVpbnQ4QXJyYXkob2JqZWN0LmJ1ZmZlci5zbGljZShvYmplY3QuYnl0ZU9mZnNldCwgb2JqZWN0LmJ5dGVPZmZzZXQgKyBvYmplY3QuYnl0ZUxlbmd0aCkpXG4gIH0gZWxzZSBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShvYmplY3QpKSB7XG4gICAgY29uc3QgYm91bmRhcnkgPSBgLS0tLWZvcm1kYXRhLXVuZGljaS0wJHtgJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTExKX1gLnBhZFN0YXJ0KDExLCAnMCcpfWBcbiAgICBjb25zdCBwcmVmaXggPSBgLS0ke2JvdW5kYXJ5fVxcclxcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YWBcblxuICAgIC8qISBmb3JtZGF0YS1wb2x5ZmlsbC4gTUlUIExpY2Vuc2UuIEppbW15IFfDpHJ0aW5nIDxodHRwczovL2ppbW15LndhcnRpbmcuc2Uvb3BlbnNvdXJjZT4gKi9cbiAgICBjb25zdCBlc2NhcGUgPSAoc3RyKSA9PlxuICAgICAgc3RyLnJlcGxhY2UoL1xcbi9nLCAnJTBBJykucmVwbGFjZSgvXFxyL2csICclMEQnKS5yZXBsYWNlKC9cIi9nLCAnJTIyJylcbiAgICBjb25zdCBub3JtYWxpemVMaW5lZmVlZHMgPSAodmFsdWUpID0+IHZhbHVlLnJlcGxhY2UoL1xccj9cXG58XFxyL2csICdcXHJcXG4nKVxuXG4gICAgLy8gU2V0IGFjdGlvbiB0byB0aGlzIHN0ZXA6IHJ1biB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgIC8vIGVuY29kaW5nIGFsZ29yaXRobSwgd2l0aCBvYmplY3TigJlzIGVudHJ5IGxpc3QgYW5kIFVURi04LlxuICAgIC8vIC0gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGJvZHkgaXMgaW1tdXRhYmxlIGFuZCBjYW4ndCBiZSBjaGFuZ2VkIGFmdGVyd29yZHNcbiAgICAvLyAtIFRoYXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGlzIGNhbGN1bGF0ZWQgaW4gYWR2YW5jZS5cbiAgICAvLyAtIEFuZCB0aGF0IGFsbCBwYXJ0cyBhcmUgcHJlLWVuY29kZWQgYW5kIHJlYWR5IHRvIGJlIHNlbnQuXG5cbiAgICBjb25zdCBibG9iUGFydHMgPSBbXVxuICAgIGNvbnN0IHJuID0gbmV3IFVpbnQ4QXJyYXkoWzEzLCAxMF0pIC8vICdcXHJcXG4nXG4gICAgbGVuZ3RoID0gMFxuICAgIGxldCBoYXNVbmtub3duU2l6ZVZhbHVlID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBvYmplY3QpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gdGV4dEVuY29kZXIuZW5jb2RlKHByZWZpeCArXG4gICAgICAgICAgYDsgbmFtZT1cIiR7ZXNjYXBlKG5vcm1hbGl6ZUxpbmVmZWVkcyhuYW1lKSl9XCJgICtcbiAgICAgICAgICBgXFxyXFxuXFxyXFxuJHtub3JtYWxpemVMaW5lZmVlZHModmFsdWUpfVxcclxcbmApXG4gICAgICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rKVxuICAgICAgICBsZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoYCR7cHJlZml4fTsgbmFtZT1cIiR7ZXNjYXBlKG5vcm1hbGl6ZUxpbmVmZWVkcyhuYW1lKSl9XCJgICtcbiAgICAgICAgICAodmFsdWUubmFtZSA/IGA7IGZpbGVuYW1lPVwiJHtlc2NhcGUodmFsdWUubmFtZSl9XCJgIDogJycpICsgJ1xcclxcbicgK1xuICAgICAgICAgIGBDb250ZW50LVR5cGU6ICR7XG4gICAgICAgICAgICB2YWx1ZS50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gICAgICAgICAgfVxcclxcblxcclxcbmApXG4gICAgICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rLCB2YWx1ZSwgcm4pXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuc2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aCArIHZhbHVlLnNpemUgKyBybi5ieXRlTGVuZ3RoXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzVW5rbm93blNpemVWYWx1ZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNodW5rID0gdGV4dEVuY29kZXIuZW5jb2RlKGAtLSR7Ym91bmRhcnl9LS1gKVxuICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rKVxuICAgIGxlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoXG4gICAgaWYgKGhhc1Vua25vd25TaXplVmFsdWUpIHtcbiAgICAgIGxlbmd0aCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBTZXQgc291cmNlIHRvIG9iamVjdC5cbiAgICBzb3VyY2UgPSBvYmplY3RcblxuICAgIGFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uICogKCkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGJsb2JQYXJ0cykge1xuICAgICAgICBpZiAocGFydC5zdHJlYW0pIHtcbiAgICAgICAgICB5aWVsZCAqIHBhcnQuc3RyZWFtKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB5aWVsZCBwYXJ0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdHlwZSB0byBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9YCxcbiAgICAvLyBmb2xsb3dlZCBieSB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBib3VuZGFyeSBzdHJpbmcgZ2VuZXJhdGVkXG4gICAgLy8gYnkgdGhlIG11bHRpcGFydC9mb3JtLWRhdGEgZW5jb2RpbmcgYWxnb3JpdGhtLlxuICAgIHR5cGUgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JyArIGJvdW5kYXJ5XG4gIH0gZWxzZSBpZiAoaXNCbG9iTGlrZShvYmplY3QpKSB7XG4gICAgLy8gQmxvYlxuXG4gICAgLy8gU2V0IHNvdXJjZSB0byBvYmplY3QuXG4gICAgc291cmNlID0gb2JqZWN0XG5cbiAgICAvLyBTZXQgbGVuZ3RoIHRvIG9iamVjdOKAmXMgc2l6ZS5cbiAgICBsZW5ndGggPSBvYmplY3Quc2l6ZVxuXG4gICAgLy8gSWYgb2JqZWN04oCZcyB0eXBlIGF0dHJpYnV0ZSBpcyBub3QgdGhlIGVtcHR5IGJ5dGUgc2VxdWVuY2UsIHNldFxuICAgIC8vIHR5cGUgdG8gaXRzIHZhbHVlLlxuICAgIGlmIChvYmplY3QudHlwZSkge1xuICAgICAgdHlwZSA9IG9iamVjdC50eXBlXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYga2VlcGFsaXZlIGlzIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKGtlZXBhbGl2ZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigna2VlcGFsaXZlJylcbiAgICB9XG5cbiAgICAvLyBJZiBvYmplY3QgaXMgZGlzdHVyYmVkIG9yIGxvY2tlZCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAodXRpbC5pc0Rpc3R1cmJlZChvYmplY3QpIHx8IG9iamVjdC5sb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdSZXNwb25zZSBib2R5IG9iamVjdCBzaG91bGQgbm90IGJlIGRpc3R1cmJlZCBvciBsb2NrZWQnXG4gICAgICApXG4gICAgfVxuXG4gICAgc3RyZWFtID1cbiAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtID8gb2JqZWN0IDogUmVhZGFibGVTdHJlYW1Gcm9tKG9iamVjdClcbiAgfVxuXG4gIC8vIDExLiBJZiBzb3VyY2UgaXMgYSBieXRlIHNlcXVlbmNlLCB0aGVuIHNldCBhY3Rpb24gdG8gYVxuICAvLyBzdGVwIHRoYXQgcmV0dXJucyBzb3VyY2UgYW5kIGxlbmd0aCB0byBzb3VyY2XigJlzIGxlbmd0aC5cbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnIHx8IHV0aWwuaXNCdWZmZXIoc291cmNlKSkge1xuICAgIGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHNvdXJjZSlcbiAgfVxuXG4gIC8vIDEyLiBJZiBhY3Rpb24gaXMgbm9uLW51bGwsIHRoZW4gcnVuIHRoZXNlIHN0ZXBzIGluIGluIHBhcmFsbGVsOlxuICBpZiAoYWN0aW9uICE9IG51bGwpIHtcbiAgICAvLyBSdW4gYWN0aW9uLlxuICAgIGxldCBpdGVyYXRvclxuICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICBhc3luYyBzdGFydCAoKSB7XG4gICAgICAgIGl0ZXJhdG9yID0gYWN0aW9uKG9iamVjdClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsIChjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIC8vIFdoZW4gcnVubmluZyBhY3Rpb24gaXMgZG9uZSwgY2xvc2Ugc3RyZWFtLlxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2hlbmV2ZXIgb25lIG9yIG1vcmUgYnl0ZXMgYXJlIGF2YWlsYWJsZSBhbmQgc3RyZWFtIGlzIG5vdCBlcnJvcmVkLFxuICAgICAgICAgIC8vIGVucXVldWUgYSBVaW50OEFycmF5IHdyYXBwaW5nIGFuIEFycmF5QnVmZmVyIGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZVxuICAgICAgICAgIC8vIGJ5dGVzIGludG8gc3RyZWFtLlxuICAgICAgICAgIGlmICghaXNFcnJvcmVkKHN0cmVhbSkpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRlc2lyZWRTaXplID4gMFxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNhbmNlbCAocmVhc29uKSB7XG4gICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpXG4gICAgICB9LFxuICAgICAgdHlwZTogdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuXG4gIC8vIDEzLiBMZXQgYm9keSBiZSBhIGJvZHkgd2hvc2Ugc3RyZWFtIGlzIHN0cmVhbSwgc291cmNlIGlzIHNvdXJjZSxcbiAgLy8gYW5kIGxlbmd0aCBpcyBsZW5ndGguXG4gIGNvbnN0IGJvZHkgPSB7IHN0cmVhbSwgc291cmNlLCBsZW5ndGggfVxuXG4gIC8vIDE0LiBSZXR1cm4gKGJvZHksIHR5cGUpLlxuICByZXR1cm4gW2JvZHksIHR5cGVdXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5aW5pdC1zYWZlbHktZXh0cmFjdFxuZnVuY3Rpb24gc2FmZWx5RXh0cmFjdEJvZHkgKG9iamVjdCwga2VlcGFsaXZlID0gZmFsc2UpIHtcbiAgaWYgKCFSZWFkYWJsZVN0cmVhbSkge1xuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0vd2ViJykuUmVhZGFibGVTdHJlYW1cbiAgfVxuXG4gIC8vIFRvIHNhZmVseSBleHRyYWN0IGEgYm9keSBhbmQgYSBgQ29udGVudC1UeXBlYCB2YWx1ZSBmcm9tXG4gIC8vIGEgYnl0ZSBzZXF1ZW5jZSBvciBCb2R5SW5pdCBvYmplY3Qgb2JqZWN0LCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gMS4gSWYgb2JqZWN0IGlzIGEgUmVhZGFibGVTdHJlYW0gb2JqZWN0LCB0aGVuOlxuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0pIHtcbiAgICAvLyBBc3NlcnQ6IG9iamVjdCBpcyBuZWl0aGVyIGRpc3R1cmJlZCBub3IgbG9ja2VkLlxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgYXNzZXJ0KCF1dGlsLmlzRGlzdHVyYmVkKG9iamVjdCksICdUaGUgYm9keSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLicpXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICBhc3NlcnQoIW9iamVjdC5sb2NrZWQsICdUaGUgc3RyZWFtIGlzIGxvY2tlZC4nKVxuICB9XG5cbiAgLy8gMi4gUmV0dXJuIHRoZSByZXN1bHRzIG9mIGV4dHJhY3Rpbmcgb2JqZWN0LlxuICByZXR1cm4gZXh0cmFjdEJvZHkob2JqZWN0LCBrZWVwYWxpdmUpXG59XG5cbmZ1bmN0aW9uIGNsb25lQm9keSAoYm9keSkge1xuICAvLyBUbyBjbG9uZSBhIGJvZHkgYm9keSwgcnVuIHRoZXNlIHN0ZXBzOlxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktY2xvbmVcblxuICAvLyAxLiBMZXQgwqsgb3V0MSwgb3V0MiDCuyBiZSB0aGUgcmVzdWx0IG9mIHRlZWluZyBib2R54oCZcyBzdHJlYW0uXG4gIGNvbnN0IFtvdXQxLCBvdXQyXSA9IGJvZHkuc3RyZWFtLnRlZSgpXG4gIGNvbnN0IG91dDJDbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShvdXQyLCB7IHRyYW5zZmVyOiBbb3V0Ml0gfSlcbiAgLy8gVGhpcywgZm9yIHdoYXRldmVyIHJlYXNvbnMsIHVucmVmcyBvdXQyQ2xvbmUgd2hpY2ggYWxsb3dzXG4gIC8vIHRoZSBwcm9jZXNzIHRvIGV4aXQgYnkgaXRzZWxmLlxuICBjb25zdCBbLCBmaW5hbENsb25lXSA9IG91dDJDbG9uZS50ZWUoKVxuXG4gIC8vIDIuIFNldCBib2R54oCZcyBzdHJlYW0gdG8gb3V0MS5cbiAgYm9keS5zdHJlYW0gPSBvdXQxXG5cbiAgLy8gMy4gUmV0dXJuIGEgYm9keSB3aG9zZSBzdHJlYW0gaXMgb3V0MiBhbmQgb3RoZXIgbWVtYmVycyBhcmUgY29waWVkIGZyb20gYm9keS5cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW06IGZpbmFsQ2xvbmUsXG4gICAgbGVuZ3RoOiBib2R5Lmxlbmd0aCxcbiAgICBzb3VyY2U6IGJvZHkuc291cmNlXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gKiBjb25zdW1lQm9keSAoYm9keSkge1xuICBpZiAoYm9keSkge1xuICAgIGlmIChpc1VpbnQ4QXJyYXkoYm9keSkpIHtcbiAgICAgIHlpZWxkIGJvZHlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyZWFtID0gYm9keS5zdHJlYW1cblxuICAgICAgaWYgKHV0aWwuaXNEaXN0dXJiZWQoc3RyZWFtKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgYm9keSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLicpXG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJlYW0ubG9ja2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaXMgbG9ja2VkLicpXG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBhdC5cbiAgICAgIHN0cmVhbVtrQm9keVVzZWRdID0gdHJ1ZVxuXG4gICAgICB5aWVsZCAqIHN0cmVhbVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0lmQWJvcnRlZCAoc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLicsICdBYm9ydEVycm9yJylcbiAgfVxufVxuXG5mdW5jdGlvbiBib2R5TWl4aW5NZXRob2RzIChpbnN0YW5jZSkge1xuICBjb25zdCBtZXRob2RzID0ge1xuICAgIGJsb2IgKCkge1xuICAgICAgLy8gVGhlIGJsb2IoKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mXG4gICAgICAvLyBydW5uaW5nIGNvbnN1bWUgYm9keSB3aXRoIHRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgc3RlcFxuICAgICAgLy8gZ2l2ZW4gYSBieXRlIHNlcXVlbmNlIGJ5dGVzOiByZXR1cm4gYSBCbG9iIHdob3NlXG4gICAgICAvLyBjb250ZW50cyBhcmUgYnl0ZXMgYW5kIHdob3NlIHR5cGUgYXR0cmlidXRlIGlzIHRoaXPigJlzXG4gICAgICAvLyBNSU1FIHR5cGUuXG4gICAgICByZXR1cm4gc3BlY0NvbnN1bWVCb2R5KHRoaXMsIChieXRlcykgPT4ge1xuICAgICAgICBsZXQgbWltZVR5cGUgPSBib2R5TWltZVR5cGUodGhpcylcblxuICAgICAgICBpZiAobWltZVR5cGUgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIG1pbWVUeXBlID0gJydcbiAgICAgICAgfSBlbHNlIGlmIChtaW1lVHlwZSkge1xuICAgICAgICAgIG1pbWVUeXBlID0gc2VyaWFsaXplQU1pbWVUeXBlKG1pbWVUeXBlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIGEgQmxvYiB3aG9zZSBjb250ZW50cyBhcmUgYnl0ZXMgYW5kIHR5cGUgYXR0cmlidXRlXG4gICAgICAgIC8vIGlzIG1pbWVUeXBlLlxuICAgICAgICByZXR1cm4gbmV3IEJsb2IoW2J5dGVzXSwgeyB0eXBlOiBtaW1lVHlwZSB9KVxuICAgICAgfSwgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIGFycmF5QnVmZmVyICgpIHtcbiAgICAgIC8vIFRoZSBhcnJheUJ1ZmZlcigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHRcbiAgICAgIC8vIG9mIHJ1bm5pbmcgY29uc3VtZSBib2R5IHdpdGggdGhpcyBhbmQgdGhlIGZvbGxvd2luZyBzdGVwXG4gICAgICAvLyBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgYnl0ZXM6IHJldHVybiBhIG5ldyBBcnJheUJ1ZmZlclxuICAgICAgLy8gd2hvc2UgY29udGVudHMgYXJlIGJ5dGVzLlxuICAgICAgcmV0dXJuIHNwZWNDb25zdW1lQm9keSh0aGlzLCAoYnl0ZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXJcbiAgICAgIH0sIGluc3RhbmNlKVxuICAgIH0sXG5cbiAgICB0ZXh0ICgpIHtcbiAgICAgIC8vIFRoZSB0ZXh0KCkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgICAvLyBjb25zdW1lIGJvZHkgd2l0aCB0aGlzIGFuZCBVVEYtOCBkZWNvZGUuXG4gICAgICByZXR1cm4gc3BlY0NvbnN1bWVCb2R5KHRoaXMsIHV0ZjhEZWNvZGVCeXRlcywgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIGpzb24gKCkge1xuICAgICAgLy8gVGhlIGpzb24oKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgIC8vIGNvbnN1bWUgYm9keSB3aXRoIHRoaXMgYW5kIHBhcnNlIEpTT04gZnJvbSBieXRlcy5cbiAgICAgIHJldHVybiBzcGVjQ29uc3VtZUJvZHkodGhpcywgcGFyc2VKU09ORnJvbUJ5dGVzLCBpbnN0YW5jZSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9ybURhdGEgKCkge1xuICAgICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgaW5zdGFuY2UpXG5cbiAgICAgIHRocm93SWZBYm9ydGVkKHRoaXNba1N0YXRlXSlcblxuICAgICAgY29uc3QgY29udGVudFR5cGUgPSB0aGlzLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKVxuXG4gICAgICAvLyBJZiBtaW1lVHlwZeKAmXMgZXNzZW5jZSBpcyBcIm11bHRpcGFydC9mb3JtLWRhdGFcIiwgdGhlbjpcbiAgICAgIGlmICgvbXVsdGlwYXJ0XFwvZm9ybS1kYXRhLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge31cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5oZWFkZXJzKSBoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlXG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG5cbiAgICAgICAgbGV0IGJ1c2JveVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYnVzYm95ID0gbmV3IEJ1c2JveSh7XG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgcHJlc2VydmVQYXRoOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihgJHtlcnJ9YCwgJ0Fib3J0RXJyb3InKVxuICAgICAgICB9XG5cbiAgICAgICAgYnVzYm95Lm9uKCdmaWVsZCcsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlRm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9KVxuICAgICAgICBidXNib3kub24oJ2ZpbGUnLCAobmFtZSwgdmFsdWUsIGZpbGVuYW1lLCBlbmNvZGluZywgbWltZVR5cGUpID0+IHtcbiAgICAgICAgICBjb25zdCBjaHVua3MgPSBbXVxuXG4gICAgICAgICAgaWYgKGVuY29kaW5nID09PSAnYmFzZTY0JyB8fCBlbmNvZGluZy50b0xvd2VyQ2FzZSgpID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgbGV0IGJhc2U2NGNodW5rID0gJydcblxuICAgICAgICAgICAgdmFsdWUub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgYmFzZTY0Y2h1bmsgKz0gY2h1bmsudG9TdHJpbmcoKS5yZXBsYWNlKC9bXFxyXFxuXS9nbSwgJycpXG5cbiAgICAgICAgICAgICAgY29uc3QgZW5kID0gYmFzZTY0Y2h1bmsubGVuZ3RoIC0gYmFzZTY0Y2h1bmsubGVuZ3RoICUgNFxuICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShiYXNlNjRjaHVuay5zbGljZSgwLCBlbmQpLCAnYmFzZTY0JykpXG5cbiAgICAgICAgICAgICAgYmFzZTY0Y2h1bmsgPSBiYXNlNjRjaHVuay5zbGljZShlbmQpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdmFsdWUub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oYmFzZTY0Y2h1bmssICdiYXNlNjQnKSlcbiAgICAgICAgICAgICAgcmVzcG9uc2VGb3JtRGF0YS5hcHBlbmQobmFtZSwgbmV3IEZpbGUoY2h1bmtzLCBmaWxlbmFtZSwgeyB0eXBlOiBtaW1lVHlwZSB9KSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHZhbHVlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlRm9ybURhdGEuYXBwZW5kKG5hbWUsIG5ldyBGaWxlKGNodW5rcywgZmlsZW5hbWUsIHsgdHlwZTogbWltZVR5cGUgfSkpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBidXNib3lSZXNvbHZlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGJ1c2JveS5vbignZmluaXNoJywgcmVzb2x2ZSlcbiAgICAgICAgICBidXNib3kub24oJ2Vycm9yJywgKGVycikgPT4gcmVqZWN0KG5ldyBUeXBlRXJyb3IoZXJyKSkpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuYm9keSAhPT0gbnVsbCkgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBjb25zdW1lQm9keSh0aGlzW2tTdGF0ZV0uYm9keSkpIGJ1c2JveS53cml0ZShjaHVuaylcbiAgICAgICAgYnVzYm95LmVuZCgpXG4gICAgICAgIGF3YWl0IGJ1c2JveVJlc29sdmVcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2VGb3JtRGF0YVxuICAgICAgfSBlbHNlIGlmICgvYXBwbGljYXRpb25cXC94LXd3dy1mb3JtLXVybGVuY29kZWQvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgaWYgbWltZVR5cGXigJlzIGVzc2VuY2UgaXMgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiwgdGhlbjpcblxuICAgICAgICAvLyAxLiBMZXQgZW50cmllcyBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgYnl0ZXMuXG4gICAgICAgIGxldCBlbnRyaWVzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHRleHQgPSAnJ1xuICAgICAgICAgIC8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBwYXJzZXIgd2lsbCBrZWVwIHRoZSBCT00uXG4gICAgICAgICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXVybGVuY29kZWQtcGFyc2VyXG4gICAgICAgICAgLy8gTm90ZSB0aGF0IHN0cmVhbWluZyBkZWNvZGVyIGlzIHN0YXRlZnVsIGFuZCBjYW5ub3QgYmUgcmV1c2VkXG4gICAgICAgICAgY29uc3Qgc3RyZWFtaW5nRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7IGlnbm9yZUJPTTogdHJ1ZSB9KVxuXG4gICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBjb25zdW1lQm9keSh0aGlzW2tTdGF0ZV0uYm9keSkpIHtcbiAgICAgICAgICAgIGlmICghaXNVaW50OEFycmF5KGNodW5rKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBVaW50OEFycmF5IGNodW5rJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHQgKz0gc3RyZWFtaW5nRGVjb2Rlci5kZWNvZGUoY2h1bmssIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHRleHQgKz0gc3RyZWFtaW5nRGVjb2Rlci5kZWNvZGUoKVxuICAgICAgICAgIGVudHJpZXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRleHQpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBVbmNsZWFyIHdoZW4gbmV3IFVSTFNlYXJjaFBhcmFtcyBjYW4gZmFpbCBvbiBhIHN0cmluZy5cbiAgICAgICAgICAvLyAyLiBJZiBlbnRyaWVzIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgVHlwZUVycm9yKCksIHsgY2F1c2U6IGVyciB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gUmV0dXJuIGEgbmV3IEZvcm1EYXRhIG9iamVjdCB3aG9zZSBlbnRyaWVzIGFyZSBlbnRyaWVzLlxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtRGF0YVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2FpdCBhIHRpY2sgYmVmb3JlIGNoZWNraW5nIGlmIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgYSBUeXBlRXJyb3IgY2FuIGJlIHRocm93biB3aGVuIGFuIEFib3J0RXJyb3Igc2hvdWxkLlxuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgICAgIHRocm93SWZBYm9ydGVkKHRoaXNba1N0YXRlXSlcblxuICAgICAgICAvLyBPdGhlcndpc2UsIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgaGVhZGVyOiBgJHtpbnN0YW5jZS5uYW1lfS5mb3JtRGF0YWAsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBwYXJzZSBjb250ZW50IGFzIEZvcm1EYXRhLidcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWV0aG9kc1xufVxuXG5mdW5jdGlvbiBtaXhpbkJvZHkgKHByb3RvdHlwZSkge1xuICBPYmplY3QuYXNzaWduKHByb3RvdHlwZS5wcm90b3R5cGUsIGJvZHlNaXhpbk1ldGhvZHMocHJvdG90eXBlKSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktY29uc3VtZS1ib2R5XG4gKiBAcGFyYW0ge1Jlc3BvbnNlfFJlcXVlc3R9IG9iamVjdFxuICogQHBhcmFtIHsodmFsdWU6IHVua25vd24pID0+IHVua25vd259IGNvbnZlcnRCeXRlc1RvSlNWYWx1ZVxuICogQHBhcmFtIHtSZXNwb25zZXxSZXF1ZXN0fSBpbnN0YW5jZVxuICovXG5hc3luYyBmdW5jdGlvbiBzcGVjQ29uc3VtZUJvZHkgKG9iamVjdCwgY29udmVydEJ5dGVzVG9KU1ZhbHVlLCBpbnN0YW5jZSkge1xuICB3ZWJpZGwuYnJhbmRDaGVjayhvYmplY3QsIGluc3RhbmNlKVxuXG4gIHRocm93SWZBYm9ydGVkKG9iamVjdFtrU3RhdGVdKVxuXG4gIC8vIDEuIElmIG9iamVjdCBpcyB1bnVzYWJsZSwgdGhlbiByZXR1cm4gYSBwcm9taXNlIHJlamVjdGVkXG4gIC8vICAgIHdpdGggYSBUeXBlRXJyb3IuXG4gIGlmIChib2R5VW51c2FibGUob2JqZWN0W2tTdGF0ZV0uYm9keSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb2R5IGlzIHVudXNhYmxlJylcbiAgfVxuXG4gIC8vIDIuIExldCBwcm9taXNlIGJlIGEgbmV3IHByb21pc2UuXG4gIGNvbnN0IHByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gIC8vIDMuIExldCBlcnJvclN0ZXBzIGdpdmVuIGVycm9yIGJlIHRvIHJlamVjdCBwcm9taXNlIHdpdGggZXJyb3IuXG4gIGNvbnN0IGVycm9yU3RlcHMgPSAoZXJyb3IpID0+IHByb21pc2UucmVqZWN0KGVycm9yKVxuXG4gIC8vIDQuIExldCBzdWNjZXNzU3RlcHMgZ2l2ZW4gYSBieXRlIHNlcXVlbmNlIGRhdGEgYmUgdG8gcmVzb2x2ZVxuICAvLyAgICBwcm9taXNlIHdpdGggdGhlIHJlc3VsdCBvZiBydW5uaW5nIGNvbnZlcnRCeXRlc1RvSlNWYWx1ZVxuICAvLyAgICB3aXRoIGRhdGEuIElmIHRoYXQgdGhyZXcgYW4gZXhjZXB0aW9uLCB0aGVuIHJ1biBlcnJvclN0ZXBzXG4gIC8vICAgIHdpdGggdGhhdCBleGNlcHRpb24uXG4gIGNvbnN0IHN1Y2Nlc3NTdGVwcyA9IChkYXRhKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2UucmVzb2x2ZShjb252ZXJ0Qnl0ZXNUb0pTVmFsdWUoZGF0YSkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JTdGVwcyhlKVxuICAgIH1cbiAgfVxuXG4gIC8vIDUuIElmIG9iamVjdOKAmXMgYm9keSBpcyBudWxsLCB0aGVuIHJ1biBzdWNjZXNzU3RlcHMgd2l0aCBhblxuICAvLyAgICBlbXB0eSBieXRlIHNlcXVlbmNlLlxuICBpZiAob2JqZWN0W2tTdGF0ZV0uYm9keSA9PSBudWxsKSB7XG4gICAgc3VjY2Vzc1N0ZXBzKG5ldyBVaW50OEFycmF5KCkpXG4gICAgcmV0dXJuIHByb21pc2UucHJvbWlzZVxuICB9XG5cbiAgLy8gNi4gT3RoZXJ3aXNlLCBmdWxseSByZWFkIG9iamVjdOKAmXMgYm9keSBnaXZlbiBzdWNjZXNzU3RlcHMsXG4gIC8vICAgIGVycm9yU3RlcHMsIGFuZCBvYmplY3TigJlzIHJlbGV2YW50IGdsb2JhbCBvYmplY3QuXG4gIGF3YWl0IGZ1bGx5UmVhZEJvZHkob2JqZWN0W2tTdGF0ZV0uYm9keSwgc3VjY2Vzc1N0ZXBzLCBlcnJvclN0ZXBzKVxuXG4gIC8vIDcuIFJldHVybiBwcm9taXNlLlxuICByZXR1cm4gcHJvbWlzZS5wcm9taXNlXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5LXVudXNhYmxlXG5mdW5jdGlvbiBib2R5VW51c2FibGUgKGJvZHkpIHtcbiAgLy8gQW4gb2JqZWN0IGluY2x1ZGluZyB0aGUgQm9keSBpbnRlcmZhY2UgbWl4aW4gaXNcbiAgLy8gc2FpZCB0byBiZSB1bnVzYWJsZSBpZiBpdHMgYm9keSBpcyBub24tbnVsbCBhbmRcbiAgLy8gaXRzIGJvZHnigJlzIHN0cmVhbSBpcyBkaXN0dXJiZWQgb3IgbG9ja2VkLlxuICByZXR1cm4gYm9keSAhPSBudWxsICYmIChib2R5LnN0cmVhbS5sb2NrZWQgfHwgdXRpbC5pc0Rpc3R1cmJlZChib2R5LnN0cmVhbSkpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jdXRmLTgtZGVjb2RlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyXG4gKi9cbmZ1bmN0aW9uIHV0ZjhEZWNvZGVCeXRlcyAoYnVmZmVyKSB7XG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyAxLiBMZXQgYnVmZmVyIGJlIHRoZSByZXN1bHQgb2YgcGVla2luZyB0aHJlZSBieXRlcyBmcm9tXG4gIC8vICAgIGlvUXVldWUsIGNvbnZlcnRlZCB0byBhIGJ5dGUgc2VxdWVuY2UuXG5cbiAgLy8gMi4gSWYgYnVmZmVyIGlzIDB4RUYgMHhCQiAweEJGLCB0aGVuIHJlYWQgdGhyZWVcbiAgLy8gICAgYnl0ZXMgZnJvbSBpb1F1ZXVlLiAoRG8gbm90aGluZyB3aXRoIHRob3NlIGJ5dGVzLilcbiAgaWYgKGJ1ZmZlclswXSA9PT0gMHhFRiAmJiBidWZmZXJbMV0gPT09IDB4QkIgJiYgYnVmZmVyWzJdID09PSAweEJGKSB7XG4gICAgYnVmZmVyID0gYnVmZmVyLnN1YmFycmF5KDMpXG4gIH1cblxuICAvLyAzLiBQcm9jZXNzIGEgcXVldWUgd2l0aCBhbiBpbnN0YW5jZSBvZiBVVEYtOOKAmXNcbiAgLy8gICAgZGVjb2RlciwgaW9RdWV1ZSwgb3V0cHV0LCBhbmQgXCJyZXBsYWNlbWVudFwiLlxuICBjb25zdCBvdXRwdXQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnVmZmVyKVxuXG4gIC8vIDQuIFJldHVybiBvdXRwdXQuXG4gIHJldHVybiBvdXRwdXRcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNwYXJzZS1qc29uLWJ5dGVzLXRvLWEtamF2YXNjcmlwdC12YWx1ZVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICovXG5mdW5jdGlvbiBwYXJzZUpTT05Gcm9tQnl0ZXMgKGJ5dGVzKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHV0ZjhEZWNvZGVCeXRlcyhieXRlcykpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5LW1pbWUtdHlwZVxuICogQHBhcmFtIHtpbXBvcnQoJy4vcmVzcG9uc2UnKS5SZXNwb25zZXxpbXBvcnQoJy4vcmVxdWVzdCcpLlJlcXVlc3R9IG9iamVjdFxuICovXG5mdW5jdGlvbiBib2R5TWltZVR5cGUgKG9iamVjdCkge1xuICBjb25zdCB7IGhlYWRlcnNMaXN0IH0gPSBvYmplY3Rba1N0YXRlXVxuICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnNMaXN0LmdldCgnY29udGVudC10eXBlJylcblxuICBpZiAoY29udGVudFR5cGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICByZXR1cm4gcGFyc2VNSU1FVHlwZShjb250ZW50VHlwZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGV4dHJhY3RCb2R5LFxuICBzYWZlbHlFeHRyYWN0Qm9keSxcbiAgY2xvbmVCb2R5LFxuICBtaXhpbkJvZHlcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3IsXG4gIE5vdFN1cHBvcnRlZEVycm9yXG59ID0gcmVxdWlyZSgnLi9lcnJvcnMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsga0hUVFAyQnVpbGRSZXF1ZXN0LCBrSFRUUDJDb3B5SGVhZGVycywga0hUVFAxQnVpbGRSZXF1ZXN0IH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8vIHRva2VuUmVnRXhwIGFuZCBoZWFkZXJDaGFyUmVnZXggaGF2ZSBiZWVuIGxpZnRlZCBmcm9tXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYWluL2xpYi9faHR0cF9jb21tb24uanNcblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiB2YWwgaXMgYSB2YWxpZCBIVFRQIHRva2VuXG4gKiBwZXIgdGhlIHJ1bGVzIGRlZmluZWQgaW4gUkZDIDcyMzBcbiAqIFNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMi42XG4gKi9cbmNvbnN0IHRva2VuUmVnRXhwID0gL15bXFxeX2BhLXpBLVpcXC0wLTkhIyQlJicqKy58fl0rJC9cblxuLyoqXG4gKiBNYXRjaGVzIGlmIHZhbCBjb250YWlucyBhbiBpbnZhbGlkIGZpZWxkLXZjaGFyXG4gKiAgZmllbGQtdmFsdWUgICAgPSAqKCBmaWVsZC1jb250ZW50IC8gb2JzLWZvbGQgKVxuICogIGZpZWxkLWNvbnRlbnQgID0gZmllbGQtdmNoYXIgWyAxKiggU1AgLyBIVEFCICkgZmllbGQtdmNoYXIgXVxuICogIGZpZWxkLXZjaGFyICAgID0gVkNIQVIgLyBvYnMtdGV4dFxuICovXG5jb25zdCBoZWFkZXJDaGFyUmVnZXggPSAvW15cXHRcXHgyMC1cXHg3ZVxceDgwLVxceGZmXS9cblxuLy8gVmVyaWZpZXMgdGhhdCBhIGdpdmVuIHBhdGggaXMgdmFsaWQgZG9lcyBub3QgY29udGFpbiBjb250cm9sIGNoYXJzIFxceDAwIHRvIFxceDIwXG5jb25zdCBpbnZhbGlkUGF0aFJlZ2V4ID0gL1teXFx1MDAyMS1cXHUwMGZmXS9cblxuY29uc3Qga0hhbmRsZXIgPSBTeW1ib2woJ2hhbmRsZXInKVxuXG5jb25zdCBjaGFubmVscyA9IHt9XG5cbmxldCBleHRyYWN0Qm9keVxuXG50cnkge1xuICBjb25zdCBkaWFnbm9zdGljc0NoYW5uZWwgPSByZXF1aXJlKCdkaWFnbm9zdGljc19jaGFubmVsJylcbiAgY2hhbm5lbHMuY3JlYXRlID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OmNyZWF0ZScpXG4gIGNoYW5uZWxzLmJvZHlTZW50ID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OmJvZHlTZW50JylcbiAgY2hhbm5lbHMuaGVhZGVycyA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDpoZWFkZXJzJylcbiAgY2hhbm5lbHMudHJhaWxlcnMgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOnJlcXVlc3Q6dHJhaWxlcnMnKVxuICBjaGFubmVscy5lcnJvciA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDplcnJvcicpXG59IGNhdGNoIHtcbiAgY2hhbm5lbHMuY3JlYXRlID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5ib2R5U2VudCA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMuaGVhZGVycyA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMudHJhaWxlcnMgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG4gIGNoYW5uZWxzLmVycm9yID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxufVxuXG5jbGFzcyBSZXF1ZXN0IHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwge1xuICAgIHBhdGgsXG4gICAgbWV0aG9kLFxuICAgIGJvZHksXG4gICAgaGVhZGVycyxcbiAgICBxdWVyeSxcbiAgICBpZGVtcG90ZW50LFxuICAgIGJsb2NraW5nLFxuICAgIHVwZ3JhZGUsXG4gICAgaGVhZGVyc1RpbWVvdXQsXG4gICAgYm9keVRpbWVvdXQsXG4gICAgcmVzZXQsXG4gICAgdGhyb3dPbkVycm9yLFxuICAgIGV4cGVjdENvbnRpbnVlXG4gIH0sIGhhbmRsZXIpIHtcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3BhdGggbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHBhdGhbMF0gIT09ICcvJyAmJlxuICAgICAgIShwYXRoLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpICYmXG4gICAgICBtZXRob2QgIT09ICdDT05ORUNUJ1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdwYXRoIG11c3QgYmUgYW4gYWJzb2x1dGUgVVJMIG9yIHN0YXJ0IHdpdGggYSBzbGFzaCcpXG4gICAgfSBlbHNlIGlmIChpbnZhbGlkUGF0aFJlZ2V4LmV4ZWMocGF0aCkgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXF1ZXN0IHBhdGgnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtZXRob2QgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfSBlbHNlIGlmICh0b2tlblJlZ0V4cC5leGVjKG1ldGhvZCkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXF1ZXN0IG1ldGhvZCcpXG4gICAgfVxuXG4gICAgaWYgKHVwZ3JhZGUgJiYgdHlwZW9mIHVwZ3JhZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3VwZ3JhZGUgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlcnNUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoaGVhZGVyc1RpbWVvdXQpIHx8IGhlYWRlcnNUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBoZWFkZXJzVGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGJvZHlUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoYm9keVRpbWVvdXQpIHx8IGJvZHlUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBib2R5VGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKHJlc2V0ICE9IG51bGwgJiYgdHlwZW9mIHJlc2V0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXNldCcpXG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdENvbnRpbnVlICE9IG51bGwgJiYgdHlwZW9mIGV4cGVjdENvbnRpbnVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBleHBlY3RDb250aW51ZScpXG4gICAgfVxuXG4gICAgdGhpcy5oZWFkZXJzVGltZW91dCA9IGhlYWRlcnNUaW1lb3V0XG5cbiAgICB0aGlzLmJvZHlUaW1lb3V0ID0gYm9keVRpbWVvdXRcblxuICAgIHRoaXMudGhyb3dPbkVycm9yID0gdGhyb3dPbkVycm9yID09PSB0cnVlXG5cbiAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZFxuXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcblxuICAgIGlmIChib2R5ID09IG51bGwpIHtcbiAgICAgIHRoaXMuYm9keSA9IG51bGxcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHlcblxuICAgICAgY29uc3QgclN0YXRlID0gdGhpcy5ib2R5Ll9yZWFkYWJsZVN0YXRlXG4gICAgICBpZiAoIXJTdGF0ZSB8fCAhclN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAgIHRoaXMuZW5kSGFuZGxlciA9IGZ1bmN0aW9uIGF1dG9EZXN0cm95ICgpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3kodGhpcylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvZHkub24oJ2VuZCcsIHRoaXMuZW5kSGFuZGxlcilcbiAgICAgIH1cblxuICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnIgPT4ge1xuICAgICAgICBpZiAodGhpcy5hYm9ydCkge1xuICAgICAgICAgIHRoaXMuYWJvcnQoZXJyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5ib2R5Lm9uKCdlcnJvcicsIHRoaXMuZXJyb3JIYW5kbGVyKVxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0J1ZmZlcihib2R5KSkge1xuICAgICAgdGhpcy5ib2R5ID0gYm9keS5ieXRlTGVuZ3RoID8gYm9keSA6IG51bGxcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhib2R5KSkge1xuICAgICAgdGhpcy5ib2R5ID0gYm9keS5idWZmZXIuYnl0ZUxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkuYnVmZmVyLCBib2R5LmJ5dGVPZmZzZXQsIGJvZHkuYnl0ZUxlbmd0aCkgOiBudWxsXG4gICAgfSBlbHNlIGlmIChib2R5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHkuYnl0ZUxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkpIDogbnVsbFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5Lmxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkpIDogbnVsbFxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShib2R5KSB8fCB1dGlsLmlzSXRlcmFibGUoYm9keSkgfHwgdXRpbC5pc0Jsb2JMaWtlKGJvZHkpKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignYm9keSBtdXN0IGJlIGEgc3RyaW5nLCBhIEJ1ZmZlciwgYSBSZWFkYWJsZSBzdHJlYW0sIGFuIGl0ZXJhYmxlLCBvciBhbiBhc3luYyBpdGVyYWJsZScpXG4gICAgfVxuXG4gICAgdGhpcy5jb21wbGV0ZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2VcblxuICAgIHRoaXMudXBncmFkZSA9IHVwZ3JhZGUgfHwgbnVsbFxuXG4gICAgdGhpcy5wYXRoID0gcXVlcnkgPyB1dGlsLmJ1aWxkVVJMKHBhdGgsIHF1ZXJ5KSA6IHBhdGhcblxuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luXG5cbiAgICB0aGlzLmlkZW1wb3RlbnQgPSBpZGVtcG90ZW50ID09IG51bGxcbiAgICAgID8gbWV0aG9kID09PSAnSEVBRCcgfHwgbWV0aG9kID09PSAnR0VUJ1xuICAgICAgOiBpZGVtcG90ZW50XG5cbiAgICB0aGlzLmJsb2NraW5nID0gYmxvY2tpbmcgPT0gbnVsbCA/IGZhbHNlIDogYmxvY2tpbmdcblxuICAgIHRoaXMucmVzZXQgPSByZXNldCA9PSBudWxsID8gbnVsbCA6IHJlc2V0XG5cbiAgICB0aGlzLmhvc3QgPSBudWxsXG5cbiAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSBudWxsXG5cbiAgICB0aGlzLmNvbnRlbnRUeXBlID0gbnVsbFxuXG4gICAgdGhpcy5oZWFkZXJzID0gJydcblxuICAgIC8vIE9ubHkgZm9yIEgyXG4gICAgdGhpcy5leHBlY3RDb250aW51ZSA9IGV4cGVjdENvbnRpbnVlICE9IG51bGwgPyBleHBlY3RDb250aW51ZSA6IGZhbHNlXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoICUgMiAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnMgYXJyYXkgbXVzdCBiZSBldmVuJylcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBwcm9jZXNzSGVhZGVyKHRoaXMsIGhlYWRlcnNbaV0sIGhlYWRlcnNbaSArIDFdKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVycyAmJiB0eXBlb2YgaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV1cbiAgICAgICAgcHJvY2Vzc0hlYWRlcih0aGlzLCBrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhlYWRlcnMgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoZWFkZXJzIG11c3QgYmUgYW4gb2JqZWN0IG9yIGFuIGFycmF5JylcbiAgICB9XG5cbiAgICBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZSh0aGlzLmJvZHkpKSB7XG4gICAgICBpZiAodXRpbC5ub2RlTWFqb3IgPCAxNiB8fCAodXRpbC5ub2RlTWFqb3IgPT09IDE2ICYmIHV0aWwubm9kZU1pbm9yIDwgOCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdGb3JtLURhdGEgYm9kaWVzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBub2RlIHYxNi44IGFuZCBuZXdlci4nKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWV4dHJhY3RCb2R5KSB7XG4gICAgICAgIGV4dHJhY3RCb2R5ID0gcmVxdWlyZSgnLi4vZmV0Y2gvYm9keS5qcycpLmV4dHJhY3RCb2R5XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtib2R5U3RyZWFtLCBjb250ZW50VHlwZV0gPSBleHRyYWN0Qm9keShib2R5KVxuICAgICAgaWYgKHRoaXMuY29udGVudFR5cGUgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGVcbiAgICAgICAgdGhpcy5oZWFkZXJzICs9IGBjb250ZW50LXR5cGU6ICR7Y29udGVudFR5cGV9XFxyXFxuYFxuICAgICAgfVxuICAgICAgdGhpcy5ib2R5ID0gYm9keVN0cmVhbS5zdHJlYW1cbiAgICAgIHRoaXMuY29udGVudExlbmd0aCA9IGJvZHlTdHJlYW0ubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzQmxvYkxpa2UoYm9keSkgJiYgdGhpcy5jb250ZW50VHlwZSA9PSBudWxsICYmIGJvZHkudHlwZSkge1xuICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGJvZHkudHlwZVxuICAgICAgdGhpcy5oZWFkZXJzICs9IGBjb250ZW50LXR5cGU6ICR7Ym9keS50eXBlfVxcclxcbmBcbiAgICB9XG5cbiAgICB1dGlsLnZhbGlkYXRlSGFuZGxlcihoYW5kbGVyLCBtZXRob2QsIHVwZ3JhZGUpXG5cbiAgICB0aGlzLnNlcnZlcm5hbWUgPSB1dGlsLmdldFNlcnZlck5hbWUodGhpcy5ob3N0KVxuXG4gICAgdGhpc1trSGFuZGxlcl0gPSBoYW5kbGVyXG5cbiAgICBpZiAoY2hhbm5lbHMuY3JlYXRlLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy5jcmVhdGUucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMgfSlcbiAgICB9XG4gIH1cblxuICBvbkJvZHlTZW50IChjaHVuaykge1xuICAgIGlmICh0aGlzW2tIYW5kbGVyXS5vbkJvZHlTZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25Cb2R5U2VudChjaHVuaylcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblJlcXVlc3RTZW50ICgpIHtcbiAgICBpZiAoY2hhbm5lbHMuYm9keVNlbnQuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmJvZHlTZW50LnB1Ymxpc2goeyByZXF1ZXN0OiB0aGlzIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXNba0hhbmRsZXJdLm9uUmVxdWVzdFNlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vblJlcXVlc3RTZW50KClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNvbm5lY3QgKGFib3J0KSB7XG4gICAgYXNzZXJ0KCF0aGlzLmFib3J0ZWQpXG4gICAgYXNzZXJ0KCF0aGlzLmNvbXBsZXRlZClcblxuICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICBhYm9ydCh0aGlzLmVycm9yKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkNvbm5lY3QoYWJvcnQpXG4gICAgfVxuICB9XG5cbiAgb25IZWFkZXJzIChzdGF0dXNDb2RlLCBoZWFkZXJzLCByZXN1bWUsIHN0YXR1c1RleHQpIHtcbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcbiAgICBhc3NlcnQoIXRoaXMuY29tcGxldGVkKVxuXG4gICAgaWYgKGNoYW5uZWxzLmhlYWRlcnMuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmhlYWRlcnMucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIHJlc3BvbnNlOiB7IHN0YXR1c0NvZGUsIGhlYWRlcnMsIHN0YXR1c1RleHQgfSB9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25IZWFkZXJzKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHJlc3VtZSwgc3RhdHVzVGV4dClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuYWJvcnQoZXJyKVxuICAgIH1cbiAgfVxuXG4gIG9uRGF0YSAoY2h1bmspIHtcbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcbiAgICBhc3NlcnQoIXRoaXMuY29tcGxldGVkKVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkRhdGEoY2h1bmspXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIG9uVXBncmFkZSAoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KSB7XG4gICAgYXNzZXJ0KCF0aGlzLmFib3J0ZWQpXG4gICAgYXNzZXJ0KCF0aGlzLmNvbXBsZXRlZClcblxuICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICB0aGlzLm9uRmluYWxseSgpXG5cbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcblxuICAgIHRoaXMuY29tcGxldGVkID0gdHJ1ZVxuICAgIGlmIChjaGFubmVscy50cmFpbGVycy5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMudHJhaWxlcnMucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIHRyYWlsZXJzIH0pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkNvbXBsZXRlKHRyYWlsZXJzKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gVE9ETyAoZml4KTogVGhpcyBtaWdodCBiZSBhIGJhZCBpZGVhP1xuICAgICAgdGhpcy5vbkVycm9yKGVycilcbiAgICB9XG4gIH1cblxuICBvbkVycm9yIChlcnJvcikge1xuICAgIHRoaXMub25GaW5hbGx5KClcblxuICAgIGlmIChjaGFubmVscy5lcnJvci5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuZXJyb3IucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIGVycm9yIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcblxuICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkVycm9yKGVycm9yKVxuICB9XG5cbiAgb25GaW5hbGx5ICgpIHtcbiAgICBpZiAodGhpcy5lcnJvckhhbmRsZXIpIHtcbiAgICAgIHRoaXMuYm9keS5vZmYoJ2Vycm9yJywgdGhpcy5lcnJvckhhbmRsZXIpXG4gICAgICB0aGlzLmVycm9ySGFuZGxlciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJvZHkub2ZmKCdlbmQnLCB0aGlzLmVuZEhhbmRsZXIpXG4gICAgICB0aGlzLmVuZEhhbmRsZXIgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogYWRqdXN0IHRvIHN1cHBvcnQgSDJcbiAgYWRkSGVhZGVyIChrZXksIHZhbHVlKSB7XG4gICAgcHJvY2Vzc0hlYWRlcih0aGlzLCBrZXksIHZhbHVlKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGF0aWMgW2tIVFRQMUJ1aWxkUmVxdWVzdF0gKG9yaWdpbiwgb3B0cywgaGFuZGxlcikge1xuICAgIC8vIFRPRE86IE1pZ3JhdGUgaGVhZGVyIHBhcnNpbmcgaGVyZSwgdG8gbWFrZSBSZXF1ZXN0c1xuICAgIC8vIEhUVFAgYWdub3N0aWNcbiAgICByZXR1cm4gbmV3IFJlcXVlc3Qob3JpZ2luLCBvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgc3RhdGljIFtrSFRUUDJCdWlsZFJlcXVlc3RdIChvcmlnaW4sIG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gb3B0cy5oZWFkZXJzXG4gICAgb3B0cyA9IHsgLi4ub3B0cywgaGVhZGVyczogbnVsbCB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3Qob3JpZ2luLCBvcHRzLCBoYW5kbGVyKVxuXG4gICAgcmVxdWVzdC5oZWFkZXJzID0ge31cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgICBpZiAoaGVhZGVycy5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGVhZGVycyBhcnJheSBtdXN0IGJlIGV2ZW4nKVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHByb2Nlc3NIZWFkZXIocmVxdWVzdCwgaGVhZGVyc1tpXSwgaGVhZGVyc1tpICsgMV0sIHRydWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgICAgICBwcm9jZXNzSGVhZGVyKHJlcXVlc3QsIGtleSwgaGVhZGVyc1trZXldLCB0cnVlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVycyAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnMgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYW4gYXJyYXknKVxuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0XG4gIH1cblxuICBzdGF0aWMgW2tIVFRQMkNvcHlIZWFkZXJzXSAocmF3KSB7XG4gICAgY29uc3QgcmF3SGVhZGVycyA9IHJhdy5zcGxpdCgnXFxyXFxuJylcbiAgICBjb25zdCBoZWFkZXJzID0ge31cblxuICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIHJhd0hlYWRlcnMpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGhlYWRlci5zcGxpdCgnOiAnKVxuXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICAgIGlmIChoZWFkZXJzW2tleV0pIGhlYWRlcnNba2V5XSArPSBgLCR7dmFsdWV9YFxuICAgICAgZWxzZSBoZWFkZXJzW2tleV0gPSB2YWx1ZVxuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0hlYWRlclZhbHVlIChrZXksIHZhbCwgc2tpcEFwcGVuZCkge1xuICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBpbnZhbGlkICR7a2V5fSBoZWFkZXJgKVxuICB9XG5cbiAgdmFsID0gdmFsICE9IG51bGwgPyBgJHt2YWx9YCA6ICcnXG5cbiAgaWYgKGhlYWRlckNoYXJSZWdleC5leGVjKHZhbCkgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYGludmFsaWQgJHtrZXl9IGhlYWRlcmApXG4gIH1cblxuICByZXR1cm4gc2tpcEFwcGVuZCA/IHZhbCA6IGAke2tleX06ICR7dmFsfVxcclxcbmBcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0hlYWRlciAocmVxdWVzdCwga2V5LCB2YWwsIHNraXBBcHBlbmQgPSBmYWxzZSkge1xuICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihgaW52YWxpZCAke2tleX0gaGVhZGVyYClcbiAgfSBlbHNlIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKFxuICAgIHJlcXVlc3QuaG9zdCA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDQgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2hvc3QnXG4gICkge1xuICAgIGlmIChoZWFkZXJDaGFyUmVnZXguZXhlYyh2YWwpICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYGludmFsaWQgJHtrZXl9IGhlYWRlcmApXG4gICAgfVxuICAgIC8vIENvbnN1bWVkIGJ5IENsaWVudFxuICAgIHJlcXVlc3QuaG9zdCA9IHZhbFxuICB9IGVsc2UgaWYgKFxuICAgIHJlcXVlc3QuY29udGVudExlbmd0aCA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDE0ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LWxlbmd0aCdcbiAgKSB7XG4gICAgcmVxdWVzdC5jb250ZW50TGVuZ3RoID0gcGFyc2VJbnQodmFsLCAxMClcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXF1ZXN0LmNvbnRlbnRMZW5ndGgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY29udGVudC1sZW5ndGggaGVhZGVyJylcbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAgcmVxdWVzdC5jb250ZW50VHlwZSA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDEyICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnXG4gICkge1xuICAgIHJlcXVlc3QuY29udGVudFR5cGUgPSB2YWxcbiAgICBpZiAoc2tpcEFwcGVuZCkgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwsIHNraXBBcHBlbmQpXG4gICAgZWxzZSByZXF1ZXN0LmhlYWRlcnMgKz0gcHJvY2Vzc0hlYWRlclZhbHVlKGtleSwgdmFsKVxuICB9IGVsc2UgaWYgKFxuICAgIGtleS5sZW5ndGggPT09IDE3ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICd0cmFuc2Zlci1lbmNvZGluZydcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIHRyYW5zZmVyLWVuY29kaW5nIGhlYWRlcicpXG4gIH0gZWxzZSBpZiAoXG4gICAga2V5Lmxlbmd0aCA9PT0gMTAgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2Nvbm5lY3Rpb24nXG4gICkge1xuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyB2YWwudG9Mb3dlckNhc2UoKSA6IG51bGxcbiAgICBpZiAodmFsdWUgIT09ICdjbG9zZScgJiYgdmFsdWUgIT09ICdrZWVwLWFsaXZlJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNvbm5lY3Rpb24gaGVhZGVyJylcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnY2xvc2UnKSB7XG4gICAgICByZXF1ZXN0LnJlc2V0ID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIGlmIChcbiAgICBrZXkubGVuZ3RoID09PSAxMCAmJlxuICAgIGtleS50b0xvd2VyQ2FzZSgpID09PSAna2VlcC1hbGl2ZSdcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGtlZXAtYWxpdmUgaGVhZGVyJylcbiAgfSBlbHNlIGlmIChcbiAgICBrZXkubGVuZ3RoID09PSA3ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICd1cGdyYWRlJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgdXBncmFkZSBoZWFkZXInKVxuICB9IGVsc2UgaWYgKFxuICAgIGtleS5sZW5ndGggPT09IDYgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2V4cGVjdCdcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEVycm9yKCdleHBlY3QgaGVhZGVyIG5vdCBzdXBwb3J0ZWQnKVxuICB9IGVsc2UgaWYgKHRva2VuUmVnRXhwLmV4ZWMoa2V5KSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBoZWFkZXIga2V5JylcbiAgfSBlbHNlIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2tpcEFwcGVuZCkge1xuICAgICAgICAgIGlmIChyZXF1ZXN0LmhlYWRlcnNba2V5XSkgcmVxdWVzdC5oZWFkZXJzW2tleV0gKz0gYCwke3Byb2Nlc3NIZWFkZXJWYWx1ZShrZXksIHZhbFtpXSwgc2tpcEFwcGVuZCl9YFxuICAgICAgICAgIGVsc2UgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWxbaV0sIHNraXBBcHBlbmQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVxdWVzdC5oZWFkZXJzICs9IHByb2Nlc3NIZWFkZXJWYWx1ZShrZXksIHZhbFtpXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2tpcEFwcGVuZCkgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwsIHNraXBBcHBlbmQpXG4gICAgICBlbHNlIHJlcXVlc3QuaGVhZGVycyArPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwpXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVxdWVzdFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJylcblxuY2xhc3MgRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGRpc3BhdGNoICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBjbG9zZSAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgZGVzdHJveSAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRGlzcGF0Y2hlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlcicpXG5jb25zdCB7XG4gIENsaWVudERlc3Ryb3llZEVycm9yLFxuICBDbGllbnRDbG9zZWRFcnJvcixcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3Jcbn0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsga0Rlc3Ryb3ksIGtDbG9zZSwga0Rpc3BhdGNoLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5cbmNvbnN0IGtEZXN0cm95ZWQgPSBTeW1ib2woJ2Rlc3Ryb3llZCcpXG5jb25zdCBrQ2xvc2VkID0gU3ltYm9sKCdjbG9zZWQnKVxuY29uc3Qga09uRGVzdHJveWVkID0gU3ltYm9sKCdvbkRlc3Ryb3llZCcpXG5jb25zdCBrT25DbG9zZWQgPSBTeW1ib2woJ29uQ2xvc2VkJylcbmNvbnN0IGtJbnRlcmNlcHRlZERpc3BhdGNoID0gU3ltYm9sKCdJbnRlcmNlcHRlZCBEaXNwYXRjaCcpXG5cbmNsYXNzIERpc3BhdGNoZXJCYXNlIGV4dGVuZHMgRGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tEZXN0cm95ZWRdID0gZmFsc2VcbiAgICB0aGlzW2tPbkRlc3Ryb3llZF0gPSBudWxsXG4gICAgdGhpc1trQ2xvc2VkXSA9IGZhbHNlXG4gICAgdGhpc1trT25DbG9zZWRdID0gW11cbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQgKCkge1xuICAgIHJldHVybiB0aGlzW2tEZXN0cm95ZWRdXG4gIH1cblxuICBnZXQgY2xvc2VkICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ2xvc2VkXVxuICB9XG5cbiAgZ2V0IGludGVyY2VwdG9ycyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0ludGVyY2VwdG9yc11cbiAgfVxuXG4gIHNldCBpbnRlcmNlcHRvcnMgKG5ld0ludGVyY2VwdG9ycykge1xuICAgIGlmIChuZXdJbnRlcmNlcHRvcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSBuZXdJbnRlcmNlcHRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSB0aGlzW2tJbnRlcmNlcHRvcnNdW2ldXG4gICAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludGVyY2VwdG9yIG11c3QgYmUgYW4gZnVuY3Rpb24nKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG5ld0ludGVyY2VwdG9yc1xuICB9XG5cbiAgY2xvc2UgKGNhbGxiYWNrKSB7XG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2UoKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICB9XG5cbiAgICBpZiAodGhpc1trRGVzdHJveWVkXSkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2sobmV3IENsaWVudERlc3Ryb3llZEVycm9yKCksIG51bGwpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXNba0Nsb3NlZF0pIHtcbiAgICAgIGlmICh0aGlzW2tPbkNsb3NlZF0pIHtcbiAgICAgICAgdGhpc1trT25DbG9zZWRdLnB1c2goY2FsbGJhY2spXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhudWxsLCBudWxsKSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXNba0Nsb3NlZF0gPSB0cnVlXG4gICAgdGhpc1trT25DbG9zZWRdLnB1c2goY2FsbGJhY2spXG5cbiAgICBjb25zdCBvbkNsb3NlZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXNba09uQ2xvc2VkXVxuICAgICAgdGhpc1trT25DbG9zZWRdID0gbnVsbFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2ldKG51bGwsIG51bGwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2hvdWxkIG5vdCBlcnJvci5cbiAgICB0aGlzW2tDbG9zZV0oKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5kZXN0cm95KCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKG9uQ2xvc2VkKVxuICAgICAgfSlcbiAgfVxuXG4gIGRlc3Ryb3kgKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBlcnJcbiAgICAgIGVyciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5kZXN0cm95KGVyciwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBlcnIgPyAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogc2hvdWxkIG5ldmVyIGVycm9yICovIHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGlmICh0aGlzW2tEZXN0cm95ZWRdKSB7XG4gICAgICBpZiAodGhpc1trT25EZXN0cm95ZWRdKSB7XG4gICAgICAgIHRoaXNba09uRGVzdHJveWVkXS5wdXNoKGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2sobnVsbCwgbnVsbCkpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWVycikge1xuICAgICAgZXJyID0gbmV3IENsaWVudERlc3Ryb3llZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzW2tEZXN0cm95ZWRdID0gdHJ1ZVxuICAgIHRoaXNba09uRGVzdHJveWVkXSA9IHRoaXNba09uRGVzdHJveWVkXSB8fCBbXVxuICAgIHRoaXNba09uRGVzdHJveWVkXS5wdXNoKGNhbGxiYWNrKVxuXG4gICAgY29uc3Qgb25EZXN0cm95ZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzW2tPbkRlc3Ryb3llZF1cbiAgICAgIHRoaXNba09uRGVzdHJveWVkXSA9IG51bGxcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tpXShudWxsLCBudWxsKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNob3VsZCBub3QgZXJyb3IuXG4gICAgdGhpc1trRGVzdHJveV0oZXJyKS50aGVuKCgpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKG9uRGVzdHJveWVkKVxuICAgIH0pXG4gIH1cblxuICBba0ludGVyY2VwdGVkRGlzcGF0Y2hdIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgaWYgKCF0aGlzW2tJbnRlcmNlcHRvcnNdIHx8IHRoaXNba0ludGVyY2VwdG9yc10ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzW2tJbnRlcmNlcHRlZERpc3BhdGNoXSA9IHRoaXNba0Rpc3BhdGNoXVxuICAgICAgcmV0dXJuIHRoaXNba0Rpc3BhdGNoXShvcHRzLCBoYW5kbGVyKVxuICAgIH1cblxuICAgIGxldCBkaXNwYXRjaCA9IHRoaXNba0Rpc3BhdGNoXS5iaW5kKHRoaXMpXG4gICAgZm9yIChsZXQgaSA9IHRoaXNba0ludGVyY2VwdG9yc10ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGRpc3BhdGNoID0gdGhpc1trSW50ZXJjZXB0b3JzXVtpXShkaXNwYXRjaClcbiAgICB9XG4gICAgdGhpc1trSW50ZXJjZXB0ZWREaXNwYXRjaF0gPSBkaXNwYXRjaFxuICAgIHJldHVybiBkaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAoIWhhbmRsZXIgfHwgdHlwZW9mIGhhbmRsZXIgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hhbmRsZXIgbXVzdCBiZSBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoIW9wdHMgfHwgdHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cyBtdXN0IGJlIGFuIG9iamVjdC4nKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpc1trRGVzdHJveWVkXSB8fCB0aGlzW2tPbkRlc3Ryb3llZF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IENsaWVudERlc3Ryb3llZEVycm9yKClcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXNba0Nsb3NlZF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IENsaWVudENsb3NlZEVycm9yKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXNba0ludGVyY2VwdGVkRGlzcGF0Y2hdKG9wdHMsIGhhbmRsZXIpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodHlwZW9mIGhhbmRsZXIub25FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25FcnJvciBtZXRob2QnKVxuICAgICAgfVxuXG4gICAgICBoYW5kbGVyLm9uRXJyb3IoZXJyKVxuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEaXNwYXRjaGVyQmFzZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0JylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIENvbm5lY3RUaW1lb3V0RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3JzJylcblxubGV0IHRscyAvLyBpbmNsdWRlIHRscyBjb25kaXRpb25hbGx5IHNpbmNlIGl0IGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlXG5cbi8vIFRPRE86IHNlc3Npb24gcmUtdXNlIGRvZXMgbm90IHdhaXQgZm9yIHRoZSBmaXJzdFxuLy8gY29ubmVjdGlvbiB0byByZXNvbHZlIHRoZSBzZXNzaW9uIGFuZCBtaWdodCB0aGVyZWZvcmVcbi8vIHJlc29sdmUgdGhlIHNhbWUgc2VydmVybmFtZSBtdWx0aXBsZSB0aW1lcyBldmVuIHdoZW5cbi8vIHJlLXVzZSBpcyBlbmFibGVkLlxuXG5sZXQgU2Vzc2lvbkNhY2hlXG4vLyBGSVhNRTogcmVtb3ZlIHdvcmthcm91bmQgd2hlbiB0aGUgTm9kZSBidWcgaXMgZml4ZWRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDkzNDQjaXNzdWVjb21tZW50LTE3NDE3NzYzMDhcbmlmIChnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgIXByb2Nlc3MuZW52Lk5PREVfVjhfQ09WRVJBR0UpIHtcbiAgU2Vzc2lvbkNhY2hlID0gY2xhc3MgV2Vha1Nlc3Npb25DYWNoZSB7XG4gICAgY29uc3RydWN0b3IgKG1heENhY2hlZFNlc3Npb25zKSB7XG4gICAgICB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucyA9IG1heENhY2hlZFNlc3Npb25zXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUgPSBuZXcgTWFwKClcbiAgICAgIHRoaXMuX3Nlc3Npb25SZWdpc3RyeSA9IG5ldyBnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkoKGtleSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbkNhY2hlLnNpemUgPCB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5fc2Vzc2lvbkNhY2hlLmdldChrZXkpXG4gICAgICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCAmJiByZWYuZGVyZWYoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlLmRlbGV0ZShrZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZ2V0IChzZXNzaW9uS2V5KSB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzLl9zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpXG4gICAgICByZXR1cm4gcmVmID8gcmVmLmRlcmVmKCkgOiBudWxsXG4gICAgfVxuXG4gICAgc2V0IChzZXNzaW9uS2V5LCBzZXNzaW9uKSB7XG4gICAgICBpZiAodGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgbmV3IFdlYWtSZWYoc2Vzc2lvbikpXG4gICAgICB0aGlzLl9zZXNzaW9uUmVnaXN0cnkucmVnaXN0ZXIoc2Vzc2lvbiwgc2Vzc2lvbktleSlcbiAgICB9XG4gIH1cbn0gZWxzZSB7XG4gIFNlc3Npb25DYWNoZSA9IGNsYXNzIFNpbXBsZVNlc3Npb25DYWNoZSB7XG4gICAgY29uc3RydWN0b3IgKG1heENhY2hlZFNlc3Npb25zKSB7XG4gICAgICB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucyA9IG1heENhY2hlZFNlc3Npb25zXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUgPSBuZXcgTWFwKClcbiAgICB9XG5cbiAgICBnZXQgKHNlc3Npb25LZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpXG4gICAgfVxuXG4gICAgc2V0IChzZXNzaW9uS2V5LCBzZXNzaW9uKSB7XG4gICAgICBpZiAodGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9zZXNzaW9uQ2FjaGUuc2l6ZSA+PSB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgICAvLyByZW1vdmUgdGhlIG9sZGVzdCBzZXNzaW9uXG4gICAgICAgIGNvbnN0IHsgdmFsdWU6IG9sZGVzdEtleSB9ID0gdGhpcy5fc2Vzc2lvbkNhY2hlLmtleXMoKS5uZXh0KClcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlLmRlbGV0ZShvbGRlc3RLZXkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgc2Vzc2lvbilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDb25uZWN0b3IgKHsgYWxsb3dIMiwgbWF4Q2FjaGVkU2Vzc2lvbnMsIHNvY2tldFBhdGgsIHRpbWVvdXQsIC4uLm9wdHMgfSkge1xuICBpZiAobWF4Q2FjaGVkU2Vzc2lvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4Q2FjaGVkU2Vzc2lvbnMpIHx8IG1heENhY2hlZFNlc3Npb25zIDwgMCkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heENhY2hlZFNlc3Npb25zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIHplcm8nKVxuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHsgcGF0aDogc29ja2V0UGF0aCwgLi4ub3B0cyB9XG4gIGNvbnN0IHNlc3Npb25DYWNoZSA9IG5ldyBTZXNzaW9uQ2FjaGUobWF4Q2FjaGVkU2Vzc2lvbnMgPT0gbnVsbCA/IDEwMCA6IG1heENhY2hlZFNlc3Npb25zKVxuICB0aW1lb3V0ID0gdGltZW91dCA9PSBudWxsID8gMTBlMyA6IHRpbWVvdXRcbiAgYWxsb3dIMiA9IGFsbG93SDIgIT0gbnVsbCA/IGFsbG93SDIgOiBmYWxzZVxuICByZXR1cm4gZnVuY3Rpb24gY29ubmVjdCAoeyBob3N0bmFtZSwgaG9zdCwgcHJvdG9jb2wsIHBvcnQsIHNlcnZlcm5hbWUsIGxvY2FsQWRkcmVzcywgaHR0cFNvY2tldCB9LCBjYWxsYmFjaykge1xuICAgIGxldCBzb2NrZXRcbiAgICBpZiAocHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICBpZiAoIXRscykge1xuICAgICAgICB0bHMgPSByZXF1aXJlKCd0bHMnKVxuICAgICAgfVxuICAgICAgc2VydmVybmFtZSA9IHNlcnZlcm5hbWUgfHwgb3B0aW9ucy5zZXJ2ZXJuYW1lIHx8IHV0aWwuZ2V0U2VydmVyTmFtZShob3N0KSB8fCBudWxsXG5cbiAgICAgIGNvbnN0IHNlc3Npb25LZXkgPSBzZXJ2ZXJuYW1lIHx8IGhvc3RuYW1lXG4gICAgICBjb25zdCBzZXNzaW9uID0gc2Vzc2lvbkNhY2hlLmdldChzZXNzaW9uS2V5KSB8fCBudWxsXG5cbiAgICAgIGFzc2VydChzZXNzaW9uS2V5KVxuXG4gICAgICBzb2NrZXQgPSB0bHMuY29ubmVjdCh7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IDE2Mzg0LCAvLyBUTFMgaW4gbm9kZSBjYW4ndCBoYXZlIGJpZ2dlciBIV00gYW55d2F5Li4uXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHNlcnZlcm5hbWUsXG4gICAgICAgIHNlc3Npb24sXG4gICAgICAgIGxvY2FsQWRkcmVzcyxcbiAgICAgICAgLy8gVE9ETyhIVFRQLzIpOiBBZGQgc3VwcG9ydCBmb3IgaDJjXG4gICAgICAgIEFMUE5Qcm90b2NvbHM6IGFsbG93SDIgPyBbJ2h0dHAvMS4xJywgJ2gyJ10gOiBbJ2h0dHAvMS4xJ10sXG4gICAgICAgIHNvY2tldDogaHR0cFNvY2tldCwgLy8gdXBncmFkZSBzb2NrZXQgY29ubmVjdGlvblxuICAgICAgICBwb3J0OiBwb3J0IHx8IDQ0MyxcbiAgICAgICAgaG9zdDogaG9zdG5hbWVcbiAgICAgIH0pXG5cbiAgICAgIHNvY2tldFxuICAgICAgICAub24oJ3Nlc3Npb24nLCBmdW5jdGlvbiAoc2Vzc2lvbikge1xuICAgICAgICAgIC8vIFRPRE8gKGZpeCk6IENhbiBhIHNlc3Npb24gYmVjb21lIGludmFsaWQgb25jZSBlc3RhYmxpc2hlZD8gRG9uJ3QgdGhpbmsgc28/XG4gICAgICAgICAgc2Vzc2lvbkNhY2hlLnNldChzZXNzaW9uS2V5LCBzZXNzaW9uKVxuICAgICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoIWh0dHBTb2NrZXQsICdodHRwU29ja2V0IGNhbiBvbmx5IGJlIHNlbnQgb24gVExTIHVwZGF0ZScpXG4gICAgICBzb2NrZXQgPSBuZXQuY29ubmVjdCh7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IDY0ICogMTAyNCwgLy8gU2FtZSBhcyBub2RlanMgZnMgc3RyZWFtcy5cbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbG9jYWxBZGRyZXNzLFxuICAgICAgICBwb3J0OiBwb3J0IHx8IDgwLFxuICAgICAgICBob3N0OiBob3N0bmFtZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBTZXQgVENQIGtlZXAgYWxpdmUgb3B0aW9ucyBvbiB0aGUgc29ja2V0IGhlcmUgaW5zdGVhZCBvZiBpbiBjb25uZWN0KCkgZm9yIHRoZSBjYXNlIG9mIGFzc2lnbmluZyB0aGUgc29ja2V0XG4gICAgaWYgKG9wdGlvbnMua2VlcEFsaXZlID09IG51bGwgfHwgb3B0aW9ucy5rZWVwQWxpdmUpIHtcbiAgICAgIGNvbnN0IGtlZXBBbGl2ZUluaXRpYWxEZWxheSA9IG9wdGlvbnMua2VlcEFsaXZlSW5pdGlhbERlbGF5ID09PSB1bmRlZmluZWQgPyA2MGUzIDogb3B0aW9ucy5rZWVwQWxpdmVJbml0aWFsRGVsYXlcbiAgICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSwga2VlcEFsaXZlSW5pdGlhbERlbGF5KVxuICAgIH1cblxuICAgIGNvbnN0IGNhbmNlbFRpbWVvdXQgPSBzZXR1cFRpbWVvdXQoKCkgPT4gb25Db25uZWN0VGltZW91dChzb2NrZXQpLCB0aW1lb3V0KVxuXG4gICAgc29ja2V0XG4gICAgICAuc2V0Tm9EZWxheSh0cnVlKVxuICAgICAgLm9uY2UocHJvdG9jb2wgPT09ICdodHRwczonID8gJ3NlY3VyZUNvbm5lY3QnIDogJ2Nvbm5lY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbmNlbFRpbWVvdXQoKVxuXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNvbnN0IGNiID0gY2FsbGJhY2tcbiAgICAgICAgICBjYWxsYmFjayA9IG51bGxcbiAgICAgICAgICBjYihudWxsLCB0aGlzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgY2FuY2VsVGltZW91dCgpXG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY29uc3QgY2IgPSBjYWxsYmFja1xuICAgICAgICAgIGNhbGxiYWNrID0gbnVsbFxuICAgICAgICAgIGNiKGVycilcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgIHJldHVybiBzb2NrZXRcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXR1cFRpbWVvdXQgKG9uQ29ubmVjdFRpbWVvdXQsIHRpbWVvdXQpIHtcbiAgaWYgKCF0aW1lb3V0KSB7XG4gICAgcmV0dXJuICgpID0+IHt9XG4gIH1cblxuICBsZXQgczEgPSBudWxsXG4gIGxldCBzMiA9IG51bGxcbiAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gc2V0SW1tZWRpYXRlIGlzIGFkZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHByaW90b3Jpc2Ugc29ja2V0IGVycm9yIGV2ZW50cyBvdmVyIHRpbWVvdXRzXG4gICAgczEgPSBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgLy8gV2luZG93cyBuZWVkcyBhbiBleHRyYSBzZXRJbW1lZGlhdGUgcHJvYmFibHkgZHVlIHRvIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzIGluIHRoZSBzb2NrZXQgbG9naWNcbiAgICAgICAgczIgPSBzZXRJbW1lZGlhdGUoKCkgPT4gb25Db25uZWN0VGltZW91dCgpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25Db25uZWN0VGltZW91dCgpXG4gICAgICB9XG4gICAgfSlcbiAgfSwgdGltZW91dClcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgIGNsZWFySW1tZWRpYXRlKHMxKVxuICAgIGNsZWFySW1tZWRpYXRlKHMyKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uQ29ubmVjdFRpbWVvdXQgKHNvY2tldCkge1xuICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgQ29ubmVjdFRpbWVvdXRFcnJvcigpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1aWxkQ29ubmVjdG9yXG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5lbnVtVG9NYXAgPSB2b2lkIDA7XG5mdW5jdGlvbiBlbnVtVG9NYXAob2JqKSB7XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5lbnVtVG9NYXAgPSBlbnVtVG9NYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TUEVDSUFMX0hFQURFUlMgPSBleHBvcnRzLkhFQURFUl9TVEFURSA9IGV4cG9ydHMuTUlOT1IgPSBleHBvcnRzLk1BSk9SID0gZXhwb3J0cy5DT05ORUNUSU9OX1RPS0VOX0NIQVJTID0gZXhwb3J0cy5IRUFERVJfQ0hBUlMgPSBleHBvcnRzLlRPS0VOID0gZXhwb3J0cy5TVFJJQ1RfVE9LRU4gPSBleHBvcnRzLkhFWCA9IGV4cG9ydHMuVVJMX0NIQVIgPSBleHBvcnRzLlNUUklDVF9VUkxfQ0hBUiA9IGV4cG9ydHMuVVNFUklORk9fQ0hBUlMgPSBleHBvcnRzLk1BUksgPSBleHBvcnRzLkFMUEhBTlVNID0gZXhwb3J0cy5OVU0gPSBleHBvcnRzLkhFWF9NQVAgPSBleHBvcnRzLk5VTV9NQVAgPSBleHBvcnRzLkFMUEhBID0gZXhwb3J0cy5GSU5JU0ggPSBleHBvcnRzLkhfTUVUSE9EX01BUCA9IGV4cG9ydHMuTUVUSE9EX01BUCA9IGV4cG9ydHMuTUVUSE9EU19SVFNQID0gZXhwb3J0cy5NRVRIT0RTX0lDRSA9IGV4cG9ydHMuTUVUSE9EU19IVFRQID0gZXhwb3J0cy5NRVRIT0RTID0gZXhwb3J0cy5MRU5JRU5UX0ZMQUdTID0gZXhwb3J0cy5GTEFHUyA9IGV4cG9ydHMuVFlQRSA9IGV4cG9ydHMuRVJST1IgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG4vLyBDIGhlYWRlcnNcbnZhciBFUlJPUjtcbihmdW5jdGlvbiAoRVJST1IpIHtcbiAgICBFUlJPUltFUlJPUltcIk9LXCJdID0gMF0gPSBcIk9LXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlRFUk5BTFwiXSA9IDFdID0gXCJJTlRFUk5BTFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiU1RSSUNUXCJdID0gMl0gPSBcIlNUUklDVFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiTEZfRVhQRUNURURcIl0gPSAzXSA9IFwiTEZfRVhQRUNURURcIjtcbiAgICBFUlJPUltFUlJPUltcIlVORVhQRUNURURfQ09OVEVOVF9MRU5HVEhcIl0gPSA0XSA9IFwiVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0xPU0VEX0NPTk5FQ1RJT05cIl0gPSA1XSA9IFwiQ0xPU0VEX0NPTk5FQ1RJT05cIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfTUVUSE9EXCJdID0gNl0gPSBcIklOVkFMSURfTUVUSE9EXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1VSTFwiXSA9IDddID0gXCJJTlZBTElEX1VSTFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9DT05TVEFOVFwiXSA9IDhdID0gXCJJTlZBTElEX0NPTlNUQU5UXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1ZFUlNJT05cIl0gPSA5XSA9IFwiSU5WQUxJRF9WRVJTSU9OXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX0hFQURFUl9UT0tFTlwiXSA9IDEwXSA9IFwiSU5WQUxJRF9IRUFERVJfVE9LRU5cIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfQ09OVEVOVF9MRU5HVEhcIl0gPSAxMV0gPSBcIklOVkFMSURfQ09OVEVOVF9MRU5HVEhcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfQ0hVTktfU0laRVwiXSA9IDEyXSA9IFwiSU5WQUxJRF9DSFVOS19TSVpFXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1NUQVRVU1wiXSA9IDEzXSA9IFwiSU5WQUxJRF9TVEFUVVNcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfRU9GX1NUQVRFXCJdID0gMTRdID0gXCJJTlZBTElEX0VPRl9TVEFURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElOR1wiXSA9IDE1XSA9IFwiSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElOR1wiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfTUVTU0FHRV9CRUdJTlwiXSA9IDE2XSA9IFwiQ0JfTUVTU0FHRV9CRUdJTlwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfSEVBREVSU19DT01QTEVURVwiXSA9IDE3XSA9IFwiQ0JfSEVBREVSU19DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfTUVTU0FHRV9DT01QTEVURVwiXSA9IDE4XSA9IFwiQ0JfTUVTU0FHRV9DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfQ0hVTktfSEVBREVSXCJdID0gMTldID0gXCJDQl9DSFVOS19IRUFERVJcIjtcbiAgICBFUlJPUltFUlJPUltcIkNCX0NIVU5LX0NPTVBMRVRFXCJdID0gMjBdID0gXCJDQl9DSFVOS19DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiUEFVU0VEXCJdID0gMjFdID0gXCJQQVVTRURcIjtcbiAgICBFUlJPUltFUlJPUltcIlBBVVNFRF9VUEdSQURFXCJdID0gMjJdID0gXCJQQVVTRURfVVBHUkFERVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiUEFVU0VEX0gyX1VQR1JBREVcIl0gPSAyM10gPSBcIlBBVVNFRF9IMl9VUEdSQURFXCI7XG4gICAgRVJST1JbRVJST1JbXCJVU0VSXCJdID0gMjRdID0gXCJVU0VSXCI7XG59KShFUlJPUiA9IGV4cG9ydHMuRVJST1IgfHwgKGV4cG9ydHMuRVJST1IgPSB7fSkpO1xudmFyIFRZUEU7XG4oZnVuY3Rpb24gKFRZUEUpIHtcbiAgICBUWVBFW1RZUEVbXCJCT1RIXCJdID0gMF0gPSBcIkJPVEhcIjtcbiAgICBUWVBFW1RZUEVbXCJSRVFVRVNUXCJdID0gMV0gPSBcIlJFUVVFU1RcIjtcbiAgICBUWVBFW1RZUEVbXCJSRVNQT05TRVwiXSA9IDJdID0gXCJSRVNQT05TRVwiO1xufSkoVFlQRSA9IGV4cG9ydHMuVFlQRSB8fCAoZXhwb3J0cy5UWVBFID0ge30pKTtcbnZhciBGTEFHUztcbihmdW5jdGlvbiAoRkxBR1MpIHtcbiAgICBGTEFHU1tGTEFHU1tcIkNPTk5FQ1RJT05fS0VFUF9BTElWRVwiXSA9IDFdID0gXCJDT05ORUNUSU9OX0tFRVBfQUxJVkVcIjtcbiAgICBGTEFHU1tGTEFHU1tcIkNPTk5FQ1RJT05fQ0xPU0VcIl0gPSAyXSA9IFwiQ09OTkVDVElPTl9DTE9TRVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiQ09OTkVDVElPTl9VUEdSQURFXCJdID0gNF0gPSBcIkNPTk5FQ1RJT05fVVBHUkFERVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiQ0hVTktFRFwiXSA9IDhdID0gXCJDSFVOS0VEXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJVUEdSQURFXCJdID0gMTZdID0gXCJVUEdSQURFXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJDT05URU5UX0xFTkdUSFwiXSA9IDMyXSA9IFwiQ09OVEVOVF9MRU5HVEhcIjtcbiAgICBGTEFHU1tGTEFHU1tcIlNLSVBCT0RZXCJdID0gNjRdID0gXCJTS0lQQk9EWVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiVFJBSUxJTkdcIl0gPSAxMjhdID0gXCJUUkFJTElOR1wiO1xuICAgIC8vIDEgPDwgOCBpcyB1bnVzZWRcbiAgICBGTEFHU1tGTEFHU1tcIlRSQU5TRkVSX0VOQ09ESU5HXCJdID0gNTEyXSA9IFwiVFJBTlNGRVJfRU5DT0RJTkdcIjtcbn0pKEZMQUdTID0gZXhwb3J0cy5GTEFHUyB8fCAoZXhwb3J0cy5GTEFHUyA9IHt9KSk7XG52YXIgTEVOSUVOVF9GTEFHUztcbihmdW5jdGlvbiAoTEVOSUVOVF9GTEFHUykge1xuICAgIExFTklFTlRfRkxBR1NbTEVOSUVOVF9GTEFHU1tcIkhFQURFUlNcIl0gPSAxXSA9IFwiSEVBREVSU1wiO1xuICAgIExFTklFTlRfRkxBR1NbTEVOSUVOVF9GTEFHU1tcIkNIVU5LRURfTEVOR1RIXCJdID0gMl0gPSBcIkNIVU5LRURfTEVOR1RIXCI7XG4gICAgTEVOSUVOVF9GTEFHU1tMRU5JRU5UX0ZMQUdTW1wiS0VFUF9BTElWRVwiXSA9IDRdID0gXCJLRUVQX0FMSVZFXCI7XG59KShMRU5JRU5UX0ZMQUdTID0gZXhwb3J0cy5MRU5JRU5UX0ZMQUdTIHx8IChleHBvcnRzLkxFTklFTlRfRkxBR1MgPSB7fSkpO1xudmFyIE1FVEhPRFM7XG4oZnVuY3Rpb24gKE1FVEhPRFMpIHtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJERUxFVEVcIl0gPSAwXSA9IFwiREVMRVRFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiR0VUXCJdID0gMV0gPSBcIkdFVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkhFQURcIl0gPSAyXSA9IFwiSEVBRFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBPU1RcIl0gPSAzXSA9IFwiUE9TVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBVVFwiXSA9IDRdID0gXCJQVVRcIjtcbiAgICAvKiBwYXRob2xvZ2ljYWwgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJDT05ORUNUXCJdID0gNV0gPSBcIkNPTk5FQ1RcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJPUFRJT05TXCJdID0gNl0gPSBcIk9QVElPTlNcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJUUkFDRVwiXSA9IDddID0gXCJUUkFDRVwiO1xuICAgIC8qIFdlYkRBViAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkNPUFlcIl0gPSA4XSA9IFwiQ09QWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkxPQ0tcIl0gPSA5XSA9IFwiTE9DS1wiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1LQ09MXCJdID0gMTBdID0gXCJNS0NPTFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1PVkVcIl0gPSAxMV0gPSBcIk1PVkVcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQUk9QRklORFwiXSA9IDEyXSA9IFwiUFJPUEZJTkRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQUk9QUEFUQ0hcIl0gPSAxM10gPSBcIlBST1BQQVRDSFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlNFQVJDSFwiXSA9IDE0XSA9IFwiU0VBUkNIXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5MT0NLXCJdID0gMTVdID0gXCJVTkxPQ0tcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJCSU5EXCJdID0gMTZdID0gXCJCSU5EXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVCSU5EXCJdID0gMTddID0gXCJSRUJJTkRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJVTkJJTkRcIl0gPSAxOF0gPSBcIlVOQklORFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkFDTFwiXSA9IDE5XSA9IFwiQUNMXCI7XG4gICAgLyogc3VidmVyc2lvbiAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlJFUE9SVFwiXSA9IDIwXSA9IFwiUkVQT1JUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTUtBQ1RJVklUWVwiXSA9IDIxXSA9IFwiTUtBQ1RJVklUWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkNIRUNLT1VUXCJdID0gMjJdID0gXCJDSEVDS09VVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1FUkdFXCJdID0gMjNdID0gXCJNRVJHRVwiO1xuICAgIC8qIHVwbnAgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNLVNFQVJDSFwiXSA9IDI0XSA9IFwiTS1TRUFSQ0hcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJOT1RJRllcIl0gPSAyNV0gPSBcIk5PVElGWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlNVQlNDUklCRVwiXSA9IDI2XSA9IFwiU1VCU0NSSUJFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5TVUJTQ1JJQkVcIl0gPSAyN10gPSBcIlVOU1VCU0NSSUJFXCI7XG4gICAgLyogUkZDLTU3ODkgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQQVRDSFwiXSA9IDI4XSA9IFwiUEFUQ0hcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQVVJHRVwiXSA9IDI5XSA9IFwiUFVSR0VcIjtcbiAgICAvKiBDYWxEQVYgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNS0NBTEVOREFSXCJdID0gMzBdID0gXCJNS0NBTEVOREFSXCI7XG4gICAgLyogUkZDLTIwNjgsIHNlY3Rpb24gMTkuNi4xLjIgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJMSU5LXCJdID0gMzFdID0gXCJMSU5LXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5MSU5LXCJdID0gMzJdID0gXCJVTkxJTktcIjtcbiAgICAvKiBpY2VjYXN0ICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiU09VUkNFXCJdID0gMzNdID0gXCJTT1VSQ0VcIjtcbiAgICAvKiBSRkMtNzU0MCwgc2VjdGlvbiAxMS42ICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUFJJXCJdID0gMzRdID0gXCJQUklcIjtcbiAgICAvKiBSRkMtMjMyNiBSVFNQICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiREVTQ1JJQkVcIl0gPSAzNV0gPSBcIkRFU0NSSUJFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiQU5OT1VOQ0VcIl0gPSAzNl0gPSBcIkFOTk9VTkNFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiU0VUVVBcIl0gPSAzN10gPSBcIlNFVFVQXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUExBWVwiXSA9IDM4XSA9IFwiUExBWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBBVVNFXCJdID0gMzldID0gXCJQQVVTRVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlRFQVJET1dOXCJdID0gNDBdID0gXCJURUFSRE9XTlwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkdFVF9QQVJBTUVURVJcIl0gPSA0MV0gPSBcIkdFVF9QQVJBTUVURVJcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJTRVRfUEFSQU1FVEVSXCJdID0gNDJdID0gXCJTRVRfUEFSQU1FVEVSXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVESVJFQ1RcIl0gPSA0M10gPSBcIlJFRElSRUNUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVDT1JEXCJdID0gNDRdID0gXCJSRUNPUkRcIjtcbiAgICAvKiBSQU9QICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiRkxVU0hcIl0gPSA0NV0gPSBcIkZMVVNIXCI7XG59KShNRVRIT0RTID0gZXhwb3J0cy5NRVRIT0RTIHx8IChleHBvcnRzLk1FVEhPRFMgPSB7fSkpO1xuZXhwb3J0cy5NRVRIT0RTX0hUVFAgPSBbXG4gICAgTUVUSE9EUy5ERUxFVEUsXG4gICAgTUVUSE9EUy5HRVQsXG4gICAgTUVUSE9EUy5IRUFELFxuICAgIE1FVEhPRFMuUE9TVCxcbiAgICBNRVRIT0RTLlBVVCxcbiAgICBNRVRIT0RTLkNPTk5FQ1QsXG4gICAgTUVUSE9EUy5PUFRJT05TLFxuICAgIE1FVEhPRFMuVFJBQ0UsXG4gICAgTUVUSE9EUy5DT1BZLFxuICAgIE1FVEhPRFMuTE9DSyxcbiAgICBNRVRIT0RTLk1LQ09MLFxuICAgIE1FVEhPRFMuTU9WRSxcbiAgICBNRVRIT0RTLlBST1BGSU5ELFxuICAgIE1FVEhPRFMuUFJPUFBBVENILFxuICAgIE1FVEhPRFMuU0VBUkNILFxuICAgIE1FVEhPRFMuVU5MT0NLLFxuICAgIE1FVEhPRFMuQklORCxcbiAgICBNRVRIT0RTLlJFQklORCxcbiAgICBNRVRIT0RTLlVOQklORCxcbiAgICBNRVRIT0RTLkFDTCxcbiAgICBNRVRIT0RTLlJFUE9SVCxcbiAgICBNRVRIT0RTLk1LQUNUSVZJVFksXG4gICAgTUVUSE9EUy5DSEVDS09VVCxcbiAgICBNRVRIT0RTLk1FUkdFLFxuICAgIE1FVEhPRFNbJ00tU0VBUkNIJ10sXG4gICAgTUVUSE9EUy5OT1RJRlksXG4gICAgTUVUSE9EUy5TVUJTQ1JJQkUsXG4gICAgTUVUSE9EUy5VTlNVQlNDUklCRSxcbiAgICBNRVRIT0RTLlBBVENILFxuICAgIE1FVEhPRFMuUFVSR0UsXG4gICAgTUVUSE9EUy5NS0NBTEVOREFSLFxuICAgIE1FVEhPRFMuTElOSyxcbiAgICBNRVRIT0RTLlVOTElOSyxcbiAgICBNRVRIT0RTLlBSSSxcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBzaG91bGQgd2UgYWxsb3cgaXQgd2l0aCBIVFRQP1xuICAgIE1FVEhPRFMuU09VUkNFLFxuXTtcbmV4cG9ydHMuTUVUSE9EU19JQ0UgPSBbXG4gICAgTUVUSE9EUy5TT1VSQ0UsXG5dO1xuZXhwb3J0cy5NRVRIT0RTX1JUU1AgPSBbXG4gICAgTUVUSE9EUy5PUFRJT05TLFxuICAgIE1FVEhPRFMuREVTQ1JJQkUsXG4gICAgTUVUSE9EUy5BTk5PVU5DRSxcbiAgICBNRVRIT0RTLlNFVFVQLFxuICAgIE1FVEhPRFMuUExBWSxcbiAgICBNRVRIT0RTLlBBVVNFLFxuICAgIE1FVEhPRFMuVEVBUkRPV04sXG4gICAgTUVUSE9EUy5HRVRfUEFSQU1FVEVSLFxuICAgIE1FVEhPRFMuU0VUX1BBUkFNRVRFUixcbiAgICBNRVRIT0RTLlJFRElSRUNULFxuICAgIE1FVEhPRFMuUkVDT1JELFxuICAgIE1FVEhPRFMuRkxVU0gsXG4gICAgLy8gRm9yIEFpclBsYXlcbiAgICBNRVRIT0RTLkdFVCxcbiAgICBNRVRIT0RTLlBPU1QsXG5dO1xuZXhwb3J0cy5NRVRIT0RfTUFQID0gdXRpbHNfMS5lbnVtVG9NYXAoTUVUSE9EUyk7XG5leHBvcnRzLkhfTUVUSE9EX01BUCA9IHt9O1xuT2JqZWN0LmtleXMoZXhwb3J0cy5NRVRIT0RfTUFQKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoL15ILy50ZXN0KGtleSkpIHtcbiAgICAgICAgZXhwb3J0cy5IX01FVEhPRF9NQVBba2V5XSA9IGV4cG9ydHMuTUVUSE9EX01BUFtrZXldO1xuICAgIH1cbn0pO1xudmFyIEZJTklTSDtcbihmdW5jdGlvbiAoRklOSVNIKSB7XG4gICAgRklOSVNIW0ZJTklTSFtcIlNBRkVcIl0gPSAwXSA9IFwiU0FGRVwiO1xuICAgIEZJTklTSFtGSU5JU0hbXCJTQUZFX1dJVEhfQ0JcIl0gPSAxXSA9IFwiU0FGRV9XSVRIX0NCXCI7XG4gICAgRklOSVNIW0ZJTklTSFtcIlVOU0FGRVwiXSA9IDJdID0gXCJVTlNBRkVcIjtcbn0pKEZJTklTSCA9IGV4cG9ydHMuRklOSVNIIHx8IChleHBvcnRzLkZJTklTSCA9IHt9KSk7XG5leHBvcnRzLkFMUEhBID0gW107XG5mb3IgKGxldCBpID0gJ0EnLmNoYXJDb2RlQXQoMCk7IGkgPD0gJ1onLmNoYXJDb2RlQXQoMCk7IGkrKykge1xuICAgIC8vIFVwcGVyIGNhc2VcbiAgICBleHBvcnRzLkFMUEhBLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShpKSk7XG4gICAgLy8gTG93ZXIgY2FzZVxuICAgIGV4cG9ydHMuQUxQSEEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGkgKyAweDIwKSk7XG59XG5leHBvcnRzLk5VTV9NQVAgPSB7XG4gICAgMDogMCwgMTogMSwgMjogMiwgMzogMywgNDogNCxcbiAgICA1OiA1LCA2OiA2LCA3OiA3LCA4OiA4LCA5OiA5LFxufTtcbmV4cG9ydHMuSEVYX01BUCA9IHtcbiAgICAwOiAwLCAxOiAxLCAyOiAyLCAzOiAzLCA0OiA0LFxuICAgIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDgsIDk6IDksXG4gICAgQTogMFhBLCBCOiAwWEIsIEM6IDBYQywgRDogMFhELCBFOiAwWEUsIEY6IDBYRixcbiAgICBhOiAweGEsIGI6IDB4YiwgYzogMHhjLCBkOiAweGQsIGU6IDB4ZSwgZjogMHhmLFxufTtcbmV4cG9ydHMuTlVNID0gW1xuICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5Jyxcbl07XG5leHBvcnRzLkFMUEhBTlVNID0gZXhwb3J0cy5BTFBIQS5jb25jYXQoZXhwb3J0cy5OVU0pO1xuZXhwb3J0cy5NQVJLID0gWyctJywgJ18nLCAnLicsICchJywgJ34nLCAnKicsICdcXCcnLCAnKCcsICcpJ107XG5leHBvcnRzLlVTRVJJTkZPX0NIQVJTID0gZXhwb3J0cy5BTFBIQU5VTVxuICAgIC5jb25jYXQoZXhwb3J0cy5NQVJLKVxuICAgIC5jb25jYXQoWyclJywgJzsnLCAnOicsICcmJywgJz0nLCAnKycsICckJywgJywnXSk7XG4vLyBUT0RPKGluZHV0bnkpOiB1c2UgUkZDXG5leHBvcnRzLlNUUklDVF9VUkxfQ0hBUiA9IFtcbiAgICAnIScsICdcIicsICckJywgJyUnLCAnJicsICdcXCcnLFxuICAgICcoJywgJyknLCAnKicsICcrJywgJywnLCAnLScsICcuJywgJy8nLFxuICAgICc6JywgJzsnLCAnPCcsICc9JywgJz4nLFxuICAgICdAJywgJ1snLCAnXFxcXCcsICddJywgJ14nLCAnXycsXG4gICAgJ2AnLFxuICAgICd7JywgJ3wnLCAnfScsICd+Jyxcbl0uY29uY2F0KGV4cG9ydHMuQUxQSEFOVU0pO1xuZXhwb3J0cy5VUkxfQ0hBUiA9IGV4cG9ydHMuU1RSSUNUX1VSTF9DSEFSXG4gICAgLmNvbmNhdChbJ1xcdCcsICdcXGYnXSk7XG4vLyBBbGwgY2hhcmFjdGVycyB3aXRoIDB4ODAgYml0IHNldCB0byAxXG5mb3IgKGxldCBpID0gMHg4MDsgaSA8PSAweGZmOyBpKyspIHtcbiAgICBleHBvcnRzLlVSTF9DSEFSLnB1c2goaSk7XG59XG5leHBvcnRzLkhFWCA9IGV4cG9ydHMuTlVNLmNvbmNhdChbJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJ10pO1xuLyogVG9rZW5zIGFzIGRlZmluZWQgYnkgcmZjIDI2MTYuIEFsc28gbG93ZXJjYXNlcyB0aGVtLlxuICogICAgICAgIHRva2VuICAgICAgID0gMSo8YW55IENIQVIgZXhjZXB0IENUTHMgb3Igc2VwYXJhdG9ycz5cbiAqICAgICBzZXBhcmF0b3JzICAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAqICAgICAgICAgICAgICAgICAgICB8IFwiLFwiIHwgXCI7XCIgfCBcIjpcIiB8IFwiXFxcIiB8IDxcIj5cbiAqICAgICAgICAgICAgICAgICAgICB8IFwiL1wiIHwgXCJbXCIgfCBcIl1cIiB8IFwiP1wiIHwgXCI9XCJcbiAqICAgICAgICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKi9cbmV4cG9ydHMuU1RSSUNUX1RPS0VOID0gW1xuICAgICchJywgJyMnLCAnJCcsICclJywgJyYnLCAnXFwnJyxcbiAgICAnKicsICcrJywgJy0nLCAnLicsXG4gICAgJ14nLCAnXycsICdgJyxcbiAgICAnfCcsICd+Jyxcbl0uY29uY2F0KGV4cG9ydHMuQUxQSEFOVU0pO1xuZXhwb3J0cy5UT0tFTiA9IGV4cG9ydHMuU1RSSUNUX1RPS0VOLmNvbmNhdChbJyAnXSk7XG4vKlxuICogVmVyaWZ5IHRoYXQgYSBjaGFyIGlzIGEgdmFsaWQgdmlzaWJsZSAocHJpbnRhYmxlKSBVUy1BU0NJSVxuICogY2hhcmFjdGVyIG9yICV4ODAtRkZcbiAqL1xuZXhwb3J0cy5IRUFERVJfQ0hBUlMgPSBbJ1xcdCddO1xuZm9yIChsZXQgaSA9IDMyOyBpIDw9IDI1NTsgaSsrKSB7XG4gICAgaWYgKGkgIT09IDEyNykge1xuICAgICAgICBleHBvcnRzLkhFQURFUl9DSEFSUy5wdXNoKGkpO1xuICAgIH1cbn1cbi8vICcsJyA9IFxceDQ0XG5leHBvcnRzLkNPTk5FQ1RJT05fVE9LRU5fQ0hBUlMgPSBleHBvcnRzLkhFQURFUl9DSEFSUy5maWx0ZXIoKGMpID0+IGMgIT09IDQ0KTtcbmV4cG9ydHMuTUFKT1IgPSBleHBvcnRzLk5VTV9NQVA7XG5leHBvcnRzLk1JTk9SID0gZXhwb3J0cy5NQUpPUjtcbnZhciBIRUFERVJfU1RBVEU7XG4oZnVuY3Rpb24gKEhFQURFUl9TVEFURSkge1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJHRU5FUkFMXCJdID0gMF0gPSBcIkdFTkVSQUxcIjtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiQ09OTkVDVElPTlwiXSA9IDFdID0gXCJDT05ORUNUSU9OXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkNPTlRFTlRfTEVOR1RIXCJdID0gMl0gPSBcIkNPTlRFTlRfTEVOR1RIXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlRSQU5TRkVSX0VOQ09ESU5HXCJdID0gM10gPSBcIlRSQU5TRkVSX0VOQ09ESU5HXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlVQR1JBREVcIl0gPSA0XSA9IFwiVVBHUkFERVwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJDT05ORUNUSU9OX0tFRVBfQUxJVkVcIl0gPSA1XSA9IFwiQ09OTkVDVElPTl9LRUVQX0FMSVZFXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkNPTk5FQ1RJT05fQ0xPU0VcIl0gPSA2XSA9IFwiQ09OTkVDVElPTl9DTE9TRVwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJDT05ORUNUSU9OX1VQR1JBREVcIl0gPSA3XSA9IFwiQ09OTkVDVElPTl9VUEdSQURFXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlRSQU5TRkVSX0VOQ09ESU5HX0NIVU5LRURcIl0gPSA4XSA9IFwiVFJBTlNGRVJfRU5DT0RJTkdfQ0hVTktFRFwiO1xufSkoSEVBREVSX1NUQVRFID0gZXhwb3J0cy5IRUFERVJfU1RBVEUgfHwgKGV4cG9ydHMuSEVBREVSX1NUQVRFID0ge30pKTtcbmV4cG9ydHMuU1BFQ0lBTF9IRUFERVJTID0ge1xuICAgICdjb25uZWN0aW9uJzogSEVBREVSX1NUQVRFLkNPTk5FQ1RJT04sXG4gICAgJ2NvbnRlbnQtbGVuZ3RoJzogSEVBREVSX1NUQVRFLkNPTlRFTlRfTEVOR1RILFxuICAgICdwcm94eS1jb25uZWN0aW9uJzogSEVBREVSX1NUQVRFLkNPTk5FQ1RJT04sXG4gICAgJ3RyYW5zZmVyLWVuY29kaW5nJzogSEVBREVSX1NUQVRFLlRSQU5TRkVSX0VOQ09ESU5HLFxuICAgICd1cGdyYWRlJzogSEVBREVSX1NUQVRFLlVQR1JBREUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBrQm9keVVzZWQgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgRUUgPSByZXF1aXJlKCdldmVudHMnKVxuXG5jb25zdCByZWRpcmVjdGFibGVTdGF0dXNDb2RlcyA9IFszMDAsIDMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XVxuXG5jb25zdCBrQm9keSA9IFN5bWJvbCgnYm9keScpXG5cbmNsYXNzIEJvZHlBc3luY0l0ZXJhYmxlIHtcbiAgY29uc3RydWN0b3IgKGJvZHkpIHtcbiAgICB0aGlzW2tCb2R5XSA9IGJvZHlcbiAgICB0aGlzW2tCb2R5VXNlZF0gPSBmYWxzZVxuICB9XG5cbiAgYXN5bmMgKiBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBhc3NlcnQoIXRoaXNba0JvZHlVc2VkXSwgJ2Rpc3R1cmJlZCcpXG4gICAgdGhpc1trQm9keVVzZWRdID0gdHJ1ZVxuICAgIHlpZWxkICogdGhpc1trQm9keV1cbiAgfVxufVxuXG5jbGFzcyBSZWRpcmVjdEhhbmRsZXIge1xuICBjb25zdHJ1Y3RvciAoZGlzcGF0Y2gsIG1heFJlZGlyZWN0aW9ucywgb3B0cywgaGFuZGxlcikge1xuICAgIGlmIChtYXhSZWRpcmVjdGlvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVkaXJlY3Rpb25zKSB8fCBtYXhSZWRpcmVjdGlvbnMgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhSZWRpcmVjdGlvbnMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gICAgfVxuXG4gICAgdXRpbC52YWxpZGF0ZUhhbmRsZXIoaGFuZGxlciwgb3B0cy5tZXRob2QsIG9wdHMudXBncmFkZSlcblxuICAgIHRoaXMuZGlzcGF0Y2ggPSBkaXNwYXRjaFxuICAgIHRoaXMubG9jYXRpb24gPSBudWxsXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLm9wdHMgPSB7IC4uLm9wdHMsIG1heFJlZGlyZWN0aW9uczogMCB9IC8vIG9wdHMgbXVzdCBiZSBhIGNvcHlcbiAgICB0aGlzLm1heFJlZGlyZWN0aW9ucyA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgICB0aGlzLmhpc3RvcnkgPSBbXVxuXG4gICAgaWYgKHV0aWwuaXNTdHJlYW0odGhpcy5vcHRzLmJvZHkpKSB7XG4gICAgICAvLyBUT0RPIChmaXgpOiBQcm92aWRlIHNvbWUgd2F5IGZvciB0aGUgdXNlciB0byBjYWNoZSB0aGUgZmlsZSB0byBlLmcuIC90bXBcbiAgICAgIC8vIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BhdGNoZWQgYWdhaW4/XG4gICAgICAvLyBUT0RPIChmaXgpOiBEbyB3ZSBuZWVkIDEwMC1leHBlY3Qgc3VwcG9ydCB0byBwcm92aWRlIGEgd2F5IHRvIGRvIHRoaXMgcHJvcGVybHk/XG4gICAgICBpZiAodXRpbC5ib2R5TGVuZ3RoKHRoaXMub3B0cy5ib2R5KSA9PT0gMCkge1xuICAgICAgICB0aGlzLm9wdHMuYm9keVxuICAgICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSlcbiAgICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5ib2R5LnJlYWRhYmxlRGlkUmVhZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRoaXMub3B0cy5ib2R5W2tCb2R5VXNlZF0gPSBmYWxzZVxuICAgICAgICBFRS5wcm90b3R5cGUub24uY2FsbCh0aGlzLm9wdHMuYm9keSwgJ2RhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpc1trQm9keVVzZWRdID0gdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmJvZHkgJiYgdHlwZW9mIHRoaXMub3B0cy5ib2R5LnBpcGVUbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETyAoZml4KTogV2UgY2FuJ3QgYWNjZXNzIFJlYWRhYmxlU3RyZWFtIGludGVybmFsIHN0YXRlXG4gICAgICAvLyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgaXQgaGFzIGJlZW4gZGlzdHVyYmVkLiBUaGlzIGlzIGp1c3RcbiAgICAgIC8vIGEgd29ya2Fyb3VuZC5cbiAgICAgIHRoaXMub3B0cy5ib2R5ID0gbmV3IEJvZHlBc3luY0l0ZXJhYmxlKHRoaXMub3B0cy5ib2R5KVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLm9wdHMuYm9keSAmJlxuICAgICAgdHlwZW9mIHRoaXMub3B0cy5ib2R5ICE9PSAnc3RyaW5nJyAmJlxuICAgICAgIUFycmF5QnVmZmVyLmlzVmlldyh0aGlzLm9wdHMuYm9keSkgJiZcbiAgICAgIHV0aWwuaXNJdGVyYWJsZSh0aGlzLm9wdHMuYm9keSlcbiAgICApIHtcbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBhbGxvdyByZS11c2luZyBpdGVyYWJsZSBpZiAhdGhpcy5vcHRzLmlkZW1wb3RlbnRcbiAgICAgIC8vIG9yIHRocm91Z2ggc29tZSBvdGhlciBmbGFnP1xuICAgICAgdGhpcy5vcHRzLmJvZHkgPSBuZXcgQm9keUFzeW5jSXRlcmFibGUodGhpcy5vcHRzLmJvZHkpXG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCkge1xuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuaGFuZGxlci5vbkNvbm5lY3QoYWJvcnQsIHsgaGlzdG9yeTogdGhpcy5oaXN0b3J5IH0pXG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHNvY2tldCkge1xuICAgIHRoaXMuaGFuZGxlci5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICB9XG5cbiAgb25FcnJvciAoZXJyb3IpIHtcbiAgICB0aGlzLmhhbmRsZXIub25FcnJvcihlcnJvcilcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgaGVhZGVycywgcmVzdW1lLCBzdGF0dXNUZXh0KSB7XG4gICAgdGhpcy5sb2NhdGlvbiA9IHRoaXMuaGlzdG9yeS5sZW5ndGggPj0gdGhpcy5tYXhSZWRpcmVjdGlvbnMgfHwgdXRpbC5pc0Rpc3R1cmJlZCh0aGlzLm9wdHMuYm9keSlcbiAgICAgID8gbnVsbFxuICAgICAgOiBwYXJzZUxvY2F0aW9uKHN0YXR1c0NvZGUsIGhlYWRlcnMpXG5cbiAgICBpZiAodGhpcy5vcHRzLm9yaWdpbikge1xuICAgICAgdGhpcy5oaXN0b3J5LnB1c2gobmV3IFVSTCh0aGlzLm9wdHMucGF0aCwgdGhpcy5vcHRzLm9yaWdpbikpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uSGVhZGVycyhzdGF0dXNDb2RlLCBoZWFkZXJzLCByZXN1bWUsIHN0YXR1c1RleHQpXG4gICAgfVxuXG4gICAgY29uc3QgeyBvcmlnaW4sIHBhdGhuYW1lLCBzZWFyY2ggfSA9IHV0aWwucGFyc2VVUkwobmV3IFVSTCh0aGlzLmxvY2F0aW9uLCB0aGlzLm9wdHMub3JpZ2luICYmIG5ldyBVUkwodGhpcy5vcHRzLnBhdGgsIHRoaXMub3B0cy5vcmlnaW4pKSlcbiAgICBjb25zdCBwYXRoID0gc2VhcmNoID8gYCR7cGF0aG5hbWV9JHtzZWFyY2h9YCA6IHBhdGhuYW1lXG5cbiAgICAvLyBSZW1vdmUgaGVhZGVycyByZWZlcnJpbmcgdG8gdGhlIG9yaWdpbmFsIFVSTC5cbiAgICAvLyBCeSBkZWZhdWx0IGl0IGlzIEhvc3Qgb25seSwgdW5sZXNzIGl0J3MgYSAzMDMgKHNlZSBiZWxvdyksIHdoaWNoIHJlbW92ZXMgYWxzbyBhbGwgQ29udGVudC0qIGhlYWRlcnMuXG4gICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjRcbiAgICB0aGlzLm9wdHMuaGVhZGVycyA9IGNsZWFuUmVxdWVzdEhlYWRlcnModGhpcy5vcHRzLmhlYWRlcnMsIHN0YXR1c0NvZGUgPT09IDMwMywgdGhpcy5vcHRzLm9yaWdpbiAhPT0gb3JpZ2luKVxuICAgIHRoaXMub3B0cy5wYXRoID0gcGF0aFxuICAgIHRoaXMub3B0cy5vcmlnaW4gPSBvcmlnaW5cbiAgICB0aGlzLm9wdHMubWF4UmVkaXJlY3Rpb25zID0gMFxuICAgIHRoaXMub3B0cy5xdWVyeSA9IG51bGxcblxuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjRcbiAgICAvLyBJbiBjYXNlIG9mIEhUVFAgMzAzLCBhbHdheXMgcmVwbGFjZSBtZXRob2QgdG8gYmUgZWl0aGVyIEhFQUQgb3IgR0VUXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDMwMyAmJiB0aGlzLm9wdHMubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAgIHRoaXMub3B0cy5tZXRob2QgPSAnR0VUJ1xuICAgICAgdGhpcy5vcHRzLmJvZHkgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAvKlxuICAgICAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNFxuXG4gICAgICAgIFRMRFI6IHVuZGljaSBhbHdheXMgaWdub3JlcyAzeHggcmVzcG9uc2UgYm9kaWVzLlxuXG4gICAgICAgIFJlZGlyZWN0aW9uIGlzIHVzZWQgdG8gc2VydmUgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBmcm9tIGFub3RoZXIgVVJMLCBzbyBpdCBpcyBhc3N1bWVzIHRoYXRcbiAgICAgICAgbm8gYm9keSBpcyBnZW5lcmF0ZWQgKGFuZCB0aHVzIGNhbiBiZSBpZ25vcmVkKS4gRXZlbiB0aG91Z2ggZ2VuZXJhdGluZyBhIGJvZHkgaXMgbm90IHByb2hpYml0ZWQuXG5cbiAgICAgICAgRm9yIHN0YXR1cyAzMDEsIDMwMiwgMzAzLCAzMDcgYW5kIDMwOCAodGhlIGxhdHRlciBmcm9tIFJGQyA3MjM4KSwgdGhlIHNwZWNzIG1lbnRpb24gdGhhdCB0aGUgYm9keSB1c3VhbGx5XG4gICAgICAgICh3aGljaCBtZWFucyBpdCdzIG9wdGlvbmFsIGFuZCBub3QgbWFuZGF0ZWQpIGNvbnRhaW4ganVzdCBhbiBoeXBlcmxpbmsgdG8gdGhlIHZhbHVlIG9mXG4gICAgICAgIHRoZSBMb2NhdGlvbiByZXNwb25zZSBoZWFkZXIsIHNvIHRoZSBib2R5IGNhbiBiZSBpZ25vcmVkIHNhZmVseS5cblxuICAgICAgICBGb3Igc3RhdHVzIDMwMCwgd2hpY2ggaXMgXCJNdWx0aXBsZSBDaG9pY2VzXCIsIHRoZSBzcGVjIG1lbnRpb25zIGJvdGggZ2VuZXJhdGluZyBhIExvY2F0aW9uXG4gICAgICAgIHJlc3BvbnNlIGhlYWRlciBBTkQgYSByZXNwb25zZSBib2R5IHdpdGggdGhlIG90aGVyIHBvc3NpYmxlIGxvY2F0aW9uIHRvIGZvbGxvdy5cbiAgICAgICAgU2luY2UgdGhlIHNwZWMgZXhwbGljaXRpbHkgY2hvb3NlcyBub3QgdG8gc3BlY2lmeSBhIGZvcm1hdCBmb3Igc3VjaCBib2R5IGFuZCBsZWF2ZSBpdCB0b1xuICAgICAgICBzZXJ2ZXJzIGFuZCBicm93c2VycyBpbXBsZW1lbnRvcnMsIHdlIGlnbm9yZSB0aGUgYm9keSBhcyB0aGVyZSBpcyBubyBzcGVjaWZpZWQgd2F5IHRvIGV2ZW50dWFsbHkgcGFyc2UgaXQuXG4gICAgICAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRGF0YShjaHVuaylcbiAgICB9XG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAvKlxuICAgICAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNFxuXG4gICAgICAgIFRMRFI6IHVuZGljaSBhbHdheXMgaWdub3JlcyAzeHggcmVzcG9uc2UgdHJhaWxlcnMgYXMgdGhleSBhcmUgbm90IGV4cGVjdGVkIGluIGNhc2Ugb2YgcmVkaXJlY3Rpb25zXG4gICAgICAgIGFuZCBuZWl0aGVyIGFyZSB1c2VmdWwgaWYgcHJlc2VudC5cblxuICAgICAgICBTZWUgY29tbWVudCBvbiBvbkRhdGEgbWV0aG9kIGFib3ZlIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9ucy5cbiAgICAgICovXG5cbiAgICAgIHRoaXMubG9jYXRpb24gPSBudWxsXG4gICAgICB0aGlzLmFib3J0ID0gbnVsbFxuXG4gICAgICB0aGlzLmRpc3BhdGNoKHRoaXMub3B0cywgdGhpcylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVyLm9uQ29tcGxldGUodHJhaWxlcnMpXG4gICAgfVxuICB9XG5cbiAgb25Cb2R5U2VudCAoY2h1bmspIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyLm9uQm9keVNlbnQpIHtcbiAgICAgIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KGNodW5rKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2F0aW9uIChzdGF0dXNDb2RlLCBoZWFkZXJzKSB7XG4gIGlmIChyZWRpcmVjdGFibGVTdGF0dXNDb2Rlcy5pbmRleE9mKHN0YXR1c0NvZGUpID09PSAtMSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBpZiAoaGVhZGVyc1tpXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdsb2NhdGlvbicpIHtcbiAgICAgIHJldHVybiBoZWFkZXJzW2kgKyAxXVxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNC40XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVIZWFkZXIgKGhlYWRlciwgcmVtb3ZlQ29udGVudCwgdW5rbm93bk9yaWdpbikge1xuICBpZiAoaGVhZGVyLmxlbmd0aCA9PT0gNCkge1xuICAgIHJldHVybiB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpID09PSAnaG9zdCdcbiAgfVxuICBpZiAocmVtb3ZlQ29udGVudCAmJiB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpLnN0YXJ0c1dpdGgoJ2NvbnRlbnQtJykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmICh1bmtub3duT3JpZ2luICYmIChoZWFkZXIubGVuZ3RoID09PSAxMyB8fCBoZWFkZXIubGVuZ3RoID09PSA2IHx8IGhlYWRlci5sZW5ndGggPT09IDE5KSkge1xuICAgIGNvbnN0IG5hbWUgPSB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpXG4gICAgcmV0dXJuIG5hbWUgPT09ICdhdXRob3JpemF0aW9uJyB8fCBuYW1lID09PSAnY29va2llJyB8fCBuYW1lID09PSAncHJveHktYXV0aG9yaXphdGlvbidcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjRcbmZ1bmN0aW9uIGNsZWFuUmVxdWVzdEhlYWRlcnMgKGhlYWRlcnMsIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pIHtcbiAgY29uc3QgcmV0ID0gW11cbiAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGlmICghc2hvdWxkUmVtb3ZlSGVhZGVyKGhlYWRlcnNbaV0sIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pKSB7XG4gICAgICAgIHJldC5wdXNoKGhlYWRlcnNbaV0sIGhlYWRlcnNbaSArIDFdKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGhlYWRlcnMpKSB7XG4gICAgICBpZiAoIXNob3VsZFJlbW92ZUhlYWRlcihrZXksIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pKSB7XG4gICAgICAgIHJldC5wdXNoKGtleSwgaGVhZGVyc1trZXldKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoaGVhZGVycyA9PSBudWxsLCAnaGVhZGVycyBtdXN0IGJlIGFuIG9iamVjdCBvciBhbiBhcnJheScpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlZGlyZWN0SGFuZGxlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmVkaXJlY3RIYW5kbGVyID0gcmVxdWlyZSgnLi4vaGFuZGxlci9SZWRpcmVjdEhhbmRsZXInKVxuXG5mdW5jdGlvbiBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yICh7IG1heFJlZGlyZWN0aW9uczogZGVmYXVsdE1heFJlZGlyZWN0aW9ucyB9KSB7XG4gIHJldHVybiAoZGlzcGF0Y2gpID0+IHtcbiAgICByZXR1cm4gZnVuY3Rpb24gSW50ZXJjZXB0IChvcHRzLCBoYW5kbGVyKSB7XG4gICAgICBjb25zdCB7IG1heFJlZGlyZWN0aW9ucyA9IGRlZmF1bHRNYXhSZWRpcmVjdGlvbnMgfSA9IG9wdHNcblxuICAgICAgaWYgKCFtYXhSZWRpcmVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoKG9wdHMsIGhhbmRsZXIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlZGlyZWN0SGFuZGxlciA9IG5ldyBSZWRpcmVjdEhhbmRsZXIoZGlzcGF0Y2gsIG1heFJlZGlyZWN0aW9ucywgb3B0cywgaGFuZGxlcilcbiAgICAgIG9wdHMgPSB7IC4uLm9wdHMsIG1heFJlZGlyZWN0aW9uczogMCB9IC8vIFN0b3Agc3ViIGRpc3BhdGNoZXIgZnJvbSBhbHNvIHJlZGlyZWN0aW5nLlxuICAgICAgcmV0dXJuIGRpc3BhdGNoKG9wdHMsIHJlZGlyZWN0SGFuZGxlcilcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yXG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0gJ0FHRnpiUUVBQUFBQk1BaGdBWDhCZjJBRGYzOS9BWDlnQkg5L2YzOEJmMkFBQUdBRGYzOS9BR0FCZndCZ0FuOS9BR0FHZjM5L2YzOS9BQUxMQVFnRFpXNTJHSGRoYzIxZmIyNWZhR1ZoWkdWeWMxOWpiMjF3YkdWMFpRQUNBMlZ1ZGhWM1lYTnRYMjl1WDIxbGMzTmhaMlZmWW1WbmFXNEFBQU5sYm5ZTGQyRnpiVjl2Ymw5MWNtd0FBUU5sYm5ZT2QyRnpiVjl2Ymw5emRHRjBkWE1BQVFObGJuWVVkMkZ6YlY5dmJsOW9aV0ZrWlhKZlptbGxiR1FBQVFObGJuWVVkMkZ6YlY5dmJsOW9aV0ZrWlhKZmRtRnNkV1VBQVFObGJuWU1kMkZ6YlY5dmJsOWliMlI1QUFFRFpXNTJHSGRoYzIxZmIyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpRQUFBMFpGQXdNRUFBQUZBQUFBQUFBQUJRRUZBQVVGQlFBQUJnQUFBQUFHQmdZR0FRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFBQUJBUWNBQUFVRkF3QUJCQVVCY0FFU0VnVURBUUFDQmdnQmZ3RkJnTlFFQ3dmUkJTSUdiV1Z0YjNKNUFnQUxYMmx1YVhScFlXeHBlbVVBQ1JsZlgybHVaR2x5WldOMFgyWjFibU4wYVc5dVgzUmhZbXhsQVFBTGJHeG9kSFJ3WDJsdWFYUUFDaGhzYkdoMGRIQmZjMmh2ZFd4a1gydGxaWEJmWVd4cGRtVUFRUXhzYkdoMGRIQmZZV3hzYjJNQURBWnRZV3hzYjJNQVJndHNiR2gwZEhCZlpuSmxaUUFOQkdaeVpXVUFTQTlzYkdoMGRIQmZaMlYwWDNSNWNHVUFEaFZzYkdoMGRIQmZaMlYwWDJoMGRIQmZiV0ZxYjNJQUR4VnNiR2gwZEhCZloyVjBYMmgwZEhCZmJXbHViM0lBRUJGc2JHaDBkSEJmWjJWMFgyMWxkR2h2WkFBUkZteHNhSFIwY0Y5blpYUmZjM1JoZEhWelgyTnZaR1VBRWhKc2JHaDBkSEJmWjJWMFgzVndaM0poWkdVQUV3eHNiR2gwZEhCZmNtVnpaWFFBRkE1c2JHaDBkSEJmWlhobFkzVjBaUUFWRkd4c2FIUjBjRjl6WlhSMGFXNW5jMTlwYm1sMEFCWU5iR3hvZEhSd1gyWnBibWx6YUFBWERHeHNhSFIwY0Y5d1lYVnpaUUFZRFd4c2FIUjBjRjl5WlhOMWJXVUFHUnRzYkdoMGRIQmZjbVZ6ZFcxbFgyRm1kR1Z5WDNWd1ozSmhaR1VBR2hCc2JHaDBkSEJmWjJWMFgyVnljbTV2QUJzWGJHeG9kSFJ3WDJkbGRGOWxjbkp2Y2w5eVpXRnpiMjRBSEJkc2JHaDBkSEJmYzJWMFgyVnljbTl5WDNKbFlYTnZiZ0FkRkd4c2FIUjBjRjluWlhSZlpYSnliM0pmY0c5ekFCNFJiR3hvZEhSd1gyVnljbTV2WDI1aGJXVUFIeEpzYkdoMGRIQmZiV1YwYUc5a1gyNWhiV1VBSUJKc2JHaDBkSEJmYzNSaGRIVnpYMjVoYldVQUlScHNiR2gwZEhCZmMyVjBYMnhsYm1sbGJuUmZhR1ZoWkdWeWN3QWlJV3hzYUhSMGNGOXpaWFJmYkdWdWFXVnVkRjlqYUhWdWEyVmtYMnhsYm1kMGFBQWpIV3hzYUhSMGNGOXpaWFJmYkdWdWFXVnVkRjlyWldWd1gyRnNhWFpsQUNRa2JHeG9kSFJ3WDNObGRGOXNaVzVwWlc1MFgzUnlZVzV6Wm1WeVgyVnVZMjlrYVc1bkFDVVliR3hvZEhSd1gyMWxjM05oWjJWZmJtVmxaSE5mWlc5bUFEOEpGd0VBUVFFTEVRRUNBd1FGQ3dZSE5UazNNUzh0SnlzcENzTGdBa1VDQUFzSUFCQ0lnSUNBQUFzWkFDQUFFTUtBZ0lBQUdpQUFJQUkyQWpnZ0FDQUJPZ0FvQ3h3QUlBQWdBQzhCTWlBQUxRQXVJQUFRd1lDQWdBQVFnSUNBZ0FBTEtnRUJmMEhBQUJER2dJQ0FBQ0lCRU1LQWdJQUFHaUFCUVlDSWdJQUFOZ0k0SUFFZ0FEb0FLQ0FCQ3dvQUlBQVF5SUNBZ0FBTEJ3QWdBQzBBS0FzSEFDQUFMUUFxQ3djQUlBQXRBQ3NMQndBZ0FDMEFLUXNIQUNBQUx3RXlDd2NBSUFBdEFDNExSUUVFZnlBQUtBSVlJUUVnQUMwQUxTRUNJQUF0QUNnaEF5QUFLQUk0SVFRZ0FCRENnSUNBQUJvZ0FDQUVOZ0k0SUFBZ0F6b0FLQ0FBSUFJNkFDMGdBQ0FCTmdJWUN4RUFJQUFnQVNBQklBSnFFTU9BZ0lBQUN4QUFJQUJCQUVIY0FCRE1nSUNBQUJvTFp3RUJmMEVBSVFFQ1FDQUFLQUlNRFFBQ1FBSkFBa0FDUUNBQUxRQXZEZ01CQUFNQ0N5QUFLQUk0SWdGRkRRQWdBU2dDTENJQlJRMEFJQUFnQVJHQWdJQ0FBQUFpQVEwREMwRUFEd3NReW9DQWdBQUFDeUFBUWNPV2dJQUFOZ0lRUVE0aEFRc2dBUXNlQUFKQUlBQW9BZ3dOQUNBQVFkR2JnSUFBTmdJUUlBQkJGVFlDREFzTEZnQUNRQ0FBS0FJTVFSVkhEUUFnQUVFQU5nSU1Dd3NXQUFKQUlBQW9BZ3hCRmtjTkFDQUFRUUEyQWd3TEN3Y0FJQUFvQWd3TEJ3QWdBQ2dDRUFzSkFDQUFJQUUyQWhBTEJ3QWdBQ2dDRkFzaUFBSkFJQUJCSkVrTkFCREtnSUNBQUFBTElBQkJBblJCb0xPQWdBQnFLQUlBQ3lJQUFrQWdBRUV1U1EwQUVNcUFnSUFBQUFzZ0FFRUNkRUd3dElDQUFHb29BZ0FMN2dzQkFYOUI2NmlBZ0FBaEFRSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCbkg5cUR2UURZMklBQVdGaFlXRmhZUUlEQkFWaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhCZ2NJQ1FvTERBME9EMkZoWVdGaEVHRmhZV0ZoWVdGaFlXRmhFV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZUklURkJVV0Z4Z1pHaHRoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoSEIwZUh5QWhJaU1rSlNZbktDa3FLeXd0TGk4d01USXpORFUyWVRjNE9UcGhZV0ZoWVdGaFlUdGhZV0U4WVdGaFlUMCtQMkZoWVdGaFlXRmhRR0ZoUVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlVSkRSRVZHUjBoSlNrdE1UVTVQVUZGU1UyRmhZV0ZoWVdGaFZGVldWMWhaV2x0aFhGMWhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZlWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWDJCaEMwSGhwNENBQUE4TFFhU2hnSUFBRHd0Qnk2eUFnQUFQQzBIK3NZQ0FBQThMUWNDa2dJQUFEd3RCcTZTQWdBQVBDMEdOcUlDQUFBOExRZUttZ0lBQUR3dEJnTENBZ0FBUEMwRzVyNENBQUE4TFFkZWtnSUFBRHd0Qjc1K0FnQUFQQzBIaG40Q0FBQThMUWZxZmdJQUFEd3RCOHFDQWdBQVBDMEdvcjRDQUFBOExRYTZ5Z0lBQUR3dEJpTENBZ0FBUEMwSHNwNENBQUE4TFFZS2lnSUFBRHd0QmpwMkFnQUFQQzBIUXJvQ0FBQThMUWNxamdJQUFEd3RCeGJLQWdBQVBDMEhmbklDQUFBOExRZEtjZ0lBQUR3dEJ4S0NBZ0FBUEMwSFhvSUNBQUE4TFFhS2ZnSUFBRHd0QjdhNkFnQUFQQzBHcnNJQ0FBQThMUWRTbGdJQUFEd3RCeks2QWdBQVBDMEg2cm9DQUFBOExRZnlyZ0lBQUR3dEIwckNBZ0FBUEMwSHhuWUNBQUE4TFFidWdnSUFBRHd0Qjk2dUFnQUFQQzBHUXNZQ0FBQThMUWRleGdJQUFEd3RCb3EyQWdBQVBDMEhVcDRDQUFBOExRZUNyZ0lBQUR3dEJuNnlBZ0FBUEMwSHJzWUNBQUE4TFFkV2ZnSUFBRHd0QnlyR0FnQUFQQzBIZXBZQ0FBQThMUWRTZWdJQUFEd3RCOUp5QWdBQVBDMEduc29DQUFBOExRYkdkZ0lBQUR3dEJvSjJBZ0FBUEMwRzVzWUNBQUE4TFFieXdnSUFBRHd0QmtxR0FnQUFQQzBHenBvQ0FBQThMUWVtc2dJQUFEd3RCcko2QWdBQVBDMEhVcTRDQUFBOExRZmVtZ0lBQUR3dEJnS2FBZ0FBUEMwR3dvWUNBQUE4TFFmNmVnSUFBRHd0QmphT0FnQUFQQzBHSnJZQ0FBQThMUWZlaWdJQUFEd3RCb0xHQWdBQVBDMEd1bjRDQUFBOExRY2FsZ0lBQUR3dEI2SjZBZ0FBUEMwR1Rvb0NBQUE4TFFjS3ZnSUFBRHd0Qnc1MkFnQUFQQzBHTHJJQ0FBQThMUWVHZGdJQUFEd3RCamErQWdBQVBDMEhxb1lDQUFBOExRYlN0Z0lBQUR3dEIwcStBZ0FBUEMwSGZzb0NBQUE4TFFkS3lnSUFBRHd0QjhMQ0FnQUFQQzBHcG9vQ0FBQThMUWZtamdJQUFEd3RCbVo2QWdBQVBDMEcxcklDQUFBOExRWnV3Z0lBQUR3dEJrcktBZ0FBUEMwRzJxNENBQUE4TFFjS2lnSUFBRHd0QitMS0FnQUFQQzBHZXBZQ0FBQThMUWRDaWdJQUFEd3RCdXA2QWdBQVBDMEdCbm9DQUFBOExFTXFBZ0lBQUFBdEIxcUdBZ0FBaEFRc2dBUXNXQUNBQUlBQXRBQzFCL2dGeElBRkJBRWR5T2dBdEN4a0FJQUFnQUMwQUxVSDlBWEVnQVVFQVIwRUJkSEk2QUMwTEdRQWdBQ0FBTFFBdFFmc0JjU0FCUVFCSFFRSjBjam9BTFFzWkFDQUFJQUF0QUMxQjl3RnhJQUZCQUVkQkEzUnlPZ0F0Q3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BZ0FpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDQkNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRY2FSZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJd0lnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDMGtCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FnZ2lCRVVOQUNBQUlBRWdBaUFCYXlBRUVZR0FnSUFBQUNJRFFYOUhEUUFnQUVIMmlvQ0FBRFlDRUVFWUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NOQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0SkFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlNSWdSRkRRQWdBQ0FCSUFJZ0FXc2dCQkdCZ0lDQUFBQWlBMEYvUncwQUlBQkI3WnFBZ0FBMkFoQkJHQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWpnaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxTUUVDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ0VDSUVSUTBBSUFBZ0FTQUNJQUZySUFRUmdZQ0FnQUFBSWdOQmYwY05BQ0FBUVpXUWdJQUFOZ0lRUVJnaEF3c2dBd3N1QVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSThJZ1JGRFFBZ0FDQUVFWUNBZ0lBQUFDRURDeUFEQzBrQkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BaFFpQkVVTkFDQUFJQUVnQWlBQmF5QUVFWUdBZ0lBQUFDSURRWDlIRFFBZ0FFR3FtNENBQURZQ0VFRVlJUU1MSUFNTExnRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDUUNJRVJRMEFJQUFnQkJHQWdJQ0FBQUFoQXdzZ0F3dEpBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJWUlnUkZEUUFnQUNBQklBSWdBV3NnQkJHQmdJQ0FBQUFpQTBGL1J3MEFJQUJCN1pPQWdBQTJBaEJCR0NFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FrUWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NKQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlzSWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREMwa0JBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWlnaUJFVU5BQ0FBSUFFZ0FpQUJheUFFRVlHQWdJQUFBQ0lEUVg5SERRQWdBRUgyaUlDQUFEWUNFRUVZSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ1VDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RKQVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSWNJZ1JGRFFBZ0FDQUJJQUlnQVdzZ0JCR0JnSUNBQUFBaUEwRi9SdzBBSUFCQndwbUFnQUEyQWhCQkdDRURDeUFEQ3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9Ba2dpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDSUNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRWlNVZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FKTUlnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FsUWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NXQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0RkFRRi9Ba0FDUUNBQUx3RXdRUlJ4UVJSSERRQkJBU0VESUFBdEFDaEJBVVlOQVNBQUx3RXlRZVVBUmlFRERBRUxJQUF0QUNsQkJVWWhBd3NnQUNBRE9nQXVRUUFML2dFQkEzOUJBU0VEQWtBZ0FDOEJNQ0lFUVFoeERRQWdBQ2tESUVJQVVpRURDd0pBQWtBZ0FDMEFMa1VOQUVFQklRVWdBQzBBS1VFRlJnMEJRUUVoQlNBRVFjQUFjVVVnQTNGQkFVY05BUXRCQUNFRklBUkJ3QUJ4RFFCQkFpRUZJQVJCLy84RGNTSURRUWh4RFFBQ1FDQURRWUFFY1VVTkFBSkFJQUF0QUNoQkFVY05BQ0FBTFFBdFFRcHhEUUJCQlE4TFFRUVBDd0pBSUFOQklIRU5BQUpBSUFBdEFDaEJBVVlOQUNBQUx3RXlRZi8vQTNFaUFFR2NmMnBCNUFCSkRRQWdBRUhNQVVZTkFDQUFRYkFDUmcwQVFRUWhCU0FFUVNoeFJRMENJQU5CaUFSeFFZQUVSZzBDQzBFQUR3dEJBRUVESUFBcEF5QlFHeUVGQ3lBRkMySUJBbjlCQUNFQkFrQWdBQzBBS0VFQlJnMEFJQUF2QVRKQi8vOERjU0lDUVp4L2FrSGtBRWtOQUNBQ1Fjd0JSZzBBSUFKQnNBSkdEUUFnQUM4Qk1DSUFRY0FBY1EwQVFRRWhBU0FBUVlnRWNVR0FCRVlOQUNBQVFTaHhSU0VCQ3lBQkM2Y0JBUU4vQWtBQ1FBSkFJQUF0QUNwRkRRQWdBQzBBSzBVTkFFRUFJUU1nQUM4Qk1DSUVRUUp4UlEwQkRBSUxRUUFoQXlBQUx3RXdJZ1JCQVhGRkRRRUxRUUVoQXlBQUxRQW9RUUZHRFFBZ0FDOEJNa0gvL3dOeElnVkJuSDlxUWVRQVNRMEFJQVZCekFGR0RRQWdCVUd3QWtZTkFDQUVRY0FBY1EwQVFRQWhBeUFFUVlnRWNVR0FCRVlOQUNBRVFTaHhRUUJISVFNTElBQkJBRHNCTUNBQVFRQTZBQzhnQXd1WkFRRUNmd0pBQWtBQ1FDQUFMUUFxUlEwQUlBQXRBQ3RGRFFCQkFDRUJJQUF2QVRBaUFrRUNjVVVOQVF3Q0MwRUFJUUVnQUM4Qk1DSUNRUUZ4UlEwQkMwRUJJUUVnQUMwQUtFRUJSZzBBSUFBdkFUSkIvLzhEY1NJQVFaeC9ha0hrQUVrTkFDQUFRY3dCUmcwQUlBQkJzQUpHRFFBZ0FrSEFBSEVOQUVFQUlRRWdBa0dJQkhGQmdBUkdEUUFnQWtFb2NVRUFSeUVCQ3lBQkMxa0FJQUJCR0dwQ0FEY0RBQ0FBUWdBM0F3QWdBRUU0YWtJQU53TUFJQUJCTUdwQ0FEY0RBQ0FBUVNocVFnQTNBd0FnQUVFZ2FrSUFOd01BSUFCQkVHcENBRGNEQUNBQVFRaHFRZ0EzQXdBZ0FFSGRBVFlDSEVFQUMzc0JBWDhDUUNBQUtBSU1JZ01OQUFKQUlBQW9BZ1JGRFFBZ0FDQUJOZ0lFQ3dKQUlBQWdBU0FDRU1TQWdJQUFJZ01OQUNBQUtBSU1Ed3NnQUNBRE5nSWNRUUFoQXlBQUtBSUVJZ0ZGRFFBZ0FDQUJJQUlnQUNnQ0NCR0JnSUNBQUFBaUFVVU5BQ0FBSUFJMkFoUWdBQ0FCTmdJTUlBRWhBd3NnQXd2azh3RUREbjhEZmdSL0k0Q0FnSUFBUVJCcklnTWtnSUNBZ0FBZ0FTRUVJQUVoQlNBQklRWWdBU0VISUFFaENDQUJJUWtnQVNFS0lBRWhDeUFCSVF3Z0FTRU5JQUVoRGlBQklROENRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBQ2dDSENJUVFYOXFEdDBCMmdFQjJRRUNBd1FGQmdjSUNRb0xEQTBPMkFFUEVOY0JFUkxXQVJNVUZSWVhHQmthRytBQjN3RWNIUjdWQVI4Z0lTSWpKQ1hVQVNZbktDa3FLeXpUQWRJQkxTN1JBZEFCTHpBeE1qTTBOVFkzT0RrNk96dzlQajlBUVVKRFJFVkcyd0ZIU0VsS3p3SE9BVXZOQVV6TUFVMU9UMUJSVWxOVVZWWlhXRmxhVzF4ZFhsOWdZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYcDdmSDErZjRBQmdRR0NBWU1CaEFHRkFZWUJod0dJQVlrQmlnR0xBWXdCalFHT0FZOEJrQUdSQVpJQmt3R1VBWlVCbGdHWEFaZ0JtUUdhQVpzQm5BR2RBWjRCbndHZ0FhRUJvZ0dqQWFRQnBRR21BYWNCcUFHcEFhb0Jxd0dzQWEwQnJnR3ZBYkFCc1FHeUFiTUJ0QUcxQWJZQnR3SExBY29CdUFISkFia0J5QUc2QWJzQnZBRzlBYjRCdndIQUFjRUJ3Z0hEQWNRQnhRSEdBUURjQVF0QkFDRVFETVlCQzBFT0lSQU14UUVMUVEwaEVBekVBUXRCRHlFUURNTUJDMEVRSVJBTXdnRUxRUk1oRUF6QkFRdEJGQ0VRRE1BQkMwRVZJUkFNdndFTFFSWWhFQXkrQVF0QkZ5RVFETDBCQzBFWUlSQU12QUVMUVJraEVBeTdBUXRCR2lFUURMb0JDMEViSVJBTXVRRUxRUndoRUF5NEFRdEJDQ0VRRExjQkMwRWRJUkFNdGdFTFFTQWhFQXkxQVF0Qkh5RVFETFFCQzBFSElSQU1zd0VMUVNFaEVBeXlBUXRCSWlFUURMRUJDMEVlSVJBTXNBRUxRU01oRUF5dkFRdEJFaUVRREs0QkMwRVJJUkFNclFFTFFTUWhFQXlzQVF0QkpTRVFES3NCQzBFbUlSQU1xZ0VMUVNjaEVBeXBBUXRCd3dFaEVBeW9BUXRCS1NFUURLY0JDMEVySVJBTXBnRUxRU3doRUF5bEFRdEJMU0VRREtRQkMwRXVJUkFNb3dFTFFTOGhFQXlpQVF0QnhBRWhFQXloQVF0Qk1DRVFES0FCQzBFMElSQU1ud0VMUVF3aEVBeWVBUXRCTVNFUURKMEJDMEV5SVJBTW5BRUxRVE1oRUF5YkFRdEJPU0VRREpvQkMwRTFJUkFNbVFFTFFjVUJJUkFNbUFFTFFRc2hFQXlYQVF0Qk9pRVFESllCQzBFMklSQU1sUUVMUVFvaEVBeVVBUXRCTnlFUURKTUJDMEU0SVJBTWtnRUxRVHdoRUF5UkFRdEJPeUVRREpBQkMwRTlJUkFNandFTFFRa2hFQXlPQVF0QktDRVFESTBCQzBFK0lSQU1qQUVMUVQ4aEVBeUxBUXRCd0FBaEVBeUtBUXRCd1FBaEVBeUpBUXRCd2dBaEVBeUlBUXRCd3dBaEVBeUhBUXRCeEFBaEVBeUdBUXRCeFFBaEVBeUZBUXRCeGdBaEVBeUVBUXRCS2lFUURJTUJDMEhIQUNFUURJSUJDMEhJQUNFUURJRUJDMEhKQUNFUURJQUJDMEhLQUNFUURIOExRY3NBSVJBTWZndEJ6UUFoRUF4OUMwSE1BQ0VRREh3TFFjNEFJUkFNZXd0Qnp3QWhFQXg2QzBIUUFDRVFESGtMUWRFQUlSQU1lQXRCMGdBaEVBeDNDMEhUQUNFUURIWUxRZFFBSVJBTWRRdEIxZ0FoRUF4MEMwSFZBQ0VRREhNTFFRWWhFQXh5QzBIWEFDRVFESEVMUVFVaEVBeHdDMEhZQUNFUURHOExRUVFoRUF4dUMwSFpBQ0VRREcwTFFkb0FJUkFNYkF0QjJ3QWhFQXhyQzBIY0FDRVFER29MUVFNaEVBeHBDMEhkQUNFUURHZ0xRZDRBSVJBTVp3dEIzd0FoRUF4bUMwSGhBQ0VRREdVTFFlQUFJUkFNWkF0QjRnQWhFQXhqQzBIakFDRVFER0lMUVFJaEVBeGhDMEhrQUNFUURHQUxRZVVBSVJBTVh3dEI1Z0FoRUF4ZUMwSG5BQ0VRREYwTFFlZ0FJUkFNWEF0QjZRQWhFQXhiQzBIcUFDRVFERm9MUWVzQUlSQU1XUXRCN0FBaEVBeFlDMEh0QUNFUURGY0xRZTRBSVJBTVZndEI3d0FoRUF4VkMwSHdBQ0VRREZRTFFmRUFJUkFNVXd0QjhnQWhFQXhTQzBIekFDRVFERkVMUWZRQUlSQU1VQXRCOVFBaEVBeFBDMEgyQUNFUURFNExRZmNBSVJBTVRRdEIrQUFoRUF4TUMwSDVBQ0VRREVzTFFmb0FJUkFNU2d0Qit3QWhFQXhKQzBIOEFDRVFERWdMUWYwQUlSQU1Sd3RCL2dBaEVBeEdDMEgvQUNFUURFVUxRWUFCSVJBTVJBdEJnUUVoRUF4REMwR0NBU0VRREVJTFFZTUJJUkFNUVF0QmhBRWhFQXhBQzBHRkFTRVFERDhMUVlZQklSQU1QZ3RCaHdFaEVBdzlDMEdJQVNFUUREd0xRWWtCSVJBTU93dEJpZ0VoRUF3NkMwR0xBU0VRRERrTFFZd0JJUkFNT0F0QmpRRWhFQXczQzBHT0FTRVFERFlMUVk4QklSQU1OUXRCa0FFaEVBdzBDMEdSQVNFUURETUxRWklCSVJBTU1ndEJrd0VoRUF3eEMwR1VBU0VRRERBTFFaVUJJUkFNTHd0QmxnRWhFQXd1QzBHWEFTRVFEQzBMUVpnQklSQU1MQXRCbVFFaEVBd3JDMEdhQVNFUURDb0xRWnNCSVJBTUtRdEJuQUVoRUF3b0MwR2RBU0VRRENjTFFaNEJJUkFNSmd0Qm53RWhFQXdsQzBHZ0FTRVFEQ1FMUWFFQklSQU1Jd3RCb2dFaEVBd2lDMEdqQVNFUURDRUxRYVFCSVJBTUlBdEJwUUVoRUF3ZkMwR21BU0VRREI0TFFhY0JJUkFNSFF0QnFBRWhFQXdjQzBHcEFTRVFEQnNMUWFvQklSQU1HZ3RCcXdFaEVBd1pDMEdzQVNFUURCZ0xRYTBCSVJBTUZ3dEJyZ0VoRUF3V0MwRUJJUkFNRlF0QnJ3RWhFQXdVQzBHd0FTRVFEQk1MUWJFQklSQU1FZ3RCc3dFaEVBd1JDMEd5QVNFUURCQUxRYlFCSVJBTUR3dEJ0UUVoRUF3T0MwRzJBU0VRREEwTFFiY0JJUkFNREF0QnVBRWhFQXdMQzBHNUFTRVFEQW9MUWJvQklSQU1DUXRCdXdFaEVBd0lDMEhHQVNFUURBY0xRYndCSVJBTUJndEJ2UUVoRUF3RkMwRytBU0VRREFRTFFiOEJJUkFNQXd0QndBRWhFQXdDQzBIQ0FTRVFEQUVMUWNFQklSQUxBMEFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBUURzY0JBQUVDQXdRRkJnY0lDUW9MREEwT0R4QVJFaE1VRlJZWEdCa2FHeHdlSHlBaEl5VW9QMEJCUkVWR1IwaEpTa3RNVFU5UVVWSlQzZ05YV1Z0Y1hXQmlaV1puYUdscWEyeHRiM0J4Y25OMGRYWjNlSGw2ZTN4OWZvQUJnZ0dGQVlZQmh3R0pBWXNCakFHTkFZNEJqd0dRQVpFQmxBR1ZBWllCbHdHWUFaa0JtZ0diQVp3Qm5RR2VBWjhCb0FHaEFhSUJvd0drQWFVQnBnR25BYWdCcVFHcUFhc0JyQUd0QWE0QnJ3R3dBYkVCc2dHekFiUUJ0UUcyQWJjQnVBRzVBYm9CdXdHOEFiMEJ2Z0cvQWNBQndRSENBY01CeEFIRkFjWUJ4d0hJQWNrQnlnSExBY3dCelFIT0FjOEIwQUhSQWRJQjB3SFVBZFVCMWdIWEFkZ0IyUUhhQWRzQjNBSGRBZDRCNEFIaEFlSUI0d0hrQWVVQjVnSG5BZWdCNlFIcUFlc0I3QUh0QWU0Qjd3SHdBZkVCOGdIekFaa0NwQUt3QXY0Qy9nSUxJQUVpQkNBQ1J3M3pBVUhkQVNFUURQOERDeUFCSWhBZ0FrY04zUUZCd3dFaEVBeitBd3NnQVNJQklBSkhEWkFCUWZjQUlSQU0vUU1MSUFFaUFTQUNSdzJHQVVIdkFDRVFEUHdEQ3lBQklnRWdBa2NOZjBIcUFDRVFEUHNEQ3lBQklnRWdBa2NOZTBIb0FDRVFEUG9EQ3lBQklnRWdBa2NOZUVIbUFDRVFEUGtEQ3lBQklnRWdBa2NOR2tFWUlSQU0rQU1MSUFFaUFTQUNSdzBVUVJJaEVBejNBd3NnQVNJQklBSkhEVmxCeFFBaEVBejJBd3NnQVNJQklBSkhEVXBCUHlFUURQVURDeUFCSWdFZ0FrY05TRUU4SVJBTTlBTUxJQUVpQVNBQ1J3MUJRVEVoRUF6ekF3c2dBQzBBTGtFQlJnM3JBd3lIQWdzZ0FDQUJJZ0VnQWhEQWdJQ0FBRUVCUnczbUFTQUFRZ0EzQXlBTTV3RUxJQUFnQVNJQklBSVF0SUNBZ0FBaUVBM25BU0FCSVFFTTlRSUxBa0FnQVNJQklBSkhEUUJCQmlFUURQQURDeUFBSUFGQkFXb2lBU0FDRUx1QWdJQUFJaEFONkFFZ0FTRUJEREVMSUFCQ0FEY0RJRUVTSVJBTTFRTUxJQUVpRUNBQ1J3MHJRUjBoRUF6dEF3c0NRQ0FCSWdFZ0FrWU5BQ0FCUVFGcUlRRkJFQ0VRRE5RREMwRUhJUkFNN0FNTElBQkNBQ0FBS1FNZ0loRWdBaUFCSWhCcnJTSVNmU0lUSUJNZ0VWWWJOd01nSUJFZ0VsWWlGRVVONVFGQkNDRVFET3NEQ3dKQUlBRWlBU0FDUmcwQUlBQkJpWUNBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUVVSVJBTTBnTUxRUWtoRUF6cUF3c2dBU0VCSUFBcEF5QlFEZVFCSUFFaEFRenlBZ3NDUUNBQklnRWdBa2NOQUVFTElSQU02UU1MSUFBZ0FVRUJhaUlCSUFJUXRvQ0FnQUFpRUEzbEFTQUJJUUVNOGdJTElBQWdBU0lCSUFJUXVJQ0FnQUFpRUEzbEFTQUJJUUVNOGdJTElBQWdBU0lCSUFJUXVJQ0FnQUFpRUEzbUFTQUJJUUVNRFFzZ0FDQUJJZ0VnQWhDNmdJQ0FBQ0lRRGVjQklBRWhBUXp3QWdzQ1FDQUJJZ0VnQWtjTkFFRVBJUkFNNVFNTElBRXRBQUFpRUVFN1JnMElJQkJCRFVjTjZBRWdBVUVCYWlFQkRPOENDeUFBSUFFaUFTQUNFTHFBZ0lBQUloQU42QUVnQVNFQkRQSUNDd05BQWtBZ0FTMEFBRUh3dFlDQUFHb3RBQUFpRUVFQlJnMEFJQkJCQWtjTjZ3RWdBQ2dDQkNFUUlBQkJBRFlDQkNBQUlCQWdBVUVCYWlJQkVMbUFnSUFBSWhBTjZnRWdBU0VCRFBRQ0N5QUJRUUZxSWdFZ0FrY05BQXRCRWlFUURPSURDeUFBSUFFaUFTQUNFTHFBZ0lBQUloQU42UUVnQVNFQkRBb0xJQUVpQVNBQ1J3MEdRUnNoRUF6Z0F3c0NRQ0FCSWdFZ0FrY05BRUVXSVJBTTRBTUxJQUJCaW9DQWdBQTJBZ2dnQUNBQk5nSUVJQUFnQVNBQ0VMaUFnSUFBSWhBTjZnRWdBU0VCUVNBaEVBekdBd3NDUUNBQklnRWdBa1lOQUFOQUFrQWdBUzBBQUVId3Q0Q0FBR290QUFBaUVFRUNSZzBBQWtBZ0VFRi9hZzRFNVFIc0FRRHJBZXdCQ3lBQlFRRnFJUUZCQ0NFUURNZ0RDeUFCUVFGcUlnRWdBa2NOQUF0QkZTRVFETjhEQzBFVklSQU0zZ01MQTBBQ1FDQUJMUUFBUWZDNWdJQUFhaTBBQUNJUVFRSkdEUUFnRUVGL2FnNEUzZ0hzQWVBQjZ3SHNBUXNnQVVFQmFpSUJJQUpIRFFBTFFSZ2hFQXpkQXdzQ1FDQUJJZ0VnQWtZTkFDQUFRWXVBZ0lBQU5nSUlJQUFnQVRZQ0JDQUJJUUZCQnlFUURNUURDMEVaSVJBTTNBTUxJQUZCQVdvaEFRd0NDd0pBSUFFaUZDQUNSdzBBUVJvaEVBemJBd3NnRkNFQkFrQWdGQzBBQUVGemFnNFUzUUx1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0lBN2dJTFFRQWhFQ0FBUVFBMkFod2dBRUd2aTRDQUFEWUNFQ0FBUVFJMkFnd2dBQ0FVUVFGcU5nSVVETm9EQ3dKQUlBRXRBQUFpRUVFN1JnMEFJQkJCRFVjTjZBRWdBVUVCYWlFQkRPVUNDeUFCUVFGcUlRRUxRU0loRUF5L0F3c0NRQ0FCSWhBZ0FrY05BRUVjSVJBTTJBTUxRZ0FoRVNBUUlRRWdFQzBBQUVGUWFnNDM1d0htQVFFQ0F3UUZCZ2NJQUFBQUFBQUFBQWtLQ3d3TkRnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR4QVJFaE1VQUF0QkhpRVFETDBEQzBJQ0lSRU01UUVMUWdNaEVRemtBUXRDQkNFUkRPTUJDMElGSVJFTTRnRUxRZ1loRVF6aEFRdENCeUVSRE9BQkMwSUlJUkVNM3dFTFFna2hFUXplQVF0Q0NpRVJETjBCQzBJTElSRU0zQUVMUWd3aEVRemJBUXRDRFNFUkROb0JDMElPSVJFTTJRRUxRZzhoRVF6WUFRdENDaUVSRE5jQkMwSUxJUkVNMWdFTFFnd2hFUXpWQVF0Q0RTRVJETlFCQzBJT0lSRU0wd0VMUWc4aEVRelNBUXRDQUNFUkFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FRTFFBQVFWQnFEamZsQWVRQkFBRUNBd1FGQmdmbUFlWUI1Z0htQWVZQjVnSG1BUWdKQ2dzTURlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdFT0R4QVJFaFBtQVF0Q0FpRVJET1FCQzBJRElSRU00d0VMUWdRaEVRemlBUXRDQlNFUkRPRUJDMElHSVJFTTRBRUxRZ2NoRVF6ZkFRdENDQ0VSRE40QkMwSUpJUkVNM1FFTFFnb2hFUXpjQVF0Q0N5RVJETnNCQzBJTUlSRU0yZ0VMUWcwaEVRelpBUXRDRGlFUkROZ0JDMElQSVJFTTF3RUxRZ29oRVF6V0FRdENDeUVSRE5VQkMwSU1JUkVNMUFFTFFnMGhFUXpUQVF0Q0RpRVJETklCQzBJUElSRU0wUUVMSUFCQ0FDQUFLUU1nSWhFZ0FpQUJJaEJyclNJU2ZTSVRJQk1nRVZZYk53TWdJQkVnRWxZaUZFVU4wZ0ZCSHlFUURNQURDd0pBSUFFaUFTQUNSZzBBSUFCQmlZQ0FnQUEyQWdnZ0FDQUJOZ0lFSUFFaEFVRWtJUkFNcHdNTFFTQWhFQXkvQXdzZ0FDQUJJaEFnQWhDK2dJQ0FBRUYvYWc0RnRnRUF4UUlCMFFIU0FRdEJFU0VRREtRREN5QUFRUUU2QUM4Z0VDRUJETHNEQ3lBQklnRWdBa2NOMGdGQkpDRVFETHNEQ3lBQklnMGdBa2NOSGtIR0FDRVFETG9EQ3lBQUlBRWlBU0FDRUxLQWdJQUFJaEFOMUFFZ0FTRUJETFVCQ3lBQkloQWdBa2NOSmtIUUFDRVFETGdEQ3dKQUlBRWlBU0FDUncwQVFTZ2hFQXk0QXdzZ0FFRUFOZ0lFSUFCQmpJQ0FnQUEyQWdnZ0FDQUJJQUVRc1lDQWdBQWlFQTNUQVNBQklRRU0yQUVMQWtBZ0FTSVFJQUpIRFFCQktTRVFETGNEQ3lBUUxRQUFJZ0ZCSUVZTkZDQUJRUWxIRGRNQklCQkJBV29oQVF3VkN3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFRd1hDMEVxSVJBTXRRTUxBa0FnQVNJUUlBSkhEUUJCS3lFUURMVURDd0pBSUJBdEFBQWlBVUVKUmcwQUlBRkJJRWNOMVFFTElBQXRBQ3hCQ0VZTjB3RWdFQ0VCREpFREN3SkFJQUVpQVNBQ1J3MEFRU3doRUF5MEF3c2dBUzBBQUVFS1J3M1ZBU0FCUVFGcUlRRU15UUlMSUFFaURpQUNSdzNWQVVFdklSQU1zZ01MQTBBQ1FDQUJMUUFBSWhCQklFWU5BQUpBSUJCQmRtb09CQURjQWR3QkFOb0JDeUFCSVFFTTRBRUxJQUZCQVdvaUFTQUNSdzBBQzBFeElSQU1zUU1MUVRJaEVDQUJJaFFnQWtZTnNBTWdBaUFVYXlBQUtBSUFJZ0ZxSVJVZ0ZDQUJhMEVEYWlFV0FrQURRQ0FVTFFBQUloZEJJSElnRnlBWFFiOS9ha0gvQVhGQkdra2JRZjhCY1NBQlFmQzdnSUFBYWkwQUFFY05BUUpBSUFGQkEwY05BRUVHSVFFTWxnTUxJQUZCQVdvaEFTQVVRUUZxSWhRZ0FrY05BQXNnQUNBVk5nSUFETEVEQ3lBQVFRQTJBZ0FnRkNFQkROa0JDMEV6SVJBZ0FTSVVJQUpHRGE4RElBSWdGR3NnQUNnQ0FDSUJhaUVWSUJRZ0FXdEJDR29oRmdKQUEwQWdGQzBBQUNJWFFTQnlJQmNnRjBHL2YycEIvd0Z4UVJwSkcwSC9BWEVnQVVIMHU0Q0FBR290QUFCSERRRUNRQ0FCUVFoSERRQkJCU0VCREpVREN5QUJRUUZxSVFFZ0ZFRUJhaUlVSUFKSERRQUxJQUFnRlRZQ0FBeXdBd3NnQUVFQU5nSUFJQlFoQVF6WUFRdEJOQ0VRSUFFaUZDQUNSZzJ1QXlBQ0lCUnJJQUFvQWdBaUFXb2hGU0FVSUFGclFRVnFJUllDUUFOQUlCUXRBQUFpRjBFZ2NpQVhJQmRCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCME1LQWdBQnFMUUFBUncwQkFrQWdBVUVGUncwQVFRY2hBUXlVQXdzZ0FVRUJhaUVCSUJSQkFXb2lGQ0FDUncwQUN5QUFJQlUyQWdBTXJ3TUxJQUJCQURZQ0FDQVVJUUVNMXdFTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQkJnTDZBZ0FCcUxRQUFJaEJCQVVZTkFDQVFRUUpHRFFvZ0FTRUJETjBCQ3lBQlFRRnFJZ0VnQWtjTkFBdEJNQ0VRREs0REMwRXdJUkFNclFNTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQWlFRUVnUmcwQUlCQkJkbW9PQk5rQjJnSGFBZGtCMmdFTElBRkJBV29pQVNBQ1J3MEFDMEU0SVJBTXJRTUxRVGdoRUF5c0F3c0RRQUpBSUFFdEFBQWlFRUVnUmcwQUlCQkJDVWNOQXdzZ0FVRUJhaUlCSUFKSERRQUxRVHdoRUF5ckF3c0RRQUpBSUFFdEFBQWlFRUVnUmcwQUFrQUNRQ0FRUVhacURnVGFBUUVCMmdFQUN5QVFRU3hHRGRzQkN5QUJJUUVNQkFzZ0FVRUJhaUlCSUFKSERRQUxRVDhoRUF5cUF3c2dBU0VCRE5zQkMwSEFBQ0VRSUFFaUZDQUNSZzJvQXlBQ0lCUnJJQUFvQWdBaUFXb2hGaUFVSUFGclFRWnFJUmNDUUFOQUlCUXRBQUJCSUhJZ0FVR0F3SUNBQUdvdEFBQkhEUUVnQVVFR1JnMk9BeUFCUVFGcUlRRWdGRUVCYWlJVUlBSkhEUUFMSUFBZ0ZqWUNBQXlwQXdzZ0FFRUFOZ0lBSUJRaEFRdEJOaUVRREk0REN3SkFJQUVpRHlBQ1J3MEFRY0VBSVJBTXB3TUxJQUJCaklDQWdBQTJBZ2dnQUNBUE5nSUVJQThoQVNBQUxRQXNRWDlxRGdUTkFkVUIxd0haQVljREN5QUJRUUZxSVFFTXpBRUxBa0FnQVNJQklBSkdEUUFEUUFKQUlBRXRBQUFpRUVFZ2NpQVFJQkJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJaEJCQ1VZTkFDQVFRU0JHRFFBQ1FBSkFBa0FDUUNBUVFaMS9hZzRUQUFNREF3TURBd01CQXdNREF3TURBd01EQWdNTElBRkJBV29oQVVFeElSQU1rUU1MSUFGQkFXb2hBVUV5SVJBTWtBTUxJQUZCQVdvaEFVRXpJUkFNandNTElBRWhBUXpRQVFzZ0FVRUJhaUlCSUFKSERRQUxRVFVoRUF5bEF3dEJOU0VRREtRREN3SkFJQUVpQVNBQ1JnMEFBMEFDUUNBQkxRQUFRWUM4Z0lBQWFpMEFBRUVCUmcwQUlBRWhBUXpUQVFzZ0FVRUJhaUlCSUFKSERRQUxRVDBoRUF5a0F3dEJQU0VRREtNREN5QUFJQUVpQVNBQ0VMQ0FnSUFBSWhBTjFnRWdBU0VCREFFTElCQkJBV29oQVF0QlBDRVFESWNEQ3dKQUlBRWlBU0FDUncwQVFjSUFJUkFNb0FNTEFrQURRQUpBSUFFdEFBQkJkMm9PR0FBQy9nTCtBb1FEL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDQVA0Q0N5QUJRUUZxSWdFZ0FrY05BQXRCd2dBaEVBeWdBd3NnQVVFQmFpRUJJQUF0QUMxQkFYRkZEYjBCSUFFaEFRdEJMQ0VRRElVREN5QUJJZ0VnQWtjTjB3RkJ4QUFoRUF5ZEF3c0RRQUpBSUFFdEFBQkJrTUNBZ0FCcUxRQUFRUUZHRFFBZ0FTRUJETGNDQ3lBQlFRRnFJZ0VnQWtjTkFBdEJ4UUFoRUF5Y0F3c2dEUzBBQUNJUVFTQkdEYk1CSUJCQk9rY05nUU1nQUNnQ0JDRUJJQUJCQURZQ0JDQUFJQUVnRFJDdmdJQ0FBQ0lCRGRBQklBMUJBV29oQVF5ekFndEJ4d0FoRUNBQklnMGdBa1lObWdNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRUZhaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdRd29DQUFHb3RBQUJIRFlBRElBRkJCVVlOOUFJZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTW1nTUxRY2dBSVJBZ0FTSU5JQUpHRFprRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJDV29oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCbHNLQWdBQnFMUUFBUnczL0FnSkFJQUZCQ1VjTkFFRUNJUUVNOVFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKa0RDd0pBSUFFaURTQUNSdzBBUWNrQUlSQU1tUU1MQWtBQ1FDQU5MUUFBSWdGQklISWdBU0FCUWI5L2FrSC9BWEZCR2trYlFmOEJjVUdTZjJvT0J3Q0FBNEFEZ0FPQUE0QURBWUFEQ3lBTlFRRnFJUUZCUGlFUURJQURDeUFOUVFGcUlRRkJQeUVRRFA4Q0MwSEtBQ0VRSUFFaURTQUNSZzJYQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRRnFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRYURDZ0lBQWFpMEFBRWNOL1FJZ0FVRUJSZzN3QWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5WEF3dEJ5d0FoRUNBQklnMGdBa1lObGdNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRU9haUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdpd29DQUFHb3RBQUJIRGZ3Q0lBRkJEa1lOOEFJZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTWxnTUxRY3dBSVJBZ0FTSU5JQUpHRFpVRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJEMm9oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCd01LQWdBQnFMUUFBUnczN0FnSkFJQUZCRDBjTkFFRURJUUVNOFFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKVURDMEhOQUNFUUlBRWlEU0FDUmcyVUF5QUNJQTFySUFBb0FnQWlBV29oRmlBTklBRnJRUVZxSVJjRFFDQU5MUUFBSWhSQklISWdGQ0FVUWI5L2FrSC9BWEZCR2trYlFmOEJjU0FCUWREQ2dJQUFhaTBBQUVjTitnSUNRQ0FCUVFWSERRQkJCQ0VCRFBBQ0N5QUJRUUZxSVFFZ0RVRUJhaUlOSUFKSERRQUxJQUFnRmpZQ0FBeVVBd3NDUUNBQklnMGdBa2NOQUVIT0FDRVFESlFEQ3dKQUFrQUNRQUpBSUEwdEFBQWlBVUVnY2lBQklBRkJ2MzlxUWY4QmNVRWFTUnRCL3dGeFFaMS9hZzRUQVAwQy9RTDlBdjBDL1FMOUF2MEMvUUw5QXYwQy9RTDlBZ0g5QXYwQy9RSUNBLzBDQ3lBTlFRRnFJUUZCd1FBaEVBejlBZ3NnRFVFQmFpRUJRY0lBSVJBTS9BSUxJQTFCQVdvaEFVSERBQ0VRRFBzQ0N5QU5RUUZxSVFGQnhBQWhFQXo2QWdzQ1FDQUJJZ0VnQWtZTkFDQUFRWTJBZ0lBQU5nSUlJQUFnQVRZQ0JDQUJJUUZCeFFBaEVBejZBZ3RCendBaEVBeVNBd3NnRUNFQkFrQUNRQ0FRTFFBQVFYWnFEZ1FCcUFLb0FnQ29BZ3NnRUVFQmFpRUJDMEVuSVJBTStBSUxBa0FnQVNJQklBSkhEUUJCMFFBaEVBeVJBd3NDUUNBQkxRQUFRU0JHRFFBZ0FTRUJESTBCQ3lBQlFRRnFJUUVnQUMwQUxVRUJjVVVOeHdFZ0FTRUJESXdCQ3lBQkloY2dBa2NOeUFGQjBnQWhFQXlQQXd0QjB3QWhFQ0FCSWhRZ0FrWU5qZ01nQWlBVWF5QUFLQUlBSWdGcUlSWWdGQ0FCYTBFQmFpRVhBMEFnRkMwQUFDQUJRZGJDZ0lBQWFpMEFBRWNOekFFZ0FVRUJSZzNIQVNBQlFRRnFJUUVnRkVFQmFpSVVJQUpIRFFBTElBQWdGallDQUF5T0F3c0NRQ0FCSWdFZ0FrY05BRUhWQUNFUURJNERDeUFCTFFBQVFRcEhEY3dCSUFGQkFXb2hBUXpIQVFzQ1FDQUJJZ0VnQWtjTkFFSFdBQ0VRREkwREN3SkFBa0FnQVMwQUFFRjJhZzRFQU0wQnpRRUJ6UUVMSUFGQkFXb2hBUXpIQVFzZ0FVRUJhaUVCUWNvQUlSQU04d0lMSUFBZ0FTSUJJQUlRcm9DQWdBQWlFQTNMQVNBQklRRkJ6UUFoRUF6eUFnc2dBQzBBS1VFaVJnMkZBd3ltQWdzQ1FDQUJJZ0VnQWtjTkFFSGJBQ0VRRElvREMwRUFJUlJCQVNFWFFRRWhGa0VBSVJBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FTMEFBRUZRYWc0SzFBSFRBUUFCQWdNRUJRWUkxUUVMUVFJaEVBd0dDMEVESVJBTUJRdEJCQ0VRREFRTFFRVWhFQXdEQzBFR0lSQU1BZ3RCQnlFUURBRUxRUWdoRUF0QkFDRVhRUUFoRmtFQUlSUU16QUVMUVFraEVFRUJJUlJCQUNFWFFRQWhGZ3pMQVFzQ1FDQUJJZ0VnQWtjTkFFSGRBQ0VRRElrREN5QUJMUUFBUVM1SERjd0JJQUZCQVdvaEFReW1BZ3NnQVNJQklBSkhEY3dCUWQ4QUlSQU1od01MQWtBZ0FTSUJJQUpHRFFBZ0FFR09nSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJRZEFBSVJBTTdnSUxRZUFBSVJBTWhnTUxRZUVBSVJBZ0FTSUJJQUpHRFlVRElBSWdBV3NnQUNnQ0FDSVVhaUVXSUFFZ0ZHdEJBMm9oRndOQUlBRXRBQUFnRkVIaXdvQ0FBR290QUFCSERjMEJJQlJCQTBZTnpBRWdGRUVCYWlFVUlBRkJBV29pQVNBQ1J3MEFDeUFBSUJZMkFnQU1oUU1MUWVJQUlSQWdBU0lCSUFKR0RZUURJQUlnQVdzZ0FDZ0NBQ0lVYWlFV0lBRWdGR3RCQW1vaEZ3TkFJQUV0QUFBZ0ZFSG13b0NBQUdvdEFBQkhEY3dCSUJSQkFrWU56Z0VnRkVFQmFpRVVJQUZCQVdvaUFTQUNSdzBBQ3lBQUlCWTJBZ0FNaEFNTFFlTUFJUkFnQVNJQklBSkdEWU1ESUFJZ0FXc2dBQ2dDQUNJVWFpRVdJQUVnRkd0QkEyb2hGd05BSUFFdEFBQWdGRUhwd29DQUFHb3RBQUJIRGNzQklCUkJBMFlOemdFZ0ZFRUJhaUVVSUFGQkFXb2lBU0FDUncwQUN5QUFJQlkyQWdBTWd3TUxBa0FnQVNJQklBSkhEUUJCNVFBaEVBeURBd3NnQUNBQlFRRnFJZ0VnQWhDb2dJQ0FBQ0lRRGMwQklBRWhBVUhXQUNFUURPa0NDd0pBSUFFaUFTQUNSZzBBQTBBQ1FDQUJMUUFBSWhCQklFWU5BQUpBQWtBQ1FDQVFRYmgvYWc0TEFBSFBBYzhCendIUEFjOEJ6d0hQQWM4QkFzOEJDeUFCUVFGcUlRRkIwZ0FoRUF6dEFnc2dBVUVCYWlFQlFkTUFJUkFNN0FJTElBRkJBV29oQVVIVUFDRVFET3NDQ3lBQlFRRnFJZ0VnQWtjTkFBdEI1QUFoRUF5Q0F3dEI1QUFoRUF5QkF3c0RRQUpBSUFFdEFBQkI4TUtBZ0FCcUxRQUFJaEJCQVVZTkFDQVFRWDVxRGdQUEFkQUIwUUhTQVFzZ0FVRUJhaUlCSUFKSERRQUxRZVlBSVJBTWdBTUxBa0FnQVNJQklBSkdEUUFnQVVFQmFpRUJEQU1MUWVjQUlSQU0vd0lMQTBBQ1FDQUJMUUFBUWZERWdJQUFhaTBBQUNJUVFRRkdEUUFDUUNBUVFYNXFEZ1RTQWRNQjFBRUExUUVMSUFFaEFVSFhBQ0VRRE9jQ0N5QUJRUUZxSWdFZ0FrY05BQXRCNkFBaEVBeitBZ3NDUUNBQklnRWdBa2NOQUVIcEFDRVFEUDRDQ3dKQUlBRXRBQUFpRUVGMmFnNGF1Z0hWQWRVQnZBSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSEtBZFVCMVFFQTB3RUxJQUZCQVdvaEFRdEJCaUVRRE9NQ0N3TkFBa0FnQVMwQUFFSHd4b0NBQUdvdEFBQkJBVVlOQUNBQklRRU1uZ0lMSUFGQkFXb2lBU0FDUncwQUMwSHFBQ0VRRFBzQ0N3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFRd0RDMEhyQUNFUURQb0NDd0pBSUFFaUFTQUNSdzBBUWV3QUlSQU0rZ0lMSUFGQkFXb2hBUXdCQ3dKQUlBRWlBU0FDUncwQVFlMEFJUkFNK1FJTElBRkJBV29oQVF0QkJDRVFETjRDQ3dKQUlBRWlGQ0FDUncwQVFlNEFJUkFNOXdJTElCUWhBUUpBQWtBQ1FDQVVMUUFBUWZESWdJQUFhaTBBQUVGL2FnNEgxQUhWQWRZQkFKd0NBUUxYQVFzZ0ZFRUJhaUVCREFvTElCUkJBV29oQVF6TkFRdEJBQ0VRSUFCQkFEWUNIQ0FBUVp1U2dJQUFOZ0lRSUFCQkJ6WUNEQ0FBSUJSQkFXbzJBaFFNOWdJTEFrQURRQUpBSUFFdEFBQkI4TWlBZ0FCcUxRQUFJaEJCQkVZTkFBSkFBa0FnRUVGL2FnNEgwZ0hUQWRRQjJRRUFCQUhaQVFzZ0FTRUJRZG9BSVJBTTRBSUxJQUZCQVdvaEFVSGNBQ0VRRE44Q0N5QUJRUUZxSWdFZ0FrY05BQXRCN3dBaEVBejJBZ3NnQVVFQmFpRUJETXNCQ3dKQUlBRWlGQ0FDUncwQVFmQUFJUkFNOVFJTElCUXRBQUJCTDBjTjFBRWdGRUVCYWlFQkRBWUxBa0FnQVNJVUlBSkhEUUJCOFFBaEVBejBBZ3NDUUNBVUxRQUFJZ0ZCTDBjTkFDQVVRUUZxSVFGQjNRQWhFQXpiQWdzZ0FVRjJhaUlFUVJaTERkTUJRUUVnQkhSQmlZQ0FBbkZGRGRNQkRNb0NDd0pBSUFFaUFTQUNSZzBBSUFGQkFXb2hBVUhlQUNFUUROb0NDMEh5QUNFUURQSUNDd0pBSUFFaUZDQUNSdzBBUWZRQUlSQU04Z0lMSUJRaEFRSkFJQlF0QUFCQjhNeUFnQUJxTFFBQVFYOXFEZ1BKQXBRQ0FOUUJDMEhoQUNFUUROZ0NDd0pBSUFFaUZDQUNSZzBBQTBBQ1FDQVVMUUFBUWZES2dJQUFhaTBBQUNJQlFRTkdEUUFDUUNBQlFYOXFEZ0xMQWdEVkFRc2dGQ0VCUWQ4QUlSQU0yZ0lMSUJSQkFXb2lGQ0FDUncwQUMwSHpBQ0VRRFBFQ0MwSHpBQ0VRRFBBQ0N3SkFJQUVpQVNBQ1JnMEFJQUJCajRDQWdBQTJBZ2dnQUNBQk5nSUVJQUVoQVVIZ0FDRVFETmNDQzBIMUFDRVFETzhDQ3dKQUlBRWlBU0FDUncwQVFmWUFJUkFNN3dJTElBQkJqNENBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBUXRCQXlFUUROUUNDd05BSUFFdEFBQkJJRWNOd3dJZ0FVRUJhaUlCSUFKSERRQUxRZmNBSVJBTTdBSUxBa0FnQVNJQklBSkhEUUJCK0FBaEVBenNBZ3NnQVMwQUFFRWdSdzNPQVNBQlFRRnFJUUVNN3dFTElBQWdBU0lCSUFJUXJJQ0FnQUFpRUEzT0FTQUJJUUVNamdJTEFrQWdBU0lFSUFKSERRQkIrZ0FoRUF6cUFnc2dCQzBBQUVITUFFY04wUUVnQkVFQmFpRUJRUk1oRUF6UEFRc0NRQ0FCSWdRZ0FrY05BRUg3QUNFUURPa0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFWcUlSQURRQ0FFTFFBQUlBRkI4TTZBZ0FCcUxRQUFSdzNRQVNBQlFRVkdEYzRCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWZzQUlSQU02QUlMQWtBZ0FTSUVJQUpIRFFCQi9BQWhFQXpvQWdzQ1FBSkFJQVF0QUFCQnZYOXFEZ3dBMFFIUkFkRUIwUUhSQWRFQjBRSFJBZEVCMFFFQjBRRUxJQVJCQVdvaEFVSG1BQ0VRRE04Q0N5QUVRUUZxSVFGQjV3QWhFQXpPQWdzQ1FDQUJJZ1FnQWtjTkFFSDlBQ0VRRE9jQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSHR6NENBQUdvdEFBQkhEYzhCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUg5QUNFUURPY0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFSQWhFQXpNQVFzQ1FDQUJJZ1FnQWtjTkFFSCtBQ0VRRE9ZQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUVZxSVJBQ1FBTkFJQVF0QUFBZ0FVSDJ6b0NBQUdvdEFBQkhEYzRCSUFGQkJVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUgrQUNFUURPWUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFSWWhFQXpMQVFzQ1FDQUJJZ1FnQWtjTkFFSC9BQ0VRRE9VQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUU5xSVJBQ1FBTkFJQVF0QUFBZ0FVSDh6b0NBQUdvdEFBQkhEYzBCSUFGQkEwWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUgvQUNFUURPVUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFRVWhFQXpLQVFzQ1FDQUJJZ1FnQWtjTkFFR0FBU0VRRE9RQ0N5QUVMUUFBUWRrQVJ3M0xBU0FFUVFGcUlRRkJDQ0VRRE1rQkN3SkFJQUVpQkNBQ1J3MEFRWUVCSVJBTTR3SUxBa0FDUUNBRUxRQUFRYkovYWc0REFNd0JBY3dCQ3lBRVFRRnFJUUZCNndBaEVBektBZ3NnQkVFQmFpRUJRZXdBSVJBTXlRSUxBa0FnQVNJRUlBSkhEUUJCZ2dFaEVBemlBZ3NDUUFKQUlBUXRBQUJCdUg5cURnZ0F5d0hMQWNzQnl3SExBY3NCQWNzQkN5QUVRUUZxSVFGQjZnQWhFQXpKQWdzZ0JFRUJhaUVCUWUwQUlSQU15QUlMQWtBZ0FTSUVJQUpIRFFCQmd3RWhFQXpoQWdzZ0FpQUVheUFBS0FJQUlnRnFJUkFnQkNBQmEwRUNhaUVVQWtBRFFDQUVMUUFBSUFGQmdNK0FnQUJxTFFBQVJ3M0pBU0FCUVFKR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJBMkFnQkJnd0VoRUF6aEFndEJBQ0VRSUFCQkFEWUNBQ0FVUVFGcUlRRU14Z0VMQWtBZ0FTSUVJQUpIRFFCQmhBRWhFQXpnQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQmc4K0FnQUJxTFFBQVJ3M0lBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJoQUVoRUF6Z0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFaklSQU14UUVMQWtBZ0FTSUVJQUpIRFFCQmhRRWhFQXpmQWdzQ1FBSkFJQVF0QUFCQnRIOXFEZ2dBeUFISUFjZ0J5QUhJQWNnQkFjZ0JDeUFFUVFGcUlRRkI3d0FoRUF6R0Fnc2dCRUVCYWlFQlFmQUFJUkFNeFFJTEFrQWdBU0lFSUFKSERRQkJoZ0VoRUF6ZUFnc2dCQzBBQUVIRkFFY054UUVnQkVFQmFpRUJESU1DQ3dKQUlBRWlCQ0FDUncwQVFZY0JJUkFNM1FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBMm9oRUFKQUEwQWdCQzBBQUNBQlFZalBnSUFBYWkwQUFFY054UUVnQVVFRFJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWWNCSVJBTTNRSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkxTRVFETUlCQ3dKQUlBRWlCQ0FDUncwQVFZZ0JJUkFNM0FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJDR29oRUFKQUEwQWdCQzBBQUNBQlFkRFBnSUFBYWkwQUFFY054QUVnQVVFSVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWWdCSVJBTTNBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQktTRVFETUVCQ3dKQUlBRWlBU0FDUncwQVFZa0JJUkFNMndJTFFRRWhFQ0FCTFFBQVFkOEFSdzNBQVNBQlFRRnFJUUVNZ1FJTEFrQWdBU0lFSUFKSERRQkJpZ0VoRUF6YUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVCYWlFUUEwQWdCQzBBQUNBQlFZelBnSUFBYWkwQUFFY053UUVnQVVFQlJnMnZBaUFCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdLQVNFUUROa0NDd0pBSUFFaUJDQUNSdzBBUVlzQklSQU0yUUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUVk3UGdJQUFhaTBBQUVjTndRRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZc0JJUkFNMlFJTElBQkJBRFlDQUNBUVFRRnFJUUZCQWlFUURMNEJDd0pBSUFFaUJDQUNSdzBBUVl3QklSQU0yQUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZEUGdJQUFhaTBBQUVjTndBRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZd0JJUkFNMkFJTElBQkJBRFlDQUNBUVFRRnFJUUZCSHlFUURMMEJDd0pBSUFFaUJDQUNSdzBBUVkwQklSQU0xd0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZMUGdJQUFhaTBBQUVjTnZ3RWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZMEJJUkFNMXdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQ1NFUURMd0JDd0pBSUFFaUJDQUNSdzBBUVk0QklSQU0xZ0lMQWtBQ1FDQUVMUUFBUWJkL2FnNEhBTDhCdndHL0FiOEJ2d0VCdndFTElBUkJBV29oQVVINEFDRVFETDBDQ3lBRVFRRnFJUUZCK1FBaEVBeThBZ3NDUUNBQklnUWdBa2NOQUVHUEFTRVFETlVDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHUno0Q0FBR290QUFCSERiMEJJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1BBU0VRRE5VQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJnaEVBeTZBUXNDUUNBQklnUWdBa2NOQUVHUUFTRVFETlFDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRSnFJUkFDUUFOQUlBUXRBQUFnQVVHWHo0Q0FBR290QUFCSERid0JJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1FBU0VRRE5RQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJjaEVBeTVBUXNDUUNBQklnUWdBa2NOQUVHUkFTRVFETk1DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRWnFJUkFDUUFOQUlBUXRBQUFnQVVHYXo0Q0FBR290QUFCSERic0JJQUZCQmtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1JBU0VRRE5NQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJVaEVBeTRBUXNDUUNBQklnUWdBa2NOQUVHU0FTRVFETklDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHaHo0Q0FBR290QUFCSERib0JJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1NBU0VRRE5JQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVI0aEVBeTNBUXNDUUNBQklnUWdBa2NOQUVHVEFTRVFETkVDQ3lBRUxRQUFRY3dBUncyNEFTQUVRUUZxSVFGQkNpRVFETFlCQ3dKQUlBUWdBa2NOQUVHVUFTRVFETkFDQ3dKQUFrQWdCQzBBQUVHL2Yyb09Ed0M1QWJrQnVRRzVBYmtCdVFHNUFia0J1UUc1QWJrQnVRRzVBUUc1QVFzZ0JFRUJhaUVCUWY0QUlSQU10d0lMSUFSQkFXb2hBVUgvQUNFUURMWUNDd0pBSUFRZ0FrY05BRUdWQVNFUURNOENDd0pBQWtBZ0JDMEFBRUcvZjJvT0F3QzRBUUc0QVFzZ0JFRUJhaUVCUWYwQUlSQU10Z0lMSUFSQkFXb2hCRUdBQVNFUURMVUNDd0pBSUFRZ0FrY05BRUdXQVNFUURNNENDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFGcUlSQUNRQU5BSUFRdEFBQWdBVUduejRDQUFHb3RBQUJIRGJZQklBRkJBVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHV0FTRVFETTRDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUXNoRUF5ekFRc0NRQ0FFSUFKSERRQkJsd0VoRUF6TkFnc0NRQUpBQWtBQ1FDQUVMUUFBUVZOcURpTUF1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBUUc0QWJnQnVBRzRBYmdCQXJnQnVBRzRBUU80QVFzZ0JFRUJhaUVCUWZzQUlSQU10Z0lMSUFSQkFXb2hBVUg4QUNFUURMVUNDeUFFUVFGcUlRUkJnUUVoRUF5MEFnc2dCRUVCYWlFRVFZSUJJUkFNc3dJTEFrQWdCQ0FDUncwQVFaZ0JJUkFNekFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCR29oRUFKQUEwQWdCQzBBQUNBQlFhblBnSUFBYWkwQUFFY050QUVnQVVFRVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWmdCSVJBTXpBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkdTRVFETEVCQ3dKQUlBUWdBa2NOQUVHWkFTRVFETXNDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHdXo0Q0FBR290QUFCSERiTUJJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1pBU0VRRE1zQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVFZaEVBeXdBUXNDUUNBRUlBSkhEUUJCbWdFaEVBektBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCdE0rQWdBQnFMUUFBUncyeUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQm1nRWhFQXpLQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVjSVJBTXJ3RUxBa0FnQkNBQ1J3MEFRWnNCSVJBTXlRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRYmJQZ0lBQWFpMEFBRWNOc1FFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVpzQklSQU15UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJKeUVRREs0QkN3SkFJQVFnQWtjTkFFR2NBU0VRRE1nQ0N3SkFBa0FnQkMwQUFFR3NmMm9PQWdBQnNRRUxJQVJCQVdvaEJFR0dBU0VRREs4Q0N5QUVRUUZxSVFSQmh3RWhFQXl1QWdzQ1FDQUVJQUpIRFFCQm5RRWhFQXpIQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQWtBRFFDQUVMUUFBSUFGQnVNK0FnQUJxTFFBQVJ3MnZBU0FCUVFGR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJuUUVoRUF6SEFnc2dBRUVBTmdJQUlCQkJBV29oQVVFbUlSQU1yQUVMQWtBZ0JDQUNSdzBBUVo0QklSQU14Z0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWJyUGdJQUFhaTBBQUVjTnJnRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaNEJJUkFNeGdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQXlFUURLc0JDd0pBSUFRZ0FrY05BRUdmQVNFUURNVUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUh0ejRDQUFHb3RBQUJIRGEwQklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHZkFTRVFETVVDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUXdoRUF5cUFRc0NRQ0FFSUFKSERRQkJvQUVoRUF6RUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVEYWlFUUFrQURRQ0FFTFFBQUlBRkJ2TStBZ0FCcUxRQUFSdzJzQVNBQlFRTkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCb0FFaEVBekVBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRU5JUkFNcVFFTEFrQWdCQ0FDUncwQVFhRUJJUkFNd3dJTEFrQUNRQ0FFTFFBQVFicC9hZzRMQUt3QnJBR3NBYXdCckFHc0Fhd0JyQUdzQVFHc0FRc2dCRUVCYWlFRVFZc0JJUkFNcWdJTElBUkJBV29oQkVHTUFTRVFES2tDQ3dKQUlBUWdBa2NOQUVHaUFTRVFETUlDQ3lBRUxRQUFRZEFBUncycEFTQUVRUUZxSVFRTTZRRUxBa0FnQkNBQ1J3MEFRYU1CSVJBTXdRSUxBa0FDUUNBRUxRQUFRYmQvYWc0SEFhb0JxZ0dxQWFvQnFnRUFxZ0VMSUFSQkFXb2hCRUdPQVNFUURLZ0NDeUFFUVFGcUlRRkJJaUVRREtZQkN3SkFJQVFnQWtjTkFFR2tBU0VRRE1BQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUZxSVJBQ1FBTkFJQVF0QUFBZ0FVSEF6NENBQUdvdEFBQkhEYWdCSUFGQkFVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdrQVNFUURNQUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFSMGhFQXlsQVFzQ1FDQUVJQUpIRFFCQnBRRWhFQXkvQWdzQ1FBSkFJQVF0QUFCQnJuOXFEZ01BcUFFQnFBRUxJQVJCQVdvaEJFR1FBU0VRREtZQ0N5QUVRUUZxSVFGQkJDRVFES1FCQ3dKQUlBUWdBa2NOQUVHbUFTRVFETDRDQ3dKQUFrQUNRQUpBQWtBZ0JDMEFBRUcvZjJvT0ZRQ3FBYW9CcWdHcUFhb0JxZ0dxQWFvQnFnR3FBUUdxQWFvQkFxb0JxZ0VEcWdHcUFRU3FBUXNnQkVFQmFpRUVRWWdCSVJBTXFBSUxJQVJCQVdvaEJFR0pBU0VRREtjQ0N5QUVRUUZxSVFSQmlnRWhFQXltQWdzZ0JFRUJhaUVFUVk4QklSQU1wUUlMSUFSQkFXb2hCRUdSQVNFUURLUUNDd0pBSUFRZ0FrY05BRUduQVNFUURMMENDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUh0ejRDQUFHb3RBQUJIRGFVQklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHbkFTRVFETDBDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUkVoRUF5aUFRc0NRQ0FFSUFKSERRQkJxQUVoRUF5OEFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVDYWlFUUFrQURRQ0FFTFFBQUlBRkJ3cytBZ0FCcUxRQUFSdzJrQVNBQlFRSkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCcUFFaEVBeThBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRXNJUkFNb1FFTEFrQWdCQ0FDUncwQVFha0JJUkFNdXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCR29oRUFKQUEwQWdCQzBBQUNBQlFjWFBnSUFBYWkwQUFFY05vd0VnQVVFRVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYWtCSVJBTXV3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQkt5RVFES0FCQ3dKQUlBUWdBa2NOQUVHcUFTRVFETG9DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRSnFJUkFDUUFOQUlBUXRBQUFnQVVIS3o0Q0FBR290QUFCSERhSUJJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR3FBU0VRRExvQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJRaEVBeWZBUXNDUUNBRUlBSkhEUUJCcXdFaEVBeTVBZ3NDUUFKQUFrQUNRQ0FFTFFBQVFiNS9hZzRQQUFFQ3BBR2tBYVFCcEFHa0FhUUJwQUdrQWFRQnBBR2tBUU9rQVFzZ0JFRUJhaUVFUVpNQklSQU1vZ0lMSUFSQkFXb2hCRUdVQVNFUURLRUNDeUFFUVFGcUlRUkJsUUVoRUF5Z0Fnc2dCRUVCYWlFRVFaWUJJUkFNbndJTEFrQWdCQ0FDUncwQVFhd0JJUkFNdUFJTElBUXRBQUJCeFFCSERaOEJJQVJCQVdvaEJBemdBUXNDUUNBRUlBSkhEUUJCclFFaEVBeTNBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQ2FpRVFBa0FEUUNBRUxRQUFJQUZCemMrQWdBQnFMUUFBUncyZkFTQUJRUUpHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQnJRRWhFQXkzQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVPSVJBTW5BRUxBa0FnQkNBQ1J3MEFRYTRCSVJBTXRnSUxJQVF0QUFCQjBBQkhEWjBCSUFSQkFXb2hBVUVsSVJBTW13RUxBa0FnQkNBQ1J3MEFRYThCSVJBTXRRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQ0dvaEVBSkFBMEFnQkMwQUFDQUJRZERQZ0lBQWFpMEFBRWNOblFFZ0FVRUlSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWE4QklSQU10UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJLaUVRREpvQkN3SkFJQVFnQWtjTkFFR3dBU0VRRExRQ0N3SkFBa0FnQkMwQUFFR3JmMm9PQ3dDZEFaMEJuUUdkQVowQm5RR2RBWjBCblFFQm5RRUxJQVJCQVdvaEJFR2FBU0VRREpzQ0N5QUVRUUZxSVFSQm13RWhFQXlhQWdzQ1FDQUVJQUpIRFFCQnNRRWhFQXl6QWdzQ1FBSkFJQVF0QUFCQnYzOXFEaFFBbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCQVp3QkN5QUVRUUZxSVFSQm1RRWhFQXlhQWdzZ0JFRUJhaUVFUVp3QklSQU1tUUlMQWtBZ0JDQUNSdzBBUWJJQklSQU1zZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkEyb2hFQUpBQTBBZ0JDMEFBQ0FCUWRuUGdJQUFhaTBBQUVjTm1nRWdBVUVEUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFiSUJJUkFNc2dJTElBQkJBRFlDQUNBUVFRRnFJUUZCSVNFUURKY0JDd0pBSUFRZ0FrY05BRUd6QVNFUURMRUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFacUlSQUNRQU5BSUFRdEFBQWdBVUhkejRDQUFHb3RBQUJIRFprQklBRkJCa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHekFTRVFETEVDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUm9oRUF5V0FRc0NRQ0FFSUFKSERRQkJ0QUVoRUF5d0Fnc0NRQUpBQWtBZ0JDMEFBRUc3ZjJvT0VRQ2FBWm9CbWdHYUFab0JtZ0dhQVpvQm1nRUJtZ0dhQVpvQm1nR2FBUUthQVFzZ0JFRUJhaUVFUVowQklSQU1tQUlMSUFSQkFXb2hCRUdlQVNFUURKY0NDeUFFUVFGcUlRUkJud0VoRUF5V0Fnc0NRQ0FFSUFKSERRQkJ0UUVoRUF5dkFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVGYWlFUUFrQURRQ0FFTFFBQUlBRkI1TStBZ0FCcUxRQUFSdzJYQVNBQlFRVkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCdFFFaEVBeXZBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRW9JUkFNbEFFTEFrQWdCQ0FDUncwQVFiWUJJUkFNcmdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBbW9oRUFKQUEwQWdCQzBBQUNBQlFlclBnSUFBYWkwQUFFY05sZ0VnQVVFQ1JnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYllCSVJBTXJnSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkJ5RVFESk1CQ3dKQUlBUWdBa2NOQUVHM0FTRVFESzBDQ3dKQUFrQWdCQzBBQUVHN2Yyb09EZ0NXQVpZQmxnR1dBWllCbGdHV0FaWUJsZ0dXQVpZQmxnRUJsZ0VMSUFSQkFXb2hCRUdoQVNFUURKUUNDeUFFUVFGcUlRUkJvZ0VoRUF5VEFnc0NRQ0FFSUFKSERRQkJ1QUVoRUF5c0Fnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVDYWlFUUFrQURRQ0FFTFFBQUlBRkI3YytBZ0FCcUxRQUFSdzJVQVNBQlFRSkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCdUFFaEVBeXNBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRVNJUkFNa1FFTEFrQWdCQ0FDUncwQVFia0JJUkFNcXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBV29oRUFKQUEwQWdCQzBBQUNBQlFmRFBnSUFBYWkwQUFFY05rd0VnQVVFQlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYmtCSVJBTXF3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQklDRVFESkFCQ3dKQUlBUWdBa2NOQUVHNkFTRVFES29DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRRnFJUkFDUUFOQUlBUXRBQUFnQVVIeXo0Q0FBR290QUFCSERaSUJJQUZCQVVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFRzZBU0VRREtvQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVE4aEVBeVBBUXNDUUNBRUlBSkhEUUJCdXdFaEVBeXBBZ3NDUUFKQUlBUXRBQUJCdDM5cURnY0FrZ0dTQVpJQmtnR1NBUUdTQVFzZ0JFRUJhaUVFUWFVQklSQU1rQUlMSUFSQkFXb2hCRUdtQVNFUURJOENDd0pBSUFRZ0FrY05BRUc4QVNFUURLZ0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFkcUlSQUNRQU5BSUFRdEFBQWdBVUgwejRDQUFHb3RBQUJIRFpBQklBRkJCMFlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHOEFTRVFES2dDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUnNoRUF5TkFRc0NRQ0FFSUFKSERRQkJ2UUVoRUF5bkFnc0NRQUpBQWtBZ0JDMEFBRUcrZjJvT0VnQ1JBWkVCa1FHUkFaRUJrUUdSQVpFQmtRRUJrUUdSQVpFQmtRR1JBWkVCQXBFQkN5QUVRUUZxSVFSQnBBRWhFQXlQQWdzZ0JFRUJhaUVFUWFjQklSQU1qZ0lMSUFSQkFXb2hCRUdvQVNFUURJMENDd0pBSUFRZ0FrY05BRUcrQVNFUURLWUNDeUFFTFFBQVFjNEFSdzJOQVNBRVFRRnFJUVFNendFTEFrQWdCQ0FDUncwQVFiOEJJUkFNcFFJTEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQkMwQUFFRy9mMm9PRlFBQkFnT2NBUVFGQnB3Qm5BR2NBUWNJQ1FvTG5BRU1EUTRQbkFFTElBUkJBV29oQVVIb0FDRVFESm9DQ3lBRVFRRnFJUUZCNlFBaEVBeVpBZ3NnQkVFQmFpRUJRZTRBSVJBTW1BSUxJQVJCQVdvaEFVSHlBQ0VRREpjQ0N5QUVRUUZxSVFGQjh3QWhFQXlXQWdzZ0JFRUJhaUVCUWZZQUlSQU1sUUlMSUFSQkFXb2hBVUgzQUNFUURKUUNDeUFFUVFGcUlRRkIrZ0FoRUF5VEFnc2dCRUVCYWlFRVFZTUJJUkFNa2dJTElBUkJBV29oQkVHRUFTRVFESkVDQ3lBRVFRRnFJUVJCaFFFaEVBeVFBZ3NnQkVFQmFpRUVRWklCSVJBTWp3SUxJQVJCQVdvaEJFR1lBU0VRREk0Q0N5QUVRUUZxSVFSQm9BRWhFQXlOQWdzZ0JFRUJhaUVFUWFNQklSQU1qQUlMSUFSQkFXb2hCRUdxQVNFUURJc0NDd0pBSUFRZ0FrWU5BQ0FBUVpDQWdJQUFOZ0lJSUFBZ0JEWUNCRUdyQVNFUURJc0NDMEhBQVNFUURLTUNDeUFBSUFVZ0FoQ3FnSUNBQUNJQkRZc0JJQVVoQVF4Y0N3SkFJQVlnQWtZTkFDQUdRUUZxSVFVTWpRRUxRY0lCSVJBTW9RSUxBMEFDUUNBUUxRQUFRWFpxRGdTTUFRQUFqd0VBQ3lBUVFRRnFJaEFnQWtjTkFBdEJ3d0VoRUF5Z0Fnc0NRQ0FISUFKR0RRQWdBRUdSZ0lDQUFEWUNDQ0FBSUFjMkFnUWdCeUVCUVFFaEVBeUhBZ3RCeEFFaEVBeWZBZ3NDUUNBSElBSkhEUUJCeFFFaEVBeWZBZ3NDUUFKQUlBY3RBQUJCZG1vT0JBSE9BYzRCQU00QkN5QUhRUUZxSVFZTWpRRUxJQWRCQVdvaEJReUpBUXNDUUNBSElBSkhEUUJCeGdFaEVBeWVBZ3NDUUFKQUlBY3RBQUJCZG1vT0Z3R1BBWThCQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVFDUEFRc2dCMEVCYWlFSEMwR3dBU0VRRElRQ0N3SkFJQWdnQWtjTkFFSElBU0VRREowQ0N5QUlMUUFBUVNCSERZMEJJQUJCQURzQk1pQUlRUUZxSVFGQnN3RWhFQXlEQWdzZ0FTRVhBa0FEUUNBWElnY2dBa1lOQVNBSExRQUFRVkJxUWY4QmNTSVFRUXBQRGN3QkFrQWdBQzhCTWlJVVFaa3pTdzBBSUFBZ0ZFRUtiQ0lVT3dFeUlCQkIvLzhEY3lBVVFmNy9BM0ZKRFFBZ0IwRUJhaUVYSUFBZ0ZDQVFhaUlRT3dFeUlCQkIvLzhEY1VIb0Iwa05BUXNMUVFBaEVDQUFRUUEyQWh3Z0FFSEJpWUNBQURZQ0VDQUFRUTAyQWd3Z0FDQUhRUUZxTmdJVURKd0NDMEhIQVNFUURKc0NDeUFBSUFnZ0FoQ3VnSUNBQUNJUVJRM0tBU0FRUVJWSERZd0JJQUJCeUFFMkFod2dBQ0FJTmdJVUlBQkJ5WmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXlhQWdzQ1FDQUpJQUpIRFFCQnpBRWhFQXlhQWd0QkFDRVVRUUVoRjBFQklSWkJBQ0VRQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFrdEFBQkJVR29PQ3BZQmxRRUFBUUlEQkFVR0NKY0JDMEVDSVJBTUJndEJBeUVRREFVTFFRUWhFQXdFQzBFRklSQU1Bd3RCQmlFUURBSUxRUWNoRUF3QkMwRUlJUkFMUVFBaEYwRUFJUlpCQUNFVURJNEJDMEVKSVJCQkFTRVVRUUFoRjBFQUlSWU1qUUVMQWtBZ0NpQUNSdzBBUWM0QklSQU1tUUlMSUFvdEFBQkJMa2NOamdFZ0NrRUJhaUVKRE1vQkN5QUxJQUpIRFk0QlFkQUJJUkFNbHdJTEFrQWdDeUFDUmcwQUlBQkJqb0NBZ0FBMkFnZ2dBQ0FMTmdJRVFiY0JJUkFNL2dFTFFkRUJJUkFNbGdJTEFrQWdCQ0FDUncwQVFkSUJJUkFNbGdJTElBSWdCR3NnQUNnQ0FDSVFhaUVVSUFRZ0VHdEJCR29oQ3dOQUlBUXRBQUFnRUVIOHo0Q0FBR290QUFCSERZNEJJQkJCQkVZTjZRRWdFRUVCYWlFUUlBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkIwZ0VoRUF5VkFnc2dBQ0FNSUFJUXJJQ0FnQUFpQVEyTkFTQU1JUUVNdUFFTEFrQWdCQ0FDUncwQVFkUUJJUkFNbEFJTElBSWdCR3NnQUNnQ0FDSVFhaUVVSUFRZ0VHdEJBV29oREFOQUlBUXRBQUFnRUVHQjBJQ0FBR290QUFCSERZOEJJQkJCQVVZTmpnRWdFRUVCYWlFUUlBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkIxQUVoRUF5VEFnc0NRQ0FFSUFKSERRQkIxZ0VoRUF5VEFnc2dBaUFFYXlBQUtBSUFJaEJxSVJRZ0JDQVFhMEVDYWlFTEEwQWdCQzBBQUNBUVFZUFFnSUFBYWkwQUFFY05qZ0VnRUVFQ1JnMlFBU0FRUVFGcUlSQWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUhXQVNFUURKSUNDd0pBSUFRZ0FrY05BRUhYQVNFUURKSUNDd0pBQWtBZ0JDMEFBRUc3ZjJvT0VBQ1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJBWThCQ3lBRVFRRnFJUVJCdXdFaEVBejVBUXNnQkVFQmFpRUVRYndCSVJBTStBRUxBa0FnQkNBQ1J3MEFRZGdCSVJBTWtRSUxJQVF0QUFCQnlBQkhEWXdCSUFSQkFXb2hCQXpFQVFzQ1FDQUVJQUpHRFFBZ0FFR1FnSUNBQURZQ0NDQUFJQVEyQWdSQnZnRWhFQXozQVF0QjJRRWhFQXlQQWdzQ1FDQUVJQUpIRFFCQjJnRWhFQXlQQWdzZ0JDMEFBRUhJQUVZTnd3RWdBRUVCT2dBb0RMa0JDeUFBUVFJNkFDOGdBQ0FFSUFJUXBvQ0FnQUFpRUEyTkFVSENBU0VRRFBRQkN5QUFMUUFvUVg5cURnSzNBYmtCdUFFTEEwQUNRQ0FFTFFBQVFYWnFEZ1FBamdHT0FRQ09BUXNnQkVFQmFpSUVJQUpIRFFBTFFkMEJJUkFNaXdJTElBQkJBRG9BTHlBQUxRQXRRUVJ4UlEyRUFnc2dBRUVBT2dBdklBQkJBVG9BTkNBQklRRU1qQUVMSUJCQkZVWU4yZ0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYWVPZ0lBQU5nSVFJQUJCRWpZQ0RFRUFJUkFNaUFJTEFrQWdBQ0FRSUFJUXRJQ0FnQUFpQkEwQUlCQWhBUXlCQWdzQ1FDQUVRUlZIRFFBZ0FFRUROZ0ljSUFBZ0VEWUNGQ0FBUWJDWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTWlBSUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR25qb0NBQURZQ0VDQUFRUkkyQWd4QkFDRVFESWNDQ3lBUVFSVkdEZFlCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUhhallDQUFEWUNFQ0FBUVJRMkFneEJBQ0VRRElZQ0N5QUFLQUlFSVJjZ0FFRUFOZ0lFSUJBZ0VhZHFJaFloQVNBQUlCY2dFQ0FXSUJRYkloQVF0WUNBZ0FBaUZFVU5qUUVnQUVFSE5nSWNJQUFnRURZQ0ZDQUFJQlEyQWd4QkFDRVFESVVDQ3lBQUlBQXZBVEJCZ0FGeU93RXdJQUVoQVF0QktpRVFET29CQ3lBUVFSVkdEZEVCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdEaklDQUFEWUNFQ0FBUVJNMkFneEJBQ0VRRElJQ0N5QVFRUlZHRGM4QklBQkJBRFlDSENBQUlBRTJBaFFnQUVHYWo0Q0FBRFlDRUNBQVFTSTJBZ3hCQUNFUURJRUNDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXQ0Q0FnQUFpRUEwQUlBRkJBV29oQVF5TkFRc2dBRUVNTmdJY0lBQWdFRFlDRENBQUlBRkJBV28yQWhSQkFDRVFESUFDQ3lBUVFSVkdEY3dCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdhajRDQUFEWUNFQ0FBUVNJMkFneEJBQ0VRRFA4QkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRdDRDQWdBQWlFQTBBSUFGQkFXb2hBUXlNQVFzZ0FFRU5OZ0ljSUFBZ0VEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQNEJDeUFRUVJWR0Rja0JJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUDBCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF1WUNBZ0FBaUVBMEFJQUZCQVdvaEFReUxBUXNnQUVFT05nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFB3QkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQndKV0FnQUEyQWhBZ0FFRUNOZ0lNUVFBaEVBejdBUXNnRUVFVlJnM0ZBU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ4b3lBZ0FBMkFoQWdBRUVqTmdJTVFRQWhFQXo2QVFzZ0FFRVFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRFBrQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdVlDQWdBQWlCQTBBSUFGQkFXb2hBUXp4QVFzZ0FFRVJOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQZ0JDeUFRUVJWR0RjRUJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUGNCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF1WUNBZ0FBaUVBMEFJQUZCQVdvaEFReUlBUXNnQUVFVE5nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFBZQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdVlDQWdBQWlCQTBBSUFGQkFXb2hBUXp0QVFzZ0FFRVVOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQVUJDeUFRUVJWR0RiMEJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR2FqNENBQURZQ0VDQUFRU0kyQWd4QkFDRVFEUFFCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF0NENBZ0FBaUVBMEFJQUZCQVdvaEFReUdBUXNnQUVFV05nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFBNQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdDRDQWdBQWlCQTBBSUFGQkFXb2hBUXpwQVFzZ0FFRVhOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQSUJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ6Wk9BZ0FBMkFoQWdBRUVNTmdJTVFRQWhFQXp4QVF0Q0FTRVJDeUFRUVFGcUlRRUNRQ0FBS1FNZ0loSkMvLy8vLy8vLy8vOFBWZzBBSUFBZ0VrSUVoaUFSaERjRElDQUJJUUVNaEFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHdGlZQ0FBRFlDRUNBQVFRdzJBZ3hCQUNFUURPOEJDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJ6Wk9BZ0FBMkFoQWdBRUVNTmdJTVFRQWhFQXp1QVFzZ0FDZ0NCQ0VYSUFCQkFEWUNCQ0FRSUJHbmFpSVdJUUVnQUNBWElCQWdGaUFVR3lJUUVMV0FnSUFBSWhSRkRYTWdBRUVGTmdJY0lBQWdFRFlDRkNBQUlCUTJBZ3hCQUNFUURPMEJDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJxcHlBZ0FBMkFoQWdBRUVQTmdJTVFRQWhFQXpzQVFzZ0FDQVFJQUlRdElDQWdBQWlBUTBCSUJBaEFRdEJEaUVRRE5FQkN3SkFJQUZCRlVjTkFDQUFRUUkyQWh3Z0FDQVFOZ0lVSUFCQnNKaUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBenFBUXNnQUVFQU5nSWNJQUFnRURZQ0ZDQUFRYWVPZ0lBQU5nSVFJQUJCRWpZQ0RFRUFJUkFNNlFFTElBRkJBV29oRUFKQUlBQXZBVEFpQVVHQUFYRkZEUUFDUUNBQUlCQWdBaEM3Z0lDQUFDSUJEUUFnRUNFQkRIQUxJQUZCRlVjTnVnRWdBRUVGTmdJY0lBQWdFRFlDRkNBQVFmbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU02UUVMQWtBZ0FVR2dCSEZCb0FSSERRQWdBQzBBTFVFQ2NRMEFJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR1drNENBQURZQ0VDQUFRUVEyQWd4QkFDRVFET2tCQ3lBQUlCQWdBaEM5Z0lDQUFCb2dFQ0VCQWtBQ1FBSkFBa0FDUUNBQUlCQWdBaEN6Z0lDQUFBNFdBZ0VBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQXdRTElBQkJBVG9BTGdzZ0FDQUFMd0V3UWNBQWNqc0JNQ0FRSVFFTFFTWWhFQXpSQVFzZ0FFRWpOZ0ljSUFBZ0VEWUNGQ0FBUWFXV2dJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTTZRRUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFSFZpNENBQURZQ0VDQUFRUkUyQWd4QkFDRVFET2dCQ3lBQUxRQXRRUUZ4UlEwQlFjTUJJUkFNemdFTEFrQWdEU0FDUmcwQUEwQUNRQ0FOTFFBQVFTQkdEUUFnRFNFQkRNUUJDeUFOUVFGcUlnMGdBa2NOQUF0QkpTRVFET2NCQzBFbElSQU01Z0VMSUFBb0FnUWhCQ0FBUVFBMkFnUWdBQ0FFSUEwUXI0Q0FnQUFpQkVVTnJRRWdBRUVtTmdJY0lBQWdCRFlDRENBQUlBMUJBV28yQWhSQkFDRVFET1VCQ3lBUVFSVkdEYXNCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUg5allDQUFEWUNFQ0FBUVIwMkFneEJBQ0VRRE9RQkN5QUFRU2MyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTTR3RUxJQkFoQVVFQklSUUNRQUpBQWtBQ1FBSkFBa0FDUUNBQUxRQXNRWDVxRGdjR0JRVURBUUlBQlFzZ0FDQUFMd0V3UVFoeU93RXdEQU1MUVFJaEZBd0JDMEVFSVJRTElBQkJBVG9BTENBQUlBQXZBVEFnRkhJN0FUQUxJQkFoQVF0Qkt5RVFETW9CQ3lBQVFRQTJBaHdnQUNBUU5nSVVJQUJCcTVLQWdBQTJBaEFnQUVFTE5nSU1RUUFoRUF6aUFRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFlR1BnSUFBTmdJUUlBQkJDallDREVFQUlSQU00UUVMSUFCQkFEb0FMQ0FRSVFFTXZRRUxJQkFoQVVFQklSUUNRQUpBQWtBQ1FBSkFJQUF0QUN4QmUyb09CQU1CQWdBRkN5QUFJQUF2QVRCQkNISTdBVEFNQXd0QkFpRVVEQUVMUVFRaEZBc2dBRUVCT2dBc0lBQWdBQzhCTUNBVWNqc0JNQXNnRUNFQkMwRXBJUkFNeFFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVId2xJQ0FBRFlDRUNBQVFRTTJBZ3hCQUNFUUROMEJDd0pBSUE0dEFBQkJEVWNOQUNBQUtBSUVJUUVnQUVFQU5nSUVBa0FnQUNBQklBNFFzWUNBZ0FBaUFRMEFJQTVCQVdvaEFReDFDeUFBUVN3MkFod2dBQ0FCTmdJTUlBQWdEa0VCYWpZQ0ZFRUFJUkFNM1FFTElBQXRBQzFCQVhGRkRRRkJ4QUVoRUF6REFRc0NRQ0FPSUFKSERRQkJMU0VRRE53QkN3SkFBa0FEUUFKQUlBNHRBQUJCZG1vT0JBSUFBQU1BQ3lBT1FRRnFJZzRnQWtjTkFBdEJMU0VRRE4wQkN5QUFLQUlFSVFFZ0FFRUFOZ0lFQWtBZ0FDQUJJQTRRc1lDQWdBQWlBUTBBSUE0aEFReDBDeUFBUVN3MkFod2dBQ0FPTmdJVUlBQWdBVFlDREVFQUlSQU0zQUVMSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0RoQ3hnSUNBQUNJQkRRQWdEa0VCYWlFQkRITUxJQUJCTERZQ0hDQUFJQUUyQWd3Z0FDQU9RUUZxTmdJVVFRQWhFQXpiQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQ0FBSUFRZ0RoQ3hnSUNBQUNJRURhQUJJQTRoQVF6T0FRc2dFRUVzUncwQklBRkJBV29oRUVFQklRRUNRQUpBQWtBQ1FBSkFJQUF0QUN4QmUyb09CQU1CQWdRQUN5QVFJUUVNQkF0QkFpRUJEQUVMUVFRaEFRc2dBRUVCT2dBc0lBQWdBQzhCTUNBQmNqc0JNQ0FRSVFFTUFRc2dBQ0FBTHdFd1FRaHlPd0V3SUJBaEFRdEJPU0VRREw4QkN5QUFRUUE2QUN3Z0FTRUJDMEUwSVJBTXZRRUxJQUFnQUM4Qk1FRWdjanNCTUNBQklRRU1BZ3NnQUNnQ0JDRUVJQUJCQURZQ0JBSkFJQUFnQkNBQkVMR0FnSUFBSWdRTkFDQUJJUUVNeHdFTElBQkJOellDSENBQUlBRTJBaFFnQUNBRU5nSU1RUUFoRUF6VUFRc2dBRUVJT2dBc0lBRWhBUXRCTUNFUURMa0JDd0pBSUFBdEFDaEJBVVlOQUNBQklRRU1CQXNnQUMwQUxVRUljVVVOa3dFZ0FTRUJEQU1MSUFBdEFEQkJJSEVObEFGQnhRRWhFQXkzQVFzQ1FDQVBJQUpHRFFBQ1FBTkFBa0FnRHkwQUFFRlFhaUlCUWY4QmNVRUtTUTBBSUE4aEFVRTFJUkFNdWdFTElBQXBBeUFpRVVLWnMrYk1tYlBtekJsV0RRRWdBQ0FSUWdwK0loRTNBeUFnRVNBQnJVTC9BWU1pRWtKL2hWWU5BU0FBSUJFZ0VudzNBeUFnRDBFQmFpSVBJQUpIRFFBTFFUa2hFQXpSQVFzZ0FDZ0NCQ0VDSUFCQkFEWUNCQ0FBSUFJZ0QwRUJhaUlFRUxHQWdJQUFJZ0lObFFFZ0JDRUJETU1CQzBFNUlSQU16d0VMQWtBZ0FDOEJNQ0lCUVFoeFJRMEFJQUF0QUNoQkFVY05BQ0FBTFFBdFFRaHhSUTJRQVFzZ0FDQUJRZmY3QTNGQmdBUnlPd0V3SUE4aEFRdEJOeUVRRExRQkN5QUFJQUF2QVRCQkVISTdBVEFNcXdFTElCQkJGVVlOaXdFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZDT2dJQUFOZ0lRSUFCQkhEWUNERUVBSVJBTXl3RUxJQUJCd3dBMkFod2dBQ0FCTmdJTUlBQWdEVUVCYWpZQ0ZFRUFJUkFNeWdFTEFrQWdBUzBBQUVFNlJ3MEFJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDdmdJQ0FBQ0lRRFFBZ0FVRUJhaUVCREdNTElBQkJ3d0EyQWh3Z0FDQVFOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU15Z0VMSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUd4a1lDQUFEWUNFQ0FBUVFvMkFneEJBQ0VRRE1rQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQm9KbUFnQUEyQWhBZ0FFRWVOZ0lNUVFBaEVBeklBUXNnQUVFQU5nSUFDeUFBUVlBU093RXFJQUFnRjBFQmFpSUJJQUlRcUlDQWdBQWlFQTBCSUFFaEFRdEJ4d0FoRUF5c0FRc2dFRUVWUncyREFTQUFRZEVBTmdJY0lBQWdBVFlDRkNBQVFlT1hnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU14QUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREY0TElBQkIwZ0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXd3RUxJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFSEJxSUNBQURZQ0VDQUFRUWMyQWd3Z0FFRUFOZ0lBUVFBaEVBekNBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNWFFzZ0FFSFRBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6QkFRdEJBQ0VRSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdBa1lDQUFEWUNFQ0FBUVFrMkFnd013QUVMSUJCQkZVWU5mU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJsSTJBZ0FBMkFoQWdBRUVoTmdJTVFRQWhFQXkvQVF0QkFTRVdRUUFoRjBFQUlSUkJBU0VRQ3lBQUlCQTZBQ3NnQVVFQmFpRUJBa0FDUUNBQUxRQXRRUkJ4RFFBQ1FBSkFBa0FnQUMwQUtnNERBUUFDQkFzZ0ZrVU5Bd3dDQ3lBVURRRU1BZ3NnRjBVTkFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUsyQWdJQUFJaEFOQUNBQklRRU1YQXNnQUVIWUFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXkrQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQUpBSUFBZ0JDQUJFSzJBZ0lBQUlnUU5BQ0FCSVFFTXJRRUxJQUJCMlFBMkFod2dBQ0FCTmdJVUlBQWdCRFlDREVFQUlSQU12UUVMSUFBb0FnUWhCQ0FBUVFBMkFnUUNRQ0FBSUFRZ0FSQ3RnSUNBQUNJRURRQWdBU0VCREtzQkN5QUFRZG9BTmdJY0lBQWdBVFlDRkNBQUlBUTJBZ3hCQUNFUURMd0JDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXJZQ0FnQUFpQkEwQUlBRWhBUXlwQVFzZ0FFSGNBRFlDSENBQUlBRTJBaFFnQUNBRU5nSU1RUUFoRUF5N0FRc0NRQ0FCTFFBQVFWQnFJaEJCL3dGeFFRcFBEUUFnQUNBUU9nQXFJQUZCQVdvaEFVSFBBQ0VRREtJQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRcllDQWdBQWlCQTBBSUFFaEFReW5BUXNnQUVIZUFEWUNIQ0FBSUFFMkFoUWdBQ0FFTmdJTVFRQWhFQXk2QVFzZ0FFRUFOZ0lBSUJkQkFXb2hBUUpBSUFBdEFDbEJJMDhOQUNBQklRRU1XUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZE9KZ0lBQU5nSVFJQUJCQ0RZQ0RFRUFJUkFNdVFFTElBQkJBRFlDQUF0QkFDRVFJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR1FzNENBQURZQ0VDQUFRUWcyQWd3TXR3RUxJQUJCQURZQ0FDQVhRUUZxSVFFQ1FDQUFMUUFwUVNGSERRQWdBU0VCREZZTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHYmlvQ0FBRFlDRUNBQVFRZzJBZ3hCQUNFUURMWUJDeUFBUVFBMkFnQWdGMEVCYWlFQkFrQWdBQzBBS1NJUVFWMXFRUXRQRFFBZ0FTRUJERlVMQWtBZ0VFRUdTdzBBUVFFZ0VIUkJ5Z0J4UlEwQUlBRWhBUXhWQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFmZUpnSUFBTmdJUUlBQkJDRFlDREF5MUFRc2dFRUVWUmcxeElBQkJBRFlDSENBQUlBRTJBaFFnQUVHNWpZQ0FBRFlDRUNBQVFSbzJBZ3hCQUNFUURMUUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhVQ3lBQVFlVUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRExNQkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcDRDQWdBQWlFQTBBSUFFaEFReE5DeUFBUWRJQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFETElCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVFwNENBZ0FBaUVBMEFJQUVoQVF4TkN5QUFRZE1BTmdJY0lBQWdBVFlDRkNBQUlCQTJBZ3hCQUNFUURMRUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhSQ3lBQVFlVUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRExBQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQnhvcUFnQUEyQWhBZ0FFRUhOZ0lNUVFBaEVBeXZBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNU1FzZ0FFSFNBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF5dUFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUtlQWdJQUFJaEFOQUNBQklRRU1TUXNnQUVIVEFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXl0QVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFS2VBZ0lBQUloQU5BQ0FCSVFFTVRRc2dBRUhsQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeXNBUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZHlJZ0lBQU5nSVFJQUJCQnpZQ0RFRUFJUkFNcXdFTElCQkJQMGNOQVNBQlFRRnFJUUVMUVFVaEVBeVFBUXRCQUNFUUlBQkJBRFlDSENBQUlBRTJBaFFnQUVIOWtvQ0FBRFlDRUNBQVFRYzJBZ3dNcUFFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkNuZ0lDQUFDSVFEUUFnQVNFQkRFSUxJQUJCMGdBMkFod2dBQ0FCTmdJVUlBQWdFRFlDREVFQUlSQU1wd0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREVJTElBQkIwd0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXBnRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERVlMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNcFFFTElBQW9BZ1FoQVNBQVFRQTJBZ1FDUUNBQUlBRWdGQkNuZ0lDQUFDSUJEUUFnRkNFQkREOExJQUJCMGdBMkFod2dBQ0FVTmdJVUlBQWdBVFlDREVFQUlSQU1wQUVMSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0ZCQ25nSUNBQUNJQkRRQWdGQ0VCREQ4TElBQkIwd0EyQWh3Z0FDQVVOZ0lVSUFBZ0FUWUNERUVBSVJBTW93RUxJQUFvQWdRaEFTQUFRUUEyQWdRQ1FDQUFJQUVnRkJDbmdJQ0FBQ0lCRFFBZ0ZDRUJERU1MSUFCQjVRQTJBaHdnQUNBVU5nSVVJQUFnQVRZQ0RFRUFJUkFNb2dFTElBQkJBRFlDSENBQUlCUTJBaFFnQUVIRGo0Q0FBRFlDRUNBQVFRYzJBZ3hCQUNFUURLRUJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ3NCtBZ0FBMkFoQWdBRUVITmdJTVFRQWhFQXlnQVF0QkFDRVFJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFR01uSUNBQURZQ0VDQUFRUWMyQWd3TW53RUxJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFR01uSUNBQURZQ0VDQUFRUWMyQWd4QkFDRVFESjRCQ3lBQVFRQTJBaHdnQUNBVU5nSVVJQUJCL3BHQWdBQTJBaEFnQUVFSE5nSU1RUUFoRUF5ZEFRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFZNmJnSUFBTmdJUUlBQkJCallDREVFQUlSQU1uQUVMSUJCQkZVWU5WeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ6STZBZ0FBMkFoQWdBRUVnTmdJTVFRQWhFQXliQVFzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVrSVJBTElBQWdFRG9BS1NBQUtBSUVJUkFnQUVFQU5nSUVJQUFnRUNBQkVLdUFnSUFBSWhBTlZDQUJJUUVNUGdzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdCRFlDRkNBQVFmR2JnSUFBTmdJUUlBQkJCallDREF5WEFRc2dBVUVWUmcxUUlBQkJBRFlDSENBQUlBVTJBaFFnQUVId2pJQ0FBRFlDRUNBQVFSczJBZ3hCQUNFUURKWUJDeUFBS0FJRUlRVWdBRUVBTmdJRUlBQWdCU0FRRUttQWdJQUFJZ1VOQVNBUVFRRnFJUVVMUWEwQklSQU1ld3NnQUVIQkFUWUNIQ0FBSUFVMkFnd2dBQ0FRUVFGcU5nSVVRUUFoRUF5VEFRc2dBQ2dDQkNFR0lBQkJBRFlDQkNBQUlBWWdFQkNwZ0lDQUFDSUdEUUVnRUVFQmFpRUdDMEd1QVNFUURIZ0xJQUJCd2dFMkFod2dBQ0FHTmdJTUlBQWdFRUVCYWpZQ0ZFRUFJUkFNa0FFTElBQkJBRFlDSENBQUlBYzJBaFFnQUVHWGk0Q0FBRFlDRUNBQVFRMDJBZ3hCQUNFUURJOEJDeUFBUVFBMkFod2dBQ0FJTmdJVUlBQkI0NUNBZ0FBMkFoQWdBRUVKTmdJTVFRQWhFQXlPQVFzZ0FFRUFOZ0ljSUFBZ0NEWUNGQ0FBUVpTTmdJQUFOZ0lRSUFCQklUWUNERUVBSVJBTWpRRUxRUUVoRmtFQUlSZEJBQ0VVUVFFaEVBc2dBQ0FRT2dBcklBbEJBV29oQ0FKQUFrQWdBQzBBTFVFUWNRMEFBa0FDUUFKQUlBQXRBQ29PQXdFQUFnUUxJQlpGRFFNTUFnc2dGQTBCREFJTElCZEZEUUVMSUFBb0FnUWhFQ0FBUVFBMkFnUWdBQ0FRSUFnUXJZQ0FnQUFpRUVVTlBTQUFRY2tCTmdJY0lBQWdDRFlDRkNBQUlCQTJBZ3hCQUNFUURJd0JDeUFBS0FJRUlRUWdBRUVBTmdJRUlBQWdCQ0FJRUsyQWdJQUFJZ1JGRFhZZ0FFSEtBVFlDSENBQUlBZzJBaFFnQUNBRU5nSU1RUUFoRUF5TEFRc2dBQ2dDQkNFRUlBQkJBRFlDQkNBQUlBUWdDUkN0Z0lDQUFDSUVSUTEwSUFCQnl3RTJBaHdnQUNBSk5nSVVJQUFnQkRZQ0RFRUFJUkFNaWdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FnQUNBRUlBb1FyWUNBZ0FBaUJFVU5jaUFBUWMwQk5nSWNJQUFnQ2pZQ0ZDQUFJQVEyQWd4QkFDRVFESWtCQ3dKQUlBc3RBQUJCVUdvaUVFSC9BWEZCQ2s4TkFDQUFJQkE2QUNvZ0MwRUJhaUVLUWJZQklSQU1jQXNnQUNnQ0JDRUVJQUJCQURZQ0JDQUFJQVFnQ3hDdGdJQ0FBQ0lFUlExd0lBQkJ6d0UyQWh3Z0FDQUxOZ0lVSUFBZ0JEWUNERUVBSVJBTWlBRUxJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFR1FzNENBQURZQ0VDQUFRUWcyQWd3Z0FFRUFOZ0lBUVFBaEVBeUhBUXNnQVVFVlJnMC9JQUJCQURZQ0hDQUFJQXcyQWhRZ0FFSE1qb0NBQURZQ0VDQUFRU0EyQWd4QkFDRVFESVlCQ3lBQVFZRUVPd0VvSUFBb0FnUWhFQ0FBUWdBM0F3QWdBQ0FRSUF4QkFXb2lEQkNyZ0lDQUFDSVFSUTA0SUFCQjB3RTJBaHdnQUNBTU5nSVVJQUFnRURZQ0RFRUFJUkFNaFFFTElBQkJBRFlDQUF0QkFDRVFJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFSFltNENBQURZQ0VDQUFRUWcyQWd3TWd3RUxJQUFvQWdRaEVDQUFRZ0EzQXdBZ0FDQVFJQXRCQVdvaUN4Q3JnSUNBQUNJUURRRkJ4Z0VoRUF4cEN5QUFRUUk2QUNnTVZRc2dBRUhWQVRZQ0hDQUFJQXMyQWhRZ0FDQVFOZ0lNUVFBaEVBeUFBUXNnRUVFVlJnMDNJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFR2tqSUNBQURZQ0VDQUFRUkEyQWd4QkFDRVFESDhMSUFBdEFEUkJBVWNOTkNBQUlBUWdBaEM4Z0lDQUFDSVFSUTAwSUJCQkZVY05OU0FBUWR3Qk5nSWNJQUFnQkRZQ0ZDQUFRZFdXZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNZmd0QkFDRVFJQUJCQURZQ0hDQUFRYStMZ0lBQU5nSVFJQUJCQWpZQ0RDQUFJQlJCQVdvMkFoUU1mUXRCQUNFUURHTUxRUUloRUF4aUMwRU5JUkFNWVF0QkR5RVFER0FMUVNVaEVBeGZDMEVUSVJBTVhndEJGU0VRREYwTFFSWWhFQXhjQzBFWElSQU1Xd3RCR0NFUURGb0xRUmtoRUF4WkMwRWFJUkFNV0F0Qkd5RVFERmNMUVJ3aEVBeFdDMEVkSVJBTVZRdEJIeUVRREZRTFFTRWhFQXhUQzBFaklSQU1VZ3RCeGdBaEVBeFJDMEV1SVJBTVVBdEJMeUVRREU4TFFUc2hFQXhPQzBFOUlSQU1UUXRCeUFBaEVBeE1DMEhKQUNFUURFc0xRY3NBSVJBTVNndEJ6QUFoRUF4SkMwSE9BQ0VRREVnTFFkRUFJUkFNUnd0QjFRQWhFQXhHQzBIWUFDRVFERVVMUWRrQUlSQU1SQXRCMndBaEVBeERDMEhrQUNFUURFSUxRZVVBSVJBTVFRdEI4UUFoRUF4QUMwSDBBQ0VRREQ4TFFZMEJJUkFNUGd0Qmx3RWhFQXc5QzBHcEFTRVFERHdMUWF3QklSQU1Pd3RCd0FFaEVBdzZDMEc1QVNFUUREa0xRYThCSVJBTU9BdEJzUUVoRUF3M0MwR3lBU0VRRERZTFFiUUJJUkFNTlF0QnRRRWhFQXcwQzBHNkFTRVFERE1MUWIwQklSQU1NZ3RCdndFaEVBd3hDMEhCQVNFUUREQUxJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFSHBpNENBQURZQ0VDQUFRUjgyQWd4QkFDRVFERWdMSUFCQjJ3RTJBaHdnQUNBRU5nSVVJQUJCK3BhQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF4SEN5QUFRZmdBTmdJY0lBQWdERFlDRkNBQVFjcVlnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1SZ3NnQUVIUkFEWUNIQ0FBSUFVMkFoUWdBRUd3bDRDQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVVTElBQkIrUUEyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTVJBc2dBRUg0QURZQ0hDQUFJQUUyQWhRZ0FFSEttSUNBQURZQ0VDQUFRUlUyQWd4QkFDRVFERU1MSUFCQjVBQTJBaHdnQUNBQk5nSVVJQUJCNDVlQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF4Q0N5QUFRZGNBTmdJY0lBQWdBVFlDRkNBQVFjbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1RUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYm1OZ0lBQU5nSVFJQUJCR2pZQ0RFRUFJUkFNUUFzZ0FFSENBRFlDSENBQUlBRTJBaFFnQUVIam1JQ0FBRFlDRUNBQVFSVTJBZ3hCQUNFUUREOExJQUJCQURZQ0JDQUFJQThnRHhDeGdJQ0FBQ0lFUlEwQklBQkJPallDSENBQUlBUTJBZ3dnQUNBUFFRRnFOZ0lVUVFBaEVBdytDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXNZQ0FnQUFpQkVVTkFDQUFRVHMyQWh3Z0FDQUVOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU1QZ3NnQVVFQmFpRUJEQzBMSUE5QkFXb2hBUXd0Q3lBQVFRQTJBaHdnQUNBUE5nSVVJQUJCNUpLQWdBQTJBaEFnQUVFRU5nSU1RUUFoRUF3N0N5QUFRVFkyQWh3Z0FDQUVOZ0lVSUFBZ0FqWUNERUVBSVJBTU9nc2dBRUV1TmdJY0lBQWdEallDRkNBQUlBUTJBZ3hCQUNFUUREa0xJQUJCMEFBMkFod2dBQ0FCTmdJVUlBQkJrWmlBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXc0Q3lBTlFRRnFJUUVNTEFzZ0FFRVZOZ0ljSUFBZ0FUWUNGQ0FBUVlLWmdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU5nc2dBRUViTmdJY0lBQWdBVFlDRkNBQVFaR1hnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1OUXNnQUVFUE5nSWNJQUFnQVRZQ0ZDQUFRWkdYZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTkFzZ0FFRUxOZ0ljSUFBZ0FUWUNGQ0FBUVpHWGdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU13c2dBRUVhTmdJY0lBQWdBVFlDRkNBQVFZS1pnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1NZ3NnQUVFTE5nSWNJQUFnQVRZQ0ZDQUFRWUtaZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTVFzZ0FFRUtOZ0ljSUFBZ0FUWUNGQ0FBUWVTV2dJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU1Bc2dBRUVlTmdJY0lBQWdBVFlDRkNBQVFmbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1Md3NnQUVFQU5nSWNJQUFnRURZQ0ZDQUFRZHFOZ0lBQU5nSVFJQUJCRkRZQ0RFRUFJUkFNTGdzZ0FFRUVOZ0ljSUFBZ0FUWUNGQ0FBUWJDWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTUxRc2dBRUVBTmdJQUlBdEJBV29oQ3d0QnVBRWhFQXdTQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRZlVBSVJBTUVRc2dBU0VCQWtBZ0FDMEFLVUVGUncwQVFlTUFJUkFNRVF0QjRnQWhFQXdRQzBFQUlSQWdBRUVBTmdJY0lBQkI1SkdBZ0FBMkFoQWdBRUVITmdJTUlBQWdGRUVCYWpZQ0ZBd29DeUFBUVFBMkFnQWdGMEVCYWlFQlFjQUFJUkFNRGd0QkFTRUJDeUFBSUFFNkFDd2dBRUVBTmdJQUlCZEJBV29oQVF0QktDRVFEQXNMSUFFaEFRdEJPQ0VRREFrTEFrQWdBU0lQSUFKR0RRQURRQUpBSUE4dEFBQkJnTDZBZ0FCcUxRQUFJZ0ZCQVVZTkFDQUJRUUpIRFFNZ0QwRUJhaUVCREFRTElBOUJBV29pRHlBQ1J3MEFDMEUrSVJBTUlndEJQaUVRRENFTElBQkJBRG9BTENBUElRRU1BUXRCQ3lFUURBWUxRVG9oRUF3RkN5QUJRUUZxSVFGQkxTRVFEQVFMSUFBZ0FUb0FMQ0FBUVFBMkFnQWdGa0VCYWlFQlFRd2hFQXdEQ3lBQVFRQTJBZ0FnRjBFQmFpRUJRUW9oRUF3Q0N5QUFRUUEyQWdBTElBQkJBRG9BTENBTklRRkJDU0VRREFBTEMwRUFJUkFnQUVFQU5nSWNJQUFnQ3pZQ0ZDQUFRYzJRZ0lBQU5nSVFJQUJCQ1RZQ0RBd1hDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0NqWUNGQ0FBUWVtS2dJQUFOZ0lRSUFCQkNUWUNEQXdXQzBFQUlSQWdBRUVBTmdJY0lBQWdDVFlDRkNBQVFiZVFnSUFBTmdJUUlBQkJDVFlDREF3VkMwRUFJUkFnQUVFQU5nSWNJQUFnQ0RZQ0ZDQUFRWnlSZ0lBQU5nSVFJQUJCQ1RZQ0RBd1VDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWMyUWdJQUFOZ0lRSUFCQkNUWUNEQXdUQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFlbUtnSUFBTmdJUUlBQkJDVFlDREF3U0MwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYmVRZ0lBQU5nSVFJQUJCQ1RZQ0RBd1JDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVp5UmdJQUFOZ0lRSUFCQkNUWUNEQXdRQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaZVZnSUFBTmdJUUlBQkJEellDREF3UEMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWmVWZ0lBQU5nSVFJQUJCRHpZQ0RBd09DMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWNDU2dJQUFOZ0lRSUFCQkN6WUNEQXdOQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaV0pnSUFBTmdJUUlBQkJDellDREF3TUMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZUdQZ0lBQU5nSVFJQUJCQ2pZQ0RBd0xDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZ1UGdJQUFOZ0lRSUFCQkNqWUNEQXdLQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFmR1pnSUFBTmdJUUlBQkJBallDREF3SkMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRY1NVZ0lBQU5nSVFJQUJCQWpZQ0RBd0lDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZLVmdJQUFOZ0lRSUFCQkFqWUNEQXdIQ3lBQVFRSTJBaHdnQUNBQk5nSVVJQUJCbkpxQWdBQTJBaEFnQUVFV05nSU1RUUFoRUF3R0MwRUJJUkFNQlF0QjFBQWhFQ0FCSWdRZ0FrWU5CQ0FEUVFocUlBQWdCQ0FDUWRqQ2dJQUFRUW9ReFlDQWdBQWdBeWdDRENFRUlBTW9BZ2dPQXdFRUFnQUxFTXFBZ0lBQUFBc2dBRUVBTmdJY0lBQkJ0WnFBZ0FBMkFoQWdBRUVYTmdJTUlBQWdCRUVCYWpZQ0ZFRUFJUkFNQWdzZ0FFRUFOZ0ljSUFBZ0JEWUNGQ0FBUWNxYWdJQUFOZ0lRSUFCQkNUWUNERUVBSVJBTUFRc0NRQ0FCSWdRZ0FrY05BRUVpSVJBTUFRc2dBRUdKZ0lDQUFEWUNDQ0FBSUFRMkFnUkJJU0VRQ3lBRFFSQnFKSUNBZ0lBQUlCQUxyd0VCQW44Z0FTZ0NBQ0VHQWtBQ1FDQUNJQU5HRFFBZ0JDQUdhaUVFSUFZZ0Eyb2dBbXNoQnlBQ0lBWkJmM01nQldvaUJtb2hCUU5BQWtBZ0FpMEFBQ0FFTFFBQVJnMEFRUUloQkF3REN3SkFJQVlOQUVFQUlRUWdCU0VDREFNTElBWkJmMm9oQmlBRVFRRnFJUVFnQWtFQmFpSUNJQU5IRFFBTElBY2hCaUFESVFJTElBQkJBVFlDQUNBQklBWTJBZ0FnQUNBQ05nSUVEd3NnQVVFQU5nSUFJQUFnQkRZQ0FDQUFJQUkyQWdRTENnQWdBQkRIZ0lDQUFBdnlOZ0VMZnlPQWdJQ0FBRUVRYXlJQkpJQ0FnSUFBQWtCQkFDZ0NvTkNBZ0FBTkFFRUFFTXVBZ0lBQVFZRFVoSUFBYXlJQ1Fka0FTUTBBUVFBaEF3SkFRUUFvQXVEVGdJQUFJZ1FOQUVFQVFuODNBdXpUZ0lBQVFRQkNnSUNFZ0lDQXdBQTNBdVRUZ0lBQVFRQWdBVUVJYWtGd2NVSFlxdFdxQlhNaUJEWUM0Tk9BZ0FCQkFFRUFOZ0wwMDRDQUFFRUFRUUEyQXNUVGdJQUFDMEVBSUFJMkFzelRnSUFBUVFCQmdOU0VnQUEyQXNqVGdJQUFRUUJCZ05TRWdBQTJBcGpRZ0lBQVFRQWdCRFlDck5DQWdBQkJBRUYvTmdLbzBJQ0FBQU5BSUFOQnhOQ0FnQUJxSUFOQnVOQ0FnQUJxSWdRMkFnQWdCQ0FEUWJEUWdJQUFhaUlGTmdJQUlBTkJ2TkNBZ0FCcUlBVTJBZ0FnQTBITTBJQ0FBR29nQTBIQTBJQ0FBR29pQlRZQ0FDQUZJQVEyQWdBZ0EwSFUwSUNBQUdvZ0EwSEkwSUNBQUdvaUJEWUNBQ0FFSUFVMkFnQWdBMEhRMElDQUFHb2dCRFlDQUNBRFFTQnFJZ05CZ0FKSERRQUxRWURVaElBQVFYaEJnTlNFZ0FCclFROXhRUUJCZ05TRWdBQkJDR3BCRDNFYklnTnFJZ1JCQkdvZ0FrRklhaUlGSUFOcklnTkJBWEkyQWdCQkFFRUFLQUx3MDRDQUFEWUNwTkNBZ0FCQkFDQUROZ0tVMElDQUFFRUFJQVEyQXFEUWdJQUFRWURVaElBQUlBVnFRVGcyQWdRTEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFCQjdBRkxEUUFDUUVFQUtBS0kwSUNBQUNJR1FSQWdBRUVUYWtGd2NTQUFRUXRKR3lJQ1FRTjJJZ1IySWdOQkEzRkZEUUFDUUFKQUlBTkJBWEVnQkhKQkFYTWlCVUVEZENJRVFiRFFnSUFBYWlJRElBUkJ1TkNBZ0FCcUtBSUFJZ1FvQWdnaUFrY05BRUVBSUFaQmZpQUZkM0UyQW9qUWdJQUFEQUVMSUFNZ0FqWUNDQ0FDSUFNMkFnd0xJQVJCQ0dvaEF5QUVJQVZCQTNRaUJVRURjallDQkNBRUlBVnFJZ1FnQkNnQ0JFRUJjallDQkF3TUN5QUNRUUFvQXBEUWdJQUFJZ2RORFFFQ1FDQURSUTBBQWtBQ1FDQURJQVIwUVFJZ0JIUWlBMEVBSUFOcmNuRWlBMEVBSUFOcmNVRi9haUlESUFOQkRIWkJFSEVpQTNZaUJFRUZka0VJY1NJRklBTnlJQVFnQlhZaUEwRUNka0VFY1NJRWNpQURJQVIySWdOQkFYWkJBbkVpQkhJZ0F5QUVkaUlEUVFGMlFRRnhJZ1J5SUFNZ0JIWnFJZ1JCQTNRaUEwR3cwSUNBQUdvaUJTQURRYmpRZ0lBQWFpZ0NBQ0lES0FJSUlnQkhEUUJCQUNBR1FYNGdCSGR4SWdZMkFvalFnSUFBREFFTElBVWdBRFlDQ0NBQUlBVTJBZ3dMSUFNZ0FrRURjallDQkNBRElBUkJBM1FpQkdvZ0JDQUNheUlGTmdJQUlBTWdBbW9pQUNBRlFRRnlOZ0lFQWtBZ0IwVU5BQ0FIUVhoeFFiRFFnSUFBYWlFQ1FRQW9BcHpRZ0lBQUlRUUNRQUpBSUFaQkFTQUhRUU4yZENJSWNRMEFRUUFnQmlBSWNqWUNpTkNBZ0FBZ0FpRUlEQUVMSUFJb0FnZ2hDQXNnQ0NBRU5nSU1JQUlnQkRZQ0NDQUVJQUkyQWd3Z0JDQUlOZ0lJQ3lBRFFRaHFJUU5CQUNBQU5nS2MwSUNBQUVFQUlBVTJBcERRZ0lBQURBd0xRUUFvQW96UWdJQUFJZ2xGRFFFZ0NVRUFJQWxyY1VGL2FpSURJQU5CREhaQkVIRWlBM1lpQkVFRmRrRUljU0lGSUFOeUlBUWdCWFlpQTBFQ2RrRUVjU0lFY2lBRElBUjJJZ05CQVhaQkFuRWlCSElnQXlBRWRpSURRUUYyUVFGeElnUnlJQU1nQkhacVFRSjBRYmpTZ0lBQWFpZ0NBQ0lBS0FJRVFYaHhJQUpySVFRZ0FDRUZBa0FEUUFKQUlBVW9BaEFpQXcwQUlBVkJGR29vQWdBaUEwVU5BZ3NnQXlnQ0JFRjRjU0FDYXlJRklBUWdCU0FFU1NJRkd5RUVJQU1nQUNBRkd5RUFJQU1oQlF3QUN3c2dBQ2dDR0NFS0FrQWdBQ2dDRENJSUlBQkdEUUFnQUNnQ0NDSURRUUFvQXBqUWdJQUFTUm9nQ0NBRE5nSUlJQU1nQ0RZQ0RBd0xDd0pBSUFCQkZHb2lCU2dDQUNJRERRQWdBQ2dDRUNJRFJRMERJQUJCRUdvaEJRc0RRQ0FGSVFzZ0F5SUlRUlJxSWdVb0FnQWlBdzBBSUFoQkVHb2hCU0FJS0FJUUlnTU5BQXNnQzBFQU5nSUFEQW9MUVg4aEFpQUFRYjkvU3cwQUlBQkJFMm9pQTBGd2NTRUNRUUFvQW96UWdJQUFJZ2RGRFFCQkFDRUxBa0FnQWtHQUFra05BRUVmSVFzZ0FrSC8vLzhIU3cwQUlBTkJDSFlpQXlBRFFZRCtQMnBCRUhaQkNIRWlBM1FpQkNBRVFZRGdIMnBCRUhaQkJIRWlCSFFpQlNBRlFZQ0FEMnBCRUhaQkFuRWlCWFJCRDNZZ0F5QUVjaUFGY21zaUEwRUJkQ0FDSUFOQkZXcDJRUUZ4Y2tFY2FpRUxDMEVBSUFKcklRUUNRQUpBQWtBQ1FDQUxRUUowUWJqU2dJQUFhaWdDQUNJRkRRQkJBQ0VEUVFBaENBd0JDMEVBSVFNZ0FrRUFRUmtnQzBFQmRtc2dDMEVmUmh0MElRQkJBQ0VJQTBBQ1FDQUZLQUlFUVhoeElBSnJJZ1lnQkU4TkFDQUdJUVFnQlNFSUlBWU5BRUVBSVFRZ0JTRUlJQVVoQXd3REN5QURJQVZCRkdvb0FnQWlCaUFHSUFVZ0FFRWRka0VFY1dwQkVHb29BZ0FpQlVZYklBTWdCaHNoQXlBQVFRRjBJUUFnQlEwQUN3c0NRQ0FESUFoeURRQkJBQ0VJUVFJZ0MzUWlBMEVBSUFOcmNpQUhjU0lEUlEwRElBTkJBQ0FEYTNGQmYyb2lBeUFEUVF4MlFSQnhJZ04ySWdWQkJYWkJDSEVpQUNBRGNpQUZJQUIySWdOQkFuWkJCSEVpQlhJZ0F5QUZkaUlEUVFGMlFRSnhJZ1Z5SUFNZ0JYWWlBMEVCZGtFQmNTSUZjaUFESUFWMmFrRUNkRUc0MG9DQUFHb29BZ0FoQXdzZ0EwVU5BUXNEUUNBREtBSUVRWGh4SUFKcklnWWdCRWtoQUFKQUlBTW9BaEFpQlEwQUlBTkJGR29vQWdBaEJRc2dCaUFFSUFBYklRUWdBeUFJSUFBYklRZ2dCU0VESUFVTkFBc0xJQWhGRFFBZ0JFRUFLQUtRMElDQUFDQUNhMDhOQUNBSUtBSVlJUXNDUUNBSUtBSU1JZ0FnQ0VZTkFDQUlLQUlJSWdOQkFDZ0NtTkNBZ0FCSkdpQUFJQU0yQWdnZ0F5QUFOZ0lNREFrTEFrQWdDRUVVYWlJRktBSUFJZ01OQUNBSUtBSVFJZ05GRFFNZ0NFRVFhaUVGQ3dOQUlBVWhCaUFESWdCQkZHb2lCU2dDQUNJRERRQWdBRUVRYWlFRklBQW9BaEFpQXcwQUN5QUdRUUEyQWdBTUNBc0NRRUVBS0FLUTBJQ0FBQ0lESUFKSkRRQkJBQ2dDbk5DQWdBQWhCQUpBQWtBZ0F5QUNheUlGUVJCSkRRQWdCQ0FDYWlJQUlBVkJBWEkyQWdSQkFDQUZOZ0tRMElDQUFFRUFJQUEyQXB6UWdJQUFJQVFnQTJvZ0JUWUNBQ0FFSUFKQkEzSTJBZ1FNQVFzZ0JDQURRUU55TmdJRUlBUWdBMm9pQXlBREtBSUVRUUZ5TmdJRVFRQkJBRFlDbk5DQWdBQkJBRUVBTmdLUTBJQ0FBQXNnQkVFSWFpRUREQW9MQWtCQkFDZ0NsTkNBZ0FBaUFDQUNUUTBBUVFBb0FxRFFnSUFBSWdNZ0Ftb2lCQ0FBSUFKcklnVkJBWEkyQWdSQkFDQUZOZ0tVMElDQUFFRUFJQVEyQXFEUWdJQUFJQU1nQWtFRGNqWUNCQ0FEUVFocUlRTU1DZ3NDUUFKQVFRQW9BdURUZ0lBQVJRMEFRUUFvQXVqVGdJQUFJUVFNQVF0QkFFSi9Od0xzMDRDQUFFRUFRb0NBaElDQWdNQUFOd0xrMDRDQUFFRUFJQUZCREdwQmNIRkIyS3JWcWdWek5nTGcwNENBQUVFQVFRQTJBdlRUZ0lBQVFRQkJBRFlDeE5PQWdBQkJnSUFFSVFRTFFRQWhBd0pBSUFRZ0FrSEhBR29pQjJvaUJrRUFJQVJySWd0eElnZ2dBa3NOQUVFQVFUQTJBdmpUZ0lBQURBb0xBa0JCQUNnQ3dOT0FnQUFpQTBVTkFBSkFRUUFvQXJqVGdJQUFJZ1FnQ0dvaUJTQUVUUTBBSUFVZ0EwME5BUXRCQUNFRFFRQkJNRFlDK05PQWdBQU1DZ3RCQUMwQXhOT0FnQUJCQkhFTkJBSkFBa0FDUUVFQUtBS2cwSUNBQUNJRVJRMEFRY2pUZ0lBQUlRTURRQUpBSUFNb0FnQWlCU0FFU3cwQUlBVWdBeWdDQkdvZ0JFc05Bd3NnQXlnQ0NDSUREUUFMQzBFQUVNdUFnSUFBSWdCQmYwWU5CU0FJSVFZQ1FFRUFLQUxrMDRDQUFDSURRWDlxSWdRZ0FIRkZEUUFnQ0NBQWF5QUVJQUJxUVFBZ0EydHhhaUVHQ3lBR0lBSk5EUVVnQmtIKy8vLy9CMHNOQlFKQVFRQW9Bc0RUZ0lBQUlnTkZEUUJCQUNnQ3VOT0FnQUFpQkNBR2FpSUZJQVJORFFZZ0JTQURTdzBHQ3lBR0VNdUFnSUFBSWdNZ0FFY05BUXdIQ3lBR0lBQnJJQXR4SWdaQi92Ly8vd2RMRFFRZ0JoRExnSUNBQUNJQUlBTW9BZ0FnQXlnQ0JHcEdEUU1nQUNFREN3SkFJQU5CZjBZTkFDQUNRY2dBYWlBR1RRMEFBa0FnQnlBR2EwRUFLQUxvMDRDQUFDSUVha0VBSUFScmNTSUVRZjcvLy84SFRRMEFJQU1oQUF3SEN3SkFJQVFReTRDQWdBQkJmMFlOQUNBRUlBWnFJUVlnQXlFQURBY0xRUUFnQm1zUXk0Q0FnQUFhREFRTElBTWhBQ0FEUVg5SERRVU1Bd3RCQUNFSURBY0xRUUFoQUF3RkN5QUFRWDlIRFFJTFFRQkJBQ2dDeE5PQWdBQkJCSEkyQXNUVGdJQUFDeUFJUWY3Ly8vOEhTdzBCSUFnUXk0Q0FnQUFoQUVFQUVNdUFnSUFBSVFNZ0FFRi9SZzBCSUFOQmYwWU5BU0FBSUFOUERRRWdBeUFBYXlJR0lBSkJPR3BORFFFTFFRQkJBQ2dDdU5PQWdBQWdCbW9pQXpZQ3VOT0FnQUFDUUNBRFFRQW9BcnpUZ0lBQVRRMEFRUUFnQXpZQ3ZOT0FnQUFMQWtBQ1FBSkFBa0JCQUNnQ29OQ0FnQUFpQkVVTkFFSEkwNENBQUNFREEwQWdBQ0FES0FJQUlnVWdBeWdDQkNJSWFrWU5BaUFES0FJSUlnTU5BQXdEQ3dzQ1FBSkFRUUFvQXBqUWdJQUFJZ05GRFFBZ0FDQURUdzBCQzBFQUlBQTJBcGpRZ0lBQUMwRUFJUU5CQUNBR05nTE0wNENBQUVFQUlBQTJBc2pUZ0lBQVFRQkJmellDcU5DQWdBQkJBRUVBS0FMZzA0Q0FBRFlDck5DQWdBQkJBRUVBTmdMVTA0Q0FBQU5BSUFOQnhOQ0FnQUJxSUFOQnVOQ0FnQUJxSWdRMkFnQWdCQ0FEUWJEUWdJQUFhaUlGTmdJQUlBTkJ2TkNBZ0FCcUlBVTJBZ0FnQTBITTBJQ0FBR29nQTBIQTBJQ0FBR29pQlRZQ0FDQUZJQVEyQWdBZ0EwSFUwSUNBQUdvZ0EwSEkwSUNBQUdvaUJEWUNBQ0FFSUFVMkFnQWdBMEhRMElDQUFHb2dCRFlDQUNBRFFTQnFJZ05CZ0FKSERRQUxJQUJCZUNBQWEwRVBjVUVBSUFCQkNHcEJEM0ViSWdOcUlnUWdCa0ZJYWlJRklBTnJJZ05CQVhJMkFnUkJBRUVBS0FMdzA0Q0FBRFlDcE5DQWdBQkJBQ0FETmdLVTBJQ0FBRUVBSUFRMkFxRFFnSUFBSUFBZ0JXcEJPRFlDQkF3Q0N5QURMUUFNUVFoeERRQWdCQ0FGU1EwQUlBUWdBRThOQUNBRVFYZ2dCR3RCRDNGQkFDQUVRUWhxUVE5eEd5SUZhaUlBUVFBb0FwVFFnSUFBSUFacUlnc2dCV3NpQlVFQmNqWUNCQ0FESUFnZ0JtbzJBZ1JCQUVFQUtBTHcwNENBQURZQ3BOQ0FnQUJCQUNBRk5nS1UwSUNBQUVFQUlBQTJBcURRZ0lBQUlBUWdDMnBCT0RZQ0JBd0JDd0pBSUFCQkFDZ0NtTkNBZ0FBaUNFOE5BRUVBSUFBMkFwalFnSUFBSUFBaENBc2dBQ0FHYWlFRlFjalRnSUFBSVFNQ1FBSkFBa0FDUUFKQUFrQUNRQU5BSUFNb0FnQWdCVVlOQVNBREtBSUlJZ01OQUF3Q0N3c2dBeTBBREVFSWNVVU5BUXRCeU5PQWdBQWhBd05BQWtBZ0F5Z0NBQ0lGSUFSTERRQWdCU0FES0FJRWFpSUZJQVJMRFFNTElBTW9BZ2doQXd3QUN3c2dBeUFBTmdJQUlBTWdBeWdDQkNBR2FqWUNCQ0FBUVhnZ0FHdEJEM0ZCQUNBQVFRaHFRUTl4RzJvaUN5QUNRUU55TmdJRUlBVkJlQ0FGYTBFUGNVRUFJQVZCQ0dwQkQzRWJhaUlHSUFzZ0Ftb2lBbXNoQXdKQUlBWWdCRWNOQUVFQUlBSTJBcURRZ0lBQVFRQkJBQ2dDbE5DQWdBQWdBMm9pQXpZQ2xOQ0FnQUFnQWlBRFFRRnlOZ0lFREFNTEFrQWdCa0VBS0FLYzBJQ0FBRWNOQUVFQUlBSTJBcHpRZ0lBQVFRQkJBQ2dDa05DQWdBQWdBMm9pQXpZQ2tOQ0FnQUFnQWlBRFFRRnlOZ0lFSUFJZ0Eyb2dBellDQUF3REN3SkFJQVlvQWdRaUJFRURjVUVCUncwQUlBUkJlSEVoQndKQUFrQWdCRUgvQVVzTkFDQUdLQUlJSWdVZ0JFRURkaUlJUVFOMFFiRFFnSUFBYWlJQVJob0NRQ0FHS0FJTUlnUWdCVWNOQUVFQVFRQW9Bb2pRZ0lBQVFYNGdDSGR4TmdLSTBJQ0FBQXdDQ3lBRUlBQkdHaUFFSUFVMkFnZ2dCU0FFTmdJTURBRUxJQVlvQWhnaENRSkFBa0FnQmlnQ0RDSUFJQVpHRFFBZ0JpZ0NDQ0lFSUFoSkdpQUFJQVEyQWdnZ0JDQUFOZ0lNREFFTEFrQWdCa0VVYWlJRUtBSUFJZ1VOQUNBR1FSQnFJZ1FvQWdBaUJRMEFRUUFoQUF3QkN3TkFJQVFoQ0NBRklnQkJGR29pQkNnQ0FDSUZEUUFnQUVFUWFpRUVJQUFvQWhBaUJRMEFDeUFJUVFBMkFnQUxJQWxGRFFBQ1FBSkFJQVlnQmlnQ0hDSUZRUUowUWJqU2dJQUFhaUlFS0FJQVJ3MEFJQVFnQURZQ0FDQUFEUUZCQUVFQUtBS00wSUNBQUVGK0lBVjNjVFlDak5DQWdBQU1BZ3NnQ1VFUVFSUWdDU2dDRUNBR1JodHFJQUEyQWdBZ0FFVU5BUXNnQUNBSk5nSVlBa0FnQmlnQ0VDSUVSUTBBSUFBZ0JEWUNFQ0FFSUFBMkFoZ0xJQVlvQWhRaUJFVU5BQ0FBUVJScUlBUTJBZ0FnQkNBQU5nSVlDeUFISUFOcUlRTWdCaUFIYWlJR0tBSUVJUVFMSUFZZ0JFRitjVFlDQkNBQ0lBTnFJQU0yQWdBZ0FpQURRUUZ5TmdJRUFrQWdBMEgvQVVzTkFDQURRWGh4UWJEUWdJQUFhaUVFQWtBQ1FFRUFLQUtJMElDQUFDSUZRUUVnQTBFRGRuUWlBM0VOQUVFQUlBVWdBM0kyQW9qUWdJQUFJQVFoQXd3QkN5QUVLQUlJSVFNTElBTWdBallDRENBRUlBSTJBZ2dnQWlBRU5nSU1JQUlnQXpZQ0NBd0RDMEVmSVFRQ1FDQURRZi8vL3dkTERRQWdBMEVJZGlJRUlBUkJnUDQvYWtFUWRrRUljU0lFZENJRklBVkJnT0FmYWtFUWRrRUVjU0lGZENJQUlBQkJnSUFQYWtFUWRrRUNjU0lBZEVFUGRpQUVJQVZ5SUFCeWF5SUVRUUYwSUFNZ0JFRVZhblpCQVhGeVFSeHFJUVFMSUFJZ0JEWUNIQ0FDUWdBM0FoQWdCRUVDZEVHNDBvQ0FBR29oQlFKQVFRQW9Bb3pRZ0lBQUlnQkJBU0FFZENJSWNRMEFJQVVnQWpZQ0FFRUFJQUFnQ0hJMkFvelFnSUFBSUFJZ0JUWUNHQ0FDSUFJMkFnZ2dBaUFDTmdJTURBTUxJQU5CQUVFWklBUkJBWFpySUFSQkgwWWJkQ0VFSUFVb0FnQWhBQU5BSUFBaUJTZ0NCRUY0Y1NBRFJnMENJQVJCSFhZaEFDQUVRUUYwSVFRZ0JTQUFRUVJ4YWtFUWFpSUlLQUlBSWdBTkFBc2dDQ0FDTmdJQUlBSWdCVFlDR0NBQ0lBSTJBZ3dnQWlBQ05nSUlEQUlMSUFCQmVDQUFhMEVQY1VFQUlBQkJDR3BCRDNFYklnTnFJZ3NnQmtGSWFpSUlJQU5ySWdOQkFYSTJBZ1FnQUNBSWFrRTROZ0lFSUFRZ0JVRTNJQVZyUVE5eFFRQWdCVUZKYWtFUGNSdHFRVUZxSWdnZ0NDQUVRUkJxU1JzaUNFRWpOZ0lFUVFCQkFDZ0M4Tk9BZ0FBMkFxVFFnSUFBUVFBZ0F6WUNsTkNBZ0FCQkFDQUxOZ0tnMElDQUFDQUlRUkJxUVFBcEF0RFRnSUFBTndJQUlBaEJBQ2tDeU5PQWdBQTNBZ2hCQUNBSVFRaHFOZ0xRMDRDQUFFRUFJQVkyQXN6VGdJQUFRUUFnQURZQ3lOT0FnQUJCQUVFQU5nTFUwNENBQUNBSVFTUnFJUU1EUUNBRFFRYzJBZ0FnQTBFRWFpSURJQVZKRFFBTElBZ2dCRVlOQXlBSUlBZ29BZ1JCZm5FMkFnUWdDQ0FJSUFScklnQTJBZ0FnQkNBQVFRRnlOZ0lFQWtBZ0FFSC9BVXNOQUNBQVFYaHhRYkRRZ0lBQWFpRURBa0FDUUVFQUtBS0kwSUNBQUNJRlFRRWdBRUVEZG5RaUFIRU5BRUVBSUFVZ0FISTJBb2pRZ0lBQUlBTWhCUXdCQ3lBREtBSUlJUVVMSUFVZ0JEWUNEQ0FESUFRMkFnZ2dCQ0FETmdJTUlBUWdCVFlDQ0F3RUMwRWZJUU1DUUNBQVFmLy8vd2RMRFFBZ0FFRUlkaUlESUFOQmdQNC9ha0VRZGtFSWNTSURkQ0lGSUFWQmdPQWZha0VRZGtFRWNTSUZkQ0lJSUFoQmdJQVBha0VRZGtFQ2NTSUlkRUVQZGlBRElBVnlJQWh5YXlJRFFRRjBJQUFnQTBFVmFuWkJBWEZ5UVJ4cUlRTUxJQVFnQXpZQ0hDQUVRZ0EzQWhBZ0EwRUNkRUc0MG9DQUFHb2hCUUpBUVFBb0FvelFnSUFBSWdoQkFTQURkQ0lHY1EwQUlBVWdCRFlDQUVFQUlBZ2dCbkkyQW96UWdJQUFJQVFnQlRZQ0dDQUVJQVEyQWdnZ0JDQUVOZ0lNREFRTElBQkJBRUVaSUFOQkFYWnJJQU5CSDBZYmRDRURJQVVvQWdBaENBTkFJQWdpQlNnQ0JFRjRjU0FBUmcwRElBTkJIWFloQ0NBRFFRRjBJUU1nQlNBSVFRUnhha0VRYWlJR0tBSUFJZ2dOQUFzZ0JpQUVOZ0lBSUFRZ0JUWUNHQ0FFSUFRMkFnd2dCQ0FFTmdJSURBTUxJQVVvQWdnaUF5QUNOZ0lNSUFVZ0FqWUNDQ0FDUVFBMkFoZ2dBaUFGTmdJTUlBSWdBellDQ0FzZ0MwRUlhaUVEREFVTElBVW9BZ2dpQXlBRU5nSU1JQVVnQkRZQ0NDQUVRUUEyQWhnZ0JDQUZOZ0lNSUFRZ0F6WUNDQXRCQUNnQ2xOQ0FnQUFpQXlBQ1RRMEFRUUFvQXFEUWdJQUFJZ1FnQW1vaUJTQURJQUpySWdOQkFYSTJBZ1JCQUNBRE5nS1UwSUNBQUVFQUlBVTJBcURRZ0lBQUlBUWdBa0VEY2pZQ0JDQUVRUWhxSVFNTUF3dEJBQ0VEUVFCQk1EWUMrTk9BZ0FBTUFnc0NRQ0FMUlEwQUFrQUNRQ0FJSUFnb0Fod2lCVUVDZEVHNDBvQ0FBR29pQXlnQ0FFY05BQ0FESUFBMkFnQWdBQTBCUVFBZ0IwRitJQVYzY1NJSE5nS00wSUNBQUF3Q0N5QUxRUkJCRkNBTEtBSVFJQWhHRzJvZ0FEWUNBQ0FBUlEwQkN5QUFJQXMyQWhnQ1FDQUlLQUlRSWdORkRRQWdBQ0FETmdJUUlBTWdBRFlDR0FzZ0NFRVVhaWdDQUNJRFJRMEFJQUJCRkdvZ0F6WUNBQ0FESUFBMkFoZ0xBa0FDUUNBRVFROUxEUUFnQ0NBRUlBSnFJZ05CQTNJMkFnUWdDQ0FEYWlJRElBTW9BZ1JCQVhJMkFnUU1BUXNnQ0NBQ2FpSUFJQVJCQVhJMkFnUWdDQ0FDUVFOeU5nSUVJQUFnQkdvZ0JEWUNBQUpBSUFSQi93RkxEUUFnQkVGNGNVR3cwSUNBQUdvaEF3SkFBa0JCQUNnQ2lOQ0FnQUFpQlVFQklBUkJBM1owSWdSeERRQkJBQ0FGSUFSeU5nS0kwSUNBQUNBRElRUU1BUXNnQXlnQ0NDRUVDeUFFSUFBMkFnd2dBeUFBTmdJSUlBQWdBellDRENBQUlBUTJBZ2dNQVF0Qkh5RURBa0FnQkVILy8vOEhTdzBBSUFSQkNIWWlBeUFEUVlEK1AycEJFSFpCQ0hFaUEzUWlCU0FGUVlEZ0gycEJFSFpCQkhFaUJYUWlBaUFDUVlDQUQycEJFSFpCQW5FaUFuUkJEM1lnQXlBRmNpQUNjbXNpQTBFQmRDQUVJQU5CRldwMlFRRnhja0VjYWlFREN5QUFJQU0yQWh3Z0FFSUFOd0lRSUFOQkFuUkJ1TktBZ0FCcUlRVUNRQ0FIUVFFZ0EzUWlBbkVOQUNBRklBQTJBZ0JCQUNBSElBSnlOZ0tNMElDQUFDQUFJQVUyQWhnZ0FDQUFOZ0lJSUFBZ0FEWUNEQXdCQ3lBRVFRQkJHU0FEUVFGMmF5QURRUjlHRzNRaEF5QUZLQUlBSVFJQ1FBTkFJQUlpQlNnQ0JFRjRjU0FFUmcwQklBTkJIWFloQWlBRFFRRjBJUU1nQlNBQ1FRUnhha0VRYWlJR0tBSUFJZ0lOQUFzZ0JpQUFOZ0lBSUFBZ0JUWUNHQ0FBSUFBMkFnd2dBQ0FBTmdJSURBRUxJQVVvQWdnaUF5QUFOZ0lNSUFVZ0FEWUNDQ0FBUVFBMkFoZ2dBQ0FGTmdJTUlBQWdBellDQ0FzZ0NFRUlhaUVEREFFTEFrQWdDa1VOQUFKQUFrQWdBQ0FBS0FJY0lnVkJBblJCdU5LQWdBQnFJZ01vQWdCSERRQWdBeUFJTmdJQUlBZ05BVUVBSUFsQmZpQUZkM0UyQW96UWdJQUFEQUlMSUFwQkVFRVVJQW9vQWhBZ0FFWWJhaUFJTmdJQUlBaEZEUUVMSUFnZ0NqWUNHQUpBSUFBb0FoQWlBMFVOQUNBSUlBTTJBaEFnQXlBSU5nSVlDeUFBUVJScUtBSUFJZ05GRFFBZ0NFRVVhaUFETmdJQUlBTWdDRFlDR0FzQ1FBSkFJQVJCRDBzTkFDQUFJQVFnQW1vaUEwRURjallDQkNBQUlBTnFJZ01nQXlnQ0JFRUJjallDQkF3QkN5QUFJQUpxSWdVZ0JFRUJjallDQkNBQUlBSkJBM0kyQWdRZ0JTQUVhaUFFTmdJQUFrQWdCMFVOQUNBSFFYaHhRYkRRZ0lBQWFpRUNRUUFvQXB6UWdJQUFJUU1DUUFKQVFRRWdCMEVEZG5RaUNDQUdjUTBBUVFBZ0NDQUdjallDaU5DQWdBQWdBaUVJREFFTElBSW9BZ2doQ0FzZ0NDQUROZ0lNSUFJZ0F6WUNDQ0FESUFJMkFnd2dBeUFJTmdJSUMwRUFJQVUyQXB6UWdJQUFRUUFnQkRZQ2tOQ0FnQUFMSUFCQkNHb2hBd3NnQVVFUWFpU0FnSUNBQUNBREN3b0FJQUFReVlDQWdBQUw0ZzBCQjM4Q1FDQUFSUTBBSUFCQmVHb2lBU0FBUVh4cUtBSUFJZ0pCZUhFaUFHb2hBd0pBSUFKQkFYRU5BQ0FDUVFOeFJRMEJJQUVnQVNnQ0FDSUNheUlCUVFBb0FwalFnSUFBSWdSSkRRRWdBaUFBYWlFQUFrQWdBVUVBS0FLYzBJQ0FBRVlOQUFKQUlBSkIvd0ZMRFFBZ0FTZ0NDQ0lFSUFKQkEzWWlCVUVEZEVHdzBJQ0FBR29pQmtZYUFrQWdBU2dDRENJQ0lBUkhEUUJCQUVFQUtBS0kwSUNBQUVGK0lBVjNjVFlDaU5DQWdBQU1Bd3NnQWlBR1Job2dBaUFFTmdJSUlBUWdBallDREF3Q0N5QUJLQUlZSVFjQ1FBSkFJQUVvQWd3aUJpQUJSZzBBSUFFb0FnZ2lBaUFFU1JvZ0JpQUNOZ0lJSUFJZ0JqWUNEQXdCQ3dKQUlBRkJGR29pQWlnQ0FDSUVEUUFnQVVFUWFpSUNLQUlBSWdRTkFFRUFJUVlNQVFzRFFDQUNJUVVnQkNJR1FSUnFJZ0lvQWdBaUJBMEFJQVpCRUdvaEFpQUdLQUlRSWdRTkFBc2dCVUVBTmdJQUN5QUhSUTBCQWtBQ1FDQUJJQUVvQWh3aUJFRUNkRUc0MG9DQUFHb2lBaWdDQUVjTkFDQUNJQVkyQWdBZ0JnMEJRUUJCQUNnQ2pOQ0FnQUJCZmlBRWQzRTJBb3pRZ0lBQURBTUxJQWRCRUVFVUlBY29BaEFnQVVZYmFpQUdOZ0lBSUFaRkRRSUxJQVlnQnpZQ0dBSkFJQUVvQWhBaUFrVU5BQ0FHSUFJMkFoQWdBaUFHTmdJWUN5QUJLQUlVSWdKRkRRRWdCa0VVYWlBQ05nSUFJQUlnQmpZQ0dBd0JDeUFES0FJRUlnSkJBM0ZCQTBjTkFDQURJQUpCZm5FMkFnUkJBQ0FBTmdLUTBJQ0FBQ0FCSUFCcUlBQTJBZ0FnQVNBQVFRRnlOZ0lFRHdzZ0FTQURUdzBBSUFNb0FnUWlBa0VCY1VVTkFBSkFBa0FnQWtFQ2NRMEFBa0FnQTBFQUtBS2cwSUNBQUVjTkFFRUFJQUUyQXFEUWdJQUFRUUJCQUNnQ2xOQ0FnQUFnQUdvaUFEWUNsTkNBZ0FBZ0FTQUFRUUZ5TmdJRUlBRkJBQ2dDbk5DQWdBQkhEUU5CQUVFQU5nS1EwSUNBQUVFQVFRQTJBcHpRZ0lBQUR3c0NRQ0FEUVFBb0FwelFnSUFBUncwQVFRQWdBVFlDbk5DQWdBQkJBRUVBS0FLUTBJQ0FBQ0FBYWlJQU5nS1EwSUNBQUNBQklBQkJBWEkyQWdRZ0FTQUFhaUFBTmdJQUR3c2dBa0Y0Y1NBQWFpRUFBa0FDUUNBQ1FmOEJTdzBBSUFNb0FnZ2lCQ0FDUVFOMklnVkJBM1JCc05DQWdBQnFJZ1pHR2dKQUlBTW9BZ3dpQWlBRVJ3MEFRUUJCQUNnQ2lOQ0FnQUJCZmlBRmQzRTJBb2pRZ0lBQURBSUxJQUlnQmtZYUlBSWdCRFlDQ0NBRUlBSTJBZ3dNQVFzZ0F5Z0NHQ0VIQWtBQ1FDQURLQUlNSWdZZ0EwWU5BQ0FES0FJSUlnSkJBQ2dDbU5DQWdBQkpHaUFHSUFJMkFnZ2dBaUFHTmdJTURBRUxBa0FnQTBFVWFpSUNLQUlBSWdRTkFDQURRUkJxSWdJb0FnQWlCQTBBUVFBaEJnd0JDd05BSUFJaEJTQUVJZ1pCRkdvaUFpZ0NBQ0lFRFFBZ0JrRVFhaUVDSUFZb0FoQWlCQTBBQ3lBRlFRQTJBZ0FMSUFkRkRRQUNRQUpBSUFNZ0F5Z0NIQ0lFUVFKMFFialNnSUFBYWlJQ0tBSUFSdzBBSUFJZ0JqWUNBQ0FHRFFGQkFFRUFLQUtNMElDQUFFRitJQVIzY1RZQ2pOQ0FnQUFNQWdzZ0IwRVFRUlFnQnlnQ0VDQURSaHRxSUFZMkFnQWdCa1VOQVFzZ0JpQUhOZ0lZQWtBZ0F5Z0NFQ0lDUlEwQUlBWWdBallDRUNBQ0lBWTJBaGdMSUFNb0FoUWlBa1VOQUNBR1FSUnFJQUkyQWdBZ0FpQUdOZ0lZQ3lBQklBQnFJQUEyQWdBZ0FTQUFRUUZ5TmdJRUlBRkJBQ2dDbk5DQWdBQkhEUUZCQUNBQU5nS1EwSUNBQUE4TElBTWdBa0YrY1RZQ0JDQUJJQUJxSUFBMkFnQWdBU0FBUVFGeU5nSUVDd0pBSUFCQi93RkxEUUFnQUVGNGNVR3cwSUNBQUdvaEFnSkFBa0JCQUNnQ2lOQ0FnQUFpQkVFQklBQkJBM1owSWdCeERRQkJBQ0FFSUFCeU5nS0kwSUNBQUNBQ0lRQU1BUXNnQWlnQ0NDRUFDeUFBSUFFMkFnd2dBaUFCTmdJSUlBRWdBallDRENBQklBQTJBZ2dQQzBFZklRSUNRQ0FBUWYvLy93ZExEUUFnQUVFSWRpSUNJQUpCZ1A0L2FrRVFka0VJY1NJQ2RDSUVJQVJCZ09BZmFrRVFka0VFY1NJRWRDSUdJQVpCZ0lBUGFrRVFka0VDY1NJR2RFRVBkaUFDSUFSeUlBWnlheUlDUVFGMElBQWdBa0VWYW5aQkFYRnlRUnhxSVFJTElBRWdBallDSENBQlFnQTNBaEFnQWtFQ2RFRzQwb0NBQUdvaEJBSkFBa0JCQUNnQ2pOQ0FnQUFpQmtFQklBSjBJZ054RFFBZ0JDQUJOZ0lBUVFBZ0JpQURjallDak5DQWdBQWdBU0FFTmdJWUlBRWdBVFlDQ0NBQklBRTJBZ3dNQVFzZ0FFRUFRUmtnQWtFQmRtc2dBa0VmUmh0MElRSWdCQ2dDQUNFR0FrQURRQ0FHSWdRb0FnUkJlSEVnQUVZTkFTQUNRUjEySVFZZ0FrRUJkQ0VDSUFRZ0JrRUVjV3BCRUdvaUF5Z0NBQ0lHRFFBTElBTWdBVFlDQUNBQklBUTJBaGdnQVNBQk5nSU1JQUVnQVRZQ0NBd0JDeUFFS0FJSUlnQWdBVFlDRENBRUlBRTJBZ2dnQVVFQU5nSVlJQUVnQkRZQ0RDQUJJQUEyQWdnTFFRQkJBQ2dDcU5DQWdBQkJmMm9pQVVGL0lBRWJOZ0tvMElDQUFBc0xCQUFBQUF0T0FBSkFJQUFOQUQ4QVFSQjBEd3NDUUNBQVFmLy9BM0VOQUNBQVFYOU1EUUFDUUNBQVFSQjJRQUFpQUVGL1J3MEFRUUJCTURZQytOT0FnQUJCZnc4TElBQkJFSFFQQ3hES2dJQ0FBQUFMOGdJQ0EzOEJmZ0pBSUFKRkRRQWdBQ0FCT2dBQUlBSWdBR29pQTBGL2FpQUJPZ0FBSUFKQkEwa05BQ0FBSUFFNkFBSWdBQ0FCT2dBQklBTkJmV29nQVRvQUFDQURRWDVxSUFFNkFBQWdBa0VIU1EwQUlBQWdBVG9BQXlBRFFYeHFJQUU2QUFBZ0FrRUpTUTBBSUFCQkFDQUFhMEVEY1NJRWFpSURJQUZCL3dGeFFZR0NoQWhzSWdFMkFnQWdBeUFDSUFSclFYeHhJZ1JxSWdKQmZHb2dBVFlDQUNBRVFRbEpEUUFnQXlBQk5nSUlJQU1nQVRZQ0JDQUNRWGhxSUFFMkFnQWdBa0YwYWlBQk5nSUFJQVJCR1VrTkFDQURJQUUyQWhnZ0F5QUJOZ0lVSUFNZ0FUWUNFQ0FESUFFMkFnd2dBa0Z3YWlBQk5nSUFJQUpCYkdvZ0FUWUNBQ0FDUVdocUlBRTJBZ0FnQWtGa2FpQUJOZ0lBSUFRZ0EwRUVjVUVZY2lJRmF5SUNRU0JKRFFBZ0FhMUNnWUNBZ0JCK0lRWWdBeUFGYWlFQkEwQWdBU0FHTndNWUlBRWdCamNERUNBQklBWTNBd2dnQVNBR053TUFJQUZCSUdvaEFTQUNRV0JxSWdKQkgwc05BQXNMSUFBTEM0NUlBUUJCZ0FnTGhrZ0JBQUFBQWdBQUFBTUFBQUFBQUFBQUFBQUFBQVFBQUFBRkFBQUFBQUFBQUFBQUFBQUdBQUFBQndBQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRWx1ZG1Gc2FXUWdZMmhoY2lCcGJpQjFjbXdnY1hWbGNua0FVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOWliMlI1QUVOdmJuUmxiblF0VEdWdVozUm9JRzkyWlhKbWJHOTNBRU5vZFc1cklITnBlbVVnYjNabGNtWnNiM2NBVW1WemNHOXVjMlVnYjNabGNtWnNiM2NBU1c1MllXeHBaQ0J0WlhSb2IyUWdabTl5SUVoVVZGQXZlQzU0SUhKbGNYVmxjM1FBU1c1MllXeHBaQ0J0WlhSb2IyUWdabTl5SUZKVVUxQXZlQzU0SUhKbGNYVmxjM1FBUlhod1pXTjBaV1FnVTA5VlVrTkZJRzFsZEdodlpDQm1iM0lnU1VORkwzZ3VlQ0J5WlhGMVpYTjBBRWx1ZG1Gc2FXUWdZMmhoY2lCcGJpQjFjbXdnWm5KaFoyMWxiblFnYzNSaGNuUUFSWGh3WldOMFpXUWdaRzkwQUZOd1lXNGdZMkZzYkdKaFkyc2daWEp5YjNJZ2FXNGdiMjVmYzNSaGRIVnpBRWx1ZG1Gc2FXUWdjbVZ6Y0c5dWMyVWdjM1JoZEhWekFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklHVjRkR1Z1YzJsdmJuTUFWWE5sY2lCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmNtVnpaWFJnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5amFIVnVhMTlvWldGa1pYSmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDl0WlhOellXZGxYMkpsWjJsdVlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZZMmgxYm10ZlpYaDBaVzV6YVc5dVgzWmhiSFZsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmMzUmhkSFZ6WDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmRtVnljMmx2Ymw5amIyMXdiR1YwWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgzVnliRjlqYjIxd2JHVjBaV0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDJOb2RXNXJYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmYUdWaFpHVnlYM1poYkhWbFgyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpXQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMjFsZEdodlpGOWpiMjF3YkdWMFpXQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMmhsWVdSbGNsOW1hV1ZzWkY5amIyMXdiR1YwWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgyTm9kVzVyWDJWNGRHVnVjMmx2Ymw5dVlXMWxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQlZibVY0Y0dWamRHVmtJR05vWVhJZ2FXNGdkWEpzSUhObGNuWmxjZ0JKYm5aaGJHbGtJR2hsWVdSbGNpQjJZV3gxWlNCamFHRnlBRWx1ZG1Gc2FXUWdhR1ZoWkdWeUlHWnBaV3hrSUdOb1lYSUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOTJaWEp6YVc5dUFFbHVkbUZzYVdRZ2JXbHViM0lnZG1WeWMybHZiZ0JKYm5aaGJHbGtJRzFoYW05eUlIWmxjbk5wYjI0QVJYaHdaV04wWldRZ2MzQmhZMlVnWVdaMFpYSWdkbVZ5YzJsdmJnQkZlSEJsWTNSbFpDQkRVa3hHSUdGbWRHVnlJSFpsY25OcGIyNEFTVzUyWVd4cFpDQklWRlJRSUhabGNuTnBiMjRBU1c1MllXeHBaQ0JvWldGa1pYSWdkRzlyWlc0QVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5MWNtd0FTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSnpJR2x1SUhWeWJBQlZibVY0Y0dWamRHVmtJSE4wWVhKMElHTm9ZWElnYVc0Z2RYSnNBRVJ2ZFdKc1pTQkFJR2x1SUhWeWJBQkZiWEIwZVNCRGIyNTBaVzUwTFV4bGJtZDBhQUJKYm5aaGJHbGtJR05vWVhKaFkzUmxjaUJwYmlCRGIyNTBaVzUwTFV4bGJtZDBhQUJFZFhCc2FXTmhkR1VnUTI5dWRHVnVkQzFNWlc1bmRHZ0FTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0J3WVhSb0FFTnZiblJsYm5RdFRHVnVaM1JvSUdOaGJpZDBJR0psSUhCeVpYTmxiblFnZDJsMGFDQlVjbUZ1YzJabGNpMUZibU52WkdsdVp3QkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJqYUhWdWF5QnphWHBsQUZOd1lXNGdZMkZzYkdKaFkyc2daWEp5YjNJZ2FXNGdiMjVmYUdWaFpHVnlYM1poYkhWbEFGTndZVzRnWTJGc2JHSmhZMnNnWlhKeWIzSWdhVzRnYjI1ZlkyaDFibXRmWlhoMFpXNXphVzl1WDNaaGJIVmxBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJR1Y0ZEdWdWMybHZibk1nZG1Gc2RXVUFUV2x6YzJsdVp5QmxlSEJsWTNSbFpDQk1SaUJoWm5SbGNpQm9aV0ZrWlhJZ2RtRnNkV1VBU1c1MllXeHBaQ0JnVkhKaGJuTm1aWEl0Ulc1amIyUnBibWRnSUdobFlXUmxjaUIyWVd4MVpRQkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJqYUhWdWF5QmxlSFJsYm5OcGIyNXpJSEYxYjNSbElIWmhiSFZsQUVsdWRtRnNhV1FnWTJoaGNtRmpkR1Z5SUdsdUlHTm9kVzVySUdWNGRHVnVjMmx2Ym5NZ2NYVnZkR1ZrSUhaaGJIVmxBRkJoZFhObFpDQmllU0J2Ymw5b1pXRmtaWEp6WDJOdmJYQnNaWFJsQUVsdWRtRnNhV1FnUlU5R0lITjBZWFJsQUc5dVgzSmxjMlYwSUhCaGRYTmxBRzl1WDJOb2RXNXJYMmhsWVdSbGNpQndZWFZ6WlFCdmJsOXRaWE56WVdkbFgySmxaMmx1SUhCaGRYTmxBRzl1WDJOb2RXNXJYMlY0ZEdWdWMybHZibDkyWVd4MVpTQndZWFZ6WlFCdmJsOXpkR0YwZFhOZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmRtVnljMmx2Ymw5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5MWNteGZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZZMmgxYm10ZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmFHVmhaR1Z5WDNaaGJIVmxYMk52YlhCc1pYUmxJSEJoZFhObEFHOXVYMjFsYzNOaFoyVmZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZiV1YwYUc5a1gyTnZiWEJzWlhSbElIQmhkWE5sQUc5dVgyaGxZV1JsY2w5bWFXVnNaRjlqYjIxd2JHVjBaU0J3WVhWelpRQnZibDlqYUhWdWExOWxlSFJsYm5OcGIyNWZibUZ0WlNCd1lYVnpaUUJWYm1WNGNHVmpkR1ZrSUhOd1lXTmxJR0ZtZEdWeUlITjBZWEowSUd4cGJtVUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmJtRnRaUUJKYm5aaGJHbGtJR05vWVhKaFkzUmxjaUJwYmlCamFIVnVheUJsZUhSbGJuTnBiMjV6SUc1aGJXVUFVR0YxYzJVZ2IyNGdRMDlPVGtWRFZDOVZjR2R5WVdSbEFGQmhkWE5sSUc5dUlGQlNTUzlWY0dkeVlXUmxBRVY0Y0dWamRHVmtJRWhVVkZBdk1pQkRiMjV1WldOMGFXOXVJRkJ5WldaaFkyVUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOXRaWFJvYjJRQVJYaHdaV04wWldRZ2MzQmhZMlVnWVdaMFpYSWdiV1YwYUc5a0FGTndZVzRnWTJGc2JHSmhZMnNnWlhKeWIzSWdhVzRnYjI1ZmFHVmhaR1Z5WDJacFpXeGtBRkJoZFhObFpBQkpiblpoYkdsa0lIZHZjbVFnWlc1amIzVnVkR1Z5WldRQVNXNTJZV3hwWkNCdFpYUm9iMlFnWlc1amIzVnVkR1Z5WldRQVZXNWxlSEJsWTNSbFpDQmphR0Z5SUdsdUlIVnliQ0J6WTJobGJXRUFVbVZ4ZFdWemRDQm9ZWE1nYVc1MllXeHBaQ0JnVkhKaGJuTm1aWEl0Ulc1amIyUnBibWRnQUZOWFNWUkRTRjlRVWs5WVdRQlZVMFZmVUZKUFdGa0FUVXRCUTFSSlZrbFVXUUJWVGxCU1QwTkZVMU5CUWt4RlgwVk9WRWxVV1FCRFQxQlpBRTFQVmtWRVgxQkZVazFCVGtWT1ZFeFpBRlJQVDE5RlFWSk1XUUJPVDFSSlJsa0FSa0ZKVEVWRVgwUkZVRVZPUkVWT1Exa0FRa0ZFWDBkQlZFVlhRVmtBVUV4QldRQlFWVlFBUTBoRlEwdFBWVlFBUjBGVVJWZEJXVjlVU1UxRlQxVlVBRkpGVVZWRlUxUmZWRWxOUlU5VlZBQk9SVlJYVDFKTFgwTlBUazVGUTFSZlZFbE5SVTlWVkFCRFQwNU9SVU5VU1U5T1gxUkpUVVZQVlZRQVRFOUhTVTVmVkVsTlJVOVZWQUJPUlZSWFQxSkxYMUpGUVVSZlZFbE5SVTlWVkFCUVQxTlVBRTFKVTBSSlVrVkRWRVZFWDFKRlVWVkZVMVFBUTB4SlJVNVVYME5NVDFORlJGOVNSVkZWUlZOVUFFTk1TVVZPVkY5RFRFOVRSVVJmVEU5QlJGOUNRVXhCVGtORlJGOVNSVkZWUlZOVUFFSkJSRjlTUlZGVlJWTlVBRWhVVkZCZlVrVlJWVVZUVkY5VFJVNVVYMVJQWDBoVVZGQlRYMUJQVWxRQVVrVlFUMUpVQUVsTlgwRmZWRVZCVUU5VUFGSkZVMFZVWDBOUFRsUkZUbFFBVGs5ZlEwOU9WRVZPVkFCUVFWSlVTVUZNWDBOUFRsUkZUbFFBU0ZCRlgwbE9Wa0ZNU1VSZlEwOU9VMVJCVGxRQVNGQkZYME5DWDFKRlUwVlVBRWRGVkFCSVVFVmZVMVJTU1VOVUFFTlBUa1pNU1VOVUFGUkZUVkJQVWtGU1dWOVNSVVJKVWtWRFZBQlFSVkpOUVU1RlRsUmZVa1ZFU1ZKRlExUUFRMDlPVGtWRFZBQk5WVXhVU1Y5VFZFRlVWVk1BU0ZCRlgwbE9Wa0ZNU1VSZlUxUkJWRlZUQUZSUFQxOU5RVTVaWDFKRlVWVkZVMVJUQUVWQlVreFpYMGhKVGxSVEFGVk9RVlpCU1V4QlFreEZYMFpQVWw5TVJVZEJURjlTUlVGVFQwNVRBRTlRVkVsUFRsTUFVMWRKVkVOSVNVNUhYMUJTVDFSUFEwOU1Vd0JXUVZKSlFVNVVYMEZNVTA5ZlRrVkhUMVJKUVZSRlV3Qk5WVXhVU1ZCTVJWOURTRTlKUTBWVEFFbE9WRVZTVGtGTVgxTkZVbFpGVWw5RlVsSlBVZ0JYUlVKZlUwVlNWa1ZTWDFWT1MwNVBWMDVmUlZKU1QxSUFVa0ZKVEVkVlRsOUZVbEpQVWdCSlJFVk9WRWxVV1Y5UVVrOVdTVVJGVWw5QlZWUklSVTVVU1VOQlZFbFBUbDlGVWxKUFVnQlRVMHhmUTBWU1ZFbEdTVU5CVkVWZlJWSlNUMUlBU1U1V1FVeEpSRjlZWDBaUFVsZEJVa1JGUkY5R1QxSUFVMFZVWDFCQlVrRk5SVlJGVWdCSFJWUmZVRUZTUVUxRlZFVlNBRWhRUlY5VlUwVlNBRk5GUlY5UFZFaEZVZ0JJVUVWZlEwSmZRMGhWVGt0ZlNFVkJSRVZTQUUxTFEwRk1SVTVFUVZJQVUwVlVWVkFBVjBWQ1gxTkZVbFpGVWw5SlUxOUVUMWRPQUZSRlFWSkVUMWRPQUVoUVJWOURURTlUUlVSZlEwOU9Ua1ZEVkVsUFRnQklSVlZTU1ZOVVNVTmZSVmhRU1ZKQlZFbFBUZ0JFU1ZORFQwNU9SVU5VUlVSZlQxQkZVa0ZVU1U5T0FFNVBUbDlCVlZSSVQxSkpWRUZVU1ZaRlgwbE9SazlTVFVGVVNVOU9BRWhRUlY5SlRsWkJURWxFWDFaRlVsTkpUMDRBU0ZCRlgwTkNYMDFGVTFOQlIwVmZRa1ZIU1U0QVUwbFVSVjlKVTE5R1VrOWFSVTRBU0ZCRlgwbE9Wa0ZNU1VSZlNFVkJSRVZTWDFSUFMwVk9BRWxPVmtGTVNVUmZWRTlMUlU0QVJrOVNRa2xFUkVWT0FFVk9TRUZPUTBWZldVOVZVbDlEUVV4TkFFaFFSVjlKVGxaQlRFbEVYMVZTVEFCQ1RFOURTMFZFWDBKWlgxQkJVa1ZPVkVGTVgwTlBUbFJTVDB3QVRVdERUMHdBUVVOTUFFaFFSVjlKVGxSRlVrNUJUQUJTUlZGVlJWTlVYMGhGUVVSRlVsOUdTVVZNUkZOZlZFOVBYMHhCVWtkRlgxVk9UMFpHU1VOSlFVd0FTRkJGWDA5TEFGVk9URWxPU3dCVlRreFBRMHNBVUZKSkFGSkZWRkpaWDFkSlZFZ0FTRkJGWDBsT1ZrRk1TVVJmUTA5T1ZFVk9WRjlNUlU1SFZFZ0FTRkJGWDFWT1JWaFFSVU5VUlVSZlEwOU9WRVZPVkY5TVJVNUhWRWdBUmt4VlUwZ0FVRkpQVUZCQlZFTklBRTB0VTBWQlVrTklBRlZTU1Y5VVQwOWZURTlPUndCUVVrOURSVk5UU1U1SEFFMUpVME5GVEV4QlRrVlBWVk5mVUVWU1UwbFRWRVZPVkY5WFFWSk9TVTVIQUUxSlUwTkZURXhCVGtWUFZWTmZWMEZTVGtsT1J3QklVRVZmU1U1V1FVeEpSRjlVVWtGT1UwWkZVbDlGVGtOUFJFbE9Sd0JGZUhCbFkzUmxaQ0JEVWt4R0FFaFFSVjlKVGxaQlRFbEVYME5JVlU1TFgxTkpXa1VBVFU5V1JRQkRUMDVVU1U1VlJRQklVRVZmUTBKZlUxUkJWRlZUWDBOUFRWQk1SVlJGQUVoUVJWOURRbDlJUlVGRVJWSlRYME5QVFZCTVJWUkZBRWhRUlY5RFFsOVdSVkpUU1U5T1gwTlBUVkJNUlZSRkFFaFFSVjlEUWw5VlVreGZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gwTklWVTVMWDBOUFRWQk1SVlJGQUVoUVJWOURRbDlJUlVGRVJWSmZWa0ZNVlVWZlEwOU5VRXhGVkVVQVNGQkZYME5DWDBOSVZVNUxYMFZZVkVWT1UwbFBUbDlXUVV4VlJWOURUMDFRVEVWVVJRQklVRVZmUTBKZlEwaFZUa3RmUlZoVVJVNVRTVTlPWDA1QlRVVmZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gwMUZVMU5CUjBWZlEwOU5VRXhGVkVVQVNGQkZYME5DWDAxRlZFaFBSRjlEVDAxUVRFVlVSUUJJVUVWZlEwSmZTRVZCUkVWU1gwWkpSVXhFWDBOUFRWQk1SVlJGQUVSRlRFVlVSUUJJVUVWZlNVNVdRVXhKUkY5RlQwWmZVMVJCVkVVQVNVNVdRVXhKUkY5VFUweGZRMFZTVkVsR1NVTkJWRVVBVUVGVlUwVUFUazlmVWtWVFVFOU9VMFVBVlU1VFZWQlFUMUpVUlVSZlRVVkVTVUZmVkZsUVJRQkhUMDVGQUU1UFZGOUJRME5GVUZSQlFreEZBRk5GVWxaSlEwVmZWVTVCVmtGSlRFRkNURVVBVWtGT1IwVmZUazlVWDFOQlZFbFRSa2xCUWt4RkFFOVNTVWRKVGw5SlUxOVZUbEpGUVVOSVFVSk1SUUJTUlZOUVQwNVRSVjlKVTE5VFZFRk1SUUJRVlZKSFJRQk5SVkpIUlFCU1JWRlZSVk5VWDBoRlFVUkZVbDlHU1VWTVJGTmZWRTlQWDB4QlVrZEZBRkpGVVZWRlUxUmZTRVZCUkVWU1gxUlBUMTlNUVZKSFJRQlFRVmxNVDBGRVgxUlBUMTlNUVZKSFJRQkpUbE5WUmtaSlEwbEZUbFJmVTFSUFVrRkhSUUJJVUVWZlVFRlZVMFZFWDFWUVIxSkJSRVVBU0ZCRlgxQkJWVk5GUkY5SU1sOVZVRWRTUVVSRkFGTlBWVkpEUlFCQlRrNVBWVTVEUlFCVVVrRkRSUUJJVUVWZlZVNUZXRkJGUTFSRlJGOVRVRUZEUlFCRVJWTkRVa2xDUlFCVlRsTlZRbE5EVWtsQ1JRQlNSVU5QVWtRQVNGQkZYMGxPVmtGTVNVUmZUVVZVU0U5RUFFNVBWRjlHVDFWT1JBQlFVazlRUmtsT1JBQlZUa0pKVGtRQVVrVkNTVTVFQUZWT1FWVlVTRTlTU1ZwRlJBQk5SVlJJVDBSZlRrOVVYMEZNVEU5WFJVUUFTRlJVVUY5V1JWSlRTVTlPWDA1UFZGOVRWVkJRVDFKVVJVUUFRVXhTUlVGRVdWOVNSVkJQVWxSRlJBQkJRME5GVUZSRlJBQk9UMVJmU1UxUVRFVk5SVTVVUlVRQVRFOVBVRjlFUlZSRlExUkZSQUJJVUVWZlExSmZSVmhRUlVOVVJVUUFTRkJGWDB4R1gwVllVRVZEVkVWRUFFTlNSVUZVUlVRQVNVMWZWVk5GUkFCSVVFVmZVRUZWVTBWRUFGUkpUVVZQVlZSZlQwTkRWVkpGUkFCUVFWbE5SVTVVWDFKRlVWVkpVa1ZFQUZCU1JVTlBUa1JKVkVsUFRsOVNSVkZWU1ZKRlJBQlFVazlZV1Y5QlZWUklSVTVVU1VOQlZFbFBUbDlTUlZGVlNWSkZSQUJPUlZSWFQxSkxYMEZWVkVoRlRsUkpRMEZVU1U5T1gxSkZVVlZKVWtWRUFFeEZUa2RVU0Y5U1JWRlZTVkpGUkFCVFUweGZRMFZTVkVsR1NVTkJWRVZmVWtWUlZVbFNSVVFBVlZCSFVrRkVSVjlTUlZGVlNWSkZSQUJRUVVkRlgwVllVRWxTUlVRQVVGSkZRMDlPUkVsVVNVOU9YMFpCU1V4RlJBQkZXRkJGUTFSQlZFbFBUbDlHUVVsTVJVUUFVa1ZXUVV4SlJFRlVTVTlPWDBaQlNVeEZSQUJUVTB4ZlNFRk9SRk5JUVV0RlgwWkJTVXhGUkFCTVQwTkxSVVFBVkZKQlRsTkdUMUpOUVZSSlQwNWZRVkJRVEVsRlJBQk9UMVJmVFU5RVNVWkpSVVFBVGs5VVgwVllWRVZPUkVWRUFFSkJUa1JYU1VSVVNGOU1TVTFKVkY5RldFTkZSVVJGUkFCVFNWUkZYMGxUWDA5V1JWSk1UMEZFUlVRQVNFVkJSQUJGZUhCbFkzUmxaQ0JJVkZSUUx3QUFYaE1BQUNZVEFBQXdFQUFBOEJjQUFKMFRBQUFWRWdBQU9SY0FBUEFTQUFBS0VBQUFkUklBQUswU0FBQ0NFd0FBVHhRQUFIOFFBQUNnRlFBQUl4UUFBSWtTQUFDTEZBQUFUUlVBQU5RUkFBRFBGQUFBRUJnQUFNa1dBQURjRmdBQXdSRUFBT0FYQUFDN0ZBQUFkQlFBQUh3VkFBRGxGQUFBQ0JjQUFCOFFBQUJsRlFBQW94UUFBQ2dWQUFBQ0ZRQUFtUlVBQUN3UUFBQ0xHUUFBVHc4QUFOUU9BQUJxRUFBQXpoQUFBQUlYQUFDSkRnQUFiaE1BQUJ3VEFBQm1GQUFBVmhjQUFNRVRBQURORXdBQWJCTUFBR2dYQUFCbUZ3QUFYeGNBQUNJVEFBRE9Ed0FBYVE0QUFOZ09BQUJqRmdBQXl4TUFBS29PQUFBb0Z3QUFKaGNBQU1VVEFBQmRGZ0FBNkJFQUFHY1RBQUJsRXdBQThoWUFBSE1UQUFBZEZ3QUErUllBQVBNUkFBRFBEZ0FBemhVQUFBd1NBQUN6RVFBQXBSRUFBR0VRQUFBeUZ3QUF1eE1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBUUlCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJREFnSUNBZ0lBQUFJQ0FBSUNBQUlDQWdJQ0FnSUNBZ0lBQkFBQUFBQUFBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFBQUFDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdBQ0FBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBQUlDQWdJQ0FBQUNBZ0FDQWdBQ0FnSUNBZ0lDQWdJQ0FBTUFCQUFBQUFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUFBQUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFBZ0FDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWJHOXpaV1ZsY0MxaGJHbDJaUUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQkFRRUJBUUVCQVFFQkFRSUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCWTJoMWJtdGxaQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRRUFBUUVCQVFFQUFBRUJBQUVCQUFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQUFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCbFkzUnBiMjVsYm5RdGJHVnVaM1JvYjI1eWIzaDVMV052Ym01bFkzUnBiMjRBQUFBQUFBQUFBQUFBQUFBQUFBQnlZVzV6Wm1WeUxXVnVZMjlrYVc1bmNHZHlZV1JsRFFvTkNnMEtVMDBOQ2cwS1ZGUlFMME5GTDFSVFVDOEFBQUFBQUFBQUFBQUFBQUFCQWdBQkF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBQUFBQUFBQUFBQUFRSUFBUU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQVFFRkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFBQUFBQUFBQUFBQUVBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQUFBQUFRQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1FQUFBRUJBUUVCQVFFQkFRRUJBVUVCQVFFQkFRRUJBUUVCQVFBQkFBR0J3UUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVBQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQUFBQUFBQUFEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd0FBQUFBQUFBTURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUlBQUFBQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNQUFBQUFBQUFEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQk9UMVZPUTBWRlEwdFBWVlJPUlVOVVJWUkZRMUpKUWtWTVZWTklSVlJGUVVSVFJVRlNRMGhTUjBWRFZFbFdTVlJaVEVWT1JFRlNWa1ZQVkVsR1dWQlVTVTlPVTBOSVUwVkJXVk5VUVZSRFNFZEZUMUpFU1ZKRlExUlBVbFJTUTBoUVFWSkJUVVZVUlZKVlVrTkZRbE5EVWtsQ1JVRlNSRTlYVGtGRFJVbE9SRTVMUTB0VlFsTkRVa2xDUlVoVVZGQXZRVVJVVUM4PSdcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSAnQUdGemJRRUFBQUFCTUFoZ0FYOEJmMkFEZjM5L0FYOWdCSDkvZjM4QmYyQUFBR0FEZjM5L0FHQUJmd0JnQW45L0FHQUdmMzkvZjM5L0FBTExBUWdEWlc1MkdIZGhjMjFmYjI1ZmFHVmhaR1Z5YzE5amIyMXdiR1YwWlFBQ0EyVnVkaFYzWVhOdFgyOXVYMjFsYzNOaFoyVmZZbVZuYVc0QUFBTmxibllMZDJGemJWOXZibDkxY213QUFRTmxibllPZDJGemJWOXZibDl6ZEdGMGRYTUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmWm1sbGJHUUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmZG1Gc2RXVUFBUU5sYm5ZTWQyRnpiVjl2Ymw5aWIyUjVBQUVEWlc1MkdIZGhjMjFmYjI1ZmJXVnpjMkZuWlY5amIyMXdiR1YwWlFBQUEwWkZBd01FQUFBRkFBQUFBQUFBQlFFRkFBVUZCUUFBQmdBQUFBQUdCZ1lHQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQUFBQkFRY0FBQVVGQXdBQkJBVUJjQUVTRWdVREFRQUNCZ2dCZndGQmdOUUVDd2ZSQlNJR2JXVnRiM0o1QWdBTFgybHVhWFJwWVd4cGVtVUFDUmxmWDJsdVpHbHlaV04wWDJaMWJtTjBhVzl1WDNSaFlteGxBUUFMYkd4b2RIUndYMmx1YVhRQUNoaHNiR2gwZEhCZmMyaHZkV3hrWDJ0bFpYQmZZV3hwZG1VQVFReHNiR2gwZEhCZllXeHNiMk1BREFadFlXeHNiMk1BUmd0c2JHaDBkSEJmWm5KbFpRQU5CR1p5WldVQVNBOXNiR2gwZEhCZloyVjBYM1I1Y0dVQURoVnNiR2gwZEhCZloyVjBYMmgwZEhCZmJXRnFiM0lBRHhWc2JHaDBkSEJmWjJWMFgyaDBkSEJmYldsdWIzSUFFQkZzYkdoMGRIQmZaMlYwWDIxbGRHaHZaQUFSRm14c2FIUjBjRjluWlhSZmMzUmhkSFZ6WDJOdlpHVUFFaEpzYkdoMGRIQmZaMlYwWDNWd1ozSmhaR1VBRXd4c2JHaDBkSEJmY21WelpYUUFGQTVzYkdoMGRIQmZaWGhsWTNWMFpRQVZGR3hzYUhSMGNGOXpaWFIwYVc1bmMxOXBibWwwQUJZTmJHeG9kSFJ3WDJacGJtbHphQUFYREd4c2FIUjBjRjl3WVhWelpRQVlEV3hzYUhSMGNGOXlaWE4xYldVQUdSdHNiR2gwZEhCZmNtVnpkVzFsWDJGbWRHVnlYM1Z3WjNKaFpHVUFHaEJzYkdoMGRIQmZaMlYwWDJWeWNtNXZBQnNYYkd4b2RIUndYMmRsZEY5bGNuSnZjbDl5WldGemIyNEFIQmRzYkdoMGRIQmZjMlYwWDJWeWNtOXlYM0psWVhOdmJnQWRGR3hzYUhSMGNGOW5aWFJmWlhKeWIzSmZjRzl6QUI0UmJHeG9kSFJ3WDJWeWNtNXZYMjVoYldVQUh4SnNiR2gwZEhCZmJXVjBhRzlrWDI1aGJXVUFJQkpzYkdoMGRIQmZjM1JoZEhWelgyNWhiV1VBSVJwc2JHaDBkSEJmYzJWMFgyeGxibWxsYm5SZmFHVmhaR1Z5Y3dBaUlXeHNhSFIwY0Y5elpYUmZiR1Z1YVdWdWRGOWphSFZ1YTJWa1gyeGxibWQwYUFBakhXeHNhSFIwY0Y5elpYUmZiR1Z1YVdWdWRGOXJaV1Z3WDJGc2FYWmxBQ1FrYkd4b2RIUndYM05sZEY5c1pXNXBaVzUwWDNSeVlXNXpabVZ5WDJWdVkyOWthVzVuQUNVWWJHeG9kSFJ3WDIxbGMzTmhaMlZmYm1WbFpITmZaVzltQUQ4SkZ3RUFRUUVMRVFFQ0F3UUZDd1lITlRrM01TOHRKeXNwQ3JMZ0FrVUNBQXNJQUJDSWdJQ0FBQXNaQUNBQUVNS0FnSUFBR2lBQUlBSTJBamdnQUNBQk9nQW9DeHdBSUFBZ0FDOEJNaUFBTFFBdUlBQVF3WUNBZ0FBUWdJQ0FnQUFMS2dFQmYwSEFBQkRHZ0lDQUFDSUJFTUtBZ0lBQUdpQUJRWUNJZ0lBQU5nSTRJQUVnQURvQUtDQUJDd29BSUFBUXlJQ0FnQUFMQndBZ0FDMEFLQXNIQUNBQUxRQXFDd2NBSUFBdEFDc0xCd0FnQUMwQUtRc0hBQ0FBTHdFeUN3Y0FJQUF0QUM0TFJRRUVmeUFBS0FJWUlRRWdBQzBBTFNFQ0lBQXRBQ2doQXlBQUtBSTRJUVFnQUJEQ2dJQ0FBQm9nQUNBRU5nSTRJQUFnQXpvQUtDQUFJQUk2QUMwZ0FDQUJOZ0lZQ3hFQUlBQWdBU0FCSUFKcUVNT0FnSUFBQ3hBQUlBQkJBRUhjQUJETWdJQ0FBQm9MWndFQmYwRUFJUUVDUUNBQUtBSU1EUUFDUUFKQUFrQUNRQ0FBTFFBdkRnTUJBQU1DQ3lBQUtBSTRJZ0ZGRFFBZ0FTZ0NMQ0lCUlEwQUlBQWdBUkdBZ0lDQUFBQWlBUTBEQzBFQUR3c1F5b0NBZ0FBQUN5QUFRY09XZ0lBQU5nSVFRUTRoQVFzZ0FRc2VBQUpBSUFBb0Fnd05BQ0FBUWRHYmdJQUFOZ0lRSUFCQkZUWUNEQXNMRmdBQ1FDQUFLQUlNUVJWSERRQWdBRUVBTmdJTUN3c1dBQUpBSUFBb0FneEJGa2NOQUNBQVFRQTJBZ3dMQ3djQUlBQW9BZ3dMQndBZ0FDZ0NFQXNKQUNBQUlBRTJBaEFMQndBZ0FDZ0NGQXNpQUFKQUlBQkJKRWtOQUJES2dJQ0FBQUFMSUFCQkFuUkJvTE9BZ0FCcUtBSUFDeUlBQWtBZ0FFRXVTUTBBRU1xQWdJQUFBQXNnQUVFQ2RFR3d0SUNBQUdvb0FnQUw3Z3NCQVg5QjY2aUFnQUFoQVFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQkJuSDlxRHZRRFkySUFBV0ZoWVdGaFlRSURCQVZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaEJnY0lDUW9MREEwT0QyRmhZV0ZoRUdGaFlXRmhZV0ZoWVdGaEVXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlSSVRGQlVXRnhnWkdodGhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhIQjBlSHlBaElpTWtKU1luS0NrcUt5d3RMaTh3TVRJek5EVTJZVGM0T1RwaFlXRmhZV0ZoWVR0aFlXRThZV0ZoWVQwK1AyRmhZV0ZoWVdGaFFHRmhRV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVVKRFJFVkdSMGhKU2t0TVRVNVBVRkZTVTJGaFlXRmhZV0ZoVkZWV1YxaFpXbHRoWEYxaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmVZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhYMkJoQzBIaHA0Q0FBQThMUWFTaGdJQUFEd3RCeTZ5QWdBQVBDMEgrc1lDQUFBOExRY0NrZ0lBQUR3dEJxNlNBZ0FBUEMwR05xSUNBQUE4TFFlS21nSUFBRHd0QmdMQ0FnQUFQQzBHNXI0Q0FBQThMUWRla2dJQUFEd3RCNzUrQWdBQVBDMEhobjRDQUFBOExRZnFmZ0lBQUR3dEI4cUNBZ0FBUEMwR29yNENBQUE4TFFhNnlnSUFBRHd0QmlMQ0FnQUFQQzBIc3A0Q0FBQThMUVlLaWdJQUFEd3RCanAyQWdBQVBDMEhRcm9DQUFBOExRY3FqZ0lBQUR3dEJ4YktBZ0FBUEMwSGZuSUNBQUE4TFFkS2NnSUFBRHd0QnhLQ0FnQUFQQzBIWG9JQ0FBQThMUWFLZmdJQUFEd3RCN2E2QWdBQVBDMEdyc0lDQUFBOExRZFNsZ0lBQUR3dEJ6SzZBZ0FBUEMwSDZyb0NBQUE4TFFmeXJnSUFBRHd0QjByQ0FnQUFQQzBIeG5ZQ0FBQThMUWJ1Z2dJQUFEd3RCOTZ1QWdBQVBDMEdRc1lDQUFBOExRZGV4Z0lBQUR3dEJvcTJBZ0FBUEMwSFVwNENBQUE4TFFlQ3JnSUFBRHd0Qm42eUFnQUFQQzBIcnNZQ0FBQThMUWRXZmdJQUFEd3RCeXJHQWdBQVBDMEhlcFlDQUFBOExRZFNlZ0lBQUR3dEI5SnlBZ0FBUEMwR25zb0NBQUE4TFFiR2RnSUFBRHd0Qm9KMkFnQUFQQzBHNXNZQ0FBQThMUWJ5d2dJQUFEd3RCa3FHQWdBQVBDMEd6cG9DQUFBOExRZW1zZ0lBQUR3dEJySjZBZ0FBUEMwSFVxNENBQUE4TFFmZW1nSUFBRHd0QmdLYUFnQUFQQzBHd29ZQ0FBQThMUWY2ZWdJQUFEd3RCamFPQWdBQVBDMEdKcllDQUFBOExRZmVpZ0lBQUR3dEJvTEdBZ0FBUEMwR3VuNENBQUE4TFFjYWxnSUFBRHd0QjZKNkFnQUFQQzBHVG9vQ0FBQThMUWNLdmdJQUFEd3RCdzUyQWdBQVBDMEdMcklDQUFBOExRZUdkZ0lBQUR3dEJqYStBZ0FBUEMwSHFvWUNBQUE4TFFiU3RnSUFBRHd0QjBxK0FnQUFQQzBIZnNvQ0FBQThMUWRLeWdJQUFEd3RCOExDQWdBQVBDMEdwb29DQUFBOExRZm1qZ0lBQUR3dEJtWjZBZ0FBUEMwRzFySUNBQUE4TFFadXdnSUFBRHd0QmtyS0FnQUFQQzBHMnE0Q0FBQThMUWNLaWdJQUFEd3RCK0xLQWdBQVBDMEdlcFlDQUFBOExRZENpZ0lBQUR3dEJ1cDZBZ0FBUEMwR0Jub0NBQUE4TEVNcUFnSUFBQUF0QjFxR0FnQUFoQVFzZ0FRc1dBQ0FBSUFBdEFDMUIvZ0Z4SUFGQkFFZHlPZ0F0Q3hrQUlBQWdBQzBBTFVIOUFYRWdBVUVBUjBFQmRISTZBQzBMR1FBZ0FDQUFMUUF0UWZzQmNTQUJRUUJIUVFKMGNqb0FMUXNaQUNBQUlBQXRBQzFCOXdGeElBRkJBRWRCQTNSeU9nQXRDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FnQWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MU1FFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NCQ0lFUlEwQUlBQWdBU0FDSUFGcklBUVJnWUNBZ0FBQUlnTkJmMGNOQUNBQVFjYVJnSUFBTmdJUVFSZ2hBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUl3SWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREMwa0JBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWdnaUJFVU5BQ0FBSUFFZ0FpQUJheUFFRVlHQWdJQUFBQ0lEUVg5SERRQWdBRUgyaW9DQUFEWUNFRUVZSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ05DSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RKQVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSU1JZ1JGRFFBZ0FDQUJJQUlnQVdzZ0JCR0JnSUNBQUFBaUEwRi9SdzBBSUFCQjdacUFnQUEyQWhCQkdDRURDeUFEQ3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BamdpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDRUNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRWldRZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJOElnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDMGtCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FoUWlCRVVOQUNBQUlBRWdBaUFCYXlBRUVZR0FnSUFBQUNJRFFYOUhEUUFnQUVHcW00Q0FBRFlDRUVFWUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NRQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0SkFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlZSWdSRkRRQWdBQ0FCSUFJZ0FXc2dCQkdCZ0lDQUFBQWlBMEYvUncwQUlBQkI3Wk9BZ0FBMkFoQkJHQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWtRaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ0pDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3N1QVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSXNJZ1JGRFFBZ0FDQUVFWUNBZ0lBQUFDRURDeUFEQzBrQkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BaWdpQkVVTkFDQUFJQUVnQWlBQmF5QUVFWUdBZ0lBQUFDSURRWDlIRFFBZ0FFSDJpSUNBQURZQ0VFRVlJUU1MSUFNTExnRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDVUNJRVJRMEFJQUFnQkJHQWdJQ0FBQUFoQXdzZ0F3dEpBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJY0lnUkZEUUFnQUNBQklBSWdBV3NnQkJHQmdJQ0FBQUFpQTBGL1J3MEFJQUJCd3BtQWdBQTJBaEJCR0NFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FrZ2lCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MU1FFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NJQ0lFUlEwQUlBQWdBU0FDSUFGcklBUVJnWUNBZ0FBQUlnTkJmMGNOQUNBQVFaU1VnSUFBTmdJUVFSZ2hBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUpNSWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWxRaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ1dDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RGQVFGL0FrQUNRQ0FBTHdFd1FSUnhRUlJIRFFCQkFTRURJQUF0QUNoQkFVWU5BU0FBTHdFeVFlVUFSaUVEREFFTElBQXRBQ2xCQlVZaEF3c2dBQ0FET2dBdVFRQUwvZ0VCQTM5QkFTRURBa0FnQUM4Qk1DSUVRUWh4RFFBZ0FDa0RJRUlBVWlFREN3SkFBa0FnQUMwQUxrVU5BRUVCSVFVZ0FDMEFLVUVGUmcwQlFRRWhCU0FFUWNBQWNVVWdBM0ZCQVVjTkFRdEJBQ0VGSUFSQndBQnhEUUJCQWlFRklBUkIvLzhEY1NJRFFRaHhEUUFDUUNBRFFZQUVjVVVOQUFKQUlBQXRBQ2hCQVVjTkFDQUFMUUF0UVFweERRQkJCUThMUVFRUEN3SkFJQU5CSUhFTkFBSkFJQUF0QUNoQkFVWU5BQ0FBTHdFeVFmLy9BM0VpQUVHY2YycEI1QUJKRFFBZ0FFSE1BVVlOQUNBQVFiQUNSZzBBUVFRaEJTQUVRU2h4UlEwQ0lBTkJpQVJ4UVlBRVJnMENDMEVBRHd0QkFFRURJQUFwQXlCUUd5RUZDeUFGQzJJQkFuOUJBQ0VCQWtBZ0FDMEFLRUVCUmcwQUlBQXZBVEpCLy84RGNTSUNRWngvYWtIa0FFa05BQ0FDUWN3QlJnMEFJQUpCc0FKR0RRQWdBQzhCTUNJQVFjQUFjUTBBUVFFaEFTQUFRWWdFY1VHQUJFWU5BQ0FBUVNoeFJTRUJDeUFCQzZjQkFRTi9Ba0FDUUFKQUlBQXRBQ3BGRFFBZ0FDMEFLMFVOQUVFQUlRTWdBQzhCTUNJRVFRSnhSUTBCREFJTFFRQWhBeUFBTHdFd0lnUkJBWEZGRFFFTFFRRWhBeUFBTFFBb1FRRkdEUUFnQUM4Qk1rSC8vd054SWdWQm5IOXFRZVFBU1EwQUlBVkJ6QUZHRFFBZ0JVR3dBa1lOQUNBRVFjQUFjUTBBUVFBaEF5QUVRWWdFY1VHQUJFWU5BQ0FFUVNoeFFRQkhJUU1MSUFCQkFEc0JNQ0FBUVFBNkFDOGdBd3VaQVFFQ2Z3SkFBa0FDUUNBQUxRQXFSUTBBSUFBdEFDdEZEUUJCQUNFQklBQXZBVEFpQWtFQ2NVVU5BUXdDQzBFQUlRRWdBQzhCTUNJQ1FRRnhSUTBCQzBFQklRRWdBQzBBS0VFQlJnMEFJQUF2QVRKQi8vOERjU0lBUVp4L2FrSGtBRWtOQUNBQVFjd0JSZzBBSUFCQnNBSkdEUUFnQWtIQUFIRU5BRUVBSVFFZ0FrR0lCSEZCZ0FSR0RRQWdBa0VvY1VFQVJ5RUJDeUFCQzBrQkFYc2dBRUVRYXYwTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNJQi9Rc0RBQ0FBSUFIOUN3TUFJQUJCTUdvZ0FmMExBd0FnQUVFZ2FpQUIvUXNEQUNBQVFkMEJOZ0ljUVFBTGV3RUJmd0pBSUFBb0Fnd2lBdzBBQWtBZ0FDZ0NCRVVOQUNBQUlBRTJBZ1FMQWtBZ0FDQUJJQUlReElDQWdBQWlBdzBBSUFBb0Fnd1BDeUFBSUFNMkFoeEJBQ0VESUFBb0FnUWlBVVVOQUNBQUlBRWdBaUFBS0FJSUVZR0FnSUFBQUNJQlJRMEFJQUFnQWpZQ0ZDQUFJQUUyQWd3Z0FTRURDeUFEQytUekFRTU9md04rQkg4amdJQ0FnQUJCRUdzaUF5U0FnSUNBQUNBQklRUWdBU0VGSUFFaEJpQUJJUWNnQVNFSUlBRWhDU0FCSVFvZ0FTRUxJQUVoRENBQklRMGdBU0VPSUFFaER3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUFLQUljSWhCQmYyb08zUUhhQVFIWkFRSURCQVVHQndnSkNnc01EUTdZQVE4UTF3RVJFdFlCRXhRVkZoY1lHUm9iNEFIZkFSd2RIdFVCSHlBaElpTWtKZFFCSmljb0tTb3JMTk1CMGdFdEx0RUIwQUV2TURFeU16UTFOamM0T1RvN1BEMCtQMEJCUWtORVJVYmJBVWRJU1VyUEFjNEJTODBCVE13QlRVNVBVRkZTVTFSVlZsZFlXVnBiWEYxZVgyQmhZbU5rWldabmFHbHFhMnh0Ym05d2NYSnpkSFYyZDNoNWVudDhmWDUvZ0FHQkFZSUJnd0dFQVlVQmhnR0hBWWdCaVFHS0FZc0JqQUdOQVk0Qmp3R1FBWkVCa2dHVEFaUUJsUUdXQVpjQm1BR1pBWm9CbXdHY0FaMEJuZ0dmQWFBQm9RR2lBYU1CcEFHbEFhWUJwd0dvQWFrQnFnR3JBYXdCclFHdUFhOEJzQUd4QWJJQnN3RzBBYlVCdGdHM0Fjc0J5Z0c0QWNrQnVRSElBYm9CdXdHOEFiMEJ2Z0cvQWNBQndRSENBY01CeEFIRkFjWUJBTndCQzBFQUlSQU14Z0VMUVE0aEVBekZBUXRCRFNFUURNUUJDMEVQSVJBTXd3RUxRUkFoRUF6Q0FRdEJFeUVRRE1FQkMwRVVJUkFNd0FFTFFSVWhFQXkvQVF0QkZpRVFETDRCQzBFWElSQU12UUVMUVJnaEVBeThBUXRCR1NFUURMc0JDMEVhSVJBTXVnRUxRUnNoRUF5NUFRdEJIQ0VRRExnQkMwRUlJUkFNdHdFTFFSMGhFQXkyQVF0QklDRVFETFVCQzBFZklSQU10QUVMUVFjaEVBeXpBUXRCSVNFUURMSUJDMEVpSVJBTXNRRUxRUjRoRUF5d0FRdEJJeUVRREs4QkMwRVNJUkFNcmdFTFFSRWhFQXl0QVF0QkpDRVFES3dCQzBFbElSQU1xd0VMUVNZaEVBeXFBUXRCSnlFUURLa0JDMEhEQVNFUURLZ0JDMEVwSVJBTXB3RUxRU3NoRUF5bUFRdEJMQ0VRREtVQkMwRXRJUkFNcEFFTFFTNGhFQXlqQVF0Qkx5RVFES0lCQzBIRUFTRVFES0VCQzBFd0lSQU1vQUVMUVRRaEVBeWZBUXRCRENFUURKNEJDMEV4SVJBTW5RRUxRVEloRUF5Y0FRdEJNeUVRREpzQkMwRTVJUkFNbWdFTFFUVWhFQXlaQVF0QnhRRWhFQXlZQVF0QkN5RVFESmNCQzBFNklSQU1sZ0VMUVRZaEVBeVZBUXRCQ2lFUURKUUJDMEUzSVJBTWt3RUxRVGdoRUF5U0FRdEJQQ0VRREpFQkMwRTdJUkFNa0FFTFFUMGhFQXlQQVF0QkNTRVFESTRCQzBFb0lSQU1qUUVMUVQ0aEVBeU1BUXRCUHlFUURJc0JDMEhBQUNFUURJb0JDMEhCQUNFUURJa0JDMEhDQUNFUURJZ0JDMEhEQUNFUURJY0JDMEhFQUNFUURJWUJDMEhGQUNFUURJVUJDMEhHQUNFUURJUUJDMEVxSVJBTWd3RUxRY2NBSVJBTWdnRUxRY2dBSVJBTWdRRUxRY2tBSVJBTWdBRUxRY29BSVJBTWZ3dEJ5d0FoRUF4K0MwSE5BQ0VRREgwTFFjd0FJUkFNZkF0QnpnQWhFQXg3QzBIUEFDRVFESG9MUWRBQUlSQU1lUXRCMFFBaEVBeDRDMEhTQUNFUURIY0xRZE1BSVJBTWRndEIxQUFoRUF4MUMwSFdBQ0VRREhRTFFkVUFJUkFNY3d0QkJpRVFESElMUWRjQUlSQU1jUXRCQlNFUURIQUxRZGdBSVJBTWJ3dEJCQ0VRREc0TFFka0FJUkFNYlF0QjJnQWhFQXhzQzBIYkFDRVFER3NMUWR3QUlSQU1hZ3RCQXlFUURHa0xRZDBBSVJBTWFBdEIzZ0FoRUF4bkMwSGZBQ0VRREdZTFFlRUFJUkFNWlF0QjRBQWhFQXhrQzBIaUFDRVFER01MUWVNQUlSQU1ZZ3RCQWlFUURHRUxRZVFBSVJBTVlBdEI1UUFoRUF4ZkMwSG1BQ0VRREY0TFFlY0FJUkFNWFF0QjZBQWhFQXhjQzBIcEFDRVFERnNMUWVvQUlSQU1XZ3RCNndBaEVBeFpDMEhzQUNFUURGZ0xRZTBBSVJBTVZ3dEI3Z0FoRUF4V0MwSHZBQ0VRREZVTFFmQUFJUkFNVkF0QjhRQWhFQXhUQzBIeUFDRVFERklMUWZNQUlSQU1VUXRCOUFBaEVBeFFDMEgxQUNFUURFOExRZllBSVJBTVRndEI5d0FoRUF4TkMwSDRBQ0VRREV3TFFma0FJUkFNU3d0QitnQWhFQXhLQzBIN0FDRVFERWtMUWZ3QUlSQU1TQXRCL1FBaEVBeEhDMEgrQUNFUURFWUxRZjhBSVJBTVJRdEJnQUVoRUF4RUMwR0JBU0VRREVNTFFZSUJJUkFNUWd0Qmd3RWhFQXhCQzBHRUFTRVFERUFMUVlVQklSQU1Qd3RCaGdFaEVBdytDMEdIQVNFUUREMExRWWdCSVJBTVBBdEJpUUVoRUF3N0MwR0tBU0VRRERvTFFZc0JJUkFNT1F0QmpBRWhFQXc0QzBHTkFTRVFERGNMUVk0QklSQU1OZ3RCandFaEVBdzFDMEdRQVNFUUREUUxRWkVCSVJBTU13dEJrZ0VoRUF3eUMwR1RBU0VRRERFTFFaUUJJUkFNTUF0QmxRRWhFQXd2QzBHV0FTRVFEQzRMUVpjQklSQU1MUXRCbUFFaEVBd3NDMEdaQVNFUURDc0xRWm9CSVJBTUtndEJtd0VoRUF3cEMwR2NBU0VRRENnTFFaMEJJUkFNSnd0Qm5nRWhFQXdtQzBHZkFTRVFEQ1VMUWFBQklSQU1KQXRCb1FFaEVBd2pDMEdpQVNFUURDSUxRYU1CSVJBTUlRdEJwQUVoRUF3Z0MwR2xBU0VRREI4TFFhWUJJUkFNSGd0QnB3RWhFQXdkQzBHb0FTRVFEQndMUWFrQklSQU1Hd3RCcWdFaEVBd2FDMEdyQVNFUURCa0xRYXdCSVJBTUdBdEJyUUVoRUF3WEMwR3VBU0VRREJZTFFRRWhFQXdWQzBHdkFTRVFEQlFMUWJBQklSQU1Fd3RCc1FFaEVBd1NDMEd6QVNFUURCRUxRYklCSVJBTUVBdEJ0QUVoRUF3UEMwRzFBU0VRREE0TFFiWUJJUkFNRFF0QnR3RWhFQXdNQzBHNEFTRVFEQXNMUWJrQklSQU1DZ3RCdWdFaEVBd0pDMEc3QVNFUURBZ0xRY1lCSVJBTUJ3dEJ2QUVoRUF3R0MwRzlBU0VRREFVTFFiNEJJUkFNQkF0QnZ3RWhFQXdEQzBIQUFTRVFEQUlMUWNJQklSQU1BUXRCd1FFaEVBc0RRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUJBT3h3RUFBUUlEQkFVR0J3Z0pDZ3NNRFE0UEVCRVNFeFFWRmhjWUdSb2JIQjRmSUNFakpTZy9RRUZFUlVaSFNFbEtTMHhOVDFCUlVsUGVBMWRaVzF4ZFlHSmxabWRvYVdwcmJHMXZjSEZ5YzNSMWRuZDRlWHA3ZkgxK2dBR0NBWVVCaGdHSEFZa0Jpd0dNQVkwQmpnR1BBWkFCa1FHVUFaVUJsZ0dYQVpnQm1RR2FBWnNCbkFHZEFaNEJud0dnQWFFQm9nR2pBYVFCcFFHbUFhY0JxQUdwQWFvQnF3R3NBYTBCcmdHdkFiQUJzUUd5QWJNQnRBRzFBYllCdHdHNEFia0J1Z0c3QWJ3QnZRRytBYjhCd0FIQkFjSUJ3d0hFQWNVQnhnSEhBY2dCeVFIS0Fjc0J6QUhOQWM0Qnp3SFFBZEVCMGdIVEFkUUIxUUhXQWRjQjJBSFpBZG9CMndIY0FkMEIzZ0hnQWVFQjRnSGpBZVFCNVFIbUFlY0I2QUhwQWVvQjZ3SHNBZTBCN2dIdkFmQUI4UUh5QWZNQm1RS2tBckFDL2dMK0Fnc2dBU0lFSUFKSERmTUJRZDBCSVJBTS93TUxJQUVpRUNBQ1J3M2RBVUhEQVNFUURQNERDeUFCSWdFZ0FrY05rQUZCOXdBaEVBejlBd3NnQVNJQklBSkhEWVlCUWU4QUlSQU0vQU1MSUFFaUFTQUNSdzEvUWVvQUlSQU0rd01MSUFFaUFTQUNSdzE3UWVnQUlSQU0rZ01MSUFFaUFTQUNSdzE0UWVZQUlSQU0rUU1MSUFFaUFTQUNSdzBhUVJnaEVBejRBd3NnQVNJQklBSkhEUlJCRWlFUURQY0RDeUFCSWdFZ0FrY05XVUhGQUNFUURQWURDeUFCSWdFZ0FrY05Ta0UvSVJBTTlRTUxJQUVpQVNBQ1J3MUlRVHdoRUF6MEF3c2dBU0lCSUFKSERVRkJNU0VRRFBNREN5QUFMUUF1UVFGR0Rlc0RESWNDQ3lBQUlBRWlBU0FDRU1DQWdJQUFRUUZIRGVZQklBQkNBRGNESUF6bkFRc2dBQ0FCSWdFZ0FoQzBnSUNBQUNJUURlY0JJQUVoQVF6MUFnc0NRQ0FCSWdFZ0FrY05BRUVHSVJBTThBTUxJQUFnQVVFQmFpSUJJQUlRdTRDQWdBQWlFQTNvQVNBQklRRU1NUXNnQUVJQU53TWdRUkloRUF6VkF3c2dBU0lRSUFKSERTdEJIU0VRRE8wREN3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFVRVFJUkFNMUFNTFFRY2hFQXpzQXdzZ0FFSUFJQUFwQXlBaUVTQUNJQUVpRUd1dEloSjlJaE1nRXlBUlZoczNBeUFnRVNBU1ZpSVVSUTNsQVVFSUlSQU02d01MQWtBZ0FTSUJJQUpHRFFBZ0FFR0pnSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJRUlFoRUF6U0F3dEJDU0VRRE9vREN5QUJJUUVnQUNrRElGQU41QUVnQVNFQkRQSUNDd0pBSUFFaUFTQUNSdzBBUVFzaEVBenBBd3NnQUNBQlFRRnFJZ0VnQWhDMmdJQ0FBQ0lRRGVVQklBRWhBUXp5QWdzZ0FDQUJJZ0VnQWhDNGdJQ0FBQ0lRRGVVQklBRWhBUXp5QWdzZ0FDQUJJZ0VnQWhDNGdJQ0FBQ0lRRGVZQklBRWhBUXdOQ3lBQUlBRWlBU0FDRUxxQWdJQUFJaEFONXdFZ0FTRUJEUEFDQ3dKQUlBRWlBU0FDUncwQVFROGhFQXpsQXdzZ0FTMEFBQ0lRUVR0R0RRZ2dFRUVOUnczb0FTQUJRUUZxSVFFTTd3SUxJQUFnQVNJQklBSVF1b0NBZ0FBaUVBM29BU0FCSVFFTThnSUxBMEFDUUNBQkxRQUFRZkMxZ0lBQWFpMEFBQ0lRUVFGR0RRQWdFRUVDUnczckFTQUFLQUlFSVJBZ0FFRUFOZ0lFSUFBZ0VDQUJRUUZxSWdFUXVZQ0FnQUFpRUEzcUFTQUJJUUVNOUFJTElBRkJBV29pQVNBQ1J3MEFDMEVTSVJBTTRnTUxJQUFnQVNJQklBSVF1b0NBZ0FBaUVBM3BBU0FCSVFFTUNnc2dBU0lCSUFKSERRWkJHeUVRRE9BREN3SkFJQUVpQVNBQ1J3MEFRUlloRUF6Z0F3c2dBRUdLZ0lDQUFEWUNDQ0FBSUFFMkFnUWdBQ0FCSUFJUXVJQ0FnQUFpRUEzcUFTQUJJUUZCSUNFUURNWURDd0pBSUFFaUFTQUNSZzBBQTBBQ1FDQUJMUUFBUWZDM2dJQUFhaTBBQUNJUVFRSkdEUUFDUUNBUVFYOXFEZ1RsQWV3QkFPc0I3QUVMSUFGQkFXb2hBVUVJSVJBTXlBTUxJQUZCQVdvaUFTQUNSdzBBQzBFVklSQU0zd01MUVJVaEVBemVBd3NEUUFKQUlBRXRBQUJCOExtQWdBQnFMUUFBSWhCQkFrWU5BQ0FRUVg5cURnVGVBZXdCNEFIckFld0JDeUFCUVFGcUlnRWdBa2NOQUF0QkdDRVFETjBEQ3dKQUlBRWlBU0FDUmcwQUlBQkJpNENBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUVISVJBTXhBTUxRUmtoRUF6Y0F3c2dBVUVCYWlFQkRBSUxBa0FnQVNJVUlBSkhEUUJCR2lFUUROc0RDeUFVSVFFQ1FDQVVMUUFBUVhOcURoVGRBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBZ0R1QWd0QkFDRVFJQUJCQURZQ0hDQUFRYStMZ0lBQU5nSVFJQUJCQWpZQ0RDQUFJQlJCQVdvMkFoUU0yZ01MQWtBZ0FTMEFBQ0lRUVR0R0RRQWdFRUVOUnczb0FTQUJRUUZxSVFFTTVRSUxJQUZCQVdvaEFRdEJJaUVRREw4REN3SkFJQUVpRUNBQ1J3MEFRUndoRUF6WUF3dENBQ0VSSUJBaEFTQVFMUUFBUVZCcURqZm5BZVlCQVFJREJBVUdCd2dBQUFBQUFBQUFDUW9MREEwT0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUEVCRVNFeFFBQzBFZUlSQU12UU1MUWdJaEVRemxBUXRDQXlFUkRPUUJDMElFSVJFTTR3RUxRZ1VoRVF6aUFRdENCaUVSRE9FQkMwSUhJUkVNNEFFTFFnZ2hFUXpmQVF0Q0NTRVJETjRCQzBJS0lSRU0zUUVMUWdzaEVRemNBUXRDRENFUkROc0JDMElOSVJFTTJnRUxRZzRoRVF6WkFRdENEeUVSRE5nQkMwSUtJUkVNMXdFTFFnc2hFUXpXQVF0Q0RDRVJETlVCQzBJTklSRU0xQUVMUWc0aEVRelRBUXRDRHlFUkROSUJDMElBSVJFQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQkF0QUFCQlVHb09OK1VCNUFFQUFRSURCQVVHQitZQjVnSG1BZVlCNWdIbUFlWUJDQWtLQ3d3TjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQVE0UEVCRVNFK1lCQzBJQ0lSRU01QUVMUWdNaEVRempBUXRDQkNFUkRPSUJDMElGSVJFTTRRRUxRZ1loRVF6Z0FRdENCeUVSRE44QkMwSUlJUkVNM2dFTFFna2hFUXpkQVF0Q0NpRVJETndCQzBJTElSRU0yd0VMUWd3aEVRemFBUXRDRFNFUkROa0JDMElPSVJFTTJBRUxRZzhoRVF6WEFRdENDaUVSRE5ZQkMwSUxJUkVNMVFFTFFnd2hFUXpVQVF0Q0RTRVJETk1CQzBJT0lSRU0wZ0VMUWc4aEVRelJBUXNnQUVJQUlBQXBBeUFpRVNBQ0lBRWlFR3V0SWhKOUloTWdFeUFSVmhzM0F5QWdFU0FTVmlJVVJRM1NBVUVmSVJBTXdBTUxBa0FnQVNJQklBSkdEUUFnQUVHSmdJQ0FBRFlDQ0NBQUlBRTJBZ1FnQVNFQlFTUWhFQXluQXd0QklDRVFETDhEQ3lBQUlBRWlFQ0FDRUw2QWdJQUFRWDlxRGdXMkFRREZBZ0hSQWRJQkMwRVJJUkFNcEFNTElBQkJBVG9BTHlBUUlRRU11d01MSUFFaUFTQUNSdzNTQVVFa0lSQU11d01MSUFFaURTQUNSdzBlUWNZQUlSQU11Z01MSUFBZ0FTSUJJQUlRc29DQWdBQWlFQTNVQVNBQklRRU10UUVMSUFFaUVDQUNSdzBtUWRBQUlSQU11QU1MQWtBZ0FTSUJJQUpIRFFCQktDRVFETGdEQ3lBQVFRQTJBZ1FnQUVHTWdJQ0FBRFlDQ0NBQUlBRWdBUkN4Z0lDQUFDSVFEZE1CSUFFaEFRellBUXNDUUNBQkloQWdBa2NOQUVFcElSQU10d01MSUJBdEFBQWlBVUVnUmcwVUlBRkJDVWNOMHdFZ0VFRUJhaUVCREJVTEFrQWdBU0lCSUFKR0RRQWdBVUVCYWlFQkRCY0xRU29oRUF5MUF3c0NRQ0FCSWhBZ0FrY05BRUVySVJBTXRRTUxBa0FnRUMwQUFDSUJRUWxHRFFBZ0FVRWdSdzNWQVFzZ0FDMEFMRUVJUmczVEFTQVFJUUVNa1FNTEFrQWdBU0lCSUFKSERRQkJMQ0VRRExRREN5QUJMUUFBUVFwSERkVUJJQUZCQVdvaEFRekpBZ3NnQVNJT0lBSkhEZFVCUVM4aEVBeXlBd3NEUUFKQUlBRXRBQUFpRUVFZ1JnMEFBa0FnRUVGMmFnNEVBTndCM0FFQTJnRUxJQUVoQVF6Z0FRc2dBVUVCYWlJQklBSkhEUUFMUVRFaEVBeXhBd3RCTWlFUUlBRWlGQ0FDUmcyd0F5QUNJQlJySUFBb0FnQWlBV29oRlNBVUlBRnJRUU5xSVJZQ1FBTkFJQlF0QUFBaUYwRWdjaUFYSUJkQnYzOXFRZjhCY1VFYVNSdEIvd0Z4SUFGQjhMdUFnQUJxTFFBQVJ3MEJBa0FnQVVFRFJ3MEFRUVloQVF5V0F3c2dBVUVCYWlFQklCUkJBV29pRkNBQ1J3MEFDeUFBSUJVMkFnQU1zUU1MSUFCQkFEWUNBQ0FVSVFFTTJRRUxRVE1oRUNBQkloUWdBa1lOcndNZ0FpQVVheUFBS0FJQUlnRnFJUlVnRkNBQmEwRUlhaUVXQWtBRFFDQVVMUUFBSWhkQklISWdGeUFYUWI5L2FrSC9BWEZCR2trYlFmOEJjU0FCUWZTN2dJQUFhaTBBQUVjTkFRSkFJQUZCQ0VjTkFFRUZJUUVNbFFNTElBRkJBV29oQVNBVVFRRnFJaFFnQWtjTkFBc2dBQ0FWTmdJQURMQURDeUFBUVFBMkFnQWdGQ0VCRE5nQkMwRTBJUkFnQVNJVUlBSkdEYTRESUFJZ0ZHc2dBQ2dDQUNJQmFpRVZJQlFnQVd0QkJXb2hGZ0pBQTBBZ0ZDMEFBQ0lYUVNCeUlCY2dGMEcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUhRd29DQUFHb3RBQUJIRFFFQ1FDQUJRUVZIRFFCQkJ5RUJESlFEQ3lBQlFRRnFJUUVnRkVFQmFpSVVJQUpIRFFBTElBQWdGVFlDQUF5dkF3c2dBRUVBTmdJQUlCUWhBUXpYQVFzQ1FDQUJJZ0VnQWtZTkFBTkFBa0FnQVMwQUFFR0F2b0NBQUdvdEFBQWlFRUVCUmcwQUlCQkJBa1lOQ2lBQklRRU0zUUVMSUFGQkFXb2lBU0FDUncwQUMwRXdJUkFNcmdNTFFUQWhFQXl0QXdzQ1FDQUJJZ0VnQWtZTkFBTkFBa0FnQVMwQUFDSVFRU0JHRFFBZ0VFRjJhZzRFMlFIYUFkb0IyUUhhQVFzZ0FVRUJhaUlCSUFKSERRQUxRVGdoRUF5dEF3dEJPQ0VRREt3REN3TkFBa0FnQVMwQUFDSVFRU0JHRFFBZ0VFRUpSdzBEQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQQ0VRREtzREN3TkFBa0FnQVMwQUFDSVFRU0JHRFFBQ1FBSkFJQkJCZG1vT0JOb0JBUUhhQVFBTElCQkJMRVlOMndFTElBRWhBUXdFQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQeUVRREtvREN5QUJJUUVNMndFTFFjQUFJUkFnQVNJVUlBSkdEYWdESUFJZ0ZHc2dBQ2dDQUNJQmFpRVdJQlFnQVd0QkJtb2hGd0pBQTBBZ0ZDMEFBRUVnY2lBQlFZREFnSUFBYWkwQUFFY05BU0FCUVFaR0RZNERJQUZCQVdvaEFTQVVRUUZxSWhRZ0FrY05BQXNnQUNBV05nSUFES2tEQ3lBQVFRQTJBZ0FnRkNFQkMwRTJJUkFNamdNTEFrQWdBU0lQSUFKSERRQkJ3UUFoRUF5bkF3c2dBRUdNZ0lDQUFEWUNDQ0FBSUE4MkFnUWdEeUVCSUFBdEFDeEJmMm9PQk0wQjFRSFhBZGtCaHdNTElBRkJBV29oQVF6TUFRc0NRQ0FCSWdFZ0FrWU5BQU5BQWtBZ0FTMEFBQ0lRUVNCeUlCQWdFRUcvZjJwQi93RnhRUnBKRzBIL0FYRWlFRUVKUmcwQUlCQkJJRVlOQUFKQUFrQUNRQUpBSUJCQm5YOXFEaE1BQXdNREF3TURBd0VEQXdNREF3TURBd01DQXdzZ0FVRUJhaUVCUVRFaEVBeVJBd3NnQVVFQmFpRUJRVEloRUF5UUF3c2dBVUVCYWlFQlFUTWhFQXlQQXdzZ0FTRUJETkFCQ3lBQlFRRnFJZ0VnQWtjTkFBdEJOU0VRREtVREMwRTFJUkFNcEFNTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQkJnTHlBZ0FCcUxRQUFRUUZHRFFBZ0FTRUJETk1CQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQU0VRREtRREMwRTlJUkFNb3dNTElBQWdBU0lCSUFJUXNJQ0FnQUFpRUEzV0FTQUJJUUVNQVFzZ0VFRUJhaUVCQzBFOElSQU1od01MQWtBZ0FTSUJJQUpIRFFCQndnQWhFQXlnQXdzQ1FBTkFBa0FnQVMwQUFFRjNhZzRZQUFMK0F2NENoQVArQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0lBL2dJTElBRkJBV29pQVNBQ1J3MEFDMEhDQUNFUURLQURDeUFCUVFGcUlRRWdBQzBBTFVFQmNVVU52UUVnQVNFQkMwRXNJUkFNaFFNTElBRWlBU0FDUnczVEFVSEVBQ0VRREowREN3TkFBa0FnQVMwQUFFR1F3SUNBQUdvdEFBQkJBVVlOQUNBQklRRU10d0lMSUFGQkFXb2lBU0FDUncwQUMwSEZBQ0VRREp3REN5QU5MUUFBSWhCQklFWU5zd0VnRUVFNlJ3MkJBeUFBS0FJRUlRRWdBRUVBTmdJRUlBQWdBU0FORUsrQWdJQUFJZ0VOMEFFZ0RVRUJhaUVCRExNQ0MwSEhBQ0VRSUFFaURTQUNSZzJhQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRVnFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRWkRDZ0lBQWFpMEFBRWNOZ0FNZ0FVRUZSZzMwQWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5YUF3dEJ5QUFoRUNBQklnMGdBa1lObVFNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRUphaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdXd29DQUFHb3RBQUJIRGY4Q0FrQWdBVUVKUncwQVFRSWhBUXoxQWdzZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTW1RTUxBa0FnQVNJTklBSkhEUUJCeVFBaEVBeVpBd3NDUUFKQUlBMHRBQUFpQVVFZ2NpQUJJQUZCdjM5cVFmOEJjVUVhU1J0Qi93RnhRWkovYWc0SEFJQURnQU9BQTRBRGdBTUJnQU1MSUExQkFXb2hBVUUrSVJBTWdBTUxJQTFCQVdvaEFVRS9JUkFNL3dJTFFjb0FJUkFnQVNJTklBSkdEWmNESUFJZ0RXc2dBQ2dDQUNJQmFpRVdJQTBnQVd0QkFXb2hGd05BSUEwdEFBQWlGRUVnY2lBVUlCUkJ2MzlxUWY4QmNVRWFTUnRCL3dGeElBRkJvTUtBZ0FCcUxRQUFSdzM5QWlBQlFRRkdEZkFDSUFGQkFXb2hBU0FOUVFGcUlnMGdBa2NOQUFzZ0FDQVdOZ0lBREpjREMwSExBQ0VRSUFFaURTQUNSZzJXQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRNXFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRYUxDZ0lBQWFpMEFBRWNOL0FJZ0FVRU9SZzN3QWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5V0F3dEJ6QUFoRUNBQklnMGdBa1lObFFNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRVBhaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUhBd29DQUFHb3RBQUJIRGZzQ0FrQWdBVUVQUncwQVFRTWhBUXp4QWdzZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTWxRTUxRYzBBSVJBZ0FTSU5JQUpHRFpRRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJCV29oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCME1LQWdBQnFMUUFBUnczNkFnSkFJQUZCQlVjTkFFRUVJUUVNOEFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKUURDd0pBSUFFaURTQUNSdzBBUWM0QUlSQU1sQU1MQWtBQ1FBSkFBa0FnRFMwQUFDSUJRU0J5SUFFZ0FVRy9mMnBCL3dGeFFScEpHMEgvQVhGQm5YOXFEaE1BL1FMOUF2MEMvUUw5QXYwQy9RTDlBdjBDL1FMOUF2MENBZjBDL1FMOUFnSUQvUUlMSUExQkFXb2hBVUhCQUNFUURQMENDeUFOUVFGcUlRRkJ3Z0FoRUF6OEFnc2dEVUVCYWlFQlFjTUFJUkFNK3dJTElBMUJBV29oQVVIRUFDRVFEUG9DQ3dKQUlBRWlBU0FDUmcwQUlBQkJqWUNBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUhGQUNFUURQb0NDMEhQQUNFUURKSURDeUFRSVFFQ1FBSkFJQkF0QUFCQmRtb09CQUdvQXFnQ0FLZ0NDeUFRUVFGcUlRRUxRU2NoRUF6NEFnc0NRQ0FCSWdFZ0FrY05BRUhSQUNFUURKRURDd0pBSUFFdEFBQkJJRVlOQUNBQklRRU1qUUVMSUFGQkFXb2hBU0FBTFFBdFFRRnhSUTNIQVNBQklRRU1qQUVMSUFFaUZ5QUNSdzNJQVVIU0FDRVFESThEQzBIVEFDRVFJQUVpRkNBQ1JnMk9BeUFDSUJScklBQW9BZ0FpQVdvaEZpQVVJQUZyUVFGcUlSY0RRQ0FVTFFBQUlBRkIxc0tBZ0FCcUxRQUFSdzNNQVNBQlFRRkdEY2NCSUFGQkFXb2hBU0FVUVFGcUloUWdBa2NOQUFzZ0FDQVdOZ0lBREk0REN3SkFJQUVpQVNBQ1J3MEFRZFVBSVJBTWpnTUxJQUV0QUFCQkNrY056QUVnQVVFQmFpRUJETWNCQ3dKQUlBRWlBU0FDUncwQVFkWUFJUkFNalFNTEFrQUNRQ0FCTFFBQVFYWnFEZ1FBelFITkFRSE5BUXNnQVVFQmFpRUJETWNCQ3lBQlFRRnFJUUZCeWdBaEVBenpBZ3NnQUNBQklnRWdBaEN1Z0lDQUFDSVFEY3NCSUFFaEFVSE5BQ0VRRFBJQ0N5QUFMUUFwUVNKR0RZVURES1lDQ3dKQUlBRWlBU0FDUncwQVFkc0FJUkFNaWdNTFFRQWhGRUVCSVJkQkFTRVdRUUFoRUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQkxRQUFRVkJxRGdyVUFkTUJBQUVDQXdRRkJnalZBUXRCQWlFUURBWUxRUU1oRUF3RkMwRUVJUkFNQkF0QkJTRVFEQU1MUVFZaEVBd0NDMEVISVJBTUFRdEJDQ0VRQzBFQUlSZEJBQ0VXUVFBaEZBek1BUXRCQ1NFUVFRRWhGRUVBSVJkQkFDRVdETXNCQ3dKQUlBRWlBU0FDUncwQVFkMEFJUkFNaVFNTElBRXRBQUJCTGtjTnpBRWdBVUVCYWlFQkRLWUNDeUFCSWdFZ0FrY056QUZCM3dBaEVBeUhBd3NDUUNBQklnRWdBa1lOQUNBQVFZNkFnSUFBTmdJSUlBQWdBVFlDQkNBQklRRkIwQUFoRUF6dUFndEI0QUFoRUF5R0F3dEI0UUFoRUNBQklnRWdBa1lOaFFNZ0FpQUJheUFBS0FJQUloUnFJUllnQVNBVWEwRURhaUVYQTBBZ0FTMEFBQ0FVUWVMQ2dJQUFhaTBBQUVjTnpRRWdGRUVEUmczTUFTQVVRUUZxSVJRZ0FVRUJhaUlCSUFKSERRQUxJQUFnRmpZQ0FBeUZBd3RCNGdBaEVDQUJJZ0VnQWtZTmhBTWdBaUFCYXlBQUtBSUFJaFJxSVJZZ0FTQVVhMEVDYWlFWEEwQWdBUzBBQUNBVVFlYkNnSUFBYWkwQUFFY056QUVnRkVFQ1JnM09BU0FVUVFGcUlSUWdBVUVCYWlJQklBSkhEUUFMSUFBZ0ZqWUNBQXlFQXd0QjR3QWhFQ0FCSWdFZ0FrWU5nd01nQWlBQmF5QUFLQUlBSWhScUlSWWdBU0FVYTBFRGFpRVhBMEFnQVMwQUFDQVVRZW5DZ0lBQWFpMEFBRWNOeXdFZ0ZFRURSZzNPQVNBVVFRRnFJUlFnQVVFQmFpSUJJQUpIRFFBTElBQWdGallDQUF5REF3c0NRQ0FCSWdFZ0FrY05BRUhsQUNFUURJTURDeUFBSUFGQkFXb2lBU0FDRUtpQWdJQUFJaEFOelFFZ0FTRUJRZFlBSVJBTTZRSUxBa0FnQVNJQklBSkdEUUFEUUFKQUlBRXRBQUFpRUVFZ1JnMEFBa0FDUUFKQUlCQkJ1SDlxRGdzQUFjOEJ6d0hQQWM4Qnp3SFBBYzhCendFQ3p3RUxJQUZCQVdvaEFVSFNBQ0VRRE8wQ0N5QUJRUUZxSVFGQjB3QWhFQXpzQWdzZ0FVRUJhaUVCUWRRQUlSQU02d0lMSUFGQkFXb2lBU0FDUncwQUMwSGtBQ0VRRElJREMwSGtBQ0VRRElFREN3TkFBa0FnQVMwQUFFSHd3b0NBQUdvdEFBQWlFRUVCUmcwQUlCQkJmbW9PQTg4QjBBSFJBZElCQ3lBQlFRRnFJZ0VnQWtjTkFBdEI1Z0FoRUF5QUF3c0NRQ0FCSWdFZ0FrWU5BQ0FCUVFGcUlRRU1Bd3RCNXdBaEVBei9BZ3NEUUFKQUlBRXRBQUJCOE1TQWdBQnFMUUFBSWhCQkFVWU5BQUpBSUJCQmZtb09CTklCMHdIVUFRRFZBUXNnQVNFQlFkY0FJUkFNNXdJTElBRkJBV29pQVNBQ1J3MEFDMEhvQUNFUURQNENDd0pBSUFFaUFTQUNSdzBBUWVrQUlSQU0vZ0lMQWtBZ0FTMEFBQ0lRUVhacURocTZBZFVCMVFHOEFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFjb0IxUUhWQVFEVEFRc2dBVUVCYWlFQkMwRUdJUkFNNHdJTEEwQUNRQ0FCTFFBQVFmREdnSUFBYWkwQUFFRUJSZzBBSUFFaEFReWVBZ3NnQVVFQmFpSUJJQUpIRFFBTFFlb0FJUkFNK3dJTEFrQWdBU0lCSUFKR0RRQWdBVUVCYWlFQkRBTUxRZXNBSVJBTStnSUxBa0FnQVNJQklBSkhEUUJCN0FBaEVBejZBZ3NnQVVFQmFpRUJEQUVMQWtBZ0FTSUJJQUpIRFFCQjdRQWhFQXo1QWdzZ0FVRUJhaUVCQzBFRUlSQU0zZ0lMQWtBZ0FTSVVJQUpIRFFCQjdnQWhFQXozQWdzZ0ZDRUJBa0FDUUFKQUlCUXRBQUJCOE1pQWdBQnFMUUFBUVg5cURnZlVBZFVCMWdFQW5BSUJBdGNCQ3lBVVFRRnFJUUVNQ2dzZ0ZFRUJhaUVCRE0wQkMwRUFJUkFnQUVFQU5nSWNJQUJCbTVLQWdBQTJBaEFnQUVFSE5nSU1JQUFnRkVFQmFqWUNGQXoyQWdzQ1FBTkFBa0FnQVMwQUFFSHd5SUNBQUdvdEFBQWlFRUVFUmcwQUFrQUNRQ0FRUVg5cURnZlNBZE1CMUFIWkFRQUVBZGtCQ3lBQklRRkIyZ0FoRUF6Z0Fnc2dBVUVCYWlFQlFkd0FJUkFNM3dJTElBRkJBV29pQVNBQ1J3MEFDMEh2QUNFUURQWUNDeUFCUVFGcUlRRU15d0VMQWtBZ0FTSVVJQUpIRFFCQjhBQWhFQXoxQWdzZ0ZDMEFBRUV2UnczVUFTQVVRUUZxSVFFTUJnc0NRQ0FCSWhRZ0FrY05BRUh4QUNFUURQUUNDd0pBSUJRdEFBQWlBVUV2UncwQUlCUkJBV29oQVVIZEFDRVFETnNDQ3lBQlFYWnFJZ1JCRmtzTjB3RkJBU0FFZEVHSmdJQUNjVVVOMHdFTXlnSUxBa0FnQVNJQklBSkdEUUFnQVVFQmFpRUJRZDRBSVJBTTJnSUxRZklBSVJBTThnSUxBa0FnQVNJVUlBSkhEUUJCOUFBaEVBenlBZ3NnRkNFQkFrQWdGQzBBQUVId3pJQ0FBR290QUFCQmYyb09BOGtDbEFJQTFBRUxRZUVBSVJBTTJBSUxBa0FnQVNJVUlBSkdEUUFEUUFKQUlCUXRBQUJCOE1xQWdBQnFMUUFBSWdGQkEwWU5BQUpBSUFGQmYyb09Bc3NDQU5VQkN5QVVJUUZCM3dBaEVBemFBZ3NnRkVFQmFpSVVJQUpIRFFBTFFmTUFJUkFNOFFJTFFmTUFJUkFNOEFJTEFrQWdBU0lCSUFKR0RRQWdBRUdQZ0lDQUFEWUNDQ0FBSUFFMkFnUWdBU0VCUWVBQUlSQU0xd0lMUWZVQUlSQU03d0lMQWtBZ0FTSUJJQUpIRFFCQjlnQWhFQXp2QWdzZ0FFR1BnSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJDMEVESVJBTTFBSUxBMEFnQVMwQUFFRWdSdzNEQWlBQlFRRnFJZ0VnQWtjTkFBdEI5d0FoRUF6c0Fnc0NRQ0FCSWdFZ0FrY05BRUg0QUNFUURPd0NDeUFCTFFBQVFTQkhEYzRCSUFGQkFXb2hBUXp2QVFzZ0FDQUJJZ0VnQWhDc2dJQ0FBQ0lRRGM0QklBRWhBUXlPQWdzQ1FDQUJJZ1FnQWtjTkFFSDZBQ0VRRE9vQ0N5QUVMUUFBUWN3QVJ3M1JBU0FFUVFGcUlRRkJFeUVRRE04QkN3SkFJQUVpQkNBQ1J3MEFRZnNBSVJBTTZRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQldvaEVBTkFJQVF0QUFBZ0FVSHd6b0NBQUdvdEFBQkhEZEFCSUFGQkJVWU56Z0VnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCK3dBaEVBem9BZ3NDUUNBQklnUWdBa2NOQUVIOEFDRVFET2dDQ3dKQUFrQWdCQzBBQUVHOWYyb09EQURSQWRFQjBRSFJBZEVCMFFIUkFkRUIwUUhSQVFIUkFRc2dCRUVCYWlFQlFlWUFJUkFNendJTElBUkJBV29oQVVIbkFDRVFETTRDQ3dKQUlBRWlCQ0FDUncwQVFmMEFJUkFNNXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBbW9oRUFKQUEwQWdCQzBBQUNBQlFlM1BnSUFBYWkwQUFFY056d0VnQVVFQ1JnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjBBSVJBTTV3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQkVDRVFETXdCQ3dKQUlBRWlCQ0FDUncwQVFmNEFJUkFNNWdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCV29oRUFKQUEwQWdCQzBBQUNBQlFmYk9nSUFBYWkwQUFFY056Z0VnQVVFRlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjRBSVJBTTVnSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkZpRVFETXNCQ3dKQUlBRWlCQ0FDUncwQVFmOEFJUkFNNVFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBMm9oRUFKQUEwQWdCQzBBQUNBQlFmek9nSUFBYWkwQUFFY056UUVnQVVFRFJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjhBSVJBTTVRSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkJTRVFETW9CQ3dKQUlBRWlCQ0FDUncwQVFZQUJJUkFNNUFJTElBUXRBQUJCMlFCSERjc0JJQVJCQVdvaEFVRUlJUkFNeVFFTEFrQWdBU0lFSUFKSERRQkJnUUVoRUF6akFnc0NRQUpBSUFRdEFBQkJzbjlxRGdNQXpBRUJ6QUVMSUFSQkFXb2hBVUhyQUNFUURNb0NDeUFFUVFGcUlRRkI3QUFoRUF6SkFnc0NRQ0FCSWdRZ0FrY05BRUdDQVNFUURPSUNDd0pBQWtBZ0JDMEFBRUc0ZjJvT0NBRExBY3NCeXdITEFjc0J5d0VCeXdFTElBUkJBV29oQVVIcUFDRVFETWtDQ3lBRVFRRnFJUUZCN1FBaEVBeklBZ3NDUUNBQklnUWdBa2NOQUVHREFTRVFET0VDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hFQ0FFSUFGclFRSnFJUlFDUUFOQUlBUXRBQUFnQVVHQXo0Q0FBR290QUFCSERja0JJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRURZQ0FFR0RBU0VRRE9FQ0MwRUFJUkFnQUVFQU5nSUFJQlJCQVdvaEFRekdBUXNDUUNBQklnUWdBa2NOQUVHRUFTRVFET0FDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRUnFJUkFDUUFOQUlBUXRBQUFnQVVHRHo0Q0FBR290QUFCSERjZ0JJQUZCQkVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR0VBU0VRRE9BQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVNNaEVBekZBUXNDUUNBQklnUWdBa2NOQUVHRkFTRVFETjhDQ3dKQUFrQWdCQzBBQUVHMGYyb09DQURJQWNnQnlBSElBY2dCeUFFQnlBRUxJQVJCQVdvaEFVSHZBQ0VRRE1ZQ0N5QUVRUUZxSVFGQjhBQWhFQXpGQWdzQ1FDQUJJZ1FnQWtjTkFFR0dBU0VRRE40Q0N5QUVMUUFBUWNVQVJ3M0ZBU0FFUVFGcUlRRU1nd0lMQWtBZ0FTSUVJQUpIRFFCQmh3RWhFQXpkQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRURhaUVRQWtBRFFDQUVMUUFBSUFGQmlNK0FnQUJxTFFBQVJ3M0ZBU0FCUVFOR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJod0VoRUF6ZEFnc2dBRUVBTmdJQUlCQkJBV29oQVVFdElSQU13Z0VMQWtBZ0FTSUVJQUpIRFFCQmlBRWhFQXpjQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUlhaUVRQWtBRFFDQUVMUUFBSUFGQjBNK0FnQUJxTFFBQVJ3M0VBU0FCUVFoR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJpQUVoRUF6Y0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFcElSQU13UUVMQWtBZ0FTSUJJQUpIRFFCQmlRRWhFQXpiQWd0QkFTRVFJQUV0QUFCQjN3QkhEY0FCSUFGQkFXb2hBUXlCQWdzQ1FDQUJJZ1FnQWtjTkFFR0tBU0VRRE5vQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUZxSVJBRFFDQUVMUUFBSUFGQmpNK0FnQUJxTFFBQVJ3M0JBU0FCUVFGR0RhOENJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWW9CSVJBTTJRSUxBa0FnQVNJRUlBSkhEUUJCaXdFaEVBelpBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQ2FpRVFBa0FEUUNBRUxRQUFJQUZCanMrQWdBQnFMUUFBUnczQkFTQUJRUUpHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQml3RWhFQXpaQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVDSVJBTXZnRUxBa0FnQVNJRUlBSkhEUUJCakFFaEVBellBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCOE0rQWdBQnFMUUFBUnczQUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQmpBRWhFQXpZQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVmSVJBTXZRRUxBa0FnQVNJRUlBSkhEUUJCalFFaEVBelhBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCOHMrQWdBQnFMUUFBUncyL0FTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQmpRRWhFQXpYQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVKSVJBTXZBRUxBa0FnQVNJRUlBSkhEUUJCamdFaEVBeldBZ3NDUUFKQUlBUXRBQUJCdDM5cURnY0F2d0cvQWI4QnZ3Ry9BUUcvQVFzZ0JFRUJhaUVCUWZnQUlSQU12UUlMSUFSQkFXb2hBVUg1QUNFUURMd0NDd0pBSUFFaUJDQUNSdzBBUVk4QklSQU0xUUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUVpIUGdJQUFhaTBBQUVjTnZRRWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZOEJJUkFNMVFJTElBQkJBRFlDQUNBUVFRRnFJUUZCR0NFUURMb0JDd0pBSUFFaUJDQUNSdzBBUVpBQklSQU0xQUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUVpmUGdJQUFhaTBBQUVjTnZBRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaQUJJUkFNMUFJTElBQkJBRFlDQUNBUVFRRnFJUUZCRnlFUURMa0JDd0pBSUFFaUJDQUNSdzBBUVpFQklSQU0wd0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJtb2hFQUpBQTBBZ0JDMEFBQ0FCUVpyUGdJQUFhaTBBQUVjTnV3RWdBVUVHUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaRUJJUkFNMHdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRlNFUURMZ0JDd0pBSUFFaUJDQUNSdzBBUVpJQklSQU0wZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUWFIUGdJQUFhaTBBQUVjTnVnRWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaSUJJUkFNMGdJTElBQkJBRFlDQUNBUVFRRnFJUUZCSGlFUURMY0JDd0pBSUFFaUJDQUNSdzBBUVpNQklSQU0wUUlMSUFRdEFBQkJ6QUJIRGJnQklBUkJBV29oQVVFS0lSQU10Z0VMQWtBZ0JDQUNSdzBBUVpRQklSQU0wQUlMQWtBQ1FDQUVMUUFBUWI5L2FnNFBBTGtCdVFHNUFia0J1UUc1QWJrQnVRRzVBYmtCdVFHNUFia0JBYmtCQ3lBRVFRRnFJUUZCL2dBaEVBeTNBZ3NnQkVFQmFpRUJRZjhBSVJBTXRnSUxBa0FnQkNBQ1J3MEFRWlVCSVJBTXp3SUxBa0FDUUNBRUxRQUFRYjkvYWc0REFMZ0JBYmdCQ3lBRVFRRnFJUUZCL1FBaEVBeTJBZ3NnQkVFQmFpRUVRWUFCSVJBTXRRSUxBa0FnQkNBQ1J3MEFRWllCSVJBTXpnSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRYWZQZ0lBQWFpMEFBRWNOdGdFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVpZQklSQU16Z0lMSUFCQkFEWUNBQ0FRUVFGcUlRRkJDeUVRRExNQkN3SkFJQVFnQWtjTkFFR1hBU0VRRE0wQ0N3SkFBa0FDUUFKQUlBUXRBQUJCVTJvT0l3QzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0JBYmdCdUFHNEFiZ0J1QUVDdUFHNEFiZ0JBN2dCQ3lBRVFRRnFJUUZCK3dBaEVBeTJBZ3NnQkVFQmFpRUJRZndBSVJBTXRRSUxJQVJCQVdvaEJFR0JBU0VRRExRQ0N5QUVRUUZxSVFSQmdnRWhFQXl6QWdzQ1FDQUVJQUpIRFFCQm1BRWhFQXpNQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQnFjK0FnQUJxTFFBQVJ3MjBBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJtQUVoRUF6TUFnc2dBRUVBTmdJQUlCQkJBV29oQVVFWklSQU1zUUVMQWtBZ0JDQUNSdzBBUVprQklSQU15d0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUWE3UGdJQUFhaTBBQUVjTnN3RWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaa0JJUkFNeXdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQmlFUURMQUJDd0pBSUFRZ0FrY05BRUdhQVNFUURNb0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFGcUlSQUNRQU5BSUFRdEFBQWdBVUcwejRDQUFHb3RBQUJIRGJJQklBRkJBVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHYUFTRVFETW9DQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUndoRUF5dkFRc0NRQ0FFSUFKSERRQkJtd0VoRUF6SkFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVCYWlFUUFrQURRQ0FFTFFBQUlBRkJ0cytBZ0FCcUxRQUFSdzJ4QVNBQlFRRkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCbXdFaEVBekpBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRW5JUkFNcmdFTEFrQWdCQ0FDUncwQVFad0JJUkFNeUFJTEFrQUNRQ0FFTFFBQVFheC9hZzRDQUFHeEFRc2dCRUVCYWlFRVFZWUJJUkFNcndJTElBUkJBV29oQkVHSEFTRVFESzRDQ3dKQUlBUWdBa2NOQUVHZEFTRVFETWNDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRRnFJUkFDUUFOQUlBUXRBQUFnQVVHNHo0Q0FBR290QUFCSERhOEJJQUZCQVVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR2RBU0VRRE1jQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVNZaEVBeXNBUXNDUUNBRUlBSkhEUUJCbmdFaEVBekdBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCdXMrQWdBQnFMUUFBUncydUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQm5nRWhFQXpHQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVESVJBTXF3RUxBa0FnQkNBQ1J3MEFRWjhCSVJBTXhRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQW1vaEVBSkFBMEFnQkMwQUFDQUJRZTNQZ0lBQWFpMEFBRWNOclFFZ0FVRUNSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVo4QklSQU14UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJEQ0VRREtvQkN3SkFJQVFnQWtjTkFFR2dBU0VRRE1RQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUU5xSVJBQ1FBTkFJQVF0QUFBZ0FVRzh6NENBQUdvdEFBQkhEYXdCSUFGQkEwWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdnQVNFUURNUUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFRMGhFQXlwQVFzQ1FDQUVJQUpIRFFCQm9RRWhFQXpEQWdzQ1FBSkFJQVF0QUFCQnVuOXFEZ3NBckFHc0Fhd0JyQUdzQWF3QnJBR3NBYXdCQWF3QkN5QUVRUUZxSVFSQml3RWhFQXlxQWdzZ0JFRUJhaUVFUVl3QklSQU1xUUlMQWtBZ0JDQUNSdzBBUWFJQklSQU13Z0lMSUFRdEFBQkIwQUJIRGFrQklBUkJBV29oQkF6cEFRc0NRQ0FFSUFKSERRQkJvd0VoRUF6QkFnc0NRQUpBSUFRdEFBQkJ0MzlxRGdjQnFnR3FBYW9CcWdHcUFRQ3FBUXNnQkVFQmFpRUVRWTRCSVJBTXFBSUxJQVJCQVdvaEFVRWlJUkFNcGdFTEFrQWdCQ0FDUncwQVFhUUJJUkFNd0FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBV29oRUFKQUEwQWdCQzBBQUNBQlFjRFBnSUFBYWkwQUFFY05xQUVnQVVFQlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYVFCSVJBTXdBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkhTRVFES1VCQ3dKQUlBUWdBa2NOQUVHbEFTRVFETDhDQ3dKQUFrQWdCQzBBQUVHdWYyb09Bd0NvQVFHb0FRc2dCRUVCYWlFRVFaQUJJUkFNcGdJTElBUkJBV29oQVVFRUlSQU1wQUVMQWtBZ0JDQUNSdzBBUWFZQklSQU12Z0lMQWtBQ1FBSkFBa0FDUUNBRUxRQUFRYjkvYWc0VkFLb0JxZ0dxQWFvQnFnR3FBYW9CcWdHcUFhb0JBYW9CcWdFQ3FnR3FBUU9xQWFvQkJLb0JDeUFFUVFGcUlRUkJpQUVoRUF5b0Fnc2dCRUVCYWlFRVFZa0JJUkFNcHdJTElBUkJBV29oQkVHS0FTRVFES1lDQ3lBRVFRRnFJUVJCandFaEVBeWxBZ3NnQkVFQmFpRUVRWkVCSVJBTXBBSUxBa0FnQkNBQ1J3MEFRYWNCSVJBTXZRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQW1vaEVBSkFBMEFnQkMwQUFDQUJRZTNQZ0lBQWFpMEFBRWNOcFFFZ0FVRUNSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWFjQklSQU12UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJFU0VRREtJQkN3SkFJQVFnQWtjTkFFR29BU0VRREx3Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSEN6NENBQUdvdEFBQkhEYVFCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdvQVNFUURMd0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFTd2hFQXloQVFzQ1FDQUVJQUpIRFFCQnFRRWhFQXk3QWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQnhjK0FnQUJxTFFBQVJ3MmpBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJxUUVoRUF5N0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFcklSQU1vQUVMQWtBZ0JDQUNSdzBBUWFvQklSQU11Z0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUWNyUGdJQUFhaTBBQUVjTm9nRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFhb0JJUkFNdWdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRkNFUURKOEJDd0pBSUFRZ0FrY05BRUdyQVNFUURMa0NDd0pBQWtBQ1FBSkFJQVF0QUFCQnZuOXFEZzhBQVFLa0FhUUJwQUdrQWFRQnBBR2tBYVFCcEFHa0FhUUJBNlFCQ3lBRVFRRnFJUVJCa3dFaEVBeWlBZ3NnQkVFQmFpRUVRWlFCSVJBTW9RSUxJQVJCQVdvaEJFR1ZBU0VRREtBQ0N5QUVRUUZxSVFSQmxnRWhFQXlmQWdzQ1FDQUVJQUpIRFFCQnJBRWhFQXk0QWdzZ0JDMEFBRUhGQUVjTm53RWdCRUVCYWlFRURPQUJDd0pBSUFRZ0FrY05BRUd0QVNFUURMY0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUhOejRDQUFHb3RBQUJIRFo4QklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHdEFTRVFETGNDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUTRoRUF5Y0FRc0NRQ0FFSUFKSERRQkJyZ0VoRUF5MkFnc2dCQzBBQUVIUUFFY05uUUVnQkVFQmFpRUJRU1VoRUF5YkFRc0NRQ0FFSUFKSERRQkJyd0VoRUF5MUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVJYWlFUUFrQURRQ0FFTFFBQUlBRkIwTStBZ0FCcUxRQUFSdzJkQVNBQlFRaEdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCcndFaEVBeTFBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRXFJUkFNbWdFTEFrQWdCQ0FDUncwQVFiQUJJUkFNdEFJTEFrQUNRQ0FFTFFBQVFhdC9hZzRMQUowQm5RR2RBWjBCblFHZEFaMEJuUUdkQVFHZEFRc2dCRUVCYWlFRVFab0JJUkFNbXdJTElBUkJBV29oQkVHYkFTRVFESm9DQ3dKQUlBUWdBa2NOQUVHeEFTRVFETE1DQ3dKQUFrQWdCQzBBQUVHL2Yyb09GQUNjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUVCbkFFTElBUkJBV29oQkVHWkFTRVFESm9DQ3lBRVFRRnFJUVJCbkFFaEVBeVpBZ3NDUUNBRUlBSkhEUUJCc2dFaEVBeXlBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFRGFpRVFBa0FEUUNBRUxRQUFJQUZCMmMrQWdBQnFMUUFBUncyYUFTQUJRUU5HRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQnNnRWhFQXl5QWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVoSVJBTWx3RUxBa0FnQkNBQ1J3MEFRYk1CSVJBTXNRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQm1vaEVBSkFBMEFnQkMwQUFDQUJRZDNQZ0lBQWFpMEFBRWNObVFFZ0FVRUdSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWJNQklSQU1zUUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJHaUVRREpZQkN3SkFJQVFnQWtjTkFFRzBBU0VRRExBQ0N3SkFBa0FDUUNBRUxRQUFRYnQvYWc0UkFKb0JtZ0dhQVpvQm1nR2FBWm9CbWdHYUFRR2FBWm9CbWdHYUFab0JBcG9CQ3lBRVFRRnFJUVJCblFFaEVBeVlBZ3NnQkVFQmFpRUVRWjRCSVJBTWx3SUxJQVJCQVdvaEJFR2ZBU0VRREpZQ0N3SkFJQVFnQWtjTkFFRzFBU0VRREs4Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUVZxSVJBQ1FBTkFJQVF0QUFBZ0FVSGt6NENBQUdvdEFBQkhEWmNCSUFGQkJVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUcxQVNFUURLOENDeUFBUVFBMkFnQWdFRUVCYWlFQlFTZ2hFQXlVQVFzQ1FDQUVJQUpIRFFCQnRnRWhFQXl1QWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUNhaUVRQWtBRFFDQUVMUUFBSUFGQjZzK0FnQUJxTFFBQVJ3MldBU0FCUVFKR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJ0Z0VoRUF5dUFnc2dBRUVBTmdJQUlCQkJBV29oQVVFSElSQU1rd0VMQWtBZ0JDQUNSdzBBUWJjQklSQU1yUUlMQWtBQ1FDQUVMUUFBUWJ0L2FnNE9BSllCbGdHV0FaWUJsZ0dXQVpZQmxnR1dBWllCbGdHV0FRR1dBUXNnQkVFQmFpRUVRYUVCSVJBTWxBSUxJQVJCQVdvaEJFR2lBU0VRREpNQ0N3SkFJQVFnQWtjTkFFRzRBU0VRREt3Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSHR6NENBQUdvdEFBQkhEWlFCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUc0QVNFUURLd0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFSSWhFQXlSQVFzQ1FDQUVJQUpIRFFCQnVRRWhFQXlyQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQWtBRFFDQUVMUUFBSUFGQjhNK0FnQUJxTFFBQVJ3MlRBU0FCUVFGR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJ1UUVoRUF5ckFnc2dBRUVBTmdJQUlCQkJBV29oQVVFZ0lSQU1rQUVMQWtBZ0JDQUNSdzBBUWJvQklSQU1xZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZMUGdJQUFhaTBBQUVjTmtnRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFib0JJUkFNcWdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRHlFUURJOEJDd0pBSUFRZ0FrY05BRUc3QVNFUURLa0NDd0pBQWtBZ0JDMEFBRUczZjJvT0J3Q1NBWklCa2dHU0FaSUJBWklCQ3lBRVFRRnFJUVJCcFFFaEVBeVFBZ3NnQkVFQmFpRUVRYVlCSVJBTWp3SUxBa0FnQkNBQ1J3MEFRYndCSVJBTXFBSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQjJvaEVBSkFBMEFnQkMwQUFDQUJRZlRQZ0lBQWFpMEFBRWNOa0FFZ0FVRUhSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWJ3QklSQU1xQUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJHeUVRREkwQkN3SkFJQVFnQWtjTkFFRzlBU0VRREtjQ0N3SkFBa0FDUUNBRUxRQUFRYjUvYWc0U0FKRUJrUUdSQVpFQmtRR1JBWkVCa1FHUkFRR1JBWkVCa1FHUkFaRUJrUUVDa1FFTElBUkJBV29oQkVHa0FTRVFESThDQ3lBRVFRRnFJUVJCcHdFaEVBeU9BZ3NnQkVFQmFpRUVRYWdCSVJBTWpRSUxBa0FnQkNBQ1J3MEFRYjRCSVJBTXBnSUxJQVF0QUFCQnpnQkhEWTBCSUFSQkFXb2hCQXpQQVFzQ1FDQUVJQUpIRFFCQnZ3RWhFQXlsQWdzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFTFFBQVFiOS9hZzRWQUFFQ0E1d0JCQVVHbkFHY0Fad0JCd2dKQ2d1Y0FRd05EZytjQVFzZ0JFRUJhaUVCUWVnQUlSQU1tZ0lMSUFSQkFXb2hBVUhwQUNFUURKa0NDeUFFUVFGcUlRRkI3Z0FoRUF5WUFnc2dCRUVCYWlFQlFmSUFJUkFNbHdJTElBUkJBV29oQVVIekFDRVFESllDQ3lBRVFRRnFJUUZCOWdBaEVBeVZBZ3NnQkVFQmFpRUJRZmNBSVJBTWxBSUxJQVJCQVdvaEFVSDZBQ0VRREpNQ0N5QUVRUUZxSVFSQmd3RWhFQXlTQWdzZ0JFRUJhaUVFUVlRQklSQU1rUUlMSUFSQkFXb2hCRUdGQVNFUURKQUNDeUFFUVFGcUlRUkJrZ0VoRUF5UEFnc2dCRUVCYWlFRVFaZ0JJUkFNamdJTElBUkJBV29oQkVHZ0FTRVFESTBDQ3lBRVFRRnFJUVJCb3dFaEVBeU1BZ3NnQkVFQmFpRUVRYW9CSVJBTWl3SUxBa0FnQkNBQ1JnMEFJQUJCa0lDQWdBQTJBZ2dnQUNBRU5nSUVRYXNCSVJBTWl3SUxRY0FCSVJBTW93SUxJQUFnQlNBQ0VLcUFnSUFBSWdFTml3RWdCU0VCREZ3TEFrQWdCaUFDUmcwQUlBWkJBV29oQlF5TkFRdEJ3Z0VoRUF5aEFnc0RRQUpBSUJBdEFBQkJkbW9PQkl3QkFBQ1BBUUFMSUJCQkFXb2lFQ0FDUncwQUMwSERBU0VRREtBQ0N3SkFJQWNnQWtZTkFDQUFRWkdBZ0lBQU5nSUlJQUFnQnpZQ0JDQUhJUUZCQVNFUURJY0NDMEhFQVNFUURKOENDd0pBSUFjZ0FrY05BRUhGQVNFUURKOENDd0pBQWtBZ0J5MEFBRUYyYWc0RUFjNEJ6Z0VBemdFTElBZEJBV29oQmd5TkFRc2dCMEVCYWlFRkRJa0JDd0pBSUFjZ0FrY05BRUhHQVNFUURKNENDd0pBQWtBZ0J5MEFBRUYyYWc0WEFZOEJqd0VCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCQUk4QkN5QUhRUUZxSVFjTFFiQUJJUkFNaEFJTEFrQWdDQ0FDUncwQVFjZ0JJUkFNblFJTElBZ3RBQUJCSUVjTmpRRWdBRUVBT3dFeUlBaEJBV29oQVVHekFTRVFESU1DQ3lBQklSY0NRQU5BSUJjaUJ5QUNSZzBCSUFjdEFBQkJVR3BCL3dGeEloQkJDazhOekFFQ1FDQUFMd0V5SWhSQm1UTkxEUUFnQUNBVVFRcHNJaFE3QVRJZ0VFSC8vd056SUJSQi92OERjVWtOQUNBSFFRRnFJUmNnQUNBVUlCQnFJaEE3QVRJZ0VFSC8vd054UWVnSFNRMEJDd3RCQUNFUUlBQkJBRFlDSENBQVFjR0pnSUFBTmdJUUlBQkJEVFlDRENBQUlBZEJBV28yQWhRTW5BSUxRY2NCSVJBTW13SUxJQUFnQ0NBQ0VLNkFnSUFBSWhCRkRjb0JJQkJCRlVjTmpBRWdBRUhJQVRZQ0hDQUFJQWcyQWhRZ0FFSEpsNENBQURZQ0VDQUFRUlUyQWd4QkFDRVFESm9DQ3dKQUlBa2dBa2NOQUVITUFTRVFESm9DQzBFQUlSUkJBU0VYUVFFaEZrRUFJUkFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQ1MwQUFFRlFhZzRLbGdHVkFRQUJBZ01FQlFZSWx3RUxRUUloRUF3R0MwRURJUkFNQlF0QkJDRVFEQVFMUVFVaEVBd0RDMEVHSVJBTUFndEJCeUVRREFFTFFRZ2hFQXRCQUNFWFFRQWhGa0VBSVJRTWpnRUxRUWtoRUVFQklSUkJBQ0VYUVFBaEZneU5BUXNDUUNBS0lBSkhEUUJCemdFaEVBeVpBZ3NnQ2kwQUFFRXVSdzJPQVNBS1FRRnFJUWtNeWdFTElBc2dBa2NOamdGQjBBRWhFQXlYQWdzQ1FDQUxJQUpHRFFBZ0FFR09nSUNBQURZQ0NDQUFJQXMyQWdSQnR3RWhFQXorQVF0QjBRRWhFQXlXQWdzQ1FDQUVJQUpIRFFCQjBnRWhFQXlXQWdzZ0FpQUVheUFBS0FJQUloQnFJUlFnQkNBUWEwRUVhaUVMQTBBZ0JDMEFBQ0FRUWZ6UGdJQUFhaTBBQUVjTmpnRWdFRUVFUmczcEFTQVFRUUZxSVJBZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSFNBU0VRREpVQ0N5QUFJQXdnQWhDc2dJQ0FBQ0lCRFkwQklBd2hBUXk0QVFzQ1FDQUVJQUpIRFFCQjFBRWhFQXlVQWdzZ0FpQUVheUFBS0FJQUloQnFJUlFnQkNBUWEwRUJhaUVNQTBBZ0JDMEFBQ0FRUVlIUWdJQUFhaTBBQUVjTmp3RWdFRUVCUmcyT0FTQVFRUUZxSVJBZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSFVBU0VRREpNQ0N3SkFJQVFnQWtjTkFFSFdBU0VRREpNQ0N5QUNJQVJySUFBb0FnQWlFR29oRkNBRUlCQnJRUUpxSVFzRFFDQUVMUUFBSUJCQmc5Q0FnQUJxTFFBQVJ3Mk9BU0FRUVFKR0RaQUJJQkJCQVdvaEVDQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZFlCSVJBTWtnSUxBa0FnQkNBQ1J3MEFRZGNCSVJBTWtnSUxBa0FDUUNBRUxRQUFRYnQvYWc0UUFJOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3RUJqd0VMSUFSQkFXb2hCRUc3QVNFUURQa0JDeUFFUVFGcUlRUkJ2QUVoRUF6NEFRc0NRQ0FFSUFKSERRQkIyQUVoRUF5UkFnc2dCQzBBQUVISUFFY05qQUVnQkVFQmFpRUVETVFCQ3dKQUlBUWdBa1lOQUNBQVFaQ0FnSUFBTmdJSUlBQWdCRFlDQkVHK0FTRVFEUGNCQzBIWkFTRVFESThDQ3dKQUlBUWdBa2NOQUVIYUFTRVFESThDQ3lBRUxRQUFRY2dBUmczREFTQUFRUUU2QUNnTXVRRUxJQUJCQWpvQUx5QUFJQVFnQWhDbWdJQ0FBQ0lRRFkwQlFjSUJJUkFNOUFFTElBQXRBQ2hCZjJvT0FyY0J1UUc0QVFzRFFBSkFJQVF0QUFCQmRtb09CQUNPQVk0QkFJNEJDeUFFUVFGcUlnUWdBa2NOQUF0QjNRRWhFQXlMQWdzZ0FFRUFPZ0F2SUFBdEFDMUJCSEZGRFlRQ0N5QUFRUUE2QUM4Z0FFRUJPZ0EwSUFFaEFReU1BUXNnRUVFVlJnM2FBU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJwNDZBZ0FBMkFoQWdBRUVTTmdJTVFRQWhFQXlJQWdzQ1FDQUFJQkFnQWhDMGdJQ0FBQ0lFRFFBZ0VDRUJESUVDQ3dKQUlBUkJGVWNOQUNBQVFRTTJBaHdnQUNBUU5nSVVJQUJCc0ppQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF5SUFnc2dBRUVBTmdJY0lBQWdFRFlDRkNBQVFhZU9nSUFBTmdJUUlBQkJFallDREVFQUlSQU1od0lMSUJCQkZVWU4xZ0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZHFOZ0lBQU5nSVFJQUJCRkRZQ0RFRUFJUkFNaGdJTElBQW9BZ1FoRnlBQVFRQTJBZ1FnRUNBUnAyb2lGaUVCSUFBZ0Z5QVFJQllnRkJzaUVCQzFnSUNBQUNJVVJRMk5BU0FBUVFjMkFod2dBQ0FRTmdJVUlBQWdGRFlDREVFQUlSQU1oUUlMSUFBZ0FDOEJNRUdBQVhJN0FUQWdBU0VCQzBFcUlSQU02Z0VMSUJCQkZVWU4wUUVnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWU9NZ0lBQU5nSVFJQUJCRXpZQ0RFRUFJUkFNZ2dJTElCQkJGVVlOendFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVpxUGdJQUFOZ0lRSUFCQklqWUNERUVBSVJBTWdRSUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDM2dJQ0FBQ0lRRFFBZ0FVRUJhaUVCREkwQkN5QUFRUXcyQWh3Z0FDQVFOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU1nQUlMSUJCQkZVWU56QUVnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWnFQZ0lBQU5nSVFJQUJCSWpZQ0RFRUFJUkFNL3dFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkMzZ0lDQUFDSVFEUUFnQVVFQmFpRUJESXdCQ3lBQVFRMDJBaHdnQUNBUU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTS9nRUxJQkJCRlVZTnlRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFjYU1nSUFBTmdJUUlBQkJJellDREVFQUlSQU0vUUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzVnSUNBQUNJUURRQWdBVUVCYWlFQkRJc0JDeUFBUVE0MkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNL0FFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVIQWxZQ0FBRFlDRUNBQVFRSTJBZ3hCQUNFUURQc0JDeUFRUVJWR0RjVUJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUG9CQ3lBQVFSQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNK1FFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkM1Z0lDQUFDSUVEUUFnQVVFQmFpRUJEUEVCQ3lBQVFSRTJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTStBRUxJQkJCRlVZTndRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFjYU1nSUFBTmdJUUlBQkJJellDREVFQUlSQU05d0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzVnSUNBQUNJUURRQWdBVUVCYWlFQkRJZ0JDeUFBUVJNMkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNOWdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkM1Z0lDQUFDSUVEUUFnQVVFQmFpRUJETzBCQ3lBQVFSUTJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTTlRRUxJQkJCRlVZTnZRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFacVBnSUFBTmdJUUlBQkJJallDREVFQUlSQU05QUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzNnSUNBQUNJUURRQWdBVUVCYWlFQkRJWUJDeUFBUVJZMkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNOHdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkMzZ0lDQUFDSUVEUUFnQVVFQmFpRUJET2tCQ3lBQVFSYzJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTThnRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSE5rNENBQURZQ0VDQUFRUXcyQWd4QkFDRVFEUEVCQzBJQklSRUxJQkJCQVdvaEFRSkFJQUFwQXlBaUVrTC8vLy8vLy8vLy93OVdEUUFnQUNBU1FnU0dJQkdFTndNZ0lBRWhBUXlFQVFzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWEySmdJQUFOZ0lRSUFCQkREWUNERUVBSVJBTTd3RUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFSE5rNENBQURZQ0VDQUFRUXcyQWd4QkFDRVFETzRCQ3lBQUtBSUVJUmNnQUVFQU5nSUVJQkFnRWFkcUloWWhBU0FBSUJjZ0VDQVdJQlFiSWhBUXRZQ0FnQUFpRkVVTmN5QUFRUVUyQWh3Z0FDQVFOZ0lVSUFBZ0ZEWUNERUVBSVJBTTdRRUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR3FuSUNBQURZQ0VDQUFRUTgyQWd4QkFDRVFET3dCQ3lBQUlCQWdBaEMwZ0lDQUFDSUJEUUVnRUNFQkMwRU9JUkFNMFFFTEFrQWdBVUVWUncwQUlBQkJBallDSENBQUlCQTJBaFFnQUVHd21JQ0FBRFlDRUNBQVFSVTJBZ3hCQUNFUURPb0JDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJwNDZBZ0FBMkFoQWdBRUVTTmdJTVFRQWhFQXpwQVFzZ0FVRUJhaUVRQWtBZ0FDOEJNQ0lCUVlBQmNVVU5BQUpBSUFBZ0VDQUNFTHVBZ0lBQUlnRU5BQ0FRSVFFTWNBc2dBVUVWUncyNkFTQUFRUVUyQWh3Z0FDQVFOZ0lVSUFCQitaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBenBBUXNDUUNBQlFhQUVjVUdnQkVjTkFDQUFMUUF0UVFKeERRQWdBRUVBTmdJY0lBQWdFRFlDRkNBQVFaYVRnSUFBTmdJUUlBQkJCRFlDREVFQUlSQU02UUVMSUFBZ0VDQUNFTDJBZ0lBQUdpQVFJUUVDUUFKQUFrQUNRQUpBSUFBZ0VDQUNFTE9BZ0lBQURoWUNBUUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFEQkFzZ0FFRUJPZ0F1Q3lBQUlBQXZBVEJCd0FCeU93RXdJQkFoQVF0QkppRVFETkVCQ3lBQVFTTTJBaHdnQUNBUU5nSVVJQUJCcFphQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF6cEFRc2dBRUVBTmdJY0lBQWdFRFlDRkNBQVFkV0xnSUFBTmdJUUlBQkJFVFlDREVFQUlSQU02QUVMSUFBdEFDMUJBWEZGRFFGQnd3RWhFQXpPQVFzQ1FDQU5JQUpHRFFBRFFBSkFJQTB0QUFCQklFWU5BQ0FOSVFFTXhBRUxJQTFCQVdvaURTQUNSdzBBQzBFbElSQU01d0VMUVNVaEVBem1BUXNnQUNnQ0JDRUVJQUJCQURZQ0JDQUFJQVFnRFJDdmdJQ0FBQ0lFUlEydEFTQUFRU1kyQWh3Z0FDQUVOZ0lNSUFBZ0RVRUJhallDRkVFQUlSQU01UUVMSUJCQkZVWU5xd0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZjJOZ0lBQU5nSVFJQUJCSFRZQ0RFRUFJUkFNNUFFTElBQkJKellDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6akFRc2dFQ0VCUVFFaEZBSkFBa0FDUUFKQUFrQUNRQUpBSUFBdEFDeEJmbW9PQndZRkJRTUJBZ0FGQ3lBQUlBQXZBVEJCQ0hJN0FUQU1Bd3RCQWlFVURBRUxRUVFoRkFzZ0FFRUJPZ0FzSUFBZ0FDOEJNQ0FVY2pzQk1Bc2dFQ0VCQzBFcklSQU15Z0VMSUFCQkFEWUNIQ0FBSUJBMkFoUWdBRUdya29DQUFEWUNFQ0FBUVFzMkFneEJBQ0VRRE9JQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjRZK0FnQUEyQWhBZ0FFRUtOZ0lNUVFBaEVBemhBUXNnQUVFQU9nQXNJQkFoQVF5OUFRc2dFQ0VCUVFFaEZBSkFBa0FDUUFKQUFrQWdBQzBBTEVGN2FnNEVBd0VDQUFVTElBQWdBQzhCTUVFSWNqc0JNQXdEQzBFQ0lSUU1BUXRCQkNFVUN5QUFRUUU2QUN3Z0FDQUFMd0V3SUJSeU93RXdDeUFRSVFFTFFTa2hFQXpGQVFzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZDVWdJQUFOZ0lRSUFCQkF6WUNERUVBSVJBTTNRRUxBa0FnRGkwQUFFRU5SdzBBSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0RoQ3hnSUNBQUNJQkRRQWdEa0VCYWlFQkRIVUxJQUJCTERZQ0hDQUFJQUUyQWd3Z0FDQU9RUUZxTmdJVVFRQWhFQXpkQVFzZ0FDMEFMVUVCY1VVTkFVSEVBU0VRRE1NQkN3SkFJQTRnQWtjTkFFRXRJUkFNM0FFTEFrQUNRQU5BQWtBZ0RpMEFBRUYyYWc0RUFnQUFBd0FMSUE1QkFXb2lEaUFDUncwQUMwRXRJUkFNM1FFTElBQW9BZ1FoQVNBQVFRQTJBZ1FDUUNBQUlBRWdEaEN4Z0lDQUFDSUJEUUFnRGlFQkRIUUxJQUJCTERZQ0hDQUFJQTQyQWhRZ0FDQUJOZ0lNUVFBaEVBemNBUXNnQUNnQ0JDRUJJQUJCQURZQ0JBSkFJQUFnQVNBT0VMR0FnSUFBSWdFTkFDQU9RUUZxSVFFTWN3c2dBRUVzTmdJY0lBQWdBVFlDRENBQUlBNUJBV28yQWhSQkFDRVFETnNCQ3lBQUtBSUVJUVFnQUVFQU5nSUVJQUFnQkNBT0VMR0FnSUFBSWdRTm9BRWdEaUVCRE00QkN5QVFRU3hIRFFFZ0FVRUJhaUVRUVFFaEFRSkFBa0FDUUFKQUFrQWdBQzBBTEVGN2FnNEVBd0VDQkFBTElCQWhBUXdFQzBFQ0lRRU1BUXRCQkNFQkN5QUFRUUU2QUN3Z0FDQUFMd0V3SUFGeU93RXdJQkFoQVF3QkN5QUFJQUF2QVRCQkNISTdBVEFnRUNFQkMwRTVJUkFNdndFTElBQkJBRG9BTENBQklRRUxRVFFoRUF5OUFRc2dBQ0FBTHdFd1FTQnlPd0V3SUFFaEFRd0NDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXNZQ0FnQUFpQkEwQUlBRWhBUXpIQVFzZ0FFRTNOZ0ljSUFBZ0FUWUNGQ0FBSUFRMkFneEJBQ0VRRE5RQkN5QUFRUWc2QUN3Z0FTRUJDMEV3SVJBTXVRRUxBa0FnQUMwQUtFRUJSZzBBSUFFaEFRd0VDeUFBTFFBdFFRaHhSUTJUQVNBQklRRU1Bd3NnQUMwQU1FRWdjUTJVQVVIRkFTRVFETGNCQ3dKQUlBOGdBa1lOQUFKQUEwQUNRQ0FQTFFBQVFWQnFJZ0ZCL3dGeFFRcEpEUUFnRHlFQlFUVWhFQXk2QVFzZ0FDa0RJQ0lSUXBtejVzeVpzK2JNR1ZZTkFTQUFJQkZDQ240aUVUY0RJQ0FSSUFHdFF2OEJneUlTUW4rRlZnMEJJQUFnRVNBU2ZEY0RJQ0FQUVFGcUlnOGdBa2NOQUF0Qk9TRVFETkVCQ3lBQUtBSUVJUUlnQUVFQU5nSUVJQUFnQWlBUFFRRnFJZ1FRc1lDQWdBQWlBZzJWQVNBRUlRRU13d0VMUVRraEVBelBBUXNDUUNBQUx3RXdJZ0ZCQ0hGRkRRQWdBQzBBS0VFQlJ3MEFJQUF0QUMxQkNIRkZEWkFCQ3lBQUlBRkI5L3NEY1VHQUJISTdBVEFnRHlFQkMwRTNJUkFNdEFFTElBQWdBQzhCTUVFUWNqc0JNQXlyQVFzZ0VFRVZSZzJMQVNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCOEk2QWdBQTJBaEFnQUVFY05nSU1RUUFoRUF6TEFRc2dBRUhEQURZQ0hDQUFJQUUyQWd3Z0FDQU5RUUZxTmdJVVFRQWhFQXpLQVFzQ1FDQUJMUUFBUVRwSERRQWdBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUsrQWdJQUFJaEFOQUNBQlFRRnFJUUVNWXdzZ0FFSERBRFlDSENBQUlCQTJBZ3dnQUNBQlFRRnFOZ0lVUVFBaEVBektBUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYkdSZ0lBQU5nSVFJQUJCQ2pZQ0RFRUFJUkFNeVFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHZ21ZQ0FBRFlDRUNBQVFSNDJBZ3hCQUNFUURNZ0JDeUFBUVFBMkFnQUxJQUJCZ0JJN0FTb2dBQ0FYUVFGcUlnRWdBaENvZ0lDQUFDSVFEUUVnQVNFQkMwSEhBQ0VRREt3QkN5QVFRUlZIRFlNQklBQkIwUUEyQWh3Z0FDQUJOZ0lVSUFCQjQ1ZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBekVBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNWGdzZ0FFSFNBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6REFRc2dBRUVBTmdJY0lBQWdGRFlDRkNBQVFjR29nSUFBTmdJUUlBQkJCellDRENBQVFRQTJBZ0JCQUNFUURNSUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhkQ3lBQVFkTUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRE1FQkMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWUNSZ0lBQU5nSVFJQUJCQ1RZQ0RBekFBUXNnRUVFVlJnMTlJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR1VqWUNBQURZQ0VDQUFRU0UyQWd4QkFDRVFETDhCQzBFQklSWkJBQ0VYUVFBaEZFRUJJUkFMSUFBZ0VEb0FLeUFCUVFGcUlRRUNRQUpBSUFBdEFDMUJFSEVOQUFKQUFrQUNRQ0FBTFFBcURnTUJBQUlFQ3lBV1JRMEREQUlMSUJRTkFRd0NDeUFYUlEwQkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcllDQWdBQWlFQTBBSUFFaEFReGNDeUFBUWRnQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFETDRCQ3lBQUtBSUVJUVFnQUVFQU5nSUVBa0FnQUNBRUlBRVFyWUNBZ0FBaUJBMEFJQUVoQVF5dEFRc2dBRUhaQURZQ0hDQUFJQUUyQWhRZ0FDQUVOZ0lNUVFBaEVBeTlBUXNnQUNnQ0JDRUVJQUJCQURZQ0JBSkFJQUFnQkNBQkVLMkFnSUFBSWdRTkFDQUJJUUVNcXdFTElBQkIyZ0EyQWh3Z0FDQUJOZ0lVSUFBZ0JEWUNERUVBSVJBTXZBRUxJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDdGdJQ0FBQ0lFRFFBZ0FTRUJES2tCQ3lBQVFkd0FOZ0ljSUFBZ0FUWUNGQ0FBSUFRMkFneEJBQ0VRRExzQkN3SkFJQUV0QUFCQlVHb2lFRUgvQVhGQkNrOE5BQ0FBSUJBNkFDb2dBVUVCYWlFQlFjOEFJUkFNb2dFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkN0Z0lDQUFDSUVEUUFnQVNFQkRLY0JDeUFBUWQ0QU5nSWNJQUFnQVRZQ0ZDQUFJQVEyQWd4QkFDRVFETG9CQ3lBQVFRQTJBZ0FnRjBFQmFpRUJBa0FnQUMwQUtVRWpUdzBBSUFFaEFReFpDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkIwNG1BZ0FBMkFoQWdBRUVJTmdJTVFRQWhFQXk1QVFzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaQ3pnSUFBTmdJUUlBQkJDRFlDREF5M0FRc2dBRUVBTmdJQUlCZEJBV29oQVFKQUlBQXRBQ2xCSVVjTkFDQUJJUUVNVmdzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVp1S2dJQUFOZ0lRSUFCQkNEWUNERUVBSVJBTXRnRUxJQUJCQURZQ0FDQVhRUUZxSVFFQ1FDQUFMUUFwSWhCQlhXcEJDMDhOQUNBQklRRU1WUXNDUUNBUVFRWkxEUUJCQVNBUWRFSEtBSEZGRFFBZ0FTRUJERlVMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjk0bUFnQUEyQWhBZ0FFRUlOZ0lNRExVQkN5QVFRUlZHRFhFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWJtTmdJQUFOZ0lRSUFCQkdqWUNERUVBSVJBTXRBRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERlFMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNc3dFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkNuZ0lDQUFDSVFEUUFnQVNFQkRFMExJQUJCMGdBMkFod2dBQ0FCTmdJVUlBQWdFRFlDREVFQUlSQU1zZ0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREUwTElBQkIwd0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXNRRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERkVMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNc0FFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVIR2lvQ0FBRFlDRUNBQVFRYzJBZ3hCQUNFUURLOEJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhKQ3lBQVFkSUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRREs0QkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcDRDQWdBQWlFQTBBSUFFaEFReEpDeUFBUWRNQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFESzBCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVFwNENBZ0FBaUVBMEFJQUVoQVF4TkN5QUFRZVVBTmdJY0lBQWdBVFlDRkNBQUlCQTJBZ3hCQUNFUURLd0JDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkIzSWlBZ0FBMkFoQWdBRUVITmdJTVFRQWhFQXlyQVFzZ0VFRS9SdzBCSUFGQkFXb2hBUXRCQlNFUURKQUJDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWYyU2dJQUFOZ0lRSUFCQkJ6WUNEQXlvQVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFS2VBZ0lBQUloQU5BQ0FCSVFFTVFnc2dBRUhTQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeW5BUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNUWdzZ0FFSFRBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF5bUFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUtlQWdJQUFJaEFOQUNBQklRRU1SZ3NnQUVIbEFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXlsQVFzZ0FDZ0NCQ0VCSUFCQkFEWUNCQUpBSUFBZ0FTQVVFS2VBZ0lBQUlnRU5BQ0FVSVFFTVB3c2dBRUhTQURZQ0hDQUFJQlEyQWhRZ0FDQUJOZ0lNUVFBaEVBeWtBUXNnQUNnQ0JDRUJJQUJCQURZQ0JBSkFJQUFnQVNBVUVLZUFnSUFBSWdFTkFDQVVJUUVNUHdzZ0FFSFRBRFlDSENBQUlCUTJBaFFnQUNBQk5nSU1RUUFoRUF5akFRc2dBQ2dDQkNFQklBQkJBRFlDQkFKQUlBQWdBU0FVRUtlQWdJQUFJZ0VOQUNBVUlRRU1Rd3NnQUVIbEFEWUNIQ0FBSUJRMkFoUWdBQ0FCTmdJTVFRQWhFQXlpQVFzZ0FFRUFOZ0ljSUFBZ0ZEWUNGQ0FBUWNPUGdJQUFOZ0lRSUFCQkJ6WUNERUVBSVJBTW9RRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSERqNENBQURZQ0VDQUFRUWMyQWd4QkFDRVFES0FCQzBFQUlSQWdBRUVBTmdJY0lBQWdGRFlDRkNBQVFZeWNnSUFBTmdJUUlBQkJCellDREF5ZkFRc2dBRUVBTmdJY0lBQWdGRFlDRkNBQVFZeWNnSUFBTmdJUUlBQkJCellDREVFQUlSQU1uZ0VMSUFCQkFEWUNIQ0FBSUJRMkFoUWdBRUgra1lDQUFEWUNFQ0FBUVFjMkFneEJBQ0VRREowQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmpwdUFnQUEyQWhBZ0FFRUdOZ0lNUVFBaEVBeWNBUXNnRUVFVlJnMVhJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSE1qb0NBQURZQ0VDQUFRU0EyQWd4QkFDRVFESnNCQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRU1FoRUFzZ0FDQVFPZ0FwSUFBb0FnUWhFQ0FBUVFBMkFnUWdBQ0FRSUFFUXE0Q0FnQUFpRUExVUlBRWhBUXcrQ3lBQVFRQTJBZ0FMUVFBaEVDQUFRUUEyQWh3Z0FDQUVOZ0lVSUFCQjhadUFnQUEyQWhBZ0FFRUdOZ0lNREpjQkN5QUJRUlZHRFZBZ0FFRUFOZ0ljSUFBZ0JUWUNGQ0FBUWZDTWdJQUFOZ0lRSUFCQkd6WUNERUVBSVJBTWxnRUxJQUFvQWdRaEJTQUFRUUEyQWdRZ0FDQUZJQkFRcVlDQWdBQWlCUTBCSUJCQkFXb2hCUXRCclFFaEVBeDdDeUFBUWNFQk5nSWNJQUFnQlRZQ0RDQUFJQkJCQVdvMkFoUkJBQ0VRREpNQkN5QUFLQUlFSVFZZ0FFRUFOZ0lFSUFBZ0JpQVFFS21BZ0lBQUlnWU5BU0FRUVFGcUlRWUxRYTRCSVJBTWVBc2dBRUhDQVRZQ0hDQUFJQVkyQWd3Z0FDQVFRUUZxTmdJVVFRQWhFQXlRQVFzZ0FFRUFOZ0ljSUFBZ0J6WUNGQ0FBUVplTGdJQUFOZ0lRSUFCQkRUWUNERUVBSVJBTWp3RUxJQUJCQURZQ0hDQUFJQWcyQWhRZ0FFSGprSUNBQURZQ0VDQUFRUWsyQWd4QkFDRVFESTRCQ3lBQVFRQTJBaHdnQUNBSU5nSVVJQUJCbEkyQWdBQTJBaEFnQUVFaE5nSU1RUUFoRUF5TkFRdEJBU0VXUVFBaEYwRUFJUlJCQVNFUUN5QUFJQkE2QUNzZ0NVRUJhaUVJQWtBQ1FDQUFMUUF0UVJCeERRQUNRQUpBQWtBZ0FDMEFLZzREQVFBQ0JBc2dGa1VOQXd3Q0N5QVVEUUVNQWdzZ0YwVU5BUXNnQUNnQ0JDRVFJQUJCQURZQ0JDQUFJQkFnQ0JDdGdJQ0FBQ0lRUlEwOUlBQkJ5UUUyQWh3Z0FDQUlOZ0lVSUFBZ0VEWUNERUVBSVJBTWpBRUxJQUFvQWdRaEJDQUFRUUEyQWdRZ0FDQUVJQWdRcllDQWdBQWlCRVVOZGlBQVFjb0JOZ0ljSUFBZ0NEWUNGQ0FBSUFRMkFneEJBQ0VRRElzQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFSUFBZ0JDQUpFSzJBZ0lBQUlnUkZEWFFnQUVITEFUWUNIQ0FBSUFrMkFoUWdBQ0FFTmdJTVFRQWhFQXlLQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQ0FBSUFRZ0NoQ3RnSUNBQUNJRVJRMXlJQUJCelFFMkFod2dBQ0FLTmdJVUlBQWdCRFlDREVFQUlSQU1pUUVMQWtBZ0N5MEFBRUZRYWlJUVFmOEJjVUVLVHcwQUlBQWdFRG9BS2lBTFFRRnFJUXBCdGdFaEVBeHdDeUFBS0FJRUlRUWdBRUVBTmdJRUlBQWdCQ0FMRUsyQWdJQUFJZ1JGRFhBZ0FFSFBBVFlDSENBQUlBczJBaFFnQUNBRU5nSU1RUUFoRUF5SUFRc2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFaQ3pnSUFBTmdJUUlBQkJDRFlDRENBQVFRQTJBZ0JCQUNFUURJY0JDeUFCUVJWR0RUOGdBRUVBTmdJY0lBQWdERFlDRkNBQVFjeU9nSUFBTmdJUUlBQkJJRFlDREVFQUlSQU1oZ0VMSUFCQmdRUTdBU2dnQUNnQ0JDRVFJQUJDQURjREFDQUFJQkFnREVFQmFpSU1FS3VBZ0lBQUloQkZEVGdnQUVIVEFUWUNIQ0FBSUF3MkFoUWdBQ0FRTmdJTVFRQWhFQXlGQVFzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdCRFlDRkNBQVFkaWJnSUFBTmdJUUlBQkJDRFlDREF5REFRc2dBQ2dDQkNFUUlBQkNBRGNEQUNBQUlCQWdDMEVCYWlJTEVLdUFnSUFBSWhBTkFVSEdBU0VRREdrTElBQkJBam9BS0F4VkN5QUFRZFVCTmdJY0lBQWdDellDRkNBQUlCQTJBZ3hCQUNFUURJQUJDeUFRUVJWR0RUY2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFhU01nSUFBTmdJUUlBQkJFRFlDREVFQUlSQU1md3NnQUMwQU5FRUJSdzAwSUFBZ0JDQUNFTHlBZ0lBQUloQkZEVFFnRUVFVlJ3MDFJQUJCM0FFMkFod2dBQ0FFTmdJVUlBQkIxWmFBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXgrQzBFQUlSQWdBRUVBTmdJY0lBQkJyNHVBZ0FBMkFoQWdBRUVDTmdJTUlBQWdGRUVCYWpZQ0ZBeDlDMEVBSVJBTVl3dEJBaUVRREdJTFFRMGhFQXhoQzBFUElSQU1ZQXRCSlNFUURGOExRUk1oRUF4ZUMwRVZJUkFNWFF0QkZpRVFERndMUVJjaEVBeGJDMEVZSVJBTVdndEJHU0VRREZrTFFSb2hFQXhZQzBFYklSQU1Wd3RCSENFUURGWUxRUjBoRUF4VkMwRWZJUkFNVkF0QklTRVFERk1MUVNNaEVBeFNDMEhHQUNFUURGRUxRUzRoRUF4UUMwRXZJUkFNVHd0Qk95RVFERTRMUVQwaEVBeE5DMEhJQUNFUURFd0xRY2tBSVJBTVN3dEJ5d0FoRUF4S0MwSE1BQ0VRREVrTFFjNEFJUkFNU0F0QjBRQWhFQXhIQzBIVkFDRVFERVlMUWRnQUlSQU1SUXRCMlFBaEVBeEVDMEhiQUNFUURFTUxRZVFBSVJBTVFndEI1UUFoRUF4QkMwSHhBQ0VRREVBTFFmUUFJUkFNUHd0QmpRRWhFQXcrQzBHWEFTRVFERDBMUWFrQklSQU1QQXRCckFFaEVBdzdDMEhBQVNFUUREb0xRYmtCSVJBTU9RdEJyd0VoRUF3NEMwR3hBU0VRRERjTFFiSUJJUkFNTmd0QnRBRWhFQXcxQzBHMUFTRVFERFFMUWJvQklSQU1Nd3RCdlFFaEVBd3lDMEcvQVNFUURERUxRY0VCSVJBTU1Bc2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFlbUxnSUFBTmdJUUlBQkJIellDREVFQUlSQU1TQXNnQUVIYkFUWUNIQ0FBSUFRMkFoUWdBRUg2bG9DQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVjTElBQkIrQUEyQWh3Z0FDQU1OZ0lVSUFCQnlwaUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBeEdDeUFBUWRFQU5nSWNJQUFnQlRZQ0ZDQUFRYkNYZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNUlFzZ0FFSDVBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF4RUN5QUFRZmdBTmdJY0lBQWdBVFlDRkNBQVFjcVlnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1Rd3NnQUVIa0FEWUNIQ0FBSUFFMkFoUWdBRUhqbDRDQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVJTElBQkIxd0EyQWh3Z0FDQUJOZ0lVSUFCQnlaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBeEJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ1WTJBZ0FBMkFoQWdBRUVhTmdJTVFRQWhFQXhBQ3lBQVFjSUFOZ0ljSUFBZ0FUWUNGQ0FBUWVPWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTVB3c2dBRUVBTmdJRUlBQWdEeUFQRUxHQWdJQUFJZ1JGRFFFZ0FFRTZOZ0ljSUFBZ0JEWUNEQ0FBSUE5QkFXbzJBaFJCQUNFUURENExJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDeGdJQ0FBQ0lFUlEwQUlBQkJPellDSENBQUlBUTJBZ3dnQUNBQlFRRnFOZ0lVUVFBaEVBdytDeUFCUVFGcUlRRU1MUXNnRDBFQmFpRUJEQzBMSUFCQkFEWUNIQ0FBSUE4MkFoUWdBRUhra29DQUFEWUNFQ0FBUVFRMkFneEJBQ0VRRERzTElBQkJOallDSENBQUlBUTJBaFFnQUNBQ05nSU1RUUFoRUF3NkN5QUFRUzQyQWh3Z0FDQU9OZ0lVSUFBZ0JEWUNERUVBSVJBTU9Rc2dBRUhRQURZQ0hDQUFJQUUyQWhRZ0FFR1JtSUNBQURZQ0VDQUFRUlUyQWd4QkFDRVFERGdMSUExQkFXb2hBUXdzQ3lBQVFSVTJBaHdnQUNBQk5nSVVJQUJCZ3BtQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3MkN5QUFRUnMyQWh3Z0FDQUJOZ0lVSUFCQmtaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBdzFDeUFBUVE4MkFod2dBQ0FCTmdJVUlBQkJrWmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXcwQ3lBQVFRczJBaHdnQUNBQk5nSVVJQUJCa1plQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3ekN5QUFRUm8yQWh3Z0FDQUJOZ0lVSUFCQmdwbUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBd3lDeUFBUVFzMkFod2dBQ0FCTmdJVUlBQkJncG1BZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXd4Q3lBQVFRbzJBaHdnQUNBQk5nSVVJQUJCNUphQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3d0N5QUFRUjQyQWh3Z0FDQUJOZ0lVSUFCQitaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBd3ZDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkIybzJBZ0FBMkFoQWdBRUVVTmdJTVFRQWhFQXd1Q3lBQVFRUTJBaHdnQUNBQk5nSVVJQUJCc0ppQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3dEN5QUFRUUEyQWdBZ0MwRUJhaUVMQzBHNEFTRVFEQklMSUFCQkFEWUNBQ0FRUVFGcUlRRkI5UUFoRUF3UkN5QUJJUUVDUUNBQUxRQXBRUVZIRFFCQjR3QWhFQXdSQzBIaUFDRVFEQkFMUVFBaEVDQUFRUUEyQWh3Z0FFSGtrWUNBQURZQ0VDQUFRUWMyQWd3Z0FDQVVRUUZxTmdJVURDZ0xJQUJCQURZQ0FDQVhRUUZxSVFGQndBQWhFQXdPQzBFQklRRUxJQUFnQVRvQUxDQUFRUUEyQWdBZ0YwRUJhaUVCQzBFb0lSQU1Dd3NnQVNFQkMwRTRJUkFNQ1FzQ1FDQUJJZzhnQWtZTkFBTkFBa0FnRHkwQUFFR0F2b0NBQUdvdEFBQWlBVUVCUmcwQUlBRkJBa2NOQXlBUFFRRnFJUUVNQkFzZ0QwRUJhaUlQSUFKSERRQUxRVDRoRUF3aUMwRStJUkFNSVFzZ0FFRUFPZ0FzSUE4aEFRd0JDMEVMSVJBTUJndEJPaUVRREFVTElBRkJBV29oQVVFdElSQU1CQXNnQUNBQk9nQXNJQUJCQURZQ0FDQVdRUUZxSVFGQkRDRVFEQU1MSUFCQkFEWUNBQ0FYUVFGcUlRRkJDaUVRREFJTElBQkJBRFlDQUFzZ0FFRUFPZ0FzSUEwaEFVRUpJUkFNQUFzTFFRQWhFQ0FBUVFBMkFod2dBQ0FMTmdJVUlBQkJ6WkNBZ0FBMkFoQWdBRUVKTmdJTURCY0xRUUFoRUNBQVFRQTJBaHdnQUNBS05nSVVJQUJCNllxQWdBQTJBaEFnQUVFSk5nSU1EQllMUVFBaEVDQUFRUUEyQWh3Z0FDQUpOZ0lVSUFCQnQ1Q0FnQUEyQWhBZ0FFRUpOZ0lNREJVTFFRQWhFQ0FBUVFBMkFod2dBQ0FJTmdJVUlBQkJuSkdBZ0FBMkFoQWdBRUVKTmdJTURCUUxRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCelpDQWdBQTJBaEFnQUVFSk5nSU1EQk1MUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjZZcUFnQUEyQWhBZ0FFRUpOZ0lNREJJTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ0NUNBZ0FBMkFoQWdBRUVKTmdJTURCRUxRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCbkpHQWdBQTJBaEFnQUVFSk5nSU1EQkFMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmw1V0FnQUEyQWhBZ0FFRVBOZ0lNREE4TFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJsNVdBZ0FBMkFoQWdBRUVQTmdJTURBNExRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCd0pLQWdBQTJBaEFnQUVFTE5nSU1EQTBMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmxZbUFnQUEyQWhBZ0FFRUxOZ0lNREF3TFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkI0WStBZ0FBMkFoQWdBRUVLTmdJTURBc0xRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCKzQrQWdBQTJBaEFnQUVFS05nSU1EQW9MUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjhabUFnQUEyQWhBZ0FFRUNOZ0lNREFrTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ4SlNBZ0FBMkFoQWdBRUVDTmdJTURBZ0xRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCOHBXQWdBQTJBaEFnQUVFQ05nSU1EQWNMSUFCQkFqWUNIQ0FBSUFFMkFoUWdBRUdjbW9DQUFEWUNFQ0FBUVJZMkFneEJBQ0VRREFZTFFRRWhFQXdGQzBIVUFDRVFJQUVpQkNBQ1JnMEVJQU5CQ0dvZ0FDQUVJQUpCMk1LQWdBQkJDaERGZ0lDQUFDQURLQUlNSVFRZ0F5Z0NDQTREQVFRQ0FBc1F5b0NBZ0FBQUN5QUFRUUEyQWh3Z0FFRzFtb0NBQURZQ0VDQUFRUmMyQWd3Z0FDQUVRUUZxTmdJVVFRQWhFQXdDQ3lBQVFRQTJBaHdnQUNBRU5nSVVJQUJCeXBxQWdBQTJBaEFnQUVFSk5nSU1RUUFoRUF3QkN3SkFJQUVpQkNBQ1J3MEFRU0loRUF3QkN5QUFRWW1BZ0lBQU5nSUlJQUFnQkRZQ0JFRWhJUkFMSUFOQkVHb2tnSUNBZ0FBZ0VBdXZBUUVDZnlBQktBSUFJUVlDUUFKQUlBSWdBMFlOQUNBRUlBWnFJUVFnQmlBRGFpQUNheUVISUFJZ0JrRi9jeUFGYWlJR2FpRUZBMEFDUUNBQ0xRQUFJQVF0QUFCR0RRQkJBaUVFREFNTEFrQWdCZzBBUVFBaEJDQUZJUUlNQXdzZ0JrRi9haUVHSUFSQkFXb2hCQ0FDUVFGcUlnSWdBMGNOQUFzZ0J5RUdJQU1oQWdzZ0FFRUJOZ0lBSUFFZ0JqWUNBQ0FBSUFJMkFnUVBDeUFCUVFBMkFnQWdBQ0FFTmdJQUlBQWdBallDQkFzS0FDQUFFTWVBZ0lBQUMvSTJBUXQvSTRDQWdJQUFRUkJySWdFa2dJQ0FnQUFDUUVFQUtBS2cwSUNBQUEwQVFRQVF5NENBZ0FCQmdOU0VnQUJySWdKQjJRQkpEUUJCQUNFREFrQkJBQ2dDNE5PQWdBQWlCQTBBUVFCQ2Z6Y0M3Tk9BZ0FCQkFFS0FnSVNBZ0lEQUFEY0M1Tk9BZ0FCQkFDQUJRUWhxUVhCeFFkaXExYW9GY3lJRU5nTGcwNENBQUVFQVFRQTJBdlRUZ0lBQVFRQkJBRFlDeE5PQWdBQUxRUUFnQWpZQ3pOT0FnQUJCQUVHQTFJU0FBRFlDeU5PQWdBQkJBRUdBMUlTQUFEWUNtTkNBZ0FCQkFDQUVOZ0tzMElDQUFFRUFRWDgyQXFqUWdJQUFBMEFnQTBIRTBJQ0FBR29nQTBHNDBJQ0FBR29pQkRZQ0FDQUVJQU5Cc05DQWdBQnFJZ1UyQWdBZ0EwRzgwSUNBQUdvZ0JUWUNBQ0FEUWN6UWdJQUFhaUFEUWNEUWdJQUFhaUlGTmdJQUlBVWdCRFlDQUNBRFFkVFFnSUFBYWlBRFFjalFnSUFBYWlJRU5nSUFJQVFnQlRZQ0FDQURRZERRZ0lBQWFpQUVOZ0lBSUFOQklHb2lBMEdBQWtjTkFBdEJnTlNFZ0FCQmVFR0ExSVNBQUd0QkQzRkJBRUdBMUlTQUFFRUlha0VQY1JzaUEyb2lCRUVFYWlBQ1FVaHFJZ1VnQTJzaUEwRUJjallDQUVFQVFRQW9BdkRUZ0lBQU5nS2swSUNBQUVFQUlBTTJBcFRRZ0lBQVFRQWdCRFlDb05DQWdBQkJnTlNFZ0FBZ0JXcEJPRFlDQkFzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQUVIc0FVc05BQUpBUVFBb0FvalFnSUFBSWdaQkVDQUFRUk5xUVhCeElBQkJDMGtiSWdKQkEzWWlCSFlpQTBFRGNVVU5BQUpBQWtBZ0EwRUJjU0FFY2tFQmN5SUZRUU4wSWdSQnNOQ0FnQUJxSWdNZ0JFRzQwSUNBQUdvb0FnQWlCQ2dDQ0NJQ1J3MEFRUUFnQmtGK0lBVjNjVFlDaU5DQWdBQU1BUXNnQXlBQ05nSUlJQUlnQXpZQ0RBc2dCRUVJYWlFRElBUWdCVUVEZENJRlFRTnlOZ0lFSUFRZ0JXb2lCQ0FFS0FJRVFRRnlOZ0lFREF3TElBSkJBQ2dDa05DQWdBQWlCMDBOQVFKQUlBTkZEUUFDUUFKQUlBTWdCSFJCQWlBRWRDSURRUUFnQTJ0eWNTSURRUUFnQTJ0eFFYOXFJZ01nQTBFTWRrRVFjU0lEZGlJRVFRVjJRUWh4SWdVZ0EzSWdCQ0FGZGlJRFFRSjJRUVJ4SWdSeUlBTWdCSFlpQTBFQmRrRUNjU0lFY2lBRElBUjJJZ05CQVhaQkFYRWlCSElnQXlBRWRtb2lCRUVEZENJRFFiRFFnSUFBYWlJRklBTkJ1TkNBZ0FCcUtBSUFJZ01vQWdnaUFFY05BRUVBSUFaQmZpQUVkM0VpQmpZQ2lOQ0FnQUFNQVFzZ0JTQUFOZ0lJSUFBZ0JUWUNEQXNnQXlBQ1FRTnlOZ0lFSUFNZ0JFRURkQ0lFYWlBRUlBSnJJZ1UyQWdBZ0F5QUNhaUlBSUFWQkFYSTJBZ1FDUUNBSFJRMEFJQWRCZUhGQnNOQ0FnQUJxSVFKQkFDZ0NuTkNBZ0FBaEJBSkFBa0FnQmtFQklBZEJBM1owSWdoeERRQkJBQ0FHSUFoeU5nS0kwSUNBQUNBQ0lRZ01BUXNnQWlnQ0NDRUlDeUFJSUFRMkFnd2dBaUFFTmdJSUlBUWdBallDRENBRUlBZzJBZ2dMSUFOQkNHb2hBMEVBSUFBMkFwelFnSUFBUVFBZ0JUWUNrTkNBZ0FBTURBdEJBQ2dDak5DQWdBQWlDVVVOQVNBSlFRQWdDV3R4UVg5cUlnTWdBMEVNZGtFUWNTSURkaUlFUVFWMlFRaHhJZ1VnQTNJZ0JDQUZkaUlEUVFKMlFRUnhJZ1J5SUFNZ0JIWWlBMEVCZGtFQ2NTSUVjaUFESUFSMklnTkJBWFpCQVhFaUJISWdBeUFFZG1wQkFuUkJ1TktBZ0FCcUtBSUFJZ0FvQWdSQmVIRWdBbXNoQkNBQUlRVUNRQU5BQWtBZ0JTZ0NFQ0lERFFBZ0JVRVVhaWdDQUNJRFJRMENDeUFES0FJRVFYaHhJQUpySWdVZ0JDQUZJQVJKSWdVYklRUWdBeUFBSUFVYklRQWdBeUVGREFBTEN5QUFLQUlZSVFvQ1FDQUFLQUlNSWdnZ0FFWU5BQ0FBS0FJSUlnTkJBQ2dDbU5DQWdBQkpHaUFJSUFNMkFnZ2dBeUFJTmdJTURBc0xBa0FnQUVFVWFpSUZLQUlBSWdNTkFDQUFLQUlRSWdORkRRTWdBRUVRYWlFRkN3TkFJQVVoQ3lBRElnaEJGR29pQlNnQ0FDSUREUUFnQ0VFUWFpRUZJQWdvQWhBaUF3MEFDeUFMUVFBMkFnQU1DZ3RCZnlFQ0lBQkJ2MzlMRFFBZ0FFRVRhaUlEUVhCeElRSkJBQ2dDak5DQWdBQWlCMFVOQUVFQUlRc0NRQ0FDUVlBQ1NRMEFRUjhoQ3lBQ1FmLy8vd2RMRFFBZ0EwRUlkaUlESUFOQmdQNC9ha0VRZGtFSWNTSURkQ0lFSUFSQmdPQWZha0VRZGtFRWNTSUVkQ0lGSUFWQmdJQVBha0VRZGtFQ2NTSUZkRUVQZGlBRElBUnlJQVZ5YXlJRFFRRjBJQUlnQTBFVmFuWkJBWEZ5UVJ4cUlRc0xRUUFnQW1zaEJBSkFBa0FDUUFKQUlBdEJBblJCdU5LQWdBQnFLQUlBSWdVTkFFRUFJUU5CQUNFSURBRUxRUUFoQXlBQ1FRQkJHU0FMUVFGMmF5QUxRUjlHRzNRaEFFRUFJUWdEUUFKQUlBVW9BZ1JCZUhFZ0Ftc2lCaUFFVHcwQUlBWWhCQ0FGSVFnZ0JnMEFRUUFoQkNBRklRZ2dCU0VEREFNTElBTWdCVUVVYWlnQ0FDSUdJQVlnQlNBQVFSMTJRUVJ4YWtFUWFpZ0NBQ0lGUmhzZ0F5QUdHeUVESUFCQkFYUWhBQ0FGRFFBTEN3SkFJQU1nQ0hJTkFFRUFJUWhCQWlBTGRDSURRUUFnQTJ0eUlBZHhJZ05GRFFNZ0EwRUFJQU5yY1VGL2FpSURJQU5CREhaQkVIRWlBM1lpQlVFRmRrRUljU0lBSUFOeUlBVWdBSFlpQTBFQ2RrRUVjU0lGY2lBRElBVjJJZ05CQVhaQkFuRWlCWElnQXlBRmRpSURRUUYyUVFGeElnVnlJQU1nQlhacVFRSjBRYmpTZ0lBQWFpZ0NBQ0VEQ3lBRFJRMEJDd05BSUFNb0FnUkJlSEVnQW1zaUJpQUVTU0VBQWtBZ0F5Z0NFQ0lGRFFBZ0EwRVVhaWdDQUNFRkN5QUdJQVFnQUJzaEJDQURJQWdnQUJzaENDQUZJUU1nQlEwQUN3c2dDRVVOQUNBRVFRQW9BcERRZ0lBQUlBSnJUdzBBSUFnb0FoZ2hDd0pBSUFnb0Fnd2lBQ0FJUmcwQUlBZ29BZ2dpQTBFQUtBS1kwSUNBQUVrYUlBQWdBellDQ0NBRElBQTJBZ3dNQ1FzQ1FDQUlRUlJxSWdVb0FnQWlBdzBBSUFnb0FoQWlBMFVOQXlBSVFSQnFJUVVMQTBBZ0JTRUdJQU1pQUVFVWFpSUZLQUlBSWdNTkFDQUFRUkJxSVFVZ0FDZ0NFQ0lERFFBTElBWkJBRFlDQUF3SUN3SkFRUUFvQXBEUWdJQUFJZ01nQWtrTkFFRUFLQUtjMElDQUFDRUVBa0FDUUNBRElBSnJJZ1ZCRUVrTkFDQUVJQUpxSWdBZ0JVRUJjallDQkVFQUlBVTJBcERRZ0lBQVFRQWdBRFlDbk5DQWdBQWdCQ0FEYWlBRk5nSUFJQVFnQWtFRGNqWUNCQXdCQ3lBRUlBTkJBM0kyQWdRZ0JDQURhaUlESUFNb0FnUkJBWEkyQWdSQkFFRUFOZ0tjMElDQUFFRUFRUUEyQXBEUWdJQUFDeUFFUVFocUlRTU1DZ3NDUUVFQUtBS1UwSUNBQUNJQUlBSk5EUUJCQUNnQ29OQ0FnQUFpQXlBQ2FpSUVJQUFnQW1zaUJVRUJjallDQkVFQUlBVTJBcFRRZ0lBQVFRQWdCRFlDb05DQWdBQWdBeUFDUVFOeU5nSUVJQU5CQ0dvaEF3d0tDd0pBQWtCQkFDZ0M0Tk9BZ0FCRkRRQkJBQ2dDNk5PQWdBQWhCQXdCQzBFQVFuODNBdXpUZ0lBQVFRQkNnSUNFZ0lDQXdBQTNBdVRUZ0lBQVFRQWdBVUVNYWtGd2NVSFlxdFdxQlhNMkF1RFRnSUFBUVFCQkFEWUM5Tk9BZ0FCQkFFRUFOZ0xFMDRDQUFFR0FnQVFoQkF0QkFDRURBa0FnQkNBQ1FjY0FhaUlIYWlJR1FRQWdCR3NpQzNFaUNDQUNTdzBBUVFCQk1EWUMrTk9BZ0FBTUNnc0NRRUVBS0FMQTA0Q0FBQ0lEUlEwQUFrQkJBQ2dDdU5PQWdBQWlCQ0FJYWlJRklBUk5EUUFnQlNBRFRRMEJDMEVBSVFOQkFFRXdOZ0w0MDRDQUFBd0tDMEVBTFFERTA0Q0FBRUVFY1EwRUFrQUNRQUpBUVFBb0FxRFFnSUFBSWdSRkRRQkJ5Tk9BZ0FBaEF3TkFBa0FnQXlnQ0FDSUZJQVJMRFFBZ0JTQURLQUlFYWlBRVN3MERDeUFES0FJSUlnTU5BQXNMUVFBUXk0Q0FnQUFpQUVGL1JnMEZJQWdoQmdKQVFRQW9BdVRUZ0lBQUlnTkJmMm9pQkNBQWNVVU5BQ0FJSUFCcklBUWdBR3BCQUNBRGEzRnFJUVlMSUFZZ0FrME5CU0FHUWY3Ly8vOEhTdzBGQWtCQkFDZ0N3Tk9BZ0FBaUEwVU5BRUVBS0FLNDA0Q0FBQ0lFSUFacUlnVWdCRTBOQmlBRklBTkxEUVlMSUFZUXk0Q0FnQUFpQXlBQVJ3MEJEQWNMSUFZZ0FHc2dDM0VpQmtIKy8vLy9CMHNOQkNBR0VNdUFnSUFBSWdBZ0F5Z0NBQ0FES0FJRWFrWU5BeUFBSVFNTEFrQWdBMEYvUmcwQUlBSkJ5QUJxSUFaTkRRQUNRQ0FISUFaclFRQW9BdWpUZ0lBQUlnUnFRUUFnQkd0eElnUkIvdi8vL3dkTkRRQWdBeUVBREFjTEFrQWdCQkRMZ0lDQUFFRi9SZzBBSUFRZ0Jtb2hCaUFESVFBTUJ3dEJBQ0FHYXhETGdJQ0FBQm9NQkFzZ0F5RUFJQU5CZjBjTkJRd0RDMEVBSVFnTUJ3dEJBQ0VBREFVTElBQkJmMGNOQWd0QkFFRUFLQUxFMDRDQUFFRUVjallDeE5PQWdBQUxJQWhCL3YvLy93ZExEUUVnQ0JETGdJQ0FBQ0VBUVFBUXk0Q0FnQUFoQXlBQVFYOUdEUUVnQTBGL1JnMEJJQUFnQTA4TkFTQURJQUJySWdZZ0FrRTRhazBOQVF0QkFFRUFLQUs0MDRDQUFDQUdhaUlETmdLNDA0Q0FBQUpBSUFOQkFDZ0N2Tk9BZ0FCTkRRQkJBQ0FETmdLODA0Q0FBQXNDUUFKQUFrQUNRRUVBS0FLZzBJQ0FBQ0lFUlEwQVFjalRnSUFBSVFNRFFDQUFJQU1vQWdBaUJTQURLQUlFSWdocVJnMENJQU1vQWdnaUF3MEFEQU1MQ3dKQUFrQkJBQ2dDbU5DQWdBQWlBMFVOQUNBQUlBTlBEUUVMUVFBZ0FEWUNtTkNBZ0FBTFFRQWhBMEVBSUFZMkFzelRnSUFBUVFBZ0FEWUN5Tk9BZ0FCQkFFRi9OZ0tvMElDQUFFRUFRUUFvQXVEVGdJQUFOZ0tzMElDQUFFRUFRUUEyQXRUVGdJQUFBMEFnQTBIRTBJQ0FBR29nQTBHNDBJQ0FBR29pQkRZQ0FDQUVJQU5Cc05DQWdBQnFJZ1UyQWdBZ0EwRzgwSUNBQUdvZ0JUWUNBQ0FEUWN6UWdJQUFhaUFEUWNEUWdJQUFhaUlGTmdJQUlBVWdCRFlDQUNBRFFkVFFnSUFBYWlBRFFjalFnSUFBYWlJRU5nSUFJQVFnQlRZQ0FDQURRZERRZ0lBQWFpQUVOZ0lBSUFOQklHb2lBMEdBQWtjTkFBc2dBRUY0SUFCclFROXhRUUFnQUVFSWFrRVBjUnNpQTJvaUJDQUdRVWhxSWdVZ0Eyc2lBMEVCY2pZQ0JFRUFRUUFvQXZEVGdJQUFOZ0trMElDQUFFRUFJQU0yQXBUUWdJQUFRUUFnQkRZQ29OQ0FnQUFnQUNBRmFrRTROZ0lFREFJTElBTXRBQXhCQ0hFTkFDQUVJQVZKRFFBZ0JDQUFUdzBBSUFSQmVDQUVhMEVQY1VFQUlBUkJDR3BCRDNFYklnVnFJZ0JCQUNnQ2xOQ0FnQUFnQm1vaUN5QUZheUlGUVFGeU5nSUVJQU1nQ0NBR2FqWUNCRUVBUVFBb0F2RFRnSUFBTmdLazBJQ0FBRUVBSUFVMkFwVFFnSUFBUVFBZ0FEWUNvTkNBZ0FBZ0JDQUxha0U0TmdJRURBRUxBa0FnQUVFQUtBS1kwSUNBQUNJSVR3MEFRUUFnQURZQ21OQ0FnQUFnQUNFSUN5QUFJQVpxSVFWQnlOT0FnQUFoQXdKQUFrQUNRQUpBQWtBQ1FBSkFBMEFnQXlnQ0FDQUZSZzBCSUFNb0FnZ2lBdzBBREFJTEN5QURMUUFNUVFoeFJRMEJDMEhJMDRDQUFDRURBMEFDUUNBREtBSUFJZ1VnQkVzTkFDQUZJQU1vQWdScUlnVWdCRXNOQXdzZ0F5Z0NDQ0VEREFBTEN5QURJQUEyQWdBZ0F5QURLQUlFSUFacU5nSUVJQUJCZUNBQWEwRVBjVUVBSUFCQkNHcEJEM0ViYWlJTElBSkJBM0kyQWdRZ0JVRjRJQVZyUVE5eFFRQWdCVUVJYWtFUGNSdHFJZ1lnQ3lBQ2FpSUNheUVEQWtBZ0JpQUVSdzBBUVFBZ0FqWUNvTkNBZ0FCQkFFRUFLQUtVMElDQUFDQURhaUlETmdLVTBJQ0FBQ0FDSUFOQkFYSTJBZ1FNQXdzQ1FDQUdRUUFvQXB6UWdJQUFSdzBBUVFBZ0FqWUNuTkNBZ0FCQkFFRUFLQUtRMElDQUFDQURhaUlETmdLUTBJQ0FBQ0FDSUFOQkFYSTJBZ1FnQWlBRGFpQUROZ0lBREFNTEFrQWdCaWdDQkNJRVFRTnhRUUZIRFFBZ0JFRjRjU0VIQWtBQ1FDQUVRZjhCU3cwQUlBWW9BZ2dpQlNBRVFRTjJJZ2hCQTNSQnNOQ0FnQUJxSWdCR0dnSkFJQVlvQWd3aUJDQUZSdzBBUVFCQkFDZ0NpTkNBZ0FCQmZpQUlkM0UyQW9qUWdJQUFEQUlMSUFRZ0FFWWFJQVFnQlRZQ0NDQUZJQVEyQWd3TUFRc2dCaWdDR0NFSkFrQUNRQ0FHS0FJTUlnQWdCa1lOQUNBR0tBSUlJZ1FnQ0VrYUlBQWdCRFlDQ0NBRUlBQTJBZ3dNQVFzQ1FDQUdRUlJxSWdRb0FnQWlCUTBBSUFaQkVHb2lCQ2dDQUNJRkRRQkJBQ0VBREFFTEEwQWdCQ0VJSUFVaUFFRVVhaUlFS0FJQUlnVU5BQ0FBUVJCcUlRUWdBQ2dDRUNJRkRRQUxJQWhCQURZQ0FBc2dDVVVOQUFKQUFrQWdCaUFHS0FJY0lnVkJBblJCdU5LQWdBQnFJZ1FvQWdCSERRQWdCQ0FBTmdJQUlBQU5BVUVBUVFBb0FvelFnSUFBUVg0Z0JYZHhOZ0tNMElDQUFBd0NDeUFKUVJCQkZDQUpLQUlRSUFaR0cyb2dBRFlDQUNBQVJRMEJDeUFBSUFrMkFoZ0NRQ0FHS0FJUUlnUkZEUUFnQUNBRU5nSVFJQVFnQURZQ0dBc2dCaWdDRkNJRVJRMEFJQUJCRkdvZ0JEWUNBQ0FFSUFBMkFoZ0xJQWNnQTJvaEF5QUdJQWRxSWdZb0FnUWhCQXNnQmlBRVFYNXhOZ0lFSUFJZ0Eyb2dBellDQUNBQ0lBTkJBWEkyQWdRQ1FDQURRZjhCU3cwQUlBTkJlSEZCc05DQWdBQnFJUVFDUUFKQVFRQW9Bb2pRZ0lBQUlnVkJBU0FEUVFOMmRDSURjUTBBUVFBZ0JTQURjallDaU5DQWdBQWdCQ0VEREFFTElBUW9BZ2doQXdzZ0F5QUNOZ0lNSUFRZ0FqWUNDQ0FDSUFRMkFnd2dBaUFETmdJSURBTUxRUjhoQkFKQUlBTkIvLy8vQjBzTkFDQURRUWgySWdRZ0JFR0EvajlxUVJCMlFRaHhJZ1IwSWdVZ0JVR0E0QjlxUVJCMlFRUnhJZ1YwSWdBZ0FFR0FnQTlxUVJCMlFRSnhJZ0IwUVE5MklBUWdCWElnQUhKcklnUkJBWFFnQXlBRVFSVnFka0VCY1hKQkhHb2hCQXNnQWlBRU5nSWNJQUpDQURjQ0VDQUVRUUowUWJqU2dJQUFhaUVGQWtCQkFDZ0NqTkNBZ0FBaUFFRUJJQVIwSWdoeERRQWdCU0FDTmdJQVFRQWdBQ0FJY2pZQ2pOQ0FnQUFnQWlBRk5nSVlJQUlnQWpZQ0NDQUNJQUkyQWd3TUF3c2dBMEVBUVJrZ0JFRUJkbXNnQkVFZlJodDBJUVFnQlNnQ0FDRUFBMEFnQUNJRktBSUVRWGh4SUFOR0RRSWdCRUVkZGlFQUlBUkJBWFFoQkNBRklBQkJCSEZxUVJCcUlnZ29BZ0FpQUEwQUN5QUlJQUkyQWdBZ0FpQUZOZ0lZSUFJZ0FqWUNEQ0FDSUFJMkFnZ01BZ3NnQUVGNElBQnJRUTl4UVFBZ0FFRUlha0VQY1JzaUEyb2lDeUFHUVVocUlnZ2dBMnNpQTBFQmNqWUNCQ0FBSUFocVFUZzJBZ1FnQkNBRlFUY2dCV3RCRDNGQkFDQUZRVWxxUVE5eEcycEJRV29pQ0NBSUlBUkJFR3BKR3lJSVFTTTJBZ1JCQUVFQUtBTHcwNENBQURZQ3BOQ0FnQUJCQUNBRE5nS1UwSUNBQUVFQUlBczJBcURRZ0lBQUlBaEJFR3BCQUNrQzBOT0FnQUEzQWdBZ0NFRUFLUUxJMDRDQUFEY0NDRUVBSUFoQkNHbzJBdERUZ0lBQVFRQWdCallDek5PQWdBQkJBQ0FBTmdMSTA0Q0FBRUVBUVFBMkF0VFRnSUFBSUFoQkpHb2hBd05BSUFOQkJ6WUNBQ0FEUVFScUlnTWdCVWtOQUFzZ0NDQUVSZzBESUFnZ0NDZ0NCRUYrY1RZQ0JDQUlJQWdnQkdzaUFEWUNBQ0FFSUFCQkFYSTJBZ1FDUUNBQVFmOEJTdzBBSUFCQmVIRkJzTkNBZ0FCcUlRTUNRQUpBUVFBb0FvalFnSUFBSWdWQkFTQUFRUU4yZENJQWNRMEFRUUFnQlNBQWNqWUNpTkNBZ0FBZ0F5RUZEQUVMSUFNb0FnZ2hCUXNnQlNBRU5nSU1JQU1nQkRZQ0NDQUVJQU0yQWd3Z0JDQUZOZ0lJREFRTFFSOGhBd0pBSUFCQi8vLy9CMHNOQUNBQVFRaDJJZ01nQTBHQS9qOXFRUkIyUVFoeElnTjBJZ1VnQlVHQTRCOXFRUkIyUVFSeElnVjBJZ2dnQ0VHQWdBOXFRUkIyUVFKeElnaDBRUTkySUFNZ0JYSWdDSEpySWdOQkFYUWdBQ0FEUVJWcWRrRUJjWEpCSEdvaEF3c2dCQ0FETmdJY0lBUkNBRGNDRUNBRFFRSjBRYmpTZ0lBQWFpRUZBa0JCQUNnQ2pOQ0FnQUFpQ0VFQklBTjBJZ1p4RFFBZ0JTQUVOZ0lBUVFBZ0NDQUdjallDak5DQWdBQWdCQ0FGTmdJWUlBUWdCRFlDQ0NBRUlBUTJBZ3dNQkFzZ0FFRUFRUmtnQTBFQmRtc2dBMEVmUmh0MElRTWdCU2dDQUNFSUEwQWdDQ0lGS0FJRVFYaHhJQUJHRFFNZ0EwRWRkaUVJSUFOQkFYUWhBeUFGSUFoQkJIRnFRUkJxSWdZb0FnQWlDQTBBQ3lBR0lBUTJBZ0FnQkNBRk5nSVlJQVFnQkRZQ0RDQUVJQVEyQWdnTUF3c2dCU2dDQ0NJRElBSTJBZ3dnQlNBQ05nSUlJQUpCQURZQ0dDQUNJQVUyQWd3Z0FpQUROZ0lJQ3lBTFFRaHFJUU1NQlFzZ0JTZ0NDQ0lESUFRMkFnd2dCU0FFTmdJSUlBUkJBRFlDR0NBRUlBVTJBZ3dnQkNBRE5nSUlDMEVBS0FLVTBJQ0FBQ0lESUFKTkRRQkJBQ2dDb05DQWdBQWlCQ0FDYWlJRklBTWdBbXNpQTBFQmNqWUNCRUVBSUFNMkFwVFFnSUFBUVFBZ0JUWUNvTkNBZ0FBZ0JDQUNRUU55TmdJRUlBUkJDR29oQXd3REMwRUFJUU5CQUVFd05nTDQwNENBQUF3Q0N3SkFJQXRGRFFBQ1FBSkFJQWdnQ0NnQ0hDSUZRUUowUWJqU2dJQUFhaUlES0FJQVJ3MEFJQU1nQURZQ0FDQUFEUUZCQUNBSFFYNGdCWGR4SWdjMkFvelFnSUFBREFJTElBdEJFRUVVSUFzb0FoQWdDRVliYWlBQU5nSUFJQUJGRFFFTElBQWdDellDR0FKQUlBZ29BaEFpQTBVTkFDQUFJQU0yQWhBZ0F5QUFOZ0lZQ3lBSVFSUnFLQUlBSWdORkRRQWdBRUVVYWlBRE5nSUFJQU1nQURZQ0dBc0NRQUpBSUFSQkQwc05BQ0FJSUFRZ0Ftb2lBMEVEY2pZQ0JDQUlJQU5xSWdNZ0F5Z0NCRUVCY2pZQ0JBd0JDeUFJSUFKcUlnQWdCRUVCY2pZQ0JDQUlJQUpCQTNJMkFnUWdBQ0FFYWlBRU5nSUFBa0FnQkVIL0FVc05BQ0FFUVhoeFFiRFFnSUFBYWlFREFrQUNRRUVBS0FLSTBJQ0FBQ0lGUVFFZ0JFRURkblFpQkhFTkFFRUFJQVVnQkhJMkFvalFnSUFBSUFNaEJBd0JDeUFES0FJSUlRUUxJQVFnQURZQ0RDQURJQUEyQWdnZ0FDQUROZ0lNSUFBZ0JEWUNDQXdCQzBFZklRTUNRQ0FFUWYvLy93ZExEUUFnQkVFSWRpSURJQU5CZ1A0L2FrRVFka0VJY1NJRGRDSUZJQVZCZ09BZmFrRVFka0VFY1NJRmRDSUNJQUpCZ0lBUGFrRVFka0VDY1NJQ2RFRVBkaUFESUFWeUlBSnlheUlEUVFGMElBUWdBMEVWYW5aQkFYRnlRUnhxSVFNTElBQWdBellDSENBQVFnQTNBaEFnQTBFQ2RFRzQwb0NBQUdvaEJRSkFJQWRCQVNBRGRDSUNjUTBBSUFVZ0FEWUNBRUVBSUFjZ0FuSTJBb3pRZ0lBQUlBQWdCVFlDR0NBQUlBQTJBZ2dnQUNBQU5nSU1EQUVMSUFSQkFFRVpJQU5CQVhacklBTkJIMFliZENFRElBVW9BZ0FoQWdKQUEwQWdBaUlGS0FJRVFYaHhJQVJHRFFFZ0EwRWRkaUVDSUFOQkFYUWhBeUFGSUFKQkJIRnFRUkJxSWdZb0FnQWlBZzBBQ3lBR0lBQTJBZ0FnQUNBRk5nSVlJQUFnQURZQ0RDQUFJQUEyQWdnTUFRc2dCU2dDQ0NJRElBQTJBZ3dnQlNBQU5nSUlJQUJCQURZQ0dDQUFJQVUyQWd3Z0FDQUROZ0lJQ3lBSVFRaHFJUU1NQVFzQ1FDQUtSUTBBQWtBQ1FDQUFJQUFvQWh3aUJVRUNkRUc0MG9DQUFHb2lBeWdDQUVjTkFDQURJQWcyQWdBZ0NBMEJRUUFnQ1VGK0lBVjNjVFlDak5DQWdBQU1BZ3NnQ2tFUVFSUWdDaWdDRUNBQVJodHFJQWcyQWdBZ0NFVU5BUXNnQ0NBS05nSVlBa0FnQUNnQ0VDSURSUTBBSUFnZ0F6WUNFQ0FESUFnMkFoZ0xJQUJCRkdvb0FnQWlBMFVOQUNBSVFSUnFJQU0yQWdBZ0F5QUlOZ0lZQ3dKQUFrQWdCRUVQU3cwQUlBQWdCQ0FDYWlJRFFRTnlOZ0lFSUFBZ0Eyb2lBeUFES0FJRVFRRnlOZ0lFREFFTElBQWdBbW9pQlNBRVFRRnlOZ0lFSUFBZ0FrRURjallDQkNBRklBUnFJQVEyQWdBQ1FDQUhSUTBBSUFkQmVIRkJzTkNBZ0FCcUlRSkJBQ2dDbk5DQWdBQWhBd0pBQWtCQkFTQUhRUU4yZENJSUlBWnhEUUJCQUNBSUlBWnlOZ0tJMElDQUFDQUNJUWdNQVFzZ0FpZ0NDQ0VJQ3lBSUlBTTJBZ3dnQWlBRE5nSUlJQU1nQWpZQ0RDQURJQWcyQWdnTFFRQWdCVFlDbk5DQWdBQkJBQ0FFTmdLUTBJQ0FBQXNnQUVFSWFpRURDeUFCUVJCcUpJQ0FnSUFBSUFNTENnQWdBQkRKZ0lDQUFBdmlEUUVIZndKQUlBQkZEUUFnQUVGNGFpSUJJQUJCZkdvb0FnQWlBa0Y0Y1NJQWFpRURBa0FnQWtFQmNRMEFJQUpCQTNGRkRRRWdBU0FCS0FJQUlnSnJJZ0ZCQUNnQ21OQ0FnQUFpQkVrTkFTQUNJQUJxSVFBQ1FDQUJRUUFvQXB6UWdJQUFSZzBBQWtBZ0FrSC9BVXNOQUNBQktBSUlJZ1FnQWtFRGRpSUZRUU4wUWJEUWdJQUFhaUlHUmhvQ1FDQUJLQUlNSWdJZ0JFY05BRUVBUVFBb0FvalFnSUFBUVg0Z0JYZHhOZ0tJMElDQUFBd0RDeUFDSUFaR0dpQUNJQVEyQWdnZ0JDQUNOZ0lNREFJTElBRW9BaGdoQndKQUFrQWdBU2dDRENJR0lBRkdEUUFnQVNnQ0NDSUNJQVJKR2lBR0lBSTJBZ2dnQWlBR05nSU1EQUVMQWtBZ0FVRVVhaUlDS0FJQUlnUU5BQ0FCUVJCcUlnSW9BZ0FpQkEwQVFRQWhCZ3dCQ3dOQUlBSWhCU0FFSWdaQkZHb2lBaWdDQUNJRURRQWdCa0VRYWlFQ0lBWW9BaEFpQkEwQUN5QUZRUUEyQWdBTElBZEZEUUVDUUFKQUlBRWdBU2dDSENJRVFRSjBRYmpTZ0lBQWFpSUNLQUlBUncwQUlBSWdCallDQUNBR0RRRkJBRUVBS0FLTTBJQ0FBRUYrSUFSM2NUWUNqTkNBZ0FBTUF3c2dCMEVRUVJRZ0J5Z0NFQ0FCUmh0cUlBWTJBZ0FnQmtVTkFnc2dCaUFITmdJWUFrQWdBU2dDRUNJQ1JRMEFJQVlnQWpZQ0VDQUNJQVkyQWhnTElBRW9BaFFpQWtVTkFTQUdRUlJxSUFJMkFnQWdBaUFHTmdJWURBRUxJQU1vQWdRaUFrRURjVUVEUncwQUlBTWdBa0YrY1RZQ0JFRUFJQUEyQXBEUWdJQUFJQUVnQUdvZ0FEWUNBQ0FCSUFCQkFYSTJBZ1FQQ3lBQklBTlBEUUFnQXlnQ0JDSUNRUUZ4UlEwQUFrQUNRQ0FDUVFKeERRQUNRQ0FEUVFBb0FxRFFnSUFBUncwQVFRQWdBVFlDb05DQWdBQkJBRUVBS0FLVTBJQ0FBQ0FBYWlJQU5nS1UwSUNBQUNBQklBQkJBWEkyQWdRZ0FVRUFLQUtjMElDQUFFY05BMEVBUVFBMkFwRFFnSUFBUVFCQkFEWUNuTkNBZ0FBUEN3SkFJQU5CQUNnQ25OQ0FnQUJIRFFCQkFDQUJOZ0tjMElDQUFFRUFRUUFvQXBEUWdJQUFJQUJxSWdBMkFwRFFnSUFBSUFFZ0FFRUJjallDQkNBQklBQnFJQUEyQWdBUEN5QUNRWGh4SUFCcUlRQUNRQUpBSUFKQi93RkxEUUFnQXlnQ0NDSUVJQUpCQTNZaUJVRURkRUd3MElDQUFHb2lCa1lhQWtBZ0F5Z0NEQ0lDSUFSSERRQkJBRUVBS0FLSTBJQ0FBRUYrSUFWM2NUWUNpTkNBZ0FBTUFnc2dBaUFHUmhvZ0FpQUVOZ0lJSUFRZ0FqWUNEQXdCQ3lBREtBSVlJUWNDUUFKQUlBTW9BZ3dpQmlBRFJnMEFJQU1vQWdnaUFrRUFLQUtZMElDQUFFa2FJQVlnQWpZQ0NDQUNJQVkyQWd3TUFRc0NRQ0FEUVJScUlnSW9BZ0FpQkEwQUlBTkJFR29pQWlnQ0FDSUVEUUJCQUNFR0RBRUxBMEFnQWlFRklBUWlCa0VVYWlJQ0tBSUFJZ1FOQUNBR1FSQnFJUUlnQmlnQ0VDSUVEUUFMSUFWQkFEWUNBQXNnQjBVTkFBSkFBa0FnQXlBREtBSWNJZ1JCQW5SQnVOS0FnQUJxSWdJb0FnQkhEUUFnQWlBR05nSUFJQVlOQVVFQVFRQW9Bb3pRZ0lBQVFYNGdCSGR4TmdLTTBJQ0FBQXdDQ3lBSFFSQkJGQ0FIS0FJUUlBTkdHMm9nQmpZQ0FDQUdSUTBCQ3lBR0lBYzJBaGdDUUNBREtBSVFJZ0pGRFFBZ0JpQUNOZ0lRSUFJZ0JqWUNHQXNnQXlnQ0ZDSUNSUTBBSUFaQkZHb2dBallDQUNBQ0lBWTJBaGdMSUFFZ0FHb2dBRFlDQUNBQklBQkJBWEkyQWdRZ0FVRUFLQUtjMElDQUFFY05BVUVBSUFBMkFwRFFnSUFBRHdzZ0F5QUNRWDV4TmdJRUlBRWdBR29nQURZQ0FDQUJJQUJCQVhJMkFnUUxBa0FnQUVIL0FVc05BQ0FBUVhoeFFiRFFnSUFBYWlFQ0FrQUNRRUVBS0FLSTBJQ0FBQ0lFUVFFZ0FFRURkblFpQUhFTkFFRUFJQVFnQUhJMkFvalFnSUFBSUFJaEFBd0JDeUFDS0FJSUlRQUxJQUFnQVRZQ0RDQUNJQUUyQWdnZ0FTQUNOZ0lNSUFFZ0FEWUNDQThMUVI4aEFnSkFJQUJCLy8vL0Iwc05BQ0FBUVFoMklnSWdBa0dBL2o5cVFSQjJRUWh4SWdKMElnUWdCRUdBNEI5cVFSQjJRUVJ4SWdSMElnWWdCa0dBZ0E5cVFSQjJRUUp4SWdaMFFROTJJQUlnQkhJZ0JuSnJJZ0pCQVhRZ0FDQUNRUlZxZGtFQmNYSkJIR29oQWdzZ0FTQUNOZ0ljSUFGQ0FEY0NFQ0FDUVFKMFFialNnSUFBYWlFRUFrQUNRRUVBS0FLTTBJQ0FBQ0lHUVFFZ0FuUWlBM0VOQUNBRUlBRTJBZ0JCQUNBR0lBTnlOZ0tNMElDQUFDQUJJQVEyQWhnZ0FTQUJOZ0lJSUFFZ0FUWUNEQXdCQ3lBQVFRQkJHU0FDUVFGMmF5QUNRUjlHRzNRaEFpQUVLQUlBSVFZQ1FBTkFJQVlpQkNnQ0JFRjRjU0FBUmcwQklBSkJIWFloQmlBQ1FRRjBJUUlnQkNBR1FRUnhha0VRYWlJREtBSUFJZ1lOQUFzZ0F5QUJOZ0lBSUFFZ0JEWUNHQ0FCSUFFMkFnd2dBU0FCTmdJSURBRUxJQVFvQWdnaUFDQUJOZ0lNSUFRZ0FUWUNDQ0FCUVFBMkFoZ2dBU0FFTmdJTUlBRWdBRFlDQ0F0QkFFRUFLQUtvMElDQUFFRi9haUlCUVg4Z0FSczJBcWpRZ0lBQUN3c0VBQUFBQzA0QUFrQWdBQTBBUHdCQkVIUVBDd0pBSUFCQi8vOERjUTBBSUFCQmYwd05BQUpBSUFCQkVIWkFBQ0lBUVg5SERRQkJBRUV3TmdMNDA0Q0FBRUYvRHdzZ0FFRVFkQThMRU1xQWdJQUFBQXZ5QWdJRGZ3RitBa0FnQWtVTkFDQUFJQUU2QUFBZ0FpQUFhaUlEUVg5cUlBRTZBQUFnQWtFRFNRMEFJQUFnQVRvQUFpQUFJQUU2QUFFZ0EwRjlhaUFCT2dBQUlBTkJmbW9nQVRvQUFDQUNRUWRKRFFBZ0FDQUJPZ0FESUFOQmZHb2dBVG9BQUNBQ1FRbEpEUUFnQUVFQUlBQnJRUU54SWdScUlnTWdBVUgvQVhGQmdZS0VDR3dpQVRZQ0FDQURJQUlnQkd0QmZIRWlCR29pQWtGOGFpQUJOZ0lBSUFSQkNVa05BQ0FESUFFMkFnZ2dBeUFCTmdJRUlBSkJlR29nQVRZQ0FDQUNRWFJxSUFFMkFnQWdCRUVaU1EwQUlBTWdBVFlDR0NBRElBRTJBaFFnQXlBQk5nSVFJQU1nQVRZQ0RDQUNRWEJxSUFFMkFnQWdBa0ZzYWlBQk5nSUFJQUpCYUdvZ0FUWUNBQ0FDUVdScUlBRTJBZ0FnQkNBRFFRUnhRUmh5SWdWcklnSkJJRWtOQUNBQnJVS0JnSUNBRUg0aEJpQURJQVZxSVFFRFFDQUJJQVkzQXhnZ0FTQUdOd01RSUFFZ0JqY0RDQ0FCSUFZM0F3QWdBVUVnYWlFQklBSkJZR29pQWtFZlN3MEFDd3NnQUFzTGprZ0JBRUdBQ0F1R1NBRUFBQUFDQUFBQUF3QUFBQUFBQUFBQUFBQUFCQUFBQUFVQUFBQUFBQUFBQUFBQUFBWUFBQUFIQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0J4ZFdWeWVRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgySnZaSGtBUTI5dWRHVnVkQzFNWlc1bmRHZ2diM1psY21ac2IzY0FRMmgxYm1zZ2MybDZaU0J2ZG1WeVpteHZkd0JTWlhOd2IyNXpaU0J2ZG1WeVpteHZkd0JKYm5aaGJHbGtJRzFsZEdodlpDQm1iM0lnU0ZSVVVDOTRMbmdnY21WeGRXVnpkQUJKYm5aaGJHbGtJRzFsZEdodlpDQm1iM0lnVWxSVFVDOTRMbmdnY21WeGRXVnpkQUJGZUhCbFkzUmxaQ0JUVDFWU1EwVWdiV1YwYUc5a0lHWnZjaUJKUTBVdmVDNTRJSEpsY1hWbGMzUUFTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0JtY21GbmJXVnVkQ0J6ZEdGeWRBQkZlSEJsWTNSbFpDQmtiM1FBVTNCaGJpQmpZV3hzWW1GamF5Qmxjbkp2Y2lCcGJpQnZibDl6ZEdGMGRYTUFTVzUyWVd4cFpDQnlaWE53YjI1elpTQnpkR0YwZFhNQVNXNTJZV3hwWkNCamFHRnlZV04wWlhJZ2FXNGdZMmgxYm1zZ1pYaDBaVzV6YVc5dWN3QlZjMlZ5SUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5eVpYTmxkR0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDJOb2RXNXJYMmhsWVdSbGNtQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMjFsYzNOaFoyVmZZbVZuYVc1Z0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmRtRnNkV1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5emRHRjBkWE5mWTI5dGNHeGxkR1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5MlpYSnphVzl1WDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmRYSnNYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmWTJoMWJtdGZZMjl0Y0d4bGRHVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDlvWldGa1pYSmZkbUZzZFdWZlkyOXRjR3hsZEdWZ0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOXRaWE56WVdkbFgyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZiV1YwYUc5a1gyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZhR1ZoWkdWeVgyWnBaV3hrWDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZlkyaDFibXRmWlhoMFpXNXphVzl1WDI1aGJXVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFGVnVaWGh3WldOMFpXUWdZMmhoY2lCcGJpQjFjbXdnYzJWeWRtVnlBRWx1ZG1Gc2FXUWdhR1ZoWkdWeUlIWmhiSFZsSUdOb1lYSUFTVzUyWVd4cFpDQm9aV0ZrWlhJZ1ptbGxiR1FnWTJoaGNnQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgzWmxjbk5wYjI0QVNXNTJZV3hwWkNCdGFXNXZjaUIyWlhKemFXOXVBRWx1ZG1Gc2FXUWdiV0ZxYjNJZ2RtVnljMmx2YmdCRmVIQmxZM1JsWkNCemNHRmpaU0JoWm5SbGNpQjJaWEp6YVc5dUFFVjRjR1ZqZEdWa0lFTlNURVlnWVdaMFpYSWdkbVZ5YzJsdmJnQkpiblpoYkdsa0lFaFVWRkFnZG1WeWMybHZiZ0JKYm5aaGJHbGtJR2hsWVdSbGNpQjBiMnRsYmdCVGNHRnVJR05oYkd4aVlXTnJJR1Z5Y205eUlHbHVJRzl1WDNWeWJBQkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNuTWdhVzRnZFhKc0FGVnVaWGh3WldOMFpXUWdjM1JoY25RZ1kyaGhjaUJwYmlCMWNtd0FSRzkxWW14bElFQWdhVzRnZFhKc0FFVnRjSFI1SUVOdmJuUmxiblF0VEdWdVozUm9BRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUVOdmJuUmxiblF0VEdWdVozUm9BRVIxY0d4cFkyRjBaU0JEYjI1MFpXNTBMVXhsYm1kMGFBQkpiblpoYkdsa0lHTm9ZWElnYVc0Z2RYSnNJSEJoZEdnQVEyOXVkR1Z1ZEMxTVpXNW5kR2dnWTJGdUozUWdZbVVnY0hKbGMyVnVkQ0IzYVhSb0lGUnlZVzV6Wm1WeUxVVnVZMjlrYVc1bkFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklITnBlbVVBVTNCaGJpQmpZV3hzWW1GamF5Qmxjbkp2Y2lCcGJpQnZibDlvWldGa1pYSmZkbUZzZFdVQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5amFIVnVhMTlsZUhSbGJuTnBiMjVmZG1Gc2RXVUFTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSWdhVzRnWTJoMWJtc2daWGgwWlc1emFXOXVjeUIyWVd4MVpRQk5hWE56YVc1bklHVjRjR1ZqZEdWa0lFeEdJR0ZtZEdWeUlHaGxZV1JsY2lCMllXeDFaUUJKYm5aaGJHbGtJR0JVY21GdWMyWmxjaTFGYm1OdlpHbHVaMkFnYUdWaFpHVnlJSFpoYkhWbEFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklHVjRkR1Z1YzJsdmJuTWdjWFZ2ZEdVZ2RtRnNkV1VBU1c1MllXeHBaQ0JqYUdGeVlXTjBaWElnYVc0Z1kyaDFibXNnWlhoMFpXNXphVzl1Y3lCeGRXOTBaV1FnZG1Gc2RXVUFVR0YxYzJWa0lHSjVJRzl1WDJobFlXUmxjbk5mWTI5dGNHeGxkR1VBU1c1MllXeHBaQ0JGVDBZZ2MzUmhkR1VBYjI1ZmNtVnpaWFFnY0dGMWMyVUFiMjVmWTJoMWJtdGZhR1ZoWkdWeUlIQmhkWE5sQUc5dVgyMWxjM05oWjJWZlltVm5hVzRnY0dGMWMyVUFiMjVmWTJoMWJtdGZaWGgwWlc1emFXOXVYM1poYkhWbElIQmhkWE5sQUc5dVgzTjBZWFIxYzE5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5MlpYSnphVzl1WDJOdmJYQnNaWFJsSUhCaGRYTmxBRzl1WDNWeWJGOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOWphSFZ1YTE5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5b1pXRmtaWEpmZG1Gc2RXVmZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOXRaWFJvYjJSZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmFHVmhaR1Z5WDJacFpXeGtYMk52YlhCc1pYUmxJSEJoZFhObEFHOXVYMk5vZFc1clgyVjRkR1Z1YzJsdmJsOXVZVzFsSUhCaGRYTmxBRlZ1Wlhod1pXTjBaV1FnYzNCaFkyVWdZV1owWlhJZ2MzUmhjblFnYkdsdVpRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyTm9kVzVyWDJWNGRHVnVjMmx2Ymw5dVlXMWxBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJR1Y0ZEdWdWMybHZibk1nYm1GdFpRQlFZWFZ6WlNCdmJpQkRUMDVPUlVOVUwxVndaM0poWkdVQVVHRjFjMlVnYjI0Z1VGSkpMMVZ3WjNKaFpHVUFSWGh3WldOMFpXUWdTRlJVVUM4eUlFTnZibTVsWTNScGIyNGdVSEpsWm1GalpRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyMWxkR2h2WkFCRmVIQmxZM1JsWkNCemNHRmpaU0JoWm5SbGNpQnRaWFJvYjJRQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5b1pXRmtaWEpmWm1sbGJHUUFVR0YxYzJWa0FFbHVkbUZzYVdRZ2QyOXlaQ0JsYm1OdmRXNTBaWEpsWkFCSmJuWmhiR2xrSUcxbGRHaHZaQ0JsYm1OdmRXNTBaWEpsWkFCVmJtVjRjR1ZqZEdWa0lHTm9ZWElnYVc0Z2RYSnNJSE5qYUdWdFlRQlNaWEYxWlhOMElHaGhjeUJwYm5aaGJHbGtJR0JVY21GdWMyWmxjaTFGYm1OdlpHbHVaMkFBVTFkSlZFTklYMUJTVDFoWkFGVlRSVjlRVWs5WVdRQk5TMEZEVkVsV1NWUlpBRlZPVUZKUFEwVlRVMEZDVEVWZlJVNVVTVlJaQUVOUFVGa0FUVTlXUlVSZlVFVlNUVUZPUlU1VVRGa0FWRTlQWDBWQlVreFpBRTVQVkVsR1dRQkdRVWxNUlVSZlJFVlFSVTVFUlU1RFdRQkNRVVJmUjBGVVJWZEJXUUJRVEVGWkFGQlZWQUJEU0VWRFMwOVZWQUJIUVZSRlYwRlpYMVJKVFVWUFZWUUFVa1ZSVlVWVFZGOVVTVTFGVDFWVUFFNUZWRmRQVWt0ZlEwOU9Ua1ZEVkY5VVNVMUZUMVZVQUVOUFRrNUZRMVJKVDA1ZlZFbE5SVTlWVkFCTVQwZEpUbDlVU1UxRlQxVlVBRTVGVkZkUFVrdGZVa1ZCUkY5VVNVMUZUMVZVQUZCUFUxUUFUVWxUUkVsU1JVTlVSVVJmVWtWUlZVVlRWQUJEVEVsRlRsUmZRMHhQVTBWRVgxSkZVVlZGVTFRQVEweEpSVTVVWDBOTVQxTkZSRjlNVDBGRVgwSkJURUZPUTBWRVgxSkZVVlZGVTFRQVFrRkVYMUpGVVZWRlUxUUFTRlJVVUY5U1JWRlZSVk5VWDFORlRsUmZWRTlmU0ZSVVVGTmZVRTlTVkFCU1JWQlBVbFFBU1UxZlFWOVVSVUZRVDFRQVVrVlRSVlJmUTA5T1ZFVk9WQUJPVDE5RFQwNVVSVTVVQUZCQlVsUkpRVXhmUTA5T1ZFVk9WQUJJVUVWZlNVNVdRVXhKUkY5RFQwNVRWRUZPVkFCSVVFVmZRMEpmVWtWVFJWUUFSMFZVQUVoUVJWOVRWRkpKUTFRQVEwOU9Sa3hKUTFRQVZFVk5VRTlTUVZKWlgxSkZSRWxTUlVOVUFGQkZVazFCVGtWT1ZGOVNSVVJKVWtWRFZBQkRUMDVPUlVOVUFFMVZURlJKWDFOVVFWUlZVd0JJVUVWZlNVNVdRVXhKUkY5VFZFRlVWVk1BVkU5UFgwMUJUbGxmVWtWUlZVVlRWRk1BUlVGU1RGbGZTRWxPVkZNQVZVNUJWa0ZKVEVGQ1RFVmZSazlTWDB4RlIwRk1YMUpGUVZOUFRsTUFUMUJVU1U5T1V3QlRWMGxVUTBoSlRrZGZVRkpQVkU5RFQweFRBRlpCVWtsQlRsUmZRVXhUVDE5T1JVZFBWRWxCVkVWVEFFMVZURlJKVUV4RlgwTklUMGxEUlZNQVNVNVVSVkpPUVV4ZlUwVlNWa1ZTWDBWU1VrOVNBRmRGUWw5VFJWSldSVkpmVlU1TFRrOVhUbDlGVWxKUFVnQlNRVWxNUjFWT1gwVlNVazlTQUVsRVJVNVVTVlJaWDFCU1QxWkpSRVZTWDBGVlZFaEZUbFJKUTBGVVNVOU9YMFZTVWs5U0FGTlRURjlEUlZKVVNVWkpRMEZVUlY5RlVsSlBVZ0JKVGxaQlRFbEVYMWhmUms5U1YwRlNSRVZFWDBaUFVnQlRSVlJmVUVGU1FVMUZWRVZTQUVkRlZGOVFRVkpCVFVWVVJWSUFTRkJGWDFWVFJWSUFVMFZGWDA5VVNFVlNBRWhRUlY5RFFsOURTRlZPUzE5SVJVRkVSVklBVFV0RFFVeEZUa1JCVWdCVFJWUlZVQUJYUlVKZlUwVlNWa1ZTWDBsVFgwUlBWMDRBVkVWQlVrUlBWMDRBU0ZCRlgwTk1UMU5GUkY5RFQwNU9SVU5VU1U5T0FFaEZWVkpKVTFSSlExOUZXRkJKVWtGVVNVOU9BRVJKVTBOUFRrNUZRMVJGUkY5UFVFVlNRVlJKVDA0QVRrOU9YMEZWVkVoUFVrbFVRVlJKVmtWZlNVNUdUMUpOUVZSSlQwNEFTRkJGWDBsT1ZrRk1TVVJmVmtWU1UwbFBUZ0JJVUVWZlEwSmZUVVZUVTBGSFJWOUNSVWRKVGdCVFNWUkZYMGxUWDBaU1QxcEZUZ0JJVUVWZlNVNVdRVXhKUkY5SVJVRkVSVkpmVkU5TFJVNEFTVTVXUVV4SlJGOVVUMHRGVGdCR1QxSkNTVVJFUlU0QVJVNUlRVTVEUlY5WlQxVlNYME5CVEUwQVNGQkZYMGxPVmtGTVNVUmZWVkpNQUVKTVQwTkxSVVJmUWxsZlVFRlNSVTVVUVV4ZlEwOU9WRkpQVEFCTlMwTlBUQUJCUTB3QVNGQkZYMGxPVkVWU1RrRk1BRkpGVVZWRlUxUmZTRVZCUkVWU1gwWkpSVXhFVTE5VVQwOWZURUZTUjBWZlZVNVBSa1pKUTBsQlRBQklVRVZmVDBzQVZVNU1TVTVMQUZWT1RFOURTd0JRVWtrQVVrVlVVbGxmVjBsVVNBQklVRVZmU1U1V1FVeEpSRjlEVDA1VVJVNVVYMHhGVGtkVVNBQklVRVZmVlU1RldGQkZRMVJGUkY5RFQwNVVSVTVVWDB4RlRrZFVTQUJHVEZWVFNBQlFVazlRVUVGVVEwZ0FUUzFUUlVGU1EwZ0FWVkpKWDFSUFQxOU1UMDVIQUZCU1QwTkZVMU5KVGtjQVRVbFRRMFZNVEVGT1JVOVZVMTlRUlZKVFNWTlVSVTVVWDFkQlVrNUpUa2NBVFVsVFEwVk1URUZPUlU5VlUxOVhRVkpPU1U1SEFFaFFSVjlKVGxaQlRFbEVYMVJTUVU1VFJrVlNYMFZPUTA5RVNVNUhBRVY0Y0dWamRHVmtJRU5TVEVZQVNGQkZYMGxPVmtGTVNVUmZRMGhWVGt0ZlUwbGFSUUJOVDFaRkFFTlBUbFJKVGxWRkFFaFFSVjlEUWw5VFZFRlVWVk5mUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMGhGUVVSRlVsTmZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gxWkZVbE5KVDA1ZlEwOU5VRXhGVkVVQVNGQkZYME5DWDFWU1RGOURUMDFRVEVWVVJRQklVRVZmUTBKZlEwaFZUa3RmUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMGhGUVVSRlVsOVdRVXhWUlY5RFQwMVFURVZVUlFCSVVFVmZRMEpmUTBoVlRrdGZSVmhVUlU1VFNVOU9YMVpCVEZWRlgwTlBUVkJNUlZSRkFFaFFSVjlEUWw5RFNGVk9TMTlGV0ZSRlRsTkpUMDVmVGtGTlJWOURUMDFRVEVWVVJRQklVRVZmUTBKZlRVVlRVMEZIUlY5RFQwMVFURVZVUlFCSVVFVmZRMEpmVFVWVVNFOUVYME5QVFZCTVJWUkZBRWhRUlY5RFFsOUlSVUZFUlZKZlJrbEZURVJmUTA5TlVFeEZWRVVBUkVWTVJWUkZBRWhRUlY5SlRsWkJURWxFWDBWUFJsOVRWRUZVUlFCSlRsWkJURWxFWDFOVFRGOURSVkpVU1VaSlEwRlVSUUJRUVZWVFJRQk9UMTlTUlZOUVQwNVRSUUJWVGxOVlVGQlBVbFJGUkY5TlJVUkpRVjlVV1ZCRkFFZFBUa1VBVGs5VVgwRkRRMFZRVkVGQ1RFVUFVMFZTVmtsRFJWOVZUa0ZXUVVsTVFVSk1SUUJTUVU1SFJWOU9UMVJmVTBGVVNWTkdTVUZDVEVVQVQxSkpSMGxPWDBsVFgxVk9Va1ZCUTBoQlFreEZBRkpGVTFCUFRsTkZYMGxUWDFOVVFVeEZBRkJWVWtkRkFFMUZVa2RGQUZKRlVWVkZVMVJmU0VWQlJFVlNYMFpKUlV4RVUxOVVUMDlmVEVGU1IwVUFVa1ZSVlVWVFZGOUlSVUZFUlZKZlZFOVBYMHhCVWtkRkFGQkJXVXhQUVVSZlZFOVBYMHhCVWtkRkFFbE9VMVZHUmtsRFNVVk9WRjlUVkU5U1FVZEZBRWhRUlY5UVFWVlRSVVJmVlZCSFVrRkVSUUJJVUVWZlVFRlZVMFZFWDBneVgxVlFSMUpCUkVVQVUwOVZVa05GQUVGT1RrOVZUa05GQUZSU1FVTkZBRWhRUlY5VlRrVllVRVZEVkVWRVgxTlFRVU5GQUVSRlUwTlNTVUpGQUZWT1UxVkNVME5TU1VKRkFGSkZRMDlTUkFCSVVFVmZTVTVXUVV4SlJGOU5SVlJJVDBRQVRrOVVYMFpQVlU1RUFGQlNUMUJHU1U1RUFGVk9Ra2xPUkFCU1JVSkpUa1FBVlU1QlZWUklUMUpKV2tWRUFFMUZWRWhQUkY5T1QxUmZRVXhNVDFkRlJBQklWRlJRWDFaRlVsTkpUMDVmVGs5VVgxTlZVRkJQVWxSRlJBQkJURkpGUVVSWlgxSkZVRTlTVkVWRUFFRkRRMFZRVkVWRUFFNVBWRjlKVFZCTVJVMUZUbFJGUkFCTVQwOVFYMFJGVkVWRFZFVkVBRWhRUlY5RFVsOUZXRkJGUTFSRlJBQklVRVZmVEVaZlJWaFFSVU5VUlVRQVExSkZRVlJGUkFCSlRWOVZVMFZFQUVoUVJWOVFRVlZUUlVRQVZFbE5SVTlWVkY5UFEwTlZVa1ZFQUZCQldVMUZUbFJmVWtWUlZVbFNSVVFBVUZKRlEwOU9SRWxVU1U5T1gxSkZVVlZKVWtWRUFGQlNUMWhaWDBGVlZFaEZUbFJKUTBGVVNVOU9YMUpGVVZWSlVrVkVBRTVGVkZkUFVrdGZRVlZVU0VWT1ZFbERRVlJKVDA1ZlVrVlJWVWxTUlVRQVRFVk9SMVJJWDFKRlVWVkpVa1ZFQUZOVFRGOURSVkpVU1VaSlEwRlVSVjlTUlZGVlNWSkZSQUJWVUVkU1FVUkZYMUpGVVZWSlVrVkVBRkJCUjBWZlJWaFFTVkpGUkFCUVVrVkRUMDVFU1ZSSlQwNWZSa0ZKVEVWRUFFVllVRVZEVkVGVVNVOU9YMFpCU1V4RlJBQlNSVlpCVEVsRVFWUkpUMDVmUmtGSlRFVkVBRk5UVEY5SVFVNUVVMGhCUzBWZlJrRkpURVZFQUV4UFEwdEZSQUJVVWtGT1UwWlBVazFCVkVsUFRsOUJVRkJNU1VWRUFFNVBWRjlOVDBSSlJrbEZSQUJPVDFSZlJWaFVSVTVFUlVRQVFrRk9SRmRKUkZSSVgweEpUVWxVWDBWWVEwVkZSRVZFQUZOSlZFVmZTVk5mVDFaRlVreFBRVVJGUkFCSVJVRkVBRVY0Y0dWamRHVmtJRWhVVkZBdkFBQmVFd0FBSmhNQUFEQVFBQUR3RndBQW5STUFBQlVTQUFBNUZ3QUE4QklBQUFvUUFBQjFFZ0FBclJJQUFJSVRBQUJQRkFBQWZ4QUFBS0FWQUFBakZBQUFpUklBQUlzVUFBQk5GUUFBMUJFQUFNOFVBQUFRR0FBQXlSWUFBTndXQUFEQkVRQUE0QmNBQUxzVUFBQjBGQUFBZkJVQUFPVVVBQUFJRndBQUh4QUFBR1VWQUFDakZBQUFLQlVBQUFJVkFBQ1pGUUFBTEJBQUFJc1pBQUJQRHdBQTFBNEFBR29RQUFET0VBQUFBaGNBQUlrT0FBQnVFd0FBSEJNQUFHWVVBQUJXRndBQXdSTUFBTTBUQUFCc0V3QUFhQmNBQUdZWEFBQmZGd0FBSWhNQUFNNFBBQUJwRGdBQTJBNEFBR01XQUFETEV3QUFxZzRBQUNnWEFBQW1Gd0FBeFJNQUFGMFdBQURvRVFBQVp4TUFBR1VUQUFEeUZnQUFjeE1BQUIwWEFBRDVGZ0FBOHhFQUFNOE9BQURPRlFBQURCSUFBTE1SQUFDbEVRQUFZUkFBQURJWEFBQzdFd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUJBZ0VCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdNQ0FnSUNBZ0FBQWdJQUFnSUFBZ0lDQWdJQ0FnSUNBZ0FFQUFBQUFBQUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQUFBQUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUFJQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUFBZ0lDQWdJQUFBSUNBQUlDQUFJQ0FnSUNBZ0lDQWdJQUF3QUVBQUFBQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBQUFBQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQUNBQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCc2IzTmxaV1Z3TFdGc2FYWmxBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFFQkFRRUJBUUVCQVFFQkFnRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUZqYUhWdWEyVmtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFRQUJBUUVCQVFBQUFRRUFBUUVBQVFFQkFRRUJBUUVCQVFBQUFBQUFBQUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFBQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdWamRHbHZibVZ1ZEMxc1pXNW5kR2h2Ym5KdmVIa3RZMjl1Ym1WamRHbHZiZ0FBQUFBQUFBQUFBQUFBQUFBQUFISmhibk5tWlhJdFpXNWpiMlJwYm1kd1ozSmhaR1VOQ2cwS0RRcFRUUTBLRFFwVVZGQXZRMFV2VkZOUUx3QUFBQUFBQUFBQUFBQUFBQUVDQUFFREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQUFBQkFnQUJBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFCQVFVQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUFBQUFBQUFBQUFBUUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRRUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQUFBQUFBQUFBQUFBQkFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd1FBQUFRRUJBUUVCQVFFQkFRRUJRUUVCQVFFQkFRRUJBUUVCQUFFQUFZSEJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBUUFCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdBQUFBQUFBQU1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBQUFBQUFBQUF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdBQUFBQUFBQU1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFNVBWVTVEUlVWRFMwOVZWRTVGUTFSRlZFVkRVa2xDUlV4VlUwaEZWRVZCUkZORlFWSkRTRkpIUlVOVVNWWkpWRmxNUlU1RVFWSldSVTlVU1VaWlVGUkpUMDVUUTBoVFJVRlpVMVJCVkVOSVIwVlBVa1JKVWtWRFZFOVNWRkpEU0ZCQlVrRk5SVlJGVWxWU1EwVkNVME5TU1VKRlFWSkVUMWRPUVVORlNVNUVUa3REUzFWQ1UwTlNTVUpGU0ZSVVVDOUJSRlJRTHc9PSdcbiIsCiAgICAiLy8gQHRzLWNoZWNrXG5cbid1c2Ugc3RyaWN0J1xuXG4vKiBnbG9iYWwgV2ViQXNzZW1ibHkgKi9cblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IG5ldCA9IHJlcXVpcmUoJ25ldCcpXG5jb25zdCBodHRwID0gcmVxdWlyZSgnaHR0cCcpXG5jb25zdCB7IHBpcGVsaW5lIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IHRpbWVycyA9IHJlcXVpcmUoJy4vdGltZXJzJylcbmNvbnN0IFJlcXVlc3QgPSByZXF1aXJlKCcuL2NvcmUvcmVxdWVzdCcpXG5jb25zdCBEaXNwYXRjaGVyQmFzZSA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlci1iYXNlJylcbmNvbnN0IHtcbiAgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yLFxuICBSZXNwb25zZUNvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yLFxuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvcixcbiAgSGVhZGVyc1RpbWVvdXRFcnJvcixcbiAgSGVhZGVyc092ZXJmbG93RXJyb3IsXG4gIFNvY2tldEVycm9yLFxuICBJbmZvcm1hdGlvbmFsRXJyb3IsXG4gIEJvZHlUaW1lb3V0RXJyb3IsXG4gIEhUVFBQYXJzZXJFcnJvcixcbiAgUmVzcG9uc2VFeGNlZWRlZE1heFNpemVFcnJvcixcbiAgQ2xpZW50RGVzdHJveWVkRXJyb3Jcbn0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IGJ1aWxkQ29ubmVjdG9yID0gcmVxdWlyZSgnLi9jb3JlL2Nvbm5lY3QnKVxuY29uc3Qge1xuICBrVXJsLFxuICBrUmVzZXQsXG4gIGtTZXJ2ZXJOYW1lLFxuICBrQ2xpZW50LFxuICBrQnVzeSxcbiAga1BhcnNlcixcbiAga0Nvbm5lY3QsXG4gIGtCbG9ja2luZyxcbiAga1Jlc3VtaW5nLFxuICBrUnVubmluZyxcbiAga1BlbmRpbmcsXG4gIGtTaXplLFxuICBrV3JpdGluZyxcbiAga1F1ZXVlLFxuICBrQ29ubmVjdGVkLFxuICBrQ29ubmVjdGluZyxcbiAga05lZWREcmFpbixcbiAga05vUmVmLFxuICBrS2VlcEFsaXZlRGVmYXVsdFRpbWVvdXQsXG4gIGtIb3N0SGVhZGVyLFxuICBrUGVuZGluZ0lkeCxcbiAga1J1bm5pbmdJZHgsXG4gIGtFcnJvcixcbiAga1BpcGVsaW5pbmcsXG4gIGtTb2NrZXQsXG4gIGtLZWVwQWxpdmVUaW1lb3V0VmFsdWUsXG4gIGtNYXhIZWFkZXJzU2l6ZSxcbiAga0tlZXBBbGl2ZU1heFRpbWVvdXQsXG4gIGtLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkLFxuICBrSGVhZGVyc1RpbWVvdXQsXG4gIGtCb2R5VGltZW91dCxcbiAga1N0cmljdENvbnRlbnRMZW5ndGgsXG4gIGtDb25uZWN0b3IsXG4gIGtNYXhSZWRpcmVjdGlvbnMsXG4gIGtNYXhSZXF1ZXN0cyxcbiAga0NvdW50ZXIsXG4gIGtDbG9zZSxcbiAga0Rlc3Ryb3ksXG4gIGtEaXNwYXRjaCxcbiAga0ludGVyY2VwdG9ycyxcbiAga0xvY2FsQWRkcmVzcyxcbiAga01heFJlc3BvbnNlU2l6ZSxcbiAga0hUVFBDb25uVmVyc2lvbixcbiAgLy8gSFRUUDJcbiAga0hvc3QsXG4gIGtIVFRQMlNlc3Npb24sXG4gIGtIVFRQMlNlc3Npb25TdGF0ZSxcbiAga0hUVFAyQnVpbGRSZXF1ZXN0LFxuICBrSFRUUDJDb3B5SGVhZGVycyxcbiAga0hUVFAxQnVpbGRSZXF1ZXN0XG59ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuXG4vKiogQHR5cGUge2ltcG9ydCgnaHR0cDInKX0gKi9cbmxldCBodHRwMlxudHJ5IHtcbiAgaHR0cDIgPSByZXF1aXJlKCdodHRwMicpXG59IGNhdGNoIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBodHRwMiA9IHsgY29uc3RhbnRzOiB7fSB9XG59XG5cbmNvbnN0IHtcbiAgY29uc3RhbnRzOiB7XG4gICAgSFRUUDJfSEVBREVSX0FVVEhPUklUWSxcbiAgICBIVFRQMl9IRUFERVJfTUVUSE9ELFxuICAgIEhUVFAyX0hFQURFUl9QQVRILFxuICAgIEhUVFAyX0hFQURFUl9TQ0hFTUUsXG4gICAgSFRUUDJfSEVBREVSX0NPTlRFTlRfTEVOR1RILFxuICAgIEhUVFAyX0hFQURFUl9FWFBFQ1QsXG4gICAgSFRUUDJfSEVBREVSX1NUQVRVU1xuICB9XG59ID0gaHR0cDJcblxuLy8gRXhwZXJpbWVudGFsXG5sZXQgaDJFeHBlcmltZW50YWxXYXJuZWQgPSBmYWxzZVxuXG5jb25zdCBGYXN0QnVmZmVyID0gQnVmZmVyW1N5bWJvbC5zcGVjaWVzXVxuXG5jb25zdCBrQ2xvc2VkUmVzb2x2ZSA9IFN5bWJvbCgna0Nsb3NlZFJlc29sdmUnKVxuXG5jb25zdCBjaGFubmVscyA9IHt9XG5cbnRyeSB7XG4gIGNvbnN0IGRpYWdub3N0aWNzQ2hhbm5lbCA9IHJlcXVpcmUoJ2RpYWdub3N0aWNzX2NoYW5uZWwnKVxuICBjaGFubmVscy5zZW5kSGVhZGVycyA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OnNlbmRIZWFkZXJzJylcbiAgY2hhbm5lbHMuYmVmb3JlQ29ubmVjdCA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OmJlZm9yZUNvbm5lY3QnKVxuICBjaGFubmVscy5jb25uZWN0RXJyb3IgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOmNsaWVudDpjb25uZWN0RXJyb3InKVxuICBjaGFubmVscy5jb25uZWN0ZWQgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOmNsaWVudDpjb25uZWN0ZWQnKVxufSBjYXRjaCB7XG4gIGNoYW5uZWxzLnNlbmRIZWFkZXJzID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5iZWZvcmVDb25uZWN0ID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5jb25uZWN0RXJyb3IgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG4gIGNoYW5uZWxzLmNvbm5lY3RlZCA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7aW1wb3J0KCcuLi90eXBlcy9jbGllbnQnKS5kZWZhdWx0fVxuICovXG5jbGFzcyBDbGllbnQgZXh0ZW5kcyBEaXNwYXRjaGVyQmFzZSB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xVUkx9IHVybFxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vdHlwZXMvY2xpZW50JykuQ2xpZW50Lk9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yICh1cmwsIHtcbiAgICBpbnRlcmNlcHRvcnMsXG4gICAgbWF4SGVhZGVyU2l6ZSxcbiAgICBoZWFkZXJzVGltZW91dCxcbiAgICBzb2NrZXRUaW1lb3V0LFxuICAgIHJlcXVlc3RUaW1lb3V0LFxuICAgIGNvbm5lY3RUaW1lb3V0LFxuICAgIGJvZHlUaW1lb3V0LFxuICAgIGlkbGVUaW1lb3V0LFxuICAgIGtlZXBBbGl2ZSxcbiAgICBrZWVwQWxpdmVUaW1lb3V0LFxuICAgIG1heEtlZXBBbGl2ZVRpbWVvdXQsXG4gICAga2VlcEFsaXZlTWF4VGltZW91dCxcbiAgICBrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkLFxuICAgIHNvY2tldFBhdGgsXG4gICAgcGlwZWxpbmluZyxcbiAgICB0bHMsXG4gICAgc3RyaWN0Q29udGVudExlbmd0aCxcbiAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICBtYXhSZWRpcmVjdGlvbnMsXG4gICAgY29ubmVjdCxcbiAgICBtYXhSZXF1ZXN0c1BlckNsaWVudCxcbiAgICBsb2NhbEFkZHJlc3MsXG4gICAgbWF4UmVzcG9uc2VTaXplLFxuICAgIGF1dG9TZWxlY3RGYW1pbHksXG4gICAgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0LFxuICAgIC8vIGgyXG4gICAgYWxsb3dIMixcbiAgICBtYXhDb25jdXJyZW50U3RyZWFtc1xuICB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICBpZiAoa2VlcEFsaXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQga2VlcEFsaXZlLCB1c2UgcGlwZWxpbmluZz0wIGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChzb2NrZXRUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQgc29ja2V0VGltZW91dCwgdXNlIGhlYWRlcnNUaW1lb3V0ICYgYm9keVRpbWVvdXQgaW5zdGVhZCcpXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQgcmVxdWVzdFRpbWVvdXQsIHVzZSBoZWFkZXJzVGltZW91dCAmIGJvZHlUaW1lb3V0IGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChpZGxlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIGlkbGVUaW1lb3V0LCB1c2Uga2VlcEFsaXZlVGltZW91dCBpbnN0ZWFkJylcbiAgICB9XG5cbiAgICBpZiAobWF4S2VlcEFsaXZlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIG1heEtlZXBBbGl2ZVRpbWVvdXQsIHVzZSBrZWVwQWxpdmVNYXhUaW1lb3V0IGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChtYXhIZWFkZXJTaXplICE9IG51bGwgJiYgIU51bWJlci5pc0Zpbml0ZShtYXhIZWFkZXJTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG1heEhlYWRlclNpemUnKVxuICAgIH1cblxuICAgIGlmIChzb2NrZXRQYXRoICE9IG51bGwgJiYgdHlwZW9mIHNvY2tldFBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgc29ja2V0UGF0aCcpXG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3RUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoY29ubmVjdFRpbWVvdXQpIHx8IGNvbm5lY3RUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjb25uZWN0VGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGtlZXBBbGl2ZVRpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShrZWVwQWxpdmVUaW1lb3V0KSB8fCBrZWVwQWxpdmVUaW1lb3V0IDw9IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQga2VlcEFsaXZlVGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGtlZXBBbGl2ZU1heFRpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShrZWVwQWxpdmVNYXhUaW1lb3V0KSB8fCBrZWVwQWxpdmVNYXhUaW1lb3V0IDw9IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQga2VlcEFsaXZlTWF4VGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQgIT0gbnVsbCAmJiAhTnVtYmVyLmlzRmluaXRlKGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQga2VlcEFsaXZlVGltZW91dFRocmVzaG9sZCcpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlcnNUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGhlYWRlcnNUaW1lb3V0KSB8fCBoZWFkZXJzVGltZW91dCA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnNUaW1lb3V0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIHplcm8nKVxuICAgIH1cblxuICAgIGlmIChib2R5VGltZW91dCAhPSBudWxsICYmICghTnVtYmVyLmlzSW50ZWdlcihib2R5VGltZW91dCkgfHwgYm9keVRpbWVvdXQgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdib2R5VGltZW91dCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciB6ZXJvJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAhPSBudWxsICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdjb25uZWN0IG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIGlmIChtYXhSZWRpcmVjdGlvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVkaXJlY3Rpb25zKSB8fCBtYXhSZWRpcmVjdGlvbnMgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhSZWRpcmVjdGlvbnMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gICAgfVxuXG4gICAgaWYgKG1heFJlcXVlc3RzUGVyQ2xpZW50ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlcXVlc3RzUGVyQ2xpZW50KSB8fCBtYXhSZXF1ZXN0c1BlckNsaWVudCA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heFJlcXVlc3RzUGVyQ2xpZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIGlmIChsb2NhbEFkZHJlc3MgIT0gbnVsbCAmJiAodHlwZW9mIGxvY2FsQWRkcmVzcyAhPT0gJ3N0cmluZycgfHwgbmV0LmlzSVAobG9jYWxBZGRyZXNzKSA9PT0gMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbG9jYWxBZGRyZXNzIG11c3QgYmUgdmFsaWQgc3RyaW5nIElQIGFkZHJlc3MnKVxuICAgIH1cblxuICAgIGlmIChtYXhSZXNwb25zZVNpemUgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVzcG9uc2VTaXplKSB8fCBtYXhSZXNwb25zZVNpemUgPCAtMSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4UmVzcG9uc2VTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCAhPSBudWxsICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIoYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0KSB8fCBhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQgPCAtMSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIC8vIGgyXG4gICAgaWYgKGFsbG93SDIgIT0gbnVsbCAmJiB0eXBlb2YgYWxsb3dIMiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2FsbG93SDIgbXVzdCBiZSBhIHZhbGlkIGJvb2xlYW4gdmFsdWUnKVxuICAgIH1cblxuICAgIGlmIChtYXhDb25jdXJyZW50U3RyZWFtcyAhPSBudWxsICYmICh0eXBlb2YgbWF4Q29uY3VycmVudFN0cmVhbXMgIT09ICdudW1iZXInIHx8IG1heENvbmN1cnJlbnRTdHJlYW1zIDwgMSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4Q29uY3VycmVudFN0cmVhbXMgbXVzdCBiZSBhIHBvc3NpdGl2ZSBpbnRlZ2VyLCBncmVhdGVyIHRoYW4gMCcpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25uZWN0ID0gYnVpbGRDb25uZWN0b3Ioe1xuICAgICAgICAuLi50bHMsXG4gICAgICAgIG1heENhY2hlZFNlc3Npb25zLFxuICAgICAgICBhbGxvd0gyLFxuICAgICAgICBzb2NrZXRQYXRoLFxuICAgICAgICB0aW1lb3V0OiBjb25uZWN0VGltZW91dCxcbiAgICAgICAgLi4uKHV0aWwubm9kZUhhc0F1dG9TZWxlY3RGYW1pbHkgJiYgYXV0b1NlbGVjdEZhbWlseSA/IHsgYXV0b1NlbGVjdEZhbWlseSwgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0IH0gOiB1bmRlZmluZWQpLFxuICAgICAgICAuLi5jb25uZWN0XG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXNba0ludGVyY2VwdG9yc10gPSBpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLkNsaWVudCAmJiBBcnJheS5pc0FycmF5KGludGVyY2VwdG9ycy5DbGllbnQpXG4gICAgICA/IGludGVyY2VwdG9ycy5DbGllbnRcbiAgICAgIDogW2NyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IoeyBtYXhSZWRpcmVjdGlvbnMgfSldXG4gICAgdGhpc1trVXJsXSA9IHV0aWwucGFyc2VPcmlnaW4odXJsKVxuICAgIHRoaXNba0Nvbm5lY3Rvcl0gPSBjb25uZWN0XG4gICAgdGhpc1trU29ja2V0XSA9IG51bGxcbiAgICB0aGlzW2tQaXBlbGluaW5nXSA9IHBpcGVsaW5pbmcgIT0gbnVsbCA/IHBpcGVsaW5pbmcgOiAxXG4gICAgdGhpc1trTWF4SGVhZGVyc1NpemVdID0gbWF4SGVhZGVyU2l6ZSB8fCBodHRwLm1heEhlYWRlclNpemVcbiAgICB0aGlzW2tLZWVwQWxpdmVEZWZhdWx0VGltZW91dF0gPSBrZWVwQWxpdmVUaW1lb3V0ID09IG51bGwgPyA0ZTMgOiBrZWVwQWxpdmVUaW1lb3V0XG4gICAgdGhpc1trS2VlcEFsaXZlTWF4VGltZW91dF0gPSBrZWVwQWxpdmVNYXhUaW1lb3V0ID09IG51bGwgPyA2MDBlMyA6IGtlZXBBbGl2ZU1heFRpbWVvdXRcbiAgICB0aGlzW2tLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkXSA9IGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQgPT0gbnVsbCA/IDFlMyA6IGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGRcbiAgICB0aGlzW2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdID0gdGhpc1trS2VlcEFsaXZlRGVmYXVsdFRpbWVvdXRdXG4gICAgdGhpc1trU2VydmVyTmFtZV0gPSBudWxsXG4gICAgdGhpc1trTG9jYWxBZGRyZXNzXSA9IGxvY2FsQWRkcmVzcyAhPSBudWxsID8gbG9jYWxBZGRyZXNzIDogbnVsbFxuICAgIHRoaXNba1Jlc3VtaW5nXSA9IDAgLy8gMCwgaWRsZSwgMSwgc2NoZWR1bGVkLCAyIHJlc3VtaW5nXG4gICAgdGhpc1trTmVlZERyYWluXSA9IDAgLy8gMCwgaWRsZSwgMSwgc2NoZWR1bGVkLCAyIHJlc3VtaW5nXG4gICAgdGhpc1trSG9zdEhlYWRlcl0gPSBgaG9zdDogJHt0aGlzW2tVcmxdLmhvc3RuYW1lfSR7dGhpc1trVXJsXS5wb3J0ID8gYDoke3RoaXNba1VybF0ucG9ydH1gIDogJyd9XFxyXFxuYFxuICAgIHRoaXNba0JvZHlUaW1lb3V0XSA9IGJvZHlUaW1lb3V0ICE9IG51bGwgPyBib2R5VGltZW91dCA6IDMwMGUzXG4gICAgdGhpc1trSGVhZGVyc1RpbWVvdXRdID0gaGVhZGVyc1RpbWVvdXQgIT0gbnVsbCA/IGhlYWRlcnNUaW1lb3V0IDogMzAwZTNcbiAgICB0aGlzW2tTdHJpY3RDb250ZW50TGVuZ3RoXSA9IHN0cmljdENvbnRlbnRMZW5ndGggPT0gbnVsbCA/IHRydWUgOiBzdHJpY3RDb250ZW50TGVuZ3RoXG4gICAgdGhpc1trTWF4UmVkaXJlY3Rpb25zXSA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXNba01heFJlcXVlc3RzXSA9IG1heFJlcXVlc3RzUGVyQ2xpZW50XG4gICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0gPSBudWxsXG4gICAgdGhpc1trTWF4UmVzcG9uc2VTaXplXSA9IG1heFJlc3BvbnNlU2l6ZSA+IC0xID8gbWF4UmVzcG9uc2VTaXplIDogLTFcbiAgICB0aGlzW2tIVFRQQ29ublZlcnNpb25dID0gJ2gxJ1xuXG4gICAgLy8gSFRUUC8yXG4gICAgdGhpc1trSFRUUDJTZXNzaW9uXSA9IG51bGxcbiAgICB0aGlzW2tIVFRQMlNlc3Npb25TdGF0ZV0gPSAhYWxsb3dIMlxuICAgICAgPyBudWxsXG4gICAgICA6IHtcbiAgICAgICAgLy8gc3RyZWFtczogbnVsbCwgLy8gRml4ZWQgcXVldWUgb2Ygc3RyZWFtcyAtIEZvciBmdXR1cmUgc3VwcG9ydCBvZiBgcHVzaGBcbiAgICAgICAgICBvcGVuU3RyZWFtczogMCwgLy8gS2VlcCB0cmFjayBvZiB0aGVtIHRvIGRlY2lkZSB3ZXRoZXIgb3Igbm90IHVucmVmIHRoZSBzZXNzaW9uXG4gICAgICAgICAgbWF4Q29uY3VycmVudFN0cmVhbXM6IG1heENvbmN1cnJlbnRTdHJlYW1zICE9IG51bGwgPyBtYXhDb25jdXJyZW50U3RyZWFtcyA6IDEwMCAvLyBNYXggcGVlckNvbmN1cnJlbnRTdHJlYW1zIGZvciBhIE5vZGUgaDIgc2VydmVyXG4gICAgICAgIH1cbiAgICB0aGlzW2tIb3N0XSA9IGAke3RoaXNba1VybF0uaG9zdG5hbWV9JHt0aGlzW2tVcmxdLnBvcnQgPyBgOiR7dGhpc1trVXJsXS5wb3J0fWAgOiAnJ31gXG5cbiAgICAvLyBrUXVldWUgaXMgYnVpbHQgdXAgb2YgMyBzZWN0aW9ucyBzZXBhcmF0ZWQgYnlcbiAgICAvLyB0aGUga1J1bm5pbmdJZHggYW5kIGtQZW5kaW5nSWR4IGluZGljZXMuXG4gICAgLy8gfCAgIGNvbXBsZXRlICAgfCAgIHJ1bm5pbmcgICB8ICAgcGVuZGluZyAgIHxcbiAgICAvLyAgICAgICAgICAgICAgICBeIGtSdW5uaW5nSWR4IF4ga1BlbmRpbmdJZHggXiBrUXVldWUubGVuZ3RoXG4gICAgLy8ga1J1bm5pbmdJZHggcG9pbnRzIHRvIHRoZSBmaXJzdCBydW5uaW5nIGVsZW1lbnQuXG4gICAgLy8ga1BlbmRpbmdJZHggcG9pbnRzIHRvIHRoZSBmaXJzdCBwZW5kaW5nIGVsZW1lbnQuXG4gICAgLy8gVGhpcyBpbXBsZW1lbnRzIGEgZmFzdCBxdWV1ZSB3aXRoIGFuIGFtb3J0aXplZFxuICAgIC8vIHRpbWUgb2YgTygxKS5cblxuICAgIHRoaXNba1F1ZXVlXSA9IFtdXG4gICAgdGhpc1trUnVubmluZ0lkeF0gPSAwXG4gICAgdGhpc1trUGVuZGluZ0lkeF0gPSAwXG4gIH1cblxuICBnZXQgcGlwZWxpbmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1BpcGVsaW5pbmddXG4gIH1cblxuICBzZXQgcGlwZWxpbmluZyAodmFsdWUpIHtcbiAgICB0aGlzW2tQaXBlbGluaW5nXSA9IHZhbHVlXG4gICAgcmVzdW1lKHRoaXMsIHRydWUpXG4gIH1cblxuICBnZXQgW2tQZW5kaW5nXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1F1ZXVlXS5sZW5ndGggLSB0aGlzW2tQZW5kaW5nSWR4XVxuICB9XG5cbiAgZ2V0IFtrUnVubmluZ10gKCkge1xuICAgIHJldHVybiB0aGlzW2tQZW5kaW5nSWR4XSAtIHRoaXNba1J1bm5pbmdJZHhdXG4gIH1cblxuICBnZXQgW2tTaXplXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1F1ZXVlXS5sZW5ndGggLSB0aGlzW2tSdW5uaW5nSWR4XVxuICB9XG5cbiAgZ2V0IFtrQ29ubmVjdGVkXSAoKSB7XG4gICAgcmV0dXJuICEhdGhpc1trU29ja2V0XSAmJiAhdGhpc1trQ29ubmVjdGluZ10gJiYgIXRoaXNba1NvY2tldF0uZGVzdHJveWVkXG4gIH1cblxuICBnZXQgW2tCdXN5XSAoKSB7XG4gICAgY29uc3Qgc29ja2V0ID0gdGhpc1trU29ja2V0XVxuICAgIHJldHVybiAoXG4gICAgICAoc29ja2V0ICYmIChzb2NrZXRba1Jlc2V0XSB8fCBzb2NrZXRba1dyaXRpbmddIHx8IHNvY2tldFtrQmxvY2tpbmddKSkgfHxcbiAgICAgICh0aGlzW2tTaXplXSA+PSAodGhpc1trUGlwZWxpbmluZ10gfHwgMSkpIHx8XG4gICAgICB0aGlzW2tQZW5kaW5nXSA+IDBcbiAgICApXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmU6IG9ubHkgdXNlZCBmb3IgdGVzdCAqL1xuICBba0Nvbm5lY3RdIChjYikge1xuICAgIGNvbm5lY3QodGhpcylcbiAgICB0aGlzLm9uY2UoJ2Nvbm5lY3QnLCBjYilcbiAgfVxuXG4gIFtrRGlzcGF0Y2hdIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgY29uc3Qgb3JpZ2luID0gb3B0cy5vcmlnaW4gfHwgdGhpc1trVXJsXS5vcmlnaW5cblxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzW2tIVFRQQ29ublZlcnNpb25dID09PSAnaDInXG4gICAgICA/IFJlcXVlc3Rba0hUVFAyQnVpbGRSZXF1ZXN0XShvcmlnaW4sIG9wdHMsIGhhbmRsZXIpXG4gICAgICA6IFJlcXVlc3Rba0hUVFAxQnVpbGRSZXF1ZXN0XShvcmlnaW4sIG9wdHMsIGhhbmRsZXIpXG5cbiAgICB0aGlzW2tRdWV1ZV0ucHVzaChyZXF1ZXN0KVxuICAgIGlmICh0aGlzW2tSZXN1bWluZ10pIHtcbiAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgfSBlbHNlIGlmICh1dGlsLmJvZHlMZW5ndGgocmVxdWVzdC5ib2R5KSA9PSBudWxsICYmIHV0aWwuaXNJdGVyYWJsZShyZXF1ZXN0LmJvZHkpKSB7XG4gICAgICAvLyBXYWl0IGEgdGljayBpbiBjYXNlIHN0cmVhbS9pdGVyYXRvciBpcyBlbmRlZCBpbiB0aGUgc2FtZSB0aWNrLlxuICAgICAgdGhpc1trUmVzdW1pbmddID0gMVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhyZXN1bWUsIHRoaXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VtZSh0aGlzLCB0cnVlKVxuICAgIH1cblxuICAgIGlmICh0aGlzW2tSZXN1bWluZ10gJiYgdGhpc1trTmVlZERyYWluXSAhPT0gMiAmJiB0aGlzW2tCdXN5XSkge1xuICAgICAgdGhpc1trTmVlZERyYWluXSA9IDJcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1trTmVlZERyYWluXSA8IDJcbiAgfVxuXG4gIGFzeW5jIFtrQ2xvc2VdICgpIHtcbiAgICAvLyBUT0RPOiBmb3IgSDIgd2UgbmVlZCB0byBncmFjZWZ1bGx5IGZsdXNoIHRoZSByZW1haW5pbmcgZW5xdWV1ZWRcbiAgICAvLyByZXF1ZXN0IGFuZCBjbG9zZSBlYWNoIHN0cmVhbS5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICghdGhpc1trU2l6ZV0pIHtcbiAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0gPSByZXNvbHZlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIFtrRGVzdHJveV0gKGVycikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdHMgPSB0aGlzW2tRdWV1ZV0uc3BsaWNlKHRoaXNba1BlbmRpbmdJZHhdKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdHNbaV1cbiAgICAgICAgZXJyb3JSZXF1ZXN0KHRoaXMsIHJlcXVlc3QsIGVycilcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzW2tDbG9zZWRSZXNvbHZlXSkge1xuICAgICAgICAgIC8vIFRPRE8gKGZpeCk6IFNob3VsZCB3ZSBlcnJvciBoZXJlIHdpdGggQ2xpZW50RGVzdHJveWVkRXJyb3I/XG4gICAgICAgICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0oKVxuICAgICAgICAgIHRoaXNba0Nsb3NlZFJlc29sdmVdID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpc1trSFRUUDJTZXNzaW9uXSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuZGVzdHJveSh0aGlzW2tIVFRQMlNlc3Npb25dLCBlcnIpXG4gICAgICAgIHRoaXNba0hUVFAyU2Vzc2lvbl0gPSBudWxsXG4gICAgICAgIHRoaXNba0hUVFAyU2Vzc2lvblN0YXRlXSA9IG51bGxcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzW2tTb2NrZXRdKSB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXRpbC5kZXN0cm95KHRoaXNba1NvY2tldF0ub24oJ2Nsb3NlJywgY2FsbGJhY2spLCBlcnIpXG4gICAgICB9XG5cbiAgICAgIHJlc3VtZSh0aGlzKVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gb25IdHRwMlNlc3Npb25FcnJvciAoZXJyKSB7XG4gIGFzc2VydChlcnIuY29kZSAhPT0gJ0VSUl9UTFNfQ0VSVF9BTFROQU1FX0lOVkFMSUQnKVxuXG4gIHRoaXNba1NvY2tldF1ba0Vycm9yXSA9IGVyclxuXG4gIG9uRXJyb3IodGhpc1trQ2xpZW50XSwgZXJyKVxufVxuXG5mdW5jdGlvbiBvbkh0dHAyRnJhbWVFcnJvciAodHlwZSwgY29kZSwgaWQpIHtcbiAgY29uc3QgZXJyID0gbmV3IEluZm9ybWF0aW9uYWxFcnJvcihgSFRUUC8yOiBcImZyYW1lRXJyb3JcIiByZWNlaXZlZCAtIHR5cGUgJHt0eXBlfSwgY29kZSAke2NvZGV9YClcblxuICBpZiAoaWQgPT09IDApIHtcbiAgICB0aGlzW2tTb2NrZXRdW2tFcnJvcl0gPSBlcnJcbiAgICBvbkVycm9yKHRoaXNba0NsaWVudF0sIGVycilcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkh0dHAyU2Vzc2lvbkVuZCAoKSB7XG4gIHV0aWwuZGVzdHJveSh0aGlzLCBuZXcgU29ja2V0RXJyb3IoJ290aGVyIHNpZGUgY2xvc2VkJykpXG4gIHV0aWwuZGVzdHJveSh0aGlzW2tTb2NrZXRdLCBuZXcgU29ja2V0RXJyb3IoJ290aGVyIHNpZGUgY2xvc2VkJykpXG59XG5cbmZ1bmN0aW9uIG9uSFRUUDJHb0F3YXkgKGNvZGUpIHtcbiAgY29uc3QgY2xpZW50ID0gdGhpc1trQ2xpZW50XVxuICBjb25zdCBlcnIgPSBuZXcgSW5mb3JtYXRpb25hbEVycm9yKGBIVFRQLzI6IFwiR09BV0FZXCIgZnJhbWUgcmVjZWl2ZWQgd2l0aCBjb2RlICR7Y29kZX1gKVxuICBjbGllbnRba1NvY2tldF0gPSBudWxsXG4gIGNsaWVudFtrSFRUUDJTZXNzaW9uXSA9IG51bGxcblxuICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgIGFzc2VydCh0aGlzW2tQZW5kaW5nXSA9PT0gMClcblxuICAgIC8vIEZhaWwgZW50aXJlIHF1ZXVlLlxuICAgIGNvbnN0IHJlcXVlc3RzID0gY2xpZW50W2tRdWV1ZV0uc3BsaWNlKGNsaWVudFtrUnVubmluZ0lkeF0pXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RzW2ldXG4gICAgICBlcnJvclJlcXVlc3QodGhpcywgcmVxdWVzdCwgZXJyKVxuICAgIH1cbiAgfSBlbHNlIGlmIChjbGllbnRba1J1bm5pbmddID4gMCkge1xuICAgIC8vIEZhaWwgaGVhZCBvZiBwaXBlbGluZS5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdKytdID0gbnVsbFxuXG4gICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICB9XG5cbiAgY2xpZW50W2tQZW5kaW5nSWR4XSA9IGNsaWVudFtrUnVubmluZ0lkeF1cblxuICBhc3NlcnQoY2xpZW50W2tSdW5uaW5nXSA9PT0gMClcblxuICBjbGllbnQuZW1pdCgnZGlzY29ubmVjdCcsXG4gICAgY2xpZW50W2tVcmxdLFxuICAgIFtjbGllbnRdLFxuICAgIGVyclxuICApXG5cbiAgcmVzdW1lKGNsaWVudClcbn1cblxuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9sbGh0dHAvY29uc3RhbnRzJylcbmNvbnN0IGNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSByZXF1aXJlKCcuL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3InKVxuY29uc3QgRU1QVFlfQlVGID0gQnVmZmVyLmFsbG9jKDApXG5cbmFzeW5jIGZ1bmN0aW9uIGxhenlsbGh0dHAgKCkge1xuICBjb25zdCBsbGh0dHBXYXNtRGF0YSA9IHByb2Nlc3MuZW52LkpFU1RfV09SS0VSX0lEID8gcmVxdWlyZSgnLi9sbGh0dHAvbGxodHRwLXdhc20uanMnKSA6IHVuZGVmaW5lZFxuXG4gIGxldCBtb2RcbiAgdHJ5IHtcbiAgICBtb2QgPSBhd2FpdCBXZWJBc3NlbWJseS5jb21waWxlKEJ1ZmZlci5mcm9tKHJlcXVpcmUoJy4vbGxodHRwL2xsaHR0cF9zaW1kLXdhc20uanMnKSwgJ2Jhc2U2NCcpKVxuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgIC8vIFdlIGNvdWxkIGNoZWNrIGlmIHRoZSBlcnJvciB3YXMgY2F1c2VkIGJ5IHRoZSBzaW1kIG9wdGlvbiBub3RcbiAgICAvLyBiZWluZyBlbmFibGVkLCBidXQgdGhlIG9jY3VycmluZyBvZiB0aGlzIG90aGVyIGVycm9yXG4gICAgLy8gKiBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vaXNzdWVzLzExNDk1XG4gICAgLy8gZ290IG1lIHRvIHJlbW92ZSB0aGF0IGNoZWNrIHRvIGF2b2lkIGJyZWFraW5nIE5vZGUgMTIuXG4gICAgbW9kID0gYXdhaXQgV2ViQXNzZW1ibHkuY29tcGlsZShCdWZmZXIuZnJvbShsbGh0dHBXYXNtRGF0YSB8fCByZXF1aXJlKCcuL2xsaHR0cC9sbGh0dHAtd2FzbS5qcycpLCAnYmFzZTY0JykpXG4gIH1cblxuICByZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUobW9kLCB7XG4gICAgZW52OiB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cblxuICAgICAgd2FzbV9vbl91cmw6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHJldHVybiAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9zdGF0dXM6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhdCAtIGN1cnJlbnRCdWZmZXJQdHIgKyBjdXJyZW50QnVmZmVyUmVmLmJ5dGVPZmZzZXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25TdGF0dXMobmV3IEZhc3RCdWZmZXIoY3VycmVudEJ1ZmZlclJlZi5idWZmZXIsIHN0YXJ0LCBsZW4pKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9tZXNzYWdlX2JlZ2luOiAocCkgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VycmVudFBhcnNlci5wdHIsIHApXG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uTWVzc2FnZUJlZ2luKCkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25faGVhZGVyX2ZpZWxkOiAocCwgYXQsIGxlbikgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VycmVudFBhcnNlci5wdHIsIHApXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYXQgLSBjdXJyZW50QnVmZmVyUHRyICsgY3VycmVudEJ1ZmZlclJlZi5ieXRlT2Zmc2V0XG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uSGVhZGVyRmllbGQobmV3IEZhc3RCdWZmZXIoY3VycmVudEJ1ZmZlclJlZi5idWZmZXIsIHN0YXJ0LCBsZW4pKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9oZWFkZXJfdmFsdWU6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhdCAtIGN1cnJlbnRCdWZmZXJQdHIgKyBjdXJyZW50QnVmZmVyUmVmLmJ5dGVPZmZzZXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25IZWFkZXJWYWx1ZShuZXcgRmFzdEJ1ZmZlcihjdXJyZW50QnVmZmVyUmVmLmJ1ZmZlciwgc3RhcnQsIGxlbikpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX2hlYWRlcnNfY29tcGxldGU6IChwLCBzdGF0dXNDb2RlLCB1cGdyYWRlLCBzaG91bGRLZWVwQWxpdmUpID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN1cnJlbnRQYXJzZXIucHRyLCBwKVxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbkhlYWRlcnNDb21wbGV0ZShzdGF0dXNDb2RlLCBCb29sZWFuKHVwZ3JhZGUpLCBCb29sZWFuKHNob3VsZEtlZXBBbGl2ZSkpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX2JvZHk6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhdCAtIGN1cnJlbnRCdWZmZXJQdHIgKyBjdXJyZW50QnVmZmVyUmVmLmJ5dGVPZmZzZXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25Cb2R5KG5ldyBGYXN0QnVmZmVyKGN1cnJlbnRCdWZmZXJSZWYuYnVmZmVyLCBzdGFydCwgbGVuKSkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZTogKHApID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN1cnJlbnRQYXJzZXIucHRyLCBwKVxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbk1lc3NhZ2VDb21wbGV0ZSgpIHx8IDBcbiAgICAgIH1cblxuICAgICAgLyogZXNsaW50LWVuYWJsZSBjYW1lbGNhc2UgKi9cbiAgICB9XG4gIH0pXG59XG5cbmxldCBsbGh0dHBJbnN0YW5jZSA9IG51bGxcbmxldCBsbGh0dHBQcm9taXNlID0gbGF6eWxsaHR0cCgpXG5sbGh0dHBQcm9taXNlLmNhdGNoKClcblxubGV0IGN1cnJlbnRQYXJzZXIgPSBudWxsXG5sZXQgY3VycmVudEJ1ZmZlclJlZiA9IG51bGxcbmxldCBjdXJyZW50QnVmZmVyU2l6ZSA9IDBcbmxldCBjdXJyZW50QnVmZmVyUHRyID0gbnVsbFxuXG5jb25zdCBUSU1FT1VUX0hFQURFUlMgPSAxXG5jb25zdCBUSU1FT1VUX0JPRFkgPSAyXG5jb25zdCBUSU1FT1VUX0lETEUgPSAzXG5cbmNsYXNzIFBhcnNlciB7XG4gIGNvbnN0cnVjdG9yIChjbGllbnQsIHNvY2tldCwgeyBleHBvcnRzIH0pIHtcbiAgICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGNsaWVudFtrTWF4SGVhZGVyc1NpemVdKSAmJiBjbGllbnRba01heEhlYWRlcnNTaXplXSA+IDApXG5cbiAgICB0aGlzLmxsaHR0cCA9IGV4cG9ydHNcbiAgICB0aGlzLnB0ciA9IHRoaXMubGxodHRwLmxsaHR0cF9hbGxvYyhjb25zdGFudHMuVFlQRS5SRVNQT05TRSlcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy50aW1lb3V0ID0gbnVsbFxuICAgIHRoaXMudGltZW91dFZhbHVlID0gbnVsbFxuICAgIHRoaXMudGltZW91dFR5cGUgPSBudWxsXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVsbFxuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICcnXG4gICAgdGhpcy51cGdyYWRlID0gZmFsc2VcbiAgICB0aGlzLmhlYWRlcnMgPSBbXVxuICAgIHRoaXMuaGVhZGVyc1NpemUgPSAwXG4gICAgdGhpcy5oZWFkZXJzTWF4U2l6ZSA9IGNsaWVudFtrTWF4SGVhZGVyc1NpemVdXG4gICAgdGhpcy5zaG91bGRLZWVwQWxpdmUgPSBmYWxzZVxuICAgIHRoaXMucGF1c2VkID0gZmFsc2VcbiAgICB0aGlzLnJlc3VtZSA9IHRoaXMucmVzdW1lLmJpbmQodGhpcylcblxuICAgIHRoaXMuYnl0ZXNSZWFkID0gMFxuXG4gICAgdGhpcy5rZWVwQWxpdmUgPSAnJ1xuICAgIHRoaXMuY29udGVudExlbmd0aCA9ICcnXG4gICAgdGhpcy5jb25uZWN0aW9uID0gJydcbiAgICB0aGlzLm1heFJlc3BvbnNlU2l6ZSA9IGNsaWVudFtrTWF4UmVzcG9uc2VTaXplXVxuICB9XG5cbiAgc2V0VGltZW91dCAodmFsdWUsIHR5cGUpIHtcbiAgICB0aGlzLnRpbWVvdXRUeXBlID0gdHlwZVxuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy50aW1lb3V0VmFsdWUpIHtcbiAgICAgIHRpbWVycy5jbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KVxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVycy5zZXRUaW1lb3V0KG9uUGFyc2VyVGltZW91dCwgdmFsdWUsIHRoaXMpXG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICAgIGlmICh0aGlzLnRpbWVvdXQudW5yZWYpIHtcbiAgICAgICAgICB0aGlzLnRpbWVvdXQudW5yZWYoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSBudWxsXG4gICAgICB9XG4gICAgICB0aGlzLnRpbWVvdXRWYWx1ZSA9IHZhbHVlXG4gICAgfSBlbHNlIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICBpZiAodGhpcy50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0LnJlZnJlc2goKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlc3VtZSAoKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0LmRlc3Ryb3llZCB8fCAhdGhpcy5wYXVzZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG5cbiAgICB0aGlzLmxsaHR0cC5sbGh0dHBfcmVzdW1lKHRoaXMucHRyKVxuXG4gICAgYXNzZXJ0KHRoaXMudGltZW91dFR5cGUgPT09IFRJTUVPVVRfQk9EWSlcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHRoaXMudGltZW91dC5yZWZyZXNoKSB7XG4gICAgICAgIHRoaXMudGltZW91dC5yZWZyZXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlXG4gICAgdGhpcy5leGVjdXRlKHRoaXMuc29ja2V0LnJlYWQoKSB8fCBFTVBUWV9CVUYpIC8vIEZsdXNoIHBhcnNlci5cbiAgICB0aGlzLnJlYWRNb3JlKClcbiAgfVxuXG4gIHJlYWRNb3JlICgpIHtcbiAgICB3aGlsZSAoIXRoaXMucGF1c2VkICYmIHRoaXMucHRyKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuc29ja2V0LnJlYWQoKVxuICAgICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICB0aGlzLmV4ZWN1dGUoY2h1bmspXG4gICAgfVxuICB9XG5cbiAgZXhlY3V0ZSAoZGF0YSkge1xuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG4gICAgYXNzZXJ0KCF0aGlzLnBhdXNlZClcblxuICAgIGNvbnN0IHsgc29ja2V0LCBsbGh0dHAgfSA9IHRoaXNcblxuICAgIGlmIChkYXRhLmxlbmd0aCA+IGN1cnJlbnRCdWZmZXJTaXplKSB7XG4gICAgICBpZiAoY3VycmVudEJ1ZmZlclB0cikge1xuICAgICAgICBsbGh0dHAuZnJlZShjdXJyZW50QnVmZmVyUHRyKVxuICAgICAgfVxuICAgICAgY3VycmVudEJ1ZmZlclNpemUgPSBNYXRoLmNlaWwoZGF0YS5sZW5ndGggLyA0MDk2KSAqIDQwOTZcbiAgICAgIGN1cnJlbnRCdWZmZXJQdHIgPSBsbGh0dHAubWFsbG9jKGN1cnJlbnRCdWZmZXJTaXplKVxuICAgIH1cblxuICAgIG5ldyBVaW50OEFycmF5KGxsaHR0cC5tZW1vcnkuYnVmZmVyLCBjdXJyZW50QnVmZmVyUHRyLCBjdXJyZW50QnVmZmVyU2l6ZSkuc2V0KGRhdGEpXG5cbiAgICAvLyBDYWxsIGBleGVjdXRlYCBvbiB0aGUgd2FzbSBwYXJzZXIuXG4gICAgLy8gV2UgcGFzcyB0aGUgYGxsaHR0cF9wYXJzZXJgIHBvaW50ZXIgYWRkcmVzcywgdGhlIHBvaW50ZXIgYWRkcmVzcyBvZiBidWZmZXIgdmlldyBkYXRhLFxuICAgIC8vIGFuZCBmaW5hbGx5IHRoZSBsZW5ndGggb2YgYnl0ZXMgdG8gcGFyc2UuXG4gICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBlcnJvciBjb2RlIG9yIGBjb25zdGFudHMuRVJST1IuT0tgLlxuICAgIHRyeSB7XG4gICAgICBsZXQgcmV0XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGN1cnJlbnRCdWZmZXJSZWYgPSBkYXRhXG4gICAgICAgIGN1cnJlbnRQYXJzZXIgPSB0aGlzXG4gICAgICAgIHJldCA9IGxsaHR0cC5sbGh0dHBfZXhlY3V0ZSh0aGlzLnB0ciwgY3VycmVudEJ1ZmZlclB0ciwgZGF0YS5sZW5ndGgpXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWNhdGNoICovXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGN1cnJlbnRQYXJzZXIgPSBudWxsXG4gICAgICAgIGN1cnJlbnRCdWZmZXJSZWYgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9mZnNldCA9IGxsaHR0cC5sbGh0dHBfZ2V0X2Vycm9yX3Bvcyh0aGlzLnB0cikgLSBjdXJyZW50QnVmZmVyUHRyXG5cbiAgICAgIGlmIChyZXQgPT09IGNvbnN0YW50cy5FUlJPUi5QQVVTRURfVVBHUkFERSkge1xuICAgICAgICB0aGlzLm9uVXBncmFkZShkYXRhLnNsaWNlKG9mZnNldCkpXG4gICAgICB9IGVsc2UgaWYgKHJldCA9PT0gY29uc3RhbnRzLkVSUk9SLlBBVVNFRCkge1xuICAgICAgICB0aGlzLnBhdXNlZCA9IHRydWVcbiAgICAgICAgc29ja2V0LnVuc2hpZnQoZGF0YS5zbGljZShvZmZzZXQpKVxuICAgICAgfSBlbHNlIGlmIChyZXQgIT09IGNvbnN0YW50cy5FUlJPUi5PSykge1xuICAgICAgICBjb25zdCBwdHIgPSBsbGh0dHAubGxodHRwX2dldF9lcnJvcl9yZWFzb24odGhpcy5wdHIpXG4gICAgICAgIGxldCBtZXNzYWdlID0gJydcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2U6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgICAgICBpZiAocHRyKSB7XG4gICAgICAgICAgY29uc3QgbGVuID0gbmV3IFVpbnQ4QXJyYXkobGxodHRwLm1lbW9yeS5idWZmZXIsIHB0cikuaW5kZXhPZigwKVxuICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgJ1Jlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHRoZSBIVFRQLzEuMSBwcm90b2NvbCAoJyArXG4gICAgICAgICAgICBCdWZmZXIuZnJvbShsbGh0dHAubWVtb3J5LmJ1ZmZlciwgcHRyLCBsZW4pLnRvU3RyaW5nKCkgK1xuICAgICAgICAgICAgJyknXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEhUVFBQYXJzZXJFcnJvcihtZXNzYWdlLCBjb25zdGFudHMuRVJST1JbcmV0XSwgZGF0YS5zbGljZShvZmZzZXQpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgZXJyKVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3kgKCkge1xuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG5cbiAgICB0aGlzLmxsaHR0cC5sbGh0dHBfZnJlZSh0aGlzLnB0cilcbiAgICB0aGlzLnB0ciA9IG51bGxcblxuICAgIHRpbWVycy5jbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KVxuICAgIHRoaXMudGltZW91dCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXRWYWx1ZSA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXRUeXBlID0gbnVsbFxuXG4gICAgdGhpcy5wYXVzZWQgPSBmYWxzZVxuICB9XG5cbiAgb25TdGF0dXMgKGJ1Zikge1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9IGJ1Zi50b1N0cmluZygpXG4gIH1cblxuICBvbk1lc3NhZ2VCZWdpbiAoKSB7XG4gICAgY29uc3QgeyBzb2NrZXQsIGNsaWVudCB9ID0gdGhpc1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgfVxuXG4gIG9uSGVhZGVyRmllbGQgKGJ1Zikge1xuICAgIGNvbnN0IGxlbiA9IHRoaXMuaGVhZGVycy5sZW5ndGhcblxuICAgIGlmICgobGVuICYgMSkgPT09IDApIHtcbiAgICAgIHRoaXMuaGVhZGVycy5wdXNoKGJ1ZilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkZXJzW2xlbiAtIDFdID0gQnVmZmVyLmNvbmNhdChbdGhpcy5oZWFkZXJzW2xlbiAtIDFdLCBidWZdKVxuICAgIH1cblxuICAgIHRoaXMudHJhY2tIZWFkZXIoYnVmLmxlbmd0aClcbiAgfVxuXG4gIG9uSGVhZGVyVmFsdWUgKGJ1Zikge1xuICAgIGxldCBsZW4gPSB0aGlzLmhlYWRlcnMubGVuZ3RoXG5cbiAgICBpZiAoKGxlbiAmIDEpID09PSAxKSB7XG4gICAgICB0aGlzLmhlYWRlcnMucHVzaChidWYpXG4gICAgICBsZW4gKz0gMVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNbbGVuIC0gMV0gPSBCdWZmZXIuY29uY2F0KFt0aGlzLmhlYWRlcnNbbGVuIC0gMV0sIGJ1Zl0pXG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdGhpcy5oZWFkZXJzW2xlbiAtIDJdXG4gICAgaWYgKGtleS5sZW5ndGggPT09IDEwICYmIGtleS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdrZWVwLWFsaXZlJykge1xuICAgICAgdGhpcy5rZWVwQWxpdmUgKz0gYnVmLnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPT09IDEwICYmIGtleS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdjb25uZWN0aW9uJykge1xuICAgICAgdGhpcy5jb25uZWN0aW9uICs9IGJ1Zi50b1N0cmluZygpXG4gICAgfSBlbHNlIGlmIChrZXkubGVuZ3RoID09PSAxNCAmJiBrZXkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC1sZW5ndGgnKSB7XG4gICAgICB0aGlzLmNvbnRlbnRMZW5ndGggKz0gYnVmLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICB0aGlzLnRyYWNrSGVhZGVyKGJ1Zi5sZW5ndGgpXG4gIH1cblxuICB0cmFja0hlYWRlciAobGVuKSB7XG4gICAgdGhpcy5oZWFkZXJzU2l6ZSArPSBsZW5cbiAgICBpZiAodGhpcy5oZWFkZXJzU2l6ZSA+PSB0aGlzLmhlYWRlcnNNYXhTaXplKSB7XG4gICAgICB1dGlsLmRlc3Ryb3kodGhpcy5zb2NrZXQsIG5ldyBIZWFkZXJzT3ZlcmZsb3dFcnJvcigpKVxuICAgIH1cbiAgfVxuXG4gIG9uVXBncmFkZSAoaGVhZCkge1xuICAgIGNvbnN0IHsgdXBncmFkZSwgY2xpZW50LCBzb2NrZXQsIGhlYWRlcnMsIHN0YXR1c0NvZGUgfSA9IHRoaXNcblxuICAgIGFzc2VydCh1cGdyYWRlKVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgYXNzZXJ0KHJlcXVlc3QpXG5cbiAgICBhc3NlcnQoIXNvY2tldC5kZXN0cm95ZWQpXG4gICAgYXNzZXJ0KHNvY2tldCA9PT0gY2xpZW50W2tTb2NrZXRdKVxuICAgIGFzc2VydCghdGhpcy5wYXVzZWQpXG4gICAgYXNzZXJ0KHJlcXVlc3QudXBncmFkZSB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0NPTk5FQ1QnKVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVsbFxuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICcnXG4gICAgdGhpcy5zaG91bGRLZWVwQWxpdmUgPSBudWxsXG5cbiAgICBhc3NlcnQodGhpcy5oZWFkZXJzLmxlbmd0aCAlIDIgPT09IDApXG4gICAgdGhpcy5oZWFkZXJzID0gW11cbiAgICB0aGlzLmhlYWRlcnNTaXplID0gMFxuXG4gICAgc29ja2V0LnVuc2hpZnQoaGVhZClcblxuICAgIHNvY2tldFtrUGFyc2VyXS5kZXN0cm95KClcbiAgICBzb2NrZXRba1BhcnNlcl0gPSBudWxsXG5cbiAgICBzb2NrZXRba0NsaWVudF0gPSBudWxsXG4gICAgc29ja2V0W2tFcnJvcl0gPSBudWxsXG4gICAgc29ja2V0XG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25Tb2NrZXRFcnJvcilcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCBvblNvY2tldFJlYWRhYmxlKVxuICAgICAgLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvblNvY2tldEVuZClcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvblNvY2tldENsb3NlKVxuXG4gICAgY2xpZW50W2tTb2NrZXRdID0gbnVsbFxuICAgIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF0rK10gPSBudWxsXG4gICAgY2xpZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLCBjbGllbnRba1VybF0sIFtjbGllbnRdLCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCd1cGdyYWRlJykpXG5cbiAgICB0cnkge1xuICAgICAgcmVxdWVzdC5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgZXJyKVxuICAgIH1cblxuICAgIHJlc3VtZShjbGllbnQpXG4gIH1cblxuICBvbkhlYWRlcnNDb21wbGV0ZSAoc3RhdHVzQ29kZSwgdXBncmFkZSwgc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgY29uc3QgeyBjbGllbnQsIHNvY2tldCwgaGVhZGVycywgc3RhdHVzVGV4dCB9ID0gdGhpc1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkaWZmaWN1bHQgdG8gbWFrZSBhIHRlc3QgY2FzZSBmb3IgKi9cbiAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGFzc2VydCghdGhpcy51cGdyYWRlKVxuICAgIGFzc2VydCh0aGlzLnN0YXR1c0NvZGUgPCAyMDApXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gMTAwKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgU29ja2V0RXJyb3IoJ2JhZCByZXNwb25zZScsIHV0aWwuZ2V0U29ja2V0SW5mbyhzb2NrZXQpKSlcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIC8qIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHNlcnZlciBpcyBtaXNiZWhhdmluZyAqL1xuICAgIGlmICh1cGdyYWRlICYmICFyZXF1ZXN0LnVwZ3JhZGUpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBTb2NrZXRFcnJvcignYmFkIHVwZ3JhZGUnLCB1dGlsLmdldFNvY2tldEluZm8oc29ja2V0KSkpXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGhpcy50aW1lb3V0VHlwZSwgVElNRU9VVF9IRUFERVJTKVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICAgIHRoaXMuc2hvdWxkS2VlcEFsaXZlID0gKFxuICAgICAgc2hvdWxkS2VlcEFsaXZlIHx8XG4gICAgICAvLyBPdmVycmlkZSBsbGh0dHAgdmFsdWUgd2hpY2ggZG9lcyBub3QgYWxsb3cga2VlcEFsaXZlIGZvciBIRUFELlxuICAgICAgKHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcgJiYgIXNvY2tldFtrUmVzZXRdICYmIHRoaXMuY29ubmVjdGlvbi50b0xvd2VyQ2FzZSgpID09PSAna2VlcC1hbGl2ZScpXG4gICAgKVxuXG4gICAgaWYgKHRoaXMuc3RhdHVzQ29kZSA+PSAyMDApIHtcbiAgICAgIGNvbnN0IGJvZHlUaW1lb3V0ID0gcmVxdWVzdC5ib2R5VGltZW91dCAhPSBudWxsXG4gICAgICAgID8gcmVxdWVzdC5ib2R5VGltZW91dFxuICAgICAgICA6IGNsaWVudFtrQm9keVRpbWVvdXRdXG4gICAgICB0aGlzLnNldFRpbWVvdXQoYm9keVRpbWVvdXQsIFRJTUVPVVRfQk9EWSlcbiAgICB9IGVsc2UgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgIGlmICh0aGlzLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAgIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAxKVxuICAgICAgdGhpcy51cGdyYWRlID0gdHJ1ZVxuICAgICAgcmV0dXJuIDJcbiAgICB9XG5cbiAgICBpZiAodXBncmFkZSkge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDEpXG4gICAgICB0aGlzLnVwZ3JhZGUgPSB0cnVlXG4gICAgICByZXR1cm4gMlxuICAgIH1cblxuICAgIGFzc2VydCh0aGlzLmhlYWRlcnMubGVuZ3RoICUgMiA9PT0gMClcbiAgICB0aGlzLmhlYWRlcnMgPSBbXVxuICAgIHRoaXMuaGVhZGVyc1NpemUgPSAwXG5cbiAgICBpZiAodGhpcy5zaG91bGRLZWVwQWxpdmUgJiYgY2xpZW50W2tQaXBlbGluaW5nXSkge1xuICAgICAgY29uc3Qga2VlcEFsaXZlVGltZW91dCA9IHRoaXMua2VlcEFsaXZlID8gdXRpbC5wYXJzZUtlZXBBbGl2ZVRpbWVvdXQodGhpcy5rZWVwQWxpdmUpIDogbnVsbFxuXG4gICAgICBpZiAoa2VlcEFsaXZlVGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBNYXRoLm1pbihcbiAgICAgICAgICBrZWVwQWxpdmVUaW1lb3V0IC0gY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkXSxcbiAgICAgICAgICBjbGllbnRba0tlZXBBbGl2ZU1heFRpbWVvdXRdXG4gICAgICAgIClcbiAgICAgICAgaWYgKHRpbWVvdXQgPD0gMCkge1xuICAgICAgICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsaWVudFtrS2VlcEFsaXZlVGltZW91dFZhbHVlXSA9IHRpbWVvdXRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdID0gY2xpZW50W2tLZWVwQWxpdmVEZWZhdWx0VGltZW91dF1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RvcCBtb3JlIHJlcXVlc3RzIGZyb20gYmVpbmcgZGlzcGF0Y2hlZC5cbiAgICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHBhdXNlID0gcmVxdWVzdC5vbkhlYWRlcnMoc3RhdHVzQ29kZSwgaGVhZGVycywgdGhpcy5yZXN1bWUsIHN0YXR1c1RleHQpID09PSBmYWxzZVxuXG4gICAgaWYgKHJlcXVlc3QuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfVxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIHJldHVybiAxXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldFtrQmxvY2tpbmddKSB7XG4gICAgICBzb2NrZXRba0Jsb2NraW5nXSA9IGZhbHNlXG4gICAgICByZXN1bWUoY2xpZW50KVxuICAgIH1cblxuICAgIHJldHVybiBwYXVzZSA/IGNvbnN0YW50cy5FUlJPUi5QQVVTRUQgOiAwXG4gIH1cblxuICBvbkJvZHkgKGJ1Zikge1xuICAgIGNvbnN0IHsgY2xpZW50LCBzb2NrZXQsIHN0YXR1c0NvZGUsIG1heFJlc3BvbnNlU2l6ZSB9ID0gdGhpc1xuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgIGFzc2VydChyZXF1ZXN0KVxuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRoaXMudGltZW91dFR5cGUsIFRJTUVPVVRfQk9EWSlcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHRoaXMudGltZW91dC5yZWZyZXNoKSB7XG4gICAgICAgIHRoaXMudGltZW91dC5yZWZyZXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3NlcnQoc3RhdHVzQ29kZSA+PSAyMDApXG5cbiAgICBpZiAobWF4UmVzcG9uc2VTaXplID4gLTEgJiYgdGhpcy5ieXRlc1JlYWQgKyBidWYubGVuZ3RoID4gbWF4UmVzcG9uc2VTaXplKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgUmVzcG9uc2VFeGNlZWRlZE1heFNpemVFcnJvcigpKVxuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgdGhpcy5ieXRlc1JlYWQgKz0gYnVmLmxlbmd0aFxuXG4gICAgaWYgKHJlcXVlc3Qub25EYXRhKGJ1ZikgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gY29uc3RhbnRzLkVSUk9SLlBBVVNFRFxuICAgIH1cbiAgfVxuXG4gIG9uTWVzc2FnZUNvbXBsZXRlICgpIHtcbiAgICBjb25zdCB7IGNsaWVudCwgc29ja2V0LCBzdGF0dXNDb2RlLCB1cGdyYWRlLCBoZWFkZXJzLCBjb250ZW50TGVuZ3RoLCBieXRlc1JlYWQsIHNob3VsZEtlZXBBbGl2ZSB9ID0gdGhpc1xuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQgJiYgKCFzdGF0dXNDb2RlIHx8IHNob3VsZEtlZXBBbGl2ZSkpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGlmICh1cGdyYWRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBhc3NlcnQocmVxdWVzdClcblxuICAgIGFzc2VydChzdGF0dXNDb2RlID49IDEwMClcblxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IG51bGxcbiAgICB0aGlzLnN0YXR1c1RleHQgPSAnJ1xuICAgIHRoaXMuYnl0ZXNSZWFkID0gMFxuICAgIHRoaXMuY29udGVudExlbmd0aCA9ICcnXG4gICAgdGhpcy5rZWVwQWxpdmUgPSAnJ1xuICAgIHRoaXMuY29ubmVjdGlvbiA9ICcnXG5cbiAgICBhc3NlcnQodGhpcy5oZWFkZXJzLmxlbmd0aCAlIDIgPT09IDApXG4gICAgdGhpcy5oZWFkZXJzID0gW11cbiAgICB0aGlzLmhlYWRlcnNTaXplID0gMFxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBzaG91bGQgYmUgaGFuZGxlZCBieSBsbGh0dHA/ICovXG4gICAgaWYgKHJlcXVlc3QubWV0aG9kICE9PSAnSEVBRCcgJiYgY29udGVudExlbmd0aCAmJiBieXRlc1JlYWQgIT09IHBhcnNlSW50KGNvbnRlbnRMZW5ndGgsIDEwKSkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IFJlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIHJlcXVlc3Qub25Db21wbGV0ZShoZWFkZXJzKVxuXG4gICAgY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XSsrXSA9IG51bGxcblxuICAgIGlmIChzb2NrZXRba1dyaXRpbmddKSB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2xpZW50W2tSdW5uaW5nXSwgMClcbiAgICAgIC8vIFJlc3BvbnNlIGNvbXBsZXRlZCBiZWZvcmUgcmVxdWVzdC5cbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3Jlc2V0JykpXG4gICAgICByZXR1cm4gY29uc3RhbnRzLkVSUk9SLlBBVVNFRFxuICAgIH0gZWxzZSBpZiAoIXNob3VsZEtlZXBBbGl2ZSkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IEluZm9ybWF0aW9uYWxFcnJvcigncmVzZXQnKSlcbiAgICAgIHJldHVybiBjb25zdGFudHMuRVJST1IuUEFVU0VEXG4gICAgfSBlbHNlIGlmIChzb2NrZXRba1Jlc2V0XSAmJiBjbGllbnRba1J1bm5pbmddID09PSAwKSB7XG4gICAgICAvLyBEZXN0cm95IHNvY2tldCBvbmNlIGFsbCByZXF1ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgIC8vIFRoZSByZXF1ZXN0IGF0IHRoZSB0YWlsIG9mIHRoZSBwaXBlbGluZSBpcyB0aGUgb25lXG4gICAgICAvLyB0aGF0IHJlcXVlc3RlZCByZXNldCBhbmQgbm8gZnVydGhlciByZXF1ZXN0cyBzaG91bGRcbiAgICAgIC8vIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlbi5cbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3Jlc2V0JykpXG4gICAgICByZXR1cm4gY29uc3RhbnRzLkVSUk9SLlBBVVNFRFxuICAgIH0gZWxzZSBpZiAoY2xpZW50W2tQaXBlbGluaW5nXSA9PT0gMSkge1xuICAgICAgLy8gV2UgbXVzdCB3YWl0IGEgZnVsbCBldmVudCBsb29wIGN5Y2xlIHRvIHJldXNlIHRoaXMgc29ja2V0IHRvIG1ha2Ugc3VyZVxuICAgICAgLy8gdGhhdCBub24tc3BlYyBjb21wbGlhbnQgc2VydmVycyBhcmUgbm90IGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24gZXZlbiBpZiB0aGV5XG4gICAgICAvLyBzYWlkIHRoZXkgd29uJ3QuXG4gICAgICBzZXRJbW1lZGlhdGUocmVzdW1lLCBjbGllbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VtZShjbGllbnQpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uUGFyc2VyVGltZW91dCAocGFyc2VyKSB7XG4gIGNvbnN0IHsgc29ja2V0LCB0aW1lb3V0VHlwZSwgY2xpZW50IH0gPSBwYXJzZXJcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAodGltZW91dFR5cGUgPT09IFRJTUVPVVRfSEVBREVSUykge1xuICAgIGlmICghc29ja2V0W2tXcml0aW5nXSB8fCBzb2NrZXQud3JpdGFibGVOZWVkRHJhaW4gfHwgY2xpZW50W2tSdW5uaW5nXSA+IDEpIHtcbiAgICAgIGFzc2VydCghcGFyc2VyLnBhdXNlZCwgJ2Nhbm5vdCBiZSBwYXVzZWQgd2hpbGUgd2FpdGluZyBmb3IgaGVhZGVycycpXG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSGVhZGVyc1RpbWVvdXRFcnJvcigpKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9CT0RZKSB7XG4gICAgaWYgKCFwYXJzZXIucGF1c2VkKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgQm9keVRpbWVvdXRFcnJvcigpKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9JRExFKSB7XG4gICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDAgJiYgY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdKVxuICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3NvY2tldCBpZGxlIHRpbWVvdXQnKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBvblNvY2tldFJlYWRhYmxlICgpIHtcbiAgY29uc3QgeyBba1BhcnNlcl06IHBhcnNlciB9ID0gdGhpc1xuICBpZiAocGFyc2VyKSB7XG4gICAgcGFyc2VyLnJlYWRNb3JlKClcbiAgfVxufVxuXG5mdW5jdGlvbiBvblNvY2tldEVycm9yIChlcnIpIHtcbiAgY29uc3QgeyBba0NsaWVudF06IGNsaWVudCwgW2tQYXJzZXJdOiBwYXJzZXIgfSA9IHRoaXNcblxuICBhc3NlcnQoZXJyLmNvZGUgIT09ICdFUlJfVExTX0NFUlRfQUxUTkFNRV9JTlZBTElEJylcblxuICBpZiAoY2xpZW50W2tIVFRQQ29ublZlcnNpb25dICE9PSAnaDInKSB7XG4gICAgLy8gT24gTWFjIE9TLCB3ZSBnZXQgYW4gRUNPTk5SRVNFVCBldmVuIGlmIHRoZXJlIGlzIGEgZnVsbCBib2R5IHRvIGJlIGZvcndhcmRlZFxuICAgIC8vIHRvIHRoZSB1c2VyLlxuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VDT05OUkVTRVQnICYmIHBhcnNlci5zdGF0dXNDb2RlICYmICFwYXJzZXIuc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgICAvLyBXZSB0cmVhdCBhbGwgaW5jb21pbmcgZGF0YSBzbyBmb3IgYXMgYSB2YWxpZCByZXNwb25zZS5cbiAgICAgIHBhcnNlci5vbk1lc3NhZ2VDb21wbGV0ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICB0aGlzW2tFcnJvcl0gPSBlcnJcblxuICBvbkVycm9yKHRoaXNba0NsaWVudF0sIGVycilcbn1cblxuZnVuY3Rpb24gb25FcnJvciAoY2xpZW50LCBlcnIpIHtcbiAgaWYgKFxuICAgIGNsaWVudFtrUnVubmluZ10gPT09IDAgJiZcbiAgICBlcnIuY29kZSAhPT0gJ1VORF9FUlJfSU5GTycgJiZcbiAgICBlcnIuY29kZSAhPT0gJ1VORF9FUlJfU09DS0VUJ1xuICApIHtcbiAgICAvLyBFcnJvciBpcyBub3QgY2F1c2VkIGJ5IHJ1bm5pbmcgcmVxdWVzdCBhbmQgbm90IGEgcmVjb3ZlcmFibGVcbiAgICAvLyBzb2NrZXQgZXJyb3IuXG5cbiAgICBhc3NlcnQoY2xpZW50W2tQZW5kaW5nSWR4XSA9PT0gY2xpZW50W2tSdW5uaW5nSWR4XSlcblxuICAgIGNvbnN0IHJlcXVlc3RzID0gY2xpZW50W2tRdWV1ZV0uc3BsaWNlKGNsaWVudFtrUnVubmluZ0lkeF0pXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RzW2ldXG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gICAgfVxuICAgIGFzc2VydChjbGllbnRba1NpemVdID09PSAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0RW5kICgpIHtcbiAgY29uc3QgeyBba1BhcnNlcl06IHBhcnNlciwgW2tDbGllbnRdOiBjbGllbnQgfSA9IHRoaXNcblxuICBpZiAoY2xpZW50W2tIVFRQQ29ublZlcnNpb25dICE9PSAnaDInKSB7XG4gICAgaWYgKHBhcnNlci5zdGF0dXNDb2RlICYmICFwYXJzZXIuc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgICAvLyBXZSB0cmVhdCBhbGwgaW5jb21pbmcgZGF0YSBzbyBmYXIgYXMgYSB2YWxpZCByZXNwb25zZS5cbiAgICAgIHBhcnNlci5vbk1lc3NhZ2VDb21wbGV0ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICB1dGlsLmRlc3Ryb3kodGhpcywgbmV3IFNvY2tldEVycm9yKCdvdGhlciBzaWRlIGNsb3NlZCcsIHV0aWwuZ2V0U29ja2V0SW5mbyh0aGlzKSkpXG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0Q2xvc2UgKCkge1xuICBjb25zdCB7IFtrQ2xpZW50XTogY2xpZW50LCBba1BhcnNlcl06IHBhcnNlciB9ID0gdGhpc1xuXG4gIGlmIChjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gPT09ICdoMScgJiYgcGFyc2VyKSB7XG4gICAgaWYgKCF0aGlzW2tFcnJvcl0gJiYgcGFyc2VyLnN0YXR1c0NvZGUgJiYgIXBhcnNlci5zaG91bGRLZWVwQWxpdmUpIHtcbiAgICAgIC8vIFdlIHRyZWF0IGFsbCBpbmNvbWluZyBkYXRhIHNvIGZhciBhcyBhIHZhbGlkIHJlc3BvbnNlLlxuICAgICAgcGFyc2VyLm9uTWVzc2FnZUNvbXBsZXRlKClcbiAgICB9XG5cbiAgICB0aGlzW2tQYXJzZXJdLmRlc3Ryb3koKVxuICAgIHRoaXNba1BhcnNlcl0gPSBudWxsXG4gIH1cblxuICBjb25zdCBlcnIgPSB0aGlzW2tFcnJvcl0gfHwgbmV3IFNvY2tldEVycm9yKCdjbG9zZWQnLCB1dGlsLmdldFNvY2tldEluZm8odGhpcykpXG5cbiAgY2xpZW50W2tTb2NrZXRdID0gbnVsbFxuXG4gIGlmIChjbGllbnQuZGVzdHJveWVkKSB7XG4gICAgYXNzZXJ0KGNsaWVudFtrUGVuZGluZ10gPT09IDApXG5cbiAgICAvLyBGYWlsIGVudGlyZSBxdWV1ZS5cbiAgICBjb25zdCByZXF1ZXN0cyA9IGNsaWVudFtrUXVldWVdLnNwbGljZShjbGllbnRba1J1bm5pbmdJZHhdKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0c1tpXVxuICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICAgIH1cbiAgfSBlbHNlIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiBlcnIuY29kZSAhPT0gJ1VORF9FUlJfSU5GTycpIHtcbiAgICAvLyBGYWlsIGhlYWQgb2YgcGlwZWxpbmUuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XSsrXSA9IG51bGxcblxuICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgfVxuXG4gIGNsaWVudFtrUGVuZGluZ0lkeF0gPSBjbGllbnRba1J1bm5pbmdJZHhdXG5cbiAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDApXG5cbiAgY2xpZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLCBjbGllbnRba1VybF0sIFtjbGllbnRdLCBlcnIpXG5cbiAgcmVzdW1lKGNsaWVudClcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29ubmVjdCAoY2xpZW50KSB7XG4gIGFzc2VydCghY2xpZW50W2tDb25uZWN0aW5nXSlcbiAgYXNzZXJ0KCFjbGllbnRba1NvY2tldF0pXG5cbiAgbGV0IHsgaG9zdCwgaG9zdG5hbWUsIHByb3RvY29sLCBwb3J0IH0gPSBjbGllbnRba1VybF1cblxuICAvLyBSZXNvbHZlIGlwdjZcbiAgaWYgKGhvc3RuYW1lWzBdID09PSAnWycpIHtcbiAgICBjb25zdCBpZHggPSBob3N0bmFtZS5pbmRleE9mKCddJylcblxuICAgIGFzc2VydChpZHggIT09IC0xKVxuICAgIGNvbnN0IGlwID0gaG9zdG5hbWUuc3Vic3RyaW5nKDEsIGlkeClcblxuICAgIGFzc2VydChuZXQuaXNJUChpcCkpXG4gICAgaG9zdG5hbWUgPSBpcFxuICB9XG5cbiAgY2xpZW50W2tDb25uZWN0aW5nXSA9IHRydWVcblxuICBpZiAoY2hhbm5lbHMuYmVmb3JlQ29ubmVjdC5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLmJlZm9yZUNvbm5lY3QucHVibGlzaCh7XG4gICAgICBjb25uZWN0UGFyYW1zOiB7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGhvc3RuYW1lLFxuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgc2VydmVybmFtZTogY2xpZW50W2tTZXJ2ZXJOYW1lXSxcbiAgICAgICAgbG9jYWxBZGRyZXNzOiBjbGllbnRba0xvY2FsQWRkcmVzc11cbiAgICAgIH0sXG4gICAgICBjb25uZWN0b3I6IGNsaWVudFtrQ29ubmVjdG9yXVxuICAgIH0pXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHNvY2tldCA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNsaWVudFtrQ29ubmVjdG9yXSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGhvc3RuYW1lLFxuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgc2VydmVybmFtZTogY2xpZW50W2tTZXJ2ZXJOYW1lXSxcbiAgICAgICAgbG9jYWxBZGRyZXNzOiBjbGllbnRba0xvY2FsQWRkcmVzc11cbiAgICAgIH0sIChlcnIsIHNvY2tldCkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHNvY2tldClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaWYgKGNsaWVudC5kZXN0cm95ZWQpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQub24oJ2Vycm9yJywgKCkgPT4ge30pLCBuZXcgQ2xpZW50RGVzdHJveWVkRXJyb3IoKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNsaWVudFtrQ29ubmVjdGluZ10gPSBmYWxzZVxuXG4gICAgYXNzZXJ0KHNvY2tldClcblxuICAgIGNvbnN0IGlzSDIgPSBzb2NrZXQuYWxwblByb3RvY29sID09PSAnaDInXG4gICAgaWYgKGlzSDIpIHtcbiAgICAgIGlmICghaDJFeHBlcmltZW50YWxXYXJuZWQpIHtcbiAgICAgICAgaDJFeHBlcmltZW50YWxXYXJuZWQgPSB0cnVlXG4gICAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoJ0gyIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsLCBleHBlY3QgdGhlbSB0byBjaGFuZ2UgYXQgYW55IHRpbWUuJywge1xuICAgICAgICAgIGNvZGU6ICdVTkRJQ0ktSDInXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlc3Npb24gPSBodHRwMi5jb25uZWN0KGNsaWVudFtrVXJsXSwge1xuICAgICAgICBjcmVhdGVDb25uZWN0aW9uOiAoKSA9PiBzb2NrZXQsXG4gICAgICAgIHBlZXJNYXhDb25jdXJyZW50U3RyZWFtczogY2xpZW50W2tIVFRQMlNlc3Npb25TdGF0ZV0ubWF4Q29uY3VycmVudFN0cmVhbXNcbiAgICAgIH0pXG5cbiAgICAgIGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9ICdoMidcbiAgICAgIHNlc3Npb25ba0NsaWVudF0gPSBjbGllbnRcbiAgICAgIHNlc3Npb25ba1NvY2tldF0gPSBzb2NrZXRcbiAgICAgIHNlc3Npb24ub24oJ2Vycm9yJywgb25IdHRwMlNlc3Npb25FcnJvcilcbiAgICAgIHNlc3Npb24ub24oJ2ZyYW1lRXJyb3InLCBvbkh0dHAyRnJhbWVFcnJvcilcbiAgICAgIHNlc3Npb24ub24oJ2VuZCcsIG9uSHR0cDJTZXNzaW9uRW5kKVxuICAgICAgc2Vzc2lvbi5vbignZ29hd2F5Jywgb25IVFRQMkdvQXdheSlcbiAgICAgIHNlc3Npb24ub24oJ2Nsb3NlJywgb25Tb2NrZXRDbG9zZSlcbiAgICAgIHNlc3Npb24udW5yZWYoKVxuXG4gICAgICBjbGllbnRba0hUVFAyU2Vzc2lvbl0gPSBzZXNzaW9uXG4gICAgICBzb2NrZXRba0hUVFAyU2Vzc2lvbl0gPSBzZXNzaW9uXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghbGxodHRwSW5zdGFuY2UpIHtcbiAgICAgICAgbGxodHRwSW5zdGFuY2UgPSBhd2FpdCBsbGh0dHBQcm9taXNlXG4gICAgICAgIGxsaHR0cFByb21pc2UgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIHNvY2tldFtrTm9SZWZdID0gZmFsc2VcbiAgICAgIHNvY2tldFtrV3JpdGluZ10gPSBmYWxzZVxuICAgICAgc29ja2V0W2tSZXNldF0gPSBmYWxzZVxuICAgICAgc29ja2V0W2tCbG9ja2luZ10gPSBmYWxzZVxuICAgICAgc29ja2V0W2tQYXJzZXJdID0gbmV3IFBhcnNlcihjbGllbnQsIHNvY2tldCwgbGxodHRwSW5zdGFuY2UpXG4gICAgfVxuXG4gICAgc29ja2V0W2tDb3VudGVyXSA9IDBcbiAgICBzb2NrZXRba01heFJlcXVlc3RzXSA9IGNsaWVudFtrTWF4UmVxdWVzdHNdXG4gICAgc29ja2V0W2tDbGllbnRdID0gY2xpZW50XG4gICAgc29ja2V0W2tFcnJvcl0gPSBudWxsXG5cbiAgICBzb2NrZXRcbiAgICAgIC5vbignZXJyb3InLCBvblNvY2tldEVycm9yKVxuICAgICAgLm9uKCdyZWFkYWJsZScsIG9uU29ja2V0UmVhZGFibGUpXG4gICAgICAub24oJ2VuZCcsIG9uU29ja2V0RW5kKVxuICAgICAgLm9uKCdjbG9zZScsIG9uU29ja2V0Q2xvc2UpXG5cbiAgICBjbGllbnRba1NvY2tldF0gPSBzb2NrZXRcblxuICAgIGlmIChjaGFubmVscy5jb25uZWN0ZWQuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmNvbm5lY3RlZC5wdWJsaXNoKHtcbiAgICAgICAgY29ubmVjdFBhcmFtczoge1xuICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgICAgcG9ydCxcbiAgICAgICAgICBzZXJ2ZXJuYW1lOiBjbGllbnRba1NlcnZlck5hbWVdLFxuICAgICAgICAgIGxvY2FsQWRkcmVzczogY2xpZW50W2tMb2NhbEFkZHJlc3NdXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3RvcjogY2xpZW50W2tDb25uZWN0b3JdLFxuICAgICAgICBzb2NrZXRcbiAgICAgIH0pXG4gICAgfVxuICAgIGNsaWVudC5lbWl0KCdjb25uZWN0JywgY2xpZW50W2tVcmxdLCBbY2xpZW50XSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGNsaWVudC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNsaWVudFtrQ29ubmVjdGluZ10gPSBmYWxzZVxuXG4gICAgaWYgKGNoYW5uZWxzLmNvbm5lY3RFcnJvci5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuY29ubmVjdEVycm9yLnB1Ymxpc2goe1xuICAgICAgICBjb25uZWN0UGFyYW1zOiB7XG4gICAgICAgICAgaG9zdCxcbiAgICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgICBwb3J0LFxuICAgICAgICAgIHNlcnZlcm5hbWU6IGNsaWVudFtrU2VydmVyTmFtZV0sXG4gICAgICAgICAgbG9jYWxBZGRyZXNzOiBjbGllbnRba0xvY2FsQWRkcmVzc11cbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdG9yOiBjbGllbnRba0Nvbm5lY3Rvcl0sXG4gICAgICAgIGVycm9yOiBlcnJcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGVyci5jb2RlID09PSAnRVJSX1RMU19DRVJUX0FMVE5BTUVfSU5WQUxJRCcpIHtcbiAgICAgIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAwKVxuICAgICAgd2hpbGUgKGNsaWVudFtrUGVuZGluZ10gPiAwICYmIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUGVuZGluZ0lkeF1dLnNlcnZlcm5hbWUgPT09IGNsaWVudFtrU2VydmVyTmFtZV0pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUGVuZGluZ0lkeF0rK11cbiAgICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvbkVycm9yKGNsaWVudCwgZXJyKVxuICAgIH1cblxuICAgIGNsaWVudC5lbWl0KCdjb25uZWN0aW9uRXJyb3InLCBjbGllbnRba1VybF0sIFtjbGllbnRdLCBlcnIpXG4gIH1cblxuICByZXN1bWUoY2xpZW50KVxufVxuXG5mdW5jdGlvbiBlbWl0RHJhaW4gKGNsaWVudCkge1xuICBjbGllbnRba05lZWREcmFpbl0gPSAwXG4gIGNsaWVudC5lbWl0KCdkcmFpbicsIGNsaWVudFtrVXJsXSwgW2NsaWVudF0pXG59XG5cbmZ1bmN0aW9uIHJlc3VtZSAoY2xpZW50LCBzeW5jKSB7XG4gIGlmIChjbGllbnRba1Jlc3VtaW5nXSA9PT0gMikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY2xpZW50W2tSZXN1bWluZ10gPSAyXG5cbiAgX3Jlc3VtZShjbGllbnQsIHN5bmMpXG4gIGNsaWVudFtrUmVzdW1pbmddID0gMFxuXG4gIGlmIChjbGllbnRba1J1bm5pbmdJZHhdID4gMjU2KSB7XG4gICAgY2xpZW50W2tRdWV1ZV0uc3BsaWNlKDAsIGNsaWVudFtrUnVubmluZ0lkeF0pXG4gICAgY2xpZW50W2tQZW5kaW5nSWR4XSAtPSBjbGllbnRba1J1bm5pbmdJZHhdXG4gICAgY2xpZW50W2tSdW5uaW5nSWR4XSA9IDBcbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVzdW1lIChjbGllbnQsIHN5bmMpIHtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUGVuZGluZ10gPT09IDApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tDbG9zZWRSZXNvbHZlXSAmJiAhY2xpZW50W2tTaXplXSkge1xuICAgICAgY2xpZW50W2tDbG9zZWRSZXNvbHZlXSgpXG4gICAgICBjbGllbnRba0Nsb3NlZFJlc29sdmVdID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc29ja2V0ID0gY2xpZW50W2tTb2NrZXRdXG5cbiAgICBpZiAoc29ja2V0ICYmICFzb2NrZXQuZGVzdHJveWVkICYmIHNvY2tldC5hbHBuUHJvdG9jb2wgIT09ICdoMicpIHtcbiAgICAgIGlmIChjbGllbnRba1NpemVdID09PSAwKSB7XG4gICAgICAgIGlmICghc29ja2V0W2tOb1JlZl0gJiYgc29ja2V0LnVucmVmKSB7XG4gICAgICAgICAgc29ja2V0LnVucmVmKClcbiAgICAgICAgICBzb2NrZXRba05vUmVmXSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzb2NrZXRba05vUmVmXSAmJiBzb2NrZXQucmVmKSB7XG4gICAgICAgIHNvY2tldC5yZWYoKVxuICAgICAgICBzb2NrZXRba05vUmVmXSA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGlmIChjbGllbnRba1NpemVdID09PSAwKSB7XG4gICAgICAgIGlmIChzb2NrZXRba1BhcnNlcl0udGltZW91dFR5cGUgIT09IFRJTUVPVVRfSURMRSkge1xuICAgICAgICAgIHNvY2tldFtrUGFyc2VyXS5zZXRUaW1lb3V0KGNsaWVudFtrS2VlcEFsaXZlVGltZW91dFZhbHVlXSwgVElNRU9VVF9JRExFKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwICYmIHNvY2tldFtrUGFyc2VyXS5zdGF0dXNDb2RlIDwgMjAwKSB7XG4gICAgICAgIGlmIChzb2NrZXRba1BhcnNlcl0udGltZW91dFR5cGUgIT09IFRJTUVPVVRfSEVBREVSUykge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgICAgICAgIGNvbnN0IGhlYWRlcnNUaW1lb3V0ID0gcmVxdWVzdC5oZWFkZXJzVGltZW91dCAhPSBudWxsXG4gICAgICAgICAgICA/IHJlcXVlc3QuaGVhZGVyc1RpbWVvdXRcbiAgICAgICAgICAgIDogY2xpZW50W2tIZWFkZXJzVGltZW91dF1cbiAgICAgICAgICBzb2NrZXRba1BhcnNlcl0uc2V0VGltZW91dChoZWFkZXJzVGltZW91dCwgVElNRU9VVF9IRUFERVJTKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrQnVzeV0pIHtcbiAgICAgIGNsaWVudFtrTmVlZERyYWluXSA9IDJcbiAgICB9IGVsc2UgaWYgKGNsaWVudFtrTmVlZERyYWluXSA9PT0gMikge1xuICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgY2xpZW50W2tOZWVkRHJhaW5dID0gMVxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXREcmFpbiwgY2xpZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1pdERyYWluKGNsaWVudClcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUGVuZGluZ10gPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjbGllbnRba1J1bm5pbmddID49IChjbGllbnRba1BpcGVsaW5pbmddIHx8IDEpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tQZW5kaW5nSWR4XV1cblxuICAgIGlmIChjbGllbnRba1VybF0ucHJvdG9jb2wgPT09ICdodHRwczonICYmIGNsaWVudFtrU2VydmVyTmFtZV0gIT09IHJlcXVlc3Quc2VydmVybmFtZSkge1xuICAgICAgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjbGllbnRba1NlcnZlck5hbWVdID0gcmVxdWVzdC5zZXJ2ZXJuYW1lXG5cbiAgICAgIGlmIChzb2NrZXQgJiYgc29ja2V0LnNlcnZlcm5hbWUgIT09IHJlcXVlc3Quc2VydmVybmFtZSkge1xuICAgICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdzZXJ2ZXJuYW1lIGNoYW5nZWQnKSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrQ29ubmVjdGluZ10pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghc29ja2V0ICYmICFjbGllbnRba0hUVFAyU2Vzc2lvbl0pIHtcbiAgICAgIGNvbm5lY3QoY2xpZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQgfHwgc29ja2V0W2tXcml0aW5nXSB8fCBzb2NrZXRba1Jlc2V0XSB8fCBzb2NrZXRba0Jsb2NraW5nXSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwICYmICFyZXF1ZXN0LmlkZW1wb3RlbnQpIHtcbiAgICAgIC8vIE5vbi1pZGVtcG90ZW50IHJlcXVlc3QgY2Fubm90IGJlIHJldHJpZWQuXG4gICAgICAvLyBFbnN1cmUgdGhhdCBubyBvdGhlciByZXF1ZXN0cyBhcmUgaW5mbGlnaHQgYW5kXG4gICAgICAvLyBjb3VsZCBjYXVzZSBmYWlsdXJlLlxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwICYmIChyZXF1ZXN0LnVwZ3JhZGUgfHwgcmVxdWVzdC5tZXRob2QgPT09ICdDT05ORUNUJykpIHtcbiAgICAgIC8vIERvbid0IGRpc3BhdGNoIGFuIHVwZ3JhZGUgdW50aWwgYWxsIHByZWNlZGluZyByZXF1ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgIC8vIEEgbWlzYmVoYXZpbmcgc2VydmVyIG1pZ2h0IHVwZ3JhZGUgdGhlIGNvbm5lY3Rpb24gYmVmb3JlIGFsbCBwaXBlbGluZWRcbiAgICAgIC8vIHJlcXVlc3QgaGFzIGNvbXBsZXRlZC5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiB1dGlsLmJvZHlMZW5ndGgocmVxdWVzdC5ib2R5KSAhPT0gMCAmJlxuICAgICAgKHV0aWwuaXNTdHJlYW0ocmVxdWVzdC5ib2R5KSB8fCB1dGlsLmlzQXN5bmNJdGVyYWJsZShyZXF1ZXN0LmJvZHkpKSkge1xuICAgICAgLy8gUmVxdWVzdCB3aXRoIHN0cmVhbSBvciBpdGVyYXRvciBib2R5IGNhbiBlcnJvciB3aGlsZSBvdGhlciByZXF1ZXN0c1xuICAgICAgLy8gYXJlIGluZmxpZ2h0IGFuZCBpbmRpcmVjdGx5IGVycm9yIHRob3NlIGFzIHdlbGwuXG4gICAgICAvLyBFbnN1cmUgdGhpcyBkb2Vzbid0IGhhcHBlbiBieSB3YWl0aW5nIGZvciBpbmZsaWdodFxuICAgICAgLy8gdG8gY29tcGxldGUgYmVmb3JlIGRpc3BhdGNoaW5nLlxuXG4gICAgICAvLyBSZXF1ZXN0IHdpdGggc3RyZWFtIG9yIGl0ZXJhdG9yIGJvZHkgY2Fubm90IGJlIHJldHJpZWQuXG4gICAgICAvLyBFbnN1cmUgdGhhdCBubyBvdGhlciByZXF1ZXN0cyBhcmUgaW5mbGlnaHQgYW5kXG4gICAgICAvLyBjb3VsZCBjYXVzZSBmYWlsdXJlLlxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0LmFib3J0ZWQgJiYgd3JpdGUoY2xpZW50LCByZXF1ZXN0KSkge1xuICAgICAgY2xpZW50W2tQZW5kaW5nSWR4XSsrXG4gICAgfSBlbHNlIHtcbiAgICAgIGNsaWVudFtrUXVldWVdLnNwbGljZShjbGllbnRba1BlbmRpbmdJZHhdLCAxKVxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzMCNzZWN0aW9uLTMuMy4yXG5mdW5jdGlvbiBzaG91bGRTZW5kQ29udGVudExlbmd0aCAobWV0aG9kKSB7XG4gIHJldHVybiBtZXRob2QgIT09ICdHRVQnICYmIG1ldGhvZCAhPT0gJ0hFQUQnICYmIG1ldGhvZCAhPT0gJ09QVElPTlMnICYmIG1ldGhvZCAhPT0gJ1RSQUNFJyAmJiBtZXRob2QgIT09ICdDT05ORUNUJ1xufVxuXG5mdW5jdGlvbiB3cml0ZSAoY2xpZW50LCByZXF1ZXN0KSB7XG4gIGlmIChjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gPT09ICdoMicpIHtcbiAgICB3cml0ZUgyKGNsaWVudCwgY2xpZW50W2tIVFRQMlNlc3Npb25dLCByZXF1ZXN0KVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBib2R5LCBtZXRob2QsIHBhdGgsIGhvc3QsIHVwZ3JhZGUsIGhlYWRlcnMsIGJsb2NraW5nLCByZXNldCB9ID0gcmVxdWVzdFxuXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjFcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuMlxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy41XG5cbiAgLy8gU2VuZGluZyBhIHBheWxvYWQgYm9keSBvbiBhIHJlcXVlc3QgdGhhdCBkb2VzIG5vdFxuICAvLyBleHBlY3QgaXQgY2FuIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvciBvbiBzb21lXG4gIC8vIHNlcnZlcnMgYW5kIGNvcnJ1cHQgY29ubmVjdGlvbiBzdGF0ZS4gRG8gbm90XG4gIC8vIHJlLXVzZSB0aGUgY29ubmVjdGlvbiBmb3IgZnVydGhlciByZXF1ZXN0cy5cblxuICBjb25zdCBleHBlY3RzUGF5bG9hZCA9IChcbiAgICBtZXRob2QgPT09ICdQVVQnIHx8XG4gICAgbWV0aG9kID09PSAnUE9TVCcgfHxcbiAgICBtZXRob2QgPT09ICdQQVRDSCdcbiAgKVxuXG4gIGlmIChib2R5ICYmIHR5cGVvZiBib2R5LnJlYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUcnkgdG8gcmVhZCBFT0YgaW4gb3JkZXIgdG8gZ2V0IGxlbmd0aC5cbiAgICBib2R5LnJlYWQoMClcbiAgfVxuXG4gIGNvbnN0IGJvZHlMZW5ndGggPSB1dGlsLmJvZHlMZW5ndGgoYm9keSlcblxuICBsZXQgY29udGVudExlbmd0aCA9IGJvZHlMZW5ndGhcblxuICBpZiAoY29udGVudExlbmd0aCA9PT0gbnVsbCkge1xuICAgIGNvbnRlbnRMZW5ndGggPSByZXF1ZXN0LmNvbnRlbnRMZW5ndGhcbiAgfVxuXG4gIGlmIChjb250ZW50TGVuZ3RoID09PSAwICYmICFleHBlY3RzUGF5bG9hZCkge1xuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4zLjJcbiAgICAvLyBBIHVzZXIgYWdlbnQgU0hPVUxEIE5PVCBzZW5kIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIGZpZWxkIHdoZW5cbiAgICAvLyB0aGUgcmVxdWVzdCBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBwYXlsb2FkIGJvZHkgYW5kIHRoZSBtZXRob2RcbiAgICAvLyBzZW1hbnRpY3MgZG8gbm90IGFudGljaXBhdGUgc3VjaCBhIGJvZHkuXG5cbiAgICBjb250ZW50TGVuZ3RoID0gbnVsbFxuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzIwNDZcbiAgLy8gQSB1c2VyIGFnZW50IG1heSBzZW5kIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIHdpdGggMCB2YWx1ZSwgdGhpcyBzaG91bGQgYmUgYWxsb3dlZC5cbiAgaWYgKHNob3VsZFNlbmRDb250ZW50TGVuZ3RoKG1ldGhvZCkgJiYgY29udGVudExlbmd0aCA+IDAgJiYgcmVxdWVzdC5jb250ZW50TGVuZ3RoICE9PSBudWxsICYmIHJlcXVlc3QuY29udGVudExlbmd0aCAhPT0gY29udGVudExlbmd0aCkge1xuICAgIGlmIChjbGllbnRba1N0cmljdENvbnRlbnRMZW5ndGhdKSB7XG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgfVxuXG4gIGNvbnN0IHNvY2tldCA9IGNsaWVudFtrU29ja2V0XVxuXG4gIHRyeSB7XG4gICAgcmVxdWVzdC5vbkNvbm5lY3QoKGVycikgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QuYWJvcnRlZCB8fCByZXF1ZXN0LmNvbXBsZXRlZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyIHx8IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKCkpXG5cbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ2Fib3J0ZWQnKSlcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gIH1cblxuICBpZiAocmVxdWVzdC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAobWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWNvbGxpbmEvdW5kaWNpL2lzc3Vlcy8yNThcbiAgICAvLyBDbG9zZSBhZnRlciBhIEhFQUQgcmVxdWVzdCB0byBpbnRlcm9wIHdpdGggbWlzYmVoYXZpbmcgc2VydmVyc1xuICAgIC8vIHRoYXQgbWF5IHNlbmQgYSBib2R5IGluIHRoZSByZXNwb25zZS5cblxuICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHVwZ3JhZGUgfHwgbWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAvLyBPbiBDT05ORUNUIG9yIHVwZ3JhZGUsIGJsb2NrIHBpcGVsaW5lIGZyb20gZGlzcGF0Y2hpbmcgZnVydGhlclxuICAgIC8vIHJlcXVlc3RzIG9uIHRoaXMgY29ubmVjdGlvbi5cblxuICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHJlc2V0ICE9IG51bGwpIHtcbiAgICBzb2NrZXRba1Jlc2V0XSA9IHJlc2V0XG4gIH1cblxuICBpZiAoY2xpZW50W2tNYXhSZXF1ZXN0c10gJiYgc29ja2V0W2tDb3VudGVyXSsrID49IGNsaWVudFtrTWF4UmVxdWVzdHNdKSB7XG4gICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gIH1cblxuICBpZiAoYmxvY2tpbmcpIHtcbiAgICBzb2NrZXRba0Jsb2NraW5nXSA9IHRydWVcbiAgfVxuXG4gIGxldCBoZWFkZXIgPSBgJHttZXRob2R9ICR7cGF0aH0gSFRUUC8xLjFcXHJcXG5gXG5cbiAgaWYgKHR5cGVvZiBob3N0ID09PSAnc3RyaW5nJykge1xuICAgIGhlYWRlciArPSBgaG9zdDogJHtob3N0fVxcclxcbmBcbiAgfSBlbHNlIHtcbiAgICBoZWFkZXIgKz0gY2xpZW50W2tIb3N0SGVhZGVyXVxuICB9XG5cbiAgaWYgKHVwZ3JhZGUpIHtcbiAgICBoZWFkZXIgKz0gYGNvbm5lY3Rpb246IHVwZ3JhZGVcXHJcXG51cGdyYWRlOiAke3VwZ3JhZGV9XFxyXFxuYFxuICB9IGVsc2UgaWYgKGNsaWVudFtrUGlwZWxpbmluZ10gJiYgIXNvY2tldFtrUmVzZXRdKSB7XG4gICAgaGVhZGVyICs9ICdjb25uZWN0aW9uOiBrZWVwLWFsaXZlXFxyXFxuJ1xuICB9IGVsc2Uge1xuICAgIGhlYWRlciArPSAnY29ubmVjdGlvbjogY2xvc2VcXHJcXG4nXG4gIH1cblxuICBpZiAoaGVhZGVycykge1xuICAgIGhlYWRlciArPSBoZWFkZXJzXG4gIH1cblxuICBpZiAoY2hhbm5lbHMuc2VuZEhlYWRlcnMuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICBjaGFubmVscy5zZW5kSGVhZGVycy5wdWJsaXNoKHsgcmVxdWVzdCwgaGVhZGVyczogaGVhZGVyLCBzb2NrZXQgfSlcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBhc3NlcnRpb24gKi9cbiAgaWYgKCFib2R5IHx8IGJvZHlMZW5ndGggPT09IDApIHtcbiAgICBpZiAoY29udGVudExlbmd0aCA9PT0gMCkge1xuICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1jb250ZW50LWxlbmd0aDogMFxcclxcblxcclxcbmAsICdsYXRpbjEnKVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gbnVsbCwgJ25vIGJvZHkgbXVzdCBub3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG4gICAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfVxcclxcbmAsICdsYXRpbjEnKVxuICAgIH1cbiAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuICB9IGVsc2UgaWYgKHV0aWwuaXNCdWZmZXIoYm9keSkpIHtcbiAgICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gYm9keS5ieXRlTGVuZ3RoLCAnYnVmZmVyIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcblxuICAgIHNvY2tldC5jb3JrKClcbiAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfWNvbnRlbnQtbGVuZ3RoOiAke2NvbnRlbnRMZW5ndGh9XFxyXFxuXFxyXFxuYCwgJ2xhdGluMScpXG4gICAgc29ja2V0LndyaXRlKGJvZHkpXG4gICAgc29ja2V0LnVuY29yaygpXG4gICAgcmVxdWVzdC5vbkJvZHlTZW50KGJvZHkpXG4gICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcbiAgICBpZiAoIWV4cGVjdHNQYXlsb2FkKSB7XG4gICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSBpZiAodXRpbC5pc0Jsb2JMaWtlKGJvZHkpKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd3JpdGVJdGVyYWJsZSh7IGJvZHk6IGJvZHkuc3RyZWFtKCksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHdyaXRlQmxvYih7IGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gICAgfVxuICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICB3cml0ZVN0cmVhbSh7IGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gIH0gZWxzZSBpZiAodXRpbC5pc0l0ZXJhYmxlKGJvZHkpKSB7XG4gICAgd3JpdGVJdGVyYWJsZSh7IGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0KGZhbHNlKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gd3JpdGVIMiAoY2xpZW50LCBzZXNzaW9uLCByZXF1ZXN0KSB7XG4gIGNvbnN0IHsgYm9keSwgbWV0aG9kLCBwYXRoLCBob3N0LCB1cGdyYWRlLCBleHBlY3RDb250aW51ZSwgc2lnbmFsLCBoZWFkZXJzOiByZXFIZWFkZXJzIH0gPSByZXF1ZXN0XG5cbiAgbGV0IGhlYWRlcnNcbiAgaWYgKHR5cGVvZiByZXFIZWFkZXJzID09PSAnc3RyaW5nJykgaGVhZGVycyA9IFJlcXVlc3Rba0hUVFAyQ29weUhlYWRlcnNdKHJlcUhlYWRlcnMudHJpbSgpKVxuICBlbHNlIGhlYWRlcnMgPSByZXFIZWFkZXJzXG5cbiAgaWYgKHVwZ3JhZGUpIHtcbiAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBuZXcgRXJyb3IoJ1VwZ3JhZGUgbm90IHN1cHBvcnRlZCBmb3IgSDInKSlcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVE9ETyhIVFRQLzIpOiBTaG91bGQgd2UgY2FsbCBvbkNvbm5lY3QgaW1tZWRpYXRlbHkgb3Igb24gc3RyZWFtIHJlYWR5IGV2ZW50P1xuICAgIHJlcXVlc3Qub25Db25uZWN0KChlcnIpID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0LmFib3J0ZWQgfHwgcmVxdWVzdC5jb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVyciB8fCBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgfVxuXG4gIGlmIChyZXF1ZXN0LmFib3J0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCdub2RlOmh0dHAyJykuQ2xpZW50SHR0cDJTdHJlYW19ICovXG4gIGxldCBzdHJlYW1cbiAgY29uc3QgaDJTdGF0ZSA9IGNsaWVudFtrSFRUUDJTZXNzaW9uU3RhdGVdXG5cbiAgaGVhZGVyc1tIVFRQMl9IRUFERVJfQVVUSE9SSVRZXSA9IGhvc3QgfHwgY2xpZW50W2tIb3N0XVxuICBoZWFkZXJzW0hUVFAyX0hFQURFUl9NRVRIT0RdID0gbWV0aG9kXG5cbiAgaWYgKG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgc2Vzc2lvbi5yZWYoKVxuICAgIC8vIHdlIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCwgc3RyZWFtcyBhcmUgcGVuZGluZywgZmlyc3QgcmVxdWVzdFxuICAgIC8vIHdpbGwgY3JlYXRlIGEgbmV3IHN0cmVhbS4gV2UgdHJpZ2dlciBhIHJlcXVlc3QgdG8gY3JlYXRlIHRoZSBzdHJlYW0gYW5kIHdhaXQgdW50aWxcbiAgICAvLyBgcmVhZHlgIGV2ZW50IGlzIHRyaWdnZXJlZFxuICAgIC8vIFdlIGRpc2FibGVkIGVuZFN0cmVhbSB0byBhbGxvdyB0aGUgdXNlciB0byB3cml0ZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtID0gc2Vzc2lvbi5yZXF1ZXN0KGhlYWRlcnMsIHsgZW5kU3RyZWFtOiBmYWxzZSwgc2lnbmFsIH0pXG5cbiAgICBpZiAoc3RyZWFtLmlkICYmICFzdHJlYW0ucGVuZGluZykge1xuICAgICAgcmVxdWVzdC5vblVwZ3JhZGUobnVsbCwgbnVsbCwgc3RyZWFtKVxuICAgICAgKytoMlN0YXRlLm9wZW5TdHJlYW1zXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmVhbS5vbmNlKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5vblVwZ3JhZGUobnVsbCwgbnVsbCwgc3RyZWFtKVxuICAgICAgICArK2gyU3RhdGUub3BlblN0cmVhbXNcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgaDJTdGF0ZS5vcGVuU3RyZWFtcyAtPSAxXG4gICAgICAvLyBUT0RPKEhUVFAvMik6IHVucmVmIG9ubHkgaWYgY3VycmVudCBzdHJlYW1zIGNvdW50IGlzIDBcbiAgICAgIGlmIChoMlN0YXRlLm9wZW5TdHJlYW1zID09PSAwKSBzZXNzaW9uLnVucmVmKClcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTQwI3NlY3Rpb24tOC4zXG4gIC8vIDpwYXRoIGFuZCA6c2NoZW1lIGhlYWRlcnMgbXVzdCBiZSBvbWl0ZWQgd2hlbiBzZW5kaW5nIENPTk5FQ1RcblxuICBoZWFkZXJzW0hUVFAyX0hFQURFUl9QQVRIXSA9IHBhdGhcbiAgaGVhZGVyc1tIVFRQMl9IRUFERVJfU0NIRU1FXSA9ICdodHRwcydcblxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy4xXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjJcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuNVxuXG4gIC8vIFNlbmRpbmcgYSBwYXlsb2FkIGJvZHkgb24gYSByZXF1ZXN0IHRoYXQgZG9lcyBub3RcbiAgLy8gZXhwZWN0IGl0IGNhbiBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3Igb24gc29tZVxuICAvLyBzZXJ2ZXJzIGFuZCBjb3JydXB0IGNvbm5lY3Rpb24gc3RhdGUuIERvIG5vdFxuICAvLyByZS11c2UgdGhlIGNvbm5lY3Rpb24gZm9yIGZ1cnRoZXIgcmVxdWVzdHMuXG5cbiAgY29uc3QgZXhwZWN0c1BheWxvYWQgPSAoXG4gICAgbWV0aG9kID09PSAnUFVUJyB8fFxuICAgIG1ldGhvZCA9PT0gJ1BPU1QnIHx8XG4gICAgbWV0aG9kID09PSAnUEFUQ0gnXG4gIClcblxuICBpZiAoYm9keSAmJiB0eXBlb2YgYm9keS5yZWFkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVHJ5IHRvIHJlYWQgRU9GIGluIG9yZGVyIHRvIGdldCBsZW5ndGguXG4gICAgYm9keS5yZWFkKDApXG4gIH1cblxuICBsZXQgY29udGVudExlbmd0aCA9IHV0aWwuYm9keUxlbmd0aChib2R5KVxuXG4gIGlmIChjb250ZW50TGVuZ3RoID09IG51bGwpIHtcbiAgICBjb250ZW50TGVuZ3RoID0gcmVxdWVzdC5jb250ZW50TGVuZ3RoXG4gIH1cblxuICBpZiAoY29udGVudExlbmd0aCA9PT0gMCB8fCAhZXhwZWN0c1BheWxvYWQpIHtcbiAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yXG4gICAgLy8gQSB1c2VyIGFnZW50IFNIT1VMRCBOT1Qgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBmaWVsZCB3aGVuXG4gICAgLy8gdGhlIHJlcXVlc3QgbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIGEgcGF5bG9hZCBib2R5IGFuZCB0aGUgbWV0aG9kXG4gICAgLy8gc2VtYW50aWNzIGRvIG5vdCBhbnRpY2lwYXRlIHN1Y2ggYSBib2R5LlxuXG4gICAgY29udGVudExlbmd0aCA9IG51bGxcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8yMDQ2XG4gIC8vIEEgdXNlciBhZ2VudCBtYXkgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciB3aXRoIDAgdmFsdWUsIHRoaXMgc2hvdWxkIGJlIGFsbG93ZWQuXG4gIGlmIChzaG91bGRTZW5kQ29udGVudExlbmd0aChtZXRob2QpICYmIGNvbnRlbnRMZW5ndGggPiAwICYmIHJlcXVlc3QuY29udGVudExlbmd0aCAhPSBudWxsICYmIHJlcXVlc3QuY29udGVudExlbmd0aCAhPT0gY29udGVudExlbmd0aCkge1xuICAgIGlmIChjbGllbnRba1N0cmljdENvbnRlbnRMZW5ndGhdKSB7XG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgfVxuXG4gIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwpIHtcbiAgICBhc3NlcnQoYm9keSwgJ25vIGJvZHkgbXVzdCBub3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG4gICAgaGVhZGVyc1tIVFRQMl9IRUFERVJfQ09OVEVOVF9MRU5HVEhdID0gYCR7Y29udGVudExlbmd0aH1gXG4gIH1cblxuICBzZXNzaW9uLnJlZigpXG5cbiAgY29uc3Qgc2hvdWxkRW5kU3RyZWFtID0gbWV0aG9kID09PSAnR0VUJyB8fCBtZXRob2QgPT09ICdIRUFEJ1xuICBpZiAoZXhwZWN0Q29udGludWUpIHtcbiAgICBoZWFkZXJzW0hUVFAyX0hFQURFUl9FWFBFQ1RdID0gJzEwMC1jb250aW51ZSdcbiAgICBzdHJlYW0gPSBzZXNzaW9uLnJlcXVlc3QoaGVhZGVycywgeyBlbmRTdHJlYW06IHNob3VsZEVuZFN0cmVhbSwgc2lnbmFsIH0pXG5cbiAgICBzdHJlYW0ub25jZSgnY29udGludWUnLCB3cml0ZUJvZHlIMilcbiAgfSBlbHNlIHtcbiAgICBzdHJlYW0gPSBzZXNzaW9uLnJlcXVlc3QoaGVhZGVycywge1xuICAgICAgZW5kU3RyZWFtOiBzaG91bGRFbmRTdHJlYW0sXG4gICAgICBzaWduYWxcbiAgICB9KVxuICAgIHdyaXRlQm9keUgyKClcbiAgfVxuXG4gIC8vIEluY3JlbWVudCBjb3VudGVyIGFzIHdlIGhhdmUgbmV3IHNldmVyYWwgc3RyZWFtcyBvcGVuXG4gICsraDJTdGF0ZS5vcGVuU3RyZWFtc1xuXG4gIHN0cmVhbS5vbmNlKCdyZXNwb25zZScsIGhlYWRlcnMgPT4ge1xuICAgIGNvbnN0IHsgW0hUVFAyX0hFQURFUl9TVEFUVVNdOiBzdGF0dXNDb2RlLCAuLi5yZWFsSGVhZGVycyB9ID0gaGVhZGVyc1xuXG4gICAgaWYgKHJlcXVlc3Qub25IZWFkZXJzKE51bWJlcihzdGF0dXNDb2RlKSwgcmVhbEhlYWRlcnMsIHN0cmVhbS5yZXN1bWUuYmluZChzdHJlYW0pLCAnJykgPT09IGZhbHNlKSB7XG4gICAgICBzdHJlYW0ucGF1c2UoKVxuICAgIH1cbiAgfSlcblxuICBzdHJlYW0ub25jZSgnZW5kJywgKCkgPT4ge1xuICAgIHJlcXVlc3Qub25Db21wbGV0ZShbXSlcbiAgfSlcblxuICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICBpZiAocmVxdWVzdC5vbkRhdGEoY2h1bmspID09PSBmYWxzZSkge1xuICAgICAgc3RyZWFtLnBhdXNlKClcbiAgICB9XG4gIH0pXG5cbiAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGgyU3RhdGUub3BlblN0cmVhbXMgLT0gMVxuICAgIC8vIFRPRE8oSFRUUC8yKTogdW5yZWYgb25seSBpZiBjdXJyZW50IHN0cmVhbXMgY291bnQgaXMgMFxuICAgIGlmIChoMlN0YXRlLm9wZW5TdHJlYW1zID09PSAwKSB7XG4gICAgICBzZXNzaW9uLnVucmVmKClcbiAgICB9XG4gIH0pXG5cbiAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChjbGllbnRba0hUVFAyU2Vzc2lvbl0gJiYgIWNsaWVudFtrSFRUUDJTZXNzaW9uXS5kZXN0cm95ZWQgJiYgIXRoaXMuY2xvc2VkICYmICF0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgaDJTdGF0ZS5zdHJlYW1zIC09IDFcbiAgICAgIHV0aWwuZGVzdHJveShzdHJlYW0sIGVycilcbiAgICB9XG4gIH0pXG5cbiAgc3RyZWFtLm9uY2UoJ2ZyYW1lRXJyb3InLCAodHlwZSwgY29kZSkgPT4ge1xuICAgIGNvbnN0IGVyciA9IG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoYEhUVFAvMjogXCJmcmFtZUVycm9yXCIgcmVjZWl2ZWQgLSB0eXBlICR7dHlwZX0sIGNvZGUgJHtjb2RlfWApXG4gICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuXG4gICAgaWYgKGNsaWVudFtrSFRUUDJTZXNzaW9uXSAmJiAhY2xpZW50W2tIVFRQMlNlc3Npb25dLmRlc3Ryb3llZCAmJiAhdGhpcy5jbG9zZWQgJiYgIXRoaXMuZGVzdHJveWVkKSB7XG4gICAgICBoMlN0YXRlLnN0cmVhbXMgLT0gMVxuICAgICAgdXRpbC5kZXN0cm95KHN0cmVhbSwgZXJyKVxuICAgIH1cbiAgfSlcblxuICAvLyBzdHJlYW0ub24oJ2Fib3J0ZWQnLCAoKSA9PiB7XG4gIC8vICAgLy8gVE9ETyhIVFRQLzIpOiBTdXBwb3J0IGFib3J0ZWRcbiAgLy8gfSlcblxuICAvLyBzdHJlYW0ub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gIC8vICAgLy8gVE9ETyhIVFRQLzIpOiBTdXBwb3J0IHRpbWVvdXRcbiAgLy8gfSlcblxuICAvLyBzdHJlYW0ub24oJ3B1c2gnLCBoZWFkZXJzID0+IHtcbiAgLy8gICAvLyBUT0RPKEhUVFAvMik6IFN1cHBvciBwdXNoXG4gIC8vIH0pXG5cbiAgLy8gc3RyZWFtLm9uKCd0cmFpbGVycycsIGhlYWRlcnMgPT4ge1xuICAvLyAgIC8vIFRPRE8oSFRUUC8yKTogU3VwcG9ydCB0cmFpbGVyc1xuICAvLyB9KVxuXG4gIHJldHVybiB0cnVlXG5cbiAgZnVuY3Rpb24gd3JpdGVCb2R5SDIgKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBhc3NlcnRpb24gKi9cbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzQnVmZmVyKGJvZHkpKSB7XG4gICAgICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gYm9keS5ieXRlTGVuZ3RoLCAnYnVmZmVyIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcbiAgICAgIHN0cmVhbS5jb3JrKClcbiAgICAgIHN0cmVhbS53cml0ZShib2R5KVxuICAgICAgc3RyZWFtLnVuY29yaygpXG4gICAgICBzdHJlYW0uZW5kKClcbiAgICAgIHJlcXVlc3Qub25Cb2R5U2VudChib2R5KVxuICAgICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNCbG9iTGlrZShib2R5KSkge1xuICAgICAgaWYgKHR5cGVvZiBib2R5LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3cml0ZUl0ZXJhYmxlKHtcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgIGgyc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgICAgZXhwZWN0c1BheWxvYWQsXG4gICAgICAgICAgYm9keTogYm9keS5zdHJlYW0oKSxcbiAgICAgICAgICBzb2NrZXQ6IGNsaWVudFtrU29ja2V0XSxcbiAgICAgICAgICBoZWFkZXI6ICcnXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3cml0ZUJsb2Ioe1xuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICBleHBlY3RzUGF5bG9hZCxcbiAgICAgICAgICBoMnN0cmVhbTogc3RyZWFtLFxuICAgICAgICAgIGhlYWRlcjogJycsXG4gICAgICAgICAgc29ja2V0OiBjbGllbnRba1NvY2tldF1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIHdyaXRlU3RyZWFtKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICBleHBlY3RzUGF5bG9hZCxcbiAgICAgICAgc29ja2V0OiBjbGllbnRba1NvY2tldF0sXG4gICAgICAgIGgyc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgIGhlYWRlcjogJydcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzSXRlcmFibGUoYm9keSkpIHtcbiAgICAgIHdyaXRlSXRlcmFibGUoe1xuICAgICAgICBib2R5LFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgIGV4cGVjdHNQYXlsb2FkLFxuICAgICAgICBoZWFkZXI6ICcnLFxuICAgICAgICBoMnN0cmVhbTogc3RyZWFtLFxuICAgICAgICBzb2NrZXQ6IGNsaWVudFtrU29ja2V0XVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGZhbHNlKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZVN0cmVhbSAoeyBoMnN0cmVhbSwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQgfSkge1xuICBhc3NlcnQoY29udGVudExlbmd0aCAhPT0gMCB8fCBjbGllbnRba1J1bm5pbmddID09PSAwLCAnc3RyZWFtIGJvZHkgY2Fubm90IGJlIHBpcGVsaW5lZCcpXG5cbiAgaWYgKGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9PT0gJ2gyJykge1xuICAgIC8vIEZvciBIVFRQLzIsIGlzIGVub3VnaCB0byBwaXBlIHRoZSBzdHJlYW1cbiAgICBjb25zdCBwaXBlID0gcGlwZWxpbmUoXG4gICAgICBib2R5LFxuICAgICAgaDJzdHJlYW0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3koYm9keSwgZXJyKVxuICAgICAgICAgIHV0aWwuZGVzdHJveShoMnN0cmVhbSwgZXJyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG5cbiAgICBwaXBlLm9uKCdkYXRhJywgb25QaXBlRGF0YSlcbiAgICBwaXBlLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgIHBpcGUucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvblBpcGVEYXRhKVxuICAgICAgdXRpbC5kZXN0cm95KHBpcGUpXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIG9uUGlwZURhdGEgKGNodW5rKSB7XG4gICAgICByZXF1ZXN0Lm9uQm9keVNlbnQoY2h1bmspXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgZmluaXNoZWQgPSBmYWxzZVxuXG4gIGNvbnN0IHdyaXRlciA9IG5ldyBBc3luY1dyaXRlcih7IHNvY2tldCwgcmVxdWVzdCwgY29udGVudExlbmd0aCwgY2xpZW50LCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyIH0pXG5cbiAgY29uc3Qgb25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCF3cml0ZXIud3JpdGUoY2h1bmspICYmIHRoaXMucGF1c2UpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB1dGlsLmRlc3Ryb3kodGhpcywgZXJyKVxuICAgIH1cbiAgfVxuICBjb25zdCBvbkRyYWluID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGJvZHkucmVzdW1lKSB7XG4gICAgICBib2R5LnJlc3VtZSgpXG4gICAgfVxuICB9XG4gIGNvbnN0IG9uQWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZXJyID0gbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IG9uRmluaXNoZWQoZXJyKSlcbiAgfVxuICBjb25zdCBvbkZpbmlzaGVkID0gZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZmluaXNoZWQgPSB0cnVlXG5cbiAgICBhc3NlcnQoc29ja2V0LmRlc3Ryb3llZCB8fCAoc29ja2V0W2tXcml0aW5nXSAmJiBjbGllbnRba1J1bm5pbmddIDw9IDEpKVxuXG4gICAgc29ja2V0XG4gICAgICAub2ZmKCdkcmFpbicsIG9uRHJhaW4pXG4gICAgICAub2ZmKCdlcnJvcicsIG9uRmluaXNoZWQpXG5cbiAgICBib2R5XG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbkRhdGEpXG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uRmluaXNoZWQpXG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25GaW5pc2hlZClcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbkFib3J0KVxuXG4gICAgaWYgKCFlcnIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdyaXRlci5lbmQoKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgZXJyID0gZXJcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZXIuZGVzdHJveShlcnIpXG5cbiAgICBpZiAoZXJyICYmIChlcnIuY29kZSAhPT0gJ1VORF9FUlJfSU5GTycgfHwgZXJyLm1lc3NhZ2UgIT09ICdyZXNldCcpKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koYm9keSwgZXJyKVxuICAgIH0gZWxzZSB7XG4gICAgICB1dGlsLmRlc3Ryb3koYm9keSlcbiAgICB9XG4gIH1cblxuICBib2R5XG4gICAgLm9uKCdkYXRhJywgb25EYXRhKVxuICAgIC5vbignZW5kJywgb25GaW5pc2hlZClcbiAgICAub24oJ2Vycm9yJywgb25GaW5pc2hlZClcbiAgICAub24oJ2Nsb3NlJywgb25BYm9ydClcblxuICBpZiAoYm9keS5yZXN1bWUpIHtcbiAgICBib2R5LnJlc3VtZSgpXG4gIH1cblxuICBzb2NrZXRcbiAgICAub24oJ2RyYWluJywgb25EcmFpbilcbiAgICAub24oJ2Vycm9yJywgb25GaW5pc2hlZClcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVCbG9iICh7IGgyc3RyZWFtLCBib2R5LCBjbGllbnQsIHJlcXVlc3QsIHNvY2tldCwgY29udGVudExlbmd0aCwgaGVhZGVyLCBleHBlY3RzUGF5bG9hZCB9KSB7XG4gIGFzc2VydChjb250ZW50TGVuZ3RoID09PSBib2R5LnNpemUsICdibG9iIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcblxuICBjb25zdCBpc0gyID0gY2xpZW50W2tIVFRQQ29ublZlcnNpb25dID09PSAnaDInXG4gIHRyeSB7XG4gICAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiBjb250ZW50TGVuZ3RoICE9PSBib2R5LnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKVxuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGF3YWl0IGJvZHkuYXJyYXlCdWZmZXIoKSlcblxuICAgIGlmIChpc0gyKSB7XG4gICAgICBoMnN0cmVhbS5jb3JrKClcbiAgICAgIGgyc3RyZWFtLndyaXRlKGJ1ZmZlcilcbiAgICAgIGgyc3RyZWFtLnVuY29yaygpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNvY2tldC5jb3JrKClcbiAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9Y29udGVudC1sZW5ndGg6ICR7Y29udGVudExlbmd0aH1cXHJcXG5cXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIHNvY2tldC53cml0ZShidWZmZXIpXG4gICAgICBzb2NrZXQudW5jb3JrKClcbiAgICB9XG5cbiAgICByZXF1ZXN0Lm9uQm9keVNlbnQoYnVmZmVyKVxuICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG5cbiAgICBpZiAoIWV4cGVjdHNQYXlsb2FkKSB7XG4gICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICB9XG5cbiAgICByZXN1bWUoY2xpZW50KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB1dGlsLmRlc3Ryb3koaXNIMiA/IGgyc3RyZWFtIDogc29ja2V0LCBlcnIpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVJdGVyYWJsZSAoeyBoMnN0cmVhbSwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQgfSkge1xuICBhc3NlcnQoY29udGVudExlbmd0aCAhPT0gMCB8fCBjbGllbnRba1J1bm5pbmddID09PSAwLCAnaXRlcmF0b3IgYm9keSBjYW5ub3QgYmUgcGlwZWxpbmVkJylcblxuICBsZXQgY2FsbGJhY2sgPSBudWxsXG4gIGZ1bmN0aW9uIG9uRHJhaW4gKCkge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY29uc3QgY2IgPSBjYWxsYmFja1xuICAgICAgY2FsbGJhY2sgPSBudWxsXG4gICAgICBjYigpXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgd2FpdEZvckRyYWluID0gKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGFzc2VydChjYWxsYmFjayA9PT0gbnVsbClcblxuICAgIGlmIChzb2NrZXRba0Vycm9yXSkge1xuICAgICAgcmVqZWN0KHNvY2tldFtrRXJyb3JdKVxuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayA9IHJlc29sdmVcbiAgICB9XG4gIH0pXG5cbiAgaWYgKGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9PT0gJ2gyJykge1xuICAgIGgyc3RyZWFtXG4gICAgICAub24oJ2Nsb3NlJywgb25EcmFpbilcbiAgICAgIC5vbignZHJhaW4nLCBvbkRyYWluKVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEl0J3MgdXAgdG8gdGhlIHVzZXIgdG8gc29tZWhvdyBhYm9ydCB0aGUgYXN5bmMgaXRlcmFibGUuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGJvZHkpIHtcbiAgICAgICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICAgICAgdGhyb3cgc29ja2V0W2tFcnJvcl1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlcyA9IGgyc3RyZWFtLndyaXRlKGNodW5rKVxuICAgICAgICByZXF1ZXN0Lm9uQm9keVNlbnQoY2h1bmspXG4gICAgICAgIGlmICghcmVzKSB7XG4gICAgICAgICAgYXdhaXQgd2FpdEZvckRyYWluKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaDJzdHJlYW0uZGVzdHJveShlcnIpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gICAgICBoMnN0cmVhbS5lbmQoKVxuICAgICAgaDJzdHJlYW1cbiAgICAgICAgLm9mZignY2xvc2UnLCBvbkRyYWluKVxuICAgICAgICAub2ZmKCdkcmFpbicsIG9uRHJhaW4pXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBzb2NrZXRcbiAgICAub24oJ2Nsb3NlJywgb25EcmFpbilcbiAgICAub24oJ2RyYWluJywgb25EcmFpbilcblxuICBjb25zdCB3cml0ZXIgPSBuZXcgQXN5bmNXcml0ZXIoeyBzb2NrZXQsIHJlcXVlc3QsIGNvbnRlbnRMZW5ndGgsIGNsaWVudCwgZXhwZWN0c1BheWxvYWQsIGhlYWRlciB9KVxuICB0cnkge1xuICAgIC8vIEl0J3MgdXAgdG8gdGhlIHVzZXIgdG8gc29tZWhvdyBhYm9ydCB0aGUgYXN5bmMgaXRlcmFibGUuXG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBib2R5KSB7XG4gICAgICBpZiAoc29ja2V0W2tFcnJvcl0pIHtcbiAgICAgICAgdGhyb3cgc29ja2V0W2tFcnJvcl1cbiAgICAgIH1cblxuICAgICAgaWYgKCF3cml0ZXIud3JpdGUoY2h1bmspKSB7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JEcmFpbigpXG4gICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVyLmVuZCgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHdyaXRlci5kZXN0cm95KGVycilcbiAgfSBmaW5hbGx5IHtcbiAgICBzb2NrZXRcbiAgICAgIC5vZmYoJ2Nsb3NlJywgb25EcmFpbilcbiAgICAgIC5vZmYoJ2RyYWluJywgb25EcmFpbilcbiAgfVxufVxuXG5jbGFzcyBBc3luY1dyaXRlciB7XG4gIGNvbnN0cnVjdG9yICh7IHNvY2tldCwgcmVxdWVzdCwgY29udGVudExlbmd0aCwgY2xpZW50LCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyIH0pIHtcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RcbiAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLmJ5dGVzV3JpdHRlbiA9IDBcbiAgICB0aGlzLmV4cGVjdHNQYXlsb2FkID0gZXhwZWN0c1BheWxvYWRcbiAgICB0aGlzLmhlYWRlciA9IGhlYWRlclxuXG4gICAgc29ja2V0W2tXcml0aW5nXSA9IHRydWVcbiAgfVxuXG4gIHdyaXRlIChjaHVuaykge1xuICAgIGNvbnN0IHsgc29ja2V0LCByZXF1ZXN0LCBjb250ZW50TGVuZ3RoLCBjbGllbnQsIGJ5dGVzV3JpdHRlbiwgZXhwZWN0c1BheWxvYWQsIGhlYWRlciB9ID0gdGhpc1xuXG4gICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICB0aHJvdyBzb2NrZXRba0Vycm9yXVxuICAgIH1cblxuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBsZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aChjaHVuaylcbiAgICBpZiAoIWxlbikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBXZSBzaG91bGQgZGVmZXIgd3JpdGluZyBjaHVua3MuXG4gICAgaWYgKGNvbnRlbnRMZW5ndGggIT09IG51bGwgJiYgYnl0ZXNXcml0dGVuICsgbGVuID4gY29udGVudExlbmd0aCkge1xuICAgICAgaWYgKGNsaWVudFtrU3RyaWN0Q29udGVudExlbmd0aF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpXG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpKVxuICAgIH1cblxuICAgIHNvY2tldC5jb3JrKClcblxuICAgIGlmIChieXRlc1dyaXR0ZW4gPT09IDApIHtcbiAgICAgIGlmICghZXhwZWN0c1BheWxvYWQpIHtcbiAgICAgICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjb250ZW50TGVuZ3RoID09PSBudWxsKSB7XG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9dHJhbnNmZXItZW5jb2Rpbmc6IGNodW5rZWRcXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9Y29udGVudC1sZW5ndGg6ICR7Y29udGVudExlbmd0aH1cXHJcXG5cXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29udGVudExlbmd0aCA9PT0gbnVsbCkge1xuICAgICAgc29ja2V0LndyaXRlKGBcXHJcXG4ke2xlbi50b1N0cmluZygxNil9XFxyXFxuYCwgJ2xhdGluMScpXG4gICAgfVxuXG4gICAgdGhpcy5ieXRlc1dyaXR0ZW4gKz0gbGVuXG5cbiAgICBjb25zdCByZXQgPSBzb2NrZXQud3JpdGUoY2h1bmspXG5cbiAgICBzb2NrZXQudW5jb3JrKClcblxuICAgIHJlcXVlc3Qub25Cb2R5U2VudChjaHVuaylcblxuICAgIGlmICghcmV0KSB7XG4gICAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQgJiYgc29ja2V0W2tQYXJzZXJdLnRpbWVvdXRUeXBlID09PSBUSU1FT1VUX0hFQURFUlMpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgICBzb2NrZXRba1BhcnNlcl0udGltZW91dC5yZWZyZXNoKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGVuZCAoKSB7XG4gICAgY29uc3QgeyBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGNsaWVudCwgYnl0ZXNXcml0dGVuLCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyLCByZXF1ZXN0IH0gPSB0aGlzXG4gICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcblxuICAgIHNvY2tldFtrV3JpdGluZ10gPSBmYWxzZVxuXG4gICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICB0aHJvdyBzb2NrZXRba0Vycm9yXVxuICAgIH1cblxuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYnl0ZXNXcml0dGVuID09PSAwKSB7XG4gICAgICBpZiAoZXhwZWN0c1BheWxvYWQpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMlxuICAgICAgICAvLyBBIHVzZXIgYWdlbnQgU0hPVUxEIHNlbmQgYSBDb250ZW50LUxlbmd0aCBpbiBhIHJlcXVlc3QgbWVzc2FnZSB3aGVuXG4gICAgICAgIC8vIG5vIFRyYW5zZmVyLUVuY29kaW5nIGlzIHNlbnQgYW5kIHRoZSByZXF1ZXN0IG1ldGhvZCBkZWZpbmVzIGEgbWVhbmluZ1xuICAgICAgICAvLyBmb3IgYW4gZW5jbG9zZWQgcGF5bG9hZCBib2R5LlxuXG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9Y29udGVudC1sZW5ndGg6IDBcXHJcXG5cXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9XFxyXFxuYCwgJ2xhdGluMScpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb250ZW50TGVuZ3RoID09PSBudWxsKSB7XG4gICAgICBzb2NrZXQud3JpdGUoJ1xcclxcbjBcXHJcXG5cXHJcXG4nLCAnbGF0aW4xJylcbiAgICB9XG5cbiAgICBpZiAoY29udGVudExlbmd0aCAhPT0gbnVsbCAmJiBieXRlc1dyaXR0ZW4gIT09IGNvbnRlbnRMZW5ndGgpIHtcbiAgICAgIGlmIChjbGllbnRba1N0cmljdENvbnRlbnRMZW5ndGhdKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0ICYmIHNvY2tldFtrUGFyc2VyXS50aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9IRUFERVJTKSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzdW1lKGNsaWVudClcbiAgfVxuXG4gIGRlc3Ryb3kgKGVycikge1xuICAgIGNvbnN0IHsgc29ja2V0LCBjbGllbnQgfSA9IHRoaXNcblxuICAgIHNvY2tldFtrV3JpdGluZ10gPSBmYWxzZVxuXG4gICAgaWYgKGVycikge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPD0gMSwgJ3BpcGVsaW5lIHNob3VsZCBvbmx5IGNvbnRhaW4gdGhpcyByZXF1ZXN0JylcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIGVycilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZXJyb3JSZXF1ZXN0IChjbGllbnQsIHJlcXVlc3QsIGVycikge1xuICB0cnkge1xuICAgIHJlcXVlc3Qub25FcnJvcihlcnIpXG4gICAgYXNzZXJ0KHJlcXVlc3QuYWJvcnRlZClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2xpZW50LmVtaXQoJ2Vycm9yJywgZXJyKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ2xpZW50XG4iLAogICAgIi8qIGVzbGludC1kaXNhYmxlICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vLyBFeHRyYWN0ZWQgZnJvbSBub2RlL2xpYi9pbnRlcm5hbC9maXhlZF9xdWV1ZS5qc1xuXG4vLyBDdXJyZW50bHkgb3B0aW1hbCBxdWV1ZSBzaXplLCB0ZXN0ZWQgb24gVjggNi4wIC0gNi42LiBNdXN0IGJlIHBvd2VyIG9mIHR3by5cbmNvbnN0IGtTaXplID0gMjA0ODtcbmNvbnN0IGtNYXNrID0ga1NpemUgLSAxO1xuXG4vLyBUaGUgRml4ZWRRdWV1ZSBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBmaXhlZC1zaXplXG4vLyBjaXJjdWxhciBidWZmZXJzLiBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOlxuLy9cbi8vICBoZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxcbi8vICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuLy8gICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2XG4vLyArLS0tLS0tLS0tLS0rIDwtLS0tLVxcICAgICAgICstLS0tLS0tLS0tLSsgPC0tLS0tLVxcICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgW251bGxdICAgfCAgICAgICAgXFwtLS0tLSB8ICAgbmV4dCAgICB8ICAgICAgICAgXFwtLS0tLS0tIHwgICBuZXh0ICAgIHxcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgIGl0ZW0gICAgfCA8LS0gYm90dG9tICAgIHwgICBpdGVtICAgIHwgPC0tIGJvdHRvbSAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgW2VtcHR5XSAgfFxuLy8gfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICBib3R0b20gLS0+IHwgICBpdGVtICAgIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgICAuLi4gICAgfCAgICAgICAgICAgICAgIHwgICAgLi4uICAgIHwgICAgICAgICAgICAgICAgICB8ICAgIC4uLiAgICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgW2VtcHR5XSAgfCA8LS0gdG9wICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8IDwtLSB0b3AgIHRvcCAtLT4gfCAgW2VtcHR5XSAgfFxuLy8gKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4vL1xuLy8gT3IsIGlmIHRoZXJlIGlzIG9ubHkgb25lIGNpcmN1bGFyIGJ1ZmZlciwgaXQgbG9va3Mgc29tZXRoaW5nXG4vLyBsaWtlIGVpdGhlciBvZiB0aGVzZTpcbi8vXG4vLyAgaGVhZCAgIHRhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICAgdGFpbFxuLy8gICAgfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8XG4vLyAgICB2ICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgICAgIHZcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgW251bGxdICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBbbnVsbF0gICB8XG4vLyArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLStcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgW2VtcHR5XSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICAgaXRlbSAgICB8IDwtLSBib3R0b20gICAgICAgICAgICB0b3AgLS0+IHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgW2VtcHR5XSAgfFxuLy8gfCAgW2VtcHR5XSAgfCA8LS0gdG9wICAgICAgICAgICAgYm90dG9tIC0tPiB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy9cbi8vIEFkZGluZyBhIHZhbHVlIG1lYW5zIG1vdmluZyBgdG9wYCBmb3J3YXJkIGJ5IG9uZSwgcmVtb3ZpbmcgbWVhbnNcbi8vIG1vdmluZyBgYm90dG9tYCBmb3J3YXJkIGJ5IG9uZS4gQWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCwgdGhlIHF1ZXVlXG4vLyB3cmFwcyBhcm91bmQuXG4vL1xuLy8gV2hlbiBgdG9wID09PSBib3R0b21gIHRoZSBjdXJyZW50IHF1ZXVlIGlzIGVtcHR5IGFuZCB3aGVuXG4vLyBgdG9wICsgMSA9PT0gYm90dG9tYCBpdCdzIGZ1bGwuIFRoaXMgd2FzdGVzIGEgc2luZ2xlIHNwYWNlIG9mIHN0b3JhZ2Vcbi8vIGJ1dCBhbGxvd3MgbXVjaCBxdWlja2VyIGNoZWNrcy5cblxuY2xhc3MgRml4ZWRDaXJjdWxhckJ1ZmZlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYm90dG9tID0gMDtcbiAgICB0aGlzLnRvcCA9IDA7XG4gICAgdGhpcy5saXN0ID0gbmV3IEFycmF5KGtTaXplKTtcbiAgICB0aGlzLm5leHQgPSBudWxsO1xuICB9XG5cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50b3AgPT09IHRoaXMuYm90dG9tO1xuICB9XG5cbiAgaXNGdWxsKCkge1xuICAgIHJldHVybiAoKHRoaXMudG9wICsgMSkgJiBrTWFzaykgPT09IHRoaXMuYm90dG9tO1xuICB9XG5cbiAgcHVzaChkYXRhKSB7XG4gICAgdGhpcy5saXN0W3RoaXMudG9wXSA9IGRhdGE7XG4gICAgdGhpcy50b3AgPSAodGhpcy50b3AgKyAxKSAmIGtNYXNrO1xuICB9XG5cbiAgc2hpZnQoKSB7XG4gICAgY29uc3QgbmV4dEl0ZW0gPSB0aGlzLmxpc3RbdGhpcy5ib3R0b21dO1xuICAgIGlmIChuZXh0SXRlbSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5saXN0W3RoaXMuYm90dG9tXSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJvdHRvbSA9ICh0aGlzLmJvdHRvbSArIDEpICYga01hc2s7XG4gICAgcmV0dXJuIG5leHRJdGVtO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRml4ZWRRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG5ldyBGaXhlZENpcmN1bGFyQnVmZmVyKCk7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmhlYWQuaXNFbXB0eSgpO1xuICB9XG5cbiAgcHVzaChkYXRhKSB7XG4gICAgaWYgKHRoaXMuaGVhZC5pc0Z1bGwoKSkge1xuICAgICAgLy8gSGVhZCBpcyBmdWxsOiBDcmVhdGVzIGEgbmV3IHF1ZXVlLCBzZXRzIHRoZSBvbGQgcXVldWUncyBgLm5leHRgIHRvIGl0LFxuICAgICAgLy8gYW5kIHNldHMgaXQgYXMgdGhlIG5ldyBtYWluIHF1ZXVlLlxuICAgICAgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQgPSBuZXcgRml4ZWRDaXJjdWxhckJ1ZmZlcigpO1xuICAgIH1cbiAgICB0aGlzLmhlYWQucHVzaChkYXRhKTtcbiAgfVxuXG4gIHNoaWZ0KCkge1xuICAgIGNvbnN0IHRhaWwgPSB0aGlzLnRhaWw7XG4gICAgY29uc3QgbmV4dCA9IHRhaWwuc2hpZnQoKTtcbiAgICBpZiAodGFpbC5pc0VtcHR5KCkgJiYgdGFpbC5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhbm90aGVyIHF1ZXVlLCBpdCBmb3JtcyB0aGUgbmV3IHRhaWwuXG4gICAgICB0aGlzLnRhaWwgPSB0YWlsLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0O1xuICB9XG59O1xuIiwKICAgICJjb25zdCB7IGtGcmVlLCBrQ29ubmVjdGVkLCBrUGVuZGluZywga1F1ZXVlZCwga1J1bm5pbmcsIGtTaXplIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCBrUG9vbCA9IFN5bWJvbCgncG9vbCcpXG5cbmNsYXNzIFBvb2xTdGF0cyB7XG4gIGNvbnN0cnVjdG9yIChwb29sKSB7XG4gICAgdGhpc1trUG9vbF0gPSBwb29sXG4gIH1cblxuICBnZXQgY29ubmVjdGVkICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba0Nvbm5lY3RlZF1cbiAgfVxuXG4gIGdldCBmcmVlICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba0ZyZWVdXG4gIH1cblxuICBnZXQgcGVuZGluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tQZW5kaW5nXVxuICB9XG5cbiAgZ2V0IHF1ZXVlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tRdWV1ZWRdXG4gIH1cblxuICBnZXQgcnVubmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tSdW5uaW5nXVxuICB9XG5cbiAgZ2V0IHNpemUgKCkge1xuICAgIHJldHVybiB0aGlzW2tQb29sXVtrU2l6ZV1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xTdGF0c1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgRGlzcGF0Y2hlckJhc2UgPSByZXF1aXJlKCcuL2Rpc3BhdGNoZXItYmFzZScpXG5jb25zdCBGaXhlZFF1ZXVlID0gcmVxdWlyZSgnLi9ub2RlL2ZpeGVkLXF1ZXVlJylcbmNvbnN0IHsga0Nvbm5lY3RlZCwga1NpemUsIGtSdW5uaW5nLCBrUGVuZGluZywga1F1ZXVlZCwga0J1c3ksIGtGcmVlLCBrVXJsLCBrQ2xvc2UsIGtEZXN0cm95LCBrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vY29yZS9zeW1ib2xzJylcbmNvbnN0IFBvb2xTdGF0cyA9IHJlcXVpcmUoJy4vcG9vbC1zdGF0cycpXG5cbmNvbnN0IGtDbGllbnRzID0gU3ltYm9sKCdjbGllbnRzJylcbmNvbnN0IGtOZWVkRHJhaW4gPSBTeW1ib2woJ25lZWREcmFpbicpXG5jb25zdCBrUXVldWUgPSBTeW1ib2woJ3F1ZXVlJylcbmNvbnN0IGtDbG9zZWRSZXNvbHZlID0gU3ltYm9sKCdjbG9zZWQgcmVzb2x2ZScpXG5jb25zdCBrT25EcmFpbiA9IFN5bWJvbCgnb25EcmFpbicpXG5jb25zdCBrT25Db25uZWN0ID0gU3ltYm9sKCdvbkNvbm5lY3QnKVxuY29uc3Qga09uRGlzY29ubmVjdCA9IFN5bWJvbCgnb25EaXNjb25uZWN0JylcbmNvbnN0IGtPbkNvbm5lY3Rpb25FcnJvciA9IFN5bWJvbCgnb25Db25uZWN0aW9uRXJyb3InKVxuY29uc3Qga0dldERpc3BhdGNoZXIgPSBTeW1ib2woJ2dldCBkaXNwYXRjaGVyJylcbmNvbnN0IGtBZGRDbGllbnQgPSBTeW1ib2woJ2FkZCBjbGllbnQnKVxuY29uc3Qga1JlbW92ZUNsaWVudCA9IFN5bWJvbCgncmVtb3ZlIGNsaWVudCcpXG5jb25zdCBrU3RhdHMgPSBTeW1ib2woJ3N0YXRzJylcblxuY2xhc3MgUG9vbEJhc2UgZXh0ZW5kcyBEaXNwYXRjaGVyQmFzZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tRdWV1ZV0gPSBuZXcgRml4ZWRRdWV1ZSgpXG4gICAgdGhpc1trQ2xpZW50c10gPSBbXVxuICAgIHRoaXNba1F1ZXVlZF0gPSAwXG5cbiAgICBjb25zdCBwb29sID0gdGhpc1xuXG4gICAgdGhpc1trT25EcmFpbl0gPSBmdW5jdGlvbiBvbkRyYWluIChvcmlnaW4sIHRhcmdldHMpIHtcbiAgICAgIGNvbnN0IHF1ZXVlID0gcG9vbFtrUXVldWVdXG5cbiAgICAgIGxldCBuZWVkRHJhaW4gPSBmYWxzZVxuXG4gICAgICB3aGlsZSAoIW5lZWREcmFpbikge1xuICAgICAgICBjb25zdCBpdGVtID0gcXVldWUuc2hpZnQoKVxuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHBvb2xba1F1ZXVlZF0tLVxuICAgICAgICBuZWVkRHJhaW4gPSAhdGhpcy5kaXNwYXRjaChpdGVtLm9wdHMsIGl0ZW0uaGFuZGxlcilcbiAgICAgIH1cblxuICAgICAgdGhpc1trTmVlZERyYWluXSA9IG5lZWREcmFpblxuXG4gICAgICBpZiAoIXRoaXNba05lZWREcmFpbl0gJiYgcG9vbFtrTmVlZERyYWluXSkge1xuICAgICAgICBwb29sW2tOZWVkRHJhaW5dID0gZmFsc2VcbiAgICAgICAgcG9vbC5lbWl0KCdkcmFpbicsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdKVxuICAgICAgfVxuXG4gICAgICBpZiAocG9vbFtrQ2xvc2VkUmVzb2x2ZV0gJiYgcXVldWUuaXNFbXB0eSgpKSB7XG4gICAgICAgIFByb21pc2VcbiAgICAgICAgICAuYWxsKHBvb2xba0NsaWVudHNdLm1hcChjID0+IGMuY2xvc2UoKSkpXG4gICAgICAgICAgLnRoZW4ocG9vbFtrQ2xvc2VkUmVzb2x2ZV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trT25Db25uZWN0XSA9IChvcmlnaW4sIHRhcmdldHMpID0+IHtcbiAgICAgIHBvb2wuZW1pdCgnY29ubmVjdCcsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdKVxuICAgIH1cblxuICAgIHRoaXNba09uRGlzY29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIHBvb2wuZW1pdCgnZGlzY29ubmVjdCcsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdLCBlcnIpXG4gICAgfVxuXG4gICAgdGhpc1trT25Db25uZWN0aW9uRXJyb3JdID0gKG9yaWdpbiwgdGFyZ2V0cywgZXJyKSA9PiB7XG4gICAgICBwb29sLmVtaXQoJ2Nvbm5lY3Rpb25FcnJvcicsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdLCBlcnIpXG4gICAgfVxuXG4gICAgdGhpc1trU3RhdHNdID0gbmV3IFBvb2xTdGF0cyh0aGlzKVxuICB9XG5cbiAgZ2V0IFtrQnVzeV0gKCkge1xuICAgIHJldHVybiB0aGlzW2tOZWVkRHJhaW5dXG4gIH1cblxuICBnZXQgW2tDb25uZWN0ZWRdICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ2xpZW50c10uZmlsdGVyKGNsaWVudCA9PiBjbGllbnRba0Nvbm5lY3RlZF0pLmxlbmd0aFxuICB9XG5cbiAgZ2V0IFtrRnJlZV0gKCkge1xuICAgIHJldHVybiB0aGlzW2tDbGllbnRzXS5maWx0ZXIoY2xpZW50ID0+IGNsaWVudFtrQ29ubmVjdGVkXSAmJiAhY2xpZW50W2tOZWVkRHJhaW5dKS5sZW5ndGhcbiAgfVxuXG4gIGdldCBba1BlbmRpbmddICgpIHtcbiAgICBsZXQgcmV0ID0gdGhpc1trUXVldWVkXVxuICAgIGZvciAoY29uc3QgeyBba1BlbmRpbmddOiBwZW5kaW5nIH0gb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIHJldCArPSBwZW5kaW5nXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGdldCBba1J1bm5pbmddICgpIHtcbiAgICBsZXQgcmV0ID0gMFxuICAgIGZvciAoY29uc3QgeyBba1J1bm5pbmddOiBydW5uaW5nIH0gb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIHJldCArPSBydW5uaW5nXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGdldCBba1NpemVdICgpIHtcbiAgICBsZXQgcmV0ID0gdGhpc1trUXVldWVkXVxuICAgIGZvciAoY29uc3QgeyBba1NpemVdOiBzaXplIH0gb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIHJldCArPSBzaXplXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGdldCBzdGF0cyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1N0YXRzXVxuICB9XG5cbiAgYXN5bmMgW2tDbG9zZV0gKCkge1xuICAgIGlmICh0aGlzW2tRdWV1ZV0uaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpc1trQ2xpZW50c10ubWFwKGMgPT4gYy5jbG9zZSgpKSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXNba0Nsb3NlZFJlc29sdmVdID0gcmVzb2x2ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBba0Rlc3Ryb3ldIChlcnIpIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXNba1F1ZXVlXS5zaGlmdCgpXG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGl0ZW0uaGFuZGxlci5vbkVycm9yKGVycilcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpc1trQ2xpZW50c10ubWFwKGMgPT4gYy5kZXN0cm95KGVycikpKVxuICB9XG5cbiAgW2tEaXNwYXRjaF0gKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpc1trR2V0RGlzcGF0Y2hlcl0oKVxuXG4gICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICB0aGlzW2tOZWVkRHJhaW5dID0gdHJ1ZVxuICAgICAgdGhpc1trUXVldWVdLnB1c2goeyBvcHRzLCBoYW5kbGVyIH0pXG4gICAgICB0aGlzW2tRdWV1ZWRdKytcbiAgICB9IGVsc2UgaWYgKCFkaXNwYXRjaGVyLmRpc3BhdGNoKG9wdHMsIGhhbmRsZXIpKSB7XG4gICAgICBkaXNwYXRjaGVyW2tOZWVkRHJhaW5dID0gdHJ1ZVxuICAgICAgdGhpc1trTmVlZERyYWluXSA9ICF0aGlzW2tHZXREaXNwYXRjaGVyXSgpXG4gICAgfVxuXG4gICAgcmV0dXJuICF0aGlzW2tOZWVkRHJhaW5dXG4gIH1cblxuICBba0FkZENsaWVudF0gKGNsaWVudCkge1xuICAgIGNsaWVudFxuICAgICAgLm9uKCdkcmFpbicsIHRoaXNba09uRHJhaW5dKVxuICAgICAgLm9uKCdjb25uZWN0JywgdGhpc1trT25Db25uZWN0XSlcbiAgICAgIC5vbignZGlzY29ubmVjdCcsIHRoaXNba09uRGlzY29ubmVjdF0pXG4gICAgICAub24oJ2Nvbm5lY3Rpb25FcnJvcicsIHRoaXNba09uQ29ubmVjdGlvbkVycm9yXSlcblxuICAgIHRoaXNba0NsaWVudHNdLnB1c2goY2xpZW50KVxuXG4gICAgaWYgKHRoaXNba05lZWREcmFpbl0pIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBpZiAodGhpc1trTmVlZERyYWluXSkge1xuICAgICAgICAgIHRoaXNba09uRHJhaW5dKGNsaWVudFtrVXJsXSwgW3RoaXMsIGNsaWVudF0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIFtrUmVtb3ZlQ2xpZW50XSAoY2xpZW50KSB7XG4gICAgY2xpZW50LmNsb3NlKCgpID0+IHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXNba0NsaWVudHNdLmluZGV4T2YoY2xpZW50KVxuICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgdGhpc1trQ2xpZW50c10uc3BsaWNlKGlkeCwgMSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpc1trTmVlZERyYWluXSA9IHRoaXNba0NsaWVudHNdLnNvbWUoZGlzcGF0Y2hlciA9PiAoXG4gICAgICAhZGlzcGF0Y2hlcltrTmVlZERyYWluXSAmJlxuICAgICAgZGlzcGF0Y2hlci5jbG9zZWQgIT09IHRydWUgJiZcbiAgICAgIGRpc3BhdGNoZXIuZGVzdHJveWVkICE9PSB0cnVlXG4gICAgKSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgUG9vbEJhc2UsXG4gIGtDbGllbnRzLFxuICBrTmVlZERyYWluLFxuICBrQWRkQ2xpZW50LFxuICBrUmVtb3ZlQ2xpZW50LFxuICBrR2V0RGlzcGF0Y2hlclxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBQb29sQmFzZSxcbiAga0NsaWVudHMsXG4gIGtOZWVkRHJhaW4sXG4gIGtBZGRDbGllbnQsXG4gIGtHZXREaXNwYXRjaGVyXG59ID0gcmVxdWlyZSgnLi9wb29sLWJhc2UnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9jbGllbnQnKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvclxufSA9IHJlcXVpcmUoJy4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IHsga1VybCwga0ludGVyY2VwdG9ycyB9ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuL2NvcmUvY29ubmVjdCcpXG5cbmNvbnN0IGtPcHRpb25zID0gU3ltYm9sKCdvcHRpb25zJylcbmNvbnN0IGtDb25uZWN0aW9ucyA9IFN5bWJvbCgnY29ubmVjdGlvbnMnKVxuY29uc3Qga0ZhY3RvcnkgPSBTeW1ib2woJ2ZhY3RvcnknKVxuXG5mdW5jdGlvbiBkZWZhdWx0RmFjdG9yeSAob3JpZ2luLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgQ2xpZW50KG9yaWdpbiwgb3B0cylcbn1cblxuY2xhc3MgUG9vbCBleHRlbmRzIFBvb2xCYXNlIHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwge1xuICAgIGNvbm5lY3Rpb25zLFxuICAgIGZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSxcbiAgICBjb25uZWN0LFxuICAgIGNvbm5lY3RUaW1lb3V0LFxuICAgIHRscyxcbiAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICBzb2NrZXRQYXRoLFxuICAgIGF1dG9TZWxlY3RGYW1pbHksXG4gICAgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0LFxuICAgIGFsbG93SDIsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICBpZiAoY29ubmVjdGlvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShjb25uZWN0aW9ucykgfHwgY29ubmVjdGlvbnMgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNvbm5lY3Rpb25zJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAhPSBudWxsICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdjb25uZWN0IG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29ubmVjdCA9IGJ1aWxkQ29ubmVjdG9yKHtcbiAgICAgICAgLi4udGxzLFxuICAgICAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICAgICAgYWxsb3dIMixcbiAgICAgICAgc29ja2V0UGF0aCxcbiAgICAgICAgdGltZW91dDogY29ubmVjdFRpbWVvdXQsXG4gICAgICAgIC4uLih1dGlsLm5vZGVIYXNBdXRvU2VsZWN0RmFtaWx5ICYmIGF1dG9TZWxlY3RGYW1pbHkgPyB7IGF1dG9TZWxlY3RGYW1pbHksIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCB9IDogdW5kZWZpbmVkKSxcbiAgICAgICAgLi4uY29ubmVjdFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0aW9ucy5pbnRlcmNlcHRvcnMgJiYgb3B0aW9ucy5pbnRlcmNlcHRvcnMuUG9vbCAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW50ZXJjZXB0b3JzLlBvb2wpXG4gICAgICA/IG9wdGlvbnMuaW50ZXJjZXB0b3JzLlBvb2xcbiAgICAgIDogW11cbiAgICB0aGlzW2tDb25uZWN0aW9uc10gPSBjb25uZWN0aW9ucyB8fCBudWxsXG4gICAgdGhpc1trVXJsXSA9IHV0aWwucGFyc2VPcmlnaW4ob3JpZ2luKVxuICAgIHRoaXNba09wdGlvbnNdID0geyAuLi51dGlsLmRlZXBDbG9uZShvcHRpb25zKSwgY29ubmVjdCwgYWxsb3dIMiB9XG4gICAgdGhpc1trT3B0aW9uc10uaW50ZXJjZXB0b3JzID0gb3B0aW9ucy5pbnRlcmNlcHRvcnNcbiAgICAgID8geyAuLi5vcHRpb25zLmludGVyY2VwdG9ycyB9XG4gICAgICA6IHVuZGVmaW5lZFxuICAgIHRoaXNba0ZhY3RvcnldID0gZmFjdG9yeVxuICB9XG5cbiAgW2tHZXREaXNwYXRjaGVyXSAoKSB7XG4gICAgbGV0IGRpc3BhdGNoZXIgPSB0aGlzW2tDbGllbnRzXS5maW5kKGRpc3BhdGNoZXIgPT4gIWRpc3BhdGNoZXJba05lZWREcmFpbl0pXG5cbiAgICBpZiAoZGlzcGF0Y2hlcikge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgICB9XG5cbiAgICBpZiAoIXRoaXNba0Nvbm5lY3Rpb25zXSB8fCB0aGlzW2tDbGllbnRzXS5sZW5ndGggPCB0aGlzW2tDb25uZWN0aW9uc10pIHtcbiAgICAgIGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XSh0aGlzW2tVcmxdLCB0aGlzW2tPcHRpb25zXSlcbiAgICAgIHRoaXNba0FkZENsaWVudF0oZGlzcGF0Y2hlcilcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzcGF0Y2hlclxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUG9vbFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvcixcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3Jcbn0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IHtcbiAgUG9vbEJhc2UsXG4gIGtDbGllbnRzLFxuICBrTmVlZERyYWluLFxuICBrQWRkQ2xpZW50LFxuICBrUmVtb3ZlQ2xpZW50LFxuICBrR2V0RGlzcGF0Y2hlclxufSA9IHJlcXVpcmUoJy4vcG9vbC1iYXNlJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuL3Bvb2wnKVxuY29uc3QgeyBrVXJsLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IHBhcnNlT3JpZ2luIH0gPSByZXF1aXJlKCcuL2NvcmUvdXRpbCcpXG5jb25zdCBrRmFjdG9yeSA9IFN5bWJvbCgnZmFjdG9yeScpXG5cbmNvbnN0IGtPcHRpb25zID0gU3ltYm9sKCdvcHRpb25zJylcbmNvbnN0IGtHcmVhdGVzdENvbW1vbkRpdmlzb3IgPSBTeW1ib2woJ2tHcmVhdGVzdENvbW1vbkRpdmlzb3InKVxuY29uc3Qga0N1cnJlbnRXZWlnaHQgPSBTeW1ib2woJ2tDdXJyZW50V2VpZ2h0JylcbmNvbnN0IGtJbmRleCA9IFN5bWJvbCgna0luZGV4JylcbmNvbnN0IGtXZWlnaHQgPSBTeW1ib2woJ2tXZWlnaHQnKVxuY29uc3Qga01heFdlaWdodFBlclNlcnZlciA9IFN5bWJvbCgna01heFdlaWdodFBlclNlcnZlcicpXG5jb25zdCBrRXJyb3JQZW5hbHR5ID0gU3ltYm9sKCdrRXJyb3JQZW5hbHR5JylcblxuZnVuY3Rpb24gZ2V0R3JlYXRlc3RDb21tb25EaXZpc29yIChhLCBiKSB7XG4gIGlmIChiID09PSAwKSByZXR1cm4gYVxuICByZXR1cm4gZ2V0R3JlYXRlc3RDb21tb25EaXZpc29yKGIsIGEgJSBiKVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0RmFjdG9yeSAob3JpZ2luLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgUG9vbChvcmlnaW4sIG9wdHMpXG59XG5cbmNsYXNzIEJhbGFuY2VkUG9vbCBleHRlbmRzIFBvb2xCYXNlIHtcbiAgY29uc3RydWN0b3IgKHVwc3RyZWFtcyA9IFtdLCB7IGZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSwgLi4ub3B0cyB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tPcHRpb25zXSA9IG9wdHNcbiAgICB0aGlzW2tJbmRleF0gPSAtMVxuICAgIHRoaXNba0N1cnJlbnRXZWlnaHRdID0gMFxuXG4gICAgdGhpc1trTWF4V2VpZ2h0UGVyU2VydmVyXSA9IHRoaXNba09wdGlvbnNdLm1heFdlaWdodFBlclNlcnZlciB8fCAxMDBcbiAgICB0aGlzW2tFcnJvclBlbmFsdHldID0gdGhpc1trT3B0aW9uc10uZXJyb3JQZW5hbHR5IHx8IDE1XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodXBzdHJlYW1zKSkge1xuICAgICAgdXBzdHJlYW1zID0gW3Vwc3RyZWFtc11cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0cy5pbnRlcmNlcHRvcnMgJiYgb3B0cy5pbnRlcmNlcHRvcnMuQmFsYW5jZWRQb29sICYmIEFycmF5LmlzQXJyYXkob3B0cy5pbnRlcmNlcHRvcnMuQmFsYW5jZWRQb29sKVxuICAgICAgPyBvcHRzLmludGVyY2VwdG9ycy5CYWxhbmNlZFBvb2xcbiAgICAgIDogW11cbiAgICB0aGlzW2tGYWN0b3J5XSA9IGZhY3RvcnlcblxuICAgIGZvciAoY29uc3QgdXBzdHJlYW0gb2YgdXBzdHJlYW1zKSB7XG4gICAgICB0aGlzLmFkZFVwc3RyZWFtKHVwc3RyZWFtKVxuICAgIH1cbiAgICB0aGlzLl91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cygpXG4gIH1cblxuICBhZGRVcHN0cmVhbSAodXBzdHJlYW0pIHtcbiAgICBjb25zdCB1cHN0cmVhbU9yaWdpbiA9IHBhcnNlT3JpZ2luKHVwc3RyZWFtKS5vcmlnaW5cblxuICAgIGlmICh0aGlzW2tDbGllbnRzXS5maW5kKChwb29sKSA9PiAoXG4gICAgICBwb29sW2tVcmxdLm9yaWdpbiA9PT0gdXBzdHJlYW1PcmlnaW4gJiZcbiAgICAgIHBvb2wuY2xvc2VkICE9PSB0cnVlICYmXG4gICAgICBwb29sLmRlc3Ryb3llZCAhPT0gdHJ1ZVxuICAgICkpKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgICBjb25zdCBwb29sID0gdGhpc1trRmFjdG9yeV0odXBzdHJlYW1PcmlnaW4sIE9iamVjdC5hc3NpZ24oe30sIHRoaXNba09wdGlvbnNdKSlcblxuICAgIHRoaXNba0FkZENsaWVudF0ocG9vbClcbiAgICBwb29sLm9uKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgcG9vbFtrV2VpZ2h0XSA9IE1hdGgubWluKHRoaXNba01heFdlaWdodFBlclNlcnZlcl0sIHBvb2xba1dlaWdodF0gKyB0aGlzW2tFcnJvclBlbmFsdHldKVxuICAgIH0pXG5cbiAgICBwb29sLm9uKCdjb25uZWN0aW9uRXJyb3InLCAoKSA9PiB7XG4gICAgICBwb29sW2tXZWlnaHRdID0gTWF0aC5tYXgoMSwgcG9vbFtrV2VpZ2h0XSAtIHRoaXNba0Vycm9yUGVuYWx0eV0pXG4gICAgICB0aGlzLl91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cygpXG4gICAgfSlcblxuICAgIHBvb2wub24oJ2Rpc2Nvbm5lY3QnLCAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgZXJyID0gYXJnc1syXVxuICAgICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ1VORF9FUlJfU09DS0VUJykge1xuICAgICAgICAvLyBkZWNyZWFzZSB0aGUgd2VpZ2h0IG9mIHRoZSBwb29sLlxuICAgICAgICBwb29sW2tXZWlnaHRdID0gTWF0aC5tYXgoMSwgcG9vbFtrV2VpZ2h0XSAtIHRoaXNba0Vycm9yUGVuYWx0eV0pXG4gICAgICAgIHRoaXMuX3VwZGF0ZUJhbGFuY2VkUG9vbFN0YXRzKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBjbGllbnQgb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIGNsaWVudFtrV2VpZ2h0XSA9IHRoaXNba01heFdlaWdodFBlclNlcnZlcl1cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cygpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX3VwZGF0ZUJhbGFuY2VkUG9vbFN0YXRzICgpIHtcbiAgICB0aGlzW2tHcmVhdGVzdENvbW1vbkRpdmlzb3JdID0gdGhpc1trQ2xpZW50c10ubWFwKHAgPT4gcFtrV2VpZ2h0XSkucmVkdWNlKGdldEdyZWF0ZXN0Q29tbW9uRGl2aXNvciwgMClcbiAgfVxuXG4gIHJlbW92ZVVwc3RyZWFtICh1cHN0cmVhbSkge1xuICAgIGNvbnN0IHVwc3RyZWFtT3JpZ2luID0gcGFyc2VPcmlnaW4odXBzdHJlYW0pLm9yaWdpblxuXG4gICAgY29uc3QgcG9vbCA9IHRoaXNba0NsaWVudHNdLmZpbmQoKHBvb2wpID0+IChcbiAgICAgIHBvb2xba1VybF0ub3JpZ2luID09PSB1cHN0cmVhbU9yaWdpbiAmJlxuICAgICAgcG9vbC5jbG9zZWQgIT09IHRydWUgJiZcbiAgICAgIHBvb2wuZGVzdHJveWVkICE9PSB0cnVlXG4gICAgKSlcblxuICAgIGlmIChwb29sKSB7XG4gICAgICB0aGlzW2tSZW1vdmVDbGllbnRdKHBvb2wpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGdldCB1cHN0cmVhbXMgKCkge1xuICAgIHJldHVybiB0aGlzW2tDbGllbnRzXVxuICAgICAgLmZpbHRlcihkaXNwYXRjaGVyID0+IGRpc3BhdGNoZXIuY2xvc2VkICE9PSB0cnVlICYmIGRpc3BhdGNoZXIuZGVzdHJveWVkICE9PSB0cnVlKVxuICAgICAgLm1hcCgocCkgPT4gcFtrVXJsXS5vcmlnaW4pXG4gIH1cblxuICBba0dldERpc3BhdGNoZXJdICgpIHtcbiAgICAvLyBXZSB2YWxpZGF0ZSB0aGF0IHBvb2xzIGlzIGdyZWF0ZXIgdGhhbiAwLFxuICAgIC8vIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHRvIHdhaXQgdW50aWwgYW4gdXBzdHJlYW1cbiAgICAvLyBpcyBhZGRlZCwgd2hpY2ggbWlnaHQgbmV2ZXIgaGFwcGVuLlxuICAgIGlmICh0aGlzW2tDbGllbnRzXS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvcigpXG4gICAgfVxuXG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXNba0NsaWVudHNdLmZpbmQoZGlzcGF0Y2hlciA9PiAoXG4gICAgICAhZGlzcGF0Y2hlcltrTmVlZERyYWluXSAmJlxuICAgICAgZGlzcGF0Y2hlci5jbG9zZWQgIT09IHRydWUgJiZcbiAgICAgIGRpc3BhdGNoZXIuZGVzdHJveWVkICE9PSB0cnVlXG4gICAgKSlcblxuICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYWxsQ2xpZW50c0J1c3kgPSB0aGlzW2tDbGllbnRzXS5tYXAocG9vbCA9PiBwb29sW2tOZWVkRHJhaW5dKS5yZWR1Y2UoKGEsIGIpID0+IGEgJiYgYiwgdHJ1ZSlcblxuICAgIGlmIChhbGxDbGllbnRzQnVzeSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IGNvdW50ZXIgPSAwXG5cbiAgICBsZXQgbWF4V2VpZ2h0SW5kZXggPSB0aGlzW2tDbGllbnRzXS5maW5kSW5kZXgocG9vbCA9PiAhcG9vbFtrTmVlZERyYWluXSlcblxuICAgIHdoaWxlIChjb3VudGVyKysgPCB0aGlzW2tDbGllbnRzXS5sZW5ndGgpIHtcbiAgICAgIHRoaXNba0luZGV4XSA9ICh0aGlzW2tJbmRleF0gKyAxKSAlIHRoaXNba0NsaWVudHNdLmxlbmd0aFxuICAgICAgY29uc3QgcG9vbCA9IHRoaXNba0NsaWVudHNdW3RoaXNba0luZGV4XV1cblxuICAgICAgLy8gZmluZCBwb29sIGluZGV4IHdpdGggdGhlIGxhcmdlc3Qgd2VpZ2h0XG4gICAgICBpZiAocG9vbFtrV2VpZ2h0XSA+IHRoaXNba0NsaWVudHNdW21heFdlaWdodEluZGV4XVtrV2VpZ2h0XSAmJiAhcG9vbFtrTmVlZERyYWluXSkge1xuICAgICAgICBtYXhXZWlnaHRJbmRleCA9IHRoaXNba0luZGV4XVxuICAgICAgfVxuXG4gICAgICAvLyBkZWNyZWFzZSB0aGUgY3VycmVudCB3ZWlnaHQgZXZlcnkgYHRoaXNba0NsaWVudHNdLmxlbmd0aGAuXG4gICAgICBpZiAodGhpc1trSW5kZXhdID09PSAwKSB7XG4gICAgICAgIC8vIFNldCB0aGUgY3VycmVudCB3ZWlnaHQgdG8gdGhlIG5leHQgbG93ZXIgd2VpZ2h0LlxuICAgICAgICB0aGlzW2tDdXJyZW50V2VpZ2h0XSA9IHRoaXNba0N1cnJlbnRXZWlnaHRdIC0gdGhpc1trR3JlYXRlc3RDb21tb25EaXZpc29yXVxuXG4gICAgICAgIGlmICh0aGlzW2tDdXJyZW50V2VpZ2h0XSA8PSAwKSB7XG4gICAgICAgICAgdGhpc1trQ3VycmVudFdlaWdodF0gPSB0aGlzW2tNYXhXZWlnaHRQZXJTZXJ2ZXJdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwb29sW2tXZWlnaHRdID49IHRoaXNba0N1cnJlbnRXZWlnaHRdICYmICghcG9vbFtrTmVlZERyYWluXSkpIHtcbiAgICAgICAgcmV0dXJuIHBvb2xcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzW2tDdXJyZW50V2VpZ2h0XSA9IHRoaXNba0NsaWVudHNdW21heFdlaWdodEluZGV4XVtrV2VpZ2h0XVxuICAgIHRoaXNba0luZGV4XSA9IG1heFdlaWdodEluZGV4XG4gICAgcmV0dXJuIHRoaXNba0NsaWVudHNdW21heFdlaWdodEluZGV4XVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQmFsYW5jZWRQb29sXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZTogb25seSBmb3IgTm9kZSAxMiAqL1xuXG5jb25zdCB7IGtDb25uZWN0ZWQsIGtTaXplIH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuXG5jbGFzcyBDb21wYXRXZWFrUmVmIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICBkZXJlZiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVba0Nvbm5lY3RlZF0gPT09IDAgJiYgdGhpcy52YWx1ZVtrU2l6ZV0gPT09IDBcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMudmFsdWVcbiAgfVxufVxuXG5jbGFzcyBDb21wYXRGaW5hbGl6ZXIge1xuICBjb25zdHJ1Y3RvciAoZmluYWxpemVyKSB7XG4gICAgdGhpcy5maW5hbGl6ZXIgPSBmaW5hbGl6ZXJcbiAgfVxuXG4gIHJlZ2lzdGVyIChkaXNwYXRjaGVyLCBrZXkpIHtcbiAgICBpZiAoZGlzcGF0Y2hlci5vbikge1xuICAgICAgZGlzcGF0Y2hlci5vbignZGlzY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgaWYgKGRpc3BhdGNoZXJba0Nvbm5lY3RlZF0gPT09IDAgJiYgZGlzcGF0Y2hlcltrU2l6ZV0gPT09IDApIHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXplcihrZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICAvLyBGSVhNRTogcmVtb3ZlIHdvcmthcm91bmQgd2hlbiB0aGUgTm9kZSBidWcgaXMgZml4ZWRcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy80OTM0NCNpc3N1ZWNvbW1lbnQtMTc0MTc3NjMwOFxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9WOF9DT1ZFUkFHRSkge1xuICAgIHJldHVybiB7XG4gICAgICBXZWFrUmVmOiBDb21wYXRXZWFrUmVmLFxuICAgICAgRmluYWxpemF0aW9uUmVnaXN0cnk6IENvbXBhdEZpbmFsaXplclxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIFdlYWtSZWY6IGdsb2JhbC5XZWFrUmVmIHx8IENvbXBhdFdlYWtSZWYsXG4gICAgRmluYWxpemF0aW9uUmVnaXN0cnk6IGdsb2JhbC5GaW5hbGl6YXRpb25SZWdpc3RyeSB8fCBDb21wYXRGaW5hbGl6ZXJcbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IGtDbGllbnRzLCBrUnVubmluZywga0Nsb3NlLCBrRGVzdHJveSwga0Rpc3BhdGNoLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCBEaXNwYXRjaGVyQmFzZSA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlci1iYXNlJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuL3Bvb2wnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9jbGllbnQnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IGNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSByZXF1aXJlKCcuL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3InKVxuY29uc3QgeyBXZWFrUmVmLCBGaW5hbGl6YXRpb25SZWdpc3RyeSB9ID0gcmVxdWlyZSgnLi9jb21wYXQvZGlzcGF0Y2hlci13ZWFrcmVmJykoKVxuXG5jb25zdCBrT25Db25uZWN0ID0gU3ltYm9sKCdvbkNvbm5lY3QnKVxuY29uc3Qga09uRGlzY29ubmVjdCA9IFN5bWJvbCgnb25EaXNjb25uZWN0JylcbmNvbnN0IGtPbkNvbm5lY3Rpb25FcnJvciA9IFN5bWJvbCgnb25Db25uZWN0aW9uRXJyb3InKVxuY29uc3Qga01heFJlZGlyZWN0aW9ucyA9IFN5bWJvbCgnbWF4UmVkaXJlY3Rpb25zJylcbmNvbnN0IGtPbkRyYWluID0gU3ltYm9sKCdvbkRyYWluJylcbmNvbnN0IGtGYWN0b3J5ID0gU3ltYm9sKCdmYWN0b3J5JylcbmNvbnN0IGtGaW5hbGl6ZXIgPSBTeW1ib2woJ2ZpbmFsaXplcicpXG5jb25zdCBrT3B0aW9ucyA9IFN5bWJvbCgnb3B0aW9ucycpXG5cbmZ1bmN0aW9uIGRlZmF1bHRGYWN0b3J5IChvcmlnaW4sIG9wdHMpIHtcbiAgcmV0dXJuIG9wdHMgJiYgb3B0cy5jb25uZWN0aW9ucyA9PT0gMVxuICAgID8gbmV3IENsaWVudChvcmlnaW4sIG9wdHMpXG4gICAgOiBuZXcgUG9vbChvcmlnaW4sIG9wdHMpXG59XG5cbmNsYXNzIEFnZW50IGV4dGVuZHMgRGlzcGF0Y2hlckJhc2Uge1xuICBjb25zdHJ1Y3RvciAoeyBmYWN0b3J5ID0gZGVmYXVsdEZhY3RvcnksIG1heFJlZGlyZWN0aW9ucyA9IDAsIGNvbm5lY3QsIC4uLm9wdGlvbnMgfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuXG4gICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ZhY3RvcnkgbXVzdCBiZSBhIGZ1bmN0aW9uLicpXG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3QgIT0gbnVsbCAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignY29ubmVjdCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0JylcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVkaXJlY3Rpb25zKSB8fCBtYXhSZWRpcmVjdGlvbnMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heFJlZGlyZWN0aW9ucyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29ubmVjdCA9IHsgLi4uY29ubmVjdCB9XG4gICAgfVxuXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG9wdGlvbnMuaW50ZXJjZXB0b3JzICYmIG9wdGlvbnMuaW50ZXJjZXB0b3JzLkFnZW50ICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbnRlcmNlcHRvcnMuQWdlbnQpXG4gICAgICA/IG9wdGlvbnMuaW50ZXJjZXB0b3JzLkFnZW50XG4gICAgICA6IFtjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yKHsgbWF4UmVkaXJlY3Rpb25zIH0pXVxuXG4gICAgdGhpc1trT3B0aW9uc10gPSB7IC4uLnV0aWwuZGVlcENsb25lKG9wdGlvbnMpLCBjb25uZWN0IH1cbiAgICB0aGlzW2tPcHRpb25zXS5pbnRlcmNlcHRvcnMgPSBvcHRpb25zLmludGVyY2VwdG9yc1xuICAgICAgPyB7IC4uLm9wdGlvbnMuaW50ZXJjZXB0b3JzIH1cbiAgICAgIDogdW5kZWZpbmVkXG4gICAgdGhpc1trTWF4UmVkaXJlY3Rpb25zXSA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXNba0ZhY3RvcnldID0gZmFjdG9yeVxuICAgIHRoaXNba0NsaWVudHNdID0gbmV3IE1hcCgpXG4gICAgdGhpc1trRmluYWxpemVyXSA9IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZ2MgaXMgdW5kZXRlcm1pbmlzdGljICovIGtleSA9PiB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzW2tDbGllbnRzXS5nZXQoa2V5KVxuICAgICAgaWYgKHJlZiAhPT0gdW5kZWZpbmVkICYmIHJlZi5kZXJlZigpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpc1trQ2xpZW50c10uZGVsZXRlKGtleSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgYWdlbnQgPSB0aGlzXG5cbiAgICB0aGlzW2tPbkRyYWluXSA9IChvcmlnaW4sIHRhcmdldHMpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2RyYWluJywgb3JpZ2luLCBbYWdlbnQsIC4uLnRhcmdldHNdKVxuICAgIH1cblxuICAgIHRoaXNba09uQ29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzKSA9PiB7XG4gICAgICBhZ2VudC5lbWl0KCdjb25uZWN0Jywgb3JpZ2luLCBbYWdlbnQsIC4uLnRhcmdldHNdKVxuICAgIH1cblxuICAgIHRoaXNba09uRGlzY29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLCBvcmlnaW4sIFthZ2VudCwgLi4udGFyZ2V0c10sIGVycilcbiAgICB9XG5cbiAgICB0aGlzW2tPbkNvbm5lY3Rpb25FcnJvcl0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2Nvbm5lY3Rpb25FcnJvcicsIG9yaWdpbiwgW2FnZW50LCAuLi50YXJnZXRzXSwgZXJyKVxuICAgIH1cbiAgfVxuXG4gIGdldCBba1J1bm5pbmddICgpIHtcbiAgICBsZXQgcmV0ID0gMFxuICAgIGZvciAoY29uc3QgcmVmIG9mIHRoaXNba0NsaWVudHNdLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSByZWYuZGVyZWYoKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGdjIGlzIHVuZGV0ZXJtaW5pc3RpYyAqL1xuICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICByZXQgKz0gY2xpZW50W2tSdW5uaW5nXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICBba0Rpc3BhdGNoXSAob3B0cywgaGFuZGxlcikge1xuICAgIGxldCBrZXlcbiAgICBpZiAob3B0cy5vcmlnaW4gJiYgKHR5cGVvZiBvcHRzLm9yaWdpbiA9PT0gJ3N0cmluZycgfHwgb3B0cy5vcmlnaW4gaW5zdGFuY2VvZiBVUkwpKSB7XG4gICAgICBrZXkgPSBTdHJpbmcob3B0cy5vcmlnaW4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cy5vcmlnaW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgVVJMLicpXG4gICAgfVxuXG4gICAgY29uc3QgcmVmID0gdGhpc1trQ2xpZW50c10uZ2V0KGtleSlcblxuICAgIGxldCBkaXNwYXRjaGVyID0gcmVmID8gcmVmLmRlcmVmKCkgOiBudWxsXG4gICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICBkaXNwYXRjaGVyID0gdGhpc1trRmFjdG9yeV0ob3B0cy5vcmlnaW4sIHRoaXNba09wdGlvbnNdKVxuICAgICAgICAub24oJ2RyYWluJywgdGhpc1trT25EcmFpbl0pXG4gICAgICAgIC5vbignY29ubmVjdCcsIHRoaXNba09uQ29ubmVjdF0pXG4gICAgICAgIC5vbignZGlzY29ubmVjdCcsIHRoaXNba09uRGlzY29ubmVjdF0pXG4gICAgICAgIC5vbignY29ubmVjdGlvbkVycm9yJywgdGhpc1trT25Db25uZWN0aW9uRXJyb3JdKVxuXG4gICAgICB0aGlzW2tDbGllbnRzXS5zZXQoa2V5LCBuZXcgV2Vha1JlZihkaXNwYXRjaGVyKSlcbiAgICAgIHRoaXNba0ZpbmFsaXplcl0ucmVnaXN0ZXIoZGlzcGF0Y2hlciwga2V5KVxuICAgIH1cblxuICAgIHJldHVybiBkaXNwYXRjaGVyLmRpc3BhdGNoKG9wdHMsIGhhbmRsZXIpXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgY29uc3QgY2xvc2VQcm9taXNlcyA9IFtdXG4gICAgZm9yIChjb25zdCByZWYgb2YgdGhpc1trQ2xpZW50c10udmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IHJlZi5kZXJlZigpXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogZ2MgaXMgdW5kZXRlcm1pbmlzdGljICovXG4gICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgIGNsb3NlUHJvbWlzZXMucHVzaChjbGllbnQuY2xvc2UoKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChjbG9zZVByb21pc2VzKVxuICB9XG5cbiAgYXN5bmMgW2tEZXN0cm95XSAoZXJyKSB7XG4gICAgY29uc3QgZGVzdHJveVByb21pc2VzID0gW11cbiAgICBmb3IgKGNvbnN0IHJlZiBvZiB0aGlzW2tDbGllbnRzXS52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgY2xpZW50ID0gcmVmLmRlcmVmKClcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBnYyBpcyB1bmRldGVybWluaXN0aWMgKi9cbiAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgZGVzdHJveVByb21pc2VzLnB1c2goY2xpZW50LmRlc3Ryb3koZXJyKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChkZXN0cm95UHJvbWlzZXMpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBZ2VudFxuIiwKICAgICIvLyBQb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9wdWxsLzkwN1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgUmVhZGFibGUgfSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCB7IFJlcXVlc3RBYm9ydGVkRXJyb3IsIE5vdFN1cHBvcnRlZEVycm9yLCBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IFJlYWRhYmxlU3RyZWFtRnJvbSwgdG9VU1ZTdHJpbmcgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmxldCBCbG9iXG5cbmNvbnN0IGtDb25zdW1lID0gU3ltYm9sKCdrQ29uc3VtZScpXG5jb25zdCBrUmVhZGluZyA9IFN5bWJvbCgna1JlYWRpbmcnKVxuY29uc3Qga0JvZHkgPSBTeW1ib2woJ2tCb2R5JylcbmNvbnN0IGtBYm9ydCA9IFN5bWJvbCgnYWJvcnQnKVxuY29uc3Qga0NvbnRlbnRUeXBlID0gU3ltYm9sKCdrQ29udGVudFR5cGUnKVxuXG5jb25zdCBub29wID0gKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBCb2R5UmVhZGFibGUgZXh0ZW5kcyBSZWFkYWJsZSB7XG4gIGNvbnN0cnVjdG9yICh7XG4gICAgcmVzdW1lLFxuICAgIGFib3J0LFxuICAgIGNvbnRlbnRUeXBlID0gJycsXG4gICAgaGlnaFdhdGVyTWFyayA9IDY0ICogMTAyNCAvLyBTYW1lIGFzIG5vZGVqcyBmcyBzdHJlYW1zLlxuICB9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgYXV0b0Rlc3Ryb3k6IHRydWUsXG4gICAgICByZWFkOiByZXN1bWUsXG4gICAgICBoaWdoV2F0ZXJNYXJrXG4gICAgfSlcblxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGF0YUVtaXR0ZWQgPSBmYWxzZVxuXG4gICAgdGhpc1trQWJvcnRdID0gYWJvcnRcbiAgICB0aGlzW2tDb25zdW1lXSA9IG51bGxcbiAgICB0aGlzW2tCb2R5XSA9IG51bGxcbiAgICB0aGlzW2tDb250ZW50VHlwZV0gPSBjb250ZW50VHlwZVxuXG4gICAgLy8gSXMgc3RyZWFtIGJlaW5nIGNvbnN1bWVkIHRocm91Z2ggUmVhZGFibGUgQVBJP1xuICAgIC8vIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHRoYXQgd2UgYXZvaWQgY2hlY2tpbmdcbiAgICAvLyBmb3IgJ2RhdGEnIGFuZCAncmVhZGFibGUnIGxpc3RlbmVycyBpbiB0aGUgaG90IHBhdGhcbiAgICAvLyBpbnNpZGUgcHVzaCgpLlxuICAgIHRoaXNba1JlYWRpbmddID0gZmFsc2VcbiAgfVxuXG4gIGRlc3Ryb3kgKGVycikge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgLy8gTm9kZSA8IDE2XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGlmICghZXJyICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgIGVyciA9IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aGlzW2tBYm9ydF0oKVxuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5kZXN0cm95KGVycilcbiAgfVxuXG4gIGVtaXQgKGV2LCAuLi5hcmdzKSB7XG4gICAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAgIC8vIE5vZGUgPCAxNi43XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRhdGFFbWl0dGVkID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoZXYgPT09ICdlcnJvcicpIHtcbiAgICAgIC8vIE5vZGUgPCAxNlxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlXG4gICAgfVxuICAgIHJldHVybiBzdXBlci5lbWl0KGV2LCAuLi5hcmdzKVxuICB9XG5cbiAgb24gKGV2LCAuLi5hcmdzKSB7XG4gICAgaWYgKGV2ID09PSAnZGF0YScgfHwgZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgIHRoaXNba1JlYWRpbmddID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXIub24oZXYsIC4uLmFyZ3MpXG4gIH1cblxuICBhZGRMaXN0ZW5lciAoZXYsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5vbihldiwgLi4uYXJncylcbiAgfVxuXG4gIG9mZiAoZXYsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZXQgPSBzdXBlci5vZmYoZXYsIC4uLmFyZ3MpXG4gICAgaWYgKGV2ID09PSAnZGF0YScgfHwgZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgIHRoaXNba1JlYWRpbmddID0gKFxuICAgICAgICB0aGlzLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA+IDAgfHxcbiAgICAgICAgdGhpcy5saXN0ZW5lckNvdW50KCdyZWFkYWJsZScpID4gMFxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICByZW1vdmVMaXN0ZW5lciAoZXYsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5vZmYoZXYsIC4uLmFyZ3MpXG4gIH1cblxuICBwdXNoIChjaHVuaykge1xuICAgIGlmICh0aGlzW2tDb25zdW1lXSAmJiBjaHVuayAhPT0gbnVsbCAmJiB0aGlzLnJlYWRhYmxlTGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdW1lUHVzaCh0aGlzW2tDb25zdW1lXSwgY2h1bmspXG4gICAgICByZXR1cm4gdGhpc1trUmVhZGluZ10gPyBzdXBlci5wdXNoKGNodW5rKSA6IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnB1c2goY2h1bmspXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktdGV4dFxuICBhc3luYyB0ZXh0ICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAndGV4dCcpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktanNvblxuICBhc3luYyBqc29uICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAnanNvbicpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktYmxvYlxuICBhc3luYyBibG9iICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAnYmxvYicpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktYXJyYXlidWZmZXJcbiAgYXN5bmMgYXJyYXlCdWZmZXIgKCkge1xuICAgIHJldHVybiBjb25zdW1lKHRoaXMsICdhcnJheUJ1ZmZlcicpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktZm9ybWRhdGFcbiAgYXN5bmMgZm9ybURhdGEgKCkge1xuICAgIC8vIFRPRE86IEltcGxlbWVudC5cbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXJyb3IoKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWJvZHl1c2VkXG4gIGdldCBib2R5VXNlZCAoKSB7XG4gICAgcmV0dXJuIHV0aWwuaXNEaXN0dXJiZWQodGhpcylcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tYm9keS1ib2R5XG4gIGdldCBib2R5ICgpIHtcbiAgICBpZiAoIXRoaXNba0JvZHldKSB7XG4gICAgICB0aGlzW2tCb2R5XSA9IFJlYWRhYmxlU3RyZWFtRnJvbSh0aGlzKVxuICAgICAgaWYgKHRoaXNba0NvbnN1bWVdKSB7XG4gICAgICAgIC8vIFRPRE86IElzIHRoaXMgdGhlIGJlc3Qgd2F5IHRvIGZvcmNlIGEgbG9jaz9cbiAgICAgICAgdGhpc1trQm9keV0uZ2V0UmVhZGVyKCkgLy8gRW5zdXJlIHN0cmVhbSBpcyBsb2NrZWQuXG4gICAgICAgIGFzc2VydCh0aGlzW2tCb2R5XS5sb2NrZWQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzW2tCb2R5XVxuICB9XG5cbiAgZHVtcCAob3B0cykge1xuICAgIGxldCBsaW1pdCA9IG9wdHMgJiYgTnVtYmVyLmlzRmluaXRlKG9wdHMubGltaXQpID8gb3B0cy5saW1pdCA6IDI2MjE0NFxuICAgIGNvbnN0IHNpZ25hbCA9IG9wdHMgJiYgb3B0cy5zaWduYWxcblxuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2lnbmFsICE9PSAnb2JqZWN0JyB8fCAhKCdhYm9ydGVkJyBpbiBzaWduYWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBBYm9ydFNpZ25hbCcpXG4gICAgICAgIH1cbiAgICAgICAgdXRpbC50aHJvd0lmQWJvcnRlZChzaWduYWwpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbClcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsTGlzdGVuZXJDbGVhbnVwID0gc2lnbmFsXG4gICAgICAgID8gdXRpbC5hZGRBYm9ydExpc3RlbmVyKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVzdHJveSgpXG4gICAgICAgIH0pXG4gICAgICAgIDogbm9vcFxuXG4gICAgICB0aGlzXG4gICAgICAgIC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2lnbmFsTGlzdGVuZXJDbGVhbnVwKClcbiAgICAgICAgICBpZiAoc2lnbmFsICYmIHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICByZWplY3Qoc2lnbmFsLnJlYXNvbiB8fCBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCcpLCB7IG5hbWU6ICdBYm9ydEVycm9yJyB9KSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIG5vb3ApXG4gICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgIGxpbWl0IC09IGNodW5rLmxlbmd0aFxuICAgICAgICAgIGlmIChsaW1pdCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnJlc3VtZSgpXG4gICAgfSlcbiAgfVxufVxuXG4vLyBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkYWJsZXN0cmVhbS1sb2NrZWRcbmZ1bmN0aW9uIGlzTG9ja2VkIChzZWxmKSB7XG4gIC8vIENvbnN1bWUgaXMgYW4gaW1wbGljaXQgbG9jay5cbiAgcmV0dXJuIChzZWxmW2tCb2R5XSAmJiBzZWxmW2tCb2R5XS5sb2NrZWQgPT09IHRydWUpIHx8IHNlbGZba0NvbnN1bWVdXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5LXVudXNhYmxlXG5mdW5jdGlvbiBpc1VudXNhYmxlIChzZWxmKSB7XG4gIHJldHVybiB1dGlsLmlzRGlzdHVyYmVkKHNlbGYpIHx8IGlzTG9ja2VkKHNlbGYpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnN1bWUgKHN0cmVhbSwgdHlwZSkge1xuICBpZiAoaXNVbnVzYWJsZShzdHJlYW0pKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW51c2FibGUnKVxuICB9XG5cbiAgYXNzZXJ0KCFzdHJlYW1ba0NvbnN1bWVdKVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc3RyZWFtW2tDb25zdW1lXSA9IHtcbiAgICAgIHR5cGUsXG4gICAgICBzdHJlYW0sXG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgYm9keTogW11cbiAgICB9XG5cbiAgICBzdHJlYW1cbiAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGNvbnN1bWVGaW5pc2godGhpc1trQ29uc3VtZV0sIGVycilcbiAgICAgIH0pXG4gICAgICAub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpc1trQ29uc3VtZV0uYm9keSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN1bWVGaW5pc2godGhpc1trQ29uc3VtZV0sIG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKCkpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICBwcm9jZXNzLm5leHRUaWNrKGNvbnN1bWVTdGFydCwgc3RyZWFtW2tDb25zdW1lXSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gY29uc3VtZVN0YXJ0IChjb25zdW1lKSB7XG4gIGlmIChjb25zdW1lLmJvZHkgPT09IG51bGwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgX3JlYWRhYmxlU3RhdGU6IHN0YXRlIH0gPSBjb25zdW1lLnN0cmVhbVxuXG4gIGZvciAoY29uc3QgY2h1bmsgb2Ygc3RhdGUuYnVmZmVyKSB7XG4gICAgY29uc3VtZVB1c2goY29uc3VtZSwgY2h1bmspXG4gIH1cblxuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIGNvbnN1bWVFbmQodGhpc1trQ29uc3VtZV0pXG4gIH0gZWxzZSB7XG4gICAgY29uc3VtZS5zdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN1bWVFbmQodGhpc1trQ29uc3VtZV0pXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN1bWUuc3RyZWFtLnJlc3VtZSgpXG5cbiAgd2hpbGUgKGNvbnN1bWUuc3RyZWFtLnJlYWQoKSAhPSBudWxsKSB7XG4gICAgLy8gTG9vcFxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVFbmQgKGNvbnN1bWUpIHtcbiAgY29uc3QgeyB0eXBlLCBib2R5LCByZXNvbHZlLCBzdHJlYW0sIGxlbmd0aCB9ID0gY29uc3VtZVxuXG4gIHRyeSB7XG4gICAgaWYgKHR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcmVzb2x2ZSh0b1VTVlN0cmluZyhCdWZmZXIuY29uY2F0KGJvZHkpKSlcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdqc29uJykge1xuICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKEJ1ZmZlci5jb25jYXQoYm9keSkpKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FycmF5QnVmZmVyJykge1xuICAgICAgY29uc3QgZHN0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuXG4gICAgICBsZXQgcG9zID0gMFxuICAgICAgZm9yIChjb25zdCBidWYgb2YgYm9keSkge1xuICAgICAgICBkc3Quc2V0KGJ1ZiwgcG9zKVxuICAgICAgICBwb3MgKz0gYnVmLmJ5dGVMZW5ndGhcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZShkc3QuYnVmZmVyKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgICBpZiAoIUJsb2IpIHtcbiAgICAgICAgQmxvYiA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJsb2JcbiAgICAgIH1cbiAgICAgIHJlc29sdmUobmV3IEJsb2IoYm9keSwgeyB0eXBlOiBzdHJlYW1ba0NvbnRlbnRUeXBlXSB9KSlcbiAgICB9XG5cbiAgICBjb25zdW1lRmluaXNoKGNvbnN1bWUpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdW1lUHVzaCAoY29uc3VtZSwgY2h1bmspIHtcbiAgY29uc3VtZS5sZW5ndGggKz0gY2h1bmsubGVuZ3RoXG4gIGNvbnN1bWUuYm9keS5wdXNoKGNodW5rKVxufVxuXG5mdW5jdGlvbiBjb25zdW1lRmluaXNoIChjb25zdW1lLCBlcnIpIHtcbiAgaWYgKGNvbnN1bWUuYm9keSA9PT0gbnVsbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGVycikge1xuICAgIGNvbnN1bWUucmVqZWN0KGVycilcbiAgfSBlbHNlIHtcbiAgICBjb25zdW1lLnJlc29sdmUoKVxuICB9XG5cbiAgY29uc3VtZS50eXBlID0gbnVsbFxuICBjb25zdW1lLnN0cmVhbSA9IG51bGxcbiAgY29uc3VtZS5yZXNvbHZlID0gbnVsbFxuICBjb25zdW1lLnJlamVjdCA9IG51bGxcbiAgY29uc3VtZS5sZW5ndGggPSAwXG4gIGNvbnN1bWUuYm9keSA9IG51bGxcbn1cbiIsCiAgICAiY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHtcbiAgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IHRvVVNWU3RyaW5nIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuXG5hc3luYyBmdW5jdGlvbiBnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2sgKHsgY2FsbGJhY2ssIGJvZHksIGNvbnRlbnRUeXBlLCBzdGF0dXNDb2RlLCBzdGF0dXNNZXNzYWdlLCBoZWFkZXJzIH0pIHtcbiAgYXNzZXJ0KGJvZHkpXG5cbiAgbGV0IGNodW5rcyA9IFtdXG4gIGxldCBsaW1pdCA9IDBcblxuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGJvZHkpIHtcbiAgICBjaHVua3MucHVzaChjaHVuaylcbiAgICBsaW1pdCArPSBjaHVuay5sZW5ndGhcbiAgICBpZiAobGltaXQgPiAxMjggKiAxMDI0KSB7XG4gICAgICBjaHVua3MgPSBudWxsXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0dXNDb2RlID09PSAyMDQgfHwgIWNvbnRlbnRUeXBlIHx8ICFjaHVua3MpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBuZXcgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IoYFJlc3BvbnNlIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0ke3N0YXR1c01lc3NhZ2UgPyBgOiAke3N0YXR1c01lc3NhZ2V9YCA6ICcnfWAsIHN0YXR1c0NvZGUsIGhlYWRlcnMpKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoY29udGVudFR5cGUuc3RhcnRzV2l0aCgnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZSh0b1VTVlN0cmluZyhCdWZmZXIuY29uY2F0KGNodW5rcykpKVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaywgbmV3IFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKGBSZXNwb25zZSBzdGF0dXMgY29kZSAke3N0YXR1c0NvZGV9JHtzdGF0dXNNZXNzYWdlID8gYDogJHtzdGF0dXNNZXNzYWdlfWAgOiAnJ31gLCBzdGF0dXNDb2RlLCBoZWFkZXJzLCBwYXlsb2FkKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjb250ZW50VHlwZS5zdGFydHNXaXRoKCd0ZXh0LycpKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdG9VU1ZTdHJpbmcoQnVmZmVyLmNvbmNhdChjaHVua3MpKVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaywgbmV3IFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKGBSZXNwb25zZSBzdGF0dXMgY29kZSAke3N0YXR1c0NvZGV9JHtzdGF0dXNNZXNzYWdlID8gYDogJHtzdGF0dXNNZXNzYWdlfWAgOiAnJ31gLCBzdGF0dXNDb2RlLCBoZWFkZXJzLCBwYXlsb2FkKSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gUHJvY2VzcyBpbiBhIGZhbGxiYWNrIGlmIGVycm9yXG4gIH1cblxuICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBuZXcgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IoYFJlc3BvbnNlIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0ke3N0YXR1c01lc3NhZ2UgPyBgOiAke3N0YXR1c01lc3NhZ2V9YCA6ICcnfWAsIHN0YXR1c0NvZGUsIGhlYWRlcnMpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrIH1cbiIsCiAgICAiY29uc3QgeyBhZGRBYm9ydExpc3RlbmVyIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBSZXF1ZXN0QWJvcnRlZEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbmNvbnN0IGtMaXN0ZW5lciA9IFN5bWJvbCgna0xpc3RlbmVyJylcbmNvbnN0IGtTaWduYWwgPSBTeW1ib2woJ2tTaWduYWwnKVxuXG5mdW5jdGlvbiBhYm9ydCAoc2VsZikge1xuICBpZiAoc2VsZi5hYm9ydCkge1xuICAgIHNlbGYuYWJvcnQoKVxuICB9IGVsc2Uge1xuICAgIHNlbGYub25FcnJvcihuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFNpZ25hbCAoc2VsZiwgc2lnbmFsKSB7XG4gIHNlbGZba1NpZ25hbF0gPSBudWxsXG4gIHNlbGZba0xpc3RlbmVyXSA9IG51bGxcblxuICBpZiAoIXNpZ25hbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgYWJvcnQoc2VsZilcbiAgICByZXR1cm5cbiAgfVxuXG4gIHNlbGZba1NpZ25hbF0gPSBzaWduYWxcbiAgc2VsZltrTGlzdGVuZXJdID0gKCkgPT4ge1xuICAgIGFib3J0KHNlbGYpXG4gIH1cblxuICBhZGRBYm9ydExpc3RlbmVyKHNlbGZba1NpZ25hbF0sIHNlbGZba0xpc3RlbmVyXSlcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2lnbmFsIChzZWxmKSB7XG4gIGlmICghc2VsZltrU2lnbmFsXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKCdyZW1vdmVFdmVudExpc3RlbmVyJyBpbiBzZWxmW2tTaWduYWxdKSB7XG4gICAgc2VsZltrU2lnbmFsXS5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHNlbGZba0xpc3RlbmVyXSlcbiAgfSBlbHNlIHtcbiAgICBzZWxmW2tTaWduYWxdLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIHNlbGZba0xpc3RlbmVyXSlcbiAgfVxuXG4gIHNlbGZba1NpZ25hbF0gPSBudWxsXG4gIHNlbGZba0xpc3RlbmVyXSA9IG51bGxcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFkZFNpZ25hbCxcbiAgcmVtb3ZlU2lnbmFsXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vcmVhZGFibGUnKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2sgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEFzeW5jUmVzb3VyY2UgfSA9IHJlcXVpcmUoJ2FzeW5jX2hvb2tzJylcbmNvbnN0IHsgYWRkU2lnbmFsLCByZW1vdmVTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWJvcnQtc2lnbmFsJylcblxuY2xhc3MgUmVxdWVzdEhhbmRsZXIgZXh0ZW5kcyBBc3luY1Jlc291cmNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBtZXRob2QsIG9wYXF1ZSwgYm9keSwgb25JbmZvLCByZXNwb25zZUhlYWRlcnMsIHRocm93T25FcnJvciwgaGlnaFdhdGVyTWFyayB9ID0gb3B0c1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICAgIH1cblxuICAgICAgaWYgKGhpZ2hXYXRlck1hcmsgJiYgKHR5cGVvZiBoaWdoV2F0ZXJNYXJrICE9PSAnbnVtYmVyJyB8fCBoaWdoV2F0ZXJNYXJrIDwgMCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGhpZ2hXYXRlck1hcmsnKVxuICAgICAgfVxuXG4gICAgICBpZiAoc2lnbmFsICYmIHR5cGVvZiBzaWduYWwub24gIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gRXZlbnRFbWl0dGVyIG9yIEV2ZW50VGFyZ2V0JylcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBtZXRob2QnKVxuICAgICAgfVxuXG4gICAgICBpZiAob25JbmZvICYmIHR5cGVvZiBvbkluZm8gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSW5mbyBjYWxsYmFjaycpXG4gICAgICB9XG5cbiAgICAgIHN1cGVyKCdVTkRJQ0lfUkVRVUVTVCcpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgICAgICB1dGlsLmRlc3Ryb3koYm9keS5vbignZXJyb3InLCB1dGlsLm5vcCksIGVycilcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cblxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgdGhpcy5yZXMgPSBudWxsXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgdGhpcy50cmFpbGVycyA9IHt9XG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbFxuICAgIHRoaXMub25JbmZvID0gb25JbmZvIHx8IG51bGxcbiAgICB0aGlzLnRocm93T25FcnJvciA9IHRocm93T25FcnJvclxuICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IGhpZ2hXYXRlck1hcmtcblxuICAgIGlmICh1dGlsLmlzU3RyZWFtKGJvZHkpKSB7XG4gICAgICBib2R5Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycilcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgYWRkU2lnbmFsKHRoaXMsIHNpZ25hbClcbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQsIGNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuY2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHJlc3VtZSwgc3RhdHVzTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgY2FsbGJhY2ssIG9wYXF1ZSwgYWJvcnQsIGNvbnRleHQsIHJlc3BvbnNlSGVhZGVycywgaGlnaFdhdGVyTWFyayB9ID0gdGhpc1xuXG4gICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgaWYgKHRoaXMub25JbmZvKSB7XG4gICAgICAgIHRoaXMub25JbmZvKHsgc3RhdHVzQ29kZSwgaGVhZGVycyB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSA6IGhlYWRlcnNcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHBhcnNlZEhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddXG4gICAgY29uc3QgYm9keSA9IG5ldyBSZWFkYWJsZSh7IHJlc3VtZSwgYWJvcnQsIGNvbnRlbnRUeXBlLCBoaWdoV2F0ZXJNYXJrIH0pXG5cbiAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgIHRoaXMucmVzID0gYm9keVxuICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMudGhyb3dPbkVycm9yICYmIHN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGdldFJlc29sdmVFcnJvckJvZHlDYWxsYmFjaywgbnVsbCxcbiAgICAgICAgICB7IGNhbGxiYWNrLCBib2R5LCBjb250ZW50VHlwZSwgc3RhdHVzQ29kZSwgc3RhdHVzTWVzc2FnZSwgaGVhZGVycyB9XG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGNhbGxiYWNrLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIHRyYWlsZXJzOiB0aGlzLnRyYWlsZXJzLFxuICAgICAgICAgIG9wYXF1ZSxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRhdGEgKGNodW5rKSB7XG4gICAgY29uc3QgeyByZXMgfSA9IHRoaXNcbiAgICByZXR1cm4gcmVzLnB1c2goY2h1bmspXG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIGNvbnN0IHsgcmVzIH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIHV0aWwucGFyc2VIZWFkZXJzKHRyYWlsZXJzLCB0aGlzLnRyYWlsZXJzKVxuXG4gICAgcmVzLnB1c2gobnVsbClcbiAgfVxuXG4gIG9uRXJyb3IgKGVycikge1xuICAgIGNvbnN0IHsgcmVzLCBjYWxsYmFjaywgYm9keSwgb3BhcXVlIH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgLy8gVE9ETzogRG9lcyB0aGlzIG5lZWQgcXVldWVNaWNyb3Rhc2s/XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLnJlcyA9IG51bGxcbiAgICAgIC8vIEVuc3VyZSBhbGwgcXVldWVkIGhhbmRsZXJzIGFyZSBpbnZva2VkIGJlZm9yZSBkZXN0cm95aW5nIHJlcy5cbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdXRpbC5kZXN0cm95KHJlcywgZXJyKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbFxuICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdCAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVxdWVzdC5jYWxsKHRoaXMsIG9wdHMsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICB0aGlzLmRpc3BhdGNoKG9wdHMsIG5ldyBSZXF1ZXN0SGFuZGxlcihvcHRzLCBjYWxsYmFjaykpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVlc3Rcbm1vZHVsZS5leHBvcnRzLlJlcXVlc3RIYW5kbGVyID0gUmVxdWVzdEhhbmRsZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgZmluaXNoZWQsIFBhc3NUaHJvdWdoIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgSW52YWxpZFJldHVyblZhbHVlRXJyb3IsXG4gIFJlcXVlc3RBYm9ydGVkRXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5cbmNsYXNzIFN0cmVhbUhhbmRsZXIgZXh0ZW5kcyBBc3luY1Jlc291cmNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMsIGZhY3RvcnksIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBtZXRob2QsIG9wYXF1ZSwgYm9keSwgb25JbmZvLCByZXNwb25zZUhlYWRlcnMsIHRocm93T25FcnJvciB9ID0gb3B0c1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBmYWN0b3J5JylcbiAgICAgIH1cblxuICAgICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NpZ25hbCBtdXN0IGJlIGFuIEV2ZW50RW1pdHRlciBvciBFdmVudFRhcmdldCcpXG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgbWV0aG9kJylcbiAgICAgIH1cblxuICAgICAgaWYgKG9uSW5mbyAmJiB0eXBlb2Ygb25JbmZvICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkluZm8gY2FsbGJhY2snKVxuICAgICAgfVxuXG4gICAgICBzdXBlcignVU5ESUNJX1NUUkVBTScpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgICAgICB1dGlsLmRlc3Ryb3koYm9keS5vbignZXJyb3InLCB1dGlsLm5vcCksIGVycilcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cblxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeVxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMucmVzID0gbnVsbFxuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbFxuICAgIHRoaXMudHJhaWxlcnMgPSBudWxsXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICAgIHRoaXMub25JbmZvID0gb25JbmZvIHx8IG51bGxcbiAgICB0aGlzLnRocm93T25FcnJvciA9IHRocm93T25FcnJvciB8fCBmYWxzZVxuXG4gICAgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIGJvZHkub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICghdGhpcy5jYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgcmVzdW1lLCBzdGF0dXNNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBmYWN0b3J5LCBvcGFxdWUsIGNvbnRleHQsIGNhbGxiYWNrLCByZXNwb25zZUhlYWRlcnMgfSA9IHRoaXNcblxuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIGlmICh0aGlzLm9uSW5mbykge1xuICAgICAgICB0aGlzLm9uSW5mbyh7IHN0YXR1c0NvZGUsIGhlYWRlcnMgfSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZmFjdG9yeSA9IG51bGxcblxuICAgIGxldCByZXNcblxuICAgIGlmICh0aGlzLnRocm93T25FcnJvciAmJiBzdGF0dXNDb2RlID49IDQwMCkge1xuICAgICAgY29uc3QgcGFyc2VkSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSA6IGhlYWRlcnNcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcGFyc2VkSGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgICAgIHJlcyA9IG5ldyBQYXNzVGhyb3VnaCgpXG5cbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2ssIG51bGwsXG4gICAgICAgIHsgY2FsbGJhY2ssIGJvZHk6IHJlcywgY29udGVudFR5cGUsIHN0YXR1c0NvZGUsIHN0YXR1c01lc3NhZ2UsIGhlYWRlcnMgfVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZmFjdG9yeSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVzID0gdGhpcy5ydW5JbkFzeW5jU2NvcGUoZmFjdG9yeSwgbnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBvcGFxdWUsXG4gICAgICAgIGNvbnRleHRcbiAgICAgIH0pXG5cbiAgICAgIGlmIChcbiAgICAgICAgIXJlcyB8fFxuICAgICAgICB0eXBlb2YgcmVzLndyaXRlICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiByZXMuZW5kICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiByZXMub24gIT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJldHVyblZhbHVlRXJyb3IoJ2V4cGVjdGVkIFdyaXRhYmxlJylcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogQXZvaWQgZmluaXNoZWQuIEl0IHJlZ2lzdGVycyBhbiB1bm5lY2Vzc2FyeSBhbW91bnQgb2YgbGlzdGVuZXJzLlxuICAgICAgZmluaXNoZWQocmVzLCB7IHJlYWRhYmxlOiBmYWxzZSB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHJlcywgb3BhcXVlLCB0cmFpbGVycywgYWJvcnQgfSA9IHRoaXNcblxuICAgICAgICB0aGlzLnJlcyA9IG51bGxcbiAgICAgICAgaWYgKGVyciB8fCAhcmVzLnJlYWRhYmxlKSB7XG4gICAgICAgICAgdXRpbC5kZXN0cm95KHJlcywgZXJyKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIGVyciB8fCBudWxsLCB7IG9wYXF1ZSwgdHJhaWxlcnMgfSlcblxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgYWJvcnQoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIHJlcy5vbignZHJhaW4nLCByZXN1bWUpXG5cbiAgICB0aGlzLnJlcyA9IHJlc1xuXG4gICAgY29uc3QgbmVlZERyYWluID0gcmVzLndyaXRhYmxlTmVlZERyYWluICE9PSB1bmRlZmluZWRcbiAgICAgID8gcmVzLndyaXRhYmxlTmVlZERyYWluXG4gICAgICA6IHJlcy5fd3JpdGFibGVTdGF0ZSAmJiByZXMuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluXG5cbiAgICByZXR1cm4gbmVlZERyYWluICE9PSB0cnVlXG4gIH1cblxuICBvbkRhdGEgKGNodW5rKSB7XG4gICAgY29uc3QgeyByZXMgfSA9IHRoaXNcblxuICAgIHJldHVybiByZXMgPyByZXMud3JpdGUoY2h1bmspIDogdHJ1ZVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICBpZiAoIXJlcykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy50cmFpbGVycyA9IHV0aWwucGFyc2VIZWFkZXJzKHRyYWlsZXJzKVxuXG4gICAgcmVzLmVuZCgpXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IHJlcywgY2FsbGJhY2ssIG9wYXF1ZSwgYm9keSB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICB0aGlzLmZhY3RvcnkgPSBudWxsXG5cbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLnJlcyA9IG51bGxcbiAgICAgIHV0aWwuZGVzdHJveShyZXMsIGVycilcbiAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbFxuICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyZWFtIChvcHRzLCBmYWN0b3J5LCBjYWxsYmFjaykge1xuICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzdHJlYW0uY2FsbCh0aGlzLCBvcHRzLCBmYWN0b3J5LCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgdGhpcy5kaXNwYXRjaChvcHRzLCBuZXcgU3RyZWFtSGFuZGxlcihvcHRzLCBmYWN0b3J5LCBjYWxsYmFjaykpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmVhbVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBSZWFkYWJsZSxcbiAgRHVwbGV4LFxuICBQYXNzVGhyb3VnaFxufSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCB7XG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCBrUmVzdW1lID0gU3ltYm9sKCdyZXN1bWUnKVxuXG5jbGFzcyBQaXBlbGluZVJlcXVlc3QgZXh0ZW5kcyBSZWFkYWJsZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcih7IGF1dG9EZXN0cm95OiB0cnVlIH0pXG5cbiAgICB0aGlzW2tSZXN1bWVdID0gbnVsbFxuICB9XG5cbiAgX3JlYWQgKCkge1xuICAgIGNvbnN0IHsgW2tSZXN1bWVdOiByZXN1bWUgfSA9IHRoaXNcblxuICAgIGlmIChyZXN1bWUpIHtcbiAgICAgIHRoaXNba1Jlc3VtZV0gPSBudWxsXG4gICAgICByZXN1bWUoKVxuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95IChlcnIsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fcmVhZCgpXG5cbiAgICBjYWxsYmFjayhlcnIpXG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmVSZXNwb25zZSBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKHJlc3VtZSkge1xuICAgIHN1cGVyKHsgYXV0b0Rlc3Ryb3k6IHRydWUgfSlcbiAgICB0aGlzW2tSZXN1bWVdID0gcmVzdW1lXG4gIH1cblxuICBfcmVhZCAoKSB7XG4gICAgdGhpc1trUmVzdW1lXSgpXG4gIH1cblxuICBfZGVzdHJveSAoZXJyLCBjYWxsYmFjaykge1xuICAgIGlmICghZXJyICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgIGVyciA9IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICBjYWxsYmFjayhlcnIpXG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmVIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGhhbmRsZXInKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBtZXRob2QsIG9wYXF1ZSwgb25JbmZvLCByZXNwb25zZUhlYWRlcnMgfSA9IG9wdHNcblxuICAgIGlmIChzaWduYWwgJiYgdHlwZW9mIHNpZ25hbC5vbiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gRXZlbnRFbWl0dGVyIG9yIEV2ZW50VGFyZ2V0JylcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBtZXRob2QnKVxuICAgIH1cblxuICAgIGlmIChvbkluZm8gJiYgdHlwZW9mIG9uSW5mbyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSW5mbyBjYWxsYmFjaycpXG4gICAgfVxuXG4gICAgc3VwZXIoJ1VORElDSV9QSVBFTElORScpXG5cbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbFxuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgICB0aGlzLmFib3J0ID0gbnVsbFxuICAgIHRoaXMuY29udGV4dCA9IG51bGxcbiAgICB0aGlzLm9uSW5mbyA9IG9uSW5mbyB8fCBudWxsXG5cbiAgICB0aGlzLnJlcSA9IG5ldyBQaXBlbGluZVJlcXVlc3QoKS5vbignZXJyb3InLCB1dGlsLm5vcClcblxuICAgIHRoaXMucmV0ID0gbmV3IER1cGxleCh7XG4gICAgICByZWFkYWJsZU9iamVjdE1vZGU6IG9wdHMub2JqZWN0TW9kZSxcbiAgICAgIGF1dG9EZXN0cm95OiB0cnVlLFxuICAgICAgcmVhZDogKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGJvZHkgfSA9IHRoaXNcblxuICAgICAgICBpZiAoYm9keSAmJiBib2R5LnJlc3VtZSkge1xuICAgICAgICAgIGJvZHkucmVzdW1lKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdyaXRlOiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcSB9ID0gdGhpc1xuXG4gICAgICAgIGlmIChyZXEucHVzaChjaHVuaywgZW5jb2RpbmcpIHx8IHJlcS5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVxW2tSZXN1bWVdID0gY2FsbGJhY2tcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlc3Ryb3k6IChlcnIsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYm9keSwgcmVxLCByZXMsIHJldCwgYWJvcnQgfSA9IHRoaXNcblxuICAgICAgICBpZiAoIWVyciAmJiAhcmV0Ll9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgICAgICBlcnIgPSBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWJvcnQgJiYgZXJyKSB7XG4gICAgICAgICAgYWJvcnQoKVxuICAgICAgICB9XG5cbiAgICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICAgICAgdXRpbC5kZXN0cm95KHJlcSwgZXJyKVxuICAgICAgICB1dGlsLmRlc3Ryb3kocmVzLCBlcnIpXG5cbiAgICAgICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgfVxuICAgIH0pLm9uKCdwcmVmaW5pc2gnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlcSB9ID0gdGhpc1xuXG4gICAgICAvLyBOb2RlIDwgMTUgZG9lcyBub3QgY2FsbCBfZmluYWwgaW4gc2FtZSB0aWNrLlxuICAgICAgcmVxLnB1c2gobnVsbClcbiAgICB9KVxuXG4gICAgdGhpcy5yZXMgPSBudWxsXG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgcmV0LCByZXMgfSA9IHRoaXNcblxuICAgIGFzc2VydCghcmVzLCAncGlwZWxpbmUgY2Fubm90IGJlIHJldHJpZWQnKVxuXG4gICAgaWYgKHJldC5kZXN0cm95ZWQpIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHJlc3VtZSkge1xuICAgIGNvbnN0IHsgb3BhcXVlLCBoYW5kbGVyLCBjb250ZXh0IH0gPSB0aGlzXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgaWYgKHRoaXMub25JbmZvKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG4gICAgICAgIHRoaXMub25JbmZvKHsgc3RhdHVzQ29kZSwgaGVhZGVycyB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5yZXMgPSBuZXcgUGlwZWxpbmVSZXNwb25zZShyZXN1bWUpXG5cbiAgICBsZXQgYm9keVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmhhbmRsZXIgPSBudWxsXG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5yZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuICAgICAgYm9keSA9IHRoaXMucnVuSW5Bc3luY1Njb3BlKGhhbmRsZXIsIG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgb3BhcXVlLFxuICAgICAgICBib2R5OiB0aGlzLnJlcyxcbiAgICAgICAgY29udGV4dFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMucmVzLm9uKCdlcnJvcicsIHV0aWwubm9wKVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5Lm9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFJldHVyblZhbHVlRXJyb3IoJ2V4cGVjdGVkIFJlYWRhYmxlJylcbiAgICB9XG5cbiAgICBib2R5XG4gICAgICAub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgY29uc3QgeyByZXQsIGJvZHkgfSA9IHRoaXNcblxuICAgICAgICBpZiAoIXJldC5wdXNoKGNodW5rKSAmJiBib2R5LnBhdXNlKSB7XG4gICAgICAgICAgYm9keS5wYXVzZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICBjb25zdCB7IHJldCB9ID0gdGhpc1xuXG4gICAgICAgIHV0aWwuZGVzdHJveShyZXQsIGVycilcbiAgICAgIH0pXG4gICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyByZXQgfSA9IHRoaXNcblxuICAgICAgICByZXQucHVzaChudWxsKVxuICAgICAgfSlcbiAgICAgIC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmV0IH0gPSB0aGlzXG5cbiAgICAgICAgaWYgKCFyZXQuX3JlYWRhYmxlU3RhdGUuZW5kZWQpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3kocmV0LCBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGNvbnN0IHsgcmVzIH0gPSB0aGlzXG4gICAgcmV0dXJuIHJlcy5wdXNoKGNodW5rKVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuICAgIHJlcy5wdXNoKG51bGwpXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IHJldCB9ID0gdGhpc1xuICAgIHRoaXMuaGFuZGxlciA9IG51bGxcbiAgICB1dGlsLmRlc3Ryb3kocmV0LCBlcnIpXG4gIH1cbn1cblxuZnVuY3Rpb24gcGlwZWxpbmUgKG9wdHMsIGhhbmRsZXIpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaXBlbGluZUhhbmRsZXIgPSBuZXcgUGlwZWxpbmVIYW5kbGVyKG9wdHMsIGhhbmRsZXIpXG4gICAgdGhpcy5kaXNwYXRjaCh7IC4uLm9wdHMsIGJvZHk6IHBpcGVsaW5lSGFuZGxlci5yZXEgfSwgcGlwZWxpbmVIYW5kbGVyKVxuICAgIHJldHVybiBwaXBlbGluZUhhbmRsZXIucmV0XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBuZXcgUGFzc1Rocm91Z2goKS5kZXN0cm95KGVycilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBpcGVsaW5lXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBSZXF1ZXN0QWJvcnRlZEVycm9yLCBTb2NrZXRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgYWRkU2lnbmFsLCByZW1vdmVTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWJvcnQtc2lnbmFsJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5cbmNsYXNzIFVwZ3JhZGVIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBvcGFxdWUsIHJlc3BvbnNlSGVhZGVycyB9ID0gb3B0c1xuXG4gICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBFdmVudEVtaXR0ZXIgb3IgRXZlbnRUYXJnZXQnKVxuICAgIH1cblxuICAgIHN1cGVyKCdVTkRJQ0lfVVBHUkFERScpXG5cbiAgICB0aGlzLnJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyB8fCBudWxsXG4gICAgdGhpcy5vcGFxdWUgPSBvcGFxdWUgfHwgbnVsbFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbFxuXG4gICAgYWRkU2lnbmFsKHRoaXMsIHNpZ25hbClcbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQsIGNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuY2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsXG4gIH1cblxuICBvbkhlYWRlcnMgKCkge1xuICAgIHRocm93IG5ldyBTb2NrZXRFcnJvcignYmFkIHVwZ3JhZGUnLCBudWxsKVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCByYXdIZWFkZXJzLCBzb2NrZXQpIHtcbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUsIGNvbnRleHQgfSA9IHRoaXNcblxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzdGF0dXNDb2RlLCAxMDEpXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMucmVzcG9uc2VIZWFkZXJzID09PSAncmF3JyA/IHV0aWwucGFyc2VSYXdIZWFkZXJzKHJhd0hlYWRlcnMpIDogdXRpbC5wYXJzZUhlYWRlcnMocmF3SGVhZGVycylcbiAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgbnVsbCwge1xuICAgICAgaGVhZGVycyxcbiAgICAgIHNvY2tldCxcbiAgICAgIG9wYXF1ZSxcbiAgICAgIGNvbnRleHRcbiAgICB9KVxuICB9XG5cbiAgb25FcnJvciAoZXJyKSB7XG4gICAgY29uc3QgeyBjYWxsYmFjaywgb3BhcXVlIH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIGVyciwgeyBvcGFxdWUgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZ3JhZGUgKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVwZ3JhZGUuY2FsbCh0aGlzLCBvcHRzLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgdXBncmFkZUhhbmRsZXIgPSBuZXcgVXBncmFkZUhhbmRsZXIob3B0cywgY2FsbGJhY2spXG4gICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgbWV0aG9kOiBvcHRzLm1ldGhvZCB8fCAnR0VUJyxcbiAgICAgIHVwZ3JhZGU6IG9wdHMucHJvdG9jb2wgfHwgJ1dlYnNvY2tldCdcbiAgICB9LCB1cGdyYWRlSGFuZGxlcilcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICAgIGNvbnN0IG9wYXF1ZSA9IG9wdHMgJiYgb3B0cy5vcGFxdWVcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhlcnIsIHsgb3BhcXVlIH0pKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdXBncmFkZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBSZXF1ZXN0QWJvcnRlZEVycm9yLCBTb2NrZXRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5cbmNsYXNzIENvbm5lY3RIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBvcGFxdWUsIHJlc3BvbnNlSGVhZGVycyB9ID0gb3B0c1xuXG4gICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBFdmVudEVtaXR0ZXIgb3IgRXZlbnRUYXJnZXQnKVxuICAgIH1cblxuICAgIHN1cGVyKCdVTkRJQ0lfQ09OTkVDVCcpXG5cbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuYWJvcnQgPSBudWxsXG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICghdGhpcy5jYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIG9uSGVhZGVycyAoKSB7XG4gICAgdGhyb3cgbmV3IFNvY2tldEVycm9yKCdiYWQgY29ubmVjdCcsIG51bGwpXG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHNvY2tldCkge1xuICAgIGNvbnN0IHsgY2FsbGJhY2ssIG9wYXF1ZSwgY29udGV4dCB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuXG4gICAgbGV0IGhlYWRlcnMgPSByYXdIZWFkZXJzXG4gICAgLy8gSW5kaWNhdGVzIGlzIGFuIEhUVFAyU2Vzc2lvblxuICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHtcbiAgICAgIGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG4gICAgfVxuXG4gICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzLFxuICAgICAgc29ja2V0LFxuICAgICAgb3BhcXVlLFxuICAgICAgY29udGV4dFxuICAgIH0pXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29ubmVjdCAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29ubmVjdC5jYWxsKHRoaXMsIG9wdHMsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25uZWN0SGFuZGxlciA9IG5ldyBDb25uZWN0SGFuZGxlcihvcHRzLCBjYWxsYmFjaylcbiAgICB0aGlzLmRpc3BhdGNoKHsgLi4ub3B0cywgbWV0aG9kOiAnQ09OTkVDVCcgfSwgY29ubmVjdEhhbmRsZXIpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbm5lY3RcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzLnJlcXVlc3QgPSByZXF1aXJlKCcuL2FwaS1yZXF1ZXN0Jylcbm1vZHVsZS5leHBvcnRzLnN0cmVhbSA9IHJlcXVpcmUoJy4vYXBpLXN0cmVhbScpXG5tb2R1bGUuZXhwb3J0cy5waXBlbGluZSA9IHJlcXVpcmUoJy4vYXBpLXBpcGVsaW5lJylcbm1vZHVsZS5leHBvcnRzLnVwZ3JhZGUgPSByZXF1aXJlKCcuL2FwaS11cGdyYWRlJylcbm1vZHVsZS5leHBvcnRzLmNvbm5lY3QgPSByZXF1aXJlKCcuL2FwaS1jb25uZWN0JylcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgVW5kaWNpRXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcblxuY2xhc3MgTW9ja05vdE1hdGNoZWRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE1vY2tOb3RNYXRjaGVkRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ01vY2tOb3RNYXRjaGVkRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGhlIHJlcXVlc3QgZG9lcyBub3QgbWF0Y2ggYW55IHJlZ2lzdGVyZWQgbW9jayBkaXNwYXRjaGVzJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfTU9DS19FUlJfTU9DS19OT1RfTUFUQ0hFRCdcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTW9ja05vdE1hdGNoZWRFcnJvclxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtBZ2VudDogU3ltYm9sKCdhZ2VudCcpLFxuICBrT3B0aW9uczogU3ltYm9sKCdvcHRpb25zJyksXG4gIGtGYWN0b3J5OiBTeW1ib2woJ2ZhY3RvcnknKSxcbiAga0Rpc3BhdGNoZXM6IFN5bWJvbCgnZGlzcGF0Y2hlcycpLFxuICBrRGlzcGF0Y2hLZXk6IFN5bWJvbCgnZGlzcGF0Y2gga2V5JyksXG4gIGtEZWZhdWx0SGVhZGVyczogU3ltYm9sKCdkZWZhdWx0IGhlYWRlcnMnKSxcbiAga0RlZmF1bHRUcmFpbGVyczogU3ltYm9sKCdkZWZhdWx0IHRyYWlsZXJzJyksXG4gIGtDb250ZW50TGVuZ3RoOiBTeW1ib2woJ2NvbnRlbnQgbGVuZ3RoJyksXG4gIGtNb2NrQWdlbnQ6IFN5bWJvbCgnbW9jayBhZ2VudCcpLFxuICBrTW9ja0FnZW50U2V0OiBTeW1ib2woJ21vY2sgYWdlbnQgc2V0JyksXG4gIGtNb2NrQWdlbnRHZXQ6IFN5bWJvbCgnbW9jayBhZ2VudCBnZXQnKSxcbiAga01vY2tEaXNwYXRjaDogU3ltYm9sKCdtb2NrIGRpc3BhdGNoJyksXG4gIGtDbG9zZTogU3ltYm9sKCdjbG9zZScpLFxuICBrT3JpZ2luYWxDbG9zZTogU3ltYm9sKCdvcmlnaW5hbCBhZ2VudCBjbG9zZScpLFxuICBrT3JpZ2luOiBTeW1ib2woJ29yaWdpbicpLFxuICBrSXNNb2NrQWN0aXZlOiBTeW1ib2woJ2lzIG1vY2sgYWN0aXZlJyksXG4gIGtOZXRDb25uZWN0OiBTeW1ib2woJ25ldCBjb25uZWN0JyksXG4gIGtHZXROZXRDb25uZWN0OiBTeW1ib2woJ2dldCBuZXQgY29ubmVjdCcpLFxuICBrQ29ubmVjdGVkOiBTeW1ib2woJ2Nvbm5lY3RlZCcpXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE1vY2tOb3RNYXRjaGVkRXJyb3IgfSA9IHJlcXVpcmUoJy4vbW9jay1lcnJvcnMnKVxuY29uc3Qge1xuICBrRGlzcGF0Y2hlcyxcbiAga01vY2tBZ2VudCxcbiAga09yaWdpbmFsRGlzcGF0Y2gsXG4gIGtPcmlnaW4sXG4gIGtHZXROZXRDb25uZWN0XG59ID0gcmVxdWlyZSgnLi9tb2NrLXN5bWJvbHMnKVxuY29uc3QgeyBidWlsZFVSTCwgbm9wIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBTVEFUVVNfQ09ERVMgfSA9IHJlcXVpcmUoJ2h0dHAnKVxuY29uc3Qge1xuICB0eXBlczoge1xuICAgIGlzUHJvbWlzZVxuICB9XG59ID0gcmVxdWlyZSgndXRpbCcpXG5cbmZ1bmN0aW9uIG1hdGNoVmFsdWUgKG1hdGNoLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIG1hdGNoID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBtYXRjaCA9PT0gdmFsdWVcbiAgfVxuICBpZiAobWF0Y2ggaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gbWF0Y2gudGVzdCh2YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIG1hdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1hdGNoKHZhbHVlKSA9PT0gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VFbnRyaWVzIChoZWFkZXJzKSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoaGVhZGVycykubWFwKChbaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gW2hlYWRlck5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSwgaGVhZGVyVmFsdWVdXG4gICAgfSlcbiAgKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi9pbmRleCcpLkhlYWRlcnN8c3RyaW5nW118UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaGVhZGVyc1xuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICovXG5mdW5jdGlvbiBnZXRIZWFkZXJCeU5hbWUgKGhlYWRlcnMsIGtleSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgaWYgKGhlYWRlcnNbaV0udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIGhlYWRlcnNbaSArIDFdXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9IGVsc2UgaWYgKHR5cGVvZiBoZWFkZXJzLmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBoZWFkZXJzLmdldChrZXkpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxvd2VyQ2FzZUVudHJpZXMoaGVhZGVycylba2V5LnRvTG9jYWxlTG93ZXJDYXNlKCldXG4gIH1cbn1cblxuLyoqIEBwYXJhbSB7c3RyaW5nW119IGhlYWRlcnMgKi9cbmZ1bmN0aW9uIGJ1aWxkSGVhZGVyc0Zyb21BcnJheSAoaGVhZGVycykgeyAvLyBmZXRjaCBIZWFkZXJzTGlzdFxuICBjb25zdCBjbG9uZSA9IGhlYWRlcnMuc2xpY2UoKVxuICBjb25zdCBlbnRyaWVzID0gW11cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNsb25lLmxlbmd0aDsgaW5kZXggKz0gMikge1xuICAgIGVudHJpZXMucHVzaChbY2xvbmVbaW5kZXhdLCBjbG9uZVtpbmRleCArIDFdXSlcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpXG59XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVycyAobW9ja0Rpc3BhdGNoLCBoZWFkZXJzKSB7XG4gIGlmICh0eXBlb2YgbW9ja0Rpc3BhdGNoLmhlYWRlcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkgeyAvLyBmZXRjaCBIZWFkZXJzTGlzdFxuICAgICAgaGVhZGVycyA9IGJ1aWxkSGVhZGVyc0Zyb21BcnJheShoZWFkZXJzKVxuICAgIH1cbiAgICByZXR1cm4gbW9ja0Rpc3BhdGNoLmhlYWRlcnMoaGVhZGVycyA/IGxvd2VyQ2FzZUVudHJpZXMoaGVhZGVycykgOiB7fSlcbiAgfVxuICBpZiAodHlwZW9mIG1vY2tEaXNwYXRjaC5oZWFkZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKHR5cGVvZiBoZWFkZXJzICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgbW9ja0Rpc3BhdGNoLmhlYWRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IFttYXRjaEhlYWRlck5hbWUsIG1hdGNoSGVhZGVyVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1vY2tEaXNwYXRjaC5oZWFkZXJzKSkge1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gZ2V0SGVhZGVyQnlOYW1lKGhlYWRlcnMsIG1hdGNoSGVhZGVyTmFtZSlcblxuICAgIGlmICghbWF0Y2hWYWx1ZShtYXRjaEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBzYWZlVXJsIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgY29uc3QgcGF0aFNlZ21lbnRzID0gcGF0aC5zcGxpdCgnPycpXG5cbiAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggIT09IDIpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgY29uc3QgcXAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhdGhTZWdtZW50cy5wb3AoKSlcbiAgcXAuc29ydCgpXG4gIHJldHVybiBbLi4ucGF0aFNlZ21lbnRzLCBxcC50b1N0cmluZygpXS5qb2luKCc/Jylcbn1cblxuZnVuY3Rpb24gbWF0Y2hLZXkgKG1vY2tEaXNwYXRjaCwgeyBwYXRoLCBtZXRob2QsIGJvZHksIGhlYWRlcnMgfSkge1xuICBjb25zdCBwYXRoTWF0Y2ggPSBtYXRjaFZhbHVlKG1vY2tEaXNwYXRjaC5wYXRoLCBwYXRoKVxuICBjb25zdCBtZXRob2RNYXRjaCA9IG1hdGNoVmFsdWUobW9ja0Rpc3BhdGNoLm1ldGhvZCwgbWV0aG9kKVxuICBjb25zdCBib2R5TWF0Y2ggPSB0eXBlb2YgbW9ja0Rpc3BhdGNoLmJvZHkgIT09ICd1bmRlZmluZWQnID8gbWF0Y2hWYWx1ZShtb2NrRGlzcGF0Y2guYm9keSwgYm9keSkgOiB0cnVlXG4gIGNvbnN0IGhlYWRlcnNNYXRjaCA9IG1hdGNoSGVhZGVycyhtb2NrRGlzcGF0Y2gsIGhlYWRlcnMpXG4gIHJldHVybiBwYXRoTWF0Y2ggJiYgbWV0aG9kTWF0Y2ggJiYgYm9keU1hdGNoICYmIGhlYWRlcnNNYXRjaFxufVxuXG5mdW5jdGlvbiBnZXRSZXNwb25zZURhdGEgKGRhdGEpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgIHJldHVybiBkYXRhXG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vY2tEaXNwYXRjaCAobW9ja0Rpc3BhdGNoZXMsIGtleSkge1xuICBjb25zdCBiYXNlUGF0aCA9IGtleS5xdWVyeSA/IGJ1aWxkVVJMKGtleS5wYXRoLCBrZXkucXVlcnkpIDoga2V5LnBhdGhcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gdHlwZW9mIGJhc2VQYXRoID09PSAnc3RyaW5nJyA/IHNhZmVVcmwoYmFzZVBhdGgpIDogYmFzZVBhdGhcblxuICAvLyBNYXRjaCBwYXRoXG4gIGxldCBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMgPSBtb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgY29uc3VtZWQgfSkgPT4gIWNvbnN1bWVkKS5maWx0ZXIoKHsgcGF0aCB9KSA9PiBtYXRjaFZhbHVlKHNhZmVVcmwocGF0aCksIHJlc29sdmVkUGF0aCkpXG4gIGlmIChtYXRjaGVkTW9ja0Rpc3BhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYE1vY2sgZGlzcGF0Y2ggbm90IG1hdGNoZWQgZm9yIHBhdGggJyR7cmVzb2x2ZWRQYXRofSdgKVxuICB9XG5cbiAgLy8gTWF0Y2ggbWV0aG9kXG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgbWV0aG9kIH0pID0+IG1hdGNoVmFsdWUobWV0aG9kLCBrZXkubWV0aG9kKSlcbiAgaWYgKG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgTW9ja05vdE1hdGNoZWRFcnJvcihgTW9jayBkaXNwYXRjaCBub3QgbWF0Y2hlZCBmb3IgbWV0aG9kICcke2tleS5tZXRob2R9J2ApXG4gIH1cblxuICAvLyBNYXRjaCBib2R5XG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgYm9keSB9KSA9PiB0eXBlb2YgYm9keSAhPT0gJ3VuZGVmaW5lZCcgPyBtYXRjaFZhbHVlKGJvZHksIGtleS5ib2R5KSA6IHRydWUpXG4gIGlmIChtYXRjaGVkTW9ja0Rpc3BhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYE1vY2sgZGlzcGF0Y2ggbm90IG1hdGNoZWQgZm9yIGJvZHkgJyR7a2V5LmJvZHl9J2ApXG4gIH1cblxuICAvLyBNYXRjaCBoZWFkZXJzXG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKG1vY2tEaXNwYXRjaCkgPT4gbWF0Y2hIZWFkZXJzKG1vY2tEaXNwYXRjaCwga2V5LmhlYWRlcnMpKVxuICBpZiAobWF0Y2hlZE1vY2tEaXNwYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBNb2NrTm90TWF0Y2hlZEVycm9yKGBNb2NrIGRpc3BhdGNoIG5vdCBtYXRjaGVkIGZvciBoZWFkZXJzICcke3R5cGVvZiBrZXkuaGVhZGVycyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShrZXkuaGVhZGVycykgOiBrZXkuaGVhZGVyc30nYClcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVkTW9ja0Rpc3BhdGNoZXNbMF1cbn1cblxuZnVuY3Rpb24gYWRkTW9ja0Rpc3BhdGNoIChtb2NrRGlzcGF0Y2hlcywga2V5LCBkYXRhKSB7XG4gIGNvbnN0IGJhc2VEYXRhID0geyB0aW1lc0ludm9rZWQ6IDAsIHRpbWVzOiAxLCBwZXJzaXN0OiBmYWxzZSwgY29uc3VtZWQ6IGZhbHNlIH1cbiAgY29uc3QgcmVwbHlEYXRhID0gdHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicgPyB7IGNhbGxiYWNrOiBkYXRhIH0gOiB7IC4uLmRhdGEgfVxuICBjb25zdCBuZXdNb2NrRGlzcGF0Y2ggPSB7IC4uLmJhc2VEYXRhLCAuLi5rZXksIHBlbmRpbmc6IHRydWUsIGRhdGE6IHsgZXJyb3I6IG51bGwsIC4uLnJlcGx5RGF0YSB9IH1cbiAgbW9ja0Rpc3BhdGNoZXMucHVzaChuZXdNb2NrRGlzcGF0Y2gpXG4gIHJldHVybiBuZXdNb2NrRGlzcGF0Y2hcbn1cblxuZnVuY3Rpb24gZGVsZXRlTW9ja0Rpc3BhdGNoIChtb2NrRGlzcGF0Y2hlcywga2V5KSB7XG4gIGNvbnN0IGluZGV4ID0gbW9ja0Rpc3BhdGNoZXMuZmluZEluZGV4KGRpc3BhdGNoID0+IHtcbiAgICBpZiAoIWRpc3BhdGNoLmNvbnN1bWVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoS2V5KGRpc3BhdGNoLCBrZXkpXG4gIH0pXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBtb2NrRGlzcGF0Y2hlcy5zcGxpY2UoaW5kZXgsIDEpXG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRLZXkgKG9wdHMpIHtcbiAgY29uc3QgeyBwYXRoLCBtZXRob2QsIGJvZHksIGhlYWRlcnMsIHF1ZXJ5IH0gPSBvcHRzXG4gIHJldHVybiB7XG4gICAgcGF0aCxcbiAgICBtZXRob2QsXG4gICAgYm9keSxcbiAgICBoZWFkZXJzLFxuICAgIHF1ZXJ5XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVLZXlWYWx1ZXMgKGRhdGEpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRhdGEpLnJlZHVjZSgoa2V5VmFsdWVQYWlycywgW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgLi4ua2V5VmFsdWVQYWlycyxcbiAgICBCdWZmZXIuZnJvbShgJHtrZXl9YCksXG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoeCA9PiBCdWZmZXIuZnJvbShgJHt4fWApKSA6IEJ1ZmZlci5mcm9tKGAke3ZhbHVlfWApXG4gIF0sIFtdKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9TdGF0dXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNDb2RlXG4gKi9cbmZ1bmN0aW9uIGdldFN0YXR1c1RleHQgKHN0YXR1c0NvZGUpIHtcbiAgcmV0dXJuIFNUQVRVU19DT0RFU1tzdGF0dXNDb2RlXSB8fCAndW5rbm93bidcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzcG9uc2UgKGJvZHkpIHtcbiAgY29uc3QgYnVmZmVycyA9IFtdXG4gIGZvciBhd2FpdCAoY29uc3QgZGF0YSBvZiBib2R5KSB7XG4gICAgYnVmZmVycy5wdXNoKGRhdGEpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycykudG9TdHJpbmcoJ3V0ZjgnKVxufVxuXG4vKipcbiAqIE1vY2sgZGlzcGF0Y2ggZnVuY3Rpb24gdXNlZCB0byBzaW11bGF0ZSB1bmRpY2kgZGlzcGF0Y2hlc1xuICovXG5mdW5jdGlvbiBtb2NrRGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgLy8gR2V0IG1vY2sgZGlzcGF0Y2ggZnJvbSBidWlsdCBrZXlcbiAgY29uc3Qga2V5ID0gYnVpbGRLZXkob3B0cylcbiAgY29uc3QgbW9ja0Rpc3BhdGNoID0gZ2V0TW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCBrZXkpXG5cbiAgbW9ja0Rpc3BhdGNoLnRpbWVzSW52b2tlZCsrXG5cbiAgLy8gSGVyZSdzIHdoZXJlIHdlIHJlc29sdmUgYSBjYWxsYmFjayBpZiBhIGNhbGxiYWNrIGlzIHByZXNlbnQgZm9yIHRoZSBkaXNwYXRjaCBkYXRhLlxuICBpZiAobW9ja0Rpc3BhdGNoLmRhdGEuY2FsbGJhY2spIHtcbiAgICBtb2NrRGlzcGF0Y2guZGF0YSA9IHsgLi4ubW9ja0Rpc3BhdGNoLmRhdGEsIC4uLm1vY2tEaXNwYXRjaC5kYXRhLmNhbGxiYWNrKG9wdHMpIH1cbiAgfVxuXG4gIC8vIFBhcnNlIG1vY2tEaXNwYXRjaCBkYXRhXG4gIGNvbnN0IHsgZGF0YTogeyBzdGF0dXNDb2RlLCBkYXRhLCBoZWFkZXJzLCB0cmFpbGVycywgZXJyb3IgfSwgZGVsYXksIHBlcnNpc3QgfSA9IG1vY2tEaXNwYXRjaFxuICBjb25zdCB7IHRpbWVzSW52b2tlZCwgdGltZXMgfSA9IG1vY2tEaXNwYXRjaFxuXG4gIC8vIElmIGl0J3MgdXNlZCB1cCBhbmQgbm90IHBlcnNpc3RlbnQsIG1hcmsgYXMgY29uc3VtZWRcbiAgbW9ja0Rpc3BhdGNoLmNvbnN1bWVkID0gIXBlcnNpc3QgJiYgdGltZXNJbnZva2VkID49IHRpbWVzXG4gIG1vY2tEaXNwYXRjaC5wZW5kaW5nID0gdGltZXNJbnZva2VkIDwgdGltZXNcblxuICAvLyBJZiBzcGVjaWZpZWQsIHRyaWdnZXIgZGlzcGF0Y2ggZXJyb3JcbiAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgZGVsZXRlTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCBrZXkpXG4gICAgaGFuZGxlci5vbkVycm9yKGVycm9yKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBIYW5kbGUgdGhlIHJlcXVlc3Qgd2l0aCBhIGRlbGF5IGlmIG5lY2Vzc2FyeVxuICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGhhbmRsZVJlcGx5KHRoaXNba0Rpc3BhdGNoZXNdKVxuICAgIH0sIGRlbGF5KVxuICB9IGVsc2Uge1xuICAgIGhhbmRsZVJlcGx5KHRoaXNba0Rpc3BhdGNoZXNdKVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUmVwbHkgKG1vY2tEaXNwYXRjaGVzLCBfZGF0YSA9IGRhdGEpIHtcbiAgICAvLyBmZXRjaCdzIEhlYWRlcnNMaXN0IGlzIGEgMUQgc3RyaW5nIGFycmF5XG4gICAgY29uc3Qgb3B0c0hlYWRlcnMgPSBBcnJheS5pc0FycmF5KG9wdHMuaGVhZGVycylcbiAgICAgID8gYnVpbGRIZWFkZXJzRnJvbUFycmF5KG9wdHMuaGVhZGVycylcbiAgICAgIDogb3B0cy5oZWFkZXJzXG4gICAgY29uc3QgYm9keSA9IHR5cGVvZiBfZGF0YSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBfZGF0YSh7IC4uLm9wdHMsIGhlYWRlcnM6IG9wdHNIZWFkZXJzIH0pXG4gICAgICA6IF9kYXRhXG5cbiAgICAvLyB1dGlsLnR5cGVzLmlzUHJvbWlzZSBpcyBsaWtlbHkgbmVlZGVkIGZvciBqZXN0LlxuICAgIGlmIChpc1Byb21pc2UoYm9keSkpIHtcbiAgICAgIC8vIElmIGhhbmRsZVJlcGx5IGlzIGFzeW5jaHJvbm91cywgdGhyb3dpbmcgYW4gZXJyb3JcbiAgICAgIC8vIGluIHRoZSBjYWxsYmFjayB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZSwgcmF0aGVyIHRoYW5cbiAgICAgIC8vIHN5bmNocm9ub3VzbHkgdGhyb3cgdGhlIGVycm9yLCB3aGljaCBicmVha3Mgc29tZSB0ZXN0cy5cbiAgICAgIC8vIFJhdGhlciwgd2Ugd2FpdCBmb3IgdGhlIGNhbGxiYWNrIHRvIHJlc29sdmUgaWYgaXQgaXMgYVxuICAgICAgLy8gcHJvbWlzZSwgYW5kIHRoZW4gcmUtcnVuIGhhbmRsZVJlcGx5IHdpdGggdGhlIG5ldyBib2R5LlxuICAgICAgYm9keS50aGVuKChuZXdEYXRhKSA9PiBoYW5kbGVSZXBseShtb2NrRGlzcGF0Y2hlcywgbmV3RGF0YSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZURhdGEgPSBnZXRSZXNwb25zZURhdGEoYm9keSlcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBnZW5lcmF0ZUtleVZhbHVlcyhoZWFkZXJzKVxuICAgIGNvbnN0IHJlc3BvbnNlVHJhaWxlcnMgPSBnZW5lcmF0ZUtleVZhbHVlcyh0cmFpbGVycylcblxuICAgIGhhbmRsZXIuYWJvcnQgPSBub3BcbiAgICBoYW5kbGVyLm9uSGVhZGVycyhzdGF0dXNDb2RlLCByZXNwb25zZUhlYWRlcnMsIHJlc3VtZSwgZ2V0U3RhdHVzVGV4dChzdGF0dXNDb2RlKSlcbiAgICBoYW5kbGVyLm9uRGF0YShCdWZmZXIuZnJvbShyZXNwb25zZURhdGEpKVxuICAgIGhhbmRsZXIub25Db21wbGV0ZShyZXNwb25zZVRyYWlsZXJzKVxuICAgIGRlbGV0ZU1vY2tEaXNwYXRjaChtb2NrRGlzcGF0Y2hlcywga2V5KVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lICgpIHt9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gYnVpbGRNb2NrRGlzcGF0Y2ggKCkge1xuICBjb25zdCBhZ2VudCA9IHRoaXNba01vY2tBZ2VudF1cbiAgY29uc3Qgb3JpZ2luID0gdGhpc1trT3JpZ2luXVxuICBjb25zdCBvcmlnaW5hbERpc3BhdGNoID0gdGhpc1trT3JpZ2luYWxEaXNwYXRjaF1cblxuICByZXR1cm4gZnVuY3Rpb24gZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAoYWdlbnQuaXNNb2NrQWN0aXZlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBtb2NrRGlzcGF0Y2guY2FsbCh0aGlzLCBvcHRzLCBoYW5kbGVyKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTW9ja05vdE1hdGNoZWRFcnJvcikge1xuICAgICAgICAgIGNvbnN0IG5ldENvbm5lY3QgPSBhZ2VudFtrR2V0TmV0Q29ubmVjdF0oKVxuICAgICAgICAgIGlmIChuZXRDb25uZWN0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX06IHN1YnNlcXVlbnQgcmVxdWVzdCB0byBvcmlnaW4gJHtvcmlnaW59IHdhcyBub3QgYWxsb3dlZCAobmV0LmNvbm5lY3QgZGlzYWJsZWQpYClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNoZWNrTmV0Q29ubmVjdChuZXRDb25uZWN0LCBvcmlnaW4pKSB7XG4gICAgICAgICAgICBvcmlnaW5hbERpc3BhdGNoLmNhbGwodGhpcywgb3B0cywgaGFuZGxlcilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX06IHN1YnNlcXVlbnQgcmVxdWVzdCB0byBvcmlnaW4gJHtvcmlnaW59IHdhcyBub3QgYWxsb3dlZCAobmV0LmNvbm5lY3QgaXMgbm90IGVuYWJsZWQgZm9yIHRoaXMgb3JpZ2luKWApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3JpZ2luYWxEaXNwYXRjaC5jYWxsKHRoaXMsIG9wdHMsIGhhbmRsZXIpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrTmV0Q29ubmVjdCAobmV0Q29ubmVjdCwgb3JpZ2luKSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwob3JpZ2luKVxuICBpZiAobmV0Q29ubmVjdCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShuZXRDb25uZWN0KSAmJiBuZXRDb25uZWN0LnNvbWUoKG1hdGNoZXIpID0+IG1hdGNoVmFsdWUobWF0Y2hlciwgdXJsLmhvc3QpKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGJ1aWxkTW9ja09wdGlvbnMgKG9wdHMpIHtcbiAgaWYgKG9wdHMpIHtcbiAgICBjb25zdCB7IGFnZW50LCAuLi5tb2NrT3B0aW9ucyB9ID0gb3B0c1xuICAgIHJldHVybiBtb2NrT3B0aW9uc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRSZXNwb25zZURhdGEsXG4gIGdldE1vY2tEaXNwYXRjaCxcbiAgYWRkTW9ja0Rpc3BhdGNoLFxuICBkZWxldGVNb2NrRGlzcGF0Y2gsXG4gIGJ1aWxkS2V5LFxuICBnZW5lcmF0ZUtleVZhbHVlcyxcbiAgbWF0Y2hWYWx1ZSxcbiAgZ2V0UmVzcG9uc2UsXG4gIGdldFN0YXR1c1RleHQsXG4gIG1vY2tEaXNwYXRjaCxcbiAgYnVpbGRNb2NrRGlzcGF0Y2gsXG4gIGNoZWNrTmV0Q29ubmVjdCxcbiAgYnVpbGRNb2NrT3B0aW9ucyxcbiAgZ2V0SGVhZGVyQnlOYW1lXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGdldFJlc3BvbnNlRGF0YSwgYnVpbGRLZXksIGFkZE1vY2tEaXNwYXRjaCB9ID0gcmVxdWlyZSgnLi9tb2NrLXV0aWxzJylcbmNvbnN0IHtcbiAga0Rpc3BhdGNoZXMsXG4gIGtEaXNwYXRjaEtleSxcbiAga0RlZmF1bHRIZWFkZXJzLFxuICBrRGVmYXVsdFRyYWlsZXJzLFxuICBrQ29udGVudExlbmd0aCxcbiAga01vY2tEaXNwYXRjaFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsgYnVpbGRVUkwgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbi8qKlxuICogRGVmaW5lcyB0aGUgc2NvcGUgQVBJIGZvciBhbiBpbnRlcmNlcHRvciByZXBseVxuICovXG5jbGFzcyBNb2NrU2NvcGUge1xuICBjb25zdHJ1Y3RvciAobW9ja0Rpc3BhdGNoKSB7XG4gICAgdGhpc1trTW9ja0Rpc3BhdGNoXSA9IG1vY2tEaXNwYXRjaFxuICB9XG5cbiAgLyoqXG4gICAqIERlbGF5IGEgcmVwbHkgYnkgYSBzZXQgYW1vdW50IGluIG1zLlxuICAgKi9cbiAgZGVsYXkgKHdhaXRJbk1zKSB7XG4gICAgaWYgKHR5cGVvZiB3YWl0SW5NcyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIod2FpdEluTXMpIHx8IHdhaXRJbk1zIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignd2FpdEluTXMgbXVzdCBiZSBhIHZhbGlkIGludGVnZXIgPiAwJylcbiAgICB9XG5cbiAgICB0aGlzW2tNb2NrRGlzcGF0Y2hdLmRlbGF5ID0gd2FpdEluTXNcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhIGRlZmluZWQgcmVwbHksIG5ldmVyIG1hcmsgYXMgY29uc3VtZWQuXG4gICAqL1xuICBwZXJzaXN0ICgpIHtcbiAgICB0aGlzW2tNb2NrRGlzcGF0Y2hdLnBlcnNpc3QgPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBvbmUgdG8gZGVmaW5lIGEgcmVwbHkgZm9yIGEgc2V0IGFtb3VudCBvZiBtYXRjaGluZyByZXF1ZXN0cy5cbiAgICovXG4gIHRpbWVzIChyZXBlYXRUaW1lcykge1xuICAgIGlmICh0eXBlb2YgcmVwZWF0VGltZXMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJlcGVhdFRpbWVzKSB8fCByZXBlYXRUaW1lcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3JlcGVhdFRpbWVzIG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyID4gMCcpXG4gICAgfVxuXG4gICAgdGhpc1trTW9ja0Rpc3BhdGNoXS50aW1lcyA9IHJlcGVhdFRpbWVzXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG4vKipcbiAqIERlZmluZXMgYW4gaW50ZXJjZXB0b3IgZm9yIGEgTW9ja1xuICovXG5jbGFzcyBNb2NrSW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvciAob3B0cywgbW9ja0Rpc3BhdGNoZXMpIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29wdHMgbXVzdCBiZSBhbiBvYmplY3QnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMucGF0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cy5wYXRoIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0cy5tZXRob2QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRzLm1ldGhvZCA9ICdHRVQnXG4gICAgfVxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTI0NVxuICAgIC8vIEFzIHBlciBSRkMgMzk4NiwgY2xpZW50cyBhcmUgbm90IHN1cHBvc2VkIHRvIHNlbmQgVVJJXG4gICAgLy8gZnJhZ21lbnRzIHRvIHNlcnZlcnMgd2hlbiB0aGV5IHJldHJpZXZlIGEgZG9jdW1lbnQsXG4gICAgaWYgKHR5cGVvZiBvcHRzLnBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAob3B0cy5xdWVyeSkge1xuICAgICAgICBvcHRzLnBhdGggPSBidWlsZFVSTChvcHRzLnBhdGgsIG9wdHMucXVlcnkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNYXRjaGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2Jsb2IvbWFpbi9saWIvZmV0Y2gvaW5kZXguanMjTDE4MTFcbiAgICAgICAgY29uc3QgcGFyc2VkVVJMID0gbmV3IFVSTChvcHRzLnBhdGgsICdkYXRhOi8vJylcbiAgICAgICAgb3B0cy5wYXRoID0gcGFyc2VkVVJMLnBhdGhuYW1lICsgcGFyc2VkVVJMLnNlYXJjaFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMubWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0cy5tZXRob2QgPSBvcHRzLm1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gICAgfVxuXG4gICAgdGhpc1trRGlzcGF0Y2hLZXldID0gYnVpbGRLZXkob3B0cylcbiAgICB0aGlzW2tEaXNwYXRjaGVzXSA9IG1vY2tEaXNwYXRjaGVzXG4gICAgdGhpc1trRGVmYXVsdEhlYWRlcnNdID0ge31cbiAgICB0aGlzW2tEZWZhdWx0VHJhaWxlcnNdID0ge31cbiAgICB0aGlzW2tDb250ZW50TGVuZ3RoXSA9IGZhbHNlXG4gIH1cblxuICBjcmVhdGVNb2NrU2NvcGVEaXNwYXRjaERhdGEgKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZ2V0UmVzcG9uc2VEYXRhKGRhdGEpXG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IHRoaXNba0NvbnRlbnRMZW5ndGhdID8geyAnY29udGVudC1sZW5ndGgnOiByZXNwb25zZURhdGEubGVuZ3RoIH0gOiB7fVxuICAgIGNvbnN0IGhlYWRlcnMgPSB7IC4uLnRoaXNba0RlZmF1bHRIZWFkZXJzXSwgLi4uY29udGVudExlbmd0aCwgLi4ucmVzcG9uc2VPcHRpb25zLmhlYWRlcnMgfVxuICAgIGNvbnN0IHRyYWlsZXJzID0geyAuLi50aGlzW2tEZWZhdWx0VHJhaWxlcnNdLCAuLi5yZXNwb25zZU9wdGlvbnMudHJhaWxlcnMgfVxuXG4gICAgcmV0dXJuIHsgc3RhdHVzQ29kZSwgZGF0YSwgaGVhZGVycywgdHJhaWxlcnMgfVxuICB9XG5cbiAgdmFsaWRhdGVSZXBseVBhcmFtZXRlcnMgKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzQ29kZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc3RhdHVzQ29kZSBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2RhdGEgbXVzdCBiZSBkZWZpbmVkJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXNwb25zZU9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Jlc3BvbnNlT3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vY2sgYW4gdW5kaWNpIHJlcXVlc3Qgd2l0aCBhIGRlZmluZWQgcmVwbHkuXG4gICAqL1xuICByZXBseSAocmVwbHlEYXRhKSB7XG4gICAgLy8gVmFsdWVzIG9mIHJlcGx5IGFyZW4ndCBhdmFpbGFibGUgcmlnaHQgbm93IGFzIHRoZXlcbiAgICAvLyBjYW4gb25seSBiZSBhdmFpbGFibGUgd2hlbiB0aGUgcmVwbHkgY2FsbGJhY2sgaXMgaW52b2tlZC5cbiAgICBpZiAodHlwZW9mIHJlcGx5RGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gV2UnbGwgZmlyc3Qgd3JhcCB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgaW4gYW5vdGhlciBmdW5jdGlvbixcbiAgICAgIC8vIHRoaXMgZnVuY3Rpb24gd2lsbCBwcm9wZXJseSByZXNvbHZlIHRoZSBkYXRhIGZyb20gdGhlIGNhbGxiYWNrXG4gICAgICAvLyB3aGVuIGludm9rZWQuXG4gICAgICBjb25zdCB3cmFwcGVkRGVmYXVsdHNDYWxsYmFjayA9IChvcHRzKSA9PiB7XG4gICAgICAgIC8vIE91ciByZXBseSBvcHRpb25zIGNhbGxiYWNrIGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXIgZm9yIHN0YXR1c0NvZGUsIGRhdGEgYW5kIG9wdGlvbnMuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHJlcGx5RGF0YShvcHRzKVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGluIHRoZSByaWdodCBmb3JtYXRcbiAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZlZERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdyZXBseSBvcHRpb25zIGNhbGxiYWNrIG11c3QgcmV0dXJuIGFuIG9iamVjdCcpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0YXR1c0NvZGUsIGRhdGEgPSAnJywgcmVzcG9uc2VPcHRpb25zID0ge30gfSA9IHJlc29sdmVkRGF0YVxuICAgICAgICB0aGlzLnZhbGlkYXRlUmVwbHlQYXJhbWV0ZXJzKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucylcbiAgICAgICAgLy8gU2luY2UgdGhlIHZhbHVlcyBjYW4gYmUgb2J0YWluZWQgaW1tZWRpYXRlbHkgd2UgcmV0dXJuIHRoZW1cbiAgICAgICAgLy8gZnJvbSB0aGlzIGhpZ2hlciBvcmRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgbGF0ZXIuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy5jcmVhdGVNb2NrU2NvcGVEaXNwYXRjaERhdGEoc3RhdHVzQ29kZSwgZGF0YSwgcmVzcG9uc2VPcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB1c3VhbCBkaXNwYXRjaCBkYXRhLCBidXQgdGhpcyB0aW1lIHNldCB0aGUgZGF0YSBwYXJhbWV0ZXIgdG8gZnVuY3Rpb24gdGhhdCB3aWxsIGV2ZW50dWFsbHkgcHJvdmlkZSBkYXRhLlxuICAgICAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0gYWRkTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCB0aGlzW2tEaXNwYXRjaEtleV0sIHdyYXBwZWREZWZhdWx0c0NhbGxiYWNrKVxuICAgICAgcmV0dXJuIG5ldyBNb2NrU2NvcGUobmV3TW9ja0Rpc3BhdGNoKVxuICAgIH1cblxuICAgIC8vIFdlIGNhbiBoYXZlIGVpdGhlciBvbmUgb3IgdGhyZWUgcGFyYW1ldGVycywgaWYgd2UgZ2V0IGhlcmUsXG4gICAgLy8gd2Ugc2hvdWxkIGhhdmUgMS0zIHBhcmFtZXRlcnMuIFNvIHdlIHNwcmVhZCB0aGUgYXJndW1lbnRzIG9mXG4gICAgLy8gdGhpcyBmdW5jdGlvbiB0byBvYnRhaW4gdGhlIHBhcmFtZXRlcnMsIHNpbmNlIHJlcGx5RGF0YSB3aWxsIGFsd2F5c1xuICAgIC8vIGp1c3QgYmUgdGhlIHN0YXR1c0NvZGUuXG4gICAgY29uc3QgW3N0YXR1c0NvZGUsIGRhdGEgPSAnJywgcmVzcG9uc2VPcHRpb25zID0ge31dID0gWy4uLmFyZ3VtZW50c11cbiAgICB0aGlzLnZhbGlkYXRlUmVwbHlQYXJhbWV0ZXJzKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucylcblxuICAgIC8vIFNlbmQgaW4tYWxyZWFkeSBwcm92aWRlZCBkYXRhIGxpa2UgdXN1YWxcbiAgICBjb25zdCBkaXNwYXRjaERhdGEgPSB0aGlzLmNyZWF0ZU1vY2tTY29wZURpc3BhdGNoRGF0YShzdGF0dXNDb2RlLCBkYXRhLCByZXNwb25zZU9wdGlvbnMpXG4gICAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0gYWRkTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCB0aGlzW2tEaXNwYXRjaEtleV0sIGRpc3BhdGNoRGF0YSlcbiAgICByZXR1cm4gbmV3IE1vY2tTY29wZShuZXdNb2NrRGlzcGF0Y2gpXG4gIH1cblxuICAvKipcbiAgICogTW9jayBhbiB1bmRpY2kgcmVxdWVzdCB3aXRoIGEgZGVmaW5lZCBlcnJvci5cbiAgICovXG4gIHJlcGx5V2l0aEVycm9yIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Vycm9yIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuXG4gICAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0gYWRkTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCB0aGlzW2tEaXNwYXRjaEtleV0sIHsgZXJyb3IgfSlcbiAgICByZXR1cm4gbmV3IE1vY2tTY29wZShuZXdNb2NrRGlzcGF0Y2gpXG4gIH1cblxuICAvKipcbiAgICogU2V0IGRlZmF1bHQgcmVwbHkgaGVhZGVycyBvbiB0aGUgaW50ZXJjZXB0b3IgZm9yIHN1YnNlcXVlbnQgcmVwbGllc1xuICAgKi9cbiAgZGVmYXVsdFJlcGx5SGVhZGVycyAoaGVhZGVycykge1xuICAgIGlmICh0eXBlb2YgaGVhZGVycyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGVhZGVycyBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cblxuICAgIHRoaXNba0RlZmF1bHRIZWFkZXJzXSA9IGhlYWRlcnNcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IHJlcGx5IHRyYWlsZXJzIG9uIHRoZSBpbnRlcmNlcHRvciBmb3Igc3Vic2VxdWVudCByZXBsaWVzXG4gICAqL1xuICBkZWZhdWx0UmVwbHlUcmFpbGVycyAodHJhaWxlcnMpIHtcbiAgICBpZiAodHlwZW9mIHRyYWlsZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd0cmFpbGVycyBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cblxuICAgIHRoaXNba0RlZmF1bHRUcmFpbGVyc10gPSB0cmFpbGVyc1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHJlcGx5IGNvbnRlbnQgbGVuZ3RoIGhlYWRlciBmb3IgcmVwbGllcyBvbiB0aGUgaW50ZXJjZXB0b3JcbiAgICovXG4gIHJlcGx5Q29udGVudExlbmd0aCAoKSB7XG4gICAgdGhpc1trQ29udGVudExlbmd0aF0gPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5Nb2NrSW50ZXJjZXB0b3IgPSBNb2NrSW50ZXJjZXB0b3Jcbm1vZHVsZS5leHBvcnRzLk1vY2tTY29wZSA9IE1vY2tTY29wZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBwcm9taXNpZnkgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi4vY2xpZW50JylcbmNvbnN0IHsgYnVpbGRNb2NrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vbW9jay11dGlscycpXG5jb25zdCB7XG4gIGtEaXNwYXRjaGVzLFxuICBrTW9ja0FnZW50LFxuICBrQ2xvc2UsXG4gIGtPcmlnaW5hbENsb3NlLFxuICBrT3JpZ2luLFxuICBrT3JpZ2luYWxEaXNwYXRjaCxcbiAga0Nvbm5lY3RlZFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgTW9ja0ludGVyY2VwdG9yIH0gPSByZXF1aXJlKCcuL21vY2staW50ZXJjZXB0b3InKVxuY29uc3QgU3ltYm9scyA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbi8qKlxuICogTW9ja0NsaWVudCBwcm92aWRlcyBhbiBBUEkgdGhhdCBleHRlbmRzIHRoZSBDbGllbnQgdG8gaW5mbHVlbmNlIHRoZSBtb2NrRGlzcGF0Y2hlcy5cbiAqL1xuY2xhc3MgTW9ja0NsaWVudCBleHRlbmRzIENsaWVudCB7XG4gIGNvbnN0cnVjdG9yIChvcmlnaW4sIG9wdHMpIHtcbiAgICBzdXBlcihvcmlnaW4sIG9wdHMpXG5cbiAgICBpZiAoIW9wdHMgfHwgIW9wdHMuYWdlbnQgfHwgdHlwZW9mIG9wdHMuYWdlbnQuZGlzcGF0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQXJndW1lbnQgb3B0cy5hZ2VudCBtdXN0IGltcGxlbWVudCBBZ2VudCcpXG4gICAgfVxuXG4gICAgdGhpc1trTW9ja0FnZW50XSA9IG9wdHMuYWdlbnRcbiAgICB0aGlzW2tPcmlnaW5dID0gb3JpZ2luXG4gICAgdGhpc1trRGlzcGF0Y2hlc10gPSBbXVxuICAgIHRoaXNba0Nvbm5lY3RlZF0gPSAxXG4gICAgdGhpc1trT3JpZ2luYWxEaXNwYXRjaF0gPSB0aGlzLmRpc3BhdGNoXG4gICAgdGhpc1trT3JpZ2luYWxDbG9zZV0gPSB0aGlzLmNsb3NlLmJpbmQodGhpcylcblxuICAgIHRoaXMuZGlzcGF0Y2ggPSBidWlsZE1vY2tEaXNwYXRjaC5jYWxsKHRoaXMpXG4gICAgdGhpcy5jbG9zZSA9IHRoaXNba0Nsb3NlXVxuICB9XG5cbiAgZ2V0IFtTeW1ib2xzLmtDb25uZWN0ZWRdICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ29ubmVjdGVkXVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgdGhlIGJhc2UgaW50ZXJjZXB0b3IgZm9yIG1vY2tpbmcgcmVwbGllcyBmcm9tIHVuZGljaS5cbiAgICovXG4gIGludGVyY2VwdCAob3B0cykge1xuICAgIHJldHVybiBuZXcgTW9ja0ludGVyY2VwdG9yKG9wdHMsIHRoaXNba0Rpc3BhdGNoZXNdKVxuICB9XG5cbiAgYXN5bmMgW2tDbG9zZV0gKCkge1xuICAgIGF3YWl0IHByb21pc2lmeSh0aGlzW2tPcmlnaW5hbENsb3NlXSkoKVxuICAgIHRoaXNba0Nvbm5lY3RlZF0gPSAwXG4gICAgdGhpc1trTW9ja0FnZW50XVtTeW1ib2xzLmtDbGllbnRzXS5kZWxldGUodGhpc1trT3JpZ2luXSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1vY2tDbGllbnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcHJvbWlzaWZ5IH0gPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuLi9wb29sJylcbmNvbnN0IHsgYnVpbGRNb2NrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vbW9jay11dGlscycpXG5jb25zdCB7XG4gIGtEaXNwYXRjaGVzLFxuICBrTW9ja0FnZW50LFxuICBrQ2xvc2UsXG4gIGtPcmlnaW5hbENsb3NlLFxuICBrT3JpZ2luLFxuICBrT3JpZ2luYWxEaXNwYXRjaCxcbiAga0Nvbm5lY3RlZFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgTW9ja0ludGVyY2VwdG9yIH0gPSByZXF1aXJlKCcuL21vY2staW50ZXJjZXB0b3InKVxuY29uc3QgU3ltYm9scyA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbi8qKlxuICogTW9ja1Bvb2wgcHJvdmlkZXMgYW4gQVBJIHRoYXQgZXh0ZW5kcyB0aGUgUG9vbCB0byBpbmZsdWVuY2UgdGhlIG1vY2tEaXNwYXRjaGVzLlxuICovXG5jbGFzcyBNb2NrUG9vbCBleHRlbmRzIFBvb2wge1xuICBjb25zdHJ1Y3RvciAob3JpZ2luLCBvcHRzKSB7XG4gICAgc3VwZXIob3JpZ2luLCBvcHRzKVxuXG4gICAgaWYgKCFvcHRzIHx8ICFvcHRzLmFnZW50IHx8IHR5cGVvZiBvcHRzLmFnZW50LmRpc3BhdGNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0FyZ3VtZW50IG9wdHMuYWdlbnQgbXVzdCBpbXBsZW1lbnQgQWdlbnQnKVxuICAgIH1cblxuICAgIHRoaXNba01vY2tBZ2VudF0gPSBvcHRzLmFnZW50XG4gICAgdGhpc1trT3JpZ2luXSA9IG9yaWdpblxuICAgIHRoaXNba0Rpc3BhdGNoZXNdID0gW11cbiAgICB0aGlzW2tDb25uZWN0ZWRdID0gMVxuICAgIHRoaXNba09yaWdpbmFsRGlzcGF0Y2hdID0gdGhpcy5kaXNwYXRjaFxuICAgIHRoaXNba09yaWdpbmFsQ2xvc2VdID0gdGhpcy5jbG9zZS5iaW5kKHRoaXMpXG5cbiAgICB0aGlzLmRpc3BhdGNoID0gYnVpbGRNb2NrRGlzcGF0Y2guY2FsbCh0aGlzKVxuICAgIHRoaXMuY2xvc2UgPSB0aGlzW2tDbG9zZV1cbiAgfVxuXG4gIGdldCBbU3ltYm9scy5rQ29ubmVjdGVkXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0Nvbm5lY3RlZF1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHRoZSBiYXNlIGludGVyY2VwdG9yIGZvciBtb2NraW5nIHJlcGxpZXMgZnJvbSB1bmRpY2kuXG4gICAqL1xuICBpbnRlcmNlcHQgKG9wdHMpIHtcbiAgICByZXR1cm4gbmV3IE1vY2tJbnRlcmNlcHRvcihvcHRzLCB0aGlzW2tEaXNwYXRjaGVzXSlcbiAgfVxuXG4gIGFzeW5jIFtrQ2xvc2VdICgpIHtcbiAgICBhd2FpdCBwcm9taXNpZnkodGhpc1trT3JpZ2luYWxDbG9zZV0pKClcbiAgICB0aGlzW2tDb25uZWN0ZWRdID0gMFxuICAgIHRoaXNba01vY2tBZ2VudF1bU3ltYm9scy5rQ2xpZW50c10uZGVsZXRlKHRoaXNba09yaWdpbl0pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2NrUG9vbFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qgc2luZ3VsYXJzID0ge1xuICBwcm9ub3VuOiAnaXQnLFxuICBpczogJ2lzJyxcbiAgd2FzOiAnd2FzJyxcbiAgdGhpczogJ3RoaXMnXG59XG5cbmNvbnN0IHBsdXJhbHMgPSB7XG4gIHByb25vdW46ICd0aGV5JyxcbiAgaXM6ICdhcmUnLFxuICB3YXM6ICd3ZXJlJyxcbiAgdGhpczogJ3RoZXNlJ1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFBsdXJhbGl6ZXIge1xuICBjb25zdHJ1Y3RvciAoc2luZ3VsYXIsIHBsdXJhbCkge1xuICAgIHRoaXMuc2luZ3VsYXIgPSBzaW5ndWxhclxuICAgIHRoaXMucGx1cmFsID0gcGx1cmFsXG4gIH1cblxuICBwbHVyYWxpemUgKGNvdW50KSB7XG4gICAgY29uc3Qgb25lID0gY291bnQgPT09IDFcbiAgICBjb25zdCBrZXlzID0gb25lID8gc2luZ3VsYXJzIDogcGx1cmFsc1xuICAgIGNvbnN0IG5vdW4gPSBvbmUgPyB0aGlzLnNpbmd1bGFyIDogdGhpcy5wbHVyYWxcbiAgICByZXR1cm4geyAuLi5rZXlzLCBjb3VudCwgbm91biB9XG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgVHJhbnNmb3JtIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgeyBDb25zb2xlIH0gPSByZXF1aXJlKCdjb25zb2xlJylcblxuLyoqXG4gKiBHZXRzIHRoZSBvdXRwdXQgb2YgYGNvbnNvbGUudGFibGUo4oCmKWAgYXMgYSBzdHJpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUGVuZGluZ0ludGVyY2VwdG9yc0Zvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yICh7IGRpc2FibGVDb2xvcnMgfSA9IHt9KSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKHtcbiAgICAgIHRyYW5zZm9ybSAoY2h1bmssIF9lbmMsIGNiKSB7XG4gICAgICAgIGNiKG51bGwsIGNodW5rKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBDb25zb2xlKHtcbiAgICAgIHN0ZG91dDogdGhpcy50cmFuc2Zvcm0sXG4gICAgICBpbnNwZWN0T3B0aW9uczoge1xuICAgICAgICBjb2xvcnM6ICFkaXNhYmxlQ29sb3JzICYmICFwcm9jZXNzLmVudi5DSVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmb3JtYXQgKHBlbmRpbmdJbnRlcmNlcHRvcnMpIHtcbiAgICBjb25zdCB3aXRoUHJldHR5SGVhZGVycyA9IHBlbmRpbmdJbnRlcmNlcHRvcnMubWFwKFxuICAgICAgKHsgbWV0aG9kLCBwYXRoLCBkYXRhOiB7IHN0YXR1c0NvZGUgfSwgcGVyc2lzdCwgdGltZXMsIHRpbWVzSW52b2tlZCwgb3JpZ2luIH0pID0+ICh7XG4gICAgICAgIE1ldGhvZDogbWV0aG9kLFxuICAgICAgICBPcmlnaW46IG9yaWdpbixcbiAgICAgICAgUGF0aDogcGF0aCxcbiAgICAgICAgJ1N0YXR1cyBjb2RlJzogc3RhdHVzQ29kZSxcbiAgICAgICAgUGVyc2lzdGVudDogcGVyc2lzdCA/ICfinIUnIDogJ+KdjCcsXG4gICAgICAgIEludm9jYXRpb25zOiB0aW1lc0ludm9rZWQsXG4gICAgICAgIFJlbWFpbmluZzogcGVyc2lzdCA/IEluZmluaXR5IDogdGltZXMgLSB0aW1lc0ludm9rZWRcbiAgICAgIH0pKVxuXG4gICAgdGhpcy5sb2dnZXIudGFibGUod2l0aFByZXR0eUhlYWRlcnMpXG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnJlYWQoKS50b1N0cmluZygpXG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga0NsaWVudHMgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4uL2FnZW50JylcbmNvbnN0IHtcbiAga0FnZW50LFxuICBrTW9ja0FnZW50U2V0LFxuICBrTW9ja0FnZW50R2V0LFxuICBrRGlzcGF0Y2hlcyxcbiAga0lzTW9ja0FjdGl2ZSxcbiAga05ldENvbm5lY3QsXG4gIGtHZXROZXRDb25uZWN0LFxuICBrT3B0aW9ucyxcbiAga0ZhY3Rvcnlcbn0gPSByZXF1aXJlKCcuL21vY2stc3ltYm9scycpXG5jb25zdCBNb2NrQ2xpZW50ID0gcmVxdWlyZSgnLi9tb2NrLWNsaWVudCcpXG5jb25zdCBNb2NrUG9vbCA9IHJlcXVpcmUoJy4vbW9jay1wb29sJylcbmNvbnN0IHsgbWF0Y2hWYWx1ZSwgYnVpbGRNb2NrT3B0aW9ucyB9ID0gcmVxdWlyZSgnLi9tb2NrLXV0aWxzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIFVuZGljaUVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi4vZGlzcGF0Y2hlcicpXG5jb25zdCBQbHVyYWxpemVyID0gcmVxdWlyZSgnLi9wbHVyYWxpemVyJylcbmNvbnN0IFBlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIgPSByZXF1aXJlKCcuL3BlbmRpbmctaW50ZXJjZXB0b3JzLWZvcm1hdHRlcicpXG5cbmNsYXNzIEZha2VXZWFrUmVmIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICBkZXJlZiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxufVxuXG5jbGFzcyBNb2NrQWdlbnQgZXh0ZW5kcyBEaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuXG4gICAgdGhpc1trTmV0Q29ubmVjdF0gPSB0cnVlXG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IHRydWVcblxuICAgIC8vIEluc3RhbnRpYXRlIEFnZW50IGFuZCBlbmNhcHN1bGF0ZVxuICAgIGlmICgob3B0cyAmJiBvcHRzLmFnZW50ICYmIHR5cGVvZiBvcHRzLmFnZW50LmRpc3BhdGNoICE9PSAnZnVuY3Rpb24nKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBcmd1bWVudCBvcHRzLmFnZW50IG11c3QgaW1wbGVtZW50IEFnZW50JylcbiAgICB9XG4gICAgY29uc3QgYWdlbnQgPSBvcHRzICYmIG9wdHMuYWdlbnQgPyBvcHRzLmFnZW50IDogbmV3IEFnZW50KG9wdHMpXG4gICAgdGhpc1trQWdlbnRdID0gYWdlbnRcblxuICAgIHRoaXNba0NsaWVudHNdID0gYWdlbnRba0NsaWVudHNdXG4gICAgdGhpc1trT3B0aW9uc10gPSBidWlsZE1vY2tPcHRpb25zKG9wdHMpXG4gIH1cblxuICBnZXQgKG9yaWdpbikge1xuICAgIGxldCBkaXNwYXRjaGVyID0gdGhpc1trTW9ja0FnZW50R2V0XShvcmlnaW4pXG5cbiAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgIGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XShvcmlnaW4pXG4gICAgICB0aGlzW2tNb2NrQWdlbnRTZXRdKG9yaWdpbiwgZGlzcGF0Y2hlcilcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgfVxuXG4gIGRpc3BhdGNoIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgLy8gQ2FsbCBNb2NrQWdlbnQuZ2V0IHRvIHBlcmZvcm0gYWRkaXRpb25hbCBzZXR1cCBiZWZvcmUgZGlzcGF0Y2hpbmcgYXMgbm9ybWFsXG4gICAgdGhpcy5nZXQob3B0cy5vcmlnaW4pXG4gICAgcmV0dXJuIHRoaXNba0FnZW50XS5kaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgYXN5bmMgY2xvc2UgKCkge1xuICAgIGF3YWl0IHRoaXNba0FnZW50XS5jbG9zZSgpXG4gICAgdGhpc1trQ2xpZW50c10uY2xlYXIoKVxuICB9XG5cbiAgZGVhY3RpdmF0ZSAoKSB7XG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IGZhbHNlXG4gIH1cblxuICBhY3RpdmF0ZSAoKSB7XG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IHRydWVcbiAgfVxuXG4gIGVuYWJsZU5ldENvbm5lY3QgKG1hdGNoZXIpIHtcbiAgICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXRjaGVyID09PSAnZnVuY3Rpb24nIHx8IG1hdGNoZXIgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXNba05ldENvbm5lY3RdKSkge1xuICAgICAgICB0aGlzW2tOZXRDb25uZWN0XS5wdXNoKG1hdGNoZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW2tOZXRDb25uZWN0XSA9IFttYXRjaGVyXVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzW2tOZXRDb25uZWN0XSA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdVbnN1cHBvcnRlZCBtYXRjaGVyLiBNdXN0IGJlIG9uZSBvZiBTdHJpbmd8RnVuY3Rpb258UmVnRXhwLicpXG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZU5ldENvbm5lY3QgKCkge1xuICAgIHRoaXNba05ldENvbm5lY3RdID0gZmFsc2VcbiAgfVxuXG4gIC8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gYnlwYXNzIGlzc3VlcyBjYXVzZWQgYnkgdXNpbmcgZ2xvYmFsIHN5bWJvbHMgLSBzZWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xNDQ3XG4gIGdldCBpc01vY2tBY3RpdmUgKCkge1xuICAgIHJldHVybiB0aGlzW2tJc01vY2tBY3RpdmVdXG4gIH1cblxuICBba01vY2tBZ2VudFNldF0gKG9yaWdpbiwgZGlzcGF0Y2hlcikge1xuICAgIHRoaXNba0NsaWVudHNdLnNldChvcmlnaW4sIG5ldyBGYWtlV2Vha1JlZihkaXNwYXRjaGVyKSlcbiAgfVxuXG4gIFtrRmFjdG9yeV0gKG9yaWdpbikge1xuICAgIGNvbnN0IG1vY2tPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IGFnZW50OiB0aGlzIH0sIHRoaXNba09wdGlvbnNdKVxuICAgIHJldHVybiB0aGlzW2tPcHRpb25zXSAmJiB0aGlzW2tPcHRpb25zXS5jb25uZWN0aW9ucyA9PT0gMVxuICAgICAgPyBuZXcgTW9ja0NsaWVudChvcmlnaW4sIG1vY2tPcHRpb25zKVxuICAgICAgOiBuZXcgTW9ja1Bvb2wob3JpZ2luLCBtb2NrT3B0aW9ucylcbiAgfVxuXG4gIFtrTW9ja0FnZW50R2V0XSAob3JpZ2luKSB7XG4gICAgLy8gRmlyc3QgY2hlY2sgaWYgd2UgY2FuIGltbWVkaWF0ZWx5IGZpbmQgaXRcbiAgICBjb25zdCByZWYgPSB0aGlzW2tDbGllbnRzXS5nZXQob3JpZ2luKVxuICAgIGlmIChyZWYpIHtcbiAgICAgIHJldHVybiByZWYuZGVyZWYoKVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBvcmlnaW4gaXMgbm90IGEgc3RyaW5nIGNyZWF0ZSBhIGR1bW15IHBhcmVudCBwb29sIGFuZCByZXR1cm4gdG8gdXNlclxuICAgIGlmICh0eXBlb2Ygb3JpZ2luICE9PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXNba0ZhY3RvcnldKCdodHRwOi8vbG9jYWxob3N0Ojk5OTknKVxuICAgICAgdGhpc1trTW9ja0FnZW50U2V0XShvcmlnaW4sIGRpc3BhdGNoZXIpXG4gICAgICByZXR1cm4gZGlzcGF0Y2hlclxuICAgIH1cblxuICAgIC8vIElmIHdlIG1hdGNoLCBjcmVhdGUgYSBwb29sIGFuZCBhc3NpZ24gdGhlIHNhbWUgZGlzcGF0Y2hlc1xuICAgIGZvciAoY29uc3QgW2tleU1hdGNoZXIsIG5vbkV4cGxpY2l0UmVmXSBvZiBBcnJheS5mcm9tKHRoaXNba0NsaWVudHNdKSkge1xuICAgICAgY29uc3Qgbm9uRXhwbGljaXREaXNwYXRjaGVyID0gbm9uRXhwbGljaXRSZWYuZGVyZWYoKVxuICAgICAgaWYgKG5vbkV4cGxpY2l0RGlzcGF0Y2hlciAmJiB0eXBlb2Yga2V5TWF0Y2hlciAhPT0gJ3N0cmluZycgJiYgbWF0Y2hWYWx1ZShrZXlNYXRjaGVyLCBvcmlnaW4pKSB7XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XShvcmlnaW4pXG4gICAgICAgIHRoaXNba01vY2tBZ2VudFNldF0ob3JpZ2luLCBkaXNwYXRjaGVyKVxuICAgICAgICBkaXNwYXRjaGVyW2tEaXNwYXRjaGVzXSA9IG5vbkV4cGxpY2l0RGlzcGF0Y2hlcltrRGlzcGF0Y2hlc11cbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBba0dldE5ldENvbm5lY3RdICgpIHtcbiAgICByZXR1cm4gdGhpc1trTmV0Q29ubmVjdF1cbiAgfVxuXG4gIHBlbmRpbmdJbnRlcmNlcHRvcnMgKCkge1xuICAgIGNvbnN0IG1vY2tBZ2VudENsaWVudHMgPSB0aGlzW2tDbGllbnRzXVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obW9ja0FnZW50Q2xpZW50cy5lbnRyaWVzKCkpXG4gICAgICAuZmxhdE1hcCgoW29yaWdpbiwgc2NvcGVdKSA9PiBzY29wZS5kZXJlZigpW2tEaXNwYXRjaGVzXS5tYXAoZGlzcGF0Y2ggPT4gKHsgLi4uZGlzcGF0Y2gsIG9yaWdpbiB9KSkpXG4gICAgICAuZmlsdGVyKCh7IHBlbmRpbmcgfSkgPT4gcGVuZGluZylcbiAgfVxuXG4gIGFzc2VydE5vUGVuZGluZ0ludGVyY2VwdG9ycyAoeyBwZW5kaW5nSW50ZXJjZXB0b3JzRm9ybWF0dGVyID0gbmV3IFBlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIoKSB9ID0ge30pIHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nSW50ZXJjZXB0b3JzKClcblxuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGx1cmFsaXplciA9IG5ldyBQbHVyYWxpemVyKCdpbnRlcmNlcHRvcicsICdpbnRlcmNlcHRvcnMnKS5wbHVyYWxpemUocGVuZGluZy5sZW5ndGgpXG5cbiAgICB0aHJvdyBuZXcgVW5kaWNpRXJyb3IoYFxuJHtwbHVyYWxpemVyLmNvdW50fSAke3BsdXJhbGl6ZXIubm91bn0gJHtwbHVyYWxpemVyLmlzfSBwZW5kaW5nOlxuXG4ke3BlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIuZm9ybWF0KHBlbmRpbmcpfVxuYC50cmltKCkpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2NrQWdlbnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga1Byb3h5LCBrQ2xvc2UsIGtEZXN0cm95LCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IFVSTCB9ID0gcmVxdWlyZSgndXJsJylcbmNvbnN0IEFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudCcpXG5jb25zdCBQb29sID0gcmVxdWlyZSgnLi9wb29sJylcbmNvbnN0IERpc3BhdGNoZXJCYXNlID0gcmVxdWlyZSgnLi9kaXNwYXRjaGVyLWJhc2UnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgUmVxdWVzdEFib3J0ZWRFcnJvciB9ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCBidWlsZENvbm5lY3RvciA9IHJlcXVpcmUoJy4vY29yZS9jb25uZWN0JylcblxuY29uc3Qga0FnZW50ID0gU3ltYm9sKCdwcm94eSBhZ2VudCcpXG5jb25zdCBrQ2xpZW50ID0gU3ltYm9sKCdwcm94eSBjbGllbnQnKVxuY29uc3Qga1Byb3h5SGVhZGVycyA9IFN5bWJvbCgncHJveHkgaGVhZGVycycpXG5jb25zdCBrUmVxdWVzdFRscyA9IFN5bWJvbCgncmVxdWVzdCB0bHMgc2V0dGluZ3MnKVxuY29uc3Qga1Byb3h5VGxzID0gU3ltYm9sKCdwcm94eSB0bHMgc2V0dGluZ3MnKVxuY29uc3Qga0Nvbm5lY3RFbmRwb2ludCA9IFN5bWJvbCgnY29ubmVjdCBlbmRwb2ludCBmdW5jdGlvbicpXG5cbmZ1bmN0aW9uIGRlZmF1bHRQcm90b2NvbFBvcnQgKHByb3RvY29sKSB7XG4gIHJldHVybiBwcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MFxufVxuXG5mdW5jdGlvbiBidWlsZFByb3h5T3B0aW9ucyAob3B0cykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0cyA9IHsgdXJpOiBvcHRzIH1cbiAgfVxuXG4gIGlmICghb3B0cyB8fCAhb3B0cy51cmkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1Byb3h5IG9wdHMudXJpIGlzIG1hbmRhdG9yeScpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHVyaTogb3B0cy51cmksXG4gICAgcHJvdG9jb2w6IG9wdHMucHJvdG9jb2wgfHwgJ2h0dHBzJ1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRGYWN0b3J5IChvcmlnaW4sIG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBQb29sKG9yaWdpbiwgb3B0cylcbn1cblxuY2xhc3MgUHJveHlBZ2VudCBleHRlbmRzIERpc3BhdGNoZXJCYXNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXNba1Byb3h5XSA9IGJ1aWxkUHJveHlPcHRpb25zKG9wdHMpXG4gICAgdGhpc1trQWdlbnRdID0gbmV3IEFnZW50KG9wdHMpXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG9wdHMuaW50ZXJjZXB0b3JzICYmIG9wdHMuaW50ZXJjZXB0b3JzLlByb3h5QWdlbnQgJiYgQXJyYXkuaXNBcnJheShvcHRzLmludGVyY2VwdG9ycy5Qcm94eUFnZW50KVxuICAgICAgPyBvcHRzLmludGVyY2VwdG9ycy5Qcm94eUFnZW50XG4gICAgICA6IFtdXG5cbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRzID0geyB1cmk6IG9wdHMgfVxuICAgIH1cblxuICAgIGlmICghb3B0cyB8fCAhb3B0cy51cmkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignUHJveHkgb3B0cy51cmkgaXMgbWFuZGF0b3J5JylcbiAgICB9XG5cbiAgICBjb25zdCB7IGNsaWVudEZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSB9ID0gb3B0c1xuXG4gICAgaWYgKHR5cGVvZiBjbGllbnRGYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1Byb3h5IG9wdHMuY2xpZW50RmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICB0aGlzW2tSZXF1ZXN0VGxzXSA9IG9wdHMucmVxdWVzdFRsc1xuICAgIHRoaXNba1Byb3h5VGxzXSA9IG9wdHMucHJveHlUbHNcbiAgICB0aGlzW2tQcm94eUhlYWRlcnNdID0gb3B0cy5oZWFkZXJzIHx8IHt9XG5cbiAgICBjb25zdCByZXNvbHZlZFVybCA9IG5ldyBVUkwob3B0cy51cmkpXG4gICAgY29uc3QgeyBvcmlnaW4sIHBvcnQsIGhvc3QsIHVzZXJuYW1lLCBwYXNzd29yZCB9ID0gcmVzb2x2ZWRVcmxcblxuICAgIGlmIChvcHRzLmF1dGggJiYgb3B0cy50b2tlbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdvcHRzLmF1dGggY2Fubm90IGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBvcHRzLnRva2VuJylcbiAgICB9IGVsc2UgaWYgKG9wdHMuYXV0aCkge1xuICAgICAgLyogQGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIG9wdHMudG9rZW4gKi9cbiAgICAgIHRoaXNba1Byb3h5SGVhZGVyc11bJ3Byb3h5LWF1dGhvcml6YXRpb24nXSA9IGBCYXNpYyAke29wdHMuYXV0aH1gXG4gICAgfSBlbHNlIGlmIChvcHRzLnRva2VuKSB7XG4gICAgICB0aGlzW2tQcm94eUhlYWRlcnNdWydwcm94eS1hdXRob3JpemF0aW9uJ10gPSBvcHRzLnRva2VuXG4gICAgfSBlbHNlIGlmICh1c2VybmFtZSAmJiBwYXNzd29yZCkge1xuICAgICAgdGhpc1trUHJveHlIZWFkZXJzXVsncHJveHktYXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7ZGVjb2RlVVJJQ29tcG9uZW50KHVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQocGFzc3dvcmQpfWApLnRvU3RyaW5nKCdiYXNlNjQnKX1gXG4gICAgfVxuXG4gICAgY29uc3QgY29ubmVjdCA9IGJ1aWxkQ29ubmVjdG9yKHsgLi4ub3B0cy5wcm94eVRscyB9KVxuICAgIHRoaXNba0Nvbm5lY3RFbmRwb2ludF0gPSBidWlsZENvbm5lY3Rvcih7IC4uLm9wdHMucmVxdWVzdFRscyB9KVxuICAgIHRoaXNba0NsaWVudF0gPSBjbGllbnRGYWN0b3J5KHJlc29sdmVkVXJsLCB7IGNvbm5lY3QgfSlcbiAgICB0aGlzW2tBZ2VudF0gPSBuZXcgQWdlbnQoe1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGNvbm5lY3Q6IGFzeW5jIChvcHRzLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBsZXQgcmVxdWVzdGVkSG9zdCA9IG9wdHMuaG9zdFxuICAgICAgICBpZiAoIW9wdHMucG9ydCkge1xuICAgICAgICAgIHJlcXVlc3RlZEhvc3QgKz0gYDoke2RlZmF1bHRQcm90b2NvbFBvcnQob3B0cy5wcm90b2NvbCl9YFxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBzb2NrZXQsIHN0YXR1c0NvZGUgfSA9IGF3YWl0IHRoaXNba0NsaWVudF0uY29ubmVjdCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgcGF0aDogcmVxdWVzdGVkSG9zdCxcbiAgICAgICAgICAgIHNpZ25hbDogb3B0cy5zaWduYWwsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIC4uLnRoaXNba1Byb3h5SGVhZGVyc10sXG4gICAgICAgICAgICAgIGhvc3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmIChzdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICAgIHNvY2tldC5vbignZXJyb3InLCAoKSA9PiB7fSkuZGVzdHJveSgpXG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcihgUHJveHkgcmVzcG9uc2UgKCR7c3RhdHVzQ29kZX0pICE9PSAyMDAgd2hlbiBIVFRQIFR1bm5lbGluZ2ApKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3B0cy5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNvY2tldClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgc2VydmVybmFtZVxuICAgICAgICAgIGlmICh0aGlzW2tSZXF1ZXN0VGxzXSkge1xuICAgICAgICAgICAgc2VydmVybmFtZSA9IHRoaXNba1JlcXVlc3RUbHNdLnNlcnZlcm5hbWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VydmVybmFtZSA9IG9wdHMuc2VydmVybmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzW2tDb25uZWN0RW5kcG9pbnRdKHsgLi4ub3B0cywgc2VydmVybmFtZSwgaHR0cFNvY2tldDogc29ja2V0IH0sIGNhbGxiYWNrKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCB7IGhvc3QgfSA9IG5ldyBVUkwob3B0cy5vcmlnaW4pXG4gICAgY29uc3QgaGVhZGVycyA9IGJ1aWxkSGVhZGVycyhvcHRzLmhlYWRlcnMpXG4gICAgdGhyb3dJZlByb3h5QXV0aElzU2VudChoZWFkZXJzKVxuICAgIHJldHVybiB0aGlzW2tBZ2VudF0uZGlzcGF0Y2goXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICAgIGhvc3RcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXJcbiAgICApXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgYXdhaXQgdGhpc1trQWdlbnRdLmNsb3NlKClcbiAgICBhd2FpdCB0aGlzW2tDbGllbnRdLmNsb3NlKClcbiAgfVxuXG4gIGFzeW5jIFtrRGVzdHJveV0gKCkge1xuICAgIGF3YWl0IHRoaXNba0FnZW50XS5kZXN0cm95KClcbiAgICBhd2FpdCB0aGlzW2tDbGllbnRdLmRlc3Ryb3koKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz59IGhlYWRlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fVxuICovXG5mdW5jdGlvbiBidWlsZEhlYWRlcnMgKGhlYWRlcnMpIHtcbiAgLy8gV2hlbiB1c2luZyB1bmRpY2kuZmV0Y2gsIHRoZSBoZWFkZXJzIGxpc3QgaXMgc3RvcmVkXG4gIC8vIGFzIGFuIGFycmF5LlxuICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBoZWFkZXJzUGFpciA9IHt9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGhlYWRlcnNQYWlyW2hlYWRlcnNbaV1dID0gaGVhZGVyc1tpICsgMV1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyc1BhaXJcbiAgfVxuXG4gIHJldHVybiBoZWFkZXJzXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBoZWFkZXJzXG4gKlxuICogUHJldmlvdXMgdmVyc2lvbnMgb2YgUHJveHlBZ2VudCBzdWdnZXN0cyB0aGUgUHJveHktQXV0aG9yaXphdGlvbiBpbiByZXF1ZXN0IGhlYWRlcnNcbiAqIE5ldmVydGhlbGVzcywgaXQgd2FzIGNoYW5nZWQgYW5kIHRvIGF2b2lkIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBieSBlbmQgdXNlcnNcbiAqIHRoaXMgY2hlY2sgd2FzIGNyZWF0ZWQuXG4gKiBJdCBzaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIGZvciBwZXJmb3JtYW5jZSByZWFzb25zXG4gKi9cbmZ1bmN0aW9uIHRocm93SWZQcm94eUF1dGhJc1NlbnQgKGhlYWRlcnMpIHtcbiAgY29uc3QgZXhpc3RQcm94eUF1dGggPSBoZWFkZXJzICYmIE9iamVjdC5rZXlzKGhlYWRlcnMpXG4gICAgLmZpbmQoKGtleSkgPT4ga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdwcm94eS1hdXRob3JpemF0aW9uJylcbiAgaWYgKGV4aXN0UHJveHlBdXRoKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdQcm94eS1BdXRob3JpemF0aW9uIHNob3VsZCBiZSBzZW50IGluIFByb3h5QWdlbnQgY29uc3RydWN0b3InKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUHJveHlBZ2VudFxuIiwKICAgICJjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCB7IGtSZXRyeUhhbmRsZXJEZWZhdWx0UmV0cnkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IFJlcXVlc3RSZXRyeUVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IGlzRGlzdHVyYmVkLCBwYXJzZUhlYWRlcnMsIHBhcnNlUmFuZ2VIZWFkZXIgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVJldHJ5QWZ0ZXJIZWFkZXIgKHJldHJ5QWZ0ZXIpIHtcbiAgY29uc3QgY3VycmVudCA9IERhdGUubm93KClcbiAgY29uc3QgZGlmZiA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXIpLmdldFRpbWUoKSAtIGN1cnJlbnRcblxuICByZXR1cm4gZGlmZlxufVxuXG5jbGFzcyBSZXRyeUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cywgaGFuZGxlcnMpIHtcbiAgICBjb25zdCB7IHJldHJ5T3B0aW9ucywgLi4uZGlzcGF0Y2hPcHRzIH0gPSBvcHRzXG4gICAgY29uc3Qge1xuICAgICAgLy8gUmV0cnkgc2NvcGVkXG4gICAgICByZXRyeTogcmV0cnlGbixcbiAgICAgIG1heFJldHJpZXMsXG4gICAgICBtYXhUaW1lb3V0LFxuICAgICAgbWluVGltZW91dCxcbiAgICAgIHRpbWVvdXRGYWN0b3IsXG4gICAgICAvLyBSZXNwb25zZSBzY29wZWRcbiAgICAgIG1ldGhvZHMsXG4gICAgICBlcnJvckNvZGVzLFxuICAgICAgcmV0cnlBZnRlcixcbiAgICAgIHN0YXR1c0NvZGVzXG4gICAgfSA9IHJldHJ5T3B0aW9ucyA/PyB7fVxuXG4gICAgdGhpcy5kaXNwYXRjaCA9IGhhbmRsZXJzLmRpc3BhdGNoXG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcnMuaGFuZGxlclxuICAgIHRoaXMub3B0cyA9IGRpc3BhdGNoT3B0c1xuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2VcbiAgICB0aGlzLnJldHJ5T3B0cyA9IHtcbiAgICAgIHJldHJ5OiByZXRyeUZuID8/IFJldHJ5SGFuZGxlcltrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5XSxcbiAgICAgIHJldHJ5QWZ0ZXI6IHJldHJ5QWZ0ZXIgPz8gdHJ1ZSxcbiAgICAgIG1heFRpbWVvdXQ6IG1heFRpbWVvdXQgPz8gMzAgKiAxMDAwLCAvLyAzMHMsXG4gICAgICB0aW1lb3V0OiBtaW5UaW1lb3V0ID8/IDUwMCwgLy8gLjVzXG4gICAgICB0aW1lb3V0RmFjdG9yOiB0aW1lb3V0RmFjdG9yID8/IDIsXG4gICAgICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzID8/IDUsXG4gICAgICAvLyBXaGF0IGVycm9ycyB3ZSBzaG91bGQgcmV0cnlcbiAgICAgIG1ldGhvZHM6IG1ldGhvZHMgPz8gWydHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BVVCcsICdERUxFVEUnLCAnVFJBQ0UnXSxcbiAgICAgIC8vIEluZGljYXRlcyB3aGljaCBlcnJvcnMgdG8gcmV0cnlcbiAgICAgIHN0YXR1c0NvZGVzOiBzdGF0dXNDb2RlcyA/PyBbNTAwLCA1MDIsIDUwMywgNTA0LCA0MjldLFxuICAgICAgLy8gTGlzdCBvZiBlcnJvcnMgdG8gcmV0cnlcbiAgICAgIGVycm9yQ29kZXM6IGVycm9yQ29kZXMgPz8gW1xuICAgICAgICAnRUNPTk5SRVNFVCcsXG4gICAgICAgICdFQ09OTlJFRlVTRUQnLFxuICAgICAgICAnRU5PVEZPVU5EJyxcbiAgICAgICAgJ0VORVRET1dOJyxcbiAgICAgICAgJ0VORVRVTlJFQUNIJyxcbiAgICAgICAgJ0VIT1NURE9XTicsXG4gICAgICAgICdFSE9TVFVOUkVBQ0gnLFxuICAgICAgICAnRVBJUEUnXG4gICAgICBdXG4gICAgfVxuXG4gICAgdGhpcy5yZXRyeUNvdW50ID0gMFxuICAgIHRoaXMuc3RhcnQgPSAwXG4gICAgdGhpcy5lbmQgPSBudWxsXG4gICAgdGhpcy5ldGFnID0gbnVsbFxuICAgIHRoaXMucmVzdW1lID0gbnVsbFxuXG4gICAgLy8gSGFuZGxlIHBvc3NpYmxlIG9uQ29ubmVjdCBkdXBsaWNhdGlvblxuICAgIHRoaXMuaGFuZGxlci5vbkNvbm5lY3QocmVhc29uID0+IHtcbiAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcbiAgICAgIGlmICh0aGlzLmFib3J0KSB7XG4gICAgICAgIHRoaXMuYWJvcnQocmVhc29uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZWFzb24gPSByZWFzb25cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25SZXF1ZXN0U2VudCAoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlci5vblJlcXVlc3RTZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZXIub25SZXF1ZXN0U2VudCgpXG4gICAgfVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyLm9uVXBncmFkZSkge1xuICAgICAgdGhpcy5oYW5kbGVyLm9uVXBncmFkZShzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpXG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCkge1xuICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgIGFib3J0KHRoaXMucmVhc29uKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB9XG4gIH1cblxuICBvbkJvZHlTZW50IChjaHVuaykge1xuICAgIGlmICh0aGlzLmhhbmRsZXIub25Cb2R5U2VudCkgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KGNodW5rKVxuICB9XG5cbiAgc3RhdGljIFtrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5XSAoZXJyLCB7IHN0YXRlLCBvcHRzIH0sIGNiKSB7XG4gICAgY29uc3QgeyBzdGF0dXNDb2RlLCBjb2RlLCBoZWFkZXJzIH0gPSBlcnJcbiAgICBjb25zdCB7IG1ldGhvZCwgcmV0cnlPcHRpb25zIH0gPSBvcHRzXG4gICAgY29uc3Qge1xuICAgICAgbWF4UmV0cmllcyxcbiAgICAgIHRpbWVvdXQsXG4gICAgICBtYXhUaW1lb3V0LFxuICAgICAgdGltZW91dEZhY3RvcixcbiAgICAgIHN0YXR1c0NvZGVzLFxuICAgICAgZXJyb3JDb2RlcyxcbiAgICAgIG1ldGhvZHNcbiAgICB9ID0gcmV0cnlPcHRpb25zXG4gICAgbGV0IHsgY291bnRlciwgY3VycmVudFRpbWVvdXQgfSA9IHN0YXRlXG5cbiAgICBjdXJyZW50VGltZW91dCA9XG4gICAgICBjdXJyZW50VGltZW91dCAhPSBudWxsICYmIGN1cnJlbnRUaW1lb3V0ID4gMCA/IGN1cnJlbnRUaW1lb3V0IDogdGltZW91dFxuXG4gICAgLy8gQW55IGNvZGUgdGhhdCBpcyBub3QgYSBVbmRpY2kncyBvcmlnaW5hdGVkIGFuZCBhbGxvd2VkIHRvIHJldHJ5XG4gICAgaWYgKFxuICAgICAgY29kZSAmJlxuICAgICAgY29kZSAhPT0gJ1VORF9FUlJfUkVRX1JFVFJZJyAmJlxuICAgICAgY29kZSAhPT0gJ1VORF9FUlJfU09DS0VUJyAmJlxuICAgICAgIWVycm9yQ29kZXMuaW5jbHVkZXMoY29kZSlcbiAgICApIHtcbiAgICAgIGNiKGVycilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIGEgc2V0IG9mIG1ldGhvZCBhcmUgcHJvdmlkZWQgYW5kIHRoZSBjdXJyZW50IG1ldGhvZCBpcyBub3QgaW4gdGhlIGxpc3RcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRob2RzKSAmJiAhbWV0aG9kcy5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICBjYihlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiBhIHNldCBvZiBzdGF0dXMgY29kZSBhcmUgcHJvdmlkZWQgYW5kIHRoZSBjdXJyZW50IHN0YXR1cyBjb2RlIGlzIG5vdCBpbiB0aGUgbGlzdFxuICAgIGlmIChcbiAgICAgIHN0YXR1c0NvZGUgIT0gbnVsbCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShzdGF0dXNDb2RlcykgJiZcbiAgICAgICFzdGF0dXNDb2Rlcy5pbmNsdWRlcyhzdGF0dXNDb2RlKVxuICAgICkge1xuICAgICAgY2IoZXJyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgd2UgcmVhY2hlZCB0aGUgbWF4IG51bWJlciBvZiByZXRyaWVzXG4gICAgaWYgKGNvdW50ZXIgPiBtYXhSZXRyaWVzKSB7XG4gICAgICBjYihlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgcmV0cnlBZnRlckhlYWRlciA9IGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzWydyZXRyeS1hZnRlciddXG4gICAgaWYgKHJldHJ5QWZ0ZXJIZWFkZXIpIHtcbiAgICAgIHJldHJ5QWZ0ZXJIZWFkZXIgPSBOdW1iZXIocmV0cnlBZnRlckhlYWRlcilcbiAgICAgIHJldHJ5QWZ0ZXJIZWFkZXIgPSBpc05hTihyZXRyeUFmdGVySGVhZGVyKVxuICAgICAgICA/IGNhbGN1bGF0ZVJldHJ5QWZ0ZXJIZWFkZXIocmV0cnlBZnRlckhlYWRlcilcbiAgICAgICAgOiByZXRyeUFmdGVySGVhZGVyICogMWUzIC8vIFJldHJ5LUFmdGVyIGlzIGluIHNlY29uZHNcbiAgICB9XG5cbiAgICBjb25zdCByZXRyeVRpbWVvdXQgPVxuICAgICAgcmV0cnlBZnRlckhlYWRlciA+IDBcbiAgICAgICAgPyBNYXRoLm1pbihyZXRyeUFmdGVySGVhZGVyLCBtYXhUaW1lb3V0KVxuICAgICAgICA6IE1hdGgubWluKGN1cnJlbnRUaW1lb3V0ICogdGltZW91dEZhY3RvciAqKiBjb3VudGVyLCBtYXhUaW1lb3V0KVxuXG4gICAgc3RhdGUuY3VycmVudFRpbWVvdXQgPSByZXRyeVRpbWVvdXRcblxuICAgIHNldFRpbWVvdXQoKCkgPT4gY2IobnVsbCksIHJldHJ5VGltZW91dClcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgcmVzdW1lLCBzdGF0dXNNZXNzYWdlKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuXG4gICAgdGhpcy5yZXRyeUNvdW50ICs9IDFcblxuICAgIGlmIChzdGF0dXNDb2RlID49IDMwMCkge1xuICAgICAgdGhpcy5hYm9ydChcbiAgICAgICAgbmV3IFJlcXVlc3RSZXRyeUVycm9yKCdSZXF1ZXN0IGZhaWxlZCcsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIGNvdW50OiB0aGlzLnJldHJ5Q291bnRcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrcG9pbnQgZm9yIHJlc3VtZSBmcm9tIHdoZXJlIHdlIGxlZnQgaXRcbiAgICBpZiAodGhpcy5yZXN1bWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5yZXN1bWUgPSBudWxsXG5cbiAgICAgIGlmIChzdGF0dXNDb2RlICE9PSAyMDYpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGVudFJhbmdlID0gcGFyc2VSYW5nZUhlYWRlcihoZWFkZXJzWydjb250ZW50LXJhbmdlJ10pXG4gICAgICAvLyBJZiBubyBjb250ZW50IHJhbmdlXG4gICAgICBpZiAoIWNvbnRlbnRSYW5nZSkge1xuICAgICAgICB0aGlzLmFib3J0KFxuICAgICAgICAgIG5ldyBSZXF1ZXN0UmV0cnlFcnJvcignQ29udGVudC1SYW5nZSBtaXNtYXRjaCcsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBjb3VudDogdGhpcy5yZXRyeUNvdW50XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gTGV0J3Mgc3RhcnQgd2l0aCBhIHdlYWsgZXRhZyBjaGVja1xuICAgICAgaWYgKHRoaXMuZXRhZyAhPSBudWxsICYmIHRoaXMuZXRhZyAhPT0gaGVhZGVycy5ldGFnKSB7XG4gICAgICAgIHRoaXMuYWJvcnQoXG4gICAgICAgICAgbmV3IFJlcXVlc3RSZXRyeUVycm9yKCdFVGFnIG1pc21hdGNoJywgc3RhdHVzQ29kZSwge1xuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGNvdW50OiB0aGlzLnJldHJ5Q291bnRcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHN0YXJ0LCBzaXplLCBlbmQgPSBzaXplIH0gPSBjb250ZW50UmFuZ2VcblxuICAgICAgYXNzZXJ0KHRoaXMuc3RhcnQgPT09IHN0YXJ0LCAnY29udGVudC1yYW5nZSBtaXNtYXRjaCcpXG4gICAgICBhc3NlcnQodGhpcy5lbmQgPT0gbnVsbCB8fCB0aGlzLmVuZCA9PT0gZW5kLCAnY29udGVudC1yYW5nZSBtaXNtYXRjaCcpXG5cbiAgICAgIHRoaXMucmVzdW1lID0gcmVzdW1lXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLmVuZCA9PSBudWxsKSB7XG4gICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gMjA2KSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgd2UgcmVjZWl2ZSAyMDZcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBwYXJzZVJhbmdlSGVhZGVyKGhlYWRlcnNbJ2NvbnRlbnQtcmFuZ2UnXSlcblxuICAgICAgICBpZiAocmFuZ2UgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25IZWFkZXJzKFxuICAgICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgIHJhd0hlYWRlcnMsXG4gICAgICAgICAgICByZXN1bWUsXG4gICAgICAgICAgICBzdGF0dXNNZXNzYWdlXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGFydCwgc2l6ZSwgZW5kID0gc2l6ZSB9ID0gcmFuZ2VcblxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgc3RhcnQgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoc3RhcnQpICYmIHRoaXMuc3RhcnQgIT09IHN0YXJ0LFxuICAgICAgICAgICdjb250ZW50LXJhbmdlIG1pc21hdGNoJ1xuICAgICAgICApXG4gICAgICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUoc3RhcnQpKVxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgZW5kICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKGVuZCkgJiYgdGhpcy5lbmQgIT09IGVuZCxcbiAgICAgICAgICAnaW52YWxpZCBjb250ZW50LWxlbmd0aCdcbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydFxuICAgICAgICB0aGlzLmVuZCA9IGVuZFxuICAgICAgfVxuXG4gICAgICAvLyBXZSBtYWtlIG91ciBiZXN0IHRvIGNoZWNrcG9pbnQgdGhlIGJvZHkgZm9yIGZ1cnRoZXIgcmFuZ2UgaGVhZGVyc1xuICAgICAgaWYgKHRoaXMuZW5kID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ11cbiAgICAgICAgdGhpcy5lbmQgPSBjb250ZW50TGVuZ3RoICE9IG51bGwgPyBOdW1iZXIoY29udGVudExlbmd0aCkgOiBudWxsXG4gICAgICB9XG5cbiAgICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUodGhpcy5zdGFydCkpXG4gICAgICBhc3NlcnQoXG4gICAgICAgIHRoaXMuZW5kID09IG51bGwgfHwgTnVtYmVyLmlzRmluaXRlKHRoaXMuZW5kKSxcbiAgICAgICAgJ2ludmFsaWQgY29udGVudC1sZW5ndGgnXG4gICAgICApXG5cbiAgICAgIHRoaXMucmVzdW1lID0gcmVzdW1lXG4gICAgICB0aGlzLmV0YWcgPSBoZWFkZXJzLmV0YWcgIT0gbnVsbCA/IGhlYWRlcnMuZXRhZyA6IG51bGxcblxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkhlYWRlcnMoXG4gICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgIHJhd0hlYWRlcnMsXG4gICAgICAgIHJlc3VtZSxcbiAgICAgICAgc3RhdHVzTWVzc2FnZVxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGVyciA9IG5ldyBSZXF1ZXN0UmV0cnlFcnJvcignUmVxdWVzdCBmYWlsZWQnLCBzdGF0dXNDb2RlLCB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgY291bnQ6IHRoaXMucmV0cnlDb3VudFxuICAgIH0pXG5cbiAgICB0aGlzLmFib3J0KGVycilcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIHRoaXMuc3RhcnQgKz0gY2h1bmsubGVuZ3RoXG5cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRGF0YShjaHVuaylcbiAgfVxuXG4gIG9uQ29tcGxldGUgKHJhd1RyYWlsZXJzKSB7XG4gICAgdGhpcy5yZXRyeUNvdW50ID0gMFxuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25Db21wbGV0ZShyYXdUcmFpbGVycylcbiAgfVxuXG4gIG9uRXJyb3IgKGVycikge1xuICAgIGlmICh0aGlzLmFib3J0ZWQgfHwgaXNEaXN0dXJiZWQodGhpcy5vcHRzLmJvZHkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgIH1cblxuICAgIHRoaXMucmV0cnlPcHRzLnJldHJ5KFxuICAgICAgZXJyLFxuICAgICAge1xuICAgICAgICBzdGF0ZTogeyBjb3VudGVyOiB0aGlzLnJldHJ5Q291bnQrKywgY3VycmVudFRpbWVvdXQ6IHRoaXMucmV0cnlBZnRlciB9LFxuICAgICAgICBvcHRzOiB7IHJldHJ5T3B0aW9uczogdGhpcy5yZXRyeU9wdHMsIC4uLnRoaXMub3B0cyB9XG4gICAgICB9LFxuICAgICAgb25SZXRyeS5iaW5kKHRoaXMpXG4gICAgKVxuXG4gICAgZnVuY3Rpb24gb25SZXRyeSAoZXJyKSB7XG4gICAgICBpZiAoZXJyICE9IG51bGwgfHwgdGhpcy5hYm9ydGVkIHx8IGlzRGlzdHVyYmVkKHRoaXMub3B0cy5ib2R5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGFydCAhPT0gMCkge1xuICAgICAgICB0aGlzLm9wdHMgPSB7XG4gICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIC4uLnRoaXMub3B0cy5oZWFkZXJzLFxuICAgICAgICAgICAgcmFuZ2U6IGBieXRlcz0ke3RoaXMuc3RhcnR9LSR7dGhpcy5lbmQgPz8gJyd9YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHRoaXMub3B0cywgdGhpcylcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmhhbmRsZXIub25FcnJvcihlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmV0cnlIYW5kbGVyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBXZSBpbmNsdWRlIGEgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBEaXNwYXRjaGVyIEFQSS4gSW4gY2FzZSBvZiBicmVha2luZyBjaGFuZ2VzLFxuLy8gdGhpcyB2ZXJzaW9uIG51bWJlciBtdXN0IGJlIGluY3JlYXNlZCB0byBhdm9pZCBjb25mbGljdHMuXG5jb25zdCBnbG9iYWxEaXNwYXRjaGVyID0gU3ltYm9sLmZvcigndW5kaWNpLmdsb2JhbERpc3BhdGNoZXIuMScpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IEFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudCcpXG5cbmlmIChnZXRHbG9iYWxEaXNwYXRjaGVyKCkgPT09IHVuZGVmaW5lZCkge1xuICBzZXRHbG9iYWxEaXNwYXRjaGVyKG5ldyBBZ2VudCgpKVxufVxuXG5mdW5jdGlvbiBzZXRHbG9iYWxEaXNwYXRjaGVyIChhZ2VudCkge1xuICBpZiAoIWFnZW50IHx8IHR5cGVvZiBhZ2VudC5kaXNwYXRjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQXJndW1lbnQgYWdlbnQgbXVzdCBpbXBsZW1lbnQgQWdlbnQnKVxuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCBnbG9iYWxEaXNwYXRjaGVyLCB7XG4gICAgdmFsdWU6IGFnZW50LFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0R2xvYmFsRGlzcGF0Y2hlciAoKSB7XG4gIHJldHVybiBnbG9iYWxUaGlzW2dsb2JhbERpc3BhdGNoZXJdXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXRHbG9iYWxEaXNwYXRjaGVyLFxuICBnZXRHbG9iYWxEaXNwYXRjaGVyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIERlY29yYXRvckhhbmRsZXIge1xuICBjb25zdHJ1Y3RvciAoaGFuZGxlcikge1xuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgfVxuXG4gIG9uQ29ubmVjdCAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25Db25uZWN0KC4uLmFyZ3MpXG4gIH1cblxuICBvbkVycm9yICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkVycm9yKC4uLmFyZ3MpXG4gIH1cblxuICBvblVwZ3JhZGUgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uVXBncmFkZSguLi5hcmdzKVxuICB9XG5cbiAgb25IZWFkZXJzICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkhlYWRlcnMoLi4uYXJncylcbiAgfVxuXG4gIG9uRGF0YSAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25EYXRhKC4uLmFyZ3MpXG4gIH1cblxuICBvbkNvbXBsZXRlICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkNvbXBsZXRlKC4uLmFyZ3MpXG4gIH1cblxuICBvbkJvZHlTZW50ICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KC4uLmFyZ3MpXG4gIH1cbn1cbiIsCiAgICAiLy8gaHR0cHM6Ly9naXRodWIuY29tL0V0aGFuLUFycm93b29kL3VuZGljaS1mZXRjaFxuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgeyBrSGVhZGVyc0xpc3QsIGtDb25zdHJ1Y3QgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IGtHdWFyZCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHtcbiAgbWFrZUl0ZXJhdG9yLFxuICBpc1ZhbGlkSGVhZGVyTmFtZSxcbiAgaXNWYWxpZEhlYWRlclZhbHVlXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuL3dlYmlkbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCBrSGVhZGVyc01hcCA9IFN5bWJvbCgnaGVhZGVycyBtYXAnKVxuY29uc3Qga0hlYWRlcnNTb3J0ZWRNYXAgPSBTeW1ib2woJ2hlYWRlcnMgbWFwIHNvcnRlZCcpXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvZGVcbiAqL1xuZnVuY3Rpb24gaXNIVFRQV2hpdGVTcGFjZUNoYXJDb2RlIChjb2RlKSB7XG4gIHJldHVybiBjb2RlID09PSAweDAwYSB8fCBjb2RlID09PSAweDAwZCB8fCBjb2RlID09PSAweDAwOSB8fCBjb2RlID09PSAweDAyMFxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLXZhbHVlLW5vcm1hbGl6ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBvdGVudGlhbFZhbHVlXG4gKi9cbmZ1bmN0aW9uIGhlYWRlclZhbHVlTm9ybWFsaXplIChwb3RlbnRpYWxWYWx1ZSkge1xuICAvLyAgVG8gbm9ybWFsaXplIGEgYnl0ZSBzZXF1ZW5jZSBwb3RlbnRpYWxWYWx1ZSwgcmVtb3ZlXG4gIC8vICBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlIGJ5dGVzIGZyb21cbiAgLy8gIHBvdGVudGlhbFZhbHVlLlxuICBsZXQgaSA9IDA7IGxldCBqID0gcG90ZW50aWFsVmFsdWUubGVuZ3RoXG5cbiAgd2hpbGUgKGogPiBpICYmIGlzSFRUUFdoaXRlU3BhY2VDaGFyQ29kZShwb3RlbnRpYWxWYWx1ZS5jaGFyQ29kZUF0KGogLSAxKSkpIC0talxuICB3aGlsZSAoaiA+IGkgJiYgaXNIVFRQV2hpdGVTcGFjZUNoYXJDb2RlKHBvdGVudGlhbFZhbHVlLmNoYXJDb2RlQXQoaSkpKSArK2lcblxuICByZXR1cm4gaSA9PT0gMCAmJiBqID09PSBwb3RlbnRpYWxWYWx1ZS5sZW5ndGggPyBwb3RlbnRpYWxWYWx1ZSA6IHBvdGVudGlhbFZhbHVlLnN1YnN0cmluZyhpLCBqKVxufVxuXG5mdW5jdGlvbiBmaWxsIChoZWFkZXJzLCBvYmplY3QpIHtcbiAgLy8gVG8gZmlsbCBhIEhlYWRlcnMgb2JqZWN0IGhlYWRlcnMgd2l0aCBhIGdpdmVuIG9iamVjdCBvYmplY3QsIHJ1biB0aGVzZSBzdGVwczpcblxuICAvLyAxLiBJZiBvYmplY3QgaXMgYSBzZXF1ZW5jZSwgdGhlbiBmb3IgZWFjaCBoZWFkZXIgaW4gb2JqZWN0OlxuICAvLyBOb3RlOiB3ZWJpZGwgY29udmVyc2lvbiB0byBhcnJheSBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgaGVhZGVyID0gb2JqZWN0W2ldXG4gICAgICAvLyAxLiBJZiBoZWFkZXIgZG9lcyBub3QgY29udGFpbiBleGFjdGx5IHR3byBpdGVtcywgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChoZWFkZXIubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICBoZWFkZXI6ICdIZWFkZXJzIGNvbnN0cnVjdG9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBgZXhwZWN0ZWQgbmFtZS92YWx1ZSBwYWlyIHRvIGJlIGxlbmd0aCAyLCBmb3VuZCAke2hlYWRlci5sZW5ndGh9LmBcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQXBwZW5kIChoZWFkZXLigJlzIGZpcnN0IGl0ZW0sIGhlYWRlcuKAmXMgc2Vjb25kIGl0ZW0pIHRvIGhlYWRlcnMuXG4gICAgICBhcHBlbmRIZWFkZXIoaGVhZGVycywgaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIC8vIE5vdGU6IG51bGwgc2hvdWxkIHRocm93XG5cbiAgICAvLyAyLiBPdGhlcndpc2UsIG9iamVjdCBpcyBhIHJlY29yZCwgdGhlbiBmb3IgZWFjaCBrZXkg4oaSIHZhbHVlIGluIG9iamVjdCxcbiAgICAvLyAgICBhcHBlbmQgKGtleSwgdmFsdWUpIHRvIGhlYWRlcnNcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgYXBwZW5kSGVhZGVyKGhlYWRlcnMsIGtleXNbaV0sIG9iamVjdFtrZXlzW2ldXSlcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5jb252ZXJzaW9uRmFpbGVkKHtcbiAgICAgIHByZWZpeDogJ0hlYWRlcnMgY29uc3RydWN0b3InLFxuICAgICAgYXJndW1lbnQ6ICdBcmd1bWVudCAxJyxcbiAgICAgIHR5cGVzOiBbJ3NlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PicsICdyZWNvcmQ8Qnl0ZVN0cmluZywgQnl0ZVN0cmluZz4nXVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWhlYWRlcnMtYXBwZW5kXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZEhlYWRlciAoaGVhZGVycywgbmFtZSwgdmFsdWUpIHtcbiAgLy8gMS4gTm9ybWFsaXplIHZhbHVlLlxuICB2YWx1ZSA9IGhlYWRlclZhbHVlTm9ybWFsaXplKHZhbHVlKVxuXG4gIC8vIDIuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUgb3IgdmFsdWUgaXMgbm90IGFcbiAgLy8gICAgaGVhZGVyIHZhbHVlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgcHJlZml4OiAnSGVhZGVycy5hcHBlbmQnLFxuICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgfSlcbiAgfSBlbHNlIGlmICghaXNWYWxpZEhlYWRlclZhbHVlKHZhbHVlKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50KHtcbiAgICAgIHByZWZpeDogJ0hlYWRlcnMuYXBwZW5kJyxcbiAgICAgIHZhbHVlLFxuICAgICAgdHlwZTogJ2hlYWRlciB2YWx1ZSdcbiAgICB9KVxuICB9XG5cbiAgLy8gMy4gSWYgaGVhZGVyc+KAmXMgZ3VhcmQgaXMgXCJpbW11dGFibGVcIiwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgLy8gNC4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcInJlcXVlc3RcIiBhbmQgbmFtZSBpcyBhXG4gIC8vICAgIGZvcmJpZGRlbiBoZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IGZvcmJpZGRlbiBoZWFkZXIgbmFtZXNcbiAgaWYgKGhlYWRlcnNba0d1YXJkXSA9PT0gJ2ltbXV0YWJsZScpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbW11dGFibGUnKVxuICB9IGVsc2UgaWYgKGhlYWRlcnNba0d1YXJkXSA9PT0gJ3JlcXVlc3Qtbm8tY29ycycpIHtcbiAgICAvLyA1LiBPdGhlcndpc2UsIGlmIGhlYWRlcnPigJlzIGd1YXJkIGlzIFwicmVxdWVzdC1uby1jb3JzXCI6XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gNi4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcInJlc3BvbnNlXCIgYW5kIG5hbWUgaXMgYVxuICAvLyAgICBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWUsIHJldHVybi5cblxuICAvLyA3LiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBoZWFkZXJz4oCZcyBoZWFkZXIgbGlzdC5cbiAgcmV0dXJuIGhlYWRlcnNba0hlYWRlcnNMaXN0XS5hcHBlbmQobmFtZSwgdmFsdWUpXG5cbiAgLy8gOC4gSWYgaGVhZGVyc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiwgdGhlbiByZW1vdmVcbiAgLy8gICAgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QgaGVhZGVycyBmcm9tIGhlYWRlcnNcbn1cblxuY2xhc3MgSGVhZGVyc0xpc3Qge1xuICAvKiogQHR5cGUge1tzdHJpbmcsIHN0cmluZ11bXXxudWxsfSAqL1xuICBjb29raWVzID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yIChpbml0KSB7XG4gICAgaWYgKGluaXQgaW5zdGFuY2VvZiBIZWFkZXJzTGlzdCkge1xuICAgICAgdGhpc1trSGVhZGVyc01hcF0gPSBuZXcgTWFwKGluaXRba0hlYWRlcnNNYXBdKVxuICAgICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBpbml0W2tIZWFkZXJzU29ydGVkTWFwXVxuICAgICAgdGhpcy5jb29raWVzID0gaW5pdC5jb29raWVzID09PSBudWxsID8gbnVsbCA6IFsuLi5pbml0LmNvb2tpZXNdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0hlYWRlcnNNYXBdID0gbmV3IE1hcChpbml0KVxuICAgICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2hlYWRlci1saXN0LWNvbnRhaW5zXG4gIGNvbnRhaW5zIChuYW1lKSB7XG4gICAgLy8gQSBoZWFkZXIgbGlzdCBsaXN0IGNvbnRhaW5zIGEgaGVhZGVyIG5hbWUgbmFtZSBpZiBsaXN0XG4gICAgLy8gY29udGFpbnMgYSBoZWFkZXIgd2hvc2UgbmFtZSBpcyBhIGJ5dGUtY2FzZS1pbnNlbnNpdGl2ZVxuICAgIC8vIG1hdGNoIGZvciBuYW1lLlxuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTWFwXS5oYXMobmFtZSlcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aGlzW2tIZWFkZXJzTWFwXS5jbGVhcigpXG4gICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG4gICAgdGhpcy5jb29raWVzID0gbnVsbFxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLWxpc3QtYXBwZW5kXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzW2tIZWFkZXJzU29ydGVkTWFwXSA9IG51bGxcblxuICAgIC8vIDEuIElmIGxpc3QgY29udGFpbnMgbmFtZSwgdGhlbiBzZXQgbmFtZSB0byB0aGUgZmlyc3Qgc3VjaFxuICAgIC8vICAgIGhlYWRlcuKAmXMgbmFtZS5cbiAgICBjb25zdCBsb3dlcmNhc2VOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgZXhpc3RzID0gdGhpc1trSGVhZGVyc01hcF0uZ2V0KGxvd2VyY2FzZU5hbWUpXG5cbiAgICAvLyAyLiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBsaXN0LlxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIGNvbnN0IGRlbGltaXRlciA9IGxvd2VyY2FzZU5hbWUgPT09ICdjb29raWUnID8gJzsgJyA6ICcsICdcbiAgICAgIHRoaXNba0hlYWRlcnNNYXBdLnNldChsb3dlcmNhc2VOYW1lLCB7XG4gICAgICAgIG5hbWU6IGV4aXN0cy5uYW1lLFxuICAgICAgICB2YWx1ZTogYCR7ZXhpc3RzLnZhbHVlfSR7ZGVsaW1pdGVyfSR7dmFsdWV9YFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trSGVhZGVyc01hcF0uc2V0KGxvd2VyY2FzZU5hbWUsIHsgbmFtZSwgdmFsdWUgfSlcbiAgICB9XG5cbiAgICBpZiAobG93ZXJjYXNlTmFtZSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICB0aGlzLmNvb2tpZXMgPz89IFtdXG4gICAgICB0aGlzLmNvb2tpZXMucHVzaCh2YWx1ZSlcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1zZXRcbiAgc2V0IChuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdID0gbnVsbFxuICAgIGNvbnN0IGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGlmIChsb3dlcmNhc2VOYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIHRoaXMuY29va2llcyA9IFt2YWx1ZV1cbiAgICB9XG5cbiAgICAvLyAxLiBJZiBsaXN0IGNvbnRhaW5zIG5hbWUsIHRoZW4gc2V0IHRoZSB2YWx1ZSBvZlxuICAgIC8vICAgIHRoZSBmaXJzdCBzdWNoIGhlYWRlciB0byB2YWx1ZSBhbmQgcmVtb3ZlIHRoZVxuICAgIC8vICAgIG90aGVycy5cbiAgICAvLyAyLiBPdGhlcndpc2UsIGFwcGVuZCBoZWFkZXIgKG5hbWUsIHZhbHVlKSB0byBsaXN0LlxuICAgIHRoaXNba0hlYWRlcnNNYXBdLnNldChsb3dlcmNhc2VOYW1lLCB7IG5hbWUsIHZhbHVlIH0pXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1kZWxldGVcbiAgZGVsZXRlIChuYW1lKSB7XG4gICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG5cbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgICBpZiAobmFtZSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICB0aGlzLmNvb2tpZXMgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpc1trSGVhZGVyc01hcF0uZGVsZXRlKG5hbWUpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1nZXRcbiAgZ2V0IChuYW1lKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzW2tIZWFkZXJzTWFwXS5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKVxuXG4gICAgLy8gMS4gSWYgbGlzdCBkb2VzIG5vdCBjb250YWluIG5hbWUsIHRoZW4gcmV0dXJuIG51bGwuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGhlYWRlcnMgaW4gbGlzdCB3aG9zZSBuYW1lXG4gICAgLy8gICAgaXMgYSBieXRlLWNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yIG5hbWUsXG4gICAgLy8gICAgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciBieSAweDJDIDB4MjAsIGluIG9yZGVyLlxuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHZhbHVlLnZhbHVlXG4gIH1cblxuICAqIFtTeW1ib2wuaXRlcmF0b3JdICgpIHtcbiAgICAvLyB1c2UgdGhlIGxvd2VyY2FzZWQgbmFtZVxuICAgIGZvciAoY29uc3QgW25hbWUsIHsgdmFsdWUgfV0gb2YgdGhpc1trSGVhZGVyc01hcF0pIHtcbiAgICAgIHlpZWxkIFtuYW1lLCB2YWx1ZV1cbiAgICB9XG4gIH1cblxuICBnZXQgZW50cmllcyAoKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG5cbiAgICBpZiAodGhpc1trSGVhZGVyc01hcF0uc2l6ZSkge1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgdGhpc1trSGVhZGVyc01hcF0udmFsdWVzKCkpIHtcbiAgICAgICAgaGVhZGVyc1tuYW1lXSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVycy1jbGFzc1xuY2xhc3MgSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yIChpbml0ID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGluaXQgPT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0gPSBuZXcgSGVhZGVyc0xpc3QoKVxuXG4gICAgLy8gVGhlIG5ldyBIZWFkZXJzKGluaXQpIGNvbnN0cnVjdG9yIHN0ZXBzIGFyZTpcblxuICAgIC8vIDEuIFNldCB0aGlz4oCZcyBndWFyZCB0byBcIm5vbmVcIi5cbiAgICB0aGlzW2tHdWFyZF0gPSAnbm9uZSdcblxuICAgIC8vIDIuIElmIGluaXQgaXMgZ2l2ZW4sIHRoZW4gZmlsbCB0aGlzIHdpdGggaW5pdC5cbiAgICBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbml0ID0gd2ViaWRsLmNvbnZlcnRlcnMuSGVhZGVyc0luaXQoaW5pdClcbiAgICAgIGZpbGwodGhpcywgaW5pdClcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtYXBwZW5kXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0hlYWRlcnMuYXBwZW5kJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcbiAgICB2YWx1ZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcodmFsdWUpXG5cbiAgICByZXR1cm4gYXBwZW5kSGVhZGVyKHRoaXMsIG5hbWUsIHZhbHVlKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWRlbGV0ZVxuICBkZWxldGUgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0hlYWRlcnMuZGVsZXRlJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLmRlbGV0ZScsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIElmIHRoaXPigJlzIGd1YXJkIGlzIFwiaW1tdXRhYmxlXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3RcIiBhbmQgbmFtZSBpcyBhXG4gICAgLy8gICAgZm9yYmlkZGVuIGhlYWRlciBuYW1lLCByZXR1cm4uXG4gICAgLy8gNC4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3Qtbm8tY29yc1wiLCBuYW1lXG4gICAgLy8gICAgaXMgbm90IGEgbm8tQ09SUy1zYWZlbGlzdGVkIHJlcXVlc3QtaGVhZGVyIG5hbWUsIGFuZFxuICAgIC8vICAgIG5hbWUgaXMgbm90IGEgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QtaGVhZGVyIG5hbWUsXG4gICAgLy8gICAgcmV0dXJuLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXNwb25zZVwiIGFuZCBuYW1lIGlzXG4gICAgLy8gICAgYSBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWUsIHJldHVybi5cbiAgICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IGZvcmJpZGRlbiBoZWFkZXIgbmFtZXNcbiAgICBpZiAodGhpc1trR3VhcmRdID09PSAnaW1tdXRhYmxlJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW1tdXRhYmxlJylcbiAgICB9IGVsc2UgaWYgKHRoaXNba0d1YXJkXSA9PT0gJ3JlcXVlc3Qtbm8tY29ycycpIHtcbiAgICAgIC8vIFRPRE9cbiAgICB9XG5cbiAgICAvLyA2LiBJZiB0aGlz4oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIG5hbWUsIHRoZW5cbiAgICAvLyAgICByZXR1cm4uXG4gICAgaWYgKCF0aGlzW2tIZWFkZXJzTGlzdF0uY29udGFpbnMobmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDcuIERlbGV0ZSBuYW1lIGZyb20gdGhpc+KAmXMgaGVhZGVyIGxpc3QuXG4gICAgLy8gOC4gSWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiwgdGhlbiByZW1vdmVcbiAgICAvLyAgICBwcml2aWxlZ2VkIG5vLUNPUlMgcmVxdWVzdCBoZWFkZXJzIGZyb20gdGhpcy5cbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0uZGVsZXRlKG5hbWUpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtZ2V0XG4gIGdldCAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnSGVhZGVycy5nZXQnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lKVxuXG4gICAgLy8gMS4gSWYgbmFtZSBpcyBub3QgYSBoZWFkZXIgbmFtZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICAgIHByZWZpeDogJ0hlYWRlcnMuZ2V0JyxcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHR5cGU6ICdoZWFkZXIgbmFtZSdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBuYW1lIGZyb20gdGhpc+KAmXMgaGVhZGVyXG4gICAgLy8gICAgbGlzdC5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc0xpc3RdLmdldChuYW1lKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWhhc1xuICBoYXMgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0hlYWRlcnMuaGFzJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLmhhcycsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIFJldHVybiB0cnVlIGlmIHRoaXPigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIG5hbWU7XG4gICAgLy8gICAgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTGlzdF0uY29udGFpbnMobmFtZSlcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20taGVhZGVycy1zZXRcbiAgc2V0IChuYW1lLCB2YWx1ZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsIHsgaGVhZGVyOiAnSGVhZGVycy5zZXQnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lKVxuICAgIHZhbHVlID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyh2YWx1ZSlcblxuICAgIC8vIDEuIE5vcm1hbGl6ZSB2YWx1ZS5cbiAgICB2YWx1ZSA9IGhlYWRlclZhbHVlTm9ybWFsaXplKHZhbHVlKVxuXG4gICAgLy8gMi4gSWYgbmFtZSBpcyBub3QgYSBoZWFkZXIgbmFtZSBvciB2YWx1ZSBpcyBub3QgYVxuICAgIC8vICAgIGhlYWRlciB2YWx1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICAgIHByZWZpeDogJ0hlYWRlcnMuc2V0JyxcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHR5cGU6ICdoZWFkZXIgbmFtZSdcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmICghaXNWYWxpZEhlYWRlclZhbHVlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLnNldCcsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIHZhbHVlJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAzLiBJZiB0aGlz4oCZcyBndWFyZCBpcyBcImltbXV0YWJsZVwiLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIC8vIDQuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0XCIgYW5kIG5hbWUgaXMgYVxuICAgIC8vICAgIGZvcmJpZGRlbiBoZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiBhbmRcbiAgICAvLyAgICBuYW1lL3ZhbHVlIGlzIG5vdCBhIG5vLUNPUlMtc2FmZWxpc3RlZCByZXF1ZXN0LWhlYWRlcixcbiAgICAvLyAgICByZXR1cm4uXG4gICAgLy8gNi4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlc3BvbnNlXCIgYW5kIG5hbWUgaXMgYVxuICAgIC8vICAgIGZvcmJpZGRlbiByZXNwb25zZS1oZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAgIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgZm9yYmlkZGVuIGhlYWRlciBuYW1lc1xuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbW11dGFibGUnKVxuICAgIH0gZWxzZSBpZiAodGhpc1trR3VhcmRdID09PSAncmVxdWVzdC1uby1jb3JzJykge1xuICAgICAgLy8gVE9ET1xuICAgIH1cblxuICAgIC8vIDcuIFNldCAobmFtZSwgdmFsdWUpIGluIHRoaXPigJlzIGhlYWRlciBsaXN0LlxuICAgIC8vIDguIElmIHRoaXPigJlzIGd1YXJkIGlzIFwicmVxdWVzdC1uby1jb3JzXCIsIHRoZW4gcmVtb3ZlXG4gICAgLy8gICAgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QgaGVhZGVycyBmcm9tIHRoaXNcbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0uc2V0KG5hbWUsIHZhbHVlKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWdldHNldGNvb2tpZVxuICBnZXRTZXRDb29raWUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICAvLyAxLiBJZiB0aGlz4oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBTZXQtQ29va2llYCwgdGhlbiByZXR1cm4gwqsgwrsuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGhlYWRlcnMgaW4gdGhpc+KAmXMgaGVhZGVyIGxpc3Qgd2hvc2UgbmFtZSBpc1xuICAgIC8vICAgIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvciBgU2V0LUNvb2tpZWAsIGluIG9yZGVyLlxuXG4gICAgY29uc3QgbGlzdCA9IHRoaXNba0hlYWRlcnNMaXN0XS5jb29raWVzXG5cbiAgICBpZiAobGlzdCkge1xuICAgICAgcmV0dXJuIFsuLi5saXN0XVxuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLWxpc3Qtc29ydC1hbmQtY29tYmluZVxuICBnZXQgW2tIZWFkZXJzU29ydGVkTWFwXSAoKSB7XG4gICAgaWYgKHRoaXNba0hlYWRlcnNMaXN0XVtrSGVhZGVyc1NvcnRlZE1hcF0pIHtcbiAgICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTGlzdF1ba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgfVxuXG4gICAgLy8gMS4gTGV0IGhlYWRlcnMgYmUgYW4gZW1wdHkgbGlzdCBvZiBoZWFkZXJzIHdpdGggdGhlIGtleSBiZWluZyB0aGUgbmFtZVxuICAgIC8vICAgIGFuZCB2YWx1ZSB0aGUgdmFsdWUuXG4gICAgY29uc3QgaGVhZGVycyA9IFtdXG5cbiAgICAvLyAyLiBMZXQgbmFtZXMgYmUgdGhlIHJlc3VsdCBvZiBjb252ZXJ0IGhlYWRlciBuYW1lcyB0byBhIHNvcnRlZC1sb3dlcmNhc2VcbiAgICAvLyAgICBzZXQgd2l0aCBhbGwgdGhlIG5hbWVzIG9mIHRoZSBoZWFkZXJzIGluIGxpc3QuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4udGhpc1trSGVhZGVyc0xpc3RdXS5zb3J0KChhLCBiKSA9PiBhWzBdIDwgYlswXSA/IC0xIDogMSlcbiAgICBjb25zdCBjb29raWVzID0gdGhpc1trSGVhZGVyc0xpc3RdLmNvb2tpZXNcblxuICAgIC8vIDMuIEZvciBlYWNoIG5hbWUgb2YgbmFtZXM6XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IG5hbWVzW2ldXG4gICAgICAvLyAxLiBJZiBuYW1lIGlzIGBzZXQtY29va2llYCwgdGhlbjpcbiAgICAgIGlmIChuYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgLy8gMS4gTGV0IHZhbHVlcyBiZSBhIGxpc3Qgb2YgYWxsIHZhbHVlcyBvZiBoZWFkZXJzIGluIGxpc3Qgd2hvc2UgbmFtZVxuICAgICAgICAvLyAgICBpcyBhIGJ5dGUtY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgbmFtZSwgaW4gb3JkZXIuXG5cbiAgICAgICAgLy8gMi4gRm9yIGVhY2ggdmFsdWUgb2YgdmFsdWVzOlxuICAgICAgICAvLyAxLiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBoZWFkZXJzLlxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvb2tpZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBoZWFkZXJzLnB1c2goW25hbWUsIGNvb2tpZXNbal1dKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAyLiBPdGhlcndpc2U6XG5cbiAgICAgICAgLy8gMS4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBuYW1lIGZyb20gbGlzdC5cblxuICAgICAgICAvLyAyLiBBc3NlcnQ6IHZhbHVlIGlzIG5vbi1udWxsLlxuICAgICAgICBhc3NlcnQodmFsdWUgIT09IG51bGwpXG5cbiAgICAgICAgLy8gMy4gQXBwZW5kIChuYW1lLCB2YWx1ZSkgdG8gaGVhZGVycy5cbiAgICAgICAgaGVhZGVycy5wdXNoKFtuYW1lLCB2YWx1ZV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trSGVhZGVyc0xpc3RdW2tIZWFkZXJzU29ydGVkTWFwXSA9IGhlYWRlcnNcblxuICAgIC8vIDQuIFJldHVybiBoZWFkZXJzLlxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICBrZXlzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgaWYgKHRoaXNba0d1YXJkXSA9PT0gJ2ltbXV0YWJsZScpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trSGVhZGVyc1NvcnRlZE1hcF1cbiAgICAgIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4gdmFsdWUsICdIZWFkZXJzJyxcbiAgICAgICAgJ2tleScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJdGVyYXRvcihcbiAgICAgICgpID0+IFsuLi50aGlzW2tIZWFkZXJzU29ydGVkTWFwXS52YWx1ZXMoKV0sXG4gICAgICAnSGVhZGVycycsXG4gICAgICAna2V5J1xuICAgIClcbiAgfVxuXG4gIHZhbHVlcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHZhbHVlLCAnSGVhZGVycycsXG4gICAgICAgICd2YWx1ZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJdGVyYXRvcihcbiAgICAgICgpID0+IFsuLi50aGlzW2tIZWFkZXJzU29ydGVkTWFwXS52YWx1ZXMoKV0sXG4gICAgICAnSGVhZGVycycsXG4gICAgICAndmFsdWUnXG4gICAgKVxuICB9XG5cbiAgZW50cmllcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHZhbHVlLCAnSGVhZGVycycsXG4gICAgICAgICdrZXkrdmFsdWUnKVxuICAgIH1cblxuICAgIHJldHVybiBtYWtlSXRlcmF0b3IoXG4gICAgICAoKSA9PiBbLi4udGhpc1trSGVhZGVyc1NvcnRlZE1hcF0udmFsdWVzKCldLFxuICAgICAgJ0hlYWRlcnMnLFxuICAgICAgJ2tleSt2YWx1ZSdcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHNlbGY6IEhlYWRlcnMpID0+IHZvaWR9IGNhbGxiYWNrRm5cbiAgICogQHBhcmFtIHt1bmtub3dufSB0aGlzQXJnXG4gICAqL1xuICBmb3JFYWNoIChjYWxsYmFja0ZuLCB0aGlzQXJnID0gZ2xvYmFsVGhpcykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnSGVhZGVycy5mb3JFYWNoJyB9KVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFja0ZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBleGVjdXRlICdmb3JFYWNoJyBvbiAnSGVhZGVycyc6IHBhcmFtZXRlciAxIGlzIG5vdCBvZiB0eXBlICdGdW5jdGlvbicuXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzKSB7XG4gICAgICBjYWxsYmFja0ZuLmFwcGx5KHRoaXNBcmcsIFt2YWx1ZSwga2V5LCB0aGlzXSlcbiAgICB9XG4gIH1cblxuICBbU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc0xpc3RdXG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXNcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSGVhZGVycy5wcm90b3R5cGUsIHtcbiAgYXBwZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWxldGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGdldDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGFzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzZXQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGdldFNldENvb2tpZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAga2V5czoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgdmFsdWVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBlbnRyaWVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBmb3JFYWNoOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLml0ZXJhdG9yXTogeyBlbnVtZXJhYmxlOiBmYWxzZSB9LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnSGVhZGVycycsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0ID0gZnVuY3Rpb24gKFYpIHtcbiAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgPT09ICdPYmplY3QnKSB7XG4gICAgaWYgKFZbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4nXShWKVxuICAgIH1cblxuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVyc1sncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J10oVilcbiAgfVxuXG4gIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgcHJlZml4OiAnSGVhZGVycyBjb25zdHJ1Y3RvcicsXG4gICAgYXJndW1lbnQ6ICdBcmd1bWVudCAxJyxcbiAgICB0eXBlczogWydzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4nLCAncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J11cbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGZpbGwsXG4gIEhlYWRlcnMsXG4gIEhlYWRlcnNMaXN0XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEhlYWRlcnMsIEhlYWRlcnNMaXN0LCBmaWxsIH0gPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuY29uc3QgeyBleHRyYWN0Qm9keSwgY2xvbmVCb2R5LCBtaXhpbkJvZHkgfSA9IHJlcXVpcmUoJy4vYm9keScpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gdXRpbFxuY29uc3Qge1xuICBpc1ZhbGlkUmVhc29uUGhyYXNlLFxuICBpc0NhbmNlbGxlZCxcbiAgaXNBYm9ydGVkLFxuICBpc0Jsb2JMaWtlLFxuICBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcsXG4gIGlzRXJyb3JMaWtlLFxuICBpc29tb3JwaGljRW5jb2RlXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHtcbiAgcmVkaXJlY3RTdGF0dXNTZXQsXG4gIG51bGxCb2R5U3RhdHVzLFxuICBET01FeGNlcHRpb25cbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IGtTdGF0ZSwga0hlYWRlcnMsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgRm9ybURhdGEgfSA9IHJlcXVpcmUoJy4vZm9ybWRhdGEnKVxuY29uc3QgeyBnZXRHbG9iYWxPcmlnaW4gfSA9IHJlcXVpcmUoJy4vZ2xvYmFsJylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi9kYXRhVVJMJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0LCBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuXG5jb25zdCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gfHwgcmVxdWlyZSgnc3RyZWFtL3dlYicpLlJlYWRhYmxlU3RyZWFtXG5jb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigndXRmLTgnKVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVzcG9uc2UtY2xhc3NcbmNsYXNzIFJlc3BvbnNlIHtcbiAgLy8gQ3JlYXRlcyBuZXR3b3JrIGVycm9yIFJlc3BvbnNlLlxuICBzdGF0aWMgZXJyb3IgKCkge1xuICAgIC8vIFRPRE9cbiAgICBjb25zdCByZWxldmFudFJlYWxtID0geyBzZXR0aW5nc09iamVjdDoge30gfVxuXG4gICAgLy8gVGhlIHN0YXRpYyBlcnJvcigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYVxuICAgIC8vIFJlc3BvbnNlIG9iamVjdCwgZ2l2ZW4gYSBuZXcgbmV0d29yayBlcnJvciwgXCJpbW11dGFibGVcIiwgYW5kIHRoaXPigJlzXG4gICAgLy8gcmVsZXZhbnQgUmVhbG0uXG4gICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UoKVxuICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0gPSBtYWtlTmV0d29ya0Vycm9yKClcbiAgICByZXNwb25zZU9iamVjdFtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5oZWFkZXJzTGlzdFxuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrR3VhcmRdID0gJ2ltbXV0YWJsZSdcbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXR1cm4gcmVzcG9uc2VPYmplY3RcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tcmVzcG9uc2UtanNvblxuICBzdGF0aWMganNvbiAoZGF0YSwgaW5pdCA9IHt9KSB7XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1Jlc3BvbnNlLmpzb24nIH0pXG5cbiAgICBpZiAoaW5pdCAhPT0gbnVsbCkge1xuICAgICAgaW5pdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlc3BvbnNlSW5pdChpbml0KVxuICAgIH1cblxuICAgIC8vIDEuIExldCBieXRlcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgc2VyaWFsaXplIGEgSmF2YVNjcmlwdCB2YWx1ZSB0byBKU09OIGJ5dGVzIG9uIGRhdGEuXG4gICAgY29uc3QgYnl0ZXMgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoXG4gICAgICBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcoZGF0YSlcbiAgICApXG5cbiAgICAvLyAyLiBMZXQgYm9keSBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgYnl0ZXMuXG4gICAgY29uc3QgYm9keSA9IGV4dHJhY3RCb2R5KGJ5dGVzKVxuXG4gICAgLy8gMy4gTGV0IHJlc3BvbnNlT2JqZWN0IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsIGdpdmVuIGEgbmV3IHJlc3BvbnNlLFxuICAgIC8vICAgIFwicmVzcG9uc2VcIiwgYW5kIHRoaXPigJlzIHJlbGV2YW50IFJlYWxtLlxuICAgIGNvbnN0IHJlbGV2YW50UmVhbG0gPSB7IHNldHRpbmdzT2JqZWN0OiB7fSB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UoKVxuICAgIHJlc3BvbnNlT2JqZWN0W2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAncmVzcG9uc2UnXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG5cbiAgICAvLyA0LiBQZXJmb3JtIGluaXRpYWxpemUgYSByZXNwb25zZSBnaXZlbiByZXNwb25zZU9iamVjdCwgaW5pdCwgYW5kIChib2R5LCBcImFwcGxpY2F0aW9uL2pzb25cIikuXG4gICAgaW5pdGlhbGl6ZVJlc3BvbnNlKHJlc3BvbnNlT2JqZWN0LCBpbml0LCB7IGJvZHk6IGJvZHlbMF0sIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KVxuXG4gICAgLy8gNS4gUmV0dXJuIHJlc3BvbnNlT2JqZWN0LlxuICAgIHJldHVybiByZXNwb25zZU9iamVjdFxuICB9XG5cbiAgLy8gQ3JlYXRlcyBhIHJlZGlyZWN0IFJlc3BvbnNlIHRoYXQgcmVkaXJlY3RzIHRvIHVybCB3aXRoIHN0YXR1cyBzdGF0dXMuXG4gIHN0YXRpYyByZWRpcmVjdCAodXJsLCBzdGF0dXMgPSAzMDIpIHtcbiAgICBjb25zdCByZWxldmFudFJlYWxtID0geyBzZXR0aW5nc09iamVjdDoge30gfVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1Jlc3BvbnNlLnJlZGlyZWN0JyB9KVxuXG4gICAgdXJsID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKHVybClcbiAgICBzdGF0dXMgPSB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgc2hvcnQnXShzdGF0dXMpXG5cbiAgICAvLyAxLiBMZXQgcGFyc2VkVVJMIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyB1cmwgd2l0aCBjdXJyZW50IHNldHRpbmdzXG4gICAgLy8gb2JqZWN04oCZcyBBUEkgYmFzZSBVUkwuXG4gICAgLy8gMi4gSWYgcGFyc2VkVVJMIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgLy8gVE9ETzogYmFzZS1VUkw/XG4gICAgbGV0IHBhcnNlZFVSTFxuICAgIHRyeSB7XG4gICAgICBwYXJzZWRVUkwgPSBuZXcgVVJMKHVybCwgZ2V0R2xvYmFsT3JpZ2luKCkpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBVUkwgZnJvbSAnICsgdXJsKSwge1xuICAgICAgICBjYXVzZTogZXJyXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDMuIElmIHN0YXR1cyBpcyBub3QgYSByZWRpcmVjdCBzdGF0dXMsIHRoZW4gdGhyb3cgYSBSYW5nZUVycm9yLlxuICAgIGlmICghcmVkaXJlY3RTdGF0dXNTZXQuaGFzKHN0YXR1cykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlICcgKyBzdGF0dXMpXG4gICAgfVxuXG4gICAgLy8gNC4gTGV0IHJlc3BvbnNlT2JqZWN0IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsXG4gICAgLy8gZ2l2ZW4gYSBuZXcgcmVzcG9uc2UsIFwiaW1tdXRhYmxlXCIsIGFuZCB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cbiAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgcmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9ICdpbW11dGFibGUnXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG5cbiAgICAvLyA1LiBTZXQgcmVzcG9uc2VPYmplY3TigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXMgdG8gc3RhdHVzLlxuICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0uc3RhdHVzID0gc3RhdHVzXG5cbiAgICAvLyA2LiBMZXQgdmFsdWUgYmUgcGFyc2VkVVJMLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQuXG4gICAgY29uc3QgdmFsdWUgPSBpc29tb3JwaGljRW5jb2RlKFVSTFNlcmlhbGl6ZXIocGFyc2VkVVJMKSlcblxuICAgIC8vIDcuIEFwcGVuZCBgTG9jYXRpb25gL3ZhbHVlIHRvIHJlc3BvbnNlT2JqZWN04oCZcyByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gICAgcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5oZWFkZXJzTGlzdC5hcHBlbmQoJ2xvY2F0aW9uJywgdmFsdWUpXG5cbiAgICAvLyA4LiBSZXR1cm4gcmVzcG9uc2VPYmplY3QuXG4gICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlc3BvbnNlXG4gIGNvbnN0cnVjdG9yIChib2R5ID0gbnVsbCwgaW5pdCA9IHt9KSB7XG4gICAgaWYgKGJvZHkgIT09IG51bGwpIHtcbiAgICAgIGJvZHkgPSB3ZWJpZGwuY29udmVydGVycy5Cb2R5SW5pdChib2R5KVxuICAgIH1cblxuICAgIGluaXQgPSB3ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQoaW5pdClcblxuICAgIC8vIFRPRE9cbiAgICB0aGlzW2tSZWFsbV0gPSB7IHNldHRpbmdzT2JqZWN0OiB7fSB9XG5cbiAgICAvLyAxLiBTZXQgdGhpc+KAmXMgcmVzcG9uc2UgdG8gYSBuZXcgcmVzcG9uc2UuXG4gICAgdGhpc1trU3RhdGVdID0gbWFrZVJlc3BvbnNlKHt9KVxuXG4gICAgLy8gMi4gU2V0IHRoaXPigJlzIGhlYWRlcnMgdG8gYSBuZXcgSGVhZGVycyBvYmplY3Qgd2l0aCB0aGlz4oCZcyByZWxldmFudFxuICAgIC8vIFJlYWxtLCB3aG9zZSBoZWFkZXIgbGlzdCBpcyB0aGlz4oCZcyByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QgYW5kIGd1YXJkXG4gICAgLy8gaXMgXCJyZXNwb25zZVwiLlxuICAgIHRoaXNba0hlYWRlcnNdID0gbmV3IEhlYWRlcnMoa0NvbnN0cnVjdClcbiAgICB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdID0gJ3Jlc3BvbnNlJ1xuICAgIHRoaXNba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF0gPSB0aGlzW2tTdGF0ZV0uaGVhZGVyc0xpc3RcbiAgICB0aGlzW2tIZWFkZXJzXVtrUmVhbG1dID0gdGhpc1trUmVhbG1dXG5cbiAgICAvLyAzLiBMZXQgYm9keVdpdGhUeXBlIGJlIG51bGwuXG4gICAgbGV0IGJvZHlXaXRoVHlwZSA9IG51bGxcblxuICAgIC8vIDQuIElmIGJvZHkgaXMgbm9uLW51bGwsIHRoZW4gc2V0IGJvZHlXaXRoVHlwZSB0byB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgYm9keS5cbiAgICBpZiAoYm9keSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBbZXh0cmFjdGVkQm9keSwgdHlwZV0gPSBleHRyYWN0Qm9keShib2R5KVxuICAgICAgYm9keVdpdGhUeXBlID0geyBib2R5OiBleHRyYWN0ZWRCb2R5LCB0eXBlIH1cbiAgICB9XG5cbiAgICAvLyA1LiBQZXJmb3JtIGluaXRpYWxpemUgYSByZXNwb25zZSBnaXZlbiB0aGlzLCBpbml0LCBhbmQgYm9keVdpdGhUeXBlLlxuICAgIGluaXRpYWxpemVSZXNwb25zZSh0aGlzLCBpbml0LCBib2R5V2l0aFR5cGUpXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyB0eXBlLCBlLmcuLCBcImNvcnNcIi5cbiAgZ2V0IHR5cGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHR5cGUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVzcG9uc2XigJlzIHR5cGUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS50eXBlXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBVUkwsIGlmIGl0IGhhcyBvbmU7IG90aGVyd2lzZSB0aGUgZW1wdHkgc3RyaW5nLlxuICBnZXQgdXJsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIGNvbnN0IHVybExpc3QgPSB0aGlzW2tTdGF0ZV0udXJsTGlzdFxuXG4gICAgLy8gVGhlIHVybCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoaXPigJlzXG4gICAgLy8gcmVzcG9uc2XigJlzIFVSTCBpcyBudWxsOyBvdGhlcndpc2UgdGhpc+KAmXMgcmVzcG9uc2XigJlzIFVSTCxcbiAgICAvLyBzZXJpYWxpemVkIHdpdGggZXhjbHVkZSBmcmFnbWVudCBzZXQgdG8gdHJ1ZS5cbiAgICBjb25zdCB1cmwgPSB1cmxMaXN0W3VybExpc3QubGVuZ3RoIC0gMV0gPz8gbnVsbFxuXG4gICAgaWYgKHVybCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgcmV0dXJuIFVSTFNlcmlhbGl6ZXIodXJsLCB0cnVlKVxuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHJlc3BvbnNlIHdhcyBvYnRhaW5lZCB0aHJvdWdoIGEgcmVkaXJlY3QuXG4gIGdldCByZWRpcmVjdGVkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSByZWRpcmVjdGVkIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXMgcmVzcG9uc2XigJlzIFVSTFxuICAgIC8vIGxpc3QgaGFzIG1vcmUgdGhhbiBvbmUgaXRlbTsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0udXJsTGlzdC5sZW5ndGggPiAxXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBzdGF0dXMuXG4gIGdldCBzdGF0dXMgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHN0YXR1cyBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uc3RhdHVzXG4gIH1cblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyBhbiBvayBzdGF0dXMuXG4gIGdldCBvayAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICAvLyBUaGUgb2sgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdHJ1ZSBpZiB0aGlz4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzIGlzIGFuXG4gICAgLy8gb2sgc3RhdHVzOyBvdGhlcndpc2UgZmFsc2UuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5zdGF0dXMgPj0gMjAwICYmIHRoaXNba1N0YXRlXS5zdGF0dXMgPD0gMjk5XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBzdGF0dXMgbWVzc2FnZS5cbiAgZ2V0IHN0YXR1c1RleHQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHN0YXR1c1RleHQgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVzcG9uc2XigJlzIHN0YXR1c1xuICAgIC8vIG1lc3NhZ2UuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5zdGF0dXNUZXh0XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBoZWFkZXJzIGFzIEhlYWRlcnMuXG4gIGdldCBoZWFkZXJzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSBoZWFkZXJzIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIGhlYWRlcnMuXG4gICAgcmV0dXJuIHRoaXNba0hlYWRlcnNdXG4gIH1cblxuICBnZXQgYm9keSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJvZHkgPyB0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0gOiBudWxsXG4gIH1cblxuICBnZXQgYm9keVVzZWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgcmV0dXJuICEhdGhpc1trU3RhdGVdLmJvZHkgJiYgdXRpbC5pc0Rpc3R1cmJlZCh0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0pXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgcmVzcG9uc2UuXG4gIGNsb25lICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIDEuIElmIHRoaXMgaXMgdW51c2FibGUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHRoaXMuYm9keVVzZWQgfHwgKHRoaXMuYm9keSAmJiB0aGlzLmJvZHkubG9ja2VkKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdSZXNwb25zZS5jbG9uZScsXG4gICAgICAgIG1lc3NhZ2U6ICdCb2R5IGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQuJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAyLiBMZXQgY2xvbmVkUmVzcG9uc2UgYmUgdGhlIHJlc3VsdCBvZiBjbG9uaW5nIHRoaXPigJlzIHJlc3BvbnNlLlxuICAgIGNvbnN0IGNsb25lZFJlc3BvbnNlID0gY2xvbmVSZXNwb25zZSh0aGlzW2tTdGF0ZV0pXG5cbiAgICAvLyAzLiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIFJlc3BvbnNlIG9iamVjdCwgZ2l2ZW5cbiAgICAvLyBjbG9uZWRSZXNwb25zZSwgdGhpc+KAmXMgaGVhZGVyc+KAmXMgZ3VhcmQsIGFuZCB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cbiAgICBjb25zdCBjbG9uZWRSZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgY2xvbmVkUmVzcG9uc2VPYmplY3Rba1N0YXRlXSA9IGNsb25lZFJlc3BvbnNlXG4gICAgY2xvbmVkUmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuICAgIGNsb25lZFJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gY2xvbmVkUmVzcG9uc2UuaGVhZGVyc0xpc3RcbiAgICBjbG9uZWRSZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9IHRoaXNba0hlYWRlcnNdW2tHdWFyZF1cbiAgICBjbG9uZWRSZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba1JlYWxtXSA9IHRoaXNba0hlYWRlcnNdW2tSZWFsbV1cblxuICAgIHJldHVybiBjbG9uZWRSZXNwb25zZU9iamVjdFxuICB9XG59XG5cbm1peGluQm9keShSZXNwb25zZSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVzcG9uc2UucHJvdG90eXBlLCB7XG4gIHR5cGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHVybDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgc3RhdHVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvazoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVkaXJlY3RlZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgc3RhdHVzVGV4dDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGVhZGVyczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY2xvbmU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHk6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHlVc2VkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnUmVzcG9uc2UnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXNwb25zZSwge1xuICBqc29uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWRpcmVjdDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXJlc3BvbnNlLWNsb25lXG5mdW5jdGlvbiBjbG9uZVJlc3BvbnNlIChyZXNwb25zZSkge1xuICAvLyBUbyBjbG9uZSBhIHJlc3BvbnNlIHJlc3BvbnNlLCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSwgdGhlbiByZXR1cm4gYSBuZXcgaWRlbnRpY2FsXG4gIC8vIGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIGludGVybmFsIHJlc3BvbnNlIGlzIGEgY2xvbmUgb2YgcmVzcG9uc2XigJlzXG4gIC8vIGludGVybmFsIHJlc3BvbnNlLlxuICBpZiAocmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZSkge1xuICAgIHJldHVybiBmaWx0ZXJSZXNwb25zZShcbiAgICAgIGNsb25lUmVzcG9uc2UocmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZSksXG4gICAgICByZXNwb25zZS50eXBlXG4gICAgKVxuICB9XG5cbiAgLy8gMi4gTGV0IG5ld1Jlc3BvbnNlIGJlIGEgY29weSBvZiByZXNwb25zZSwgZXhjZXB0IGZvciBpdHMgYm9keS5cbiAgY29uc3QgbmV3UmVzcG9uc2UgPSBtYWtlUmVzcG9uc2UoeyAuLi5yZXNwb25zZSwgYm9keTogbnVsbCB9KVxuXG4gIC8vIDMuIElmIHJlc3BvbnNl4oCZcyBib2R5IGlzIG5vbi1udWxsLCB0aGVuIHNldCBuZXdSZXNwb25zZeKAmXMgYm9keSB0byB0aGVcbiAgLy8gcmVzdWx0IG9mIGNsb25pbmcgcmVzcG9uc2XigJlzIGJvZHkuXG4gIGlmIChyZXNwb25zZS5ib2R5ICE9IG51bGwpIHtcbiAgICBuZXdSZXNwb25zZS5ib2R5ID0gY2xvbmVCb2R5KHJlc3BvbnNlLmJvZHkpXG4gIH1cblxuICAvLyA0LiBSZXR1cm4gbmV3UmVzcG9uc2UuXG4gIHJldHVybiBuZXdSZXNwb25zZVxufVxuXG5mdW5jdGlvbiBtYWtlUmVzcG9uc2UgKGluaXQpIHtcbiAgcmV0dXJuIHtcbiAgICBhYm9ydGVkOiBmYWxzZSxcbiAgICByYW5nZVJlcXVlc3RlZDogZmFsc2UsXG4gICAgdGltaW5nQWxsb3dQYXNzZWQ6IGZhbHNlLFxuICAgIHJlcXVlc3RJbmNsdWRlc0NyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgc3RhdHVzOiAyMDAsXG4gICAgdGltaW5nSW5mbzogbnVsbCxcbiAgICBjYWNoZVN0YXRlOiAnJyxcbiAgICBzdGF0dXNUZXh0OiAnJyxcbiAgICAuLi5pbml0LFxuICAgIGhlYWRlcnNMaXN0OiBpbml0LmhlYWRlcnNMaXN0XG4gICAgICA/IG5ldyBIZWFkZXJzTGlzdChpbml0LmhlYWRlcnNMaXN0KVxuICAgICAgOiBuZXcgSGVhZGVyc0xpc3QoKSxcbiAgICB1cmxMaXN0OiBpbml0LnVybExpc3QgPyBbLi4uaW5pdC51cmxMaXN0XSA6IFtdXG4gIH1cbn1cblxuZnVuY3Rpb24gbWFrZU5ldHdvcmtFcnJvciAocmVhc29uKSB7XG4gIGNvbnN0IGlzRXJyb3IgPSBpc0Vycm9yTGlrZShyZWFzb24pXG4gIHJldHVybiBtYWtlUmVzcG9uc2Uoe1xuICAgIHR5cGU6ICdlcnJvcicsXG4gICAgc3RhdHVzOiAwLFxuICAgIGVycm9yOiBpc0Vycm9yXG4gICAgICA/IHJlYXNvblxuICAgICAgOiBuZXcgRXJyb3IocmVhc29uID8gU3RyaW5nKHJlYXNvbikgOiByZWFzb24pLFxuICAgIGFib3J0ZWQ6IHJlYXNvbiAmJiByZWFzb24ubmFtZSA9PT0gJ0Fib3J0RXJyb3InXG4gIH0pXG59XG5cbmZ1bmN0aW9uIG1ha2VGaWx0ZXJlZFJlc3BvbnNlIChyZXNwb25zZSwgc3RhdGUpIHtcbiAgc3RhdGUgPSB7XG4gICAgaW50ZXJuYWxSZXNwb25zZTogcmVzcG9uc2UsXG4gICAgLi4uc3RhdGVcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJveHkocmVzcG9uc2UsIHtcbiAgICBnZXQgKHRhcmdldCwgcCkge1xuICAgICAgcmV0dXJuIHAgaW4gc3RhdGUgPyBzdGF0ZVtwXSA6IHRhcmdldFtwXVxuICAgIH0sXG4gICAgc2V0ICh0YXJnZXQsIHAsIHZhbHVlKSB7XG4gICAgICBhc3NlcnQoIShwIGluIHN0YXRlKSlcbiAgICAgIHRhcmdldFtwXSA9IHZhbHVlXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfSlcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZmlsdGVyZWQtcmVzcG9uc2VcbmZ1bmN0aW9uIGZpbHRlclJlc3BvbnNlIChyZXNwb25zZSwgdHlwZSkge1xuICAvLyBTZXQgcmVzcG9uc2UgdG8gdGhlIGZvbGxvd2luZyBmaWx0ZXJlZCByZXNwb25zZSB3aXRoIHJlc3BvbnNlIGFzIGl0c1xuICAvLyBpbnRlcm5hbCByZXNwb25zZSwgZGVwZW5kaW5nIG9uIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nOlxuICBpZiAodHlwZSA9PT0gJ2Jhc2ljJykge1xuICAgIC8vIEEgYmFzaWMgZmlsdGVyZWQgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSB0eXBlIGlzIFwiYmFzaWNcIlxuICAgIC8vIGFuZCBoZWFkZXIgbGlzdCBleGNsdWRlcyBhbnkgaGVhZGVycyBpbiBpbnRlcm5hbCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3RcbiAgICAvLyB3aG9zZSBuYW1lIGlzIGEgZm9yYmlkZGVuIHJlc3BvbnNlLWhlYWRlciBuYW1lLlxuXG4gICAgLy8gTm90ZTogdW5kaWNpIGRvZXMgbm90IGltcGxlbWVudCBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWVzXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnYmFzaWMnLFxuICAgICAgaGVhZGVyc0xpc3Q6IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnY29ycycpIHtcbiAgICAvLyBBIENPUlMgZmlsdGVyZWQgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSB0eXBlIGlzIFwiY29yc1wiXG4gICAgLy8gYW5kIGhlYWRlciBsaXN0IGV4Y2x1ZGVzIGFueSBoZWFkZXJzIGluIGludGVybmFsIHJlc3BvbnNl4oCZcyBoZWFkZXJcbiAgICAvLyBsaXN0IHdob3NlIG5hbWUgaXMgbm90IGEgQ09SUy1zYWZlbGlzdGVkIHJlc3BvbnNlLWhlYWRlciBuYW1lLCBnaXZlblxuICAgIC8vIGludGVybmFsIHJlc3BvbnNl4oCZcyBDT1JTLWV4cG9zZWQgaGVhZGVyLW5hbWUgbGlzdC5cblxuICAgIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgQ09SUy1zYWZlbGlzdGVkIHJlc3BvbnNlLWhlYWRlciBuYW1lc1xuICAgIHJldHVybiBtYWtlRmlsdGVyZWRSZXNwb25zZShyZXNwb25zZSwge1xuICAgICAgdHlwZTogJ2NvcnMnLFxuICAgICAgaGVhZGVyc0xpc3Q6IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BhcXVlJykge1xuICAgIC8vIEFuIG9wYXF1ZSBmaWx0ZXJlZCByZXNwb25zZSBpcyBhIGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIHR5cGUgaXNcbiAgICAvLyBcIm9wYXF1ZVwiLCBVUkwgbGlzdCBpcyB0aGUgZW1wdHkgbGlzdCwgc3RhdHVzIGlzIDAsIHN0YXR1cyBtZXNzYWdlXG4gICAgLy8gaXMgdGhlIGVtcHR5IGJ5dGUgc2VxdWVuY2UsIGhlYWRlciBsaXN0IGlzIGVtcHR5LCBhbmQgYm9keSBpcyBudWxsLlxuXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnb3BhcXVlJyxcbiAgICAgIHVybExpc3Q6IE9iamVjdC5mcmVlemUoW10pLFxuICAgICAgc3RhdHVzOiAwLFxuICAgICAgc3RhdHVzVGV4dDogJycsXG4gICAgICBib2R5OiBudWxsXG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BhcXVlcmVkaXJlY3QnKSB7XG4gICAgLy8gQW4gb3BhcXVlLXJlZGlyZWN0IGZpbHRlcmVkIHJlc3BvbnNlIGlzIGEgZmlsdGVyZWQgcmVzcG9uc2Ugd2hvc2UgdHlwZVxuICAgIC8vIGlzIFwib3BhcXVlcmVkaXJlY3RcIiwgc3RhdHVzIGlzIDAsIHN0YXR1cyBtZXNzYWdlIGlzIHRoZSBlbXB0eSBieXRlXG4gICAgLy8gc2VxdWVuY2UsIGhlYWRlciBsaXN0IGlzIGVtcHR5LCBhbmQgYm9keSBpcyBudWxsLlxuXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnb3BhcXVlcmVkaXJlY3QnLFxuICAgICAgc3RhdHVzOiAwLFxuICAgICAgc3RhdHVzVGV4dDogJycsXG4gICAgICBoZWFkZXJzTGlzdDogW10sXG4gICAgICBib2R5OiBudWxsXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoZmFsc2UpXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2FwcHJvcHJpYXRlLW5ldHdvcmstZXJyb3JcbmZ1bmN0aW9uIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvciAoZmV0Y2hQYXJhbXMsIGVyciA9IG51bGwpIHtcbiAgLy8gMS4gQXNzZXJ0OiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZC5cbiAgYXNzZXJ0KGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSlcblxuICAvLyAyLiBSZXR1cm4gYW4gYWJvcnRlZCBuZXR3b3JrIGVycm9yIGlmIGZldGNoUGFyYW1zIGlzIGFib3J0ZWQ7XG4gIC8vIG90aGVyd2lzZSByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICByZXR1cm4gaXNBYm9ydGVkKGZldGNoUGFyYW1zKVxuICAgID8gbWFrZU5ldHdvcmtFcnJvcihPYmplY3QuYXNzaWduKG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKSwgeyBjYXVzZTogZXJyIH0pKVxuICAgIDogbWFrZU5ldHdvcmtFcnJvcihPYmplY3QuYXNzaWduKG5ldyBET01FeGNlcHRpb24oJ1JlcXVlc3Qgd2FzIGNhbmNlbGxlZC4nKSwgeyBjYXVzZTogZXJyIH0pKVxufVxuXG4vLyBodHRwczovL3doYXRwci5vcmcvZmV0Y2gvMTM5Mi5odG1sI2luaXRpYWxpemUtYS1yZXNwb25zZVxuZnVuY3Rpb24gaW5pdGlhbGl6ZVJlc3BvbnNlIChyZXNwb25zZSwgaW5pdCwgYm9keSkge1xuICAvLyAxLiBJZiBpbml0W1wic3RhdHVzXCJdIGlzIG5vdCBpbiB0aGUgcmFuZ2UgMjAwIHRvIDU5OSwgaW5jbHVzaXZlLCB0aGVuXG4gIC8vICAgIHRocm93IGEgUmFuZ2VFcnJvci5cbiAgaWYgKGluaXQuc3RhdHVzICE9PSBudWxsICYmIChpbml0LnN0YXR1cyA8IDIwMCB8fCBpbml0LnN0YXR1cyA+IDU5OSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5pdFtcInN0YXR1c1wiXSBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiAyMDAgdG8gNTk5LCBpbmNsdXNpdmUuJylcbiAgfVxuXG4gIC8vIDIuIElmIGluaXRbXCJzdGF0dXNUZXh0XCJdIGRvZXMgbm90IG1hdGNoIHRoZSByZWFzb24tcGhyYXNlIHRva2VuIHByb2R1Y3Rpb24sXG4gIC8vICAgIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGlmICgnc3RhdHVzVGV4dCcgaW4gaW5pdCAmJiBpbml0LnN0YXR1c1RleHQgIT0gbnVsbCkge1xuICAgIC8vIFNlZSwgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4xLjI6XG4gICAgLy8gICByZWFzb24tcGhyYXNlICA9ICooIEhUQUIgLyBTUCAvIFZDSEFSIC8gb2JzLXRleHQgKVxuICAgIGlmICghaXNWYWxpZFJlYXNvblBocmFzZShTdHJpbmcoaW5pdC5zdGF0dXNUZXh0KSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc3RhdHVzVGV4dCcpXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gU2V0IHJlc3BvbnNl4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzIHRvIGluaXRbXCJzdGF0dXNcIl0uXG4gIGlmICgnc3RhdHVzJyBpbiBpbml0ICYmIGluaXQuc3RhdHVzICE9IG51bGwpIHtcbiAgICByZXNwb25zZVtrU3RhdGVdLnN0YXR1cyA9IGluaXQuc3RhdHVzXG4gIH1cblxuICAvLyA0LiBTZXQgcmVzcG9uc2XigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXMgbWVzc2FnZSB0byBpbml0W1wic3RhdHVzVGV4dFwiXS5cbiAgaWYgKCdzdGF0dXNUZXh0JyBpbiBpbml0ICYmIGluaXQuc3RhdHVzVGV4dCAhPSBudWxsKSB7XG4gICAgcmVzcG9uc2Vba1N0YXRlXS5zdGF0dXNUZXh0ID0gaW5pdC5zdGF0dXNUZXh0XG4gIH1cblxuICAvLyA1LiBJZiBpbml0W1wiaGVhZGVyc1wiXSBleGlzdHMsIHRoZW4gZmlsbCByZXNwb25zZeKAmXMgaGVhZGVycyB3aXRoIGluaXRbXCJoZWFkZXJzXCJdLlxuICBpZiAoJ2hlYWRlcnMnIGluIGluaXQgJiYgaW5pdC5oZWFkZXJzICE9IG51bGwpIHtcbiAgICBmaWxsKHJlc3BvbnNlW2tIZWFkZXJzXSwgaW5pdC5oZWFkZXJzKVxuICB9XG5cbiAgLy8gNi4gSWYgYm9keSB3YXMgZ2l2ZW4sIHRoZW46XG4gIGlmIChib2R5KSB7XG4gICAgLy8gMS4gSWYgcmVzcG9uc2UncyBzdGF0dXMgaXMgYSBudWxsIGJvZHkgc3RhdHVzLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChudWxsQm9keVN0YXR1cy5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ1Jlc3BvbnNlIGNvbnN0cnVjdG9yJyxcbiAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1c1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAyLiBTZXQgcmVzcG9uc2UncyBib2R5IHRvIGJvZHkncyBib2R5LlxuICAgIHJlc3BvbnNlW2tTdGF0ZV0uYm9keSA9IGJvZHkuYm9keVxuXG4gICAgLy8gMy4gSWYgYm9keSdzIHR5cGUgaXMgbm9uLW51bGwgYW5kIHJlc3BvbnNlJ3MgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpblxuICAgIC8vICAgIGBDb250ZW50LVR5cGVgLCB0aGVuIGFwcGVuZCAoYENvbnRlbnQtVHlwZWAsIGJvZHkncyB0eXBlKSB0byByZXNwb25zZSdzIGhlYWRlciBsaXN0LlxuICAgIGlmIChib2R5LnR5cGUgIT0gbnVsbCAmJiAhcmVzcG9uc2Vba1N0YXRlXS5oZWFkZXJzTGlzdC5jb250YWlucygnQ29udGVudC1UeXBlJykpIHtcbiAgICAgIHJlc3BvbnNlW2tTdGF0ZV0uaGVhZGVyc0xpc3QuYXBwZW5kKCdjb250ZW50LXR5cGUnLCBib2R5LnR5cGUpXG4gICAgfVxuICB9XG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLlJlYWRhYmxlU3RyZWFtID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihcbiAgUmVhZGFibGVTdHJlYW1cbilcblxud2ViaWRsLmNvbnZlcnRlcnMuRm9ybURhdGEgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBGb3JtRGF0YVxuKVxuXG53ZWJpZGwuY29udmVydGVycy5VUkxTZWFyY2hQYXJhbXMgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBVUkxTZWFyY2hQYXJhbXNcbilcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3R5cGVkZWZkZWYteG1saHR0cHJlcXVlc3Rib2R5aW5pdFxud2ViaWRsLmNvbnZlcnRlcnMuWE1MSHR0cFJlcXVlc3RCb2R5SW5pdCA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh0eXBlb2YgViA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKFYpXG4gIH1cblxuICBpZiAoaXNCbG9iTGlrZShWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5CbG9iKFYsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICB9XG5cbiAgaWYgKHR5cGVzLmlzQXJyYXlCdWZmZXIoVikgfHwgdHlwZXMuaXNUeXBlZEFycmF5KFYpIHx8IHR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQnVmZmVyU291cmNlKFYpXG4gIH1cblxuICBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5Gb3JtRGF0YShWLCB7IHN0cmljdDogZmFsc2UgfSlcbiAgfVxuXG4gIGlmIChWIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVSTFNlYXJjaFBhcmFtcyhWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYm9keWluaXRcbndlYmlkbC5jb252ZXJ0ZXJzLkJvZHlJbml0ID0gZnVuY3Rpb24gKFYpIHtcbiAgaWYgKFYgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5SZWFkYWJsZVN0cmVhbShWKVxuICB9XG5cbiAgLy8gTm90ZTogdGhlIHNwZWMgZG9lc24ndCBpbmNsdWRlIGFzeW5jIGl0ZXJhYmxlcyxcbiAgLy8gdGhpcyBpcyBhbiB1bmRpY2kgZXh0ZW5zaW9uLlxuICBpZiAoVj8uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkge1xuICAgIHJldHVybiBWXG4gIH1cblxuICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuWE1MSHR0cFJlcXVlc3RCb2R5SW5pdChWKVxufVxuXG53ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdzdGF0dXMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10sXG4gICAgZGVmYXVsdFZhbHVlOiAyMDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3N0YXR1c1RleHQnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdoZWFkZXJzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0XG4gIH1cbl0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtYWtlTmV0d29ya0Vycm9yLFxuICBtYWtlUmVzcG9uc2UsXG4gIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvcixcbiAgZmlsdGVyUmVzcG9uc2UsXG4gIFJlc3BvbnNlLFxuICBjbG9uZVJlc3BvbnNlXG59XG4iLAogICAgIi8qIGdsb2JhbHMgQWJvcnRDb250cm9sbGVyICovXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGV4dHJhY3RCb2R5LCBtaXhpbkJvZHksIGNsb25lQm9keSB9ID0gcmVxdWlyZSgnLi9ib2R5JylcbmNvbnN0IHsgSGVhZGVycywgZmlsbDogZmlsbEhlYWRlcnMsIEhlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuY29uc3QgeyBGaW5hbGl6YXRpb25SZWdpc3RyeSB9ID0gcmVxdWlyZSgnLi4vY29tcGF0L2Rpc3BhdGNoZXItd2Vha3JlZicpKClcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3Qge1xuICBpc1ZhbGlkSFRUUFRva2VuLFxuICBzYW1lT3JpZ2luLFxuICBub3JtYWxpemVNZXRob2QsXG4gIG1ha2VQb2xpY3lDb250YWluZXIsXG4gIG5vcm1hbGl6ZU1ldGhvZFJlY29yZFxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7XG4gIGZvcmJpZGRlbk1ldGhvZHNTZXQsXG4gIGNvcnNTYWZlTGlzdGVkTWV0aG9kc1NldCxcbiAgcmVmZXJyZXJQb2xpY3ksXG4gIHJlcXVlc3RSZWRpcmVjdCxcbiAgcmVxdWVzdE1vZGUsXG4gIHJlcXVlc3RDcmVkZW50aWFscyxcbiAgcmVxdWVzdENhY2hlLFxuICByZXF1ZXN0RHVwbGV4XG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5IH0gPSB1dGlsXG5jb25zdCB7IGtIZWFkZXJzLCBrU2lnbmFsLCBrU3RhdGUsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2dsb2JhbCcpXG5jb25zdCB7IFVSTFNlcmlhbGl6ZXIgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5jb25zdCB7IGtIZWFkZXJzTGlzdCwga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGdldE1heExpc3RlbmVycywgc2V0TWF4TGlzdGVuZXJzLCBnZXRFdmVudExpc3RlbmVycywgZGVmYXVsdE1heExpc3RlbmVycyB9ID0gcmVxdWlyZSgnZXZlbnRzJylcblxubGV0IFRyYW5zZm9ybVN0cmVhbSA9IGdsb2JhbFRoaXMuVHJhbnNmb3JtU3RyZWFtXG5cbmNvbnN0IGtBYm9ydENvbnRyb2xsZXIgPSBTeW1ib2woJ2Fib3J0Q29udHJvbGxlcicpXG5cbmNvbnN0IHJlcXVlc3RGaW5hbGl6ZXIgPSBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKHsgc2lnbmFsLCBhYm9ydCB9KSA9PiB7XG4gIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxufSlcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3QtY2xhc3NcbmNsYXNzIFJlcXVlc3Qge1xuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlcXVlc3RcbiAgY29uc3RydWN0b3IgKGlucHV0LCBpbml0ID0ge30pIHtcbiAgICBpZiAoaW5wdXQgPT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdSZXF1ZXN0IGNvbnN0cnVjdG9yJyB9KVxuXG4gICAgaW5wdXQgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhpbnB1dClcbiAgICBpbml0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluaXQoaW5pdClcblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNlbnZpcm9ubWVudC1zZXR0aW5ncy1vYmplY3RcbiAgICB0aGlzW2tSZWFsbV0gPSB7XG4gICAgICBzZXR0aW5nc09iamVjdDoge1xuICAgICAgICBiYXNlVXJsOiBnZXRHbG9iYWxPcmlnaW4oKSxcbiAgICAgICAgZ2V0IG9yaWdpbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVVybD8ub3JpZ2luXG4gICAgICAgIH0sXG4gICAgICAgIHBvbGljeUNvbnRhaW5lcjogbWFrZVBvbGljeUNvbnRhaW5lcigpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMS4gTGV0IHJlcXVlc3QgYmUgbnVsbC5cbiAgICBsZXQgcmVxdWVzdCA9IG51bGxcblxuICAgIC8vIDIuIExldCBmYWxsYmFja01vZGUgYmUgbnVsbC5cbiAgICBsZXQgZmFsbGJhY2tNb2RlID0gbnVsbFxuXG4gICAgLy8gMy4gTGV0IGJhc2VVUkwgYmUgdGhpc+KAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN04oCZcyBBUEkgYmFzZSBVUkwuXG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXNba1JlYWxtXS5zZXR0aW5nc09iamVjdC5iYXNlVXJsXG5cbiAgICAvLyA0LiBMZXQgc2lnbmFsIGJlIG51bGwuXG4gICAgbGV0IHNpZ25hbCA9IG51bGxcblxuICAgIC8vIDUuIElmIGlucHV0IGlzIGEgc3RyaW5nLCB0aGVuOlxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyAxLiBMZXQgcGFyc2VkVVJMIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyBpbnB1dCB3aXRoIGJhc2VVUkwuXG4gICAgICAvLyAyLiBJZiBwYXJzZWRVUkwgaXMgZmFpbHVyZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGxldCBwYXJzZWRVUkxcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZFVSTCA9IG5ldyBVUkwoaW5wdXQsIGJhc2VVcmwpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmFpbGVkIHRvIHBhcnNlIFVSTCBmcm9tICcgKyBpbnB1dCwgeyBjYXVzZTogZXJyIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIElmIHBhcnNlZFVSTCBpbmNsdWRlcyBjcmVkZW50aWFscywgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChwYXJzZWRVUkwudXNlcm5hbWUgfHwgcGFyc2VkVVJMLnBhc3N3b3JkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ1JlcXVlc3QgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGZyb20gYSBVUkwgdGhhdCBpbmNsdWRlcyBjcmVkZW50aWFsczogJyArXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDQuIFNldCByZXF1ZXN0IHRvIGEgbmV3IHJlcXVlc3Qgd2hvc2UgVVJMIGlzIHBhcnNlZFVSTC5cbiAgICAgIHJlcXVlc3QgPSBtYWtlUmVxdWVzdCh7IHVybExpc3Q6IFtwYXJzZWRVUkxdIH0pXG5cbiAgICAgIC8vIDUuIFNldCBmYWxsYmFja01vZGUgdG8gXCJjb3JzXCIuXG4gICAgICBmYWxsYmFja01vZGUgPSAnY29ycydcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gNi4gT3RoZXJ3aXNlOlxuXG4gICAgICAvLyA3LiBBc3NlcnQ6IGlucHV0IGlzIGEgUmVxdWVzdCBvYmplY3QuXG4gICAgICBhc3NlcnQoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KVxuXG4gICAgICAvLyA4LiBTZXQgcmVxdWVzdCB0byBpbnB1dOKAmXMgcmVxdWVzdC5cbiAgICAgIHJlcXVlc3QgPSBpbnB1dFtrU3RhdGVdXG5cbiAgICAgIC8vIDkuIFNldCBzaWduYWwgdG8gaW5wdXTigJlzIHNpZ25hbC5cbiAgICAgIHNpZ25hbCA9IGlucHV0W2tTaWduYWxdXG4gICAgfVxuXG4gICAgLy8gNy4gTGV0IG9yaWdpbiBiZSB0aGlz4oCZcyByZWxldmFudCBzZXR0aW5ncyBvYmplY3TigJlzIG9yaWdpbi5cbiAgICBjb25zdCBvcmlnaW4gPSB0aGlzW2tSZWFsbV0uc2V0dGluZ3NPYmplY3Qub3JpZ2luXG5cbiAgICAvLyA4LiBMZXQgd2luZG93IGJlIFwiY2xpZW50XCIuXG4gICAgbGV0IHdpbmRvdyA9ICdjbGllbnQnXG5cbiAgICAvLyA5LiBJZiByZXF1ZXN04oCZcyB3aW5kb3cgaXMgYW4gZW52aXJvbm1lbnQgc2V0dGluZ3Mgb2JqZWN0IGFuZCBpdHMgb3JpZ2luXG4gICAgLy8gaXMgc2FtZSBvcmlnaW4gd2l0aCBvcmlnaW4sIHRoZW4gc2V0IHdpbmRvdyB0byByZXF1ZXN04oCZcyB3aW5kb3cuXG4gICAgaWYgKFxuICAgICAgcmVxdWVzdC53aW5kb3c/LmNvbnN0cnVjdG9yPy5uYW1lID09PSAnRW52aXJvbm1lbnRTZXR0aW5nc09iamVjdCcgJiZcbiAgICAgIHNhbWVPcmlnaW4ocmVxdWVzdC53aW5kb3csIG9yaWdpbilcbiAgICApIHtcbiAgICAgIHdpbmRvdyA9IHJlcXVlc3Qud2luZG93XG4gICAgfVxuXG4gICAgLy8gMTAuIElmIGluaXRbXCJ3aW5kb3dcIl0gZXhpc3RzIGFuZCBpcyBub24tbnVsbCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoaW5pdC53aW5kb3cgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJ3dpbmRvdycgb3B0aW9uICcke3dpbmRvd30nIG11c3QgYmUgbnVsbGApXG4gICAgfVxuXG4gICAgLy8gMTEuIElmIGluaXRbXCJ3aW5kb3dcIl0gZXhpc3RzLCB0aGVuIHNldCB3aW5kb3cgdG8gXCJuby13aW5kb3dcIi5cbiAgICBpZiAoJ3dpbmRvdycgaW4gaW5pdCkge1xuICAgICAgd2luZG93ID0gJ25vLXdpbmRvdydcbiAgICB9XG5cbiAgICAvLyAxMi4gU2V0IHJlcXVlc3QgdG8gYSBuZXcgcmVxdWVzdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICByZXF1ZXN0ID0gbWFrZVJlcXVlc3Qoe1xuICAgICAgLy8gVVJMIHJlcXVlc3TigJlzIFVSTC5cbiAgICAgIC8vIHVuZGljaSBpbXBsZW1lbnRhdGlvbiBub3RlOiB0aGlzIGlzIHNldCBhcyB0aGUgZmlyc3QgaXRlbSBpbiByZXF1ZXN0J3MgdXJsTGlzdCBpbiBtYWtlUmVxdWVzdFxuICAgICAgLy8gbWV0aG9kIHJlcXVlc3TigJlzIG1ldGhvZC5cbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAvLyBoZWFkZXIgbGlzdCBBIGNvcHkgb2YgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgICAvLyB1bmRpY2kgaW1wbGVtZW50YXRpb24gbm90ZTogaGVhZGVyc0xpc3QgaXMgY2xvbmVkIGluIG1ha2VSZXF1ZXN0XG4gICAgICBoZWFkZXJzTGlzdDogcmVxdWVzdC5oZWFkZXJzTGlzdCxcbiAgICAgIC8vIHVuc2FmZS1yZXF1ZXN0IGZsYWcgU2V0LlxuICAgICAgdW5zYWZlUmVxdWVzdDogcmVxdWVzdC51bnNhZmVSZXF1ZXN0LFxuICAgICAgLy8gY2xpZW50IFRoaXPigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdC5cbiAgICAgIGNsaWVudDogdGhpc1trUmVhbG1dLnNldHRpbmdzT2JqZWN0LFxuICAgICAgLy8gd2luZG93IHdpbmRvdy5cbiAgICAgIHdpbmRvdyxcbiAgICAgIC8vIHByaW9yaXR5IHJlcXVlc3TigJlzIHByaW9yaXR5LlxuICAgICAgcHJpb3JpdHk6IHJlcXVlc3QucHJpb3JpdHksXG4gICAgICAvLyBvcmlnaW4gcmVxdWVzdOKAmXMgb3JpZ2luLiBUaGUgcHJvcGFnYXRpb24gb2YgdGhlIG9yaWdpbiBpcyBvbmx5IHNpZ25pZmljYW50IGZvciBuYXZpZ2F0aW9uIHJlcXVlc3RzXG4gICAgICAvLyBiZWluZyBoYW5kbGVkIGJ5IGEgc2VydmljZSB3b3JrZXIuIEluIHRoaXMgc2NlbmFyaW8gYSByZXF1ZXN0IGNhbiBoYXZlIGFuIG9yaWdpbiB0aGF0IGlzIGRpZmZlcmVudFxuICAgICAgLy8gZnJvbSB0aGUgY3VycmVudCBjbGllbnQuXG4gICAgICBvcmlnaW46IHJlcXVlc3Qub3JpZ2luLFxuICAgICAgLy8gcmVmZXJyZXIgcmVxdWVzdOKAmXMgcmVmZXJyZXIuXG4gICAgICByZWZlcnJlcjogcmVxdWVzdC5yZWZlcnJlcixcbiAgICAgIC8vIHJlZmVycmVyIHBvbGljeSByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kuXG4gICAgICByZWZlcnJlclBvbGljeTogcmVxdWVzdC5yZWZlcnJlclBvbGljeSxcbiAgICAgIC8vIG1vZGUgcmVxdWVzdOKAmXMgbW9kZS5cbiAgICAgIG1vZGU6IHJlcXVlc3QubW9kZSxcbiAgICAgIC8vIGNyZWRlbnRpYWxzIG1vZGUgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZS5cbiAgICAgIGNyZWRlbnRpYWxzOiByZXF1ZXN0LmNyZWRlbnRpYWxzLFxuICAgICAgLy8gY2FjaGUgbW9kZSByZXF1ZXN04oCZcyBjYWNoZSBtb2RlLlxuICAgICAgY2FjaGU6IHJlcXVlc3QuY2FjaGUsXG4gICAgICAvLyByZWRpcmVjdCBtb2RlIHJlcXVlc3TigJlzIHJlZGlyZWN0IG1vZGUuXG4gICAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICAgIC8vIGludGVncml0eSBtZXRhZGF0YSByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEuXG4gICAgICBpbnRlZ3JpdHk6IHJlcXVlc3QuaW50ZWdyaXR5LFxuICAgICAgLy8ga2VlcGFsaXZlIHJlcXVlc3TigJlzIGtlZXBhbGl2ZS5cbiAgICAgIGtlZXBhbGl2ZTogcmVxdWVzdC5rZWVwYWxpdmUsXG4gICAgICAvLyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnIHJlcXVlc3TigJlzIHJlbG9hZC1uYXZpZ2F0aW9uIGZsYWcuXG4gICAgICByZWxvYWROYXZpZ2F0aW9uOiByZXF1ZXN0LnJlbG9hZE5hdmlnYXRpb24sXG4gICAgICAvLyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZyByZXF1ZXN04oCZcyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZy5cbiAgICAgIGhpc3RvcnlOYXZpZ2F0aW9uOiByZXF1ZXN0Lmhpc3RvcnlOYXZpZ2F0aW9uLFxuICAgICAgLy8gVVJMIGxpc3QgQSBjbG9uZSBvZiByZXF1ZXN04oCZcyBVUkwgbGlzdC5cbiAgICAgIHVybExpc3Q6IFsuLi5yZXF1ZXN0LnVybExpc3RdXG4gICAgfSlcblxuICAgIGNvbnN0IGluaXRIYXNLZXkgPSBPYmplY3Qua2V5cyhpbml0KS5sZW5ndGggIT09IDBcblxuICAgIC8vIDEzLiBJZiBpbml0IGlzIG5vdCBlbXB0eSwgdGhlbjpcbiAgICBpZiAoaW5pdEhhc0tleSkge1xuICAgICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgbW9kZSBpcyBcIm5hdmlnYXRlXCIsIHRoZW4gc2V0IGl0IHRvIFwic2FtZS1vcmlnaW5cIi5cbiAgICAgIGlmIChyZXF1ZXN0Lm1vZGUgPT09ICduYXZpZ2F0ZScpIHtcbiAgICAgICAgcmVxdWVzdC5tb2RlID0gJ3NhbWUtb3JpZ2luJ1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBVbnNldCByZXF1ZXN04oCZcyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnLlxuICAgICAgcmVxdWVzdC5yZWxvYWROYXZpZ2F0aW9uID0gZmFsc2VcblxuICAgICAgLy8gMy4gVW5zZXQgcmVxdWVzdOKAmXMgaGlzdG9yeS1uYXZpZ2F0aW9uIGZsYWcuXG4gICAgICByZXF1ZXN0Lmhpc3RvcnlOYXZpZ2F0aW9uID0gZmFsc2VcblxuICAgICAgLy8gNC4gU2V0IHJlcXVlc3TigJlzIG9yaWdpbiB0byBcImNsaWVudFwiLlxuICAgICAgcmVxdWVzdC5vcmlnaW4gPSAnY2xpZW50J1xuXG4gICAgICAvLyA1LiBTZXQgcmVxdWVzdOKAmXMgcmVmZXJyZXIgdG8gXCJjbGllbnRcIlxuICAgICAgcmVxdWVzdC5yZWZlcnJlciA9ICdjbGllbnQnXG5cbiAgICAgIC8vIDYuIFNldCByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgIHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPSAnJ1xuXG4gICAgICAvLyA3LiBTZXQgcmVxdWVzdOKAmXMgVVJMIHRvIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMLlxuICAgICAgcmVxdWVzdC51cmwgPSByZXF1ZXN0LnVybExpc3RbcmVxdWVzdC51cmxMaXN0Lmxlbmd0aCAtIDFdXG5cbiAgICAgIC8vIDguIFNldCByZXF1ZXN04oCZcyBVUkwgbGlzdCB0byDCqyByZXF1ZXN04oCZcyBVUkwgwrsuXG4gICAgICByZXF1ZXN0LnVybExpc3QgPSBbcmVxdWVzdC51cmxdXG4gICAgfVxuXG4gICAgLy8gMTQuIElmIGluaXRbXCJyZWZlcnJlclwiXSBleGlzdHMsIHRoZW46XG4gICAgaWYgKGluaXQucmVmZXJyZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gMS4gTGV0IHJlZmVycmVyIGJlIGluaXRbXCJyZWZlcnJlclwiXS5cbiAgICAgIGNvbnN0IHJlZmVycmVyID0gaW5pdC5yZWZlcnJlclxuXG4gICAgICAvLyAyLiBJZiByZWZlcnJlciBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciB0byBcIm5vLXJlZmVycmVyXCIuXG4gICAgICBpZiAocmVmZXJyZXIgPT09ICcnKSB7XG4gICAgICAgIHJlcXVlc3QucmVmZXJyZXIgPSAnbm8tcmVmZXJyZXInXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAxLiBMZXQgcGFyc2VkUmVmZXJyZXIgYmUgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIHJlZmVycmVyIHdpdGhcbiAgICAgICAgLy8gYmFzZVVSTC5cbiAgICAgICAgLy8gMi4gSWYgcGFyc2VkUmVmZXJyZXIgaXMgZmFpbHVyZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgICAgbGV0IHBhcnNlZFJlZmVycmVyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyc2VkUmVmZXJyZXIgPSBuZXcgVVJMKHJlZmVycmVyLCBiYXNlVXJsKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSZWZlcnJlciBcIiR7cmVmZXJyZXJ9XCIgaXMgbm90IGEgdmFsaWQgVVJMLmAsIHsgY2F1c2U6IGVyciB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZVxuICAgICAgICAvLyAtIHBhcnNlZFJlZmVycmVy4oCZcyBzY2hlbWUgaXMgXCJhYm91dFwiIGFuZCBwYXRoIGlzIHRoZSBzdHJpbmcgXCJjbGllbnRcIlxuICAgICAgICAvLyAtIHBhcnNlZFJlZmVycmVy4oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggb3JpZ2luXG4gICAgICAgIC8vIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHRvIFwiY2xpZW50XCIuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAocGFyc2VkUmVmZXJyZXIucHJvdG9jb2wgPT09ICdhYm91dDonICYmIHBhcnNlZFJlZmVycmVyLmhvc3RuYW1lID09PSAnY2xpZW50JykgfHxcbiAgICAgICAgICAob3JpZ2luICYmICFzYW1lT3JpZ2luKHBhcnNlZFJlZmVycmVyLCB0aGlzW2tSZWFsbV0uc2V0dGluZ3NPYmplY3QuYmFzZVVybCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJlcXVlc3QucmVmZXJyZXIgPSAnY2xpZW50J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIDQuIE90aGVyd2lzZSwgc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHRvIHBhcnNlZFJlZmVycmVyLlxuICAgICAgICAgIHJlcXVlc3QucmVmZXJyZXIgPSBwYXJzZWRSZWZlcnJlclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMTUuIElmIGluaXRbXCJyZWZlcnJlclBvbGljeVwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeVxuICAgIC8vIHRvIGl0LlxuICAgIGlmIChpbml0LnJlZmVycmVyUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPSBpbml0LnJlZmVycmVyUG9saWN5XG4gICAgfVxuXG4gICAgLy8gMTYuIExldCBtb2RlIGJlIGluaXRbXCJtb2RlXCJdIGlmIGl0IGV4aXN0cywgYW5kIGZhbGxiYWNrTW9kZSBvdGhlcndpc2UuXG4gICAgbGV0IG1vZGVcbiAgICBpZiAoaW5pdC5tb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGUgPSBpbml0Lm1vZGVcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kZSA9IGZhbGxiYWNrTW9kZVxuICAgIH1cblxuICAgIC8vIDE3LiBJZiBtb2RlIGlzIFwibmF2aWdhdGVcIiwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAobW9kZSA9PT0gJ25hdmlnYXRlJykge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdSZXF1ZXN0IGNvbnN0cnVjdG9yJyxcbiAgICAgICAgbWVzc2FnZTogJ2ludmFsaWQgcmVxdWVzdCBtb2RlIG5hdmlnYXRlLidcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMTguIElmIG1vZGUgaXMgbm9uLW51bGwsIHNldCByZXF1ZXN04oCZcyBtb2RlIHRvIG1vZGUuXG4gICAgaWYgKG1vZGUgIT0gbnVsbCkge1xuICAgICAgcmVxdWVzdC5tb2RlID0gbW9kZVxuICAgIH1cblxuICAgIC8vIDE5LiBJZiBpbml0W1wiY3JlZGVudGlhbHNcIl0gZXhpc3RzLCB0aGVuIHNldCByZXF1ZXN04oCZcyBjcmVkZW50aWFscyBtb2RlXG4gICAgLy8gdG8gaXQuXG4gICAgaWYgKGluaXQuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdC5jcmVkZW50aWFscyA9IGluaXQuY3JlZGVudGlhbHNcbiAgICB9XG5cbiAgICAvLyAxOC4gSWYgaW5pdFtcImNhY2hlXCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0byBpdC5cbiAgICBpZiAoaW5pdC5jYWNoZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0LmNhY2hlID0gaW5pdC5jYWNoZVxuICAgIH1cblxuICAgIC8vIDIxLiBJZiByZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwib25seS1pZi1jYWNoZWRcIiBhbmQgcmVxdWVzdOKAmXMgbW9kZSBpc1xuICAgIC8vIG5vdCBcInNhbWUtb3JpZ2luXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHJlcXVlc3QuY2FjaGUgPT09ICdvbmx5LWlmLWNhY2hlZCcgJiYgcmVxdWVzdC5tb2RlICE9PSAnc2FtZS1vcmlnaW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIidvbmx5LWlmLWNhY2hlZCcgY2FuIGJlIHNldCBvbmx5IHdpdGggJ3NhbWUtb3JpZ2luJyBtb2RlXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyAyMi4gSWYgaW5pdFtcInJlZGlyZWN0XCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSB0byBpdC5cbiAgICBpZiAoaW5pdC5yZWRpcmVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0LnJlZGlyZWN0ID0gaW5pdC5yZWRpcmVjdFxuICAgIH1cblxuICAgIC8vIDIzLiBJZiBpbml0W1wiaW50ZWdyaXR5XCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgaW50ZWdyaXR5IG1ldGFkYXRhIHRvIGl0LlxuICAgIGlmIChpbml0LmludGVncml0eSAhPSBudWxsKSB7XG4gICAgICByZXF1ZXN0LmludGVncml0eSA9IFN0cmluZyhpbml0LmludGVncml0eSlcbiAgICB9XG5cbiAgICAvLyAyNC4gSWYgaW5pdFtcImtlZXBhbGl2ZVwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGtlZXBhbGl2ZSB0byBpdC5cbiAgICBpZiAoaW5pdC5rZWVwYWxpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdC5rZWVwYWxpdmUgPSBCb29sZWFuKGluaXQua2VlcGFsaXZlKVxuICAgIH1cblxuICAgIC8vIDI1LiBJZiBpbml0W1wibWV0aG9kXCJdIGV4aXN0cywgdGhlbjpcbiAgICBpZiAoaW5pdC5tZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gMS4gTGV0IG1ldGhvZCBiZSBpbml0W1wibWV0aG9kXCJdLlxuICAgICAgbGV0IG1ldGhvZCA9IGluaXQubWV0aG9kXG5cbiAgICAgIC8vIDIuIElmIG1ldGhvZCBpcyBub3QgYSBtZXRob2Qgb3IgbWV0aG9kIGlzIGEgZm9yYmlkZGVuIG1ldGhvZCwgdGhlblxuICAgICAgLy8gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAoIWlzVmFsaWRIVFRQVG9rZW4obWV0aG9kKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAnJHttZXRob2R9JyBpcyBub3QgYSB2YWxpZCBIVFRQIG1ldGhvZC5gKVxuICAgICAgfVxuXG4gICAgICBpZiAoZm9yYmlkZGVuTWV0aG9kc1NldC5oYXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCcke21ldGhvZH0nIEhUVFAgbWV0aG9kIGlzIHVuc3VwcG9ydGVkLmApXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE5vcm1hbGl6ZSBtZXRob2QuXG4gICAgICBtZXRob2QgPSBub3JtYWxpemVNZXRob2RSZWNvcmRbbWV0aG9kXSA/PyBub3JtYWxpemVNZXRob2QobWV0aG9kKVxuXG4gICAgICAvLyA0LiBTZXQgcmVxdWVzdOKAmXMgbWV0aG9kIHRvIG1ldGhvZC5cbiAgICAgIHJlcXVlc3QubWV0aG9kID0gbWV0aG9kXG4gICAgfVxuXG4gICAgLy8gMjYuIElmIGluaXRbXCJzaWduYWxcIl0gZXhpc3RzLCB0aGVuIHNldCBzaWduYWwgdG8gaXQuXG4gICAgaWYgKGluaXQuc2lnbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNpZ25hbCA9IGluaXQuc2lnbmFsXG4gICAgfVxuXG4gICAgLy8gMjcuIFNldCB0aGlz4oCZcyByZXF1ZXN0IHRvIHJlcXVlc3QuXG4gICAgdGhpc1trU3RhdGVdID0gcmVxdWVzdFxuXG4gICAgLy8gMjguIFNldCB0aGlz4oCZcyBzaWduYWwgdG8gYSBuZXcgQWJvcnRTaWduYWwgb2JqZWN0IHdpdGggdGhpc+KAmXMgcmVsZXZhbnRcbiAgICAvLyBSZWFsbS5cbiAgICAvLyBUT0RPOiBjb3VsZCB0aGlzIGJlIHNpbXBsaWZpZWQgd2l0aCBBYm9ydFNpZ25hbC5hbnlcbiAgICAvLyAoaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tYWJvcnRzaWduYWwtYW55KVxuICAgIGNvbnN0IGFjID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgdGhpc1trU2lnbmFsXSA9IGFjLnNpZ25hbFxuICAgIHRoaXNba1NpZ25hbF1ba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuXG4gICAgLy8gMjkuIElmIHNpZ25hbCBpcyBub3QgbnVsbCwgdGhlbiBtYWtlIHRoaXPigJlzIHNpZ25hbCBmb2xsb3cgc2lnbmFsLlxuICAgIGlmIChzaWduYWwgIT0gbnVsbCkge1xuICAgICAgaWYgKFxuICAgICAgICAhc2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBzaWduYWwuYWJvcnRlZCAhPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJGYWlsZWQgdG8gY29uc3RydWN0ICdSZXF1ZXN0JzogbWVtYmVyIHNpZ25hbCBpcyBub3Qgb2YgdHlwZSBBYm9ydFNpZ25hbC5cIlxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICBhYy5hYm9ydChzaWduYWwucmVhc29uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gS2VlcCBhIHN0cm9uZyByZWYgdG8gYWMgd2hpbGUgcmVxdWVzdCBvYmplY3RcbiAgICAgICAgLy8gaXMgYWxpdmUuIFRoaXMgaXMgbmVlZGVkIHRvIHByZXZlbnQgQWJvcnRDb250cm9sbGVyXG4gICAgICAgIC8vIGZyb20gYmVpbmcgcHJlbWF0dXJlbHkgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAgICAgIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzE5MjYuXG4gICAgICAgIHRoaXNba0Fib3J0Q29udHJvbGxlcl0gPSBhY1xuXG4gICAgICAgIGNvbnN0IGFjUmVmID0gbmV3IFdlYWtSZWYoYWMpXG4gICAgICAgIGNvbnN0IGFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IGFjID0gYWNSZWYuZGVyZWYoKVxuICAgICAgICAgIGlmIChhYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhYy5hYm9ydCh0aGlzLnJlYXNvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlyZC1wYXJ0eSBBYm9ydENvbnRyb2xsZXJzIG1heSBub3Qgd29yayB3aXRoIHRoZXNlLlxuICAgICAgICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL3B1bGwvMTkxMCNpc3N1ZWNvbW1lbnQtMTQ2NDQ5NTYxOS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJZiB0aGUgbWF4IGFtb3VudCBvZiBsaXN0ZW5lcnMgaXMgZXF1YWwgdG8gdGhlIGRlZmF1bHQsIGluY3JlYXNlIGl0XG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBub2RlID49IHYxOS45LjBcbiAgICAgICAgICBpZiAodHlwZW9mIGdldE1heExpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJyAmJiBnZXRNYXhMaXN0ZW5lcnMoc2lnbmFsKSA9PT0gZGVmYXVsdE1heExpc3RlbmVycykge1xuICAgICAgICAgICAgc2V0TWF4TGlzdGVuZXJzKDEwMCwgc2lnbmFsKVxuICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0RXZlbnRMaXN0ZW5lcnMoc2lnbmFsLCAnYWJvcnQnKS5sZW5ndGggPj0gZGVmYXVsdE1heExpc3RlbmVycykge1xuICAgICAgICAgICAgc2V0TWF4TGlzdGVuZXJzKDEwMCwgc2lnbmFsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgIHV0aWwuYWRkQWJvcnRMaXN0ZW5lcihzaWduYWwsIGFib3J0KVxuICAgICAgICByZXF1ZXN0RmluYWxpemVyLnJlZ2lzdGVyKGFjLCB7IHNpZ25hbCwgYWJvcnQgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzMC4gU2V0IHRoaXPigJlzIGhlYWRlcnMgdG8gYSBuZXcgSGVhZGVycyBvYmplY3Qgd2l0aCB0aGlz4oCZcyByZWxldmFudFxuICAgIC8vIFJlYWxtLCB3aG9zZSBoZWFkZXIgbGlzdCBpcyByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBhbmQgZ3VhcmQgaXNcbiAgICAvLyBcInJlcXVlc3RcIi5cbiAgICB0aGlzW2tIZWFkZXJzXSA9IG5ldyBIZWFkZXJzKGtDb25zdHJ1Y3QpXG4gICAgdGhpc1trSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IHJlcXVlc3QuaGVhZGVyc0xpc3RcbiAgICB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdID0gJ3JlcXVlc3QnXG4gICAgdGhpc1trSGVhZGVyc11ba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuXG4gICAgLy8gMzEuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJuby1jb3JzXCIsIHRoZW46XG4gICAgaWYgKG1vZGUgPT09ICduby1jb3JzJykge1xuICAgICAgLy8gMS4gSWYgdGhpc+KAmXMgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIG5vdCBhIENPUlMtc2FmZWxpc3RlZCBtZXRob2QsXG4gICAgICAvLyB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgaWYgKCFjb3JzU2FmZUxpc3RlZE1ldGhvZHNTZXQuaGFzKHJlcXVlc3QubWV0aG9kKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGAnJHtyZXF1ZXN0Lm1ldGhvZH0gaXMgdW5zdXBwb3J0ZWQgaW4gbm8tY29ycyBtb2RlLmBcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBTZXQgdGhpc+KAmXMgaGVhZGVyc+KAmXMgZ3VhcmQgdG8gXCJyZXF1ZXN0LW5vLWNvcnNcIi5cbiAgICAgIHRoaXNba0hlYWRlcnNdW2tHdWFyZF0gPSAncmVxdWVzdC1uby1jb3JzJ1xuICAgIH1cblxuICAgIC8vIDMyLiBJZiBpbml0IGlzIG5vdCBlbXB0eSwgdGhlbjpcbiAgICBpZiAoaW5pdEhhc0tleSkge1xuICAgICAgLyoqIEB0eXBlIHtIZWFkZXJzTGlzdH0gKi9cbiAgICAgIGNvbnN0IGhlYWRlcnNMaXN0ID0gdGhpc1trSGVhZGVyc11ba0hlYWRlcnNMaXN0XVxuICAgICAgLy8gMS4gTGV0IGhlYWRlcnMgYmUgYSBjb3B5IG9mIHRoaXPigJlzIGhlYWRlcnMgYW5kIGl0cyBhc3NvY2lhdGVkIGhlYWRlclxuICAgICAgLy8gbGlzdC5cbiAgICAgIC8vIDIuIElmIGluaXRbXCJoZWFkZXJzXCJdIGV4aXN0cywgdGhlbiBzZXQgaGVhZGVycyB0byBpbml0W1wiaGVhZGVyc1wiXS5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBpbml0LmhlYWRlcnMgIT09IHVuZGVmaW5lZCA/IGluaXQuaGVhZGVycyA6IG5ldyBIZWFkZXJzTGlzdChoZWFkZXJzTGlzdClcblxuICAgICAgLy8gMy4gRW1wdHkgdGhpc+KAmXMgaGVhZGVyc+KAmXMgaGVhZGVyIGxpc3QuXG4gICAgICBoZWFkZXJzTGlzdC5jbGVhcigpXG5cbiAgICAgIC8vIDQuIElmIGhlYWRlcnMgaXMgYSBIZWFkZXJzIG9iamVjdCwgdGhlbiBmb3IgZWFjaCBoZWFkZXIgaW4gaXRzIGhlYWRlclxuICAgICAgLy8gbGlzdCwgYXBwZW5kIGhlYWRlcuKAmXMgbmFtZS9oZWFkZXLigJlzIHZhbHVlIHRvIHRoaXPigJlzIGhlYWRlcnMuXG4gICAgICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnNMaXN0KSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBoZWFkZXJzKSB7XG4gICAgICAgICAgaGVhZGVyc0xpc3QuYXBwZW5kKGtleSwgdmFsKVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IENvcHkgdGhlIGBzZXQtY29va2llYCBtZXRhLWRhdGEuXG4gICAgICAgIGhlYWRlcnNMaXN0LmNvb2tpZXMgPSBoZWFkZXJzLmNvb2tpZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIDUuIE90aGVyd2lzZSwgZmlsbCB0aGlz4oCZcyBoZWFkZXJzIHdpdGggaGVhZGVycy5cbiAgICAgICAgZmlsbEhlYWRlcnModGhpc1trSGVhZGVyc10sIGhlYWRlcnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMzMuIExldCBpbnB1dEJvZHkgYmUgaW5wdXTigJlzIHJlcXVlc3TigJlzIGJvZHkgaWYgaW5wdXQgaXMgYSBSZXF1ZXN0XG4gICAgLy8gb2JqZWN0OyBvdGhlcndpc2UgbnVsbC5cbiAgICBjb25zdCBpbnB1dEJvZHkgPSBpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QgPyBpbnB1dFtrU3RhdGVdLmJvZHkgOiBudWxsXG5cbiAgICAvLyAzNC4gSWYgZWl0aGVyIGluaXRbXCJib2R5XCJdIGV4aXN0cyBhbmQgaXMgbm9uLW51bGwgb3IgaW5wdXRCb2R5IGlzXG4gICAgLy8gbm9uLW51bGwsIGFuZCByZXF1ZXN04oCZcyBtZXRob2QgaXMgYEdFVGAgb3IgYEhFQURgLCB0aGVuIHRocm93IGFcbiAgICAvLyBUeXBlRXJyb3IuXG4gICAgaWYgKFxuICAgICAgKGluaXQuYm9keSAhPSBudWxsIHx8IGlucHV0Qm9keSAhPSBudWxsKSAmJlxuICAgICAgKHJlcXVlc3QubWV0aG9kID09PSAnR0VUJyB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0hFQUQnKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWVzdCB3aXRoIEdFVC9IRUFEIG1ldGhvZCBjYW5ub3QgaGF2ZSBib2R5LicpXG4gICAgfVxuXG4gICAgLy8gMzUuIExldCBpbml0Qm9keSBiZSBudWxsLlxuICAgIGxldCBpbml0Qm9keSA9IG51bGxcblxuICAgIC8vIDM2LiBJZiBpbml0W1wiYm9keVwiXSBleGlzdHMgYW5kIGlzIG5vbi1udWxsLCB0aGVuOlxuICAgIGlmIChpbml0LmJvZHkgIT0gbnVsbCkge1xuICAgICAgLy8gMS4gTGV0IENvbnRlbnQtVHlwZSBiZSBudWxsLlxuICAgICAgLy8gMi4gU2V0IGluaXRCb2R5IGFuZCBDb250ZW50LVR5cGUgdG8gdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nXG4gICAgICAvLyBpbml0W1wiYm9keVwiXSwgd2l0aCBrZWVwYWxpdmUgc2V0IHRvIHJlcXVlc3TigJlzIGtlZXBhbGl2ZS5cbiAgICAgIGNvbnN0IFtleHRyYWN0ZWRCb2R5LCBjb250ZW50VHlwZV0gPSBleHRyYWN0Qm9keShcbiAgICAgICAgaW5pdC5ib2R5LFxuICAgICAgICByZXF1ZXN0LmtlZXBhbGl2ZVxuICAgICAgKVxuICAgICAgaW5pdEJvZHkgPSBleHRyYWN0ZWRCb2R5XG5cbiAgICAgIC8vIDMsIElmIENvbnRlbnQtVHlwZSBpcyBub24tbnVsbCBhbmQgdGhpc+KAmXMgaGVhZGVyc+KAmXMgaGVhZGVyIGxpc3QgZG9lc1xuICAgICAgLy8gbm90IGNvbnRhaW4gYENvbnRlbnQtVHlwZWAsIHRoZW4gYXBwZW5kIGBDb250ZW50LVR5cGVgL0NvbnRlbnQtVHlwZSB0b1xuICAgICAgLy8gdGhpc+KAmXMgaGVhZGVycy5cbiAgICAgIGlmIChjb250ZW50VHlwZSAmJiAhdGhpc1trSGVhZGVyc11ba0hlYWRlcnNMaXN0XS5jb250YWlucygnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgdGhpc1trSGVhZGVyc10uYXBwZW5kKCdjb250ZW50LXR5cGUnLCBjb250ZW50VHlwZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzNy4gTGV0IGlucHV0T3JJbml0Qm9keSBiZSBpbml0Qm9keSBpZiBpdCBpcyBub24tbnVsbDsgb3RoZXJ3aXNlXG4gICAgLy8gaW5wdXRCb2R5LlxuICAgIGNvbnN0IGlucHV0T3JJbml0Qm9keSA9IGluaXRCb2R5ID8/IGlucHV0Qm9keVxuXG4gICAgLy8gMzguIElmIGlucHV0T3JJbml0Qm9keSBpcyBub24tbnVsbCBhbmQgaW5wdXRPckluaXRCb2R54oCZcyBzb3VyY2UgaXNcbiAgICAvLyBudWxsLCB0aGVuOlxuICAgIGlmIChpbnB1dE9ySW5pdEJvZHkgIT0gbnVsbCAmJiBpbnB1dE9ySW5pdEJvZHkuc291cmNlID09IG51bGwpIHtcbiAgICAgIC8vIDEuIElmIGluaXRCb2R5IGlzIG5vbi1udWxsIGFuZCBpbml0W1wiZHVwbGV4XCJdIGRvZXMgbm90IGV4aXN0LFxuICAgICAgLy8gICAgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChpbml0Qm9keSAhPSBudWxsICYmIGluaXQuZHVwbGV4ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWVzdEluaXQ6IGR1cGxleCBvcHRpb24gaXMgcmVxdWlyZWQgd2hlbiBzZW5kaW5nIGEgYm9keS4nKVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiB0aGlz4oCZcyByZXF1ZXN04oCZcyBtb2RlIGlzIG5laXRoZXIgXCJzYW1lLW9yaWdpblwiIG5vciBcImNvcnNcIixcbiAgICAgIC8vIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAocmVxdWVzdC5tb2RlICE9PSAnc2FtZS1vcmlnaW4nICYmIHJlcXVlc3QubW9kZSAhPT0gJ2NvcnMnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ0lmIHJlcXVlc3QgaXMgbWFkZSBmcm9tIFJlYWRhYmxlU3RyZWFtLCBtb2RlIHNob3VsZCBiZSBcInNhbWUtb3JpZ2luXCIgb3IgXCJjb3JzXCInXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gMy4gU2V0IHRoaXPigJlzIHJlcXVlc3TigJlzIHVzZS1DT1JTLXByZWZsaWdodCBmbGFnLlxuICAgICAgcmVxdWVzdC51c2VDT1JTUHJlZmxpZ2h0RmxhZyA9IHRydWVcbiAgICB9XG5cbiAgICAvLyAzOS4gTGV0IGZpbmFsQm9keSBiZSBpbnB1dE9ySW5pdEJvZHkuXG4gICAgbGV0IGZpbmFsQm9keSA9IGlucHV0T3JJbml0Qm9keVxuXG4gICAgLy8gNDAuIElmIGluaXRCb2R5IGlzIG51bGwgYW5kIGlucHV0Qm9keSBpcyBub24tbnVsbCwgdGhlbjpcbiAgICBpZiAoaW5pdEJvZHkgPT0gbnVsbCAmJiBpbnB1dEJvZHkgIT0gbnVsbCkge1xuICAgICAgLy8gMS4gSWYgaW5wdXQgaXMgdW51c2FibGUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAodXRpbC5pc0Rpc3R1cmJlZChpbnB1dEJvZHkuc3RyZWFtKSB8fCBpbnB1dEJvZHkuc3RyZWFtLmxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdDYW5ub3QgY29uc3RydWN0IGEgUmVxdWVzdCB3aXRoIGEgUmVxdWVzdCBvYmplY3QgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuJ1xuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFNldCBmaW5hbEJvZHkgdG8gdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIHByb3h5IGZvciBpbnB1dEJvZHkuXG4gICAgICBpZiAoIVRyYW5zZm9ybVN0cmVhbSkge1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0vd2ViJykuVHJhbnNmb3JtU3RyZWFtXG4gICAgICB9XG5cbiAgICAgIC8vIGh0dHBzOi8vc3RyZWFtcy5zcGVjLndoYXR3Zy5vcmcvI3JlYWRhYmxlc3RyZWFtLWNyZWF0ZS1hLXByb3h5XG4gICAgICBjb25zdCBpZGVudGl0eVRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oKVxuICAgICAgaW5wdXRCb2R5LnN0cmVhbS5waXBlVGhyb3VnaChpZGVudGl0eVRyYW5zZm9ybSlcbiAgICAgIGZpbmFsQm9keSA9IHtcbiAgICAgICAgc291cmNlOiBpbnB1dEJvZHkuc291cmNlLFxuICAgICAgICBsZW5ndGg6IGlucHV0Qm9keS5sZW5ndGgsXG4gICAgICAgIHN0cmVhbTogaWRlbnRpdHlUcmFuc2Zvcm0ucmVhZGFibGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0MS4gU2V0IHRoaXPigJlzIHJlcXVlc3TigJlzIGJvZHkgdG8gZmluYWxCb2R5LlxuICAgIHRoaXNba1N0YXRlXS5ib2R5ID0gZmluYWxCb2R5XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlcXVlc3TigJlzIEhUVFAgbWV0aG9kLCB3aGljaCBpcyBcIkdFVFwiIGJ5IGRlZmF1bHQuXG4gIGdldCBtZXRob2QgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgbWV0aG9kIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIG1ldGhvZC5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLm1ldGhvZFxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgVVJMIG9mIHJlcXVlc3QgYXMgYSBzdHJpbmcuXG4gIGdldCB1cmwgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgdXJsIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIFVSTCwgc2VyaWFsaXplZC5cbiAgICByZXR1cm4gVVJMU2VyaWFsaXplcih0aGlzW2tTdGF0ZV0udXJsKVxuICB9XG5cbiAgLy8gUmV0dXJucyBhIEhlYWRlcnMgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QuXG4gIC8vIE5vdGUgdGhhdCBoZWFkZXJzIGFkZGVkIGluIHRoZSBuZXR3b3JrIGxheWVyIGJ5IHRoZSB1c2VyIGFnZW50IHdpbGwgbm90XG4gIC8vIGJlIGFjY291bnRlZCBmb3IgaW4gdGhpcyBvYmplY3QsIGUuZy4sIHRoZSBcIkhvc3RcIiBoZWFkZXIuXG4gIGdldCBoZWFkZXJzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGhlYWRlcnMgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgaGVhZGVycy5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc11cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGtpbmQgb2YgcmVzb3VyY2UgcmVxdWVzdGVkIGJ5IHJlcXVlc3QsIGUuZy4sIFwiZG9jdW1lbnRcIlxuICAvLyBvciBcInNjcmlwdFwiLlxuICBnZXQgZGVzdGluYXRpb24gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgZGVzdGluYXRpb24gZ2V0dGVyIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgZGVzdGluYXRpb24uXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5kZXN0aW5hdGlvblxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVmZXJyZXIgb2YgcmVxdWVzdC4gSXRzIHZhbHVlIGNhbiBiZSBhIHNhbWUtb3JpZ2luIFVSTCBpZlxuICAvLyBleHBsaWNpdGx5IHNldCBpbiBpbml0LCB0aGUgZW1wdHkgc3RyaW5nIHRvIGluZGljYXRlIG5vIHJlZmVycmVyLCBhbmRcbiAgLy8gXCJhYm91dDpjbGllbnRcIiB3aGVuIGRlZmF1bHRpbmcgdG8gdGhlIGdsb2JhbOKAmXMgZGVmYXVsdC4gVGhpcyBpcyB1c2VkXG4gIC8vIGR1cmluZyBmZXRjaGluZyB0byBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZSBgUmVmZXJlcmAgaGVhZGVyIG9mIHRoZVxuICAvLyByZXF1ZXN0IGJlaW5nIG1hZGUuXG4gIGdldCByZWZlcnJlciAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIDEuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyIGlzIFwibm8tcmVmZXJyZXJcIiwgdGhlbiByZXR1cm4gdGhlXG4gICAgLy8gZW1wdHkgc3RyaW5nLlxuICAgIGlmICh0aGlzW2tTdGF0ZV0ucmVmZXJyZXIgPT09ICduby1yZWZlcnJlcicpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIC8vIDIuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyIGlzIFwiY2xpZW50XCIsIHRoZW4gcmV0dXJuXG4gICAgLy8gXCJhYm91dDpjbGllbnRcIi5cbiAgICBpZiAodGhpc1trU3RhdGVdLnJlZmVycmVyID09PSAnY2xpZW50Jykge1xuICAgICAgcmV0dXJuICdhYm91dDpjbGllbnQnXG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyLCBzZXJpYWxpemVkLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ucmVmZXJyZXIudG9TdHJpbmcoKVxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVmZXJyZXIgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LlxuICAvLyBUaGlzIGlzIHVzZWQgZHVyaW5nIGZldGNoaW5nIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN04oCZc1xuICAvLyByZWZlcnJlci5cbiAgZ2V0IHJlZmVycmVyUG9saWN5ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIHJlZmVycmVyUG9saWN5IGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnJlZmVycmVyUG9saWN5XG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBtb2RlIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LCB3aGljaCBpcyBhIHN0cmluZyBpbmRpY2F0aW5nXG4gIC8vIHdoZXRoZXIgdGhlIHJlcXVlc3Qgd2lsbCB1c2UgQ09SUywgb3Igd2lsbCBiZSByZXN0cmljdGVkIHRvIHNhbWUtb3JpZ2luXG4gIC8vIFVSTHMuXG4gIGdldCBtb2RlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIG1vZGUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgbW9kZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLm1vZGVcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGNyZWRlbnRpYWxzIG1vZGUgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QsXG4gIC8vIHdoaWNoIGlzIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciBjcmVkZW50aWFscyB3aWxsIGJlIHNlbnQgd2l0aCB0aGVcbiAgLy8gcmVxdWVzdCBhbHdheXMsIG5ldmVyLCBvciBvbmx5IHdoZW4gc2VudCB0byBhIHNhbWUtb3JpZ2luIFVSTC5cbiAgZ2V0IGNyZWRlbnRpYWxzICgpIHtcbiAgICAvLyBUaGUgY3JlZGVudGlhbHMgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmNyZWRlbnRpYWxzXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBjYWNoZSBtb2RlIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LFxuICAvLyB3aGljaCBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIGhvdyB0aGUgcmVxdWVzdCB3aWxsXG4gIC8vIGludGVyYWN0IHdpdGggdGhlIGJyb3dzZXLigJlzIGNhY2hlIHdoZW4gZmV0Y2hpbmcuXG4gIGdldCBjYWNoZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBjYWNoZSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBjYWNoZSBtb2RlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uY2FjaGVcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHJlZGlyZWN0IG1vZGUgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QsXG4gIC8vIHdoaWNoIGlzIGEgc3RyaW5nIGluZGljYXRpbmcgaG93IHJlZGlyZWN0cyBmb3IgdGhlXG4gIC8vIHJlcXVlc3Qgd2lsbCBiZSBoYW5kbGVkIGR1cmluZyBmZXRjaGluZy4gQSByZXF1ZXN0XG4gIC8vIHdpbGwgZm9sbG93IHJlZGlyZWN0cyBieSBkZWZhdWx0LlxuICBnZXQgcmVkaXJlY3QgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgcmVkaXJlY3QgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnJlZGlyZWN0XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlcXVlc3TigJlzIHN1YnJlc291cmNlIGludGVncml0eSBtZXRhZGF0YSwgd2hpY2ggaXMgYVxuICAvLyBjcnlwdG9ncmFwaGljIGhhc2ggb2YgdGhlIHJlc291cmNlIGJlaW5nIGZldGNoZWQuIEl0cyB2YWx1ZVxuICAvLyBjb25zaXN0cyBvZiBtdWx0aXBsZSBoYXNoZXMgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuIFtTUkldXG4gIGdldCBpbnRlZ3JpdHkgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgaW50ZWdyaXR5IGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIGludGVncml0eVxuICAgIC8vIG1ldGFkYXRhLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uaW50ZWdyaXR5XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHJlcXVlc3QgY2FuIG91dGxpdmUgdGhlXG4gIC8vIGdsb2JhbCBpbiB3aGljaCBpdCB3YXMgY3JlYXRlZC5cbiAgZ2V0IGtlZXBhbGl2ZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBrZWVwYWxpdmUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMga2VlcGFsaXZlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ua2VlcGFsaXZlXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHJlcXVlc3QgaXMgZm9yIGEgcmVsb2FkXG4gIC8vIG5hdmlnYXRpb24uXG4gIGdldCBpc1JlbG9hZE5hdmlnYXRpb24gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgaXNSZWxvYWROYXZpZ2F0aW9uIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXNcbiAgICAvLyByZXF1ZXN04oCZcyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnIGlzIHNldDsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ucmVsb2FkTmF2aWdhdGlvblxuICB9XG5cbiAgLy8gUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCByZXF1ZXN0IGlzIGZvciBhIGhpc3RvcnlcbiAgLy8gbmF2aWdhdGlvbiAoYS5rLmEuIGJhY2stZm93YXJkIG5hdmlnYXRpb24pLlxuICBnZXQgaXNIaXN0b3J5TmF2aWdhdGlvbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBpc0hpc3RvcnlOYXZpZ2F0aW9uIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXMgcmVxdWVzdOKAmXNcbiAgICAvLyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZyBpcyBzZXQ7IG90aGVyd2lzZSBmYWxzZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmhpc3RvcnlOYXZpZ2F0aW9uXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBzaWduYWwgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QsIHdoaWNoIGlzIGFuIEFib3J0U2lnbmFsXG4gIC8vIG9iamVjdCBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZCwgYW5kIGl0c1xuICAvLyBhYm9ydCBldmVudCBoYW5kbGVyLlxuICBnZXQgc2lnbmFsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIHNpZ25hbCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyBzaWduYWwuXG4gICAgcmV0dXJuIHRoaXNba1NpZ25hbF1cbiAgfVxuXG4gIGdldCBib2R5ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ib2R5ID8gdGhpc1trU3RhdGVdLmJvZHkuc3RyZWFtIDogbnVsbFxuICB9XG5cbiAgZ2V0IGJvZHlVc2VkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgcmV0dXJuICEhdGhpc1trU3RhdGVdLmJvZHkgJiYgdXRpbC5pc0Rpc3R1cmJlZCh0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0pXG4gIH1cblxuICBnZXQgZHVwbGV4ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgcmV0dXJuICdoYWxmJ1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHJlcXVlc3QuXG4gIGNsb25lICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gMS4gSWYgdGhpcyBpcyB1bnVzYWJsZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAodGhpcy5ib2R5VXNlZCB8fCB0aGlzLmJvZHk/LmxvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW51c2FibGUnKVxuICAgIH1cblxuICAgIC8vIDIuIExldCBjbG9uZWRSZXF1ZXN0IGJlIHRoZSByZXN1bHQgb2YgY2xvbmluZyB0aGlz4oCZcyByZXF1ZXN0LlxuICAgIGNvbnN0IGNsb25lZFJlcXVlc3QgPSBjbG9uZVJlcXVlc3QodGhpc1trU3RhdGVdKVxuXG4gICAgLy8gMy4gTGV0IGNsb25lZFJlcXVlc3RPYmplY3QgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIFJlcXVlc3Qgb2JqZWN0LFxuICAgIC8vIGdpdmVuIGNsb25lZFJlcXVlc3QsIHRoaXPigJlzIGhlYWRlcnPigJlzIGd1YXJkLCBhbmQgdGhpc+KAmXMgcmVsZXZhbnQgUmVhbG0uXG4gICAgY29uc3QgY2xvbmVkUmVxdWVzdE9iamVjdCA9IG5ldyBSZXF1ZXN0KGtDb25zdHJ1Y3QpXG4gICAgY2xvbmVkUmVxdWVzdE9iamVjdFtrU3RhdGVdID0gY2xvbmVkUmVxdWVzdFxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba0hlYWRlcnNdID0gbmV3IEhlYWRlcnMoa0NvbnN0cnVjdClcbiAgICBjbG9uZWRSZXF1ZXN0T2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gY2xvbmVkUmVxdWVzdC5oZWFkZXJzTGlzdFxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdXG4gICAgY2xvbmVkUmVxdWVzdE9iamVjdFtrSGVhZGVyc11ba1JlYWxtXSA9IHRoaXNba0hlYWRlcnNdW2tSZWFsbV1cblxuICAgIC8vIDQuIE1ha2UgY2xvbmVkUmVxdWVzdE9iamVjdOKAmXMgc2lnbmFsIGZvbGxvdyB0aGlz4oCZcyBzaWduYWwuXG4gICAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBpZiAodGhpcy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgYWMuYWJvcnQodGhpcy5zaWduYWwucmVhc29uKVxuICAgIH0gZWxzZSB7XG4gICAgICB1dGlsLmFkZEFib3J0TGlzdGVuZXIoXG4gICAgICAgIHRoaXMuc2lnbmFsLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYWMuYWJvcnQodGhpcy5zaWduYWwucmVhc29uKVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba1NpZ25hbF0gPSBhYy5zaWduYWxcblxuICAgIC8vIDQuIFJldHVybiBjbG9uZWRSZXF1ZXN0T2JqZWN0LlxuICAgIHJldHVybiBjbG9uZWRSZXF1ZXN0T2JqZWN0XG4gIH1cbn1cblxubWl4aW5Cb2R5KFJlcXVlc3QpXG5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0IChpbml0KSB7XG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0c1xuICBjb25zdCByZXF1ZXN0ID0ge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgbG9jYWxVUkxzT25seTogZmFsc2UsXG4gICAgdW5zYWZlUmVxdWVzdDogZmFsc2UsXG4gICAgYm9keTogbnVsbCxcbiAgICBjbGllbnQ6IG51bGwsXG4gICAgcmVzZXJ2ZWRDbGllbnQ6IG51bGwsXG4gICAgcmVwbGFjZXNDbGllbnRJZDogJycsXG4gICAgd2luZG93OiAnY2xpZW50JyxcbiAgICBrZWVwYWxpdmU6IGZhbHNlLFxuICAgIHNlcnZpY2VXb3JrZXJzOiAnYWxsJyxcbiAgICBpbml0aWF0b3I6ICcnLFxuICAgIGRlc3RpbmF0aW9uOiAnJyxcbiAgICBwcmlvcml0eTogbnVsbCxcbiAgICBvcmlnaW46ICdjbGllbnQnLFxuICAgIHBvbGljeUNvbnRhaW5lcjogJ2NsaWVudCcsXG4gICAgcmVmZXJyZXI6ICdjbGllbnQnLFxuICAgIHJlZmVycmVyUG9saWN5OiAnJyxcbiAgICBtb2RlOiAnbm8tY29ycycsXG4gICAgdXNlQ09SU1ByZWZsaWdodEZsYWc6IGZhbHNlLFxuICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgIHVzZUNyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICBjYWNoZTogJ2RlZmF1bHQnLFxuICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICBpbnRlZ3JpdHk6ICcnLFxuICAgIGNyeXB0b0dyYXBoaWNzTm9uY2VNZXRhZGF0YTogJycsXG4gICAgcGFyc2VyTWV0YWRhdGE6ICcnLFxuICAgIHJlbG9hZE5hdmlnYXRpb246IGZhbHNlLFxuICAgIGhpc3RvcnlOYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICB1c2VyQWN0aXZhdGlvbjogZmFsc2UsXG4gICAgdGFpbnRlZE9yaWdpbjogZmFsc2UsXG4gICAgcmVkaXJlY3RDb3VudDogMCxcbiAgICByZXNwb25zZVRhaW50aW5nOiAnYmFzaWMnLFxuICAgIHByZXZlbnROb0NhY2hlQ2FjaGVDb250cm9sSGVhZGVyTW9kaWZpY2F0aW9uOiBmYWxzZSxcbiAgICBkb25lOiBmYWxzZSxcbiAgICB0aW1pbmdBbGxvd0ZhaWxlZDogZmFsc2UsXG4gICAgLi4uaW5pdCxcbiAgICBoZWFkZXJzTGlzdDogaW5pdC5oZWFkZXJzTGlzdFxuICAgICAgPyBuZXcgSGVhZGVyc0xpc3QoaW5pdC5oZWFkZXJzTGlzdClcbiAgICAgIDogbmV3IEhlYWRlcnNMaXN0KClcbiAgfVxuICByZXF1ZXN0LnVybCA9IHJlcXVlc3QudXJsTGlzdFswXVxuICByZXR1cm4gcmVxdWVzdFxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1yZXF1ZXN0LWNsb25lXG5mdW5jdGlvbiBjbG9uZVJlcXVlc3QgKHJlcXVlc3QpIHtcbiAgLy8gVG8gY2xvbmUgYSByZXF1ZXN0IHJlcXVlc3QsIHJ1biB0aGVzZSBzdGVwczpcblxuICAvLyAxLiBMZXQgbmV3UmVxdWVzdCBiZSBhIGNvcHkgb2YgcmVxdWVzdCwgZXhjZXB0IGZvciBpdHMgYm9keS5cbiAgY29uc3QgbmV3UmVxdWVzdCA9IG1ha2VSZXF1ZXN0KHsgLi4ucmVxdWVzdCwgYm9keTogbnVsbCB9KVxuXG4gIC8vIDIuIElmIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsIHNldCBuZXdSZXF1ZXN04oCZcyBib2R5IHRvIHRoZVxuICAvLyByZXN1bHQgb2YgY2xvbmluZyByZXF1ZXN04oCZcyBib2R5LlxuICBpZiAocmVxdWVzdC5ib2R5ICE9IG51bGwpIHtcbiAgICBuZXdSZXF1ZXN0LmJvZHkgPSBjbG9uZUJvZHkocmVxdWVzdC5ib2R5KVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIG5ld1JlcXVlc3QuXG4gIHJldHVybiBuZXdSZXF1ZXN0XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlcXVlc3QucHJvdG90eXBlLCB7XG4gIG1ldGhvZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgdXJsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBoZWFkZXJzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWRpcmVjdDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY2xvbmU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHNpZ25hbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZHVwbGV4OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZXN0aW5hdGlvbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYm9keToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYm9keVVzZWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGlzSGlzdG9yeU5hdmlnYXRpb246IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGlzUmVsb2FkTmF2aWdhdGlvbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAga2VlcGFsaXZlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBpbnRlZ3JpdHk6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGNhY2hlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjcmVkZW50aWFsczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYXR0cmlidXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWZlcnJlclBvbGljeToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVmZXJyZXI6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG1vZGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdSZXF1ZXN0JyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfVxufSlcblxud2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdCA9IHdlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIoXG4gIFJlcXVlc3RcbilcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3RpbmZvXG53ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh0eXBlb2YgViA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKFYpXG4gIH1cblxuICBpZiAoViBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdChWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhWKVxufVxuXG53ZWJpZGwuY29udmVydGVycy5BYm9ydFNpZ25hbCA9IHdlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIoXG4gIEFib3J0U2lnbmFsXG4pXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0aW5pdFxud2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdtZXRob2QnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZ1xuICB9LFxuICB7XG4gICAga2V5OiAnaGVhZGVycycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5IZWFkZXJzSW5pdFxuICB9LFxuICB7XG4gICAga2V5OiAnYm9keScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIoXG4gICAgICB3ZWJpZGwuY29udmVydGVycy5Cb2R5SW5pdFxuICAgIClcbiAgfSxcbiAge1xuICAgIGtleTogJ3JlZmVycmVyJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZ1xuICB9LFxuICB7XG4gICAga2V5OiAncmVmZXJyZXJQb2xpY3knLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtcmVmZXJyZXItcG9saWN5LyNyZWZlcnJlci1wb2xpY3lcbiAgICBhbGxvd2VkVmFsdWVzOiByZWZlcnJlclBvbGljeVxuICB9LFxuICB7XG4gICAga2V5OiAnbW9kZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtcmVxdWVzdC1tb2RlXG4gICAgYWxsb3dlZFZhbHVlczogcmVxdWVzdE1vZGVcbiAgfSxcbiAge1xuICAgIGtleTogJ2NyZWRlbnRpYWxzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdGNyZWRlbnRpYWxzXG4gICAgYWxsb3dlZFZhbHVlczogcmVxdWVzdENyZWRlbnRpYWxzXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjYWNoZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3RjYWNoZVxuICAgIGFsbG93ZWRWYWx1ZXM6IHJlcXVlc3RDYWNoZVxuICB9LFxuICB7XG4gICAga2V5OiAncmVkaXJlY3QnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0cmVkaXJlY3RcbiAgICBhbGxvd2VkVmFsdWVzOiByZXF1ZXN0UmVkaXJlY3RcbiAgfSxcbiAge1xuICAgIGtleTogJ2ludGVncml0eScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmdcbiAgfSxcbiAge1xuICAgIGtleTogJ2tlZXBhbGl2ZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzaWduYWwnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKFxuICAgICAgKHNpZ25hbCkgPT4gd2ViaWRsLmNvbnZlcnRlcnMuQWJvcnRTaWduYWwoXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICAgeyBzdHJpY3Q6IGZhbHNlIH1cbiAgICAgIClcbiAgICApXG4gIH0sXG4gIHtcbiAgICBrZXk6ICd3aW5kb3cnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYW55XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkdXBsZXgnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIGFsbG93ZWRWYWx1ZXM6IHJlcXVlc3REdXBsZXhcbiAgfVxuXSlcblxubW9kdWxlLmV4cG9ydHMgPSB7IFJlcXVlc3QsIG1ha2VSZXF1ZXN0IH1cbiIsCiAgICAiLy8gaHR0cHM6Ly9naXRodWIuY29tL0V0aGFuLUFycm93b29kL3VuZGljaS1mZXRjaFxuXG4ndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBSZXNwb25zZSxcbiAgbWFrZU5ldHdvcmtFcnJvcixcbiAgbWFrZUFwcHJvcHJpYXRlTmV0d29ya0Vycm9yLFxuICBmaWx0ZXJSZXNwb25zZSxcbiAgbWFrZVJlc3BvbnNlXG59ID0gcmVxdWlyZSgnLi9yZXNwb25zZScpXG5jb25zdCB7IEhlYWRlcnMgfSA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5jb25zdCB7IFJlcXVlc3QsIG1ha2VSZXF1ZXN0IH0gPSByZXF1aXJlKCcuL3JlcXVlc3QnKVxuY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKVxuY29uc3Qge1xuICBieXRlc01hdGNoLFxuICBtYWtlUG9saWN5Q29udGFpbmVyLFxuICBjbG9uZVBvbGljeUNvbnRhaW5lcixcbiAgcmVxdWVzdEJhZFBvcnQsXG4gIFRBT0NoZWNrLFxuICBhcHBlbmRSZXF1ZXN0T3JpZ2luSGVhZGVyLFxuICByZXNwb25zZUxvY2F0aW9uVVJMLFxuICByZXF1ZXN0Q3VycmVudFVSTCxcbiAgc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdCxcbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMLFxuICBjcmVhdGVPcGFxdWVUaW1pbmdJbmZvLFxuICBhcHBlbmRGZXRjaE1ldGFkYXRhLFxuICBjb3JzQ2hlY2ssXG4gIGNyb3NzT3JpZ2luUmVzb3VyY2VQb2xpY3lDaGVjayxcbiAgZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcixcbiAgY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgaXNCbG9iTGlrZSxcbiAgc2FtZU9yaWdpbixcbiAgaXNDYW5jZWxsZWQsXG4gIGlzQWJvcnRlZCxcbiAgaXNFcnJvckxpa2UsXG4gIGZ1bGx5UmVhZEJvZHksXG4gIHJlYWRhYmxlU3RyZWFtQ2xvc2UsXG4gIGlzb21vcnBoaWNFbmNvZGUsXG4gIHVybElzTG9jYWwsXG4gIHVybElzSHR0cEh0dHBzU2NoZW1lLFxuICB1cmxIYXNIdHRwc1NjaGVtZVxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGtTdGF0ZSwga0hlYWRlcnMsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgc2FmZWx5RXh0cmFjdEJvZHkgfSA9IHJlcXVpcmUoJy4vYm9keScpXG5jb25zdCB7XG4gIHJlZGlyZWN0U3RhdHVzU2V0LFxuICBudWxsQm9keVN0YXR1cyxcbiAgc2FmZU1ldGhvZHNTZXQsXG4gIHJlcXVlc3RCb2R5SGVhZGVyLFxuICBzdWJyZXNvdXJjZVNldCxcbiAgRE9NRXhjZXB0aW9uXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrSGVhZGVyc0xpc3QgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpXG5jb25zdCB7IFJlYWRhYmxlLCBwaXBlbGluZSB9ID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IHsgYWRkQWJvcnRMaXN0ZW5lciwgaXNFcnJvcmVkLCBpc1JlYWRhYmxlLCBub2RlTWFqb3IsIG5vZGVNaW5vciB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZGF0YVVSTFByb2Nlc3Nvciwgc2VyaWFsaXplQU1pbWVUeXBlIH0gPSByZXF1aXJlKCcuL2RhdGFVUkwnKVxuY29uc3QgeyBUcmFuc2Zvcm1TdHJlYW0gfSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKVxuY29uc3QgeyBnZXRHbG9iYWxEaXNwYXRjaGVyIH0gPSByZXF1aXJlKCcuLi9nbG9iYWwnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgU1RBVFVTX0NPREVTIH0gPSByZXF1aXJlKCdodHRwJylcbmNvbnN0IEdFVF9PUl9IRUFEID0gWydHRVQnLCAnSEVBRCddXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdidWZmZXInKS5yZXNvbHZlT2JqZWN0VVJMfSAqL1xubGV0IHJlc29sdmVPYmplY3RVUkxcbmxldCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW1cblxuY2xhc3MgRmV0Y2ggZXh0ZW5kcyBFRSB7XG4gIGNvbnN0cnVjdG9yIChkaXNwYXRjaGVyKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlclxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGxcbiAgICB0aGlzLmR1bXAgPSBmYWxzZVxuICAgIHRoaXMuc3RhdGUgPSAnb25nb2luZydcbiAgICAvLyAyIHRlcm1pbmF0ZWQgbGlzdGVuZXJzIGdldCBhZGRlZCBwZXIgcmVxdWVzdCxcbiAgICAvLyBidXQgb25seSAxIGdldHMgcmVtb3ZlZC4gSWYgdGhlcmUgYXJlIDIwIHJlZGlyZWN0cyxcbiAgICAvLyAyMSBsaXN0ZW5lcnMgd2lsbCBiZSBhZGRlZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzE3MTFcbiAgICAvLyBUT0RPIChmaXgpOiBGaW5kIGFuZCBmaXggcm9vdCBjYXVzZSBmb3IgbGVha2VkIGxpc3RlbmVyLlxuICAgIHRoaXMuc2V0TWF4TGlzdGVuZXJzKDIxKVxuICB9XG5cbiAgdGVybWluYXRlIChyZWFzb24pIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29uZ29pbmcnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gJ3Rlcm1pbmF0ZWQnXG4gICAgdGhpcy5jb25uZWN0aW9uPy5kZXN0cm95KHJlYXNvbilcbiAgICB0aGlzLmVtaXQoJ3Rlcm1pbmF0ZWQnLCByZWFzb24pXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmV0Y2gtY29udHJvbGxlci1hYm9ydFxuICBhYm9ydCAoZXJyb3IpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29uZ29pbmcnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAxLiBTZXQgY29udHJvbGxlcuKAmXMgc3RhdGUgdG8gXCJhYm9ydGVkXCIuXG4gICAgdGhpcy5zdGF0ZSA9ICdhYm9ydGVkJ1xuXG4gICAgLy8gMi4gTGV0IGZhbGxiYWNrRXJyb3IgYmUgYW4gXCJBYm9ydEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgIC8vIDMuIFNldCBlcnJvciB0byBmYWxsYmFja0Vycm9yIGlmIGl0IGlzIG5vdCBnaXZlbi5cbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBlcnJvciA9IG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDQuIExldCBzZXJpYWxpemVkRXJyb3IgYmUgU3RydWN0dXJlZFNlcmlhbGl6ZShlcnJvcikuXG4gICAgLy8gICAgSWYgdGhhdCB0aHJldyBhbiBleGNlcHRpb24sIGNhdGNoIGl0LCBhbmQgbGV0XG4gICAgLy8gICAgc2VyaWFsaXplZEVycm9yIGJlIFN0cnVjdHVyZWRTZXJpYWxpemUoZmFsbGJhY2tFcnJvcikuXG5cbiAgICAvLyA1LiBTZXQgY29udHJvbGxlcuKAmXMgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gdG8gc2VyaWFsaXplZEVycm9yLlxuICAgIHRoaXMuc2VyaWFsaXplZEFib3J0UmVhc29uID0gZXJyb3JcblxuICAgIHRoaXMuY29ubmVjdGlvbj8uZGVzdHJveShlcnJvcilcbiAgICB0aGlzLmVtaXQoJ3Rlcm1pbmF0ZWQnLCBlcnJvcilcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmV0Y2gtbWV0aG9kXG5mdW5jdGlvbiBmZXRjaCAoaW5wdXQsIGluaXQgPSB7fSkge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnZ2xvYmFsVGhpcy5mZXRjaCcgfSlcblxuICAvLyAxLiBMZXQgcCBiZSBhIG5ldyBwcm9taXNlLlxuICBjb25zdCBwID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAvLyAyLiBMZXQgcmVxdWVzdE9iamVjdCBiZSB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBpbml0aWFsIHZhbHVlIG9mXG4gIC8vIFJlcXVlc3QgYXMgY29uc3RydWN0b3Igd2l0aCBpbnB1dCBhbmQgaW5pdCBhcyBhcmd1bWVudHMuIElmIHRoaXMgdGhyb3dzXG4gIC8vIGFuIGV4Y2VwdGlvbiwgcmVqZWN0IHAgd2l0aCBpdCBhbmQgcmV0dXJuIHAuXG4gIGxldCByZXF1ZXN0T2JqZWN0XG5cbiAgdHJ5IHtcbiAgICByZXF1ZXN0T2JqZWN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwLnJlamVjdChlKVxuICAgIHJldHVybiBwLnByb21pc2VcbiAgfVxuXG4gIC8vIDMuIExldCByZXF1ZXN0IGJlIHJlcXVlc3RPYmplY3TigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0T2JqZWN0W2tTdGF0ZV1cblxuICAvLyA0LiBJZiByZXF1ZXN0T2JqZWN04oCZcyBzaWduYWzigJlzIGFib3J0ZWQgZmxhZyBpcyBzZXQsIHRoZW46XG4gIGlmIChyZXF1ZXN0T2JqZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgLy8gMS4gQWJvcnQgdGhlIGZldGNoKCkgY2FsbCB3aXRoIHAsIHJlcXVlc3QsIG51bGwsIGFuZFxuICAgIC8vICAgIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbOKAmXMgYWJvcnQgcmVhc29uLlxuICAgIGFib3J0RmV0Y2gocCwgcmVxdWVzdCwgbnVsbCwgcmVxdWVzdE9iamVjdC5zaWduYWwucmVhc29uKVxuXG4gICAgLy8gMi4gUmV0dXJuIHAuXG4gICAgcmV0dXJuIHAucHJvbWlzZVxuICB9XG5cbiAgLy8gNS4gTGV0IGdsb2JhbE9iamVjdCBiZSByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QuXG4gIGNvbnN0IGdsb2JhbE9iamVjdCA9IHJlcXVlc3QuY2xpZW50Lmdsb2JhbE9iamVjdFxuXG4gIC8vIDYuIElmIGdsb2JhbE9iamVjdCBpcyBhIFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZSBvYmplY3QsIHRoZW4gc2V0XG4gIC8vIHJlcXVlc3TigJlzIHNlcnZpY2Utd29ya2VycyBtb2RlIHRvIFwibm9uZVwiLlxuICBpZiAoZ2xvYmFsT2JqZWN0Py5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ1NlcnZpY2VXb3JrZXJHbG9iYWxTY29wZScpIHtcbiAgICByZXF1ZXN0LnNlcnZpY2VXb3JrZXJzID0gJ25vbmUnXG4gIH1cblxuICAvLyA3LiBMZXQgcmVzcG9uc2VPYmplY3QgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlT2JqZWN0ID0gbnVsbFxuXG4gIC8vIDguIExldCByZWxldmFudFJlYWxtIGJlIHRoaXPigJlzIHJlbGV2YW50IFJlYWxtLlxuICBjb25zdCByZWxldmFudFJlYWxtID0gbnVsbFxuXG4gIC8vIDkuIExldCBsb2NhbGx5QWJvcnRlZCBiZSBmYWxzZS5cbiAgbGV0IGxvY2FsbHlBYm9ydGVkID0gZmFsc2VcblxuICAvLyAxMC4gTGV0IGNvbnRyb2xsZXIgYmUgbnVsbC5cbiAgbGV0IGNvbnRyb2xsZXIgPSBudWxsXG5cbiAgLy8gMTEuIEFkZCB0aGUgZm9sbG93aW5nIGFib3J0IHN0ZXBzIHRvIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbDpcbiAgYWRkQWJvcnRMaXN0ZW5lcihcbiAgICByZXF1ZXN0T2JqZWN0LnNpZ25hbCxcbiAgICAoKSA9PiB7XG4gICAgICAvLyAxLiBTZXQgbG9jYWxseUFib3J0ZWQgdG8gdHJ1ZS5cbiAgICAgIGxvY2FsbHlBYm9ydGVkID0gdHJ1ZVxuXG4gICAgICAvLyAyLiBBc3NlcnQ6IGNvbnRyb2xsZXIgaXMgbm9uLW51bGwuXG4gICAgICBhc3NlcnQoY29udHJvbGxlciAhPSBudWxsKVxuXG4gICAgICAvLyAzLiBBYm9ydCBjb250cm9sbGVyIHdpdGggcmVxdWVzdE9iamVjdOKAmXMgc2lnbmFs4oCZcyBhYm9ydCByZWFzb24uXG4gICAgICBjb250cm9sbGVyLmFib3J0KHJlcXVlc3RPYmplY3Quc2lnbmFsLnJlYXNvbilcblxuICAgICAgLy8gNC4gQWJvcnQgdGhlIGZldGNoKCkgY2FsbCB3aXRoIHAsIHJlcXVlc3QsIHJlc3BvbnNlT2JqZWN0LFxuICAgICAgLy8gICAgYW5kIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbOKAmXMgYWJvcnQgcmVhc29uLlxuICAgICAgYWJvcnRGZXRjaChwLCByZXF1ZXN0LCByZXNwb25zZU9iamVjdCwgcmVxdWVzdE9iamVjdC5zaWduYWwucmVhc29uKVxuICAgIH1cbiAgKVxuXG4gIC8vIDEyLiBMZXQgaGFuZGxlRmV0Y2hEb25lIGdpdmVuIHJlc3BvbnNlIHJlc3BvbnNlIGJlIHRvIGZpbmFsaXplIGFuZFxuICAvLyByZXBvcnQgdGltaW5nIHdpdGggcmVzcG9uc2UsIGdsb2JhbE9iamVjdCwgYW5kIFwiZmV0Y2hcIi5cbiAgY29uc3QgaGFuZGxlRmV0Y2hEb25lID0gKHJlc3BvbnNlKSA9PlxuICAgIGZpbmFsaXplQW5kUmVwb3J0VGltaW5nKHJlc3BvbnNlLCAnZmV0Y2gnKVxuXG4gIC8vIDEzLiBTZXQgY29udHJvbGxlciB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgZmV0Y2ggZ2l2ZW4gcmVxdWVzdCxcbiAgLy8gd2l0aCBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkgc2V0IHRvIGhhbmRsZUZldGNoRG9uZSwgYW5kIHByb2Nlc3NSZXNwb25zZVxuICAvLyBnaXZlbiByZXNwb25zZSBiZWluZyB0aGVzZSBzdWJzdGVwczpcblxuICBjb25zdCBwcm9jZXNzUmVzcG9uc2UgPSAocmVzcG9uc2UpID0+IHtcbiAgICAvLyAxLiBJZiBsb2NhbGx5QWJvcnRlZCBpcyB0cnVlLCB0ZXJtaW5hdGUgdGhlc2Ugc3Vic3RlcHMuXG4gICAgaWYgKGxvY2FsbHlBYm9ydGVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG5cbiAgICAvLyAyLiBJZiByZXNwb25zZeKAmXMgYWJvcnRlZCBmbGFnIGlzIHNldCwgdGhlbjpcbiAgICBpZiAocmVzcG9uc2UuYWJvcnRlZCkge1xuICAgICAgLy8gMS4gTGV0IGRlc2VyaWFsaXplZEVycm9yIGJlIHRoZSByZXN1bHQgb2YgZGVzZXJpYWxpemUgYSBzZXJpYWxpemVkXG4gICAgICAvLyAgICBhYm9ydCByZWFzb24gZ2l2ZW4gY29udHJvbGxlcuKAmXMgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gYW5kXG4gICAgICAvLyAgICByZWxldmFudFJlYWxtLlxuXG4gICAgICAvLyAyLiBBYm9ydCB0aGUgZmV0Y2goKSBjYWxsIHdpdGggcCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGFuZFxuICAgICAgLy8gICAgZGVzZXJpYWxpemVkRXJyb3IuXG5cbiAgICAgIGFib3J0RmV0Y2gocCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGNvbnRyb2xsZXIuc2VyaWFsaXplZEFib3J0UmVhc29uKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgLy8gMy4gSWYgcmVzcG9uc2UgaXMgYSBuZXR3b3JrIGVycm9yLCB0aGVuIHJlamVjdCBwIHdpdGggYSBUeXBlRXJyb3JcbiAgICAvLyBhbmQgdGVybWluYXRlIHRoZXNlIHN1YnN0ZXBzLlxuICAgIGlmIChyZXNwb25zZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICBwLnJlamVjdChcbiAgICAgICAgT2JqZWN0LmFzc2lnbihuZXcgVHlwZUVycm9yKCdmZXRjaCBmYWlsZWQnKSwgeyBjYXVzZTogcmVzcG9uc2UuZXJyb3IgfSlcbiAgICAgIClcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cblxuICAgIC8vIDQuIFNldCByZXNwb25zZU9iamVjdCB0byB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgUmVzcG9uc2Ugb2JqZWN0LFxuICAgIC8vIGdpdmVuIHJlc3BvbnNlLCBcImltbXV0YWJsZVwiLCBhbmQgcmVsZXZhbnRSZWFsbS5cbiAgICByZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgcmVzcG9uc2VPYmplY3Rba1N0YXRlXSA9IHJlc3BvbnNlXG4gICAgcmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAnaW1tdXRhYmxlJ1xuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuXG4gICAgLy8gNS4gUmVzb2x2ZSBwIHdpdGggcmVzcG9uc2VPYmplY3QuXG4gICAgcC5yZXNvbHZlKHJlc3BvbnNlT2JqZWN0KVxuICB9XG5cbiAgY29udHJvbGxlciA9IGZldGNoaW5nKHtcbiAgICByZXF1ZXN0LFxuICAgIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keTogaGFuZGxlRmV0Y2hEb25lLFxuICAgIHByb2Nlc3NSZXNwb25zZSxcbiAgICBkaXNwYXRjaGVyOiBpbml0LmRpc3BhdGNoZXIgPz8gZ2V0R2xvYmFsRGlzcGF0Y2hlcigpIC8vIHVuZGljaVxuICB9KVxuXG4gIC8vIDE0LiBSZXR1cm4gcC5cbiAgcmV0dXJuIHAucHJvbWlzZVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmluYWxpemUtYW5kLXJlcG9ydC10aW1pbmdcbmZ1bmN0aW9uIGZpbmFsaXplQW5kUmVwb3J0VGltaW5nIChyZXNwb25zZSwgaW5pdGlhdG9yVHlwZSA9ICdvdGhlcicpIHtcbiAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYW4gYWJvcnRlZCBuZXR3b3JrIGVycm9yLCB0aGVuIHJldHVybi5cbiAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgJiYgcmVzcG9uc2UuYWJvcnRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMi4gSWYgcmVzcG9uc2XigJlzIFVSTCBsaXN0IGlzIG51bGwgb3IgZW1wdHksIHRoZW4gcmV0dXJuLlxuICBpZiAoIXJlc3BvbnNlLnVybExpc3Q/Lmxlbmd0aCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMy4gTGV0IG9yaWdpbmFsVVJMIGJlIHJlc3BvbnNl4oCZcyBVUkwgbGlzdFswXS5cbiAgY29uc3Qgb3JpZ2luYWxVUkwgPSByZXNwb25zZS51cmxMaXN0WzBdXG5cbiAgLy8gNC4gTGV0IHRpbWluZ0luZm8gYmUgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvLlxuICBsZXQgdGltaW5nSW5mbyA9IHJlc3BvbnNlLnRpbWluZ0luZm9cblxuICAvLyA1LiBMZXQgY2FjaGVTdGF0ZSBiZSByZXNwb25zZeKAmXMgY2FjaGUgc3RhdGUuXG4gIGxldCBjYWNoZVN0YXRlID0gcmVzcG9uc2UuY2FjaGVTdGF0ZVxuXG4gIC8vIDYuIElmIG9yaWdpbmFsVVJM4oCZcyBzY2hlbWUgaXMgbm90IGFuIEhUVFAoUykgc2NoZW1lLCB0aGVuIHJldHVybi5cbiAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShvcmlnaW5hbFVSTCkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIDcuIElmIHRpbWluZ0luZm8gaXMgbnVsbCwgdGhlbiByZXR1cm4uXG4gIGlmICh0aW1pbmdJbmZvID09PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA4LiBJZiByZXNwb25zZeKAmXMgdGltaW5nIGFsbG93IHBhc3NlZCBmbGFnIGlzIG5vdCBzZXQsIHRoZW46XG4gIGlmICghcmVzcG9uc2UudGltaW5nQWxsb3dQYXNzZWQpIHtcbiAgICAvLyAgMS4gU2V0IHRpbWluZ0luZm8gdG8gYSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGFuIG9wYXF1ZSB0aW1pbmcgaW5mbyBmb3IgdGltaW5nSW5mby5cbiAgICB0aW1pbmdJbmZvID0gY3JlYXRlT3BhcXVlVGltaW5nSW5mbyh7XG4gICAgICBzdGFydFRpbWU6IHRpbWluZ0luZm8uc3RhcnRUaW1lXG4gICAgfSlcblxuICAgIC8vICAyLiBTZXQgY2FjaGVTdGF0ZSB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICAgIGNhY2hlU3RhdGUgPSAnJ1xuICB9XG5cbiAgLy8gOS4gU2V0IHRpbWluZ0luZm/igJlzIGVuZCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZVxuICAvLyBnaXZlbiBnbG9iYWzigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdOKAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkXG4gIC8vIGNhcGFiaWxpdHkuXG4gIC8vIFRPRE86IGdpdmVuIGdsb2JhbOKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN04oCZcyBjcm9zcy1vcmlnaW4gaXNvbGF0ZWRcbiAgLy8gY2FwYWJpbGl0eT9cbiAgdGltaW5nSW5mby5lbmRUaW1lID0gY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUoKVxuXG4gIC8vIDEwLiBTZXQgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvIHRvIHRpbWluZ0luZm8uXG4gIHJlc3BvbnNlLnRpbWluZ0luZm8gPSB0aW1pbmdJbmZvXG5cbiAgLy8gMTEuIE1hcmsgcmVzb3VyY2UgdGltaW5nIGZvciB0aW1pbmdJbmZvLCBvcmlnaW5hbFVSTCwgaW5pdGlhdG9yVHlwZSxcbiAgLy8gZ2xvYmFsLCBhbmQgY2FjaGVTdGF0ZS5cbiAgbWFya1Jlc291cmNlVGltaW5nKFxuICAgIHRpbWluZ0luZm8sXG4gICAgb3JpZ2luYWxVUkwsXG4gICAgaW5pdGlhdG9yVHlwZSxcbiAgICBnbG9iYWxUaGlzLFxuICAgIGNhY2hlU3RhdGVcbiAgKVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vcmVzb3VyY2UtdGltaW5nLyNkZm4tbWFyay1yZXNvdXJjZS10aW1pbmdcbmZ1bmN0aW9uIG1hcmtSZXNvdXJjZVRpbWluZyAodGltaW5nSW5mbywgb3JpZ2luYWxVUkwsIGluaXRpYXRvclR5cGUsIGdsb2JhbFRoaXMsIGNhY2hlU3RhdGUpIHtcbiAgaWYgKG5vZGVNYWpvciA+IDE4IHx8IChub2RlTWFqb3IgPT09IDE4ICYmIG5vZGVNaW5vciA+PSAyKSkge1xuICAgIHBlcmZvcm1hbmNlLm1hcmtSZXNvdXJjZVRpbWluZyh0aW1pbmdJbmZvLCBvcmlnaW5hbFVSTC5ocmVmLCBpbml0aWF0b3JUeXBlLCBnbG9iYWxUaGlzLCBjYWNoZVN0YXRlKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNhYm9ydC1mZXRjaFxuZnVuY3Rpb24gYWJvcnRGZXRjaCAocCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGVycm9yKSB7XG4gIC8vIE5vdGU6IEFib3J0U2lnbmFsLnJlYXNvbiB3YXMgYWRkZWQgaW4gbm9kZSB2MTcuMi4wXG4gIC8vIHdoaWNoIHdvdWxkIGdpdmUgdXMgYW4gdW5kZWZpbmVkIGVycm9yIHRvIHJlamVjdCB3aXRoLlxuICAvLyBSZW1vdmUgdGhpcyBvbmNlIG5vZGUgdjE2IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4gIGlmICghZXJyb3IpIHtcbiAgICBlcnJvciA9IG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICB9XG5cbiAgLy8gMS4gUmVqZWN0IHByb21pc2Ugd2l0aCBlcnJvci5cbiAgcC5yZWplY3QoZXJyb3IpXG5cbiAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgYm9keSBpcyBub3QgbnVsbCBhbmQgaXMgcmVhZGFibGUsIHRoZW4gY2FuY2VsIHJlcXVlc3TigJlzXG4gIC8vIGJvZHkgd2l0aCBlcnJvci5cbiAgaWYgKHJlcXVlc3QuYm9keSAhPSBudWxsICYmIGlzUmVhZGFibGUocmVxdWVzdC5ib2R5Py5zdHJlYW0pKSB7XG4gICAgcmVxdWVzdC5ib2R5LnN0cmVhbS5jYW5jZWwoZXJyb3IpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VSUl9JTlZBTElEX1NUQVRFJykge1xuICAgICAgICAvLyBOb2RlIGJ1Zz9cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9KVxuICB9XG5cbiAgLy8gMy4gSWYgcmVzcG9uc2VPYmplY3QgaXMgbnVsbCwgdGhlbiByZXR1cm4uXG4gIGlmIChyZXNwb25zZU9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA0LiBMZXQgcmVzcG9uc2UgYmUgcmVzcG9uc2VPYmplY3TigJlzIHJlc3BvbnNlLlxuICBjb25zdCByZXNwb25zZSA9IHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV1cblxuICAvLyA1LiBJZiByZXNwb25zZeKAmXMgYm9keSBpcyBub3QgbnVsbCBhbmQgaXMgcmVhZGFibGUsIHRoZW4gZXJyb3IgcmVzcG9uc2XigJlzXG4gIC8vIGJvZHkgd2l0aCBlcnJvci5cbiAgaWYgKHJlc3BvbnNlLmJvZHkgIT0gbnVsbCAmJiBpc1JlYWRhYmxlKHJlc3BvbnNlLmJvZHk/LnN0cmVhbSkpIHtcbiAgICByZXNwb25zZS5ib2R5LnN0cmVhbS5jYW5jZWwoZXJyb3IpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VSUl9JTlZBTElEX1NUQVRFJykge1xuICAgICAgICAvLyBOb2RlIGJ1Zz9cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9KVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmZXRjaGluZ1xuZnVuY3Rpb24gZmV0Y2hpbmcgKHtcbiAgcmVxdWVzdCxcbiAgcHJvY2Vzc1JlcXVlc3RCb2R5Q2h1bmtMZW5ndGgsXG4gIHByb2Nlc3NSZXF1ZXN0RW5kT2ZCb2R5LFxuICBwcm9jZXNzUmVzcG9uc2UsXG4gIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSxcbiAgcHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHksXG4gIHVzZVBhcmFsbGVsUXVldWUgPSBmYWxzZSxcbiAgZGlzcGF0Y2hlciAvLyB1bmRpY2lcbn0pIHtcbiAgLy8gMS4gTGV0IHRhc2tEZXN0aW5hdGlvbiBiZSBudWxsLlxuICBsZXQgdGFza0Rlc3RpbmF0aW9uID0gbnVsbFxuXG4gIC8vIDIuIExldCBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSBiZSBmYWxzZS5cbiAgbGV0IGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5ID0gZmFsc2VcblxuICAvLyAzLiBJZiByZXF1ZXN04oCZcyBjbGllbnQgaXMgbm9uLW51bGwsIHRoZW46XG4gIGlmIChyZXF1ZXN0LmNsaWVudCAhPSBudWxsKSB7XG4gICAgLy8gMS4gU2V0IHRhc2tEZXN0aW5hdGlvbiB0byByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QuXG4gICAgdGFza0Rlc3RpbmF0aW9uID0gcmVxdWVzdC5jbGllbnQuZ2xvYmFsT2JqZWN0XG5cbiAgICAvLyAyLiBTZXQgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkgdG8gcmVxdWVzdOKAmXMgY2xpZW504oCZcyBjcm9zcy1vcmlnaW5cbiAgICAvLyBpc29sYXRlZCBjYXBhYmlsaXR5LlxuICAgIGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5ID1cbiAgICAgIHJlcXVlc3QuY2xpZW50LmNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5XG4gIH1cblxuICAvLyA0LiBJZiB1c2VQYXJhbGxlbFF1ZXVlIGlzIHRydWUsIHRoZW4gc2V0IHRhc2tEZXN0aW5hdGlvbiB0byB0aGUgcmVzdWx0IG9mXG4gIC8vIHN0YXJ0aW5nIGEgbmV3IHBhcmFsbGVsIHF1ZXVlLlxuICAvLyBUT0RPXG5cbiAgLy8gNS4gTGV0IHRpbWluZ0luZm8gYmUgYSBuZXcgZmV0Y2ggdGltaW5nIGluZm8gd2hvc2Ugc3RhcnQgdGltZSBhbmRcbiAgLy8gcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lIGFyZSB0aGUgY29hcnNlbmVkIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW5cbiAgLy8gY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkuXG4gIGNvbnN0IGN1cnJlblRpbWUgPSBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZShjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSlcbiAgY29uc3QgdGltaW5nSW5mbyA9IGNyZWF0ZU9wYXF1ZVRpbWluZ0luZm8oe1xuICAgIHN0YXJ0VGltZTogY3VycmVuVGltZVxuICB9KVxuXG4gIC8vIDYuIExldCBmZXRjaFBhcmFtcyBiZSBhIG5ldyBmZXRjaCBwYXJhbXMgd2hvc2VcbiAgLy8gcmVxdWVzdCBpcyByZXF1ZXN0LFxuICAvLyB0aW1pbmcgaW5mbyBpcyB0aW1pbmdJbmZvLFxuICAvLyBwcm9jZXNzIHJlcXVlc3QgYm9keSBjaHVuayBsZW5ndGggaXMgcHJvY2Vzc1JlcXVlc3RCb2R5Q2h1bmtMZW5ndGgsXG4gIC8vIHByb2Nlc3MgcmVxdWVzdCBlbmQtb2YtYm9keSBpcyBwcm9jZXNzUmVxdWVzdEVuZE9mQm9keSxcbiAgLy8gcHJvY2VzcyByZXNwb25zZSBpcyBwcm9jZXNzUmVzcG9uc2UsXG4gIC8vIHByb2Nlc3MgcmVzcG9uc2UgY29uc3VtZSBib2R5IGlzIHByb2Nlc3NSZXNwb25zZUNvbnN1bWVCb2R5LFxuICAvLyBwcm9jZXNzIHJlc3BvbnNlIGVuZC1vZi1ib2R5IGlzIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSxcbiAgLy8gdGFzayBkZXN0aW5hdGlvbiBpcyB0YXNrRGVzdGluYXRpb24sXG4gIC8vIGFuZCBjcm9zcy1vcmlnaW4gaXNvbGF0ZWQgY2FwYWJpbGl0eSBpcyBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eS5cbiAgY29uc3QgZmV0Y2hQYXJhbXMgPSB7XG4gICAgY29udHJvbGxlcjogbmV3IEZldGNoKGRpc3BhdGNoZXIpLFxuICAgIHJlcXVlc3QsXG4gICAgdGltaW5nSW5mbyxcbiAgICBwcm9jZXNzUmVxdWVzdEJvZHlDaHVua0xlbmd0aCxcbiAgICBwcm9jZXNzUmVxdWVzdEVuZE9mQm9keSxcbiAgICBwcm9jZXNzUmVzcG9uc2UsXG4gICAgcHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHksXG4gICAgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5LFxuICAgIHRhc2tEZXN0aW5hdGlvbixcbiAgICBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eVxuICB9XG5cbiAgLy8gNy4gSWYgcmVxdWVzdOKAmXMgYm9keSBpcyBhIGJ5dGUgc2VxdWVuY2UsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGJvZHkgdG9cbiAgLy8gICAgcmVxdWVzdOKAmXMgYm9keSBhcyBhIGJvZHkuXG4gIC8vIE5PVEU6IFNpbmNlIGZldGNoaW5nIGlzIG9ubHkgY2FsbGVkIGZyb20gZmV0Y2gsIGJvZHkgc2hvdWxkIGFscmVhZHkgYmVcbiAgLy8gZXh0cmFjdGVkLlxuICBhc3NlcnQoIXJlcXVlc3QuYm9keSB8fCByZXF1ZXN0LmJvZHkuc3RyZWFtKVxuXG4gIC8vIDguIElmIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBcImNsaWVudFwiLCB0aGVuIHNldCByZXF1ZXN04oCZcyB3aW5kb3cgdG8gcmVxdWVzdOKAmXNcbiAgLy8gY2xpZW50LCBpZiByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QgaXMgYSBXaW5kb3cgb2JqZWN0OyBvdGhlcndpc2VcbiAgLy8gXCJuby13aW5kb3dcIi5cbiAgaWYgKHJlcXVlc3Qud2luZG93ID09PSAnY2xpZW50Jykge1xuICAgIC8vIFRPRE86IFdoYXQgaWYgcmVxdWVzdC5jbGllbnQgaXMgbnVsbD9cbiAgICByZXF1ZXN0LndpbmRvdyA9XG4gICAgICByZXF1ZXN0LmNsaWVudD8uZ2xvYmFsT2JqZWN0Py5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ1dpbmRvdydcbiAgICAgICAgPyByZXF1ZXN0LmNsaWVudFxuICAgICAgICA6ICduby13aW5kb3cnXG4gIH1cblxuICAvLyA5LiBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgXCJjbGllbnRcIiwgdGhlbiBzZXQgcmVxdWVzdOKAmXMgb3JpZ2luIHRvIHJlcXVlc3TigJlzXG4gIC8vIGNsaWVudOKAmXMgb3JpZ2luLlxuICBpZiAocmVxdWVzdC5vcmlnaW4gPT09ICdjbGllbnQnKSB7XG4gICAgLy8gVE9ETzogV2hhdCBpZiByZXF1ZXN0LmNsaWVudCBpcyBudWxsP1xuICAgIHJlcXVlc3Qub3JpZ2luID0gcmVxdWVzdC5jbGllbnQ/Lm9yaWdpblxuICB9XG5cbiAgLy8gMTAuIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gIC8vIFRPRE9cblxuICAvLyAxMS4gSWYgcmVxdWVzdOKAmXMgcG9saWN5IGNvbnRhaW5lciBpcyBcImNsaWVudFwiLCB0aGVuOlxuICBpZiAocmVxdWVzdC5wb2xpY3lDb250YWluZXIgPT09ICdjbGllbnQnKSB7XG4gICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgY2xpZW50IGlzIG5vbi1udWxsLCB0aGVuIHNldCByZXF1ZXN04oCZcyBwb2xpY3lcbiAgICAvLyBjb250YWluZXIgdG8gYSBjbG9uZSBvZiByZXF1ZXN04oCZcyBjbGllbnTigJlzIHBvbGljeSBjb250YWluZXIuIFtIVE1MXVxuICAgIGlmIChyZXF1ZXN0LmNsaWVudCAhPSBudWxsKSB7XG4gICAgICByZXF1ZXN0LnBvbGljeUNvbnRhaW5lciA9IGNsb25lUG9saWN5Q29udGFpbmVyKFxuICAgICAgICByZXF1ZXN0LmNsaWVudC5wb2xpY3lDb250YWluZXJcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBzZXQgcmVxdWVzdOKAmXMgcG9saWN5IGNvbnRhaW5lciB0byBhIG5ldyBwb2xpY3lcbiAgICAgIC8vIGNvbnRhaW5lci5cbiAgICAgIHJlcXVlc3QucG9saWN5Q29udGFpbmVyID0gbWFrZVBvbGljeUNvbnRhaW5lcigpXG4gICAgfVxuICB9XG5cbiAgLy8gMTIuIElmIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEFjY2VwdGAsIHRoZW46XG4gIGlmICghcmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnYWNjZXB0JykpIHtcbiAgICAvLyAxLiBMZXQgdmFsdWUgYmUgYCovKmAuXG4gICAgY29uc3QgdmFsdWUgPSAnKi8qJ1xuXG4gICAgLy8gMi4gQSB1c2VyIGFnZW50IHNob3VsZCBzZXQgdmFsdWUgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIHN0YXRlbWVudCwgaWZcbiAgICAvLyBhbnksIHN3aXRjaGluZyBvbiByZXF1ZXN04oCZcyBkZXN0aW5hdGlvbjpcbiAgICAvLyBcImRvY3VtZW50XCJcbiAgICAvLyBcImZyYW1lXCJcbiAgICAvLyBcImlmcmFtZVwiXG4gICAgLy8gYHRleHQvaHRtbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsYXBwbGljYXRpb24veG1sO3E9MC45LCovKjtxPTAuOGBcbiAgICAvLyBcImltYWdlXCJcbiAgICAvLyBgaW1hZ2UvcG5nLGltYWdlL3N2Zyt4bWwsaW1hZ2UvKjtxPTAuOCwqLyo7cT0wLjVgXG4gICAgLy8gXCJzdHlsZVwiXG4gICAgLy8gYHRleHQvY3NzLCovKjtxPTAuMWBcbiAgICAvLyBUT0RPXG5cbiAgICAvLyAzLiBBcHBlbmQgYEFjY2VwdGAvdmFsdWUgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdCcsIHZhbHVlKVxuICB9XG5cbiAgLy8gMTMuIElmIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEFjY2VwdC1MYW5ndWFnZWAsIHRoZW5cbiAgLy8gdXNlciBhZ2VudHMgc2hvdWxkIGFwcGVuZCBgQWNjZXB0LUxhbmd1YWdlYC9hbiBhcHByb3ByaWF0ZSB2YWx1ZSB0b1xuICAvLyByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgaWYgKCFyZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdhY2NlcHQtbGFuZ3VhZ2UnKSkge1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdhY2NlcHQtbGFuZ3VhZ2UnLCAnKicpXG4gIH1cblxuICAvLyAxNC4gSWYgcmVxdWVzdOKAmXMgcHJpb3JpdHkgaXMgbnVsbCwgdGhlbiB1c2UgcmVxdWVzdOKAmXMgaW5pdGlhdG9yIGFuZFxuICAvLyBkZXN0aW5hdGlvbiBhcHByb3ByaWF0ZWx5IGluIHNldHRpbmcgcmVxdWVzdOKAmXMgcHJpb3JpdHkgdG8gYVxuICAvLyB1c2VyLWFnZW50LWRlZmluZWQgb2JqZWN0LlxuICBpZiAocmVxdWVzdC5wcmlvcml0eSA9PT0gbnVsbCkge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDE1LiBJZiByZXF1ZXN0IGlzIGEgc3VicmVzb3VyY2UgcmVxdWVzdCwgdGhlbjpcbiAgaWYgKHN1YnJlc291cmNlU2V0LmhhcyhyZXF1ZXN0LmRlc3RpbmF0aW9uKSkge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDE2LiBSdW4gbWFpbiBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgbWFpbkZldGNoKGZldGNoUGFyYW1zKVxuICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoZXJyKVxuICAgIH0pXG5cbiAgLy8gMTcuIFJldHVybiBmZXRjaFBhcmFtJ3MgY29udHJvbGxlclxuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlclxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1tYWluLWZldGNoXG5hc3luYyBmdW5jdGlvbiBtYWluRmV0Y2ggKGZldGNoUGFyYW1zLCByZWN1cnNpdmUgPSBmYWxzZSkge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDMuIElmIHJlcXVlc3TigJlzIGxvY2FsLVVSTHMtb25seSBmbGFnIGlzIHNldCBhbmQgcmVxdWVzdOKAmXMgY3VycmVudCBVUkwgaXNcbiAgLy8gbm90IGxvY2FsLCB0aGVuIHNldCByZXNwb25zZSB0byBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChyZXF1ZXN0LmxvY2FsVVJMc09ubHkgJiYgIXVybElzTG9jYWwocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgcmVzcG9uc2UgPSBtYWtlTmV0d29ya0Vycm9yKCdsb2NhbCBVUkxzIG9ubHknKVxuICB9XG5cbiAgLy8gNC4gUnVuIHJlcG9ydCBDb250ZW50IFNlY3VyaXR5IFBvbGljeSB2aW9sYXRpb25zIGZvciByZXF1ZXN0LlxuICAvLyBUT0RPXG5cbiAgLy8gNS4gVXBncmFkZSByZXF1ZXN0IHRvIGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgVVJMLCBpZiBhcHByb3ByaWF0ZS5cbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMKHJlcXVlc3QpXG5cbiAgLy8gNi4gSWYgc2hvdWxkIHJlcXVlc3QgYmUgYmxvY2tlZCBkdWUgdG8gYSBiYWQgcG9ydCwgc2hvdWxkIGZldGNoaW5nIHJlcXVlc3RcbiAgLy8gYmUgYmxvY2tlZCBhcyBtaXhlZCBjb250ZW50LCBvciBzaG91bGQgcmVxdWVzdCBiZSBibG9ja2VkIGJ5IENvbnRlbnRcbiAgLy8gU2VjdXJpdHkgUG9saWN5IHJldHVybnMgYmxvY2tlZCwgdGhlbiBzZXQgcmVzcG9uc2UgdG8gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAocmVxdWVzdEJhZFBvcnQocmVxdWVzdCkgPT09ICdibG9ja2VkJykge1xuICAgIHJlc3BvbnNlID0gbWFrZU5ldHdvcmtFcnJvcignYmFkIHBvcnQnKVxuICB9XG4gIC8vIFRPRE86IHNob3VsZCBmZXRjaGluZyByZXF1ZXN0IGJlIGJsb2NrZWQgYXMgbWl4ZWQgY29udGVudD9cbiAgLy8gVE9ETzogc2hvdWxkIHJlcXVlc3QgYmUgYmxvY2tlZCBieSBDb250ZW50IFNlY3VyaXR5IFBvbGljeT9cblxuICAvLyA3LiBJZiByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgaXMgdGhlIGVtcHR5IHN0cmluZywgdGhlbiBzZXQgcmVxdWVzdOKAmXNcbiAgLy8gcmVmZXJyZXIgcG9saWN5IHRvIHJlcXVlc3TigJlzIHBvbGljeSBjb250YWluZXLigJlzIHJlZmVycmVyIHBvbGljeS5cbiAgaWYgKHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPT09ICcnKSB7XG4gICAgcmVxdWVzdC5yZWZlcnJlclBvbGljeSA9IHJlcXVlc3QucG9saWN5Q29udGFpbmVyLnJlZmVycmVyUG9saWN5XG4gIH1cblxuICAvLyA4LiBJZiByZXF1ZXN04oCZcyByZWZlcnJlciBpcyBub3QgXCJuby1yZWZlcnJlclwiLCB0aGVuIHNldCByZXF1ZXN04oCZc1xuICAvLyByZWZlcnJlciB0byB0aGUgcmVzdWx0IG9mIGludm9raW5nIGRldGVybWluZSByZXF1ZXN04oCZcyByZWZlcnJlci5cbiAgaWYgKHJlcXVlc3QucmVmZXJyZXIgIT09ICduby1yZWZlcnJlcicpIHtcbiAgICByZXF1ZXN0LnJlZmVycmVyID0gZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcihyZXF1ZXN0KVxuICB9XG5cbiAgLy8gOS4gU2V0IHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgdG8gXCJodHRwc1wiIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nXG4gIC8vIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gIC8vIC0gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBpcyBcImh0dHBcIlxuICAvLyAtIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBob3N0IGlzIGEgZG9tYWluXG4gIC8vIC0gTWF0Y2hpbmcgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIGhvc3QgcGVyIEtub3duIEhTVFMgSG9zdCBEb21haW4gTmFtZVxuICAvLyAgIE1hdGNoaW5nIHJlc3VsdHMgaW4gZWl0aGVyIGEgc3VwZXJkb21haW4gbWF0Y2ggd2l0aCBhbiBhc3NlcnRlZFxuICAvLyAgIGluY2x1ZGVTdWJEb21haW5zIGRpcmVjdGl2ZSBvciBhIGNvbmdydWVudCBtYXRjaCAod2l0aCBvciB3aXRob3V0IGFuXG4gIC8vICAgYXNzZXJ0ZWQgaW5jbHVkZVN1YkRvbWFpbnMgZGlyZWN0aXZlKS4gW0hTVFNdXG4gIC8vIFRPRE9cblxuICAvLyAxMC4gSWYgcmVjdXJzaXZlIGlzIGZhbHNlLCB0aGVuIHJ1biB0aGUgcmVtYWluaW5nIHN0ZXBzIGluIHBhcmFsbGVsLlxuICAvLyBUT0RPXG5cbiAgLy8gMTEuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW4gc2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZ1xuICAvLyB0aGUgc3RlcHMgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgc3RhdGVtZW50OlxuICBpZiAocmVzcG9uc2UgPT09IG51bGwpIHtcbiAgICByZXNwb25zZSA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VVJMID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcblxuICAgICAgaWYgKFxuICAgICAgICAvLyAtIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBvcmlnaW4gaXMgc2FtZSBvcmlnaW4gd2l0aCByZXF1ZXN04oCZcyBvcmlnaW4sXG4gICAgICAgIC8vICAgYW5kIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIGlzIFwiYmFzaWNcIlxuICAgICAgICAoc2FtZU9yaWdpbihjdXJyZW50VVJMLCByZXF1ZXN0LnVybCkgJiYgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKSB8fFxuICAgICAgICAvLyByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgc2NoZW1lIGlzIFwiZGF0YVwiXG4gICAgICAgIChjdXJyZW50VVJMLnByb3RvY29sID09PSAnZGF0YTonKSB8fFxuICAgICAgICAvLyAtIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJuYXZpZ2F0ZVwiIG9yIFwid2Vic29ja2V0XCJcbiAgICAgICAgKHJlcXVlc3QubW9kZSA9PT0gJ25hdmlnYXRlJyB8fCByZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnKVxuICAgICAgKSB7XG4gICAgICAgIC8vIDEuIFNldCByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyB0byBcImJhc2ljXCIuXG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9ICdiYXNpYydcblxuICAgICAgICAvLyAyLiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nIHNjaGVtZSBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHNjaGVtZUZldGNoKGZldGNoUGFyYW1zKVxuICAgICAgfVxuXG4gICAgICAvLyByZXF1ZXN04oCZcyBtb2RlIGlzIFwic2FtZS1vcmlnaW5cIlxuICAgICAgaWYgKHJlcXVlc3QubW9kZSA9PT0gJ3NhbWUtb3JpZ2luJykge1xuICAgICAgICAvLyAxLiBSZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigncmVxdWVzdCBtb2RlIGNhbm5vdCBiZSBcInNhbWUtb3JpZ2luXCInKVxuICAgICAgfVxuXG4gICAgICAvLyByZXF1ZXN04oCZcyBtb2RlIGlzIFwibm8tY29yc1wiXG4gICAgICBpZiAocmVxdWVzdC5tb2RlID09PSAnbm8tY29ycycpIHtcbiAgICAgICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSBpcyBub3QgXCJmb2xsb3dcIiwgdGhlbiByZXR1cm4gYSBuZXR3b3JrXG4gICAgICAgIC8vIGVycm9yLlxuICAgICAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCAhPT0gJ2ZvbGxvdycpIHtcbiAgICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcihcbiAgICAgICAgICAgICdyZWRpcmVjdCBtb2RlIGNhbm5vdCBiZSBcImZvbGxvd1wiIGZvciBcIm5vLWNvcnNcIiByZXF1ZXN0J1xuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIFNldCByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyB0byBcIm9wYXF1ZVwiLlxuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPSAnb3BhcXVlJ1xuXG4gICAgICAgIC8vIDMuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgc2NoZW1lIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgICAgICByZXR1cm4gYXdhaXQgc2NoZW1lRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgICB9XG5cbiAgICAgIC8vIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgaXMgbm90IGFuIEhUVFAoUykgc2NoZW1lXG4gICAgICBpZiAoIXVybElzSHR0cEh0dHBzU2NoZW1lKHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpKSkge1xuICAgICAgICAvLyBSZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignVVJMIHNjaGVtZSBtdXN0IGJlIGEgSFRUUChTKSBzY2hlbWUnKVxuICAgICAgfVxuXG4gICAgICAvLyAtIHJlcXVlc3TigJlzIHVzZS1DT1JTLXByZWZsaWdodCBmbGFnIGlzIHNldFxuICAgICAgLy8gLSByZXF1ZXN04oCZcyB1bnNhZmUtcmVxdWVzdCBmbGFnIGlzIHNldCBhbmQgZWl0aGVyIHJlcXVlc3TigJlzIG1ldGhvZCBpc1xuICAgICAgLy8gICBub3QgYSBDT1JTLXNhZmVsaXN0ZWQgbWV0aG9kIG9yIENPUlMtdW5zYWZlIHJlcXVlc3QtaGVhZGVyIG5hbWVzIHdpdGhcbiAgICAgIC8vICAgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgaXMgbm90IGVtcHR5XG4gICAgICAvLyAgICAxLiBTZXQgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgdG8gXCJjb3JzXCIuXG4gICAgICAvLyAgICAyLiBMZXQgY29yc1dpdGhQcmVmbGlnaHRSZXNwb25zZSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaFxuICAgICAgLy8gICAgZ2l2ZW4gZmV0Y2hQYXJhbXMgYW5kIHRydWUuXG4gICAgICAvLyAgICAzLiBJZiBjb3JzV2l0aFByZWZsaWdodFJlc3BvbnNlIGlzIGEgbmV0d29yayBlcnJvciwgdGhlbiBjbGVhciBjYWNoZVxuICAgICAgLy8gICAgZW50cmllcyB1c2luZyByZXF1ZXN0LlxuICAgICAgLy8gICAgNC4gUmV0dXJuIGNvcnNXaXRoUHJlZmxpZ2h0UmVzcG9uc2UuXG4gICAgICAvLyBUT0RPXG5cbiAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgLy8gICAgMS4gU2V0IHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIHRvIFwiY29yc1wiLlxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID0gJ2NvcnMnXG5cbiAgICAgIC8vICAgIDIuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgICAgIHJldHVybiBhd2FpdCBodHRwRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgfSkoKVxuICB9XG5cbiAgLy8gMTIuIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGVuIHJldHVybiByZXNwb25zZS5cbiAgaWYgKHJlY3Vyc2l2ZSkge1xuICAgIHJldHVybiByZXNwb25zZVxuICB9XG5cbiAgLy8gMTMuIElmIHJlc3BvbnNlIGlzIG5vdCBhIG5ldHdvcmsgZXJyb3IgYW5kIHJlc3BvbnNlIGlzIG5vdCBhIGZpbHRlcmVkXG4gIC8vIHJlc3BvbnNlLCB0aGVuOlxuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAwICYmICFyZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlKSB7XG4gICAgLy8gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJjb3JzXCIsIHRoZW46XG4gICAgaWYgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ2NvcnMnKSB7XG4gICAgICAvLyAxLiBMZXQgaGVhZGVyTmFtZXMgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGhlYWRlciBsaXN0IHZhbHVlc1xuICAgICAgLy8gZ2l2ZW4gYEFjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzYCBhbmQgcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICAgICAgLy8gVE9ET1xuICAgICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZSBpcyBub3QgXCJpbmNsdWRlXCIgYW5kIGhlYWRlck5hbWVzXG4gICAgICAvLyBjb250YWlucyBgKmAsIHRoZW4gc2V0IHJlc3BvbnNl4oCZcyBDT1JTLWV4cG9zZWQgaGVhZGVyLW5hbWUgbGlzdCB0b1xuICAgICAgLy8gYWxsIHVuaXF1ZSBoZWFkZXIgbmFtZXMgaW4gcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICAgICAgLy8gVE9ET1xuICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJOYW1lcyBpcyBub3QgbnVsbCBvciBmYWlsdXJlLCB0aGVuIHNldFxuICAgICAgLy8gcmVzcG9uc2XigJlzIENPUlMtZXhwb3NlZCBoZWFkZXItbmFtZSBsaXN0IHRvIGhlYWRlck5hbWVzLlxuICAgICAgLy8gVE9ET1xuICAgIH1cblxuICAgIC8vIFNldCByZXNwb25zZSB0byB0aGUgZm9sbG93aW5nIGZpbHRlcmVkIHJlc3BvbnNlIHdpdGggcmVzcG9uc2UgYXMgaXRzXG4gICAgLy8gaW50ZXJuYWwgcmVzcG9uc2UsIGRlcGVuZGluZyBvbiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZzpcbiAgICBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKSB7XG4gICAgICByZXNwb25zZSA9IGZpbHRlclJlc3BvbnNlKHJlc3BvbnNlLCAnYmFzaWMnKVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycpIHtcbiAgICAgIHJlc3BvbnNlID0gZmlsdGVyUmVzcG9uc2UocmVzcG9uc2UsICdjb3JzJylcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ29wYXF1ZScpIHtcbiAgICAgIHJlc3BvbnNlID0gZmlsdGVyUmVzcG9uc2UocmVzcG9uc2UsICdvcGFxdWUnKVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgLy8gMTQuIExldCBpbnRlcm5hbFJlc3BvbnNlIGJlIHJlc3BvbnNlLCBpZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3IsXG4gIC8vIGFuZCByZXNwb25zZeKAmXMgaW50ZXJuYWwgcmVzcG9uc2Ugb3RoZXJ3aXNlLlxuICBsZXQgaW50ZXJuYWxSZXNwb25zZSA9XG4gICAgcmVzcG9uc2Uuc3RhdHVzID09PSAwID8gcmVzcG9uc2UgOiByZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlXG5cbiAgLy8gMTUuIElmIGludGVybmFsUmVzcG9uc2XigJlzIFVSTCBsaXN0IGlzIGVtcHR5LCB0aGVuIHNldCBpdCB0byBhIGNsb25lIG9mXG4gIC8vIHJlcXVlc3TigJlzIFVSTCBsaXN0LlxuICBpZiAoaW50ZXJuYWxSZXNwb25zZS51cmxMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGludGVybmFsUmVzcG9uc2UudXJsTGlzdC5wdXNoKC4uLnJlcXVlc3QudXJsTGlzdClcbiAgfVxuXG4gIC8vIDE2LiBJZiByZXF1ZXN04oCZcyB0aW1pbmcgYWxsb3cgZmFpbGVkIGZsYWcgaXMgdW5zZXQsIHRoZW4gc2V0XG4gIC8vIGludGVybmFsUmVzcG9uc2XigJlzIHRpbWluZyBhbGxvdyBwYXNzZWQgZmxhZy5cbiAgaWYgKCFyZXF1ZXN0LnRpbWluZ0FsbG93RmFpbGVkKSB7XG4gICAgcmVzcG9uc2UudGltaW5nQWxsb3dQYXNzZWQgPSB0cnVlXG4gIH1cblxuICAvLyAxNy4gSWYgcmVzcG9uc2UgaXMgbm90IGEgbmV0d29yayBlcnJvciBhbmQgYW55IG9mIHRoZSBmb2xsb3dpbmcgcmV0dXJuc1xuICAvLyBibG9ja2VkXG4gIC8vIC0gc2hvdWxkIGludGVybmFsUmVzcG9uc2UgdG8gcmVxdWVzdCBiZSBibG9ja2VkIGFzIG1peGVkIGNvbnRlbnRcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgYnkgQ29udGVudCBTZWN1cml0eSBQb2xpY3lcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgZHVlIHRvIGl0cyBNSU1FIHR5cGVcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgZHVlIHRvIG5vc25pZmZcbiAgLy8gVE9ET1xuXG4gIC8vIDE4LiBJZiByZXNwb25zZeKAmXMgdHlwZSBpcyBcIm9wYXF1ZVwiLCBpbnRlcm5hbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMjA2LFxuICAvLyBpbnRlcm5hbFJlc3BvbnNl4oCZcyByYW5nZS1yZXF1ZXN0ZWQgZmxhZyBpcyBzZXQsIGFuZCByZXF1ZXN04oCZcyBoZWFkZXJcbiAgLy8gbGlzdCBkb2VzIG5vdCBjb250YWluIGBSYW5nZWAsIHRoZW4gc2V0IHJlc3BvbnNlIGFuZCBpbnRlcm5hbFJlc3BvbnNlXG4gIC8vIHRvIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIHJlc3BvbnNlLnR5cGUgPT09ICdvcGFxdWUnICYmXG4gICAgaW50ZXJuYWxSZXNwb25zZS5zdGF0dXMgPT09IDIwNiAmJlxuICAgIGludGVybmFsUmVzcG9uc2UucmFuZ2VSZXF1ZXN0ZWQgJiZcbiAgICAhcmVxdWVzdC5oZWFkZXJzLmNvbnRhaW5zKCdyYW5nZScpXG4gICkge1xuICAgIHJlc3BvbnNlID0gaW50ZXJuYWxSZXNwb25zZSA9IG1ha2VOZXR3b3JrRXJyb3IoKVxuICB9XG5cbiAgLy8gMTkuIElmIHJlc3BvbnNlIGlzIG5vdCBhIG5ldHdvcmsgZXJyb3IgYW5kIGVpdGhlciByZXF1ZXN04oCZcyBtZXRob2QgaXNcbiAgLy8gYEhFQURgIG9yIGBDT05ORUNUYCwgb3IgaW50ZXJuYWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIGEgbnVsbCBib2R5IHN0YXR1cyxcbiAgLy8gc2V0IGludGVybmFsUmVzcG9uc2XigJlzIGJvZHkgdG8gbnVsbCBhbmQgZGlzcmVnYXJkIGFueSBlbnF1ZXVpbmcgdG93YXJkXG4gIC8vIGl0IChpZiBhbnkpLlxuICBpZiAoXG4gICAgcmVzcG9uc2Uuc3RhdHVzICE9PSAwICYmXG4gICAgKHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcgfHxcbiAgICAgIHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcgfHxcbiAgICAgIG51bGxCb2R5U3RhdHVzLmluY2x1ZGVzKGludGVybmFsUmVzcG9uc2Uuc3RhdHVzKSlcbiAgKSB7XG4gICAgaW50ZXJuYWxSZXNwb25zZS5ib2R5ID0gbnVsbFxuICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZHVtcCA9IHRydWVcbiAgfVxuXG4gIC8vIDIwLiBJZiByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIHRoZW46XG4gIGlmIChyZXF1ZXN0LmludGVncml0eSkge1xuICAgIC8vIDEuIExldCBwcm9jZXNzQm9keUVycm9yIGJlIHRoaXMgc3RlcDogcnVuIGZldGNoIGZpbmFsZSBnaXZlbiBmZXRjaFBhcmFtc1xuICAgIC8vIGFuZCBhIG5ldHdvcmsgZXJyb3IuXG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChyZWFzb24pID0+XG4gICAgICBmZXRjaEZpbmFsZShmZXRjaFBhcmFtcywgbWFrZU5ldHdvcmtFcnJvcihyZWFzb24pKVxuXG4gICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJvcGFxdWVcIiwgb3IgcmVzcG9uc2XigJlzIGJvZHkgaXMgbnVsbCxcbiAgICAvLyB0aGVuIHJ1biBwcm9jZXNzQm9keUVycm9yIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnb3BhcXVlJyB8fCByZXNwb25zZS5ib2R5ID09IG51bGwpIHtcbiAgICAgIHByb2Nlc3NCb2R5RXJyb3IocmVzcG9uc2UuZXJyb3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAzLiBMZXQgcHJvY2Vzc0JvZHkgZ2l2ZW4gYnl0ZXMgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0JvZHkgPSAoYnl0ZXMpID0+IHtcbiAgICAgIC8vIDEuIElmIGJ5dGVzIGRvIG5vdCBtYXRjaCByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEsXG4gICAgICAvLyB0aGVuIHJ1biBwcm9jZXNzQm9keUVycm9yIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4gW1NSSV1cbiAgICAgIGlmICghYnl0ZXNNYXRjaChieXRlcywgcmVxdWVzdC5pbnRlZ3JpdHkpKSB7XG4gICAgICAgIHByb2Nlc3NCb2R5RXJyb3IoJ2ludGVncml0eSBtaXNtYXRjaCcpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyAyLiBTZXQgcmVzcG9uc2XigJlzIGJvZHkgdG8gYnl0ZXMgYXMgYSBib2R5LlxuICAgICAgcmVzcG9uc2UuYm9keSA9IHNhZmVseUV4dHJhY3RCb2R5KGJ5dGVzKVswXVxuXG4gICAgICAvLyAzLiBSdW4gZmV0Y2ggZmluYWxlIGdpdmVuIGZldGNoUGFyYW1zIGFuZCByZXNwb25zZS5cbiAgICAgIGZldGNoRmluYWxlKGZldGNoUGFyYW1zLCByZXNwb25zZSlcbiAgICB9XG5cbiAgICAvLyA0LiBGdWxseSByZWFkIHJlc3BvbnNl4oCZcyBib2R5IGdpdmVuIHByb2Nlc3NCb2R5IGFuZCBwcm9jZXNzQm9keUVycm9yLlxuICAgIGF3YWl0IGZ1bGx5UmVhZEJvZHkocmVzcG9uc2UuYm9keSwgcHJvY2Vzc0JvZHksIHByb2Nlc3NCb2R5RXJyb3IpXG4gIH0gZWxzZSB7XG4gICAgLy8gMjEuIE90aGVyd2lzZSwgcnVuIGZldGNoIGZpbmFsZSBnaXZlbiBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UuXG4gICAgZmV0Y2hGaW5hbGUoZmV0Y2hQYXJhbXMsIHJlc3BvbnNlKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXNjaGVtZS1mZXRjaFxuLy8gZ2l2ZW4gYSBmZXRjaCBwYXJhbXMgZmV0Y2hQYXJhbXNcbmZ1bmN0aW9uIHNjaGVtZUZldGNoIChmZXRjaFBhcmFtcykge1xuICAvLyBOb3RlOiBzaW5jZSB0aGUgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWQgb24gcmVkaXJlY3QsIHdoaWNoIHNldHMgZmV0Y2hQYXJhbXMgdG8gYVxuICAvLyBjYW5jZWxsZWQgc3RhdGUsIHdlIGRvIG5vdCB3YW50IHRoaXMgY29uZGl0aW9uIHRvIHRyaWdnZXIgKnVubGVzcyogdGhlcmUgaGF2ZSBiZWVuXG4gIC8vIG5vIHJlZGlyZWN0cy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xNzc2XG4gIC8vIDEuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmV0d29yayBlcnJvciBmb3IgZmV0Y2hQYXJhbXMuXG4gIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykgJiYgZmV0Y2hQYXJhbXMucmVxdWVzdC5yZWRpcmVjdENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpKVxuICB9XG5cbiAgLy8gMi4gTGV0IHJlcXVlc3QgYmUgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHsgcmVxdWVzdCB9ID0gZmV0Y2hQYXJhbXNcblxuICBjb25zdCB7IHByb3RvY29sOiBzY2hlbWUgfSA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG5cbiAgLy8gMy4gU3dpdGNoIG9uIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgYW5kIHJ1biB0aGUgYXNzb2NpYXRlZCBzdGVwczpcbiAgc3dpdGNoIChzY2hlbWUpIHtcbiAgICBjYXNlICdhYm91dDonOiB7XG4gICAgICAvLyBJZiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgcGF0aCBpcyB0aGUgc3RyaW5nIFwiYmxhbmtcIiwgdGhlbiByZXR1cm4gYSBuZXcgcmVzcG9uc2VcbiAgICAgIC8vIHdob3NlIHN0YXR1cyBtZXNzYWdlIGlzIGBPS2AsIGhlYWRlciBsaXN0IGlzIMKrIChgQ29udGVudC1UeXBlYCwgYHRleHQvaHRtbDtjaGFyc2V0PXV0Zi04YCkgwrssXG4gICAgICAvLyBhbmQgYm9keSBpcyB0aGUgZW1wdHkgYnl0ZSBzZXF1ZW5jZSBhcyBhIGJvZHkuXG5cbiAgICAgIC8vIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignYWJvdXQgc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQnKSlcbiAgICB9XG4gICAgY2FzZSAnYmxvYjonOiB7XG4gICAgICBpZiAoIXJlc29sdmVPYmplY3RVUkwpIHtcbiAgICAgICAgcmVzb2x2ZU9iamVjdFVSTCA9IHJlcXVpcmUoJ2J1ZmZlcicpLnJlc29sdmVPYmplY3RVUkxcbiAgICAgIH1cblxuICAgICAgLy8gMS4gTGV0IGJsb2JVUkxFbnRyeSBiZSByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgYmxvYiBVUkwgZW50cnkuXG4gICAgICBjb25zdCBibG9iVVJMRW50cnkgPSByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KVxuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2ViLXBsYXRmb3JtLXRlc3RzL3dwdC9ibG9iLzdiMGViYWNjYzYyYjU2NmExOTY1Mzk2ZTViZTdiYjJiYzA2Zjg0MWYvRmlsZUFQSS91cmwvcmVzb3VyY2VzL2ZldGNoLXRlc3RzLmpzI0w1Mi1MNTZcbiAgICAgIC8vIEJ1ZmZlci5yZXNvbHZlT2JqZWN0VVJMIGRvZXMgbm90IGlnbm9yZSBVUkwgcXVlcmllcy5cbiAgICAgIGlmIChibG9iVVJMRW50cnkuc2VhcmNoLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ05ldHdvcmtFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gZmV0Y2ggcmVzb3VyY2UuJykpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsb2JVUkxFbnRyeU9iamVjdCA9IHJlc29sdmVPYmplY3RVUkwoYmxvYlVSTEVudHJ5LnRvU3RyaW5nKCkpXG5cbiAgICAgIC8vIDIuIElmIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBub3QgYEdFVGAsIGJsb2JVUkxFbnRyeSBpcyBudWxsLCBvciBibG9iVVJMRW50cnnigJlzXG4gICAgICAvLyAgICBvYmplY3QgaXMgbm90IGEgQmxvYiBvYmplY3QsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gJ0dFVCcgfHwgIWlzQmxvYkxpa2UoYmxvYlVSTEVudHJ5T2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ2ludmFsaWQgbWV0aG9kJykpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIExldCBib2R5V2l0aFR5cGUgYmUgdGhlIHJlc3VsdCBvZiBzYWZlbHkgZXh0cmFjdGluZyBibG9iVVJMRW50cnnigJlzIG9iamVjdC5cbiAgICAgIGNvbnN0IGJvZHlXaXRoVHlwZSA9IHNhZmVseUV4dHJhY3RCb2R5KGJsb2JVUkxFbnRyeU9iamVjdClcblxuICAgICAgLy8gNC4gTGV0IGJvZHkgYmUgYm9keVdpdGhUeXBl4oCZcyBib2R5LlxuICAgICAgY29uc3QgYm9keSA9IGJvZHlXaXRoVHlwZVswXVxuXG4gICAgICAvLyA1LiBMZXQgbGVuZ3RoIGJlIGJvZHnigJlzIGxlbmd0aCwgc2VyaWFsaXplZCBhbmQgaXNvbW9ycGhpYyBlbmNvZGVkLlxuICAgICAgY29uc3QgbGVuZ3RoID0gaXNvbW9ycGhpY0VuY29kZShgJHtib2R5Lmxlbmd0aH1gKVxuXG4gICAgICAvLyA2LiBMZXQgdHlwZSBiZSBib2R5V2l0aFR5cGXigJlzIHR5cGUgaWYgaXQgaXMgbm9uLW51bGw7IG90aGVyd2lzZSB0aGUgZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgICAgIGNvbnN0IHR5cGUgPSBib2R5V2l0aFR5cGVbMV0gPz8gJydcblxuICAgICAgLy8gNy4gUmV0dXJuIGEgbmV3IHJlc3BvbnNlIHdob3NlIHN0YXR1cyBtZXNzYWdlIGlzIGBPS2AsIGhlYWRlciBsaXN0IGlzXG4gICAgICAvLyAgICDCqyAoYENvbnRlbnQtTGVuZ3RoYCwgbGVuZ3RoKSwgKGBDb250ZW50LVR5cGVgLCB0eXBlKSDCuywgYW5kIGJvZHkgaXMgYm9keS5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHtcbiAgICAgICAgc3RhdHVzVGV4dDogJ09LJyxcbiAgICAgICAgaGVhZGVyc0xpc3Q6IFtcbiAgICAgICAgICBbJ2NvbnRlbnQtbGVuZ3RoJywgeyBuYW1lOiAnQ29udGVudC1MZW5ndGgnLCB2YWx1ZTogbGVuZ3RoIH1dLFxuICAgICAgICAgIFsnY29udGVudC10eXBlJywgeyBuYW1lOiAnQ29udGVudC1UeXBlJywgdmFsdWU6IHR5cGUgfV1cbiAgICAgICAgXVxuICAgICAgfSlcblxuICAgICAgcmVzcG9uc2UuYm9keSA9IGJvZHlcblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSlcbiAgICB9XG4gICAgY2FzZSAnZGF0YTonOiB7XG4gICAgICAvLyAxLiBMZXQgZGF0YVVSTFN0cnVjdCBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlXG4gICAgICAvLyAgICBkYXRhOiBVUkwgcHJvY2Vzc29yIG9uIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMLlxuICAgICAgY29uc3QgY3VycmVudFVSTCA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG4gICAgICBjb25zdCBkYXRhVVJMU3RydWN0ID0gZGF0YVVSTFByb2Nlc3NvcihjdXJyZW50VVJMKVxuXG4gICAgICAvLyAyLiBJZiBkYXRhVVJMU3RydWN0IGlzIGZhaWx1cmUsIHRoZW4gcmV0dXJuIGFcbiAgICAgIC8vICAgIG5ldHdvcmsgZXJyb3IuXG4gICAgICBpZiAoZGF0YVVSTFN0cnVjdCA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignZmFpbGVkIHRvIGZldGNoIHRoZSBkYXRhIFVSTCcpKVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBMZXQgbWltZVR5cGUgYmUgZGF0YVVSTFN0cnVjdOKAmXMgTUlNRSB0eXBlLCBzZXJpYWxpemVkLlxuICAgICAgY29uc3QgbWltZVR5cGUgPSBzZXJpYWxpemVBTWltZVR5cGUoZGF0YVVSTFN0cnVjdC5taW1lVHlwZSlcblxuICAgICAgLy8gNC4gUmV0dXJuIGEgcmVzcG9uc2Ugd2hvc2Ugc3RhdHVzIG1lc3NhZ2UgaXMgYE9LYCxcbiAgICAgIC8vICAgIGhlYWRlciBsaXN0IGlzIMKrIChgQ29udGVudC1UeXBlYCwgbWltZVR5cGUpIMK7LFxuICAgICAgLy8gICAgYW5kIGJvZHkgaXMgZGF0YVVSTFN0cnVjdOKAmXMgYm9keSBhcyBhIGJvZHkuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VSZXNwb25zZSh7XG4gICAgICAgIHN0YXR1c1RleHQ6ICdPSycsXG4gICAgICAgIGhlYWRlcnNMaXN0OiBbXG4gICAgICAgICAgWydjb250ZW50LXR5cGUnLCB7IG5hbWU6ICdDb250ZW50LVR5cGUnLCB2YWx1ZTogbWltZVR5cGUgfV1cbiAgICAgICAgXSxcbiAgICAgICAgYm9keTogc2FmZWx5RXh0cmFjdEJvZHkoZGF0YVVSTFN0cnVjdC5ib2R5KVswXVxuICAgICAgfSkpXG4gICAgfVxuICAgIGNhc2UgJ2ZpbGU6Jzoge1xuICAgICAgLy8gRm9yIG5vdywgdW5mb3J0dW5hdGUgYXMgaXQgaXMsIGZpbGUgVVJMcyBhcmUgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci5cbiAgICAgIC8vIFdoZW4gaW4gZG91YnQsIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ25vdCBpbXBsZW1lbnRlZC4uLiB5ZXQuLi4nKSlcbiAgICB9XG4gICAgY2FzZSAnaHR0cDonOlxuICAgIGNhc2UgJ2h0dHBzOic6IHtcbiAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cblxuICAgICAgcmV0dXJuIGh0dHBGZXRjaChmZXRjaFBhcmFtcylcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IG1ha2VOZXR3b3JrRXJyb3IoZXJyKSlcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCd1bmtub3duIHNjaGVtZScpKVxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmluYWxpemUtcmVzcG9uc2VcbmZ1bmN0aW9uIGZpbmFsaXplUmVzcG9uc2UgKGZldGNoUGFyYW1zLCByZXNwb25zZSkge1xuICAvLyAxLiBTZXQgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3TigJlzIGRvbmUgZmxhZy5cbiAgZmV0Y2hQYXJhbXMucmVxdWVzdC5kb25lID0gdHJ1ZVxuXG4gIC8vIDIsIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGRvbmUgaXMgbm90IG51bGwsIHRoZW4gcXVldWUgYSBmZXRjaFxuICAvLyB0YXNrIHRvIHJ1biBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZSBkb25lIGdpdmVuIHJlc3BvbnNlLCB3aXRoXG4gIC8vIGZldGNoUGFyYW1z4oCZcyB0YXNrIGRlc3RpbmF0aW9uLlxuICBpZiAoZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlRG9uZSAhPSBudWxsKSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlRG9uZShyZXNwb25zZSkpXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2ZldGNoLWZpbmFsZVxuZnVuY3Rpb24gZmV0Y2hGaW5hbGUgKGZldGNoUGFyYW1zLCByZXNwb25zZSkge1xuICAvLyAxLiBJZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3IsIHRoZW46XG4gIGlmIChyZXNwb25zZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgLy8gMS4gU2V0IHJlc3BvbnNl4oCZcyBVUkwgbGlzdCB0byDCqyBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgVVJMIGxpc3RbMF0gwrsuXG4gICAgcmVzcG9uc2UudXJsTGlzdCA9IFtmZXRjaFBhcmFtcy5yZXF1ZXN0LnVybExpc3RbMF1dXG5cbiAgICAvLyAyLiBTZXQgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvIHRvIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gb3BhcXVlIHRpbWluZ1xuICAgIC8vIGluZm8gZm9yIGZldGNoUGFyYW1z4oCZcyB0aW1pbmcgaW5mby5cbiAgICByZXNwb25zZS50aW1pbmdJbmZvID0gY3JlYXRlT3BhcXVlVGltaW5nSW5mbyh7XG4gICAgICBzdGFydFRpbWU6IGZldGNoUGFyYW1zLnRpbWluZ0luZm8uc3RhcnRUaW1lXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIuIExldCBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkgYmUgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgY29uc3QgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5ID0gKCkgPT4ge1xuICAgIC8vIDEuIFNldCBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgZG9uZSBmbGFnLlxuICAgIGZldGNoUGFyYW1zLnJlcXVlc3QuZG9uZSA9IHRydWVcblxuICAgIC8vIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGVuZC1vZi1ib2R5IGlzIG5vdCBudWxsLFxuICAgIC8vIHRoZW4gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZVxuICAgIC8vIGVuZC1vZi1ib2R5IGdpdmVuIHJlc3BvbnNlIHdpdGggZmV0Y2hQYXJhbXPigJlzIHRhc2sgZGVzdGluYXRpb24uXG4gICAgaWYgKGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSAhPSBudWxsKSB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkocmVzcG9uc2UpKVxuICAgIH1cbiAgfVxuXG4gIC8vIDMuIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGlzIG5vbi1udWxsLCB0aGVuIHF1ZXVlIGEgZmV0Y2ggdGFza1xuICAvLyB0byBydW4gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVzcG9uc2UgZ2l2ZW4gcmVzcG9uc2UsIHdpdGggZmV0Y2hQYXJhbXPigJlzXG4gIC8vIHRhc2sgZGVzdGluYXRpb24uXG4gIGlmIChmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2UgIT0gbnVsbCkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSkpXG4gIH1cblxuICAvLyA0LiBJZiByZXNwb25zZeKAmXMgYm9keSBpcyBudWxsLCB0aGVuIHJ1biBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkuXG4gIGlmIChyZXNwb25zZS5ib2R5ID09IG51bGwpIHtcbiAgICBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkoKVxuICB9IGVsc2Uge1xuICAvLyA1LiBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBMZXQgdHJhbnNmb3JtU3RyZWFtIGJlIGEgbmV3IGEgVHJhbnNmb3JtU3RyZWFtLlxuXG4gICAgLy8gMi4gTGV0IGlkZW50aXR5VHJhbnNmb3JtQWxnb3JpdGhtIGJlIGFuIGFsZ29yaXRobSB3aGljaCwgZ2l2ZW4gY2h1bmssXG4gICAgLy8gZW5xdWV1ZXMgY2h1bmsgaW4gdHJhbnNmb3JtU3RyZWFtLlxuICAgIGNvbnN0IGlkZW50aXR5VHJhbnNmb3JtQWxnb3JpdGhtID0gKGNodW5rLCBjb250cm9sbGVyKSA9PiB7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUoY2h1bmspXG4gICAgfVxuXG4gICAgLy8gMy4gU2V0IHVwIHRyYW5zZm9ybVN0cmVhbSB3aXRoIHRyYW5zZm9ybUFsZ29yaXRobSBzZXQgdG8gaWRlbnRpdHlUcmFuc2Zvcm1BbGdvcml0aG1cbiAgICAvLyBhbmQgZmx1c2hBbGdvcml0aG0gc2V0IHRvIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keS5cbiAgICBjb25zdCB0cmFuc2Zvcm1TdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgIHN0YXJ0ICgpIHt9LFxuICAgICAgdHJhbnNmb3JtOiBpZGVudGl0eVRyYW5zZm9ybUFsZ29yaXRobSxcbiAgICAgIGZsdXNoOiBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHlcbiAgICB9LCB7XG4gICAgICBzaXplICgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBzaXplICgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gNC4gU2V0IHJlc3BvbnNl4oCZcyBib2R5IHRvIHRoZSByZXN1bHQgb2YgcGlwaW5nIHJlc3BvbnNl4oCZcyBib2R5IHRocm91Z2ggdHJhbnNmb3JtU3RyZWFtLlxuICAgIHJlc3BvbnNlLmJvZHkgPSB7IHN0cmVhbTogcmVzcG9uc2UuYm9keS5zdHJlYW0ucGlwZVRocm91Z2godHJhbnNmb3JtU3RyZWFtKSB9XG4gIH1cblxuICAvLyA2LiBJZiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZSBjb25zdW1lIGJvZHkgaXMgbm9uLW51bGwsIHRoZW46XG4gIGlmIChmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keSAhPSBudWxsKSB7XG4gICAgLy8gMS4gTGV0IHByb2Nlc3NCb2R5IGdpdmVuIG51bGxPckJ5dGVzIGJlIHRoaXMgc3RlcDogcnVuIGZldGNoUGFyYW1z4oCZc1xuICAgIC8vIHByb2Nlc3MgcmVzcG9uc2UgY29uc3VtZSBib2R5IGdpdmVuIHJlc3BvbnNlIGFuZCBudWxsT3JCeXRlcy5cbiAgICBjb25zdCBwcm9jZXNzQm9keSA9IChudWxsT3JCeXRlcykgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHkocmVzcG9uc2UsIG51bGxPckJ5dGVzKVxuXG4gICAgLy8gMi4gTGV0IHByb2Nlc3NCb2R5RXJyb3IgYmUgdGhpcyBzdGVwOiBydW4gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3NcbiAgICAvLyByZXNwb25zZSBjb25zdW1lIGJvZHkgZ2l2ZW4gcmVzcG9uc2UgYW5kIGZhaWx1cmUuXG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChmYWlsdXJlKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keShyZXNwb25zZSwgZmFpbHVyZSlcblxuICAgIC8vIDMuIElmIHJlc3BvbnNl4oCZcyBib2R5IGlzIG51bGwsIHRoZW4gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keVxuICAgIC8vIGdpdmVuIG51bGwsIHdpdGggZmV0Y2hQYXJhbXPigJlzIHRhc2sgZGVzdGluYXRpb24uXG4gICAgaWYgKHJlc3BvbnNlLmJvZHkgPT0gbnVsbCkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gcHJvY2Vzc0JvZHkobnVsbCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgZnVsbHkgcmVhZCByZXNwb25zZeKAmXMgYm9keSBnaXZlbiBwcm9jZXNzQm9keSwgcHJvY2Vzc0JvZHlFcnJvcixcbiAgICAgIC8vIGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgICAgIHJldHVybiBmdWxseVJlYWRCb2R5KHJlc3BvbnNlLmJvZHksIHByb2Nlc3NCb2R5LCBwcm9jZXNzQm9keUVycm9yKVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaHR0cC1mZXRjaFxuYXN5bmMgZnVuY3Rpb24gaHR0cEZldGNoIChmZXRjaFBhcmFtcykge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDMuIExldCBhY3R1YWxSZXNwb25zZSBiZSBudWxsLlxuICBsZXQgYWN0dWFsUmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gNC4gTGV0IHRpbWluZ0luZm8gYmUgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICBjb25zdCB0aW1pbmdJbmZvID0gZmV0Y2hQYXJhbXMudGltaW5nSW5mb1xuXG4gIC8vIDUuIElmIHJlcXVlc3TigJlzIHNlcnZpY2Utd29ya2VycyBtb2RlIGlzIFwiYWxsXCIsIHRoZW46XG4gIGlmIChyZXF1ZXN0LnNlcnZpY2VXb3JrZXJzID09PSAnYWxsJykge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDYuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW46XG4gIGlmIChyZXNwb25zZSA9PT0gbnVsbCkge1xuICAgIC8vIDEuIElmIG1ha2VDT1JTUHJlZmxpZ2h0IGlzIHRydWUgYW5kIG9uZSBvZiB0aGVzZSBjb25kaXRpb25zIGlzIHRydWU6XG4gICAgLy8gVE9ET1xuXG4gICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSBpcyBcImZvbGxvd1wiLCB0aGVuIHNldCByZXF1ZXN04oCZc1xuICAgIC8vIHNlcnZpY2Utd29ya2VycyBtb2RlIHRvIFwibm9uZVwiLlxuICAgIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnZm9sbG93Jykge1xuICAgICAgcmVxdWVzdC5zZXJ2aWNlV29ya2VycyA9ICdub25lJ1xuICAgIH1cblxuICAgIC8vIDMuIFNldCByZXNwb25zZSBhbmQgYWN0dWFsUmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgLy8gSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgIGFjdHVhbFJlc3BvbnNlID0gcmVzcG9uc2UgPSBhd2FpdCBodHRwTmV0d29ya09yQ2FjaGVGZXRjaChmZXRjaFBhcmFtcylcblxuICAgIC8vIDQuIElmIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIGlzIFwiY29yc1wiIGFuZCBhIENPUlMgY2hlY2tcbiAgICAvLyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmV0dXJucyBmYWlsdXJlLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgaWYgKFxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycgJiZcbiAgICAgIGNvcnNDaGVjayhyZXF1ZXN0LCByZXNwb25zZSkgPT09ICdmYWlsdXJlJ1xuICAgICkge1xuICAgICAgcmV0dXJuIG1ha2VOZXR3b3JrRXJyb3IoJ2NvcnMgZmFpbHVyZScpXG4gICAgfVxuXG4gICAgLy8gNS4gSWYgdGhlIFRBTyBjaGVjayBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmV0dXJucyBmYWlsdXJlLCB0aGVuIHNldFxuICAgIC8vIHJlcXVlc3TigJlzIHRpbWluZyBhbGxvdyBmYWlsZWQgZmxhZy5cbiAgICBpZiAoVEFPQ2hlY2socmVxdWVzdCwgcmVzcG9uc2UpID09PSAnZmFpbHVyZScpIHtcbiAgICAgIHJlcXVlc3QudGltaW5nQWxsb3dGYWlsZWQgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgLy8gNy4gSWYgZWl0aGVyIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIG9yIHJlc3BvbnNl4oCZcyB0eXBlXG4gIC8vIGlzIFwib3BhcXVlXCIsIGFuZCB0aGUgY3Jvc3Mtb3JpZ2luIHJlc291cmNlIHBvbGljeSBjaGVjayB3aXRoXG4gIC8vIHJlcXVlc3TigJlzIG9yaWdpbiwgcmVxdWVzdOKAmXMgY2xpZW50LCByZXF1ZXN04oCZcyBkZXN0aW5hdGlvbixcbiAgLy8gYW5kIGFjdHVhbFJlc3BvbnNlIHJldHVybnMgYmxvY2tlZCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAoXG4gICAgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ29wYXF1ZScgfHwgcmVzcG9uc2UudHlwZSA9PT0gJ29wYXF1ZScpICYmXG4gICAgY3Jvc3NPcmlnaW5SZXNvdXJjZVBvbGljeUNoZWNrKFxuICAgICAgcmVxdWVzdC5vcmlnaW4sXG4gICAgICByZXF1ZXN0LmNsaWVudCxcbiAgICAgIHJlcXVlc3QuZGVzdGluYXRpb24sXG4gICAgICBhY3R1YWxSZXNwb25zZVxuICAgICkgPT09ICdibG9ja2VkJ1xuICApIHtcbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignYmxvY2tlZCcpXG4gIH1cblxuICAvLyA4LiBJZiBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIGEgcmVkaXJlY3Qgc3RhdHVzLCB0aGVuOlxuICBpZiAocmVkaXJlY3RTdGF0dXNTZXQuaGFzKGFjdHVhbFJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAvLyAxLiBJZiBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIG5vdCAzMDMsIHJlcXVlc3TigJlzIGJvZHkgaXMgbm90IG51bGwsXG4gICAgLy8gYW5kIHRoZSBjb25uZWN0aW9uIHVzZXMgSFRUUC8yLCB0aGVuIHVzZXIgYWdlbnRzIG1heSwgYW5kIGFyZSBldmVuXG4gICAgLy8gZW5jb3VyYWdlZCB0bywgdHJhbnNtaXQgYW4gUlNUX1NUUkVBTSBmcmFtZS5cbiAgICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyODhcbiAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCAhPT0gJ21hbnVhbCcpIHtcbiAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbi5kZXN0cm95KClcbiAgICB9XG5cbiAgICAvLyAyLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZTpcbiAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCA9PT0gJ2Vycm9yJykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIGEgbmV0d29yayBlcnJvci5cbiAgICAgIHJlc3BvbnNlID0gbWFrZU5ldHdvcmtFcnJvcigndW5leHBlY3RlZCByZWRpcmVjdCcpXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnbWFudWFsJykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIGFuIG9wYXF1ZS1yZWRpcmVjdCBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSBpbnRlcm5hbFxuICAgICAgLy8gcmVzcG9uc2UgaXMgYWN0dWFsUmVzcG9uc2UuXG4gICAgICAvLyBOT1RFKHNwZWMpOiBPbiB0aGUgd2ViIHRoaXMgd291bGQgcmV0dXJuIGFuIGBvcGFxdWVyZWRpcmVjdGAgcmVzcG9uc2UsXG4gICAgICAvLyBidXQgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2VydmVyIHNpZGUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzExOTMuXG4gICAgICByZXNwb25zZSA9IGFjdHVhbFJlc3BvbnNlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnZm9sbG93Jykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQLXJlZGlyZWN0IGZldGNoIGdpdmVuXG4gICAgICAvLyBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UuXG4gICAgICByZXNwb25zZSA9IGF3YWl0IGh0dHBSZWRpcmVjdEZldGNoKGZldGNoUGFyYW1zLCByZXNwb25zZSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIC8vIDkuIFNldCByZXNwb25zZeKAmXMgdGltaW5nIGluZm8gdG8gdGltaW5nSW5mby5cbiAgcmVzcG9uc2UudGltaW5nSW5mbyA9IHRpbWluZ0luZm9cblxuICAvLyAxMC4gUmV0dXJuIHJlc3BvbnNlLlxuICByZXR1cm4gcmVzcG9uc2Vcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtcmVkaXJlY3QtZmV0Y2hcbmZ1bmN0aW9uIGh0dHBSZWRpcmVjdEZldGNoIChmZXRjaFBhcmFtcywgcmVzcG9uc2UpIHtcbiAgLy8gMS4gTGV0IHJlcXVlc3QgYmUgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHJlcXVlc3QgPSBmZXRjaFBhcmFtcy5yZXF1ZXN0XG5cbiAgLy8gMi4gTGV0IGFjdHVhbFJlc3BvbnNlIGJlIHJlc3BvbnNlLCBpZiByZXNwb25zZSBpcyBub3QgYSBmaWx0ZXJlZCByZXNwb25zZSxcbiAgLy8gYW5kIHJlc3BvbnNl4oCZcyBpbnRlcm5hbCByZXNwb25zZSBvdGhlcndpc2UuXG4gIGNvbnN0IGFjdHVhbFJlc3BvbnNlID0gcmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZVxuICAgID8gcmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZVxuICAgIDogcmVzcG9uc2VcblxuICAvLyAzLiBMZXQgbG9jYXRpb25VUkwgYmUgYWN0dWFsUmVzcG9uc2XigJlzIGxvY2F0aW9uIFVSTCBnaXZlbiByZXF1ZXN04oCZcyBjdXJyZW50XG4gIC8vIFVSTOKAmXMgZnJhZ21lbnQuXG4gIGxldCBsb2NhdGlvblVSTFxuXG4gIHRyeSB7XG4gICAgbG9jYXRpb25VUkwgPSByZXNwb25zZUxvY2F0aW9uVVJMKFxuICAgICAgYWN0dWFsUmVzcG9uc2UsXG4gICAgICByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KS5oYXNoXG4gICAgKVxuXG4gICAgLy8gNC4gSWYgbG9jYXRpb25VUkwgaXMgbnVsbCwgdGhlbiByZXR1cm4gcmVzcG9uc2UuXG4gICAgaWYgKGxvY2F0aW9uVVJMID09IG51bGwpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gNS4gSWYgbG9jYXRpb25VUkwgaXMgZmFpbHVyZSwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcihlcnIpKVxuICB9XG5cbiAgLy8gNi4gSWYgbG9jYXRpb25VUkzigJlzIHNjaGVtZSBpcyBub3QgYW4gSFRUUChTKSBzY2hlbWUsIHRoZW4gcmV0dXJuIGEgbmV0d29ya1xuICAvLyBlcnJvci5cbiAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShsb2NhdGlvblVSTCkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ1VSTCBzY2hlbWUgbXVzdCBiZSBhIEhUVFAoUykgc2NoZW1lJykpXG4gIH1cblxuICAvLyA3LiBJZiByZXF1ZXN04oCZcyByZWRpcmVjdCBjb3VudCBpcyAyMCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAocmVxdWVzdC5yZWRpcmVjdENvdW50ID09PSAyMCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcigncmVkaXJlY3QgY291bnQgZXhjZWVkZWQnKSlcbiAgfVxuXG4gIC8vIDguIEluY3JlYXNlIHJlcXVlc3TigJlzIHJlZGlyZWN0IGNvdW50IGJ5IDEuXG4gIHJlcXVlc3QucmVkaXJlY3RDb3VudCArPSAxXG5cbiAgLy8gOS4gSWYgcmVxdWVzdOKAmXMgbW9kZSBpcyBcImNvcnNcIiwgbG9jYXRpb25VUkwgaW5jbHVkZXMgY3JlZGVudGlhbHMsIGFuZFxuICAvLyByZXF1ZXN04oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggbG9jYXRpb25VUkzigJlzIG9yaWdpbiwgdGhlbiByZXR1cm5cbiAgLy8gIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIHJlcXVlc3QubW9kZSA9PT0gJ2NvcnMnICYmXG4gICAgKGxvY2F0aW9uVVJMLnVzZXJuYW1lIHx8IGxvY2F0aW9uVVJMLnBhc3N3b3JkKSAmJlxuICAgICFzYW1lT3JpZ2luKHJlcXVlc3QsIGxvY2F0aW9uVVJMKVxuICApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ2Nyb3NzIG9yaWdpbiBub3QgYWxsb3dlZCBmb3IgcmVxdWVzdCBtb2RlIFwiY29yc1wiJykpXG4gIH1cblxuICAvLyAxMC4gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJjb3JzXCIgYW5kIGxvY2F0aW9uVVJMIGluY2x1ZGVzXG4gIC8vIGNyZWRlbnRpYWxzLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChcbiAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJyAmJlxuICAgIChsb2NhdGlvblVSTC51c2VybmFtZSB8fCBsb2NhdGlvblVSTC5wYXNzd29yZClcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKFxuICAgICAgJ1VSTCBjYW5ub3QgY29udGFpbiBjcmVkZW50aWFscyBmb3IgcmVxdWVzdCBtb2RlIFwiY29yc1wiJ1xuICAgICkpXG4gIH1cblxuICAvLyAxMS4gSWYgYWN0dWFsUmVzcG9uc2XigJlzIHN0YXR1cyBpcyBub3QgMzAzLCByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLFxuICAvLyBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIGFjdHVhbFJlc3BvbnNlLnN0YXR1cyAhPT0gMzAzICYmXG4gICAgcmVxdWVzdC5ib2R5ICE9IG51bGwgJiZcbiAgICByZXF1ZXN0LmJvZHkuc291cmNlID09IG51bGxcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCkpXG4gIH1cblxuICAvLyAxMi4gSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZVxuICAvLyAtIGFjdHVhbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzAxIG9yIDMwMiBhbmQgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIGBQT1NUYFxuICAvLyAtIGFjdHVhbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzAzIGFuZCByZXF1ZXN04oCZcyBtZXRob2QgaXMgbm90IGBHRVRgIG9yIGBIRUFEYFxuICBpZiAoXG4gICAgKFszMDEsIDMwMl0uaW5jbHVkZXMoYWN0dWFsUmVzcG9uc2Uuc3RhdHVzKSAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnKSB8fFxuICAgIChhY3R1YWxSZXNwb25zZS5zdGF0dXMgPT09IDMwMyAmJlxuICAgICAgIUdFVF9PUl9IRUFELmluY2x1ZGVzKHJlcXVlc3QubWV0aG9kKSlcbiAgKSB7XG4gICAgLy8gdGhlbjpcbiAgICAvLyAxLiBTZXQgcmVxdWVzdOKAmXMgbWV0aG9kIHRvIGBHRVRgIGFuZCByZXF1ZXN04oCZcyBib2R5IHRvIG51bGwuXG4gICAgcmVxdWVzdC5tZXRob2QgPSAnR0VUJ1xuICAgIHJlcXVlc3QuYm9keSA9IG51bGxcblxuICAgIC8vIDIuIEZvciBlYWNoIGhlYWRlck5hbWUgb2YgcmVxdWVzdC1ib2R5LWhlYWRlciBuYW1lLCBkZWxldGUgaGVhZGVyTmFtZSBmcm9tXG4gICAgLy8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgZm9yIChjb25zdCBoZWFkZXJOYW1lIG9mIHJlcXVlc3RCb2R5SGVhZGVyKSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZShoZWFkZXJOYW1lKVxuICAgIH1cbiAgfVxuXG4gIC8vIDEzLiBJZiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgb3JpZ2luIGlzIG5vdCBzYW1lIG9yaWdpbiB3aXRoIGxvY2F0aW9uVVJM4oCZc1xuICAvLyAgICAgb3JpZ2luLCB0aGVuIGZvciBlYWNoIGhlYWRlck5hbWUgb2YgQ09SUyBub24td2lsZGNhcmQgcmVxdWVzdC1oZWFkZXIgbmFtZSxcbiAgLy8gICAgIGRlbGV0ZSBoZWFkZXJOYW1lIGZyb20gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmICghc2FtZU9yaWdpbihyZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KSwgbG9jYXRpb25VUkwpKSB7XG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvcnMtbm9uLXdpbGRjYXJkLXJlcXVlc3QtaGVhZGVyLW5hbWVcbiAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZSgnYXV0aG9yaXphdGlvbicpXG5cbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYXV0aGVudGljYXRpb24tZW50cmllc1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuZGVsZXRlKCdwcm94eS1hdXRob3JpemF0aW9uJywgdHJ1ZSlcblxuICAgIC8vIFwiQ29va2llXCIgYW5kIFwiSG9zdFwiIGFyZSBmb3JiaWRkZW4gcmVxdWVzdC1oZWFkZXJzLCB3aGljaCB1bmRpY2kgZG9lc24ndCBpbXBsZW1lbnQuXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoJ2Nvb2tpZScpXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoJ2hvc3QnKVxuICB9XG5cbiAgLy8gMTQuIElmIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGJvZHkgdG8gdGhlIGZpcnN0IHJldHVyblxuICAvLyB2YWx1ZSBvZiBzYWZlbHkgZXh0cmFjdGluZyByZXF1ZXN04oCZcyBib2R54oCZcyBzb3VyY2UuXG4gIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgIGFzc2VydChyZXF1ZXN0LmJvZHkuc291cmNlICE9IG51bGwpXG4gICAgcmVxdWVzdC5ib2R5ID0gc2FmZWx5RXh0cmFjdEJvZHkocmVxdWVzdC5ib2R5LnNvdXJjZSlbMF1cbiAgfVxuXG4gIC8vIDE1LiBMZXQgdGltaW5nSW5mbyBiZSBmZXRjaFBhcmFtc+KAmXMgdGltaW5nIGluZm8uXG4gIGNvbnN0IHRpbWluZ0luZm8gPSBmZXRjaFBhcmFtcy50aW1pbmdJbmZvXG5cbiAgLy8gMTYuIFNldCB0aW1pbmdJbmZv4oCZcyByZWRpcmVjdCBlbmQgdGltZSBhbmQgcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lIHRvIHRoZVxuICAvLyBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZSBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkXG4gIC8vIGNhcGFiaWxpdHkuXG4gIHRpbWluZ0luZm8ucmVkaXJlY3RFbmRUaW1lID0gdGltaW5nSW5mby5wb3N0UmVkaXJlY3RTdGFydFRpbWUgPVxuICAgIGNvYXJzZW5lZFNoYXJlZEN1cnJlbnRUaW1lKGZldGNoUGFyYW1zLmNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5KVxuXG4gIC8vIDE3LiBJZiB0aW1pbmdJbmZv4oCZcyByZWRpcmVjdCBzdGFydCB0aW1lIGlzIDAsIHRoZW4gc2V0IHRpbWluZ0luZm/igJlzXG4gIC8vICByZWRpcmVjdCBzdGFydCB0aW1lIHRvIHRpbWluZ0luZm/igJlzIHN0YXJ0IHRpbWUuXG4gIGlmICh0aW1pbmdJbmZvLnJlZGlyZWN0U3RhcnRUaW1lID09PSAwKSB7XG4gICAgdGltaW5nSW5mby5yZWRpcmVjdFN0YXJ0VGltZSA9IHRpbWluZ0luZm8uc3RhcnRUaW1lXG4gIH1cblxuICAvLyAxOC4gQXBwZW5kIGxvY2F0aW9uVVJMIHRvIHJlcXVlc3TigJlzIFVSTCBsaXN0LlxuICByZXF1ZXN0LnVybExpc3QucHVzaChsb2NhdGlvblVSTClcblxuICAvLyAxOS4gSW52b2tlIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgb24gcmVkaXJlY3Qgb24gcmVxdWVzdCBhbmRcbiAgLy8gYWN0dWFsUmVzcG9uc2UuXG4gIHNldFJlcXVlc3RSZWZlcnJlclBvbGljeU9uUmVkaXJlY3QocmVxdWVzdCwgYWN0dWFsUmVzcG9uc2UpXG5cbiAgLy8gMjAuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgbWFpbiBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcyBhbmQgdHJ1ZS5cbiAgcmV0dXJuIG1haW5GZXRjaChmZXRjaFBhcmFtcywgdHJ1ZSlcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtbmV0d29yay1vci1jYWNoZS1mZXRjaFxuYXN5bmMgZnVuY3Rpb24gaHR0cE5ldHdvcmtPckNhY2hlRmV0Y2ggKFxuICBmZXRjaFBhcmFtcyxcbiAgaXNBdXRoZW50aWNhdGlvbkZldGNoID0gZmFsc2UsXG4gIGlzTmV3Q29ubmVjdGlvbkZldGNoID0gZmFsc2Vcbikge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgaHR0cEZldGNoUGFyYW1zIGJlIG51bGwuXG4gIGxldCBodHRwRmV0Y2hQYXJhbXMgPSBudWxsXG5cbiAgLy8gMy4gTGV0IGh0dHBSZXF1ZXN0IGJlIG51bGwuXG4gIGxldCBodHRwUmVxdWVzdCA9IG51bGxcblxuICAvLyA0LiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDUuIExldCBzdG9yZWRSZXNwb25zZSBiZSBudWxsLlxuICAvLyBUT0RPOiBjYWNoZVxuXG4gIC8vIDYuIExldCBodHRwQ2FjaGUgYmUgbnVsbC5cbiAgY29uc3QgaHR0cENhY2hlID0gbnVsbFxuXG4gIC8vIDcuIExldCB0aGUgcmV2YWxpZGF0aW5nRmxhZyBiZSB1bnNldC5cbiAgY29uc3QgcmV2YWxpZGF0aW5nRmxhZyA9IGZhbHNlXG5cbiAgLy8gOC4gUnVuIHRoZXNlIHN0ZXBzLCBidXQgYWJvcnQgd2hlbiB0aGUgb25nb2luZyBmZXRjaCBpcyB0ZXJtaW5hdGVkOlxuXG4gIC8vICAgIDEuIElmIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBcIm5vLXdpbmRvd1wiIGFuZCByZXF1ZXN04oCZcyByZWRpcmVjdCBtb2RlIGlzXG4gIC8vICAgIFwiZXJyb3JcIiwgdGhlbiBzZXQgaHR0cEZldGNoUGFyYW1zIHRvIGZldGNoUGFyYW1zIGFuZCBodHRwUmVxdWVzdCB0b1xuICAvLyAgICByZXF1ZXN0LlxuICBpZiAocmVxdWVzdC53aW5kb3cgPT09ICduby13aW5kb3cnICYmIHJlcXVlc3QucmVkaXJlY3QgPT09ICdlcnJvcicpIHtcbiAgICBodHRwRmV0Y2hQYXJhbXMgPSBmZXRjaFBhcmFtc1xuICAgIGh0dHBSZXF1ZXN0ID0gcmVxdWVzdFxuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIFNldCBodHRwUmVxdWVzdCB0byBhIGNsb25lIG9mIHJlcXVlc3QuXG4gICAgaHR0cFJlcXVlc3QgPSBtYWtlUmVxdWVzdChyZXF1ZXN0KVxuXG4gICAgLy8gMi4gU2V0IGh0dHBGZXRjaFBhcmFtcyB0byBhIGNvcHkgb2YgZmV0Y2hQYXJhbXMuXG4gICAgaHR0cEZldGNoUGFyYW1zID0geyAuLi5mZXRjaFBhcmFtcyB9XG5cbiAgICAvLyAzLiBTZXQgaHR0cEZldGNoUGFyYW1z4oCZcyByZXF1ZXN0IHRvIGh0dHBSZXF1ZXN0LlxuICAgIGh0dHBGZXRjaFBhcmFtcy5yZXF1ZXN0ID0gaHR0cFJlcXVlc3RcbiAgfVxuXG4gIC8vICAgIDMuIExldCBpbmNsdWRlQ3JlZGVudGlhbHMgYmUgdHJ1ZSBpZiBvbmUgb2ZcbiAgY29uc3QgaW5jbHVkZUNyZWRlbnRpYWxzID1cbiAgICByZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScgfHxcbiAgICAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ3NhbWUtb3JpZ2luJyAmJlxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKVxuXG4gIC8vICAgIDQuIExldCBjb250ZW50TGVuZ3RoIGJlIGh0dHBSZXF1ZXN04oCZcyBib2R54oCZcyBsZW5ndGgsIGlmIGh0dHBSZXF1ZXN04oCZc1xuICAvLyAgICBib2R5IGlzIG5vbi1udWxsOyBvdGhlcndpc2UgbnVsbC5cbiAgY29uc3QgY29udGVudExlbmd0aCA9IGh0dHBSZXF1ZXN0LmJvZHkgPyBodHRwUmVxdWVzdC5ib2R5Lmxlbmd0aCA6IG51bGxcblxuICAvLyAgICA1LiBMZXQgY29udGVudExlbmd0aEhlYWRlclZhbHVlIGJlIG51bGwuXG4gIGxldCBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSBudWxsXG5cbiAgLy8gICAgNi4gSWYgaHR0cFJlcXVlc3TigJlzIGJvZHkgaXMgbnVsbCBhbmQgaHR0cFJlcXVlc3TigJlzIG1ldGhvZCBpcyBgUE9TVGAgb3JcbiAgLy8gICAgYFBVVGAsIHRoZW4gc2V0IGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSB0byBgMGAuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5ib2R5ID09IG51bGwgJiZcbiAgICBbJ1BPU1QnLCAnUFVUJ10uaW5jbHVkZXMoaHR0cFJlcXVlc3QubWV0aG9kKVxuICApIHtcbiAgICBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSAnMCdcbiAgfVxuXG4gIC8vICAgIDcuIElmIGNvbnRlbnRMZW5ndGggaXMgbm9uLW51bGwsIHRoZW4gc2V0IGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSB0b1xuICAvLyAgICBjb250ZW50TGVuZ3RoLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQuXG4gIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwpIHtcbiAgICBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSBpc29tb3JwaGljRW5jb2RlKGAke2NvbnRlbnRMZW5ndGh9YClcbiAgfVxuXG4gIC8vICAgIDguIElmIGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSBpcyBub24tbnVsbCwgdGhlbiBhcHBlbmRcbiAgLy8gICAgYENvbnRlbnQtTGVuZ3RoYC9jb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0LlxuICBpZiAoY29udGVudExlbmd0aEhlYWRlclZhbHVlICE9IG51bGwpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2NvbnRlbnQtbGVuZ3RoJywgY29udGVudExlbmd0aEhlYWRlclZhbHVlKVxuICB9XG5cbiAgLy8gICAgOS4gSWYgY29udGVudExlbmd0aEhlYWRlclZhbHVlIGlzIG5vbi1udWxsLCB0aGVuIGFwcGVuZCAoYENvbnRlbnQtTGVuZ3RoYCxcbiAgLy8gICAgY29udGVudExlbmd0aEhlYWRlclZhbHVlKSB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG5cbiAgLy8gICAgMTAuIElmIGNvbnRlbnRMZW5ndGggaXMgbm9uLW51bGwgYW5kIGh0dHBSZXF1ZXN04oCZcyBrZWVwYWxpdmUgaXMgdHJ1ZSxcbiAgLy8gICAgdGhlbjpcbiAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiBodHRwUmVxdWVzdC5rZWVwYWxpdmUpIHtcbiAgICAvLyBOT1RFOiBrZWVwYWxpdmUgaXMgYSBub29wIG91dHNpZGUgb2YgYnJvd3NlciBjb250ZXh0LlxuICB9XG5cbiAgLy8gICAgMTEuIElmIGh0dHBSZXF1ZXN04oCZcyByZWZlcnJlciBpcyBhIFVSTCwgdGhlbiBhcHBlbmRcbiAgLy8gICAgYFJlZmVyZXJgL2h0dHBSZXF1ZXN04oCZcyByZWZlcnJlciwgc2VyaWFsaXplZCBhbmQgaXNvbW9ycGhpYyBlbmNvZGVkLFxuICAvLyAgICAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoaHR0cFJlcXVlc3QucmVmZXJyZXIgaW5zdGFuY2VvZiBVUkwpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3JlZmVyZXInLCBpc29tb3JwaGljRW5jb2RlKGh0dHBSZXF1ZXN0LnJlZmVycmVyLmhyZWYpKVxuICB9XG5cbiAgLy8gICAgMTIuIEFwcGVuZCBhIHJlcXVlc3QgYE9yaWdpbmAgaGVhZGVyIGZvciBodHRwUmVxdWVzdC5cbiAgYXBwZW5kUmVxdWVzdE9yaWdpbkhlYWRlcihodHRwUmVxdWVzdClcblxuICAvLyAgICAxMy4gQXBwZW5kIHRoZSBGZXRjaCBtZXRhZGF0YSBoZWFkZXJzIGZvciBodHRwUmVxdWVzdC4gW0ZFVENILU1FVEFEQVRBXVxuICBhcHBlbmRGZXRjaE1ldGFkYXRhKGh0dHBSZXF1ZXN0KVxuXG4gIC8vICAgIDE0LiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgVXNlci1BZ2VudGAsIHRoZW5cbiAgLy8gICAgdXNlciBhZ2VudHMgc2hvdWxkIGFwcGVuZCBgVXNlci1BZ2VudGAvZGVmYXVsdCBgVXNlci1BZ2VudGAgdmFsdWUgdG9cbiAgLy8gICAgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoIWh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCd1c2VyLWFnZW50JykpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3VzZXItYWdlbnQnLCB0eXBlb2YgZXNidWlsZERldGVjdGlvbiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kaWNpJyA6ICdub2RlJylcbiAgfVxuXG4gIC8vICAgIDE1LiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcImRlZmF1bHRcIiBhbmQgaHR0cFJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0IGNvbnRhaW5zIGBJZi1Nb2RpZmllZC1TaW5jZWAsIGBJZi1Ob25lLU1hdGNoYCxcbiAgLy8gICAgYElmLVVubW9kaWZpZWQtU2luY2VgLCBgSWYtTWF0Y2hgLCBvciBgSWYtUmFuZ2VgLCB0aGVuIHNldFxuICAvLyAgICBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0byBcIm5vLXN0b3JlXCIuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5jYWNoZSA9PT0gJ2RlZmF1bHQnICYmXG4gICAgKGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdpZi1tb2RpZmllZC1zaW5jZScpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtbm9uZS1tYXRjaCcpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtdW5tb2RpZmllZC1zaW5jZScpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtbWF0Y2gnKSB8fFxuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2lmLXJhbmdlJykpXG4gICkge1xuICAgIGh0dHBSZXF1ZXN0LmNhY2hlID0gJ25vLXN0b3JlJ1xuICB9XG5cbiAgLy8gICAgMTYuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwibm8tY2FjaGVcIiwgaHR0cFJlcXVlc3TigJlzIHByZXZlbnRcbiAgLy8gICAgbm8tY2FjaGUgY2FjaGUtY29udHJvbCBoZWFkZXIgbW9kaWZpY2F0aW9uIGZsYWcgaXMgdW5zZXQsIGFuZFxuICAvLyAgICBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQ2FjaGUtQ29udHJvbGAsIHRoZW4gYXBwZW5kXG4gIC8vICAgIGBDYWNoZS1Db250cm9sYC9gbWF4LWFnZT0wYCB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5jYWNoZSA9PT0gJ25vLWNhY2hlJyAmJlxuICAgICFodHRwUmVxdWVzdC5wcmV2ZW50Tm9DYWNoZUNhY2hlQ29udHJvbEhlYWRlck1vZGlmaWNhdGlvbiAmJlxuICAgICFodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnY2FjaGUtY29udHJvbCcpXG4gICkge1xuICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnY2FjaGUtY29udHJvbCcsICdtYXgtYWdlPTAnKVxuICB9XG5cbiAgLy8gICAgMTcuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwibm8tc3RvcmVcIiBvciBcInJlbG9hZFwiLCB0aGVuOlxuICBpZiAoaHR0cFJlcXVlc3QuY2FjaGUgPT09ICduby1zdG9yZScgfHwgaHR0cFJlcXVlc3QuY2FjaGUgPT09ICdyZWxvYWQnKSB7XG4gICAgLy8gMS4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYFByYWdtYWAsIHRoZW4gYXBwZW5kXG4gICAgLy8gYFByYWdtYWAvYG5vLWNhY2hlYCB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgaWYgKCFodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygncHJhZ21hJykpIHtcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgncHJhZ21hJywgJ25vLWNhY2hlJylcbiAgICB9XG5cbiAgICAvLyAyLiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQ2FjaGUtQ29udHJvbGAsXG4gICAgLy8gdGhlbiBhcHBlbmQgYENhY2hlLUNvbnRyb2xgL2Buby1jYWNoZWAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAgIGlmICghaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2NhY2hlLWNvbnRyb2wnKSkge1xuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdjYWNoZS1jb250cm9sJywgJ25vLWNhY2hlJylcbiAgICB9XG4gIH1cblxuICAvLyAgICAxOC4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIGBSYW5nZWAsIHRoZW4gYXBwZW5kXG4gIC8vICAgIGBBY2NlcHQtRW5jb2RpbmdgL2BpZGVudGl0eWAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3JhbmdlJykpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdC1lbmNvZGluZycsICdpZGVudGl0eScpXG4gIH1cblxuICAvLyAgICAxOS4gTW9kaWZ5IGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBwZXIgSFRUUC4gRG8gbm90IGFwcGVuZCBhIGdpdmVuXG4gIC8vICAgIGhlYWRlciBpZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgY29udGFpbnMgdGhhdCBoZWFkZXLigJlzIG5hbWUuXG4gIC8vICAgIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyODUjaXNzdWVjb21tZW50LTg5NjU2MDEyOVxuICBpZiAoIWh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdhY2NlcHQtZW5jb2RpbmcnKSkge1xuICAgIGlmICh1cmxIYXNIdHRwc1NjaGVtZShyZXF1ZXN0Q3VycmVudFVSTChodHRwUmVxdWVzdCkpKSB7XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdC1lbmNvZGluZycsICdiciwgZ3ppcCwgZGVmbGF0ZScpXG4gICAgfSBlbHNlIHtcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnYWNjZXB0LWVuY29kaW5nJywgJ2d6aXAsIGRlZmxhdGUnKVxuICAgIH1cbiAgfVxuXG4gIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZSgnaG9zdCcpXG5cbiAgLy8gICAgMjAuIElmIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlLCB0aGVuOlxuICBpZiAoaW5jbHVkZUNyZWRlbnRpYWxzKSB7XG4gICAgLy8gMS4gSWYgdGhlIHVzZXIgYWdlbnQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gYmxvY2sgY29va2llcyBmb3IgaHR0cFJlcXVlc3RcbiAgICAvLyAoc2VlIHNlY3Rpb24gNyBvZiBbQ09PS0lFU10pLCB0aGVuOlxuICAgIC8vIFRPRE86IGNyZWRlbnRpYWxzXG4gICAgLy8gMi4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEF1dGhvcml6YXRpb25gLCB0aGVuOlxuICAgIC8vIFRPRE86IGNyZWRlbnRpYWxzXG4gIH1cblxuICAvLyAgICAyMS4gSWYgdGhlcmXigJlzIGEgcHJveHktYXV0aGVudGljYXRpb24gZW50cnksIHVzZSBpdCBhcyBhcHByb3ByaWF0ZS5cbiAgLy8gICAgVE9ETzogcHJveHktYXV0aGVudGljYXRpb25cblxuICAvLyAgICAyMi4gU2V0IGh0dHBDYWNoZSB0byB0aGUgcmVzdWx0IG9mIGRldGVybWluaW5nIHRoZSBIVFRQIGNhY2hlXG4gIC8vICAgIHBhcnRpdGlvbiwgZ2l2ZW4gaHR0cFJlcXVlc3QuXG4gIC8vICAgIFRPRE86IGNhY2hlXG5cbiAgLy8gICAgMjMuIElmIGh0dHBDYWNoZSBpcyBudWxsLCB0aGVuIHNldCBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0b1xuICAvLyAgICBcIm5vLXN0b3JlXCIuXG4gIGlmIChodHRwQ2FjaGUgPT0gbnVsbCkge1xuICAgIGh0dHBSZXF1ZXN0LmNhY2hlID0gJ25vLXN0b3JlJ1xuICB9XG5cbiAgLy8gICAgMjQuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIG5laXRoZXIgXCJuby1zdG9yZVwiIG5vciBcInJlbG9hZFwiLFxuICAvLyAgICB0aGVuOlxuICBpZiAoaHR0cFJlcXVlc3QubW9kZSAhPT0gJ25vLXN0b3JlJyAmJiBodHRwUmVxdWVzdC5tb2RlICE9PSAncmVsb2FkJykge1xuICAgIC8vIFRPRE86IGNhY2hlXG4gIH1cblxuICAvLyA5LiBJZiBhYm9ydGVkLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmV0d29yayBlcnJvciBmb3IgZmV0Y2hQYXJhbXMuXG4gIC8vIFRPRE9cblxuICAvLyAxMC4gSWYgcmVzcG9uc2UgaXMgbnVsbCwgdGhlbjpcbiAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAvLyAxLiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcIm9ubHktaWYtY2FjaGVkXCIsIHRoZW4gcmV0dXJuIGFcbiAgICAvLyBuZXR3b3JrIGVycm9yLlxuICAgIGlmIChodHRwUmVxdWVzdC5tb2RlID09PSAnb25seS1pZi1jYWNoZWQnKSB7XG4gICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignb25seSBpZiBjYWNoZWQnKVxuICAgIH1cblxuICAgIC8vIDIuIExldCBmb3J3YXJkUmVzcG9uc2UgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIEhUVFAtbmV0d29yayBmZXRjaFxuICAgIC8vIGdpdmVuIGh0dHBGZXRjaFBhcmFtcywgaW5jbHVkZUNyZWRlbnRpYWxzLCBhbmQgaXNOZXdDb25uZWN0aW9uRmV0Y2guXG4gICAgY29uc3QgZm9yd2FyZFJlc3BvbnNlID0gYXdhaXQgaHR0cE5ldHdvcmtGZXRjaChcbiAgICAgIGh0dHBGZXRjaFBhcmFtcyxcbiAgICAgIGluY2x1ZGVDcmVkZW50aWFscyxcbiAgICAgIGlzTmV3Q29ubmVjdGlvbkZldGNoXG4gICAgKVxuXG4gICAgLy8gMy4gSWYgaHR0cFJlcXVlc3TigJlzIG1ldGhvZCBpcyB1bnNhZmUgYW5kIGZvcndhcmRSZXNwb25zZeKAmXMgc3RhdHVzIGlzXG4gICAgLy8gaW4gdGhlIHJhbmdlIDIwMCB0byAzOTksIGluY2x1c2l2ZSwgaW52YWxpZGF0ZSBhcHByb3ByaWF0ZSBzdG9yZWRcbiAgICAvLyByZXNwb25zZXMgaW4gaHR0cENhY2hlLCBhcyBwZXIgdGhlIFwiSW52YWxpZGF0aW9uXCIgY2hhcHRlciBvZiBIVFRQXG4gICAgLy8gQ2FjaGluZywgYW5kIHNldCBzdG9yZWRSZXNwb25zZSB0byBudWxsLiBbSFRUUC1DQUNISU5HXVxuICAgIGlmIChcbiAgICAgICFzYWZlTWV0aG9kc1NldC5oYXMoaHR0cFJlcXVlc3QubWV0aG9kKSAmJlxuICAgICAgZm9yd2FyZFJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiZcbiAgICAgIGZvcndhcmRSZXNwb25zZS5zdGF0dXMgPD0gMzk5XG4gICAgKSB7XG4gICAgICAvLyBUT0RPOiBjYWNoZVxuICAgIH1cblxuICAgIC8vIDQuIElmIHRoZSByZXZhbGlkYXRpbmdGbGFnIGlzIHNldCBhbmQgZm9yd2FyZFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzA0LFxuICAgIC8vIHRoZW46XG4gICAgaWYgKHJldmFsaWRhdGluZ0ZsYWcgJiYgZm9yd2FyZFJlc3BvbnNlLnN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAvLyBUT0RPOiBjYWNoZVxuICAgIH1cblxuICAgIC8vIDUuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW46XG4gICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgIC8vIDEuIFNldCByZXNwb25zZSB0byBmb3J3YXJkUmVzcG9uc2UuXG4gICAgICByZXNwb25zZSA9IGZvcndhcmRSZXNwb25zZVxuXG4gICAgICAvLyAyLiBTdG9yZSBodHRwUmVxdWVzdCBhbmQgZm9yd2FyZFJlc3BvbnNlIGluIGh0dHBDYWNoZSwgYXMgcGVyIHRoZVxuICAgICAgLy8gXCJTdG9yaW5nIFJlc3BvbnNlcyBpbiBDYWNoZXNcIiBjaGFwdGVyIG9mIEhUVFAgQ2FjaGluZy4gW0hUVFAtQ0FDSElOR11cbiAgICAgIC8vIFRPRE86IGNhY2hlXG4gICAgfVxuICB9XG5cbiAgLy8gMTEuIFNldCByZXNwb25zZeKAmXMgVVJMIGxpc3QgdG8gYSBjbG9uZSBvZiBodHRwUmVxdWVzdOKAmXMgVVJMIGxpc3QuXG4gIHJlc3BvbnNlLnVybExpc3QgPSBbLi4uaHR0cFJlcXVlc3QudXJsTGlzdF1cblxuICAvLyAxMi4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIGBSYW5nZWAsIHRoZW4gc2V0IHJlc3BvbnNl4oCZc1xuICAvLyByYW5nZS1yZXF1ZXN0ZWQgZmxhZy5cbiAgaWYgKGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdyYW5nZScpKSB7XG4gICAgcmVzcG9uc2UucmFuZ2VSZXF1ZXN0ZWQgPSB0cnVlXG4gIH1cblxuICAvLyAxMy4gU2V0IHJlc3BvbnNl4oCZcyByZXF1ZXN0LWluY2x1ZGVzLWNyZWRlbnRpYWxzIHRvIGluY2x1ZGVDcmVkZW50aWFscy5cbiAgcmVzcG9uc2UucmVxdWVzdEluY2x1ZGVzQ3JlZGVudGlhbHMgPSBpbmNsdWRlQ3JlZGVudGlhbHNcblxuICAvLyAxNC4gSWYgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyA0MDEsIGh0dHBSZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBub3RcbiAgLy8gXCJjb3JzXCIsIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlLCBhbmQgcmVxdWVzdOKAmXMgd2luZG93IGlzIGFuIGVudmlyb25tZW50XG4gIC8vIHNldHRpbmdzIG9iamVjdCwgdGhlbjpcbiAgLy8gVE9ET1xuXG4gIC8vIDE1LiBJZiByZXNwb25zZeKAmXMgc3RhdHVzIGlzIDQwNywgdGhlbjpcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA3KSB7XG4gICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgd2luZG93IGlzIFwibm8td2luZG93XCIsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICBpZiAocmVxdWVzdC53aW5kb3cgPT09ICduby13aW5kb3cnKSB7XG4gICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigpXG4gICAgfVxuXG4gICAgLy8gMi4gPz8/XG5cbiAgICAvLyAzLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgZXJyb3IgZm9yIGZldGNoUGFyYW1zLlxuICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpXG4gICAgfVxuXG4gICAgLy8gNC4gUHJvbXB0IHRoZSBlbmQgdXNlciBhcyBhcHByb3ByaWF0ZSBpbiByZXF1ZXN04oCZcyB3aW5kb3cgYW5kIHN0b3JlXG4gICAgLy8gdGhlIHJlc3VsdCBhcyBhIHByb3h5LWF1dGhlbnRpY2F0aW9uIGVudHJ5LiBbSFRUUC1BVVRIXVxuICAgIC8vIFRPRE86IEludm9rZSBzb21lIGtpbmQgb2YgY2FsbGJhY2s/XG5cbiAgICAvLyA1LiBTZXQgcmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nIEhUVFAtbmV0d29yay1vci1jYWNoZSBmZXRjaCBnaXZlblxuICAgIC8vIGZldGNoUGFyYW1zLlxuICAgIC8vIFRPRE9cbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigncHJveHkgYXV0aGVudGljYXRpb24gcmVxdWlyZWQnKVxuICB9XG5cbiAgLy8gMTYuIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlXG4gIGlmIChcbiAgICAvLyByZXNwb25zZeKAmXMgc3RhdHVzIGlzIDQyMVxuICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDIxICYmXG4gICAgLy8gaXNOZXdDb25uZWN0aW9uRmV0Y2ggaXMgZmFsc2VcbiAgICAhaXNOZXdDb25uZWN0aW9uRmV0Y2ggJiZcbiAgICAvLyByZXF1ZXN04oCZcyBib2R5IGlzIG51bGwsIG9yIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwgYW5kIHJlcXVlc3TigJlzIGJvZHnigJlzIHNvdXJjZSBpcyBub24tbnVsbFxuICAgIChyZXF1ZXN0LmJvZHkgPT0gbnVsbCB8fCByZXF1ZXN0LmJvZHkuc291cmNlICE9IG51bGwpXG4gICkge1xuICAgIC8vIHRoZW46XG5cbiAgICAvLyAxLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgZXJyb3IgZm9yIGZldGNoUGFyYW1zLlxuICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpXG4gICAgfVxuXG4gICAgLy8gMi4gU2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQLW5ldHdvcmstb3ItY2FjaGVcbiAgICAvLyBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcywgaXNBdXRoZW50aWNhdGlvbkZldGNoLCBhbmQgdHJ1ZS5cblxuICAgIC8vIFRPRE8gKHNwZWMpOiBUaGUgc3BlYyBkb2Vzbid0IHNwZWNpZnkgdGhpcyBidXQgd2UgbmVlZCB0byBjYW5jZWxcbiAgICAvLyB0aGUgYWN0aXZlIHJlc3BvbnNlIGJlZm9yZSB3ZSBjYW4gc3RhcnQgYSBuZXcgb25lLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyOTNcbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24uZGVzdHJveSgpXG5cbiAgICByZXNwb25zZSA9IGF3YWl0IGh0dHBOZXR3b3JrT3JDYWNoZUZldGNoKFxuICAgICAgZmV0Y2hQYXJhbXMsXG4gICAgICBpc0F1dGhlbnRpY2F0aW9uRmV0Y2gsXG4gICAgICB0cnVlXG4gICAgKVxuICB9XG5cbiAgLy8gMTcuIElmIGlzQXV0aGVudGljYXRpb25GZXRjaCBpcyB0cnVlLCB0aGVuIGNyZWF0ZSBhbiBhdXRoZW50aWNhdGlvbiBlbnRyeVxuICBpZiAoaXNBdXRoZW50aWNhdGlvbkZldGNoKSB7XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gMTguIFJldHVybiByZXNwb25zZS5cbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLW5ldHdvcmstZmV0Y2hcbmFzeW5jIGZ1bmN0aW9uIGh0dHBOZXR3b3JrRmV0Y2ggKFxuICBmZXRjaFBhcmFtcyxcbiAgaW5jbHVkZUNyZWRlbnRpYWxzID0gZmFsc2UsXG4gIGZvcmNlTmV3Q29ubmVjdGlvbiA9IGZhbHNlXG4pIHtcbiAgYXNzZXJ0KCFmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24gfHwgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3llZClcblxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24gPSB7XG4gICAgYWJvcnQ6IG51bGwsXG4gICAgZGVzdHJveWVkOiBmYWxzZSxcbiAgICBkZXN0cm95IChlcnIpIHtcbiAgICAgIGlmICghdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuYWJvcnQ/LihlcnIgPz8gbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIDEuIExldCByZXF1ZXN0IGJlIGZldGNoUGFyYW1z4oCZcyByZXF1ZXN0LlxuICBjb25zdCByZXF1ZXN0ID0gZmV0Y2hQYXJhbXMucmVxdWVzdFxuXG4gIC8vIDIuIExldCByZXNwb25zZSBiZSBudWxsLlxuICBsZXQgcmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gMy4gTGV0IHRpbWluZ0luZm8gYmUgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICBjb25zdCB0aW1pbmdJbmZvID0gZmV0Y2hQYXJhbXMudGltaW5nSW5mb1xuXG4gIC8vIDQuIExldCBodHRwQ2FjaGUgYmUgdGhlIHJlc3VsdCBvZiBkZXRlcm1pbmluZyB0aGUgSFRUUCBjYWNoZSBwYXJ0aXRpb24sXG4gIC8vIGdpdmVuIHJlcXVlc3QuXG4gIC8vIFRPRE86IGNhY2hlXG4gIGNvbnN0IGh0dHBDYWNoZSA9IG51bGxcblxuICAvLyA1LiBJZiBodHRwQ2FjaGUgaXMgbnVsbCwgdGhlbiBzZXQgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0byBcIm5vLXN0b3JlXCIuXG4gIGlmIChodHRwQ2FjaGUgPT0gbnVsbCkge1xuICAgIHJlcXVlc3QuY2FjaGUgPSAnbm8tc3RvcmUnXG4gIH1cblxuICAvLyA2LiBMZXQgbmV0d29ya1BhcnRpdGlvbktleSBiZSB0aGUgcmVzdWx0IG9mIGRldGVybWluaW5nIHRoZSBuZXR3b3JrXG4gIC8vIHBhcnRpdGlvbiBrZXkgZ2l2ZW4gcmVxdWVzdC5cbiAgLy8gVE9ET1xuXG4gIC8vIDcuIExldCBuZXdDb25uZWN0aW9uIGJlIFwieWVzXCIgaWYgZm9yY2VOZXdDb25uZWN0aW9uIGlzIHRydWU7IG90aGVyd2lzZVxuICAvLyBcIm5vXCIuXG4gIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSBmb3JjZU5ld0Nvbm5lY3Rpb24gPyAneWVzJyA6ICdubycgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gIC8vIDguIFN3aXRjaCBvbiByZXF1ZXN04oCZcyBtb2RlOlxuICBpZiAocmVxdWVzdC5tb2RlID09PSAnd2Vic29ja2V0Jykge1xuICAgIC8vIExldCBjb25uZWN0aW9uIGJlIHRoZSByZXN1bHQgb2Ygb2J0YWluaW5nIGEgV2ViU29ja2V0IGNvbm5lY3Rpb24sXG4gICAgLy8gZ2l2ZW4gcmVxdWVzdOKAmXMgY3VycmVudCBVUkwuXG4gICAgLy8gVE9ET1xuICB9IGVsc2Uge1xuICAgIC8vIExldCBjb25uZWN0aW9uIGJlIHRoZSByZXN1bHQgb2Ygb2J0YWluaW5nIGEgY29ubmVjdGlvbiwgZ2l2ZW5cbiAgICAvLyBuZXR3b3JrUGFydGl0aW9uS2V5LCByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgb3JpZ2luLFxuICAgIC8vIGluY2x1ZGVDcmVkZW50aWFscywgYW5kIGZvcmNlTmV3Q29ubmVjdGlvbi5cbiAgICAvLyBUT0RPXG4gIH1cblxuICAvLyA5LiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIHRoZSBvbmdvaW5nIGZldGNoIGlzIHRlcm1pbmF0ZWQ6XG5cbiAgLy8gICAgMS4gSWYgY29ubmVjdGlvbiBpcyBmYWlsdXJlLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG5cbiAgLy8gICAgMi4gU2V0IHRpbWluZ0luZm/igJlzIGZpbmFsIGNvbm5lY3Rpb24gdGltaW5nIGluZm8gdG8gdGhlIHJlc3VsdCBvZlxuICAvLyAgICBjYWxsaW5nIGNsYW1wIGFuZCBjb2Fyc2VuIGNvbm5lY3Rpb24gdGltaW5nIGluZm8gd2l0aCBjb25uZWN0aW9u4oCZc1xuICAvLyAgICB0aW1pbmcgaW5mbywgdGltaW5nSW5mb+KAmXMgcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lLCBhbmQgZmV0Y2hQYXJhbXPigJlzXG4gIC8vICAgIGNyb3NzLW9yaWdpbiBpc29sYXRlZCBjYXBhYmlsaXR5LlxuXG4gIC8vICAgIDMuIElmIGNvbm5lY3Rpb24gaXMgbm90IGFuIEhUVFAvMiBjb25uZWN0aW9uLCByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLFxuICAvLyAgICBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsIHRoZW4gYXBwZW5kIChgVHJhbnNmZXItRW5jb2RpbmdgLFxuICAvLyAgICBgY2h1bmtlZGApIHRvIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuXG4gIC8vICAgIDQuIFNldCB0aW1pbmdJbmZv4oCZcyBmaW5hbCBuZXR3b3JrLXJlcXVlc3Qgc3RhcnQgdGltZSB0byB0aGUgY29hcnNlbmVkXG4gIC8vICAgIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzIGNyb3NzLW9yaWdpbiBpc29sYXRlZFxuICAvLyAgICBjYXBhYmlsaXR5LlxuXG4gIC8vICAgIDUuIFNldCByZXNwb25zZSB0byB0aGUgcmVzdWx0IG9mIG1ha2luZyBhbiBIVFRQIHJlcXVlc3Qgb3ZlciBjb25uZWN0aW9uXG4gIC8vICAgIHVzaW5nIHJlcXVlc3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNhdmVhdHM6XG5cbiAgLy8gICAgICAgIC0gRm9sbG93IHRoZSByZWxldmFudCByZXF1aXJlbWVudHMgZnJvbSBIVFRQLiBbSFRUUF0gW0hUVFAtU0VNQU5USUNTXVxuICAvLyAgICAgICAgW0hUVFAtQ09ORF0gW0hUVFAtQ0FDSElOR10gW0hUVFAtQVVUSF1cblxuICAvLyAgICAgICAgLSBJZiByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLCBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsXG4gIC8vICAgICAgICB0aGVuIHRoZSB1c2VyIGFnZW50IG1heSBoYXZlIGEgYnVmZmVyIG9mIHVwIHRvIDY0IGtpYmlieXRlcyBhbmQgc3RvcmVcbiAgLy8gICAgICAgIGEgcGFydCBvZiByZXF1ZXN04oCZcyBib2R5IGluIHRoYXQgYnVmZmVyLiBJZiB0aGUgdXNlciBhZ2VudCByZWFkcyBmcm9tXG4gIC8vICAgICAgICByZXF1ZXN04oCZcyBib2R5IGJleW9uZCB0aGF0IGJ1ZmZlcuKAmXMgc2l6ZSBhbmQgdGhlIHVzZXIgYWdlbnQgbmVlZHMgdG9cbiAgLy8gICAgICAgIHJlc2VuZCByZXF1ZXN0LCB0aGVuIGluc3RlYWQgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cblxuICAvLyAgICAgICAgLSBTZXQgdGltaW5nSW5mb+KAmXMgZmluYWwgbmV0d29yay1yZXNwb25zZSBzdGFydCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWRcbiAgLy8gICAgICAgIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzIGNyb3NzLW9yaWdpbiBpc29sYXRlZCBjYXBhYmlsaXR5LFxuICAvLyAgICAgICAgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZXIgYWdlbnTigJlzIEhUVFAgcGFyc2VyIHJlY2VpdmVzIHRoZSBmaXJzdCBieXRlXG4gIC8vICAgICAgICBvZiB0aGUgcmVzcG9uc2UgKGUuZy4sIGZyYW1lIGhlYWRlciBieXRlcyBmb3IgSFRUUC8yIG9yIHJlc3BvbnNlIHN0YXR1c1xuICAvLyAgICAgICAgbGluZSBmb3IgSFRUUC8xLngpLlxuXG4gIC8vICAgICAgICAtIFdhaXQgdW50aWwgYWxsIHRoZSBoZWFkZXJzIGFyZSB0cmFuc21pdHRlZC5cblxuICAvLyAgICAgICAgLSBBbnkgcmVzcG9uc2VzIHdob3NlIHN0YXR1cyBpcyBpbiB0aGUgcmFuZ2UgMTAwIHRvIDE5OSwgaW5jbHVzaXZlLFxuICAvLyAgICAgICAgYW5kIGlzIG5vdCAxMDEsIGFyZSB0byBiZSBpZ25vcmVkLCBleGNlcHQgZm9yIHRoZSBwdXJwb3NlcyBvZiBzZXR0aW5nXG4gIC8vICAgICAgICB0aW1pbmdJbmZv4oCZcyBmaW5hbCBuZXR3b3JrLXJlc3BvbnNlIHN0YXJ0IHRpbWUgYWJvdmUuXG5cbiAgLy8gICAgLSBJZiByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBjb250YWlucyBgVHJhbnNmZXItRW5jb2RpbmdgL2BjaHVua2VkYCBhbmRcbiAgLy8gICAgcmVzcG9uc2UgaXMgdHJhbnNmZXJyZWQgdmlhIEhUVFAvMS4wIG9yIG9sZGVyLCB0aGVuIHJldHVybiBhIG5ldHdvcmtcbiAgLy8gICAgZXJyb3IuXG5cbiAgLy8gICAgLSBJZiB0aGUgSFRUUCByZXF1ZXN0IHJlc3VsdHMgaW4gYSBUTFMgY2xpZW50IGNlcnRpZmljYXRlIGRpYWxvZywgdGhlbjpcblxuICAvLyAgICAgICAgMS4gSWYgcmVxdWVzdOKAmXMgd2luZG93IGlzIGFuIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdCwgbWFrZSB0aGVcbiAgLy8gICAgICAgIGRpYWxvZyBhdmFpbGFibGUgaW4gcmVxdWVzdOKAmXMgd2luZG93LlxuXG4gIC8vICAgICAgICAyLiBPdGhlcndpc2UsIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG5cbiAgLy8gVG8gdHJhbnNtaXQgcmVxdWVzdOKAmXMgYm9keSBib2R5LCBydW4gdGhlc2Ugc3RlcHM6XG4gIGxldCByZXF1ZXN0Qm9keSA9IG51bGxcbiAgLy8gMS4gSWYgYm9keSBpcyBudWxsIGFuZCBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0IGVuZC1vZi1ib2R5IGlzXG4gIC8vIG5vbi1udWxsLCB0aGVuIHF1ZXVlIGEgZmV0Y2ggdGFzayBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0XG4gIC8vIGVuZC1vZi1ib2R5IGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgaWYgKHJlcXVlc3QuYm9keSA9PSBudWxsICYmIGZldGNoUGFyYW1zLnByb2Nlc3NSZXF1ZXN0RW5kT2ZCb2R5KSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkoKSlcbiAgfSBlbHNlIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgYm9keSBpcyBub24tbnVsbDpcblxuICAgIC8vICAgIDEuIExldCBwcm9jZXNzQm9keUNodW5rIGdpdmVuIGJ5dGVzIGJlIHRoZXNlIHN0ZXBzOlxuICAgIGNvbnN0IHByb2Nlc3NCb2R5Q2h1bmsgPSBhc3luYyBmdW5jdGlvbiAqIChieXRlcykge1xuICAgICAgLy8gMS4gSWYgdGhlIG9uZ29pbmcgZmV0Y2ggaXMgdGVybWluYXRlZCwgdGhlbiBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFJ1biB0aGlzIHN0ZXAgaW4gcGFyYWxsZWw6IHRyYW5zbWl0IGJ5dGVzLlxuICAgICAgeWllbGQgYnl0ZXNcblxuICAgICAgLy8gMy4gSWYgZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBib2R5IGlzIG5vbi1udWxsLCB0aGVuIHJ1blxuICAgICAgLy8gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBib2R5IGdpdmVuIGJ5dGVz4oCZcyBsZW5ndGguXG4gICAgICBmZXRjaFBhcmFtcy5wcm9jZXNzUmVxdWVzdEJvZHlDaHVua0xlbmd0aD8uKGJ5dGVzLmJ5dGVMZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IHByb2Nlc3NFbmRPZkJvZHkgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0VuZE9mQm9keSA9ICgpID0+IHtcbiAgICAgIC8vIDEuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgICAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBlbmQtb2YtYm9keSBpcyBub24tbnVsbCxcbiAgICAgIC8vIHRoZW4gcnVuIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlcXVlc3QgZW5kLW9mLWJvZHkuXG4gICAgICBpZiAoZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkoKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIExldCBwcm9jZXNzQm9keUVycm9yIGdpdmVuIGUgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChlKSA9PiB7XG4gICAgICAvLyAxLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGUgaXMgYW4gXCJBYm9ydEVycm9yXCIgRE9NRXhjZXB0aW9uLCB0aGVuIGFib3J0IGZldGNoUGFyYW1z4oCZcyBjb250cm9sbGVyLlxuICAgICAgaWYgKGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBJbmNyZW1lbnRhbGx5IHJlYWQgcmVxdWVzdOKAmXMgYm9keSBnaXZlbiBwcm9jZXNzQm9keUNodW5rLCBwcm9jZXNzRW5kT2ZCb2R5LFxuICAgIC8vIHByb2Nlc3NCb2R5RXJyb3IsIGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgICByZXF1ZXN0Qm9keSA9IChhc3luYyBmdW5jdGlvbiAqICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgYnl0ZXMgb2YgcmVxdWVzdC5ib2R5LnN0cmVhbSkge1xuICAgICAgICAgIHlpZWxkICogcHJvY2Vzc0JvZHlDaHVuayhieXRlcylcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzRW5kT2ZCb2R5KClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBwcm9jZXNzQm9keUVycm9yKGVycilcbiAgICAgIH1cbiAgICB9KSgpXG4gIH1cblxuICB0cnkge1xuICAgIC8vIHNvY2tldCBpcyBvbmx5IHByb3ZpZGVkIGZvciB3ZWJzb2NrZXRzXG4gICAgY29uc3QgeyBib2R5LCBzdGF0dXMsIHN0YXR1c1RleHQsIGhlYWRlcnNMaXN0LCBzb2NrZXQgfSA9IGF3YWl0IGRpc3BhdGNoKHsgYm9keTogcmVxdWVzdEJvZHkgfSlcblxuICAgIGlmIChzb2NrZXQpIHtcbiAgICAgIHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHsgc3RhdHVzLCBzdGF0dXNUZXh0LCBoZWFkZXJzTGlzdCwgc29ja2V0IH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gYm9keVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKVxuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5uZXh0ID0gKCkgPT4gaXRlcmF0b3IubmV4dCgpXG5cbiAgICAgIHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHsgc3RhdHVzLCBzdGF0dXNUZXh0LCBoZWFkZXJzTGlzdCB9KVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gMTAuIElmIGFib3J0ZWQsIHRoZW46XG4gICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgIC8vIDEuIElmIGNvbm5lY3Rpb24gdXNlcyBIVFRQLzIsIHRoZW4gdHJhbnNtaXQgYW4gUlNUX1NUUkVBTSBmcmFtZS5cbiAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbi5kZXN0cm95KClcblxuICAgICAgLy8gMi4gUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBuZXR3b3JrIGVycm9yIGZvciBmZXRjaFBhcmFtcy5cbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMsIGVycilcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcihlcnIpXG4gIH1cblxuICAvLyAxMS4gTGV0IHB1bGxBbGdvcml0aG0gYmUgYW4gYWN0aW9uIHRoYXQgcmVzdW1lcyB0aGUgb25nb2luZyBmZXRjaFxuICAvLyBpZiBpdCBpcyBzdXNwZW5kZWQuXG4gIGNvbnN0IHB1bGxBbGdvcml0aG0gPSAoKSA9PiB7XG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5yZXN1bWUoKVxuICB9XG5cbiAgLy8gMTIuIExldCBjYW5jZWxBbGdvcml0aG0gYmUgYW4gYWxnb3JpdGhtIHRoYXQgYWJvcnRzIGZldGNoUGFyYW1z4oCZc1xuICAvLyBjb250cm9sbGVyIHdpdGggcmVhc29uLCBnaXZlbiByZWFzb24uXG4gIGNvbnN0IGNhbmNlbEFsZ29yaXRobSA9IChyZWFzb24pID0+IHtcbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmFib3J0KHJlYXNvbilcbiAgfVxuXG4gIC8vIDEzLiBMZXQgaGlnaFdhdGVyTWFyayBiZSBhIG5vbi1uZWdhdGl2ZSwgbm9uLU5hTiBudW1iZXIsIGNob3NlbiBieVxuICAvLyB0aGUgdXNlciBhZ2VudC5cbiAgLy8gVE9ET1xuXG4gIC8vIDE0LiBMZXQgc2l6ZUFsZ29yaXRobSBiZSBhbiBhbGdvcml0aG0gdGhhdCBhY2NlcHRzIGEgY2h1bmsgb2JqZWN0XG4gIC8vIGFuZCByZXR1cm5zIGEgbm9uLW5lZ2F0aXZlLCBub24tTmFOLCBub24taW5maW5pdGUgbnVtYmVyLCBjaG9zZW4gYnkgdGhlIHVzZXIgYWdlbnQuXG4gIC8vIFRPRE9cblxuICAvLyAxNS4gTGV0IHN0cmVhbSBiZSBhIG5ldyBSZWFkYWJsZVN0cmVhbS5cbiAgLy8gMTYuIFNldCB1cCBzdHJlYW0gd2l0aCBwdWxsQWxnb3JpdGhtIHNldCB0byBwdWxsQWxnb3JpdGhtLFxuICAvLyBjYW5jZWxBbGdvcml0aG0gc2V0IHRvIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyayBzZXQgdG9cbiAgLy8gaGlnaFdhdGVyTWFyaywgYW5kIHNpemVBbGdvcml0aG0gc2V0IHRvIHNpemVBbGdvcml0aG0uXG4gIGlmICghUmVhZGFibGVTdHJlYW0pIHtcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgY29uc3Qgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKFxuICAgIHtcbiAgICAgIGFzeW5jIHN0YXJ0IChjb250cm9sbGVyKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlciA9IGNvbnRyb2xsZXJcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsIChjb250cm9sbGVyKSB7XG4gICAgICAgIGF3YWl0IHB1bGxBbGdvcml0aG0oY29udHJvbGxlcilcbiAgICAgIH0sXG4gICAgICBhc3luYyBjYW5jZWwgKHJlYXNvbikge1xuICAgICAgICBhd2FpdCBjYW5jZWxBbGdvcml0aG0ocmVhc29uKVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgaGlnaFdhdGVyTWFyazogMCxcbiAgICAgIHNpemUgKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfVxuICAgIH1cbiAgKVxuXG4gIC8vIDE3LiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIHRoZSBvbmdvaW5nIGZldGNoIGlzIHRlcm1pbmF0ZWQ6XG5cbiAgLy8gICAgMS4gU2V0IHJlc3BvbnNl4oCZcyBib2R5IHRvIGEgbmV3IGJvZHkgd2hvc2Ugc3RyZWFtIGlzIHN0cmVhbS5cbiAgcmVzcG9uc2UuYm9keSA9IHsgc3RyZWFtIH1cblxuICAvLyAgICAyLiBJZiByZXNwb25zZSBpcyBub3QgYSBuZXR3b3JrIGVycm9yIGFuZCByZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzXG4gIC8vICAgIG5vdCBcIm5vLXN0b3JlXCIsIHRoZW4gdXBkYXRlIHJlc3BvbnNlIGluIGh0dHBDYWNoZSBmb3IgcmVxdWVzdC5cbiAgLy8gICAgVE9ET1xuXG4gIC8vICAgIDMuIElmIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlIGFuZCB0aGUgdXNlciBhZ2VudCBpcyBub3QgY29uZmlndXJlZFxuICAvLyAgICB0byBibG9jayBjb29raWVzIGZvciByZXF1ZXN0IChzZWUgc2VjdGlvbiA3IG9mIFtDT09LSUVTXSksIHRoZW4gcnVuIHRoZVxuICAvLyAgICBcInNldC1jb29raWUtc3RyaW5nXCIgcGFyc2luZyBhbGdvcml0aG0gKHNlZSBzZWN0aW9uIDUuMiBvZiBbQ09PS0lFU10pIG9uXG4gIC8vICAgIHRoZSB2YWx1ZSBvZiBlYWNoIGhlYWRlciB3aG9zZSBuYW1lIGlzIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAvLyAgICBgU2V0LUNvb2tpZWAgaW4gcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LCBpZiBhbnksIGFuZCByZXF1ZXN04oCZcyBjdXJyZW50IFVSTC5cbiAgLy8gICAgVE9ET1xuXG4gIC8vIDE4LiBJZiBhYm9ydGVkLCB0aGVuOlxuICAvLyBUT0RPXG5cbiAgLy8gMTkuIFJ1biB0aGVzZSBzdGVwcyBpbiBwYXJhbGxlbDpcblxuICAvLyAgICAxLiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkOlxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm9uKCd0ZXJtaW5hdGVkJywgb25BYm9ydGVkKVxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnJlc3VtZSA9IGFzeW5jICgpID0+IHtcbiAgICAvLyAxLiBXaGlsZSB0cnVlXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIDEtMy4gU2VlIG9uRGF0YS4uLlxuXG4gICAgICAvLyA0LiBTZXQgYnl0ZXMgdG8gdGhlIHJlc3VsdCBvZiBoYW5kbGluZyBjb250ZW50IGNvZGluZ3MgZ2l2ZW5cbiAgICAgIC8vIGNvZGluZ3MgYW5kIGJ5dGVzLlxuICAgICAgbGV0IGJ5dGVzXG4gICAgICBsZXQgaXNGYWlsdXJlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm5leHQoKVxuXG4gICAgICAgIGlmIChpc0Fib3J0ZWQoZmV0Y2hQYXJhbXMpKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ5dGVzID0gZG9uZSA/IHVuZGVmaW5lZCA6IHZhbHVlXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZW5kZWQgJiYgIXRpbWluZ0luZm8uZW5jb2RlZEJvZHlTaXplKSB7XG4gICAgICAgICAgLy8gemxpYiBkb2Vzbid0IGxpa2UgZW1wdHkgc3RyZWFtcy5cbiAgICAgICAgICBieXRlcyA9IHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ5dGVzID0gZXJyXG5cbiAgICAgICAgICAvLyBlcnIgbWF5IGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgcmVhZGFibGVzdHJlYW0uY2FuY2VsLFxuICAgICAgICAgIC8vIHdoaWNoIG1pZ2h0IG5vdCBiZSBhbiBlcnJvci4gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzIwMDlcbiAgICAgICAgICBpc0ZhaWx1cmUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGJ5dGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiB0aGUgYnl0ZXMgdHJhbnNtaXNzaW9uIGZvciByZXNwb25zZeKAmXMgbWVzc2FnZVxuICAgICAgICAvLyBib2R5IGlzIGRvbmUgbm9ybWFsbHkgYW5kIHN0cmVhbSBpcyByZWFkYWJsZSwgdGhlbiBjbG9zZVxuICAgICAgICAvLyBzdHJlYW0sIGZpbmFsaXplIHJlc3BvbnNlIGZvciBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UsIGFuZFxuICAgICAgICAvLyBhYm9ydCB0aGVzZSBpbi1wYXJhbGxlbCBzdGVwcy5cbiAgICAgICAgcmVhZGFibGVTdHJlYW1DbG9zZShmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbnRyb2xsZXIpXG5cbiAgICAgICAgZmluYWxpemVSZXNwb25zZShmZXRjaFBhcmFtcywgcmVzcG9uc2UpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDUuIEluY3JlYXNlIHRpbWluZ0luZm/igJlzIGRlY29kZWQgYm9keSBzaXplIGJ5IGJ5dGVz4oCZcyBsZW5ndGguXG4gICAgICB0aW1pbmdJbmZvLmRlY29kZWRCb2R5U2l6ZSArPSBieXRlcz8uYnl0ZUxlbmd0aCA/PyAwXG5cbiAgICAgIC8vIDYuIElmIGJ5dGVzIGlzIGZhaWx1cmUsIHRoZW4gdGVybWluYXRlIGZldGNoUGFyYW1z4oCZcyBjb250cm9sbGVyLlxuICAgICAgaWYgKGlzRmFpbHVyZSkge1xuICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShieXRlcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDcuIEVucXVldWUgYSBVaW50OEFycmF5IHdyYXBwaW5nIGFuIEFycmF5QnVmZmVyIGNvbnRhaW5pbmcgYnl0ZXNcbiAgICAgIC8vIGludG8gc3RyZWFtLlxuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoYnl0ZXMpKVxuXG4gICAgICAvLyA4LiBJZiBzdHJlYW0gaXMgZXJyb3JlZCwgdGhlbiB0ZXJtaW5hdGUgdGhlIG9uZ29pbmcgZmV0Y2guXG4gICAgICBpZiAoaXNFcnJvcmVkKHN0cmVhbSkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gOS4gSWYgc3RyZWFtIGRvZXNu4oCZdCBuZWVkIG1vcmUgZGF0YSBhc2sgdGhlIHVzZXIgYWdlbnQgdG8gc3VzcGVuZFxuICAgICAgLy8gdGhlIG9uZ29pbmcgZmV0Y2guXG4gICAgICBpZiAoIWZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlci5kZXNpcmVkU2l6ZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAgICAyLiBJZiBhYm9ydGVkLCB0aGVuOlxuICBmdW5jdGlvbiBvbkFib3J0ZWQgKHJlYXNvbikge1xuICAgIC8vIDIuIElmIGZldGNoUGFyYW1zIGlzIGFib3J0ZWQsIHRoZW46XG4gICAgaWYgKGlzQWJvcnRlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIC8vIDEuIFNldCByZXNwb25zZeKAmXMgYWJvcnRlZCBmbGFnLlxuICAgICAgcmVzcG9uc2UuYWJvcnRlZCA9IHRydWVcblxuICAgICAgLy8gMi4gSWYgc3RyZWFtIGlzIHJlYWRhYmxlLCB0aGVuIGVycm9yIHN0cmVhbSB3aXRoIHRoZSByZXN1bHQgb2ZcbiAgICAgIC8vICAgIGRlc2VyaWFsaXplIGEgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzXG4gICAgICAvLyAgICBjb250cm9sbGVy4oCZcyBzZXJpYWxpemVkIGFib3J0IHJlYXNvbiBhbmQgYW5cbiAgICAgIC8vICAgIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmVhbG0uXG4gICAgICBpZiAoaXNSZWFkYWJsZShzdHJlYW0pKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnNlcmlhbGl6ZWRBYm9ydFJlYXNvblxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgc3RyZWFtIGlzIHJlYWRhYmxlLCBlcnJvciBzdHJlYW0gd2l0aCBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChpc1JlYWRhYmxlKHN0cmVhbSkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyLmVycm9yKG5ldyBUeXBlRXJyb3IoJ3Rlcm1pbmF0ZWQnLCB7XG4gICAgICAgICAgY2F1c2U6IGlzRXJyb3JMaWtlKHJlYXNvbikgPyByZWFzb24gOiB1bmRlZmluZWRcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gSWYgY29ubmVjdGlvbiB1c2VzIEhUVFAvMiwgdGhlbiB0cmFuc21pdCBhbiBSU1RfU1RSRUFNIGZyYW1lLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgdGhlIHVzZXIgYWdlbnQgc2hvdWxkIGNsb3NlIGNvbm5lY3Rpb24gdW5sZXNzIGl0IHdvdWxkIGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UgdG8gZG8gc28uXG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3koKVxuICB9XG5cbiAgLy8gMjAuIFJldHVybiByZXNwb25zZS5cbiAgcmV0dXJuIHJlc3BvbnNlXG5cbiAgYXN5bmMgZnVuY3Rpb24gZGlzcGF0Y2ggKHsgYm9keSB9KSB7XG4gICAgY29uc3QgdXJsID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcbiAgICAvKiogQHR5cGUge2ltcG9ydCgnLi4vLi4nKS5BZ2VudH0gKi9cbiAgICBjb25zdCBhZ2VudCA9IGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZGlzcGF0Y2hlclxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IGFnZW50LmRpc3BhdGNoKFxuICAgICAge1xuICAgICAgICBwYXRoOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoLFxuICAgICAgICBvcmlnaW46IHVybC5vcmlnaW4sXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIGJvZHk6IGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZGlzcGF0Y2hlci5pc01vY2tBY3RpdmUgPyByZXF1ZXN0LmJvZHkgJiYgKHJlcXVlc3QuYm9keS5zb3VyY2UgfHwgcmVxdWVzdC5ib2R5LnN0cmVhbSkgOiBib2R5LFxuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnNMaXN0LmVudHJpZXMsXG4gICAgICAgIG1heFJlZGlyZWN0aW9uczogMCxcbiAgICAgICAgdXBncmFkZTogcmVxdWVzdC5tb2RlID09PSAnd2Vic29ja2V0JyA/ICd3ZWJzb2NrZXQnIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBib2R5OiBudWxsLFxuICAgICAgICBhYm9ydDogbnVsbCxcblxuICAgICAgICBvbkNvbm5lY3QgKGFib3J0KSB7XG4gICAgICAgICAgLy8gVE9ETyAoZml4KTogRG8gd2UgbmVlZCBjb25uZWN0aW9uIGhlcmU/XG4gICAgICAgICAgY29uc3QgeyBjb25uZWN0aW9uIH0gPSBmZXRjaFBhcmFtcy5jb250cm9sbGVyXG5cbiAgICAgICAgICBpZiAoY29ubmVjdGlvbi5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIGFib3J0KG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vbigndGVybWluYXRlZCcsIGFib3J0KVxuICAgICAgICAgICAgdGhpcy5hYm9ydCA9IGNvbm5lY3Rpb24uYWJvcnQgPSBhYm9ydFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBvbkhlYWRlcnMgKHN0YXR1cywgaGVhZGVyc0xpc3QsIHJlc3VtZSwgc3RhdHVzVGV4dCkge1xuICAgICAgICAgIGlmIChzdGF0dXMgPCAyMDApIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBjb2RpbmdzID0gW11cbiAgICAgICAgICBsZXQgbG9jYXRpb24gPSAnJ1xuXG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcblxuICAgICAgICAgIC8vIEZvciBIMiwgdGhlIGhlYWRlcnMgYXJlIGEgcGxhaW4gSlMgb2JqZWN0XG4gICAgICAgICAgLy8gV2UgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtIGFuZCBpdGVyYXRlIGFjY29yZGluZ2x5XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVyc0xpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGhlYWRlcnNMaXN0Lmxlbmd0aDsgbiArPSAyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlcnNMaXN0W24gKyAwXS50b1N0cmluZygnbGF0aW4xJylcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gaGVhZGVyc0xpc3RbbiArIDFdLnRvU3RyaW5nKCdsYXRpbjEnKVxuICAgICAgICAgICAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LWVuY29kaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM3MjMxI3NlY3Rpb24tMy4xLjIuMVxuICAgICAgICAgICAgICAgIC8vIFwiQWxsIGNvbnRlbnQtY29kaW5nIHZhbHVlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4uLlwiXG4gICAgICAgICAgICAgICAgY29kaW5ncyA9IHZhbC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcsJykubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2xvY2F0aW9uJykge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gdmFsXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBoZWFkZXJzW2tIZWFkZXJzTGlzdF0uYXBwZW5kKGtleSwgdmFsKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVyc0xpc3QpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGhlYWRlcnNMaXN0W2tleV1cbiAgICAgICAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC1lbmNvZGluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzMSNzZWN0aW9uLTMuMS4yLjFcbiAgICAgICAgICAgICAgICAvLyBcIkFsbCBjb250ZW50LWNvZGluZyB2YWx1ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuLi5cIlxuICAgICAgICAgICAgICAgIGNvZGluZ3MgPSB2YWwudG9Mb3dlckNhc2UoKS5zcGxpdCgnLCcpLm1hcCgoeCkgPT4geC50cmltKCkpLnJldmVyc2UoKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnbG9jYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24gPSB2YWxcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGhlYWRlcnNba0hlYWRlcnNMaXN0XS5hcHBlbmQoa2V5LCB2YWwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5ib2R5ID0gbmV3IFJlYWRhYmxlKHsgcmVhZDogcmVzdW1lIH0pXG5cbiAgICAgICAgICBjb25zdCBkZWNvZGVycyA9IFtdXG5cbiAgICAgICAgICBjb25zdCB3aWxsRm9sbG93ID0gcmVxdWVzdC5yZWRpcmVjdCA9PT0gJ2ZvbGxvdycgJiZcbiAgICAgICAgICAgIGxvY2F0aW9uICYmXG4gICAgICAgICAgICByZWRpcmVjdFN0YXR1c1NldC5oYXMoc3RhdHVzKVxuXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL0NvbnRlbnQtRW5jb2RpbmdcbiAgICAgICAgICBpZiAocmVxdWVzdC5tZXRob2QgIT09ICdIRUFEJyAmJiByZXF1ZXN0Lm1ldGhvZCAhPT0gJ0NPTk5FQ1QnICYmICFudWxsQm9keVN0YXR1cy5pbmNsdWRlcyhzdGF0dXMpICYmICF3aWxsRm9sbG93KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGluZyBvZiBjb2RpbmdzKSB7XG4gICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MTEyLmh0bWwjc2VjdGlvbi03LjJcbiAgICAgICAgICAgICAgaWYgKGNvZGluZyA9PT0gJ3gtZ3ppcCcgfHwgY29kaW5nID09PSAnZ3ppcCcpIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVycy5wdXNoKHpsaWIuY3JlYXRlR3VuemlwKHtcbiAgICAgICAgICAgICAgICAgIC8vIEJlIGxlc3Mgc3RyaWN0IHdoZW4gZGVjb2RpbmcgY29tcHJlc3NlZCByZXNwb25zZXMsIHNpbmNlIHNvbWV0aW1lc1xuICAgICAgICAgICAgICAgICAgLy8gc2VydmVycyBzZW5kIHNsaWdodGx5IGludmFsaWQgcmVzcG9uc2VzIHRoYXQgYXJlIHN0aWxsIGFjY2VwdGVkXG4gICAgICAgICAgICAgICAgICAvLyBieSBjb21tb24gYnJvd3NlcnMuXG4gICAgICAgICAgICAgICAgICAvLyBBbHdheXMgdXNpbmcgWl9TWU5DX0ZMVVNIIGlzIHdoYXQgY1VSTCBkb2VzLlxuICAgICAgICAgICAgICAgICAgZmx1c2g6IHpsaWIuY29uc3RhbnRzLlpfU1lOQ19GTFVTSCxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoOiB6bGliLmNvbnN0YW50cy5aX1NZTkNfRkxVU0hcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RpbmcgPT09ICdkZWZsYXRlJykge1xuICAgICAgICAgICAgICAgIGRlY29kZXJzLnB1c2goemxpYi5jcmVhdGVJbmZsYXRlKCkpXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kaW5nID09PSAnYnInKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlcnMucHVzaCh6bGliLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MoKSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVycy5sZW5ndGggPSAwXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgc3RhdHVzVGV4dCxcbiAgICAgICAgICAgIGhlYWRlcnNMaXN0OiBoZWFkZXJzW2tIZWFkZXJzTGlzdF0sXG4gICAgICAgICAgICBib2R5OiBkZWNvZGVycy5sZW5ndGhcbiAgICAgICAgICAgICAgPyBwaXBlbGluZSh0aGlzLmJvZHksIC4uLmRlY29kZXJzLCAoKSA9PiB7IH0pXG4gICAgICAgICAgICAgIDogdGhpcy5ib2R5Lm9uKCdlcnJvcicsICgpID0+IHt9KVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uRGF0YSAoY2h1bmspIHtcbiAgICAgICAgICBpZiAoZmV0Y2hQYXJhbXMuY29udHJvbGxlci5kdW1wKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAxLiBJZiBvbmUgb3IgbW9yZSBieXRlcyBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQgZnJvbSByZXNwb25zZeKAmXNcbiAgICAgICAgICAvLyBtZXNzYWdlIGJvZHksIHRoZW46XG5cbiAgICAgICAgICAvLyAgMS4gTGV0IGJ5dGVzIGJlIHRoZSB0cmFuc21pdHRlZCBieXRlcy5cbiAgICAgICAgICBjb25zdCBieXRlcyA9IGNodW5rXG5cbiAgICAgICAgICAvLyAgMi4gTGV0IGNvZGluZ3MgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGhlYWRlciBsaXN0IHZhbHVlc1xuICAgICAgICAgIC8vICBnaXZlbiBgQ29udGVudC1FbmNvZGluZ2AgYW5kIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgICAgICAvLyAgU2VlIHB1bGxBbGdvcml0aG0uXG5cbiAgICAgICAgICAvLyAgMy4gSW5jcmVhc2UgdGltaW5nSW5mb+KAmXMgZW5jb2RlZCBib2R5IHNpemUgYnkgYnl0ZXPigJlzIGxlbmd0aC5cbiAgICAgICAgICB0aW1pbmdJbmZvLmVuY29kZWRCb2R5U2l6ZSArPSBieXRlcy5ieXRlTGVuZ3RoXG5cbiAgICAgICAgICAvLyAgNC4gU2VlIHB1bGxBbGdvcml0aG0uLi5cblxuICAgICAgICAgIHJldHVybiB0aGlzLmJvZHkucHVzaChieXRlcylcbiAgICAgICAgfSxcblxuICAgICAgICBvbkNvbXBsZXRlICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5hYm9ydCkge1xuICAgICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vZmYoJ3Rlcm1pbmF0ZWQnLCB0aGlzLmFib3J0KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZW5kZWQgPSB0cnVlXG5cbiAgICAgICAgICB0aGlzLmJvZHkucHVzaChudWxsKVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uRXJyb3IgKGVycm9yKSB7XG4gICAgICAgICAgaWYgKHRoaXMuYWJvcnQpIHtcbiAgICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIub2ZmKCd0ZXJtaW5hdGVkJywgdGhpcy5hYm9ydClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmJvZHk/LmRlc3Ryb3koZXJyb3IpXG5cbiAgICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShlcnJvcilcblxuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSxcblxuICAgICAgICBvblVwZ3JhZGUgKHN0YXR1cywgaGVhZGVyc0xpc3QsIHNvY2tldCkge1xuICAgICAgICAgIGlmIChzdGF0dXMgIT09IDEwMSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcblxuICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgaGVhZGVyc0xpc3QubGVuZ3RoOyBuICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlcnNMaXN0W24gKyAwXS50b1N0cmluZygnbGF0aW4xJylcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGhlYWRlcnNMaXN0W24gKyAxXS50b1N0cmluZygnbGF0aW4xJylcblxuICAgICAgICAgICAgaGVhZGVyc1trSGVhZGVyc0xpc3RdLmFwcGVuZChrZXksIHZhbClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IFNUQVRVU19DT0RFU1tzdGF0dXNdLFxuICAgICAgICAgICAgaGVhZGVyc0xpc3Q6IGhlYWRlcnNba0hlYWRlcnNMaXN0XSxcbiAgICAgICAgICAgIHNvY2tldFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZmV0Y2gsXG4gIEZldGNoLFxuICBmZXRjaGluZyxcbiAgZmluYWxpemVBbmRSZXBvcnRUaW1pbmdcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBrU3RhdGU6IFN5bWJvbCgnRmlsZVJlYWRlciBzdGF0ZScpLFxuICBrUmVzdWx0OiBTeW1ib2woJ0ZpbGVSZWFkZXIgcmVzdWx0JyksXG4gIGtFcnJvcjogU3ltYm9sKCdGaWxlUmVhZGVyIGVycm9yJyksXG4gIGtMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkOiBTeW1ib2woJ0ZpbGVSZWFkZXIgbGFzdCBwcm9ncmVzcyBldmVudCBmaXJlZCB0aW1lc3RhbXAnKSxcbiAga0V2ZW50czogU3ltYm9sKCdGaWxlUmVhZGVyIGV2ZW50cycpLFxuICBrQWJvcnRlZDogU3ltYm9sKCdGaWxlUmVhZGVyIGFib3J0ZWQnKVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5cbmNvbnN0IGtTdGF0ZSA9IFN5bWJvbCgnUHJvZ3Jlc3NFdmVudCBzdGF0ZScpXG5cbi8qKlxuICogQHNlZSBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3Byb2dyZXNzZXZlbnRcbiAqL1xuY2xhc3MgUHJvZ3Jlc3NFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgY29uc3RydWN0b3IgKHR5cGUsIGV2ZW50SW5pdERpY3QgPSB7fSkge1xuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSlcbiAgICBldmVudEluaXREaWN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUHJvZ3Jlc3NFdmVudEluaXQoZXZlbnRJbml0RGljdCA/PyB7fSlcblxuICAgIHN1cGVyKHR5cGUsIGV2ZW50SW5pdERpY3QpXG5cbiAgICB0aGlzW2tTdGF0ZV0gPSB7XG4gICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudEluaXREaWN0Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICBsb2FkZWQ6IGV2ZW50SW5pdERpY3QubG9hZGVkLFxuICAgICAgdG90YWw6IGV2ZW50SW5pdERpY3QudG90YWxcbiAgICB9XG4gIH1cblxuICBnZXQgbGVuZ3RoQ29tcHV0YWJsZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUHJvZ3Jlc3NFdmVudClcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubGVuZ3RoQ29tcHV0YWJsZVxuICB9XG5cbiAgZ2V0IGxvYWRlZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUHJvZ3Jlc3NFdmVudClcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubG9hZGVkXG4gIH1cblxuICBnZXQgdG90YWwgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFByb2dyZXNzRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnRvdGFsXG4gIH1cbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuUHJvZ3Jlc3NFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdsZW5ndGhDb21wdXRhYmxlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnbG9hZGVkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBsb25nIGxvbmcnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3RvdGFsJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBsb25nIGxvbmcnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ2J1YmJsZXMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjYW5jZWxhYmxlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY29tcG9zZWQnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH1cbl0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBQcm9ncmVzc0V2ZW50XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZW5jb2RpbmctZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IGxhYmVsXG4gKi9cbmZ1bmN0aW9uIGdldEVuY29kaW5nIChsYWJlbCkge1xuICBpZiAoIWxhYmVsKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gMS4gUmVtb3ZlIGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyBBU0NJSSB3aGl0ZXNwYWNlIGZyb20gbGFiZWwuXG4gIC8vIDIuIElmIGxhYmVsIGlzIGFuIEFTQ0lJIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yIGFueSBvZiB0aGVcbiAgLy8gICAgbGFiZWxzIGxpc3RlZCBpbiB0aGUgdGFibGUgYmVsb3csIHRoZW4gcmV0dXJuIHRoZVxuICAvLyAgICBjb3JyZXNwb25kaW5nIGVuY29kaW5nOyBvdGhlcndpc2UgcmV0dXJuIGZhaWx1cmUuXG4gIHN3aXRjaCAobGFiZWwudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICd1bmljb2RlLTEtMS11dGYtOCc6XG4gICAgY2FzZSAndW5pY29kZTExdXRmOCc6XG4gICAgY2FzZSAndW5pY29kZTIwdXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3gtdW5pY29kZTIwdXRmOCc6XG4gICAgICByZXR1cm4gJ1VURi04J1xuICAgIGNhc2UgJzg2Nic6XG4gICAgY2FzZSAnY3A4NjYnOlxuICAgIGNhc2UgJ2NzaWJtODY2JzpcbiAgICBjYXNlICdpYm04NjYnOlxuICAgICAgcmV0dXJuICdJQk04NjYnXG4gICAgY2FzZSAnY3Npc29sYXRpbjInOlxuICAgIGNhc2UgJ2lzby04ODU5LTInOlxuICAgIGNhc2UgJ2lzby1pci0xMDEnOlxuICAgIGNhc2UgJ2lzbzg4NTktMic6XG4gICAgY2FzZSAnaXNvODg1OTInOlxuICAgIGNhc2UgJ2lzb184ODU5LTInOlxuICAgIGNhc2UgJ2lzb184ODU5LTI6MTk4Nyc6XG4gICAgY2FzZSAnbDInOlxuICAgIGNhc2UgJ2xhdGluMic6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTInXG4gICAgY2FzZSAnY3Npc29sYXRpbjMnOlxuICAgIGNhc2UgJ2lzby04ODU5LTMnOlxuICAgIGNhc2UgJ2lzby1pci0xMDknOlxuICAgIGNhc2UgJ2lzbzg4NTktMyc6XG4gICAgY2FzZSAnaXNvODg1OTMnOlxuICAgIGNhc2UgJ2lzb184ODU5LTMnOlxuICAgIGNhc2UgJ2lzb184ODU5LTM6MTk4OCc6XG4gICAgY2FzZSAnbDMnOlxuICAgIGNhc2UgJ2xhdGluMyc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTMnXG4gICAgY2FzZSAnY3Npc29sYXRpbjQnOlxuICAgIGNhc2UgJ2lzby04ODU5LTQnOlxuICAgIGNhc2UgJ2lzby1pci0xMTAnOlxuICAgIGNhc2UgJ2lzbzg4NTktNCc6XG4gICAgY2FzZSAnaXNvODg1OTQnOlxuICAgIGNhc2UgJ2lzb184ODU5LTQnOlxuICAgIGNhc2UgJ2lzb184ODU5LTQ6MTk4OCc6XG4gICAgY2FzZSAnbDQnOlxuICAgIGNhc2UgJ2xhdGluNCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTQnXG4gICAgY2FzZSAnY3Npc29sYXRpbmN5cmlsbGljJzpcbiAgICBjYXNlICdjeXJpbGxpYyc6XG4gICAgY2FzZSAnaXNvLTg4NTktNSc6XG4gICAgY2FzZSAnaXNvLWlyLTE0NCc6XG4gICAgY2FzZSAnaXNvODg1OS01JzpcbiAgICBjYXNlICdpc284ODU5NSc6XG4gICAgY2FzZSAnaXNvXzg4NTktNSc6XG4gICAgY2FzZSAnaXNvXzg4NTktNToxOTg4JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktNSdcbiAgICBjYXNlICdhcmFiaWMnOlxuICAgIGNhc2UgJ2FzbW8tNzA4JzpcbiAgICBjYXNlICdjc2lzbzg4NTk2ZSc6XG4gICAgY2FzZSAnY3Npc284ODU5NmknOlxuICAgIGNhc2UgJ2NzaXNvbGF0aW5hcmFiaWMnOlxuICAgIGNhc2UgJ2VjbWEtMTE0JzpcbiAgICBjYXNlICdpc28tODg1OS02JzpcbiAgICBjYXNlICdpc28tODg1OS02LWUnOlxuICAgIGNhc2UgJ2lzby04ODU5LTYtaSc6XG4gICAgY2FzZSAnaXNvLWlyLTEyNyc6XG4gICAgY2FzZSAnaXNvODg1OS02JzpcbiAgICBjYXNlICdpc284ODU5Nic6XG4gICAgY2FzZSAnaXNvXzg4NTktNic6XG4gICAgY2FzZSAnaXNvXzg4NTktNjoxOTg3JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktNidcbiAgICBjYXNlICdjc2lzb2xhdGluZ3JlZWsnOlxuICAgIGNhc2UgJ2VjbWEtMTE4JzpcbiAgICBjYXNlICdlbG90XzkyOCc6XG4gICAgY2FzZSAnZ3JlZWsnOlxuICAgIGNhc2UgJ2dyZWVrOCc6XG4gICAgY2FzZSAnaXNvLTg4NTktNyc6XG4gICAgY2FzZSAnaXNvLWlyLTEyNic6XG4gICAgY2FzZSAnaXNvODg1OS03JzpcbiAgICBjYXNlICdpc284ODU5Nyc6XG4gICAgY2FzZSAnaXNvXzg4NTktNyc6XG4gICAgY2FzZSAnaXNvXzg4NTktNzoxOTg3JzpcbiAgICBjYXNlICdzdW5fZXVfZ3JlZWsnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS03J1xuICAgIGNhc2UgJ2NzaXNvODg1OThlJzpcbiAgICBjYXNlICdjc2lzb2xhdGluaGVicmV3JzpcbiAgICBjYXNlICdoZWJyZXcnOlxuICAgIGNhc2UgJ2lzby04ODU5LTgnOlxuICAgIGNhc2UgJ2lzby04ODU5LTgtZSc6XG4gICAgY2FzZSAnaXNvLWlyLTEzOCc6XG4gICAgY2FzZSAnaXNvODg1OS04JzpcbiAgICBjYXNlICdpc284ODU5OCc6XG4gICAgY2FzZSAnaXNvXzg4NTktOCc6XG4gICAgY2FzZSAnaXNvXzg4NTktODoxOTg4JzpcbiAgICBjYXNlICd2aXN1YWwnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS04J1xuICAgIGNhc2UgJ2NzaXNvODg1OThpJzpcbiAgICBjYXNlICdpc28tODg1OS04LWknOlxuICAgIGNhc2UgJ2xvZ2ljYWwnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS04LUknXG4gICAgY2FzZSAnY3Npc29sYXRpbjYnOlxuICAgIGNhc2UgJ2lzby04ODU5LTEwJzpcbiAgICBjYXNlICdpc28taXItMTU3JzpcbiAgICBjYXNlICdpc284ODU5LTEwJzpcbiAgICBjYXNlICdpc284ODU5MTAnOlxuICAgIGNhc2UgJ2w2JzpcbiAgICBjYXNlICdsYXRpbjYnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS0xMCdcbiAgICBjYXNlICdpc28tODg1OS0xMyc6XG4gICAgY2FzZSAnaXNvODg1OS0xMyc6XG4gICAgY2FzZSAnaXNvODg1OTEzJzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMTMnXG4gICAgY2FzZSAnaXNvLTg4NTktMTQnOlxuICAgIGNhc2UgJ2lzbzg4NTktMTQnOlxuICAgIGNhc2UgJ2lzbzg4NTkxNCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTE0J1xuICAgIGNhc2UgJ2NzaXNvbGF0aW45JzpcbiAgICBjYXNlICdpc28tODg1OS0xNSc6XG4gICAgY2FzZSAnaXNvODg1OS0xNSc6XG4gICAgY2FzZSAnaXNvODg1OTE1JzpcbiAgICBjYXNlICdpc29fODg1OS0xNSc6XG4gICAgY2FzZSAnbDknOlxuICAgICAgcmV0dXJuICdJU08tODg1OS0xNSdcbiAgICBjYXNlICdpc28tODg1OS0xNic6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTE2J1xuICAgIGNhc2UgJ2Nza29pOHInOlxuICAgIGNhc2UgJ2tvaSc6XG4gICAgY2FzZSAna29pOCc6XG4gICAgY2FzZSAna29pOC1yJzpcbiAgICBjYXNlICdrb2k4X3InOlxuICAgICAgcmV0dXJuICdLT0k4LVInXG4gICAgY2FzZSAna29pOC1ydSc6XG4gICAgY2FzZSAna29pOC11JzpcbiAgICAgIHJldHVybiAnS09JOC1VJ1xuICAgIGNhc2UgJ2NzbWFjaW50b3NoJzpcbiAgICBjYXNlICdtYWMnOlxuICAgIGNhc2UgJ21hY2ludG9zaCc6XG4gICAgY2FzZSAneC1tYWMtcm9tYW4nOlxuICAgICAgcmV0dXJuICdtYWNpbnRvc2gnXG4gICAgY2FzZSAnaXNvLTg4NTktMTEnOlxuICAgIGNhc2UgJ2lzbzg4NTktMTEnOlxuICAgIGNhc2UgJ2lzbzg4NTkxMSc6XG4gICAgY2FzZSAndGlzLTYyMCc6XG4gICAgY2FzZSAnd2luZG93cy04NzQnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTg3NCdcbiAgICBjYXNlICdjcDEyNTAnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1MCc6XG4gICAgY2FzZSAneC1jcDEyNTAnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTAnXG4gICAgY2FzZSAnY3AxMjUxJzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTEnOlxuICAgIGNhc2UgJ3gtY3AxMjUxJzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjUxJ1xuICAgIGNhc2UgJ2Fuc2lfeDMuNC0xOTY4JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnY3AxMjUyJzpcbiAgICBjYXNlICdjcDgxOSc6XG4gICAgY2FzZSAnY3Npc29sYXRpbjEnOlxuICAgIGNhc2UgJ2libTgxOSc6XG4gICAgY2FzZSAnaXNvLTg4NTktMSc6XG4gICAgY2FzZSAnaXNvLWlyLTEwMCc6XG4gICAgY2FzZSAnaXNvODg1OS0xJzpcbiAgICBjYXNlICdpc284ODU5MSc6XG4gICAgY2FzZSAnaXNvXzg4NTktMSc6XG4gICAgY2FzZSAnaXNvXzg4NTktMToxOTg3JzpcbiAgICBjYXNlICdsMSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICd1cy1hc2NpaSc6XG4gICAgY2FzZSAnd2luZG93cy0xMjUyJzpcbiAgICBjYXNlICd4LWNwMTI1Mic6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1MidcbiAgICBjYXNlICdjcDEyNTMnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1Myc6XG4gICAgY2FzZSAneC1jcDEyNTMnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTMnXG4gICAgY2FzZSAnY3AxMjU0JzpcbiAgICBjYXNlICdjc2lzb2xhdGluNSc6XG4gICAgY2FzZSAnaXNvLTg4NTktOSc6XG4gICAgY2FzZSAnaXNvLWlyLTE0OCc6XG4gICAgY2FzZSAnaXNvODg1OS05JzpcbiAgICBjYXNlICdpc284ODU5OSc6XG4gICAgY2FzZSAnaXNvXzg4NTktOSc6XG4gICAgY2FzZSAnaXNvXzg4NTktOToxOTg5JzpcbiAgICBjYXNlICdsNSc6XG4gICAgY2FzZSAnbGF0aW41JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTQnOlxuICAgIGNhc2UgJ3gtY3AxMjU0JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU0J1xuICAgIGNhc2UgJ2NwMTI1NSc6XG4gICAgY2FzZSAnd2luZG93cy0xMjU1JzpcbiAgICBjYXNlICd4LWNwMTI1NSc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1NSdcbiAgICBjYXNlICdjcDEyNTYnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1Nic6XG4gICAgY2FzZSAneC1jcDEyNTYnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTYnXG4gICAgY2FzZSAnY3AxMjU3JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTcnOlxuICAgIGNhc2UgJ3gtY3AxMjU3JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU3J1xuICAgIGNhc2UgJ2NwMTI1OCc6XG4gICAgY2FzZSAnd2luZG93cy0xMjU4JzpcbiAgICBjYXNlICd4LWNwMTI1OCc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1OCdcbiAgICBjYXNlICd4LW1hYy1jeXJpbGxpYyc6XG4gICAgY2FzZSAneC1tYWMtdWtyYWluaWFuJzpcbiAgICAgIHJldHVybiAneC1tYWMtY3lyaWxsaWMnXG4gICAgY2FzZSAnY2hpbmVzZSc6XG4gICAgY2FzZSAnY3NnYjIzMTInOlxuICAgIGNhc2UgJ2NzaXNvNThnYjIzMTI4MCc6XG4gICAgY2FzZSAnZ2IyMzEyJzpcbiAgICBjYXNlICdnYl8yMzEyJzpcbiAgICBjYXNlICdnYl8yMzEyLTgwJzpcbiAgICBjYXNlICdnYmsnOlxuICAgIGNhc2UgJ2lzby1pci01OCc6XG4gICAgY2FzZSAneC1nYmsnOlxuICAgICAgcmV0dXJuICdHQksnXG4gICAgY2FzZSAnZ2IxODAzMCc6XG4gICAgICByZXR1cm4gJ2diMTgwMzAnXG4gICAgY2FzZSAnYmlnNSc6XG4gICAgY2FzZSAnYmlnNS1oa3Njcyc6XG4gICAgY2FzZSAnY24tYmlnNSc6XG4gICAgY2FzZSAnY3NiaWc1JzpcbiAgICBjYXNlICd4LXgtYmlnNSc6XG4gICAgICByZXR1cm4gJ0JpZzUnXG4gICAgY2FzZSAnY3NldWNwa2RmbXRqYXBhbmVzZSc6XG4gICAgY2FzZSAnZXVjLWpwJzpcbiAgICBjYXNlICd4LWV1Yy1qcCc6XG4gICAgICByZXR1cm4gJ0VVQy1KUCdcbiAgICBjYXNlICdjc2lzbzIwMjJqcCc6XG4gICAgY2FzZSAnaXNvLTIwMjItanAnOlxuICAgICAgcmV0dXJuICdJU08tMjAyMi1KUCdcbiAgICBjYXNlICdjc3NoaWZ0amlzJzpcbiAgICBjYXNlICdtczkzMic6XG4gICAgY2FzZSAnbXNfa2FuamknOlxuICAgIGNhc2UgJ3NoaWZ0LWppcyc6XG4gICAgY2FzZSAnc2hpZnRfamlzJzpcbiAgICBjYXNlICdzamlzJzpcbiAgICBjYXNlICd3aW5kb3dzLTMxaic6XG4gICAgY2FzZSAneC1zamlzJzpcbiAgICAgIHJldHVybiAnU2hpZnRfSklTJ1xuICAgIGNhc2UgJ2NzZXVja3InOlxuICAgIGNhc2UgJ2Nza3NjNTYwMTE5ODcnOlxuICAgIGNhc2UgJ2V1Yy1rcic6XG4gICAgY2FzZSAnaXNvLWlyLTE0OSc6XG4gICAgY2FzZSAna29yZWFuJzpcbiAgICBjYXNlICdrc19jXzU2MDEtMTk4Nyc6XG4gICAgY2FzZSAna3NfY181NjAxLTE5ODknOlxuICAgIGNhc2UgJ2tzYzU2MDEnOlxuICAgIGNhc2UgJ2tzY181NjAxJzpcbiAgICBjYXNlICd3aW5kb3dzLTk0OSc6XG4gICAgICByZXR1cm4gJ0VVQy1LUidcbiAgICBjYXNlICdjc2lzbzIwMjJrcic6XG4gICAgY2FzZSAnaHotZ2ItMjMxMic6XG4gICAgY2FzZSAnaXNvLTIwMjItY24nOlxuICAgIGNhc2UgJ2lzby0yMDIyLWNuLWV4dCc6XG4gICAgY2FzZSAnaXNvLTIwMjIta3InOlxuICAgIGNhc2UgJ3JlcGxhY2VtZW50JzpcbiAgICAgIHJldHVybiAncmVwbGFjZW1lbnQnXG4gICAgY2FzZSAndW5pY29kZWZmZmUnOlxuICAgIGNhc2UgJ3V0Zi0xNmJlJzpcbiAgICAgIHJldHVybiAnVVRGLTE2QkUnXG4gICAgY2FzZSAnY3N1bmljb2RlJzpcbiAgICBjYXNlICdpc28tMTA2NDYtdWNzLTInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1bmljb2RlJzpcbiAgICBjYXNlICd1bmljb2RlZmVmZic6XG4gICAgY2FzZSAndXRmLTE2JzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gJ1VURi0xNkxFJ1xuICAgIGNhc2UgJ3gtdXNlci1kZWZpbmVkJzpcbiAgICAgIHJldHVybiAneC11c2VyLWRlZmluZWQnXG4gICAgZGVmYXVsdDogcmV0dXJuICdmYWlsdXJlJ1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRFbmNvZGluZ1xufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBrU3RhdGUsXG4gIGtFcnJvcixcbiAga1Jlc3VsdCxcbiAga0Fib3J0ZWQsXG4gIGtMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXG59ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgUHJvZ3Jlc3NFdmVudCB9ID0gcmVxdWlyZSgnLi9wcm9ncmVzc2V2ZW50JylcbmNvbnN0IHsgZ2V0RW5jb2RpbmcgfSA9IHJlcXVpcmUoJy4vZW5jb2RpbmcnKVxuY29uc3QgeyBET01FeGNlcHRpb24gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2NvbnN0YW50cycpXG5jb25zdCB7IHNlcmlhbGl6ZUFNaW1lVHlwZSwgcGFyc2VNSU1FVHlwZSB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YVVSTCcpXG5jb25zdCB7IHR5cGVzIH0gPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IHsgU3RyaW5nRGVjb2RlciB9ID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKVxuY29uc3QgeyBidG9hIH0gPSByZXF1aXJlKCdidWZmZXInKVxuXG4vKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi9cbmNvbnN0IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMgPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI3JlYWRPcGVyYXRpb25cbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ZpbGVyZWFkZXInKS5GaWxlUmVhZGVyfSBmclxuICogQHBhcmFtIHtpbXBvcnQoJ2J1ZmZlcicpLkJsb2J9IGJsb2JcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZz99IGVuY29kaW5nTmFtZVxuICovXG5mdW5jdGlvbiByZWFkT3BlcmF0aW9uIChmciwgYmxvYiwgdHlwZSwgZW5jb2RpbmdOYW1lKSB7XG4gIC8vIDEuIElmIGZy4oCZcyBzdGF0ZSBpcyBcImxvYWRpbmdcIiwgdGhyb3cgYW4gSW52YWxpZFN0YXRlRXJyb3JcbiAgLy8gICAgRE9NRXhjZXB0aW9uLlxuICBpZiAoZnJba1N0YXRlXSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignSW52YWxpZCBzdGF0ZScsICdJbnZhbGlkU3RhdGVFcnJvcicpXG4gIH1cblxuICAvLyAyLiBTZXQgZnLigJlzIHN0YXRlIHRvIFwibG9hZGluZ1wiLlxuICBmcltrU3RhdGVdID0gJ2xvYWRpbmcnXG5cbiAgLy8gMy4gU2V0IGZy4oCZcyByZXN1bHQgdG8gbnVsbC5cbiAgZnJba1Jlc3VsdF0gPSBudWxsXG5cbiAgLy8gNC4gU2V0IGZy4oCZcyBlcnJvciB0byBudWxsLlxuICBmcltrRXJyb3JdID0gbnVsbFxuXG4gIC8vIDUuIExldCBzdHJlYW0gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGdldCBzdHJlYW0gb24gYmxvYi5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbX0gKi9cbiAgY29uc3Qgc3RyZWFtID0gYmxvYi5zdHJlYW0oKVxuXG4gIC8vIDYuIExldCByZWFkZXIgYmUgdGhlIHJlc3VsdCBvZiBnZXR0aW5nIGEgcmVhZGVyIGZyb20gc3RyZWFtLlxuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKClcblxuICAvLyA3LiBMZXQgYnl0ZXMgYmUgYW4gZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgLyoqIEB0eXBlIHtVaW50OEFycmF5W119ICovXG4gIGNvbnN0IGJ5dGVzID0gW11cblxuICAvLyA4LiBMZXQgY2h1bmtQcm9taXNlIGJlIHRoZSByZXN1bHQgb2YgcmVhZGluZyBhIGNodW5rIGZyb21cbiAgLy8gICAgc3RyZWFtIHdpdGggcmVhZGVyLlxuICBsZXQgY2h1bmtQcm9taXNlID0gcmVhZGVyLnJlYWQoKVxuXG4gIC8vIDkuIExldCBpc0ZpcnN0Q2h1bmsgYmUgdHJ1ZS5cbiAgbGV0IGlzRmlyc3RDaHVuayA9IHRydWVcblxuICAvLyAxMC4gSW4gcGFyYWxsZWwsIHdoaWxlIHRydWU6XG4gIC8vIE5vdGU6IFwiSW4gcGFyYWxsZWxcIiBqdXN0IG1lYW5zIG5vbi1ibG9ja2luZ1xuICAvLyBOb3RlIDI6IHJlYWRPcGVyYXRpb24gaXRzZWxmIGNhbm5vdCBiZSBhc3luYyBhcyBkb3VibGVcbiAgLy8gcmVhZGluZyB0aGUgYm9keSB3b3VsZCB0aGVuIHJlamVjdCB0aGUgcHJvbWlzZSwgaW5zdGVhZFxuICAvLyBvZiB0aHJvd2luZyBhbiBlcnJvci5cbiAgOyhhc3luYyAoKSA9PiB7XG4gICAgd2hpbGUgKCFmcltrQWJvcnRlZF0pIHtcbiAgICAgIC8vIDEuIFdhaXQgZm9yIGNodW5rUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgb3IgcmVqZWN0ZWQuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBjaHVua1Byb21pc2VcblxuICAgICAgICAvLyAyLiBJZiBjaHVua1Byb21pc2UgaXMgZnVsZmlsbGVkLCBhbmQgaXNGaXJzdENodW5rIGlzXG4gICAgICAgIC8vICAgIHRydWUsIHF1ZXVlIGEgdGFzayB0byBmaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkXG4gICAgICAgIC8vICAgIGxvYWRzdGFydCBhdCBmci5cbiAgICAgICAgaWYgKGlzRmlyc3RDaHVuayAmJiAhZnJba0Fib3J0ZWRdKSB7XG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2Fkc3RhcnQnLCBmcilcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gU2V0IGlzRmlyc3RDaHVuayB0byBmYWxzZS5cbiAgICAgICAgaXNGaXJzdENodW5rID0gZmFsc2VcblxuICAgICAgICAvLyA0LiBJZiBjaHVua1Byb21pc2UgaXMgZnVsZmlsbGVkIHdpdGggYW4gb2JqZWN0IHdob3NlXG4gICAgICAgIC8vICAgIGRvbmUgcHJvcGVydHkgaXMgZmFsc2UgYW5kIHdob3NlIHZhbHVlIHByb3BlcnR5IGlzXG4gICAgICAgIC8vICAgIGEgVWludDhBcnJheSBvYmplY3QsIHJ1biB0aGVzZSBzdGVwczpcbiAgICAgICAgaWYgKCFkb25lICYmIHR5cGVzLmlzVWludDhBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyAxLiBMZXQgYnMgYmUgdGhlIGJ5dGUgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhlXG4gICAgICAgICAgLy8gICAgVWludDhBcnJheSBvYmplY3QuXG5cbiAgICAgICAgICAvLyAyLiBBcHBlbmQgYnMgdG8gYnl0ZXMuXG4gICAgICAgICAgYnl0ZXMucHVzaCh2YWx1ZSlcblxuICAgICAgICAgIC8vIDMuIElmIHJvdWdobHkgNTBtcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGVzZSBzdGVwc1xuICAgICAgICAgIC8vICAgIHdlcmUgbGFzdCBpbnZva2VkLCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhXG4gICAgICAgICAgLy8gICAgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIHByb2dyZXNzIGF0IGZyLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgZnJba0xhc3RQcm9ncmVzc0V2ZW50RmlyZWRdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGZyW2tMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXSA+PSA1MFxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgIWZyW2tBYm9ydGVkXVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZnJba0xhc3RQcm9ncmVzc0V2ZW50RmlyZWRdID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ3Byb2dyZXNzJywgZnIpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuIFNldCBjaHVua1Byb21pc2UgdG8gdGhlIHJlc3VsdCBvZiByZWFkaW5nIGFcbiAgICAgICAgICAvLyAgICBjaHVuayBmcm9tIHN0cmVhbSB3aXRoIHJlYWRlci5cbiAgICAgICAgICBjaHVua1Byb21pc2UgPSByZWFkZXIucmVhZCgpXG4gICAgICAgIH0gZWxzZSBpZiAoZG9uZSkge1xuICAgICAgICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgY2h1bmtQcm9taXNlIGlzIGZ1bGZpbGxlZCB3aXRoIGFuXG4gICAgICAgICAgLy8gICAgb2JqZWN0IHdob3NlIGRvbmUgcHJvcGVydHkgaXMgdHJ1ZSwgcXVldWUgYSB0YXNrXG4gICAgICAgICAgLy8gICAgdG8gcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgYW5kIGFib3J0IHRoaXMgYWxnb3JpdGhtOlxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIC8vIDEuIFNldCBmcuKAmXMgc3RhdGUgdG8gXCJkb25lXCIuXG4gICAgICAgICAgICBmcltrU3RhdGVdID0gJ2RvbmUnXG5cbiAgICAgICAgICAgIC8vIDIuIExldCByZXN1bHQgYmUgdGhlIHJlc3VsdCBvZiBwYWNrYWdlIGRhdGEgZ2l2ZW5cbiAgICAgICAgICAgIC8vICAgIGJ5dGVzLCB0eXBlLCBibG9i4oCZcyB0eXBlLCBhbmQgZW5jb2RpbmdOYW1lLlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFja2FnZURhdGEoYnl0ZXMsIHR5cGUsIGJsb2IudHlwZSwgZW5jb2RpbmdOYW1lKVxuXG4gICAgICAgICAgICAgIC8vIDQuIEVsc2U6XG5cbiAgICAgICAgICAgICAgaWYgKGZyW2tBYm9ydGVkXSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gMS4gU2V0IGZy4oCZcyByZXN1bHQgdG8gcmVzdWx0LlxuICAgICAgICAgICAgICBmcltrUmVzdWx0XSA9IHJlc3VsdFxuXG4gICAgICAgICAgICAgIC8vIDIuIEZpcmUgYSBwcm9ncmVzcyBldmVudCBjYWxsZWQgbG9hZCBhdCB0aGUgZnIuXG4gICAgICAgICAgICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnbG9hZCcsIGZyKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gMy4gSWYgcGFja2FnZSBkYXRhIHRocmV3IGFuIGV4Y2VwdGlvbiBlcnJvcjpcblxuICAgICAgICAgICAgICAvLyAxLiBTZXQgZnLigJlzIGVycm9yIHRvIGVycm9yLlxuICAgICAgICAgICAgICBmcltrRXJyb3JdID0gZXJyb3JcblxuICAgICAgICAgICAgICAvLyAyLiBGaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIGVycm9yIGF0IGZyLlxuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2Vycm9yJywgZnIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDUuIElmIGZy4oCZcyBzdGF0ZSBpcyBub3QgXCJsb2FkaW5nXCIsIGZpcmUgYSBwcm9ncmVzc1xuICAgICAgICAgICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgdGhlIGZyLlxuICAgICAgICAgICAgaWYgKGZyW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnLCBmcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGZyW2tBYm9ydGVkXSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNi4gT3RoZXJ3aXNlLCBpZiBjaHVua1Byb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCBhblxuICAgICAgICAvLyAgICBlcnJvciBlcnJvciwgcXVldWUgYSB0YXNrIHRvIHJ1biB0aGUgZm9sbG93aW5nXG4gICAgICAgIC8vICAgIHN0ZXBzIGFuZCBhYm9ydCB0aGlzIGFsZ29yaXRobTpcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgIC8vIDEuIFNldCBmcuKAmXMgc3RhdGUgdG8gXCJkb25lXCIuXG4gICAgICAgICAgZnJba1N0YXRlXSA9ICdkb25lJ1xuXG4gICAgICAgICAgLy8gMi4gU2V0IGZy4oCZcyBlcnJvciB0byBlcnJvci5cbiAgICAgICAgICBmcltrRXJyb3JdID0gZXJyb3JcblxuICAgICAgICAgIC8vIDMuIEZpcmUgYSBwcm9ncmVzcyBldmVudCBjYWxsZWQgZXJyb3IgYXQgZnIuXG4gICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdlcnJvcicsIGZyKVxuXG4gICAgICAgICAgLy8gNC4gSWYgZnLigJlzIHN0YXRlIGlzIG5vdCBcImxvYWRpbmdcIiwgZmlyZSBhIHByb2dyZXNzXG4gICAgICAgICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgZnIuXG4gICAgICAgICAgaWYgKGZyW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2FkZW5kJywgZnIpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9KSgpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZmlyZS1hLXByb2dyZXNzLWV2ZW50XG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ldmVudC1maXJlXG4gKiBAcGFyYW0ge3N0cmluZ30gZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ZpbGVyZWFkZXInKS5GaWxlUmVhZGVyfSByZWFkZXJcbiAqL1xuZnVuY3Rpb24gZmlyZUFQcm9ncmVzc0V2ZW50IChlLCByZWFkZXIpIHtcbiAgLy8gVGhlIHByb2dyZXNzIGV2ZW50IGUgZG9lcyBub3QgYnViYmxlLiBlLmJ1YmJsZXMgbXVzdCBiZSBmYWxzZVxuICAvLyBUaGUgcHJvZ3Jlc3MgZXZlbnQgZSBpcyBOT1QgY2FuY2VsYWJsZS4gZS5jYW5jZWxhYmxlIG11c3QgYmUgZmFsc2VcbiAgY29uc3QgZXZlbnQgPSBuZXcgUHJvZ3Jlc3NFdmVudChlLCB7XG4gICAgYnViYmxlczogZmFsc2UsXG4gICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgfSlcblxuICByZWFkZXIuZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNibG9iLXBhY2thZ2UtZGF0YVxuICogQHBhcmFtIHtVaW50OEFycmF5W119IGJ5dGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmc/fSBtaW1lVHlwZVxuICogQHBhcmFtIHtzdHJpbmc/fSBlbmNvZGluZ05hbWVcbiAqL1xuZnVuY3Rpb24gcGFja2FnZURhdGEgKGJ5dGVzLCB0eXBlLCBtaW1lVHlwZSwgZW5jb2RpbmdOYW1lKSB7XG4gIC8vIDEuIEEgQmxvYiBoYXMgYW4gYXNzb2NpYXRlZCBwYWNrYWdlIGRhdGEgYWxnb3JpdGhtLCBnaXZlblxuICAvLyAgICBieXRlcywgYSB0eXBlLCBhIG9wdGlvbmFsIG1pbWVUeXBlLCBhbmQgYSBvcHRpb25hbFxuICAvLyAgICBlbmNvZGluZ05hbWUsIHdoaWNoIHN3aXRjaGVzIG9uIHR5cGUgYW5kIHJ1bnMgdGhlXG4gIC8vICAgIGFzc29jaWF0ZWQgc3RlcHM6XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnRGF0YVVSTCc6IHtcbiAgICAgIC8vIDEuIFJldHVybiBieXRlcyBhcyBhIERhdGFVUkwgW1JGQzIzOTddIHN1YmplY3QgdG9cbiAgICAgIC8vICAgIHRoZSBjb25zaWRlcmF0aW9ucyBiZWxvdzpcbiAgICAgIC8vICAqIFVzZSBtaW1lVHlwZSBhcyBwYXJ0IG9mIHRoZSBEYXRhIFVSTCBpZiBpdCBpc1xuICAgICAgLy8gICAgYXZhaWxhYmxlIGluIGtlZXBpbmcgd2l0aCB0aGUgRGF0YSBVUkxcbiAgICAgIC8vICAgIHNwZWNpZmljYXRpb24gW1JGQzIzOTddLlxuICAgICAgLy8gICogSWYgbWltZVR5cGUgaXMgbm90IGF2YWlsYWJsZSByZXR1cm4gYSBEYXRhIFVSTFxuICAgICAgLy8gICAgd2l0aG91dCBhIG1lZGlhLXR5cGUuIFtSRkMyMzk3XS5cblxuICAgICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMyMzk3I3NlY3Rpb24tM1xuICAgICAgLy8gZGF0YXVybCAgICA6PSBcImRhdGE6XCIgWyBtZWRpYXR5cGUgXSBbIFwiO2Jhc2U2NFwiIF0gXCIsXCIgZGF0YVxuICAgICAgLy8gbWVkaWF0eXBlICA6PSBbIHR5cGUgXCIvXCIgc3VidHlwZSBdICooIFwiO1wiIHBhcmFtZXRlciApXG4gICAgICAvLyBkYXRhICAgICAgIDo9ICp1cmxjaGFyXG4gICAgICAvLyBwYXJhbWV0ZXIgIDo9IGF0dHJpYnV0ZSBcIj1cIiB2YWx1ZVxuICAgICAgbGV0IGRhdGFVUkwgPSAnZGF0YTonXG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTUlNRVR5cGUobWltZVR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpXG5cbiAgICAgIGlmIChwYXJzZWQgIT09ICdmYWlsdXJlJykge1xuICAgICAgICBkYXRhVVJMICs9IHNlcmlhbGl6ZUFNaW1lVHlwZShwYXJzZWQpXG4gICAgICB9XG5cbiAgICAgIGRhdGFVUkwgKz0gJztiYXNlNjQsJ1xuXG4gICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoJ2xhdGluMScpXG5cbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgYnl0ZXMpIHtcbiAgICAgICAgZGF0YVVSTCArPSBidG9hKGRlY29kZXIud3JpdGUoY2h1bmspKVxuICAgICAgfVxuXG4gICAgICBkYXRhVVJMICs9IGJ0b2EoZGVjb2Rlci5lbmQoKSlcblxuICAgICAgcmV0dXJuIGRhdGFVUkxcbiAgICB9XG4gICAgY2FzZSAnVGV4dCc6IHtcbiAgICAgIC8vIDEuIExldCBlbmNvZGluZyBiZSBmYWlsdXJlXG4gICAgICBsZXQgZW5jb2RpbmcgPSAnZmFpbHVyZSdcblxuICAgICAgLy8gMi4gSWYgdGhlIGVuY29kaW5nTmFtZSBpcyBwcmVzZW50LCBzZXQgZW5jb2RpbmcgdG8gdGhlXG4gICAgICAvLyAgICByZXN1bHQgb2YgZ2V0dGluZyBhbiBlbmNvZGluZyBmcm9tIGVuY29kaW5nTmFtZS5cbiAgICAgIGlmIChlbmNvZGluZ05hbWUpIHtcbiAgICAgICAgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyhlbmNvZGluZ05hbWUpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIElmIGVuY29kaW5nIGlzIGZhaWx1cmUsIGFuZCBtaW1lVHlwZSBpcyBwcmVzZW50OlxuICAgICAgaWYgKGVuY29kaW5nID09PSAnZmFpbHVyZScgJiYgbWltZVR5cGUpIHtcbiAgICAgICAgLy8gMS4gTGV0IHR5cGUgYmUgdGhlIHJlc3VsdCBvZiBwYXJzZSBhIE1JTUUgdHlwZVxuICAgICAgICAvLyAgICBnaXZlbiBtaW1lVHlwZS5cbiAgICAgICAgY29uc3QgdHlwZSA9IHBhcnNlTUlNRVR5cGUobWltZVR5cGUpXG5cbiAgICAgICAgLy8gMi4gSWYgdHlwZSBpcyBub3QgZmFpbHVyZSwgc2V0IGVuY29kaW5nIHRvIHRoZSByZXN1bHRcbiAgICAgICAgLy8gICAgb2YgZ2V0dGluZyBhbiBlbmNvZGluZyBmcm9tIHR5cGXigJlzIHBhcmFtZXRlcnNbXCJjaGFyc2V0XCJdLlxuICAgICAgICBpZiAodHlwZSAhPT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyh0eXBlLnBhcmFtZXRlcnMuZ2V0KCdjaGFyc2V0JykpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgZW5jb2RpbmcgaXMgZmFpbHVyZSwgdGhlbiBzZXQgZW5jb2RpbmcgdG8gVVRGLTguXG4gICAgICBpZiAoZW5jb2RpbmcgPT09ICdmYWlsdXJlJykge1xuICAgICAgICBlbmNvZGluZyA9ICdVVEYtOCdcbiAgICAgIH1cblxuICAgICAgLy8gNS4gRGVjb2RlIGJ5dGVzIHVzaW5nIGZhbGxiYWNrIGVuY29kaW5nIGVuY29kaW5nLCBhbmRcbiAgICAgIC8vICAgIHJldHVybiB0aGUgcmVzdWx0LlxuICAgICAgcmV0dXJuIGRlY29kZShieXRlcywgZW5jb2RpbmcpXG4gICAgfVxuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzoge1xuICAgICAgLy8gUmV0dXJuIGEgbmV3IEFycmF5QnVmZmVyIHdob3NlIGNvbnRlbnRzIGFyZSBieXRlcy5cbiAgICAgIGNvbnN0IHNlcXVlbmNlID0gY29tYmluZUJ5dGVTZXF1ZW5jZXMoYnl0ZXMpXG5cbiAgICAgIHJldHVybiBzZXF1ZW5jZS5idWZmZXJcbiAgICB9XG4gICAgY2FzZSAnQmluYXJ5U3RyaW5nJzoge1xuICAgICAgLy8gUmV0dXJuIGJ5dGVzIGFzIGEgYmluYXJ5IHN0cmluZywgaW4gd2hpY2ggZXZlcnkgYnl0ZVxuICAgICAgLy8gIGlzIHJlcHJlc2VudGVkIGJ5IGEgY29kZSB1bml0IG9mIGVxdWFsIHZhbHVlIFswLi4yNTVdLlxuICAgICAgbGV0IGJpbmFyeVN0cmluZyA9ICcnXG5cbiAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcignbGF0aW4xJylcblxuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBieXRlcykge1xuICAgICAgICBiaW5hcnlTdHJpbmcgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICAgIH1cblxuICAgICAgYmluYXJ5U3RyaW5nICs9IGRlY29kZXIuZW5kKClcblxuICAgICAgcmV0dXJuIGJpbmFyeVN0cmluZ1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2RlY29kZVxuICogQHBhcmFtIHtVaW50OEFycmF5W119IGlvUXVldWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZ1xuICovXG5mdW5jdGlvbiBkZWNvZGUgKGlvUXVldWUsIGVuY29kaW5nKSB7XG4gIGNvbnN0IGJ5dGVzID0gY29tYmluZUJ5dGVTZXF1ZW5jZXMoaW9RdWV1ZSlcblxuICAvLyAxLiBMZXQgQk9NRW5jb2RpbmcgYmUgdGhlIHJlc3VsdCBvZiBCT00gc25pZmZpbmcgaW9RdWV1ZS5cbiAgY29uc3QgQk9NRW5jb2RpbmcgPSBCT01TbmlmZmluZyhieXRlcylcblxuICBsZXQgc2xpY2UgPSAwXG5cbiAgLy8gMi4gSWYgQk9NRW5jb2RpbmcgaXMgbm9uLW51bGw6XG4gIGlmIChCT01FbmNvZGluZyAhPT0gbnVsbCkge1xuICAgIC8vIDEuIFNldCBlbmNvZGluZyB0byBCT01FbmNvZGluZy5cbiAgICBlbmNvZGluZyA9IEJPTUVuY29kaW5nXG5cbiAgICAvLyAyLiBSZWFkIHRocmVlIGJ5dGVzIGZyb20gaW9RdWV1ZSwgaWYgQk9NRW5jb2RpbmcgaXNcbiAgICAvLyAgICBVVEYtODsgb3RoZXJ3aXNlIHJlYWQgdHdvIGJ5dGVzLlxuICAgIC8vICAgIChEbyBub3RoaW5nIHdpdGggdGhvc2UgYnl0ZXMuKVxuICAgIHNsaWNlID0gQk9NRW5jb2RpbmcgPT09ICdVVEYtOCcgPyAzIDogMlxuICB9XG5cbiAgLy8gMy4gUHJvY2VzcyBhIHF1ZXVlIHdpdGggYW4gaW5zdGFuY2Ugb2YgZW5jb2RpbmfigJlzXG4gIC8vICAgIGRlY29kZXIsIGlvUXVldWUsIG91dHB1dCwgYW5kIFwicmVwbGFjZW1lbnRcIi5cblxuICAvLyA0LiBSZXR1cm4gb3V0cHV0LlxuXG4gIGNvbnN0IHNsaWNlZCA9IGJ5dGVzLnNsaWNlKHNsaWNlKVxuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKS5kZWNvZGUoc2xpY2VkKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2JvbS1zbmlmZlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpb1F1ZXVlXG4gKi9cbmZ1bmN0aW9uIEJPTVNuaWZmaW5nIChpb1F1ZXVlKSB7XG4gIC8vIDEuIExldCBCT00gYmUgdGhlIHJlc3VsdCBvZiBwZWVraW5nIDMgYnl0ZXMgZnJvbSBpb1F1ZXVlLFxuICAvLyAgICBjb252ZXJ0ZWQgdG8gYSBieXRlIHNlcXVlbmNlLlxuICBjb25zdCBbYSwgYiwgY10gPSBpb1F1ZXVlXG5cbiAgLy8gMi4gRm9yIGVhY2ggb2YgdGhlIHJvd3MgaW4gdGhlIHRhYmxlIGJlbG93LCBzdGFydGluZyB3aXRoXG4gIC8vICAgIHRoZSBmaXJzdCBvbmUgYW5kIGdvaW5nIGRvd24sIGlmIEJPTSBzdGFydHMgd2l0aCB0aGVcbiAgLy8gICAgYnl0ZXMgZ2l2ZW4gaW4gdGhlIGZpcnN0IGNvbHVtbiwgdGhlbiByZXR1cm4gdGhlXG4gIC8vICAgIGVuY29kaW5nIGdpdmVuIGluIHRoZSBjZWxsIGluIHRoZSBzZWNvbmQgY29sdW1uIG9mIHRoYXRcbiAgLy8gICAgcm93LiBPdGhlcndpc2UsIHJldHVybiBudWxsLlxuICBpZiAoYSA9PT0gMHhFRiAmJiBiID09PSAweEJCICYmIGMgPT09IDB4QkYpIHtcbiAgICByZXR1cm4gJ1VURi04J1xuICB9IGVsc2UgaWYgKGEgPT09IDB4RkUgJiYgYiA9PT0gMHhGRikge1xuICAgIHJldHVybiAnVVRGLTE2QkUnXG4gIH0gZWxzZSBpZiAoYSA9PT0gMHhGRiAmJiBiID09PSAweEZFKSB7XG4gICAgcmV0dXJuICdVVEYtMTZMRSdcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5W119IHNlcXVlbmNlc1xuICovXG5mdW5jdGlvbiBjb21iaW5lQnl0ZVNlcXVlbmNlcyAoc2VxdWVuY2VzKSB7XG4gIGNvbnN0IHNpemUgPSBzZXF1ZW5jZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGEgKyBiLmJ5dGVMZW5ndGhcbiAgfSwgMClcblxuICBsZXQgb2Zmc2V0ID0gMFxuXG4gIHJldHVybiBzZXF1ZW5jZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgYS5zZXQoYiwgb2Zmc2V0KVxuICAgIG9mZnNldCArPSBiLmJ5dGVMZW5ndGhcbiAgICByZXR1cm4gYVxuICB9LCBuZXcgVWludDhBcnJheShzaXplKSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHJlYWRPcGVyYXRpb24sXG4gIGZpcmVBUHJvZ3Jlc3NFdmVudFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICByZWFkT3BlcmF0aW9uLFxuICBmaXJlQVByb2dyZXNzRXZlbnRcbn0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3Qge1xuICBrU3RhdGUsXG4gIGtFcnJvcixcbiAga1Jlc3VsdCxcbiAga0V2ZW50cyxcbiAga0Fib3J0ZWRcbn0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmNsYXNzIEZpbGVSZWFkZXIgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tTdGF0ZV0gPSAnZW1wdHknXG4gICAgdGhpc1trUmVzdWx0XSA9IG51bGxcbiAgICB0aGlzW2tFcnJvcl0gPSBudWxsXG4gICAgdGhpc1trRXZlbnRzXSA9IHtcbiAgICAgIGxvYWRlbmQ6IG51bGwsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGFib3J0OiBudWxsLFxuICAgICAgbG9hZDogbnVsbCxcbiAgICAgIHByb2dyZXNzOiBudWxsLFxuICAgICAgbG9hZHN0YXJ0OiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2Rmbi1yZWFkQXNBcnJheUJ1ZmZlclxuICAgKiBAcGFyYW0ge2ltcG9ydCgnYnVmZmVyJykuQmxvYn0gYmxvYlxuICAgKi9cbiAgcmVhZEFzQXJyYXlCdWZmZXIgKGJsb2IpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0ZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXInIH0pXG5cbiAgICBibG9iID0gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihibG9iLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICAgIC8vIFRoZSByZWFkQXNBcnJheUJ1ZmZlcihibG9iKSBtZXRob2QsIHdoZW4gaW52b2tlZCxcbiAgICAvLyBtdXN0IGluaXRpYXRlIGEgcmVhZCBvcGVyYXRpb24gZm9yIGJsb2Igd2l0aCBBcnJheUJ1ZmZlci5cbiAgICByZWFkT3BlcmF0aW9uKHRoaXMsIGJsb2IsICdBcnJheUJ1ZmZlcicpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jcmVhZEFzQmluYXJ5U3RyaW5nXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdidWZmZXInKS5CbG9ifSBibG9iXG4gICAqL1xuICByZWFkQXNCaW5hcnlTdHJpbmcgKGJsb2IpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0ZpbGVSZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nJyB9KVxuXG4gICAgYmxvYiA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoYmxvYiwgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgICAvLyBUaGUgcmVhZEFzQmluYXJ5U3RyaW5nKGJsb2IpIG1ldGhvZCwgd2hlbiBpbnZva2VkLFxuICAgIC8vIG11c3QgaW5pdGlhdGUgYSByZWFkIG9wZXJhdGlvbiBmb3IgYmxvYiB3aXRoIEJpbmFyeVN0cmluZy5cbiAgICByZWFkT3BlcmF0aW9uKHRoaXMsIGJsb2IsICdCaW5hcnlTdHJpbmcnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI3JlYWRBc0RhdGFUZXh0XG4gICAqIEBwYXJhbSB7aW1wb3J0KCdidWZmZXInKS5CbG9ifSBibG9iXG4gICAqIEBwYXJhbSB7c3RyaW5nP30gZW5jb2RpbmdcbiAgICovXG4gIHJlYWRBc1RleHQgKGJsb2IsIGVuY29kaW5nID0gdW5kZWZpbmVkKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGaWxlUmVhZGVyLnJlYWRBc1RleHQnIH0pXG5cbiAgICBibG9iID0gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihibG9iLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmNvZGluZyA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhlbmNvZGluZylcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVhZEFzVGV4dChibG9iLCBlbmNvZGluZykgbWV0aG9kLCB3aGVuIGludm9rZWQsXG4gICAgLy8gbXVzdCBpbml0aWF0ZSBhIHJlYWQgb3BlcmF0aW9uIGZvciBibG9iIHdpdGggVGV4dCBhbmQgZW5jb2RpbmcuXG4gICAgcmVhZE9wZXJhdGlvbih0aGlzLCBibG9iLCAnVGV4dCcsIGVuY29kaW5nKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2Rmbi1yZWFkQXNEYXRhVVJMXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdidWZmZXInKS5CbG9ifSBibG9iXG4gICAqL1xuICByZWFkQXNEYXRhVVJMIChibG9iKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwnIH0pXG5cbiAgICBibG9iID0gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihibG9iLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICAgIC8vIFRoZSByZWFkQXNEYXRhVVJMKGJsb2IpIG1ldGhvZCwgd2hlbiBpbnZva2VkLCBtdXN0XG4gICAgLy8gaW5pdGlhdGUgYSByZWFkIG9wZXJhdGlvbiBmb3IgYmxvYiB3aXRoIERhdGFVUkwuXG4gICAgcmVhZE9wZXJhdGlvbih0aGlzLCBibG9iLCAnRGF0YVVSTCcpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZGZuLWFib3J0XG4gICAqL1xuICBhYm9ydCAoKSB7XG4gICAgLy8gMS4gSWYgdGhpcydzIHN0YXRlIGlzIFwiZW1wdHlcIiBvciBpZiB0aGlzJ3Mgc3RhdGUgaXNcbiAgICAvLyAgICBcImRvbmVcIiBzZXQgdGhpcydzIHJlc3VsdCB0byBudWxsIGFuZCB0ZXJtaW5hdGVcbiAgICAvLyAgICB0aGlzIGFsZ29yaXRobS5cbiAgICBpZiAodGhpc1trU3RhdGVdID09PSAnZW1wdHknIHx8IHRoaXNba1N0YXRlXSA9PT0gJ2RvbmUnKSB7XG4gICAgICB0aGlzW2tSZXN1bHRdID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gMi4gSWYgdGhpcydzIHN0YXRlIGlzIFwibG9hZGluZ1wiIHNldCB0aGlzJ3Mgc3RhdGUgdG9cbiAgICAvLyAgICBcImRvbmVcIiBhbmQgc2V0IHRoaXMncyByZXN1bHQgdG8gbnVsbC5cbiAgICBpZiAodGhpc1trU3RhdGVdID09PSAnbG9hZGluZycpIHtcbiAgICAgIHRoaXNba1N0YXRlXSA9ICdkb25lJ1xuICAgICAgdGhpc1trUmVzdWx0XSA9IG51bGxcbiAgICB9XG5cbiAgICAvLyAzLiBJZiB0aGVyZSBhcmUgYW55IHRhc2tzIGZyb20gdGhpcyBvbiB0aGUgZmlsZSByZWFkaW5nXG4gICAgLy8gICAgdGFzayBzb3VyY2UgaW4gYW4gYWZmaWxpYXRlZCB0YXNrIHF1ZXVlLCB0aGVuIHJlbW92ZVxuICAgIC8vICAgIHRob3NlIHRhc2tzIGZyb20gdGhhdCB0YXNrIHF1ZXVlLlxuICAgIHRoaXNba0Fib3J0ZWRdID0gdHJ1ZVxuXG4gICAgLy8gNC4gVGVybWluYXRlIHRoZSBhbGdvcml0aG0gZm9yIHRoZSByZWFkIG1ldGhvZCBiZWluZyBwcm9jZXNzZWQuXG4gICAgLy8gVE9ET1xuXG4gICAgLy8gNS4gRmlyZSBhIHByb2dyZXNzIGV2ZW50IGNhbGxlZCBhYm9ydCBhdCB0aGlzLlxuICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnYWJvcnQnLCB0aGlzKVxuXG4gICAgLy8gNi4gSWYgdGhpcydzIHN0YXRlIGlzIG5vdCBcImxvYWRpbmdcIiwgZmlyZSBhIHByb2dyZXNzXG4gICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgdGhpcy5cbiAgICBpZiAodGhpc1trU3RhdGVdICE9PSAnbG9hZGluZycpIHtcbiAgICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcsIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLXJlYWR5c3RhdGVcbiAgICovXG4gIGdldCByZWFkeVN0YXRlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgc3dpdGNoICh0aGlzW2tTdGF0ZV0pIHtcbiAgICAgIGNhc2UgJ2VtcHR5JzogcmV0dXJuIHRoaXMuRU1QVFlcbiAgICAgIGNhc2UgJ2xvYWRpbmcnOiByZXR1cm4gdGhpcy5MT0FESU5HXG4gICAgICBjYXNlICdkb25lJzogcmV0dXJuIHRoaXMuRE9ORVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkb20tZmlsZXJlYWRlci1yZXN1bHRcbiAgICovXG4gIGdldCByZXN1bHQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICAvLyBUaGUgcmVzdWx0IGF0dHJpYnV0ZeKAmXMgZ2V0dGVyLCB3aGVuIGludm9rZWQsIG11c3QgcmV0dXJuXG4gICAgLy8gdGhpcydzIHJlc3VsdC5cbiAgICByZXR1cm4gdGhpc1trUmVzdWx0XVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLWVycm9yXG4gICAqL1xuICBnZXQgZXJyb3IgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICAvLyBUaGUgZXJyb3IgYXR0cmlidXRl4oCZcyBnZXR0ZXIsIHdoZW4gaW52b2tlZCwgbXVzdCByZXR1cm5cbiAgICAvLyB0aGlzJ3MgZXJyb3IuXG4gICAgcmV0dXJuIHRoaXNba0Vycm9yXVxuICB9XG5cbiAgZ2V0IG9ubG9hZGVuZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLmxvYWRlbmRcbiAgfVxuXG4gIHNldCBvbmxvYWRlbmQgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLmxvYWRlbmQpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVuZCcsIHRoaXNba0V2ZW50c10ubG9hZGVuZClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmxvYWRlbmQgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdsb2FkZW5kJywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0V2ZW50c10ubG9hZGVuZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25lcnJvciAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLmVycm9yXG4gIH1cblxuICBzZXQgb25lcnJvciAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10uZXJyb3IpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzW2tFdmVudHNdLmVycm9yKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10uZXJyb3IgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmVycm9yID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmxvYWRzdGFydCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLmxvYWRzdGFydFxuICB9XG5cbiAgc2V0IG9ubG9hZHN0YXJ0IChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZHN0YXJ0JywgdGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdsb2Fkc3RhcnQnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9ucHJvZ3Jlc3MgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICByZXR1cm4gdGhpc1trRXZlbnRzXS5wcm9ncmVzc1xuICB9XG5cbiAgc2V0IG9ucHJvZ3Jlc3MgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLnByb2dyZXNzKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdGhpc1trRXZlbnRzXS5wcm9ncmVzcylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLnByb2dyZXNzID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5wcm9ncmVzcyA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25sb2FkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10ubG9hZFxuICB9XG5cbiAgc2V0IG9ubG9hZCAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10ubG9hZCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgdGhpc1trRXZlbnRzXS5sb2FkKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10ubG9hZCA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2FkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmFib3J0ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10uYWJvcnRcbiAgfVxuXG4gIHNldCBvbmFib3J0IChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5hYm9ydCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXNba0V2ZW50c10uYWJvcnQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5hYm9ydCA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0V2ZW50c10uYWJvcnQgPSBudWxsXG4gICAgfVxuICB9XG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkb20tZmlsZXJlYWRlci1lbXB0eVxuRmlsZVJlYWRlci5FTVBUWSA9IEZpbGVSZWFkZXIucHJvdG90eXBlLkVNUFRZID0gMFxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLWxvYWRpbmdcbkZpbGVSZWFkZXIuTE9BRElORyA9IEZpbGVSZWFkZXIucHJvdG90eXBlLkxPQURJTkcgPSAxXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZG9tLWZpbGVyZWFkZXItZG9uZVxuRmlsZVJlYWRlci5ET05FID0gRmlsZVJlYWRlci5wcm90b3R5cGUuRE9ORSA9IDJcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRmlsZVJlYWRlci5wcm90b3R5cGUsIHtcbiAgRU1QVFk6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIExPQURJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIERPTkU6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHJlYWRBc0FycmF5QnVmZmVyOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkQXNCaW5hcnlTdHJpbmc6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlYWRBc1RleHQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlYWRBc0RhdGFVUkw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGFib3J0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkeVN0YXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZXN1bHQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmxvYWRzdGFydDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25wcm9ncmVzczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25sb2FkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmFib3J0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmxvYWRlbmQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdGaWxlUmVhZGVyJyxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZpbGVSZWFkZXIsIHtcbiAgRU1QVFk6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIExPQURJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIERPTkU6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnNcbn0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBGaWxlUmVhZGVyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga0NvbnN0cnVjdDogcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJykua0NvbnN0cnVjdFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YVVSTCcpXG5jb25zdCB7IGlzVmFsaWRIZWFkZXJOYW1lIH0gPSByZXF1aXJlKCcuLi9mZXRjaC91dGlsJylcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC11cmwtZXF1YWxzXG4gKiBAcGFyYW0ge1VSTH0gQVxuICogQHBhcmFtIHtVUkx9IEJcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gZXhjbHVkZUZyYWdtZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdXJsRXF1YWxzIChBLCBCLCBleGNsdWRlRnJhZ21lbnQgPSBmYWxzZSkge1xuICBjb25zdCBzZXJpYWxpemVkQSA9IFVSTFNlcmlhbGl6ZXIoQSwgZXhjbHVkZUZyYWdtZW50KVxuXG4gIGNvbnN0IHNlcmlhbGl6ZWRCID0gVVJMU2VyaWFsaXplcihCLCBleGNsdWRlRnJhZ21lbnQpXG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWRBID09PSBzZXJpYWxpemVkQlxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nocm9taXVtL2Nocm9taXVtL2Jsb2IvNjk0ZDIwZDEzNGNiNTUzZDhkODllNTUwMGI5MTQ4MDEyYjFiYTI5OS9jb250ZW50L2Jyb3dzZXIvY2FjaGVfc3RvcmFnZS9jYWNoZV9zdG9yYWdlX2NhY2hlLmNjI0wyNjAtTDI2MlxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICovXG5mdW5jdGlvbiBmaWVsZFZhbHVlcyAoaGVhZGVyKSB7XG4gIGFzc2VydChoZWFkZXIgIT09IG51bGwpXG5cbiAgY29uc3QgdmFsdWVzID0gW11cblxuICBmb3IgKGxldCB2YWx1ZSBvZiBoZWFkZXIuc3BsaXQoJywnKSkge1xuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpXG5cbiAgICBpZiAoIXZhbHVlLmxlbmd0aCkge1xuICAgICAgY29udGludWVcbiAgICB9IGVsc2UgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZSh2YWx1ZSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdmFsdWVzLnB1c2godmFsdWUpXG4gIH1cblxuICByZXR1cm4gdmFsdWVzXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB1cmxFcXVhbHMsXG4gIGZpZWxkVmFsdWVzXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGtDb25zdHJ1Y3QgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IHVybEVxdWFscywgZmllbGRWYWx1ZXM6IGdldEZpZWxkVmFsdWVzIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5LCBpc0Rpc3R1cmJlZCB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IFJlc3BvbnNlLCBjbG9uZVJlc3BvbnNlIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9yZXNwb25zZScpXG5jb25zdCB7IFJlcXVlc3QgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3JlcXVlc3QnKVxuY29uc3QgeyBrU3RhdGUsIGtIZWFkZXJzLCBrR3VhcmQsIGtSZWFsbSB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvc3ltYm9scycpXG5jb25zdCB7IGZldGNoaW5nIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9pbmRleCcpXG5jb25zdCB7IHVybElzSHR0cEh0dHBzU2NoZW1lLCBjcmVhdGVEZWZlcnJlZFByb21pc2UsIHJlYWRBbGxCeXRlcyB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvdXRpbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBnZXRHbG9iYWxEaXNwYXRjaGVyIH0gPSByZXF1aXJlKCcuLi9nbG9iYWwnKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2Rmbi1jYWNoZS1iYXRjaC1vcGVyYXRpb25cbiAqIEB0eXBlZGVmIHtPYmplY3R9IENhY2hlQmF0Y2hPcGVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7J2RlbGV0ZScgfCAncHV0J30gdHlwZVxuICogQHByb3BlcnR5IHthbnl9IHJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7YW55fSByZXNwb25zZVxuICogQHByb3BlcnR5IHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NhY2hlJykuQ2FjaGVRdWVyeU9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2Rmbi1yZXF1ZXN0LXJlc3BvbnNlLWxpc3RcbiAqIEB0eXBlZGVmIHtbYW55LCBhbnldW119IHJlcXVlc3RSZXNwb25zZUxpc3RcbiAqL1xuXG5jbGFzcyBDYWNoZSB7XG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkZm4tcmVsZXZhbnQtcmVxdWVzdC1yZXNwb25zZS1saXN0XG4gICAqIEB0eXBlIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fVxuICAgKi9cbiAgI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdFxuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBpZiAoYXJndW1lbnRzWzBdICE9PSBrQ29uc3RydWN0KSB7XG4gICAgICB3ZWJpZGwuaWxsZWdhbENvbnN0cnVjdG9yKClcbiAgICB9XG5cbiAgICB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3QgPSBhcmd1bWVudHNbMV1cbiAgfVxuXG4gIGFzeW5jIG1hdGNoIChyZXF1ZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGUubWF0Y2gnIH0pXG5cbiAgICByZXF1ZXN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8ocmVxdWVzdClcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMob3B0aW9ucylcblxuICAgIGNvbnN0IHAgPSBhd2FpdCB0aGlzLm1hdGNoQWxsKHJlcXVlc3QsIG9wdGlvbnMpXG5cbiAgICBpZiAocC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiBwWzBdXG4gIH1cblxuICBhc3luYyBtYXRjaEFsbCAocmVxdWVzdCA9IHVuZGVmaW5lZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG5cbiAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSByZXF1ZXN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8ocmVxdWVzdClcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIDEuXG4gICAgbGV0IHIgPSBudWxsXG5cbiAgICAvLyAyLlxuICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgICAvLyAyLjEuMVxuICAgICAgICByID0gcmVxdWVzdFtrU3RhdGVdXG5cbiAgICAgICAgLy8gMi4xLjJcbiAgICAgICAgaWYgKHIubWV0aG9kICE9PSAnR0VUJyAmJiAhb3B0aW9ucy5pZ25vcmVNZXRob2QpIHtcbiAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gMi4yLjFcbiAgICAgICAgciA9IG5ldyBSZXF1ZXN0KHJlcXVlc3QpW2tTdGF0ZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LlxuICAgIC8vIDUuMVxuICAgIGNvbnN0IHJlc3BvbnNlcyA9IFtdXG5cbiAgICAvLyA1LjJcbiAgICBpZiAocmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyA1LjIuMVxuICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0KSB7XG4gICAgICAgIHJlc3BvbnNlcy5wdXNoKHJlcXVlc3RSZXNwb25zZVsxXSlcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA1LjNcbiAgICAgIC8vIDUuMy4xXG4gICAgICBjb25zdCByZXF1ZXN0UmVzcG9uc2VzID0gdGhpcy4jcXVlcnlDYWNoZShyLCBvcHRpb25zKVxuXG4gICAgICAvLyA1LjMuMlxuICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgcmVxdWVzdFJlc3BvbnNlcykge1xuICAgICAgICByZXNwb25zZXMucHVzaChyZXF1ZXN0UmVzcG9uc2VbMV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS40XG4gICAgLy8gV2UgZG9uJ3QgaW1wbGVtZW50IENPUnMgc28gd2UgZG9uJ3QgbmVlZCB0byBsb29wIG92ZXIgdGhlIHJlc3BvbnNlcywgeWF5IVxuXG4gICAgLy8gNS41LjFcbiAgICBjb25zdCByZXNwb25zZUxpc3QgPSBbXVxuXG4gICAgLy8gNS41LjJcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgLy8gNS41LjIuMVxuICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keT8uc291cmNlID8/IG51bGwpXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5ib2R5XG4gICAgICByZXNwb25zZU9iamVjdFtrU3RhdGVdID0gcmVzcG9uc2VcbiAgICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0uYm9keSA9IGJvZHlcbiAgICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gcmVzcG9uc2UuaGVhZGVyc0xpc3RcbiAgICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrR3VhcmRdID0gJ2ltbXV0YWJsZSdcblxuICAgICAgcmVzcG9uc2VMaXN0LnB1c2gocmVzcG9uc2VPYmplY3QpXG4gICAgfVxuXG4gICAgLy8gNi5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShyZXNwb25zZUxpc3QpXG4gIH1cblxuICBhc3luYyBhZGQgKHJlcXVlc3QpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGUuYWRkJyB9KVxuXG4gICAgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QpXG5cbiAgICAvLyAxLlxuICAgIGNvbnN0IHJlcXVlc3RzID0gW3JlcXVlc3RdXG5cbiAgICAvLyAyLlxuICAgIGNvbnN0IHJlc3BvbnNlQXJyYXlQcm9taXNlID0gdGhpcy5hZGRBbGwocmVxdWVzdHMpXG5cbiAgICAvLyAzLlxuICAgIHJldHVybiBhd2FpdCByZXNwb25zZUFycmF5UHJvbWlzZVxuICB9XG5cbiAgYXN5bmMgYWRkQWxsIChyZXF1ZXN0cykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnIH0pXG5cbiAgICByZXF1ZXN0cyA9IHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxSZXF1ZXN0SW5mbz4nXShyZXF1ZXN0cylcblxuICAgIC8vIDEuXG4gICAgY29uc3QgcmVzcG9uc2VQcm9taXNlcyA9IFtdXG5cbiAgICAvLyAyLlxuICAgIGNvbnN0IHJlcXVlc3RMaXN0ID0gW11cblxuICAgIC8vIDMuXG4gICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIHJlcXVlc3RzKSB7XG4gICAgICBpZiAodHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDMuMVxuICAgICAgY29uc3QgciA9IHJlcXVlc3Rba1N0YXRlXVxuXG4gICAgICAvLyAzLjJcbiAgICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoci51cmwpIHx8IHIubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuYWRkQWxsJyxcbiAgICAgICAgICBtZXNzYWdlOiAnRXhwZWN0ZWQgaHR0cC9zIHNjaGVtZSB3aGVuIG1ldGhvZCBpcyBub3QgR0VULidcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LlxuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgZmV0Y2hpbmc+W119ICovXG4gICAgY29uc3QgZmV0Y2hDb250cm9sbGVycyA9IFtdXG5cbiAgICAvLyA1LlxuICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuICAgICAgLy8gNS4xXG4gICAgICBjb25zdCByID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuXG4gICAgICAvLyA1LjJcbiAgICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoci51cmwpKSB7XG4gICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdFeHBlY3RlZCBodHRwL3Mgc2NoZW1lLidcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gNS40XG4gICAgICByLmluaXRpYXRvciA9ICdmZXRjaCdcbiAgICAgIHIuZGVzdGluYXRpb24gPSAnc3VicmVzb3VyY2UnXG5cbiAgICAgIC8vIDUuNVxuICAgICAgcmVxdWVzdExpc3QucHVzaChyKVxuXG4gICAgICAvLyA1LjZcbiAgICAgIGNvbnN0IHJlc3BvbnNlUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAgIC8vIDUuN1xuICAgICAgZmV0Y2hDb250cm9sbGVycy5wdXNoKGZldGNoaW5nKHtcbiAgICAgICAgcmVxdWVzdDogcixcbiAgICAgICAgZGlzcGF0Y2hlcjogZ2V0R2xvYmFsRGlzcGF0Y2hlcigpLFxuICAgICAgICBwcm9jZXNzUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgLy8gMS5cbiAgICAgICAgICBpZiAocmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwNiB8fCByZXNwb25zZS5zdGF0dXMgPCAyMDAgfHwgcmVzcG9uc2Uuc3RhdHVzID4gMjk5KSB7XG4gICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuYWRkQWxsJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ1JlY2VpdmVkIGFuIGludmFsaWQgc3RhdHVzIGNvZGUgb3IgdGhlIHJlcXVlc3QgZmFpbGVkLidcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3ZhcnknKSkgeyAvLyAyLlxuICAgICAgICAgICAgLy8gMi4xXG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlcyA9IGdldEZpZWxkVmFsdWVzKHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgndmFyeScpKVxuXG4gICAgICAgICAgICAvLyAyLjJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRWYWx1ZSBvZiBmaWVsZFZhbHVlcykge1xuICAgICAgICAgICAgICAvLyAyLjIuMVxuICAgICAgICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdCh3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2ludmFsaWQgdmFyeSBmaWVsZCB2YWx1ZSdcbiAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJvbGxlciBvZiBmZXRjaENvbnRyb2xsZXJzKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFib3J0KClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5IChyZXNwb25zZSkge1xuICAgICAgICAgIC8vIDEuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZWplY3QobmV3IERPTUV4Y2VwdGlvbignYWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAyLlxuICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKVxuICAgICAgICB9XG4gICAgICB9KSlcblxuICAgICAgLy8gNS44XG4gICAgICByZXNwb25zZVByb21pc2VzLnB1c2gocmVzcG9uc2VQcm9taXNlLnByb21pc2UpXG4gICAgfVxuXG4gICAgLy8gNi5cbiAgICBjb25zdCBwID0gUHJvbWlzZS5hbGwocmVzcG9uc2VQcm9taXNlcylcblxuICAgIC8vIDcuXG4gICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgcFxuXG4gICAgLy8gNy4xXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IFtdXG5cbiAgICAvLyA3LjJcbiAgICBsZXQgaW5kZXggPSAwXG5cbiAgICAvLyA3LjNcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgLy8gNy4zLjFcbiAgICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbn0gKi9cbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgICAgdHlwZTogJ3B1dCcsIC8vIDcuMy4yXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RMaXN0W2luZGV4XSwgLy8gNy4zLjNcbiAgICAgICAgcmVzcG9uc2UgLy8gNy4zLjRcbiAgICAgIH1cblxuICAgICAgb3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbikgLy8gNy4zLjVcblxuICAgICAgaW5kZXgrKyAvLyA3LjMuNlxuICAgIH1cblxuICAgIC8vIDcuNVxuICAgIGNvbnN0IGNhY2hlSm9iUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyA3LjYuMVxuICAgIGxldCBlcnJvckRhdGEgPSBudWxsXG5cbiAgICAvLyA3LjYuMlxuICAgIHRyeSB7XG4gICAgICB0aGlzLiNiYXRjaENhY2hlT3BlcmF0aW9ucyhvcGVyYXRpb25zKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRGF0YSA9IGVcbiAgICB9XG5cbiAgICAvLyA3LjYuM1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIDcuNi4zLjFcbiAgICAgIGlmIChlcnJvckRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgY2FjaGVKb2JQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gNy42LjMuMlxuICAgICAgICBjYWNoZUpvYlByb21pc2UucmVqZWN0KGVycm9yRGF0YSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gNy43XG4gICAgcmV0dXJuIGNhY2hlSm9iUHJvbWlzZS5wcm9taXNlXG4gIH1cblxuICBhc3luYyBwdXQgKHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0NhY2hlLnB1dCcgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIHJlc3BvbnNlID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVzcG9uc2UocmVzcG9uc2UpXG5cbiAgICAvLyAxLlxuICAgIGxldCBpbm5lclJlcXVlc3QgPSBudWxsXG5cbiAgICAvLyAyLlxuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgaW5uZXJSZXF1ZXN0ID0gcmVxdWVzdFtrU3RhdGVdXG4gICAgfSBlbHNlIHsgLy8gMy5cbiAgICAgIGlubmVyUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHJlcXVlc3QpW2tTdGF0ZV1cbiAgICB9XG5cbiAgICAvLyA0LlxuICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoaW5uZXJSZXF1ZXN0LnVybCkgfHwgaW5uZXJSZXF1ZXN0Lm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnQ2FjaGUucHV0JyxcbiAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGFuIGh0dHAvcyBzY2hlbWUgd2hlbiBtZXRob2QgaXMgbm90IEdFVCdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gNS5cbiAgICBjb25zdCBpbm5lclJlc3BvbnNlID0gcmVzcG9uc2Vba1N0YXRlXVxuXG4gICAgLy8gNi5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5zdGF0dXMgPT09IDIwNikge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdDYWNoZS5wdXQnLFxuICAgICAgICBtZXNzYWdlOiAnR290IDIwNiBzdGF0dXMnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDcuXG4gICAgaWYgKGlubmVyUmVzcG9uc2UuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3ZhcnknKSkge1xuICAgICAgLy8gNy4xLlxuICAgICAgY29uc3QgZmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlcyhpbm5lclJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgndmFyeScpKVxuXG4gICAgICAvLyA3LjIuXG4gICAgICBmb3IgKGNvbnN0IGZpZWxkVmFsdWUgb2YgZmllbGRWYWx1ZXMpIHtcbiAgICAgICAgLy8gNy4yLjFcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT09ICcqJykge1xuICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLnB1dCcsXG4gICAgICAgICAgICBtZXNzYWdlOiAnR290ICogdmFyeSBmaWVsZCB2YWx1ZSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOC5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5ib2R5ICYmIChpc0Rpc3R1cmJlZChpbm5lclJlc3BvbnNlLmJvZHkuc3RyZWFtKSB8fCBpbm5lclJlc3BvbnNlLmJvZHkuc3RyZWFtLmxvY2tlZCkpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnQ2FjaGUucHV0JyxcbiAgICAgICAgbWVzc2FnZTogJ1Jlc3BvbnNlIGJvZHkgaXMgbG9ja2VkIG9yIGRpc3R1cmJlZCdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gOS5cbiAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IGNsb25lUmVzcG9uc2UoaW5uZXJSZXNwb25zZSlcblxuICAgIC8vIDEwLlxuICAgIGNvbnN0IGJvZHlSZWFkUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyAxMS5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5ib2R5ICE9IG51bGwpIHtcbiAgICAgIC8vIDExLjFcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGlubmVyUmVzcG9uc2UuYm9keS5zdHJlYW1cblxuICAgICAgLy8gMTEuMlxuICAgICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpXG5cbiAgICAgIC8vIDExLjNcbiAgICAgIHJlYWRBbGxCeXRlcyhyZWFkZXIpLnRoZW4oYm9keVJlYWRQcm9taXNlLnJlc29sdmUsIGJvZHlSZWFkUHJvbWlzZS5yZWplY3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJvZHlSZWFkUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICAvLyAxMi5cbiAgICAvKiogQHR5cGUge0NhY2hlQmF0Y2hPcGVyYXRpb25bXX0gKi9cbiAgICBjb25zdCBvcGVyYXRpb25zID0gW11cblxuICAgIC8vIDEzLlxuICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbn0gKi9cbiAgICBjb25zdCBvcGVyYXRpb24gPSB7XG4gICAgICB0eXBlOiAncHV0JywgLy8gMTQuXG4gICAgICByZXF1ZXN0OiBpbm5lclJlcXVlc3QsIC8vIDE1LlxuICAgICAgcmVzcG9uc2U6IGNsb25lZFJlc3BvbnNlIC8vIDE2LlxuICAgIH1cblxuICAgIC8vIDE3LlxuICAgIG9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pXG5cbiAgICAvLyAxOS5cbiAgICBjb25zdCBieXRlcyA9IGF3YWl0IGJvZHlSZWFkUHJvbWlzZS5wcm9taXNlXG5cbiAgICBpZiAoY2xvbmVkUmVzcG9uc2UuYm9keSAhPSBudWxsKSB7XG4gICAgICBjbG9uZWRSZXNwb25zZS5ib2R5LnNvdXJjZSA9IGJ5dGVzXG4gICAgfVxuXG4gICAgLy8gMTkuMVxuICAgIGNvbnN0IGNhY2hlSm9iUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyAxOS4yLjFcbiAgICBsZXQgZXJyb3JEYXRhID0gbnVsbFxuXG4gICAgLy8gMTkuMi4yXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuI2JhdGNoQ2FjaGVPcGVyYXRpb25zKG9wZXJhdGlvbnMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JEYXRhID0gZVxuICAgIH1cblxuICAgIC8vIDE5LjIuM1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIDE5LjIuMy4xXG4gICAgICBpZiAoZXJyb3JEYXRhID09PSBudWxsKSB7XG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIH0gZWxzZSB7IC8vIDE5LjIuMy4yXG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZWplY3QoZXJyb3JEYXRhKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gY2FjaGVKb2JQcm9taXNlLnByb21pc2VcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZSAocmVxdWVzdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlLmRlbGV0ZScgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyhvcHRpb25zKVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge1JlcXVlc3R9XG4gICAgICovXG4gICAgbGV0IHIgPSBudWxsXG5cbiAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIHIgPSByZXF1ZXN0W2tTdGF0ZV1cblxuICAgICAgaWYgKHIubWV0aG9kICE9PSAnR0VUJyAmJiAhb3B0aW9ucy5pZ25vcmVNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydCh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpXG5cbiAgICAgIHIgPSBuZXcgUmVxdWVzdChyZXF1ZXN0KVtrU3RhdGVdXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtDYWNoZUJhdGNoT3BlcmF0aW9uW119ICovXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IFtdXG5cbiAgICAvKiogQHR5cGUge0NhY2hlQmF0Y2hPcGVyYXRpb259ICovXG4gICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAgdHlwZTogJ2RlbGV0ZScsXG4gICAgICByZXF1ZXN0OiByLFxuICAgICAgb3B0aW9uc1xuICAgIH1cblxuICAgIG9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pXG5cbiAgICBjb25zdCBjYWNoZUpvYlByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gICAgbGV0IGVycm9yRGF0YSA9IG51bGxcbiAgICBsZXQgcmVxdWVzdFJlc3BvbnNlc1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlcXVlc3RSZXNwb25zZXMgPSB0aGlzLiNiYXRjaENhY2hlT3BlcmF0aW9ucyhvcGVyYXRpb25zKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRGF0YSA9IGVcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBpZiAoZXJyb3JEYXRhID09PSBudWxsKSB7XG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZXNvbHZlKCEhcmVxdWVzdFJlc3BvbnNlcz8ubGVuZ3RoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FjaGVKb2JQcm9taXNlLnJlamVjdChlcnJvckRhdGEpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBjYWNoZUpvYlByb21pc2UucHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2RvbS1jYWNoZS1rZXlzXG4gICAqIEBwYXJhbSB7YW55fSByZXF1ZXN0XG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi90eXBlcy9jYWNoZScpLkNhY2hlUXVlcnlPcHRpb25zfSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtyZWFkb25seSBSZXF1ZXN0W119XG4gICAqL1xuICBhc3luYyBrZXlzIChyZXF1ZXN0ID0gdW5kZWZpbmVkLCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcblxuICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyhvcHRpb25zKVxuXG4gICAgLy8gMS5cbiAgICBsZXQgciA9IG51bGxcblxuICAgIC8vIDIuXG4gICAgaWYgKHJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gMi4xXG4gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgICAgLy8gMi4xLjFcbiAgICAgICAgciA9IHJlcXVlc3Rba1N0YXRlXVxuXG4gICAgICAgIC8vIDIuMS4yXG4gICAgICAgIGlmIChyLm1ldGhvZCAhPT0gJ0dFVCcgJiYgIW9wdGlvbnMuaWdub3JlTWV0aG9kKSB7XG4gICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnKSB7IC8vIDIuMlxuICAgICAgICByID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDQuXG4gICAgY29uc3QgcHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyA1LlxuICAgIC8vIDUuMVxuICAgIGNvbnN0IHJlcXVlc3RzID0gW11cblxuICAgIC8vIDUuMlxuICAgIGlmIChyZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDUuMi4xXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3QpIHtcbiAgICAgICAgLy8gNS4yLjEuMVxuICAgICAgICByZXF1ZXN0cy5wdXNoKHJlcXVlc3RSZXNwb25zZVswXSlcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA1LjNcbiAgICAgIC8vIDUuMy4xXG4gICAgICBjb25zdCByZXF1ZXN0UmVzcG9uc2VzID0gdGhpcy4jcXVlcnlDYWNoZShyLCBvcHRpb25zKVxuXG4gICAgICAvLyA1LjMuMlxuICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgcmVxdWVzdFJlc3BvbnNlcykge1xuICAgICAgICAvLyA1LjMuMi4xXG4gICAgICAgIHJlcXVlc3RzLnB1c2gocmVxdWVzdFJlc3BvbnNlWzBdKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuNFxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIDUuNC4xXG4gICAgICBjb25zdCByZXF1ZXN0TGlzdCA9IFtdXG5cbiAgICAgIC8vIDUuNC4yXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgcmVxdWVzdHMpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdE9iamVjdCA9IG5ldyBSZXF1ZXN0KCdodHRwczovL2EnKVxuICAgICAgICByZXF1ZXN0T2JqZWN0W2tTdGF0ZV0gPSByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3RPYmplY3Rba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF0gPSByZXF1ZXN0LmhlYWRlcnNMaXN0XG4gICAgICAgIHJlcXVlc3RPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAnaW1tdXRhYmxlJ1xuICAgICAgICByZXF1ZXN0T2JqZWN0W2tSZWFsbV0gPSByZXF1ZXN0LmNsaWVudFxuXG4gICAgICAgIC8vIDUuNC4yLjFcbiAgICAgICAgcmVxdWVzdExpc3QucHVzaChyZXF1ZXN0T2JqZWN0KVxuICAgICAgfVxuXG4gICAgICAvLyA1LjQuM1xuICAgICAgcHJvbWlzZS5yZXNvbHZlKE9iamVjdC5mcmVlemUocmVxdWVzdExpc3QpKVxuICAgIH0pXG5cbiAgICByZXR1cm4gcHJvbWlzZS5wcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jYmF0Y2gtY2FjaGUtb3BlcmF0aW9ucy1hbGdvcml0aG1cbiAgICogQHBhcmFtIHtDYWNoZUJhdGNoT3BlcmF0aW9uW119IG9wZXJhdGlvbnNcbiAgICogQHJldHVybnMge3JlcXVlc3RSZXNwb25zZUxpc3R9XG4gICAqL1xuICAjYmF0Y2hDYWNoZU9wZXJhdGlvbnMgKG9wZXJhdGlvbnMpIHtcbiAgICAvLyAxLlxuICAgIGNvbnN0IGNhY2hlID0gdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0XG5cbiAgICAvLyAyLlxuICAgIGNvbnN0IGJhY2t1cENhY2hlID0gWy4uLmNhY2hlXVxuXG4gICAgLy8gMy5cbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gW11cblxuICAgIC8vIDQuMVxuICAgIGNvbnN0IHJlc3VsdExpc3QgPSBbXVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDQuMlxuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICAvLyA0LjIuMVxuICAgICAgICBpZiAob3BlcmF0aW9uLnR5cGUgIT09ICdkZWxldGUnICYmIG9wZXJhdGlvbi50eXBlICE9PSAncHV0Jykge1xuICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLiNiYXRjaENhY2hlT3BlcmF0aW9ucycsXG4gICAgICAgICAgICBtZXNzYWdlOiAnb3BlcmF0aW9uIHR5cGUgZG9lcyBub3QgbWF0Y2ggXCJkZWxldGVcIiBvciBcInB1dFwiJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjIuMlxuICAgICAgICBpZiAob3BlcmF0aW9uLnR5cGUgPT09ICdkZWxldGUnICYmIG9wZXJhdGlvbi5yZXNwb25zZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdkZWxldGUgb3BlcmF0aW9uIHNob3VsZCBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIHJlc3BvbnNlJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjIuM1xuICAgICAgICBpZiAodGhpcy4jcXVlcnlDYWNoZShvcGVyYXRpb24ucmVxdWVzdCwgb3BlcmF0aW9uLm9wdGlvbnMsIGFkZGVkSXRlbXMpLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJz8/PycsICdJbnZhbGlkU3RhdGVFcnJvcicpXG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjIuNFxuICAgICAgICBsZXQgcmVxdWVzdFJlc3BvbnNlc1xuXG4gICAgICAgIC8vIDQuMi41XG4gICAgICAgIGlmIChvcGVyYXRpb24udHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgICAvLyA0LjIuNS4xXG4gICAgICAgICAgcmVxdWVzdFJlc3BvbnNlcyA9IHRoaXMuI3F1ZXJ5Q2FjaGUob3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5vcHRpb25zKVxuXG4gICAgICAgICAgLy8gVE9ETzogdGhlIHNwZWMgaXMgd3JvbmcsIHRoaXMgaXMgbmVlZGVkIHRvIHBhc3MgV1BUc1xuICAgICAgICAgIGlmIChyZXF1ZXN0UmVzcG9uc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gNC4yLjUuMlxuICAgICAgICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHJlcXVlc3RSZXNwb25zZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGNhY2hlLmluZGV4T2YocmVxdWVzdFJlc3BvbnNlKVxuICAgICAgICAgICAgYXNzZXJ0KGlkeCAhPT0gLTEpXG5cbiAgICAgICAgICAgIC8vIDQuMi41LjIuMVxuICAgICAgICAgICAgY2FjaGUuc3BsaWNlKGlkeCwgMSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLnR5cGUgPT09ICdwdXQnKSB7IC8vIDQuMi42XG4gICAgICAgICAgLy8gNC4yLjYuMVxuICAgICAgICAgIGlmIChvcGVyYXRpb24ucmVzcG9uc2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAncHV0IG9wZXJhdGlvbiBzaG91bGQgaGF2ZSBhbiBhc3NvY2lhdGVkIHJlc3BvbnNlJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi4yXG4gICAgICAgICAgY29uc3QgciA9IG9wZXJhdGlvbi5yZXF1ZXN0XG5cbiAgICAgICAgICAvLyA0LjIuNi4zXG4gICAgICAgICAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShyLnVybCkpIHtcbiAgICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ2V4cGVjdGVkIGh0dHAgb3IgaHR0cHMgc2NoZW1lJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi40XG4gICAgICAgICAgaWYgKHIubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbm90IGdldCBtZXRob2QnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuMi42LjVcbiAgICAgICAgICBpZiAob3BlcmF0aW9uLm9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnb3B0aW9ucyBtdXN0IG5vdCBiZSBkZWZpbmVkJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi42XG4gICAgICAgICAgcmVxdWVzdFJlc3BvbnNlcyA9IHRoaXMuI3F1ZXJ5Q2FjaGUob3BlcmF0aW9uLnJlcXVlc3QpXG5cbiAgICAgICAgICAvLyA0LjIuNi43XG4gICAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgcmVxdWVzdFJlc3BvbnNlcykge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gY2FjaGUuaW5kZXhPZihyZXF1ZXN0UmVzcG9uc2UpXG4gICAgICAgICAgICBhc3NlcnQoaWR4ICE9PSAtMSlcblxuICAgICAgICAgICAgLy8gNC4yLjYuNy4xXG4gICAgICAgICAgICBjYWNoZS5zcGxpY2UoaWR4LCAxKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuMi42LjhcbiAgICAgICAgICBjYWNoZS5wdXNoKFtvcGVyYXRpb24ucmVxdWVzdCwgb3BlcmF0aW9uLnJlc3BvbnNlXSlcblxuICAgICAgICAgIC8vIDQuMi42LjEwXG4gICAgICAgICAgYWRkZWRJdGVtcy5wdXNoKFtvcGVyYXRpb24ucmVxdWVzdCwgb3BlcmF0aW9uLnJlc3BvbnNlXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuMi43XG4gICAgICAgIHJlc3VsdExpc3QucHVzaChbb3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5yZXNwb25zZV0pXG4gICAgICB9XG5cbiAgICAgIC8vIDQuM1xuICAgICAgcmV0dXJuIHJlc3VsdExpc3RcbiAgICB9IGNhdGNoIChlKSB7IC8vIDUuXG4gICAgICAvLyA1LjFcbiAgICAgIHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdC5sZW5ndGggPSAwXG5cbiAgICAgIC8vIDUuMlxuICAgICAgdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0ID0gYmFja3VwQ2FjaGVcblxuICAgICAgLy8gNS4zXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI3F1ZXJ5LWNhY2hlXG4gICAqIEBwYXJhbSB7YW55fSByZXF1ZXN0UXVlcnlcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NhY2hlJykuQ2FjaGVRdWVyeU9wdGlvbnN9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fSB0YXJnZXRTdG9yYWdlXG4gICAqIEByZXR1cm5zIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fVxuICAgKi9cbiAgI3F1ZXJ5Q2FjaGUgKHJlcXVlc3RRdWVyeSwgb3B0aW9ucywgdGFyZ2V0U3RvcmFnZSkge1xuICAgIC8qKiBAdHlwZSB7cmVxdWVzdFJlc3BvbnNlTGlzdH0gKi9cbiAgICBjb25zdCByZXN1bHRMaXN0ID0gW11cblxuICAgIGNvbnN0IHN0b3JhZ2UgPSB0YXJnZXRTdG9yYWdlID8/IHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdFxuXG4gICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2Ygc3RvcmFnZSkge1xuICAgICAgY29uc3QgW2NhY2hlZFJlcXVlc3QsIGNhY2hlZFJlc3BvbnNlXSA9IHJlcXVlc3RSZXNwb25zZVxuICAgICAgaWYgKHRoaXMuI3JlcXVlc3RNYXRjaGVzQ2FjaGVkSXRlbShyZXF1ZXN0UXVlcnksIGNhY2hlZFJlcXVlc3QsIGNhY2hlZFJlc3BvbnNlLCBvcHRpb25zKSkge1xuICAgICAgICByZXN1bHRMaXN0LnB1c2gocmVxdWVzdFJlc3BvbnNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRMaXN0XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jcmVxdWVzdC1tYXRjaGVzLWNhY2hlZC1pdGVtLWFsZ29yaXRobVxuICAgKiBAcGFyYW0ge2FueX0gcmVxdWVzdFF1ZXJ5XG4gICAqIEBwYXJhbSB7YW55fSByZXF1ZXN0XG4gICAqIEBwYXJhbSB7YW55IHwgbnVsbH0gcmVzcG9uc2VcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NhY2hlJykuQ2FjaGVRdWVyeU9wdGlvbnMgfCB1bmRlZmluZWR9IG9wdGlvbnNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAjcmVxdWVzdE1hdGNoZXNDYWNoZWRJdGVtIChyZXF1ZXN0UXVlcnksIHJlcXVlc3QsIHJlc3BvbnNlID0gbnVsbCwgb3B0aW9ucykge1xuICAgIC8vIGlmIChvcHRpb25zPy5pZ25vcmVNZXRob2QgPT09IGZhbHNlICYmIHJlcXVlc3QubWV0aG9kID09PSAnR0VUJykge1xuICAgIC8vICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gfVxuXG4gICAgY29uc3QgcXVlcnlVUkwgPSBuZXcgVVJMKHJlcXVlc3RRdWVyeS51cmwpXG5cbiAgICBjb25zdCBjYWNoZWRVUkwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuXG4gICAgaWYgKG9wdGlvbnM/Lmlnbm9yZVNlYXJjaCkge1xuICAgICAgY2FjaGVkVVJMLnNlYXJjaCA9ICcnXG5cbiAgICAgIHF1ZXJ5VVJMLnNlYXJjaCA9ICcnXG4gICAgfVxuXG4gICAgaWYgKCF1cmxFcXVhbHMocXVlcnlVUkwsIGNhY2hlZFVSTCwgdHJ1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHJlc3BvbnNlID09IG51bGwgfHxcbiAgICAgIG9wdGlvbnM/Lmlnbm9yZVZhcnkgfHxcbiAgICAgICFyZXNwb25zZS5oZWFkZXJzTGlzdC5jb250YWlucygndmFyeScpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZ2V0RmllbGRWYWx1ZXMocmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCd2YXJ5JykpXG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkVmFsdWUgb2YgZmllbGRWYWx1ZXMpIHtcbiAgICAgIGlmIChmaWVsZFZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RWYWx1ZSA9IHJlcXVlc3QuaGVhZGVyc0xpc3QuZ2V0KGZpZWxkVmFsdWUpXG4gICAgICBjb25zdCBxdWVyeVZhbHVlID0gcmVxdWVzdFF1ZXJ5LmhlYWRlcnNMaXN0LmdldChmaWVsZFZhbHVlKVxuXG4gICAgICAvLyBJZiBvbmUgaGFzIHRoZSBoZWFkZXIgYW5kIHRoZSBvdGhlciBkb2Vzbid0LCBvciBvbmUgaGFzXG4gICAgICAvLyBhIGRpZmZlcmVudCB2YWx1ZSB0aGFuIHRoZSBvdGhlciwgcmV0dXJuIGZhbHNlXG4gICAgICBpZiAocmVxdWVzdFZhbHVlICE9PSBxdWVyeVZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ2FjaGUucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDYWNoZScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIG1hdGNoOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBtYXRjaEFsbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYWRkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBhZGRBbGw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHB1dDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZGVsZXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBrZXlzOiBrRW51bWVyYWJsZVByb3BlcnR5XG59KVxuXG5jb25zdCBjYWNoZVF1ZXJ5T3B0aW9uQ29udmVydGVycyA9IFtcbiAge1xuICAgIGtleTogJ2lnbm9yZVNlYXJjaCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2lnbm9yZU1ldGhvZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2lnbm9yZVZhcnknLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH1cbl1cblxud2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihjYWNoZVF1ZXJ5T3B0aW9uQ29udmVydGVycylcblxud2ViaWRsLmNvbnZlcnRlcnMuTXVsdGlDYWNoZVF1ZXJ5T3B0aW9ucyA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAgLi4uY2FjaGVRdWVyeU9wdGlvbkNvbnZlcnRlcnMsXG4gIHtcbiAgICBrZXk6ICdjYWNoZU5hbWUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nXG4gIH1cbl0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLlJlc3BvbnNlID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihSZXNwb25zZSlcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPFJlcXVlc3RJbmZvPiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mb1xuKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ2FjaGVcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgQ2FjaGUgfSA9IHJlcXVpcmUoJy4vY2FjaGUnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmNsYXNzIENhY2hlU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkZm4tcmVsZXZhbnQtbmFtZS10by1jYWNoZS1tYXBcbiAgICogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydCgnLi9jYWNoZScpLnJlcXVlc3RSZXNwb25zZUxpc3R9XG4gICAqL1xuICAjY2FjaGVzID0gbmV3IE1hcCgpXG5cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIGlmIChhcmd1bWVudHNbMF0gIT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHdlYmlkbC5pbGxlZ2FsQ29uc3RydWN0b3IoKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG1hdGNoIChyZXF1ZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZVN0b3JhZ2UpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlU3RvcmFnZS5tYXRjaCcgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5NdWx0aUNhY2hlUXVlcnlPcHRpb25zKG9wdGlvbnMpXG5cbiAgICAvLyAxLlxuICAgIGlmIChvcHRpb25zLmNhY2hlTmFtZSAhPSBudWxsKSB7XG4gICAgICAvLyAxLjEuMS4xXG4gICAgICBpZiAodGhpcy4jY2FjaGVzLmhhcyhvcHRpb25zLmNhY2hlTmFtZSkpIHtcbiAgICAgICAgLy8gMS4xLjEuMS4xXG4gICAgICAgIGNvbnN0IGNhY2hlTGlzdCA9IHRoaXMuI2NhY2hlcy5nZXQob3B0aW9ucy5jYWNoZU5hbWUpXG4gICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IENhY2hlKGtDb25zdHJ1Y3QsIGNhY2hlTGlzdClcblxuICAgICAgICByZXR1cm4gYXdhaXQgY2FjaGUubWF0Y2gocmVxdWVzdCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyAyLlxuICAgICAgLy8gMi4yXG4gICAgICBmb3IgKGNvbnN0IGNhY2hlTGlzdCBvZiB0aGlzLiNjYWNoZXMudmFsdWVzKCkpIHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGVMaXN0KVxuXG4gICAgICAgIC8vIDIuMi4xLjJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjYWNoZS5tYXRjaChyZXF1ZXN0LCBvcHRpb25zKVxuXG4gICAgICAgIGlmIChyZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jY2FjaGUtc3RvcmFnZS1oYXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhcyAoY2FjaGVOYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZVN0b3JhZ2UuaGFzJyB9KVxuXG4gICAgY2FjaGVOYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKGNhY2hlTmFtZSlcblxuICAgIC8vIDIuMS4xXG4gICAgLy8gMi4yXG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlcy5oYXMoY2FjaGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2RvbS1jYWNoZXN0b3JhZ2Utb3BlblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENhY2hlPn1cbiAgICovXG4gIGFzeW5jIG9wZW4gKGNhY2hlTmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlU3RvcmFnZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGVTdG9yYWdlLm9wZW4nIH0pXG5cbiAgICBjYWNoZU5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoY2FjaGVOYW1lKVxuXG4gICAgLy8gMi4xXG4gICAgaWYgKHRoaXMuI2NhY2hlcy5oYXMoY2FjaGVOYW1lKSkge1xuICAgICAgLy8gYXdhaXQgY2FjaGVzLm9wZW4oJ3YxJykgIT09IGF3YWl0IGNhY2hlcy5vcGVuKCd2MScpXG5cbiAgICAgIC8vIDIuMS4xXG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuI2NhY2hlcy5nZXQoY2FjaGVOYW1lKVxuXG4gICAgICAvLyAyLjEuMS4xXG4gICAgICByZXR1cm4gbmV3IENhY2hlKGtDb25zdHJ1Y3QsIGNhY2hlKVxuICAgIH1cblxuICAgIC8vIDIuMlxuICAgIGNvbnN0IGNhY2hlID0gW11cblxuICAgIC8vIDIuM1xuICAgIHRoaXMuI2NhY2hlcy5zZXQoY2FjaGVOYW1lLCBjYWNoZSlcblxuICAgIC8vIDIuNFxuICAgIHJldHVybiBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGUpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jY2FjaGUtc3RvcmFnZS1kZWxldGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZSAoY2FjaGVOYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZVN0b3JhZ2UuZGVsZXRlJyB9KVxuXG4gICAgY2FjaGVOYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKGNhY2hlTmFtZSlcblxuICAgIHJldHVybiB0aGlzLiNjYWNoZXMuZGVsZXRlKGNhY2hlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNjYWNoZS1zdG9yYWdlLWtleXNcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgYXN5bmMga2V5cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuXG4gICAgLy8gMi4xXG4gICAgY29uc3Qga2V5cyA9IHRoaXMuI2NhY2hlcy5rZXlzKClcblxuICAgIC8vIDIuMlxuICAgIHJldHVybiBbLi4ua2V5c11cbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhDYWNoZVN0b3JhZ2UucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDYWNoZVN0b3JhZ2UnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBtYXRjaDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGFzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvcGVuOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWxldGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGtleXM6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDYWNoZVN0b3JhZ2Vcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vY29va2llLXN0b3JlLyNjb29raWUtbWF4aW11bS1hdHRyaWJ1dGUtdmFsdWUtc2l6ZVxuY29uc3QgbWF4QXR0cmlidXRlVmFsdWVTaXplID0gMTAyNFxuXG4vLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2Nvb2tpZS1zdG9yZS8jY29va2llLW1heGltdW0tbmFtZS12YWx1ZS1wYWlyLXNpemVcbmNvbnN0IG1heE5hbWVWYWx1ZVBhaXJTaXplID0gNDA5NlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWF4QXR0cmlidXRlVmFsdWVTaXplLFxuICBtYXhOYW1lVmFsdWVQYWlyU2l6ZVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsga0hlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuXG5mdW5jdGlvbiBpc0NUTEV4Y2x1ZGluZ0h0YWIgKHZhbHVlKSB7XG4gIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAoY29uc3QgY2hhciBvZiB2YWx1ZSkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChcbiAgICAgIChjb2RlID49IDB4MDAgfHwgY29kZSA8PSAweDA4KSB8fFxuICAgICAgKGNvZGUgPj0gMHgwQSB8fCBjb2RlIDw9IDB4MUYpIHx8XG4gICAgICBjb2RlID09PSAweDdGXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gQ0hBUiAgICAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPlxuIHRva2VuICAgICAgICAgID0gMSo8YW55IENIQVIgZXhjZXB0IENUTHMgb3Igc2VwYXJhdG9ycz5cbiBzZXBhcmF0b3JzICAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAgICAgICAgICAgICAgICB8IFwiLFwiIHwgXCI7XCIgfCBcIjpcIiB8IFwiXFxcIiB8IDxcIj5cbiAgICAgICAgICAgICAgICB8IFwiL1wiIHwgXCJbXCIgfCBcIl1cIiB8IFwiP1wiIHwgXCI9XCJcbiAgICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZU5hbWUgKG5hbWUpIHtcbiAgZm9yIChjb25zdCBjaGFyIG9mIG5hbWUpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApXG5cbiAgICBpZiAoXG4gICAgICAoY29kZSA8PSAweDIwIHx8IGNvZGUgPiAweDdGKSB8fFxuICAgICAgY2hhciA9PT0gJygnIHx8XG4gICAgICBjaGFyID09PSAnKScgfHxcbiAgICAgIGNoYXIgPT09ICc+JyB8fFxuICAgICAgY2hhciA9PT0gJzwnIHx8XG4gICAgICBjaGFyID09PSAnQCcgfHxcbiAgICAgIGNoYXIgPT09ICcsJyB8fFxuICAgICAgY2hhciA9PT0gJzsnIHx8XG4gICAgICBjaGFyID09PSAnOicgfHxcbiAgICAgIGNoYXIgPT09ICdcXFxcJyB8fFxuICAgICAgY2hhciA9PT0gJ1wiJyB8fFxuICAgICAgY2hhciA9PT0gJy8nIHx8XG4gICAgICBjaGFyID09PSAnWycgfHxcbiAgICAgIGNoYXIgPT09ICddJyB8fFxuICAgICAgY2hhciA9PT0gJz8nIHx8XG4gICAgICBjaGFyID09PSAnPScgfHxcbiAgICAgIGNoYXIgPT09ICd7JyB8fFxuICAgICAgY2hhciA9PT0gJ30nXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29va2llIG5hbWUnKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiBjb29raWUtdmFsdWUgICAgICA9ICpjb29raWUtb2N0ZXQgLyAoIERRVU9URSAqY29va2llLW9jdGV0IERRVU9URSApXG4gY29va2llLW9jdGV0ICAgICAgPSAleDIxIC8gJXgyMy0yQiAvICV4MkQtM0EgLyAleDNDLTVCIC8gJXg1RC03RVxuICAgICAgICAgICAgICAgICAgICAgICA7IFVTLUFTQ0lJIGNoYXJhY3RlcnMgZXhjbHVkaW5nIENUTHMsXG4gICAgICAgICAgICAgICAgICAgICAgIDsgd2hpdGVzcGFjZSBEUVVPVEUsIGNvbW1hLCBzZW1pY29sb24sXG4gICAgICAgICAgICAgICAgICAgICAgIDsgYW5kIGJhY2tzbGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29va2llVmFsdWUgKHZhbHVlKSB7XG4gIGZvciAoY29uc3QgY2hhciBvZiB2YWx1ZSkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChcbiAgICAgIGNvZGUgPCAweDIxIHx8IC8vIGV4Y2x1ZGUgQ1RMcyAoMC0zMSlcbiAgICAgIGNvZGUgPT09IDB4MjIgfHxcbiAgICAgIGNvZGUgPT09IDB4MkMgfHxcbiAgICAgIGNvZGUgPT09IDB4M0IgfHxcbiAgICAgIGNvZGUgPT09IDB4NUMgfHxcbiAgICAgIGNvZGUgPiAweDdFIC8vIG5vbi1hc2NpaVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhlYWRlciB2YWx1ZScpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcGF0aC12YWx1ZSAgICAgICAgPSA8YW55IENIQVIgZXhjZXB0IENUTHMgb3IgXCI7XCI+XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZVBhdGggKHBhdGgpIHtcbiAgZm9yIChjb25zdCBjaGFyIG9mIHBhdGgpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApXG5cbiAgICBpZiAoY29kZSA8IDB4MjEgfHwgY2hhciA9PT0gJzsnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29va2llIHBhdGgnKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEkgaGF2ZSBubyBpZGVhIHdoeSB0aGVzZSB2YWx1ZXMgYXJlbid0IGFsbG93ZWQgdG8gYmUgaG9uZXN0LFxuICogYnV0IERlbm8gdGVzdHMgdGhlc2UuIC0gS2hhZnJhXG4gKiBAcGFyYW0ge3N0cmluZ30gZG9tYWluXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29va2llRG9tYWluIChkb21haW4pIHtcbiAgaWYgKFxuICAgIGRvbWFpbi5zdGFydHNXaXRoKCctJykgfHxcbiAgICBkb21haW4uZW5kc1dpdGgoJy4nKSB8fFxuICAgIGRvbWFpbi5lbmRzV2l0aCgnLScpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb29raWUgZG9tYWluJylcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzcyMzEjc2VjdGlvbi03LjEuMS4xXG4gKiBAcGFyYW0ge251bWJlcnxEYXRlfSBkYXRlXG4gIElNRi1maXhkYXRlICA9IGRheS1uYW1lIFwiLFwiIFNQIGRhdGUxIFNQIHRpbWUtb2YtZGF5IFNQIEdNVFxuICA7IGZpeGVkIGxlbmd0aC96b25lL2NhcGl0YWxpemF0aW9uIHN1YnNldCBvZiB0aGUgZm9ybWF0XG4gIDsgc2VlIFNlY3Rpb24gMy4zIG9mIFtSRkM1MzIyXVxuXG4gIGRheS1uYW1lICAgICA9ICV4NEQuNkYuNkUgOyBcIk1vblwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTQuNzUuNjUgOyBcIlR1ZVwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTcuNjUuNjQgOyBcIldlZFwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTQuNjguNzUgOyBcIlRodVwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NDYuNzIuNjkgOyBcIkZyaVwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTMuNjEuNzQgOyBcIlNhdFwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTMuNzUuNkUgOyBcIlN1blwiLCBjYXNlLXNlbnNpdGl2ZVxuICBkYXRlMSAgICAgICAgPSBkYXkgU1AgbW9udGggU1AgeWVhclxuICAgICAgICAgICAgICAgICAgOyBlLmcuLCAwMiBKdW4gMTk4MlxuXG4gIGRheSAgICAgICAgICA9IDJESUdJVFxuICBtb250aCAgICAgICAgPSAleDRBLjYxLjZFIDsgXCJKYW5cIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQ2LjY1LjYyIDsgXCJGZWJcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRELjYxLjcyIDsgXCJNYXJcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQxLjcwLjcyIDsgXCJBcHJcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRELjYxLjc5IDsgXCJNYXlcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRBLjc1LjZFIDsgXCJKdW5cIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRBLjc1LjZDIDsgXCJKdWxcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQxLjc1LjY3IDsgXCJBdWdcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDUzLjY1LjcwIDsgXCJTZXBcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRGLjYzLjc0IDsgXCJPY3RcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRFLjZGLjc2IDsgXCJOb3ZcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQ0LjY1LjYzIDsgXCJEZWNcIiwgY2FzZS1zZW5zaXRpdmVcbiAgeWVhciAgICAgICAgID0gNERJR0lUXG5cbiAgR01UICAgICAgICAgID0gJXg0Ny40RC41NCA7IFwiR01UXCIsIGNhc2Utc2Vuc2l0aXZlXG5cbiAgdGltZS1vZi1kYXkgID0gaG91ciBcIjpcIiBtaW51dGUgXCI6XCIgc2Vjb25kXG4gICAgICAgICAgICAgIDsgMDA6MDA6MDAgLSAyMzo1OTo2MCAobGVhcCBzZWNvbmQpXG5cbiAgaG91ciAgICAgICAgID0gMkRJR0lUXG4gIG1pbnV0ZSAgICAgICA9IDJESUdJVFxuICBzZWNvbmQgICAgICAgPSAyRElHSVRcbiAqL1xuZnVuY3Rpb24gdG9JTUZEYXRlIChkYXRlKSB7XG4gIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ251bWJlcicpIHtcbiAgICBkYXRlID0gbmV3IERhdGUoZGF0ZSlcbiAgfVxuXG4gIGNvbnN0IGRheXMgPSBbXG4gICAgJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsXG4gICAgJ1RodScsICdGcmknLCAnU2F0J1xuICBdXG5cbiAgY29uc3QgbW9udGhzID0gW1xuICAgICdKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsXG4gICAgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ1xuICBdXG5cbiAgY29uc3QgZGF5TmFtZSA9IGRheXNbZGF0ZS5nZXRVVENEYXkoKV1cbiAgY29uc3QgZGF5ID0gZGF0ZS5nZXRVVENEYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IG1vbnRoID0gbW9udGhzW2RhdGUuZ2V0VVRDTW9udGgoKV1cbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKVxuICBjb25zdCBob3VyID0gZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxuICBjb25zdCBtaW51dGUgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3Qgc2Vjb25kID0gZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXG5cbiAgcmV0dXJuIGAke2RheU5hbWV9LCAke2RheX0gJHttb250aH0gJHt5ZWFyfSAke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH0gR01UYFxufVxuXG4vKipcbiBtYXgtYWdlLWF2ICAgICAgICA9IFwiTWF4LUFnZT1cIiBub24temVyby1kaWdpdCAqRElHSVRcbiAgICAgICAgICAgICAgICAgICAgICAgOyBJbiBwcmFjdGljZSwgYm90aCBleHBpcmVzLWF2IGFuZCBtYXgtYWdlLWF2XG4gICAgICAgICAgICAgICAgICAgICAgIDsgYXJlIGxpbWl0ZWQgdG8gZGF0ZXMgcmVwcmVzZW50YWJsZSBieSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgOyB1c2VyIGFnZW50LlxuICogQHBhcmFtIHtudW1iZXJ9IG1heEFnZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZU1heEFnZSAobWF4QWdlKSB7XG4gIGlmIChtYXhBZ2UgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvb2tpZSBtYXgtYWdlJylcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUjc2VjdGlvbi00LjEuMVxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5Db29raWV9IGNvb2tpZVxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnkgKGNvb2tpZSkge1xuICBpZiAoY29va2llLm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHZhbGlkYXRlQ29va2llTmFtZShjb29raWUubmFtZSlcbiAgdmFsaWRhdGVDb29raWVWYWx1ZShjb29raWUudmFsdWUpXG5cbiAgY29uc3Qgb3V0ID0gW2Ake2Nvb2tpZS5uYW1lfT0ke2Nvb2tpZS52YWx1ZX1gXVxuXG4gIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLWNvb2tpZS1wcmVmaXhlcy0wMCNzZWN0aW9uLTMuMVxuICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1jb29raWUtcHJlZml4ZXMtMDAjc2VjdGlvbi0zLjJcbiAgaWYgKGNvb2tpZS5uYW1lLnN0YXJ0c1dpdGgoJ19fU2VjdXJlLScpKSB7XG4gICAgY29va2llLnNlY3VyZSA9IHRydWVcbiAgfVxuXG4gIGlmIChjb29raWUubmFtZS5zdGFydHNXaXRoKCdfX0hvc3QtJykpIHtcbiAgICBjb29raWUuc2VjdXJlID0gdHJ1ZVxuICAgIGNvb2tpZS5kb21haW4gPSBudWxsXG4gICAgY29va2llLnBhdGggPSAnLydcbiAgfVxuXG4gIGlmIChjb29raWUuc2VjdXJlKSB7XG4gICAgb3V0LnB1c2goJ1NlY3VyZScpXG4gIH1cblxuICBpZiAoY29va2llLmh0dHBPbmx5KSB7XG4gICAgb3V0LnB1c2goJ0h0dHBPbmx5JylcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29va2llLm1heEFnZSA9PT0gJ251bWJlcicpIHtcbiAgICB2YWxpZGF0ZUNvb2tpZU1heEFnZShjb29raWUubWF4QWdlKVxuICAgIG91dC5wdXNoKGBNYXgtQWdlPSR7Y29va2llLm1heEFnZX1gKVxuICB9XG5cbiAgaWYgKGNvb2tpZS5kb21haW4pIHtcbiAgICB2YWxpZGF0ZUNvb2tpZURvbWFpbihjb29raWUuZG9tYWluKVxuICAgIG91dC5wdXNoKGBEb21haW49JHtjb29raWUuZG9tYWlufWApXG4gIH1cblxuICBpZiAoY29va2llLnBhdGgpIHtcbiAgICB2YWxpZGF0ZUNvb2tpZVBhdGgoY29va2llLnBhdGgpXG4gICAgb3V0LnB1c2goYFBhdGg9JHtjb29raWUucGF0aH1gKVxuICB9XG5cbiAgaWYgKGNvb2tpZS5leHBpcmVzICYmIGNvb2tpZS5leHBpcmVzLnRvU3RyaW5nKCkgIT09ICdJbnZhbGlkIERhdGUnKSB7XG4gICAgb3V0LnB1c2goYEV4cGlyZXM9JHt0b0lNRkRhdGUoY29va2llLmV4cGlyZXMpfWApXG4gIH1cblxuICBpZiAoY29va2llLnNhbWVTaXRlKSB7XG4gICAgb3V0LnB1c2goYFNhbWVTaXRlPSR7Y29va2llLnNhbWVTaXRlfWApXG4gIH1cblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgY29va2llLnVucGFyc2VkKSB7XG4gICAgaWYgKCFwYXJ0LmluY2x1ZGVzKCc9JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1bnBhcnNlZCcpXG4gICAgfVxuXG4gICAgY29uc3QgW2tleSwgLi4udmFsdWVdID0gcGFydC5zcGxpdCgnPScpXG5cbiAgICBvdXQucHVzaChgJHtrZXkudHJpbSgpfT0ke3ZhbHVlLmpvaW4oJz0nKX1gKVxuICB9XG5cbiAgcmV0dXJuIG91dC5qb2luKCc7ICcpXG59XG5cbmxldCBrSGVhZGVyc0xpc3ROb2RlXG5cbmZ1bmN0aW9uIGdldEhlYWRlcnNMaXN0IChoZWFkZXJzKSB7XG4gIGlmIChoZWFkZXJzW2tIZWFkZXJzTGlzdF0pIHtcbiAgICByZXR1cm4gaGVhZGVyc1trSGVhZGVyc0xpc3RdXG4gIH1cblxuICBpZiAoIWtIZWFkZXJzTGlzdE5vZGUpIHtcbiAgICBrSGVhZGVyc0xpc3ROb2RlID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhoZWFkZXJzKS5maW5kKFxuICAgICAgKHN5bWJvbCkgPT4gc3ltYm9sLmRlc2NyaXB0aW9uID09PSAnaGVhZGVycyBsaXN0J1xuICAgIClcblxuICAgIGFzc2VydChrSGVhZGVyc0xpc3ROb2RlLCAnSGVhZGVycyBjYW5ub3QgYmUgcGFyc2VkJylcbiAgfVxuXG4gIGNvbnN0IGhlYWRlcnNMaXN0ID0gaGVhZGVyc1trSGVhZGVyc0xpc3ROb2RlXVxuICBhc3NlcnQoaGVhZGVyc0xpc3QpXG5cbiAgcmV0dXJuIGhlYWRlcnNMaXN0XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0NUTEV4Y2x1ZGluZ0h0YWIsXG4gIHN0cmluZ2lmeSxcbiAgZ2V0SGVhZGVyc0xpc3Rcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgbWF4TmFtZVZhbHVlUGFpclNpemUsIG1heEF0dHJpYnV0ZVZhbHVlU2l6ZSB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBpc0NUTEV4Y2x1ZGluZ0h0YWIgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0IH0gPSByZXF1aXJlKCcuLi9mZXRjaC9kYXRhVVJMJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhcnNlcyB0aGUgZmllbGQtdmFsdWUgYXR0cmlidXRlcyBvZiBhIHNldC1jb29raWUgaGVhZGVyIHN0cmluZy5cbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNFxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICogQHJldHVybnMgaWYgdGhlIGhlYWRlciBpcyBpbnZhbGlkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VTZXRDb29raWUgKGhlYWRlcikge1xuICAvLyAxLiBJZiB0aGUgc2V0LWNvb2tpZS1zdHJpbmcgY29udGFpbnMgYSAleDAwLTA4IC8gJXgwQS0xRiAvICV4N0ZcbiAgLy8gICAgY2hhcmFjdGVyIChDVEwgY2hhcmFjdGVycyBleGNsdWRpbmcgSFRBQik6IEFib3J0IHRoZXNlIHN0ZXBzIGFuZFxuICAvLyAgICBpZ25vcmUgdGhlIHNldC1jb29raWUtc3RyaW5nIGVudGlyZWx5LlxuICBpZiAoaXNDVExFeGNsdWRpbmdIdGFiKGhlYWRlcikpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgbGV0IG5hbWVWYWx1ZVBhaXIgPSAnJ1xuICBsZXQgdW5wYXJzZWRBdHRyaWJ1dGVzID0gJydcbiAgbGV0IG5hbWUgPSAnJ1xuICBsZXQgdmFsdWUgPSAnJ1xuXG4gIC8vIDIuIElmIHRoZSBzZXQtY29va2llLXN0cmluZyBjb250YWlucyBhICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXI6XG4gIGlmIChoZWFkZXIuaW5jbHVkZXMoJzsnKSkge1xuICAgIC8vIDEuIFRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBjaGFyYWN0ZXJzIHVwIHRvLFxuICAgIC8vICAgIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzQiAoXCI7XCIpLCBhbmQgdGhlIHVucGFyc2VkLVxuICAgIC8vICAgIGF0dHJpYnV0ZXMgY29uc2lzdCBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZXQtY29va2llLXN0cmluZ1xuICAgIC8vICAgIChpbmNsdWRpbmcgdGhlICV4M0IgKFwiO1wiKSBpbiBxdWVzdGlvbikuXG4gICAgY29uc3QgcG9zaXRpb24gPSB7IHBvc2l0aW9uOiAwIH1cblxuICAgIG5hbWVWYWx1ZVBhaXIgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdCgnOycsIGhlYWRlciwgcG9zaXRpb24pXG4gICAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gaGVhZGVyLnNsaWNlKHBvc2l0aW9uLnBvc2l0aW9uKVxuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIFRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGNvbnNpc3RzIG9mIGFsbCB0aGUgY2hhcmFjdGVyc1xuICAgIC8vICAgIGNvbnRhaW5lZCBpbiB0aGUgc2V0LWNvb2tpZS1zdHJpbmcsIGFuZCB0aGUgdW5wYXJzZWQtXG4gICAgLy8gICAgYXR0cmlidXRlcyBpcyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgIG5hbWVWYWx1ZVBhaXIgPSBoZWFkZXJcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGxhY2tzIGEgJXgzRCAoXCI9XCIpIGNoYXJhY3RlciwgdGhlblxuICAvLyAgICB0aGUgbmFtZSBzdHJpbmcgaXMgZW1wdHksIGFuZCB0aGUgdmFsdWUgc3RyaW5nIGlzIHRoZSB2YWx1ZSBvZlxuICAvLyAgICBuYW1lLXZhbHVlLXBhaXIuXG4gIGlmICghbmFtZVZhbHVlUGFpci5pbmNsdWRlcygnPScpKSB7XG4gICAgdmFsdWUgPSBuYW1lVmFsdWVQYWlyXG4gIH0gZWxzZSB7XG4gICAgLy8gICAgT3RoZXJ3aXNlLCB0aGUgbmFtZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgdXAgdG8sIGJ1dFxuICAgIC8vICAgIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNEIChcIj1cIikgY2hhcmFjdGVyLCBhbmQgdGhlIChwb3NzaWJseVxuICAgIC8vICAgIGVtcHR5KSB2YWx1ZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGZpcnN0XG4gICAgLy8gICAgJXgzRCAoXCI9XCIpIGNoYXJhY3Rlci5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuICAgIG5hbWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAgICc9JyxcbiAgICAgIG5hbWVWYWx1ZVBhaXIsXG4gICAgICBwb3NpdGlvblxuICAgIClcbiAgICB2YWx1ZSA9IG5hbWVWYWx1ZVBhaXIuc2xpY2UocG9zaXRpb24ucG9zaXRpb24gKyAxKVxuICB9XG5cbiAgLy8gNC4gUmVtb3ZlIGFueSBsZWFkaW5nIG9yIHRyYWlsaW5nIFdTUCBjaGFyYWN0ZXJzIGZyb20gdGhlIG5hbWVcbiAgLy8gICAgc3RyaW5nIGFuZCB0aGUgdmFsdWUgc3RyaW5nLlxuICBuYW1lID0gbmFtZS50cmltKClcbiAgdmFsdWUgPSB2YWx1ZS50cmltKClcblxuICAvLyA1LiBJZiB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIHN0cmluZ1xuICAvLyAgICBpcyBtb3JlIHRoYW4gNDA5NiBvY3RldHMsIGFib3J0IHRoZXNlIHN0ZXBzIGFuZCBpZ25vcmUgdGhlIHNldC1cbiAgLy8gICAgY29va2llLXN0cmluZyBlbnRpcmVseS5cbiAgaWYgKG5hbWUubGVuZ3RoICsgdmFsdWUubGVuZ3RoID4gbWF4TmFtZVZhbHVlUGFpclNpemUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gNi4gVGhlIGNvb2tpZS1uYW1lIGlzIHRoZSBuYW1lIHN0cmluZywgYW5kIHRoZSBjb29raWUtdmFsdWUgaXMgdGhlXG4gIC8vICAgIHZhbHVlIHN0cmluZy5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLCB2YWx1ZSwgLi4ucGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzKVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSByZW1haW5pbmcgYXR0cmlidXRlcyBvZiBhIHNldC1jb29raWUgaGVhZGVyXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjRcbiAqIEBwYXJhbSB7c3RyaW5nfSB1bnBhcnNlZEF0dHJpYnV0ZXNcbiAqIEBwYXJhbSB7W09iamVjdC48c3RyaW5nLCB1bmtub3duPl09e319IGNvb2tpZUF0dHJpYnV0ZUxpc3RcbiAqL1xuZnVuY3Rpb24gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXMgKHVucGFyc2VkQXR0cmlidXRlcywgY29va2llQXR0cmlidXRlTGlzdCA9IHt9KSB7XG4gIC8vIDEuIElmIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHN0cmluZyBpcyBlbXB0eSwgc2tpcCB0aGUgcmVzdCBvZlxuICAvLyAgICB0aGVzZSBzdGVwcy5cbiAgaWYgKHVucGFyc2VkQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gY29va2llQXR0cmlidXRlTGlzdFxuICB9XG5cbiAgLy8gMi4gRGlzY2FyZCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzICh3aGljaFxuICAvLyAgICB3aWxsIGJlIGEgJXgzQiAoXCI7XCIpIGNoYXJhY3RlcikuXG4gIGFzc2VydCh1bnBhcnNlZEF0dHJpYnV0ZXNbMF0gPT09ICc7JylcbiAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gdW5wYXJzZWRBdHRyaWJ1dGVzLnNsaWNlKDEpXG5cbiAgbGV0IGNvb2tpZUF2ID0gJydcblxuICAvLyAzLiBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcbiAgLy8gICAgY2hhcmFjdGVyOlxuICBpZiAodW5wYXJzZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKCc7JykpIHtcbiAgICAvLyAxLiBDb25zdW1lIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHVwIHRvLCBidXRcbiAgICAvLyAgICBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzQiAoXCI7XCIpIGNoYXJhY3Rlci5cbiAgICBjb29raWVBdiA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICAgJzsnLFxuICAgICAgdW5wYXJzZWRBdHRyaWJ1dGVzLFxuICAgICAgeyBwb3NpdGlvbjogMCB9XG4gICAgKVxuICAgIHVucGFyc2VkQXR0cmlidXRlcyA9IHVucGFyc2VkQXR0cmlidXRlcy5zbGljZShjb29raWVBdi5sZW5ndGgpXG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gQ29uc3VtZSB0aGUgcmVtYWluZGVyIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzLlxuICAgIGNvb2tpZUF2ID0gdW5wYXJzZWRBdHRyaWJ1dGVzXG4gICAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gJydcbiAgfVxuXG4gIC8vIExldCB0aGUgY29va2llLWF2IHN0cmluZyBiZSB0aGUgY2hhcmFjdGVycyBjb25zdW1lZCBpbiB0aGlzIHN0ZXAuXG5cbiAgbGV0IGF0dHJpYnV0ZU5hbWUgPSAnJ1xuICBsZXQgYXR0cmlidXRlVmFsdWUgPSAnJ1xuXG4gIC8vIDQuIElmIHRoZSBjb29raWUtYXYgc3RyaW5nIGNvbnRhaW5zIGEgJXgzRCAoXCI9XCIpIGNoYXJhY3RlcjpcbiAgaWYgKGNvb2tpZUF2LmluY2x1ZGVzKCc9JykpIHtcbiAgICAvLyAxLiBUaGUgKHBvc3NpYmx5IGVtcHR5KSBhdHRyaWJ1dGUtbmFtZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlXG4gICAgLy8gICAgY2hhcmFjdGVycyB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNEIChcIj1cIilcbiAgICAvLyAgICBjaGFyYWN0ZXIsIGFuZCB0aGUgKHBvc3NpYmx5IGVtcHR5KSBhdHRyaWJ1dGUtdmFsdWUgc3RyaW5nXG4gICAgLy8gICAgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGZpcnN0ICV4M0QgKFwiPVwiKVxuICAgIC8vICAgIGNoYXJhY3Rlci5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gICAgYXR0cmlidXRlTmFtZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICAgJz0nLFxuICAgICAgY29va2llQXYsXG4gICAgICBwb3NpdGlvblxuICAgIClcbiAgICBhdHRyaWJ1dGVWYWx1ZSA9IGNvb2tpZUF2LnNsaWNlKHBvc2l0aW9uLnBvc2l0aW9uICsgMSlcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBUaGUgYXR0cmlidXRlLW5hbWUgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBlbnRpcmUgY29va2llLWF2XG4gICAgLy8gICAgc3RyaW5nLCBhbmQgdGhlIGF0dHJpYnV0ZS12YWx1ZSBzdHJpbmcgaXMgZW1wdHkuXG4gICAgYXR0cmlidXRlTmFtZSA9IGNvb2tpZUF2XG4gIH1cblxuICAvLyA1LiBSZW1vdmUgYW55IGxlYWRpbmcgb3IgdHJhaWxpbmcgV1NQIGNoYXJhY3RlcnMgZnJvbSB0aGUgYXR0cmlidXRlLVxuICAvLyAgICBuYW1lIHN0cmluZyBhbmQgdGhlIGF0dHJpYnV0ZS12YWx1ZSBzdHJpbmcuXG4gIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lLnRyaW0oKVxuICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuXG4gIC8vIDYuIElmIHRoZSBhdHRyaWJ1dGUtdmFsdWUgaXMgbG9uZ2VyIHRoYW4gMTAyNCBvY3RldHMsIGlnbm9yZSB0aGVcbiAgLy8gICAgY29va2llLWF2IHN0cmluZyBhbmQgcmV0dXJuIHRvIFN0ZXAgMSBvZiB0aGlzIGFsZ29yaXRobS5cbiAgaWYgKGF0dHJpYnV0ZVZhbHVlLmxlbmd0aCA+IG1heEF0dHJpYnV0ZVZhbHVlU2l6ZSkge1xuICAgIHJldHVybiBwYXJzZVVucGFyc2VkQXR0cmlidXRlcyh1bnBhcnNlZEF0dHJpYnV0ZXMsIGNvb2tpZUF0dHJpYnV0ZUxpc3QpXG4gIH1cblxuICAvLyA3LiBQcm9jZXNzIHRoZSBhdHRyaWJ1dGUtbmFtZSBhbmQgYXR0cmlidXRlLXZhbHVlIGFjY29yZGluZyB0byB0aGVcbiAgLy8gICAgcmVxdWlyZW1lbnRzIGluIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbnMuICAoTm90aWNlIHRoYXRcbiAgLy8gICAgYXR0cmlidXRlcyB3aXRoIHVucmVjb2duaXplZCBhdHRyaWJ1dGUtbmFtZXMgYXJlIGlnbm9yZWQuKVxuICBjb25zdCBhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID0gYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC4xXG4gIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nXG4gIC8vIFwiRXhwaXJlc1wiLCB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLlxuICBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ2V4cGlyZXMnKSB7XG4gICAgLy8gMS4gTGV0IHRoZSBleHBpcnktdGltZSBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGF0dHJpYnV0ZS12YWx1ZVxuICAgIC8vICAgIGFzIGNvb2tpZS1kYXRlIChzZWUgU2VjdGlvbiA1LjEuMSkuXG4gICAgY29uc3QgZXhwaXJ5VGltZSA9IG5ldyBEYXRlKGF0dHJpYnV0ZVZhbHVlKVxuXG4gICAgLy8gMi4gSWYgdGhlIGF0dHJpYnV0ZS12YWx1ZSBmYWlsZWQgdG8gcGFyc2UgYXMgYSBjb29raWUgZGF0ZSwgaWdub3JlXG4gICAgLy8gICAgdGhlIGNvb2tpZS1hdi5cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QuZXhwaXJlcyA9IGV4cGlyeVRpbWVcbiAgfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID09PSAnbWF4LWFnZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjJcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyBcIk1heC1cbiAgICAvLyBBZ2VcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93cy5cblxuICAgIC8vIDEuIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGF0dHJpYnV0ZS12YWx1ZSBpcyBub3QgYSBESUdJVCBvciBhXG4gICAgLy8gICAgXCItXCIgY2hhcmFjdGVyLCBpZ25vcmUgdGhlIGNvb2tpZS1hdi5cbiAgICBjb25zdCBjaGFyQ29kZSA9IGF0dHJpYnV0ZVZhbHVlLmNoYXJDb2RlQXQoMClcblxuICAgIGlmICgoY2hhckNvZGUgPCA0OCB8fCBjaGFyQ29kZSA+IDU3KSAmJiBhdHRyaWJ1dGVWYWx1ZVswXSAhPT0gJy0nKSB7XG4gICAgICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxuICAgIH1cblxuICAgIC8vIDIuIElmIHRoZSByZW1haW5kZXIgb2YgYXR0cmlidXRlLXZhbHVlIGNvbnRhaW5zIGEgbm9uLURJR0lUXG4gICAgLy8gICAgY2hhcmFjdGVyLCBpZ25vcmUgdGhlIGNvb2tpZS1hdi5cbiAgICBpZiAoIS9eXFxkKyQvLnRlc3QoYXR0cmlidXRlVmFsdWUpKSB7XG4gICAgICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxuICAgIH1cblxuICAgIC8vIDMuIExldCBkZWx0YS1zZWNvbmRzIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUgY29udmVydGVkIHRvIGFuIGludGVnZXIuXG4gICAgY29uc3QgZGVsdGFTZWNvbmRzID0gTnVtYmVyKGF0dHJpYnV0ZVZhbHVlKVxuXG4gICAgLy8gNC4gTGV0IGNvb2tpZS1hZ2UtbGltaXQgYmUgdGhlIG1heGltdW0gYWdlIG9mIHRoZSBjb29raWUgKHdoaWNoXG4gICAgLy8gICAgU0hPVUxEIGJlIDQwMCBkYXlzIG9yIGxlc3MsIHNlZSBTZWN0aW9uIDQuMS4yLjIpLlxuXG4gICAgLy8gNS4gU2V0IGRlbHRhLXNlY29uZHMgdG8gdGhlIHNtYWxsZXIgb2YgaXRzIHByZXNlbnQgdmFsdWUgYW5kIGNvb2tpZS1cbiAgICAvLyAgICBhZ2UtbGltaXQuXG4gICAgLy8gZGVsdGFTZWNvbmRzID0gTWF0aC5taW4oZGVsdGFTZWNvbmRzICogMTAwMCwgbWF4RXhwaXJlc01zKVxuXG4gICAgLy8gNi4gSWYgZGVsdGEtc2Vjb25kcyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybyAoMCksIGxldCBleHBpcnktXG4gICAgLy8gICAgdGltZSBiZSB0aGUgZWFybGllc3QgcmVwcmVzZW50YWJsZSBkYXRlIGFuZCB0aW1lLiAgT3RoZXJ3aXNlLCBsZXRcbiAgICAvLyAgICB0aGUgZXhwaXJ5LXRpbWUgYmUgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBwbHVzIGRlbHRhLXNlY29uZHNcbiAgICAvLyAgICBzZWNvbmRzLlxuICAgIC8vIGNvbnN0IGV4cGlyeVRpbWUgPSBkZWx0YVNlY29uZHMgPD0gMCA/IERhdGUubm93KCkgOiBEYXRlLm5vdygpICsgZGVsdGFTZWNvbmRzXG5cbiAgICAvLyA3LiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIE1heC1BZ2UgYW5kIGFuIGF0dHJpYnV0ZS12YWx1ZSBvZiBleHBpcnktdGltZS5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0Lm1heEFnZSA9IGRlbHRhU2Vjb25kc1xuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdkb21haW4nKSB7XG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC4zXG4gICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRoZSBzdHJpbmcgXCJEb21haW5cIixcbiAgICAvLyB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLlxuXG4gICAgLy8gMS4gTGV0IGNvb2tpZS1kb21haW4gYmUgdGhlIGF0dHJpYnV0ZS12YWx1ZS5cbiAgICBsZXQgY29va2llRG9tYWluID0gYXR0cmlidXRlVmFsdWVcblxuICAgIC8vIDIuIElmIGNvb2tpZS1kb21haW4gc3RhcnRzIHdpdGggJXgyRSAoXCIuXCIpLCBsZXQgY29va2llLWRvbWFpbiBiZVxuICAgIC8vICAgIGNvb2tpZS1kb21haW4gd2l0aG91dCBpdHMgbGVhZGluZyAleDJFIChcIi5cIikuXG4gICAgaWYgKGNvb2tpZURvbWFpblswXSA9PT0gJy4nKSB7XG4gICAgICBjb29raWVEb21haW4gPSBjb29raWVEb21haW4uc2xpY2UoMSlcbiAgICB9XG5cbiAgICAvLyAzLiBDb252ZXJ0IHRoZSBjb29raWUtZG9tYWluIHRvIGxvd2VyIGNhc2UuXG4gICAgY29va2llRG9tYWluID0gY29va2llRG9tYWluLnRvTG93ZXJDYXNlKClcblxuICAgIC8vIDQuIEFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdCB3aXRoIGFuXG4gICAgLy8gICAgYXR0cmlidXRlLW5hbWUgb2YgRG9tYWluIGFuZCBhbiBhdHRyaWJ1dGUtdmFsdWUgb2YgY29va2llLWRvbWFpbi5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LmRvbWFpbiA9IGNvb2tpZURvbWFpblxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdwYXRoJykge1xuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjQuNFxuICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nIFwiUGF0aFwiLFxuICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1QgcHJvY2VzcyB0aGUgY29va2llLWF2IGFzIGZvbGxvd3MuXG5cbiAgICAvLyAxLiBJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlXG4gICAgLy8gICAgYXR0cmlidXRlLXZhbHVlIGlzIG5vdCAleDJGIChcIi9cIik6XG4gICAgbGV0IGNvb2tpZVBhdGggPSAnJ1xuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZS5sZW5ndGggPT09IDAgfHwgYXR0cmlidXRlVmFsdWVbMF0gIT09ICcvJykge1xuICAgICAgLy8gMS4gTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBkZWZhdWx0LXBhdGguXG4gICAgICBjb29raWVQYXRoID0gJy8nXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZTpcblxuICAgICAgLy8gMS4gTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUuXG4gICAgICBjb29raWVQYXRoID0gYXR0cmlidXRlVmFsdWVcbiAgICB9XG5cbiAgICAvLyAyLiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIFBhdGggYW5kIGFuIGF0dHJpYnV0ZS12YWx1ZSBvZiBjb29raWUtcGF0aC5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LnBhdGggPSBjb29raWVQYXRoXG4gIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ3NlY3VyZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjVcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyBcIlNlY3VyZVwiLFxuICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1QgYXBwZW5kIGFuIGF0dHJpYnV0ZSB0byB0aGUgY29va2llLWF0dHJpYnV0ZS1saXN0XG4gICAgLy8gd2l0aCBhbiBhdHRyaWJ1dGUtbmFtZSBvZiBTZWN1cmUgYW5kIGFuIGVtcHR5IGF0dHJpYnV0ZS12YWx1ZS5cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3Quc2VjdXJlID0gdHJ1ZVxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdodHRwb25seScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjZcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZ1xuICAgIC8vIFwiSHR0cE9ubHlcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBhcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtXG4gICAgLy8gYXR0cmlidXRlLWxpc3Qgd2l0aCBhbiBhdHRyaWJ1dGUtbmFtZSBvZiBIdHRwT25seSBhbmQgYW4gZW1wdHlcbiAgICAvLyBhdHRyaWJ1dGUtdmFsdWUuXG5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0Lmh0dHBPbmx5ID0gdHJ1ZVxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdzYW1lc2l0ZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjdcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZ1xuICAgIC8vIFwiU2FtZVNpdGVcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93czpcblxuICAgIC8vIDEuIExldCBlbmZvcmNlbWVudCBiZSBcIkRlZmF1bHRcIi5cbiAgICBsZXQgZW5mb3JjZW1lbnQgPSAnRGVmYXVsdCdcblxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlTG93ZXJjYXNlID0gYXR0cmlidXRlVmFsdWUudG9Mb3dlckNhc2UoKVxuICAgIC8vIDIuIElmIGNvb2tpZS1hdidzIGF0dHJpYnV0ZS12YWx1ZSBpcyBhIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yXG4gICAgLy8gICAgXCJOb25lXCIsIHNldCBlbmZvcmNlbWVudCB0byBcIk5vbmVcIi5cbiAgICBpZiAoYXR0cmlidXRlVmFsdWVMb3dlcmNhc2UuaW5jbHVkZXMoJ25vbmUnKSkge1xuICAgICAgZW5mb3JjZW1lbnQgPSAnTm9uZSdcbiAgICB9XG5cbiAgICAvLyAzLiBJZiBjb29raWUtYXYncyBhdHRyaWJ1dGUtdmFsdWUgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAgIC8vICAgIFwiU3RyaWN0XCIsIHNldCBlbmZvcmNlbWVudCB0byBcIlN0cmljdFwiLlxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZUxvd2VyY2FzZS5pbmNsdWRlcygnc3RyaWN0JykpIHtcbiAgICAgIGVuZm9yY2VtZW50ID0gJ1N0cmljdCdcbiAgICB9XG5cbiAgICAvLyA0LiBJZiBjb29raWUtYXYncyBhdHRyaWJ1dGUtdmFsdWUgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAgIC8vICAgIFwiTGF4XCIsIHNldCBlbmZvcmNlbWVudCB0byBcIkxheFwiLlxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZUxvd2VyY2FzZS5pbmNsdWRlcygnbGF4JykpIHtcbiAgICAgIGVuZm9yY2VtZW50ID0gJ0xheCdcbiAgICB9XG5cbiAgICAvLyA1LiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIFwiU2FtZVNpdGVcIiBhbmQgYW4gYXR0cmlidXRlLXZhbHVlIG9mXG4gICAgLy8gICAgZW5mb3JjZW1lbnQuXG4gICAgY29va2llQXR0cmlidXRlTGlzdC5zYW1lU2l0ZSA9IGVuZm9yY2VtZW50XG4gIH0gZWxzZSB7XG4gICAgY29va2llQXR0cmlidXRlTGlzdC51bnBhcnNlZCA/Pz0gW11cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QudW5wYXJzZWQucHVzaChgJHthdHRyaWJ1dGVOYW1lfT0ke2F0dHJpYnV0ZVZhbHVlfWApXG4gIH1cblxuICAvLyA4LiBSZXR1cm4gdG8gU3RlcCAxIG9mIHRoaXMgYWxnb3JpdGhtLlxuICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2VTZXRDb29raWUsXG4gIHBhcnNlVW5wYXJzZWRBdHRyaWJ1dGVzXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHBhcnNlU2V0Q29va2llIH0gPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHsgc3RyaW5naWZ5LCBnZXRIZWFkZXJzTGlzdCB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBIZWFkZXJzIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9oZWFkZXJzJylcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb29raWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7RGF0ZXxudW1iZXJ8dW5kZWZpbmVkfSBleHBpcmVzXG4gKiBAcHJvcGVydHkge251bWJlcnx1bmRlZmluZWR9IG1heEFnZVxuICogQHByb3BlcnR5IHtzdHJpbmd8dW5kZWZpbmVkfSBkb21haW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfHVuZGVmaW5lZH0gcGF0aFxuICogQHByb3BlcnR5IHtib29sZWFufHVuZGVmaW5lZH0gc2VjdXJlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW58dW5kZWZpbmVkfSBodHRwT25seVxuICogQHByb3BlcnR5IHsnU3RyaWN0J3wnTGF4J3wnTm9uZSd9IHNhbWVTaXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSB1bnBhcnNlZFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtIZWFkZXJzfSBoZWFkZXJzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn1cbiAqL1xuZnVuY3Rpb24gZ2V0Q29va2llcyAoaGVhZGVycykge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnZ2V0Q29va2llcycgfSlcblxuICB3ZWJpZGwuYnJhbmRDaGVjayhoZWFkZXJzLCBIZWFkZXJzLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICBjb25zdCBjb29raWUgPSBoZWFkZXJzLmdldCgnY29va2llJylcbiAgY29uc3Qgb3V0ID0ge31cblxuICBpZiAoIWNvb2tpZSkge1xuICAgIHJldHVybiBvdXRcbiAgfVxuXG4gIGZvciAoY29uc3QgcGllY2Ugb2YgY29va2llLnNwbGl0KCc7JykpIHtcbiAgICBjb25zdCBbbmFtZSwgLi4udmFsdWVdID0gcGllY2Uuc3BsaXQoJz0nKVxuXG4gICAgb3V0W25hbWUudHJpbSgpXSA9IHZhbHVlLmpvaW4oJz0nKVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyc1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7eyBwYXRoPzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcgfXx1bmRlZmluZWR9IGF0dHJpYnV0ZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBkZWxldGVDb29raWUgKGhlYWRlcnMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ2RlbGV0ZUNvb2tpZScgfSlcblxuICB3ZWJpZGwuYnJhbmRDaGVjayhoZWFkZXJzLCBIZWFkZXJzLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKG5hbWUpXG4gIGF0dHJpYnV0ZXMgPSB3ZWJpZGwuY29udmVydGVycy5EZWxldGVDb29raWVBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpXG5cbiAgLy8gTWF0Y2hlcyBiZWhhdmlvciBvZlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGVub2xhbmQvZGVub19zdGQvYmxvYi82MzgyN2IxNjMzMGI4MjQ4OWEwNDYxNDAyN2MzM2I3OTA0ZTA4YmU1L2h0dHAvY29va2llLnRzI0wyNzhcbiAgc2V0Q29va2llKGhlYWRlcnMsIHtcbiAgICBuYW1lLFxuICAgIHZhbHVlOiAnJyxcbiAgICBleHBpcmVzOiBuZXcgRGF0ZSgwKSxcbiAgICAuLi5hdHRyaWJ1dGVzXG4gIH0pXG59XG5cbi8qKlxuICogQHBhcmFtIHtIZWFkZXJzfSBoZWFkZXJzXG4gKiBAcmV0dXJucyB7Q29va2llW119XG4gKi9cbmZ1bmN0aW9uIGdldFNldENvb2tpZXMgKGhlYWRlcnMpIHtcbiAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ2dldFNldENvb2tpZXMnIH0pXG5cbiAgd2ViaWRsLmJyYW5kQ2hlY2soaGVhZGVycywgSGVhZGVycywgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgY29uc3QgY29va2llcyA9IGdldEhlYWRlcnNMaXN0KGhlYWRlcnMpLmNvb2tpZXNcblxuICBpZiAoIWNvb2tpZXMpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIC8vIEluIG9sZGVyIHZlcnNpb25zIG9mIHVuZGljaSwgY29va2llcyBpcyBhIGxpc3Qgb2YgbmFtZTp2YWx1ZS5cbiAgcmV0dXJuIGNvb2tpZXMubWFwKChwYWlyKSA9PiBwYXJzZVNldENvb2tpZShBcnJheS5pc0FycmF5KHBhaXIpID8gcGFpclsxXSA6IHBhaXIpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyc1xuICogQHBhcmFtIHtDb29raWV9IGNvb2tpZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHNldENvb2tpZSAoaGVhZGVycywgY29va2llKSB7XG4gIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMiwgeyBoZWFkZXI6ICdzZXRDb29raWUnIH0pXG5cbiAgd2ViaWRsLmJyYW5kQ2hlY2soaGVhZGVycywgSGVhZGVycywgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgY29va2llID0gd2ViaWRsLmNvbnZlcnRlcnMuQ29va2llKGNvb2tpZSlcblxuICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoY29va2llKVxuXG4gIGlmIChzdHIpIHtcbiAgICBoZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZScsIHN0cmluZ2lmeShjb29raWUpKVxuICB9XG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLkRlbGV0ZUNvb2tpZUF0dHJpYnV0ZXMgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcpLFxuICAgIGtleTogJ3BhdGgnLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKSxcbiAgICBrZXk6ICdkb21haW4nLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVycy5Db29raWUgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICBrZXk6ICduYW1lJ1xuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAga2V5OiAndmFsdWUnXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcigodmFsdWUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyBsb25nJ10odmFsdWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSlcbiAgICB9KSxcbiAgICBrZXk6ICdleHBpcmVzJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzWydsb25nIGxvbmcnXSksXG4gICAga2V5OiAnbWF4QWdlJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAnZG9tYWluJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAncGF0aCcsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ib29sZWFuKSxcbiAgICBrZXk6ICdzZWN1cmUnLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbiksXG4gICAga2V5OiAnaHR0cE9ubHknLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcsXG4gICAga2V5OiAnc2FtZVNpdGUnLFxuICAgIGFsbG93ZWRWYWx1ZXM6IFsnU3RyaWN0JywgJ0xheCcsICdOb25lJ11cbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAndW5wYXJzZWQnLFxuICAgIGRlZmF1bHRWYWx1ZTogW11cbiAgfVxuXSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvb2tpZXMsXG4gIGRlbGV0ZUNvb2tpZSxcbiAgZ2V0U2V0Q29va2llcyxcbiAgc2V0Q29va2llXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBUaGlzIGlzIGEgR2xvYmFsbHkgVW5pcXVlIElkZW50aWZpZXIgdW5pcXVlIHVzZWRcbi8vIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGVuZHBvaW50IGFjY2VwdHMgd2Vic29ja2V0XG4vLyBjb25uZWN0aW9ucy5cbi8vIFNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjQ1NS5odG1sI3NlY3Rpb24tMS4zXG5jb25zdCB1aWQgPSAnMjU4RUFGQTUtRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExJ1xuXG4vKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi9cbmNvbnN0IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMgPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZVxufVxuXG5jb25zdCBzdGF0ZXMgPSB7XG4gIENPTk5FQ1RJTkc6IDAsXG4gIE9QRU46IDEsXG4gIENMT1NJTkc6IDIsXG4gIENMT1NFRDogM1xufVxuXG5jb25zdCBvcGNvZGVzID0ge1xuICBDT05USU5VQVRJT046IDB4MCxcbiAgVEVYVDogMHgxLFxuICBCSU5BUlk6IDB4MixcbiAgQ0xPU0U6IDB4OCxcbiAgUElORzogMHg5LFxuICBQT05HOiAweEFcbn1cblxuY29uc3QgbWF4VW5zaWduZWQxNkJpdCA9IDIgKiogMTYgLSAxIC8vIDY1NTM1XG5cbmNvbnN0IHBhcnNlclN0YXRlcyA9IHtcbiAgSU5GTzogMCxcbiAgUEFZTE9BRExFTkdUSF8xNjogMixcbiAgUEFZTE9BRExFTkdUSF82NDogMyxcbiAgUkVBRF9EQVRBOiA0XG59XG5cbmNvbnN0IGVtcHR5QnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKDApXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB1aWQsXG4gIHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHN0YXRlcyxcbiAgb3Bjb2RlcyxcbiAgbWF4VW5zaWduZWQxNkJpdCxcbiAgcGFyc2VyU3RhdGVzLFxuICBlbXB0eUJ1ZmZlclxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtXZWJTb2NrZXRVUkw6IFN5bWJvbCgndXJsJyksXG4gIGtSZWFkeVN0YXRlOiBTeW1ib2woJ3JlYWR5IHN0YXRlJyksXG4gIGtDb250cm9sbGVyOiBTeW1ib2woJ2NvbnRyb2xsZXInKSxcbiAga1Jlc3BvbnNlOiBTeW1ib2woJ3Jlc3BvbnNlJyksXG4gIGtCaW5hcnlUeXBlOiBTeW1ib2woJ2JpbmFyeSB0eXBlJyksXG4gIGtTZW50Q2xvc2U6IFN5bWJvbCgnc2VudCBjbG9zZScpLFxuICBrUmVjZWl2ZWRDbG9zZTogU3ltYm9sKCdyZWNlaXZlZCBjbG9zZScpLFxuICBrQnl0ZVBhcnNlcjogU3ltYm9sKCdieXRlIHBhcnNlcicpXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvd2ViaWRsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgTWVzc2FnZVBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJylcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NvbW1zLmh0bWwjbWVzc2FnZWV2ZW50XG4gKi9cbmNsYXNzIE1lc3NhZ2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnTWVzc2FnZUV2ZW50IGNvbnN0cnVjdG9yJyB9KVxuXG4gICAgdHlwZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyh0eXBlKVxuICAgIGV2ZW50SW5pdERpY3QgPSB3ZWJpZGwuY29udmVydGVycy5NZXNzYWdlRXZlbnRJbml0KGV2ZW50SW5pdERpY3QpXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICB9XG5cbiAgZ2V0IGRhdGEgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuZGF0YVxuICB9XG5cbiAgZ2V0IG9yaWdpbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5vcmlnaW5cbiAgfVxuXG4gIGdldCBsYXN0RXZlbnRJZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5sYXN0RXZlbnRJZFxuICB9XG5cbiAgZ2V0IHNvdXJjZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5zb3VyY2VcbiAgfVxuXG4gIGdldCBwb3J0cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4odGhpcy4jZXZlbnRJbml0LnBvcnRzKSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLiNldmVudEluaXQucG9ydHMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5wb3J0c1xuICB9XG5cbiAgaW5pdE1lc3NhZ2VFdmVudCAoXG4gICAgdHlwZSxcbiAgICBidWJibGVzID0gZmFsc2UsXG4gICAgY2FuY2VsYWJsZSA9IGZhbHNlLFxuICAgIGRhdGEgPSBudWxsLFxuICAgIG9yaWdpbiA9ICcnLFxuICAgIGxhc3RFdmVudElkID0gJycsXG4gICAgc291cmNlID0gbnVsbCxcbiAgICBwb3J0cyA9IFtdXG4gICkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdNZXNzYWdlRXZlbnQuaW5pdE1lc3NhZ2VFdmVudCcgfSlcblxuICAgIHJldHVybiBuZXcgTWVzc2FnZUV2ZW50KHR5cGUsIHtcbiAgICAgIGJ1YmJsZXMsIGNhbmNlbGFibGUsIGRhdGEsIG9yaWdpbiwgbGFzdEV2ZW50SWQsIHNvdXJjZSwgcG9ydHNcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyN0aGUtY2xvc2VldmVudC1pbnRlcmZhY2VcbiAqL1xuY2xhc3MgQ2xvc2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2xvc2VFdmVudCBjb25zdHJ1Y3RvcicgfSlcblxuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSlcbiAgICBldmVudEluaXREaWN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2xvc2VFdmVudEluaXQoZXZlbnRJbml0RGljdClcblxuICAgIHN1cGVyKHR5cGUsIGV2ZW50SW5pdERpY3QpXG5cbiAgICB0aGlzLiNldmVudEluaXQgPSBldmVudEluaXREaWN0XG4gIH1cblxuICBnZXQgd2FzQ2xlYW4gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENsb3NlRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lndhc0NsZWFuXG4gIH1cblxuICBnZXQgY29kZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2xvc2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuY29kZVxuICB9XG5cbiAgZ2V0IHJlYXNvbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2xvc2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQucmVhc29uXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI3RoZS1lcnJvcmV2ZW50LWludGVyZmFjZVxuY2xhc3MgRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0KSB7XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Vycm9yRXZlbnQgY29uc3RydWN0b3InIH0pXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdHlwZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyh0eXBlKVxuICAgIGV2ZW50SW5pdERpY3QgPSB3ZWJpZGwuY29udmVydGVycy5FcnJvckV2ZW50SW5pdChldmVudEluaXREaWN0ID8/IHt9KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICB9XG5cbiAgZ2V0IG1lc3NhZ2UgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEVycm9yRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lm1lc3NhZ2VcbiAgfVxuXG4gIGdldCBmaWxlbmFtZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRXJyb3JFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuZmlsZW5hbWVcbiAgfVxuXG4gIGdldCBsaW5lbm8gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEVycm9yRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0LmxpbmVub1xuICB9XG5cbiAgZ2V0IGNvbG5vICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5jb2xub1xuICB9XG5cbiAgZ2V0IGVycm9yICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5lcnJvclxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE1lc3NhZ2VFdmVudC5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ01lc3NhZ2VFdmVudCcsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIGRhdGE6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9yaWdpbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbGFzdEV2ZW50SWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHNvdXJjZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcG9ydHM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGluaXRNZXNzYWdlRXZlbnQ6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENsb3NlRXZlbnQucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDbG9zZUV2ZW50JyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSxcbiAgcmVhc29uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjb2RlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICB3YXNDbGVhbjoga0VudW1lcmFibGVQcm9wZXJ0eVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRXJyb3JFdmVudC5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0Vycm9yRXZlbnQnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBtZXNzYWdlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBmaWxlbmFtZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbGluZW5vOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjb2xubzoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VQb3J0ID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihNZXNzYWdlUG9ydClcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPE1lc3NhZ2VQb3J0PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5NZXNzYWdlUG9ydFxuKVxuXG5jb25zdCBldmVudEluaXQgPSBbXG4gIHtcbiAgICBrZXk6ICdidWJibGVzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY2FuY2VsYWJsZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBvc2VkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9XG5dXG5cbndlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIC4uLmV2ZW50SW5pdCxcbiAge1xuICAgIGtleTogJ2RhdGEnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYW55LFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAga2V5OiAnb3JpZ2luJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdsYXN0RXZlbnRJZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnc291cmNlJyxcbiAgICAvLyBOb2RlIGRvZXNuJ3QgaW1wbGVtZW50IFdpbmRvd1Byb3h5IG9yIFNlcnZpY2VXb3JrZXIsIHNvIHRoZSBvbmx5XG4gICAgLy8gdmFsaWQgdmFsdWUgZm9yIHNvdXJjZSBpcyBhIE1lc3NhZ2VQb3J0LlxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VQb3J0KSxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGtleTogJ3BvcnRzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxNZXNzYWdlUG9ydD4nXSxcbiAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXSlcblxud2ViaWRsLmNvbnZlcnRlcnMuQ2xvc2VFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIC4uLmV2ZW50SW5pdCxcbiAge1xuICAgIGtleTogJ3dhc0NsZWFuJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY29kZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgc2hvcnQnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3JlYXNvbicsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVycy5FcnJvckV2ZW50SW5pdCA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAgLi4uZXZlbnRJbml0LFxuICB7XG4gICAga2V5OiAnbWVzc2FnZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnZmlsZW5hbWUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogJydcbiAgfSxcbiAge1xuICAgIGtleTogJ2xpbmVubycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyddLFxuICAgIGRlZmF1bHRWYWx1ZTogMFxuICB9LFxuICB7XG4gICAga2V5OiAnY29sbm8nLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ2Vycm9yJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmFueVxuICB9XG5dKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTWVzc2FnZUV2ZW50LFxuICBDbG9zZUV2ZW50LFxuICBFcnJvckV2ZW50XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGtSZWFkeVN0YXRlLCBrQ29udHJvbGxlciwga1Jlc3BvbnNlLCBrQmluYXJ5VHlwZSwga1dlYlNvY2tldFVSTCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgc3RhdGVzLCBvcGNvZGVzIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IE1lc3NhZ2VFdmVudCwgRXJyb3JFdmVudCB9ID0gcmVxdWlyZSgnLi9ldmVudHMnKVxuXG4vKiBnbG9iYWxzIEJsb2IgKi9cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKi9cbmZ1bmN0aW9uIGlzRXN0YWJsaXNoZWQgKHdzKSB7XG4gIC8vIElmIHRoZSBzZXJ2ZXIncyByZXNwb25zZSBpcyB2YWxpZGF0ZWQgYXMgcHJvdmlkZWQgZm9yIGFib3ZlLCBpdCBpc1xuICAvLyBzYWlkIHRoYXQgX1RoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbiBpcyBFc3RhYmxpc2hlZF8gYW5kIHRoYXQgdGhlXG4gIC8vIFdlYlNvY2tldCBDb25uZWN0aW9uIGlzIGluIHRoZSBPUEVOIHN0YXRlLlxuICByZXR1cm4gd3Nba1JlYWR5U3RhdGVdID09PSBzdGF0ZXMuT1BFTlxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqL1xuZnVuY3Rpb24gaXNDbG9zaW5nICh3cykge1xuICAvLyBVcG9uIGVpdGhlciBzZW5kaW5nIG9yIHJlY2VpdmluZyBhIENsb3NlIGNvbnRyb2wgZnJhbWUsIGl0IGlzIHNhaWRcbiAgLy8gdGhhdCBfVGhlIFdlYlNvY2tldCBDbG9zaW5nIEhhbmRzaGFrZSBpcyBTdGFydGVkXyBhbmQgdGhhdCB0aGVcbiAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgaW4gdGhlIENMT1NJTkcgc3RhdGUuXG4gIHJldHVybiB3c1trUmVhZHlTdGF0ZV0gPT09IHN0YXRlcy5DTE9TSU5HXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vd2Vic29ja2V0JykuV2ViU29ja2V0fSB3c1xuICovXG5mdW5jdGlvbiBpc0Nsb3NlZCAod3MpIHtcbiAgcmV0dXJuIHdzW2tSZWFkeVN0YXRlXSA9PT0gc3RhdGVzLkNMT1NFRFxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWV2ZW50LWZpcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBlXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAqIEBwYXJhbSB7RXZlbnRJbml0IHwgdW5kZWZpbmVkfSBldmVudEluaXREaWN0XG4gKi9cbmZ1bmN0aW9uIGZpcmVFdmVudCAoZSwgdGFyZ2V0LCBldmVudENvbnN0cnVjdG9yID0gRXZlbnQsIGV2ZW50SW5pdERpY3QpIHtcbiAgLy8gMS4gSWYgZXZlbnRDb25zdHJ1Y3RvciBpcyBub3QgZ2l2ZW4sIHRoZW4gbGV0IGV2ZW50Q29uc3RydWN0b3IgYmUgRXZlbnQuXG5cbiAgLy8gMi4gTGV0IGV2ZW50IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gZXZlbnQgZ2l2ZW4gZXZlbnRDb25zdHJ1Y3RvcixcbiAgLy8gICAgaW4gdGhlIHJlbGV2YW50IHJlYWxtIG9mIHRhcmdldC5cbiAgLy8gMy4gSW5pdGlhbGl6ZSBldmVudOKAmXMgdHlwZSBhdHRyaWJ1dGUgdG8gZS5cbiAgY29uc3QgZXZlbnQgPSBuZXcgZXZlbnRDb25zdHJ1Y3RvcihlLCBldmVudEluaXREaWN0KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcblxuICAvLyA0LiBJbml0aWFsaXplIGFueSBvdGhlciBJREwgYXR0cmlidXRlcyBvZiBldmVudCBhcyBkZXNjcmliZWQgaW4gdGhlXG4gIC8vICAgIGludm9jYXRpb24gb2YgdGhpcyBhbGdvcml0aG0uXG5cbiAgLy8gNS4gUmV0dXJuIHRoZSByZXN1bHQgb2YgZGlzcGF0Y2hpbmcgZXZlbnQgYXQgdGFyZ2V0LCB3aXRoIGxlZ2FjeSB0YXJnZXRcbiAgLy8gICAgb3ZlcnJpZGUgZmxhZyBzZXQgaWYgc2V0LlxuICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2ZlZWRiYWNrLWZyb20tdGhlLXByb3RvY29sXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZSBPcGNvZGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIGFwcGxpY2F0aW9uIGRhdGFcbiAqL1xuZnVuY3Rpb24gd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkICh3cywgdHlwZSwgZGF0YSkge1xuICAvLyAxLiBJZiByZWFkeSBzdGF0ZSBpcyBub3QgT1BFTiAoMSksIHRoZW4gcmV0dXJuLlxuICBpZiAod3Nba1JlYWR5U3RhdGVdICE9PSBzdGF0ZXMuT1BFTikge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMi4gTGV0IGRhdGFGb3JFdmVudCBiZSBkZXRlcm1pbmVkIGJ5IHN3aXRjaGluZyBvbiB0eXBlIGFuZCBiaW5hcnkgdHlwZTpcbiAgbGV0IGRhdGFGb3JFdmVudFxuXG4gIGlmICh0eXBlID09PSBvcGNvZGVzLlRFWFQpIHtcbiAgICAvLyAtPiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIGlzIFRleHRcbiAgICAvLyAgICAgIGEgbmV3IERPTVN0cmluZyBjb250YWluaW5nIGRhdGFcbiAgICB0cnkge1xuICAgICAgZGF0YUZvckV2ZW50ID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcsIHsgZmF0YWw6IHRydWUgfSkuZGVjb2RlKGRhdGEpXG4gICAgfSBjYXRjaCB7XG4gICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1JlY2VpdmVkIGludmFsaWQgVVRGLTggaW4gdGV4dCBmcmFtZS4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09IG9wY29kZXMuQklOQVJZKSB7XG4gICAgaWYgKHdzW2tCaW5hcnlUeXBlXSA9PT0gJ2Jsb2InKSB7XG4gICAgICAvLyAtPiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIGlzIEJpbmFyeSBhbmQgYmluYXJ5IHR5cGUgaXMgXCJibG9iXCJcbiAgICAgIC8vICAgICAgYSBuZXcgQmxvYiBvYmplY3QsIGNyZWF0ZWQgaW4gdGhlIHJlbGV2YW50IFJlYWxtIG9mIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vICAgICAgb2JqZWN0LCB0aGF0IHJlcHJlc2VudHMgZGF0YSBhcyBpdHMgcmF3IGRhdGFcbiAgICAgIGRhdGFGb3JFdmVudCA9IG5ldyBCbG9iKFtkYXRhXSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gLT4gdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBpcyBCaW5hcnkgYW5kIGJpbmFyeSB0eXBlIGlzIFwiYXJyYXlidWZmZXJcIlxuICAgICAgLy8gICAgICBhIG5ldyBBcnJheUJ1ZmZlciBvYmplY3QsIGNyZWF0ZWQgaW4gdGhlIHJlbGV2YW50IFJlYWxtIG9mIHRoZVxuICAgICAgLy8gICAgICBXZWJTb2NrZXQgb2JqZWN0LCB3aG9zZSBjb250ZW50cyBhcmUgZGF0YVxuICAgICAgZGF0YUZvckV2ZW50ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSkuYnVmZmVyXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gRmlyZSBhbiBldmVudCBuYW1lZCBtZXNzYWdlIGF0IHRoZSBXZWJTb2NrZXQgb2JqZWN0LCB1c2luZyBNZXNzYWdlRXZlbnQsXG4gIC8vICAgIHdpdGggdGhlIG9yaWdpbiBhdHRyaWJ1dGUgaW5pdGlhbGl6ZWQgdG8gdGhlIHNlcmlhbGl6YXRpb24gb2YgdGhlIFdlYlNvY2tldFxuICAvLyAgICBvYmplY3TigJlzIHVybCdzIG9yaWdpbiwgYW5kIHRoZSBkYXRhIGF0dHJpYnV0ZSBpbml0aWFsaXplZCB0byBkYXRhRm9yRXZlbnQuXG4gIGZpcmVFdmVudCgnbWVzc2FnZScsIHdzLCBNZXNzYWdlRXZlbnQsIHtcbiAgICBvcmlnaW46IHdzW2tXZWJTb2NrZXRVUkxdLm9yaWdpbixcbiAgICBkYXRhOiBkYXRhRm9yRXZlbnRcbiAgfSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NVxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzI2MTZcbiAqIEBzZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzk4NDA3XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvdG9jb2xcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN1YnByb3RvY29sIChwcm90b2NvbCkge1xuICAvLyBJZiBwcmVzZW50LCB0aGlzIHZhbHVlIGluZGljYXRlcyBvbmVcbiAgLy8gb3IgbW9yZSBjb21tYS1zZXBhcmF0ZWQgc3VicHJvdG9jb2wgdGhlIGNsaWVudCB3aXNoZXMgdG8gc3BlYWssXG4gIC8vIG9yZGVyZWQgYnkgcHJlZmVyZW5jZS4gIFRoZSBlbGVtZW50cyB0aGF0IGNvbXByaXNlIHRoaXMgdmFsdWVcbiAgLy8gTVVTVCBiZSBub24tZW1wdHkgc3RyaW5ncyB3aXRoIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFUrMDAyMSB0b1xuICAvLyBVKzAwN0Ugbm90IGluY2x1ZGluZyBzZXBhcmF0b3IgY2hhcmFjdGVycyBhcyBkZWZpbmVkIGluXG4gIC8vIFtSRkMyNjE2XSBhbmQgTVVTVCBhbGwgYmUgdW5pcXVlIHN0cmluZ3MuXG4gIGlmIChwcm90b2NvbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAoY29uc3QgY2hhciBvZiBwcm90b2NvbCkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChcbiAgICAgIGNvZGUgPCAweDIxIHx8XG4gICAgICBjb2RlID4gMHg3RSB8fFxuICAgICAgY2hhciA9PT0gJygnIHx8XG4gICAgICBjaGFyID09PSAnKScgfHxcbiAgICAgIGNoYXIgPT09ICc8JyB8fFxuICAgICAgY2hhciA9PT0gJz4nIHx8XG4gICAgICBjaGFyID09PSAnQCcgfHxcbiAgICAgIGNoYXIgPT09ICcsJyB8fFxuICAgICAgY2hhciA9PT0gJzsnIHx8XG4gICAgICBjaGFyID09PSAnOicgfHxcbiAgICAgIGNoYXIgPT09ICdcXFxcJyB8fFxuICAgICAgY2hhciA9PT0gJ1wiJyB8fFxuICAgICAgY2hhciA9PT0gJy8nIHx8XG4gICAgICBjaGFyID09PSAnWycgfHxcbiAgICAgIGNoYXIgPT09ICddJyB8fFxuICAgICAgY2hhciA9PT0gJz8nIHx8XG4gICAgICBjaGFyID09PSAnPScgfHxcbiAgICAgIGNoYXIgPT09ICd7JyB8fFxuICAgICAgY2hhciA9PT0gJ30nIHx8XG4gICAgICBjb2RlID09PSAzMiB8fCAvLyBTUFxuICAgICAgY29kZSA9PT0gOSAvLyBIVFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTctNFxuICogQHBhcmFtIHtudW1iZXJ9IGNvZGVcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN0YXR1c0NvZGUgKGNvZGUpIHtcbiAgaWYgKGNvZGUgPj0gMTAwMCAmJiBjb2RlIDwgMTAxNSkge1xuICAgIHJldHVybiAoXG4gICAgICBjb2RlICE9PSAxMDA0ICYmIC8vIHJlc2VydmVkXG4gICAgICBjb2RlICE9PSAxMDA1ICYmIC8vIFwiTVVTVCBOT1QgYmUgc2V0IGFzIGEgc3RhdHVzIGNvZGVcIlxuICAgICAgY29kZSAhPT0gMTAwNiAvLyBcIk1VU1QgTk9UIGJlIHNldCBhcyBhIHN0YXR1cyBjb2RlXCJcbiAgICApXG4gIH1cblxuICByZXR1cm4gY29kZSA+PSAzMDAwICYmIGNvZGUgPD0gNDk5OVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gcmVhc29uXG4gKi9cbmZ1bmN0aW9uIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uICh3cywgcmVhc29uKSB7XG4gIGNvbnN0IHsgW2tDb250cm9sbGVyXTogY29udHJvbGxlciwgW2tSZXNwb25zZV06IHJlc3BvbnNlIH0gPSB3c1xuXG4gIGNvbnRyb2xsZXIuYWJvcnQoKVxuXG4gIGlmIChyZXNwb25zZT8uc29ja2V0ICYmICFyZXNwb25zZS5zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgcmVzcG9uc2Uuc29ja2V0LmRlc3Ryb3koKVxuICB9XG5cbiAgaWYgKHJlYXNvbikge1xuICAgIGZpcmVFdmVudCgnZXJyb3InLCB3cywgRXJyb3JFdmVudCwge1xuICAgICAgZXJyb3I6IG5ldyBFcnJvcihyZWFzb24pXG4gICAgfSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNFc3RhYmxpc2hlZCxcbiAgaXNDbG9zaW5nLFxuICBpc0Nsb3NlZCxcbiAgZmlyZUV2ZW50LFxuICBpc1ZhbGlkU3VicHJvdG9jb2wsXG4gIGlzVmFsaWRTdGF0dXNDb2RlLFxuICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbixcbiAgd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBkaWFnbm9zdGljc0NoYW5uZWwgPSByZXF1aXJlKCdkaWFnbm9zdGljc19jaGFubmVsJylcbmNvbnN0IHsgdWlkLCBzdGF0ZXMgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHtcbiAga1JlYWR5U3RhdGUsXG4gIGtTZW50Q2xvc2UsXG4gIGtCeXRlUGFyc2VyLFxuICBrUmVjZWl2ZWRDbG9zZVxufSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGZpcmVFdmVudCwgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24gfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IENsb3NlRXZlbnQgfSA9IHJlcXVpcmUoJy4vZXZlbnRzJylcbmNvbnN0IHsgbWFrZVJlcXVlc3QgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3JlcXVlc3QnKVxuY29uc3QgeyBmZXRjaGluZyB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvaW5kZXgnKVxuY29uc3QgeyBIZWFkZXJzIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9oZWFkZXJzJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi4vZ2xvYmFsJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuXG5jb25zdCBjaGFubmVscyA9IHt9XG5jaGFubmVscy5vcGVuID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6b3BlbicpXG5jaGFubmVscy5jbG9zZSA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6d2Vic29ja2V0OmNsb3NlJylcbmNoYW5uZWxzLnNvY2tldEVycm9yID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6c29ja2V0X2Vycm9yJylcblxuLyoqIEB0eXBlIHtpbXBvcnQoJ2NyeXB0bycpfSAqL1xubGV0IGNyeXB0b1xudHJ5IHtcbiAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbn0gY2F0Y2gge1xuXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXdlYnNvY2tldC1lc3RhYmxpc2hcbiAqIEBwYXJhbSB7VVJMfSB1cmxcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBwcm90b2NvbHNcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqIEBwYXJhbSB7KHJlc3BvbnNlOiBhbnkpID0+IHZvaWR9IG9uRXN0YWJsaXNoXG4gKiBAcGFyYW0ge1BhcnRpYWw8aW1wb3J0KCcuLi8uLi90eXBlcy93ZWJzb2NrZXQnKS5XZWJTb2NrZXRJbml0Pn0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBlc3RhYmxpc2hXZWJTb2NrZXRDb25uZWN0aW9uICh1cmwsIHByb3RvY29scywgd3MsIG9uRXN0YWJsaXNoLCBvcHRpb25zKSB7XG4gIC8vIDEuIExldCByZXF1ZXN0VVJMIGJlIGEgY29weSBvZiB1cmwsIHdpdGggaXRzIHNjaGVtZSBzZXQgdG8gXCJodHRwXCIsIGlmIHVybOKAmXNcbiAgLy8gICAgc2NoZW1lIGlzIFwid3NcIiwgYW5kIHRvIFwiaHR0cHNcIiBvdGhlcndpc2UuXG4gIGNvbnN0IHJlcXVlc3RVUkwgPSB1cmxcblxuICByZXF1ZXN0VVJMLnByb3RvY29sID0gdXJsLnByb3RvY29sID09PSAnd3M6JyA/ICdodHRwOicgOiAnaHR0cHM6J1xuXG4gIC8vIDIuIExldCByZXF1ZXN0IGJlIGEgbmV3IHJlcXVlc3QsIHdob3NlIFVSTCBpcyByZXF1ZXN0VVJMLCBjbGllbnQgaXMgY2xpZW50LFxuICAvLyAgICBzZXJ2aWNlLXdvcmtlcnMgbW9kZSBpcyBcIm5vbmVcIiwgcmVmZXJyZXIgaXMgXCJuby1yZWZlcnJlclwiLCBtb2RlIGlzXG4gIC8vICAgIFwid2Vic29ja2V0XCIsIGNyZWRlbnRpYWxzIG1vZGUgaXMgXCJpbmNsdWRlXCIsIGNhY2hlIG1vZGUgaXMgXCJuby1zdG9yZVwiICxcbiAgLy8gICAgYW5kIHJlZGlyZWN0IG1vZGUgaXMgXCJlcnJvclwiLlxuICBjb25zdCByZXF1ZXN0ID0gbWFrZVJlcXVlc3Qoe1xuICAgIHVybExpc3Q6IFtyZXF1ZXN0VVJMXSxcbiAgICBzZXJ2aWNlV29ya2VyczogJ25vbmUnLFxuICAgIHJlZmVycmVyOiAnbm8tcmVmZXJyZXInLFxuICAgIG1vZGU6ICd3ZWJzb2NrZXQnLFxuICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgY2FjaGU6ICduby1zdG9yZScsXG4gICAgcmVkaXJlY3Q6ICdlcnJvcidcbiAgfSlcblxuICAvLyBOb3RlOiB1bmRpY2kgZXh0ZW5zaW9uLCBhbGxvdyBzZXR0aW5nIGN1c3RvbSBoZWFkZXJzLlxuICBpZiAob3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgY29uc3QgaGVhZGVyc0xpc3QgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpW2tIZWFkZXJzTGlzdF1cblxuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QgPSBoZWFkZXJzTGlzdFxuICB9XG5cbiAgLy8gMy4gQXBwZW5kIChgVXBncmFkZWAsIGB3ZWJzb2NrZXRgKSB0byByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgLy8gNC4gQXBwZW5kIChgQ29ubmVjdGlvbmAsIGBVcGdyYWRlYCkgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIC8vIE5vdGU6IGJvdGggb2YgdGhlc2UgYXJlIGhhbmRsZWQgYnkgdW5kaWNpIGN1cnJlbnRseS5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvYmxvYi82OGMyNjljNDE0NGM0NDZmM2YxMjIwOTUxMzM4ZGFlZjRhNmI1ZWM0L2xpYi9jbGllbnQuanMjTDEzOTdcblxuICAvLyA1LiBMZXQga2V5VmFsdWUgYmUgYSBub25jZSBjb25zaXN0aW5nIG9mIGEgcmFuZG9tbHkgc2VsZWN0ZWRcbiAgLy8gICAgMTYtYnl0ZSB2YWx1ZSB0aGF0IGhhcyBiZWVuIGZvcmdpdmluZy1iYXNlNjQtZW5jb2RlZCBhbmRcbiAgLy8gICAgaXNvbW9ycGhpYyBlbmNvZGVkLlxuICBjb25zdCBrZXlWYWx1ZSA9IGNyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2Jhc2U2NCcpXG5cbiAgLy8gNi4gQXBwZW5kIChgU2VjLVdlYlNvY2tldC1LZXlgLCBrZXlWYWx1ZSkgdG8gcmVxdWVzdOKAmXNcbiAgLy8gICAgaGVhZGVyIGxpc3QuXG4gIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdzZWMtd2Vic29ja2V0LWtleScsIGtleVZhbHVlKVxuXG4gIC8vIDcuIEFwcGVuZCAoYFNlYy1XZWJTb2NrZXQtVmVyc2lvbmAsIGAxM2ApIHRvIHJlcXVlc3TigJlzXG4gIC8vICAgIGhlYWRlciBsaXN0LlxuICByZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnc2VjLXdlYnNvY2tldC12ZXJzaW9uJywgJzEzJylcblxuICAvLyA4LiBGb3IgZWFjaCBwcm90b2NvbCBpbiBwcm90b2NvbHMsIGNvbWJpbmVcbiAgLy8gICAgKGBTZWMtV2ViU29ja2V0LVByb3RvY29sYCwgcHJvdG9jb2wpIGluIHJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0LlxuICBmb3IgKGNvbnN0IHByb3RvY29sIG9mIHByb3RvY29scykge1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdzZWMtd2Vic29ja2V0LXByb3RvY29sJywgcHJvdG9jb2wpXG4gIH1cblxuICAvLyA5LiBMZXQgcGVybWVzc2FnZURlZmxhdGUgYmUgYSB1c2VyLWFnZW50IGRlZmluZWRcbiAgLy8gICAgXCJwZXJtZXNzYWdlLWRlZmxhdGVcIiBleHRlbnNpb24gaGVhZGVyIHZhbHVlLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9nZWNrby1kZXYvYmxvYi9jZTc4MjM0ZjVlNjUzYTVkMzkxNjgxM2ZmOTkwZjA1MzUxMDIyN2JjL25ldHdlcmsvcHJvdG9jb2wvd2Vic29ja2V0L1dlYlNvY2tldENoYW5uZWwuY3BwI0wyNjczXG4gIC8vIFRPRE86IGVuYWJsZSBvbmNlIHBlcm1lc3NhZ2UtZGVmbGF0ZSBpcyBzdXBwb3J0ZWRcbiAgY29uc3QgcGVybWVzc2FnZURlZmxhdGUgPSAnJyAvLyAncGVybWVzc2FnZS1kZWZsYXRlOyAxNSdcblxuICAvLyAxMC4gQXBwZW5kIChgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zYCwgcGVybWVzc2FnZURlZmxhdGUpIHRvXG4gIC8vICAgICByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgLy8gcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3NlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucycsIHBlcm1lc3NhZ2VEZWZsYXRlKVxuXG4gIC8vIDExLiBGZXRjaCByZXF1ZXN0IHdpdGggdXNlUGFyYWxsZWxRdWV1ZSBzZXQgdG8gdHJ1ZSwgYW5kXG4gIC8vICAgICBwcm9jZXNzUmVzcG9uc2UgZ2l2ZW4gcmVzcG9uc2UgYmVpbmcgdGhlc2Ugc3RlcHM6XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBmZXRjaGluZyh7XG4gICAgcmVxdWVzdCxcbiAgICB1c2VQYXJhbGxlbFF1ZXVlOiB0cnVlLFxuICAgIGRpc3BhdGNoZXI6IG9wdGlvbnMuZGlzcGF0Y2hlciA/PyBnZXRHbG9iYWxEaXNwYXRjaGVyKCksXG4gICAgcHJvY2Vzc1Jlc3BvbnNlIChyZXNwb25zZSkge1xuICAgICAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYSBuZXR3b3JrIGVycm9yIG9yIGl0cyBzdGF0dXMgaXMgbm90IDEwMSxcbiAgICAgIC8vICAgIGZhaWwgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgfHwgcmVzcG9uc2Uuc3RhdHVzICE9PSAxMDEpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdSZWNlaXZlZCBuZXR3b3JrIGVycm9yIG9yIG5vbi0xMDEgc3RhdHVzIGNvZGUuJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIHByb3RvY29scyBpcyBub3QgdGhlIGVtcHR5IGxpc3QgYW5kIGV4dHJhY3RpbmcgaGVhZGVyXG4gICAgICAvLyAgICBsaXN0IHZhbHVlcyBnaXZlbiBgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAgYW5kIHJlc3BvbnNl4oCZc1xuICAgICAgLy8gICAgaGVhZGVyIGxpc3QgcmVzdWx0cyBpbiBudWxsLCBmYWlsdXJlLCBvciB0aGUgZW1wdHkgYnl0ZVxuICAgICAgLy8gICAgc2VxdWVuY2UsIHRoZW4gZmFpbCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICBpZiAocHJvdG9jb2xzLmxlbmd0aCAhPT0gMCAmJiAhcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdTZWMtV2ViU29ja2V0LVByb3RvY29sJykpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdTZXJ2ZXIgZGlkIG5vdCByZXNwb25kIHdpdGggc2VudCBwcm90b2NvbHMuJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIEZvbGxvdyB0aGUgcmVxdWlyZW1lbnRzIHN0YXRlZCBzdGVwIDIgdG8gc3RlcCA2LCBpbmNsdXNpdmUsXG4gICAgICAvLyAgICBvZiB0aGUgbGFzdCBzZXQgb2Ygc3RlcHMgaW4gc2VjdGlvbiA0LjEgb2YgVGhlIFdlYlNvY2tldFxuICAgICAgLy8gICAgUHJvdG9jb2wgdG8gdmFsaWRhdGUgcmVzcG9uc2UuIFRoaXMgZWl0aGVyIHJlc3VsdHMgaW4gZmFpbFxuICAgICAgLy8gICAgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG9yIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpc1xuICAgICAgLy8gICAgZXN0YWJsaXNoZWQuXG5cbiAgICAgIC8vIDIuIElmIHRoZSByZXNwb25zZSBsYWNrcyBhbiB8VXBncmFkZXwgaGVhZGVyIGZpZWxkIG9yIHRoZSB8VXBncmFkZXxcbiAgICAgIC8vICAgIGhlYWRlciBmaWVsZCBjb250YWlucyBhIHZhbHVlIHRoYXQgaXMgbm90IGFuIEFTQ0lJIGNhc2UtXG4gICAgICAvLyAgICBpbnNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlIHZhbHVlIFwid2Vic29ja2V0XCIsIHRoZSBjbGllbnQgTVVTVFxuICAgICAgLy8gICAgX0ZhaWwgdGhlIFdlYlNvY2tldCBDb25uZWN0aW9uXy5cbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1VwZ3JhZGUnKT8udG9Mb3dlckNhc2UoKSAhPT0gJ3dlYnNvY2tldCcpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdTZXJ2ZXIgZGlkIG5vdCBzZXQgVXBncmFkZSBoZWFkZXIgdG8gXCJ3ZWJzb2NrZXRcIi4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMy4gSWYgdGhlIHJlc3BvbnNlIGxhY2tzIGEgfENvbm5lY3Rpb258IGhlYWRlciBmaWVsZCBvciB0aGVcbiAgICAgIC8vICAgIHxDb25uZWN0aW9ufCBoZWFkZXIgZmllbGQgZG9lc24ndCBjb250YWluIGEgdG9rZW4gdGhhdCBpcyBhblxuICAgICAgLy8gICAgQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlIHZhbHVlIFwiVXBncmFkZVwiLCB0aGUgY2xpZW50XG4gICAgICAvLyAgICBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uXG4gICAgICBpZiAocmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdDb25uZWN0aW9uJyk/LnRvTG93ZXJDYXNlKCkgIT09ICd1cGdyYWRlJykge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1NlcnZlciBkaWQgbm90IHNldCBDb25uZWN0aW9uIGhlYWRlciB0byBcInVwZ3JhZGVcIi4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgdGhlIHJlc3BvbnNlIGxhY2tzIGEgfFNlYy1XZWJTb2NrZXQtQWNjZXB0fCBoZWFkZXIgZmllbGQgb3JcbiAgICAgIC8vICAgIHRoZSB8U2VjLVdlYlNvY2tldC1BY2NlcHR8IGNvbnRhaW5zIGEgdmFsdWUgb3RoZXIgdGhhbiB0aGVcbiAgICAgIC8vICAgIGJhc2U2NC1lbmNvZGVkIFNIQS0xIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB8U2VjLVdlYlNvY2tldC1cbiAgICAgIC8vICAgIEtleXwgKGFzIGEgc3RyaW5nLCBub3QgYmFzZTY0LWRlY29kZWQpIHdpdGggdGhlIHN0cmluZyBcIjI1OEVBRkE1LVxuICAgICAgLy8gICAgRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExXCIgYnV0IGlnbm9yaW5nIGFueSBsZWFkaW5nIGFuZFxuICAgICAgLy8gICAgdHJhaWxpbmcgd2hpdGVzcGFjZSwgdGhlIGNsaWVudCBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vICAgIENvbm5lY3Rpb25fLlxuICAgICAgY29uc3Qgc2VjV1NBY2NlcHQgPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtQWNjZXB0JylcbiAgICAgIGNvbnN0IGRpZ2VzdCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJykudXBkYXRlKGtleVZhbHVlICsgdWlkKS5kaWdlc3QoJ2Jhc2U2NCcpXG4gICAgICBpZiAoc2VjV1NBY2NlcHQgIT09IGRpZ2VzdCkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ0luY29ycmVjdCBoYXNoIHJlY2VpdmVkIGluIFNlYy1XZWJTb2NrZXQtQWNjZXB0IGhlYWRlci4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNS4gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgfFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uc3wgaGVhZGVyXG4gICAgICAvLyAgICBmaWVsZCBhbmQgdGhpcyBoZWFkZXIgZmllbGQgaW5kaWNhdGVzIHRoZSB1c2Ugb2YgYW4gZXh0ZW5zaW9uXG4gICAgICAvLyAgICB0aGF0IHdhcyBub3QgcHJlc2VudCBpbiB0aGUgY2xpZW50J3MgaGFuZHNoYWtlICh0aGUgc2VydmVyIGhhc1xuICAgICAgLy8gICAgaW5kaWNhdGVkIGFuIGV4dGVuc2lvbiBub3QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQpLCB0aGUgY2xpZW50XG4gICAgICAvLyAgICBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uICAoVGhlIHBhcnNpbmcgb2YgdGhpc1xuICAgICAgLy8gICAgaGVhZGVyIGZpZWxkIHRvIGRldGVybWluZSB3aGljaCBleHRlbnNpb25zIGFyZSByZXF1ZXN0ZWQgaXNcbiAgICAgIC8vICAgIGRpc2N1c3NlZCBpbiBTZWN0aW9uIDkuMS4pXG4gICAgICBjb25zdCBzZWNFeHRlbnNpb24gPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucycpXG5cbiAgICAgIGlmIChzZWNFeHRlbnNpb24gIT09IG51bGwgJiYgc2VjRXh0ZW5zaW9uICE9PSBwZXJtZXNzYWdlRGVmbGF0ZSkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1JlY2VpdmVkIGRpZmZlcmVudCBwZXJtZXNzYWdlLWRlZmxhdGUgdGhhbiB0aGUgb25lIHNldC4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNi4gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgfFNlYy1XZWJTb2NrZXQtUHJvdG9jb2x8IGhlYWRlciBmaWVsZFxuICAgICAgLy8gICAgYW5kIHRoaXMgaGVhZGVyIGZpZWxkIGluZGljYXRlcyB0aGUgdXNlIG9mIGEgc3VicHJvdG9jb2wgdGhhdCB3YXNcbiAgICAgIC8vICAgIG5vdCBwcmVzZW50IGluIHRoZSBjbGllbnQncyBoYW5kc2hha2UgKHRoZSBzZXJ2ZXIgaGFzIGluZGljYXRlZCBhXG4gICAgICAvLyAgICBzdWJwcm90b2NvbCBub3QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQpLCB0aGUgY2xpZW50IE1VU1QgX0ZhaWxcbiAgICAgIC8vICAgIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uXG4gICAgICBjb25zdCBzZWNQcm90b2NvbCA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcpXG5cbiAgICAgIGlmIChzZWNQcm90b2NvbCAhPT0gbnVsbCAmJiBzZWNQcm90b2NvbCAhPT0gcmVxdWVzdC5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtUHJvdG9jb2wnKSkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1Byb3RvY29sIHdhcyBub3Qgc2V0IGluIHRoZSBvcGVuaW5nIGhhbmRzaGFrZS4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVzcG9uc2Uuc29ja2V0Lm9uKCdkYXRhJywgb25Tb2NrZXREYXRhKVxuICAgICAgcmVzcG9uc2Uuc29ja2V0Lm9uKCdjbG9zZScsIG9uU29ja2V0Q2xvc2UpXG4gICAgICByZXNwb25zZS5zb2NrZXQub24oJ2Vycm9yJywgb25Tb2NrZXRFcnJvcilcblxuICAgICAgaWYgKGNoYW5uZWxzLm9wZW4uaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgY2hhbm5lbHMub3Blbi5wdWJsaXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiByZXNwb25zZS5zb2NrZXQuYWRkcmVzcygpLFxuICAgICAgICAgIHByb3RvY29sOiBzZWNQcm90b2NvbCxcbiAgICAgICAgICBleHRlbnNpb25zOiBzZWNFeHRlbnNpb25cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgb25Fc3RhYmxpc2gocmVzcG9uc2UpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBjb250cm9sbGVyXG59XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJ9IGNodW5rXG4gKi9cbmZ1bmN0aW9uIG9uU29ja2V0RGF0YSAoY2h1bmspIHtcbiAgaWYgKCF0aGlzLndzW2tCeXRlUGFyc2VyXS53cml0ZShjaHVuaykpIHtcbiAgICB0aGlzLnBhdXNlKClcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZmVlZGJhY2stZnJvbS10aGUtcHJvdG9jb2xcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tNy4xLjRcbiAqL1xuZnVuY3Rpb24gb25Tb2NrZXRDbG9zZSAoKSB7XG4gIGNvbnN0IHsgd3MgfSA9IHRoaXNcblxuICAvLyBJZiB0aGUgVENQIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBhZnRlciB0aGVcbiAgLy8gV2ViU29ja2V0IGNsb3NpbmcgaGFuZHNoYWtlIHdhcyBjb21wbGV0ZWQsIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAvLyBpcyBzYWlkIHRvIGhhdmUgYmVlbiBjbG9zZWQgX2NsZWFubHlfLlxuICBjb25zdCB3YXNDbGVhbiA9IHdzW2tTZW50Q2xvc2VdICYmIHdzW2tSZWNlaXZlZENsb3NlXVxuXG4gIGxldCBjb2RlID0gMTAwNVxuICBsZXQgcmVhc29uID0gJydcblxuICBjb25zdCByZXN1bHQgPSB3c1trQnl0ZVBhcnNlcl0uY2xvc2luZ0luZm9cblxuICBpZiAocmVzdWx0KSB7XG4gICAgY29kZSA9IHJlc3VsdC5jb2RlID8/IDEwMDVcbiAgICByZWFzb24gPSByZXN1bHQucmVhc29uXG4gIH0gZWxzZSBpZiAoIXdzW2tTZW50Q2xvc2VdKSB7XG4gICAgLy8gSWYgX1RoZSBXZWJTb2NrZXRcbiAgICAvLyBDb25uZWN0aW9uIGlzIENsb3NlZF8gYW5kIG5vIENsb3NlIGNvbnRyb2wgZnJhbWUgd2FzIHJlY2VpdmVkIGJ5IHRoZVxuICAgIC8vIGVuZHBvaW50IChzdWNoIGFzIGNvdWxkIG9jY3VyIGlmIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBjb25uZWN0aW9uXG4gICAgLy8gaXMgbG9zdCksIF9UaGUgV2ViU29ja2V0IENvbm5lY3Rpb24gQ2xvc2UgQ29kZV8gaXMgY29uc2lkZXJlZCB0byBiZVxuICAgIC8vIDEwMDYuXG4gICAgY29kZSA9IDEwMDZcbiAgfVxuXG4gIC8vIDEuIENoYW5nZSB0aGUgcmVhZHkgc3RhdGUgdG8gQ0xPU0VEICgzKS5cbiAgd3Nba1JlYWR5U3RhdGVdID0gc3RhdGVzLkNMT1NFRFxuXG4gIC8vIDIuIElmIHRoZSB1c2VyIGFnZW50IHdhcyByZXF1aXJlZCB0byBmYWlsIHRoZSBXZWJTb2NrZXRcbiAgLy8gICAgY29ubmVjdGlvbiwgb3IgaWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHdhcyBjbG9zZWRcbiAgLy8gICAgYWZ0ZXIgYmVpbmcgZmxhZ2dlZCBhcyBmdWxsLCBmaXJlIGFuIGV2ZW50IG5hbWVkIGVycm9yXG4gIC8vICAgIGF0IHRoZSBXZWJTb2NrZXQgb2JqZWN0LlxuICAvLyBUT0RPXG5cbiAgLy8gMy4gRmlyZSBhbiBldmVudCBuYW1lZCBjbG9zZSBhdCB0aGUgV2ViU29ja2V0IG9iamVjdCxcbiAgLy8gICAgdXNpbmcgQ2xvc2VFdmVudCwgd2l0aCB0aGUgd2FzQ2xlYW4gYXR0cmlidXRlXG4gIC8vICAgIGluaXRpYWxpemVkIHRvIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gY2xvc2VkIGNsZWFubHlcbiAgLy8gICAgYW5kIGZhbHNlIG90aGVyd2lzZSwgdGhlIGNvZGUgYXR0cmlidXRlIGluaXRpYWxpemVkIHRvXG4gIC8vICAgIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBjbG9zZSBjb2RlLCBhbmQgdGhlIHJlYXNvblxuICAvLyAgICBhdHRyaWJ1dGUgaW5pdGlhbGl6ZWQgdG8gdGhlIHJlc3VsdCBvZiBhcHBseWluZyBVVEYtOFxuICAvLyAgICBkZWNvZGUgd2l0aG91dCBCT00gdG8gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGNsb3NlXG4gIC8vICAgIHJlYXNvbi5cbiAgZmlyZUV2ZW50KCdjbG9zZScsIHdzLCBDbG9zZUV2ZW50LCB7XG4gICAgd2FzQ2xlYW4sIGNvZGUsIHJlYXNvblxuICB9KVxuXG4gIGlmIChjaGFubmVscy5jbG9zZS5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLmNsb3NlLnB1Ymxpc2goe1xuICAgICAgd2Vic29ja2V0OiB3cyxcbiAgICAgIGNvZGUsXG4gICAgICByZWFzb25cbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0RXJyb3IgKGVycm9yKSB7XG4gIGNvbnN0IHsgd3MgfSA9IHRoaXNcblxuICB3c1trUmVhZHlTdGF0ZV0gPSBzdGF0ZXMuQ0xPU0lOR1xuXG4gIGlmIChjaGFubmVscy5zb2NrZXRFcnJvci5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLnNvY2tldEVycm9yLnB1Ymxpc2goZXJyb3IpXG4gIH1cblxuICB0aGlzLmRlc3Ryb3koKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZXN0YWJsaXNoV2ViU29ja2V0Q29ubmVjdGlvblxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBtYXhVbnNpZ25lZDE2Qml0IH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdjcnlwdG8nKX0gKi9cbmxldCBjcnlwdG9cbnRyeSB7XG4gIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpXG59IGNhdGNoIHtcblxufVxuXG5jbGFzcyBXZWJzb2NrZXRGcmFtZVNlbmQge1xuICAvKipcbiAgICogQHBhcmFtIHtCdWZmZXJ8dW5kZWZpbmVkfSBkYXRhXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoZGF0YSkge1xuICAgIHRoaXMuZnJhbWVEYXRhID0gZGF0YVxuICAgIHRoaXMubWFza0tleSA9IGNyeXB0by5yYW5kb21CeXRlcyg0KVxuICB9XG5cbiAgY3JlYXRlRnJhbWUgKG9wY29kZSkge1xuICAgIGNvbnN0IGJvZHlMZW5ndGggPSB0aGlzLmZyYW1lRGF0YT8uYnl0ZUxlbmd0aCA/PyAwXG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICBsZXQgcGF5bG9hZExlbmd0aCA9IGJvZHlMZW5ndGggLy8gMC0xMjVcbiAgICBsZXQgb2Zmc2V0ID0gNlxuXG4gICAgaWYgKGJvZHlMZW5ndGggPiBtYXhVbnNpZ25lZDE2Qml0KSB7XG4gICAgICBvZmZzZXQgKz0gOCAvLyBwYXlsb2FkIGxlbmd0aCBpcyBuZXh0IDggYnl0ZXNcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjdcbiAgICB9IGVsc2UgaWYgKGJvZHlMZW5ndGggPiAxMjUpIHtcbiAgICAgIG9mZnNldCArPSAyIC8vIHBheWxvYWQgbGVuZ3RoIGlzIG5leHQgMiBieXRlc1xuICAgICAgcGF5bG9hZExlbmd0aCA9IDEyNlxuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShib2R5TGVuZ3RoICsgb2Zmc2V0KVxuXG4gICAgLy8gQ2xlYXIgZmlyc3QgMiBieXRlcywgZXZlcnl0aGluZyBlbHNlIGlzIG92ZXJ3cml0dGVuXG4gICAgYnVmZmVyWzBdID0gYnVmZmVyWzFdID0gMFxuICAgIGJ1ZmZlclswXSB8PSAweDgwIC8vIEZJTlxuICAgIGJ1ZmZlclswXSA9IChidWZmZXJbMF0gJiAweEYwKSArIG9wY29kZSAvLyBvcGNvZGVcblxuICAgIC8qISB3cy4gTUlUIExpY2Vuc2UuIEVpbmFyIE90dG8gU3Rhbmd2aWsgPGVpbmFyb3NAZ21haWwuY29tPiAqL1xuICAgIGJ1ZmZlcltvZmZzZXQgLSA0XSA9IHRoaXMubWFza0tleVswXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAzXSA9IHRoaXMubWFza0tleVsxXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAyXSA9IHRoaXMubWFza0tleVsyXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAxXSA9IHRoaXMubWFza0tleVszXVxuXG4gICAgYnVmZmVyWzFdID0gcGF5bG9hZExlbmd0aFxuXG4gICAgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNikge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2QkUoYm9keUxlbmd0aCwgMilcbiAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgLy8gQ2xlYXIgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGhcbiAgICAgIGJ1ZmZlclsyXSA9IGJ1ZmZlclszXSA9IDBcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnRCRShib2R5TGVuZ3RoLCA0LCA2KVxuICAgIH1cblxuICAgIGJ1ZmZlclsxXSB8PSAweDgwIC8vIE1BU0tcblxuICAgIC8vIG1hc2sgYm9keVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7XG4gICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSB0aGlzLmZyYW1lRGF0YVtpXSBeIHRoaXMubWFza0tleVtpICUgNF1cbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFdlYnNvY2tldEZyYW1lU2VuZFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBXcml0YWJsZSB9ID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IGRpYWdub3N0aWNzQ2hhbm5lbCA9IHJlcXVpcmUoJ2RpYWdub3N0aWNzX2NoYW5uZWwnKVxuY29uc3QgeyBwYXJzZXJTdGF0ZXMsIG9wY29kZXMsIHN0YXRlcywgZW1wdHlCdWZmZXIgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsga1JlYWR5U3RhdGUsIGtTZW50Q2xvc2UsIGtSZXNwb25zZSwga1JlY2VpdmVkQ2xvc2UgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGlzVmFsaWRTdGF0dXNDb2RlLCBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbiwgd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBXZWJzb2NrZXRGcmFtZVNlbmQgfSA9IHJlcXVpcmUoJy4vZnJhbWUnKVxuXG4vLyBUaGlzIGNvZGUgd2FzIGluZmx1ZW5jZWQgYnkgd3MgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLy8gQ29weXJpZ2h0IChjKSAyMDExIEVpbmFyIE90dG8gU3Rhbmd2aWsgPGVpbmFyb3NAZ21haWwuY29tPlxuLy8gQ29weXJpZ2h0IChjKSAyMDEzIEFybm91dCBLYXplbWllciBhbmQgY29udHJpYnV0b3JzXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTYgTHVpZ2kgUGluY2EgYW5kIGNvbnRyaWJ1dG9yc1xuXG5jb25zdCBjaGFubmVscyA9IHt9XG5jaGFubmVscy5waW5nID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6cGluZycpXG5jaGFubmVscy5wb25nID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6cG9uZycpXG5cbmNsYXNzIEJ5dGVQYXJzZXIgZXh0ZW5kcyBXcml0YWJsZSB7XG4gICNidWZmZXJzID0gW11cbiAgI2J5dGVPZmZzZXQgPSAwXG5cbiAgI3N0YXRlID0gcGFyc2VyU3RhdGVzLklORk9cblxuICAjaW5mbyA9IHt9XG4gICNmcmFnbWVudHMgPSBbXVxuXG4gIGNvbnN0cnVjdG9yICh3cykge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXMud3MgPSB3c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBjaHVua1xuICAgKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrXG4gICAqL1xuICBfd3JpdGUgKGNodW5rLCBfLCBjYWxsYmFjaykge1xuICAgIHRoaXMuI2J1ZmZlcnMucHVzaChjaHVuaylcbiAgICB0aGlzLiNieXRlT2Zmc2V0ICs9IGNodW5rLmxlbmd0aFxuXG4gICAgdGhpcy5ydW4oY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aGVuZXZlciBhIG5ldyBjaHVuayBpcyByZWNlaXZlZC5cbiAgICogQ2FsbGJhY2sgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGFyZSBubyBtb3JlIGNodW5rcyBidWZmZXJpbmcsXG4gICAqIG9yIG5vdCBlbm91Z2ggYnl0ZXMgYXJlIGJ1ZmZlcmVkIHRvIHBhcnNlLlxuICAgKi9cbiAgcnVuIChjYWxsYmFjaykge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy4jc3RhdGUgPT09IHBhcnNlclN0YXRlcy5JTkZPKSB7XG4gICAgICAgIC8vIElmIHRoZXJlIGFyZW4ndCBlbm91Z2ggYnl0ZXMgdG8gcGFyc2UgdGhlIHBheWxvYWQgbGVuZ3RoLCBldGMuXG4gICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0IDwgMikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmNvbnN1bWUoMilcblxuICAgICAgICB0aGlzLiNpbmZvLmZpbiA9IChidWZmZXJbMF0gJiAweDgwKSAhPT0gMFxuICAgICAgICB0aGlzLiNpbmZvLm9wY29kZSA9IGJ1ZmZlclswXSAmIDB4MEZcblxuICAgICAgICAvLyBJZiB3ZSByZWNlaXZlIGEgZnJhZ21lbnRlZCBtZXNzYWdlLCB3ZSB1c2UgdGhlIHR5cGUgb2YgdGhlIGZpcnN0XG4gICAgICAgIC8vIGZyYW1lIHRvIHBhcnNlIHRoZSBmdWxsIG1lc3NhZ2UgYXMgYmluYXJ5L3RleHQsIHdoZW4gaXQncyB0ZXJtaW5hdGVkXG4gICAgICAgIHRoaXMuI2luZm8ub3JpZ2luYWxPcGNvZGUgPz89IHRoaXMuI2luZm8ub3Bjb2RlXG5cbiAgICAgICAgdGhpcy4jaW5mby5mcmFnbWVudGVkID0gIXRoaXMuI2luZm8uZmluICYmIHRoaXMuI2luZm8ub3Bjb2RlICE9PSBvcGNvZGVzLkNPTlRJTlVBVElPTlxuXG4gICAgICAgIGlmICh0aGlzLiNpbmZvLmZyYWdtZW50ZWQgJiYgdGhpcy4jaW5mby5vcGNvZGUgIT09IG9wY29kZXMuQklOQVJZICYmIHRoaXMuI2luZm8ub3Bjb2RlICE9PSBvcGNvZGVzLlRFWFQpIHtcbiAgICAgICAgICAvLyBPbmx5IHRleHQgYW5kIGJpbmFyeSBmcmFtZXMgY2FuIGJlIGZyYWdtZW50ZWRcbiAgICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih0aGlzLndzLCAnSW52YWxpZCBmcmFtZSB0eXBlIHdhcyBmcmFnbWVudGVkLicpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXlsb2FkTGVuZ3RoID0gYnVmZmVyWzFdICYgMHg3RlxuXG4gICAgICAgIGlmIChwYXlsb2FkTGVuZ3RoIDw9IDEyNSkge1xuICAgICAgICAgIHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCA9IHBheWxvYWRMZW5ndGhcbiAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5SRUFEX0RBVEFcbiAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5QQVlMT0FETEVOR1RIXzE2XG4gICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUEFZTE9BRExFTkdUSF82NFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuI2luZm8uZnJhZ21lbnRlZCAmJiBwYXlsb2FkTGVuZ3RoID4gMTI1KSB7XG4gICAgICAgICAgLy8gQSBmcmFnbWVudGVkIGZyYW1lIGNhbid0IGJlIGZyYWdtZW50ZWQgaXRzZWxmXG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ0ZyYWdtZW50ZWQgZnJhbWUgZXhjZWVkZWQgMTI1IGJ5dGVzLicpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgKHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLlBJTkcgfHxcbiAgICAgICAgICAgIHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLlBPTkcgfHxcbiAgICAgICAgICAgIHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLkNMT1NFKSAmJlxuICAgICAgICAgIHBheWxvYWRMZW5ndGggPiAxMjVcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQ29udHJvbCBmcmFtZXMgY2FuIGhhdmUgYSBwYXlsb2FkIGxlbmd0aCBvZiAxMjUgYnl0ZXMgTUFYXG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ1BheWxvYWQgbGVuZ3RoIGZvciBjb250cm9sIGZyYW1lIGV4Y2VlZGVkIDEyNSBieXRlcy4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLkNMT1NFKSB7XG4gICAgICAgICAgaWYgKHBheWxvYWRMZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHRoaXMud3MsICdSZWNlaXZlZCBjbG9zZSBmcmFtZSB3aXRoIGEgMS1ieXRlIGJvZHkuJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmNvbnN1bWUocGF5bG9hZExlbmd0aClcblxuICAgICAgICAgIHRoaXMuI2luZm8uY2xvc2VJbmZvID0gdGhpcy5wYXJzZUNsb3NlQm9keShmYWxzZSwgYm9keSlcblxuICAgICAgICAgIGlmICghdGhpcy53c1trU2VudENsb3NlXSkge1xuICAgICAgICAgICAgLy8gSWYgYW4gZW5kcG9pbnQgcmVjZWl2ZXMgYSBDbG9zZSBmcmFtZSBhbmQgZGlkIG5vdCBwcmV2aW91c2x5IHNlbmQgYVxuICAgICAgICAgICAgLy8gQ2xvc2UgZnJhbWUsIHRoZSBlbmRwb2ludCBNVVNUIHNlbmQgYSBDbG9zZSBmcmFtZSBpbiByZXNwb25zZS4gIChXaGVuXG4gICAgICAgICAgICAvLyBzZW5kaW5nIGEgQ2xvc2UgZnJhbWUgaW4gcmVzcG9uc2UsIHRoZSBlbmRwb2ludCB0eXBpY2FsbHkgZWNob3MgdGhlXG4gICAgICAgICAgICAvLyBzdGF0dXMgY29kZSBpdCByZWNlaXZlZC4pXG4gICAgICAgICAgICBjb25zdCBib2R5ID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIpXG4gICAgICAgICAgICBib2R5LndyaXRlVUludDE2QkUodGhpcy4jaW5mby5jbG9zZUluZm8uY29kZSwgMClcbiAgICAgICAgICAgIGNvbnN0IGNsb3NlRnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKGJvZHkpXG5cbiAgICAgICAgICAgIHRoaXMud3Nba1Jlc3BvbnNlXS5zb2NrZXQud3JpdGUoXG4gICAgICAgICAgICAgIGNsb3NlRnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5DTE9TRSksXG4gICAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgICAgdGhpcy53c1trU2VudENsb3NlXSA9IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcG9uIGVpdGhlciBzZW5kaW5nIG9yIHJlY2VpdmluZyBhIENsb3NlIGNvbnRyb2wgZnJhbWUsIGl0IGlzIHNhaWRcbiAgICAgICAgICAvLyB0aGF0IF9UaGUgV2ViU29ja2V0IENsb3NpbmcgSGFuZHNoYWtlIGlzIFN0YXJ0ZWRfIGFuZCB0aGF0IHRoZVxuICAgICAgICAgIC8vIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGluIHRoZSBDTE9TSU5HIHN0YXRlLlxuICAgICAgICAgIHRoaXMud3Nba1JlYWR5U3RhdGVdID0gc3RhdGVzLkNMT1NJTkdcbiAgICAgICAgICB0aGlzLndzW2tSZWNlaXZlZENsb3NlXSA9IHRydWVcblxuICAgICAgICAgIHRoaXMuZW5kKClcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLlBJTkcpIHtcbiAgICAgICAgICAvLyBVcG9uIHJlY2VpcHQgb2YgYSBQaW5nIGZyYW1lLCBhbiBlbmRwb2ludCBNVVNUIHNlbmQgYSBQb25nIGZyYW1lIGluXG4gICAgICAgICAgLy8gcmVzcG9uc2UsIHVubGVzcyBpdCBhbHJlYWR5IHJlY2VpdmVkIGEgQ2xvc2UgZnJhbWUuXG4gICAgICAgICAgLy8gQSBQb25nIGZyYW1lIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBQaW5nIGZyYW1lIG11c3QgaGF2ZSBpZGVudGljYWxcbiAgICAgICAgICAvLyBcIkFwcGxpY2F0aW9uIGRhdGFcIlxuXG4gICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuY29uc3VtZShwYXlsb2FkTGVuZ3RoKVxuXG4gICAgICAgICAgaWYgKCF0aGlzLndzW2tSZWNlaXZlZENsb3NlXSkge1xuICAgICAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKGJvZHkpXG5cbiAgICAgICAgICAgIHRoaXMud3Nba1Jlc3BvbnNlXS5zb2NrZXQud3JpdGUoZnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5QT05HKSlcblxuICAgICAgICAgICAgaWYgKGNoYW5uZWxzLnBpbmcuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgY2hhbm5lbHMucGluZy5wdWJsaXNoKHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBib2R5XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuSU5GT1xuXG4gICAgICAgICAgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy4jaW5mby5vcGNvZGUgPT09IG9wY29kZXMuUE9ORykge1xuICAgICAgICAgIC8vIEEgUG9uZyBmcmFtZSBNQVkgYmUgc2VudCB1bnNvbGljaXRlZC4gIFRoaXMgc2VydmVzIGFzIGFcbiAgICAgICAgICAvLyB1bmlkaXJlY3Rpb25hbCBoZWFydGJlYXQuICBBIHJlc3BvbnNlIHRvIGFuIHVuc29saWNpdGVkIFBvbmcgZnJhbWUgaXNcbiAgICAgICAgICAvLyBub3QgZXhwZWN0ZWQuXG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5jb25zdW1lKHBheWxvYWRMZW5ndGgpXG5cbiAgICAgICAgICBpZiAoY2hhbm5lbHMucG9uZy5oYXNTdWJzY3JpYmVycykge1xuICAgICAgICAgICAgY2hhbm5lbHMucG9uZy5wdWJsaXNoKHtcbiAgICAgICAgICAgICAgcGF5bG9hZDogYm9keVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA+IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLiNzdGF0ZSA9PT0gcGFyc2VyU3RhdGVzLlBBWUxPQURMRU5HVEhfMTYpIHtcbiAgICAgICAgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuY29uc3VtZSgyKVxuXG4gICAgICAgIHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCA9IGJ1ZmZlci5yZWFkVUludDE2QkUoMClcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI3N0YXRlID09PSBwYXJzZXJTdGF0ZXMuUEFZTE9BRExFTkdUSF82NCkge1xuICAgICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA8IDgpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5jb25zdW1lKDgpXG4gICAgICAgIGNvbnN0IHVwcGVyID0gYnVmZmVyLnJlYWRVSW50MzJCRSgwKVxuXG4gICAgICAgIC8vIDJeMzEgaXMgdGhlIG1heGluaW11bSBieXRlcyBhbiBhcnJheWJ1ZmZlciBjYW4gY29udGFpblxuICAgICAgICAvLyBvbiAzMi1iaXQgc3lzdGVtcy4gQWx0aG91Z2gsIG9uIDY0LWJpdCBzeXN0ZW1zLCB0aGlzIGlzXG4gICAgICAgIC8vIDJeNTMtMSBieXRlcy5cbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvRXJyb3JzL0ludmFsaWRfYXJyYXlfbGVuZ3RoXG4gICAgICAgIC8vIGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYWluOnY4L3NyYy9jb21tb24vZ2xvYmFscy5oO2RyYz0xOTQ2MjEyYWMwMTAwNjY4ZjE0ZWI5ZTI4NDNiZGQ4NDZlNTEwYTFlO2Jwdj0xO2JwdD0xO2w9MTI3NVxuICAgICAgICAvLyBodHRwczovL3NvdXJjZS5jaHJvbWl1bS5vcmcvY2hyb21pdW0vY2hyb21pdW0vc3JjLysvbWFpbjp2OC9zcmMvb2JqZWN0cy9qcy1hcnJheS1idWZmZXIuaDtsPTM0O2RyYz0xOTQ2MjEyYWMwMTAwNjY4ZjE0ZWI5ZTI4NDNiZGQ4NDZlNTEwYTFlXG4gICAgICAgIGlmICh1cHBlciA+IDIgKiogMzEgLSAxKSB7XG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ1JlY2VpdmVkIHBheWxvYWQgbGVuZ3RoID4gMl4zMSBieXRlcy4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG93ZXIgPSBidWZmZXIucmVhZFVJbnQzMkJFKDQpXG5cbiAgICAgICAgdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoID0gKHVwcGVyIDw8IDgpICsgbG93ZXJcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI3N0YXRlID09PSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBKSB7XG4gICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0IDwgdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgbW9yZSBkYXRhIGluIHRoaXMgY2h1bmsgdGhhdCBuZWVkcyB0byBiZSByZWFkXG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNieXRlT2Zmc2V0ID49IHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCkge1xuICAgICAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgc2VudCBtdWx0aXBsZSBmcmFtZXMgaW4gYSBzaW5nbGUgY2h1bmtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmNvbnN1bWUodGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoKVxuXG4gICAgICAgICAgdGhpcy4jZnJhZ21lbnRzLnB1c2goYm9keSlcblxuICAgICAgICAgIC8vIElmIHRoZSBmcmFtZSBpcyB1bmZyYWdtZW50ZWQsIG9yIGEgZnJhZ21lbnRlZCBmcmFtZSB3YXMgdGVybWluYXRlZCxcbiAgICAgICAgICAvLyBhIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkXG4gICAgICAgICAgaWYgKCF0aGlzLiNpbmZvLmZyYWdtZW50ZWQgfHwgKHRoaXMuI2luZm8uZmluICYmIHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLkNPTlRJTlVBVElPTikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxNZXNzYWdlID0gQnVmZmVyLmNvbmNhdCh0aGlzLiNmcmFnbWVudHMpXG5cbiAgICAgICAgICAgIHdlYnNvY2tldE1lc3NhZ2VSZWNlaXZlZCh0aGlzLndzLCB0aGlzLiNpbmZvLm9yaWdpbmFsT3Bjb2RlLCBmdWxsTWVzc2FnZSlcblxuICAgICAgICAgICAgdGhpcy4jaW5mbyA9IHt9XG4gICAgICAgICAgICB0aGlzLiNmcmFnbWVudHMubGVuZ3RoID0gMFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuI3N0YXRlID0gcGFyc2VyU3RhdGVzLklORk9cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA+IDApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBuIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlcmVkIEJ1ZmZlcnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5cbiAgICogQHJldHVybnMge0J1ZmZlcnxudWxsfVxuICAgKi9cbiAgY29uc3VtZSAobikge1xuICAgIGlmIChuID4gdGhpcy4jYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9IGVsc2UgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVybiBlbXB0eUJ1ZmZlclxuICAgIH1cblxuICAgIGlmICh0aGlzLiNidWZmZXJzWzBdLmxlbmd0aCA9PT0gbikge1xuICAgICAgdGhpcy4jYnl0ZU9mZnNldCAtPSB0aGlzLiNidWZmZXJzWzBdLmxlbmd0aFxuICAgICAgcmV0dXJuIHRoaXMuI2J1ZmZlcnMuc2hpZnQoKVxuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB3aGlsZSAob2Zmc2V0ICE9PSBuKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy4jYnVmZmVyc1swXVxuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IG5leHRcblxuICAgICAgaWYgKGxlbmd0aCArIG9mZnNldCA9PT0gbikge1xuICAgICAgICBidWZmZXIuc2V0KHRoaXMuI2J1ZmZlcnMuc2hpZnQoKSwgb2Zmc2V0KVxuICAgICAgICBicmVha1xuICAgICAgfSBlbHNlIGlmIChsZW5ndGggKyBvZmZzZXQgPiBuKSB7XG4gICAgICAgIGJ1ZmZlci5zZXQobmV4dC5zdWJhcnJheSgwLCBuIC0gb2Zmc2V0KSwgb2Zmc2V0KVxuICAgICAgICB0aGlzLiNidWZmZXJzWzBdID0gbmV4dC5zdWJhcnJheShuIC0gb2Zmc2V0KVxuICAgICAgICBicmVha1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyLnNldCh0aGlzLiNidWZmZXJzLnNoaWZ0KCksIG9mZnNldClcbiAgICAgICAgb2Zmc2V0ICs9IG5leHQubGVuZ3RoXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy4jYnl0ZU9mZnNldCAtPSBuXG5cbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cblxuICBwYXJzZUNsb3NlQm9keSAob25seUNvZGUsIGRhdGEpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi03LjEuNVxuICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgY29kZVxuXG4gICAgaWYgKGRhdGEubGVuZ3RoID49IDIpIHtcbiAgICAgIC8vIF9UaGUgV2ViU29ja2V0IENvbm5lY3Rpb24gQ2xvc2UgQ29kZV8gaXNcbiAgICAgIC8vIGRlZmluZWQgYXMgdGhlIHN0YXR1cyBjb2RlIChTZWN0aW9uIDcuNCkgY29udGFpbmVkIGluIHRoZSBmaXJzdCBDbG9zZVxuICAgICAgLy8gY29udHJvbCBmcmFtZSByZWNlaXZlZCBieSB0aGUgYXBwbGljYXRpb25cbiAgICAgIGNvZGUgPSBkYXRhLnJlYWRVSW50MTZCRSgwKVxuICAgIH1cblxuICAgIGlmIChvbmx5Q29kZSkge1xuICAgICAgaWYgKCFpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBjb2RlIH1cbiAgICB9XG5cbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi03LjEuNlxuICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgIGxldCByZWFzb24gPSBkYXRhLnN1YmFycmF5KDIpXG5cbiAgICAvLyBSZW1vdmUgQk9NXG4gICAgaWYgKHJlYXNvblswXSA9PT0gMHhFRiAmJiByZWFzb25bMV0gPT09IDB4QkIgJiYgcmVhc29uWzJdID09PSAweEJGKSB7XG4gICAgICByZWFzb24gPSByZWFzb24uc3ViYXJyYXkoMylcbiAgICB9XG5cbiAgICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkICYmICFpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVE9ETzogb3B0aW1pemUgdGhpc1xuICAgICAgcmVhc29uID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcsIHsgZmF0YWw6IHRydWUgfSkuZGVjb2RlKHJlYXNvbilcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSwgcmVhc29uIH1cbiAgfVxuXG4gIGdldCBjbG9zaW5nSW5mbyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2luZm8uY2xvc2VJbmZvXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEJ5dGVQYXJzZXJcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBET01FeGNlcHRpb24gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2NvbnN0YW50cycpXG5jb25zdCB7IFVSTFNlcmlhbGl6ZXIgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2RhdGFVUkwnKVxuY29uc3QgeyBnZXRHbG9iYWxPcmlnaW4gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2dsb2JhbCcpXG5jb25zdCB7IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsIHN0YXRlcywgb3Bjb2RlcywgZW1wdHlCdWZmZXIgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHtcbiAga1dlYlNvY2tldFVSTCxcbiAga1JlYWR5U3RhdGUsXG4gIGtDb250cm9sbGVyLFxuICBrQmluYXJ5VHlwZSxcbiAga1Jlc3BvbnNlLFxuICBrU2VudENsb3NlLFxuICBrQnl0ZVBhcnNlclxufSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGlzRXN0YWJsaXNoZWQsIGlzQ2xvc2luZywgaXNWYWxpZFN1YnByb3RvY29sLCBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbiwgZmlyZUV2ZW50IH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBlc3RhYmxpc2hXZWJTb2NrZXRDb25uZWN0aW9uIH0gPSByZXF1aXJlKCcuL2Nvbm5lY3Rpb24nKVxuY29uc3QgeyBXZWJzb2NrZXRGcmFtZVNlbmQgfSA9IHJlcXVpcmUoJy4vZnJhbWUnKVxuY29uc3QgeyBCeXRlUGFyc2VyIH0gPSByZXF1aXJlKCcuL3JlY2VpdmVyJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSwgaXNCbG9iTGlrZSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi4vZ2xvYmFsJylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuXG5sZXQgZXhwZXJpbWVudGFsV2FybmVkID0gZmFsc2VcblxuLy8gaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jaW50ZXJmYWNlLWRlZmluaXRpb25cbmNsYXNzIFdlYlNvY2tldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgI2V2ZW50cyA9IHtcbiAgICBvcGVuOiBudWxsLFxuICAgIGVycm9yOiBudWxsLFxuICAgIGNsb3NlOiBudWxsLFxuICAgIG1lc3NhZ2U6IG51bGxcbiAgfVxuXG4gICNidWZmZXJlZEFtb3VudCA9IDBcbiAgI3Byb3RvY29sID0gJydcbiAgI2V4dGVuc2lvbnMgPSAnJ1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBwcm90b2NvbHNcbiAgICovXG4gIGNvbnN0cnVjdG9yICh1cmwsIHByb3RvY29scyA9IFtdKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1dlYlNvY2tldCBjb25zdHJ1Y3RvcicgfSlcblxuICAgIGlmICghZXhwZXJpbWVudGFsV2FybmVkKSB7XG4gICAgICBleHBlcmltZW50YWxXYXJuZWQgPSB0cnVlXG4gICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKCdXZWJTb2NrZXRzIGFyZSBleHBlcmltZW50YWwsIGV4cGVjdCB0aGVtIHRvIGNoYW5nZSBhdCBhbnkgdGltZS4nLCB7XG4gICAgICAgIGNvZGU6ICdVTkRJQ0ktV1MnXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVyc1snRE9NU3RyaW5nIG9yIHNlcXVlbmNlPERPTVN0cmluZz4gb3IgV2ViU29ja2V0SW5pdCddKHByb3RvY29scylcblxuICAgIHVybCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh1cmwpXG4gICAgcHJvdG9jb2xzID0gb3B0aW9ucy5wcm90b2NvbHNcblxuICAgIC8vIDEuIExldCBiYXNlVVJMIGJlIHRoaXMncyByZWxldmFudCBzZXR0aW5ncyBvYmplY3QncyBBUEkgYmFzZSBVUkwuXG4gICAgY29uc3QgYmFzZVVSTCA9IGdldEdsb2JhbE9yaWdpbigpXG5cbiAgICAvLyAxLiBMZXQgdXJsUmVjb3JkIGJlIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIFVSTCBwYXJzZXIgdG8gdXJsIHdpdGggYmFzZVVSTC5cbiAgICBsZXQgdXJsUmVjb3JkXG5cbiAgICB0cnkge1xuICAgICAgdXJsUmVjb3JkID0gbmV3IFVSTCh1cmwsIGJhc2VVUkwpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gMy4gSWYgdXJsUmVjb3JkIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBcIlN5bnRheEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihlLCAnU3ludGF4RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDQuIElmIHVybFJlY29yZOKAmXMgc2NoZW1lIGlzIFwiaHR0cFwiLCB0aGVuIHNldCB1cmxSZWNvcmTigJlzIHNjaGVtZSB0byBcIndzXCIuXG4gICAgaWYgKHVybFJlY29yZC5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgICAgdXJsUmVjb3JkLnByb3RvY29sID0gJ3dzOidcbiAgICB9IGVsc2UgaWYgKHVybFJlY29yZC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgaXMgXCJodHRwc1wiLCBzZXQgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgdG8gXCJ3c3NcIi5cbiAgICAgIHVybFJlY29yZC5wcm90b2NvbCA9ICd3c3M6J1xuICAgIH1cblxuICAgIC8vIDYuIElmIHVybFJlY29yZOKAmXMgc2NoZW1lIGlzIG5vdCBcIndzXCIgb3IgXCJ3c3NcIiwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKHVybFJlY29yZC5wcm90b2NvbCAhPT0gJ3dzOicgJiYgdXJsUmVjb3JkLnByb3RvY29sICE9PSAnd3NzOicpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oXG4gICAgICAgIGBFeHBlY3RlZCBhIHdzOiBvciB3c3M6IHByb3RvY29sLCBnb3QgJHt1cmxSZWNvcmQucHJvdG9jb2x9YCxcbiAgICAgICAgJ1N5bnRheEVycm9yJ1xuICAgICAgKVxuICAgIH1cblxuICAgIC8vIDcuIElmIHVybFJlY29yZOKAmXMgZnJhZ21lbnQgaXMgbm9uLW51bGwsIHRoZW4gdGhyb3cgYSBcIlN5bnRheEVycm9yXCJcbiAgICAvLyAgICBET01FeGNlcHRpb24uXG4gICAgaWYgKHVybFJlY29yZC5oYXNoIHx8IHVybFJlY29yZC5ocmVmLmVuZHNXaXRoKCcjJykpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0dvdCBmcmFnbWVudCcsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgLy8gOC4gSWYgcHJvdG9jb2xzIGlzIGEgc3RyaW5nLCBzZXQgcHJvdG9jb2xzIHRvIGEgc2VxdWVuY2UgY29uc2lzdGluZ1xuICAgIC8vICAgIG9mIGp1c3QgdGhhdCBzdHJpbmcuXG4gICAgaWYgKHR5cGVvZiBwcm90b2NvbHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcm90b2NvbHMgPSBbcHJvdG9jb2xzXVxuICAgIH1cblxuICAgIC8vIDkuIElmIGFueSBvZiB0aGUgdmFsdWVzIGluIHByb3RvY29scyBvY2N1ciBtb3JlIHRoYW4gb25jZSBvciBvdGhlcndpc2VcbiAgICAvLyAgICBmYWlsIHRvIG1hdGNoIHRoZSByZXF1aXJlbWVudHMgZm9yIGVsZW1lbnRzIHRoYXQgY29tcHJpc2UgdGhlIHZhbHVlXG4gICAgLy8gICAgb2YgYFNlYy1XZWJTb2NrZXQtUHJvdG9jb2xgIGZpZWxkcyBhcyBkZWZpbmVkIGJ5IFRoZSBXZWJTb2NrZXRcbiAgICAvLyAgICBwcm90b2NvbCwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKHByb3RvY29scy5sZW5ndGggIT09IG5ldyBTZXQocHJvdG9jb2xzLm1hcChwID0+IHAudG9Mb3dlckNhc2UoKSkpLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1Qcm90b2NvbCB2YWx1ZScsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgaWYgKHByb3RvY29scy5sZW5ndGggPiAwICYmICFwcm90b2NvbHMuZXZlcnkocCA9PiBpc1ZhbGlkU3VicHJvdG9jb2wocCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgdmFsdWUnLCAnU3ludGF4RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDEwLiBTZXQgdGhpcydzIHVybCB0byB1cmxSZWNvcmQuXG4gICAgdGhpc1trV2ViU29ja2V0VVJMXSA9IG5ldyBVUkwodXJsUmVjb3JkLmhyZWYpXG5cbiAgICAvLyAxMS4gTGV0IGNsaWVudCBiZSB0aGlzJ3MgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LlxuXG4gICAgLy8gMTIuIFJ1biB0aGlzIHN0ZXAgaW4gcGFyYWxsZWw6XG5cbiAgICAvLyAgICAxLiBFc3RhYmxpc2ggYSBXZWJTb2NrZXQgY29ubmVjdGlvbiBnaXZlbiB1cmxSZWNvcmQsIHByb3RvY29scyxcbiAgICAvLyAgICAgICBhbmQgY2xpZW50LlxuICAgIHRoaXNba0NvbnRyb2xsZXJdID0gZXN0YWJsaXNoV2ViU29ja2V0Q29ubmVjdGlvbihcbiAgICAgIHVybFJlY29yZCxcbiAgICAgIHByb3RvY29scyxcbiAgICAgIHRoaXMsXG4gICAgICAocmVzcG9uc2UpID0+IHRoaXMuI29uQ29ubmVjdGlvbkVzdGFibGlzaGVkKHJlc3BvbnNlKSxcbiAgICAgIG9wdGlvbnNcbiAgICApXG5cbiAgICAvLyBFYWNoIFdlYlNvY2tldCBvYmplY3QgaGFzIGFuIGFzc29jaWF0ZWQgcmVhZHkgc3RhdGUsIHdoaWNoIGlzIGFcbiAgICAvLyBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbi4gSW5pdGlhbGx5IGl0IG11c3RcbiAgICAvLyBiZSBDT05ORUNUSU5HICgwKS5cbiAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IFdlYlNvY2tldC5DT05ORUNUSU5HXG5cbiAgICAvLyBUaGUgZXh0ZW5zaW9ucyBhdHRyaWJ1dGUgbXVzdCBpbml0aWFsbHkgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuXG5cbiAgICAvLyBUaGUgcHJvdG9jb2wgYXR0cmlidXRlIG11c3QgaW5pdGlhbGx5IHJldHVybiB0aGUgZW1wdHkgc3RyaW5nLlxuXG4gICAgLy8gRWFjaCBXZWJTb2NrZXQgb2JqZWN0IGhhcyBhbiBhc3NvY2lhdGVkIGJpbmFyeSB0eXBlLCB3aGljaCBpcyBhXG4gICAgLy8gQmluYXJ5VHlwZS4gSW5pdGlhbGx5IGl0IG11c3QgYmUgXCJibG9iXCIuXG4gICAgdGhpc1trQmluYXJ5VHlwZV0gPSAnYmxvYidcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtY2xvc2VcbiAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gcmVhc29uXG4gICAqL1xuICBjbG9zZSAoY29kZSA9IHVuZGVmaW5lZCwgcmVhc29uID0gdW5kZWZpbmVkKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29kZSA9IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBzaG9ydCddKGNvZGUsIHsgY2xhbXA6IHRydWUgfSlcbiAgICB9XG5cbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlYXNvbiA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhyZWFzb24pXG4gICAgfVxuXG4gICAgLy8gMS4gSWYgY29kZSBpcyBwcmVzZW50LCBidXQgaXMgbmVpdGhlciBhbiBpbnRlZ2VyIGVxdWFsIHRvIDEwMDAgbm9yIGFuXG4gICAgLy8gICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgMzAwMCB0byA0OTk5LCBpbmNsdXNpdmUsIHRocm93IGFuXG4gICAgLy8gICAgXCJJbnZhbGlkQWNjZXNzRXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvZGUgIT09IDEwMDAgJiYgKGNvZGUgPCAzMDAwIHx8IGNvZGUgPiA0OTk5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdpbnZhbGlkIGNvZGUnLCAnSW52YWxpZEFjY2Vzc0Vycm9yJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVhc29uQnl0ZUxlbmd0aCA9IDBcblxuICAgIC8vIDIuIElmIHJlYXNvbiBpcyBwcmVzZW50LCB0aGVuIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDEuIExldCByZWFzb25CeXRlcyBiZSB0aGUgcmVzdWx0IG9mIGVuY29kaW5nIHJlYXNvbi5cbiAgICAgIC8vIDIuIElmIHJlYXNvbkJ5dGVzIGlzIGxvbmdlciB0aGFuIDEyMyBieXRlcywgdGhlbiB0aHJvdyBhXG4gICAgICAvLyAgICBcIlN5bnRheEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgICAgcmVhc29uQnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHJlYXNvbilcblxuICAgICAgaWYgKHJlYXNvbkJ5dGVMZW5ndGggPiAxMjMpIHtcbiAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihcbiAgICAgICAgICBgUmVhc29uIG11c3QgYmUgbGVzcyB0aGFuIDEyMyBieXRlczsgcmVjZWl2ZWQgJHtyZWFzb25CeXRlTGVuZ3RofWAsXG4gICAgICAgICAgJ1N5bnRheEVycm9yJ1xuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gUnVuIHRoZSBmaXJzdCBtYXRjaGluZyBzdGVwcyBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDpcbiAgICBpZiAodGhpc1trUmVhZHlTdGF0ZV0gPT09IFdlYlNvY2tldC5DTE9TSU5HIHx8IHRoaXNba1JlYWR5U3RhdGVdID09PSBXZWJTb2NrZXQuQ0xPU0VEKSB7XG4gICAgICAvLyBJZiB0aGlzJ3MgcmVhZHkgc3RhdGUgaXMgQ0xPU0lORyAoMikgb3IgQ0xPU0VEICgzKVxuICAgICAgLy8gRG8gbm90aGluZy5cbiAgICB9IGVsc2UgaWYgKCFpc0VzdGFibGlzaGVkKHRoaXMpKSB7XG4gICAgICAvLyBJZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgbm90IHlldCBlc3RhYmxpc2hlZFxuICAgICAgLy8gRmFpbCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gYW5kIHNldCB0aGlzJ3MgcmVhZHkgc3RhdGVcbiAgICAgIC8vIHRvIENMT1NJTkcgKDIpLlxuICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcywgJ0Nvbm5lY3Rpb24gd2FzIGNsb3NlZCBiZWZvcmUgaXQgd2FzIGVzdGFibGlzaGVkLicpXG4gICAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IFdlYlNvY2tldC5DTE9TSU5HXG4gICAgfSBlbHNlIGlmICghaXNDbG9zaW5nKHRoaXMpKSB7XG4gICAgICAvLyBJZiB0aGUgV2ViU29ja2V0IGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZFxuICAgICAgLy8gU3RhcnQgdGhlIFdlYlNvY2tldCBjbG9zaW5nIGhhbmRzaGFrZSBhbmQgc2V0IHRoaXMncyByZWFkeVxuICAgICAgLy8gc3RhdGUgdG8gQ0xPU0lORyAoMikuXG4gICAgICAvLyAtIElmIG5laXRoZXIgY29kZSBub3IgcmVhc29uIGlzIHByZXNlbnQsIHRoZSBXZWJTb2NrZXQgQ2xvc2VcbiAgICAgIC8vICAgbWVzc2FnZSBtdXN0IG5vdCBoYXZlIGEgYm9keS5cbiAgICAgIC8vIC0gSWYgY29kZSBpcyBwcmVzZW50LCB0aGVuIHRoZSBzdGF0dXMgY29kZSB0byB1c2UgaW4gdGhlXG4gICAgICAvLyAgIFdlYlNvY2tldCBDbG9zZSBtZXNzYWdlIG11c3QgYmUgdGhlIGludGVnZXIgZ2l2ZW4gYnkgY29kZS5cbiAgICAgIC8vIC0gSWYgcmVhc29uIGlzIGFsc28gcHJlc2VudCwgdGhlbiByZWFzb25CeXRlcyBtdXN0IGJlXG4gICAgICAvLyAgIHByb3ZpZGVkIGluIHRoZSBDbG9zZSBtZXNzYWdlIGFmdGVyIHRoZSBzdGF0dXMgY29kZS5cblxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKClcblxuICAgICAgLy8gSWYgbmVpdGhlciBjb2RlIG5vciByZWFzb24gaXMgcHJlc2VudCwgdGhlIFdlYlNvY2tldCBDbG9zZVxuICAgICAgLy8gbWVzc2FnZSBtdXN0IG5vdCBoYXZlIGEgYm9keS5cblxuICAgICAgLy8gSWYgY29kZSBpcyBwcmVzZW50LCB0aGVuIHRoZSBzdGF0dXMgY29kZSB0byB1c2UgaW4gdGhlXG4gICAgICAvLyBXZWJTb2NrZXQgQ2xvc2UgbWVzc2FnZSBtdXN0IGJlIHRoZSBpbnRlZ2VyIGdpdmVuIGJ5IGNvZGUuXG4gICAgICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkICYmIHJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZyYW1lLmZyYW1lRGF0YSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGVVSW50MTZCRShjb2RlLCAwKVxuICAgICAgfSBlbHNlIGlmIChjb2RlICE9PSB1bmRlZmluZWQgJiYgcmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gSWYgcmVhc29uIGlzIGFsc28gcHJlc2VudCwgdGhlbiByZWFzb25CeXRlcyBtdXN0IGJlXG4gICAgICAgIC8vIHByb3ZpZGVkIGluIHRoZSBDbG9zZSBtZXNzYWdlIGFmdGVyIHRoZSBzdGF0dXMgY29kZS5cbiAgICAgICAgZnJhbWUuZnJhbWVEYXRhID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIgKyByZWFzb25CeXRlTGVuZ3RoKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGVVSW50MTZCRShjb2RlLCAwKVxuICAgICAgICAvLyB0aGUgYm9keSBNQVkgY29udGFpbiBVVEYtOC1lbmNvZGVkIGRhdGEgd2l0aCB2YWx1ZSAvcmVhc29uL1xuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGUocmVhc29uLCAyLCAndXRmLTgnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnJhbWUuZnJhbWVEYXRhID0gZW1wdHlCdWZmZXJcbiAgICAgIH1cblxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbScpLkR1cGxleH0gKi9cbiAgICAgIGNvbnN0IHNvY2tldCA9IHRoaXNba1Jlc3BvbnNlXS5zb2NrZXRcblxuICAgICAgc29ja2V0LndyaXRlKGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuQ0xPU0UpLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgdGhpc1trU2VudENsb3NlXSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gVXBvbiBlaXRoZXIgc2VuZGluZyBvciByZWNlaXZpbmcgYSBDbG9zZSBjb250cm9sIGZyYW1lLCBpdCBpcyBzYWlkXG4gICAgICAvLyB0aGF0IF9UaGUgV2ViU29ja2V0IENsb3NpbmcgSGFuZHNoYWtlIGlzIFN0YXJ0ZWRfIGFuZCB0aGF0IHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgaW4gdGhlIENMT1NJTkcgc3RhdGUuXG4gICAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IHN0YXRlcy5DTE9TSU5HXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgLy8gU2V0IHRoaXMncyByZWFkeSBzdGF0ZSB0byBDTE9TSU5HICgyKS5cbiAgICAgIHRoaXNba1JlYWR5U3RhdGVdID0gV2ViU29ja2V0LkNMT1NJTkdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LXNlbmRcbiAgICogQHBhcmFtIHtOb2RlSlMuVHlwZWRBcnJheXxBcnJheUJ1ZmZlcnxCbG9ifHN0cmluZ30gZGF0YVxuICAgKi9cbiAgc2VuZCAoZGF0YSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdXZWJTb2NrZXQuc2VuZCcgfSlcblxuICAgIGRhdGEgPSB3ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRTZW5kRGF0YShkYXRhKVxuXG4gICAgLy8gMS4gSWYgdGhpcydzIHJlYWR5IHN0YXRlIGlzIENPTk5FQ1RJTkcsIHRoZW4gdGhyb3cgYW5cbiAgICAvLyAgICBcIkludmFsaWRTdGF0ZUVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgIGlmICh0aGlzW2tSZWFkeVN0YXRlXSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ1NlbnQgYmVmb3JlIGNvbm5lY3RlZC4nLCAnSW52YWxpZFN0YXRlRXJyb3InKVxuICAgIH1cblxuICAgIC8vIDIuIFJ1biB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHN0ZXBzIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OlxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTYuMVxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTUuMlxuXG4gICAgaWYgKCFpc0VzdGFibGlzaGVkKHRoaXMpIHx8IGlzQ2xvc2luZyh0aGlzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbScpLkR1cGxleH0gKi9cbiAgICBjb25zdCBzb2NrZXQgPSB0aGlzW2tSZXNwb25zZV0uc29ja2V0XG5cbiAgICAvLyBJZiBkYXRhIGlzIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIGFuZCB0aGUgV2ViU29ja2V0XG4gICAgICAvLyBjbG9zaW5nIGhhbmRzaGFrZSBoYXMgbm90IHlldCBzdGFydGVkLCB0aGVuIHRoZSB1c2VyIGFnZW50XG4gICAgICAvLyBtdXN0IHNlbmQgYSBXZWJTb2NrZXQgTWVzc2FnZSBjb21wcmlzZWQgb2YgdGhlIGRhdGEgYXJndW1lbnRcbiAgICAgIC8vIHVzaW5nIGEgdGV4dCBmcmFtZSBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuXG4gICAgICAvLyBiZWNhdXNlIGl0IHdvdWxkIG5lZWQgdG8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCxcbiAgICAgIC8vIHRoZSB1c2VyIGFnZW50IG11c3QgZmxhZyB0aGUgV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2VcbiAgICAgIC8vIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi4gQW55IGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhXG4gICAgICAvLyBzdHJpbmcgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdCBpbmNyZWFzZVxuICAgICAgLy8gdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0b1xuICAgICAgLy8gZXhwcmVzcyB0aGUgYXJndW1lbnQgYXMgVVRGLTguXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmZyb20oZGF0YSlcbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCh2YWx1ZSlcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuVEVYVClcblxuICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgKz0gdmFsdWUuYnl0ZUxlbmd0aFxuICAgICAgc29ja2V0LndyaXRlKGJ1ZmZlciwgKCkgPT4ge1xuICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCAtPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAodHlwZXMuaXNBcnJheUJ1ZmZlcihkYXRhKSkge1xuICAgICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBhbmQgdGhlIFdlYlNvY2tldFxuICAgICAgLy8gY2xvc2luZyBoYW5kc2hha2UgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgdGhlbiB0aGUgdXNlciBhZ2VudCBtdXN0XG4gICAgICAvLyBzZW5kIGEgV2ViU29ja2V0IE1lc3NhZ2UgY29tcHJpc2VkIG9mIGRhdGEgdXNpbmcgYSBiaW5hcnkgZnJhbWVcbiAgICAgIC8vIG9wY29kZTsgaWYgdGhlIGRhdGEgY2Fubm90IGJlIHNlbnQsIGUuZy4gYmVjYXVzZSBpdCB3b3VsZCBuZWVkXG4gICAgICAvLyB0byBiZSBidWZmZXJlZCBidXQgdGhlIGJ1ZmZlciBpcyBmdWxsLCB0aGUgdXNlciBhZ2VudCBtdXN0IGZsYWdcbiAgICAgIC8vIHRoZSBXZWJTb2NrZXQgYXMgZnVsbCBhbmQgdGhlbiBjbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICAvLyBUaGUgZGF0YSB0byBiZSBzZW50IGlzIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgYnVmZmVyIGRlc2NyaWJlZFxuICAgICAgLy8gYnkgdGhlIEFycmF5QnVmZmVyIG9iamVjdC4gQW55IGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhblxuICAgICAgLy8gQXJyYXlCdWZmZXIgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdFxuICAgICAgLy8gaW5jcmVhc2UgdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgbGVuZ3RoIG9mIHRoZVxuICAgICAgLy8gQXJyYXlCdWZmZXIgaW4gYnl0ZXMuXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmZyb20oZGF0YSlcbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCh2YWx1ZSlcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuQklOQVJZKVxuXG4gICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCArPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICBzb2NrZXQud3JpdGUoYnVmZmVyLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50IC09IHZhbHVlLmJ5dGVMZW5ndGhcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSkpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYW5kIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vIGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHRoZW4gdGhlIHVzZXIgYWdlbnQgbXVzdFxuICAgICAgLy8gc2VuZCBhIFdlYlNvY2tldCBNZXNzYWdlIGNvbXByaXNlZCBvZiBkYXRhIHVzaW5nIGEgYmluYXJ5IGZyYW1lXG4gICAgICAvLyBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuIGJlY2F1c2UgaXQgd291bGQgbmVlZCB0b1xuICAgICAgLy8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIHVzZXIgYWdlbnQgbXVzdCBmbGFnIHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBUaGVcbiAgICAgIC8vIGRhdGEgdG8gYmUgc2VudCBpcyB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIHNlY3Rpb24gb2YgdGhlIGJ1ZmZlclxuICAgICAgLy8gZGVzY3JpYmVkIGJ5IHRoZSBBcnJheUJ1ZmZlciBvYmplY3QgdGhhdCBkYXRhIHJlZmVyZW5jZXMuIEFueVxuICAgICAgLy8gaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aXRoIHRoaXMga2luZCBvZiBhcmd1bWVudCB0aGF0IGRvZXNcbiAgICAgIC8vIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdCBpbmNyZWFzZSB0aGUgYnVmZmVyZWRBbW91bnQgYXR0cmlidXRlXG4gICAgICAvLyBieSB0aGUgbGVuZ3RoIG9mIGRhdGHigJlzIGJ1ZmZlciBpbiBieXRlcy5cblxuICAgICAgY29uc3QgYWIgPSBCdWZmZXIuZnJvbShkYXRhLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEuYnl0ZUxlbmd0aClcblxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKGFiKVxuICAgICAgY29uc3QgYnVmZmVyID0gZnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5CSU5BUlkpXG5cbiAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50ICs9IGFiLmJ5dGVMZW5ndGhcbiAgICAgIHNvY2tldC53cml0ZShidWZmZXIsICgpID0+IHtcbiAgICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgLT0gYWIuYnl0ZUxlbmd0aFxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UoZGF0YSkpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYW5kIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vIGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHRoZW4gdGhlIHVzZXIgYWdlbnQgbXVzdFxuICAgICAgLy8gc2VuZCBhIFdlYlNvY2tldCBNZXNzYWdlIGNvbXByaXNlZCBvZiBkYXRhIHVzaW5nIGEgYmluYXJ5IGZyYW1lXG4gICAgICAvLyBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuIGJlY2F1c2UgaXQgd291bGQgbmVlZCB0b1xuICAgICAgLy8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIHVzZXIgYWdlbnQgbXVzdCBmbGFnIHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBUaGUgZGF0YVxuICAgICAgLy8gdG8gYmUgc2VudCBpcyB0aGUgcmF3IGRhdGEgcmVwcmVzZW50ZWQgYnkgdGhlIEJsb2Igb2JqZWN0LiBBbnlcbiAgICAgIC8vIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhIEJsb2IgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvd1xuICAgICAgLy8gYW4gZXhjZXB0aW9uIG11c3QgaW5jcmVhc2UgdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgc2l6ZVxuICAgICAgLy8gb2YgdGhlIEJsb2Igb2JqZWN04oCZcyByYXcgZGF0YSwgaW4gYnl0ZXMuXG5cbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCgpXG5cbiAgICAgIGRhdGEuYXJyYXlCdWZmZXIoKS50aGVuKChhYikgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IEJ1ZmZlci5mcm9tKGFiKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEgPSB2YWx1ZVxuICAgICAgICBjb25zdCBidWZmZXIgPSBmcmFtZS5jcmVhdGVGcmFtZShvcGNvZGVzLkJJTkFSWSlcblxuICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCArPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICAgIHNvY2tldC53cml0ZShidWZmZXIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCAtPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldCByZWFkeVN0YXRlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICAvLyBUaGUgcmVhZHlTdGF0ZSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlzJ3MgcmVhZHkgc3RhdGUuXG4gICAgcmV0dXJuIHRoaXNba1JlYWR5U3RhdGVdXG4gIH1cblxuICBnZXQgYnVmZmVyZWRBbW91bnQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNidWZmZXJlZEFtb3VudFxuICB9XG5cbiAgZ2V0IHVybCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgLy8gVGhlIHVybCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlzJ3MgdXJsLCBzZXJpYWxpemVkLlxuICAgIHJldHVybiBVUkxTZXJpYWxpemVyKHRoaXNba1dlYlNvY2tldFVSTF0pXG4gIH1cblxuICBnZXQgZXh0ZW5zaW9ucyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V4dGVuc2lvbnNcbiAgfVxuXG4gIGdldCBwcm90b2NvbCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI3Byb3RvY29sXG4gIH1cblxuICBnZXQgb25vcGVuICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLm9wZW5cbiAgfVxuXG4gIHNldCBvbm9wZW4gKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKHRoaXMuI2V2ZW50cy5vcGVuKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29wZW4nLCB0aGlzLiNldmVudHMub3BlbilcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNldmVudHMub3BlbiA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLm9wZW4gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uZXJyb3IgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNldmVudHMuZXJyb3JcbiAgfVxuXG4gIHNldCBvbmVycm9yIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIGlmICh0aGlzLiNldmVudHMuZXJyb3IpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLiNldmVudHMuZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy4jZXZlbnRzLmVycm9yID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLmVycm9yID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmNsb3NlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLmNsb3NlXG4gIH1cblxuICBzZXQgb25jbG9zZSAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodGhpcy4jZXZlbnRzLmNsb3NlKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy4jZXZlbnRzLmNsb3NlKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5jbG9zZSA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5jbG9zZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25tZXNzYWdlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLm1lc3NhZ2VcbiAgfVxuXG4gIHNldCBvbm1lc3NhZ2UgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKHRoaXMuI2V2ZW50cy5tZXNzYWdlKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLiNldmVudHMubWVzc2FnZSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNldmVudHMubWVzc2FnZSA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLm1lc3NhZ2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IGJpbmFyeVR5cGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzW2tCaW5hcnlUeXBlXVxuICB9XG5cbiAgc2V0IGJpbmFyeVR5cGUgKHR5cGUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodHlwZSAhPT0gJ2Jsb2InICYmIHR5cGUgIT09ICdhcnJheWJ1ZmZlcicpIHtcbiAgICAgIHRoaXNba0JpbmFyeVR5cGVdID0gJ2Jsb2InXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0JpbmFyeVR5cGVdID0gdHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2ZlZWRiYWNrLWZyb20tdGhlLXByb3RvY29sXG4gICAqL1xuICAjb25Db25uZWN0aW9uRXN0YWJsaXNoZWQgKHJlc3BvbnNlKSB7XG4gICAgLy8gcHJvY2Vzc1Jlc3BvbnNlIGlzIGNhbGxlZCB3aGVuIHRoZSBcInJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdCBoYXMgYmVlbiByZWNlaXZlZCBhbmQgaW5pdGlhbGl6ZWQuXCJcbiAgICAvLyBvbmNlIHRoaXMgaGFwcGVucywgdGhlIGNvbm5lY3Rpb24gaXMgb3BlblxuICAgIHRoaXNba1Jlc3BvbnNlXSA9IHJlc3BvbnNlXG5cbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgQnl0ZVBhcnNlcih0aGlzKVxuICAgIHBhcnNlci5vbignZHJhaW4nLCBmdW5jdGlvbiBvblBhcnNlckRyYWluICgpIHtcbiAgICAgIHRoaXMud3Nba1Jlc3BvbnNlXS5zb2NrZXQucmVzdW1lKClcbiAgICB9KVxuXG4gICAgcmVzcG9uc2Uuc29ja2V0LndzID0gdGhpc1xuICAgIHRoaXNba0J5dGVQYXJzZXJdID0gcGFyc2VyXG5cbiAgICAvLyAxLiBDaGFuZ2UgdGhlIHJlYWR5IHN0YXRlIHRvIE9QRU4gKDEpLlxuICAgIHRoaXNba1JlYWR5U3RhdGVdID0gc3RhdGVzLk9QRU5cblxuICAgIC8vIDIuIENoYW5nZSB0aGUgZXh0ZW5zaW9ucyBhdHRyaWJ1dGXigJlzIHZhbHVlIHRvIHRoZSBleHRlbnNpb25zIGluIHVzZSwgaWZcbiAgICAvLyAgICBpdCBpcyBub3QgdGhlIG51bGwgdmFsdWUuXG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tOS4xXG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnc2VjLXdlYnNvY2tldC1leHRlbnNpb25zJylcblxuICAgIGlmIChleHRlbnNpb25zICE9PSBudWxsKSB7XG4gICAgICB0aGlzLiNleHRlbnNpb25zID0gZXh0ZW5zaW9uc1xuICAgIH1cblxuICAgIC8vIDMuIENoYW5nZSB0aGUgcHJvdG9jb2wgYXR0cmlidXRl4oCZcyB2YWx1ZSB0byB0aGUgc3VicHJvdG9jb2wgaW4gdXNlLCBpZlxuICAgIC8vICAgIGl0IGlzIG5vdCB0aGUgbnVsbCB2YWx1ZS5cbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi0xLjlcbiAgICBjb25zdCBwcm90b2NvbCA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnc2VjLXdlYnNvY2tldC1wcm90b2NvbCcpXG5cbiAgICBpZiAocHJvdG9jb2wgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuI3Byb3RvY29sID0gcHJvdG9jb2xcbiAgICB9XG5cbiAgICAvLyA0LiBGaXJlIGFuIGV2ZW50IG5hbWVkIG9wZW4gYXQgdGhlIFdlYlNvY2tldCBvYmplY3QuXG4gICAgZmlyZUV2ZW50KCdvcGVuJywgdGhpcylcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LWNvbm5lY3RpbmdcbldlYlNvY2tldC5DT05ORUNUSU5HID0gV2ViU29ja2V0LnByb3RvdHlwZS5DT05ORUNUSU5HID0gc3RhdGVzLkNPTk5FQ1RJTkdcbi8vIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtb3BlblxuV2ViU29ja2V0Lk9QRU4gPSBXZWJTb2NrZXQucHJvdG90eXBlLk9QRU4gPSBzdGF0ZXMuT1BFTlxuLy8gaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZG9tLXdlYnNvY2tldC1jbG9zaW5nXG5XZWJTb2NrZXQuQ0xPU0lORyA9IFdlYlNvY2tldC5wcm90b3R5cGUuQ0xPU0lORyA9IHN0YXRlcy5DTE9TSU5HXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LWNsb3NlZFxuV2ViU29ja2V0LkNMT1NFRCA9IFdlYlNvY2tldC5wcm90b3R5cGUuQ0xPU0VEID0gc3RhdGVzLkNMT1NFRFxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZWJTb2NrZXQucHJvdG90eXBlLCB7XG4gIENPTk5FQ1RJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIE9QRU46IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIENMT1NJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIENMT1NFRDogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgdXJsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkeVN0YXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBidWZmZXJlZEFtb3VudDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25vcGVuOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmNsb3NlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjbG9zZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25tZXNzYWdlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBiaW5hcnlUeXBlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBleHRlbnNpb25zOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBwcm90b2NvbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ1dlYlNvY2tldCcsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZWJTb2NrZXQsIHtcbiAgQ09OTkVDVElORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgT1BFTjogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0lORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0VEOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzXG59KVxuXG53ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8RE9NU3RyaW5nPiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmdcbilcblxud2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+J10gPSBmdW5jdGlvbiAoVikge1xuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSA9PT0gJ09iamVjdCcgJiYgU3ltYm9sLml0ZXJhdG9yIGluIFYpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPERPTVN0cmluZz4nXShWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxufVxuXG4vLyBUaGlzIGltcGxlbWVudHMgdGhlIHByb3BzYWwgbWFkZSBpbiBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL3dlYnNvY2tldHMvaXNzdWVzLzQyXG53ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAncHJvdG9jb2xzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPiddLFxuICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hlcicsXG4gICAgY29udmVydGVyOiAoVikgPT4gVixcbiAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgIHJldHVybiBnZXRHbG9iYWxEaXNwYXRjaGVyKClcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdoZWFkZXJzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5IZWFkZXJzSW5pdClcbiAgfVxuXSlcblxud2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+IG9yIFdlYlNvY2tldEluaXQnXSA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpID09PSAnT2JqZWN0JyAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiBWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRJbml0KFYpXG4gIH1cblxuICByZXR1cm4geyBwcm90b2NvbHM6IHdlYmlkbC5jb252ZXJ0ZXJzWydET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPiddKFYpIH1cbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuV2ViU29ja2V0U2VuZERhdGEgPSBmdW5jdGlvbiAoVikge1xuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSA9PT0gJ09iamVjdCcpIHtcbiAgICBpZiAoaXNCbG9iTGlrZShWKSkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoViwgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgfVxuXG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhWKSB8fCB0eXBlcy5pc0FueUFycmF5QnVmZmVyKFYpKSB7XG4gICAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQnVmZmVyU291cmNlKFYpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhWKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgV2ViU29ja2V0XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBDbGllbnQgPSByZXF1aXJlKCcuL2xpYi9jbGllbnQnKVxuY29uc3QgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4vbGliL2Rpc3BhdGNoZXInKVxuY29uc3QgZXJyb3JzID0gcmVxdWlyZSgnLi9saWIvY29yZS9lcnJvcnMnKVxuY29uc3QgUG9vbCA9IHJlcXVpcmUoJy4vbGliL3Bvb2wnKVxuY29uc3QgQmFsYW5jZWRQb29sID0gcmVxdWlyZSgnLi9saWIvYmFsYW5jZWQtcG9vbCcpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4vbGliL2FnZW50JylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuL2xpYi9jb3JlL3V0aWwnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gZXJyb3JzXG5jb25zdCBhcGkgPSByZXF1aXJlKCcuL2xpYi9hcGknKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuL2xpYi9jb3JlL2Nvbm5lY3QnKVxuY29uc3QgTW9ja0NsaWVudCA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1jbGllbnQnKVxuY29uc3QgTW9ja0FnZW50ID0gcmVxdWlyZSgnLi9saWIvbW9jay9tb2NrLWFnZW50JylcbmNvbnN0IE1vY2tQb29sID0gcmVxdWlyZSgnLi9saWIvbW9jay9tb2NrLXBvb2wnKVxuY29uc3QgbW9ja0Vycm9ycyA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1lcnJvcnMnKVxuY29uc3QgUHJveHlBZ2VudCA9IHJlcXVpcmUoJy4vbGliL3Byb3h5LWFnZW50JylcbmNvbnN0IFJldHJ5SGFuZGxlciA9IHJlcXVpcmUoJy4vbGliL2hhbmRsZXIvUmV0cnlIYW5kbGVyJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciwgc2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi9saWIvZ2xvYmFsJylcbmNvbnN0IERlY29yYXRvckhhbmRsZXIgPSByZXF1aXJlKCcuL2xpYi9oYW5kbGVyL0RlY29yYXRvckhhbmRsZXInKVxuY29uc3QgUmVkaXJlY3RIYW5kbGVyID0gcmVxdWlyZSgnLi9saWIvaGFuZGxlci9SZWRpcmVjdEhhbmRsZXInKVxuY29uc3QgY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvciA9IHJlcXVpcmUoJy4vbGliL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3InKVxuXG5sZXQgaGFzQ3J5cHRvXG50cnkge1xuICByZXF1aXJlKCdjcnlwdG8nKVxuICBoYXNDcnlwdG8gPSB0cnVlXG59IGNhdGNoIHtcbiAgaGFzQ3J5cHRvID0gZmFsc2Vcbn1cblxuT2JqZWN0LmFzc2lnbihEaXNwYXRjaGVyLnByb3RvdHlwZSwgYXBpKVxuXG5tb2R1bGUuZXhwb3J0cy5EaXNwYXRjaGVyID0gRGlzcGF0Y2hlclxubW9kdWxlLmV4cG9ydHMuQ2xpZW50ID0gQ2xpZW50XG5tb2R1bGUuZXhwb3J0cy5Qb29sID0gUG9vbFxubW9kdWxlLmV4cG9ydHMuQmFsYW5jZWRQb29sID0gQmFsYW5jZWRQb29sXG5tb2R1bGUuZXhwb3J0cy5BZ2VudCA9IEFnZW50XG5tb2R1bGUuZXhwb3J0cy5Qcm94eUFnZW50ID0gUHJveHlBZ2VudFxubW9kdWxlLmV4cG9ydHMuUmV0cnlIYW5kbGVyID0gUmV0cnlIYW5kbGVyXG5cbm1vZHVsZS5leHBvcnRzLkRlY29yYXRvckhhbmRsZXIgPSBEZWNvcmF0b3JIYW5kbGVyXG5tb2R1bGUuZXhwb3J0cy5SZWRpcmVjdEhhbmRsZXIgPSBSZWRpcmVjdEhhbmRsZXJcbm1vZHVsZS5leHBvcnRzLmNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yXG5cbm1vZHVsZS5leHBvcnRzLmJ1aWxkQ29ubmVjdG9yID0gYnVpbGRDb25uZWN0b3Jcbm1vZHVsZS5leHBvcnRzLmVycm9ycyA9IGVycm9yc1xuXG5mdW5jdGlvbiBtYWtlRGlzcGF0Y2hlciAoZm4pIHtcbiAgcmV0dXJuICh1cmwsIG9wdHMsIGhhbmRsZXIpID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGhhbmRsZXIgPSBvcHRzXG4gICAgICBvcHRzID0gbnVsbFxuICAgIH1cblxuICAgIGlmICghdXJsIHx8ICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdXJsICE9PSAnb2JqZWN0JyAmJiAhKHVybCBpbnN0YW5jZW9mIFVSTCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgdXJsJylcbiAgICB9XG5cbiAgICBpZiAob3B0cyAhPSBudWxsICYmIHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmIChvcHRzICYmIG9wdHMucGF0aCAhPSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMucGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMucGF0aCcpXG4gICAgICB9XG5cbiAgICAgIGxldCBwYXRoID0gb3B0cy5wYXRoXG4gICAgICBpZiAoIW9wdHMucGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcGF0aCA9IGAvJHtwYXRofWBcbiAgICAgIH1cblxuICAgICAgdXJsID0gbmV3IFVSTCh1dGlsLnBhcnNlT3JpZ2luKHVybCkub3JpZ2luICsgcGF0aClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIG9wdHMgPSB0eXBlb2YgdXJsID09PSAnb2JqZWN0JyA/IHVybCA6IHt9XG4gICAgICB9XG5cbiAgICAgIHVybCA9IHV0aWwucGFyc2VVUkwodXJsKVxuICAgIH1cblxuICAgIGNvbnN0IHsgYWdlbnQsIGRpc3BhdGNoZXIgPSBnZXRHbG9iYWxEaXNwYXRjaGVyKCkgfSA9IG9wdHNcblxuICAgIGlmIChhZ2VudCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCBvcHRzLmFnZW50LiBEaWQgeW91IG1lYW4gb3B0cy5jbGllbnQ/JylcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uY2FsbChkaXNwYXRjaGVyLCB7XG4gICAgICAuLi5vcHRzLFxuICAgICAgb3JpZ2luOiB1cmwub3JpZ2luLFxuICAgICAgcGF0aDogdXJsLnNlYXJjaCA/IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9YCA6IHVybC5wYXRobmFtZSxcbiAgICAgIG1ldGhvZDogb3B0cy5tZXRob2QgfHwgKG9wdHMuYm9keSA/ICdQVVQnIDogJ0dFVCcpXG4gICAgfSwgaGFuZGxlcilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5zZXRHbG9iYWxEaXNwYXRjaGVyID0gc2V0R2xvYmFsRGlzcGF0Y2hlclxubW9kdWxlLmV4cG9ydHMuZ2V0R2xvYmFsRGlzcGF0Y2hlciA9IGdldEdsb2JhbERpc3BhdGNoZXJcblxuaWYgKHV0aWwubm9kZU1ham9yID4gMTYgfHwgKHV0aWwubm9kZU1ham9yID09PSAxNiAmJiB1dGlsLm5vZGVNaW5vciA+PSA4KSkge1xuICBsZXQgZmV0Y2hJbXBsID0gbnVsbFxuICBtb2R1bGUuZXhwb3J0cy5mZXRjaCA9IGFzeW5jIGZ1bmN0aW9uIGZldGNoIChyZXNvdXJjZSkge1xuICAgIGlmICghZmV0Y2hJbXBsKSB7XG4gICAgICBmZXRjaEltcGwgPSByZXF1aXJlKCcuL2xpYi9mZXRjaCcpLmZldGNoXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmZXRjaEltcGwoLi4uYXJndW1lbnRzKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgdGhpcylcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG4gIG1vZHVsZS5leHBvcnRzLkhlYWRlcnMgPSByZXF1aXJlKCcuL2xpYi9mZXRjaC9oZWFkZXJzJykuSGVhZGVyc1xuICBtb2R1bGUuZXhwb3J0cy5SZXNwb25zZSA9IHJlcXVpcmUoJy4vbGliL2ZldGNoL3Jlc3BvbnNlJykuUmVzcG9uc2VcbiAgbW9kdWxlLmV4cG9ydHMuUmVxdWVzdCA9IHJlcXVpcmUoJy4vbGliL2ZldGNoL3JlcXVlc3QnKS5SZXF1ZXN0XG4gIG1vZHVsZS5leHBvcnRzLkZvcm1EYXRhID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZm9ybWRhdGEnKS5Gb3JtRGF0YVxuICBtb2R1bGUuZXhwb3J0cy5GaWxlID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZmlsZScpLkZpbGVcbiAgbW9kdWxlLmV4cG9ydHMuRmlsZVJlYWRlciA9IHJlcXVpcmUoJy4vbGliL2ZpbGVhcGkvZmlsZXJlYWRlcicpLkZpbGVSZWFkZXJcblxuICBjb25zdCB7IHNldEdsb2JhbE9yaWdpbiwgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2xpYi9mZXRjaC9nbG9iYWwnKVxuXG4gIG1vZHVsZS5leHBvcnRzLnNldEdsb2JhbE9yaWdpbiA9IHNldEdsb2JhbE9yaWdpblxuICBtb2R1bGUuZXhwb3J0cy5nZXRHbG9iYWxPcmlnaW4gPSBnZXRHbG9iYWxPcmlnaW5cblxuICBjb25zdCB7IENhY2hlU3RvcmFnZSB9ID0gcmVxdWlyZSgnLi9saWIvY2FjaGUvY2FjaGVzdG9yYWdlJylcbiAgY29uc3QgeyBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuL2xpYi9jYWNoZS9zeW1ib2xzJylcblxuICAvLyBDYWNoZSAmIENhY2hlU3RvcmFnZSBhcmUgdGlnaHRseSBjb3VwbGVkIHdpdGggZmV0Y2guIEV2ZW4gaWYgaXQgbWF5IHJ1blxuICAvLyBpbiBhbiBvbGRlciB2ZXJzaW9uIG9mIE5vZGUsIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgdXNlIHdpdGhvdXQgZmV0Y2guXG4gIG1vZHVsZS5leHBvcnRzLmNhY2hlcyA9IG5ldyBDYWNoZVN0b3JhZ2Uoa0NvbnN0cnVjdClcbn1cblxuaWYgKHV0aWwubm9kZU1ham9yID49IDE2KSB7XG4gIGNvbnN0IHsgZGVsZXRlQ29va2llLCBnZXRDb29raWVzLCBnZXRTZXRDb29raWVzLCBzZXRDb29raWUgfSA9IHJlcXVpcmUoJy4vbGliL2Nvb2tpZXMnKVxuXG4gIG1vZHVsZS5leHBvcnRzLmRlbGV0ZUNvb2tpZSA9IGRlbGV0ZUNvb2tpZVxuICBtb2R1bGUuZXhwb3J0cy5nZXRDb29raWVzID0gZ2V0Q29va2llc1xuICBtb2R1bGUuZXhwb3J0cy5nZXRTZXRDb29raWVzID0gZ2V0U2V0Q29va2llc1xuICBtb2R1bGUuZXhwb3J0cy5zZXRDb29raWUgPSBzZXRDb29raWVcblxuICBjb25zdCB7IHBhcnNlTUlNRVR5cGUsIHNlcmlhbGl6ZUFNaW1lVHlwZSB9ID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZGF0YVVSTCcpXG5cbiAgbW9kdWxlLmV4cG9ydHMucGFyc2VNSU1FVHlwZSA9IHBhcnNlTUlNRVR5cGVcbiAgbW9kdWxlLmV4cG9ydHMuc2VyaWFsaXplQU1pbWVUeXBlID0gc2VyaWFsaXplQU1pbWVUeXBlXG59XG5cbmlmICh1dGlsLm5vZGVNYWpvciA+PSAxOCAmJiBoYXNDcnlwdG8pIHtcbiAgY29uc3QgeyBXZWJTb2NrZXQgfSA9IHJlcXVpcmUoJy4vbGliL3dlYnNvY2tldC93ZWJzb2NrZXQnKVxuXG4gIG1vZHVsZS5leHBvcnRzLldlYlNvY2tldCA9IFdlYlNvY2tldFxufVxuXG5tb2R1bGUuZXhwb3J0cy5yZXF1ZXN0ID0gbWFrZURpc3BhdGNoZXIoYXBpLnJlcXVlc3QpXG5tb2R1bGUuZXhwb3J0cy5zdHJlYW0gPSBtYWtlRGlzcGF0Y2hlcihhcGkuc3RyZWFtKVxubW9kdWxlLmV4cG9ydHMucGlwZWxpbmUgPSBtYWtlRGlzcGF0Y2hlcihhcGkucGlwZWxpbmUpXG5tb2R1bGUuZXhwb3J0cy5jb25uZWN0ID0gbWFrZURpc3BhdGNoZXIoYXBpLmNvbm5lY3QpXG5tb2R1bGUuZXhwb3J0cy51cGdyYWRlID0gbWFrZURpc3BhdGNoZXIoYXBpLnVwZ3JhZGUpXG5cbm1vZHVsZS5leHBvcnRzLk1vY2tDbGllbnQgPSBNb2NrQ2xpZW50XG5tb2R1bGUuZXhwb3J0cy5Nb2NrUG9vbCA9IE1vY2tQb29sXG5tb2R1bGUuZXhwb3J0cy5Nb2NrQWdlbnQgPSBNb2NrQWdlbnRcbm1vZHVsZS5leHBvcnRzLm1vY2tFcnJvcnMgPSBtb2NrRXJyb3JzXG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cENsaWVudCA9IGV4cG9ydHMuaXNIdHRwcyA9IGV4cG9ydHMuSHR0cENsaWVudFJlc3BvbnNlID0gZXhwb3J0cy5IdHRwQ2xpZW50RXJyb3IgPSBleHBvcnRzLmdldFByb3h5VXJsID0gZXhwb3J0cy5NZWRpYVR5cGVzID0gZXhwb3J0cy5IZWFkZXJzID0gZXhwb3J0cy5IdHRwQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBodHRwID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwXCIpKTtcbmNvbnN0IGh0dHBzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwc1wiKSk7XG5jb25zdCBwbSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wcm94eVwiKSk7XG5jb25zdCB0dW5uZWwgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInR1bm5lbFwiKSk7XG5jb25zdCB1bmRpY2lfMSA9IHJlcXVpcmUoXCJ1bmRpY2lcIik7XG52YXIgSHR0cENvZGVzO1xuKGZ1bmN0aW9uIChIdHRwQ29kZXMpIHtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiT0tcIl0gPSAyMDBdID0gXCJPS1wiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJNdWx0aXBsZUNob2ljZXNcIl0gPSAzMDBdID0gXCJNdWx0aXBsZUNob2ljZXNcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiTW92ZWRQZXJtYW5lbnRseVwiXSA9IDMwMV0gPSBcIk1vdmVkUGVybWFuZW50bHlcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUmVzb3VyY2VNb3ZlZFwiXSA9IDMwMl0gPSBcIlJlc291cmNlTW92ZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiU2VlT3RoZXJcIl0gPSAzMDNdID0gXCJTZWVPdGhlclwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RNb2RpZmllZFwiXSA9IDMwNF0gPSBcIk5vdE1vZGlmaWVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlVzZVByb3h5XCJdID0gMzA1XSA9IFwiVXNlUHJveHlcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiU3dpdGNoUHJveHlcIl0gPSAzMDZdID0gXCJTd2l0Y2hQcm94eVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJUZW1wb3JhcnlSZWRpcmVjdFwiXSA9IDMwN10gPSBcIlRlbXBvcmFyeVJlZGlyZWN0XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlBlcm1hbmVudFJlZGlyZWN0XCJdID0gMzA4XSA9IFwiUGVybWFuZW50UmVkaXJlY3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiQmFkUmVxdWVzdFwiXSA9IDQwMF0gPSBcIkJhZFJlcXVlc3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiVW5hdXRob3JpemVkXCJdID0gNDAxXSA9IFwiVW5hdXRob3JpemVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlBheW1lbnRSZXF1aXJlZFwiXSA9IDQwMl0gPSBcIlBheW1lbnRSZXF1aXJlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJGb3JiaWRkZW5cIl0gPSA0MDNdID0gXCJGb3JiaWRkZW5cIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiTm90Rm91bmRcIl0gPSA0MDRdID0gXCJOb3RGb3VuZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJNZXRob2ROb3RBbGxvd2VkXCJdID0gNDA1XSA9IFwiTWV0aG9kTm90QWxsb3dlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RBY2NlcHRhYmxlXCJdID0gNDA2XSA9IFwiTm90QWNjZXB0YWJsZVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWRcIl0gPSA0MDddID0gXCJQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUmVxdWVzdFRpbWVvdXRcIl0gPSA0MDhdID0gXCJSZXF1ZXN0VGltZW91dFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJDb25mbGljdFwiXSA9IDQwOV0gPSBcIkNvbmZsaWN0XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkdvbmVcIl0gPSA0MTBdID0gXCJHb25lXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlRvb01hbnlSZXF1ZXN0c1wiXSA9IDQyOV0gPSBcIlRvb01hbnlSZXF1ZXN0c1wiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJJbnRlcm5hbFNlcnZlckVycm9yXCJdID0gNTAwXSA9IFwiSW50ZXJuYWxTZXJ2ZXJFcnJvclwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RJbXBsZW1lbnRlZFwiXSA9IDUwMV0gPSBcIk5vdEltcGxlbWVudGVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkJhZEdhdGV3YXlcIl0gPSA1MDJdID0gXCJCYWRHYXRld2F5XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlNlcnZpY2VVbmF2YWlsYWJsZVwiXSA9IDUwM10gPSBcIlNlcnZpY2VVbmF2YWlsYWJsZVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJHYXRld2F5VGltZW91dFwiXSA9IDUwNF0gPSBcIkdhdGV3YXlUaW1lb3V0XCI7XG59KShIdHRwQ29kZXMgfHwgKGV4cG9ydHMuSHR0cENvZGVzID0gSHR0cENvZGVzID0ge30pKTtcbnZhciBIZWFkZXJzO1xuKGZ1bmN0aW9uIChIZWFkZXJzKSB7XG4gICAgSGVhZGVyc1tcIkFjY2VwdFwiXSA9IFwiYWNjZXB0XCI7XG4gICAgSGVhZGVyc1tcIkNvbnRlbnRUeXBlXCJdID0gXCJjb250ZW50LXR5cGVcIjtcbn0pKEhlYWRlcnMgfHwgKGV4cG9ydHMuSGVhZGVycyA9IEhlYWRlcnMgPSB7fSkpO1xudmFyIE1lZGlhVHlwZXM7XG4oZnVuY3Rpb24gKE1lZGlhVHlwZXMpIHtcbiAgICBNZWRpYVR5cGVzW1wiQXBwbGljYXRpb25Kc29uXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG59KShNZWRpYVR5cGVzIHx8IChleHBvcnRzLk1lZGlhVHlwZXMgPSBNZWRpYVR5cGVzID0ge30pKTtcbi8qKlxuICogUmV0dXJucyB0aGUgcHJveHkgVVJMLCBkZXBlbmRpbmcgdXBvbiB0aGUgc3VwcGxpZWQgdXJsIGFuZCBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiBAcGFyYW0gc2VydmVyVXJsICBUaGUgc2VydmVyIFVSTCB3aGVyZSB0aGUgcmVxdWVzdCB3aWxsIGJlIHNlbnQuIEZvciBleGFtcGxlLCBodHRwczovL2FwaS5naXRodWIuY29tXG4gKi9cbmZ1bmN0aW9uIGdldFByb3h5VXJsKHNlcnZlclVybCkge1xuICAgIGNvbnN0IHByb3h5VXJsID0gcG0uZ2V0UHJveHlVcmwobmV3IFVSTChzZXJ2ZXJVcmwpKTtcbiAgICByZXR1cm4gcHJveHlVcmwgPyBwcm94eVVybC5ocmVmIDogJyc7XG59XG5leHBvcnRzLmdldFByb3h5VXJsID0gZ2V0UHJveHlVcmw7XG5jb25zdCBIdHRwUmVkaXJlY3RDb2RlcyA9IFtcbiAgICBIdHRwQ29kZXMuTW92ZWRQZXJtYW5lbnRseSxcbiAgICBIdHRwQ29kZXMuUmVzb3VyY2VNb3ZlZCxcbiAgICBIdHRwQ29kZXMuU2VlT3RoZXIsXG4gICAgSHR0cENvZGVzLlRlbXBvcmFyeVJlZGlyZWN0LFxuICAgIEh0dHBDb2Rlcy5QZXJtYW5lbnRSZWRpcmVjdFxuXTtcbmNvbnN0IEh0dHBSZXNwb25zZVJldHJ5Q29kZXMgPSBbXG4gICAgSHR0cENvZGVzLkJhZEdhdGV3YXksXG4gICAgSHR0cENvZGVzLlNlcnZpY2VVbmF2YWlsYWJsZSxcbiAgICBIdHRwQ29kZXMuR2F0ZXdheVRpbWVvdXRcbl07XG5jb25zdCBSZXRyeWFibGVIdHRwVmVyYnMgPSBbJ09QVElPTlMnLCAnR0VUJywgJ0RFTEVURScsICdIRUFEJ107XG5jb25zdCBFeHBvbmVudGlhbEJhY2tvZmZDZWlsaW5nID0gMTA7XG5jb25zdCBFeHBvbmVudGlhbEJhY2tvZmZUaW1lU2xpY2UgPSA1O1xuY2xhc3MgSHR0cENsaWVudEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1c0NvZGUpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdIdHRwQ2xpZW50RXJyb3InO1xuICAgICAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSHR0cENsaWVudEVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwQ2xpZW50RXJyb3IgPSBIdHRwQ2xpZW50RXJyb3I7XG5jbGFzcyBIdHRwQ2xpZW50UmVzcG9uc2Uge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgcmVhZEJvZHkoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgb3V0cHV0ID0gQnVmZmVyLmFsbG9jKDApO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBCdWZmZXIuY29uY2F0KFtvdXRwdXQsIGNodW5rXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3V0cHV0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZEJvZHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY2h1bmtzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuSHR0cENsaWVudFJlc3BvbnNlID0gSHR0cENsaWVudFJlc3BvbnNlO1xuZnVuY3Rpb24gaXNIdHRwcyhyZXF1ZXN0VXJsKSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChyZXF1ZXN0VXJsKTtcbiAgICByZXR1cm4gcGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6Jztcbn1cbmV4cG9ydHMuaXNIdHRwcyA9IGlzSHR0cHM7XG5jbGFzcyBIdHRwQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1c2VyQWdlbnQsIGhhbmRsZXJzLCByZXF1ZXN0T3B0aW9ucykge1xuICAgICAgICB0aGlzLl9pZ25vcmVTc2xFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0cyA9IHRydWU7XG4gICAgICAgIHRoaXMuX2FsbG93UmVkaXJlY3REb3duZ3JhZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbWF4UmVkaXJlY3RzID0gNTA7XG4gICAgICAgIHRoaXMuX2FsbG93UmV0cmllcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9tYXhSZXRyaWVzID0gMTtcbiAgICAgICAgdGhpcy5fa2VlcEFsaXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXNlckFnZW50ID0gdXNlckFnZW50O1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gaGFuZGxlcnMgfHwgW107XG4gICAgICAgIHRoaXMucmVxdWVzdE9wdGlvbnMgPSByZXF1ZXN0T3B0aW9ucztcbiAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMuaWdub3JlU3NsRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lnbm9yZVNzbEVycm9yID0gcmVxdWVzdE9wdGlvbnMuaWdub3JlU3NsRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zb2NrZXRUaW1lb3V0ID0gcmVxdWVzdE9wdGlvbnMuc29ja2V0VGltZW91dDtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWxsb3dSZWRpcmVjdHMgPSByZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0RG93bmdyYWRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0RG93bmdyYWRlID0gcmVxdWVzdE9wdGlvbnMuYWxsb3dSZWRpcmVjdERvd25ncmFkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5tYXhSZWRpcmVjdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21heFJlZGlyZWN0cyA9IE1hdGgubWF4KHJlcXVlc3RPcHRpb25zLm1heFJlZGlyZWN0cywgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMua2VlcEFsaXZlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9rZWVwQWxpdmUgPSByZXF1ZXN0T3B0aW9ucy5rZWVwQWxpdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMuYWxsb3dSZXRyaWVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JldHJpZXMgPSByZXF1ZXN0T3B0aW9ucy5hbGxvd1JldHJpZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMubWF4UmV0cmllcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4UmV0cmllcyA9IHJlcXVlc3RPcHRpb25zLm1heFJldHJpZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3B0aW9ucyhyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnT1BUSU9OUycsIHJlcXVlc3RVcmwsIG51bGwsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldChyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgcmVxdWVzdFVybCwgbnVsbCwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVsKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCByZXF1ZXN0VXJsLCBudWxsLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwb3N0KHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQT1NUJywgcmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGF0Y2gocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BBVENIJywgcmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHV0KHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQVVQnLCByZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoZWFkKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdIRUFEJywgcmVxdWVzdFVybCwgbnVsbCwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2VuZFN0cmVhbSh2ZXJiLCByZXF1ZXN0VXJsLCBzdHJlYW0sIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHZlcmIsIHJlcXVlc3RVcmwsIHN0cmVhbSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHR5cGVkIG9iamVjdCBmcm9tIGFuIGVuZHBvaW50XG4gICAgICogQmUgYXdhcmUgdGhhdCBub3QgZm91bmQgcmV0dXJucyBhIG51bGwuICBPdGhlciBlcnJvcnMgKDR4eCwgNXh4KSByZWplY3QgdGhlIHByb21pc2VcbiAgICAgKi9cbiAgICBnZXRKc29uKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5nZXQocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zdEpzb24ocmVxdWVzdFVybCwgb2JqLCBhZGRpdGlvbmFsSGVhZGVycyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5Db250ZW50VHlwZV0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5Db250ZW50VHlwZSwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5wb3N0KHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzUmVzcG9uc2UocmVzLCB0aGlzLnJlcXVlc3RPcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1dEpzb24ocmVxdWVzdFVybCwgb2JqLCBhZGRpdGlvbmFsSGVhZGVycyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5Db250ZW50VHlwZV0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5Db250ZW50VHlwZSwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5wdXQocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGF0Y2hKc29uKHJlcXVlc3RVcmwsIG9iaiwgYWRkaXRpb25hbEhlYWRlcnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkFjY2VwdF0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5BY2NlcHQsIE1lZGlhVHlwZXMuQXBwbGljYXRpb25Kc29uKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQ29udGVudFR5cGVdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQ29udGVudFR5cGUsIE1lZGlhVHlwZXMuQXBwbGljYXRpb25Kc29uKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIHRoaXMucGF0Y2gocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgYSByYXcgaHR0cCByZXF1ZXN0LlxuICAgICAqIEFsbCBvdGhlciBtZXRob2RzIHN1Y2ggYXMgZ2V0LCBwb3N0LCBwYXRjaCwgYW5kIHJlcXVlc3QgdWx0aW1hdGVseSBjYWxsIHRoaXMuXG4gICAgICogUHJlZmVyIGdldCwgZGVsLCBwb3N0IGFuZCBwYXRjaFxuICAgICAqL1xuICAgIHJlcXVlc3QodmVyYiwgcmVxdWVzdFVybCwgZGF0YSwgaGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDbGllbnQgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwocmVxdWVzdFVybCk7XG4gICAgICAgICAgICBsZXQgaW5mbyA9IHRoaXMuX3ByZXBhcmVSZXF1ZXN0KHZlcmIsIHBhcnNlZFVybCwgaGVhZGVycyk7XG4gICAgICAgICAgICAvLyBPbmx5IHBlcmZvcm0gcmV0cmllcyBvbiByZWFkcyBzaW5jZSB3cml0ZXMgbWF5IG5vdCBiZSBpZGVtcG90ZW50LlxuICAgICAgICAgICAgY29uc3QgbWF4VHJpZXMgPSB0aGlzLl9hbGxvd1JldHJpZXMgJiYgUmV0cnlhYmxlSHR0cFZlcmJzLmluY2x1ZGVzKHZlcmIpXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tYXhSZXRyaWVzICsgMVxuICAgICAgICAgICAgICAgIDogMTtcbiAgICAgICAgICAgIGxldCBudW1UcmllcyA9IDA7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCB0aGlzLnJlcXVlc3RSYXcoaW5mbywgZGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2VcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSAmJlxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGUgPT09IEh0dHBDb2Rlcy5VbmF1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhlbnRpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLmNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1dGhlbnRpY2F0aW9uSGFuZGxlci5oYW5kbGVBdXRoZW50aWNhdGlvbih0aGlzLCBpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgcmVjZWl2ZWQgYW4gdW5hdXRob3JpemVkIHJlc3BvbnNlIGJ1dCBoYXZlIG5vIGhhbmRsZXJzIHRvIGhhbmRsZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCB0aGUgcmVzcG9uc2UgcmV0dXJuIHRvIHRoZSBjYWxsZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlZGlyZWN0c1JlbWFpbmluZyA9IHRoaXMuX21heFJlZGlyZWN0cztcbiAgICAgICAgICAgICAgICB3aGlsZSAocmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlICYmXG4gICAgICAgICAgICAgICAgICAgIEh0dHBSZWRpcmVjdENvZGVzLmluY2x1ZGVzKHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWxsb3dSZWRpcmVjdHMgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RzUmVtYWluaW5nID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWRpcmVjdFVybCA9IHJlc3BvbnNlLm1lc3NhZ2UuaGVhZGVyc1snbG9jYXRpb24nXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdFVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBubyBsb2NhdGlvbiB0byByZWRpcmVjdCB0bywgd2Ugd29uJ3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFJlZGlyZWN0VXJsID0gbmV3IFVSTChyZWRpcmVjdFVybCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRVcmwucHJvdG9jb2wgIT09IHBhcnNlZFJlZGlyZWN0VXJsLnByb3RvY29sICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5fYWxsb3dSZWRpcmVjdERvd25ncmFkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWRpcmVjdCBmcm9tIEhUVFBTIHRvIEhUVFAgcHJvdG9jb2wuIFRoaXMgZG93bmdyYWRlIGlzIG5vdCBhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLiBJZiB5b3Ugd2FudCB0byBhbGxvdyB0aGlzIGJlaGF2aW9yLCBzZXQgdGhlIGFsbG93UmVkaXJlY3REb3duZ3JhZGUgb3B0aW9uIHRvIHRydWUuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBmaW5pc2ggcmVhZGluZyB0aGUgcmVzcG9uc2UgYmVmb3JlIHJlYXNzaWduaW5nIHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdpbGwgbGVhayB0aGUgb3BlbiBzb2NrZXQuXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlc3BvbnNlLnJlYWRCb2R5KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cmlwIGF1dGhvcml6YXRpb24gaGVhZGVyIGlmIHJlZGlyZWN0ZWQgdG8gYSBkaWZmZXJlbnQgaG9zdG5hbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFJlZGlyZWN0VXJsLmhvc3RuYW1lICE9PSBwYXJzZWRVcmwuaG9zdG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXIgbmFtZXMgYXJlIGNhc2UgaW5zZW5zaXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLnRvTG93ZXJDYXNlKCkgPT09ICdhdXRob3JpemF0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaGVhZGVyc1toZWFkZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBsZXQncyBtYWtlIHRoZSByZXF1ZXN0IHdpdGggdGhlIG5ldyByZWRpcmVjdFVybFxuICAgICAgICAgICAgICAgICAgICBpbmZvID0gdGhpcy5fcHJlcGFyZVJlcXVlc3QodmVyYiwgcGFyc2VkUmVkaXJlY3RVcmwsIGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHRoaXMucmVxdWVzdFJhdyhpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RzUmVtYWluaW5nLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgICFIdHRwUmVzcG9uc2VSZXRyeUNvZGVzLmluY2x1ZGVzKHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90IGEgcmV0cnkgY29kZSwgcmV0dXJuIGltbWVkaWF0ZWx5IGluc3RlYWQgb2YgcmV0cnlpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBudW1UcmllcyArPSAxO1xuICAgICAgICAgICAgICAgIGlmIChudW1UcmllcyA8IG1heFRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlc3BvbnNlLnJlYWRCb2R5KCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuX3BlcmZvcm1FeHBvbmVudGlhbEJhY2tvZmYobnVtVHJpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKG51bVRyaWVzIDwgbWF4VHJpZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTmVlZHMgdG8gYmUgY2FsbGVkIGlmIGtlZXBBbGl2ZSBpcyBzZXQgdG8gdHJ1ZSBpbiByZXF1ZXN0IG9wdGlvbnMuXG4gICAgICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FnZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9hZ2VudC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSYXcgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gaW5mb1xuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdFJhdyhpbmZvLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrRm9yUmVzdWx0KGVyciwgcmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGBlcnJgIGlzIG5vdCBwYXNzZWQsIHRoZW4gYHJlc2AgbXVzdCBiZSBwYXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdVbmtub3duIGVycm9yJykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFJhd1dpdGhDYWxsYmFjayhpbmZvLCBkYXRhLCBjYWxsYmFja0ZvclJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJhdyByZXF1ZXN0IHdpdGggY2FsbGJhY2suXG4gICAgICogQHBhcmFtIGluZm9cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqIEBwYXJhbSBvblJlc3VsdFxuICAgICAqL1xuICAgIHJlcXVlc3RSYXdXaXRoQ2FsbGJhY2soaW5mbywgZGF0YSwgb25SZXN1bHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCFpbmZvLm9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgICAgIGluZm8ub3B0aW9ucy5oZWFkZXJzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmZvLm9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEsICd1dGY4Jyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhbGxiYWNrQ2FsbGVkID0gZmFsc2U7XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlc3VsdChlcnIsIHJlcykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFja0NhbGxlZCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrQ2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBvblJlc3VsdChlcnIsIHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxID0gaW5mby5odHRwTW9kdWxlLnJlcXVlc3QoaW5mby5vcHRpb25zLCAobXNnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBuZXcgSHR0cENsaWVudFJlc3BvbnNlKG1zZyk7XG4gICAgICAgICAgICBoYW5kbGVSZXN1bHQodW5kZWZpbmVkLCByZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHNvY2tldDtcbiAgICAgICAgcmVxLm9uKCdzb2NrZXQnLCBzb2NrID0+IHtcbiAgICAgICAgICAgIHNvY2tldCA9IHNvY2s7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJZiB3ZSBldmVyIGdldCBkaXNjb25uZWN0ZWQsIHdlIHdhbnQgdGhlIHNvY2tldCB0byB0aW1lb3V0IGV2ZW50dWFsbHlcbiAgICAgICAgcmVxLnNldFRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dCB8fCAzICogNjAwMDAsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzb2NrZXQpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQuZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVSZXN1bHQobmV3IEVycm9yKGBSZXF1ZXN0IHRpbWVvdXQ6ICR7aW5mby5vcHRpb25zLnBhdGh9YCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIC8vIGVyciBoYXMgc3RhdHVzQ29kZSBwcm9wZXJ0eVxuICAgICAgICAgICAgLy8gcmVzIHNob3VsZCBoYXZlIGhlYWRlcnNcbiAgICAgICAgICAgIGhhbmRsZVJlc3VsdChlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXEud3JpdGUoZGF0YSwgJ3V0ZjgnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGRhdGEub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlcS5lbmQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGF0YS5waXBlKHJlcSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXEuZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBodHRwIGFnZW50LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIGFuIGh0dHAgYWdlbnQgdGhhdCBoYW5kbGVzXG4gICAgICogcm91dGluZyB0aHJvdWdoIGEgcHJveHkgc2VydmVyIC0gZGVwZW5kaW5nIHVwb24gdGhlIHVybCBhbmQgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgICAqIEBwYXJhbSBzZXJ2ZXJVcmwgIFRoZSBzZXJ2ZXIgVVJMIHdoZXJlIHRoZSByZXF1ZXN0IHdpbGwgYmUgc2VudC4gRm9yIGV4YW1wbGUsIGh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cbiAgICAgKi9cbiAgICBnZXRBZ2VudChzZXJ2ZXJVcmwpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChzZXJ2ZXJVcmwpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QWdlbnQocGFyc2VkVXJsKTtcbiAgICB9XG4gICAgZ2V0QWdlbnREaXNwYXRjaGVyKHNlcnZlclVybCkge1xuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHNlcnZlclVybCk7XG4gICAgICAgIGNvbnN0IHByb3h5VXJsID0gcG0uZ2V0UHJveHlVcmwocGFyc2VkVXJsKTtcbiAgICAgICAgY29uc3QgdXNlUHJveHkgPSBwcm94eVVybCAmJiBwcm94eVVybC5ob3N0bmFtZTtcbiAgICAgICAgaWYgKCF1c2VQcm94eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQcm94eUFnZW50RGlzcGF0Y2hlcihwYXJzZWRVcmwsIHByb3h5VXJsKTtcbiAgICB9XG4gICAgX3ByZXBhcmVSZXF1ZXN0KG1ldGhvZCwgcmVxdWVzdFVybCwgaGVhZGVycykge1xuICAgICAgICBjb25zdCBpbmZvID0ge307XG4gICAgICAgIGluZm8ucGFyc2VkVXJsID0gcmVxdWVzdFVybDtcbiAgICAgICAgY29uc3QgdXNpbmdTc2wgPSBpbmZvLnBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgICAgIGluZm8uaHR0cE1vZHVsZSA9IHVzaW5nU3NsID8gaHR0cHMgOiBodHRwO1xuICAgICAgICBjb25zdCBkZWZhdWx0UG9ydCA9IHVzaW5nU3NsID8gNDQzIDogODA7XG4gICAgICAgIGluZm8ub3B0aW9ucyA9IHt9O1xuICAgICAgICBpbmZvLm9wdGlvbnMuaG9zdCA9IGluZm8ucGFyc2VkVXJsLmhvc3RuYW1lO1xuICAgICAgICBpbmZvLm9wdGlvbnMucG9ydCA9IGluZm8ucGFyc2VkVXJsLnBvcnRcbiAgICAgICAgICAgID8gcGFyc2VJbnQoaW5mby5wYXJzZWRVcmwucG9ydClcbiAgICAgICAgICAgIDogZGVmYXVsdFBvcnQ7XG4gICAgICAgIGluZm8ub3B0aW9ucy5wYXRoID1cbiAgICAgICAgICAgIChpbmZvLnBhcnNlZFVybC5wYXRobmFtZSB8fCAnJykgKyAoaW5mby5wYXJzZWRVcmwuc2VhcmNoIHx8ICcnKTtcbiAgICAgICAgaW5mby5vcHRpb25zLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgaW5mby5vcHRpb25zLmhlYWRlcnMgPSB0aGlzLl9tZXJnZUhlYWRlcnMoaGVhZGVycyk7XG4gICAgICAgIGlmICh0aGlzLnVzZXJBZ2VudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbmZvLm9wdGlvbnMuaGVhZGVyc1sndXNlci1hZ2VudCddID0gdGhpcy51c2VyQWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5vcHRpb25zLmFnZW50ID0gdGhpcy5fZ2V0QWdlbnQoaW5mby5wYXJzZWRVcmwpO1xuICAgICAgICAvLyBnaXZlcyBoYW5kbGVycyBhbiBvcHBvcnR1bml0eSB0byBwYXJ0aWNpcGF0ZVxuICAgICAgICBpZiAodGhpcy5oYW5kbGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLnByZXBhcmVSZXF1ZXN0KGluZm8ub3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuICAgIF9tZXJnZUhlYWRlcnMoaGVhZGVycykge1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0T3B0aW9ucyAmJiB0aGlzLnJlcXVlc3RPcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBsb3dlcmNhc2VLZXlzKHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycyksIGxvd2VyY2FzZUtleXMoaGVhZGVycyB8fCB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb3dlcmNhc2VLZXlzKGhlYWRlcnMgfHwge30pO1xuICAgIH1cbiAgICBfZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIGhlYWRlciwgX2RlZmF1bHQpIHtcbiAgICAgICAgbGV0IGNsaWVudEhlYWRlcjtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdE9wdGlvbnMgJiYgdGhpcy5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICBjbGllbnRIZWFkZXIgPSBsb3dlcmNhc2VLZXlzKHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycylbaGVhZGVyXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkaXRpb25hbEhlYWRlcnNbaGVhZGVyXSB8fCBjbGllbnRIZWFkZXIgfHwgX2RlZmF1bHQ7XG4gICAgfVxuICAgIF9nZXRBZ2VudChwYXJzZWRVcmwpIHtcbiAgICAgICAgbGV0IGFnZW50O1xuICAgICAgICBjb25zdCBwcm94eVVybCA9IHBtLmdldFByb3h5VXJsKHBhcnNlZFVybCk7XG4gICAgICAgIGNvbnN0IHVzZVByb3h5ID0gcHJveHlVcmwgJiYgcHJveHlVcmwuaG9zdG5hbWU7XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUgJiYgdXNlUHJveHkpIHtcbiAgICAgICAgICAgIGFnZW50ID0gdGhpcy5fcHJveHlBZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXVzZVByb3h5KSB7XG4gICAgICAgICAgICBhZ2VudCA9IHRoaXMuX2FnZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFnZW50IGlzIGFscmVhZHkgYXNzaWduZWQgdXNlIHRoYXQgYWdlbnQuXG4gICAgICAgIGlmIChhZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzaW5nU3NsID0gcGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgbGV0IG1heFNvY2tldHMgPSAxMDA7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICBtYXhTb2NrZXRzID0gdGhpcy5yZXF1ZXN0T3B0aW9ucy5tYXhTb2NrZXRzIHx8IGh0dHAuZ2xvYmFsQWdlbnQubWF4U29ja2V0cztcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIGB1c2VQcm94eWAgYWdhaW4sIGJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGBwcm94eVVSbGAgZGlyZWN0bHkgZm9yIFR5cGVTY3JpcHRzJ3MgZmxvdyBhbmFseXNpcy5cbiAgICAgICAgaWYgKHByb3h5VXJsICYmIHByb3h5VXJsLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBhZ2VudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgbWF4U29ja2V0cyxcbiAgICAgICAgICAgICAgICBrZWVwQWxpdmU6IHRoaXMuX2tlZXBBbGl2ZSxcbiAgICAgICAgICAgICAgICBwcm94eTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoKHByb3h5VXJsLnVzZXJuYW1lIHx8IHByb3h5VXJsLnBhc3N3b3JkKSAmJiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3h5QXV0aDogYCR7cHJveHlVcmwudXNlcm5hbWV9OiR7cHJveHlVcmwucGFzc3dvcmR9YFxuICAgICAgICAgICAgICAgIH0pKSwgeyBob3N0OiBwcm94eVVybC5ob3N0bmFtZSwgcG9ydDogcHJveHlVcmwucG9ydCB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCB0dW5uZWxBZ2VudDtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJIdHRwcyA9IHByb3h5VXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgICAgIGlmICh1c2luZ1NzbCkge1xuICAgICAgICAgICAgICAgIHR1bm5lbEFnZW50ID0gb3Zlckh0dHBzID8gdHVubmVsLmh0dHBzT3Zlckh0dHBzIDogdHVubmVsLmh0dHBzT3Zlckh0dHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0dW5uZWxBZ2VudCA9IG92ZXJIdHRwcyA/IHR1bm5lbC5odHRwT3Zlckh0dHBzIDogdHVubmVsLmh0dHBPdmVySHR0cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFnZW50ID0gdHVubmVsQWdlbnQoYWdlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3h5QWdlbnQgPSBhZ2VudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB0dW5uZWxpbmcgYWdlbnQgaXNuJ3QgYXNzaWduZWQgY3JlYXRlIGEgbmV3IGFnZW50XG4gICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IGtlZXBBbGl2ZTogdGhpcy5fa2VlcEFsaXZlLCBtYXhTb2NrZXRzIH07XG4gICAgICAgICAgICBhZ2VudCA9IHVzaW5nU3NsID8gbmV3IGh0dHBzLkFnZW50KG9wdGlvbnMpIDogbmV3IGh0dHAuQWdlbnQob3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLl9hZ2VudCA9IGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2luZ1NzbCAmJiB0aGlzLl9pZ25vcmVTc2xFcnJvcikge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzZXQgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRD0wIHNpbmNlIHRoYXQgd2lsbCBhZmZlY3QgcmVxdWVzdCBmb3IgZW50aXJlIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGh0dHAuUmVxdWVzdE9wdGlvbnMgZG9lc24ndCBleHBvc2UgYSB3YXkgdG8gbW9kaWZ5IFJlcXVlc3RPcHRpb25zLmFnZW50Lm9wdGlvbnNcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2FzdCBpdCB0byBhbnkgYW5kIGNoYW5nZSBpdCBkaXJlY3RseVxuICAgICAgICAgICAgYWdlbnQub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oYWdlbnQub3B0aW9ucyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gICAgX2dldFByb3h5QWdlbnREaXNwYXRjaGVyKHBhcnNlZFVybCwgcHJveHlVcmwpIHtcbiAgICAgICAgbGV0IHByb3h5QWdlbnQ7XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUpIHtcbiAgICAgICAgICAgIHByb3h5QWdlbnQgPSB0aGlzLl9wcm94eUFnZW50RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhZ2VudCBpcyBhbHJlYWR5IGFzc2lnbmVkIHVzZSB0aGF0IGFnZW50LlxuICAgICAgICBpZiAocHJveHlBZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3h5QWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNpbmdTc2wgPSBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICBwcm94eUFnZW50ID0gbmV3IHVuZGljaV8xLlByb3h5QWdlbnQoT2JqZWN0LmFzc2lnbih7IHVyaTogcHJveHlVcmwuaHJlZiwgcGlwZWxpbmluZzogIXRoaXMuX2tlZXBBbGl2ZSA/IDAgOiAxIH0sICgocHJveHlVcmwudXNlcm5hbWUgfHwgcHJveHlVcmwucGFzc3dvcmQpICYmIHtcbiAgICAgICAgICAgIHRva2VuOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtwcm94eVVybC51c2VybmFtZX06JHtwcm94eVVybC5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyl9YFxuICAgICAgICB9KSkpO1xuICAgICAgICB0aGlzLl9wcm94eUFnZW50RGlzcGF0Y2hlciA9IHByb3h5QWdlbnQ7XG4gICAgICAgIGlmICh1c2luZ1NzbCAmJiB0aGlzLl9pZ25vcmVTc2xFcnJvcikge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzZXQgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRD0wIHNpbmNlIHRoYXQgd2lsbCBhZmZlY3QgcmVxdWVzdCBmb3IgZW50aXJlIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGh0dHAuUmVxdWVzdE9wdGlvbnMgZG9lc24ndCBleHBvc2UgYSB3YXkgdG8gbW9kaWZ5IFJlcXVlc3RPcHRpb25zLmFnZW50Lm9wdGlvbnNcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2FzdCBpdCB0byBhbnkgYW5kIGNoYW5nZSBpdCBkaXJlY3RseVxuICAgICAgICAgICAgcHJveHlBZ2VudC5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihwcm94eUFnZW50Lm9wdGlvbnMucmVxdWVzdFRscyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm94eUFnZW50O1xuICAgIH1cbiAgICBfcGVyZm9ybUV4cG9uZW50aWFsQmFja29mZihyZXRyeU51bWJlcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0cnlOdW1iZXIgPSBNYXRoLm1pbihFeHBvbmVudGlhbEJhY2tvZmZDZWlsaW5nLCByZXRyeU51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBtcyA9IEV4cG9uZW50aWFsQmFja29mZlRpbWVTbGljZSAqIE1hdGgucG93KDIsIHJldHJ5TnVtYmVyKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3Byb2Nlc3NSZXNwb25zZShyZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHJlcy5tZXNzYWdlLnN0YXR1c0NvZGUgfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gbm90IGZvdW5kIGxlYWRzIHRvIG51bGwgb2JqIHJldHVybmVkXG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IEh0dHBDb2Rlcy5Ob3RGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXN1bHQgZnJvbSB0aGUgYm9keVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRhdGVUaW1lRGVzZXJpYWxpemVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGEudmFsdWVPZigpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG9iajtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudHM7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSB5aWVsZCByZXMucmVhZEJvZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRzICYmIGNvbnRlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVzZXJpYWxpemVEYXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoY29udGVudHMsIGRhdGVUaW1lRGVzZXJpYWxpemVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoY29udGVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb2JqO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSByZXMubWVzc2FnZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgcmVzb3VyY2UgKGNvbnRlbnRzIG5vdCBqc29uKTsgIGxlYXZpbmcgcmVzdWx0IG9iaiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCAzeHggcmVkaXJlY3RzIGFyZSBoYW5kbGVkIGJ5IHRoZSBodHRwIGxheWVyLlxuICAgICAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlID4gMjk5KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2c7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGV4Y2VwdGlvbi9lcnJvciBpbiBib2R5LCBhdHRlbXB0IHRvIGdldCBiZXR0ZXIgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiAmJiBvYmoubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gb2JqLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udGVudHMgJiYgY29udGVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgbWF5IGJlIHRoZSBjYXNlIHRoYXQgdGhlIGV4Y2VwdGlvbiBpcyBpbiB0aGUgYm9keSBtZXNzYWdlIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gY29udGVudHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBgRmFpbGVkIHJlcXVlc3Q6ICgke3N0YXR1c0NvZGV9KWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEh0dHBDbGllbnRFcnJvcihtc2csIHN0YXR1c0NvZGUpO1xuICAgICAgICAgICAgICAgICAgICBlcnIucmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwQ2xpZW50ID0gSHR0cENsaWVudDtcbmNvbnN0IGxvd2VyY2FzZUtleXMgPSAob2JqKSA9PiBPYmplY3Qua2V5cyhvYmopLnJlZHVjZSgoYywgaykgPT4gKChjW2sudG9Mb3dlckNhc2UoKV0gPSBvYmpba10pLCBjKSwge30pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QZXJzb25hbEFjY2Vzc1Rva2VuQ3JlZGVudGlhbEhhbmRsZXIgPSBleHBvcnRzLkJlYXJlckNyZWRlbnRpYWxIYW5kbGVyID0gZXhwb3J0cy5CYXNpY0NyZWRlbnRpYWxIYW5kbGVyID0gdm9pZCAwO1xuY2xhc3MgQmFzaWNDcmVkZW50aWFsSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IodXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICAgIH1cbiAgICBwcmVwYXJlUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIG5vIGhlYWRlcnMnKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke3RoaXMudXNlcm5hbWV9OiR7dGhpcy5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICB9XG4gICAgLy8gVGhpcyBoYW5kbGVyIGNhbm5vdCBoYW5kbGUgNDAxXG4gICAgY2FuSGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkJhc2ljQ3JlZGVudGlhbEhhbmRsZXIgPSBCYXNpY0NyZWRlbnRpYWxIYW5kbGVyO1xuY2xhc3MgQmVhcmVyQ3JlZGVudGlhbEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKHRva2VuKSB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICB9XG4gICAgLy8gY3VycmVudGx5IGltcGxlbWVudHMgcHJlLWF1dGhvcml6YXRpb25cbiAgICAvLyBUT0RPOiBzdXBwb3J0IHByZUF1dGggPSBmYWxzZSB3aGVyZSBpdCBob29rcyBvbiA0MDFcbiAgICBwcmVwYXJlUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIG5vIGhlYWRlcnMnKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0aGlzLnRva2VufWA7XG4gICAgfVxuICAgIC8vIFRoaXMgaGFuZGxlciBjYW5ub3QgaGFuZGxlIDQwMVxuICAgIGNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5CZWFyZXJDcmVkZW50aWFsSGFuZGxlciA9IEJlYXJlckNyZWRlbnRpYWxIYW5kbGVyO1xuY2xhc3MgUGVyc29uYWxBY2Nlc3NUb2tlbkNyZWRlbnRpYWxIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b2tlbikge1xuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgfVxuICAgIC8vIGN1cnJlbnRseSBpbXBsZW1lbnRzIHByZS1hdXRob3JpemF0aW9uXG4gICAgLy8gVE9ETzogc3VwcG9ydCBwcmVBdXRoID0gZmFsc2Ugd2hlcmUgaXQgaG9va3Mgb24gNDAxXG4gICAgcHJlcGFyZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBubyBoZWFkZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShgUEFUOiR7dGhpcy50b2tlbn1gKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICB9XG4gICAgLy8gVGhpcyBoYW5kbGVyIGNhbm5vdCBoYW5kbGUgNDAxXG4gICAgY2FuSGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlBlcnNvbmFsQWNjZXNzVG9rZW5DcmVkZW50aWFsSGFuZGxlciA9IFBlcnNvbmFsQWNjZXNzVG9rZW5DcmVkZW50aWFsSGFuZGxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF1dGguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5PaWRjQ2xpZW50ID0gdm9pZCAwO1xuY29uc3QgaHR0cF9jbGllbnRfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudFwiKTtcbmNvbnN0IGF1dGhfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudC9saWIvYXV0aFwiKTtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCIuL2NvcmVcIik7XG5jbGFzcyBPaWRjQ2xpZW50IHtcbiAgICBzdGF0aWMgY3JlYXRlSHR0cENsaWVudChhbGxvd1JldHJ5ID0gdHJ1ZSwgbWF4UmV0cnkgPSAxMCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGFsbG93UmV0cmllczogYWxsb3dSZXRyeSxcbiAgICAgICAgICAgIG1heFJldHJpZXM6IG1heFJldHJ5XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgaHR0cF9jbGllbnRfMS5IdHRwQ2xpZW50KCdhY3Rpb25zL29pZGMtY2xpZW50JywgW25ldyBhdXRoXzEuQmVhcmVyQ3JlZGVudGlhbEhhbmRsZXIoT2lkY0NsaWVudC5nZXRSZXF1ZXN0VG9rZW4oKSldLCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSZXF1ZXN0VG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnZbJ0FDVElPTlNfSURfVE9LRU5fUkVRVUVTVF9UT0tFTiddO1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZXQgQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1RPS0VOIGVudiB2YXJpYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgc3RhdGljIGdldElEVG9rZW5VcmwoKSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWVVcmwgPSBwcm9jZXNzLmVudlsnQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1VSTCddO1xuICAgICAgICBpZiAoIXJ1bnRpbWVVcmwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCBBQ1RJT05TX0lEX1RPS0VOX1JFUVVFU1RfVVJMIGVudiB2YXJpYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydW50aW1lVXJsO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q2FsbChpZF90b2tlbl91cmwpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgaHR0cGNsaWVudCA9IE9pZGNDbGllbnQuY3JlYXRlSHR0cENsaWVudCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgaHR0cGNsaWVudFxuICAgICAgICAgICAgICAgIC5nZXRKc29uKGlkX3Rva2VuX3VybClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBJRCBUb2tlbi4gXFxuIFxuICAgICAgICBFcnJvciBDb2RlIDogJHtlcnJvci5zdGF0dXNDb2RlfVxcbiBcbiAgICAgICAgRXJyb3IgTWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpZF90b2tlbiA9IChfYSA9IHJlcy5yZXN1bHQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZTtcbiAgICAgICAgICAgIGlmICghaWRfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3BvbnNlIGpzb24gYm9keSBkbyBub3QgaGF2ZSBJRCBUb2tlbiBmaWVsZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlkX3Rva2VuO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGdldElEVG9rZW4oYXVkaWVuY2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IElEIFRva2VuIGlzIHJlcXVlc3RlZCBmcm9tIGFjdGlvbiBzZXJ2aWNlXG4gICAgICAgICAgICAgICAgbGV0IGlkX3Rva2VuX3VybCA9IE9pZGNDbGllbnQuZ2V0SURUb2tlblVybCgpO1xuICAgICAgICAgICAgICAgIGlmIChhdWRpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVkQXVkaWVuY2UgPSBlbmNvZGVVUklDb21wb25lbnQoYXVkaWVuY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZF90b2tlbl91cmwgPSBgJHtpZF90b2tlbl91cmx9JmF1ZGllbmNlPSR7ZW5jb2RlZEF1ZGllbmNlfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICgwLCBjb3JlXzEuZGVidWcpKGBJRCB0b2tlbiB1cmwgaXMgJHtpZF90b2tlbl91cmx9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRfdG9rZW4gPSB5aWVsZCBPaWRjQ2xpZW50LmdldENhbGwoaWRfdG9rZW5fdXJsKTtcbiAgICAgICAgICAgICAgICAoMCwgY29yZV8xLnNldFNlY3JldCkoaWRfdG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBpZF90b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgbWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLk9pZGNDbGllbnQgPSBPaWRjQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2lkYy11dGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnN1bW1hcnkgPSBleHBvcnRzLm1hcmtkb3duU3VtbWFyeSA9IGV4cG9ydHMuU1VNTUFSWV9ET0NTX1VSTCA9IGV4cG9ydHMuU1VNTUFSWV9FTlZfVkFSID0gdm9pZCAwO1xuY29uc3Qgb3NfMSA9IHJlcXVpcmUoXCJvc1wiKTtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCB7IGFjY2VzcywgYXBwZW5kRmlsZSwgd3JpdGVGaWxlIH0gPSBmc18xLnByb21pc2VzO1xuZXhwb3J0cy5TVU1NQVJZX0VOVl9WQVIgPSAnR0lUSFVCX1NURVBfU1VNTUFSWSc7XG5leHBvcnRzLlNVTU1BUllfRE9DU19VUkwgPSAnaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vYWN0aW9ucy91c2luZy13b3JrZmxvd3Mvd29ya2Zsb3ctY29tbWFuZHMtZm9yLWdpdGh1Yi1hY3Rpb25zI2FkZGluZy1hLWpvYi1zdW1tYXJ5JztcbmNsYXNzIFN1bW1hcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9idWZmZXIgPSAnJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIHN1bW1hcnkgZmlsZSBwYXRoIGZyb20gdGhlIGVudmlyb25tZW50LCByZWplY3RzIGlmIGVudiB2YXIgaXMgbm90IGZvdW5kIG9yIGZpbGUgZG9lcyBub3QgZXhpc3RcbiAgICAgKiBBbHNvIGNoZWNrcyByL3cgcGVybWlzc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBzdGVwIHN1bW1hcnkgZmlsZSBwYXRoXG4gICAgICovXG4gICAgZmlsZVBhdGgoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmlsZVBhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXRoRnJvbUVudiA9IHByb2Nlc3MuZW52W2V4cG9ydHMuU1VNTUFSWV9FTlZfVkFSXTtcbiAgICAgICAgICAgIGlmICghcGF0aEZyb21FbnYpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciAkJHtleHBvcnRzLlNVTU1BUllfRU5WX1ZBUn0uIENoZWNrIGlmIHlvdXIgcnVudGltZSBlbnZpcm9ubWVudCBzdXBwb3J0cyBqb2Igc3VtbWFyaWVzLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB5aWVsZCBhY2Nlc3MocGF0aEZyb21FbnYsIGZzXzEuY29uc3RhbnRzLlJfT0sgfCBmc18xLmNvbnN0YW50cy5XX09LKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGFjY2VzcyBzdW1tYXJ5IGZpbGU6ICcke3BhdGhGcm9tRW52fScuIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjb3JyZWN0IHJlYWQvd3JpdGUgcGVybWlzc2lvbnMuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9maWxlUGF0aCA9IHBhdGhGcm9tRW52O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVQYXRoO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JhcHMgY29udGVudCBpbiBhbiBIVE1MIHRhZywgYWRkaW5nIGFueSBIVE1MIGF0dHJpYnV0ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgSFRNTCB0YWcgdG8gd3JhcFxuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gY29udGVudCBjb250ZW50IHdpdGhpbiB0aGUgdGFnXG4gICAgICogQHBhcmFtIHtbYXR0cmlidXRlOiBzdHJpbmddOiBzdHJpbmd9IGF0dHJzIGtleS12YWx1ZSBsaXN0IG9mIEhUTUwgYXR0cmlidXRlcyB0byBhZGRcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IGNvbnRlbnQgd3JhcHBlZCBpbiBIVE1MIGVsZW1lbnRcbiAgICAgKi9cbiAgICB3cmFwKHRhZywgY29udGVudCwgYXR0cnMgPSB7fSkge1xuICAgICAgICBjb25zdCBodG1sQXR0cnMgPSBPYmplY3QuZW50cmllcyhhdHRycylcbiAgICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCAke2tleX09XCIke3ZhbHVlfVwiYClcbiAgICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYDwke3RhZ30ke2h0bWxBdHRyc30+YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYDwke3RhZ30ke2h0bWxBdHRyc30+JHtjb250ZW50fTwvJHt0YWd9PmA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyB0ZXh0IGluIHRoZSBidWZmZXIgdG8gdGhlIHN1bW1hcnkgYnVmZmVyIGZpbGUgYW5kIGVtcHRpZXMgYnVmZmVyLiBXaWxsIGFwcGVuZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdW1tYXJ5V3JpdGVPcHRpb25zfSBbb3B0aW9uc10gKG9wdGlvbmFsKSBvcHRpb25zIGZvciB3cml0ZSBvcGVyYXRpb25cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN1bW1hcnk+fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgd3JpdGUob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcndyaXRlID0gISEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm92ZXJ3cml0ZSk7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHlpZWxkIHRoaXMuZmlsZVBhdGgoKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRlRnVuYyA9IG92ZXJ3cml0ZSA/IHdyaXRlRmlsZSA6IGFwcGVuZEZpbGU7XG4gICAgICAgICAgICB5aWVsZCB3cml0ZUZ1bmMoZmlsZVBhdGgsIHRoaXMuX2J1ZmZlciwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlCdWZmZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgc3VtbWFyeSBidWZmZXIgYW5kIHdpcGVzIHRoZSBzdW1tYXJ5IGZpbGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpLndyaXRlKHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdW1tYXJ5IGJ1ZmZlciBhcyBhIHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gc3RyaW5nIG9mIHN1bW1hcnkgYnVmZmVyXG4gICAgICovXG4gICAgc3RyaW5naWZ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgc3VtbWFyeSBidWZmZXIgaXMgZW1wdHlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZW59IHRydWUgaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eVxuICAgICAqL1xuICAgIGlzRW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHN1bW1hcnkgYnVmZmVyIHdpdGhvdXQgd3JpdGluZyB0byBzdW1tYXJ5IGZpbGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlciA9ICcnO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyByYXcgdGV4dCB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IGNvbnRlbnQgdG8gYWRkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYWRkRU9MPWZhbHNlXSAob3B0aW9uYWwpIGFwcGVuZCBhbiBFT0wgdG8gdGhlIHJhdyB0ZXh0IChkZWZhdWx0OiBmYWxzZSlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkUmF3KHRleHQsIGFkZEVPTCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlciArPSB0ZXh0O1xuICAgICAgICByZXR1cm4gYWRkRU9MID8gdGhpcy5hZGRFT0woKSA6IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgZW5kLW9mLWxpbmUgbWFya2VyIHRvIHRoZSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkRU9MKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcob3NfMS5FT0wpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgY29kZWJsb2NrIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgY29udGVudCB0byByZW5kZXIgd2l0aGluIGZlbmNlZCBjb2RlIGJsb2NrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmcgKG9wdGlvbmFsKSBsYW5ndWFnZSB0byBzeW50YXggaGlnaGxpZ2h0IGNvZGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkQ29kZUJsb2NrKGNvZGUsIGxhbmcpIHtcbiAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuYXNzaWduKHt9LCAobGFuZyAmJiB7IGxhbmcgfSkpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdwcmUnLCB0aGlzLndyYXAoJ2NvZGUnLCBjb2RlKSwgYXR0cnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBsaXN0IHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gaXRlbXMgbGlzdCBvZiBpdGVtcyB0byByZW5kZXJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcmRlcmVkPWZhbHNlXSAob3B0aW9uYWwpIGlmIHRoZSByZW5kZXJlZCBsaXN0IHNob3VsZCBiZSBvcmRlcmVkIG9yIG5vdCAoZGVmYXVsdDogZmFsc2UpXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZExpc3QoaXRlbXMsIG9yZGVyZWQgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB0YWcgPSBvcmRlcmVkID8gJ29sJyA6ICd1bCc7XG4gICAgICAgIGNvbnN0IGxpc3RJdGVtcyA9IGl0ZW1zLm1hcChpdGVtID0+IHRoaXMud3JhcCgnbGknLCBpdGVtKSkuam9pbignJyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAodGFnLCBsaXN0SXRlbXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCB0YWJsZSB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3VtbWFyeVRhYmxlQ2VsbFtdfSByb3dzIHRhYmxlIHJvd3NcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkVGFibGUocm93cykge1xuICAgICAgICBjb25zdCB0YWJsZUJvZHkgPSByb3dzXG4gICAgICAgICAgICAubWFwKHJvdyA9PiB7XG4gICAgICAgICAgICBjb25zdCBjZWxscyA9IHJvd1xuICAgICAgICAgICAgICAgIC5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjZWxsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwKCd0ZCcsIGNlbGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IGhlYWRlciwgZGF0YSwgY29sc3Bhbiwgcm93c3BhbiB9ID0gY2VsbDtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBoZWFkZXIgPyAndGgnIDogJ3RkJztcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKGNvbHNwYW4gJiYgeyBjb2xzcGFuIH0pKSwgKHJvd3NwYW4gJiYgeyByb3dzcGFuIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwKHRhZywgZGF0YSwgYXR0cnMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwKCd0cicsIGNlbGxzKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgndGFibGUnLCB0YWJsZUJvZHkpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2xsYXBzYWJsZSBIVE1MIGRldGFpbHMgZWxlbWVudCB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCB0ZXh0IGZvciB0aGUgY2xvc2VkIHN0YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgY29sbGFwc2FibGUgY29udGVudFxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGREZXRhaWxzKGxhYmVsLCBjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2RldGFpbHMnLCB0aGlzLndyYXAoJ3N1bW1hcnknLCBsYWJlbCkgKyBjb250ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgaW1hZ2UgdGFnIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNyYyBwYXRoIHRvIHRoZSBpbWFnZSB5b3UgdG8gZW1iZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWx0IHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGltYWdlXG4gICAgICogQHBhcmFtIHtTdW1tYXJ5SW1hZ2VPcHRpb25zfSBvcHRpb25zIChvcHRpb25hbCkgYWRkaXRpb24gaW1hZ2UgYXR0cmlidXRlc1xuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRJbWFnZShzcmMsIGFsdCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAod2lkdGggJiYgeyB3aWR0aCB9KSksIChoZWlnaHQgJiYgeyBoZWlnaHQgfSkpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdpbWcnLCBudWxsLCBPYmplY3QuYXNzaWduKHsgc3JjLCBhbHQgfSwgYXR0cnMpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgc2VjdGlvbiBoZWFkaW5nIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IGhlYWRpbmcgdGV4dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBbbGV2ZWw9MV0gKG9wdGlvbmFsKSB0aGUgaGVhZGluZyBsZXZlbCwgZGVmYXVsdDogMVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRIZWFkaW5nKHRleHQsIGxldmVsKSB7XG4gICAgICAgIGNvbnN0IHRhZyA9IGBoJHtsZXZlbH1gO1xuICAgICAgICBjb25zdCBhbGxvd2VkVGFnID0gWydoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNiddLmluY2x1ZGVzKHRhZylcbiAgICAgICAgICAgID8gdGFnXG4gICAgICAgICAgICA6ICdoMSc7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoYWxsb3dlZFRhZywgdGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIHRoZW1hdGljIGJyZWFrICg8aHI+KSB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkU2VwYXJhdG9yKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdocicsIG51bGwpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBsaW5lIGJyZWFrICg8YnI+KSB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkQnJlYWsoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2JyJywgbnVsbCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGJsb2NrcXVvdGUgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBxdW90ZSB0ZXh0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNpdGUgKG9wdGlvbmFsKSBjaXRhdGlvbiB1cmxcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkUXVvdGUodGV4dCwgY2l0ZSkge1xuICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5hc3NpZ24oe30sIChjaXRlICYmIHsgY2l0ZSB9KSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2Jsb2NrcXVvdGUnLCB0ZXh0LCBhdHRycyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGFuY2hvciB0YWcgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBsaW5rIHRleHQvY29udGVudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIGh5cGVybGlua1xuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRMaW5rKHRleHQsIGhyZWYpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnYScsIHRleHQsIHsgaHJlZiB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbn1cbmNvbnN0IF9zdW1tYXJ5ID0gbmV3IFN1bW1hcnkoKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGBjb3JlLnN1bW1hcnlgXG4gKi9cbmV4cG9ydHMubWFya2Rvd25TdW1tYXJ5ID0gX3N1bW1hcnk7XG5leHBvcnRzLnN1bW1hcnkgPSBfc3VtbWFyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1bW1hcnkuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50b1BsYXRmb3JtUGF0aCA9IGV4cG9ydHMudG9XaW4zMlBhdGggPSBleHBvcnRzLnRvUG9zaXhQYXRoID0gdm9pZCAwO1xuY29uc3QgcGF0aCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicGF0aFwiKSk7XG4vKipcbiAqIHRvUG9zaXhQYXRoIGNvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoZSBwb3NpeCBmb3JtLiBPbiBXaW5kb3dzLCBcXFxcIHdpbGwgYmVcbiAqIHJlcGxhY2VkIHdpdGggLy5cbiAqXG4gKiBAcGFyYW0gcHRoLiBQYXRoIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4gc3RyaW5nIFBvc2l4IHBhdGguXG4gKi9cbmZ1bmN0aW9uIHRvUG9zaXhQYXRoKHB0aCkge1xuICAgIHJldHVybiBwdGgucmVwbGFjZSgvW1xcXFxdL2csICcvJyk7XG59XG5leHBvcnRzLnRvUG9zaXhQYXRoID0gdG9Qb3NpeFBhdGg7XG4vKipcbiAqIHRvV2luMzJQYXRoIGNvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoZSB3aW4zMiBmb3JtLiBPbiBMaW51eCwgLyB3aWxsIGJlXG4gKiByZXBsYWNlZCB3aXRoIFxcXFwuXG4gKlxuICogQHBhcmFtIHB0aC4gUGF0aCB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHN0cmluZyBXaW4zMiBwYXRoLlxuICovXG5mdW5jdGlvbiB0b1dpbjMyUGF0aChwdGgpIHtcbiAgICByZXR1cm4gcHRoLnJlcGxhY2UoL1svXS9nLCAnXFxcXCcpO1xufVxuZXhwb3J0cy50b1dpbjMyUGF0aCA9IHRvV2luMzJQYXRoO1xuLyoqXG4gKiB0b1BsYXRmb3JtUGF0aCBjb252ZXJ0cyB0aGUgZ2l2ZW4gcGF0aCB0byBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGguIEl0IGRvZXNcbiAqIHRoaXMgYnkgcmVwbGFjaW5nIGluc3RhbmNlcyBvZiAvIGFuZCBcXCB3aXRoIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoXG4gKiBzZXBhcmF0b3IuXG4gKlxuICogQHBhcmFtIHB0aCBUaGUgcGF0aCB0byBwbGF0Zm9ybWl6ZS5cbiAqIEByZXR1cm4gc3RyaW5nIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoLlxuICovXG5mdW5jdGlvbiB0b1BsYXRmb3JtUGF0aChwdGgpIHtcbiAgICByZXR1cm4gcHRoLnJlcGxhY2UoL1svXFxcXF0vZywgcGF0aC5zZXApO1xufVxuZXhwb3J0cy50b1BsYXRmb3JtUGF0aCA9IHRvUGxhdGZvcm1QYXRoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGF0aC11dGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0RGV0YWlscyA9IGV4cG9ydHMuaXNMaW51eCA9IGV4cG9ydHMuaXNNYWNPUyA9IGV4cG9ydHMuaXNXaW5kb3dzID0gZXhwb3J0cy5hcmNoID0gZXhwb3J0cy5wbGF0Zm9ybSA9IHZvaWQgMDtcbmNvbnN0IG9zXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIm9zXCIpKTtcbmNvbnN0IGV4ZWMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2V4ZWNcIikpO1xuY29uc3QgZ2V0V2luZG93c0luZm8gPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCB7IHN0ZG91dDogdmVyc2lvbiB9ID0geWllbGQgZXhlYy5nZXRFeGVjT3V0cHV0KCdwb3dlcnNoZWxsIC1jb21tYW5kIFwiKEdldC1DaW1JbnN0YW5jZSAtQ2xhc3NOYW1lIFdpbjMyX09wZXJhdGluZ1N5c3RlbSkuVmVyc2lvblwiJywgdW5kZWZpbmVkLCB7XG4gICAgICAgIHNpbGVudDogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IHsgc3Rkb3V0OiBuYW1lIH0gPSB5aWVsZCBleGVjLmdldEV4ZWNPdXRwdXQoJ3Bvd2Vyc2hlbGwgLWNvbW1hbmQgXCIoR2V0LUNpbUluc3RhbmNlIC1DbGFzc05hbWUgV2luMzJfT3BlcmF0aW5nU3lzdGVtKS5DYXB0aW9uXCInLCB1bmRlZmluZWQsIHtcbiAgICAgICAgc2lsZW50OiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbmFtZS50cmltKCksXG4gICAgICAgIHZlcnNpb246IHZlcnNpb24udHJpbSgpXG4gICAgfTtcbn0pO1xuY29uc3QgZ2V0TWFjT3NJbmZvID0gKCkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSB5aWVsZCBleGVjLmdldEV4ZWNPdXRwdXQoJ3N3X3ZlcnMnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgc2lsZW50OiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbiA9IChfYiA9IChfYSA9IHN0ZG91dC5tYXRjaCgvUHJvZHVjdFZlcnNpb246XFxzKiguKykvKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWzFdKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnJztcbiAgICBjb25zdCBuYW1lID0gKF9kID0gKF9jID0gc3Rkb3V0Lm1hdGNoKC9Qcm9kdWN0TmFtZTpcXHMqKC4rKS8pKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2NbMV0pICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICcnO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHZlcnNpb25cbiAgICB9O1xufSk7XG5jb25zdCBnZXRMaW51eEluZm8gPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCB7IHN0ZG91dCB9ID0geWllbGQgZXhlYy5nZXRFeGVjT3V0cHV0KCdsc2JfcmVsZWFzZScsIFsnLWknLCAnLXInLCAnLXMnXSwge1xuICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCBbbmFtZSwgdmVyc2lvbl0gPSBzdGRvdXQudHJpbSgpLnNwbGl0KCdcXG4nKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICB2ZXJzaW9uXG4gICAgfTtcbn0pO1xuZXhwb3J0cy5wbGF0Zm9ybSA9IG9zXzEuZGVmYXVsdC5wbGF0Zm9ybSgpO1xuZXhwb3J0cy5hcmNoID0gb3NfMS5kZWZhdWx0LmFyY2goKTtcbmV4cG9ydHMuaXNXaW5kb3dzID0gZXhwb3J0cy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbmV4cG9ydHMuaXNNYWNPUyA9IGV4cG9ydHMucGxhdGZvcm0gPT09ICdkYXJ3aW4nO1xuZXhwb3J0cy5pc0xpbnV4ID0gZXhwb3J0cy5wbGF0Zm9ybSA9PT0gJ2xpbnV4JztcbmZ1bmN0aW9uIGdldERldGFpbHMoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHlpZWxkIChleHBvcnRzLmlzV2luZG93c1xuICAgICAgICAgICAgPyBnZXRXaW5kb3dzSW5mbygpXG4gICAgICAgICAgICA6IGV4cG9ydHMuaXNNYWNPU1xuICAgICAgICAgICAgICAgID8gZ2V0TWFjT3NJbmZvKClcbiAgICAgICAgICAgICAgICA6IGdldExpbnV4SW5mbygpKSkpLCB7IHBsYXRmb3JtOiBleHBvcnRzLnBsYXRmb3JtLFxuICAgICAgICAgICAgYXJjaDogZXhwb3J0cy5hcmNoLFxuICAgICAgICAgICAgaXNXaW5kb3dzOiBleHBvcnRzLmlzV2luZG93cyxcbiAgICAgICAgICAgIGlzTWFjT1M6IGV4cG9ydHMuaXNNYWNPUyxcbiAgICAgICAgICAgIGlzTGludXg6IGV4cG9ydHMuaXNMaW51eCB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RGV0YWlscyA9IGdldERldGFpbHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wbGF0Zm9ybS5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGxhdGZvcm0gPSBleHBvcnRzLnRvUGxhdGZvcm1QYXRoID0gZXhwb3J0cy50b1dpbjMyUGF0aCA9IGV4cG9ydHMudG9Qb3NpeFBhdGggPSBleHBvcnRzLm1hcmtkb3duU3VtbWFyeSA9IGV4cG9ydHMuc3VtbWFyeSA9IGV4cG9ydHMuZ2V0SURUb2tlbiA9IGV4cG9ydHMuZ2V0U3RhdGUgPSBleHBvcnRzLnNhdmVTdGF0ZSA9IGV4cG9ydHMuZ3JvdXAgPSBleHBvcnRzLmVuZEdyb3VwID0gZXhwb3J0cy5zdGFydEdyb3VwID0gZXhwb3J0cy5pbmZvID0gZXhwb3J0cy5ub3RpY2UgPSBleHBvcnRzLndhcm5pbmcgPSBleHBvcnRzLmVycm9yID0gZXhwb3J0cy5kZWJ1ZyA9IGV4cG9ydHMuaXNEZWJ1ZyA9IGV4cG9ydHMuc2V0RmFpbGVkID0gZXhwb3J0cy5zZXRDb21tYW5kRWNobyA9IGV4cG9ydHMuc2V0T3V0cHV0ID0gZXhwb3J0cy5nZXRCb29sZWFuSW5wdXQgPSBleHBvcnRzLmdldE11bHRpbGluZUlucHV0ID0gZXhwb3J0cy5nZXRJbnB1dCA9IGV4cG9ydHMuYWRkUGF0aCA9IGV4cG9ydHMuc2V0U2VjcmV0ID0gZXhwb3J0cy5leHBvcnRWYXJpYWJsZSA9IGV4cG9ydHMuRXhpdENvZGUgPSB2b2lkIDA7XG5jb25zdCBjb21tYW5kXzEgPSByZXF1aXJlKFwiLi9jb21tYW5kXCIpO1xuY29uc3QgZmlsZV9jb21tYW5kXzEgPSByZXF1aXJlKFwiLi9maWxlLWNvbW1hbmRcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5jb25zdCBvcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwib3NcIikpO1xuY29uc3QgcGF0aCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicGF0aFwiKSk7XG5jb25zdCBvaWRjX3V0aWxzXzEgPSByZXF1aXJlKFwiLi9vaWRjLXV0aWxzXCIpO1xuLyoqXG4gKiBUaGUgY29kZSB0byBleGl0IGFuIGFjdGlvblxuICovXG52YXIgRXhpdENvZGU7XG4oZnVuY3Rpb24gKEV4aXRDb2RlKSB7XG4gICAgLyoqXG4gICAgICogQSBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgYWN0aW9uIHdhcyBzdWNjZXNzZnVsXG4gICAgICovXG4gICAgRXhpdENvZGVbRXhpdENvZGVbXCJTdWNjZXNzXCJdID0gMF0gPSBcIlN1Y2Nlc3NcIjtcbiAgICAvKipcbiAgICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3Rpb24gd2FzIGEgZmFpbHVyZVxuICAgICAqL1xuICAgIEV4aXRDb2RlW0V4aXRDb2RlW1wiRmFpbHVyZVwiXSA9IDFdID0gXCJGYWlsdXJlXCI7XG59KShFeGl0Q29kZSB8fCAoZXhwb3J0cy5FeGl0Q29kZSA9IEV4aXRDb2RlID0ge30pKTtcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFZhcmlhYmxlc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBTZXRzIGVudiB2YXJpYWJsZSBmb3IgdGhpcyBhY3Rpb24gYW5kIGZ1dHVyZSBhY3Rpb25zIGluIHRoZSBqb2JcbiAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBzZXRcbiAqIEBwYXJhbSB2YWwgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZS4gTm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdmlhIEpTT04uc3RyaW5naWZ5XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBleHBvcnRWYXJpYWJsZShuYW1lLCB2YWwpIHtcbiAgICBjb25zdCBjb252ZXJ0ZWRWYWwgPSAoMCwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSkodmFsKTtcbiAgICBwcm9jZXNzLmVudltuYW1lXSA9IGNvbnZlcnRlZFZhbDtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuZW52WydHSVRIVUJfRU5WJ10gfHwgJyc7XG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgIHJldHVybiAoMCwgZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCkoJ0VOVicsICgwLCBmaWxlX2NvbW1hbmRfMS5wcmVwYXJlS2V5VmFsdWVNZXNzYWdlKShuYW1lLCB2YWwpKTtcbiAgICB9XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdzZXQtZW52JywgeyBuYW1lIH0sIGNvbnZlcnRlZFZhbCk7XG59XG5leHBvcnRzLmV4cG9ydFZhcmlhYmxlID0gZXhwb3J0VmFyaWFibGU7XG4vKipcbiAqIFJlZ2lzdGVycyBhIHNlY3JldCB3aGljaCB3aWxsIGdldCBtYXNrZWQgZnJvbSBsb2dzXG4gKiBAcGFyYW0gc2VjcmV0IHZhbHVlIG9mIHRoZSBzZWNyZXRcbiAqL1xuZnVuY3Rpb24gc2V0U2VjcmV0KHNlY3JldCkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWVDb21tYW5kKSgnYWRkLW1hc2snLCB7fSwgc2VjcmV0KTtcbn1cbmV4cG9ydHMuc2V0U2VjcmV0ID0gc2V0U2VjcmV0O1xuLyoqXG4gKiBQcmVwZW5kcyBpbnB1dFBhdGggdG8gdGhlIFBBVEggKGZvciB0aGlzIGFjdGlvbiBhbmQgZnV0dXJlIGFjdGlvbnMpXG4gKiBAcGFyYW0gaW5wdXRQYXRoXG4gKi9cbmZ1bmN0aW9uIGFkZFBhdGgoaW5wdXRQYXRoKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmVudlsnR0lUSFVCX1BBVEgnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgKDAsIGZpbGVfY29tbWFuZF8xLmlzc3VlRmlsZUNvbW1hbmQpKCdQQVRIJywgaW5wdXRQYXRoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgICgwLCBjb21tYW5kXzEuaXNzdWVDb21tYW5kKSgnYWRkLXBhdGgnLCB7fSwgaW5wdXRQYXRoKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5lbnZbJ1BBVEgnXSA9IGAke2lucHV0UGF0aH0ke3BhdGguZGVsaW1pdGVyfSR7cHJvY2Vzcy5lbnZbJ1BBVEgnXX1gO1xufVxuZXhwb3J0cy5hZGRQYXRoID0gYWRkUGF0aDtcbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gaW5wdXQuXG4gKiBVbmxlc3MgdHJpbVdoaXRlc3BhY2UgaXMgc2V0IHRvIGZhbHNlIGluIElucHV0T3B0aW9ucywgdGhlIHZhbHVlIGlzIGFsc28gdHJpbW1lZC5cbiAqIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSB2YWx1ZSBpcyBub3QgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIGlucHV0IHRvIGdldFxuICogQHBhcmFtICAgICBvcHRpb25zICBvcHRpb25hbC4gU2VlIElucHV0T3B0aW9ucy5cbiAqIEByZXR1cm5zICAgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGdldElucHV0KG5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWwgPSBwcm9jZXNzLmVudltgSU5QVVRfJHtuYW1lLnJlcGxhY2UoLyAvZywgJ18nKS50b1VwcGVyQ2FzZSgpfWBdIHx8ICcnO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVxdWlyZWQgJiYgIXZhbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHJlcXVpcmVkIGFuZCBub3Qgc3VwcGxpZWQ6ICR7bmFtZX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50cmltV2hpdGVzcGFjZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbC50cmltKCk7XG59XG5leHBvcnRzLmdldElucHV0ID0gZ2V0SW5wdXQ7XG4vKipcbiAqIEdldHMgdGhlIHZhbHVlcyBvZiBhbiBtdWx0aWxpbmUgaW5wdXQuICBFYWNoIHZhbHVlIGlzIGFsc28gdHJpbW1lZC5cbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIGlucHV0IHRvIGdldFxuICogQHBhcmFtICAgICBvcHRpb25zICBvcHRpb25hbC4gU2VlIElucHV0T3B0aW9ucy5cbiAqIEByZXR1cm5zICAgc3RyaW5nW11cbiAqXG4gKi9cbmZ1bmN0aW9uIGdldE11bHRpbGluZUlucHV0KG5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBpbnB1dHMgPSBnZXRJbnB1dChuYW1lLCBvcHRpb25zKVxuICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5maWx0ZXIoeCA9PiB4ICE9PSAnJyk7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50cmltV2hpdGVzcGFjZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0cztcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cy5tYXAoaW5wdXQgPT4gaW5wdXQudHJpbSgpKTtcbn1cbmV4cG9ydHMuZ2V0TXVsdGlsaW5lSW5wdXQgPSBnZXRNdWx0aWxpbmVJbnB1dDtcbi8qKlxuICogR2V0cyB0aGUgaW5wdXQgdmFsdWUgb2YgdGhlIGJvb2xlYW4gdHlwZSBpbiB0aGUgWUFNTCAxLjIgXCJjb3JlIHNjaGVtYVwiIHNwZWNpZmljYXRpb24uXG4gKiBTdXBwb3J0IGJvb2xlYW4gaW5wdXQgbGlzdDogYHRydWUgfCBUcnVlIHwgVFJVRSB8IGZhbHNlIHwgRmFsc2UgfCBGQUxTRWAgLlxuICogVGhlIHJldHVybiB2YWx1ZSBpcyBhbHNvIGluIGJvb2xlYW4gdHlwZS5cbiAqIHJlZjogaHR0cHM6Ly95YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjaWQyODA0OTIzXG4gKlxuICogQHBhcmFtICAgICBuYW1lICAgICBuYW1lIG9mIHRoZSBpbnB1dCB0byBnZXRcbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgb3B0aW9uYWwuIFNlZSBJbnB1dE9wdGlvbnMuXG4gKiBAcmV0dXJucyAgIGJvb2xlYW5cbiAqL1xuZnVuY3Rpb24gZ2V0Qm9vbGVhbklucHV0KG5hbWUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB0cnVlVmFsdWUgPSBbJ3RydWUnLCAnVHJ1ZScsICdUUlVFJ107XG4gICAgY29uc3QgZmFsc2VWYWx1ZSA9IFsnZmFsc2UnLCAnRmFsc2UnLCAnRkFMU0UnXTtcbiAgICBjb25zdCB2YWwgPSBnZXRJbnB1dChuYW1lLCBvcHRpb25zKTtcbiAgICBpZiAodHJ1ZVZhbHVlLmluY2x1ZGVzKHZhbCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChmYWxzZVZhbHVlLmluY2x1ZGVzKHZhbCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnB1dCBkb2VzIG5vdCBtZWV0IFlBTUwgMS4yIFwiQ29yZSBTY2hlbWFcIiBzcGVjaWZpY2F0aW9uOiAke25hbWV9XFxuYCArXG4gICAgICAgIGBTdXBwb3J0IGJvb2xlYW4gaW5wdXQgbGlzdDogXFxgdHJ1ZSB8IFRydWUgfCBUUlVFIHwgZmFsc2UgfCBGYWxzZSB8IEZBTFNFXFxgYCk7XG59XG5leHBvcnRzLmdldEJvb2xlYW5JbnB1dCA9IGdldEJvb2xlYW5JbnB1dDtcbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgb2YgYW4gb3V0cHV0LlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgb3V0cHV0IHRvIHNldFxuICogQHBhcmFtICAgICB2YWx1ZSAgICB2YWx1ZSB0byBzdG9yZS4gTm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdmlhIEpTT04uc3RyaW5naWZ5XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBzZXRPdXRwdXQobmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuZW52WydHSVRIVUJfT1VUUFVUJ10gfHwgJyc7XG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgIHJldHVybiAoMCwgZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCkoJ09VVFBVVCcsICgwLCBmaWxlX2NvbW1hbmRfMS5wcmVwYXJlS2V5VmFsdWVNZXNzYWdlKShuYW1lLCB2YWx1ZSkpO1xuICAgIH1cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvcy5FT0wpO1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWVDb21tYW5kKSgnc2V0LW91dHB1dCcsIHsgbmFtZSB9LCAoMCwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSkodmFsdWUpKTtcbn1cbmV4cG9ydHMuc2V0T3V0cHV0ID0gc2V0T3V0cHV0O1xuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBlY2hvaW5nIG9mIGNvbW1hbmRzIGludG8gc3Rkb3V0IGZvciB0aGUgcmVzdCBvZiB0aGUgc3RlcC5cbiAqIEVjaG9pbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBpZiBBQ1RJT05TX1NURVBfREVCVUcgaXMgbm90IHNldC5cbiAqXG4gKi9cbmZ1bmN0aW9uIHNldENvbW1hbmRFY2hvKGVuYWJsZWQpIHtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlKSgnZWNobycsIGVuYWJsZWQgPyAnb24nIDogJ29mZicpO1xufVxuZXhwb3J0cy5zZXRDb21tYW5kRWNobyA9IHNldENvbW1hbmRFY2hvO1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVzdWx0c1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBTZXRzIHRoZSBhY3Rpb24gc3RhdHVzIHRvIGZhaWxlZC5cbiAqIFdoZW4gdGhlIGFjdGlvbiBleGl0cyBpdCB3aWxsIGJlIHdpdGggYW4gZXhpdCBjb2RlIG9mIDFcbiAqIEBwYXJhbSBtZXNzYWdlIGFkZCBlcnJvciBpc3N1ZSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIHNldEZhaWxlZChtZXNzYWdlKSB7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IEV4aXRDb2RlLkZhaWx1cmU7XG4gICAgZXJyb3IobWVzc2FnZSk7XG59XG5leHBvcnRzLnNldEZhaWxlZCA9IHNldEZhaWxlZDtcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExvZ2dpbmcgQ29tbWFuZHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogR2V0cyB3aGV0aGVyIEFjdGlvbnMgU3RlcCBEZWJ1ZyBpcyBvbiBvciBub3RcbiAqL1xuZnVuY3Rpb24gaXNEZWJ1ZygpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ1JVTk5FUl9ERUJVRyddID09PSAnMSc7XG59XG5leHBvcnRzLmlzRGVidWcgPSBpc0RlYnVnO1xuLyoqXG4gKiBXcml0ZXMgZGVidWcgbWVzc2FnZSB0byB1c2VyIGxvZ1xuICogQHBhcmFtIG1lc3NhZ2UgZGVidWcgbWVzc2FnZVxuICovXG5mdW5jdGlvbiBkZWJ1ZyhtZXNzYWdlKSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdkZWJ1ZycsIHt9LCBtZXNzYWdlKTtcbn1cbmV4cG9ydHMuZGVidWcgPSBkZWJ1Zztcbi8qKlxuICogQWRkcyBhbiBlcnJvciBpc3N1ZVxuICogQHBhcmFtIG1lc3NhZ2UgZXJyb3IgaXNzdWUgbWVzc2FnZS4gRXJyb3JzIHdpbGwgYmUgY29udmVydGVkIHRvIHN0cmluZyB2aWEgdG9TdHJpbmcoKVxuICogQHBhcmFtIHByb3BlcnRpZXMgb3B0aW9uYWwgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIGFubm90YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGVycm9yKG1lc3NhZ2UsIHByb3BlcnRpZXMgPSB7fSkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWVDb21tYW5kKSgnZXJyb3InLCAoMCwgdXRpbHNfMS50b0NvbW1hbmRQcm9wZXJ0aWVzKShwcm9wZXJ0aWVzKSwgbWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yID8gbWVzc2FnZS50b1N0cmluZygpIDogbWVzc2FnZSk7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG4vKipcbiAqIEFkZHMgYSB3YXJuaW5nIGlzc3VlXG4gKiBAcGFyYW0gbWVzc2FnZSB3YXJuaW5nIGlzc3VlIG1lc3NhZ2UuIEVycm9ycyB3aWxsIGJlIGNvbnZlcnRlZCB0byBzdHJpbmcgdmlhIHRvU3RyaW5nKClcbiAqIEBwYXJhbSBwcm9wZXJ0aWVzIG9wdGlvbmFsIHByb3BlcnRpZXMgdG8gYWRkIHRvIHRoZSBhbm5vdGF0aW9uLlxuICovXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UsIHByb3BlcnRpZXMgPSB7fSkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWVDb21tYW5kKSgnd2FybmluZycsICgwLCB1dGlsc18xLnRvQ29tbWFuZFByb3BlcnRpZXMpKHByb3BlcnRpZXMpLCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IgPyBtZXNzYWdlLnRvU3RyaW5nKCkgOiBtZXNzYWdlKTtcbn1cbmV4cG9ydHMud2FybmluZyA9IHdhcm5pbmc7XG4vKipcbiAqIEFkZHMgYSBub3RpY2UgaXNzdWVcbiAqIEBwYXJhbSBtZXNzYWdlIG5vdGljZSBpc3N1ZSBtZXNzYWdlLiBFcnJvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHZpYSB0b1N0cmluZygpXG4gKiBAcGFyYW0gcHJvcGVydGllcyBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm90aWNlKG1lc3NhZ2UsIHByb3BlcnRpZXMgPSB7fSkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWVDb21tYW5kKSgnbm90aWNlJywgKDAsIHV0aWxzXzEudG9Db21tYW5kUHJvcGVydGllcykocHJvcGVydGllcyksIG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvciA/IG1lc3NhZ2UudG9TdHJpbmcoKSA6IG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5ub3RpY2UgPSBub3RpY2U7XG4vKipcbiAqIFdyaXRlcyBpbmZvIHRvIGxvZyB3aXRoIGNvbnNvbGUubG9nLlxuICogQHBhcmFtIG1lc3NhZ2UgaW5mbyBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGluZm8obWVzc2FnZSkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG1lc3NhZ2UgKyBvcy5FT0wpO1xufVxuZXhwb3J0cy5pbmZvID0gaW5mbztcbi8qKlxuICogQmVnaW4gYW4gb3V0cHV0IGdyb3VwLlxuICpcbiAqIE91dHB1dCB1bnRpbCB0aGUgbmV4dCBgZ3JvdXBFbmRgIHdpbGwgYmUgZm9sZGFibGUgaW4gdGhpcyBncm91cFxuICpcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZ3JvdXBcbiAqL1xuZnVuY3Rpb24gc3RhcnRHcm91cChuYW1lKSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZSkoJ2dyb3VwJywgbmFtZSk7XG59XG5leHBvcnRzLnN0YXJ0R3JvdXAgPSBzdGFydEdyb3VwO1xuLyoqXG4gKiBFbmQgYW4gb3V0cHV0IGdyb3VwLlxuICovXG5mdW5jdGlvbiBlbmRHcm91cCgpIHtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlKSgnZW5kZ3JvdXAnKTtcbn1cbmV4cG9ydHMuZW5kR3JvdXAgPSBlbmRHcm91cDtcbi8qKlxuICogV3JhcCBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gY2FsbCBpbiBhIGdyb3VwLlxuICpcbiAqIFJldHVybnMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgZnVuY3Rpb24gaXRzZWxmLlxuICpcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBncm91cFxuICogQHBhcmFtIGZuIFRoZSBmdW5jdGlvbiB0byB3cmFwIGluIHRoZSBncm91cFxuICovXG5mdW5jdGlvbiBncm91cChuYW1lLCBmbikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHN0YXJ0R3JvdXAobmFtZSk7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSB5aWVsZCBmbigpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgZW5kR3JvdXAoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xufVxuZXhwb3J0cy5ncm91cCA9IGdyb3VwO1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV3JhcHBlciBhY3Rpb24gc3RhdGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8qKlxuICogU2F2ZXMgc3RhdGUgZm9yIGN1cnJlbnQgYWN0aW9uLCB0aGUgc3RhdGUgY2FuIG9ubHkgYmUgcmV0cmlldmVkIGJ5IHRoaXMgYWN0aW9uJ3MgcG9zdCBqb2IgZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgc3RhdGUgdG8gc3RvcmVcbiAqIEBwYXJhbSAgICAgdmFsdWUgICAgdmFsdWUgdG8gc3RvcmUuIE5vbi1zdHJpbmcgdmFsdWVzIHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3RyaW5nIHZpYSBKU09OLnN0cmluZ2lmeVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gc2F2ZVN0YXRlKG5hbWUsIHZhbHVlKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwcm9jZXNzLmVudlsnR0lUSFVCX1NUQVRFJ10gfHwgJyc7XG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgIHJldHVybiAoMCwgZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCkoJ1NUQVRFJywgKDAsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UpKG5hbWUsIHZhbHVlKSk7XG4gICAgfVxuICAgICgwLCBjb21tYW5kXzEuaXNzdWVDb21tYW5kKSgnc2F2ZS1zdGF0ZScsIHsgbmFtZSB9LCAoMCwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSkodmFsdWUpKTtcbn1cbmV4cG9ydHMuc2F2ZVN0YXRlID0gc2F2ZVN0YXRlO1xuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBzdGF0ZSBzZXQgYnkgdGhpcyBhY3Rpb24ncyBtYWluIGV4ZWN1dGlvbi5cbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIHN0YXRlIHRvIGdldFxuICogQHJldHVybnMgICBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0U3RhdGUobmFtZSkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudltgU1RBVEVfJHtuYW1lfWBdIHx8ICcnO1xufVxuZXhwb3J0cy5nZXRTdGF0ZSA9IGdldFN0YXRlO1xuZnVuY3Rpb24gZ2V0SURUb2tlbihhdWQpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4geWllbGQgb2lkY191dGlsc18xLk9pZGNDbGllbnQuZ2V0SURUb2tlbihhdWQpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRJRFRva2VuID0gZ2V0SURUb2tlbjtcbi8qKlxuICogU3VtbWFyeSBleHBvcnRzXG4gKi9cbnZhciBzdW1tYXJ5XzEgPSByZXF1aXJlKFwiLi9zdW1tYXJ5XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3VtbWFyeVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3VtbWFyeV8xLnN1bW1hcnk7IH0gfSk7XG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBjb3JlLnN1bW1hcnlcbiAqL1xudmFyIHN1bW1hcnlfMiA9IHJlcXVpcmUoXCIuL3N1bW1hcnlcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtYXJrZG93blN1bW1hcnlcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN1bW1hcnlfMi5tYXJrZG93blN1bW1hcnk7IH0gfSk7XG4vKipcbiAqIFBhdGggZXhwb3J0c1xuICovXG52YXIgcGF0aF91dGlsc18xID0gcmVxdWlyZShcIi4vcGF0aC11dGlsc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInRvUG9zaXhQYXRoXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXRoX3V0aWxzXzEudG9Qb3NpeFBhdGg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0b1dpbjMyUGF0aFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGF0aF91dGlsc18xLnRvV2luMzJQYXRoOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidG9QbGF0Zm9ybVBhdGhcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBhdGhfdXRpbHNfMS50b1BsYXRmb3JtUGF0aDsgfSB9KTtcbi8qKlxuICogUGxhdGZvcm0gdXRpbGl0aWVzIGV4cG9ydHNcbiAqL1xuZXhwb3J0cy5wbGF0Zm9ybSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wbGF0Zm9ybVwiKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3JlLmpzLm1hcCIsCiAgICAiaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiQGFjdGlvbnMvZXhlY1wiXG5pbXBvcnQgeyBkZWJ1ZywgZ2V0U3RhdGUsIHNhdmVTdGF0ZSB9IGZyb20gXCJAYWN0aW9ucy9jb3JlXCJcblxuKGFzeW5jIGZ1bmN0aW9uIHBvc3QoKSB7XG5cdGxldCBjd2QgPSBnZXRTdGF0ZShcIkNXRFwiKVxuXG5cdGxldCBzdGFydCA9IG5ldyBEYXRlKGdldFN0YXRlKFwiWURCX1NUQVJUX1RJTUVcIikpXG5cdGxldCBlbmQgPSBuZXcgRGF0ZSgpXG5cblx0ZGVidWcoXCJTdG9wcGluZyBZREIuLi5cIilcblx0YXdhaXQgZXhlYyhgZG9ja2VyYCwgW2Bjb21wb3NlYCwgYC1mYCwgYGNvbXBvc2UueWFtbGAsIGBkb3duYF0sIHsgY3dkIH0pXG5cblx0ZGVidWcoYFlEQiBzdG9wcGVkIGF0ICR7ZW5kfWApXG5cdHNhdmVTdGF0ZShcIllEQl9FTkRfVElNRVwiLCBlbmQudG9JU09TdHJpbmcoKSlcblxuXHRsZXQgZHVyYXRpb24gPSBlbmQuZ2V0VGltZSgpIC0gc3RhcnQuZ2V0VGltZSgpXG5cdGRlYnVnKGBZREIgU0xPIFRlc3QgZHVyYXRpb246ICR7ZHVyYXRpb259bXMuYClcblxuXHRkZWJ1ZyhcIkNsZWFuaW5nIHVwIHRlbXAgZGlyZWN0b3J5Li4uXCIpXG5cdGZzLnJtU3luYyhjd2QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufSkoKVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxNQUFJLGtCQUFtQixXQUFRLFFBQUssb0JBQXFCLE9BQU8saUJBQWtCLENBQUMsR0FBRyxH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QUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFB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QUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDN0M7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUM3QztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQzdDO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDN0M7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUM3QztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJ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O0FBQ3RELEVBQVEsdUJBQWU7QUFBQSxJQUNuQixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFFUixRQUFRO0FBQUEsRUFDWjtBQUNBLEVBQVEsc0JBQWM7QUFBQSxJQUNsQixRQUFRO0FBQUEsRUFDWjtBQUNBLEVBQVEsdUJBQWU7QUFBQSxJQUNuQixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFFUixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsRUFDWjtBQUNBLEVBQVEscUJBQWEsUUFBUSxVQUFVLE9BQU87QUFDOUMsRUFBUSx1QkFBZSxDQUFDO0FBQ3hCLFNBQU8sS0FB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QUFBLFdBQzFCO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUNILGVBQU87QUFBQTtBQUNBLGVBQU87QUFBQTtBQUFBO0FBSXBC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a0JBQWtCLEVBQUUsWUFBWSxNQUFNLGFBQWMsR0FBRztBQUFFLFdBQU8sYUFBYTtBQUFBLElBQWtCLENBQUM7QUFJL0gsVUFBUSxXQUFXLCtCQUFrQztBQUFBOzs7QUNyVnJEO0FBQ0E7QUFGQTtBQUlBLENBQUMsZUFBZSxJQUFJLEdBQUc7QUFDdEIsTUFBSSxNQUFNLHFCQUFTLEtBQUs7QUFFeEIsTUFBSSxRQUFRLElBQUksS0FBSyxxQkFBUyxnQkFBZ0IsQ0FBQztBQUMvQyxNQUFJLE1BQU0sSUFBSTtBQUVkLG9CQUFNLGlCQUFpQjtBQUN2QixRQUFNLGlCQUFLLFVBQVUsQ0FBQyxXQUFXLE1BQU0sZ0JBQWdCLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQztBQUV2RSxvQkFBTSxrQkFBa0IsS0FBSztBQUM3Qix3QkFBVSxnQkFBZ0IsSUFBSSxZQUFZLENBQUM7QUFFM0MsTUFBSSxXQUFXLElBQUksUUFBUSxJQUFJLE1BQU0sUUFBUTtBQUM3QyxvQkFBTSwwQkFBMEIsYUFBYTtBQUU3QyxvQkFBTSwrQkFBK0I7QUFDckMsRUFBRyxVQUFPLEtBQUssRUFBRSxXQUFXLEtBQUssQ0FBQztBQUFBLEdBQ2hDOyIsCiAgImRlYnVnSWQiOiAiNUQ4QkY3ODNFODI5QkYwMDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0= diff --git a/init/src/jobs/main.ts b/init/src/jobs/main.ts index 990913c..2b23b23 100644 --- a/init/src/jobs/main.ts +++ b/init/src/jobs/main.ts @@ -3,11 +3,14 @@ import * as path from 'node:path' import { debug, getInput, saveState } from '@actions/core' import { exec } from '@actions/exec' import { generateComposeFile, prometheusConfig, ydbConfig } from '../configs' +import { context } from '@actions/github' (async function main() { let cwd = path.join(process.cwd(), ".slo") saveState("CWD", cwd) + debug(JSON.stringify(context, null, 4)) + debug("Creating working directory...") fs.mkdirSync(cwd, { recursive: true }) diff --git a/init/src/jobs/post.ts b/init/src/jobs/post.ts index bdce2d3..433b672 100644 --- a/init/src/jobs/post.ts +++ b/init/src/jobs/post.ts @@ -1,18 +1,43 @@ import * as fs from 'node:fs' +import * as path from 'node:path' import { exec } from "@actions/exec" -import { debug, getState, saveState } from "@actions/core" +import { debug, getInput, getState, saveState } from "@actions/core" +import { DefaultArtifactClient } from '@actions/artifact' +import { collectPrometheus } from '../metrics/prometheus' +import { defaultMetrics } from '../metrics/default' +import { renderReport } from '../report/default' (async function post() { let cwd = getState("CWD") - let start = new Date(getState("YDB_START_TIME")) let end = new Date() + let start = new Date(getState("YDB_START_TIME")) + saveState("YDB_END_TIME", end.toISOString()) + + debug("Collecting metrics...") + let metrics = await collectPrometheus(start, end, defaultMetrics.metrics) + debug(`Metrics: ${Object.keys(metrics)}`) + + debug("Rendering report...") + let report = renderReport(getInput("sdk_name") || "Unknown", metrics) + debug(`Report: ${report}`) + + debug("Writing report...") + let reportPath = path.join(cwd, "/report.md") + fs.writeFileSync(path.join(cwd, "/report.md"), report, { encoding: "utf-8" }) + debug(`Report written to ${reportPath}`) + + { + debug("Upload report as an artifact...") + let artifactClient = new DefaultArtifactClient() + let { id } = await artifactClient.uploadArtifact("report.md", [reportPath], cwd, { retentionDays: 1 }) + debug(`Report uploaded as an artifact ${id}`) + } debug("Stopping YDB...") await exec(`docker`, [`compose`, `-f`, `compose.yaml`, `down`], { cwd }) debug(`YDB stopped at ${end}`) - saveState("YDB_END_TIME", end.toISOString()) let duration = end.getTime() - start.getTime() debug(`YDB SLO Test duration: ${duration}ms.`) diff --git a/init/src/metrics/default.ts b/init/src/metrics/default.ts new file mode 100644 index 0000000..15938af --- /dev/null +++ b/init/src/metrics/default.ts @@ -0,0 +1,36 @@ +import type { MetricsDefinition } from "./definition"; + +export const defaultMetrics: MetricsDefinition = { + metrics: [ + { + id: "read_latency_ms", + query: `1000 * histogram_quantile(0.95, sum by(ref, le) (rate(sdk_operation_latency_seconds_bucket{operation_type="read"}[2s])))`, + description: "95th percentile read operations latency in milliseconds", + }, + { + id: "write_latency_ms", + query: `1000 * histogram_quantile(0.95, sum by(ref, le) (rate(sdk_operation_latency_seconds_bucket{operation_type="write"}[2s])))`, + description: "95th percentile write operations latency in milliseconds", + }, + { + id: "read_throughput", + query: `sum by(ref) (rate(sdk_operations_total{operation_type="read"}[2s]))`, + description: "Read operations throughput", + }, + { + id: "write_throughput", + query: `sum by(ref) (rate(sdk_operations_total{operation_type="write"}[2s]))`, + description: "Write operations throughput", + }, + { + id: "read_availability", + query: `100 * sum by (ref) (increase(sdk_operations_success_total{operation_type="read"}[2s])) / sum by (ref) (increase(sdk_operations_total{operation_type="read"}[2s]))`, + description: "Read operations availability", + }, + { + id: "write_availability", + query: `100 * sum by (ref) (increase(sdk_operations_success_total{operation_type="write"}[2s])) / sum by (ref) (increase(sdk_operations_total{operation_type="write"}[2s]))`, + description: "Write operations availability", + }, + ] +} diff --git a/init/src/metrics/definition.ts b/init/src/metrics/definition.ts new file mode 100644 index 0000000..c4b023b --- /dev/null +++ b/init/src/metrics/definition.ts @@ -0,0 +1,9 @@ +export type Metric = { + id: string; + query: string; + description?: string; +} + +export type MetricsDefinition = { + metrics: Array +} diff --git a/init/src/metrics/prometheus.ts b/init/src/metrics/prometheus.ts new file mode 100644 index 0000000..3a08682 --- /dev/null +++ b/init/src/metrics/prometheus.ts @@ -0,0 +1,37 @@ +import { PROMETHEUS_URL } from "../constants" +import type { Series } from "../report/chart" +import type { MetricsDefinition } from "./definition" + +export type PrometheusQueryRangeResponse = { + "status": "success" | "error", + "data": { + "resultType": "matrix" | "vector" | "scalar" | "string", + "result": Series[] + }, + "warnings": string[], + "infos": string[], + "error": string, +} + +function queryRange(query: string, start: Date, end: Date) { + let url = new URL("/api/v1/query_range", PROMETHEUS_URL) + url.searchParams.set("query", query) + url.searchParams.set("start", Math.ceil(start.getTime() / 1000).toString()) + url.searchParams.set("end", Math.floor(end.getTime() / 1000).toString()) + url.searchParams.set("step", "1") + + return fetch(url).then(r => r.json()) as Promise +} + +export async function collectPrometheus(start: Date, end: Date, metrics: MetricsDefinition["metrics"]): Promise> { + let results = {} as Record + + for (const m of metrics) { + let { status, data } = await queryRange(m.query, start, end) + if (status !== "success") continue + + results[m.id] = data.result + } + + return results +} diff --git a/init/src/report/chart.ts b/init/src/report/chart.ts new file mode 100644 index 0000000..2b2b02b --- /dev/null +++ b/init/src/report/chart.ts @@ -0,0 +1,65 @@ +import { palette as defaultPalette } from "./colors"; + +export type Series = { + "metric": Record, + "values": [number, string][] // [timestamp (sec), value (float)] +} + +export function renderChart(title: string, series: Series[], palette = defaultPalette): string { + // 1. Filter zeros + let minLength = Number.POSITIVE_INFINITY; + for (const s of series) { + s.values = s.values.filter(v => v[1] != '0'); + if (s.values.length < minLength) minLength = s.values.length; + } + + // 2. Limit values (count) + for (const s of series) { + // Skip first values then adjusting + s.values = s.values.slice(-1 * minLength); + } + + let min = Number.POSITIVE_INFINITY; + let max = Number.NEGATIVE_INFINITY; + + let lines = []; + for (const s of series) { + let line = [] + + for (let [, value] of s.values) { + let v = Math.round(parseFloat(value) * 1000) / 1000; + if (isNaN(v)) { + v = 0; + } + + line.push(v); + + if (v < min) min = v; + if (v > max) max = v; + } + + lines.push(`line [${line.join()}]`); + } + + return `\`\`\`mermaid +--- +config: + xyChart: + width: 1200 + height: 400 + themeVariables: + xyChart: + titleColor: "#222" + backgroundColor: "#fff" + xAxisLineColor: "#222" + yAxisLineColor: "#222" + plotColorPalette: "${palette.join()}" +--- +xychart-beta + title "${title}" + x-axis 0 --> 10 + y-axis ${Math.floor(min * 0.9)} --> ${Math.floor(max * 1.1)} + ${lines.join("\n ")} +\`\`\` +` +} diff --git a/init/src/report/colors.ts b/init/src/report/colors.ts new file mode 100644 index 0000000..1ef8813 --- /dev/null +++ b/init/src/report/colors.ts @@ -0,0 +1,13 @@ +// Tableau 10 +export const palette = [ + "#2CA02C", + "#1F77B4", + "#D62728", + "#FF7F0E", + "#9467BD", + "#8C564B", + "#E377C2", + "#7F7F7F", + "#BCBD22", + "#17BECF" +] diff --git a/init/src/report/default.ts b/init/src/report/default.ts new file mode 100644 index 0000000..b0c8ca5 --- /dev/null +++ b/init/src/report/default.ts @@ -0,0 +1,18 @@ +import { renderChart, type Series } from "./chart"; + +export const renderReport = (sdk: string, metrics: Record) => `# SLO Testing +
Operation Success Rate +${renderChart("operation_type=read", metrics["read_availability"])} +${renderChart("operation_type=write", metrics["write_availability"])} +
+ +
Operations Per Second +${renderChart("operation_type=read", metrics["read_throughput"])} +${renderChart("operation_type=write", metrics["write_throughput"])} +
+ +
95th Percentile Latency +${renderChart("operation_type=read", metrics["read_latency_ms"])} +${renderChart("operation_type=write", metrics["write_latency_ms"])} +
+`