From 038cbd96e23f2937e06492700bb356afa4a7e1be Mon Sep 17 00:00:00 2001 From: michTheBrandofficial Date: Fri, 22 Dec 2023 19:43:45 -0800 Subject: [PATCH] [fixed] adding a dependency to both a signal and a store bug --- dom/index.ts | 19 +- dom/types/index.d.ts | 85 +- package-lock.json | 1089 +- package.json | 7 +- primitives/index.ts | 2 + vite-plugin/parser.js | 125 + vite.config.js.timestamp-1702883827358.mjs | 32097 +++++++++++++++++++ 7 files changed, 33369 insertions(+), 55 deletions(-) create mode 100644 vite-plugin/parser.js create mode 100644 vite.config.js.timestamp-1702883827358.mjs diff --git a/dom/index.ts b/dom/index.ts index 2094b5b..7b92d6a 100644 --- a/dom/index.ts +++ b/dom/index.ts @@ -47,11 +47,10 @@ export const nixixStore = window.$$__NixixStore as GlobalStore; const Nixix = { create: function ( tagNameFC: target, - props: Proptype, - ...children: ChildrenType + props: () => Proptype, + children: () => ChildrenType ): Element | Array | undefined { - !nixixStore.jsx && - ((nixixStore.jsx = true), callEffect(() => (nixixStore.jsx = false))); + nixixStore.jsx = true; let returnedElement: any = null; if (typeof tagNameFC === "string") { if (tagNameFC === "fragment") { @@ -61,11 +60,12 @@ const Nixix = { const element = !SVG_ELEMENTTAGS.includes(tagNameFC) ? document.createElement(tagNameFC) : document.createElementNS(SVG_NAMESPACE, tagNameFC); - setProps(props, element); - setChildren(children, element); + setProps(props?.(), element); + setChildren(children?.(), element); returnedElement = element; } - } else returnedElement = buildComponent(tagNameFC, props, children); + } else returnedElement = buildComponent(tagNameFC, props?.(), children?.()); + nixixStore.jsx = false return returnedElement; }, handleDirectives: handleDirectives_, @@ -228,6 +228,7 @@ function buildComponent( ) { let returnedElement: any = null; if (isFunction(tagNameFC)) { + nixixStore.jsx = false const artificialProps = props || {}; Boolean(children?.length) && (artificialProps.children = children); returnedElement = (tagNameFC as Function)(artificialProps); @@ -269,5 +270,7 @@ function turnOnJsx() { nixixStore.jsx = true; } +const create = Nixix.create; + export default Nixix; -export { render, setAttribute, turnOnJsx, removeNode }; +export { create, render, setAttribute, turnOnJsx, removeNode }; diff --git a/dom/types/index.d.ts b/dom/types/index.d.ts index 394ada8..5aface0 100644 --- a/dom/types/index.d.ts +++ b/dom/types/index.d.ts @@ -1,46 +1,19 @@ -import { LiveFragment } from '../../live-fragment/types'; -import { NixixNode } from '../../types/index' -/** - * jsxFactory - Nixix.create() - */ -declare const Nixix: { - create: ( - target: T | ((props: {}) => JSX.Element) | 'fragment', - props: JSX.IntrinsicElements[T] | null, - ...children: (string | Node)[] - ) => Element; -}; - -type RenderConfig = { - commentForLF: boolean -} -/** - * render function - * @param element JSX.Element to render - * @param root element which element will be appended to - */ -export function render(element: NixixNode | (() => NixixNode), root: HTMLElement, { - commentForLF -}?: RenderConfig): void; - -/** - * This function should be used to remove nodes, it also removes reactions and signals from the nodes, thereby helping in garbage collection of dom nodes. - */ -export function removeNode(node: Element | Text): boolean; +import { LiveFragment } from "../../live-fragment/types"; +import Nixix from "../../types/index"; type RouteType = { element?: any; - path?: `/${string}` -} + path?: `/${string}`; +}; interface $$__NixixStore { - $$__lastReactionProvider?: 'signal' | 'store'; + $$__lastReactionProvider?: "signal" | "store"; commentForLF: boolean; $$__routeStore?: { errorRoute?: RouteType; provider?: LiveFragment; routeMatch?: { - route: RouteType + route: RouteType; }; redirect?: string | null; currentRoute?: RouteType; @@ -60,11 +33,45 @@ interface $$__NixixStore { jsx?: boolean; } -export const nixixStore: $$__NixixStore; +declare module '../../types/index.d.ts' { + const nixixStore: $$__NixixStore; + /** + * @deprecated PLEASE DO NOT USE THIS FUNCTION + */ + function getStoreValue(store: any): any; -/** - * @deprecated PLEASE DO NOT USE THIS FUNCTION - */ -export function getStoreValue(store: any): any; + type Tagname = | keyof HTMLElementTagNameMap + | keyof SVGElementTagNameMap + | JSXElementConstructor + | 'fragment'; + + function create( + tagNameFC: T, + // @ts-ignore + props: () => JSX.IntrinsicElements[T], + children?: () => NixixNode[] + ): NixixNode + + type RenderConfig = { + commentForLF: boolean; + }; + + /** + * render function + * @param element JSX.Element to render + * @param root element which element will be appended to + */ + function render( + element: NixixNode | (() => NixixNode), + root: HTMLElement, + { commentForLF }?: RenderConfig + ): void; + + /** + * This function should be used to remove nodes, it also removes reactions and signals from the nodes, thereby helping in garbage collection of dom nodes. + */ + function removeNode(node: Element | Text): boolean; +} -export default Nixix; +export as namespace Nixix; +export = Nixix; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7596217..9b77867 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,313 @@ { "name": "nixix", - "version": "2.0.7", + "version": "2.0.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nixix", - "version": "2.0.7", + "version": "2.0.9", "license": "MIT", "dependencies": { + "@babel/core": "^7.23.6", "@remix-run/router": "^1.12.0", + "@rollup/pluginutils": "^5.1.0", "csstype": "latest", "vite": "latest", "vite-jsconfig-paths": "latest" + }, + "devDependencies": { + "@types/babel__core": "^7.20.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@cush/relative": { @@ -350,6 +645,49 @@ "node": ">=12" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@remix-run/router": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.12.0.tgz", @@ -358,11 +696,89 @@ "node": ">=14.0.0" } }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -419,6 +835,69 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -447,6 +926,19 @@ "fsevents": "~2.3.2" } }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -460,6 +952,11 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", @@ -481,6 +978,11 @@ } } }, + "node_modules/electron-to-chromium": { + "version": "1.4.614", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", + "integrity": "sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ==" + }, "node_modules/esbuild": { "version": "0.17.14", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.14.tgz", @@ -517,6 +1019,27 @@ "@esbuild/win32-x64": "0.17.14" } }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -553,6 +1076,14 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -590,6 +1121,14 @@ "resolved": "https://registry.npmjs.org/glob-regex/-/glob-regex-0.3.2.tgz", "integrity": "sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw==" }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/globrex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", @@ -606,6 +1145,14 @@ "node": ">= 0.4.0" } }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, "node_modules/immutable": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", @@ -684,6 +1231,22 @@ "node": ">=0.12.0" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -700,6 +1263,14 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -751,6 +1322,11 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -799,8 +1375,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "optional": true, - "peer": true, "engines": { "node": ">=8.6" }, @@ -913,6 +1487,14 @@ "node": ">=14.0.0" } }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -957,6 +1539,17 @@ "node": ">=8" } }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -987,6 +1580,14 @@ "node": ">=0.8" } }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1021,6 +1622,35 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/vite": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", @@ -1087,9 +1717,224 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } }, "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "requires": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + } + }, + "@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==" + }, + "@babel/core": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + } + } + }, + "@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "requires": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "requires": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + }, + "@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" + }, + "@babel/helpers": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "requires": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" + } + }, + "@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==" + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, "@cush/relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@cush/relative/-/relative-1.0.0.tgz", @@ -1227,16 +2072,114 @@ "integrity": "sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==", "optional": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "@remix-run/router": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.12.0.tgz", "integrity": "sha512-2hXv036Bux90e1GXTWSMfNzfDDK8LA8JYEWfyHxzvwdp6GyoWEovKc9cotb3KCKmkdwsIBuFGX7ScTWyiHv7Eg==" }, + "@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -1284,6 +2227,32 @@ "fill-range": "^7.0.1" } }, + "browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "requires": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + } + }, + "caniuse-lite": { + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -1301,6 +2270,19 @@ "readdirp": "~3.6.0" } }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -1311,6 +2293,11 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, "csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", @@ -1324,6 +2311,11 @@ "ms": "2.1.2" } }, + "electron-to-chromium": { + "version": "1.4.614", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz", + "integrity": "sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ==" + }, "esbuild": { "version": "0.17.14", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.14.tgz", @@ -1353,6 +2345,21 @@ "@esbuild/win32-x64": "0.17.14" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1379,6 +2386,11 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -1407,6 +2419,11 @@ "resolved": "https://registry.npmjs.org/glob-regex/-/glob-regex-0.3.2.tgz", "integrity": "sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw==" }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, "globrex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", @@ -1420,6 +2437,11 @@ "function-bind": "^1.1.1" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, "immutable": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", @@ -1483,6 +2505,16 @@ "optional": true, "peer": true }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, "json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -1496,6 +2528,14 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1529,6 +2569,11 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" }, + "node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1567,9 +2612,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "optional": true, - "peer": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pirates": { "version": "4.0.5", @@ -1638,6 +2681,11 @@ "source-map-js": ">=0.6.2 <2.0.0" } }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -1666,6 +2714,14 @@ "ts-interface-checker": "^0.1.9" } }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -1687,6 +2743,11 @@ "thenify": ">= 3.1.0 < 4" } }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1718,6 +2779,15 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "vite": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", @@ -1745,6 +2815,11 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } } diff --git a/package.json b/package.json index f6a29cb..172daab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nixix", - "version": "2.0.9", + "version": "2.0.10", "description": "NixixJS is a lightweight JavaScript Library used for building reactive User Interfaces.", "main": "./dom/index.ts", "module": "./dom/index.ts", @@ -18,9 +18,14 @@ "author": "Charles Ikechukwu", "license": "MIT", "dependencies": { + "@babel/core": "^7.23.6", "@remix-run/router": "^1.12.0", + "@rollup/pluginutils": "^5.1.0", "csstype": "latest", "vite": "latest", "vite-jsconfig-paths": "latest" + }, + "devDependencies": { + "@types/babel__core": "^7.20.5" } } diff --git a/primitives/index.ts b/primitives/index.ts index dfad9be..1f95721 100644 --- a/primitives/index.ts +++ b/primitives/index.ts @@ -139,8 +139,10 @@ function pushFurtherDeps( switch (dep instanceof Signal) { case true: pushInEffects(callbackFn, id, "SignalStore"); + break; case false: pushInEffects(callbackFn, id, "Store"); + break; } }); }); diff --git a/vite-plugin/parser.js b/vite-plugin/parser.js new file mode 100644 index 0000000..4a80167 --- /dev/null +++ b/vite-plugin/parser.js @@ -0,0 +1,125 @@ +import { transformSync, types as t } from "@babel/core"; + +/** + * @typedef {import('vite').Plugin } Plugin + */ + +/* +export default function (babel) { + const { types: t } = babel; + + return { + name: "ast-transform", // not required + visitor: { + JSXOpeningElement(path) { + const propsNode = path.get("attributes"); + + const newPropsNode = t.arrowFunctionExpression( + [], + // if the props are there, create them, else, make the func return null + + !propsNode.length + ? t.nullLiteral() + : t.objectExpression( + propsNode.map((attr) => { + const key = t.isJSXIdentifier(attr.node.name) ? t.stringLiteral(attr.node.name.name) : t.cloneNode(attr.node.name); + + const value = t.isJSXExpressionContainer(attr.node.value) + ? attr.node.value.expression + : t.cloneNode(attr.node.value); + return t.objectProperty(key, value); + }) + ) + ); + + const childrenNode = path.parentPath.get("children"); + + const newChildrenNode = t.arrowFunctionExpression( + [], + t.arrayExpression(childrenNode.map((child) => { + let returnedValue = ''; + t.isJSXText(child.node) && (returnedValue = t.stringLiteral(child.node.value)); + t.isJSXExpressionContainer(child.node) ? (returnedValue = child.node.expression) : child.node + return (t.isJSXText + })), + false + ); + + path.pushContainer("attributes", newPropsNode); + } + } + }; +} + +*?/ + +import { createFilter } from "@rollup/pluginutils"; + +/** + * <> jaj + * target --> (Nixix.create('fragment', () => null, () => ['jaj', Nixix.create(View, () => null)])) + * + * @returns {import('@types/babel__core').PluginItem} + */ +function babelPlugin() { + return { + name: "custom-reactive-plugin", + visitor: { + JSXOpeningElement(path) { + const propsNode = path.get("attributes"); + if (!propsNode.length) return; + console.log(propsNode[0].node.name.name) + + // attr.node.name.name, attr.node.value + + const newPropsNode = t.jsxAttribute( + t.jsxIdentifier("props"), + t.jsxExpressionContainer( + // make an arrowFunctionExpression + t.arrowFunctionExpression( + [], + t.objectExpression(propsNode.map((attr) => t.objectProperty(attr.node.name, attr.node.value))) + ) + ) + + ); + t.stringl + + // path.pushContainer("attributes", newPropsNode); + }, + } + JSXSpreadChild(path) { + path.node + } + } + } +} + +/** + * @param {{exclude?: string[], include?: string[]}} options + */ +export function nixixPlugin(options = {}) { + const filter = createFilter(options.include || [], options.exclude || []); + /** + * @type Plugin + */ + const plugin = { + name: "nixix:store-reactivity", + enforce: "pre", + transform: (code, id) => { + if ( + !/\.jsx/.test(id) || + !/\.tsx/.test(id) || + id.includes("node_modules") || + id.includes("?worker") || + !filter(id) + ) + return; + + const { ast } = transformSync(code, { ast: true, plugins: [babelPlugin + ()]}) || {}; + }, + }; + + return [plugin]; +} diff --git a/vite.config.js.timestamp-1702883827358.mjs b/vite.config.js.timestamp-1702883827358.mjs new file mode 100644 index 0000000..b8d018b --- /dev/null +++ b/vite.config.js.timestamp-1702883827358.mjs @@ -0,0 +1,32097 @@ +var __getOwnPropNames = Object.getOwnPropertyNames; +var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; +}; + +// node_modules/vite/dist/node/constants.js +import path, { resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { readFileSync } from "node:fs"; +var __vite_injected_original_import_meta_url, version, CSS_LANGS_RE, FS_PREFIX, VALID_ID_PREFIX, CLIENT_PUBLIC_PATH, ENV_PUBLIC_PATH, VITE_PACKAGE_DIR, CLIENT_ENTRY, ENV_ENTRY, CLIENT_DIR, KNOWN_ASSET_TYPES, DEFAULT_ASSETS_RE; +var init_constants = __esm({ + "node_modules/vite/dist/node/constants.js"() { + __vite_injected_original_import_meta_url = "file:///C:/Users/Charles/Desktop/My%20finished%20projects/Nixix/node_modules/vite/dist/node/constants.js"; + ({ version } = JSON.parse(readFileSync(new URL("../../package.json", __vite_injected_original_import_meta_url)).toString())); + CSS_LANGS_RE = /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/; + FS_PREFIX = `/@fs/`; + VALID_ID_PREFIX = `/@id/`; + CLIENT_PUBLIC_PATH = `/@vite/client`; + ENV_PUBLIC_PATH = `/@vite/env`; + VITE_PACKAGE_DIR = resolve( + // import.meta.url is `dist/node/constants.js` after bundle + fileURLToPath(__vite_injected_original_import_meta_url), + "../../.." + ); + CLIENT_ENTRY = resolve(VITE_PACKAGE_DIR, "dist/client/client.mjs"); + ENV_ENTRY = resolve(VITE_PACKAGE_DIR, "dist/client/env.mjs"); + CLIENT_DIR = path.dirname(CLIENT_ENTRY); + KNOWN_ASSET_TYPES = [ + // images + "png", + "jpe?g", + "jfif", + "pjpeg", + "pjp", + "gif", + "svg", + "ico", + "webp", + "avif", + // media + "mp4", + "webm", + "ogg", + "mp3", + "wav", + "flac", + "aac", + // fonts + "woff2?", + "eot", + "ttf", + "otf", + // other + "webmanifest", + "pdf", + "txt" + ]; + DEFAULT_ASSETS_RE = new RegExp(`\\.(` + KNOWN_ASSET_TYPES.join("|") + `)(\\?.*)?$`); + } +}); + +// node_modules/vite/dist/node/chunks/dep-79892de8.js +import fs$l, { promises as promises$2 } from "node:fs"; +import path$o, { posix as posix$1, isAbsolute as isAbsolute$2, join as join$2, relative as relative$2, dirname as dirname$2, basename as basename$2, extname as extname$1 } from "node:path"; +import { URL as URL$3, URLSearchParams, parse as parse$i, pathToFileURL } from "node:url"; +import { createRequire as createRequire$1, builtinModules } from "node:module"; +import require$$0$3 from "tty"; +import esbuild, { transform as transform$2, formatMessages, build as build$3 } from "file:///C:/Users/Charles/Desktop/My%20finished%20projects/Nixix/node_modules/esbuild/lib/main.js"; +import require$$0$4, { win32, posix, isAbsolute as isAbsolute$1, resolve as resolve$3, relative as relative$1, basename as basename$1, extname, dirname as dirname$1, join as join$1, sep, normalize } from "path"; +import require$$0__default, { existsSync, readFileSync as readFileSync2, statSync as statSync$1, promises as promises$1, readdirSync } from "fs"; +import require$$0$5 from "events"; +import require$$5 from "assert"; +import require$$0$6 from "util"; +import require$$3$2 from "net"; +import require$$0$9 from "url"; +import require$$1$1 from "http"; +import require$$0$7 from "stream"; +import require$$2 from "os"; +import require$$2$1 from "child_process"; +import os$3 from "node:os"; +import { promisify as promisify$4, format as format$2, inspect } from "node:util"; +import resolve$4 from "file:///C:/Users/Charles/Desktop/My%20finished%20projects/Nixix/node_modules/resolve/index.js"; +import require$$5$1 from "crypto"; +import { Buffer as Buffer$1 } from "node:buffer"; +import require$$0$8, { createRequire as createRequire$2 } from "module"; +import assert$1 from "node:assert"; +import process$1 from "node:process"; +import v8 from "node:v8"; +import require$$1 from "worker_threads"; +import require$$0$a from "zlib"; +import require$$0$b from "buffer"; +import require$$1$2 from "https"; +import require$$4 from "tls"; +import { VERSION as VERSION2 } from "file:///C:/Users/Charles/Desktop/My%20finished%20projects/Nixix/node_modules/rollup/dist/es/rollup.js"; +import { fileURLToPath as __cjs_fileURLToPath } from "node:url"; +import { dirname as __cjs_dirname } from "node:path"; +import { createRequire as __cjs_createRequire } from "node:module"; +function getDefaultExportFromCjs(x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; +} +function getAugmentedNamespace(n) { + if (n.__esModule) + return n; + var f = n.default; + if (typeof f == "function") { + var a = function a2() { + if (this instanceof a2) { + var args = [null]; + args.push.apply(args, arguments); + var Ctor = Function.bind.apply(f, args); + return new Ctor(); + } + return f.apply(this, arguments); + }; + a.prototype = f.prototype; + } else + a = {}; + Object.defineProperty(a, "__esModule", { value: true }); + Object.keys(n).forEach(function(k) { + var d = Object.getOwnPropertyDescriptor(n, k); + Object.defineProperty(a, k, d.get ? d : { + enumerable: true, + get: function() { + return n[k]; + } + }); + }); + return a; +} +function rethrow() { + var callback; + if (DEBUG$1) { + var backtrace = new Error(); + callback = debugCallback; + } else + callback = missingCallback; + return callback; + function debugCallback(err) { + if (err) { + backtrace.message = err.message; + err = backtrace; + missingCallback(err); + } + } + function missingCallback(err) { + if (err) { + if (process.throwDeprecation) + throw err; + else if (!process.noDeprecation) { + var msg = "fs: missing callback " + (err.stack || err.message); + if (process.traceDeprecation) + console.trace(msg); + else + console.error(msg); + } + } + } +} +function maybeCallback(cb) { + return typeof cb === "function" ? cb : rethrow(); +} +function newError(er) { + return er && er.syscall === "realpath" && (er.code === "ELOOP" || er.code === "ENOMEM" || er.code === "ENAMETOOLONG"); +} +function realpath$2(p, cache, cb) { + if (ok) { + return origRealpath(p, cache, cb); + } + if (typeof cache === "function") { + cb = cache; + cache = null; + } + origRealpath(p, cache, function(er, result) { + if (newError(er)) { + old.realpath(p, cache, cb); + } else { + cb(er, result); + } + }); +} +function realpathSync2(p, cache) { + if (ok) { + return origRealpathSync(p, cache); + } + try { + return origRealpathSync(p, cache); + } catch (er) { + if (newError(er)) { + return old.realpathSync(p, cache); + } else { + throw er; + } + } +} +function monkeypatch() { + fs$j.realpath = realpath$2; + fs$j.realpathSync = realpathSync2; +} +function unmonkeypatch() { + fs$j.realpath = origRealpath; + fs$j.realpathSync = origRealpathSync; +} +function balanced$1(a, b, str) { + if (a instanceof RegExp) + a = maybeMatch(a, str); + if (b instanceof RegExp) + b = maybeMatch(b, str); + var r = range$1(a, b, str); + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} +function range$1(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + if (ai >= 0 && bi > 0) { + if (a === b) { + return [ai, bi]; + } + begs = []; + left = str.length; + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [begs.pop(), bi]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + bi = str.indexOf(b, i + 1); + } + i = ai < bi && ai >= 0 ? ai : bi; + } + if (begs.length) { + result = [left, right]; + } + } + return result; +} +function numeric(str) { + return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0); +} +function escapeBraces(str) { + return str.split("\\\\").join(escSlash).split("\\{").join(escOpen).split("\\}").join(escClose).split("\\,").join(escComma).split("\\.").join(escPeriod); +} +function unescapeBraces(str) { + return str.split(escSlash).join("\\").split(escOpen).join("{").split(escClose).join("}").split(escComma).join(",").split(escPeriod).join("."); +} +function parseCommaParts(str) { + if (!str) + return [""]; + var parts = []; + var m = balanced("{", "}", str); + if (!m) + return str.split(","); + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(","); + p[p.length - 1] += "{" + body + "}"; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length - 1] += postParts.shift(); + p.push.apply(p, postParts); + } + parts.push.apply(parts, p); + return parts; +} +function expandTop(str) { + if (!str) + return []; + if (str.substr(0, 2) === "{}") { + str = "\\{\\}" + str.substr(2); + } + return expand$4(escapeBraces(str), true).map(unescapeBraces); +} +function embrace(str) { + return "{" + str + "}"; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} +function expand$4(str, isTop) { + var expansions = []; + var m = balanced("{", "}", str); + if (!m) + return [str]; + var pre = m.pre; + var post = m.post.length ? expand$4(m.post, false) : [""]; + if (/\$$/.test(m.pre)) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + "{" + m.body + "}" + post[k]; + expansions.push(expansion); + } + } else { + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(",") >= 0; + if (!isSequence && !isOptions) { + if (m.post.match(/,.*\}/)) { + str = m.pre + "{" + m.body + escClose + m.post; + return expand$4(str); + } + return [str]; + } + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + n = expand$4(n[0], false).map(embrace); + if (n.length === 1) { + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + var N; + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length); + var incr = n.length == 3 ? Math.abs(numeric(n[2])) : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad2 = n.some(isPadded); + N = []; + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === "\\") + c = ""; + } else { + c = String(i); + if (pad2) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join("0"); + if (i < 0) + c = "-" + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = []; + for (var j = 0; j < n.length; j++) { + N.push.apply(N, expand$4(n[j], false)); + } + } + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + } + return expansions; +} +function requireInherits_browser() { + if (hasRequiredInherits_browser) + return inherits_browserExports; + hasRequiredInherits_browser = 1; + if (typeof Object.create === "function") { + inherits_browser.exports = function inherits2(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + } + }; + } else { + inherits_browser.exports = function inherits2(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + }; + } + return inherits_browserExports; +} +function ownProp(obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field); +} +function alphasort(a, b) { + return a.localeCompare(b, "en"); +} +function setupIgnores(self2, options2) { + self2.ignore = options2.ignore || []; + if (!Array.isArray(self2.ignore)) + self2.ignore = [self2.ignore]; + if (self2.ignore.length) { + self2.ignore = self2.ignore.map(ignoreMap); + } +} +function ignoreMap(pattern2) { + var gmatcher = null; + if (pattern2.slice(-3) === "/**") { + var gpattern = pattern2.replace(/(\/\*\*)+$/, ""); + gmatcher = new Minimatch2(gpattern, { dot: true }); + } + return { + matcher: new Minimatch2(pattern2, { dot: true }), + gmatcher + }; +} +function setopts(self2, pattern2, options2) { + if (!options2) + options2 = {}; + if (options2.matchBase && -1 === pattern2.indexOf("/")) { + if (options2.noglobstar) { + throw new Error("base matching requires globstar"); + } + pattern2 = "**/" + pattern2; + } + self2.silent = !!options2.silent; + self2.pattern = pattern2; + self2.strict = options2.strict !== false; + self2.realpath = !!options2.realpath; + self2.realpathCache = options2.realpathCache || /* @__PURE__ */ Object.create(null); + self2.follow = !!options2.follow; + self2.dot = !!options2.dot; + self2.mark = !!options2.mark; + self2.nodir = !!options2.nodir; + if (self2.nodir) + self2.mark = true; + self2.sync = !!options2.sync; + self2.nounique = !!options2.nounique; + self2.nonull = !!options2.nonull; + self2.nosort = !!options2.nosort; + self2.nocase = !!options2.nocase; + self2.stat = !!options2.stat; + self2.noprocess = !!options2.noprocess; + self2.absolute = !!options2.absolute; + self2.fs = options2.fs || fs$i; + self2.maxLength = options2.maxLength || Infinity; + self2.cache = options2.cache || /* @__PURE__ */ Object.create(null); + self2.statCache = options2.statCache || /* @__PURE__ */ Object.create(null); + self2.symlinks = options2.symlinks || /* @__PURE__ */ Object.create(null); + setupIgnores(self2, options2); + self2.changedCwd = false; + var cwd = process.cwd(); + if (!ownProp(options2, "cwd")) + self2.cwd = path$i.resolve(cwd); + else { + self2.cwd = path$i.resolve(options2.cwd); + self2.changedCwd = self2.cwd !== cwd; + } + self2.root = options2.root || path$i.resolve(self2.cwd, "/"); + self2.root = path$i.resolve(self2.root); + self2.cwdAbs = isAbsolute(self2.cwd) ? self2.cwd : makeAbs(self2, self2.cwd); + self2.nomount = !!options2.nomount; + if (process.platform === "win32") { + self2.root = self2.root.replace(/\\/g, "/"); + self2.cwd = self2.cwd.replace(/\\/g, "/"); + self2.cwdAbs = self2.cwdAbs.replace(/\\/g, "/"); + } + options2.nonegate = true; + options2.nocomment = true; + options2.allowWindowsEscape = true; + self2.minimatch = new Minimatch2(pattern2, options2); + self2.options = self2.minimatch.options; +} +function finish(self2) { + var nou = self2.nounique; + var all = nou ? [] : /* @__PURE__ */ Object.create(null); + for (var i = 0, l = self2.matches.length; i < l; i++) { + var matches = self2.matches[i]; + if (!matches || Object.keys(matches).length === 0) { + if (self2.nonull) { + var literal2 = self2.minimatch.globSet[i]; + if (nou) + all.push(literal2); + else + all[literal2] = true; + } + } else { + var m = Object.keys(matches); + if (nou) + all.push.apply(all, m); + else + m.forEach(function(m2) { + all[m2] = true; + }); + } + } + if (!nou) + all = Object.keys(all); + if (!self2.nosort) + all = all.sort(alphasort); + if (self2.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self2._mark(all[i]); + } + if (self2.nodir) { + all = all.filter(function(e) { + var notDir = !/\/$/.test(e); + var c = self2.cache[e] || self2.cache[makeAbs(self2, e)]; + if (notDir && c) + notDir = c !== "DIR" && !Array.isArray(c); + return notDir; + }); + } + } + if (self2.ignore.length) + all = all.filter(function(m2) { + return !isIgnored(self2, m2); + }); + self2.found = all; +} +function mark(self2, p) { + var abs = makeAbs(self2, p); + var c = self2.cache[abs]; + var m = p; + if (c) { + var isDir = c === "DIR" || Array.isArray(c); + var slash2 = p.slice(-1) === "/"; + if (isDir && !slash2) + m += "/"; + else if (!isDir && slash2) + m = m.slice(0, -1); + if (m !== p) { + var mabs = makeAbs(self2, m); + self2.statCache[mabs] = self2.statCache[abs]; + self2.cache[mabs] = self2.cache[abs]; + } + } + return m; +} +function makeAbs(self2, f) { + var abs = f; + if (f.charAt(0) === "/") { + abs = path$i.join(self2.root, f); + } else if (isAbsolute(f) || f === "") { + abs = f; + } else if (self2.changedCwd) { + abs = path$i.resolve(self2.cwd, f); + } else { + abs = path$i.resolve(f); + } + if (process.platform === "win32") + abs = abs.replace(/\\/g, "/"); + return abs; +} +function isIgnored(self2, path3) { + if (!self2.ignore.length) + return false; + return self2.ignore.some(function(item) { + return item.matcher.match(path3) || !!(item.gmatcher && item.gmatcher.match(path3)); + }); +} +function childrenIgnored(self2, path3) { + if (!self2.ignore.length) + return false; + return self2.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path3)); + }); +} +function requireSync() { + if (hasRequiredSync) + return sync$9; + hasRequiredSync = 1; + sync$9 = globSync; + globSync.GlobSync = GlobSync; + var rp = fs_realpath; + var minimatch2 = minimatch_1; + requireGlob().Glob; + var path3 = require$$0$4; + var assert2 = require$$5; + var isAbsolute2 = require$$0$4.isAbsolute; + var common2 = common$c; + var setopts2 = common2.setopts; + var ownProp2 = common2.ownProp; + var childrenIgnored2 = common2.childrenIgnored; + var isIgnored2 = common2.isIgnored; + function globSync(pattern2, options2) { + if (typeof options2 === "function" || arguments.length === 3) + throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167"); + return new GlobSync(pattern2, options2).found; + } + function GlobSync(pattern2, options2) { + if (!pattern2) + throw new Error("must provide pattern"); + if (typeof options2 === "function" || arguments.length === 3) + throw new TypeError("callback provided to sync glob\nSee: https://github.com/isaacs/node-glob/issues/167"); + if (!(this instanceof GlobSync)) + return new GlobSync(pattern2, options2); + setopts2(this, pattern2, options2); + if (this.noprocess) + return this; + var n = this.minimatch.set.length; + this.matches = new Array(n); + for (var i = 0; i < n; i++) { + this._process(this.minimatch.set[i], i, false); + } + this._finish(); + } + GlobSync.prototype._finish = function() { + assert2.ok(this instanceof GlobSync); + if (this.realpath) { + var self2 = this; + this.matches.forEach(function(matchset, index) { + var set2 = self2.matches[index] = /* @__PURE__ */ Object.create(null); + for (var p in matchset) { + try { + p = self2._makeAbs(p); + var real = rp.realpathSync(p, self2.realpathCache); + set2[real] = true; + } catch (er) { + if (er.syscall === "stat") + set2[self2._makeAbs(p)] = true; + else + throw er; + } + } + }); + } + common2.finish(this); + }; + GlobSync.prototype._process = function(pattern2, index, inGlobStar) { + assert2.ok(this instanceof GlobSync); + var n = 0; + while (typeof pattern2[n] === "string") { + n++; + } + var prefix; + switch (n) { + case pattern2.length: + this._processSimple(pattern2.join("/"), index); + return; + case 0: + prefix = null; + break; + default: + prefix = pattern2.slice(0, n).join("/"); + break; + } + var remain = pattern2.slice(n); + var read2; + if (prefix === null) + read2 = "."; + else if (isAbsolute2(prefix) || isAbsolute2(pattern2.map(function(p) { + return typeof p === "string" ? p : "[*]"; + }).join("/"))) { + if (!prefix || !isAbsolute2(prefix)) + prefix = "/" + prefix; + read2 = prefix; + } else + read2 = prefix; + var abs = this._makeAbs(read2); + if (childrenIgnored2(this, read2)) + return; + var isGlobStar = remain[0] === minimatch2.GLOBSTAR; + if (isGlobStar) + this._processGlobStar(prefix, read2, abs, remain, index, inGlobStar); + else + this._processReaddir(prefix, read2, abs, remain, index, inGlobStar); + }; + GlobSync.prototype._processReaddir = function(prefix, read2, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar); + if (!entries) + return; + var pn = remain[0]; + var negate = !!this.minimatch.negate; + var rawGlob = pn._glob; + var dotOk = this.dot || rawGlob.charAt(0) === "."; + var matchedEntries = []; + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (e.charAt(0) !== "." || dotOk) { + var m; + if (negate && !prefix) { + m = !e.match(pn); + } else { + m = e.match(pn); + } + if (m) + matchedEntries.push(e); + } + } + var len = matchedEntries.length; + if (len === 0) + return; + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + if (prefix) { + if (prefix.slice(-1) !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + if (e.charAt(0) === "/" && !this.nomount) { + e = path3.join(this.root, e); + } + this._emitMatch(index, e); + } + return; + } + remain.shift(); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + var newPattern; + if (prefix) + newPattern = [prefix, e]; + else + newPattern = [e]; + this._process(newPattern.concat(remain), index, inGlobStar); + } + }; + GlobSync.prototype._emitMatch = function(index, e) { + if (isIgnored2(this, e)) + return; + var abs = this._makeAbs(e); + if (this.mark) + e = this._mark(e); + if (this.absolute) { + e = abs; + } + if (this.matches[index][e]) + return; + if (this.nodir) { + var c = this.cache[abs]; + if (c === "DIR" || Array.isArray(c)) + return; + } + this.matches[index][e] = true; + if (this.stat) + this._stat(e); + }; + GlobSync.prototype._readdirInGlobStar = function(abs) { + if (this.follow) + return this._readdir(abs, false); + var entries; + var lstat2; + try { + lstat2 = this.fs.lstatSync(abs); + } catch (er) { + if (er.code === "ENOENT") { + return null; + } + } + var isSym = lstat2 && lstat2.isSymbolicLink(); + this.symlinks[abs] = isSym; + if (!isSym && lstat2 && !lstat2.isDirectory()) + this.cache[abs] = "FILE"; + else + entries = this._readdir(abs, false); + return entries; + }; + GlobSync.prototype._readdir = function(abs, inGlobStar) { + if (inGlobStar && !ownProp2(this.symlinks, abs)) + return this._readdirInGlobStar(abs); + if (ownProp2(this.cache, abs)) { + var c = this.cache[abs]; + if (!c || c === "FILE") + return null; + if (Array.isArray(c)) + return c; + } + try { + return this._readdirEntries(abs, this.fs.readdirSync(abs)); + } catch (er) { + this._readdirError(abs, er); + return null; + } + }; + GlobSync.prototype._readdirEntries = function(abs, entries) { + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (abs === "/") + e = abs + e; + else + e = abs + "/" + e; + this.cache[e] = true; + } + } + this.cache[abs] = entries; + return entries; + }; + GlobSync.prototype._readdirError = function(f, er) { + switch (er.code) { + case "ENOTSUP": + case "ENOTDIR": + var abs = this._makeAbs(f); + this.cache[abs] = "FILE"; + if (abs === this.cwdAbs) { + var error2 = new Error(er.code + " invalid cwd " + this.cwd); + error2.path = this.cwd; + error2.code = er.code; + throw error2; + } + break; + case "ENOENT": + case "ELOOP": + case "ENAMETOOLONG": + case "UNKNOWN": + this.cache[this._makeAbs(f)] = false; + break; + default: + this.cache[this._makeAbs(f)] = false; + if (this.strict) + throw er; + if (!this.silent) + console.error("glob error", er); + break; + } + }; + GlobSync.prototype._processGlobStar = function(prefix, read2, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar); + if (!entries) + return; + var remainWithoutGlobStar = remain.slice(1); + var gspref = prefix ? [prefix] : []; + var noGlobStar = gspref.concat(remainWithoutGlobStar); + this._process(noGlobStar, index, false); + var len = entries.length; + var isSym = this.symlinks[abs]; + if (isSym && inGlobStar) + return; + for (var i = 0; i < len; i++) { + var e = entries[i]; + if (e.charAt(0) === "." && !this.dot) + continue; + var instead = gspref.concat(entries[i], remainWithoutGlobStar); + this._process(instead, index, true); + var below = gspref.concat(entries[i], remain); + this._process(below, index, true); + } + }; + GlobSync.prototype._processSimple = function(prefix, index) { + var exists = this._stat(prefix); + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + if (!exists) + return; + if (prefix && isAbsolute2(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix); + if (prefix.charAt(0) === "/") { + prefix = path3.join(this.root, prefix); + } else { + prefix = path3.resolve(this.root, prefix); + if (trail) + prefix += "/"; + } + } + if (process.platform === "win32") + prefix = prefix.replace(/\\/g, "/"); + this._emitMatch(index, prefix); + }; + GlobSync.prototype._stat = function(f) { + var abs = this._makeAbs(f); + var needDir = f.slice(-1) === "/"; + if (f.length > this.maxLength) + return false; + if (!this.stat && ownProp2(this.cache, abs)) { + var c = this.cache[abs]; + if (Array.isArray(c)) + c = "DIR"; + if (!needDir || c === "DIR") + return c; + if (needDir && c === "FILE") + return false; + } + var stat2 = this.statCache[abs]; + if (!stat2) { + var lstat2; + try { + lstat2 = this.fs.lstatSync(abs); + } catch (er) { + if (er && (er.code === "ENOENT" || er.code === "ENOTDIR")) { + this.statCache[abs] = false; + return false; + } + } + if (lstat2 && lstat2.isSymbolicLink()) { + try { + stat2 = this.fs.statSync(abs); + } catch (er) { + stat2 = lstat2; + } + } else { + stat2 = lstat2; + } + } + this.statCache[abs] = stat2; + var c = true; + if (stat2) + c = stat2.isDirectory() ? "DIR" : "FILE"; + this.cache[abs] = this.cache[abs] || c; + if (needDir && c === "FILE") + return false; + return c; + }; + GlobSync.prototype._mark = function(p) { + return common2.mark(this, p); + }; + GlobSync.prototype._makeAbs = function(f) { + return common2.makeAbs(this, f); + }; + return sync$9; +} +function wrappy$2(fn, cb) { + if (fn && cb) + return wrappy$2(fn)(cb); + if (typeof fn !== "function") + throw new TypeError("need wrapper function"); + Object.keys(fn).forEach(function(k) { + wrapper[k] = fn[k]; + }); + return wrapper; + function wrapper() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + var ret = fn.apply(this, args); + var cb2 = args[args.length - 1]; + if (typeof ret === "function" && ret !== cb2) { + Object.keys(cb2).forEach(function(k) { + ret[k] = cb2[k]; + }); + } + return ret; + } +} +function once$1(fn) { + var f = function() { + if (f.called) + return f.value; + f.called = true; + return f.value = fn.apply(this, arguments); + }; + f.called = false; + return f; +} +function onceStrict(fn) { + var f = function() { + if (f.called) + throw new Error(f.onceError); + f.called = true; + return f.value = fn.apply(this, arguments); + }; + var name2 = fn.name || "Function wrapped with `once`"; + f.onceError = name2 + " shouldn't be called more than once"; + f.called = false; + return f; +} +function inflight(key, cb) { + if (reqs[key]) { + reqs[key].push(cb); + return null; + } else { + reqs[key] = [cb]; + return makeres(key); + } +} +function makeres(key) { + return once(function RES() { + var cbs = reqs[key]; + var len = cbs.length; + var args = slice$1(arguments); + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args); + } + } finally { + if (cbs.length > len) { + cbs.splice(0, len); + process.nextTick(function() { + RES.apply(null, args); + }); + } else { + delete reqs[key]; + } + } + }); +} +function slice$1(args) { + var length = args.length; + var array2 = []; + for (var i = 0; i < length; i++) + array2[i] = args[i]; + return array2; +} +function requireGlob() { + if (hasRequiredGlob) + return glob_1; + hasRequiredGlob = 1; + glob_1 = glob; + var rp = fs_realpath; + var minimatch2 = minimatch_1; + var inherits2 = inheritsExports; + var EE = require$$0$5.EventEmitter; + var path3 = require$$0$4; + var assert2 = require$$5; + var isAbsolute2 = require$$0$4.isAbsolute; + var globSync = requireSync(); + var common2 = common$c; + var setopts2 = common2.setopts; + var ownProp2 = common2.ownProp; + var inflight2 = inflight_1; + var childrenIgnored2 = common2.childrenIgnored; + var isIgnored2 = common2.isIgnored; + var once2 = onceExports; + function glob(pattern2, options2, cb) { + if (typeof options2 === "function") + cb = options2, options2 = {}; + if (!options2) + options2 = {}; + if (options2.sync) { + if (cb) + throw new TypeError("callback provided to sync glob"); + return globSync(pattern2, options2); + } + return new Glob(pattern2, options2, cb); + } + glob.sync = globSync; + var GlobSync = glob.GlobSync = globSync.GlobSync; + glob.glob = glob; + function extend2(origin, add) { + if (add === null || typeof add !== "object") { + return origin; + } + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; + } + glob.hasMagic = function(pattern2, options_) { + var options2 = extend2({}, options_); + options2.noprocess = true; + var g = new Glob(pattern2, options2); + var set2 = g.minimatch.set; + if (!pattern2) + return false; + if (set2.length > 1) + return true; + for (var j = 0; j < set2[0].length; j++) { + if (typeof set2[0][j] !== "string") + return true; + } + return false; + }; + glob.Glob = Glob; + inherits2(Glob, EE); + function Glob(pattern2, options2, cb) { + if (typeof options2 === "function") { + cb = options2; + options2 = null; + } + if (options2 && options2.sync) { + if (cb) + throw new TypeError("callback provided to sync glob"); + return new GlobSync(pattern2, options2); + } + if (!(this instanceof Glob)) + return new Glob(pattern2, options2, cb); + setopts2(this, pattern2, options2); + this._didRealPath = false; + var n = this.minimatch.set.length; + this.matches = new Array(n); + if (typeof cb === "function") { + cb = once2(cb); + this.on("error", cb); + this.on("end", function(matches) { + cb(null, matches); + }); + } + var self2 = this; + this._processing = 0; + this._emitQueue = []; + this._processQueue = []; + this.paused = false; + if (this.noprocess) + return this; + if (n === 0) + return done(); + var sync2 = true; + for (var i = 0; i < n; i++) { + this._process(this.minimatch.set[i], i, false, done); + } + sync2 = false; + function done() { + --self2._processing; + if (self2._processing <= 0) { + if (sync2) { + process.nextTick(function() { + self2._finish(); + }); + } else { + self2._finish(); + } + } + } + } + Glob.prototype._finish = function() { + assert2(this instanceof Glob); + if (this.aborted) + return; + if (this.realpath && !this._didRealpath) + return this._realpath(); + common2.finish(this); + this.emit("end", this.found); + }; + Glob.prototype._realpath = function() { + if (this._didRealpath) + return; + this._didRealpath = true; + var n = this.matches.length; + if (n === 0) + return this._finish(); + var self2 = this; + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next); + function next() { + if (--n === 0) + self2._finish(); + } + }; + Glob.prototype._realpathSet = function(index, cb) { + var matchset = this.matches[index]; + if (!matchset) + return cb(); + var found2 = Object.keys(matchset); + var self2 = this; + var n = found2.length; + if (n === 0) + return cb(); + var set2 = this.matches[index] = /* @__PURE__ */ Object.create(null); + found2.forEach(function(p, i) { + p = self2._makeAbs(p); + rp.realpath(p, self2.realpathCache, function(er, real) { + if (!er) + set2[real] = true; + else if (er.syscall === "stat") + set2[p] = true; + else + self2.emit("error", er); + if (--n === 0) { + self2.matches[index] = set2; + cb(); + } + }); + }); + }; + Glob.prototype._mark = function(p) { + return common2.mark(this, p); + }; + Glob.prototype._makeAbs = function(f) { + return common2.makeAbs(this, f); + }; + Glob.prototype.abort = function() { + this.aborted = true; + this.emit("abort"); + }; + Glob.prototype.pause = function() { + if (!this.paused) { + this.paused = true; + this.emit("pause"); + } + }; + Glob.prototype.resume = function() { + if (this.paused) { + this.emit("resume"); + this.paused = false; + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0); + this._emitQueue.length = 0; + for (var i = 0; i < eq.length; i++) { + var e = eq[i]; + this._emitMatch(e[0], e[1]); + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0); + this._processQueue.length = 0; + for (var i = 0; i < pq.length; i++) { + var p = pq[i]; + this._processing--; + this._process(p[0], p[1], p[2], p[3]); + } + } + } + }; + Glob.prototype._process = function(pattern2, index, inGlobStar, cb) { + assert2(this instanceof Glob); + assert2(typeof cb === "function"); + if (this.aborted) + return; + this._processing++; + if (this.paused) { + this._processQueue.push([pattern2, index, inGlobStar, cb]); + return; + } + var n = 0; + while (typeof pattern2[n] === "string") { + n++; + } + var prefix; + switch (n) { + case pattern2.length: + this._processSimple(pattern2.join("/"), index, cb); + return; + case 0: + prefix = null; + break; + default: + prefix = pattern2.slice(0, n).join("/"); + break; + } + var remain = pattern2.slice(n); + var read2; + if (prefix === null) + read2 = "."; + else if (isAbsolute2(prefix) || isAbsolute2(pattern2.map(function(p) { + return typeof p === "string" ? p : "[*]"; + }).join("/"))) { + if (!prefix || !isAbsolute2(prefix)) + prefix = "/" + prefix; + read2 = prefix; + } else + read2 = prefix; + var abs = this._makeAbs(read2); + if (childrenIgnored2(this, read2)) + return cb(); + var isGlobStar = remain[0] === minimatch2.GLOBSTAR; + if (isGlobStar) + this._processGlobStar(prefix, read2, abs, remain, index, inGlobStar, cb); + else + this._processReaddir(prefix, read2, abs, remain, index, inGlobStar, cb); + }; + Glob.prototype._processReaddir = function(prefix, read2, abs, remain, index, inGlobStar, cb) { + var self2 = this; + this._readdir(abs, inGlobStar, function(er, entries) { + return self2._processReaddir2(prefix, read2, abs, remain, index, inGlobStar, entries, cb); + }); + }; + Glob.prototype._processReaddir2 = function(prefix, read2, abs, remain, index, inGlobStar, entries, cb) { + if (!entries) + return cb(); + var pn = remain[0]; + var negate = !!this.minimatch.negate; + var rawGlob = pn._glob; + var dotOk = this.dot || rawGlob.charAt(0) === "."; + var matchedEntries = []; + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (e.charAt(0) !== "." || dotOk) { + var m; + if (negate && !prefix) { + m = !e.match(pn); + } else { + m = e.match(pn); + } + if (m) + matchedEntries.push(e); + } + } + var len = matchedEntries.length; + if (len === 0) + return cb(); + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + if (prefix) { + if (prefix !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + if (e.charAt(0) === "/" && !this.nomount) { + e = path3.join(this.root, e); + } + this._emitMatch(index, e); + } + return cb(); + } + remain.shift(); + for (var i = 0; i < len; i++) { + var e = matchedEntries[i]; + if (prefix) { + if (prefix !== "/") + e = prefix + "/" + e; + else + e = prefix + e; + } + this._process([e].concat(remain), index, inGlobStar, cb); + } + cb(); + }; + Glob.prototype._emitMatch = function(index, e) { + if (this.aborted) + return; + if (isIgnored2(this, e)) + return; + if (this.paused) { + this._emitQueue.push([index, e]); + return; + } + var abs = isAbsolute2(e) ? e : this._makeAbs(e); + if (this.mark) + e = this._mark(e); + if (this.absolute) + e = abs; + if (this.matches[index][e]) + return; + if (this.nodir) { + var c = this.cache[abs]; + if (c === "DIR" || Array.isArray(c)) + return; + } + this.matches[index][e] = true; + var st = this.statCache[abs]; + if (st) + this.emit("stat", e, st); + this.emit("match", e); + }; + Glob.prototype._readdirInGlobStar = function(abs, cb) { + if (this.aborted) + return; + if (this.follow) + return this._readdir(abs, false, cb); + var lstatkey = "lstat\0" + abs; + var self2 = this; + var lstatcb = inflight2(lstatkey, lstatcb_); + if (lstatcb) + self2.fs.lstat(abs, lstatcb); + function lstatcb_(er, lstat2) { + if (er && er.code === "ENOENT") + return cb(); + var isSym = lstat2 && lstat2.isSymbolicLink(); + self2.symlinks[abs] = isSym; + if (!isSym && lstat2 && !lstat2.isDirectory()) { + self2.cache[abs] = "FILE"; + cb(); + } else + self2._readdir(abs, false, cb); + } + }; + Glob.prototype._readdir = function(abs, inGlobStar, cb) { + if (this.aborted) + return; + cb = inflight2("readdir\0" + abs + "\0" + inGlobStar, cb); + if (!cb) + return; + if (inGlobStar && !ownProp2(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb); + if (ownProp2(this.cache, abs)) { + var c = this.cache[abs]; + if (!c || c === "FILE") + return cb(); + if (Array.isArray(c)) + return cb(null, c); + } + var self2 = this; + self2.fs.readdir(abs, readdirCb(this, abs, cb)); + }; + function readdirCb(self2, abs, cb) { + return function(er, entries) { + if (er) + self2._readdirError(abs, er, cb); + else + self2._readdirEntries(abs, entries, cb); + }; + } + Glob.prototype._readdirEntries = function(abs, entries, cb) { + if (this.aborted) + return; + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i++) { + var e = entries[i]; + if (abs === "/") + e = abs + e; + else + e = abs + "/" + e; + this.cache[e] = true; + } + } + this.cache[abs] = entries; + return cb(null, entries); + }; + Glob.prototype._readdirError = function(f, er, cb) { + if (this.aborted) + return; + switch (er.code) { + case "ENOTSUP": + case "ENOTDIR": + var abs = this._makeAbs(f); + this.cache[abs] = "FILE"; + if (abs === this.cwdAbs) { + var error2 = new Error(er.code + " invalid cwd " + this.cwd); + error2.path = this.cwd; + error2.code = er.code; + this.emit("error", error2); + this.abort(); + } + break; + case "ENOENT": + case "ELOOP": + case "ENAMETOOLONG": + case "UNKNOWN": + this.cache[this._makeAbs(f)] = false; + break; + default: + this.cache[this._makeAbs(f)] = false; + if (this.strict) { + this.emit("error", er); + this.abort(); + } + if (!this.silent) + console.error("glob error", er); + break; + } + return cb(); + }; + Glob.prototype._processGlobStar = function(prefix, read2, abs, remain, index, inGlobStar, cb) { + var self2 = this; + this._readdir(abs, inGlobStar, function(er, entries) { + self2._processGlobStar2(prefix, read2, abs, remain, index, inGlobStar, entries, cb); + }); + }; + Glob.prototype._processGlobStar2 = function(prefix, read2, abs, remain, index, inGlobStar, entries, cb) { + if (!entries) + return cb(); + var remainWithoutGlobStar = remain.slice(1); + var gspref = prefix ? [prefix] : []; + var noGlobStar = gspref.concat(remainWithoutGlobStar); + this._process(noGlobStar, index, false, cb); + var isSym = this.symlinks[abs]; + var len = entries.length; + if (isSym && inGlobStar) + return cb(); + for (var i = 0; i < len; i++) { + var e = entries[i]; + if (e.charAt(0) === "." && !this.dot) + continue; + var instead = gspref.concat(entries[i], remainWithoutGlobStar); + this._process(instead, index, true, cb); + var below = gspref.concat(entries[i], remain); + this._process(below, index, true, cb); + } + cb(); + }; + Glob.prototype._processSimple = function(prefix, index, cb) { + var self2 = this; + this._stat(prefix, function(er, exists) { + self2._processSimple2(prefix, index, er, exists, cb); + }); + }; + Glob.prototype._processSimple2 = function(prefix, index, er, exists, cb) { + if (!this.matches[index]) + this.matches[index] = /* @__PURE__ */ Object.create(null); + if (!exists) + return cb(); + if (prefix && isAbsolute2(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix); + if (prefix.charAt(0) === "/") { + prefix = path3.join(this.root, prefix); + } else { + prefix = path3.resolve(this.root, prefix); + if (trail) + prefix += "/"; + } + } + if (process.platform === "win32") + prefix = prefix.replace(/\\/g, "/"); + this._emitMatch(index, prefix); + cb(); + }; + Glob.prototype._stat = function(f, cb) { + var abs = this._makeAbs(f); + var needDir = f.slice(-1) === "/"; + if (f.length > this.maxLength) + return cb(); + if (!this.stat && ownProp2(this.cache, abs)) { + var c = this.cache[abs]; + if (Array.isArray(c)) + c = "DIR"; + if (!needDir || c === "DIR") + return cb(null, c); + if (needDir && c === "FILE") + return cb(); + } + var stat2 = this.statCache[abs]; + if (stat2 !== void 0) { + if (stat2 === false) + return cb(null, stat2); + else { + var type = stat2.isDirectory() ? "DIR" : "FILE"; + if (needDir && type === "FILE") + return cb(); + else + return cb(null, type, stat2); + } + } + var self2 = this; + var statcb = inflight2("stat\0" + abs, lstatcb_); + if (statcb) + self2.fs.lstat(abs, statcb); + function lstatcb_(er, lstat2) { + if (lstat2 && lstat2.isSymbolicLink()) { + return self2.fs.stat(abs, function(er2, stat3) { + if (er2) + self2._stat2(f, abs, null, lstat2, cb); + else + self2._stat2(f, abs, er2, stat3, cb); + }); + } else { + self2._stat2(f, abs, er, lstat2, cb); + } + } + }; + Glob.prototype._stat2 = function(f, abs, er, stat2, cb) { + if (er && (er.code === "ENOENT" || er.code === "ENOTDIR")) { + this.statCache[abs] = false; + return cb(); + } + var needDir = f.slice(-1) === "/"; + this.statCache[abs] = stat2; + if (abs.slice(-1) === "/" && stat2 && !stat2.isDirectory()) + return cb(null, false, stat2); + var c = true; + if (stat2) + c = stat2.isDirectory() ? "DIR" : "FILE"; + this.cache[abs] = this.cache[abs] || c; + if (needDir && c === "FILE") + return cb(); + return cb(null, c, stat2); + }; + return glob_1; +} +function decode(mappings) { + const state = new Int32Array(5); + const decoded = []; + let index = 0; + do { + const semi = indexOf(mappings, index); + const line = []; + let sorted = true; + let lastCol = 0; + state[0] = 0; + for (let i = index; i < semi; i++) { + let seg; + i = decodeInteger(mappings, i, state, 0); + const col = state[0]; + if (col < lastCol) + sorted = false; + lastCol = col; + if (hasMoreVlq(mappings, i, semi)) { + i = decodeInteger(mappings, i, state, 1); + i = decodeInteger(mappings, i, state, 2); + i = decodeInteger(mappings, i, state, 3); + if (hasMoreVlq(mappings, i, semi)) { + i = decodeInteger(mappings, i, state, 4); + seg = [col, state[1], state[2], state[3], state[4]]; + } else { + seg = [col, state[1], state[2], state[3]]; + } + } else { + seg = [col]; + } + line.push(seg); + } + if (!sorted) + sort(line); + decoded.push(line); + index = semi + 1; + } while (index <= mappings.length); + return decoded; +} +function indexOf(mappings, index) { + const idx = mappings.indexOf(";", index); + return idx === -1 ? mappings.length : idx; +} +function decodeInteger(mappings, pos, state, j) { + let value2 = 0; + let shift = 0; + let integer = 0; + do { + const c = mappings.charCodeAt(pos++); + integer = charToInt[c]; + value2 |= (integer & 31) << shift; + shift += 5; + } while (integer & 32); + const shouldNegate = value2 & 1; + value2 >>>= 1; + if (shouldNegate) { + value2 = -2147483648 | -value2; + } + state[j] += value2; + return pos; +} +function hasMoreVlq(mappings, i, length) { + if (i >= length) + return false; + return mappings.charCodeAt(i) !== comma; +} +function sort(line) { + line.sort(sortComparator$1); +} +function sortComparator$1(a, b) { + return a[0] - b[0]; +} +function encode$1(decoded) { + const state = new Int32Array(5); + const bufLength = 1024 * 16; + const subLength = bufLength - 36; + const buf = new Uint8Array(bufLength); + const sub = buf.subarray(0, subLength); + let pos = 0; + let out = ""; + for (let i = 0; i < decoded.length; i++) { + const line = decoded[i]; + if (i > 0) { + if (pos === bufLength) { + out += td.decode(buf); + pos = 0; + } + buf[pos++] = semicolon; + } + if (line.length === 0) + continue; + state[0] = 0; + for (let j = 0; j < line.length; j++) { + const segment = line[j]; + if (pos > subLength) { + out += td.decode(sub); + buf.copyWithin(0, subLength, pos); + pos -= subLength; + } + if (j > 0) + buf[pos++] = comma; + pos = encodeInteger(buf, pos, state, segment, 0); + if (segment.length === 1) + continue; + pos = encodeInteger(buf, pos, state, segment, 1); + pos = encodeInteger(buf, pos, state, segment, 2); + pos = encodeInteger(buf, pos, state, segment, 3); + if (segment.length === 4) + continue; + pos = encodeInteger(buf, pos, state, segment, 4); + } + } + return out + td.decode(buf.subarray(0, pos)); +} +function encodeInteger(buf, pos, state, segment, j) { + const next = segment[j]; + let num = next - state[j]; + state[j] = next; + num = num < 0 ? -num << 1 | 1 : num << 1; + do { + let clamped = num & 31; + num >>>= 5; + if (num > 0) + clamped |= 32; + buf[pos++] = intToChar[clamped]; + } while (num > 0); + return pos; +} +function binarySearch(haystack, needle, low, high) { + while (low <= high) { + const mid = low + (high - low >> 1); + const cmp = haystack[mid][COLUMN] - needle; + if (cmp === 0) { + found = true; + return mid; + } + if (cmp < 0) { + low = mid + 1; + } else { + high = mid - 1; + } + } + found = false; + return low - 1; +} +function upperBound(haystack, needle, index) { + for (let i = index + 1; i < haystack.length; index = i++) { + if (haystack[i][COLUMN] !== needle) + break; + } + return index; +} +function lowerBound(haystack, needle, index) { + for (let i = index - 1; i >= 0; index = i--) { + if (haystack[i][COLUMN] !== needle) + break; + } + return index; +} +function memoizedBinarySearch(haystack, needle, state, key) { + const { lastKey, lastNeedle, lastIndex } = state; + let low = 0; + let high = haystack.length - 1; + if (key === lastKey) { + if (needle === lastNeedle) { + found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle; + return lastIndex; + } + if (needle >= lastNeedle) { + low = lastIndex === -1 ? 0 : lastIndex; + } else { + high = lastIndex; + } + } + state.lastKey = key; + state.lastNeedle = needle; + return state.lastIndex = binarySearch(haystack, needle, low, high); +} +function OMapping(source, line, column, name2) { + return { source, line, column, name: name2 }; +} +function traceSegmentInternal(segments, memo, line, column, bias) { + let index = memoizedBinarySearch(segments, column, memo, line); + if (found) { + index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index); + } else if (bias === LEAST_UPPER_BOUND) + index++; + if (index === -1 || index === segments.length) + return -1; + return index; +} +function getLine(mappings, index) { + for (let i = mappings.length; i <= index; i++) { + mappings[i] = []; + } + return mappings[index]; +} +function getColumnIndex(line, column, seg) { + let index = line.length; + for (let i = index - 1; i >= 0; i--, index--) { + const current2 = line[i]; + const col = current2[0]; + if (col > column) + continue; + if (col < column) + break; + const cmp = compare$1(current2, seg); + if (cmp === 0) + return index; + if (cmp < 0) + break; + } + return index; +} +function compare$1(a, b) { + let cmp = compareNum(a.length, b.length); + if (cmp !== 0) + return cmp; + if (a.length === 1) + return 0; + cmp = compareNum(a[1], b[1]); + if (cmp !== 0) + return cmp; + cmp = compareNum(a[2], b[2]); + if (cmp !== 0) + return cmp; + cmp = compareNum(a[3], b[3]); + if (cmp !== 0) + return cmp; + if (a.length === 4) + return 0; + return compareNum(a[4], b[4]); +} +function compareNum(a, b) { + return a - b; +} +function insert(array2, index, value2) { + if (index === -1) + return; + for (let i = array2.length; i > index; i--) { + array2[i] = array2[i - 1]; + } + array2[index] = value2; +} +function requireMs$1() { + if (hasRequiredMs$1) + return ms$1; + hasRequiredMs$1 = 1; + var s = 1e3; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var w = d * 7; + var y = d * 365.25; + ms$1 = function(val, options2) { + options2 = options2 || {}; + var type = typeof val; + if (type === "string" && val.length > 0) { + return parse4(val); + } else if (type === "number" && isFinite(val)) { + return options2.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) + ); + }; + function parse4(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || "ms").toLowerCase(); + switch (type) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return n * y; + case "weeks": + case "week": + case "w": + return n * w; + case "days": + case "day": + case "d": + return n * d; + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return n * h; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return n * m; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return n * s; + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return n; + default: + return void 0; + } + } + function fmtShort(ms2) { + var msAbs = Math.abs(ms2); + if (msAbs >= d) { + return Math.round(ms2 / d) + "d"; + } + if (msAbs >= h) { + return Math.round(ms2 / h) + "h"; + } + if (msAbs >= m) { + return Math.round(ms2 / m) + "m"; + } + if (msAbs >= s) { + return Math.round(ms2 / s) + "s"; + } + return ms2 + "ms"; + } + function fmtLong(ms2) { + var msAbs = Math.abs(ms2); + if (msAbs >= d) { + return plural(ms2, msAbs, d, "day"); + } + if (msAbs >= h) { + return plural(ms2, msAbs, h, "hour"); + } + if (msAbs >= m) { + return plural(ms2, msAbs, m, "minute"); + } + if (msAbs >= s) { + return plural(ms2, msAbs, s, "second"); + } + return ms2 + " ms"; + } + function plural(ms2, msAbs, n, name2) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms2 / n) + " " + name2 + (isPlural ? "s" : ""); + } + return ms$1; +} +function requireCommon() { + if (hasRequiredCommon) + return common$b; + hasRequiredCommon = 1; + function setup(env2) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = requireMs$1(); + createDebug.destroy = destroy; + Object.keys(env2).forEach((key) => { + createDebug[key] = env2[key]; + }); + createDebug.names = []; + createDebug.skips = []; + createDebug.formatters = {}; + function selectColor(namespace) { + let hash = 0; + for (let i = 0; i < namespace.length; i++) { + hash = (hash << 5) - hash + namespace.charCodeAt(i); + hash |= 0; + } + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + let namespacesCache; + let enabledCache; + function debug2(...args) { + if (!debug2.enabled) { + return; + } + const self2 = debug2; + const curr = Number(/* @__PURE__ */ new Date()); + const ms2 = curr - (prevTime || curr); + self2.diff = ms2; + self2.prev = prevTime; + self2.curr = curr; + prevTime = curr; + args[0] = createDebug.coerce(args[0]); + if (typeof args[0] !== "string") { + args.unshift("%O"); + } + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format2) => { + if (match === "%%") { + return "%"; + } + index++; + const formatter2 = createDebug.formatters[format2]; + if (typeof formatter2 === "function") { + const val = args[index]; + match = formatter2.call(self2, val); + args.splice(index, 1); + index--; + } + return match; + }); + createDebug.formatArgs.call(self2, args); + const logFn = self2.log || createDebug.log; + logFn.apply(self2, args); + } + debug2.namespace = namespace; + debug2.useColors = createDebug.useColors(); + debug2.color = createDebug.selectColor(namespace); + debug2.extend = extend2; + debug2.destroy = createDebug.destroy; + Object.defineProperty(debug2, "enabled", { + enumerable: true, + configurable: false, + get: () => { + if (enableOverride !== null) { + return enableOverride; + } + if (namespacesCache !== createDebug.namespaces) { + namespacesCache = createDebug.namespaces; + enabledCache = createDebug.enabled(namespace); + } + return enabledCache; + }, + set: (v) => { + enableOverride = v; + } + }); + if (typeof createDebug.init === "function") { + createDebug.init(debug2); + } + return debug2; + } + function extend2(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.namespaces = namespaces; + createDebug.names = []; + createDebug.skips = []; + let i; + const split = (typeof namespaces === "string" ? namespaces : "").split(/[\s,]+/); + const len = split.length; + for (i = 0; i < len; i++) { + if (!split[i]) { + continue; + } + namespaces = split[i].replace(/\*/g, ".*?"); + if (namespaces[0] === "-") { + createDebug.skips.push(new RegExp("^" + namespaces.slice(1) + "$")); + } else { + createDebug.names.push(new RegExp("^" + namespaces + "$")); + } + } + } + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map((namespace) => "-" + namespace) + ].join(","); + createDebug.enable(""); + return namespaces; + } + function enabled(name2) { + if (name2[name2.length - 1] === "*") { + return true; + } + let i; + let len; + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name2)) { + return false; + } + } + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name2)) { + return true; + } + } + return false; + } + function toNamespace(regexp) { + return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, "*"); + } + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + function destroy() { + console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + } + createDebug.enable(createDebug.load()); + return createDebug; + } + common$b = setup; + return common$b; +} +function requireBrowser$1() { + if (hasRequiredBrowser$1) + return browserExports$1; + hasRequiredBrowser$1 = 1; + (function(module, exports2) { + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load2; + exports2.useColors = useColors; + exports2.storage = localstorage(); + exports2.destroy = (() => { + let warned2 = false; + return () => { + if (!warned2) { + warned2 = true; + console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + } + }; + })(); + exports2.colors = [ + "#0000CC", + "#0000FF", + "#0033CC", + "#0033FF", + "#0066CC", + "#0066FF", + "#0099CC", + "#0099FF", + "#00CC00", + "#00CC33", + "#00CC66", + "#00CC99", + "#00CCCC", + "#00CCFF", + "#3300CC", + "#3300FF", + "#3333CC", + "#3333FF", + "#3366CC", + "#3366FF", + "#3399CC", + "#3399FF", + "#33CC00", + "#33CC33", + "#33CC66", + "#33CC99", + "#33CCCC", + "#33CCFF", + "#6600CC", + "#6600FF", + "#6633CC", + "#6633FF", + "#66CC00", + "#66CC33", + "#9900CC", + "#9900FF", + "#9933CC", + "#9933FF", + "#99CC00", + "#99CC33", + "#CC0000", + "#CC0033", + "#CC0066", + "#CC0099", + "#CC00CC", + "#CC00FF", + "#CC3300", + "#CC3333", + "#CC3366", + "#CC3399", + "#CC33CC", + "#CC33FF", + "#CC6600", + "#CC6633", + "#CC9900", + "#CC9933", + "#CCCC00", + "#CCCC33", + "#FF0000", + "#FF0033", + "#FF0066", + "#FF0099", + "#FF00CC", + "#FF00FF", + "#FF3300", + "#FF3333", + "#FF3366", + "#FF3399", + "#FF33CC", + "#FF33FF", + "#FF6600", + "#FF6633", + "#FF9900", + "#FF9933", + "#FFCC00", + "#FFCC33" + ]; + function useColors() { + if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) { + return true; + } + if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 + typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker + typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); + } + function formatArgs(args) { + args[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args[0] + (this.useColors ? "%c " : " ") + "+" + module.exports.humanize(this.diff); + if (!this.useColors) { + return; + } + const c = "color: " + this.color; + args.splice(1, 0, c, "color: inherit"); + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, (match) => { + if (match === "%%") { + return; + } + index++; + if (match === "%c") { + lastC = index; + } + }); + args.splice(lastC, 0, c); + } + exports2.log = console.debug || console.log || (() => { + }); + function save(namespaces) { + try { + if (namespaces) { + exports2.storage.setItem("debug", namespaces); + } else { + exports2.storage.removeItem("debug"); + } + } catch (error2) { + } + } + function load2() { + let r; + try { + r = exports2.storage.getItem("debug"); + } catch (error2) { + } + if (!r && typeof process !== "undefined" && "env" in process) { + r = process.env.DEBUG; + } + return r; + } + function localstorage() { + try { + return localStorage; + } catch (error2) { + } + } + module.exports = requireCommon()(exports2); + const { formatters } = module.exports; + formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (error2) { + return "[UnexpectedJSONParseError]: " + error2.message; + } + }; + })(browser$2, browserExports$1); + return browserExports$1; +} +function requireNode$1() { + if (hasRequiredNode$1) + return nodeExports$1; + hasRequiredNode$1 = 1; + (function(module, exports2) { + const tty2 = require$$0$3; + const util2 = require$$0$6; + exports2.init = init2; + exports2.log = log; + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load2; + exports2.useColors = useColors; + exports2.destroy = util2.deprecate( + () => { + }, + "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." + ); + exports2.colors = [6, 2, 3, 4, 5, 1]; + try { + const supportsColor = require2("supports-color"); + if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { + exports2.colors = [ + 20, + 21, + 26, + 27, + 32, + 33, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 56, + 57, + 62, + 63, + 68, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 92, + 93, + 98, + 99, + 112, + 113, + 128, + 129, + 134, + 135, + 148, + 149, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 178, + 179, + 184, + 185, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 214, + 215, + 220, + 221 + ]; + } + } catch (error2) { + } + exports2.inspectOpts = Object.keys(process.env).filter((key) => { + return /^debug_/i.test(key); + }).reduce((obj, key) => { + const prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, (_, k) => { + return k.toUpperCase(); + }); + let val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) { + val = true; + } else if (/^(no|off|false|disabled)$/i.test(val)) { + val = false; + } else if (val === "null") { + val = null; + } else { + val = Number(val); + } + obj[prop] = val; + return obj; + }, {}); + function useColors() { + return "colors" in exports2.inspectOpts ? Boolean(exports2.inspectOpts.colors) : tty2.isatty(process.stderr.fd); + } + function formatArgs(args) { + const { namespace: name2, useColors: useColors2 } = this; + if (useColors2) { + const c = this.color; + const colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c); + const prefix = ` ${colorCode};1m${name2} \x1B[0m`; + args[0] = prefix + args[0].split("\n").join("\n" + prefix); + args.push(colorCode + "m+" + module.exports.humanize(this.diff) + "\x1B[0m"); + } else { + args[0] = getDate() + name2 + " " + args[0]; + } + } + function getDate() { + if (exports2.inspectOpts.hideDate) { + return ""; + } + return (/* @__PURE__ */ new Date()).toISOString() + " "; + } + function log(...args) { + return process.stderr.write(util2.format(...args) + "\n"); + } + function save(namespaces) { + if (namespaces) { + process.env.DEBUG = namespaces; + } else { + delete process.env.DEBUG; + } + } + function load2() { + return process.env.DEBUG; + } + function init2(debug2) { + debug2.inspectOpts = {}; + const keys = Object.keys(exports2.inspectOpts); + for (let i = 0; i < keys.length; i++) { + debug2.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]]; + } + } + module.exports = requireCommon()(exports2); + const { formatters } = module.exports; + formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util2.inspect(v, this.inspectOpts).split("\n").map((str) => str.trim()).join(" "); + }; + formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util2.inspect(v, this.inspectOpts); + }; + })(node$1, nodeExports$1); + return nodeExports$1; +} +function slash$1(p) { + return p.replace(/\\/g, "/"); +} +function createDebugger(namespace, options2 = {}) { + const log = _debug(namespace); + const { onlyWhenFocused } = options2; + const focus = typeof onlyWhenFocused === "string" ? onlyWhenFocused : namespace; + return (msg, ...args) => { + if (filter && !msg.includes(filter)) { + return; + } + if (onlyWhenFocused && !(DEBUG == null ? void 0 : DEBUG.includes(focus))) { + return; + } + log(msg, ...args); + }; +} +function testCaseInsensitiveFS() { + if (!CLIENT_ENTRY.endsWith("client.mjs")) { + throw new Error(`cannot test case insensitive FS, CLIENT_ENTRY const doesn't contain client.mjs`); + } + if (!fs$l.existsSync(CLIENT_ENTRY)) { + throw new Error("cannot test case insensitive FS, CLIENT_ENTRY does not point to an existing file: " + CLIENT_ENTRY); + } + return fs$l.existsSync(CLIENT_ENTRY.replace("client.mjs", "cLiEnT.mjs")); +} +function normalizePath$3(id) { + return path$o.posix.normalize(isWindows$4 ? slash$1(id) : id); +} +async function asyncReplace(input, re, replacer) { + let match; + let remaining = input; + let rewritten = ""; + while (match = re.exec(remaining)) { + rewritten += remaining.slice(0, match.index); + rewritten += await replacer(match); + remaining = remaining.slice(match.index + match[0].length); + } + rewritten += remaining; + return rewritten; +} +function reduceSrcset(ret) { + return ret.reduce((prev, { url: url2, descriptor }, index) => { + descriptor ?? (descriptor = ""); + return prev += url2 + ` ${descriptor}${index === ret.length - 1 ? "" : ", "}`; + }, ""); +} +function splitSrcSetDescriptor(srcs) { + return splitSrcSet(srcs).map((s) => { + const src2 = s.replace(escapedSpaceCharacters, " ").trim(); + const [url2] = imageSetUrlRE.exec(src2) || [""]; + return { + url: url2, + descriptor: src2 == null ? void 0 : src2.slice(url2.length).trim() + }; + }).filter(({ url: url2 }) => !!url2); +} +function processSrcSet(srcs, replacer) { + return Promise.all(splitSrcSetDescriptor(srcs).map(async ({ url: url2, descriptor }) => ({ + url: await replacer({ url: url2, descriptor }), + descriptor + }))).then((ret) => reduceSrcset(ret)); +} +function splitSrcSet(srcs) { + const parts = []; + const cleanedSrcs = srcs.replace(/(?:url|image|gradient|cross-fade)\([^)]*\)|"([^"]|(?<=\\)")*"|'([^']|(?<=\\)')*'/g, blankReplacer); + let startIndex = 0; + let splitIndex; + do { + splitIndex = cleanedSrcs.indexOf(",", startIndex); + parts.push(srcs.slice(startIndex, splitIndex !== -1 ? splitIndex : void 0)); + startIndex = splitIndex + 1; + } while (splitIndex !== -1); + return parts; +} +function gracefulRename(from, to, cb) { + const start = Date.now(); + let backoff = 0; + fs$l.rename(from, to, function CB(er) { + if (er && (er.code === "EACCES" || er.code === "EPERM") && Date.now() - start < GRACEFUL_RENAME_TIMEOUT) { + setTimeout(function() { + fs$l.stat(to, function(stater, st) { + if (stater && stater.code === "ENOENT") + fs$l.rename(from, to, CB); + else + CB(er); + }); + }, backoff); + if (backoff < 100) + backoff += 10; + return; + } + if (cb) + cb(er); + }); +} +function gracefulRemoveDir(dir, cb) { + const start = Date.now(); + let backoff = 0; + fs$l.rm(dir, { recursive: true }, function CB(er) { + if (er) { + if ((er.code === "ENOTEMPTY" || er.code === "EACCES" || er.code === "EPERM") && Date.now() - start < GRACEFUL_REMOVE_DIR_TIMEOUT) { + setTimeout(function() { + fs$l.rm(dir, { recursive: true }, CB); + }, backoff); + if (backoff < 100) + backoff += 10; + return; + } + if (er.code === "ENOENT") { + er = null; + } + } + if (cb) + cb(er); + }); +} +function genWorkerCode(fn) { + return ` +const doWork = ${fn.toString()} + +const { parentPort } = require('worker_threads') + +parentPort.on('message', async (args) => { + const res = await doWork(...args) + parentPort.postMessage(res) +}) + `; +} +function getBtoa() { + if (typeof window !== "undefined" && typeof window.btoa === "function") { + return (str) => window.btoa(unescape(encodeURIComponent(str))); + } else if (typeof Buffer === "function") { + return (str) => Buffer.from(str, "utf-8").toString("base64"); + } else { + return () => { + throw new Error("Unsupported environment: `window.btoa` or `Buffer` should be supported."); + }; + } +} +function guessIndent(code) { + const lines = code.split("\n"); + const tabbed = lines.filter((line) => /^\t+/.test(line)); + const spaced = lines.filter((line) => /^ {2,}/.test(line)); + if (tabbed.length === 0 && spaced.length === 0) { + return null; + } + if (tabbed.length >= spaced.length) { + return " "; + } + const min2 = spaced.reduce((previous, current2) => { + const numSpaces = /^ +/.exec(current2)[0].length; + return Math.min(numSpaces, previous); + }, Infinity); + return new Array(min2 + 1).join(" "); +} +function getRelativePath(from, to) { + const fromParts = from.split(/[/\\]/); + const toParts = to.split(/[/\\]/); + fromParts.pop(); + while (fromParts[0] === toParts[0]) { + fromParts.shift(); + toParts.shift(); + } + if (fromParts.length) { + let i = fromParts.length; + while (i--) + fromParts[i] = ".."; + } + return fromParts.concat(toParts).join("/"); +} +function isObject$1(thing) { + return toString$2.call(thing) === "[object Object]"; +} +function getLocator(source) { + const originalLines = source.split("\n"); + const lineOffsets = []; + for (let i = 0, pos = 0; i < originalLines.length; i++) { + lineOffsets.push(pos); + pos += originalLines[i].length + 1; + } + return function locate(index) { + let i = 0; + let j = lineOffsets.length; + while (i < j) { + const m = i + j >> 1; + if (index < lineOffsets[m]) { + j = m; + } else { + i = m + 1; + } + } + const line = i - 1; + const column = index - lineOffsets[line]; + return { line, column }; + }; +} +function isInAstralSet(code, set2) { + var pos = 65536; + for (var i = 0; i < set2.length; i += 2) { + pos += set2[i]; + if (pos > code) { + return false; + } + pos += set2[i + 1]; + if (pos >= code) { + return true; + } + } + return false; +} +function isIdentifierStart(code, astral) { + if (code < 65) { + return code === 36; + } + if (code < 91) { + return true; + } + if (code < 97) { + return code === 95; + } + if (code < 123) { + return true; + } + if (code <= 65535) { + return code >= 170 && nonASCIIidentifierStart.test(String.fromCharCode(code)); + } + if (astral === false) { + return false; + } + return isInAstralSet(code, astralIdentifierStartCodes); +} +function isIdentifierChar(code, astral) { + if (code < 48) { + return code === 36; + } + if (code < 58) { + return true; + } + if (code < 65) { + return false; + } + if (code < 91) { + return true; + } + if (code < 97) { + return code === 95; + } + if (code < 123) { + return true; + } + if (code <= 65535) { + return code >= 170 && nonASCIIidentifier.test(String.fromCharCode(code)); + } + if (astral === false) { + return false; + } + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes); +} +function binop(name2, prec) { + return new TokenType(name2, { beforeExpr: true, binop: prec }); +} +function kw(name2, options2) { + if (options2 === void 0) + options2 = {}; + options2.keyword = name2; + return keywords$2[name2] = new TokenType(name2, options2); +} +function isNewLine(code) { + return code === 10 || code === 13 || code === 8232 || code === 8233; +} +function nextLineBreak(code, from, end) { + if (end === void 0) + end = code.length; + for (var i = from; i < end; i++) { + var next = code.charCodeAt(i); + if (isNewLine(next)) { + return i < end - 1 && next === 13 && code.charCodeAt(i + 1) === 10 ? i + 2 : i + 1; + } + } + return -1; +} +function wordsRegexp(words) { + return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$"); +} +function codePointToString(code) { + if (code <= 65535) { + return String.fromCharCode(code); + } + code -= 65536; + return String.fromCharCode((code >> 10) + 55296, (code & 1023) + 56320); +} +function getLineInfo(input, offset3) { + for (var line = 1, cur = 0; ; ) { + var nextBreak = nextLineBreak(input, cur, offset3); + if (nextBreak < 0) { + return new Position(line, offset3 - cur); + } + ++line; + cur = nextBreak; + } +} +function getOptions(opts) { + var options2 = {}; + for (var opt in defaultOptions) { + options2[opt] = opts && hasOwn(opts, opt) ? opts[opt] : defaultOptions[opt]; + } + if (options2.ecmaVersion === "latest") { + options2.ecmaVersion = 1e8; + } else if (options2.ecmaVersion == null) { + if (!warnedAboutEcmaVersion && typeof console === "object" && console.warn) { + warnedAboutEcmaVersion = true; + console.warn("Since Acorn 8.0.0, options.ecmaVersion is required.\nDefaulting to 2020, but this will stop working in the future."); + } + options2.ecmaVersion = 11; + } else if (options2.ecmaVersion >= 2015) { + options2.ecmaVersion -= 2009; + } + if (options2.allowReserved == null) { + options2.allowReserved = options2.ecmaVersion < 5; + } + if (!opts || opts.allowHashBang == null) { + options2.allowHashBang = options2.ecmaVersion >= 14; + } + if (isArray(options2.onToken)) { + var tokens = options2.onToken; + options2.onToken = function(token) { + return tokens.push(token); + }; + } + if (isArray(options2.onComment)) { + options2.onComment = pushComment(options2, options2.onComment); + } + return options2; +} +function pushComment(options2, array2) { + return function(block, text, start, end, startLoc, endLoc) { + var comment = { + type: block ? "Block" : "Line", + value: text, + start, + end + }; + if (options2.locations) { + comment.loc = new SourceLocation(this, startLoc, endLoc); + } + if (options2.ranges) { + comment.range = [start, end]; + } + array2.push(comment); + }; +} +function functionFlags(async2, generator) { + return SCOPE_FUNCTION | (async2 ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0); +} +function isPrivateNameConflicted(privateNameMap, element) { + var name2 = element.key.name; + var curr = privateNameMap[name2]; + var next = "true"; + if (element.type === "MethodDefinition" && (element.kind === "get" || element.kind === "set")) { + next = (element.static ? "s" : "i") + element.kind; + } + if (curr === "iget" && next === "iset" || curr === "iset" && next === "iget" || curr === "sget" && next === "sset" || curr === "sset" && next === "sget") { + privateNameMap[name2] = "true"; + return false; + } else if (!curr) { + privateNameMap[name2] = next; + return false; + } else { + return true; + } +} +function checkKeyName(node2, name2) { + var computed = node2.computed; + var key = node2.key; + return !computed && (key.type === "Identifier" && key.name === name2 || key.type === "Literal" && key.value === name2); +} +function isPrivateFieldAccess(node2) { + return node2.type === "MemberExpression" && node2.property.type === "PrivateIdentifier" || node2.type === "ChainExpression" && isPrivateFieldAccess(node2.expression); +} +function finishNodeAt(node2, type, pos, loc) { + node2.type = type; + node2.end = pos; + if (this.options.locations) { + node2.loc.end = loc; + } + if (this.options.ranges) { + node2.range[1] = pos; + } + return node2; +} +function buildUnicodeData(ecmaVersion) { + var d = data[ecmaVersion] = { + binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + " " + unicodeGeneralCategoryValues), + nonBinary: { + General_Category: wordsRegexp(unicodeGeneralCategoryValues), + Script: wordsRegexp(unicodeScriptValues[ecmaVersion]) + } + }; + d.nonBinary.Script_Extensions = d.nonBinary.Script; + d.nonBinary.gc = d.nonBinary.General_Category; + d.nonBinary.sc = d.nonBinary.Script; + d.nonBinary.scx = d.nonBinary.Script_Extensions; +} +function isSyntaxCharacter(ch) { + return ch === 36 || ch >= 40 && ch <= 43 || ch === 46 || ch === 63 || ch >= 91 && ch <= 94 || ch >= 123 && ch <= 125; +} +function isRegExpIdentifierStart(ch) { + return isIdentifierStart(ch, true) || ch === 36 || ch === 95; +} +function isRegExpIdentifierPart(ch) { + return isIdentifierChar(ch, true) || ch === 36 || ch === 95 || ch === 8204 || ch === 8205; +} +function isControlLetter(ch) { + return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122; +} +function isValidUnicode(ch) { + return ch >= 0 && ch <= 1114111; +} +function isCharacterClassEscape(ch) { + return ch === 100 || ch === 68 || ch === 115 || ch === 83 || ch === 119 || ch === 87; +} +function isUnicodePropertyNameCharacter(ch) { + return isControlLetter(ch) || ch === 95; +} +function isUnicodePropertyValueCharacter(ch) { + return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch); +} +function isDecimalDigit(ch) { + return ch >= 48 && ch <= 57; +} +function isHexDigit(ch) { + return ch >= 48 && ch <= 57 || ch >= 65 && ch <= 70 || ch >= 97 && ch <= 102; +} +function hexToInt(ch) { + if (ch >= 65 && ch <= 70) { + return 10 + (ch - 65); + } + if (ch >= 97 && ch <= 102) { + return 10 + (ch - 97); + } + return ch - 48; +} +function isOctalDigit(ch) { + return ch >= 48 && ch <= 55; +} +function stringToNumber(str, isLegacyOctalNumericLiteral) { + if (isLegacyOctalNumericLiteral) { + return parseInt(str, 8); + } + return parseFloat(str.replace(/_/g, "")); +} +function stringToBigInt(str) { + if (typeof BigInt !== "function") { + return null; + } + return BigInt(str.replace(/_/g, "")); +} +function formatList(array2, type = "and") { + return array2.length < 3 ? array2.join(` ${type} `) : `${array2.slice(0, -1).join(", ")}, ${type} ${array2[array2.length - 1]}`; +} +function createError(sym, value2, def) { + messages.set(sym, value2); + return makeNodeErrorWithCode(def, sym); +} +function makeNodeErrorWithCode(Base, key) { + return NodeError; + function NodeError(...args) { + const limit = Error.stackTraceLimit; + if (isErrorStackTraceLimitWritable()) + Error.stackTraceLimit = 0; + const error2 = new Base(); + if (isErrorStackTraceLimitWritable()) + Error.stackTraceLimit = limit; + const message = getMessage(key, args, error2); + Object.defineProperties(error2, { + // Note: no need to implement `kIsNodeError` symbol, would be hard, + // probably. + message: { + value: message, + enumerable: false, + writable: true, + configurable: true + }, + toString: { + /** @this {Error} */ + value() { + return `${this.name} [${key}]: ${this.message}`; + }, + enumerable: false, + writable: true, + configurable: true + } + }); + captureLargerStackTrace(error2); + error2.code = key; + return error2; + } +} +function isErrorStackTraceLimitWritable() { + try { + if (v8.startupSnapshot.isBuildingSnapshot()) { + return false; + } + } catch { + } + const desc = Object.getOwnPropertyDescriptor(Error, "stackTraceLimit"); + if (desc === void 0) { + return Object.isExtensible(Error); + } + return own$1.call(desc, "writable") && desc.writable !== void 0 ? desc.writable : desc.set !== void 0; +} +function hideStackFrames(fn) { + const hidden = nodeInternalPrefix + fn.name; + Object.defineProperty(fn, "name", { value: hidden }); + return fn; +} +function getMessage(key, args, self2) { + const message = messages.get(key); + assert$1(typeof message !== "undefined", "expected `message` to be found"); + if (typeof message === "function") { + assert$1( + message.length <= args.length, + // Default options do not count. + `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${message.length}).` + ); + return Reflect.apply(message, self2, args); + } + const regex = /%[dfijoOs]/g; + let expectedLength = 0; + while (regex.exec(message) !== null) + expectedLength++; + assert$1( + expectedLength === args.length, + `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${expectedLength}).` + ); + if (args.length === 0) + return message; + args.unshift(message); + return Reflect.apply(format$2, null, args); +} +function flatten$1(items) { + return items.reduce((collection, item) => [].concat(collection, item), []); +} +function splitWhen(items, predicate) { + const result = [[]]; + let groupIndex = 0; + for (const item of items) { + if (predicate(item)) { + groupIndex++; + result[groupIndex] = []; + } else { + result[groupIndex].push(item); + } + } + return result; +} +function isEnoentCodeError(error2) { + return error2.code === "ENOENT"; +} +function createDirentFromStats$1(name2, stats) { + return new DirentFromStats$1(name2, stats); +} +function unixify(filepath) { + return filepath.replace(/\\/g, "/"); +} +function makeAbsolute(cwd, filepath) { + return path$g.resolve(cwd, filepath); +} +function escape$2(pattern2) { + return pattern2.replace(UNESCAPED_GLOB_SYMBOLS_RE, "\\$2"); +} +function removeLeadingDotSegment(entry2) { + if (entry2.charAt(0) === ".") { + const secondCharactery = entry2.charAt(1); + if (secondCharactery === "/" || secondCharactery === "\\") { + return entry2.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT); + } + } + return entry2; +} +function collatePatterns(neg, pos, options2) { + let onlyNegative = filterPatterns(neg, pos, "-", false) || []; + let onlyPositive = filterPatterns(pos, neg, "", false) || []; + let intersected = filterPatterns(neg, pos, "-?", true) || []; + let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); + return subpatterns.join("|"); +} +function splitToRanges(min2, max) { + let nines = 1; + let zeros2 = 1; + let stop = countNines(min2, nines); + let stops = /* @__PURE__ */ new Set([max]); + while (min2 <= stop && stop <= max) { + stops.add(stop); + nines += 1; + stop = countNines(min2, nines); + } + stop = countZeros(max + 1, zeros2) - 1; + while (min2 < stop && stop <= max) { + stops.add(stop); + zeros2 += 1; + stop = countZeros(max + 1, zeros2) - 1; + } + stops = [...stops]; + stops.sort(compare); + return stops; +} +function rangeToPattern(start, stop, options2) { + if (start === stop) { + return { pattern: start, count: [], digits: 0 }; + } + let zipped = zip(start, stop); + let digits = zipped.length; + let pattern2 = ""; + let count = 0; + for (let i = 0; i < digits; i++) { + let [startDigit, stopDigit] = zipped[i]; + if (startDigit === stopDigit) { + pattern2 += startDigit; + } else if (startDigit !== "0" || stopDigit !== "9") { + pattern2 += toCharacterClass(startDigit, stopDigit); + } else { + count++; + } + } + if (count) { + pattern2 += options2.shorthand === true ? "\\d" : "[0-9]"; + } + return { pattern: pattern2, count: [count], digits }; +} +function splitToPatterns(min2, max, tok, options2) { + let ranges = splitToRanges(min2, max); + let tokens = []; + let start = min2; + let prev; + for (let i = 0; i < ranges.length; i++) { + let max2 = ranges[i]; + let obj = rangeToPattern(String(start), String(max2), options2); + let zeros2 = ""; + if (!tok.isPadded && prev && prev.pattern === obj.pattern) { + if (prev.count.length > 1) { + prev.count.pop(); + } + prev.count.push(obj.count[0]); + prev.string = prev.pattern + toQuantifier(prev.count); + start = max2 + 1; + continue; + } + if (tok.isPadded) { + zeros2 = padZeros(max2, tok, options2); + } + obj.string = zeros2 + obj.pattern + toQuantifier(obj.count); + tokens.push(obj); + start = max2 + 1; + prev = obj; + } + return tokens; +} +function filterPatterns(arr, comparison, prefix, intersection, options2) { + let result = []; + for (let ele of arr) { + let { string: string2 } = ele; + if (!intersection && !contains(comparison, "string", string2)) { + result.push(prefix + string2); + } + if (intersection && contains(comparison, "string", string2)) { + result.push(prefix + string2); + } + } + return result; +} +function zip(a, b) { + let arr = []; + for (let i = 0; i < a.length; i++) + arr.push([a[i], b[i]]); + return arr; +} +function compare(a, b) { + return a > b ? 1 : b > a ? -1 : 0; +} +function contains(arr, key, val) { + return arr.some((ele) => ele[key] === val); +} +function countNines(min2, len) { + return Number(String(min2).slice(0, -len) + "9".repeat(len)); +} +function countZeros(integer, zeros2) { + return integer - integer % Math.pow(10, zeros2); +} +function toQuantifier(digits) { + let [start = 0, stop = ""] = digits; + if (stop || start > 1) { + return `{${start + (stop ? "," + stop : "")}}`; + } + return ""; +} +function toCharacterClass(a, b, options2) { + return `[${a}${b - a === 1 ? "" : "-"}${b}]`; +} +function hasPadding(str) { + return /^-?(0+)\d/.test(str); +} +function padZeros(value2, tok, options2) { + if (!tok.isPadded) { + return value2; + } + let diff = Math.abs(tok.maxLen - String(value2).length); + let relax = options2.relaxZeros !== false; + switch (diff) { + case 0: + return ""; + case 1: + return relax ? "0?" : "0"; + case 2: + return relax ? "0{0,2}" : "00"; + default: { + return relax ? `0{0,${diff}}` : `0{${diff}}`; + } + } +} +function isStaticPattern(pattern2, options2 = {}) { + return !isDynamicPattern(pattern2, options2); +} +function isDynamicPattern(pattern2, options2 = {}) { + if (pattern2 === "") { + return false; + } + if (options2.caseSensitiveMatch === false || pattern2.includes(ESCAPE_SYMBOL)) { + return true; + } + if (COMMON_GLOB_SYMBOLS_RE.test(pattern2) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern2) || REGEX_GROUP_SYMBOLS_RE.test(pattern2)) { + return true; + } + if (options2.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern2)) { + return true; + } + if (options2.braceExpansion !== false && hasBraceExpansion(pattern2)) { + return true; + } + return false; +} +function hasBraceExpansion(pattern2) { + const openingBraceIndex = pattern2.indexOf("{"); + if (openingBraceIndex === -1) { + return false; + } + const closingBraceIndex = pattern2.indexOf("}", openingBraceIndex + 1); + if (closingBraceIndex === -1) { + return false; + } + const braceContent = pattern2.slice(openingBraceIndex, closingBraceIndex); + return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent); +} +function convertToPositivePattern(pattern2) { + return isNegativePattern(pattern2) ? pattern2.slice(1) : pattern2; +} +function convertToNegativePattern(pattern2) { + return "!" + pattern2; +} +function isNegativePattern(pattern2) { + return pattern2.startsWith("!") && pattern2[1] !== "("; +} +function isPositivePattern(pattern2) { + return !isNegativePattern(pattern2); +} +function getNegativePatterns(patterns2) { + return patterns2.filter(isNegativePattern); +} +function getPositivePatterns$1(patterns2) { + return patterns2.filter(isPositivePattern); +} +function getPatternsInsideCurrentDirectory(patterns2) { + return patterns2.filter((pattern2) => !isPatternRelatedToParentDirectory(pattern2)); +} +function getPatternsOutsideCurrentDirectory(patterns2) { + return patterns2.filter(isPatternRelatedToParentDirectory); +} +function isPatternRelatedToParentDirectory(pattern2) { + return pattern2.startsWith("..") || pattern2.startsWith("./.."); +} +function getBaseDirectory(pattern2) { + return globParent$1(pattern2, { flipBackslashes: false }); +} +function hasGlobStar(pattern2) { + return pattern2.includes(GLOBSTAR$1); +} +function endsWithSlashGlobStar(pattern2) { + return pattern2.endsWith("/" + GLOBSTAR$1); +} +function isAffectDepthOfReadingPattern(pattern2) { + const basename2 = path$f.basename(pattern2); + return endsWithSlashGlobStar(pattern2) || isStaticPattern(basename2); +} +function expandPatternsWithBraceExpansion(patterns2) { + return patterns2.reduce((collection, pattern2) => { + return collection.concat(expandBraceExpansion(pattern2)); + }, []); +} +function expandBraceExpansion(pattern2) { + return micromatch.braces(pattern2, { + expand: true, + nodupes: true + }); +} +function getPatternParts(pattern2, options2) { + let { parts } = micromatch.scan(pattern2, Object.assign(Object.assign({}, options2), { parts: true })); + if (parts.length === 0) { + parts = [pattern2]; + } + if (parts[0].startsWith("/")) { + parts[0] = parts[0].slice(1); + parts.unshift(""); + } + return parts; +} +function makeRe(pattern2, options2) { + return micromatch.makeRe(pattern2, options2); +} +function convertPatternsToRe(patterns2, options2) { + return patterns2.map((pattern2) => makeRe(pattern2, options2)); +} +function matchAny(entry2, patternsRe) { + return patternsRe.some((patternRe) => patternRe.test(entry2)); +} +function merge2$1() { + const streamsQueue = []; + const args = slice.call(arguments); + let merging = false; + let options2 = args[args.length - 1]; + if (options2 && !Array.isArray(options2) && options2.pipe == null) { + args.pop(); + } else { + options2 = {}; + } + const doEnd = options2.end !== false; + const doPipeError = options2.pipeError === true; + if (options2.objectMode == null) { + options2.objectMode = true; + } + if (options2.highWaterMark == null) { + options2.highWaterMark = 64 * 1024; + } + const mergedStream = PassThrough(options2); + function addStream() { + for (let i = 0, len = arguments.length; i < len; i++) { + streamsQueue.push(pauseStreams(arguments[i], options2)); + } + mergeStream(); + return this; + } + function mergeStream() { + if (merging) { + return; + } + merging = true; + let streams = streamsQueue.shift(); + if (!streams) { + process.nextTick(endStream); + return; + } + if (!Array.isArray(streams)) { + streams = [streams]; + } + let pipesCount = streams.length + 1; + function next() { + if (--pipesCount > 0) { + return; + } + merging = false; + mergeStream(); + } + function pipe(stream4) { + function onend() { + stream4.removeListener("merge2UnpipeEnd", onend); + stream4.removeListener("end", onend); + if (doPipeError) { + stream4.removeListener("error", onerror); + } + next(); + } + function onerror(err) { + mergedStream.emit("error", err); + } + if (stream4._readableState.endEmitted) { + return next(); + } + stream4.on("merge2UnpipeEnd", onend); + stream4.on("end", onend); + if (doPipeError) { + stream4.on("error", onerror); + } + stream4.pipe(mergedStream, { end: false }); + stream4.resume(); + } + for (let i = 0; i < streams.length; i++) { + pipe(streams[i]); + } + next(); + } + function endStream() { + merging = false; + mergedStream.emit("queueDrain"); + if (doEnd) { + mergedStream.end(); + } + } + mergedStream.setMaxListeners(0); + mergedStream.add = addStream; + mergedStream.on("unpipe", function(stream4) { + stream4.emit("merge2UnpipeEnd"); + }); + if (args.length) { + addStream.apply(null, args); + } + return mergedStream; +} +function pauseStreams(streams, options2) { + if (!Array.isArray(streams)) { + if (!streams._readableState && streams.pipe) { + streams = streams.pipe(PassThrough(options2)); + } + if (!streams._readableState || !streams.pause || !streams.pipe) { + throw new Error("Only readable stream can be merged."); + } + streams.pause(); + } else { + for (let i = 0, len = streams.length; i < len; i++) { + streams[i] = pauseStreams(streams[i], options2); + } + } + return streams; +} +function merge$1(streams) { + const mergedStream = merge2(streams); + streams.forEach((stream4) => { + stream4.once("error", (error2) => mergedStream.emit("error", error2)); + }); + mergedStream.once("close", () => propagateCloseEventToSources(streams)); + mergedStream.once("end", () => propagateCloseEventToSources(streams)); + return mergedStream; +} +function propagateCloseEventToSources(streams) { + streams.forEach((stream4) => stream4.emit("close")); +} +function isString(input) { + return typeof input === "string"; +} +function isEmpty$1(input) { + return input === ""; +} +function generate(patterns2, settings2) { + const positivePatterns = getPositivePatterns(patterns2); + const negativePatterns = getNegativePatternsAsPositive(patterns2, settings2.ignore); + const staticPatterns = positivePatterns.filter((pattern2) => utils$a.pattern.isStaticPattern(pattern2, settings2)); + const dynamicPatterns = positivePatterns.filter((pattern2) => utils$a.pattern.isDynamicPattern(pattern2, settings2)); + const staticTasks = convertPatternsToTasks( + staticPatterns, + negativePatterns, + /* dynamic */ + false + ); + const dynamicTasks = convertPatternsToTasks( + dynamicPatterns, + negativePatterns, + /* dynamic */ + true + ); + return staticTasks.concat(dynamicTasks); +} +function convertPatternsToTasks(positive, negative, dynamic) { + const tasks2 = []; + const patternsOutsideCurrentDirectory = utils$a.pattern.getPatternsOutsideCurrentDirectory(positive); + const patternsInsideCurrentDirectory = utils$a.pattern.getPatternsInsideCurrentDirectory(positive); + const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsOutsideCurrentDirectory); + const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsInsideCurrentDirectory); + tasks2.push(...convertPatternGroupsToTasks(outsideCurrentDirectoryGroup, negative, dynamic)); + if ("." in insideCurrentDirectoryGroup) { + tasks2.push(convertPatternGroupToTask(".", patternsInsideCurrentDirectory, negative, dynamic)); + } else { + tasks2.push(...convertPatternGroupsToTasks(insideCurrentDirectoryGroup, negative, dynamic)); + } + return tasks2; +} +function getPositivePatterns(patterns2) { + return utils$a.pattern.getPositivePatterns(patterns2); +} +function getNegativePatternsAsPositive(patterns2, ignore2) { + const negative = utils$a.pattern.getNegativePatterns(patterns2).concat(ignore2); + const positive = negative.map(utils$a.pattern.convertToPositivePattern); + return positive; +} +function groupPatternsByBaseDirectory(patterns2) { + const group = {}; + return patterns2.reduce((collection, pattern2) => { + const base2 = utils$a.pattern.getBaseDirectory(pattern2); + if (base2 in collection) { + collection[base2].push(pattern2); + } else { + collection[base2] = [pattern2]; + } + return collection; + }, group); +} +function convertPatternGroupsToTasks(positive, negative, dynamic) { + return Object.keys(positive).map((base2) => { + return convertPatternGroupToTask(base2, positive[base2], negative, dynamic); + }); +} +function convertPatternGroupToTask(base2, positive, negative, dynamic) { + return { + dynamic, + positive, + negative, + base: base2, + patterns: [].concat(positive, negative.map(utils$a.pattern.convertToNegativePattern)) + }; +} +function transform(patterns2) { + return patterns2.map((pattern2) => removeDuplicateSlashes(pattern2)); +} +function removeDuplicateSlashes(pattern2) { + return pattern2.replace(DOUBLE_SLASH_RE$1, "/"); +} +function read$3(path3, settings2, callback) { + settings2.fs.lstat(path3, (lstatError, lstat2) => { + if (lstatError !== null) { + callFailureCallback$2(callback, lstatError); + return; + } + if (!lstat2.isSymbolicLink() || !settings2.followSymbolicLink) { + callSuccessCallback$2(callback, lstat2); + return; + } + settings2.fs.stat(path3, (statError, stat2) => { + if (statError !== null) { + if (settings2.throwErrorOnBrokenSymbolicLink) { + callFailureCallback$2(callback, statError); + return; + } + callSuccessCallback$2(callback, lstat2); + return; + } + if (settings2.markSymbolicLink) { + stat2.isSymbolicLink = () => true; + } + callSuccessCallback$2(callback, stat2); + }); + }); +} +function callFailureCallback$2(callback, error2) { + callback(error2); +} +function callSuccessCallback$2(callback, result) { + callback(null, result); +} +function read$2(path3, settings2) { + const lstat2 = settings2.fs.lstatSync(path3); + if (!lstat2.isSymbolicLink() || !settings2.followSymbolicLink) { + return lstat2; + } + try { + const stat2 = settings2.fs.statSync(path3); + if (settings2.markSymbolicLink) { + stat2.isSymbolicLink = () => true; + } + return stat2; + } catch (error2) { + if (!settings2.throwErrorOnBrokenSymbolicLink) { + return lstat2; + } + throw error2; + } +} +function stat$4(path3, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === "function") { + async$1.read(path3, getSettings$2(), optionsOrSettingsOrCallback); + return; + } + async$1.read(path3, getSettings$2(optionsOrSettingsOrCallback), callback); +} +function statSync(path3, optionsOrSettings) { + const settings2 = getSettings$2(optionsOrSettings); + return sync$7.read(path3, settings2); +} +function getSettings$2(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1$3.default) { + return settingsOrOptions; + } + return new settings_1$3.default(settingsOrOptions); +} +function runParallel(tasks2, cb) { + let results, pending, keys; + let isSync = true; + if (Array.isArray(tasks2)) { + results = []; + pending = tasks2.length; + } else { + keys = Object.keys(tasks2); + results = {}; + pending = keys.length; + } + function done(err) { + function end() { + if (cb) + cb(err, results); + cb = null; + } + if (isSync) + queueMicrotask$1(end); + else + end(); + } + function each(i, err, result) { + results[i] = result; + if (--pending === 0 || err) { + done(err); + } + } + if (!pending) { + done(null); + } else if (keys) { + keys.forEach(function(key) { + tasks2[key](function(err, result) { + each(key, err, result); + }); + }); + } else { + tasks2.forEach(function(task, i) { + task(function(err, result) { + each(i, err, result); + }); + }); + } + isSync = false; +} +function createDirentFromStats(name2, stats) { + return new DirentFromStats2(name2, stats); +} +function joinPathSegments$1(a, b, separator) { + if (a.endsWith(separator)) { + return a + b; + } + return a + separator + b; +} +function read$1(directory, settings2, callback) { + if (!settings2.stats && constants_1$1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { + readdirWithFileTypes$1(directory, settings2, callback); + return; + } + readdir$3(directory, settings2, callback); +} +function readdirWithFileTypes$1(directory, settings2, callback) { + settings2.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => { + if (readdirError !== null) { + callFailureCallback$1(callback, readdirError); + return; + } + const entries = dirents.map((dirent) => ({ + dirent, + name: dirent.name, + path: common$9.joinPathSegments(directory, dirent.name, settings2.pathSegmentSeparator) + })); + if (!settings2.followSymbolicLinks) { + callSuccessCallback$1(callback, entries); + return; + } + const tasks2 = entries.map((entry2) => makeRplTaskEntry(entry2, settings2)); + rpl(tasks2, (rplError, rplEntries) => { + if (rplError !== null) { + callFailureCallback$1(callback, rplError); + return; + } + callSuccessCallback$1(callback, rplEntries); + }); + }); +} +function makeRplTaskEntry(entry2, settings2) { + return (done) => { + if (!entry2.dirent.isSymbolicLink()) { + done(null, entry2); + return; + } + settings2.fs.stat(entry2.path, (statError, stats) => { + if (statError !== null) { + if (settings2.throwErrorOnBrokenSymbolicLink) { + done(statError); + return; + } + done(null, entry2); + return; + } + entry2.dirent = utils$8.fs.createDirentFromStats(entry2.name, stats); + done(null, entry2); + }); + }; +} +function readdir$3(directory, settings2, callback) { + settings2.fs.readdir(directory, (readdirError, names) => { + if (readdirError !== null) { + callFailureCallback$1(callback, readdirError); + return; + } + const tasks2 = names.map((name2) => { + const path3 = common$9.joinPathSegments(directory, name2, settings2.pathSegmentSeparator); + return (done) => { + fsStat$5.stat(path3, settings2.fsStatSettings, (error2, stats) => { + if (error2 !== null) { + done(error2); + return; + } + const entry2 = { + name: name2, + path: path3, + dirent: utils$8.fs.createDirentFromStats(name2, stats) + }; + if (settings2.stats) { + entry2.stats = stats; + } + done(null, entry2); + }); + }; + }); + rpl(tasks2, (rplError, entries) => { + if (rplError !== null) { + callFailureCallback$1(callback, rplError); + return; + } + callSuccessCallback$1(callback, entries); + }); + }); +} +function callFailureCallback$1(callback, error2) { + callback(error2); +} +function callSuccessCallback$1(callback, result) { + callback(null, result); +} +function read(directory, settings2) { + if (!settings2.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { + return readdirWithFileTypes(directory, settings2); + } + return readdir$2(directory, settings2); +} +function readdirWithFileTypes(directory, settings2) { + const dirents = settings2.fs.readdirSync(directory, { withFileTypes: true }); + return dirents.map((dirent) => { + const entry2 = { + dirent, + name: dirent.name, + path: common$8.joinPathSegments(directory, dirent.name, settings2.pathSegmentSeparator) + }; + if (entry2.dirent.isSymbolicLink() && settings2.followSymbolicLinks) { + try { + const stats = settings2.fs.statSync(entry2.path); + entry2.dirent = utils$7.fs.createDirentFromStats(entry2.name, stats); + } catch (error2) { + if (settings2.throwErrorOnBrokenSymbolicLink) { + throw error2; + } + } + } + return entry2; + }); +} +function readdir$2(directory, settings2) { + const names = settings2.fs.readdirSync(directory); + return names.map((name2) => { + const entryPath = common$8.joinPathSegments(directory, name2, settings2.pathSegmentSeparator); + const stats = fsStat$4.statSync(entryPath, settings2.fsStatSettings); + const entry2 = { + name: name2, + path: entryPath, + dirent: utils$7.fs.createDirentFromStats(name2, stats) + }; + if (settings2.stats) { + entry2.stats = stats; + } + return entry2; + }); +} +function scandir(path3, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === "function") { + async.read(path3, getSettings$1(), optionsOrSettingsOrCallback); + return; + } + async.read(path3, getSettings$1(optionsOrSettingsOrCallback), callback); +} +function scandirSync(path3, optionsOrSettings) { + const settings2 = getSettings$1(optionsOrSettings); + return sync$5.read(path3, settings2); +} +function getSettings$1(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1$2.default) { + return settingsOrOptions; + } + return new settings_1$2.default(settingsOrOptions); +} +function reusify$1(Constructor) { + var head = new Constructor(); + var tail = head; + function get2() { + var current2 = head; + if (current2.next) { + head = current2.next; + } else { + head = new Constructor(); + tail = head; + } + current2.next = null; + return current2; + } + function release(obj) { + tail.next = obj; + tail = obj; + } + return { + get: get2, + release + }; +} +function fastqueue(context, worker, concurrency) { + if (typeof context === "function") { + concurrency = worker; + worker = context; + context = null; + } + if (concurrency < 1) { + throw new Error("fastqueue concurrency must be greater than 1"); + } + var cache = reusify(Task); + var queueHead = null; + var queueTail = null; + var _running = 0; + var errorHandler = null; + var self2 = { + push: push2, + drain: noop$3, + saturated: noop$3, + pause, + paused: false, + concurrency, + running, + resume: resume2, + idle, + length, + getQueue, + unshift, + empty: noop$3, + kill, + killAndDrain, + error: error2 + }; + return self2; + function running() { + return _running; + } + function pause() { + self2.paused = true; + } + function length() { + var current2 = queueHead; + var counter = 0; + while (current2) { + current2 = current2.next; + counter++; + } + return counter; + } + function getQueue() { + var current2 = queueHead; + var tasks2 = []; + while (current2) { + tasks2.push(current2.value); + current2 = current2.next; + } + return tasks2; + } + function resume2() { + if (!self2.paused) + return; + self2.paused = false; + for (var i = 0; i < self2.concurrency; i++) { + _running++; + release(); + } + } + function idle() { + return _running === 0 && self2.length() === 0; + } + function push2(value2, done) { + var current2 = cache.get(); + current2.context = context; + current2.release = release; + current2.value = value2; + current2.callback = done || noop$3; + current2.errorHandler = errorHandler; + if (_running === self2.concurrency || self2.paused) { + if (queueTail) { + queueTail.next = current2; + queueTail = current2; + } else { + queueHead = current2; + queueTail = current2; + self2.saturated(); + } + } else { + _running++; + worker.call(context, current2.value, current2.worked); + } + } + function unshift(value2, done) { + var current2 = cache.get(); + current2.context = context; + current2.release = release; + current2.value = value2; + current2.callback = done || noop$3; + if (_running === self2.concurrency || self2.paused) { + if (queueHead) { + current2.next = queueHead; + queueHead = current2; + } else { + queueHead = current2; + queueTail = current2; + self2.saturated(); + } + } else { + _running++; + worker.call(context, current2.value, current2.worked); + } + } + function release(holder) { + if (holder) { + cache.release(holder); + } + var next = queueHead; + if (next) { + if (!self2.paused) { + if (queueTail === queueHead) { + queueTail = null; + } + queueHead = next.next; + next.next = null; + worker.call(context, next.value, next.worked); + if (queueTail === null) { + self2.empty(); + } + } else { + _running--; + } + } else if (--_running === 0) { + self2.drain(); + } + } + function kill() { + queueHead = null; + queueTail = null; + self2.drain = noop$3; + } + function killAndDrain() { + queueHead = null; + queueTail = null; + self2.drain(); + self2.drain = noop$3; + } + function error2(handler) { + errorHandler = handler; + } +} +function noop$3() { +} +function Task() { + this.value = null; + this.callback = noop$3; + this.next = null; + this.release = noop$3; + this.context = null; + this.errorHandler = null; + var self2 = this; + this.worked = function worked(err, result) { + var callback = self2.callback; + var errorHandler = self2.errorHandler; + var val = self2.value; + self2.value = null; + self2.callback = noop$3; + if (self2.errorHandler) { + errorHandler(err, val); + } + callback.call(self2.context, err, result); + self2.release(self2); + }; +} +function queueAsPromised(context, worker, concurrency) { + if (typeof context === "function") { + concurrency = worker; + worker = context; + context = null; + } + function asyncWrapper(arg, cb) { + worker.call(this, arg).then(function(res) { + cb(null, res); + }, cb); + } + var queue2 = fastqueue(context, asyncWrapper, concurrency); + var pushCb = queue2.push; + var unshiftCb = queue2.unshift; + queue2.push = push2; + queue2.unshift = unshift; + queue2.drained = drained; + return queue2; + function push2(value2) { + var p = new Promise(function(resolve3, reject) { + pushCb(value2, function(err, result) { + if (err) { + reject(err); + return; + } + resolve3(result); + }); + }); + p.catch(noop$3); + return p; + } + function unshift(value2) { + var p = new Promise(function(resolve3, reject) { + unshiftCb(value2, function(err, result) { + if (err) { + reject(err); + return; + } + resolve3(result); + }); + }); + p.catch(noop$3); + return p; + } + function drained() { + var previousDrain = queue2.drain; + var p = new Promise(function(resolve3) { + queue2.drain = function() { + previousDrain(); + resolve3(); + }; + }); + return p; + } +} +function isFatalError(settings2, error2) { + if (settings2.errorFilter === null) { + return true; + } + return !settings2.errorFilter(error2); +} +function isAppliedFilter(filter2, value2) { + return filter2 === null || filter2(value2); +} +function replacePathSegmentSeparator(filepath, separator) { + return filepath.split(/[/\\]/).join(separator); +} +function joinPathSegments(a, b, separator) { + if (a === "") { + return b; + } + if (a.endsWith(separator)) { + return a + b; + } + return a + separator + b; +} +function callFailureCallback(callback, error2) { + callback(error2); +} +function callSuccessCallback(callback, entries) { + callback(null, entries); +} +function walk$2(directory, optionsOrSettingsOrCallback, callback) { + if (typeof optionsOrSettingsOrCallback === "function") { + new async_1$2.default(directory, getSettings()).read(optionsOrSettingsOrCallback); + return; + } + new async_1$2.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback); +} +function walkSync(directory, optionsOrSettings) { + const settings2 = getSettings(optionsOrSettings); + const provider2 = new sync_1$2.default(directory, settings2); + return provider2.read(); +} +function walkStream(directory, optionsOrSettings) { + const settings2 = getSettings(optionsOrSettings); + const provider2 = new stream_1$4.default(directory, settings2); + return provider2.read(); +} +function getSettings(settingsOrOptions = {}) { + if (settingsOrOptions instanceof settings_1$1.default) { + return settingsOrOptions; + } + return new settings_1$1.default(settingsOrOptions); +} +async function FastGlob(source, options2) { + assertPatternsInput(source); + const works = getWorks(source, async_1.default, options2); + const result = await Promise.all(works); + return utils.array.flatten(result); +} +function getWorks(source, _Provider, options2) { + const patterns2 = patternManager.transform([].concat(source)); + const settings2 = new settings_1.default(options2); + const tasks2 = taskManager.generate(patterns2, settings2); + const provider2 = new _Provider(settings2); + return tasks2.map(provider2.read, provider2); +} +function assertPatternsInput(input) { + const source = [].concat(input); + const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item)); + if (!isValidSource) { + throw new TypeError("Patterns must be a string (non empty) or an array of strings"); + } +} +function isCollection$1(node2) { + if (node2 && typeof node2 === "object") + switch (node2[NODE_TYPE]) { + case MAP: + case SEQ: + return true; + } + return false; +} +function isNode$1(node2) { + if (node2 && typeof node2 === "object") + switch (node2[NODE_TYPE]) { + case ALIAS: + case MAP: + case SCALAR$1: + case SEQ: + return true; + } + return false; +} +function visit$1(node2, visitor) { + const visitor_ = initVisitor(visitor); + if (isDocument(node2)) { + const cd = visit_(null, node2.contents, visitor_, Object.freeze([node2])); + if (cd === REMOVE$1) + node2.contents = null; + } else + visit_(null, node2, visitor_, Object.freeze([])); +} +function visit_(key, node2, visitor, path3) { + const ctrl = callVisitor(key, node2, visitor, path3); + if (isNode$1(ctrl) || isPair(ctrl)) { + replaceNode(key, path3, ctrl); + return visit_(key, ctrl, visitor, path3); + } + if (typeof ctrl !== "symbol") { + if (isCollection$1(node2)) { + path3 = Object.freeze(path3.concat(node2)); + for (let i = 0; i < node2.items.length; ++i) { + const ci = visit_(i, node2.items[i], visitor, path3); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK$1) + return BREAK$1; + else if (ci === REMOVE$1) { + node2.items.splice(i, 1); + i -= 1; + } + } + } else if (isPair(node2)) { + path3 = Object.freeze(path3.concat(node2)); + const ck = visit_("key", node2.key, visitor, path3); + if (ck === BREAK$1) + return BREAK$1; + else if (ck === REMOVE$1) + node2.key = null; + const cv = visit_("value", node2.value, visitor, path3); + if (cv === BREAK$1) + return BREAK$1; + else if (cv === REMOVE$1) + node2.value = null; + } + } + return ctrl; +} +async function visitAsync(node2, visitor) { + const visitor_ = initVisitor(visitor); + if (isDocument(node2)) { + const cd = await visitAsync_(null, node2.contents, visitor_, Object.freeze([node2])); + if (cd === REMOVE$1) + node2.contents = null; + } else + await visitAsync_(null, node2, visitor_, Object.freeze([])); +} +async function visitAsync_(key, node2, visitor, path3) { + const ctrl = await callVisitor(key, node2, visitor, path3); + if (isNode$1(ctrl) || isPair(ctrl)) { + replaceNode(key, path3, ctrl); + return visitAsync_(key, ctrl, visitor, path3); + } + if (typeof ctrl !== "symbol") { + if (isCollection$1(node2)) { + path3 = Object.freeze(path3.concat(node2)); + for (let i = 0; i < node2.items.length; ++i) { + const ci = await visitAsync_(i, node2.items[i], visitor, path3); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK$1) + return BREAK$1; + else if (ci === REMOVE$1) { + node2.items.splice(i, 1); + i -= 1; + } + } + } else if (isPair(node2)) { + path3 = Object.freeze(path3.concat(node2)); + const ck = await visitAsync_("key", node2.key, visitor, path3); + if (ck === BREAK$1) + return BREAK$1; + else if (ck === REMOVE$1) + node2.key = null; + const cv = await visitAsync_("value", node2.value, visitor, path3); + if (cv === BREAK$1) + return BREAK$1; + else if (cv === REMOVE$1) + node2.value = null; + } + } + return ctrl; +} +function initVisitor(visitor) { + if (typeof visitor === "object" && (visitor.Collection || visitor.Node || visitor.Value)) { + return Object.assign({ + Alias: visitor.Node, + Map: visitor.Node, + Scalar: visitor.Node, + Seq: visitor.Node + }, visitor.Value && { + Map: visitor.Value, + Scalar: visitor.Value, + Seq: visitor.Value + }, visitor.Collection && { + Map: visitor.Collection, + Seq: visitor.Collection + }, visitor); + } + return visitor; +} +function callVisitor(key, node2, visitor, path3) { + var _a, _b, _c, _d, _e; + if (typeof visitor === "function") + return visitor(key, node2, path3); + if (isMap(node2)) + return (_a = visitor.Map) == null ? void 0 : _a.call(visitor, key, node2, path3); + if (isSeq(node2)) + return (_b = visitor.Seq) == null ? void 0 : _b.call(visitor, key, node2, path3); + if (isPair(node2)) + return (_c = visitor.Pair) == null ? void 0 : _c.call(visitor, key, node2, path3); + if (isScalar$1(node2)) + return (_d = visitor.Scalar) == null ? void 0 : _d.call(visitor, key, node2, path3); + if (isAlias(node2)) + return (_e = visitor.Alias) == null ? void 0 : _e.call(visitor, key, node2, path3); + return void 0; +} +function replaceNode(key, path3, node2) { + const parent = path3[path3.length - 1]; + if (isCollection$1(parent)) { + parent.items[key] = node2; + } else if (isPair(parent)) { + if (key === "key") + parent.key = node2; + else + parent.value = node2; + } else if (isDocument(parent)) { + parent.contents = node2; + } else { + const pt = isAlias(parent) ? "alias" : "scalar"; + throw new Error(`Cannot replace node with ${pt} parent`); + } +} +function anchorIsValid(anchor) { + if (/[\x00-\x19\s,[\]{}]/.test(anchor)) { + const sa = JSON.stringify(anchor); + const msg = `Anchor must not contain whitespace or control characters: ${sa}`; + throw new Error(msg); + } + return true; +} +function anchorNames(root) { + const anchors = /* @__PURE__ */ new Set(); + visit$1(root, { + Value(_key, node2) { + if (node2.anchor) + anchors.add(node2.anchor); + } + }); + return anchors; +} +function findNewAnchor(prefix, exclude) { + for (let i = 1; true; ++i) { + const name2 = `${prefix}${i}`; + if (!exclude.has(name2)) + return name2; + } +} +function createNodeAnchors(doc, prefix) { + const aliasObjects = []; + const sourceObjects = /* @__PURE__ */ new Map(); + let prevAnchors = null; + return { + onAnchor: (source) => { + aliasObjects.push(source); + if (!prevAnchors) + prevAnchors = anchorNames(doc); + const anchor = findNewAnchor(prefix, prevAnchors); + prevAnchors.add(anchor); + return anchor; + }, + /** + * With circular references, the source node is only resolved after all + * of its child nodes are. This is why anchors are set only after all of + * the nodes have been created. + */ + setAnchors: () => { + for (const source of aliasObjects) { + const ref2 = sourceObjects.get(source); + if (typeof ref2 === "object" && ref2.anchor && (isScalar$1(ref2.node) || isCollection$1(ref2.node))) { + ref2.node.anchor = ref2.anchor; + } else { + const error2 = new Error("Failed to resolve repeated object (this should not happen)"); + error2.source = source; + throw error2; + } + } + }, + sourceObjects + }; +} +function getAliasCount(doc, node2, anchors) { + if (isAlias(node2)) { + const source = node2.resolve(doc); + const anchor = anchors && source && anchors.get(source); + return anchor ? anchor.count * anchor.aliasCount : 0; + } else if (isCollection$1(node2)) { + let count = 0; + for (const item of node2.items) { + const c = getAliasCount(doc, item, anchors); + if (c > count) + count = c; + } + return count; + } else if (isPair(node2)) { + const kc = getAliasCount(doc, node2.key, anchors); + const vc = getAliasCount(doc, node2.value, anchors); + return Math.max(kc, vc); + } + return 1; +} +function toJS(value2, arg, ctx) { + if (Array.isArray(value2)) + return value2.map((v, i) => toJS(v, String(i), ctx)); + if (value2 && typeof value2.toJSON === "function") { + if (!ctx || !hasAnchor(value2)) + return value2.toJSON(arg, ctx); + const data2 = { aliasCount: 0, count: 1, res: void 0 }; + ctx.anchors.set(value2, data2); + ctx.onCreate = (res2) => { + data2.res = res2; + delete ctx.onCreate; + }; + const res = value2.toJSON(arg, ctx); + if (ctx.onCreate) + ctx.onCreate(res); + return res; + } + if (typeof value2 === "bigint" && !(ctx == null ? void 0 : ctx.keep)) + return Number(value2); + return value2; +} +function findTagObject(value2, tagName, tags) { + if (tagName) { + const match = tags.filter((t) => t.tag === tagName); + const tagObj = match.find((t) => !t.format) ?? match[0]; + if (!tagObj) + throw new Error(`Tag ${tagName} not found`); + return tagObj; + } + return tags.find((t) => { + var _a; + return ((_a = t.identify) == null ? void 0 : _a.call(t, value2)) && !t.format; + }); +} +function createNode(value2, tagName, ctx) { + var _a, _b; + if (isDocument(value2)) + value2 = value2.contents; + if (isNode$1(value2)) + return value2; + if (isPair(value2)) { + const map2 = (_b = (_a = ctx.schema[MAP]).createNode) == null ? void 0 : _b.call(_a, ctx.schema, null, ctx); + map2.items.push(value2); + return map2; + } + if (value2 instanceof String || value2 instanceof Number || value2 instanceof Boolean || typeof BigInt === "function" && value2 instanceof BigInt) { + value2 = value2.valueOf(); + } + const { aliasDuplicateObjects, onAnchor, onTagObj, schema: schema2, sourceObjects } = ctx; + let ref2 = void 0; + if (aliasDuplicateObjects && value2 && typeof value2 === "object") { + ref2 = sourceObjects.get(value2); + if (ref2) { + if (!ref2.anchor) + ref2.anchor = onAnchor(value2); + return new Alias(ref2.anchor); + } else { + ref2 = { anchor: null, node: null }; + sourceObjects.set(value2, ref2); + } + } + if (tagName == null ? void 0 : tagName.startsWith("!!")) + tagName = defaultTagPrefix + tagName.slice(2); + let tagObj = findTagObject(value2, tagName, schema2.tags); + if (!tagObj) { + if (value2 && typeof value2.toJSON === "function") { + value2 = value2.toJSON(); + } + if (!value2 || typeof value2 !== "object") { + const node3 = new Scalar(value2); + if (ref2) + ref2.node = node3; + return node3; + } + tagObj = value2 instanceof Map ? schema2[MAP] : Symbol.iterator in Object(value2) ? schema2[SEQ] : schema2[MAP]; + } + if (onTagObj) { + onTagObj(tagObj); + delete ctx.onTagObj; + } + const node2 = (tagObj == null ? void 0 : tagObj.createNode) ? tagObj.createNode(ctx.schema, value2, ctx) : new Scalar(value2); + if (tagName) + node2.tag = tagName; + if (ref2) + ref2.node = node2; + return node2; +} +function collectionFromPath(schema2, path3, value2) { + let v = value2; + for (let i = path3.length - 1; i >= 0; --i) { + const k = path3[i]; + if (typeof k === "number" && Number.isInteger(k) && k >= 0) { + const a = []; + a[k] = v; + v = a; + } else { + v = /* @__PURE__ */ new Map([[k, v]]); + } + } + return createNode(v, void 0, { + aliasDuplicateObjects: false, + keepUndefined: false, + onAnchor: () => { + throw new Error("This should not happen, please report a bug."); + }, + schema: schema2, + sourceObjects: /* @__PURE__ */ new Map() + }); +} +function indentComment(comment, indent) { + if (/^\n+$/.test(comment)) + return comment.substring(1); + return indent ? comment.replace(/^(?! *$)/gm, indent) : comment; +} +function foldFlowLines(text, indent, mode2 = "flow", { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) { + if (!lineWidth || lineWidth < 0) + return text; + const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length); + if (text.length <= endStep) + return text; + const folds = []; + const escapedFolds = {}; + let end = lineWidth - indent.length; + if (typeof indentAtStart === "number") { + if (indentAtStart > lineWidth - Math.max(2, minContentWidth)) + folds.push(0); + else + end = lineWidth - indentAtStart; + } + let split = void 0; + let prev = void 0; + let overflow = false; + let i = -1; + let escStart = -1; + let escEnd = -1; + if (mode2 === FOLD_BLOCK) { + i = consumeMoreIndentedLines(text, i); + if (i !== -1) + end = i + endStep; + } + for (let ch; ch = text[i += 1]; ) { + if (mode2 === FOLD_QUOTED && ch === "\\") { + escStart = i; + switch (text[i + 1]) { + case "x": + i += 3; + break; + case "u": + i += 5; + break; + case "U": + i += 9; + break; + default: + i += 1; + } + escEnd = i; + } + if (ch === "\n") { + if (mode2 === FOLD_BLOCK) + i = consumeMoreIndentedLines(text, i); + end = i + endStep; + split = void 0; + } else { + if (ch === " " && prev && prev !== " " && prev !== "\n" && prev !== " ") { + const next = text[i + 1]; + if (next && next !== " " && next !== "\n" && next !== " ") + split = i; + } + if (i >= end) { + if (split) { + folds.push(split); + end = split + endStep; + split = void 0; + } else if (mode2 === FOLD_QUOTED) { + while (prev === " " || prev === " ") { + prev = ch; + ch = text[i += 1]; + overflow = true; + } + const j = i > escEnd + 1 ? i - 2 : escStart - 1; + if (escapedFolds[j]) + return text; + folds.push(j); + escapedFolds[j] = true; + end = j + endStep; + split = void 0; + } else { + overflow = true; + } + } + } + prev = ch; + } + if (overflow && onOverflow) + onOverflow(); + if (folds.length === 0) + return text; + if (onFold) + onFold(); + let res = text.slice(0, folds[0]); + for (let i2 = 0; i2 < folds.length; ++i2) { + const fold = folds[i2]; + const end2 = folds[i2 + 1] || text.length; + if (fold === 0) + res = ` +${indent}${text.slice(0, end2)}`; + else { + if (mode2 === FOLD_QUOTED && escapedFolds[fold]) + res += `${text[fold]}\\`; + res += ` +${indent}${text.slice(fold + 1, end2)}`; + } + } + return res; +} +function consumeMoreIndentedLines(text, i) { + let ch = text[i + 1]; + while (ch === " " || ch === " ") { + do { + ch = text[i += 1]; + } while (ch && ch !== "\n"); + ch = text[i + 1]; + } + return i; +} +function lineLengthOverLimit(str, lineWidth, indentLength) { + if (!lineWidth || lineWidth < 0) + return false; + const limit = lineWidth - indentLength; + const strLen = str.length; + if (strLen <= limit) + return false; + for (let i = 0, start = 0; i < strLen; ++i) { + if (str[i] === "\n") { + if (i - start > limit) + return true; + start = i + 1; + if (strLen - start <= limit) + return false; + } + } + return true; +} +function doubleQuotedString(value2, ctx) { + const json = JSON.stringify(value2); + if (ctx.options.doubleQuotedAsJSON) + return json; + const { implicitKey } = ctx; + const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength; + const indent = ctx.indent || (containsDocumentMarker(value2) ? " " : ""); + let str = ""; + let start = 0; + for (let i = 0, ch = json[i]; ch; ch = json[++i]) { + if (ch === " " && json[i + 1] === "\\" && json[i + 2] === "n") { + str += json.slice(start, i) + "\\ "; + i += 1; + start = i; + ch = "\\"; + } + if (ch === "\\") + switch (json[i + 1]) { + case "u": + { + str += json.slice(start, i); + const code = json.substr(i + 2, 4); + switch (code) { + case "0000": + str += "\\0"; + break; + case "0007": + str += "\\a"; + break; + case "000b": + str += "\\v"; + break; + case "001b": + str += "\\e"; + break; + case "0085": + str += "\\N"; + break; + case "00a0": + str += "\\_"; + break; + case "2028": + str += "\\L"; + break; + case "2029": + str += "\\P"; + break; + default: + if (code.substr(0, 2) === "00") + str += "\\x" + code.substr(2); + else + str += json.substr(i, 6); + } + i += 5; + start = i + 1; + } + break; + case "n": + if (implicitKey || json[i + 2] === '"' || json.length < minMultiLineLength) { + i += 1; + } else { + str += json.slice(start, i) + "\n\n"; + while (json[i + 2] === "\\" && json[i + 3] === "n" && json[i + 4] !== '"') { + str += "\n"; + i += 2; + } + str += indent; + if (json[i + 2] === " ") + str += "\\"; + i += 1; + start = i + 1; + } + break; + default: + i += 1; + } + } + str = start ? str + json.slice(start) : json; + return implicitKey ? str : foldFlowLines(str, indent, FOLD_QUOTED, getFoldOptions(ctx)); +} +function singleQuotedString(value2, ctx) { + if (ctx.options.singleQuote === false || ctx.implicitKey && value2.includes("\n") || /[ \t]\n|\n[ \t]/.test(value2)) + return doubleQuotedString(value2, ctx); + const indent = ctx.indent || (containsDocumentMarker(value2) ? " " : ""); + const res = "'" + value2.replace(/'/g, "''").replace(/\n+/g, `$& +${indent}`) + "'"; + return ctx.implicitKey ? res : foldFlowLines(res, indent, FOLD_FLOW, getFoldOptions(ctx)); +} +function quotedString(value2, ctx) { + const { singleQuote } = ctx.options; + let qs; + if (singleQuote === false) + qs = doubleQuotedString; + else { + const hasDouble = value2.includes('"'); + const hasSingle = value2.includes("'"); + if (hasDouble && !hasSingle) + qs = singleQuotedString; + else if (hasSingle && !hasDouble) + qs = doubleQuotedString; + else + qs = singleQuote ? singleQuotedString : doubleQuotedString; + } + return qs(value2, ctx); +} +function blockString({ comment, type, value: value2 }, ctx, onComment, onChompKeep) { + const { blockQuote, commentString, lineWidth } = ctx.options; + if (!blockQuote || /\n[\t ]+$/.test(value2) || /^\s*$/.test(value2)) { + return quotedString(value2, ctx); + } + const indent = ctx.indent || (ctx.forceBlockIndent || containsDocumentMarker(value2) ? " " : ""); + const literal2 = blockQuote === "literal" ? true : blockQuote === "folded" || type === Scalar.BLOCK_FOLDED ? false : type === Scalar.BLOCK_LITERAL ? true : !lineLengthOverLimit(value2, lineWidth, indent.length); + if (!value2) + return literal2 ? "|\n" : ">\n"; + let chomp; + let endStart; + for (endStart = value2.length; endStart > 0; --endStart) { + const ch = value2[endStart - 1]; + if (ch !== "\n" && ch !== " " && ch !== " ") + break; + } + let end = value2.substring(endStart); + const endNlPos = end.indexOf("\n"); + if (endNlPos === -1) { + chomp = "-"; + } else if (value2 === end || endNlPos !== end.length - 1) { + chomp = "+"; + if (onChompKeep) + onChompKeep(); + } else { + chomp = ""; + } + if (end) { + value2 = value2.slice(0, -end.length); + if (end[end.length - 1] === "\n") + end = end.slice(0, -1); + end = end.replace(/\n+(?!\n|$)/g, `$&${indent}`); + } + let startWithSpace = false; + let startEnd; + let startNlPos = -1; + for (startEnd = 0; startEnd < value2.length; ++startEnd) { + const ch = value2[startEnd]; + if (ch === " ") + startWithSpace = true; + else if (ch === "\n") + startNlPos = startEnd; + else + break; + } + let start = value2.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd); + if (start) { + value2 = value2.substring(start.length); + start = start.replace(/\n+/g, `$&${indent}`); + } + const indentSize = indent ? "2" : "1"; + let header = (literal2 ? "|" : ">") + (startWithSpace ? indentSize : "") + chomp; + if (comment) { + header += " " + commentString(comment.replace(/ ?[\r\n]+/g, " ")); + if (onComment) + onComment(); + } + if (literal2) { + value2 = value2.replace(/\n+/g, `$&${indent}`); + return `${header} +${indent}${start}${value2}${end}`; + } + value2 = value2.replace(/\n+/g, "\n$&").replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, "$1$2").replace(/\n+/g, `$&${indent}`); + const body = foldFlowLines(`${start}${value2}${end}`, indent, FOLD_BLOCK, getFoldOptions(ctx)); + return `${header} +${indent}${body}`; +} +function plainString(item, ctx, onComment, onChompKeep) { + const { type, value: value2 } = item; + const { actualString, implicitKey, indent, inFlow } = ctx; + if (implicitKey && /[\n[\]{},]/.test(value2) || inFlow && /[[\]{},]/.test(value2)) { + return quotedString(value2, ctx); + } + if (!value2 || /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value2)) { + return implicitKey || inFlow || !value2.includes("\n") ? quotedString(value2, ctx) : blockString(item, ctx, onComment, onChompKeep); + } + if (!implicitKey && !inFlow && type !== Scalar.PLAIN && value2.includes("\n")) { + return blockString(item, ctx, onComment, onChompKeep); + } + if (indent === "" && containsDocumentMarker(value2)) { + ctx.forceBlockIndent = true; + return blockString(item, ctx, onComment, onChompKeep); + } + const str = value2.replace(/\n+/g, `$& +${indent}`); + if (actualString) { + const test = (tag) => { + var _a; + return tag.default && tag.tag !== "tag:yaml.org,2002:str" && ((_a = tag.test) == null ? void 0 : _a.test(str)); + }; + const { compat, tags } = ctx.doc.schema; + if (tags.some(test) || (compat == null ? void 0 : compat.some(test))) + return quotedString(value2, ctx); + } + return implicitKey ? str : foldFlowLines(str, indent, FOLD_FLOW, getFoldOptions(ctx)); +} +function stringifyString(item, ctx, onComment, onChompKeep) { + const { implicitKey, inFlow } = ctx; + const ss = typeof item.value === "string" ? item : Object.assign({}, item, { value: String(item.value) }); + let { type } = item; + if (type !== Scalar.QUOTE_DOUBLE) { + if (/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(ss.value)) + type = Scalar.QUOTE_DOUBLE; + } + const _stringify = (_type) => { + switch (_type) { + case Scalar.BLOCK_FOLDED: + case Scalar.BLOCK_LITERAL: + return implicitKey || inFlow ? quotedString(ss.value, ctx) : blockString(ss, ctx, onComment, onChompKeep); + case Scalar.QUOTE_DOUBLE: + return doubleQuotedString(ss.value, ctx); + case Scalar.QUOTE_SINGLE: + return singleQuotedString(ss.value, ctx); + case Scalar.PLAIN: + return plainString(ss, ctx, onComment, onChompKeep); + default: + return null; + } + }; + let res = _stringify(type); + if (res === null) { + const { defaultKeyType, defaultStringType } = ctx.options; + const t = implicitKey && defaultKeyType || defaultStringType; + res = _stringify(t); + if (res === null) + throw new Error(`Unsupported default string type ${t}`); + } + return res; +} +function createStringifyContext(doc, options2) { + const opt = Object.assign({ + blockQuote: true, + commentString: stringifyComment, + defaultKeyType: null, + defaultStringType: "PLAIN", + directives: null, + doubleQuotedAsJSON: false, + doubleQuotedMinMultiLineLength: 40, + falseStr: "false", + indentSeq: true, + lineWidth: 80, + minContentWidth: 20, + nullStr: "null", + simpleKeys: false, + singleQuote: null, + trueStr: "true", + verifyAliasOrder: true + }, doc.schema.toStringOptions, options2); + let inFlow; + switch (opt.collectionStyle) { + case "block": + inFlow = false; + break; + case "flow": + inFlow = true; + break; + default: + inFlow = null; + } + return { + anchors: /* @__PURE__ */ new Set(), + doc, + indent: "", + indentStep: typeof opt.indent === "number" ? " ".repeat(opt.indent) : " ", + inFlow, + options: opt + }; +} +function getTagObject(tags, item) { + var _a; + if (item.tag) { + const match = tags.filter((t) => t.tag === item.tag); + if (match.length > 0) + return match.find((t) => t.format === item.format) ?? match[0]; + } + let tagObj = void 0; + let obj; + if (isScalar$1(item)) { + obj = item.value; + const match = tags.filter((t) => { + var _a2; + return (_a2 = t.identify) == null ? void 0 : _a2.call(t, obj); + }); + tagObj = match.find((t) => t.format === item.format) ?? match.find((t) => !t.format); + } else { + obj = item; + tagObj = tags.find((t) => t.nodeClass && obj instanceof t.nodeClass); + } + if (!tagObj) { + const name2 = ((_a = obj == null ? void 0 : obj.constructor) == null ? void 0 : _a.name) ?? typeof obj; + throw new Error(`Tag not resolved for ${name2} value`); + } + return tagObj; +} +function stringifyProps(node2, tagObj, { anchors, doc }) { + if (!doc.directives) + return ""; + const props = []; + const anchor = (isScalar$1(node2) || isCollection$1(node2)) && node2.anchor; + if (anchor && anchorIsValid(anchor)) { + anchors.add(anchor); + props.push(`&${anchor}`); + } + const tag = node2.tag ? node2.tag : tagObj.default ? null : tagObj.tag; + if (tag) + props.push(doc.directives.tagString(tag)); + return props.join(" "); +} +function stringify$2(item, ctx, onComment, onChompKeep) { + var _a; + if (isPair(item)) + return item.toString(ctx, onComment, onChompKeep); + if (isAlias(item)) { + if (ctx.doc.directives) + return item.toString(ctx); + if ((_a = ctx.resolvedAliases) == null ? void 0 : _a.has(item)) { + throw new TypeError(`Cannot stringify circular structure without alias nodes`); + } else { + if (ctx.resolvedAliases) + ctx.resolvedAliases.add(item); + else + ctx.resolvedAliases = /* @__PURE__ */ new Set([item]); + item = item.resolve(ctx.doc); + } + } + let tagObj = void 0; + const node2 = isNode$1(item) ? item : ctx.doc.createNode(item, { onTagObj: (o) => tagObj = o }); + if (!tagObj) + tagObj = getTagObject(ctx.doc.schema.tags, node2); + const props = stringifyProps(node2, tagObj, ctx); + if (props.length > 0) + ctx.indentAtStart = (ctx.indentAtStart ?? 0) + props.length + 1; + const str = typeof tagObj.stringify === "function" ? tagObj.stringify(node2, ctx, onComment, onChompKeep) : isScalar$1(node2) ? stringifyString(node2, ctx, onComment, onChompKeep) : node2.toString(ctx, onComment, onChompKeep); + if (!props) + return str; + return isScalar$1(node2) || str[0] === "{" || str[0] === "[" ? `${props} ${str}` : `${props} +${ctx.indent}${str}`; +} +function stringifyPair({ key, value: value2 }, ctx, onComment, onChompKeep) { + const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx; + let keyComment = isNode$1(key) && key.comment || null; + if (simpleKeys) { + if (keyComment) { + throw new Error("With simple keys, key nodes cannot have comments"); + } + if (isCollection$1(key)) { + const msg = "With simple keys, collection cannot be used as a key value"; + throw new Error(msg); + } + } + let explicitKey = !simpleKeys && (!key || keyComment && value2 == null && !ctx.inFlow || isCollection$1(key) || (isScalar$1(key) ? key.type === Scalar.BLOCK_FOLDED || key.type === Scalar.BLOCK_LITERAL : typeof key === "object")); + ctx = Object.assign({}, ctx, { + allNullValues: false, + implicitKey: !explicitKey && (simpleKeys || !allNullValues), + indent: indent + indentStep + }); + let keyCommentDone = false; + let chompKeep = false; + let str = stringify$2(key, ctx, () => keyCommentDone = true, () => chompKeep = true); + if (!explicitKey && !ctx.inFlow && str.length > 1024) { + if (simpleKeys) + throw new Error("With simple keys, single line scalar must not span more than 1024 characters"); + explicitKey = true; + } + if (ctx.inFlow) { + if (allNullValues || value2 == null) { + if (keyCommentDone && onComment) + onComment(); + return str === "" ? "?" : explicitKey ? `? ${str}` : str; + } + } else if (allNullValues && !simpleKeys || value2 == null && explicitKey) { + str = `? ${str}`; + if (keyComment && !keyCommentDone) { + str += lineComment(str, ctx.indent, commentString(keyComment)); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; + } + if (keyCommentDone) + keyComment = null; + if (explicitKey) { + if (keyComment) + str += lineComment(str, ctx.indent, commentString(keyComment)); + str = `? ${str} +${indent}:`; + } else { + str = `${str}:`; + if (keyComment) + str += lineComment(str, ctx.indent, commentString(keyComment)); + } + let vcb = ""; + let valueComment = null; + if (isNode$1(value2)) { + if (value2.spaceBefore) + vcb = "\n"; + if (value2.commentBefore) { + const cs = commentString(value2.commentBefore); + vcb += ` +${indentComment(cs, ctx.indent)}`; + } + valueComment = value2.comment; + } else if (value2 && typeof value2 === "object") { + value2 = doc.createNode(value2); + } + ctx.implicitKey = false; + if (!explicitKey && !keyComment && isScalar$1(value2)) + ctx.indentAtStart = str.length + 1; + chompKeep = false; + if (!indentSeq && indentStep.length >= 2 && !ctx.inFlow && !explicitKey && isSeq(value2) && !value2.flow && !value2.tag && !value2.anchor) { + ctx.indent = ctx.indent.substr(2); + } + let valueCommentDone = false; + const valueStr = stringify$2(value2, ctx, () => valueCommentDone = true, () => chompKeep = true); + let ws = " "; + if (vcb || keyComment) { + if (valueStr === "" && !ctx.inFlow) + ws = vcb === "\n" ? "\n\n" : vcb; + else + ws = `${vcb} +${ctx.indent}`; + } else if (!explicitKey && isCollection$1(value2)) { + const flow = valueStr[0] === "[" || valueStr[0] === "{"; + if (!flow || valueStr.includes("\n")) + ws = ` +${ctx.indent}`; + } else if (valueStr === "" || valueStr[0] === "\n") + ws = ""; + str += ws + valueStr; + if (ctx.inFlow) { + if (valueCommentDone && onComment) + onComment(); + } else if (valueComment && !valueCommentDone) { + str += lineComment(str, ctx.indent, commentString(valueComment)); + } else if (chompKeep && onChompKeep) { + onChompKeep(); + } + return str; +} +function warn(logLevel, warning) { + if (logLevel === "debug" || logLevel === "warn") { + if (typeof process !== "undefined" && process.emitWarning) + process.emitWarning(warning); + else + console.warn(warning); + } +} +function addPairToJSMap(ctx, map2, { key, value: value2 }) { + if ((ctx == null ? void 0 : ctx.doc.schema.merge) && isMergeKey(key)) { + value2 = isAlias(value2) ? value2.resolve(ctx.doc) : value2; + if (isSeq(value2)) + for (const it of value2.items) + mergeToJSMap(ctx, map2, it); + else if (Array.isArray(value2)) + for (const it of value2) + mergeToJSMap(ctx, map2, it); + else + mergeToJSMap(ctx, map2, value2); + } else { + const jsKey = toJS(key, "", ctx); + if (map2 instanceof Map) { + map2.set(jsKey, toJS(value2, jsKey, ctx)); + } else if (map2 instanceof Set) { + map2.add(jsKey); + } else { + const stringKey = stringifyKey(key, jsKey, ctx); + const jsValue = toJS(value2, stringKey, ctx); + if (stringKey in map2) + Object.defineProperty(map2, stringKey, { + value: jsValue, + writable: true, + enumerable: true, + configurable: true + }); + else + map2[stringKey] = jsValue; + } + } + return map2; +} +function mergeToJSMap(ctx, map2, value2) { + const source = ctx && isAlias(value2) ? value2.resolve(ctx.doc) : value2; + if (!isMap(source)) + throw new Error("Merge sources must be maps or map aliases"); + const srcMap = source.toJSON(null, ctx, Map); + for (const [key, value3] of srcMap) { + if (map2 instanceof Map) { + if (!map2.has(key)) + map2.set(key, value3); + } else if (map2 instanceof Set) { + map2.add(key); + } else if (!Object.prototype.hasOwnProperty.call(map2, key)) { + Object.defineProperty(map2, key, { + value: value3, + writable: true, + enumerable: true, + configurable: true + }); + } + } + return map2; +} +function stringifyKey(key, jsKey, ctx) { + if (jsKey === null) + return ""; + if (typeof jsKey !== "object") + return String(jsKey); + if (isNode$1(key) && ctx && ctx.doc) { + const strCtx = createStringifyContext(ctx.doc, {}); + strCtx.anchors = /* @__PURE__ */ new Set(); + for (const node2 of ctx.anchors.keys()) + strCtx.anchors.add(node2.anchor); + strCtx.inFlow = true; + strCtx.inStringifyKey = true; + const strKey = key.toString(strCtx); + if (!ctx.mapKeyWarned) { + let jsonStr = JSON.stringify(strKey); + if (jsonStr.length > 40) + jsonStr = jsonStr.substring(0, 36) + '..."'; + warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`); + ctx.mapKeyWarned = true; + } + return strKey; + } + return JSON.stringify(jsKey); +} +function createPair(key, value2, ctx) { + const k = createNode(key, void 0, ctx); + const v = createNode(value2, void 0, ctx); + return new Pair(k, v); +} +function stringifyCollection(collection, ctx, options2) { + const flow = ctx.inFlow ?? collection.flow; + const stringify2 = flow ? stringifyFlowCollection : stringifyBlockCollection; + return stringify2(collection, ctx, options2); +} +function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) { + const { indent, options: { commentString } } = ctx; + const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null }); + let chompKeep = false; + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment2 = null; + if (isNode$1(item)) { + if (!chompKeep && item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, chompKeep); + if (item.comment) + comment2 = item.comment; + } else if (isPair(item)) { + const ik = isNode$1(item.key) ? item.key : null; + if (ik) { + if (!chompKeep && ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, chompKeep); + } + } + chompKeep = false; + let str2 = stringify$2(item, itemCtx, () => comment2 = null, () => chompKeep = true); + if (comment2) + str2 += lineComment(str2, itemIndent, commentString(comment2)); + if (chompKeep && comment2) + chompKeep = false; + lines.push(blockItemPrefix + str2); + } + let str; + if (lines.length === 0) { + str = flowChars.start + flowChars.end; + } else { + str = lines[0]; + for (let i = 1; i < lines.length; ++i) { + const line = lines[i]; + str += line ? ` +${indent}${line}` : "\n"; + } + } + if (comment) { + str += "\n" + indentComment(commentString(comment), indent); + if (onComment) + onComment(); + } else if (chompKeep && onChompKeep) + onChompKeep(); + return str; +} +function stringifyFlowCollection({ comment, items }, ctx, { flowChars, itemIndent, onComment }) { + const { indent, indentStep, options: { commentString } } = ctx; + itemIndent += indentStep; + const itemCtx = Object.assign({}, ctx, { + indent: itemIndent, + inFlow: true, + type: null + }); + let reqNewline = false; + let linesAtValue = 0; + const lines = []; + for (let i = 0; i < items.length; ++i) { + const item = items[i]; + let comment2 = null; + if (isNode$1(item)) { + if (item.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, item.commentBefore, false); + if (item.comment) + comment2 = item.comment; + } else if (isPair(item)) { + const ik = isNode$1(item.key) ? item.key : null; + if (ik) { + if (ik.spaceBefore) + lines.push(""); + addCommentBefore(ctx, lines, ik.commentBefore, false); + if (ik.comment) + reqNewline = true; + } + const iv = isNode$1(item.value) ? item.value : null; + if (iv) { + if (iv.comment) + comment2 = iv.comment; + if (iv.commentBefore) + reqNewline = true; + } else if (item.value == null && ik && ik.comment) { + comment2 = ik.comment; + } + } + if (comment2) + reqNewline = true; + let str2 = stringify$2(item, itemCtx, () => comment2 = null); + if (i < items.length - 1) + str2 += ","; + if (comment2) + str2 += lineComment(str2, itemIndent, commentString(comment2)); + if (!reqNewline && (lines.length > linesAtValue || str2.includes("\n"))) + reqNewline = true; + lines.push(str2); + linesAtValue = lines.length; + } + let str; + const { start, end } = flowChars; + if (lines.length === 0) { + str = start + end; + } else { + if (!reqNewline) { + const len = lines.reduce((sum, line) => sum + line.length + 2, 2); + reqNewline = len > Collection.maxFlowStringSingleLineLength; + } + if (reqNewline) { + str = start; + for (const line of lines) + str += line ? ` +${indentStep}${indent}${line}` : "\n"; + str += ` +${indent}${end}`; + } else { + str = `${start} ${lines.join(" ")} ${end}`; + } + } + if (comment) { + str += lineComment(str, commentString(comment), indent); + if (onComment) + onComment(); + } + return str; +} +function addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) { + if (comment && chompKeep) + comment = comment.replace(/^\n+/, ""); + if (comment) { + const ic = indentComment(commentString(comment), indent); + lines.push(ic.trimStart()); + } +} +function findPair(items, key) { + const k = isScalar$1(key) ? key.value : key; + for (const it of items) { + if (isPair(it)) { + if (it.key === key || it.key === k) + return it; + if (isScalar$1(it.key) && it.key.value === k) + return it; + } + } + return void 0; +} +function createMap(schema2, obj, ctx) { + const { keepUndefined, replacer } = ctx; + const map2 = new YAMLMap(schema2); + const add = (key, value2) => { + if (typeof replacer === "function") + value2 = replacer.call(obj, key, value2); + else if (Array.isArray(replacer) && !replacer.includes(key)) + return; + if (value2 !== void 0 || keepUndefined) + map2.items.push(createPair(key, value2, ctx)); + }; + if (obj instanceof Map) { + for (const [key, value2] of obj) + add(key, value2); + } else if (obj && typeof obj === "object") { + for (const key of Object.keys(obj)) + add(key, obj[key]); + } + if (typeof schema2.sortMapEntries === "function") { + map2.items.sort(schema2.sortMapEntries); + } + return map2; +} +function asItemIndex(key) { + let idx = isScalar$1(key) ? key.value : key; + if (idx && typeof idx === "string") + idx = Number(idx); + return typeof idx === "number" && Number.isInteger(idx) && idx >= 0 ? idx : null; +} +function createSeq(schema2, obj, ctx) { + const { replacer } = ctx; + const seq2 = new YAMLSeq(schema2); + if (obj && Symbol.iterator in Object(obj)) { + let i = 0; + for (let it of obj) { + if (typeof replacer === "function") { + const key = obj instanceof Set ? it : String(i++); + it = replacer.call(obj, key, it); + } + seq2.items.push(createNode(it, void 0, ctx)); + } + } + return seq2; +} +function stringifyNumber({ format: format2, minFractionDigits, tag, value: value2 }) { + if (typeof value2 === "bigint") + return String(value2); + const num = typeof value2 === "number" ? value2 : Number(value2); + if (!isFinite(num)) + return isNaN(num) ? ".nan" : num < 0 ? "-.inf" : ".inf"; + let n = JSON.stringify(value2); + if (!format2 && minFractionDigits && (!tag || tag === "tag:yaml.org,2002:float") && /^\d/.test(n)) { + let i = n.indexOf("."); + if (i < 0) { + i = n.length; + n += "."; + } + let d = minFractionDigits - (n.length - i - 1); + while (d-- > 0) + n += "0"; + } + return n; +} +function intStringify$1(node2, radix, prefix) { + const { value: value2 } = node2; + if (intIdentify$2(value2) && value2 >= 0) + return prefix + value2.toString(radix); + return stringifyNumber(node2); +} +function intIdentify$1(value2) { + return typeof value2 === "bigint" || Number.isInteger(value2); +} +function resolvePairs(seq2, onError) { + if (isSeq(seq2)) { + for (let i = 0; i < seq2.items.length; ++i) { + let item = seq2.items[i]; + if (isPair(item)) + continue; + else if (isMap(item)) { + if (item.items.length > 1) + onError("Each pair must have its own sequence indicator"); + const pair = item.items[0] || new Pair(new Scalar(null)); + if (item.commentBefore) + pair.key.commentBefore = pair.key.commentBefore ? `${item.commentBefore} +${pair.key.commentBefore}` : item.commentBefore; + if (item.comment) { + const cn = pair.value ?? pair.key; + cn.comment = cn.comment ? `${item.comment} +${cn.comment}` : item.comment; + } + item = pair; + } + seq2.items[i] = isPair(item) ? item : new Pair(item); + } + } else + onError("Expected a sequence for this tag"); + return seq2; +} +function createPairs(schema2, iterable, ctx) { + const { replacer } = ctx; + const pairs2 = new YAMLSeq(schema2); + pairs2.tag = "tag:yaml.org,2002:pairs"; + let i = 0; + if (iterable && Symbol.iterator in Object(iterable)) + for (let it of iterable) { + if (typeof replacer === "function") + it = replacer.call(iterable, String(i++), it); + let key, value2; + if (Array.isArray(it)) { + if (it.length === 2) { + key = it[0]; + value2 = it[1]; + } else + throw new TypeError(`Expected [key, value] tuple: ${it}`); + } else if (it && it instanceof Object) { + const keys = Object.keys(it); + if (keys.length === 1) { + key = keys[0]; + value2 = it[key]; + } else + throw new TypeError(`Expected { key: value } tuple: ${it}`); + } else { + key = it; + } + pairs2.items.push(createPair(key, value2, ctx)); + } + return pairs2; +} +function boolStringify({ value: value2, source }, ctx) { + const boolObj = value2 ? trueTag : falseTag; + if (source && boolObj.test.test(source)) + return source; + return value2 ? ctx.options.trueStr : ctx.options.falseStr; +} +function intResolve(str, offset3, radix, { intAsBigInt }) { + const sign = str[0]; + if (sign === "-" || sign === "+") + offset3 += 1; + str = str.substring(offset3).replace(/_/g, ""); + if (intAsBigInt) { + switch (radix) { + case 2: + str = `0b${str}`; + break; + case 8: + str = `0o${str}`; + break; + case 16: + str = `0x${str}`; + break; + } + const n2 = BigInt(str); + return sign === "-" ? BigInt(-1) * n2 : n2; + } + const n = parseInt(str, radix); + return sign === "-" ? -1 * n : n; +} +function intStringify(node2, radix, prefix) { + const { value: value2 } = node2; + if (intIdentify(value2)) { + const str = value2.toString(radix); + return value2 < 0 ? "-" + prefix + str.substr(1) : prefix + str; + } + return stringifyNumber(node2); +} +function parseSexagesimal(str, asBigInt) { + const sign = str[0]; + const parts = sign === "-" || sign === "+" ? str.substring(1) : str; + const num = (n) => asBigInt ? BigInt(n) : Number(n); + const res = parts.replace(/_/g, "").split(":").reduce((res2, p) => res2 * num(60) + num(p), num(0)); + return sign === "-" ? num(-1) * res : res; +} +function stringifySexagesimal(node2) { + let { value: value2 } = node2; + let num = (n) => n; + if (typeof value2 === "bigint") + num = (n) => BigInt(n); + else if (isNaN(value2) || !isFinite(value2)) + return stringifyNumber(node2); + let sign = ""; + if (value2 < 0) { + sign = "-"; + value2 *= num(-1); + } + const _60 = num(60); + const parts = [value2 % _60]; + if (value2 < 60) { + parts.unshift(0); + } else { + value2 = (value2 - parts[0]) / _60; + parts.unshift(value2 % _60); + if (value2 >= 60) { + value2 = (value2 - parts[0]) / _60; + parts.unshift(value2); + } + } + return sign + parts.map((n) => n < 10 ? "0" + String(n) : String(n)).join(":").replace(/000000\d*$/, ""); +} +function getTags(customTags, schemaName) { + let tags = schemas.get(schemaName); + if (!tags) { + if (Array.isArray(customTags)) + tags = []; + else { + const keys = Array.from(schemas.keys()).filter((key) => key !== "yaml11").map((key) => JSON.stringify(key)).join(", "); + throw new Error(`Unknown schema "${schemaName}"; use one of ${keys} or define customTags array`); + } + } + if (Array.isArray(customTags)) { + for (const tag of customTags) + tags = tags.concat(tag); + } else if (typeof customTags === "function") { + tags = customTags(tags.slice()); + } + return tags.map((tag) => { + if (typeof tag !== "string") + return tag; + const tagObj = tagsByName[tag]; + if (tagObj) + return tagObj; + const keys = Object.keys(tagsByName).map((key) => JSON.stringify(key)).join(", "); + throw new Error(`Unknown custom tag "${tag}"; use one of ${keys}`); + }); +} +function stringifyDocument(doc, options2) { + var _a; + const lines = []; + let hasDirectives = options2.directives === true; + if (options2.directives !== false && doc.directives) { + const dir = doc.directives.toString(doc); + if (dir) { + lines.push(dir); + hasDirectives = true; + } else if (doc.directives.docStart) + hasDirectives = true; + } + if (hasDirectives) + lines.push("---"); + const ctx = createStringifyContext(doc, options2); + const { commentString } = ctx.options; + if (doc.commentBefore) { + if (lines.length !== 1) + lines.unshift(""); + const cs = commentString(doc.commentBefore); + lines.unshift(indentComment(cs, "")); + } + let chompKeep = false; + let contentComment = null; + if (doc.contents) { + if (isNode$1(doc.contents)) { + if (doc.contents.spaceBefore && hasDirectives) + lines.push(""); + if (doc.contents.commentBefore) { + const cs = commentString(doc.contents.commentBefore); + lines.push(indentComment(cs, "")); + } + ctx.forceBlockIndent = !!doc.comment; + contentComment = doc.contents.comment; + } + const onChompKeep = contentComment ? void 0 : () => chompKeep = true; + let body = stringify$2(doc.contents, ctx, () => contentComment = null, onChompKeep); + if (contentComment) + body += lineComment(body, "", commentString(contentComment)); + if ((body[0] === "|" || body[0] === ">") && lines[lines.length - 1] === "---") { + lines[lines.length - 1] = `--- ${body}`; + } else + lines.push(body); + } else { + lines.push(stringify$2(doc.contents, ctx)); + } + if ((_a = doc.directives) == null ? void 0 : _a.docEnd) { + if (doc.comment) { + const cs = commentString(doc.comment); + if (cs.includes("\n")) { + lines.push("..."); + lines.push(indentComment(cs, "")); + } else { + lines.push(`... ${cs}`); + } + } else { + lines.push("..."); + } + } else { + let dc = doc.comment; + if (dc && chompKeep) + dc = dc.replace(/^\n+/, ""); + if (dc) { + if ((!chompKeep || contentComment) && lines[lines.length - 1] !== "") + lines.push(""); + lines.push(indentComment(commentString(dc), "")); + } + } + return lines.join("\n") + "\n"; +} +function applyReviver(reviver, obj, key, val) { + if (val && typeof val === "object") { + if (Array.isArray(val)) { + for (let i = 0, len = val.length; i < len; ++i) { + const v0 = val[i]; + const v1 = applyReviver(reviver, val, String(i), v0); + if (v1 === void 0) + delete val[i]; + else if (v1 !== v0) + val[i] = v1; + } + } else if (val instanceof Map) { + for (const k of Array.from(val.keys())) { + const v0 = val.get(k); + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === void 0) + val.delete(k); + else if (v1 !== v0) + val.set(k, v1); + } + } else if (val instanceof Set) { + for (const v0 of Array.from(val)) { + const v1 = applyReviver(reviver, val, v0, v0); + if (v1 === void 0) + val.delete(v0); + else if (v1 !== v0) { + val.delete(v0); + val.add(v1); + } + } + } else { + for (const [k, v0] of Object.entries(val)) { + const v1 = applyReviver(reviver, val, k, v0); + if (v1 === void 0) + delete val[k]; + else if (v1 !== v0) + val[k] = v1; + } + } + } + return reviver.call(obj, key, val); +} +function assertCollection(contents) { + if (isCollection$1(contents)) + return true; + throw new Error("Expected a YAML collection as document contents"); +} +function resolveProps(tokens, { flow, indicator, next, offset: offset3, onError, startOnNewline }) { + let spaceBefore = false; + let atNewline = startOnNewline; + let hasSpace = startOnNewline; + let comment = ""; + let commentSep = ""; + let hasNewline = false; + let hasNewlineAfterProp = false; + let reqSpace = false; + let anchor = null; + let tag = null; + let comma2 = null; + let found2 = null; + let start = null; + for (const token of tokens) { + if (reqSpace) { + if (token.type !== "space" && token.type !== "newline" && token.type !== "comma") + onError(token.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + reqSpace = false; + } + switch (token.type) { + case "space": + if (!flow && atNewline && indicator !== "doc-start" && token.source[0] === " ") + onError(token, "TAB_AS_INDENT", "Tabs are not allowed as indentation"); + hasSpace = true; + break; + case "comment": { + if (!hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = token.source.substring(1) || " "; + if (!comment) + comment = cb; + else + comment += commentSep + cb; + commentSep = ""; + atNewline = false; + break; + } + case "newline": + if (atNewline) { + if (comment) + comment += token.source; + else + spaceBefore = true; + } else + commentSep += token.source; + atNewline = true; + hasNewline = true; + if (anchor || tag) + hasNewlineAfterProp = true; + hasSpace = true; + break; + case "anchor": + if (anchor) + onError(token, "MULTIPLE_ANCHORS", "A node can have at most one anchor"); + if (token.source.endsWith(":")) + onError(token.offset + token.source.length - 1, "BAD_ALIAS", "Anchor ending in : is ambiguous", true); + anchor = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + case "tag": { + if (tag) + onError(token, "MULTIPLE_TAGS", "A node can have at most one tag"); + tag = token; + if (start === null) + start = token.offset; + atNewline = false; + hasSpace = false; + reqSpace = true; + break; + } + case indicator: + if (anchor || tag) + onError(token, "BAD_PROP_ORDER", `Anchors and tags must be after the ${token.source} indicator`); + if (found2) + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.source} in ${flow ?? "collection"}`); + found2 = token; + atNewline = false; + hasSpace = false; + break; + case "comma": + if (flow) { + if (comma2) + onError(token, "UNEXPECTED_TOKEN", `Unexpected , in ${flow}`); + comma2 = token; + atNewline = false; + hasSpace = false; + break; + } + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${token.type} token`); + atNewline = false; + hasSpace = false; + } + } + const last = tokens[tokens.length - 1]; + const end = last ? last.offset + last.source.length : offset3; + if (reqSpace && next && next.type !== "space" && next.type !== "newline" && next.type !== "comma" && (next.type !== "scalar" || next.source !== "")) + onError(next.offset, "MISSING_CHAR", "Tags and anchors must be separated from the next token by white space"); + return { + comma: comma2, + found: found2, + spaceBefore, + comment, + hasNewline, + hasNewlineAfterProp, + anchor, + tag, + end, + start: start ?? end + }; +} +function containsNewline(key) { + if (!key) + return null; + switch (key.type) { + case "alias": + case "scalar": + case "double-quoted-scalar": + case "single-quoted-scalar": + if (key.source.includes("\n")) + return true; + if (key.end) { + for (const st of key.end) + if (st.type === "newline") + return true; + } + return false; + case "flow-collection": + for (const it of key.items) { + for (const st of it.start) + if (st.type === "newline") + return true; + if (it.sep) { + for (const st of it.sep) + if (st.type === "newline") + return true; + } + if (containsNewline(it.key) || containsNewline(it.value)) + return true; + } + return false; + default: + return true; + } +} +function flowIndentCheck(indent, fc, onError) { + if ((fc == null ? void 0 : fc.type) === "flow-collection") { + const end = fc.end[0]; + if (end.indent === indent && (end.source === "]" || end.source === "}") && containsNewline(fc)) { + const msg = "Flow end indicator should be more indented than parent"; + onError(end, "BAD_INDENT", msg, true); + } + } +} +function mapIncludes(ctx, items, search) { + const { uniqueKeys } = ctx.options; + if (uniqueKeys === false) + return false; + const isEqual = typeof uniqueKeys === "function" ? uniqueKeys : (a, b) => a === b || isScalar$1(a) && isScalar$1(b) && a.value === b.value && !(a.value === "<<" && ctx.schema.merge); + return items.some((pair) => isEqual(pair.key, search)); +} +function resolveBlockMap({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, bm, onError) { + var _a; + const map2 = new YAMLMap(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + let offset3 = bm.offset; + for (const collItem of bm.items) { + const { start, key, sep: sep2, value: value2 } = collItem; + const keyProps = resolveProps(start, { + indicator: "explicit-key-ind", + next: key ?? (sep2 == null ? void 0 : sep2[0]), + offset: offset3, + onError, + startOnNewline: true + }); + const implicitKey = !keyProps.found; + if (implicitKey) { + if (key) { + if (key.type === "block-seq") + onError(offset3, "BLOCK_AS_IMPLICIT_KEY", "A block sequence may not be used as an implicit map key"); + else if ("indent" in key && key.indent !== bm.indent) + onError(offset3, "BAD_INDENT", startColMsg); + } + if (!keyProps.anchor && !keyProps.tag && !sep2) { + if (keyProps.comment) { + if (map2.comment) + map2.comment += "\n" + keyProps.comment; + else + map2.comment = keyProps.comment; + } + continue; + } + if (keyProps.hasNewlineAfterProp || containsNewline(key)) { + onError(key ?? start[start.length - 1], "MULTILINE_IMPLICIT_KEY", "Implicit keys need to be on a single line"); + } + } else if (((_a = keyProps.found) == null ? void 0 : _a.indent) !== bm.indent) { + onError(offset3, "BAD_INDENT", startColMsg); + } + const keyStart = keyProps.end; + const keyNode = key ? composeNode2(ctx, key, keyProps, onError) : composeEmptyNode2(ctx, keyStart, start, null, keyProps, onError); + if (ctx.schema.compat) + flowIndentCheck(bm.indent, key, onError); + if (mapIncludes(ctx, map2.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + const valueProps = resolveProps(sep2 ?? [], { + indicator: "map-value-ind", + next: value2, + offset: keyNode.range[2], + onError, + startOnNewline: !key || key.type === "block-scalar" + }); + offset3 = valueProps.end; + if (valueProps.found) { + if (implicitKey) { + if ((value2 == null ? void 0 : value2.type) === "block-map" && !valueProps.hasNewline) + onError(offset3, "BLOCK_AS_IMPLICIT_KEY", "Nested mappings are not allowed in compact mappings"); + if (ctx.options.strict && keyProps.start < valueProps.found.offset - 1024) + onError(keyNode.range, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit block mapping key"); + } + const valueNode = value2 ? composeNode2(ctx, value2, valueProps, onError) : composeEmptyNode2(ctx, offset3, sep2, null, valueProps, onError); + if (ctx.schema.compat) + flowIndentCheck(bm.indent, value2, onError); + offset3 = valueNode.range[2]; + const pair = new Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map2.items.push(pair); + } else { + if (implicitKey) + onError(keyNode.range, "MISSING_CHAR", "Implicit map keys need to be followed by map values"); + if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair(keyNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + map2.items.push(pair); + } + } + map2.range = [bm.offset, offset3, offset3]; + return map2; +} +function resolveBlockSeq({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, bs, onError) { + const seq2 = new YAMLSeq(ctx.schema); + if (ctx.atRoot) + ctx.atRoot = false; + let offset3 = bs.offset; + for (const { start, value: value2 } of bs.items) { + const props = resolveProps(start, { + indicator: "seq-item-ind", + next: value2, + offset: offset3, + onError, + startOnNewline: true + }); + offset3 = props.end; + if (!props.found) { + if (props.anchor || props.tag || value2) { + if (value2 && value2.type === "block-seq") + onError(offset3, "BAD_INDENT", "All sequence items must start at the same column"); + else + onError(offset3, "MISSING_CHAR", "Sequence item without - indicator"); + } else { + if (props.comment) + seq2.comment = props.comment; + continue; + } + } + const node2 = value2 ? composeNode2(ctx, value2, props, onError) : composeEmptyNode2(ctx, offset3, start, null, props, onError); + if (ctx.schema.compat) + flowIndentCheck(bs.indent, value2, onError); + offset3 = node2.range[2]; + seq2.items.push(node2); + } + seq2.range = [bs.offset, offset3, offset3]; + return seq2; +} +function resolveEnd(end, offset3, reqSpace, onError) { + let comment = ""; + if (end) { + let hasSpace = false; + let sep2 = ""; + for (const token of end) { + const { source, type } = token; + switch (type) { + case "space": + hasSpace = true; + break; + case "comment": { + if (reqSpace && !hasSpace) + onError(token, "MISSING_CHAR", "Comments must be separated from other tokens by white space characters"); + const cb = source.substring(1) || " "; + if (!comment) + comment = cb; + else + comment += sep2 + cb; + sep2 = ""; + break; + } + case "newline": + if (comment) + sep2 += source; + hasSpace = true; + break; + default: + onError(token, "UNEXPECTED_TOKEN", `Unexpected ${type} at node end`); + } + offset3 += source.length; + } + } + return { comment, offset: offset3 }; +} +function resolveFlowCollection({ composeNode: composeNode2, composeEmptyNode: composeEmptyNode2 }, ctx, fc, onError) { + const isMap2 = fc.start.source === "{"; + const fcName = isMap2 ? "flow map" : "flow sequence"; + const coll = isMap2 ? new YAMLMap(ctx.schema) : new YAMLSeq(ctx.schema); + coll.flow = true; + const atRoot = ctx.atRoot; + if (atRoot) + ctx.atRoot = false; + let offset3 = fc.offset + fc.start.source.length; + for (let i = 0; i < fc.items.length; ++i) { + const collItem = fc.items[i]; + const { start, key, sep: sep2, value: value2 } = collItem; + const props = resolveProps(start, { + flow: fcName, + indicator: "explicit-key-ind", + next: key ?? (sep2 == null ? void 0 : sep2[0]), + offset: offset3, + onError, + startOnNewline: false + }); + if (!props.found) { + if (!props.anchor && !props.tag && !sep2 && !value2) { + if (i === 0 && props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + else if (i < fc.items.length - 1) + onError(props.start, "UNEXPECTED_TOKEN", `Unexpected empty item in ${fcName}`); + if (props.comment) { + if (coll.comment) + coll.comment += "\n" + props.comment; + else + coll.comment = props.comment; + } + offset3 = props.end; + continue; + } + if (!isMap2 && ctx.options.strict && containsNewline(key)) + onError( + key, + // checked by containsNewline() + "MULTILINE_IMPLICIT_KEY", + "Implicit keys of flow sequence pairs need to be on a single line" + ); + } + if (i === 0) { + if (props.comma) + onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`); + } else { + if (!props.comma) + onError(props.start, "MISSING_CHAR", `Missing , between ${fcName} items`); + if (props.comment) { + let prevItemComment = ""; + loop: + for (const st of start) { + switch (st.type) { + case "comma": + case "space": + break; + case "comment": + prevItemComment = st.source.substring(1); + break loop; + default: + break loop; + } + } + if (prevItemComment) { + let prev = coll.items[coll.items.length - 1]; + if (isPair(prev)) + prev = prev.value ?? prev.key; + if (prev.comment) + prev.comment += "\n" + prevItemComment; + else + prev.comment = prevItemComment; + props.comment = props.comment.substring(prevItemComment.length + 1); + } + } + } + if (!isMap2 && !sep2 && !props.found) { + const valueNode = value2 ? composeNode2(ctx, value2, props, onError) : composeEmptyNode2(ctx, props.end, sep2, null, props, onError); + coll.items.push(valueNode); + offset3 = valueNode.range[2]; + if (isBlock(value2)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else { + const keyStart = props.end; + const keyNode = key ? composeNode2(ctx, key, props, onError) : composeEmptyNode2(ctx, keyStart, start, null, props, onError); + if (isBlock(key)) + onError(keyNode.range, "BLOCK_IN_FLOW", blockMsg); + const valueProps = resolveProps(sep2 ?? [], { + flow: fcName, + indicator: "map-value-ind", + next: value2, + offset: keyNode.range[2], + onError, + startOnNewline: false + }); + if (valueProps.found) { + if (!isMap2 && !props.found && ctx.options.strict) { + if (sep2) + for (const st of sep2) { + if (st === valueProps.found) + break; + if (st.type === "newline") { + onError(st, "MULTILINE_IMPLICIT_KEY", "Implicit keys of flow sequence pairs need to be on a single line"); + break; + } + } + if (props.start < valueProps.found.offset - 1024) + onError(valueProps.found, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit flow sequence key"); + } + } else if (value2) { + if ("source" in value2 && value2.source && value2.source[0] === ":") + onError(value2, "MISSING_CHAR", `Missing space after : in ${fcName}`); + else + onError(valueProps.start, "MISSING_CHAR", `Missing , or : between ${fcName} items`); + } + const valueNode = value2 ? composeNode2(ctx, value2, valueProps, onError) : valueProps.found ? composeEmptyNode2(ctx, valueProps.end, sep2, null, valueProps, onError) : null; + if (valueNode) { + if (isBlock(value2)) + onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg); + } else if (valueProps.comment) { + if (keyNode.comment) + keyNode.comment += "\n" + valueProps.comment; + else + keyNode.comment = valueProps.comment; + } + const pair = new Pair(keyNode, valueNode); + if (ctx.options.keepSourceTokens) + pair.srcToken = collItem; + if (isMap2) { + const map2 = coll; + if (mapIncludes(ctx, map2.items, keyNode)) + onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique"); + map2.items.push(pair); + } else { + const map2 = new YAMLMap(ctx.schema); + map2.flow = true; + map2.items.push(pair); + coll.items.push(map2); + } + offset3 = valueNode ? valueNode.range[2] : valueProps.end; + } + } + const expectedEnd = isMap2 ? "}" : "]"; + const [ce, ...ee] = fc.end; + let cePos = offset3; + if (ce && ce.source === expectedEnd) + cePos = ce.offset + ce.source.length; + else { + const name2 = fcName[0].toUpperCase() + fcName.substring(1); + const msg = atRoot ? `${name2} must end with a ${expectedEnd}` : `${name2} in block collection must be sufficiently indented and end with a ${expectedEnd}`; + onError(offset3, atRoot ? "MISSING_CHAR" : "BAD_INDENT", msg); + if (ce && ce.source.length !== 1) + ee.unshift(ce); + } + if (ee.length > 0) { + const end = resolveEnd(ee, cePos, ctx.options.strict, onError); + if (end.comment) { + if (coll.comment) + coll.comment += "\n" + end.comment; + else + coll.comment = end.comment; + } + coll.range = [fc.offset, cePos, end.offset]; + } else { + coll.range = [fc.offset, cePos, cePos]; + } + return coll; +} +function composeCollection(CN2, ctx, token, tagToken, onError) { + let coll; + switch (token.type) { + case "block-map": { + coll = resolveBlockMap(CN2, ctx, token, onError); + break; + } + case "block-seq": { + coll = resolveBlockSeq(CN2, ctx, token, onError); + break; + } + case "flow-collection": { + coll = resolveFlowCollection(CN2, ctx, token, onError); + break; + } + } + if (!tagToken) + return coll; + const tagName = ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)); + if (!tagName) + return coll; + const Coll = coll.constructor; + if (tagName === "!" || tagName === Coll.tagName) { + coll.tag = Coll.tagName; + return coll; + } + const expType = isMap(coll) ? "map" : "seq"; + let tag = ctx.schema.tags.find((t) => t.collection === expType && t.tag === tagName); + if (!tag) { + const kt = ctx.schema.knownTags[tagName]; + if (kt && kt.collection === expType) { + ctx.schema.tags.push(Object.assign({}, kt, { default: false })); + tag = kt; + } else { + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, true); + coll.tag = tagName; + return coll; + } + } + const res = tag.resolve(coll, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg), ctx.options); + const node2 = isNode$1(res) ? res : new Scalar(res); + node2.range = coll.range; + node2.tag = tagName; + if (tag == null ? void 0 : tag.format) + node2.format = tag.format; + return node2; +} +function resolveBlockScalar(scalar, strict, onError) { + const start = scalar.offset; + const header = parseBlockScalarHeader(scalar, strict, onError); + if (!header) + return { value: "", type: null, comment: "", range: [start, start, start] }; + const type = header.mode === ">" ? Scalar.BLOCK_FOLDED : Scalar.BLOCK_LITERAL; + const lines = scalar.source ? splitLines(scalar.source) : []; + let chompStart = lines.length; + for (let i = lines.length - 1; i >= 0; --i) { + const content = lines[i][1]; + if (content === "" || content === "\r") + chompStart = i; + else + break; + } + if (chompStart === 0) { + const value3 = header.chomp === "+" && lines.length > 0 ? "\n".repeat(Math.max(1, lines.length - 1)) : ""; + let end2 = start + header.length; + if (scalar.source) + end2 += scalar.source.length; + return { value: value3, type, comment: header.comment, range: [start, end2, end2] }; + } + let trimIndent = scalar.indent + header.indent; + let offset3 = scalar.offset + header.length; + let contentStart = 0; + for (let i = 0; i < chompStart; ++i) { + const [indent, content] = lines[i]; + if (content === "" || content === "\r") { + if (header.indent === 0 && indent.length > trimIndent) + trimIndent = indent.length; + } else { + if (indent.length < trimIndent) { + const message = "Block scalars with more-indented leading empty lines must use an explicit indentation indicator"; + onError(offset3 + indent.length, "MISSING_CHAR", message); + } + if (header.indent === 0) + trimIndent = indent.length; + contentStart = i; + break; + } + offset3 += indent.length + content.length + 1; + } + for (let i = lines.length - 1; i >= chompStart; --i) { + if (lines[i][0].length > trimIndent) + chompStart = i + 1; + } + let value2 = ""; + let sep2 = ""; + let prevMoreIndented = false; + for (let i = 0; i < contentStart; ++i) + value2 += lines[i][0].slice(trimIndent) + "\n"; + for (let i = contentStart; i < chompStart; ++i) { + let [indent, content] = lines[i]; + offset3 += indent.length + content.length + 1; + const crlf = content[content.length - 1] === "\r"; + if (crlf) + content = content.slice(0, -1); + if (content && indent.length < trimIndent) { + const src2 = header.indent ? "explicit indentation indicator" : "first line"; + const message = `Block scalar lines must not be less indented than their ${src2}`; + onError(offset3 - content.length - (crlf ? 2 : 1), "BAD_INDENT", message); + indent = ""; + } + if (type === Scalar.BLOCK_LITERAL) { + value2 += sep2 + indent.slice(trimIndent) + content; + sep2 = "\n"; + } else if (indent.length > trimIndent || content[0] === " ") { + if (sep2 === " ") + sep2 = "\n"; + else if (!prevMoreIndented && sep2 === "\n") + sep2 = "\n\n"; + value2 += sep2 + indent.slice(trimIndent) + content; + sep2 = "\n"; + prevMoreIndented = true; + } else if (content === "") { + if (sep2 === "\n") + value2 += "\n"; + else + sep2 = "\n"; + } else { + value2 += sep2 + content; + sep2 = " "; + prevMoreIndented = false; + } + } + switch (header.chomp) { + case "-": + break; + case "+": + for (let i = chompStart; i < lines.length; ++i) + value2 += "\n" + lines[i][0].slice(trimIndent); + if (value2[value2.length - 1] !== "\n") + value2 += "\n"; + break; + default: + value2 += "\n"; + } + const end = start + header.length + scalar.source.length; + return { value: value2, type, comment: header.comment, range: [start, end, end] }; +} +function parseBlockScalarHeader({ offset: offset3, props }, strict, onError) { + if (props[0].type !== "block-scalar-header") { + onError(props[0], "IMPOSSIBLE", "Block scalar header not found"); + return null; + } + const { source } = props[0]; + const mode2 = source[0]; + let indent = 0; + let chomp = ""; + let error2 = -1; + for (let i = 1; i < source.length; ++i) { + const ch = source[i]; + if (!chomp && (ch === "-" || ch === "+")) + chomp = ch; + else { + const n = Number(ch); + if (!indent && n) + indent = n; + else if (error2 === -1) + error2 = offset3 + i; + } + } + if (error2 !== -1) + onError(error2, "UNEXPECTED_TOKEN", `Block scalar header includes extra characters: ${source}`); + let hasSpace = false; + let comment = ""; + let length = source.length; + for (let i = 1; i < props.length; ++i) { + const token = props[i]; + switch (token.type) { + case "space": + hasSpace = true; + case "newline": + length += token.source.length; + break; + case "comment": + if (strict && !hasSpace) { + const message = "Comments must be separated from other tokens by white space characters"; + onError(token, "MISSING_CHAR", message); + } + length += token.source.length; + comment = token.source.substring(1); + break; + case "error": + onError(token, "UNEXPECTED_TOKEN", token.message); + length += token.source.length; + break; + default: { + const message = `Unexpected token in block scalar header: ${token.type}`; + onError(token, "UNEXPECTED_TOKEN", message); + const ts = token.source; + if (ts && typeof ts === "string") + length += ts.length; + } + } + } + return { mode: mode2, indent, chomp, comment, length }; +} +function splitLines(source) { + const split = source.split(/\n( *)/); + const first2 = split[0]; + const m = first2.match(/^( *)/); + const line0 = (m == null ? void 0 : m[1]) ? [m[1], first2.slice(m[1].length)] : ["", first2]; + const lines = [line0]; + for (let i = 1; i < split.length; i += 2) + lines.push([split[i], split[i + 1]]); + return lines; +} +function resolveFlowScalar(scalar, strict, onError) { + const { offset: offset3, type, source, end } = scalar; + let _type; + let value2; + const _onError = (rel, code, msg) => onError(offset3 + rel, code, msg); + switch (type) { + case "scalar": + _type = Scalar.PLAIN; + value2 = plainValue(source, _onError); + break; + case "single-quoted-scalar": + _type = Scalar.QUOTE_SINGLE; + value2 = singleQuotedValue(source, _onError); + break; + case "double-quoted-scalar": + _type = Scalar.QUOTE_DOUBLE; + value2 = doubleQuotedValue(source, _onError); + break; + default: + onError(scalar, "UNEXPECTED_TOKEN", `Expected a flow scalar value, but found: ${type}`); + return { + value: "", + type: null, + comment: "", + range: [offset3, offset3 + source.length, offset3 + source.length] + }; + } + const valueEnd = offset3 + source.length; + const re = resolveEnd(end, valueEnd, strict, onError); + return { + value: value2, + type: _type, + comment: re.comment, + range: [offset3, valueEnd, re.offset] + }; +} +function plainValue(source, onError) { + let badChar = ""; + switch (source[0]) { + case " ": + badChar = "a tab character"; + break; + case ",": + badChar = "flow indicator character ,"; + break; + case "%": + badChar = "directive indicator character %"; + break; + case "|": + case ">": { + badChar = `block scalar indicator ${source[0]}`; + break; + } + case "@": + case "`": { + badChar = `reserved character ${source[0]}`; + break; + } + } + if (badChar) + onError(0, "BAD_SCALAR_START", `Plain value cannot start with ${badChar}`); + return foldLines(source); +} +function singleQuotedValue(source, onError) { + if (source[source.length - 1] !== "'" || source.length === 1) + onError(source.length, "MISSING_CHAR", "Missing closing 'quote"); + return foldLines(source.slice(1, -1)).replace(/''/g, "'"); +} +function foldLines(source) { + let first2, line; + try { + first2 = new RegExp("(.*?)(? wsStart ? source.slice(wsStart, i + 1) : ch; + } else { + res += ch; + } + } + if (source[source.length - 1] !== '"' || source.length === 1) + onError(source.length, "MISSING_CHAR", 'Missing closing "quote'); + return res; +} +function foldNewline(source, offset3) { + let fold = ""; + let ch = source[offset3 + 1]; + while (ch === " " || ch === " " || ch === "\n" || ch === "\r") { + if (ch === "\r" && source[offset3 + 2] !== "\n") + break; + if (ch === "\n") + fold += "\n"; + offset3 += 1; + ch = source[offset3 + 1]; + } + if (!fold) + fold = " "; + return { fold, offset: offset3 }; +} +function parseCharCode(source, offset3, length, onError) { + const cc = source.substr(offset3, length); + const ok2 = cc.length === length && /^[0-9a-fA-F]+$/.test(cc); + const code = ok2 ? parseInt(cc, 16) : NaN; + if (isNaN(code)) { + const raw = source.substr(offset3 - 2, length + 2); + onError(offset3 - 2, "BAD_DQ_ESCAPE", `Invalid escape sequence ${raw}`); + return raw; + } + return String.fromCodePoint(code); +} +function composeScalar(ctx, token, tagToken, onError) { + const { value: value2, type, comment, range } = token.type === "block-scalar" ? resolveBlockScalar(token, ctx.options.strict, onError) : resolveFlowScalar(token, ctx.options.strict, onError); + const tagName = tagToken ? ctx.directives.tagName(tagToken.source, (msg) => onError(tagToken, "TAG_RESOLVE_FAILED", msg)) : null; + const tag = tagToken && tagName ? findScalarTagByName(ctx.schema, value2, tagName, tagToken, onError) : token.type === "scalar" ? findScalarTagByTest(ctx, value2, token, onError) : ctx.schema[SCALAR$1]; + let scalar; + try { + const res = tag.resolve(value2, (msg) => onError(tagToken ?? token, "TAG_RESOLVE_FAILED", msg), ctx.options); + scalar = isScalar$1(res) ? res : new Scalar(res); + } catch (error2) { + const msg = error2 instanceof Error ? error2.message : String(error2); + onError(tagToken ?? token, "TAG_RESOLVE_FAILED", msg); + scalar = new Scalar(value2); + } + scalar.range = range; + scalar.source = value2; + if (type) + scalar.type = type; + if (tagName) + scalar.tag = tagName; + if (tag.format) + scalar.format = tag.format; + if (comment) + scalar.comment = comment; + return scalar; +} +function findScalarTagByName(schema2, value2, tagName, tagToken, onError) { + var _a; + if (tagName === "!") + return schema2[SCALAR$1]; + const matchWithTest = []; + for (const tag of schema2.tags) { + if (!tag.collection && tag.tag === tagName) { + if (tag.default && tag.test) + matchWithTest.push(tag); + else + return tag; + } + } + for (const tag of matchWithTest) + if ((_a = tag.test) == null ? void 0 : _a.test(value2)) + return tag; + const kt = schema2.knownTags[tagName]; + if (kt && !kt.collection) { + schema2.tags.push(Object.assign({}, kt, { default: false, test: void 0 })); + return kt; + } + onError(tagToken, "TAG_RESOLVE_FAILED", `Unresolved tag: ${tagName}`, tagName !== "tag:yaml.org,2002:str"); + return schema2[SCALAR$1]; +} +function findScalarTagByTest({ directives, schema: schema2 }, value2, token, onError) { + const tag = schema2.tags.find((tag2) => { + var _a; + return tag2.default && ((_a = tag2.test) == null ? void 0 : _a.test(value2)); + }) || schema2[SCALAR$1]; + if (schema2.compat) { + const compat = schema2.compat.find((tag2) => { + var _a; + return tag2.default && ((_a = tag2.test) == null ? void 0 : _a.test(value2)); + }) ?? schema2[SCALAR$1]; + if (tag.tag !== compat.tag) { + const ts = directives.tagString(tag.tag); + const cs = directives.tagString(compat.tag); + const msg = `Value may be parsed as either ${ts} or ${cs}`; + onError(token, "TAG_RESOLVE_FAILED", msg, true); + } + } + return tag; +} +function emptyScalarPosition(offset3, before, pos) { + if (before) { + if (pos === null) + pos = before.length; + for (let i = pos - 1; i >= 0; --i) { + let st = before[i]; + switch (st.type) { + case "space": + case "comment": + case "newline": + offset3 -= st.source.length; + continue; + } + st = before[++i]; + while ((st == null ? void 0 : st.type) === "space") { + offset3 += st.source.length; + st = before[++i]; + } + break; + } + } + return offset3; +} +function composeNode(ctx, token, props, onError) { + const { spaceBefore, comment, anchor, tag } = props; + let node2; + let isSrcToken = true; + switch (token.type) { + case "alias": + node2 = composeAlias(ctx, token, onError); + if (anchor || tag) + onError(token, "ALIAS_PROPS", "An alias node must not specify any properties"); + break; + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "block-scalar": + node2 = composeScalar(ctx, token, tag, onError); + if (anchor) + node2.anchor = anchor.source.substring(1); + break; + case "block-map": + case "block-seq": + case "flow-collection": + node2 = composeCollection(CN, ctx, token, tag, onError); + if (anchor) + node2.anchor = anchor.source.substring(1); + break; + default: { + const message = token.type === "error" ? token.message : `Unsupported token (type: ${token.type})`; + onError(token, "UNEXPECTED_TOKEN", message); + node2 = composeEmptyNode(ctx, token.offset, void 0, null, props, onError); + isSrcToken = false; + } + } + if (anchor && node2.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + if (spaceBefore) + node2.spaceBefore = true; + if (comment) { + if (token.type === "scalar" && token.source === "") + node2.comment = comment; + else + node2.commentBefore = comment; + } + if (ctx.options.keepSourceTokens && isSrcToken) + node2.srcToken = token; + return node2; +} +function composeEmptyNode(ctx, offset3, before, pos, { spaceBefore, comment, anchor, tag }, onError) { + const token = { + type: "scalar", + offset: emptyScalarPosition(offset3, before, pos), + indent: -1, + source: "" + }; + const node2 = composeScalar(ctx, token, tag, onError); + if (anchor) { + node2.anchor = anchor.source.substring(1); + if (node2.anchor === "") + onError(anchor, "BAD_ALIAS", "Anchor cannot be an empty string"); + } + if (spaceBefore) + node2.spaceBefore = true; + if (comment) + node2.comment = comment; + return node2; +} +function composeAlias({ options: options2 }, { offset: offset3, source, end }, onError) { + const alias = new Alias(source.substring(1)); + if (alias.source === "") + onError(offset3, "BAD_ALIAS", "Alias cannot be an empty string"); + if (alias.source.endsWith(":")) + onError(offset3 + source.length - 1, "BAD_ALIAS", "Alias ending in : is ambiguous", true); + const valueEnd = offset3 + source.length; + const re = resolveEnd(end, valueEnd, options2.strict, onError); + alias.range = [offset3, valueEnd, re.offset]; + if (re.comment) + alias.comment = re.comment; + return alias; +} +function composeDoc(options2, directives, { offset: offset3, start, value: value2, end }, onError) { + const opts = Object.assign({ _directives: directives }, options2); + const doc = new Document(void 0, opts); + const ctx = { + atRoot: true, + directives: doc.directives, + options: doc.options, + schema: doc.schema + }; + const props = resolveProps(start, { + indicator: "doc-start", + next: value2 ?? (end == null ? void 0 : end[0]), + offset: offset3, + onError, + startOnNewline: true + }); + if (props.found) { + doc.directives.docStart = true; + if (value2 && (value2.type === "block-map" || value2.type === "block-seq") && !props.hasNewline) + onError(props.end, "MISSING_CHAR", "Block collection cannot start on same line with directives-end marker"); + } + doc.contents = value2 ? composeNode(ctx, value2, props, onError) : composeEmptyNode(ctx, props.end, start, null, props, onError); + const contentEnd = doc.contents.range[2]; + const re = resolveEnd(end, contentEnd, false, onError); + if (re.comment) + doc.comment = re.comment; + doc.range = [offset3, contentEnd, re.offset]; + return doc; +} +function getErrorPos(src2) { + if (typeof src2 === "number") + return [src2, src2 + 1]; + if (Array.isArray(src2)) + return src2.length === 2 ? src2 : [src2[0], src2[1]]; + const { offset: offset3, source } = src2; + return [offset3, offset3 + (typeof source === "string" ? source.length : 1)]; +} +function parsePrelude(prelude) { + var _a; + let comment = ""; + let atComment = false; + let afterEmptyLine = false; + for (let i = 0; i < prelude.length; ++i) { + const source = prelude[i]; + switch (source[0]) { + case "#": + comment += (comment === "" ? "" : afterEmptyLine ? "\n\n" : "\n") + (source.substring(1) || " "); + atComment = true; + afterEmptyLine = false; + break; + case "%": + if (((_a = prelude[i + 1]) == null ? void 0 : _a[0]) !== "#") + i += 1; + atComment = false; + break; + default: + if (!atComment) + afterEmptyLine = true; + atComment = false; + } + } + return { comment, afterEmptyLine }; +} +function resolveAsScalar(token, strict = true, onError) { + if (token) { + const _onError = (pos, code, message) => { + const offset3 = typeof pos === "number" ? pos : Array.isArray(pos) ? pos[0] : pos.offset; + if (onError) + onError(offset3, code, message); + else + throw new YAMLParseError([offset3, offset3 + 1], code, message); + }; + switch (token.type) { + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return resolveFlowScalar(token, strict, _onError); + case "block-scalar": + return resolveBlockScalar(token, strict, _onError); + } + } + return null; +} +function createScalarToken(value2, context) { + const { implicitKey = false, indent, inFlow = false, offset: offset3 = -1, type = "PLAIN" } = context; + const source = stringifyString({ type, value: value2 }, { + implicitKey, + indent: indent > 0 ? " ".repeat(indent) : "", + inFlow, + options: { blockQuote: true, lineWidth: -1 } + }); + const end = context.end ?? [ + { type: "newline", offset: -1, indent, source: "\n" } + ]; + switch (source[0]) { + case "|": + case ">": { + const he = source.indexOf("\n"); + const head = source.substring(0, he); + const body = source.substring(he + 1) + "\n"; + const props = [ + { type: "block-scalar-header", offset: offset3, indent, source: head } + ]; + if (!addEndtoBlockProps(props, end)) + props.push({ type: "newline", offset: -1, indent, source: "\n" }); + return { type: "block-scalar", offset: offset3, indent, props, source: body }; + } + case '"': + return { type: "double-quoted-scalar", offset: offset3, indent, source, end }; + case "'": + return { type: "single-quoted-scalar", offset: offset3, indent, source, end }; + default: + return { type: "scalar", offset: offset3, indent, source, end }; + } +} +function setScalarValue(token, value2, context = {}) { + let { afterKey = false, implicitKey = false, inFlow = false, type } = context; + let indent = "indent" in token ? token.indent : null; + if (afterKey && typeof indent === "number") + indent += 2; + if (!type) + switch (token.type) { + case "single-quoted-scalar": + type = "QUOTE_SINGLE"; + break; + case "double-quoted-scalar": + type = "QUOTE_DOUBLE"; + break; + case "block-scalar": { + const header = token.props[0]; + if (header.type !== "block-scalar-header") + throw new Error("Invalid block scalar header"); + type = header.source[0] === ">" ? "BLOCK_FOLDED" : "BLOCK_LITERAL"; + break; + } + default: + type = "PLAIN"; + } + const source = stringifyString({ type, value: value2 }, { + implicitKey: implicitKey || indent === null, + indent: indent !== null && indent > 0 ? " ".repeat(indent) : "", + inFlow, + options: { blockQuote: true, lineWidth: -1 } + }); + switch (source[0]) { + case "|": + case ">": + setBlockScalarValue(token, source); + break; + case '"': + setFlowScalarValue(token, source, "double-quoted-scalar"); + break; + case "'": + setFlowScalarValue(token, source, "single-quoted-scalar"); + break; + default: + setFlowScalarValue(token, source, "scalar"); + } +} +function setBlockScalarValue(token, source) { + const he = source.indexOf("\n"); + const head = source.substring(0, he); + const body = source.substring(he + 1) + "\n"; + if (token.type === "block-scalar") { + const header = token.props[0]; + if (header.type !== "block-scalar-header") + throw new Error("Invalid block scalar header"); + header.source = head; + token.source = body; + } else { + const { offset: offset3 } = token; + const indent = "indent" in token ? token.indent : -1; + const props = [ + { type: "block-scalar-header", offset: offset3, indent, source: head } + ]; + if (!addEndtoBlockProps(props, "end" in token ? token.end : void 0)) + props.push({ type: "newline", offset: -1, indent, source: "\n" }); + for (const key of Object.keys(token)) + if (key !== "type" && key !== "offset") + delete token[key]; + Object.assign(token, { type: "block-scalar", indent, props, source: body }); + } +} +function addEndtoBlockProps(props, end) { + if (end) + for (const st of end) + switch (st.type) { + case "space": + case "comment": + props.push(st); + break; + case "newline": + props.push(st); + return true; + } + return false; +} +function setFlowScalarValue(token, source, type) { + switch (token.type) { + case "scalar": + case "double-quoted-scalar": + case "single-quoted-scalar": + token.type = type; + token.source = source; + break; + case "block-scalar": { + const end = token.props.slice(1); + let oa = source.length; + if (token.props[0].type === "block-scalar-header") + oa -= token.props[0].source.length; + for (const tok of end) + tok.offset += oa; + delete token.props; + Object.assign(token, { type, source, end }); + break; + } + case "block-map": + case "block-seq": { + const offset3 = token.offset + source.length; + const nl = { type: "newline", offset: offset3, indent: token.indent, source: "\n" }; + delete token.items; + Object.assign(token, { type, source, end: [nl] }); + break; + } + default: { + const indent = "indent" in token ? token.indent : -1; + const end = "end" in token && Array.isArray(token.end) ? token.end.filter((st) => st.type === "space" || st.type === "comment" || st.type === "newline") : []; + for (const key of Object.keys(token)) + if (key !== "type" && key !== "offset") + delete token[key]; + Object.assign(token, { type, indent, source, end }); + } + } +} +function stringifyToken(token) { + switch (token.type) { + case "block-scalar": { + let res = ""; + for (const tok of token.props) + res += stringifyToken(tok); + return res + token.source; + } + case "block-map": + case "block-seq": { + let res = ""; + for (const item of token.items) + res += stringifyItem(item); + return res; + } + case "flow-collection": { + let res = token.start.source; + for (const item of token.items) + res += stringifyItem(item); + for (const st of token.end) + res += st.source; + return res; + } + case "document": { + let res = stringifyItem(token); + if (token.end) + for (const st of token.end) + res += st.source; + return res; + } + default: { + let res = token.source; + if ("end" in token && token.end) + for (const st of token.end) + res += st.source; + return res; + } + } +} +function stringifyItem({ start, key, sep: sep2, value: value2 }) { + let res = ""; + for (const st of start) + res += st.source; + if (key) + res += stringifyToken(key); + if (sep2) + for (const st of sep2) + res += st.source; + if (value2) + res += stringifyToken(value2); + return res; +} +function visit(cst2, visitor) { + if ("type" in cst2 && cst2.type === "document") + cst2 = { start: cst2.start, value: cst2.value }; + _visit(Object.freeze([]), cst2, visitor); +} +function _visit(path3, item, visitor) { + let ctrl = visitor(item, path3); + if (typeof ctrl === "symbol") + return ctrl; + for (const field of ["key", "value"]) { + const token = item[field]; + if (token && "items" in token) { + for (let i = 0; i < token.items.length; ++i) { + const ci = _visit(Object.freeze(path3.concat([[field, i]])), token.items[i], visitor); + if (typeof ci === "number") + i = ci - 1; + else if (ci === BREAK) + return BREAK; + else if (ci === REMOVE) { + token.items.splice(i, 1); + i -= 1; + } + } + if (typeof ctrl === "function" && field === "key") + ctrl = ctrl(item, path3); + } + } + return typeof ctrl === "function" ? ctrl(item, path3) : ctrl; +} +function prettyToken(token) { + switch (token) { + case BOM: + return ""; + case DOCUMENT: + return ""; + case FLOW_END: + return ""; + case SCALAR: + return ""; + default: + return JSON.stringify(token); + } +} +function tokenType(source) { + switch (source) { + case BOM: + return "byte-order-mark"; + case DOCUMENT: + return "doc-mode"; + case FLOW_END: + return "flow-error-end"; + case SCALAR: + return "scalar"; + case "---": + return "doc-start"; + case "...": + return "doc-end"; + case "": + case "\n": + case "\r\n": + return "newline"; + case "-": + return "seq-item-ind"; + case "?": + return "explicit-key-ind"; + case ":": + return "map-value-ind"; + case "{": + return "flow-map-start"; + case "}": + return "flow-map-end"; + case "[": + return "flow-seq-start"; + case "]": + return "flow-seq-end"; + case ",": + return "comma"; + } + switch (source[0]) { + case " ": + case " ": + return "space"; + case "#": + return "comment"; + case "%": + return "directive-line"; + case "*": + return "alias"; + case "&": + return "anchor"; + case "!": + return "tag"; + case "'": + return "single-quoted-scalar"; + case '"': + return "double-quoted-scalar"; + case "|": + case ">": + return "block-scalar-header"; + } + return null; +} +function isEmpty(ch) { + switch (ch) { + case void 0: + case " ": + case "\n": + case "\r": + case " ": + return true; + default: + return false; + } +} +function includesToken(list, type) { + for (let i = 0; i < list.length; ++i) + if (list[i].type === type) + return true; + return false; +} +function findNonEmptyIndex(list) { + for (let i = 0; i < list.length; ++i) { + switch (list[i].type) { + case "space": + case "comment": + case "newline": + break; + default: + return i; + } + } + return -1; +} +function isFlowToken(token) { + switch (token == null ? void 0 : token.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + case "flow-collection": + return true; + default: + return false; + } +} +function getPrevProps(parent) { + switch (parent.type) { + case "document": + return parent.start; + case "block-map": { + const it = parent.items[parent.items.length - 1]; + return it.sep ?? it.start; + } + case "block-seq": + return parent.items[parent.items.length - 1].start; + default: + return []; + } +} +function getFirstKeyStartProps(prev) { + var _a; + if (prev.length === 0) + return []; + let i = prev.length; + loop: + while (--i >= 0) { + switch (prev[i].type) { + case "doc-start": + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + case "newline": + break loop; + } + } + while (((_a = prev[++i]) == null ? void 0 : _a.type) === "space") { + } + return prev.splice(i, prev.length); +} +function fixFlowSeqItems(fc) { + if (fc.start.type === "flow-seq-start") { + for (const it of fc.items) { + if (it.sep && !it.value && !includesToken(it.start, "explicit-key-ind") && !includesToken(it.sep, "map-value-ind")) { + if (it.key) + it.value = it.key; + delete it.key; + if (isFlowToken(it.value)) { + if (it.value.end) + Array.prototype.push.apply(it.value.end, it.sep); + else + it.value.end = it.sep; + } else + Array.prototype.push.apply(it.start, it.sep); + delete it.sep; + } + } + } +} +function parseOptions(options2) { + const prettyErrors = options2.prettyErrors !== false; + const lineCounter = options2.lineCounter || prettyErrors && new LineCounter() || null; + return { lineCounter, prettyErrors }; +} +function parseAllDocuments(source, options2 = {}) { + const { lineCounter, prettyErrors } = parseOptions(options2); + const parser = new Parser2(lineCounter == null ? void 0 : lineCounter.addNewLine); + const composer = new Composer(options2); + const docs = Array.from(composer.compose(parser.parse(source))); + if (prettyErrors && lineCounter) + for (const doc of docs) { + doc.errors.forEach(prettifyError(source, lineCounter)); + doc.warnings.forEach(prettifyError(source, lineCounter)); + } + if (docs.length > 0) + return docs; + return Object.assign([], { empty: true }, composer.streamInfo()); +} +function parseDocument(source, options2 = {}) { + const { lineCounter, prettyErrors } = parseOptions(options2); + const parser = new Parser2(lineCounter == null ? void 0 : lineCounter.addNewLine); + const composer = new Composer(options2); + let doc = null; + for (const _doc of composer.compose(parser.parse(source), true, source.length)) { + if (!doc) + doc = _doc; + else if (doc.options.logLevel !== "silent") { + doc.errors.push(new YAMLParseError(_doc.range.slice(0, 2), "MULTIPLE_DOCS", "Source contains multiple documents; please use YAML.parseAllDocuments()")); + break; + } + } + if (prettyErrors && lineCounter) { + doc.errors.forEach(prettifyError(source, lineCounter)); + doc.warnings.forEach(prettifyError(source, lineCounter)); + } + return doc; +} +function parse$a(src2, reviver, options2) { + let _reviver = void 0; + if (typeof reviver === "function") { + _reviver = reviver; + } else if (options2 === void 0 && reviver && typeof reviver === "object") { + options2 = reviver; + } + const doc = parseDocument(src2, options2); + if (!doc) + return null; + doc.warnings.forEach((warning) => warn(doc.options.logLevel, warning)); + if (doc.errors.length > 0) { + if (doc.options.logLevel !== "silent") + throw doc.errors[0]; + else + doc.errors = []; + } + return doc.toJS(Object.assign({ reviver: _reviver }, options2)); +} +function stringify(value2, replacer, options2) { + let _replacer = null; + if (typeof replacer === "function" || Array.isArray(replacer)) { + _replacer = replacer; + } else if (options2 === void 0 && replacer) { + options2 = replacer; + } + if (typeof options2 === "string") + options2 = options2.length; + if (typeof options2 === "number") { + const indent = Math.round(options2); + options2 = indent < 1 ? void 0 : indent > 8 ? { indent: 8 } : { indent }; + } + if (value2 === void 0) { + const { keepUndefined } = options2 ?? replacer ?? {}; + if (!keepUndefined) + return void 0; + } + return new Document(value2, _replacer, options2).toString(options2); +} +function req$2(name2, rootFile) { + const create = createRequire || createRequireFromPath; + const require3 = create(rootFile); + return require3(name2); +} +function parse$9(src2) { + const obj = {}; + let lines = src2.toString(); + lines = lines.replace(/\r\n?/mg, "\n"); + let match; + while ((match = LINE.exec(lines)) != null) { + const key = match[1]; + let value2 = match[2] || ""; + value2 = value2.trim(); + const maybeQuote = value2[0]; + value2 = value2.replace(/^(['"`])([\s\S]*)\1$/mg, "$2"); + if (maybeQuote === '"') { + value2 = value2.replace(/\\n/g, "\n"); + value2 = value2.replace(/\\r/g, "\r"); + } + obj[key] = value2; + } + return obj; +} +function _log(message) { + console.log(`[dotenv@${version2}][DEBUG] ${message}`); +} +function _resolveHome(envPath) { + return envPath[0] === "~" ? path$9.join(os$2.homedir(), envPath.slice(1)) : envPath; +} +function config(options2) { + let dotenvPath = path$9.resolve(process.cwd(), ".env"); + let encoding = "utf8"; + const debug2 = Boolean(options2 && options2.debug); + const override = Boolean(options2 && options2.override); + if (options2) { + if (options2.path != null) { + dotenvPath = _resolveHome(options2.path); + } + if (options2.encoding != null) { + encoding = options2.encoding; + } + } + try { + const parsed = DotenvModule.parse(fs$9.readFileSync(dotenvPath, { encoding })); + Object.keys(parsed).forEach(function(key) { + if (!Object.prototype.hasOwnProperty.call(process.env, key)) { + process.env[key] = parsed[key]; + } else { + if (override === true) { + process.env[key] = parsed[key]; + } + if (debug2) { + if (override === true) { + _log(`"${key}" is already defined in \`process.env\` and WAS overwritten`); + } else { + _log(`"${key}" is already defined in \`process.env\` and was NOT overwritten`); + } + } + } + }); + return { parsed }; + } catch (e) { + if (debug2) { + _log(`Failed to load ${dotenvPath} ${e.message}`); + } + return { error: e }; + } +} +function rewriteCssUrls(css, replacer) { + return asyncReplace(css, cssUrlRE, async (match) => { + const [matched, rawUrl] = match; + return await doUrlReplace(rawUrl.trim(), matched, replacer); + }); +} +function rewriteCssDataUris(css, replacer) { + return asyncReplace(css, cssDataUriRE, async (match) => { + const [matched, rawUrl] = match; + return await doUrlReplace(rawUrl.trim(), matched, replacer, "data-uri"); + }); +} +function rewriteImportCss(css, replacer) { + return asyncReplace(css, importCssRE, async (match) => { + const [matched, rawUrl] = match; + return await doImportCSSReplace(rawUrl, matched, replacer); + }); +} +async function rewriteCssImageSet(css, replacer) { + return await asyncReplace(css, cssImageSetRE, async (match) => { + const [, rawUrl] = match; + const url2 = await processSrcSet(rawUrl, async ({ url: url3 }) => { + if (cssUrlRE.test(url3)) { + return await rewriteCssUrls(url3, replacer); + } + if (!cssNotProcessedRE.test(url3)) { + return await doUrlReplace(url3, url3, replacer); + } + return url3; + }); + return url2; + }); +} +async function doUrlReplace(rawUrl, matched, replacer, funcName = "url") { + let wrap2 = ""; + const first2 = rawUrl[0]; + if (first2 === `"` || first2 === `'`) { + wrap2 = first2; + rawUrl = rawUrl.slice(1, -1); + } + if (isExternalUrl(rawUrl) || isDataUrl(rawUrl) || rawUrl.startsWith("#") || varRE.test(rawUrl)) { + return matched; + } + const newUrl = await replacer(rawUrl); + if (wrap2 === "" && newUrl !== encodeURI(newUrl)) { + wrap2 = "'"; + } + return `${funcName}(${wrap2}${newUrl}${wrap2})`; +} +async function doImportCSSReplace(rawUrl, matched, replacer) { + let wrap2 = ""; + const first2 = rawUrl[0]; + if (first2 === `"` || first2 === `'`) { + wrap2 = first2; + rawUrl = rawUrl.slice(1, -1); + } + if (isExternalUrl(rawUrl) || isDataUrl(rawUrl) || rawUrl.startsWith("#")) { + return matched; + } + return `@import ${wrap2}${await replacer(rawUrl)}${wrap2}`; +} +function loadPreprocessor(lang, root) { + if (lang in loadedPreprocessors) { + return loadedPreprocessors[lang]; + } + try { + const resolved = requireResolveFromRootWithFallback(root, lang); + return loadedPreprocessors[lang] = _require$1(resolved); + } catch (e) { + if (e.code === "MODULE_NOT_FOUND") { + throw new Error(`Preprocessor dependency "${lang}" not found. Did you install it?`); + } else { + const message = new Error(`Preprocessor dependency "${lang}" failed to load: +${e.message}`); + message.stack = e.stack + "\n" + message.stack; + throw message; + } + } +} +function cleanScssBugUrl(url2) { + if ( + // check bug via `window` and `location` global + typeof window !== "undefined" && typeof location !== "undefined" + ) { + const prefix = location.href.replace(/\/$/, ""); + return url2.replace(prefix, ""); + } else { + return url2; + } +} +function fixScssBugImportValue(data2) { + if ( + // check bug via `window` and `location` global + typeof window !== "undefined" && typeof location !== "undefined" && data2 && "file" in data2 && (!("contents" in data2) || data2.contents == null) + ) { + data2.contents = fs$l.readFileSync(data2.file, "utf-8"); + } + return data2; +} +async function rebaseUrls(file, rootFile, alias, variablePrefix) { + file = path$o.resolve(file); + const fileDir = path$o.dirname(file); + const rootDir = path$o.dirname(rootFile); + if (fileDir === rootDir) { + return { file }; + } + const content = fs$l.readFileSync(file, "utf-8"); + const hasUrls = cssUrlRE.test(content); + const hasDataUris = cssDataUriRE.test(content); + const hasImportCss = importCssRE.test(content); + if (!hasUrls && !hasDataUris && !hasImportCss) { + return { file }; + } + let rebased; + const rebaseFn = (url2) => { + if (url2.startsWith("/")) + return url2; + if (url2.startsWith(variablePrefix)) + return url2; + for (const { find } of alias) { + const matches = typeof find === "string" ? url2.startsWith(find) : find.test(url2); + if (matches) { + return url2; + } + } + const absolute = path$o.resolve(fileDir, url2); + const relative2 = path$o.relative(rootDir, absolute); + return normalizePath$3(relative2); + }; + if (hasImportCss) { + rebased = await rewriteImportCss(content, rebaseFn); + } + if (hasUrls) { + rebased = await rewriteCssUrls(rebased || content, rebaseFn); + } + if (hasDataUris) { + rebased = await rewriteCssDataUris(rebased || content, rebaseFn); + } + return { + file, + contents: rebased + }; +} +function createViteLessPlugin(less2, rootFile, alias, resolvers) { + if (!ViteLessManager) { + ViteLessManager = class ViteManager extends less2.FileManager { + constructor(rootFile2, resolvers2, alias2) { + super(); + this.rootFile = rootFile2; + this.resolvers = resolvers2; + this.alias = alias2; + } + supports(filename) { + return !isExternalUrl(filename); + } + supportsSync() { + return false; + } + async loadFile(filename, dir, opts, env2) { + const resolved = await this.resolvers.less(filename, path$o.join(dir, "*")); + if (resolved) { + const result = await rebaseUrls(resolved, this.rootFile, this.alias, "@"); + let contents; + if (result && "contents" in result) { + contents = result.contents; + } else { + contents = fs$l.readFileSync(resolved, "utf-8"); + } + return { + filename: path$o.resolve(resolved), + contents + }; + } else { + return super.loadFile(filename, dir, opts, env2); + } + } + }; + } + return { + install(_, pluginManager) { + pluginManager.addFileManager(new ViteLessManager(rootFile, resolvers, alias)); + }, + minVersion: [3, 0, 0] + }; +} +function formatStylusSourceMap(mapBefore, root) { + if (!mapBefore) + return void 0; + const map2 = { ...mapBefore }; + const resolveFromRoot = (p) => normalizePath$3(path$o.resolve(root, p)); + if (map2.file) { + map2.file = resolveFromRoot(map2.file); + } + map2.sources = map2.sources.map(resolveFromRoot); + return map2; +} +async function getSource(source, filename, additionalData, enableSourcemap, sep2 = "") { + if (!additionalData) + return { content: source }; + if (typeof additionalData === "function") { + const newContent = await additionalData(source, filename); + if (typeof newContent === "string") { + return { content: newContent }; + } + return newContent; + } + if (!enableSourcemap) { + return { content: additionalData + sep2 + source }; + } + const ms2 = new MagicString(source); + ms2.appendLeft(0, sep2); + ms2.appendLeft(0, additionalData); + const map2 = ms2.generateMap({ hires: true }); + map2.file = filename; + map2.sources = [filename]; + return { + content: ms2.toString(), + map: map2 + }; +} +function skipThrough(node2, st, c) { + c(node2, st); +} +function ignore(_node, _st, _c) { +} +function requireMs() { + if (hasRequiredMs) + return ms; + hasRequiredMs = 1; + var s = 1e3; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var y = d * 365.25; + ms = function(val, options2) { + options2 = options2 || {}; + var type = typeof val; + if (type === "string" && val.length > 0) { + return parse4(val); + } else if (type === "number" && isNaN(val) === false) { + return options2.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) + ); + }; + function parse4(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || "ms").toLowerCase(); + switch (type) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return n * y; + case "days": + case "day": + case "d": + return n * d; + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return n * h; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return n * m; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return n * s; + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return n; + default: + return void 0; + } + } + function fmtShort(ms2) { + if (ms2 >= d) { + return Math.round(ms2 / d) + "d"; + } + if (ms2 >= h) { + return Math.round(ms2 / h) + "h"; + } + if (ms2 >= m) { + return Math.round(ms2 / m) + "m"; + } + if (ms2 >= s) { + return Math.round(ms2 / s) + "s"; + } + return ms2 + "ms"; + } + function fmtLong(ms2) { + return plural(ms2, d, "day") || plural(ms2, h, "hour") || plural(ms2, m, "minute") || plural(ms2, s, "second") || ms2 + " ms"; + } + function plural(ms2, n, name2) { + if (ms2 < n) { + return; + } + if (ms2 < n * 1.5) { + return Math.floor(ms2 / n) + " " + name2; + } + return Math.ceil(ms2 / n) + " " + name2 + "s"; + } + return ms; +} +function requireDebug() { + if (hasRequiredDebug) + return debugExports; + hasRequiredDebug = 1; + (function(module, exports2) { + exports2 = module.exports = createDebug.debug = createDebug["default"] = createDebug; + exports2.coerce = coerce; + exports2.disable = disable; + exports2.enable = enable; + exports2.enabled = enabled; + exports2.humanize = requireMs(); + exports2.names = []; + exports2.skips = []; + exports2.formatters = {}; + var prevTime; + function selectColor(namespace) { + var hash = 0, i; + for (i in namespace) { + hash = (hash << 5) - hash + namespace.charCodeAt(i); + hash |= 0; + } + return exports2.colors[Math.abs(hash) % exports2.colors.length]; + } + function createDebug(namespace) { + function debug2() { + if (!debug2.enabled) + return; + var self2 = debug2; + var curr = +/* @__PURE__ */ new Date(); + var ms2 = curr - (prevTime || curr); + self2.diff = ms2; + self2.prev = prevTime; + self2.curr = curr; + prevTime = curr; + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + args[0] = exports2.coerce(args[0]); + if ("string" !== typeof args[0]) { + args.unshift("%O"); + } + var index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format2) { + if (match === "%%") + return match; + index++; + var formatter2 = exports2.formatters[format2]; + if ("function" === typeof formatter2) { + var val = args[index]; + match = formatter2.call(self2, val); + args.splice(index, 1); + index--; + } + return match; + }); + exports2.formatArgs.call(self2, args); + var logFn = debug2.log || exports2.log || console.log.bind(console); + logFn.apply(self2, args); + } + debug2.namespace = namespace; + debug2.enabled = exports2.enabled(namespace); + debug2.useColors = exports2.useColors(); + debug2.color = selectColor(namespace); + if ("function" === typeof exports2.init) { + exports2.init(debug2); + } + return debug2; + } + function enable(namespaces) { + exports2.save(namespaces); + exports2.names = []; + exports2.skips = []; + var split = (typeof namespaces === "string" ? namespaces : "").split(/[\s,]+/); + var len = split.length; + for (var i = 0; i < len; i++) { + if (!split[i]) + continue; + namespaces = split[i].replace(/\*/g, ".*?"); + if (namespaces[0] === "-") { + exports2.skips.push(new RegExp("^" + namespaces.substr(1) + "$")); + } else { + exports2.names.push(new RegExp("^" + namespaces + "$")); + } + } + } + function disable() { + exports2.enable(""); + } + function enabled(name2) { + var i, len; + for (i = 0, len = exports2.skips.length; i < len; i++) { + if (exports2.skips[i].test(name2)) { + return false; + } + } + for (i = 0, len = exports2.names.length; i < len; i++) { + if (exports2.names[i].test(name2)) { + return true; + } + } + return false; + } + function coerce(val) { + if (val instanceof Error) + return val.stack || val.message; + return val; + } + })(debug$6, debugExports); + return debugExports; +} +function requireBrowser() { + if (hasRequiredBrowser) + return browserExports; + hasRequiredBrowser = 1; + (function(module, exports2) { + exports2 = module.exports = requireDebug(); + exports2.log = log; + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load2; + exports2.useColors = useColors; + exports2.storage = "undefined" != typeof chrome && "undefined" != typeof chrome.storage ? chrome.storage.local : localstorage(); + exports2.colors = [ + "lightseagreen", + "forestgreen", + "goldenrod", + "dodgerblue", + "darkorchid", + "crimson" + ]; + function useColors() { + if (typeof window !== "undefined" && window.process && window.process.type === "renderer") { + return true; + } + return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // is firebug? http://stackoverflow.com/a/398120/376773 + typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // double check webkit in userAgent just in case we are in a worker + typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); + } + exports2.formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (err) { + return "[UnexpectedJSONParseError]: " + err.message; + } + }; + function formatArgs(args) { + var useColors2 = this.useColors; + args[0] = (useColors2 ? "%c" : "") + this.namespace + (useColors2 ? " %c" : " ") + args[0] + (useColors2 ? "%c " : " ") + "+" + exports2.humanize(this.diff); + if (!useColors2) + return; + var c = "color: " + this.color; + args.splice(1, 0, c, "color: inherit"); + var index = 0; + var lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, function(match) { + if ("%%" === match) + return; + index++; + if ("%c" === match) { + lastC = index; + } + }); + args.splice(lastC, 0, c); + } + function log() { + return "object" === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments); + } + function save(namespaces) { + try { + if (null == namespaces) { + exports2.storage.removeItem("debug"); + } else { + exports2.storage.debug = namespaces; + } + } catch (e) { + } + } + function load2() { + var r; + try { + r = exports2.storage.debug; + } catch (e) { + } + if (!r && typeof process !== "undefined" && "env" in process) { + r = process.env.DEBUG; + } + return r; + } + exports2.enable(load2()); + function localstorage() { + try { + return window.localStorage; + } catch (e) { + } + } + })(browser, browserExports); + return browserExports; +} +function requireNode() { + if (hasRequiredNode) + return nodeExports; + hasRequiredNode = 1; + (function(module, exports2) { + var tty2 = require$$0$3; + var util2 = require$$0$6; + exports2 = module.exports = requireDebug(); + exports2.init = init2; + exports2.log = log; + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load2; + exports2.useColors = useColors; + exports2.colors = [6, 2, 3, 4, 5, 1]; + exports2.inspectOpts = Object.keys(process.env).filter(function(key) { + return /^debug_/i.test(key); + }).reduce(function(obj, key) { + var prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, function(_, k) { + return k.toUpperCase(); + }); + var val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) + val = true; + else if (/^(no|off|false|disabled)$/i.test(val)) + val = false; + else if (val === "null") + val = null; + else + val = Number(val); + obj[prop] = val; + return obj; + }, {}); + var fd = parseInt(process.env.DEBUG_FD, 10) || 2; + if (1 !== fd && 2 !== fd) { + util2.deprecate(function() { + }, "except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)")(); + } + var stream4 = 1 === fd ? process.stdout : 2 === fd ? process.stderr : createWritableStdioStream(fd); + function useColors() { + return "colors" in exports2.inspectOpts ? Boolean(exports2.inspectOpts.colors) : tty2.isatty(fd); + } + exports2.formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util2.inspect(v, this.inspectOpts).split("\n").map(function(str) { + return str.trim(); + }).join(" "); + }; + exports2.formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util2.inspect(v, this.inspectOpts); + }; + function formatArgs(args) { + var name2 = this.namespace; + var useColors2 = this.useColors; + if (useColors2) { + var c = this.color; + var prefix = " \x1B[3" + c + ";1m" + name2 + " \x1B[0m"; + args[0] = prefix + args[0].split("\n").join("\n" + prefix); + args.push("\x1B[3" + c + "m+" + exports2.humanize(this.diff) + "\x1B[0m"); + } else { + args[0] = (/* @__PURE__ */ new Date()).toUTCString() + " " + name2 + " " + args[0]; + } + } + function log() { + return stream4.write(util2.format.apply(util2, arguments) + "\n"); + } + function save(namespaces) { + if (null == namespaces) { + delete process.env.DEBUG; + } else { + process.env.DEBUG = namespaces; + } + } + function load2() { + return process.env.DEBUG; + } + function createWritableStdioStream(fd2) { + var stream5; + var tty_wrap = process.binding("tty_wrap"); + switch (tty_wrap.guessHandleType(fd2)) { + case "TTY": + stream5 = new tty2.WriteStream(fd2); + stream5._type = "tty"; + if (stream5._handle && stream5._handle.unref) { + stream5._handle.unref(); + } + break; + case "FILE": + var fs2 = require$$0__default; + stream5 = new fs2.SyncWriteStream(fd2, { autoClose: false }); + stream5._type = "fs"; + break; + case "PIPE": + case "TCP": + var net2 = require$$3$2; + stream5 = new net2.Socket({ + fd: fd2, + readable: false, + writable: true + }); + stream5.readable = false; + stream5.read = null; + stream5._type = "pipe"; + if (stream5._handle && stream5._handle.unref) { + stream5._handle.unref(); + } + break; + default: + throw new Error("Implement me. Unknown stream file type!"); + } + stream5.fd = fd2; + stream5._isStdio = true; + return stream5; + } + function init2(debug2) { + debug2.inspectOpts = {}; + var keys = Object.keys(exports2.inspectOpts); + for (var i = 0; i < keys.length; i++) { + debug2.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]]; + } + } + exports2.enable(load2()); + })(node, nodeExports); + return nodeExports; +} +function encodeUrl$1(url2) { + return String(url2).replace(UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE).replace(ENCODE_CHARS_REGEXP, encodeURI); +} +function escapeHtml$1(string2) { + var str = "" + string2; + var match = matchHtmlRegExp.exec(str); + if (!match) { + return str; + } + var escape2; + var html = ""; + var index = 0; + var lastIndex = 0; + for (index = match.index; index < str.length; index++) { + switch (str.charCodeAt(index)) { + case 34: + escape2 = """; + break; + case 38: + escape2 = "&"; + break; + case 39: + escape2 = "'"; + break; + case 60: + escape2 = "<"; + break; + case 62: + escape2 = ">"; + break; + default: + continue; + } + if (lastIndex !== index) { + html += str.substring(lastIndex, index); + } + lastIndex = index + 1; + html += escape2; + } + return lastIndex !== index ? html + str.substring(lastIndex, index) : html; +} +function first$1(stuff, done) { + if (!Array.isArray(stuff)) + throw new TypeError("arg must be an array of [ee, events...] arrays"); + var cleanups = []; + for (var i = 0; i < stuff.length; i++) { + var arr = stuff[i]; + if (!Array.isArray(arr) || arr.length < 2) + throw new TypeError("each array member must be [ee, events...]"); + var ee = arr[0]; + for (var j = 1; j < arr.length; j++) { + var event = arr[j]; + var fn = listener(event, callback); + ee.on(event, fn); + cleanups.push({ + ee, + event, + fn + }); + } + } + function callback() { + cleanup(); + done.apply(null, arguments); + } + function cleanup() { + var x; + for (var i2 = 0; i2 < cleanups.length; i2++) { + x = cleanups[i2]; + x.ee.removeListener(x.event, x.fn); + } + } + function thunk(fn2) { + done = fn2; + } + thunk.cancel = cleanup; + return thunk; +} +function listener(event, done) { + return function onevent(arg1) { + var args = new Array(arguments.length); + var ee = this; + var err = event === "error" ? arg1 : null; + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + done(err, ee, event, args); + }; +} +function onFinished$1(msg, listener2) { + if (isFinished$1(msg) !== false) { + defer$2(listener2, null, msg); + return msg; + } + attachListener(msg, listener2); + return msg; +} +function isFinished$1(msg) { + var socket = msg.socket; + if (typeof msg.finished === "boolean") { + return Boolean(msg.finished || socket && !socket.writable); + } + if (typeof msg.complete === "boolean") { + return Boolean(msg.upgrade || !socket || !socket.readable || msg.complete && !msg.readable); + } + return void 0; +} +function attachFinishedListener(msg, callback) { + var eeMsg; + var eeSocket; + var finished = false; + function onFinish(error2) { + eeMsg.cancel(); + eeSocket.cancel(); + finished = true; + callback(error2); + } + eeMsg = eeSocket = first([[msg, "end", "finish"]], onFinish); + function onSocket(socket) { + msg.removeListener("socket", onSocket); + if (finished) + return; + if (eeMsg !== eeSocket) + return; + eeSocket = first([[socket, "error", "close"]], onFinish); + } + if (msg.socket) { + onSocket(msg.socket); + return; + } + msg.on("socket", onSocket); + if (msg.socket === void 0) { + patchAssignSocket(msg, onSocket); + } +} +function attachListener(msg, listener2) { + var attached = msg.__onFinished; + if (!attached || !attached.queue) { + attached = msg.__onFinished = createListener(msg); + attachFinishedListener(msg, attached); + } + attached.queue.push(listener2); +} +function createListener(msg) { + function listener2(err) { + if (msg.__onFinished === listener2) + msg.__onFinished = null; + if (!listener2.queue) + return; + var queue2 = listener2.queue; + listener2.queue = null; + for (var i = 0; i < queue2.length; i++) { + queue2[i](err, msg); + } + } + listener2.queue = []; + return listener2; +} +function patchAssignSocket(res, callback) { + var assignSocket = res.assignSocket; + if (typeof assignSocket !== "function") + return; + res.assignSocket = function _assignSocket(socket) { + assignSocket.call(this, socket); + callback(socket); + }; +} +function parseurl(req2) { + var url2 = req2.url; + if (url2 === void 0) { + return void 0; + } + var parsed = req2._parsedUrl; + if (fresh(url2, parsed)) { + return parsed; + } + parsed = fastparse(url2); + parsed._raw = url2; + return req2._parsedUrl = parsed; +} +function originalurl(req2) { + var url2 = req2.originalUrl; + if (typeof url2 !== "string") { + return parseurl(req2); + } + var parsed = req2._parsedOriginalUrl; + if (fresh(url2, parsed)) { + return parsed; + } + parsed = fastparse(url2); + parsed._raw = url2; + return req2._parsedOriginalUrl = parsed; +} +function fastparse(str) { + if (typeof str !== "string" || str.charCodeAt(0) !== 47) { + return parse$7(str); + } + var pathname = str; + var query = null; + var search = null; + for (var i = 1; i < str.length; i++) { + switch (str.charCodeAt(i)) { + case 63: + if (search === null) { + pathname = str.substring(0, i); + query = str.substring(i + 1); + search = str.substring(i); + } + break; + case 9: + case 10: + case 12: + case 13: + case 32: + case 35: + case 160: + case 65279: + return parse$7(str); + } + } + var url2 = Url !== void 0 ? new Url() : {}; + url2.path = str; + url2.href = str; + url2.pathname = pathname; + if (search !== null) { + url2.query = query; + url2.search = search; + } + return url2; +} +function fresh(url2, parsedUrl) { + return typeof parsedUrl === "object" && parsedUrl !== null && (Url === void 0 || parsedUrl instanceof Url) && parsedUrl._raw === url2; +} +function populateStatusesMap(statuses2, codes2) { + var arr = []; + Object.keys(codes2).forEach(function forEachCode(code) { + var message = codes2[code]; + var status2 = Number(code); + statuses2[status2] = message; + statuses2[message] = status2; + statuses2[message.toLowerCase()] = status2; + arr.push(status2); + }); + return arr; +} +function status(code) { + if (typeof code === "number") { + if (!status[code]) + throw new Error("invalid status code: " + code); + return code; + } + if (typeof code !== "string") { + throw new TypeError("code must be a number or string"); + } + var n = parseInt(code, 10); + if (!isNaN(n)) { + if (!status[n]) + throw new Error("invalid status code: " + n); + return n; + } + n = status[code.toLowerCase()]; + if (!n) + throw new Error('invalid status message: "' + code + '"'); + return n; +} +function hasPipeDataListeners(stream4) { + var listeners = stream4.listeners("data"); + for (var i = 0; i < listeners.length; i++) { + if (listeners[i].name === "ondata") { + return true; + } + } + return false; +} +function unpipe$1(stream4) { + if (!stream4) { + throw new TypeError("argument stream is required"); + } + if (typeof stream4.unpipe === "function") { + stream4.unpipe(); + return; + } + if (!hasPipeDataListeners(stream4)) { + return; + } + var listener2; + var listeners = stream4.listeners("close"); + for (var i = 0; i < listeners.length; i++) { + listener2 = listeners[i]; + if (listener2.name !== "cleanup" && listener2.name !== "onclose") { + continue; + } + listener2.call(stream4); + } +} +function createHtmlDocument(message) { + var body = escapeHtml(message).replace(NEWLINE_REGEXP, "
").replace(DOUBLE_SPACE_REGEXP, "  "); + return '\n\n\n\nError\n\n\n
' + body + "
\n\n\n"; +} +function finalhandler$1(req2, res, options2) { + var opts = options2 || {}; + var env2 = opts.env || process.env.NODE_ENV || "development"; + var onerror = opts.onerror; + return function(err) { + var headers; + var msg; + var status2; + if (!err && headersSent(res)) { + debug$5("cannot 404 after headers sent"); + return; + } + if (err) { + status2 = getErrorStatusCode(err); + if (status2 === void 0) { + status2 = getResponseStatusCode(res); + } else { + headers = getErrorHeaders(err); + } + msg = getErrorMessage(err, status2, env2); + } else { + status2 = 404; + msg = "Cannot " + req2.method + " " + encodeUrl(getResourceName(req2)); + } + debug$5("default %s", status2); + if (err && onerror) { + defer$1(onerror, err, req2, res); + } + if (headersSent(res)) { + debug$5("cannot %d after headers sent", status2); + req2.socket.destroy(); + return; + } + send(req2, res, status2, headers, msg); + }; +} +function getErrorHeaders(err) { + if (!err.headers || typeof err.headers !== "object") { + return void 0; + } + var headers = /* @__PURE__ */ Object.create(null); + var keys = Object.keys(err.headers); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + headers[key] = err.headers[key]; + } + return headers; +} +function getErrorMessage(err, status2, env2) { + var msg; + if (env2 !== "production") { + msg = err.stack; + if (!msg && typeof err.toString === "function") { + msg = err.toString(); + } + } + return msg || statuses[status2]; +} +function getErrorStatusCode(err) { + if (typeof err.status === "number" && err.status >= 400 && err.status < 600) { + return err.status; + } + if (typeof err.statusCode === "number" && err.statusCode >= 400 && err.statusCode < 600) { + return err.statusCode; + } + return void 0; +} +function getResourceName(req2) { + try { + return parseUrl$1.original(req2).pathname; + } catch (e) { + return "resource"; + } +} +function getResponseStatusCode(res) { + var status2 = res.statusCode; + if (typeof status2 !== "number" || status2 < 400 || status2 > 599) { + status2 = 500; + } + return status2; +} +function headersSent(res) { + return typeof res.headersSent !== "boolean" ? Boolean(res._header) : res.headersSent; +} +function send(req2, res, status2, headers, message) { + function write() { + var body = createHtmlDocument(message); + res.statusCode = status2; + res.statusMessage = statuses[status2]; + setHeaders(res, headers); + res.setHeader("Content-Security-Policy", "default-src 'none'"); + res.setHeader("X-Content-Type-Options", "nosniff"); + res.setHeader("Content-Type", "text/html; charset=utf-8"); + res.setHeader("Content-Length", Buffer.byteLength(body, "utf8")); + if (req2.method === "HEAD") { + res.end(); + return; + } + res.end(body, "utf8"); + } + if (isFinished(req2)) { + write(); + return; + } + unpipe(req2); + onFinished(req2, write); + req2.resume(); +} +function setHeaders(res, headers) { + if (!headers) { + return; + } + var keys = Object.keys(headers); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + res.setHeader(key, headers[key]); + } +} +function call(handle2, route, err, req2, res, next) { + var arity = handle2.length; + var error2 = err; + var hasError = Boolean(err); + debug$4("%s %s : %s", handle2.name || "", route, req2.originalUrl); + try { + if (hasError && arity === 4) { + handle2(err, req2, res, next); + return; + } else if (!hasError && arity < 4) { + handle2(req2, res, next); + return; + } + } catch (e) { + error2 = e; + } + next(error2); +} +function logerror(err) { + if (env !== "test") + console.error(err.stack || err.toString()); +} +function getProtohost(url2) { + if (url2.length === 0 || url2[0] === "/") { + return void 0; + } + var fqdnIndex = url2.indexOf("://"); + return fqdnIndex !== -1 && url2.lastIndexOf("?", fqdnIndex) === -1 ? url2.substr(0, url2.indexOf("/", 3 + fqdnIndex)) : void 0; +} +function toObject(val) { + if (val === null || val === void 0) { + throw new TypeError("Object.assign cannot be called with null or undefined"); + } + return Object(val); +} +function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + var test1 = new String("abc"); + test1[5] = "de"; + if (Object.getOwnPropertyNames(test1)[0] === "5") { + return false; + } + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2["_" + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function(n) { + return test2[n]; + }); + if (order2.join("") !== "0123456789") { + return false; + } + var test3 = {}; + "abcdefghijklmnopqrst".split("").forEach(function(letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join("") !== "abcdefghijklmnopqrst") { + return false; + } + return true; + } catch (err) { + return false; + } +} +function append(header, field) { + if (typeof header !== "string") { + throw new TypeError("header argument is required"); + } + if (!field) { + throw new TypeError("field argument is required"); + } + var fields = !Array.isArray(field) ? parse$6(String(field)) : field; + for (var j = 0; j < fields.length; j++) { + if (!FIELD_NAME_REGEXP.test(fields[j])) { + throw new TypeError("field argument contains an invalid header name"); + } + } + if (header === "*") { + return header; + } + var val = header; + var vals = parse$6(header.toLowerCase()); + if (fields.indexOf("*") !== -1 || vals.indexOf("*") !== -1) { + return "*"; + } + for (var i = 0; i < fields.length; i++) { + var fld = fields[i].toLowerCase(); + if (vals.indexOf(fld) === -1) { + vals.push(fld); + val = val ? val + ", " + fields[i] : fields[i]; + } + } + return val; +} +function parse$6(header) { + var end = 0; + var list = []; + var start = 0; + for (var i = 0, len = header.length; i < len; i++) { + switch (header.charCodeAt(i)) { + case 32: + if (start === end) { + start = end = i + 1; + } + break; + case 44: + list.push(header.substring(start, end)); + start = end = i + 1; + break; + default: + end = i + 1; + break; + } + } + list.push(header.substring(start, end)); + return list; +} +function vary(res, field) { + if (!res || !res.getHeader || !res.setHeader) { + throw new TypeError("res argument is required"); + } + var val = res.getHeader("Vary") || ""; + var header = Array.isArray(val) ? val.join(", ") : String(val); + if (val = append(header, field)) { + res.setHeader("Vary", val); + } +} +function createFsWatchInstance(path3, options2, listener2, errHandler, emitRaw) { + const handleEvent = (rawEvent, evPath) => { + listener2(path3); + emitRaw(rawEvent, evPath, { watchedPath: path3 }); + if (evPath && path3 !== evPath) { + fsWatchBroadcast( + sysPath$2.resolve(path3, evPath), + KEY_LISTENERS, + sysPath$2.join(path3, evPath) + ); + } + }; + try { + return fs$7.watch(path3, options2, handleEvent); + } catch (error2) { + errHandler(error2); + } +} +function setFSEventsListener(path3, realPath, listener2, rawEmitter) { + let watchPath = sysPath$1.extname(realPath) ? sysPath$1.dirname(realPath) : realPath; + const parentPath = sysPath$1.dirname(watchPath); + let cont = FSEventsWatchers.get(watchPath); + if (couldConsolidate(parentPath)) { + watchPath = parentPath; + } + const resolvedPath = sysPath$1.resolve(path3); + const hasSymlink = resolvedPath !== realPath; + const filteredListener = (fullPath, flags, info) => { + if (hasSymlink) + fullPath = fullPath.replace(realPath, resolvedPath); + if (fullPath === resolvedPath || !fullPath.indexOf(resolvedPath + sysPath$1.sep)) + listener2(fullPath, flags, info); + }; + let watchedParent = false; + for (const watchedPath of FSEventsWatchers.keys()) { + if (realPath.indexOf(sysPath$1.resolve(watchedPath) + sysPath$1.sep) === 0) { + watchPath = watchedPath; + cont = FSEventsWatchers.get(watchPath); + watchedParent = true; + break; + } + } + if (cont || watchedParent) { + cont.listeners.add(filteredListener); + } else { + cont = { + listeners: /* @__PURE__ */ new Set([filteredListener]), + rawEmitter, + watcher: createFSEventsInstance(watchPath, (fullPath, flags) => { + if (!cont.listeners.size) + return; + const info = fsevents.getInfo(fullPath, flags); + cont.listeners.forEach((list) => { + list(fullPath, flags, info); + }); + cont.rawEmitter(info.event, fullPath, info); + }) + }; + FSEventsWatchers.set(watchPath, cont); + } + return () => { + const lst = cont.listeners; + lst.delete(filteredListener); + if (!lst.size) { + FSEventsWatchers.delete(watchPath); + if (cont.watcher) + return cont.watcher.stop().then(() => { + cont.rawEmitter = cont.watcher = void 0; + Object.freeze(cont); + }); + } + }; +} +function parse$5(s, env2, opts) { + var chunker = new RegExp([ + "(" + CONTROL + ")", + // control chars + "(" + BAREWORD + "|" + SINGLE_QUOTE + "|" + DOUBLE_QUOTE + ")*" + ].join("|"), "g"); + var match = s.match(chunker).filter(Boolean); + var commented = false; + if (!match) + return []; + if (!env2) + env2 = {}; + if (!opts) + opts = {}; + return match.map(function(s2, j) { + if (commented) { + return; + } + if (RegExp("^" + CONTROL + "$").test(s2)) { + return { op: s2 }; + } + var SQ = "'"; + var DQ = '"'; + var DS = "$"; + var BS = opts.escape || "\\"; + var quote = false; + var esc = false; + var out = ""; + var isGlob3 = false; + for (var i = 0, len = s2.length; i < len; i++) { + var c = s2.charAt(i); + isGlob3 = isGlob3 || !quote && (c === "*" || c === "?"); + if (esc) { + out += c; + esc = false; + } else if (quote) { + if (c === quote) { + quote = false; + } else if (quote == SQ) { + out += c; + } else { + if (c === BS) { + i += 1; + c = s2.charAt(i); + if (c === DQ || c === BS || c === DS) { + out += c; + } else { + out += BS + c; + } + } else if (c === DS) { + out += parseEnvVar(); + } else { + out += c; + } + } + } else if (c === DQ || c === SQ) { + quote = c; + } else if (RegExp("^" + CONTROL + "$").test(c)) { + return { op: s2 }; + } else if (RegExp("^#$").test(c)) { + commented = true; + if (out.length) { + return [out, { comment: s2.slice(i + 1) + match.slice(j + 1).join(" ") }]; + } + return [{ comment: s2.slice(i + 1) + match.slice(j + 1).join(" ") }]; + } else if (c === BS) { + esc = true; + } else if (c === DS) { + out += parseEnvVar(); + } else + out += c; + } + if (isGlob3) + return { op: "glob", pattern: out }; + return out; + function parseEnvVar() { + i += 1; + var varend, varname; + if (s2.charAt(i) === "{") { + i += 1; + if (s2.charAt(i) === "}") { + throw new Error("Bad substitution: " + s2.substr(i - 2, 3)); + } + varend = s2.indexOf("}", i); + if (varend < 0) { + throw new Error("Bad substitution: " + s2.substr(i)); + } + varname = s2.substr(i, varend - i); + i = varend; + } else if (/[*@#?$!_\-]/.test(s2.charAt(i))) { + varname = s2.charAt(i); + i += 1; + } else { + varend = s2.substr(i).match(/[^\w\d_]/); + if (!varend) { + varname = s2.substr(i); + i = s2.length; + } else { + varname = s2.substr(i, varend.index); + i += varend.index - 1; + } + } + return getVar(null, "", varname); + } + }).reduce(function(prev, arg) { + if (arg === void 0) { + return prev; + } + return prev.concat(arg); + }, []); + function getVar(_, pre, key) { + var r = typeof env2 === "function" ? env2(key) : env2[key]; + if (r === void 0 && key != "") + r = ""; + else if (r === void 0) + r = "$"; + if (typeof r === "object") { + return pre + TOKEN + JSON.stringify(r) + TOKEN; + } else + return pre + r; + } +} +function concat$1(list, totalLength) { + if (list.length === 0) + return EMPTY_BUFFER$3; + if (list.length === 1) + return list[0]; + const target = Buffer.allocUnsafe(totalLength); + let offset3 = 0; + for (let i = 0; i < list.length; i++) { + const buf = list[i]; + target.set(buf, offset3); + offset3 += buf.length; + } + if (offset3 < totalLength) { + return new FastBuffer$2(target.buffer, target.byteOffset, offset3); + } + return target; +} +function _mask(source, mask, output, offset3, length) { + for (let i = 0; i < length; i++) { + output[offset3 + i] = source[i] ^ mask[i & 3]; + } +} +function _unmask(buffer, mask) { + for (let i = 0; i < buffer.length; i++) { + buffer[i] ^= mask[i & 3]; + } +} +function toArrayBuffer$1(buf) { + if (buf.length === buf.buffer.byteLength) { + return buf.buffer; + } + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length); +} +function toBuffer$2(data2) { + toBuffer$2.readOnly = true; + if (Buffer.isBuffer(data2)) + return data2; + let buf; + if (data2 instanceof ArrayBuffer) { + buf = new FastBuffer$2(data2); + } else if (ArrayBuffer.isView(data2)) { + buf = new FastBuffer$2(data2.buffer, data2.byteOffset, data2.byteLength); + } else { + buf = Buffer.from(data2); + toBuffer$2.readOnly = false; + } + return buf; +} +function deflateOnData(chunk) { + this[kBuffers].push(chunk); + this[kTotalLength] += chunk.length; +} +function inflateOnData(chunk) { + this[kTotalLength] += chunk.length; + if (this[kPerMessageDeflate]._maxPayload < 1 || this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload) { + this[kBuffers].push(chunk); + return; + } + this[kError$1] = new RangeError("Max payload size exceeded"); + this[kError$1].code = "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"; + this[kError$1][kStatusCode$2] = 1009; + this.removeListener("data", inflateOnData); + this.reset(); +} +function inflateOnError(err) { + this[kPerMessageDeflate]._inflate = null; + err[kStatusCode$2] = 1007; + this[kCallback](err); +} +function isValidStatusCode$2(code) { + return code >= 1e3 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006 || code >= 3e3 && code <= 4999; +} +function _isValidUTF8(buf) { + const len = buf.length; + let i = 0; + while (i < len) { + if ((buf[i] & 128) === 0) { + i++; + } else if ((buf[i] & 224) === 192) { + if (i + 1 === len || (buf[i + 1] & 192) !== 128 || (buf[i] & 254) === 192) { + return false; + } + i += 2; + } else if ((buf[i] & 240) === 224) { + if (i + 2 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || buf[i] === 224 && (buf[i + 1] & 224) === 128 || // Overlong + buf[i] === 237 && (buf[i + 1] & 224) === 160) { + return false; + } + i += 3; + } else if ((buf[i] & 248) === 240) { + if (i + 3 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || (buf[i + 3] & 192) !== 128 || buf[i] === 240 && (buf[i + 1] & 240) === 128 || // Overlong + buf[i] === 244 && buf[i + 1] > 143 || buf[i] > 244) { + return false; + } + i += 4; + } else { + return false; + } + } + return true; +} +function error(ErrorCtor, message, prefix, statusCode, errorCode) { + const err = new ErrorCtor( + prefix ? `Invalid WebSocket frame: ${message}` : message + ); + Error.captureStackTrace(err, error); + err.code = errorCode; + err[kStatusCode$1] = statusCode; + return err; +} +function callListener(listener2, thisArg, event) { + if (typeof listener2 === "object" && listener2.handleEvent) { + listener2.handleEvent.call(listener2, event); + } else { + listener2.call(thisArg, event); + } +} +function push(dest, name2, elem) { + if (dest[name2] === void 0) + dest[name2] = [elem]; + else + dest[name2].push(elem); +} +function parse$4(header) { + const offers = /* @__PURE__ */ Object.create(null); + let params = /* @__PURE__ */ Object.create(null); + let mustUnescape = false; + let isEscaping = false; + let inQuotes = false; + let extensionName; + let paramName; + let start = -1; + let code = -1; + let end = -1; + let i = 0; + for (; i < header.length; i++) { + code = header.charCodeAt(i); + if (extensionName === void 0) { + if (end === -1 && tokenChars$1[code] === 1) { + if (start === -1) + start = i; + } else if (i !== 0 && (code === 32 || code === 9)) { + if (end === -1 && start !== -1) + end = i; + } else if (code === 59 || code === 44) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (end === -1) + end = i; + const name2 = header.slice(start, end); + if (code === 44) { + push(offers, name2, params); + params = /* @__PURE__ */ Object.create(null); + } else { + extensionName = name2; + } + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else if (paramName === void 0) { + if (end === -1 && tokenChars$1[code] === 1) { + if (start === -1) + start = i; + } else if (code === 32 || code === 9) { + if (end === -1 && start !== -1) + end = i; + } else if (code === 59 || code === 44) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (end === -1) + end = i; + push(params, header.slice(start, end), true); + if (code === 44) { + push(offers, extensionName, params); + params = /* @__PURE__ */ Object.create(null); + extensionName = void 0; + } + start = end = -1; + } else if (code === 61 && start !== -1 && end === -1) { + paramName = header.slice(start, i); + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else { + if (isEscaping) { + if (tokenChars$1[code] !== 1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (start === -1) + start = i; + else if (!mustUnescape) + mustUnescape = true; + isEscaping = false; + } else if (inQuotes) { + if (tokenChars$1[code] === 1) { + if (start === -1) + start = i; + } else if (code === 34 && start !== -1) { + inQuotes = false; + end = i; + } else if (code === 92) { + isEscaping = true; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else if (code === 34 && header.charCodeAt(i - 1) === 61) { + inQuotes = true; + } else if (end === -1 && tokenChars$1[code] === 1) { + if (start === -1) + start = i; + } else if (start !== -1 && (code === 32 || code === 9)) { + if (end === -1) + end = i; + } else if (code === 59 || code === 44) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (end === -1) + end = i; + let value2 = header.slice(start, end); + if (mustUnescape) { + value2 = value2.replace(/\\/g, ""); + mustUnescape = false; + } + push(params, paramName, value2); + if (code === 44) { + push(offers, extensionName, params); + params = /* @__PURE__ */ Object.create(null); + extensionName = void 0; + } + paramName = void 0; + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } + } + if (start === -1 || inQuotes || code === 32 || code === 9) { + throw new SyntaxError("Unexpected end of input"); + } + if (end === -1) + end = i; + const token = header.slice(start, end); + if (extensionName === void 0) { + push(offers, token, params); + } else { + if (paramName === void 0) { + push(params, token, true); + } else if (mustUnescape) { + push(params, paramName, token.replace(/\\/g, "")); + } else { + push(params, paramName, token); + } + push(offers, extensionName, params); + } + return offers; +} +function format$1(extensions2) { + return Object.keys(extensions2).map((extension) => { + let configurations = extensions2[extension]; + if (!Array.isArray(configurations)) + configurations = [configurations]; + return configurations.map((params) => { + return [extension].concat( + Object.keys(params).map((k) => { + let values = params[k]; + if (!Array.isArray(values)) + values = [values]; + return values.map((v) => v === true ? k : `${k}=${v}`).join("; "); + }) + ).join("; "); + }).join(", "); + }).join(", "); +} +function initAsClient(websocket, address, protocols, options2) { + const opts = { + protocolVersion: protocolVersions[1], + maxPayload: 100 * 1024 * 1024, + skipUTF8Validation: false, + perMessageDeflate: true, + followRedirects: false, + maxRedirects: 10, + ...options2, + createConnection: void 0, + socketPath: void 0, + hostname: void 0, + protocol: void 0, + timeout: void 0, + method: "GET", + host: void 0, + path: void 0, + port: void 0 + }; + if (!protocolVersions.includes(opts.protocolVersion)) { + throw new RangeError( + `Unsupported protocol version: ${opts.protocolVersion} (supported versions: ${protocolVersions.join(", ")})` + ); + } + let parsedUrl; + if (address instanceof URL$2) { + parsedUrl = address; + websocket._url = address.href; + } else { + try { + parsedUrl = new URL$2(address); + } catch (e) { + throw new SyntaxError(`Invalid URL: ${address}`); + } + websocket._url = address; + } + const isSecure = parsedUrl.protocol === "wss:"; + const isIpcUrl = parsedUrl.protocol === "ws+unix:"; + let invalidUrlMessage; + if (parsedUrl.protocol !== "ws:" && !isSecure && !isIpcUrl) { + invalidUrlMessage = `The URL's protocol must be one of "ws:", "wss:", or "ws+unix:"`; + } else if (isIpcUrl && !parsedUrl.pathname) { + invalidUrlMessage = "The URL's pathname is empty"; + } else if (parsedUrl.hash) { + invalidUrlMessage = "The URL contains a fragment identifier"; + } + if (invalidUrlMessage) { + const err = new SyntaxError(invalidUrlMessage); + if (websocket._redirects === 0) { + throw err; + } else { + emitErrorAndClose(websocket, err); + return; + } + } + const defaultPort = isSecure ? 443 : 80; + const key = randomBytes(16).toString("base64"); + const request = isSecure ? https$2.request : http$3.request; + const protocolSet = /* @__PURE__ */ new Set(); + let perMessageDeflate; + opts.createConnection = isSecure ? tlsConnect : netConnect; + opts.defaultPort = opts.defaultPort || defaultPort; + opts.port = parsedUrl.port || defaultPort; + opts.host = parsedUrl.hostname.startsWith("[") ? parsedUrl.hostname.slice(1, -1) : parsedUrl.hostname; + opts.headers = { + ...opts.headers, + "Sec-WebSocket-Version": opts.protocolVersion, + "Sec-WebSocket-Key": key, + Connection: "Upgrade", + Upgrade: "websocket" + }; + opts.path = parsedUrl.pathname + parsedUrl.search; + opts.timeout = opts.handshakeTimeout; + if (opts.perMessageDeflate) { + perMessageDeflate = new PerMessageDeflate$1( + opts.perMessageDeflate !== true ? opts.perMessageDeflate : {}, + false, + opts.maxPayload + ); + opts.headers["Sec-WebSocket-Extensions"] = format({ + [PerMessageDeflate$1.extensionName]: perMessageDeflate.offer() + }); + } + if (protocols.length) { + for (const protocol of protocols) { + if (typeof protocol !== "string" || !subprotocolRegex.test(protocol) || protocolSet.has(protocol)) { + throw new SyntaxError( + "An invalid or duplicated subprotocol was specified" + ); + } + protocolSet.add(protocol); + } + opts.headers["Sec-WebSocket-Protocol"] = protocols.join(","); + } + if (opts.origin) { + if (opts.protocolVersion < 13) { + opts.headers["Sec-WebSocket-Origin"] = opts.origin; + } else { + opts.headers.Origin = opts.origin; + } + } + if (parsedUrl.username || parsedUrl.password) { + opts.auth = `${parsedUrl.username}:${parsedUrl.password}`; + } + if (isIpcUrl) { + const parts = opts.path.split(":"); + opts.socketPath = parts[0]; + opts.path = parts[1]; + } + let req2; + if (opts.followRedirects) { + if (websocket._redirects === 0) { + websocket._originalIpc = isIpcUrl; + websocket._originalSecure = isSecure; + websocket._originalHostOrSocketPath = isIpcUrl ? opts.socketPath : parsedUrl.host; + const headers = options2 && options2.headers; + options2 = { ...options2, headers: {} }; + if (headers) { + for (const [key2, value2] of Object.entries(headers)) { + options2.headers[key2.toLowerCase()] = value2; + } + } + } else if (websocket.listenerCount("redirect") === 0) { + const isSameHost = isIpcUrl ? websocket._originalIpc ? opts.socketPath === websocket._originalHostOrSocketPath : false : websocket._originalIpc ? false : parsedUrl.host === websocket._originalHostOrSocketPath; + if (!isSameHost || websocket._originalSecure && !isSecure) { + delete opts.headers.authorization; + delete opts.headers.cookie; + if (!isSameHost) + delete opts.headers.host; + opts.auth = void 0; + } + } + if (opts.auth && !options2.headers.authorization) { + options2.headers.authorization = "Basic " + Buffer.from(opts.auth).toString("base64"); + } + req2 = websocket._req = request(opts); + if (websocket._redirects) { + websocket.emit("redirect", websocket.url, req2); + } + } else { + req2 = websocket._req = request(opts); + } + if (opts.timeout) { + req2.on("timeout", () => { + abortHandshake$1(websocket, req2, "Opening handshake has timed out"); + }); + } + req2.on("error", (err) => { + if (req2 === null || req2[kAborted]) + return; + req2 = websocket._req = null; + emitErrorAndClose(websocket, err); + }); + req2.on("response", (res) => { + const location2 = res.headers.location; + const statusCode = res.statusCode; + if (location2 && opts.followRedirects && statusCode >= 300 && statusCode < 400) { + if (++websocket._redirects > opts.maxRedirects) { + abortHandshake$1(websocket, req2, "Maximum redirects exceeded"); + return; + } + req2.abort(); + let addr; + try { + addr = new URL$2(location2, address); + } catch (e) { + const err = new SyntaxError(`Invalid URL: ${location2}`); + emitErrorAndClose(websocket, err); + return; + } + initAsClient(websocket, addr, protocols, options2); + } else if (!websocket.emit("unexpected-response", req2, res)) { + abortHandshake$1( + websocket, + req2, + `Unexpected server response: ${res.statusCode}` + ); + } + }); + req2.on("upgrade", (res, socket, head) => { + websocket.emit("upgrade", res); + if (websocket.readyState !== WebSocket$1.CONNECTING) + return; + req2 = websocket._req = null; + if (res.headers.upgrade.toLowerCase() !== "websocket") { + abortHandshake$1(websocket, socket, "Invalid Upgrade header"); + return; + } + const digest = createHash$1("sha1").update(key + GUID$1).digest("base64"); + if (res.headers["sec-websocket-accept"] !== digest) { + abortHandshake$1(websocket, socket, "Invalid Sec-WebSocket-Accept header"); + return; + } + const serverProt = res.headers["sec-websocket-protocol"]; + let protError; + if (serverProt !== void 0) { + if (!protocolSet.size) { + protError = "Server sent a subprotocol but none was requested"; + } else if (!protocolSet.has(serverProt)) { + protError = "Server sent an invalid subprotocol"; + } + } else if (protocolSet.size) { + protError = "Server sent no subprotocol"; + } + if (protError) { + abortHandshake$1(websocket, socket, protError); + return; + } + if (serverProt) + websocket._protocol = serverProt; + const secWebSocketExtensions = res.headers["sec-websocket-extensions"]; + if (secWebSocketExtensions !== void 0) { + if (!perMessageDeflate) { + const message = "Server sent a Sec-WebSocket-Extensions header but no extension was requested"; + abortHandshake$1(websocket, socket, message); + return; + } + let extensions2; + try { + extensions2 = parse$3(secWebSocketExtensions); + } catch (err) { + const message = "Invalid Sec-WebSocket-Extensions header"; + abortHandshake$1(websocket, socket, message); + return; + } + const extensionNames = Object.keys(extensions2); + if (extensionNames.length !== 1 || extensionNames[0] !== PerMessageDeflate$1.extensionName) { + const message = "Server indicated an extension that was not requested"; + abortHandshake$1(websocket, socket, message); + return; + } + try { + perMessageDeflate.accept(extensions2[PerMessageDeflate$1.extensionName]); + } catch (err) { + const message = "Invalid Sec-WebSocket-Extensions header"; + abortHandshake$1(websocket, socket, message); + return; + } + websocket._extensions[PerMessageDeflate$1.extensionName] = perMessageDeflate; + } + websocket.setSocket(socket, head, { + generateMask: opts.generateMask, + maxPayload: opts.maxPayload, + skipUTF8Validation: opts.skipUTF8Validation + }); + }); + req2.end(); +} +function emitErrorAndClose(websocket, err) { + websocket._readyState = WebSocket$1.CLOSING; + websocket.emit("error", err); + websocket.emitClose(); +} +function netConnect(options2) { + options2.path = options2.socketPath; + return net.connect(options2); +} +function tlsConnect(options2) { + options2.path = void 0; + if (!options2.servername && options2.servername !== "") { + options2.servername = net.isIP(options2.host) ? "" : options2.host; + } + return tls.connect(options2); +} +function abortHandshake$1(websocket, stream4, message) { + websocket._readyState = WebSocket$1.CLOSING; + const err = new Error(message); + Error.captureStackTrace(err, abortHandshake$1); + if (stream4.setHeader) { + stream4[kAborted] = true; + stream4.abort(); + if (stream4.socket && !stream4.socket.destroyed) { + stream4.socket.destroy(); + } + process.nextTick(emitErrorAndClose, websocket, err); + } else { + stream4.destroy(err); + stream4.once("error", websocket.emit.bind(websocket, "error")); + stream4.once("close", websocket.emitClose.bind(websocket)); + } +} +function sendAfterClose(websocket, data2, cb) { + if (data2) { + const length = toBuffer(data2).length; + if (websocket._socket) + websocket._sender._bufferedBytes += length; + else + websocket._bufferedAmount += length; + } + if (cb) { + const err = new Error( + `WebSocket is not open: readyState ${websocket.readyState} (${readyStates[websocket.readyState]})` + ); + process.nextTick(cb, err); + } +} +function receiverOnConclude(code, reason) { + const websocket = this[kWebSocket$1]; + websocket._closeFrameReceived = true; + websocket._closeMessage = reason; + websocket._closeCode = code; + if (websocket._socket[kWebSocket$1] === void 0) + return; + websocket._socket.removeListener("data", socketOnData); + process.nextTick(resume, websocket._socket); + if (code === 1005) + websocket.close(); + else + websocket.close(code, reason); +} +function receiverOnDrain() { + const websocket = this[kWebSocket$1]; + if (!websocket.isPaused) + websocket._socket.resume(); +} +function receiverOnError(err) { + const websocket = this[kWebSocket$1]; + if (websocket._socket[kWebSocket$1] !== void 0) { + websocket._socket.removeListener("data", socketOnData); + process.nextTick(resume, websocket._socket); + websocket.close(err[kStatusCode]); + } + websocket.emit("error", err); +} +function receiverOnFinish() { + this[kWebSocket$1].emitClose(); +} +function receiverOnMessage(data2, isBinary) { + this[kWebSocket$1].emit("message", data2, isBinary); +} +function receiverOnPing(data2) { + const websocket = this[kWebSocket$1]; + websocket.pong(data2, !websocket._isServer, NOOP); + websocket.emit("ping", data2); +} +function receiverOnPong(data2) { + this[kWebSocket$1].emit("pong", data2); +} +function resume(stream4) { + stream4.resume(); +} +function socketOnClose() { + const websocket = this[kWebSocket$1]; + this.removeListener("close", socketOnClose); + this.removeListener("data", socketOnData); + this.removeListener("end", socketOnEnd); + websocket._readyState = WebSocket$1.CLOSING; + let chunk; + if (!this._readableState.endEmitted && !websocket._closeFrameReceived && !websocket._receiver._writableState.errorEmitted && (chunk = websocket._socket.read()) !== null) { + websocket._receiver.write(chunk); + } + websocket._receiver.end(); + this[kWebSocket$1] = void 0; + clearTimeout(websocket._closeTimer); + if (websocket._receiver._writableState.finished || websocket._receiver._writableState.errorEmitted) { + websocket.emitClose(); + } else { + websocket._receiver.on("error", receiverOnFinish); + websocket._receiver.on("finish", receiverOnFinish); + } +} +function socketOnData(chunk) { + if (!this[kWebSocket$1]._receiver.write(chunk)) { + this.pause(); + } +} +function socketOnEnd() { + const websocket = this[kWebSocket$1]; + websocket._readyState = WebSocket$1.CLOSING; + websocket._receiver.end(); + this.end(); +} +function socketOnError$1() { + const websocket = this[kWebSocket$1]; + this.removeListener("error", socketOnError$1); + this.on("error", NOOP); + if (websocket) { + websocket._readyState = WebSocket$1.CLOSING; + this.destroy(); + } +} +function RedirectableRequest(options2, responseCallback) { + Writable.call(this); + this._sanitizeOptions(options2); + this._options = options2; + this._ended = false; + this._ending = false; + this._redirectCount = 0; + this._redirects = []; + this._requestBodyLength = 0; + this._requestBodyBuffers = []; + if (responseCallback) { + this.on("response", responseCallback); + } + var self2 = this; + this._onNativeResponse = function(response) { + self2._processResponse(response); + }; + this._performRequest(); +} +function wrap(protocols) { + var exports2 = { + maxRedirects: 21, + maxBodyLength: 10 * 1024 * 1024 + }; + var nativeProtocols = {}; + Object.keys(protocols).forEach(function(scheme) { + var protocol = scheme + ":"; + var nativeProtocol = nativeProtocols[protocol] = protocols[scheme]; + var wrappedProtocol = exports2[scheme] = Object.create(nativeProtocol); + function request(input, options2, callback) { + if (typeof input === "string") { + var urlStr = input; + try { + input = urlToOptions(new URL$1(urlStr)); + } catch (err) { + input = url.parse(urlStr); + } + } else if (URL$1 && input instanceof URL$1) { + input = urlToOptions(input); + } else { + callback = options2; + options2 = input; + input = { protocol }; + } + if (typeof options2 === "function") { + callback = options2; + options2 = null; + } + options2 = Object.assign({ + maxRedirects: exports2.maxRedirects, + maxBodyLength: exports2.maxBodyLength + }, input, options2); + options2.nativeProtocols = nativeProtocols; + assert.equal(options2.protocol, protocol, "protocol mismatch"); + debug$2("options", options2); + return new RedirectableRequest(options2, callback); + } + function get2(input, options2, callback) { + var wrappedRequest = wrappedProtocol.request(input, options2, callback); + wrappedRequest.end(); + return wrappedRequest; + } + Object.defineProperties(wrappedProtocol, { + request: { value: request, configurable: true, enumerable: true, writable: true }, + get: { value: get2, configurable: true, enumerable: true, writable: true } + }); + }); + return exports2; +} +function noop$1() { +} +function urlToOptions(urlObject) { + var options2 = { + protocol: urlObject.protocol, + hostname: urlObject.hostname.startsWith("[") ? ( + /* istanbul ignore next */ + urlObject.hostname.slice(1, -1) + ) : urlObject.hostname, + hash: urlObject.hash, + search: urlObject.search, + pathname: urlObject.pathname, + path: urlObject.pathname + urlObject.search, + href: urlObject.href + }; + if (urlObject.port !== "") { + options2.port = Number(urlObject.port); + } + return options2; +} +function removeMatchingHeaders(regex, headers) { + var lastValue; + for (var header in headers) { + if (regex.test(header)) { + lastValue = headers[header]; + delete headers[header]; + } + } + return lastValue === null || typeof lastValue === "undefined" ? void 0 : String(lastValue).trim(); +} +function createErrorType(code, defaultMessage) { + function CustomError(cause) { + Error.captureStackTrace(this, this.constructor); + if (!cause) { + this.message = defaultMessage; + } else { + this.message = defaultMessage + ": " + cause.message; + this.cause = cause; + } + } + CustomError.prototype = new Error(); + CustomError.prototype.constructor = CustomError; + CustomError.prototype.name = "Error [" + code + "]"; + CustomError.prototype.code = code; + return CustomError; +} +function abortRequest(request) { + for (var e = 0; e < events.length; e++) { + request.removeListener(events[e], eventHandlers[events[e]]); + } + request.on("error", noop$1); + request.abort(); +} +function isSubdomain(subdomain, domain) { + const dot = subdomain.length - domain.length - 1; + return dot > 0 && subdomain[dot] === "." && subdomain.endsWith(domain); +} +function createProxyServer(options2) { + return new ProxyServer(options2); +} +function hasDockerEnv() { + try { + fs$3.statSync("/.dockerenv"); + return true; + } catch (_) { + return false; + } +} +function hasDockerCGroup() { + try { + return fs$3.readFileSync("/proc/self/cgroup", "utf8").includes("docker"); + } catch (_) { + return false; + } +} +function isInsideContainer() { + if (cachedResult === void 0) { + cachedResult = hasContainerEnv() || isDocker(); + } + return cachedResult; +} +function detectArchBinary(binary2) { + if (typeof binary2 === "string" || Array.isArray(binary2)) { + return binary2; + } + const { [arch]: archBinary } = binary2; + if (!archBinary) { + throw new Error(`${arch} is not supported`); + } + return archBinary; +} +function detectPlatformBinary({ [platform]: platformBinary }, { wsl }) { + if (wsl && isWsl) { + return detectArchBinary(wsl); + } + if (!platformBinary) { + throw new Error(`${platform} is not supported`); + } + return detectArchBinary(platformBinary); +} +function requireWindows() { + if (hasRequiredWindows) + return windows; + hasRequiredWindows = 1; + windows = isexe2; + isexe2.sync = sync2; + var fs2 = require$$0__default; + function checkPathExt(path3, options2) { + var pathext = options2.pathExt !== void 0 ? options2.pathExt : process.env.PATHEXT; + if (!pathext) { + return true; + } + pathext = pathext.split(";"); + if (pathext.indexOf("") !== -1) { + return true; + } + for (var i = 0; i < pathext.length; i++) { + var p = pathext[i].toLowerCase(); + if (p && path3.substr(-p.length).toLowerCase() === p) { + return true; + } + } + return false; + } + function checkStat(stat2, path3, options2) { + if (!stat2.isSymbolicLink() && !stat2.isFile()) { + return false; + } + return checkPathExt(path3, options2); + } + function isexe2(path3, options2, cb) { + fs2.stat(path3, function(er, stat2) { + cb(er, er ? false : checkStat(stat2, path3, options2)); + }); + } + function sync2(path3, options2) { + return checkStat(fs2.statSync(path3), path3, options2); + } + return windows; +} +function requireMode() { + if (hasRequiredMode) + return mode; + hasRequiredMode = 1; + mode = isexe2; + isexe2.sync = sync2; + var fs2 = require$$0__default; + function isexe2(path3, options2, cb) { + fs2.stat(path3, function(er, stat2) { + cb(er, er ? false : checkStat(stat2, options2)); + }); + } + function sync2(path3, options2) { + return checkStat(fs2.statSync(path3), options2); + } + function checkStat(stat2, options2) { + return stat2.isFile() && checkMode(stat2, options2); + } + function checkMode(stat2, options2) { + var mod = stat2.mode; + var uid = stat2.uid; + var gid = stat2.gid; + var myUid = options2.uid !== void 0 ? options2.uid : process.getuid && process.getuid(); + var myGid = options2.gid !== void 0 ? options2.gid : process.getgid && process.getgid(); + var u = parseInt("100", 8); + var g = parseInt("010", 8); + var o = parseInt("001", 8); + var ug = u | g; + var ret = mod & o || mod & g && gid === myGid || mod & u && uid === myUid || mod & ug && myUid === 0; + return ret; + } + return mode; +} +function isexe$1(path3, options2, cb) { + if (typeof options2 === "function") { + cb = options2; + options2 = {}; + } + if (!cb) { + if (typeof Promise !== "function") { + throw new TypeError("callback not provided"); + } + return new Promise(function(resolve3, reject) { + isexe$1(path3, options2 || {}, function(er, is) { + if (er) { + reject(er); + } else { + resolve3(is); + } + }); + }); + } + core(path3, options2 || {}, function(er, is) { + if (er) { + if (er.code === "EACCES" || options2 && options2.ignoreErrors) { + er = null; + is = false; + } + } + cb(er, is); + }); +} +function sync(path3, options2) { + try { + return core.sync(path3, options2 || {}); + } catch (er) { + if (options2 && options2.ignoreErrors || er.code === "EACCES") { + return false; + } else { + throw er; + } + } +} +function resolveCommandAttempt(parsed, withoutPathExt) { + const env2 = parsed.options.env || process.env; + const cwd = process.cwd(); + const hasCustomCwd = parsed.options.cwd != null; + const shouldSwitchCwd = hasCustomCwd && process.chdir !== void 0 && !process.chdir.disabled; + if (shouldSwitchCwd) { + try { + process.chdir(parsed.options.cwd); + } catch (err) { + } + } + let resolved; + try { + resolved = which.sync(parsed.command, { + path: env2[getPathKey({ env: env2 })], + pathExt: withoutPathExt ? path$1.delimiter : void 0 + }); + } catch (e) { + } finally { + if (shouldSwitchCwd) { + process.chdir(cwd); + } + } + if (resolved) { + resolved = path$1.resolve(hasCustomCwd ? parsed.options.cwd : "", resolved); + } + return resolved; +} +function resolveCommand$1(parsed) { + return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); +} +function escapeCommand(arg) { + arg = arg.replace(metaCharsRegExp, "^$1"); + return arg; +} +function escapeArgument(arg, doubleEscapeMetaChars) { + arg = `${arg}`; + arg = arg.replace(/(\\*)"/g, '$1$1\\"'); + arg = arg.replace(/(\\*)$/, "$1$1"); + arg = `"${arg}"`; + arg = arg.replace(metaCharsRegExp, "^$1"); + if (doubleEscapeMetaChars) { + arg = arg.replace(metaCharsRegExp, "^$1"); + } + return arg; +} +function readShebang$1(command) { + const size = 150; + const buffer = Buffer.alloc(size); + let fd; + try { + fd = fs.openSync(command, "r"); + fs.readSync(fd, buffer, 0, size, 0); + fs.closeSync(fd); + } catch (e) { + } + return shebangCommand(buffer.toString()); +} +function detectShebang(parsed) { + parsed.file = resolveCommand(parsed); + const shebang = parsed.file && readShebang(parsed.file); + if (shebang) { + parsed.args.unshift(parsed.file); + parsed.command = shebang; + return resolveCommand(parsed); + } + return parsed.file; +} +function parseNonShell(parsed) { + if (!isWin$1) { + return parsed; + } + const commandFile = detectShebang(parsed); + const needsShell = !isExecutableRegExp.test(commandFile); + if (parsed.options.forceShell || needsShell) { + const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); + parsed.command = path2.normalize(parsed.command); + parsed.command = escape$1.command(parsed.command); + parsed.args = parsed.args.map((arg) => escape$1.argument(arg, needsDoubleEscapeMetaChars)); + const shellCommand = [parsed.command].concat(parsed.args).join(" "); + parsed.args = ["/d", "/s", "/c", `"${shellCommand}"`]; + parsed.command = process.env.comspec || "cmd.exe"; + parsed.options.windowsVerbatimArguments = true; + } + return parsed; +} +function parse$1(command, args, options2) { + if (args && !Array.isArray(args)) { + options2 = args; + args = null; + } + args = args ? args.slice(0) : []; + options2 = Object.assign({}, options2); + const parsed = { + command, + args, + options: options2, + file: void 0, + original: { + command, + args + } + }; + return options2.shell ? parsed : parseNonShell(parsed); +} +function notFoundError(original, syscall) { + return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { + code: "ENOENT", + errno: "ENOENT", + syscall: `${syscall} ${original.command}`, + path: original.command, + spawnargs: original.args + }); +} +function hookChildProcess(cp2, parsed) { + if (!isWin) { + return; + } + const originalEmit = cp2.emit; + cp2.emit = function(name2, arg1) { + if (name2 === "exit") { + const err = verifyENOENT(arg1, parsed); + if (err) { + return originalEmit.call(cp2, "error", err); + } + } + return originalEmit.apply(cp2, arguments); + }; +} +function verifyENOENT(status2, parsed) { + if (isWin && status2 === 1 && !parsed.file) { + return notFoundError(parsed.original, "spawn"); + } + return null; +} +function verifyENOENTSync(status2, parsed) { + if (isWin && status2 === 1 && !parsed.file) { + return notFoundError(parsed.original, "spawnSync"); + } + return null; +} +function spawn(command, args, options2) { + const parsed = parse3(command, args, options2); + const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); + enoent.hookChildProcess(spawned, parsed); + return spawned; +} +function spawnSync(command, args, options2) { + const parsed = parse3(command, args, options2); + const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); + result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); + return result; +} +function defineConfig(config2) { + return config2; +} +var __vite_injected_original_import_meta_url2, __filename, __dirname, require2, __require, commonjsGlobal, picocolorsExports, picocolors, tty, isColorSupported, formatter, replaceClose, createColors, picomatchExports, picomatch$5, utils$k, path$n, WIN_SLASH, WIN_NO_SLASH, DOT_LITERAL, PLUS_LITERAL, QMARK_LITERAL, SLASH_LITERAL, ONE_CHAR, QMARK, END_ANCHOR, START_ANCHOR, DOTS_SLASH, NO_DOT, NO_DOTS, NO_DOT_SLASH, NO_DOTS_SLASH, QMARK_NO_DOT, STAR$1, POSIX_CHARS, WINDOWS_CHARS, POSIX_REGEX_SOURCE$1, constants$6, utils$j, CHAR_ASTERISK, CHAR_AT, CHAR_BACKWARD_SLASH, CHAR_COMMA$1, CHAR_DOT$1, CHAR_EXCLAMATION_MARK, CHAR_FORWARD_SLASH, CHAR_LEFT_CURLY_BRACE$1, CHAR_LEFT_PARENTHESES$1, CHAR_LEFT_SQUARE_BRACKET$1, CHAR_PLUS, CHAR_QUESTION_MARK, CHAR_RIGHT_CURLY_BRACE$1, CHAR_RIGHT_PARENTHESES$1, CHAR_RIGHT_SQUARE_BRACKET$1, isPathSeparator, depth, scan$2, scan_1, constants$5, utils$i, MAX_LENGTH$1, POSIX_REGEX_SOURCE, REGEX_NON_SPECIAL_CHARS, REGEX_SPECIAL_CHARS_BACKREF, REPLACEMENTS, expandRange, syntaxError, parse$h, parse_1$3, path$m, scan$1, parse$g, utils$h, constants$4, isObject$4, picomatch$4, picomatch_1, reservedWords$1, builtins$1, forbiddenIdentifiers, old$1, pathModule, isWindows$6, fs$k, DEBUG$1, nextPartRe, splitRootRe, fs_realpath, fs$j, origRealpath, origRealpathSync, version$4, ok, old, isWindows$5, path$k, balancedMatch, balanced, braceExpansion, escSlash, escOpen, escClose, escComma, escPeriod, minimatch$1, minimatch_1, path$j, GLOBSTAR$2, expand$3, plTypes, qmark, star, twoStarDot, twoStarNoDot, charSet, reSpecials, addPatternStartSet, slashSplit, ext, braceExpand, MAX_PATTERN_LENGTH, assertValidPattern, SUBPARSE, globUnescape, regExpEscape, Minimatch$1, inheritsExports, inherits, inherits_browserExports, inherits_browser, hasRequiredInherits_browser, common$c, fs$i, path$i, minimatch, isAbsolute, Minimatch2, sync$9, hasRequiredSync, wrappy_1, onceExports, once$2, wrappy$1, wrappy, reqs, once, inflight_1, glob_1, hasRequiredGlob, globExports, comma, semicolon, chars$1, intToChar, charToInt, td, UrlType, COLUMN, SOURCES_INDEX, SOURCE_LINE, SOURCE_COLUMN, NAMES_INDEX, found, LINE_GTR_ZERO, COL_GTR_EQ_ZERO, LEAST_UPPER_BOUND, GREATEST_LOWER_BOUND, decodedMappings, traceSegment, originalPositionFor$1, get, put, addSegment, setSourceContent, decodedMap, encodedMap, srcExports$1, src$2, browserExports$1, browser$2, ms$1, hasRequiredMs$1, common$b, hasRequiredCommon, hasRequiredBrowser$1, nodeExports$1, node$1, hasRequiredNode$1, _debug, builtins, isRunningWithYarnPnp, _require$3, filter, DEBUG, isCaseInsensitiveFS, isWindows$4, externalRE, isExternalUrl, dataUrlRE, isDataUrl, internalPrefixes, InternalPrefixRE, removeDir, renameDir, escapedSpaceCharacters, imageSetUrlRE, usingDynamicImport, dynamicImport, blankReplacer, requireResolveFromRootWithFallback, GRACEFUL_RENAME_TIMEOUT, GRACEFUL_REMOVE_DIR_TIMEOUT, groups, singleComment, multiComment, POSIX_SEP_RE, NATIVE_SEP_RE, DEFAULT_EXTENSIONS2, DEFAULT_EXTENSIONS_RE_GROUP, debug$f, dist$1, __importDefault, Worker_1, os_1, worker_threads_1, Worker, isArray$1, BitSet, Chunk, btoa$1, SourceMap, toString$2, Mappings, n$1, warned, MagicString, GIT_LFS_PREFIX, A, C, init, E, isDebug$6, debug$e, astralIdentifierCodes, astralIdentifierStartCodes, nonASCIIidentifierChars, nonASCIIidentifierStartChars, reservedWords, ecma5AndLessKeywords, keywords$1, keywordRelationalOperator, nonASCIIidentifierStart, nonASCIIidentifier, TokenType, beforeExpr, startsExpr, keywords$2, types$1, lineBreak, lineBreakG, nonASCIIwhitespace, skipWhiteSpace, ref, hasOwnProperty$1, toString$1, hasOwn, isArray, loneSurrogate, Position, SourceLocation, defaultOptions, warnedAboutEcmaVersion, SCOPE_TOP, SCOPE_FUNCTION, SCOPE_ASYNC, SCOPE_GENERATOR, SCOPE_ARROW, SCOPE_SIMPLE_CATCH, SCOPE_SUPER, SCOPE_DIRECT_SUPER, SCOPE_CLASS_STATIC_BLOCK, SCOPE_VAR, BIND_NONE, BIND_VAR, BIND_LEXICAL, BIND_FUNCTION, BIND_SIMPLE_CATCH, BIND_OUTSIDE, Parser$1, prototypeAccessors, pp$9, literal, DestructuringErrors, pp$8, loopLabel, switchLabel, empty$1, FUNC_STATEMENT, FUNC_HANGING_STATEMENT, FUNC_NULLABLE_ID, pp$7, TokContext, types$2, pp$6, pp$5, empty, pp$4, pp$3, Scope, Node, pp$2, ecma9BinaryProperties, ecma10BinaryProperties, ecma11BinaryProperties, ecma12BinaryProperties, ecma13BinaryProperties, ecma14BinaryProperties, unicodeBinaryProperties, unicodeGeneralCategoryValues, ecma9ScriptValues, ecma10ScriptValues, ecma11ScriptValues, ecma12ScriptValues, ecma13ScriptValues, ecma14ScriptValues, unicodeScriptValues, data, ecmaVersion, i$1, list, pp$1, RegExpValidationState, Token, pp, INVALID_TEMPLATE_ESCAPE_ERROR, version$2, isWindows$3, own$1, messages, nodeInternalPrefix, userStackTraceLimit, captureLargerStackTrace, isDebug$5, debug$d, normalizedClientEntry$1, normalizedEnvEntry$1, isDebug$4, debug$c, externalTypes, tasks, utils$g, array$1, errno$1, fs$h, DirentFromStats$1, path$h, path$g, LEADING_DOT_SEGMENT_CHARACTERS_COUNT, UNESCAPED_GLOB_SYMBOLS_RE, pattern$1, isExtglob$1, isExtglob2, chars, strictCheck, relaxedCheck, isGlob$2, isGlob$1, pathPosixDirname, isWin32, slash, backslash, enclosure, globby, escaped, globParent$2, utils$f, utils$e, stringify$7, isNumber$2, isNumber$1, toRegexRange$1, toRegexRange_1, util$1, toRegexRange, isObject, transform$1, isValidValue, isNumber, zeros, stringify$6, pad, toMaxLen, toSequence, toRange, toRegex, rangeError, invalidRange, invalidStep, fillNumbers, fillLetters, fill$2, fillRange, fill$1, utils$d, compile$1, compile_1, fill, stringify$5, utils$c, append$1, expand$2, expand_1$1, constants$3, stringify$4, MAX_LENGTH, CHAR_BACKSLASH, CHAR_BACKTICK, CHAR_COMMA, CHAR_DOT, CHAR_LEFT_PARENTHESES, CHAR_RIGHT_PARENTHESES, CHAR_LEFT_CURLY_BRACE, CHAR_RIGHT_CURLY_BRACE, CHAR_LEFT_SQUARE_BRACKET, CHAR_RIGHT_SQUARE_BRACKET, CHAR_DOUBLE_QUOTE, CHAR_SINGLE_QUOTE, CHAR_NO_BREAK_SPACE, CHAR_ZERO_WIDTH_NOBREAK_SPACE, parse$c, parse_1$2, stringify$3, compile, expand$1, parse$b, braces$2, braces_1, util, braces$1, picomatch$2, utils$b, isEmptyString, micromatch$1, micromatch_1, path$f, globParent$1, micromatch, GLOBSTAR$1, ESCAPE_SYMBOL, COMMON_GLOB_SYMBOLS_RE, REGEX_CHARACTER_CLASS_SYMBOLS_RE, REGEX_GROUP_SYMBOLS_RE, GLOB_EXTENSION_SYMBOLS_RE, BRACE_EXPANSION_SEPARATORS_RE, stream$4, Stream, PassThrough, slice, merge2_1, merge2, string$2, array, errno, fs$g, path$e, pattern, stream$3, string$1, utils$a, patterns, DOUBLE_SLASH_RE$1, async$7, async$6, out$3, async$5, async$4, out$2, async$3, out$1, async$2, sync$8, settings$3, fs$f, fs$e, Settings$2, async$1, sync$7, settings_1$3, promise, queueMicrotask_1, runParallel_1, queueMicrotask$1, constants$2, NODE_PROCESS_VERSION_PARTS, MAJOR_VERSION, MINOR_VERSION, SUPPORTED_MAJOR_VERSION, SUPPORTED_MINOR_VERSION, IS_MATCHED_BY_MAJOR, IS_MATCHED_BY_MAJOR_AND_MINOR, utils$9, fs$d, DirentFromStats2, fs$c, common$a, fsStat$5, rpl, constants_1$1, utils$8, common$9, sync$6, fsStat$4, constants_1, utils$7, common$8, settings$2, fs$b, path$d, fsStat$3, fs$a, Settings$1, async, sync$5, settings_1$2, queueExports, queue, reusify_1, reusify, common$7, reader$1, common$6, Reader$1, events_1, fsScandir$2, fastq, common$5, reader_1$4, AsyncReader, async_1$4, AsyncProvider, stream$2, stream_1$5, async_1$3, StreamProvider, sync$4, sync$3, fsScandir$1, common$4, reader_1$3, SyncReader, sync_1$3, SyncProvider, settings$1, path$c, fsScandir, Settings3, async_1$2, stream_1$4, sync_1$2, settings_1$1, reader, path$b, fsStat$2, utils$6, Reader2, stream$1, stream_1$3, fsStat$1, fsWalk$2, reader_1$2, ReaderStream, fsWalk$1, reader_1$1, stream_1$2, ReaderAsync, provider, deep, partial, matcher, utils$5, Matcher, matcher_1, PartialMatcher, utils$4, partial_1, DeepFilter, entry$1, utils$3, EntryFilter, error$2, utils$2, ErrorFilter, entry, utils$1, EntryTransformer, path$a, deep_1, entry_1, error_1, entry_2, Provider, async_1$1, provider_1$2, ProviderAsync, stream, stream_1$1, stream_2, provider_1$1, ProviderStream, sync$2, sync$1, fsStat, fsWalk, reader_1, ReaderSync, sync_1$1, provider_1, ProviderSync, settings, taskManager, patternManager, async_1, stream_1, sync_1, settings_1, utils, debug$b, _require$2, jsonLangs, jsonLangRE, isDebug$3, debug$a, dist, ALIAS, DOC, MAP, PAIR, SCALAR$1, SEQ, NODE_TYPE, isAlias, isDocument, isMap, isPair, isScalar$1, isSeq, hasAnchor, NodeBase, BREAK$1, SKIP$1, REMOVE$1, escapeChars, escapeTagName, Directives, Alias, isScalarValue, Scalar, defaultTagPrefix, isEmptyPath, Collection, stringifyComment, lineComment, FOLD_FLOW, FOLD_BLOCK, FOLD_QUOTED, getFoldOptions, containsDocumentMarker, MERGE_KEY, isMergeKey, Pair, YAMLMap, map, YAMLSeq, seq, string, nullTag, boolTag, floatNaN$1, floatExp$1, float$1, intIdentify$2, intResolve$1, intOct$1, int$1, intHex$1, schema$2, stringifyJSON, jsonScalars, jsonError, schema$1, binary, pairs, YAMLOMap, omap, trueTag, falseTag, floatNaN, floatExp, float, intIdentify, intBin, intOct, int, intHex, YAMLSet, set, intTime, floatTime, timestamp, schema, schemas, tagsByName, coreKnownTags, sortMapEntriesByKey, Schema, Document, YAMLError, YAMLParseError, YAMLWarning, prettifyError, startColMsg, blockMsg, isBlock, escapeCodes, CN, Composer, stringify$1, BREAK, SKIP, REMOVE, BOM, DOCUMENT, FLOW_END, SCALAR, isCollection, isScalar, cst, hexDigits, tagChars, invalidFlowScalarChars, invalidAnchorChars, isNotAnchorChar, Lexer, LineCounter, Parser2, YAML, browser$1, require$$3$1, createRequire, createRequireFromPath, req_1, req$1, options, options_1, req, load, plugins, plugins_1, resolve2, url$4, config$1, yaml, loadOptions, loadPlugins, interopRequireDefault, processResult, createContext, importDefault, addTypeScriptLoader, withTypeScriptLoader, rc, mainExports, main$1, name, version$1, description, main, types, exports, scripts, repository, keywords, readmeFilename, license, devDependencies, engines, require$$3, fs$9, path$9, os$2, packageJson, version2, LINE, DotenvModule, parse_1$1, modulePreloadPolyfillId, resolvedModulePreloadPolyfillId, moduleScriptRE, modulePreloadLinkRE, importMapAppendRE, cssModuleRE, varRE, cssUrlRE, cssDataUriRE, importCssRE, cssImageSetRE, UrlRewritePostcssPlugin, cssNotProcessedRE, loadedPreprocessors, _require$1, scss, sass, less, ViteLessManager, styl, preProcessors, base, isMatch$1, scan, basename, dirname, relative, join, debugHmr, normalizedClientDir, Stats, convertSourceMap, debugLoad, debugTransform, debugCache$1, isDebug$2, isDebug$1, debug$9, clientDir, normalizedClientEntry, normalizedEnvEntry, wasmHelper, wasmHelperCode, debug$8, isDebugEnabled$1, debuggerViteDeps, isDebugEnabled, MAX_TEMP_DIR_AGE_MS, preloadMarker, preloadMarkerWithQuote, srcExports, src, browserExports, browser, debugExports, debug$6, ms, hasRequiredMs, hasRequiredDebug, hasRequiredBrowser, nodeExports, node, hasRequiredNode, encodeurl, ENCODE_CHARS_REGEXP, UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE, matchHtmlRegExp, escapeHtml_1, onFinishedExports, onFinished$2, eeFirst, first, defer$2, parseurlExports, parseurl$1, url$3, parse$7, Url, require$$0$1, codes, statuses$1, unpipe_1, debug$5, encodeUrl, escapeHtml, onFinished, parseUrl$1, statuses, unpipe, DOUBLE_SPACE_REGEXP, NEWLINE_REGEXP, defer$1, isFinished, finalhandler_1, utilsMergeExports, utilsMerge, debug$4, EventEmitter$3, finalhandler, http$4, parseUrl, env, proto, defer, libExports$1, lib$1, getOwnPropertySymbols, hasOwnProperty, propIsEnumerable, objectAssign, varyExports, vary$1, FIELD_NAME_REGEXP, chokidar, fs$8, Readable, sysPath$3, promisify$3, picomatch$1, readdir$1, stat$3, lstat$2, realpath$1, BANG$2, RECURSIVE_ERROR_CODE, NORMAL_FLOW_ERRORS, FILE_TYPE, DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE, ALL_TYPES, isNormalFlowError, maj, min, wantBigintFsStats, normalizeFilter, ReaddirpStream, readdirp$1, readdirpPromise, readdirp_1, anymatchExports, anymatch$2, normalizePath$2, picomatch, normalizePath$1, BANG$1, DEFAULT_OPTIONS, arrify$1, createPattern, matchPatterns, anymatch$1, binaryExtensionsExports, binaryExtensions$1, require$$0, path$8, binaryExtensions, extensions, isBinaryPath$1, constants$1, fs$7, sysPath$2, promisify$2, isBinaryPath, isWindows$2, isLinux, EMPTY_FN$2, EMPTY_STR$1, KEY_LISTENERS, KEY_ERR, KEY_RAW, HANDLER_KEYS, EV_CHANGE$2, EV_ADD$2, EV_ADD_DIR$2, EV_ERROR$2, STR_DATA$1, STR_END$2, BRACE_START$1, STAR, THROTTLE_MODE_WATCH, open$1, stat$2, lstat$1, close, fsrealpath, statMethods$1, foreach, addAndConvert, clearItem, delFromSet, isEmptySet, FsWatchInstances, fsWatchBroadcast, setFsWatchListener, FsWatchFileInstances, setFsWatchFileListener, NodeFsHandler$1, nodefsHandler, fseventsHandlerExports, fseventsHandler, fs$6, sysPath$1, promisify$1, fsevents, EV_ADD$1, EV_CHANGE$1, EV_ADD_DIR$1, EV_UNLINK$1, EV_ERROR$1, STR_DATA, STR_END$1, FSEVENT_CREATED, FSEVENT_MODIFIED, FSEVENT_DELETED, FSEVENT_MOVED, FSEVENT_UNKNOWN, FSEVENT_TYPE_FILE, FSEVENT_TYPE_DIRECTORY, FSEVENT_TYPE_SYMLINK, ROOT_GLOBSTAR, DIR_SUFFIX, DOT_SLASH, FUNCTION_TYPE$1, EMPTY_FN$1, IDENTITY_FN, Depth, stat$1, lstat, realpath2, statMethods, FSEventsWatchers, consolidateThreshhold, wrongEventFlags, createFSEventsInstance, couldConsolidate, canUse, calcDepth, sameTypes, FsEventsHandler$1, EventEmitter$2, fs$5, sysPath, promisify, readdirp, anymatch, globParent2, isGlob2, braces, normalizePath, NodeFsHandler2, FsEventsHandler2, EV_ALL, EV_READY, EV_ADD, EV_CHANGE, EV_UNLINK, EV_ADD_DIR, EV_UNLINK_DIR, EV_RAW, EV_ERROR, STR_CLOSE, STR_END, BACK_SLASH_RE, DOUBLE_SLASH_RE, SLASH_OR_BACK_SLASH_RE, DOT_RE, REPLACER_RE, SLASH, SLASH_SLASH, BRACE_START, BANG, ONE_DOT, TWO_DOTS, GLOBSTAR, SLASH_GLOBSTAR, ANYMATCH_OPTS, STRING_TYPE, FUNCTION_TYPE, EMPTY_STR, EMPTY_FN, isWindows$1, isMacos, isIBMi, stat, readdir, arrify, flatten, unifyPaths, toUnix, normalizePathToUnix, normalizeIgnored, getAbsolutePath, undef, DirEntry, STAT_METHOD_F, STAT_METHOD_L, WatchHelper, FSWatcher, watch, shellQuote$1, CONTROL, META, BAREWORD, SINGLE_QUOTE, DOUBLE_QUOTE, TOKEN, i, offset2, bufferUtilExports, bufferUtil$1, constants, EMPTY_BUFFER$3, FastBuffer$2, kDone, kRun, Limiter$1, limiter, zlib, bufferUtil, Limiter2, kStatusCode$2, FastBuffer$1, TRAILER, kPerMessageDeflate, kTotalLength, kCallback, kBuffers, kError$1, zlibLimiter, PerMessageDeflate$4, permessageDeflate, validationExports, validation, isUtf8, tokenChars$2, Writable$1, PerMessageDeflate$3, BINARY_TYPES$1, EMPTY_BUFFER$2, kStatusCode$1, kWebSocket$2, concat, toArrayBuffer, unmask, isValidStatusCode$1, isValidUTF8, FastBuffer, GET_INFO, GET_PAYLOAD_LENGTH_16, GET_PAYLOAD_LENGTH_64, GET_MASK, GET_DATA, INFLATING, Receiver$1, receiver, randomFillSync, PerMessageDeflate$2, EMPTY_BUFFER$1, isValidStatusCode, applyMask, toBuffer$1, kByteLength, maskBuffer, Sender$1, sender, kForOnEventAttribute$1, kListener$1, kCode, kData, kError, kMessage, kReason, kTarget, kType, kWasClean, Event, CloseEvent, ErrorEvent, MessageEvent, EventTarget, eventTarget, tokenChars$1, extension$1, EventEmitter$1, https$2, http$3, net, tls, randomBytes, createHash$1, URL$2, PerMessageDeflate$1, Receiver2, Sender2, BINARY_TYPES, EMPTY_BUFFER, GUID$1, kForOnEventAttribute, kListener, kStatusCode, kWebSocket$1, NOOP, addEventListener, removeEventListener, format, parse$3, toBuffer, closeTimeout, kAborted, protocolVersions, readyStates, subprotocolRegex, WebSocket$1, tokenChars, createHash, GUID, kWebSocket, httpProxyExports$1, httpProxy$3, httpProxyExports, httpProxy$2, eventemitter3Exports, eventemitter3, common$3, requiresPort, url$1, common$2, redirectRegex, webOutgoing, followRedirectsExports, followRedirects$1, debug$3, debug_1, url, URL$1, http$1, https$1, Writable, assert, debug$2, events, eventHandlers, RedirectionError, TooManyRedirectsError, MaxBodyLengthExceededError, WriteAfterEndError, httpNative, httpsNative, web_o, common$1, followRedirects, nativeAgents, webIncoming, http, https, common, wsIncoming, ProxyServer, httpProxy$1, debug$1, libExports, lib, debugCache, isDebug, logTime, isWslExports, isWsl$2, fs$3, isDocker$2, isDocker_1, os, fs$2, isDocker$1, isWsl$1, defineLazyProp, path$3, childProcess, fs$1, fsConstants, isWsl, isDocker, defineLazyProperty, localXdgOpenPath, platform, arch, hasContainerEnv, cachedResult, getWslDrivesMountPoint, pTryEach, baseOpen, open, openApp, apps, crossSpawnExports, crossSpawn, windows, hasRequiredWindows, mode, hasRequiredMode, core, isexe_1, isWindows, path$2, COLON, isexe, getNotFoundError, getPathInfo, which$1, whichSync, which_1, pathKeyExports, pathKey$1, pathKey, path$1, which, getPathKey, resolveCommand_1, _escape, metaCharsRegExp, shebangRegex$1, shebangRegex, shebangCommand$1, fs, shebangCommand, readShebang_1, path2, resolveCommand, escape$1, readShebang, isWin$1, isExecutableRegExp, isCmdShimRegExp, parse_1, isWin, enoent$1, cp, parse3, enoent, debug, _require; +var init_dep_79892de8 = __esm({ + "node_modules/vite/dist/node/chunks/dep-79892de8.js"() { + init_constants(); + __vite_injected_original_import_meta_url2 = "file:///C:/Users/Charles/Desktop/My%20finished%20projects/Nixix/node_modules/vite/dist/node/chunks/dep-79892de8.js"; + __filename = __cjs_fileURLToPath(__vite_injected_original_import_meta_url2); + __dirname = __cjs_dirname(__filename); + require2 = __cjs_createRequire(__vite_injected_original_import_meta_url2); + __require = require2; + commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; + picocolorsExports = {}; + picocolors = { + get exports() { + return picocolorsExports; + }, + set exports(v) { + picocolorsExports = v; + } + }; + tty = require$$0$3; + isColorSupported = !("NO_COLOR" in process.env || process.argv.includes("--no-color")) && ("FORCE_COLOR" in process.env || process.argv.includes("--color") || process.platform === "win32" || tty.isatty(1) && process.env.TERM !== "dumb" || "CI" in process.env); + formatter = (open2, close2, replace = open2) => (input) => { + let string2 = "" + input; + let index = string2.indexOf(close2, open2.length); + return ~index ? open2 + replaceClose(string2, close2, replace, index) + close2 : open2 + string2 + close2; + }; + replaceClose = (string2, close2, replace, index) => { + let start = string2.substring(0, index) + replace; + let end = string2.substring(index + close2.length); + let nextIndex2 = end.indexOf(close2); + return ~nextIndex2 ? start + replaceClose(end, close2, replace, nextIndex2) : start + end; + }; + createColors = (enabled = isColorSupported) => ({ + isColorSupported: enabled, + reset: enabled ? (s) => `\x1B[0m${s}\x1B[0m` : String, + bold: enabled ? formatter("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m") : String, + dim: enabled ? formatter("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m") : String, + italic: enabled ? formatter("\x1B[3m", "\x1B[23m") : String, + underline: enabled ? formatter("\x1B[4m", "\x1B[24m") : String, + inverse: enabled ? formatter("\x1B[7m", "\x1B[27m") : String, + hidden: enabled ? formatter("\x1B[8m", "\x1B[28m") : String, + strikethrough: enabled ? formatter("\x1B[9m", "\x1B[29m") : String, + black: enabled ? formatter("\x1B[30m", "\x1B[39m") : String, + red: enabled ? formatter("\x1B[31m", "\x1B[39m") : String, + green: enabled ? formatter("\x1B[32m", "\x1B[39m") : String, + yellow: enabled ? formatter("\x1B[33m", "\x1B[39m") : String, + blue: enabled ? formatter("\x1B[34m", "\x1B[39m") : String, + magenta: enabled ? formatter("\x1B[35m", "\x1B[39m") : String, + cyan: enabled ? formatter("\x1B[36m", "\x1B[39m") : String, + white: enabled ? formatter("\x1B[37m", "\x1B[39m") : String, + gray: enabled ? formatter("\x1B[90m", "\x1B[39m") : String, + bgBlack: enabled ? formatter("\x1B[40m", "\x1B[49m") : String, + bgRed: enabled ? formatter("\x1B[41m", "\x1B[49m") : String, + bgGreen: enabled ? formatter("\x1B[42m", "\x1B[49m") : String, + bgYellow: enabled ? formatter("\x1B[43m", "\x1B[49m") : String, + bgBlue: enabled ? formatter("\x1B[44m", "\x1B[49m") : String, + bgMagenta: enabled ? formatter("\x1B[45m", "\x1B[49m") : String, + bgCyan: enabled ? formatter("\x1B[46m", "\x1B[49m") : String, + bgWhite: enabled ? formatter("\x1B[47m", "\x1B[49m") : String + }); + picocolors.exports = createColors(); + picocolorsExports.createColors = createColors; + picomatchExports = {}; + picomatch$5 = { + get exports() { + return picomatchExports; + }, + set exports(v) { + picomatchExports = v; + } + }; + utils$k = {}; + path$n = require$$0$4; + WIN_SLASH = "\\\\/"; + WIN_NO_SLASH = `[^${WIN_SLASH}]`; + DOT_LITERAL = "\\."; + PLUS_LITERAL = "\\+"; + QMARK_LITERAL = "\\?"; + SLASH_LITERAL = "\\/"; + ONE_CHAR = "(?=.)"; + QMARK = "[^/]"; + END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; + START_ANCHOR = `(?:^|${SLASH_LITERAL})`; + DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; + NO_DOT = `(?!${DOT_LITERAL})`; + NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; + NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; + NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; + QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; + STAR$1 = `${QMARK}*?`; + POSIX_CHARS = { + DOT_LITERAL, + PLUS_LITERAL, + QMARK_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + QMARK, + END_ANCHOR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK_NO_DOT, + STAR: STAR$1, + START_ANCHOR + }; + WINDOWS_CHARS = { + ...POSIX_CHARS, + SLASH_LITERAL: `[${WIN_SLASH}]`, + QMARK: WIN_NO_SLASH, + STAR: `${WIN_NO_SLASH}*?`, + DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, + NO_DOT: `(?!${DOT_LITERAL})`, + NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, + NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + QMARK_NO_DOT: `[^.${WIN_SLASH}]`, + START_ANCHOR: `(?:^|[${WIN_SLASH}])`, + END_ANCHOR: `(?:[${WIN_SLASH}]|$)` + }; + POSIX_REGEX_SOURCE$1 = { + alnum: "a-zA-Z0-9", + alpha: "a-zA-Z", + ascii: "\\x00-\\x7F", + blank: " \\t", + cntrl: "\\x00-\\x1F\\x7F", + digit: "0-9", + graph: "\\x21-\\x7E", + lower: "a-z", + print: "\\x20-\\x7E ", + punct: "\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~", + space: " \\t\\r\\n\\v\\f", + upper: "A-Z", + word: "A-Za-z0-9_", + xdigit: "A-Fa-f0-9" + }; + constants$6 = { + MAX_LENGTH: 1024 * 64, + POSIX_REGEX_SOURCE: POSIX_REGEX_SOURCE$1, + // regular expressions + REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, + REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, + REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, + REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, + REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, + REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, + // Replace globs with equivalent patterns to reduce parsing time. + REPLACEMENTS: { + "***": "*", + "**/**": "**", + "**/**/**": "**" + }, + // Digits + CHAR_0: 48, + /* 0 */ + CHAR_9: 57, + /* 9 */ + // Alphabet chars. + CHAR_UPPERCASE_A: 65, + /* A */ + CHAR_LOWERCASE_A: 97, + /* a */ + CHAR_UPPERCASE_Z: 90, + /* Z */ + CHAR_LOWERCASE_Z: 122, + /* z */ + CHAR_LEFT_PARENTHESES: 40, + /* ( */ + CHAR_RIGHT_PARENTHESES: 41, + /* ) */ + CHAR_ASTERISK: 42, + /* * */ + // Non-alphabetic chars. + CHAR_AMPERSAND: 38, + /* & */ + CHAR_AT: 64, + /* @ */ + CHAR_BACKWARD_SLASH: 92, + /* \ */ + CHAR_CARRIAGE_RETURN: 13, + /* \r */ + CHAR_CIRCUMFLEX_ACCENT: 94, + /* ^ */ + CHAR_COLON: 58, + /* : */ + CHAR_COMMA: 44, + /* , */ + CHAR_DOT: 46, + /* . */ + CHAR_DOUBLE_QUOTE: 34, + /* " */ + CHAR_EQUAL: 61, + /* = */ + CHAR_EXCLAMATION_MARK: 33, + /* ! */ + CHAR_FORM_FEED: 12, + /* \f */ + CHAR_FORWARD_SLASH: 47, + /* / */ + CHAR_GRAVE_ACCENT: 96, + /* ` */ + CHAR_HASH: 35, + /* # */ + CHAR_HYPHEN_MINUS: 45, + /* - */ + CHAR_LEFT_ANGLE_BRACKET: 60, + /* < */ + CHAR_LEFT_CURLY_BRACE: 123, + /* { */ + CHAR_LEFT_SQUARE_BRACKET: 91, + /* [ */ + CHAR_LINE_FEED: 10, + /* \n */ + CHAR_NO_BREAK_SPACE: 160, + /* \u00A0 */ + CHAR_PERCENT: 37, + /* % */ + CHAR_PLUS: 43, + /* + */ + CHAR_QUESTION_MARK: 63, + /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: 62, + /* > */ + CHAR_RIGHT_CURLY_BRACE: 125, + /* } */ + CHAR_RIGHT_SQUARE_BRACKET: 93, + /* ] */ + CHAR_SEMICOLON: 59, + /* ; */ + CHAR_SINGLE_QUOTE: 39, + /* ' */ + CHAR_SPACE: 32, + /* */ + CHAR_TAB: 9, + /* \t */ + CHAR_UNDERSCORE: 95, + /* _ */ + CHAR_VERTICAL_LINE: 124, + /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, + /* \uFEFF */ + SEP: path$n.sep, + /** + * Create EXTGLOB_CHARS + */ + extglobChars(chars2) { + return { + "!": { type: "negate", open: "(?:(?!(?:", close: `))${chars2.STAR})` }, + "?": { type: "qmark", open: "(?:", close: ")?" }, + "+": { type: "plus", open: "(?:", close: ")+" }, + "*": { type: "star", open: "(?:", close: ")*" }, + "@": { type: "at", open: "(?:", close: ")" } + }; + }, + /** + * Create GLOB_CHARS + */ + globChars(win322) { + return win322 === true ? WINDOWS_CHARS : POSIX_CHARS; + } + }; + (function(exports2) { + const path3 = require$$0$4; + const win322 = process.platform === "win32"; + const { + REGEX_BACKSLASH, + REGEX_REMOVE_BACKSLASH, + REGEX_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_GLOBAL + } = constants$6; + exports2.isObject = (val) => val !== null && typeof val === "object" && !Array.isArray(val); + exports2.hasRegexChars = (str) => REGEX_SPECIAL_CHARS.test(str); + exports2.isRegexChar = (str) => str.length === 1 && exports2.hasRegexChars(str); + exports2.escapeRegex = (str) => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, "\\$1"); + exports2.toPosixSlashes = (str) => str.replace(REGEX_BACKSLASH, "/"); + exports2.removeBackslashes = (str) => { + return str.replace(REGEX_REMOVE_BACKSLASH, (match) => { + return match === "\\" ? "" : match; + }); + }; + exports2.supportsLookbehinds = () => { + const segs = process.version.slice(1).split(".").map(Number); + if (segs.length === 3 && segs[0] >= 9 || segs[0] === 8 && segs[1] >= 10) { + return true; + } + return false; + }; + exports2.isWindows = (options2) => { + if (options2 && typeof options2.windows === "boolean") { + return options2.windows; + } + return win322 === true || path3.sep === "\\"; + }; + exports2.escapeLast = (input, char, lastIdx) => { + const idx = input.lastIndexOf(char, lastIdx); + if (idx === -1) + return input; + if (input[idx - 1] === "\\") + return exports2.escapeLast(input, char, idx - 1); + return `${input.slice(0, idx)}\\${input.slice(idx)}`; + }; + exports2.removePrefix = (input, state = {}) => { + let output = input; + if (output.startsWith("./")) { + output = output.slice(2); + state.prefix = "./"; + } + return output; + }; + exports2.wrapOutput = (input, state = {}, options2 = {}) => { + const prepend = options2.contains ? "" : "^"; + const append2 = options2.contains ? "" : "$"; + let output = `${prepend}(?:${input})${append2}`; + if (state.negated === true) { + output = `(?:^(?!${output}).*$)`; + } + return output; + }; + })(utils$k); + utils$j = utils$k; + ({ + CHAR_ASTERISK, + CHAR_AT: ( + /* * */ + CHAR_AT + ), + CHAR_BACKWARD_SLASH: ( + /* @ */ + CHAR_BACKWARD_SLASH + ), + CHAR_COMMA: CHAR_COMMA$1, + CHAR_DOT: CHAR_DOT$1, + CHAR_EXCLAMATION_MARK: ( + /* . */ + CHAR_EXCLAMATION_MARK + ), + CHAR_FORWARD_SLASH: ( + /* ! */ + CHAR_FORWARD_SLASH + ), + CHAR_LEFT_CURLY_BRACE: CHAR_LEFT_CURLY_BRACE$1, + CHAR_LEFT_PARENTHESES: CHAR_LEFT_PARENTHESES$1, + CHAR_LEFT_SQUARE_BRACKET: CHAR_LEFT_SQUARE_BRACKET$1, + CHAR_PLUS: ( + /* [ */ + CHAR_PLUS + ), + CHAR_QUESTION_MARK: ( + /* + */ + CHAR_QUESTION_MARK + ), + CHAR_RIGHT_CURLY_BRACE: CHAR_RIGHT_CURLY_BRACE$1, + CHAR_RIGHT_PARENTHESES: CHAR_RIGHT_PARENTHESES$1, + CHAR_RIGHT_SQUARE_BRACKET: CHAR_RIGHT_SQUARE_BRACKET$1 + } = constants$6); + isPathSeparator = (code) => { + return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; + }; + depth = (token) => { + if (token.isPrefix !== true) { + token.depth = token.isGlobstar ? Infinity : 1; + } + }; + scan$2 = (input, options2) => { + const opts = options2 || {}; + const length = input.length - 1; + const scanToEnd = opts.parts === true || opts.scanToEnd === true; + const slashes = []; + const tokens = []; + const parts = []; + let str = input; + let index = -1; + let start = 0; + let lastIndex = 0; + let isBrace = false; + let isBracket = false; + let isGlob3 = false; + let isExtglob3 = false; + let isGlobstar = false; + let braceEscaped = false; + let backslashes = false; + let negated = false; + let negatedExtglob = false; + let finished = false; + let braces2 = 0; + let prev; + let code; + let token = { value: "", depth: 0, isGlob: false }; + const eos = () => index >= length; + const peek = () => str.charCodeAt(index + 1); + const advance2 = () => { + prev = code; + return str.charCodeAt(++index); + }; + while (index < length) { + code = advance2(); + let next; + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance2(); + if (code === CHAR_LEFT_CURLY_BRACE$1) { + braceEscaped = true; + } + continue; + } + if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE$1) { + braces2++; + while (eos() !== true && (code = advance2())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance2(); + continue; + } + if (code === CHAR_LEFT_CURLY_BRACE$1) { + braces2++; + continue; + } + if (braceEscaped !== true && code === CHAR_DOT$1 && (code = advance2()) === CHAR_DOT$1) { + isBrace = token.isBrace = true; + isGlob3 = token.isGlob = true; + finished = true; + if (scanToEnd === true) { + continue; + } + break; + } + if (braceEscaped !== true && code === CHAR_COMMA$1) { + isBrace = token.isBrace = true; + isGlob3 = token.isGlob = true; + finished = true; + if (scanToEnd === true) { + continue; + } + break; + } + if (code === CHAR_RIGHT_CURLY_BRACE$1) { + braces2--; + if (braces2 === 0) { + braceEscaped = false; + isBrace = token.isBrace = true; + finished = true; + break; + } + } + } + if (scanToEnd === true) { + continue; + } + break; + } + if (code === CHAR_FORWARD_SLASH) { + slashes.push(index); + tokens.push(token); + token = { value: "", depth: 0, isGlob: false }; + if (finished === true) + continue; + if (prev === CHAR_DOT$1 && index === start + 1) { + start += 2; + continue; + } + lastIndex = index + 1; + continue; + } + if (opts.noext !== true) { + const isExtglobChar = code === CHAR_PLUS || code === CHAR_AT || code === CHAR_ASTERISK || code === CHAR_QUESTION_MARK || code === CHAR_EXCLAMATION_MARK; + if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES$1) { + isGlob3 = token.isGlob = true; + isExtglob3 = token.isExtglob = true; + finished = true; + if (code === CHAR_EXCLAMATION_MARK && index === start) { + negatedExtglob = true; + } + if (scanToEnd === true) { + while (eos() !== true && (code = advance2())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance2(); + continue; + } + if (code === CHAR_RIGHT_PARENTHESES$1) { + isGlob3 = token.isGlob = true; + finished = true; + break; + } + } + continue; + } + break; + } + } + if (code === CHAR_ASTERISK) { + if (prev === CHAR_ASTERISK) + isGlobstar = token.isGlobstar = true; + isGlob3 = token.isGlob = true; + finished = true; + if (scanToEnd === true) { + continue; + } + break; + } + if (code === CHAR_QUESTION_MARK) { + isGlob3 = token.isGlob = true; + finished = true; + if (scanToEnd === true) { + continue; + } + break; + } + if (code === CHAR_LEFT_SQUARE_BRACKET$1) { + while (eos() !== true && (next = advance2())) { + if (next === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance2(); + continue; + } + if (next === CHAR_RIGHT_SQUARE_BRACKET$1) { + isBracket = token.isBracket = true; + isGlob3 = token.isGlob = true; + finished = true; + break; + } + } + if (scanToEnd === true) { + continue; + } + break; + } + if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) { + negated = token.negated = true; + start++; + continue; + } + if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES$1) { + isGlob3 = token.isGlob = true; + if (scanToEnd === true) { + while (eos() !== true && (code = advance2())) { + if (code === CHAR_LEFT_PARENTHESES$1) { + backslashes = token.backslashes = true; + code = advance2(); + continue; + } + if (code === CHAR_RIGHT_PARENTHESES$1) { + finished = true; + break; + } + } + continue; + } + break; + } + if (isGlob3 === true) { + finished = true; + if (scanToEnd === true) { + continue; + } + break; + } + } + if (opts.noext === true) { + isExtglob3 = false; + isGlob3 = false; + } + let base2 = str; + let prefix = ""; + let glob = ""; + if (start > 0) { + prefix = str.slice(0, start); + str = str.slice(start); + lastIndex -= start; + } + if (base2 && isGlob3 === true && lastIndex > 0) { + base2 = str.slice(0, lastIndex); + glob = str.slice(lastIndex); + } else if (isGlob3 === true) { + base2 = ""; + glob = str; + } else { + base2 = str; + } + if (base2 && base2 !== "" && base2 !== "/" && base2 !== str) { + if (isPathSeparator(base2.charCodeAt(base2.length - 1))) { + base2 = base2.slice(0, -1); + } + } + if (opts.unescape === true) { + if (glob) + glob = utils$j.removeBackslashes(glob); + if (base2 && backslashes === true) { + base2 = utils$j.removeBackslashes(base2); + } + } + const state = { + prefix, + input, + start, + base: base2, + glob, + isBrace, + isBracket, + isGlob: isGlob3, + isExtglob: isExtglob3, + isGlobstar, + negated, + negatedExtglob + }; + if (opts.tokens === true) { + state.maxDepth = 0; + if (!isPathSeparator(code)) { + tokens.push(token); + } + state.tokens = tokens; + } + if (opts.parts === true || opts.tokens === true) { + let prevIndex; + for (let idx = 0; idx < slashes.length; idx++) { + const n = prevIndex ? prevIndex + 1 : start; + const i = slashes[idx]; + const value2 = input.slice(n, i); + if (opts.tokens) { + if (idx === 0 && start !== 0) { + tokens[idx].isPrefix = true; + tokens[idx].value = prefix; + } else { + tokens[idx].value = value2; + } + depth(tokens[idx]); + state.maxDepth += tokens[idx].depth; + } + if (idx !== 0 || value2 !== "") { + parts.push(value2); + } + prevIndex = i; + } + if (prevIndex && prevIndex + 1 < input.length) { + const value2 = input.slice(prevIndex + 1); + parts.push(value2); + if (opts.tokens) { + tokens[tokens.length - 1].value = value2; + depth(tokens[tokens.length - 1]); + state.maxDepth += tokens[tokens.length - 1].depth; + } + } + state.slashes = slashes; + state.parts = parts; + } + return state; + }; + scan_1 = scan$2; + constants$5 = constants$6; + utils$i = utils$k; + ({ + MAX_LENGTH: MAX_LENGTH$1, + POSIX_REGEX_SOURCE, + REGEX_NON_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_BACKREF, + REPLACEMENTS + } = constants$5); + expandRange = (args, options2) => { + if (typeof options2.expandRange === "function") { + return options2.expandRange(...args, options2); + } + args.sort(); + const value2 = `[${args.join("-")}]`; + return value2; + }; + syntaxError = (type, char) => { + return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; + }; + parse$h = (input, options2) => { + if (typeof input !== "string") { + throw new TypeError("Expected a string"); + } + input = REPLACEMENTS[input] || input; + const opts = { ...options2 }; + const max = typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH$1, opts.maxLength) : MAX_LENGTH$1; + let len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + const bos = { type: "bos", value: "", output: opts.prepend || "" }; + const tokens = [bos]; + const capture = opts.capture ? "" : "?:"; + const win322 = utils$i.isWindows(options2); + const PLATFORM_CHARS = constants$5.globChars(win322); + const EXTGLOB_CHARS = constants$5.extglobChars(PLATFORM_CHARS); + const { + DOT_LITERAL: DOT_LITERAL2, + PLUS_LITERAL: PLUS_LITERAL2, + SLASH_LITERAL: SLASH_LITERAL2, + ONE_CHAR: ONE_CHAR2, + DOTS_SLASH: DOTS_SLASH2, + NO_DOT: NO_DOT2, + NO_DOT_SLASH: NO_DOT_SLASH2, + NO_DOTS_SLASH: NO_DOTS_SLASH2, + QMARK: QMARK2, + QMARK_NO_DOT: QMARK_NO_DOT2, + STAR: STAR2, + START_ANCHOR: START_ANCHOR2 + } = PLATFORM_CHARS; + const globstar = (opts2) => { + return `(${capture}(?:(?!${START_ANCHOR2}${opts2.dot ? DOTS_SLASH2 : DOT_LITERAL2}).)*?)`; + }; + const nodot = opts.dot ? "" : NO_DOT2; + const qmarkNoDot = opts.dot ? QMARK2 : QMARK_NO_DOT2; + let star2 = opts.bash === true ? globstar(opts) : STAR2; + if (opts.capture) { + star2 = `(${star2})`; + } + if (typeof opts.noext === "boolean") { + opts.noextglob = opts.noext; + } + const state = { + input, + index: -1, + start: 0, + dot: opts.dot === true, + consumed: "", + output: "", + prefix: "", + backtrack: false, + negated: false, + brackets: 0, + braces: 0, + parens: 0, + quotes: 0, + globstar: false, + tokens + }; + input = utils$i.removePrefix(input, state); + len = input.length; + const extglobs = []; + const braces2 = []; + const stack = []; + let prev = bos; + let value2; + const eos = () => state.index === len - 1; + const peek = state.peek = (n = 1) => input[state.index + n]; + const advance2 = state.advance = () => input[++state.index] || ""; + const remaining = () => input.slice(state.index + 1); + const consume = (value3 = "", num = 0) => { + state.consumed += value3; + state.index += num; + }; + const append2 = (token) => { + state.output += token.output != null ? token.output : token.value; + consume(token.value); + }; + const negate = () => { + let count = 1; + while (peek() === "!" && (peek(2) !== "(" || peek(3) === "?")) { + advance2(); + state.start++; + count++; + } + if (count % 2 === 0) { + return false; + } + state.negated = true; + state.start++; + return true; + }; + const increment = (type) => { + state[type]++; + stack.push(type); + }; + const decrement = (type) => { + state[type]--; + stack.pop(); + }; + const push2 = (tok) => { + if (prev.type === "globstar") { + const isBrace = state.braces > 0 && (tok.type === "comma" || tok.type === "brace"); + const isExtglob3 = tok.extglob === true || extglobs.length && (tok.type === "pipe" || tok.type === "paren"); + if (tok.type !== "slash" && tok.type !== "paren" && !isBrace && !isExtglob3) { + state.output = state.output.slice(0, -prev.output.length); + prev.type = "star"; + prev.value = "*"; + prev.output = star2; + state.output += prev.output; + } + } + if (extglobs.length && tok.type !== "paren") { + extglobs[extglobs.length - 1].inner += tok.value; + } + if (tok.value || tok.output) + append2(tok); + if (prev && prev.type === "text" && tok.type === "text") { + prev.value += tok.value; + prev.output = (prev.output || "") + tok.value; + return; + } + tok.prev = prev; + tokens.push(tok); + prev = tok; + }; + const extglobOpen = (type, value3) => { + const token = { ...EXTGLOB_CHARS[value3], conditions: 1, inner: "" }; + token.prev = prev; + token.parens = state.parens; + token.output = state.output; + const output = (opts.capture ? "(" : "") + token.open; + increment("parens"); + push2({ type, value: value3, output: state.output ? "" : ONE_CHAR2 }); + push2({ type: "paren", extglob: true, value: advance2(), output }); + extglobs.push(token); + }; + const extglobClose = (token) => { + let output = token.close + (opts.capture ? ")" : ""); + let rest; + if (token.type === "negate") { + let extglobStar = star2; + if (token.inner && token.inner.length > 1 && token.inner.includes("/")) { + extglobStar = globstar(opts); + } + if (extglobStar !== star2 || eos() || /^\)+$/.test(remaining())) { + output = token.close = `)$))${extglobStar}`; + } + if (token.inner.includes("*") && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) { + const expression = parse$h(rest, { ...options2, fastpaths: false }).output; + output = token.close = `)${expression})${extglobStar})`; + } + if (token.prev.type === "bos") { + state.negatedExtglob = true; + } + } + push2({ type: "paren", extglob: true, value: value2, output }); + decrement("parens"); + }; + if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) { + let backslashes = false; + let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars2, first2, rest, index) => { + if (first2 === "\\") { + backslashes = true; + return m; + } + if (first2 === "?") { + if (esc) { + return esc + first2 + (rest ? QMARK2.repeat(rest.length) : ""); + } + if (index === 0) { + return qmarkNoDot + (rest ? QMARK2.repeat(rest.length) : ""); + } + return QMARK2.repeat(chars2.length); + } + if (first2 === ".") { + return DOT_LITERAL2.repeat(chars2.length); + } + if (first2 === "*") { + if (esc) { + return esc + first2 + (rest ? star2 : ""); + } + return star2; + } + return esc ? m : `\\${m}`; + }); + if (backslashes === true) { + if (opts.unescape === true) { + output = output.replace(/\\/g, ""); + } else { + output = output.replace(/\\+/g, (m) => { + return m.length % 2 === 0 ? "\\\\" : m ? "\\" : ""; + }); + } + } + if (output === input && opts.contains === true) { + state.output = input; + return state; + } + state.output = utils$i.wrapOutput(output, state, options2); + return state; + } + while (!eos()) { + value2 = advance2(); + if (value2 === "\0") { + continue; + } + if (value2 === "\\") { + const next = peek(); + if (next === "/" && opts.bash !== true) { + continue; + } + if (next === "." || next === ";") { + continue; + } + if (!next) { + value2 += "\\"; + push2({ type: "text", value: value2 }); + continue; + } + const match = /^\\+/.exec(remaining()); + let slashes = 0; + if (match && match[0].length > 2) { + slashes = match[0].length; + state.index += slashes; + if (slashes % 2 !== 0) { + value2 += "\\"; + } + } + if (opts.unescape === true) { + value2 = advance2(); + } else { + value2 += advance2(); + } + if (state.brackets === 0) { + push2({ type: "text", value: value2 }); + continue; + } + } + if (state.brackets > 0 && (value2 !== "]" || prev.value === "[" || prev.value === "[^")) { + if (opts.posix !== false && value2 === ":") { + const inner = prev.value.slice(1); + if (inner.includes("[")) { + prev.posix = true; + if (inner.includes(":")) { + const idx = prev.value.lastIndexOf("["); + const pre = prev.value.slice(0, idx); + const rest2 = prev.value.slice(idx + 2); + const posix2 = POSIX_REGEX_SOURCE[rest2]; + if (posix2) { + prev.value = pre + posix2; + state.backtrack = true; + advance2(); + if (!bos.output && tokens.indexOf(prev) === 1) { + bos.output = ONE_CHAR2; + } + continue; + } + } + } + } + if (value2 === "[" && peek() !== ":" || value2 === "-" && peek() === "]") { + value2 = `\\${value2}`; + } + if (value2 === "]" && (prev.value === "[" || prev.value === "[^")) { + value2 = `\\${value2}`; + } + if (opts.posix === true && value2 === "!" && prev.value === "[") { + value2 = "^"; + } + prev.value += value2; + append2({ value: value2 }); + continue; + } + if (state.quotes === 1 && value2 !== '"') { + value2 = utils$i.escapeRegex(value2); + prev.value += value2; + append2({ value: value2 }); + continue; + } + if (value2 === '"') { + state.quotes = state.quotes === 1 ? 0 : 1; + if (opts.keepQuotes === true) { + push2({ type: "text", value: value2 }); + } + continue; + } + if (value2 === "(") { + increment("parens"); + push2({ type: "paren", value: value2 }); + continue; + } + if (value2 === ")") { + if (state.parens === 0 && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError("opening", "(")); + } + const extglob = extglobs[extglobs.length - 1]; + if (extglob && state.parens === extglob.parens + 1) { + extglobClose(extglobs.pop()); + continue; + } + push2({ type: "paren", value: value2, output: state.parens ? ")" : "\\)" }); + decrement("parens"); + continue; + } + if (value2 === "[") { + if (opts.nobracket === true || !remaining().includes("]")) { + if (opts.nobracket !== true && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError("closing", "]")); + } + value2 = `\\${value2}`; + } else { + increment("brackets"); + } + push2({ type: "bracket", value: value2 }); + continue; + } + if (value2 === "]") { + if (opts.nobracket === true || prev && prev.type === "bracket" && prev.value.length === 1) { + push2({ type: "text", value: value2, output: `\\${value2}` }); + continue; + } + if (state.brackets === 0) { + if (opts.strictBrackets === true) { + throw new SyntaxError(syntaxError("opening", "[")); + } + push2({ type: "text", value: value2, output: `\\${value2}` }); + continue; + } + decrement("brackets"); + const prevValue = prev.value.slice(1); + if (prev.posix !== true && prevValue[0] === "^" && !prevValue.includes("/")) { + value2 = `/${value2}`; + } + prev.value += value2; + append2({ value: value2 }); + if (opts.literalBrackets === false || utils$i.hasRegexChars(prevValue)) { + continue; + } + const escaped2 = utils$i.escapeRegex(prev.value); + state.output = state.output.slice(0, -prev.value.length); + if (opts.literalBrackets === true) { + state.output += escaped2; + prev.value = escaped2; + continue; + } + prev.value = `(${capture}${escaped2}|${prev.value})`; + state.output += prev.value; + continue; + } + if (value2 === "{" && opts.nobrace !== true) { + increment("braces"); + const open2 = { + type: "brace", + value: value2, + output: "(", + outputIndex: state.output.length, + tokensIndex: state.tokens.length + }; + braces2.push(open2); + push2(open2); + continue; + } + if (value2 === "}") { + const brace = braces2[braces2.length - 1]; + if (opts.nobrace === true || !brace) { + push2({ type: "text", value: value2, output: value2 }); + continue; + } + let output = ")"; + if (brace.dots === true) { + const arr = tokens.slice(); + const range = []; + for (let i = arr.length - 1; i >= 0; i--) { + tokens.pop(); + if (arr[i].type === "brace") { + break; + } + if (arr[i].type !== "dots") { + range.unshift(arr[i].value); + } + } + output = expandRange(range, opts); + state.backtrack = true; + } + if (brace.comma !== true && brace.dots !== true) { + const out = state.output.slice(0, brace.outputIndex); + const toks = state.tokens.slice(brace.tokensIndex); + brace.value = brace.output = "\\{"; + value2 = output = "\\}"; + state.output = out; + for (const t of toks) { + state.output += t.output || t.value; + } + } + push2({ type: "brace", value: value2, output }); + decrement("braces"); + braces2.pop(); + continue; + } + if (value2 === "|") { + if (extglobs.length > 0) { + extglobs[extglobs.length - 1].conditions++; + } + push2({ type: "text", value: value2 }); + continue; + } + if (value2 === ",") { + let output = value2; + const brace = braces2[braces2.length - 1]; + if (brace && stack[stack.length - 1] === "braces") { + brace.comma = true; + output = "|"; + } + push2({ type: "comma", value: value2, output }); + continue; + } + if (value2 === "/") { + if (prev.type === "dot" && state.index === state.start + 1) { + state.start = state.index + 1; + state.consumed = ""; + state.output = ""; + tokens.pop(); + prev = bos; + continue; + } + push2({ type: "slash", value: value2, output: SLASH_LITERAL2 }); + continue; + } + if (value2 === ".") { + if (state.braces > 0 && prev.type === "dot") { + if (prev.value === ".") + prev.output = DOT_LITERAL2; + const brace = braces2[braces2.length - 1]; + prev.type = "dots"; + prev.output += value2; + prev.value += value2; + brace.dots = true; + continue; + } + if (state.braces + state.parens === 0 && prev.type !== "bos" && prev.type !== "slash") { + push2({ type: "text", value: value2, output: DOT_LITERAL2 }); + continue; + } + push2({ type: "dot", value: value2, output: DOT_LITERAL2 }); + continue; + } + if (value2 === "?") { + const isGroup = prev && prev.value === "("; + if (!isGroup && opts.noextglob !== true && peek() === "(" && peek(2) !== "?") { + extglobOpen("qmark", value2); + continue; + } + if (prev && prev.type === "paren") { + const next = peek(); + let output = value2; + if (next === "<" && !utils$i.supportsLookbehinds()) { + throw new Error("Node.js v10 or higher is required for regex lookbehinds"); + } + if (prev.value === "(" && !/[!=<:]/.test(next) || next === "<" && !/<([!=]|\w+>)/.test(remaining())) { + output = `\\${value2}`; + } + push2({ type: "text", value: value2, output }); + continue; + } + if (opts.dot !== true && (prev.type === "slash" || prev.type === "bos")) { + push2({ type: "qmark", value: value2, output: QMARK_NO_DOT2 }); + continue; + } + push2({ type: "qmark", value: value2, output: QMARK2 }); + continue; + } + if (value2 === "!") { + if (opts.noextglob !== true && peek() === "(") { + if (peek(2) !== "?" || !/[!=<:]/.test(peek(3))) { + extglobOpen("negate", value2); + continue; + } + } + if (opts.nonegate !== true && state.index === 0) { + negate(); + continue; + } + } + if (value2 === "+") { + if (opts.noextglob !== true && peek() === "(" && peek(2) !== "?") { + extglobOpen("plus", value2); + continue; + } + if (prev && prev.value === "(" || opts.regex === false) { + push2({ type: "plus", value: value2, output: PLUS_LITERAL2 }); + continue; + } + if (prev && (prev.type === "bracket" || prev.type === "paren" || prev.type === "brace") || state.parens > 0) { + push2({ type: "plus", value: value2 }); + continue; + } + push2({ type: "plus", value: PLUS_LITERAL2 }); + continue; + } + if (value2 === "@") { + if (opts.noextglob !== true && peek() === "(" && peek(2) !== "?") { + push2({ type: "at", extglob: true, value: value2, output: "" }); + continue; + } + push2({ type: "text", value: value2 }); + continue; + } + if (value2 !== "*") { + if (value2 === "$" || value2 === "^") { + value2 = `\\${value2}`; + } + const match = REGEX_NON_SPECIAL_CHARS.exec(remaining()); + if (match) { + value2 += match[0]; + state.index += match[0].length; + } + push2({ type: "text", value: value2 }); + continue; + } + if (prev && (prev.type === "globstar" || prev.star === true)) { + prev.type = "star"; + prev.star = true; + prev.value += value2; + prev.output = star2; + state.backtrack = true; + state.globstar = true; + consume(value2); + continue; + } + let rest = remaining(); + if (opts.noextglob !== true && /^\([^?]/.test(rest)) { + extglobOpen("star", value2); + continue; + } + if (prev.type === "star") { + if (opts.noglobstar === true) { + consume(value2); + continue; + } + const prior = prev.prev; + const before = prior.prev; + const isStart = prior.type === "slash" || prior.type === "bos"; + const afterStar = before && (before.type === "star" || before.type === "globstar"); + if (opts.bash === true && (!isStart || rest[0] && rest[0] !== "/")) { + push2({ type: "star", value: value2, output: "" }); + continue; + } + const isBrace = state.braces > 0 && (prior.type === "comma" || prior.type === "brace"); + const isExtglob3 = extglobs.length && (prior.type === "pipe" || prior.type === "paren"); + if (!isStart && prior.type !== "paren" && !isBrace && !isExtglob3) { + push2({ type: "star", value: value2, output: "" }); + continue; + } + while (rest.slice(0, 3) === "/**") { + const after = input[state.index + 4]; + if (after && after !== "/") { + break; + } + rest = rest.slice(3); + consume("/**", 3); + } + if (prior.type === "bos" && eos()) { + prev.type = "globstar"; + prev.value += value2; + prev.output = globstar(opts); + state.output = prev.output; + state.globstar = true; + consume(value2); + continue; + } + if (prior.type === "slash" && prior.prev.type !== "bos" && !afterStar && eos()) { + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; + prev.type = "globstar"; + prev.output = globstar(opts) + (opts.strictSlashes ? ")" : "|$)"); + prev.value += value2; + state.globstar = true; + state.output += prior.output + prev.output; + consume(value2); + continue; + } + if (prior.type === "slash" && prior.prev.type !== "bos" && rest[0] === "/") { + const end = rest[1] !== void 0 ? "|$" : ""; + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; + prev.type = "globstar"; + prev.output = `${globstar(opts)}${SLASH_LITERAL2}|${SLASH_LITERAL2}${end})`; + prev.value += value2; + state.output += prior.output + prev.output; + state.globstar = true; + consume(value2 + advance2()); + push2({ type: "slash", value: "/", output: "" }); + continue; + } + if (prior.type === "bos" && rest[0] === "/") { + prev.type = "globstar"; + prev.value += value2; + prev.output = `(?:^|${SLASH_LITERAL2}|${globstar(opts)}${SLASH_LITERAL2})`; + state.output = prev.output; + state.globstar = true; + consume(value2 + advance2()); + push2({ type: "slash", value: "/", output: "" }); + continue; + } + state.output = state.output.slice(0, -prev.output.length); + prev.type = "globstar"; + prev.output = globstar(opts); + prev.value += value2; + state.output += prev.output; + state.globstar = true; + consume(value2); + continue; + } + const token = { type: "star", value: value2, output: star2 }; + if (opts.bash === true) { + token.output = ".*?"; + if (prev.type === "bos" || prev.type === "slash") { + token.output = nodot + token.output; + } + push2(token); + continue; + } + if (prev && (prev.type === "bracket" || prev.type === "paren") && opts.regex === true) { + token.output = value2; + push2(token); + continue; + } + if (state.index === state.start || prev.type === "slash" || prev.type === "dot") { + if (prev.type === "dot") { + state.output += NO_DOT_SLASH2; + prev.output += NO_DOT_SLASH2; + } else if (opts.dot === true) { + state.output += NO_DOTS_SLASH2; + prev.output += NO_DOTS_SLASH2; + } else { + state.output += nodot; + prev.output += nodot; + } + if (peek() !== "*") { + state.output += ONE_CHAR2; + prev.output += ONE_CHAR2; + } + } + push2(token); + } + while (state.brackets > 0) { + if (opts.strictBrackets === true) + throw new SyntaxError(syntaxError("closing", "]")); + state.output = utils$i.escapeLast(state.output, "["); + decrement("brackets"); + } + while (state.parens > 0) { + if (opts.strictBrackets === true) + throw new SyntaxError(syntaxError("closing", ")")); + state.output = utils$i.escapeLast(state.output, "("); + decrement("parens"); + } + while (state.braces > 0) { + if (opts.strictBrackets === true) + throw new SyntaxError(syntaxError("closing", "}")); + state.output = utils$i.escapeLast(state.output, "{"); + decrement("braces"); + } + if (opts.strictSlashes !== true && (prev.type === "star" || prev.type === "bracket")) { + push2({ type: "maybe_slash", value: "", output: `${SLASH_LITERAL2}?` }); + } + if (state.backtrack === true) { + state.output = ""; + for (const token of state.tokens) { + state.output += token.output != null ? token.output : token.value; + if (token.suffix) { + state.output += token.suffix; + } + } + } + return state; + }; + parse$h.fastpaths = (input, options2) => { + const opts = { ...options2 }; + const max = typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH$1, opts.maxLength) : MAX_LENGTH$1; + const len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + input = REPLACEMENTS[input] || input; + const win322 = utils$i.isWindows(options2); + const { + DOT_LITERAL: DOT_LITERAL2, + SLASH_LITERAL: SLASH_LITERAL2, + ONE_CHAR: ONE_CHAR2, + DOTS_SLASH: DOTS_SLASH2, + NO_DOT: NO_DOT2, + NO_DOTS: NO_DOTS2, + NO_DOTS_SLASH: NO_DOTS_SLASH2, + STAR: STAR2, + START_ANCHOR: START_ANCHOR2 + } = constants$5.globChars(win322); + const nodot = opts.dot ? NO_DOTS2 : NO_DOT2; + const slashDot = opts.dot ? NO_DOTS_SLASH2 : NO_DOT2; + const capture = opts.capture ? "" : "?:"; + const state = { negated: false, prefix: "" }; + let star2 = opts.bash === true ? ".*?" : STAR2; + if (opts.capture) { + star2 = `(${star2})`; + } + const globstar = (opts2) => { + if (opts2.noglobstar === true) + return star2; + return `(${capture}(?:(?!${START_ANCHOR2}${opts2.dot ? DOTS_SLASH2 : DOT_LITERAL2}).)*?)`; + }; + const create = (str) => { + switch (str) { + case "*": + return `${nodot}${ONE_CHAR2}${star2}`; + case ".*": + return `${DOT_LITERAL2}${ONE_CHAR2}${star2}`; + case "*.*": + return `${nodot}${star2}${DOT_LITERAL2}${ONE_CHAR2}${star2}`; + case "*/*": + return `${nodot}${star2}${SLASH_LITERAL2}${ONE_CHAR2}${slashDot}${star2}`; + case "**": + return nodot + globstar(opts); + case "**/*": + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL2})?${slashDot}${ONE_CHAR2}${star2}`; + case "**/*.*": + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL2})?${slashDot}${star2}${DOT_LITERAL2}${ONE_CHAR2}${star2}`; + case "**/.*": + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL2})?${DOT_LITERAL2}${ONE_CHAR2}${star2}`; + default: { + const match = /^(.*?)\.(\w+)$/.exec(str); + if (!match) + return; + const source2 = create(match[1]); + if (!source2) + return; + return source2 + DOT_LITERAL2 + match[2]; + } + } + }; + const output = utils$i.removePrefix(input, state); + let source = create(output); + if (source && opts.strictSlashes !== true) { + source += `${SLASH_LITERAL2}?`; + } + return source; + }; + parse_1$3 = parse$h; + path$m = require$$0$4; + scan$1 = scan_1; + parse$g = parse_1$3; + utils$h = utils$k; + constants$4 = constants$6; + isObject$4 = (val) => val && typeof val === "object" && !Array.isArray(val); + picomatch$4 = (glob, options2, returnState = false) => { + if (Array.isArray(glob)) { + const fns = glob.map((input) => picomatch$4(input, options2, returnState)); + const arrayMatcher = (str) => { + for (const isMatch of fns) { + const state2 = isMatch(str); + if (state2) + return state2; + } + return false; + }; + return arrayMatcher; + } + const isState = isObject$4(glob) && glob.tokens && glob.input; + if (glob === "" || typeof glob !== "string" && !isState) { + throw new TypeError("Expected pattern to be a non-empty string"); + } + const opts = options2 || {}; + const posix2 = utils$h.isWindows(options2); + const regex = isState ? picomatch$4.compileRe(glob, options2) : picomatch$4.makeRe(glob, options2, false, true); + const state = regex.state; + delete regex.state; + let isIgnored2 = () => false; + if (opts.ignore) { + const ignoreOpts = { ...options2, ignore: null, onMatch: null, onResult: null }; + isIgnored2 = picomatch$4(opts.ignore, ignoreOpts, returnState); + } + const matcher2 = (input, returnObject = false) => { + const { isMatch, match, output } = picomatch$4.test(input, regex, options2, { glob, posix: posix2 }); + const result = { glob, state, regex, posix: posix2, input, output, match, isMatch }; + if (typeof opts.onResult === "function") { + opts.onResult(result); + } + if (isMatch === false) { + result.isMatch = false; + return returnObject ? result : false; + } + if (isIgnored2(input)) { + if (typeof opts.onIgnore === "function") { + opts.onIgnore(result); + } + result.isMatch = false; + return returnObject ? result : false; + } + if (typeof opts.onMatch === "function") { + opts.onMatch(result); + } + return returnObject ? result : true; + }; + if (returnState) { + matcher2.state = state; + } + return matcher2; + }; + picomatch$4.test = (input, regex, options2, { glob, posix: posix2 } = {}) => { + if (typeof input !== "string") { + throw new TypeError("Expected input to be a string"); + } + if (input === "") { + return { isMatch: false, output: "" }; + } + const opts = options2 || {}; + const format2 = opts.format || (posix2 ? utils$h.toPosixSlashes : null); + let match = input === glob; + let output = match && format2 ? format2(input) : input; + if (match === false) { + output = format2 ? format2(input) : input; + match = output === glob; + } + if (match === false || opts.capture === true) { + if (opts.matchBase === true || opts.basename === true) { + match = picomatch$4.matchBase(input, regex, options2, posix2); + } else { + match = regex.exec(output); + } + } + return { isMatch: Boolean(match), match, output }; + }; + picomatch$4.matchBase = (input, glob, options2, posix2 = utils$h.isWindows(options2)) => { + const regex = glob instanceof RegExp ? glob : picomatch$4.makeRe(glob, options2); + return regex.test(path$m.basename(input)); + }; + picomatch$4.isMatch = (str, patterns2, options2) => picomatch$4(patterns2, options2)(str); + picomatch$4.parse = (pattern2, options2) => { + if (Array.isArray(pattern2)) + return pattern2.map((p) => picomatch$4.parse(p, options2)); + return parse$g(pattern2, { ...options2, fastpaths: false }); + }; + picomatch$4.scan = (input, options2) => scan$1(input, options2); + picomatch$4.compileRe = (state, options2, returnOutput = false, returnState = false) => { + if (returnOutput === true) { + return state.output; + } + const opts = options2 || {}; + const prepend = opts.contains ? "" : "^"; + const append2 = opts.contains ? "" : "$"; + let source = `${prepend}(?:${state.output})${append2}`; + if (state && state.negated === true) { + source = `^(?!${source}).*$`; + } + const regex = picomatch$4.toRegex(source, options2); + if (returnState === true) { + regex.state = state; + } + return regex; + }; + picomatch$4.makeRe = (input, options2 = {}, returnOutput = false, returnState = false) => { + if (!input || typeof input !== "string") { + throw new TypeError("Expected a non-empty string"); + } + let parsed = { negated: false, fastpaths: true }; + if (options2.fastpaths !== false && (input[0] === "." || input[0] === "*")) { + parsed.output = parse$g.fastpaths(input, options2); + } + if (!parsed.output) { + parsed = parse$g(input, options2); + } + return picomatch$4.compileRe(parsed, options2, returnOutput, returnState); + }; + picomatch$4.toRegex = (source, options2) => { + try { + const opts = options2 || {}; + return new RegExp(source, opts.flags || (opts.nocase ? "i" : "")); + } catch (err) { + if (options2 && options2.debug === true) + throw err; + return /$^/; + } + }; + picomatch$4.constants = constants$4; + picomatch_1 = picomatch$4; + (function(module) { + module.exports = picomatch_1; + })(picomatch$5); + reservedWords$1 = "break case class catch const continue debugger default delete do else export extends finally for function if import in instanceof let new return super switch this throw try typeof var void while with yield enum await implements package protected static interface private public"; + builtins$1 = "arguments Infinity NaN undefined null true false eval uneval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Symbol Error EvalError InternalError RangeError ReferenceError SyntaxError TypeError URIError Number Math Date String RegExp Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array Map Set WeakMap WeakSet SIMD ArrayBuffer DataView JSON Promise Generator GeneratorFunction Reflect Proxy Intl"; + forbiddenIdentifiers = new Set(`${reservedWords$1} ${builtins$1}`.split(" ")); + forbiddenIdentifiers.add(""); + old$1 = {}; + pathModule = require$$0$4; + isWindows$6 = process.platform === "win32"; + fs$k = require$$0__default; + DEBUG$1 = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); + if (isWindows$6) { + nextPartRe = /(.*?)(?:[\/\\]+|$)/g; + } else { + nextPartRe = /(.*?)(?:[\/]+|$)/g; + } + if (isWindows$6) { + splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; + } else { + splitRootRe = /^[\/]*/; + } + old$1.realpathSync = function realpathSync(p, cache) { + p = pathModule.resolve(p); + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return cache[p]; + } + var original = p, seenLinks = {}, knownHard = {}; + var pos; + var current2; + var base2; + var previous; + start(); + function start() { + var m = splitRootRe.exec(p); + pos = m[0].length; + current2 = m[0]; + base2 = m[0]; + previous = ""; + if (isWindows$6 && !knownHard[base2]) { + fs$k.lstatSync(base2); + knownHard[base2] = true; + } + } + while (pos < p.length) { + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current2; + current2 += result[0]; + base2 = previous + result[1]; + pos = nextPartRe.lastIndex; + if (knownHard[base2] || cache && cache[base2] === base2) { + continue; + } + var resolvedLink; + if (cache && Object.prototype.hasOwnProperty.call(cache, base2)) { + resolvedLink = cache[base2]; + } else { + var stat2 = fs$k.lstatSync(base2); + if (!stat2.isSymbolicLink()) { + knownHard[base2] = true; + if (cache) + cache[base2] = base2; + continue; + } + var linkTarget = null; + if (!isWindows$6) { + var id = stat2.dev.toString(32) + ":" + stat2.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + linkTarget = seenLinks[id]; + } + } + if (linkTarget === null) { + fs$k.statSync(base2); + linkTarget = fs$k.readlinkSync(base2); + } + resolvedLink = pathModule.resolve(previous, linkTarget); + if (cache) + cache[base2] = resolvedLink; + if (!isWindows$6) + seenLinks[id] = linkTarget; + } + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); + } + if (cache) + cache[original] = p; + return p; + }; + old$1.realpath = function realpath(p, cache, cb) { + if (typeof cb !== "function") { + cb = maybeCallback(cache); + cache = null; + } + p = pathModule.resolve(p); + if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { + return process.nextTick(cb.bind(null, null, cache[p])); + } + var original = p, seenLinks = {}, knownHard = {}; + var pos; + var current2; + var base2; + var previous; + start(); + function start() { + var m = splitRootRe.exec(p); + pos = m[0].length; + current2 = m[0]; + base2 = m[0]; + previous = ""; + if (isWindows$6 && !knownHard[base2]) { + fs$k.lstat(base2, function(err) { + if (err) + return cb(err); + knownHard[base2] = true; + LOOP(); + }); + } else { + process.nextTick(LOOP); + } + } + function LOOP() { + if (pos >= p.length) { + if (cache) + cache[original] = p; + return cb(null, p); + } + nextPartRe.lastIndex = pos; + var result = nextPartRe.exec(p); + previous = current2; + current2 += result[0]; + base2 = previous + result[1]; + pos = nextPartRe.lastIndex; + if (knownHard[base2] || cache && cache[base2] === base2) { + return process.nextTick(LOOP); + } + if (cache && Object.prototype.hasOwnProperty.call(cache, base2)) { + return gotResolvedLink(cache[base2]); + } + return fs$k.lstat(base2, gotStat); + } + function gotStat(err, stat2) { + if (err) + return cb(err); + if (!stat2.isSymbolicLink()) { + knownHard[base2] = true; + if (cache) + cache[base2] = base2; + return process.nextTick(LOOP); + } + if (!isWindows$6) { + var id = stat2.dev.toString(32) + ":" + stat2.ino.toString(32); + if (seenLinks.hasOwnProperty(id)) { + return gotTarget(null, seenLinks[id], base2); + } + } + fs$k.stat(base2, function(err2) { + if (err2) + return cb(err2); + fs$k.readlink(base2, function(err3, target) { + if (!isWindows$6) + seenLinks[id] = target; + gotTarget(err3, target); + }); + }); + } + function gotTarget(err, target, base3) { + if (err) + return cb(err); + var resolvedLink = pathModule.resolve(previous, target); + if (cache) + cache[base3] = resolvedLink; + gotResolvedLink(resolvedLink); + } + function gotResolvedLink(resolvedLink) { + p = pathModule.resolve(resolvedLink, p.slice(pos)); + start(); + } + }; + fs_realpath = realpath$2; + realpath$2.realpath = realpath$2; + realpath$2.sync = realpathSync2; + realpath$2.realpathSync = realpathSync2; + realpath$2.monkeypatch = monkeypatch; + realpath$2.unmonkeypatch = unmonkeypatch; + fs$j = require$$0__default; + origRealpath = fs$j.realpath; + origRealpathSync = fs$j.realpathSync; + version$4 = process.version; + ok = /^v[0-5]\./.test(version$4); + old = old$1; + isWindows$5 = typeof process === "object" && process && process.platform === "win32"; + path$k = isWindows$5 ? { sep: "\\" } : { sep: "/" }; + balancedMatch = balanced$1; + balanced$1.range = range$1; + balanced = balancedMatch; + braceExpansion = expandTop; + escSlash = "\0SLASH" + Math.random() + "\0"; + escOpen = "\0OPEN" + Math.random() + "\0"; + escClose = "\0CLOSE" + Math.random() + "\0"; + escComma = "\0COMMA" + Math.random() + "\0"; + escPeriod = "\0PERIOD" + Math.random() + "\0"; + minimatch$1 = minimatch_1 = (p, pattern2, options2 = {}) => { + assertValidPattern(pattern2); + if (!options2.nocomment && pattern2.charAt(0) === "#") { + return false; + } + return new Minimatch$1(pattern2, options2).match(p); + }; + minimatch_1 = minimatch$1; + path$j = path$k; + minimatch$1.sep = path$j.sep; + GLOBSTAR$2 = Symbol("globstar **"); + minimatch$1.GLOBSTAR = GLOBSTAR$2; + expand$3 = braceExpansion; + plTypes = { + "!": { open: "(?:(?!(?:", close: "))[^/]*?)" }, + "?": { open: "(?:", close: ")?" }, + "+": { open: "(?:", close: ")+" }, + "*": { open: "(?:", close: ")*" }, + "@": { open: "(?:", close: ")" } + }; + qmark = "[^/]"; + star = qmark + "*?"; + twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?"; + twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?"; + charSet = (s) => s.split("").reduce((set2, c) => { + set2[c] = true; + return set2; + }, {}); + reSpecials = charSet("().*{}+?[]^$\\!"); + addPatternStartSet = charSet("[.("); + slashSplit = /\/+/; + minimatch$1.filter = (pattern2, options2 = {}) => (p, i, list) => minimatch$1(p, pattern2, options2); + ext = (a, b = {}) => { + const t = {}; + Object.keys(a).forEach((k) => t[k] = a[k]); + Object.keys(b).forEach((k) => t[k] = b[k]); + return t; + }; + minimatch$1.defaults = (def) => { + if (!def || typeof def !== "object" || !Object.keys(def).length) { + return minimatch$1; + } + const orig = minimatch$1; + const m = (p, pattern2, options2) => orig(p, pattern2, ext(def, options2)); + m.Minimatch = class Minimatch extends orig.Minimatch { + constructor(pattern2, options2) { + super(pattern2, ext(def, options2)); + } + }; + m.Minimatch.defaults = (options2) => orig.defaults(ext(def, options2)).Minimatch; + m.filter = (pattern2, options2) => orig.filter(pattern2, ext(def, options2)); + m.defaults = (options2) => orig.defaults(ext(def, options2)); + m.makeRe = (pattern2, options2) => orig.makeRe(pattern2, ext(def, options2)); + m.braceExpand = (pattern2, options2) => orig.braceExpand(pattern2, ext(def, options2)); + m.match = (list, pattern2, options2) => orig.match(list, pattern2, ext(def, options2)); + return m; + }; + minimatch$1.braceExpand = (pattern2, options2) => braceExpand(pattern2, options2); + braceExpand = (pattern2, options2 = {}) => { + assertValidPattern(pattern2); + if (options2.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern2)) { + return [pattern2]; + } + return expand$3(pattern2); + }; + MAX_PATTERN_LENGTH = 1024 * 64; + assertValidPattern = (pattern2) => { + if (typeof pattern2 !== "string") { + throw new TypeError("invalid pattern"); + } + if (pattern2.length > MAX_PATTERN_LENGTH) { + throw new TypeError("pattern is too long"); + } + }; + SUBPARSE = Symbol("subparse"); + minimatch$1.makeRe = (pattern2, options2) => new Minimatch$1(pattern2, options2 || {}).makeRe(); + minimatch$1.match = (list, pattern2, options2 = {}) => { + const mm = new Minimatch$1(pattern2, options2); + list = list.filter((f) => mm.match(f)); + if (mm.options.nonull && !list.length) { + list.push(pattern2); + } + return list; + }; + globUnescape = (s) => s.replace(/\\(.)/g, "$1"); + regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + Minimatch$1 = class Minimatch { + constructor(pattern2, options2) { + assertValidPattern(pattern2); + if (!options2) + options2 = {}; + this.options = options2; + this.set = []; + this.pattern = pattern2; + this.windowsPathsNoEscape = !!options2.windowsPathsNoEscape || options2.allowWindowsEscape === false; + if (this.windowsPathsNoEscape) { + this.pattern = this.pattern.replace(/\\/g, "/"); + } + this.regexp = null; + this.negate = false; + this.comment = false; + this.empty = false; + this.partial = !!options2.partial; + this.make(); + } + debug() { + } + make() { + const pattern2 = this.pattern; + const options2 = this.options; + if (!options2.nocomment && pattern2.charAt(0) === "#") { + this.comment = true; + return; + } + if (!pattern2) { + this.empty = true; + return; + } + this.parseNegate(); + let set2 = this.globSet = this.braceExpand(); + if (options2.debug) + this.debug = (...args) => console.error(...args); + this.debug(this.pattern, set2); + set2 = this.globParts = set2.map((s) => s.split(slashSplit)); + this.debug(this.pattern, set2); + set2 = set2.map((s, si, set3) => s.map(this.parse, this)); + this.debug(this.pattern, set2); + set2 = set2.filter((s) => s.indexOf(false) === -1); + this.debug(this.pattern, set2); + this.set = set2; + } + parseNegate() { + if (this.options.nonegate) + return; + const pattern2 = this.pattern; + let negate = false; + let negateOffset = 0; + for (let i = 0; i < pattern2.length && pattern2.charAt(i) === "!"; i++) { + negate = !negate; + negateOffset++; + } + if (negateOffset) + this.pattern = pattern2.substr(negateOffset); + this.negate = negate; + } + // set partial to true to test if, for example, + // "/a/b" matches the start of "/*/b/*/d" + // Partial means, if you run out of file before you run + // out of pattern, then that's fine, as long as all + // the parts match. + matchOne(file, pattern2, partial2) { + var options2 = this.options; + this.debug( + "matchOne", + { "this": this, file, pattern: pattern2 } + ); + this.debug("matchOne", file.length, pattern2.length); + for (var fi = 0, pi = 0, fl = file.length, pl = pattern2.length; fi < fl && pi < pl; fi++, pi++) { + this.debug("matchOne loop"); + var p = pattern2[pi]; + var f = file[fi]; + this.debug(pattern2, p, f); + if (p === false) + return false; + if (p === GLOBSTAR$2) { + this.debug("GLOBSTAR", [pattern2, p, f]); + var fr = fi; + var pr = pi + 1; + if (pr === pl) { + this.debug("** at the end"); + for (; fi < fl; fi++) { + if (file[fi] === "." || file[fi] === ".." || !options2.dot && file[fi].charAt(0) === ".") + return false; + } + return true; + } + while (fr < fl) { + var swallowee = file[fr]; + this.debug("\nglobstar while", file, fr, pattern2, pr, swallowee); + if (this.matchOne(file.slice(fr), pattern2.slice(pr), partial2)) { + this.debug("globstar found match!", fr, fl, swallowee); + return true; + } else { + if (swallowee === "." || swallowee === ".." || !options2.dot && swallowee.charAt(0) === ".") { + this.debug("dot detected!", file, fr, pattern2, pr); + break; + } + this.debug("globstar swallow a segment, and continue"); + fr++; + } + } + if (partial2) { + this.debug("\n>>> no match, partial?", file, fr, pattern2, pr); + if (fr === fl) + return true; + } + return false; + } + var hit; + if (typeof p === "string") { + hit = f === p; + this.debug("string match", p, f, hit); + } else { + hit = f.match(p); + this.debug("pattern match", p, f, hit); + } + if (!hit) + return false; + } + if (fi === fl && pi === pl) { + return true; + } else if (fi === fl) { + return partial2; + } else if (pi === pl) { + return fi === fl - 1 && file[fi] === ""; + } + throw new Error("wtf?"); + } + braceExpand() { + return braceExpand(this.pattern, this.options); + } + parse(pattern2, isSub) { + assertValidPattern(pattern2); + const options2 = this.options; + if (pattern2 === "**") { + if (!options2.noglobstar) + return GLOBSTAR$2; + else + pattern2 = "*"; + } + if (pattern2 === "") + return ""; + let re = ""; + let hasMagic = !!options2.nocase; + let escaping = false; + const patternListStack = []; + const negativeLists = []; + let stateChar; + let inClass = false; + let reClassStart = -1; + let classStart = -1; + let cs; + let pl; + let sp; + const patternStart = pattern2.charAt(0) === "." ? "" : options2.dot ? "(?!(?:^|\\/)\\.{1,2}(?:$|\\/))" : "(?!\\.)"; + const clearStateChar = () => { + if (stateChar) { + switch (stateChar) { + case "*": + re += star; + hasMagic = true; + break; + case "?": + re += qmark; + hasMagic = true; + break; + default: + re += "\\" + stateChar; + break; + } + this.debug("clearStateChar %j %j", stateChar, re); + stateChar = false; + } + }; + for (let i = 0, c; i < pattern2.length && (c = pattern2.charAt(i)); i++) { + this.debug("%s %s %s %j", pattern2, i, re, c); + if (escaping) { + if (c === "/") { + return false; + } + if (reSpecials[c]) { + re += "\\"; + } + re += c; + escaping = false; + continue; + } + switch (c) { + case "/": { + return false; + } + case "\\": + clearStateChar(); + escaping = true; + continue; + case "?": + case "*": + case "+": + case "@": + case "!": + this.debug("%s %s %s %j <-- stateChar", pattern2, i, re, c); + if (inClass) { + this.debug(" in class"); + if (c === "!" && i === classStart + 1) + c = "^"; + re += c; + continue; + } + this.debug("call clearStateChar %j", stateChar); + clearStateChar(); + stateChar = c; + if (options2.noext) + clearStateChar(); + continue; + case "(": + if (inClass) { + re += "("; + continue; + } + if (!stateChar) { + re += "\\("; + continue; + } + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }); + re += stateChar === "!" ? "(?:(?!(?:" : "(?:"; + this.debug("plType %j %j", stateChar, re); + stateChar = false; + continue; + case ")": + if (inClass || !patternListStack.length) { + re += "\\)"; + continue; + } + clearStateChar(); + hasMagic = true; + pl = patternListStack.pop(); + re += pl.close; + if (pl.type === "!") { + negativeLists.push(pl); + } + pl.reEnd = re.length; + continue; + case "|": + if (inClass || !patternListStack.length) { + re += "\\|"; + continue; + } + clearStateChar(); + re += "|"; + continue; + case "[": + clearStateChar(); + if (inClass) { + re += "\\" + c; + continue; + } + inClass = true; + classStart = i; + reClassStart = re.length; + re += c; + continue; + case "]": + if (i === classStart + 1 || !inClass) { + re += "\\" + c; + continue; + } + cs = pattern2.substring(classStart + 1, i); + hasMagic = true; + inClass = false; + re += c; + continue; + default: + clearStateChar(); + if (reSpecials[c] && !(c === "^" && inClass)) { + re += "\\"; + } + re += c; + break; + } + } + if (inClass) { + cs = pattern2.substr(classStart + 1); + sp = this.parse(cs, SUBPARSE); + re = re.substr(0, reClassStart) + "\\[" + sp[0]; + hasMagic = hasMagic || sp[1]; + } + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + let tail; + tail = re.slice(pl.reStart + pl.open.length); + this.debug("setting tail", re, pl); + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, (_, $1, $2) => { + if (!$2) { + $2 = "\\"; + } + return $1 + $1 + $2 + "|"; + }); + this.debug("tail=%j\n %s", tail, tail, pl, re); + const t = pl.type === "*" ? star : pl.type === "?" ? qmark : "\\" + pl.type; + hasMagic = true; + re = re.slice(0, pl.reStart) + t + "\\(" + tail; + } + clearStateChar(); + if (escaping) { + re += "\\\\"; + } + const addPatternStart = addPatternStartSet[re.charAt(0)]; + for (let n = negativeLists.length - 1; n > -1; n--) { + const nl = negativeLists[n]; + const nlBefore = re.slice(0, nl.reStart); + const nlFirst = re.slice(nl.reStart, nl.reEnd - 8); + let nlAfter = re.slice(nl.reEnd); + const nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + nlAfter; + const openParensBefore = nlBefore.split("(").length - 1; + let cleanAfter = nlAfter; + for (let i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, ""); + } + nlAfter = cleanAfter; + const dollar = nlAfter === "" && isSub !== SUBPARSE ? "$" : ""; + re = nlBefore + nlFirst + nlAfter + dollar + nlLast; + } + if (re !== "" && hasMagic) { + re = "(?=.)" + re; + } + if (addPatternStart) { + re = patternStart + re; + } + if (isSub === SUBPARSE) { + return [re, hasMagic]; + } + if (!hasMagic) { + return globUnescape(pattern2); + } + const flags = options2.nocase ? "i" : ""; + try { + return Object.assign(new RegExp("^" + re + "$", flags), { + _glob: pattern2, + _src: re + }); + } catch (er) { + return new RegExp("$."); + } + } + makeRe() { + if (this.regexp || this.regexp === false) + return this.regexp; + const set2 = this.set; + if (!set2.length) { + this.regexp = false; + return this.regexp; + } + const options2 = this.options; + const twoStar = options2.noglobstar ? star : options2.dot ? twoStarDot : twoStarNoDot; + const flags = options2.nocase ? "i" : ""; + let re = set2.map((pattern2) => { + pattern2 = pattern2.map( + (p) => typeof p === "string" ? regExpEscape(p) : p === GLOBSTAR$2 ? GLOBSTAR$2 : p._src + ).reduce((set3, p) => { + if (!(set3[set3.length - 1] === GLOBSTAR$2 && p === GLOBSTAR$2)) { + set3.push(p); + } + return set3; + }, []); + pattern2.forEach((p, i) => { + if (p !== GLOBSTAR$2 || pattern2[i - 1] === GLOBSTAR$2) { + return; + } + if (i === 0) { + if (pattern2.length > 1) { + pattern2[i + 1] = "(?:\\/|" + twoStar + "\\/)?" + pattern2[i + 1]; + } else { + pattern2[i] = twoStar; + } + } else if (i === pattern2.length - 1) { + pattern2[i - 1] += "(?:\\/|" + twoStar + ")?"; + } else { + pattern2[i - 1] += "(?:\\/|\\/" + twoStar + "\\/)" + pattern2[i + 1]; + pattern2[i + 1] = GLOBSTAR$2; + } + }); + return pattern2.filter((p) => p !== GLOBSTAR$2).join("/"); + }).join("|"); + re = "^(?:" + re + ")$"; + if (this.negate) + re = "^(?!" + re + ").*$"; + try { + this.regexp = new RegExp(re, flags); + } catch (ex) { + this.regexp = false; + } + return this.regexp; + } + match(f, partial2 = this.partial) { + this.debug("match", f, this.pattern); + if (this.comment) + return false; + if (this.empty) + return f === ""; + if (f === "/" && partial2) + return true; + const options2 = this.options; + if (path$j.sep !== "/") { + f = f.split(path$j.sep).join("/"); + } + f = f.split(slashSplit); + this.debug(this.pattern, "split", f); + const set2 = this.set; + this.debug(this.pattern, "set", set2); + let filename; + for (let i = f.length - 1; i >= 0; i--) { + filename = f[i]; + if (filename) + break; + } + for (let i = 0; i < set2.length; i++) { + const pattern2 = set2[i]; + let file = f; + if (options2.matchBase && pattern2.length === 1) { + file = [filename]; + } + const hit = this.matchOne(file, pattern2, partial2); + if (hit) { + if (options2.flipNegate) + return true; + return !this.negate; + } + } + if (options2.flipNegate) + return false; + return this.negate; + } + static defaults(def) { + return minimatch$1.defaults(def).Minimatch; + } + }; + minimatch$1.Minimatch = Minimatch$1; + inheritsExports = {}; + inherits = { + get exports() { + return inheritsExports; + }, + set exports(v) { + inheritsExports = v; + } + }; + inherits_browserExports = {}; + inherits_browser = { + get exports() { + return inherits_browserExports; + }, + set exports(v) { + inherits_browserExports = v; + } + }; + (function(module) { + try { + var util2 = require2("util"); + if (typeof util2.inherits !== "function") + throw ""; + module.exports = util2.inherits; + } catch (e) { + module.exports = requireInherits_browser(); + } + })(inherits); + common$c = {}; + common$c.setopts = setopts; + common$c.ownProp = ownProp; + common$c.makeAbs = makeAbs; + common$c.finish = finish; + common$c.mark = mark; + common$c.isIgnored = isIgnored; + common$c.childrenIgnored = childrenIgnored; + fs$i = require$$0__default; + path$i = require$$0$4; + minimatch = minimatch_1; + isAbsolute = require$$0$4.isAbsolute; + Minimatch2 = minimatch.Minimatch; + wrappy_1 = wrappy$2; + onceExports = {}; + once$2 = { + get exports() { + return onceExports; + }, + set exports(v) { + onceExports = v; + } + }; + wrappy$1 = wrappy_1; + once$2.exports = wrappy$1(once$1); + onceExports.strict = wrappy$1(onceStrict); + once$1.proto = once$1(function() { + Object.defineProperty(Function.prototype, "once", { + value: function() { + return once$1(this); + }, + configurable: true + }); + Object.defineProperty(Function.prototype, "onceStrict", { + value: function() { + return onceStrict(this); + }, + configurable: true + }); + }); + wrappy = wrappy_1; + reqs = /* @__PURE__ */ Object.create(null); + once = onceExports; + inflight_1 = wrappy(inflight); + globExports = requireGlob(); + comma = ",".charCodeAt(0); + semicolon = ";".charCodeAt(0); + chars$1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + intToChar = new Uint8Array(64); + charToInt = new Uint8Array(128); + for (let i = 0; i < chars$1.length; i++) { + const c = chars$1.charCodeAt(i); + intToChar[i] = c; + charToInt[c] = i; + } + td = typeof TextDecoder !== "undefined" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== "undefined" ? { + decode(buf) { + const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength); + return out.toString(); + } + } : { + decode(buf) { + let out = ""; + for (let i = 0; i < buf.length; i++) { + out += String.fromCharCode(buf[i]); + } + return out; + } + }; + (function(UrlType2) { + UrlType2[UrlType2["Empty"] = 1] = "Empty"; + UrlType2[UrlType2["Hash"] = 2] = "Hash"; + UrlType2[UrlType2["Query"] = 3] = "Query"; + UrlType2[UrlType2["RelativePath"] = 4] = "RelativePath"; + UrlType2[UrlType2["AbsolutePath"] = 5] = "AbsolutePath"; + UrlType2[UrlType2["SchemeRelative"] = 6] = "SchemeRelative"; + UrlType2[UrlType2["Absolute"] = 7] = "Absolute"; + })(UrlType || (UrlType = {})); + COLUMN = 0; + SOURCES_INDEX = 1; + SOURCE_LINE = 2; + SOURCE_COLUMN = 3; + NAMES_INDEX = 4; + found = false; + LINE_GTR_ZERO = "`line` must be greater than 0 (lines start at line 1)"; + COL_GTR_EQ_ZERO = "`column` must be greater than or equal to 0 (columns start at column 0)"; + LEAST_UPPER_BOUND = -1; + GREATEST_LOWER_BOUND = 1; + (() => { + decodedMappings = (map2) => { + return map2._decoded || (map2._decoded = decode(map2._encoded)); + }; + traceSegment = (map2, line, column) => { + const decoded = decodedMappings(map2); + if (line >= decoded.length) + return null; + const segments = decoded[line]; + const index = traceSegmentInternal(segments, map2._decodedMemo, line, column, GREATEST_LOWER_BOUND); + return index === -1 ? null : segments[index]; + }; + originalPositionFor$1 = (map2, { line, column, bias }) => { + line--; + if (line < 0) + throw new Error(LINE_GTR_ZERO); + if (column < 0) + throw new Error(COL_GTR_EQ_ZERO); + const decoded = decodedMappings(map2); + if (line >= decoded.length) + return OMapping(null, null, null, null); + const segments = decoded[line]; + const index = traceSegmentInternal(segments, map2._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND); + if (index === -1) + return OMapping(null, null, null, null); + const segment = segments[index]; + if (segment.length === 1) + return OMapping(null, null, null, null); + const { names, resolvedSources } = map2; + return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null); + }; + })(); + (() => { + get = (strarr, key) => strarr._indexes[key]; + put = (strarr, key) => { + const index = get(strarr, key); + if (index !== void 0) + return index; + const { array: array2, _indexes: indexes } = strarr; + return indexes[key] = array2.push(key) - 1; + }; + })(); + (() => { + addSegment = (map2, genLine, genColumn, source, sourceLine, sourceColumn, name2) => { + const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names } = map2; + const line = getLine(mappings, genLine); + if (source == null) { + const seg2 = [genColumn]; + const index2 = getColumnIndex(line, genColumn, seg2); + return insert(line, index2, seg2); + } + const sourcesIndex = put(sources, source); + const seg = name2 ? [genColumn, sourcesIndex, sourceLine, sourceColumn, put(names, name2)] : [genColumn, sourcesIndex, sourceLine, sourceColumn]; + const index = getColumnIndex(line, genColumn, seg); + if (sourcesIndex === sourcesContent.length) + sourcesContent[sourcesIndex] = null; + insert(line, index, seg); + }; + setSourceContent = (map2, source, content) => { + const { _sources: sources, _sourcesContent: sourcesContent } = map2; + sourcesContent[put(sources, source)] = content; + }; + decodedMap = (map2) => { + const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names } = map2; + return { + version: 3, + file, + names: names.array, + sourceRoot: sourceRoot || void 0, + sources: sources.array, + sourcesContent, + mappings + }; + }; + encodedMap = (map2) => { + const decoded = decodedMap(map2); + return Object.assign(Object.assign({}, decoded), { mappings: encode$1(decoded.mappings) }); + }; + })(); + srcExports$1 = {}; + src$2 = { + get exports() { + return srcExports$1; + }, + set exports(v) { + srcExports$1 = v; + } + }; + browserExports$1 = {}; + browser$2 = { + get exports() { + return browserExports$1; + }, + set exports(v) { + browserExports$1 = v; + } + }; + nodeExports$1 = {}; + node$1 = { + get exports() { + return nodeExports$1; + }, + set exports(v) { + nodeExports$1 = v; + } + }; + (function(module) { + if (typeof process === "undefined" || process.type === "renderer" || process.browser === true || process.__nwjs) { + module.exports = requireBrowser$1(); + } else { + module.exports = requireNode$1(); + } + })(src$2); + _debug = /* @__PURE__ */ getDefaultExportFromCjs(srcExports$1); + builtins = /* @__PURE__ */ new Set([ + ...builtinModules, + "assert/strict", + "diagnostics_channel", + "dns/promises", + "fs/promises", + "path/posix", + "path/win32", + "readline/promises", + "stream/consumers", + "stream/promises", + "stream/web", + "timers/promises", + "util/types", + "wasi" + ]); + _require$3 = createRequire$1(__vite_injected_original_import_meta_url2); + try { + isRunningWithYarnPnp = Boolean(_require$3("pnpapi")); + } catch { + } + filter = process.env.VITE_DEBUG_FILTER; + DEBUG = process.env.DEBUG; + isCaseInsensitiveFS = testCaseInsensitiveFS(); + isWindows$4 = os$3.platform() === "win32"; + externalRE = /^(https?:)?\/\//; + isExternalUrl = (url2) => externalRE.test(url2); + dataUrlRE = /^\s*data:/i; + isDataUrl = (url2) => dataUrlRE.test(url2); + internalPrefixes = [ + FS_PREFIX, + VALID_ID_PREFIX, + CLIENT_PUBLIC_PATH, + ENV_PUBLIC_PATH + ]; + InternalPrefixRE = new RegExp(`^(?:${internalPrefixes.join("|")})`); + removeDir = isWindows$4 ? promisify$4(gracefulRemoveDir) : function removeDirSync(dir) { + if (fs$l.existsSync(dir)) { + fs$l.rmSync(dir, { recursive: true, force: true }); + } + }; + renameDir = isWindows$4 ? promisify$4(gracefulRename) : fs$l.renameSync; + escapedSpaceCharacters = /( |\\t|\\n|\\f|\\r)+/g; + imageSetUrlRE = /^(?:[\w\-]+\(.*?\)|'.*?'|".*?"|\S*)/; + usingDynamicImport = typeof jest === "undefined"; + dynamicImport = usingDynamicImport ? new Function("file", "return import(file)") : _require$3; + blankReplacer = (match) => " ".repeat(match.length); + requireResolveFromRootWithFallback = (root, id) => { + var _a, _b; + const paths = ((_b = (_a = _require$3.resolve).paths) == null ? void 0 : _b.call(_a, id)) || []; + paths.unshift(root); + resolve$4.sync(id, { basedir: root, paths }); + return _require$3.resolve(id, { paths }); + }; + GRACEFUL_RENAME_TIMEOUT = 5e3; + GRACEFUL_REMOVE_DIR_TIMEOUT = 5e3; + groups = [ + { name: "Assets", color: picocolorsExports.green }, + { name: "CSS", color: picocolorsExports.magenta }, + { name: "JS", color: picocolorsExports.cyan } + ]; + singleComment = Symbol("singleComment"); + multiComment = Symbol("multiComment"); + POSIX_SEP_RE = new RegExp("\\" + require$$0$4.posix.sep, "g"); + NATIVE_SEP_RE = new RegExp("\\" + require$$0$4.sep, "g"); + DEFAULT_EXTENSIONS2 = [".ts", ".tsx", ".mts", ".cts"]; + DEFAULT_EXTENSIONS_RE_GROUP = `\\.(?:${DEFAULT_EXTENSIONS2.map((ext2) => ext2.substring(1)).join( + "|" + )})`; + new Function("path", "return import(path).then(m => m.default)"); + debug$f = createDebugger("vite:esbuild"); + dist$1 = {}; + __importDefault = commonjsGlobal && commonjsGlobal.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { "default": mod }; + }; + Object.defineProperty(dist$1, "__esModule", { value: true }); + Worker_1 = dist$1.Worker = void 0; + os_1 = __importDefault(require$$2); + worker_threads_1 = require$$1; + Worker = class { + constructor(fn, options2 = {}) { + this.code = genWorkerCode(fn); + this.max = options2.max || Math.max(1, os_1.default.cpus().length - 1); + this.pool = []; + this.idlePool = []; + this.queue = []; + } + async run(...args) { + const worker = await this._getAvailableWorker(); + return new Promise((resolve3, reject) => { + worker.currentResolve = resolve3; + worker.currentReject = reject; + worker.postMessage(args); + }); + } + stop() { + this.pool.forEach((w) => w.unref()); + this.queue.forEach(([_, reject]) => reject(new Error("Main worker pool stopped before a worker was available."))); + this.pool = []; + this.idlePool = []; + this.queue = []; + } + async _getAvailableWorker() { + if (this.idlePool.length) { + return this.idlePool.shift(); + } + if (this.pool.length < this.max) { + const worker = new worker_threads_1.Worker(this.code, { eval: true }); + worker.on("message", (res) => { + worker.currentResolve && worker.currentResolve(res); + worker.currentResolve = null; + this._assignDoneWorker(worker); + }); + worker.on("error", (err) => { + worker.currentReject && worker.currentReject(err); + worker.currentReject = null; + }); + worker.on("exit", (code) => { + const i = this.pool.indexOf(worker); + if (i > -1) + this.pool.splice(i, 1); + if (code !== 0 && worker.currentReject) { + worker.currentReject(new Error(`Wroker stopped with non-0 exit code ${code}`)); + worker.currentReject = null; + } + }); + this.pool.push(worker); + return worker; + } + let resolve3; + let reject; + const onWorkerAvailablePromise = new Promise((r, rj) => { + resolve3 = r; + reject = rj; + }); + this.queue.push([resolve3, reject]); + return onWorkerAvailablePromise; + } + _assignDoneWorker(worker) { + if (this.queue.length) { + const [resolve3] = this.queue.shift(); + resolve3(worker); + return; + } + this.idlePool.push(worker); + } + }; + Worker_1 = dist$1.Worker = Worker; + isArray$1 = Array.isArray || function(x) { + return {}.toString.call(x) === "[object Array]"; + }; + BitSet = class { + constructor(arg) { + this.bits = arg instanceof BitSet ? arg.bits.slice() : []; + } + add(n) { + this.bits[n >> 5] |= 1 << (n & 31); + } + has(n) { + return !!(this.bits[n >> 5] & 1 << (n & 31)); + } + }; + Chunk = class { + constructor(start, end, content) { + this.start = start; + this.end = end; + this.original = content; + this.intro = ""; + this.outro = ""; + this.content = content; + this.storeName = false; + this.edited = false; + { + this.previous = null; + this.next = null; + } + } + appendLeft(content) { + this.outro += content; + } + appendRight(content) { + this.intro = this.intro + content; + } + clone() { + const chunk = new Chunk(this.start, this.end, this.original); + chunk.intro = this.intro; + chunk.outro = this.outro; + chunk.content = this.content; + chunk.storeName = this.storeName; + chunk.edited = this.edited; + return chunk; + } + contains(index) { + return this.start < index && index < this.end; + } + eachNext(fn) { + let chunk = this; + while (chunk) { + fn(chunk); + chunk = chunk.next; + } + } + eachPrevious(fn) { + let chunk = this; + while (chunk) { + fn(chunk); + chunk = chunk.previous; + } + } + edit(content, storeName, contentOnly) { + this.content = content; + if (!contentOnly) { + this.intro = ""; + this.outro = ""; + } + this.storeName = storeName; + this.edited = true; + return this; + } + prependLeft(content) { + this.outro = content + this.outro; + } + prependRight(content) { + this.intro = content + this.intro; + } + split(index) { + const sliceIndex = index - this.start; + const originalBefore = this.original.slice(0, sliceIndex); + const originalAfter = this.original.slice(sliceIndex); + this.original = originalBefore; + const newChunk = new Chunk(index, this.end, originalAfter); + newChunk.outro = this.outro; + this.outro = ""; + this.end = index; + if (this.edited) { + newChunk.edit("", false); + this.content = ""; + } else { + this.content = originalBefore; + } + newChunk.next = this.next; + if (newChunk.next) + newChunk.next.previous = newChunk; + newChunk.previous = this; + this.next = newChunk; + return newChunk; + } + toString() { + return this.intro + this.content + this.outro; + } + trimEnd(rx) { + this.outro = this.outro.replace(rx, ""); + if (this.outro.length) + return true; + const trimmed = this.content.replace(rx, ""); + if (trimmed.length) { + if (trimmed !== this.content) { + this.split(this.start + trimmed.length).edit("", void 0, true); + } + return true; + } else { + this.edit("", void 0, true); + this.intro = this.intro.replace(rx, ""); + if (this.intro.length) + return true; + } + } + trimStart(rx) { + this.intro = this.intro.replace(rx, ""); + if (this.intro.length) + return true; + const trimmed = this.content.replace(rx, ""); + if (trimmed.length) { + if (trimmed !== this.content) { + this.split(this.end - trimmed.length); + this.edit("", void 0, true); + } + return true; + } else { + this.edit("", void 0, true); + this.outro = this.outro.replace(rx, ""); + if (this.outro.length) + return true; + } + } + }; + btoa$1 = /* @__PURE__ */ getBtoa(); + SourceMap = class { + constructor(properties) { + this.version = 3; + this.file = properties.file; + this.sources = properties.sources; + this.sourcesContent = properties.sourcesContent; + this.names = properties.names; + this.mappings = encode$1(properties.mappings); + if (typeof properties.x_google_ignoreList !== "undefined") { + this.x_google_ignoreList = properties.x_google_ignoreList; + } + } + toString() { + return JSON.stringify(this); + } + toUrl() { + return "data:application/json;charset=utf-8;base64," + btoa$1(this.toString()); + } + }; + toString$2 = Object.prototype.toString; + Mappings = class { + constructor(hires) { + this.hires = hires; + this.generatedCodeLine = 0; + this.generatedCodeColumn = 0; + this.raw = []; + this.rawSegments = this.raw[this.generatedCodeLine] = []; + this.pending = null; + } + addEdit(sourceIndex, content, loc, nameIndex) { + if (content.length) { + const segment = [this.generatedCodeColumn, sourceIndex, loc.line, loc.column]; + if (nameIndex >= 0) { + segment.push(nameIndex); + } + this.rawSegments.push(segment); + } else if (this.pending) { + this.rawSegments.push(this.pending); + } + this.advance(content); + this.pending = null; + } + addUneditedChunk(sourceIndex, chunk, original, loc, sourcemapLocations) { + let originalCharIndex = chunk.start; + let first2 = true; + while (originalCharIndex < chunk.end) { + if (this.hires || first2 || sourcemapLocations.has(originalCharIndex)) { + this.rawSegments.push([this.generatedCodeColumn, sourceIndex, loc.line, loc.column]); + } + if (original[originalCharIndex] === "\n") { + loc.line += 1; + loc.column = 0; + this.generatedCodeLine += 1; + this.raw[this.generatedCodeLine] = this.rawSegments = []; + this.generatedCodeColumn = 0; + first2 = true; + } else { + loc.column += 1; + this.generatedCodeColumn += 1; + first2 = false; + } + originalCharIndex += 1; + } + this.pending = null; + } + advance(str) { + if (!str) + return; + const lines = str.split("\n"); + if (lines.length > 1) { + for (let i = 0; i < lines.length - 1; i++) { + this.generatedCodeLine++; + this.raw[this.generatedCodeLine] = this.rawSegments = []; + } + this.generatedCodeColumn = 0; + } + this.generatedCodeColumn += lines[lines.length - 1].length; + } + }; + n$1 = "\n"; + warned = { + insertLeft: false, + insertRight: false, + storeName: false + }; + MagicString = class { + constructor(string2, options2 = {}) { + const chunk = new Chunk(0, string2.length, string2); + Object.defineProperties(this, { + original: { writable: true, value: string2 }, + outro: { writable: true, value: "" }, + intro: { writable: true, value: "" }, + firstChunk: { writable: true, value: chunk }, + lastChunk: { writable: true, value: chunk }, + lastSearchedChunk: { writable: true, value: chunk }, + byStart: { writable: true, value: {} }, + byEnd: { writable: true, value: {} }, + filename: { writable: true, value: options2.filename }, + indentExclusionRanges: { writable: true, value: options2.indentExclusionRanges }, + sourcemapLocations: { writable: true, value: new BitSet() }, + storedNames: { writable: true, value: {} }, + indentStr: { writable: true, value: void 0 }, + ignoreList: { writable: true, value: options2.ignoreList } + }); + this.byStart[0] = chunk; + this.byEnd[string2.length] = chunk; + } + addSourcemapLocation(char) { + this.sourcemapLocations.add(char); + } + append(content) { + if (typeof content !== "string") + throw new TypeError("outro content must be a string"); + this.outro += content; + return this; + } + appendLeft(index, content) { + if (typeof content !== "string") + throw new TypeError("inserted content must be a string"); + this._split(index); + const chunk = this.byEnd[index]; + if (chunk) { + chunk.appendLeft(content); + } else { + this.intro += content; + } + return this; + } + appendRight(index, content) { + if (typeof content !== "string") + throw new TypeError("inserted content must be a string"); + this._split(index); + const chunk = this.byStart[index]; + if (chunk) { + chunk.appendRight(content); + } else { + this.outro += content; + } + return this; + } + clone() { + const cloned = new MagicString(this.original, { filename: this.filename }); + let originalChunk = this.firstChunk; + let clonedChunk = cloned.firstChunk = cloned.lastSearchedChunk = originalChunk.clone(); + while (originalChunk) { + cloned.byStart[clonedChunk.start] = clonedChunk; + cloned.byEnd[clonedChunk.end] = clonedChunk; + const nextOriginalChunk = originalChunk.next; + const nextClonedChunk = nextOriginalChunk && nextOriginalChunk.clone(); + if (nextClonedChunk) { + clonedChunk.next = nextClonedChunk; + nextClonedChunk.previous = clonedChunk; + clonedChunk = nextClonedChunk; + } + originalChunk = nextOriginalChunk; + } + cloned.lastChunk = clonedChunk; + if (this.indentExclusionRanges) { + cloned.indentExclusionRanges = this.indentExclusionRanges.slice(); + } + cloned.sourcemapLocations = new BitSet(this.sourcemapLocations); + cloned.intro = this.intro; + cloned.outro = this.outro; + return cloned; + } + generateDecodedMap(options2) { + options2 = options2 || {}; + const sourceIndex = 0; + const names = Object.keys(this.storedNames); + const mappings = new Mappings(options2.hires); + const locate = getLocator(this.original); + if (this.intro) { + mappings.advance(this.intro); + } + this.firstChunk.eachNext((chunk) => { + const loc = locate(chunk.start); + if (chunk.intro.length) + mappings.advance(chunk.intro); + if (chunk.edited) { + mappings.addEdit( + sourceIndex, + chunk.content, + loc, + chunk.storeName ? names.indexOf(chunk.original) : -1 + ); + } else { + mappings.addUneditedChunk(sourceIndex, chunk, this.original, loc, this.sourcemapLocations); + } + if (chunk.outro.length) + mappings.advance(chunk.outro); + }); + return { + file: options2.file ? options2.file.split(/[/\\]/).pop() : void 0, + sources: [options2.source ? getRelativePath(options2.file || "", options2.source) : options2.file || ""], + sourcesContent: options2.includeContent ? [this.original] : void 0, + names, + mappings: mappings.raw, + x_google_ignoreList: this.ignoreList ? [sourceIndex] : void 0 + }; + } + generateMap(options2) { + return new SourceMap(this.generateDecodedMap(options2)); + } + _ensureindentStr() { + if (this.indentStr === void 0) { + this.indentStr = guessIndent(this.original); + } + } + _getRawIndentString() { + this._ensureindentStr(); + return this.indentStr; + } + getIndentString() { + this._ensureindentStr(); + return this.indentStr === null ? " " : this.indentStr; + } + indent(indentStr, options2) { + const pattern2 = /^[^\r\n]/gm; + if (isObject$1(indentStr)) { + options2 = indentStr; + indentStr = void 0; + } + if (indentStr === void 0) { + this._ensureindentStr(); + indentStr = this.indentStr || " "; + } + if (indentStr === "") + return this; + options2 = options2 || {}; + const isExcluded = {}; + if (options2.exclude) { + const exclusions = typeof options2.exclude[0] === "number" ? [options2.exclude] : options2.exclude; + exclusions.forEach((exclusion) => { + for (let i = exclusion[0]; i < exclusion[1]; i += 1) { + isExcluded[i] = true; + } + }); + } + let shouldIndentNextCharacter = options2.indentStart !== false; + const replacer = (match) => { + if (shouldIndentNextCharacter) + return `${indentStr}${match}`; + shouldIndentNextCharacter = true; + return match; + }; + this.intro = this.intro.replace(pattern2, replacer); + let charIndex = 0; + let chunk = this.firstChunk; + while (chunk) { + const end = chunk.end; + if (chunk.edited) { + if (!isExcluded[charIndex]) { + chunk.content = chunk.content.replace(pattern2, replacer); + if (chunk.content.length) { + shouldIndentNextCharacter = chunk.content[chunk.content.length - 1] === "\n"; + } + } + } else { + charIndex = chunk.start; + while (charIndex < end) { + if (!isExcluded[charIndex]) { + const char = this.original[charIndex]; + if (char === "\n") { + shouldIndentNextCharacter = true; + } else if (char !== "\r" && shouldIndentNextCharacter) { + shouldIndentNextCharacter = false; + if (charIndex === chunk.start) { + chunk.prependRight(indentStr); + } else { + this._splitChunk(chunk, charIndex); + chunk = chunk.next; + chunk.prependRight(indentStr); + } + } + } + charIndex += 1; + } + } + charIndex = chunk.end; + chunk = chunk.next; + } + this.outro = this.outro.replace(pattern2, replacer); + return this; + } + insert() { + throw new Error( + "magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)" + ); + } + insertLeft(index, content) { + if (!warned.insertLeft) { + console.warn( + "magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead" + ); + warned.insertLeft = true; + } + return this.appendLeft(index, content); + } + insertRight(index, content) { + if (!warned.insertRight) { + console.warn( + "magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead" + ); + warned.insertRight = true; + } + return this.prependRight(index, content); + } + move(start, end, index) { + if (index >= start && index <= end) + throw new Error("Cannot move a selection inside itself"); + this._split(start); + this._split(end); + this._split(index); + const first2 = this.byStart[start]; + const last = this.byEnd[end]; + const oldLeft = first2.previous; + const oldRight = last.next; + const newRight = this.byStart[index]; + if (!newRight && last === this.lastChunk) + return this; + const newLeft = newRight ? newRight.previous : this.lastChunk; + if (oldLeft) + oldLeft.next = oldRight; + if (oldRight) + oldRight.previous = oldLeft; + if (newLeft) + newLeft.next = first2; + if (newRight) + newRight.previous = last; + if (!first2.previous) + this.firstChunk = last.next; + if (!last.next) { + this.lastChunk = first2.previous; + this.lastChunk.next = null; + } + first2.previous = newLeft; + last.next = newRight || null; + if (!newLeft) + this.firstChunk = first2; + if (!newRight) + this.lastChunk = last; + return this; + } + overwrite(start, end, content, options2) { + options2 = options2 || {}; + return this.update(start, end, content, { ...options2, overwrite: !options2.contentOnly }); + } + update(start, end, content, options2) { + if (typeof content !== "string") + throw new TypeError("replacement content must be a string"); + while (start < 0) + start += this.original.length; + while (end < 0) + end += this.original.length; + if (end > this.original.length) + throw new Error("end is out of bounds"); + if (start === end) + throw new Error( + "Cannot overwrite a zero-length range \u2013 use appendLeft or prependRight instead" + ); + this._split(start); + this._split(end); + if (options2 === true) { + if (!warned.storeName) { + console.warn( + "The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string" + ); + warned.storeName = true; + } + options2 = { storeName: true }; + } + const storeName = options2 !== void 0 ? options2.storeName : false; + const overwrite = options2 !== void 0 ? options2.overwrite : false; + if (storeName) { + const original = this.original.slice(start, end); + Object.defineProperty(this.storedNames, original, { + writable: true, + value: true, + enumerable: true + }); + } + const first2 = this.byStart[start]; + const last = this.byEnd[end]; + if (first2) { + let chunk = first2; + while (chunk !== last) { + if (chunk.next !== this.byStart[chunk.end]) { + throw new Error("Cannot overwrite across a split point"); + } + chunk = chunk.next; + chunk.edit("", false); + } + first2.edit(content, storeName, !overwrite); + } else { + const newChunk = new Chunk(start, end, "").edit(content, storeName); + last.next = newChunk; + newChunk.previous = last; + } + return this; + } + prepend(content) { + if (typeof content !== "string") + throw new TypeError("outro content must be a string"); + this.intro = content + this.intro; + return this; + } + prependLeft(index, content) { + if (typeof content !== "string") + throw new TypeError("inserted content must be a string"); + this._split(index); + const chunk = this.byEnd[index]; + if (chunk) { + chunk.prependLeft(content); + } else { + this.intro = content + this.intro; + } + return this; + } + prependRight(index, content) { + if (typeof content !== "string") + throw new TypeError("inserted content must be a string"); + this._split(index); + const chunk = this.byStart[index]; + if (chunk) { + chunk.prependRight(content); + } else { + this.outro = content + this.outro; + } + return this; + } + remove(start, end) { + while (start < 0) + start += this.original.length; + while (end < 0) + end += this.original.length; + if (start === end) + return this; + if (start < 0 || end > this.original.length) + throw new Error("Character is out of bounds"); + if (start > end) + throw new Error("end must be greater than start"); + this._split(start); + this._split(end); + let chunk = this.byStart[start]; + while (chunk) { + chunk.intro = ""; + chunk.outro = ""; + chunk.edit(""); + chunk = end > chunk.end ? this.byStart[chunk.end] : null; + } + return this; + } + lastChar() { + if (this.outro.length) + return this.outro[this.outro.length - 1]; + let chunk = this.lastChunk; + do { + if (chunk.outro.length) + return chunk.outro[chunk.outro.length - 1]; + if (chunk.content.length) + return chunk.content[chunk.content.length - 1]; + if (chunk.intro.length) + return chunk.intro[chunk.intro.length - 1]; + } while (chunk = chunk.previous); + if (this.intro.length) + return this.intro[this.intro.length - 1]; + return ""; + } + lastLine() { + let lineIndex = this.outro.lastIndexOf(n$1); + if (lineIndex !== -1) + return this.outro.substr(lineIndex + 1); + let lineStr = this.outro; + let chunk = this.lastChunk; + do { + if (chunk.outro.length > 0) { + lineIndex = chunk.outro.lastIndexOf(n$1); + if (lineIndex !== -1) + return chunk.outro.substr(lineIndex + 1) + lineStr; + lineStr = chunk.outro + lineStr; + } + if (chunk.content.length > 0) { + lineIndex = chunk.content.lastIndexOf(n$1); + if (lineIndex !== -1) + return chunk.content.substr(lineIndex + 1) + lineStr; + lineStr = chunk.content + lineStr; + } + if (chunk.intro.length > 0) { + lineIndex = chunk.intro.lastIndexOf(n$1); + if (lineIndex !== -1) + return chunk.intro.substr(lineIndex + 1) + lineStr; + lineStr = chunk.intro + lineStr; + } + } while (chunk = chunk.previous); + lineIndex = this.intro.lastIndexOf(n$1); + if (lineIndex !== -1) + return this.intro.substr(lineIndex + 1) + lineStr; + return this.intro + lineStr; + } + slice(start = 0, end = this.original.length) { + while (start < 0) + start += this.original.length; + while (end < 0) + end += this.original.length; + let result = ""; + let chunk = this.firstChunk; + while (chunk && (chunk.start > start || chunk.end <= start)) { + if (chunk.start < end && chunk.end >= end) { + return result; + } + chunk = chunk.next; + } + if (chunk && chunk.edited && chunk.start !== start) + throw new Error(`Cannot use replaced character ${start} as slice start anchor.`); + const startChunk = chunk; + while (chunk) { + if (chunk.intro && (startChunk !== chunk || chunk.start === start)) { + result += chunk.intro; + } + const containsEnd = chunk.start < end && chunk.end >= end; + if (containsEnd && chunk.edited && chunk.end !== end) + throw new Error(`Cannot use replaced character ${end} as slice end anchor.`); + const sliceStart = startChunk === chunk ? start - chunk.start : 0; + const sliceEnd = containsEnd ? chunk.content.length + end - chunk.end : chunk.content.length; + result += chunk.content.slice(sliceStart, sliceEnd); + if (chunk.outro && (!containsEnd || chunk.end === end)) { + result += chunk.outro; + } + if (containsEnd) { + break; + } + chunk = chunk.next; + } + return result; + } + // TODO deprecate this? not really very useful + snip(start, end) { + const clone = this.clone(); + clone.remove(0, start); + clone.remove(end, clone.original.length); + return clone; + } + _split(index) { + if (this.byStart[index] || this.byEnd[index]) + return; + let chunk = this.lastSearchedChunk; + const searchForward = index > chunk.end; + while (chunk) { + if (chunk.contains(index)) + return this._splitChunk(chunk, index); + chunk = searchForward ? this.byStart[chunk.end] : this.byEnd[chunk.start]; + } + } + _splitChunk(chunk, index) { + if (chunk.edited && chunk.content.length) { + const loc = getLocator(this.original)(index); + throw new Error( + `Cannot split a chunk that has already been edited (${loc.line}:${loc.column} \u2013 "${chunk.original}")` + ); + } + const newChunk = chunk.split(index); + this.byEnd[index] = chunk; + this.byStart[index] = newChunk; + this.byEnd[newChunk.end] = newChunk; + if (chunk === this.lastChunk) + this.lastChunk = newChunk; + this.lastSearchedChunk = chunk; + return true; + } + toString() { + let str = this.intro; + let chunk = this.firstChunk; + while (chunk) { + str += chunk.toString(); + chunk = chunk.next; + } + return str + this.outro; + } + isEmpty() { + let chunk = this.firstChunk; + do { + if (chunk.intro.length && chunk.intro.trim() || chunk.content.length && chunk.content.trim() || chunk.outro.length && chunk.outro.trim()) + return false; + } while (chunk = chunk.next); + return true; + } + length() { + let chunk = this.firstChunk; + let length = 0; + do { + length += chunk.intro.length + chunk.content.length + chunk.outro.length; + } while (chunk = chunk.next); + return length; + } + trimLines() { + return this.trim("[\\r\\n]"); + } + trim(charType) { + return this.trimStart(charType).trimEnd(charType); + } + trimEndAborted(charType) { + const rx = new RegExp((charType || "\\s") + "+$"); + this.outro = this.outro.replace(rx, ""); + if (this.outro.length) + return true; + let chunk = this.lastChunk; + do { + const end = chunk.end; + const aborted = chunk.trimEnd(rx); + if (chunk.end !== end) { + if (this.lastChunk === chunk) { + this.lastChunk = chunk.next; + } + this.byEnd[chunk.end] = chunk; + this.byStart[chunk.next.start] = chunk.next; + this.byEnd[chunk.next.end] = chunk.next; + } + if (aborted) + return true; + chunk = chunk.previous; + } while (chunk); + return false; + } + trimEnd(charType) { + this.trimEndAborted(charType); + return this; + } + trimStartAborted(charType) { + const rx = new RegExp("^" + (charType || "\\s") + "+"); + this.intro = this.intro.replace(rx, ""); + if (this.intro.length) + return true; + let chunk = this.firstChunk; + do { + const end = chunk.end; + const aborted = chunk.trimStart(rx); + if (chunk.end !== end) { + if (chunk === this.lastChunk) + this.lastChunk = chunk.next; + this.byEnd[chunk.end] = chunk; + this.byStart[chunk.next.start] = chunk.next; + this.byEnd[chunk.next.end] = chunk.next; + } + if (aborted) + return true; + chunk = chunk.next; + } while (chunk); + return false; + } + trimStart(charType) { + this.trimStartAborted(charType); + return this; + } + hasChanged() { + return this.original !== this.toString(); + } + _replaceRegexp(searchValue, replacement) { + function getReplacement(match, str) { + if (typeof replacement === "string") { + return replacement.replace(/\$(\$|&|\d+)/g, (_, i) => { + if (i === "$") + return "$"; + if (i === "&") + return match[0]; + const num = +i; + if (num < match.length) + return match[+i]; + return `$${i}`; + }); + } else { + return replacement(...match, match.index, str, match.groups); + } + } + function matchAll(re, str) { + let match; + const matches = []; + while (match = re.exec(str)) { + matches.push(match); + } + return matches; + } + if (searchValue.global) { + const matches = matchAll(searchValue, this.original); + matches.forEach((match) => { + if (match.index != null) + this.overwrite( + match.index, + match.index + match[0].length, + getReplacement(match, this.original) + ); + }); + } else { + const match = this.original.match(searchValue); + if (match && match.index != null) + this.overwrite( + match.index, + match.index + match[0].length, + getReplacement(match, this.original) + ); + } + return this; + } + _replaceString(string2, replacement) { + const { original } = this; + const index = original.indexOf(string2); + if (index !== -1) { + this.overwrite(index, index + string2.length, replacement); + } + return this; + } + replace(searchValue, replacement) { + if (typeof searchValue === "string") { + return this._replaceString(searchValue, replacement); + } + return this._replaceRegexp(searchValue, replacement); + } + _replaceAllString(string2, replacement) { + const { original } = this; + const stringLength = string2.length; + for (let index = original.indexOf(string2); index !== -1; index = original.indexOf(string2, index + stringLength)) { + this.overwrite(index, index + stringLength, replacement); + } + return this; + } + replaceAll(searchValue, replacement) { + if (typeof searchValue === "string") { + return this._replaceAllString(searchValue, replacement); + } + if (!searchValue.global) { + throw new TypeError( + "MagicString.prototype.replaceAll called with a non-global RegExp argument" + ); + } + return this._replaceRegexp(searchValue, replacement); + } + }; + GIT_LFS_PREFIX = Buffer$1.from("version https://git-lfs.github.com"); + A = 1 === new Uint8Array(new Uint16Array([1]).buffer)[0]; + init = WebAssembly.compile((E = "AGFzbQEAAAABKghgAX8Bf2AEf39/fwBgAAF/YAAAYAF/AGADf39/AX9gAn9/AX9gAn9/AAMvLgABAQICAgICAgICAgICAgICAgIAAwMDBAQAAAADAAAAAAMDAAUGAAAABwAGAgUEBQFwAQEBBQMBAAEGDwJ/AUGw8gALfwBBsPIACwdwEwZtZW1vcnkCAAJzYQAAAWUAAwJpcwAEAmllAAUCc3MABgJzZQAHAmFpAAgCaWQACQJpcAAKAmVzAAsCZWUADANlbHMADQNlbGUADgJyaQAPAnJlABABZgARBXBhcnNlABILX19oZWFwX2Jhc2UDAQrAOy5oAQF/QQAgADYC9AlBACgC0AkiASAAQQF0aiIAQQA7AQBBACAAQQJqIgA2AvgJQQAgADYC/AlBAEEANgLUCUEAQQA2AuQJQQBBADYC3AlBAEEANgLYCUEAQQA2AuwJQQBBADYC4AkgAQufAQEDf0EAKALkCSEEQQBBACgC/AkiBTYC5AlBACAENgLoCUEAIAVBIGo2AvwJIARBHGpB1AkgBBsgBTYCAEEAKALICSEEQQAoAsQJIQYgBSABNgIAIAUgADYCCCAFIAIgAkECakEAIAYgA0YbIAQgA0YbNgIMIAUgAzYCFCAFQQA2AhAgBSACNgIEIAVBADYCHCAFQQAoAsQJIANGOgAYC1YBAX9BACgC7AkiBEEQakHYCSAEG0EAKAL8CSIENgIAQQAgBDYC7AlBACAEQRRqNgL8CSAEQQA2AhAgBCADNgIMIAQgAjYCCCAEIAE2AgQgBCAANgIACwgAQQAoAoAKCxUAQQAoAtwJKAIAQQAoAtAJa0EBdQseAQF/QQAoAtwJKAIEIgBBACgC0AlrQQF1QX8gABsLFQBBACgC3AkoAghBACgC0AlrQQF1Cx4BAX9BACgC3AkoAgwiAEEAKALQCWtBAXVBfyAAGwseAQF/QQAoAtwJKAIQIgBBACgC0AlrQQF1QX8gABsLOwEBfwJAQQAoAtwJKAIUIgBBACgCxAlHDQBBfw8LAkAgAEEAKALICUcNAEF+DwsgAEEAKALQCWtBAXULCwBBACgC3AktABgLFQBBACgC4AkoAgBBACgC0AlrQQF1CxUAQQAoAuAJKAIEQQAoAtAJa0EBdQseAQF/QQAoAuAJKAIIIgBBACgC0AlrQQF1QX8gABsLHgEBf0EAKALgCSgCDCIAQQAoAtAJa0EBdUF/IAAbCyUBAX9BAEEAKALcCSIAQRxqQdQJIAAbKAIAIgA2AtwJIABBAEcLJQEBf0EAQQAoAuAJIgBBEGpB2AkgABsoAgAiADYC4AkgAEEARwsIAEEALQCECgvmDAEGfyMAQYDQAGsiACQAQQBBAToAhApBAEEAKALMCTYCjApBAEEAKALQCUF+aiIBNgKgCkEAIAFBACgC9AlBAXRqIgI2AqQKQQBBADsBhgpBAEEAOwGICkEAQQA6AJAKQQBBADYCgApBAEEAOgDwCUEAIABBgBBqNgKUCkEAIAA2ApgKQQBBADoAnAoCQAJAAkACQANAQQAgAUECaiIDNgKgCiABIAJPDQECQCADLwEAIgJBd2pBBUkNAAJAAkACQAJAAkAgAkGbf2oOBQEICAgCAAsgAkEgRg0EIAJBL0YNAyACQTtGDQIMBwtBAC8BiAoNASADEBNFDQEgAUEEakGCCEEKEC0NARAUQQAtAIQKDQFBAEEAKAKgCiIBNgKMCgwHCyADEBNFDQAgAUEEakGMCEEKEC0NABAVC0EAQQAoAqAKNgKMCgwBCwJAIAEvAQQiA0EqRg0AIANBL0cNBBAWDAELQQEQFwtBACgCpAohAkEAKAKgCiEBDAALC0EAIQIgAyEBQQAtAPAJDQIMAQtBACABNgKgCkEAQQA6AIQKCwNAQQAgAUECaiIDNgKgCgJAAkACQAJAAkACQAJAAkACQCABQQAoAqQKTw0AIAMvAQAiAkF3akEFSQ0IAkACQAJAAkACQAJAAkACQAJAAkAgAkFgag4KEhEGEREREQUBAgALAkACQAJAAkAgAkGgf2oOCgsUFAMUARQUFAIACyACQYV/ag4DBRMGCQtBAC8BiAoNEiADEBNFDRIgAUEEakGCCEEKEC0NEhAUDBILIAMQE0UNESABQQRqQYwIQQoQLQ0REBUMEQsgAxATRQ0QIAEpAARC7ICEg7COwDlSDRAgAS8BDCIDQXdqIgFBF0sNDkEBIAF0QZ+AgARxRQ0ODA8LQQBBAC8BiAoiAUEBajsBiApBACgClAogAUEDdGoiAUEBNgIAIAFBACgCjAo2AgQMDwtBAC8BiAoiAkUNC0EAIAJBf2oiBDsBiApBAC8BhgoiAkUNDiACQQJ0QQAoApgKakF8aigCACIFKAIUQQAoApQKIARB//8DcUEDdGooAgRHDQ4CQCAFKAIEDQAgBSADNgIEC0EAIAJBf2o7AYYKIAUgAUEEajYCDAwOCwJAQQAoAowKIgEvAQBBKUcNAEEAKALkCSIDRQ0AIAMoAgQgAUcNAEEAQQAoAugJIgM2AuQJAkAgA0UNACADQQA2AhwMAQtBAEEANgLUCQtBAEEALwGICiIDQQFqOwGICkEAKAKUCiADQQN0aiIDQQZBAkEALQCcChs2AgAgAyABNgIEQQBBADoAnAoMDQtBAC8BiAoiAUUNCUEAIAFBf2oiATsBiApBACgClAogAUH//wNxQQN0aigCAEEERg0EDAwLQScQGAwLC0EiEBgMCgsgAkEvRw0JAkACQCABLwEEIgFBKkYNACABQS9HDQEQFgwMC0EBEBcMCwsCQAJAQQAoAowKIgEvAQAiAxAZRQ0AAkACQCADQVVqDgQACAEDCAsgAUF+ai8BAEErRg0GDAcLIAFBfmovAQBBLUYNBQwGCwJAIANB/QBGDQAgA0EpRw0FQQAoApQKQQAvAYgKQQN0aigCBBAaRQ0FDAYLQQAoApQKQQAvAYgKQQN0aiICKAIEEBsNBSACKAIAQQZGDQUMBAsgAUF+ai8BAEFQakH//wNxQQpJDQMMBAtBACgClApBAC8BiAoiAUEDdCIDakEAKAKMCjYCBEEAIAFBAWo7AYgKQQAoApQKIANqQQM2AgALEBwMBwtBAC0A8AlBAC8BhgpBAC8BiApyckUhAgwJCyABEB0NACADRQ0AIANBL0ZBAC0AkApBAEdxDQAgAUF+aiEBQQAoAtAJIQICQANAIAFBAmoiBCACTQ0BQQAgATYCjAogAS8BACEDIAFBfmoiBCEBIAMQHkUNAAsgBEECaiEEC0EBIQUgA0H//wNxEB9FDQEgBEF+aiEBAkADQCABQQJqIgMgAk0NAUEAIAE2AowKIAEvAQAhAyABQX5qIgQhASADEB8NAAsgBEECaiEDCyADECBFDQEQIUEAQQA6AJAKDAULECFBACEFC0EAIAU6AJAKDAMLECJBACECDAULIANBoAFHDQELQQBBAToAnAoLQQBBACgCoAo2AowKC0EAKAKgCiEBDAALCyAAQYDQAGokACACCxoAAkBBACgC0AkgAEcNAEEBDwsgAEF+ahAjC80JAQV/QQBBACgCoAoiAEEMaiIBNgKgCkEAKALsCSECQQEQJyEDAkACQAJAAkACQAJAAkACQAJAAkBBACgCoAoiBCABRw0AIAMQJkUNAQsCQAJAAkACQCADQSpGDQAgA0H7AEcNAUEAIARBAmo2AqAKQQEQJyEEQQAoAqAKIQEDQAJAAkAgBEH//wNxIgNBIkYNACADQSdGDQAgAxAqGkEAKAKgCiEDDAELIAMQGEEAQQAoAqAKQQJqIgM2AqAKC0EBECcaAkAgASADECsiBEEsRw0AQQBBACgCoApBAmo2AqAKQQEQJyEEC0EAKAKgCiEDIARB/QBGDQMgAyABRg0NIAMhASADQQAoAqQKTQ0ADA0LC0EAIARBAmo2AqAKQQEQJxpBACgCoAoiAyADECsaDAILQQBBADoAhAoCQAJAAkACQAJAAkAgA0Gff2oODAIIBAEIAwgICAgIBQALIANB9gBGDQQMBwtBACAEQQ5qIgM2AqAKAkACQAJAQQEQJ0Gff2oOBgAQAhAQARALQQAoAqAKIgEpAAJC84Dkg+CNwDFSDQ8gAS8BChAfRQ0PQQAgAUEKajYCoApBABAnGgtBACgCoAoiAUECakGiCEEOEC0NDiABLwEQIgBBd2oiAkEXSw0LQQEgAnRBn4CABHFFDQsMDAtBACgCoAoiASkAAkLsgISDsI7AOVINDSABLwEKIgBBd2oiAkEXTQ0HDAgLQQAgBEEKajYCoApBABAnGkEAKAKgCiEEC0EAIARBEGo2AqAKAkBBARAnIgRBKkcNAEEAQQAoAqAKQQJqNgKgCkEBECchBAtBACgCoAohAyAEECoaIANBACgCoAoiBCADIAQQAkEAQQAoAqAKQX5qNgKgCg8LAkAgBCkAAkLsgISDsI7AOVINACAELwEKEB5FDQBBACAEQQpqNgKgCkEBECchBEEAKAKgCiEDIAQQKhogA0EAKAKgCiIEIAMgBBACQQBBACgCoApBfmo2AqAKDwtBACAEQQRqIgQ2AqAKC0EAIARBBGoiAzYCoApBAEEAOgCECgJAA0BBACADQQJqNgKgCkEBECchBEEAKAKgCiEDIAQQKkEgckH7AEYNAUEAKAKgCiIEIANGDQQgAyAEIAMgBBACQQEQJ0EsRw0BQQAoAqAKIQMMAAsLQQBBACgCoApBfmo2AqAKDwtBACADQQJqNgKgCgtBARAnIQRBACgCoAohAwJAIARB5gBHDQAgA0ECakGcCEEGEC0NAEEAIANBCGo2AqAKIABBARAnECkgAkEQakHYCSACGyEDA0AgAygCACIDRQ0CIANCADcCCCADQRBqIQMMAAsLQQAgA0F+ajYCoAoLDwtBASACdEGfgIAEcQ0BCyAAQaABRg0AIABB+wBHDQQLQQAgAUEKajYCoApBARAnIgFB+wBGDQMMAgsCQCAAQVhqDgMBAwEACyAAQaABRw0CC0EAIAFBEGo2AqAKAkBBARAnIgFBKkcNAEEAQQAoAqAKQQJqNgKgCkEBECchAQsgAUEoRg0BC0EAKAKgCiECIAEQKhpBACgCoAoiASACTQ0AIAQgAyACIAEQAkEAQQAoAqAKQX5qNgKgCg8LIAQgA0EAQQAQAkEAIARBDGo2AqAKDwsQIgvUBgEEf0EAQQAoAqAKIgBBDGoiATYCoAoCQAJAAkACQAJAAkACQAJAAkACQEEBECciAkFZag4IBAIBBAEBAQMACyACQSJGDQMgAkH7AEYNBAtBACgCoAogAUcNAkEAIABBCmo2AqAKDwtBACgClApBAC8BiAoiAkEDdGoiAUEAKAKgCjYCBEEAIAJBAWo7AYgKIAFBBTYCAEEAKAKMCi8BAEEuRg0DQQBBACgCoAoiAUECajYCoApBARAnIQIgAEEAKAKgCkEAIAEQAUEAQQAvAYYKIgFBAWo7AYYKQQAoApgKIAFBAnRqQQAoAuQJNgIAAkAgAkEiRg0AIAJBJ0YNAEEAQQAoAqAKQX5qNgKgCg8LIAIQGEEAQQAoAqAKQQJqIgI2AqAKAkACQAJAQQEQJ0FXag4EAQICAAILQQBBACgCoApBAmo2AqAKQQEQJxpBACgC5AkiASACNgIEIAFBAToAGCABQQAoAqAKIgI2AhBBACACQX5qNgKgCg8LQQAoAuQJIgEgAjYCBCABQQE6ABhBAEEALwGICkF/ajsBiAogAUEAKAKgCkECajYCDEEAQQAvAYYKQX9qOwGGCg8LQQBBACgCoApBfmo2AqAKDwtBAEEAKAKgCkECajYCoApBARAnQe0ARw0CQQAoAqAKIgJBAmpBlghBBhAtDQICQEEAKAKMCiIBECgNACABLwEAQS5GDQMLIAAgACACQQhqQQAoAsgJEAEPC0EALwGICg0CQQAoAqAKIQJBACgCpAohAwNAIAIgA08NBQJAAkAgAi8BACIBQSdGDQAgAUEiRw0BCyAAIAEQKQ8LQQAgAkECaiICNgKgCgwACwtBACgCoAohAkEALwGICg0CAkADQAJAAkACQCACQQAoAqQKTw0AQQEQJyICQSJGDQEgAkEnRg0BIAJB/QBHDQJBAEEAKAKgCkECajYCoAoLQQEQJyEBQQAoAqAKIQICQCABQeYARw0AIAJBAmpBnAhBBhAtDQgLQQAgAkEIajYCoApBARAnIgJBIkYNAyACQSdGDQMMBwsgAhAYC0EAQQAoAqAKQQJqIgI2AqAKDAALCyAAIAIQKQsPC0EAQQAoAqAKQX5qNgKgCg8LQQAgAkF+ajYCoAoPCxAiC0cBA39BACgCoApBAmohAEEAKAKkCiEBAkADQCAAIgJBfmogAU8NASACQQJqIQAgAi8BAEF2ag4EAQAAAQALC0EAIAI2AqAKC5gBAQN/QQBBACgCoAoiAUECajYCoAogAUEGaiEBQQAoAqQKIQIDQAJAAkACQCABQXxqIAJPDQAgAUF+ai8BACEDAkACQCAADQAgA0EqRg0BIANBdmoOBAIEBAIECyADQSpHDQMLIAEvAQBBL0cNAkEAIAFBfmo2AqAKDAELIAFBfmohAQtBACABNgKgCg8LIAFBAmohAQwACwuIAQEEf0EAKAKgCiEBQQAoAqQKIQICQAJAA0AgASIDQQJqIQEgAyACTw0BIAEvAQAiBCAARg0CAkAgBEHcAEYNACAEQXZqDgQCAQECAQsgA0EEaiEBIAMvAQRBDUcNACADQQZqIAEgAy8BBkEKRhshAQwACwtBACABNgKgChAiDwtBACABNgKgCgtsAQF/AkACQCAAQV9qIgFBBUsNAEEBIAF0QTFxDQELIABBRmpB//8DcUEGSQ0AIABBKUcgAEFYakH//wNxQQdJcQ0AAkAgAEGlf2oOBAEAAAEACyAAQf0ARyAAQYV/akH//wNxQQRJcQ8LQQELLgEBf0EBIQECQCAAQZYJQQUQJA0AIABBoAlBAxAkDQAgAEGmCUECECQhAQsgAQuDAQECf0EBIQECQAJAAkACQAJAAkAgAC8BACICQUVqDgQFBAQBAAsCQCACQZt/ag4EAwQEAgALIAJBKUYNBCACQfkARw0DIABBfmpBsglBBhAkDwsgAEF+ai8BAEE9Rg8LIABBfmpBqglBBBAkDwsgAEF+akG+CUEDECQPC0EAIQELIAEL3gEBBH9BACgCoAohAEEAKAKkCiEBAkACQAJAA0AgACICQQJqIQAgAiABTw0BAkACQAJAIAAvAQAiA0Gkf2oOBQIDAwMBAAsgA0EkRw0CIAIvAQRB+wBHDQJBACACQQRqIgA2AqAKQQBBAC8BiAoiAkEBajsBiApBACgClAogAkEDdGoiAkEENgIAIAIgADYCBA8LQQAgADYCoApBAEEALwGICkF/aiIAOwGICkEAKAKUCiAAQf//A3FBA3RqKAIAQQNHDQMMBAsgAkEEaiEADAALC0EAIAA2AqAKCxAiCwu0AwECf0EAIQECQAJAAkACQAJAAkACQAJAAkACQCAALwEAQZx/ag4UAAECCQkJCQMJCQQFCQkGCQcJCQgJCwJAAkAgAEF+ai8BAEGXf2oOBAAKCgEKCyAAQXxqQboIQQIQJA8LIABBfGpBvghBAxAkDwsCQAJAAkAgAEF+ai8BAEGNf2oOAwABAgoLAkAgAEF8ai8BACICQeEARg0AIAJB7ABHDQogAEF6akHlABAlDwsgAEF6akHjABAlDwsgAEF8akHECEEEECQPCyAAQXxqQcwIQQYQJA8LIABBfmovAQBB7wBHDQYgAEF8ai8BAEHlAEcNBgJAIABBemovAQAiAkHwAEYNACACQeMARw0HIABBeGpB2AhBBhAkDwsgAEF4akHkCEECECQPCyAAQX5qQegIQQQQJA8LQQEhASAAQX5qIgBB6QAQJQ0EIABB8AhBBRAkDwsgAEF+akHkABAlDwsgAEF+akH6CEEHECQPCyAAQX5qQYgJQQQQJA8LAkAgAEF+ai8BACICQe8ARg0AIAJB5QBHDQEgAEF8akHuABAlDwsgAEF8akGQCUEDECQhAQsgAQs0AQF/QQEhAQJAIABBd2pB//8DcUEFSQ0AIABBgAFyQaABRg0AIABBLkcgABAmcSEBCyABCzABAX8CQAJAIABBd2oiAUEXSw0AQQEgAXRBjYCABHENAQsgAEGgAUYNAEEADwtBAQtOAQJ/QQAhAQJAAkAgAC8BACICQeUARg0AIAJB6wBHDQEgAEF+akHoCEEEECQPCyAAQX5qLwEAQfUARw0AIABBfGpBzAhBBhAkIQELIAELcAECfwJAAkADQEEAQQAoAqAKIgBBAmoiATYCoAogAEEAKAKkCk8NAQJAAkACQCABLwEAIgFBpX9qDgIBAgALAkAgAUF2ag4EBAMDBAALIAFBL0cNAgwECxAsGgwBC0EAIABBBGo2AqAKDAALCxAiCws1AQF/QQBBAToA8AlBACgCoAohAEEAQQAoAqQKQQJqNgKgCkEAIABBACgC0AlrQQF1NgKACgtDAQJ/QQEhAQJAIAAvAQAiAkF3akH//wNxQQVJDQAgAkGAAXJBoAFGDQBBACEBIAIQJkUNACACQS5HIAAQKHIPCyABC0YBA39BACEDAkAgACACQQF0IgJrIgRBAmoiAEEAKALQCSIFSQ0AIAAgASACEC0NAAJAIAAgBUcNAEEBDwsgBBAjIQMLIAMLPQECf0EAIQICQEEAKALQCSIDIABLDQAgAC8BACABRw0AAkAgAyAARw0AQQEPCyAAQX5qLwEAEB4hAgsgAgtoAQJ/QQEhAQJAAkAgAEFfaiICQQVLDQBBASACdEExcQ0BCyAAQfj/A3FBKEYNACAAQUZqQf//A3FBBkkNAAJAIABBpX9qIgJBA0sNACACQQFHDQELIABBhX9qQf//A3FBBEkhAQsgAQucAQEDf0EAKAKgCiEBAkADQAJAAkAgAS8BACICQS9HDQACQCABLwECIgFBKkYNACABQS9HDQQQFgwCCyAAEBcMAQsCQAJAIABFDQAgAkF3aiIBQRdLDQFBASABdEGfgIAEcUUNAQwCCyACEB9FDQMMAQsgAkGgAUcNAgtBAEEAKAKgCiIDQQJqIgE2AqAKIANBACgCpApJDQALCyACCzEBAX9BACEBAkAgAC8BAEEuRw0AIABBfmovAQBBLkcNACAAQXxqLwEAQS5GIQELIAELwgMBAX8CQCABQSJGDQAgAUEnRg0AECIPC0EAKAKgCiECIAEQGCAAIAJBAmpBACgCoApBACgCxAkQAUEAQQAoAqAKQQJqNgKgCkEAECchAEEAKAKgCiEBAkACQCAAQeEARw0AIAFBAmpBsAhBChAtRQ0BC0EAIAFBfmo2AqAKDwtBACABQQxqNgKgCgJAQQEQJ0H7AEYNAEEAIAE2AqAKDwtBACgCoAoiAiEAA0BBACAAQQJqNgKgCgJAAkACQEEBECciAEEiRg0AIABBJ0cNAUEnEBhBAEEAKAKgCkECajYCoApBARAnIQAMAgtBIhAYQQBBACgCoApBAmo2AqAKQQEQJyEADAELIAAQKiEACwJAIABBOkYNAEEAIAE2AqAKDwtBAEEAKAKgCkECajYCoAoCQEEBECciAEEiRg0AIABBJ0YNAEEAIAE2AqAKDwsgABAYQQBBACgCoApBAmo2AqAKAkACQEEBECciAEEsRg0AIABB/QBGDQFBACABNgKgCg8LQQBBACgCoApBAmo2AqAKQQEQJ0H9AEYNAEEAKAKgCiEADAELC0EAKALkCSIBIAI2AhAgAUEAKAKgCkECajYCDAttAQJ/AkACQANAAkAgAEH//wNxIgFBd2oiAkEXSw0AQQEgAnRBn4CABHENAgsgAUGgAUYNASAAIQIgARAmDQJBACECQQBBACgCoAoiAEECajYCoAogAC8BAiIADQAMAgsLIAAhAgsgAkH//wNxC6sBAQR/AkACQEEAKAKgCiICLwEAIgNB4QBGDQAgASEEIAAhBQwBC0EAIAJBBGo2AqAKQQEQJyECQQAoAqAKIQUCQAJAIAJBIkYNACACQSdGDQAgAhAqGkEAKAKgCiEEDAELIAIQGEEAQQAoAqAKQQJqIgQ2AqAKC0EBECchA0EAKAKgCiECCwJAIAIgBUYNACAFIARBACAAIAAgAUYiAhtBACABIAIbEAILIAMLcgEEf0EAKAKgCiEAQQAoAqQKIQECQAJAA0AgAEECaiECIAAgAU8NAQJAAkAgAi8BACIDQaR/ag4CAQQACyACIQAgA0F2ag4EAgEBAgELIABBBGohAAwACwtBACACNgKgChAiQQAPC0EAIAI2AqAKQd0AC0kBA39BACEDAkAgAkUNAAJAA0AgAC0AACIEIAEtAAAiBUcNASABQQFqIQEgAEEBaiEAIAJBf2oiAg0ADAILCyAEIAVrIQMLIAMLC+IBAgBBgAgLxAEAAHgAcABvAHIAdABtAHAAbwByAHQAZQB0AGEAcgBvAG0AdQBuAGMAdABpAG8AbgBzAHMAZQByAHQAdgBvAHkAaQBlAGQAZQBsAGUAYwBvAG4AdABpAG4AaQBuAHMAdABhAG4AdAB5AGIAcgBlAGEAcgBlAHQAdQByAGQAZQBiAHUAZwBnAGUAYQB3AGEAaQB0AGgAcgB3AGgAaQBsAGUAZgBvAHIAaQBmAGMAYQB0AGMAZgBpAG4AYQBsAGwAZQBsAHMAAEHECQsQAQAAAAIAAAAABAAAMDkAAA==", "undefined" != typeof Buffer ? Buffer.from(E, "base64") : Uint8Array.from(atob(E), (A2) => A2.charCodeAt(0)))).then(WebAssembly.instantiate).then(({ exports: A2 }) => { + C = A2; + }); + isDebug$6 = !!process.env.DEBUG; + debug$e = createDebugger("vite:sourcemap", { + onlyWhenFocused: true + }); + astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239]; + astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938, 6, 4191]; + nonASCIIidentifierChars = "\u200C\u200D\xB7\u0300-\u036F\u0387\u0483-\u0487\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u0669\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u06F0-\u06F9\u0711\u0730-\u074A\u07A6-\u07B0\u07C0-\u07C9\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u0898-\u089F\u08CA-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0966-\u096F\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09E6-\u09EF\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A66-\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AE6-\u0AEF\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B62\u0B63\u0B66-\u0B6F\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0BE6-\u0BEF\u0C00-\u0C04\u0C3C\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0CE6-\u0CEF\u0CF3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D66-\u0D6F\u0D81-\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0E50-\u0E59\u0EB1\u0EB4-\u0EBC\u0EC8-\u0ECE\u0ED0-\u0ED9\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1040-\u1049\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F-\u109D\u135D-\u135F\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u17E0-\u17E9\u180B-\u180D\u180F-\u1819\u18A9\u1920-\u192B\u1930-\u193B\u1946-\u194F\u19D0-\u19DA\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AB0-\u1ABD\u1ABF-\u1ACE\u1B00-\u1B04\u1B34-\u1B44\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BB0-\u1BB9\u1BE6-\u1BF3\u1C24-\u1C37\u1C40-\u1C49\u1C50-\u1C59\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DFF\u203F\u2040\u2054\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA620-\uA629\uA66F\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA82C\uA880\uA881\uA8B4-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F1\uA8FF-\uA909\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9D0-\uA9D9\uA9E5\uA9F0-\uA9F9\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA50-\uAA59\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uABF0-\uABF9\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFF10-\uFF19\uFF3F"; + nonASCIIidentifierStartChars = "\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC"; + reservedWords = { + 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile", + 5: "class enum extends super const export import", + 6: "enum", + strict: "implements interface let package private protected public static yield", + strictBind: "eval arguments" + }; + ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this"; + keywords$1 = { + 5: ecma5AndLessKeywords, + "5module": ecma5AndLessKeywords + " export import", + 6: ecma5AndLessKeywords + " const class extends export import super" + }; + keywordRelationalOperator = /^in(stanceof)?$/; + nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); + nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); + TokenType = function TokenType2(label, conf) { + if (conf === void 0) + conf = {}; + this.label = label; + this.keyword = conf.keyword; + this.beforeExpr = !!conf.beforeExpr; + this.startsExpr = !!conf.startsExpr; + this.isLoop = !!conf.isLoop; + this.isAssign = !!conf.isAssign; + this.prefix = !!conf.prefix; + this.postfix = !!conf.postfix; + this.binop = conf.binop || null; + this.updateContext = null; + }; + beforeExpr = { beforeExpr: true }; + startsExpr = { startsExpr: true }; + keywords$2 = {}; + types$1 = { + num: new TokenType("num", startsExpr), + regexp: new TokenType("regexp", startsExpr), + string: new TokenType("string", startsExpr), + name: new TokenType("name", startsExpr), + privateId: new TokenType("privateId", startsExpr), + eof: new TokenType("eof"), + // Punctuation token types. + bracketL: new TokenType("[", { beforeExpr: true, startsExpr: true }), + bracketR: new TokenType("]"), + braceL: new TokenType("{", { beforeExpr: true, startsExpr: true }), + braceR: new TokenType("}"), + parenL: new TokenType("(", { beforeExpr: true, startsExpr: true }), + parenR: new TokenType(")"), + comma: new TokenType(",", beforeExpr), + semi: new TokenType(";", beforeExpr), + colon: new TokenType(":", beforeExpr), + dot: new TokenType("."), + question: new TokenType("?", beforeExpr), + questionDot: new TokenType("?."), + arrow: new TokenType("=>", beforeExpr), + template: new TokenType("template"), + invalidTemplate: new TokenType("invalidTemplate"), + ellipsis: new TokenType("...", beforeExpr), + backQuote: new TokenType("`", startsExpr), + dollarBraceL: new TokenType("${", { beforeExpr: true, startsExpr: true }), + // Operators. These carry several kinds of properties to help the + // parser use them properly (the presence of these properties is + // what categorizes them as operators). + // + // `binop`, when present, specifies that this operator is a binary + // operator, and will refer to its precedence. + // + // `prefix` and `postfix` mark the operator as a prefix or postfix + // unary operator. + // + // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as + // binary operators with a very low precedence, that should result + // in AssignmentExpression nodes. + eq: new TokenType("=", { beforeExpr: true, isAssign: true }), + assign: new TokenType("_=", { beforeExpr: true, isAssign: true }), + incDec: new TokenType("++/--", { prefix: true, postfix: true, startsExpr: true }), + prefix: new TokenType("!/~", { beforeExpr: true, prefix: true, startsExpr: true }), + logicalOR: binop("||", 1), + logicalAND: binop("&&", 2), + bitwiseOR: binop("|", 3), + bitwiseXOR: binop("^", 4), + bitwiseAND: binop("&", 5), + equality: binop("==/!=/===/!==", 6), + relational: binop("/<=/>=", 7), + bitShift: binop("<>/>>>", 8), + plusMin: new TokenType("+/-", { beforeExpr: true, binop: 9, prefix: true, startsExpr: true }), + modulo: binop("%", 10), + star: binop("*", 10), + slash: binop("/", 10), + starstar: new TokenType("**", { beforeExpr: true }), + coalesce: binop("??", 1), + // Keyword token types. + _break: kw("break"), + _case: kw("case", beforeExpr), + _catch: kw("catch"), + _continue: kw("continue"), + _debugger: kw("debugger"), + _default: kw("default", beforeExpr), + _do: kw("do", { isLoop: true, beforeExpr: true }), + _else: kw("else", beforeExpr), + _finally: kw("finally"), + _for: kw("for", { isLoop: true }), + _function: kw("function", startsExpr), + _if: kw("if"), + _return: kw("return", beforeExpr), + _switch: kw("switch"), + _throw: kw("throw", beforeExpr), + _try: kw("try"), + _var: kw("var"), + _const: kw("const"), + _while: kw("while", { isLoop: true }), + _with: kw("with"), + _new: kw("new", { beforeExpr: true, startsExpr: true }), + _this: kw("this", startsExpr), + _super: kw("super", startsExpr), + _class: kw("class", startsExpr), + _extends: kw("extends", beforeExpr), + _export: kw("export"), + _import: kw("import", startsExpr), + _null: kw("null", startsExpr), + _true: kw("true", startsExpr), + _false: kw("false", startsExpr), + _in: kw("in", { beforeExpr: true, binop: 7 }), + _instanceof: kw("instanceof", { beforeExpr: true, binop: 7 }), + _typeof: kw("typeof", { beforeExpr: true, prefix: true, startsExpr: true }), + _void: kw("void", { beforeExpr: true, prefix: true, startsExpr: true }), + _delete: kw("delete", { beforeExpr: true, prefix: true, startsExpr: true }) + }; + lineBreak = /\r\n?|\n|\u2028|\u2029/; + lineBreakG = new RegExp(lineBreak.source, "g"); + nonASCIIwhitespace = /[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/; + skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g; + ref = Object.prototype; + hasOwnProperty$1 = ref.hasOwnProperty; + toString$1 = ref.toString; + hasOwn = Object.hasOwn || function(obj, propName) { + return hasOwnProperty$1.call(obj, propName); + }; + isArray = Array.isArray || function(obj) { + return toString$1.call(obj) === "[object Array]"; + }; + loneSurrogate = /(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/; + Position = function Position2(line, col) { + this.line = line; + this.column = col; + }; + Position.prototype.offset = function offset(n) { + return new Position(this.line, this.column + n); + }; + SourceLocation = function SourceLocation2(p, start, end) { + this.start = start; + this.end = end; + if (p.sourceFile !== null) { + this.source = p.sourceFile; + } + }; + defaultOptions = { + // `ecmaVersion` indicates the ECMAScript version to parse. Must be + // either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 + // (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"` + // (the latest version the library supports). This influences + // support for strict mode, the set of reserved words, and support + // for new syntax features. + ecmaVersion: null, + // `sourceType` indicates the mode the code should be parsed in. + // Can be either `"script"` or `"module"`. This influences global + // strict mode and parsing of `import` and `export` declarations. + sourceType: "script", + // `onInsertedSemicolon` can be a callback that will be called + // when a semicolon is automatically inserted. It will be passed + // the position of the comma as an offset, and if `locations` is + // enabled, it is given the location as a `{line, column}` object + // as second argument. + onInsertedSemicolon: null, + // `onTrailingComma` is similar to `onInsertedSemicolon`, but for + // trailing commas. + onTrailingComma: null, + // By default, reserved words are only enforced if ecmaVersion >= 5. + // Set `allowReserved` to a boolean value to explicitly turn this on + // an off. When this option has the value "never", reserved words + // and keywords can also not be used as property names. + allowReserved: null, + // When enabled, a return at the top level is not considered an + // error. + allowReturnOutsideFunction: false, + // When enabled, import/export statements are not constrained to + // appearing at the top of the program, and an import.meta expression + // in a script isn't considered an error. + allowImportExportEverywhere: false, + // By default, await identifiers are allowed to appear at the top-level scope only if ecmaVersion >= 2022. + // When enabled, await identifiers are allowed to appear at the top-level scope, + // but they are still not allowed in non-async functions. + allowAwaitOutsideFunction: null, + // When enabled, super identifiers are not constrained to + // appearing in methods and do not raise an error when they appear elsewhere. + allowSuperOutsideMethod: null, + // When enabled, hashbang directive in the beginning of file is + // allowed and treated as a line comment. Enabled by default when + // `ecmaVersion` >= 2023. + allowHashBang: false, + // When `locations` is on, `loc` properties holding objects with + // `start` and `end` properties in `{line, column}` form (with + // line being 1-based and column 0-based) will be attached to the + // nodes. + locations: false, + // A function can be passed as `onToken` option, which will + // cause Acorn to call that function with object in the same + // format as tokens returned from `tokenizer().getToken()`. Note + // that you are not allowed to call the parser from the + // callback—that will corrupt its internal state. + onToken: null, + // A function can be passed as `onComment` option, which will + // cause Acorn to call that function with `(block, text, start, + // end)` parameters whenever a comment is skipped. `block` is a + // boolean indicating whether this is a block (`/* */`) comment, + // `text` is the content of the comment, and `start` and `end` are + // character offsets that denote the start and end of the comment. + // When the `locations` option is on, two more parameters are + // passed, the full `{line, column}` locations of the start and + // end of the comments. Note that you are not allowed to call the + // parser from the callback—that will corrupt its internal state. + onComment: null, + // Nodes have their start and end characters offsets recorded in + // `start` and `end` properties (directly on the node, rather than + // the `loc` object, which holds line/column data. To also add a + // [semi-standardized][range] `range` property holding a `[start, + // end]` array with the same numbers, set the `ranges` option to + // `true`. + // + // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678 + ranges: false, + // It is possible to parse multiple files into a single AST by + // passing the tree produced by parsing the first file as + // `program` option in subsequent parses. This will add the + // toplevel forms of the parsed file to the `Program` (top) node + // of an existing parse tree. + program: null, + // When `locations` is on, you can pass this to record the source + // file in every node's `loc` object. + sourceFile: null, + // This value, if given, is stored in every node, whether + // `locations` is on or off. + directSourceFile: null, + // When enabled, parenthesized expressions are represented by + // (non-standard) ParenthesizedExpression nodes + preserveParens: false + }; + warnedAboutEcmaVersion = false; + SCOPE_TOP = 1; + SCOPE_FUNCTION = 2; + SCOPE_ASYNC = 4; + SCOPE_GENERATOR = 8; + SCOPE_ARROW = 16; + SCOPE_SIMPLE_CATCH = 32; + SCOPE_SUPER = 64; + SCOPE_DIRECT_SUPER = 128; + SCOPE_CLASS_STATIC_BLOCK = 256; + SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK; + BIND_NONE = 0; + BIND_VAR = 1; + BIND_LEXICAL = 2; + BIND_FUNCTION = 3; + BIND_SIMPLE_CATCH = 4; + BIND_OUTSIDE = 5; + Parser$1 = function Parser(options2, input, startPos) { + this.options = options2 = getOptions(options2); + this.sourceFile = options2.sourceFile; + this.keywords = wordsRegexp(keywords$1[options2.ecmaVersion >= 6 ? 6 : options2.sourceType === "module" ? "5module" : 5]); + var reserved = ""; + if (options2.allowReserved !== true) { + reserved = reservedWords[options2.ecmaVersion >= 6 ? 6 : options2.ecmaVersion === 5 ? 5 : 3]; + if (options2.sourceType === "module") { + reserved += " await"; + } + } + this.reservedWords = wordsRegexp(reserved); + var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict; + this.reservedWordsStrict = wordsRegexp(reservedStrict); + this.reservedWordsStrictBind = wordsRegexp(reservedStrict + " " + reservedWords.strictBind); + this.input = String(input); + this.containsEsc = false; + if (startPos) { + this.pos = startPos; + this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1; + this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; + } else { + this.pos = this.lineStart = 0; + this.curLine = 1; + } + this.type = types$1.eof; + this.value = null; + this.start = this.end = this.pos; + this.startLoc = this.endLoc = this.curPosition(); + this.lastTokEndLoc = this.lastTokStartLoc = null; + this.lastTokStart = this.lastTokEnd = this.pos; + this.context = this.initialContext(); + this.exprAllowed = true; + this.inModule = options2.sourceType === "module"; + this.strict = this.inModule || this.strictDirective(this.pos); + this.potentialArrowAt = -1; + this.potentialArrowInForAwait = false; + this.yieldPos = this.awaitPos = this.awaitIdentPos = 0; + this.labels = []; + this.undefinedExports = /* @__PURE__ */ Object.create(null); + if (this.pos === 0 && options2.allowHashBang && this.input.slice(0, 2) === "#!") { + this.skipLineComment(2); + } + this.scopeStack = []; + this.enterScope(SCOPE_TOP); + this.regexpState = null; + this.privateNameStack = []; + }; + prototypeAccessors = { inFunction: { configurable: true }, inGenerator: { configurable: true }, inAsync: { configurable: true }, canAwait: { configurable: true }, allowSuper: { configurable: true }, allowDirectSuper: { configurable: true }, treatFunctionsAsVar: { configurable: true }, allowNewDotTarget: { configurable: true }, inClassStaticBlock: { configurable: true } }; + Parser$1.prototype.parse = function parse() { + var node2 = this.options.program || this.startNode(); + this.nextToken(); + return this.parseTopLevel(node2); + }; + prototypeAccessors.inFunction.get = function() { + return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0; + }; + prototypeAccessors.inGenerator.get = function() { + return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 && !this.currentVarScope().inClassFieldInit; + }; + prototypeAccessors.inAsync.get = function() { + return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 && !this.currentVarScope().inClassFieldInit; + }; + prototypeAccessors.canAwait.get = function() { + for (var i = this.scopeStack.length - 1; i >= 0; i--) { + var scope = this.scopeStack[i]; + if (scope.inClassFieldInit || scope.flags & SCOPE_CLASS_STATIC_BLOCK) { + return false; + } + if (scope.flags & SCOPE_FUNCTION) { + return (scope.flags & SCOPE_ASYNC) > 0; + } + } + return this.inModule && this.options.ecmaVersion >= 13 || this.options.allowAwaitOutsideFunction; + }; + prototypeAccessors.allowSuper.get = function() { + var ref2 = this.currentThisScope(); + var flags = ref2.flags; + var inClassFieldInit = ref2.inClassFieldInit; + return (flags & SCOPE_SUPER) > 0 || inClassFieldInit || this.options.allowSuperOutsideMethod; + }; + prototypeAccessors.allowDirectSuper.get = function() { + return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0; + }; + prototypeAccessors.treatFunctionsAsVar.get = function() { + return this.treatFunctionsAsVarInScope(this.currentScope()); + }; + prototypeAccessors.allowNewDotTarget.get = function() { + var ref2 = this.currentThisScope(); + var flags = ref2.flags; + var inClassFieldInit = ref2.inClassFieldInit; + return (flags & (SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK)) > 0 || inClassFieldInit; + }; + prototypeAccessors.inClassStaticBlock.get = function() { + return (this.currentVarScope().flags & SCOPE_CLASS_STATIC_BLOCK) > 0; + }; + Parser$1.extend = function extend() { + var plugins2 = [], len = arguments.length; + while (len--) + plugins2[len] = arguments[len]; + var cls = this; + for (var i = 0; i < plugins2.length; i++) { + cls = plugins2[i](cls); + } + return cls; + }; + Parser$1.parse = function parse2(input, options2) { + return new this(options2, input).parse(); + }; + Parser$1.parseExpressionAt = function parseExpressionAt(input, pos, options2) { + var parser = new this(options2, input, pos); + parser.nextToken(); + return parser.parseExpression(); + }; + Parser$1.tokenizer = function tokenizer(input, options2) { + return new this(options2, input); + }; + Object.defineProperties(Parser$1.prototype, prototypeAccessors); + pp$9 = Parser$1.prototype; + literal = /^(?:'((?:\\.|[^'\\])*?)'|"((?:\\.|[^"\\])*?)")/; + pp$9.strictDirective = function(start) { + if (this.options.ecmaVersion < 5) { + return false; + } + for (; ; ) { + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this.input)[0].length; + var match = literal.exec(this.input.slice(start)); + if (!match) { + return false; + } + if ((match[1] || match[2]) === "use strict") { + skipWhiteSpace.lastIndex = start + match[0].length; + var spaceAfter = skipWhiteSpace.exec(this.input), end = spaceAfter.index + spaceAfter[0].length; + var next = this.input.charAt(end); + return next === ";" || next === "}" || lineBreak.test(spaceAfter[0]) && !(/[(`.[+\-/*%<>=,?^&]/.test(next) || next === "!" && this.input.charAt(end + 1) === "="); + } + start += match[0].length; + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this.input)[0].length; + if (this.input[start] === ";") { + start++; + } + } + }; + pp$9.eat = function(type) { + if (this.type === type) { + this.next(); + return true; + } else { + return false; + } + }; + pp$9.isContextual = function(name2) { + return this.type === types$1.name && this.value === name2 && !this.containsEsc; + }; + pp$9.eatContextual = function(name2) { + if (!this.isContextual(name2)) { + return false; + } + this.next(); + return true; + }; + pp$9.expectContextual = function(name2) { + if (!this.eatContextual(name2)) { + this.unexpected(); + } + }; + pp$9.canInsertSemicolon = function() { + return this.type === types$1.eof || this.type === types$1.braceR || lineBreak.test(this.input.slice(this.lastTokEnd, this.start)); + }; + pp$9.insertSemicolon = function() { + if (this.canInsertSemicolon()) { + if (this.options.onInsertedSemicolon) { + this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); + } + return true; + } + }; + pp$9.semicolon = function() { + if (!this.eat(types$1.semi) && !this.insertSemicolon()) { + this.unexpected(); + } + }; + pp$9.afterTrailingComma = function(tokType, notNext) { + if (this.type === tokType) { + if (this.options.onTrailingComma) { + this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); + } + if (!notNext) { + this.next(); + } + return true; + } + }; + pp$9.expect = function(type) { + this.eat(type) || this.unexpected(); + }; + pp$9.unexpected = function(pos) { + this.raise(pos != null ? pos : this.start, "Unexpected token"); + }; + DestructuringErrors = function DestructuringErrors2() { + this.shorthandAssign = this.trailingComma = this.parenthesizedAssign = this.parenthesizedBind = this.doubleProto = -1; + }; + pp$9.checkPatternErrors = function(refDestructuringErrors, isAssign) { + if (!refDestructuringErrors) { + return; + } + if (refDestructuringErrors.trailingComma > -1) { + this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); + } + var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind; + if (parens > -1) { + this.raiseRecoverable(parens, isAssign ? "Assigning to rvalue" : "Parenthesized pattern"); + } + }; + pp$9.checkExpressionErrors = function(refDestructuringErrors, andThrow) { + if (!refDestructuringErrors) { + return false; + } + var shorthandAssign = refDestructuringErrors.shorthandAssign; + var doubleProto = refDestructuringErrors.doubleProto; + if (!andThrow) { + return shorthandAssign >= 0 || doubleProto >= 0; + } + if (shorthandAssign >= 0) { + this.raise(shorthandAssign, "Shorthand property assignments are valid only in destructuring patterns"); + } + if (doubleProto >= 0) { + this.raiseRecoverable(doubleProto, "Redefinition of __proto__ property"); + } + }; + pp$9.checkYieldAwaitInDefaultParams = function() { + if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos)) { + this.raise(this.yieldPos, "Yield expression cannot be a default value"); + } + if (this.awaitPos) { + this.raise(this.awaitPos, "Await expression cannot be a default value"); + } + }; + pp$9.isSimpleAssignTarget = function(expr) { + if (expr.type === "ParenthesizedExpression") { + return this.isSimpleAssignTarget(expr.expression); + } + return expr.type === "Identifier" || expr.type === "MemberExpression"; + }; + pp$8 = Parser$1.prototype; + pp$8.parseTopLevel = function(node2) { + var exports2 = /* @__PURE__ */ Object.create(null); + if (!node2.body) { + node2.body = []; + } + while (this.type !== types$1.eof) { + var stmt = this.parseStatement(null, true, exports2); + node2.body.push(stmt); + } + if (this.inModule) { + for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1) { + var name2 = list[i]; + this.raiseRecoverable(this.undefinedExports[name2].start, "Export '" + name2 + "' is not defined"); + } + } + this.adaptDirectivePrologue(node2.body); + this.next(); + node2.sourceType = this.options.sourceType; + return this.finishNode(node2, "Program"); + }; + loopLabel = { kind: "loop" }; + switchLabel = { kind: "switch" }; + pp$8.isLet = function(context) { + if (this.options.ecmaVersion < 6 || !this.isContextual("let")) { + return false; + } + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + if (nextCh === 91 || nextCh === 92) { + return true; + } + if (context) { + return false; + } + if (nextCh === 123 || nextCh > 55295 && nextCh < 56320) { + return true; + } + if (isIdentifierStart(nextCh, true)) { + var pos = next + 1; + while (isIdentifierChar(nextCh = this.input.charCodeAt(pos), true)) { + ++pos; + } + if (nextCh === 92 || nextCh > 55295 && nextCh < 56320) { + return true; + } + var ident = this.input.slice(next, pos); + if (!keywordRelationalOperator.test(ident)) { + return true; + } + } + return false; + }; + pp$8.isAsyncFunction = function() { + if (this.options.ecmaVersion < 8 || !this.isContextual("async")) { + return false; + } + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, after; + return !lineBreak.test(this.input.slice(this.pos, next)) && this.input.slice(next, next + 8) === "function" && (next + 8 === this.input.length || !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 55295 && after < 56320)); + }; + pp$8.parseStatement = function(context, topLevel, exports2) { + var starttype = this.type, node2 = this.startNode(), kind; + if (this.isLet(context)) { + starttype = types$1._var; + kind = "let"; + } + switch (starttype) { + case types$1._break: + case types$1._continue: + return this.parseBreakContinueStatement(node2, starttype.keyword); + case types$1._debugger: + return this.parseDebuggerStatement(node2); + case types$1._do: + return this.parseDoStatement(node2); + case types$1._for: + return this.parseForStatement(node2); + case types$1._function: + if (context && (this.strict || context !== "if" && context !== "label") && this.options.ecmaVersion >= 6) { + this.unexpected(); + } + return this.parseFunctionStatement(node2, false, !context); + case types$1._class: + if (context) { + this.unexpected(); + } + return this.parseClass(node2, true); + case types$1._if: + return this.parseIfStatement(node2); + case types$1._return: + return this.parseReturnStatement(node2); + case types$1._switch: + return this.parseSwitchStatement(node2); + case types$1._throw: + return this.parseThrowStatement(node2); + case types$1._try: + return this.parseTryStatement(node2); + case types$1._const: + case types$1._var: + kind = kind || this.value; + if (context && kind !== "var") { + this.unexpected(); + } + return this.parseVarStatement(node2, kind); + case types$1._while: + return this.parseWhileStatement(node2); + case types$1._with: + return this.parseWithStatement(node2); + case types$1.braceL: + return this.parseBlock(true, node2); + case types$1.semi: + return this.parseEmptyStatement(node2); + case types$1._export: + case types$1._import: + if (this.options.ecmaVersion > 10 && starttype === types$1._import) { + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + if (nextCh === 40 || nextCh === 46) { + return this.parseExpressionStatement(node2, this.parseExpression()); + } + } + if (!this.options.allowImportExportEverywhere) { + if (!topLevel) { + this.raise(this.start, "'import' and 'export' may only appear at the top level"); + } + if (!this.inModule) { + this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); + } + } + return starttype === types$1._import ? this.parseImport(node2) : this.parseExport(node2, exports2); + default: + if (this.isAsyncFunction()) { + if (context) { + this.unexpected(); + } + this.next(); + return this.parseFunctionStatement(node2, true, !context); + } + var maybeName = this.value, expr = this.parseExpression(); + if (starttype === types$1.name && expr.type === "Identifier" && this.eat(types$1.colon)) { + return this.parseLabeledStatement(node2, maybeName, expr, context); + } else { + return this.parseExpressionStatement(node2, expr); + } + } + }; + pp$8.parseBreakContinueStatement = function(node2, keyword) { + var isBreak = keyword === "break"; + this.next(); + if (this.eat(types$1.semi) || this.insertSemicolon()) { + node2.label = null; + } else if (this.type !== types$1.name) { + this.unexpected(); + } else { + node2.label = this.parseIdent(); + this.semicolon(); + } + var i = 0; + for (; i < this.labels.length; ++i) { + var lab = this.labels[i]; + if (node2.label == null || lab.name === node2.label.name) { + if (lab.kind != null && (isBreak || lab.kind === "loop")) { + break; + } + if (node2.label && isBreak) { + break; + } + } + } + if (i === this.labels.length) { + this.raise(node2.start, "Unsyntactic " + keyword); + } + return this.finishNode(node2, isBreak ? "BreakStatement" : "ContinueStatement"); + }; + pp$8.parseDebuggerStatement = function(node2) { + this.next(); + this.semicolon(); + return this.finishNode(node2, "DebuggerStatement"); + }; + pp$8.parseDoStatement = function(node2) { + this.next(); + this.labels.push(loopLabel); + node2.body = this.parseStatement("do"); + this.labels.pop(); + this.expect(types$1._while); + node2.test = this.parseParenExpression(); + if (this.options.ecmaVersion >= 6) { + this.eat(types$1.semi); + } else { + this.semicolon(); + } + return this.finishNode(node2, "DoWhileStatement"); + }; + pp$8.parseForStatement = function(node2) { + this.next(); + var awaitAt = this.options.ecmaVersion >= 9 && this.canAwait && this.eatContextual("await") ? this.lastTokStart : -1; + this.labels.push(loopLabel); + this.enterScope(0); + this.expect(types$1.parenL); + if (this.type === types$1.semi) { + if (awaitAt > -1) { + this.unexpected(awaitAt); + } + return this.parseFor(node2, null); + } + var isLet = this.isLet(); + if (this.type === types$1._var || this.type === types$1._const || isLet) { + var init$1 = this.startNode(), kind = isLet ? "let" : this.value; + this.next(); + this.parseVar(init$1, true, kind); + this.finishNode(init$1, "VariableDeclaration"); + if ((this.type === types$1._in || this.options.ecmaVersion >= 6 && this.isContextual("of")) && init$1.declarations.length === 1) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types$1._in) { + if (awaitAt > -1) { + this.unexpected(awaitAt); + } + } else { + node2.await = awaitAt > -1; + } + } + return this.parseForIn(node2, init$1); + } + if (awaitAt > -1) { + this.unexpected(awaitAt); + } + return this.parseFor(node2, init$1); + } + var startsWithLet = this.isContextual("let"), isForOf = false; + var refDestructuringErrors = new DestructuringErrors(); + var init2 = this.parseExpression(awaitAt > -1 ? "await" : true, refDestructuringErrors); + if (this.type === types$1._in || (isForOf = this.options.ecmaVersion >= 6 && this.isContextual("of"))) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types$1._in) { + if (awaitAt > -1) { + this.unexpected(awaitAt); + } + } else { + node2.await = awaitAt > -1; + } + } + if (startsWithLet && isForOf) { + this.raise(init2.start, "The left-hand side of a for-of loop may not start with 'let'."); + } + this.toAssignable(init2, false, refDestructuringErrors); + this.checkLValPattern(init2); + return this.parseForIn(node2, init2); + } else { + this.checkExpressionErrors(refDestructuringErrors, true); + } + if (awaitAt > -1) { + this.unexpected(awaitAt); + } + return this.parseFor(node2, init2); + }; + pp$8.parseFunctionStatement = function(node2, isAsync, declarationPosition) { + this.next(); + return this.parseFunction(node2, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync); + }; + pp$8.parseIfStatement = function(node2) { + this.next(); + node2.test = this.parseParenExpression(); + node2.consequent = this.parseStatement("if"); + node2.alternate = this.eat(types$1._else) ? this.parseStatement("if") : null; + return this.finishNode(node2, "IfStatement"); + }; + pp$8.parseReturnStatement = function(node2) { + if (!this.inFunction && !this.options.allowReturnOutsideFunction) { + this.raise(this.start, "'return' outside of function"); + } + this.next(); + if (this.eat(types$1.semi) || this.insertSemicolon()) { + node2.argument = null; + } else { + node2.argument = this.parseExpression(); + this.semicolon(); + } + return this.finishNode(node2, "ReturnStatement"); + }; + pp$8.parseSwitchStatement = function(node2) { + this.next(); + node2.discriminant = this.parseParenExpression(); + node2.cases = []; + this.expect(types$1.braceL); + this.labels.push(switchLabel); + this.enterScope(0); + var cur; + for (var sawDefault = false; this.type !== types$1.braceR; ) { + if (this.type === types$1._case || this.type === types$1._default) { + var isCase = this.type === types$1._case; + if (cur) { + this.finishNode(cur, "SwitchCase"); + } + node2.cases.push(cur = this.startNode()); + cur.consequent = []; + this.next(); + if (isCase) { + cur.test = this.parseExpression(); + } else { + if (sawDefault) { + this.raiseRecoverable(this.lastTokStart, "Multiple default clauses"); + } + sawDefault = true; + cur.test = null; + } + this.expect(types$1.colon); + } else { + if (!cur) { + this.unexpected(); + } + cur.consequent.push(this.parseStatement(null)); + } + } + this.exitScope(); + if (cur) { + this.finishNode(cur, "SwitchCase"); + } + this.next(); + this.labels.pop(); + return this.finishNode(node2, "SwitchStatement"); + }; + pp$8.parseThrowStatement = function(node2) { + this.next(); + if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) { + this.raise(this.lastTokEnd, "Illegal newline after throw"); + } + node2.argument = this.parseExpression(); + this.semicolon(); + return this.finishNode(node2, "ThrowStatement"); + }; + empty$1 = []; + pp$8.parseTryStatement = function(node2) { + this.next(); + node2.block = this.parseBlock(); + node2.handler = null; + if (this.type === types$1._catch) { + var clause = this.startNode(); + this.next(); + if (this.eat(types$1.parenL)) { + clause.param = this.parseBindingAtom(); + var simple = clause.param.type === "Identifier"; + this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0); + this.checkLValPattern(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL); + this.expect(types$1.parenR); + } else { + if (this.options.ecmaVersion < 10) { + this.unexpected(); + } + clause.param = null; + this.enterScope(0); + } + clause.body = this.parseBlock(false); + this.exitScope(); + node2.handler = this.finishNode(clause, "CatchClause"); + } + node2.finalizer = this.eat(types$1._finally) ? this.parseBlock() : null; + if (!node2.handler && !node2.finalizer) { + this.raise(node2.start, "Missing catch or finally clause"); + } + return this.finishNode(node2, "TryStatement"); + }; + pp$8.parseVarStatement = function(node2, kind) { + this.next(); + this.parseVar(node2, false, kind); + this.semicolon(); + return this.finishNode(node2, "VariableDeclaration"); + }; + pp$8.parseWhileStatement = function(node2) { + this.next(); + node2.test = this.parseParenExpression(); + this.labels.push(loopLabel); + node2.body = this.parseStatement("while"); + this.labels.pop(); + return this.finishNode(node2, "WhileStatement"); + }; + pp$8.parseWithStatement = function(node2) { + if (this.strict) { + this.raise(this.start, "'with' in strict mode"); + } + this.next(); + node2.object = this.parseParenExpression(); + node2.body = this.parseStatement("with"); + return this.finishNode(node2, "WithStatement"); + }; + pp$8.parseEmptyStatement = function(node2) { + this.next(); + return this.finishNode(node2, "EmptyStatement"); + }; + pp$8.parseLabeledStatement = function(node2, maybeName, expr, context) { + for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1) { + var label = list[i$1]; + if (label.name === maybeName) { + this.raise(expr.start, "Label '" + maybeName + "' is already declared"); + } + } + var kind = this.type.isLoop ? "loop" : this.type === types$1._switch ? "switch" : null; + for (var i = this.labels.length - 1; i >= 0; i--) { + var label$1 = this.labels[i]; + if (label$1.statementStart === node2.start) { + label$1.statementStart = this.start; + label$1.kind = kind; + } else { + break; + } + } + this.labels.push({ name: maybeName, kind, statementStart: this.start }); + node2.body = this.parseStatement(context ? context.indexOf("label") === -1 ? context + "label" : context : "label"); + this.labels.pop(); + node2.label = expr; + return this.finishNode(node2, "LabeledStatement"); + }; + pp$8.parseExpressionStatement = function(node2, expr) { + node2.expression = expr; + this.semicolon(); + return this.finishNode(node2, "ExpressionStatement"); + }; + pp$8.parseBlock = function(createNewLexicalScope, node2, exitStrict) { + if (createNewLexicalScope === void 0) + createNewLexicalScope = true; + if (node2 === void 0) + node2 = this.startNode(); + node2.body = []; + this.expect(types$1.braceL); + if (createNewLexicalScope) { + this.enterScope(0); + } + while (this.type !== types$1.braceR) { + var stmt = this.parseStatement(null); + node2.body.push(stmt); + } + if (exitStrict) { + this.strict = false; + } + this.next(); + if (createNewLexicalScope) { + this.exitScope(); + } + return this.finishNode(node2, "BlockStatement"); + }; + pp$8.parseFor = function(node2, init2) { + node2.init = init2; + this.expect(types$1.semi); + node2.test = this.type === types$1.semi ? null : this.parseExpression(); + this.expect(types$1.semi); + node2.update = this.type === types$1.parenR ? null : this.parseExpression(); + this.expect(types$1.parenR); + node2.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node2, "ForStatement"); + }; + pp$8.parseForIn = function(node2, init2) { + var isForIn = this.type === types$1._in; + this.next(); + if (init2.type === "VariableDeclaration" && init2.declarations[0].init != null && (!isForIn || this.options.ecmaVersion < 8 || this.strict || init2.kind !== "var" || init2.declarations[0].id.type !== "Identifier")) { + this.raise( + init2.start, + (isForIn ? "for-in" : "for-of") + " loop variable declaration may not have an initializer" + ); + } + node2.left = init2; + node2.right = isForIn ? this.parseExpression() : this.parseMaybeAssign(); + this.expect(types$1.parenR); + node2.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node2, isForIn ? "ForInStatement" : "ForOfStatement"); + }; + pp$8.parseVar = function(node2, isFor, kind) { + node2.declarations = []; + node2.kind = kind; + for (; ; ) { + var decl = this.startNode(); + this.parseVarId(decl, kind); + if (this.eat(types$1.eq)) { + decl.init = this.parseMaybeAssign(isFor); + } else if (kind === "const" && !(this.type === types$1._in || this.options.ecmaVersion >= 6 && this.isContextual("of"))) { + this.unexpected(); + } else if (decl.id.type !== "Identifier" && !(isFor && (this.type === types$1._in || this.isContextual("of")))) { + this.raise(this.lastTokEnd, "Complex binding patterns require an initialization value"); + } else { + decl.init = null; + } + node2.declarations.push(this.finishNode(decl, "VariableDeclarator")); + if (!this.eat(types$1.comma)) { + break; + } + } + return node2; + }; + pp$8.parseVarId = function(decl, kind) { + decl.id = this.parseBindingAtom(); + this.checkLValPattern(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, false); + }; + FUNC_STATEMENT = 1; + FUNC_HANGING_STATEMENT = 2; + FUNC_NULLABLE_ID = 4; + pp$8.parseFunction = function(node2, statement, allowExpressionBody, isAsync, forInit) { + this.initFunction(node2); + if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) { + if (this.type === types$1.star && statement & FUNC_HANGING_STATEMENT) { + this.unexpected(); + } + node2.generator = this.eat(types$1.star); + } + if (this.options.ecmaVersion >= 8) { + node2.async = !!isAsync; + } + if (statement & FUNC_STATEMENT) { + node2.id = statement & FUNC_NULLABLE_ID && this.type !== types$1.name ? null : this.parseIdent(); + if (node2.id && !(statement & FUNC_HANGING_STATEMENT)) { + this.checkLValSimple(node2.id, this.strict || node2.generator || node2.async ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); + } + } + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + this.enterScope(functionFlags(node2.async, node2.generator)); + if (!(statement & FUNC_STATEMENT)) { + node2.id = this.type === types$1.name ? this.parseIdent() : null; + } + this.parseFunctionParams(node2); + this.parseFunctionBody(node2, allowExpressionBody, false, forInit); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node2, statement & FUNC_STATEMENT ? "FunctionDeclaration" : "FunctionExpression"); + }; + pp$8.parseFunctionParams = function(node2) { + this.expect(types$1.parenL); + node2.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); + }; + pp$8.parseClass = function(node2, isStatement) { + this.next(); + var oldStrict = this.strict; + this.strict = true; + this.parseClassId(node2, isStatement); + this.parseClassSuper(node2); + var privateNameMap = this.enterClassBody(); + var classBody = this.startNode(); + var hadConstructor = false; + classBody.body = []; + this.expect(types$1.braceL); + while (this.type !== types$1.braceR) { + var element = this.parseClassElement(node2.superClass !== null); + if (element) { + classBody.body.push(element); + if (element.type === "MethodDefinition" && element.kind === "constructor") { + if (hadConstructor) { + this.raise(element.start, "Duplicate constructor in the same class"); + } + hadConstructor = true; + } else if (element.key && element.key.type === "PrivateIdentifier" && isPrivateNameConflicted(privateNameMap, element)) { + this.raiseRecoverable(element.key.start, "Identifier '#" + element.key.name + "' has already been declared"); + } + } + } + this.strict = oldStrict; + this.next(); + node2.body = this.finishNode(classBody, "ClassBody"); + this.exitClassBody(); + return this.finishNode(node2, isStatement ? "ClassDeclaration" : "ClassExpression"); + }; + pp$8.parseClassElement = function(constructorAllowsSuper) { + if (this.eat(types$1.semi)) { + return null; + } + var ecmaVersion = this.options.ecmaVersion; + var node2 = this.startNode(); + var keyName = ""; + var isGenerator = false; + var isAsync = false; + var kind = "method"; + var isStatic = false; + if (this.eatContextual("static")) { + if (ecmaVersion >= 13 && this.eat(types$1.braceL)) { + this.parseClassStaticBlock(node2); + return node2; + } + if (this.isClassElementNameStart() || this.type === types$1.star) { + isStatic = true; + } else { + keyName = "static"; + } + } + node2.static = isStatic; + if (!keyName && ecmaVersion >= 8 && this.eatContextual("async")) { + if ((this.isClassElementNameStart() || this.type === types$1.star) && !this.canInsertSemicolon()) { + isAsync = true; + } else { + keyName = "async"; + } + } + if (!keyName && (ecmaVersion >= 9 || !isAsync) && this.eat(types$1.star)) { + isGenerator = true; + } + if (!keyName && !isAsync && !isGenerator) { + var lastValue = this.value; + if (this.eatContextual("get") || this.eatContextual("set")) { + if (this.isClassElementNameStart()) { + kind = lastValue; + } else { + keyName = lastValue; + } + } + } + if (keyName) { + node2.computed = false; + node2.key = this.startNodeAt(this.lastTokStart, this.lastTokStartLoc); + node2.key.name = keyName; + this.finishNode(node2.key, "Identifier"); + } else { + this.parseClassElementName(node2); + } + if (ecmaVersion < 13 || this.type === types$1.parenL || kind !== "method" || isGenerator || isAsync) { + var isConstructor = !node2.static && checkKeyName(node2, "constructor"); + var allowsDirectSuper = isConstructor && constructorAllowsSuper; + if (isConstructor && kind !== "method") { + this.raise(node2.key.start, "Constructor can't have get/set modifier"); + } + node2.kind = isConstructor ? "constructor" : kind; + this.parseClassMethod(node2, isGenerator, isAsync, allowsDirectSuper); + } else { + this.parseClassField(node2); + } + return node2; + }; + pp$8.isClassElementNameStart = function() { + return this.type === types$1.name || this.type === types$1.privateId || this.type === types$1.num || this.type === types$1.string || this.type === types$1.bracketL || this.type.keyword; + }; + pp$8.parseClassElementName = function(element) { + if (this.type === types$1.privateId) { + if (this.value === "constructor") { + this.raise(this.start, "Classes can't have an element named '#constructor'"); + } + element.computed = false; + element.key = this.parsePrivateIdent(); + } else { + this.parsePropertyName(element); + } + }; + pp$8.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) { + var key = method.key; + if (method.kind === "constructor") { + if (isGenerator) { + this.raise(key.start, "Constructor can't be a generator"); + } + if (isAsync) { + this.raise(key.start, "Constructor can't be an async method"); + } + } else if (method.static && checkKeyName(method, "prototype")) { + this.raise(key.start, "Classes may not have a static property named prototype"); + } + var value2 = method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper); + if (method.kind === "get" && value2.params.length !== 0) { + this.raiseRecoverable(value2.start, "getter should have no params"); + } + if (method.kind === "set" && value2.params.length !== 1) { + this.raiseRecoverable(value2.start, "setter should have exactly one param"); + } + if (method.kind === "set" && value2.params[0].type === "RestElement") { + this.raiseRecoverable(value2.params[0].start, "Setter cannot use rest params"); + } + return this.finishNode(method, "MethodDefinition"); + }; + pp$8.parseClassField = function(field) { + if (checkKeyName(field, "constructor")) { + this.raise(field.key.start, "Classes can't have a field named 'constructor'"); + } else if (field.static && checkKeyName(field, "prototype")) { + this.raise(field.key.start, "Classes can't have a static field named 'prototype'"); + } + if (this.eat(types$1.eq)) { + var scope = this.currentThisScope(); + var inClassFieldInit = scope.inClassFieldInit; + scope.inClassFieldInit = true; + field.value = this.parseMaybeAssign(); + scope.inClassFieldInit = inClassFieldInit; + } else { + field.value = null; + } + this.semicolon(); + return this.finishNode(field, "PropertyDefinition"); + }; + pp$8.parseClassStaticBlock = function(node2) { + node2.body = []; + var oldLabels = this.labels; + this.labels = []; + this.enterScope(SCOPE_CLASS_STATIC_BLOCK | SCOPE_SUPER); + while (this.type !== types$1.braceR) { + var stmt = this.parseStatement(null); + node2.body.push(stmt); + } + this.next(); + this.exitScope(); + this.labels = oldLabels; + return this.finishNode(node2, "StaticBlock"); + }; + pp$8.parseClassId = function(node2, isStatement) { + if (this.type === types$1.name) { + node2.id = this.parseIdent(); + if (isStatement) { + this.checkLValSimple(node2.id, BIND_LEXICAL, false); + } + } else { + if (isStatement === true) { + this.unexpected(); + } + node2.id = null; + } + }; + pp$8.parseClassSuper = function(node2) { + node2.superClass = this.eat(types$1._extends) ? this.parseExprSubscripts(null, false) : null; + }; + pp$8.enterClassBody = function() { + var element = { declared: /* @__PURE__ */ Object.create(null), used: [] }; + this.privateNameStack.push(element); + return element.declared; + }; + pp$8.exitClassBody = function() { + var ref2 = this.privateNameStack.pop(); + var declared = ref2.declared; + var used = ref2.used; + var len = this.privateNameStack.length; + var parent = len === 0 ? null : this.privateNameStack[len - 1]; + for (var i = 0; i < used.length; ++i) { + var id = used[i]; + if (!hasOwn(declared, id.name)) { + if (parent) { + parent.used.push(id); + } else { + this.raiseRecoverable(id.start, "Private field '#" + id.name + "' must be declared in an enclosing class"); + } + } + } + }; + pp$8.parseExport = function(node2, exports2) { + this.next(); + if (this.eat(types$1.star)) { + if (this.options.ecmaVersion >= 11) { + if (this.eatContextual("as")) { + node2.exported = this.parseModuleExportName(); + this.checkExport(exports2, node2.exported, this.lastTokStart); + } else { + node2.exported = null; + } + } + this.expectContextual("from"); + if (this.type !== types$1.string) { + this.unexpected(); + } + node2.source = this.parseExprAtom(); + this.semicolon(); + return this.finishNode(node2, "ExportAllDeclaration"); + } + if (this.eat(types$1._default)) { + this.checkExport(exports2, "default", this.lastTokStart); + var isAsync; + if (this.type === types$1._function || (isAsync = this.isAsyncFunction())) { + var fNode = this.startNode(); + this.next(); + if (isAsync) { + this.next(); + } + node2.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync); + } else if (this.type === types$1._class) { + var cNode = this.startNode(); + node2.declaration = this.parseClass(cNode, "nullableID"); + } else { + node2.declaration = this.parseMaybeAssign(); + this.semicolon(); + } + return this.finishNode(node2, "ExportDefaultDeclaration"); + } + if (this.shouldParseExportStatement()) { + node2.declaration = this.parseStatement(null); + if (node2.declaration.type === "VariableDeclaration") { + this.checkVariableExport(exports2, node2.declaration.declarations); + } else { + this.checkExport(exports2, node2.declaration.id, node2.declaration.id.start); + } + node2.specifiers = []; + node2.source = null; + } else { + node2.declaration = null; + node2.specifiers = this.parseExportSpecifiers(exports2); + if (this.eatContextual("from")) { + if (this.type !== types$1.string) { + this.unexpected(); + } + node2.source = this.parseExprAtom(); + } else { + for (var i = 0, list = node2.specifiers; i < list.length; i += 1) { + var spec = list[i]; + this.checkUnreserved(spec.local); + this.checkLocalExport(spec.local); + if (spec.local.type === "Literal") { + this.raise(spec.local.start, "A string literal cannot be used as an exported binding without `from`."); + } + } + node2.source = null; + } + this.semicolon(); + } + return this.finishNode(node2, "ExportNamedDeclaration"); + }; + pp$8.checkExport = function(exports2, name2, pos) { + if (!exports2) { + return; + } + if (typeof name2 !== "string") { + name2 = name2.type === "Identifier" ? name2.name : name2.value; + } + if (hasOwn(exports2, name2)) { + this.raiseRecoverable(pos, "Duplicate export '" + name2 + "'"); + } + exports2[name2] = true; + }; + pp$8.checkPatternExport = function(exports2, pat) { + var type = pat.type; + if (type === "Identifier") { + this.checkExport(exports2, pat, pat.start); + } else if (type === "ObjectPattern") { + for (var i = 0, list = pat.properties; i < list.length; i += 1) { + var prop = list[i]; + this.checkPatternExport(exports2, prop); + } + } else if (type === "ArrayPattern") { + for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) { + var elt = list$1[i$1]; + if (elt) { + this.checkPatternExport(exports2, elt); + } + } + } else if (type === "Property") { + this.checkPatternExport(exports2, pat.value); + } else if (type === "AssignmentPattern") { + this.checkPatternExport(exports2, pat.left); + } else if (type === "RestElement") { + this.checkPatternExport(exports2, pat.argument); + } else if (type === "ParenthesizedExpression") { + this.checkPatternExport(exports2, pat.expression); + } + }; + pp$8.checkVariableExport = function(exports2, decls) { + if (!exports2) { + return; + } + for (var i = 0, list = decls; i < list.length; i += 1) { + var decl = list[i]; + this.checkPatternExport(exports2, decl.id); + } + }; + pp$8.shouldParseExportStatement = function() { + return this.type.keyword === "var" || this.type.keyword === "const" || this.type.keyword === "class" || this.type.keyword === "function" || this.isLet() || this.isAsyncFunction(); + }; + pp$8.parseExportSpecifiers = function(exports2) { + var nodes = [], first2 = true; + this.expect(types$1.braceL); + while (!this.eat(types$1.braceR)) { + if (!first2) { + this.expect(types$1.comma); + if (this.afterTrailingComma(types$1.braceR)) { + break; + } + } else { + first2 = false; + } + var node2 = this.startNode(); + node2.local = this.parseModuleExportName(); + node2.exported = this.eatContextual("as") ? this.parseModuleExportName() : node2.local; + this.checkExport( + exports2, + node2.exported, + node2.exported.start + ); + nodes.push(this.finishNode(node2, "ExportSpecifier")); + } + return nodes; + }; + pp$8.parseImport = function(node2) { + this.next(); + if (this.type === types$1.string) { + node2.specifiers = empty$1; + node2.source = this.parseExprAtom(); + } else { + node2.specifiers = this.parseImportSpecifiers(); + this.expectContextual("from"); + node2.source = this.type === types$1.string ? this.parseExprAtom() : this.unexpected(); + } + this.semicolon(); + return this.finishNode(node2, "ImportDeclaration"); + }; + pp$8.parseImportSpecifiers = function() { + var nodes = [], first2 = true; + if (this.type === types$1.name) { + var node2 = this.startNode(); + node2.local = this.parseIdent(); + this.checkLValSimple(node2.local, BIND_LEXICAL); + nodes.push(this.finishNode(node2, "ImportDefaultSpecifier")); + if (!this.eat(types$1.comma)) { + return nodes; + } + } + if (this.type === types$1.star) { + var node$12 = this.startNode(); + this.next(); + this.expectContextual("as"); + node$12.local = this.parseIdent(); + this.checkLValSimple(node$12.local, BIND_LEXICAL); + nodes.push(this.finishNode(node$12, "ImportNamespaceSpecifier")); + return nodes; + } + this.expect(types$1.braceL); + while (!this.eat(types$1.braceR)) { + if (!first2) { + this.expect(types$1.comma); + if (this.afterTrailingComma(types$1.braceR)) { + break; + } + } else { + first2 = false; + } + var node$2 = this.startNode(); + node$2.imported = this.parseModuleExportName(); + if (this.eatContextual("as")) { + node$2.local = this.parseIdent(); + } else { + this.checkUnreserved(node$2.imported); + node$2.local = node$2.imported; + } + this.checkLValSimple(node$2.local, BIND_LEXICAL); + nodes.push(this.finishNode(node$2, "ImportSpecifier")); + } + return nodes; + }; + pp$8.parseModuleExportName = function() { + if (this.options.ecmaVersion >= 13 && this.type === types$1.string) { + var stringLiteral = this.parseLiteral(this.value); + if (loneSurrogate.test(stringLiteral.value)) { + this.raise(stringLiteral.start, "An export name cannot include a lone surrogate."); + } + return stringLiteral; + } + return this.parseIdent(true); + }; + pp$8.adaptDirectivePrologue = function(statements) { + for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) { + statements[i].directive = statements[i].expression.raw.slice(1, -1); + } + }; + pp$8.isDirectiveCandidate = function(statement) { + return this.options.ecmaVersion >= 5 && statement.type === "ExpressionStatement" && statement.expression.type === "Literal" && typeof statement.expression.value === "string" && // Reject parenthesized strings. + (this.input[statement.start] === '"' || this.input[statement.start] === "'"); + }; + pp$7 = Parser$1.prototype; + pp$7.toAssignable = function(node2, isBinding, refDestructuringErrors) { + if (this.options.ecmaVersion >= 6 && node2) { + switch (node2.type) { + case "Identifier": + if (this.inAsync && node2.name === "await") { + this.raise(node2.start, "Cannot use 'await' as identifier inside an async function"); + } + break; + case "ObjectPattern": + case "ArrayPattern": + case "AssignmentPattern": + case "RestElement": + break; + case "ObjectExpression": + node2.type = "ObjectPattern"; + if (refDestructuringErrors) { + this.checkPatternErrors(refDestructuringErrors, true); + } + for (var i = 0, list = node2.properties; i < list.length; i += 1) { + var prop = list[i]; + this.toAssignable(prop, isBinding); + if (prop.type === "RestElement" && (prop.argument.type === "ArrayPattern" || prop.argument.type === "ObjectPattern")) { + this.raise(prop.argument.start, "Unexpected token"); + } + } + break; + case "Property": + if (node2.kind !== "init") { + this.raise(node2.key.start, "Object pattern can't contain getter or setter"); + } + this.toAssignable(node2.value, isBinding); + break; + case "ArrayExpression": + node2.type = "ArrayPattern"; + if (refDestructuringErrors) { + this.checkPatternErrors(refDestructuringErrors, true); + } + this.toAssignableList(node2.elements, isBinding); + break; + case "SpreadElement": + node2.type = "RestElement"; + this.toAssignable(node2.argument, isBinding); + if (node2.argument.type === "AssignmentPattern") { + this.raise(node2.argument.start, "Rest elements cannot have a default value"); + } + break; + case "AssignmentExpression": + if (node2.operator !== "=") { + this.raise(node2.left.end, "Only '=' operator can be used for specifying default value."); + } + node2.type = "AssignmentPattern"; + delete node2.operator; + this.toAssignable(node2.left, isBinding); + break; + case "ParenthesizedExpression": + this.toAssignable(node2.expression, isBinding, refDestructuringErrors); + break; + case "ChainExpression": + this.raiseRecoverable(node2.start, "Optional chaining cannot appear in left-hand side"); + break; + case "MemberExpression": + if (!isBinding) { + break; + } + default: + this.raise(node2.start, "Assigning to rvalue"); + } + } else if (refDestructuringErrors) { + this.checkPatternErrors(refDestructuringErrors, true); + } + return node2; + }; + pp$7.toAssignableList = function(exprList, isBinding) { + var end = exprList.length; + for (var i = 0; i < end; i++) { + var elt = exprList[i]; + if (elt) { + this.toAssignable(elt, isBinding); + } + } + if (end) { + var last = exprList[end - 1]; + if (this.options.ecmaVersion === 6 && isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier") { + this.unexpected(last.argument.start); + } + } + return exprList; + }; + pp$7.parseSpread = function(refDestructuringErrors) { + var node2 = this.startNode(); + this.next(); + node2.argument = this.parseMaybeAssign(false, refDestructuringErrors); + return this.finishNode(node2, "SpreadElement"); + }; + pp$7.parseRestBinding = function() { + var node2 = this.startNode(); + this.next(); + if (this.options.ecmaVersion === 6 && this.type !== types$1.name) { + this.unexpected(); + } + node2.argument = this.parseBindingAtom(); + return this.finishNode(node2, "RestElement"); + }; + pp$7.parseBindingAtom = function() { + if (this.options.ecmaVersion >= 6) { + switch (this.type) { + case types$1.bracketL: + var node2 = this.startNode(); + this.next(); + node2.elements = this.parseBindingList(types$1.bracketR, true, true); + return this.finishNode(node2, "ArrayPattern"); + case types$1.braceL: + return this.parseObj(true); + } + } + return this.parseIdent(); + }; + pp$7.parseBindingList = function(close2, allowEmpty, allowTrailingComma) { + var elts = [], first2 = true; + while (!this.eat(close2)) { + if (first2) { + first2 = false; + } else { + this.expect(types$1.comma); + } + if (allowEmpty && this.type === types$1.comma) { + elts.push(null); + } else if (allowTrailingComma && this.afterTrailingComma(close2)) { + break; + } else if (this.type === types$1.ellipsis) { + var rest = this.parseRestBinding(); + this.parseBindingListItem(rest); + elts.push(rest); + if (this.type === types$1.comma) { + this.raise(this.start, "Comma is not permitted after the rest element"); + } + this.expect(close2); + break; + } else { + var elem = this.parseMaybeDefault(this.start, this.startLoc); + this.parseBindingListItem(elem); + elts.push(elem); + } + } + return elts; + }; + pp$7.parseBindingListItem = function(param) { + return param; + }; + pp$7.parseMaybeDefault = function(startPos, startLoc, left) { + left = left || this.parseBindingAtom(); + if (this.options.ecmaVersion < 6 || !this.eat(types$1.eq)) { + return left; + } + var node2 = this.startNodeAt(startPos, startLoc); + node2.left = left; + node2.right = this.parseMaybeAssign(); + return this.finishNode(node2, "AssignmentPattern"); + }; + pp$7.checkLValSimple = function(expr, bindingType, checkClashes) { + if (bindingType === void 0) + bindingType = BIND_NONE; + var isBind = bindingType !== BIND_NONE; + switch (expr.type) { + case "Identifier": + if (this.strict && this.reservedWordsStrictBind.test(expr.name)) { + this.raiseRecoverable(expr.start, (isBind ? "Binding " : "Assigning to ") + expr.name + " in strict mode"); + } + if (isBind) { + if (bindingType === BIND_LEXICAL && expr.name === "let") { + this.raiseRecoverable(expr.start, "let is disallowed as a lexically bound name"); + } + if (checkClashes) { + if (hasOwn(checkClashes, expr.name)) { + this.raiseRecoverable(expr.start, "Argument name clash"); + } + checkClashes[expr.name] = true; + } + if (bindingType !== BIND_OUTSIDE) { + this.declareName(expr.name, bindingType, expr.start); + } + } + break; + case "ChainExpression": + this.raiseRecoverable(expr.start, "Optional chaining cannot appear in left-hand side"); + break; + case "MemberExpression": + if (isBind) { + this.raiseRecoverable(expr.start, "Binding member expression"); + } + break; + case "ParenthesizedExpression": + if (isBind) { + this.raiseRecoverable(expr.start, "Binding parenthesized expression"); + } + return this.checkLValSimple(expr.expression, bindingType, checkClashes); + default: + this.raise(expr.start, (isBind ? "Binding" : "Assigning to") + " rvalue"); + } + }; + pp$7.checkLValPattern = function(expr, bindingType, checkClashes) { + if (bindingType === void 0) + bindingType = BIND_NONE; + switch (expr.type) { + case "ObjectPattern": + for (var i = 0, list = expr.properties; i < list.length; i += 1) { + var prop = list[i]; + this.checkLValInnerPattern(prop, bindingType, checkClashes); + } + break; + case "ArrayPattern": + for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) { + var elem = list$1[i$1]; + if (elem) { + this.checkLValInnerPattern(elem, bindingType, checkClashes); + } + } + break; + default: + this.checkLValSimple(expr, bindingType, checkClashes); + } + }; + pp$7.checkLValInnerPattern = function(expr, bindingType, checkClashes) { + if (bindingType === void 0) + bindingType = BIND_NONE; + switch (expr.type) { + case "Property": + this.checkLValInnerPattern(expr.value, bindingType, checkClashes); + break; + case "AssignmentPattern": + this.checkLValPattern(expr.left, bindingType, checkClashes); + break; + case "RestElement": + this.checkLValPattern(expr.argument, bindingType, checkClashes); + break; + default: + this.checkLValPattern(expr, bindingType, checkClashes); + } + }; + TokContext = function TokContext2(token, isExpr, preserveSpace, override, generator) { + this.token = token; + this.isExpr = !!isExpr; + this.preserveSpace = !!preserveSpace; + this.override = override; + this.generator = !!generator; + }; + types$2 = { + b_stat: new TokContext("{", false), + b_expr: new TokContext("{", true), + b_tmpl: new TokContext("${", false), + p_stat: new TokContext("(", false), + p_expr: new TokContext("(", true), + q_tmpl: new TokContext("`", true, true, function(p) { + return p.tryReadTemplateToken(); + }), + f_stat: new TokContext("function", false), + f_expr: new TokContext("function", true), + f_expr_gen: new TokContext("function", true, false, null, true), + f_gen: new TokContext("function", false, false, null, true) + }; + pp$6 = Parser$1.prototype; + pp$6.initialContext = function() { + return [types$2.b_stat]; + }; + pp$6.curContext = function() { + return this.context[this.context.length - 1]; + }; + pp$6.braceIsBlock = function(prevType) { + var parent = this.curContext(); + if (parent === types$2.f_expr || parent === types$2.f_stat) { + return true; + } + if (prevType === types$1.colon && (parent === types$2.b_stat || parent === types$2.b_expr)) { + return !parent.isExpr; + } + if (prevType === types$1._return || prevType === types$1.name && this.exprAllowed) { + return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)); + } + if (prevType === types$1._else || prevType === types$1.semi || prevType === types$1.eof || prevType === types$1.parenR || prevType === types$1.arrow) { + return true; + } + if (prevType === types$1.braceL) { + return parent === types$2.b_stat; + } + if (prevType === types$1._var || prevType === types$1._const || prevType === types$1.name) { + return false; + } + return !this.exprAllowed; + }; + pp$6.inGeneratorContext = function() { + for (var i = this.context.length - 1; i >= 1; i--) { + var context = this.context[i]; + if (context.token === "function") { + return context.generator; + } + } + return false; + }; + pp$6.updateContext = function(prevType) { + var update, type = this.type; + if (type.keyword && prevType === types$1.dot) { + this.exprAllowed = false; + } else if (update = type.updateContext) { + update.call(this, prevType); + } else { + this.exprAllowed = type.beforeExpr; + } + }; + pp$6.overrideContext = function(tokenCtx) { + if (this.curContext() !== tokenCtx) { + this.context[this.context.length - 1] = tokenCtx; + } + }; + types$1.parenR.updateContext = types$1.braceR.updateContext = function() { + if (this.context.length === 1) { + this.exprAllowed = true; + return; + } + var out = this.context.pop(); + if (out === types$2.b_stat && this.curContext().token === "function") { + out = this.context.pop(); + } + this.exprAllowed = !out.isExpr; + }; + types$1.braceL.updateContext = function(prevType) { + this.context.push(this.braceIsBlock(prevType) ? types$2.b_stat : types$2.b_expr); + this.exprAllowed = true; + }; + types$1.dollarBraceL.updateContext = function() { + this.context.push(types$2.b_tmpl); + this.exprAllowed = true; + }; + types$1.parenL.updateContext = function(prevType) { + var statementParens = prevType === types$1._if || prevType === types$1._for || prevType === types$1._with || prevType === types$1._while; + this.context.push(statementParens ? types$2.p_stat : types$2.p_expr); + this.exprAllowed = true; + }; + types$1.incDec.updateContext = function() { + }; + types$1._function.updateContext = types$1._class.updateContext = function(prevType) { + if (prevType.beforeExpr && prevType !== types$1._else && !(prevType === types$1.semi && this.curContext() !== types$2.p_stat) && !(prevType === types$1._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) && !((prevType === types$1.colon || prevType === types$1.braceL) && this.curContext() === types$2.b_stat)) { + this.context.push(types$2.f_expr); + } else { + this.context.push(types$2.f_stat); + } + this.exprAllowed = false; + }; + types$1.backQuote.updateContext = function() { + if (this.curContext() === types$2.q_tmpl) { + this.context.pop(); + } else { + this.context.push(types$2.q_tmpl); + } + this.exprAllowed = false; + }; + types$1.star.updateContext = function(prevType) { + if (prevType === types$1._function) { + var index = this.context.length - 1; + if (this.context[index] === types$2.f_expr) { + this.context[index] = types$2.f_expr_gen; + } else { + this.context[index] = types$2.f_gen; + } + } + this.exprAllowed = true; + }; + types$1.name.updateContext = function(prevType) { + var allowed = false; + if (this.options.ecmaVersion >= 6 && prevType !== types$1.dot) { + if (this.value === "of" && !this.exprAllowed || this.value === "yield" && this.inGeneratorContext()) { + allowed = true; + } + } + this.exprAllowed = allowed; + }; + pp$5 = Parser$1.prototype; + pp$5.checkPropClash = function(prop, propHash, refDestructuringErrors) { + if (this.options.ecmaVersion >= 9 && prop.type === "SpreadElement") { + return; + } + if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand)) { + return; + } + var key = prop.key; + var name2; + switch (key.type) { + case "Identifier": + name2 = key.name; + break; + case "Literal": + name2 = String(key.value); + break; + default: + return; + } + var kind = prop.kind; + if (this.options.ecmaVersion >= 6) { + if (name2 === "__proto__" && kind === "init") { + if (propHash.proto) { + if (refDestructuringErrors) { + if (refDestructuringErrors.doubleProto < 0) { + refDestructuringErrors.doubleProto = key.start; + } + } else { + this.raiseRecoverable(key.start, "Redefinition of __proto__ property"); + } + } + propHash.proto = true; + } + return; + } + name2 = "$" + name2; + var other = propHash[name2]; + if (other) { + var redefinition; + if (kind === "init") { + redefinition = this.strict && other.init || other.get || other.set; + } else { + redefinition = other.init || other[kind]; + } + if (redefinition) { + this.raiseRecoverable(key.start, "Redefinition of property"); + } + } else { + other = propHash[name2] = { + init: false, + get: false, + set: false + }; + } + other[kind] = true; + }; + pp$5.parseExpression = function(forInit, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeAssign(forInit, refDestructuringErrors); + if (this.type === types$1.comma) { + var node2 = this.startNodeAt(startPos, startLoc); + node2.expressions = [expr]; + while (this.eat(types$1.comma)) { + node2.expressions.push(this.parseMaybeAssign(forInit, refDestructuringErrors)); + } + return this.finishNode(node2, "SequenceExpression"); + } + return expr; + }; + pp$5.parseMaybeAssign = function(forInit, refDestructuringErrors, afterLeftParse) { + if (this.isContextual("yield")) { + if (this.inGenerator) { + return this.parseYield(forInit); + } else { + this.exprAllowed = false; + } + } + var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1, oldDoubleProto = -1; + if (refDestructuringErrors) { + oldParenAssign = refDestructuringErrors.parenthesizedAssign; + oldTrailingComma = refDestructuringErrors.trailingComma; + oldDoubleProto = refDestructuringErrors.doubleProto; + refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1; + } else { + refDestructuringErrors = new DestructuringErrors(); + ownDestructuringErrors = true; + } + var startPos = this.start, startLoc = this.startLoc; + if (this.type === types$1.parenL || this.type === types$1.name) { + this.potentialArrowAt = this.start; + this.potentialArrowInForAwait = forInit === "await"; + } + var left = this.parseMaybeConditional(forInit, refDestructuringErrors); + if (afterLeftParse) { + left = afterLeftParse.call(this, left, startPos, startLoc); + } + if (this.type.isAssign) { + var node2 = this.startNodeAt(startPos, startLoc); + node2.operator = this.value; + if (this.type === types$1.eq) { + left = this.toAssignable(left, false, refDestructuringErrors); + } + if (!ownDestructuringErrors) { + refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1; + } + if (refDestructuringErrors.shorthandAssign >= left.start) { + refDestructuringErrors.shorthandAssign = -1; + } + if (this.type === types$1.eq) { + this.checkLValPattern(left); + } else { + this.checkLValSimple(left); + } + node2.left = left; + this.next(); + node2.right = this.parseMaybeAssign(forInit); + if (oldDoubleProto > -1) { + refDestructuringErrors.doubleProto = oldDoubleProto; + } + return this.finishNode(node2, "AssignmentExpression"); + } else { + if (ownDestructuringErrors) { + this.checkExpressionErrors(refDestructuringErrors, true); + } + } + if (oldParenAssign > -1) { + refDestructuringErrors.parenthesizedAssign = oldParenAssign; + } + if (oldTrailingComma > -1) { + refDestructuringErrors.trailingComma = oldTrailingComma; + } + return left; + }; + pp$5.parseMaybeConditional = function(forInit, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprOps(forInit, refDestructuringErrors); + if (this.checkExpressionErrors(refDestructuringErrors)) { + return expr; + } + if (this.eat(types$1.question)) { + var node2 = this.startNodeAt(startPos, startLoc); + node2.test = expr; + node2.consequent = this.parseMaybeAssign(); + this.expect(types$1.colon); + node2.alternate = this.parseMaybeAssign(forInit); + return this.finishNode(node2, "ConditionalExpression"); + } + return expr; + }; + pp$5.parseExprOps = function(forInit, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeUnary(refDestructuringErrors, false, false, forInit); + if (this.checkExpressionErrors(refDestructuringErrors)) { + return expr; + } + return expr.start === startPos && expr.type === "ArrowFunctionExpression" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, forInit); + }; + pp$5.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, forInit) { + var prec = this.type.binop; + if (prec != null && (!forInit || this.type !== types$1._in)) { + if (prec > minPrec) { + var logical = this.type === types$1.logicalOR || this.type === types$1.logicalAND; + var coalesce = this.type === types$1.coalesce; + if (coalesce) { + prec = types$1.logicalAND.binop; + } + var op = this.value; + this.next(); + var startPos = this.start, startLoc = this.startLoc; + var right = this.parseExprOp(this.parseMaybeUnary(null, false, false, forInit), startPos, startLoc, prec, forInit); + var node2 = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical || coalesce); + if (logical && this.type === types$1.coalesce || coalesce && (this.type === types$1.logicalOR || this.type === types$1.logicalAND)) { + this.raiseRecoverable(this.start, "Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses"); + } + return this.parseExprOp(node2, leftStartPos, leftStartLoc, minPrec, forInit); + } + } + return left; + }; + pp$5.buildBinary = function(startPos, startLoc, left, right, op, logical) { + if (right.type === "PrivateIdentifier") { + this.raise(right.start, "Private identifier can only be left side of binary expression"); + } + var node2 = this.startNodeAt(startPos, startLoc); + node2.left = left; + node2.operator = op; + node2.right = right; + return this.finishNode(node2, logical ? "LogicalExpression" : "BinaryExpression"); + }; + pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forInit) { + var startPos = this.start, startLoc = this.startLoc, expr; + if (this.isContextual("await") && this.canAwait) { + expr = this.parseAwait(forInit); + sawUnary = true; + } else if (this.type.prefix) { + var node2 = this.startNode(), update = this.type === types$1.incDec; + node2.operator = this.value; + node2.prefix = true; + this.next(); + node2.argument = this.parseMaybeUnary(null, true, update, forInit); + this.checkExpressionErrors(refDestructuringErrors, true); + if (update) { + this.checkLValSimple(node2.argument); + } else if (this.strict && node2.operator === "delete" && node2.argument.type === "Identifier") { + this.raiseRecoverable(node2.start, "Deleting local variable in strict mode"); + } else if (node2.operator === "delete" && isPrivateFieldAccess(node2.argument)) { + this.raiseRecoverable(node2.start, "Private fields can not be deleted"); + } else { + sawUnary = true; + } + expr = this.finishNode(node2, update ? "UpdateExpression" : "UnaryExpression"); + } else if (!sawUnary && this.type === types$1.privateId) { + if (forInit || this.privateNameStack.length === 0) { + this.unexpected(); + } + expr = this.parsePrivateIdent(); + if (this.type !== types$1._in) { + this.unexpected(); + } + } else { + expr = this.parseExprSubscripts(refDestructuringErrors, forInit); + if (this.checkExpressionErrors(refDestructuringErrors)) { + return expr; + } + while (this.type.postfix && !this.canInsertSemicolon()) { + var node$12 = this.startNodeAt(startPos, startLoc); + node$12.operator = this.value; + node$12.prefix = false; + node$12.argument = expr; + this.checkLValSimple(expr); + this.next(); + expr = this.finishNode(node$12, "UpdateExpression"); + } + } + if (!incDec && this.eat(types$1.starstar)) { + if (sawUnary) { + this.unexpected(this.lastTokStart); + } else { + return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false, false, forInit), "**", false); + } + } else { + return expr; + } + }; + pp$5.parseExprSubscripts = function(refDestructuringErrors, forInit) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprAtom(refDestructuringErrors, forInit); + if (expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")") { + return expr; + } + var result = this.parseSubscripts(expr, startPos, startLoc, false, forInit); + if (refDestructuringErrors && result.type === "MemberExpression") { + if (refDestructuringErrors.parenthesizedAssign >= result.start) { + refDestructuringErrors.parenthesizedAssign = -1; + } + if (refDestructuringErrors.parenthesizedBind >= result.start) { + refDestructuringErrors.parenthesizedBind = -1; + } + if (refDestructuringErrors.trailingComma >= result.start) { + refDestructuringErrors.trailingComma = -1; + } + } + return result; + }; + pp$5.parseSubscripts = function(base2, startPos, startLoc, noCalls, forInit) { + var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base2.type === "Identifier" && base2.name === "async" && this.lastTokEnd === base2.end && !this.canInsertSemicolon() && base2.end - base2.start === 5 && this.potentialArrowAt === base2.start; + var optionalChained = false; + while (true) { + var element = this.parseSubscript(base2, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit); + if (element.optional) { + optionalChained = true; + } + if (element === base2 || element.type === "ArrowFunctionExpression") { + if (optionalChained) { + var chainNode = this.startNodeAt(startPos, startLoc); + chainNode.expression = element; + element = this.finishNode(chainNode, "ChainExpression"); + } + return element; + } + base2 = element; + } + }; + pp$5.parseSubscript = function(base2, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit) { + var optionalSupported = this.options.ecmaVersion >= 11; + var optional = optionalSupported && this.eat(types$1.questionDot); + if (noCalls && optional) { + this.raise(this.lastTokStart, "Optional chaining cannot appear in the callee of new expressions"); + } + var computed = this.eat(types$1.bracketL); + if (computed || optional && this.type !== types$1.parenL && this.type !== types$1.backQuote || this.eat(types$1.dot)) { + var node2 = this.startNodeAt(startPos, startLoc); + node2.object = base2; + if (computed) { + node2.property = this.parseExpression(); + this.expect(types$1.bracketR); + } else if (this.type === types$1.privateId && base2.type !== "Super") { + node2.property = this.parsePrivateIdent(); + } else { + node2.property = this.parseIdent(this.options.allowReserved !== "never"); + } + node2.computed = !!computed; + if (optionalSupported) { + node2.optional = optional; + } + base2 = this.finishNode(node2, "MemberExpression"); + } else if (!noCalls && this.eat(types$1.parenL)) { + var refDestructuringErrors = new DestructuringErrors(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + var exprList = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors); + if (maybeAsyncArrow && !optional && !this.canInsertSemicolon() && this.eat(types$1.arrow)) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + if (this.awaitIdentPos > 0) { + this.raise(this.awaitIdentPos, "Cannot use 'await' as identifier inside an async function"); + } + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true, forInit); + } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos; + var node$12 = this.startNodeAt(startPos, startLoc); + node$12.callee = base2; + node$12.arguments = exprList; + if (optionalSupported) { + node$12.optional = optional; + } + base2 = this.finishNode(node$12, "CallExpression"); + } else if (this.type === types$1.backQuote) { + if (optional || optionalChained) { + this.raise(this.start, "Optional chaining cannot appear in the tag of tagged template expressions"); + } + var node$2 = this.startNodeAt(startPos, startLoc); + node$2.tag = base2; + node$2.quasi = this.parseTemplate({ isTagged: true }); + base2 = this.finishNode(node$2, "TaggedTemplateExpression"); + } + return base2; + }; + pp$5.parseExprAtom = function(refDestructuringErrors, forInit) { + if (this.type === types$1.slash) { + this.readRegexp(); + } + var node2, canBeArrow = this.potentialArrowAt === this.start; + switch (this.type) { + case types$1._super: + if (!this.allowSuper) { + this.raise(this.start, "'super' keyword outside a method"); + } + node2 = this.startNode(); + this.next(); + if (this.type === types$1.parenL && !this.allowDirectSuper) { + this.raise(node2.start, "super() call outside constructor of a subclass"); + } + if (this.type !== types$1.dot && this.type !== types$1.bracketL && this.type !== types$1.parenL) { + this.unexpected(); + } + return this.finishNode(node2, "Super"); + case types$1._this: + node2 = this.startNode(); + this.next(); + return this.finishNode(node2, "ThisExpression"); + case types$1.name: + var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc; + var id = this.parseIdent(false); + if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === "async" && !this.canInsertSemicolon() && this.eat(types$1._function)) { + this.overrideContext(types$2.f_expr); + return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true, forInit); + } + if (canBeArrow && !this.canInsertSemicolon()) { + if (this.eat(types$1.arrow)) { + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false, forInit); + } + if (this.options.ecmaVersion >= 8 && id.name === "async" && this.type === types$1.name && !containsEsc && (!this.potentialArrowInForAwait || this.value !== "of" || this.containsEsc)) { + id = this.parseIdent(false); + if (this.canInsertSemicolon() || !this.eat(types$1.arrow)) { + this.unexpected(); + } + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true, forInit); + } + } + return id; + case types$1.regexp: + var value2 = this.value; + node2 = this.parseLiteral(value2.value); + node2.regex = { pattern: value2.pattern, flags: value2.flags }; + return node2; + case types$1.num: + case types$1.string: + return this.parseLiteral(this.value); + case types$1._null: + case types$1._true: + case types$1._false: + node2 = this.startNode(); + node2.value = this.type === types$1._null ? null : this.type === types$1._true; + node2.raw = this.type.keyword; + this.next(); + return this.finishNode(node2, "Literal"); + case types$1.parenL: + var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow, forInit); + if (refDestructuringErrors) { + if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr)) { + refDestructuringErrors.parenthesizedAssign = start; + } + if (refDestructuringErrors.parenthesizedBind < 0) { + refDestructuringErrors.parenthesizedBind = start; + } + } + return expr; + case types$1.bracketL: + node2 = this.startNode(); + this.next(); + node2.elements = this.parseExprList(types$1.bracketR, true, true, refDestructuringErrors); + return this.finishNode(node2, "ArrayExpression"); + case types$1.braceL: + this.overrideContext(types$2.b_expr); + return this.parseObj(false, refDestructuringErrors); + case types$1._function: + node2 = this.startNode(); + this.next(); + return this.parseFunction(node2, 0); + case types$1._class: + return this.parseClass(this.startNode(), false); + case types$1._new: + return this.parseNew(); + case types$1.backQuote: + return this.parseTemplate(); + case types$1._import: + if (this.options.ecmaVersion >= 11) { + return this.parseExprImport(); + } else { + return this.unexpected(); + } + default: + this.unexpected(); + } + }; + pp$5.parseExprImport = function() { + var node2 = this.startNode(); + if (this.containsEsc) { + this.raiseRecoverable(this.start, "Escape sequence in keyword import"); + } + var meta = this.parseIdent(true); + switch (this.type) { + case types$1.parenL: + return this.parseDynamicImport(node2); + case types$1.dot: + node2.meta = meta; + return this.parseImportMeta(node2); + default: + this.unexpected(); + } + }; + pp$5.parseDynamicImport = function(node2) { + this.next(); + node2.source = this.parseMaybeAssign(); + if (!this.eat(types$1.parenR)) { + var errorPos = this.start; + if (this.eat(types$1.comma) && this.eat(types$1.parenR)) { + this.raiseRecoverable(errorPos, "Trailing comma is not allowed in import()"); + } else { + this.unexpected(errorPos); + } + } + return this.finishNode(node2, "ImportExpression"); + }; + pp$5.parseImportMeta = function(node2) { + this.next(); + var containsEsc = this.containsEsc; + node2.property = this.parseIdent(true); + if (node2.property.name !== "meta") { + this.raiseRecoverable(node2.property.start, "The only valid meta property for import is 'import.meta'"); + } + if (containsEsc) { + this.raiseRecoverable(node2.start, "'import.meta' must not contain escaped characters"); + } + if (this.options.sourceType !== "module" && !this.options.allowImportExportEverywhere) { + this.raiseRecoverable(node2.start, "Cannot use 'import.meta' outside a module"); + } + return this.finishNode(node2, "MetaProperty"); + }; + pp$5.parseLiteral = function(value2) { + var node2 = this.startNode(); + node2.value = value2; + node2.raw = this.input.slice(this.start, this.end); + if (node2.raw.charCodeAt(node2.raw.length - 1) === 110) { + node2.bigint = node2.raw.slice(0, -1).replace(/_/g, ""); + } + this.next(); + return this.finishNode(node2, "Literal"); + }; + pp$5.parseParenExpression = function() { + this.expect(types$1.parenL); + var val = this.parseExpression(); + this.expect(types$1.parenR); + return val; + }; + pp$5.parseParenAndDistinguishExpression = function(canBeArrow, forInit) { + var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8; + if (this.options.ecmaVersion >= 6) { + this.next(); + var innerStartPos = this.start, innerStartLoc = this.startLoc; + var exprList = [], first2 = true, lastIsComma = false; + var refDestructuringErrors = new DestructuringErrors(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart; + this.yieldPos = 0; + this.awaitPos = 0; + while (this.type !== types$1.parenR) { + first2 ? first2 = false : this.expect(types$1.comma); + if (allowTrailingComma && this.afterTrailingComma(types$1.parenR, true)) { + lastIsComma = true; + break; + } else if (this.type === types$1.ellipsis) { + spreadStart = this.start; + exprList.push(this.parseParenItem(this.parseRestBinding())); + if (this.type === types$1.comma) { + this.raise(this.start, "Comma is not permitted after the rest element"); + } + break; + } else { + exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem)); + } + } + var innerEndPos = this.lastTokEnd, innerEndLoc = this.lastTokEndLoc; + this.expect(types$1.parenR); + if (canBeArrow && !this.canInsertSemicolon() && this.eat(types$1.arrow)) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + return this.parseParenArrowList(startPos, startLoc, exprList, forInit); + } + if (!exprList.length || lastIsComma) { + this.unexpected(this.lastTokStart); + } + if (spreadStart) { + this.unexpected(spreadStart); + } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + if (exprList.length > 1) { + val = this.startNodeAt(innerStartPos, innerStartLoc); + val.expressions = exprList; + this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc); + } else { + val = exprList[0]; + } + } else { + val = this.parseParenExpression(); + } + if (this.options.preserveParens) { + var par = this.startNodeAt(startPos, startLoc); + par.expression = val; + return this.finishNode(par, "ParenthesizedExpression"); + } else { + return val; + } + }; + pp$5.parseParenItem = function(item) { + return item; + }; + pp$5.parseParenArrowList = function(startPos, startLoc, exprList, forInit) { + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, false, forInit); + }; + empty = []; + pp$5.parseNew = function() { + if (this.containsEsc) { + this.raiseRecoverable(this.start, "Escape sequence in keyword new"); + } + var node2 = this.startNode(); + var meta = this.parseIdent(true); + if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) { + node2.meta = meta; + var containsEsc = this.containsEsc; + node2.property = this.parseIdent(true); + if (node2.property.name !== "target") { + this.raiseRecoverable(node2.property.start, "The only valid meta property for new is 'new.target'"); + } + if (containsEsc) { + this.raiseRecoverable(node2.start, "'new.target' must not contain escaped characters"); + } + if (!this.allowNewDotTarget) { + this.raiseRecoverable(node2.start, "'new.target' can only be used in functions and class static block"); + } + return this.finishNode(node2, "MetaProperty"); + } + var startPos = this.start, startLoc = this.startLoc, isImport = this.type === types$1._import; + node2.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true, false); + if (isImport && node2.callee.type === "ImportExpression") { + this.raise(startPos, "Cannot use new with import()"); + } + if (this.eat(types$1.parenL)) { + node2.arguments = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false); + } else { + node2.arguments = empty; + } + return this.finishNode(node2, "NewExpression"); + }; + pp$5.parseTemplateElement = function(ref2) { + var isTagged = ref2.isTagged; + var elem = this.startNode(); + if (this.type === types$1.invalidTemplate) { + if (!isTagged) { + this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal"); + } + elem.value = { + raw: this.value, + cooked: null + }; + } else { + elem.value = { + raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, "\n"), + cooked: this.value + }; + } + this.next(); + elem.tail = this.type === types$1.backQuote; + return this.finishNode(elem, "TemplateElement"); + }; + pp$5.parseTemplate = function(ref2) { + if (ref2 === void 0) + ref2 = {}; + var isTagged = ref2.isTagged; + if (isTagged === void 0) + isTagged = false; + var node2 = this.startNode(); + this.next(); + node2.expressions = []; + var curElt = this.parseTemplateElement({ isTagged }); + node2.quasis = [curElt]; + while (!curElt.tail) { + if (this.type === types$1.eof) { + this.raise(this.pos, "Unterminated template literal"); + } + this.expect(types$1.dollarBraceL); + node2.expressions.push(this.parseExpression()); + this.expect(types$1.braceR); + node2.quasis.push(curElt = this.parseTemplateElement({ isTagged })); + } + this.next(); + return this.finishNode(node2, "TemplateLiteral"); + }; + pp$5.isAsyncProp = function(prop) { + return !prop.computed && prop.key.type === "Identifier" && prop.key.name === "async" && (this.type === types$1.name || this.type === types$1.num || this.type === types$1.string || this.type === types$1.bracketL || this.type.keyword || this.options.ecmaVersion >= 9 && this.type === types$1.star) && !lineBreak.test(this.input.slice(this.lastTokEnd, this.start)); + }; + pp$5.parseObj = function(isPattern, refDestructuringErrors) { + var node2 = this.startNode(), first2 = true, propHash = {}; + node2.properties = []; + this.next(); + while (!this.eat(types$1.braceR)) { + if (!first2) { + this.expect(types$1.comma); + if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types$1.braceR)) { + break; + } + } else { + first2 = false; + } + var prop = this.parseProperty(isPattern, refDestructuringErrors); + if (!isPattern) { + this.checkPropClash(prop, propHash, refDestructuringErrors); + } + node2.properties.push(prop); + } + return this.finishNode(node2, isPattern ? "ObjectPattern" : "ObjectExpression"); + }; + pp$5.parseProperty = function(isPattern, refDestructuringErrors) { + var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc; + if (this.options.ecmaVersion >= 9 && this.eat(types$1.ellipsis)) { + if (isPattern) { + prop.argument = this.parseIdent(false); + if (this.type === types$1.comma) { + this.raise(this.start, "Comma is not permitted after the rest element"); + } + return this.finishNode(prop, "RestElement"); + } + prop.argument = this.parseMaybeAssign(false, refDestructuringErrors); + if (this.type === types$1.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) { + refDestructuringErrors.trailingComma = this.start; + } + return this.finishNode(prop, "SpreadElement"); + } + if (this.options.ecmaVersion >= 6) { + prop.method = false; + prop.shorthand = false; + if (isPattern || refDestructuringErrors) { + startPos = this.start; + startLoc = this.startLoc; + } + if (!isPattern) { + isGenerator = this.eat(types$1.star); + } + } + var containsEsc = this.containsEsc; + this.parsePropertyName(prop); + if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(types$1.star); + this.parsePropertyName(prop); + } else { + isAsync = false; + } + this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc); + return this.finishNode(prop, "Property"); + }; + pp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) { + if ((isGenerator || isAsync) && this.type === types$1.colon) { + this.unexpected(); + } + if (this.eat(types$1.colon)) { + prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors); + prop.kind = "init"; + } else if (this.options.ecmaVersion >= 6 && this.type === types$1.parenL) { + if (isPattern) { + this.unexpected(); + } + prop.kind = "init"; + prop.method = true; + prop.value = this.parseMethod(isGenerator, isAsync); + } else if (!isPattern && !containsEsc && this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && (prop.key.name === "get" || prop.key.name === "set") && (this.type !== types$1.comma && this.type !== types$1.braceR && this.type !== types$1.eq)) { + if (isGenerator || isAsync) { + this.unexpected(); + } + prop.kind = prop.key.name; + this.parsePropertyName(prop); + prop.value = this.parseMethod(false); + var paramCount = prop.kind === "get" ? 0 : 1; + if (prop.value.params.length !== paramCount) { + var start = prop.value.start; + if (prop.kind === "get") { + this.raiseRecoverable(start, "getter should have no params"); + } else { + this.raiseRecoverable(start, "setter should have exactly one param"); + } + } else { + if (prop.kind === "set" && prop.value.params[0].type === "RestElement") { + this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params"); + } + } + } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") { + if (isGenerator || isAsync) { + this.unexpected(); + } + this.checkUnreserved(prop.key); + if (prop.key.name === "await" && !this.awaitIdentPos) { + this.awaitIdentPos = startPos; + } + prop.kind = "init"; + if (isPattern) { + prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key)); + } else if (this.type === types$1.eq && refDestructuringErrors) { + if (refDestructuringErrors.shorthandAssign < 0) { + refDestructuringErrors.shorthandAssign = this.start; + } + prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key)); + } else { + prop.value = this.copyNode(prop.key); + } + prop.shorthand = true; + } else { + this.unexpected(); + } + }; + pp$5.parsePropertyName = function(prop) { + if (this.options.ecmaVersion >= 6) { + if (this.eat(types$1.bracketL)) { + prop.computed = true; + prop.key = this.parseMaybeAssign(); + this.expect(types$1.bracketR); + return prop.key; + } else { + prop.computed = false; + } + } + return prop.key = this.type === types$1.num || this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== "never"); + }; + pp$5.initFunction = function(node2) { + node2.id = null; + if (this.options.ecmaVersion >= 6) { + node2.generator = node2.expression = false; + } + if (this.options.ecmaVersion >= 8) { + node2.async = false; + } + }; + pp$5.parseMethod = function(isGenerator, isAsync, allowDirectSuper) { + var node2 = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.initFunction(node2); + if (this.options.ecmaVersion >= 6) { + node2.generator = isGenerator; + } + if (this.options.ecmaVersion >= 8) { + node2.async = !!isAsync; + } + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + this.enterScope(functionFlags(isAsync, node2.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0)); + this.expect(types$1.parenL); + node2.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); + this.parseFunctionBody(node2, false, true, false); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node2, "FunctionExpression"); + }; + pp$5.parseArrowExpression = function(node2, params, isAsync, forInit) { + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW); + this.initFunction(node2); + if (this.options.ecmaVersion >= 8) { + node2.async = !!isAsync; + } + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + node2.params = this.toAssignableList(params, true); + this.parseFunctionBody(node2, true, false, forInit); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node2, "ArrowFunctionExpression"); + }; + pp$5.parseFunctionBody = function(node2, isArrowFunction, isMethod, forInit) { + var isExpression = isArrowFunction && this.type !== types$1.braceL; + var oldStrict = this.strict, useStrict = false; + if (isExpression) { + node2.body = this.parseMaybeAssign(forInit); + node2.expression = true; + this.checkParams(node2, false); + } else { + var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node2.params); + if (!oldStrict || nonSimple) { + useStrict = this.strictDirective(this.end); + if (useStrict && nonSimple) { + this.raiseRecoverable(node2.start, "Illegal 'use strict' directive in function with non-simple parameter list"); + } + } + var oldLabels = this.labels; + this.labels = []; + if (useStrict) { + this.strict = true; + } + this.checkParams(node2, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node2.params)); + if (this.strict && node2.id) { + this.checkLValSimple(node2.id, BIND_OUTSIDE); + } + node2.body = this.parseBlock(false, void 0, useStrict && !oldStrict); + node2.expression = false; + this.adaptDirectivePrologue(node2.body.body); + this.labels = oldLabels; + } + this.exitScope(); + }; + pp$5.isSimpleParamList = function(params) { + for (var i = 0, list = params; i < list.length; i += 1) { + var param = list[i]; + if (param.type !== "Identifier") { + return false; + } + } + return true; + }; + pp$5.checkParams = function(node2, allowDuplicates) { + var nameHash = /* @__PURE__ */ Object.create(null); + for (var i = 0, list = node2.params; i < list.length; i += 1) { + var param = list[i]; + this.checkLValInnerPattern(param, BIND_VAR, allowDuplicates ? null : nameHash); + } + }; + pp$5.parseExprList = function(close2, allowTrailingComma, allowEmpty, refDestructuringErrors) { + var elts = [], first2 = true; + while (!this.eat(close2)) { + if (!first2) { + this.expect(types$1.comma); + if (allowTrailingComma && this.afterTrailingComma(close2)) { + break; + } + } else { + first2 = false; + } + var elt = void 0; + if (allowEmpty && this.type === types$1.comma) { + elt = null; + } else if (this.type === types$1.ellipsis) { + elt = this.parseSpread(refDestructuringErrors); + if (refDestructuringErrors && this.type === types$1.comma && refDestructuringErrors.trailingComma < 0) { + refDestructuringErrors.trailingComma = this.start; + } + } else { + elt = this.parseMaybeAssign(false, refDestructuringErrors); + } + elts.push(elt); + } + return elts; + }; + pp$5.checkUnreserved = function(ref2) { + var start = ref2.start; + var end = ref2.end; + var name2 = ref2.name; + if (this.inGenerator && name2 === "yield") { + this.raiseRecoverable(start, "Cannot use 'yield' as identifier inside a generator"); + } + if (this.inAsync && name2 === "await") { + this.raiseRecoverable(start, "Cannot use 'await' as identifier inside an async function"); + } + if (this.currentThisScope().inClassFieldInit && name2 === "arguments") { + this.raiseRecoverable(start, "Cannot use 'arguments' in class field initializer"); + } + if (this.inClassStaticBlock && (name2 === "arguments" || name2 === "await")) { + this.raise(start, "Cannot use " + name2 + " in class static initialization block"); + } + if (this.keywords.test(name2)) { + this.raise(start, "Unexpected keyword '" + name2 + "'"); + } + if (this.options.ecmaVersion < 6 && this.input.slice(start, end).indexOf("\\") !== -1) { + return; + } + var re = this.strict ? this.reservedWordsStrict : this.reservedWords; + if (re.test(name2)) { + if (!this.inAsync && name2 === "await") { + this.raiseRecoverable(start, "Cannot use keyword 'await' outside an async function"); + } + this.raiseRecoverable(start, "The keyword '" + name2 + "' is reserved"); + } + }; + pp$5.parseIdent = function(liberal) { + var node2 = this.startNode(); + if (this.type === types$1.name) { + node2.name = this.value; + } else if (this.type.keyword) { + node2.name = this.type.keyword; + if ((node2.name === "class" || node2.name === "function") && (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) { + this.context.pop(); + } + } else { + this.unexpected(); + } + this.next(!!liberal); + this.finishNode(node2, "Identifier"); + if (!liberal) { + this.checkUnreserved(node2); + if (node2.name === "await" && !this.awaitIdentPos) { + this.awaitIdentPos = node2.start; + } + } + return node2; + }; + pp$5.parsePrivateIdent = function() { + var node2 = this.startNode(); + if (this.type === types$1.privateId) { + node2.name = this.value; + } else { + this.unexpected(); + } + this.next(); + this.finishNode(node2, "PrivateIdentifier"); + if (this.privateNameStack.length === 0) { + this.raise(node2.start, "Private field '#" + node2.name + "' must be declared in an enclosing class"); + } else { + this.privateNameStack[this.privateNameStack.length - 1].used.push(node2); + } + return node2; + }; + pp$5.parseYield = function(forInit) { + if (!this.yieldPos) { + this.yieldPos = this.start; + } + var node2 = this.startNode(); + this.next(); + if (this.type === types$1.semi || this.canInsertSemicolon() || this.type !== types$1.star && !this.type.startsExpr) { + node2.delegate = false; + node2.argument = null; + } else { + node2.delegate = this.eat(types$1.star); + node2.argument = this.parseMaybeAssign(forInit); + } + return this.finishNode(node2, "YieldExpression"); + }; + pp$5.parseAwait = function(forInit) { + if (!this.awaitPos) { + this.awaitPos = this.start; + } + var node2 = this.startNode(); + this.next(); + node2.argument = this.parseMaybeUnary(null, true, false, forInit); + return this.finishNode(node2, "AwaitExpression"); + }; + pp$4 = Parser$1.prototype; + pp$4.raise = function(pos, message) { + var loc = getLineInfo(this.input, pos); + message += " (" + loc.line + ":" + loc.column + ")"; + var err = new SyntaxError(message); + err.pos = pos; + err.loc = loc; + err.raisedAt = this.pos; + throw err; + }; + pp$4.raiseRecoverable = pp$4.raise; + pp$4.curPosition = function() { + if (this.options.locations) { + return new Position(this.curLine, this.pos - this.lineStart); + } + }; + pp$3 = Parser$1.prototype; + Scope = function Scope2(flags) { + this.flags = flags; + this.var = []; + this.lexical = []; + this.functions = []; + this.inClassFieldInit = false; + }; + pp$3.enterScope = function(flags) { + this.scopeStack.push(new Scope(flags)); + }; + pp$3.exitScope = function() { + this.scopeStack.pop(); + }; + pp$3.treatFunctionsAsVarInScope = function(scope) { + return scope.flags & SCOPE_FUNCTION || !this.inModule && scope.flags & SCOPE_TOP; + }; + pp$3.declareName = function(name2, bindingType, pos) { + var redeclared = false; + if (bindingType === BIND_LEXICAL) { + var scope = this.currentScope(); + redeclared = scope.lexical.indexOf(name2) > -1 || scope.functions.indexOf(name2) > -1 || scope.var.indexOf(name2) > -1; + scope.lexical.push(name2); + if (this.inModule && scope.flags & SCOPE_TOP) { + delete this.undefinedExports[name2]; + } + } else if (bindingType === BIND_SIMPLE_CATCH) { + var scope$1 = this.currentScope(); + scope$1.lexical.push(name2); + } else if (bindingType === BIND_FUNCTION) { + var scope$2 = this.currentScope(); + if (this.treatFunctionsAsVar) { + redeclared = scope$2.lexical.indexOf(name2) > -1; + } else { + redeclared = scope$2.lexical.indexOf(name2) > -1 || scope$2.var.indexOf(name2) > -1; + } + scope$2.functions.push(name2); + } else { + for (var i = this.scopeStack.length - 1; i >= 0; --i) { + var scope$3 = this.scopeStack[i]; + if (scope$3.lexical.indexOf(name2) > -1 && !(scope$3.flags & SCOPE_SIMPLE_CATCH && scope$3.lexical[0] === name2) || !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name2) > -1) { + redeclared = true; + break; + } + scope$3.var.push(name2); + if (this.inModule && scope$3.flags & SCOPE_TOP) { + delete this.undefinedExports[name2]; + } + if (scope$3.flags & SCOPE_VAR) { + break; + } + } + } + if (redeclared) { + this.raiseRecoverable(pos, "Identifier '" + name2 + "' has already been declared"); + } + }; + pp$3.checkLocalExport = function(id) { + if (this.scopeStack[0].lexical.indexOf(id.name) === -1 && this.scopeStack[0].var.indexOf(id.name) === -1) { + this.undefinedExports[id.name] = id; + } + }; + pp$3.currentScope = function() { + return this.scopeStack[this.scopeStack.length - 1]; + }; + pp$3.currentVarScope = function() { + for (var i = this.scopeStack.length - 1; ; i--) { + var scope = this.scopeStack[i]; + if (scope.flags & SCOPE_VAR) { + return scope; + } + } + }; + pp$3.currentThisScope = function() { + for (var i = this.scopeStack.length - 1; ; i--) { + var scope = this.scopeStack[i]; + if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { + return scope; + } + } + }; + Node = function Node2(parser, pos, loc) { + this.type = ""; + this.start = pos; + this.end = 0; + if (parser.options.locations) { + this.loc = new SourceLocation(parser, loc); + } + if (parser.options.directSourceFile) { + this.sourceFile = parser.options.directSourceFile; + } + if (parser.options.ranges) { + this.range = [pos, 0]; + } + }; + pp$2 = Parser$1.prototype; + pp$2.startNode = function() { + return new Node(this, this.start, this.startLoc); + }; + pp$2.startNodeAt = function(pos, loc) { + return new Node(this, pos, loc); + }; + pp$2.finishNode = function(node2, type) { + return finishNodeAt.call(this, node2, type, this.lastTokEnd, this.lastTokEndLoc); + }; + pp$2.finishNodeAt = function(node2, type, pos, loc) { + return finishNodeAt.call(this, node2, type, pos, loc); + }; + pp$2.copyNode = function(node2) { + var newNode = new Node(this, node2.start, this.startLoc); + for (var prop in node2) { + newNode[prop] = node2[prop]; + } + return newNode; + }; + ecma9BinaryProperties = "ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS"; + ecma10BinaryProperties = ecma9BinaryProperties + " Extended_Pictographic"; + ecma11BinaryProperties = ecma10BinaryProperties; + ecma12BinaryProperties = ecma11BinaryProperties + " EBase EComp EMod EPres ExtPict"; + ecma13BinaryProperties = ecma12BinaryProperties; + ecma14BinaryProperties = ecma13BinaryProperties; + unicodeBinaryProperties = { + 9: ecma9BinaryProperties, + 10: ecma10BinaryProperties, + 11: ecma11BinaryProperties, + 12: ecma12BinaryProperties, + 13: ecma13BinaryProperties, + 14: ecma14BinaryProperties + }; + unicodeGeneralCategoryValues = "Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu"; + ecma9ScriptValues = "Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb"; + ecma10ScriptValues = ecma9ScriptValues + " Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd"; + ecma11ScriptValues = ecma10ScriptValues + " Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho"; + ecma12ScriptValues = ecma11ScriptValues + " Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi"; + ecma13ScriptValues = ecma12ScriptValues + " Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith"; + ecma14ScriptValues = ecma13ScriptValues + " Kawi Nag_Mundari Nagm"; + unicodeScriptValues = { + 9: ecma9ScriptValues, + 10: ecma10ScriptValues, + 11: ecma11ScriptValues, + 12: ecma12ScriptValues, + 13: ecma13ScriptValues, + 14: ecma14ScriptValues + }; + data = {}; + for (i$1 = 0, list = [9, 10, 11, 12, 13, 14]; i$1 < list.length; i$1 += 1) { + ecmaVersion = list[i$1]; + buildUnicodeData(ecmaVersion); + } + pp$1 = Parser$1.prototype; + RegExpValidationState = function RegExpValidationState2(parser) { + this.parser = parser; + this.validFlags = "gim" + (parser.options.ecmaVersion >= 6 ? "uy" : "") + (parser.options.ecmaVersion >= 9 ? "s" : "") + (parser.options.ecmaVersion >= 13 ? "d" : ""); + this.unicodeProperties = data[parser.options.ecmaVersion >= 14 ? 14 : parser.options.ecmaVersion]; + this.source = ""; + this.flags = ""; + this.start = 0; + this.switchU = false; + this.switchN = false; + this.pos = 0; + this.lastIntValue = 0; + this.lastStringValue = ""; + this.lastAssertionIsQuantifiable = false; + this.numCapturingParens = 0; + this.maxBackReference = 0; + this.groupNames = []; + this.backReferenceNames = []; + }; + RegExpValidationState.prototype.reset = function reset(start, pattern2, flags) { + var unicode = flags.indexOf("u") !== -1; + this.start = start | 0; + this.source = pattern2 + ""; + this.flags = flags; + this.switchU = unicode && this.parser.options.ecmaVersion >= 6; + this.switchN = unicode && this.parser.options.ecmaVersion >= 9; + }; + RegExpValidationState.prototype.raise = function raise(message) { + this.parser.raiseRecoverable(this.start, "Invalid regular expression: /" + this.source + "/: " + message); + }; + RegExpValidationState.prototype.at = function at(i, forceU) { + if (forceU === void 0) + forceU = false; + var s = this.source; + var l = s.length; + if (i >= l) { + return -1; + } + var c = s.charCodeAt(i); + if (!(forceU || this.switchU) || c <= 55295 || c >= 57344 || i + 1 >= l) { + return c; + } + var next = s.charCodeAt(i + 1); + return next >= 56320 && next <= 57343 ? (c << 10) + next - 56613888 : c; + }; + RegExpValidationState.prototype.nextIndex = function nextIndex(i, forceU) { + if (forceU === void 0) + forceU = false; + var s = this.source; + var l = s.length; + if (i >= l) { + return l; + } + var c = s.charCodeAt(i), next; + if (!(forceU || this.switchU) || c <= 55295 || c >= 57344 || i + 1 >= l || (next = s.charCodeAt(i + 1)) < 56320 || next > 57343) { + return i + 1; + } + return i + 2; + }; + RegExpValidationState.prototype.current = function current(forceU) { + if (forceU === void 0) + forceU = false; + return this.at(this.pos, forceU); + }; + RegExpValidationState.prototype.lookahead = function lookahead(forceU) { + if (forceU === void 0) + forceU = false; + return this.at(this.nextIndex(this.pos, forceU), forceU); + }; + RegExpValidationState.prototype.advance = function advance(forceU) { + if (forceU === void 0) + forceU = false; + this.pos = this.nextIndex(this.pos, forceU); + }; + RegExpValidationState.prototype.eat = function eat(ch, forceU) { + if (forceU === void 0) + forceU = false; + if (this.current(forceU) === ch) { + this.advance(forceU); + return true; + } + return false; + }; + pp$1.validateRegExpFlags = function(state) { + var validFlags = state.validFlags; + var flags = state.flags; + for (var i = 0; i < flags.length; i++) { + var flag = flags.charAt(i); + if (validFlags.indexOf(flag) === -1) { + this.raise(state.start, "Invalid regular expression flag"); + } + if (flags.indexOf(flag, i + 1) > -1) { + this.raise(state.start, "Duplicate regular expression flag"); + } + } + }; + pp$1.validateRegExpPattern = function(state) { + this.regexp_pattern(state); + if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) { + state.switchN = true; + this.regexp_pattern(state); + } + }; + pp$1.regexp_pattern = function(state) { + state.pos = 0; + state.lastIntValue = 0; + state.lastStringValue = ""; + state.lastAssertionIsQuantifiable = false; + state.numCapturingParens = 0; + state.maxBackReference = 0; + state.groupNames.length = 0; + state.backReferenceNames.length = 0; + this.regexp_disjunction(state); + if (state.pos !== state.source.length) { + if (state.eat( + 41 + /* ) */ + )) { + state.raise("Unmatched ')'"); + } + if (state.eat( + 93 + /* ] */ + ) || state.eat( + 125 + /* } */ + )) { + state.raise("Lone quantifier brackets"); + } + } + if (state.maxBackReference > state.numCapturingParens) { + state.raise("Invalid escape"); + } + for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) { + var name2 = list[i]; + if (state.groupNames.indexOf(name2) === -1) { + state.raise("Invalid named capture referenced"); + } + } + }; + pp$1.regexp_disjunction = function(state) { + this.regexp_alternative(state); + while (state.eat( + 124 + /* | */ + )) { + this.regexp_alternative(state); + } + if (this.regexp_eatQuantifier(state, true)) { + state.raise("Nothing to repeat"); + } + if (state.eat( + 123 + /* { */ + )) { + state.raise("Lone quantifier brackets"); + } + }; + pp$1.regexp_alternative = function(state) { + while (state.pos < state.source.length && this.regexp_eatTerm(state)) { + } + }; + pp$1.regexp_eatTerm = function(state) { + if (this.regexp_eatAssertion(state)) { + if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) { + if (state.switchU) { + state.raise("Invalid quantifier"); + } + } + return true; + } + if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) { + this.regexp_eatQuantifier(state); + return true; + } + return false; + }; + pp$1.regexp_eatAssertion = function(state) { + var start = state.pos; + state.lastAssertionIsQuantifiable = false; + if (state.eat( + 94 + /* ^ */ + ) || state.eat( + 36 + /* $ */ + )) { + return true; + } + if (state.eat( + 92 + /* \ */ + )) { + if (state.eat( + 66 + /* B */ + ) || state.eat( + 98 + /* b */ + )) { + return true; + } + state.pos = start; + } + if (state.eat( + 40 + /* ( */ + ) && state.eat( + 63 + /* ? */ + )) { + var lookbehind = false; + if (this.options.ecmaVersion >= 9) { + lookbehind = state.eat( + 60 + /* < */ + ); + } + if (state.eat( + 61 + /* = */ + ) || state.eat( + 33 + /* ! */ + )) { + this.regexp_disjunction(state); + if (!state.eat( + 41 + /* ) */ + )) { + state.raise("Unterminated group"); + } + state.lastAssertionIsQuantifiable = !lookbehind; + return true; + } + } + state.pos = start; + return false; + }; + pp$1.regexp_eatQuantifier = function(state, noError) { + if (noError === void 0) + noError = false; + if (this.regexp_eatQuantifierPrefix(state, noError)) { + state.eat( + 63 + /* ? */ + ); + return true; + } + return false; + }; + pp$1.regexp_eatQuantifierPrefix = function(state, noError) { + return state.eat( + 42 + /* * */ + ) || state.eat( + 43 + /* + */ + ) || state.eat( + 63 + /* ? */ + ) || this.regexp_eatBracedQuantifier(state, noError); + }; + pp$1.regexp_eatBracedQuantifier = function(state, noError) { + var start = state.pos; + if (state.eat( + 123 + /* { */ + )) { + var min2 = 0, max = -1; + if (this.regexp_eatDecimalDigits(state)) { + min2 = state.lastIntValue; + if (state.eat( + 44 + /* , */ + ) && this.regexp_eatDecimalDigits(state)) { + max = state.lastIntValue; + } + if (state.eat( + 125 + /* } */ + )) { + if (max !== -1 && max < min2 && !noError) { + state.raise("numbers out of order in {} quantifier"); + } + return true; + } + } + if (state.switchU && !noError) { + state.raise("Incomplete quantifier"); + } + state.pos = start; + } + return false; + }; + pp$1.regexp_eatAtom = function(state) { + return this.regexp_eatPatternCharacters(state) || state.eat( + 46 + /* . */ + ) || this.regexp_eatReverseSolidusAtomEscape(state) || this.regexp_eatCharacterClass(state) || this.regexp_eatUncapturingGroup(state) || this.regexp_eatCapturingGroup(state); + }; + pp$1.regexp_eatReverseSolidusAtomEscape = function(state) { + var start = state.pos; + if (state.eat( + 92 + /* \ */ + )) { + if (this.regexp_eatAtomEscape(state)) { + return true; + } + state.pos = start; + } + return false; + }; + pp$1.regexp_eatUncapturingGroup = function(state) { + var start = state.pos; + if (state.eat( + 40 + /* ( */ + )) { + if (state.eat( + 63 + /* ? */ + ) && state.eat( + 58 + /* : */ + )) { + this.regexp_disjunction(state); + if (state.eat( + 41 + /* ) */ + )) { + return true; + } + state.raise("Unterminated group"); + } + state.pos = start; + } + return false; + }; + pp$1.regexp_eatCapturingGroup = function(state) { + if (state.eat( + 40 + /* ( */ + )) { + if (this.options.ecmaVersion >= 9) { + this.regexp_groupSpecifier(state); + } else if (state.current() === 63) { + state.raise("Invalid group"); + } + this.regexp_disjunction(state); + if (state.eat( + 41 + /* ) */ + )) { + state.numCapturingParens += 1; + return true; + } + state.raise("Unterminated group"); + } + return false; + }; + pp$1.regexp_eatExtendedAtom = function(state) { + return state.eat( + 46 + /* . */ + ) || this.regexp_eatReverseSolidusAtomEscape(state) || this.regexp_eatCharacterClass(state) || this.regexp_eatUncapturingGroup(state) || this.regexp_eatCapturingGroup(state) || this.regexp_eatInvalidBracedQuantifier(state) || this.regexp_eatExtendedPatternCharacter(state); + }; + pp$1.regexp_eatInvalidBracedQuantifier = function(state) { + if (this.regexp_eatBracedQuantifier(state, true)) { + state.raise("Nothing to repeat"); + } + return false; + }; + pp$1.regexp_eatSyntaxCharacter = function(state) { + var ch = state.current(); + if (isSyntaxCharacter(ch)) { + state.lastIntValue = ch; + state.advance(); + return true; + } + return false; + }; + pp$1.regexp_eatPatternCharacters = function(state) { + var start = state.pos; + var ch = 0; + while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) { + state.advance(); + } + return state.pos !== start; + }; + pp$1.regexp_eatExtendedPatternCharacter = function(state) { + var ch = state.current(); + if (ch !== -1 && ch !== 36 && !(ch >= 40 && ch <= 43) && ch !== 46 && ch !== 63 && ch !== 91 && ch !== 94 && ch !== 124) { + state.advance(); + return true; + } + return false; + }; + pp$1.regexp_groupSpecifier = function(state) { + if (state.eat( + 63 + /* ? */ + )) { + if (this.regexp_eatGroupName(state)) { + if (state.groupNames.indexOf(state.lastStringValue) !== -1) { + state.raise("Duplicate capture group name"); + } + state.groupNames.push(state.lastStringValue); + return; + } + state.raise("Invalid group"); + } + }; + pp$1.regexp_eatGroupName = function(state) { + state.lastStringValue = ""; + if (state.eat( + 60 + /* < */ + )) { + if (this.regexp_eatRegExpIdentifierName(state) && state.eat( + 62 + /* > */ + )) { + return true; + } + state.raise("Invalid capture group name"); + } + return false; + }; + pp$1.regexp_eatRegExpIdentifierName = function(state) { + state.lastStringValue = ""; + if (this.regexp_eatRegExpIdentifierStart(state)) { + state.lastStringValue += codePointToString(state.lastIntValue); + while (this.regexp_eatRegExpIdentifierPart(state)) { + state.lastStringValue += codePointToString(state.lastIntValue); + } + return true; + } + return false; + }; + pp$1.regexp_eatRegExpIdentifierStart = function(state) { + var start = state.pos; + var forceU = this.options.ecmaVersion >= 11; + var ch = state.current(forceU); + state.advance(forceU); + if (ch === 92 && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) { + ch = state.lastIntValue; + } + if (isRegExpIdentifierStart(ch)) { + state.lastIntValue = ch; + return true; + } + state.pos = start; + return false; + }; + pp$1.regexp_eatRegExpIdentifierPart = function(state) { + var start = state.pos; + var forceU = this.options.ecmaVersion >= 11; + var ch = state.current(forceU); + state.advance(forceU); + if (ch === 92 && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) { + ch = state.lastIntValue; + } + if (isRegExpIdentifierPart(ch)) { + state.lastIntValue = ch; + return true; + } + state.pos = start; + return false; + }; + pp$1.regexp_eatAtomEscape = function(state) { + if (this.regexp_eatBackReference(state) || this.regexp_eatCharacterClassEscape(state) || this.regexp_eatCharacterEscape(state) || state.switchN && this.regexp_eatKGroupName(state)) { + return true; + } + if (state.switchU) { + if (state.current() === 99) { + state.raise("Invalid unicode escape"); + } + state.raise("Invalid escape"); + } + return false; + }; + pp$1.regexp_eatBackReference = function(state) { + var start = state.pos; + if (this.regexp_eatDecimalEscape(state)) { + var n = state.lastIntValue; + if (state.switchU) { + if (n > state.maxBackReference) { + state.maxBackReference = n; + } + return true; + } + if (n <= state.numCapturingParens) { + return true; + } + state.pos = start; + } + return false; + }; + pp$1.regexp_eatKGroupName = function(state) { + if (state.eat( + 107 + /* k */ + )) { + if (this.regexp_eatGroupName(state)) { + state.backReferenceNames.push(state.lastStringValue); + return true; + } + state.raise("Invalid named reference"); + } + return false; + }; + pp$1.regexp_eatCharacterEscape = function(state) { + return this.regexp_eatControlEscape(state) || this.regexp_eatCControlLetter(state) || this.regexp_eatZero(state) || this.regexp_eatHexEscapeSequence(state) || this.regexp_eatRegExpUnicodeEscapeSequence(state, false) || !state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state) || this.regexp_eatIdentityEscape(state); + }; + pp$1.regexp_eatCControlLetter = function(state) { + var start = state.pos; + if (state.eat( + 99 + /* c */ + )) { + if (this.regexp_eatControlLetter(state)) { + return true; + } + state.pos = start; + } + return false; + }; + pp$1.regexp_eatZero = function(state) { + if (state.current() === 48 && !isDecimalDigit(state.lookahead())) { + state.lastIntValue = 0; + state.advance(); + return true; + } + return false; + }; + pp$1.regexp_eatControlEscape = function(state) { + var ch = state.current(); + if (ch === 116) { + state.lastIntValue = 9; + state.advance(); + return true; + } + if (ch === 110) { + state.lastIntValue = 10; + state.advance(); + return true; + } + if (ch === 118) { + state.lastIntValue = 11; + state.advance(); + return true; + } + if (ch === 102) { + state.lastIntValue = 12; + state.advance(); + return true; + } + if (ch === 114) { + state.lastIntValue = 13; + state.advance(); + return true; + } + return false; + }; + pp$1.regexp_eatControlLetter = function(state) { + var ch = state.current(); + if (isControlLetter(ch)) { + state.lastIntValue = ch % 32; + state.advance(); + return true; + } + return false; + }; + pp$1.regexp_eatRegExpUnicodeEscapeSequence = function(state, forceU) { + if (forceU === void 0) + forceU = false; + var start = state.pos; + var switchU = forceU || state.switchU; + if (state.eat( + 117 + /* u */ + )) { + if (this.regexp_eatFixedHexDigits(state, 4)) { + var lead = state.lastIntValue; + if (switchU && lead >= 55296 && lead <= 56319) { + var leadSurrogateEnd = state.pos; + if (state.eat( + 92 + /* \ */ + ) && state.eat( + 117 + /* u */ + ) && this.regexp_eatFixedHexDigits(state, 4)) { + var trail = state.lastIntValue; + if (trail >= 56320 && trail <= 57343) { + state.lastIntValue = (lead - 55296) * 1024 + (trail - 56320) + 65536; + return true; + } + } + state.pos = leadSurrogateEnd; + state.lastIntValue = lead; + } + return true; + } + if (switchU && state.eat( + 123 + /* { */ + ) && this.regexp_eatHexDigits(state) && state.eat( + 125 + /* } */ + ) && isValidUnicode(state.lastIntValue)) { + return true; + } + if (switchU) { + state.raise("Invalid unicode escape"); + } + state.pos = start; + } + return false; + }; + pp$1.regexp_eatIdentityEscape = function(state) { + if (state.switchU) { + if (this.regexp_eatSyntaxCharacter(state)) { + return true; + } + if (state.eat( + 47 + /* / */ + )) { + state.lastIntValue = 47; + return true; + } + return false; + } + var ch = state.current(); + if (ch !== 99 && (!state.switchN || ch !== 107)) { + state.lastIntValue = ch; + state.advance(); + return true; + } + return false; + }; + pp$1.regexp_eatDecimalEscape = function(state) { + state.lastIntValue = 0; + var ch = state.current(); + if (ch >= 49 && ch <= 57) { + do { + state.lastIntValue = 10 * state.lastIntValue + (ch - 48); + state.advance(); + } while ((ch = state.current()) >= 48 && ch <= 57); + return true; + } + return false; + }; + pp$1.regexp_eatCharacterClassEscape = function(state) { + var ch = state.current(); + if (isCharacterClassEscape(ch)) { + state.lastIntValue = -1; + state.advance(); + return true; + } + if (state.switchU && this.options.ecmaVersion >= 9 && (ch === 80 || ch === 112)) { + state.lastIntValue = -1; + state.advance(); + if (state.eat( + 123 + /* { */ + ) && this.regexp_eatUnicodePropertyValueExpression(state) && state.eat( + 125 + /* } */ + )) { + return true; + } + state.raise("Invalid property name"); + } + return false; + }; + pp$1.regexp_eatUnicodePropertyValueExpression = function(state) { + var start = state.pos; + if (this.regexp_eatUnicodePropertyName(state) && state.eat( + 61 + /* = */ + )) { + var name2 = state.lastStringValue; + if (this.regexp_eatUnicodePropertyValue(state)) { + var value2 = state.lastStringValue; + this.regexp_validateUnicodePropertyNameAndValue(state, name2, value2); + return true; + } + } + state.pos = start; + if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) { + var nameOrValue = state.lastStringValue; + this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue); + return true; + } + return false; + }; + pp$1.regexp_validateUnicodePropertyNameAndValue = function(state, name2, value2) { + if (!hasOwn(state.unicodeProperties.nonBinary, name2)) { + state.raise("Invalid property name"); + } + if (!state.unicodeProperties.nonBinary[name2].test(value2)) { + state.raise("Invalid property value"); + } + }; + pp$1.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) { + if (!state.unicodeProperties.binary.test(nameOrValue)) { + state.raise("Invalid property name"); + } + }; + pp$1.regexp_eatUnicodePropertyName = function(state) { + var ch = 0; + state.lastStringValue = ""; + while (isUnicodePropertyNameCharacter(ch = state.current())) { + state.lastStringValue += codePointToString(ch); + state.advance(); + } + return state.lastStringValue !== ""; + }; + pp$1.regexp_eatUnicodePropertyValue = function(state) { + var ch = 0; + state.lastStringValue = ""; + while (isUnicodePropertyValueCharacter(ch = state.current())) { + state.lastStringValue += codePointToString(ch); + state.advance(); + } + return state.lastStringValue !== ""; + }; + pp$1.regexp_eatLoneUnicodePropertyNameOrValue = function(state) { + return this.regexp_eatUnicodePropertyValue(state); + }; + pp$1.regexp_eatCharacterClass = function(state) { + if (state.eat( + 91 + /* [ */ + )) { + state.eat( + 94 + /* ^ */ + ); + this.regexp_classRanges(state); + if (state.eat( + 93 + /* ] */ + )) { + return true; + } + state.raise("Unterminated character class"); + } + return false; + }; + pp$1.regexp_classRanges = function(state) { + while (this.regexp_eatClassAtom(state)) { + var left = state.lastIntValue; + if (state.eat( + 45 + /* - */ + ) && this.regexp_eatClassAtom(state)) { + var right = state.lastIntValue; + if (state.switchU && (left === -1 || right === -1)) { + state.raise("Invalid character class"); + } + if (left !== -1 && right !== -1 && left > right) { + state.raise("Range out of order in character class"); + } + } + } + }; + pp$1.regexp_eatClassAtom = function(state) { + var start = state.pos; + if (state.eat( + 92 + /* \ */ + )) { + if (this.regexp_eatClassEscape(state)) { + return true; + } + if (state.switchU) { + var ch$1 = state.current(); + if (ch$1 === 99 || isOctalDigit(ch$1)) { + state.raise("Invalid class escape"); + } + state.raise("Invalid escape"); + } + state.pos = start; + } + var ch = state.current(); + if (ch !== 93) { + state.lastIntValue = ch; + state.advance(); + return true; + } + return false; + }; + pp$1.regexp_eatClassEscape = function(state) { + var start = state.pos; + if (state.eat( + 98 + /* b */ + )) { + state.lastIntValue = 8; + return true; + } + if (state.switchU && state.eat( + 45 + /* - */ + )) { + state.lastIntValue = 45; + return true; + } + if (!state.switchU && state.eat( + 99 + /* c */ + )) { + if (this.regexp_eatClassControlLetter(state)) { + return true; + } + state.pos = start; + } + return this.regexp_eatCharacterClassEscape(state) || this.regexp_eatCharacterEscape(state); + }; + pp$1.regexp_eatClassControlLetter = function(state) { + var ch = state.current(); + if (isDecimalDigit(ch) || ch === 95) { + state.lastIntValue = ch % 32; + state.advance(); + return true; + } + return false; + }; + pp$1.regexp_eatHexEscapeSequence = function(state) { + var start = state.pos; + if (state.eat( + 120 + /* x */ + )) { + if (this.regexp_eatFixedHexDigits(state, 2)) { + return true; + } + if (state.switchU) { + state.raise("Invalid escape"); + } + state.pos = start; + } + return false; + }; + pp$1.regexp_eatDecimalDigits = function(state) { + var start = state.pos; + var ch = 0; + state.lastIntValue = 0; + while (isDecimalDigit(ch = state.current())) { + state.lastIntValue = 10 * state.lastIntValue + (ch - 48); + state.advance(); + } + return state.pos !== start; + }; + pp$1.regexp_eatHexDigits = function(state) { + var start = state.pos; + var ch = 0; + state.lastIntValue = 0; + while (isHexDigit(ch = state.current())) { + state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); + state.advance(); + } + return state.pos !== start; + }; + pp$1.regexp_eatLegacyOctalEscapeSequence = function(state) { + if (this.regexp_eatOctalDigit(state)) { + var n1 = state.lastIntValue; + if (this.regexp_eatOctalDigit(state)) { + var n2 = state.lastIntValue; + if (n1 <= 3 && this.regexp_eatOctalDigit(state)) { + state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue; + } else { + state.lastIntValue = n1 * 8 + n2; + } + } else { + state.lastIntValue = n1; + } + return true; + } + return false; + }; + pp$1.regexp_eatOctalDigit = function(state) { + var ch = state.current(); + if (isOctalDigit(ch)) { + state.lastIntValue = ch - 48; + state.advance(); + return true; + } + state.lastIntValue = 0; + return false; + }; + pp$1.regexp_eatFixedHexDigits = function(state, length) { + var start = state.pos; + state.lastIntValue = 0; + for (var i = 0; i < length; ++i) { + var ch = state.current(); + if (!isHexDigit(ch)) { + state.pos = start; + return false; + } + state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); + state.advance(); + } + return true; + }; + Token = function Token2(p) { + this.type = p.type; + this.value = p.value; + this.start = p.start; + this.end = p.end; + if (p.options.locations) { + this.loc = new SourceLocation(p, p.startLoc, p.endLoc); + } + if (p.options.ranges) { + this.range = [p.start, p.end]; + } + }; + pp = Parser$1.prototype; + pp.next = function(ignoreEscapeSequenceInKeyword) { + if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc) { + this.raiseRecoverable(this.start, "Escape sequence in keyword " + this.type.keyword); + } + if (this.options.onToken) { + this.options.onToken(new Token(this)); + } + this.lastTokEnd = this.end; + this.lastTokStart = this.start; + this.lastTokEndLoc = this.endLoc; + this.lastTokStartLoc = this.startLoc; + this.nextToken(); + }; + pp.getToken = function() { + this.next(); + return new Token(this); + }; + if (typeof Symbol !== "undefined") { + pp[Symbol.iterator] = function() { + var this$1$1 = this; + return { + next: function() { + var token = this$1$1.getToken(); + return { + done: token.type === types$1.eof, + value: token + }; + } + }; + }; + } + pp.nextToken = function() { + var curContext = this.curContext(); + if (!curContext || !curContext.preserveSpace) { + this.skipSpace(); + } + this.start = this.pos; + if (this.options.locations) { + this.startLoc = this.curPosition(); + } + if (this.pos >= this.input.length) { + return this.finishToken(types$1.eof); + } + if (curContext.override) { + return curContext.override(this); + } else { + this.readToken(this.fullCharCodeAtPos()); + } + }; + pp.readToken = function(code) { + if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92) { + return this.readWord(); + } + return this.getTokenFromCode(code); + }; + pp.fullCharCodeAtPos = function() { + var code = this.input.charCodeAt(this.pos); + if (code <= 55295 || code >= 56320) { + return code; + } + var next = this.input.charCodeAt(this.pos + 1); + return next <= 56319 || next >= 57344 ? code : (code << 10) + next - 56613888; + }; + pp.skipBlockComment = function() { + var startLoc = this.options.onComment && this.curPosition(); + var start = this.pos, end = this.input.indexOf("*/", this.pos += 2); + if (end === -1) { + this.raise(this.pos - 2, "Unterminated comment"); + } + this.pos = end + 2; + if (this.options.locations) { + for (var nextBreak = void 0, pos = start; (nextBreak = nextLineBreak(this.input, pos, this.pos)) > -1; ) { + ++this.curLine; + pos = this.lineStart = nextBreak; + } + } + if (this.options.onComment) { + this.options.onComment( + true, + this.input.slice(start + 2, end), + start, + this.pos, + startLoc, + this.curPosition() + ); + } + }; + pp.skipLineComment = function(startSkip) { + var start = this.pos; + var startLoc = this.options.onComment && this.curPosition(); + var ch = this.input.charCodeAt(this.pos += startSkip); + while (this.pos < this.input.length && !isNewLine(ch)) { + ch = this.input.charCodeAt(++this.pos); + } + if (this.options.onComment) { + this.options.onComment( + false, + this.input.slice(start + startSkip, this.pos), + start, + this.pos, + startLoc, + this.curPosition() + ); + } + }; + pp.skipSpace = function() { + loop: + while (this.pos < this.input.length) { + var ch = this.input.charCodeAt(this.pos); + switch (ch) { + case 32: + case 160: + ++this.pos; + break; + case 13: + if (this.input.charCodeAt(this.pos + 1) === 10) { + ++this.pos; + } + case 10: + case 8232: + case 8233: + ++this.pos; + if (this.options.locations) { + ++this.curLine; + this.lineStart = this.pos; + } + break; + case 47: + switch (this.input.charCodeAt(this.pos + 1)) { + case 42: + this.skipBlockComment(); + break; + case 47: + this.skipLineComment(2); + break; + default: + break loop; + } + break; + default: + if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { + ++this.pos; + } else { + break loop; + } + } + } + }; + pp.finishToken = function(type, val) { + this.end = this.pos; + if (this.options.locations) { + this.endLoc = this.curPosition(); + } + var prevType = this.type; + this.type = type; + this.value = val; + this.updateContext(prevType); + }; + pp.readToken_dot = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (next >= 48 && next <= 57) { + return this.readNumber(true); + } + var next2 = this.input.charCodeAt(this.pos + 2); + if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { + this.pos += 3; + return this.finishToken(types$1.ellipsis); + } else { + ++this.pos; + return this.finishToken(types$1.dot); + } + }; + pp.readToken_slash = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (this.exprAllowed) { + ++this.pos; + return this.readRegexp(); + } + if (next === 61) { + return this.finishOp(types$1.assign, 2); + } + return this.finishOp(types$1.slash, 1); + }; + pp.readToken_mult_modulo_exp = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + var tokentype = code === 42 ? types$1.star : types$1.modulo; + if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) { + ++size; + tokentype = types$1.starstar; + next = this.input.charCodeAt(this.pos + 2); + } + if (next === 61) { + return this.finishOp(types$1.assign, size + 1); + } + return this.finishOp(tokentype, size); + }; + pp.readToken_pipe_amp = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { + if (this.options.ecmaVersion >= 12) { + var next2 = this.input.charCodeAt(this.pos + 2); + if (next2 === 61) { + return this.finishOp(types$1.assign, 3); + } + } + return this.finishOp(code === 124 ? types$1.logicalOR : types$1.logicalAND, 2); + } + if (next === 61) { + return this.finishOp(types$1.assign, 2); + } + return this.finishOp(code === 124 ? types$1.bitwiseOR : types$1.bitwiseAND, 1); + }; + pp.readToken_caret = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (next === 61) { + return this.finishOp(types$1.assign, 2); + } + return this.finishOp(types$1.bitwiseXOR, 1); + }; + pp.readToken_plus_min = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { + if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 && (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) { + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken(); + } + return this.finishOp(types$1.incDec, 2); + } + if (next === 61) { + return this.finishOp(types$1.assign, 2); + } + return this.finishOp(types$1.plusMin, 1); + }; + pp.readToken_lt_gt = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { + return this.finishOp(types$1.assign, size + 1); + } + return this.finishOp(types$1.bitShift, size); + } + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && this.input.charCodeAt(this.pos + 3) === 45) { + this.skipLineComment(4); + this.skipSpace(); + return this.nextToken(); + } + if (next === 61) { + size = 2; + } + return this.finishOp(types$1.relational, size); + }; + pp.readToken_eq_excl = function(code) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === 61) { + return this.finishOp(types$1.equality, this.input.charCodeAt(this.pos + 2) === 61 ? 3 : 2); + } + if (code === 61 && next === 62 && this.options.ecmaVersion >= 6) { + this.pos += 2; + return this.finishToken(types$1.arrow); + } + return this.finishOp(code === 61 ? types$1.eq : types$1.prefix, 1); + }; + pp.readToken_question = function() { + var ecmaVersion = this.options.ecmaVersion; + if (ecmaVersion >= 11) { + var next = this.input.charCodeAt(this.pos + 1); + if (next === 46) { + var next2 = this.input.charCodeAt(this.pos + 2); + if (next2 < 48 || next2 > 57) { + return this.finishOp(types$1.questionDot, 2); + } + } + if (next === 63) { + if (ecmaVersion >= 12) { + var next2$1 = this.input.charCodeAt(this.pos + 2); + if (next2$1 === 61) { + return this.finishOp(types$1.assign, 3); + } + } + return this.finishOp(types$1.coalesce, 2); + } + } + return this.finishOp(types$1.question, 1); + }; + pp.readToken_numberSign = function() { + var ecmaVersion = this.options.ecmaVersion; + var code = 35; + if (ecmaVersion >= 13) { + ++this.pos; + code = this.fullCharCodeAtPos(); + if (isIdentifierStart(code, true) || code === 92) { + return this.finishToken(types$1.privateId, this.readWord1()); + } + } + this.raise(this.pos, "Unexpected character '" + codePointToString(code) + "'"); + }; + pp.getTokenFromCode = function(code) { + switch (code) { + case 46: + return this.readToken_dot(); + case 40: + ++this.pos; + return this.finishToken(types$1.parenL); + case 41: + ++this.pos; + return this.finishToken(types$1.parenR); + case 59: + ++this.pos; + return this.finishToken(types$1.semi); + case 44: + ++this.pos; + return this.finishToken(types$1.comma); + case 91: + ++this.pos; + return this.finishToken(types$1.bracketL); + case 93: + ++this.pos; + return this.finishToken(types$1.bracketR); + case 123: + ++this.pos; + return this.finishToken(types$1.braceL); + case 125: + ++this.pos; + return this.finishToken(types$1.braceR); + case 58: + ++this.pos; + return this.finishToken(types$1.colon); + case 96: + if (this.options.ecmaVersion < 6) { + break; + } + ++this.pos; + return this.finishToken(types$1.backQuote); + case 48: + var next = this.input.charCodeAt(this.pos + 1); + if (next === 120 || next === 88) { + return this.readRadixNumber(16); + } + if (this.options.ecmaVersion >= 6) { + if (next === 111 || next === 79) { + return this.readRadixNumber(8); + } + if (next === 98 || next === 66) { + return this.readRadixNumber(2); + } + } + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + return this.readNumber(false); + case 34: + case 39: + return this.readString(code); + case 47: + return this.readToken_slash(); + case 37: + case 42: + return this.readToken_mult_modulo_exp(code); + case 124: + case 38: + return this.readToken_pipe_amp(code); + case 94: + return this.readToken_caret(); + case 43: + case 45: + return this.readToken_plus_min(code); + case 60: + case 62: + return this.readToken_lt_gt(code); + case 61: + case 33: + return this.readToken_eq_excl(code); + case 63: + return this.readToken_question(); + case 126: + return this.finishOp(types$1.prefix, 1); + case 35: + return this.readToken_numberSign(); + } + this.raise(this.pos, "Unexpected character '" + codePointToString(code) + "'"); + }; + pp.finishOp = function(type, size) { + var str = this.input.slice(this.pos, this.pos + size); + this.pos += size; + return this.finishToken(type, str); + }; + pp.readRegexp = function() { + var escaped2, inClass, start = this.pos; + for (; ; ) { + if (this.pos >= this.input.length) { + this.raise(start, "Unterminated regular expression"); + } + var ch = this.input.charAt(this.pos); + if (lineBreak.test(ch)) { + this.raise(start, "Unterminated regular expression"); + } + if (!escaped2) { + if (ch === "[") { + inClass = true; + } else if (ch === "]" && inClass) { + inClass = false; + } else if (ch === "/" && !inClass) { + break; + } + escaped2 = ch === "\\"; + } else { + escaped2 = false; + } + ++this.pos; + } + var pattern2 = this.input.slice(start, this.pos); + ++this.pos; + var flagsStart = this.pos; + var flags = this.readWord1(); + if (this.containsEsc) { + this.unexpected(flagsStart); + } + var state = this.regexpState || (this.regexpState = new RegExpValidationState(this)); + state.reset(start, pattern2, flags); + this.validateRegExpFlags(state); + this.validateRegExpPattern(state); + var value2 = null; + try { + value2 = new RegExp(pattern2, flags); + } catch (e) { + } + return this.finishToken(types$1.regexp, { pattern: pattern2, flags, value: value2 }); + }; + pp.readInt = function(radix, len, maybeLegacyOctalNumericLiteral) { + var allowSeparators = this.options.ecmaVersion >= 12 && len === void 0; + var isLegacyOctalNumericLiteral = maybeLegacyOctalNumericLiteral && this.input.charCodeAt(this.pos) === 48; + var start = this.pos, total = 0, lastCode = 0; + for (var i = 0, e = len == null ? Infinity : len; i < e; ++i, ++this.pos) { + var code = this.input.charCodeAt(this.pos), val = void 0; + if (allowSeparators && code === 95) { + if (isLegacyOctalNumericLiteral) { + this.raiseRecoverable(this.pos, "Numeric separator is not allowed in legacy octal numeric literals"); + } + if (lastCode === 95) { + this.raiseRecoverable(this.pos, "Numeric separator must be exactly one underscore"); + } + if (i === 0) { + this.raiseRecoverable(this.pos, "Numeric separator is not allowed at the first of digits"); + } + lastCode = code; + continue; + } + if (code >= 97) { + val = code - 97 + 10; + } else if (code >= 65) { + val = code - 65 + 10; + } else if (code >= 48 && code <= 57) { + val = code - 48; + } else { + val = Infinity; + } + if (val >= radix) { + break; + } + lastCode = code; + total = total * radix + val; + } + if (allowSeparators && lastCode === 95) { + this.raiseRecoverable(this.pos - 1, "Numeric separator is not allowed at the last of digits"); + } + if (this.pos === start || len != null && this.pos - start !== len) { + return null; + } + return total; + }; + pp.readRadixNumber = function(radix) { + var start = this.pos; + this.pos += 2; + var val = this.readInt(radix); + if (val == null) { + this.raise(this.start + 2, "Expected number in radix " + radix); + } + if (this.options.ecmaVersion >= 11 && this.input.charCodeAt(this.pos) === 110) { + val = stringToBigInt(this.input.slice(start, this.pos)); + ++this.pos; + } else if (isIdentifierStart(this.fullCharCodeAtPos())) { + this.raise(this.pos, "Identifier directly after number"); + } + return this.finishToken(types$1.num, val); + }; + pp.readNumber = function(startsWithDot) { + var start = this.pos; + if (!startsWithDot && this.readInt(10, void 0, true) === null) { + this.raise(start, "Invalid number"); + } + var octal = this.pos - start >= 2 && this.input.charCodeAt(start) === 48; + if (octal && this.strict) { + this.raise(start, "Invalid number"); + } + var next = this.input.charCodeAt(this.pos); + if (!octal && !startsWithDot && this.options.ecmaVersion >= 11 && next === 110) { + var val$1 = stringToBigInt(this.input.slice(start, this.pos)); + ++this.pos; + if (isIdentifierStart(this.fullCharCodeAtPos())) { + this.raise(this.pos, "Identifier directly after number"); + } + return this.finishToken(types$1.num, val$1); + } + if (octal && /[89]/.test(this.input.slice(start, this.pos))) { + octal = false; + } + if (next === 46 && !octal) { + ++this.pos; + this.readInt(10); + next = this.input.charCodeAt(this.pos); + } + if ((next === 69 || next === 101) && !octal) { + next = this.input.charCodeAt(++this.pos); + if (next === 43 || next === 45) { + ++this.pos; + } + if (this.readInt(10) === null) { + this.raise(start, "Invalid number"); + } + } + if (isIdentifierStart(this.fullCharCodeAtPos())) { + this.raise(this.pos, "Identifier directly after number"); + } + var val = stringToNumber(this.input.slice(start, this.pos), octal); + return this.finishToken(types$1.num, val); + }; + pp.readCodePoint = function() { + var ch = this.input.charCodeAt(this.pos), code; + if (ch === 123) { + if (this.options.ecmaVersion < 6) { + this.unexpected(); + } + var codePos = ++this.pos; + code = this.readHexChar(this.input.indexOf("}", this.pos) - this.pos); + ++this.pos; + if (code > 1114111) { + this.invalidStringToken(codePos, "Code point out of bounds"); + } + } else { + code = this.readHexChar(4); + } + return code; + }; + pp.readString = function(quote) { + var out = "", chunkStart = ++this.pos; + for (; ; ) { + if (this.pos >= this.input.length) { + this.raise(this.start, "Unterminated string constant"); + } + var ch = this.input.charCodeAt(this.pos); + if (ch === quote) { + break; + } + if (ch === 92) { + out += this.input.slice(chunkStart, this.pos); + out += this.readEscapedChar(false); + chunkStart = this.pos; + } else if (ch === 8232 || ch === 8233) { + if (this.options.ecmaVersion < 10) { + this.raise(this.start, "Unterminated string constant"); + } + ++this.pos; + if (this.options.locations) { + this.curLine++; + this.lineStart = this.pos; + } + } else { + if (isNewLine(ch)) { + this.raise(this.start, "Unterminated string constant"); + } + ++this.pos; + } + } + out += this.input.slice(chunkStart, this.pos++); + return this.finishToken(types$1.string, out); + }; + INVALID_TEMPLATE_ESCAPE_ERROR = {}; + pp.tryReadTemplateToken = function() { + this.inTemplateElement = true; + try { + this.readTmplToken(); + } catch (err) { + if (err === INVALID_TEMPLATE_ESCAPE_ERROR) { + this.readInvalidTemplateToken(); + } else { + throw err; + } + } + this.inTemplateElement = false; + }; + pp.invalidStringToken = function(position, message) { + if (this.inTemplateElement && this.options.ecmaVersion >= 9) { + throw INVALID_TEMPLATE_ESCAPE_ERROR; + } else { + this.raise(position, message); + } + }; + pp.readTmplToken = function() { + var out = "", chunkStart = this.pos; + for (; ; ) { + if (this.pos >= this.input.length) { + this.raise(this.start, "Unterminated template"); + } + var ch = this.input.charCodeAt(this.pos); + if (ch === 96 || ch === 36 && this.input.charCodeAt(this.pos + 1) === 123) { + if (this.pos === this.start && (this.type === types$1.template || this.type === types$1.invalidTemplate)) { + if (ch === 36) { + this.pos += 2; + return this.finishToken(types$1.dollarBraceL); + } else { + ++this.pos; + return this.finishToken(types$1.backQuote); + } + } + out += this.input.slice(chunkStart, this.pos); + return this.finishToken(types$1.template, out); + } + if (ch === 92) { + out += this.input.slice(chunkStart, this.pos); + out += this.readEscapedChar(true); + chunkStart = this.pos; + } else if (isNewLine(ch)) { + out += this.input.slice(chunkStart, this.pos); + ++this.pos; + switch (ch) { + case 13: + if (this.input.charCodeAt(this.pos) === 10) { + ++this.pos; + } + case 10: + out += "\n"; + break; + default: + out += String.fromCharCode(ch); + break; + } + if (this.options.locations) { + ++this.curLine; + this.lineStart = this.pos; + } + chunkStart = this.pos; + } else { + ++this.pos; + } + } + }; + pp.readInvalidTemplateToken = function() { + for (; this.pos < this.input.length; this.pos++) { + switch (this.input[this.pos]) { + case "\\": + ++this.pos; + break; + case "$": + if (this.input[this.pos + 1] !== "{") { + break; + } + case "`": + return this.finishToken(types$1.invalidTemplate, this.input.slice(this.start, this.pos)); + } + } + this.raise(this.start, "Unterminated template"); + }; + pp.readEscapedChar = function(inTemplate) { + var ch = this.input.charCodeAt(++this.pos); + ++this.pos; + switch (ch) { + case 110: + return "\n"; + case 114: + return "\r"; + case 120: + return String.fromCharCode(this.readHexChar(2)); + case 117: + return codePointToString(this.readCodePoint()); + case 116: + return " "; + case 98: + return "\b"; + case 118: + return "\v"; + case 102: + return "\f"; + case 13: + if (this.input.charCodeAt(this.pos) === 10) { + ++this.pos; + } + case 10: + if (this.options.locations) { + this.lineStart = this.pos; + ++this.curLine; + } + return ""; + case 56: + case 57: + if (this.strict) { + this.invalidStringToken( + this.pos - 1, + "Invalid escape sequence" + ); + } + if (inTemplate) { + var codePos = this.pos - 1; + this.invalidStringToken( + codePos, + "Invalid escape sequence in template string" + ); + } + default: + if (ch >= 48 && ch <= 55) { + var octalStr = this.input.substr(this.pos - 1, 3).match(/^[0-7]+/)[0]; + var octal = parseInt(octalStr, 8); + if (octal > 255) { + octalStr = octalStr.slice(0, -1); + octal = parseInt(octalStr, 8); + } + this.pos += octalStr.length - 1; + ch = this.input.charCodeAt(this.pos); + if ((octalStr !== "0" || ch === 56 || ch === 57) && (this.strict || inTemplate)) { + this.invalidStringToken( + this.pos - 1 - octalStr.length, + inTemplate ? "Octal literal in template string" : "Octal literal in strict mode" + ); + } + return String.fromCharCode(octal); + } + if (isNewLine(ch)) { + return ""; + } + return String.fromCharCode(ch); + } + }; + pp.readHexChar = function(len) { + var codePos = this.pos; + var n = this.readInt(16, len); + if (n === null) { + this.invalidStringToken(codePos, "Bad character escape sequence"); + } + return n; + }; + pp.readWord1 = function() { + this.containsEsc = false; + var word = "", first2 = true, chunkStart = this.pos; + var astral = this.options.ecmaVersion >= 6; + while (this.pos < this.input.length) { + var ch = this.fullCharCodeAtPos(); + if (isIdentifierChar(ch, astral)) { + this.pos += ch <= 65535 ? 1 : 2; + } else if (ch === 92) { + this.containsEsc = true; + word += this.input.slice(chunkStart, this.pos); + var escStart = this.pos; + if (this.input.charCodeAt(++this.pos) !== 117) { + this.invalidStringToken(this.pos, "Expecting Unicode escape sequence \\uXXXX"); + } + ++this.pos; + var esc = this.readCodePoint(); + if (!(first2 ? isIdentifierStart : isIdentifierChar)(esc, astral)) { + this.invalidStringToken(escStart, "Invalid Unicode escape"); + } + word += codePointToString(esc); + chunkStart = this.pos; + } else { + break; + } + first2 = false; + } + return word + this.input.slice(chunkStart, this.pos); + }; + pp.readWord = function() { + var word = this.readWord1(); + var type = types$1.name; + if (this.keywords.test(word)) { + type = keywords$2[word]; + } + return this.finishToken(type, word); + }; + version$2 = "8.8.2"; + Parser$1.acorn = { + Parser: Parser$1, + version: version$2, + defaultOptions, + Position, + SourceLocation, + getLineInfo, + Node, + TokenType, + tokTypes: types$1, + keywordTypes: keywords$2, + TokContext, + tokContexts: types$2, + isIdentifierChar, + isIdentifierStart, + Token, + isNewLine, + lineBreak, + lineBreakG, + nonASCIIwhitespace + }; + isWindows$3 = process$1.platform === "win32"; + own$1 = {}.hasOwnProperty; + messages = /* @__PURE__ */ new Map(); + nodeInternalPrefix = "__node_internal_"; + createError( + "ERR_INVALID_MODULE_SPECIFIER", + /** + * @param {string} request + * @param {string} reason + * @param {string} [base] + */ + (request, reason, base2 = void 0) => { + return `Invalid module "${request}" ${reason}${base2 ? ` imported from ${base2}` : ""}`; + }, + TypeError + ); + createError( + "ERR_INVALID_PACKAGE_CONFIG", + /** + * @param {string} path + * @param {string} [base] + * @param {string} [message] + */ + (path3, base2, message) => { + return `Invalid package config ${path3}${base2 ? ` while importing ${base2}` : ""}${message ? `. ${message}` : ""}`; + }, + Error + ); + createError( + "ERR_INVALID_PACKAGE_TARGET", + /** + * @param {string} pkgPath + * @param {string} key + * @param {unknown} target + * @param {boolean} [isImport=false] + * @param {string} [base] + */ + (pkgPath, key, target, isImport = false, base2 = void 0) => { + const relError = typeof target === "string" && !isImport && target.length > 0 && !target.startsWith("./"); + if (key === ".") { + assert$1(isImport === false); + return `Invalid "exports" main target ${JSON.stringify(target)} defined in the package config ${pkgPath}package.json${base2 ? ` imported from ${base2}` : ""}${relError ? '; targets must start with "./"' : ""}`; + } + return `Invalid "${isImport ? "imports" : "exports"}" target ${JSON.stringify( + target + )} defined for '${key}' in the package config ${pkgPath}package.json${base2 ? ` imported from ${base2}` : ""}${relError ? '; targets must start with "./"' : ""}`; + }, + Error + ); + createError( + "ERR_MODULE_NOT_FOUND", + /** + * @param {string} path + * @param {string} base + * @param {string} [type] + */ + (path3, base2, type = "package") => { + return `Cannot find ${type} '${path3}' imported from ${base2}`; + }, + Error + ); + createError( + "ERR_NETWORK_IMPORT_DISALLOWED", + "import of '%s' by %s is not supported: %s", + Error + ); + createError( + "ERR_PACKAGE_IMPORT_NOT_DEFINED", + /** + * @param {string} specifier + * @param {string} packagePath + * @param {string} base + */ + (specifier, packagePath, base2) => { + return `Package import specifier "${specifier}" is not defined${packagePath ? ` in package ${packagePath}package.json` : ""} imported from ${base2}`; + }, + TypeError + ); + createError( + "ERR_PACKAGE_PATH_NOT_EXPORTED", + /** + * @param {string} pkgPath + * @param {string} subpath + * @param {string} [base] + */ + (pkgPath, subpath, base2 = void 0) => { + if (subpath === ".") + return `No "exports" main defined in ${pkgPath}package.json${base2 ? ` imported from ${base2}` : ""}`; + return `Package subpath '${subpath}' is not defined by "exports" in ${pkgPath}package.json${base2 ? ` imported from ${base2}` : ""}`; + }, + Error + ); + createError( + "ERR_UNSUPPORTED_DIR_IMPORT", + "Directory import '%s' is not supported resolving ES modules imported from %s", + Error + ); + createError( + "ERR_UNKNOWN_FILE_EXTENSION", + /** + * @param {string} ext + * @param {string} path + */ + (ext2, path3) => { + return `Unknown file extension "${ext2}" for ${path3}`; + }, + TypeError + ); + createError( + "ERR_INVALID_ARG_VALUE", + /** + * @param {string} name + * @param {unknown} value + * @param {string} [reason='is invalid'] + */ + (name2, value2, reason = "is invalid") => { + let inspected = inspect(value2); + if (inspected.length > 128) { + inspected = `${inspected.slice(0, 128)}...`; + } + const type = name2.includes(".") ? "property" : "argument"; + return `The ${type} '${name2}' ${reason}. Received ${inspected}`; + }, + TypeError + // Note: extra classes have been shaken out. + // , RangeError + ); + createError( + "ERR_UNSUPPORTED_ESM_URL_SCHEME", + /** + * @param {URL} url + * @param {Array} supported + */ + (url2, supported) => { + let message = `Only URLs with a scheme in: ${formatList( + supported + )} are supported by the default ESM loader`; + if (isWindows$3 && url2.protocol.length === 2) { + message += ". On Windows, absolute paths must be valid file:// URLs"; + } + message += `. Received protocol '${url2.protocol}'`; + return message; + }, + Error + ); + captureLargerStackTrace = hideStackFrames( + /** + * @param {Error} error + * @returns {Error} + */ + // @ts-expect-error: fine + function(error2) { + const stackTraceLimitIsWritable = isErrorStackTraceLimitWritable(); + if (stackTraceLimitIsWritable) { + userStackTraceLimit = Error.stackTraceLimit; + Error.stackTraceLimit = Number.POSITIVE_INFINITY; + } + Error.captureStackTrace(error2); + if (stackTraceLimitIsWritable) + Error.stackTraceLimit = userStackTraceLimit; + return error2; + } + ); + pathToFileURL(process.cwd()); + isDebug$5 = process.env.DEBUG; + debug$d = createDebugger("vite:resolve-details", { + onlyWhenFocused: true + }); + normalizedClientEntry$1 = normalizePath$3(CLIENT_ENTRY); + normalizedEnvEntry$1 = normalizePath$3(ENV_ENTRY); + isDebug$4 = process.env.DEBUG; + debug$c = createDebugger("vite:resolve-details", { + onlyWhenFocused: true + }); + externalTypes = [ + "css", + // supported pre-processor types + "less", + "sass", + "scss", + "styl", + "stylus", + "pcss", + "postcss", + // wasm + "wasm", + // known SFC types + "vue", + "svelte", + "marko", + "astro", + "imba", + // JSX/TSX may be configured to be compiled differently from how esbuild + // handles it by default, so exclude them as well + "jsx", + "tsx", + ...KNOWN_ASSET_TYPES + ]; + tasks = {}; + utils$g = {}; + array$1 = {}; + Object.defineProperty(array$1, "__esModule", { value: true }); + array$1.splitWhen = array$1.flatten = void 0; + array$1.flatten = flatten$1; + array$1.splitWhen = splitWhen; + errno$1 = {}; + Object.defineProperty(errno$1, "__esModule", { value: true }); + errno$1.isEnoentCodeError = void 0; + errno$1.isEnoentCodeError = isEnoentCodeError; + fs$h = {}; + Object.defineProperty(fs$h, "__esModule", { value: true }); + fs$h.createDirentFromStats = void 0; + DirentFromStats$1 = class DirentFromStats { + constructor(name2, stats) { + this.name = name2; + this.isBlockDevice = stats.isBlockDevice.bind(stats); + this.isCharacterDevice = stats.isCharacterDevice.bind(stats); + this.isDirectory = stats.isDirectory.bind(stats); + this.isFIFO = stats.isFIFO.bind(stats); + this.isFile = stats.isFile.bind(stats); + this.isSocket = stats.isSocket.bind(stats); + this.isSymbolicLink = stats.isSymbolicLink.bind(stats); + } + }; + fs$h.createDirentFromStats = createDirentFromStats$1; + path$h = {}; + Object.defineProperty(path$h, "__esModule", { value: true }); + path$h.removeLeadingDotSegment = path$h.escape = path$h.makeAbsolute = path$h.unixify = void 0; + path$g = require$$0$4; + LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; + UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g; + path$h.unixify = unixify; + path$h.makeAbsolute = makeAbsolute; + path$h.escape = escape$2; + path$h.removeLeadingDotSegment = removeLeadingDotSegment; + pattern$1 = {}; + isExtglob$1 = function isExtglob(str) { + if (typeof str !== "string" || str === "") { + return false; + } + var match; + while (match = /(\\).|([@?!+*]\(.*\))/g.exec(str)) { + if (match[2]) + return true; + str = str.slice(match.index + match[0].length); + } + return false; + }; + isExtglob2 = isExtglob$1; + chars = { "{": "}", "(": ")", "[": "]" }; + strictCheck = function(str) { + if (str[0] === "!") { + return true; + } + var index = 0; + var pipeIndex = -2; + var closeSquareIndex = -2; + var closeCurlyIndex = -2; + var closeParenIndex = -2; + var backSlashIndex = -2; + while (index < str.length) { + if (str[index] === "*") { + return true; + } + if (str[index + 1] === "?" && /[\].+)]/.test(str[index])) { + return true; + } + if (closeSquareIndex !== -1 && str[index] === "[" && str[index + 1] !== "]") { + if (closeSquareIndex < index) { + closeSquareIndex = str.indexOf("]", index); + } + if (closeSquareIndex > index) { + if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { + return true; + } + backSlashIndex = str.indexOf("\\", index); + if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) { + return true; + } + } + } + if (closeCurlyIndex !== -1 && str[index] === "{" && str[index + 1] !== "}") { + closeCurlyIndex = str.indexOf("}", index); + if (closeCurlyIndex > index) { + backSlashIndex = str.indexOf("\\", index); + if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) { + return true; + } + } + } + if (closeParenIndex !== -1 && str[index] === "(" && str[index + 1] === "?" && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ")") { + closeParenIndex = str.indexOf(")", index); + if (closeParenIndex > index) { + backSlashIndex = str.indexOf("\\", index); + if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { + return true; + } + } + } + if (pipeIndex !== -1 && str[index] === "(" && str[index + 1] !== "|") { + if (pipeIndex < index) { + pipeIndex = str.indexOf("|", index); + } + if (pipeIndex !== -1 && str[pipeIndex + 1] !== ")") { + closeParenIndex = str.indexOf(")", pipeIndex); + if (closeParenIndex > pipeIndex) { + backSlashIndex = str.indexOf("\\", pipeIndex); + if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) { + return true; + } + } + } + } + if (str[index] === "\\") { + var open2 = str[index + 1]; + index += 2; + var close2 = chars[open2]; + if (close2) { + var n = str.indexOf(close2, index); + if (n !== -1) { + index = n + 1; + } + } + if (str[index] === "!") { + return true; + } + } else { + index++; + } + } + return false; + }; + relaxedCheck = function(str) { + if (str[0] === "!") { + return true; + } + var index = 0; + while (index < str.length) { + if (/[*?{}()[\]]/.test(str[index])) { + return true; + } + if (str[index] === "\\") { + var open2 = str[index + 1]; + index += 2; + var close2 = chars[open2]; + if (close2) { + var n = str.indexOf(close2, index); + if (n !== -1) { + index = n + 1; + } + } + if (str[index] === "!") { + return true; + } + } else { + index++; + } + } + return false; + }; + isGlob$2 = function isGlob(str, options2) { + if (typeof str !== "string" || str === "") { + return false; + } + if (isExtglob2(str)) { + return true; + } + var check = strictCheck; + if (options2 && options2.strict === false) { + check = relaxedCheck; + } + return check(str); + }; + isGlob$1 = isGlob$2; + pathPosixDirname = require$$0$4.posix.dirname; + isWin32 = require$$2.platform() === "win32"; + slash = "/"; + backslash = /\\/g; + enclosure = /[\{\[].*[\}\]]$/; + globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; + escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g; + globParent$2 = function globParent(str, opts) { + var options2 = Object.assign({ flipBackslashes: true }, opts); + if (options2.flipBackslashes && isWin32 && str.indexOf(slash) < 0) { + str = str.replace(backslash, slash); + } + if (enclosure.test(str)) { + str += slash; + } + str += "a"; + do { + str = pathPosixDirname(str); + } while (isGlob$1(str) || globby.test(str)); + return str.replace(escaped, "$1"); + }; + utils$f = {}; + (function(exports2) { + exports2.isInteger = (num) => { + if (typeof num === "number") { + return Number.isInteger(num); + } + if (typeof num === "string" && num.trim() !== "") { + return Number.isInteger(Number(num)); + } + return false; + }; + exports2.find = (node2, type) => node2.nodes.find((node3) => node3.type === type); + exports2.exceedsLimit = (min2, max, step = 1, limit) => { + if (limit === false) + return false; + if (!exports2.isInteger(min2) || !exports2.isInteger(max)) + return false; + return (Number(max) - Number(min2)) / Number(step) >= limit; + }; + exports2.escapeNode = (block, n = 0, type) => { + let node2 = block.nodes[n]; + if (!node2) + return; + if (type && node2.type === type || node2.type === "open" || node2.type === "close") { + if (node2.escaped !== true) { + node2.value = "\\" + node2.value; + node2.escaped = true; + } + } + }; + exports2.encloseBrace = (node2) => { + if (node2.type !== "brace") + return false; + if (node2.commas >> 0 + node2.ranges >> 0 === 0) { + node2.invalid = true; + return true; + } + return false; + }; + exports2.isInvalidBrace = (block) => { + if (block.type !== "brace") + return false; + if (block.invalid === true || block.dollar) + return true; + if (block.commas >> 0 + block.ranges >> 0 === 0) { + block.invalid = true; + return true; + } + if (block.open !== true || block.close !== true) { + block.invalid = true; + return true; + } + return false; + }; + exports2.isOpenOrClose = (node2) => { + if (node2.type === "open" || node2.type === "close") { + return true; + } + return node2.open === true || node2.close === true; + }; + exports2.reduce = (nodes) => nodes.reduce((acc, node2) => { + if (node2.type === "text") + acc.push(node2.value); + if (node2.type === "range") + node2.type = "text"; + return acc; + }, []); + exports2.flatten = (...args) => { + const result = []; + const flat = (arr) => { + for (let i = 0; i < arr.length; i++) { + let ele = arr[i]; + Array.isArray(ele) ? flat(ele) : ele !== void 0 && result.push(ele); + } + return result; + }; + flat(args); + return result; + }; + })(utils$f); + utils$e = utils$f; + stringify$7 = (ast, options2 = {}) => { + let stringify2 = (node2, parent = {}) => { + let invalidBlock = options2.escapeInvalid && utils$e.isInvalidBrace(parent); + let invalidNode = node2.invalid === true && options2.escapeInvalid === true; + let output = ""; + if (node2.value) { + if ((invalidBlock || invalidNode) && utils$e.isOpenOrClose(node2)) { + return "\\" + node2.value; + } + return node2.value; + } + if (node2.value) { + return node2.value; + } + if (node2.nodes) { + for (let child of node2.nodes) { + output += stringify2(child); + } + } + return output; + }; + return stringify2(ast); + }; + isNumber$2 = function(num) { + if (typeof num === "number") { + return num - num === 0; + } + if (typeof num === "string" && num.trim() !== "") { + return Number.isFinite ? Number.isFinite(+num) : isFinite(+num); + } + return false; + }; + isNumber$1 = isNumber$2; + toRegexRange$1 = (min2, max, options2) => { + if (isNumber$1(min2) === false) { + throw new TypeError("toRegexRange: expected the first argument to be a number"); + } + if (max === void 0 || min2 === max) { + return String(min2); + } + if (isNumber$1(max) === false) { + throw new TypeError("toRegexRange: expected the second argument to be a number."); + } + let opts = { relaxZeros: true, ...options2 }; + if (typeof opts.strictZeros === "boolean") { + opts.relaxZeros = opts.strictZeros === false; + } + let relax = String(opts.relaxZeros); + let shorthand = String(opts.shorthand); + let capture = String(opts.capture); + let wrap2 = String(opts.wrap); + let cacheKey = min2 + ":" + max + "=" + relax + shorthand + capture + wrap2; + if (toRegexRange$1.cache.hasOwnProperty(cacheKey)) { + return toRegexRange$1.cache[cacheKey].result; + } + let a = Math.min(min2, max); + let b = Math.max(min2, max); + if (Math.abs(a - b) === 1) { + let result = min2 + "|" + max; + if (opts.capture) { + return `(${result})`; + } + if (opts.wrap === false) { + return result; + } + return `(?:${result})`; + } + let isPadded2 = hasPadding(min2) || hasPadding(max); + let state = { min: min2, max, a, b }; + let positives = []; + let negatives = []; + if (isPadded2) { + state.isPadded = isPadded2; + state.maxLen = String(state.max).length; + } + if (a < 0) { + let newMin = b < 0 ? Math.abs(b) : 1; + negatives = splitToPatterns(newMin, Math.abs(a), state, opts); + a = state.a = 0; + } + if (b >= 0) { + positives = splitToPatterns(a, b, state, opts); + } + state.negatives = negatives; + state.positives = positives; + state.result = collatePatterns(negatives, positives); + if (opts.capture === true) { + state.result = `(${state.result})`; + } else if (opts.wrap !== false && positives.length + negatives.length > 1) { + state.result = `(?:${state.result})`; + } + toRegexRange$1.cache[cacheKey] = state; + return state.result; + }; + toRegexRange$1.cache = {}; + toRegexRange$1.clearCache = () => toRegexRange$1.cache = {}; + toRegexRange_1 = toRegexRange$1; + util$1 = require$$0$6; + toRegexRange = toRegexRange_1; + isObject = (val) => val !== null && typeof val === "object" && !Array.isArray(val); + transform$1 = (toNumber) => { + return (value2) => toNumber === true ? Number(value2) : String(value2); + }; + isValidValue = (value2) => { + return typeof value2 === "number" || typeof value2 === "string" && value2 !== ""; + }; + isNumber = (num) => Number.isInteger(+num); + zeros = (input) => { + let value2 = `${input}`; + let index = -1; + if (value2[0] === "-") + value2 = value2.slice(1); + if (value2 === "0") + return false; + while (value2[++index] === "0") + ; + return index > 0; + }; + stringify$6 = (start, end, options2) => { + if (typeof start === "string" || typeof end === "string") { + return true; + } + return options2.stringify === true; + }; + pad = (input, maxLength, toNumber) => { + if (maxLength > 0) { + let dash = input[0] === "-" ? "-" : ""; + if (dash) + input = input.slice(1); + input = dash + input.padStart(dash ? maxLength - 1 : maxLength, "0"); + } + if (toNumber === false) { + return String(input); + } + return input; + }; + toMaxLen = (input, maxLength) => { + let negative = input[0] === "-" ? "-" : ""; + if (negative) { + input = input.slice(1); + maxLength--; + } + while (input.length < maxLength) + input = "0" + input; + return negative ? "-" + input : input; + }; + toSequence = (parts, options2) => { + parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); + parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); + let prefix = options2.capture ? "" : "?:"; + let positives = ""; + let negatives = ""; + let result; + if (parts.positives.length) { + positives = parts.positives.join("|"); + } + if (parts.negatives.length) { + negatives = `-(${prefix}${parts.negatives.join("|")})`; + } + if (positives && negatives) { + result = `${positives}|${negatives}`; + } else { + result = positives || negatives; + } + if (options2.wrap) { + return `(${prefix}${result})`; + } + return result; + }; + toRange = (a, b, isNumbers, options2) => { + if (isNumbers) { + return toRegexRange(a, b, { wrap: false, ...options2 }); + } + let start = String.fromCharCode(a); + if (a === b) + return start; + let stop = String.fromCharCode(b); + return `[${start}-${stop}]`; + }; + toRegex = (start, end, options2) => { + if (Array.isArray(start)) { + let wrap2 = options2.wrap === true; + let prefix = options2.capture ? "" : "?:"; + return wrap2 ? `(${prefix}${start.join("|")})` : start.join("|"); + } + return toRegexRange(start, end, options2); + }; + rangeError = (...args) => { + return new RangeError("Invalid range arguments: " + util$1.inspect(...args)); + }; + invalidRange = (start, end, options2) => { + if (options2.strictRanges === true) + throw rangeError([start, end]); + return []; + }; + invalidStep = (step, options2) => { + if (options2.strictRanges === true) { + throw new TypeError(`Expected step "${step}" to be a number`); + } + return []; + }; + fillNumbers = (start, end, step = 1, options2 = {}) => { + let a = Number(start); + let b = Number(end); + if (!Number.isInteger(a) || !Number.isInteger(b)) { + if (options2.strictRanges === true) + throw rangeError([start, end]); + return []; + } + if (a === 0) + a = 0; + if (b === 0) + b = 0; + let descending = a > b; + let startString = String(start); + let endString = String(end); + let stepString = String(step); + step = Math.max(Math.abs(step), 1); + let padded = zeros(startString) || zeros(endString) || zeros(stepString); + let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0; + let toNumber = padded === false && stringify$6(start, end, options2) === false; + let format2 = options2.transform || transform$1(toNumber); + if (options2.toRegex && step === 1) { + return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options2); + } + let parts = { negatives: [], positives: [] }; + let push2 = (num) => parts[num < 0 ? "negatives" : "positives"].push(Math.abs(num)); + let range = []; + let index = 0; + while (descending ? a >= b : a <= b) { + if (options2.toRegex === true && step > 1) { + push2(a); + } else { + range.push(pad(format2(a, index), maxLen, toNumber)); + } + a = descending ? a - step : a + step; + index++; + } + if (options2.toRegex === true) { + return step > 1 ? toSequence(parts, options2) : toRegex(range, null, { wrap: false, ...options2 }); + } + return range; + }; + fillLetters = (start, end, step = 1, options2 = {}) => { + if (!isNumber(start) && start.length > 1 || !isNumber(end) && end.length > 1) { + return invalidRange(start, end, options2); + } + let format2 = options2.transform || ((val) => String.fromCharCode(val)); + let a = `${start}`.charCodeAt(0); + let b = `${end}`.charCodeAt(0); + let descending = a > b; + let min2 = Math.min(a, b); + let max = Math.max(a, b); + if (options2.toRegex && step === 1) { + return toRange(min2, max, false, options2); + } + let range = []; + let index = 0; + while (descending ? a >= b : a <= b) { + range.push(format2(a, index)); + a = descending ? a - step : a + step; + index++; + } + if (options2.toRegex === true) { + return toRegex(range, null, { wrap: false, options: options2 }); + } + return range; + }; + fill$2 = (start, end, step, options2 = {}) => { + if (end == null && isValidValue(start)) { + return [start]; + } + if (!isValidValue(start) || !isValidValue(end)) { + return invalidRange(start, end, options2); + } + if (typeof step === "function") { + return fill$2(start, end, 1, { transform: step }); + } + if (isObject(step)) { + return fill$2(start, end, 0, step); + } + let opts = { ...options2 }; + if (opts.capture === true) + opts.wrap = true; + step = step || opts.step || 1; + if (!isNumber(step)) { + if (step != null && !isObject(step)) + return invalidStep(step, opts); + return fill$2(start, end, 1, step); + } + if (isNumber(start) && isNumber(end)) { + return fillNumbers(start, end, step, opts); + } + return fillLetters(start, end, Math.max(Math.abs(step), 1), opts); + }; + fillRange = fill$2; + fill$1 = fillRange; + utils$d = utils$f; + compile$1 = (ast, options2 = {}) => { + let walk = (node2, parent = {}) => { + let invalidBlock = utils$d.isInvalidBrace(parent); + let invalidNode = node2.invalid === true && options2.escapeInvalid === true; + let invalid = invalidBlock === true || invalidNode === true; + let prefix = options2.escapeInvalid === true ? "\\" : ""; + let output = ""; + if (node2.isOpen === true) { + return prefix + node2.value; + } + if (node2.isClose === true) { + return prefix + node2.value; + } + if (node2.type === "open") { + return invalid ? prefix + node2.value : "("; + } + if (node2.type === "close") { + return invalid ? prefix + node2.value : ")"; + } + if (node2.type === "comma") { + return node2.prev.type === "comma" ? "" : invalid ? node2.value : "|"; + } + if (node2.value) { + return node2.value; + } + if (node2.nodes && node2.ranges > 0) { + let args = utils$d.reduce(node2.nodes); + let range = fill$1(...args, { ...options2, wrap: false, toRegex: true }); + if (range.length !== 0) { + return args.length > 1 && range.length > 1 ? `(${range})` : range; + } + } + if (node2.nodes) { + for (let child of node2.nodes) { + output += walk(child, node2); + } + } + return output; + }; + return walk(ast); + }; + compile_1 = compile$1; + fill = fillRange; + stringify$5 = stringify$7; + utils$c = utils$f; + append$1 = (queue2 = "", stash = "", enclose = false) => { + let result = []; + queue2 = [].concat(queue2); + stash = [].concat(stash); + if (!stash.length) + return queue2; + if (!queue2.length) { + return enclose ? utils$c.flatten(stash).map((ele) => `{${ele}}`) : stash; + } + for (let item of queue2) { + if (Array.isArray(item)) { + for (let value2 of item) { + result.push(append$1(value2, stash, enclose)); + } + } else { + for (let ele of stash) { + if (enclose === true && typeof ele === "string") + ele = `{${ele}}`; + result.push(Array.isArray(ele) ? append$1(item, ele, enclose) : item + ele); + } + } + } + return utils$c.flatten(result); + }; + expand$2 = (ast, options2 = {}) => { + let rangeLimit = options2.rangeLimit === void 0 ? 1e3 : options2.rangeLimit; + let walk = (node2, parent = {}) => { + node2.queue = []; + let p = parent; + let q = parent.queue; + while (p.type !== "brace" && p.type !== "root" && p.parent) { + p = p.parent; + q = p.queue; + } + if (node2.invalid || node2.dollar) { + q.push(append$1(q.pop(), stringify$5(node2, options2))); + return; + } + if (node2.type === "brace" && node2.invalid !== true && node2.nodes.length === 2) { + q.push(append$1(q.pop(), ["{}"])); + return; + } + if (node2.nodes && node2.ranges > 0) { + let args = utils$c.reduce(node2.nodes); + if (utils$c.exceedsLimit(...args, options2.step, rangeLimit)) { + throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit."); + } + let range = fill(...args, options2); + if (range.length === 0) { + range = stringify$5(node2, options2); + } + q.push(append$1(q.pop(), range)); + node2.nodes = []; + return; + } + let enclose = utils$c.encloseBrace(node2); + let queue2 = node2.queue; + let block = node2; + while (block.type !== "brace" && block.type !== "root" && block.parent) { + block = block.parent; + queue2 = block.queue; + } + for (let i = 0; i < node2.nodes.length; i++) { + let child = node2.nodes[i]; + if (child.type === "comma" && node2.type === "brace") { + if (i === 1) + queue2.push(""); + queue2.push(""); + continue; + } + if (child.type === "close") { + q.push(append$1(q.pop(), queue2, enclose)); + continue; + } + if (child.value && child.type !== "open") { + queue2.push(append$1(queue2.pop(), child.value)); + continue; + } + if (child.nodes) { + walk(child, node2); + } + } + return queue2; + }; + return utils$c.flatten(walk(ast)); + }; + expand_1$1 = expand$2; + constants$3 = { + MAX_LENGTH: 1024 * 64, + // Digits + CHAR_0: "0", + /* 0 */ + CHAR_9: "9", + /* 9 */ + // Alphabet chars. + CHAR_UPPERCASE_A: "A", + /* A */ + CHAR_LOWERCASE_A: "a", + /* a */ + CHAR_UPPERCASE_Z: "Z", + /* Z */ + CHAR_LOWERCASE_Z: "z", + /* z */ + CHAR_LEFT_PARENTHESES: "(", + /* ( */ + CHAR_RIGHT_PARENTHESES: ")", + /* ) */ + CHAR_ASTERISK: "*", + /* * */ + // Non-alphabetic chars. + CHAR_AMPERSAND: "&", + /* & */ + CHAR_AT: "@", + /* @ */ + CHAR_BACKSLASH: "\\", + /* \ */ + CHAR_BACKTICK: "`", + /* ` */ + CHAR_CARRIAGE_RETURN: "\r", + /* \r */ + CHAR_CIRCUMFLEX_ACCENT: "^", + /* ^ */ + CHAR_COLON: ":", + /* : */ + CHAR_COMMA: ",", + /* , */ + CHAR_DOLLAR: "$", + /* . */ + CHAR_DOT: ".", + /* . */ + CHAR_DOUBLE_QUOTE: '"', + /* " */ + CHAR_EQUAL: "=", + /* = */ + CHAR_EXCLAMATION_MARK: "!", + /* ! */ + CHAR_FORM_FEED: "\f", + /* \f */ + CHAR_FORWARD_SLASH: "/", + /* / */ + CHAR_HASH: "#", + /* # */ + CHAR_HYPHEN_MINUS: "-", + /* - */ + CHAR_LEFT_ANGLE_BRACKET: "<", + /* < */ + CHAR_LEFT_CURLY_BRACE: "{", + /* { */ + CHAR_LEFT_SQUARE_BRACKET: "[", + /* [ */ + CHAR_LINE_FEED: "\n", + /* \n */ + CHAR_NO_BREAK_SPACE: "\xA0", + /* \u00A0 */ + CHAR_PERCENT: "%", + /* % */ + CHAR_PLUS: "+", + /* + */ + CHAR_QUESTION_MARK: "?", + /* ? */ + CHAR_RIGHT_ANGLE_BRACKET: ">", + /* > */ + CHAR_RIGHT_CURLY_BRACE: "}", + /* } */ + CHAR_RIGHT_SQUARE_BRACKET: "]", + /* ] */ + CHAR_SEMICOLON: ";", + /* ; */ + CHAR_SINGLE_QUOTE: "'", + /* ' */ + CHAR_SPACE: " ", + /* */ + CHAR_TAB: " ", + /* \t */ + CHAR_UNDERSCORE: "_", + /* _ */ + CHAR_VERTICAL_LINE: "|", + /* | */ + CHAR_ZERO_WIDTH_NOBREAK_SPACE: "\uFEFF" + /* \uFEFF */ + }; + stringify$4 = stringify$7; + ({ + MAX_LENGTH, + CHAR_BACKSLASH, + CHAR_BACKTICK: ( + /* \ */ + CHAR_BACKTICK + ), + CHAR_COMMA: ( + /* ` */ + CHAR_COMMA + ), + CHAR_DOT: ( + /* , */ + CHAR_DOT + ), + CHAR_LEFT_PARENTHESES: ( + /* . */ + CHAR_LEFT_PARENTHESES + ), + CHAR_RIGHT_PARENTHESES: ( + /* ( */ + CHAR_RIGHT_PARENTHESES + ), + CHAR_LEFT_CURLY_BRACE: ( + /* ) */ + CHAR_LEFT_CURLY_BRACE + ), + CHAR_RIGHT_CURLY_BRACE: ( + /* { */ + CHAR_RIGHT_CURLY_BRACE + ), + CHAR_LEFT_SQUARE_BRACKET: ( + /* } */ + CHAR_LEFT_SQUARE_BRACKET + ), + CHAR_RIGHT_SQUARE_BRACKET: ( + /* [ */ + CHAR_RIGHT_SQUARE_BRACKET + ), + CHAR_DOUBLE_QUOTE: ( + /* ] */ + CHAR_DOUBLE_QUOTE + ), + CHAR_SINGLE_QUOTE: ( + /* " */ + CHAR_SINGLE_QUOTE + ), + CHAR_NO_BREAK_SPACE: ( + /* ' */ + CHAR_NO_BREAK_SPACE + ), + CHAR_ZERO_WIDTH_NOBREAK_SPACE + } = constants$3); + parse$c = (input, options2 = {}) => { + if (typeof input !== "string") { + throw new TypeError("Expected a string"); + } + let opts = options2 || {}; + let max = typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + if (input.length > max) { + throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); + } + let ast = { type: "root", input, nodes: [] }; + let stack = [ast]; + let block = ast; + let prev = ast; + let brackets = 0; + let length = input.length; + let index = 0; + let depth2 = 0; + let value2; + const advance2 = () => input[index++]; + const push2 = (node2) => { + if (node2.type === "text" && prev.type === "dot") { + prev.type = "text"; + } + if (prev && prev.type === "text" && node2.type === "text") { + prev.value += node2.value; + return; + } + block.nodes.push(node2); + node2.parent = block; + node2.prev = prev; + prev = node2; + return node2; + }; + push2({ type: "bos" }); + while (index < length) { + block = stack[stack.length - 1]; + value2 = advance2(); + if (value2 === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value2 === CHAR_NO_BREAK_SPACE) { + continue; + } + if (value2 === CHAR_BACKSLASH) { + push2({ type: "text", value: (options2.keepEscaping ? value2 : "") + advance2() }); + continue; + } + if (value2 === CHAR_RIGHT_SQUARE_BRACKET) { + push2({ type: "text", value: "\\" + value2 }); + continue; + } + if (value2 === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + let next; + while (index < length && (next = advance2())) { + value2 += next; + if (next === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + continue; + } + if (next === CHAR_BACKSLASH) { + value2 += advance2(); + continue; + } + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + brackets--; + if (brackets === 0) { + break; + } + } + } + push2({ type: "text", value: value2 }); + continue; + } + if (value2 === CHAR_LEFT_PARENTHESES) { + block = push2({ type: "paren", nodes: [] }); + stack.push(block); + push2({ type: "text", value: value2 }); + continue; + } + if (value2 === CHAR_RIGHT_PARENTHESES) { + if (block.type !== "paren") { + push2({ type: "text", value: value2 }); + continue; + } + block = stack.pop(); + push2({ type: "text", value: value2 }); + block = stack[stack.length - 1]; + continue; + } + if (value2 === CHAR_DOUBLE_QUOTE || value2 === CHAR_SINGLE_QUOTE || value2 === CHAR_BACKTICK) { + let open2 = value2; + let next; + if (options2.keepQuotes !== true) { + value2 = ""; + } + while (index < length && (next = advance2())) { + if (next === CHAR_BACKSLASH) { + value2 += next + advance2(); + continue; + } + if (next === open2) { + if (options2.keepQuotes === true) + value2 += next; + break; + } + value2 += next; + } + push2({ type: "text", value: value2 }); + continue; + } + if (value2 === CHAR_LEFT_CURLY_BRACE) { + depth2++; + let dollar = prev.value && prev.value.slice(-1) === "$" || block.dollar === true; + let brace = { + type: "brace", + open: true, + close: false, + dollar, + depth: depth2, + commas: 0, + ranges: 0, + nodes: [] + }; + block = push2(brace); + stack.push(block); + push2({ type: "open", value: value2 }); + continue; + } + if (value2 === CHAR_RIGHT_CURLY_BRACE) { + if (block.type !== "brace") { + push2({ type: "text", value: value2 }); + continue; + } + let type = "close"; + block = stack.pop(); + block.close = true; + push2({ type, value: value2 }); + depth2--; + block = stack[stack.length - 1]; + continue; + } + if (value2 === CHAR_COMMA && depth2 > 0) { + if (block.ranges > 0) { + block.ranges = 0; + let open2 = block.nodes.shift(); + block.nodes = [open2, { type: "text", value: stringify$4(block) }]; + } + push2({ type: "comma", value: value2 }); + block.commas++; + continue; + } + if (value2 === CHAR_DOT && depth2 > 0 && block.commas === 0) { + let siblings = block.nodes; + if (depth2 === 0 || siblings.length === 0) { + push2({ type: "text", value: value2 }); + continue; + } + if (prev.type === "dot") { + block.range = []; + prev.value += value2; + prev.type = "range"; + if (block.nodes.length !== 3 && block.nodes.length !== 5) { + block.invalid = true; + block.ranges = 0; + prev.type = "text"; + continue; + } + block.ranges++; + block.args = []; + continue; + } + if (prev.type === "range") { + siblings.pop(); + let before = siblings[siblings.length - 1]; + before.value += prev.value + value2; + prev = before; + block.ranges--; + continue; + } + push2({ type: "dot", value: value2 }); + continue; + } + push2({ type: "text", value: value2 }); + } + do { + block = stack.pop(); + if (block.type !== "root") { + block.nodes.forEach((node2) => { + if (!node2.nodes) { + if (node2.type === "open") + node2.isOpen = true; + if (node2.type === "close") + node2.isClose = true; + if (!node2.nodes) + node2.type = "text"; + node2.invalid = true; + } + }); + let parent = stack[stack.length - 1]; + let index2 = parent.nodes.indexOf(block); + parent.nodes.splice(index2, 1, ...block.nodes); + } + } while (stack.length > 0); + push2({ type: "eos" }); + return ast; + }; + parse_1$2 = parse$c; + stringify$3 = stringify$7; + compile = compile_1; + expand$1 = expand_1$1; + parse$b = parse_1$2; + braces$2 = (input, options2 = {}) => { + let output = []; + if (Array.isArray(input)) { + for (let pattern2 of input) { + let result = braces$2.create(pattern2, options2); + if (Array.isArray(result)) { + output.push(...result); + } else { + output.push(result); + } + } + } else { + output = [].concat(braces$2.create(input, options2)); + } + if (options2 && options2.expand === true && options2.nodupes === true) { + output = [...new Set(output)]; + } + return output; + }; + braces$2.parse = (input, options2 = {}) => parse$b(input, options2); + braces$2.stringify = (input, options2 = {}) => { + if (typeof input === "string") { + return stringify$3(braces$2.parse(input, options2), options2); + } + return stringify$3(input, options2); + }; + braces$2.compile = (input, options2 = {}) => { + if (typeof input === "string") { + input = braces$2.parse(input, options2); + } + return compile(input, options2); + }; + braces$2.expand = (input, options2 = {}) => { + if (typeof input === "string") { + input = braces$2.parse(input, options2); + } + let result = expand$1(input, options2); + if (options2.noempty === true) { + result = result.filter(Boolean); + } + if (options2.nodupes === true) { + result = [...new Set(result)]; + } + return result; + }; + braces$2.create = (input, options2 = {}) => { + if (input === "" || input.length < 3) { + return [input]; + } + return options2.expand !== true ? braces$2.compile(input, options2) : braces$2.expand(input, options2); + }; + braces_1 = braces$2; + util = require$$0$6; + braces$1 = braces_1; + picomatch$2 = picomatchExports; + utils$b = utils$k; + isEmptyString = (val) => val === "" || val === "./"; + micromatch$1 = (list, patterns2, options2) => { + patterns2 = [].concat(patterns2); + list = [].concat(list); + let omit = /* @__PURE__ */ new Set(); + let keep = /* @__PURE__ */ new Set(); + let items = /* @__PURE__ */ new Set(); + let negatives = 0; + let onResult = (state) => { + items.add(state.output); + if (options2 && options2.onResult) { + options2.onResult(state); + } + }; + for (let i = 0; i < patterns2.length; i++) { + let isMatch = picomatch$2(String(patterns2[i]), { ...options2, onResult }, true); + let negated = isMatch.state.negated || isMatch.state.negatedExtglob; + if (negated) + negatives++; + for (let item of list) { + let matched = isMatch(item, true); + let match = negated ? !matched.isMatch : matched.isMatch; + if (!match) + continue; + if (negated) { + omit.add(matched.output); + } else { + omit.delete(matched.output); + keep.add(matched.output); + } + } + } + let result = negatives === patterns2.length ? [...items] : [...keep]; + let matches = result.filter((item) => !omit.has(item)); + if (options2 && matches.length === 0) { + if (options2.failglob === true) { + throw new Error(`No matches found for "${patterns2.join(", ")}"`); + } + if (options2.nonull === true || options2.nullglob === true) { + return options2.unescape ? patterns2.map((p) => p.replace(/\\/g, "")) : patterns2; + } + } + return matches; + }; + micromatch$1.match = micromatch$1; + micromatch$1.matcher = (pattern2, options2) => picomatch$2(pattern2, options2); + micromatch$1.isMatch = (str, patterns2, options2) => picomatch$2(patterns2, options2)(str); + micromatch$1.any = micromatch$1.isMatch; + micromatch$1.not = (list, patterns2, options2 = {}) => { + patterns2 = [].concat(patterns2).map(String); + let result = /* @__PURE__ */ new Set(); + let items = []; + let onResult = (state) => { + if (options2.onResult) + options2.onResult(state); + items.push(state.output); + }; + let matches = new Set(micromatch$1(list, patterns2, { ...options2, onResult })); + for (let item of items) { + if (!matches.has(item)) { + result.add(item); + } + } + return [...result]; + }; + micromatch$1.contains = (str, pattern2, options2) => { + if (typeof str !== "string") { + throw new TypeError(`Expected a string: "${util.inspect(str)}"`); + } + if (Array.isArray(pattern2)) { + return pattern2.some((p) => micromatch$1.contains(str, p, options2)); + } + if (typeof pattern2 === "string") { + if (isEmptyString(str) || isEmptyString(pattern2)) { + return false; + } + if (str.includes(pattern2) || str.startsWith("./") && str.slice(2).includes(pattern2)) { + return true; + } + } + return micromatch$1.isMatch(str, pattern2, { ...options2, contains: true }); + }; + micromatch$1.matchKeys = (obj, patterns2, options2) => { + if (!utils$b.isObject(obj)) { + throw new TypeError("Expected the first argument to be an object"); + } + let keys = micromatch$1(Object.keys(obj), patterns2, options2); + let res = {}; + for (let key of keys) + res[key] = obj[key]; + return res; + }; + micromatch$1.some = (list, patterns2, options2) => { + let items = [].concat(list); + for (let pattern2 of [].concat(patterns2)) { + let isMatch = picomatch$2(String(pattern2), options2); + if (items.some((item) => isMatch(item))) { + return true; + } + } + return false; + }; + micromatch$1.every = (list, patterns2, options2) => { + let items = [].concat(list); + for (let pattern2 of [].concat(patterns2)) { + let isMatch = picomatch$2(String(pattern2), options2); + if (!items.every((item) => isMatch(item))) { + return false; + } + } + return true; + }; + micromatch$1.all = (str, patterns2, options2) => { + if (typeof str !== "string") { + throw new TypeError(`Expected a string: "${util.inspect(str)}"`); + } + return [].concat(patterns2).every((p) => picomatch$2(p, options2)(str)); + }; + micromatch$1.capture = (glob, input, options2) => { + let posix2 = utils$b.isWindows(options2); + let regex = picomatch$2.makeRe(String(glob), { ...options2, capture: true }); + let match = regex.exec(posix2 ? utils$b.toPosixSlashes(input) : input); + if (match) { + return match.slice(1).map((v) => v === void 0 ? "" : v); + } + }; + micromatch$1.makeRe = (...args) => picomatch$2.makeRe(...args); + micromatch$1.scan = (...args) => picomatch$2.scan(...args); + micromatch$1.parse = (patterns2, options2) => { + let res = []; + for (let pattern2 of [].concat(patterns2 || [])) { + for (let str of braces$1(String(pattern2), options2)) { + res.push(picomatch$2.parse(str, options2)); + } + } + return res; + }; + micromatch$1.braces = (pattern2, options2) => { + if (typeof pattern2 !== "string") + throw new TypeError("Expected a string"); + if (options2 && options2.nobrace === true || !/\{.*\}/.test(pattern2)) { + return [pattern2]; + } + return braces$1(pattern2, options2); + }; + micromatch$1.braceExpand = (pattern2, options2) => { + if (typeof pattern2 !== "string") + throw new TypeError("Expected a string"); + return micromatch$1.braces(pattern2, { ...options2, expand: true }); + }; + micromatch_1 = micromatch$1; + Object.defineProperty(pattern$1, "__esModule", { value: true }); + pattern$1.matchAny = pattern$1.convertPatternsToRe = pattern$1.makeRe = pattern$1.getPatternParts = pattern$1.expandBraceExpansion = pattern$1.expandPatternsWithBraceExpansion = pattern$1.isAffectDepthOfReadingPattern = pattern$1.endsWithSlashGlobStar = pattern$1.hasGlobStar = pattern$1.getBaseDirectory = pattern$1.isPatternRelatedToParentDirectory = pattern$1.getPatternsOutsideCurrentDirectory = pattern$1.getPatternsInsideCurrentDirectory = pattern$1.getPositivePatterns = pattern$1.getNegativePatterns = pattern$1.isPositivePattern = pattern$1.isNegativePattern = pattern$1.convertToNegativePattern = pattern$1.convertToPositivePattern = pattern$1.isDynamicPattern = pattern$1.isStaticPattern = void 0; + path$f = require$$0$4; + globParent$1 = globParent$2; + micromatch = micromatch_1; + GLOBSTAR$1 = "**"; + ESCAPE_SYMBOL = "\\"; + COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; + REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[[^[]*]/; + REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\([^(]*\|[^|]*\)/; + GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\([^(]*\)/; + BRACE_EXPANSION_SEPARATORS_RE = /,|\.\./; + pattern$1.isStaticPattern = isStaticPattern; + pattern$1.isDynamicPattern = isDynamicPattern; + pattern$1.convertToPositivePattern = convertToPositivePattern; + pattern$1.convertToNegativePattern = convertToNegativePattern; + pattern$1.isNegativePattern = isNegativePattern; + pattern$1.isPositivePattern = isPositivePattern; + pattern$1.getNegativePatterns = getNegativePatterns; + pattern$1.getPositivePatterns = getPositivePatterns$1; + pattern$1.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory; + pattern$1.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory; + pattern$1.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory; + pattern$1.getBaseDirectory = getBaseDirectory; + pattern$1.hasGlobStar = hasGlobStar; + pattern$1.endsWithSlashGlobStar = endsWithSlashGlobStar; + pattern$1.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern; + pattern$1.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion; + pattern$1.expandBraceExpansion = expandBraceExpansion; + pattern$1.getPatternParts = getPatternParts; + pattern$1.makeRe = makeRe; + pattern$1.convertPatternsToRe = convertPatternsToRe; + pattern$1.matchAny = matchAny; + stream$4 = {}; + Stream = require$$0$7; + PassThrough = Stream.PassThrough; + slice = Array.prototype.slice; + merge2_1 = merge2$1; + Object.defineProperty(stream$4, "__esModule", { value: true }); + stream$4.merge = void 0; + merge2 = merge2_1; + stream$4.merge = merge$1; + string$2 = {}; + Object.defineProperty(string$2, "__esModule", { value: true }); + string$2.isEmpty = string$2.isString = void 0; + string$2.isString = isString; + string$2.isEmpty = isEmpty$1; + Object.defineProperty(utils$g, "__esModule", { value: true }); + utils$g.string = utils$g.stream = utils$g.pattern = utils$g.path = utils$g.fs = utils$g.errno = utils$g.array = void 0; + array = array$1; + utils$g.array = array; + errno = errno$1; + utils$g.errno = errno; + fs$g = fs$h; + utils$g.fs = fs$g; + path$e = path$h; + utils$g.path = path$e; + pattern = pattern$1; + utils$g.pattern = pattern; + stream$3 = stream$4; + utils$g.stream = stream$3; + string$1 = string$2; + utils$g.string = string$1; + Object.defineProperty(tasks, "__esModule", { value: true }); + tasks.convertPatternGroupToTask = tasks.convertPatternGroupsToTasks = tasks.groupPatternsByBaseDirectory = tasks.getNegativePatternsAsPositive = tasks.getPositivePatterns = tasks.convertPatternsToTasks = tasks.generate = void 0; + utils$a = utils$g; + tasks.generate = generate; + tasks.convertPatternsToTasks = convertPatternsToTasks; + tasks.getPositivePatterns = getPositivePatterns; + tasks.getNegativePatternsAsPositive = getNegativePatternsAsPositive; + tasks.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory; + tasks.convertPatternGroupsToTasks = convertPatternGroupsToTasks; + tasks.convertPatternGroupToTask = convertPatternGroupToTask; + patterns = {}; + Object.defineProperty(patterns, "__esModule", { value: true }); + patterns.removeDuplicateSlashes = patterns.transform = void 0; + DOUBLE_SLASH_RE$1 = /(?!^)\/{2,}/g; + patterns.transform = transform; + patterns.removeDuplicateSlashes = removeDuplicateSlashes; + async$7 = {}; + async$6 = {}; + out$3 = {}; + async$5 = {}; + async$4 = {}; + out$2 = {}; + async$3 = {}; + out$1 = {}; + async$2 = {}; + Object.defineProperty(async$2, "__esModule", { value: true }); + async$2.read = void 0; + async$2.read = read$3; + sync$8 = {}; + Object.defineProperty(sync$8, "__esModule", { value: true }); + sync$8.read = void 0; + sync$8.read = read$2; + settings$3 = {}; + fs$f = {}; + (function(exports2) { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createFileSystemAdapter = exports2.FILE_SYSTEM_ADAPTER = void 0; + const fs2 = require$$0__default; + exports2.FILE_SYSTEM_ADAPTER = { + lstat: fs2.lstat, + stat: fs2.stat, + lstatSync: fs2.lstatSync, + statSync: fs2.statSync + }; + function createFileSystemAdapter(fsMethods) { + if (fsMethods === void 0) { + return exports2.FILE_SYSTEM_ADAPTER; + } + return Object.assign(Object.assign({}, exports2.FILE_SYSTEM_ADAPTER), fsMethods); + } + exports2.createFileSystemAdapter = createFileSystemAdapter; + })(fs$f); + Object.defineProperty(settings$3, "__esModule", { value: true }); + fs$e = fs$f; + Settings$2 = class Settings { + constructor(_options = {}) { + this._options = _options; + this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true); + this.fs = fs$e.createFileSystemAdapter(this._options.fs); + this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); + } + _getValue(option, value2) { + return option !== null && option !== void 0 ? option : value2; + } + }; + settings$3.default = Settings$2; + Object.defineProperty(out$1, "__esModule", { value: true }); + out$1.statSync = out$1.stat = out$1.Settings = void 0; + async$1 = async$2; + sync$7 = sync$8; + settings_1$3 = settings$3; + out$1.Settings = settings_1$3.default; + out$1.stat = stat$4; + out$1.statSync = statSync; + queueMicrotask_1 = typeof queueMicrotask === "function" ? queueMicrotask.bind(typeof window !== "undefined" ? window : commonjsGlobal) : (cb) => (promise || (promise = Promise.resolve())).then(cb).catch((err) => setTimeout(() => { + throw err; + }, 0)); + runParallel_1 = runParallel; + queueMicrotask$1 = queueMicrotask_1; + constants$2 = {}; + Object.defineProperty(constants$2, "__esModule", { value: true }); + constants$2.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0; + NODE_PROCESS_VERSION_PARTS = process.versions.node.split("."); + if (NODE_PROCESS_VERSION_PARTS[0] === void 0 || NODE_PROCESS_VERSION_PARTS[1] === void 0) { + throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`); + } + MAJOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[0], 10); + MINOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[1], 10); + SUPPORTED_MAJOR_VERSION = 10; + SUPPORTED_MINOR_VERSION = 10; + IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION; + IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION; + constants$2.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR; + utils$9 = {}; + fs$d = {}; + Object.defineProperty(fs$d, "__esModule", { value: true }); + fs$d.createDirentFromStats = void 0; + DirentFromStats2 = class { + constructor(name2, stats) { + this.name = name2; + this.isBlockDevice = stats.isBlockDevice.bind(stats); + this.isCharacterDevice = stats.isCharacterDevice.bind(stats); + this.isDirectory = stats.isDirectory.bind(stats); + this.isFIFO = stats.isFIFO.bind(stats); + this.isFile = stats.isFile.bind(stats); + this.isSocket = stats.isSocket.bind(stats); + this.isSymbolicLink = stats.isSymbolicLink.bind(stats); + } + }; + fs$d.createDirentFromStats = createDirentFromStats; + Object.defineProperty(utils$9, "__esModule", { value: true }); + utils$9.fs = void 0; + fs$c = fs$d; + utils$9.fs = fs$c; + common$a = {}; + Object.defineProperty(common$a, "__esModule", { value: true }); + common$a.joinPathSegments = void 0; + common$a.joinPathSegments = joinPathSegments$1; + Object.defineProperty(async$3, "__esModule", { value: true }); + async$3.readdir = async$3.readdirWithFileTypes = async$3.read = void 0; + fsStat$5 = out$1; + rpl = runParallel_1; + constants_1$1 = constants$2; + utils$8 = utils$9; + common$9 = common$a; + async$3.read = read$1; + async$3.readdirWithFileTypes = readdirWithFileTypes$1; + async$3.readdir = readdir$3; + sync$6 = {}; + Object.defineProperty(sync$6, "__esModule", { value: true }); + sync$6.readdir = sync$6.readdirWithFileTypes = sync$6.read = void 0; + fsStat$4 = out$1; + constants_1 = constants$2; + utils$7 = utils$9; + common$8 = common$a; + sync$6.read = read; + sync$6.readdirWithFileTypes = readdirWithFileTypes; + sync$6.readdir = readdir$2; + settings$2 = {}; + fs$b = {}; + (function(exports2) { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createFileSystemAdapter = exports2.FILE_SYSTEM_ADAPTER = void 0; + const fs2 = require$$0__default; + exports2.FILE_SYSTEM_ADAPTER = { + lstat: fs2.lstat, + stat: fs2.stat, + lstatSync: fs2.lstatSync, + statSync: fs2.statSync, + readdir: fs2.readdir, + readdirSync: fs2.readdirSync + }; + function createFileSystemAdapter(fsMethods) { + if (fsMethods === void 0) { + return exports2.FILE_SYSTEM_ADAPTER; + } + return Object.assign(Object.assign({}, exports2.FILE_SYSTEM_ADAPTER), fsMethods); + } + exports2.createFileSystemAdapter = createFileSystemAdapter; + })(fs$b); + Object.defineProperty(settings$2, "__esModule", { value: true }); + path$d = require$$0$4; + fsStat$3 = out$1; + fs$a = fs$b; + Settings$1 = class Settings2 { + constructor(_options = {}) { + this._options = _options; + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false); + this.fs = fs$a.createFileSystemAdapter(this._options.fs); + this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path$d.sep); + this.stats = this._getValue(this._options.stats, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true); + this.fsStatSettings = new fsStat$3.Settings({ + followSymbolicLink: this.followSymbolicLinks, + fs: this.fs, + throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink + }); + } + _getValue(option, value2) { + return option !== null && option !== void 0 ? option : value2; + } + }; + settings$2.default = Settings$1; + Object.defineProperty(out$2, "__esModule", { value: true }); + out$2.Settings = out$2.scandirSync = out$2.scandir = void 0; + async = async$3; + sync$5 = sync$6; + settings_1$2 = settings$2; + out$2.Settings = settings_1$2.default; + out$2.scandir = scandir; + out$2.scandirSync = scandirSync; + queueExports = {}; + queue = { + get exports() { + return queueExports; + }, + set exports(v) { + queueExports = v; + } + }; + reusify_1 = reusify$1; + reusify = reusify_1; + queue.exports = fastqueue; + queueExports.promise = queueAsPromised; + common$7 = {}; + Object.defineProperty(common$7, "__esModule", { value: true }); + common$7.joinPathSegments = common$7.replacePathSegmentSeparator = common$7.isAppliedFilter = common$7.isFatalError = void 0; + common$7.isFatalError = isFatalError; + common$7.isAppliedFilter = isAppliedFilter; + common$7.replacePathSegmentSeparator = replacePathSegmentSeparator; + common$7.joinPathSegments = joinPathSegments; + reader$1 = {}; + Object.defineProperty(reader$1, "__esModule", { value: true }); + common$6 = common$7; + Reader$1 = class Reader { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._root = common$6.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator); + } + }; + reader$1.default = Reader$1; + Object.defineProperty(async$4, "__esModule", { value: true }); + events_1 = require$$0$5; + fsScandir$2 = out$2; + fastq = queueExports; + common$5 = common$7; + reader_1$4 = reader$1; + AsyncReader = class extends reader_1$4.default { + constructor(_root, _settings) { + super(_root, _settings); + this._settings = _settings; + this._scandir = fsScandir$2.scandir; + this._emitter = new events_1.EventEmitter(); + this._queue = fastq(this._worker.bind(this), this._settings.concurrency); + this._isFatalError = false; + this._isDestroyed = false; + this._queue.drain = () => { + if (!this._isFatalError) { + this._emitter.emit("end"); + } + }; + } + read() { + this._isFatalError = false; + this._isDestroyed = false; + setImmediate(() => { + this._pushToQueue(this._root, this._settings.basePath); + }); + return this._emitter; + } + get isDestroyed() { + return this._isDestroyed; + } + destroy() { + if (this._isDestroyed) { + throw new Error("The reader is already destroyed"); + } + this._isDestroyed = true; + this._queue.killAndDrain(); + } + onEntry(callback) { + this._emitter.on("entry", callback); + } + onError(callback) { + this._emitter.once("error", callback); + } + onEnd(callback) { + this._emitter.once("end", callback); + } + _pushToQueue(directory, base2) { + const queueItem = { directory, base: base2 }; + this._queue.push(queueItem, (error2) => { + if (error2 !== null) { + this._handleError(error2); + } + }); + } + _worker(item, done) { + this._scandir(item.directory, this._settings.fsScandirSettings, (error2, entries) => { + if (error2 !== null) { + done(error2, void 0); + return; + } + for (const entry2 of entries) { + this._handleEntry(entry2, item.base); + } + done(null, void 0); + }); + } + _handleError(error2) { + if (this._isDestroyed || !common$5.isFatalError(this._settings, error2)) { + return; + } + this._isFatalError = true; + this._isDestroyed = true; + this._emitter.emit("error", error2); + } + _handleEntry(entry2, base2) { + if (this._isDestroyed || this._isFatalError) { + return; + } + const fullpath = entry2.path; + if (base2 !== void 0) { + entry2.path = common$5.joinPathSegments(base2, entry2.name, this._settings.pathSegmentSeparator); + } + if (common$5.isAppliedFilter(this._settings.entryFilter, entry2)) { + this._emitEntry(entry2); + } + if (entry2.dirent.isDirectory() && common$5.isAppliedFilter(this._settings.deepFilter, entry2)) { + this._pushToQueue(fullpath, base2 === void 0 ? void 0 : entry2.path); + } + } + _emitEntry(entry2) { + this._emitter.emit("entry", entry2); + } + }; + async$4.default = AsyncReader; + Object.defineProperty(async$5, "__esModule", { value: true }); + async_1$4 = async$4; + AsyncProvider = class { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new async_1$4.default(this._root, this._settings); + this._storage = []; + } + read(callback) { + this._reader.onError((error2) => { + callFailureCallback(callback, error2); + }); + this._reader.onEntry((entry2) => { + this._storage.push(entry2); + }); + this._reader.onEnd(() => { + callSuccessCallback(callback, this._storage); + }); + this._reader.read(); + } + }; + async$5.default = AsyncProvider; + stream$2 = {}; + Object.defineProperty(stream$2, "__esModule", { value: true }); + stream_1$5 = require$$0$7; + async_1$3 = async$4; + StreamProvider = class { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new async_1$3.default(this._root, this._settings); + this._stream = new stream_1$5.Readable({ + objectMode: true, + read: () => { + }, + destroy: () => { + if (!this._reader.isDestroyed) { + this._reader.destroy(); + } + } + }); + } + read() { + this._reader.onError((error2) => { + this._stream.emit("error", error2); + }); + this._reader.onEntry((entry2) => { + this._stream.push(entry2); + }); + this._reader.onEnd(() => { + this._stream.push(null); + }); + this._reader.read(); + return this._stream; + } + }; + stream$2.default = StreamProvider; + sync$4 = {}; + sync$3 = {}; + Object.defineProperty(sync$3, "__esModule", { value: true }); + fsScandir$1 = out$2; + common$4 = common$7; + reader_1$3 = reader$1; + SyncReader = class extends reader_1$3.default { + constructor() { + super(...arguments); + this._scandir = fsScandir$1.scandirSync; + this._storage = []; + this._queue = /* @__PURE__ */ new Set(); + } + read() { + this._pushToQueue(this._root, this._settings.basePath); + this._handleQueue(); + return this._storage; + } + _pushToQueue(directory, base2) { + this._queue.add({ directory, base: base2 }); + } + _handleQueue() { + for (const item of this._queue.values()) { + this._handleDirectory(item.directory, item.base); + } + } + _handleDirectory(directory, base2) { + try { + const entries = this._scandir(directory, this._settings.fsScandirSettings); + for (const entry2 of entries) { + this._handleEntry(entry2, base2); + } + } catch (error2) { + this._handleError(error2); + } + } + _handleError(error2) { + if (!common$4.isFatalError(this._settings, error2)) { + return; + } + throw error2; + } + _handleEntry(entry2, base2) { + const fullpath = entry2.path; + if (base2 !== void 0) { + entry2.path = common$4.joinPathSegments(base2, entry2.name, this._settings.pathSegmentSeparator); + } + if (common$4.isAppliedFilter(this._settings.entryFilter, entry2)) { + this._pushToStorage(entry2); + } + if (entry2.dirent.isDirectory() && common$4.isAppliedFilter(this._settings.deepFilter, entry2)) { + this._pushToQueue(fullpath, base2 === void 0 ? void 0 : entry2.path); + } + } + _pushToStorage(entry2) { + this._storage.push(entry2); + } + }; + sync$3.default = SyncReader; + Object.defineProperty(sync$4, "__esModule", { value: true }); + sync_1$3 = sync$3; + SyncProvider = class { + constructor(_root, _settings) { + this._root = _root; + this._settings = _settings; + this._reader = new sync_1$3.default(this._root, this._settings); + } + read() { + return this._reader.read(); + } + }; + sync$4.default = SyncProvider; + settings$1 = {}; + Object.defineProperty(settings$1, "__esModule", { value: true }); + path$c = require$$0$4; + fsScandir = out$2; + Settings3 = class { + constructor(_options = {}) { + this._options = _options; + this.basePath = this._getValue(this._options.basePath, void 0); + this.concurrency = this._getValue(this._options.concurrency, Number.POSITIVE_INFINITY); + this.deepFilter = this._getValue(this._options.deepFilter, null); + this.entryFilter = this._getValue(this._options.entryFilter, null); + this.errorFilter = this._getValue(this._options.errorFilter, null); + this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path$c.sep); + this.fsScandirSettings = new fsScandir.Settings({ + followSymbolicLinks: this._options.followSymbolicLinks, + fs: this._options.fs, + pathSegmentSeparator: this._options.pathSegmentSeparator, + stats: this._options.stats, + throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink + }); + } + _getValue(option, value2) { + return option !== null && option !== void 0 ? option : value2; + } + }; + settings$1.default = Settings3; + Object.defineProperty(out$3, "__esModule", { value: true }); + out$3.Settings = out$3.walkStream = out$3.walkSync = out$3.walk = void 0; + async_1$2 = async$5; + stream_1$4 = stream$2; + sync_1$2 = sync$4; + settings_1$1 = settings$1; + out$3.Settings = settings_1$1.default; + out$3.walk = walk$2; + out$3.walkSync = walkSync; + out$3.walkStream = walkStream; + reader = {}; + Object.defineProperty(reader, "__esModule", { value: true }); + path$b = require$$0$4; + fsStat$2 = out$1; + utils$6 = utils$g; + Reader2 = class { + constructor(_settings) { + this._settings = _settings; + this._fsStatSettings = new fsStat$2.Settings({ + followSymbolicLink: this._settings.followSymbolicLinks, + fs: this._settings.fs, + throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks + }); + } + _getFullEntryPath(filepath) { + return path$b.resolve(this._settings.cwd, filepath); + } + _makeEntry(stats, pattern2) { + const entry2 = { + name: pattern2, + path: pattern2, + dirent: utils$6.fs.createDirentFromStats(pattern2, stats) + }; + if (this._settings.stats) { + entry2.stats = stats; + } + return entry2; + } + _isFatalError(error2) { + return !utils$6.errno.isEnoentCodeError(error2) && !this._settings.suppressErrors; + } + }; + reader.default = Reader2; + stream$1 = {}; + Object.defineProperty(stream$1, "__esModule", { value: true }); + stream_1$3 = require$$0$7; + fsStat$1 = out$1; + fsWalk$2 = out$3; + reader_1$2 = reader; + ReaderStream = class extends reader_1$2.default { + constructor() { + super(...arguments); + this._walkStream = fsWalk$2.walkStream; + this._stat = fsStat$1.stat; + } + dynamic(root, options2) { + return this._walkStream(root, options2); + } + static(patterns2, options2) { + const filepaths = patterns2.map(this._getFullEntryPath, this); + const stream4 = new stream_1$3.PassThrough({ objectMode: true }); + stream4._write = (index, _enc, done) => { + return this._getEntry(filepaths[index], patterns2[index], options2).then((entry2) => { + if (entry2 !== null && options2.entryFilter(entry2)) { + stream4.push(entry2); + } + if (index === filepaths.length - 1) { + stream4.end(); + } + done(); + }).catch(done); + }; + for (let i = 0; i < filepaths.length; i++) { + stream4.write(i); + } + return stream4; + } + _getEntry(filepath, pattern2, options2) { + return this._getStat(filepath).then((stats) => this._makeEntry(stats, pattern2)).catch((error2) => { + if (options2.errorFilter(error2)) { + return null; + } + throw error2; + }); + } + _getStat(filepath) { + return new Promise((resolve3, reject) => { + this._stat(filepath, this._fsStatSettings, (error2, stats) => { + return error2 === null ? resolve3(stats) : reject(error2); + }); + }); + } + }; + stream$1.default = ReaderStream; + Object.defineProperty(async$6, "__esModule", { value: true }); + fsWalk$1 = out$3; + reader_1$1 = reader; + stream_1$2 = stream$1; + ReaderAsync = class extends reader_1$1.default { + constructor() { + super(...arguments); + this._walkAsync = fsWalk$1.walk; + this._readerStream = new stream_1$2.default(this._settings); + } + dynamic(root, options2) { + return new Promise((resolve3, reject) => { + this._walkAsync(root, options2, (error2, entries) => { + if (error2 === null) { + resolve3(entries); + } else { + reject(error2); + } + }); + }); + } + async static(patterns2, options2) { + const entries = []; + const stream4 = this._readerStream.static(patterns2, options2); + return new Promise((resolve3, reject) => { + stream4.once("error", reject); + stream4.on("data", (entry2) => entries.push(entry2)); + stream4.once("end", () => resolve3(entries)); + }); + } + }; + async$6.default = ReaderAsync; + provider = {}; + deep = {}; + partial = {}; + matcher = {}; + Object.defineProperty(matcher, "__esModule", { value: true }); + utils$5 = utils$g; + Matcher = class { + constructor(_patterns, _settings, _micromatchOptions) { + this._patterns = _patterns; + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + this._storage = []; + this._fillStorage(); + } + _fillStorage() { + const patterns2 = utils$5.pattern.expandPatternsWithBraceExpansion(this._patterns); + for (const pattern2 of patterns2) { + const segments = this._getPatternSegments(pattern2); + const sections = this._splitSegmentsIntoSections(segments); + this._storage.push({ + complete: sections.length <= 1, + pattern: pattern2, + segments, + sections + }); + } + } + _getPatternSegments(pattern2) { + const parts = utils$5.pattern.getPatternParts(pattern2, this._micromatchOptions); + return parts.map((part) => { + const dynamic = utils$5.pattern.isDynamicPattern(part, this._settings); + if (!dynamic) { + return { + dynamic: false, + pattern: part + }; + } + return { + dynamic: true, + pattern: part, + patternRe: utils$5.pattern.makeRe(part, this._micromatchOptions) + }; + }); + } + _splitSegmentsIntoSections(segments) { + return utils$5.array.splitWhen(segments, (segment) => segment.dynamic && utils$5.pattern.hasGlobStar(segment.pattern)); + } + }; + matcher.default = Matcher; + Object.defineProperty(partial, "__esModule", { value: true }); + matcher_1 = matcher; + PartialMatcher = class extends matcher_1.default { + match(filepath) { + const parts = filepath.split("/"); + const levels = parts.length; + const patterns2 = this._storage.filter((info) => !info.complete || info.segments.length > levels); + for (const pattern2 of patterns2) { + const section = pattern2.sections[0]; + if (!pattern2.complete && levels > section.length) { + return true; + } + const match = parts.every((part, index) => { + const segment = pattern2.segments[index]; + if (segment.dynamic && segment.patternRe.test(part)) { + return true; + } + if (!segment.dynamic && segment.pattern === part) { + return true; + } + return false; + }); + if (match) { + return true; + } + } + return false; + } + }; + partial.default = PartialMatcher; + Object.defineProperty(deep, "__esModule", { value: true }); + utils$4 = utils$g; + partial_1 = partial; + DeepFilter = class { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + } + getFilter(basePath, positive, negative) { + const matcher2 = this._getMatcher(positive); + const negativeRe = this._getNegativePatternsRe(negative); + return (entry2) => this._filter(basePath, entry2, matcher2, negativeRe); + } + _getMatcher(patterns2) { + return new partial_1.default(patterns2, this._settings, this._micromatchOptions); + } + _getNegativePatternsRe(patterns2) { + const affectDepthOfReadingPatterns = patterns2.filter(utils$4.pattern.isAffectDepthOfReadingPattern); + return utils$4.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); + } + _filter(basePath, entry2, matcher2, negativeRe) { + if (this._isSkippedByDeep(basePath, entry2.path)) { + return false; + } + if (this._isSkippedSymbolicLink(entry2)) { + return false; + } + const filepath = utils$4.path.removeLeadingDotSegment(entry2.path); + if (this._isSkippedByPositivePatterns(filepath, matcher2)) { + return false; + } + return this._isSkippedByNegativePatterns(filepath, negativeRe); + } + _isSkippedByDeep(basePath, entryPath) { + if (this._settings.deep === Infinity) { + return false; + } + return this._getEntryLevel(basePath, entryPath) >= this._settings.deep; + } + _getEntryLevel(basePath, entryPath) { + const entryPathDepth = entryPath.split("/").length; + if (basePath === "") { + return entryPathDepth; + } + const basePathDepth = basePath.split("/").length; + return entryPathDepth - basePathDepth; + } + _isSkippedSymbolicLink(entry2) { + return !this._settings.followSymbolicLinks && entry2.dirent.isSymbolicLink(); + } + _isSkippedByPositivePatterns(entryPath, matcher2) { + return !this._settings.baseNameMatch && !matcher2.match(entryPath); + } + _isSkippedByNegativePatterns(entryPath, patternsRe) { + return !utils$4.pattern.matchAny(entryPath, patternsRe); + } + }; + deep.default = DeepFilter; + entry$1 = {}; + Object.defineProperty(entry$1, "__esModule", { value: true }); + utils$3 = utils$g; + EntryFilter = class { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + this.index = /* @__PURE__ */ new Map(); + } + getFilter(positive, negative) { + const positiveRe = utils$3.pattern.convertPatternsToRe(positive, this._micromatchOptions); + const negativeRe = utils$3.pattern.convertPatternsToRe(negative, this._micromatchOptions); + return (entry2) => this._filter(entry2, positiveRe, negativeRe); + } + _filter(entry2, positiveRe, negativeRe) { + if (this._settings.unique && this._isDuplicateEntry(entry2)) { + return false; + } + if (this._onlyFileFilter(entry2) || this._onlyDirectoryFilter(entry2)) { + return false; + } + if (this._isSkippedByAbsoluteNegativePatterns(entry2.path, negativeRe)) { + return false; + } + const filepath = this._settings.baseNameMatch ? entry2.name : entry2.path; + const isDirectory = entry2.dirent.isDirectory(); + const isMatched = this._isMatchToPatterns(filepath, positiveRe, isDirectory) && !this._isMatchToPatterns(entry2.path, negativeRe, isDirectory); + if (this._settings.unique && isMatched) { + this._createIndexRecord(entry2); + } + return isMatched; + } + _isDuplicateEntry(entry2) { + return this.index.has(entry2.path); + } + _createIndexRecord(entry2) { + this.index.set(entry2.path, void 0); + } + _onlyFileFilter(entry2) { + return this._settings.onlyFiles && !entry2.dirent.isFile(); + } + _onlyDirectoryFilter(entry2) { + return this._settings.onlyDirectories && !entry2.dirent.isDirectory(); + } + _isSkippedByAbsoluteNegativePatterns(entryPath, patternsRe) { + if (!this._settings.absolute) { + return false; + } + const fullpath = utils$3.path.makeAbsolute(this._settings.cwd, entryPath); + return utils$3.pattern.matchAny(fullpath, patternsRe); + } + _isMatchToPatterns(entryPath, patternsRe, isDirectory) { + const filepath = utils$3.path.removeLeadingDotSegment(entryPath); + const isMatched = utils$3.pattern.matchAny(filepath, patternsRe); + if (!isMatched && isDirectory) { + return utils$3.pattern.matchAny(filepath + "/", patternsRe); + } + return isMatched; + } + }; + entry$1.default = EntryFilter; + error$2 = {}; + Object.defineProperty(error$2, "__esModule", { value: true }); + utils$2 = utils$g; + ErrorFilter = class { + constructor(_settings) { + this._settings = _settings; + } + getFilter() { + return (error2) => this._isNonFatalError(error2); + } + _isNonFatalError(error2) { + return utils$2.errno.isEnoentCodeError(error2) || this._settings.suppressErrors; + } + }; + error$2.default = ErrorFilter; + entry = {}; + Object.defineProperty(entry, "__esModule", { value: true }); + utils$1 = utils$g; + EntryTransformer = class { + constructor(_settings) { + this._settings = _settings; + } + getTransformer() { + return (entry2) => this._transform(entry2); + } + _transform(entry2) { + let filepath = entry2.path; + if (this._settings.absolute) { + filepath = utils$1.path.makeAbsolute(this._settings.cwd, filepath); + filepath = utils$1.path.unixify(filepath); + } + if (this._settings.markDirectories && entry2.dirent.isDirectory()) { + filepath += "/"; + } + if (!this._settings.objectMode) { + return filepath; + } + return Object.assign(Object.assign({}, entry2), { path: filepath }); + } + }; + entry.default = EntryTransformer; + Object.defineProperty(provider, "__esModule", { value: true }); + path$a = require$$0$4; + deep_1 = deep; + entry_1 = entry$1; + error_1 = error$2; + entry_2 = entry; + Provider = class { + constructor(_settings) { + this._settings = _settings; + this.errorFilter = new error_1.default(this._settings); + this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); + this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); + this.entryTransformer = new entry_2.default(this._settings); + } + _getRootDirectory(task) { + return path$a.resolve(this._settings.cwd, task.base); + } + _getReaderOptions(task) { + const basePath = task.base === "." ? "" : task.base; + return { + basePath, + pathSegmentSeparator: "/", + concurrency: this._settings.concurrency, + deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), + entryFilter: this.entryFilter.getFilter(task.positive, task.negative), + errorFilter: this.errorFilter.getFilter(), + followSymbolicLinks: this._settings.followSymbolicLinks, + fs: this._settings.fs, + stats: this._settings.stats, + throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, + transform: this.entryTransformer.getTransformer() + }; + } + _getMicromatchOptions() { + return { + dot: this._settings.dot, + matchBase: this._settings.baseNameMatch, + nobrace: !this._settings.braceExpansion, + nocase: !this._settings.caseSensitiveMatch, + noext: !this._settings.extglob, + noglobstar: !this._settings.globstar, + posix: true, + strictSlashes: false + }; + } + }; + provider.default = Provider; + Object.defineProperty(async$7, "__esModule", { value: true }); + async_1$1 = async$6; + provider_1$2 = provider; + ProviderAsync = class extends provider_1$2.default { + constructor() { + super(...arguments); + this._reader = new async_1$1.default(this._settings); + } + async read(task) { + const root = this._getRootDirectory(task); + const options2 = this._getReaderOptions(task); + const entries = await this.api(root, task, options2); + return entries.map((entry2) => options2.transform(entry2)); + } + api(root, task, options2) { + if (task.dynamic) { + return this._reader.dynamic(root, options2); + } + return this._reader.static(task.patterns, options2); + } + }; + async$7.default = ProviderAsync; + stream = {}; + Object.defineProperty(stream, "__esModule", { value: true }); + stream_1$1 = require$$0$7; + stream_2 = stream$1; + provider_1$1 = provider; + ProviderStream = class extends provider_1$1.default { + constructor() { + super(...arguments); + this._reader = new stream_2.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options2 = this._getReaderOptions(task); + const source = this.api(root, task, options2); + const destination = new stream_1$1.Readable({ objectMode: true, read: () => { + } }); + source.once("error", (error2) => destination.emit("error", error2)).on("data", (entry2) => destination.emit("data", options2.transform(entry2))).once("end", () => destination.emit("end")); + destination.once("close", () => source.destroy()); + return destination; + } + api(root, task, options2) { + if (task.dynamic) { + return this._reader.dynamic(root, options2); + } + return this._reader.static(task.patterns, options2); + } + }; + stream.default = ProviderStream; + sync$2 = {}; + sync$1 = {}; + Object.defineProperty(sync$1, "__esModule", { value: true }); + fsStat = out$1; + fsWalk = out$3; + reader_1 = reader; + ReaderSync = class extends reader_1.default { + constructor() { + super(...arguments); + this._walkSync = fsWalk.walkSync; + this._statSync = fsStat.statSync; + } + dynamic(root, options2) { + return this._walkSync(root, options2); + } + static(patterns2, options2) { + const entries = []; + for (const pattern2 of patterns2) { + const filepath = this._getFullEntryPath(pattern2); + const entry2 = this._getEntry(filepath, pattern2, options2); + if (entry2 === null || !options2.entryFilter(entry2)) { + continue; + } + entries.push(entry2); + } + return entries; + } + _getEntry(filepath, pattern2, options2) { + try { + const stats = this._getStat(filepath); + return this._makeEntry(stats, pattern2); + } catch (error2) { + if (options2.errorFilter(error2)) { + return null; + } + throw error2; + } + } + _getStat(filepath) { + return this._statSync(filepath, this._fsStatSettings); + } + }; + sync$1.default = ReaderSync; + Object.defineProperty(sync$2, "__esModule", { value: true }); + sync_1$1 = sync$1; + provider_1 = provider; + ProviderSync = class extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new sync_1$1.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options2 = this._getReaderOptions(task); + const entries = this.api(root, task, options2); + return entries.map(options2.transform); + } + api(root, task, options2) { + if (task.dynamic) { + return this._reader.dynamic(root, options2); + } + return this._reader.static(task.patterns, options2); + } + }; + sync$2.default = ProviderSync; + settings = {}; + (function(exports2) { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.DEFAULT_FILE_SYSTEM_ADAPTER = void 0; + const fs2 = require$$0__default; + const os2 = require$$2; + const CPU_COUNT = Math.max(os2.cpus().length, 1); + exports2.DEFAULT_FILE_SYSTEM_ADAPTER = { + lstat: fs2.lstat, + lstatSync: fs2.lstatSync, + stat: fs2.stat, + statSync: fs2.statSync, + readdir: fs2.readdir, + readdirSync: fs2.readdirSync + }; + class Settings4 { + constructor(_options = {}) { + this._options = _options; + this.absolute = this._getValue(this._options.absolute, false); + this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); + this.braceExpansion = this._getValue(this._options.braceExpansion, true); + this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); + this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); + this.cwd = this._getValue(this._options.cwd, process.cwd()); + this.deep = this._getValue(this._options.deep, Infinity); + this.dot = this._getValue(this._options.dot, false); + this.extglob = this._getValue(this._options.extglob, true); + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); + this.fs = this._getFileSystemMethods(this._options.fs); + this.globstar = this._getValue(this._options.globstar, true); + this.ignore = this._getValue(this._options.ignore, []); + this.markDirectories = this._getValue(this._options.markDirectories, false); + this.objectMode = this._getValue(this._options.objectMode, false); + this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); + this.onlyFiles = this._getValue(this._options.onlyFiles, true); + this.stats = this._getValue(this._options.stats, false); + this.suppressErrors = this._getValue(this._options.suppressErrors, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); + this.unique = this._getValue(this._options.unique, true); + if (this.onlyDirectories) { + this.onlyFiles = false; + } + if (this.stats) { + this.objectMode = true; + } + } + _getValue(option, value2) { + return option === void 0 ? value2 : option; + } + _getFileSystemMethods(methods = {}) { + return Object.assign(Object.assign({}, exports2.DEFAULT_FILE_SYSTEM_ADAPTER), methods); + } + } + exports2.default = Settings4; + })(settings); + taskManager = tasks; + patternManager = patterns; + async_1 = async$7; + stream_1 = stream; + sync_1 = sync$2; + settings_1 = settings; + utils = utils$g; + (function(FastGlob2) { + function sync2(source, options2) { + assertPatternsInput(source); + const works = getWorks(source, sync_1.default, options2); + return utils.array.flatten(works); + } + FastGlob2.sync = sync2; + function stream4(source, options2) { + assertPatternsInput(source); + const works = getWorks(source, stream_1.default, options2); + return utils.stream.merge(works); + } + FastGlob2.stream = stream4; + function generateTasks(source, options2) { + assertPatternsInput(source); + const patterns2 = patternManager.transform([].concat(source)); + const settings2 = new settings_1.default(options2); + return taskManager.generate(patterns2, settings2); + } + FastGlob2.generateTasks = generateTasks; + function isDynamicPattern2(source, options2) { + assertPatternsInput(source); + const settings2 = new settings_1.default(options2); + return utils.pattern.isDynamicPattern(source, settings2); + } + FastGlob2.isDynamicPattern = isDynamicPattern2; + function escapePath(source) { + assertPatternsInput(source); + return utils.path.escape(source); + } + FastGlob2.escapePath = escapePath; + })(FastGlob || (FastGlob = {})); + debug$b = createDebugger("vite:ssr-external"); + _require$2 = createRequire$1(__vite_injected_original_import_meta_url2); + jsonLangs = `\\.(?:json|json5)(?:$|\\?)`; + jsonLangRE = new RegExp(jsonLangs); + isDebug$3 = process.env.DEBUG; + debug$a = createDebugger("vite:optimize-deps"); + dist = {}; + (function(exports2) { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.lilconfigSync = exports2.lilconfig = exports2.defaultLoaders = void 0; + const path3 = require$$0$4; + const fs2 = require$$0__default; + const os2 = require$$2; + const fsReadFileAsync = fs2.promises.readFile; + function getDefaultSearchPlaces(name2) { + return [ + "package.json", + `.${name2}rc.json`, + `.${name2}rc.js`, + `${name2}.config.js`, + `.${name2}rc.cjs`, + `${name2}.config.cjs` + ]; + } + function getSearchPaths(startDir, stopDir) { + return startDir.split(path3.sep).reduceRight((acc, _, ind, arr) => { + const currentPath = arr.slice(0, ind + 1).join(path3.sep); + if (!acc.passedStopDir) + acc.searchPlaces.push(currentPath || path3.sep); + if (currentPath === stopDir) + acc.passedStopDir = true; + return acc; + }, { searchPlaces: [], passedStopDir: false }).searchPlaces; + } + exports2.defaultLoaders = Object.freeze({ + ".js": __require, + ".json": __require, + ".cjs": __require, + noExt(_, content) { + return JSON.parse(content); + } + }); + function getExtDesc(ext2) { + return ext2 === "noExt" ? "files without extensions" : `extension "${ext2}"`; + } + function getOptions2(name2, options2 = {}) { + const conf = { + stopDir: os2.homedir(), + searchPlaces: getDefaultSearchPlaces(name2), + ignoreEmptySearchPlaces: true, + transform: (x) => x, + packageProp: [name2], + ...options2, + loaders: { ...exports2.defaultLoaders, ...options2.loaders } + }; + conf.searchPlaces.forEach((place) => { + const key = path3.extname(place) || "noExt"; + const loader = conf.loaders[key]; + if (!loader) { + throw new Error(`No loader specified for ${getExtDesc(key)}, so searchPlaces item "${place}" is invalid`); + } + if (typeof loader !== "function") { + throw new Error(`loader for ${getExtDesc(key)} is not a function (type provided: "${typeof loader}"), so searchPlaces item "${place}" is invalid`); + } + }); + return conf; + } + function getPackageProp(props, obj) { + if (typeof props === "string" && props in obj) + return obj[props]; + return (Array.isArray(props) ? props : props.split(".")).reduce((acc, prop) => acc === void 0 ? acc : acc[prop], obj) || null; + } + function getSearchItems(searchPlaces, searchPaths) { + return searchPaths.reduce((acc, searchPath) => { + searchPlaces.forEach((fileName) => acc.push({ + fileName, + filepath: path3.join(searchPath, fileName), + loaderKey: path3.extname(fileName) || "noExt" + })); + return acc; + }, []); + } + function validateFilePath(filepath) { + if (!filepath) + throw new Error("load must pass a non-empty string"); + } + function validateLoader(loader, ext2) { + if (!loader) + throw new Error(`No loader specified for extension "${ext2}"`); + if (typeof loader !== "function") + throw new Error("loader is not a function"); + } + function lilconfig(name2, options2) { + const { ignoreEmptySearchPlaces, loaders, packageProp, searchPlaces, stopDir, transform: transform3 } = getOptions2(name2, options2); + return { + async search(searchFrom = process.cwd()) { + const searchPaths = getSearchPaths(searchFrom, stopDir); + const result = { + config: null, + filepath: "" + }; + const searchItems = getSearchItems(searchPlaces, searchPaths); + for (const { fileName, filepath, loaderKey } of searchItems) { + try { + await fs2.promises.access(filepath); + } catch (_a) { + continue; + } + const content = String(await fsReadFileAsync(filepath)); + const loader = loaders[loaderKey]; + if (fileName === "package.json") { + const pkg = await loader(filepath, content); + const maybeConfig = getPackageProp(packageProp, pkg); + if (maybeConfig != null) { + result.config = maybeConfig; + result.filepath = filepath; + break; + } + continue; + } + const isEmpty2 = content.trim() === ""; + if (isEmpty2 && ignoreEmptySearchPlaces) + continue; + if (isEmpty2) { + result.isEmpty = true; + result.config = void 0; + } else { + validateLoader(loader, loaderKey); + result.config = await loader(filepath, content); + } + result.filepath = filepath; + break; + } + if (result.filepath === "" && result.config === null) + return transform3(null); + return transform3(result); + }, + async load(filepath) { + validateFilePath(filepath); + const absPath = path3.resolve(process.cwd(), filepath); + const { base: base2, ext: ext2 } = path3.parse(absPath); + const loaderKey = ext2 || "noExt"; + const loader = loaders[loaderKey]; + validateLoader(loader, loaderKey); + const content = String(await fsReadFileAsync(absPath)); + if (base2 === "package.json") { + const pkg = await loader(absPath, content); + return transform3({ + config: getPackageProp(packageProp, pkg), + filepath: absPath + }); + } + const result = { + config: null, + filepath: absPath + }; + const isEmpty2 = content.trim() === ""; + if (isEmpty2 && ignoreEmptySearchPlaces) + return transform3({ + config: void 0, + filepath: absPath, + isEmpty: true + }); + result.config = isEmpty2 ? void 0 : await loader(absPath, content); + return transform3(isEmpty2 ? { ...result, isEmpty: isEmpty2, config: void 0 } : result); + } + }; + } + exports2.lilconfig = lilconfig; + function lilconfigSync(name2, options2) { + const { ignoreEmptySearchPlaces, loaders, packageProp, searchPlaces, stopDir, transform: transform3 } = getOptions2(name2, options2); + return { + search(searchFrom = process.cwd()) { + const searchPaths = getSearchPaths(searchFrom, stopDir); + const result = { + config: null, + filepath: "" + }; + const searchItems = getSearchItems(searchPlaces, searchPaths); + for (const { fileName, filepath, loaderKey } of searchItems) { + try { + fs2.accessSync(filepath); + } catch (_a) { + continue; + } + const loader = loaders[loaderKey]; + const content = String(fs2.readFileSync(filepath)); + if (fileName === "package.json") { + const pkg = loader(filepath, content); + const maybeConfig = getPackageProp(packageProp, pkg); + if (maybeConfig != null) { + result.config = maybeConfig; + result.filepath = filepath; + break; + } + continue; + } + const isEmpty2 = content.trim() === ""; + if (isEmpty2 && ignoreEmptySearchPlaces) + continue; + if (isEmpty2) { + result.isEmpty = true; + result.config = void 0; + } else { + validateLoader(loader, loaderKey); + result.config = loader(filepath, content); + } + result.filepath = filepath; + break; + } + if (result.filepath === "" && result.config === null) + return transform3(null); + return transform3(result); + }, + load(filepath) { + validateFilePath(filepath); + const absPath = path3.resolve(process.cwd(), filepath); + const { base: base2, ext: ext2 } = path3.parse(absPath); + const loaderKey = ext2 || "noExt"; + const loader = loaders[loaderKey]; + validateLoader(loader, loaderKey); + const content = String(fs2.readFileSync(absPath)); + if (base2 === "package.json") { + const pkg = loader(absPath, content); + return transform3({ + config: getPackageProp(packageProp, pkg), + filepath: absPath + }); + } + const result = { + config: null, + filepath: absPath + }; + const isEmpty2 = content.trim() === ""; + if (isEmpty2 && ignoreEmptySearchPlaces) + return transform3({ + filepath: absPath, + config: void 0, + isEmpty: true + }); + result.config = isEmpty2 ? void 0 : loader(absPath, content); + return transform3(isEmpty2 ? { ...result, isEmpty: isEmpty2, config: void 0 } : result); + } + }; + } + exports2.lilconfigSync = lilconfigSync; + })(dist); + ALIAS = Symbol.for("yaml.alias"); + DOC = Symbol.for("yaml.document"); + MAP = Symbol.for("yaml.map"); + PAIR = Symbol.for("yaml.pair"); + SCALAR$1 = Symbol.for("yaml.scalar"); + SEQ = Symbol.for("yaml.seq"); + NODE_TYPE = Symbol.for("yaml.node.type"); + isAlias = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === ALIAS; + isDocument = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === DOC; + isMap = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === MAP; + isPair = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === PAIR; + isScalar$1 = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === SCALAR$1; + isSeq = (node2) => !!node2 && typeof node2 === "object" && node2[NODE_TYPE] === SEQ; + hasAnchor = (node2) => (isScalar$1(node2) || isCollection$1(node2)) && !!node2.anchor; + NodeBase = class { + constructor(type) { + Object.defineProperty(this, NODE_TYPE, { value: type }); + } + /** Create a copy of this node. */ + clone() { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (this.range) + copy.range = this.range.slice(); + return copy; + } + }; + BREAK$1 = Symbol("break visit"); + SKIP$1 = Symbol("skip children"); + REMOVE$1 = Symbol("remove node"); + visit$1.BREAK = BREAK$1; + visit$1.SKIP = SKIP$1; + visit$1.REMOVE = REMOVE$1; + visitAsync.BREAK = BREAK$1; + visitAsync.SKIP = SKIP$1; + visitAsync.REMOVE = REMOVE$1; + escapeChars = { + "!": "%21", + ",": "%2C", + "[": "%5B", + "]": "%5D", + "{": "%7B", + "}": "%7D" + }; + escapeTagName = (tn) => tn.replace(/[!,[\]{}]/g, (ch) => escapeChars[ch]); + Directives = class { + constructor(yaml2, tags) { + this.docStart = null; + this.docEnd = false; + this.yaml = Object.assign({}, Directives.defaultYaml, yaml2); + this.tags = Object.assign({}, Directives.defaultTags, tags); + } + clone() { + const copy = new Directives(this.yaml, this.tags); + copy.docStart = this.docStart; + return copy; + } + /** + * During parsing, get a Directives instance for the current document and + * update the stream state according to the current version's spec. + */ + atDocument() { + const res = new Directives(this.yaml, this.tags); + switch (this.yaml.version) { + case "1.1": + this.atNextDocument = true; + break; + case "1.2": + this.atNextDocument = false; + this.yaml = { + explicit: Directives.defaultYaml.explicit, + version: "1.2" + }; + this.tags = Object.assign({}, Directives.defaultTags); + break; + } + return res; + } + /** + * @param onError - May be called even if the action was successful + * @returns `true` on success + */ + add(line, onError) { + if (this.atNextDocument) { + this.yaml = { explicit: Directives.defaultYaml.explicit, version: "1.1" }; + this.tags = Object.assign({}, Directives.defaultTags); + this.atNextDocument = false; + } + const parts = line.trim().split(/[ \t]+/); + const name2 = parts.shift(); + switch (name2) { + case "%TAG": { + if (parts.length !== 2) { + onError(0, "%TAG directive should contain exactly two parts"); + if (parts.length < 2) + return false; + } + const [handle2, prefix] = parts; + this.tags[handle2] = prefix; + return true; + } + case "%YAML": { + this.yaml.explicit = true; + if (parts.length !== 1) { + onError(0, "%YAML directive should contain exactly one part"); + return false; + } + const [version4] = parts; + if (version4 === "1.1" || version4 === "1.2") { + this.yaml.version = version4; + return true; + } else { + const isValid = /^\d+\.\d+$/.test(version4); + onError(6, `Unsupported YAML version ${version4}`, isValid); + return false; + } + } + default: + onError(0, `Unknown directive ${name2}`, true); + return false; + } + } + /** + * Resolves a tag, matching handles to those defined in %TAG directives. + * + * @returns Resolved tag, which may also be the non-specific tag `'!'` or a + * `'!local'` tag, or `null` if unresolvable. + */ + tagName(source, onError) { + if (source === "!") + return "!"; + if (source[0] !== "!") { + onError(`Not a valid tag: ${source}`); + return null; + } + if (source[1] === "<") { + const verbatim = source.slice(2, -1); + if (verbatim === "!" || verbatim === "!!") { + onError(`Verbatim tags aren't resolved, so ${source} is invalid.`); + return null; + } + if (source[source.length - 1] !== ">") + onError("Verbatim tags must end with a >"); + return verbatim; + } + const [, handle2, suffix] = source.match(/^(.*!)([^!]*)$/); + if (!suffix) + onError(`The ${source} tag has no suffix`); + const prefix = this.tags[handle2]; + if (prefix) + return prefix + decodeURIComponent(suffix); + if (handle2 === "!") + return source; + onError(`Could not resolve tag: ${source}`); + return null; + } + /** + * Given a fully resolved tag, returns its printable string form, + * taking into account current tag prefixes and defaults. + */ + tagString(tag) { + for (const [handle2, prefix] of Object.entries(this.tags)) { + if (tag.startsWith(prefix)) + return handle2 + escapeTagName(tag.substring(prefix.length)); + } + return tag[0] === "!" ? tag : `!<${tag}>`; + } + toString(doc) { + const lines = this.yaml.explicit ? [`%YAML ${this.yaml.version || "1.2"}`] : []; + const tagEntries = Object.entries(this.tags); + let tagNames; + if (doc && tagEntries.length > 0 && isNode$1(doc.contents)) { + const tags = {}; + visit$1(doc.contents, (_key, node2) => { + if (isNode$1(node2) && node2.tag) + tags[node2.tag] = true; + }); + tagNames = Object.keys(tags); + } else + tagNames = []; + for (const [handle2, prefix] of tagEntries) { + if (handle2 === "!!" && prefix === "tag:yaml.org,2002:") + continue; + if (!doc || tagNames.some((tn) => tn.startsWith(prefix))) + lines.push(`%TAG ${handle2} ${prefix}`); + } + return lines.join("\n"); + } + }; + Directives.defaultYaml = { explicit: false, version: "1.2" }; + Directives.defaultTags = { "!!": "tag:yaml.org,2002:" }; + Alias = class extends NodeBase { + constructor(source) { + super(ALIAS); + this.source = source; + Object.defineProperty(this, "tag", { + set() { + throw new Error("Alias nodes cannot have tags"); + } + }); + } + /** + * Resolve the value of this alias within `doc`, finding the last + * instance of the `source` anchor before this node. + */ + resolve(doc) { + let found2 = void 0; + visit$1(doc, { + Node: (_key, node2) => { + if (node2 === this) + return visit$1.BREAK; + if (node2.anchor === this.source) + found2 = node2; + } + }); + return found2; + } + toJSON(_arg, ctx) { + if (!ctx) + return { source: this.source }; + const { anchors, doc, maxAliasCount } = ctx; + const source = this.resolve(doc); + if (!source) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new ReferenceError(msg); + } + const data2 = anchors.get(source); + if (!data2 || data2.res === void 0) { + const msg = "This should not happen: Alias anchor was not resolved?"; + throw new ReferenceError(msg); + } + if (maxAliasCount >= 0) { + data2.count += 1; + if (data2.aliasCount === 0) + data2.aliasCount = getAliasCount(doc, source, anchors); + if (data2.count * data2.aliasCount > maxAliasCount) { + const msg = "Excessive alias count indicates a resource exhaustion attack"; + throw new ReferenceError(msg); + } + } + return data2.res; + } + toString(ctx, _onComment, _onChompKeep) { + const src2 = `*${this.source}`; + if (ctx) { + anchorIsValid(this.source); + if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) { + const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`; + throw new Error(msg); + } + if (ctx.implicitKey) + return `${src2} `; + } + return src2; + } + }; + isScalarValue = (value2) => !value2 || typeof value2 !== "function" && typeof value2 !== "object"; + Scalar = class extends NodeBase { + constructor(value2) { + super(SCALAR$1); + this.value = value2; + } + toJSON(arg, ctx) { + return (ctx == null ? void 0 : ctx.keep) ? this.value : toJS(this.value, arg, ctx); + } + toString() { + return String(this.value); + } + }; + Scalar.BLOCK_FOLDED = "BLOCK_FOLDED"; + Scalar.BLOCK_LITERAL = "BLOCK_LITERAL"; + Scalar.PLAIN = "PLAIN"; + Scalar.QUOTE_DOUBLE = "QUOTE_DOUBLE"; + Scalar.QUOTE_SINGLE = "QUOTE_SINGLE"; + defaultTagPrefix = "tag:yaml.org,2002:"; + isEmptyPath = (path3) => path3 == null || typeof path3 === "object" && !!path3[Symbol.iterator]().next().done; + Collection = class extends NodeBase { + constructor(type, schema2) { + super(type); + Object.defineProperty(this, "schema", { + value: schema2, + configurable: true, + enumerable: false, + writable: true + }); + } + /** + * Create a copy of this collection. + * + * @param schema - If defined, overwrites the original's schema + */ + clone(schema2) { + const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this)); + if (schema2) + copy.schema = schema2; + copy.items = copy.items.map((it) => isNode$1(it) || isPair(it) ? it.clone(schema2) : it); + if (this.range) + copy.range = this.range.slice(); + return copy; + } + /** + * Adds a value to the collection. For `!!map` and `!!omap` the value must + * be a Pair instance or a `{ key, value }` object, which may not have a key + * that already exists in the map. + */ + addIn(path3, value2) { + if (isEmptyPath(path3)) + this.add(value2); + else { + const [key, ...rest] = path3; + const node2 = this.get(key, true); + if (isCollection$1(node2)) + node2.addIn(rest, value2); + else if (node2 === void 0 && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value2)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } + /** + * Removes a value from the collection. + * @returns `true` if the item was found and removed. + */ + deleteIn(path3) { + const [key, ...rest] = path3; + if (rest.length === 0) + return this.delete(key); + const node2 = this.get(key, true); + if (isCollection$1(node2)) + return node2.deleteIn(rest); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + /** + * Returns item at `key`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + getIn(path3, keepScalar) { + const [key, ...rest] = path3; + const node2 = this.get(key, true); + if (rest.length === 0) + return !keepScalar && isScalar$1(node2) ? node2.value : node2; + else + return isCollection$1(node2) ? node2.getIn(rest, keepScalar) : void 0; + } + hasAllNullValues(allowScalar) { + return this.items.every((node2) => { + if (!isPair(node2)) + return false; + const n = node2.value; + return n == null || allowScalar && isScalar$1(n) && n.value == null && !n.commentBefore && !n.comment && !n.tag; + }); + } + /** + * Checks if the collection includes a value with the key `key`. + */ + hasIn(path3) { + const [key, ...rest] = path3; + if (rest.length === 0) + return this.has(key); + const node2 = this.get(key, true); + return isCollection$1(node2) ? node2.hasIn(rest) : false; + } + /** + * Sets a value in this collection. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + setIn(path3, value2) { + const [key, ...rest] = path3; + if (rest.length === 0) { + this.set(key, value2); + } else { + const node2 = this.get(key, true); + if (isCollection$1(node2)) + node2.setIn(rest, value2); + else if (node2 === void 0 && this.schema) + this.set(key, collectionFromPath(this.schema, rest, value2)); + else + throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`); + } + } + }; + Collection.maxFlowStringSingleLineLength = 60; + stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#"); + lineComment = (str, indent, comment) => str.endsWith("\n") ? indentComment(comment, indent) : comment.includes("\n") ? "\n" + indentComment(comment, indent) : (str.endsWith(" ") ? "" : " ") + comment; + FOLD_FLOW = "flow"; + FOLD_BLOCK = "block"; + FOLD_QUOTED = "quoted"; + getFoldOptions = (ctx) => ({ + indentAtStart: ctx.indentAtStart, + lineWidth: ctx.options.lineWidth, + minContentWidth: ctx.options.minContentWidth + }); + containsDocumentMarker = (str) => /^(%|---|\.\.\.)/m.test(str); + MERGE_KEY = "<<"; + isMergeKey = (key) => key === MERGE_KEY || isScalar$1(key) && key.value === MERGE_KEY && (!key.type || key.type === Scalar.PLAIN); + Pair = class { + constructor(key, value2 = null) { + Object.defineProperty(this, NODE_TYPE, { value: PAIR }); + this.key = key; + this.value = value2; + } + clone(schema2) { + let { key, value: value2 } = this; + if (isNode$1(key)) + key = key.clone(schema2); + if (isNode$1(value2)) + value2 = value2.clone(schema2); + return new Pair(key, value2); + } + toJSON(_, ctx) { + const pair = (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + return addPairToJSMap(ctx, pair, this); + } + toString(ctx, onComment, onChompKeep) { + return (ctx == null ? void 0 : ctx.doc) ? stringifyPair(this, ctx, onComment, onChompKeep) : JSON.stringify(this); + } + }; + YAMLMap = class extends Collection { + constructor(schema2) { + super(MAP, schema2); + this.items = []; + } + static get tagName() { + return "tag:yaml.org,2002:map"; + } + /** + * Adds a value to the collection. + * + * @param overwrite - If not set `true`, using a key that is already in the + * collection will throw. Otherwise, overwrites the previous value. + */ + add(pair, overwrite) { + var _a; + let _pair; + if (isPair(pair)) + _pair = pair; + else if (!pair || typeof pair !== "object" || !("key" in pair)) { + _pair = new Pair(pair, pair == null ? void 0 : pair.value); + } else + _pair = new Pair(pair.key, pair.value); + const prev = findPair(this.items, _pair.key); + const sortEntries = (_a = this.schema) == null ? void 0 : _a.sortMapEntries; + if (prev) { + if (!overwrite) + throw new Error(`Key ${_pair.key} already set`); + if (isScalar$1(prev.value) && isScalarValue(_pair.value)) + prev.value.value = _pair.value; + else + prev.value = _pair.value; + } else if (sortEntries) { + const i = this.items.findIndex((item) => sortEntries(_pair, item) < 0); + if (i === -1) + this.items.push(_pair); + else + this.items.splice(i, 0, _pair); + } else { + this.items.push(_pair); + } + } + delete(key) { + const it = findPair(this.items, key); + if (!it) + return false; + const del = this.items.splice(this.items.indexOf(it), 1); + return del.length > 0; + } + get(key, keepScalar) { + const it = findPair(this.items, key); + const node2 = it == null ? void 0 : it.value; + return (!keepScalar && isScalar$1(node2) ? node2.value : node2) ?? void 0; + } + has(key) { + return !!findPair(this.items, key); + } + set(key, value2) { + this.add(new Pair(key, value2), true); + } + /** + * @param ctx - Conversion context, originally set in Document#toJS() + * @param {Class} Type - If set, forces the returned collection type + * @returns Instance of Type, Map, or Object + */ + toJSON(_, ctx, Type) { + const map2 = Type ? new Type() : (ctx == null ? void 0 : ctx.mapAsMap) ? /* @__PURE__ */ new Map() : {}; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map2); + for (const item of this.items) + addPairToJSMap(ctx, map2, item); + return map2; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + for (const item of this.items) { + if (!isPair(item)) + throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`); + } + if (!ctx.allNullValues && this.hasAllNullValues(false)) + ctx = Object.assign({}, ctx, { allNullValues: true }); + return stringifyCollection(this, ctx, { + blockItemPrefix: "", + flowChars: { start: "{", end: "}" }, + itemIndent: ctx.indent || "", + onChompKeep, + onComment + }); + } + }; + map = { + collection: "map", + createNode: createMap, + default: true, + nodeClass: YAMLMap, + tag: "tag:yaml.org,2002:map", + resolve(map2, onError) { + if (!isMap(map2)) + onError("Expected a mapping for this tag"); + return map2; + } + }; + YAMLSeq = class extends Collection { + constructor(schema2) { + super(SEQ, schema2); + this.items = []; + } + static get tagName() { + return "tag:yaml.org,2002:seq"; + } + add(value2) { + this.items.push(value2); + } + /** + * Removes a value from the collection. + * + * `key` must contain a representation of an integer for this to succeed. + * It may be wrapped in a `Scalar`. + * + * @returns `true` if the item was found and removed. + */ + delete(key) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + return false; + const del = this.items.splice(idx, 1); + return del.length > 0; + } + get(key, keepScalar) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + return void 0; + const it = this.items[idx]; + return !keepScalar && isScalar$1(it) ? it.value : it; + } + /** + * Checks if the collection includes a value with the key `key`. + * + * `key` must contain a representation of an integer for this to succeed. + * It may be wrapped in a `Scalar`. + */ + has(key) { + const idx = asItemIndex(key); + return typeof idx === "number" && idx < this.items.length; + } + /** + * Sets a value in this collection. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + * + * If `key` does not contain a representation of an integer, this will throw. + * It may be wrapped in a `Scalar`. + */ + set(key, value2) { + const idx = asItemIndex(key); + if (typeof idx !== "number") + throw new Error(`Expected a valid index, not ${key}.`); + const prev = this.items[idx]; + if (isScalar$1(prev) && isScalarValue(value2)) + prev.value = value2; + else + this.items[idx] = value2; + } + toJSON(_, ctx) { + const seq2 = []; + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(seq2); + let i = 0; + for (const item of this.items) + seq2.push(toJS(item, String(i++), ctx)); + return seq2; + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + return stringifyCollection(this, ctx, { + blockItemPrefix: "- ", + flowChars: { start: "[", end: "]" }, + itemIndent: (ctx.indent || "") + " ", + onChompKeep, + onComment + }); + } + }; + seq = { + collection: "seq", + createNode: createSeq, + default: true, + nodeClass: YAMLSeq, + tag: "tag:yaml.org,2002:seq", + resolve(seq2, onError) { + if (!isSeq(seq2)) + onError("Expected a sequence for this tag"); + return seq2; + } + }; + string = { + identify: (value2) => typeof value2 === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify(item, ctx, onComment, onChompKeep) { + ctx = Object.assign({ actualString: true }, ctx); + return stringifyString(item, ctx, onComment, onChompKeep); + } + }; + nullTag = { + identify: (value2) => value2 == null, + createNode: () => new Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^(?:~|[Nn]ull|NULL)?$/, + resolve: () => new Scalar(null), + stringify: ({ source }, ctx) => typeof source === "string" && nullTag.test.test(source) ? source : ctx.options.nullStr + }; + boolTag = { + identify: (value2) => typeof value2 === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/, + resolve: (str) => new Scalar(str[0] === "t" || str[0] === "T"), + stringify({ source, value: value2 }, ctx) { + if (source && boolTag.test.test(source)) { + const sv = source[0] === "t" || source[0] === "T"; + if (value2 === sv) + return source; + } + return value2 ? ctx.options.trueStr : ctx.options.falseStr; + } + }; + floatNaN$1 = { + identify: (value2) => typeof value2 === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^(?:[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN))$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber + }; + floatExp$1 = { + identify: (value2) => typeof value2 === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str), + stringify(node2) { + const num = Number(node2.value); + return isFinite(num) ? num.toExponential() : stringifyNumber(node2); + } + }; + float$1 = { + identify: (value2) => typeof value2 === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/, + resolve(str) { + const node2 = new Scalar(parseFloat(str)); + const dot = str.indexOf("."); + if (dot !== -1 && str[str.length - 1] === "0") + node2.minFractionDigits = str.length - dot - 1; + return node2; + }, + stringify: stringifyNumber + }; + intIdentify$2 = (value2) => typeof value2 === "bigint" || Number.isInteger(value2); + intResolve$1 = (str, offset3, radix, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str.substring(offset3), radix); + intOct$1 = { + identify: (value2) => intIdentify$2(value2) && value2 >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^0o[0-7]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 2, 8, opt), + stringify: (node2) => intStringify$1(node2, 8, "0o") + }; + int$1 = { + identify: intIdentify$2, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 0, 10, opt), + stringify: stringifyNumber + }; + intHex$1 = { + identify: (value2) => intIdentify$2(value2) && value2 >= 0, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^0x[0-9a-fA-F]+$/, + resolve: (str, _onError, opt) => intResolve$1(str, 2, 16, opt), + stringify: (node2) => intStringify$1(node2, 16, "0x") + }; + schema$2 = [ + map, + seq, + string, + nullTag, + boolTag, + intOct$1, + int$1, + intHex$1, + floatNaN$1, + floatExp$1, + float$1 + ]; + stringifyJSON = ({ value: value2 }) => JSON.stringify(value2); + jsonScalars = [ + { + identify: (value2) => typeof value2 === "string", + default: true, + tag: "tag:yaml.org,2002:str", + resolve: (str) => str, + stringify: stringifyJSON + }, + { + identify: (value2) => value2 == null, + createNode: () => new Scalar(null), + default: true, + tag: "tag:yaml.org,2002:null", + test: /^null$/, + resolve: () => null, + stringify: stringifyJSON + }, + { + identify: (value2) => typeof value2 === "boolean", + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^true|false$/, + resolve: (str) => str === "true", + stringify: stringifyJSON + }, + { + identify: intIdentify$1, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^-?(?:0|[1-9][0-9]*)$/, + resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10), + stringify: ({ value: value2 }) => intIdentify$1(value2) ? value2.toString() : JSON.stringify(value2) + }, + { + identify: (value2) => typeof value2 === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/, + resolve: (str) => parseFloat(str), + stringify: stringifyJSON + } + ]; + jsonError = { + default: true, + tag: "", + test: /^/, + resolve(str, onError) { + onError(`Unresolved plain scalar ${JSON.stringify(str)}`); + return str; + } + }; + schema$1 = [map, seq].concat(jsonScalars, jsonError); + binary = { + identify: (value2) => value2 instanceof Uint8Array, + default: false, + tag: "tag:yaml.org,2002:binary", + /** + * Returns a Buffer in node and an Uint8Array in browsers + * + * To use the resulting buffer as an image, you'll want to do something like: + * + * const blob = new Blob([buffer], { type: 'image/jpeg' }) + * document.querySelector('#photo').src = URL.createObjectURL(blob) + */ + resolve(src2, onError) { + if (typeof Buffer === "function") { + return Buffer.from(src2, "base64"); + } else if (typeof atob === "function") { + const str = atob(src2.replace(/[\n\r]/g, "")); + const buffer = new Uint8Array(str.length); + for (let i = 0; i < str.length; ++i) + buffer[i] = str.charCodeAt(i); + return buffer; + } else { + onError("This environment does not support reading binary tags; either Buffer or atob is required"); + return src2; + } + }, + stringify({ comment, type, value: value2 }, ctx, onComment, onChompKeep) { + const buf = value2; + let str; + if (typeof Buffer === "function") { + str = buf instanceof Buffer ? buf.toString("base64") : Buffer.from(buf.buffer).toString("base64"); + } else if (typeof btoa === "function") { + let s = ""; + for (let i = 0; i < buf.length; ++i) + s += String.fromCharCode(buf[i]); + str = btoa(s); + } else { + throw new Error("This environment does not support writing binary tags; either Buffer or btoa is required"); + } + if (!type) + type = Scalar.BLOCK_LITERAL; + if (type !== Scalar.QUOTE_DOUBLE) { + const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth); + const n = Math.ceil(str.length / lineWidth); + const lines = new Array(n); + for (let i = 0, o = 0; i < n; ++i, o += lineWidth) { + lines[i] = str.substr(o, lineWidth); + } + str = lines.join(type === Scalar.BLOCK_LITERAL ? "\n" : " "); + } + return stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep); + } + }; + pairs = { + collection: "seq", + default: false, + tag: "tag:yaml.org,2002:pairs", + resolve: resolvePairs, + createNode: createPairs + }; + YAMLOMap = class extends YAMLSeq { + constructor() { + super(); + this.add = YAMLMap.prototype.add.bind(this); + this.delete = YAMLMap.prototype.delete.bind(this); + this.get = YAMLMap.prototype.get.bind(this); + this.has = YAMLMap.prototype.has.bind(this); + this.set = YAMLMap.prototype.set.bind(this); + this.tag = YAMLOMap.tag; + } + /** + * If `ctx` is given, the return type is actually `Map`, + * but TypeScript won't allow widening the signature of a child method. + */ + toJSON(_, ctx) { + if (!ctx) + return super.toJSON(_); + const map2 = /* @__PURE__ */ new Map(); + if (ctx == null ? void 0 : ctx.onCreate) + ctx.onCreate(map2); + for (const pair of this.items) { + let key, value2; + if (isPair(pair)) { + key = toJS(pair.key, "", ctx); + value2 = toJS(pair.value, key, ctx); + } else { + key = toJS(pair, "", ctx); + } + if (map2.has(key)) + throw new Error("Ordered maps must not include duplicate keys"); + map2.set(key, value2); + } + return map2; + } + }; + YAMLOMap.tag = "tag:yaml.org,2002:omap"; + omap = { + collection: "seq", + identify: (value2) => value2 instanceof Map, + nodeClass: YAMLOMap, + default: false, + tag: "tag:yaml.org,2002:omap", + resolve(seq2, onError) { + const pairs2 = resolvePairs(seq2, onError); + const seenKeys = []; + for (const { key } of pairs2.items) { + if (isScalar$1(key)) { + if (seenKeys.includes(key.value)) { + onError(`Ordered maps must not include duplicate keys: ${key.value}`); + } else { + seenKeys.push(key.value); + } + } + } + return Object.assign(new YAMLOMap(), pairs2); + }, + createNode(schema2, iterable, ctx) { + const pairs2 = createPairs(schema2, iterable, ctx); + const omap2 = new YAMLOMap(); + omap2.items = pairs2.items; + return omap2; + } + }; + trueTag = { + identify: (value2) => value2 === true, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/, + resolve: () => new Scalar(true), + stringify: boolStringify + }; + falseTag = { + identify: (value2) => value2 === false, + default: true, + tag: "tag:yaml.org,2002:bool", + test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/i, + resolve: () => new Scalar(false), + stringify: boolStringify + }; + floatNaN = { + identify: (value2) => typeof value2 === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?\.(?:inf|Inf|INF|nan|NaN|NAN)$/, + resolve: (str) => str.slice(-3).toLowerCase() === "nan" ? NaN : str[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY, + stringify: stringifyNumber + }; + floatExp = { + identify: (value2) => typeof value2 === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "EXP", + test: /^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/, + resolve: (str) => parseFloat(str.replace(/_/g, "")), + stringify(node2) { + const num = Number(node2.value); + return isFinite(num) ? num.toExponential() : stringifyNumber(node2); + } + }; + float = { + identify: (value2) => typeof value2 === "number", + default: true, + tag: "tag:yaml.org,2002:float", + test: /^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/, + resolve(str) { + const node2 = new Scalar(parseFloat(str.replace(/_/g, ""))); + const dot = str.indexOf("."); + if (dot !== -1) { + const f = str.substring(dot + 1).replace(/_/g, ""); + if (f[f.length - 1] === "0") + node2.minFractionDigits = f.length; + } + return node2; + }, + stringify: stringifyNumber + }; + intIdentify = (value2) => typeof value2 === "bigint" || Number.isInteger(value2); + intBin = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "BIN", + test: /^[-+]?0b[0-1_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 2, opt), + stringify: (node2) => intStringify(node2, 2, "0b") + }; + intOct = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "OCT", + test: /^[-+]?0[0-7_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 1, 8, opt), + stringify: (node2) => intStringify(node2, 8, "0") + }; + int = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + test: /^[-+]?[0-9][0-9_]*$/, + resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt), + stringify: stringifyNumber + }; + intHex = { + identify: intIdentify, + default: true, + tag: "tag:yaml.org,2002:int", + format: "HEX", + test: /^[-+]?0x[0-9a-fA-F_]+$/, + resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt), + stringify: (node2) => intStringify(node2, 16, "0x") + }; + YAMLSet = class extends YAMLMap { + constructor(schema2) { + super(schema2); + this.tag = YAMLSet.tag; + } + add(key) { + let pair; + if (isPair(key)) + pair = key; + else if (typeof key === "object" && "key" in key && "value" in key && key.value === null) + pair = new Pair(key.key, null); + else + pair = new Pair(key, null); + const prev = findPair(this.items, pair.key); + if (!prev) + this.items.push(pair); + } + /** + * If `keepPair` is `true`, returns the Pair matching `key`. + * Otherwise, returns the value of that Pair's key. + */ + get(key, keepPair) { + const pair = findPair(this.items, key); + return !keepPair && isPair(pair) ? isScalar$1(pair.key) ? pair.key.value : pair.key : pair; + } + set(key, value2) { + if (typeof value2 !== "boolean") + throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value2}`); + const prev = findPair(this.items, key); + if (prev && !value2) { + this.items.splice(this.items.indexOf(prev), 1); + } else if (!prev && value2) { + this.items.push(new Pair(key)); + } + } + toJSON(_, ctx) { + return super.toJSON(_, ctx, Set); + } + toString(ctx, onComment, onChompKeep) { + if (!ctx) + return JSON.stringify(this); + if (this.hasAllNullValues(true)) + return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep); + else + throw new Error("Set items must all have null values"); + } + }; + YAMLSet.tag = "tag:yaml.org,2002:set"; + set = { + collection: "map", + identify: (value2) => value2 instanceof Set, + nodeClass: YAMLSet, + default: false, + tag: "tag:yaml.org,2002:set", + resolve(map2, onError) { + if (isMap(map2)) { + if (map2.hasAllNullValues(true)) + return Object.assign(new YAMLSet(), map2); + else + onError("Set items must all have null values"); + } else + onError("Expected a mapping for this tag"); + return map2; + }, + createNode(schema2, iterable, ctx) { + const { replacer } = ctx; + const set2 = new YAMLSet(schema2); + if (iterable && Symbol.iterator in Object(iterable)) + for (let value2 of iterable) { + if (typeof replacer === "function") + value2 = replacer.call(iterable, value2, value2); + set2.items.push(createPair(value2, null, ctx)); + } + return set2; + } + }; + intTime = { + identify: (value2) => typeof value2 === "bigint" || Number.isInteger(value2), + default: true, + tag: "tag:yaml.org,2002:int", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/, + resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt), + stringify: stringifySexagesimal + }; + floatTime = { + identify: (value2) => typeof value2 === "number", + default: true, + tag: "tag:yaml.org,2002:float", + format: "TIME", + test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/, + resolve: (str) => parseSexagesimal(str, false), + stringify: stringifySexagesimal + }; + timestamp = { + identify: (value2) => value2 instanceof Date, + default: true, + tag: "tag:yaml.org,2002:timestamp", + // If the time zone is omitted, the timestamp is assumed to be specified in UTC. The time part + // may be omitted altogether, resulting in a date format. In such a case, the time part is + // assumed to be 00:00:00Z (start of day, UTC). + test: RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"), + resolve(str) { + const match = str.match(timestamp.test); + if (!match) + throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd"); + const [, year, month, day, hour, minute, second] = match.map(Number); + const millisec = match[7] ? Number((match[7] + "00").substr(1, 3)) : 0; + let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec); + const tz = match[8]; + if (tz && tz !== "Z") { + let d = parseSexagesimal(tz, false); + if (Math.abs(d) < 30) + d *= 60; + date -= 6e4 * d; + } + return new Date(date); + }, + stringify: ({ value: value2 }) => value2.toISOString().replace(/((T00:00)?:00)?\.000Z$/, "") + }; + schema = [ + map, + seq, + string, + nullTag, + trueTag, + falseTag, + intBin, + intOct, + int, + intHex, + floatNaN, + floatExp, + float, + binary, + omap, + pairs, + set, + intTime, + floatTime, + timestamp + ]; + schemas = /* @__PURE__ */ new Map([ + ["core", schema$2], + ["failsafe", [map, seq, string]], + ["json", schema$1], + ["yaml11", schema], + ["yaml-1.1", schema] + ]); + tagsByName = { + binary, + bool: boolTag, + float: float$1, + floatExp: floatExp$1, + floatNaN: floatNaN$1, + floatTime, + int: int$1, + intHex: intHex$1, + intOct: intOct$1, + intTime, + map, + null: nullTag, + omap, + pairs, + seq, + set, + timestamp + }; + coreKnownTags = { + "tag:yaml.org,2002:binary": binary, + "tag:yaml.org,2002:omap": omap, + "tag:yaml.org,2002:pairs": pairs, + "tag:yaml.org,2002:set": set, + "tag:yaml.org,2002:timestamp": timestamp + }; + sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0; + Schema = class { + constructor({ compat, customTags, merge, resolveKnownTags, schema: schema2, sortMapEntries, toStringDefaults }) { + this.compat = Array.isArray(compat) ? getTags(compat, "compat") : compat ? getTags(null, compat) : null; + this.merge = !!merge; + this.name = typeof schema2 === "string" && schema2 || "core"; + this.knownTags = resolveKnownTags ? coreKnownTags : {}; + this.tags = getTags(customTags, this.name); + this.toStringOptions = toStringDefaults ?? null; + Object.defineProperty(this, MAP, { value: map }); + Object.defineProperty(this, SCALAR$1, { value: string }); + Object.defineProperty(this, SEQ, { value: seq }); + this.sortMapEntries = typeof sortMapEntries === "function" ? sortMapEntries : sortMapEntries === true ? sortMapEntriesByKey : null; + } + clone() { + const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this)); + copy.tags = this.tags.slice(); + return copy; + } + }; + Document = class { + constructor(value2, replacer, options2) { + this.commentBefore = null; + this.comment = null; + this.errors = []; + this.warnings = []; + Object.defineProperty(this, NODE_TYPE, { value: DOC }); + let _replacer = null; + if (typeof replacer === "function" || Array.isArray(replacer)) { + _replacer = replacer; + } else if (options2 === void 0 && replacer) { + options2 = replacer; + replacer = void 0; + } + const opt = Object.assign({ + intAsBigInt: false, + keepSourceTokens: false, + logLevel: "warn", + prettyErrors: true, + strict: true, + uniqueKeys: true, + version: "1.2" + }, options2); + this.options = opt; + let { version: version4 } = opt; + if (options2 == null ? void 0 : options2._directives) { + this.directives = options2._directives.atDocument(); + if (this.directives.yaml.explicit) + version4 = this.directives.yaml.version; + } else + this.directives = new Directives({ version: version4 }); + this.setSchema(version4, options2); + if (value2 === void 0) + this.contents = null; + else { + this.contents = this.createNode(value2, _replacer, options2); + } + } + /** + * Create a deep copy of this Document and its contents. + * + * Custom Node values that inherit from `Object` still refer to their original instances. + */ + clone() { + const copy = Object.create(Document.prototype, { + [NODE_TYPE]: { value: DOC } + }); + copy.commentBefore = this.commentBefore; + copy.comment = this.comment; + copy.errors = this.errors.slice(); + copy.warnings = this.warnings.slice(); + copy.options = Object.assign({}, this.options); + if (this.directives) + copy.directives = this.directives.clone(); + copy.schema = this.schema.clone(); + copy.contents = isNode$1(this.contents) ? this.contents.clone(copy.schema) : this.contents; + if (this.range) + copy.range = this.range.slice(); + return copy; + } + /** Adds a value to the document. */ + add(value2) { + if (assertCollection(this.contents)) + this.contents.add(value2); + } + /** Adds a value to the document. */ + addIn(path3, value2) { + if (assertCollection(this.contents)) + this.contents.addIn(path3, value2); + } + /** + * Create a new `Alias` node, ensuring that the target `node` has the required anchor. + * + * If `node` already has an anchor, `name` is ignored. + * Otherwise, the `node.anchor` value will be set to `name`, + * or if an anchor with that name is already present in the document, + * `name` will be used as a prefix for a new unique anchor. + * If `name` is undefined, the generated anchor will use 'a' as a prefix. + */ + createAlias(node2, name2) { + if (!node2.anchor) { + const prev = anchorNames(this); + node2.anchor = // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + !name2 || prev.has(name2) ? findNewAnchor(name2 || "a", prev) : name2; + } + return new Alias(node2.anchor); + } + createNode(value2, replacer, options2) { + let _replacer = void 0; + if (typeof replacer === "function") { + value2 = replacer.call({ "": value2 }, "", value2); + _replacer = replacer; + } else if (Array.isArray(replacer)) { + const keyToStr = (v) => typeof v === "number" || v instanceof String || v instanceof Number; + const asStr = replacer.filter(keyToStr).map(String); + if (asStr.length > 0) + replacer = replacer.concat(asStr); + _replacer = replacer; + } else if (options2 === void 0 && replacer) { + options2 = replacer; + replacer = void 0; + } + const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options2 ?? {}; + const { onAnchor, setAnchors, sourceObjects } = createNodeAnchors( + this, + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + anchorPrefix || "a" + ); + const ctx = { + aliasDuplicateObjects: aliasDuplicateObjects ?? true, + keepUndefined: keepUndefined ?? false, + onAnchor, + onTagObj, + replacer: _replacer, + schema: this.schema, + sourceObjects + }; + const node2 = createNode(value2, tag, ctx); + if (flow && isCollection$1(node2)) + node2.flow = true; + setAnchors(); + return node2; + } + /** + * Convert a key and a value into a `Pair` using the current schema, + * recursively wrapping all values as `Scalar` or `Collection` nodes. + */ + createPair(key, value2, options2 = {}) { + const k = this.createNode(key, null, options2); + const v = this.createNode(value2, null, options2); + return new Pair(k, v); + } + /** + * Removes a value from the document. + * @returns `true` if the item was found and removed. + */ + delete(key) { + return assertCollection(this.contents) ? this.contents.delete(key) : false; + } + /** + * Removes a value from the document. + * @returns `true` if the item was found and removed. + */ + deleteIn(path3) { + if (isEmptyPath(path3)) { + if (this.contents == null) + return false; + this.contents = null; + return true; + } + return assertCollection(this.contents) ? this.contents.deleteIn(path3) : false; + } + /** + * Returns item at `key`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + get(key, keepScalar) { + return isCollection$1(this.contents) ? this.contents.get(key, keepScalar) : void 0; + } + /** + * Returns item at `path`, or `undefined` if not found. By default unwraps + * scalar values from their surrounding node; to disable set `keepScalar` to + * `true` (collections are always returned intact). + */ + getIn(path3, keepScalar) { + if (isEmptyPath(path3)) + return !keepScalar && isScalar$1(this.contents) ? this.contents.value : this.contents; + return isCollection$1(this.contents) ? this.contents.getIn(path3, keepScalar) : void 0; + } + /** + * Checks if the document includes a value with the key `key`. + */ + has(key) { + return isCollection$1(this.contents) ? this.contents.has(key) : false; + } + /** + * Checks if the document includes a value at `path`. + */ + hasIn(path3) { + if (isEmptyPath(path3)) + return this.contents !== void 0; + return isCollection$1(this.contents) ? this.contents.hasIn(path3) : false; + } + /** + * Sets a value in this document. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + set(key, value2) { + if (this.contents == null) { + this.contents = collectionFromPath(this.schema, [key], value2); + } else if (assertCollection(this.contents)) { + this.contents.set(key, value2); + } + } + /** + * Sets a value in this document. For `!!set`, `value` needs to be a + * boolean to add/remove the item from the set. + */ + setIn(path3, value2) { + if (isEmptyPath(path3)) + this.contents = value2; + else if (this.contents == null) { + this.contents = collectionFromPath(this.schema, Array.from(path3), value2); + } else if (assertCollection(this.contents)) { + this.contents.setIn(path3, value2); + } + } + /** + * Change the YAML version and schema used by the document. + * A `null` version disables support for directives, explicit tags, anchors, and aliases. + * It also requires the `schema` option to be given as a `Schema` instance value. + * + * Overrides all previously set schema options. + */ + setSchema(version4, options2 = {}) { + if (typeof version4 === "number") + version4 = String(version4); + let opt; + switch (version4) { + case "1.1": + if (this.directives) + this.directives.yaml.version = "1.1"; + else + this.directives = new Directives({ version: "1.1" }); + opt = { merge: true, resolveKnownTags: false, schema: "yaml-1.1" }; + break; + case "1.2": + case "next": + if (this.directives) + this.directives.yaml.version = version4; + else + this.directives = new Directives({ version: version4 }); + opt = { merge: false, resolveKnownTags: true, schema: "core" }; + break; + case null: + if (this.directives) + delete this.directives; + opt = null; + break; + default: { + const sv = JSON.stringify(version4); + throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`); + } + } + if (options2.schema instanceof Object) + this.schema = options2.schema; + else if (opt) + this.schema = new Schema(Object.assign(opt, options2)); + else + throw new Error(`With a null YAML version, the { schema: Schema } option is required`); + } + // json & jsonArg are only used from toJSON() + toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) { + const ctx = { + anchors: /* @__PURE__ */ new Map(), + doc: this, + keep: !json, + mapAsMap: mapAsMap === true, + mapKeyWarned: false, + maxAliasCount: typeof maxAliasCount === "number" ? maxAliasCount : 100, + stringify: stringify$2 + }; + const res = toJS(this.contents, jsonArg ?? "", ctx); + if (typeof onAnchor === "function") + for (const { count, res: res2 } of ctx.anchors.values()) + onAnchor(res2, count); + return typeof reviver === "function" ? applyReviver(reviver, { "": res }, "", res) : res; + } + /** + * A JSON representation of the document `contents`. + * + * @param jsonArg Used by `JSON.stringify` to indicate the array index or + * property name. + */ + toJSON(jsonArg, onAnchor) { + return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor }); + } + /** A YAML representation of the document. */ + toString(options2 = {}) { + if (this.errors.length > 0) + throw new Error("Document with errors cannot be stringified"); + if ("indent" in options2 && (!Number.isInteger(options2.indent) || Number(options2.indent) <= 0)) { + const s = JSON.stringify(options2.indent); + throw new Error(`"indent" option must be a positive integer, not ${s}`); + } + return stringifyDocument(this, options2); + } + }; + YAMLError = class extends Error { + constructor(name2, pos, code, message) { + super(); + this.name = name2; + this.code = code; + this.message = message; + this.pos = pos; + } + }; + YAMLParseError = class extends YAMLError { + constructor(pos, code, message) { + super("YAMLParseError", pos, code, message); + } + }; + YAMLWarning = class extends YAMLError { + constructor(pos, code, message) { + super("YAMLWarning", pos, code, message); + } + }; + prettifyError = (src2, lc) => (error2) => { + if (error2.pos[0] === -1) + return; + error2.linePos = error2.pos.map((pos) => lc.linePos(pos)); + const { line, col } = error2.linePos[0]; + error2.message += ` at line ${line}, column ${col}`; + let ci = col - 1; + let lineStr = src2.substring(lc.lineStarts[line - 1], lc.lineStarts[line]).replace(/[\n\r]+$/, ""); + if (ci >= 60 && lineStr.length > 80) { + const trimStart = Math.min(ci - 39, lineStr.length - 79); + lineStr = "\u2026" + lineStr.substring(trimStart); + ci -= trimStart - 1; + } + if (lineStr.length > 80) + lineStr = lineStr.substring(0, 79) + "\u2026"; + if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) { + let prev = src2.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]); + if (prev.length > 80) + prev = prev.substring(0, 79) + "\u2026\n"; + lineStr = prev + lineStr; + } + if (/[^ ]/.test(lineStr)) { + let count = 1; + const end = error2.linePos[1]; + if (end && end.line === line && end.col > col) { + count = Math.min(end.col - col, 80 - ci); + } + const pointer = " ".repeat(ci) + "^".repeat(count); + error2.message += `: + +${lineStr} +${pointer} +`; + } + }; + startColMsg = "All mapping items must start at the same column"; + blockMsg = "Block collections are not allowed within flow collections"; + isBlock = (token) => token && (token.type === "block-map" || token.type === "block-seq"); + escapeCodes = { + "0": "\0", + a: "\x07", + b: "\b", + e: "\x1B", + f: "\f", + n: "\n", + r: "\r", + t: " ", + v: "\v", + N: "\x85", + _: "\xA0", + L: "\u2028", + P: "\u2029", + " ": " ", + '"': '"', + "/": "/", + "\\": "\\", + " ": " " + }; + CN = { composeNode, composeEmptyNode }; + Composer = class { + constructor(options2 = {}) { + this.doc = null; + this.atDirectives = false; + this.prelude = []; + this.errors = []; + this.warnings = []; + this.onError = (source, code, message, warning) => { + const pos = getErrorPos(source); + if (warning) + this.warnings.push(new YAMLWarning(pos, code, message)); + else + this.errors.push(new YAMLParseError(pos, code, message)); + }; + this.directives = new Directives({ version: options2.version || "1.2" }); + this.options = options2; + } + decorate(doc, afterDoc) { + const { comment, afterEmptyLine } = parsePrelude(this.prelude); + if (comment) { + const dc = doc.contents; + if (afterDoc) { + doc.comment = doc.comment ? `${doc.comment} +${comment}` : comment; + } else if (afterEmptyLine || doc.directives.docStart || !dc) { + doc.commentBefore = comment; + } else if (isCollection$1(dc) && !dc.flow && dc.items.length > 0) { + let it = dc.items[0]; + if (isPair(it)) + it = it.key; + const cb = it.commentBefore; + it.commentBefore = cb ? `${comment} +${cb}` : comment; + } else { + const cb = dc.commentBefore; + dc.commentBefore = cb ? `${comment} +${cb}` : comment; + } + } + if (afterDoc) { + Array.prototype.push.apply(doc.errors, this.errors); + Array.prototype.push.apply(doc.warnings, this.warnings); + } else { + doc.errors = this.errors; + doc.warnings = this.warnings; + } + this.prelude = []; + this.errors = []; + this.warnings = []; + } + /** + * Current stream status information. + * + * Mostly useful at the end of input for an empty stream. + */ + streamInfo() { + return { + comment: parsePrelude(this.prelude).comment, + directives: this.directives, + errors: this.errors, + warnings: this.warnings + }; + } + /** + * Compose tokens into documents. + * + * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document. + * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly. + */ + *compose(tokens, forceDoc = false, endOffset = -1) { + for (const token of tokens) + yield* this.next(token); + yield* this.end(forceDoc, endOffset); + } + /** Advance the composer by one CST token. */ + *next(token) { + switch (token.type) { + case "directive": + this.directives.add(token.source, (offset3, message, warning) => { + const pos = getErrorPos(token); + pos[0] += offset3; + this.onError(pos, "BAD_DIRECTIVE", message, warning); + }); + this.prelude.push(token.source); + this.atDirectives = true; + break; + case "document": { + const doc = composeDoc(this.options, this.directives, token, this.onError); + if (this.atDirectives && !doc.directives.docStart) + this.onError(token, "MISSING_CHAR", "Missing directives-end/doc-start indicator line"); + this.decorate(doc, false); + if (this.doc) + yield this.doc; + this.doc = doc; + this.atDirectives = false; + break; + } + case "byte-order-mark": + case "space": + break; + case "comment": + case "newline": + this.prelude.push(token.source); + break; + case "error": { + const msg = token.source ? `${token.message}: ${JSON.stringify(token.source)}` : token.message; + const error2 = new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg); + if (this.atDirectives || !this.doc) + this.errors.push(error2); + else + this.doc.errors.push(error2); + break; + } + case "doc-end": { + if (!this.doc) { + const msg = "Unexpected doc-end without preceding document"; + this.errors.push(new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", msg)); + break; + } + this.doc.directives.docEnd = true; + const end = resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError); + this.decorate(this.doc, true); + if (end.comment) { + const dc = this.doc.comment; + this.doc.comment = dc ? `${dc} +${end.comment}` : end.comment; + } + this.doc.range[2] = end.offset; + break; + } + default: + this.errors.push(new YAMLParseError(getErrorPos(token), "UNEXPECTED_TOKEN", `Unsupported token ${token.type}`)); + } + } + /** + * Call at end of input to yield any remaining document. + * + * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document. + * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly. + */ + *end(forceDoc = false, endOffset = -1) { + if (this.doc) { + this.decorate(this.doc, true); + yield this.doc; + this.doc = null; + } else if (forceDoc) { + const opts = Object.assign({ _directives: this.directives }, this.options); + const doc = new Document(void 0, opts); + if (this.atDirectives) + this.onError(endOffset, "MISSING_CHAR", "Missing directives-end indicator line"); + doc.range = [0, endOffset, endOffset]; + this.decorate(doc, false); + yield doc; + } + } + }; + stringify$1 = (cst2) => "type" in cst2 ? stringifyToken(cst2) : stringifyItem(cst2); + BREAK = Symbol("break visit"); + SKIP = Symbol("skip children"); + REMOVE = Symbol("remove item"); + visit.BREAK = BREAK; + visit.SKIP = SKIP; + visit.REMOVE = REMOVE; + visit.itemAtPath = (cst2, path3) => { + let item = cst2; + for (const [field, index] of path3) { + const tok = item == null ? void 0 : item[field]; + if (tok && "items" in tok) { + item = tok.items[index]; + } else + return void 0; + } + return item; + }; + visit.parentCollection = (cst2, path3) => { + const parent = visit.itemAtPath(cst2, path3.slice(0, -1)); + const field = path3[path3.length - 1][0]; + const coll = parent == null ? void 0 : parent[field]; + if (coll && "items" in coll) + return coll; + throw new Error("Parent collection not found"); + }; + BOM = "\uFEFF"; + DOCUMENT = ""; + FLOW_END = ""; + SCALAR = ""; + isCollection = (token) => !!token && "items" in token; + isScalar = (token) => !!token && (token.type === "scalar" || token.type === "single-quoted-scalar" || token.type === "double-quoted-scalar" || token.type === "block-scalar"); + cst = { + __proto__: null, + BOM, + DOCUMENT, + FLOW_END, + SCALAR, + createScalarToken, + isCollection, + isScalar, + prettyToken, + resolveAsScalar, + setScalarValue, + stringify: stringify$1, + tokenType, + visit + }; + hexDigits = "0123456789ABCDEFabcdef".split(""); + tagChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()".split(""); + invalidFlowScalarChars = ",[]{}".split(""); + invalidAnchorChars = " ,[]{}\n\r ".split(""); + isNotAnchorChar = (ch) => !ch || invalidAnchorChars.includes(ch); + Lexer = class { + constructor() { + this.atEnd = false; + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + this.buffer = ""; + this.flowKey = false; + this.flowLevel = 0; + this.indentNext = 0; + this.indentValue = 0; + this.lineEndPos = null; + this.next = null; + this.pos = 0; + } + /** + * Generate YAML tokens from the `source` string. If `incomplete`, + * a part of the last line may be left as a buffer for the next call. + * + * @returns A generator of lexical tokens + */ + *lex(source, incomplete = false) { + if (source) { + this.buffer = this.buffer ? this.buffer + source : source; + this.lineEndPos = null; + } + this.atEnd = !incomplete; + let next = this.next ?? "stream"; + while (next && (incomplete || this.hasChars(1))) + next = yield* this.parseNext(next); + } + atLineEnd() { + let i = this.pos; + let ch = this.buffer[i]; + while (ch === " " || ch === " ") + ch = this.buffer[++i]; + if (!ch || ch === "#" || ch === "\n") + return true; + if (ch === "\r") + return this.buffer[i + 1] === "\n"; + return false; + } + charAt(n) { + return this.buffer[this.pos + n]; + } + continueScalar(offset3) { + let ch = this.buffer[offset3]; + if (this.indentNext > 0) { + let indent = 0; + while (ch === " ") + ch = this.buffer[++indent + offset3]; + if (ch === "\r") { + const next = this.buffer[indent + offset3 + 1]; + if (next === "\n" || !next && !this.atEnd) + return offset3 + indent + 1; + } + return ch === "\n" || indent >= this.indentNext || !ch && !this.atEnd ? offset3 + indent : -1; + } + if (ch === "-" || ch === ".") { + const dt = this.buffer.substr(offset3, 3); + if ((dt === "---" || dt === "...") && isEmpty(this.buffer[offset3 + 3])) + return -1; + } + return offset3; + } + getLine() { + let end = this.lineEndPos; + if (typeof end !== "number" || end !== -1 && end < this.pos) { + end = this.buffer.indexOf("\n", this.pos); + this.lineEndPos = end; + } + if (end === -1) + return this.atEnd ? this.buffer.substring(this.pos) : null; + if (this.buffer[end - 1] === "\r") + end -= 1; + return this.buffer.substring(this.pos, end); + } + hasChars(n) { + return this.pos + n <= this.buffer.length; + } + setNext(state) { + this.buffer = this.buffer.substring(this.pos); + this.pos = 0; + this.lineEndPos = null; + this.next = state; + return null; + } + peek(n) { + return this.buffer.substr(this.pos, n); + } + *parseNext(next) { + switch (next) { + case "stream": + return yield* this.parseStream(); + case "line-start": + return yield* this.parseLineStart(); + case "block-start": + return yield* this.parseBlockStart(); + case "doc": + return yield* this.parseDocument(); + case "flow": + return yield* this.parseFlowCollection(); + case "quoted-scalar": + return yield* this.parseQuotedScalar(); + case "block-scalar": + return yield* this.parseBlockScalar(); + case "plain-scalar": + return yield* this.parsePlainScalar(); + } + } + *parseStream() { + let line = this.getLine(); + if (line === null) + return this.setNext("stream"); + if (line[0] === BOM) { + yield* this.pushCount(1); + line = line.substring(1); + } + if (line[0] === "%") { + let dirEnd = line.length; + const cs = line.indexOf("#"); + if (cs !== -1) { + const ch = line[cs - 1]; + if (ch === " " || ch === " ") + dirEnd = cs - 1; + } + while (true) { + const ch = line[dirEnd - 1]; + if (ch === " " || ch === " ") + dirEnd -= 1; + else + break; + } + const n = (yield* this.pushCount(dirEnd)) + (yield* this.pushSpaces(true)); + yield* this.pushCount(line.length - n); + this.pushNewline(); + return "stream"; + } + if (this.atLineEnd()) { + const sp = yield* this.pushSpaces(true); + yield* this.pushCount(line.length - sp); + yield* this.pushNewline(); + return "stream"; + } + yield DOCUMENT; + return yield* this.parseLineStart(); + } + *parseLineStart() { + const ch = this.charAt(0); + if (!ch && !this.atEnd) + return this.setNext("line-start"); + if (ch === "-" || ch === ".") { + if (!this.atEnd && !this.hasChars(4)) + return this.setNext("line-start"); + const s = this.peek(3); + if (s === "---" && isEmpty(this.charAt(3))) { + yield* this.pushCount(3); + this.indentValue = 0; + this.indentNext = 0; + return "doc"; + } else if (s === "..." && isEmpty(this.charAt(3))) { + yield* this.pushCount(3); + return "stream"; + } + } + this.indentValue = yield* this.pushSpaces(false); + if (this.indentNext > this.indentValue && !isEmpty(this.charAt(1))) + this.indentNext = this.indentValue; + return yield* this.parseBlockStart(); + } + *parseBlockStart() { + const [ch0, ch1] = this.peek(2); + if (!ch1 && !this.atEnd) + return this.setNext("block-start"); + if ((ch0 === "-" || ch0 === "?" || ch0 === ":") && isEmpty(ch1)) { + const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)); + this.indentNext = this.indentValue + 1; + this.indentValue += n; + return yield* this.parseBlockStart(); + } + return "doc"; + } + *parseDocument() { + yield* this.pushSpaces(true); + const line = this.getLine(); + if (line === null) + return this.setNext("doc"); + let n = yield* this.pushIndicators(); + switch (line[n]) { + case "#": + yield* this.pushCount(line.length - n); + case void 0: + yield* this.pushNewline(); + return yield* this.parseLineStart(); + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel = 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + return "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "doc"; + case '"': + case "'": + return yield* this.parseQuotedScalar(); + case "|": + case ">": + n += yield* this.parseBlockScalarHeader(); + n += yield* this.pushSpaces(true); + yield* this.pushCount(line.length - n); + yield* this.pushNewline(); + return yield* this.parseBlockScalar(); + default: + return yield* this.parsePlainScalar(); + } + } + *parseFlowCollection() { + let nl, sp; + let indent = -1; + do { + nl = yield* this.pushNewline(); + if (nl > 0) { + sp = yield* this.pushSpaces(false); + this.indentValue = indent = sp; + } else { + sp = 0; + } + sp += yield* this.pushSpaces(true); + } while (nl + sp > 0); + const line = this.getLine(); + if (line === null) + return this.setNext("flow"); + if (indent !== -1 && indent < this.indentNext && line[0] !== "#" || indent === 0 && (line.startsWith("---") || line.startsWith("...")) && isEmpty(line[3])) { + const atFlowEndMarker = indent === this.indentNext - 1 && this.flowLevel === 1 && (line[0] === "]" || line[0] === "}"); + if (!atFlowEndMarker) { + this.flowLevel = 0; + yield FLOW_END; + return yield* this.parseLineStart(); + } + } + let n = 0; + while (line[n] === ",") { + n += yield* this.pushCount(1); + n += yield* this.pushSpaces(true); + this.flowKey = false; + } + n += yield* this.pushIndicators(); + switch (line[n]) { + case void 0: + return "flow"; + case "#": + yield* this.pushCount(line.length - n); + return "flow"; + case "{": + case "[": + yield* this.pushCount(1); + this.flowKey = false; + this.flowLevel += 1; + return "flow"; + case "}": + case "]": + yield* this.pushCount(1); + this.flowKey = true; + this.flowLevel -= 1; + return this.flowLevel ? "flow" : "doc"; + case "*": + yield* this.pushUntil(isNotAnchorChar); + return "flow"; + case '"': + case "'": + this.flowKey = true; + return yield* this.parseQuotedScalar(); + case ":": { + const next = this.charAt(1); + if (this.flowKey || isEmpty(next) || next === ",") { + this.flowKey = false; + yield* this.pushCount(1); + yield* this.pushSpaces(true); + return "flow"; + } + } + default: + this.flowKey = false; + return yield* this.parsePlainScalar(); + } + } + *parseQuotedScalar() { + const quote = this.charAt(0); + let end = this.buffer.indexOf(quote, this.pos + 1); + if (quote === "'") { + while (end !== -1 && this.buffer[end + 1] === "'") + end = this.buffer.indexOf("'", end + 2); + } else { + while (end !== -1) { + let n = 0; + while (this.buffer[end - 1 - n] === "\\") + n += 1; + if (n % 2 === 0) + break; + end = this.buffer.indexOf('"', end + 1); + } + } + const qb = this.buffer.substring(0, end); + let nl = qb.indexOf("\n", this.pos); + if (nl !== -1) { + while (nl !== -1) { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = qb.indexOf("\n", cs); + } + if (nl !== -1) { + end = nl - (qb[nl - 1] === "\r" ? 2 : 1); + } + } + if (end === -1) { + if (!this.atEnd) + return this.setNext("quoted-scalar"); + end = this.buffer.length; + } + yield* this.pushToIndex(end + 1, false); + return this.flowLevel ? "flow" : "doc"; + } + *parseBlockScalarHeader() { + this.blockScalarIndent = -1; + this.blockScalarKeep = false; + let i = this.pos; + while (true) { + const ch = this.buffer[++i]; + if (ch === "+") + this.blockScalarKeep = true; + else if (ch > "0" && ch <= "9") + this.blockScalarIndent = Number(ch) - 1; + else if (ch !== "-") + break; + } + return yield* this.pushUntil((ch) => isEmpty(ch) || ch === "#"); + } + *parseBlockScalar() { + let nl = this.pos - 1; + let indent = 0; + let ch; + loop: + for (let i = this.pos; ch = this.buffer[i]; ++i) { + switch (ch) { + case " ": + indent += 1; + break; + case "\n": + nl = i; + indent = 0; + break; + case "\r": { + const next = this.buffer[i + 1]; + if (!next && !this.atEnd) + return this.setNext("block-scalar"); + if (next === "\n") + break; + } + default: + break loop; + } + } + if (!ch && !this.atEnd) + return this.setNext("block-scalar"); + if (indent >= this.indentNext) { + if (this.blockScalarIndent === -1) + this.indentNext = indent; + else + this.indentNext += this.blockScalarIndent; + do { + const cs = this.continueScalar(nl + 1); + if (cs === -1) + break; + nl = this.buffer.indexOf("\n", cs); + } while (nl !== -1); + if (nl === -1) { + if (!this.atEnd) + return this.setNext("block-scalar"); + nl = this.buffer.length; + } + } + if (!this.blockScalarKeep) { + do { + let i = nl - 1; + let ch2 = this.buffer[i]; + if (ch2 === "\r") + ch2 = this.buffer[--i]; + const lastChar = i; + while (ch2 === " " || ch2 === " ") + ch2 = this.buffer[--i]; + if (ch2 === "\n" && i >= this.pos && i + 1 + indent > lastChar) + nl = i; + else + break; + } while (true); + } + yield SCALAR; + yield* this.pushToIndex(nl + 1, true); + return yield* this.parseLineStart(); + } + *parsePlainScalar() { + const inFlow = this.flowLevel > 0; + let end = this.pos - 1; + let i = this.pos - 1; + let ch; + while (ch = this.buffer[++i]) { + if (ch === ":") { + const next = this.buffer[i + 1]; + if (isEmpty(next) || inFlow && next === ",") + break; + end = i; + } else if (isEmpty(ch)) { + let next = this.buffer[i + 1]; + if (ch === "\r") { + if (next === "\n") { + i += 1; + ch = "\n"; + next = this.buffer[i + 1]; + } else + end = i; + } + if (next === "#" || inFlow && invalidFlowScalarChars.includes(next)) + break; + if (ch === "\n") { + const cs = this.continueScalar(i + 1); + if (cs === -1) + break; + i = Math.max(i, cs - 2); + } + } else { + if (inFlow && invalidFlowScalarChars.includes(ch)) + break; + end = i; + } + } + if (!ch && !this.atEnd) + return this.setNext("plain-scalar"); + yield SCALAR; + yield* this.pushToIndex(end + 1, true); + return inFlow ? "flow" : "doc"; + } + *pushCount(n) { + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos += n; + return n; + } + return 0; + } + *pushToIndex(i, allowEmpty) { + const s = this.buffer.slice(this.pos, i); + if (s) { + yield s; + this.pos += s.length; + return s.length; + } else if (allowEmpty) + yield ""; + return 0; + } + *pushIndicators() { + switch (this.charAt(0)) { + case "!": + return (yield* this.pushTag()) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "&": + return (yield* this.pushUntil(isNotAnchorChar)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + case "-": + case "?": + case ":": { + const inFlow = this.flowLevel > 0; + const ch1 = this.charAt(1); + if (isEmpty(ch1) || inFlow && invalidFlowScalarChars.includes(ch1)) { + if (!inFlow) + this.indentNext = this.indentValue + 1; + else if (this.flowKey) + this.flowKey = false; + return (yield* this.pushCount(1)) + (yield* this.pushSpaces(true)) + (yield* this.pushIndicators()); + } + } + } + return 0; + } + *pushTag() { + if (this.charAt(1) === "<") { + let i = this.pos + 2; + let ch = this.buffer[i]; + while (!isEmpty(ch) && ch !== ">") + ch = this.buffer[++i]; + return yield* this.pushToIndex(ch === ">" ? i + 1 : i, false); + } else { + let i = this.pos + 1; + let ch = this.buffer[i]; + while (ch) { + if (tagChars.includes(ch)) + ch = this.buffer[++i]; + else if (ch === "%" && hexDigits.includes(this.buffer[i + 1]) && hexDigits.includes(this.buffer[i + 2])) { + ch = this.buffer[i += 3]; + } else + break; + } + return yield* this.pushToIndex(i, false); + } + } + *pushNewline() { + const ch = this.buffer[this.pos]; + if (ch === "\n") + return yield* this.pushCount(1); + else if (ch === "\r" && this.charAt(1) === "\n") + return yield* this.pushCount(2); + else + return 0; + } + *pushSpaces(allowTabs) { + let i = this.pos - 1; + let ch; + do { + ch = this.buffer[++i]; + } while (ch === " " || allowTabs && ch === " "); + const n = i - this.pos; + if (n > 0) { + yield this.buffer.substr(this.pos, n); + this.pos = i; + } + return n; + } + *pushUntil(test) { + let i = this.pos; + let ch = this.buffer[i]; + while (!test(ch)) + ch = this.buffer[++i]; + return yield* this.pushToIndex(i, false); + } + }; + LineCounter = class { + constructor() { + this.lineStarts = []; + this.addNewLine = (offset3) => this.lineStarts.push(offset3); + this.linePos = (offset3) => { + let low = 0; + let high = this.lineStarts.length; + while (low < high) { + const mid = low + high >> 1; + if (this.lineStarts[mid] < offset3) + low = mid + 1; + else + high = mid; + } + if (this.lineStarts[low] === offset3) + return { line: low + 1, col: 1 }; + if (low === 0) + return { line: 0, col: offset3 }; + const start = this.lineStarts[low - 1]; + return { line: low, col: offset3 - start + 1 }; + }; + } + }; + Parser2 = class { + /** + * @param onNewLine - If defined, called separately with the start position of + * each new line (in `parse()`, including the start of input). + */ + constructor(onNewLine) { + this.atNewLine = true; + this.atScalar = false; + this.indent = 0; + this.offset = 0; + this.onKeyLine = false; + this.stack = []; + this.source = ""; + this.type = ""; + this.lexer = new Lexer(); + this.onNewLine = onNewLine; + } + /** + * Parse `source` as a YAML stream. + * If `incomplete`, a part of the last line may be left as a buffer for the next call. + * + * Errors are not thrown, but yielded as `{ type: 'error', message }` tokens. + * + * @returns A generator of tokens representing each directive, document, and other structure. + */ + *parse(source, incomplete = false) { + if (this.onNewLine && this.offset === 0) + this.onNewLine(0); + for (const lexeme of this.lexer.lex(source, incomplete)) + yield* this.next(lexeme); + if (!incomplete) + yield* this.end(); + } + /** + * Advance the parser by the `source` of one lexical token. + */ + *next(source) { + this.source = source; + if (this.atScalar) { + this.atScalar = false; + yield* this.step(); + this.offset += source.length; + return; + } + const type = tokenType(source); + if (!type) { + const message = `Not a YAML token: ${source}`; + yield* this.pop({ type: "error", offset: this.offset, message, source }); + this.offset += source.length; + } else if (type === "scalar") { + this.atNewLine = false; + this.atScalar = true; + this.type = "scalar"; + } else { + this.type = type; + yield* this.step(); + switch (type) { + case "newline": + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) + this.onNewLine(this.offset + source.length); + break; + case "space": + if (this.atNewLine && source[0] === " ") + this.indent += source.length; + break; + case "explicit-key-ind": + case "map-value-ind": + case "seq-item-ind": + if (this.atNewLine) + this.indent += source.length; + break; + case "doc-mode": + case "flow-error-end": + return; + default: + this.atNewLine = false; + } + this.offset += source.length; + } + } + /** Call at end of input to push out any remaining constructions */ + *end() { + while (this.stack.length > 0) + yield* this.pop(); + } + get sourceToken() { + const st = { + type: this.type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + return st; + } + *step() { + const top = this.peek(1); + if (this.type === "doc-end" && (!top || top.type !== "doc-end")) { + while (this.stack.length > 0) + yield* this.pop(); + this.stack.push({ + type: "doc-end", + offset: this.offset, + source: this.source + }); + return; + } + if (!top) + return yield* this.stream(); + switch (top.type) { + case "document": + return yield* this.document(top); + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return yield* this.scalar(top); + case "block-scalar": + return yield* this.blockScalar(top); + case "block-map": + return yield* this.blockMap(top); + case "block-seq": + return yield* this.blockSequence(top); + case "flow-collection": + return yield* this.flowCollection(top); + case "doc-end": + return yield* this.documentEnd(top); + } + yield* this.pop(); + } + peek(n) { + return this.stack[this.stack.length - n]; + } + *pop(error2) { + const token = error2 ?? this.stack.pop(); + if (!token) { + const message = "Tried to pop an empty stack"; + yield { type: "error", offset: this.offset, source: "", message }; + } else if (this.stack.length === 0) { + yield token; + } else { + const top = this.peek(1); + if (token.type === "block-scalar") { + token.indent = "indent" in top ? top.indent : 0; + } else if (token.type === "flow-collection" && top.type === "document") { + token.indent = 0; + } + if (token.type === "flow-collection") + fixFlowSeqItems(token); + switch (top.type) { + case "document": + top.value = token; + break; + case "block-scalar": + top.props.push(token); + break; + case "block-map": { + const it = top.items[top.items.length - 1]; + if (it.value) { + top.items.push({ start: [], key: token, sep: [] }); + this.onKeyLine = true; + return; + } else if (it.sep) { + it.value = token; + } else { + Object.assign(it, { key: token, sep: [] }); + this.onKeyLine = !includesToken(it.start, "explicit-key-ind"); + return; + } + break; + } + case "block-seq": { + const it = top.items[top.items.length - 1]; + if (it.value) + top.items.push({ start: [], value: token }); + else + it.value = token; + break; + } + case "flow-collection": { + const it = top.items[top.items.length - 1]; + if (!it || it.value) + top.items.push({ start: [], key: token, sep: [] }); + else if (it.sep) + it.value = token; + else + Object.assign(it, { key: token, sep: [] }); + return; + } + default: + yield* this.pop(); + yield* this.pop(token); + } + if ((top.type === "document" || top.type === "block-map" || top.type === "block-seq") && (token.type === "block-map" || token.type === "block-seq")) { + const last = token.items[token.items.length - 1]; + if (last && !last.sep && !last.value && last.start.length > 0 && findNonEmptyIndex(last.start) === -1 && (token.indent === 0 || last.start.every((st) => st.type !== "comment" || st.indent < token.indent))) { + if (top.type === "document") + top.end = last.start; + else + top.items.push({ start: last.start }); + token.items.splice(-1, 1); + } + } + } + } + *stream() { + switch (this.type) { + case "directive-line": + yield { type: "directive", offset: this.offset, source: this.source }; + return; + case "byte-order-mark": + case "space": + case "comment": + case "newline": + yield this.sourceToken; + return; + case "doc-mode": + case "doc-start": { + const doc = { + type: "document", + offset: this.offset, + start: [] + }; + if (this.type === "doc-start") + doc.start.push(this.sourceToken); + this.stack.push(doc); + return; + } + } + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML stream`, + source: this.source + }; + } + *document(doc) { + if (doc.value) + return yield* this.lineEnd(doc); + switch (this.type) { + case "doc-start": { + if (findNonEmptyIndex(doc.start) !== -1) { + yield* this.pop(); + yield* this.step(); + } else + doc.start.push(this.sourceToken); + return; + } + case "anchor": + case "tag": + case "space": + case "comment": + case "newline": + doc.start.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(doc); + if (bv) + this.stack.push(bv); + else { + yield { + type: "error", + offset: this.offset, + message: `Unexpected ${this.type} token in YAML document`, + source: this.source + }; + } + } + *scalar(scalar) { + if (this.type === "map-value-ind") { + const prev = getPrevProps(this.peek(2)); + const start = getFirstKeyStartProps(prev); + let sep2; + if (scalar.end) { + sep2 = scalar.end; + sep2.push(this.sourceToken); + delete scalar.end; + } else + sep2 = [this.sourceToken]; + const map2 = { + type: "block-map", + offset: scalar.offset, + indent: scalar.indent, + items: [{ start, key: scalar, sep: sep2 }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map2; + } else + yield* this.lineEnd(scalar); + } + *blockScalar(scalar) { + switch (this.type) { + case "space": + case "comment": + case "newline": + scalar.props.push(this.sourceToken); + return; + case "scalar": + scalar.source = this.source; + this.atNewLine = true; + this.indent = 0; + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + yield* this.pop(); + break; + default: + yield* this.pop(); + yield* this.step(); + } + } + *blockMap(map2) { + var _a; + const it = map2.items[map2.items.length - 1]; + switch (this.type) { + case "newline": + this.onKeyLine = false; + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + map2.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "space": + case "comment": + if (it.value) { + map2.items.push({ start: [this.sourceToken] }); + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + if (this.atIndentedComment(it.start, map2.indent)) { + const prev = map2.items[map2.items.length - 2]; + const end = (_a = prev == null ? void 0 : prev.value) == null ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + map2.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + } + if (this.indent >= map2.indent) { + const atNextItem = !this.onKeyLine && this.indent === map2.indent && it.sep; + let start = []; + if (atNextItem && it.sep && !it.value) { + const nl = []; + for (let i = 0; i < it.sep.length; ++i) { + const st = it.sep[i]; + switch (st.type) { + case "newline": + nl.push(i); + break; + case "space": + break; + case "comment": + if (st.indent > map2.indent) + nl.length = 0; + break; + default: + nl.length = 0; + } + } + if (nl.length >= 2) + start = it.sep.splice(nl[1]); + } + switch (this.type) { + case "anchor": + case "tag": + if (atNextItem || it.value) { + start.push(this.sourceToken); + map2.items.push({ start }); + this.onKeyLine = true; + } else if (it.sep) { + it.sep.push(this.sourceToken); + } else { + it.start.push(this.sourceToken); + } + return; + case "explicit-key-ind": + if (!it.sep && !includesToken(it.start, "explicit-key-ind")) { + it.start.push(this.sourceToken); + } else if (atNextItem || it.value) { + start.push(this.sourceToken); + map2.items.push({ start }); + } else { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken] }] + }); + } + this.onKeyLine = true; + return; + case "map-value-ind": + if (includesToken(it.start, "explicit-key-ind")) { + if (!it.sep) { + if (includesToken(it.start, "newline")) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else { + const start2 = getFirstKeyStartProps(it.start); + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key: null, sep: [this.sourceToken] }] + }); + } + } else if (it.value) { + map2.items.push({ start: [], key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }); + } else if (isFlowToken(it.key) && !includesToken(it.sep, "newline")) { + const start2 = getFirstKeyStartProps(it.start); + const key = it.key; + const sep2 = it.sep; + sep2.push(this.sourceToken); + delete it.key, delete it.sep; + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: start2, key, sep: sep2 }] + }); + } else if (start.length > 0) { + it.sep = it.sep.concat(start, this.sourceToken); + } else { + it.sep.push(this.sourceToken); + } + } else { + if (!it.sep) { + Object.assign(it, { key: null, sep: [this.sourceToken] }); + } else if (it.value || atNextItem) { + map2.items.push({ start, key: null, sep: [this.sourceToken] }); + } else if (includesToken(it.sep, "map-value-ind")) { + this.stack.push({ + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start: [], key: null, sep: [this.sourceToken] }] + }); + } else { + it.sep.push(this.sourceToken); + } + } + this.onKeyLine = true; + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs2 = this.flowScalar(this.type); + if (atNextItem || it.value) { + map2.items.push({ start, key: fs2, sep: [] }); + this.onKeyLine = true; + } else if (it.sep) { + this.stack.push(fs2); + } else { + Object.assign(it, { key: fs2, sep: [] }); + this.onKeyLine = true; + } + return; + } + default: { + const bv = this.startBlockValue(map2); + if (bv) { + if (atNextItem && bv.type !== "block-seq" && includesToken(it.start, "explicit-key-ind")) { + map2.items.push({ start }); + } + this.stack.push(bv); + return; + } + } + } + } + yield* this.pop(); + yield* this.step(); + } + *blockSequence(seq2) { + var _a; + const it = seq2.items[seq2.items.length - 1]; + switch (this.type) { + case "newline": + if (it.value) { + const end = "end" in it.value ? it.value.end : void 0; + const last = Array.isArray(end) ? end[end.length - 1] : void 0; + if ((last == null ? void 0 : last.type) === "comment") + end == null ? void 0 : end.push(this.sourceToken); + else + seq2.items.push({ start: [this.sourceToken] }); + } else + it.start.push(this.sourceToken); + return; + case "space": + case "comment": + if (it.value) + seq2.items.push({ start: [this.sourceToken] }); + else { + if (this.atIndentedComment(it.start, seq2.indent)) { + const prev = seq2.items[seq2.items.length - 2]; + const end = (_a = prev == null ? void 0 : prev.value) == null ? void 0 : _a.end; + if (Array.isArray(end)) { + Array.prototype.push.apply(end, it.start); + end.push(this.sourceToken); + seq2.items.pop(); + return; + } + } + it.start.push(this.sourceToken); + } + return; + case "anchor": + case "tag": + if (it.value || this.indent <= seq2.indent) + break; + it.start.push(this.sourceToken); + return; + case "seq-item-ind": + if (this.indent !== seq2.indent) + break; + if (it.value || includesToken(it.start, "seq-item-ind")) + seq2.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + } + if (this.indent > seq2.indent) { + const bv = this.startBlockValue(seq2); + if (bv) { + this.stack.push(bv); + return; + } + } + yield* this.pop(); + yield* this.step(); + } + *flowCollection(fc) { + const it = fc.items[fc.items.length - 1]; + if (this.type === "flow-error-end") { + let top; + do { + yield* this.pop(); + top = this.peek(1); + } while (top && top.type === "flow-collection"); + } else if (fc.end.length === 0) { + switch (this.type) { + case "comma": + case "explicit-key-ind": + if (!it || it.sep) + fc.items.push({ start: [this.sourceToken] }); + else + it.start.push(this.sourceToken); + return; + case "map-value-ind": + if (!it || it.value) + fc.items.push({ start: [], key: null, sep: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + Object.assign(it, { key: null, sep: [this.sourceToken] }); + return; + case "space": + case "comment": + case "newline": + case "anchor": + case "tag": + if (!it || it.value) + fc.items.push({ start: [this.sourceToken] }); + else if (it.sep) + it.sep.push(this.sourceToken); + else + it.start.push(this.sourceToken); + return; + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": { + const fs2 = this.flowScalar(this.type); + if (!it || it.value) + fc.items.push({ start: [], key: fs2, sep: [] }); + else if (it.sep) + this.stack.push(fs2); + else + Object.assign(it, { key: fs2, sep: [] }); + return; + } + case "flow-map-end": + case "flow-seq-end": + fc.end.push(this.sourceToken); + return; + } + const bv = this.startBlockValue(fc); + if (bv) + this.stack.push(bv); + else { + yield* this.pop(); + yield* this.step(); + } + } else { + const parent = this.peek(2); + if (parent.type === "block-map" && (this.type === "map-value-ind" && parent.indent === fc.indent || this.type === "newline" && !parent.items[parent.items.length - 1].sep)) { + yield* this.pop(); + yield* this.step(); + } else if (this.type === "map-value-ind" && parent.type !== "flow-collection") { + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + fixFlowSeqItems(fc); + const sep2 = fc.end.splice(1, fc.end.length); + sep2.push(this.sourceToken); + const map2 = { + type: "block-map", + offset: fc.offset, + indent: fc.indent, + items: [{ start, key: fc, sep: sep2 }] + }; + this.onKeyLine = true; + this.stack[this.stack.length - 1] = map2; + } else { + yield* this.lineEnd(fc); + } + } + } + flowScalar(type) { + if (this.onNewLine) { + let nl = this.source.indexOf("\n") + 1; + while (nl !== 0) { + this.onNewLine(this.offset + nl); + nl = this.source.indexOf("\n", nl) + 1; + } + } + return { + type, + offset: this.offset, + indent: this.indent, + source: this.source + }; + } + startBlockValue(parent) { + switch (this.type) { + case "alias": + case "scalar": + case "single-quoted-scalar": + case "double-quoted-scalar": + return this.flowScalar(this.type); + case "block-scalar-header": + return { + type: "block-scalar", + offset: this.offset, + indent: this.indent, + props: [this.sourceToken], + source: "" + }; + case "flow-map-start": + case "flow-seq-start": + return { + type: "flow-collection", + offset: this.offset, + indent: this.indent, + start: this.sourceToken, + items: [], + end: [] + }; + case "seq-item-ind": + return { + type: "block-seq", + offset: this.offset, + indent: this.indent, + items: [{ start: [this.sourceToken] }] + }; + case "explicit-key-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + start.push(this.sourceToken); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start }] + }; + } + case "map-value-ind": { + this.onKeyLine = true; + const prev = getPrevProps(parent); + const start = getFirstKeyStartProps(prev); + return { + type: "block-map", + offset: this.offset, + indent: this.indent, + items: [{ start, key: null, sep: [this.sourceToken] }] + }; + } + } + return null; + } + atIndentedComment(start, indent) { + if (this.type !== "comment") + return false; + if (this.indent <= indent) + return false; + return start.every((st) => st.type === "newline" || st.type === "space"); + } + *documentEnd(docEnd) { + if (this.type !== "doc-mode") { + if (docEnd.end) + docEnd.end.push(this.sourceToken); + else + docEnd.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); + } + } + *lineEnd(token) { + switch (this.type) { + case "comma": + case "doc-start": + case "doc-end": + case "flow-seq-end": + case "flow-map-end": + case "map-value-ind": + yield* this.pop(); + yield* this.step(); + break; + case "newline": + this.onKeyLine = false; + case "space": + case "comment": + default: + if (token.end) + token.end.push(this.sourceToken); + else + token.end = [this.sourceToken]; + if (this.type === "newline") + yield* this.pop(); + } + } + }; + YAML = { + __proto__: null, + Alias, + CST: cst, + Composer, + Document, + Lexer, + LineCounter, + Pair, + Parser: Parser2, + Scalar, + Schema, + YAMLError, + YAMLMap, + YAMLParseError, + YAMLSeq, + YAMLWarning, + isAlias, + isCollection: isCollection$1, + isDocument, + isMap, + isNode: isNode$1, + isPair, + isScalar: isScalar$1, + isSeq, + parse: parse$a, + parseAllDocuments, + parseDocument, + stringify, + visit: visit$1, + visitAsync + }; + browser$1 = { + __proto__: null, + Alias, + CST: cst, + Composer, + Document, + Lexer, + LineCounter, + Pair, + Parser: Parser2, + Scalar, + Schema, + YAMLError, + YAMLMap, + YAMLParseError, + YAMLSeq, + YAMLWarning, + default: YAML, + isAlias, + isCollection: isCollection$1, + isDocument, + isMap, + isNode: isNode$1, + isPair, + isScalar: isScalar$1, + isSeq, + parse: parse$a, + parseAllDocuments, + parseDocument, + stringify, + visit: visit$1, + visitAsync + }; + require$$3$1 = /* @__PURE__ */ getAugmentedNamespace(browser$1); + ({ createRequire, createRequireFromPath } = require$$0$8); + req_1 = req$2; + req$1 = req_1; + options = (config2, file) => { + if (config2.parser && typeof config2.parser === "string") { + try { + config2.parser = req$1(config2.parser, file); + } catch (err) { + throw new Error(`Loading PostCSS Parser failed: ${err.message} + +(@${file})`); + } + } + if (config2.syntax && typeof config2.syntax === "string") { + try { + config2.syntax = req$1(config2.syntax, file); + } catch (err) { + throw new Error(`Loading PostCSS Syntax failed: ${err.message} + +(@${file})`); + } + } + if (config2.stringifier && typeof config2.stringifier === "string") { + try { + config2.stringifier = req$1(config2.stringifier, file); + } catch (err) { + throw new Error(`Loading PostCSS Stringifier failed: ${err.message} + +(@${file})`); + } + } + if (config2.plugins) { + delete config2.plugins; + } + return config2; + }; + options_1 = options; + req = req_1; + load = (plugin, options2, file) => { + try { + if (options2 === null || options2 === void 0 || Object.keys(options2).length === 0) { + return req(plugin, file); + } else { + return req(plugin, file)(options2); + } + } catch (err) { + throw new Error(`Loading PostCSS Plugin failed: ${err.message} + +(@${file})`); + } + }; + plugins = (config2, file) => { + let plugins2 = []; + if (Array.isArray(config2.plugins)) { + plugins2 = config2.plugins.filter(Boolean); + } else { + plugins2 = Object.keys(config2.plugins).filter((plugin) => { + return config2.plugins[plugin] !== false ? plugin : ""; + }).map((plugin) => { + return load(plugin, config2.plugins[plugin], file); + }); + } + if (plugins2.length && plugins2.length > 0) { + plugins2.forEach((plugin, i) => { + if (plugin.default) { + plugin = plugin.default; + } + if (plugin.postcss === true) { + plugin = plugin(); + } else if (plugin.postcss) { + plugin = plugin.postcss; + } + if ( + // eslint-disable-next-line + !(typeof plugin === "object" && Array.isArray(plugin.plugins) || typeof plugin === "object" && plugin.postcssPlugin || typeof plugin === "function") + ) { + throw new TypeError(`Invalid PostCSS Plugin found at: plugins[${i}] + +(@${file})`); + } + }); + } + return plugins2; + }; + plugins_1 = plugins; + resolve2 = require$$0$4.resolve; + url$4 = require$$0$9; + config$1 = dist; + yaml = require$$3$1; + loadOptions = options_1; + loadPlugins = plugins_1; + interopRequireDefault = (obj) => obj && obj.__esModule ? obj : { default: obj }; + processResult = (ctx, result) => { + const file = result.filepath || ""; + let config2 = interopRequireDefault(result.config).default || {}; + if (typeof config2 === "function") { + config2 = config2(ctx); + } else { + config2 = Object.assign({}, config2, ctx); + } + if (!config2.plugins) { + config2.plugins = []; + } + return { + plugins: loadPlugins(config2, file), + options: loadOptions(config2, file), + file + }; + }; + createContext = (ctx) => { + ctx = Object.assign({ + cwd: process.cwd(), + env: process.env.NODE_ENV + }, ctx); + if (!ctx.env) { + process.env.NODE_ENV = "development"; + } + return ctx; + }; + importDefault = async (filepath) => { + const module = await import(url$4.pathToFileURL(filepath).href); + return module.default; + }; + addTypeScriptLoader = (options2 = {}, loader) => { + const moduleName = "postcss"; + return { + ...options2, + searchPlaces: [ + ...options2.searchPlaces || [], + "package.json", + `.${moduleName}rc`, + `.${moduleName}rc.json`, + `.${moduleName}rc.yaml`, + `.${moduleName}rc.yml`, + `.${moduleName}rc.ts`, + `.${moduleName}rc.js`, + `.${moduleName}rc.cjs`, + `.${moduleName}rc.mjs`, + `${moduleName}.config.ts`, + `${moduleName}.config.js`, + `${moduleName}.config.cjs`, + `${moduleName}.config.mjs` + ], + loaders: { + ...options2.loaders, + ".yaml": (filepath, content) => yaml.parse(content), + ".yml": (filepath, content) => yaml.parse(content), + ".js": importDefault, + ".cjs": importDefault, + ".mjs": importDefault, + ".ts": loader + } + }; + }; + withTypeScriptLoader = (rcFunc) => { + return (ctx, path3, options2) => { + return rcFunc(ctx, path3, addTypeScriptLoader(options2, (configFile) => { + let registerer = { enabled() { + } }; + try { + registerer = __require("ts-node").register(); + return __require(configFile); + } catch (err) { + if (err.code === "MODULE_NOT_FOUND") { + throw new Error( + `'ts-node' is required for the TypeScript configuration files. Make sure it is installed +Error: ${err.message}` + ); + } + throw err; + } finally { + registerer.enabled(false); + } + })); + }; + }; + rc = withTypeScriptLoader((ctx, path3, options2) => { + ctx = createContext(ctx); + path3 = path3 ? resolve2(path3) : process.cwd(); + return config$1.lilconfig("postcss", options2).search(path3).then((result) => { + if (!result) { + throw new Error(`No PostCSS Config found in: ${path3}`); + } + return processResult(ctx, result); + }); + }); + mainExports = {}; + main$1 = { + get exports() { + return mainExports; + }, + set exports(v) { + mainExports = v; + } + }; + name = "dotenv"; + version$1 = "16.0.3"; + description = "Loads environment variables from .env file"; + main = "lib/main.js"; + types = "lib/main.d.ts"; + exports = { + ".": { + require: "./lib/main.js", + types: "./lib/main.d.ts", + "default": "./lib/main.js" + }, + "./config": "./config.js", + "./config.js": "./config.js", + "./lib/env-options": "./lib/env-options.js", + "./lib/env-options.js": "./lib/env-options.js", + "./lib/cli-options": "./lib/cli-options.js", + "./lib/cli-options.js": "./lib/cli-options.js", + "./package.json": "./package.json" + }; + scripts = { + "dts-check": "tsc --project tests/types/tsconfig.json", + lint: "standard", + "lint-readme": "standard-markdown", + pretest: "npm run lint && npm run dts-check", + test: "tap tests/*.js --100 -Rspec", + prerelease: "npm test", + release: "standard-version" + }; + repository = { + type: "git", + url: "git://github.com/motdotla/dotenv.git" + }; + keywords = [ + "dotenv", + "env", + ".env", + "environment", + "variables", + "config", + "settings" + ]; + readmeFilename = "README.md"; + license = "BSD-2-Clause"; + devDependencies = { + "@types/node": "^17.0.9", + decache: "^4.6.1", + dtslint: "^3.7.0", + sinon: "^12.0.1", + standard: "^16.0.4", + "standard-markdown": "^7.1.0", + "standard-version": "^9.3.2", + tap: "^15.1.6", + tar: "^6.1.11", + typescript: "^4.5.4" + }; + engines = { + node: ">=12" + }; + require$$3 = { + name, + version: version$1, + description, + main, + types, + exports, + scripts, + repository, + keywords, + readmeFilename, + license, + devDependencies, + engines + }; + fs$9 = require$$0__default; + path$9 = require$$0$4; + os$2 = require$$2; + packageJson = require$$3; + version2 = packageJson.version; + LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg; + DotenvModule = { + config, + parse: parse$9 + }; + mainExports.config = DotenvModule.config; + parse_1$1 = mainExports.parse = DotenvModule.parse; + main$1.exports = DotenvModule; + modulePreloadPolyfillId = "vite/modulepreload-polyfill"; + resolvedModulePreloadPolyfillId = "\0" + modulePreloadPolyfillId; + moduleScriptRE = /[ \t]*]*type\s*=\s*(?:"module"|'module'|module)[^>]*>/i; + modulePreloadLinkRE = /[ \t]*]*rel\s*=\s*(?:"modulepreload"|'modulepreload'|modulepreload)[\s\S]*?\/>/i; + importMapAppendRE = new RegExp([moduleScriptRE, modulePreloadLinkRE].map((r) => r.source).join("|"), "i"); + cssModuleRE = new RegExp(`\\.module${CSS_LANGS_RE.source}`); + varRE = /^var\(/i; + cssUrlRE = /(?<=^|[^\w\-\u0080-\uffff])url\((\s*('[^']+'|"[^"]+")\s*|[^'")]+)\)/; + cssDataUriRE = /(?<=^|[^\w\-\u0080-\uffff])data-uri\((\s*('[^']+'|"[^"]+")\s*|[^'")]+)\)/; + importCssRE = /@import ('[^']+\.css'|"[^"]+\.css"|[^'")]+\.css)/; + cssImageSetRE = /(?<=image-set\()((?:[\w\-]{1,256}\([^)]*\)|[^)])*)(?=\))/; + UrlRewritePostcssPlugin = (opts) => { + if (!opts) { + throw new Error("base or replace is required"); + } + return { + postcssPlugin: "vite-url-rewrite", + Once(root) { + const promises = []; + root.walkDecls((declaration) => { + var _a; + const importer = (_a = declaration.source) == null ? void 0 : _a.input.file; + if (!importer) { + opts.logger.warnOnce("\nA PostCSS plugin did not pass the `from` option to `postcss.parse`. This may cause imported assets to be incorrectly transformed. If you've recently added a PostCSS plugin that raised this warning, please contact the package author to fix the issue."); + } + const isCssUrl = cssUrlRE.test(declaration.value); + const isCssImageSet = cssImageSetRE.test(declaration.value); + if (isCssUrl || isCssImageSet) { + const replacerForDeclaration = (rawUrl) => { + return opts.replacer(rawUrl, importer); + }; + const rewriterToUse = isCssImageSet ? rewriteCssImageSet : rewriteCssUrls; + promises.push(rewriterToUse(declaration.value, replacerForDeclaration).then((url2) => { + declaration.value = url2; + })); + } + }); + if (promises.length) { + return Promise.all(promises); + } + } + }; + }; + UrlRewritePostcssPlugin.postcss = true; + cssNotProcessedRE = /(?:gradient|element|cross-fade|image)\(/; + loadedPreprocessors = {}; + _require$1 = createRequire$1(__vite_injected_original_import_meta_url2); + scss = async (source, root, options2, resolvers) => { + const render = loadPreprocessor("sass", root).render; + const internalImporter = (url2, importer2, done) => { + importer2 = cleanScssBugUrl(importer2); + resolvers.sass(url2, importer2).then((resolved) => { + if (resolved) { + rebaseUrls(resolved, options2.filename, options2.alias, "$").then((data3) => done == null ? void 0 : done(fixScssBugImportValue(data3))).catch((data3) => done == null ? void 0 : done(data3)); + } else { + done == null ? void 0 : done(null); + } + }); + }; + const importer = [internalImporter]; + if (options2.importer) { + Array.isArray(options2.importer) ? importer.unshift(...options2.importer) : importer.unshift(options2.importer); + } + const { content: data2, map: additionalMap } = await getSource(source, options2.filename, options2.additionalData, options2.enableSourcemap); + const finalOptions = { + ...options2, + data: data2, + file: options2.filename, + outFile: options2.filename, + importer, + ...options2.enableSourcemap ? { + sourceMap: true, + omitSourceMapUrl: true, + sourceMapRoot: path$o.dirname(options2.filename) + } : {} + }; + try { + const result = await new Promise((resolve3, reject) => { + render(finalOptions, (err, res) => { + if (err) { + reject(err); + } else { + resolve3(res); + } + }); + }); + const deps = result.stats.includedFiles.map((f) => cleanScssBugUrl(f)); + const map2 = result.map ? JSON.parse(result.map.toString()) : void 0; + return { + code: result.css.toString(), + map: map2, + additionalMap, + deps + }; + } catch (e) { + e.message = `[sass] ${e.message}`; + e.id = e.file; + e.frame = e.formatted; + return { code: "", error: e, deps: [] }; + } + }; + sass = (source, root, options2, aliasResolver) => scss(source, root, { + ...options2, + indentedSyntax: true + }, aliasResolver); + less = async (source, root, options2, resolvers) => { + const nodeLess = loadPreprocessor("less", root); + const viteResolverPlugin = createViteLessPlugin(nodeLess, options2.filename, options2.alias, resolvers); + const { content, map: additionalMap } = await getSource(source, options2.filename, options2.additionalData, options2.enableSourcemap); + let result; + try { + result = await nodeLess.render(content, { + ...options2, + plugins: [viteResolverPlugin, ...options2.plugins || []], + ...options2.enableSourcemap ? { + sourceMap: { + outputSourceFiles: true, + sourceMapFileInline: false + } + } : {} + }); + } catch (e) { + const error2 = e; + const normalizedError = new Error(`[less] ${error2.message || error2.type}`); + normalizedError.loc = { + file: error2.filename || options2.filename, + line: error2.line, + column: error2.column + }; + return { code: "", error: normalizedError, deps: [] }; + } + const map2 = result.map && JSON.parse(result.map); + if (map2) { + delete map2.sourcesContent; + } + return { + code: result.css.toString(), + map: map2, + additionalMap, + deps: result.imports + }; + }; + styl = async (source, root, options2) => { + const nodeStylus = loadPreprocessor("stylus", root); + const { content, map: additionalMap } = await getSource(source, options2.filename, options2.additionalData, options2.enableSourcemap, "\n"); + const importsDeps = (options2.imports ?? []).map((dep) => path$o.resolve(dep)); + try { + const ref2 = nodeStylus(content, options2); + if (options2.define) { + for (const key in options2.define) { + ref2.define(key, options2.define[key]); + } + } + if (options2.enableSourcemap) { + ref2.set("sourcemap", { + comment: false, + inline: false, + basePath: root + }); + } + const result = ref2.render(); + const deps = [...ref2.deps(), ...importsDeps]; + const map2 = ref2.sourcemap; + return { + code: result, + map: formatStylusSourceMap(map2, root), + additionalMap, + deps + }; + } catch (e) { + e.message = `[stylus] ${e.message}`; + return { code: "", error: e, deps: [] }; + } + }; + preProcessors = Object.freeze({ + [ + "less" + /* PreprocessLang.less */ + ]: less, + [ + "sass" + /* PreprocessLang.sass */ + ]: sass, + [ + "scss" + /* PreprocessLang.scss */ + ]: scss, + [ + "styl" + /* PreprocessLang.styl */ + ]: styl, + [ + "stylus" + /* PreprocessLang.stylus */ + ]: styl + }); + base = {}; + base.Program = base.BlockStatement = base.StaticBlock = function(node2, st, c) { + for (var i = 0, list = node2.body; i < list.length; i += 1) { + var stmt = list[i]; + c(stmt, st, "Statement"); + } + }; + base.Statement = skipThrough; + base.EmptyStatement = ignore; + base.ExpressionStatement = base.ParenthesizedExpression = base.ChainExpression = function(node2, st, c) { + return c(node2.expression, st, "Expression"); + }; + base.IfStatement = function(node2, st, c) { + c(node2.test, st, "Expression"); + c(node2.consequent, st, "Statement"); + if (node2.alternate) { + c(node2.alternate, st, "Statement"); + } + }; + base.LabeledStatement = function(node2, st, c) { + return c(node2.body, st, "Statement"); + }; + base.BreakStatement = base.ContinueStatement = ignore; + base.WithStatement = function(node2, st, c) { + c(node2.object, st, "Expression"); + c(node2.body, st, "Statement"); + }; + base.SwitchStatement = function(node2, st, c) { + c(node2.discriminant, st, "Expression"); + for (var i$1 = 0, list$1 = node2.cases; i$1 < list$1.length; i$1 += 1) { + var cs = list$1[i$1]; + if (cs.test) { + c(cs.test, st, "Expression"); + } + for (var i = 0, list = cs.consequent; i < list.length; i += 1) { + var cons = list[i]; + c(cons, st, "Statement"); + } + } + }; + base.SwitchCase = function(node2, st, c) { + if (node2.test) { + c(node2.test, st, "Expression"); + } + for (var i = 0, list = node2.consequent; i < list.length; i += 1) { + var cons = list[i]; + c(cons, st, "Statement"); + } + }; + base.ReturnStatement = base.YieldExpression = base.AwaitExpression = function(node2, st, c) { + if (node2.argument) { + c(node2.argument, st, "Expression"); + } + }; + base.ThrowStatement = base.SpreadElement = function(node2, st, c) { + return c(node2.argument, st, "Expression"); + }; + base.TryStatement = function(node2, st, c) { + c(node2.block, st, "Statement"); + if (node2.handler) { + c(node2.handler, st); + } + if (node2.finalizer) { + c(node2.finalizer, st, "Statement"); + } + }; + base.CatchClause = function(node2, st, c) { + if (node2.param) { + c(node2.param, st, "Pattern"); + } + c(node2.body, st, "Statement"); + }; + base.WhileStatement = base.DoWhileStatement = function(node2, st, c) { + c(node2.test, st, "Expression"); + c(node2.body, st, "Statement"); + }; + base.ForStatement = function(node2, st, c) { + if (node2.init) { + c(node2.init, st, "ForInit"); + } + if (node2.test) { + c(node2.test, st, "Expression"); + } + if (node2.update) { + c(node2.update, st, "Expression"); + } + c(node2.body, st, "Statement"); + }; + base.ForInStatement = base.ForOfStatement = function(node2, st, c) { + c(node2.left, st, "ForInit"); + c(node2.right, st, "Expression"); + c(node2.body, st, "Statement"); + }; + base.ForInit = function(node2, st, c) { + if (node2.type === "VariableDeclaration") { + c(node2, st); + } else { + c(node2, st, "Expression"); + } + }; + base.DebuggerStatement = ignore; + base.FunctionDeclaration = function(node2, st, c) { + return c(node2, st, "Function"); + }; + base.VariableDeclaration = function(node2, st, c) { + for (var i = 0, list = node2.declarations; i < list.length; i += 1) { + var decl = list[i]; + c(decl, st); + } + }; + base.VariableDeclarator = function(node2, st, c) { + c(node2.id, st, "Pattern"); + if (node2.init) { + c(node2.init, st, "Expression"); + } + }; + base.Function = function(node2, st, c) { + if (node2.id) { + c(node2.id, st, "Pattern"); + } + for (var i = 0, list = node2.params; i < list.length; i += 1) { + var param = list[i]; + c(param, st, "Pattern"); + } + c(node2.body, st, node2.expression ? "Expression" : "Statement"); + }; + base.Pattern = function(node2, st, c) { + if (node2.type === "Identifier") { + c(node2, st, "VariablePattern"); + } else if (node2.type === "MemberExpression") { + c(node2, st, "MemberPattern"); + } else { + c(node2, st); + } + }; + base.VariablePattern = ignore; + base.MemberPattern = skipThrough; + base.RestElement = function(node2, st, c) { + return c(node2.argument, st, "Pattern"); + }; + base.ArrayPattern = function(node2, st, c) { + for (var i = 0, list = node2.elements; i < list.length; i += 1) { + var elt = list[i]; + if (elt) { + c(elt, st, "Pattern"); + } + } + }; + base.ObjectPattern = function(node2, st, c) { + for (var i = 0, list = node2.properties; i < list.length; i += 1) { + var prop = list[i]; + if (prop.type === "Property") { + if (prop.computed) { + c(prop.key, st, "Expression"); + } + c(prop.value, st, "Pattern"); + } else if (prop.type === "RestElement") { + c(prop.argument, st, "Pattern"); + } + } + }; + base.Expression = skipThrough; + base.ThisExpression = base.Super = base.MetaProperty = ignore; + base.ArrayExpression = function(node2, st, c) { + for (var i = 0, list = node2.elements; i < list.length; i += 1) { + var elt = list[i]; + if (elt) { + c(elt, st, "Expression"); + } + } + }; + base.ObjectExpression = function(node2, st, c) { + for (var i = 0, list = node2.properties; i < list.length; i += 1) { + var prop = list[i]; + c(prop, st); + } + }; + base.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration; + base.SequenceExpression = function(node2, st, c) { + for (var i = 0, list = node2.expressions; i < list.length; i += 1) { + var expr = list[i]; + c(expr, st, "Expression"); + } + }; + base.TemplateLiteral = function(node2, st, c) { + for (var i = 0, list = node2.quasis; i < list.length; i += 1) { + var quasi = list[i]; + c(quasi, st); + } + for (var i$1 = 0, list$1 = node2.expressions; i$1 < list$1.length; i$1 += 1) { + var expr = list$1[i$1]; + c(expr, st, "Expression"); + } + }; + base.TemplateElement = ignore; + base.UnaryExpression = base.UpdateExpression = function(node2, st, c) { + c(node2.argument, st, "Expression"); + }; + base.BinaryExpression = base.LogicalExpression = function(node2, st, c) { + c(node2.left, st, "Expression"); + c(node2.right, st, "Expression"); + }; + base.AssignmentExpression = base.AssignmentPattern = function(node2, st, c) { + c(node2.left, st, "Pattern"); + c(node2.right, st, "Expression"); + }; + base.ConditionalExpression = function(node2, st, c) { + c(node2.test, st, "Expression"); + c(node2.consequent, st, "Expression"); + c(node2.alternate, st, "Expression"); + }; + base.NewExpression = base.CallExpression = function(node2, st, c) { + c(node2.callee, st, "Expression"); + if (node2.arguments) { + for (var i = 0, list = node2.arguments; i < list.length; i += 1) { + var arg = list[i]; + c(arg, st, "Expression"); + } + } + }; + base.MemberExpression = function(node2, st, c) { + c(node2.object, st, "Expression"); + if (node2.computed) { + c(node2.property, st, "Expression"); + } + }; + base.ExportNamedDeclaration = base.ExportDefaultDeclaration = function(node2, st, c) { + if (node2.declaration) { + c(node2.declaration, st, node2.type === "ExportNamedDeclaration" || node2.declaration.id ? "Statement" : "Expression"); + } + if (node2.source) { + c(node2.source, st, "Expression"); + } + }; + base.ExportAllDeclaration = function(node2, st, c) { + if (node2.exported) { + c(node2.exported, st); + } + c(node2.source, st, "Expression"); + }; + base.ImportDeclaration = function(node2, st, c) { + for (var i = 0, list = node2.specifiers; i < list.length; i += 1) { + var spec = list[i]; + c(spec, st); + } + c(node2.source, st, "Expression"); + }; + base.ImportExpression = function(node2, st, c) { + c(node2.source, st, "Expression"); + }; + base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.PrivateIdentifier = base.Literal = ignore; + base.TaggedTemplateExpression = function(node2, st, c) { + c(node2.tag, st, "Expression"); + c(node2.quasi, st, "Expression"); + }; + base.ClassDeclaration = base.ClassExpression = function(node2, st, c) { + return c(node2, st, "Class"); + }; + base.Class = function(node2, st, c) { + if (node2.id) { + c(node2.id, st, "Pattern"); + } + if (node2.superClass) { + c(node2.superClass, st, "Expression"); + } + c(node2.body, st); + }; + base.ClassBody = function(node2, st, c) { + for (var i = 0, list = node2.body; i < list.length; i += 1) { + var elt = list[i]; + c(elt, st); + } + }; + base.MethodDefinition = base.PropertyDefinition = base.Property = function(node2, st, c) { + if (node2.computed) { + c(node2.key, st, "Expression"); + } + if (node2.value) { + c(node2.value, st, "Expression"); + } + }; + ({ isMatch: isMatch$1, scan } = micromatch_1); + ({ basename, dirname, relative, join } = posix$1); + debugHmr = createDebugger("vite:hmr"); + normalizedClientDir = normalizePath$3(CLIENT_DIR); + Stats = require$$0__default.Stats; + convertSourceMap = {}; + (function(exports2) { + Object.defineProperty(exports2, "commentRegex", { + get: function getCommentRegex() { + return /^\s*?\/[\/\*][@#]\s+?sourceMappingURL=data:(((?:application|text)\/json)(?:;charset=([^;,]+?)?)?)?(?:;(base64))?,(.*?)$/mg; + } + }); + Object.defineProperty(exports2, "mapFileCommentRegex", { + get: function getMapFileCommentRegex() { + return /(?:\/\/[@#][ \t]+?sourceMappingURL=([^\s'"`]+?)[ \t]*?$)|(?:\/\*[@#][ \t]+sourceMappingURL=([^*]+?)[ \t]*?(?:\*\/){1}[ \t]*?$)/mg; + } + }); + var decodeBase64; + if (typeof Buffer !== "undefined") { + if (typeof Buffer.from === "function") { + decodeBase64 = decodeBase64WithBufferFrom; + } else { + decodeBase64 = decodeBase64WithNewBuffer; + } + } else { + decodeBase64 = decodeBase64WithAtob; + } + function decodeBase64WithBufferFrom(base64) { + return Buffer.from(base64, "base64").toString(); + } + function decodeBase64WithNewBuffer(base64) { + if (typeof value === "number") { + throw new TypeError("The value to decode must not be of type number."); + } + return new Buffer(base64, "base64").toString(); + } + function decodeBase64WithAtob(base64) { + return decodeURIComponent(escape(atob(base64))); + } + function stripComment(sm) { + return sm.split(",").pop(); + } + function readFromFileMap(sm, read2) { + var r = exports2.mapFileCommentRegex.exec(sm); + var filename = r[1] || r[2]; + try { + var sm = read2(filename); + if (sm != null && typeof sm.catch === "function") { + return sm.catch(throwError); + } else { + return sm; + } + } catch (e) { + throwError(e); + } + function throwError(e) { + throw new Error("An error occurred while trying to read the map file at " + filename + "\n" + e.stack); + } + } + function Converter(sm, opts) { + opts = opts || {}; + if (opts.hasComment) { + sm = stripComment(sm); + } + if (opts.encoding === "base64") { + sm = decodeBase64(sm); + } else if (opts.encoding === "uri") { + sm = decodeURIComponent(sm); + } + if (opts.isJSON || opts.encoding) { + sm = JSON.parse(sm); + } + this.sourcemap = sm; + } + Converter.prototype.toJSON = function(space) { + return JSON.stringify(this.sourcemap, null, space); + }; + if (typeof Buffer !== "undefined") { + if (typeof Buffer.from === "function") { + Converter.prototype.toBase64 = encodeBase64WithBufferFrom; + } else { + Converter.prototype.toBase64 = encodeBase64WithNewBuffer; + } + } else { + Converter.prototype.toBase64 = encodeBase64WithBtoa; + } + function encodeBase64WithBufferFrom() { + var json = this.toJSON(); + return Buffer.from(json, "utf8").toString("base64"); + } + function encodeBase64WithNewBuffer() { + var json = this.toJSON(); + if (typeof json === "number") { + throw new TypeError("The json to encode must not be of type number."); + } + return new Buffer(json, "utf8").toString("base64"); + } + function encodeBase64WithBtoa() { + var json = this.toJSON(); + return btoa(unescape(encodeURIComponent(json))); + } + Converter.prototype.toURI = function() { + var json = this.toJSON(); + return encodeURIComponent(json); + }; + Converter.prototype.toComment = function(options2) { + var encoding, content, data2; + if (options2 != null && options2.encoding === "uri") { + encoding = ""; + content = this.toURI(); + } else { + encoding = ";base64"; + content = this.toBase64(); + } + data2 = "sourceMappingURL=data:application/json;charset=utf-8" + encoding + "," + content; + return options2 != null && options2.multiline ? "/*# " + data2 + " */" : "//# " + data2; + }; + Converter.prototype.toObject = function() { + return JSON.parse(this.toJSON()); + }; + Converter.prototype.addProperty = function(key, value2) { + if (this.sourcemap.hasOwnProperty(key)) + throw new Error('property "' + key + '" already exists on the sourcemap, use set property instead'); + return this.setProperty(key, value2); + }; + Converter.prototype.setProperty = function(key, value2) { + this.sourcemap[key] = value2; + return this; + }; + Converter.prototype.getProperty = function(key) { + return this.sourcemap[key]; + }; + exports2.fromObject = function(obj) { + return new Converter(obj); + }; + exports2.fromJSON = function(json) { + return new Converter(json, { isJSON: true }); + }; + exports2.fromURI = function(uri) { + return new Converter(uri, { encoding: "uri" }); + }; + exports2.fromBase64 = function(base64) { + return new Converter(base64, { encoding: "base64" }); + }; + exports2.fromComment = function(comment) { + var m, encoding; + comment = comment.replace(/^\/\*/g, "//").replace(/\*\/$/g, ""); + m = exports2.commentRegex.exec(comment); + encoding = m && m[4] || "uri"; + return new Converter(comment, { encoding, hasComment: true }); + }; + function makeConverter(sm) { + return new Converter(sm, { isJSON: true }); + } + exports2.fromMapFileComment = function(comment, read2) { + if (typeof read2 === "string") { + throw new Error( + "String directory paths are no longer supported with `fromMapFileComment`\nPlease review the Upgrading documentation at https://github.com/thlorenz/convert-source-map#upgrading" + ); + } + var sm = readFromFileMap(comment, read2); + if (sm != null && typeof sm.then === "function") { + return sm.then(makeConverter); + } else { + return makeConverter(sm); + } + }; + exports2.fromSource = function(content) { + var m = content.match(exports2.commentRegex); + return m ? exports2.fromComment(m.pop()) : null; + }; + exports2.fromMapFileSource = function(content, read2) { + if (typeof read2 === "string") { + throw new Error( + "String directory paths are no longer supported with `fromMapFileSource`\nPlease review the Upgrading documentation at https://github.com/thlorenz/convert-source-map#upgrading" + ); + } + var m = content.match(exports2.mapFileCommentRegex); + return m ? exports2.fromMapFileComment(m.pop(), read2) : null; + }; + exports2.removeComments = function(src2) { + return src2.replace(exports2.commentRegex, ""); + }; + exports2.removeMapFileComments = function(src2) { + return src2.replace(exports2.mapFileCommentRegex, ""); + }; + exports2.generateMapFileComment = function(file, options2) { + var data2 = "sourceMappingURL=" + file; + return options2 && options2.multiline ? "/*# " + data2 + " */" : "//# " + data2; + }; + })(convertSourceMap); + debugLoad = createDebugger("vite:load"); + debugTransform = createDebugger("vite:transform"); + debugCache$1 = createDebugger("vite:cache"); + isDebug$2 = !!process.env.DEBUG; + isDebug$1 = !!process.env.DEBUG; + debug$9 = createDebugger("vite:import-analysis"); + clientDir = normalizePath$3(CLIENT_DIR); + normalizedClientEntry = normalizePath$3(CLIENT_ENTRY); + normalizedEnvEntry = normalizePath$3(ENV_ENTRY); + wasmHelper = async (opts = {}, url2) => { + let result; + if (url2.startsWith("data:")) { + const urlContent = url2.replace(/^data:.*?base64,/, ""); + let bytes; + if (typeof Buffer === "function" && typeof Buffer.from === "function") { + bytes = Buffer.from(urlContent, "base64"); + } else if (typeof atob === "function") { + const binaryString = atob(urlContent); + bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + } else { + throw new Error("Failed to decode base64-encoded data URL, Buffer and atob are not supported"); + } + result = await WebAssembly.instantiate(bytes, opts); + } else { + const response = await fetch(url2); + const contentType = response.headers.get("Content-Type") || ""; + if ("instantiateStreaming" in WebAssembly && contentType.startsWith("application/wasm")) { + result = await WebAssembly.instantiateStreaming(response, opts); + } else { + const buffer = await response.arrayBuffer(); + result = await WebAssembly.instantiate(buffer, opts); + } + } + return result.instance; + }; + wasmHelperCode = wasmHelper.toString(); + debug$8 = createDebugger("vite:deps"); + isDebugEnabled$1 = _debug("vite:deps").enabled; + debuggerViteDeps = createDebugger("vite:deps"); + isDebugEnabled = _debug("vite:deps").enabled; + MAX_TEMP_DIR_AGE_MS = 24 * 60 * 60 * 1e3; + preloadMarker = `__VITE_PRELOAD__`; + preloadMarkerWithQuote = `"${preloadMarker}"`; + srcExports = {}; + src = { + get exports() { + return srcExports; + }, + set exports(v) { + srcExports = v; + } + }; + browserExports = {}; + browser = { + get exports() { + return browserExports; + }, + set exports(v) { + browserExports = v; + } + }; + debugExports = {}; + debug$6 = { + get exports() { + return debugExports; + }, + set exports(v) { + debugExports = v; + } + }; + nodeExports = {}; + node = { + get exports() { + return nodeExports; + }, + set exports(v) { + nodeExports = v; + } + }; + (function(module) { + if (typeof process !== "undefined" && process.type === "renderer") { + module.exports = requireBrowser(); + } else { + module.exports = requireNode(); + } + })(src); + encodeurl = encodeUrl$1; + ENCODE_CHARS_REGEXP = /(?:[^\x21\x25\x26-\x3B\x3D\x3F-\x5B\x5D\x5F\x61-\x7A\x7E]|%(?:[^0-9A-Fa-f]|[0-9A-Fa-f][^0-9A-Fa-f]|$))+/g; + UNMATCHED_SURROGATE_PAIR_REGEXP = /(^|[^\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF]([^\uDC00-\uDFFF]|$)/g; + UNMATCHED_SURROGATE_PAIR_REPLACE = "$1\uFFFD$2"; + matchHtmlRegExp = /["'&<>]/; + escapeHtml_1 = escapeHtml$1; + onFinishedExports = {}; + onFinished$2 = { + get exports() { + return onFinishedExports; + }, + set exports(v) { + onFinishedExports = v; + } + }; + eeFirst = first$1; + onFinished$2.exports = onFinished$1; + onFinishedExports.isFinished = isFinished$1; + first = eeFirst; + defer$2 = typeof setImmediate === "function" ? setImmediate : function(fn) { + process.nextTick(fn.bind.apply(fn, arguments)); + }; + parseurlExports = {}; + parseurl$1 = { + get exports() { + return parseurlExports; + }, + set exports(v) { + parseurlExports = v; + } + }; + url$3 = require$$0$9; + parse$7 = url$3.parse; + Url = url$3.Url; + parseurl$1.exports = parseurl; + parseurlExports.original = originalurl; + require$$0$1 = { + "100": "Continue", + "101": "Switching Protocols", + "102": "Processing", + "103": "Early Hints", + "200": "OK", + "201": "Created", + "202": "Accepted", + "203": "Non-Authoritative Information", + "204": "No Content", + "205": "Reset Content", + "206": "Partial Content", + "207": "Multi-Status", + "208": "Already Reported", + "226": "IM Used", + "300": "Multiple Choices", + "301": "Moved Permanently", + "302": "Found", + "303": "See Other", + "304": "Not Modified", + "305": "Use Proxy", + "306": "(Unused)", + "307": "Temporary Redirect", + "308": "Permanent Redirect", + "400": "Bad Request", + "401": "Unauthorized", + "402": "Payment Required", + "403": "Forbidden", + "404": "Not Found", + "405": "Method Not Allowed", + "406": "Not Acceptable", + "407": "Proxy Authentication Required", + "408": "Request Timeout", + "409": "Conflict", + "410": "Gone", + "411": "Length Required", + "412": "Precondition Failed", + "413": "Payload Too Large", + "414": "URI Too Long", + "415": "Unsupported Media Type", + "416": "Range Not Satisfiable", + "417": "Expectation Failed", + "418": "I'm a teapot", + "421": "Misdirected Request", + "422": "Unprocessable Entity", + "423": "Locked", + "424": "Failed Dependency", + "425": "Unordered Collection", + "426": "Upgrade Required", + "428": "Precondition Required", + "429": "Too Many Requests", + "431": "Request Header Fields Too Large", + "451": "Unavailable For Legal Reasons", + "500": "Internal Server Error", + "501": "Not Implemented", + "502": "Bad Gateway", + "503": "Service Unavailable", + "504": "Gateway Timeout", + "505": "HTTP Version Not Supported", + "506": "Variant Also Negotiates", + "507": "Insufficient Storage", + "508": "Loop Detected", + "509": "Bandwidth Limit Exceeded", + "510": "Not Extended", + "511": "Network Authentication Required" + }; + codes = require$$0$1; + statuses$1 = status; + status.STATUS_CODES = codes; + status.codes = populateStatusesMap(status, codes); + status.redirect = { + 300: true, + 301: true, + 302: true, + 303: true, + 305: true, + 307: true, + 308: true + }; + status.empty = { + 204: true, + 205: true, + 304: true + }; + status.retry = { + 502: true, + 503: true, + 504: true + }; + unpipe_1 = unpipe$1; + debug$5 = srcExports("finalhandler"); + encodeUrl = encodeurl; + escapeHtml = escapeHtml_1; + onFinished = onFinishedExports; + parseUrl$1 = parseurlExports; + statuses = statuses$1; + unpipe = unpipe_1; + DOUBLE_SPACE_REGEXP = /\x20{2}/g; + NEWLINE_REGEXP = /\n/g; + defer$1 = typeof setImmediate === "function" ? setImmediate : function(fn) { + process.nextTick(fn.bind.apply(fn, arguments)); + }; + isFinished = onFinished.isFinished; + finalhandler_1 = finalhandler$1; + utilsMergeExports = {}; + utilsMerge = { + get exports() { + return utilsMergeExports; + }, + set exports(v) { + utilsMergeExports = v; + } + }; + (function(module, exports2) { + module.exports = function(a, b) { + if (a && b) { + for (var key in b) { + a[key] = b[key]; + } + } + return a; + }; + })(utilsMerge); + debug$4 = srcExports("connect:dispatcher"); + EventEmitter$3 = require$$0$5.EventEmitter; + finalhandler = finalhandler_1; + http$4 = require$$1$1; + parseUrl = parseurlExports; + env = process.env.NODE_ENV || "development"; + proto = {}; + defer = typeof setImmediate === "function" ? setImmediate : function(fn) { + process.nextTick(fn.bind.apply(fn, arguments)); + }; + proto.use = function use(route, fn) { + var handle2 = fn; + var path3 = route; + if (typeof route !== "string") { + handle2 = route; + path3 = "/"; + } + if (typeof handle2.handle === "function") { + var server = handle2; + server.route = path3; + handle2 = function(req2, res, next) { + server.handle(req2, res, next); + }; + } + if (handle2 instanceof http$4.Server) { + handle2 = handle2.listeners("request")[0]; + } + if (path3[path3.length - 1] === "/") { + path3 = path3.slice(0, -1); + } + debug$4("use %s %s", path3 || "/", handle2.name || "anonymous"); + this.stack.push({ route: path3, handle: handle2 }); + return this; + }; + proto.handle = function handle(req2, res, out) { + var index = 0; + var protohost = getProtohost(req2.url) || ""; + var removed = ""; + var slashAdded = false; + var stack = this.stack; + var done = out || finalhandler(req2, res, { + env, + onerror: logerror + }); + req2.originalUrl = req2.originalUrl || req2.url; + function next(err) { + if (slashAdded) { + req2.url = req2.url.substr(1); + slashAdded = false; + } + if (removed.length !== 0) { + req2.url = protohost + removed + req2.url.substr(protohost.length); + removed = ""; + } + var layer = stack[index++]; + if (!layer) { + defer(done, err); + return; + } + var path3 = parseUrl(req2).pathname || "/"; + var route = layer.route; + if (path3.toLowerCase().substr(0, route.length) !== route.toLowerCase()) { + return next(err); + } + var c = path3.length > route.length && path3[route.length]; + if (c && c !== "/" && c !== ".") { + return next(err); + } + if (route.length !== 0 && route !== "/") { + removed = route; + req2.url = protohost + req2.url.substr(protohost.length + removed.length); + if (!protohost && req2.url[0] !== "/") { + req2.url = "/" + req2.url; + slashAdded = true; + } + } + call(layer.handle, route, err, req2, res, next); + } + next(); + }; + proto.listen = function listen() { + var server = http$4.createServer(this); + return server.listen.apply(server, arguments); + }; + libExports$1 = {}; + lib$1 = { + get exports() { + return libExports$1; + }, + set exports(v) { + libExports$1 = v; + } + }; + getOwnPropertySymbols = Object.getOwnPropertySymbols; + hasOwnProperty = Object.prototype.hasOwnProperty; + propIsEnumerable = Object.prototype.propertyIsEnumerable; + objectAssign = shouldUseNative() ? Object.assign : function(target, source) { + var from; + var to = toObject(target); + var symbols; + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + return to; + }; + varyExports = {}; + vary$1 = { + get exports() { + return varyExports; + }, + set exports(v) { + varyExports = v; + } + }; + vary$1.exports = vary; + varyExports.append = append; + FIELD_NAME_REGEXP = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/; + (function() { + var assign = objectAssign; + var vary2 = varyExports; + var defaults = { + origin: "*", + methods: "GET,HEAD,PUT,PATCH,POST,DELETE", + preflightContinue: false, + optionsSuccessStatus: 204 + }; + function isString2(s) { + return typeof s === "string" || s instanceof String; + } + function isOriginAllowed(origin, allowedOrigin) { + if (Array.isArray(allowedOrigin)) { + for (var i = 0; i < allowedOrigin.length; ++i) { + if (isOriginAllowed(origin, allowedOrigin[i])) { + return true; + } + } + return false; + } else if (isString2(allowedOrigin)) { + return origin === allowedOrigin; + } else if (allowedOrigin instanceof RegExp) { + return allowedOrigin.test(origin); + } else { + return !!allowedOrigin; + } + } + function configureOrigin(options2, req2) { + var requestOrigin = req2.headers.origin, headers = [], isAllowed; + if (!options2.origin || options2.origin === "*") { + headers.push([{ + key: "Access-Control-Allow-Origin", + value: "*" + }]); + } else if (isString2(options2.origin)) { + headers.push([{ + key: "Access-Control-Allow-Origin", + value: options2.origin + }]); + headers.push([{ + key: "Vary", + value: "Origin" + }]); + } else { + isAllowed = isOriginAllowed(requestOrigin, options2.origin); + headers.push([{ + key: "Access-Control-Allow-Origin", + value: isAllowed ? requestOrigin : false + }]); + headers.push([{ + key: "Vary", + value: "Origin" + }]); + } + return headers; + } + function configureMethods(options2) { + var methods = options2.methods; + if (methods.join) { + methods = options2.methods.join(","); + } + return { + key: "Access-Control-Allow-Methods", + value: methods + }; + } + function configureCredentials(options2) { + if (options2.credentials === true) { + return { + key: "Access-Control-Allow-Credentials", + value: "true" + }; + } + return null; + } + function configureAllowedHeaders(options2, req2) { + var allowedHeaders = options2.allowedHeaders || options2.headers; + var headers = []; + if (!allowedHeaders) { + allowedHeaders = req2.headers["access-control-request-headers"]; + headers.push([{ + key: "Vary", + value: "Access-Control-Request-Headers" + }]); + } else if (allowedHeaders.join) { + allowedHeaders = allowedHeaders.join(","); + } + if (allowedHeaders && allowedHeaders.length) { + headers.push([{ + key: "Access-Control-Allow-Headers", + value: allowedHeaders + }]); + } + return headers; + } + function configureExposedHeaders(options2) { + var headers = options2.exposedHeaders; + if (!headers) { + return null; + } else if (headers.join) { + headers = headers.join(","); + } + if (headers && headers.length) { + return { + key: "Access-Control-Expose-Headers", + value: headers + }; + } + return null; + } + function configureMaxAge(options2) { + var maxAge = (typeof options2.maxAge === "number" || options2.maxAge) && options2.maxAge.toString(); + if (maxAge && maxAge.length) { + return { + key: "Access-Control-Max-Age", + value: maxAge + }; + } + return null; + } + function applyHeaders(headers, res) { + for (var i = 0, n = headers.length; i < n; i++) { + var header = headers[i]; + if (header) { + if (Array.isArray(header)) { + applyHeaders(header, res); + } else if (header.key === "Vary" && header.value) { + vary2(res, header.value); + } else if (header.value) { + res.setHeader(header.key, header.value); + } + } + } + } + function cors(options2, req2, res, next) { + var headers = [], method = req2.method && req2.method.toUpperCase && req2.method.toUpperCase(); + if (method === "OPTIONS") { + headers.push(configureOrigin(options2, req2)); + headers.push(configureCredentials(options2)); + headers.push(configureMethods(options2)); + headers.push(configureAllowedHeaders(options2, req2)); + headers.push(configureMaxAge(options2)); + headers.push(configureExposedHeaders(options2)); + applyHeaders(headers, res); + if (options2.preflightContinue) { + next(); + } else { + res.statusCode = options2.optionsSuccessStatus; + res.setHeader("Content-Length", "0"); + res.end(); + } + } else { + headers.push(configureOrigin(options2, req2)); + headers.push(configureCredentials(options2)); + headers.push(configureExposedHeaders(options2)); + applyHeaders(headers, res); + next(); + } + } + function middlewareWrapper(o) { + var optionsCallback = null; + if (typeof o === "function") { + optionsCallback = o; + } else { + optionsCallback = function(req2, cb) { + cb(null, o); + }; + } + return function corsMiddleware(req2, res, next) { + optionsCallback(req2, function(err, options2) { + if (err) { + next(err); + } else { + var corsOptions = assign({}, defaults, options2); + var originCallback = null; + if (corsOptions.origin && typeof corsOptions.origin === "function") { + originCallback = corsOptions.origin; + } else if (corsOptions.origin) { + originCallback = function(origin, cb) { + cb(null, corsOptions.origin); + }; + } + if (originCallback) { + originCallback(req2.headers.origin, function(err2, origin) { + if (err2 || !origin) { + next(err2); + } else { + corsOptions.origin = origin; + cors(corsOptions, req2, res, next); + } + }); + } else { + next(); + } + } + }); + }; + } + lib$1.exports = middlewareWrapper; + })(); + chokidar = {}; + fs$8 = require$$0__default; + ({ Readable } = require$$0$7); + sysPath$3 = require$$0$4; + ({ promisify: promisify$3 } = require$$0$6); + picomatch$1 = picomatchExports; + readdir$1 = promisify$3(fs$8.readdir); + stat$3 = promisify$3(fs$8.stat); + lstat$2 = promisify$3(fs$8.lstat); + realpath$1 = promisify$3(fs$8.realpath); + BANG$2 = "!"; + RECURSIVE_ERROR_CODE = "READDIRP_RECURSIVE_ERROR"; + NORMAL_FLOW_ERRORS = /* @__PURE__ */ new Set(["ENOENT", "EPERM", "EACCES", "ELOOP", RECURSIVE_ERROR_CODE]); + FILE_TYPE = "files"; + DIR_TYPE = "directories"; + FILE_DIR_TYPE = "files_directories"; + EVERYTHING_TYPE = "all"; + ALL_TYPES = [FILE_TYPE, DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE]; + isNormalFlowError = (error2) => NORMAL_FLOW_ERRORS.has(error2.code); + [maj, min] = process.versions.node.split(".").slice(0, 2).map((n) => Number.parseInt(n, 10)); + wantBigintFsStats = process.platform === "win32" && (maj > 10 || maj === 10 && min >= 5); + normalizeFilter = (filter2) => { + if (filter2 === void 0) + return; + if (typeof filter2 === "function") + return filter2; + if (typeof filter2 === "string") { + const glob = picomatch$1(filter2.trim()); + return (entry2) => glob(entry2.basename); + } + if (Array.isArray(filter2)) { + const positive = []; + const negative = []; + for (const item of filter2) { + const trimmed = item.trim(); + if (trimmed.charAt(0) === BANG$2) { + negative.push(picomatch$1(trimmed.slice(1))); + } else { + positive.push(picomatch$1(trimmed)); + } + } + if (negative.length > 0) { + if (positive.length > 0) { + return (entry2) => positive.some((f) => f(entry2.basename)) && !negative.some((f) => f(entry2.basename)); + } + return (entry2) => !negative.some((f) => f(entry2.basename)); + } + return (entry2) => positive.some((f) => f(entry2.basename)); + } + }; + ReaddirpStream = class extends Readable { + static get defaultOptions() { + return { + root: ".", + /* eslint-disable no-unused-vars */ + fileFilter: (path3) => true, + directoryFilter: (path3) => true, + /* eslint-enable no-unused-vars */ + type: FILE_TYPE, + lstat: false, + depth: 2147483648, + alwaysStat: false + }; + } + constructor(options2 = {}) { + super({ + objectMode: true, + autoDestroy: true, + highWaterMark: options2.highWaterMark || 4096 + }); + const opts = { ...ReaddirpStream.defaultOptions, ...options2 }; + const { root, type } = opts; + this._fileFilter = normalizeFilter(opts.fileFilter); + this._directoryFilter = normalizeFilter(opts.directoryFilter); + const statMethod = opts.lstat ? lstat$2 : stat$3; + if (wantBigintFsStats) { + this._stat = (path3) => statMethod(path3, { bigint: true }); + } else { + this._stat = statMethod; + } + this._maxDepth = opts.depth; + this._wantsDir = [DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); + this._wantsFile = [FILE_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); + this._wantsEverything = type === EVERYTHING_TYPE; + this._root = sysPath$3.resolve(root); + this._isDirent = "Dirent" in fs$8 && !opts.alwaysStat; + this._statsProp = this._isDirent ? "dirent" : "stats"; + this._rdOptions = { encoding: "utf8", withFileTypes: this._isDirent }; + this.parents = [this._exploreDir(root, 1)]; + this.reading = false; + this.parent = void 0; + } + async _read(batch) { + if (this.reading) + return; + this.reading = true; + try { + while (!this.destroyed && batch > 0) { + const { path: path3, depth: depth2, files = [] } = this.parent || {}; + if (files.length > 0) { + const slice2 = files.splice(0, batch).map((dirent) => this._formatEntry(dirent, path3)); + for (const entry2 of await Promise.all(slice2)) { + if (this.destroyed) + return; + const entryType = await this._getEntryType(entry2); + if (entryType === "directory" && this._directoryFilter(entry2)) { + if (depth2 <= this._maxDepth) { + this.parents.push(this._exploreDir(entry2.fullPath, depth2 + 1)); + } + if (this._wantsDir) { + this.push(entry2); + batch--; + } + } else if ((entryType === "file" || this._includeAsFile(entry2)) && this._fileFilter(entry2)) { + if (this._wantsFile) { + this.push(entry2); + batch--; + } + } + } + } else { + const parent = this.parents.pop(); + if (!parent) { + this.push(null); + break; + } + this.parent = await parent; + if (this.destroyed) + return; + } + } + } catch (error2) { + this.destroy(error2); + } finally { + this.reading = false; + } + } + async _exploreDir(path3, depth2) { + let files; + try { + files = await readdir$1(path3, this._rdOptions); + } catch (error2) { + this._onError(error2); + } + return { files, depth: depth2, path: path3 }; + } + async _formatEntry(dirent, path3) { + let entry2; + try { + const basename2 = this._isDirent ? dirent.name : dirent; + const fullPath = sysPath$3.resolve(sysPath$3.join(path3, basename2)); + entry2 = { path: sysPath$3.relative(this._root, fullPath), fullPath, basename: basename2 }; + entry2[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath); + } catch (err) { + this._onError(err); + } + return entry2; + } + _onError(err) { + if (isNormalFlowError(err) && !this.destroyed) { + this.emit("warn", err); + } else { + this.destroy(err); + } + } + async _getEntryType(entry2) { + const stats = entry2 && entry2[this._statsProp]; + if (!stats) { + return; + } + if (stats.isFile()) { + return "file"; + } + if (stats.isDirectory()) { + return "directory"; + } + if (stats && stats.isSymbolicLink()) { + const full = entry2.fullPath; + try { + const entryRealPath = await realpath$1(full); + const entryRealPathStats = await lstat$2(entryRealPath); + if (entryRealPathStats.isFile()) { + return "file"; + } + if (entryRealPathStats.isDirectory()) { + const len = entryRealPath.length; + if (full.startsWith(entryRealPath) && full.substr(len, 1) === sysPath$3.sep) { + const recursiveError = new Error( + `Circular symlink detected: "${full}" points to "${entryRealPath}"` + ); + recursiveError.code = RECURSIVE_ERROR_CODE; + return this._onError(recursiveError); + } + return "directory"; + } + } catch (error2) { + this._onError(error2); + } + } + } + _includeAsFile(entry2) { + const stats = entry2 && entry2[this._statsProp]; + return stats && this._wantsEverything && !stats.isDirectory(); + } + }; + readdirp$1 = (root, options2 = {}) => { + let type = options2.entryType || options2.type; + if (type === "both") + type = FILE_DIR_TYPE; + if (type) + options2.type = type; + if (!root) { + throw new Error("readdirp: root argument is required. Usage: readdirp(root, options)"); + } else if (typeof root !== "string") { + throw new TypeError("readdirp: root argument must be a string. Usage: readdirp(root, options)"); + } else if (type && !ALL_TYPES.includes(type)) { + throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(", ")}`); + } + options2.root = root; + return new ReaddirpStream(options2); + }; + readdirpPromise = (root, options2 = {}) => { + return new Promise((resolve3, reject) => { + const files = []; + readdirp$1(root, options2).on("data", (entry2) => files.push(entry2)).on("end", () => resolve3(files)).on("error", (error2) => reject(error2)); + }); + }; + readdirp$1.promise = readdirpPromise; + readdirp$1.ReaddirpStream = ReaddirpStream; + readdirp$1.default = readdirp$1; + readdirp_1 = readdirp$1; + anymatchExports = {}; + anymatch$2 = { + get exports() { + return anymatchExports; + }, + set exports(v) { + anymatchExports = v; + } + }; + normalizePath$2 = function(path3, stripTrailing) { + if (typeof path3 !== "string") { + throw new TypeError("expected path to be a string"); + } + if (path3 === "\\" || path3 === "/") + return "/"; + var len = path3.length; + if (len <= 1) + return path3; + var prefix = ""; + if (len > 4 && path3[3] === "\\") { + var ch = path3[2]; + if ((ch === "?" || ch === ".") && path3.slice(0, 2) === "\\\\") { + path3 = path3.slice(2); + prefix = "//"; + } + } + var segs = path3.split(/[/\\]+/); + if (stripTrailing !== false && segs[segs.length - 1] === "") { + segs.pop(); + } + return prefix + segs.join("/"); + }; + Object.defineProperty(anymatchExports, "__esModule", { value: true }); + picomatch = picomatchExports; + normalizePath$1 = normalizePath$2; + BANG$1 = "!"; + DEFAULT_OPTIONS = { returnIndex: false }; + arrify$1 = (item) => Array.isArray(item) ? item : [item]; + createPattern = (matcher2, options2) => { + if (typeof matcher2 === "function") { + return matcher2; + } + if (typeof matcher2 === "string") { + const glob = picomatch(matcher2, options2); + return (string2) => matcher2 === string2 || glob(string2); + } + if (matcher2 instanceof RegExp) { + return (string2) => matcher2.test(string2); + } + return (string2) => false; + }; + matchPatterns = (patterns2, negPatterns, args, returnIndex) => { + const isList = Array.isArray(args); + const _path = isList ? args[0] : args; + if (!isList && typeof _path !== "string") { + throw new TypeError("anymatch: second argument must be a string: got " + Object.prototype.toString.call(_path)); + } + const path3 = normalizePath$1(_path); + for (let index = 0; index < negPatterns.length; index++) { + const nglob = negPatterns[index]; + if (nglob(path3)) { + return returnIndex ? -1 : false; + } + } + const applied = isList && [path3].concat(args.slice(1)); + for (let index = 0; index < patterns2.length; index++) { + const pattern2 = patterns2[index]; + if (isList ? pattern2(...applied) : pattern2(path3)) { + return returnIndex ? index : true; + } + } + return returnIndex ? -1 : false; + }; + anymatch$1 = (matchers, testString, options2 = DEFAULT_OPTIONS) => { + if (matchers == null) { + throw new TypeError("anymatch: specify first argument"); + } + const opts = typeof options2 === "boolean" ? { returnIndex: options2 } : options2; + const returnIndex = opts.returnIndex || false; + const mtchers = arrify$1(matchers); + const negatedGlobs = mtchers.filter((item) => typeof item === "string" && item.charAt(0) === BANG$1).map((item) => item.slice(1)).map((item) => picomatch(item, opts)); + const patterns2 = mtchers.filter((item) => typeof item !== "string" || typeof item === "string" && item.charAt(0) !== BANG$1).map((matcher2) => createPattern(matcher2, opts)); + if (testString == null) { + return (testString2, ri = false) => { + const returnIndex2 = typeof ri === "boolean" ? ri : false; + return matchPatterns(patterns2, negatedGlobs, testString2, returnIndex2); + }; + } + return matchPatterns(patterns2, negatedGlobs, testString, returnIndex); + }; + anymatch$1.default = anymatch$1; + anymatch$2.exports = anymatch$1; + binaryExtensionsExports = {}; + binaryExtensions$1 = { + get exports() { + return binaryExtensionsExports; + }, + set exports(v) { + binaryExtensionsExports = v; + } + }; + require$$0 = [ + "3dm", + "3ds", + "3g2", + "3gp", + "7z", + "a", + "aac", + "adp", + "ai", + "aif", + "aiff", + "alz", + "ape", + "apk", + "appimage", + "ar", + "arj", + "asf", + "au", + "avi", + "bak", + "baml", + "bh", + "bin", + "bk", + "bmp", + "btif", + "bz2", + "bzip2", + "cab", + "caf", + "cgm", + "class", + "cmx", + "cpio", + "cr2", + "cur", + "dat", + "dcm", + "deb", + "dex", + "djvu", + "dll", + "dmg", + "dng", + "doc", + "docm", + "docx", + "dot", + "dotm", + "dra", + "DS_Store", + "dsk", + "dts", + "dtshd", + "dvb", + "dwg", + "dxf", + "ecelp4800", + "ecelp7470", + "ecelp9600", + "egg", + "eol", + "eot", + "epub", + "exe", + "f4v", + "fbs", + "fh", + "fla", + "flac", + "flatpak", + "fli", + "flv", + "fpx", + "fst", + "fvt", + "g3", + "gh", + "gif", + "graffle", + "gz", + "gzip", + "h261", + "h263", + "h264", + "icns", + "ico", + "ief", + "img", + "ipa", + "iso", + "jar", + "jpeg", + "jpg", + "jpgv", + "jpm", + "jxr", + "key", + "ktx", + "lha", + "lib", + "lvp", + "lz", + "lzh", + "lzma", + "lzo", + "m3u", + "m4a", + "m4v", + "mar", + "mdi", + "mht", + "mid", + "midi", + "mj2", + "mka", + "mkv", + "mmr", + "mng", + "mobi", + "mov", + "movie", + "mp3", + "mp4", + "mp4a", + "mpeg", + "mpg", + "mpga", + "mxu", + "nef", + "npx", + "numbers", + "nupkg", + "o", + "odp", + "ods", + "odt", + "oga", + "ogg", + "ogv", + "otf", + "ott", + "pages", + "pbm", + "pcx", + "pdb", + "pdf", + "pea", + "pgm", + "pic", + "png", + "pnm", + "pot", + "potm", + "potx", + "ppa", + "ppam", + "ppm", + "pps", + "ppsm", + "ppsx", + "ppt", + "pptm", + "pptx", + "psd", + "pya", + "pyc", + "pyo", + "pyv", + "qt", + "rar", + "ras", + "raw", + "resources", + "rgb", + "rip", + "rlc", + "rmf", + "rmvb", + "rpm", + "rtf", + "rz", + "s3m", + "s7z", + "scpt", + "sgi", + "shar", + "snap", + "sil", + "sketch", + "slk", + "smv", + "snk", + "so", + "stl", + "suo", + "sub", + "swf", + "tar", + "tbz", + "tbz2", + "tga", + "tgz", + "thmx", + "tif", + "tiff", + "tlz", + "ttc", + "ttf", + "txz", + "udf", + "uvh", + "uvi", + "uvm", + "uvp", + "uvs", + "uvu", + "viv", + "vob", + "war", + "wav", + "wax", + "wbmp", + "wdp", + "weba", + "webm", + "webp", + "whl", + "wim", + "wm", + "wma", + "wmv", + "wmx", + "woff", + "woff2", + "wrm", + "wvx", + "xbm", + "xif", + "xla", + "xlam", + "xls", + "xlsb", + "xlsm", + "xlsx", + "xlt", + "xltm", + "xltx", + "xm", + "xmind", + "xpi", + "xpm", + "xwd", + "xz", + "z", + "zip", + "zipx" + ]; + (function(module) { + module.exports = require$$0; + })(binaryExtensions$1); + path$8 = require$$0$4; + binaryExtensions = binaryExtensionsExports; + extensions = new Set(binaryExtensions); + isBinaryPath$1 = (filePath) => extensions.has(path$8.extname(filePath).slice(1).toLowerCase()); + constants$1 = {}; + (function(exports2) { + const { sep: sep2 } = require$$0$4; + const { platform: platform2 } = process; + const os2 = require$$2; + exports2.EV_ALL = "all"; + exports2.EV_READY = "ready"; + exports2.EV_ADD = "add"; + exports2.EV_CHANGE = "change"; + exports2.EV_ADD_DIR = "addDir"; + exports2.EV_UNLINK = "unlink"; + exports2.EV_UNLINK_DIR = "unlinkDir"; + exports2.EV_RAW = "raw"; + exports2.EV_ERROR = "error"; + exports2.STR_DATA = "data"; + exports2.STR_END = "end"; + exports2.STR_CLOSE = "close"; + exports2.FSEVENT_CREATED = "created"; + exports2.FSEVENT_MODIFIED = "modified"; + exports2.FSEVENT_DELETED = "deleted"; + exports2.FSEVENT_MOVED = "moved"; + exports2.FSEVENT_CLONED = "cloned"; + exports2.FSEVENT_UNKNOWN = "unknown"; + exports2.FSEVENT_TYPE_FILE = "file"; + exports2.FSEVENT_TYPE_DIRECTORY = "directory"; + exports2.FSEVENT_TYPE_SYMLINK = "symlink"; + exports2.KEY_LISTENERS = "listeners"; + exports2.KEY_ERR = "errHandlers"; + exports2.KEY_RAW = "rawEmitters"; + exports2.HANDLER_KEYS = [exports2.KEY_LISTENERS, exports2.KEY_ERR, exports2.KEY_RAW]; + exports2.DOT_SLASH = `.${sep2}`; + exports2.BACK_SLASH_RE = /\\/g; + exports2.DOUBLE_SLASH_RE = /\/\//; + exports2.SLASH_OR_BACK_SLASH_RE = /[/\\]/; + exports2.DOT_RE = /\..*\.(sw[px])$|~$|\.subl.*\.tmp/; + exports2.REPLACER_RE = /^\.[/\\]/; + exports2.SLASH = "/"; + exports2.SLASH_SLASH = "//"; + exports2.BRACE_START = "{"; + exports2.BANG = "!"; + exports2.ONE_DOT = "."; + exports2.TWO_DOTS = ".."; + exports2.STAR = "*"; + exports2.GLOBSTAR = "**"; + exports2.ROOT_GLOBSTAR = "/**/*"; + exports2.SLASH_GLOBSTAR = "/**"; + exports2.DIR_SUFFIX = "Dir"; + exports2.ANYMATCH_OPTS = { dot: true }; + exports2.STRING_TYPE = "string"; + exports2.FUNCTION_TYPE = "function"; + exports2.EMPTY_STR = ""; + exports2.EMPTY_FN = () => { + }; + exports2.IDENTITY_FN = (val) => val; + exports2.isWindows = platform2 === "win32"; + exports2.isMacos = platform2 === "darwin"; + exports2.isLinux = platform2 === "linux"; + exports2.isIBMi = os2.type() === "OS400"; + })(constants$1); + fs$7 = require$$0__default; + sysPath$2 = require$$0$4; + ({ promisify: promisify$2 } = require$$0$6); + isBinaryPath = isBinaryPath$1; + ({ + isWindows: isWindows$2, + isLinux, + EMPTY_FN: EMPTY_FN$2, + EMPTY_STR: EMPTY_STR$1, + KEY_LISTENERS, + KEY_ERR, + KEY_RAW, + HANDLER_KEYS, + EV_CHANGE: EV_CHANGE$2, + EV_ADD: EV_ADD$2, + EV_ADD_DIR: EV_ADD_DIR$2, + EV_ERROR: EV_ERROR$2, + STR_DATA: STR_DATA$1, + STR_END: STR_END$2, + BRACE_START: BRACE_START$1, + STAR + } = constants$1); + THROTTLE_MODE_WATCH = "watch"; + open$1 = promisify$2(fs$7.open); + stat$2 = promisify$2(fs$7.stat); + lstat$1 = promisify$2(fs$7.lstat); + close = promisify$2(fs$7.close); + fsrealpath = promisify$2(fs$7.realpath); + statMethods$1 = { lstat: lstat$1, stat: stat$2 }; + foreach = (val, fn) => { + if (val instanceof Set) { + val.forEach(fn); + } else { + fn(val); + } + }; + addAndConvert = (main2, prop, item) => { + let container = main2[prop]; + if (!(container instanceof Set)) { + main2[prop] = container = /* @__PURE__ */ new Set([container]); + } + container.add(item); + }; + clearItem = (cont) => (key) => { + const set2 = cont[key]; + if (set2 instanceof Set) { + set2.clear(); + } else { + delete cont[key]; + } + }; + delFromSet = (main2, prop, item) => { + const container = main2[prop]; + if (container instanceof Set) { + container.delete(item); + } else if (container === item) { + delete main2[prop]; + } + }; + isEmptySet = (val) => val instanceof Set ? val.size === 0 : !val; + FsWatchInstances = /* @__PURE__ */ new Map(); + fsWatchBroadcast = (fullPath, type, val1, val2, val3) => { + const cont = FsWatchInstances.get(fullPath); + if (!cont) + return; + foreach(cont[type], (listener2) => { + listener2(val1, val2, val3); + }); + }; + setFsWatchListener = (path3, fullPath, options2, handlers) => { + const { listener: listener2, errHandler, rawEmitter } = handlers; + let cont = FsWatchInstances.get(fullPath); + let watcher; + if (!options2.persistent) { + watcher = createFsWatchInstance( + path3, + options2, + listener2, + errHandler, + rawEmitter + ); + return watcher.close.bind(watcher); + } + if (cont) { + addAndConvert(cont, KEY_LISTENERS, listener2); + addAndConvert(cont, KEY_ERR, errHandler); + addAndConvert(cont, KEY_RAW, rawEmitter); + } else { + watcher = createFsWatchInstance( + path3, + options2, + fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS), + errHandler, + // no need to use broadcast here + fsWatchBroadcast.bind(null, fullPath, KEY_RAW) + ); + if (!watcher) + return; + watcher.on(EV_ERROR$2, async (error2) => { + const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR); + cont.watcherUnusable = true; + if (isWindows$2 && error2.code === "EPERM") { + try { + const fd = await open$1(path3, "r"); + await close(fd); + broadcastErr(error2); + } catch (err) { + } + } else { + broadcastErr(error2); + } + }); + cont = { + listeners: listener2, + errHandlers: errHandler, + rawEmitters: rawEmitter, + watcher + }; + FsWatchInstances.set(fullPath, cont); + } + return () => { + delFromSet(cont, KEY_LISTENERS, listener2); + delFromSet(cont, KEY_ERR, errHandler); + delFromSet(cont, KEY_RAW, rawEmitter); + if (isEmptySet(cont.listeners)) { + cont.watcher.close(); + FsWatchInstances.delete(fullPath); + HANDLER_KEYS.forEach(clearItem(cont)); + cont.watcher = void 0; + Object.freeze(cont); + } + }; + }; + FsWatchFileInstances = /* @__PURE__ */ new Map(); + setFsWatchFileListener = (path3, fullPath, options2, handlers) => { + const { listener: listener2, rawEmitter } = handlers; + let cont = FsWatchFileInstances.get(fullPath); + const copts = cont && cont.options; + if (copts && (copts.persistent < options2.persistent || copts.interval > options2.interval)) { + fs$7.unwatchFile(fullPath); + cont = void 0; + } + if (cont) { + addAndConvert(cont, KEY_LISTENERS, listener2); + addAndConvert(cont, KEY_RAW, rawEmitter); + } else { + cont = { + listeners: listener2, + rawEmitters: rawEmitter, + options: options2, + watcher: fs$7.watchFile(fullPath, options2, (curr, prev) => { + foreach(cont.rawEmitters, (rawEmitter2) => { + rawEmitter2(EV_CHANGE$2, fullPath, { curr, prev }); + }); + const currmtime = curr.mtimeMs; + if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) { + foreach(cont.listeners, (listener3) => listener3(path3, curr)); + } + }) + }; + FsWatchFileInstances.set(fullPath, cont); + } + return () => { + delFromSet(cont, KEY_LISTENERS, listener2); + delFromSet(cont, KEY_RAW, rawEmitter); + if (isEmptySet(cont.listeners)) { + FsWatchFileInstances.delete(fullPath); + fs$7.unwatchFile(fullPath); + cont.options = cont.watcher = void 0; + Object.freeze(cont); + } + }; + }; + NodeFsHandler$1 = class NodeFsHandler { + /** + * @param {import("../index").FSWatcher} fsW + */ + constructor(fsW) { + this.fsw = fsW; + this._boundHandleError = (error2) => fsW._handleError(error2); + } + /** + * Watch file for changes with fs_watchFile or fs_watch. + * @param {String} path to file or dir + * @param {Function} listener on fs change + * @returns {Function} closer for the watcher instance + */ + _watchWithNodeFs(path3, listener2) { + const opts = this.fsw.options; + const directory = sysPath$2.dirname(path3); + const basename2 = sysPath$2.basename(path3); + const parent = this.fsw._getWatchedDir(directory); + parent.add(basename2); + const absolutePath = sysPath$2.resolve(path3); + const options2 = { persistent: opts.persistent }; + if (!listener2) + listener2 = EMPTY_FN$2; + let closer; + if (opts.usePolling) { + options2.interval = opts.enableBinaryInterval && isBinaryPath(basename2) ? opts.binaryInterval : opts.interval; + closer = setFsWatchFileListener(path3, absolutePath, options2, { + listener: listener2, + rawEmitter: this.fsw._emitRaw + }); + } else { + closer = setFsWatchListener(path3, absolutePath, options2, { + listener: listener2, + errHandler: this._boundHandleError, + rawEmitter: this.fsw._emitRaw + }); + } + return closer; + } + /** + * Watch a file and emit add event if warranted. + * @param {Path} file Path + * @param {fs.Stats} stats result of fs_stat + * @param {Boolean} initialAdd was the file added at watch instantiation? + * @returns {Function} closer for the watcher instance + */ + _handleFile(file, stats, initialAdd) { + if (this.fsw.closed) { + return; + } + const dirname2 = sysPath$2.dirname(file); + const basename2 = sysPath$2.basename(file); + const parent = this.fsw._getWatchedDir(dirname2); + let prevStats = stats; + if (parent.has(basename2)) + return; + const listener2 = async (path3, newStats) => { + if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5)) + return; + if (!newStats || newStats.mtimeMs === 0) { + try { + const newStats2 = await stat$2(file); + if (this.fsw.closed) + return; + const at2 = newStats2.atimeMs; + const mt = newStats2.mtimeMs; + if (!at2 || at2 <= mt || mt !== prevStats.mtimeMs) { + this.fsw._emit(EV_CHANGE$2, file, newStats2); + } + if (isLinux && prevStats.ino !== newStats2.ino) { + this.fsw._closeFile(path3); + prevStats = newStats2; + this.fsw._addPathCloser(path3, this._watchWithNodeFs(file, listener2)); + } else { + prevStats = newStats2; + } + } catch (error2) { + this.fsw._remove(dirname2, basename2); + } + } else if (parent.has(basename2)) { + const at2 = newStats.atimeMs; + const mt = newStats.mtimeMs; + if (!at2 || at2 <= mt || mt !== prevStats.mtimeMs) { + this.fsw._emit(EV_CHANGE$2, file, newStats); + } + prevStats = newStats; + } + }; + const closer = this._watchWithNodeFs(file, listener2); + if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) { + if (!this.fsw._throttle(EV_ADD$2, file, 0)) + return; + this.fsw._emit(EV_ADD$2, file, stats); + } + return closer; + } + /** + * Handle symlinks encountered while reading a dir. + * @param {Object} entry returned by readdirp + * @param {String} directory path of dir being read + * @param {String} path of this item + * @param {String} item basename of this item + * @returns {Promise} true if no more processing is needed for this entry. + */ + async _handleSymlink(entry2, directory, path3, item) { + if (this.fsw.closed) { + return; + } + const full = entry2.fullPath; + const dir = this.fsw._getWatchedDir(directory); + if (!this.fsw.options.followSymlinks) { + this.fsw._incrReadyCount(); + let linkPath; + try { + linkPath = await fsrealpath(path3); + } catch (e) { + this.fsw._emitReady(); + return true; + } + if (this.fsw.closed) + return; + if (dir.has(item)) { + if (this.fsw._symlinkPaths.get(full) !== linkPath) { + this.fsw._symlinkPaths.set(full, linkPath); + this.fsw._emit(EV_CHANGE$2, path3, entry2.stats); + } + } else { + dir.add(item); + this.fsw._symlinkPaths.set(full, linkPath); + this.fsw._emit(EV_ADD$2, path3, entry2.stats); + } + this.fsw._emitReady(); + return true; + } + if (this.fsw._symlinkPaths.has(full)) { + return true; + } + this.fsw._symlinkPaths.set(full, true); + } + _handleRead(directory, initialAdd, wh, target, dir, depth2, throttler) { + directory = sysPath$2.join(directory, EMPTY_STR$1); + if (!wh.hasGlob) { + throttler = this.fsw._throttle("readdir", directory, 1e3); + if (!throttler) + return; + } + const previous = this.fsw._getWatchedDir(wh.path); + const current2 = /* @__PURE__ */ new Set(); + let stream4 = this.fsw._readdirp(directory, { + fileFilter: (entry2) => wh.filterPath(entry2), + directoryFilter: (entry2) => wh.filterDir(entry2), + depth: 0 + }).on(STR_DATA$1, async (entry2) => { + if (this.fsw.closed) { + stream4 = void 0; + return; + } + const item = entry2.path; + let path3 = sysPath$2.join(directory, item); + current2.add(item); + if (entry2.stats.isSymbolicLink() && await this._handleSymlink(entry2, directory, path3, item)) { + return; + } + if (this.fsw.closed) { + stream4 = void 0; + return; + } + if (item === target || !target && !previous.has(item)) { + this.fsw._incrReadyCount(); + path3 = sysPath$2.join(dir, sysPath$2.relative(dir, path3)); + this._addToNodeFs(path3, initialAdd, wh, depth2 + 1); + } + }).on(EV_ERROR$2, this._boundHandleError); + return new Promise( + (resolve3) => stream4.once(STR_END$2, () => { + if (this.fsw.closed) { + stream4 = void 0; + return; + } + const wasThrottled = throttler ? throttler.clear() : false; + resolve3(); + previous.getChildren().filter((item) => { + return item !== directory && !current2.has(item) && // in case of intersecting globs; + // a path may have been filtered out of this readdir, but + // shouldn't be removed because it matches a different glob + (!wh.hasGlob || wh.filterPath({ + fullPath: sysPath$2.resolve(directory, item) + })); + }).forEach((item) => { + this.fsw._remove(directory, item); + }); + stream4 = void 0; + if (wasThrottled) + this._handleRead(directory, false, wh, target, dir, depth2, throttler); + }) + ); + } + /** + * Read directory to add / remove files from `@watched` list and re-read it on change. + * @param {String} dir fs path + * @param {fs.Stats} stats + * @param {Boolean} initialAdd + * @param {Number} depth relative to user-supplied path + * @param {String} target child path targeted for watch + * @param {Object} wh Common watch helpers for this path + * @param {String} realpath + * @returns {Promise} closer for the watcher instance. + */ + async _handleDir(dir, stats, initialAdd, depth2, target, wh, realpath3) { + const parentDir = this.fsw._getWatchedDir(sysPath$2.dirname(dir)); + const tracked = parentDir.has(sysPath$2.basename(dir)); + if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) { + if (!wh.hasGlob || wh.globFilter(dir)) + this.fsw._emit(EV_ADD_DIR$2, dir, stats); + } + parentDir.add(sysPath$2.basename(dir)); + this.fsw._getWatchedDir(dir); + let throttler; + let closer; + const oDepth = this.fsw.options.depth; + if ((oDepth == null || depth2 <= oDepth) && !this.fsw._symlinkPaths.has(realpath3)) { + if (!target) { + await this._handleRead(dir, initialAdd, wh, target, dir, depth2, throttler); + if (this.fsw.closed) + return; + } + closer = this._watchWithNodeFs(dir, (dirPath, stats2) => { + if (stats2 && stats2.mtimeMs === 0) + return; + this._handleRead(dirPath, false, wh, target, dir, depth2, throttler); + }); + } + return closer; + } + /** + * Handle added file, directory, or glob pattern. + * Delegates call to _handleFile / _handleDir after checks. + * @param {String} path to file or ir + * @param {Boolean} initialAdd was the file added at watch instantiation? + * @param {Object} priorWh depth relative to user-supplied path + * @param {Number} depth Child path actually targeted for watch + * @param {String=} target Child path actually targeted for watch + * @returns {Promise} + */ + async _addToNodeFs(path3, initialAdd, priorWh, depth2, target) { + const ready = this.fsw._emitReady; + if (this.fsw._isIgnored(path3) || this.fsw.closed) { + ready(); + return false; + } + const wh = this.fsw._getWatchHelpers(path3, depth2); + if (!wh.hasGlob && priorWh) { + wh.hasGlob = priorWh.hasGlob; + wh.globFilter = priorWh.globFilter; + wh.filterPath = (entry2) => priorWh.filterPath(entry2); + wh.filterDir = (entry2) => priorWh.filterDir(entry2); + } + try { + const stats = await statMethods$1[wh.statMethod](wh.watchPath); + if (this.fsw.closed) + return; + if (this.fsw._isIgnored(wh.watchPath, stats)) { + ready(); + return false; + } + const follow = this.fsw.options.followSymlinks && !path3.includes(STAR) && !path3.includes(BRACE_START$1); + let closer; + if (stats.isDirectory()) { + const absPath = sysPath$2.resolve(path3); + const targetPath = follow ? await fsrealpath(path3) : path3; + if (this.fsw.closed) + return; + closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth2, target, wh, targetPath); + if (this.fsw.closed) + return; + if (absPath !== targetPath && targetPath !== void 0) { + this.fsw._symlinkPaths.set(absPath, targetPath); + } + } else if (stats.isSymbolicLink()) { + const targetPath = follow ? await fsrealpath(path3) : path3; + if (this.fsw.closed) + return; + const parent = sysPath$2.dirname(wh.watchPath); + this.fsw._getWatchedDir(parent).add(wh.watchPath); + this.fsw._emit(EV_ADD$2, wh.watchPath, stats); + closer = await this._handleDir(parent, stats, initialAdd, depth2, path3, wh, targetPath); + if (this.fsw.closed) + return; + if (targetPath !== void 0) { + this.fsw._symlinkPaths.set(sysPath$2.resolve(path3), targetPath); + } + } else { + closer = this._handleFile(wh.watchPath, stats, initialAdd); + } + ready(); + this.fsw._addPathCloser(path3, closer); + return false; + } catch (error2) { + if (this.fsw._handleError(error2)) { + ready(); + return path3; + } + } + } + }; + nodefsHandler = NodeFsHandler$1; + fseventsHandlerExports = {}; + fseventsHandler = { + get exports() { + return fseventsHandlerExports; + }, + set exports(v) { + fseventsHandlerExports = v; + } + }; + fs$6 = require$$0__default; + sysPath$1 = require$$0$4; + ({ promisify: promisify$1 } = require$$0$6); + try { + fsevents = __require("fsevents"); + } catch (error2) { + if (process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR) + console.error(error2); + } + if (fsevents) { + const mtch = process.version.match(/v(\d+)\.(\d+)/); + if (mtch && mtch[1] && mtch[2]) { + const maj2 = Number.parseInt(mtch[1], 10); + const min2 = Number.parseInt(mtch[2], 10); + if (maj2 === 8 && min2 < 16) { + fsevents = void 0; + } + } + } + ({ + EV_ADD: EV_ADD$1, + EV_CHANGE: EV_CHANGE$1, + EV_ADD_DIR: EV_ADD_DIR$1, + EV_UNLINK: EV_UNLINK$1, + EV_ERROR: EV_ERROR$1, + STR_DATA, + STR_END: STR_END$1, + FSEVENT_CREATED, + FSEVENT_MODIFIED, + FSEVENT_DELETED, + FSEVENT_MOVED, + FSEVENT_UNKNOWN: ( + // FSEVENT_CLONED, + FSEVENT_UNKNOWN + ), + FSEVENT_TYPE_FILE, + FSEVENT_TYPE_DIRECTORY, + FSEVENT_TYPE_SYMLINK, + ROOT_GLOBSTAR, + DIR_SUFFIX, + DOT_SLASH, + FUNCTION_TYPE: FUNCTION_TYPE$1, + EMPTY_FN: EMPTY_FN$1, + IDENTITY_FN + } = constants$1); + Depth = (value2) => isNaN(value2) ? {} : { depth: value2 }; + stat$1 = promisify$1(fs$6.stat); + lstat = promisify$1(fs$6.lstat); + realpath2 = promisify$1(fs$6.realpath); + statMethods = { stat: stat$1, lstat }; + FSEventsWatchers = /* @__PURE__ */ new Map(); + consolidateThreshhold = 10; + wrongEventFlags = /* @__PURE__ */ new Set([ + 69888, + 70400, + 71424, + 72704, + 73472, + 131328, + 131840, + 262912 + ]); + createFSEventsInstance = (path3, callback) => { + const stop = fsevents.watch(path3, callback); + return { stop }; + }; + couldConsolidate = (path3) => { + let count = 0; + for (const watchPath of FSEventsWatchers.keys()) { + if (watchPath.indexOf(path3) === 0) { + count++; + if (count >= consolidateThreshhold) { + return true; + } + } + } + return false; + }; + canUse = () => fsevents && FSEventsWatchers.size < 128; + calcDepth = (path3, root) => { + let i = 0; + while (!path3.indexOf(root) && (path3 = sysPath$1.dirname(path3)) !== root) + i++; + return i; + }; + sameTypes = (info, stats) => info.type === FSEVENT_TYPE_DIRECTORY && stats.isDirectory() || info.type === FSEVENT_TYPE_SYMLINK && stats.isSymbolicLink() || info.type === FSEVENT_TYPE_FILE && stats.isFile(); + FsEventsHandler$1 = class FsEventsHandler { + /** + * @param {import('../index').FSWatcher} fsw + */ + constructor(fsw) { + this.fsw = fsw; + } + checkIgnored(path3, stats) { + const ipaths = this.fsw._ignoredPaths; + if (this.fsw._isIgnored(path3, stats)) { + ipaths.add(path3); + if (stats && stats.isDirectory()) { + ipaths.add(path3 + ROOT_GLOBSTAR); + } + return true; + } + ipaths.delete(path3); + ipaths.delete(path3 + ROOT_GLOBSTAR); + } + addOrChange(path3, fullPath, realPath, parent, watchedDir, item, info, opts) { + const event = watchedDir.has(item) ? EV_CHANGE$1 : EV_ADD$1; + this.handleEvent(event, path3, fullPath, realPath, parent, watchedDir, item, info, opts); + } + async checkExists(path3, fullPath, realPath, parent, watchedDir, item, info, opts) { + try { + const stats = await stat$1(path3); + if (this.fsw.closed) + return; + if (sameTypes(info, stats)) { + this.addOrChange(path3, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK$1, path3, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } catch (error2) { + if (error2.code === "EACCES") { + this.addOrChange(path3, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK$1, path3, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } + } + handleEvent(event, path3, fullPath, realPath, parent, watchedDir, item, info, opts) { + if (this.fsw.closed || this.checkIgnored(path3)) + return; + if (event === EV_UNLINK$1) { + const isDirectory = info.type === FSEVENT_TYPE_DIRECTORY; + if (isDirectory || watchedDir.has(item)) { + this.fsw._remove(parent, item, isDirectory); + } + } else { + if (event === EV_ADD$1) { + if (info.type === FSEVENT_TYPE_DIRECTORY) + this.fsw._getWatchedDir(path3); + if (info.type === FSEVENT_TYPE_SYMLINK && opts.followSymlinks) { + const curDepth = opts.depth === void 0 ? void 0 : calcDepth(fullPath, realPath) + 1; + return this._addToFsEvents(path3, false, true, curDepth); + } + this.fsw._getWatchedDir(parent).add(item); + } + const eventName = info.type === FSEVENT_TYPE_DIRECTORY ? event + DIR_SUFFIX : event; + this.fsw._emit(eventName, path3); + if (eventName === EV_ADD_DIR$1) + this._addToFsEvents(path3, false, true); + } + } + /** + * Handle symlinks encountered during directory scan + * @param {String} watchPath - file/dir path to be watched with fsevents + * @param {String} realPath - real path (in case of symlinks) + * @param {Function} transform - path transformer + * @param {Function} globFilter - path filter in case a glob pattern was provided + * @returns {Function} closer for the watcher instance + */ + _watchWithFsEvents(watchPath, realPath, transform3, globFilter) { + if (this.fsw.closed || this.fsw._isIgnored(watchPath)) + return; + const opts = this.fsw.options; + const watchCallback = async (fullPath, flags, info) => { + if (this.fsw.closed) + return; + if (opts.depth !== void 0 && calcDepth(fullPath, realPath) > opts.depth) + return; + const path3 = transform3(sysPath$1.join( + watchPath, + sysPath$1.relative(watchPath, fullPath) + )); + if (globFilter && !globFilter(path3)) + return; + const parent = sysPath$1.dirname(path3); + const item = sysPath$1.basename(path3); + const watchedDir = this.fsw._getWatchedDir( + info.type === FSEVENT_TYPE_DIRECTORY ? path3 : parent + ); + if (wrongEventFlags.has(flags) || info.event === FSEVENT_UNKNOWN) { + if (typeof opts.ignored === FUNCTION_TYPE$1) { + let stats; + try { + stats = await stat$1(path3); + } catch (error2) { + } + if (this.fsw.closed) + return; + if (this.checkIgnored(path3, stats)) + return; + if (sameTypes(info, stats)) { + this.addOrChange(path3, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK$1, path3, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } else { + this.checkExists(path3, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } else { + switch (info.event) { + case FSEVENT_CREATED: + case FSEVENT_MODIFIED: + return this.addOrChange(path3, fullPath, realPath, parent, watchedDir, item, info, opts); + case FSEVENT_DELETED: + case FSEVENT_MOVED: + return this.checkExists(path3, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } + }; + const closer = setFSEventsListener( + watchPath, + realPath, + watchCallback, + this.fsw._emitRaw + ); + this.fsw._emitReady(); + return closer; + } + /** + * Handle symlinks encountered during directory scan + * @param {String} linkPath path to symlink + * @param {String} fullPath absolute path to the symlink + * @param {Function} transform pre-existing path transformer + * @param {Number} curDepth level of subdirectories traversed to where symlink is + * @returns {Promise} + */ + async _handleFsEventsSymlink(linkPath, fullPath, transform3, curDepth) { + if (this.fsw.closed || this.fsw._symlinkPaths.has(fullPath)) + return; + this.fsw._symlinkPaths.set(fullPath, true); + this.fsw._incrReadyCount(); + try { + const linkTarget = await realpath2(linkPath); + if (this.fsw.closed) + return; + if (this.fsw._isIgnored(linkTarget)) { + return this.fsw._emitReady(); + } + this.fsw._incrReadyCount(); + this._addToFsEvents(linkTarget || linkPath, (path3) => { + let aliasedPath = linkPath; + if (linkTarget && linkTarget !== DOT_SLASH) { + aliasedPath = path3.replace(linkTarget, linkPath); + } else if (path3 !== DOT_SLASH) { + aliasedPath = sysPath$1.join(linkPath, path3); + } + return transform3(aliasedPath); + }, false, curDepth); + } catch (error2) { + if (this.fsw._handleError(error2)) { + return this.fsw._emitReady(); + } + } + } + /** + * + * @param {Path} newPath + * @param {fs.Stats} stats + */ + emitAdd(newPath, stats, processPath, opts, forceAdd) { + const pp2 = processPath(newPath); + const isDir = stats.isDirectory(); + const dirObj = this.fsw._getWatchedDir(sysPath$1.dirname(pp2)); + const base2 = sysPath$1.basename(pp2); + if (isDir) + this.fsw._getWatchedDir(pp2); + if (dirObj.has(base2)) + return; + dirObj.add(base2); + if (!opts.ignoreInitial || forceAdd === true) { + this.fsw._emit(isDir ? EV_ADD_DIR$1 : EV_ADD$1, pp2, stats); + } + } + initWatch(realPath, path3, wh, processPath) { + if (this.fsw.closed) + return; + const closer = this._watchWithFsEvents( + wh.watchPath, + sysPath$1.resolve(realPath || wh.watchPath), + processPath, + wh.globFilter + ); + this.fsw._addPathCloser(path3, closer); + } + /** + * Handle added path with fsevents + * @param {String} path file/dir path or glob pattern + * @param {Function|Boolean=} transform converts working path to what the user expects + * @param {Boolean=} forceAdd ensure add is emitted + * @param {Number=} priorDepth Level of subdirectories already traversed. + * @returns {Promise} + */ + async _addToFsEvents(path3, transform3, forceAdd, priorDepth) { + if (this.fsw.closed) { + return; + } + const opts = this.fsw.options; + const processPath = typeof transform3 === FUNCTION_TYPE$1 ? transform3 : IDENTITY_FN; + const wh = this.fsw._getWatchHelpers(path3); + try { + const stats = await statMethods[wh.statMethod](wh.watchPath); + if (this.fsw.closed) + return; + if (this.fsw._isIgnored(wh.watchPath, stats)) { + throw null; + } + if (stats.isDirectory()) { + if (!wh.globFilter) + this.emitAdd(processPath(path3), stats, processPath, opts, forceAdd); + if (priorDepth && priorDepth > opts.depth) + return; + this.fsw._readdirp(wh.watchPath, { + fileFilter: (entry2) => wh.filterPath(entry2), + directoryFilter: (entry2) => wh.filterDir(entry2), + ...Depth(opts.depth - (priorDepth || 0)) + }).on(STR_DATA, (entry2) => { + if (this.fsw.closed) { + return; + } + if (entry2.stats.isDirectory() && !wh.filterPath(entry2)) + return; + const joinedPath = sysPath$1.join(wh.watchPath, entry2.path); + const { fullPath } = entry2; + if (wh.followSymlinks && entry2.stats.isSymbolicLink()) { + const curDepth = opts.depth === void 0 ? void 0 : calcDepth(joinedPath, sysPath$1.resolve(wh.watchPath)) + 1; + this._handleFsEventsSymlink(joinedPath, fullPath, processPath, curDepth); + } else { + this.emitAdd(joinedPath, entry2.stats, processPath, opts, forceAdd); + } + }).on(EV_ERROR$1, EMPTY_FN$1).on(STR_END$1, () => { + this.fsw._emitReady(); + }); + } else { + this.emitAdd(wh.watchPath, stats, processPath, opts, forceAdd); + this.fsw._emitReady(); + } + } catch (error2) { + if (!error2 || this.fsw._handleError(error2)) { + this.fsw._emitReady(); + this.fsw._emitReady(); + } + } + if (opts.persistent && forceAdd !== true) { + if (typeof transform3 === FUNCTION_TYPE$1) { + this.initWatch(void 0, path3, wh, processPath); + } else { + let realPath; + try { + realPath = await realpath2(wh.watchPath); + } catch (e) { + } + this.initWatch(realPath, path3, wh, processPath); + } + } + } + }; + fseventsHandler.exports = FsEventsHandler$1; + fseventsHandlerExports.canUse = canUse; + ({ EventEmitter: EventEmitter$2 } = require$$0$5); + fs$5 = require$$0__default; + sysPath = require$$0$4; + ({ promisify } = require$$0$6); + readdirp = readdirp_1; + anymatch = anymatchExports.default; + globParent2 = globParent$2; + isGlob2 = isGlob$2; + braces = braces_1; + normalizePath = normalizePath$2; + NodeFsHandler2 = nodefsHandler; + FsEventsHandler2 = fseventsHandlerExports; + ({ + EV_ALL, + EV_READY, + EV_ADD, + EV_CHANGE, + EV_UNLINK, + EV_ADD_DIR, + EV_UNLINK_DIR, + EV_RAW, + EV_ERROR, + STR_CLOSE, + STR_END, + BACK_SLASH_RE, + DOUBLE_SLASH_RE, + SLASH_OR_BACK_SLASH_RE, + DOT_RE, + REPLACER_RE, + SLASH, + SLASH_SLASH, + BRACE_START, + BANG, + ONE_DOT, + TWO_DOTS, + GLOBSTAR, + SLASH_GLOBSTAR, + ANYMATCH_OPTS, + STRING_TYPE, + FUNCTION_TYPE, + EMPTY_STR, + EMPTY_FN, + isWindows: isWindows$1, + isMacos, + isIBMi + } = constants$1); + stat = promisify(fs$5.stat); + readdir = promisify(fs$5.readdir); + arrify = (value2 = []) => Array.isArray(value2) ? value2 : [value2]; + flatten = (list, result = []) => { + list.forEach((item) => { + if (Array.isArray(item)) { + flatten(item, result); + } else { + result.push(item); + } + }); + return result; + }; + unifyPaths = (paths_) => { + const paths = flatten(arrify(paths_)); + if (!paths.every((p) => typeof p === STRING_TYPE)) { + throw new TypeError(`Non-string provided as watch path: ${paths}`); + } + return paths.map(normalizePathToUnix); + }; + toUnix = (string2) => { + let str = string2.replace(BACK_SLASH_RE, SLASH); + let prepend = false; + if (str.startsWith(SLASH_SLASH)) { + prepend = true; + } + while (str.match(DOUBLE_SLASH_RE)) { + str = str.replace(DOUBLE_SLASH_RE, SLASH); + } + if (prepend) { + str = SLASH + str; + } + return str; + }; + normalizePathToUnix = (path3) => toUnix(sysPath.normalize(toUnix(path3))); + normalizeIgnored = (cwd = EMPTY_STR) => (path3) => { + if (typeof path3 !== STRING_TYPE) + return path3; + return normalizePathToUnix(sysPath.isAbsolute(path3) ? path3 : sysPath.join(cwd, path3)); + }; + getAbsolutePath = (path3, cwd) => { + if (sysPath.isAbsolute(path3)) { + return path3; + } + if (path3.startsWith(BANG)) { + return BANG + sysPath.join(cwd, path3.slice(1)); + } + return sysPath.join(cwd, path3); + }; + undef = (opts, key) => opts[key] === void 0; + DirEntry = class { + /** + * @param {Path} dir + * @param {Function} removeWatcher + */ + constructor(dir, removeWatcher) { + this.path = dir; + this._removeWatcher = removeWatcher; + this.items = /* @__PURE__ */ new Set(); + } + add(item) { + const { items } = this; + if (!items) + return; + if (item !== ONE_DOT && item !== TWO_DOTS) + items.add(item); + } + async remove(item) { + const { items } = this; + if (!items) + return; + items.delete(item); + if (items.size > 0) + return; + const dir = this.path; + try { + await readdir(dir); + } catch (err) { + if (this._removeWatcher) { + this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir)); + } + } + } + has(item) { + const { items } = this; + if (!items) + return; + return items.has(item); + } + /** + * @returns {Array} + */ + getChildren() { + const { items } = this; + if (!items) + return; + return [...items.values()]; + } + dispose() { + this.items.clear(); + delete this.path; + delete this._removeWatcher; + delete this.items; + Object.freeze(this); + } + }; + STAT_METHOD_F = "stat"; + STAT_METHOD_L = "lstat"; + WatchHelper = class { + constructor(path3, watchPath, follow, fsw) { + this.fsw = fsw; + this.path = path3 = path3.replace(REPLACER_RE, EMPTY_STR); + this.watchPath = watchPath; + this.fullWatchPath = sysPath.resolve(watchPath); + this.hasGlob = watchPath !== path3; + if (path3 === EMPTY_STR) + this.hasGlob = false; + this.globSymlink = this.hasGlob && follow ? void 0 : false; + this.globFilter = this.hasGlob ? anymatch(path3, void 0, ANYMATCH_OPTS) : false; + this.dirParts = this.getDirParts(path3); + this.dirParts.forEach((parts) => { + if (parts.length > 1) + parts.pop(); + }); + this.followSymlinks = follow; + this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L; + } + checkGlobSymlink(entry2) { + if (this.globSymlink === void 0) { + this.globSymlink = entry2.fullParentDir === this.fullWatchPath ? false : { realPath: entry2.fullParentDir, linkPath: this.fullWatchPath }; + } + if (this.globSymlink) { + return entry2.fullPath.replace(this.globSymlink.realPath, this.globSymlink.linkPath); + } + return entry2.fullPath; + } + entryPath(entry2) { + return sysPath.join( + this.watchPath, + sysPath.relative(this.watchPath, this.checkGlobSymlink(entry2)) + ); + } + filterPath(entry2) { + const { stats } = entry2; + if (stats && stats.isSymbolicLink()) + return this.filterDir(entry2); + const resolvedPath = this.entryPath(entry2); + const matchesGlob = this.hasGlob && typeof this.globFilter === FUNCTION_TYPE ? this.globFilter(resolvedPath) : true; + return matchesGlob && this.fsw._isntIgnored(resolvedPath, stats) && this.fsw._hasReadPermissions(stats); + } + getDirParts(path3) { + if (!this.hasGlob) + return []; + const parts = []; + const expandedPath = path3.includes(BRACE_START) ? braces.expand(path3) : [path3]; + expandedPath.forEach((path4) => { + parts.push(sysPath.relative(this.watchPath, path4).split(SLASH_OR_BACK_SLASH_RE)); + }); + return parts; + } + filterDir(entry2) { + if (this.hasGlob) { + const entryParts = this.getDirParts(this.checkGlobSymlink(entry2)); + let globstar = false; + this.unmatchedGlob = !this.dirParts.some((parts) => { + return parts.every((part, i) => { + if (part === GLOBSTAR) + globstar = true; + return globstar || !entryParts[0][i] || anymatch(part, entryParts[0][i], ANYMATCH_OPTS); + }); + }); + } + return !this.unmatchedGlob && this.fsw._isntIgnored(this.entryPath(entry2), entry2.stats); + } + }; + FSWatcher = class extends EventEmitter$2 { + // Not indenting methods for history sake; for now. + constructor(_opts) { + super(); + const opts = {}; + if (_opts) + Object.assign(opts, _opts); + this._watched = /* @__PURE__ */ new Map(); + this._closers = /* @__PURE__ */ new Map(); + this._ignoredPaths = /* @__PURE__ */ new Set(); + this._throttled = /* @__PURE__ */ new Map(); + this._symlinkPaths = /* @__PURE__ */ new Map(); + this._streams = /* @__PURE__ */ new Set(); + this.closed = false; + if (undef(opts, "persistent")) + opts.persistent = true; + if (undef(opts, "ignoreInitial")) + opts.ignoreInitial = false; + if (undef(opts, "ignorePermissionErrors")) + opts.ignorePermissionErrors = false; + if (undef(opts, "interval")) + opts.interval = 100; + if (undef(opts, "binaryInterval")) + opts.binaryInterval = 300; + if (undef(opts, "disableGlobbing")) + opts.disableGlobbing = false; + opts.enableBinaryInterval = opts.binaryInterval !== opts.interval; + if (undef(opts, "useFsEvents")) + opts.useFsEvents = !opts.usePolling; + const canUseFsEvents = FsEventsHandler2.canUse(); + if (!canUseFsEvents) + opts.useFsEvents = false; + if (undef(opts, "usePolling") && !opts.useFsEvents) { + opts.usePolling = isMacos; + } + if (isIBMi) { + opts.usePolling = true; + } + const envPoll = process.env.CHOKIDAR_USEPOLLING; + if (envPoll !== void 0) { + const envLower = envPoll.toLowerCase(); + if (envLower === "false" || envLower === "0") { + opts.usePolling = false; + } else if (envLower === "true" || envLower === "1") { + opts.usePolling = true; + } else { + opts.usePolling = !!envLower; + } + } + const envInterval = process.env.CHOKIDAR_INTERVAL; + if (envInterval) { + opts.interval = Number.parseInt(envInterval, 10); + } + if (undef(opts, "atomic")) + opts.atomic = !opts.usePolling && !opts.useFsEvents; + if (opts.atomic) + this._pendingUnlinks = /* @__PURE__ */ new Map(); + if (undef(opts, "followSymlinks")) + opts.followSymlinks = true; + if (undef(opts, "awaitWriteFinish")) + opts.awaitWriteFinish = false; + if (opts.awaitWriteFinish === true) + opts.awaitWriteFinish = {}; + const awf = opts.awaitWriteFinish; + if (awf) { + if (!awf.stabilityThreshold) + awf.stabilityThreshold = 2e3; + if (!awf.pollInterval) + awf.pollInterval = 100; + this._pendingWrites = /* @__PURE__ */ new Map(); + } + if (opts.ignored) + opts.ignored = arrify(opts.ignored); + let readyCalls = 0; + this._emitReady = () => { + readyCalls++; + if (readyCalls >= this._readyCount) { + this._emitReady = EMPTY_FN; + this._readyEmitted = true; + process.nextTick(() => this.emit(EV_READY)); + } + }; + this._emitRaw = (...args) => this.emit(EV_RAW, ...args); + this._readyEmitted = false; + this.options = opts; + if (opts.useFsEvents) { + this._fsEventsHandler = new FsEventsHandler2(this); + } else { + this._nodeFsHandler = new NodeFsHandler2(this); + } + Object.freeze(opts); + } + // Public methods + /** + * Adds paths to be watched on an existing FSWatcher instance + * @param {Path|Array} paths_ + * @param {String=} _origAdd private; for handling non-existent paths to be watched + * @param {Boolean=} _internal private; indicates a non-user add + * @returns {FSWatcher} for chaining + */ + add(paths_, _origAdd, _internal) { + const { cwd, disableGlobbing } = this.options; + this.closed = false; + let paths = unifyPaths(paths_); + if (cwd) { + paths = paths.map((path3) => { + const absPath = getAbsolutePath(path3, cwd); + if (disableGlobbing || !isGlob2(path3)) { + return absPath; + } + return normalizePath(absPath); + }); + } + paths = paths.filter((path3) => { + if (path3.startsWith(BANG)) { + this._ignoredPaths.add(path3.slice(1)); + return false; + } + this._ignoredPaths.delete(path3); + this._ignoredPaths.delete(path3 + SLASH_GLOBSTAR); + this._userIgnored = void 0; + return true; + }); + if (this.options.useFsEvents && this._fsEventsHandler) { + if (!this._readyCount) + this._readyCount = paths.length; + if (this.options.persistent) + this._readyCount *= 2; + paths.forEach((path3) => this._fsEventsHandler._addToFsEvents(path3)); + } else { + if (!this._readyCount) + this._readyCount = 0; + this._readyCount += paths.length; + Promise.all( + paths.map(async (path3) => { + const res = await this._nodeFsHandler._addToNodeFs(path3, !_internal, 0, 0, _origAdd); + if (res) + this._emitReady(); + return res; + }) + ).then((results) => { + if (this.closed) + return; + results.filter((item) => item).forEach((item) => { + this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item)); + }); + }); + } + return this; + } + /** + * Close watchers or start ignoring events from specified paths. + * @param {Path|Array} paths_ - string or array of strings, file/directory paths and/or globs + * @returns {FSWatcher} for chaining + */ + unwatch(paths_) { + if (this.closed) + return this; + const paths = unifyPaths(paths_); + const { cwd } = this.options; + paths.forEach((path3) => { + if (!sysPath.isAbsolute(path3) && !this._closers.has(path3)) { + if (cwd) + path3 = sysPath.join(cwd, path3); + path3 = sysPath.resolve(path3); + } + this._closePath(path3); + this._ignoredPaths.add(path3); + if (this._watched.has(path3)) { + this._ignoredPaths.add(path3 + SLASH_GLOBSTAR); + } + this._userIgnored = void 0; + }); + return this; + } + /** + * Close watchers and remove all listeners from watched paths. + * @returns {Promise}. + */ + close() { + if (this.closed) + return this._closePromise; + this.closed = true; + this.removeAllListeners(); + const closers = []; + this._closers.forEach((closerList) => closerList.forEach((closer) => { + const promise2 = closer(); + if (promise2 instanceof Promise) + closers.push(promise2); + })); + this._streams.forEach((stream4) => stream4.destroy()); + this._userIgnored = void 0; + this._readyCount = 0; + this._readyEmitted = false; + this._watched.forEach((dirent) => dirent.dispose()); + ["closers", "watched", "streams", "symlinkPaths", "throttled"].forEach((key) => { + this[`_${key}`].clear(); + }); + this._closePromise = closers.length ? Promise.all(closers).then(() => void 0) : Promise.resolve(); + return this._closePromise; + } + /** + * Expose list of watched paths + * @returns {Object} for chaining + */ + getWatched() { + const watchList = {}; + this._watched.forEach((entry2, dir) => { + const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir; + watchList[key || ONE_DOT] = entry2.getChildren().sort(); + }); + return watchList; + } + emitWithAll(event, args) { + this.emit(...args); + if (event !== EV_ERROR) + this.emit(EV_ALL, ...args); + } + // Common helpers + // -------------- + /** + * Normalize and emit events. + * Calling _emit DOES NOT MEAN emit() would be called! + * @param {EventName} event Type of event + * @param {Path} path File or directory path + * @param {*=} val1 arguments to be passed with event + * @param {*=} val2 + * @param {*=} val3 + * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag + */ + async _emit(event, path3, val1, val2, val3) { + if (this.closed) + return; + const opts = this.options; + if (isWindows$1) + path3 = sysPath.normalize(path3); + if (opts.cwd) + path3 = sysPath.relative(opts.cwd, path3); + const args = [event, path3]; + if (val3 !== void 0) + args.push(val1, val2, val3); + else if (val2 !== void 0) + args.push(val1, val2); + else if (val1 !== void 0) + args.push(val1); + const awf = opts.awaitWriteFinish; + let pw; + if (awf && (pw = this._pendingWrites.get(path3))) { + pw.lastChange = /* @__PURE__ */ new Date(); + return this; + } + if (opts.atomic) { + if (event === EV_UNLINK) { + this._pendingUnlinks.set(path3, args); + setTimeout(() => { + this._pendingUnlinks.forEach((entry2, path4) => { + this.emit(...entry2); + this.emit(EV_ALL, ...entry2); + this._pendingUnlinks.delete(path4); + }); + }, typeof opts.atomic === "number" ? opts.atomic : 100); + return this; + } + if (event === EV_ADD && this._pendingUnlinks.has(path3)) { + event = args[0] = EV_CHANGE; + this._pendingUnlinks.delete(path3); + } + } + if (awf && (event === EV_ADD || event === EV_CHANGE) && this._readyEmitted) { + const awfEmit = (err, stats) => { + if (err) { + event = args[0] = EV_ERROR; + args[1] = err; + this.emitWithAll(event, args); + } else if (stats) { + if (args.length > 2) { + args[2] = stats; + } else { + args.push(stats); + } + this.emitWithAll(event, args); + } + }; + this._awaitWriteFinish(path3, awf.stabilityThreshold, event, awfEmit); + return this; + } + if (event === EV_CHANGE) { + const isThrottled = !this._throttle(EV_CHANGE, path3, 50); + if (isThrottled) + return this; + } + if (opts.alwaysStat && val1 === void 0 && (event === EV_ADD || event === EV_ADD_DIR || event === EV_CHANGE)) { + const fullPath = opts.cwd ? sysPath.join(opts.cwd, path3) : path3; + let stats; + try { + stats = await stat(fullPath); + } catch (err) { + } + if (!stats || this.closed) + return; + args.push(stats); + } + this.emitWithAll(event, args); + return this; + } + /** + * Common handler for errors + * @param {Error} error + * @returns {Error|Boolean} The error if defined, otherwise the value of the FSWatcher instance's `closed` flag + */ + _handleError(error2) { + const code = error2 && error2.code; + if (error2 && code !== "ENOENT" && code !== "ENOTDIR" && (!this.options.ignorePermissionErrors || code !== "EPERM" && code !== "EACCES")) { + this.emit(EV_ERROR, error2); + } + return error2 || this.closed; + } + /** + * Helper utility for throttling + * @param {ThrottleType} actionType type being throttled + * @param {Path} path being acted upon + * @param {Number} timeout duration of time to suppress duplicate actions + * @returns {Object|false} tracking object or false if action should be suppressed + */ + _throttle(actionType, path3, timeout2) { + if (!this._throttled.has(actionType)) { + this._throttled.set(actionType, /* @__PURE__ */ new Map()); + } + const action = this._throttled.get(actionType); + const actionPath = action.get(path3); + if (actionPath) { + actionPath.count++; + return false; + } + let timeoutObject; + const clear = () => { + const item = action.get(path3); + const count = item ? item.count : 0; + action.delete(path3); + clearTimeout(timeoutObject); + if (item) + clearTimeout(item.timeoutObject); + return count; + }; + timeoutObject = setTimeout(clear, timeout2); + const thr = { timeoutObject, clear, count: 0 }; + action.set(path3, thr); + return thr; + } + _incrReadyCount() { + return this._readyCount++; + } + /** + * Awaits write operation to finish. + * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback. + * @param {Path} path being acted upon + * @param {Number} threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished + * @param {EventName} event + * @param {Function} awfEmit Callback to be called when ready for event to be emitted. + */ + _awaitWriteFinish(path3, threshold, event, awfEmit) { + let timeoutHandler; + let fullPath = path3; + if (this.options.cwd && !sysPath.isAbsolute(path3)) { + fullPath = sysPath.join(this.options.cwd, path3); + } + const now = /* @__PURE__ */ new Date(); + const awaitWriteFinish = (prevStat) => { + fs$5.stat(fullPath, (err, curStat) => { + if (err || !this._pendingWrites.has(path3)) { + if (err && err.code !== "ENOENT") + awfEmit(err); + return; + } + const now2 = Number(/* @__PURE__ */ new Date()); + if (prevStat && curStat.size !== prevStat.size) { + this._pendingWrites.get(path3).lastChange = now2; + } + const pw = this._pendingWrites.get(path3); + const df = now2 - pw.lastChange; + if (df >= threshold) { + this._pendingWrites.delete(path3); + awfEmit(void 0, curStat); + } else { + timeoutHandler = setTimeout( + awaitWriteFinish, + this.options.awaitWriteFinish.pollInterval, + curStat + ); + } + }); + }; + if (!this._pendingWrites.has(path3)) { + this._pendingWrites.set(path3, { + lastChange: now, + cancelWait: () => { + this._pendingWrites.delete(path3); + clearTimeout(timeoutHandler); + return event; + } + }); + timeoutHandler = setTimeout( + awaitWriteFinish, + this.options.awaitWriteFinish.pollInterval + ); + } + } + _getGlobIgnored() { + return [...this._ignoredPaths.values()]; + } + /** + * Determines whether user has asked to ignore this path. + * @param {Path} path filepath or dir + * @param {fs.Stats=} stats result of fs.stat + * @returns {Boolean} + */ + _isIgnored(path3, stats) { + if (this.options.atomic && DOT_RE.test(path3)) + return true; + if (!this._userIgnored) { + const { cwd } = this.options; + const ign = this.options.ignored; + const ignored = ign && ign.map(normalizeIgnored(cwd)); + const paths = arrify(ignored).filter((path4) => typeof path4 === STRING_TYPE && !isGlob2(path4)).map((path4) => path4 + SLASH_GLOBSTAR); + const list = this._getGlobIgnored().map(normalizeIgnored(cwd)).concat(ignored, paths); + this._userIgnored = anymatch(list, void 0, ANYMATCH_OPTS); + } + return this._userIgnored([path3, stats]); + } + _isntIgnored(path3, stat2) { + return !this._isIgnored(path3, stat2); + } + /** + * Provides a set of common helpers and properties relating to symlink and glob handling. + * @param {Path} path file, directory, or glob pattern being watched + * @param {Number=} depth at any depth > 0, this isn't a glob + * @returns {WatchHelper} object containing helpers for this path + */ + _getWatchHelpers(path3, depth2) { + const watchPath = depth2 || this.options.disableGlobbing || !isGlob2(path3) ? path3 : globParent2(path3); + const follow = this.options.followSymlinks; + return new WatchHelper(path3, watchPath, follow, this); + } + // Directory helpers + // ----------------- + /** + * Provides directory tracking objects + * @param {String} directory path of the directory + * @returns {DirEntry} the directory's tracking object + */ + _getWatchedDir(directory) { + if (!this._boundRemove) + this._boundRemove = this._remove.bind(this); + const dir = sysPath.resolve(directory); + if (!this._watched.has(dir)) + this._watched.set(dir, new DirEntry(dir, this._boundRemove)); + return this._watched.get(dir); + } + // File helpers + // ------------ + /** + * Check for read permissions. + * Based on this answer on SO: https://stackoverflow.com/a/11781404/1358405 + * @param {fs.Stats} stats - object, result of fs_stat + * @returns {Boolean} indicates whether the file can be read + */ + _hasReadPermissions(stats) { + if (this.options.ignorePermissionErrors) + return true; + const md = stats && Number.parseInt(stats.mode, 10); + const st = md & 511; + const it = Number.parseInt(st.toString(8)[0], 10); + return Boolean(4 & it); + } + /** + * Handles emitting unlink events for + * files and directories, and via recursion, for + * files and directories within directories that are unlinked + * @param {String} directory within which the following item is located + * @param {String} item base path of item/directory + * @returns {void} + */ + _remove(directory, item, isDirectory) { + const path3 = sysPath.join(directory, item); + const fullPath = sysPath.resolve(path3); + isDirectory = isDirectory != null ? isDirectory : this._watched.has(path3) || this._watched.has(fullPath); + if (!this._throttle("remove", path3, 100)) + return; + if (!isDirectory && !this.options.useFsEvents && this._watched.size === 1) { + this.add(directory, item, true); + } + const wp = this._getWatchedDir(path3); + const nestedDirectoryChildren = wp.getChildren(); + nestedDirectoryChildren.forEach((nested) => this._remove(path3, nested)); + const parent = this._getWatchedDir(directory); + const wasTracked = parent.has(item); + parent.remove(item); + if (this._symlinkPaths.has(fullPath)) { + this._symlinkPaths.delete(fullPath); + } + let relPath = path3; + if (this.options.cwd) + relPath = sysPath.relative(this.options.cwd, path3); + if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) { + const event = this._pendingWrites.get(relPath).cancelWait(); + if (event === EV_ADD) + return; + } + this._watched.delete(path3); + this._watched.delete(fullPath); + const eventName = isDirectory ? EV_UNLINK_DIR : EV_UNLINK; + if (wasTracked && !this._isIgnored(path3)) + this._emit(eventName, path3); + if (!this.options.useFsEvents) { + this._closePath(path3); + } + } + /** + * Closes all watchers for a path + * @param {Path} path + */ + _closePath(path3) { + this._closeFile(path3); + const dir = sysPath.dirname(path3); + this._getWatchedDir(dir).remove(sysPath.basename(path3)); + } + /** + * Closes only file-specific watchers + * @param {Path} path + */ + _closeFile(path3) { + const closers = this._closers.get(path3); + if (!closers) + return; + closers.forEach((closer) => closer()); + this._closers.delete(path3); + } + /** + * + * @param {Path} path + * @param {Function} closer + */ + _addPathCloser(path3, closer) { + if (!closer) + return; + let list = this._closers.get(path3); + if (!list) { + list = []; + this._closers.set(path3, list); + } + list.push(closer); + } + _readdirp(root, opts) { + if (this.closed) + return; + const options2 = { type: EV_ALL, alwaysStat: true, lstat: true, ...opts }; + let stream4 = readdirp(root, options2); + this._streams.add(stream4); + stream4.once(STR_CLOSE, () => { + stream4 = void 0; + }); + stream4.once(STR_END, () => { + if (stream4) { + this._streams.delete(stream4); + stream4 = void 0; + } + }); + return stream4; + } + }; + chokidar.FSWatcher = FSWatcher; + watch = (paths, options2) => { + const watcher = new FSWatcher(options2); + watcher.add(paths); + return watcher; + }; + chokidar.watch = watch; + shellQuote$1 = {}; + shellQuote$1.quote = function(xs) { + return xs.map(function(s) { + if (s && typeof s === "object") { + return s.op.replace(/(.)/g, "\\$1"); + } else if (/["\s]/.test(s) && !/'/.test(s)) { + return "'" + s.replace(/(['\\])/g, "\\$1") + "'"; + } else if (/["'\s]/.test(s)) { + return '"' + s.replace(/(["\\$`!])/g, "\\$1") + '"'; + } else { + return String(s).replace(/([A-Za-z]:)?([#!"$&'()*,:;<=>?@\[\\\]^`{|}])/g, "$1\\$2"); + } + }).join(" "); + }; + CONTROL = "(?:" + [ + "\\|\\|", + "\\&\\&", + ";;", + "\\|\\&", + "\\<\\(", + ">>", + ">\\&", + "[&;()|<>]" + ].join("|") + ")"; + META = "|&;()<> \\t"; + BAREWORD = `(\\\\['"` + META + `]|[^\\s'"` + META + "])+"; + SINGLE_QUOTE = '"((\\\\"|[^"])*?)"'; + DOUBLE_QUOTE = "'((\\\\'|[^'])*?)'"; + TOKEN = ""; + for (i = 0; i < 4; i++) { + TOKEN += (Math.pow(16, 8) * Math.random()).toString(16); + } + shellQuote$1.parse = function(s, env2, opts) { + var mapped = parse$5(s, env2, opts); + if (typeof env2 !== "function") + return mapped; + return mapped.reduce(function(acc, s2) { + if (typeof s2 === "object") + return acc.concat(s2); + var xs = s2.split(RegExp("(" + TOKEN + ".*?" + TOKEN + ")", "g")); + if (xs.length === 1) + return acc.concat(xs[0]); + return acc.concat(xs.filter(Boolean).map(function(x) { + if (RegExp("^" + TOKEN).test(x)) { + return JSON.parse(x.split(TOKEN)[1]); + } else + return x; + })); + }, []); + }; + try { + new Function("throw new Error(1)")(); + } catch (e) { + const match = /:(\d+):\d+\)$/.exec(e.stack.split("\n")[1]); + offset2 = match ? +match[1] - 1 : 0; + } + bufferUtilExports = {}; + bufferUtil$1 = { + get exports() { + return bufferUtilExports; + }, + set exports(v) { + bufferUtilExports = v; + } + }; + constants = { + BINARY_TYPES: ["nodebuffer", "arraybuffer", "fragments"], + EMPTY_BUFFER: Buffer.alloc(0), + GUID: "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", + kForOnEventAttribute: Symbol("kIsForOnEventAttribute"), + kListener: Symbol("kListener"), + kStatusCode: Symbol("status-code"), + kWebSocket: Symbol("websocket"), + NOOP: () => { + } + }; + ({ EMPTY_BUFFER: EMPTY_BUFFER$3 } = constants); + FastBuffer$2 = Buffer[Symbol.species]; + bufferUtil$1.exports = { + concat: concat$1, + mask: _mask, + toArrayBuffer: toArrayBuffer$1, + toBuffer: toBuffer$2, + unmask: _unmask + }; + if (!process.env.WS_NO_BUFFER_UTIL) { + try { + const bufferUtil2 = require2("bufferutil"); + bufferUtilExports.mask = function(source, mask, output, offset3, length) { + if (length < 48) + _mask(source, mask, output, offset3, length); + else + bufferUtil2.mask(source, mask, output, offset3, length); + }; + bufferUtilExports.unmask = function(buffer, mask) { + if (buffer.length < 32) + _unmask(buffer, mask); + else + bufferUtil2.unmask(buffer, mask); + }; + } catch (e) { + } + } + kDone = Symbol("kDone"); + kRun = Symbol("kRun"); + Limiter$1 = class Limiter { + /** + * Creates a new `Limiter`. + * + * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed + * to run concurrently + */ + constructor(concurrency) { + this[kDone] = () => { + this.pending--; + this[kRun](); + }; + this.concurrency = concurrency || Infinity; + this.jobs = []; + this.pending = 0; + } + /** + * Adds a job to the queue. + * + * @param {Function} job The job to run + * @public + */ + add(job) { + this.jobs.push(job); + this[kRun](); + } + /** + * Removes a job from the queue and runs it if possible. + * + * @private + */ + [kRun]() { + if (this.pending === this.concurrency) + return; + if (this.jobs.length) { + const job = this.jobs.shift(); + this.pending++; + job(this[kDone]); + } + } + }; + limiter = Limiter$1; + zlib = require$$0$a; + bufferUtil = bufferUtilExports; + Limiter2 = limiter; + ({ kStatusCode: kStatusCode$2 } = constants); + FastBuffer$1 = Buffer[Symbol.species]; + TRAILER = Buffer.from([0, 0, 255, 255]); + kPerMessageDeflate = Symbol("permessage-deflate"); + kTotalLength = Symbol("total-length"); + kCallback = Symbol("callback"); + kBuffers = Symbol("buffers"); + kError$1 = Symbol("error"); + PerMessageDeflate$4 = class PerMessageDeflate { + /** + * Creates a PerMessageDeflate instance. + * + * @param {Object} [options] Configuration options + * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support + * for, or request, a custom client window size + * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/ + * acknowledge disabling of client context takeover + * @param {Number} [options.concurrencyLimit=10] The number of concurrent + * calls to zlib + * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the + * use of a custom server window size + * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept + * disabling of server context takeover + * @param {Number} [options.threshold=1024] Size (in bytes) below which + * messages should not be compressed if context takeover is disabled + * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on + * deflate + * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on + * inflate + * @param {Boolean} [isServer=false] Create the instance in either server or + * client mode + * @param {Number} [maxPayload=0] The maximum allowed message length + */ + constructor(options2, isServer, maxPayload) { + this._maxPayload = maxPayload | 0; + this._options = options2 || {}; + this._threshold = this._options.threshold !== void 0 ? this._options.threshold : 1024; + this._isServer = !!isServer; + this._deflate = null; + this._inflate = null; + this.params = null; + if (!zlibLimiter) { + const concurrency = this._options.concurrencyLimit !== void 0 ? this._options.concurrencyLimit : 10; + zlibLimiter = new Limiter2(concurrency); + } + } + /** + * @type {String} + */ + static get extensionName() { + return "permessage-deflate"; + } + /** + * Create an extension negotiation offer. + * + * @return {Object} Extension parameters + * @public + */ + offer() { + const params = {}; + if (this._options.serverNoContextTakeover) { + params.server_no_context_takeover = true; + } + if (this._options.clientNoContextTakeover) { + params.client_no_context_takeover = true; + } + if (this._options.serverMaxWindowBits) { + params.server_max_window_bits = this._options.serverMaxWindowBits; + } + if (this._options.clientMaxWindowBits) { + params.client_max_window_bits = this._options.clientMaxWindowBits; + } else if (this._options.clientMaxWindowBits == null) { + params.client_max_window_bits = true; + } + return params; + } + /** + * Accept an extension negotiation offer/response. + * + * @param {Array} configurations The extension negotiation offers/reponse + * @return {Object} Accepted configuration + * @public + */ + accept(configurations) { + configurations = this.normalizeParams(configurations); + this.params = this._isServer ? this.acceptAsServer(configurations) : this.acceptAsClient(configurations); + return this.params; + } + /** + * Releases all resources used by the extension. + * + * @public + */ + cleanup() { + if (this._inflate) { + this._inflate.close(); + this._inflate = null; + } + if (this._deflate) { + const callback = this._deflate[kCallback]; + this._deflate.close(); + this._deflate = null; + if (callback) { + callback( + new Error( + "The deflate stream was closed while data was being processed" + ) + ); + } + } + } + /** + * Accept an extension negotiation offer. + * + * @param {Array} offers The extension negotiation offers + * @return {Object} Accepted configuration + * @private + */ + acceptAsServer(offers) { + const opts = this._options; + const accepted = offers.find((params) => { + if (opts.serverNoContextTakeover === false && params.server_no_context_takeover || params.server_max_window_bits && (opts.serverMaxWindowBits === false || typeof opts.serverMaxWindowBits === "number" && opts.serverMaxWindowBits > params.server_max_window_bits) || typeof opts.clientMaxWindowBits === "number" && !params.client_max_window_bits) { + return false; + } + return true; + }); + if (!accepted) { + throw new Error("None of the extension offers can be accepted"); + } + if (opts.serverNoContextTakeover) { + accepted.server_no_context_takeover = true; + } + if (opts.clientNoContextTakeover) { + accepted.client_no_context_takeover = true; + } + if (typeof opts.serverMaxWindowBits === "number") { + accepted.server_max_window_bits = opts.serverMaxWindowBits; + } + if (typeof opts.clientMaxWindowBits === "number") { + accepted.client_max_window_bits = opts.clientMaxWindowBits; + } else if (accepted.client_max_window_bits === true || opts.clientMaxWindowBits === false) { + delete accepted.client_max_window_bits; + } + return accepted; + } + /** + * Accept the extension negotiation response. + * + * @param {Array} response The extension negotiation response + * @return {Object} Accepted configuration + * @private + */ + acceptAsClient(response) { + const params = response[0]; + if (this._options.clientNoContextTakeover === false && params.client_no_context_takeover) { + throw new Error('Unexpected parameter "client_no_context_takeover"'); + } + if (!params.client_max_window_bits) { + if (typeof this._options.clientMaxWindowBits === "number") { + params.client_max_window_bits = this._options.clientMaxWindowBits; + } + } else if (this._options.clientMaxWindowBits === false || typeof this._options.clientMaxWindowBits === "number" && params.client_max_window_bits > this._options.clientMaxWindowBits) { + throw new Error( + 'Unexpected or invalid parameter "client_max_window_bits"' + ); + } + return params; + } + /** + * Normalize parameters. + * + * @param {Array} configurations The extension negotiation offers/reponse + * @return {Array} The offers/response with normalized parameters + * @private + */ + normalizeParams(configurations) { + configurations.forEach((params) => { + Object.keys(params).forEach((key) => { + let value2 = params[key]; + if (value2.length > 1) { + throw new Error(`Parameter "${key}" must have only a single value`); + } + value2 = value2[0]; + if (key === "client_max_window_bits") { + if (value2 !== true) { + const num = +value2; + if (!Number.isInteger(num) || num < 8 || num > 15) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value2}` + ); + } + value2 = num; + } else if (!this._isServer) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value2}` + ); + } + } else if (key === "server_max_window_bits") { + const num = +value2; + if (!Number.isInteger(num) || num < 8 || num > 15) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value2}` + ); + } + value2 = num; + } else if (key === "client_no_context_takeover" || key === "server_no_context_takeover") { + if (value2 !== true) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value2}` + ); + } + } else { + throw new Error(`Unknown parameter "${key}"`); + } + params[key] = value2; + }); + }); + return configurations; + } + /** + * Decompress data. Concurrency limited. + * + * @param {Buffer} data Compressed data + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @public + */ + decompress(data2, fin, callback) { + zlibLimiter.add((done) => { + this._decompress(data2, fin, (err, result) => { + done(); + callback(err, result); + }); + }); + } + /** + * Compress data. Concurrency limited. + * + * @param {(Buffer|String)} data Data to compress + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @public + */ + compress(data2, fin, callback) { + zlibLimiter.add((done) => { + this._compress(data2, fin, (err, result) => { + done(); + callback(err, result); + }); + }); + } + /** + * Decompress data. + * + * @param {Buffer} data Compressed data + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @private + */ + _decompress(data2, fin, callback) { + const endpoint = this._isServer ? "client" : "server"; + if (!this._inflate) { + const key = `${endpoint}_max_window_bits`; + const windowBits = typeof this.params[key] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key]; + this._inflate = zlib.createInflateRaw({ + ...this._options.zlibInflateOptions, + windowBits + }); + this._inflate[kPerMessageDeflate] = this; + this._inflate[kTotalLength] = 0; + this._inflate[kBuffers] = []; + this._inflate.on("error", inflateOnError); + this._inflate.on("data", inflateOnData); + } + this._inflate[kCallback] = callback; + this._inflate.write(data2); + if (fin) + this._inflate.write(TRAILER); + this._inflate.flush(() => { + const err = this._inflate[kError$1]; + if (err) { + this._inflate.close(); + this._inflate = null; + callback(err); + return; + } + const data3 = bufferUtil.concat( + this._inflate[kBuffers], + this._inflate[kTotalLength] + ); + if (this._inflate._readableState.endEmitted) { + this._inflate.close(); + this._inflate = null; + } else { + this._inflate[kTotalLength] = 0; + this._inflate[kBuffers] = []; + if (fin && this.params[`${endpoint}_no_context_takeover`]) { + this._inflate.reset(); + } + } + callback(null, data3); + }); + } + /** + * Compress data. + * + * @param {(Buffer|String)} data Data to compress + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @private + */ + _compress(data2, fin, callback) { + const endpoint = this._isServer ? "server" : "client"; + if (!this._deflate) { + const key = `${endpoint}_max_window_bits`; + const windowBits = typeof this.params[key] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key]; + this._deflate = zlib.createDeflateRaw({ + ...this._options.zlibDeflateOptions, + windowBits + }); + this._deflate[kTotalLength] = 0; + this._deflate[kBuffers] = []; + this._deflate.on("data", deflateOnData); + } + this._deflate[kCallback] = callback; + this._deflate.write(data2); + this._deflate.flush(zlib.Z_SYNC_FLUSH, () => { + if (!this._deflate) { + return; + } + let data3 = bufferUtil.concat( + this._deflate[kBuffers], + this._deflate[kTotalLength] + ); + if (fin) { + data3 = new FastBuffer$1(data3.buffer, data3.byteOffset, data3.length - 4); + } + this._deflate[kCallback] = null; + this._deflate[kTotalLength] = 0; + this._deflate[kBuffers] = []; + if (fin && this.params[`${endpoint}_no_context_takeover`]) { + this._deflate.reset(); + } + callback(null, data3); + }); + } + }; + permessageDeflate = PerMessageDeflate$4; + validationExports = {}; + validation = { + get exports() { + return validationExports; + }, + set exports(v) { + validationExports = v; + } + }; + ({ isUtf8 } = require$$0$b); + tokenChars$2 = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 0 - 15 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 16 - 31 + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + // 32 - 47 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + // 48 - 63 + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + // 64 - 79 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + // 80 - 95 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + // 96 - 111 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0 + // 112 - 127 + ]; + validation.exports = { + isValidStatusCode: isValidStatusCode$2, + isValidUTF8: _isValidUTF8, + tokenChars: tokenChars$2 + }; + if (isUtf8) { + validationExports.isValidUTF8 = function(buf) { + return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf); + }; + } else if (!process.env.WS_NO_UTF_8_VALIDATE) { + try { + const isValidUTF82 = require2("utf-8-validate"); + validationExports.isValidUTF8 = function(buf) { + return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF82(buf); + }; + } catch (e) { + } + } + ({ Writable: Writable$1 } = require$$0$7); + PerMessageDeflate$3 = permessageDeflate; + ({ + BINARY_TYPES: BINARY_TYPES$1, + EMPTY_BUFFER: EMPTY_BUFFER$2, + kStatusCode: kStatusCode$1, + kWebSocket: kWebSocket$2 + } = constants); + ({ concat, toArrayBuffer, unmask } = bufferUtilExports); + ({ isValidStatusCode: isValidStatusCode$1, isValidUTF8 } = validationExports); + FastBuffer = Buffer[Symbol.species]; + GET_INFO = 0; + GET_PAYLOAD_LENGTH_16 = 1; + GET_PAYLOAD_LENGTH_64 = 2; + GET_MASK = 3; + GET_DATA = 4; + INFLATING = 5; + Receiver$1 = class Receiver extends Writable$1 { + /** + * Creates a Receiver instance. + * + * @param {Object} [options] Options object + * @param {String} [options.binaryType=nodebuffer] The type for binary data + * @param {Object} [options.extensions] An object containing the negotiated + * extensions + * @param {Boolean} [options.isServer=false] Specifies whether to operate in + * client or server mode + * @param {Number} [options.maxPayload=0] The maximum allowed message length + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + */ + constructor(options2 = {}) { + super(); + this._binaryType = options2.binaryType || BINARY_TYPES$1[0]; + this._extensions = options2.extensions || {}; + this._isServer = !!options2.isServer; + this._maxPayload = options2.maxPayload | 0; + this._skipUTF8Validation = !!options2.skipUTF8Validation; + this[kWebSocket$2] = void 0; + this._bufferedBytes = 0; + this._buffers = []; + this._compressed = false; + this._payloadLength = 0; + this._mask = void 0; + this._fragmented = 0; + this._masked = false; + this._fin = false; + this._opcode = 0; + this._totalPayloadLength = 0; + this._messageLength = 0; + this._fragments = []; + this._state = GET_INFO; + this._loop = false; + } + /** + * Implements `Writable.prototype._write()`. + * + * @param {Buffer} chunk The chunk of data to write + * @param {String} encoding The character encoding of `chunk` + * @param {Function} cb Callback + * @private + */ + _write(chunk, encoding, cb) { + if (this._opcode === 8 && this._state == GET_INFO) + return cb(); + this._bufferedBytes += chunk.length; + this._buffers.push(chunk); + this.startLoop(cb); + } + /** + * Consumes `n` bytes from the buffered data. + * + * @param {Number} n The number of bytes to consume + * @return {Buffer} The consumed bytes + * @private + */ + consume(n) { + this._bufferedBytes -= n; + if (n === this._buffers[0].length) + return this._buffers.shift(); + if (n < this._buffers[0].length) { + const buf = this._buffers[0]; + this._buffers[0] = new FastBuffer( + buf.buffer, + buf.byteOffset + n, + buf.length - n + ); + return new FastBuffer(buf.buffer, buf.byteOffset, n); + } + const dst = Buffer.allocUnsafe(n); + do { + const buf = this._buffers[0]; + const offset3 = dst.length - n; + if (n >= buf.length) { + dst.set(this._buffers.shift(), offset3); + } else { + dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset3); + this._buffers[0] = new FastBuffer( + buf.buffer, + buf.byteOffset + n, + buf.length - n + ); + } + n -= buf.length; + } while (n > 0); + return dst; + } + /** + * Starts the parsing loop. + * + * @param {Function} cb Callback + * @private + */ + startLoop(cb) { + let err; + this._loop = true; + do { + switch (this._state) { + case GET_INFO: + err = this.getInfo(); + break; + case GET_PAYLOAD_LENGTH_16: + err = this.getPayloadLength16(); + break; + case GET_PAYLOAD_LENGTH_64: + err = this.getPayloadLength64(); + break; + case GET_MASK: + this.getMask(); + break; + case GET_DATA: + err = this.getData(cb); + break; + default: + this._loop = false; + return; + } + } while (this._loop); + cb(err); + } + /** + * Reads the first two bytes of a frame. + * + * @return {(RangeError|undefined)} A possible error + * @private + */ + getInfo() { + if (this._bufferedBytes < 2) { + this._loop = false; + return; + } + const buf = this.consume(2); + if ((buf[0] & 48) !== 0) { + this._loop = false; + return error( + RangeError, + "RSV2 and RSV3 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_2_3" + ); + } + const compressed = (buf[0] & 64) === 64; + if (compressed && !this._extensions[PerMessageDeflate$3.extensionName]) { + this._loop = false; + return error( + RangeError, + "RSV1 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_1" + ); + } + this._fin = (buf[0] & 128) === 128; + this._opcode = buf[0] & 15; + this._payloadLength = buf[1] & 127; + if (this._opcode === 0) { + if (compressed) { + this._loop = false; + return error( + RangeError, + "RSV1 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_1" + ); + } + if (!this._fragmented) { + this._loop = false; + return error( + RangeError, + "invalid opcode 0", + true, + 1002, + "WS_ERR_INVALID_OPCODE" + ); + } + this._opcode = this._fragmented; + } else if (this._opcode === 1 || this._opcode === 2) { + if (this._fragmented) { + this._loop = false; + return error( + RangeError, + `invalid opcode ${this._opcode}`, + true, + 1002, + "WS_ERR_INVALID_OPCODE" + ); + } + this._compressed = compressed; + } else if (this._opcode > 7 && this._opcode < 11) { + if (!this._fin) { + this._loop = false; + return error( + RangeError, + "FIN must be set", + true, + 1002, + "WS_ERR_EXPECTED_FIN" + ); + } + if (compressed) { + this._loop = false; + return error( + RangeError, + "RSV1 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_1" + ); + } + if (this._payloadLength > 125 || this._opcode === 8 && this._payloadLength === 1) { + this._loop = false; + return error( + RangeError, + `invalid payload length ${this._payloadLength}`, + true, + 1002, + "WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH" + ); + } + } else { + this._loop = false; + return error( + RangeError, + `invalid opcode ${this._opcode}`, + true, + 1002, + "WS_ERR_INVALID_OPCODE" + ); + } + if (!this._fin && !this._fragmented) + this._fragmented = this._opcode; + this._masked = (buf[1] & 128) === 128; + if (this._isServer) { + if (!this._masked) { + this._loop = false; + return error( + RangeError, + "MASK must be set", + true, + 1002, + "WS_ERR_EXPECTED_MASK" + ); + } + } else if (this._masked) { + this._loop = false; + return error( + RangeError, + "MASK must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_MASK" + ); + } + if (this._payloadLength === 126) + this._state = GET_PAYLOAD_LENGTH_16; + else if (this._payloadLength === 127) + this._state = GET_PAYLOAD_LENGTH_64; + else + return this.haveLength(); + } + /** + * Gets extended payload length (7+16). + * + * @return {(RangeError|undefined)} A possible error + * @private + */ + getPayloadLength16() { + if (this._bufferedBytes < 2) { + this._loop = false; + return; + } + this._payloadLength = this.consume(2).readUInt16BE(0); + return this.haveLength(); + } + /** + * Gets extended payload length (7+64). + * + * @return {(RangeError|undefined)} A possible error + * @private + */ + getPayloadLength64() { + if (this._bufferedBytes < 8) { + this._loop = false; + return; + } + const buf = this.consume(8); + const num = buf.readUInt32BE(0); + if (num > Math.pow(2, 53 - 32) - 1) { + this._loop = false; + return error( + RangeError, + "Unsupported WebSocket frame: payload length > 2^53 - 1", + false, + 1009, + "WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH" + ); + } + this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4); + return this.haveLength(); + } + /** + * Payload length has been read. + * + * @return {(RangeError|undefined)} A possible error + * @private + */ + haveLength() { + if (this._payloadLength && this._opcode < 8) { + this._totalPayloadLength += this._payloadLength; + if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) { + this._loop = false; + return error( + RangeError, + "Max payload size exceeded", + false, + 1009, + "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH" + ); + } + } + if (this._masked) + this._state = GET_MASK; + else + this._state = GET_DATA; + } + /** + * Reads mask bytes. + * + * @private + */ + getMask() { + if (this._bufferedBytes < 4) { + this._loop = false; + return; + } + this._mask = this.consume(4); + this._state = GET_DATA; + } + /** + * Reads data bytes. + * + * @param {Function} cb Callback + * @return {(Error|RangeError|undefined)} A possible error + * @private + */ + getData(cb) { + let data2 = EMPTY_BUFFER$2; + if (this._payloadLength) { + if (this._bufferedBytes < this._payloadLength) { + this._loop = false; + return; + } + data2 = this.consume(this._payloadLength); + if (this._masked && (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0) { + unmask(data2, this._mask); + } + } + if (this._opcode > 7) + return this.controlMessage(data2); + if (this._compressed) { + this._state = INFLATING; + this.decompress(data2, cb); + return; + } + if (data2.length) { + this._messageLength = this._totalPayloadLength; + this._fragments.push(data2); + } + return this.dataMessage(); + } + /** + * Decompresses data. + * + * @param {Buffer} data Compressed data + * @param {Function} cb Callback + * @private + */ + decompress(data2, cb) { + const perMessageDeflate = this._extensions[PerMessageDeflate$3.extensionName]; + perMessageDeflate.decompress(data2, this._fin, (err, buf) => { + if (err) + return cb(err); + if (buf.length) { + this._messageLength += buf.length; + if (this._messageLength > this._maxPayload && this._maxPayload > 0) { + return cb( + error( + RangeError, + "Max payload size exceeded", + false, + 1009, + "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH" + ) + ); + } + this._fragments.push(buf); + } + const er = this.dataMessage(); + if (er) + return cb(er); + this.startLoop(cb); + }); + } + /** + * Handles a data message. + * + * @return {(Error|undefined)} A possible error + * @private + */ + dataMessage() { + if (this._fin) { + const messageLength = this._messageLength; + const fragments = this._fragments; + this._totalPayloadLength = 0; + this._messageLength = 0; + this._fragmented = 0; + this._fragments = []; + if (this._opcode === 2) { + let data2; + if (this._binaryType === "nodebuffer") { + data2 = concat(fragments, messageLength); + } else if (this._binaryType === "arraybuffer") { + data2 = toArrayBuffer(concat(fragments, messageLength)); + } else { + data2 = fragments; + } + this.emit("message", data2, true); + } else { + const buf = concat(fragments, messageLength); + if (!this._skipUTF8Validation && !isValidUTF8(buf)) { + this._loop = false; + return error( + Error, + "invalid UTF-8 sequence", + true, + 1007, + "WS_ERR_INVALID_UTF8" + ); + } + this.emit("message", buf, false); + } + } + this._state = GET_INFO; + } + /** + * Handles a control message. + * + * @param {Buffer} data Data to handle + * @return {(Error|RangeError|undefined)} A possible error + * @private + */ + controlMessage(data2) { + if (this._opcode === 8) { + this._loop = false; + if (data2.length === 0) { + this.emit("conclude", 1005, EMPTY_BUFFER$2); + this.end(); + } else { + const code = data2.readUInt16BE(0); + if (!isValidStatusCode$1(code)) { + return error( + RangeError, + `invalid status code ${code}`, + true, + 1002, + "WS_ERR_INVALID_CLOSE_CODE" + ); + } + const buf = new FastBuffer( + data2.buffer, + data2.byteOffset + 2, + data2.length - 2 + ); + if (!this._skipUTF8Validation && !isValidUTF8(buf)) { + return error( + Error, + "invalid UTF-8 sequence", + true, + 1007, + "WS_ERR_INVALID_UTF8" + ); + } + this.emit("conclude", code, buf); + this.end(); + } + } else if (this._opcode === 9) { + this.emit("ping", data2); + } else { + this.emit("pong", data2); + } + this._state = GET_INFO; + } + }; + receiver = Receiver$1; + ({ randomFillSync } = require$$5$1); + PerMessageDeflate$2 = permessageDeflate; + ({ EMPTY_BUFFER: EMPTY_BUFFER$1 } = constants); + ({ isValidStatusCode } = validationExports); + ({ mask: applyMask, toBuffer: toBuffer$1 } = bufferUtilExports); + kByteLength = Symbol("kByteLength"); + maskBuffer = Buffer.alloc(4); + Sender$1 = class Sender { + /** + * Creates a Sender instance. + * + * @param {(net.Socket|tls.Socket)} socket The connection socket + * @param {Object} [extensions] An object containing the negotiated extensions + * @param {Function} [generateMask] The function used to generate the masking + * key + */ + constructor(socket, extensions2, generateMask) { + this._extensions = extensions2 || {}; + if (generateMask) { + this._generateMask = generateMask; + this._maskBuffer = Buffer.alloc(4); + } + this._socket = socket; + this._firstFragment = true; + this._compress = false; + this._bufferedBytes = 0; + this._deflating = false; + this._queue = []; + } + /** + * Frames a piece of data according to the HyBi WebSocket protocol. + * + * @param {(Buffer|String)} data The data to frame + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @return {(Buffer|String)[]} The framed data + * @public + */ + static frame(data2, options2) { + let mask; + let merge = false; + let offset3 = 2; + let skipMasking = false; + if (options2.mask) { + mask = options2.maskBuffer || maskBuffer; + if (options2.generateMask) { + options2.generateMask(mask); + } else { + randomFillSync(mask, 0, 4); + } + skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0; + offset3 = 6; + } + let dataLength; + if (typeof data2 === "string") { + if ((!options2.mask || skipMasking) && options2[kByteLength] !== void 0) { + dataLength = options2[kByteLength]; + } else { + data2 = Buffer.from(data2); + dataLength = data2.length; + } + } else { + dataLength = data2.length; + merge = options2.mask && options2.readOnly && !skipMasking; + } + let payloadLength = dataLength; + if (dataLength >= 65536) { + offset3 += 8; + payloadLength = 127; + } else if (dataLength > 125) { + offset3 += 2; + payloadLength = 126; + } + const target = Buffer.allocUnsafe(merge ? dataLength + offset3 : offset3); + target[0] = options2.fin ? options2.opcode | 128 : options2.opcode; + if (options2.rsv1) + target[0] |= 64; + target[1] = payloadLength; + if (payloadLength === 126) { + target.writeUInt16BE(dataLength, 2); + } else if (payloadLength === 127) { + target[2] = target[3] = 0; + target.writeUIntBE(dataLength, 4, 6); + } + if (!options2.mask) + return [target, data2]; + target[1] |= 128; + target[offset3 - 4] = mask[0]; + target[offset3 - 3] = mask[1]; + target[offset3 - 2] = mask[2]; + target[offset3 - 1] = mask[3]; + if (skipMasking) + return [target, data2]; + if (merge) { + applyMask(data2, mask, target, offset3, dataLength); + return [target]; + } + applyMask(data2, mask, data2, 0, dataLength); + return [target, data2]; + } + /** + * Sends a close message to the other peer. + * + * @param {Number} [code] The status code component of the body + * @param {(String|Buffer)} [data] The message component of the body + * @param {Boolean} [mask=false] Specifies whether or not to mask the message + * @param {Function} [cb] Callback + * @public + */ + close(code, data2, mask, cb) { + let buf; + if (code === void 0) { + buf = EMPTY_BUFFER$1; + } else if (typeof code !== "number" || !isValidStatusCode(code)) { + throw new TypeError("First argument must be a valid error code number"); + } else if (data2 === void 0 || !data2.length) { + buf = Buffer.allocUnsafe(2); + buf.writeUInt16BE(code, 0); + } else { + const length = Buffer.byteLength(data2); + if (length > 123) { + throw new RangeError("The message must not be greater than 123 bytes"); + } + buf = Buffer.allocUnsafe(2 + length); + buf.writeUInt16BE(code, 0); + if (typeof data2 === "string") { + buf.write(data2, 2); + } else { + buf.set(data2, 2); + } + } + const options2 = { + [kByteLength]: buf.length, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 8, + readOnly: false, + rsv1: false + }; + if (this._deflating) { + this.enqueue([this.dispatch, buf, false, options2, cb]); + } else { + this.sendFrame(Sender.frame(buf, options2), cb); + } + } + /** + * Sends a ping message to the other peer. + * + * @param {*} data The message to send + * @param {Boolean} [mask=false] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback + * @public + */ + ping(data2, mask, cb) { + let byteLength; + let readOnly; + if (typeof data2 === "string") { + byteLength = Buffer.byteLength(data2); + readOnly = false; + } else { + data2 = toBuffer$1(data2); + byteLength = data2.length; + readOnly = toBuffer$1.readOnly; + } + if (byteLength > 125) { + throw new RangeError("The data size must not be greater than 125 bytes"); + } + const options2 = { + [kByteLength]: byteLength, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 9, + readOnly, + rsv1: false + }; + if (this._deflating) { + this.enqueue([this.dispatch, data2, false, options2, cb]); + } else { + this.sendFrame(Sender.frame(data2, options2), cb); + } + } + /** + * Sends a pong message to the other peer. + * + * @param {*} data The message to send + * @param {Boolean} [mask=false] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback + * @public + */ + pong(data2, mask, cb) { + let byteLength; + let readOnly; + if (typeof data2 === "string") { + byteLength = Buffer.byteLength(data2); + readOnly = false; + } else { + data2 = toBuffer$1(data2); + byteLength = data2.length; + readOnly = toBuffer$1.readOnly; + } + if (byteLength > 125) { + throw new RangeError("The data size must not be greater than 125 bytes"); + } + const options2 = { + [kByteLength]: byteLength, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 10, + readOnly, + rsv1: false + }; + if (this._deflating) { + this.enqueue([this.dispatch, data2, false, options2, cb]); + } else { + this.sendFrame(Sender.frame(data2, options2), cb); + } + } + /** + * Sends a data message to the other peer. + * + * @param {*} data The message to send + * @param {Object} options Options object + * @param {Boolean} [options.binary=false] Specifies whether `data` is binary + * or text + * @param {Boolean} [options.compress=false] Specifies whether or not to + * compress `data` + * @param {Boolean} [options.fin=false] Specifies whether the fragment is the + * last one + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Function} [cb] Callback + * @public + */ + send(data2, options2, cb) { + const perMessageDeflate = this._extensions[PerMessageDeflate$2.extensionName]; + let opcode = options2.binary ? 2 : 1; + let rsv1 = options2.compress; + let byteLength; + let readOnly; + if (typeof data2 === "string") { + byteLength = Buffer.byteLength(data2); + readOnly = false; + } else { + data2 = toBuffer$1(data2); + byteLength = data2.length; + readOnly = toBuffer$1.readOnly; + } + if (this._firstFragment) { + this._firstFragment = false; + if (rsv1 && perMessageDeflate && perMessageDeflate.params[perMessageDeflate._isServer ? "server_no_context_takeover" : "client_no_context_takeover"]) { + rsv1 = byteLength >= perMessageDeflate._threshold; + } + this._compress = rsv1; + } else { + rsv1 = false; + opcode = 0; + } + if (options2.fin) + this._firstFragment = true; + if (perMessageDeflate) { + const opts = { + [kByteLength]: byteLength, + fin: options2.fin, + generateMask: this._generateMask, + mask: options2.mask, + maskBuffer: this._maskBuffer, + opcode, + readOnly, + rsv1 + }; + if (this._deflating) { + this.enqueue([this.dispatch, data2, this._compress, opts, cb]); + } else { + this.dispatch(data2, this._compress, opts, cb); + } + } else { + this.sendFrame( + Sender.frame(data2, { + [kByteLength]: byteLength, + fin: options2.fin, + generateMask: this._generateMask, + mask: options2.mask, + maskBuffer: this._maskBuffer, + opcode, + readOnly, + rsv1: false + }), + cb + ); + } + } + /** + * Dispatches a message. + * + * @param {(Buffer|String)} data The message to send + * @param {Boolean} [compress=false] Specifies whether or not to compress + * `data` + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @param {Function} [cb] Callback + * @private + */ + dispatch(data2, compress, options2, cb) { + if (!compress) { + this.sendFrame(Sender.frame(data2, options2), cb); + return; + } + const perMessageDeflate = this._extensions[PerMessageDeflate$2.extensionName]; + this._bufferedBytes += options2[kByteLength]; + this._deflating = true; + perMessageDeflate.compress(data2, options2.fin, (_, buf) => { + if (this._socket.destroyed) { + const err = new Error( + "The socket was closed while data was being compressed" + ); + if (typeof cb === "function") + cb(err); + for (let i = 0; i < this._queue.length; i++) { + const params = this._queue[i]; + const callback = params[params.length - 1]; + if (typeof callback === "function") + callback(err); + } + return; + } + this._bufferedBytes -= options2[kByteLength]; + this._deflating = false; + options2.readOnly = false; + this.sendFrame(Sender.frame(buf, options2), cb); + this.dequeue(); + }); + } + /** + * Executes queued send operations. + * + * @private + */ + dequeue() { + while (!this._deflating && this._queue.length) { + const params = this._queue.shift(); + this._bufferedBytes -= params[3][kByteLength]; + Reflect.apply(params[0], this, params.slice(1)); + } + } + /** + * Enqueues a send operation. + * + * @param {Array} params Send operation parameters. + * @private + */ + enqueue(params) { + this._bufferedBytes += params[3][kByteLength]; + this._queue.push(params); + } + /** + * Sends a frame. + * + * @param {Buffer[]} list The frame to send + * @param {Function} [cb] Callback + * @private + */ + sendFrame(list, cb) { + if (list.length === 2) { + this._socket.cork(); + this._socket.write(list[0]); + this._socket.write(list[1], cb); + this._socket.uncork(); + } else { + this._socket.write(list[0], cb); + } + } + }; + sender = Sender$1; + ({ kForOnEventAttribute: kForOnEventAttribute$1, kListener: kListener$1 } = constants); + kCode = Symbol("kCode"); + kData = Symbol("kData"); + kError = Symbol("kError"); + kMessage = Symbol("kMessage"); + kReason = Symbol("kReason"); + kTarget = Symbol("kTarget"); + kType = Symbol("kType"); + kWasClean = Symbol("kWasClean"); + Event = class { + /** + * Create a new `Event`. + * + * @param {String} type The name of the event + * @throws {TypeError} If the `type` argument is not specified + */ + constructor(type) { + this[kTarget] = null; + this[kType] = type; + } + /** + * @type {*} + */ + get target() { + return this[kTarget]; + } + /** + * @type {String} + */ + get type() { + return this[kType]; + } + }; + Object.defineProperty(Event.prototype, "target", { enumerable: true }); + Object.defineProperty(Event.prototype, "type", { enumerable: true }); + CloseEvent = class extends Event { + /** + * Create a new `CloseEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {Number} [options.code=0] The status code explaining why the + * connection was closed + * @param {String} [options.reason=''] A human-readable string explaining why + * the connection was closed + * @param {Boolean} [options.wasClean=false] Indicates whether or not the + * connection was cleanly closed + */ + constructor(type, options2 = {}) { + super(type); + this[kCode] = options2.code === void 0 ? 0 : options2.code; + this[kReason] = options2.reason === void 0 ? "" : options2.reason; + this[kWasClean] = options2.wasClean === void 0 ? false : options2.wasClean; + } + /** + * @type {Number} + */ + get code() { + return this[kCode]; + } + /** + * @type {String} + */ + get reason() { + return this[kReason]; + } + /** + * @type {Boolean} + */ + get wasClean() { + return this[kWasClean]; + } + }; + Object.defineProperty(CloseEvent.prototype, "code", { enumerable: true }); + Object.defineProperty(CloseEvent.prototype, "reason", { enumerable: true }); + Object.defineProperty(CloseEvent.prototype, "wasClean", { enumerable: true }); + ErrorEvent = class extends Event { + /** + * Create a new `ErrorEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {*} [options.error=null] The error that generated this event + * @param {String} [options.message=''] The error message + */ + constructor(type, options2 = {}) { + super(type); + this[kError] = options2.error === void 0 ? null : options2.error; + this[kMessage] = options2.message === void 0 ? "" : options2.message; + } + /** + * @type {*} + */ + get error() { + return this[kError]; + } + /** + * @type {String} + */ + get message() { + return this[kMessage]; + } + }; + Object.defineProperty(ErrorEvent.prototype, "error", { enumerable: true }); + Object.defineProperty(ErrorEvent.prototype, "message", { enumerable: true }); + MessageEvent = class extends Event { + /** + * Create a new `MessageEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {*} [options.data=null] The message content + */ + constructor(type, options2 = {}) { + super(type); + this[kData] = options2.data === void 0 ? null : options2.data; + } + /** + * @type {*} + */ + get data() { + return this[kData]; + } + }; + Object.defineProperty(MessageEvent.prototype, "data", { enumerable: true }); + EventTarget = { + /** + * Register an event listener. + * + * @param {String} type A string representing the event type to listen for + * @param {(Function|Object)} handler The listener to add + * @param {Object} [options] An options object specifies characteristics about + * the event listener + * @param {Boolean} [options.once=false] A `Boolean` indicating that the + * listener should be invoked at most once after being added. If `true`, + * the listener would be automatically removed when invoked. + * @public + */ + addEventListener(type, handler, options2 = {}) { + for (const listener2 of this.listeners(type)) { + if (!options2[kForOnEventAttribute$1] && listener2[kListener$1] === handler && !listener2[kForOnEventAttribute$1]) { + return; + } + } + let wrapper; + if (type === "message") { + wrapper = function onMessage(data2, isBinary) { + const event = new MessageEvent("message", { + data: isBinary ? data2 : data2.toString() + }); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === "close") { + wrapper = function onClose(code, message) { + const event = new CloseEvent("close", { + code, + reason: message.toString(), + wasClean: this._closeFrameReceived && this._closeFrameSent + }); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === "error") { + wrapper = function onError(error2) { + const event = new ErrorEvent("error", { + error: error2, + message: error2.message + }); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === "open") { + wrapper = function onOpen() { + const event = new Event("open"); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else { + return; + } + wrapper[kForOnEventAttribute$1] = !!options2[kForOnEventAttribute$1]; + wrapper[kListener$1] = handler; + if (options2.once) { + this.once(type, wrapper); + } else { + this.on(type, wrapper); + } + }, + /** + * Remove an event listener. + * + * @param {String} type A string representing the event type to remove + * @param {(Function|Object)} handler The listener to remove + * @public + */ + removeEventListener(type, handler) { + for (const listener2 of this.listeners(type)) { + if (listener2[kListener$1] === handler && !listener2[kForOnEventAttribute$1]) { + this.removeListener(type, listener2); + break; + } + } + } + }; + eventTarget = { + CloseEvent, + ErrorEvent, + Event, + EventTarget, + MessageEvent + }; + ({ tokenChars: tokenChars$1 } = validationExports); + extension$1 = { format: format$1, parse: parse$4 }; + EventEmitter$1 = require$$0$5; + https$2 = require$$1$2; + http$3 = require$$1$1; + net = require$$3$2; + tls = require$$4; + ({ randomBytes, createHash: createHash$1 } = require$$5$1); + ({ URL: URL$2 } = require$$0$9); + PerMessageDeflate$1 = permessageDeflate; + Receiver2 = receiver; + Sender2 = sender; + ({ + BINARY_TYPES, + EMPTY_BUFFER, + GUID: GUID$1, + kForOnEventAttribute, + kListener, + kStatusCode, + kWebSocket: kWebSocket$1, + NOOP + } = constants); + ({ + EventTarget: { addEventListener, removeEventListener } + } = eventTarget); + ({ format, parse: parse$3 } = extension$1); + ({ toBuffer } = bufferUtilExports); + closeTimeout = 30 * 1e3; + kAborted = Symbol("kAborted"); + protocolVersions = [8, 13]; + readyStates = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"]; + subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/; + WebSocket$1 = class WebSocket extends EventEmitter$1 { + /** + * Create a new `WebSocket`. + * + * @param {(String|URL)} address The URL to which to connect + * @param {(String|String[])} [protocols] The subprotocols + * @param {Object} [options] Connection options + */ + constructor(address, protocols, options2) { + super(); + this._binaryType = BINARY_TYPES[0]; + this._closeCode = 1006; + this._closeFrameReceived = false; + this._closeFrameSent = false; + this._closeMessage = EMPTY_BUFFER; + this._closeTimer = null; + this._extensions = {}; + this._paused = false; + this._protocol = ""; + this._readyState = WebSocket.CONNECTING; + this._receiver = null; + this._sender = null; + this._socket = null; + if (address !== null) { + this._bufferedAmount = 0; + this._isServer = false; + this._redirects = 0; + if (protocols === void 0) { + protocols = []; + } else if (!Array.isArray(protocols)) { + if (typeof protocols === "object" && protocols !== null) { + options2 = protocols; + protocols = []; + } else { + protocols = [protocols]; + } + } + initAsClient(this, address, protocols, options2); + } else { + this._isServer = true; + } + } + /** + * This deviates from the WHATWG interface since ws doesn't support the + * required default "blob" type (instead we define a custom "nodebuffer" + * type). + * + * @type {String} + */ + get binaryType() { + return this._binaryType; + } + set binaryType(type) { + if (!BINARY_TYPES.includes(type)) + return; + this._binaryType = type; + if (this._receiver) + this._receiver._binaryType = type; + } + /** + * @type {Number} + */ + get bufferedAmount() { + if (!this._socket) + return this._bufferedAmount; + return this._socket._writableState.length + this._sender._bufferedBytes; + } + /** + * @type {String} + */ + get extensions() { + return Object.keys(this._extensions).join(); + } + /** + * @type {Boolean} + */ + get isPaused() { + return this._paused; + } + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onclose() { + return null; + } + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onerror() { + return null; + } + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onopen() { + return null; + } + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onmessage() { + return null; + } + /** + * @type {String} + */ + get protocol() { + return this._protocol; + } + /** + * @type {Number} + */ + get readyState() { + return this._readyState; + } + /** + * @type {String} + */ + get url() { + return this._url; + } + /** + * Set up the socket and the internal resources. + * + * @param {(net.Socket|tls.Socket)} socket The network socket between the + * server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Object} options Options object + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Number} [options.maxPayload=0] The maximum allowed message size + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + * @private + */ + setSocket(socket, head, options2) { + const receiver2 = new Receiver2({ + binaryType: this.binaryType, + extensions: this._extensions, + isServer: this._isServer, + maxPayload: options2.maxPayload, + skipUTF8Validation: options2.skipUTF8Validation + }); + this._sender = new Sender2(socket, this._extensions, options2.generateMask); + this._receiver = receiver2; + this._socket = socket; + receiver2[kWebSocket$1] = this; + socket[kWebSocket$1] = this; + receiver2.on("conclude", receiverOnConclude); + receiver2.on("drain", receiverOnDrain); + receiver2.on("error", receiverOnError); + receiver2.on("message", receiverOnMessage); + receiver2.on("ping", receiverOnPing); + receiver2.on("pong", receiverOnPong); + socket.setTimeout(0); + socket.setNoDelay(); + if (head.length > 0) + socket.unshift(head); + socket.on("close", socketOnClose); + socket.on("data", socketOnData); + socket.on("end", socketOnEnd); + socket.on("error", socketOnError$1); + this._readyState = WebSocket.OPEN; + this.emit("open"); + } + /** + * Emit the `'close'` event. + * + * @private + */ + emitClose() { + if (!this._socket) { + this._readyState = WebSocket.CLOSED; + this.emit("close", this._closeCode, this._closeMessage); + return; + } + if (this._extensions[PerMessageDeflate$1.extensionName]) { + this._extensions[PerMessageDeflate$1.extensionName].cleanup(); + } + this._receiver.removeAllListeners(); + this._readyState = WebSocket.CLOSED; + this.emit("close", this._closeCode, this._closeMessage); + } + /** + * Start a closing handshake. + * + * +----------+ +-----------+ +----------+ + * - - -|ws.close()|-->|close frame|-->|ws.close()|- - - + * | +----------+ +-----------+ +----------+ | + * +----------+ +-----------+ | + * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING + * +----------+ +-----------+ | + * | | | +---+ | + * +------------------------+-->|fin| - - - - + * | +---+ | +---+ + * - - - - -|fin|<---------------------+ + * +---+ + * + * @param {Number} [code] Status code explaining why the connection is closing + * @param {(String|Buffer)} [data] The reason why the connection is + * closing + * @public + */ + close(code, data2) { + if (this.readyState === WebSocket.CLOSED) + return; + if (this.readyState === WebSocket.CONNECTING) { + const msg = "WebSocket was closed before the connection was established"; + abortHandshake$1(this, this._req, msg); + return; + } + if (this.readyState === WebSocket.CLOSING) { + if (this._closeFrameSent && (this._closeFrameReceived || this._receiver._writableState.errorEmitted)) { + this._socket.end(); + } + return; + } + this._readyState = WebSocket.CLOSING; + this._sender.close(code, data2, !this._isServer, (err) => { + if (err) + return; + this._closeFrameSent = true; + if (this._closeFrameReceived || this._receiver._writableState.errorEmitted) { + this._socket.end(); + } + }); + this._closeTimer = setTimeout( + this._socket.destroy.bind(this._socket), + closeTimeout + ); + } + /** + * Pause the socket. + * + * @public + */ + pause() { + if (this.readyState === WebSocket.CONNECTING || this.readyState === WebSocket.CLOSED) { + return; + } + this._paused = true; + this._socket.pause(); + } + /** + * Send a ping. + * + * @param {*} [data] The data to send + * @param {Boolean} [mask] Indicates whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when the ping is sent + * @public + */ + ping(data2, mask, cb) { + if (this.readyState === WebSocket.CONNECTING) { + throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); + } + if (typeof data2 === "function") { + cb = data2; + data2 = mask = void 0; + } else if (typeof mask === "function") { + cb = mask; + mask = void 0; + } + if (typeof data2 === "number") + data2 = data2.toString(); + if (this.readyState !== WebSocket.OPEN) { + sendAfterClose(this, data2, cb); + return; + } + if (mask === void 0) + mask = !this._isServer; + this._sender.ping(data2 || EMPTY_BUFFER, mask, cb); + } + /** + * Send a pong. + * + * @param {*} [data] The data to send + * @param {Boolean} [mask] Indicates whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when the pong is sent + * @public + */ + pong(data2, mask, cb) { + if (this.readyState === WebSocket.CONNECTING) { + throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); + } + if (typeof data2 === "function") { + cb = data2; + data2 = mask = void 0; + } else if (typeof mask === "function") { + cb = mask; + mask = void 0; + } + if (typeof data2 === "number") + data2 = data2.toString(); + if (this.readyState !== WebSocket.OPEN) { + sendAfterClose(this, data2, cb); + return; + } + if (mask === void 0) + mask = !this._isServer; + this._sender.pong(data2 || EMPTY_BUFFER, mask, cb); + } + /** + * Resume the socket. + * + * @public + */ + resume() { + if (this.readyState === WebSocket.CONNECTING || this.readyState === WebSocket.CLOSED) { + return; + } + this._paused = false; + if (!this._receiver._writableState.needDrain) + this._socket.resume(); + } + /** + * Send a data message. + * + * @param {*} data The message to send + * @param {Object} [options] Options object + * @param {Boolean} [options.binary] Specifies whether `data` is binary or + * text + * @param {Boolean} [options.compress] Specifies whether or not to compress + * `data` + * @param {Boolean} [options.fin=true] Specifies whether the fragment is the + * last one + * @param {Boolean} [options.mask] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when data is written out + * @public + */ + send(data2, options2, cb) { + if (this.readyState === WebSocket.CONNECTING) { + throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); + } + if (typeof options2 === "function") { + cb = options2; + options2 = {}; + } + if (typeof data2 === "number") + data2 = data2.toString(); + if (this.readyState !== WebSocket.OPEN) { + sendAfterClose(this, data2, cb); + return; + } + const opts = { + binary: typeof data2 !== "string", + mask: !this._isServer, + compress: true, + fin: true, + ...options2 + }; + if (!this._extensions[PerMessageDeflate$1.extensionName]) { + opts.compress = false; + } + this._sender.send(data2 || EMPTY_BUFFER, opts, cb); + } + /** + * Forcibly close the connection. + * + * @public + */ + terminate() { + if (this.readyState === WebSocket.CLOSED) + return; + if (this.readyState === WebSocket.CONNECTING) { + const msg = "WebSocket was closed before the connection was established"; + abortHandshake$1(this, this._req, msg); + return; + } + if (this._socket) { + this._readyState = WebSocket.CLOSING; + this._socket.destroy(); + } + } + }; + Object.defineProperty(WebSocket$1, "CONNECTING", { + enumerable: true, + value: readyStates.indexOf("CONNECTING") + }); + Object.defineProperty(WebSocket$1.prototype, "CONNECTING", { + enumerable: true, + value: readyStates.indexOf("CONNECTING") + }); + Object.defineProperty(WebSocket$1, "OPEN", { + enumerable: true, + value: readyStates.indexOf("OPEN") + }); + Object.defineProperty(WebSocket$1.prototype, "OPEN", { + enumerable: true, + value: readyStates.indexOf("OPEN") + }); + Object.defineProperty(WebSocket$1, "CLOSING", { + enumerable: true, + value: readyStates.indexOf("CLOSING") + }); + Object.defineProperty(WebSocket$1.prototype, "CLOSING", { + enumerable: true, + value: readyStates.indexOf("CLOSING") + }); + Object.defineProperty(WebSocket$1, "CLOSED", { + enumerable: true, + value: readyStates.indexOf("CLOSED") + }); + Object.defineProperty(WebSocket$1.prototype, "CLOSED", { + enumerable: true, + value: readyStates.indexOf("CLOSED") + }); + [ + "binaryType", + "bufferedAmount", + "extensions", + "isPaused", + "protocol", + "readyState", + "url" + ].forEach((property) => { + Object.defineProperty(WebSocket$1.prototype, property, { enumerable: true }); + }); + ["open", "error", "close", "message"].forEach((method) => { + Object.defineProperty(WebSocket$1.prototype, `on${method}`, { + enumerable: true, + get() { + for (const listener2 of this.listeners(method)) { + if (listener2[kForOnEventAttribute]) + return listener2[kListener]; + } + return null; + }, + set(handler) { + for (const listener2 of this.listeners(method)) { + if (listener2[kForOnEventAttribute]) { + this.removeListener(method, listener2); + break; + } + } + if (typeof handler !== "function") + return; + this.addEventListener(method, handler, { + [kForOnEventAttribute]: true + }); + } + }); + }); + WebSocket$1.prototype.addEventListener = addEventListener; + WebSocket$1.prototype.removeEventListener = removeEventListener; + ({ tokenChars } = validationExports); + ({ createHash } = require$$5$1); + ({ GUID, kWebSocket } = constants); + httpProxyExports$1 = {}; + httpProxy$3 = { + get exports() { + return httpProxyExports$1; + }, + set exports(v) { + httpProxyExports$1 = v; + } + }; + httpProxyExports = {}; + httpProxy$2 = { + get exports() { + return httpProxyExports; + }, + set exports(v) { + httpProxyExports = v; + } + }; + eventemitter3Exports = {}; + eventemitter3 = { + get exports() { + return eventemitter3Exports; + }, + set exports(v) { + eventemitter3Exports = v; + } + }; + (function(module) { + var has = Object.prototype.hasOwnProperty, prefix = "~"; + function Events() { + } + if (Object.create) { + Events.prototype = /* @__PURE__ */ Object.create(null); + if (!new Events().__proto__) + prefix = false; + } + function EE(fn, context, once2) { + this.fn = fn; + this.context = context; + this.once = once2 || false; + } + function addListener(emitter, event, fn, context, once2) { + if (typeof fn !== "function") { + throw new TypeError("The listener must be a function"); + } + var listener2 = new EE(fn, context || emitter, once2), evt = prefix ? prefix + event : event; + if (!emitter._events[evt]) + emitter._events[evt] = listener2, emitter._eventsCount++; + else if (!emitter._events[evt].fn) + emitter._events[evt].push(listener2); + else + emitter._events[evt] = [emitter._events[evt], listener2]; + return emitter; + } + function clearEvent(emitter, evt) { + if (--emitter._eventsCount === 0) + emitter._events = new Events(); + else + delete emitter._events[evt]; + } + function EventEmitter() { + this._events = new Events(); + this._eventsCount = 0; + } + EventEmitter.prototype.eventNames = function eventNames() { + var names = [], events2, name2; + if (this._eventsCount === 0) + return names; + for (name2 in events2 = this._events) { + if (has.call(events2, name2)) + names.push(prefix ? name2.slice(1) : name2); + } + if (Object.getOwnPropertySymbols) { + return names.concat(Object.getOwnPropertySymbols(events2)); + } + return names; + }; + EventEmitter.prototype.listeners = function listeners(event) { + var evt = prefix ? prefix + event : event, handlers = this._events[evt]; + if (!handlers) + return []; + if (handlers.fn) + return [handlers.fn]; + for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) { + ee[i] = handlers[i].fn; + } + return ee; + }; + EventEmitter.prototype.listenerCount = function listenerCount(event) { + var evt = prefix ? prefix + event : event, listeners = this._events[evt]; + if (!listeners) + return 0; + if (listeners.fn) + return 1; + return listeners.length; + }; + EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { + var evt = prefix ? prefix + event : event; + if (!this._events[evt]) + return false; + var listeners = this._events[evt], len = arguments.length, args, i; + if (listeners.fn) { + if (listeners.once) + this.removeListener(event, listeners.fn, void 0, true); + switch (len) { + case 1: + return listeners.fn.call(listeners.context), true; + case 2: + return listeners.fn.call(listeners.context, a1), true; + case 3: + return listeners.fn.call(listeners.context, a1, a2), true; + case 4: + return listeners.fn.call(listeners.context, a1, a2, a3), true; + case 5: + return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; + case 6: + return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; + } + for (i = 1, args = new Array(len - 1); i < len; i++) { + args[i - 1] = arguments[i]; + } + listeners.fn.apply(listeners.context, args); + } else { + var length = listeners.length, j; + for (i = 0; i < length; i++) { + if (listeners[i].once) + this.removeListener(event, listeners[i].fn, void 0, true); + switch (len) { + case 1: + listeners[i].fn.call(listeners[i].context); + break; + case 2: + listeners[i].fn.call(listeners[i].context, a1); + break; + case 3: + listeners[i].fn.call(listeners[i].context, a1, a2); + break; + case 4: + listeners[i].fn.call(listeners[i].context, a1, a2, a3); + break; + default: + if (!args) + for (j = 1, args = new Array(len - 1); j < len; j++) { + args[j - 1] = arguments[j]; + } + listeners[i].fn.apply(listeners[i].context, args); + } + } + } + return true; + }; + EventEmitter.prototype.on = function on(event, fn, context) { + return addListener(this, event, fn, context, false); + }; + EventEmitter.prototype.once = function once2(event, fn, context) { + return addListener(this, event, fn, context, true); + }; + EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once2) { + var evt = prefix ? prefix + event : event; + if (!this._events[evt]) + return this; + if (!fn) { + clearEvent(this, evt); + return this; + } + var listeners = this._events[evt]; + if (listeners.fn) { + if (listeners.fn === fn && (!once2 || listeners.once) && (!context || listeners.context === context)) { + clearEvent(this, evt); + } + } else { + for (var i = 0, events2 = [], length = listeners.length; i < length; i++) { + if (listeners[i].fn !== fn || once2 && !listeners[i].once || context && listeners[i].context !== context) { + events2.push(listeners[i]); + } + } + if (events2.length) + this._events[evt] = events2.length === 1 ? events2[0] : events2; + else + clearEvent(this, evt); + } + return this; + }; + EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { + var evt; + if (event) { + evt = prefix ? prefix + event : event; + if (this._events[evt]) + clearEvent(this, evt); + } else { + this._events = new Events(); + this._eventsCount = 0; + } + return this; + }; + EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + EventEmitter.prefixed = prefix; + EventEmitter.EventEmitter = EventEmitter; + { + module.exports = EventEmitter; + } + })(eventemitter3); + common$3 = {}; + requiresPort = function required(port, protocol) { + protocol = protocol.split(":")[0]; + port = +port; + if (!port) + return false; + switch (protocol) { + case "http": + case "ws": + return port !== 80; + case "https": + case "wss": + return port !== 443; + case "ftp": + return port !== 21; + case "gopher": + return port !== 70; + case "file": + return false; + } + return port !== 0; + }; + (function(exports2) { + var common2 = exports2, url2 = require$$0$9, extend2 = require$$0$6._extend, required2 = requiresPort; + var upgradeHeader = /(^|,)\s*upgrade\s*($|,)/i, isSSL = /^https|wss/; + common2.isSSL = isSSL; + common2.setupOutgoing = function(outgoing, options2, req2, forward) { + outgoing.port = options2[forward || "target"].port || (isSSL.test(options2[forward || "target"].protocol) ? 443 : 80); + [ + "host", + "hostname", + "socketPath", + "pfx", + "key", + "passphrase", + "cert", + "ca", + "ciphers", + "secureProtocol" + ].forEach( + function(e) { + outgoing[e] = options2[forward || "target"][e]; + } + ); + outgoing.method = options2.method || req2.method; + outgoing.headers = extend2({}, req2.headers); + if (options2.headers) { + extend2(outgoing.headers, options2.headers); + } + if (options2.auth) { + outgoing.auth = options2.auth; + } + if (options2.ca) { + outgoing.ca = options2.ca; + } + if (isSSL.test(options2[forward || "target"].protocol)) { + outgoing.rejectUnauthorized = typeof options2.secure === "undefined" ? true : options2.secure; + } + outgoing.agent = options2.agent || false; + outgoing.localAddress = options2.localAddress; + if (!outgoing.agent) { + outgoing.headers = outgoing.headers || {}; + if (typeof outgoing.headers.connection !== "string" || !upgradeHeader.test(outgoing.headers.connection)) { + outgoing.headers.connection = "close"; + } + } + var target = options2[forward || "target"]; + var targetPath = target && options2.prependPath !== false ? target.path || "" : ""; + var outgoingPath = !options2.toProxy ? url2.parse(req2.url).path || "" : req2.url; + outgoingPath = !options2.ignorePath ? outgoingPath : ""; + outgoing.path = common2.urlJoin(targetPath, outgoingPath); + if (options2.changeOrigin) { + outgoing.headers.host = required2(outgoing.port, options2[forward || "target"].protocol) && !hasPort(outgoing.host) ? outgoing.host + ":" + outgoing.port : outgoing.host; + } + return outgoing; + }; + common2.setupSocket = function(socket) { + socket.setTimeout(0); + socket.setNoDelay(true); + socket.setKeepAlive(true, 0); + return socket; + }; + common2.getPort = function(req2) { + var res = req2.headers.host ? req2.headers.host.match(/:(\d+)/) : ""; + return res ? res[1] : common2.hasEncryptedConnection(req2) ? "443" : "80"; + }; + common2.hasEncryptedConnection = function(req2) { + return Boolean(req2.connection.encrypted || req2.connection.pair); + }; + common2.urlJoin = function() { + var args = Array.prototype.slice.call(arguments), lastIndex = args.length - 1, last = args[lastIndex], lastSegs = last.split("?"), retSegs; + args[lastIndex] = lastSegs.shift(); + retSegs = [ + args.filter(Boolean).join("/").replace(/\/+/g, "/").replace("http:/", "http://").replace("https:/", "https://") + ]; + retSegs.push.apply(retSegs, lastSegs); + return retSegs.join("?"); + }; + common2.rewriteCookieProperty = function rewriteCookieProperty(header, config2, property) { + if (Array.isArray(header)) { + return header.map(function(headerElement) { + return rewriteCookieProperty(headerElement, config2, property); + }); + } + return header.replace(new RegExp("(;\\s*" + property + "=)([^;]+)", "i"), function(match, prefix, previousValue) { + var newValue; + if (previousValue in config2) { + newValue = config2[previousValue]; + } else if ("*" in config2) { + newValue = config2["*"]; + } else { + return match; + } + if (newValue) { + return prefix + newValue; + } else { + return ""; + } + }); + }; + function hasPort(host) { + return !!~host.indexOf(":"); + } + })(common$3); + url$1 = require$$0$9; + common$2 = common$3; + redirectRegex = /^201|30(1|2|7|8)$/; + webOutgoing = { + // <-- + /** + * If is a HTTP 1.0 request, remove chunk headers + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {proxyResponse} Res Response object from the proxy request + * + * @api private + */ + removeChunked: function removeChunked(req2, res, proxyRes) { + if (req2.httpVersion === "1.0") { + delete proxyRes.headers["transfer-encoding"]; + } + }, + /** + * If is a HTTP 1.0 request, set the correct connection header + * or if connection header not present, then use `keep-alive` + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {proxyResponse} Res Response object from the proxy request + * + * @api private + */ + setConnection: function setConnection(req2, res, proxyRes) { + if (req2.httpVersion === "1.0") { + proxyRes.headers.connection = req2.headers.connection || "close"; + } else if (req2.httpVersion !== "2.0" && !proxyRes.headers.connection) { + proxyRes.headers.connection = req2.headers.connection || "keep-alive"; + } + }, + setRedirectHostRewrite: function setRedirectHostRewrite(req2, res, proxyRes, options2) { + if ((options2.hostRewrite || options2.autoRewrite || options2.protocolRewrite) && proxyRes.headers["location"] && redirectRegex.test(proxyRes.statusCode)) { + var target = url$1.parse(options2.target); + var u = url$1.parse(proxyRes.headers["location"]); + if (target.host != u.host) { + return; + } + if (options2.hostRewrite) { + u.host = options2.hostRewrite; + } else if (options2.autoRewrite) { + u.host = req2.headers["host"]; + } + if (options2.protocolRewrite) { + u.protocol = options2.protocolRewrite; + } + proxyRes.headers["location"] = u.format(); + } + }, + /** + * Copy headers from proxyResponse to response + * set each header in response object. + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {proxyResponse} Res Response object from the proxy request + * @param {Object} Options options.cookieDomainRewrite: Config to rewrite cookie domain + * + * @api private + */ + writeHeaders: function writeHeaders(req2, res, proxyRes, options2) { + var rewriteCookieDomainConfig = options2.cookieDomainRewrite, rewriteCookiePathConfig = options2.cookiePathRewrite, preserveHeaderKeyCase = options2.preserveHeaderKeyCase, rawHeaderKeyMap, setHeader = function(key2, header) { + if (header == void 0) + return; + if (rewriteCookieDomainConfig && key2.toLowerCase() === "set-cookie") { + header = common$2.rewriteCookieProperty(header, rewriteCookieDomainConfig, "domain"); + } + if (rewriteCookiePathConfig && key2.toLowerCase() === "set-cookie") { + header = common$2.rewriteCookieProperty(header, rewriteCookiePathConfig, "path"); + } + res.setHeader(String(key2).trim(), header); + }; + if (typeof rewriteCookieDomainConfig === "string") { + rewriteCookieDomainConfig = { "*": rewriteCookieDomainConfig }; + } + if (typeof rewriteCookiePathConfig === "string") { + rewriteCookiePathConfig = { "*": rewriteCookiePathConfig }; + } + if (preserveHeaderKeyCase && proxyRes.rawHeaders != void 0) { + rawHeaderKeyMap = {}; + for (var i = 0; i < proxyRes.rawHeaders.length; i += 2) { + var key = proxyRes.rawHeaders[i]; + rawHeaderKeyMap[key.toLowerCase()] = key; + } + } + Object.keys(proxyRes.headers).forEach(function(key2) { + var header = proxyRes.headers[key2]; + if (preserveHeaderKeyCase && rawHeaderKeyMap) { + key2 = rawHeaderKeyMap[key2] || key2; + } + setHeader(key2, header); + }); + }, + /** + * Set the statusCode from the proxyResponse + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {proxyResponse} Res Response object from the proxy request + * + * @api private + */ + writeStatusCode: function writeStatusCode(req2, res, proxyRes) { + if (proxyRes.statusMessage) { + res.statusCode = proxyRes.statusCode; + res.statusMessage = proxyRes.statusMessage; + } else { + res.statusCode = proxyRes.statusCode; + } + } + }; + followRedirectsExports = {}; + followRedirects$1 = { + get exports() { + return followRedirectsExports; + }, + set exports(v) { + followRedirectsExports = v; + } + }; + debug_1 = function() { + if (!debug$3) { + try { + debug$3 = srcExports$1("follow-redirects"); + } catch (error2) { + } + if (typeof debug$3 !== "function") { + debug$3 = function() { + }; + } + } + debug$3.apply(null, arguments); + }; + url = require$$0$9; + URL$1 = url.URL; + http$1 = require$$1$1; + https$1 = require$$1$2; + Writable = require$$0$7.Writable; + assert = require$$5; + debug$2 = debug_1; + events = ["abort", "aborted", "connect", "error", "socket", "timeout"]; + eventHandlers = /* @__PURE__ */ Object.create(null); + events.forEach(function(event) { + eventHandlers[event] = function(arg1, arg2, arg3) { + this._redirectable.emit(event, arg1, arg2, arg3); + }; + }); + RedirectionError = createErrorType( + "ERR_FR_REDIRECTION_FAILURE", + "Redirected request failed" + ); + TooManyRedirectsError = createErrorType( + "ERR_FR_TOO_MANY_REDIRECTS", + "Maximum number of redirects exceeded" + ); + MaxBodyLengthExceededError = createErrorType( + "ERR_FR_MAX_BODY_LENGTH_EXCEEDED", + "Request body larger than maxBodyLength limit" + ); + WriteAfterEndError = createErrorType( + "ERR_STREAM_WRITE_AFTER_END", + "write after end" + ); + RedirectableRequest.prototype = Object.create(Writable.prototype); + RedirectableRequest.prototype.abort = function() { + abortRequest(this._currentRequest); + this.emit("abort"); + }; + RedirectableRequest.prototype.write = function(data2, encoding, callback) { + if (this._ending) { + throw new WriteAfterEndError(); + } + if (!(typeof data2 === "string" || typeof data2 === "object" && "length" in data2)) { + throw new TypeError("data should be a string, Buffer or Uint8Array"); + } + if (typeof encoding === "function") { + callback = encoding; + encoding = null; + } + if (data2.length === 0) { + if (callback) { + callback(); + } + return; + } + if (this._requestBodyLength + data2.length <= this._options.maxBodyLength) { + this._requestBodyLength += data2.length; + this._requestBodyBuffers.push({ data: data2, encoding }); + this._currentRequest.write(data2, encoding, callback); + } else { + this.emit("error", new MaxBodyLengthExceededError()); + this.abort(); + } + }; + RedirectableRequest.prototype.end = function(data2, encoding, callback) { + if (typeof data2 === "function") { + callback = data2; + data2 = encoding = null; + } else if (typeof encoding === "function") { + callback = encoding; + encoding = null; + } + if (!data2) { + this._ended = this._ending = true; + this._currentRequest.end(null, null, callback); + } else { + var self2 = this; + var currentRequest = this._currentRequest; + this.write(data2, encoding, function() { + self2._ended = true; + currentRequest.end(null, null, callback); + }); + this._ending = true; + } + }; + RedirectableRequest.prototype.setHeader = function(name2, value2) { + this._options.headers[name2] = value2; + this._currentRequest.setHeader(name2, value2); + }; + RedirectableRequest.prototype.removeHeader = function(name2) { + delete this._options.headers[name2]; + this._currentRequest.removeHeader(name2); + }; + RedirectableRequest.prototype.setTimeout = function(msecs, callback) { + var self2 = this; + function destroyOnTimeout(socket) { + socket.setTimeout(msecs); + socket.removeListener("timeout", socket.destroy); + socket.addListener("timeout", socket.destroy); + } + function startTimer(socket) { + if (self2._timeout) { + clearTimeout(self2._timeout); + } + self2._timeout = setTimeout(function() { + self2.emit("timeout"); + clearTimer(); + }, msecs); + destroyOnTimeout(socket); + } + function clearTimer() { + if (self2._timeout) { + clearTimeout(self2._timeout); + self2._timeout = null; + } + self2.removeListener("abort", clearTimer); + self2.removeListener("error", clearTimer); + self2.removeListener("response", clearTimer); + if (callback) { + self2.removeListener("timeout", callback); + } + if (!self2.socket) { + self2._currentRequest.removeListener("socket", startTimer); + } + } + if (callback) { + this.on("timeout", callback); + } + if (this.socket) { + startTimer(this.socket); + } else { + this._currentRequest.once("socket", startTimer); + } + this.on("socket", destroyOnTimeout); + this.on("abort", clearTimer); + this.on("error", clearTimer); + this.on("response", clearTimer); + return this; + }; + [ + "flushHeaders", + "getHeader", + "setNoDelay", + "setSocketKeepAlive" + ].forEach(function(method) { + RedirectableRequest.prototype[method] = function(a, b) { + return this._currentRequest[method](a, b); + }; + }); + ["aborted", "connection", "socket"].forEach(function(property) { + Object.defineProperty(RedirectableRequest.prototype, property, { + get: function() { + return this._currentRequest[property]; + } + }); + }); + RedirectableRequest.prototype._sanitizeOptions = function(options2) { + if (!options2.headers) { + options2.headers = {}; + } + if (options2.host) { + if (!options2.hostname) { + options2.hostname = options2.host; + } + delete options2.host; + } + if (!options2.pathname && options2.path) { + var searchPos = options2.path.indexOf("?"); + if (searchPos < 0) { + options2.pathname = options2.path; + } else { + options2.pathname = options2.path.substring(0, searchPos); + options2.search = options2.path.substring(searchPos); + } + } + }; + RedirectableRequest.prototype._performRequest = function() { + var protocol = this._options.protocol; + var nativeProtocol = this._options.nativeProtocols[protocol]; + if (!nativeProtocol) { + this.emit("error", new TypeError("Unsupported protocol " + protocol)); + return; + } + if (this._options.agents) { + var scheme = protocol.slice(0, -1); + this._options.agent = this._options.agents[scheme]; + } + var request = this._currentRequest = nativeProtocol.request(this._options, this._onNativeResponse); + this._currentUrl = url.format(this._options); + request._redirectable = this; + for (var e = 0; e < events.length; e++) { + request.on(events[e], eventHandlers[events[e]]); + } + if (this._isRedirect) { + var i = 0; + var self2 = this; + var buffers = this._requestBodyBuffers; + (function writeNext(error2) { + if (request === self2._currentRequest) { + if (error2) { + self2.emit("error", error2); + } else if (i < buffers.length) { + var buffer = buffers[i++]; + if (!request.finished) { + request.write(buffer.data, buffer.encoding, writeNext); + } + } else if (self2._ended) { + request.end(); + } + } + })(); + } + }; + RedirectableRequest.prototype._processResponse = function(response) { + var statusCode = response.statusCode; + if (this._options.trackRedirects) { + this._redirects.push({ + url: this._currentUrl, + headers: response.headers, + statusCode + }); + } + var location2 = response.headers.location; + if (!location2 || this._options.followRedirects === false || statusCode < 300 || statusCode >= 400) { + response.responseUrl = this._currentUrl; + response.redirects = this._redirects; + this.emit("response", response); + this._requestBodyBuffers = []; + return; + } + abortRequest(this._currentRequest); + response.destroy(); + if (++this._redirectCount > this._options.maxRedirects) { + this.emit("error", new TooManyRedirectsError()); + return; + } + var requestHeaders; + var beforeRedirect = this._options.beforeRedirect; + if (beforeRedirect) { + requestHeaders = Object.assign({ + // The Host header was set by nativeProtocol.request + Host: response.req.getHeader("host") + }, this._options.headers); + } + var method = this._options.method; + if ((statusCode === 301 || statusCode === 302) && this._options.method === "POST" || // RFC7231§6.4.4: The 303 (See Other) status code indicates that + // the server is redirecting the user agent to a different resource […] + // A user agent can perform a retrieval request targeting that URI + // (a GET or HEAD request if using HTTP) […] + statusCode === 303 && !/^(?:GET|HEAD)$/.test(this._options.method)) { + this._options.method = "GET"; + this._requestBodyBuffers = []; + removeMatchingHeaders(/^content-/i, this._options.headers); + } + var currentHostHeader = removeMatchingHeaders(/^host$/i, this._options.headers); + var currentUrlParts = url.parse(this._currentUrl); + var currentHost = currentHostHeader || currentUrlParts.host; + var currentUrl = /^\w+:/.test(location2) ? this._currentUrl : url.format(Object.assign(currentUrlParts, { host: currentHost })); + var redirectUrl; + try { + redirectUrl = url.resolve(currentUrl, location2); + } catch (cause) { + this.emit("error", new RedirectionError(cause)); + return; + } + debug$2("redirecting to", redirectUrl); + this._isRedirect = true; + var redirectUrlParts = url.parse(redirectUrl); + Object.assign(this._options, redirectUrlParts); + if (redirectUrlParts.protocol !== currentUrlParts.protocol && redirectUrlParts.protocol !== "https:" || redirectUrlParts.host !== currentHost && !isSubdomain(redirectUrlParts.host, currentHost)) { + removeMatchingHeaders(/^(?:authorization|cookie)$/i, this._options.headers); + } + if (typeof beforeRedirect === "function") { + var responseDetails = { + headers: response.headers, + statusCode + }; + var requestDetails = { + url: currentUrl, + method, + headers: requestHeaders + }; + try { + beforeRedirect(this._options, responseDetails, requestDetails); + } catch (err) { + this.emit("error", err); + return; + } + this._sanitizeOptions(this._options); + } + try { + this._performRequest(); + } catch (cause) { + this.emit("error", new RedirectionError(cause)); + } + }; + followRedirects$1.exports = wrap({ http: http$1, https: https$1 }); + followRedirectsExports.wrap = wrap; + httpNative = require$$1$1; + httpsNative = require$$1$2; + web_o = webOutgoing; + common$1 = common$3; + followRedirects = followRedirectsExports; + web_o = Object.keys(web_o).map(function(pass) { + return web_o[pass]; + }); + nativeAgents = { http: httpNative, https: httpsNative }; + webIncoming = { + /** + * Sets `content-length` to '0' if request is of DELETE type. + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + deleteLength: function deleteLength(req2, res, options2) { + if ((req2.method === "DELETE" || req2.method === "OPTIONS") && !req2.headers["content-length"]) { + req2.headers["content-length"] = "0"; + delete req2.headers["transfer-encoding"]; + } + }, + /** + * Sets timeout in request socket if it was specified in options. + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + timeout: function timeout(req2, res, options2) { + if (options2.timeout) { + req2.socket.setTimeout(options2.timeout); + } + }, + /** + * Sets `x-forwarded-*` headers if specified in config. + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + XHeaders: function XHeaders(req2, res, options2) { + if (!options2.xfwd) + return; + var encrypted = req2.isSpdy || common$1.hasEncryptedConnection(req2); + var values = { + for: req2.connection.remoteAddress || req2.socket.remoteAddress, + port: common$1.getPort(req2), + proto: encrypted ? "https" : "http" + }; + ["for", "port", "proto"].forEach(function(header) { + req2.headers["x-forwarded-" + header] = (req2.headers["x-forwarded-" + header] || "") + (req2.headers["x-forwarded-" + header] ? "," : "") + values[header]; + }); + req2.headers["x-forwarded-host"] = req2.headers["x-forwarded-host"] || req2.headers["host"] || ""; + }, + /** + * Does the actual proxying. If `forward` is enabled fires up + * a ForwardStream, same happens for ProxyStream. The request + * just dies otherwise. + * + * @param {ClientRequest} Req Request object + * @param {IncomingMessage} Res Response object + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + stream: function stream2(req2, res, options2, _, server, clb) { + server.emit("start", req2, res, options2.target || options2.forward); + var agents = options2.followRedirects ? followRedirects : nativeAgents; + var http2 = agents.http; + var https2 = agents.https; + if (options2.forward) { + var forwardReq = (options2.forward.protocol === "https:" ? https2 : http2).request( + common$1.setupOutgoing(options2.ssl || {}, options2, req2, "forward") + ); + var forwardError = createErrorHandler(forwardReq, options2.forward); + req2.on("error", forwardError); + forwardReq.on("error", forwardError); + (options2.buffer || req2).pipe(forwardReq); + if (!options2.target) { + return res.end(); + } + } + var proxyReq = (options2.target.protocol === "https:" ? https2 : http2).request( + common$1.setupOutgoing(options2.ssl || {}, options2, req2) + ); + proxyReq.on("socket", function(socket) { + if (server && !proxyReq.getHeader("expect")) { + server.emit("proxyReq", proxyReq, req2, res, options2); + } + }); + if (options2.proxyTimeout) { + proxyReq.setTimeout(options2.proxyTimeout, function() { + proxyReq.abort(); + }); + } + req2.on("aborted", function() { + proxyReq.abort(); + }); + var proxyError = createErrorHandler(proxyReq, options2.target); + req2.on("error", proxyError); + proxyReq.on("error", proxyError); + function createErrorHandler(proxyReq2, url2) { + return function proxyError2(err) { + if (req2.socket.destroyed && err.code === "ECONNRESET") { + server.emit("econnreset", err, req2, res, url2); + return proxyReq2.abort(); + } + if (clb) { + clb(err, req2, res, url2); + } else { + server.emit("error", err, req2, res, url2); + } + }; + } + (options2.buffer || req2).pipe(proxyReq); + proxyReq.on("response", function(proxyRes) { + if (server) { + server.emit("proxyRes", proxyRes, req2, res); + } + if (!res.headersSent && !options2.selfHandleResponse) { + for (var i = 0; i < web_o.length; i++) { + if (web_o[i](req2, res, proxyRes, options2)) { + break; + } + } + } + if (!res.finished) { + proxyRes.on("end", function() { + if (server) + server.emit("end", req2, res, proxyRes); + }); + if (!options2.selfHandleResponse) + proxyRes.pipe(res); + } else { + if (server) + server.emit("end", req2, res, proxyRes); + } + }); + } + }; + http = require$$1$1; + https = require$$1$2; + common = common$3; + wsIncoming = { + /** + * WebSocket requests must have the `GET` method and + * the `upgrade:websocket` header + * + * @param {ClientRequest} Req Request object + * @param {Socket} Websocket + * + * @api private + */ + checkMethodAndHeader: function checkMethodAndHeader(req2, socket) { + if (req2.method !== "GET" || !req2.headers.upgrade) { + socket.destroy(); + return true; + } + if (req2.headers.upgrade.toLowerCase() !== "websocket") { + socket.destroy(); + return true; + } + }, + /** + * Sets `x-forwarded-*` headers if specified in config. + * + * @param {ClientRequest} Req Request object + * @param {Socket} Websocket + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + XHeaders: function XHeaders2(req2, socket, options2) { + if (!options2.xfwd) + return; + var values = { + for: req2.connection.remoteAddress || req2.socket.remoteAddress, + port: common.getPort(req2), + proto: common.hasEncryptedConnection(req2) ? "wss" : "ws" + }; + ["for", "port", "proto"].forEach(function(header) { + req2.headers["x-forwarded-" + header] = (req2.headers["x-forwarded-" + header] || "") + (req2.headers["x-forwarded-" + header] ? "," : "") + values[header]; + }); + }, + /** + * Does the actual proxying. Make the request and upgrade it + * send the Switching Protocols request and pipe the sockets. + * + * @param {ClientRequest} Req Request object + * @param {Socket} Websocket + * @param {Object} Options Config object passed to the proxy + * + * @api private + */ + stream: function stream3(req2, socket, options2, head, server, clb) { + var createHttpHeader = function(line, headers) { + return Object.keys(headers).reduce(function(head2, key) { + var value2 = headers[key]; + if (!Array.isArray(value2)) { + head2.push(key + ": " + value2); + return head2; + } + for (var i = 0; i < value2.length; i++) { + head2.push(key + ": " + value2[i]); + } + return head2; + }, [line]).join("\r\n") + "\r\n\r\n"; + }; + common.setupSocket(socket); + if (head && head.length) + socket.unshift(head); + var proxyReq = (common.isSSL.test(options2.target.protocol) ? https : http).request( + common.setupOutgoing(options2.ssl || {}, options2, req2) + ); + if (server) { + server.emit("proxyReqWs", proxyReq, req2, socket, options2, head); + } + proxyReq.on("error", onOutgoingError); + proxyReq.on("response", function(res) { + if (!res.upgrade) { + socket.write(createHttpHeader("HTTP/" + res.httpVersion + " " + res.statusCode + " " + res.statusMessage, res.headers)); + res.pipe(socket); + } + }); + proxyReq.on("upgrade", function(proxyRes, proxySocket, proxyHead) { + proxySocket.on("error", onOutgoingError); + proxySocket.on("end", function() { + server.emit("close", proxyRes, proxySocket, proxyHead); + }); + socket.on("error", function() { + proxySocket.end(); + }); + common.setupSocket(proxySocket); + if (proxyHead && proxyHead.length) + proxySocket.unshift(proxyHead); + socket.write(createHttpHeader("HTTP/1.1 101 Switching Protocols", proxyRes.headers)); + proxySocket.pipe(socket).pipe(proxySocket); + server.emit("open", proxySocket); + server.emit("proxySocket", proxySocket); + }); + return proxyReq.end(); + function onOutgoingError(err) { + if (clb) { + clb(err, req2, socket); + } else { + server.emit("error", err, req2, socket); + } + socket.end(); + } + } + }; + (function(module) { + var httpProxy = module.exports, extend2 = require$$0$6._extend, parse_url = require$$0$9.parse, EE3 = eventemitter3Exports, http2 = require$$1$1, https2 = require$$1$2, web = webIncoming, ws = wsIncoming; + httpProxy.Server = ProxyServer2; + function createRightProxy(type) { + return function(options2) { + return function(req2, res) { + var passes = type === "ws" ? this.wsPasses : this.webPasses, args = [].slice.call(arguments), cntr = args.length - 1, head, cbl; + if (typeof args[cntr] === "function") { + cbl = args[cntr]; + cntr--; + } + var requestOptions = options2; + if (!(args[cntr] instanceof Buffer) && args[cntr] !== res) { + requestOptions = extend2({}, options2); + extend2(requestOptions, args[cntr]); + cntr--; + } + if (args[cntr] instanceof Buffer) { + head = args[cntr]; + } + ["target", "forward"].forEach(function(e) { + if (typeof requestOptions[e] === "string") + requestOptions[e] = parse_url(requestOptions[e]); + }); + if (!requestOptions.target && !requestOptions.forward) { + return this.emit("error", new Error("Must provide a proper URL as target")); + } + for (var i = 0; i < passes.length; i++) { + if (passes[i](req2, res, requestOptions, head, this, cbl)) { + break; + } + } + }; + }; + } + httpProxy.createRightProxy = createRightProxy; + function ProxyServer2(options2) { + EE3.call(this); + options2 = options2 || {}; + options2.prependPath = options2.prependPath === false ? false : true; + this.web = this.proxyRequest = createRightProxy("web")(options2); + this.ws = this.proxyWebsocketRequest = createRightProxy("ws")(options2); + this.options = options2; + this.webPasses = Object.keys(web).map(function(pass) { + return web[pass]; + }); + this.wsPasses = Object.keys(ws).map(function(pass) { + return ws[pass]; + }); + this.on("error", this.onError, this); + } + require$$0$6.inherits(ProxyServer2, EE3); + ProxyServer2.prototype.onError = function(err) { + if (this.listeners("error").length === 1) { + throw err; + } + }; + ProxyServer2.prototype.listen = function(port, hostname) { + var self2 = this, closure = function(req2, res) { + self2.web(req2, res); + }; + this._server = this.options.ssl ? https2.createServer(this.options.ssl, closure) : http2.createServer(closure); + if (this.options.ws) { + this._server.on("upgrade", function(req2, socket, head) { + self2.ws(req2, socket, head); + }); + } + this._server.listen(port, hostname); + return this; + }; + ProxyServer2.prototype.close = function(callback) { + var self2 = this; + if (this._server) { + this._server.close(done); + } + function done() { + self2._server = null; + if (callback) { + callback.apply(null, arguments); + } + } + }; + ProxyServer2.prototype.before = function(type, passName, callback) { + if (type !== "ws" && type !== "web") { + throw new Error("type must be `web` or `ws`"); + } + var passes = type === "ws" ? this.wsPasses : this.webPasses, i = false; + passes.forEach(function(v, idx) { + if (v.name === passName) + i = idx; + }); + if (i === false) + throw new Error("No such pass"); + passes.splice(i, 0, callback); + }; + ProxyServer2.prototype.after = function(type, passName, callback) { + if (type !== "ws" && type !== "web") { + throw new Error("type must be `web` or `ws`"); + } + var passes = type === "ws" ? this.wsPasses : this.webPasses, i = false; + passes.forEach(function(v, idx) { + if (v.name === passName) + i = idx; + }); + if (i === false) + throw new Error("No such pass"); + passes.splice(i++, 0, callback); + }; + })(httpProxy$2); + ProxyServer = httpProxyExports.Server; + ProxyServer.createProxyServer = createProxyServer; + ProxyServer.createServer = createProxyServer; + ProxyServer.createProxy = createProxyServer; + httpProxy$1 = ProxyServer; + (function(module) { + module.exports = httpProxy$1; + })(httpProxy$3); + debug$1 = createDebugger("vite:proxy"); + libExports = {}; + lib = { + get exports() { + return libExports; + }, + set exports(v) { + libExports = v; + } + }; + (function(module, exports2) { + var url2 = require$$0$9; + module.exports = function historyApiFallback(options2) { + options2 = options2 || {}; + var logger = getLogger(options2); + return function(req2, res, next) { + var headers = req2.headers; + if (req2.method !== "GET" && req2.method !== "HEAD") { + logger( + "Not rewriting", + req2.method, + req2.url, + "because the method is not GET or HEAD." + ); + return next(); + } else if (!headers || typeof headers.accept !== "string") { + logger( + "Not rewriting", + req2.method, + req2.url, + "because the client did not send an HTTP accept header." + ); + return next(); + } else if (headers.accept.indexOf("application/json") === 0) { + logger( + "Not rewriting", + req2.method, + req2.url, + "because the client prefers JSON." + ); + return next(); + } else if (!acceptsHtml(headers.accept, options2)) { + logger( + "Not rewriting", + req2.method, + req2.url, + "because the client does not accept HTML." + ); + return next(); + } + var parsedUrl = url2.parse(req2.url); + var rewriteTarget; + options2.rewrites = options2.rewrites || []; + for (var i = 0; i < options2.rewrites.length; i++) { + var rewrite = options2.rewrites[i]; + var match = parsedUrl.pathname.match(rewrite.from); + if (match !== null) { + rewriteTarget = evaluateRewriteRule(parsedUrl, match, rewrite.to, req2); + if (rewriteTarget.charAt(0) !== "/") { + logger( + "We recommend using an absolute path for the rewrite target.", + "Received a non-absolute rewrite target", + rewriteTarget, + "for URL", + req2.url + ); + } + logger("Rewriting", req2.method, req2.url, "to", rewriteTarget); + req2.url = rewriteTarget; + return next(); + } + } + var pathname = parsedUrl.pathname; + if (pathname.lastIndexOf(".") > pathname.lastIndexOf("/") && options2.disableDotRule !== true) { + logger( + "Not rewriting", + req2.method, + req2.url, + "because the path includes a dot (.) character." + ); + return next(); + } + rewriteTarget = options2.index || "/index.html"; + logger("Rewriting", req2.method, req2.url, "to", rewriteTarget); + req2.url = rewriteTarget; + next(); + }; + }; + function evaluateRewriteRule(parsedUrl, match, rule, req2) { + if (typeof rule === "string") { + return rule; + } else if (typeof rule !== "function") { + throw new Error("Rewrite rule can only be of type string or function."); + } + return rule({ + parsedUrl, + match, + request: req2 + }); + } + function acceptsHtml(header, options2) { + options2.htmlAcceptHeaders = options2.htmlAcceptHeaders || ["text/html", "*/*"]; + for (var i = 0; i < options2.htmlAcceptHeaders.length; i++) { + if (header.indexOf(options2.htmlAcceptHeaders[i]) !== -1) { + return true; + } + } + return false; + } + function getLogger(options2) { + if (options2 && options2.logger) { + return options2.logger; + } else if (options2 && options2.verbose) { + return console.log.bind(console); + } + return function() { + }; + } + })(lib); + debugCache = createDebugger("vite:cache"); + isDebug = !!process.env.DEBUG; + logTime = createDebugger("vite:time"); + isWslExports = {}; + isWsl$2 = { + get exports() { + return isWslExports; + }, + set exports(v) { + isWslExports = v; + } + }; + fs$3 = require$$0__default; + isDocker_1 = () => { + if (isDocker$2 === void 0) { + isDocker$2 = hasDockerEnv() || hasDockerCGroup(); + } + return isDocker$2; + }; + os = require$$2; + fs$2 = require$$0__default; + isDocker$1 = isDocker_1; + isWsl$1 = () => { + if (process.platform !== "linux") { + return false; + } + if (os.release().toLowerCase().includes("microsoft")) { + if (isDocker$1()) { + return false; + } + return true; + } + try { + return fs$2.readFileSync("/proc/version", "utf8").toLowerCase().includes("microsoft") ? !isDocker$1() : false; + } catch (_) { + return false; + } + }; + if (process.env.__IS_WSL_TEST__) { + isWsl$2.exports = isWsl$1; + } else { + isWsl$2.exports = isWsl$1(); + } + defineLazyProp = (object, propertyName, fn) => { + const define = (value2) => Object.defineProperty(object, propertyName, { value: value2, enumerable: true, writable: true }); + Object.defineProperty(object, propertyName, { + configurable: true, + enumerable: true, + get() { + const result = fn(); + define(result); + return result; + }, + set(value2) { + define(value2); + } + }); + return object; + }; + path$3 = require$$0$4; + childProcess = require$$2$1; + ({ promises: fs$1, constants: fsConstants } = require$$0__default); + isWsl = isWslExports; + isDocker = isDocker_1; + defineLazyProperty = defineLazyProp; + localXdgOpenPath = path$3.join(__dirname, "xdg-open"); + ({ platform, arch } = process); + hasContainerEnv = () => { + try { + fs$1.statSync("/run/.containerenv"); + return true; + } catch { + return false; + } + }; + getWslDrivesMountPoint = (() => { + const defaultMountPoint = "/mnt/"; + let mountPoint; + return async function() { + if (mountPoint) { + return mountPoint; + } + const configFilePath = "/etc/wsl.conf"; + let isConfigFileExists = false; + try { + await fs$1.access(configFilePath, fsConstants.F_OK); + isConfigFileExists = true; + } catch { + } + if (!isConfigFileExists) { + return defaultMountPoint; + } + const configContent = await fs$1.readFile(configFilePath, { encoding: "utf8" }); + const configMountPoint = /(?.*)/g.exec(configContent); + if (!configMountPoint) { + return defaultMountPoint; + } + mountPoint = configMountPoint.groups.mountPoint.trim(); + mountPoint = mountPoint.endsWith("/") ? mountPoint : `${mountPoint}/`; + return mountPoint; + }; + })(); + pTryEach = async (array2, mapper) => { + let latestError; + for (const item of array2) { + try { + return await mapper(item); + } catch (error2) { + latestError = error2; + } + } + throw latestError; + }; + baseOpen = async (options2) => { + options2 = { + wait: false, + background: false, + newInstance: false, + allowNonzeroExitCode: false, + ...options2 + }; + if (Array.isArray(options2.app)) { + return pTryEach(options2.app, (singleApp) => baseOpen({ + ...options2, + app: singleApp + })); + } + let { name: app, arguments: appArguments = [] } = options2.app || {}; + appArguments = [...appArguments]; + if (Array.isArray(app)) { + return pTryEach(app, (appName) => baseOpen({ + ...options2, + app: { + name: appName, + arguments: appArguments + } + })); + } + let command; + const cliArguments = []; + const childProcessOptions = {}; + if (platform === "darwin") { + command = "open"; + if (options2.wait) { + cliArguments.push("--wait-apps"); + } + if (options2.background) { + cliArguments.push("--background"); + } + if (options2.newInstance) { + cliArguments.push("--new"); + } + if (app) { + cliArguments.push("-a", app); + } + } else if (platform === "win32" || isWsl && !isInsideContainer() && !app) { + const mountPoint = await getWslDrivesMountPoint(); + command = isWsl ? `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe` : `${process.env.SYSTEMROOT}\\System32\\WindowsPowerShell\\v1.0\\powershell`; + cliArguments.push( + "-NoProfile", + "-NonInteractive", + "\u2013ExecutionPolicy", + "Bypass", + "-EncodedCommand" + ); + if (!isWsl) { + childProcessOptions.windowsVerbatimArguments = true; + } + const encodedArguments = ["Start"]; + if (options2.wait) { + encodedArguments.push("-Wait"); + } + if (app) { + encodedArguments.push(`"\`"${app}\`""`, "-ArgumentList"); + if (options2.target) { + appArguments.unshift(options2.target); + } + } else if (options2.target) { + encodedArguments.push(`"${options2.target}"`); + } + if (appArguments.length > 0) { + appArguments = appArguments.map((arg) => `"\`"${arg}\`""`); + encodedArguments.push(appArguments.join(",")); + } + options2.target = Buffer.from(encodedArguments.join(" "), "utf16le").toString("base64"); + } else { + if (app) { + command = app; + } else { + const isBundled = !__dirname || __dirname === "/"; + let exeLocalXdgOpen = false; + try { + await fs$1.access(localXdgOpenPath, fsConstants.X_OK); + exeLocalXdgOpen = true; + } catch { + } + const useSystemXdgOpen = process.versions.electron || platform === "android" || isBundled || !exeLocalXdgOpen; + command = useSystemXdgOpen ? "xdg-open" : localXdgOpenPath; + } + if (appArguments.length > 0) { + cliArguments.push(...appArguments); + } + if (!options2.wait) { + childProcessOptions.stdio = "ignore"; + childProcessOptions.detached = true; + } + } + if (options2.target) { + cliArguments.push(options2.target); + } + if (platform === "darwin" && appArguments.length > 0) { + cliArguments.push("--args", ...appArguments); + } + const subprocess = childProcess.spawn(command, cliArguments, childProcessOptions); + if (options2.wait) { + return new Promise((resolve3, reject) => { + subprocess.once("error", reject); + subprocess.once("close", (exitCode) => { + if (!options2.allowNonzeroExitCode && exitCode > 0) { + reject(new Error(`Exited with code ${exitCode}`)); + return; + } + resolve3(subprocess); + }); + }); + } + subprocess.unref(); + return subprocess; + }; + open = (target, options2) => { + if (typeof target !== "string") { + throw new TypeError("Expected a `target`"); + } + return baseOpen({ + ...options2, + target + }); + }; + openApp = (name2, options2) => { + if (typeof name2 !== "string") { + throw new TypeError("Expected a `name`"); + } + const { arguments: appArguments = [] } = options2 || {}; + if (appArguments !== void 0 && appArguments !== null && !Array.isArray(appArguments)) { + throw new TypeError("Expected `appArguments` as Array type"); + } + return baseOpen({ + ...options2, + app: { + name: name2, + arguments: appArguments + } + }); + }; + apps = {}; + defineLazyProperty(apps, "chrome", () => detectPlatformBinary({ + darwin: "google chrome", + win32: "chrome", + linux: ["google-chrome", "google-chrome-stable", "chromium"] + }, { + wsl: { + ia32: "/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe", + x64: ["/mnt/c/Program Files/Google/Chrome/Application/chrome.exe", "/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe"] + } + })); + defineLazyProperty(apps, "firefox", () => detectPlatformBinary({ + darwin: "firefox", + win32: "C:\\Program Files\\Mozilla Firefox\\firefox.exe", + linux: "firefox" + }, { + wsl: "/mnt/c/Program Files/Mozilla Firefox/firefox.exe" + })); + defineLazyProperty(apps, "edge", () => detectPlatformBinary({ + darwin: "microsoft edge", + win32: "msedge", + linux: ["microsoft-edge", "microsoft-edge-dev"] + }, { + wsl: "/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" + })); + open.apps = apps; + open.openApp = openApp; + crossSpawnExports = {}; + crossSpawn = { + get exports() { + return crossSpawnExports; + }, + set exports(v) { + crossSpawnExports = v; + } + }; + if (process.platform === "win32" || commonjsGlobal.TESTING_WINDOWS) { + core = requireWindows(); + } else { + core = requireMode(); + } + isexe_1 = isexe$1; + isexe$1.sync = sync; + isWindows = process.platform === "win32" || process.env.OSTYPE === "cygwin" || process.env.OSTYPE === "msys"; + path$2 = require$$0$4; + COLON = isWindows ? ";" : ":"; + isexe = isexe_1; + getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" }); + getPathInfo = (cmd, opt) => { + const colon = opt.colon || COLON; + const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [""] : [ + // windows always checks the cwd first + ...isWindows ? [process.cwd()] : [], + ...(opt.path || process.env.PATH || /* istanbul ignore next: very unusual */ + "").split(colon) + ]; + const pathExtExe = isWindows ? opt.pathExt || process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM" : ""; + const pathExt = isWindows ? pathExtExe.split(colon) : [""]; + if (isWindows) { + if (cmd.indexOf(".") !== -1 && pathExt[0] !== "") + pathExt.unshift(""); + } + return { + pathEnv, + pathExt, + pathExtExe + }; + }; + which$1 = (cmd, opt, cb) => { + if (typeof opt === "function") { + cb = opt; + opt = {}; + } + if (!opt) + opt = {}; + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); + const found2 = []; + const step = (i) => new Promise((resolve3, reject) => { + if (i === pathEnv.length) + return opt.all && found2.length ? resolve3(found2) : reject(getNotFoundError(cmd)); + const ppRaw = pathEnv[i]; + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; + const pCmd = path$2.join(pathPart, cmd); + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; + resolve3(subStep(p, i, 0)); + }); + const subStep = (p, i, ii) => new Promise((resolve3, reject) => { + if (ii === pathExt.length) + return resolve3(step(i + 1)); + const ext2 = pathExt[ii]; + isexe(p + ext2, { pathExt: pathExtExe }, (er, is) => { + if (!er && is) { + if (opt.all) + found2.push(p + ext2); + else + return resolve3(p + ext2); + } + return resolve3(subStep(p, i, ii + 1)); + }); + }); + return cb ? step(0).then((res) => cb(null, res), cb) : step(0); + }; + whichSync = (cmd, opt) => { + opt = opt || {}; + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt); + const found2 = []; + for (let i = 0; i < pathEnv.length; i++) { + const ppRaw = pathEnv[i]; + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw; + const pCmd = path$2.join(pathPart, cmd); + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd; + for (let j = 0; j < pathExt.length; j++) { + const cur = p + pathExt[j]; + try { + const is = isexe.sync(cur, { pathExt: pathExtExe }); + if (is) { + if (opt.all) + found2.push(cur); + else + return cur; + } + } catch (ex) { + } + } + } + if (opt.all && found2.length) + return found2; + if (opt.nothrow) + return null; + throw getNotFoundError(cmd); + }; + which_1 = which$1; + which$1.sync = whichSync; + pathKeyExports = {}; + pathKey$1 = { + get exports() { + return pathKeyExports; + }, + set exports(v) { + pathKeyExports = v; + } + }; + pathKey = (options2 = {}) => { + const environment = options2.env || process.env; + const platform2 = options2.platform || process.platform; + if (platform2 !== "win32") { + return "PATH"; + } + return Object.keys(environment).reverse().find((key) => key.toUpperCase() === "PATH") || "Path"; + }; + pathKey$1.exports = pathKey; + pathKeyExports.default = pathKey; + path$1 = require$$0$4; + which = which_1; + getPathKey = pathKeyExports; + resolveCommand_1 = resolveCommand$1; + _escape = {}; + metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; + _escape.command = escapeCommand; + _escape.argument = escapeArgument; + shebangRegex$1 = /^#!(.*)/; + shebangRegex = shebangRegex$1; + shebangCommand$1 = (string2 = "") => { + const match = string2.match(shebangRegex); + if (!match) { + return null; + } + const [path3, argument] = match[0].replace(/#! ?/, "").split(" "); + const binary2 = path3.split("/").pop(); + if (binary2 === "env") { + return argument; + } + return argument ? `${binary2} ${argument}` : binary2; + }; + fs = require$$0__default; + shebangCommand = shebangCommand$1; + readShebang_1 = readShebang$1; + path2 = require$$0$4; + resolveCommand = resolveCommand_1; + escape$1 = _escape; + readShebang = readShebang_1; + isWin$1 = process.platform === "win32"; + isExecutableRegExp = /\.(?:com|exe)$/i; + isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; + parse_1 = parse$1; + isWin = process.platform === "win32"; + enoent$1 = { + hookChildProcess, + verifyENOENT, + verifyENOENTSync, + notFoundError + }; + cp = require$$2$1; + parse3 = parse_1; + enoent = enoent$1; + crossSpawn.exports = spawn; + crossSpawnExports.spawn = spawn; + crossSpawnExports.sync = spawnSync; + crossSpawnExports._parse = parse3; + crossSpawnExports._enoent = enoent; + debug = createDebugger("vite:config"); + _require = createRequire$1(__vite_injected_original_import_meta_url2); + } +}); + +// vite-plugin/index.js +var esbuildOptions = { + jsxFactory: "Nixix.create", + jsxFragment: '"fragment"', + jsxImportSource: "nixix", + jsxDev: false, + jsx: "transform", + jsxInject: "import Nixix, { nixixStore, turnOnJsx } from 'nixix/dom';", + minifyIdentifiers: true +}; +var devEsbuildOptions = { + jsxFactory: "Nixix.create", + jsxFragment: "'fragment'", + jsxImportSource: "./index.js", + jsxInject: 'import Nixix, { nixixStore, turnOnJsx } from "dom"' +}; + +// node_modules/vite/dist/node/index.js +init_dep_79892de8(); +init_constants(); +import { version as version3 } from "file:///C:/Users/Charles/Desktop/My%20finished%20projects/Nixix/node_modules/esbuild/lib/main.js"; +import { VERSION as VERSION3 } from "file:///C:/Users/Charles/Desktop/My%20finished%20projects/Nixix/node_modules/rollup/dist/es/rollup.js"; +import "file:///C:/Users/Charles/Desktop/My%20finished%20projects/Nixix/node_modules/resolve/index.js"; + +// vite.config.js +import pathConfig from "file:///C:/Users/Charles/Desktop/My%20finished%20projects/Nixix/node_modules/vite-jsconfig-paths/dist/index.mjs"; + +// vite-plugin/parser.js +import { transform as transform2, transformSync } from "file:///C:/Users/Charles/Desktop/My%20finished%20projects/Nixix/node_modules/@babel/core/lib/index.js"; +import { createFilter as createFilter2 } from "file:///C:/Users/Charles/Desktop/My%20finished%20projects/Nixix/node_modules/@rollup/pluginutils/dist/es/index.js"; +function nixixPlugin(options2 = {}) { + const filter2 = createFilter2(options2.include || [], options2.exclude || []); + const plugin = { + name: "nixix:store-reactivity", + enforce: "pre", + transform: (code, id) => { + if (!/\.(t|j)sx?$/.test(id) || id.includes("node_modules") || id.includes("?worker") || !filter2(id)) + return; + const { ast } = transformSync(code, { ast: true, parserOpts: {} }) || {}; + console.log(ast); + } + }; + return [plugin]; +} + +// vite.config.js +var vite_config_default = defineConfig({ + // @ts-ignore + plugins: [ + pathConfig(), + /* NixixPlugin({ hmr: true, dev: true }) */ + nixixPlugin() + ], + resolve: { + alias: { + dom: "/dom" + } + }, + esbuild: { + ...esbuildOptions, + ...devEsbuildOptions + } +}); +export { + vite_config_default as default +}; +/*! Bundled license information: + +vite/dist/node/chunks/dep-79892de8.js: + (*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + *) + (*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + *) + (*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + *) + (*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + *) + (*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + *) + (*! queue-microtask. MIT License. Feross Aboukhadijeh *) + (*! run-parallel. MIT License. Feross Aboukhadijeh *) + (** + * Autoload Config for PostCSS + * + * @author Michael Ciniawsky @michael-ciniawsky + * @license MIT + * + * @module postcss-load-config + * @version 2.1.0 + * + * @requires comsiconfig + * @requires ./options + * @requires ./plugins + *) + (*! + * etag + * Copyright(c) 2014-2016 Douglas Christopher Wilson + * MIT Licensed + *) + (*! + * encodeurl + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + *) + (*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + *) + (*! + * ee-first + * Copyright(c) 2014 Jonathan Ong + * MIT Licensed + *) + (*! + * on-finished + * Copyright(c) 2013 Jonathan Ong + * Copyright(c) 2014 Douglas Christopher Wilson + * MIT Licensed + *) + (*! + * parseurl + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + *) + (*! + * statuses + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2016 Douglas Christopher Wilson + * MIT Licensed + *) + (*! + * unpipe + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + *) + (*! + * finalhandler + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + *) + (*! + * connect + * Copyright(c) 2010 Sencha Inc. + * Copyright(c) 2011 TJ Holowaychuk + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + *) + (* + object-assign + (c) Sindre Sorhus + @license MIT + *) + (*! + * vary + * Copyright(c) 2014-2017 Douglas Christopher Wilson + * MIT Licensed + *) + (*! + * normalize-path + * + * Copyright (c) 2014-2018, Jon Schlinkert. + * Released under the MIT License. + *) + (*! + * Array of passes. + * + * A `pass` is just a function that is executed on `req, res, options` + * so that you can easily add new checks while still keeping the base + * flexible. + *) + (*! + * Array of passes. + * + * A `pass` is just a function that is executed on `req, socket, options` + * so that you can easily add new checks while still keeping the base + * flexible. + *) + (*! + * Caron dimonio, con occhi di bragia + * loro accennando, tutte le raccoglie; + * batte col remo qualunque s’adagia + * + * Charon the demon, with the eyes of glede, + * Beckoning to them, collects them all together, + * Beats with his oar whoever lags behind + * + * Dante - The Divine Comedy (Canto III) + *) +*/ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL3ZpdGUvZGlzdC9ub2RlL2NvbnN0YW50cy5qcyIsICJub2RlX21vZHVsZXMvdml0ZS9kaXN0L25vZGUvY2h1bmtzL2RlcC03OTg5MmRlOC5qcyIsICJ2aXRlLXBsdWdpbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdml0ZS9kaXN0L25vZGUvaW5kZXguanMiLCAidml0ZS5jb25maWcuanMiLCAidml0ZS1wbHVnaW4vcGFyc2VyLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcQ2hhcmxlc1xcXFxEZXNrdG9wXFxcXE15IGZpbmlzaGVkIHByb2plY3RzXFxcXE5peGl4XFxcXG5vZGVfbW9kdWxlc1xcXFx2aXRlXFxcXGRpc3RcXFxcbm9kZVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcQ2hhcmxlc1xcXFxEZXNrdG9wXFxcXE15IGZpbmlzaGVkIHByb2plY3RzXFxcXE5peGl4XFxcXG5vZGVfbW9kdWxlc1xcXFx2aXRlXFxcXGRpc3RcXFxcbm9kZVxcXFxjb25zdGFudHMuanNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0M6L1VzZXJzL0NoYXJsZXMvRGVza3RvcC9NeSUyMGZpbmlzaGVkJTIwcHJvamVjdHMvTml4aXgvbm9kZV9tb2R1bGVzL3ZpdGUvZGlzdC9ub2RlL2NvbnN0YW50cy5qc1wiO2ltcG9ydCBwYXRoLCB7IHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB7IHZlcnNpb24gfSA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKG5ldyBVUkwoJy4uLy4uL3BhY2thZ2UuanNvbicsIGltcG9ydC5tZXRhLnVybCkpLnRvU3RyaW5nKCkpO1xuY29uc3QgVkVSU0lPTiA9IHZlcnNpb247XG5jb25zdCBERUZBVUxUX01BSU5fRklFTERTID0gW1xuICAgICdtb2R1bGUnLFxuICAgICdqc25leHQ6bWFpbicsXG4gICAgJ2pzbmV4dCcsXG5dO1xuLy8gQmFzZWxpbmUgc3VwcG9ydCBicm93c2Vyc2xpc3Rcbi8vIFwiZGVmYXVsdHMgYW5kIHN1cHBvcnRzIGVzNi1tb2R1bGUgYW5kIHN1cHBvcnRzIGVzNi1tb2R1bGUtZHluYW1pYy1pbXBvcnRcIlxuLy8gSGlnaGVyIGJyb3dzZXIgdmVyc2lvbnMgbWF5IGJlIG5lZWRlZCBmb3IgZXh0cmEgZmVhdHVyZXMuXG5jb25zdCBFU0JVSUxEX01PRFVMRVNfVEFSR0VUID0gW1xuICAgICdlczIwMjAnLFxuICAgICdlZGdlODgnLFxuICAgICdmaXJlZm94NzgnLFxuICAgICdjaHJvbWU4NycsXG4gICAgJ3NhZmFyaTE0Jyxcbl07XG5jb25zdCBERUZBVUxUX0VYVEVOU0lPTlMgPSBbXG4gICAgJy5tanMnLFxuICAgICcuanMnLFxuICAgICcubXRzJyxcbiAgICAnLnRzJyxcbiAgICAnLmpzeCcsXG4gICAgJy50c3gnLFxuICAgICcuanNvbicsXG5dO1xuY29uc3QgREVGQVVMVF9DT05GSUdfRklMRVMgPSBbXG4gICAgJ3ZpdGUuY29uZmlnLmpzJyxcbiAgICAndml0ZS5jb25maWcubWpzJyxcbiAgICAndml0ZS5jb25maWcudHMnLFxuICAgICd2aXRlLmNvbmZpZy5janMnLFxuICAgICd2aXRlLmNvbmZpZy5tdHMnLFxuICAgICd2aXRlLmNvbmZpZy5jdHMnLFxuXTtcbmNvbnN0IEpTX1RZUEVTX1JFID0gL1xcLig/Omp8dClzeD8kfFxcLm1qcyQvO1xuY29uc3QgQ1NTX0xBTkdTX1JFID0gL1xcLihjc3N8bGVzc3xzYXNzfHNjc3N8c3R5bHxzdHlsdXN8cGNzc3xwb3N0Y3NzfHNzcykoPzokfFxcPykvO1xuY29uc3QgT1BUSU1JWkFCTEVfRU5UUllfUkUgPSAvXFwuW2NtXT9banRdcyQvO1xuY29uc3QgU1BFQ0lBTF9RVUVSWV9SRSA9IC9bPyZdKD86d29ya2VyfHNoYXJlZHdvcmtlcnxyYXd8dXJsKVxcYi87XG4vKipcbiAqIFByZWZpeCBmb3IgcmVzb2x2ZWQgZnMgcGF0aHMsIHNpbmNlIHdpbmRvd3MgcGF0aHMgbWF5IG5vdCBiZSB2YWxpZCBhcyBVUkxzLlxuICovXG5jb25zdCBGU19QUkVGSVggPSBgL0Bmcy9gO1xuLyoqXG4gKiBQcmVmaXggZm9yIHJlc29sdmVkIElkcyB0aGF0IGFyZSBub3QgdmFsaWQgYnJvd3NlciBpbXBvcnQgc3BlY2lmaWVyc1xuICovXG5jb25zdCBWQUxJRF9JRF9QUkVGSVggPSBgL0BpZC9gO1xuLyoqXG4gKiBQbHVnaW5zIHRoYXQgdXNlICd2aXJ0dWFsIG1vZHVsZXMnIChlLmcuIGZvciBoZWxwZXIgZnVuY3Rpb25zKSwgcHJlZml4IHRoZVxuICogbW9kdWxlIElEIHdpdGggYFxcMGAsIGEgY29udmVudGlvbiBmcm9tIHRoZSByb2xsdXAgZWNvc3lzdGVtLlxuICogVGhpcyBwcmV2ZW50cyBvdGhlciBwbHVnaW5zIGZyb20gdHJ5aW5nIHRvIHByb2Nlc3MgdGhlIGlkIChsaWtlIG5vZGUgcmVzb2x1dGlvbiksXG4gKiBhbmQgY29yZSBmZWF0dXJlcyBsaWtlIHNvdXJjZW1hcHMgY2FuIHVzZSB0aGlzIGluZm8gdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuXG4gKiB2aXJ0dWFsIG1vZHVsZXMgYW5kIHJlZ3VsYXIgZmlsZXMuXG4gKiBgXFwwYCBpcyBub3QgYSBwZXJtaXR0ZWQgY2hhciBpbiBpbXBvcnQgVVJMcyBzbyB3ZSBoYXZlIHRvIHJlcGxhY2UgdGhlbSBkdXJpbmdcbiAqIGltcG9ydCBhbmFseXNpcy4gVGhlIGlkIHdpbGwgYmUgZGVjb2RlZCBiYWNrIGJlZm9yZSBlbnRlcmluZyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAqIFRoZXNlIGVuY29kZWQgdmlydHVhbCBpZHMgYXJlIGFsc28gcHJlZml4ZWQgYnkgdGhlIFZBTElEX0lEX1BSRUZJWCwgc28gdmlydHVhbFxuICogbW9kdWxlcyBpbiB0aGUgYnJvd3NlciBlbmQgdXAgZW5jb2RlZCBhcyBgL0BpZC9fX3gwMF9fe2lkfWBcbiAqL1xuY29uc3QgTlVMTF9CWVRFX1BMQUNFSE9MREVSID0gYF9feDAwX19gO1xuY29uc3QgQ0xJRU5UX1BVQkxJQ19QQVRIID0gYC9Adml0ZS9jbGllbnRgO1xuY29uc3QgRU5WX1BVQkxJQ19QQVRIID0gYC9Adml0ZS9lbnZgO1xuY29uc3QgVklURV9QQUNLQUdFX0RJUiA9IHJlc29sdmUoXG4vLyBpbXBvcnQubWV0YS51cmwgaXMgYGRpc3Qvbm9kZS9jb25zdGFudHMuanNgIGFmdGVyIGJ1bmRsZVxuZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpLCAnLi4vLi4vLi4nKTtcbmNvbnN0IENMSUVOVF9FTlRSWSA9IHJlc29sdmUoVklURV9QQUNLQUdFX0RJUiwgJ2Rpc3QvY2xpZW50L2NsaWVudC5tanMnKTtcbmNvbnN0IEVOVl9FTlRSWSA9IHJlc29sdmUoVklURV9QQUNLQUdFX0RJUiwgJ2Rpc3QvY2xpZW50L2Vudi5tanMnKTtcbmNvbnN0IENMSUVOVF9ESVIgPSBwYXRoLmRpcm5hbWUoQ0xJRU5UX0VOVFJZKTtcbi8vICoqIFJFQUQgVEhJUyAqKiBiZWZvcmUgZWRpdGluZyBgS05PV05fQVNTRVRfVFlQRVNgLlxuLy8gICBJZiB5b3UgYWRkIGFuIGFzc2V0IHRvIGBLTk9XTl9BU1NFVF9UWVBFU2AsIG1ha2Ugc3VyZSB0byBhbHNvIGFkZCBpdFxuLy8gICB0byB0aGUgVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlIGBwYWNrYWdlcy92aXRlL2NsaWVudC5kLnRzYCBhbmRcbi8vICAgYWRkIGEgbWltZSB0eXBlIHRvIHRoZSBgcmVnaXN0ZXJDdXN0b21NaW1lYCBpblxuLy8gICBgcGFja2FnZXMvdml0ZS9zcmMvbm9kZS9wbHVnaW4vYXNzZXRzLnRzYCBpZiBtaW1lIHR5cGUgY2Fubm90IGJlXG4vLyAgIGxvb2tlZCB1cCBieSBtcm1pbWUuXG5jb25zdCBLTk9XTl9BU1NFVF9UWVBFUyA9IFtcbiAgICAvLyBpbWFnZXNcbiAgICAncG5nJyxcbiAgICAnanBlP2cnLFxuICAgICdqZmlmJyxcbiAgICAncGpwZWcnLFxuICAgICdwanAnLFxuICAgICdnaWYnLFxuICAgICdzdmcnLFxuICAgICdpY28nLFxuICAgICd3ZWJwJyxcbiAgICAnYXZpZicsXG4gICAgLy8gbWVkaWFcbiAgICAnbXA0JyxcbiAgICAnd2VibScsXG4gICAgJ29nZycsXG4gICAgJ21wMycsXG4gICAgJ3dhdicsXG4gICAgJ2ZsYWMnLFxuICAgICdhYWMnLFxuICAgIC8vIGZvbnRzXG4gICAgJ3dvZmYyPycsXG4gICAgJ2VvdCcsXG4gICAgJ3R0ZicsXG4gICAgJ290ZicsXG4gICAgLy8gb3RoZXJcbiAgICAnd2VibWFuaWZlc3QnLFxuICAgICdwZGYnLFxuICAgICd0eHQnLFxuXTtcbmNvbnN0IERFRkFVTFRfQVNTRVRTX1JFID0gbmV3IFJlZ0V4cChgXFxcXC4oYCArIEtOT1dOX0FTU0VUX1RZUEVTLmpvaW4oJ3wnKSArIGApKFxcXFw/LiopPyRgKTtcbmNvbnN0IERFUF9WRVJTSU9OX1JFID0gL1s/Jl0odj1bXFx3Li1dKylcXGIvO1xuY29uc3QgbG9vcGJhY2tIb3N0cyA9IG5ldyBTZXQoW1xuICAgICdsb2NhbGhvc3QnLFxuICAgICcxMjcuMC4wLjEnLFxuICAgICc6OjEnLFxuICAgICcwMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDEnLFxuXSk7XG5jb25zdCB3aWxkY2FyZEhvc3RzID0gbmV3IFNldChbXG4gICAgJzAuMC4wLjAnLFxuICAgICc6OicsXG4gICAgJzAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCcsXG5dKTtcbmNvbnN0IERFRkFVTFRfREVWX1BPUlQgPSA1MTczO1xuY29uc3QgREVGQVVMVF9QUkVWSUVXX1BPUlQgPSA0MTczO1xuXG5leHBvcnQgeyBDTElFTlRfRElSLCBDTElFTlRfRU5UUlksIENMSUVOVF9QVUJMSUNfUEFUSCwgQ1NTX0xBTkdTX1JFLCBERUZBVUxUX0FTU0VUU19SRSwgREVGQVVMVF9DT05GSUdfRklMRVMsIERFRkFVTFRfREVWX1BPUlQsIERFRkFVTFRfRVhURU5TSU9OUywgREVGQVVMVF9NQUlOX0ZJRUxEUywgREVGQVVMVF9QUkVWSUVXX1BPUlQsIERFUF9WRVJTSU9OX1JFLCBFTlZfRU5UUlksIEVOVl9QVUJMSUNfUEFUSCwgRVNCVUlMRF9NT0RVTEVTX1RBUkdFVCwgRlNfUFJFRklYLCBKU19UWVBFU19SRSwgS05PV05fQVNTRVRfVFlQRVMsIE5VTExfQllURV9QTEFDRUhPTERFUiwgT1BUSU1JWkFCTEVfRU5UUllfUkUsIFNQRUNJQUxfUVVFUllfUkUsIFZBTElEX0lEX1BSRUZJWCwgVkVSU0lPTiwgVklURV9QQUNLQUdFX0RJUiwgbG9vcGJhY2tIb3N0cywgd2lsZGNhcmRIb3N0cyB9O1xuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxDaGFybGVzXFxcXERlc2t0b3BcXFxcTXkgZmluaXNoZWQgcHJvamVjdHNcXFxcTml4aXhcXFxcbm9kZV9tb2R1bGVzXFxcXHZpdGVcXFxcZGlzdFxcXFxub2RlXFxcXGNodW5rc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcQ2hhcmxlc1xcXFxEZXNrdG9wXFxcXE15IGZpbmlzaGVkIHByb2plY3RzXFxcXE5peGl4XFxcXG5vZGVfbW9kdWxlc1xcXFx2aXRlXFxcXGRpc3RcXFxcbm9kZVxcXFxjaHVua3NcXFxcZGVwLTc5ODkyZGU4LmpzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9DOi9Vc2Vycy9DaGFybGVzL0Rlc2t0b3AvTXklMjBmaW5pc2hlZCUyMHByb2plY3RzL05peGl4L25vZGVfbW9kdWxlcy92aXRlL2Rpc3Qvbm9kZS9jaHVua3MvZGVwLTc5ODkyZGU4LmpzXCI7aW1wb3J0IGZzJGwsIHsgcHJvbWlzZXMgYXMgcHJvbWlzZXMkMiB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGgkbywgeyBwb3NpeCBhcyBwb3NpeCQxLCBpc0Fic29sdXRlIGFzIGlzQWJzb2x1dGUkMiwgam9pbiBhcyBqb2luJDIsIHJlbGF0aXZlIGFzIHJlbGF0aXZlJDIsIGRpcm5hbWUgYXMgZGlybmFtZSQyLCBiYXNlbmFtZSBhcyBiYXNlbmFtZSQyLCBleHRuYW1lIGFzIGV4dG5hbWUkMSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBVUkwgYXMgVVJMJDMsIFVSTFNlYXJjaFBhcmFtcywgcGFyc2UgYXMgcGFyc2UkaSwgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IHBlcmZvcm1hbmNlIH0gZnJvbSAnbm9kZTpwZXJmX2hvb2tzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgYXMgY3JlYXRlUmVxdWlyZSQxLCBidWlsdGluTW9kdWxlcyB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCByZXF1aXJlJCQwJDMgZnJvbSAndHR5JztcbmltcG9ydCBlc2J1aWxkLCB7IHRyYW5zZm9ybSBhcyB0cmFuc2Zvcm0kMiwgZm9ybWF0TWVzc2FnZXMsIGJ1aWxkIGFzIGJ1aWxkJDMgfSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCByZXF1aXJlJCQwJDQsIHsgd2luMzIsIHBvc2l4LCBpc0Fic29sdXRlIGFzIGlzQWJzb2x1dGUkMSwgcmVzb2x2ZSBhcyByZXNvbHZlJDMsIHJlbGF0aXZlIGFzIHJlbGF0aXZlJDEsIGJhc2VuYW1lIGFzIGJhc2VuYW1lJDEsIGV4dG5hbWUsIGRpcm5hbWUgYXMgZGlybmFtZSQxLCBqb2luIGFzIGpvaW4kMSwgc2VwLCBub3JtYWxpemUgfSBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHJlcXVpcmUkJDAkMiBmcm9tICdmcyc7XG5pbXBvcnQgcmVxdWlyZSQkMF9fZGVmYXVsdCwgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMsIHN0YXRTeW5jIGFzIHN0YXRTeW5jJDEsIHByb21pc2VzIGFzIHByb21pc2VzJDEsIHJlYWRkaXJTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHJlcXVpcmUkJDAkNSBmcm9tICdldmVudHMnO1xuaW1wb3J0IHJlcXVpcmUkJDUgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCByZXF1aXJlJCQwJDYgZnJvbSAndXRpbCc7XG5pbXBvcnQgcmVxdWlyZSQkMyQyIGZyb20gJ25ldCc7XG5pbXBvcnQgcmVxdWlyZSQkMCQ5IGZyb20gJ3VybCc7XG5pbXBvcnQgcmVxdWlyZSQkMSQxIGZyb20gJ2h0dHAnO1xuaW1wb3J0IHJlcXVpcmUkJDAkNyBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHJlcXVpcmUkJDIgZnJvbSAnb3MnO1xuaW1wb3J0IHJlcXVpcmUkJDIkMSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBvcyQzIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCBhcyBjcmVhdGVIYXNoJDIgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBwcm9taXNpZnkgYXMgcHJvbWlzaWZ5JDQsIGZvcm1hdCBhcyBmb3JtYXQkMiwgaW5zcGVjdCB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgeyBwcm9taXNlcyB9IGZyb20gJ25vZGU6ZG5zJztcbmltcG9ydCByZXNvbHZlJDQgZnJvbSAncmVzb2x2ZSc7XG5pbXBvcnQgeyBDTElFTlRfRU5UUlksIE9QVElNSVpBQkxFX0VOVFJZX1JFLCBERUZBVUxUX0VYVEVOU0lPTlMgYXMgREVGQVVMVF9FWFRFTlNJT05TJDEsIHdpbGRjYXJkSG9zdHMsIGxvb3BiYWNrSG9zdHMsIFZBTElEX0lEX1BSRUZJWCwgTlVMTF9CWVRFX1BMQUNFSE9MREVSLCBGU19QUkVGSVgsIENMSUVOVF9QVUJMSUNfUEFUSCwgRU5WX1BVQkxJQ19QQVRILCBFTlZfRU5UUlksIERFRkFVTFRfTUFJTl9GSUVMRFMsIFNQRUNJQUxfUVVFUllfUkUsIERFUF9WRVJTSU9OX1JFLCBDU1NfTEFOR1NfUkUsIEtOT1dOX0FTU0VUX1RZUEVTLCBDTElFTlRfRElSLCBKU19UWVBFU19SRSwgRVNCVUlMRF9NT0RVTEVTX1RBUkdFVCwgVkVSU0lPTiBhcyBWRVJTSU9OJDEsIFZJVEVfUEFDS0FHRV9ESVIsIERFRkFVTFRfREVWX1BPUlQsIERFRkFVTFRfUFJFVklFV19QT1JULCBERUZBVUxUX0FTU0VUU19SRSwgREVGQVVMVF9DT05GSUdfRklMRVMgfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHJlcXVpcmUkJDUkMSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgQnVmZmVyIGFzIEJ1ZmZlciQxIH0gZnJvbSAnbm9kZTpidWZmZXInO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCByZXF1aXJlJCQwJDgsIHsgY3JlYXRlUmVxdWlyZSBhcyBjcmVhdGVSZXF1aXJlJDIgfSBmcm9tICdtb2R1bGUnO1xuaW1wb3J0IGFzc2VydCQxIGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCBwcm9jZXNzJDEgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB2OCBmcm9tICdub2RlOnY4JztcbmltcG9ydCByZXF1aXJlJCQxIGZyb20gJ3dvcmtlcl90aHJlYWRzJztcbmltcG9ydCByZXF1aXJlJCQwJGEgZnJvbSAnemxpYic7XG5pbXBvcnQgcmVxdWlyZSQkMCRiIGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgcmVxdWlyZSQkMSQyIGZyb20gJ2h0dHBzJztcbmltcG9ydCByZXF1aXJlJCQ0IGZyb20gJ3Rscyc7XG5pbXBvcnQgeyBTVEFUVVNfQ09ERVMgfSBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHsgY3JlYXRlU2VydmVyIGFzIGNyZWF0ZVNlcnZlciQyIH0gZnJvbSAnbm9kZTpodHRwcyc7XG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCAqIGFzIHFzIGZyb20gJ3F1ZXJ5c3RyaW5nJztcbmltcG9ydCByZWFkbGluZSBmcm9tICdub2RlOnJlYWRsaW5lJztcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB6bGliJDEsIHsgZ3ppcCB9IGZyb20gJ25vZGU6emxpYic7XG5cbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggYXMgX19janNfZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGRpcm5hbWUgYXMgX19janNfZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIGFzIF9fY2pzX2NyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5cbmNvbnN0IF9fZmlsZW5hbWUgPSBfX2Nqc19maWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBfX2Rpcm5hbWUgPSBfX2Nqc19kaXJuYW1lKF9fZmlsZW5hbWUpO1xuY29uc3QgcmVxdWlyZSA9IF9fY2pzX2NyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IF9fcmVxdWlyZSA9IHJlcXVpcmU7XG52YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDtcbn1cblxuZnVuY3Rpb24gZ2V0QXVnbWVudGVkTmFtZXNwYWNlKG4pIHtcbiAgaWYgKG4uX19lc01vZHVsZSkgcmV0dXJuIG47XG4gIHZhciBmID0gbi5kZWZhdWx0O1xuXHRpZiAodHlwZW9mIGYgPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0dmFyIGEgPSBmdW5jdGlvbiBhICgpIHtcblx0XHRcdGlmICh0aGlzIGluc3RhbmNlb2YgYSkge1xuXHRcdFx0XHR2YXIgYXJncyA9IFtudWxsXTtcblx0XHRcdFx0YXJncy5wdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdHZhciBDdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShmLCBhcmdzKTtcblx0XHRcdFx0cmV0dXJuIG5ldyBDdG9yKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdH07XG5cdFx0YS5wcm90b3R5cGUgPSBmLnByb3RvdHlwZTtcbiAgfSBlbHNlIGEgPSB7fTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsICdfX2VzTW9kdWxlJywge3ZhbHVlOiB0cnVlfSk7XG5cdE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24gKGspIHtcblx0XHR2YXIgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobiwgayk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIGssIGQuZ2V0ID8gZCA6IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIG5ba107XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xuXHRyZXR1cm4gYTtcbn1cblxudmFyIHBpY29jb2xvcnNFeHBvcnRzID0ge307XG52YXIgcGljb2NvbG9ycyA9IHtcbiAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIHBpY29jb2xvcnNFeHBvcnRzOyB9LFxuICBzZXQgZXhwb3J0cyh2KXsgcGljb2NvbG9yc0V4cG9ydHMgPSB2OyB9LFxufTtcblxubGV0IHR0eSA9IHJlcXVpcmUkJDAkMztcblxubGV0IGlzQ29sb3JTdXBwb3J0ZWQgPVxuXHQhKFwiTk9fQ09MT1JcIiBpbiBwcm9jZXNzLmVudiB8fCBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoXCItLW5vLWNvbG9yXCIpKSAmJlxuXHQoXCJGT1JDRV9DT0xPUlwiIGluIHByb2Nlc3MuZW52IHx8XG5cdFx0cHJvY2Vzcy5hcmd2LmluY2x1ZGVzKFwiLS1jb2xvclwiKSB8fFxuXHRcdHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIiB8fFxuXHRcdCh0dHkuaXNhdHR5KDEpICYmIHByb2Nlc3MuZW52LlRFUk0gIT09IFwiZHVtYlwiKSB8fFxuXHRcdFwiQ0lcIiBpbiBwcm9jZXNzLmVudik7XG5cbmxldCBmb3JtYXR0ZXIgPVxuXHQob3BlbiwgY2xvc2UsIHJlcGxhY2UgPSBvcGVuKSA9PlxuXHRpbnB1dCA9PiB7XG5cdFx0bGV0IHN0cmluZyA9IFwiXCIgKyBpbnB1dDtcblx0XHRsZXQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjbG9zZSwgb3Blbi5sZW5ndGgpO1xuXHRcdHJldHVybiB+aW5kZXhcblx0XHRcdD8gb3BlbiArIHJlcGxhY2VDbG9zZShzdHJpbmcsIGNsb3NlLCByZXBsYWNlLCBpbmRleCkgKyBjbG9zZVxuXHRcdFx0OiBvcGVuICsgc3RyaW5nICsgY2xvc2Vcblx0fTtcblxubGV0IHJlcGxhY2VDbG9zZSA9IChzdHJpbmcsIGNsb3NlLCByZXBsYWNlLCBpbmRleCkgPT4ge1xuXHRsZXQgc3RhcnQgPSBzdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KSArIHJlcGxhY2U7XG5cdGxldCBlbmQgPSBzdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgY2xvc2UubGVuZ3RoKTtcblx0bGV0IG5leHRJbmRleCA9IGVuZC5pbmRleE9mKGNsb3NlKTtcblx0cmV0dXJuIH5uZXh0SW5kZXggPyBzdGFydCArIHJlcGxhY2VDbG9zZShlbmQsIGNsb3NlLCByZXBsYWNlLCBuZXh0SW5kZXgpIDogc3RhcnQgKyBlbmRcbn07XG5cbmxldCBjcmVhdGVDb2xvcnMgPSAoZW5hYmxlZCA9IGlzQ29sb3JTdXBwb3J0ZWQpID0+ICh7XG5cdGlzQ29sb3JTdXBwb3J0ZWQ6IGVuYWJsZWQsXG5cdHJlc2V0OiBlbmFibGVkID8gcyA9PiBgXFx4MWJbMG0ke3N9XFx4MWJbMG1gIDogU3RyaW5nLFxuXHRib2xkOiBlbmFibGVkID8gZm9ybWF0dGVyKFwiXFx4MWJbMW1cIiwgXCJcXHgxYlsyMm1cIiwgXCJcXHgxYlsyMm1cXHgxYlsxbVwiKSA6IFN0cmluZyxcblx0ZGltOiBlbmFibGVkID8gZm9ybWF0dGVyKFwiXFx4MWJbMm1cIiwgXCJcXHgxYlsyMm1cIiwgXCJcXHgxYlsyMm1cXHgxYlsybVwiKSA6IFN0cmluZyxcblx0aXRhbGljOiBlbmFibGVkID8gZm9ybWF0dGVyKFwiXFx4MWJbM21cIiwgXCJcXHgxYlsyM21cIikgOiBTdHJpbmcsXG5cdHVuZGVybGluZTogZW5hYmxlZCA/IGZvcm1hdHRlcihcIlxceDFiWzRtXCIsIFwiXFx4MWJbMjRtXCIpIDogU3RyaW5nLFxuXHRpbnZlcnNlOiBlbmFibGVkID8gZm9ybWF0dGVyKFwiXFx4MWJbN21cIiwgXCJcXHgxYlsyN21cIikgOiBTdHJpbmcsXG5cdGhpZGRlbjogZW5hYmxlZCA/IGZvcm1hdHRlcihcIlxceDFiWzhtXCIsIFwiXFx4MWJbMjhtXCIpIDogU3RyaW5nLFxuXHRzdHJpa2V0aHJvdWdoOiBlbmFibGVkID8gZm9ybWF0dGVyKFwiXFx4MWJbOW1cIiwgXCJcXHgxYlsyOW1cIikgOiBTdHJpbmcsXG5cdGJsYWNrOiBlbmFibGVkID8gZm9ybWF0dGVyKFwiXFx4MWJbMzBtXCIsIFwiXFx4MWJbMzltXCIpIDogU3RyaW5nLFxuXHRyZWQ6IGVuYWJsZWQgPyBmb3JtYXR0ZXIoXCJcXHgxYlszMW1cIiwgXCJcXHgxYlszOW1cIikgOiBTdHJpbmcsXG5cdGdyZWVuOiBlbmFibGVkID8gZm9ybWF0dGVyKFwiXFx4MWJbMzJtXCIsIFwiXFx4MWJbMzltXCIpIDogU3RyaW5nLFxuXHR5ZWxsb3c6IGVuYWJsZWQgPyBmb3JtYXR0ZXIoXCJcXHgxYlszM21cIiwgXCJcXHgxYlszOW1cIikgOiBTdHJpbmcsXG5cdGJsdWU6IGVuYWJsZWQgPyBmb3JtYXR0ZXIoXCJcXHgxYlszNG1cIiwgXCJcXHgxYlszOW1cIikgOiBTdHJpbmcsXG5cdG1hZ2VudGE6IGVuYWJsZWQgPyBmb3JtYXR0ZXIoXCJcXHgxYlszNW1cIiwgXCJcXHgxYlszOW1cIikgOiBTdHJpbmcsXG5cdGN5YW46IGVuYWJsZWQgPyBmb3JtYXR0ZXIoXCJcXHgxYlszNm1cIiwgXCJcXHgxYlszOW1cIikgOiBTdHJpbmcsXG5cdHdoaXRlOiBlbmFibGVkID8gZm9ybWF0dGVyKFwiXFx4MWJbMzdtXCIsIFwiXFx4MWJbMzltXCIpIDogU3RyaW5nLFxuXHRncmF5OiBlbmFibGVkID8gZm9ybWF0dGVyKFwiXFx4MWJbOTBtXCIsIFwiXFx4MWJbMzltXCIpIDogU3RyaW5nLFxuXHRiZ0JsYWNrOiBlbmFibGVkID8gZm9ybWF0dGVyKFwiXFx4MWJbNDBtXCIsIFwiXFx4MWJbNDltXCIpIDogU3RyaW5nLFxuXHRiZ1JlZDogZW5hYmxlZCA/IGZvcm1hdHRlcihcIlxceDFiWzQxbVwiLCBcIlxceDFiWzQ5bVwiKSA6IFN0cmluZyxcblx0YmdHcmVlbjogZW5hYmxlZCA/IGZvcm1hdHRlcihcIlxceDFiWzQybVwiLCBcIlxceDFiWzQ5bVwiKSA6IFN0cmluZyxcblx0YmdZZWxsb3c6IGVuYWJsZWQgPyBmb3JtYXR0ZXIoXCJcXHgxYls0M21cIiwgXCJcXHgxYls0OW1cIikgOiBTdHJpbmcsXG5cdGJnQmx1ZTogZW5hYmxlZCA/IGZvcm1hdHRlcihcIlxceDFiWzQ0bVwiLCBcIlxceDFiWzQ5bVwiKSA6IFN0cmluZyxcblx0YmdNYWdlbnRhOiBlbmFibGVkID8gZm9ybWF0dGVyKFwiXFx4MWJbNDVtXCIsIFwiXFx4MWJbNDltXCIpIDogU3RyaW5nLFxuXHRiZ0N5YW46IGVuYWJsZWQgPyBmb3JtYXR0ZXIoXCJcXHgxYls0Nm1cIiwgXCJcXHgxYls0OW1cIikgOiBTdHJpbmcsXG5cdGJnV2hpdGU6IGVuYWJsZWQgPyBmb3JtYXR0ZXIoXCJcXHgxYls0N21cIiwgXCJcXHgxYls0OW1cIikgOiBTdHJpbmcsXG59KTtcblxucGljb2NvbG9ycy5leHBvcnRzID0gY3JlYXRlQ29sb3JzKCk7XG5waWNvY29sb3JzRXhwb3J0cy5jcmVhdGVDb2xvcnMgPSBjcmVhdGVDb2xvcnM7XG5cbmZ1bmN0aW9uIG1hdGNoZXMkMShwYXR0ZXJuLCBpbXBvcnRlZSkge1xuICAgIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoaW1wb3J0ZWUpO1xuICAgIH1cbiAgICBpZiAoaW1wb3J0ZWUubGVuZ3RoIDwgcGF0dGVybi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaW1wb3J0ZWUgPT09IHBhdHRlcm4pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItdGVtcGxhdGVcbiAgICByZXR1cm4gaW1wb3J0ZWUuc3RhcnRzV2l0aChwYXR0ZXJuICsgJy8nKTtcbn1cbmZ1bmN0aW9uIGdldEVudHJpZXMoeyBlbnRyaWVzLCBjdXN0b21SZXNvbHZlciB9KSB7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZXJGdW5jdGlvbkZyb21PcHRpb25zID0gcmVzb2x2ZUN1c3RvbVJlc29sdmVyKGN1c3RvbVJlc29sdmVyKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyaWVzKSkge1xuICAgICAgICByZXR1cm4gZW50cmllcy5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZpbmQ6IGVudHJ5LmZpbmQsXG4gICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQ6IGVudHJ5LnJlcGxhY2VtZW50LFxuICAgICAgICAgICAgICAgIHJlc29sdmVyRnVuY3Rpb246IHJlc29sdmVDdXN0b21SZXNvbHZlcihlbnRyeS5jdXN0b21SZXNvbHZlcikgfHwgcmVzb2x2ZXJGdW5jdGlvbkZyb21PcHRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIHJldHVybiB7IGZpbmQ6IGtleSwgcmVwbGFjZW1lbnQ6IHZhbHVlLCByZXNvbHZlckZ1bmN0aW9uOiByZXNvbHZlckZ1bmN0aW9uRnJvbU9wdGlvbnMgfTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGdldEhvb2tGdW5jdGlvbihob29rKSB7XG4gICAgaWYgKHR5cGVvZiBob29rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBob29rO1xuICAgIH1cbiAgICBpZiAoaG9vayAmJiAnaGFuZGxlcicgaW4gaG9vayAmJiB0eXBlb2YgaG9vay5oYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBob29rLmhhbmRsZXI7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUN1c3RvbVJlc29sdmVyKGN1c3RvbVJlc29sdmVyKSB7XG4gICAgaWYgKHR5cGVvZiBjdXN0b21SZXNvbHZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gY3VzdG9tUmVzb2x2ZXI7XG4gICAgfVxuICAgIGlmIChjdXN0b21SZXNvbHZlcikge1xuICAgICAgICByZXR1cm4gZ2V0SG9va0Z1bmN0aW9uKGN1c3RvbVJlc29sdmVyLnJlc29sdmVJZCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gYWxpYXMkMShvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBlbnRyaWVzID0gZ2V0RW50cmllcyhvcHRpb25zKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6ICdhbGlhcycsXG4gICAgICAgICAgICByZXNvbHZlSWQ6ICgpID0+IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ2FsaWFzJyxcbiAgICAgICAgYXN5bmMgYnVpbGRTdGFydChpbnB1dE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFsuLi4oQXJyYXkuaXNBcnJheShvcHRpb25zLmVudHJpZXMpID8gb3B0aW9ucy5lbnRyaWVzIDogW10pLCBvcHRpb25zXS5tYXAoKHsgY3VzdG9tUmVzb2x2ZXIgfSkgPT4geyB2YXIgX2E7IHJldHVybiBjdXN0b21SZXNvbHZlciAmJiAoKF9hID0gZ2V0SG9va0Z1bmN0aW9uKGN1c3RvbVJlc29sdmVyLmJ1aWxkU3RhcnQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0aGlzLCBpbnB1dE9wdGlvbnMpKTsgfSkpO1xuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlSWQoaW1wb3J0ZWUsIGltcG9ydGVyLCByZXNvbHZlT3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCFpbXBvcnRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRmlyc3QgbWF0Y2ggaXMgc3VwcG9zZWQgdG8gYmUgdGhlIGNvcnJlY3Qgb25lXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkRW50cnkgPSBlbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiBtYXRjaGVzJDEoZW50cnkuZmluZCwgaW1wb3J0ZWUpKTtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlZEVudHJ5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkSWQgPSBpbXBvcnRlZS5yZXBsYWNlKG1hdGNoZWRFbnRyeS5maW5kLCBtYXRjaGVkRW50cnkucmVwbGFjZW1lbnQpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZWRFbnRyeS5yZXNvbHZlckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRFbnRyeS5yZXNvbHZlckZ1bmN0aW9uLmNhbGwodGhpcywgdXBkYXRlZElkLCBpbXBvcnRlciwgcmVzb2x2ZU9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZSh1cGRhdGVkSWQsIGltcG9ydGVyLCBPYmplY3QuYXNzaWduKHsgc2tpcFNlbGY6IHRydWUgfSwgcmVzb2x2ZU9wdGlvbnMpKS50aGVuKChyZXNvbHZlZCkgPT4gcmVzb2x2ZWQgfHwgeyBpZDogdXBkYXRlZElkIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8gQHRzLWNoZWNrXG4vKiogQHR5cGVkZWYgeyBpbXBvcnQoJ2VzdHJlZScpLkJhc2VOb2RlfSBCYXNlTm9kZSAqL1xuXG4vKiogQHR5cGVkZWYge3tcblx0c2tpcDogKCkgPT4gdm9pZDtcblx0cmVtb3ZlOiAoKSA9PiB2b2lkO1xuXHRyZXBsYWNlOiAobm9kZTogQmFzZU5vZGUpID0+IHZvaWQ7XG59fSBXYWxrZXJDb250ZXh0ICovXG5cbmxldCBXYWxrZXJCYXNlJDEgPSBjbGFzcyBXYWxrZXJCYXNlIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0LyoqIEB0eXBlIHtib29sZWFufSAqL1xuXHRcdHRoaXMuc2hvdWxkX3NraXAgPSBmYWxzZTtcblxuXHRcdC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cblx0XHR0aGlzLnNob3VsZF9yZW1vdmUgPSBmYWxzZTtcblxuXHRcdC8qKiBAdHlwZSB7QmFzZU5vZGUgfCBudWxsfSAqL1xuXHRcdHRoaXMucmVwbGFjZW1lbnQgPSBudWxsO1xuXG5cdFx0LyoqIEB0eXBlIHtXYWxrZXJDb250ZXh0fSAqL1xuXHRcdHRoaXMuY29udGV4dCA9IHtcblx0XHRcdHNraXA6ICgpID0+ICh0aGlzLnNob3VsZF9za2lwID0gdHJ1ZSksXG5cdFx0XHRyZW1vdmU6ICgpID0+ICh0aGlzLnNob3VsZF9yZW1vdmUgPSB0cnVlKSxcblx0XHRcdHJlcGxhY2U6IChub2RlKSA9PiAodGhpcy5yZXBsYWNlbWVudCA9IG5vZGUpXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge2FueX0gcGFyZW50XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuXHQgKiBAcGFyYW0ge0Jhc2VOb2RlfSBub2RlXG5cdCAqL1xuXHRyZXBsYWNlKHBhcmVudCwgcHJvcCwgaW5kZXgsIG5vZGUpIHtcblx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRpZiAoaW5kZXggIT09IG51bGwpIHtcblx0XHRcdFx0cGFyZW50W3Byb3BdW2luZGV4XSA9IG5vZGU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwYXJlbnRbcHJvcF0gPSBub2RlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge2FueX0gcGFyZW50XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuXHQgKi9cblx0cmVtb3ZlKHBhcmVudCwgcHJvcCwgaW5kZXgpIHtcblx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRpZiAoaW5kZXggIT09IG51bGwpIHtcblx0XHRcdFx0cGFyZW50W3Byb3BdLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgcGFyZW50W3Byb3BdO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZWRlZiB7IGltcG9ydCgnZXN0cmVlJykuQmFzZU5vZGV9IEJhc2VOb2RlICovXG4vKiogQHR5cGVkZWYgeyBpbXBvcnQoJy4vd2Fsa2VyLmpzJykuV2Fsa2VyQ29udGV4dH0gV2Fsa2VyQ29udGV4dCAqL1xuXG4vKiogQHR5cGVkZWYgeyhcbiAqICAgIHRoaXM6IFdhbGtlckNvbnRleHQsXG4gKiAgICBub2RlOiBCYXNlTm9kZSxcbiAqICAgIHBhcmVudDogQmFzZU5vZGUsXG4gKiAgICBrZXk6IHN0cmluZyxcbiAqICAgIGluZGV4OiBudW1iZXJcbiAqICkgPT4gdm9pZH0gU3luY0hhbmRsZXIgKi9cblxubGV0IFN5bmNXYWxrZXIkMSA9IGNsYXNzIFN5bmNXYWxrZXIgZXh0ZW5kcyBXYWxrZXJCYXNlJDEge1xuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtTeW5jSGFuZGxlcn0gZW50ZXJcblx0ICogQHBhcmFtIHtTeW5jSGFuZGxlcn0gbGVhdmVcblx0ICovXG5cdGNvbnN0cnVjdG9yKGVudGVyLCBsZWF2ZSkge1xuXHRcdHN1cGVyKCk7XG5cblx0XHQvKiogQHR5cGUge1N5bmNIYW5kbGVyfSAqL1xuXHRcdHRoaXMuZW50ZXIgPSBlbnRlcjtcblxuXHRcdC8qKiBAdHlwZSB7U3luY0hhbmRsZXJ9ICovXG5cdFx0dGhpcy5sZWF2ZSA9IGxlYXZlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7QmFzZU5vZGV9IG5vZGVcblx0ICogQHBhcmFtIHtCYXNlTm9kZX0gcGFyZW50XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcF1cblx0ICogQHBhcmFtIHtudW1iZXJ9IFtpbmRleF1cblx0ICogQHJldHVybnMge0Jhc2VOb2RlfVxuXHQgKi9cblx0dmlzaXQobm9kZSwgcGFyZW50LCBwcm9wLCBpbmRleCkge1xuXHRcdGlmIChub2RlKSB7XG5cdFx0XHRpZiAodGhpcy5lbnRlcikge1xuXHRcdFx0XHRjb25zdCBfc2hvdWxkX3NraXAgPSB0aGlzLnNob3VsZF9za2lwO1xuXHRcdFx0XHRjb25zdCBfc2hvdWxkX3JlbW92ZSA9IHRoaXMuc2hvdWxkX3JlbW92ZTtcblx0XHRcdFx0Y29uc3QgX3JlcGxhY2VtZW50ID0gdGhpcy5yZXBsYWNlbWVudDtcblx0XHRcdFx0dGhpcy5zaG91bGRfc2tpcCA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLnNob3VsZF9yZW1vdmUgPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5yZXBsYWNlbWVudCA9IG51bGw7XG5cblx0XHRcdFx0dGhpcy5lbnRlci5jYWxsKHRoaXMuY29udGV4dCwgbm9kZSwgcGFyZW50LCBwcm9wLCBpbmRleCk7XG5cblx0XHRcdFx0aWYgKHRoaXMucmVwbGFjZW1lbnQpIHtcblx0XHRcdFx0XHRub2RlID0gdGhpcy5yZXBsYWNlbWVudDtcblx0XHRcdFx0XHR0aGlzLnJlcGxhY2UocGFyZW50LCBwcm9wLCBpbmRleCwgbm9kZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy5zaG91bGRfcmVtb3ZlKSB7XG5cdFx0XHRcdFx0dGhpcy5yZW1vdmUocGFyZW50LCBwcm9wLCBpbmRleCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBza2lwcGVkID0gdGhpcy5zaG91bGRfc2tpcDtcblx0XHRcdFx0Y29uc3QgcmVtb3ZlZCA9IHRoaXMuc2hvdWxkX3JlbW92ZTtcblxuXHRcdFx0XHR0aGlzLnNob3VsZF9za2lwID0gX3Nob3VsZF9za2lwO1xuXHRcdFx0XHR0aGlzLnNob3VsZF9yZW1vdmUgPSBfc2hvdWxkX3JlbW92ZTtcblx0XHRcdFx0dGhpcy5yZXBsYWNlbWVudCA9IF9yZXBsYWNlbWVudDtcblxuXHRcdFx0XHRpZiAoc2tpcHBlZCkgcmV0dXJuIG5vZGU7XG5cdFx0XHRcdGlmIChyZW1vdmVkKSByZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gbm9kZSkge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcblxuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0XHRcdFx0XHRpZiAodmFsdWVbaV0gIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlW2ldLnR5cGUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0XHRcdGlmICghdGhpcy52aXNpdCh2YWx1ZVtpXSwgbm9kZSwga2V5LCBpKSkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIHJlbW92ZWRcblx0XHRcdFx0XHRcdFx0XHRpLS07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHR0aGlzLnZpc2l0KHZhbHVlLCBub2RlLCBrZXksIG51bGwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmxlYXZlKSB7XG5cdFx0XHRcdGNvbnN0IF9yZXBsYWNlbWVudCA9IHRoaXMucmVwbGFjZW1lbnQ7XG5cdFx0XHRcdGNvbnN0IF9zaG91bGRfcmVtb3ZlID0gdGhpcy5zaG91bGRfcmVtb3ZlO1xuXHRcdFx0XHR0aGlzLnJlcGxhY2VtZW50ID0gbnVsbDtcblx0XHRcdFx0dGhpcy5zaG91bGRfcmVtb3ZlID0gZmFsc2U7XG5cblx0XHRcdFx0dGhpcy5sZWF2ZS5jYWxsKHRoaXMuY29udGV4dCwgbm9kZSwgcGFyZW50LCBwcm9wLCBpbmRleCk7XG5cblx0XHRcdFx0aWYgKHRoaXMucmVwbGFjZW1lbnQpIHtcblx0XHRcdFx0XHRub2RlID0gdGhpcy5yZXBsYWNlbWVudDtcblx0XHRcdFx0XHR0aGlzLnJlcGxhY2UocGFyZW50LCBwcm9wLCBpbmRleCwgbm9kZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy5zaG91bGRfcmVtb3ZlKSB7XG5cdFx0XHRcdFx0dGhpcy5yZW1vdmUocGFyZW50LCBwcm9wLCBpbmRleCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCByZW1vdmVkID0gdGhpcy5zaG91bGRfcmVtb3ZlO1xuXG5cdFx0XHRcdHRoaXMucmVwbGFjZW1lbnQgPSBfcmVwbGFjZW1lbnQ7XG5cdFx0XHRcdHRoaXMuc2hvdWxkX3JlbW92ZSA9IF9zaG91bGRfcmVtb3ZlO1xuXG5cdFx0XHRcdGlmIChyZW1vdmVkKSByZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbm9kZTtcblx0fVxufTtcblxuLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZWRlZiB7IGltcG9ydCgnZXN0cmVlJykuQmFzZU5vZGV9IEJhc2VOb2RlICovXG4vKiogQHR5cGVkZWYgeyBpbXBvcnQoJy4vc3luYy5qcycpLlN5bmNIYW5kbGVyfSBTeW5jSGFuZGxlciAqL1xuLyoqIEB0eXBlZGVmIHsgaW1wb3J0KCcuL2FzeW5jLmpzJykuQXN5bmNIYW5kbGVyfSBBc3luY0hhbmRsZXIgKi9cblxuLyoqXG4gKlxuICogQHBhcmFtIHtCYXNlTm9kZX0gYXN0XG4gKiBAcGFyYW0ge3tcbiAqICAgZW50ZXI/OiBTeW5jSGFuZGxlclxuICogICBsZWF2ZT86IFN5bmNIYW5kbGVyXG4gKiB9fSB3YWxrZXJcbiAqIEByZXR1cm5zIHtCYXNlTm9kZX1cbiAqL1xuZnVuY3Rpb24gd2FsayQzKGFzdCwgeyBlbnRlciwgbGVhdmUgfSkge1xuXHRjb25zdCBpbnN0YW5jZSA9IG5ldyBTeW5jV2Fsa2VyJDEoZW50ZXIsIGxlYXZlKTtcblx0cmV0dXJuIGluc3RhbmNlLnZpc2l0KGFzdCwgbnVsbCk7XG59XG5cbnZhciBwaWNvbWF0Y2hFeHBvcnRzID0ge307XG52YXIgcGljb21hdGNoJDUgPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiBwaWNvbWF0Y2hFeHBvcnRzOyB9LFxuICBzZXQgZXhwb3J0cyh2KXsgcGljb21hdGNoRXhwb3J0cyA9IHY7IH0sXG59O1xuXG52YXIgdXRpbHMkayA9IHt9O1xuXG5jb25zdCBwYXRoJG4gPSByZXF1aXJlJCQwJDQ7XG5jb25zdCBXSU5fU0xBU0ggPSAnXFxcXFxcXFwvJztcbmNvbnN0IFdJTl9OT19TTEFTSCA9IGBbXiR7V0lOX1NMQVNIfV1gO1xuXG4vKipcbiAqIFBvc2l4IGdsb2IgcmVnZXhcbiAqL1xuXG5jb25zdCBET1RfTElURVJBTCA9ICdcXFxcLic7XG5jb25zdCBQTFVTX0xJVEVSQUwgPSAnXFxcXCsnO1xuY29uc3QgUU1BUktfTElURVJBTCA9ICdcXFxcPyc7XG5jb25zdCBTTEFTSF9MSVRFUkFMID0gJ1xcXFwvJztcbmNvbnN0IE9ORV9DSEFSID0gJyg/PS4pJztcbmNvbnN0IFFNQVJLID0gJ1teL10nO1xuY29uc3QgRU5EX0FOQ0hPUiA9IGAoPzoke1NMQVNIX0xJVEVSQUx9fCQpYDtcbmNvbnN0IFNUQVJUX0FOQ0hPUiA9IGAoPzpefCR7U0xBU0hfTElURVJBTH0pYDtcbmNvbnN0IERPVFNfU0xBU0ggPSBgJHtET1RfTElURVJBTH17MSwyfSR7RU5EX0FOQ0hPUn1gO1xuY29uc3QgTk9fRE9UID0gYCg/ISR7RE9UX0xJVEVSQUx9KWA7XG5jb25zdCBOT19ET1RTID0gYCg/ISR7U1RBUlRfQU5DSE9SfSR7RE9UU19TTEFTSH0pYDtcbmNvbnN0IE5PX0RPVF9TTEFTSCA9IGAoPyEke0RPVF9MSVRFUkFMfXswLDF9JHtFTkRfQU5DSE9SfSlgO1xuY29uc3QgTk9fRE9UU19TTEFTSCA9IGAoPyEke0RPVFNfU0xBU0h9KWA7XG5jb25zdCBRTUFSS19OT19ET1QgPSBgW14uJHtTTEFTSF9MSVRFUkFMfV1gO1xuY29uc3QgU1RBUiQxID0gYCR7UU1BUkt9Kj9gO1xuXG5jb25zdCBQT1NJWF9DSEFSUyA9IHtcbiAgRE9UX0xJVEVSQUwsXG4gIFBMVVNfTElURVJBTCxcbiAgUU1BUktfTElURVJBTCxcbiAgU0xBU0hfTElURVJBTCxcbiAgT05FX0NIQVIsXG4gIFFNQVJLLFxuICBFTkRfQU5DSE9SLFxuICBET1RTX1NMQVNILFxuICBOT19ET1QsXG4gIE5PX0RPVFMsXG4gIE5PX0RPVF9TTEFTSCxcbiAgTk9fRE9UU19TTEFTSCxcbiAgUU1BUktfTk9fRE9ULFxuICBTVEFSOiBTVEFSJDEsXG4gIFNUQVJUX0FOQ0hPUlxufTtcblxuLyoqXG4gKiBXaW5kb3dzIGdsb2IgcmVnZXhcbiAqL1xuXG5jb25zdCBXSU5ET1dTX0NIQVJTID0ge1xuICAuLi5QT1NJWF9DSEFSUyxcblxuICBTTEFTSF9MSVRFUkFMOiBgWyR7V0lOX1NMQVNIfV1gLFxuICBRTUFSSzogV0lOX05PX1NMQVNILFxuICBTVEFSOiBgJHtXSU5fTk9fU0xBU0h9Kj9gLFxuICBET1RTX1NMQVNIOiBgJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpYCxcbiAgTk9fRE9UOiBgKD8hJHtET1RfTElURVJBTH0pYCxcbiAgTk9fRE9UUzogYCg/ISg/Ol58WyR7V0lOX1NMQVNIfV0pJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIE5PX0RPVF9TTEFTSDogYCg/ISR7RE9UX0xJVEVSQUx9ezAsMX0oPzpbJHtXSU5fU0xBU0h9XXwkKSlgLFxuICBOT19ET1RTX1NMQVNIOiBgKD8hJHtET1RfTElURVJBTH17MSwyfSg/Olske1dJTl9TTEFTSH1dfCQpKWAsXG4gIFFNQVJLX05PX0RPVDogYFteLiR7V0lOX1NMQVNIfV1gLFxuICBTVEFSVF9BTkNIT1I6IGAoPzpefFske1dJTl9TTEFTSH1dKWAsXG4gIEVORF9BTkNIT1I6IGAoPzpbJHtXSU5fU0xBU0h9XXwkKWBcbn07XG5cbi8qKlxuICogUE9TSVggQnJhY2tldCBSZWdleFxuICovXG5cbmNvbnN0IFBPU0lYX1JFR0VYX1NPVVJDRSQxID0ge1xuICBhbG51bTogJ2EtekEtWjAtOScsXG4gIGFscGhhOiAnYS16QS1aJyxcbiAgYXNjaWk6ICdcXFxceDAwLVxcXFx4N0YnLFxuICBibGFuazogJyBcXFxcdCcsXG4gIGNudHJsOiAnXFxcXHgwMC1cXFxceDFGXFxcXHg3RicsXG4gIGRpZ2l0OiAnMC05JyxcbiAgZ3JhcGg6ICdcXFxceDIxLVxcXFx4N0UnLFxuICBsb3dlcjogJ2EteicsXG4gIHByaW50OiAnXFxcXHgyMC1cXFxceDdFICcsXG4gIHB1bmN0OiAnXFxcXC0hXCIjJCUmXFwnKClcXFxcKissLi86Ozw9Pj9AW1xcXFxdXl9ge3x9ficsXG4gIHNwYWNlOiAnIFxcXFx0XFxcXHJcXFxcblxcXFx2XFxcXGYnLFxuICB1cHBlcjogJ0EtWicsXG4gIHdvcmQ6ICdBLVphLXowLTlfJyxcbiAgeGRpZ2l0OiAnQS1GYS1mMC05J1xufTtcblxudmFyIGNvbnN0YW50cyQ2ID0ge1xuICBNQVhfTEVOR1RIOiAxMDI0ICogNjQsXG4gIFBPU0lYX1JFR0VYX1NPVVJDRTogUE9TSVhfUkVHRVhfU09VUkNFJDEsXG5cbiAgLy8gcmVndWxhciBleHByZXNzaW9uc1xuICBSRUdFWF9CQUNLU0xBU0g6IC9cXFxcKD8hWyorP14ke30ofClbXFxdXSkvZyxcbiAgUkVHRVhfTk9OX1NQRUNJQUxfQ0hBUlM6IC9eW15AIVtcXF0uLCQqKz9ee30oKXxcXFxcL10rLyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSUzogL1stKis/Ll4ke30ofClbXFxdXS8sXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfQkFDS1JFRjogLyhcXFxcPykoKFxcVykoXFwzKikpL2csXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfR0xPQkFMOiAvKFstKis/Ll4ke30ofClbXFxdXSkvZyxcbiAgUkVHRVhfUkVNT1ZFX0JBQ0tTTEFTSDogLyg/OlxcWy4qP1teXFxcXF1cXF18XFxcXCg/PS4pKS9nLFxuXG4gIC8vIFJlcGxhY2UgZ2xvYnMgd2l0aCBlcXVpdmFsZW50IHBhdHRlcm5zIHRvIHJlZHVjZSBwYXJzaW5nIHRpbWUuXG4gIFJFUExBQ0VNRU5UUzoge1xuICAgICcqKionOiAnKicsXG4gICAgJyoqLyoqJzogJyoqJyxcbiAgICAnKiovKiovKionOiAnKionXG4gIH0sXG5cbiAgLy8gRGlnaXRzXG4gIENIQVJfMDogNDgsIC8qIDAgKi9cbiAgQ0hBUl85OiA1NywgLyogOSAqL1xuXG4gIC8vIEFscGhhYmV0IGNoYXJzLlxuICBDSEFSX1VQUEVSQ0FTRV9BOiA2NSwgLyogQSAqL1xuICBDSEFSX0xPV0VSQ0FTRV9BOiA5NywgLyogYSAqL1xuICBDSEFSX1VQUEVSQ0FTRV9aOiA5MCwgLyogWiAqL1xuICBDSEFSX0xPV0VSQ0FTRV9aOiAxMjIsIC8qIHogKi9cblxuICBDSEFSX0xFRlRfUEFSRU5USEVTRVM6IDQwLCAvKiAoICovXG4gIENIQVJfUklHSFRfUEFSRU5USEVTRVM6IDQxLCAvKiApICovXG5cbiAgQ0hBUl9BU1RFUklTSzogNDIsIC8qICogKi9cblxuICAvLyBOb24tYWxwaGFiZXRpYyBjaGFycy5cbiAgQ0hBUl9BTVBFUlNBTkQ6IDM4LCAvKiAmICovXG4gIENIQVJfQVQ6IDY0LCAvKiBAICovXG4gIENIQVJfQkFDS1dBUkRfU0xBU0g6IDkyLCAvKiBcXCAqL1xuICBDSEFSX0NBUlJJQUdFX1JFVFVSTjogMTMsIC8qIFxcciAqL1xuICBDSEFSX0NJUkNVTUZMRVhfQUNDRU5UOiA5NCwgLyogXiAqL1xuICBDSEFSX0NPTE9OOiA1OCwgLyogOiAqL1xuICBDSEFSX0NPTU1BOiA0NCwgLyogLCAqL1xuICBDSEFSX0RPVDogNDYsIC8qIC4gKi9cbiAgQ0hBUl9ET1VCTEVfUVVPVEU6IDM0LCAvKiBcIiAqL1xuICBDSEFSX0VRVUFMOiA2MSwgLyogPSAqL1xuICBDSEFSX0VYQ0xBTUFUSU9OX01BUks6IDMzLCAvKiAhICovXG4gIENIQVJfRk9STV9GRUVEOiAxMiwgLyogXFxmICovXG4gIENIQVJfRk9SV0FSRF9TTEFTSDogNDcsIC8qIC8gKi9cbiAgQ0hBUl9HUkFWRV9BQ0NFTlQ6IDk2LCAvKiBgICovXG4gIENIQVJfSEFTSDogMzUsIC8qICMgKi9cbiAgQ0hBUl9IWVBIRU5fTUlOVVM6IDQ1LCAvKiAtICovXG4gIENIQVJfTEVGVF9BTkdMRV9CUkFDS0VUOiA2MCwgLyogPCAqL1xuICBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0U6IDEyMywgLyogeyAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQ6IDkxLCAvKiBbICovXG4gIENIQVJfTElORV9GRUVEOiAxMCwgLyogXFxuICovXG4gIENIQVJfTk9fQlJFQUtfU1BBQ0U6IDE2MCwgLyogXFx1MDBBMCAqL1xuICBDSEFSX1BFUkNFTlQ6IDM3LCAvKiAlICovXG4gIENIQVJfUExVUzogNDMsIC8qICsgKi9cbiAgQ0hBUl9RVUVTVElPTl9NQVJLOiA2MywgLyogPyAqL1xuICBDSEFSX1JJR0hUX0FOR0xFX0JSQUNLRVQ6IDYyLCAvKiA+ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0U6IDEyNSwgLyogfSAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUOiA5MywgLyogXSAqL1xuICBDSEFSX1NFTUlDT0xPTjogNTksIC8qIDsgKi9cbiAgQ0hBUl9TSU5HTEVfUVVPVEU6IDM5LCAvKiAnICovXG4gIENIQVJfU1BBQ0U6IDMyLCAvKiAgICovXG4gIENIQVJfVEFCOiA5LCAvKiBcXHQgKi9cbiAgQ0hBUl9VTkRFUlNDT1JFOiA5NSwgLyogXyAqL1xuICBDSEFSX1ZFUlRJQ0FMX0xJTkU6IDEyNCwgLyogfCAqL1xuICBDSEFSX1pFUk9fV0lEVEhfTk9CUkVBS19TUEFDRTogNjUyNzksIC8qIFxcdUZFRkYgKi9cblxuICBTRVA6IHBhdGgkbi5zZXAsXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBFWFRHTE9CX0NIQVJTXG4gICAqL1xuXG4gIGV4dGdsb2JDaGFycyhjaGFycykge1xuICAgIHJldHVybiB7XG4gICAgICAnISc6IHsgdHlwZTogJ25lZ2F0ZScsIG9wZW46ICcoPzooPyEoPzonLCBjbG9zZTogYCkpJHtjaGFycy5TVEFSfSlgIH0sXG4gICAgICAnPyc6IHsgdHlwZTogJ3FtYXJrJywgb3BlbjogJyg/OicsIGNsb3NlOiAnKT8nIH0sXG4gICAgICAnKyc6IHsgdHlwZTogJ3BsdXMnLCBvcGVuOiAnKD86JywgY2xvc2U6ICcpKycgfSxcbiAgICAgICcqJzogeyB0eXBlOiAnc3RhcicsIG9wZW46ICcoPzonLCBjbG9zZTogJykqJyB9LFxuICAgICAgJ0AnOiB7IHR5cGU6ICdhdCcsIG9wZW46ICcoPzonLCBjbG9zZTogJyknIH1cbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgR0xPQl9DSEFSU1xuICAgKi9cblxuICBnbG9iQ2hhcnMod2luMzIpIHtcbiAgICByZXR1cm4gd2luMzIgPT09IHRydWUgPyBXSU5ET1dTX0NIQVJTIDogUE9TSVhfQ0hBUlM7XG4gIH1cbn07XG5cbihmdW5jdGlvbiAoZXhwb3J0cykge1xuXG5cdGNvbnN0IHBhdGggPSByZXF1aXJlJCQwJDQ7XG5cdGNvbnN0IHdpbjMyID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblx0Y29uc3Qge1xuXHQgIFJFR0VYX0JBQ0tTTEFTSCxcblx0ICBSRUdFWF9SRU1PVkVfQkFDS1NMQVNILFxuXHQgIFJFR0VYX1NQRUNJQUxfQ0hBUlMsXG5cdCAgUkVHRVhfU1BFQ0lBTF9DSEFSU19HTE9CQUxcblx0fSA9IGNvbnN0YW50cyQ2O1xuXG5cdGV4cG9ydHMuaXNPYmplY3QgPSB2YWwgPT4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cdGV4cG9ydHMuaGFzUmVnZXhDaGFycyA9IHN0ciA9PiBSRUdFWF9TUEVDSUFMX0NIQVJTLnRlc3Qoc3RyKTtcblx0ZXhwb3J0cy5pc1JlZ2V4Q2hhciA9IHN0ciA9PiBzdHIubGVuZ3RoID09PSAxICYmIGV4cG9ydHMuaGFzUmVnZXhDaGFycyhzdHIpO1xuXHRleHBvcnRzLmVzY2FwZVJlZ2V4ID0gc3RyID0+IHN0ci5yZXBsYWNlKFJFR0VYX1NQRUNJQUxfQ0hBUlNfR0xPQkFMLCAnXFxcXCQxJyk7XG5cdGV4cG9ydHMudG9Qb3NpeFNsYXNoZXMgPSBzdHIgPT4gc3RyLnJlcGxhY2UoUkVHRVhfQkFDS1NMQVNILCAnLycpO1xuXG5cdGV4cG9ydHMucmVtb3ZlQmFja3NsYXNoZXMgPSBzdHIgPT4ge1xuXHQgIHJldHVybiBzdHIucmVwbGFjZShSRUdFWF9SRU1PVkVfQkFDS1NMQVNILCBtYXRjaCA9PiB7XG5cdCAgICByZXR1cm4gbWF0Y2ggPT09ICdcXFxcJyA/ICcnIDogbWF0Y2g7XG5cdCAgfSk7XG5cdH07XG5cblx0ZXhwb3J0cy5zdXBwb3J0c0xvb2tiZWhpbmRzID0gKCkgPT4ge1xuXHQgIGNvbnN0IHNlZ3MgPSBwcm9jZXNzLnZlcnNpb24uc2xpY2UoMSkuc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcblx0ICBpZiAoc2Vncy5sZW5ndGggPT09IDMgJiYgc2Vnc1swXSA+PSA5IHx8IChzZWdzWzBdID09PSA4ICYmIHNlZ3NbMV0gPj0gMTApKSB7XG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9XG5cdCAgcmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdGV4cG9ydHMuaXNXaW5kb3dzID0gb3B0aW9ucyA9PiB7XG5cdCAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMud2luZG93cyA9PT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICByZXR1cm4gb3B0aW9ucy53aW5kb3dzO1xuXHQgIH1cblx0ICByZXR1cm4gd2luMzIgPT09IHRydWUgfHwgcGF0aC5zZXAgPT09ICdcXFxcJztcblx0fTtcblxuXHRleHBvcnRzLmVzY2FwZUxhc3QgPSAoaW5wdXQsIGNoYXIsIGxhc3RJZHgpID0+IHtcblx0ICBjb25zdCBpZHggPSBpbnB1dC5sYXN0SW5kZXhPZihjaGFyLCBsYXN0SWR4KTtcblx0ICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGlucHV0O1xuXHQgIGlmIChpbnB1dFtpZHggLSAxXSA9PT0gJ1xcXFwnKSByZXR1cm4gZXhwb3J0cy5lc2NhcGVMYXN0KGlucHV0LCBjaGFyLCBpZHggLSAxKTtcblx0ICByZXR1cm4gYCR7aW5wdXQuc2xpY2UoMCwgaWR4KX1cXFxcJHtpbnB1dC5zbGljZShpZHgpfWA7XG5cdH07XG5cblx0ZXhwb3J0cy5yZW1vdmVQcmVmaXggPSAoaW5wdXQsIHN0YXRlID0ge30pID0+IHtcblx0ICBsZXQgb3V0cHV0ID0gaW5wdXQ7XG5cdCAgaWYgKG91dHB1dC5zdGFydHNXaXRoKCcuLycpKSB7XG5cdCAgICBvdXRwdXQgPSBvdXRwdXQuc2xpY2UoMik7XG5cdCAgICBzdGF0ZS5wcmVmaXggPSAnLi8nO1xuXHQgIH1cblx0ICByZXR1cm4gb3V0cHV0O1xuXHR9O1xuXG5cdGV4cG9ydHMud3JhcE91dHB1dCA9IChpbnB1dCwgc3RhdGUgPSB7fSwgb3B0aW9ucyA9IHt9KSA9PiB7XG5cdCAgY29uc3QgcHJlcGVuZCA9IG9wdGlvbnMuY29udGFpbnMgPyAnJyA6ICdeJztcblx0ICBjb25zdCBhcHBlbmQgPSBvcHRpb25zLmNvbnRhaW5zID8gJycgOiAnJCc7XG5cblx0ICBsZXQgb3V0cHV0ID0gYCR7cHJlcGVuZH0oPzoke2lucHV0fSkke2FwcGVuZH1gO1xuXHQgIGlmIChzdGF0ZS5uZWdhdGVkID09PSB0cnVlKSB7XG5cdCAgICBvdXRwdXQgPSBgKD86Xig/ISR7b3V0cHV0fSkuKiQpYDtcblx0ICB9XG5cdCAgcmV0dXJuIG91dHB1dDtcblx0fTtcbn0gKHV0aWxzJGspKTtcblxuY29uc3QgdXRpbHMkaiA9IHV0aWxzJGs7XG5jb25zdCB7XG4gIENIQVJfQVNURVJJU0ssICAgICAgICAgICAgIC8qICogKi9cbiAgQ0hBUl9BVCwgICAgICAgICAgICAgICAgICAgLyogQCAqL1xuICBDSEFSX0JBQ0tXQVJEX1NMQVNILCAgICAgICAvKiBcXCAqL1xuICBDSEFSX0NPTU1BOiBDSEFSX0NPTU1BJDEsICAgICAgICAgICAgICAgIC8qICwgKi9cbiAgQ0hBUl9ET1Q6IENIQVJfRE9UJDEsICAgICAgICAgICAgICAgICAgLyogLiAqL1xuICBDSEFSX0VYQ0xBTUFUSU9OX01BUkssICAgICAvKiAhICovXG4gIENIQVJfRk9SV0FSRF9TTEFTSCwgICAgICAgIC8qIC8gKi9cbiAgQ0hBUl9MRUZUX0NVUkxZX0JSQUNFOiBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UkMSwgICAgIC8qIHsgKi9cbiAgQ0hBUl9MRUZUX1BBUkVOVEhFU0VTOiBDSEFSX0xFRlRfUEFSRU5USEVTRVMkMSwgICAgIC8qICggKi9cbiAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUOiBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQkMSwgIC8qIFsgKi9cbiAgQ0hBUl9QTFVTLCAgICAgICAgICAgICAgICAgLyogKyAqL1xuICBDSEFSX1FVRVNUSU9OX01BUkssICAgICAgICAvKiA/ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0U6IENIQVJfUklHSFRfQ1VSTFlfQlJBQ0UkMSwgICAgLyogfSAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTOiBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTJDEsICAgIC8qICkgKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVDogQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCQxICAvKiBdICovXG59ID0gY29uc3RhbnRzJDY7XG5cbmNvbnN0IGlzUGF0aFNlcGFyYXRvciA9IGNvZGUgPT4ge1xuICByZXR1cm4gY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIIHx8IGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0g7XG59O1xuXG5jb25zdCBkZXB0aCA9IHRva2VuID0+IHtcbiAgaWYgKHRva2VuLmlzUHJlZml4ICE9PSB0cnVlKSB7XG4gICAgdG9rZW4uZGVwdGggPSB0b2tlbi5pc0dsb2JzdGFyID8gSW5maW5pdHkgOiAxO1xuICB9XG59O1xuXG4vKipcbiAqIFF1aWNrbHkgc2NhbnMgYSBnbG9iIHBhdHRlcm4gYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBoYW5kZnVsIG9mXG4gKiB1c2VmdWwgcHJvcGVydGllcywgbGlrZSBgaXNHbG9iYCwgYHBhdGhgICh0aGUgbGVhZGluZyBub24tZ2xvYiwgaWYgaXQgZXhpc3RzKSxcbiAqIGBnbG9iYCAodGhlIGFjdHVhbCBwYXR0ZXJuKSwgYG5lZ2F0ZWRgICh0cnVlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGAhYCBidXQgbm90XG4gKiB3aXRoIGAhKGApIGFuZCBgbmVnYXRlZEV4dGdsb2JgICh0cnVlIGlmIHRoZSBwYXRoIHN0YXJ0cyB3aXRoIGAhKGApLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwbSA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogY29uc29sZS5sb2cocG0uc2NhbignZm9vL2Jhci8qLmpzJykpO1xuICogeyBpc0dsb2I6IHRydWUsIGlucHV0OiAnZm9vL2Jhci8qLmpzJywgYmFzZTogJ2Zvby9iYXInLCBnbG9iOiAnKi5qcycgfVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0b2tlbnMgYW5kIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IHNjYW4kMiA9IChpbnB1dCwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICBjb25zdCBsZW5ndGggPSBpbnB1dC5sZW5ndGggLSAxO1xuICBjb25zdCBzY2FuVG9FbmQgPSBvcHRzLnBhcnRzID09PSB0cnVlIHx8IG9wdHMuc2NhblRvRW5kID09PSB0cnVlO1xuICBjb25zdCBzbGFzaGVzID0gW107XG4gIGNvbnN0IHRva2VucyA9IFtdO1xuICBjb25zdCBwYXJ0cyA9IFtdO1xuXG4gIGxldCBzdHIgPSBpbnB1dDtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGxldCBzdGFydCA9IDA7XG4gIGxldCBsYXN0SW5kZXggPSAwO1xuICBsZXQgaXNCcmFjZSA9IGZhbHNlO1xuICBsZXQgaXNCcmFja2V0ID0gZmFsc2U7XG4gIGxldCBpc0dsb2IgPSBmYWxzZTtcbiAgbGV0IGlzRXh0Z2xvYiA9IGZhbHNlO1xuICBsZXQgaXNHbG9ic3RhciA9IGZhbHNlO1xuICBsZXQgYnJhY2VFc2NhcGVkID0gZmFsc2U7XG4gIGxldCBiYWNrc2xhc2hlcyA9IGZhbHNlO1xuICBsZXQgbmVnYXRlZCA9IGZhbHNlO1xuICBsZXQgbmVnYXRlZEV4dGdsb2IgPSBmYWxzZTtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gIGxldCBicmFjZXMgPSAwO1xuICBsZXQgcHJldjtcbiAgbGV0IGNvZGU7XG4gIGxldCB0b2tlbiA9IHsgdmFsdWU6ICcnLCBkZXB0aDogMCwgaXNHbG9iOiBmYWxzZSB9O1xuXG4gIGNvbnN0IGVvcyA9ICgpID0+IGluZGV4ID49IGxlbmd0aDtcbiAgY29uc3QgcGVlayA9ICgpID0+IHN0ci5jaGFyQ29kZUF0KGluZGV4ICsgMSk7XG4gIGNvbnN0IGFkdmFuY2UgPSAoKSA9PiB7XG4gICAgcHJldiA9IGNvZGU7XG4gICAgcmV0dXJuIHN0ci5jaGFyQ29kZUF0KCsraW5kZXgpO1xuICB9O1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGNvZGUgPSBhZHZhbmNlKCk7XG4gICAgbGV0IG5leHQ7XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICBjb2RlID0gYWR2YW5jZSgpO1xuXG4gICAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFJDEpIHtcbiAgICAgICAgYnJhY2VFc2NhcGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChicmFjZUVzY2FwZWQgPT09IHRydWUgfHwgY29kZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFJDEpIHtcbiAgICAgIGJyYWNlcysrO1xuXG4gICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKGNvZGUgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSQxKSB7XG4gICAgICAgICAgYnJhY2VzKys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnJhY2VFc2NhcGVkICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfRE9UJDEgJiYgKGNvZGUgPSBhZHZhbmNlKCkpID09PSBDSEFSX0RPVCQxKSB7XG4gICAgICAgICAgaXNCcmFjZSA9IHRva2VuLmlzQnJhY2UgPSB0cnVlO1xuICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnJhY2VFc2NhcGVkICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfQ09NTUEkMSkge1xuICAgICAgICAgIGlzQnJhY2UgPSB0b2tlbi5pc0JyYWNlID0gdHJ1ZTtcbiAgICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfUklHSFRfQ1VSTFlfQlJBQ0UkMSkge1xuICAgICAgICAgIGJyYWNlcy0tO1xuXG4gICAgICAgICAgaWYgKGJyYWNlcyA9PT0gMCkge1xuICAgICAgICAgICAgYnJhY2VFc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpc0JyYWNlID0gdG9rZW4uaXNCcmFjZSA9IHRydWU7XG4gICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkge1xuICAgICAgc2xhc2hlcy5wdXNoKGluZGV4KTtcbiAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgIHRva2VuID0geyB2YWx1ZTogJycsIGRlcHRoOiAwLCBpc0dsb2I6IGZhbHNlIH07XG5cbiAgICAgIGlmIChmaW5pc2hlZCA9PT0gdHJ1ZSkgY29udGludWU7XG4gICAgICBpZiAocHJldiA9PT0gQ0hBUl9ET1QkMSAmJiBpbmRleCA9PT0gKHN0YXJ0ICsgMSkpIHtcbiAgICAgICAgc3RhcnQgKz0gMjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxhc3RJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm5vZXh0ICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCBpc0V4dGdsb2JDaGFyID0gY29kZSA9PT0gQ0hBUl9QTFVTXG4gICAgICAgIHx8IGNvZGUgPT09IENIQVJfQVRcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9BU1RFUklTS1xuICAgICAgICB8fCBjb2RlID09PSBDSEFSX1FVRVNUSU9OX01BUktcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9FWENMQU1BVElPTl9NQVJLO1xuXG4gICAgICBpZiAoaXNFeHRnbG9iQ2hhciA9PT0gdHJ1ZSAmJiBwZWVrKCkgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUyQxKSB7XG4gICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgIGlzRXh0Z2xvYiA9IHRva2VuLmlzRXh0Z2xvYiA9IHRydWU7XG4gICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRVhDTEFNQVRJT05fTUFSSyAmJiBpbmRleCA9PT0gc3RhcnQpIHtcbiAgICAgICAgICBuZWdhdGVkRXh0Z2xvYiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgICAgd2hpbGUgKGVvcygpICE9PSB0cnVlICYmIChjb2RlID0gYWR2YW5jZSgpKSkge1xuICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgICAgIGNvZGUgPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUyQxKSB7XG4gICAgICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX0FTVEVSSVNLKSB7XG4gICAgICBpZiAocHJldiA9PT0gQ0hBUl9BU1RFUklTSykgaXNHbG9ic3RhciA9IHRva2VuLmlzR2xvYnN0YXIgPSB0cnVlO1xuICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX1FVRVNUSU9OX01BUkspIHtcbiAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUJDEpIHtcbiAgICAgIHdoaWxlIChlb3MoKSAhPT0gdHJ1ZSAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHtcbiAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICBhZHZhbmNlKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCQxKSB7XG4gICAgICAgICAgaXNCcmFja2V0ID0gdG9rZW4uaXNCcmFja2V0ID0gdHJ1ZTtcbiAgICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2NhblRvRW5kID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5ub25lZ2F0ZSAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0VYQ0xBTUFUSU9OX01BUksgJiYgaW5kZXggPT09IHN0YXJ0KSB7XG4gICAgICBuZWdhdGVkID0gdG9rZW4ubmVnYXRlZCA9IHRydWU7XG4gICAgICBzdGFydCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMubm9wYXJlbiAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0xFRlRfUEFSRU5USEVTRVMkMSkge1xuICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKGNvZGUgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUyQxKSB7XG4gICAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvZGUgPSBhZHZhbmNlKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUyQxKSB7XG4gICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoaXNHbG9iID09PSB0cnVlKSB7XG4gICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLm5vZXh0ID09PSB0cnVlKSB7XG4gICAgaXNFeHRnbG9iID0gZmFsc2U7XG4gICAgaXNHbG9iID0gZmFsc2U7XG4gIH1cblxuICBsZXQgYmFzZSA9IHN0cjtcbiAgbGV0IHByZWZpeCA9ICcnO1xuICBsZXQgZ2xvYiA9ICcnO1xuXG4gIGlmIChzdGFydCA+IDApIHtcbiAgICBwcmVmaXggPSBzdHIuc2xpY2UoMCwgc3RhcnQpO1xuICAgIHN0ciA9IHN0ci5zbGljZShzdGFydCk7XG4gICAgbGFzdEluZGV4IC09IHN0YXJ0O1xuICB9XG5cbiAgaWYgKGJhc2UgJiYgaXNHbG9iID09PSB0cnVlICYmIGxhc3RJbmRleCA+IDApIHtcbiAgICBiYXNlID0gc3RyLnNsaWNlKDAsIGxhc3RJbmRleCk7XG4gICAgZ2xvYiA9IHN0ci5zbGljZShsYXN0SW5kZXgpO1xuICB9IGVsc2UgaWYgKGlzR2xvYiA9PT0gdHJ1ZSkge1xuICAgIGJhc2UgPSAnJztcbiAgICBnbG9iID0gc3RyO1xuICB9IGVsc2Uge1xuICAgIGJhc2UgPSBzdHI7XG4gIH1cblxuICBpZiAoYmFzZSAmJiBiYXNlICE9PSAnJyAmJiBiYXNlICE9PSAnLycgJiYgYmFzZSAhPT0gc3RyKSB7XG4gICAgaWYgKGlzUGF0aFNlcGFyYXRvcihiYXNlLmNoYXJDb2RlQXQoYmFzZS5sZW5ndGggLSAxKSkpIHtcbiAgICAgIGJhc2UgPSBiYXNlLnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgIGlmIChnbG9iKSBnbG9iID0gdXRpbHMkai5yZW1vdmVCYWNrc2xhc2hlcyhnbG9iKTtcblxuICAgIGlmIChiYXNlICYmIGJhY2tzbGFzaGVzID09PSB0cnVlKSB7XG4gICAgICBiYXNlID0gdXRpbHMkai5yZW1vdmVCYWNrc2xhc2hlcyhiYXNlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBwcmVmaXgsXG4gICAgaW5wdXQsXG4gICAgc3RhcnQsXG4gICAgYmFzZSxcbiAgICBnbG9iLFxuICAgIGlzQnJhY2UsXG4gICAgaXNCcmFja2V0LFxuICAgIGlzR2xvYixcbiAgICBpc0V4dGdsb2IsXG4gICAgaXNHbG9ic3RhcixcbiAgICBuZWdhdGVkLFxuICAgIG5lZ2F0ZWRFeHRnbG9iXG4gIH07XG5cbiAgaWYgKG9wdHMudG9rZW5zID09PSB0cnVlKSB7XG4gICAgc3RhdGUubWF4RGVwdGggPSAwO1xuICAgIGlmICghaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7XG4gICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgfVxuICAgIHN0YXRlLnRva2VucyA9IHRva2VucztcbiAgfVxuXG4gIGlmIChvcHRzLnBhcnRzID09PSB0cnVlIHx8IG9wdHMudG9rZW5zID09PSB0cnVlKSB7XG4gICAgbGV0IHByZXZJbmRleDtcblxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHNsYXNoZXMubGVuZ3RoOyBpZHgrKykge1xuICAgICAgY29uc3QgbiA9IHByZXZJbmRleCA/IHByZXZJbmRleCArIDEgOiBzdGFydDtcbiAgICAgIGNvbnN0IGkgPSBzbGFzaGVzW2lkeF07XG4gICAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnNsaWNlKG4sIGkpO1xuICAgICAgaWYgKG9wdHMudG9rZW5zKSB7XG4gICAgICAgIGlmIChpZHggPT09IDAgJiYgc3RhcnQgIT09IDApIHtcbiAgICAgICAgICB0b2tlbnNbaWR4XS5pc1ByZWZpeCA9IHRydWU7XG4gICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSBwcmVmaXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zW2lkeF0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBkZXB0aCh0b2tlbnNbaWR4XSk7XG4gICAgICAgIHN0YXRlLm1heERlcHRoICs9IHRva2Vuc1tpZHhdLmRlcHRoO1xuICAgICAgfVxuICAgICAgaWYgKGlkeCAhPT0gMCB8fCB2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgcGFydHMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBwcmV2SW5kZXggPSBpO1xuICAgIH1cblxuICAgIGlmIChwcmV2SW5kZXggJiYgcHJldkluZGV4ICsgMSA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC5zbGljZShwcmV2SW5kZXggKyAxKTtcbiAgICAgIHBhcnRzLnB1c2godmFsdWUpO1xuXG4gICAgICBpZiAob3B0cy50b2tlbnMpIHtcbiAgICAgICAgdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBkZXB0aCh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgc3RhdGUubWF4RGVwdGggKz0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS5kZXB0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0ZS5zbGFzaGVzID0gc2xhc2hlcztcbiAgICBzdGF0ZS5wYXJ0cyA9IHBhcnRzO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufTtcblxudmFyIHNjYW5fMSA9IHNjYW4kMjtcblxuY29uc3QgY29uc3RhbnRzJDUgPSBjb25zdGFudHMkNjtcbmNvbnN0IHV0aWxzJGkgPSB1dGlscyRrO1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IHtcbiAgTUFYX0xFTkdUSDogTUFYX0xFTkdUSCQxLFxuICBQT1NJWF9SRUdFWF9TT1VSQ0UsXG4gIFJFR0VYX05PTl9TUEVDSUFMX0NIQVJTLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTX0JBQ0tSRUYsXG4gIFJFUExBQ0VNRU5UU1xufSA9IGNvbnN0YW50cyQ1O1xuXG4vKipcbiAqIEhlbHBlcnNcbiAqL1xuXG5jb25zdCBleHBhbmRSYW5nZSA9IChhcmdzLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5leHBhbmRSYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBvcHRpb25zLmV4cGFuZFJhbmdlKC4uLmFyZ3MsIG9wdGlvbnMpO1xuICB9XG5cbiAgYXJncy5zb3J0KCk7XG4gIGNvbnN0IHZhbHVlID0gYFske2FyZ3Muam9pbignLScpfV1gO1xuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBtZXNzYWdlIGZvciBhIHN5bnRheCBlcnJvclxuICovXG5cbmNvbnN0IHN5bnRheEVycm9yID0gKHR5cGUsIGNoYXIpID0+IHtcbiAgcmV0dXJuIGBNaXNzaW5nICR7dHlwZX06IFwiJHtjaGFyfVwiIC0gdXNlIFwiXFxcXFxcXFwke2NoYXJ9XCIgdG8gbWF0Y2ggbGl0ZXJhbCBjaGFyYWN0ZXJzYDtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGlucHV0IHN0cmluZy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuXG5jb25zdCBwYXJzZSRoID0gKGlucHV0LCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlucHV0ID0gUkVQTEFDRU1FTlRTW2lucHV0XSB8fCBpbnB1dDtcblxuICBjb25zdCBvcHRzID0geyAuLi5vcHRpb25zIH07XG4gIGNvbnN0IG1heCA9IHR5cGVvZiBvcHRzLm1heExlbmd0aCA9PT0gJ251bWJlcicgPyBNYXRoLm1pbihNQVhfTEVOR1RIJDEsIG9wdHMubWF4TGVuZ3RoKSA6IE1BWF9MRU5HVEgkMTtcblxuICBsZXQgbGVuID0gaW5wdXQubGVuZ3RoO1xuICBpZiAobGVuID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnB1dCBsZW5ndGg6ICR7bGVufSwgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoOiAke21heH1gKTtcbiAgfVxuXG4gIGNvbnN0IGJvcyA9IHsgdHlwZTogJ2JvcycsIHZhbHVlOiAnJywgb3V0cHV0OiBvcHRzLnByZXBlbmQgfHwgJycgfTtcbiAgY29uc3QgdG9rZW5zID0gW2Jvc107XG5cbiAgY29uc3QgY2FwdHVyZSA9IG9wdHMuY2FwdHVyZSA/ICcnIDogJz86JztcbiAgY29uc3Qgd2luMzIgPSB1dGlscyRpLmlzV2luZG93cyhvcHRpb25zKTtcblxuICAvLyBjcmVhdGUgY29uc3RhbnRzIGJhc2VkIG9uIHBsYXRmb3JtLCBmb3Igd2luZG93cyBvciBwb3NpeFxuICBjb25zdCBQTEFURk9STV9DSEFSUyA9IGNvbnN0YW50cyQ1Lmdsb2JDaGFycyh3aW4zMik7XG4gIGNvbnN0IEVYVEdMT0JfQ0hBUlMgPSBjb25zdGFudHMkNS5leHRnbG9iQ2hhcnMoUExBVEZPUk1fQ0hBUlMpO1xuXG4gIGNvbnN0IHtcbiAgICBET1RfTElURVJBTCxcbiAgICBQTFVTX0xJVEVSQUwsXG4gICAgU0xBU0hfTElURVJBTCxcbiAgICBPTkVfQ0hBUixcbiAgICBET1RTX1NMQVNILFxuICAgIE5PX0RPVCxcbiAgICBOT19ET1RfU0xBU0gsXG4gICAgTk9fRE9UU19TTEFTSCxcbiAgICBRTUFSSyxcbiAgICBRTUFSS19OT19ET1QsXG4gICAgU1RBUixcbiAgICBTVEFSVF9BTkNIT1JcbiAgfSA9IFBMQVRGT1JNX0NIQVJTO1xuXG4gIGNvbnN0IGdsb2JzdGFyID0gb3B0cyA9PiB7XG4gICAgcmV0dXJuIGAoJHtjYXB0dXJlfSg/Oig/ISR7U1RBUlRfQU5DSE9SfSR7b3B0cy5kb3QgPyBET1RTX1NMQVNIIDogRE9UX0xJVEVSQUx9KS4pKj8pYDtcbiAgfTtcblxuICBjb25zdCBub2RvdCA9IG9wdHMuZG90ID8gJycgOiBOT19ET1Q7XG4gIGNvbnN0IHFtYXJrTm9Eb3QgPSBvcHRzLmRvdCA/IFFNQVJLIDogUU1BUktfTk9fRE9UO1xuICBsZXQgc3RhciA9IG9wdHMuYmFzaCA9PT0gdHJ1ZSA/IGdsb2JzdGFyKG9wdHMpIDogU1RBUjtcblxuICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgc3RhciA9IGAoJHtzdGFyfSlgO1xuICB9XG5cbiAgLy8gbWluaW1hdGNoIG9wdGlvbnMgc3VwcG9ydFxuICBpZiAodHlwZW9mIG9wdHMubm9leHQgPT09ICdib29sZWFuJykge1xuICAgIG9wdHMubm9leHRnbG9iID0gb3B0cy5ub2V4dDtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIGlucHV0LFxuICAgIGluZGV4OiAtMSxcbiAgICBzdGFydDogMCxcbiAgICBkb3Q6IG9wdHMuZG90ID09PSB0cnVlLFxuICAgIGNvbnN1bWVkOiAnJyxcbiAgICBvdXRwdXQ6ICcnLFxuICAgIHByZWZpeDogJycsXG4gICAgYmFja3RyYWNrOiBmYWxzZSxcbiAgICBuZWdhdGVkOiBmYWxzZSxcbiAgICBicmFja2V0czogMCxcbiAgICBicmFjZXM6IDAsXG4gICAgcGFyZW5zOiAwLFxuICAgIHF1b3RlczogMCxcbiAgICBnbG9ic3RhcjogZmFsc2UsXG4gICAgdG9rZW5zXG4gIH07XG5cbiAgaW5wdXQgPSB1dGlscyRpLnJlbW92ZVByZWZpeChpbnB1dCwgc3RhdGUpO1xuICBsZW4gPSBpbnB1dC5sZW5ndGg7XG5cbiAgY29uc3QgZXh0Z2xvYnMgPSBbXTtcbiAgY29uc3QgYnJhY2VzID0gW107XG4gIGNvbnN0IHN0YWNrID0gW107XG4gIGxldCBwcmV2ID0gYm9zO1xuICBsZXQgdmFsdWU7XG5cbiAgLyoqXG4gICAqIFRva2VuaXppbmcgaGVscGVyc1xuICAgKi9cblxuICBjb25zdCBlb3MgPSAoKSA9PiBzdGF0ZS5pbmRleCA9PT0gbGVuIC0gMTtcbiAgY29uc3QgcGVlayA9IHN0YXRlLnBlZWsgPSAobiA9IDEpID0+IGlucHV0W3N0YXRlLmluZGV4ICsgbl07XG4gIGNvbnN0IGFkdmFuY2UgPSBzdGF0ZS5hZHZhbmNlID0gKCkgPT4gaW5wdXRbKytzdGF0ZS5pbmRleF0gfHwgJyc7XG4gIGNvbnN0IHJlbWFpbmluZyA9ICgpID0+IGlucHV0LnNsaWNlKHN0YXRlLmluZGV4ICsgMSk7XG4gIGNvbnN0IGNvbnN1bWUgPSAodmFsdWUgPSAnJywgbnVtID0gMCkgPT4ge1xuICAgIHN0YXRlLmNvbnN1bWVkICs9IHZhbHVlO1xuICAgIHN0YXRlLmluZGV4ICs9IG51bTtcbiAgfTtcblxuICBjb25zdCBhcHBlbmQgPSB0b2tlbiA9PiB7XG4gICAgc3RhdGUub3V0cHV0ICs9IHRva2VuLm91dHB1dCAhPSBudWxsID8gdG9rZW4ub3V0cHV0IDogdG9rZW4udmFsdWU7XG4gICAgY29uc3VtZSh0b2tlbi52YWx1ZSk7XG4gIH07XG5cbiAgY29uc3QgbmVnYXRlID0gKCkgPT4ge1xuICAgIGxldCBjb3VudCA9IDE7XG5cbiAgICB3aGlsZSAocGVlaygpID09PSAnIScgJiYgKHBlZWsoMikgIT09ICcoJyB8fCBwZWVrKDMpID09PSAnPycpKSB7XG4gICAgICBhZHZhbmNlKCk7XG4gICAgICBzdGF0ZS5zdGFydCsrO1xuICAgICAgY291bnQrKztcbiAgICB9XG5cbiAgICBpZiAoY291bnQgJSAyID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3RhdGUubmVnYXRlZCA9IHRydWU7XG4gICAgc3RhdGUuc3RhcnQrKztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCBpbmNyZW1lbnQgPSB0eXBlID0+IHtcbiAgICBzdGF0ZVt0eXBlXSsrO1xuICAgIHN0YWNrLnB1c2godHlwZSk7XG4gIH07XG5cbiAgY29uc3QgZGVjcmVtZW50ID0gdHlwZSA9PiB7XG4gICAgc3RhdGVbdHlwZV0tLTtcbiAgICBzdGFjay5wb3AoKTtcbiAgfTtcblxuICAvKipcbiAgICogUHVzaCB0b2tlbnMgb250byB0aGUgdG9rZW5zIGFycmF5LiBUaGlzIGhlbHBlciBzcGVlZHMgdXBcbiAgICogdG9rZW5pemluZyBieSAxKSBoZWxwaW5nIHVzIGF2b2lkIGJhY2t0cmFja2luZyBhcyBtdWNoIGFzIHBvc3NpYmxlLFxuICAgKiBhbmQgMikgaGVscGluZyB1cyBhdm9pZCBjcmVhdGluZyBleHRyYSB0b2tlbnMgd2hlbiBjb25zZWN1dGl2ZVxuICAgKiBjaGFyYWN0ZXJzIGFyZSBwbGFpbiB0ZXh0LiBUaGlzIGltcHJvdmVzIHBlcmZvcm1hbmNlIGFuZCBzaW1wbGlmaWVzXG4gICAqIGxvb2tiZWhpbmRzLlxuICAgKi9cblxuICBjb25zdCBwdXNoID0gdG9rID0+IHtcbiAgICBpZiAocHJldi50eXBlID09PSAnZ2xvYnN0YXInKSB7XG4gICAgICBjb25zdCBpc0JyYWNlID0gc3RhdGUuYnJhY2VzID4gMCAmJiAodG9rLnR5cGUgPT09ICdjb21tYScgfHwgdG9rLnR5cGUgPT09ICdicmFjZScpO1xuICAgICAgY29uc3QgaXNFeHRnbG9iID0gdG9rLmV4dGdsb2IgPT09IHRydWUgfHwgKGV4dGdsb2JzLmxlbmd0aCAmJiAodG9rLnR5cGUgPT09ICdwaXBlJyB8fCB0b2sudHlwZSA9PT0gJ3BhcmVuJykpO1xuXG4gICAgICBpZiAodG9rLnR5cGUgIT09ICdzbGFzaCcgJiYgdG9rLnR5cGUgIT09ICdwYXJlbicgJiYgIWlzQnJhY2UgJiYgIWlzRXh0Z2xvYikge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLXByZXYub3V0cHV0Lmxlbmd0aCk7XG4gICAgICAgIHByZXYudHlwZSA9ICdzdGFyJztcbiAgICAgICAgcHJldi52YWx1ZSA9ICcqJztcbiAgICAgICAgcHJldi5vdXRwdXQgPSBzdGFyO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJldi5vdXRwdXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4dGdsb2JzLmxlbmd0aCAmJiB0b2sudHlwZSAhPT0gJ3BhcmVuJykge1xuICAgICAgZXh0Z2xvYnNbZXh0Z2xvYnMubGVuZ3RoIC0gMV0uaW5uZXIgKz0gdG9rLnZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0b2sudmFsdWUgfHwgdG9rLm91dHB1dCkgYXBwZW5kKHRvayk7XG4gICAgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAndGV4dCcgJiYgdG9rLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcHJldi52YWx1ZSArPSB0b2sudmFsdWU7XG4gICAgICBwcmV2Lm91dHB1dCA9IChwcmV2Lm91dHB1dCB8fCAnJykgKyB0b2sudmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdG9rLnByZXYgPSBwcmV2O1xuICAgIHRva2Vucy5wdXNoKHRvayk7XG4gICAgcHJldiA9IHRvaztcbiAgfTtcblxuICBjb25zdCBleHRnbG9iT3BlbiA9ICh0eXBlLCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHRva2VuID0geyAuLi5FWFRHTE9CX0NIQVJTW3ZhbHVlXSwgY29uZGl0aW9uczogMSwgaW5uZXI6ICcnIH07XG5cbiAgICB0b2tlbi5wcmV2ID0gcHJldjtcbiAgICB0b2tlbi5wYXJlbnMgPSBzdGF0ZS5wYXJlbnM7XG4gICAgdG9rZW4ub3V0cHV0ID0gc3RhdGUub3V0cHV0O1xuICAgIGNvbnN0IG91dHB1dCA9IChvcHRzLmNhcHR1cmUgPyAnKCcgOiAnJykgKyB0b2tlbi5vcGVuO1xuXG4gICAgaW5jcmVtZW50KCdwYXJlbnMnKTtcbiAgICBwdXNoKHsgdHlwZSwgdmFsdWUsIG91dHB1dDogc3RhdGUub3V0cHV0ID8gJycgOiBPTkVfQ0hBUiB9KTtcbiAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgZXh0Z2xvYjogdHJ1ZSwgdmFsdWU6IGFkdmFuY2UoKSwgb3V0cHV0IH0pO1xuICAgIGV4dGdsb2JzLnB1c2godG9rZW4pO1xuICB9O1xuXG4gIGNvbnN0IGV4dGdsb2JDbG9zZSA9IHRva2VuID0+IHtcbiAgICBsZXQgb3V0cHV0ID0gdG9rZW4uY2xvc2UgKyAob3B0cy5jYXB0dXJlID8gJyknIDogJycpO1xuICAgIGxldCByZXN0O1xuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICduZWdhdGUnKSB7XG4gICAgICBsZXQgZXh0Z2xvYlN0YXIgPSBzdGFyO1xuXG4gICAgICBpZiAodG9rZW4uaW5uZXIgJiYgdG9rZW4uaW5uZXIubGVuZ3RoID4gMSAmJiB0b2tlbi5pbm5lci5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgIGV4dGdsb2JTdGFyID0gZ2xvYnN0YXIob3B0cyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChleHRnbG9iU3RhciAhPT0gc3RhciB8fCBlb3MoKSB8fCAvXlxcKSskLy50ZXN0KHJlbWFpbmluZygpKSkge1xuICAgICAgICBvdXRwdXQgPSB0b2tlbi5jbG9zZSA9IGApJCkpJHtleHRnbG9iU3Rhcn1gO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4uaW5uZXIuaW5jbHVkZXMoJyonKSAmJiAocmVzdCA9IHJlbWFpbmluZygpKSAmJiAvXlxcLlteXFxcXC8uXSskLy50ZXN0KHJlc3QpKSB7XG4gICAgICAgIC8vIEFueSBub24tbWFnaWNhbCBzdHJpbmcgKGAudHNgKSBvciBldmVuIG5lc3RlZCBleHByZXNzaW9uIChgLnt0cyx0c3h9YCkgY2FuIGZvbGxvdyBhZnRlciB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcy5cbiAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHBhcnNlIHRoZSBzdHJpbmcgYW5kIHVzZSBpdCBpbiB0aGUgb3V0cHV0IG9mIHRoZSBvcmlnaW5hbCBwYXR0ZXJuLlxuICAgICAgICAvLyBTdWl0YWJsZSBwYXR0ZXJuczogYC8hKCouZCkudHNgLCBgLyEoKi5kKS57dHMsdHN4fWAsIGAqKi8hKCotZGJnKS5AKGpzKWAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERpc2FibGluZyB0aGUgYGZhc3RwYXRoc2Agb3B0aW9uIGR1ZSB0byBhIHByb2JsZW0gd2l0aCBwYXJzaW5nIHN0cmluZ3MgYXMgYC50c2AgaW4gdGhlIHBhdHRlcm4gbGlrZSBgKiovISgqLmQpLnRzYC5cbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHBhcnNlJGgocmVzdCwgeyAuLi5vcHRpb25zLCBmYXN0cGF0aHM6IGZhbHNlIH0pLm91dHB1dDtcblxuICAgICAgICBvdXRwdXQgPSB0b2tlbi5jbG9zZSA9IGApJHtleHByZXNzaW9ufSkke2V4dGdsb2JTdGFyfSlgO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4ucHJldi50eXBlID09PSAnYm9zJykge1xuICAgICAgICBzdGF0ZS5uZWdhdGVkRXh0Z2xvYiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIGV4dGdsb2I6IHRydWUsIHZhbHVlLCBvdXRwdXQgfSk7XG4gICAgZGVjcmVtZW50KCdwYXJlbnMnKTtcbiAgfTtcblxuICAvKipcbiAgICogRmFzdCBwYXRoc1xuICAgKi9cblxuICBpZiAob3B0cy5mYXN0cGF0aHMgIT09IGZhbHNlICYmICEvKF5bKiFdfFsvKClbXFxde31cIl0pLy50ZXN0KGlucHV0KSkge1xuICAgIGxldCBiYWNrc2xhc2hlcyA9IGZhbHNlO1xuXG4gICAgbGV0IG91dHB1dCA9IGlucHV0LnJlcGxhY2UoUkVHRVhfU1BFQ0lBTF9DSEFSU19CQUNLUkVGLCAobSwgZXNjLCBjaGFycywgZmlyc3QsIHJlc3QsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoZmlyc3QgPT09ICdcXFxcJykge1xuICAgICAgICBiYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICc/Jykge1xuICAgICAgICBpZiAoZXNjKSB7XG4gICAgICAgICAgcmV0dXJuIGVzYyArIGZpcnN0ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBxbWFya05vRG90ICsgKHJlc3QgPyBRTUFSSy5yZXBlYXQocmVzdC5sZW5ndGgpIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBRTUFSSy5yZXBlYXQoY2hhcnMubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0ID09PSAnLicpIHtcbiAgICAgICAgcmV0dXJuIERPVF9MSVRFUkFMLnJlcGVhdChjaGFycy5sZW5ndGgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3QgPT09ICcqJykge1xuICAgICAgICBpZiAoZXNjKSB7XG4gICAgICAgICAgcmV0dXJuIGVzYyArIGZpcnN0ICsgKHJlc3QgPyBzdGFyIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVzYyA/IG0gOiBgXFxcXCR7bX1gO1xuICAgIH0pO1xuXG4gICAgaWYgKGJhY2tzbGFzaGVzID09PSB0cnVlKSB7XG4gICAgICBpZiAob3B0cy51bmVzY2FwZSA9PT0gdHJ1ZSkge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZSgvXFxcXCsvZywgbSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG0ubGVuZ3RoICUgMiA9PT0gMCA/ICdcXFxcXFxcXCcgOiAobSA/ICdcXFxcJyA6ICcnKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG91dHB1dCA9PT0gaW5wdXQgJiYgb3B0cy5jb250YWlucyA9PT0gdHJ1ZSkge1xuICAgICAgc3RhdGUub3V0cHV0ID0gaW5wdXQ7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgc3RhdGUub3V0cHV0ID0gdXRpbHMkaS53cmFwT3V0cHV0KG91dHB1dCwgc3RhdGUsIG9wdGlvbnMpO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2tlbml6ZSBpbnB1dCB1bnRpbCB3ZSByZWFjaCBlbmQtb2Ytc3RyaW5nXG4gICAqL1xuXG4gIHdoaWxlICghZW9zKCkpIHtcbiAgICB2YWx1ZSA9IGFkdmFuY2UoKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVkIGNoYXJhY3RlcnNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ1xcXFwnKSB7XG4gICAgICBjb25zdCBuZXh0ID0gcGVlaygpO1xuXG4gICAgICBpZiAobmV4dCA9PT0gJy8nICYmIG9wdHMuYmFzaCAhPT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5leHQgPT09ICcuJyB8fCBuZXh0ID09PSAnOycpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghbmV4dCkge1xuICAgICAgICB2YWx1ZSArPSAnXFxcXCc7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29sbGFwc2Ugc2xhc2hlcyB0byByZWR1Y2UgcG90ZW50aWFsIGZvciBleHBsb2l0c1xuICAgICAgY29uc3QgbWF0Y2ggPSAvXlxcXFwrLy5leGVjKHJlbWFpbmluZygpKTtcbiAgICAgIGxldCBzbGFzaGVzID0gMDtcblxuICAgICAgaWYgKG1hdGNoICYmIG1hdGNoWzBdLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgc2xhc2hlcyA9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgc3RhdGUuaW5kZXggKz0gc2xhc2hlcztcbiAgICAgICAgaWYgKHNsYXNoZXMgJSAyICE9PSAwKSB7XG4gICAgICAgICAgdmFsdWUgKz0gJ1xcXFwnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLnVuZXNjYXBlID09PSB0cnVlKSB7XG4gICAgICAgIHZhbHVlID0gYWR2YW5jZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgKz0gYWR2YW5jZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuYnJhY2tldHMgPT09IDApIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHdlJ3JlIGluc2lkZSBhIHJlZ2V4IGNoYXJhY3RlciBjbGFzcywgY29udGludWVcbiAgICAgKiB1bnRpbCB3ZSByZWFjaCB0aGUgY2xvc2luZyBicmFja2V0LlxuICAgICAqL1xuXG4gICAgaWYgKHN0YXRlLmJyYWNrZXRzID4gMCAmJiAodmFsdWUgIT09ICddJyB8fCBwcmV2LnZhbHVlID09PSAnWycgfHwgcHJldi52YWx1ZSA9PT0gJ1teJykpIHtcbiAgICAgIGlmIChvcHRzLnBvc2l4ICE9PSBmYWxzZSAmJiB2YWx1ZSA9PT0gJzonKSB7XG4gICAgICAgIGNvbnN0IGlubmVyID0gcHJldi52YWx1ZS5zbGljZSgxKTtcbiAgICAgICAgaWYgKGlubmVyLmluY2x1ZGVzKCdbJykpIHtcbiAgICAgICAgICBwcmV2LnBvc2l4ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChpbm5lci5pbmNsdWRlcygnOicpKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBwcmV2LnZhbHVlLmxhc3RJbmRleE9mKCdbJyk7XG4gICAgICAgICAgICBjb25zdCBwcmUgPSBwcmV2LnZhbHVlLnNsaWNlKDAsIGlkeCk7XG4gICAgICAgICAgICBjb25zdCByZXN0ID0gcHJldi52YWx1ZS5zbGljZShpZHggKyAyKTtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l4ID0gUE9TSVhfUkVHRVhfU09VUkNFW3Jlc3RdO1xuICAgICAgICAgICAgaWYgKHBvc2l4KSB7XG4gICAgICAgICAgICAgIHByZXYudmFsdWUgPSBwcmUgKyBwb3NpeDtcbiAgICAgICAgICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYWR2YW5jZSgpO1xuXG4gICAgICAgICAgICAgIGlmICghYm9zLm91dHB1dCAmJiB0b2tlbnMuaW5kZXhPZihwcmV2KSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGJvcy5vdXRwdXQgPSBPTkVfQ0hBUjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCh2YWx1ZSA9PT0gJ1snICYmIHBlZWsoKSAhPT0gJzonKSB8fCAodmFsdWUgPT09ICctJyAmJiBwZWVrKCkgPT09ICddJykpIHtcbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSAnXScgJiYgKHByZXYudmFsdWUgPT09ICdbJyB8fCBwcmV2LnZhbHVlID09PSAnW14nKSkge1xuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5wb3NpeCA9PT0gdHJ1ZSAmJiB2YWx1ZSA9PT0gJyEnICYmIHByZXYudmFsdWUgPT09ICdbJykge1xuICAgICAgICB2YWx1ZSA9ICdeJztcbiAgICAgIH1cblxuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgIGFwcGVuZCh7IHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgd2UncmUgaW5zaWRlIGEgcXVvdGVkIHN0cmluZywgY29udGludWVcbiAgICAgKiB1bnRpbCB3ZSByZWFjaCB0aGUgY2xvc2luZyBkb3VibGUgcXVvdGUuXG4gICAgICovXG5cbiAgICBpZiAoc3RhdGUucXVvdGVzID09PSAxICYmIHZhbHVlICE9PSAnXCInKSB7XG4gICAgICB2YWx1ZSA9IHV0aWxzJGkuZXNjYXBlUmVnZXgodmFsdWUpO1xuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgIGFwcGVuZCh7IHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG91YmxlIHF1b3Rlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnXCInKSB7XG4gICAgICBzdGF0ZS5xdW90ZXMgPSBzdGF0ZS5xdW90ZXMgPT09IDEgPyAwIDogMTtcbiAgICAgIGlmIChvcHRzLmtlZXBRdW90ZXMgPT09IHRydWUpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJlbnRoZXNlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnKCcpIHtcbiAgICAgIGluY3JlbWVudCgncGFyZW5zJyk7XG4gICAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICcpJykge1xuICAgICAgaWYgKHN0YXRlLnBhcmVucyA9PT0gMCAmJiBvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignb3BlbmluZycsICcoJykpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRnbG9iID0gZXh0Z2xvYnNbZXh0Z2xvYnMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoZXh0Z2xvYiAmJiBzdGF0ZS5wYXJlbnMgPT09IGV4dGdsb2IucGFyZW5zICsgMSkge1xuICAgICAgICBleHRnbG9iQ2xvc2UoZXh0Z2xvYnMucG9wKCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIHZhbHVlLCBvdXRwdXQ6IHN0YXRlLnBhcmVucyA/ICcpJyA6ICdcXFxcKScgfSk7XG4gICAgICBkZWNyZW1lbnQoJ3BhcmVucycpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3F1YXJlIGJyYWNrZXRzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdbJykge1xuICAgICAgaWYgKG9wdHMubm9icmFja2V0ID09PSB0cnVlIHx8ICFyZW1haW5pbmcoKS5pbmNsdWRlcygnXScpKSB7XG4gICAgICAgIGlmIChvcHRzLm5vYnJhY2tldCAhPT0gdHJ1ZSAmJiBvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdjbG9zaW5nJywgJ10nKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jcmVtZW50KCdicmFja2V0cycpO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2JyYWNrZXQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJ10nKSB7XG4gICAgICBpZiAob3B0cy5ub2JyYWNrZXQgPT09IHRydWUgfHwgKHByZXYgJiYgcHJldi50eXBlID09PSAnYnJhY2tldCcgJiYgcHJldi52YWx1ZS5sZW5ndGggPT09IDEpKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IGBcXFxcJHt2YWx1ZX1gIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlLmJyYWNrZXRzID09PSAwKSB7XG4gICAgICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdvcGVuaW5nJywgJ1snKSk7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0OiBgXFxcXCR7dmFsdWV9YCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGRlY3JlbWVudCgnYnJhY2tldHMnKTtcblxuICAgICAgY29uc3QgcHJldlZhbHVlID0gcHJldi52YWx1ZS5zbGljZSgxKTtcbiAgICAgIGlmIChwcmV2LnBvc2l4ICE9PSB0cnVlICYmIHByZXZWYWx1ZVswXSA9PT0gJ14nICYmICFwcmV2VmFsdWUuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICB2YWx1ZSA9IGAvJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgYXBwZW5kKHsgdmFsdWUgfSk7XG5cbiAgICAgIC8vIHdoZW4gbGl0ZXJhbCBicmFja2V0cyBhcmUgZXhwbGljaXRseSBkaXNhYmxlZFxuICAgICAgLy8gYXNzdW1lIHdlIHNob3VsZCBtYXRjaCB3aXRoIGEgcmVnZXggY2hhcmFjdGVyIGNsYXNzXG4gICAgICBpZiAob3B0cy5saXRlcmFsQnJhY2tldHMgPT09IGZhbHNlIHx8IHV0aWxzJGkuaGFzUmVnZXhDaGFycyhwcmV2VmFsdWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlc2NhcGVkID0gdXRpbHMkaS5lc2NhcGVSZWdleChwcmV2LnZhbHVlKTtcbiAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtcHJldi52YWx1ZS5sZW5ndGgpO1xuXG4gICAgICAvLyB3aGVuIGxpdGVyYWwgYnJhY2tldHMgYXJlIGV4cGxpY2l0bHkgZW5hYmxlZFxuICAgICAgLy8gYXNzdW1lIHdlIHNob3VsZCBlc2NhcGUgdGhlIGJyYWNrZXRzIHRvIG1hdGNoIGxpdGVyYWwgY2hhcmFjdGVyc1xuICAgICAgaWYgKG9wdHMubGl0ZXJhbEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBlc2NhcGVkO1xuICAgICAgICBwcmV2LnZhbHVlID0gZXNjYXBlZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHdoZW4gdGhlIHVzZXIgc3BlY2lmaWVzIG5vdGhpbmcsIHRyeSB0byBtYXRjaCBib3RoXG4gICAgICBwcmV2LnZhbHVlID0gYCgke2NhcHR1cmV9JHtlc2NhcGVkfXwke3ByZXYudmFsdWV9KWA7XG4gICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJldi52YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJyYWNlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAneycgJiYgb3B0cy5ub2JyYWNlICE9PSB0cnVlKSB7XG4gICAgICBpbmNyZW1lbnQoJ2JyYWNlcycpO1xuXG4gICAgICBjb25zdCBvcGVuID0ge1xuICAgICAgICB0eXBlOiAnYnJhY2UnLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb3V0cHV0OiAnKCcsXG4gICAgICAgIG91dHB1dEluZGV4OiBzdGF0ZS5vdXRwdXQubGVuZ3RoLFxuICAgICAgICB0b2tlbnNJbmRleDogc3RhdGUudG9rZW5zLmxlbmd0aFxuICAgICAgfTtcblxuICAgICAgYnJhY2VzLnB1c2gob3Blbik7XG4gICAgICBwdXNoKG9wZW4pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnfScpIHtcbiAgICAgIGNvbnN0IGJyYWNlID0gYnJhY2VzW2JyYWNlcy5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKG9wdHMubm9icmFjZSA9PT0gdHJ1ZSB8fCAhYnJhY2UpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dDogdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgb3V0cHV0ID0gJyknO1xuXG4gICAgICBpZiAoYnJhY2UuZG90cyA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBhcnIgPSB0b2tlbnMuc2xpY2UoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdG9rZW5zLnBvcCgpO1xuICAgICAgICAgIGlmIChhcnJbaV0udHlwZSA9PT0gJ2JyYWNlJykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhcnJbaV0udHlwZSAhPT0gJ2RvdHMnKSB7XG4gICAgICAgICAgICByYW5nZS51bnNoaWZ0KGFycltpXS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0ID0gZXhwYW5kUmFuZ2UocmFuZ2UsIG9wdHMpO1xuICAgICAgICBzdGF0ZS5iYWNrdHJhY2sgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnJhY2UuY29tbWEgIT09IHRydWUgJiYgYnJhY2UuZG90cyAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBvdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgYnJhY2Uub3V0cHV0SW5kZXgpO1xuICAgICAgICBjb25zdCB0b2tzID0gc3RhdGUudG9rZW5zLnNsaWNlKGJyYWNlLnRva2Vuc0luZGV4KTtcbiAgICAgICAgYnJhY2UudmFsdWUgPSBicmFjZS5vdXRwdXQgPSAnXFxcXHsnO1xuICAgICAgICB2YWx1ZSA9IG91dHB1dCA9ICdcXFxcfSc7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9IG91dDtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRva3MpIHtcbiAgICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gKHQub3V0cHV0IHx8IHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnYnJhY2UnLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgICAgZGVjcmVtZW50KCdicmFjZXMnKTtcbiAgICAgIGJyYWNlcy5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBpcGVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICd8Jykge1xuICAgICAgaWYgKGV4dGdsb2JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXh0Z2xvYnNbZXh0Z2xvYnMubGVuZ3RoIC0gMV0uY29uZGl0aW9ucysrO1xuICAgICAgfVxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21tYXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJywnKSB7XG4gICAgICBsZXQgb3V0cHV0ID0gdmFsdWU7XG5cbiAgICAgIGNvbnN0IGJyYWNlID0gYnJhY2VzW2JyYWNlcy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChicmFjZSAmJiBzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gJ2JyYWNlcycpIHtcbiAgICAgICAgYnJhY2UuY29tbWEgPSB0cnVlO1xuICAgICAgICBvdXRwdXQgPSAnfCc7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnY29tbWEnLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2xhc2hlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnLycpIHtcbiAgICAgIC8vIGlmIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdsb2IgaXMgXCIuL1wiLCBhZHZhbmNlIHRoZSBzdGFydFxuICAgICAgLy8gdG8gdGhlIGN1cnJlbnQgaW5kZXgsIGFuZCBkb24ndCBhZGQgdGhlIFwiLi9cIiBjaGFyYWN0ZXJzXG4gICAgICAvLyB0byB0aGUgc3RhdGUuIFRoaXMgZ3JlYXRseSBzaW1wbGlmaWVzIGxvb2tiZWhpbmRzIHdoZW5cbiAgICAgIC8vIGNoZWNraW5nIGZvciBCT1MgY2hhcmFjdGVycyBsaWtlIFwiIVwiIGFuZCBcIi5cIiAobm90IFwiLi9cIilcbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdkb3QnICYmIHN0YXRlLmluZGV4ID09PSBzdGF0ZS5zdGFydCArIDEpIHtcbiAgICAgICAgc3RhdGUuc3RhcnQgPSBzdGF0ZS5pbmRleCArIDE7XG4gICAgICAgIHN0YXRlLmNvbnN1bWVkID0gJyc7XG4gICAgICAgIHN0YXRlLm91dHB1dCA9ICcnO1xuICAgICAgICB0b2tlbnMucG9wKCk7XG4gICAgICAgIHByZXYgPSBib3M7IC8vIHJlc2V0IFwicHJldlwiIHRvIHRoZSBmaXJzdCB0b2tlblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdzbGFzaCcsIHZhbHVlLCBvdXRwdXQ6IFNMQVNIX0xJVEVSQUwgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3RzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcuJykge1xuICAgICAgaWYgKHN0YXRlLmJyYWNlcyA+IDAgJiYgcHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgICBpZiAocHJldi52YWx1ZSA9PT0gJy4nKSBwcmV2Lm91dHB1dCA9IERPVF9MSVRFUkFMO1xuICAgICAgICBjb25zdCBicmFjZSA9IGJyYWNlc1ticmFjZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHByZXYudHlwZSA9ICdkb3RzJztcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gdmFsdWU7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIGJyYWNlLmRvdHMgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKChzdGF0ZS5icmFjZXMgKyBzdGF0ZS5wYXJlbnMpID09PSAwICYmIHByZXYudHlwZSAhPT0gJ2JvcycgJiYgcHJldi50eXBlICE9PSAnc2xhc2gnKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IERPVF9MSVRFUkFMIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdkb3QnLCB2YWx1ZSwgb3V0cHV0OiBET1RfTElURVJBTCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXN0aW9uIG1hcmtzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICc/Jykge1xuICAgICAgY29uc3QgaXNHcm91cCA9IHByZXYgJiYgcHJldi52YWx1ZSA9PT0gJygnO1xuICAgICAgaWYgKCFpc0dyb3VwICYmIG9wdHMubm9leHRnbG9iICE9PSB0cnVlICYmIHBlZWsoKSA9PT0gJygnICYmIHBlZWsoMikgIT09ICc/Jykge1xuICAgICAgICBleHRnbG9iT3BlbigncW1hcmsnLCB2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldiAmJiBwcmV2LnR5cGUgPT09ICdwYXJlbicpIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHBlZWsoKTtcbiAgICAgICAgbGV0IG91dHB1dCA9IHZhbHVlO1xuXG4gICAgICAgIGlmIChuZXh0ID09PSAnPCcgJiYgIXV0aWxzJGkuc3VwcG9ydHNMb29rYmVoaW5kcygpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb2RlLmpzIHYxMCBvciBoaWdoZXIgaXMgcmVxdWlyZWQgZm9yIHJlZ2V4IGxvb2tiZWhpbmRzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHByZXYudmFsdWUgPT09ICcoJyAmJiAhL1shPTw6XS8udGVzdChuZXh0KSkgfHwgKG5leHQgPT09ICc8JyAmJiAhLzwoWyE9XXxcXHcrPikvLnRlc3QocmVtYWluaW5nKCkpKSkge1xuICAgICAgICAgIG91dHB1dCA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLmRvdCAhPT0gdHJ1ZSAmJiAocHJldi50eXBlID09PSAnc2xhc2gnIHx8IHByZXYudHlwZSA9PT0gJ2JvcycpKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAncW1hcmsnLCB2YWx1ZSwgb3V0cHV0OiBRTUFSS19OT19ET1QgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3FtYXJrJywgdmFsdWUsIG91dHB1dDogUU1BUksgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGNsYW1hdGlvblxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnIScpIHtcbiAgICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJykge1xuICAgICAgICBpZiAocGVlaygyKSAhPT0gJz8nIHx8ICEvWyE9PDpdLy50ZXN0KHBlZWsoMykpKSB7XG4gICAgICAgICAgZXh0Z2xvYk9wZW4oJ25lZ2F0ZScsIHZhbHVlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5ub25lZ2F0ZSAhPT0gdHJ1ZSAmJiBzdGF0ZS5pbmRleCA9PT0gMCkge1xuICAgICAgICBuZWdhdGUoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGx1c1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnKycpIHtcbiAgICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJyAmJiBwZWVrKDIpICE9PSAnPycpIHtcbiAgICAgICAgZXh0Z2xvYk9wZW4oJ3BsdXMnLCB2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHByZXYgJiYgcHJldi52YWx1ZSA9PT0gJygnKSB8fCBvcHRzLnJlZ2V4ID09PSBmYWxzZSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3BsdXMnLCB2YWx1ZSwgb3V0cHV0OiBQTFVTX0xJVEVSQUwgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHByZXYgJiYgKHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnIHx8IHByZXYudHlwZSA9PT0gJ3BhcmVuJyB8fCBwcmV2LnR5cGUgPT09ICdicmFjZScpKSB8fCBzdGF0ZS5wYXJlbnMgPiAwKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAncGx1cycsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdwbHVzJywgdmFsdWU6IFBMVVNfTElURVJBTCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWluIHRleHRcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ0AnKSB7XG4gICAgICBpZiAob3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgcGVlaygpID09PSAnKCcgJiYgcGVlaygyKSAhPT0gJz8nKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAnYXQnLCBleHRnbG9iOiB0cnVlLCB2YWx1ZSwgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dFxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlICE9PSAnKicpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJyQnIHx8IHZhbHVlID09PSAnXicpIHtcbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF0Y2ggPSBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUy5leGVjKHJlbWFpbmluZygpKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICB2YWx1ZSArPSBtYXRjaFswXTtcbiAgICAgICAgc3RhdGUuaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJzXG4gICAgICovXG5cbiAgICBpZiAocHJldiAmJiAocHJldi50eXBlID09PSAnZ2xvYnN0YXInIHx8IHByZXYuc3RhciA9PT0gdHJ1ZSkpIHtcbiAgICAgIHByZXYudHlwZSA9ICdzdGFyJztcbiAgICAgIHByZXYuc3RhciA9IHRydWU7XG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgcHJldi5vdXRwdXQgPSBzdGFyO1xuICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc3QgPSByZW1haW5pbmcoKTtcbiAgICBpZiAob3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgL15cXChbXj9dLy50ZXN0KHJlc3QpKSB7XG4gICAgICBleHRnbG9iT3Blbignc3RhcicsIHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcmV2LnR5cGUgPT09ICdzdGFyJykge1xuICAgICAgaWYgKG9wdHMubm9nbG9ic3RhciA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByaW9yID0gcHJldi5wcmV2O1xuICAgICAgY29uc3QgYmVmb3JlID0gcHJpb3IucHJldjtcbiAgICAgIGNvbnN0IGlzU3RhcnQgPSBwcmlvci50eXBlID09PSAnc2xhc2gnIHx8IHByaW9yLnR5cGUgPT09ICdib3MnO1xuICAgICAgY29uc3QgYWZ0ZXJTdGFyID0gYmVmb3JlICYmIChiZWZvcmUudHlwZSA9PT0gJ3N0YXInIHx8IGJlZm9yZS50eXBlID09PSAnZ2xvYnN0YXInKTtcblxuICAgICAgaWYgKG9wdHMuYmFzaCA9PT0gdHJ1ZSAmJiAoIWlzU3RhcnQgfHwgKHJlc3RbMF0gJiYgcmVzdFswXSAhPT0gJy8nKSkpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdzdGFyJywgdmFsdWUsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0JyYWNlID0gc3RhdGUuYnJhY2VzID4gMCAmJiAocHJpb3IudHlwZSA9PT0gJ2NvbW1hJyB8fCBwcmlvci50eXBlID09PSAnYnJhY2UnKTtcbiAgICAgIGNvbnN0IGlzRXh0Z2xvYiA9IGV4dGdsb2JzLmxlbmd0aCAmJiAocHJpb3IudHlwZSA9PT0gJ3BpcGUnIHx8IHByaW9yLnR5cGUgPT09ICdwYXJlbicpO1xuICAgICAgaWYgKCFpc1N0YXJ0ICYmIHByaW9yLnR5cGUgIT09ICdwYXJlbicgJiYgIWlzQnJhY2UgJiYgIWlzRXh0Z2xvYikge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3N0YXInLCB2YWx1ZSwgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHN0cmlwIGNvbnNlY3V0aXZlIGAvKiovYFxuICAgICAgd2hpbGUgKHJlc3Quc2xpY2UoMCwgMykgPT09ICcvKionKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gaW5wdXRbc3RhdGUuaW5kZXggKyA0XTtcbiAgICAgICAgaWYgKGFmdGVyICYmIGFmdGVyICE9PSAnLycpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXN0ID0gcmVzdC5zbGljZSgzKTtcbiAgICAgICAgY29uc3VtZSgnLyoqJywgMyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnYm9zJyAmJiBlb3MoKSkge1xuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGdsb2JzdGFyKG9wdHMpO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBwcmV2Lm91dHB1dDtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnc2xhc2gnICYmIHByaW9yLnByZXYudHlwZSAhPT0gJ2JvcycgJiYgIWFmdGVyU3RhciAmJiBlb3MoKSkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLShwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dCkubGVuZ3RoKTtcbiAgICAgICAgcHJpb3Iub3V0cHV0ID0gYCg/OiR7cHJpb3Iub3V0cHV0fWA7XG5cbiAgICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgICAgcHJldi5vdXRwdXQgPSBnbG9ic3RhcihvcHRzKSArIChvcHRzLnN0cmljdFNsYXNoZXMgPyAnKScgOiAnfCQpJyk7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0O1xuICAgICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnc2xhc2gnICYmIHByaW9yLnByZXYudHlwZSAhPT0gJ2JvcycgJiYgcmVzdFswXSA9PT0gJy8nKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlc3RbMV0gIT09IHZvaWQgMCA/ICd8JCcgOiAnJztcblxuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLShwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dCkubGVuZ3RoKTtcbiAgICAgICAgcHJpb3Iub3V0cHV0ID0gYCg/OiR7cHJpb3Iub3V0cHV0fWA7XG5cbiAgICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgICAgcHJldi5vdXRwdXQgPSBgJHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9fCR7U0xBU0hfTElURVJBTH0ke2VuZH0pYDtcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcblxuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJpb3Iub3V0cHV0ICsgcHJldi5vdXRwdXQ7XG4gICAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcblxuICAgICAgICBjb25zdW1lKHZhbHVlICsgYWR2YW5jZSgpKTtcblxuICAgICAgICBwdXNoKHsgdHlwZTogJ3NsYXNoJywgdmFsdWU6ICcvJywgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnYm9zJyAmJiByZXN0WzBdID09PSAnLycpIHtcbiAgICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgcHJldi5vdXRwdXQgPSBgKD86Xnwke1NMQVNIX0xJVEVSQUx9fCR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSlgO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBwcmV2Lm91dHB1dDtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgICBjb25zdW1lKHZhbHVlICsgYWR2YW5jZSgpKTtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdzbGFzaCcsIHZhbHVlOiAnLycsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyByZW1vdmUgc2luZ2xlIHN0YXIgZnJvbSBvdXRwdXRcbiAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtcHJldi5vdXRwdXQubGVuZ3RoKTtcblxuICAgICAgLy8gcmVzZXQgcHJldmlvdXMgdG9rZW4gdG8gZ2xvYnN0YXJcbiAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICBwcmV2Lm91dHB1dCA9IGdsb2JzdGFyKG9wdHMpO1xuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcblxuICAgICAgLy8gcmVzZXQgb3V0cHV0IHdpdGggZ2xvYnN0YXJcbiAgICAgIHN0YXRlLm91dHB1dCArPSBwcmV2Lm91dHB1dDtcbiAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW4gPSB7IHR5cGU6ICdzdGFyJywgdmFsdWUsIG91dHB1dDogc3RhciB9O1xuXG4gICAgaWYgKG9wdHMuYmFzaCA9PT0gdHJ1ZSkge1xuICAgICAgdG9rZW4ub3V0cHV0ID0gJy4qPyc7XG4gICAgICBpZiAocHJldi50eXBlID09PSAnYm9zJyB8fCBwcmV2LnR5cGUgPT09ICdzbGFzaCcpIHtcbiAgICAgICAgdG9rZW4ub3V0cHV0ID0gbm9kb3QgKyB0b2tlbi5vdXRwdXQ7XG4gICAgICB9XG4gICAgICBwdXNoKHRva2VuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcmV2ICYmIChwcmV2LnR5cGUgPT09ICdicmFja2V0JyB8fCBwcmV2LnR5cGUgPT09ICdwYXJlbicpICYmIG9wdHMucmVnZXggPT09IHRydWUpIHtcbiAgICAgIHRva2VuLm91dHB1dCA9IHZhbHVlO1xuICAgICAgcHVzaCh0b2tlbik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuaW5kZXggPT09IHN0YXRlLnN0YXJ0IHx8IHByZXYudHlwZSA9PT0gJ3NsYXNoJyB8fCBwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICBpZiAocHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gTk9fRE9UX1NMQVNIO1xuICAgICAgICBwcmV2Lm91dHB1dCArPSBOT19ET1RfU0xBU0g7XG5cbiAgICAgIH0gZWxzZSBpZiAob3B0cy5kb3QgPT09IHRydWUpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IE5PX0RPVFNfU0xBU0g7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IE5PX0RPVFNfU0xBU0g7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBub2RvdDtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gbm9kb3Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChwZWVrKCkgIT09ICcqJykge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gT05FX0NIQVI7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IE9ORV9DSEFSO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1c2godG9rZW4pO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLmJyYWNrZXRzID4gMCkge1xuICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnXScpKTtcbiAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscyRpLmVzY2FwZUxhc3Qoc3RhdGUub3V0cHV0LCAnWycpO1xuICAgIGRlY3JlbWVudCgnYnJhY2tldHMnKTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5wYXJlbnMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICcpJykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzJGkuZXNjYXBlTGFzdChzdGF0ZS5vdXRwdXQsICcoJyk7XG4gICAgZGVjcmVtZW50KCdwYXJlbnMnKTtcbiAgfVxuXG4gIHdoaWxlIChzdGF0ZS5icmFjZXMgPiAwKSB7XG4gICAgaWYgKG9wdHMuc3RyaWN0QnJhY2tldHMgPT09IHRydWUpIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignY2xvc2luZycsICd9JykpO1xuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzJGkuZXNjYXBlTGFzdChzdGF0ZS5vdXRwdXQsICd7Jyk7XG4gICAgZGVjcmVtZW50KCdicmFjZXMnKTtcbiAgfVxuXG4gIGlmIChvcHRzLnN0cmljdFNsYXNoZXMgIT09IHRydWUgJiYgKHByZXYudHlwZSA9PT0gJ3N0YXInIHx8IHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnKSkge1xuICAgIHB1c2goeyB0eXBlOiAnbWF5YmVfc2xhc2gnLCB2YWx1ZTogJycsIG91dHB1dDogYCR7U0xBU0hfTElURVJBTH0/YCB9KTtcbiAgfVxuXG4gIC8vIHJlYnVpbGQgdGhlIG91dHB1dCBpZiB3ZSBoYWQgdG8gYmFja3RyYWNrIGF0IGFueSBwb2ludFxuICBpZiAoc3RhdGUuYmFja3RyYWNrID09PSB0cnVlKSB7XG4gICAgc3RhdGUub3V0cHV0ID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHN0YXRlLnRva2Vucykge1xuICAgICAgc3RhdGUub3V0cHV0ICs9IHRva2VuLm91dHB1dCAhPSBudWxsID8gdG9rZW4ub3V0cHV0IDogdG9rZW4udmFsdWU7XG5cbiAgICAgIGlmICh0b2tlbi5zdWZmaXgpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IHRva2VuLnN1ZmZpeDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIEZhc3QgcGF0aHMgZm9yIGNyZWF0aW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGNvbW1vbiBnbG9iIHBhdHRlcm5zLlxuICogVGhpcyBjYW4gc2lnbmlmaWNhbnRseSBzcGVlZCB1cCBwcm9jZXNzaW5nIGFuZCBoYXMgdmVyeSBsaXR0bGUgZG93bnNpZGVcbiAqIGltcGFjdCB3aGVuIG5vbmUgb2YgdGhlIGZhc3QgcGF0aHMgbWF0Y2guXG4gKi9cblxucGFyc2UkaC5mYXN0cGF0aHMgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgb3B0cyA9IHsgLi4ub3B0aW9ucyB9O1xuICBjb25zdCBtYXggPSB0eXBlb2Ygb3B0cy5tYXhMZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5taW4oTUFYX0xFTkdUSCQxLCBvcHRzLm1heExlbmd0aCkgOiBNQVhfTEVOR1RIJDE7XG4gIGNvbnN0IGxlbiA9IGlucHV0Lmxlbmd0aDtcbiAgaWYgKGxlbiA+IG1heCkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW5wdXQgbGVuZ3RoOiAke2xlbn0sIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIGxlbmd0aDogJHttYXh9YCk7XG4gIH1cblxuICBpbnB1dCA9IFJFUExBQ0VNRU5UU1tpbnB1dF0gfHwgaW5wdXQ7XG4gIGNvbnN0IHdpbjMyID0gdXRpbHMkaS5pc1dpbmRvd3Mob3B0aW9ucyk7XG5cbiAgLy8gY3JlYXRlIGNvbnN0YW50cyBiYXNlZCBvbiBwbGF0Zm9ybSwgZm9yIHdpbmRvd3Mgb3IgcG9zaXhcbiAgY29uc3Qge1xuICAgIERPVF9MSVRFUkFMLFxuICAgIFNMQVNIX0xJVEVSQUwsXG4gICAgT05FX0NIQVIsXG4gICAgRE9UU19TTEFTSCxcbiAgICBOT19ET1QsXG4gICAgTk9fRE9UUyxcbiAgICBOT19ET1RTX1NMQVNILFxuICAgIFNUQVIsXG4gICAgU1RBUlRfQU5DSE9SXG4gIH0gPSBjb25zdGFudHMkNS5nbG9iQ2hhcnMod2luMzIpO1xuXG4gIGNvbnN0IG5vZG90ID0gb3B0cy5kb3QgPyBOT19ET1RTIDogTk9fRE9UO1xuICBjb25zdCBzbGFzaERvdCA9IG9wdHMuZG90ID8gTk9fRE9UU19TTEFTSCA6IE5PX0RPVDtcbiAgY29uc3QgY2FwdHVyZSA9IG9wdHMuY2FwdHVyZSA/ICcnIDogJz86JztcbiAgY29uc3Qgc3RhdGUgPSB7IG5lZ2F0ZWQ6IGZhbHNlLCBwcmVmaXg6ICcnIH07XG4gIGxldCBzdGFyID0gb3B0cy5iYXNoID09PSB0cnVlID8gJy4qPycgOiBTVEFSO1xuXG4gIGlmIChvcHRzLmNhcHR1cmUpIHtcbiAgICBzdGFyID0gYCgke3N0YXJ9KWA7XG4gIH1cblxuICBjb25zdCBnbG9ic3RhciA9IG9wdHMgPT4ge1xuICAgIGlmIChvcHRzLm5vZ2xvYnN0YXIgPT09IHRydWUpIHJldHVybiBzdGFyO1xuICAgIHJldHVybiBgKCR7Y2FwdHVyZX0oPzooPyEke1NUQVJUX0FOQ0hPUn0ke29wdHMuZG90ID8gRE9UU19TTEFTSCA6IERPVF9MSVRFUkFMfSkuKSo/KWA7XG4gIH07XG5cbiAgY29uc3QgY3JlYXRlID0gc3RyID0+IHtcbiAgICBzd2l0Y2ggKHN0cikge1xuICAgICAgY2FzZSAnKic6XG4gICAgICAgIHJldHVybiBgJHtub2RvdH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcuKic6XG4gICAgICAgIHJldHVybiBgJHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqLionOlxuICAgICAgICByZXR1cm4gYCR7bm9kb3R9JHtzdGFyfSR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKi8qJzpcbiAgICAgICAgcmV0dXJuIGAke25vZG90fSR7c3Rhcn0ke1NMQVNIX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3NsYXNoRG90fSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqKic6XG4gICAgICAgIHJldHVybiBub2RvdCArIGdsb2JzdGFyKG9wdHMpO1xuXG4gICAgICBjYXNlICcqKi8qJzpcbiAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtzbGFzaERvdH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqKi8qLionOlxuICAgICAgICByZXR1cm4gYCg/OiR7bm9kb3R9JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KT8ke3NsYXNoRG90fSR7c3Rhcn0ke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyoqLy4qJzpcbiAgICAgICAgcmV0dXJuIGAoPzoke25vZG90fSR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSk/JHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gL14oLio/KVxcLihcXHcrKSQvLmV4ZWMoc3RyKTtcbiAgICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGNyZWF0ZShtYXRjaFsxXSk7XG4gICAgICAgIGlmICghc291cmNlKSByZXR1cm47XG5cbiAgICAgICAgcmV0dXJuIHNvdXJjZSArIERPVF9MSVRFUkFMICsgbWF0Y2hbMl07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG91dHB1dCA9IHV0aWxzJGkucmVtb3ZlUHJlZml4KGlucHV0LCBzdGF0ZSk7XG4gIGxldCBzb3VyY2UgPSBjcmVhdGUob3V0cHV0KTtcblxuICBpZiAoc291cmNlICYmIG9wdHMuc3RyaWN0U2xhc2hlcyAhPT0gdHJ1ZSkge1xuICAgIHNvdXJjZSArPSBgJHtTTEFTSF9MSVRFUkFMfT9gO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZTtcbn07XG5cbnZhciBwYXJzZV8xJDMgPSBwYXJzZSRoO1xuXG5jb25zdCBwYXRoJG0gPSByZXF1aXJlJCQwJDQ7XG5jb25zdCBzY2FuJDEgPSBzY2FuXzE7XG5jb25zdCBwYXJzZSRnID0gcGFyc2VfMSQzO1xuY29uc3QgdXRpbHMkaCA9IHV0aWxzJGs7XG5jb25zdCBjb25zdGFudHMkNCA9IGNvbnN0YW50cyQ2O1xuY29uc3QgaXNPYmplY3QkNCA9IHZhbCA9PiB2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0Y2hlciBmdW5jdGlvbiBmcm9tIG9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMuIFRoZVxuICogcmV0dXJuZWQgZnVuY3Rpb24gdGFrZXMgYSBzdHJpbmcgdG8gbWF0Y2ggYXMgaXRzIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgbWF0Y2guIFRoZSByZXR1cm5lZCBtYXRjaGVyXG4gKiBmdW5jdGlvbiBhbHNvIHRha2VzIGEgYm9vbGVhbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRoYXQsIHdoZW4gdHJ1ZSxcbiAqIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2goZ2xvYlssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCBpc01hdGNoID0gcGljb21hdGNoKCcqLiEoKmEpJyk7XG4gKiBjb25zb2xlLmxvZyhpc01hdGNoKCdhLmEnKSk7IC8vPT4gZmFsc2VcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYicpKTsgLy89PiB0cnVlXG4gKiBgYGBcbiAqIEBuYW1lIHBpY29tYXRjaFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBnbG9ic2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtGdW5jdGlvbj19IFJldHVybnMgYSBtYXRjaGVyIGZ1bmN0aW9uLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5jb25zdCBwaWNvbWF0Y2gkNCA9IChnbG9iLCBvcHRpb25zLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGdsb2IpKSB7XG4gICAgY29uc3QgZm5zID0gZ2xvYi5tYXAoaW5wdXQgPT4gcGljb21hdGNoJDQoaW5wdXQsIG9wdGlvbnMsIHJldHVyblN0YXRlKSk7XG4gICAgY29uc3QgYXJyYXlNYXRjaGVyID0gc3RyID0+IHtcbiAgICAgIGZvciAoY29uc3QgaXNNYXRjaCBvZiBmbnMpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBpc01hdGNoKHN0cik7XG4gICAgICAgIGlmIChzdGF0ZSkgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgcmV0dXJuIGFycmF5TWF0Y2hlcjtcbiAgfVxuXG4gIGNvbnN0IGlzU3RhdGUgPSBpc09iamVjdCQ0KGdsb2IpICYmIGdsb2IudG9rZW5zICYmIGdsb2IuaW5wdXQ7XG5cbiAgaWYgKGdsb2IgPT09ICcnIHx8ICh0eXBlb2YgZ2xvYiAhPT0gJ3N0cmluZycgJiYgIWlzU3RhdGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgcGF0dGVybiB0byBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuXG4gIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBwb3NpeCA9IHV0aWxzJGguaXNXaW5kb3dzKG9wdGlvbnMpO1xuICBjb25zdCByZWdleCA9IGlzU3RhdGVcbiAgICA/IHBpY29tYXRjaCQ0LmNvbXBpbGVSZShnbG9iLCBvcHRpb25zKVxuICAgIDogcGljb21hdGNoJDQubWFrZVJlKGdsb2IsIG9wdGlvbnMsIGZhbHNlLCB0cnVlKTtcblxuICBjb25zdCBzdGF0ZSA9IHJlZ2V4LnN0YXRlO1xuICBkZWxldGUgcmVnZXguc3RhdGU7XG5cbiAgbGV0IGlzSWdub3JlZCA9ICgpID0+IGZhbHNlO1xuICBpZiAob3B0cy5pZ25vcmUpIHtcbiAgICBjb25zdCBpZ25vcmVPcHRzID0geyAuLi5vcHRpb25zLCBpZ25vcmU6IG51bGwsIG9uTWF0Y2g6IG51bGwsIG9uUmVzdWx0OiBudWxsIH07XG4gICAgaXNJZ25vcmVkID0gcGljb21hdGNoJDQob3B0cy5pZ25vcmUsIGlnbm9yZU9wdHMsIHJldHVyblN0YXRlKTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoZXIgPSAoaW5wdXQsIHJldHVybk9iamVjdCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgeyBpc01hdGNoLCBtYXRjaCwgb3V0cHV0IH0gPSBwaWNvbWF0Y2gkNC50ZXN0KGlucHV0LCByZWdleCwgb3B0aW9ucywgeyBnbG9iLCBwb3NpeCB9KTtcbiAgICBjb25zdCByZXN1bHQgPSB7IGdsb2IsIHN0YXRlLCByZWdleCwgcG9zaXgsIGlucHV0LCBvdXRwdXQsIG1hdGNoLCBpc01hdGNoIH07XG5cbiAgICBpZiAodHlwZW9mIG9wdHMub25SZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdHMub25SZXN1bHQocmVzdWx0KTtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXRjaCA9PT0gZmFsc2UpIHtcbiAgICAgIHJlc3VsdC5pc01hdGNoID0gZmFsc2U7XG4gICAgICByZXR1cm4gcmV0dXJuT2JqZWN0ID8gcmVzdWx0IDogZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGlzSWdub3JlZChpbnB1dCkpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5vbklnbm9yZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvcHRzLm9uSWdub3JlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXN1bHQuaXNNYXRjaCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5vbk1hdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRzLm9uTWF0Y2gocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJldHVybk9iamVjdCA/IHJlc3VsdCA6IHRydWU7XG4gIH07XG5cbiAgaWYgKHJldHVyblN0YXRlKSB7XG4gICAgbWF0Y2hlci5zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgcmV0dXJuIG1hdGNoZXI7XG59O1xuXG4vKipcbiAqIFRlc3QgYGlucHV0YCB3aXRoIHRoZSBnaXZlbiBgcmVnZXhgLiBUaGlzIGlzIHVzZWQgYnkgdGhlIG1haW5cbiAqIGBwaWNvbWF0Y2goKWAgZnVuY3Rpb24gdG8gdGVzdCB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC50ZXN0KGlucHV0LCByZWdleFssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gudGVzdCgnZm9vL2JhcicsIC9eKD86KFteL10qPylcXC8oW14vXSo/KSkkLykpO1xuICogLy8geyBpc01hdGNoOiB0cnVlLCBtYXRjaDogWyAnZm9vLycsICdmb28nLCAnYmFyJyBdLCBvdXRwdXQ6ICdmb28vYmFyJyB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIFN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtSZWdFeHB9IGByZWdleGBcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtYXRjaGluZyBpbmZvLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gkNC50ZXN0ID0gKGlucHV0LCByZWdleCwgb3B0aW9ucywgeyBnbG9iLCBwb3NpeCB9ID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBpbnB1dCB0byBiZSBhIHN0cmluZycpO1xuICB9XG5cbiAgaWYgKGlucHV0ID09PSAnJykge1xuICAgIHJldHVybiB7IGlzTWF0Y2g6IGZhbHNlLCBvdXRwdXQ6ICcnIH07XG4gIH1cblxuICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3QgZm9ybWF0ID0gb3B0cy5mb3JtYXQgfHwgKHBvc2l4ID8gdXRpbHMkaC50b1Bvc2l4U2xhc2hlcyA6IG51bGwpO1xuICBsZXQgbWF0Y2ggPSBpbnB1dCA9PT0gZ2xvYjtcbiAgbGV0IG91dHB1dCA9IChtYXRjaCAmJiBmb3JtYXQpID8gZm9ybWF0KGlucHV0KSA6IGlucHV0O1xuXG4gIGlmIChtYXRjaCA9PT0gZmFsc2UpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXQgPyBmb3JtYXQoaW5wdXQpIDogaW5wdXQ7XG4gICAgbWF0Y2ggPSBvdXRwdXQgPT09IGdsb2I7XG4gIH1cblxuICBpZiAobWF0Y2ggPT09IGZhbHNlIHx8IG9wdHMuY2FwdHVyZSA9PT0gdHJ1ZSkge1xuICAgIGlmIChvcHRzLm1hdGNoQmFzZSA9PT0gdHJ1ZSB8fCBvcHRzLmJhc2VuYW1lID09PSB0cnVlKSB7XG4gICAgICBtYXRjaCA9IHBpY29tYXRjaCQ0Lm1hdGNoQmFzZShpbnB1dCwgcmVnZXgsIG9wdGlvbnMsIHBvc2l4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWF0Y2ggPSByZWdleC5leGVjKG91dHB1dCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgaXNNYXRjaDogQm9vbGVhbihtYXRjaCksIG1hdGNoLCBvdXRwdXQgfTtcbn07XG5cbi8qKlxuICogTWF0Y2ggdGhlIGJhc2VuYW1lIG9mIGEgZmlsZXBhdGguXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLm1hdGNoQmFzZShpbnB1dCwgZ2xvYlssIG9wdGlvbnNdKTtcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5tYXRjaEJhc2UoJ2Zvby9iYXIuanMnLCAnKi5qcycpOyAvLyB0cnVlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIFN0cmluZyB0byB0ZXN0LlxuICogQHBhcmFtIHtSZWdFeHB8U3RyaW5nfSBgZ2xvYmAgR2xvYiBwYXR0ZXJuIG9yIHJlZ2V4IGNyZWF0ZWQgYnkgWy5tYWtlUmVdKCNtYWtlUmUpLlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoJDQubWF0Y2hCYXNlID0gKGlucHV0LCBnbG9iLCBvcHRpb25zLCBwb3NpeCA9IHV0aWxzJGguaXNXaW5kb3dzKG9wdGlvbnMpKSA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gZ2xvYiBpbnN0YW5jZW9mIFJlZ0V4cCA/IGdsb2IgOiBwaWNvbWF0Y2gkNC5tYWtlUmUoZ2xvYiwgb3B0aW9ucyk7XG4gIHJldHVybiByZWdleC50ZXN0KHBhdGgkbS5iYXNlbmFtZShpbnB1dCkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgKiphbnkqKiBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgIG1hdGNoIHRoZSBzcGVjaWZpZWQgYHN0cmluZ2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLmlzTWF0Y2goc3RyaW5nLCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2guaXNNYXRjaCgnYS5hJywgWydiLionLCAnKi5hJ10pKTsgLy89PiB0cnVlXG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2guaXNNYXRjaCgnYS5hJywgJ2IuKicpKTsgLy89PiBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gc3RyIFRoZSBzdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBwYXR0ZXJucyBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgcGF0dGVybnMgbWF0Y2ggYHN0cmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoJDQuaXNNYXRjaCA9IChzdHIsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiBwaWNvbWF0Y2gkNChwYXR0ZXJucywgb3B0aW9ucykoc3RyKTtcblxuLyoqXG4gKiBQYXJzZSBhIGdsb2IgcGF0dGVybiB0byBjcmVhdGUgdGhlIHNvdXJjZSBzdHJpbmcgZm9yIGEgcmVndWxhclxuICogZXhwcmVzc2lvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiBjb25zdCByZXN1bHQgPSBwaWNvbWF0Y2gucGFyc2UocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHVzZWZ1bCBwcm9wZXJ0aWVzIGFuZCBvdXRwdXQgdG8gYmUgdXNlZCBhcyBhIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaCQ0LnBhcnNlID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0dGVybikpIHJldHVybiBwYXR0ZXJuLm1hcChwID0+IHBpY29tYXRjaCQ0LnBhcnNlKHAsIG9wdGlvbnMpKTtcbiAgcmV0dXJuIHBhcnNlJGcocGF0dGVybiwgeyAuLi5vcHRpb25zLCBmYXN0cGF0aHM6IGZhbHNlIH0pO1xufTtcblxuLyoqXG4gKiBTY2FuIGEgZ2xvYiBwYXR0ZXJuIHRvIHNlcGFyYXRlIHRoZSBwYXR0ZXJuIGludG8gc2VnbWVudHMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLnNjYW4oaW5wdXRbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3QgcmVzdWx0ID0gcGljb21hdGNoLnNjYW4oJyEuL2Zvby8qLmpzJyk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICogeyBwcmVmaXg6ICchLi8nLFxuICogICBpbnB1dDogJyEuL2Zvby8qLmpzJyxcbiAqICAgc3RhcnQ6IDMsXG4gKiAgIGJhc2U6ICdmb28nLFxuICogICBnbG9iOiAnKi5qcycsXG4gKiAgIGlzQnJhY2U6IGZhbHNlLFxuICogICBpc0JyYWNrZXQ6IGZhbHNlLFxuICogICBpc0dsb2I6IHRydWUsXG4gKiAgIGlzRXh0Z2xvYjogZmFsc2UsXG4gKiAgIGlzR2xvYnN0YXI6IGZhbHNlLFxuICogICBuZWdhdGVkOiB0cnVlIH1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgR2xvYiBwYXR0ZXJuIHRvIHNjYW4uXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGhcbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoJDQuc2NhbiA9IChpbnB1dCwgb3B0aW9ucykgPT4gc2NhbiQxKGlucHV0LCBvcHRpb25zKTtcblxuLyoqXG4gKiBDb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIGBzdGF0ZWAgb2JqZWN0IHJldHVybmVkIGJ5IHRoZVxuICogW3BhcnNlKCldKCNwYXJzZSkgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBgc3RhdGVgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5PdXRwdXRgIEludGVuZGVkIGZvciBpbXBsZW1lbnRvcnMsIHRoaXMgYXJndW1lbnQgYWxsb3dzIHlvdSB0byByZXR1cm4gdGhlIHJhdyBvdXRwdXQgZnJvbSB0aGUgcGFyc2VyLlxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuU3RhdGVgIEFkZHMgdGhlIHN0YXRlIHRvIGEgYHN0YXRlYCBwcm9wZXJ0eSBvbiB0aGUgcmV0dXJuZWQgcmVnZXguIFVzZWZ1bCBmb3IgaW1wbGVtZW50b3JzIGFuZCBkZWJ1Z2dpbmcuXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaCQ0LmNvbXBpbGVSZSA9IChzdGF0ZSwgb3B0aW9ucywgcmV0dXJuT3V0cHV0ID0gZmFsc2UsIHJldHVyblN0YXRlID0gZmFsc2UpID0+IHtcbiAgaWYgKHJldHVybk91dHB1dCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBzdGF0ZS5vdXRwdXQ7XG4gIH1cblxuICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3QgcHJlcGVuZCA9IG9wdHMuY29udGFpbnMgPyAnJyA6ICdeJztcbiAgY29uc3QgYXBwZW5kID0gb3B0cy5jb250YWlucyA/ICcnIDogJyQnO1xuXG4gIGxldCBzb3VyY2UgPSBgJHtwcmVwZW5kfSg/OiR7c3RhdGUub3V0cHV0fSkke2FwcGVuZH1gO1xuICBpZiAoc3RhdGUgJiYgc3RhdGUubmVnYXRlZCA9PT0gdHJ1ZSkge1xuICAgIHNvdXJjZSA9IGBeKD8hJHtzb3VyY2V9KS4qJGA7XG4gIH1cblxuICBjb25zdCByZWdleCA9IHBpY29tYXRjaCQ0LnRvUmVnZXgoc291cmNlLCBvcHRpb25zKTtcbiAgaWYgKHJldHVyblN0YXRlID09PSB0cnVlKSB7XG4gICAgcmVnZXguc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIHJldHVybiByZWdleDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gYSBwYXJzZWQgZ2xvYiBwYXR0ZXJuLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIGNvbnN0IHN0YXRlID0gcGljb21hdGNoLnBhcnNlKCcqLmpzJyk7XG4gKiAvLyBwaWNvbWF0Y2guY29tcGlsZVJlKHN0YXRlWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5jb21waWxlUmUoc3RhdGUpKTtcbiAqIC8vPT4gL14oPzooPyFcXC4pKD89LilbXi9dKj9cXC5qcykkL1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0YXRlYCBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIGAucGFyc2VgIG1ldGhvZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYHJldHVybk91dHB1dGAgSW1wbGVtZW50b3JzIG1heSB1c2UgdGhpcyBhcmd1bWVudCB0byByZXR1cm4gdGhlIGNvbXBpbGVkIG91dHB1dCwgaW5zdGVhZCBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gVGhpcyBpcyBub3QgZXhwb3NlZCBvbiB0aGUgb3B0aW9ucyB0byBwcmV2ZW50IGVuZC11c2VycyBmcm9tIG11dGF0aW5nIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5TdGF0ZWAgSW1wbGVtZW50b3JzIG1heSB1c2UgdGhpcyBhcmd1bWVudCB0byByZXR1cm4gdGhlIHN0YXRlIGZyb20gdGhlIHBhcnNlZCBnbG9iIHdpdGggdGhlIHJldHVybmVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm4ge1JlZ0V4cH0gUmV0dXJucyBhIHJlZ2V4IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gcGF0dGVybi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoJDQubWFrZVJlID0gKGlucHV0LCBvcHRpb25zID0ge30sIHJldHVybk91dHB1dCA9IGZhbHNlLCByZXR1cm5TdGF0ZSA9IGZhbHNlKSA9PiB7XG4gIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgbGV0IHBhcnNlZCA9IHsgbmVnYXRlZDogZmFsc2UsIGZhc3RwYXRoczogdHJ1ZSB9O1xuXG4gIGlmIChvcHRpb25zLmZhc3RwYXRocyAhPT0gZmFsc2UgJiYgKGlucHV0WzBdID09PSAnLicgfHwgaW5wdXRbMF0gPT09ICcqJykpIHtcbiAgICBwYXJzZWQub3V0cHV0ID0gcGFyc2UkZy5mYXN0cGF0aHMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKCFwYXJzZWQub3V0cHV0KSB7XG4gICAgcGFyc2VkID0gcGFyc2UkZyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gcGljb21hdGNoJDQuY29tcGlsZVJlKHBhcnNlZCwgb3B0aW9ucywgcmV0dXJuT3V0cHV0LCByZXR1cm5TdGF0ZSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBnaXZlbiByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIC8vIHBpY29tYXRjaC50b1JlZ2V4KHNvdXJjZVssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCB7IG91dHB1dCB9ID0gcGljb21hdGNoLnBhcnNlKCcqLmpzJyk7XG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2gudG9SZWdleChvdXRwdXQpKTtcbiAqIC8vPT4gL14oPzooPyFcXC4pKD89LilbXi9dKj9cXC5qcykkL1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHNvdXJjZWAgUmVndWxhciBleHByZXNzaW9uIHNvdXJjZSBzdHJpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaCQ0LnRvUmVnZXggPSAoc291cmNlLCBvcHRpb25zKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoc291cmNlLCBvcHRzLmZsYWdzIHx8IChvcHRzLm5vY2FzZSA/ICdpJyA6ICcnKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVidWcgPT09IHRydWUpIHRocm93IGVycjtcbiAgICByZXR1cm4gLyReLztcbiAgfVxufTtcblxuLyoqXG4gKiBQaWNvbWF0Y2ggY29uc3RhbnRzLlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5cbnBpY29tYXRjaCQ0LmNvbnN0YW50cyA9IGNvbnN0YW50cyQ0O1xuXG4vKipcbiAqIEV4cG9zZSBcInBpY29tYXRjaFwiXG4gKi9cblxudmFyIHBpY29tYXRjaF8xID0gcGljb21hdGNoJDQ7XG5cbihmdW5jdGlvbiAobW9kdWxlKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBwaWNvbWF0Y2hfMTtcbn0gKHBpY29tYXRjaCQ1KSk7XG5cbnZhciBwaWNvbWF0Y2gkMyA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhwaWNvbWF0Y2hFeHBvcnRzKTtcblxuY29uc3QgZXh0cmFjdG9ycyA9IHtcbiAgICBBcnJheVBhdHRlcm4obmFtZXMsIHBhcmFtKSB7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBwYXJhbS5lbGVtZW50cykge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgZXh0cmFjdG9yc1tlbGVtZW50LnR5cGVdKG5hbWVzLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgQXNzaWdubWVudFBhdHRlcm4obmFtZXMsIHBhcmFtKSB7XG4gICAgICAgIGV4dHJhY3RvcnNbcGFyYW0ubGVmdC50eXBlXShuYW1lcywgcGFyYW0ubGVmdCk7XG4gICAgfSxcbiAgICBJZGVudGlmaWVyKG5hbWVzLCBwYXJhbSkge1xuICAgICAgICBuYW1lcy5wdXNoKHBhcmFtLm5hbWUpO1xuICAgIH0sXG4gICAgTWVtYmVyRXhwcmVzc2lvbigpIHsgfSxcbiAgICBPYmplY3RQYXR0ZXJuKG5hbWVzLCBwYXJhbSkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgcGFyYW0ucHJvcGVydGllcykge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBUeXBlc2NyaXB0IHJlcG9ydHMgdGhhdCB0aGlzIGlzIG5vdCBhIHZhbGlkIHR5cGVcbiAgICAgICAgICAgIGlmIChwcm9wLnR5cGUgPT09ICdSZXN0RWxlbWVudCcpIHtcbiAgICAgICAgICAgICAgICBleHRyYWN0b3JzLlJlc3RFbGVtZW50KG5hbWVzLCBwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4dHJhY3RvcnNbcHJvcC52YWx1ZS50eXBlXShuYW1lcywgcHJvcC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFJlc3RFbGVtZW50KG5hbWVzLCBwYXJhbSkge1xuICAgICAgICBleHRyYWN0b3JzW3BhcmFtLmFyZ3VtZW50LnR5cGVdKG5hbWVzLCBwYXJhbS5hcmd1bWVudCk7XG4gICAgfVxufTtcbmNvbnN0IGV4dHJhY3RBc3NpZ25lZE5hbWVzID0gZnVuY3Rpb24gZXh0cmFjdEFzc2lnbmVkTmFtZXMocGFyYW0pIHtcbiAgICBjb25zdCBuYW1lcyA9IFtdO1xuICAgIGV4dHJhY3RvcnNbcGFyYW0udHlwZV0obmFtZXMsIHBhcmFtKTtcbiAgICByZXR1cm4gbmFtZXM7XG59O1xuXG5jb25zdCBibG9ja0RlY2xhcmF0aW9ucyA9IHtcbiAgICBjb25zdDogdHJ1ZSxcbiAgICBsZXQ6IHRydWVcbn07XG5sZXQgU2NvcGUkMSA9IGNsYXNzIFNjb3BlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBvcHRpb25zLnBhcmVudDtcbiAgICAgICAgdGhpcy5pc0Jsb2NrU2NvcGUgPSAhIW9wdGlvbnMuYmxvY2s7XG4gICAgICAgIHRoaXMuZGVjbGFyYXRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1zKSB7XG4gICAgICAgICAgICBvcHRpb25zLnBhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgICAgIGV4dHJhY3RBc3NpZ25lZE5hbWVzKHBhcmFtKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVjbGFyYXRpb25zW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZERlY2xhcmF0aW9uKG5vZGUsIGlzQmxvY2tEZWNsYXJhdGlvbiwgaXNWYXIpIHtcbiAgICAgICAgaWYgKCFpc0Jsb2NrRGVjbGFyYXRpb24gJiYgdGhpcy5pc0Jsb2NrU2NvcGUpIHtcbiAgICAgICAgICAgIC8vIGl0J3MgYSBgdmFyYCBvciBmdW5jdGlvbiBub2RlLCBhbmQgdGhpc1xuICAgICAgICAgICAgLy8gaXMgYSBibG9jayBzY29wZSwgc28gd2UgbmVlZCB0byBnbyB1cFxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuYWRkRGVjbGFyYXRpb24obm9kZSwgaXNCbG9ja0RlY2xhcmF0aW9uLCBpc1Zhcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5pZCkge1xuICAgICAgICAgICAgZXh0cmFjdEFzc2lnbmVkTmFtZXMobm9kZS5pZCkuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjbGFyYXRpb25zW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnRhaW5zKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjbGFyYXRpb25zW25hbWVdIHx8ICh0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmNvbnRhaW5zKG5hbWUpIDogZmFsc2UpO1xuICAgIH1cbn07XG5jb25zdCBhdHRhY2hTY29wZXMgPSBmdW5jdGlvbiBhdHRhY2hTY29wZXMoYXN0LCBwcm9wZXJ0eU5hbWUgPSAnc2NvcGUnKSB7XG4gICAgbGV0IHNjb3BlID0gbmV3IFNjb3BlJDEoKTtcbiAgICB3YWxrJDMoYXN0LCB7XG4gICAgICAgIGVudGVyKG4sIHBhcmVudCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG47XG4gICAgICAgICAgICAvLyBmdW5jdGlvbiBmb28gKCkgey4uLn1cbiAgICAgICAgICAgIC8vIGNsYXNzIEZvbyB7Li4ufVxuICAgICAgICAgICAgaWYgKC8oRnVuY3Rpb258Q2xhc3MpRGVjbGFyYXRpb24vLnRlc3Qobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIHNjb3BlLmFkZERlY2xhcmF0aW9uKG5vZGUsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB2YXIgZm9vID0gMVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBraW5kIH0gPSBub2RlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQmxvY2tEZWNsYXJhdGlvbiA9IGJsb2NrRGVjbGFyYXRpb25zW2tpbmRdO1xuICAgICAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb25zLmZvckVhY2goKGRlY2xhcmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmFkZERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uLCBpc0Jsb2NrRGVjbGFyYXRpb24sIHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG5ld1Njb3BlO1xuICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBmdW5jdGlvbiBzY29wZVxuICAgICAgICAgICAgaWYgKC9GdW5jdGlvbi8udGVzdChub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnVuYyA9IG5vZGU7XG4gICAgICAgICAgICAgICAgbmV3U2NvcGUgPSBuZXcgU2NvcGUkMSh7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogc2NvcGUsXG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBmdW5jLnBhcmFtc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIG5hbWVkIGZ1bmN0aW9uIGV4cHJlc3Npb25zIC0gdGhlIG5hbWUgaXMgY29uc2lkZXJlZFxuICAgICAgICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIGZ1bmN0aW9uJ3Mgc2NvcGVcbiAgICAgICAgICAgICAgICBpZiAoZnVuYy50eXBlID09PSAnRnVuY3Rpb25FeHByZXNzaW9uJyAmJiBmdW5jLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1Njb3BlLmFkZERlY2xhcmF0aW9uKGZ1bmMsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBmb3Igc2NvcGVcbiAgICAgICAgICAgIGlmICgvRm9yKElufE9mKT9TdGF0ZW1lbnQvLnRlc3Qobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIG5ld1Njb3BlID0gbmV3IFNjb3BlJDEoe1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHNjb3BlLFxuICAgICAgICAgICAgICAgICAgICBibG9jazogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBibG9jayBzY29wZVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0Jsb2NrU3RhdGVtZW50JyAmJiAhL0Z1bmN0aW9uLy50ZXN0KHBhcmVudC50eXBlKSkge1xuICAgICAgICAgICAgICAgIG5ld1Njb3BlID0gbmV3IFNjb3BlJDEoe1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHNjb3BlLFxuICAgICAgICAgICAgICAgICAgICBibG9jazogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2F0Y2ggY2xhdXNlIGhhcyBpdHMgb3duIGJsb2NrIHNjb3BlXG4gICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnQ2F0Y2hDbGF1c2UnKSB7XG4gICAgICAgICAgICAgICAgbmV3U2NvcGUgPSBuZXcgU2NvcGUkMSh7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogc2NvcGUsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogbm9kZS5wYXJhbSA/IFtub2RlLnBhcmFtXSA6IFtdLFxuICAgICAgICAgICAgICAgICAgICBibG9jazogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5ld1Njb3BlKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHByb3BlcnR5TmFtZSwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3U2NvcGUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNjb3BlID0gbmV3U2NvcGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxlYXZlKG4pIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBuO1xuICAgICAgICAgICAgaWYgKG5vZGVbcHJvcGVydHlOYW1lXSlcbiAgICAgICAgICAgICAgICBzY29wZSA9IHNjb3BlLnBhcmVudDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzY29wZTtcbn07XG5cbi8vIEhlbHBlciBzaW5jZSBUeXBlc2NyaXB0IGNhbid0IGRldGVjdCByZWFkb25seSBhcnJheXMgd2l0aCBBcnJheS5pc0FycmF5XG5mdW5jdGlvbiBpc0FycmF5JDIoYXJnKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUFycmF5KHRoaW5nKSB7XG4gICAgaWYgKGlzQXJyYXkkMih0aGluZykpXG4gICAgICAgIHJldHVybiB0aGluZztcbiAgICBpZiAodGhpbmcgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbdGhpbmddO1xufVxuXG5jb25zdCBub3JtYWxpemVQYXRoJDUgPSBmdW5jdGlvbiBub3JtYWxpemVQYXRoKGZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIGZpbGVuYW1lLnNwbGl0KHdpbjMyLnNlcCkuam9pbihwb3NpeC5zZXApO1xufTtcblxuZnVuY3Rpb24gZ2V0TWF0Y2hlclN0cmluZyhpZCwgcmVzb2x1dGlvbkJhc2UpIHtcbiAgICBpZiAocmVzb2x1dGlvbkJhc2UgPT09IGZhbHNlIHx8IGlzQWJzb2x1dGUkMShpZCkgfHwgaWQuc3RhcnRzV2l0aCgnKicpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVQYXRoJDUoaWQpO1xuICAgIH1cbiAgICAvLyByZXNvbHZlKCcnKSBpcyB2YWxpZCBhbmQgd2lsbCBkZWZhdWx0IHRvIHByb2Nlc3MuY3dkKClcbiAgICBjb25zdCBiYXNlUGF0aCA9IG5vcm1hbGl6ZVBhdGgkNShyZXNvbHZlJDMocmVzb2x1dGlvbkJhc2UgfHwgJycpKVxuICAgICAgICAvLyBlc2NhcGUgYWxsIHBvc3NpYmxlIChwb3NpeCArIHdpbikgcGF0aCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgaW50ZXJmZXJlIHdpdGggcmVnZXhcbiAgICAgICAgLnJlcGxhY2UoL1stXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG4gICAgLy8gTm90ZSB0aGF0IHdlIHVzZSBwb3NpeC5qb2luIGJlY2F1c2U6XG4gICAgLy8gMS4gdGhlIGJhc2VQYXRoIGhhcyBiZWVuIG5vcm1hbGl6ZWQgdG8gdXNlIC9cbiAgICAvLyAyLiB0aGUgaW5jb21pbmcgZ2xvYiAoaWQpIG1hdGNoZXIsIGFsc28gdXNlcyAvXG4gICAgLy8gb3RoZXJ3aXNlIE5vZGUgd2lsbCBmb3JjZSBiYWNrc2xhc2ggKFxcKSBvbiB3aW5kb3dzXG4gICAgcmV0dXJuIHBvc2l4LmpvaW4oYmFzZVBhdGgsIG5vcm1hbGl6ZVBhdGgkNShpZCkpO1xufVxuY29uc3QgY3JlYXRlRmlsdGVyJDEgPSBmdW5jdGlvbiBjcmVhdGVGaWx0ZXIoaW5jbHVkZSwgZXhjbHVkZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHJlc29sdXRpb25CYXNlID0gb3B0aW9ucyAmJiBvcHRpb25zLnJlc29sdmU7XG4gICAgY29uc3QgZ2V0TWF0Y2hlciA9IChpZCkgPT4gaWQgaW5zdGFuY2VvZiBSZWdFeHBcbiAgICAgICAgPyBpZFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHRlc3Q6ICh3aGF0KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyByZWZhY3RvciBpcyBhIHRhZCBvdmVybHkgdmVyYm9zZSBidXQgbWFrZXMgZm9yIGVhc3kgZGVidWdnaW5nXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IGdldE1hdGNoZXJTdHJpbmcoaWQsIHJlc29sdXRpb25CYXNlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmbiA9IHBpY29tYXRjaCQzKHBhdHRlcm4sIHsgZG90OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZuKHdoYXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgY29uc3QgaW5jbHVkZU1hdGNoZXJzID0gZW5zdXJlQXJyYXkoaW5jbHVkZSkubWFwKGdldE1hdGNoZXIpO1xuICAgIGNvbnN0IGV4Y2x1ZGVNYXRjaGVycyA9IGVuc3VyZUFycmF5KGV4Y2x1ZGUpLm1hcChnZXRNYXRjaGVyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVzdWx0KGlkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoL1xcMC8udGVzdChpZCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHBhdGhJZCA9IG5vcm1hbGl6ZVBhdGgkNShpZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhjbHVkZU1hdGNoZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVyID0gZXhjbHVkZU1hdGNoZXJzW2ldO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXIudGVzdChwYXRoSWQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluY2x1ZGVNYXRjaGVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlciA9IGluY2x1ZGVNYXRjaGVyc1tpXTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVyLnRlc3QocGF0aElkKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWluY2x1ZGVNYXRjaGVycy5sZW5ndGg7XG4gICAgfTtcbn07XG5cbmNvbnN0IHJlc2VydmVkV29yZHMkMSA9ICdicmVhayBjYXNlIGNsYXNzIGNhdGNoIGNvbnN0IGNvbnRpbnVlIGRlYnVnZ2VyIGRlZmF1bHQgZGVsZXRlIGRvIGVsc2UgZXhwb3J0IGV4dGVuZHMgZmluYWxseSBmb3IgZnVuY3Rpb24gaWYgaW1wb3J0IGluIGluc3RhbmNlb2YgbGV0IG5ldyByZXR1cm4gc3VwZXIgc3dpdGNoIHRoaXMgdGhyb3cgdHJ5IHR5cGVvZiB2YXIgdm9pZCB3aGlsZSB3aXRoIHlpZWxkIGVudW0gYXdhaXQgaW1wbGVtZW50cyBwYWNrYWdlIHByb3RlY3RlZCBzdGF0aWMgaW50ZXJmYWNlIHByaXZhdGUgcHVibGljJztcbmNvbnN0IGJ1aWx0aW5zJDEgPSAnYXJndW1lbnRzIEluZmluaXR5IE5hTiB1bmRlZmluZWQgbnVsbCB0cnVlIGZhbHNlIGV2YWwgdW5ldmFsIGlzRmluaXRlIGlzTmFOIHBhcnNlRmxvYXQgcGFyc2VJbnQgZGVjb2RlVVJJIGRlY29kZVVSSUNvbXBvbmVudCBlbmNvZGVVUkkgZW5jb2RlVVJJQ29tcG9uZW50IGVzY2FwZSB1bmVzY2FwZSBPYmplY3QgRnVuY3Rpb24gQm9vbGVhbiBTeW1ib2wgRXJyb3IgRXZhbEVycm9yIEludGVybmFsRXJyb3IgUmFuZ2VFcnJvciBSZWZlcmVuY2VFcnJvciBTeW50YXhFcnJvciBUeXBlRXJyb3IgVVJJRXJyb3IgTnVtYmVyIE1hdGggRGF0ZSBTdHJpbmcgUmVnRXhwIEFycmF5IEludDhBcnJheSBVaW50OEFycmF5IFVpbnQ4Q2xhbXBlZEFycmF5IEludDE2QXJyYXkgVWludDE2QXJyYXkgSW50MzJBcnJheSBVaW50MzJBcnJheSBGbG9hdDMyQXJyYXkgRmxvYXQ2NEFycmF5IE1hcCBTZXQgV2Vha01hcCBXZWFrU2V0IFNJTUQgQXJyYXlCdWZmZXIgRGF0YVZpZXcgSlNPTiBQcm9taXNlIEdlbmVyYXRvciBHZW5lcmF0b3JGdW5jdGlvbiBSZWZsZWN0IFByb3h5IEludGwnO1xuY29uc3QgZm9yYmlkZGVuSWRlbnRpZmllcnMgPSBuZXcgU2V0KGAke3Jlc2VydmVkV29yZHMkMX0gJHtidWlsdGlucyQxfWAuc3BsaXQoJyAnKSk7XG5mb3JiaWRkZW5JZGVudGlmaWVycy5hZGQoJycpO1xuY29uc3QgbWFrZUxlZ2FsSWRlbnRpZmllciA9IGZ1bmN0aW9uIG1ha2VMZWdhbElkZW50aWZpZXIoc3RyKSB7XG4gICAgbGV0IGlkZW50aWZpZXIgPSBzdHJcbiAgICAgICAgLnJlcGxhY2UoLy0oXFx3KS9nLCAoXywgbGV0dGVyKSA9PiBsZXR0ZXIudG9VcHBlckNhc2UoKSlcbiAgICAgICAgLnJlcGxhY2UoL1teJF9hLXpBLVowLTldL2csICdfJyk7XG4gICAgaWYgKC9cXGQvLnRlc3QoaWRlbnRpZmllclswXSkgfHwgZm9yYmlkZGVuSWRlbnRpZmllcnMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgIGlkZW50aWZpZXIgPSBgXyR7aWRlbnRpZmllcn1gO1xuICAgIH1cbiAgICByZXR1cm4gaWRlbnRpZmllciB8fCAnXyc7XG59O1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkkOChvYmopIHtcbiAgICByZXR1cm4gKEpTT04uc3RyaW5naWZ5KG9iaikgfHwgJ3VuZGVmaW5lZCcpLnJlcGxhY2UoL1tcXHUyMDI4XFx1MjAyOV0vZywgKGNoYXIpID0+IGBcXFxcdSR7YDAwMCR7Y2hhci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC00KX1gKTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUFycmF5KGFyciwgaW5kZW50LCBiYXNlSW5kZW50KSB7XG4gICAgbGV0IG91dHB1dCA9ICdbJztcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBpbmRlbnQgPyBgXFxuJHtiYXNlSW5kZW50fSR7aW5kZW50fWAgOiAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBhcnJbaV07XG4gICAgICAgIG91dHB1dCArPSBgJHtpID4gMCA/ICcsJyA6ICcnfSR7c2VwYXJhdG9yfSR7c2VyaWFsaXplKGtleSwgaW5kZW50LCBiYXNlSW5kZW50ICsgaW5kZW50KX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7b3V0cHV0fSR7aW5kZW50ID8gYFxcbiR7YmFzZUluZGVudH1gIDogJyd9XWA7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVPYmplY3Qob2JqLCBpbmRlbnQsIGJhc2VJbmRlbnQpIHtcbiAgICBsZXQgb3V0cHV0ID0gJ3snO1xuICAgIGNvbnN0IHNlcGFyYXRvciA9IGluZGVudCA/IGBcXG4ke2Jhc2VJbmRlbnR9JHtpbmRlbnR9YCA6ICcnO1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhvYmopO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyaWVzW2ldO1xuICAgICAgICBjb25zdCBzdHJpbmdLZXkgPSBtYWtlTGVnYWxJZGVudGlmaWVyKGtleSkgPT09IGtleSA/IGtleSA6IHN0cmluZ2lmeSQ4KGtleSk7XG4gICAgICAgIG91dHB1dCArPSBgJHtpID4gMCA/ICcsJyA6ICcnfSR7c2VwYXJhdG9yfSR7c3RyaW5nS2V5fToke2luZGVudCA/ICcgJyA6ICcnfSR7c2VyaWFsaXplKHZhbHVlLCBpbmRlbnQsIGJhc2VJbmRlbnQgKyBpbmRlbnQpfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtvdXRwdXR9JHtpbmRlbnQgPyBgXFxuJHtiYXNlSW5kZW50fWAgOiAnJ319YDtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZShvYmosIGluZGVudCwgYmFzZUluZGVudCkge1xuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSlcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVBcnJheShvYmosIGluZGVudCwgYmFzZUluZGVudCk7XG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICAgICAgcmV0dXJuIGBuZXcgRGF0ZSgke29iai5nZXRUaW1lKCl9KWA7XG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgICAgICAgICByZXR1cm4gb2JqLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVPYmplY3Qob2JqLCBpbmRlbnQsIGJhc2VJbmRlbnQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKG9iaiA9PT0gSW5maW5pdHkpXG4gICAgICAgICAgICByZXR1cm4gJ0luZmluaXR5JztcbiAgICAgICAgaWYgKG9iaiA9PT0gLUluZmluaXR5KVxuICAgICAgICAgICAgcmV0dXJuICctSW5maW5pdHknO1xuICAgICAgICBpZiAob2JqID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIDEgLyBvYmogPT09IEluZmluaXR5ID8gJzAnIDogJy0wJztcbiAgICAgICAgaWYgKG9iaiAhPT0gb2JqKVxuICAgICAgICAgICAgcmV0dXJuICdOYU4nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gU3ltYm9sLmtleUZvcihvYmopO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZpbmVkXG4gICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBgU3ltYm9sLmZvcigke3N0cmluZ2lmeSQ4KGtleSl9KWA7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50JylcbiAgICAgICAgcmV0dXJuIGAke29ian1uYDtcbiAgICByZXR1cm4gc3RyaW5naWZ5JDgob2JqKTtcbn1cbmNvbnN0IGRhdGFUb0VzbSA9IGZ1bmN0aW9uIGRhdGFUb0VzbShkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB0ID0gb3B0aW9ucy5jb21wYWN0ID8gJycgOiAnaW5kZW50JyBpbiBvcHRpb25zID8gb3B0aW9ucy5pbmRlbnQgOiAnXFx0JztcbiAgICBjb25zdCBfID0gb3B0aW9ucy5jb21wYWN0ID8gJycgOiAnICc7XG4gICAgY29uc3QgbiA9IG9wdGlvbnMuY29tcGFjdCA/ICcnIDogJ1xcbic7XG4gICAgY29uc3QgZGVjbGFyYXRpb25UeXBlID0gb3B0aW9ucy5wcmVmZXJDb25zdCA/ICdjb25zdCcgOiAndmFyJztcbiAgICBpZiAob3B0aW9ucy5uYW1lZEV4cG9ydHMgPT09IGZhbHNlIHx8XG4gICAgICAgIHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KGRhdGEpIHx8XG4gICAgICAgIGRhdGEgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgIGRhdGEgaW5zdGFuY2VvZiBSZWdFeHAgfHxcbiAgICAgICAgZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjb2RlID0gc2VyaWFsaXplKGRhdGEsIG9wdGlvbnMuY29tcGFjdCA/IG51bGwgOiB0LCAnJyk7XG4gICAgICAgIGNvbnN0IG1hZ2ljID0gXyB8fCAoL15be1tcXC1cXC9dLy50ZXN0KGNvZGUpID8gJycgOiAnICcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgICAgIHJldHVybiBgZXhwb3J0IGRlZmF1bHQke21hZ2ljfSR7Y29kZX07YDtcbiAgICB9XG4gICAgbGV0IG5hbWVkRXhwb3J0Q29kZSA9ICcnO1xuICAgIGNvbnN0IGRlZmF1bHRFeHBvcnRSb3dzID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gbWFrZUxlZ2FsSWRlbnRpZmllcihrZXkpKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5vYmplY3RTaG9ydGhhbmQpXG4gICAgICAgICAgICAgICAgZGVmYXVsdEV4cG9ydFJvd3MucHVzaChrZXkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGRlZmF1bHRFeHBvcnRSb3dzLnB1c2goYCR7a2V5fToke199JHtrZXl9YCk7XG4gICAgICAgICAgICBuYW1lZEV4cG9ydENvZGUgKz0gYGV4cG9ydCAke2RlY2xhcmF0aW9uVHlwZX0gJHtrZXl9JHtffT0ke199JHtzZXJpYWxpemUodmFsdWUsIG9wdGlvbnMuY29tcGFjdCA/IG51bGwgOiB0LCAnJyl9OyR7bn1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdEV4cG9ydFJvd3MucHVzaChgJHtzdHJpbmdpZnkkOChrZXkpfToke199JHtzZXJpYWxpemUodmFsdWUsIG9wdGlvbnMuY29tcGFjdCA/IG51bGwgOiB0LCAnJyl9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke25hbWVkRXhwb3J0Q29kZX1leHBvcnQgZGVmYXVsdCR7X317JHtufSR7dH0ke2RlZmF1bHRFeHBvcnRSb3dzLmpvaW4oYCwke259JHt0fWApfSR7bn19OyR7bn1gO1xufTtcblxudmFyIHBhdGgkbCA9IHJlcXVpcmUkJDAkNDtcblxudmFyIGNvbW1vbmRpciA9IGZ1bmN0aW9uIChiYXNlZGlyLCByZWxmaWxlcykge1xuICAgIGlmIChyZWxmaWxlcykge1xuICAgICAgICB2YXIgZmlsZXMgPSByZWxmaWxlcy5tYXAoZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoJGwucmVzb2x2ZShiYXNlZGlyLCByKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgZmlsZXMgPSBiYXNlZGlyO1xuICAgIH1cbiAgICBcbiAgICB2YXIgcmVzID0gZmlsZXMuc2xpY2UoMSkucmVkdWNlKGZ1bmN0aW9uIChwcywgZmlsZSkge1xuICAgICAgICBpZiAoIWZpbGUubWF0Y2goL14oW0EtWmEtel06KT9cXC98XFxcXC8pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlbGF0aXZlIHBhdGggd2l0aG91dCBhIGJhc2VkaXInKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHhzID0gZmlsZS5zcGxpdCgvXFwvK3xcXFxcKy8pO1xuICAgICAgICBmb3IgKFxuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgcHNbaV0gPT09IHhzW2ldICYmIGkgPCBNYXRoLm1pbihwcy5sZW5ndGgsIHhzLmxlbmd0aCk7XG4gICAgICAgICAgICBpKytcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHBzLnNsaWNlKDAsIGkpO1xuICAgIH0sIGZpbGVzWzBdLnNwbGl0KC9cXC8rfFxcXFwrLykpO1xuICAgIFxuICAgIC8vIFdpbmRvd3MgY29ycmVjdGx5IGhhbmRsZXMgcGF0aHMgd2l0aCBmb3J3YXJkLXNsYXNoZXNcbiAgICByZXR1cm4gcmVzLmxlbmd0aCA+IDEgPyByZXMuam9pbignLycpIDogJy8nXG59O1xuXG52YXIgb2xkJDEgPSB7fTtcblxuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBwYXRoTW9kdWxlID0gcmVxdWlyZSQkMCQ0O1xudmFyIGlzV2luZG93cyQ2ID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbnZhciBmcyRrID0gcmVxdWlyZSQkMF9fZGVmYXVsdDtcblxuLy8gSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiByZWFscGF0aCwgcG9ydGVkIGZyb20gbm9kZSBwcmUtdjZcblxudmFyIERFQlVHJDEgPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmIC9mcy8udGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKTtcblxuZnVuY3Rpb24gcmV0aHJvdygpIHtcbiAgLy8gT25seSBlbmFibGUgaW4gZGVidWcgbW9kZS4gQSBiYWNrdHJhY2UgdXNlcyB+MTAwMCBieXRlcyBvZiBoZWFwIHNwYWNlIGFuZFxuICAvLyBpcyBmYWlybHkgc2xvdyB0byBnZW5lcmF0ZS5cbiAgdmFyIGNhbGxiYWNrO1xuICBpZiAoREVCVUckMSkge1xuICAgIHZhciBiYWNrdHJhY2UgPSBuZXcgRXJyb3I7XG4gICAgY2FsbGJhY2sgPSBkZWJ1Z0NhbGxiYWNrO1xuICB9IGVsc2VcbiAgICBjYWxsYmFjayA9IG1pc3NpbmdDYWxsYmFjaztcblxuICByZXR1cm4gY2FsbGJhY2s7XG5cbiAgZnVuY3Rpb24gZGVidWdDYWxsYmFjayhlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBiYWNrdHJhY2UubWVzc2FnZSA9IGVyci5tZXNzYWdlO1xuICAgICAgZXJyID0gYmFja3RyYWNlO1xuICAgICAgbWlzc2luZ0NhbGxiYWNrKGVycik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWlzc2luZ0NhbGxiYWNrKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pXG4gICAgICAgIHRocm93IGVycjsgIC8vIEZvcmdvdCBhIGNhbGxiYWNrIGJ1dCBkb24ndCBrbm93IHdoZXJlPyBVc2UgTk9ERV9ERUJVRz1mc1xuICAgICAgZWxzZSBpZiAoIXByb2Nlc3Mubm9EZXByZWNhdGlvbikge1xuICAgICAgICB2YXIgbXNnID0gJ2ZzOiBtaXNzaW5nIGNhbGxiYWNrICcgKyAoZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgICAgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbilcbiAgICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlQ2FsbGJhY2soY2IpIHtcbiAgcmV0dXJuIHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJyA/IGNiIDogcmV0aHJvdygpO1xufVxuXG4vLyBSZWdleHAgdGhhdCBmaW5kcyB0aGUgbmV4dCBwYXJ0aW9uIG9mIGEgKHBhcnRpYWwpIHBhdGhcbi8vIHJlc3VsdCBpcyBbYmFzZV93aXRoX3NsYXNoLCBiYXNlXSwgZS5nLiBbJ3NvbWVkaXIvJywgJ3NvbWVkaXInXVxuaWYgKGlzV2luZG93cyQ2KSB7XG4gIHZhciBuZXh0UGFydFJlID0gLyguKj8pKD86W1xcL1xcXFxdK3wkKS9nO1xufSBlbHNlIHtcbiAgdmFyIG5leHRQYXJ0UmUgPSAvKC4qPykoPzpbXFwvXSt8JCkvZztcbn1cblxuLy8gUmVnZXggdG8gZmluZCB0aGUgZGV2aWNlIHJvb3QsIGluY2x1ZGluZyB0cmFpbGluZyBzbGFzaC4gRS5nLiAnYzpcXFxcJy5cbmlmIChpc1dpbmRvd3MkNikge1xuICB2YXIgc3BsaXRSb290UmUgPSAvXig/OlthLXpBLVpdOnxbXFxcXFxcL117Mn1bXlxcXFxcXC9dK1tcXFxcXFwvXVteXFxcXFxcL10rKT9bXFxcXFxcL10qLztcbn0gZWxzZSB7XG4gIHZhciBzcGxpdFJvb3RSZSA9IC9eW1xcL10qLztcbn1cblxub2xkJDEucmVhbHBhdGhTeW5jID0gZnVuY3Rpb24gcmVhbHBhdGhTeW5jKHAsIGNhY2hlKSB7XG4gIC8vIG1ha2UgcCBpcyBhYnNvbHV0ZVxuICBwID0gcGF0aE1vZHVsZS5yZXNvbHZlKHApO1xuXG4gIGlmIChjYWNoZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2FjaGUsIHApKSB7XG4gICAgcmV0dXJuIGNhY2hlW3BdO1xuICB9XG5cbiAgdmFyIG9yaWdpbmFsID0gcCxcbiAgICAgIHNlZW5MaW5rcyA9IHt9LFxuICAgICAga25vd25IYXJkID0ge307XG5cbiAgLy8gY3VycmVudCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gcFxuICB2YXIgcG9zO1xuICAvLyB0aGUgcGFydGlhbCBwYXRoIHNvIGZhciwgaW5jbHVkaW5nIGEgdHJhaWxpbmcgc2xhc2ggaWYgYW55XG4gIHZhciBjdXJyZW50O1xuICAvLyB0aGUgcGFydGlhbCBwYXRoIHdpdGhvdXQgYSB0cmFpbGluZyBzbGFzaCAoZXhjZXB0IHdoZW4gcG9pbnRpbmcgYXQgYSByb290KVxuICB2YXIgYmFzZTtcbiAgLy8gdGhlIHBhcnRpYWwgcGF0aCBzY2FubmVkIGluIHRoZSBwcmV2aW91cyByb3VuZCwgd2l0aCBzbGFzaFxuICB2YXIgcHJldmlvdXM7XG5cbiAgc3RhcnQoKTtcblxuICBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICAvLyBTa2lwIG92ZXIgcm9vdHNcbiAgICB2YXIgbSA9IHNwbGl0Um9vdFJlLmV4ZWMocCk7XG4gICAgcG9zID0gbVswXS5sZW5ndGg7XG4gICAgY3VycmVudCA9IG1bMF07XG4gICAgYmFzZSA9IG1bMF07XG4gICAgcHJldmlvdXMgPSAnJztcblxuICAgIC8vIE9uIHdpbmRvd3MsIGNoZWNrIHRoYXQgdGhlIHJvb3QgZXhpc3RzLiBPbiB1bml4IHRoZXJlIGlzIG5vIG5lZWQuXG4gICAgaWYgKGlzV2luZG93cyQ2ICYmICFrbm93bkhhcmRbYmFzZV0pIHtcbiAgICAgIGZzJGsubHN0YXRTeW5jKGJhc2UpO1xuICAgICAga25vd25IYXJkW2Jhc2VdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyB3YWxrIGRvd24gdGhlIHBhdGgsIHN3YXBwaW5nIG91dCBsaW5rZWQgcGF0aHBhcnRzIGZvciB0aGVpciByZWFsXG4gIC8vIHZhbHVlc1xuICAvLyBOQjogcC5sZW5ndGggY2hhbmdlcy5cbiAgd2hpbGUgKHBvcyA8IHAubGVuZ3RoKSB7XG4gICAgLy8gZmluZCB0aGUgbmV4dCBwYXJ0XG4gICAgbmV4dFBhcnRSZS5sYXN0SW5kZXggPSBwb3M7XG4gICAgdmFyIHJlc3VsdCA9IG5leHRQYXJ0UmUuZXhlYyhwKTtcbiAgICBwcmV2aW91cyA9IGN1cnJlbnQ7XG4gICAgY3VycmVudCArPSByZXN1bHRbMF07XG4gICAgYmFzZSA9IHByZXZpb3VzICsgcmVzdWx0WzFdO1xuICAgIHBvcyA9IG5leHRQYXJ0UmUubGFzdEluZGV4O1xuXG4gICAgLy8gY29udGludWUgaWYgbm90IGEgc3ltbGlua1xuICAgIGlmIChrbm93bkhhcmRbYmFzZV0gfHwgKGNhY2hlICYmIGNhY2hlW2Jhc2VdID09PSBiYXNlKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIHJlc29sdmVkTGluaztcbiAgICBpZiAoY2FjaGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhY2hlLCBiYXNlKSkge1xuICAgICAgLy8gc29tZSBrbm93biBzeW1ib2xpYyBsaW5rLiAgbm8gbmVlZCB0byBzdGF0IGFnYWluLlxuICAgICAgcmVzb2x2ZWRMaW5rID0gY2FjaGVbYmFzZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGF0ID0gZnMkay5sc3RhdFN5bmMoYmFzZSk7XG4gICAgICBpZiAoIXN0YXQuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICBrbm93bkhhcmRbYmFzZV0gPSB0cnVlO1xuICAgICAgICBpZiAoY2FjaGUpIGNhY2hlW2Jhc2VdID0gYmFzZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlYWQgdGhlIGxpbmsgaWYgaXQgd2Fzbid0IHJlYWQgYmVmb3JlXG4gICAgICAvLyBkZXYvaW5vIGFsd2F5cyByZXR1cm4gMCBvbiB3aW5kb3dzLCBzbyBza2lwIHRoZSBjaGVjay5cbiAgICAgIHZhciBsaW5rVGFyZ2V0ID0gbnVsbDtcbiAgICAgIGlmICghaXNXaW5kb3dzJDYpIHtcbiAgICAgICAgdmFyIGlkID0gc3RhdC5kZXYudG9TdHJpbmcoMzIpICsgJzonICsgc3RhdC5pbm8udG9TdHJpbmcoMzIpO1xuICAgICAgICBpZiAoc2VlbkxpbmtzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgIGxpbmtUYXJnZXQgPSBzZWVuTGlua3NbaWRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobGlua1RhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICBmcyRrLnN0YXRTeW5jKGJhc2UpO1xuICAgICAgICBsaW5rVGFyZ2V0ID0gZnMkay5yZWFkbGlua1N5bmMoYmFzZSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlZExpbmsgPSBwYXRoTW9kdWxlLnJlc29sdmUocHJldmlvdXMsIGxpbmtUYXJnZXQpO1xuICAgICAgLy8gdHJhY2sgdGhpcywgaWYgZ2l2ZW4gYSBjYWNoZS5cbiAgICAgIGlmIChjYWNoZSkgY2FjaGVbYmFzZV0gPSByZXNvbHZlZExpbms7XG4gICAgICBpZiAoIWlzV2luZG93cyQ2KSBzZWVuTGlua3NbaWRdID0gbGlua1RhcmdldDtcbiAgICB9XG5cbiAgICAvLyByZXNvbHZlIHRoZSBsaW5rLCB0aGVuIHN0YXJ0IG92ZXJcbiAgICBwID0gcGF0aE1vZHVsZS5yZXNvbHZlKHJlc29sdmVkTGluaywgcC5zbGljZShwb3MpKTtcbiAgICBzdGFydCgpO1xuICB9XG5cbiAgaWYgKGNhY2hlKSBjYWNoZVtvcmlnaW5hbF0gPSBwO1xuXG4gIHJldHVybiBwO1xufTtcblxuXG5vbGQkMS5yZWFscGF0aCA9IGZ1bmN0aW9uIHJlYWxwYXRoKHAsIGNhY2hlLCBjYikge1xuICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBtYXliZUNhbGxiYWNrKGNhY2hlKTtcbiAgICBjYWNoZSA9IG51bGw7XG4gIH1cblxuICAvLyBtYWtlIHAgaXMgYWJzb2x1dGVcbiAgcCA9IHBhdGhNb2R1bGUucmVzb2x2ZShwKTtcblxuICBpZiAoY2FjaGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhY2hlLCBwKSkge1xuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGNiLmJpbmQobnVsbCwgbnVsbCwgY2FjaGVbcF0pKTtcbiAgfVxuXG4gIHZhciBvcmlnaW5hbCA9IHAsXG4gICAgICBzZWVuTGlua3MgPSB7fSxcbiAgICAgIGtub3duSGFyZCA9IHt9O1xuXG4gIC8vIGN1cnJlbnQgY2hhcmFjdGVyIHBvc2l0aW9uIGluIHBcbiAgdmFyIHBvcztcbiAgLy8gdGhlIHBhcnRpYWwgcGF0aCBzbyBmYXIsIGluY2x1ZGluZyBhIHRyYWlsaW5nIHNsYXNoIGlmIGFueVxuICB2YXIgY3VycmVudDtcbiAgLy8gdGhlIHBhcnRpYWwgcGF0aCB3aXRob3V0IGEgdHJhaWxpbmcgc2xhc2ggKGV4Y2VwdCB3aGVuIHBvaW50aW5nIGF0IGEgcm9vdClcbiAgdmFyIGJhc2U7XG4gIC8vIHRoZSBwYXJ0aWFsIHBhdGggc2Nhbm5lZCBpbiB0aGUgcHJldmlvdXMgcm91bmQsIHdpdGggc2xhc2hcbiAgdmFyIHByZXZpb3VzO1xuXG4gIHN0YXJ0KCk7XG5cbiAgZnVuY3Rpb24gc3RhcnQoKSB7XG4gICAgLy8gU2tpcCBvdmVyIHJvb3RzXG4gICAgdmFyIG0gPSBzcGxpdFJvb3RSZS5leGVjKHApO1xuICAgIHBvcyA9IG1bMF0ubGVuZ3RoO1xuICAgIGN1cnJlbnQgPSBtWzBdO1xuICAgIGJhc2UgPSBtWzBdO1xuICAgIHByZXZpb3VzID0gJyc7XG5cbiAgICAvLyBPbiB3aW5kb3dzLCBjaGVjayB0aGF0IHRoZSByb290IGV4aXN0cy4gT24gdW5peCB0aGVyZSBpcyBubyBuZWVkLlxuICAgIGlmIChpc1dpbmRvd3MkNiAmJiAha25vd25IYXJkW2Jhc2VdKSB7XG4gICAgICBmcyRrLmxzdGF0KGJhc2UsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAga25vd25IYXJkW2Jhc2VdID0gdHJ1ZTtcbiAgICAgICAgTE9PUCgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soTE9PUCk7XG4gICAgfVxuICB9XG5cbiAgLy8gd2FsayBkb3duIHRoZSBwYXRoLCBzd2FwcGluZyBvdXQgbGlua2VkIHBhdGhwYXJ0cyBmb3IgdGhlaXIgcmVhbFxuICAvLyB2YWx1ZXNcbiAgZnVuY3Rpb24gTE9PUCgpIHtcbiAgICAvLyBzdG9wIGlmIHNjYW5uZWQgcGFzdCBlbmQgb2YgcGF0aFxuICAgIGlmIChwb3MgPj0gcC5sZW5ndGgpIHtcbiAgICAgIGlmIChjYWNoZSkgY2FjaGVbb3JpZ2luYWxdID0gcDtcbiAgICAgIHJldHVybiBjYihudWxsLCBwKTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIHRoZSBuZXh0IHBhcnRcbiAgICBuZXh0UGFydFJlLmxhc3RJbmRleCA9IHBvcztcbiAgICB2YXIgcmVzdWx0ID0gbmV4dFBhcnRSZS5leGVjKHApO1xuICAgIHByZXZpb3VzID0gY3VycmVudDtcbiAgICBjdXJyZW50ICs9IHJlc3VsdFswXTtcbiAgICBiYXNlID0gcHJldmlvdXMgKyByZXN1bHRbMV07XG4gICAgcG9zID0gbmV4dFBhcnRSZS5sYXN0SW5kZXg7XG5cbiAgICAvLyBjb250aW51ZSBpZiBub3QgYSBzeW1saW5rXG4gICAgaWYgKGtub3duSGFyZFtiYXNlXSB8fCAoY2FjaGUgJiYgY2FjaGVbYmFzZV0gPT09IGJhc2UpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhMT09QKTtcbiAgICB9XG5cbiAgICBpZiAoY2FjaGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhY2hlLCBiYXNlKSkge1xuICAgICAgLy8ga25vd24gc3ltYm9saWMgbGluay4gIG5vIG5lZWQgdG8gc3RhdCBhZ2Fpbi5cbiAgICAgIHJldHVybiBnb3RSZXNvbHZlZExpbmsoY2FjaGVbYmFzZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBmcyRrLmxzdGF0KGJhc2UsIGdvdFN0YXQpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ290U3RhdChlcnIsIHN0YXQpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKTtcblxuICAgIC8vIGlmIG5vdCBhIHN5bWxpbmssIHNraXAgdG8gdGhlIG5leHQgcGF0aCBwYXJ0XG4gICAgaWYgKCFzdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGtub3duSGFyZFtiYXNlXSA9IHRydWU7XG4gICAgICBpZiAoY2FjaGUpIGNhY2hlW2Jhc2VdID0gYmFzZTtcbiAgICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKExPT1ApO1xuICAgIH1cblxuICAgIC8vIHN0YXQgJiByZWFkIHRoZSBsaW5rIGlmIG5vdCByZWFkIGJlZm9yZVxuICAgIC8vIGNhbGwgZ290VGFyZ2V0IGFzIHNvb24gYXMgdGhlIGxpbmsgdGFyZ2V0IGlzIGtub3duXG4gICAgLy8gZGV2L2lubyBhbHdheXMgcmV0dXJuIDAgb24gd2luZG93cywgc28gc2tpcCB0aGUgY2hlY2suXG4gICAgaWYgKCFpc1dpbmRvd3MkNikge1xuICAgICAgdmFyIGlkID0gc3RhdC5kZXYudG9TdHJpbmcoMzIpICsgJzonICsgc3RhdC5pbm8udG9TdHJpbmcoMzIpO1xuICAgICAgaWYgKHNlZW5MaW5rcy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgcmV0dXJuIGdvdFRhcmdldChudWxsLCBzZWVuTGlua3NbaWRdLCBiYXNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnMkay5zdGF0KGJhc2UsIGZ1bmN0aW9uKGVycikge1xuICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG5cbiAgICAgIGZzJGsucmVhZGxpbmsoYmFzZSwgZnVuY3Rpb24oZXJyLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCFpc1dpbmRvd3MkNikgc2VlbkxpbmtzW2lkXSA9IHRhcmdldDtcbiAgICAgICAgZ290VGFyZ2V0KGVyciwgdGFyZ2V0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ290VGFyZ2V0KGVyciwgdGFyZ2V0LCBiYXNlKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG5cbiAgICB2YXIgcmVzb2x2ZWRMaW5rID0gcGF0aE1vZHVsZS5yZXNvbHZlKHByZXZpb3VzLCB0YXJnZXQpO1xuICAgIGlmIChjYWNoZSkgY2FjaGVbYmFzZV0gPSByZXNvbHZlZExpbms7XG4gICAgZ290UmVzb2x2ZWRMaW5rKHJlc29sdmVkTGluayk7XG4gIH1cblxuICBmdW5jdGlvbiBnb3RSZXNvbHZlZExpbmsocmVzb2x2ZWRMaW5rKSB7XG4gICAgLy8gcmVzb2x2ZSB0aGUgbGluaywgdGhlbiBzdGFydCBvdmVyXG4gICAgcCA9IHBhdGhNb2R1bGUucmVzb2x2ZShyZXNvbHZlZExpbmssIHAuc2xpY2UocG9zKSk7XG4gICAgc3RhcnQoKTtcbiAgfVxufTtcblxudmFyIGZzX3JlYWxwYXRoID0gcmVhbHBhdGgkMjtcbnJlYWxwYXRoJDIucmVhbHBhdGggPSByZWFscGF0aCQyO1xucmVhbHBhdGgkMi5zeW5jID0gcmVhbHBhdGhTeW5jO1xucmVhbHBhdGgkMi5yZWFscGF0aFN5bmMgPSByZWFscGF0aFN5bmM7XG5yZWFscGF0aCQyLm1vbmtleXBhdGNoID0gbW9ua2V5cGF0Y2g7XG5yZWFscGF0aCQyLnVubW9ua2V5cGF0Y2ggPSB1bm1vbmtleXBhdGNoO1xuXG52YXIgZnMkaiA9IHJlcXVpcmUkJDBfX2RlZmF1bHQ7XG52YXIgb3JpZ1JlYWxwYXRoID0gZnMkai5yZWFscGF0aDtcbnZhciBvcmlnUmVhbHBhdGhTeW5jID0gZnMkai5yZWFscGF0aFN5bmM7XG5cbnZhciB2ZXJzaW9uJDQgPSBwcm9jZXNzLnZlcnNpb247XG52YXIgb2sgPSAvXnZbMC01XVxcLi8udGVzdCh2ZXJzaW9uJDQpO1xudmFyIG9sZCA9IG9sZCQxO1xuXG5mdW5jdGlvbiBuZXdFcnJvciAoZXIpIHtcbiAgcmV0dXJuIGVyICYmIGVyLnN5c2NhbGwgPT09ICdyZWFscGF0aCcgJiYgKFxuICAgIGVyLmNvZGUgPT09ICdFTE9PUCcgfHxcbiAgICBlci5jb2RlID09PSAnRU5PTUVNJyB8fFxuICAgIGVyLmNvZGUgPT09ICdFTkFNRVRPT0xPTkcnXG4gIClcbn1cblxuZnVuY3Rpb24gcmVhbHBhdGgkMiAocCwgY2FjaGUsIGNiKSB7XG4gIGlmIChvaykge1xuICAgIHJldHVybiBvcmlnUmVhbHBhdGgocCwgY2FjaGUsIGNiKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBjYWNoZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gY2FjaGU7XG4gICAgY2FjaGUgPSBudWxsO1xuICB9XG4gIG9yaWdSZWFscGF0aChwLCBjYWNoZSwgZnVuY3Rpb24gKGVyLCByZXN1bHQpIHtcbiAgICBpZiAobmV3RXJyb3IoZXIpKSB7XG4gICAgICBvbGQucmVhbHBhdGgocCwgY2FjaGUsIGNiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2IoZXIsIHJlc3VsdCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhbHBhdGhTeW5jIChwLCBjYWNoZSkge1xuICBpZiAob2spIHtcbiAgICByZXR1cm4gb3JpZ1JlYWxwYXRoU3luYyhwLCBjYWNoZSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG9yaWdSZWFscGF0aFN5bmMocCwgY2FjaGUpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgaWYgKG5ld0Vycm9yKGVyKSkge1xuICAgICAgcmV0dXJuIG9sZC5yZWFscGF0aFN5bmMocCwgY2FjaGUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVyXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1vbmtleXBhdGNoICgpIHtcbiAgZnMkai5yZWFscGF0aCA9IHJlYWxwYXRoJDI7XG4gIGZzJGoucmVhbHBhdGhTeW5jID0gcmVhbHBhdGhTeW5jO1xufVxuXG5mdW5jdGlvbiB1bm1vbmtleXBhdGNoICgpIHtcbiAgZnMkai5yZWFscGF0aCA9IG9yaWdSZWFscGF0aDtcbiAgZnMkai5yZWFscGF0aFN5bmMgPSBvcmlnUmVhbHBhdGhTeW5jO1xufVxuXG5jb25zdCBpc1dpbmRvd3MkNSA9IHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICBwcm9jZXNzICYmXG4gIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG52YXIgcGF0aCRrID0gaXNXaW5kb3dzJDUgPyB7IHNlcDogJ1xcXFwnIH0gOiB7IHNlcDogJy8nIH07XG5cbnZhciBiYWxhbmNlZE1hdGNoID0gYmFsYW5jZWQkMTtcbmZ1bmN0aW9uIGJhbGFuY2VkJDEoYSwgYiwgc3RyKSB7XG4gIGlmIChhIGluc3RhbmNlb2YgUmVnRXhwKSBhID0gbWF5YmVNYXRjaChhLCBzdHIpO1xuICBpZiAoYiBpbnN0YW5jZW9mIFJlZ0V4cCkgYiA9IG1heWJlTWF0Y2goYiwgc3RyKTtcblxuICB2YXIgciA9IHJhbmdlJDEoYSwgYiwgc3RyKTtcblxuICByZXR1cm4gciAmJiB7XG4gICAgc3RhcnQ6IHJbMF0sXG4gICAgZW5kOiByWzFdLFxuICAgIHByZTogc3RyLnNsaWNlKDAsIHJbMF0pLFxuICAgIGJvZHk6IHN0ci5zbGljZShyWzBdICsgYS5sZW5ndGgsIHJbMV0pLFxuICAgIHBvc3Q6IHN0ci5zbGljZShyWzFdICsgYi5sZW5ndGgpXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1heWJlTWF0Y2gocmVnLCBzdHIpIHtcbiAgdmFyIG0gPSBzdHIubWF0Y2gocmVnKTtcbiAgcmV0dXJuIG0gPyBtWzBdIDogbnVsbDtcbn1cblxuYmFsYW5jZWQkMS5yYW5nZSA9IHJhbmdlJDE7XG5mdW5jdGlvbiByYW5nZSQxKGEsIGIsIHN0cikge1xuICB2YXIgYmVncywgYmVnLCBsZWZ0LCByaWdodCwgcmVzdWx0O1xuICB2YXIgYWkgPSBzdHIuaW5kZXhPZihhKTtcbiAgdmFyIGJpID0gc3RyLmluZGV4T2YoYiwgYWkgKyAxKTtcbiAgdmFyIGkgPSBhaTtcblxuICBpZiAoYWkgPj0gMCAmJiBiaSA+IDApIHtcbiAgICBpZihhPT09Yikge1xuICAgICAgcmV0dXJuIFthaSwgYmldO1xuICAgIH1cbiAgICBiZWdzID0gW107XG4gICAgbGVmdCA9IHN0ci5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaSA+PSAwICYmICFyZXN1bHQpIHtcbiAgICAgIGlmIChpID09IGFpKSB7XG4gICAgICAgIGJlZ3MucHVzaChpKTtcbiAgICAgICAgYWkgPSBzdHIuaW5kZXhPZihhLCBpICsgMSk7XG4gICAgICB9IGVsc2UgaWYgKGJlZ3MubGVuZ3RoID09IDEpIHtcbiAgICAgICAgcmVzdWx0ID0gWyBiZWdzLnBvcCgpLCBiaSBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmVnID0gYmVncy5wb3AoKTtcbiAgICAgICAgaWYgKGJlZyA8IGxlZnQpIHtcbiAgICAgICAgICBsZWZ0ID0gYmVnO1xuICAgICAgICAgIHJpZ2h0ID0gYmk7XG4gICAgICAgIH1cblxuICAgICAgICBiaSA9IHN0ci5pbmRleE9mKGIsIGkgKyAxKTtcbiAgICAgIH1cblxuICAgICAgaSA9IGFpIDwgYmkgJiYgYWkgPj0gMCA/IGFpIDogYmk7XG4gICAgfVxuXG4gICAgaWYgKGJlZ3MubGVuZ3RoKSB7XG4gICAgICByZXN1bHQgPSBbIGxlZnQsIHJpZ2h0IF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIGJhbGFuY2VkID0gYmFsYW5jZWRNYXRjaDtcblxudmFyIGJyYWNlRXhwYW5zaW9uID0gZXhwYW5kVG9wO1xuXG52YXIgZXNjU2xhc2ggPSAnXFwwU0xBU0gnK01hdGgucmFuZG9tKCkrJ1xcMCc7XG52YXIgZXNjT3BlbiA9ICdcXDBPUEVOJytNYXRoLnJhbmRvbSgpKydcXDAnO1xudmFyIGVzY0Nsb3NlID0gJ1xcMENMT1NFJytNYXRoLnJhbmRvbSgpKydcXDAnO1xudmFyIGVzY0NvbW1hID0gJ1xcMENPTU1BJytNYXRoLnJhbmRvbSgpKydcXDAnO1xudmFyIGVzY1BlcmlvZCA9ICdcXDBQRVJJT0QnK01hdGgucmFuZG9tKCkrJ1xcMCc7XG5cbmZ1bmN0aW9uIG51bWVyaWMoc3RyKSB7XG4gIHJldHVybiBwYXJzZUludChzdHIsIDEwKSA9PSBzdHJcbiAgICA/IHBhcnNlSW50KHN0ciwgMTApXG4gICAgOiBzdHIuY2hhckNvZGVBdCgwKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlQnJhY2VzKHN0cikge1xuICByZXR1cm4gc3RyLnNwbGl0KCdcXFxcXFxcXCcpLmpvaW4oZXNjU2xhc2gpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcXFx7Jykuam9pbihlc2NPcGVuKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxcfScpLmpvaW4oZXNjQ2xvc2UpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcXFwsJykuam9pbihlc2NDb21tYSlcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXC4nKS5qb2luKGVzY1BlcmlvZCk7XG59XG5cbmZ1bmN0aW9uIHVuZXNjYXBlQnJhY2VzKHN0cikge1xuICByZXR1cm4gc3RyLnNwbGl0KGVzY1NsYXNoKS5qb2luKCdcXFxcJylcbiAgICAgICAgICAgIC5zcGxpdChlc2NPcGVuKS5qb2luKCd7JylcbiAgICAgICAgICAgIC5zcGxpdChlc2NDbG9zZSkuam9pbignfScpXG4gICAgICAgICAgICAuc3BsaXQoZXNjQ29tbWEpLmpvaW4oJywnKVxuICAgICAgICAgICAgLnNwbGl0KGVzY1BlcmlvZCkuam9pbignLicpO1xufVxuXG5cbi8vIEJhc2ljYWxseSBqdXN0IHN0ci5zcGxpdChcIixcIiksIGJ1dCBoYW5kbGluZyBjYXNlc1xuLy8gd2hlcmUgd2UgaGF2ZSBuZXN0ZWQgYnJhY2VkIHNlY3Rpb25zLCB3aGljaCBzaG91bGQgYmVcbi8vIHRyZWF0ZWQgYXMgaW5kaXZpZHVhbCBtZW1iZXJzLCBsaWtlIHthLHtiLGN9LGR9XG5mdW5jdGlvbiBwYXJzZUNvbW1hUGFydHMoc3RyKSB7XG4gIGlmICghc3RyKVxuICAgIHJldHVybiBbJyddO1xuXG4gIHZhciBwYXJ0cyA9IFtdO1xuICB2YXIgbSA9IGJhbGFuY2VkKCd7JywgJ30nLCBzdHIpO1xuXG4gIGlmICghbSlcbiAgICByZXR1cm4gc3RyLnNwbGl0KCcsJyk7XG5cbiAgdmFyIHByZSA9IG0ucHJlO1xuICB2YXIgYm9keSA9IG0uYm9keTtcbiAgdmFyIHBvc3QgPSBtLnBvc3Q7XG4gIHZhciBwID0gcHJlLnNwbGl0KCcsJyk7XG5cbiAgcFtwLmxlbmd0aC0xXSArPSAneycgKyBib2R5ICsgJ30nO1xuICB2YXIgcG9zdFBhcnRzID0gcGFyc2VDb21tYVBhcnRzKHBvc3QpO1xuICBpZiAocG9zdC5sZW5ndGgpIHtcbiAgICBwW3AubGVuZ3RoLTFdICs9IHBvc3RQYXJ0cy5zaGlmdCgpO1xuICAgIHAucHVzaC5hcHBseShwLCBwb3N0UGFydHMpO1xuICB9XG5cbiAgcGFydHMucHVzaC5hcHBseShwYXJ0cywgcCk7XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG5mdW5jdGlvbiBleHBhbmRUb3Aoc3RyKSB7XG4gIGlmICghc3RyKVxuICAgIHJldHVybiBbXTtcblxuICAvLyBJIGRvbid0IGtub3cgd2h5IEJhc2ggNC4zIGRvZXMgdGhpcywgYnV0IGl0IGRvZXMuXG4gIC8vIEFueXRoaW5nIHN0YXJ0aW5nIHdpdGgge30gd2lsbCBoYXZlIHRoZSBmaXJzdCB0d28gYnl0ZXMgcHJlc2VydmVkXG4gIC8vIGJ1dCAqb25seSogYXQgdGhlIHRvcCBsZXZlbCwgc28ge30sYX1iIHdpbGwgbm90IGV4cGFuZCB0byBhbnl0aGluZyxcbiAgLy8gYnV0IGF7fSxifWMgd2lsbCBiZSBleHBhbmRlZCB0byBbYX1jLGFiY10uXG4gIC8vIE9uZSBjb3VsZCBhcmd1ZSB0aGF0IHRoaXMgaXMgYSBidWcgaW4gQmFzaCwgYnV0IHNpbmNlIHRoZSBnb2FsIG9mXG4gIC8vIHRoaXMgbW9kdWxlIGlzIHRvIG1hdGNoIEJhc2gncyBydWxlcywgd2UgZXNjYXBlIGEgbGVhZGluZyB7fVxuICBpZiAoc3RyLnN1YnN0cigwLCAyKSA9PT0gJ3t9Jykge1xuICAgIHN0ciA9ICdcXFxce1xcXFx9JyArIHN0ci5zdWJzdHIoMik7XG4gIH1cblxuICByZXR1cm4gZXhwYW5kJDQoZXNjYXBlQnJhY2VzKHN0ciksIHRydWUpLm1hcCh1bmVzY2FwZUJyYWNlcyk7XG59XG5cbmZ1bmN0aW9uIGVtYnJhY2Uoc3RyKSB7XG4gIHJldHVybiAneycgKyBzdHIgKyAnfSc7XG59XG5mdW5jdGlvbiBpc1BhZGRlZChlbCkge1xuICByZXR1cm4gL14tPzBcXGQvLnRlc3QoZWwpO1xufVxuXG5mdW5jdGlvbiBsdGUoaSwgeSkge1xuICByZXR1cm4gaSA8PSB5O1xufVxuZnVuY3Rpb24gZ3RlKGksIHkpIHtcbiAgcmV0dXJuIGkgPj0geTtcbn1cblxuZnVuY3Rpb24gZXhwYW5kJDQoc3RyLCBpc1RvcCkge1xuICB2YXIgZXhwYW5zaW9ucyA9IFtdO1xuXG4gIHZhciBtID0gYmFsYW5jZWQoJ3snLCAnfScsIHN0cik7XG4gIGlmICghbSkgcmV0dXJuIFtzdHJdO1xuXG4gIC8vIG5vIG5lZWQgdG8gZXhwYW5kIHByZSwgc2luY2UgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBmcmVlIG9mIGJyYWNlLXNldHNcbiAgdmFyIHByZSA9IG0ucHJlO1xuICB2YXIgcG9zdCA9IG0ucG9zdC5sZW5ndGhcbiAgICA/IGV4cGFuZCQ0KG0ucG9zdCwgZmFsc2UpXG4gICAgOiBbJyddO1xuXG4gIGlmICgvXFwkJC8udGVzdChtLnByZSkpIHsgICAgXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBwb3N0Lmxlbmd0aDsgaysrKSB7XG4gICAgICB2YXIgZXhwYW5zaW9uID0gcHJlKyAneycgKyBtLmJvZHkgKyAnfScgKyBwb3N0W2tdO1xuICAgICAgZXhwYW5zaW9ucy5wdXNoKGV4cGFuc2lvbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpc051bWVyaWNTZXF1ZW5jZSA9IC9eLT9cXGQrXFwuXFwuLT9cXGQrKD86XFwuXFwuLT9cXGQrKT8kLy50ZXN0KG0uYm9keSk7XG4gICAgdmFyIGlzQWxwaGFTZXF1ZW5jZSA9IC9eW2EtekEtWl1cXC5cXC5bYS16QS1aXSg/OlxcLlxcLi0/XFxkKyk/JC8udGVzdChtLmJvZHkpO1xuICAgIHZhciBpc1NlcXVlbmNlID0gaXNOdW1lcmljU2VxdWVuY2UgfHwgaXNBbHBoYVNlcXVlbmNlO1xuICAgIHZhciBpc09wdGlvbnMgPSBtLmJvZHkuaW5kZXhPZignLCcpID49IDA7XG4gICAgaWYgKCFpc1NlcXVlbmNlICYmICFpc09wdGlvbnMpIHtcbiAgICAgIC8vIHthfSxifVxuICAgICAgaWYgKG0ucG9zdC5tYXRjaCgvLC4qXFx9LykpIHtcbiAgICAgICAgc3RyID0gbS5wcmUgKyAneycgKyBtLmJvZHkgKyBlc2NDbG9zZSArIG0ucG9zdDtcbiAgICAgICAgcmV0dXJuIGV4cGFuZCQ0KHN0cik7XG4gICAgICB9XG4gICAgICByZXR1cm4gW3N0cl07XG4gICAgfVxuXG4gICAgdmFyIG47XG4gICAgaWYgKGlzU2VxdWVuY2UpIHtcbiAgICAgIG4gPSBtLmJvZHkuc3BsaXQoL1xcLlxcLi8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBuID0gcGFyc2VDb21tYVBhcnRzKG0uYm9keSk7XG4gICAgICBpZiAobi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8geHt7YSxifX15ID09PiB4e2F9eSB4e2J9eVxuICAgICAgICBuID0gZXhwYW5kJDQoblswXSwgZmFsc2UpLm1hcChlbWJyYWNlKTtcbiAgICAgICAgaWYgKG4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHBvc3QubWFwKGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICAgIHJldHVybiBtLnByZSArIG5bMF0gKyBwO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgbiBpcyB0aGUgcGFydHMsIGFuZCB3ZSBrbm93IGl0J3Mgbm90IGEgY29tbWEgc2V0XG4gICAgLy8gd2l0aCBhIHNpbmdsZSBlbnRyeS5cbiAgICB2YXIgTjtcblxuICAgIGlmIChpc1NlcXVlbmNlKSB7XG4gICAgICB2YXIgeCA9IG51bWVyaWMoblswXSk7XG4gICAgICB2YXIgeSA9IG51bWVyaWMoblsxXSk7XG4gICAgICB2YXIgd2lkdGggPSBNYXRoLm1heChuWzBdLmxlbmd0aCwgblsxXS5sZW5ndGgpO1xuICAgICAgdmFyIGluY3IgPSBuLmxlbmd0aCA9PSAzXG4gICAgICAgID8gTWF0aC5hYnMobnVtZXJpYyhuWzJdKSlcbiAgICAgICAgOiAxO1xuICAgICAgdmFyIHRlc3QgPSBsdGU7XG4gICAgICB2YXIgcmV2ZXJzZSA9IHkgPCB4O1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgaW5jciAqPSAtMTtcbiAgICAgICAgdGVzdCA9IGd0ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYWQgPSBuLnNvbWUoaXNQYWRkZWQpO1xuXG4gICAgICBOID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSB4OyB0ZXN0KGksIHkpOyBpICs9IGluY3IpIHtcbiAgICAgICAgdmFyIGM7XG4gICAgICAgIGlmIChpc0FscGhhU2VxdWVuY2UpIHtcbiAgICAgICAgICBjID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKTtcbiAgICAgICAgICBpZiAoYyA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgYyA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGMgPSBTdHJpbmcoaSk7XG4gICAgICAgICAgaWYgKHBhZCkge1xuICAgICAgICAgICAgdmFyIG5lZWQgPSB3aWR0aCAtIGMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKG5lZWQgPiAwKSB7XG4gICAgICAgICAgICAgIHZhciB6ID0gbmV3IEFycmF5KG5lZWQgKyAxKS5qb2luKCcwJyk7XG4gICAgICAgICAgICAgIGlmIChpIDwgMClcbiAgICAgICAgICAgICAgICBjID0gJy0nICsgeiArIGMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjID0geiArIGM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE4ucHVzaChjKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgTiA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgTi5wdXNoLmFwcGx5KE4sIGV4cGFuZCQ0KG5bal0sIGZhbHNlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBOLmxlbmd0aDsgaisrKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHBvc3QubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGV4cGFuc2lvbiA9IHByZSArIE5bal0gKyBwb3N0W2tdO1xuICAgICAgICBpZiAoIWlzVG9wIHx8IGlzU2VxdWVuY2UgfHwgZXhwYW5zaW9uKVxuICAgICAgICAgIGV4cGFuc2lvbnMucHVzaChleHBhbnNpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbnNpb25zO1xufVxuXG5jb25zdCBtaW5pbWF0Y2gkMSA9IG1pbmltYXRjaF8xID0gKHAsIHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybik7XG5cbiAgLy8gc2hvcnRjdXQ6IGNvbW1lbnRzIG1hdGNoIG5vdGhpbmcuXG4gIGlmICghb3B0aW9ucy5ub2NvbW1lbnQgJiYgcGF0dGVybi5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIG5ldyBNaW5pbWF0Y2gkMShwYXR0ZXJuLCBvcHRpb25zKS5tYXRjaChwKVxufTtcblxudmFyIG1pbmltYXRjaF8xID0gbWluaW1hdGNoJDE7XG5cbmNvbnN0IHBhdGgkaiA9IHBhdGgkaztcbm1pbmltYXRjaCQxLnNlcCA9IHBhdGgkai5zZXA7XG5cbmNvbnN0IEdMT0JTVEFSJDIgPSBTeW1ib2woJ2dsb2JzdGFyICoqJyk7XG5taW5pbWF0Y2gkMS5HTE9CU1RBUiA9IEdMT0JTVEFSJDI7XG5jb25zdCBleHBhbmQkMyA9IGJyYWNlRXhwYW5zaW9uO1xuXG5jb25zdCBwbFR5cGVzID0ge1xuICAnISc6IHsgb3BlbjogJyg/Oig/ISg/OicsIGNsb3NlOiAnKSlbXi9dKj8pJ30sXG4gICc/JzogeyBvcGVuOiAnKD86JywgY2xvc2U6ICcpPycgfSxcbiAgJysnOiB7IG9wZW46ICcoPzonLCBjbG9zZTogJykrJyB9LFxuICAnKic6IHsgb3BlbjogJyg/OicsIGNsb3NlOiAnKSonIH0sXG4gICdAJzogeyBvcGVuOiAnKD86JywgY2xvc2U6ICcpJyB9XG59O1xuXG4vLyBhbnkgc2luZ2xlIHRoaW5nIG90aGVyIHRoYW4gL1xuLy8gZG9uJ3QgbmVlZCB0byBlc2NhcGUgLyB3aGVuIHVzaW5nIG5ldyBSZWdFeHAoKVxuY29uc3QgcW1hcmsgPSAnW14vXSc7XG5cbi8vICogPT4gYW55IG51bWJlciBvZiBjaGFyYWN0ZXJzXG5jb25zdCBzdGFyID0gcW1hcmsgKyAnKj8nO1xuXG4vLyAqKiB3aGVuIGRvdHMgYXJlIGFsbG93ZWQuICBBbnl0aGluZyBnb2VzLCBleGNlcHQgLi4gYW5kIC5cbi8vIG5vdCAoXiBvciAvIGZvbGxvd2VkIGJ5IG9uZSBvciB0d28gZG90cyBmb2xsb3dlZCBieSAkIG9yIC8pLFxuLy8gZm9sbG93ZWQgYnkgYW55dGhpbmcsIGFueSBudW1iZXIgb2YgdGltZXMuXG5jb25zdCB0d29TdGFyRG90ID0gJyg/Oig/ISg/OlxcXFxcXC98XikoPzpcXFxcLnsxLDJ9KSgkfFxcXFxcXC8pKS4pKj8nO1xuXG4vLyBub3QgYSBeIG9yIC8gZm9sbG93ZWQgYnkgYSBkb3QsXG4vLyBmb2xsb3dlZCBieSBhbnl0aGluZywgYW55IG51bWJlciBvZiB0aW1lcy5cbmNvbnN0IHR3b1N0YXJOb0RvdCA9ICcoPzooPyEoPzpcXFxcXFwvfF4pXFxcXC4pLikqPyc7XG5cbi8vIFwiYWJjXCIgLT4geyBhOnRydWUsIGI6dHJ1ZSwgYzp0cnVlIH1cbmNvbnN0IGNoYXJTZXQgPSBzID0+IHMuc3BsaXQoJycpLnJlZHVjZSgoc2V0LCBjKSA9PiB7XG4gIHNldFtjXSA9IHRydWU7XG4gIHJldHVybiBzZXRcbn0sIHt9KTtcblxuLy8gY2hhcmFjdGVycyB0aGF0IG5lZWQgdG8gYmUgZXNjYXBlZCBpbiBSZWdFeHAuXG5jb25zdCByZVNwZWNpYWxzID0gY2hhclNldCgnKCkuKnt9Kz9bXV4kXFxcXCEnKTtcblxuLy8gY2hhcmFjdGVycyB0aGF0IGluZGljYXRlIHdlIGhhdmUgdG8gYWRkIHRoZSBwYXR0ZXJuIHN0YXJ0XG5jb25zdCBhZGRQYXR0ZXJuU3RhcnRTZXQgPSBjaGFyU2V0KCdbLignKTtcblxuLy8gbm9ybWFsaXplcyBzbGFzaGVzLlxuY29uc3Qgc2xhc2hTcGxpdCA9IC9cXC8rLztcblxubWluaW1hdGNoJDEuZmlsdGVyID0gKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT5cbiAgKHAsIGksIGxpc3QpID0+IG1pbmltYXRjaCQxKHAsIHBhdHRlcm4sIG9wdGlvbnMpO1xuXG5jb25zdCBleHQgPSAoYSwgYiA9IHt9KSA9PiB7XG4gIGNvbnN0IHQgPSB7fTtcbiAgT2JqZWN0LmtleXMoYSkuZm9yRWFjaChrID0+IHRba10gPSBhW2tdKTtcbiAgT2JqZWN0LmtleXMoYikuZm9yRWFjaChrID0+IHRba10gPSBiW2tdKTtcbiAgcmV0dXJuIHRcbn07XG5cbm1pbmltYXRjaCQxLmRlZmF1bHRzID0gZGVmID0+IHtcbiAgaWYgKCFkZWYgfHwgdHlwZW9mIGRlZiAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5rZXlzKGRlZikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG1pbmltYXRjaCQxXG4gIH1cblxuICBjb25zdCBvcmlnID0gbWluaW1hdGNoJDE7XG5cbiAgY29uc3QgbSA9IChwLCBwYXR0ZXJuLCBvcHRpb25zKSA9PiBvcmlnKHAsIHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKTtcbiAgbS5NaW5pbWF0Y2ggPSBjbGFzcyBNaW5pbWF0Y2ggZXh0ZW5kcyBvcmlnLk1pbmltYXRjaCB7XG4gICAgY29uc3RydWN0b3IgKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICAgIHN1cGVyKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKTtcbiAgICB9XG4gIH07XG4gIG0uTWluaW1hdGNoLmRlZmF1bHRzID0gb3B0aW9ucyA9PiBvcmlnLmRlZmF1bHRzKGV4dChkZWYsIG9wdGlvbnMpKS5NaW5pbWF0Y2g7XG4gIG0uZmlsdGVyID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IG9yaWcuZmlsdGVyKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKTtcbiAgbS5kZWZhdWx0cyA9IG9wdGlvbnMgPT4gb3JpZy5kZWZhdWx0cyhleHQoZGVmLCBvcHRpb25zKSk7XG4gIG0ubWFrZVJlID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IG9yaWcubWFrZVJlKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKTtcbiAgbS5icmFjZUV4cGFuZCA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiBvcmlnLmJyYWNlRXhwYW5kKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKTtcbiAgbS5tYXRjaCA9IChsaXN0LCBwYXR0ZXJuLCBvcHRpb25zKSA9PiBvcmlnLm1hdGNoKGxpc3QsIHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKTtcblxuICByZXR1cm4gbVxufTtcblxuXG5cblxuXG4vLyBCcmFjZSBleHBhbnNpb246XG4vLyBhe2IsY31kIC0+IGFiZCBhY2Rcbi8vIGF7Yix9YyAtPiBhYmMgYWNcbi8vIGF7MC4uM31kIC0+IGEwZCBhMWQgYTJkIGEzZFxuLy8gYXtiLGN7ZCxlfWZ9ZyAtPiBhYmcgYWNkZmcgYWNlZmdcbi8vIGF7YixjfWR7ZSxmfWcgLT4gYWJkZWcgYWNkZWcgYWJkZWcgYWJkZmdcbi8vXG4vLyBJbnZhbGlkIHNldHMgYXJlIG5vdCBleHBhbmRlZC5cbi8vIGF7Mi4ufWIgLT4gYXsyLi59YlxuLy8gYXtifWMgLT4gYXtifWNcbm1pbmltYXRjaCQxLmJyYWNlRXhwYW5kID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IGJyYWNlRXhwYW5kKHBhdHRlcm4sIG9wdGlvbnMpO1xuXG5jb25zdCBicmFjZUV4cGFuZCA9IChwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IHtcbiAgYXNzZXJ0VmFsaWRQYXR0ZXJuKHBhdHRlcm4pO1xuXG4gIC8vIFRoYW5rcyB0byBZZXRpbmcgTGkgPGh0dHBzOi8vZ2l0aHViLmNvbS95ZXRpbmdsaT4gZm9yXG4gIC8vIGltcHJvdmluZyB0aGlzIHJlZ2V4cCB0byBhdm9pZCBhIFJlRE9TIHZ1bG5lcmFiaWxpdHkuXG4gIGlmIChvcHRpb25zLm5vYnJhY2UgfHwgIS9cXHsoPzooPyFcXHspLikqXFx9Ly50ZXN0KHBhdHRlcm4pKSB7XG4gICAgLy8gc2hvcnRjdXQuIG5vIG5lZWQgdG8gZXhwYW5kLlxuICAgIHJldHVybiBbcGF0dGVybl1cbiAgfVxuXG4gIHJldHVybiBleHBhbmQkMyhwYXR0ZXJuKVxufTtcblxuY29uc3QgTUFYX1BBVFRFUk5fTEVOR1RIID0gMTAyNCAqIDY0O1xuY29uc3QgYXNzZXJ0VmFsaWRQYXR0ZXJuID0gcGF0dGVybiA9PiB7XG4gIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHBhdHRlcm4nKVxuICB9XG5cbiAgaWYgKHBhdHRlcm4ubGVuZ3RoID4gTUFYX1BBVFRFUk5fTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGF0dGVybiBpcyB0b28gbG9uZycpXG4gIH1cbn07XG5cbi8vIHBhcnNlIGEgY29tcG9uZW50IG9mIHRoZSBleHBhbmRlZCBzZXQuXG4vLyBBdCB0aGlzIHBvaW50LCBubyBwYXR0ZXJuIG1heSBjb250YWluIFwiL1wiIGluIGl0XG4vLyBzbyB3ZSdyZSBnb2luZyB0byByZXR1cm4gYSAyZCBhcnJheSwgd2hlcmUgZWFjaCBlbnRyeSBpcyB0aGUgZnVsbFxuLy8gcGF0dGVybiwgc3BsaXQgb24gJy8nLCBhbmQgdGhlbiB0dXJuZWQgaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbi8vIEEgcmVnZXhwIGlzIG1hZGUgYXQgdGhlIGVuZCB3aGljaCBqb2lucyBlYWNoIGFycmF5IHdpdGggYW5cbi8vIGVzY2FwZWQgLywgYW5kIGFub3RoZXIgZnVsbCBvbmUgd2hpY2ggam9pbnMgZWFjaCByZWdleHAgd2l0aCB8LlxuLy9cbi8vIEZvbGxvd2luZyB0aGUgbGVhZCBvZiBCYXNoIDQuMSwgbm90ZSB0aGF0IFwiKipcIiBvbmx5IGhhcyBzcGVjaWFsIG1lYW5pbmdcbi8vIHdoZW4gaXQgaXMgdGhlICpvbmx5KiB0aGluZyBpbiBhIHBhdGggcG9ydGlvbi4gIE90aGVyd2lzZSwgYW55IHNlcmllc1xuLy8gb2YgKiBpcyBlcXVpdmFsZW50IHRvIGEgc2luZ2xlICouICBHbG9ic3RhciBiZWhhdmlvciBpcyBlbmFibGVkIGJ5XG4vLyBkZWZhdWx0LCBhbmQgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgb3B0aW9ucy5ub2dsb2JzdGFyLlxuY29uc3QgU1VCUEFSU0UgPSBTeW1ib2woJ3N1YnBhcnNlJyk7XG5cbm1pbmltYXRjaCQxLm1ha2VSZSA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PlxuICBuZXcgTWluaW1hdGNoJDEocGF0dGVybiwgb3B0aW9ucyB8fCB7fSkubWFrZVJlKCk7XG5cbm1pbmltYXRjaCQxLm1hdGNoID0gKGxpc3QsIHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCBtbSA9IG5ldyBNaW5pbWF0Y2gkMShwYXR0ZXJuLCBvcHRpb25zKTtcbiAgbGlzdCA9IGxpc3QuZmlsdGVyKGYgPT4gbW0ubWF0Y2goZikpO1xuICBpZiAobW0ub3B0aW9ucy5ub251bGwgJiYgIWxpc3QubGVuZ3RoKSB7XG4gICAgbGlzdC5wdXNoKHBhdHRlcm4pO1xuICB9XG4gIHJldHVybiBsaXN0XG59O1xuXG4vLyByZXBsYWNlIHN0dWZmIGxpa2UgXFwqIHdpdGggKlxuY29uc3QgZ2xvYlVuZXNjYXBlID0gcyA9PiBzLnJlcGxhY2UoL1xcXFwoLikvZywgJyQxJyk7XG5jb25zdCByZWdFeHBFc2NhcGUgPSBzID0+IHMucmVwbGFjZSgvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2csICdcXFxcJCYnKTtcblxubGV0IE1pbmltYXRjaCQxID0gY2xhc3MgTWluaW1hdGNoIHtcbiAgY29uc3RydWN0b3IgKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybik7XG5cbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTtcblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zZXQgPSBbXTtcbiAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuO1xuICAgIHRoaXMud2luZG93c1BhdGhzTm9Fc2NhcGUgPSAhIW9wdGlvbnMud2luZG93c1BhdGhzTm9Fc2NhcGUgfHxcbiAgICAgIG9wdGlvbnMuYWxsb3dXaW5kb3dzRXNjYXBlID09PSBmYWxzZTtcbiAgICBpZiAodGhpcy53aW5kb3dzUGF0aHNOb0VzY2FwZSkge1xuICAgICAgdGhpcy5wYXR0ZXJuID0gdGhpcy5wYXR0ZXJuLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICB9XG4gICAgdGhpcy5yZWdleHAgPSBudWxsO1xuICAgIHRoaXMubmVnYXRlID0gZmFsc2U7XG4gICAgdGhpcy5jb21tZW50ID0gZmFsc2U7XG4gICAgdGhpcy5lbXB0eSA9IGZhbHNlO1xuICAgIHRoaXMucGFydGlhbCA9ICEhb3B0aW9ucy5wYXJ0aWFsO1xuXG4gICAgLy8gbWFrZSB0aGUgc2V0IG9mIHJlZ2V4cHMgZXRjLlxuICAgIHRoaXMubWFrZSgpO1xuICB9XG5cbiAgZGVidWcgKCkge31cblxuICBtYWtlICgpIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5wYXR0ZXJuO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBlbXB0eSBwYXR0ZXJucyBhbmQgY29tbWVudHMgbWF0Y2ggbm90aGluZy5cbiAgICBpZiAoIW9wdGlvbnMubm9jb21tZW50ICYmIHBhdHRlcm4uY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgIHRoaXMuY29tbWVudCA9IHRydWU7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgICB0aGlzLmVtcHR5ID0gdHJ1ZTtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHN0ZXAgMTogZmlndXJlIG91dCBuZWdhdGlvbiwgZXRjLlxuICAgIHRoaXMucGFyc2VOZWdhdGUoKTtcblxuICAgIC8vIHN0ZXAgMjogZXhwYW5kIGJyYWNlc1xuICAgIGxldCBzZXQgPSB0aGlzLmdsb2JTZXQgPSB0aGlzLmJyYWNlRXhwYW5kKCk7XG5cbiAgICBpZiAob3B0aW9ucy5kZWJ1ZykgdGhpcy5kZWJ1ZyA9ICguLi5hcmdzKSA9PiBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuXG4gICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHNldCk7XG5cbiAgICAvLyBzdGVwIDM6IG5vdyB3ZSBoYXZlIGEgc2V0LCBzbyB0dXJuIGVhY2ggb25lIGludG8gYSBzZXJpZXMgb2YgcGF0aC1wb3J0aW9uXG4gICAgLy8gbWF0Y2hpbmcgcGF0dGVybnMuXG4gICAgLy8gVGhlc2Ugd2lsbCBiZSByZWdleHBzLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgXCIqKlwiLCB3aGljaCBpc1xuICAgIC8vIHNldCB0byB0aGUgR0xPQlNUQVIgb2JqZWN0IGZvciBnbG9ic3RhciBiZWhhdmlvcixcbiAgICAvLyBhbmQgd2lsbCBub3QgY29udGFpbiBhbnkgLyBjaGFyYWN0ZXJzXG4gICAgc2V0ID0gdGhpcy5nbG9iUGFydHMgPSBzZXQubWFwKHMgPT4gcy5zcGxpdChzbGFzaFNwbGl0KSk7XG5cbiAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgc2V0KTtcblxuICAgIC8vIGdsb2IgLS0+IHJlZ2V4cHNcbiAgICBzZXQgPSBzZXQubWFwKChzLCBzaSwgc2V0KSA9PiBzLm1hcCh0aGlzLnBhcnNlLCB0aGlzKSk7XG5cbiAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgc2V0KTtcblxuICAgIC8vIGZpbHRlciBvdXQgZXZlcnl0aGluZyB0aGF0IGRpZG4ndCBjb21waWxlIHByb3Blcmx5LlxuICAgIHNldCA9IHNldC5maWx0ZXIocyA9PiBzLmluZGV4T2YoZmFsc2UpID09PSAtMSk7XG5cbiAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgc2V0KTtcblxuICAgIHRoaXMuc2V0ID0gc2V0O1xuICB9XG5cbiAgcGFyc2VOZWdhdGUgKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubm9uZWdhdGUpIHJldHVyblxuXG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMucGF0dGVybjtcbiAgICBsZXQgbmVnYXRlID0gZmFsc2U7XG4gICAgbGV0IG5lZ2F0ZU9mZnNldCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoICYmIHBhdHRlcm4uY2hhckF0KGkpID09PSAnISc7IGkrKykge1xuICAgICAgbmVnYXRlID0gIW5lZ2F0ZTtcbiAgICAgIG5lZ2F0ZU9mZnNldCsrO1xuICAgIH1cblxuICAgIGlmIChuZWdhdGVPZmZzZXQpIHRoaXMucGF0dGVybiA9IHBhdHRlcm4uc3Vic3RyKG5lZ2F0ZU9mZnNldCk7XG4gICAgdGhpcy5uZWdhdGUgPSBuZWdhdGU7XG4gIH1cblxuICAvLyBzZXQgcGFydGlhbCB0byB0cnVlIHRvIHRlc3QgaWYsIGZvciBleGFtcGxlLFxuICAvLyBcIi9hL2JcIiBtYXRjaGVzIHRoZSBzdGFydCBvZiBcIi8qL2IvKi9kXCJcbiAgLy8gUGFydGlhbCBtZWFucywgaWYgeW91IHJ1biBvdXQgb2YgZmlsZSBiZWZvcmUgeW91IHJ1blxuICAvLyBvdXQgb2YgcGF0dGVybiwgdGhlbiB0aGF0J3MgZmluZSwgYXMgbG9uZyBhcyBhbGxcbiAgLy8gdGhlIHBhcnRzIG1hdGNoLlxuICBtYXRjaE9uZSAoZmlsZSwgcGF0dGVybiwgcGFydGlhbCkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgdGhpcy5kZWJ1ZygnbWF0Y2hPbmUnLFxuICAgICAgeyAndGhpcyc6IHRoaXMsIGZpbGU6IGZpbGUsIHBhdHRlcm46IHBhdHRlcm4gfSk7XG5cbiAgICB0aGlzLmRlYnVnKCdtYXRjaE9uZScsIGZpbGUubGVuZ3RoLCBwYXR0ZXJuLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBmaSA9IDAsXG4gICAgICAgIHBpID0gMCxcbiAgICAgICAgZmwgPSBmaWxlLmxlbmd0aCxcbiAgICAgICAgcGwgPSBwYXR0ZXJuLmxlbmd0aFxuICAgICAgICA7IChmaSA8IGZsKSAmJiAocGkgPCBwbClcbiAgICAgICAgOyBmaSsrLCBwaSsrKSB7XG4gICAgICB0aGlzLmRlYnVnKCdtYXRjaE9uZSBsb29wJyk7XG4gICAgICB2YXIgcCA9IHBhdHRlcm5bcGldO1xuICAgICAgdmFyIGYgPSBmaWxlW2ZpXTtcblxuICAgICAgdGhpcy5kZWJ1ZyhwYXR0ZXJuLCBwLCBmKTtcblxuICAgICAgLy8gc2hvdWxkIGJlIGltcG9zc2libGUuXG4gICAgICAvLyBzb21lIGludmFsaWQgcmVnZXhwIHN0dWZmIGluIHRoZSBzZXQuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmIChwID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGlmIChwID09PSBHTE9CU1RBUiQyKSB7XG4gICAgICAgIHRoaXMuZGVidWcoJ0dMT0JTVEFSJywgW3BhdHRlcm4sIHAsIGZdKTtcblxuICAgICAgICAvLyBcIioqXCJcbiAgICAgICAgLy8gYS8qKi9iLyoqL2Mgd291bGQgbWF0Y2ggdGhlIGZvbGxvd2luZzpcbiAgICAgICAgLy8gYS9iL3gveS96L2NcbiAgICAgICAgLy8gYS94L3kvei9iL2NcbiAgICAgICAgLy8gYS9iL3gvYi94L2NcbiAgICAgICAgLy8gYS9iL2NcbiAgICAgICAgLy8gVG8gZG8gdGhpcywgdGFrZSB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybiBhZnRlclxuICAgICAgICAvLyB0aGUgKiosIGFuZCBzZWUgaWYgaXQgd291bGQgbWF0Y2ggdGhlIGZpbGUgcmVtYWluZGVyLlxuICAgICAgICAvLyBJZiBzbywgcmV0dXJuIHN1Y2Nlc3MuXG4gICAgICAgIC8vIElmIG5vdCwgdGhlICoqIFwic3dhbGxvd3NcIiBhIHNlZ21lbnQsIGFuZCB0cnkgYWdhaW4uXG4gICAgICAgIC8vIFRoaXMgaXMgcmVjdXJzaXZlbHkgYXdmdWwuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGEvKiovYi8qKi9jIG1hdGNoaW5nIGEvYi94L3kvei9jXG4gICAgICAgIC8vIC0gYSBtYXRjaGVzIGFcbiAgICAgICAgLy8gLSBkb3VibGVzdGFyXG4gICAgICAgIC8vICAgLSBtYXRjaE9uZShiL3gveS96L2MsIGIvKiovYylcbiAgICAgICAgLy8gICAgIC0gYiBtYXRjaGVzIGJcbiAgICAgICAgLy8gICAgIC0gZG91Ymxlc3RhclxuICAgICAgICAvLyAgICAgICAtIG1hdGNoT25lKHgveS96L2MsIGMpIC0+IG5vXG4gICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoeS96L2MsIGMpIC0+IG5vXG4gICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoei9jLCBjKSAtPiBub1xuICAgICAgICAvLyAgICAgICAtIG1hdGNoT25lKGMsIGMpIHllcywgaGl0XG4gICAgICAgIHZhciBmciA9IGZpO1xuICAgICAgICB2YXIgcHIgPSBwaSArIDE7XG4gICAgICAgIGlmIChwciA9PT0gcGwpIHtcbiAgICAgICAgICB0aGlzLmRlYnVnKCcqKiBhdCB0aGUgZW5kJyk7XG4gICAgICAgICAgLy8gYSAqKiBhdCB0aGUgZW5kIHdpbGwganVzdCBzd2FsbG93IHRoZSByZXN0LlxuICAgICAgICAgIC8vIFdlIGhhdmUgZm91bmQgYSBtYXRjaC5cbiAgICAgICAgICAvLyBob3dldmVyLCBpdCB3aWxsIG5vdCBzd2FsbG93IC8ueCwgdW5sZXNzXG4gICAgICAgICAgLy8gb3B0aW9ucy5kb3QgaXMgc2V0LlxuICAgICAgICAgIC8vIC4gYW5kIC4uIGFyZSAqbmV2ZXIqIG1hdGNoZWQgYnkgKiosIGZvciBleHBsb3NpdmVseVxuICAgICAgICAgIC8vIGV4cG9uZW50aWFsIHJlYXNvbnMuXG4gICAgICAgICAgZm9yICg7IGZpIDwgZmw7IGZpKyspIHtcbiAgICAgICAgICAgIGlmIChmaWxlW2ZpXSA9PT0gJy4nIHx8IGZpbGVbZmldID09PSAnLi4nIHx8XG4gICAgICAgICAgICAgICghb3B0aW9ucy5kb3QgJiYgZmlsZVtmaV0uY2hhckF0KDApID09PSAnLicpKSByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9rLCBsZXQncyBzZWUgaWYgd2UgY2FuIHN3YWxsb3cgd2hhdGV2ZXIgd2UgY2FuLlxuICAgICAgICB3aGlsZSAoZnIgPCBmbCkge1xuICAgICAgICAgIHZhciBzd2FsbG93ZWUgPSBmaWxlW2ZyXTtcblxuICAgICAgICAgIHRoaXMuZGVidWcoJ1xcbmdsb2JzdGFyIHdoaWxlJywgZmlsZSwgZnIsIHBhdHRlcm4sIHByLCBzd2FsbG93ZWUpO1xuXG4gICAgICAgICAgLy8gWFhYIHJlbW92ZSB0aGlzIHNsaWNlLiAgSnVzdCBwYXNzIHRoZSBzdGFydCBpbmRleC5cbiAgICAgICAgICBpZiAodGhpcy5tYXRjaE9uZShmaWxlLnNsaWNlKGZyKSwgcGF0dGVybi5zbGljZShwciksIHBhcnRpYWwpKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKCdnbG9ic3RhciBmb3VuZCBtYXRjaCEnLCBmciwgZmwsIHN3YWxsb3dlZSk7XG4gICAgICAgICAgICAvLyBmb3VuZCBhIG1hdGNoLlxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY2FuJ3Qgc3dhbGxvdyBcIi5cIiBvciBcIi4uXCIgZXZlci5cbiAgICAgICAgICAgIC8vIGNhbiBvbmx5IHN3YWxsb3cgXCIuZm9vXCIgd2hlbiBleHBsaWNpdGx5IGFza2VkLlxuICAgICAgICAgICAgaWYgKHN3YWxsb3dlZSA9PT0gJy4nIHx8IHN3YWxsb3dlZSA9PT0gJy4uJyB8fFxuICAgICAgICAgICAgICAoIW9wdGlvbnMuZG90ICYmIHN3YWxsb3dlZS5jaGFyQXQoMCkgPT09ICcuJykpIHtcbiAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnZG90IGRldGVjdGVkIScsIGZpbGUsIGZyLCBwYXR0ZXJuLCBwcik7XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vICoqIHN3YWxsb3dzIGEgc2VnbWVudCwgYW5kIGNvbnRpbnVlLlxuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnZ2xvYnN0YXIgc3dhbGxvdyBhIHNlZ21lbnQsIGFuZCBjb250aW51ZScpO1xuICAgICAgICAgICAgZnIrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBubyBtYXRjaCB3YXMgZm91bmQuXG4gICAgICAgIC8vIEhvd2V2ZXIsIGluIHBhcnRpYWwgbW9kZSwgd2UgY2FuJ3Qgc2F5IHRoaXMgaXMgbmVjZXNzYXJpbHkgb3Zlci5cbiAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlICpwYXR0ZXJuKiBsZWZ0LCB0aGVuXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocGFydGlhbCkge1xuICAgICAgICAgIC8vIHJhbiBvdXQgb2YgZmlsZVxuICAgICAgICAgIHRoaXMuZGVidWcoJ1xcbj4+PiBubyBtYXRjaCwgcGFydGlhbD8nLCBmaWxlLCBmciwgcGF0dGVybiwgcHIpO1xuICAgICAgICAgIGlmIChmciA9PT0gZmwpIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIHNvbWV0aGluZyBvdGhlciB0aGFuICoqXG4gICAgICAvLyBub24tbWFnaWMgcGF0dGVybnMganVzdCBoYXZlIHRvIG1hdGNoIGV4YWN0bHlcbiAgICAgIC8vIHBhdHRlcm5zIHdpdGggbWFnaWMgaGF2ZSBiZWVuIHR1cm5lZCBpbnRvIHJlZ2V4cHMuXG4gICAgICB2YXIgaGl0O1xuICAgICAgaWYgKHR5cGVvZiBwID09PSAnc3RyaW5nJykge1xuICAgICAgICBoaXQgPSBmID09PSBwO1xuICAgICAgICB0aGlzLmRlYnVnKCdzdHJpbmcgbWF0Y2gnLCBwLCBmLCBoaXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGl0ID0gZi5tYXRjaChwKTtcbiAgICAgICAgdGhpcy5kZWJ1ZygncGF0dGVybiBtYXRjaCcsIHAsIGYsIGhpdCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghaGl0KSByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBlbmRpbmcgaW4gLyBtZWFucyB0aGF0IHdlJ2xsIGdldCBhIGZpbmFsIFwiXCJcbiAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLiAgVGhpcyBjYW4gb25seSBtYXRjaCBhXG4gICAgLy8gY29ycmVzcG9uZGluZyBcIlwiIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gICAgLy8gSWYgdGhlIGZpbGUgZW5kcyBpbiAvLCB0aGVuIGl0IGNhbiBvbmx5IG1hdGNoIGFcbiAgICAvLyBhIHBhdHRlcm4gdGhhdCBlbmRzIGluIC8sIHVubGVzcyB0aGUgcGF0dGVybiBqdXN0XG4gICAgLy8gZG9lc24ndCBoYXZlIGFueSBtb3JlIGZvciBpdC4gQnV0LCBhL2IvIHNob3VsZCAqbm90KlxuICAgIC8vIG1hdGNoIFwiYS9iLypcIiwgZXZlbiB0aG91Z2ggXCJcIiBtYXRjaGVzIGFnYWluc3QgdGhlXG4gICAgLy8gW14vXSo/IHBhdHRlcm4sIGV4Y2VwdCBpbiBwYXJ0aWFsIG1vZGUsIHdoZXJlIGl0IG1pZ2h0XG4gICAgLy8gc2ltcGx5IG5vdCBiZSByZWFjaGVkIHlldC5cbiAgICAvLyBIb3dldmVyLCBhL2IvIHNob3VsZCBzdGlsbCBzYXRpc2Z5IGEvKlxuXG4gICAgLy8gbm93IGVpdGhlciB3ZSBmZWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLCBvciB3ZSdyZSBkb25lLlxuICAgIGlmIChmaSA9PT0gZmwgJiYgcGkgPT09IHBsKSB7XG4gICAgICAvLyByYW4gb3V0IG9mIHBhdHRlcm4gYW5kIGZpbGVuYW1lIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgICAvLyBhbiBleGFjdCBoaXQhXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoZmkgPT09IGZsKSB7XG4gICAgICAvLyByYW4gb3V0IG9mIGZpbGUsIGJ1dCBzdGlsbCBoYWQgcGF0dGVybiBsZWZ0LlxuICAgICAgLy8gdGhpcyBpcyBvayBpZiB3ZSdyZSBkb2luZyB0aGUgbWF0Y2ggYXMgcGFydCBvZlxuICAgICAgLy8gYSBnbG9iIGZzIHRyYXZlcnNhbC5cbiAgICAgIHJldHVybiBwYXJ0aWFsXG4gICAgfSBlbHNlIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovIGlmIChwaSA9PT0gcGwpIHtcbiAgICAgIC8vIHJhbiBvdXQgb2YgcGF0dGVybiwgc3RpbGwgaGF2ZSBmaWxlIGxlZnQuXG4gICAgICAvLyB0aGlzIGlzIG9ubHkgYWNjZXB0YWJsZSBpZiB3ZSdyZSBvbiB0aGUgdmVyeSBsYXN0XG4gICAgICAvLyBlbXB0eSBzZWdtZW50IG9mIGEgZmlsZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2guXG4gICAgICAvLyBhLyogc2hvdWxkIG1hdGNoIGEvYi9cbiAgICAgIHJldHVybiAoZmkgPT09IGZsIC0gMSkgJiYgKGZpbGVbZmldID09PSAnJylcbiAgICB9XG5cbiAgICAvLyBzaG91bGQgYmUgdW5yZWFjaGFibGUuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3d0Zj8nKVxuICB9XG5cbiAgYnJhY2VFeHBhbmQgKCkge1xuICAgIHJldHVybiBicmFjZUV4cGFuZCh0aGlzLnBhdHRlcm4sIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIHBhcnNlIChwYXR0ZXJuLCBpc1N1Yikge1xuICAgIGFzc2VydFZhbGlkUGF0dGVybihwYXR0ZXJuKTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBzaG9ydGN1dHNcbiAgICBpZiAocGF0dGVybiA9PT0gJyoqJykge1xuICAgICAgaWYgKCFvcHRpb25zLm5vZ2xvYnN0YXIpXG4gICAgICAgIHJldHVybiBHTE9CU1RBUiQyXG4gICAgICBlbHNlXG4gICAgICAgIHBhdHRlcm4gPSAnKic7XG4gICAgfVxuICAgIGlmIChwYXR0ZXJuID09PSAnJykgcmV0dXJuICcnXG5cbiAgICBsZXQgcmUgPSAnJztcbiAgICBsZXQgaGFzTWFnaWMgPSAhIW9wdGlvbnMubm9jYXNlO1xuICAgIGxldCBlc2NhcGluZyA9IGZhbHNlO1xuICAgIC8vID8gPT4gb25lIHNpbmdsZSBjaGFyYWN0ZXJcbiAgICBjb25zdCBwYXR0ZXJuTGlzdFN0YWNrID0gW107XG4gICAgY29uc3QgbmVnYXRpdmVMaXN0cyA9IFtdO1xuICAgIGxldCBzdGF0ZUNoYXI7XG4gICAgbGV0IGluQ2xhc3MgPSBmYWxzZTtcbiAgICBsZXQgcmVDbGFzc1N0YXJ0ID0gLTE7XG4gICAgbGV0IGNsYXNzU3RhcnQgPSAtMTtcbiAgICBsZXQgY3M7XG4gICAgbGV0IHBsO1xuICAgIGxldCBzcDtcbiAgICAvLyAuIGFuZCAuLiBuZXZlciBtYXRjaCBhbnl0aGluZyB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCAuLFxuICAgIC8vIGV2ZW4gd2hlbiBvcHRpb25zLmRvdCBpcyBzZXQuXG4gICAgY29uc3QgcGF0dGVyblN0YXJ0ID0gcGF0dGVybi5jaGFyQXQoMCkgPT09ICcuJyA/ICcnIC8vIGFueXRoaW5nXG4gICAgLy8gbm90IChzdGFydCBvciAvIGZvbGxvd2VkIGJ5IC4gb3IgLi4gZm9sbG93ZWQgYnkgLyBvciBlbmQpXG4gICAgOiBvcHRpb25zLmRvdCA/ICcoPyEoPzpefFxcXFxcXC8pXFxcXC57MSwyfSg/OiR8XFxcXFxcLykpJ1xuICAgIDogJyg/IVxcXFwuKSc7XG5cbiAgICBjb25zdCBjbGVhclN0YXRlQ2hhciA9ICgpID0+IHtcbiAgICAgIGlmIChzdGF0ZUNoYXIpIHtcbiAgICAgICAgLy8gd2UgaGFkIHNvbWUgc3RhdGUtdHJhY2tpbmcgY2hhcmFjdGVyXG4gICAgICAgIC8vIHRoYXQgd2Fzbid0IGNvbnN1bWVkIGJ5IHRoaXMgcGFzcy5cbiAgICAgICAgc3dpdGNoIChzdGF0ZUNoYXIpIHtcbiAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgIHJlICs9IHN0YXI7XG4gICAgICAgICAgICBoYXNNYWdpYyA9IHRydWU7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICc/JzpcbiAgICAgICAgICAgIHJlICs9IHFtYXJrO1xuICAgICAgICAgICAgaGFzTWFnaWMgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJlICs9ICdcXFxcJyArIHN0YXRlQ2hhcjtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVidWcoJ2NsZWFyU3RhdGVDaGFyICVqICVqJywgc3RhdGVDaGFyLCByZSk7XG4gICAgICAgIHN0YXRlQ2hhciA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGxldCBpID0gMCwgYzsgKGkgPCBwYXR0ZXJuLmxlbmd0aCkgJiYgKGMgPSBwYXR0ZXJuLmNoYXJBdChpKSk7IGkrKykge1xuICAgICAgdGhpcy5kZWJ1ZygnJXNcXHQlcyAlcyAlaicsIHBhdHRlcm4sIGksIHJlLCBjKTtcblxuICAgICAgLy8gc2tpcCBvdmVyIGFueSB0aGF0IGFyZSBlc2NhcGVkLlxuICAgICAgaWYgKGVzY2FwaW5nKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gY29tcGxldGVseSBub3QgYWxsb3dlZCwgZXZlbiBlc2NhcGVkLiAqL1xuICAgICAgICBpZiAoYyA9PT0gJy8nKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVTcGVjaWFsc1tjXSkge1xuICAgICAgICAgIHJlICs9ICdcXFxcJztcbiAgICAgICAgfVxuICAgICAgICByZSArPSBjO1xuICAgICAgICBlc2NhcGluZyA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgY2FzZSAnLyc6IHtcbiAgICAgICAgICAvLyBTaG91bGQgYWxyZWFkeSBiZSBwYXRoLXNwbGl0IGJ5IG5vdy5cbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1xcXFwnOlxuICAgICAgICAgIGNsZWFyU3RhdGVDaGFyKCk7XG4gICAgICAgICAgZXNjYXBpbmcgPSB0cnVlO1xuICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIC8vIHRoZSB2YXJpb3VzIHN0YXRlQ2hhciB2YWx1ZXNcbiAgICAgICAgLy8gZm9yIHRoZSBcImV4dGdsb2JcIiBzdHVmZi5cbiAgICAgICAgY2FzZSAnPyc6XG4gICAgICAgIGNhc2UgJyonOlxuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgY2FzZSAnQCc6XG4gICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgIHRoaXMuZGVidWcoJyVzXFx0JXMgJXMgJWogPC0tIHN0YXRlQ2hhcicsIHBhdHRlcm4sIGksIHJlLCBjKTtcblxuICAgICAgICAgIC8vIGFsbCBvZiB0aG9zZSBhcmUgbGl0ZXJhbHMgaW5zaWRlIGEgY2xhc3MsIGV4Y2VwdCB0aGF0XG4gICAgICAgICAgLy8gdGhlIGdsb2IgWyFhXSBtZWFucyBbXmFdIGluIHJlZ2V4cFxuICAgICAgICAgIGlmIChpbkNsYXNzKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKCcgIGluIGNsYXNzJyk7XG4gICAgICAgICAgICBpZiAoYyA9PT0gJyEnICYmIGkgPT09IGNsYXNzU3RhcnQgKyAxKSBjID0gJ14nO1xuICAgICAgICAgICAgcmUgKz0gYztcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3RhdGVDaGFyLCB0aGVuIGl0IG1lYW5zXG4gICAgICAgICAgLy8gdGhhdCB0aGVyZSB3YXMgc29tZXRoaW5nIGxpa2UgKiogb3IgKz8gaW4gdGhlcmUuXG4gICAgICAgICAgLy8gSGFuZGxlIHRoZSBzdGF0ZUNoYXIsIHRoZW4gcHJvY2VlZCB3aXRoIHRoaXMgb25lLlxuICAgICAgICAgIHRoaXMuZGVidWcoJ2NhbGwgY2xlYXJTdGF0ZUNoYXIgJWonLCBzdGF0ZUNoYXIpO1xuICAgICAgICAgIGNsZWFyU3RhdGVDaGFyKCk7XG4gICAgICAgICAgc3RhdGVDaGFyID0gYztcbiAgICAgICAgICAvLyBpZiBleHRnbG9iIGlzIGRpc2FibGVkLCB0aGVuICsoYXNkZnxmb28pIGlzbid0IGEgdGhpbmcuXG4gICAgICAgICAgLy8ganVzdCBjbGVhciB0aGUgc3RhdGVjaGFyICpub3cqLCByYXRoZXIgdGhhbiBldmVuIGRpdmluZyBpbnRvXG4gICAgICAgICAgLy8gdGhlIHBhdHRlcm5MaXN0IHN0dWZmLlxuICAgICAgICAgIGlmIChvcHRpb25zLm5vZXh0KSBjbGVhclN0YXRlQ2hhcigpO1xuICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgJygnOlxuICAgICAgICAgIGlmIChpbkNsYXNzKSB7XG4gICAgICAgICAgICByZSArPSAnKCc7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc3RhdGVDaGFyKSB7XG4gICAgICAgICAgICByZSArPSAnXFxcXCgnO1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXR0ZXJuTGlzdFN0YWNrLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogc3RhdGVDaGFyLFxuICAgICAgICAgICAgc3RhcnQ6IGkgLSAxLFxuICAgICAgICAgICAgcmVTdGFydDogcmUubGVuZ3RoLFxuICAgICAgICAgICAgb3BlbjogcGxUeXBlc1tzdGF0ZUNoYXJdLm9wZW4sXG4gICAgICAgICAgICBjbG9zZTogcGxUeXBlc1tzdGF0ZUNoYXJdLmNsb3NlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gbmVnYXRpb24gaXMgKD86KD8hanMpW14vXSopXG4gICAgICAgICAgcmUgKz0gc3RhdGVDaGFyID09PSAnIScgPyAnKD86KD8hKD86JyA6ICcoPzonO1xuICAgICAgICAgIHRoaXMuZGVidWcoJ3BsVHlwZSAlaiAlaicsIHN0YXRlQ2hhciwgcmUpO1xuICAgICAgICAgIHN0YXRlQ2hhciA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgJyknOlxuICAgICAgICAgIGlmIChpbkNsYXNzIHx8ICFwYXR0ZXJuTGlzdFN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgcmUgKz0gJ1xcXFwpJztcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2xlYXJTdGF0ZUNoYXIoKTtcbiAgICAgICAgICBoYXNNYWdpYyA9IHRydWU7XG4gICAgICAgICAgcGwgPSBwYXR0ZXJuTGlzdFN0YWNrLnBvcCgpO1xuICAgICAgICAgIC8vIG5lZ2F0aW9uIGlzICg/Oig/IWpzKVteL10qKVxuICAgICAgICAgIC8vIFRoZSBvdGhlcnMgYXJlICg/OjxwYXR0ZXJuPik8dHlwZT5cbiAgICAgICAgICByZSArPSBwbC5jbG9zZTtcbiAgICAgICAgICBpZiAocGwudHlwZSA9PT0gJyEnKSB7XG4gICAgICAgICAgICBuZWdhdGl2ZUxpc3RzLnB1c2gocGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwbC5yZUVuZCA9IHJlLmxlbmd0aDtcbiAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgICBpZiAoaW5DbGFzcyB8fCAhcGF0dGVybkxpc3RTdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlICs9ICdcXFxcfCc7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNsZWFyU3RhdGVDaGFyKCk7XG4gICAgICAgICAgcmUgKz0gJ3wnO1xuICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIC8vIHRoZXNlIGFyZSBtb3N0bHkgdGhlIHNhbWUgaW4gcmVnZXhwIGFuZCBnbG9iXG4gICAgICAgIGNhc2UgJ1snOlxuICAgICAgICAgIC8vIHN3YWxsb3cgYW55IHN0YXRlLXRyYWNraW5nIGNoYXIgYmVmb3JlIHRoZSBbXG4gICAgICAgICAgY2xlYXJTdGF0ZUNoYXIoKTtcblxuICAgICAgICAgIGlmIChpbkNsYXNzKSB7XG4gICAgICAgICAgICByZSArPSAnXFxcXCcgKyBjO1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbkNsYXNzID0gdHJ1ZTtcbiAgICAgICAgICBjbGFzc1N0YXJ0ID0gaTtcbiAgICAgICAgICByZUNsYXNzU3RhcnQgPSByZS5sZW5ndGg7XG4gICAgICAgICAgcmUgKz0gYztcbiAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAvLyAgYSByaWdodCBicmFja2V0IHNoYWxsIGxvc2UgaXRzIHNwZWNpYWxcbiAgICAgICAgICAvLyAgbWVhbmluZyBhbmQgcmVwcmVzZW50IGl0c2VsZiBpblxuICAgICAgICAgIC8vICBhIGJyYWNrZXQgZXhwcmVzc2lvbiBpZiBpdCBvY2N1cnNcbiAgICAgICAgICAvLyAgZmlyc3QgaW4gdGhlIGxpc3QuICAtLSBQT1NJWC4yIDIuOC4zLjJcbiAgICAgICAgICBpZiAoaSA9PT0gY2xhc3NTdGFydCArIDEgfHwgIWluQ2xhc3MpIHtcbiAgICAgICAgICAgIHJlICs9ICdcXFxcJyArIGM7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBsZWZ0IGEgY2xhc3Mgb3Blbi5cbiAgICAgICAgICAvLyBcIlt6LWFdXCIgaXMgdmFsaWQsIGVxdWl2YWxlbnQgdG8gXCJcXFt6LWFcXF1cIlxuICAgICAgICAgIC8vIHNwbGl0IHdoZXJlIHRoZSBsYXN0IFsgd2FzLCBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAgIC8vIGFuIGludmFsaWQgcmUuIGlmIHNvLCByZS13YWxrIHRoZSBjb250ZW50cyBvZiB0aGVcbiAgICAgICAgICAvLyB3b3VsZC1iZSBjbGFzcyB0byByZS10cmFuc2xhdGUgYW55IGNoYXJhY3RlcnMgdGhhdFxuICAgICAgICAgIC8vIHdlcmUgcGFzc2VkIHRocm91Z2ggYXMtaXNcbiAgICAgICAgICAvLyBUT0RPOiBJdCB3b3VsZCBwcm9iYWJseSBiZSBmYXN0ZXIgdG8gZGV0ZXJtaW5lIHRoaXNcbiAgICAgICAgICAvLyB3aXRob3V0IGEgdHJ5L2NhdGNoIGFuZCBhIG5ldyBSZWdFeHAsIGJ1dCBpdCdzIHRyaWNreVxuICAgICAgICAgIC8vIHRvIGRvIHNhZmVseS4gIEZvciBub3csIHRoaXMgaXMgc2FmZSBhbmQgd29ya3MuXG4gICAgICAgICAgY3MgPSBwYXR0ZXJuLnN1YnN0cmluZyhjbGFzc1N0YXJ0ICsgMSwgaSk7XG5cbiAgICAgICAgICAvLyBmaW5pc2ggdXAgdGhlIGNsYXNzLlxuICAgICAgICAgIGhhc01hZ2ljID0gdHJ1ZTtcbiAgICAgICAgICBpbkNsYXNzID0gZmFsc2U7XG4gICAgICAgICAgcmUgKz0gYztcbiAgICAgICAgY29udGludWVcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIHN3YWxsb3cgYW55IHN0YXRlIGNoYXIgdGhhdCB3YXNuJ3QgY29uc3VtZWRcbiAgICAgICAgICBjbGVhclN0YXRlQ2hhcigpO1xuXG4gICAgICAgICAgaWYgKHJlU3BlY2lhbHNbY10gJiYgIShjID09PSAnXicgJiYgaW5DbGFzcykpIHtcbiAgICAgICAgICAgIHJlICs9ICdcXFxcJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZSArPSBjO1xuICAgICAgICAgIGJyZWFrXG5cbiAgICAgIH0gLy8gc3dpdGNoXG4gICAgfSAvLyBmb3JcblxuICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBsZWZ0IGEgY2xhc3Mgb3Blbi5cbiAgICAvLyBcIlthYmNcIiBpcyB2YWxpZCwgZXF1aXZhbGVudCB0byBcIlxcW2FiY1wiXG4gICAgaWYgKGluQ2xhc3MpIHtcbiAgICAgIC8vIHNwbGl0IHdoZXJlIHRoZSBsYXN0IFsgd2FzLCBhbmQgZXNjYXBlIGl0XG4gICAgICAvLyB0aGlzIGlzIGEgaHVnZSBwaXRhLiAgV2Ugbm93IGhhdmUgdG8gcmUtd2Fsa1xuICAgICAgLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSB3b3VsZC1iZSBjbGFzcyB0byByZS10cmFuc2xhdGVcbiAgICAgIC8vIGFueSBjaGFyYWN0ZXJzIHRoYXQgd2VyZSBwYXNzZWQgdGhyb3VnaCBhcy1pc1xuICAgICAgY3MgPSBwYXR0ZXJuLnN1YnN0cihjbGFzc1N0YXJ0ICsgMSk7XG4gICAgICBzcCA9IHRoaXMucGFyc2UoY3MsIFNVQlBBUlNFKTtcbiAgICAgIHJlID0gcmUuc3Vic3RyKDAsIHJlQ2xhc3NTdGFydCkgKyAnXFxcXFsnICsgc3BbMF07XG4gICAgICBoYXNNYWdpYyA9IGhhc01hZ2ljIHx8IHNwWzFdO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBoYWQgYSArKCB0aGluZyBhdCB0aGUgKmVuZCpcbiAgICAvLyBvZiB0aGUgcGF0dGVybi5cbiAgICAvLyBlYWNoIHBhdHRlcm4gbGlzdCBzdGFjayBhZGRzIDMgY2hhcnMsIGFuZCB3ZSBuZWVkIHRvIGdvIHRocm91Z2hcbiAgICAvLyBhbmQgZXNjYXBlIGFueSB8IGNoYXJzIHRoYXQgd2VyZSBwYXNzZWQgdGhyb3VnaCBhcy1pcyBmb3IgdGhlIHJlZ2V4cC5cbiAgICAvLyBHbyB0aHJvdWdoIGFuZCBlc2NhcGUgdGhlbSwgdGFraW5nIGNhcmUgbm90IHRvIGRvdWJsZS1lc2NhcGUgYW55XG4gICAgLy8gfCBjaGFycyB0aGF0IHdlcmUgYWxyZWFkeSBlc2NhcGVkLlxuICAgIGZvciAocGwgPSBwYXR0ZXJuTGlzdFN0YWNrLnBvcCgpOyBwbDsgcGwgPSBwYXR0ZXJuTGlzdFN0YWNrLnBvcCgpKSB7XG4gICAgICBsZXQgdGFpbDtcbiAgICAgIHRhaWwgPSByZS5zbGljZShwbC5yZVN0YXJ0ICsgcGwub3Blbi5sZW5ndGgpO1xuICAgICAgdGhpcy5kZWJ1Zygnc2V0dGluZyB0YWlsJywgcmUsIHBsKTtcbiAgICAgIC8vIG1heWJlIHNvbWUgZXZlbiBudW1iZXIgb2YgXFwsIHRoZW4gbWF5YmUgMSBcXCwgZm9sbG93ZWQgYnkgYSB8XG4gICAgICB0YWlsID0gdGFpbC5yZXBsYWNlKC8oKD86XFxcXHsyfSl7MCw2NH0pKFxcXFw/KVxcfC9nLCAoXywgJDEsICQyKSA9PiB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlIC0gc2hvdWxkIGFscmVhZHkgYmUgZG9uZSAqL1xuICAgICAgICBpZiAoISQyKSB7XG4gICAgICAgICAgLy8gdGhlIHwgaXNuJ3QgYWxyZWFkeSBlc2NhcGVkLCBzbyBlc2NhcGUgaXQuXG4gICAgICAgICAgJDIgPSAnXFxcXCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBuZWVkIHRvIGVzY2FwZSBhbGwgdGhvc2Ugc2xhc2hlcyAqYWdhaW4qLCB3aXRob3V0IGVzY2FwaW5nIHRoZVxuICAgICAgICAvLyBvbmUgdGhhdCB3ZSBuZWVkIGZvciBlc2NhcGluZyB0aGUgfCBjaGFyYWN0ZXIuICBBcyBpdCB3b3JrcyBvdXQsXG4gICAgICAgIC8vIGVzY2FwaW5nIGFuIGV2ZW4gbnVtYmVyIG9mIHNsYXNoZXMgY2FuIGJlIGRvbmUgYnkgc2ltcGx5IHJlcGVhdGluZ1xuICAgICAgICAvLyBpdCBleGFjdGx5IGFmdGVyIGl0c2VsZi4gIFRoYXQncyB3aHkgdGhpcyB0cmljayB3b3Jrcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSSBhbSBzb3JyeSB0aGF0IHlvdSBoYXZlIHRvIHNlZSB0aGlzLlxuICAgICAgICByZXR1cm4gJDEgKyAkMSArICQyICsgJ3wnXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5kZWJ1ZygndGFpbD0lalxcbiAgICVzJywgdGFpbCwgdGFpbCwgcGwsIHJlKTtcbiAgICAgIGNvbnN0IHQgPSBwbC50eXBlID09PSAnKicgPyBzdGFyXG4gICAgICAgIDogcGwudHlwZSA9PT0gJz8nID8gcW1hcmtcbiAgICAgICAgOiAnXFxcXCcgKyBwbC50eXBlO1xuXG4gICAgICBoYXNNYWdpYyA9IHRydWU7XG4gICAgICByZSA9IHJlLnNsaWNlKDAsIHBsLnJlU3RhcnQpICsgdCArICdcXFxcKCcgKyB0YWlsO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZSB0cmFpbGluZyB0aGluZ3MgdGhhdCBvbmx5IG1hdHRlciBhdCB0aGUgdmVyeSBlbmQuXG4gICAgY2xlYXJTdGF0ZUNoYXIoKTtcbiAgICBpZiAoZXNjYXBpbmcpIHtcbiAgICAgIC8vIHRyYWlsaW5nIFxcXFxcbiAgICAgIHJlICs9ICdcXFxcXFxcXCc7XG4gICAgfVxuXG4gICAgLy8gb25seSBuZWVkIHRvIGFwcGx5IHRoZSBub2RvdCBzdGFydCBpZiB0aGUgcmUgc3RhcnRzIHdpdGhcbiAgICAvLyBzb21ldGhpbmcgdGhhdCBjb3VsZCBjb25jZWl2YWJseSBjYXB0dXJlIGEgZG90XG4gICAgY29uc3QgYWRkUGF0dGVyblN0YXJ0ID0gYWRkUGF0dGVyblN0YXJ0U2V0W3JlLmNoYXJBdCgwKV07XG5cbiAgICAvLyBIYWNrIHRvIHdvcmsgYXJvdW5kIGxhY2sgb2YgbmVnYXRpdmUgbG9va2JlaGluZCBpbiBKU1xuICAgIC8vIEEgcGF0dGVybiBsaWtlOiAqLiEoeCkuISh5fHopIG5lZWRzIHRvIGVuc3VyZSB0aGF0IGEgbmFtZVxuICAgIC8vIGxpa2UgJ2EueHl6Lnl6JyBkb2Vzbid0IG1hdGNoLiAgU28sIHRoZSBmaXJzdCBuZWdhdGl2ZVxuICAgIC8vIGxvb2thaGVhZCwgaGFzIHRvIGxvb2sgQUxMIHRoZSB3YXkgYWhlYWQsIHRvIHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgcGF0dGVybi5cbiAgICBmb3IgKGxldCBuID0gbmVnYXRpdmVMaXN0cy5sZW5ndGggLSAxOyBuID4gLTE7IG4tLSkge1xuICAgICAgY29uc3QgbmwgPSBuZWdhdGl2ZUxpc3RzW25dO1xuXG4gICAgICBjb25zdCBubEJlZm9yZSA9IHJlLnNsaWNlKDAsIG5sLnJlU3RhcnQpO1xuICAgICAgY29uc3QgbmxGaXJzdCA9IHJlLnNsaWNlKG5sLnJlU3RhcnQsIG5sLnJlRW5kIC0gOCk7XG4gICAgICBsZXQgbmxBZnRlciA9IHJlLnNsaWNlKG5sLnJlRW5kKTtcbiAgICAgIGNvbnN0IG5sTGFzdCA9IHJlLnNsaWNlKG5sLnJlRW5kIC0gOCwgbmwucmVFbmQpICsgbmxBZnRlcjtcblxuICAgICAgLy8gSGFuZGxlIG5lc3RlZCBzdHVmZiBsaWtlICooKi5qc3whKCouanNvbikpLCB3aGVyZSBvcGVuIHBhcmVuc1xuICAgICAgLy8gbWVhbiB0aGF0IHdlIHNob3VsZCAqbm90KiBpbmNsdWRlIHRoZSApIGluIHRoZSBiaXQgdGhhdCBpcyBjb25zaWRlcmVkXG4gICAgICAvLyBcImFmdGVyXCIgdGhlIG5lZ2F0ZWQgc2VjdGlvbi5cbiAgICAgIGNvbnN0IG9wZW5QYXJlbnNCZWZvcmUgPSBubEJlZm9yZS5zcGxpdCgnKCcpLmxlbmd0aCAtIDE7XG4gICAgICBsZXQgY2xlYW5BZnRlciA9IG5sQWZ0ZXI7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wZW5QYXJlbnNCZWZvcmU7IGkrKykge1xuICAgICAgICBjbGVhbkFmdGVyID0gY2xlYW5BZnRlci5yZXBsYWNlKC9cXClbKyo/XT8vLCAnJyk7XG4gICAgICB9XG4gICAgICBubEFmdGVyID0gY2xlYW5BZnRlcjtcblxuICAgICAgY29uc3QgZG9sbGFyID0gbmxBZnRlciA9PT0gJycgJiYgaXNTdWIgIT09IFNVQlBBUlNFID8gJyQnIDogJyc7XG4gICAgICByZSA9IG5sQmVmb3JlICsgbmxGaXJzdCArIG5sQWZ0ZXIgKyBkb2xsYXIgKyBubExhc3Q7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIHJlIGlzIG5vdCBcIlwiIGF0IHRoaXMgcG9pbnQsIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmVcbiAgICAvLyBpdCBkb2Vzbid0IG1hdGNoIGFnYWluc3QgYW4gZW1wdHkgcGF0aCBwYXJ0LlxuICAgIC8vIE90aGVyd2lzZSBhLyogd2lsbCBtYXRjaCBhLywgd2hpY2ggaXQgc2hvdWxkIG5vdC5cbiAgICBpZiAocmUgIT09ICcnICYmIGhhc01hZ2ljKSB7XG4gICAgICByZSA9ICcoPz0uKScgKyByZTtcbiAgICB9XG5cbiAgICBpZiAoYWRkUGF0dGVyblN0YXJ0KSB7XG4gICAgICByZSA9IHBhdHRlcm5TdGFydCArIHJlO1xuICAgIH1cblxuICAgIC8vIHBhcnNpbmcganVzdCBhIHBpZWNlIG9mIGEgbGFyZ2VyIHBhdHRlcm4uXG4gICAgaWYgKGlzU3ViID09PSBTVUJQQVJTRSkge1xuICAgICAgcmV0dXJuIFtyZSwgaGFzTWFnaWNdXG4gICAgfVxuXG4gICAgLy8gc2tpcCB0aGUgcmVnZXhwIGZvciBub24tbWFnaWNhbCBwYXR0ZXJuc1xuICAgIC8vIHVuZXNjYXBlIGFueXRoaW5nIGluIGl0LCB0aG91Z2gsIHNvIHRoYXQgaXQnbGwgYmVcbiAgICAvLyBhbiBleGFjdCBtYXRjaCBhZ2FpbnN0IGEgZmlsZSBldGMuXG4gICAgaWYgKCFoYXNNYWdpYykge1xuICAgICAgcmV0dXJuIGdsb2JVbmVzY2FwZShwYXR0ZXJuKVxuICAgIH1cblxuICAgIGNvbnN0IGZsYWdzID0gb3B0aW9ucy5ub2Nhc2UgPyAnaScgOiAnJztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFJlZ0V4cCgnXicgKyByZSArICckJywgZmxhZ3MpLCB7XG4gICAgICAgIF9nbG9iOiBwYXR0ZXJuLFxuICAgICAgICBfc3JjOiByZSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZXIpIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gc2hvdWxkIGJlIGltcG9zc2libGUgKi8ge1xuICAgICAgLy8gSWYgaXQgd2FzIGFuIGludmFsaWQgcmVndWxhciBleHByZXNzaW9uLCB0aGVuIGl0IGNhbid0IG1hdGNoXG4gICAgICAvLyBhbnl0aGluZy4gIFRoaXMgdHJpY2sgbG9va3MgZm9yIGEgY2hhcmFjdGVyIGFmdGVyIHRoZSBlbmQgb2ZcbiAgICAgIC8vIHRoZSBzdHJpbmcsIHdoaWNoIGlzIG9mIGNvdXJzZSBpbXBvc3NpYmxlLCBleGNlcHQgaW4gbXVsdGktbGluZVxuICAgICAgLy8gbW9kZSwgYnV0IGl0J3Mgbm90IGEgL20gcmVnZXguXG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnJC4nKVxuICAgIH1cbiAgfVxuXG4gIG1ha2VSZSAoKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwIHx8IHRoaXMucmVnZXhwID09PSBmYWxzZSkgcmV0dXJuIHRoaXMucmVnZXhwXG5cbiAgICAvLyBhdCB0aGlzIHBvaW50LCB0aGlzLnNldCBpcyBhIDJkIGFycmF5IG9mIHBhcnRpYWxcbiAgICAvLyBwYXR0ZXJuIHN0cmluZ3MsIG9yIFwiKipcIi5cbiAgICAvL1xuICAgIC8vIEl0J3MgYmV0dGVyIHRvIHVzZSAubWF0Y2goKS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0XG4gICAgLy8gYmUgdXNlZCwgcmVhbGx5LCBidXQgaXQncyBwcmV0dHkgY29udmVuaWVudCBzb21ldGltZXMsXG4gICAgLy8gd2hlbiB5b3UganVzdCB3YW50IHRvIHdvcmsgd2l0aCBhIHJlZ2V4LlxuICAgIGNvbnN0IHNldCA9IHRoaXMuc2V0O1xuXG4gICAgaWYgKCFzZXQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlZ2V4cCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMucmVnZXhwXG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBjb25zdCB0d29TdGFyID0gb3B0aW9ucy5ub2dsb2JzdGFyID8gc3RhclxuICAgICAgOiBvcHRpb25zLmRvdCA/IHR3b1N0YXJEb3RcbiAgICAgIDogdHdvU3Rhck5vRG90O1xuICAgIGNvbnN0IGZsYWdzID0gb3B0aW9ucy5ub2Nhc2UgPyAnaScgOiAnJztcblxuICAgIC8vIGNvYWxlc2NlIGdsb2JzdGFycyBhbmQgcmVnZXhwaWZ5IG5vbi1nbG9ic3RhciBwYXR0ZXJuc1xuICAgIC8vIGlmIGl0J3MgdGhlIG9ubHkgaXRlbSwgdGhlbiB3ZSBqdXN0IGRvIG9uZSB0d29TdGFyXG4gICAgLy8gaWYgaXQncyB0aGUgZmlyc3QsIGFuZCB0aGVyZSBhcmUgbW9yZSwgcHJlcGVuZCAoXFwvfHR3b1N0YXJcXC8pPyB0byBuZXh0XG4gICAgLy8gaWYgaXQncyB0aGUgbGFzdCwgYXBwZW5kIChcXC90d29TdGFyfCkgdG8gcHJldmlvdXNcbiAgICAvLyBpZiBpdCdzIGluIHRoZSBtaWRkbGUsIGFwcGVuZCAoXFwvfFxcL3R3b1N0YXJcXC8pIHRvIHByZXZpb3VzXG4gICAgLy8gdGhlbiBmaWx0ZXIgb3V0IEdMT0JTVEFSIHN5bWJvbHNcbiAgICBsZXQgcmUgPSBzZXQubWFwKHBhdHRlcm4gPT4ge1xuICAgICAgcGF0dGVybiA9IHBhdHRlcm4ubWFwKHAgPT5cbiAgICAgICAgdHlwZW9mIHAgPT09ICdzdHJpbmcnID8gcmVnRXhwRXNjYXBlKHApXG4gICAgICAgIDogcCA9PT0gR0xPQlNUQVIkMiA/IEdMT0JTVEFSJDJcbiAgICAgICAgOiBwLl9zcmNcbiAgICAgICkucmVkdWNlKChzZXQsIHApID0+IHtcbiAgICAgICAgaWYgKCEoc2V0W3NldC5sZW5ndGggLSAxXSA9PT0gR0xPQlNUQVIkMiAmJiBwID09PSBHTE9CU1RBUiQyKSkge1xuICAgICAgICAgIHNldC5wdXNoKHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRcbiAgICAgIH0sIFtdKTtcbiAgICAgIHBhdHRlcm4uZm9yRWFjaCgocCwgaSkgPT4ge1xuICAgICAgICBpZiAocCAhPT0gR0xPQlNUQVIkMiB8fCBwYXR0ZXJuW2ktMV0gPT09IEdMT0JTVEFSJDIpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgIGlmIChwYXR0ZXJuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHBhdHRlcm5baSsxXSA9ICcoPzpcXFxcXFwvfCcgKyB0d29TdGFyICsgJ1xcXFxcXC8pPycgKyBwYXR0ZXJuW2krMV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhdHRlcm5baV0gPSB0d29TdGFyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpID09PSBwYXR0ZXJuLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBwYXR0ZXJuW2ktMV0gKz0gJyg/OlxcXFxcXC98JyArIHR3b1N0YXIgKyAnKT8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdHRlcm5baS0xXSArPSAnKD86XFxcXFxcL3xcXFxcXFwvJyArIHR3b1N0YXIgKyAnXFxcXFxcLyknICsgcGF0dGVybltpKzFdO1xuICAgICAgICAgIHBhdHRlcm5baSsxXSA9IEdMT0JTVEFSJDI7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHBhdHRlcm4uZmlsdGVyKHAgPT4gcCAhPT0gR0xPQlNUQVIkMikuam9pbignLycpXG4gICAgfSkuam9pbignfCcpO1xuXG4gICAgLy8gbXVzdCBtYXRjaCBlbnRpcmUgcGF0dGVyblxuICAgIC8vIGVuZGluZyBpbiBhICogb3IgKiogd2lsbCBtYWtlIGl0IGxlc3Mgc3RyaWN0LlxuICAgIHJlID0gJ14oPzonICsgcmUgKyAnKSQnO1xuXG4gICAgLy8gY2FuIG1hdGNoIGFueXRoaW5nLCBhcyBsb25nIGFzIGl0J3Mgbm90IHRoaXMuXG4gICAgaWYgKHRoaXMubmVnYXRlKSByZSA9ICdeKD8hJyArIHJlICsgJykuKiQnO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVnZXhwID0gbmV3IFJlZ0V4cChyZSwgZmxhZ3MpO1xuICAgIH0gY2F0Y2ggKGV4KSAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIHNob3VsZCBiZSBpbXBvc3NpYmxlICovIHtcbiAgICAgIHRoaXMucmVnZXhwID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlZ2V4cFxuICB9XG5cbiAgbWF0Y2ggKGYsIHBhcnRpYWwgPSB0aGlzLnBhcnRpYWwpIHtcbiAgICB0aGlzLmRlYnVnKCdtYXRjaCcsIGYsIHRoaXMucGF0dGVybik7XG4gICAgLy8gc2hvcnQtY2lyY3VpdCBpbiB0aGUgY2FzZSBvZiBidXN0ZWQgdGhpbmdzLlxuICAgIC8vIGNvbW1lbnRzLCBldGMuXG4gICAgaWYgKHRoaXMuY29tbWVudCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHRoaXMuZW1wdHkpIHJldHVybiBmID09PSAnJ1xuXG4gICAgaWYgKGYgPT09ICcvJyAmJiBwYXJ0aWFsKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIHdpbmRvd3M6IG5lZWQgdG8gdXNlIC8sIG5vdCBcXFxuICAgIGlmIChwYXRoJGouc2VwICE9PSAnLycpIHtcbiAgICAgIGYgPSBmLnNwbGl0KHBhdGgkai5zZXApLmpvaW4oJy8nKTtcbiAgICB9XG5cbiAgICAvLyB0cmVhdCB0aGUgdGVzdCBwYXRoIGFzIGEgc2V0IG9mIHBhdGhwYXJ0cy5cbiAgICBmID0gZi5zcGxpdChzbGFzaFNwbGl0KTtcbiAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgJ3NwbGl0JywgZik7XG5cbiAgICAvLyBqdXN0IE9ORSBvZiB0aGUgcGF0dGVybiBzZXRzIGluIHRoaXMuc2V0IG5lZWRzIHRvIG1hdGNoXG4gICAgLy8gaW4gb3JkZXIgZm9yIGl0IHRvIGJlIHZhbGlkLiAgSWYgbmVnYXRpbmcsIHRoZW4ganVzdCBvbmVcbiAgICAvLyBtYXRjaCBtZWFucyB0aGF0IHdlIGhhdmUgZmFpbGVkLlxuICAgIC8vIEVpdGhlciB3YXksIHJldHVybiBvbiB0aGUgZmlyc3QgaGl0LlxuXG4gICAgY29uc3Qgc2V0ID0gdGhpcy5zZXQ7XG4gICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sICdzZXQnLCBzZXQpO1xuXG4gICAgLy8gRmluZCB0aGUgYmFzZW5hbWUgb2YgdGhlIHBhdGggYnkgbG9va2luZyBmb3IgdGhlIGxhc3Qgbm9uLWVtcHR5IHNlZ21lbnRcbiAgICBsZXQgZmlsZW5hbWU7XG4gICAgZm9yIChsZXQgaSA9IGYubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGZpbGVuYW1lID0gZltpXTtcbiAgICAgIGlmIChmaWxlbmFtZSkgYnJlYWtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGF0dGVybiA9IHNldFtpXTtcbiAgICAgIGxldCBmaWxlID0gZjtcbiAgICAgIGlmIChvcHRpb25zLm1hdGNoQmFzZSAmJiBwYXR0ZXJuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBmaWxlID0gW2ZpbGVuYW1lXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhpdCA9IHRoaXMubWF0Y2hPbmUoZmlsZSwgcGF0dGVybiwgcGFydGlhbCk7XG4gICAgICBpZiAoaGl0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmZsaXBOZWdhdGUpIHJldHVybiB0cnVlXG4gICAgICAgIHJldHVybiAhdGhpcy5uZWdhdGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkaWRuJ3QgZ2V0IGFueSBoaXRzLiAgdGhpcyBpcyBzdWNjZXNzIGlmIGl0J3MgYSBuZWdhdGl2ZVxuICAgIC8vIHBhdHRlcm4sIGZhaWx1cmUgb3RoZXJ3aXNlLlxuICAgIGlmIChvcHRpb25zLmZsaXBOZWdhdGUpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0aGlzLm5lZ2F0ZVxuICB9XG5cbiAgc3RhdGljIGRlZmF1bHRzIChkZWYpIHtcbiAgICByZXR1cm4gbWluaW1hdGNoJDEuZGVmYXVsdHMoZGVmKS5NaW5pbWF0Y2hcbiAgfVxufTtcblxubWluaW1hdGNoJDEuTWluaW1hdGNoID0gTWluaW1hdGNoJDE7XG5cbnZhciBpbmhlcml0c0V4cG9ydHMgPSB7fTtcbnZhciBpbmhlcml0cyA9IHtcbiAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIGluaGVyaXRzRXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IGluaGVyaXRzRXhwb3J0cyA9IHY7IH0sXG59O1xuXG52YXIgaW5oZXJpdHNfYnJvd3NlckV4cG9ydHMgPSB7fTtcbnZhciBpbmhlcml0c19icm93c2VyID0ge1xuICBnZXQgZXhwb3J0cygpeyByZXR1cm4gaW5oZXJpdHNfYnJvd3NlckV4cG9ydHM7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBpbmhlcml0c19icm93c2VyRXhwb3J0cyA9IHY7IH0sXG59O1xuXG52YXIgaGFzUmVxdWlyZWRJbmhlcml0c19icm93c2VyO1xuXG5mdW5jdGlvbiByZXF1aXJlSW5oZXJpdHNfYnJvd3NlciAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZEluaGVyaXRzX2Jyb3dzZXIpIHJldHVybiBpbmhlcml0c19icm93c2VyRXhwb3J0cztcblx0aGFzUmVxdWlyZWRJbmhlcml0c19icm93c2VyID0gMTtcblx0aWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcblx0ICBpbmhlcml0c19icm93c2VyLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcblx0ICAgIGlmIChzdXBlckN0b3IpIHtcblx0ICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3I7XG5cdCAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG5cdCAgICAgICAgY29uc3RydWN0b3I6IHtcblx0ICAgICAgICAgIHZhbHVlOiBjdG9yLFxuXHQgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG5cdCAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcblx0ICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfTtcblx0fSBlbHNlIHtcblx0ICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuXHQgIGluaGVyaXRzX2Jyb3dzZXIuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuXHQgICAgaWYgKHN1cGVyQ3Rvcikge1xuXHQgICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3Rvcjtcblx0ICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGU7XG5cdCAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKCk7XG5cdCAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3Rvcjtcblx0ICAgIH1cblx0ICB9O1xuXHR9XG5cdHJldHVybiBpbmhlcml0c19icm93c2VyRXhwb3J0cztcbn1cblxuKGZ1bmN0aW9uIChtb2R1bGUpIHtcblx0dHJ5IHtcblx0ICB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblx0ICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHQgIGlmICh0eXBlb2YgdXRpbC5pbmhlcml0cyAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgJyc7XG5cdCAgbW9kdWxlLmV4cG9ydHMgPSB1dGlsLmluaGVyaXRzO1xuXHR9IGNhdGNoIChlKSB7XG5cdCAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0ICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmVJbmhlcml0c19icm93c2VyKCk7XG5cdH1cbn0gKGluaGVyaXRzKSk7XG5cbnZhciBjb21tb24kYyA9IHt9O1xuXG5jb21tb24kYy5zZXRvcHRzID0gc2V0b3B0cztcbmNvbW1vbiRjLm93blByb3AgPSBvd25Qcm9wO1xuY29tbW9uJGMubWFrZUFicyA9IG1ha2VBYnM7XG5jb21tb24kYy5maW5pc2ggPSBmaW5pc2g7XG5jb21tb24kYy5tYXJrID0gbWFyaztcbmNvbW1vbiRjLmlzSWdub3JlZCA9IGlzSWdub3JlZDtcbmNvbW1vbiRjLmNoaWxkcmVuSWdub3JlZCA9IGNoaWxkcmVuSWdub3JlZDtcblxuZnVuY3Rpb24gb3duUHJvcCAob2JqLCBmaWVsZCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgZmllbGQpXG59XG5cbnZhciBmcyRpID0gcmVxdWlyZSQkMF9fZGVmYXVsdDtcbnZhciBwYXRoJGkgPSByZXF1aXJlJCQwJDQ7XG52YXIgbWluaW1hdGNoID0gbWluaW1hdGNoXzE7XG52YXIgaXNBYnNvbHV0ZSA9IHJlcXVpcmUkJDAkNC5pc0Fic29sdXRlO1xudmFyIE1pbmltYXRjaCA9IG1pbmltYXRjaC5NaW5pbWF0Y2g7XG5cbmZ1bmN0aW9uIGFscGhhc29ydCAoYSwgYikge1xuICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIsICdlbicpXG59XG5cbmZ1bmN0aW9uIHNldHVwSWdub3JlcyAoc2VsZiwgb3B0aW9ucykge1xuICBzZWxmLmlnbm9yZSA9IG9wdGlvbnMuaWdub3JlIHx8IFtdO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShzZWxmLmlnbm9yZSkpXG4gICAgc2VsZi5pZ25vcmUgPSBbc2VsZi5pZ25vcmVdO1xuXG4gIGlmIChzZWxmLmlnbm9yZS5sZW5ndGgpIHtcbiAgICBzZWxmLmlnbm9yZSA9IHNlbGYuaWdub3JlLm1hcChpZ25vcmVNYXApO1xuICB9XG59XG5cbi8vIGlnbm9yZSBwYXR0ZXJucyBhcmUgYWx3YXlzIGluIGRvdDp0cnVlIG1vZGUuXG5mdW5jdGlvbiBpZ25vcmVNYXAgKHBhdHRlcm4pIHtcbiAgdmFyIGdtYXRjaGVyID0gbnVsbDtcbiAgaWYgKHBhdHRlcm4uc2xpY2UoLTMpID09PSAnLyoqJykge1xuICAgIHZhciBncGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgvKFxcL1xcKlxcKikrJC8sICcnKTtcbiAgICBnbWF0Y2hlciA9IG5ldyBNaW5pbWF0Y2goZ3BhdHRlcm4sIHsgZG90OiB0cnVlIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVyOiBuZXcgTWluaW1hdGNoKHBhdHRlcm4sIHsgZG90OiB0cnVlIH0pLFxuICAgIGdtYXRjaGVyOiBnbWF0Y2hlclxuICB9XG59XG5cbmZ1bmN0aW9uIHNldG9wdHMgKHNlbGYsIHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKVxuICAgIG9wdGlvbnMgPSB7fTtcblxuICAvLyBiYXNlLW1hdGNoaW5nOiBqdXN0IHVzZSBnbG9ic3RhciBmb3IgdGhhdC5cbiAgaWYgKG9wdGlvbnMubWF0Y2hCYXNlICYmIC0xID09PSBwYXR0ZXJuLmluZGV4T2YoXCIvXCIpKSB7XG4gICAgaWYgKG9wdGlvbnMubm9nbG9ic3Rhcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFzZSBtYXRjaGluZyByZXF1aXJlcyBnbG9ic3RhclwiKVxuICAgIH1cbiAgICBwYXR0ZXJuID0gXCIqKi9cIiArIHBhdHRlcm47XG4gIH1cblxuICBzZWxmLnNpbGVudCA9ICEhb3B0aW9ucy5zaWxlbnQ7XG4gIHNlbGYucGF0dGVybiA9IHBhdHRlcm47XG4gIHNlbGYuc3RyaWN0ID0gb3B0aW9ucy5zdHJpY3QgIT09IGZhbHNlO1xuICBzZWxmLnJlYWxwYXRoID0gISFvcHRpb25zLnJlYWxwYXRoO1xuICBzZWxmLnJlYWxwYXRoQ2FjaGUgPSBvcHRpb25zLnJlYWxwYXRoQ2FjaGUgfHwgT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgc2VsZi5mb2xsb3cgPSAhIW9wdGlvbnMuZm9sbG93O1xuICBzZWxmLmRvdCA9ICEhb3B0aW9ucy5kb3Q7XG4gIHNlbGYubWFyayA9ICEhb3B0aW9ucy5tYXJrO1xuICBzZWxmLm5vZGlyID0gISFvcHRpb25zLm5vZGlyO1xuICBpZiAoc2VsZi5ub2RpcilcbiAgICBzZWxmLm1hcmsgPSB0cnVlO1xuICBzZWxmLnN5bmMgPSAhIW9wdGlvbnMuc3luYztcbiAgc2VsZi5ub3VuaXF1ZSA9ICEhb3B0aW9ucy5ub3VuaXF1ZTtcbiAgc2VsZi5ub251bGwgPSAhIW9wdGlvbnMubm9udWxsO1xuICBzZWxmLm5vc29ydCA9ICEhb3B0aW9ucy5ub3NvcnQ7XG4gIHNlbGYubm9jYXNlID0gISFvcHRpb25zLm5vY2FzZTtcbiAgc2VsZi5zdGF0ID0gISFvcHRpb25zLnN0YXQ7XG4gIHNlbGYubm9wcm9jZXNzID0gISFvcHRpb25zLm5vcHJvY2VzcztcbiAgc2VsZi5hYnNvbHV0ZSA9ICEhb3B0aW9ucy5hYnNvbHV0ZTtcbiAgc2VsZi5mcyA9IG9wdGlvbnMuZnMgfHwgZnMkaTtcblxuICBzZWxmLm1heExlbmd0aCA9IG9wdGlvbnMubWF4TGVuZ3RoIHx8IEluZmluaXR5O1xuICBzZWxmLmNhY2hlID0gb3B0aW9ucy5jYWNoZSB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBzZWxmLnN0YXRDYWNoZSA9IG9wdGlvbnMuc3RhdENhY2hlIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHNlbGYuc3ltbGlua3MgPSBvcHRpb25zLnN5bWxpbmtzIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgc2V0dXBJZ25vcmVzKHNlbGYsIG9wdGlvbnMpO1xuXG4gIHNlbGYuY2hhbmdlZEN3ZCA9IGZhbHNlO1xuICB2YXIgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFvd25Qcm9wKG9wdGlvbnMsIFwiY3dkXCIpKVxuICAgIHNlbGYuY3dkID0gcGF0aCRpLnJlc29sdmUoY3dkKTtcbiAgZWxzZSB7XG4gICAgc2VsZi5jd2QgPSBwYXRoJGkucmVzb2x2ZShvcHRpb25zLmN3ZCk7XG4gICAgc2VsZi5jaGFuZ2VkQ3dkID0gc2VsZi5jd2QgIT09IGN3ZDtcbiAgfVxuXG4gIHNlbGYucm9vdCA9IG9wdGlvbnMucm9vdCB8fCBwYXRoJGkucmVzb2x2ZShzZWxmLmN3ZCwgXCIvXCIpO1xuICBzZWxmLnJvb3QgPSBwYXRoJGkucmVzb2x2ZShzZWxmLnJvb3QpO1xuXG4gIC8vIFRPRE86IGlzIGFuIGFic29sdXRlIGBjd2RgIHN1cHBvc2VkIHRvIGJlIHJlc29sdmVkIGFnYWluc3QgYHJvb3RgP1xuICAvLyBlLmcuIHsgY3dkOiAnL3Rlc3QnLCByb290OiBfX2Rpcm5hbWUgfSA9PT0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy90ZXN0JylcbiAgc2VsZi5jd2RBYnMgPSBpc0Fic29sdXRlKHNlbGYuY3dkKSA/IHNlbGYuY3dkIDogbWFrZUFicyhzZWxmLCBzZWxmLmN3ZCk7XG4gIHNlbGYubm9tb3VudCA9ICEhb3B0aW9ucy5ub21vdW50O1xuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIpIHtcbiAgICBzZWxmLnJvb3QgPSBzZWxmLnJvb3QucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgc2VsZi5jd2QgPSBzZWxmLmN3ZC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgICBzZWxmLmN3ZEFicyA9IHNlbGYuY3dkQWJzLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICB9XG5cbiAgLy8gZGlzYWJsZSBjb21tZW50cyBhbmQgbmVnYXRpb24gaW4gTWluaW1hdGNoLlxuICAvLyBOb3RlIHRoYXQgdGhleSBhcmUgbm90IHN1cHBvcnRlZCBpbiBHbG9iIGl0c2VsZiBhbnl3YXkuXG4gIG9wdGlvbnMubm9uZWdhdGUgPSB0cnVlO1xuICBvcHRpb25zLm5vY29tbWVudCA9IHRydWU7XG4gIC8vIGFsd2F5cyB0cmVhdCBcXCBpbiBwYXR0ZXJucyBhcyBlc2NhcGVzLCBub3QgcGF0aCBzZXBhcmF0b3JzXG4gIG9wdGlvbnMuYWxsb3dXaW5kb3dzRXNjYXBlID0gdHJ1ZTtcblxuICBzZWxmLm1pbmltYXRjaCA9IG5ldyBNaW5pbWF0Y2gocGF0dGVybiwgb3B0aW9ucyk7XG4gIHNlbGYub3B0aW9ucyA9IHNlbGYubWluaW1hdGNoLm9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaCAoc2VsZikge1xuICB2YXIgbm91ID0gc2VsZi5ub3VuaXF1ZTtcbiAgdmFyIGFsbCA9IG5vdSA/IFtdIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IHNlbGYubWF0Y2hlcy5sZW5ndGg7IGkgPCBsOyBpICsrKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBzZWxmLm1hdGNoZXNbaV07XG4gICAgaWYgKCFtYXRjaGVzIHx8IE9iamVjdC5rZXlzKG1hdGNoZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHNlbGYubm9udWxsKSB7XG4gICAgICAgIC8vIGRvIGxpa2UgdGhlIHNoZWxsLCBhbmQgc3BpdCBvdXQgdGhlIGxpdGVyYWwgZ2xvYlxuICAgICAgICB2YXIgbGl0ZXJhbCA9IHNlbGYubWluaW1hdGNoLmdsb2JTZXRbaV07XG4gICAgICAgIGlmIChub3UpXG4gICAgICAgICAgYWxsLnB1c2gobGl0ZXJhbCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBhbGxbbGl0ZXJhbF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBoYWQgbWF0Y2hlc1xuICAgICAgdmFyIG0gPSBPYmplY3Qua2V5cyhtYXRjaGVzKTtcbiAgICAgIGlmIChub3UpXG4gICAgICAgIGFsbC5wdXNoLmFwcGx5KGFsbCwgbSk7XG4gICAgICBlbHNlXG4gICAgICAgIG0uZm9yRWFjaChmdW5jdGlvbiAobSkge1xuICAgICAgICAgIGFsbFttXSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmICghbm91KVxuICAgIGFsbCA9IE9iamVjdC5rZXlzKGFsbCk7XG5cbiAgaWYgKCFzZWxmLm5vc29ydClcbiAgICBhbGwgPSBhbGwuc29ydChhbHBoYXNvcnQpO1xuXG4gIC8vIGF0ICpzb21lKiBwb2ludCB3ZSBzdGF0dGVkIGFsbCBvZiB0aGVzZVxuICBpZiAoc2VsZi5tYXJrKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFsbFtpXSA9IHNlbGYuX21hcmsoYWxsW2ldKTtcbiAgICB9XG4gICAgaWYgKHNlbGYubm9kaXIpIHtcbiAgICAgIGFsbCA9IGFsbC5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdmFyIG5vdERpciA9ICEoL1xcLyQvLnRlc3QoZSkpO1xuICAgICAgICB2YXIgYyA9IHNlbGYuY2FjaGVbZV0gfHwgc2VsZi5jYWNoZVttYWtlQWJzKHNlbGYsIGUpXTtcbiAgICAgICAgaWYgKG5vdERpciAmJiBjKVxuICAgICAgICAgIG5vdERpciA9IGMgIT09ICdESVInICYmICFBcnJheS5pc0FycmF5KGMpO1xuICAgICAgICByZXR1cm4gbm90RGlyXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2VsZi5pZ25vcmUubGVuZ3RoKVxuICAgIGFsbCA9IGFsbC5maWx0ZXIoZnVuY3Rpb24obSkge1xuICAgICAgcmV0dXJuICFpc0lnbm9yZWQoc2VsZiwgbSlcbiAgICB9KTtcblxuICBzZWxmLmZvdW5kID0gYWxsO1xufVxuXG5mdW5jdGlvbiBtYXJrIChzZWxmLCBwKSB7XG4gIHZhciBhYnMgPSBtYWtlQWJzKHNlbGYsIHApO1xuICB2YXIgYyA9IHNlbGYuY2FjaGVbYWJzXTtcbiAgdmFyIG0gPSBwO1xuICBpZiAoYykge1xuICAgIHZhciBpc0RpciA9IGMgPT09ICdESVInIHx8IEFycmF5LmlzQXJyYXkoYyk7XG4gICAgdmFyIHNsYXNoID0gcC5zbGljZSgtMSkgPT09ICcvJztcblxuICAgIGlmIChpc0RpciAmJiAhc2xhc2gpXG4gICAgICBtICs9ICcvJztcbiAgICBlbHNlIGlmICghaXNEaXIgJiYgc2xhc2gpXG4gICAgICBtID0gbS5zbGljZSgwLCAtMSk7XG5cbiAgICBpZiAobSAhPT0gcCkge1xuICAgICAgdmFyIG1hYnMgPSBtYWtlQWJzKHNlbGYsIG0pO1xuICAgICAgc2VsZi5zdGF0Q2FjaGVbbWFic10gPSBzZWxmLnN0YXRDYWNoZVthYnNdO1xuICAgICAgc2VsZi5jYWNoZVttYWJzXSA9IHNlbGYuY2FjaGVbYWJzXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbVxufVxuXG4vLyBsb3R0YSBzaXR1cHMuLi5cbmZ1bmN0aW9uIG1ha2VBYnMgKHNlbGYsIGYpIHtcbiAgdmFyIGFicyA9IGY7XG4gIGlmIChmLmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgYWJzID0gcGF0aCRpLmpvaW4oc2VsZi5yb290LCBmKTtcbiAgfSBlbHNlIGlmIChpc0Fic29sdXRlKGYpIHx8IGYgPT09ICcnKSB7XG4gICAgYWJzID0gZjtcbiAgfSBlbHNlIGlmIChzZWxmLmNoYW5nZWRDd2QpIHtcbiAgICBhYnMgPSBwYXRoJGkucmVzb2x2ZShzZWxmLmN3ZCwgZik7XG4gIH0gZWxzZSB7XG4gICAgYWJzID0gcGF0aCRpLnJlc29sdmUoZik7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJylcbiAgICBhYnMgPSBhYnMucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gIHJldHVybiBhYnNcbn1cblxuXG4vLyBSZXR1cm4gdHJ1ZSwgaWYgcGF0dGVybiBlbmRzIHdpdGggZ2xvYnN0YXIgJyoqJywgZm9yIHRoZSBhY2NvbXBhbnlpbmcgcGFyZW50IGRpcmVjdG9yeS5cbi8vIEV4Oi0gSWYgbm9kZV9tb2R1bGVzLyoqIGlzIHRoZSBwYXR0ZXJuLCBhZGQgJ25vZGVfbW9kdWxlcycgdG8gaWdub3JlIGxpc3QgYWxvbmcgd2l0aCBpdCdzIGNvbnRlbnRzXG5mdW5jdGlvbiBpc0lnbm9yZWQgKHNlbGYsIHBhdGgpIHtcbiAgaWYgKCFzZWxmLmlnbm9yZS5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIHNlbGYuaWdub3JlLnNvbWUoZnVuY3Rpb24oaXRlbSkge1xuICAgIHJldHVybiBpdGVtLm1hdGNoZXIubWF0Y2gocGF0aCkgfHwgISEoaXRlbS5nbWF0Y2hlciAmJiBpdGVtLmdtYXRjaGVyLm1hdGNoKHBhdGgpKVxuICB9KVxufVxuXG5mdW5jdGlvbiBjaGlsZHJlbklnbm9yZWQgKHNlbGYsIHBhdGgpIHtcbiAgaWYgKCFzZWxmLmlnbm9yZS5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIHNlbGYuaWdub3JlLnNvbWUoZnVuY3Rpb24oaXRlbSkge1xuICAgIHJldHVybiAhIShpdGVtLmdtYXRjaGVyICYmIGl0ZW0uZ21hdGNoZXIubWF0Y2gocGF0aCkpXG4gIH0pXG59XG5cbnZhciBzeW5jJDk7XG52YXIgaGFzUmVxdWlyZWRTeW5jO1xuXG5mdW5jdGlvbiByZXF1aXJlU3luYyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFN5bmMpIHJldHVybiBzeW5jJDk7XG5cdGhhc1JlcXVpcmVkU3luYyA9IDE7XG5cdHN5bmMkOSA9IGdsb2JTeW5jO1xuXHRnbG9iU3luYy5HbG9iU3luYyA9IEdsb2JTeW5jO1xuXG5cdHZhciBycCA9IGZzX3JlYWxwYXRoO1xuXHR2YXIgbWluaW1hdGNoID0gbWluaW1hdGNoXzE7XG5cdHJlcXVpcmVHbG9iKCkuR2xvYjtcblx0dmFyIHBhdGggPSByZXF1aXJlJCQwJDQ7XG5cdHZhciBhc3NlcnQgPSByZXF1aXJlJCQ1O1xuXHR2YXIgaXNBYnNvbHV0ZSA9IHJlcXVpcmUkJDAkNC5pc0Fic29sdXRlO1xuXHR2YXIgY29tbW9uID0gY29tbW9uJGM7XG5cdHZhciBzZXRvcHRzID0gY29tbW9uLnNldG9wdHM7XG5cdHZhciBvd25Qcm9wID0gY29tbW9uLm93blByb3A7XG5cdHZhciBjaGlsZHJlbklnbm9yZWQgPSBjb21tb24uY2hpbGRyZW5JZ25vcmVkO1xuXHR2YXIgaXNJZ25vcmVkID0gY29tbW9uLmlzSWdub3JlZDtcblxuXHRmdW5jdGlvbiBnbG9iU3luYyAocGF0dGVybiwgb3B0aW9ucykge1xuXHQgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAzKVxuXHQgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgcHJvdmlkZWQgdG8gc3luYyBnbG9iXFxuJytcblx0ICAgICAgICAgICAgICAgICAgICAgICAgJ1NlZTogaHR0cHM6Ly9naXRodWIuY29tL2lzYWFjcy9ub2RlLWdsb2IvaXNzdWVzLzE2NycpXG5cblx0ICByZXR1cm4gbmV3IEdsb2JTeW5jKHBhdHRlcm4sIG9wdGlvbnMpLmZvdW5kXG5cdH1cblxuXHRmdW5jdGlvbiBHbG9iU3luYyAocGF0dGVybiwgb3B0aW9ucykge1xuXHQgIGlmICghcGF0dGVybilcblx0ICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIHBhdHRlcm4nKVxuXG5cdCAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDMpXG5cdCAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBwcm92aWRlZCB0byBzeW5jIGdsb2JcXG4nK1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAnU2VlOiBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtZ2xvYi9pc3N1ZXMvMTY3JylcblxuXHQgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBHbG9iU3luYykpXG5cdCAgICByZXR1cm4gbmV3IEdsb2JTeW5jKHBhdHRlcm4sIG9wdGlvbnMpXG5cblx0ICBzZXRvcHRzKHRoaXMsIHBhdHRlcm4sIG9wdGlvbnMpO1xuXG5cdCAgaWYgKHRoaXMubm9wcm9jZXNzKVxuXHQgICAgcmV0dXJuIHRoaXNcblxuXHQgIHZhciBuID0gdGhpcy5taW5pbWF0Y2guc2V0Lmxlbmd0aDtcblx0ICB0aGlzLm1hdGNoZXMgPSBuZXcgQXJyYXkobik7XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpICsrKSB7XG5cdCAgICB0aGlzLl9wcm9jZXNzKHRoaXMubWluaW1hdGNoLnNldFtpXSwgaSwgZmFsc2UpO1xuXHQgIH1cblx0ICB0aGlzLl9maW5pc2goKTtcblx0fVxuXG5cdEdsb2JTeW5jLnByb3RvdHlwZS5fZmluaXNoID0gZnVuY3Rpb24gKCkge1xuXHQgIGFzc2VydC5vayh0aGlzIGluc3RhbmNlb2YgR2xvYlN5bmMpO1xuXHQgIGlmICh0aGlzLnJlYWxwYXRoKSB7XG5cdCAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICB0aGlzLm1hdGNoZXMuZm9yRWFjaChmdW5jdGlvbiAobWF0Y2hzZXQsIGluZGV4KSB7XG5cdCAgICAgIHZhciBzZXQgPSBzZWxmLm1hdGNoZXNbaW5kZXhdID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblx0ICAgICAgZm9yICh2YXIgcCBpbiBtYXRjaHNldCkge1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICBwID0gc2VsZi5fbWFrZUFicyhwKTtcblx0ICAgICAgICAgIHZhciByZWFsID0gcnAucmVhbHBhdGhTeW5jKHAsIHNlbGYucmVhbHBhdGhDYWNoZSk7XG5cdCAgICAgICAgICBzZXRbcmVhbF0gPSB0cnVlO1xuXHQgICAgICAgIH0gY2F0Y2ggKGVyKSB7XG5cdCAgICAgICAgICBpZiAoZXIuc3lzY2FsbCA9PT0gJ3N0YXQnKVxuXHQgICAgICAgICAgICBzZXRbc2VsZi5fbWFrZUFicyhwKV0gPSB0cnVlO1xuXHQgICAgICAgICAgZWxzZVxuXHQgICAgICAgICAgICB0aHJvdyBlclxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgfVxuXHQgIGNvbW1vbi5maW5pc2godGhpcyk7XG5cdH07XG5cblxuXHRHbG9iU3luYy5wcm90b3R5cGUuX3Byb2Nlc3MgPSBmdW5jdGlvbiAocGF0dGVybiwgaW5kZXgsIGluR2xvYlN0YXIpIHtcblx0ICBhc3NlcnQub2sodGhpcyBpbnN0YW5jZW9mIEdsb2JTeW5jKTtcblxuXHQgIC8vIEdldCB0aGUgZmlyc3QgW25dIHBhcnRzIG9mIHBhdHRlcm4gdGhhdCBhcmUgYWxsIHN0cmluZ3MuXG5cdCAgdmFyIG4gPSAwO1xuXHQgIHdoaWxlICh0eXBlb2YgcGF0dGVybltuXSA9PT0gJ3N0cmluZycpIHtcblx0ICAgIG4gKys7XG5cdCAgfVxuXHQgIC8vIG5vdyBuIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgKm5vdCogYSBzdHJpbmcuXG5cblx0ICAvLyBTZWUgaWYgdGhlcmUncyBhbnl0aGluZyBlbHNlXG5cdCAgdmFyIHByZWZpeDtcblx0ICBzd2l0Y2ggKG4pIHtcblx0ICAgIC8vIGlmIG5vdCwgdGhlbiB0aGlzIGlzIHJhdGhlciBzaW1wbGVcblx0ICAgIGNhc2UgcGF0dGVybi5sZW5ndGg6XG5cdCAgICAgIHRoaXMuX3Byb2Nlc3NTaW1wbGUocGF0dGVybi5qb2luKCcvJyksIGluZGV4KTtcblx0ICAgICAgcmV0dXJuXG5cblx0ICAgIGNhc2UgMDpcblx0ICAgICAgLy8gcGF0dGVybiAqc3RhcnRzKiB3aXRoIHNvbWUgbm9uLXRyaXZpYWwgaXRlbS5cblx0ICAgICAgLy8gZ29pbmcgdG8gcmVhZGRpcihjd2QpLCBidXQgbm90IGluY2x1ZGUgdGhlIHByZWZpeCBpbiBtYXRjaGVzLlxuXHQgICAgICBwcmVmaXggPSBudWxsO1xuXHQgICAgICBicmVha1xuXG5cdCAgICBkZWZhdWx0OlxuXHQgICAgICAvLyBwYXR0ZXJuIGhhcyBzb21lIHN0cmluZyBiaXRzIGluIHRoZSBmcm9udC5cblx0ICAgICAgLy8gd2hhdGV2ZXIgaXQgc3RhcnRzIHdpdGgsIHdoZXRoZXIgdGhhdCdzICdhYnNvbHV0ZScgbGlrZSAvZm9vL2Jhcixcblx0ICAgICAgLy8gb3IgJ3JlbGF0aXZlJyBsaWtlICcuLi9iYXonXG5cdCAgICAgIHByZWZpeCA9IHBhdHRlcm4uc2xpY2UoMCwgbikuam9pbignLycpO1xuXHQgICAgICBicmVha1xuXHQgIH1cblxuXHQgIHZhciByZW1haW4gPSBwYXR0ZXJuLnNsaWNlKG4pO1xuXG5cdCAgLy8gZ2V0IHRoZSBsaXN0IG9mIGVudHJpZXMuXG5cdCAgdmFyIHJlYWQ7XG5cdCAgaWYgKHByZWZpeCA9PT0gbnVsbClcblx0ICAgIHJlYWQgPSAnLic7XG5cdCAgZWxzZSBpZiAoaXNBYnNvbHV0ZShwcmVmaXgpIHx8XG5cdCAgICAgIGlzQWJzb2x1dGUocGF0dGVybi5tYXAoZnVuY3Rpb24gKHApIHtcblx0ICAgICAgICByZXR1cm4gdHlwZW9mIHAgPT09ICdzdHJpbmcnID8gcCA6ICdbKl0nXG5cdCAgICAgIH0pLmpvaW4oJy8nKSkpIHtcblx0ICAgIGlmICghcHJlZml4IHx8ICFpc0Fic29sdXRlKHByZWZpeCkpXG5cdCAgICAgIHByZWZpeCA9ICcvJyArIHByZWZpeDtcblx0ICAgIHJlYWQgPSBwcmVmaXg7XG5cdCAgfSBlbHNlXG5cdCAgICByZWFkID0gcHJlZml4O1xuXG5cdCAgdmFyIGFicyA9IHRoaXMuX21ha2VBYnMocmVhZCk7XG5cblx0ICAvL2lmIGlnbm9yZWQsIHNraXAgcHJvY2Vzc2luZ1xuXHQgIGlmIChjaGlsZHJlbklnbm9yZWQodGhpcywgcmVhZCkpXG5cdCAgICByZXR1cm5cblxuXHQgIHZhciBpc0dsb2JTdGFyID0gcmVtYWluWzBdID09PSBtaW5pbWF0Y2guR0xPQlNUQVI7XG5cdCAgaWYgKGlzR2xvYlN0YXIpXG5cdCAgICB0aGlzLl9wcm9jZXNzR2xvYlN0YXIocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIpO1xuXHQgIGVsc2Vcblx0ICAgIHRoaXMuX3Byb2Nlc3NSZWFkZGlyKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyKTtcblx0fTtcblxuXG5cdEdsb2JTeW5jLnByb3RvdHlwZS5fcHJvY2Vzc1JlYWRkaXIgPSBmdW5jdGlvbiAocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIpIHtcblx0ICB2YXIgZW50cmllcyA9IHRoaXMuX3JlYWRkaXIoYWJzLCBpbkdsb2JTdGFyKTtcblxuXHQgIC8vIGlmIHRoZSBhYnMgaXNuJ3QgYSBkaXIsIHRoZW4gbm90aGluZyBjYW4gbWF0Y2ghXG5cdCAgaWYgKCFlbnRyaWVzKVxuXHQgICAgcmV0dXJuXG5cblx0ICAvLyBJdCB3aWxsIG9ubHkgbWF0Y2ggZG90IGVudHJpZXMgaWYgaXQgc3RhcnRzIHdpdGggYSBkb3QsIG9yIGlmXG5cdCAgLy8gZG90IGlzIHNldC4gIFN0dWZmIGxpa2UgQCguZm9vfC5iYXIpIGlzbid0IGFsbG93ZWQuXG5cdCAgdmFyIHBuID0gcmVtYWluWzBdO1xuXHQgIHZhciBuZWdhdGUgPSAhIXRoaXMubWluaW1hdGNoLm5lZ2F0ZTtcblx0ICB2YXIgcmF3R2xvYiA9IHBuLl9nbG9iO1xuXHQgIHZhciBkb3RPayA9IHRoaXMuZG90IHx8IHJhd0dsb2IuY2hhckF0KDApID09PSAnLic7XG5cblx0ICB2YXIgbWF0Y2hlZEVudHJpZXMgPSBbXTtcblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgIHZhciBlID0gZW50cmllc1tpXTtcblx0ICAgIGlmIChlLmNoYXJBdCgwKSAhPT0gJy4nIHx8IGRvdE9rKSB7XG5cdCAgICAgIHZhciBtO1xuXHQgICAgICBpZiAobmVnYXRlICYmICFwcmVmaXgpIHtcblx0ICAgICAgICBtID0gIWUubWF0Y2gocG4pO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIG0gPSBlLm1hdGNoKHBuKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAobSlcblx0ICAgICAgICBtYXRjaGVkRW50cmllcy5wdXNoKGUpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHZhciBsZW4gPSBtYXRjaGVkRW50cmllcy5sZW5ndGg7XG5cdCAgLy8gSWYgdGhlcmUgYXJlIG5vIG1hdGNoZWQgZW50cmllcywgdGhlbiBub3RoaW5nIG1hdGNoZXMuXG5cdCAgaWYgKGxlbiA9PT0gMClcblx0ICAgIHJldHVyblxuXG5cdCAgLy8gaWYgdGhpcyBpcyB0aGUgbGFzdCByZW1haW5pbmcgcGF0dGVybiBiaXQsIHRoZW4gbm8gbmVlZCBmb3Jcblx0ICAvLyBhbiBhZGRpdGlvbmFsIHN0YXQgKnVubGVzcyogdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBtYXJrIG9yXG5cdCAgLy8gc3RhdCBleHBsaWNpdGx5LiAgV2Uga25vdyB0aGV5IGV4aXN0LCBzaW5jZSByZWFkZGlyIHJldHVybmVkXG5cdCAgLy8gdGhlbS5cblxuXHQgIGlmIChyZW1haW4ubGVuZ3RoID09PSAxICYmICF0aGlzLm1hcmsgJiYgIXRoaXMuc3RhdCkge1xuXHQgICAgaWYgKCF0aGlzLm1hdGNoZXNbaW5kZXhdKVxuXHQgICAgICB0aGlzLm1hdGNoZXNbaW5kZXhdID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKyspIHtcblx0ICAgICAgdmFyIGUgPSBtYXRjaGVkRW50cmllc1tpXTtcblx0ICAgICAgaWYgKHByZWZpeCkge1xuXHQgICAgICAgIGlmIChwcmVmaXguc2xpY2UoLTEpICE9PSAnLycpXG5cdCAgICAgICAgICBlID0gcHJlZml4ICsgJy8nICsgZTtcblx0ICAgICAgICBlbHNlXG5cdCAgICAgICAgICBlID0gcHJlZml4ICsgZTtcblx0ICAgICAgfVxuXG5cdCAgICAgIGlmIChlLmNoYXJBdCgwKSA9PT0gJy8nICYmICF0aGlzLm5vbW91bnQpIHtcblx0ICAgICAgICBlID0gcGF0aC5qb2luKHRoaXMucm9vdCwgZSk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5fZW1pdE1hdGNoKGluZGV4LCBlKTtcblx0ICAgIH1cblx0ICAgIC8vIFRoaXMgd2FzIHRoZSBsYXN0IG9uZSwgYW5kIG5vIHN0YXRzIHdlcmUgbmVlZGVkXG5cdCAgICByZXR1cm5cblx0ICB9XG5cblx0ICAvLyBub3cgdGVzdCBhbGwgbWF0Y2hlZCBlbnRyaWVzIGFzIHN0YW5kLWlucyBmb3IgdGhhdCBwYXJ0XG5cdCAgLy8gb2YgdGhlIHBhdHRlcm4uXG5cdCAgcmVtYWluLnNoaWZ0KCk7XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKyspIHtcblx0ICAgIHZhciBlID0gbWF0Y2hlZEVudHJpZXNbaV07XG5cdCAgICB2YXIgbmV3UGF0dGVybjtcblx0ICAgIGlmIChwcmVmaXgpXG5cdCAgICAgIG5ld1BhdHRlcm4gPSBbcHJlZml4LCBlXTtcblx0ICAgIGVsc2Vcblx0ICAgICAgbmV3UGF0dGVybiA9IFtlXTtcblx0ICAgIHRoaXMuX3Byb2Nlc3MobmV3UGF0dGVybi5jb25jYXQocmVtYWluKSwgaW5kZXgsIGluR2xvYlN0YXIpO1xuXHQgIH1cblx0fTtcblxuXG5cdEdsb2JTeW5jLnByb3RvdHlwZS5fZW1pdE1hdGNoID0gZnVuY3Rpb24gKGluZGV4LCBlKSB7XG5cdCAgaWYgKGlzSWdub3JlZCh0aGlzLCBlKSlcblx0ICAgIHJldHVyblxuXG5cdCAgdmFyIGFicyA9IHRoaXMuX21ha2VBYnMoZSk7XG5cblx0ICBpZiAodGhpcy5tYXJrKVxuXHQgICAgZSA9IHRoaXMuX21hcmsoZSk7XG5cblx0ICBpZiAodGhpcy5hYnNvbHV0ZSkge1xuXHQgICAgZSA9IGFicztcblx0ICB9XG5cblx0ICBpZiAodGhpcy5tYXRjaGVzW2luZGV4XVtlXSlcblx0ICAgIHJldHVyblxuXG5cdCAgaWYgKHRoaXMubm9kaXIpIHtcblx0ICAgIHZhciBjID0gdGhpcy5jYWNoZVthYnNdO1xuXHQgICAgaWYgKGMgPT09ICdESVInIHx8IEFycmF5LmlzQXJyYXkoYykpXG5cdCAgICAgIHJldHVyblxuXHQgIH1cblxuXHQgIHRoaXMubWF0Y2hlc1tpbmRleF1bZV0gPSB0cnVlO1xuXG5cdCAgaWYgKHRoaXMuc3RhdClcblx0ICAgIHRoaXMuX3N0YXQoZSk7XG5cdH07XG5cblxuXHRHbG9iU3luYy5wcm90b3R5cGUuX3JlYWRkaXJJbkdsb2JTdGFyID0gZnVuY3Rpb24gKGFicykge1xuXHQgIC8vIGZvbGxvdyBhbGwgc3ltbGlua2VkIGRpcmVjdG9yaWVzIGZvcmV2ZXJcblx0ICAvLyBqdXN0IHByb2NlZWQgYXMgaWYgdGhpcyBpcyBhIG5vbi1nbG9ic3RhciBzaXR1YXRpb25cblx0ICBpZiAodGhpcy5mb2xsb3cpXG5cdCAgICByZXR1cm4gdGhpcy5fcmVhZGRpcihhYnMsIGZhbHNlKVxuXG5cdCAgdmFyIGVudHJpZXM7XG5cdCAgdmFyIGxzdGF0O1xuXHQgIHRyeSB7XG5cdCAgICBsc3RhdCA9IHRoaXMuZnMubHN0YXRTeW5jKGFicyk7XG5cdCAgfSBjYXRjaCAoZXIpIHtcblx0ICAgIGlmIChlci5jb2RlID09PSAnRU5PRU5UJykge1xuXHQgICAgICAvLyBsc3RhdCBmYWlsZWQsIGRvZXNuJ3QgZXhpc3Rcblx0ICAgICAgcmV0dXJuIG51bGxcblx0ICAgIH1cblx0ICB9XG5cblx0ICB2YXIgaXNTeW0gPSBsc3RhdCAmJiBsc3RhdC5pc1N5bWJvbGljTGluaygpO1xuXHQgIHRoaXMuc3ltbGlua3NbYWJzXSA9IGlzU3ltO1xuXG5cdCAgLy8gSWYgaXQncyBub3QgYSBzeW1saW5rIG9yIGEgZGlyLCB0aGVuIGl0J3MgZGVmaW5pdGVseSBhIHJlZ3VsYXIgZmlsZS5cblx0ICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYSByZWFkZGlyIGluIHRoYXQgY2FzZS5cblx0ICBpZiAoIWlzU3ltICYmIGxzdGF0ICYmICFsc3RhdC5pc0RpcmVjdG9yeSgpKVxuXHQgICAgdGhpcy5jYWNoZVthYnNdID0gJ0ZJTEUnO1xuXHQgIGVsc2Vcblx0ICAgIGVudHJpZXMgPSB0aGlzLl9yZWFkZGlyKGFicywgZmFsc2UpO1xuXG5cdCAgcmV0dXJuIGVudHJpZXNcblx0fTtcblxuXHRHbG9iU3luYy5wcm90b3R5cGUuX3JlYWRkaXIgPSBmdW5jdGlvbiAoYWJzLCBpbkdsb2JTdGFyKSB7XG5cblx0ICBpZiAoaW5HbG9iU3RhciAmJiAhb3duUHJvcCh0aGlzLnN5bWxpbmtzLCBhYnMpKVxuXHQgICAgcmV0dXJuIHRoaXMuX3JlYWRkaXJJbkdsb2JTdGFyKGFicylcblxuXHQgIGlmIChvd25Qcm9wKHRoaXMuY2FjaGUsIGFicykpIHtcblx0ICAgIHZhciBjID0gdGhpcy5jYWNoZVthYnNdO1xuXHQgICAgaWYgKCFjIHx8IGMgPT09ICdGSUxFJylcblx0ICAgICAgcmV0dXJuIG51bGxcblxuXHQgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpXG5cdCAgICAgIHJldHVybiBjXG5cdCAgfVxuXG5cdCAgdHJ5IHtcblx0ICAgIHJldHVybiB0aGlzLl9yZWFkZGlyRW50cmllcyhhYnMsIHRoaXMuZnMucmVhZGRpclN5bmMoYWJzKSlcblx0ICB9IGNhdGNoIChlcikge1xuXHQgICAgdGhpcy5fcmVhZGRpckVycm9yKGFicywgZXIpO1xuXHQgICAgcmV0dXJuIG51bGxcblx0ICB9XG5cdH07XG5cblx0R2xvYlN5bmMucHJvdG90eXBlLl9yZWFkZGlyRW50cmllcyA9IGZ1bmN0aW9uIChhYnMsIGVudHJpZXMpIHtcblx0ICAvLyBpZiB3ZSBoYXZlbid0IGFza2VkIHRvIHN0YXQgZXZlcnl0aGluZywgdGhlbiBqdXN0XG5cdCAgLy8gYXNzdW1lIHRoYXQgZXZlcnl0aGluZyBpbiB0aGVyZSBleGlzdHMsIHNvIHdlIGNhbiBhdm9pZFxuXHQgIC8vIGhhdmluZyB0byBzdGF0IGl0IGEgc2Vjb25kIHRpbWUuXG5cdCAgaWYgKCF0aGlzLm1hcmsgJiYgIXRoaXMuc3RhdCkge1xuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSArKykge1xuXHQgICAgICB2YXIgZSA9IGVudHJpZXNbaV07XG5cdCAgICAgIGlmIChhYnMgPT09ICcvJylcblx0ICAgICAgICBlID0gYWJzICsgZTtcblx0ICAgICAgZWxzZVxuXHQgICAgICAgIGUgPSBhYnMgKyAnLycgKyBlO1xuXHQgICAgICB0aGlzLmNhY2hlW2VdID0gdHJ1ZTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICB0aGlzLmNhY2hlW2Fic10gPSBlbnRyaWVzO1xuXG5cdCAgLy8gbWFyayBhbmQgY2FjaGUgZGlyLW5lc3Ncblx0ICByZXR1cm4gZW50cmllc1xuXHR9O1xuXG5cdEdsb2JTeW5jLnByb3RvdHlwZS5fcmVhZGRpckVycm9yID0gZnVuY3Rpb24gKGYsIGVyKSB7XG5cdCAgLy8gaGFuZGxlIGVycm9ycywgYW5kIGNhY2hlIHRoZSBpbmZvcm1hdGlvblxuXHQgIHN3aXRjaCAoZXIuY29kZSkge1xuXHQgICAgY2FzZSAnRU5PVFNVUCc6IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS1nbG9iL2lzc3Vlcy8yMDVcblx0ICAgIGNhc2UgJ0VOT1RESVInOiAvLyB0b3RhbGx5IG5vcm1hbC4gbWVhbnMgaXQgKmRvZXMqIGV4aXN0LlxuXHQgICAgICB2YXIgYWJzID0gdGhpcy5fbWFrZUFicyhmKTtcblx0ICAgICAgdGhpcy5jYWNoZVthYnNdID0gJ0ZJTEUnO1xuXHQgICAgICBpZiAoYWJzID09PSB0aGlzLmN3ZEFicykge1xuXHQgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihlci5jb2RlICsgJyBpbnZhbGlkIGN3ZCAnICsgdGhpcy5jd2QpO1xuXHQgICAgICAgIGVycm9yLnBhdGggPSB0aGlzLmN3ZDtcblx0ICAgICAgICBlcnJvci5jb2RlID0gZXIuY29kZTtcblx0ICAgICAgICB0aHJvdyBlcnJvclxuXHQgICAgICB9XG5cdCAgICAgIGJyZWFrXG5cblx0ICAgIGNhc2UgJ0VOT0VOVCc6IC8vIG5vdCB0ZXJyaWJseSB1bnVzdWFsXG5cdCAgICBjYXNlICdFTE9PUCc6XG5cdCAgICBjYXNlICdFTkFNRVRPT0xPTkcnOlxuXHQgICAgY2FzZSAnVU5LTk9XTic6XG5cdCAgICAgIHRoaXMuY2FjaGVbdGhpcy5fbWFrZUFicyhmKV0gPSBmYWxzZTtcblx0ICAgICAgYnJlYWtcblxuXHQgICAgZGVmYXVsdDogLy8gc29tZSB1bnVzdWFsIGVycm9yLiAgVHJlYXQgYXMgZmFpbHVyZS5cblx0ICAgICAgdGhpcy5jYWNoZVt0aGlzLl9tYWtlQWJzKGYpXSA9IGZhbHNlO1xuXHQgICAgICBpZiAodGhpcy5zdHJpY3QpXG5cdCAgICAgICAgdGhyb3cgZXJcblx0ICAgICAgaWYgKCF0aGlzLnNpbGVudClcblx0ICAgICAgICBjb25zb2xlLmVycm9yKCdnbG9iIGVycm9yJywgZXIpO1xuXHQgICAgICBicmVha1xuXHQgIH1cblx0fTtcblxuXHRHbG9iU3luYy5wcm90b3R5cGUuX3Byb2Nlc3NHbG9iU3RhciA9IGZ1bmN0aW9uIChwcmVmaXgsIHJlYWQsIGFicywgcmVtYWluLCBpbmRleCwgaW5HbG9iU3Rhcikge1xuXG5cdCAgdmFyIGVudHJpZXMgPSB0aGlzLl9yZWFkZGlyKGFicywgaW5HbG9iU3Rhcik7XG5cblx0ICAvLyBubyBlbnRyaWVzIG1lYW5zIG5vdCBhIGRpciwgc28gaXQgY2FuIG5ldmVyIGhhdmUgbWF0Y2hlc1xuXHQgIC8vIGZvby50eHQvKiogZG9lc24ndCBtYXRjaCBmb28udHh0XG5cdCAgaWYgKCFlbnRyaWVzKVxuXHQgICAgcmV0dXJuXG5cblx0ICAvLyB0ZXN0IHdpdGhvdXQgdGhlIGdsb2JzdGFyLCBhbmQgd2l0aCBldmVyeSBjaGlsZCBib3RoIGJlbG93XG5cdCAgLy8gYW5kIHJlcGxhY2luZyB0aGUgZ2xvYnN0YXIuXG5cdCAgdmFyIHJlbWFpbldpdGhvdXRHbG9iU3RhciA9IHJlbWFpbi5zbGljZSgxKTtcblx0ICB2YXIgZ3NwcmVmID0gcHJlZml4ID8gWyBwcmVmaXggXSA6IFtdO1xuXHQgIHZhciBub0dsb2JTdGFyID0gZ3NwcmVmLmNvbmNhdChyZW1haW5XaXRob3V0R2xvYlN0YXIpO1xuXG5cdCAgLy8gdGhlIG5vR2xvYlN0YXIgcGF0dGVybiBleGl0cyB0aGUgaW5HbG9iU3RhciBzdGF0ZVxuXHQgIHRoaXMuX3Byb2Nlc3Mobm9HbG9iU3RhciwgaW5kZXgsIGZhbHNlKTtcblxuXHQgIHZhciBsZW4gPSBlbnRyaWVzLmxlbmd0aDtcblx0ICB2YXIgaXNTeW0gPSB0aGlzLnN5bWxpbmtzW2Fic107XG5cblx0ICAvLyBJZiBpdCdzIGEgc3ltbGluaywgYW5kIHdlJ3JlIGluIGEgZ2xvYnN0YXIsIHRoZW4gc3RvcFxuXHQgIGlmIChpc1N5bSAmJiBpbkdsb2JTdGFyKVxuXHQgICAgcmV0dXJuXG5cblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICB2YXIgZSA9IGVudHJpZXNbaV07XG5cdCAgICBpZiAoZS5jaGFyQXQoMCkgPT09ICcuJyAmJiAhdGhpcy5kb3QpXG5cdCAgICAgIGNvbnRpbnVlXG5cblx0ICAgIC8vIHRoZXNlIHR3byBjYXNlcyBlbnRlciB0aGUgaW5HbG9iU3RhciBzdGF0ZVxuXHQgICAgdmFyIGluc3RlYWQgPSBnc3ByZWYuY29uY2F0KGVudHJpZXNbaV0sIHJlbWFpbldpdGhvdXRHbG9iU3Rhcik7XG5cdCAgICB0aGlzLl9wcm9jZXNzKGluc3RlYWQsIGluZGV4LCB0cnVlKTtcblxuXHQgICAgdmFyIGJlbG93ID0gZ3NwcmVmLmNvbmNhdChlbnRyaWVzW2ldLCByZW1haW4pO1xuXHQgICAgdGhpcy5fcHJvY2VzcyhiZWxvdywgaW5kZXgsIHRydWUpO1xuXHQgIH1cblx0fTtcblxuXHRHbG9iU3luYy5wcm90b3R5cGUuX3Byb2Nlc3NTaW1wbGUgPSBmdW5jdGlvbiAocHJlZml4LCBpbmRleCkge1xuXHQgIC8vIFhYWCByZXZpZXcgdGhpcy4gIFNob3VsZG4ndCBpdCBiZSBkb2luZyB0aGUgbW91bnRpbmcgZXRjXG5cdCAgLy8gYmVmb3JlIGRvaW5nIHN0YXQ/ICBraW5kYSB3ZWlyZD9cblx0ICB2YXIgZXhpc3RzID0gdGhpcy5fc3RhdChwcmVmaXgpO1xuXG5cdCAgaWYgKCF0aGlzLm1hdGNoZXNbaW5kZXhdKVxuXHQgICAgdGhpcy5tYXRjaGVzW2luZGV4XSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cblx0ICAvLyBJZiBpdCBkb2Vzbid0IGV4aXN0LCB0aGVuIGp1c3QgbWFyayB0aGUgbGFjayBvZiByZXN1bHRzXG5cdCAgaWYgKCFleGlzdHMpXG5cdCAgICByZXR1cm5cblxuXHQgIGlmIChwcmVmaXggJiYgaXNBYnNvbHV0ZShwcmVmaXgpICYmICF0aGlzLm5vbW91bnQpIHtcblx0ICAgIHZhciB0cmFpbCA9IC9bXFwvXFxcXF0kLy50ZXN0KHByZWZpeCk7XG5cdCAgICBpZiAocHJlZml4LmNoYXJBdCgwKSA9PT0gJy8nKSB7XG5cdCAgICAgIHByZWZpeCA9IHBhdGguam9pbih0aGlzLnJvb3QsIHByZWZpeCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBwcmVmaXggPSBwYXRoLnJlc29sdmUodGhpcy5yb290LCBwcmVmaXgpO1xuXHQgICAgICBpZiAodHJhaWwpXG5cdCAgICAgICAgcHJlZml4ICs9ICcvJztcblx0ICAgIH1cblx0ICB9XG5cblx0ICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJylcblx0ICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cblx0ICAvLyBNYXJrIHRoaXMgYXMgYSBtYXRjaFxuXHQgIHRoaXMuX2VtaXRNYXRjaChpbmRleCwgcHJlZml4KTtcblx0fTtcblxuXHQvLyBSZXR1cm5zIGVpdGhlciAnRElSJywgJ0ZJTEUnLCBvciBmYWxzZVxuXHRHbG9iU3luYy5wcm90b3R5cGUuX3N0YXQgPSBmdW5jdGlvbiAoZikge1xuXHQgIHZhciBhYnMgPSB0aGlzLl9tYWtlQWJzKGYpO1xuXHQgIHZhciBuZWVkRGlyID0gZi5zbGljZSgtMSkgPT09ICcvJztcblxuXHQgIGlmIChmLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoKVxuXHQgICAgcmV0dXJuIGZhbHNlXG5cblx0ICBpZiAoIXRoaXMuc3RhdCAmJiBvd25Qcm9wKHRoaXMuY2FjaGUsIGFicykpIHtcblx0ICAgIHZhciBjID0gdGhpcy5jYWNoZVthYnNdO1xuXG5cdCAgICBpZiAoQXJyYXkuaXNBcnJheShjKSlcblx0ICAgICAgYyA9ICdESVInO1xuXG5cdCAgICAvLyBJdCBleGlzdHMsIGJ1dCBtYXliZSBub3QgaG93IHdlIG5lZWQgaXRcblx0ICAgIGlmICghbmVlZERpciB8fCBjID09PSAnRElSJylcblx0ICAgICAgcmV0dXJuIGNcblxuXHQgICAgaWYgKG5lZWREaXIgJiYgYyA9PT0gJ0ZJTEUnKVxuXHQgICAgICByZXR1cm4gZmFsc2VcblxuXHQgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgdG8gc3RhdCwgYmVjYXVzZSBtYXliZSBjPXRydWVcblx0ICAgIC8vIGlmIHdlIGtub3cgaXQgZXhpc3RzLCBidXQgbm90IHdoYXQgaXQgaXMuXG5cdCAgfVxuXHQgIHZhciBzdGF0ID0gdGhpcy5zdGF0Q2FjaGVbYWJzXTtcblx0ICBpZiAoIXN0YXQpIHtcblx0ICAgIHZhciBsc3RhdDtcblx0ICAgIHRyeSB7XG5cdCAgICAgIGxzdGF0ID0gdGhpcy5mcy5sc3RhdFN5bmMoYWJzKTtcblx0ICAgIH0gY2F0Y2ggKGVyKSB7XG5cdCAgICAgIGlmIChlciAmJiAoZXIuY29kZSA9PT0gJ0VOT0VOVCcgfHwgZXIuY29kZSA9PT0gJ0VOT1RESVInKSkge1xuXHQgICAgICAgIHRoaXMuc3RhdENhY2hlW2Fic10gPSBmYWxzZTtcblx0ICAgICAgICByZXR1cm4gZmFsc2Vcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICBpZiAobHN0YXQgJiYgbHN0YXQuaXNTeW1ib2xpY0xpbmsoKSkge1xuXHQgICAgICB0cnkge1xuXHQgICAgICAgIHN0YXQgPSB0aGlzLmZzLnN0YXRTeW5jKGFicyk7XG5cdCAgICAgIH0gY2F0Y2ggKGVyKSB7XG5cdCAgICAgICAgc3RhdCA9IGxzdGF0O1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBzdGF0ID0gbHN0YXQ7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgdGhpcy5zdGF0Q2FjaGVbYWJzXSA9IHN0YXQ7XG5cblx0ICB2YXIgYyA9IHRydWU7XG5cdCAgaWYgKHN0YXQpXG5cdCAgICBjID0gc3RhdC5pc0RpcmVjdG9yeSgpID8gJ0RJUicgOiAnRklMRSc7XG5cblx0ICB0aGlzLmNhY2hlW2Fic10gPSB0aGlzLmNhY2hlW2Fic10gfHwgYztcblxuXHQgIGlmIChuZWVkRGlyICYmIGMgPT09ICdGSUxFJylcblx0ICAgIHJldHVybiBmYWxzZVxuXG5cdCAgcmV0dXJuIGNcblx0fTtcblxuXHRHbG9iU3luYy5wcm90b3R5cGUuX21hcmsgPSBmdW5jdGlvbiAocCkge1xuXHQgIHJldHVybiBjb21tb24ubWFyayh0aGlzLCBwKVxuXHR9O1xuXG5cdEdsb2JTeW5jLnByb3RvdHlwZS5fbWFrZUFicyA9IGZ1bmN0aW9uIChmKSB7XG5cdCAgcmV0dXJuIGNvbW1vbi5tYWtlQWJzKHRoaXMsIGYpXG5cdH07XG5cdHJldHVybiBzeW5jJDk7XG59XG5cbi8vIFJldHVybnMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHdyYXBwZWQgY2FsbGJhY2tcbi8vIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHNob3VsZCBkbyBzb21lIHN0dWZmLCBhbmQgcmV0dXJuIGFcbi8vIHByZXN1bWFibHkgZGlmZmVyZW50IGNhbGxiYWNrIGZ1bmN0aW9uLlxuLy8gVGhpcyBtYWtlcyBzdXJlIHRoYXQgb3duIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkLCBzbyB0aGF0XG4vLyBkZWNvcmF0aW9ucyBhbmQgc3VjaCBhcmUgbm90IGxvc3QgYWxvbmcgdGhlIHdheS5cbnZhciB3cmFwcHlfMSA9IHdyYXBweSQyO1xuZnVuY3Rpb24gd3JhcHB5JDIgKGZuLCBjYikge1xuICBpZiAoZm4gJiYgY2IpIHJldHVybiB3cmFwcHkkMihmbikoY2IpXG5cbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCduZWVkIHdyYXBwZXIgZnVuY3Rpb24nKVxuXG4gIE9iamVjdC5rZXlzKGZuKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgd3JhcHBlcltrXSA9IGZuW2tdO1xuICB9KTtcblxuICByZXR1cm4gd3JhcHBlclxuXG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICB2YXIgcmV0ID0gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgdmFyIGNiID0gYXJnc1thcmdzLmxlbmd0aC0xXTtcbiAgICBpZiAodHlwZW9mIHJldCA9PT0gJ2Z1bmN0aW9uJyAmJiByZXQgIT09IGNiKSB7XG4gICAgICBPYmplY3Qua2V5cyhjYikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXRba10gPSBjYltrXTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cbn1cblxudmFyIG9uY2VFeHBvcnRzID0ge307XG52YXIgb25jZSQyID0ge1xuICBnZXQgZXhwb3J0cygpeyByZXR1cm4gb25jZUV4cG9ydHM7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBvbmNlRXhwb3J0cyA9IHY7IH0sXG59O1xuXG52YXIgd3JhcHB5JDEgPSB3cmFwcHlfMTtcbm9uY2UkMi5leHBvcnRzID0gd3JhcHB5JDEob25jZSQxKTtcbm9uY2VFeHBvcnRzLnN0cmljdCA9IHdyYXBweSQxKG9uY2VTdHJpY3QpO1xuXG5vbmNlJDEucHJvdG8gPSBvbmNlJDEoZnVuY3Rpb24gKCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCAnb25jZScsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uY2UkMSh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlU3RyaWN0Jywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZVN0cmljdCh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufSk7XG5cbmZ1bmN0aW9uIG9uY2UkMSAoZm4pIHtcbiAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGYuY2FsbGVkKSByZXR1cm4gZi52YWx1ZVxuICAgIGYuY2FsbGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gZi52YWx1ZSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfTtcbiAgZi5jYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZcbn1cblxuZnVuY3Rpb24gb25jZVN0cmljdCAoZm4pIHtcbiAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGYuY2FsbGVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGYub25jZUVycm9yKVxuICAgIGYuY2FsbGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gZi52YWx1ZSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfTtcbiAgdmFyIG5hbWUgPSBmbi5uYW1lIHx8ICdGdW5jdGlvbiB3cmFwcGVkIHdpdGggYG9uY2VgJztcbiAgZi5vbmNlRXJyb3IgPSBuYW1lICsgXCIgc2hvdWxkbid0IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZVwiO1xuICBmLmNhbGxlZCA9IGZhbHNlO1xuICByZXR1cm4gZlxufVxuXG52YXIgd3JhcHB5ID0gd3JhcHB5XzE7XG52YXIgcmVxcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG52YXIgb25jZSA9IG9uY2VFeHBvcnRzO1xuXG52YXIgaW5mbGlnaHRfMSA9IHdyYXBweShpbmZsaWdodCk7XG5cbmZ1bmN0aW9uIGluZmxpZ2h0IChrZXksIGNiKSB7XG4gIGlmIChyZXFzW2tleV0pIHtcbiAgICByZXFzW2tleV0ucHVzaChjYik7XG4gICAgcmV0dXJuIG51bGxcbiAgfSBlbHNlIHtcbiAgICByZXFzW2tleV0gPSBbY2JdO1xuICAgIHJldHVybiBtYWtlcmVzKGtleSlcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlcmVzIChrZXkpIHtcbiAgcmV0dXJuIG9uY2UoZnVuY3Rpb24gUkVTICgpIHtcbiAgICB2YXIgY2JzID0gcmVxc1trZXldO1xuICAgIHZhciBsZW4gPSBjYnMubGVuZ3RoO1xuICAgIHZhciBhcmdzID0gc2xpY2UkMShhcmd1bWVudHMpO1xuXG4gICAgLy8gWFhYIEl0J3Mgc29tZXdoYXQgYW1iaWd1b3VzIHdoZXRoZXIgYSBuZXcgY2FsbGJhY2sgYWRkZWQgaW4gdGhpc1xuICAgIC8vIHBhc3Mgc2hvdWxkIGJlIHF1ZXVlZCBmb3IgbGF0ZXIgZXhlY3V0aW9uIGlmIHNvbWV0aGluZyBpbiB0aGVcbiAgICAvLyBsaXN0IG9mIGNhbGxiYWNrcyB0aHJvd3MsIG9yIGlmIGl0IHNob3VsZCBqdXN0IGJlIGRpc2NhcmRlZC5cbiAgICAvLyBIb3dldmVyLCBpdCdzIHN1Y2ggYW4gZWRnZSBjYXNlIHRoYXQgaXQgaGFyZGx5IG1hdHRlcnMsIGFuZCBlaXRoZXJcbiAgICAvLyBjaG9pY2UgaXMgbGlrZWx5IGFzIHN1cnByaXNpbmcgYXMgdGhlIG90aGVyLlxuICAgIC8vIEFzIGl0IGhhcHBlbnMsIHdlIGRvIGdvIGFoZWFkIGFuZCBzY2hlZHVsZSBpdCBmb3IgbGF0ZXIgZXhlY3V0aW9uLlxuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNic1tpXS5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGNicy5sZW5ndGggPiBsZW4pIHtcbiAgICAgICAgLy8gYWRkZWQgbW9yZSBpbiB0aGUgaW50ZXJpbS5cbiAgICAgICAgLy8gZGUtemFsZ28sIGp1c3QgaW4gY2FzZSwgYnV0IGRvbid0IGNhbGwgYWdhaW4uXG4gICAgICAgIGNicy5zcGxpY2UoMCwgbGVuKTtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgUkVTLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSByZXFzW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBzbGljZSQxIChhcmdzKSB7XG4gIHZhciBsZW5ndGggPSBhcmdzLmxlbmd0aDtcbiAgdmFyIGFycmF5ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgYXJyYXlbaV0gPSBhcmdzW2ldO1xuICByZXR1cm4gYXJyYXlcbn1cblxudmFyIGdsb2JfMTtcbnZhciBoYXNSZXF1aXJlZEdsb2I7XG5cbmZ1bmN0aW9uIHJlcXVpcmVHbG9iICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkR2xvYikgcmV0dXJuIGdsb2JfMTtcblx0aGFzUmVxdWlyZWRHbG9iID0gMTtcblx0Ly8gQXBwcm9hY2g6XG5cdC8vXG5cdC8vIDEuIEdldCB0aGUgbWluaW1hdGNoIHNldFxuXHQvLyAyLiBGb3IgZWFjaCBwYXR0ZXJuIGluIHRoZSBzZXQsIFBST0NFU1MocGF0dGVybiwgZmFsc2UpXG5cdC8vIDMuIFN0b3JlIG1hdGNoZXMgcGVyLXNldCwgdGhlbiB1bmlxIHRoZW1cblx0Ly9cblx0Ly8gUFJPQ0VTUyhwYXR0ZXJuLCBpbkdsb2JTdGFyKVxuXHQvLyBHZXQgdGhlIGZpcnN0IFtuXSBpdGVtcyBmcm9tIHBhdHRlcm4gdGhhdCBhcmUgYWxsIHN0cmluZ3Ncblx0Ly8gSm9pbiB0aGVzZSB0b2dldGhlci4gIFRoaXMgaXMgUFJFRklYLlxuXHQvLyAgIElmIHRoZXJlIGlzIG5vIG1vcmUgcmVtYWluaW5nLCB0aGVuIHN0YXQoUFJFRklYKSBhbmRcblx0Ly8gICBhZGQgdG8gbWF0Y2hlcyBpZiBpdCBzdWNjZWVkcy4gIEVORC5cblx0Ly9cblx0Ly8gSWYgaW5HbG9iU3RhciBhbmQgUFJFRklYIGlzIHN5bWxpbmsgYW5kIHBvaW50cyB0byBkaXJcblx0Ly8gICBzZXQgRU5UUklFUyA9IFtdXG5cdC8vIGVsc2UgcmVhZGRpcihQUkVGSVgpIGFzIEVOVFJJRVNcblx0Ly8gICBJZiBmYWlsLCBFTkRcblx0Ly9cblx0Ly8gd2l0aCBFTlRSSUVTXG5cdC8vICAgSWYgcGF0dGVybltuXSBpcyBHTE9CU1RBUlxuXHQvLyAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBnbG9ic3RhciBtYXRjaCBpcyBlbXB0eVxuXHQvLyAgICAgLy8gYnkgcHJ1bmluZyBpdCBvdXQsIGFuZCB0ZXN0aW5nIHRoZSByZXN1bHRpbmcgcGF0dGVyblxuXHQvLyAgICAgUFJPQ0VTUyhwYXR0ZXJuWzAuLm5dICsgcGF0dGVybltuKzEgLi4gJF0sIGZhbHNlKVxuXHQvLyAgICAgLy8gaGFuZGxlIG90aGVyIGNhc2VzLlxuXHQvLyAgICAgZm9yIEVOVFJZIGluIEVOVFJJRVMgKG5vdCBkb3RmaWxlcylcblx0Ly8gICAgICAgLy8gYXR0YWNoIGdsb2JzdGFyICsgdGFpbCBvbnRvIHRoZSBlbnRyeVxuXHQvLyAgICAgICAvLyBNYXJrIHRoYXQgdGhpcyBlbnRyeSBpcyBhIGdsb2JzdGFyIG1hdGNoXG5cdC8vICAgICAgIFBST0NFU1MocGF0dGVyblswLi5uXSArIEVOVFJZICsgcGF0dGVybltuIC4uICRdLCB0cnVlKVxuXHQvL1xuXHQvLyAgIGVsc2UgLy8gbm90IGdsb2JzdGFyXG5cdC8vICAgICBmb3IgRU5UUlkgaW4gRU5UUklFUyAobm90IGRvdGZpbGVzLCB1bmxlc3MgcGF0dGVybltuXSBpcyBkb3QpXG5cdC8vICAgICAgIFRlc3QgRU5UUlkgYWdhaW5zdCBwYXR0ZXJuW25dXG5cdC8vICAgICAgIElmIGZhaWxzLCBjb250aW51ZVxuXHQvLyAgICAgICBJZiBwYXNzZXMsIFBST0NFU1MocGF0dGVyblswLi5uXSArIGl0ZW0gKyBwYXR0ZXJuW24rMSAuLiAkXSlcblx0Ly9cblx0Ly8gQ2F2ZWF0OlxuXHQvLyAgIENhY2hlIGFsbCBzdGF0cyBhbmQgcmVhZGRpcnMgcmVzdWx0cyB0byBtaW5pbWl6ZSBzeXNjYWxsLiAgU2luY2UgYWxsXG5cdC8vICAgd2UgZXZlciBjYXJlIGFib3V0IGlzIGV4aXN0ZW5jZSBhbmQgZGlyZWN0b3J5LW5lc3MsIHdlIGNhbiBqdXN0IGtlZXBcblx0Ly8gICBgdHJ1ZWAgZm9yIGZpbGVzLCBhbmQgW2NoaWxkcmVuLC4uLl0gZm9yIGRpcmVjdG9yaWVzLCBvciBgZmFsc2VgIGZvclxuXHQvLyAgIHRoaW5ncyB0aGF0IGRvbid0IGV4aXN0LlxuXG5cdGdsb2JfMSA9IGdsb2I7XG5cblx0dmFyIHJwID0gZnNfcmVhbHBhdGg7XG5cdHZhciBtaW5pbWF0Y2ggPSBtaW5pbWF0Y2hfMTtcblx0dmFyIGluaGVyaXRzID0gaW5oZXJpdHNFeHBvcnRzO1xuXHR2YXIgRUUgPSByZXF1aXJlJCQwJDUuRXZlbnRFbWl0dGVyO1xuXHR2YXIgcGF0aCA9IHJlcXVpcmUkJDAkNDtcblx0dmFyIGFzc2VydCA9IHJlcXVpcmUkJDU7XG5cdHZhciBpc0Fic29sdXRlID0gcmVxdWlyZSQkMCQ0LmlzQWJzb2x1dGU7XG5cdHZhciBnbG9iU3luYyA9IHJlcXVpcmVTeW5jKCk7XG5cdHZhciBjb21tb24gPSBjb21tb24kYztcblx0dmFyIHNldG9wdHMgPSBjb21tb24uc2V0b3B0cztcblx0dmFyIG93blByb3AgPSBjb21tb24ub3duUHJvcDtcblx0dmFyIGluZmxpZ2h0ID0gaW5mbGlnaHRfMTtcblx0dmFyIGNoaWxkcmVuSWdub3JlZCA9IGNvbW1vbi5jaGlsZHJlbklnbm9yZWQ7XG5cdHZhciBpc0lnbm9yZWQgPSBjb21tb24uaXNJZ25vcmVkO1xuXG5cdHZhciBvbmNlID0gb25jZUV4cG9ydHM7XG5cblx0ZnVuY3Rpb24gZ2xvYiAocGF0dGVybiwgb3B0aW9ucywgY2IpIHtcblx0ICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IHt9O1xuXHQgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuXG5cdCAgaWYgKG9wdGlvbnMuc3luYykge1xuXHQgICAgaWYgKGNiKVxuXHQgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBwcm92aWRlZCB0byBzeW5jIGdsb2InKVxuXHQgICAgcmV0dXJuIGdsb2JTeW5jKHBhdHRlcm4sIG9wdGlvbnMpXG5cdCAgfVxuXG5cdCAgcmV0dXJuIG5ldyBHbG9iKHBhdHRlcm4sIG9wdGlvbnMsIGNiKVxuXHR9XG5cblx0Z2xvYi5zeW5jID0gZ2xvYlN5bmM7XG5cdHZhciBHbG9iU3luYyA9IGdsb2IuR2xvYlN5bmMgPSBnbG9iU3luYy5HbG9iU3luYztcblxuXHQvLyBvbGQgYXBpIHN1cmZhY2Vcblx0Z2xvYi5nbG9iID0gZ2xvYjtcblxuXHRmdW5jdGlvbiBleHRlbmQgKG9yaWdpbiwgYWRkKSB7XG5cdCAgaWYgKGFkZCA9PT0gbnVsbCB8fCB0eXBlb2YgYWRkICE9PSAnb2JqZWN0Jykge1xuXHQgICAgcmV0dXJuIG9yaWdpblxuXHQgIH1cblxuXHQgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcblx0ICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuXHQgIHdoaWxlIChpLS0pIHtcblx0ICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcblx0ICB9XG5cdCAgcmV0dXJuIG9yaWdpblxuXHR9XG5cblx0Z2xvYi5oYXNNYWdpYyA9IGZ1bmN0aW9uIChwYXR0ZXJuLCBvcHRpb25zXykge1xuXHQgIHZhciBvcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zXyk7XG5cdCAgb3B0aW9ucy5ub3Byb2Nlc3MgPSB0cnVlO1xuXG5cdCAgdmFyIGcgPSBuZXcgR2xvYihwYXR0ZXJuLCBvcHRpb25zKTtcblx0ICB2YXIgc2V0ID0gZy5taW5pbWF0Y2guc2V0O1xuXG5cdCAgaWYgKCFwYXR0ZXJuKVxuXHQgICAgcmV0dXJuIGZhbHNlXG5cblx0ICBpZiAoc2V0Lmxlbmd0aCA+IDEpXG5cdCAgICByZXR1cm4gdHJ1ZVxuXG5cdCAgZm9yICh2YXIgaiA9IDA7IGogPCBzZXRbMF0ubGVuZ3RoOyBqKyspIHtcblx0ICAgIGlmICh0eXBlb2Ygc2V0WzBdW2pdICE9PSAnc3RyaW5nJylcblx0ICAgICAgcmV0dXJuIHRydWVcblx0ICB9XG5cblx0ICByZXR1cm4gZmFsc2Vcblx0fTtcblxuXHRnbG9iLkdsb2IgPSBHbG9iO1xuXHRpbmhlcml0cyhHbG9iLCBFRSk7XG5cdGZ1bmN0aW9uIEdsb2IgKHBhdHRlcm4sIG9wdGlvbnMsIGNiKSB7XG5cdCAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICBjYiA9IG9wdGlvbnM7XG5cdCAgICBvcHRpb25zID0gbnVsbDtcblx0ICB9XG5cblx0ICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnN5bmMpIHtcblx0ICAgIGlmIChjYilcblx0ICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FsbGJhY2sgcHJvdmlkZWQgdG8gc3luYyBnbG9iJylcblx0ICAgIHJldHVybiBuZXcgR2xvYlN5bmMocGF0dGVybiwgb3B0aW9ucylcblx0ICB9XG5cblx0ICBpZiAoISh0aGlzIGluc3RhbmNlb2YgR2xvYikpXG5cdCAgICByZXR1cm4gbmV3IEdsb2IocGF0dGVybiwgb3B0aW9ucywgY2IpXG5cblx0ICBzZXRvcHRzKHRoaXMsIHBhdHRlcm4sIG9wdGlvbnMpO1xuXHQgIHRoaXMuX2RpZFJlYWxQYXRoID0gZmFsc2U7XG5cblx0ICAvLyBwcm9jZXNzIGVhY2ggcGF0dGVybiBpbiB0aGUgbWluaW1hdGNoIHNldFxuXHQgIHZhciBuID0gdGhpcy5taW5pbWF0Y2guc2V0Lmxlbmd0aDtcblxuXHQgIC8vIFRoZSBtYXRjaGVzIGFyZSBzdG9yZWQgYXMgezxmaWxlbmFtZT46IHRydWUsLi4ufSBzbyB0aGF0XG5cdCAgLy8gZHVwbGljYXRlcyBhcmUgYXV0b21hZ2ljYWxseSBwcnVuZWQuXG5cdCAgLy8gTGF0ZXIsIHdlIGRvIGFuIE9iamVjdC5rZXlzKCkgb24gdGhlc2UuXG5cdCAgLy8gS2VlcCB0aGVtIGFzIGEgbGlzdCBzbyB3ZSBjYW4gZmlsbCBpbiB3aGVuIG5vbnVsbCBpcyBzZXQuXG5cdCAgdGhpcy5tYXRjaGVzID0gbmV3IEFycmF5KG4pO1xuXG5cdCAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgY2IgPSBvbmNlKGNiKTtcblx0ICAgIHRoaXMub24oJ2Vycm9yJywgY2IpO1xuXHQgICAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKG1hdGNoZXMpIHtcblx0ICAgICAgY2IobnVsbCwgbWF0Y2hlcyk7XG5cdCAgICB9KTtcblx0ICB9XG5cblx0ICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgdGhpcy5fcHJvY2Vzc2luZyA9IDA7XG5cblx0ICB0aGlzLl9lbWl0UXVldWUgPSBbXTtcblx0ICB0aGlzLl9wcm9jZXNzUXVldWUgPSBbXTtcblx0ICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXG5cdCAgaWYgKHRoaXMubm9wcm9jZXNzKVxuXHQgICAgcmV0dXJuIHRoaXNcblxuXHQgIGlmIChuID09PSAwKVxuXHQgICAgcmV0dXJuIGRvbmUoKVxuXG5cdCAgdmFyIHN5bmMgPSB0cnVlO1xuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSArKykge1xuXHQgICAgdGhpcy5fcHJvY2Vzcyh0aGlzLm1pbmltYXRjaC5zZXRbaV0sIGksIGZhbHNlLCBkb25lKTtcblx0ICB9XG5cdCAgc3luYyA9IGZhbHNlO1xuXG5cdCAgZnVuY3Rpb24gZG9uZSAoKSB7XG5cdCAgICAtLXNlbGYuX3Byb2Nlc3Npbmc7XG5cdCAgICBpZiAoc2VsZi5fcHJvY2Vzc2luZyA8PSAwKSB7XG5cdCAgICAgIGlmIChzeW5jKSB7XG5cdCAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICBzZWxmLl9maW5pc2goKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBzZWxmLl9maW5pc2goKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fVxuXG5cdEdsb2IucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBHbG9iKTtcblx0ICBpZiAodGhpcy5hYm9ydGVkKVxuXHQgICAgcmV0dXJuXG5cblx0ICBpZiAodGhpcy5yZWFscGF0aCAmJiAhdGhpcy5fZGlkUmVhbHBhdGgpXG5cdCAgICByZXR1cm4gdGhpcy5fcmVhbHBhdGgoKVxuXG5cdCAgY29tbW9uLmZpbmlzaCh0aGlzKTtcblx0ICB0aGlzLmVtaXQoJ2VuZCcsIHRoaXMuZm91bmQpO1xuXHR9O1xuXG5cdEdsb2IucHJvdG90eXBlLl9yZWFscGF0aCA9IGZ1bmN0aW9uICgpIHtcblx0ICBpZiAodGhpcy5fZGlkUmVhbHBhdGgpXG5cdCAgICByZXR1cm5cblxuXHQgIHRoaXMuX2RpZFJlYWxwYXRoID0gdHJ1ZTtcblxuXHQgIHZhciBuID0gdGhpcy5tYXRjaGVzLmxlbmd0aDtcblx0ICBpZiAobiA9PT0gMClcblx0ICAgIHJldHVybiB0aGlzLl9maW5pc2goKVxuXG5cdCAgdmFyIHNlbGYgPSB0aGlzO1xuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5tYXRjaGVzLmxlbmd0aDsgaSsrKVxuXHQgICAgdGhpcy5fcmVhbHBhdGhTZXQoaSwgbmV4dCk7XG5cblx0ICBmdW5jdGlvbiBuZXh0ICgpIHtcblx0ICAgIGlmICgtLW4gPT09IDApXG5cdCAgICAgIHNlbGYuX2ZpbmlzaCgpO1xuXHQgIH1cblx0fTtcblxuXHRHbG9iLnByb3RvdHlwZS5fcmVhbHBhdGhTZXQgPSBmdW5jdGlvbiAoaW5kZXgsIGNiKSB7XG5cdCAgdmFyIG1hdGNoc2V0ID0gdGhpcy5tYXRjaGVzW2luZGV4XTtcblx0ICBpZiAoIW1hdGNoc2V0KVxuXHQgICAgcmV0dXJuIGNiKClcblxuXHQgIHZhciBmb3VuZCA9IE9iamVjdC5rZXlzKG1hdGNoc2V0KTtcblx0ICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgdmFyIG4gPSBmb3VuZC5sZW5ndGg7XG5cblx0ICBpZiAobiA9PT0gMClcblx0ICAgIHJldHVybiBjYigpXG5cblx0ICB2YXIgc2V0ID0gdGhpcy5tYXRjaGVzW2luZGV4XSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdCAgZm91bmQuZm9yRWFjaChmdW5jdGlvbiAocCwgaSkge1xuXHQgICAgLy8gSWYgdGhlcmUncyBhIHByb2JsZW0gd2l0aCB0aGUgc3RhdCwgdGhlbiBpdCBtZWFucyB0aGF0XG5cdCAgICAvLyBvbmUgb3IgbW9yZSBvZiB0aGUgbGlua3MgaW4gdGhlIHJlYWxwYXRoIGNvdWxkbid0IGJlXG5cdCAgICAvLyByZXNvbHZlZC4gIGp1c3QgcmV0dXJuIHRoZSBhYnMgdmFsdWUgaW4gdGhhdCBjYXNlLlxuXHQgICAgcCA9IHNlbGYuX21ha2VBYnMocCk7XG5cdCAgICBycC5yZWFscGF0aChwLCBzZWxmLnJlYWxwYXRoQ2FjaGUsIGZ1bmN0aW9uIChlciwgcmVhbCkge1xuXHQgICAgICBpZiAoIWVyKVxuXHQgICAgICAgIHNldFtyZWFsXSA9IHRydWU7XG5cdCAgICAgIGVsc2UgaWYgKGVyLnN5c2NhbGwgPT09ICdzdGF0Jylcblx0ICAgICAgICBzZXRbcF0gPSB0cnVlO1xuXHQgICAgICBlbHNlXG5cdCAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVyKTsgLy8gc3JzbHkgd3RmIHJpZ2h0IGhlcmVcblxuXHQgICAgICBpZiAoLS1uID09PSAwKSB7XG5cdCAgICAgICAgc2VsZi5tYXRjaGVzW2luZGV4XSA9IHNldDtcblx0ICAgICAgICBjYigpO1xuXHQgICAgICB9XG5cdCAgICB9KTtcblx0ICB9KTtcblx0fTtcblxuXHRHbG9iLnByb3RvdHlwZS5fbWFyayA9IGZ1bmN0aW9uIChwKSB7XG5cdCAgcmV0dXJuIGNvbW1vbi5tYXJrKHRoaXMsIHApXG5cdH07XG5cblx0R2xvYi5wcm90b3R5cGUuX21ha2VBYnMgPSBmdW5jdGlvbiAoZikge1xuXHQgIHJldHVybiBjb21tb24ubWFrZUFicyh0aGlzLCBmKVxuXHR9O1xuXG5cdEdsb2IucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuXHQgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG5cdCAgdGhpcy5lbWl0KCdhYm9ydCcpO1xuXHR9O1xuXG5cdEdsb2IucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuXHQgIGlmICghdGhpcy5wYXVzZWQpIHtcblx0ICAgIHRoaXMucGF1c2VkID0gdHJ1ZTtcblx0ICAgIHRoaXMuZW1pdCgncGF1c2UnKTtcblx0ICB9XG5cdH07XG5cblx0R2xvYi5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuXHQgIGlmICh0aGlzLnBhdXNlZCkge1xuXHQgICAgdGhpcy5lbWl0KCdyZXN1bWUnKTtcblx0ICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XG5cdCAgICBpZiAodGhpcy5fZW1pdFF1ZXVlLmxlbmd0aCkge1xuXHQgICAgICB2YXIgZXEgPSB0aGlzLl9lbWl0UXVldWUuc2xpY2UoMCk7XG5cdCAgICAgIHRoaXMuX2VtaXRRdWV1ZS5sZW5ndGggPSAwO1xuXHQgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVxLmxlbmd0aDsgaSArKykge1xuXHQgICAgICAgIHZhciBlID0gZXFbaV07XG5cdCAgICAgICAgdGhpcy5fZW1pdE1hdGNoKGVbMF0sIGVbMV0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fcHJvY2Vzc1F1ZXVlLmxlbmd0aCkge1xuXHQgICAgICB2YXIgcHEgPSB0aGlzLl9wcm9jZXNzUXVldWUuc2xpY2UoMCk7XG5cdCAgICAgIHRoaXMuX3Byb2Nlc3NRdWV1ZS5sZW5ndGggPSAwO1xuXHQgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBxLmxlbmd0aDsgaSArKykge1xuXHQgICAgICAgIHZhciBwID0gcHFbaV07XG5cdCAgICAgICAgdGhpcy5fcHJvY2Vzc2luZy0tO1xuXHQgICAgICAgIHRoaXMuX3Byb2Nlc3MocFswXSwgcFsxXSwgcFsyXSwgcFszXSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdH07XG5cblx0R2xvYi5wcm90b3R5cGUuX3Byb2Nlc3MgPSBmdW5jdGlvbiAocGF0dGVybiwgaW5kZXgsIGluR2xvYlN0YXIsIGNiKSB7XG5cdCAgYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBHbG9iKTtcblx0ICBhc3NlcnQodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKTtcblxuXHQgIGlmICh0aGlzLmFib3J0ZWQpXG5cdCAgICByZXR1cm5cblxuXHQgIHRoaXMuX3Byb2Nlc3NpbmcrKztcblx0ICBpZiAodGhpcy5wYXVzZWQpIHtcblx0ICAgIHRoaXMuX3Byb2Nlc3NRdWV1ZS5wdXNoKFtwYXR0ZXJuLCBpbmRleCwgaW5HbG9iU3RhciwgY2JdKTtcblx0ICAgIHJldHVyblxuXHQgIH1cblxuXHQgIC8vY29uc29sZS5lcnJvcignUFJPQ0VTUyAlZCcsIHRoaXMuX3Byb2Nlc3NpbmcsIHBhdHRlcm4pXG5cblx0ICAvLyBHZXQgdGhlIGZpcnN0IFtuXSBwYXJ0cyBvZiBwYXR0ZXJuIHRoYXQgYXJlIGFsbCBzdHJpbmdzLlxuXHQgIHZhciBuID0gMDtcblx0ICB3aGlsZSAodHlwZW9mIHBhdHRlcm5bbl0gPT09ICdzdHJpbmcnKSB7XG5cdCAgICBuICsrO1xuXHQgIH1cblx0ICAvLyBub3cgbiBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9uZSB0aGF0IGlzICpub3QqIGEgc3RyaW5nLlxuXG5cdCAgLy8gc2VlIGlmIHRoZXJlJ3MgYW55dGhpbmcgZWxzZVxuXHQgIHZhciBwcmVmaXg7XG5cdCAgc3dpdGNoIChuKSB7XG5cdCAgICAvLyBpZiBub3QsIHRoZW4gdGhpcyBpcyByYXRoZXIgc2ltcGxlXG5cdCAgICBjYXNlIHBhdHRlcm4ubGVuZ3RoOlxuXHQgICAgICB0aGlzLl9wcm9jZXNzU2ltcGxlKHBhdHRlcm4uam9pbignLycpLCBpbmRleCwgY2IpO1xuXHQgICAgICByZXR1cm5cblxuXHQgICAgY2FzZSAwOlxuXHQgICAgICAvLyBwYXR0ZXJuICpzdGFydHMqIHdpdGggc29tZSBub24tdHJpdmlhbCBpdGVtLlxuXHQgICAgICAvLyBnb2luZyB0byByZWFkZGlyKGN3ZCksIGJ1dCBub3QgaW5jbHVkZSB0aGUgcHJlZml4IGluIG1hdGNoZXMuXG5cdCAgICAgIHByZWZpeCA9IG51bGw7XG5cdCAgICAgIGJyZWFrXG5cblx0ICAgIGRlZmF1bHQ6XG5cdCAgICAgIC8vIHBhdHRlcm4gaGFzIHNvbWUgc3RyaW5nIGJpdHMgaW4gdGhlIGZyb250LlxuXHQgICAgICAvLyB3aGF0ZXZlciBpdCBzdGFydHMgd2l0aCwgd2hldGhlciB0aGF0J3MgJ2Fic29sdXRlJyBsaWtlIC9mb28vYmFyLFxuXHQgICAgICAvLyBvciAncmVsYXRpdmUnIGxpa2UgJy4uL2Jheidcblx0ICAgICAgcHJlZml4ID0gcGF0dGVybi5zbGljZSgwLCBuKS5qb2luKCcvJyk7XG5cdCAgICAgIGJyZWFrXG5cdCAgfVxuXG5cdCAgdmFyIHJlbWFpbiA9IHBhdHRlcm4uc2xpY2Uobik7XG5cblx0ICAvLyBnZXQgdGhlIGxpc3Qgb2YgZW50cmllcy5cblx0ICB2YXIgcmVhZDtcblx0ICBpZiAocHJlZml4ID09PSBudWxsKVxuXHQgICAgcmVhZCA9ICcuJztcblx0ICBlbHNlIGlmIChpc0Fic29sdXRlKHByZWZpeCkgfHxcblx0ICAgICAgaXNBYnNvbHV0ZShwYXR0ZXJuLm1hcChmdW5jdGlvbiAocCkge1xuXHQgICAgICAgIHJldHVybiB0eXBlb2YgcCA9PT0gJ3N0cmluZycgPyBwIDogJ1sqXSdcblx0ICAgICAgfSkuam9pbignLycpKSkge1xuXHQgICAgaWYgKCFwcmVmaXggfHwgIWlzQWJzb2x1dGUocHJlZml4KSlcblx0ICAgICAgcHJlZml4ID0gJy8nICsgcHJlZml4O1xuXHQgICAgcmVhZCA9IHByZWZpeDtcblx0ICB9IGVsc2Vcblx0ICAgIHJlYWQgPSBwcmVmaXg7XG5cblx0ICB2YXIgYWJzID0gdGhpcy5fbWFrZUFicyhyZWFkKTtcblxuXHQgIC8vaWYgaWdub3JlZCwgc2tpcCBfcHJvY2Vzc2luZ1xuXHQgIGlmIChjaGlsZHJlbklnbm9yZWQodGhpcywgcmVhZCkpXG5cdCAgICByZXR1cm4gY2IoKVxuXG5cdCAgdmFyIGlzR2xvYlN0YXIgPSByZW1haW5bMF0gPT09IG1pbmltYXRjaC5HTE9CU1RBUjtcblx0ICBpZiAoaXNHbG9iU3Rhcilcblx0ICAgIHRoaXMuX3Byb2Nlc3NHbG9iU3RhcihwcmVmaXgsIHJlYWQsIGFicywgcmVtYWluLCBpbmRleCwgaW5HbG9iU3RhciwgY2IpO1xuXHQgIGVsc2Vcblx0ICAgIHRoaXMuX3Byb2Nlc3NSZWFkZGlyKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyLCBjYik7XG5cdH07XG5cblx0R2xvYi5wcm90b3R5cGUuX3Byb2Nlc3NSZWFkZGlyID0gZnVuY3Rpb24gKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyLCBjYikge1xuXHQgIHZhciBzZWxmID0gdGhpcztcblx0ICB0aGlzLl9yZWFkZGlyKGFicywgaW5HbG9iU3RhciwgZnVuY3Rpb24gKGVyLCBlbnRyaWVzKSB7XG5cdCAgICByZXR1cm4gc2VsZi5fcHJvY2Vzc1JlYWRkaXIyKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyLCBlbnRyaWVzLCBjYilcblx0ICB9KTtcblx0fTtcblxuXHRHbG9iLnByb3RvdHlwZS5fcHJvY2Vzc1JlYWRkaXIyID0gZnVuY3Rpb24gKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyLCBlbnRyaWVzLCBjYikge1xuXG5cdCAgLy8gaWYgdGhlIGFicyBpc24ndCBhIGRpciwgdGhlbiBub3RoaW5nIGNhbiBtYXRjaCFcblx0ICBpZiAoIWVudHJpZXMpXG5cdCAgICByZXR1cm4gY2IoKVxuXG5cdCAgLy8gSXQgd2lsbCBvbmx5IG1hdGNoIGRvdCBlbnRyaWVzIGlmIGl0IHN0YXJ0cyB3aXRoIGEgZG90LCBvciBpZlxuXHQgIC8vIGRvdCBpcyBzZXQuICBTdHVmZiBsaWtlIEAoLmZvb3wuYmFyKSBpc24ndCBhbGxvd2VkLlxuXHQgIHZhciBwbiA9IHJlbWFpblswXTtcblx0ICB2YXIgbmVnYXRlID0gISF0aGlzLm1pbmltYXRjaC5uZWdhdGU7XG5cdCAgdmFyIHJhd0dsb2IgPSBwbi5fZ2xvYjtcblx0ICB2YXIgZG90T2sgPSB0aGlzLmRvdCB8fCByYXdHbG9iLmNoYXJBdCgwKSA9PT0gJy4nO1xuXG5cdCAgdmFyIG1hdGNoZWRFbnRyaWVzID0gW107XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICB2YXIgZSA9IGVudHJpZXNbaV07XG5cdCAgICBpZiAoZS5jaGFyQXQoMCkgIT09ICcuJyB8fCBkb3RPaykge1xuXHQgICAgICB2YXIgbTtcblx0ICAgICAgaWYgKG5lZ2F0ZSAmJiAhcHJlZml4KSB7XG5cdCAgICAgICAgbSA9ICFlLm1hdGNoKHBuKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBtID0gZS5tYXRjaChwbik7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKG0pXG5cdCAgICAgICAgbWF0Y2hlZEVudHJpZXMucHVzaChlKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICAvL2NvbnNvbGUuZXJyb3IoJ3ByZDInLCBwcmVmaXgsIGVudHJpZXMsIHJlbWFpblswXS5fZ2xvYiwgbWF0Y2hlZEVudHJpZXMpXG5cblx0ICB2YXIgbGVuID0gbWF0Y2hlZEVudHJpZXMubGVuZ3RoO1xuXHQgIC8vIElmIHRoZXJlIGFyZSBubyBtYXRjaGVkIGVudHJpZXMsIHRoZW4gbm90aGluZyBtYXRjaGVzLlxuXHQgIGlmIChsZW4gPT09IDApXG5cdCAgICByZXR1cm4gY2IoKVxuXG5cdCAgLy8gaWYgdGhpcyBpcyB0aGUgbGFzdCByZW1haW5pbmcgcGF0dGVybiBiaXQsIHRoZW4gbm8gbmVlZCBmb3Jcblx0ICAvLyBhbiBhZGRpdGlvbmFsIHN0YXQgKnVubGVzcyogdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBtYXJrIG9yXG5cdCAgLy8gc3RhdCBleHBsaWNpdGx5LiAgV2Uga25vdyB0aGV5IGV4aXN0LCBzaW5jZSByZWFkZGlyIHJldHVybmVkXG5cdCAgLy8gdGhlbS5cblxuXHQgIGlmIChyZW1haW4ubGVuZ3RoID09PSAxICYmICF0aGlzLm1hcmsgJiYgIXRoaXMuc3RhdCkge1xuXHQgICAgaWYgKCF0aGlzLm1hdGNoZXNbaW5kZXhdKVxuXHQgICAgICB0aGlzLm1hdGNoZXNbaW5kZXhdID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKyspIHtcblx0ICAgICAgdmFyIGUgPSBtYXRjaGVkRW50cmllc1tpXTtcblx0ICAgICAgaWYgKHByZWZpeCkge1xuXHQgICAgICAgIGlmIChwcmVmaXggIT09ICcvJylcblx0ICAgICAgICAgIGUgPSBwcmVmaXggKyAnLycgKyBlO1xuXHQgICAgICAgIGVsc2Vcblx0ICAgICAgICAgIGUgPSBwcmVmaXggKyBlO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYgKGUuY2hhckF0KDApID09PSAnLycgJiYgIXRoaXMubm9tb3VudCkge1xuXHQgICAgICAgIGUgPSBwYXRoLmpvaW4odGhpcy5yb290LCBlKTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLl9lbWl0TWF0Y2goaW5kZXgsIGUpO1xuXHQgICAgfVxuXHQgICAgLy8gVGhpcyB3YXMgdGhlIGxhc3Qgb25lLCBhbmQgbm8gc3RhdHMgd2VyZSBuZWVkZWRcblx0ICAgIHJldHVybiBjYigpXG5cdCAgfVxuXG5cdCAgLy8gbm93IHRlc3QgYWxsIG1hdGNoZWQgZW50cmllcyBhcyBzdGFuZC1pbnMgZm9yIHRoYXQgcGFydFxuXHQgIC8vIG9mIHRoZSBwYXR0ZXJuLlxuXHQgIHJlbWFpbi5zaGlmdCgpO1xuXHQgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7XG5cdCAgICB2YXIgZSA9IG1hdGNoZWRFbnRyaWVzW2ldO1xuXHQgICAgaWYgKHByZWZpeCkge1xuXHQgICAgICBpZiAocHJlZml4ICE9PSAnLycpXG5cdCAgICAgICAgZSA9IHByZWZpeCArICcvJyArIGU7XG5cdCAgICAgIGVsc2Vcblx0ICAgICAgICBlID0gcHJlZml4ICsgZTtcblx0ICAgIH1cblx0ICAgIHRoaXMuX3Byb2Nlc3MoW2VdLmNvbmNhdChyZW1haW4pLCBpbmRleCwgaW5HbG9iU3RhciwgY2IpO1xuXHQgIH1cblx0ICBjYigpO1xuXHR9O1xuXG5cdEdsb2IucHJvdG90eXBlLl9lbWl0TWF0Y2ggPSBmdW5jdGlvbiAoaW5kZXgsIGUpIHtcblx0ICBpZiAodGhpcy5hYm9ydGVkKVxuXHQgICAgcmV0dXJuXG5cblx0ICBpZiAoaXNJZ25vcmVkKHRoaXMsIGUpKVxuXHQgICAgcmV0dXJuXG5cblx0ICBpZiAodGhpcy5wYXVzZWQpIHtcblx0ICAgIHRoaXMuX2VtaXRRdWV1ZS5wdXNoKFtpbmRleCwgZV0pO1xuXHQgICAgcmV0dXJuXG5cdCAgfVxuXG5cdCAgdmFyIGFicyA9IGlzQWJzb2x1dGUoZSkgPyBlIDogdGhpcy5fbWFrZUFicyhlKTtcblxuXHQgIGlmICh0aGlzLm1hcmspXG5cdCAgICBlID0gdGhpcy5fbWFyayhlKTtcblxuXHQgIGlmICh0aGlzLmFic29sdXRlKVxuXHQgICAgZSA9IGFicztcblxuXHQgIGlmICh0aGlzLm1hdGNoZXNbaW5kZXhdW2VdKVxuXHQgICAgcmV0dXJuXG5cblx0ICBpZiAodGhpcy5ub2Rpcikge1xuXHQgICAgdmFyIGMgPSB0aGlzLmNhY2hlW2Fic107XG5cdCAgICBpZiAoYyA9PT0gJ0RJUicgfHwgQXJyYXkuaXNBcnJheShjKSlcblx0ICAgICAgcmV0dXJuXG5cdCAgfVxuXG5cdCAgdGhpcy5tYXRjaGVzW2luZGV4XVtlXSA9IHRydWU7XG5cblx0ICB2YXIgc3QgPSB0aGlzLnN0YXRDYWNoZVthYnNdO1xuXHQgIGlmIChzdClcblx0ICAgIHRoaXMuZW1pdCgnc3RhdCcsIGUsIHN0KTtcblxuXHQgIHRoaXMuZW1pdCgnbWF0Y2gnLCBlKTtcblx0fTtcblxuXHRHbG9iLnByb3RvdHlwZS5fcmVhZGRpckluR2xvYlN0YXIgPSBmdW5jdGlvbiAoYWJzLCBjYikge1xuXHQgIGlmICh0aGlzLmFib3J0ZWQpXG5cdCAgICByZXR1cm5cblxuXHQgIC8vIGZvbGxvdyBhbGwgc3ltbGlua2VkIGRpcmVjdG9yaWVzIGZvcmV2ZXJcblx0ICAvLyBqdXN0IHByb2NlZWQgYXMgaWYgdGhpcyBpcyBhIG5vbi1nbG9ic3RhciBzaXR1YXRpb25cblx0ICBpZiAodGhpcy5mb2xsb3cpXG5cdCAgICByZXR1cm4gdGhpcy5fcmVhZGRpcihhYnMsIGZhbHNlLCBjYilcblxuXHQgIHZhciBsc3RhdGtleSA9ICdsc3RhdFxcMCcgKyBhYnM7XG5cdCAgdmFyIHNlbGYgPSB0aGlzO1xuXHQgIHZhciBsc3RhdGNiID0gaW5mbGlnaHQobHN0YXRrZXksIGxzdGF0Y2JfKTtcblxuXHQgIGlmIChsc3RhdGNiKVxuXHQgICAgc2VsZi5mcy5sc3RhdChhYnMsIGxzdGF0Y2IpO1xuXG5cdCAgZnVuY3Rpb24gbHN0YXRjYl8gKGVyLCBsc3RhdCkge1xuXHQgICAgaWYgKGVyICYmIGVyLmNvZGUgPT09ICdFTk9FTlQnKVxuXHQgICAgICByZXR1cm4gY2IoKVxuXG5cdCAgICB2YXIgaXNTeW0gPSBsc3RhdCAmJiBsc3RhdC5pc1N5bWJvbGljTGluaygpO1xuXHQgICAgc2VsZi5zeW1saW5rc1thYnNdID0gaXNTeW07XG5cblx0ICAgIC8vIElmIGl0J3Mgbm90IGEgc3ltbGluayBvciBhIGRpciwgdGhlbiBpdCdzIGRlZmluaXRlbHkgYSByZWd1bGFyIGZpbGUuXG5cdCAgICAvLyBkb24ndCBib3RoZXIgZG9pbmcgYSByZWFkZGlyIGluIHRoYXQgY2FzZS5cblx0ICAgIGlmICghaXNTeW0gJiYgbHN0YXQgJiYgIWxzdGF0LmlzRGlyZWN0b3J5KCkpIHtcblx0ICAgICAgc2VsZi5jYWNoZVthYnNdID0gJ0ZJTEUnO1xuXHQgICAgICBjYigpO1xuXHQgICAgfSBlbHNlXG5cdCAgICAgIHNlbGYuX3JlYWRkaXIoYWJzLCBmYWxzZSwgY2IpO1xuXHQgIH1cblx0fTtcblxuXHRHbG9iLnByb3RvdHlwZS5fcmVhZGRpciA9IGZ1bmN0aW9uIChhYnMsIGluR2xvYlN0YXIsIGNiKSB7XG5cdCAgaWYgKHRoaXMuYWJvcnRlZClcblx0ICAgIHJldHVyblxuXG5cdCAgY2IgPSBpbmZsaWdodCgncmVhZGRpclxcMCcrYWJzKydcXDAnK2luR2xvYlN0YXIsIGNiKTtcblx0ICBpZiAoIWNiKVxuXHQgICAgcmV0dXJuXG5cblx0ICAvL2NvbnNvbGUuZXJyb3IoJ1JEICVqICVqJywgK2luR2xvYlN0YXIsIGFicylcblx0ICBpZiAoaW5HbG9iU3RhciAmJiAhb3duUHJvcCh0aGlzLnN5bWxpbmtzLCBhYnMpKVxuXHQgICAgcmV0dXJuIHRoaXMuX3JlYWRkaXJJbkdsb2JTdGFyKGFicywgY2IpXG5cblx0ICBpZiAob3duUHJvcCh0aGlzLmNhY2hlLCBhYnMpKSB7XG5cdCAgICB2YXIgYyA9IHRoaXMuY2FjaGVbYWJzXTtcblx0ICAgIGlmICghYyB8fCBjID09PSAnRklMRScpXG5cdCAgICAgIHJldHVybiBjYigpXG5cblx0ICAgIGlmIChBcnJheS5pc0FycmF5KGMpKVxuXHQgICAgICByZXR1cm4gY2IobnVsbCwgYylcblx0ICB9XG5cblx0ICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgc2VsZi5mcy5yZWFkZGlyKGFicywgcmVhZGRpckNiKHRoaXMsIGFicywgY2IpKTtcblx0fTtcblxuXHRmdW5jdGlvbiByZWFkZGlyQ2IgKHNlbGYsIGFicywgY2IpIHtcblx0ICByZXR1cm4gZnVuY3Rpb24gKGVyLCBlbnRyaWVzKSB7XG5cdCAgICBpZiAoZXIpXG5cdCAgICAgIHNlbGYuX3JlYWRkaXJFcnJvcihhYnMsIGVyLCBjYik7XG5cdCAgICBlbHNlXG5cdCAgICAgIHNlbGYuX3JlYWRkaXJFbnRyaWVzKGFicywgZW50cmllcywgY2IpO1xuXHQgIH1cblx0fVxuXG5cdEdsb2IucHJvdG90eXBlLl9yZWFkZGlyRW50cmllcyA9IGZ1bmN0aW9uIChhYnMsIGVudHJpZXMsIGNiKSB7XG5cdCAgaWYgKHRoaXMuYWJvcnRlZClcblx0ICAgIHJldHVyblxuXG5cdCAgLy8gaWYgd2UgaGF2ZW4ndCBhc2tlZCB0byBzdGF0IGV2ZXJ5dGhpbmcsIHRoZW4ganVzdFxuXHQgIC8vIGFzc3VtZSB0aGF0IGV2ZXJ5dGhpbmcgaW4gdGhlcmUgZXhpc3RzLCBzbyB3ZSBjYW4gYXZvaWRcblx0ICAvLyBoYXZpbmcgdG8gc3RhdCBpdCBhIHNlY29uZCB0aW1lLlxuXHQgIGlmICghdGhpcy5tYXJrICYmICF0aGlzLnN0YXQpIHtcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkgKyspIHtcblx0ICAgICAgdmFyIGUgPSBlbnRyaWVzW2ldO1xuXHQgICAgICBpZiAoYWJzID09PSAnLycpXG5cdCAgICAgICAgZSA9IGFicyArIGU7XG5cdCAgICAgIGVsc2Vcblx0ICAgICAgICBlID0gYWJzICsgJy8nICsgZTtcblx0ICAgICAgdGhpcy5jYWNoZVtlXSA9IHRydWU7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgdGhpcy5jYWNoZVthYnNdID0gZW50cmllcztcblx0ICByZXR1cm4gY2IobnVsbCwgZW50cmllcylcblx0fTtcblxuXHRHbG9iLnByb3RvdHlwZS5fcmVhZGRpckVycm9yID0gZnVuY3Rpb24gKGYsIGVyLCBjYikge1xuXHQgIGlmICh0aGlzLmFib3J0ZWQpXG5cdCAgICByZXR1cm5cblxuXHQgIC8vIGhhbmRsZSBlcnJvcnMsIGFuZCBjYWNoZSB0aGUgaW5mb3JtYXRpb25cblx0ICBzd2l0Y2ggKGVyLmNvZGUpIHtcblx0ICAgIGNhc2UgJ0VOT1RTVVAnOiAvLyBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtZ2xvYi9pc3N1ZXMvMjA1XG5cdCAgICBjYXNlICdFTk9URElSJzogLy8gdG90YWxseSBub3JtYWwuIG1lYW5zIGl0ICpkb2VzKiBleGlzdC5cblx0ICAgICAgdmFyIGFicyA9IHRoaXMuX21ha2VBYnMoZik7XG5cdCAgICAgIHRoaXMuY2FjaGVbYWJzXSA9ICdGSUxFJztcblx0ICAgICAgaWYgKGFicyA9PT0gdGhpcy5jd2RBYnMpIHtcblx0ICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoZXIuY29kZSArICcgaW52YWxpZCBjd2QgJyArIHRoaXMuY3dkKTtcblx0ICAgICAgICBlcnJvci5wYXRoID0gdGhpcy5jd2Q7XG5cdCAgICAgICAgZXJyb3IuY29kZSA9IGVyLmNvZGU7XG5cdCAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKTtcblx0ICAgICAgICB0aGlzLmFib3J0KCk7XG5cdCAgICAgIH1cblx0ICAgICAgYnJlYWtcblxuXHQgICAgY2FzZSAnRU5PRU5UJzogLy8gbm90IHRlcnJpYmx5IHVudXN1YWxcblx0ICAgIGNhc2UgJ0VMT09QJzpcblx0ICAgIGNhc2UgJ0VOQU1FVE9PTE9ORyc6XG5cdCAgICBjYXNlICdVTktOT1dOJzpcblx0ICAgICAgdGhpcy5jYWNoZVt0aGlzLl9tYWtlQWJzKGYpXSA9IGZhbHNlO1xuXHQgICAgICBicmVha1xuXG5cdCAgICBkZWZhdWx0OiAvLyBzb21lIHVudXN1YWwgZXJyb3IuICBUcmVhdCBhcyBmYWlsdXJlLlxuXHQgICAgICB0aGlzLmNhY2hlW3RoaXMuX21ha2VBYnMoZildID0gZmFsc2U7XG5cdCAgICAgIGlmICh0aGlzLnN0cmljdCkge1xuXHQgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcik7XG5cdCAgICAgICAgLy8gSWYgdGhlIGVycm9yIGlzIGhhbmRsZWQsIHRoZW4gd2UgYWJvcnRcblx0ICAgICAgICAvLyBpZiBub3QsIHdlIHRocmV3IG91dCBvZiBoZXJlXG5cdCAgICAgICAgdGhpcy5hYm9ydCgpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghdGhpcy5zaWxlbnQpXG5cdCAgICAgICAgY29uc29sZS5lcnJvcignZ2xvYiBlcnJvcicsIGVyKTtcblx0ICAgICAgYnJlYWtcblx0ICB9XG5cblx0ICByZXR1cm4gY2IoKVxuXHR9O1xuXG5cdEdsb2IucHJvdG90eXBlLl9wcm9jZXNzR2xvYlN0YXIgPSBmdW5jdGlvbiAocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIsIGNiKSB7XG5cdCAgdmFyIHNlbGYgPSB0aGlzO1xuXHQgIHRoaXMuX3JlYWRkaXIoYWJzLCBpbkdsb2JTdGFyLCBmdW5jdGlvbiAoZXIsIGVudHJpZXMpIHtcblx0ICAgIHNlbGYuX3Byb2Nlc3NHbG9iU3RhcjIocHJlZml4LCByZWFkLCBhYnMsIHJlbWFpbiwgaW5kZXgsIGluR2xvYlN0YXIsIGVudHJpZXMsIGNiKTtcblx0ICB9KTtcblx0fTtcblxuXG5cdEdsb2IucHJvdG90eXBlLl9wcm9jZXNzR2xvYlN0YXIyID0gZnVuY3Rpb24gKHByZWZpeCwgcmVhZCwgYWJzLCByZW1haW4sIGluZGV4LCBpbkdsb2JTdGFyLCBlbnRyaWVzLCBjYikge1xuXHQgIC8vY29uc29sZS5lcnJvcigncGdzMicsIHByZWZpeCwgcmVtYWluWzBdLCBlbnRyaWVzKVxuXG5cdCAgLy8gbm8gZW50cmllcyBtZWFucyBub3QgYSBkaXIsIHNvIGl0IGNhbiBuZXZlciBoYXZlIG1hdGNoZXNcblx0ICAvLyBmb28udHh0LyoqIGRvZXNuJ3QgbWF0Y2ggZm9vLnR4dFxuXHQgIGlmICghZW50cmllcylcblx0ICAgIHJldHVybiBjYigpXG5cblx0ICAvLyB0ZXN0IHdpdGhvdXQgdGhlIGdsb2JzdGFyLCBhbmQgd2l0aCBldmVyeSBjaGlsZCBib3RoIGJlbG93XG5cdCAgLy8gYW5kIHJlcGxhY2luZyB0aGUgZ2xvYnN0YXIuXG5cdCAgdmFyIHJlbWFpbldpdGhvdXRHbG9iU3RhciA9IHJlbWFpbi5zbGljZSgxKTtcblx0ICB2YXIgZ3NwcmVmID0gcHJlZml4ID8gWyBwcmVmaXggXSA6IFtdO1xuXHQgIHZhciBub0dsb2JTdGFyID0gZ3NwcmVmLmNvbmNhdChyZW1haW5XaXRob3V0R2xvYlN0YXIpO1xuXG5cdCAgLy8gdGhlIG5vR2xvYlN0YXIgcGF0dGVybiBleGl0cyB0aGUgaW5HbG9iU3RhciBzdGF0ZVxuXHQgIHRoaXMuX3Byb2Nlc3Mobm9HbG9iU3RhciwgaW5kZXgsIGZhbHNlLCBjYik7XG5cblx0ICB2YXIgaXNTeW0gPSB0aGlzLnN5bWxpbmtzW2Fic107XG5cdCAgdmFyIGxlbiA9IGVudHJpZXMubGVuZ3RoO1xuXG5cdCAgLy8gSWYgaXQncyBhIHN5bWxpbmssIGFuZCB3ZSdyZSBpbiBhIGdsb2JzdGFyLCB0aGVuIHN0b3Bcblx0ICBpZiAoaXNTeW0gJiYgaW5HbG9iU3Rhcilcblx0ICAgIHJldHVybiBjYigpXG5cblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICB2YXIgZSA9IGVudHJpZXNbaV07XG5cdCAgICBpZiAoZS5jaGFyQXQoMCkgPT09ICcuJyAmJiAhdGhpcy5kb3QpXG5cdCAgICAgIGNvbnRpbnVlXG5cblx0ICAgIC8vIHRoZXNlIHR3byBjYXNlcyBlbnRlciB0aGUgaW5HbG9iU3RhciBzdGF0ZVxuXHQgICAgdmFyIGluc3RlYWQgPSBnc3ByZWYuY29uY2F0KGVudHJpZXNbaV0sIHJlbWFpbldpdGhvdXRHbG9iU3Rhcik7XG5cdCAgICB0aGlzLl9wcm9jZXNzKGluc3RlYWQsIGluZGV4LCB0cnVlLCBjYik7XG5cblx0ICAgIHZhciBiZWxvdyA9IGdzcHJlZi5jb25jYXQoZW50cmllc1tpXSwgcmVtYWluKTtcblx0ICAgIHRoaXMuX3Byb2Nlc3MoYmVsb3csIGluZGV4LCB0cnVlLCBjYik7XG5cdCAgfVxuXG5cdCAgY2IoKTtcblx0fTtcblxuXHRHbG9iLnByb3RvdHlwZS5fcHJvY2Vzc1NpbXBsZSA9IGZ1bmN0aW9uIChwcmVmaXgsIGluZGV4LCBjYikge1xuXHQgIC8vIFhYWCByZXZpZXcgdGhpcy4gIFNob3VsZG4ndCBpdCBiZSBkb2luZyB0aGUgbW91bnRpbmcgZXRjXG5cdCAgLy8gYmVmb3JlIGRvaW5nIHN0YXQ/ICBraW5kYSB3ZWlyZD9cblx0ICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgdGhpcy5fc3RhdChwcmVmaXgsIGZ1bmN0aW9uIChlciwgZXhpc3RzKSB7XG5cdCAgICBzZWxmLl9wcm9jZXNzU2ltcGxlMihwcmVmaXgsIGluZGV4LCBlciwgZXhpc3RzLCBjYik7XG5cdCAgfSk7XG5cdH07XG5cdEdsb2IucHJvdG90eXBlLl9wcm9jZXNzU2ltcGxlMiA9IGZ1bmN0aW9uIChwcmVmaXgsIGluZGV4LCBlciwgZXhpc3RzLCBjYikge1xuXG5cdCAgLy9jb25zb2xlLmVycm9yKCdwczInLCBwcmVmaXgsIGV4aXN0cylcblxuXHQgIGlmICghdGhpcy5tYXRjaGVzW2luZGV4XSlcblx0ICAgIHRoaXMubWF0Y2hlc1tpbmRleF0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5cdCAgLy8gSWYgaXQgZG9lc24ndCBleGlzdCwgdGhlbiBqdXN0IG1hcmsgdGhlIGxhY2sgb2YgcmVzdWx0c1xuXHQgIGlmICghZXhpc3RzKVxuXHQgICAgcmV0dXJuIGNiKClcblxuXHQgIGlmIChwcmVmaXggJiYgaXNBYnNvbHV0ZShwcmVmaXgpICYmICF0aGlzLm5vbW91bnQpIHtcblx0ICAgIHZhciB0cmFpbCA9IC9bXFwvXFxcXF0kLy50ZXN0KHByZWZpeCk7XG5cdCAgICBpZiAocHJlZml4LmNoYXJBdCgwKSA9PT0gJy8nKSB7XG5cdCAgICAgIHByZWZpeCA9IHBhdGguam9pbih0aGlzLnJvb3QsIHByZWZpeCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBwcmVmaXggPSBwYXRoLnJlc29sdmUodGhpcy5yb290LCBwcmVmaXgpO1xuXHQgICAgICBpZiAodHJhaWwpXG5cdCAgICAgICAgcHJlZml4ICs9ICcvJztcblx0ICAgIH1cblx0ICB9XG5cblx0ICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJylcblx0ICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cblx0ICAvLyBNYXJrIHRoaXMgYXMgYSBtYXRjaFxuXHQgIHRoaXMuX2VtaXRNYXRjaChpbmRleCwgcHJlZml4KTtcblx0ICBjYigpO1xuXHR9O1xuXG5cdC8vIFJldHVybnMgZWl0aGVyICdESVInLCAnRklMRScsIG9yIGZhbHNlXG5cdEdsb2IucHJvdG90eXBlLl9zdGF0ID0gZnVuY3Rpb24gKGYsIGNiKSB7XG5cdCAgdmFyIGFicyA9IHRoaXMuX21ha2VBYnMoZik7XG5cdCAgdmFyIG5lZWREaXIgPSBmLnNsaWNlKC0xKSA9PT0gJy8nO1xuXG5cdCAgaWYgKGYubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGgpXG5cdCAgICByZXR1cm4gY2IoKVxuXG5cdCAgaWYgKCF0aGlzLnN0YXQgJiYgb3duUHJvcCh0aGlzLmNhY2hlLCBhYnMpKSB7XG5cdCAgICB2YXIgYyA9IHRoaXMuY2FjaGVbYWJzXTtcblxuXHQgICAgaWYgKEFycmF5LmlzQXJyYXkoYykpXG5cdCAgICAgIGMgPSAnRElSJztcblxuXHQgICAgLy8gSXQgZXhpc3RzLCBidXQgbWF5YmUgbm90IGhvdyB3ZSBuZWVkIGl0XG5cdCAgICBpZiAoIW5lZWREaXIgfHwgYyA9PT0gJ0RJUicpXG5cdCAgICAgIHJldHVybiBjYihudWxsLCBjKVxuXG5cdCAgICBpZiAobmVlZERpciAmJiBjID09PSAnRklMRScpXG5cdCAgICAgIHJldHVybiBjYigpXG5cblx0ICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIHRvIHN0YXQsIGJlY2F1c2UgbWF5YmUgYz10cnVlXG5cdCAgICAvLyBpZiB3ZSBrbm93IGl0IGV4aXN0cywgYnV0IG5vdCB3aGF0IGl0IGlzLlxuXHQgIH1cblx0ICB2YXIgc3RhdCA9IHRoaXMuc3RhdENhY2hlW2Fic107XG5cdCAgaWYgKHN0YXQgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgaWYgKHN0YXQgPT09IGZhbHNlKVxuXHQgICAgICByZXR1cm4gY2IobnVsbCwgc3RhdClcblx0ICAgIGVsc2Uge1xuXHQgICAgICB2YXIgdHlwZSA9IHN0YXQuaXNEaXJlY3RvcnkoKSA/ICdESVInIDogJ0ZJTEUnO1xuXHQgICAgICBpZiAobmVlZERpciAmJiB0eXBlID09PSAnRklMRScpXG5cdCAgICAgICAgcmV0dXJuIGNiKClcblx0ICAgICAgZWxzZVxuXHQgICAgICAgIHJldHVybiBjYihudWxsLCB0eXBlLCBzdGF0KVxuXHQgICAgfVxuXHQgIH1cblxuXHQgIHZhciBzZWxmID0gdGhpcztcblx0ICB2YXIgc3RhdGNiID0gaW5mbGlnaHQoJ3N0YXRcXDAnICsgYWJzLCBsc3RhdGNiXyk7XG5cdCAgaWYgKHN0YXRjYilcblx0ICAgIHNlbGYuZnMubHN0YXQoYWJzLCBzdGF0Y2IpO1xuXG5cdCAgZnVuY3Rpb24gbHN0YXRjYl8gKGVyLCBsc3RhdCkge1xuXHQgICAgaWYgKGxzdGF0ICYmIGxzdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcblx0ICAgICAgLy8gSWYgaXQncyBhIHN5bWxpbmssIHRoZW4gdHJlYXQgaXQgYXMgdGhlIHRhcmdldCwgdW5sZXNzXG5cdCAgICAgIC8vIHRoZSB0YXJnZXQgZG9lcyBub3QgZXhpc3QsIHRoZW4gdHJlYXQgaXQgYXMgYSBmaWxlLlxuXHQgICAgICByZXR1cm4gc2VsZi5mcy5zdGF0KGFicywgZnVuY3Rpb24gKGVyLCBzdGF0KSB7XG5cdCAgICAgICAgaWYgKGVyKVxuXHQgICAgICAgICAgc2VsZi5fc3RhdDIoZiwgYWJzLCBudWxsLCBsc3RhdCwgY2IpO1xuXHQgICAgICAgIGVsc2Vcblx0ICAgICAgICAgIHNlbGYuX3N0YXQyKGYsIGFicywgZXIsIHN0YXQsIGNiKTtcblx0ICAgICAgfSlcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHNlbGYuX3N0YXQyKGYsIGFicywgZXIsIGxzdGF0LCBjYik7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG5cdEdsb2IucHJvdG90eXBlLl9zdGF0MiA9IGZ1bmN0aW9uIChmLCBhYnMsIGVyLCBzdGF0LCBjYikge1xuXHQgIGlmIChlciAmJiAoZXIuY29kZSA9PT0gJ0VOT0VOVCcgfHwgZXIuY29kZSA9PT0gJ0VOT1RESVInKSkge1xuXHQgICAgdGhpcy5zdGF0Q2FjaGVbYWJzXSA9IGZhbHNlO1xuXHQgICAgcmV0dXJuIGNiKClcblx0ICB9XG5cblx0ICB2YXIgbmVlZERpciA9IGYuc2xpY2UoLTEpID09PSAnLyc7XG5cdCAgdGhpcy5zdGF0Q2FjaGVbYWJzXSA9IHN0YXQ7XG5cblx0ICBpZiAoYWJzLnNsaWNlKC0xKSA9PT0gJy8nICYmIHN0YXQgJiYgIXN0YXQuaXNEaXJlY3RvcnkoKSlcblx0ICAgIHJldHVybiBjYihudWxsLCBmYWxzZSwgc3RhdClcblxuXHQgIHZhciBjID0gdHJ1ZTtcblx0ICBpZiAoc3RhdClcblx0ICAgIGMgPSBzdGF0LmlzRGlyZWN0b3J5KCkgPyAnRElSJyA6ICdGSUxFJztcblx0ICB0aGlzLmNhY2hlW2Fic10gPSB0aGlzLmNhY2hlW2Fic10gfHwgYztcblxuXHQgIGlmIChuZWVkRGlyICYmIGMgPT09ICdGSUxFJylcblx0ICAgIHJldHVybiBjYigpXG5cblx0ICByZXR1cm4gY2IobnVsbCwgYywgc3RhdClcblx0fTtcblx0cmV0dXJuIGdsb2JfMTtcbn1cblxudmFyIGdsb2JFeHBvcnRzID0gcmVxdWlyZUdsb2IoKTtcbnZhciBnbG9iID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKGdsb2JFeHBvcnRzKTtcblxuY29uc3QgY29tbWEgPSAnLCcuY2hhckNvZGVBdCgwKTtcbmNvbnN0IHNlbWljb2xvbiA9ICc7Jy5jaGFyQ29kZUF0KDApO1xuY29uc3QgY2hhcnMkMSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcbmNvbnN0IGludFRvQ2hhciA9IG5ldyBVaW50OEFycmF5KDY0KTsgLy8gNjQgcG9zc2libGUgY2hhcnMuXG5jb25zdCBjaGFyVG9JbnQgPSBuZXcgVWludDhBcnJheSgxMjgpOyAvLyB6IGlzIDEyMiBpbiBBU0NJSVxuZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFycyQxLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYyA9IGNoYXJzJDEuY2hhckNvZGVBdChpKTtcbiAgICBpbnRUb0NoYXJbaV0gPSBjO1xuICAgIGNoYXJUb0ludFtjXSA9IGk7XG59XG4vLyBQcm92aWRlIGEgZmFsbGJhY2sgZm9yIG9sZGVyIGVudmlyb25tZW50cy5cbmNvbnN0IHRkID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJ1xuICAgID8gLyogI19fUFVSRV9fICovIG5ldyBUZXh0RGVjb2RlcigpXG4gICAgOiB0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIGRlY29kZShidWYpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSBCdWZmZXIuZnJvbShidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBkZWNvZGUoYnVmKSB7XG4gICAgICAgICAgICAgICAgbGV0IG91dCA9ICcnO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuZnVuY3Rpb24gZGVjb2RlKG1hcHBpbmdzKSB7XG4gICAgY29uc3Qgc3RhdGUgPSBuZXcgSW50MzJBcnJheSg1KTtcbiAgICBjb25zdCBkZWNvZGVkID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBkbyB7XG4gICAgICAgIGNvbnN0IHNlbWkgPSBpbmRleE9mKG1hcHBpbmdzLCBpbmRleCk7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBbXTtcbiAgICAgICAgbGV0IHNvcnRlZCA9IHRydWU7XG4gICAgICAgIGxldCBsYXN0Q29sID0gMDtcbiAgICAgICAgc3RhdGVbMF0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPCBzZW1pOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzZWc7XG4gICAgICAgICAgICBpID0gZGVjb2RlSW50ZWdlcihtYXBwaW5ncywgaSwgc3RhdGUsIDApOyAvLyBnZW5Db2x1bW5cbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IHN0YXRlWzBdO1xuICAgICAgICAgICAgaWYgKGNvbCA8IGxhc3RDb2wpXG4gICAgICAgICAgICAgICAgc29ydGVkID0gZmFsc2U7XG4gICAgICAgICAgICBsYXN0Q29sID0gY29sO1xuICAgICAgICAgICAgaWYgKGhhc01vcmVWbHEobWFwcGluZ3MsIGksIHNlbWkpKSB7XG4gICAgICAgICAgICAgICAgaSA9IGRlY29kZUludGVnZXIobWFwcGluZ3MsIGksIHN0YXRlLCAxKTsgLy8gc291cmNlc0luZGV4XG4gICAgICAgICAgICAgICAgaSA9IGRlY29kZUludGVnZXIobWFwcGluZ3MsIGksIHN0YXRlLCAyKTsgLy8gc291cmNlTGluZVxuICAgICAgICAgICAgICAgIGkgPSBkZWNvZGVJbnRlZ2VyKG1hcHBpbmdzLCBpLCBzdGF0ZSwgMyk7IC8vIHNvdXJjZUNvbHVtblxuICAgICAgICAgICAgICAgIGlmIChoYXNNb3JlVmxxKG1hcHBpbmdzLCBpLCBzZW1pKSkge1xuICAgICAgICAgICAgICAgICAgICBpID0gZGVjb2RlSW50ZWdlcihtYXBwaW5ncywgaSwgc3RhdGUsIDQpOyAvLyBuYW1lc0luZGV4XG4gICAgICAgICAgICAgICAgICAgIHNlZyA9IFtjb2wsIHN0YXRlWzFdLCBzdGF0ZVsyXSwgc3RhdGVbM10sIHN0YXRlWzRdXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZyA9IFtjb2wsIHN0YXRlWzFdLCBzdGF0ZVsyXSwgc3RhdGVbM11dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlZyA9IFtjb2xdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGluZS5wdXNoKHNlZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzb3J0ZWQpXG4gICAgICAgICAgICBzb3J0KGxpbmUpO1xuICAgICAgICBkZWNvZGVkLnB1c2gobGluZSk7XG4gICAgICAgIGluZGV4ID0gc2VtaSArIDE7XG4gICAgfSB3aGlsZSAoaW5kZXggPD0gbWFwcGluZ3MubGVuZ3RoKTtcbiAgICByZXR1cm4gZGVjb2RlZDtcbn1cbmZ1bmN0aW9uIGluZGV4T2YobWFwcGluZ3MsIGluZGV4KSB7XG4gICAgY29uc3QgaWR4ID0gbWFwcGluZ3MuaW5kZXhPZignOycsIGluZGV4KTtcbiAgICByZXR1cm4gaWR4ID09PSAtMSA/IG1hcHBpbmdzLmxlbmd0aCA6IGlkeDtcbn1cbmZ1bmN0aW9uIGRlY29kZUludGVnZXIobWFwcGluZ3MsIHBvcywgc3RhdGUsIGopIHtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGxldCBzaGlmdCA9IDA7XG4gICAgbGV0IGludGVnZXIgPSAwO1xuICAgIGRvIHtcbiAgICAgICAgY29uc3QgYyA9IG1hcHBpbmdzLmNoYXJDb2RlQXQocG9zKyspO1xuICAgICAgICBpbnRlZ2VyID0gY2hhclRvSW50W2NdO1xuICAgICAgICB2YWx1ZSB8PSAoaW50ZWdlciAmIDMxKSA8PCBzaGlmdDtcbiAgICAgICAgc2hpZnQgKz0gNTtcbiAgICB9IHdoaWxlIChpbnRlZ2VyICYgMzIpO1xuICAgIGNvbnN0IHNob3VsZE5lZ2F0ZSA9IHZhbHVlICYgMTtcbiAgICB2YWx1ZSA+Pj49IDE7XG4gICAgaWYgKHNob3VsZE5lZ2F0ZSkge1xuICAgICAgICB2YWx1ZSA9IC0weDgwMDAwMDAwIHwgLXZhbHVlO1xuICAgIH1cbiAgICBzdGF0ZVtqXSArPSB2YWx1ZTtcbiAgICByZXR1cm4gcG9zO1xufVxuZnVuY3Rpb24gaGFzTW9yZVZscShtYXBwaW5ncywgaSwgbGVuZ3RoKSB7XG4gICAgaWYgKGkgPj0gbGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIG1hcHBpbmdzLmNoYXJDb2RlQXQoaSkgIT09IGNvbW1hO1xufVxuZnVuY3Rpb24gc29ydChsaW5lKSB7XG4gICAgbGluZS5zb3J0KHNvcnRDb21wYXJhdG9yJDEpO1xufVxuZnVuY3Rpb24gc29ydENvbXBhcmF0b3IkMShhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gLSBiWzBdO1xufVxuZnVuY3Rpb24gZW5jb2RlJDEoZGVjb2RlZCkge1xuICAgIGNvbnN0IHN0YXRlID0gbmV3IEludDMyQXJyYXkoNSk7XG4gICAgY29uc3QgYnVmTGVuZ3RoID0gMTAyNCAqIDE2O1xuICAgIGNvbnN0IHN1Ykxlbmd0aCA9IGJ1Zkxlbmd0aCAtIDM2O1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ1Zkxlbmd0aCk7XG4gICAgY29uc3Qgc3ViID0gYnVmLnN1YmFycmF5KDAsIHN1Ykxlbmd0aCk7XG4gICAgbGV0IHBvcyA9IDA7XG4gICAgbGV0IG91dCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVjb2RlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBsaW5lID0gZGVjb2RlZFtpXTtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBpZiAocG9zID09PSBidWZMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gdGQuZGVjb2RlKGJ1Zik7XG4gICAgICAgICAgICAgICAgcG9zID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBzZW1pY29sb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIHN0YXRlWzBdID0gMDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaW5lLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gbGluZVtqXTtcbiAgICAgICAgICAgIC8vIFdlIGNhbiBwdXNoIHVwIHRvIDUgaW50cywgZWFjaCBpbnQgY2FuIHRha2UgYXQgbW9zdCA3IGNoYXJzLCBhbmQgd2VcbiAgICAgICAgICAgIC8vIG1heSBwdXNoIGEgY29tbWEuXG4gICAgICAgICAgICBpZiAocG9zID4gc3ViTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9IHRkLmRlY29kZShzdWIpO1xuICAgICAgICAgICAgICAgIGJ1Zi5jb3B5V2l0aGluKDAsIHN1Ykxlbmd0aCwgcG9zKTtcbiAgICAgICAgICAgICAgICBwb3MgLT0gc3ViTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPiAwKVxuICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjb21tYTtcbiAgICAgICAgICAgIHBvcyA9IGVuY29kZUludGVnZXIoYnVmLCBwb3MsIHN0YXRlLCBzZWdtZW50LCAwKTsgLy8gZ2VuQ29sdW1uXG4gICAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPT09IDEpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBwb3MgPSBlbmNvZGVJbnRlZ2VyKGJ1ZiwgcG9zLCBzdGF0ZSwgc2VnbWVudCwgMSk7IC8vIHNvdXJjZXNJbmRleFxuICAgICAgICAgICAgcG9zID0gZW5jb2RlSW50ZWdlcihidWYsIHBvcywgc3RhdGUsIHNlZ21lbnQsIDIpOyAvLyBzb3VyY2VMaW5lXG4gICAgICAgICAgICBwb3MgPSBlbmNvZGVJbnRlZ2VyKGJ1ZiwgcG9zLCBzdGF0ZSwgc2VnbWVudCwgMyk7IC8vIHNvdXJjZUNvbHVtblxuICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSA0KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgcG9zID0gZW5jb2RlSW50ZWdlcihidWYsIHBvcywgc3RhdGUsIHNlZ21lbnQsIDQpOyAvLyBuYW1lc0luZGV4XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dCArIHRkLmRlY29kZShidWYuc3ViYXJyYXkoMCwgcG9zKSk7XG59XG5mdW5jdGlvbiBlbmNvZGVJbnRlZ2VyKGJ1ZiwgcG9zLCBzdGF0ZSwgc2VnbWVudCwgaikge1xuICAgIGNvbnN0IG5leHQgPSBzZWdtZW50W2pdO1xuICAgIGxldCBudW0gPSBuZXh0IC0gc3RhdGVbal07XG4gICAgc3RhdGVbal0gPSBuZXh0O1xuICAgIG51bSA9IG51bSA8IDAgPyAoLW51bSA8PCAxKSB8IDEgOiBudW0gPDwgMTtcbiAgICBkbyB7XG4gICAgICAgIGxldCBjbGFtcGVkID0gbnVtICYgMGIwMTExMTE7XG4gICAgICAgIG51bSA+Pj49IDU7XG4gICAgICAgIGlmIChudW0gPiAwKVxuICAgICAgICAgICAgY2xhbXBlZCB8PSAwYjEwMDAwMDtcbiAgICAgICAgYnVmW3BvcysrXSA9IGludFRvQ2hhcltjbGFtcGVkXTtcbiAgICB9IHdoaWxlIChudW0gPiAwKTtcbiAgICByZXR1cm4gcG9zO1xufVxuXG5sZXQgQml0U2V0JDEgPSBjbGFzcyBCaXRTZXQge1xuXHRjb25zdHJ1Y3RvcihhcmcpIHtcblx0XHR0aGlzLmJpdHMgPSBhcmcgaW5zdGFuY2VvZiBCaXRTZXQgPyBhcmcuYml0cy5zbGljZSgpIDogW107XG5cdH1cblxuXHRhZGQobikge1xuXHRcdHRoaXMuYml0c1tuID4+IDVdIHw9IDEgPDwgKG4gJiAzMSk7XG5cdH1cblxuXHRoYXMobikge1xuXHRcdHJldHVybiAhISh0aGlzLmJpdHNbbiA+PiA1XSAmICgxIDw8IChuICYgMzEpKSk7XG5cdH1cbn07XG5cbmxldCBDaHVuayQxID0gY2xhc3MgQ2h1bmsge1xuXHRjb25zdHJ1Y3RvcihzdGFydCwgZW5kLCBjb250ZW50KSB7XG5cdFx0dGhpcy5zdGFydCA9IHN0YXJ0O1xuXHRcdHRoaXMuZW5kID0gZW5kO1xuXHRcdHRoaXMub3JpZ2luYWwgPSBjb250ZW50O1xuXG5cdFx0dGhpcy5pbnRybyA9ICcnO1xuXHRcdHRoaXMub3V0cm8gPSAnJztcblxuXHRcdHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG5cdFx0dGhpcy5zdG9yZU5hbWUgPSBmYWxzZTtcblx0XHR0aGlzLmVkaXRlZCA9IGZhbHNlO1xuXG5cdFx0e1xuXHRcdFx0dGhpcy5wcmV2aW91cyA9IG51bGw7XG5cdFx0XHR0aGlzLm5leHQgPSBudWxsO1xuXHRcdH1cblx0fVxuXG5cdGFwcGVuZExlZnQoY29udGVudCkge1xuXHRcdHRoaXMub3V0cm8gKz0gY29udGVudDtcblx0fVxuXG5cdGFwcGVuZFJpZ2h0KGNvbnRlbnQpIHtcblx0XHR0aGlzLmludHJvID0gdGhpcy5pbnRybyArIGNvbnRlbnQ7XG5cdH1cblxuXHRjbG9uZSgpIHtcblx0XHRjb25zdCBjaHVuayA9IG5ldyBDaHVuayh0aGlzLnN0YXJ0LCB0aGlzLmVuZCwgdGhpcy5vcmlnaW5hbCk7XG5cblx0XHRjaHVuay5pbnRybyA9IHRoaXMuaW50cm87XG5cdFx0Y2h1bmsub3V0cm8gPSB0aGlzLm91dHJvO1xuXHRcdGNodW5rLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQ7XG5cdFx0Y2h1bmsuc3RvcmVOYW1lID0gdGhpcy5zdG9yZU5hbWU7XG5cdFx0Y2h1bmsuZWRpdGVkID0gdGhpcy5lZGl0ZWQ7XG5cblx0XHRyZXR1cm4gY2h1bms7XG5cdH1cblxuXHRjb250YWlucyhpbmRleCkge1xuXHRcdHJldHVybiB0aGlzLnN0YXJ0IDwgaW5kZXggJiYgaW5kZXggPCB0aGlzLmVuZDtcblx0fVxuXG5cdGVhY2hOZXh0KGZuKSB7XG5cdFx0bGV0IGNodW5rID0gdGhpcztcblx0XHR3aGlsZSAoY2h1bmspIHtcblx0XHRcdGZuKGNodW5rKTtcblx0XHRcdGNodW5rID0gY2h1bmsubmV4dDtcblx0XHR9XG5cdH1cblxuXHRlYWNoUHJldmlvdXMoZm4pIHtcblx0XHRsZXQgY2h1bmsgPSB0aGlzO1xuXHRcdHdoaWxlIChjaHVuaykge1xuXHRcdFx0Zm4oY2h1bmspO1xuXHRcdFx0Y2h1bmsgPSBjaHVuay5wcmV2aW91cztcblx0XHR9XG5cdH1cblxuXHRlZGl0KGNvbnRlbnQsIHN0b3JlTmFtZSwgY29udGVudE9ubHkpIHtcblx0XHR0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXHRcdGlmICghY29udGVudE9ubHkpIHtcblx0XHRcdHRoaXMuaW50cm8gPSAnJztcblx0XHRcdHRoaXMub3V0cm8gPSAnJztcblx0XHR9XG5cdFx0dGhpcy5zdG9yZU5hbWUgPSBzdG9yZU5hbWU7XG5cblx0XHR0aGlzLmVkaXRlZCA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByZXBlbmRMZWZ0KGNvbnRlbnQpIHtcblx0XHR0aGlzLm91dHJvID0gY29udGVudCArIHRoaXMub3V0cm87XG5cdH1cblxuXHRwcmVwZW5kUmlnaHQoY29udGVudCkge1xuXHRcdHRoaXMuaW50cm8gPSBjb250ZW50ICsgdGhpcy5pbnRybztcblx0fVxuXG5cdHNwbGl0KGluZGV4KSB7XG5cdFx0Y29uc3Qgc2xpY2VJbmRleCA9IGluZGV4IC0gdGhpcy5zdGFydDtcblxuXHRcdGNvbnN0IG9yaWdpbmFsQmVmb3JlID0gdGhpcy5vcmlnaW5hbC5zbGljZSgwLCBzbGljZUluZGV4KTtcblx0XHRjb25zdCBvcmlnaW5hbEFmdGVyID0gdGhpcy5vcmlnaW5hbC5zbGljZShzbGljZUluZGV4KTtcblxuXHRcdHRoaXMub3JpZ2luYWwgPSBvcmlnaW5hbEJlZm9yZTtcblxuXHRcdGNvbnN0IG5ld0NodW5rID0gbmV3IENodW5rKGluZGV4LCB0aGlzLmVuZCwgb3JpZ2luYWxBZnRlcik7XG5cdFx0bmV3Q2h1bmsub3V0cm8gPSB0aGlzLm91dHJvO1xuXHRcdHRoaXMub3V0cm8gPSAnJztcblxuXHRcdHRoaXMuZW5kID0gaW5kZXg7XG5cblx0XHRpZiAodGhpcy5lZGl0ZWQpIHtcblx0XHRcdC8vIFRPRE8gaXMgdGhpcyBibG9jayBuZWNlc3Nhcnk/Li4uXG5cdFx0XHRuZXdDaHVuay5lZGl0KCcnLCBmYWxzZSk7XG5cdFx0XHR0aGlzLmNvbnRlbnQgPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5jb250ZW50ID0gb3JpZ2luYWxCZWZvcmU7XG5cdFx0fVxuXG5cdFx0bmV3Q2h1bmsubmV4dCA9IHRoaXMubmV4dDtcblx0XHRpZiAobmV3Q2h1bmsubmV4dCkgbmV3Q2h1bmsubmV4dC5wcmV2aW91cyA9IG5ld0NodW5rO1xuXHRcdG5ld0NodW5rLnByZXZpb3VzID0gdGhpcztcblx0XHR0aGlzLm5leHQgPSBuZXdDaHVuaztcblxuXHRcdHJldHVybiBuZXdDaHVuaztcblx0fVxuXG5cdHRvU3RyaW5nKCkge1xuXHRcdHJldHVybiB0aGlzLmludHJvICsgdGhpcy5jb250ZW50ICsgdGhpcy5vdXRybztcblx0fVxuXG5cdHRyaW1FbmQocngpIHtcblx0XHR0aGlzLm91dHJvID0gdGhpcy5vdXRyby5yZXBsYWNlKHJ4LCAnJyk7XG5cdFx0aWYgKHRoaXMub3V0cm8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcblxuXHRcdGNvbnN0IHRyaW1tZWQgPSB0aGlzLmNvbnRlbnQucmVwbGFjZShyeCwgJycpO1xuXG5cdFx0aWYgKHRyaW1tZWQubGVuZ3RoKSB7XG5cdFx0XHRpZiAodHJpbW1lZCAhPT0gdGhpcy5jb250ZW50KSB7XG5cdFx0XHRcdHRoaXMuc3BsaXQodGhpcy5zdGFydCArIHRyaW1tZWQubGVuZ3RoKS5lZGl0KCcnLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZWRpdCgnJywgdW5kZWZpbmVkLCB0cnVlKTtcblxuXHRcdFx0dGhpcy5pbnRybyA9IHRoaXMuaW50cm8ucmVwbGFjZShyeCwgJycpO1xuXHRcdFx0aWYgKHRoaXMuaW50cm8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHR0cmltU3RhcnQocngpIHtcblx0XHR0aGlzLmludHJvID0gdGhpcy5pbnRyby5yZXBsYWNlKHJ4LCAnJyk7XG5cdFx0aWYgKHRoaXMuaW50cm8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcblxuXHRcdGNvbnN0IHRyaW1tZWQgPSB0aGlzLmNvbnRlbnQucmVwbGFjZShyeCwgJycpO1xuXG5cdFx0aWYgKHRyaW1tZWQubGVuZ3RoKSB7XG5cdFx0XHRpZiAodHJpbW1lZCAhPT0gdGhpcy5jb250ZW50KSB7XG5cdFx0XHRcdHRoaXMuc3BsaXQodGhpcy5lbmQgLSB0cmltbWVkLmxlbmd0aCk7XG5cdFx0XHRcdHRoaXMuZWRpdCgnJywgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmVkaXQoJycsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cblx0XHRcdHRoaXMub3V0cm8gPSB0aGlzLm91dHJvLnJlcGxhY2UocngsICcnKTtcblx0XHRcdGlmICh0aGlzLm91dHJvLmxlbmd0aCkgcmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG59O1xuXG5mdW5jdGlvbiBnZXRCdG9hJDEgKCkge1xuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5idG9hID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIChzdHIpID0+IHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiAoc3RyKSA9PiBCdWZmZXIuZnJvbShzdHIsICd1dGYtOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBlbnZpcm9ubWVudDogYHdpbmRvdy5idG9hYCBvciBgQnVmZmVyYCBzaG91bGQgYmUgc3VwcG9ydGVkLicpO1xuXHRcdH07XG5cdH1cbn1cblxuY29uc3QgYnRvYSQyID0gLyojX19QVVJFX18qLyBnZXRCdG9hJDEoKTtcblxubGV0IFNvdXJjZU1hcCQyID0gY2xhc3MgU291cmNlTWFwIHtcblx0Y29uc3RydWN0b3IocHJvcGVydGllcykge1xuXHRcdHRoaXMudmVyc2lvbiA9IDM7XG5cdFx0dGhpcy5maWxlID0gcHJvcGVydGllcy5maWxlO1xuXHRcdHRoaXMuc291cmNlcyA9IHByb3BlcnRpZXMuc291cmNlcztcblx0XHR0aGlzLnNvdXJjZXNDb250ZW50ID0gcHJvcGVydGllcy5zb3VyY2VzQ29udGVudDtcblx0XHR0aGlzLm5hbWVzID0gcHJvcGVydGllcy5uYW1lcztcblx0XHR0aGlzLm1hcHBpbmdzID0gZW5jb2RlJDEocHJvcGVydGllcy5tYXBwaW5ncyk7XG5cdH1cblxuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG5cdH1cblxuXHR0b1VybCgpIHtcblx0XHRyZXR1cm4gJ2RhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwnICsgYnRvYSQyKHRoaXMudG9TdHJpbmcoKSk7XG5cdH1cbn07XG5cbmZ1bmN0aW9uIGd1ZXNzSW5kZW50JDEoY29kZSkge1xuXHRjb25zdCBsaW5lcyA9IGNvZGUuc3BsaXQoJ1xcbicpO1xuXG5cdGNvbnN0IHRhYmJlZCA9IGxpbmVzLmZpbHRlcigobGluZSkgPT4gL15cXHQrLy50ZXN0KGxpbmUpKTtcblx0Y29uc3Qgc3BhY2VkID0gbGluZXMuZmlsdGVyKChsaW5lKSA9PiAvXiB7Mix9Ly50ZXN0KGxpbmUpKTtcblxuXHRpZiAodGFiYmVkLmxlbmd0aCA9PT0gMCAmJiBzcGFjZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBNb3JlIGxpbmVzIHRhYmJlZCB0aGFuIHNwYWNlZD8gQXNzdW1lIHRhYnMsIGFuZFxuXHQvLyBkZWZhdWx0IHRvIHRhYnMgaW4gdGhlIGNhc2Ugb2YgYSB0aWUgKG9yIG5vdGhpbmdcblx0Ly8gdG8gZ28gb24pXG5cdGlmICh0YWJiZWQubGVuZ3RoID49IHNwYWNlZC5sZW5ndGgpIHtcblx0XHRyZXR1cm4gJ1xcdCc7XG5cdH1cblxuXHQvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gZ3Vlc3MgdGhlIG11bHRpcGxlXG5cdGNvbnN0IG1pbiA9IHNwYWNlZC5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XG5cdFx0Y29uc3QgbnVtU3BhY2VzID0gL14gKy8uZXhlYyhjdXJyZW50KVswXS5sZW5ndGg7XG5cdFx0cmV0dXJuIE1hdGgubWluKG51bVNwYWNlcywgcHJldmlvdXMpO1xuXHR9LCBJbmZpbml0eSk7XG5cblx0cmV0dXJuIG5ldyBBcnJheShtaW4gKyAxKS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbGF0aXZlUGF0aCQxKGZyb20sIHRvKSB7XG5cdGNvbnN0IGZyb21QYXJ0cyA9IGZyb20uc3BsaXQoL1svXFxcXF0vKTtcblx0Y29uc3QgdG9QYXJ0cyA9IHRvLnNwbGl0KC9bL1xcXFxdLyk7XG5cblx0ZnJvbVBhcnRzLnBvcCgpOyAvLyBnZXQgZGlybmFtZVxuXG5cdHdoaWxlIChmcm9tUGFydHNbMF0gPT09IHRvUGFydHNbMF0pIHtcblx0XHRmcm9tUGFydHMuc2hpZnQoKTtcblx0XHR0b1BhcnRzLnNoaWZ0KCk7XG5cdH1cblxuXHRpZiAoZnJvbVBhcnRzLmxlbmd0aCkge1xuXHRcdGxldCBpID0gZnJvbVBhcnRzLmxlbmd0aDtcblx0XHR3aGlsZSAoaS0tKSBmcm9tUGFydHNbaV0gPSAnLi4nO1xuXHR9XG5cblx0cmV0dXJuIGZyb21QYXJ0cy5jb25jYXQodG9QYXJ0cykuam9pbignLycpO1xufVxuXG5jb25zdCB0b1N0cmluZyQzID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZnVuY3Rpb24gaXNPYmplY3QkMyh0aGluZykge1xuXHRyZXR1cm4gdG9TdHJpbmckMy5jYWxsKHRoaW5nKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbmZ1bmN0aW9uIGdldExvY2F0b3IkMShzb3VyY2UpIHtcblx0Y29uc3Qgb3JpZ2luYWxMaW5lcyA9IHNvdXJjZS5zcGxpdCgnXFxuJyk7XG5cdGNvbnN0IGxpbmVPZmZzZXRzID0gW107XG5cblx0Zm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCBvcmlnaW5hbExpbmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0bGluZU9mZnNldHMucHVzaChwb3MpO1xuXHRcdHBvcyArPSBvcmlnaW5hbExpbmVzW2ldLmxlbmd0aCArIDE7XG5cdH1cblxuXHRyZXR1cm4gZnVuY3Rpb24gbG9jYXRlKGluZGV4KSB7XG5cdFx0bGV0IGkgPSAwO1xuXHRcdGxldCBqID0gbGluZU9mZnNldHMubGVuZ3RoO1xuXHRcdHdoaWxlIChpIDwgaikge1xuXHRcdFx0Y29uc3QgbSA9IChpICsgaikgPj4gMTtcblx0XHRcdGlmIChpbmRleCA8IGxpbmVPZmZzZXRzW21dKSB7XG5cdFx0XHRcdGogPSBtO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aSA9IG0gKyAxO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBsaW5lID0gaSAtIDE7XG5cdFx0Y29uc3QgY29sdW1uID0gaW5kZXggLSBsaW5lT2Zmc2V0c1tsaW5lXTtcblx0XHRyZXR1cm4geyBsaW5lLCBjb2x1bW4gfTtcblx0fTtcbn1cblxubGV0IE1hcHBpbmdzJDEgPSBjbGFzcyBNYXBwaW5ncyB7XG5cdGNvbnN0cnVjdG9yKGhpcmVzKSB7XG5cdFx0dGhpcy5oaXJlcyA9IGhpcmVzO1xuXHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUxpbmUgPSAwO1xuXHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiA9IDA7XG5cdFx0dGhpcy5yYXcgPSBbXTtcblx0XHR0aGlzLnJhd1NlZ21lbnRzID0gdGhpcy5yYXdbdGhpcy5nZW5lcmF0ZWRDb2RlTGluZV0gPSBbXTtcblx0XHR0aGlzLnBlbmRpbmcgPSBudWxsO1xuXHR9XG5cblx0YWRkRWRpdChzb3VyY2VJbmRleCwgY29udGVudCwgbG9jLCBuYW1lSW5kZXgpIHtcblx0XHRpZiAoY29udGVudC5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IHNlZ21lbnQgPSBbdGhpcy5nZW5lcmF0ZWRDb2RlQ29sdW1uLCBzb3VyY2VJbmRleCwgbG9jLmxpbmUsIGxvYy5jb2x1bW5dO1xuXHRcdFx0aWYgKG5hbWVJbmRleCA+PSAwKSB7XG5cdFx0XHRcdHNlZ21lbnQucHVzaChuYW1lSW5kZXgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5yYXdTZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5wZW5kaW5nKSB7XG5cdFx0XHR0aGlzLnJhd1NlZ21lbnRzLnB1c2godGhpcy5wZW5kaW5nKTtcblx0XHR9XG5cblx0XHR0aGlzLmFkdmFuY2UoY29udGVudCk7XG5cdFx0dGhpcy5wZW5kaW5nID0gbnVsbDtcblx0fVxuXG5cdGFkZFVuZWRpdGVkQ2h1bmsoc291cmNlSW5kZXgsIGNodW5rLCBvcmlnaW5hbCwgbG9jLCBzb3VyY2VtYXBMb2NhdGlvbnMpIHtcblx0XHRsZXQgb3JpZ2luYWxDaGFySW5kZXggPSBjaHVuay5zdGFydDtcblx0XHRsZXQgZmlyc3QgPSB0cnVlO1xuXG5cdFx0d2hpbGUgKG9yaWdpbmFsQ2hhckluZGV4IDwgY2h1bmsuZW5kKSB7XG5cdFx0XHRpZiAodGhpcy5oaXJlcyB8fCBmaXJzdCB8fCBzb3VyY2VtYXBMb2NhdGlvbnMuaGFzKG9yaWdpbmFsQ2hhckluZGV4KSkge1xuXHRcdFx0XHR0aGlzLnJhd1NlZ21lbnRzLnB1c2goW3RoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiwgc291cmNlSW5kZXgsIGxvYy5saW5lLCBsb2MuY29sdW1uXSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvcmlnaW5hbFtvcmlnaW5hbENoYXJJbmRleF0gPT09ICdcXG4nKSB7XG5cdFx0XHRcdGxvYy5saW5lICs9IDE7XG5cdFx0XHRcdGxvYy5jb2x1bW4gPSAwO1xuXHRcdFx0XHR0aGlzLmdlbmVyYXRlZENvZGVMaW5lICs9IDE7XG5cdFx0XHRcdHRoaXMucmF3W3RoaXMuZ2VuZXJhdGVkQ29kZUxpbmVdID0gdGhpcy5yYXdTZWdtZW50cyA9IFtdO1xuXHRcdFx0XHR0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4gPSAwO1xuXHRcdFx0XHRmaXJzdCA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsb2MuY29sdW1uICs9IDE7XG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiArPSAxO1xuXHRcdFx0XHRmaXJzdCA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRvcmlnaW5hbENoYXJJbmRleCArPSAxO1xuXHRcdH1cblxuXHRcdHRoaXMucGVuZGluZyA9IG51bGw7XG5cdH1cblxuXHRhZHZhbmNlKHN0cikge1xuXHRcdGlmICghc3RyKSByZXR1cm47XG5cblx0XHRjb25zdCBsaW5lcyA9IHN0ci5zcGxpdCgnXFxuJyk7XG5cblx0XHRpZiAobGluZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0dGhpcy5nZW5lcmF0ZWRDb2RlTGluZSsrO1xuXHRcdFx0XHR0aGlzLnJhd1t0aGlzLmdlbmVyYXRlZENvZGVMaW5lXSA9IHRoaXMucmF3U2VnbWVudHMgPSBbXTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiA9IDA7XG5cdFx0fVxuXG5cdFx0dGhpcy5nZW5lcmF0ZWRDb2RlQ29sdW1uICs9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aDtcblx0fVxufTtcblxuY29uc3QgbiQyID0gJ1xcbic7XG5cbmNvbnN0IHdhcm5lZCQxID0ge1xuXHRpbnNlcnRMZWZ0OiBmYWxzZSxcblx0aW5zZXJ0UmlnaHQ6IGZhbHNlLFxuXHRzdG9yZU5hbWU6IGZhbHNlLFxufTtcblxubGV0IE1hZ2ljU3RyaW5nJDEgPSBjbGFzcyBNYWdpY1N0cmluZyB7XG5cdGNvbnN0cnVjdG9yKHN0cmluZywgb3B0aW9ucyA9IHt9KSB7XG5cdFx0Y29uc3QgY2h1bmsgPSBuZXcgQ2h1bmskMSgwLCBzdHJpbmcubGVuZ3RoLCBzdHJpbmcpO1xuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuXHRcdFx0b3JpZ2luYWw6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBzdHJpbmcgfSxcblx0XHRcdG91dHJvOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogJycgfSxcblx0XHRcdGludHJvOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogJycgfSxcblx0XHRcdGZpcnN0Q2h1bms6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBjaHVuayB9LFxuXHRcdFx0bGFzdENodW5rOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogY2h1bmsgfSxcblx0XHRcdGxhc3RTZWFyY2hlZENodW5rOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogY2h1bmsgfSxcblx0XHRcdGJ5U3RhcnQ6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB7fSB9LFxuXHRcdFx0YnlFbmQ6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB7fSB9LFxuXHRcdFx0ZmlsZW5hbWU6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBvcHRpb25zLmZpbGVuYW1lIH0sXG5cdFx0XHRpbmRlbnRFeGNsdXNpb25SYW5nZXM6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBvcHRpb25zLmluZGVudEV4Y2x1c2lvblJhbmdlcyB9LFxuXHRcdFx0c291cmNlbWFwTG9jYXRpb25zOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogbmV3IEJpdFNldCQxKCkgfSxcblx0XHRcdHN0b3JlZE5hbWVzOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZToge30gfSxcblx0XHRcdGluZGVudFN0cjogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5ieVN0YXJ0WzBdID0gY2h1bms7XG5cdFx0dGhpcy5ieUVuZFtzdHJpbmcubGVuZ3RoXSA9IGNodW5rO1xuXHR9XG5cblx0YWRkU291cmNlbWFwTG9jYXRpb24oY2hhcikge1xuXHRcdHRoaXMuc291cmNlbWFwTG9jYXRpb25zLmFkZChjaGFyKTtcblx0fVxuXG5cdGFwcGVuZChjb250ZW50KSB7XG5cdFx0aWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignb3V0cm8gY29udGVudCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cblx0XHR0aGlzLm91dHJvICs9IGNvbnRlbnQ7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRhcHBlbmRMZWZ0KGluZGV4LCBjb250ZW50KSB7XG5cdFx0aWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5zZXJ0ZWQgY29udGVudCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cblx0XHR0aGlzLl9zcGxpdChpbmRleCk7XG5cblx0XHRjb25zdCBjaHVuayA9IHRoaXMuYnlFbmRbaW5kZXhdO1xuXG5cdFx0aWYgKGNodW5rKSB7XG5cdFx0XHRjaHVuay5hcHBlbmRMZWZ0KGNvbnRlbnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmludHJvICs9IGNvbnRlbnQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0YXBwZW5kUmlnaHQoaW5kZXgsIGNvbnRlbnQpIHtcblx0XHRpZiAodHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnNlcnRlZCBjb250ZW50IG11c3QgYmUgYSBzdHJpbmcnKTtcblxuXHRcdHRoaXMuX3NwbGl0KGluZGV4KTtcblxuXHRcdGNvbnN0IGNodW5rID0gdGhpcy5ieVN0YXJ0W2luZGV4XTtcblxuXHRcdGlmIChjaHVuaykge1xuXHRcdFx0Y2h1bmsuYXBwZW5kUmlnaHQoY29udGVudCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMub3V0cm8gKz0gY29udGVudDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRjbG9uZSgpIHtcblx0XHRjb25zdCBjbG9uZWQgPSBuZXcgTWFnaWNTdHJpbmcodGhpcy5vcmlnaW5hbCwgeyBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSB9KTtcblxuXHRcdGxldCBvcmlnaW5hbENodW5rID0gdGhpcy5maXJzdENodW5rO1xuXHRcdGxldCBjbG9uZWRDaHVuayA9IChjbG9uZWQuZmlyc3RDaHVuayA9IGNsb25lZC5sYXN0U2VhcmNoZWRDaHVuayA9IG9yaWdpbmFsQ2h1bmsuY2xvbmUoKSk7XG5cblx0XHR3aGlsZSAob3JpZ2luYWxDaHVuaykge1xuXHRcdFx0Y2xvbmVkLmJ5U3RhcnRbY2xvbmVkQ2h1bmsuc3RhcnRdID0gY2xvbmVkQ2h1bms7XG5cdFx0XHRjbG9uZWQuYnlFbmRbY2xvbmVkQ2h1bmsuZW5kXSA9IGNsb25lZENodW5rO1xuXG5cdFx0XHRjb25zdCBuZXh0T3JpZ2luYWxDaHVuayA9IG9yaWdpbmFsQ2h1bmsubmV4dDtcblx0XHRcdGNvbnN0IG5leHRDbG9uZWRDaHVuayA9IG5leHRPcmlnaW5hbENodW5rICYmIG5leHRPcmlnaW5hbENodW5rLmNsb25lKCk7XG5cblx0XHRcdGlmIChuZXh0Q2xvbmVkQ2h1bmspIHtcblx0XHRcdFx0Y2xvbmVkQ2h1bmsubmV4dCA9IG5leHRDbG9uZWRDaHVuaztcblx0XHRcdFx0bmV4dENsb25lZENodW5rLnByZXZpb3VzID0gY2xvbmVkQ2h1bms7XG5cblx0XHRcdFx0Y2xvbmVkQ2h1bmsgPSBuZXh0Q2xvbmVkQ2h1bms7XG5cdFx0XHR9XG5cblx0XHRcdG9yaWdpbmFsQ2h1bmsgPSBuZXh0T3JpZ2luYWxDaHVuaztcblx0XHR9XG5cblx0XHRjbG9uZWQubGFzdENodW5rID0gY2xvbmVkQ2h1bms7XG5cblx0XHRpZiAodGhpcy5pbmRlbnRFeGNsdXNpb25SYW5nZXMpIHtcblx0XHRcdGNsb25lZC5pbmRlbnRFeGNsdXNpb25SYW5nZXMgPSB0aGlzLmluZGVudEV4Y2x1c2lvblJhbmdlcy5zbGljZSgpO1xuXHRcdH1cblxuXHRcdGNsb25lZC5zb3VyY2VtYXBMb2NhdGlvbnMgPSBuZXcgQml0U2V0JDEodGhpcy5zb3VyY2VtYXBMb2NhdGlvbnMpO1xuXG5cdFx0Y2xvbmVkLmludHJvID0gdGhpcy5pbnRybztcblx0XHRjbG9uZWQub3V0cm8gPSB0aGlzLm91dHJvO1xuXG5cdFx0cmV0dXJuIGNsb25lZDtcblx0fVxuXG5cdGdlbmVyYXRlRGVjb2RlZE1hcChvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHRjb25zdCBzb3VyY2VJbmRleCA9IDA7XG5cdFx0Y29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnN0b3JlZE5hbWVzKTtcblx0XHRjb25zdCBtYXBwaW5ncyA9IG5ldyBNYXBwaW5ncyQxKG9wdGlvbnMuaGlyZXMpO1xuXG5cdFx0Y29uc3QgbG9jYXRlID0gZ2V0TG9jYXRvciQxKHRoaXMub3JpZ2luYWwpO1xuXG5cdFx0aWYgKHRoaXMuaW50cm8pIHtcblx0XHRcdG1hcHBpbmdzLmFkdmFuY2UodGhpcy5pbnRybyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5maXJzdENodW5rLmVhY2hOZXh0KChjaHVuaykgPT4ge1xuXHRcdFx0Y29uc3QgbG9jID0gbG9jYXRlKGNodW5rLnN0YXJ0KTtcblxuXHRcdFx0aWYgKGNodW5rLmludHJvLmxlbmd0aCkgbWFwcGluZ3MuYWR2YW5jZShjaHVuay5pbnRybyk7XG5cblx0XHRcdGlmIChjaHVuay5lZGl0ZWQpIHtcblx0XHRcdFx0bWFwcGluZ3MuYWRkRWRpdChcblx0XHRcdFx0XHRzb3VyY2VJbmRleCxcblx0XHRcdFx0XHRjaHVuay5jb250ZW50LFxuXHRcdFx0XHRcdGxvYyxcblx0XHRcdFx0XHRjaHVuay5zdG9yZU5hbWUgPyBuYW1lcy5pbmRleE9mKGNodW5rLm9yaWdpbmFsKSA6IC0xXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXBwaW5ncy5hZGRVbmVkaXRlZENodW5rKHNvdXJjZUluZGV4LCBjaHVuaywgdGhpcy5vcmlnaW5hbCwgbG9jLCB0aGlzLnNvdXJjZW1hcExvY2F0aW9ucyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjaHVuay5vdXRyby5sZW5ndGgpIG1hcHBpbmdzLmFkdmFuY2UoY2h1bmsub3V0cm8pO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGZpbGU6IG9wdGlvbnMuZmlsZSA/IG9wdGlvbnMuZmlsZS5zcGxpdCgvWy9cXFxcXS8pLnBvcCgpIDogbnVsbCxcblx0XHRcdHNvdXJjZXM6IFtvcHRpb25zLnNvdXJjZSA/IGdldFJlbGF0aXZlUGF0aCQxKG9wdGlvbnMuZmlsZSB8fCAnJywgb3B0aW9ucy5zb3VyY2UpIDogbnVsbF0sXG5cdFx0XHRzb3VyY2VzQ29udGVudDogb3B0aW9ucy5pbmNsdWRlQ29udGVudCA/IFt0aGlzLm9yaWdpbmFsXSA6IFtudWxsXSxcblx0XHRcdG5hbWVzLFxuXHRcdFx0bWFwcGluZ3M6IG1hcHBpbmdzLnJhdyxcblx0XHR9O1xuXHR9XG5cblx0Z2VuZXJhdGVNYXAob3B0aW9ucykge1xuXHRcdHJldHVybiBuZXcgU291cmNlTWFwJDIodGhpcy5nZW5lcmF0ZURlY29kZWRNYXAob3B0aW9ucykpO1xuXHR9XG5cblx0X2Vuc3VyZWluZGVudFN0cigpIHtcblx0XHRpZiAodGhpcy5pbmRlbnRTdHIgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5pbmRlbnRTdHIgPSBndWVzc0luZGVudCQxKHRoaXMub3JpZ2luYWwpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRSYXdJbmRlbnRTdHJpbmcoKSB7XG5cdFx0dGhpcy5fZW5zdXJlaW5kZW50U3RyKCk7XG5cdFx0cmV0dXJuIHRoaXMuaW5kZW50U3RyO1xuXHR9XG5cblx0Z2V0SW5kZW50U3RyaW5nKCkge1xuXHRcdHRoaXMuX2Vuc3VyZWluZGVudFN0cigpO1xuXHRcdHJldHVybiB0aGlzLmluZGVudFN0ciA9PT0gbnVsbCA/ICdcXHQnIDogdGhpcy5pbmRlbnRTdHI7XG5cdH1cblxuXHRpbmRlbnQoaW5kZW50U3RyLCBvcHRpb25zKSB7XG5cdFx0Y29uc3QgcGF0dGVybiA9IC9eW15cXHJcXG5dL2dtO1xuXG5cdFx0aWYgKGlzT2JqZWN0JDMoaW5kZW50U3RyKSkge1xuXHRcdFx0b3B0aW9ucyA9IGluZGVudFN0cjtcblx0XHRcdGluZGVudFN0ciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAoaW5kZW50U3RyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuX2Vuc3VyZWluZGVudFN0cigpO1xuXHRcdFx0aW5kZW50U3RyID0gdGhpcy5pbmRlbnRTdHIgfHwgJ1xcdCc7XG5cdFx0fVxuXG5cdFx0aWYgKGluZGVudFN0ciA9PT0gJycpIHJldHVybiB0aGlzOyAvLyBub29wXG5cblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdC8vIFByb2Nlc3MgZXhjbHVzaW9uIHJhbmdlc1xuXHRcdGNvbnN0IGlzRXhjbHVkZWQgPSB7fTtcblxuXHRcdGlmIChvcHRpb25zLmV4Y2x1ZGUpIHtcblx0XHRcdGNvbnN0IGV4Y2x1c2lvbnMgPVxuXHRcdFx0XHR0eXBlb2Ygb3B0aW9ucy5leGNsdWRlWzBdID09PSAnbnVtYmVyJyA/IFtvcHRpb25zLmV4Y2x1ZGVdIDogb3B0aW9ucy5leGNsdWRlO1xuXHRcdFx0ZXhjbHVzaW9ucy5mb3JFYWNoKChleGNsdXNpb24pID0+IHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IGV4Y2x1c2lvblswXTsgaSA8IGV4Y2x1c2lvblsxXTsgaSArPSAxKSB7XG5cdFx0XHRcdFx0aXNFeGNsdWRlZFtpXSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGxldCBzaG91bGRJbmRlbnROZXh0Q2hhcmFjdGVyID0gb3B0aW9ucy5pbmRlbnRTdGFydCAhPT0gZmFsc2U7XG5cdFx0Y29uc3QgcmVwbGFjZXIgPSAobWF0Y2gpID0+IHtcblx0XHRcdGlmIChzaG91bGRJbmRlbnROZXh0Q2hhcmFjdGVyKSByZXR1cm4gYCR7aW5kZW50U3RyfSR7bWF0Y2h9YDtcblx0XHRcdHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdH07XG5cblx0XHR0aGlzLmludHJvID0gdGhpcy5pbnRyby5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VyKTtcblxuXHRcdGxldCBjaGFySW5kZXggPSAwO1xuXHRcdGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblxuXHRcdHdoaWxlIChjaHVuaykge1xuXHRcdFx0Y29uc3QgZW5kID0gY2h1bmsuZW5kO1xuXG5cdFx0XHRpZiAoY2h1bmsuZWRpdGVkKSB7XG5cdFx0XHRcdGlmICghaXNFeGNsdWRlZFtjaGFySW5kZXhdKSB7XG5cdFx0XHRcdFx0Y2h1bmsuY29udGVudCA9IGNodW5rLmNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlcik7XG5cblx0XHRcdFx0XHRpZiAoY2h1bmsuY29udGVudC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIgPSBjaHVuay5jb250ZW50W2NodW5rLmNvbnRlbnQubGVuZ3RoIC0gMV0gPT09ICdcXG4nO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2hhckluZGV4ID0gY2h1bmsuc3RhcnQ7XG5cblx0XHRcdFx0d2hpbGUgKGNoYXJJbmRleCA8IGVuZCkge1xuXHRcdFx0XHRcdGlmICghaXNFeGNsdWRlZFtjaGFySW5kZXhdKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjaGFyID0gdGhpcy5vcmlnaW5hbFtjaGFySW5kZXhdO1xuXG5cdFx0XHRcdFx0XHRpZiAoY2hhciA9PT0gJ1xcbicpIHtcblx0XHRcdFx0XHRcdFx0c2hvdWxkSW5kZW50TmV4dENoYXJhY3RlciA9IHRydWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGNoYXIgIT09ICdcXHInICYmIHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIpIHtcblx0XHRcdFx0XHRcdFx0c2hvdWxkSW5kZW50TmV4dENoYXJhY3RlciA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChjaGFySW5kZXggPT09IGNodW5rLnN0YXJ0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2h1bmsucHJlcGVuZFJpZ2h0KGluZGVudFN0cik7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc3BsaXRDaHVuayhjaHVuaywgY2hhckluZGV4KTtcblx0XHRcdFx0XHRcdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0XHRcdFx0XHRcdFx0Y2h1bmsucHJlcGVuZFJpZ2h0KGluZGVudFN0cik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjaGFySW5kZXggKz0gMTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjaGFySW5kZXggPSBjaHVuay5lbmQ7XG5cdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0fVxuXG5cdFx0dGhpcy5vdXRybyA9IHRoaXMub3V0cm8ucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlcik7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGluc2VydCgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHQnbWFnaWNTdHJpbmcuaW5zZXJ0KC4uLikgaXMgZGVwcmVjYXRlZC4gVXNlIHByZXBlbmRSaWdodCguLi4pIG9yIGFwcGVuZExlZnQoLi4uKSdcblx0XHQpO1xuXHR9XG5cblx0aW5zZXJ0TGVmdChpbmRleCwgY29udGVudCkge1xuXHRcdGlmICghd2FybmVkJDEuaW5zZXJ0TGVmdCkge1xuXHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHQnbWFnaWNTdHJpbmcuaW5zZXJ0TGVmdCguLi4pIGlzIGRlcHJlY2F0ZWQuIFVzZSBtYWdpY1N0cmluZy5hcHBlbmRMZWZ0KC4uLikgaW5zdGVhZCdcblx0XHRcdCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXHRcdFx0d2FybmVkJDEuaW5zZXJ0TGVmdCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXBwZW5kTGVmdChpbmRleCwgY29udGVudCk7XG5cdH1cblxuXHRpbnNlcnRSaWdodChpbmRleCwgY29udGVudCkge1xuXHRcdGlmICghd2FybmVkJDEuaW5zZXJ0UmlnaHQpIHtcblx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0J21hZ2ljU3RyaW5nLmluc2VydFJpZ2h0KC4uLikgaXMgZGVwcmVjYXRlZC4gVXNlIG1hZ2ljU3RyaW5nLnByZXBlbmRSaWdodCguLi4pIGluc3RlYWQnXG5cdFx0XHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcblx0XHRcdHdhcm5lZCQxLmluc2VydFJpZ2h0ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcmVwZW5kUmlnaHQoaW5kZXgsIGNvbnRlbnQpO1xuXHR9XG5cblx0bW92ZShzdGFydCwgZW5kLCBpbmRleCkge1xuXHRcdGlmIChpbmRleCA+PSBzdGFydCAmJiBpbmRleCA8PSBlbmQpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1vdmUgYSBzZWxlY3Rpb24gaW5zaWRlIGl0c2VsZicpO1xuXG5cdFx0dGhpcy5fc3BsaXQoc3RhcnQpO1xuXHRcdHRoaXMuX3NwbGl0KGVuZCk7XG5cdFx0dGhpcy5fc3BsaXQoaW5kZXgpO1xuXG5cdFx0Y29uc3QgZmlyc3QgPSB0aGlzLmJ5U3RhcnRbc3RhcnRdO1xuXHRcdGNvbnN0IGxhc3QgPSB0aGlzLmJ5RW5kW2VuZF07XG5cblx0XHRjb25zdCBvbGRMZWZ0ID0gZmlyc3QucHJldmlvdXM7XG5cdFx0Y29uc3Qgb2xkUmlnaHQgPSBsYXN0Lm5leHQ7XG5cblx0XHRjb25zdCBuZXdSaWdodCA9IHRoaXMuYnlTdGFydFtpbmRleF07XG5cdFx0aWYgKCFuZXdSaWdodCAmJiBsYXN0ID09PSB0aGlzLmxhc3RDaHVuaykgcmV0dXJuIHRoaXM7XG5cdFx0Y29uc3QgbmV3TGVmdCA9IG5ld1JpZ2h0ID8gbmV3UmlnaHQucHJldmlvdXMgOiB0aGlzLmxhc3RDaHVuaztcblxuXHRcdGlmIChvbGRMZWZ0KSBvbGRMZWZ0Lm5leHQgPSBvbGRSaWdodDtcblx0XHRpZiAob2xkUmlnaHQpIG9sZFJpZ2h0LnByZXZpb3VzID0gb2xkTGVmdDtcblxuXHRcdGlmIChuZXdMZWZ0KSBuZXdMZWZ0Lm5leHQgPSBmaXJzdDtcblx0XHRpZiAobmV3UmlnaHQpIG5ld1JpZ2h0LnByZXZpb3VzID0gbGFzdDtcblxuXHRcdGlmICghZmlyc3QucHJldmlvdXMpIHRoaXMuZmlyc3RDaHVuayA9IGxhc3QubmV4dDtcblx0XHRpZiAoIWxhc3QubmV4dCkge1xuXHRcdFx0dGhpcy5sYXN0Q2h1bmsgPSBmaXJzdC5wcmV2aW91cztcblx0XHRcdHRoaXMubGFzdENodW5rLm5leHQgPSBudWxsO1xuXHRcdH1cblxuXHRcdGZpcnN0LnByZXZpb3VzID0gbmV3TGVmdDtcblx0XHRsYXN0Lm5leHQgPSBuZXdSaWdodCB8fCBudWxsO1xuXG5cdFx0aWYgKCFuZXdMZWZ0KSB0aGlzLmZpcnN0Q2h1bmsgPSBmaXJzdDtcblx0XHRpZiAoIW5ld1JpZ2h0KSB0aGlzLmxhc3RDaHVuayA9IGxhc3Q7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRvdmVyd3JpdGUoc3RhcnQsIGVuZCwgY29udGVudCwgb3B0aW9ucykge1xuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRcdHJldHVybiB0aGlzLnVwZGF0ZShzdGFydCwgZW5kLCBjb250ZW50LCB7IC4uLm9wdGlvbnMsIG92ZXJ3cml0ZTogIW9wdGlvbnMuY29udGVudE9ubHkgfSk7XG5cdH1cblxuXHR1cGRhdGUoc3RhcnQsIGVuZCwgY29udGVudCwgb3B0aW9ucykge1xuXHRcdGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlcGxhY2VtZW50IGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZycpO1xuXG5cdFx0d2hpbGUgKHN0YXJ0IDwgMCkgc3RhcnQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7XG5cdFx0d2hpbGUgKGVuZCA8IDApIGVuZCArPSB0aGlzLm9yaWdpbmFsLmxlbmd0aDtcblxuXHRcdGlmIChlbmQgPiB0aGlzLm9yaWdpbmFsLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdlbmQgaXMgb3V0IG9mIGJvdW5kcycpO1xuXHRcdGlmIChzdGFydCA9PT0gZW5kKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHQnQ2Fubm90IG92ZXJ3cml0ZSBhIHplcm8tbGVuZ3RoIHJhbmdlIFx1MjAxMyB1c2UgYXBwZW5kTGVmdCBvciBwcmVwZW5kUmlnaHQgaW5zdGVhZCdcblx0XHRcdCk7XG5cblx0XHR0aGlzLl9zcGxpdChzdGFydCk7XG5cdFx0dGhpcy5fc3BsaXQoZW5kKTtcblxuXHRcdGlmIChvcHRpb25zID09PSB0cnVlKSB7XG5cdFx0XHRpZiAoIXdhcm5lZCQxLnN0b3JlTmFtZSkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdFx0J1RoZSBmaW5hbCBhcmd1bWVudCB0byBtYWdpY1N0cmluZy5vdmVyd3JpdGUoLi4uKSBzaG91bGQgYmUgYW4gb3B0aW9ucyBvYmplY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmljaC1oYXJyaXMvbWFnaWMtc3RyaW5nJ1xuXHRcdFx0XHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcblx0XHRcdFx0d2FybmVkJDEuc3RvcmVOYW1lID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0b3B0aW9ucyA9IHsgc3RvcmVOYW1lOiB0cnVlIH07XG5cdFx0fVxuXHRcdGNvbnN0IHN0b3JlTmFtZSA9IG9wdGlvbnMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RvcmVOYW1lIDogZmFsc2U7XG5cdFx0Y29uc3Qgb3ZlcndyaXRlID0gb3B0aW9ucyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5vdmVyd3JpdGUgOiBmYWxzZTtcblxuXHRcdGlmIChzdG9yZU5hbWUpIHtcblx0XHRcdGNvbnN0IG9yaWdpbmFsID0gdGhpcy5vcmlnaW5hbC5zbGljZShzdGFydCwgZW5kKTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnN0b3JlZE5hbWVzLCBvcmlnaW5hbCwge1xuXHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0dmFsdWU6IHRydWUsXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBmaXJzdCA9IHRoaXMuYnlTdGFydFtzdGFydF07XG5cdFx0Y29uc3QgbGFzdCA9IHRoaXMuYnlFbmRbZW5kXTtcblxuXHRcdGlmIChmaXJzdCkge1xuXHRcdFx0bGV0IGNodW5rID0gZmlyc3Q7XG5cdFx0XHR3aGlsZSAoY2h1bmsgIT09IGxhc3QpIHtcblx0XHRcdFx0aWYgKGNodW5rLm5leHQgIT09IHRoaXMuYnlTdGFydFtjaHVuay5lbmRdKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgb3ZlcndyaXRlIGFjcm9zcyBhIHNwbGl0IHBvaW50Jyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2h1bmsgPSBjaHVuay5uZXh0O1xuXHRcdFx0XHRjaHVuay5lZGl0KCcnLCBmYWxzZSk7XG5cdFx0XHR9XG5cblx0XHRcdGZpcnN0LmVkaXQoY29udGVudCwgc3RvcmVOYW1lLCAhb3ZlcndyaXRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gbXVzdCBiZSBpbnNlcnRpbmcgYXQgdGhlIGVuZFxuXHRcdFx0Y29uc3QgbmV3Q2h1bmsgPSBuZXcgQ2h1bmskMShzdGFydCwgZW5kLCAnJykuZWRpdChjb250ZW50LCBzdG9yZU5hbWUpO1xuXG5cdFx0XHQvLyBUT0RPIGxhc3QgY2h1bmsgaW4gdGhlIGFycmF5IG1heSBub3QgYmUgdGhlIGxhc3QgY2h1bmssIGlmIGl0J3MgbW92ZWQuLi5cblx0XHRcdGxhc3QubmV4dCA9IG5ld0NodW5rO1xuXHRcdFx0bmV3Q2h1bmsucHJldmlvdXMgPSBsYXN0O1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByZXBlbmQoY29udGVudCkge1xuXHRcdGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ291dHJvIGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZycpO1xuXG5cdFx0dGhpcy5pbnRybyA9IGNvbnRlbnQgKyB0aGlzLmludHJvO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHJlcGVuZExlZnQoaW5kZXgsIGNvbnRlbnQpIHtcblx0XHRpZiAodHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnNlcnRlZCBjb250ZW50IG11c3QgYmUgYSBzdHJpbmcnKTtcblxuXHRcdHRoaXMuX3NwbGl0KGluZGV4KTtcblxuXHRcdGNvbnN0IGNodW5rID0gdGhpcy5ieUVuZFtpbmRleF07XG5cblx0XHRpZiAoY2h1bmspIHtcblx0XHRcdGNodW5rLnByZXBlbmRMZWZ0KGNvbnRlbnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmludHJvID0gY29udGVudCArIHRoaXMuaW50cm87XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHJlcGVuZFJpZ2h0KGluZGV4LCBjb250ZW50KSB7XG5cdFx0aWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5zZXJ0ZWQgY29udGVudCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cblx0XHR0aGlzLl9zcGxpdChpbmRleCk7XG5cblx0XHRjb25zdCBjaHVuayA9IHRoaXMuYnlTdGFydFtpbmRleF07XG5cblx0XHRpZiAoY2h1bmspIHtcblx0XHRcdGNodW5rLnByZXBlbmRSaWdodChjb250ZW50KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5vdXRybyA9IGNvbnRlbnQgKyB0aGlzLm91dHJvO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHJlbW92ZShzdGFydCwgZW5kKSB7XG5cdFx0d2hpbGUgKHN0YXJ0IDwgMCkgc3RhcnQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7XG5cdFx0d2hpbGUgKGVuZCA8IDApIGVuZCArPSB0aGlzLm9yaWdpbmFsLmxlbmd0aDtcblxuXHRcdGlmIChzdGFydCA9PT0gZW5kKSByZXR1cm4gdGhpcztcblxuXHRcdGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGhpcy5vcmlnaW5hbC5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQ2hhcmFjdGVyIGlzIG91dCBvZiBib3VuZHMnKTtcblx0XHRpZiAoc3RhcnQgPiBlbmQpIHRocm93IG5ldyBFcnJvcignZW5kIG11c3QgYmUgZ3JlYXRlciB0aGFuIHN0YXJ0Jyk7XG5cblx0XHR0aGlzLl9zcGxpdChzdGFydCk7XG5cdFx0dGhpcy5fc3BsaXQoZW5kKTtcblxuXHRcdGxldCBjaHVuayA9IHRoaXMuYnlTdGFydFtzdGFydF07XG5cblx0XHR3aGlsZSAoY2h1bmspIHtcblx0XHRcdGNodW5rLmludHJvID0gJyc7XG5cdFx0XHRjaHVuay5vdXRybyA9ICcnO1xuXHRcdFx0Y2h1bmsuZWRpdCgnJyk7XG5cblx0XHRcdGNodW5rID0gZW5kID4gY2h1bmsuZW5kID8gdGhpcy5ieVN0YXJ0W2NodW5rLmVuZF0gOiBudWxsO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGxhc3RDaGFyKCkge1xuXHRcdGlmICh0aGlzLm91dHJvLmxlbmd0aCkgcmV0dXJuIHRoaXMub3V0cm9bdGhpcy5vdXRyby5sZW5ndGggLSAxXTtcblx0XHRsZXQgY2h1bmsgPSB0aGlzLmxhc3RDaHVuaztcblx0XHRkbyB7XG5cdFx0XHRpZiAoY2h1bmsub3V0cm8ubGVuZ3RoKSByZXR1cm4gY2h1bmsub3V0cm9bY2h1bmsub3V0cm8ubGVuZ3RoIC0gMV07XG5cdFx0XHRpZiAoY2h1bmsuY29udGVudC5sZW5ndGgpIHJldHVybiBjaHVuay5jb250ZW50W2NodW5rLmNvbnRlbnQubGVuZ3RoIC0gMV07XG5cdFx0XHRpZiAoY2h1bmsuaW50cm8ubGVuZ3RoKSByZXR1cm4gY2h1bmsuaW50cm9bY2h1bmsuaW50cm8ubGVuZ3RoIC0gMV07XG5cdFx0fSB3aGlsZSAoKGNodW5rID0gY2h1bmsucHJldmlvdXMpKTtcblx0XHRpZiAodGhpcy5pbnRyby5sZW5ndGgpIHJldHVybiB0aGlzLmludHJvW3RoaXMuaW50cm8ubGVuZ3RoIC0gMV07XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cblx0bGFzdExpbmUoKSB7XG5cdFx0bGV0IGxpbmVJbmRleCA9IHRoaXMub3V0cm8ubGFzdEluZGV4T2YobiQyKTtcblx0XHRpZiAobGluZUluZGV4ICE9PSAtMSkgcmV0dXJuIHRoaXMub3V0cm8uc3Vic3RyKGxpbmVJbmRleCArIDEpO1xuXHRcdGxldCBsaW5lU3RyID0gdGhpcy5vdXRybztcblx0XHRsZXQgY2h1bmsgPSB0aGlzLmxhc3RDaHVuaztcblx0XHRkbyB7XG5cdFx0XHRpZiAoY2h1bmsub3V0cm8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsaW5lSW5kZXggPSBjaHVuay5vdXRyby5sYXN0SW5kZXhPZihuJDIpO1xuXHRcdFx0XHRpZiAobGluZUluZGV4ICE9PSAtMSkgcmV0dXJuIGNodW5rLm91dHJvLnN1YnN0cihsaW5lSW5kZXggKyAxKSArIGxpbmVTdHI7XG5cdFx0XHRcdGxpbmVTdHIgPSBjaHVuay5vdXRybyArIGxpbmVTdHI7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjaHVuay5jb250ZW50Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZUluZGV4ID0gY2h1bmsuY29udGVudC5sYXN0SW5kZXhPZihuJDIpO1xuXHRcdFx0XHRpZiAobGluZUluZGV4ICE9PSAtMSkgcmV0dXJuIGNodW5rLmNvbnRlbnQuc3Vic3RyKGxpbmVJbmRleCArIDEpICsgbGluZVN0cjtcblx0XHRcdFx0bGluZVN0ciA9IGNodW5rLmNvbnRlbnQgKyBsaW5lU3RyO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2h1bmsuaW50cm8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsaW5lSW5kZXggPSBjaHVuay5pbnRyby5sYXN0SW5kZXhPZihuJDIpO1xuXHRcdFx0XHRpZiAobGluZUluZGV4ICE9PSAtMSkgcmV0dXJuIGNodW5rLmludHJvLnN1YnN0cihsaW5lSW5kZXggKyAxKSArIGxpbmVTdHI7XG5cdFx0XHRcdGxpbmVTdHIgPSBjaHVuay5pbnRybyArIGxpbmVTdHI7XG5cdFx0XHR9XG5cdFx0fSB3aGlsZSAoKGNodW5rID0gY2h1bmsucHJldmlvdXMpKTtcblx0XHRsaW5lSW5kZXggPSB0aGlzLmludHJvLmxhc3RJbmRleE9mKG4kMik7XG5cdFx0aWYgKGxpbmVJbmRleCAhPT0gLTEpIHJldHVybiB0aGlzLmludHJvLnN1YnN0cihsaW5lSW5kZXggKyAxKSArIGxpbmVTdHI7XG5cdFx0cmV0dXJuIHRoaXMuaW50cm8gKyBsaW5lU3RyO1xuXHR9XG5cblx0c2xpY2Uoc3RhcnQgPSAwLCBlbmQgPSB0aGlzLm9yaWdpbmFsLmxlbmd0aCkge1xuXHRcdHdoaWxlIChzdGFydCA8IDApIHN0YXJ0ICs9IHRoaXMub3JpZ2luYWwubGVuZ3RoO1xuXHRcdHdoaWxlIChlbmQgPCAwKSBlbmQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7XG5cblx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cblx0XHQvLyBmaW5kIHN0YXJ0IGNodW5rXG5cdFx0bGV0IGNodW5rID0gdGhpcy5maXJzdENodW5rO1xuXHRcdHdoaWxlIChjaHVuayAmJiAoY2h1bmsuc3RhcnQgPiBzdGFydCB8fCBjaHVuay5lbmQgPD0gc3RhcnQpKSB7XG5cdFx0XHQvLyBmb3VuZCBlbmQgY2h1bmsgYmVmb3JlIHN0YXJ0XG5cdFx0XHRpZiAoY2h1bmsuc3RhcnQgPCBlbmQgJiYgY2h1bmsuZW5kID49IGVuZCkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fVxuXG5cdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0fVxuXG5cdFx0aWYgKGNodW5rICYmIGNodW5rLmVkaXRlZCAmJiBjaHVuay5zdGFydCAhPT0gc3RhcnQpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1c2UgcmVwbGFjZWQgY2hhcmFjdGVyICR7c3RhcnR9IGFzIHNsaWNlIHN0YXJ0IGFuY2hvci5gKTtcblxuXHRcdGNvbnN0IHN0YXJ0Q2h1bmsgPSBjaHVuaztcblx0XHR3aGlsZSAoY2h1bmspIHtcblx0XHRcdGlmIChjaHVuay5pbnRybyAmJiAoc3RhcnRDaHVuayAhPT0gY2h1bmsgfHwgY2h1bmsuc3RhcnQgPT09IHN0YXJ0KSkge1xuXHRcdFx0XHRyZXN1bHQgKz0gY2h1bmsuaW50cm87XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNvbnRhaW5zRW5kID0gY2h1bmsuc3RhcnQgPCBlbmQgJiYgY2h1bmsuZW5kID49IGVuZDtcblx0XHRcdGlmIChjb250YWluc0VuZCAmJiBjaHVuay5lZGl0ZWQgJiYgY2h1bmsuZW5kICE9PSBlbmQpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSByZXBsYWNlZCBjaGFyYWN0ZXIgJHtlbmR9IGFzIHNsaWNlIGVuZCBhbmNob3IuYCk7XG5cblx0XHRcdGNvbnN0IHNsaWNlU3RhcnQgPSBzdGFydENodW5rID09PSBjaHVuayA/IHN0YXJ0IC0gY2h1bmsuc3RhcnQgOiAwO1xuXHRcdFx0Y29uc3Qgc2xpY2VFbmQgPSBjb250YWluc0VuZCA/IGNodW5rLmNvbnRlbnQubGVuZ3RoICsgZW5kIC0gY2h1bmsuZW5kIDogY2h1bmsuY29udGVudC5sZW5ndGg7XG5cblx0XHRcdHJlc3VsdCArPSBjaHVuay5jb250ZW50LnNsaWNlKHNsaWNlU3RhcnQsIHNsaWNlRW5kKTtcblxuXHRcdFx0aWYgKGNodW5rLm91dHJvICYmICghY29udGFpbnNFbmQgfHwgY2h1bmsuZW5kID09PSBlbmQpKSB7XG5cdFx0XHRcdHJlc3VsdCArPSBjaHVuay5vdXRybztcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNvbnRhaW5zRW5kKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8vIFRPRE8gZGVwcmVjYXRlIHRoaXM/IG5vdCByZWFsbHkgdmVyeSB1c2VmdWxcblx0c25pcChzdGFydCwgZW5kKSB7XG5cdFx0Y29uc3QgY2xvbmUgPSB0aGlzLmNsb25lKCk7XG5cdFx0Y2xvbmUucmVtb3ZlKDAsIHN0YXJ0KTtcblx0XHRjbG9uZS5yZW1vdmUoZW5kLCBjbG9uZS5vcmlnaW5hbC5sZW5ndGgpO1xuXG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9XG5cblx0X3NwbGl0KGluZGV4KSB7XG5cdFx0aWYgKHRoaXMuYnlTdGFydFtpbmRleF0gfHwgdGhpcy5ieUVuZFtpbmRleF0pIHJldHVybjtcblxuXHRcdGxldCBjaHVuayA9IHRoaXMubGFzdFNlYXJjaGVkQ2h1bms7XG5cdFx0Y29uc3Qgc2VhcmNoRm9yd2FyZCA9IGluZGV4ID4gY2h1bmsuZW5kO1xuXG5cdFx0d2hpbGUgKGNodW5rKSB7XG5cdFx0XHRpZiAoY2h1bmsuY29udGFpbnMoaW5kZXgpKSByZXR1cm4gdGhpcy5fc3BsaXRDaHVuayhjaHVuaywgaW5kZXgpO1xuXG5cdFx0XHRjaHVuayA9IHNlYXJjaEZvcndhcmQgPyB0aGlzLmJ5U3RhcnRbY2h1bmsuZW5kXSA6IHRoaXMuYnlFbmRbY2h1bmsuc3RhcnRdO1xuXHRcdH1cblx0fVxuXG5cdF9zcGxpdENodW5rKGNodW5rLCBpbmRleCkge1xuXHRcdGlmIChjaHVuay5lZGl0ZWQgJiYgY2h1bmsuY29udGVudC5sZW5ndGgpIHtcblx0XHRcdC8vIHplcm8tbGVuZ3RoIGVkaXRlZCBjaHVua3MgYXJlIGEgc3BlY2lhbCBjYXNlIChvdmVybGFwcGluZyByZXBsYWNlbWVudHMpXG5cdFx0XHRjb25zdCBsb2MgPSBnZXRMb2NhdG9yJDEodGhpcy5vcmlnaW5hbCkoaW5kZXgpO1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgQ2Fubm90IHNwbGl0IGEgY2h1bmsgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGVkaXRlZCAoJHtsb2MubGluZX06JHtsb2MuY29sdW1ufSBcdTIwMTMgXCIke2NodW5rLm9yaWdpbmFsfVwiKWBcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbmV3Q2h1bmsgPSBjaHVuay5zcGxpdChpbmRleCk7XG5cblx0XHR0aGlzLmJ5RW5kW2luZGV4XSA9IGNodW5rO1xuXHRcdHRoaXMuYnlTdGFydFtpbmRleF0gPSBuZXdDaHVuaztcblx0XHR0aGlzLmJ5RW5kW25ld0NodW5rLmVuZF0gPSBuZXdDaHVuaztcblxuXHRcdGlmIChjaHVuayA9PT0gdGhpcy5sYXN0Q2h1bmspIHRoaXMubGFzdENodW5rID0gbmV3Q2h1bms7XG5cblx0XHR0aGlzLmxhc3RTZWFyY2hlZENodW5rID0gY2h1bms7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHR0b1N0cmluZygpIHtcblx0XHRsZXQgc3RyID0gdGhpcy5pbnRybztcblxuXHRcdGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblx0XHR3aGlsZSAoY2h1bmspIHtcblx0XHRcdHN0ciArPSBjaHVuay50b1N0cmluZygpO1xuXHRcdFx0Y2h1bmsgPSBjaHVuay5uZXh0O1xuXHRcdH1cblxuXHRcdHJldHVybiBzdHIgKyB0aGlzLm91dHJvO1xuXHR9XG5cblx0aXNFbXB0eSgpIHtcblx0XHRsZXQgY2h1bmsgPSB0aGlzLmZpcnN0Q2h1bms7XG5cdFx0ZG8ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoY2h1bmsuaW50cm8ubGVuZ3RoICYmIGNodW5rLmludHJvLnRyaW0oKSkgfHxcblx0XHRcdFx0KGNodW5rLmNvbnRlbnQubGVuZ3RoICYmIGNodW5rLmNvbnRlbnQudHJpbSgpKSB8fFxuXHRcdFx0XHQoY2h1bmsub3V0cm8ubGVuZ3RoICYmIGNodW5rLm91dHJvLnRyaW0oKSlcblx0XHRcdClcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gd2hpbGUgKChjaHVuayA9IGNodW5rLm5leHQpKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGxlbmd0aCgpIHtcblx0XHRsZXQgY2h1bmsgPSB0aGlzLmZpcnN0Q2h1bms7XG5cdFx0bGV0IGxlbmd0aCA9IDA7XG5cdFx0ZG8ge1xuXHRcdFx0bGVuZ3RoICs9IGNodW5rLmludHJvLmxlbmd0aCArIGNodW5rLmNvbnRlbnQubGVuZ3RoICsgY2h1bmsub3V0cm8ubGVuZ3RoO1xuXHRcdH0gd2hpbGUgKChjaHVuayA9IGNodW5rLm5leHQpKTtcblx0XHRyZXR1cm4gbGVuZ3RoO1xuXHR9XG5cblx0dHJpbUxpbmVzKCkge1xuXHRcdHJldHVybiB0aGlzLnRyaW0oJ1tcXFxcclxcXFxuXScpO1xuXHR9XG5cblx0dHJpbShjaGFyVHlwZSkge1xuXHRcdHJldHVybiB0aGlzLnRyaW1TdGFydChjaGFyVHlwZSkudHJpbUVuZChjaGFyVHlwZSk7XG5cdH1cblxuXHR0cmltRW5kQWJvcnRlZChjaGFyVHlwZSkge1xuXHRcdGNvbnN0IHJ4ID0gbmV3IFJlZ0V4cCgoY2hhclR5cGUgfHwgJ1xcXFxzJykgKyAnKyQnKTtcblxuXHRcdHRoaXMub3V0cm8gPSB0aGlzLm91dHJvLnJlcGxhY2UocngsICcnKTtcblx0XHRpZiAodGhpcy5vdXRyby5sZW5ndGgpIHJldHVybiB0cnVlO1xuXG5cdFx0bGV0IGNodW5rID0gdGhpcy5sYXN0Q2h1bms7XG5cblx0XHRkbyB7XG5cdFx0XHRjb25zdCBlbmQgPSBjaHVuay5lbmQ7XG5cdFx0XHRjb25zdCBhYm9ydGVkID0gY2h1bmsudHJpbUVuZChyeCk7XG5cblx0XHRcdC8vIGlmIGNodW5rIHdhcyB0cmltbWVkLCB3ZSBoYXZlIGEgbmV3IGxhc3RDaHVua1xuXHRcdFx0aWYgKGNodW5rLmVuZCAhPT0gZW5kKSB7XG5cdFx0XHRcdGlmICh0aGlzLmxhc3RDaHVuayA9PT0gY2h1bmspIHtcblx0XHRcdFx0XHR0aGlzLmxhc3RDaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmJ5RW5kW2NodW5rLmVuZF0gPSBjaHVuaztcblx0XHRcdFx0dGhpcy5ieVN0YXJ0W2NodW5rLm5leHQuc3RhcnRdID0gY2h1bmsubmV4dDtcblx0XHRcdFx0dGhpcy5ieUVuZFtjaHVuay5uZXh0LmVuZF0gPSBjaHVuay5uZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWJvcnRlZCkgcmV0dXJuIHRydWU7XG5cdFx0XHRjaHVuayA9IGNodW5rLnByZXZpb3VzO1xuXHRcdH0gd2hpbGUgKGNodW5rKTtcblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHRyaW1FbmQoY2hhclR5cGUpIHtcblx0XHR0aGlzLnRyaW1FbmRBYm9ydGVkKGNoYXJUeXBlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHR0cmltU3RhcnRBYm9ydGVkKGNoYXJUeXBlKSB7XG5cdFx0Y29uc3QgcnggPSBuZXcgUmVnRXhwKCdeJyArIChjaGFyVHlwZSB8fCAnXFxcXHMnKSArICcrJyk7XG5cblx0XHR0aGlzLmludHJvID0gdGhpcy5pbnRyby5yZXBsYWNlKHJ4LCAnJyk7XG5cdFx0aWYgKHRoaXMuaW50cm8ubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcblxuXHRcdGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblxuXHRcdGRvIHtcblx0XHRcdGNvbnN0IGVuZCA9IGNodW5rLmVuZDtcblx0XHRcdGNvbnN0IGFib3J0ZWQgPSBjaHVuay50cmltU3RhcnQocngpO1xuXG5cdFx0XHRpZiAoY2h1bmsuZW5kICE9PSBlbmQpIHtcblx0XHRcdFx0Ly8gc3BlY2lhbCBjYXNlLi4uXG5cdFx0XHRcdGlmIChjaHVuayA9PT0gdGhpcy5sYXN0Q2h1bmspIHRoaXMubGFzdENodW5rID0gY2h1bmsubmV4dDtcblxuXHRcdFx0XHR0aGlzLmJ5RW5kW2NodW5rLmVuZF0gPSBjaHVuaztcblx0XHRcdFx0dGhpcy5ieVN0YXJ0W2NodW5rLm5leHQuc3RhcnRdID0gY2h1bmsubmV4dDtcblx0XHRcdFx0dGhpcy5ieUVuZFtjaHVuay5uZXh0LmVuZF0gPSBjaHVuay5uZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWJvcnRlZCkgcmV0dXJuIHRydWU7XG5cdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0fSB3aGlsZSAoY2h1bmspO1xuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dHJpbVN0YXJ0KGNoYXJUeXBlKSB7XG5cdFx0dGhpcy50cmltU3RhcnRBYm9ydGVkKGNoYXJUeXBlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGhhc0NoYW5nZWQoKSB7XG5cdFx0cmV0dXJuIHRoaXMub3JpZ2luYWwgIT09IHRoaXMudG9TdHJpbmcoKTtcblx0fVxuXG5cdF9yZXBsYWNlUmVnZXhwKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCkge1xuXHRcdGZ1bmN0aW9uIGdldFJlcGxhY2VtZW50KG1hdGNoLCBzdHIpIHtcblx0XHRcdGlmICh0eXBlb2YgcmVwbGFjZW1lbnQgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHJldHVybiByZXBsYWNlbWVudC5yZXBsYWNlKC9cXCQoXFwkfCZ8XFxkKykvZywgKF8sIGkpID0+IHtcblx0XHRcdFx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvcmVwbGFjZSNzcGVjaWZ5aW5nX2Ffc3RyaW5nX2FzX2FfcGFyYW1ldGVyXG5cdFx0XHRcdFx0aWYgKGkgPT09ICckJykgcmV0dXJuICckJztcblx0XHRcdFx0XHRpZiAoaSA9PT0gJyYnKSByZXR1cm4gbWF0Y2hbMF07XG5cdFx0XHRcdFx0Y29uc3QgbnVtID0gK2k7XG5cdFx0XHRcdFx0aWYgKG51bSA8IG1hdGNoLmxlbmd0aCkgcmV0dXJuIG1hdGNoWytpXTtcblx0XHRcdFx0XHRyZXR1cm4gYCQke2l9YDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gcmVwbGFjZW1lbnQoLi4ubWF0Y2gsIG1hdGNoLmluZGV4LCBzdHIsIG1hdGNoLmdyb3Vwcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZ1bmN0aW9uIG1hdGNoQWxsKHJlLCBzdHIpIHtcblx0XHRcdGxldCBtYXRjaDtcblx0XHRcdGNvbnN0IG1hdGNoZXMgPSBbXTtcblx0XHRcdHdoaWxlICgobWF0Y2ggPSByZS5leGVjKHN0cikpKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaChtYXRjaCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hlcztcblx0XHR9XG5cdFx0aWYgKHNlYXJjaFZhbHVlLmdsb2JhbCkge1xuXHRcdFx0Y29uc3QgbWF0Y2hlcyA9IG1hdGNoQWxsKHNlYXJjaFZhbHVlLCB0aGlzLm9yaWdpbmFsKTtcblx0XHRcdG1hdGNoZXMuZm9yRWFjaCgobWF0Y2gpID0+IHtcblx0XHRcdFx0aWYgKG1hdGNoLmluZGV4ICE9IG51bGwpXG5cdFx0XHRcdFx0dGhpcy5vdmVyd3JpdGUoXG5cdFx0XHRcdFx0XHRtYXRjaC5pbmRleCxcblx0XHRcdFx0XHRcdG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoLFxuXHRcdFx0XHRcdFx0Z2V0UmVwbGFjZW1lbnQobWF0Y2gsIHRoaXMub3JpZ2luYWwpXG5cdFx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBtYXRjaCA9IHRoaXMub3JpZ2luYWwubWF0Y2goc2VhcmNoVmFsdWUpO1xuXHRcdFx0aWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ICE9IG51bGwpXG5cdFx0XHRcdHRoaXMub3ZlcndyaXRlKFxuXHRcdFx0XHRcdG1hdGNoLmluZGV4LFxuXHRcdFx0XHRcdG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoLFxuXHRcdFx0XHRcdGdldFJlcGxhY2VtZW50KG1hdGNoLCB0aGlzLm9yaWdpbmFsKVxuXHRcdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdF9yZXBsYWNlU3RyaW5nKHN0cmluZywgcmVwbGFjZW1lbnQpIHtcblx0XHRjb25zdCB7IG9yaWdpbmFsIH0gPSB0aGlzO1xuXHRcdGNvbnN0IGluZGV4ID0gb3JpZ2luYWwuaW5kZXhPZihzdHJpbmcpO1xuXG5cdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0dGhpcy5vdmVyd3JpdGUoaW5kZXgsIGluZGV4ICsgc3RyaW5nLmxlbmd0aCwgcmVwbGFjZW1lbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZW1lbnQpIHtcblx0XHRpZiAodHlwZW9mIHNlYXJjaFZhbHVlID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3JlcGxhY2VTdHJpbmcoc2VhcmNoVmFsdWUsIHJlcGxhY2VtZW50KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fcmVwbGFjZVJlZ2V4cChzZWFyY2hWYWx1ZSwgcmVwbGFjZW1lbnQpO1xuXHR9XG5cblx0X3JlcGxhY2VBbGxTdHJpbmcoc3RyaW5nLCByZXBsYWNlbWVudCkge1xuXHRcdGNvbnN0IHsgb3JpZ2luYWwgfSA9IHRoaXM7XG5cdFx0Y29uc3Qgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcblx0XHRmb3IgKFxuXHRcdFx0bGV0IGluZGV4ID0gb3JpZ2luYWwuaW5kZXhPZihzdHJpbmcpO1xuXHRcdFx0aW5kZXggIT09IC0xO1xuXHRcdFx0aW5kZXggPSBvcmlnaW5hbC5pbmRleE9mKHN0cmluZywgaW5kZXggKyBzdHJpbmdMZW5ndGgpXG5cdFx0KSB7XG5cdFx0XHR0aGlzLm92ZXJ3cml0ZShpbmRleCwgaW5kZXggKyBzdHJpbmdMZW5ndGgsIHJlcGxhY2VtZW50KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHJlcGxhY2VBbGwoc2VhcmNoVmFsdWUsIHJlcGxhY2VtZW50KSB7XG5cdFx0aWYgKHR5cGVvZiBzZWFyY2hWYWx1ZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiB0aGlzLl9yZXBsYWNlQWxsU3RyaW5nKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCk7XG5cdFx0fVxuXG5cdFx0aWYgKCFzZWFyY2hWYWx1ZS5nbG9iYWwpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXG5cdFx0XHRcdCdNYWdpY1N0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCBjYWxsZWQgd2l0aCBhIG5vbi1nbG9iYWwgUmVnRXhwIGFyZ3VtZW50J1xuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fcmVwbGFjZVJlZ2V4cChzZWFyY2hWYWx1ZSwgcmVwbGFjZW1lbnQpO1xuXHR9XG59O1xuXG5mdW5jdGlvbiBpc1JlZmVyZW5jZShub2RlLCBwYXJlbnQpIHtcbiAgICBpZiAobm9kZS50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicpIHtcbiAgICAgICAgcmV0dXJuICFub2RlLmNvbXB1dGVkICYmIGlzUmVmZXJlbmNlKG5vZGUub2JqZWN0LCBub2RlKTtcbiAgICB9XG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICAgIC8vIGRpc3JlZ2FyZCBgYmFyYCBpbiBgZm9vLmJhcmBcbiAgICAgICAgICAgIGNhc2UgJ01lbWJlckV4cHJlc3Npb24nOiByZXR1cm4gcGFyZW50LmNvbXB1dGVkIHx8IG5vZGUgPT09IHBhcmVudC5vYmplY3Q7XG4gICAgICAgICAgICAvLyBkaXNyZWdhcmQgdGhlIGBmb29gIGluIGBjbGFzcyB7Zm9vKCl7fX1gIGJ1dCBrZWVwIGl0IGluIGBjbGFzcyB7W2Zvb10oKXt9fWBcbiAgICAgICAgICAgIGNhc2UgJ01ldGhvZERlZmluaXRpb24nOiByZXR1cm4gcGFyZW50LmNvbXB1dGVkO1xuICAgICAgICAgICAgLy8gZGlzcmVnYXJkIHRoZSBgZm9vYCBpbiBgY2xhc3Mge2Zvbz1iYXJ9YCBidXQga2VlcCBpdCBpbiBgY2xhc3Mge1tmb29dPWJhcn1gIGFuZCBgY2xhc3Mge2Jhcj1mb299YFxuICAgICAgICAgICAgY2FzZSAnRmllbGREZWZpbml0aW9uJzogcmV0dXJuIHBhcmVudC5jb21wdXRlZCB8fCBub2RlID09PSBwYXJlbnQudmFsdWU7XG4gICAgICAgICAgICAvLyBkaXNyZWdhcmQgdGhlIGBiYXJgIGluIGB7IGJhcjogZm9vIH1gLCBidXQga2VlcCBpdCBpbiBgeyBbYmFyXTogZm9vIH1gXG4gICAgICAgICAgICBjYXNlICdQcm9wZXJ0eSc6IHJldHVybiBwYXJlbnQuY29tcHV0ZWQgfHwgbm9kZSA9PT0gcGFyZW50LnZhbHVlO1xuICAgICAgICAgICAgLy8gZGlzcmVnYXJkIHRoZSBgYmFyYCBpbiBgZXhwb3J0IHsgZm9vIGFzIGJhciB9YCBvclxuICAgICAgICAgICAgLy8gdGhlIGZvbyBpbiBgaW1wb3J0IHsgZm9vIGFzIGJhciB9YFxuICAgICAgICAgICAgY2FzZSAnRXhwb3J0U3BlY2lmaWVyJzpcbiAgICAgICAgICAgIGNhc2UgJ0ltcG9ydFNwZWNpZmllcic6IHJldHVybiBub2RlID09PSBwYXJlbnQubG9jYWw7XG4gICAgICAgICAgICAvLyBkaXNyZWdhcmQgdGhlIGBmb29gIGluIGBmb286IHdoaWxlICguLi4pIHsgLi4uIGJyZWFrIGZvbzsgLi4uIGNvbnRpbnVlIGZvbzt9YFxuICAgICAgICAgICAgY2FzZSAnTGFiZWxlZFN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdCcmVha1N0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdDb250aW51ZVN0YXRlbWVudCc6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIHZlcnNpb24kMyA9IFwiMjQuMC4xXCI7XG52YXIgcGVlckRlcGVuZGVuY2llcyA9IHtcblx0cm9sbHVwOiBcIl4yLjY4LjB8fF4zLjAuMFwiXG59O1xuXG5mdW5jdGlvbiB0cnlQYXJzZShwYXJzZSwgY29kZSwgaWQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2UoY29kZSwgeyBhbGxvd1JldHVybk91dHNpZGVGdW5jdGlvbjogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLm1lc3NhZ2UgKz0gYCBpbiAke2lkfWA7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmNvbnN0IGZpcnN0cGFzc0dsb2JhbCA9IC9cXGIoPzpyZXF1aXJlfG1vZHVsZXxleHBvcnRzfGdsb2JhbClcXGIvO1xuXG5jb25zdCBmaXJzdHBhc3NOb0dsb2JhbCA9IC9cXGIoPzpyZXF1aXJlfG1vZHVsZXxleHBvcnRzKVxcYi87XG5cbmZ1bmN0aW9uIGhhc0Nqc0tleXdvcmRzKGNvZGUsIGlnbm9yZUdsb2JhbCkge1xuICBjb25zdCBmaXJzdHBhc3MgPSBpZ25vcmVHbG9iYWwgPyBmaXJzdHBhc3NOb0dsb2JhbCA6IGZpcnN0cGFzc0dsb2JhbDtcbiAgcmV0dXJuIGZpcnN0cGFzcy50ZXN0KGNvZGUpO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuXG5mdW5jdGlvbiBhbmFseXplVG9wTGV2ZWxTdGF0ZW1lbnRzKHBhcnNlLCBjb2RlLCBpZCkge1xuICBjb25zdCBhc3QgPSB0cnlQYXJzZShwYXJzZSwgY29kZSwgaWQpO1xuXG4gIGxldCBpc0VzTW9kdWxlID0gZmFsc2U7XG4gIGxldCBoYXNEZWZhdWx0RXhwb3J0ID0gZmFsc2U7XG4gIGxldCBoYXNOYW1lZEV4cG9ydHMgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IG5vZGUgb2YgYXN0LmJvZHkpIHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJzpcbiAgICAgICAgaXNFc01vZHVsZSA9IHRydWU7XG4gICAgICAgIGhhc0RlZmF1bHRFeHBvcnQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nOlxuICAgICAgICBpc0VzTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb24pIHtcbiAgICAgICAgICBoYXNOYW1lZEV4cG9ydHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIG5vZGUuc3BlY2lmaWVycykge1xuICAgICAgICAgICAgaWYgKHNwZWNpZmllci5leHBvcnRlZC5uYW1lID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgaGFzRGVmYXVsdEV4cG9ydCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBoYXNOYW1lZEV4cG9ydHMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0V4cG9ydEFsbERlY2xhcmF0aW9uJzpcbiAgICAgICAgaXNFc01vZHVsZSA9IHRydWU7XG4gICAgICAgIGlmIChub2RlLmV4cG9ydGVkICYmIG5vZGUuZXhwb3J0ZWQubmFtZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgaGFzRGVmYXVsdEV4cG9ydCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzTmFtZWRFeHBvcnRzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0ltcG9ydERlY2xhcmF0aW9uJzpcbiAgICAgICAgaXNFc01vZHVsZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGlzRXNNb2R1bGUsIGhhc0RlZmF1bHRFeHBvcnQsIGhhc05hbWVkRXhwb3J0cywgYXN0IH07XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9wcmVmZXItZGVmYXVsdC1leHBvcnQgKi9cblxuZnVuY3Rpb24gZGVjb25mbGljdChzY29wZXMsIGdsb2JhbHMsIGlkZW50aWZpZXIpIHtcbiAgbGV0IGkgPSAxO1xuICBsZXQgZGVjb25mbGljdGVkID0gbWFrZUxlZ2FsSWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgY29uc3QgaGFzQ29uZmxpY3RzID0gKCkgPT5cbiAgICBzY29wZXMuc29tZSgoc2NvcGUpID0+IHNjb3BlLmNvbnRhaW5zKGRlY29uZmxpY3RlZCkpIHx8IGdsb2JhbHMuaGFzKGRlY29uZmxpY3RlZCk7XG5cbiAgd2hpbGUgKGhhc0NvbmZsaWN0cygpKSB7XG4gICAgZGVjb25mbGljdGVkID0gbWFrZUxlZ2FsSWRlbnRpZmllcihgJHtpZGVudGlmaWVyfV8ke2l9YCk7XG4gICAgaSArPSAxO1xuICB9XG5cbiAgZm9yIChjb25zdCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICBzY29wZS5kZWNsYXJhdGlvbnNbZGVjb25mbGljdGVkXSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gZGVjb25mbGljdGVkO1xufVxuXG5mdW5jdGlvbiBnZXROYW1lKGlkKSB7XG4gIGNvbnN0IG5hbWUgPSBtYWtlTGVnYWxJZGVudGlmaWVyKGJhc2VuYW1lJDEoaWQsIGV4dG5hbWUoaWQpKSk7XG4gIGlmIChuYW1lICE9PSAnaW5kZXgnKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbiAgcmV0dXJuIG1ha2VMZWdhbElkZW50aWZpZXIoYmFzZW5hbWUkMShkaXJuYW1lJDEoaWQpKSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhTbGFzaGVzKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xufVxuXG5jb25zdCBnZXRWaXJ0dWFsUGF0aEZvckR5bmFtaWNSZXF1aXJlUGF0aCA9IChwYXRoLCBjb21tb25EaXIpID0+XG4gIGAvJHtub3JtYWxpemVQYXRoU2xhc2hlcyhyZWxhdGl2ZSQxKGNvbW1vbkRpciwgcGF0aCkpfWA7XG5cbmZ1bmN0aW9uIGNhcGl0YWxpemUobmFtZSkge1xuICByZXR1cm4gbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RyaWN0UmVxdWlyZXNGaWx0ZXIoeyBzdHJpY3RSZXF1aXJlcyB9KSB7XG4gIHN3aXRjaCAoc3RyaWN0UmVxdWlyZXMpIHtcbiAgICBjYXNlIHRydWU6XG4gICAgICByZXR1cm4geyBzdHJpY3RSZXF1aXJlc0ZpbHRlcjogKCkgPT4gdHJ1ZSwgZGV0ZWN0Q3ljbGVzQW5kQ29uZGl0aW9uYWw6IGZhbHNlIH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmaW5lZFxuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgIGNhc2UgJ2F1dG8nOlxuICAgIGNhc2UgJ2RlYnVnJzpcbiAgICBjYXNlIG51bGw6XG4gICAgICByZXR1cm4geyBzdHJpY3RSZXF1aXJlc0ZpbHRlcjogKCkgPT4gZmFsc2UsIGRldGVjdEN5Y2xlc0FuZENvbmRpdGlvbmFsOiB0cnVlIH07XG4gICAgY2FzZSBmYWxzZTpcbiAgICAgIHJldHVybiB7IHN0cmljdFJlcXVpcmVzRmlsdGVyOiAoKSA9PiBmYWxzZSwgZGV0ZWN0Q3ljbGVzQW5kQ29uZGl0aW9uYWw6IGZhbHNlIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2Ygc3RyaWN0UmVxdWlyZXMgPT09ICdzdHJpbmcnIHx8IEFycmF5LmlzQXJyYXkoc3RyaWN0UmVxdWlyZXMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RyaWN0UmVxdWlyZXNGaWx0ZXI6IGNyZWF0ZUZpbHRlciQxKHN0cmljdFJlcXVpcmVzKSxcbiAgICAgICAgICBkZXRlY3RDeWNsZXNBbmRDb25kaXRpb25hbDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB2YWx1ZSBmb3IgXCJzdHJpY3RSZXF1aXJlc1wiIG9wdGlvbi4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlRW50cnlQb2ludChkaXJQYXRoKSB7XG4gIGxldCBlbnRyeVBvaW50ID0gJ2luZGV4LmpzJztcblxuICB0cnkge1xuICAgIGlmIChleGlzdHNTeW5jKGpvaW4kMShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICBlbnRyeVBvaW50ID1cbiAgICAgICAgSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoam9pbiQxKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pKS5tYWluIHx8XG4gICAgICAgIGVudHJ5UG9pbnQ7XG4gICAgfVxuICB9IGNhdGNoIChpZ25vcmVkKSB7XG4gICAgLy8gaWdub3JlZFxuICB9XG5cbiAgcmV0dXJuIGVudHJ5UG9pbnQ7XG59XG5cbmZ1bmN0aW9uIGlzRGlyZWN0b3J5KHBhdGgpIHtcbiAgdHJ5IHtcbiAgICBpZiAoc3RhdFN5bmMkMShwYXRoKS5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoaWdub3JlZCkge1xuICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RHluYW1pY1JlcXVpcmVNb2R1bGVzKHBhdHRlcm5zLCBkeW5hbWljUmVxdWlyZVJvb3QpIHtcbiAgY29uc3QgZHluYW1pY1JlcXVpcmVNb2R1bGVzID0gbmV3IE1hcCgpO1xuICBjb25zdCBkaXJOYW1lcyA9IG5ldyBTZXQoKTtcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mICFwYXR0ZXJucyB8fCBBcnJheS5pc0FycmF5KHBhdHRlcm5zKSA/IHBhdHRlcm5zIHx8IFtdIDogW3BhdHRlcm5zXSkge1xuICAgIGNvbnN0IGlzTmVnYXRlZCA9IHBhdHRlcm4uc3RhcnRzV2l0aCgnIScpO1xuICAgIGNvbnN0IG1vZGlmeU1hcCA9ICh0YXJnZXRQYXRoLCByZXNvbHZlZFBhdGgpID0+XG4gICAgICBpc05lZ2F0ZWRcbiAgICAgICAgPyBkeW5hbWljUmVxdWlyZU1vZHVsZXMuZGVsZXRlKHRhcmdldFBhdGgpXG4gICAgICAgIDogZHluYW1pY1JlcXVpcmVNb2R1bGVzLnNldCh0YXJnZXRQYXRoLCByZXNvbHZlZFBhdGgpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBnbG9iLnN5bmMoaXNOZWdhdGVkID8gcGF0dGVybi5zdWJzdHIoMSkgOiBwYXR0ZXJuKSkge1xuICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZSQzKHBhdGgpO1xuICAgICAgY29uc3QgcmVxdWlyZVBhdGggPSBub3JtYWxpemVQYXRoU2xhc2hlcyhyZXNvbHZlZFBhdGgpO1xuICAgICAgaWYgKGlzRGlyZWN0b3J5KHJlc29sdmVkUGF0aCkpIHtcbiAgICAgICAgZGlyTmFtZXMuYWRkKHJlc29sdmVkUGF0aCk7XG4gICAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSByZXNvbHZlJDMoam9pbiQxKHJlc29sdmVkUGF0aCwgZ2V0UGFja2FnZUVudHJ5UG9pbnQocGF0aCkpKTtcbiAgICAgICAgbW9kaWZ5TWFwKHJlcXVpcmVQYXRoLCBtb2R1bGVQYXRoKTtcbiAgICAgICAgbW9kaWZ5TWFwKG5vcm1hbGl6ZVBhdGhTbGFzaGVzKG1vZHVsZVBhdGgpLCBtb2R1bGVQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpck5hbWVzLmFkZChkaXJuYW1lJDEocmVzb2x2ZWRQYXRoKSk7XG4gICAgICAgIG1vZGlmeU1hcChyZXF1aXJlUGF0aCwgcmVzb2x2ZWRQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb21tb25EaXI6IGRpck5hbWVzLnNpemUgPyBjb21tb25kaXIoWy4uLmRpck5hbWVzLCBkeW5hbWljUmVxdWlyZVJvb3RdKSA6IG51bGwsXG4gICAgZHluYW1pY1JlcXVpcmVNb2R1bGVzXG4gIH07XG59XG5cbmNvbnN0IEZBSUxFRF9SRVFVSVJFX0VSUk9SID0gYHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGR5bmFtaWNhbGx5IHJlcXVpcmUgXCInICsgcGF0aCArICdcIi4gUGxlYXNlIGNvbmZpZ3VyZSB0aGUgZHluYW1pY1JlcXVpcmVUYXJnZXRzIG9yL2FuZCBpZ25vcmVEeW5hbWljUmVxdWlyZXMgb3B0aW9uIG9mIEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgcmVxdWlyZSBjYWxsIHRvIHdvcmsuJyk7YDtcblxuY29uc3QgQ09NTU9OSlNfUkVRVUlSRV9FWFBPUlQgPSAnY29tbW9uanNSZXF1aXJlJztcbmNvbnN0IENSRUFURV9DT01NT05KU19SRVFVSVJFX0VYUE9SVCA9ICdjcmVhdGVDb21tb25qc1JlcXVpcmUnO1xuXG5mdW5jdGlvbiBnZXREeW5hbWljTW9kdWxlUmVnaXN0cnkoXG4gIGlzRHluYW1pY1JlcXVpcmVNb2R1bGVzRW5hYmxlZCxcbiAgZHluYW1pY1JlcXVpcmVNb2R1bGVzLFxuICBjb21tb25EaXIsXG4gIGlnbm9yZUR5bmFtaWNSZXF1aXJlc1xuKSB7XG4gIGlmICghaXNEeW5hbWljUmVxdWlyZU1vZHVsZXNFbmFibGVkKSB7XG4gICAgcmV0dXJuIGBleHBvcnQgZnVuY3Rpb24gJHtDT01NT05KU19SRVFVSVJFX0VYUE9SVH0ocGF0aCkge1xuXHQke0ZBSUxFRF9SRVFVSVJFX0VSUk9SfVxufWA7XG4gIH1cbiAgY29uc3QgZHluYW1pY01vZHVsZUltcG9ydHMgPSBbLi4uZHluYW1pY1JlcXVpcmVNb2R1bGVzLnZhbHVlcygpXVxuICAgIC5tYXAoXG4gICAgICAoaWQsIGluZGV4KSA9PlxuICAgICAgICBgaW1wb3J0ICR7XG4gICAgICAgICAgaWQuZW5kc1dpdGgoJy5qc29uJykgPyBganNvbiR7aW5kZXh9YCA6IGB7IF9fcmVxdWlyZSBhcyByZXF1aXJlJHtpbmRleH0gfWBcbiAgICAgICAgfSBmcm9tICR7SlNPTi5zdHJpbmdpZnkoaWQpfTtgXG4gICAgKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgY29uc3QgZHluYW1pY01vZHVsZVByb3BzID0gWy4uLmR5bmFtaWNSZXF1aXJlTW9kdWxlcy5rZXlzKCldXG4gICAgLm1hcChcbiAgICAgIChpZCwgaW5kZXgpID0+XG4gICAgICAgIGBcXHRcXHQke0pTT04uc3RyaW5naWZ5KGdldFZpcnR1YWxQYXRoRm9yRHluYW1pY1JlcXVpcmVQYXRoKGlkLCBjb21tb25EaXIpKX06ICR7XG4gICAgICAgICAgaWQuZW5kc1dpdGgoJy5qc29uJykgPyBgZnVuY3Rpb24gKCkgeyByZXR1cm4ganNvbiR7aW5kZXh9OyB9YCA6IGByZXF1aXJlJHtpbmRleH1gXG4gICAgICAgIH1gXG4gICAgKVxuICAgIC5qb2luKCcsXFxuJyk7XG4gIHJldHVybiBgJHtkeW5hbWljTW9kdWxlSW1wb3J0c31cblxudmFyIGR5bmFtaWNNb2R1bGVzO1xuXG5mdW5jdGlvbiBnZXREeW5hbWljTW9kdWxlcygpIHtcblx0cmV0dXJuIGR5bmFtaWNNb2R1bGVzIHx8IChkeW5hbWljTW9kdWxlcyA9IHtcbiR7ZHluYW1pY01vZHVsZVByb3BzfVxuXHR9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uICR7Q1JFQVRFX0NPTU1PTkpTX1JFUVVJUkVfRVhQT1JUfShvcmlnaW5hbE1vZHVsZURpcikge1xuXHRmdW5jdGlvbiBoYW5kbGVSZXF1aXJlKHBhdGgpIHtcblx0XHR2YXIgcmVzb2x2ZWRQYXRoID0gY29tbW9uanNSZXNvbHZlKHBhdGgsIG9yaWdpbmFsTW9kdWxlRGlyKTtcblx0XHRpZiAocmVzb2x2ZWRQYXRoICE9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZ2V0RHluYW1pY01vZHVsZXMoKVtyZXNvbHZlZFBhdGhdKCk7XG5cdFx0fVxuXHRcdCR7aWdub3JlRHluYW1pY1JlcXVpcmVzID8gJ3JldHVybiByZXF1aXJlKHBhdGgpOycgOiBGQUlMRURfUkVRVUlSRV9FUlJPUn1cblx0fVxuXHRoYW5kbGVSZXF1aXJlLnJlc29sdmUgPSBmdW5jdGlvbiAocGF0aCkge1xuXHRcdHZhciByZXNvbHZlZFBhdGggPSBjb21tb25qc1Jlc29sdmUocGF0aCwgb3JpZ2luYWxNb2R1bGVEaXIpO1xuXHRcdGlmIChyZXNvbHZlZFBhdGggIT09IG51bGwpIHtcblx0XHRcdHJldHVybiByZXNvbHZlZFBhdGg7XG5cdFx0fVxuXHRcdHJldHVybiByZXF1aXJlLnJlc29sdmUocGF0aCk7XG5cdH1cblx0cmV0dXJuIGhhbmRsZVJlcXVpcmU7XG59XG5cbmZ1bmN0aW9uIGNvbW1vbmpzUmVzb2x2ZSAocGF0aCwgb3JpZ2luYWxNb2R1bGVEaXIpIHtcblx0dmFyIHNob3VsZFRyeU5vZGVNb2R1bGVzID0gaXNQb3NzaWJsZU5vZGVNb2R1bGVzUGF0aChwYXRoKTtcblx0cGF0aCA9IG5vcm1hbGl6ZShwYXRoKTtcblx0dmFyIHJlbFBhdGg7XG5cdGlmIChwYXRoWzBdID09PSAnLycpIHtcblx0XHRvcmlnaW5hbE1vZHVsZURpciA9ICcnO1xuXHR9XG5cdHZhciBtb2R1bGVzID0gZ2V0RHluYW1pY01vZHVsZXMoKTtcblx0dmFyIGNoZWNrZWRFeHRlbnNpb25zID0gWycnLCAnLmpzJywgJy5qc29uJ107XG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0aWYgKCFzaG91bGRUcnlOb2RlTW9kdWxlcykge1xuXHRcdFx0cmVsUGF0aCA9IG5vcm1hbGl6ZShvcmlnaW5hbE1vZHVsZURpciArICcvJyArIHBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWxQYXRoID0gbm9ybWFsaXplKG9yaWdpbmFsTW9kdWxlRGlyICsgJy9ub2RlX21vZHVsZXMvJyArIHBhdGgpO1xuXHRcdH1cblxuXHRcdGlmIChyZWxQYXRoLmVuZHNXaXRoKCcvLi4nKSkge1xuXHRcdFx0YnJlYWs7IC8vIFRyYXZlbGxlZCB0b28gZmFyIHVwLCBhdm9pZCBpbmZpbml0ZSBsb29wXG5cdFx0fVxuXG5cdFx0Zm9yICh2YXIgZXh0ZW5zaW9uSW5kZXggPSAwOyBleHRlbnNpb25JbmRleCA8IGNoZWNrZWRFeHRlbnNpb25zLmxlbmd0aDsgZXh0ZW5zaW9uSW5kZXgrKykge1xuXHRcdFx0dmFyIHJlc29sdmVkUGF0aCA9IHJlbFBhdGggKyBjaGVja2VkRXh0ZW5zaW9uc1tleHRlbnNpb25JbmRleF07XG5cdFx0XHRpZiAobW9kdWxlc1tyZXNvbHZlZFBhdGhdKSB7XG5cdFx0XHRcdHJldHVybiByZXNvbHZlZFBhdGg7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghc2hvdWxkVHJ5Tm9kZU1vZHVsZXMpIGJyZWFrO1xuXHRcdHZhciBuZXh0RGlyID0gbm9ybWFsaXplKG9yaWdpbmFsTW9kdWxlRGlyICsgJy8uLicpO1xuXHRcdGlmIChuZXh0RGlyID09PSBvcmlnaW5hbE1vZHVsZURpcikgYnJlYWs7XG5cdFx0b3JpZ2luYWxNb2R1bGVEaXIgPSBuZXh0RGlyO1xuXHR9XG5cdHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1Bvc3NpYmxlTm9kZU1vZHVsZXNQYXRoIChtb2R1bGVQYXRoKSB7XG5cdHZhciBjMCA9IG1vZHVsZVBhdGhbMF07XG5cdGlmIChjMCA9PT0gJy8nIHx8IGMwID09PSAnXFxcXFxcXFwnKSByZXR1cm4gZmFsc2U7XG5cdHZhciBjMSA9IG1vZHVsZVBhdGhbMV0sIGMyID0gbW9kdWxlUGF0aFsyXTtcblx0aWYgKChjMCA9PT0gJy4nICYmICghYzEgfHwgYzEgPT09ICcvJyB8fCBjMSA9PT0gJ1xcXFxcXFxcJykpIHx8XG5cdFx0KGMwID09PSAnLicgJiYgYzEgPT09ICcuJyAmJiAoIWMyIHx8IGMyID09PSAnLycgfHwgYzIgPT09ICdcXFxcXFxcXCcpKSkgcmV0dXJuIGZhbHNlO1xuXHRpZiAoYzEgPT09ICc6JyAmJiAoYzIgPT09ICcvJyB8fCBjMiA9PT0gJ1xcXFxcXFxcJykpIHJldHVybiBmYWxzZTtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZSAocGF0aCkge1xuXHRwYXRoID0gcGF0aC5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnLycpO1xuXHR2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcvJyk7XG5cdHZhciBzbGFzaGVkID0gcGFydHNbMF0gPT09ICcnO1xuXHRmb3IgKHZhciBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHBhcnRzW2ldID09PSAnLicgfHwgcGFydHNbaV0gPT09ICcnKSB7XG5cdFx0XHRwYXJ0cy5zcGxpY2UoaS0tLCAxKTtcblx0XHR9XG5cdH1cblx0Zm9yICh2YXIgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChwYXJ0c1tpXSAhPT0gJy4uJykgY29udGludWU7XG5cdFx0aWYgKGkgPiAwICYmIHBhcnRzW2kgLSAxXSAhPT0gJy4uJyAmJiBwYXJ0c1tpIC0gMV0gIT09ICcuJykge1xuXHRcdFx0cGFydHMuc3BsaWNlKC0taSwgMik7XG5cdFx0XHRpLS07XG5cdFx0fVxuXHR9XG5cdHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cdGlmIChzbGFzaGVkICYmIHBhdGhbMF0gIT09ICcvJykgcGF0aCA9ICcvJyArIHBhdGg7XG5cdGVsc2UgaWYgKHBhdGgubGVuZ3RoID09PSAwKSBwYXRoID0gJy4nO1xuXHRyZXR1cm4gcGF0aDtcbn1gO1xufVxuXG5jb25zdCBpc1dyYXBwZWRJZCA9IChpZCwgc3VmZml4KSA9PiBpZC5lbmRzV2l0aChzdWZmaXgpO1xuY29uc3Qgd3JhcElkJDEgPSAoaWQsIHN1ZmZpeCkgPT4gYFxcMCR7aWR9JHtzdWZmaXh9YDtcbmNvbnN0IHVud3JhcElkJDEgPSAod3JhcHBlZElkLCBzdWZmaXgpID0+IHdyYXBwZWRJZC5zbGljZSgxLCAtc3VmZml4Lmxlbmd0aCk7XG5cbmNvbnN0IFBST1hZX1NVRkZJWCA9ICc/Y29tbW9uanMtcHJveHknO1xuY29uc3QgV1JBUFBFRF9TVUZGSVggPSAnP2NvbW1vbmpzLXdyYXBwZWQnO1xuY29uc3QgRVhURVJOQUxfU1VGRklYID0gJz9jb21tb25qcy1leHRlcm5hbCc7XG5jb25zdCBFWFBPUlRTX1NVRkZJWCA9ICc/Y29tbW9uanMtZXhwb3J0cyc7XG5jb25zdCBNT0RVTEVfU1VGRklYID0gJz9jb21tb25qcy1tb2R1bGUnO1xuY29uc3QgRU5UUllfU1VGRklYID0gJz9jb21tb25qcy1lbnRyeSc7XG5jb25zdCBFU19JTVBPUlRfU1VGRklYID0gJz9jb21tb25qcy1lcy1pbXBvcnQnO1xuXG5jb25zdCBEWU5BTUlDX01PRFVMRVNfSUQgPSAnXFwwY29tbW9uanMtZHluYW1pYy1tb2R1bGVzJztcbmNvbnN0IEhFTFBFUlNfSUQgPSAnXFwwY29tbW9uanNIZWxwZXJzLmpzJztcblxuY29uc3QgSVNfV1JBUFBFRF9DT01NT05KUyA9ICd3aXRoUmVxdWlyZUZ1bmN0aW9uJztcblxuLy8gYHhbJ2RlZmF1bHQnXWAgaXMgdXNlZCBpbnN0ZWFkIG9mIGB4LmRlZmF1bHRgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggRVMzIGJyb3dzZXJzLlxuLy8gTWluaWZpZXJzIGxpa2UgdWdsaWZ5IHdpbGwgdXN1YWxseSB0cmFuc3BpbGUgaXQgYmFjayBpZiBjb21wYXRpYmlsaXR5IHdpdGggRVMzIGlzIG5vdCBlbmFibGVkLlxuLy8gVGhpcyBjb3VsZCBiZSBpbXByb3ZlZCBieSBpbnNwZWN0aW5nIFJvbGx1cCdzIFwiZ2VuZXJhdGVkQ29kZVwiIG9wdGlvblxuXG5jb25zdCBIRUxQRVJTID0gYFxuZXhwb3J0IHZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tTmFtZXNwYWNlSWZQcmVzZW50IChuKSB7XG5cdHJldHVybiBuICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCAnZGVmYXVsdCcpID8gblsnZGVmYXVsdCddIDogbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tTmFtZXNwYWNlSWZOb3ROYW1lZCAobikge1xuXHRyZXR1cm4gbiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobiwgJ2RlZmF1bHQnKSAmJiBPYmplY3Qua2V5cyhuKS5sZW5ndGggPT09IDEgPyBuWydkZWZhdWx0J10gOiBuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXVnbWVudGVkTmFtZXNwYWNlKG4pIHtcbiAgaWYgKG4uX19lc01vZHVsZSkgcmV0dXJuIG47XG4gIHZhciBmID0gbi5kZWZhdWx0O1xuXHRpZiAodHlwZW9mIGYgPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0dmFyIGEgPSBmdW5jdGlvbiBhICgpIHtcblx0XHRcdGlmICh0aGlzIGluc3RhbmNlb2YgYSkge1xuXHRcdFx0XHR2YXIgYXJncyA9IFtudWxsXTtcblx0XHRcdFx0YXJncy5wdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdHZhciBDdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShmLCBhcmdzKTtcblx0XHRcdFx0cmV0dXJuIG5ldyBDdG9yKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdH07XG5cdFx0YS5wcm90b3R5cGUgPSBmLnByb3RvdHlwZTtcbiAgfSBlbHNlIGEgPSB7fTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsICdfX2VzTW9kdWxlJywge3ZhbHVlOiB0cnVlfSk7XG5cdE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24gKGspIHtcblx0XHR2YXIgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobiwgayk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIGssIGQuZ2V0ID8gZCA6IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIG5ba107XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xuXHRyZXR1cm4gYTtcbn1cbmA7XG5cbmZ1bmN0aW9uIGdldEhlbHBlcnNNb2R1bGUoKSB7XG4gIHJldHVybiBIRUxQRVJTO1xufVxuXG5mdW5jdGlvbiBnZXRVbmtub3duUmVxdWlyZVByb3h5KGlkLCByZXF1aXJlUmV0dXJuc0RlZmF1bHQpIHtcbiAgaWYgKHJlcXVpcmVSZXR1cm5zRGVmYXVsdCA9PT0gdHJ1ZSB8fCBpZC5lbmRzV2l0aCgnLmpzb24nKSkge1xuICAgIHJldHVybiBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJHtKU09OLnN0cmluZ2lmeShpZCl9O2A7XG4gIH1cbiAgY29uc3QgbmFtZSA9IGdldE5hbWUoaWQpO1xuICBjb25zdCBleHBvcnRlZCA9XG4gICAgcmVxdWlyZVJldHVybnNEZWZhdWx0ID09PSAnYXV0bydcbiAgICAgID8gYGltcG9ydCB7IGdldERlZmF1bHRFeHBvcnRGcm9tTmFtZXNwYWNlSWZOb3ROYW1lZCB9IGZyb20gXCIke0hFTFBFUlNfSUR9XCI7IGV4cG9ydCBkZWZhdWx0IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbU5hbWVzcGFjZUlmTm90TmFtZWQoJHtuYW1lfSk7YFxuICAgICAgOiByZXF1aXJlUmV0dXJuc0RlZmF1bHQgPT09ICdwcmVmZXJyZWQnXG4gICAgICA/IGBpbXBvcnQgeyBnZXREZWZhdWx0RXhwb3J0RnJvbU5hbWVzcGFjZUlmUHJlc2VudCB9IGZyb20gXCIke0hFTFBFUlNfSUR9XCI7IGV4cG9ydCBkZWZhdWx0IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbU5hbWVzcGFjZUlmUHJlc2VudCgke25hbWV9KTtgXG4gICAgICA6ICFyZXF1aXJlUmV0dXJuc0RlZmF1bHRcbiAgICAgID8gYGltcG9ydCB7IGdldEF1Z21lbnRlZE5hbWVzcGFjZSB9IGZyb20gXCIke0hFTFBFUlNfSUR9XCI7IGV4cG9ydCBkZWZhdWx0IC8qQF9fUFVSRV9fKi9nZXRBdWdtZW50ZWROYW1lc3BhY2UoJHtuYW1lfSk7YFxuICAgICAgOiBgZXhwb3J0IGRlZmF1bHQgJHtuYW1lfTtgO1xuICByZXR1cm4gYGltcG9ydCAqIGFzICR7bmFtZX0gZnJvbSAke0pTT04uc3RyaW5naWZ5KGlkKX07ICR7ZXhwb3J0ZWR9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0U3RhdGljUmVxdWlyZVByb3h5KGlkLCByZXF1aXJlUmV0dXJuc0RlZmF1bHQsIGxvYWRNb2R1bGUpIHtcbiAgY29uc3QgbmFtZSA9IGdldE5hbWUoaWQpO1xuICBjb25zdCB7XG4gICAgbWV0YTogeyBjb21tb25qczogY29tbW9uanNNZXRhIH1cbiAgfSA9IGF3YWl0IGxvYWRNb2R1bGUoeyBpZCB9KTtcbiAgaWYgKCFjb21tb25qc01ldGEpIHtcbiAgICByZXR1cm4gZ2V0VW5rbm93blJlcXVpcmVQcm94eShpZCwgcmVxdWlyZVJldHVybnNEZWZhdWx0KTtcbiAgfSBlbHNlIGlmIChjb21tb25qc01ldGEuaXNDb21tb25KUykge1xuICAgIHJldHVybiBgZXhwb3J0IHsgX19tb2R1bGVFeHBvcnRzIGFzIGRlZmF1bHQgfSBmcm9tICR7SlNPTi5zdHJpbmdpZnkoaWQpfTtgO1xuICB9IGVsc2UgaWYgKCFyZXF1aXJlUmV0dXJuc0RlZmF1bHQpIHtcbiAgICByZXR1cm4gYGltcG9ydCB7IGdldEF1Z21lbnRlZE5hbWVzcGFjZSB9IGZyb20gXCIke0hFTFBFUlNfSUR9XCI7IGltcG9ydCAqIGFzICR7bmFtZX0gZnJvbSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgaWRcbiAgICApfTsgZXhwb3J0IGRlZmF1bHQgLypAX19QVVJFX18qL2dldEF1Z21lbnRlZE5hbWVzcGFjZSgke25hbWV9KTtgO1xuICB9IGVsc2UgaWYgKFxuICAgIHJlcXVpcmVSZXR1cm5zRGVmYXVsdCAhPT0gdHJ1ZSAmJlxuICAgIChyZXF1aXJlUmV0dXJuc0RlZmF1bHQgPT09ICduYW1lc3BhY2UnIHx8XG4gICAgICAhY29tbW9uanNNZXRhLmhhc0RlZmF1bHRFeHBvcnQgfHxcbiAgICAgIChyZXF1aXJlUmV0dXJuc0RlZmF1bHQgPT09ICdhdXRvJyAmJiBjb21tb25qc01ldGEuaGFzTmFtZWRFeHBvcnRzKSlcbiAgKSB7XG4gICAgcmV0dXJuIGBpbXBvcnQgKiBhcyAke25hbWV9IGZyb20gJHtKU09OLnN0cmluZ2lmeShpZCl9OyBleHBvcnQgZGVmYXVsdCAke25hbWV9O2A7XG4gIH1cbiAgcmV0dXJuIGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAke0pTT04uc3RyaW5naWZ5KGlkKX07YDtcbn1cblxuZnVuY3Rpb24gZ2V0RW50cnlQcm94eShpZCwgZGVmYXVsdElzTW9kdWxlRXhwb3J0cywgZ2V0TW9kdWxlSW5mbykge1xuICBjb25zdCB7XG4gICAgbWV0YTogeyBjb21tb25qczogY29tbW9uanNNZXRhIH0sXG4gICAgaGFzRGVmYXVsdEV4cG9ydFxuICB9ID0gZ2V0TW9kdWxlSW5mbyhpZCk7XG4gIGlmICghY29tbW9uanNNZXRhIHx8IGNvbW1vbmpzTWV0YS5pc0NvbW1vbkpTICE9PSBJU19XUkFQUEVEX0NPTU1PTkpTKSB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWRJZCA9IEpTT04uc3RyaW5naWZ5KGlkKTtcbiAgICBsZXQgY29kZSA9IGBleHBvcnQgKiBmcm9tICR7c3RyaW5naWZpZWRJZH07YDtcbiAgICBpZiAoaGFzRGVmYXVsdEV4cG9ydCkge1xuICAgICAgY29kZSArPSBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJHtzdHJpbmdpZmllZElkfTtgO1xuICAgIH1cbiAgICByZXR1cm4gY29kZTtcbiAgfVxuICByZXR1cm4gZ2V0RXNJbXBvcnRQcm94eShpZCwgZGVmYXVsdElzTW9kdWxlRXhwb3J0cyk7XG59XG5cbmZ1bmN0aW9uIGdldEVzSW1wb3J0UHJveHkoaWQsIGRlZmF1bHRJc01vZHVsZUV4cG9ydHMpIHtcbiAgY29uc3QgbmFtZSA9IGdldE5hbWUoaWQpO1xuICBjb25zdCBleHBvcnRzTmFtZSA9IGAke25hbWV9RXhwb3J0c2A7XG4gIGNvbnN0IHJlcXVpcmVNb2R1bGUgPSBgcmVxdWlyZSR7Y2FwaXRhbGl6ZShuYW1lKX1gO1xuICBsZXQgY29kZSA9XG4gICAgYGltcG9ydCB7IGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzIH0gZnJvbSBcIiR7SEVMUEVSU19JRH1cIjtcXG5gICtcbiAgICBgaW1wb3J0IHsgX19yZXF1aXJlIGFzICR7cmVxdWlyZU1vZHVsZX0gfSBmcm9tICR7SlNPTi5zdHJpbmdpZnkoaWQpfTtcXG5gICtcbiAgICBgdmFyICR7ZXhwb3J0c05hbWV9ID0gJHtyZXF1aXJlTW9kdWxlfSgpO1xcbmAgK1xuICAgIGBleHBvcnQgeyAke2V4cG9ydHNOYW1lfSBhcyBfX21vZHVsZUV4cG9ydHMgfTtgO1xuICBpZiAoZGVmYXVsdElzTW9kdWxlRXhwb3J0cyA9PT0gdHJ1ZSkge1xuICAgIGNvZGUgKz0gYFxcbmV4cG9ydCB7ICR7ZXhwb3J0c05hbWV9IGFzIGRlZmF1bHQgfTtgO1xuICB9IGVsc2Uge1xuICAgIGNvZGUgKz0gYGV4cG9ydCBkZWZhdWx0IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcygke2V4cG9ydHNOYW1lfSk7YDtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNvZGUsXG4gICAgc3ludGhldGljTmFtZWRFeHBvcnRzOiAnX19tb2R1bGVFeHBvcnRzJ1xuICB9O1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiwgbm8tdW5kZWZpbmVkICovXG5cbmZ1bmN0aW9uIGdldENhbmRpZGF0ZXNGb3JFeHRlbnNpb24ocmVzb2x2ZWQsIGV4dGVuc2lvbikge1xuICByZXR1cm4gW3Jlc29sdmVkICsgZXh0ZW5zaW9uLCBgJHtyZXNvbHZlZH0ke3NlcH1pbmRleCR7ZXh0ZW5zaW9ufWBdO1xufVxuXG5mdW5jdGlvbiBnZXRDYW5kaWRhdGVzKHJlc29sdmVkLCBleHRlbnNpb25zKSB7XG4gIHJldHVybiBleHRlbnNpb25zLnJlZHVjZShcbiAgICAocGF0aHMsIGV4dGVuc2lvbikgPT4gcGF0aHMuY29uY2F0KGdldENhbmRpZGF0ZXNGb3JFeHRlbnNpb24ocmVzb2x2ZWQsIGV4dGVuc2lvbikpLFxuICAgIFtyZXNvbHZlZF1cbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUV4dGVuc2lvbnMoaW1wb3J0ZWUsIGltcG9ydGVyLCBleHRlbnNpb25zKSB7XG4gIC8vIG5vdCBvdXIgcHJvYmxlbVxuICBpZiAoaW1wb3J0ZWVbMF0gIT09ICcuJyB8fCAhaW1wb3J0ZXIpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlJDMoZGlybmFtZSQxKGltcG9ydGVyKSwgaW1wb3J0ZWUpO1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0Q2FuZGlkYXRlcyhyZXNvbHZlZCwgZXh0ZW5zaW9ucyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYW5kaWRhdGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gc3RhdFN5bmMkMShjYW5kaWRhdGVzW2ldKTtcbiAgICAgIGlmIChzdGF0cy5pc0ZpbGUoKSkgcmV0dXJuIHsgaWQ6IGNhbmRpZGF0ZXNbaV0gfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIG5vb3AgKi9cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRSZXNvbHZlSWQoZXh0ZW5zaW9ucywgaXNQb3NzaWJsZUNqc0lkKSB7XG4gIGNvbnN0IGN1cnJlbnRseVJlc29sdmluZyA9IG5ldyBNYXAoKTtcblxuICByZXR1cm4ge1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSBNYXBzIG9mIGltcG9ydGVycyB0byBTZXRzIG9mIHJlcXVpcmUgc291cmNlcyBiZWluZyByZXNvbHZlZCBhdFxuICAgICAqIHRoZSBtb21lbnQgYnkgcmVzb2x2ZVJlcXVpcmVTb3VyY2VzQW5kVXBkYXRlTWV0YVxuICAgICAqL1xuICAgIGN1cnJlbnRseVJlc29sdmluZyxcbiAgICBhc3luYyByZXNvbHZlSWQoaW1wb3J0ZWUsIGltcG9ydGVyLCByZXNvbHZlT3B0aW9ucykge1xuICAgICAgY29uc3QgY3VzdG9tT3B0aW9ucyA9IHJlc29sdmVPcHRpb25zLmN1c3RvbTtcbiAgICAgIC8vIEFsbCBsb2dpYyBiZWxvdyBpcyBzcGVjaWZpYyB0byBFUyBpbXBvcnRzLlxuICAgICAgLy8gQWxzbywgaWYgd2UgZG8gbm90IHNraXAgdGhpcyBsb2dpYyBmb3IgcmVxdWlyZXMgdGhhdCBhcmUgcmVzb2x2ZWQgd2hpbGVcbiAgICAgIC8vIHRyYW5zZm9ybWluZyBhIGNvbW1vbmpzIGZpbGUsIGl0IGNhbiBlYXNpbHkgbGVhZCB0byBkZWFkbG9ja3MuXG4gICAgICBpZiAoXG4gICAgICAgIGN1c3RvbU9wdGlvbnMgJiZcbiAgICAgICAgY3VzdG9tT3B0aW9uc1snbm9kZS1yZXNvbHZlJ10gJiZcbiAgICAgICAgY3VzdG9tT3B0aW9uc1snbm9kZS1yZXNvbHZlJ10uaXNSZXF1aXJlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50bHlSZXNvbHZpbmdGb3JQYXJlbnQgPSBjdXJyZW50bHlSZXNvbHZpbmcuZ2V0KGltcG9ydGVyKTtcbiAgICAgIGlmIChjdXJyZW50bHlSZXNvbHZpbmdGb3JQYXJlbnQgJiYgY3VycmVudGx5UmVzb2x2aW5nRm9yUGFyZW50LmhhcyhpbXBvcnRlZSkpIHtcbiAgICAgICAgdGhpcy53YXJuKHtcbiAgICAgICAgICBjb2RlOiAnVEhJU19SRVNPTFZFX1dJVEhPVVRfT1BUSU9OUycsXG4gICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICdJdCBhcHBlYXJzIGEgcGx1Z2luIGhhcyBpbXBsZW1lbnRlZCBhIFwicmVzb2x2ZUlkXCIgaG9vayB0aGF0IHVzZXMgXCJ0aGlzLnJlc29sdmVcIiB3aXRob3V0IGZvcndhcmRpbmcgdGhlIHRoaXJkIFwib3B0aW9uc1wiIHBhcmFtZXRlciBvZiBcInJlc29sdmVJZFwiLiBUaGlzIGlzIHByb2JsZW1hdGljIGFzIGl0IGNhbiBsZWFkIHRvIHdyb25nIG1vZHVsZSByZXNvbHV0aW9ucyBlc3BlY2lhbGx5IGZvciB0aGUgbm9kZS1yZXNvbHZlIHBsdWdpbiBhbmQgaW4gY2VydGFpbiBjYXNlcyBjYXVzZSBlYXJseSBleGl0IGVycm9ycyBmb3IgdGhlIGNvbW1vbmpzIHBsdWdpbi5cXG5JbiByYXJlIGNhc2VzLCB0aGlzIHdhcm5pbmcgY2FuIGFwcGVhciBpZiB0aGUgc2FtZSBmaWxlIGlzIGJvdGggaW1wb3J0ZWQgYW5kIHJlcXVpcmVkIGZyb20gdGhlIHNhbWUgbWl4ZWQgRVMvQ29tbW9uSlMgbW9kdWxlLCBpbiB3aGljaCBjYXNlIGl0IGNhbiBiZSBpZ25vcmVkLicsXG4gICAgICAgICAgdXJsOiAnaHR0cHM6Ly9yb2xsdXBqcy5vcmcvZ3VpZGUvZW4vI3Jlc29sdmVpZCdcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNXcmFwcGVkSWQoaW1wb3J0ZWUsIFdSQVBQRURfU1VGRklYKSkge1xuICAgICAgICByZXR1cm4gdW53cmFwSWQkMShpbXBvcnRlZSwgV1JBUFBFRF9TVUZGSVgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGltcG9ydGVlLmVuZHNXaXRoKEVOVFJZX1NVRkZJWCkgfHxcbiAgICAgICAgaXNXcmFwcGVkSWQoaW1wb3J0ZWUsIE1PRFVMRV9TVUZGSVgpIHx8XG4gICAgICAgIGlzV3JhcHBlZElkKGltcG9ydGVlLCBFWFBPUlRTX1NVRkZJWCkgfHxcbiAgICAgICAgaXNXcmFwcGVkSWQoaW1wb3J0ZWUsIFBST1hZX1NVRkZJWCkgfHxcbiAgICAgICAgaXNXcmFwcGVkSWQoaW1wb3J0ZWUsIEVTX0lNUE9SVF9TVUZGSVgpIHx8XG4gICAgICAgIGlzV3JhcHBlZElkKGltcG9ydGVlLCBFWFRFUk5BTF9TVUZGSVgpIHx8XG4gICAgICAgIGltcG9ydGVlLnN0YXJ0c1dpdGgoSEVMUEVSU19JRCkgfHxcbiAgICAgICAgaW1wb3J0ZWUgPT09IERZTkFNSUNfTU9EVUxFU19JRFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBpbXBvcnRlZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGltcG9ydGVyKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbXBvcnRlciA9PT0gRFlOQU1JQ19NT0RVTEVTX0lEIHx8XG4gICAgICAgICAgLy8gUHJveGllcyBhcmUgb25seSBpbXBvcnRpbmcgcmVzb2x2ZWQgaWRzLCBubyBuZWVkIHRvIHJlc29sdmUgYWdhaW5cbiAgICAgICAgICBpc1dyYXBwZWRJZChpbXBvcnRlciwgUFJPWFlfU1VGRklYKSB8fFxuICAgICAgICAgIGlzV3JhcHBlZElkKGltcG9ydGVyLCBFU19JTVBPUlRfU1VGRklYKSB8fFxuICAgICAgICAgIGltcG9ydGVyLmVuZHNXaXRoKEVOVFJZX1NVRkZJWClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGltcG9ydGVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1dyYXBwZWRJZChpbXBvcnRlciwgRVhURVJOQUxfU1VGRklYKSkge1xuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmV0dXJuIG51bGwgZm9yIHVucmVzb2x2ZWQgaW1wb3J0cyBzbyB0aGF0IHRoZSBwcm9wZXIgd2FybmluZyBpcyBzaG93blxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICEoYXdhaXQgdGhpcy5yZXNvbHZlKFxuICAgICAgICAgICAgICBpbXBvcnRlZSxcbiAgICAgICAgICAgICAgaW1wb3J0ZXIsXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oeyBza2lwU2VsZjogdHJ1ZSB9LCByZXNvbHZlT3B0aW9ucylcbiAgICAgICAgICAgICkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRm9yIG90aGVyIGV4dGVybmFsIGltcG9ydHMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGhhbmRsZWQgYXMgZXh0ZXJuYWxcbiAgICAgICAgICByZXR1cm4geyBpZDogaW1wb3J0ZWUsIGV4dGVybmFsOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGltcG9ydGVlLnN0YXJ0c1dpdGgoJ1xcMCcpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGlzIGlzIGFuIGVudHJ5IHBvaW50IG9yIEVTTSBpbXBvcnQsIHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgaW1wb3J0ZWUgaXMgd3JhcHBlZCBhbmRcbiAgICAgIC8vIGlmIHRoYXQgaXMgdGhlIGNhc2UsIHdlIG5lZWQgdG8gYWRkIGEgcHJveHkuXG4gICAgICBjb25zdCByZXNvbHZlZCA9XG4gICAgICAgIChhd2FpdCB0aGlzLnJlc29sdmUoXG4gICAgICAgICAgaW1wb3J0ZWUsXG4gICAgICAgICAgaW1wb3J0ZXIsXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih7IHNraXBTZWxmOiB0cnVlIH0sIHJlc29sdmVPcHRpb25zKVxuICAgICAgICApKSB8fCByZXNvbHZlRXh0ZW5zaW9ucyhpbXBvcnRlZSwgaW1wb3J0ZXIsIGV4dGVuc2lvbnMpO1xuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgZXZlbiBpZiBvdGhlciBwbHVnaW5zIHJlc29sdmUgYWdhaW4sIHdlIGlnbm9yZSBvdXIgb3duIHByb3hpZXNcbiAgICAgIGlmIChcbiAgICAgICAgIXJlc29sdmVkIHx8XG4gICAgICAgIHJlc29sdmVkLmV4dGVybmFsIHx8XG4gICAgICAgIHJlc29sdmVkLmlkLmVuZHNXaXRoKEVOVFJZX1NVRkZJWCkgfHxcbiAgICAgICAgaXNXcmFwcGVkSWQocmVzb2x2ZWQuaWQsIEVTX0lNUE9SVF9TVUZGSVgpIHx8XG4gICAgICAgICFpc1Bvc3NpYmxlQ2pzSWQocmVzb2x2ZWQuaWQpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgbW9kdWxlSW5mbyA9IGF3YWl0IHRoaXMubG9hZChyZXNvbHZlZCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1ldGE6IHsgY29tbW9uanM6IGNvbW1vbmpzTWV0YSB9XG4gICAgICB9ID0gbW9kdWxlSW5mbztcbiAgICAgIGlmIChjb21tb25qc01ldGEpIHtcbiAgICAgICAgY29uc3QgeyBpc0NvbW1vbkpTIH0gPSBjb21tb25qc01ldGE7XG4gICAgICAgIGlmIChpc0NvbW1vbkpTKSB7XG4gICAgICAgICAgaWYgKHJlc29sdmVPcHRpb25zLmlzRW50cnkpIHtcbiAgICAgICAgICAgIG1vZHVsZUluZm8ubW9kdWxlU2lkZUVmZmVjdHMgPSB0cnVlO1xuICAgICAgICAgICAgLy8gV2UgbXVzdCBub3QgcHJlY2VkZSBlbnRyeSBwcm94aWVzIHdpdGggYSBgXFwwYCBhcyB0aGF0IHdpbGwgbWVzcyB1cCByZWxhdGl2ZSBleHRlcm5hbCByZXNvbHV0aW9uXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQuaWQgKyBFTlRSWV9TVUZGSVg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0NvbW1vbkpTID09PSBJU19XUkFQUEVEX0NPTU1PTkpTKSB7XG4gICAgICAgICAgICByZXR1cm4geyBpZDogd3JhcElkJDEocmVzb2x2ZWQuaWQsIEVTX0lNUE9SVF9TVUZGSVgpLCBtZXRhOiB7IGNvbW1vbmpzOiB7IHJlc29sdmVkIH0gfSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVxdWlyZVJlc29sdmVyKGV4dGVuc2lvbnMsIGRldGVjdEN5Y2xlc0FuZENvbmRpdGlvbmFsLCBjdXJyZW50bHlSZXNvbHZpbmcpIHtcbiAgY29uc3Qga25vd25DanNNb2R1bGVUeXBlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGNvbnN0IHJlcXVpcmVkSWRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3QgdW5jb25kaXRpb25hbGx5UmVxdWlyZWRJZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBjb25zdCBnZXREZXBlbmRlbmNpZXMgPSAoaWQpID0+IGRlcGVuZGVuY2llc1tpZF0gfHwgKGRlcGVuZGVuY2llc1tpZF0gPSBuZXcgU2V0KCkpO1xuXG4gIGNvbnN0IGlzQ3ljbGljID0gKGlkKSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzVG9DaGVjayA9IG5ldyBTZXQoZ2V0RGVwZW5kZW5jaWVzKGlkKSk7XG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIGRlcGVuZGVuY2llc1RvQ2hlY2spIHtcbiAgICAgIGlmIChkZXBlbmRlbmN5ID09PSBpZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2hpbGREZXBlbmRlbmN5IG9mIGdldERlcGVuZGVuY2llcyhkZXBlbmRlbmN5KSkge1xuICAgICAgICBkZXBlbmRlbmNpZXNUb0NoZWNrLmFkZChjaGlsZERlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy8gT25jZSBhIG1vZHVsZSBpcyBsaXN0ZWQgaGVyZSwgaXRzIHR5cGUgKHdyYXBwZWQgb3Igbm90KSBpcyBmaXhlZCBhbmQgbWF5XG4gIC8vIG5vdCBjaGFuZ2UgZm9yIHRoZSByZXN0IG9mIHRoZSBjdXJyZW50IGJ1aWxkLCB0byBub3QgYnJlYWsgYWxyZWFkeVxuICAvLyB0cmFuc2Zvcm1lZCBtb2R1bGVzLlxuICBjb25zdCBmdWxseUFuYWx5emVkTW9kdWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgY29uc3QgZ2V0VHlwZUZvckZ1bGx5QW5hbHl6ZWRNb2R1bGUgPSAoaWQpID0+IHtcbiAgICBjb25zdCBrbm93blR5cGUgPSBrbm93bkNqc01vZHVsZVR5cGVzW2lkXTtcbiAgICBpZiAoa25vd25UeXBlICE9PSB0cnVlIHx8ICFkZXRlY3RDeWNsZXNBbmRDb25kaXRpb25hbCB8fCBmdWxseUFuYWx5emVkTW9kdWxlc1tpZF0pIHtcbiAgICAgIHJldHVybiBrbm93blR5cGU7XG4gICAgfVxuICAgIGlmIChpc0N5Y2xpYyhpZCkpIHtcbiAgICAgIHJldHVybiAoa25vd25DanNNb2R1bGVUeXBlc1tpZF0gPSBJU19XUkFQUEVEX0NPTU1PTkpTKTtcbiAgICB9XG4gICAgcmV0dXJuIGtub3duVHlwZTtcbiAgfTtcblxuICBjb25zdCBzZXRJbml0aWFsUGFyZW50VHlwZSA9IChpZCwgaW5pdGlhbENvbW1vbkpTVHlwZSkgPT4ge1xuICAgIC8vIEZ1bGx5IGFuYWx5emVkIG1vZHVsZXMgbWF5IG5ldmVyIGNoYW5nZSB0eXBlXG4gICAgaWYgKGZ1bGx5QW5hbHl6ZWRNb2R1bGVzW2lkXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBrbm93bkNqc01vZHVsZVR5cGVzW2lkXSA9IGluaXRpYWxDb21tb25KU1R5cGU7XG4gICAgaWYgKFxuICAgICAgZGV0ZWN0Q3ljbGVzQW5kQ29uZGl0aW9uYWwgJiZcbiAgICAgIGtub3duQ2pzTW9kdWxlVHlwZXNbaWRdID09PSB0cnVlICYmXG4gICAgICByZXF1aXJlZElkc1tpZF0gJiZcbiAgICAgICF1bmNvbmRpdGlvbmFsbHlSZXF1aXJlZElkc1tpZF1cbiAgICApIHtcbiAgICAgIGtub3duQ2pzTW9kdWxlVHlwZXNbaWRdID0gSVNfV1JBUFBFRF9DT01NT05KUztcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYW5hbHl6ZVJlcXVpcmVkTW9kdWxlID0gYXN5bmMgKHBhcmVudElkLCByZXNvbHZlZCwgaXNDb25kaXRpb25hbCwgbG9hZE1vZHVsZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkSWQgPSByZXNvbHZlZC5pZDtcbiAgICByZXF1aXJlZElkc1tjaGlsZElkXSA9IHRydWU7XG4gICAgaWYgKCEoaXNDb25kaXRpb25hbCB8fCBrbm93bkNqc01vZHVsZVR5cGVzW3BhcmVudElkXSA9PT0gSVNfV1JBUFBFRF9DT01NT05KUykpIHtcbiAgICAgIHVuY29uZGl0aW9uYWxseVJlcXVpcmVkSWRzW2NoaWxkSWRdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXREZXBlbmRlbmNpZXMocGFyZW50SWQpLmFkZChjaGlsZElkKTtcbiAgICBpZiAoIWlzQ3ljbGljKGNoaWxkSWQpKSB7XG4gICAgICAvLyBUaGlzIG1ha2VzIHN1cmUgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIGhhbmRsZXIgd2FpdHMgZm9yIGFsbCBkaXJlY3RcbiAgICAgIC8vIGRlcGVuZGVuY2llcyB0byBiZSBsb2FkZWQgYW5kIHRyYW5zZm9ybWVkIGFuZCB0aGVyZWZvcmUgZm9yIGFsbFxuICAgICAgLy8gdHJhbnNpdGl2ZSBDb21tb25KUyBkZXBlbmRlbmNpZXMgdG8gYmUgbG9hZGVkIGFzIHdlbGwgc28gdGhhdCBhbGxcbiAgICAgIC8vIGN5Y2xlcyBoYXZlIGJlZW4gZm91bmQgYW5kIGtub3duQ2pzTW9kdWxlVHlwZXMgaXMgcmVsaWFibGUuXG4gICAgICBhd2FpdCBsb2FkTW9kdWxlKHJlc29sdmVkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0VHlwZUZvckltcG9ydGVkTW9kdWxlID0gYXN5bmMgKHJlc29sdmVkLCBsb2FkTW9kdWxlKSA9PiB7XG4gICAgaWYgKHJlc29sdmVkLmlkIGluIGtub3duQ2pzTW9kdWxlVHlwZXMpIHtcbiAgICAgIC8vIFRoaXMgaGFuZGxlcyBjeWNsaWMgRVMgZGVwZW5kZW5jaWVzXG4gICAgICByZXR1cm4ga25vd25DanNNb2R1bGVUeXBlc1tyZXNvbHZlZC5pZF07XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIG1ldGE6IHsgY29tbW9uanMgfVxuICAgIH0gPSBhd2FpdCBsb2FkTW9kdWxlKHJlc29sdmVkKTtcbiAgICByZXR1cm4gKGNvbW1vbmpzICYmIGNvbW1vbmpzLmlzQ29tbW9uSlMpIHx8IGZhbHNlO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZ2V0V3JhcHBlZElkczogKCkgPT5cbiAgICAgIE9iamVjdC5rZXlzKGtub3duQ2pzTW9kdWxlVHlwZXMpLmZpbHRlcihcbiAgICAgICAgKGlkKSA9PiBrbm93bkNqc01vZHVsZVR5cGVzW2lkXSA9PT0gSVNfV1JBUFBFRF9DT01NT05KU1xuICAgICAgKSxcbiAgICBpc1JlcXVpcmVkSWQ6IChpZCkgPT4gcmVxdWlyZWRJZHNbaWRdLFxuICAgIGFzeW5jIHNob3VsZFRyYW5zZm9ybUNhY2hlZE1vZHVsZSh7XG4gICAgICBpZDogcGFyZW50SWQsXG4gICAgICByZXNvbHZlZFNvdXJjZXMsXG4gICAgICBtZXRhOiB7IGNvbW1vbmpzOiBwYXJlbnRNZXRhIH1cbiAgICB9KSB7XG4gICAgICAvLyBXZSBleHBsaWNpdGx5IHRyYWNrIEVTIG1vZHVsZXMgdG8gaGFuZGxlIGNpcmN1bGFyIGltcG9ydHNcbiAgICAgIGlmICghKHBhcmVudE1ldGEgJiYgcGFyZW50TWV0YS5pc0NvbW1vbkpTKSkga25vd25DanNNb2R1bGVUeXBlc1twYXJlbnRJZF0gPSBmYWxzZTtcbiAgICAgIGlmIChpc1dyYXBwZWRJZChwYXJlbnRJZCwgRVNfSU1QT1JUX1NVRkZJWCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHBhcmVudFJlcXVpcmVzID0gcGFyZW50TWV0YSAmJiBwYXJlbnRNZXRhLnJlcXVpcmVzO1xuICAgICAgaWYgKHBhcmVudFJlcXVpcmVzKSB7XG4gICAgICAgIHNldEluaXRpYWxQYXJlbnRUeXBlKHBhcmVudElkLCBwYXJlbnRNZXRhLmluaXRpYWxDb21tb25KU1R5cGUpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBwYXJlbnRSZXF1aXJlcy5tYXAoKHsgcmVzb2x2ZWQsIGlzQ29uZGl0aW9uYWwgfSkgPT5cbiAgICAgICAgICAgIGFuYWx5emVSZXF1aXJlZE1vZHVsZShwYXJlbnRJZCwgcmVzb2x2ZWQsIGlzQ29uZGl0aW9uYWwsIHRoaXMubG9hZClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGlmIChnZXRUeXBlRm9yRnVsbHlBbmFseXplZE1vZHVsZShwYXJlbnRJZCkgIT09IHBhcmVudE1ldGEuaXNDb21tb25KUykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgIHJlc29sdmVkOiB7IGlkIH1cbiAgICAgICAgfSBvZiBwYXJlbnRSZXF1aXJlcykge1xuICAgICAgICAgIGlmIChnZXRUeXBlRm9yRnVsbHlBbmFseXplZE1vZHVsZShpZCkgIT09IHBhcmVudE1ldGEuaXNSZXF1aXJlZENvbW1vbkpTW2lkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vdyB0aGF0IHdlIGRlY2lkZWQgdG8gZ28gd2l0aCB0aGUgY2FjaGVkIGNvcHksIG5laXRoZXIgdGhlIHBhcmVudFxuICAgICAgICAvLyBtb2R1bGUgbm9yIGFueSBvZiBpdHMgY2hpbGRyZW4gbWF5IGNoYW5nZSB0eXBlcyBhbnltb3JlXG4gICAgICAgIGZ1bGx5QW5hbHl6ZWRNb2R1bGVzW3BhcmVudElkXSA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3Qge1xuICAgICAgICAgIHJlc29sdmVkOiB7IGlkIH1cbiAgICAgICAgfSBvZiBwYXJlbnRSZXF1aXJlcykge1xuICAgICAgICAgIGZ1bGx5QW5hbHl6ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudFJlcXVpcmVTZXQgPSBuZXcgU2V0KChwYXJlbnRSZXF1aXJlcyB8fCBbXSkubWFwKCh7IHJlc29sdmVkOiB7IGlkIH0gfSkgPT4gaWQpKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIE9iamVjdC5rZXlzKHJlc29sdmVkU291cmNlcylcbiAgICAgICAgICAgIC5tYXAoKHNvdXJjZSkgPT4gcmVzb2x2ZWRTb3VyY2VzW3NvdXJjZV0pXG4gICAgICAgICAgICAuZmlsdGVyKCh7IGlkLCBleHRlcm5hbCB9KSA9PiAhKGV4dGVybmFsIHx8IHBhcmVudFJlcXVpcmVTZXQuaGFzKGlkKSkpXG4gICAgICAgICAgICAubWFwKGFzeW5jIChyZXNvbHZlZCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoaXNXcmFwcGVkSWQocmVzb2x2ZWQuaWQsIEVTX0lNUE9SVF9TVUZGSVgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIChhd2FpdCBnZXRUeXBlRm9ySW1wb3J0ZWRNb2R1bGUoXG4gICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQoeyBpZDogcmVzb2x2ZWQuaWQgfSlcbiAgICAgICAgICAgICAgICAgICAgKS5tZXRhLmNvbW1vbmpzLnJlc29sdmVkLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRcbiAgICAgICAgICAgICAgICAgICkpICE9PSBJU19XUkFQUEVEX0NPTU1PTkpTXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gKGF3YWl0IGdldFR5cGVGb3JJbXBvcnRlZE1vZHVsZShyZXNvbHZlZCwgdGhpcy5sb2FkKSkgPT09IElTX1dSQVBQRURfQ09NTU9OSlM7XG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApLnNvbWUoKHNob3VsZFRyYW5zZm9ybSkgPT4gc2hvdWxkVHJhbnNmb3JtKTtcbiAgICB9LFxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4gICAgcmVzb2x2ZVJlcXVpcmVTb3VyY2VzQW5kVXBkYXRlTWV0YTpcbiAgICAgIChyb2xsdXBDb250ZXh0KSA9PiBhc3luYyAocGFyZW50SWQsIGlzUGFyZW50Q29tbW9uSlMsIHBhcmVudE1ldGEsIHNvdXJjZXMpID0+IHtcbiAgICAgICAgcGFyZW50TWV0YS5pbml0aWFsQ29tbW9uSlNUeXBlID0gaXNQYXJlbnRDb21tb25KUztcbiAgICAgICAgcGFyZW50TWV0YS5yZXF1aXJlcyA9IFtdO1xuICAgICAgICBwYXJlbnRNZXRhLmlzUmVxdWlyZWRDb21tb25KUyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHNldEluaXRpYWxQYXJlbnRUeXBlKHBhcmVudElkLCBpc1BhcmVudENvbW1vbkpTKTtcbiAgICAgICAgY29uc3QgY3VycmVudGx5UmVzb2x2aW5nRm9yUGFyZW50ID0gY3VycmVudGx5UmVzb2x2aW5nLmdldChwYXJlbnRJZCkgfHwgbmV3IFNldCgpO1xuICAgICAgICBjdXJyZW50bHlSZXNvbHZpbmcuc2V0KHBhcmVudElkLCBjdXJyZW50bHlSZXNvbHZpbmdGb3JQYXJlbnQpO1xuICAgICAgICBjb25zdCByZXF1aXJlVGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHNvdXJjZXMubWFwKGFzeW5jICh7IHNvdXJjZSwgaXNDb25kaXRpb25hbCB9KSA9PiB7XG4gICAgICAgICAgICAvLyBOZXZlciBhbmFseXplIG9yIHByb3h5IGludGVybmFsIG1vZHVsZXNcbiAgICAgICAgICAgIGlmIChzb3VyY2Uuc3RhcnRzV2l0aCgnXFwwJykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgaWQ6IHNvdXJjZSwgYWxsb3dQcm94eTogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRseVJlc29sdmluZ0ZvclBhcmVudC5hZGQoc291cmNlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID1cbiAgICAgICAgICAgICAgKGF3YWl0IHJvbGx1cENvbnRleHQucmVzb2x2ZShzb3VyY2UsIHBhcmVudElkLCB7XG4gICAgICAgICAgICAgICAgY3VzdG9tOiB7ICdub2RlLXJlc29sdmUnOiB7IGlzUmVxdWlyZTogdHJ1ZSB9IH1cbiAgICAgICAgICAgICAgfSkpIHx8IHJlc29sdmVFeHRlbnNpb25zKHNvdXJjZSwgcGFyZW50SWQsIGV4dGVuc2lvbnMpO1xuICAgICAgICAgICAgY3VycmVudGx5UmVzb2x2aW5nRm9yUGFyZW50LmRlbGV0ZShzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKCFyZXNvbHZlZCkge1xuICAgICAgICAgICAgICByZXR1cm4geyBpZDogd3JhcElkJDEoc291cmNlLCBFWFRFUk5BTF9TVUZGSVgpLCBhbGxvd1Byb3h5OiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY2hpbGRJZCA9IHJlc29sdmVkLmlkO1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkLmV4dGVybmFsKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGlkOiB3cmFwSWQkMShjaGlsZElkLCBFWFRFUk5BTF9TVUZGSVgpLCBhbGxvd1Byb3h5OiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50TWV0YS5yZXF1aXJlcy5wdXNoKHsgcmVzb2x2ZWQsIGlzQ29uZGl0aW9uYWwgfSk7XG4gICAgICAgICAgICBhd2FpdCBhbmFseXplUmVxdWlyZWRNb2R1bGUocGFyZW50SWQsIHJlc29sdmVkLCBpc0NvbmRpdGlvbmFsLCByb2xsdXBDb250ZXh0LmxvYWQpO1xuICAgICAgICAgICAgcmV0dXJuIHsgaWQ6IGNoaWxkSWQsIGFsbG93UHJveHk6IHRydWUgfTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBwYXJlbnRNZXRhLmlzQ29tbW9uSlMgPSBnZXRUeXBlRm9yRnVsbHlBbmFseXplZE1vZHVsZShwYXJlbnRJZCk7XG4gICAgICAgIGZ1bGx5QW5hbHl6ZWRNb2R1bGVzW3BhcmVudElkXSA9IHRydWU7XG4gICAgICAgIHJldHVybiByZXF1aXJlVGFyZ2V0cy5tYXAoKHsgaWQ6IGRlcGVuZGVuY3lJZCwgYWxsb3dQcm94eSB9LCBpbmRleCkgPT4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tdWx0aS1hc3NpZ25cbiAgICAgICAgICBjb25zdCBpc0NvbW1vbkpTID0gKHBhcmVudE1ldGEuaXNSZXF1aXJlZENvbW1vbkpTW2RlcGVuZGVuY3lJZF0gPVxuICAgICAgICAgICAgZ2V0VHlwZUZvckZ1bGx5QW5hbHl6ZWRNb2R1bGUoZGVwZW5kZW5jeUlkKSk7XG4gICAgICAgICAgZnVsbHlBbmFseXplZE1vZHVsZXNbZGVwZW5kZW5jeUlkXSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlc1tpbmRleF0uc291cmNlLFxuICAgICAgICAgICAgaWQ6IGFsbG93UHJveHlcbiAgICAgICAgICAgICAgPyBpc0NvbW1vbkpTID09PSBJU19XUkFQUEVEX0NPTU1PTkpTXG4gICAgICAgICAgICAgICAgPyB3cmFwSWQkMShkZXBlbmRlbmN5SWQsIFdSQVBQRURfU1VGRklYKVxuICAgICAgICAgICAgICAgIDogd3JhcElkJDEoZGVwZW5kZW5jeUlkLCBQUk9YWV9TVUZGSVgpXG4gICAgICAgICAgICAgIDogZGVwZW5kZW5jeUlkLFxuICAgICAgICAgICAgaXNDb21tb25KU1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICBpc0N1cnJlbnRseVJlc29sdmluZyhzb3VyY2UsIHBhcmVudElkKSB7XG4gICAgICBjb25zdCBjdXJyZW50bHlSZXNvbHZpbmdGb3JQYXJlbnQgPSBjdXJyZW50bHlSZXNvbHZpbmcuZ2V0KHBhcmVudElkKTtcbiAgICAgIHJldHVybiBjdXJyZW50bHlSZXNvbHZpbmdGb3JQYXJlbnQgJiYgY3VycmVudGx5UmVzb2x2aW5nRm9yUGFyZW50Lmhhcyhzb3VyY2UpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVWZXJzaW9uKGFjdHVhbFZlcnNpb24sIHBlZXJEZXBlbmRlbmN5VmVyc2lvbiwgbmFtZSkge1xuICBjb25zdCB2ZXJzaW9uUmVnZXhwID0gL1xcXihcXGQrXFwuXFxkK1xcLlxcZCspL2c7XG4gIGxldCBtaW5NYWpvciA9IEluZmluaXR5O1xuICBsZXQgbWluTWlub3IgPSBJbmZpbml0eTtcbiAgbGV0IG1pblBhdGNoID0gSW5maW5pdHk7XG4gIGxldCBmb3VuZFZlcnNpb247XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25kLWFzc2lnblxuICB3aGlsZSAoKGZvdW5kVmVyc2lvbiA9IHZlcnNpb25SZWdleHAuZXhlYyhwZWVyRGVwZW5kZW5jeVZlcnNpb24pKSkge1xuICAgIGNvbnN0IFtmb3VuZE1ham9yLCBmb3VuZE1pbm9yLCBmb3VuZFBhdGNoXSA9IGZvdW5kVmVyc2lvblsxXS5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuICAgIGlmIChmb3VuZE1ham9yIDwgbWluTWFqb3IpIHtcbiAgICAgIG1pbk1ham9yID0gZm91bmRNYWpvcjtcbiAgICAgIG1pbk1pbm9yID0gZm91bmRNaW5vcjtcbiAgICAgIG1pblBhdGNoID0gZm91bmRQYXRjaDtcbiAgICB9XG4gIH1cbiAgaWYgKCFhY3R1YWxWZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEluc3VmZmljaWVudCAke25hbWV9IHZlcnNpb246IFwiQHJvbGx1cC9wbHVnaW4tY29tbW9uanNcIiByZXF1aXJlcyBhdCBsZWFzdCAke25hbWV9QCR7bWluTWFqb3J9LiR7bWluTWlub3J9LiR7bWluUGF0Y2h9LmBcbiAgICApO1xuICB9XG4gIGNvbnN0IFttYWpvciwgbWlub3IsIHBhdGNoXSA9IGFjdHVhbFZlcnNpb24uc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcbiAgaWYgKFxuICAgIG1ham9yIDwgbWluTWFqb3IgfHxcbiAgICAobWFqb3IgPT09IG1pbk1ham9yICYmIChtaW5vciA8IG1pbk1pbm9yIHx8IChtaW5vciA9PT0gbWluTWlub3IgJiYgcGF0Y2ggPCBtaW5QYXRjaCkpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW5zdWZmaWNpZW50ICR7bmFtZX0gdmVyc2lvbjogXCJAcm9sbHVwL3BsdWdpbi1jb21tb25qc1wiIHJlcXVpcmVzIGF0IGxlYXN0ICR7bmFtZX1AJHttaW5NYWpvcn0uJHttaW5NaW5vcn0uJHttaW5QYXRjaH0gYnV0IGZvdW5kICR7bmFtZX1AJHthY3R1YWxWZXJzaW9ufS5gXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBvcGVyYXRvcnMgPSB7XG4gICc9PSc6ICh4KSA9PiBlcXVhbHMoeC5sZWZ0LCB4LnJpZ2h0LCBmYWxzZSksXG5cbiAgJyE9JzogKHgpID0+IG5vdChvcGVyYXRvcnNbJz09J10oeCkpLFxuXG4gICc9PT0nOiAoeCkgPT4gZXF1YWxzKHgubGVmdCwgeC5yaWdodCwgdHJ1ZSksXG5cbiAgJyE9PSc6ICh4KSA9PiBub3Qob3BlcmF0b3JzWyc9PT0nXSh4KSksXG5cbiAgJyEnOiAoeCkgPT4gaXNGYWxzeSh4LmFyZ3VtZW50KSxcblxuICAnJiYnOiAoeCkgPT4gaXNUcnV0aHkoeC5sZWZ0KSAmJiBpc1RydXRoeSh4LnJpZ2h0KSxcblxuICAnfHwnOiAoeCkgPT4gaXNUcnV0aHkoeC5sZWZ0KSB8fCBpc1RydXRoeSh4LnJpZ2h0KVxufTtcblxuZnVuY3Rpb24gbm90KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IHZhbHVlIDogIXZhbHVlO1xufVxuXG5mdW5jdGlvbiBlcXVhbHMoYSwgYiwgc3RyaWN0KSB7XG4gIGlmIChhLnR5cGUgIT09IGIudHlwZSkgcmV0dXJuIG51bGw7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgaWYgKGEudHlwZSA9PT0gJ0xpdGVyYWwnKSByZXR1cm4gc3RyaWN0ID8gYS52YWx1ZSA9PT0gYi52YWx1ZSA6IGEudmFsdWUgPT0gYi52YWx1ZTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzVHJ1dGh5KG5vZGUpIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChub2RlLnR5cGUgPT09ICdMaXRlcmFsJykgcmV0dXJuICEhbm9kZS52YWx1ZTtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uJykgcmV0dXJuIGlzVHJ1dGh5KG5vZGUuZXhwcmVzc2lvbik7XG4gIGlmIChub2RlLm9wZXJhdG9yIGluIG9wZXJhdG9ycykgcmV0dXJuIG9wZXJhdG9yc1tub2RlLm9wZXJhdG9yXShub2RlKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzRmFsc3kobm9kZSkge1xuICByZXR1cm4gbm90KGlzVHJ1dGh5KG5vZGUpKTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5cGF0aChub2RlKSB7XG4gIGNvbnN0IHBhcnRzID0gW107XG5cbiAgd2hpbGUgKG5vZGUudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG4gICAgaWYgKG5vZGUuY29tcHV0ZWQpIHJldHVybiBudWxsO1xuXG4gICAgcGFydHMudW5zaGlmdChub2RlLnByb3BlcnR5Lm5hbWUpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIG5vZGUgPSBub2RlLm9iamVjdDtcbiAgfVxuXG4gIGlmIChub2RlLnR5cGUgIT09ICdJZGVudGlmaWVyJykgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgeyBuYW1lIH0gPSBub2RlO1xuICBwYXJ0cy51bnNoaWZ0KG5hbWUpO1xuXG4gIHJldHVybiB7IG5hbWUsIGtleXBhdGg6IHBhcnRzLmpvaW4oJy4nKSB9O1xufVxuXG5jb25zdCBLRVlfQ09NUElMRURfRVNNID0gJ19fZXNNb2R1bGUnO1xuXG5mdW5jdGlvbiBpc0RlZmluZUNvbXBpbGVkRXNtKG5vZGUpIHtcbiAgY29uc3QgZGVmaW5lZFByb3BlcnR5ID1cbiAgICBnZXREZWZpbmVQcm9wZXJ0eUNhbGxOYW1lKG5vZGUsICdleHBvcnRzJykgfHwgZ2V0RGVmaW5lUHJvcGVydHlDYWxsTmFtZShub2RlLCAnbW9kdWxlLmV4cG9ydHMnKTtcbiAgaWYgKGRlZmluZWRQcm9wZXJ0eSAmJiBkZWZpbmVkUHJvcGVydHkua2V5ID09PSBLRVlfQ09NUElMRURfRVNNKSB7XG4gICAgcmV0dXJuIGlzVHJ1dGh5KGRlZmluZWRQcm9wZXJ0eS52YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWZpbmVQcm9wZXJ0eUNhbGxOYW1lKG5vZGUsIHRhcmdldE5hbWUpIHtcbiAgY29uc3Qge1xuICAgIGNhbGxlZTogeyBvYmplY3QsIHByb3BlcnR5IH1cbiAgfSA9IG5vZGU7XG4gIGlmICghb2JqZWN0IHx8IG9iamVjdC50eXBlICE9PSAnSWRlbnRpZmllcicgfHwgb2JqZWN0Lm5hbWUgIT09ICdPYmplY3QnKSByZXR1cm47XG4gIGlmICghcHJvcGVydHkgfHwgcHJvcGVydHkudHlwZSAhPT0gJ0lkZW50aWZpZXInIHx8IHByb3BlcnR5Lm5hbWUgIT09ICdkZWZpbmVQcm9wZXJ0eScpIHJldHVybjtcbiAgaWYgKG5vZGUuYXJndW1lbnRzLmxlbmd0aCAhPT0gMykgcmV0dXJuO1xuXG4gIGNvbnN0IHRhcmdldE5hbWVzID0gdGFyZ2V0TmFtZS5zcGxpdCgnLicpO1xuICBjb25zdCBbdGFyZ2V0LCBrZXksIHZhbHVlXSA9IG5vZGUuYXJndW1lbnRzO1xuICBpZiAodGFyZ2V0TmFtZXMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHRhcmdldC50eXBlICE9PSAnSWRlbnRpZmllcicgfHwgdGFyZ2V0Lm5hbWUgIT09IHRhcmdldE5hbWVzWzBdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKHRhcmdldE5hbWVzLmxlbmd0aCA9PT0gMikge1xuICAgIGlmIChcbiAgICAgIHRhcmdldC50eXBlICE9PSAnTWVtYmVyRXhwcmVzc2lvbicgfHxcbiAgICAgIHRhcmdldC5vYmplY3QubmFtZSAhPT0gdGFyZ2V0TmFtZXNbMF0gfHxcbiAgICAgIHRhcmdldC5wcm9wZXJ0eS5uYW1lICE9PSB0YXJnZXROYW1lc1sxXVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZS50eXBlICE9PSAnT2JqZWN0RXhwcmVzc2lvbicgfHwgIXZhbHVlLnByb3BlcnRpZXMpIHJldHVybjtcblxuICBjb25zdCB2YWx1ZVByb3BlcnR5ID0gdmFsdWUucHJvcGVydGllcy5maW5kKChwKSA9PiBwLmtleSAmJiBwLmtleS5uYW1lID09PSAndmFsdWUnKTtcbiAgaWYgKCF2YWx1ZVByb3BlcnR5IHx8ICF2YWx1ZVByb3BlcnR5LnZhbHVlKSByZXR1cm47XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIHJldHVybiB7IGtleToga2V5LnZhbHVlLCB2YWx1ZTogdmFsdWVQcm9wZXJ0eS52YWx1ZSB9O1xufVxuXG5mdW5jdGlvbiBpc1Nob3J0aGFuZFByb3BlcnR5KHBhcmVudCkge1xuICByZXR1cm4gcGFyZW50ICYmIHBhcmVudC50eXBlID09PSAnUHJvcGVydHknICYmIHBhcmVudC5zaG9ydGhhbmQ7XG59XG5cbmZ1bmN0aW9uIGhhc0RlZmluZUVzbVByb3BlcnR5KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUucHJvcGVydGllcy5zb21lKChwcm9wZXJ0eSkgPT4ge1xuICAgIGlmIChcbiAgICAgIHByb3BlcnR5LnR5cGUgPT09ICdQcm9wZXJ0eScgJiZcbiAgICAgIHByb3BlcnR5LmtleS50eXBlID09PSAnSWRlbnRpZmllcicgJiZcbiAgICAgIHByb3BlcnR5LmtleS5uYW1lID09PSAnX19lc01vZHVsZScgJiZcbiAgICAgIGlzVHJ1dGh5KHByb3BlcnR5LnZhbHVlKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdyYXBDb2RlKG1hZ2ljU3RyaW5nLCB1c2VzLCBtb2R1bGVOYW1lLCBleHBvcnRzTmFtZSwgaW5kZW50RXhjbHVzaW9uUmFuZ2VzKSB7XG4gIGNvbnN0IGFyZ3MgPSBbXTtcbiAgY29uc3QgcGFzc2VkQXJncyA9IFtdO1xuICBpZiAodXNlcy5tb2R1bGUpIHtcbiAgICBhcmdzLnB1c2goJ21vZHVsZScpO1xuICAgIHBhc3NlZEFyZ3MucHVzaChtb2R1bGVOYW1lKTtcbiAgfVxuICBpZiAodXNlcy5leHBvcnRzKSB7XG4gICAgYXJncy5wdXNoKCdleHBvcnRzJyk7XG4gICAgcGFzc2VkQXJncy5wdXNoKGV4cG9ydHNOYW1lKTtcbiAgfVxuICBtYWdpY1N0cmluZ1xuICAgIC50cmltKClcbiAgICAuaW5kZW50KCdcXHQnLCB7IGV4Y2x1ZGU6IGluZGVudEV4Y2x1c2lvblJhbmdlcyB9KVxuICAgIC5wcmVwZW5kKGAoZnVuY3Rpb24gKCR7YXJncy5qb2luKCcsICcpfSkge1xcbmApXG4gICAgLmFwcGVuZChgXFxufSAoJHtwYXNzZWRBcmdzLmpvaW4oJywgJyl9KSk7YCk7XG59XG5cbmZ1bmN0aW9uIHJld3JpdGVFeHBvcnRzQW5kR2V0RXhwb3J0c0Jsb2NrKFxuICBtYWdpY1N0cmluZyxcbiAgbW9kdWxlTmFtZSxcbiAgZXhwb3J0c05hbWUsXG4gIHdyYXBwZWQsXG4gIG1vZHVsZUV4cG9ydHNBc3NpZ25tZW50cyxcbiAgZmlyc3RUb3BMZXZlbE1vZHVsZUV4cG9ydHNBc3NpZ25tZW50LFxuICBleHBvcnRzQXNzaWdubWVudHNCeU5hbWUsXG4gIHRvcExldmVsQXNzaWdubWVudHMsXG4gIGRlZmluZUNvbXBpbGVkRXNtRXhwcmVzc2lvbnMsXG4gIGRlY29uZmxpY3RlZEV4cG9ydE5hbWVzLFxuICBjb2RlLFxuICBIRUxQRVJTX05BTUUsXG4gIGV4cG9ydE1vZGUsXG4gIGRldGVjdFdyYXBwZWREZWZhdWx0LFxuICBkZWZhdWx0SXNNb2R1bGVFeHBvcnRzLFxuICB1c2VzUmVxdWlyZVdyYXBwZXIsXG4gIHJlcXVpcmVOYW1lXG4pIHtcbiAgY29uc3QgZXhwb3J0cyA9IFtdO1xuICBjb25zdCBleHBvcnREZWNsYXJhdGlvbnMgPSBbXTtcblxuICBpZiAodXNlc1JlcXVpcmVXcmFwcGVyKSB7XG4gICAgZ2V0RXhwb3J0c1doZW5Vc2luZ1JlcXVpcmVXcmFwcGVyKFxuICAgICAgbWFnaWNTdHJpbmcsXG4gICAgICB3cmFwcGVkLFxuICAgICAgZXhwb3J0TW9kZSxcbiAgICAgIGV4cG9ydHMsXG4gICAgICBtb2R1bGVFeHBvcnRzQXNzaWdubWVudHMsXG4gICAgICBleHBvcnRzQXNzaWdubWVudHNCeU5hbWUsXG4gICAgICBtb2R1bGVOYW1lLFxuICAgICAgZXhwb3J0c05hbWUsXG4gICAgICByZXF1aXJlTmFtZSxcbiAgICAgIGRlZmluZUNvbXBpbGVkRXNtRXhwcmVzc2lvbnNcbiAgICApO1xuICB9IGVsc2UgaWYgKGV4cG9ydE1vZGUgPT09ICdyZXBsYWNlJykge1xuICAgIGdldEV4cG9ydHNGb3JSZXBsYWNlZE1vZHVsZUV4cG9ydHMoXG4gICAgICBtYWdpY1N0cmluZyxcbiAgICAgIGV4cG9ydHMsXG4gICAgICBleHBvcnREZWNsYXJhdGlvbnMsXG4gICAgICBtb2R1bGVFeHBvcnRzQXNzaWdubWVudHMsXG4gICAgICBmaXJzdFRvcExldmVsTW9kdWxlRXhwb3J0c0Fzc2lnbm1lbnQsXG4gICAgICBleHBvcnRzTmFtZVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5wdXNoKGAke2V4cG9ydHNOYW1lfSBhcyBfX21vZHVsZUV4cG9ydHNgKTtcbiAgICBpZiAod3JhcHBlZCkge1xuICAgICAgZ2V0RXhwb3J0c1doZW5XcmFwcGluZyhcbiAgICAgICAgZXhwb3J0RGVjbGFyYXRpb25zLFxuICAgICAgICBleHBvcnRzTmFtZSxcbiAgICAgICAgZGV0ZWN0V3JhcHBlZERlZmF1bHQsXG4gICAgICAgIEhFTFBFUlNfTkFNRSxcbiAgICAgICAgZGVmYXVsdElzTW9kdWxlRXhwb3J0c1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RXhwb3J0cyhcbiAgICAgICAgbWFnaWNTdHJpbmcsXG4gICAgICAgIGV4cG9ydHMsXG4gICAgICAgIGV4cG9ydERlY2xhcmF0aW9ucyxcbiAgICAgICAgbW9kdWxlRXhwb3J0c0Fzc2lnbm1lbnRzLFxuICAgICAgICBleHBvcnRzQXNzaWdubWVudHNCeU5hbWUsXG4gICAgICAgIGRlY29uZmxpY3RlZEV4cG9ydE5hbWVzLFxuICAgICAgICB0b3BMZXZlbEFzc2lnbm1lbnRzLFxuICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICBleHBvcnRzTmFtZSxcbiAgICAgICAgZGVmaW5lQ29tcGlsZWRFc21FeHByZXNzaW9ucyxcbiAgICAgICAgSEVMUEVSU19OQU1FLFxuICAgICAgICBkZWZhdWx0SXNNb2R1bGVFeHBvcnRzXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAoZXhwb3J0cy5sZW5ndGgpIHtcbiAgICBleHBvcnREZWNsYXJhdGlvbnMucHVzaChgZXhwb3J0IHsgJHtleHBvcnRzLmpvaW4oJywgJyl9IH07YCk7XG4gIH1cblxuICByZXR1cm4gYFxcblxcbiR7ZXhwb3J0RGVjbGFyYXRpb25zLmpvaW4oJ1xcbicpfWA7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydHNXaGVuVXNpbmdSZXF1aXJlV3JhcHBlcihcbiAgbWFnaWNTdHJpbmcsXG4gIHdyYXBwZWQsXG4gIGV4cG9ydE1vZGUsXG4gIGV4cG9ydHMsXG4gIG1vZHVsZUV4cG9ydHNBc3NpZ25tZW50cyxcbiAgZXhwb3J0c0Fzc2lnbm1lbnRzQnlOYW1lLFxuICBtb2R1bGVOYW1lLFxuICBleHBvcnRzTmFtZSxcbiAgcmVxdWlyZU5hbWUsXG4gIGRlZmluZUNvbXBpbGVkRXNtRXhwcmVzc2lvbnNcbikge1xuICBpZiAoIXdyYXBwZWQpIHtcbiAgICBpZiAoZXhwb3J0TW9kZSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICBmb3IgKGNvbnN0IHsgbGVmdCB9IG9mIG1vZHVsZUV4cG9ydHNBc3NpZ25tZW50cykge1xuICAgICAgICBtYWdpY1N0cmluZy5vdmVyd3JpdGUobGVmdC5zdGFydCwgbGVmdC5lbmQsIGV4cG9ydHNOYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29sbGVjdCBhbmQgcmV3cml0ZSBtb2R1bGUuZXhwb3J0cyBhc3NpZ25tZW50c1xuICAgICAgZm9yIChjb25zdCB7IGxlZnQgfSBvZiBtb2R1bGVFeHBvcnRzQXNzaWdubWVudHMpIHtcbiAgICAgICAgbWFnaWNTdHJpbmcub3ZlcndyaXRlKGxlZnQuc3RhcnQsIGxlZnQuZW5kLCBgJHttb2R1bGVOYW1lfS5leHBvcnRzYCk7XG4gICAgICB9XG4gICAgICAvLyBDb2xsZWN0IGFuZCByZXdyaXRlIG5hbWVkIGV4cG9ydHNcbiAgICAgIGZvciAoY29uc3QgW2V4cG9ydE5hbWUsIHsgbm9kZXMgfV0gb2YgZXhwb3J0c0Fzc2lnbm1lbnRzQnlOYW1lKSB7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICAgIG1hZ2ljU3RyaW5nLm92ZXJ3cml0ZShub2RlLnN0YXJ0LCBub2RlLmxlZnQuZW5kLCBgJHtleHBvcnRzTmFtZX0uJHtleHBvcnROYW1lfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDb2xsZWN0IGFuZCByZXdyaXRlIGV4cG9ydHMuX19lc01vZHVsZSBhc3NpZ25tZW50c1xuICAgICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIGRlZmluZUNvbXBpbGVkRXNtRXhwcmVzc2lvbnMpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlRXhwb3J0c0V4cHJlc3Npb24gPVxuICAgICAgICAgIGV4cHJlc3Npb24udHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJyA/IGV4cHJlc3Npb24uYXJndW1lbnRzWzBdIDogZXhwcmVzc2lvbi5sZWZ0Lm9iamVjdDtcbiAgICAgICAgbWFnaWNTdHJpbmcub3ZlcndyaXRlKFxuICAgICAgICAgIG1vZHVsZUV4cG9ydHNFeHByZXNzaW9uLnN0YXJ0LFxuICAgICAgICAgIG1vZHVsZUV4cG9ydHNFeHByZXNzaW9uLmVuZCxcbiAgICAgICAgICBleHBvcnRzTmFtZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBleHBvcnRzLnB1c2goYCR7cmVxdWlyZU5hbWV9IGFzIF9fcmVxdWlyZWApO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRzRm9yUmVwbGFjZWRNb2R1bGVFeHBvcnRzKFxuICBtYWdpY1N0cmluZyxcbiAgZXhwb3J0cyxcbiAgZXhwb3J0RGVjbGFyYXRpb25zLFxuICBtb2R1bGVFeHBvcnRzQXNzaWdubWVudHMsXG4gIGZpcnN0VG9wTGV2ZWxNb2R1bGVFeHBvcnRzQXNzaWdubWVudCxcbiAgZXhwb3J0c05hbWVcbikge1xuICBmb3IgKGNvbnN0IHsgbGVmdCB9IG9mIG1vZHVsZUV4cG9ydHNBc3NpZ25tZW50cykge1xuICAgIG1hZ2ljU3RyaW5nLm92ZXJ3cml0ZShsZWZ0LnN0YXJ0LCBsZWZ0LmVuZCwgZXhwb3J0c05hbWUpO1xuICB9XG4gIG1hZ2ljU3RyaW5nLnByZXBlbmRSaWdodChmaXJzdFRvcExldmVsTW9kdWxlRXhwb3J0c0Fzc2lnbm1lbnQubGVmdC5zdGFydCwgJ3ZhciAnKTtcbiAgZXhwb3J0cy5wdXNoKGAke2V4cG9ydHNOYW1lfSBhcyBfX21vZHVsZUV4cG9ydHNgKTtcbiAgZXhwb3J0RGVjbGFyYXRpb25zLnB1c2goYGV4cG9ydCBkZWZhdWx0ICR7ZXhwb3J0c05hbWV9O2ApO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRzV2hlbldyYXBwaW5nKFxuICBleHBvcnREZWNsYXJhdGlvbnMsXG4gIGV4cG9ydHNOYW1lLFxuICBkZXRlY3RXcmFwcGVkRGVmYXVsdCxcbiAgSEVMUEVSU19OQU1FLFxuICBkZWZhdWx0SXNNb2R1bGVFeHBvcnRzXG4pIHtcbiAgZXhwb3J0RGVjbGFyYXRpb25zLnB1c2goXG4gICAgYGV4cG9ydCBkZWZhdWx0ICR7XG4gICAgICBkZXRlY3RXcmFwcGVkRGVmYXVsdCAmJiBkZWZhdWx0SXNNb2R1bGVFeHBvcnRzID09PSAnYXV0bydcbiAgICAgICAgPyBgLypAX19QVVJFX18qLyR7SEVMUEVSU19OQU1FfS5nZXREZWZhdWx0RXhwb3J0RnJvbUNqcygke2V4cG9ydHNOYW1lfSlgXG4gICAgICAgIDogZGVmYXVsdElzTW9kdWxlRXhwb3J0cyA9PT0gZmFsc2VcbiAgICAgICAgPyBgJHtleHBvcnRzTmFtZX0uZGVmYXVsdGBcbiAgICAgICAgOiBleHBvcnRzTmFtZVxuICAgIH07YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRzKFxuICBtYWdpY1N0cmluZyxcbiAgZXhwb3J0cyxcbiAgZXhwb3J0RGVjbGFyYXRpb25zLFxuICBtb2R1bGVFeHBvcnRzQXNzaWdubWVudHMsXG4gIGV4cG9ydHNBc3NpZ25tZW50c0J5TmFtZSxcbiAgZGVjb25mbGljdGVkRXhwb3J0TmFtZXMsXG4gIHRvcExldmVsQXNzaWdubWVudHMsXG4gIG1vZHVsZU5hbWUsXG4gIGV4cG9ydHNOYW1lLFxuICBkZWZpbmVDb21waWxlZEVzbUV4cHJlc3Npb25zLFxuICBIRUxQRVJTX05BTUUsXG4gIGRlZmF1bHRJc01vZHVsZUV4cG9ydHNcbikge1xuICBsZXQgZGVjb25mbGljdGVkRGVmYXVsdEV4cG9ydE5hbWU7XG4gIC8vIENvbGxlY3QgYW5kIHJld3JpdGUgbW9kdWxlLmV4cG9ydHMgYXNzaWdubWVudHNcbiAgZm9yIChjb25zdCB7IGxlZnQgfSBvZiBtb2R1bGVFeHBvcnRzQXNzaWdubWVudHMpIHtcbiAgICBtYWdpY1N0cmluZy5vdmVyd3JpdGUobGVmdC5zdGFydCwgbGVmdC5lbmQsIGAke21vZHVsZU5hbWV9LmV4cG9ydHNgKTtcbiAgfVxuXG4gIC8vIENvbGxlY3QgYW5kIHJld3JpdGUgbmFtZWQgZXhwb3J0c1xuICBmb3IgKGNvbnN0IFtleHBvcnROYW1lLCB7IG5vZGVzIH1dIG9mIGV4cG9ydHNBc3NpZ25tZW50c0J5TmFtZSkge1xuICAgIGNvbnN0IGRlY29uZmxpY3RlZCA9IGRlY29uZmxpY3RlZEV4cG9ydE5hbWVzW2V4cG9ydE5hbWVdO1xuICAgIGxldCBuZWVkc0RlY2xhcmF0aW9uID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgIGxldCByZXBsYWNlbWVudCA9IGAke2RlY29uZmxpY3RlZH0gPSAke2V4cG9ydHNOYW1lfS4ke2V4cG9ydE5hbWV9YDtcbiAgICAgIGlmIChuZWVkc0RlY2xhcmF0aW9uICYmIHRvcExldmVsQXNzaWdubWVudHMuaGFzKG5vZGUpKSB7XG4gICAgICAgIHJlcGxhY2VtZW50ID0gYHZhciAke3JlcGxhY2VtZW50fWA7XG4gICAgICAgIG5lZWRzRGVjbGFyYXRpb24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG1hZ2ljU3RyaW5nLm92ZXJ3cml0ZShub2RlLnN0YXJ0LCBub2RlLmxlZnQuZW5kLCByZXBsYWNlbWVudCk7XG4gICAgfVxuICAgIGlmIChuZWVkc0RlY2xhcmF0aW9uKSB7XG4gICAgICBtYWdpY1N0cmluZy5wcmVwZW5kKGB2YXIgJHtkZWNvbmZsaWN0ZWR9O1xcbmApO1xuICAgIH1cblxuICAgIGlmIChleHBvcnROYW1lID09PSAnZGVmYXVsdCcpIHtcbiAgICAgIGRlY29uZmxpY3RlZERlZmF1bHRFeHBvcnROYW1lID0gZGVjb25mbGljdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLnB1c2goZXhwb3J0TmFtZSA9PT0gZGVjb25mbGljdGVkID8gZXhwb3J0TmFtZSA6IGAke2RlY29uZmxpY3RlZH0gYXMgJHtleHBvcnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbGxlY3QgYW5kIHJld3JpdGUgZXhwb3J0cy5fX2VzTW9kdWxlIGFzc2lnbm1lbnRzXG4gIGxldCBpc1Jlc3RvcmFibGVDb21waWxlZEVzbSA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgZGVmaW5lQ29tcGlsZWRFc21FeHByZXNzaW9ucykge1xuICAgIGlzUmVzdG9yYWJsZUNvbXBpbGVkRXNtID0gdHJ1ZTtcbiAgICBjb25zdCBtb2R1bGVFeHBvcnRzRXhwcmVzc2lvbiA9XG4gICAgICBleHByZXNzaW9uLnR5cGUgPT09ICdDYWxsRXhwcmVzc2lvbicgPyBleHByZXNzaW9uLmFyZ3VtZW50c1swXSA6IGV4cHJlc3Npb24ubGVmdC5vYmplY3Q7XG4gICAgbWFnaWNTdHJpbmcub3ZlcndyaXRlKG1vZHVsZUV4cG9ydHNFeHByZXNzaW9uLnN0YXJ0LCBtb2R1bGVFeHBvcnRzRXhwcmVzc2lvbi5lbmQsIGV4cG9ydHNOYW1lKTtcbiAgfVxuXG4gIGlmICghaXNSZXN0b3JhYmxlQ29tcGlsZWRFc20gfHwgZGVmYXVsdElzTW9kdWxlRXhwb3J0cyA9PT0gdHJ1ZSkge1xuICAgIGV4cG9ydHMucHVzaChgJHtleHBvcnRzTmFtZX0gYXMgZGVmYXVsdGApO1xuICB9IGVsc2UgaWYgKG1vZHVsZUV4cG9ydHNBc3NpZ25tZW50cy5sZW5ndGggPT09IDAgfHwgZGVmYXVsdElzTW9kdWxlRXhwb3J0cyA9PT0gZmFsc2UpIHtcbiAgICBleHBvcnRzLnB1c2goYCR7ZGVjb25mbGljdGVkRGVmYXVsdEV4cG9ydE5hbWUgfHwgZXhwb3J0c05hbWV9IGFzIGRlZmF1bHRgKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnREZWNsYXJhdGlvbnMucHVzaChcbiAgICAgIGBleHBvcnQgZGVmYXVsdCAvKkBfX1BVUkVfXyovJHtIRUxQRVJTX05BTUV9LmdldERlZmF1bHRFeHBvcnRGcm9tQ2pzKCR7ZXhwb3J0c05hbWV9KTtgXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1JlcXVpcmVFeHByZXNzaW9uKG5vZGUsIHNjb3BlKSB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAobm9kZS50eXBlICE9PSAnQ2FsbEV4cHJlc3Npb24nKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gV2VpcmQgY2FzZSBvZiBgcmVxdWlyZSgpYCBvciBgbW9kdWxlLnJlcXVpcmUoKWAgd2l0aG91dCBhcmd1bWVudHNcbiAgaWYgKG5vZGUuYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBpc1JlcXVpcmUobm9kZS5jYWxsZWUsIHNjb3BlKTtcbn1cblxuZnVuY3Rpb24gaXNSZXF1aXJlKG5vZGUsIHNjb3BlKSB7XG4gIHJldHVybiAoXG4gICAgKG5vZGUudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmIG5vZGUubmFtZSA9PT0gJ3JlcXVpcmUnICYmICFzY29wZS5jb250YWlucygncmVxdWlyZScpKSB8fFxuICAgIChub2RlLnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJyAmJiBpc01vZHVsZVJlcXVpcmUobm9kZSwgc2NvcGUpKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc01vZHVsZVJlcXVpcmUoeyBvYmplY3QsIHByb3BlcnR5IH0sIHNjb3BlKSB7XG4gIHJldHVybiAoXG4gICAgb2JqZWN0LnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJlxuICAgIG9iamVjdC5uYW1lID09PSAnbW9kdWxlJyAmJlxuICAgIHByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJlxuICAgIHByb3BlcnR5Lm5hbWUgPT09ICdyZXF1aXJlJyAmJlxuICAgICFzY29wZS5jb250YWlucygnbW9kdWxlJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzRHluYW1pY0FyZ3VtZW50cyhub2RlKSB7XG4gIHJldHVybiAoXG4gICAgbm9kZS5hcmd1bWVudHMubGVuZ3RoID4gMSB8fFxuICAgIChub2RlLmFyZ3VtZW50c1swXS50eXBlICE9PSAnTGl0ZXJhbCcgJiZcbiAgICAgIChub2RlLmFyZ3VtZW50c1swXS50eXBlICE9PSAnVGVtcGxhdGVMaXRlcmFsJyB8fCBub2RlLmFyZ3VtZW50c1swXS5leHByZXNzaW9ucy5sZW5ndGggPiAwKSlcbiAgKTtcbn1cblxuY29uc3QgcmVzZXJ2ZWRNZXRob2QgPSB7IHJlc29sdmU6IHRydWUsIGNhY2hlOiB0cnVlLCBtYWluOiB0cnVlIH07XG5cbmZ1bmN0aW9uIGlzTm9kZVJlcXVpcmVQcm9wZXJ0eUFjY2VzcyhwYXJlbnQpIHtcbiAgcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQucHJvcGVydHkgJiYgcmVzZXJ2ZWRNZXRob2RbcGFyZW50LnByb3BlcnR5Lm5hbWVdO1xufVxuXG5mdW5jdGlvbiBnZXRSZXF1aXJlU3RyaW5nQXJnKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuYXJndW1lbnRzWzBdLnR5cGUgPT09ICdMaXRlcmFsJ1xuICAgID8gbm9kZS5hcmd1bWVudHNbMF0udmFsdWVcbiAgICA6IG5vZGUuYXJndW1lbnRzWzBdLnF1YXNpc1swXS52YWx1ZS5jb29rZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFJlcXVpcmVIYW5kbGVycygpIHtcbiAgY29uc3QgcmVxdWlyZUV4cHJlc3Npb25zID0gW107XG5cbiAgZnVuY3Rpb24gYWRkUmVxdWlyZUV4cHJlc3Npb24oXG4gICAgc291cmNlSWQsXG4gICAgbm9kZSxcbiAgICBzY29wZSxcbiAgICB1c2VzUmV0dXJuVmFsdWUsXG4gICAgaXNJbnNpZGVUcnlCbG9jayxcbiAgICBpc0luc2lkZUNvbmRpdGlvbmFsLFxuICAgIHRvQmVSZW1vdmVkXG4gICkge1xuICAgIHJlcXVpcmVFeHByZXNzaW9ucy5wdXNoKHtcbiAgICAgIHNvdXJjZUlkLFxuICAgICAgbm9kZSxcbiAgICAgIHNjb3BlLFxuICAgICAgdXNlc1JldHVyblZhbHVlLFxuICAgICAgaXNJbnNpZGVUcnlCbG9jayxcbiAgICAgIGlzSW5zaWRlQ29uZGl0aW9uYWwsXG4gICAgICB0b0JlUmVtb3ZlZFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmV3cml0ZVJlcXVpcmVFeHByZXNzaW9uc0FuZEdldEltcG9ydEJsb2NrKFxuICAgIG1hZ2ljU3RyaW5nLFxuICAgIHRvcExldmVsRGVjbGFyYXRpb25zLFxuICAgIHJlYXNzaWduZWROYW1lcyxcbiAgICBoZWxwZXJzTmFtZSxcbiAgICBkeW5hbWljUmVxdWlyZU5hbWUsXG4gICAgbW9kdWxlTmFtZSxcbiAgICBleHBvcnRzTmFtZSxcbiAgICBpZCxcbiAgICBleHBvcnRNb2RlLFxuICAgIHJlc29sdmVSZXF1aXJlU291cmNlc0FuZFVwZGF0ZU1ldGEsXG4gICAgbmVlZHNSZXF1aXJlV3JhcHBlcixcbiAgICBpc0VzTW9kdWxlLFxuICAgIGlzRHluYW1pY1JlcXVpcmVNb2R1bGVzRW5hYmxlZCxcbiAgICBnZXRJZ25vcmVUcnlDYXRjaFJlcXVpcmVTdGF0ZW1lbnRNb2RlLFxuICAgIGNvbW1vbmpzTWV0YVxuICApIHtcbiAgICBjb25zdCBpbXBvcnRzID0gW107XG4gICAgaW1wb3J0cy5wdXNoKGBpbXBvcnQgKiBhcyAke2hlbHBlcnNOYW1lfSBmcm9tIFwiJHtIRUxQRVJTX0lEfVwiO2ApO1xuICAgIGlmIChkeW5hbWljUmVxdWlyZU5hbWUpIHtcbiAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgYGltcG9ydCB7ICR7XG4gICAgICAgICAgaXNEeW5hbWljUmVxdWlyZU1vZHVsZXNFbmFibGVkID8gQ1JFQVRFX0NPTU1PTkpTX1JFUVVJUkVfRVhQT1JUIDogQ09NTU9OSlNfUkVRVUlSRV9FWFBPUlRcbiAgICAgICAgfSBhcyAke2R5bmFtaWNSZXF1aXJlTmFtZX0gfSBmcm9tIFwiJHtEWU5BTUlDX01PRFVMRVNfSUR9XCI7YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGV4cG9ydE1vZGUgPT09ICdtb2R1bGUnKSB7XG4gICAgICBpbXBvcnRzLnB1c2goXG4gICAgICAgIGBpbXBvcnQgeyBfX21vZHVsZSBhcyAke21vZHVsZU5hbWV9LCBleHBvcnRzIGFzICR7ZXhwb3J0c05hbWV9IH0gZnJvbSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHdyYXBJZCQxKGlkLCBNT0RVTEVfU1VGRklYKVxuICAgICAgICApfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChleHBvcnRNb2RlID09PSAnZXhwb3J0cycpIHtcbiAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgYGltcG9ydCB7IF9fZXhwb3J0cyBhcyAke2V4cG9ydHNOYW1lfSB9IGZyb20gJHtKU09OLnN0cmluZ2lmeSh3cmFwSWQkMShpZCwgRVhQT1JUU19TVUZGSVgpKX1gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCByZXF1aXJlc0J5U291cmNlID0gY29sbGVjdFNvdXJjZXMocmVxdWlyZUV4cHJlc3Npb25zKTtcbiAgICBjb25zdCByZXF1aXJlVGFyZ2V0cyA9IGF3YWl0IHJlc29sdmVSZXF1aXJlU291cmNlc0FuZFVwZGF0ZU1ldGEoXG4gICAgICBpZCxcbiAgICAgIG5lZWRzUmVxdWlyZVdyYXBwZXIgPyBJU19XUkFQUEVEX0NPTU1PTkpTIDogIWlzRXNNb2R1bGUsXG4gICAgICBjb21tb25qc01ldGEsXG4gICAgICBPYmplY3Qua2V5cyhyZXF1aXJlc0J5U291cmNlKS5tYXAoKHNvdXJjZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBpc0NvbmRpdGlvbmFsOiByZXF1aXJlc0J5U291cmNlW3NvdXJjZV0uZXZlcnkoKHJlcXVpcmUpID0+IHJlcXVpcmUuaXNJbnNpZGVDb25kaXRpb25hbClcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBwcm9jZXNzUmVxdWlyZUV4cHJlc3Npb25zKFxuICAgICAgaW1wb3J0cyxcbiAgICAgIHJlcXVpcmVUYXJnZXRzLFxuICAgICAgcmVxdWlyZXNCeVNvdXJjZSxcbiAgICAgIGdldElnbm9yZVRyeUNhdGNoUmVxdWlyZVN0YXRlbWVudE1vZGUsXG4gICAgICBtYWdpY1N0cmluZ1xuICAgICk7XG4gICAgcmV0dXJuIGltcG9ydHMubGVuZ3RoID8gYCR7aW1wb3J0cy5qb2luKCdcXG4nKX1cXG5cXG5gIDogJyc7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFkZFJlcXVpcmVFeHByZXNzaW9uLFxuICAgIHJld3JpdGVSZXF1aXJlRXhwcmVzc2lvbnNBbmRHZXRJbXBvcnRCbG9ja1xuICB9O1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U291cmNlcyhyZXF1aXJlRXhwcmVzc2lvbnMpIHtcbiAgY29uc3QgcmVxdWlyZXNCeVNvdXJjZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3QgcmVxdWlyZUV4cHJlc3Npb24gb2YgcmVxdWlyZUV4cHJlc3Npb25zKSB7XG4gICAgY29uc3QgeyBzb3VyY2VJZCB9ID0gcmVxdWlyZUV4cHJlc3Npb247XG4gICAgaWYgKCFyZXF1aXJlc0J5U291cmNlW3NvdXJjZUlkXSkge1xuICAgICAgcmVxdWlyZXNCeVNvdXJjZVtzb3VyY2VJZF0gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWlyZXMgPSByZXF1aXJlc0J5U291cmNlW3NvdXJjZUlkXTtcbiAgICByZXF1aXJlcy5wdXNoKHJlcXVpcmVFeHByZXNzaW9uKTtcbiAgfVxuICByZXR1cm4gcmVxdWlyZXNCeVNvdXJjZTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1JlcXVpcmVFeHByZXNzaW9ucyhcbiAgaW1wb3J0cyxcbiAgcmVxdWlyZVRhcmdldHMsXG4gIHJlcXVpcmVzQnlTb3VyY2UsXG4gIGdldElnbm9yZVRyeUNhdGNoUmVxdWlyZVN0YXRlbWVudE1vZGUsXG4gIG1hZ2ljU3RyaW5nXG4pIHtcbiAgY29uc3QgZ2VuZXJhdGVSZXF1aXJlTmFtZSA9IGdldEdlbmVyYXRlUmVxdWlyZU5hbWUoKTtcbiAgZm9yIChjb25zdCB7IHNvdXJjZSwgaWQ6IHJlc29sdmVkSWQsIGlzQ29tbW9uSlMgfSBvZiByZXF1aXJlVGFyZ2V0cykge1xuICAgIGNvbnN0IHJlcXVpcmVzID0gcmVxdWlyZXNCeVNvdXJjZVtzb3VyY2VdO1xuICAgIGNvbnN0IG5hbWUgPSBnZW5lcmF0ZVJlcXVpcmVOYW1lKHJlcXVpcmVzKTtcbiAgICBsZXQgdXNlc1JlcXVpcmVkID0gZmFsc2U7XG4gICAgbGV0IG5lZWRzSW1wb3J0ID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCB7IG5vZGUsIHVzZXNSZXR1cm5WYWx1ZSwgdG9CZVJlbW92ZWQsIGlzSW5zaWRlVHJ5QmxvY2sgfSBvZiByZXF1aXJlcykge1xuICAgICAgY29uc3QgeyBjYW5Db252ZXJ0UmVxdWlyZSwgc2hvdWxkUmVtb3ZlUmVxdWlyZSB9ID1cbiAgICAgICAgaXNJbnNpZGVUcnlCbG9jayAmJiBpc1dyYXBwZWRJZChyZXNvbHZlZElkLCBFWFRFUk5BTF9TVUZGSVgpXG4gICAgICAgICAgPyBnZXRJZ25vcmVUcnlDYXRjaFJlcXVpcmVTdGF0ZW1lbnRNb2RlKHNvdXJjZSlcbiAgICAgICAgICA6IHsgY2FuQ29udmVydFJlcXVpcmU6IHRydWUsIHNob3VsZFJlbW92ZVJlcXVpcmU6IGZhbHNlIH07XG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlUmVxdWlyZSkge1xuICAgICAgICBpZiAodXNlc1JldHVyblZhbHVlKSB7XG4gICAgICAgICAgbWFnaWNTdHJpbmcub3ZlcndyaXRlKG5vZGUuc3RhcnQsIG5vZGUuZW5kLCAndW5kZWZpbmVkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFnaWNTdHJpbmcucmVtb3ZlKHRvQmVSZW1vdmVkLnN0YXJ0LCB0b0JlUmVtb3ZlZC5lbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNhbkNvbnZlcnRSZXF1aXJlKSB7XG4gICAgICAgIG5lZWRzSW1wb3J0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlzQ29tbW9uSlMgPT09IElTX1dSQVBQRURfQ09NTU9OSlMpIHtcbiAgICAgICAgICBtYWdpY1N0cmluZy5vdmVyd3JpdGUobm9kZS5zdGFydCwgbm9kZS5lbmQsIGAke25hbWV9KClgKTtcbiAgICAgICAgfSBlbHNlIGlmICh1c2VzUmV0dXJuVmFsdWUpIHtcbiAgICAgICAgICB1c2VzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgIG1hZ2ljU3RyaW5nLm92ZXJ3cml0ZShub2RlLnN0YXJ0LCBub2RlLmVuZCwgbmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFnaWNTdHJpbmcucmVtb3ZlKHRvQmVSZW1vdmVkLnN0YXJ0LCB0b0JlUmVtb3ZlZC5lbmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuZWVkc0ltcG9ydCkge1xuICAgICAgaWYgKGlzQ29tbW9uSlMgPT09IElTX1dSQVBQRURfQ09NTU9OSlMpIHtcbiAgICAgICAgaW1wb3J0cy5wdXNoKGBpbXBvcnQgeyBfX3JlcXVpcmUgYXMgJHtuYW1lfSB9IGZyb20gJHtKU09OLnN0cmluZ2lmeShyZXNvbHZlZElkKX07YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbXBvcnRzLnB1c2goYGltcG9ydCAke3VzZXNSZXF1aXJlZCA/IGAke25hbWV9IGZyb20gYCA6ICcnfSR7SlNPTi5zdHJpbmdpZnkocmVzb2x2ZWRJZCl9O2ApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZVJlcXVpcmVOYW1lKCkge1xuICBsZXQgdWlkID0gMDtcbiAgcmV0dXJuIChyZXF1aXJlcykgPT4ge1xuICAgIGxldCBuYW1lO1xuICAgIGNvbnN0IGhhc05hbWVDb25mbGljdCA9ICh7IHNjb3BlIH0pID0+IHNjb3BlLmNvbnRhaW5zKG5hbWUpO1xuICAgIGRvIHtcbiAgICAgIG5hbWUgPSBgcmVxdWlyZSQkJHt1aWR9YDtcbiAgICAgIHVpZCArPSAxO1xuICAgIH0gd2hpbGUgKHJlcXVpcmVzLnNvbWUoaGFzTmFtZUNvbmZsaWN0KSk7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH07XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduLCBuby1zaGFkb3csIG5vLXVuZGVyc2NvcmUtZGFuZ2xlLCBuby1jb250aW51ZSAqL1xuXG5jb25zdCBleHBvcnRzUGF0dGVybiA9IC9eKD86bW9kdWxlXFwuKT9leHBvcnRzKD86XFwuKFthLXpBLVpfJF1bYS16QS1aXyQwLTldKikpPyQvO1xuXG5jb25zdCBmdW5jdGlvblR5cGUgPSAvXig/OkZ1bmN0aW9uRGVjbGFyYXRpb258RnVuY3Rpb25FeHByZXNzaW9ufEFycm93RnVuY3Rpb25FeHByZXNzaW9uKSQvO1xuXG5hc3luYyBmdW5jdGlvbiB0cmFuc2Zvcm1Db21tb25qcyhcbiAgcGFyc2UsXG4gIGNvZGUsXG4gIGlkLFxuICBpc0VzTW9kdWxlLFxuICBpZ25vcmVHbG9iYWwsXG4gIGlnbm9yZVJlcXVpcmUsXG4gIGlnbm9yZUR5bmFtaWNSZXF1aXJlcyxcbiAgZ2V0SWdub3JlVHJ5Q2F0Y2hSZXF1aXJlU3RhdGVtZW50TW9kZSxcbiAgc291cmNlTWFwLFxuICBpc0R5bmFtaWNSZXF1aXJlTW9kdWxlc0VuYWJsZWQsXG4gIGR5bmFtaWNSZXF1aXJlTW9kdWxlcyxcbiAgY29tbW9uRGlyLFxuICBhc3RDYWNoZSxcbiAgZGVmYXVsdElzTW9kdWxlRXhwb3J0cyxcbiAgbmVlZHNSZXF1aXJlV3JhcHBlcixcbiAgcmVzb2x2ZVJlcXVpcmVTb3VyY2VzQW5kVXBkYXRlTWV0YSxcbiAgaXNSZXF1aXJlZCxcbiAgY2hlY2tEeW5hbWljUmVxdWlyZSxcbiAgY29tbW9uanNNZXRhXG4pIHtcbiAgY29uc3QgYXN0ID0gYXN0Q2FjaGUgfHwgdHJ5UGFyc2UocGFyc2UsIGNvZGUsIGlkKTtcbiAgY29uc3QgbWFnaWNTdHJpbmcgPSBuZXcgTWFnaWNTdHJpbmckMShjb2RlKTtcbiAgY29uc3QgdXNlcyA9IHtcbiAgICBtb2R1bGU6IGZhbHNlLFxuICAgIGV4cG9ydHM6IGZhbHNlLFxuICAgIGdsb2JhbDogZmFsc2UsXG4gICAgcmVxdWlyZTogZmFsc2VcbiAgfTtcbiAgY29uc3QgdmlydHVhbER5bmFtaWNSZXF1aXJlUGF0aCA9XG4gICAgaXNEeW5hbWljUmVxdWlyZU1vZHVsZXNFbmFibGVkICYmIGdldFZpcnR1YWxQYXRoRm9yRHluYW1pY1JlcXVpcmVQYXRoKGRpcm5hbWUkMShpZCksIGNvbW1vbkRpcik7XG4gIGxldCBzY29wZSA9IGF0dGFjaFNjb3Blcyhhc3QsICdzY29wZScpO1xuICBsZXQgbGV4aWNhbERlcHRoID0gMDtcbiAgbGV0IHByb2dyYW1EZXB0aCA9IDA7XG4gIGxldCBjdXJyZW50VHJ5QmxvY2tFbmQgPSBudWxsO1xuICBsZXQgc2hvdWxkV3JhcCA9IGZhbHNlO1xuICBsZXQgcmVleHBvcnRzID0gZmFsc2U7XG5cbiAgY29uc3QgZ2xvYmFscyA9IG5ldyBTZXQoKTtcbiAgLy8gQSBjb25kaXRpb25hbE5vZGUgaXMgYSBub2RlIGZvciB3aGljaCBleGVjdXRpb24gaXMgbm90IGd1YXJhbnRlZWQuIElmIHN1Y2ggYSBub2RlIGlzIGEgcmVxdWlyZVxuICAvLyBvciBjb250YWlucyBuZXN0ZWQgcmVxdWlyZXMsIHRob3NlIHNob3VsZCBiZSBoYW5kbGVkIGFzIGZ1bmN0aW9uIGNhbGxzIHVubGVzcyB0aGVyZSBpcyBhblxuICAvLyB1bmNvbmRpdGlvbmFsIHJlcXVpcmUgZWxzZXdoZXJlLlxuICBsZXQgY3VycmVudENvbmRpdGlvbmFsTm9kZUVuZCA9IG51bGw7XG4gIGNvbnN0IGNvbmRpdGlvbmFsTm9kZXMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IHsgYWRkUmVxdWlyZUV4cHJlc3Npb24sIHJld3JpdGVSZXF1aXJlRXhwcmVzc2lvbnNBbmRHZXRJbXBvcnRCbG9jayB9ID0gZ2V0UmVxdWlyZUhhbmRsZXJzKCk7XG5cbiAgLy8gU2VlIHdoaWNoIG5hbWVzIGFyZSBhc3NpZ25lZCB0by4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gcHJldmVudFxuICAvLyBpbGxlZ2FsbHkgcmVwbGFjaW5nIGB2YXIgZm9vID0gcmVxdWlyZSgnZm9vJylgIHdpdGggYGltcG9ydCBmb28gZnJvbSAnZm9vJ2AsXG4gIC8vIHdoZXJlIGBmb29gIGlzIGxhdGVyIHJlYXNzaWduZWQuIChUaGlzIGhhcHBlbnMgaW4gdGhlIHdpbGQuIENvbW1vbkpTLCBzaWdoKVxuICBjb25zdCByZWFzc2lnbmVkTmFtZXMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IHRvcExldmVsRGVjbGFyYXRpb25zID0gW107XG4gIGNvbnN0IHNraXBwZWROb2RlcyA9IG5ldyBTZXQoKTtcbiAgY29uc3QgbW9kdWxlQWNjZXNzU2NvcGVzID0gbmV3IFNldChbc2NvcGVdKTtcbiAgY29uc3QgZXhwb3J0c0FjY2Vzc1Njb3BlcyA9IG5ldyBTZXQoW3Njb3BlXSk7XG4gIGNvbnN0IG1vZHVsZUV4cG9ydHNBc3NpZ25tZW50cyA9IFtdO1xuICBsZXQgZmlyc3RUb3BMZXZlbE1vZHVsZUV4cG9ydHNBc3NpZ25tZW50ID0gbnVsbDtcbiAgY29uc3QgZXhwb3J0c0Fzc2lnbm1lbnRzQnlOYW1lID0gbmV3IE1hcCgpO1xuICBjb25zdCB0b3BMZXZlbEFzc2lnbm1lbnRzID0gbmV3IFNldCgpO1xuICBjb25zdCB0b3BMZXZlbERlZmluZUNvbXBpbGVkRXNtRXhwcmVzc2lvbnMgPSBbXTtcbiAgY29uc3QgcmVwbGFjZWRHbG9iYWwgPSBbXTtcbiAgY29uc3QgcmVwbGFjZWREeW5hbWljUmVxdWlyZXMgPSBbXTtcbiAgY29uc3QgaW1wb3J0ZWRWYXJpYWJsZXMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGluZGVudEV4Y2x1c2lvblJhbmdlcyA9IFtdO1xuXG4gIHdhbGskMyhhc3QsIHtcbiAgICBlbnRlcihub2RlLCBwYXJlbnQpIHtcbiAgICAgIGlmIChza2lwcGVkTm9kZXMuaGFzKG5vZGUpKSB7XG4gICAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50VHJ5QmxvY2tFbmQgIT09IG51bGwgJiYgbm9kZS5zdGFydCA+IGN1cnJlbnRUcnlCbG9ja0VuZCkge1xuICAgICAgICBjdXJyZW50VHJ5QmxvY2tFbmQgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRDb25kaXRpb25hbE5vZGVFbmQgIT09IG51bGwgJiYgbm9kZS5zdGFydCA+IGN1cnJlbnRDb25kaXRpb25hbE5vZGVFbmQpIHtcbiAgICAgICAgY3VycmVudENvbmRpdGlvbmFsTm9kZUVuZCA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudENvbmRpdGlvbmFsTm9kZUVuZCA9PT0gbnVsbCAmJiBjb25kaXRpb25hbE5vZGVzLmhhcyhub2RlKSkge1xuICAgICAgICBjdXJyZW50Q29uZGl0aW9uYWxOb2RlRW5kID0gbm9kZS5lbmQ7XG4gICAgICB9XG5cbiAgICAgIHByb2dyYW1EZXB0aCArPSAxO1xuICAgICAgaWYgKG5vZGUuc2NvcGUpICh7IHNjb3BlIH0gPSBub2RlKTtcbiAgICAgIGlmIChmdW5jdGlvblR5cGUudGVzdChub2RlLnR5cGUpKSBsZXhpY2FsRGVwdGggKz0gMTtcbiAgICAgIGlmIChzb3VyY2VNYXApIHtcbiAgICAgICAgbWFnaWNTdHJpbmcuYWRkU291cmNlbWFwTG9jYXRpb24obm9kZS5zdGFydCk7XG4gICAgICAgIG1hZ2ljU3RyaW5nLmFkZFNvdXJjZW1hcExvY2F0aW9uKG5vZGUuZW5kKTtcbiAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlZmF1bHQtY2FzZVxuICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQXNzaWdubWVudEV4cHJlc3Npb24nOlxuICAgICAgICAgIGlmIChub2RlLmxlZnQudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuZWQgPSBnZXRLZXlwYXRoKG5vZGUubGVmdCk7XG4gICAgICAgICAgICBpZiAoIWZsYXR0ZW5lZCB8fCBzY29wZS5jb250YWlucyhmbGF0dGVuZWQubmFtZSkpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgZXhwb3J0c1BhdHRlcm5NYXRjaCA9IGV4cG9ydHNQYXR0ZXJuLmV4ZWMoZmxhdHRlbmVkLmtleXBhdGgpO1xuICAgICAgICAgICAgaWYgKCFleHBvcnRzUGF0dGVybk1hdGNoIHx8IGZsYXR0ZW5lZC5rZXlwYXRoID09PSAnZXhwb3J0cycpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgWywgZXhwb3J0TmFtZV0gPSBleHBvcnRzUGF0dGVybk1hdGNoO1xuICAgICAgICAgICAgdXNlc1tmbGF0dGVuZWQubmFtZV0gPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyB3ZSdyZSBkZWFsaW5nIHdpdGggYG1vZHVsZS5leHBvcnRzID0gLi4uYCBvciBgW21vZHVsZS5dZXhwb3J0cy5mb28gPSAuLi5gIFx1MjAxM1xuICAgICAgICAgICAgaWYgKGZsYXR0ZW5lZC5rZXlwYXRoID09PSAnbW9kdWxlLmV4cG9ydHMnKSB7XG4gICAgICAgICAgICAgIG1vZHVsZUV4cG9ydHNBc3NpZ25tZW50cy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICBpZiAocHJvZ3JhbURlcHRoID4gMykge1xuICAgICAgICAgICAgICAgIG1vZHVsZUFjY2Vzc1Njb3Blcy5hZGQoc2NvcGUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaXJzdFRvcExldmVsTW9kdWxlRXhwb3J0c0Fzc2lnbm1lbnQpIHtcbiAgICAgICAgICAgICAgICBmaXJzdFRvcExldmVsTW9kdWxlRXhwb3J0c0Fzc2lnbm1lbnQgPSBub2RlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGRlZmF1bHRJc01vZHVsZUV4cG9ydHMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgc2hvdWxkV3JhcCA9IHRydWU7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdElzTW9kdWxlRXhwb3J0cyA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucmlnaHQudHlwZSA9PT0gJ09iamVjdEV4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaGFzRGVmaW5lRXNtUHJvcGVydHkobm9kZS5yaWdodCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkV3JhcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JlcXVpcmVFeHByZXNzaW9uKG5vZGUucmlnaHQsIHNjb3BlKSkge1xuICAgICAgICAgICAgICAgICAgc2hvdWxkV3JhcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICByZWV4cG9ydHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChleHBvcnROYW1lID09PSBLRVlfQ09NUElMRURfRVNNKSB7XG4gICAgICAgICAgICAgIGlmIChwcm9ncmFtRGVwdGggPiAzKSB7XG4gICAgICAgICAgICAgICAgc2hvdWxkV3JhcCA9IHRydWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9wTGV2ZWxEZWZpbmVDb21waWxlZEVzbUV4cHJlc3Npb25zLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4cG9ydHNBc3NpZ25tZW50cyA9IGV4cG9ydHNBc3NpZ25tZW50c0J5TmFtZS5nZXQoZXhwb3J0TmFtZSkgfHwge1xuICAgICAgICAgICAgICAgIG5vZGVzOiBbXSxcbiAgICAgICAgICAgICAgICBzY29wZXM6IG5ldyBTZXQoKVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBleHBvcnRzQXNzaWdubWVudHMubm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgZXhwb3J0c0Fzc2lnbm1lbnRzLnNjb3Blcy5hZGQoc2NvcGUpO1xuICAgICAgICAgICAgICBleHBvcnRzQWNjZXNzU2NvcGVzLmFkZChzY29wZSk7XG4gICAgICAgICAgICAgIGV4cG9ydHNBc3NpZ25tZW50c0J5TmFtZS5zZXQoZXhwb3J0TmFtZSwgZXhwb3J0c0Fzc2lnbm1lbnRzKTtcbiAgICAgICAgICAgICAgaWYgKHByb2dyYW1EZXB0aCA8PSAzKSB7XG4gICAgICAgICAgICAgICAgdG9wTGV2ZWxBc3NpZ25tZW50cy5hZGQobm9kZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2tpcHBlZE5vZGVzLmFkZChub2RlLmxlZnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgZXh0cmFjdEFzc2lnbmVkTmFtZXMobm9kZS5sZWZ0KSkge1xuICAgICAgICAgICAgICByZWFzc2lnbmVkTmFtZXMuYWRkKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ0NhbGxFeHByZXNzaW9uJzoge1xuICAgICAgICAgIGlmIChpc0RlZmluZUNvbXBpbGVkRXNtKG5vZGUpKSB7XG4gICAgICAgICAgICBpZiAocHJvZ3JhbURlcHRoID09PSAzICYmIHBhcmVudC50eXBlID09PSAnRXhwcmVzc2lvblN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcCBzcGVjaWFsIGhhbmRsaW5nIGZvciBbbW9kdWxlLl1leHBvcnRzIHVudGlsIHdlIGtub3cgd2UgcmVuZGVyIHRoaXNcbiAgICAgICAgICAgICAgc2tpcHBlZE5vZGVzLmFkZChub2RlLmFyZ3VtZW50c1swXSk7XG4gICAgICAgICAgICAgIHRvcExldmVsRGVmaW5lQ29tcGlsZWRFc21FeHByZXNzaW9ucy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2hvdWxkV3JhcCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVHJhbnNmb3JtIHJlcXVpcmUucmVzb2x2ZVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzRHluYW1pY1JlcXVpcmVNb2R1bGVzRW5hYmxlZCAmJlxuICAgICAgICAgICAgbm9kZS5jYWxsZWUub2JqZWN0ICYmXG4gICAgICAgICAgICBpc1JlcXVpcmUobm9kZS5jYWxsZWUub2JqZWN0LCBzY29wZSkgJiZcbiAgICAgICAgICAgIG5vZGUuY2FsbGVlLnByb3BlcnR5Lm5hbWUgPT09ICdyZXNvbHZlJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgY2hlY2tEeW5hbWljUmVxdWlyZShub2RlLnN0YXJ0KTtcbiAgICAgICAgICAgIHVzZXMucmVxdWlyZSA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlTm9kZSA9IG5vZGUuY2FsbGVlLm9iamVjdDtcbiAgICAgICAgICAgIHJlcGxhY2VkRHluYW1pY1JlcXVpcmVzLnB1c2gocmVxdWlyZU5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghaXNSZXF1aXJlRXhwcmVzc2lvbihub2RlLCBzY29wZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleXBhdGggPSBnZXRLZXlwYXRoKG5vZGUuY2FsbGVlKTtcbiAgICAgICAgICAgIGlmIChrZXlwYXRoICYmIGltcG9ydGVkVmFyaWFibGVzLmhhcyhrZXlwYXRoLm5hbWUpKSB7XG4gICAgICAgICAgICAgIC8vIEhldXJpc3RpYyB0byBkZW9wdGltaXplIHJlcXVpcmVzIGFmdGVyIGEgcmVxdWlyZWQgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkXG4gICAgICAgICAgICAgIGN1cnJlbnRDb25kaXRpb25hbE5vZGVFbmQgPSBJbmZpbml0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBza2lwcGVkTm9kZXMuYWRkKG5vZGUuY2FsbGVlKTtcbiAgICAgICAgICB1c2VzLnJlcXVpcmUgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKGhhc0R5bmFtaWNBcmd1bWVudHMobm9kZSkpIHtcbiAgICAgICAgICAgIGlmIChpc0R5bmFtaWNSZXF1aXJlTW9kdWxlc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgY2hlY2tEeW5hbWljUmVxdWlyZShub2RlLnN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaWdub3JlRHluYW1pY1JlcXVpcmVzKSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VkRHluYW1pY1JlcXVpcmVzLnB1c2gobm9kZS5jYWxsZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlcXVpcmVTdHJpbmdBcmcgPSBnZXRSZXF1aXJlU3RyaW5nQXJnKG5vZGUpO1xuICAgICAgICAgIGlmICghaWdub3JlUmVxdWlyZShyZXF1aXJlU3RyaW5nQXJnKSkge1xuICAgICAgICAgICAgY29uc3QgdXNlc1JldHVyblZhbHVlID0gcGFyZW50LnR5cGUgIT09ICdFeHByZXNzaW9uU3RhdGVtZW50JztcbiAgICAgICAgICAgIGNvbnN0IHRvQmVSZW1vdmVkID1cbiAgICAgICAgICAgICAgcGFyZW50LnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50JyAmJlxuICAgICAgICAgICAgICAoIWN1cnJlbnRDb25kaXRpb25hbE5vZGVFbmQgfHxcbiAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgY29tcGxldGVseSByZW1vdmUgcmVxdWlyZXMgZGlyZWN0bHkgaW4gYSB0cnktY2F0Y2hcbiAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IFJvbGx1cCBjYW4gcmVtb3ZlIHVwIHRoZSB0cnktY2F0Y2hcbiAgICAgICAgICAgICAgICAoY3VycmVudFRyeUJsb2NrRW5kICE9PSBudWxsICYmIGN1cnJlbnRUcnlCbG9ja0VuZCA8IGN1cnJlbnRDb25kaXRpb25hbE5vZGVFbmQpKVxuICAgICAgICAgICAgICAgID8gcGFyZW50XG4gICAgICAgICAgICAgICAgOiBub2RlO1xuICAgICAgICAgICAgYWRkUmVxdWlyZUV4cHJlc3Npb24oXG4gICAgICAgICAgICAgIHJlcXVpcmVTdHJpbmdBcmcsXG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgICB1c2VzUmV0dXJuVmFsdWUsXG4gICAgICAgICAgICAgIGN1cnJlbnRUcnlCbG9ja0VuZCAhPT0gbnVsbCxcbiAgICAgICAgICAgICAgY3VycmVudENvbmRpdGlvbmFsTm9kZUVuZCAhPT0gbnVsbCxcbiAgICAgICAgICAgICAgdG9CZVJlbW92ZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0b3InICYmIHBhcmVudC5pZC50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIGV4dHJhY3RBc3NpZ25lZE5hbWVzKHBhcmVudC5pZCkpIHtcbiAgICAgICAgICAgICAgICBpbXBvcnRlZFZhcmlhYmxlcy5hZGQobmFtZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbic6XG4gICAgICAgIGNhc2UgJ0lmU3RhdGVtZW50JzpcbiAgICAgICAgICAvLyBza2lwIGRlYWQgYnJhbmNoZXNcbiAgICAgICAgICBpZiAoaXNGYWxzeShub2RlLnRlc3QpKSB7XG4gICAgICAgICAgICBza2lwcGVkTm9kZXMuYWRkKG5vZGUuY29uc2VxdWVudCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1RydXRoeShub2RlLnRlc3QpKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5hbHRlcm5hdGUpIHtcbiAgICAgICAgICAgICAgc2tpcHBlZE5vZGVzLmFkZChub2RlLmFsdGVybmF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsTm9kZXMuYWRkKG5vZGUuY29uc2VxdWVudCk7XG4gICAgICAgICAgICBpZiAobm9kZS5hbHRlcm5hdGUpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxOb2Rlcy5hZGQobm9kZS5hbHRlcm5hdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJzpcbiAgICAgICAgY2FzZSAnRnVuY3Rpb25EZWNsYXJhdGlvbic6XG4gICAgICAgIGNhc2UgJ0Z1bmN0aW9uRXhwcmVzc2lvbic6XG4gICAgICAgICAgLy8gcmVxdWlyZXMgaW4gZnVuY3Rpb25zIHNob3VsZCBiZSBjb25kaXRpb25hbCB1bmxlc3MgaXQgaXMgYW4gSUlGRVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGN1cnJlbnRDb25kaXRpb25hbE5vZGVFbmQgPT09IG51bGwgJiZcbiAgICAgICAgICAgICEocGFyZW50LnR5cGUgPT09ICdDYWxsRXhwcmVzc2lvbicgJiYgcGFyZW50LmNhbGxlZSA9PT0gbm9kZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb25kaXRpb25hbE5vZGVFbmQgPSBub2RlLmVuZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdJZGVudGlmaWVyJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gbm9kZTtcbiAgICAgICAgICBpZiAoIWlzUmVmZXJlbmNlKG5vZGUsIHBhcmVudCkgfHwgc2NvcGUuY29udGFpbnMobmFtZSkpIHJldHVybjtcbiAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3JlcXVpcmUnOlxuICAgICAgICAgICAgICB1c2VzLnJlcXVpcmUgPSB0cnVlO1xuICAgICAgICAgICAgICBpZiAoaXNOb2RlUmVxdWlyZVByb3BlcnR5QWNjZXNzKHBhcmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFpZ25vcmVEeW5hbWljUmVxdWlyZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNTaG9ydGhhbmRQcm9wZXJ0eShwYXJlbnQpKSB7XG4gICAgICAgICAgICAgICAgICBtYWdpY1N0cmluZy5wcmVwZW5kUmlnaHQobm9kZS5zdGFydCwgJ3JlcXVpcmU6ICcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXBsYWNlZER5bmFtaWNSZXF1aXJlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ21vZHVsZSc6XG4gICAgICAgICAgICBjYXNlICdleHBvcnRzJzpcbiAgICAgICAgICAgICAgc2hvdWxkV3JhcCA9IHRydWU7XG4gICAgICAgICAgICAgIHVzZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlICdnbG9iYWwnOlxuICAgICAgICAgICAgICB1c2VzLmdsb2JhbCA9IHRydWU7XG4gICAgICAgICAgICAgIGlmICghaWdub3JlR2xvYmFsKSB7XG4gICAgICAgICAgICAgICAgcmVwbGFjZWRHbG9iYWwucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlICdkZWZpbmUnOlxuICAgICAgICAgICAgICBtYWdpY1N0cmluZy5vdmVyd3JpdGUobm9kZS5zdGFydCwgbm9kZS5lbmQsICd1bmRlZmluZWQnLCB7XG4gICAgICAgICAgICAgICAgc3RvcmVOYW1lOiB0cnVlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBnbG9iYWxzLmFkZChuYW1lKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlICdMb2dpY2FsRXhwcmVzc2lvbic6XG4gICAgICAgICAgLy8gc2tpcCBkZWFkIGJyYW5jaGVzXG4gICAgICAgICAgaWYgKG5vZGUub3BlcmF0b3IgPT09ICcmJicpIHtcbiAgICAgICAgICAgIGlmIChpc0ZhbHN5KG5vZGUubGVmdCkpIHtcbiAgICAgICAgICAgICAgc2tpcHBlZE5vZGVzLmFkZChub2RlLnJpZ2h0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzVHJ1dGh5KG5vZGUubGVmdCkpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxOb2Rlcy5hZGQobm9kZS5yaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChub2RlLm9wZXJhdG9yID09PSAnfHwnKSB7XG4gICAgICAgICAgICBpZiAoaXNUcnV0aHkobm9kZS5sZWZ0KSkge1xuICAgICAgICAgICAgICBza2lwcGVkTm9kZXMuYWRkKG5vZGUucmlnaHQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNGYWxzeShub2RlLmxlZnQpKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsTm9kZXMuYWRkKG5vZGUucmlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ01lbWJlckV4cHJlc3Npb24nOlxuICAgICAgICAgIGlmICghaXNEeW5hbWljUmVxdWlyZU1vZHVsZXNFbmFibGVkICYmIGlzTW9kdWxlUmVxdWlyZShub2RlLCBzY29wZSkpIHtcbiAgICAgICAgICAgIHVzZXMucmVxdWlyZSA9IHRydWU7XG4gICAgICAgICAgICByZXBsYWNlZER5bmFtaWNSZXF1aXJlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgc2tpcHBlZE5vZGVzLmFkZChub2RlLm9iamVjdCk7XG4gICAgICAgICAgICBza2lwcGVkTm9kZXMuYWRkKG5vZGUucHJvcGVydHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ1JldHVyblN0YXRlbWVudCc6XG4gICAgICAgICAgLy8gaWYgdG9wLWxldmVsIHJldHVybiwgd2UgbmVlZCB0byB3cmFwIGl0XG4gICAgICAgICAgaWYgKGxleGljYWxEZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgc2hvdWxkV3JhcCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSAnVGhpc0V4cHJlc3Npb24nOlxuICAgICAgICAgIC8vIHJld3JpdGUgdG9wLWxldmVsIGB0aGlzYCBhcyBgY29tbW9uanNIZWxwZXJzLmNvbW1vbmpzR2xvYmFsYFxuICAgICAgICAgIGlmIChsZXhpY2FsRGVwdGggPT09IDApIHtcbiAgICAgICAgICAgIHVzZXMuZ2xvYmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghaWdub3JlR2xvYmFsKSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VkR2xvYmFsLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSAnVHJ5U3RhdGVtZW50JzpcbiAgICAgICAgICBpZiAoY3VycmVudFRyeUJsb2NrRW5kID09PSBudWxsKSB7XG4gICAgICAgICAgICBjdXJyZW50VHJ5QmxvY2tFbmQgPSBub2RlLmJsb2NrLmVuZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnRDb25kaXRpb25hbE5vZGVFbmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDb25kaXRpb25hbE5vZGVFbmQgPSBub2RlLmVuZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdVbmFyeUV4cHJlc3Npb24nOlxuICAgICAgICAgIC8vIHJld3JpdGUgYHR5cGVvZiBtb2R1bGVgLCBgdHlwZW9mIG1vZHVsZS5leHBvcnRzYCBhbmQgYHR5cGVvZiBleHBvcnRzYCAoaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9yb2xsdXAtcGx1Z2luLWNvbW1vbmpzL2lzc3Vlcy8xNTEpXG4gICAgICAgICAgaWYgKG5vZGUub3BlcmF0b3IgPT09ICd0eXBlb2YnKSB7XG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuZWQgPSBnZXRLZXlwYXRoKG5vZGUuYXJndW1lbnQpO1xuICAgICAgICAgICAgaWYgKCFmbGF0dGVuZWQpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKHNjb3BlLmNvbnRhaW5zKGZsYXR0ZW5lZC5uYW1lKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFpc0VzTW9kdWxlICYmXG4gICAgICAgICAgICAgIChmbGF0dGVuZWQua2V5cGF0aCA9PT0gJ21vZHVsZS5leHBvcnRzJyB8fFxuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5rZXlwYXRoID09PSAnbW9kdWxlJyB8fFxuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5rZXlwYXRoID09PSAnZXhwb3J0cycpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgbWFnaWNTdHJpbmcub3ZlcndyaXRlKG5vZGUuc3RhcnQsIG5vZGUuZW5kLCBgJ29iamVjdCdgLCB7XG4gICAgICAgICAgICAgICAgc3RvcmVOYW1lOiBmYWxzZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdWYXJpYWJsZURlY2xhcmF0aW9uJzpcbiAgICAgICAgICBpZiAoIXNjb3BlLnBhcmVudCkge1xuICAgICAgICAgICAgdG9wTGV2ZWxEZWNsYXJhdGlvbnMucHVzaChub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdUZW1wbGF0ZUVsZW1lbnQnOlxuICAgICAgICAgIGlmIChub2RlLnZhbHVlLnJhdy5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgICAgICAgIGluZGVudEV4Y2x1c2lvblJhbmdlcy5wdXNoKFtub2RlLnN0YXJ0LCBub2RlLmVuZF0pO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbGVhdmUobm9kZSkge1xuICAgICAgcHJvZ3JhbURlcHRoIC09IDE7XG4gICAgICBpZiAobm9kZS5zY29wZSkgc2NvcGUgPSBzY29wZS5wYXJlbnQ7XG4gICAgICBpZiAoZnVuY3Rpb25UeXBlLnRlc3Qobm9kZS50eXBlKSkgbGV4aWNhbERlcHRoIC09IDE7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBuYW1lQmFzZSA9IGdldE5hbWUoaWQpO1xuICBjb25zdCBleHBvcnRzTmFtZSA9IGRlY29uZmxpY3QoWy4uLmV4cG9ydHNBY2Nlc3NTY29wZXNdLCBnbG9iYWxzLCBuYW1lQmFzZSk7XG4gIGNvbnN0IG1vZHVsZU5hbWUgPSBkZWNvbmZsaWN0KFsuLi5tb2R1bGVBY2Nlc3NTY29wZXNdLCBnbG9iYWxzLCBgJHtuYW1lQmFzZX1Nb2R1bGVgKTtcbiAgY29uc3QgcmVxdWlyZU5hbWUgPSBkZWNvbmZsaWN0KFtzY29wZV0sIGdsb2JhbHMsIGByZXF1aXJlJHtjYXBpdGFsaXplKG5hbWVCYXNlKX1gKTtcbiAgY29uc3QgaXNSZXF1aXJlZE5hbWUgPSBkZWNvbmZsaWN0KFtzY29wZV0sIGdsb2JhbHMsIGBoYXNSZXF1aXJlZCR7Y2FwaXRhbGl6ZShuYW1lQmFzZSl9YCk7XG4gIGNvbnN0IGhlbHBlcnNOYW1lID0gZGVjb25mbGljdChbc2NvcGVdLCBnbG9iYWxzLCAnY29tbW9uanNIZWxwZXJzJyk7XG4gIGNvbnN0IGR5bmFtaWNSZXF1aXJlTmFtZSA9XG4gICAgcmVwbGFjZWREeW5hbWljUmVxdWlyZXMubGVuZ3RoID4gMCAmJlxuICAgIGRlY29uZmxpY3QoXG4gICAgICBbc2NvcGVdLFxuICAgICAgZ2xvYmFscyxcbiAgICAgIGlzRHluYW1pY1JlcXVpcmVNb2R1bGVzRW5hYmxlZCA/IENSRUFURV9DT01NT05KU19SRVFVSVJFX0VYUE9SVCA6IENPTU1PTkpTX1JFUVVJUkVfRVhQT1JUXG4gICAgKTtcbiAgY29uc3QgZGVjb25mbGljdGVkRXhwb3J0TmFtZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKGNvbnN0IFtleHBvcnROYW1lLCB7IHNjb3BlcyB9XSBvZiBleHBvcnRzQXNzaWdubWVudHNCeU5hbWUpIHtcbiAgICBkZWNvbmZsaWN0ZWRFeHBvcnROYW1lc1tleHBvcnROYW1lXSA9IGRlY29uZmxpY3QoWy4uLnNjb3Blc10sIGdsb2JhbHMsIGV4cG9ydE5hbWUpO1xuICB9XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIHJlcGxhY2VkR2xvYmFsKSB7XG4gICAgbWFnaWNTdHJpbmcub3ZlcndyaXRlKG5vZGUuc3RhcnQsIG5vZGUuZW5kLCBgJHtoZWxwZXJzTmFtZX0uY29tbW9uanNHbG9iYWxgLCB7XG4gICAgICBzdG9yZU5hbWU6IHRydWVcbiAgICB9KTtcbiAgfVxuICBmb3IgKGNvbnN0IG5vZGUgb2YgcmVwbGFjZWREeW5hbWljUmVxdWlyZXMpIHtcbiAgICBtYWdpY1N0cmluZy5vdmVyd3JpdGUoXG4gICAgICBub2RlLnN0YXJ0LFxuICAgICAgbm9kZS5lbmQsXG4gICAgICBpc0R5bmFtaWNSZXF1aXJlTW9kdWxlc0VuYWJsZWRcbiAgICAgICAgPyBgJHtkeW5hbWljUmVxdWlyZU5hbWV9KCR7SlNPTi5zdHJpbmdpZnkodmlydHVhbER5bmFtaWNSZXF1aXJlUGF0aCl9KWBcbiAgICAgICAgOiBkeW5hbWljUmVxdWlyZU5hbWUsXG4gICAgICB7XG4gICAgICAgIGNvbnRlbnRPbmx5OiB0cnVlLFxuICAgICAgICBzdG9yZU5hbWU6IHRydWVcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLy8gV2UgY2Fubm90IHdyYXAgRVMvbWl4ZWQgbW9kdWxlc1xuICBzaG91bGRXcmFwID0gIWlzRXNNb2R1bGUgJiYgKHNob3VsZFdyYXAgfHwgKHVzZXMuZXhwb3J0cyAmJiBtb2R1bGVFeHBvcnRzQXNzaWdubWVudHMubGVuZ3RoID4gMCkpO1xuICBjb25zdCBkZXRlY3RXcmFwcGVkRGVmYXVsdCA9XG4gICAgc2hvdWxkV3JhcCAmJlxuICAgIChyZWV4cG9ydHMgfHxcbiAgICAgIHRvcExldmVsRGVmaW5lQ29tcGlsZWRFc21FeHByZXNzaW9ucy5sZW5ndGggPiAwIHx8XG4gICAgICBjb2RlLmluZGV4T2YoJ19fZXNNb2R1bGUnKSA+PSAwKTtcblxuICBpZiAoXG4gICAgIShcbiAgICAgIHNob3VsZFdyYXAgfHxcbiAgICAgIGlzUmVxdWlyZWQgfHxcbiAgICAgIG5lZWRzUmVxdWlyZVdyYXBwZXIgfHxcbiAgICAgIHVzZXMubW9kdWxlIHx8XG4gICAgICB1c2VzLmV4cG9ydHMgfHxcbiAgICAgIHVzZXMucmVxdWlyZSB8fFxuICAgICAgdG9wTGV2ZWxEZWZpbmVDb21waWxlZEVzbUV4cHJlc3Npb25zLmxlbmd0aCA+IDBcbiAgICApICYmXG4gICAgKGlnbm9yZUdsb2JhbCB8fCAhdXNlcy5nbG9iYWwpXG4gICkge1xuICAgIHJldHVybiB7IG1ldGE6IHsgY29tbW9uanM6IHsgaXNDb21tb25KUzogZmFsc2UgfSB9IH07XG4gIH1cblxuICBsZXQgbGVhZGluZ0NvbW1lbnQgPSAnJztcbiAgaWYgKGNvZGUuc3RhcnRzV2l0aCgnLyonKSkge1xuICAgIGNvbnN0IGNvbW1lbnRFbmQgPSBjb2RlLmluZGV4T2YoJyovJywgMikgKyAyO1xuICAgIGxlYWRpbmdDb21tZW50ID0gYCR7Y29kZS5zbGljZSgwLCBjb21tZW50RW5kKX1cXG5gO1xuICAgIG1hZ2ljU3RyaW5nLnJlbW92ZSgwLCBjb21tZW50RW5kKS50cmltKCk7XG4gIH1cblxuICBjb25zdCBleHBvcnRNb2RlID0gaXNFc01vZHVsZVxuICAgID8gJ25vbmUnXG4gICAgOiBzaG91bGRXcmFwXG4gICAgPyB1c2VzLm1vZHVsZVxuICAgICAgPyAnbW9kdWxlJ1xuICAgICAgOiAnZXhwb3J0cydcbiAgICA6IGZpcnN0VG9wTGV2ZWxNb2R1bGVFeHBvcnRzQXNzaWdubWVudFxuICAgID8gZXhwb3J0c0Fzc2lnbm1lbnRzQnlOYW1lLnNpemUgPT09IDAgJiYgdG9wTGV2ZWxEZWZpbmVDb21waWxlZEVzbUV4cHJlc3Npb25zLmxlbmd0aCA9PT0gMFxuICAgICAgPyAncmVwbGFjZSdcbiAgICAgIDogJ21vZHVsZSdcbiAgICA6IG1vZHVsZUV4cG9ydHNBc3NpZ25tZW50cy5sZW5ndGggPT09IDBcbiAgICA/ICdleHBvcnRzJ1xuICAgIDogJ21vZHVsZSc7XG5cbiAgY29uc3QgaW1wb3J0QmxvY2sgPSBhd2FpdCByZXdyaXRlUmVxdWlyZUV4cHJlc3Npb25zQW5kR2V0SW1wb3J0QmxvY2soXG4gICAgbWFnaWNTdHJpbmcsXG4gICAgdG9wTGV2ZWxEZWNsYXJhdGlvbnMsXG4gICAgcmVhc3NpZ25lZE5hbWVzLFxuICAgIGhlbHBlcnNOYW1lLFxuICAgIGR5bmFtaWNSZXF1aXJlTmFtZSxcbiAgICBtb2R1bGVOYW1lLFxuICAgIGV4cG9ydHNOYW1lLFxuICAgIGlkLFxuICAgIGV4cG9ydE1vZGUsXG4gICAgcmVzb2x2ZVJlcXVpcmVTb3VyY2VzQW5kVXBkYXRlTWV0YSxcbiAgICBuZWVkc1JlcXVpcmVXcmFwcGVyLFxuICAgIGlzRXNNb2R1bGUsXG4gICAgaXNEeW5hbWljUmVxdWlyZU1vZHVsZXNFbmFibGVkLFxuICAgIGdldElnbm9yZVRyeUNhdGNoUmVxdWlyZVN0YXRlbWVudE1vZGUsXG4gICAgY29tbW9uanNNZXRhXG4gICk7XG4gIGNvbnN0IHVzZXNSZXF1aXJlV3JhcHBlciA9IGNvbW1vbmpzTWV0YS5pc0NvbW1vbkpTID09PSBJU19XUkFQUEVEX0NPTU1PTkpTO1xuICBjb25zdCBleHBvcnRCbG9jayA9IGlzRXNNb2R1bGVcbiAgICA/ICcnXG4gICAgOiByZXdyaXRlRXhwb3J0c0FuZEdldEV4cG9ydHNCbG9jayhcbiAgICAgICAgbWFnaWNTdHJpbmcsXG4gICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgIGV4cG9ydHNOYW1lLFxuICAgICAgICBzaG91bGRXcmFwLFxuICAgICAgICBtb2R1bGVFeHBvcnRzQXNzaWdubWVudHMsXG4gICAgICAgIGZpcnN0VG9wTGV2ZWxNb2R1bGVFeHBvcnRzQXNzaWdubWVudCxcbiAgICAgICAgZXhwb3J0c0Fzc2lnbm1lbnRzQnlOYW1lLFxuICAgICAgICB0b3BMZXZlbEFzc2lnbm1lbnRzLFxuICAgICAgICB0b3BMZXZlbERlZmluZUNvbXBpbGVkRXNtRXhwcmVzc2lvbnMsXG4gICAgICAgIGRlY29uZmxpY3RlZEV4cG9ydE5hbWVzLFxuICAgICAgICBjb2RlLFxuICAgICAgICBoZWxwZXJzTmFtZSxcbiAgICAgICAgZXhwb3J0TW9kZSxcbiAgICAgICAgZGV0ZWN0V3JhcHBlZERlZmF1bHQsXG4gICAgICAgIGRlZmF1bHRJc01vZHVsZUV4cG9ydHMsXG4gICAgICAgIHVzZXNSZXF1aXJlV3JhcHBlcixcbiAgICAgICAgcmVxdWlyZU5hbWVcbiAgICAgICk7XG5cbiAgaWYgKHNob3VsZFdyYXApIHtcbiAgICB3cmFwQ29kZShtYWdpY1N0cmluZywgdXNlcywgbW9kdWxlTmFtZSwgZXhwb3J0c05hbWUsIGluZGVudEV4Y2x1c2lvblJhbmdlcyk7XG4gIH1cblxuICBpZiAodXNlc1JlcXVpcmVXcmFwcGVyKSB7XG4gICAgbWFnaWNTdHJpbmcudHJpbSgpLmluZGVudCgnXFx0Jywge1xuICAgICAgZXhjbHVkZTogaW5kZW50RXhjbHVzaW9uUmFuZ2VzXG4gICAgfSk7XG4gICAgbWFnaWNTdHJpbmcucHJlcGVuZChcbiAgICAgIGB2YXIgJHtpc1JlcXVpcmVkTmFtZX07XG5cbmZ1bmN0aW9uICR7cmVxdWlyZU5hbWV9ICgpIHtcblxcdGlmICgke2lzUmVxdWlyZWROYW1lfSkgcmV0dXJuICR7ZXhwb3J0c05hbWV9O1xuXFx0JHtpc1JlcXVpcmVkTmFtZX0gPSAxO1xuYFxuICAgICkuYXBwZW5kKGBcblxcdHJldHVybiAke2V4cG9ydHNOYW1lfTtcbn1gKTtcbiAgICBpZiAoZXhwb3J0TW9kZSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICBtYWdpY1N0cmluZy5wcmVwZW5kKGB2YXIgJHtleHBvcnRzTmFtZX07XFxuYCk7XG4gICAgfVxuICB9XG5cbiAgbWFnaWNTdHJpbmdcbiAgICAudHJpbSgpXG4gICAgLnByZXBlbmQobGVhZGluZ0NvbW1lbnQgKyBpbXBvcnRCbG9jaylcbiAgICAuYXBwZW5kKGV4cG9ydEJsb2NrKTtcblxuICByZXR1cm4ge1xuICAgIGNvZGU6IG1hZ2ljU3RyaW5nLnRvU3RyaW5nKCksXG4gICAgbWFwOiBzb3VyY2VNYXAgPyBtYWdpY1N0cmluZy5nZW5lcmF0ZU1hcCgpIDogbnVsbCxcbiAgICBzeW50aGV0aWNOYW1lZEV4cG9ydHM6IGlzRXNNb2R1bGUgfHwgdXNlc1JlcXVpcmVXcmFwcGVyID8gZmFsc2UgOiAnX19tb2R1bGVFeHBvcnRzJyxcbiAgICBtZXRhOiB7IGNvbW1vbmpzOiBjb21tb25qc01ldGEgfVxuICB9O1xufVxuXG5jb25zdCBQTFVHSU5fTkFNRSA9ICdjb21tb25qcyc7XG5cbmZ1bmN0aW9uIGNvbW1vbmpzKG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgaWdub3JlR2xvYmFsLFxuICAgIGlnbm9yZUR5bmFtaWNSZXF1aXJlcyxcbiAgICByZXF1aXJlUmV0dXJuc0RlZmF1bHQ6IHJlcXVpcmVSZXR1cm5zRGVmYXVsdE9wdGlvbixcbiAgICBkZWZhdWx0SXNNb2R1bGVFeHBvcnRzOiBkZWZhdWx0SXNNb2R1bGVFeHBvcnRzT3B0aW9uLFxuICAgIGVzbUV4dGVybmFsc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IG9wdGlvbnMuZXh0ZW5zaW9ucyB8fCBbJy5qcyddO1xuICBjb25zdCBmaWx0ZXIgPSBjcmVhdGVGaWx0ZXIkMShvcHRpb25zLmluY2x1ZGUsIG9wdGlvbnMuZXhjbHVkZSk7XG4gIGNvbnN0IGlzUG9zc2libGVDanNJZCA9IChpZCkgPT4ge1xuICAgIGNvbnN0IGV4dE5hbWUgPSBleHRuYW1lKGlkKTtcbiAgICByZXR1cm4gZXh0TmFtZSA9PT0gJy5janMnIHx8IChleHRlbnNpb25zLmluY2x1ZGVzKGV4dE5hbWUpICYmIGZpbHRlcihpZCkpO1xuICB9O1xuXG4gIGNvbnN0IHsgc3RyaWN0UmVxdWlyZXNGaWx0ZXIsIGRldGVjdEN5Y2xlc0FuZENvbmRpdGlvbmFsIH0gPSBnZXRTdHJpY3RSZXF1aXJlc0ZpbHRlcihvcHRpb25zKTtcblxuICBjb25zdCBnZXRSZXF1aXJlUmV0dXJuc0RlZmF1bHQgPVxuICAgIHR5cGVvZiByZXF1aXJlUmV0dXJuc0RlZmF1bHRPcHRpb24gPT09ICdmdW5jdGlvbidcbiAgICAgID8gcmVxdWlyZVJldHVybnNEZWZhdWx0T3B0aW9uXG4gICAgICA6ICgpID0+IHJlcXVpcmVSZXR1cm5zRGVmYXVsdE9wdGlvbjtcblxuICBsZXQgZXNtRXh0ZXJuYWxJZHM7XG4gIGNvbnN0IGlzRXNtRXh0ZXJuYWwgPVxuICAgIHR5cGVvZiBlc21FeHRlcm5hbHMgPT09ICdmdW5jdGlvbidcbiAgICAgID8gZXNtRXh0ZXJuYWxzXG4gICAgICA6IEFycmF5LmlzQXJyYXkoZXNtRXh0ZXJuYWxzKVxuICAgICAgPyAoKGVzbUV4dGVybmFsSWRzID0gbmV3IFNldChlc21FeHRlcm5hbHMpKSwgKGlkKSA9PiBlc21FeHRlcm5hbElkcy5oYXMoaWQpKVxuICAgICAgOiAoKSA9PiBlc21FeHRlcm5hbHM7XG5cbiAgY29uc3QgZ2V0RGVmYXVsdElzTW9kdWxlRXhwb3J0cyA9XG4gICAgdHlwZW9mIGRlZmF1bHRJc01vZHVsZUV4cG9ydHNPcHRpb24gPT09ICdmdW5jdGlvbidcbiAgICAgID8gZGVmYXVsdElzTW9kdWxlRXhwb3J0c09wdGlvblxuICAgICAgOiAoKSA9PlxuICAgICAgICAgIHR5cGVvZiBkZWZhdWx0SXNNb2R1bGVFeHBvcnRzT3B0aW9uID09PSAnYm9vbGVhbicgPyBkZWZhdWx0SXNNb2R1bGVFeHBvcnRzT3B0aW9uIDogJ2F1dG8nO1xuXG4gIGNvbnN0IGR5bmFtaWNSZXF1aXJlUm9vdCA9XG4gICAgdHlwZW9mIG9wdGlvbnMuZHluYW1pY1JlcXVpcmVSb290ID09PSAnc3RyaW5nJ1xuICAgICAgPyByZXNvbHZlJDMob3B0aW9ucy5keW5hbWljUmVxdWlyZVJvb3QpXG4gICAgICA6IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHsgY29tbW9uRGlyLCBkeW5hbWljUmVxdWlyZU1vZHVsZXMgfSA9IGdldER5bmFtaWNSZXF1aXJlTW9kdWxlcyhcbiAgICBvcHRpb25zLmR5bmFtaWNSZXF1aXJlVGFyZ2V0cyxcbiAgICBkeW5hbWljUmVxdWlyZVJvb3RcbiAgKTtcbiAgY29uc3QgaXNEeW5hbWljUmVxdWlyZU1vZHVsZXNFbmFibGVkID0gZHluYW1pY1JlcXVpcmVNb2R1bGVzLnNpemUgPiAwO1xuXG4gIGNvbnN0IGlnbm9yZVJlcXVpcmUgPVxuICAgIHR5cGVvZiBvcHRpb25zLmlnbm9yZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBvcHRpb25zLmlnbm9yZVxuICAgICAgOiBBcnJheS5pc0FycmF5KG9wdGlvbnMuaWdub3JlKVxuICAgICAgPyAoaWQpID0+IG9wdGlvbnMuaWdub3JlLmluY2x1ZGVzKGlkKVxuICAgICAgOiAoKSA9PiBmYWxzZTtcblxuICBjb25zdCBnZXRJZ25vcmVUcnlDYXRjaFJlcXVpcmVTdGF0ZW1lbnRNb2RlID0gKGlkKSA9PiB7XG4gICAgY29uc3QgbW9kZSA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5pZ25vcmVUcnlDYXRjaCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IG9wdGlvbnMuaWdub3JlVHJ5Q2F0Y2goaWQpXG4gICAgICAgIDogQXJyYXkuaXNBcnJheShvcHRpb25zLmlnbm9yZVRyeUNhdGNoKVxuICAgICAgICA/IG9wdGlvbnMuaWdub3JlVHJ5Q2F0Y2guaW5jbHVkZXMoaWQpXG4gICAgICAgIDogdHlwZW9mIG9wdGlvbnMuaWdub3JlVHJ5Q2F0Y2ggIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gb3B0aW9ucy5pZ25vcmVUcnlDYXRjaFxuICAgICAgICA6IHRydWU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2FuQ29udmVydFJlcXVpcmU6IG1vZGUgIT09ICdyZW1vdmUnICYmIG1vZGUgIT09IHRydWUsXG4gICAgICBzaG91bGRSZW1vdmVSZXF1aXJlOiBtb2RlID09PSAncmVtb3ZlJ1xuICAgIH07XG4gIH07XG5cbiAgY29uc3QgeyBjdXJyZW50bHlSZXNvbHZpbmcsIHJlc29sdmVJZCB9ID0gZ2V0UmVzb2x2ZUlkKGV4dGVuc2lvbnMsIGlzUG9zc2libGVDanNJZCk7XG5cbiAgY29uc3Qgc291cmNlTWFwID0gb3B0aW9ucy5zb3VyY2VNYXAgIT09IGZhbHNlO1xuXG4gIC8vIEluaXRpYWxpemVkIGluIGJ1aWxkU3RhcnRcbiAgbGV0IHJlcXVpcmVSZXNvbHZlcjtcblxuICBmdW5jdGlvbiB0cmFuc2Zvcm1BbmRDaGVja0V4cG9ydHMoY29kZSwgaWQpIHtcbiAgICBjb25zdCB7IGlzRXNNb2R1bGUsIGhhc0RlZmF1bHRFeHBvcnQsIGhhc05hbWVkRXhwb3J0cywgYXN0IH0gPSBhbmFseXplVG9wTGV2ZWxTdGF0ZW1lbnRzKFxuICAgICAgdGhpcy5wYXJzZSxcbiAgICAgIGNvZGUsXG4gICAgICBpZFxuICAgICk7XG5cbiAgICBjb25zdCBjb21tb25qc01ldGEgPSB0aGlzLmdldE1vZHVsZUluZm8oaWQpLm1ldGEuY29tbW9uanMgfHwge307XG4gICAgaWYgKGhhc0RlZmF1bHRFeHBvcnQpIHtcbiAgICAgIGNvbW1vbmpzTWV0YS5oYXNEZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGhhc05hbWVkRXhwb3J0cykge1xuICAgICAgY29tbW9uanNNZXRhLmhhc05hbWVkRXhwb3J0cyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIWR5bmFtaWNSZXF1aXJlTW9kdWxlcy5oYXMobm9ybWFsaXplUGF0aFNsYXNoZXMoaWQpKSAmJlxuICAgICAgKCEoaGFzQ2pzS2V5d29yZHMoY29kZSwgaWdub3JlR2xvYmFsKSB8fCByZXF1aXJlUmVzb2x2ZXIuaXNSZXF1aXJlZElkKGlkKSkgfHxcbiAgICAgICAgKGlzRXNNb2R1bGUgJiYgIW9wdGlvbnMudHJhbnNmb3JtTWl4ZWRFc01vZHVsZXMpKVxuICAgICkge1xuICAgICAgY29tbW9uanNNZXRhLmlzQ29tbW9uSlMgPSBmYWxzZTtcbiAgICAgIHJldHVybiB7IG1ldGE6IHsgY29tbW9uanM6IGNvbW1vbmpzTWV0YSB9IH07XG4gICAgfVxuXG4gICAgY29uc3QgbmVlZHNSZXF1aXJlV3JhcHBlciA9XG4gICAgICAhaXNFc01vZHVsZSAmJlxuICAgICAgKGR5bmFtaWNSZXF1aXJlTW9kdWxlcy5oYXMobm9ybWFsaXplUGF0aFNsYXNoZXMoaWQpKSB8fCBzdHJpY3RSZXF1aXJlc0ZpbHRlcihpZCkpO1xuXG4gICAgY29uc3QgY2hlY2tEeW5hbWljUmVxdWlyZSA9IChwb3NpdGlvbikgPT4ge1xuICAgICAgaWYgKGlkLmluZGV4T2YoZHluYW1pY1JlcXVpcmVSb290KSAhPT0gMCkge1xuICAgICAgICB0aGlzLmVycm9yKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvZGU6ICdEWU5BTUlDX1JFUVVJUkVfT1VUU0lERV9ST09UJyxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZHluYW1pY1JlcXVpcmVSb290LFxuICAgICAgICAgICAgbWVzc2FnZTogYFwiJHtpZH1cIiBjb250YWlucyBkeW5hbWljIHJlcXVpcmUgc3RhdGVtZW50cyBidXQgaXQgaXMgbm90IHdpdGhpbiB0aGUgY3VycmVudCBkeW5hbWljUmVxdWlyZVJvb3QgXCIke2R5bmFtaWNSZXF1aXJlUm9vdH1cIi4gWW91IHNob3VsZCBzZXQgZHluYW1pY1JlcXVpcmVSb290IHRvIFwiJHtkaXJuYW1lJDEoXG4gICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICApfVwiIG9yIG9uZSBvZiBpdHMgcGFyZW50IGRpcmVjdG9yaWVzLmBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBvc2l0aW9uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1Db21tb25qcyhcbiAgICAgIHRoaXMucGFyc2UsXG4gICAgICBjb2RlLFxuICAgICAgaWQsXG4gICAgICBpc0VzTW9kdWxlLFxuICAgICAgaWdub3JlR2xvYmFsIHx8IGlzRXNNb2R1bGUsXG4gICAgICBpZ25vcmVSZXF1aXJlLFxuICAgICAgaWdub3JlRHluYW1pY1JlcXVpcmVzICYmICFpc0R5bmFtaWNSZXF1aXJlTW9kdWxlc0VuYWJsZWQsXG4gICAgICBnZXRJZ25vcmVUcnlDYXRjaFJlcXVpcmVTdGF0ZW1lbnRNb2RlLFxuICAgICAgc291cmNlTWFwLFxuICAgICAgaXNEeW5hbWljUmVxdWlyZU1vZHVsZXNFbmFibGVkLFxuICAgICAgZHluYW1pY1JlcXVpcmVNb2R1bGVzLFxuICAgICAgY29tbW9uRGlyLFxuICAgICAgYXN0LFxuICAgICAgZ2V0RGVmYXVsdElzTW9kdWxlRXhwb3J0cyhpZCksXG4gICAgICBuZWVkc1JlcXVpcmVXcmFwcGVyLFxuICAgICAgcmVxdWlyZVJlc29sdmVyLnJlc29sdmVSZXF1aXJlU291cmNlc0FuZFVwZGF0ZU1ldGEodGhpcyksXG4gICAgICByZXF1aXJlUmVzb2x2ZXIuaXNSZXF1aXJlZElkKGlkKSxcbiAgICAgIGNoZWNrRHluYW1pY1JlcXVpcmUsXG4gICAgICBjb21tb25qc01ldGFcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBQTFVHSU5fTkFNRSxcblxuICAgIHZlcnNpb246IHZlcnNpb24kMyxcblxuICAgIG9wdGlvbnMocmF3T3B0aW9ucykge1xuICAgICAgLy8gV2UgaW5qZWN0IHRoZSByZXNvbHZlciBpbiB0aGUgYmVnaW5uaW5nIHNvIHRoYXQgXCJjYXRjaC1hbGwtcmVzb2x2ZXJcIiBsaWtlIG5vZGUtcmVzb2x2ZXJcbiAgICAgIC8vIGRvIG5vdCBwcmV2ZW50IG91ciBwbHVnaW4gZnJvbSByZXNvbHZpbmcgZW50cnkgcG9pbnRzIG90IHByb3hpZXMuXG4gICAgICBjb25zdCBwbHVnaW5zID0gQXJyYXkuaXNBcnJheShyYXdPcHRpb25zLnBsdWdpbnMpXG4gICAgICAgID8gWy4uLnJhd09wdGlvbnMucGx1Z2luc11cbiAgICAgICAgOiByYXdPcHRpb25zLnBsdWdpbnNcbiAgICAgICAgPyBbcmF3T3B0aW9ucy5wbHVnaW5zXVxuICAgICAgICA6IFtdO1xuICAgICAgcGx1Z2lucy51bnNoaWZ0KHtcbiAgICAgICAgbmFtZTogJ2NvbW1vbmpzLS1yZXNvbHZlcicsXG4gICAgICAgIHJlc29sdmVJZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyAuLi5yYXdPcHRpb25zLCBwbHVnaW5zIH07XG4gICAgfSxcblxuICAgIGJ1aWxkU3RhcnQoeyBwbHVnaW5zIH0pIHtcbiAgICAgIHZhbGlkYXRlVmVyc2lvbih0aGlzLm1ldGEucm9sbHVwVmVyc2lvbiwgcGVlckRlcGVuZGVuY2llcy5yb2xsdXAsICdyb2xsdXAnKTtcbiAgICAgIGNvbnN0IG5vZGVSZXNvbHZlID0gcGx1Z2lucy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gJ25vZGUtcmVzb2x2ZScpO1xuICAgICAgaWYgKG5vZGVSZXNvbHZlKSB7XG4gICAgICAgIHZhbGlkYXRlVmVyc2lvbihub2RlUmVzb2x2ZS52ZXJzaW9uLCAnXjEzLjAuNicsICdAcm9sbHVwL3BsdWdpbi1ub2RlLXJlc29sdmUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLm5hbWVkRXhwb3J0cyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMud2FybihcbiAgICAgICAgICAnVGhlIG5hbWVkRXhwb3J0cyBvcHRpb24gZnJvbSBcIkByb2xsdXAvcGx1Z2luLWNvbW1vbmpzXCIgaXMgZGVwcmVjYXRlZC4gTmFtZWQgZXhwb3J0cyBhcmUgbm93IGhhbmRsZWQgYXV0b21hdGljYWxseS4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXF1aXJlUmVzb2x2ZXIgPSBnZXRSZXF1aXJlUmVzb2x2ZXIoXG4gICAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAgIGRldGVjdEN5Y2xlc0FuZENvbmRpdGlvbmFsLFxuICAgICAgICBjdXJyZW50bHlSZXNvbHZpbmdcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGJ1aWxkRW5kKCkge1xuICAgICAgaWYgKG9wdGlvbnMuc3RyaWN0UmVxdWlyZXMgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZElkcyA9IHJlcXVpcmVSZXNvbHZlci5nZXRXcmFwcGVkSWRzKCk7XG4gICAgICAgIGlmICh3cmFwcGVkSWRzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMud2Fybih7XG4gICAgICAgICAgICBjb2RlOiAnV1JBUFBFRF9JRFMnLFxuICAgICAgICAgICAgaWRzOiB3cmFwcGVkSWRzLFxuICAgICAgICAgICAgbWVzc2FnZTogYFRoZSBjb21tb25qcyBwbHVnaW4gYXV0b21hdGljYWxseSB3cmFwcGVkIHRoZSBmb2xsb3dpbmcgZmlsZXM6XFxuW1xcbiR7d3JhcHBlZElkc1xuICAgICAgICAgICAgICAubWFwKChpZCkgPT4gYFxcdCR7SlNPTi5zdHJpbmdpZnkocmVsYXRpdmUkMShwcm9jZXNzLmN3ZCgpLCBpZCkpfWApXG4gICAgICAgICAgICAgIC5qb2luKCcsXFxuJyl9XFxuXWBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLndhcm4oe1xuICAgICAgICAgICAgY29kZTogJ1dSQVBQRURfSURTJyxcbiAgICAgICAgICAgIGlkczogd3JhcHBlZElkcyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGUgY29tbW9uanMgcGx1Z2luIGRpZCBub3Qgd3JhcCBhbnkgZmlsZXMuJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGxvYWQoaWQpIHtcbiAgICAgIGlmIChpZCA9PT0gSEVMUEVSU19JRCkge1xuICAgICAgICByZXR1cm4gZ2V0SGVscGVyc01vZHVsZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNXcmFwcGVkSWQoaWQsIE1PRFVMRV9TVUZGSVgpKSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IGdldE5hbWUodW53cmFwSWQkMShpZCwgTU9EVUxFX1NVRkZJWCkpO1xuICAgICAgICBjb25zdCBtb2R1bGVFeHBvcnRzID0gYCR7bW9kdWxlfUV4cG9ydHNgO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvZGU6IGB2YXIgJHttb2R1bGVFeHBvcnRzfSA9IHt9O1xudmFyICR7bW9kdWxlfSA9IHtcbiAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuICR7bW9kdWxlRXhwb3J0c307IH0sXG4gIHNldCBleHBvcnRzKHYpeyAke21vZHVsZUV4cG9ydHN9ID0gdjsgfSxcbn07XG5leHBvcnQgeyR7bW9kdWxlfSBhcyBfX21vZHVsZSwgJHttb2R1bGVFeHBvcnRzfSBhcyBleHBvcnRzfWAsXG4gICAgICAgICAgbWV0YTogeyBjb21tb25qczogeyBpc0NvbW1vbkpTOiBmYWxzZSB9IH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzV3JhcHBlZElkKGlkLCBFWFBPUlRTX1NVRkZJWCkpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGdldE5hbWUodW53cmFwSWQkMShpZCwgRVhQT1JUU19TVUZGSVgpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBgdmFyICR7bmFtZX0gPSB7fTsgZXhwb3J0IHske25hbWV9IGFzIF9fZXhwb3J0c31gLFxuICAgICAgICAgIG1ldGE6IHsgY29tbW9uanM6IHsgaXNDb21tb25KUzogZmFsc2UgfSB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1dyYXBwZWRJZChpZCwgRVhURVJOQUxfU1VGRklYKSkge1xuICAgICAgICBjb25zdCBhY3R1YWxJZCA9IHVud3JhcElkJDEoaWQsIEVYVEVSTkFMX1NVRkZJWCk7XG4gICAgICAgIHJldHVybiBnZXRVbmtub3duUmVxdWlyZVByb3h5KFxuICAgICAgICAgIGFjdHVhbElkLFxuICAgICAgICAgIGlzRXNtRXh0ZXJuYWwoYWN0dWFsSWQpID8gZ2V0UmVxdWlyZVJldHVybnNEZWZhdWx0KGFjdHVhbElkKSA6IHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW50cnkgc3VmZml4IGlzIGp1c3QgYXBwZW5kZWQgdG8gbm90IG1lc3MgdXAgcmVsYXRpdmUgZXh0ZXJuYWwgcmVzb2x1dGlvblxuICAgICAgaWYgKGlkLmVuZHNXaXRoKEVOVFJZX1NVRkZJWCkpIHtcbiAgICAgICAgY29uc3QgYWN1dGFsSWQgPSBpZC5zbGljZSgwLCAtRU5UUllfU1VGRklYLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBnZXRFbnRyeVByb3h5KGFjdXRhbElkLCBnZXREZWZhdWx0SXNNb2R1bGVFeHBvcnRzKGFjdXRhbElkKSwgdGhpcy5nZXRNb2R1bGVJbmZvKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzV3JhcHBlZElkKGlkLCBFU19JTVBPUlRfU1VGRklYKSkge1xuICAgICAgICBjb25zdCBhY3R1YWxJZCA9IHVud3JhcElkJDEoaWQsIEVTX0lNUE9SVF9TVUZGSVgpO1xuICAgICAgICByZXR1cm4gZ2V0RXNJbXBvcnRQcm94eShhY3R1YWxJZCwgZ2V0RGVmYXVsdElzTW9kdWxlRXhwb3J0cyhhY3R1YWxJZCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaWQgPT09IERZTkFNSUNfTU9EVUxFU19JRCkge1xuICAgICAgICByZXR1cm4gZ2V0RHluYW1pY01vZHVsZVJlZ2lzdHJ5KFxuICAgICAgICAgIGlzRHluYW1pY1JlcXVpcmVNb2R1bGVzRW5hYmxlZCxcbiAgICAgICAgICBkeW5hbWljUmVxdWlyZU1vZHVsZXMsXG4gICAgICAgICAgY29tbW9uRGlyLFxuICAgICAgICAgIGlnbm9yZUR5bmFtaWNSZXF1aXJlc1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNXcmFwcGVkSWQoaWQsIFBST1hZX1NVRkZJWCkpIHtcbiAgICAgICAgY29uc3QgYWN0dWFsSWQgPSB1bndyYXBJZCQxKGlkLCBQUk9YWV9TVUZGSVgpO1xuICAgICAgICByZXR1cm4gZ2V0U3RhdGljUmVxdWlyZVByb3h5KGFjdHVhbElkLCBnZXRSZXF1aXJlUmV0dXJuc0RlZmF1bHQoYWN0dWFsSWQpLCB0aGlzLmxvYWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgc2hvdWxkVHJhbnNmb3JtQ2FjaGVkTW9kdWxlKC4uLmFyZ3MpIHtcbiAgICAgIHJldHVybiByZXF1aXJlUmVzb2x2ZXIuc2hvdWxkVHJhbnNmb3JtQ2FjaGVkTW9kdWxlLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgfSxcblxuICAgIHRyYW5zZm9ybShjb2RlLCBpZCkge1xuICAgICAgaWYgKCFpc1Bvc3NpYmxlQ2pzSWQoaWQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUFuZENoZWNrRXhwb3J0cy5jYWxsKHRoaXMsIGNvZGUsIGlkKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihlcnIsIGVyci5sb2MpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLy8gTWF0Y2hlcyB0aGUgc2NoZW1lIG9mIGEgVVJMLCBlZyBcImh0dHA6Ly9cIlxuY29uc3Qgc2NoZW1lUmVnZXggPSAvXltcXHcrLi1dKzpcXC9cXC8vO1xuLyoqXG4gKiBNYXRjaGVzIHRoZSBwYXJ0cyBvZiBhIFVSTDpcbiAqIDEuIFNjaGVtZSwgaW5jbHVkaW5nIFwiOlwiLCBndWFyYW50ZWVkLlxuICogMi4gVXNlci9wYXNzd29yZCwgaW5jbHVkaW5nIFwiQFwiLCBvcHRpb25hbC5cbiAqIDMuIEhvc3QsIGd1YXJhbnRlZWQuXG4gKiA0LiBQb3J0LCBpbmNsdWRpbmcgXCI6XCIsIG9wdGlvbmFsLlxuICogNS4gUGF0aCwgaW5jbHVkaW5nIFwiL1wiLCBvcHRpb25hbC5cbiAqIDYuIFF1ZXJ5LCBpbmNsdWRpbmcgXCI/XCIsIG9wdGlvbmFsLlxuICogNy4gSGFzaCwgaW5jbHVkaW5nIFwiI1wiLCBvcHRpb25hbC5cbiAqL1xuY29uc3QgdXJsUmVnZXggPSAvXihbXFx3Ky4tXSs6KVxcL1xcLyhbXkAvIz9dKkApPyhbXjovIz9dKikoOlxcZCspPyhcXC9bXiM/XSopPyhcXD9bXiNdKik/KCMuKik/Lztcbi8qKlxuICogRmlsZSBVUkxzIGFyZSB3ZWlyZC4gVGhleSBkb250JyBuZWVkIHRoZSByZWd1bGFyIGAvL2AgaW4gdGhlIHNjaGVtZSwgdGhleSBtYXkgb3IgbWF5IG5vdCBzdGFydFxuICogd2l0aCBhIGxlYWRpbmcgYC9gLCB0aGV5IGNhbiBoYXZlIGEgZG9tYWluIChidXQgb25seSBpZiB0aGV5IGRvbid0IHN0YXJ0IHdpdGggYSBXaW5kb3dzIGRyaXZlKS5cbiAqXG4gKiAxLiBIb3N0LCBvcHRpb25hbC5cbiAqIDIuIFBhdGgsIHdoaWNoIG1heSBpbmNsdWRlIFwiL1wiLCBndWFyYW50ZWVkLlxuICogMy4gUXVlcnksIGluY2x1ZGluZyBcIj9cIiwgb3B0aW9uYWwuXG4gKiA0LiBIYXNoLCBpbmNsdWRpbmcgXCIjXCIsIG9wdGlvbmFsLlxuICovXG5jb25zdCBmaWxlUmVnZXggPSAvXmZpbGU6KD86XFwvXFwvKCg/IVthLXpdOilbXi8jP10qKT8pPyhcXC8/W14jP10qKShcXD9bXiNdKik/KCMuKik/L2k7XG52YXIgVXJsVHlwZTtcbihmdW5jdGlvbiAoVXJsVHlwZSkge1xuICAgIFVybFR5cGVbVXJsVHlwZVtcIkVtcHR5XCJdID0gMV0gPSBcIkVtcHR5XCI7XG4gICAgVXJsVHlwZVtVcmxUeXBlW1wiSGFzaFwiXSA9IDJdID0gXCJIYXNoXCI7XG4gICAgVXJsVHlwZVtVcmxUeXBlW1wiUXVlcnlcIl0gPSAzXSA9IFwiUXVlcnlcIjtcbiAgICBVcmxUeXBlW1VybFR5cGVbXCJSZWxhdGl2ZVBhdGhcIl0gPSA0XSA9IFwiUmVsYXRpdmVQYXRoXCI7XG4gICAgVXJsVHlwZVtVcmxUeXBlW1wiQWJzb2x1dGVQYXRoXCJdID0gNV0gPSBcIkFic29sdXRlUGF0aFwiO1xuICAgIFVybFR5cGVbVXJsVHlwZVtcIlNjaGVtZVJlbGF0aXZlXCJdID0gNl0gPSBcIlNjaGVtZVJlbGF0aXZlXCI7XG4gICAgVXJsVHlwZVtVcmxUeXBlW1wiQWJzb2x1dGVcIl0gPSA3XSA9IFwiQWJzb2x1dGVcIjtcbn0pKFVybFR5cGUgfHwgKFVybFR5cGUgPSB7fSkpO1xuZnVuY3Rpb24gaXNBYnNvbHV0ZVVybChpbnB1dCkge1xuICAgIHJldHVybiBzY2hlbWVSZWdleC50ZXN0KGlucHV0KTtcbn1cbmZ1bmN0aW9uIGlzU2NoZW1lUmVsYXRpdmVVcmwoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQuc3RhcnRzV2l0aCgnLy8nKTtcbn1cbmZ1bmN0aW9uIGlzQWJzb2x1dGVQYXRoKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0LnN0YXJ0c1dpdGgoJy8nKTtcbn1cbmZ1bmN0aW9uIGlzRmlsZVVybChpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dC5zdGFydHNXaXRoKCdmaWxlOicpO1xufVxuZnVuY3Rpb24gaXNSZWxhdGl2ZShpbnB1dCkge1xuICAgIHJldHVybiAvXlsuPyNdLy50ZXN0KGlucHV0KTtcbn1cbmZ1bmN0aW9uIHBhcnNlQWJzb2x1dGVVcmwoaW5wdXQpIHtcbiAgICBjb25zdCBtYXRjaCA9IHVybFJlZ2V4LmV4ZWMoaW5wdXQpO1xuICAgIHJldHVybiBtYWtlVXJsKG1hdGNoWzFdLCBtYXRjaFsyXSB8fCAnJywgbWF0Y2hbM10sIG1hdGNoWzRdIHx8ICcnLCBtYXRjaFs1XSB8fCAnLycsIG1hdGNoWzZdIHx8ICcnLCBtYXRjaFs3XSB8fCAnJyk7XG59XG5mdW5jdGlvbiBwYXJzZUZpbGVVcmwoaW5wdXQpIHtcbiAgICBjb25zdCBtYXRjaCA9IGZpbGVSZWdleC5leGVjKGlucHV0KTtcbiAgICBjb25zdCBwYXRoID0gbWF0Y2hbMl07XG4gICAgcmV0dXJuIG1ha2VVcmwoJ2ZpbGU6JywgJycsIG1hdGNoWzFdIHx8ICcnLCAnJywgaXNBYnNvbHV0ZVBhdGgocGF0aCkgPyBwYXRoIDogJy8nICsgcGF0aCwgbWF0Y2hbM10gfHwgJycsIG1hdGNoWzRdIHx8ICcnKTtcbn1cbmZ1bmN0aW9uIG1ha2VVcmwoc2NoZW1lLCB1c2VyLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgaGFzaCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjaGVtZSxcbiAgICAgICAgdXNlcixcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGhhc2gsXG4gICAgICAgIHR5cGU6IFVybFR5cGUuQWJzb2x1dGUsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlVXJsJDIoaW5wdXQpIHtcbiAgICBpZiAoaXNTY2hlbWVSZWxhdGl2ZVVybChpbnB1dCkpIHtcbiAgICAgICAgY29uc3QgdXJsID0gcGFyc2VBYnNvbHV0ZVVybCgnaHR0cDonICsgaW5wdXQpO1xuICAgICAgICB1cmwuc2NoZW1lID0gJyc7XG4gICAgICAgIHVybC50eXBlID0gVXJsVHlwZS5TY2hlbWVSZWxhdGl2ZTtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgaWYgKGlzQWJzb2x1dGVQYXRoKGlucHV0KSkge1xuICAgICAgICBjb25zdCB1cmwgPSBwYXJzZUFic29sdXRlVXJsKCdodHRwOi8vZm9vLmNvbScgKyBpbnB1dCk7XG4gICAgICAgIHVybC5zY2hlbWUgPSAnJztcbiAgICAgICAgdXJsLmhvc3QgPSAnJztcbiAgICAgICAgdXJsLnR5cGUgPSBVcmxUeXBlLkFic29sdXRlUGF0aDtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgaWYgKGlzRmlsZVVybChpbnB1dCkpXG4gICAgICAgIHJldHVybiBwYXJzZUZpbGVVcmwoaW5wdXQpO1xuICAgIGlmIChpc0Fic29sdXRlVXJsKGlucHV0KSlcbiAgICAgICAgcmV0dXJuIHBhcnNlQWJzb2x1dGVVcmwoaW5wdXQpO1xuICAgIGNvbnN0IHVybCA9IHBhcnNlQWJzb2x1dGVVcmwoJ2h0dHA6Ly9mb28uY29tLycgKyBpbnB1dCk7XG4gICAgdXJsLnNjaGVtZSA9ICcnO1xuICAgIHVybC5ob3N0ID0gJyc7XG4gICAgdXJsLnR5cGUgPSBpbnB1dFxuICAgICAgICA/IGlucHV0LnN0YXJ0c1dpdGgoJz8nKVxuICAgICAgICAgICAgPyBVcmxUeXBlLlF1ZXJ5XG4gICAgICAgICAgICA6IGlucHV0LnN0YXJ0c1dpdGgoJyMnKVxuICAgICAgICAgICAgICAgID8gVXJsVHlwZS5IYXNoXG4gICAgICAgICAgICAgICAgOiBVcmxUeXBlLlJlbGF0aXZlUGF0aFxuICAgICAgICA6IFVybFR5cGUuRW1wdHk7XG4gICAgcmV0dXJuIHVybDtcbn1cbmZ1bmN0aW9uIHN0cmlwUGF0aEZpbGVuYW1lKHBhdGgpIHtcbiAgICAvLyBJZiBhIHBhdGggZW5kcyB3aXRoIGEgcGFyZW50IGRpcmVjdG9yeSBcIi4uXCIsIHRoZW4gaXQncyBhIHJlbGF0aXZlIHBhdGggd2l0aCBleGNlc3MgcGFyZW50XG4gICAgLy8gcGF0aHMuIEl0J3Mgbm90IGEgZmlsZSwgc28gd2UgY2FuJ3Qgc3RyaXAgaXQuXG4gICAgaWYgKHBhdGguZW5kc1dpdGgoJy8uLicpKVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICBjb25zdCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTtcbiAgICByZXR1cm4gcGF0aC5zbGljZSgwLCBpbmRleCArIDEpO1xufVxuZnVuY3Rpb24gbWVyZ2VQYXRocyh1cmwsIGJhc2UpIHtcbiAgICBub3JtYWxpemVQYXRoJDQoYmFzZSwgYmFzZS50eXBlKTtcbiAgICAvLyBJZiB0aGUgcGF0aCBpcyBqdXN0IGEgXCIvXCIsIHRoZW4gaXQgd2FzIGFuIGVtcHR5IHBhdGggdG8gYmVnaW4gd2l0aCAocmVtZW1iZXIsIHdlJ3JlIGEgcmVsYXRpdmVcbiAgICAvLyBwYXRoKS5cbiAgICBpZiAodXJsLnBhdGggPT09ICcvJykge1xuICAgICAgICB1cmwucGF0aCA9IGJhc2UucGF0aDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFJlc29sdXRpb24gaGFwcGVucyByZWxhdGl2ZSB0byB0aGUgYmFzZSBwYXRoJ3MgZGlyZWN0b3J5LCBub3QgdGhlIGZpbGUuXG4gICAgICAgIHVybC5wYXRoID0gc3RyaXBQYXRoRmlsZW5hbWUoYmFzZS5wYXRoKSArIHVybC5wYXRoO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIHBhdGggY2FuIGhhdmUgZW1wdHkgZGlyZWN0b3JpZXMgXCIvL1wiLCB1bm5lZWRlZCBwYXJlbnRzIFwiZm9vLy4uXCIsIG9yIGN1cnJlbnQgZGlyZWN0b3J5XG4gKiBcImZvby8uXCIuIFdlIG5lZWQgdG8gbm9ybWFsaXplIHRvIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgkNCh1cmwsIHR5cGUpIHtcbiAgICBjb25zdCByZWwgPSB0eXBlIDw9IFVybFR5cGUuUmVsYXRpdmVQYXRoO1xuICAgIGNvbnN0IHBpZWNlcyA9IHVybC5wYXRoLnNwbGl0KCcvJyk7XG4gICAgLy8gV2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgZmlyc3QgcGllY2UgYWx3YXlzLCBzbyB0aGF0IHdlIG91dHB1dCBhIGxlYWRpbmcgc2xhc2guIFRoZSBpdGVtIGF0XG4gICAgLy8gcGllY2VzWzBdIGlzIGFuIGVtcHR5IHN0cmluZy5cbiAgICBsZXQgcG9pbnRlciA9IDE7XG4gICAgLy8gUG9zaXRpdmUgaXMgdGhlIG51bWJlciBvZiByZWFsIGRpcmVjdG9yaWVzIHdlJ3ZlIG91dHB1dCwgdXNlZCBmb3IgcG9wcGluZyBhIHBhcmVudCBkaXJlY3RvcnkuXG4gICAgLy8gRWcsIFwiZm9vL2Jhci8uLlwiIHdpbGwgaGF2ZSBhIHBvc2l0aXZlIDIsIGFuZCB3ZSBjYW4gZGVjcmVtZW50IHRvIGJlIGxlZnQgd2l0aCBqdXN0IFwiZm9vXCIuXG4gICAgbGV0IHBvc2l0aXZlID0gMDtcbiAgICAvLyBXZSBuZWVkIHRvIGtlZXAgYSB0cmFpbGluZyBzbGFzaCBpZiB3ZSBlbmNvdW50ZXIgYW4gZW1wdHkgZGlyZWN0b3J5IChlZywgc3BsaXR0aW5nIFwiZm9vL1wiIHdpbGxcbiAgICAvLyBnZW5lcmF0ZSBgW1wiZm9vXCIsIFwiXCJdYCBwaWVjZXMpLiBBbmQsIGlmIHdlIHBvcCBhIHBhcmVudCBkaXJlY3RvcnkuIEJ1dCBvbmNlIHdlIGVuY291bnRlciBhXG4gICAgLy8gcmVhbCBkaXJlY3RvcnksIHdlIHdvbid0IG5lZWQgdG8gYXBwZW5kLCB1bmxlc3MgdGhlIG90aGVyIGNvbmRpdGlvbnMgaGFwcGVuIGFnYWluLlxuICAgIGxldCBhZGRUcmFpbGluZ1NsYXNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwaWVjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGllY2UgPSBwaWVjZXNbaV07XG4gICAgICAgIC8vIEFuIGVtcHR5IGRpcmVjdG9yeSwgY291bGQgYmUgYSB0cmFpbGluZyBzbGFzaCwgb3IganVzdCBhIGRvdWJsZSBcIi8vXCIgaW4gdGhlIHBhdGguXG4gICAgICAgIGlmICghcGllY2UpIHtcbiAgICAgICAgICAgIGFkZFRyYWlsaW5nU2xhc2ggPSB0cnVlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgcmVhbCBkaXJlY3RvcnksIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBhcHBlbmQgYW55bW9yZS5cbiAgICAgICAgYWRkVHJhaWxpbmdTbGFzaCA9IGZhbHNlO1xuICAgICAgICAvLyBBIGN1cnJlbnQgZGlyZWN0b3J5LCB3aGljaCB3ZSBjYW4gYWx3YXlzIGRyb3AuXG4gICAgICAgIGlmIChwaWVjZSA9PT0gJy4nKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIC8vIEEgcGFyZW50IGRpcmVjdG9yeSwgd2UgbmVlZCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSByZWFsIGRpcmVjdG9yaWVzIHdlIGNhbiBwb3AuIEVsc2UsIHdlXG4gICAgICAgIC8vIGhhdmUgYW4gZXhjZXNzIG9mIHBhcmVudHMsIGFuZCB3ZSdsbCBuZWVkIHRvIGtlZXAgdGhlIFwiLi5cIi5cbiAgICAgICAgaWYgKHBpZWNlID09PSAnLi4nKSB7XG4gICAgICAgICAgICBpZiAocG9zaXRpdmUpIHtcbiAgICAgICAgICAgICAgICBhZGRUcmFpbGluZ1NsYXNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwb3NpdGl2ZS0tO1xuICAgICAgICAgICAgICAgIHBvaW50ZXItLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlbCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIGluIGEgcmVsYXRpdmVQYXRoLCB0aGVuIHdlIG5lZWQgdG8ga2VlcCB0aGUgZXhjZXNzIHBhcmVudHMuIEVsc2UsIGluIGFuIGFic29sdXRlXG4gICAgICAgICAgICAgICAgLy8gVVJMLCBwcm90b2NvbCByZWxhdGl2ZSBVUkwsIG9yIGFuIGFic29sdXRlIHBhdGgsIHdlIGRvbid0IG5lZWQgdG8ga2VlcCBleGNlc3MuXG4gICAgICAgICAgICAgICAgcGllY2VzW3BvaW50ZXIrK10gPSBwaWVjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlJ3ZlIGVuY291bnRlcmVkIGEgcmVhbCBkaXJlY3RvcnkuIE1vdmUgaXQgdG8gdGhlIG5leHQgaW5zZXJ0aW9uIHBvaW50ZXIsIHdoaWNoIGFjY291bnRzIGZvclxuICAgICAgICAvLyBhbnkgcG9wcGVkIG9yIGRyb3BwZWQgZGlyZWN0b3JpZXMuXG4gICAgICAgIHBpZWNlc1twb2ludGVyKytdID0gcGllY2U7XG4gICAgICAgIHBvc2l0aXZlKys7XG4gICAgfVxuICAgIGxldCBwYXRoID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwb2ludGVyOyBpKyspIHtcbiAgICAgICAgcGF0aCArPSAnLycgKyBwaWVjZXNbaV07XG4gICAgfVxuICAgIGlmICghcGF0aCB8fCAoYWRkVHJhaWxpbmdTbGFzaCAmJiAhcGF0aC5lbmRzV2l0aCgnLy4uJykpKSB7XG4gICAgICAgIHBhdGggKz0gJy8nO1xuICAgIH1cbiAgICB1cmwucGF0aCA9IHBhdGg7XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIHJlc29sdmUgYGlucHV0YCBVUkwvcGF0aCByZWxhdGl2ZSB0byBgYmFzZWAuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmUkMihpbnB1dCwgYmFzZSkge1xuICAgIGlmICghaW5wdXQgJiYgIWJhc2UpXG4gICAgICAgIHJldHVybiAnJztcbiAgICBjb25zdCB1cmwgPSBwYXJzZVVybCQyKGlucHV0KTtcbiAgICBsZXQgaW5wdXRUeXBlID0gdXJsLnR5cGU7XG4gICAgaWYgKGJhc2UgJiYgaW5wdXRUeXBlICE9PSBVcmxUeXBlLkFic29sdXRlKSB7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBwYXJzZVVybCQyKGJhc2UpO1xuICAgICAgICBjb25zdCBiYXNlVHlwZSA9IGJhc2VVcmwudHlwZTtcbiAgICAgICAgc3dpdGNoIChpbnB1dFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVXJsVHlwZS5FbXB0eTpcbiAgICAgICAgICAgICAgICB1cmwuaGFzaCA9IGJhc2VVcmwuaGFzaDtcbiAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSBVcmxUeXBlLkhhc2g6XG4gICAgICAgICAgICAgICAgdXJsLnF1ZXJ5ID0gYmFzZVVybC5xdWVyeTtcbiAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSBVcmxUeXBlLlF1ZXJ5OlxuICAgICAgICAgICAgY2FzZSBVcmxUeXBlLlJlbGF0aXZlUGF0aDpcbiAgICAgICAgICAgICAgICBtZXJnZVBhdGhzKHVybCwgYmFzZVVybCk7XG4gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgICAgIGNhc2UgVXJsVHlwZS5BYnNvbHV0ZVBhdGg6XG4gICAgICAgICAgICAgICAgLy8gVGhlIGhvc3QsIHVzZXIsIGFuZCBwb3J0IGFyZSBqb2luZWQsIHlvdSBjYW4ndCBjb3B5IG9uZSB3aXRob3V0IHRoZSBvdGhlcnMuXG4gICAgICAgICAgICAgICAgdXJsLnVzZXIgPSBiYXNlVXJsLnVzZXI7XG4gICAgICAgICAgICAgICAgdXJsLmhvc3QgPSBiYXNlVXJsLmhvc3Q7XG4gICAgICAgICAgICAgICAgdXJsLnBvcnQgPSBiYXNlVXJsLnBvcnQ7XG4gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgICAgIGNhc2UgVXJsVHlwZS5TY2hlbWVSZWxhdGl2ZTpcbiAgICAgICAgICAgICAgICAvLyBUaGUgaW5wdXQgZG9lc24ndCBoYXZlIGEgc2NoZW1hIGF0IGxlYXN0LCBzbyB3ZSBuZWVkIHRvIGNvcHkgYXQgbGVhc3QgdGhhdCBvdmVyLlxuICAgICAgICAgICAgICAgIHVybC5zY2hlbWUgPSBiYXNlVXJsLnNjaGVtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFzZVR5cGUgPiBpbnB1dFR5cGUpXG4gICAgICAgICAgICBpbnB1dFR5cGUgPSBiYXNlVHlwZTtcbiAgICB9XG4gICAgbm9ybWFsaXplUGF0aCQ0KHVybCwgaW5wdXRUeXBlKTtcbiAgICBjb25zdCBxdWVyeUhhc2ggPSB1cmwucXVlcnkgKyB1cmwuaGFzaDtcbiAgICBzd2l0Y2ggKGlucHV0VHlwZSkge1xuICAgICAgICAvLyBUaGlzIGlzIGltcG9zc2libGUsIGJlY2F1c2Ugb2YgdGhlIGVtcHR5IGNoZWNrcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAgICAvLyBjYXNlIFVybFR5cGUuRW1wdHk6XG4gICAgICAgIGNhc2UgVXJsVHlwZS5IYXNoOlxuICAgICAgICBjYXNlIFVybFR5cGUuUXVlcnk6XG4gICAgICAgICAgICByZXR1cm4gcXVlcnlIYXNoO1xuICAgICAgICBjYXNlIFVybFR5cGUuUmVsYXRpdmVQYXRoOiB7XG4gICAgICAgICAgICAvLyBUaGUgZmlyc3QgY2hhciBpcyBhbHdheXMgYSBcIi9cIiwgYW5kIHdlIG5lZWQgaXQgdG8gYmUgcmVsYXRpdmUuXG4gICAgICAgICAgICBjb25zdCBwYXRoID0gdXJsLnBhdGguc2xpY2UoMSk7XG4gICAgICAgICAgICBpZiAoIXBhdGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5SGFzaCB8fCAnLic7XG4gICAgICAgICAgICBpZiAoaXNSZWxhdGl2ZShiYXNlIHx8IGlucHV0KSAmJiAhaXNSZWxhdGl2ZShwYXRoKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGJhc2Ugc3RhcnRlZCB3aXRoIGEgbGVhZGluZyBcIi5cIiwgb3IgdGhlcmUgaXMgbm8gYmFzZSBhbmQgaW5wdXQgc3RhcnRlZCB3aXRoIGEgXCIuXCIsXG4gICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSByZWxhdGl2ZSBwYXRoIHN0YXJ0cyB3aXRoIGEgXCIuXCIuIFdlIGRvbid0IGtub3cgaWZcbiAgICAgICAgICAgICAgICAvLyByZWxhdGl2ZSBzdGFydHMgd2l0aCBhIFwiLi5cIiwgdGhvdWdoLCBzbyBjaGVjayBiZWZvcmUgcHJlcGVuZGluZy5cbiAgICAgICAgICAgICAgICByZXR1cm4gJy4vJyArIHBhdGggKyBxdWVyeUhhc2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGF0aCArIHF1ZXJ5SGFzaDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFVybFR5cGUuQWJzb2x1dGVQYXRoOlxuICAgICAgICAgICAgcmV0dXJuIHVybC5wYXRoICsgcXVlcnlIYXNoO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHVybC5zY2hlbWUgKyAnLy8nICsgdXJsLnVzZXIgKyB1cmwuaG9zdCArIHVybC5wb3J0ICsgdXJsLnBhdGggKyBxdWVyeUhhc2g7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlJDEoaW5wdXQsIGJhc2UpIHtcbiAgICAvLyBUaGUgYmFzZSBpcyBhbHdheXMgdHJlYXRlZCBhcyBhIGRpcmVjdG9yeSwgaWYgaXQncyBub3QgZW1wdHkuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9ibG9iLzhjYjNlZTU3L2xpYi91dGlsLmpzI0wzMjdcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hyb21pdW0vY2hyb21pdW0vYmxvYi9kYTRhZGJiMy90aGlyZF9wYXJ0eS9ibGluay9yZW5kZXJlci9kZXZ0b29scy9mcm9udF9lbmQvc2RrL1NvdXJjZU1hcC5qcyNMNDAwLUw0MDFcbiAgICBpZiAoYmFzZSAmJiAhYmFzZS5lbmRzV2l0aCgnLycpKVxuICAgICAgICBiYXNlICs9ICcvJztcbiAgICByZXR1cm4gcmVzb2x2ZSQyKGlucHV0LCBiYXNlKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGxhc3QgXCIvXCIsIGJ1dCBsZWF2ZXMgdGhlIHNsYXNoLlxuICovXG5mdW5jdGlvbiBzdHJpcEZpbGVuYW1lKHBhdGgpIHtcbiAgICBpZiAoIXBhdGgpXG4gICAgICAgIHJldHVybiAnJztcbiAgICBjb25zdCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTtcbiAgICByZXR1cm4gcGF0aC5zbGljZSgwLCBpbmRleCArIDEpO1xufVxuXG5jb25zdCBDT0xVTU4gPSAwO1xuY29uc3QgU09VUkNFU19JTkRFWCA9IDE7XG5jb25zdCBTT1VSQ0VfTElORSA9IDI7XG5jb25zdCBTT1VSQ0VfQ09MVU1OID0gMztcbmNvbnN0IE5BTUVTX0lOREVYID0gNDtcblxuZnVuY3Rpb24gbWF5YmVTb3J0KG1hcHBpbmdzLCBvd25lZCkge1xuICAgIGNvbnN0IHVuc29ydGVkSW5kZXggPSBuZXh0VW5zb3J0ZWRTZWdtZW50TGluZShtYXBwaW5ncywgMCk7XG4gICAgaWYgKHVuc29ydGVkSW5kZXggPT09IG1hcHBpbmdzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIG1hcHBpbmdzO1xuICAgIC8vIElmIHdlIG93biB0aGUgYXJyYXkgKG1lYW5pbmcgd2UgcGFyc2VkIGl0IGZyb20gSlNPTiksIHRoZW4gd2UncmUgZnJlZSB0byBkaXJlY3RseSBtdXRhdGUgaXQuIElmXG4gICAgLy8gbm90LCB3ZSBkbyBub3Qgd2FudCB0byBtb2RpZnkgdGhlIGNvbnN1bWVyJ3MgaW5wdXQgYXJyYXkuXG4gICAgaWYgKCFvd25lZClcbiAgICAgICAgbWFwcGluZ3MgPSBtYXBwaW5ncy5zbGljZSgpO1xuICAgIGZvciAobGV0IGkgPSB1bnNvcnRlZEluZGV4OyBpIDwgbWFwcGluZ3MubGVuZ3RoOyBpID0gbmV4dFVuc29ydGVkU2VnbWVudExpbmUobWFwcGluZ3MsIGkgKyAxKSkge1xuICAgICAgICBtYXBwaW5nc1tpXSA9IHNvcnRTZWdtZW50cyhtYXBwaW5nc1tpXSwgb3duZWQpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwcGluZ3M7XG59XG5mdW5jdGlvbiBuZXh0VW5zb3J0ZWRTZWdtZW50TGluZShtYXBwaW5ncywgc3RhcnQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBtYXBwaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWlzU29ydGVkKG1hcHBpbmdzW2ldKSlcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwcGluZ3MubGVuZ3RoO1xufVxuZnVuY3Rpb24gaXNTb3J0ZWQobGluZSkge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAobGluZVtqXVtDT0xVTU5dIDwgbGluZVtqIC0gMV1bQ09MVU1OXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gc29ydFNlZ21lbnRzKGxpbmUsIG93bmVkKSB7XG4gICAgaWYgKCFvd25lZClcbiAgICAgICAgbGluZSA9IGxpbmUuc2xpY2UoKTtcbiAgICByZXR1cm4gbGluZS5zb3J0KHNvcnRDb21wYXJhdG9yKTtcbn1cbmZ1bmN0aW9uIHNvcnRDb21wYXJhdG9yKGEsIGIpIHtcbiAgICByZXR1cm4gYVtDT0xVTU5dIC0gYltDT0xVTU5dO1xufVxuXG5sZXQgZm91bmQgPSBmYWxzZTtcbi8qKlxuICogQSBiaW5hcnkgc2VhcmNoIGltcGxlbWVudGF0aW9uIHRoYXQgcmV0dXJucyB0aGUgaW5kZXggaWYgYSBtYXRjaCBpcyBmb3VuZC5cbiAqIElmIG5vIG1hdGNoIGlzIGZvdW5kLCB0aGVuIHRoZSBsZWZ0LWluZGV4ICh0aGUgaW5kZXggYXNzb2NpYXRlZCB3aXRoIHRoZSBpdGVtIHRoYXQgY29tZXMganVzdFxuICogYmVmb3JlIHRoZSBkZXNpcmVkIGluZGV4KSBpcyByZXR1cm5lZC4gVG8gbWFpbnRhaW4gcHJvcGVyIHNvcnQgb3JkZXIsIGEgc3BsaWNlIHdvdWxkIGhhcHBlbiBhdFxuICogdGhlIG5leHQgaW5kZXg6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGFycmF5ID0gWzEsIDNdO1xuICogY29uc3QgbmVlZGxlID0gMjtcbiAqIGNvbnN0IGluZGV4ID0gYmluYXJ5U2VhcmNoKGFycmF5LCBuZWVkbGUsIChpdGVtLCBuZWVkbGUpID0+IGl0ZW0gLSBuZWVkbGUpO1xuICpcbiAqIGFzc2VydC5lcXVhbChpbmRleCwgMCk7XG4gKiBhcnJheS5zcGxpY2UoaW5kZXggKyAxLCAwLCBuZWVkbGUpO1xuICogYXNzZXJ0LmRlZXBFcXVhbChhcnJheSwgWzEsIDIsIDNdKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2goaGF5c3RhY2ssIG5lZWRsZSwgbG93LCBoaWdoKSB7XG4gICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IGxvdyArICgoaGlnaCAtIGxvdykgPj4gMSk7XG4gICAgICAgIGNvbnN0IGNtcCA9IGhheXN0YWNrW21pZF1bQ09MVU1OXSAtIG5lZWRsZTtcbiAgICAgICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG1pZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY21wIDwgMCkge1xuICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvdW5kID0gZmFsc2U7XG4gICAgcmV0dXJuIGxvdyAtIDE7XG59XG5mdW5jdGlvbiB1cHBlckJvdW5kKGhheXN0YWNrLCBuZWVkbGUsIGluZGV4KSB7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4ICsgMTsgaSA8IGhheXN0YWNrLmxlbmd0aDsgaW5kZXggPSBpKyspIHtcbiAgICAgICAgaWYgKGhheXN0YWNrW2ldW0NPTFVNTl0gIT09IG5lZWRsZSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG59XG5mdW5jdGlvbiBsb3dlckJvdW5kKGhheXN0YWNrLCBuZWVkbGUsIGluZGV4KSB7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4IC0gMTsgaSA+PSAwOyBpbmRleCA9IGktLSkge1xuICAgICAgICBpZiAoaGF5c3RhY2tbaV1bQ09MVU1OXSAhPT0gbmVlZGxlKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbn1cbmZ1bmN0aW9uIG1lbW9pemVkU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGFzdEtleTogLTEsXG4gICAgICAgIGxhc3ROZWVkbGU6IC0xLFxuICAgICAgICBsYXN0SW5kZXg6IC0xLFxuICAgIH07XG59XG4vKipcbiAqIFRoaXMgb3Zlcmx5IGNvbXBsaWNhdGVkIGJlYXN0IGlzIGp1c3QgdG8gcmVjb3JkIHRoZSBsYXN0IHRlc3RlZCBsaW5lL2NvbHVtbiBhbmQgdGhlIHJlc3VsdGluZ1xuICogaW5kZXgsIGFsbG93aW5nIHVzIHRvIHNraXAgYSBmZXcgdGVzdHMgaWYgbWFwcGluZ3MgYXJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZWRCaW5hcnlTZWFyY2goaGF5c3RhY2ssIG5lZWRsZSwgc3RhdGUsIGtleSkge1xuICAgIGNvbnN0IHsgbGFzdEtleSwgbGFzdE5lZWRsZSwgbGFzdEluZGV4IH0gPSBzdGF0ZTtcbiAgICBsZXQgbG93ID0gMDtcbiAgICBsZXQgaGlnaCA9IGhheXN0YWNrLmxlbmd0aCAtIDE7XG4gICAgaWYgKGtleSA9PT0gbGFzdEtleSkge1xuICAgICAgICBpZiAobmVlZGxlID09PSBsYXN0TmVlZGxlKSB7XG4gICAgICAgICAgICBmb3VuZCA9IGxhc3RJbmRleCAhPT0gLTEgJiYgaGF5c3RhY2tbbGFzdEluZGV4XVtDT0xVTU5dID09PSBuZWVkbGU7XG4gICAgICAgICAgICByZXR1cm4gbGFzdEluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZWVkbGUgPj0gbGFzdE5lZWRsZSkge1xuICAgICAgICAgICAgLy8gbGFzdEluZGV4IG1heSBiZSAtMSBpZiB0aGUgcHJldmlvdXMgbmVlZGxlIHdhcyBub3QgZm91bmQuXG4gICAgICAgICAgICBsb3cgPSBsYXN0SW5kZXggPT09IC0xID8gMCA6IGxhc3RJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhpZ2ggPSBsYXN0SW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGUubGFzdEtleSA9IGtleTtcbiAgICBzdGF0ZS5sYXN0TmVlZGxlID0gbmVlZGxlO1xuICAgIHJldHVybiAoc3RhdGUubGFzdEluZGV4ID0gYmluYXJ5U2VhcmNoKGhheXN0YWNrLCBuZWVkbGUsIGxvdywgaGlnaCkpO1xufVxuXG5jb25zdCBMSU5FX0dUUl9aRVJPID0gJ2BsaW5lYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIChsaW5lcyBzdGFydCBhdCBsaW5lIDEpJztcbmNvbnN0IENPTF9HVFJfRVFfWkVSTyA9ICdgY29sdW1uYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIChjb2x1bW5zIHN0YXJ0IGF0IGNvbHVtbiAwKSc7XG5jb25zdCBMRUFTVF9VUFBFUl9CT1VORCA9IC0xO1xuY29uc3QgR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBkZWNvZGVkIChhcnJheSBvZiBsaW5lcyBvZiBzZWdtZW50cykgZm9ybSBvZiB0aGUgU291cmNlTWFwJ3MgbWFwcGluZ3MgZmllbGQuXG4gKi9cbmxldCBkZWNvZGVkTWFwcGluZ3M7XG4vKipcbiAqIEEgbG93LWxldmVsIEFQSSB0byBmaW5kIHRoZSBzZWdtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiAodGhpbmssIGZyb20gYVxuICogc3RhY2sgdHJhY2UpLiBMaW5lIGFuZCBjb2x1bW4gaGVyZSBhcmUgMC1iYXNlZCwgdW5saWtlIGBvcmlnaW5hbFBvc2l0aW9uRm9yYC5cbiAqL1xubGV0IHRyYWNlU2VnbWVudDtcbi8qKlxuICogQSBoaWdoZXItbGV2ZWwgQVBJIHRvIGZpbmQgdGhlIHNvdXJjZS9saW5lL2NvbHVtbiBhc3NvY2lhdGVkIHdpdGggYSBnZW5lcmF0ZWQgbGluZS9jb2x1bW5cbiAqICh0aGluaywgZnJvbSBhIHN0YWNrIHRyYWNlKS4gTGluZSBpcyAxLWJhc2VkLCBidXQgY29sdW1uIGlzIDAtYmFzZWQsIGR1ZSB0byBsZWdhY3kgYmVoYXZpb3IgaW5cbiAqIGBzb3VyY2UtbWFwYCBsaWJyYXJ5LlxuICovXG5sZXQgb3JpZ2luYWxQb3NpdGlvbkZvciQxO1xuY2xhc3MgVHJhY2VNYXAge1xuICAgIGNvbnN0cnVjdG9yKG1hcCwgbWFwVXJsKSB7XG4gICAgICAgIGNvbnN0IGlzU3RyaW5nID0gdHlwZW9mIG1hcCA9PT0gJ3N0cmluZyc7XG4gICAgICAgIGlmICghaXNTdHJpbmcgJiYgbWFwLl9kZWNvZGVkTWVtbylcbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IChpc1N0cmluZyA/IEpTT04ucGFyc2UobWFwKSA6IG1hcCk7XG4gICAgICAgIGNvbnN0IHsgdmVyc2lvbiwgZmlsZSwgbmFtZXMsIHNvdXJjZVJvb3QsIHNvdXJjZXMsIHNvdXJjZXNDb250ZW50IH0gPSBwYXJzZWQ7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgICAgIHRoaXMubmFtZXMgPSBuYW1lcztcbiAgICAgICAgdGhpcy5zb3VyY2VSb290ID0gc291cmNlUm9vdDtcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcbiAgICAgICAgdGhpcy5zb3VyY2VzQ29udGVudCA9IHNvdXJjZXNDb250ZW50O1xuICAgICAgICBjb25zdCBmcm9tID0gcmVzb2x2ZSQxKHNvdXJjZVJvb3QgfHwgJycsIHN0cmlwRmlsZW5hbWUobWFwVXJsKSk7XG4gICAgICAgIHRoaXMucmVzb2x2ZWRTb3VyY2VzID0gc291cmNlcy5tYXAoKHMpID0+IHJlc29sdmUkMShzIHx8ICcnLCBmcm9tKSk7XG4gICAgICAgIGNvbnN0IHsgbWFwcGluZ3MgfSA9IHBhcnNlZDtcbiAgICAgICAgaWYgKHR5cGVvZiBtYXBwaW5ncyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX2VuY29kZWQgPSBtYXBwaW5ncztcbiAgICAgICAgICAgIHRoaXMuX2RlY29kZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbmNvZGVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fZGVjb2RlZCA9IG1heWJlU29ydChtYXBwaW5ncywgaXNTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlY29kZWRNZW1vID0gbWVtb2l6ZWRTdGF0ZSgpO1xuICAgICAgICB0aGlzLl9ieVNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2J5U291cmNlTWVtb3MgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuKCgpID0+IHtcbiAgICBkZWNvZGVkTWFwcGluZ3MgPSAobWFwKSA9PiB7XG4gICAgICAgIHJldHVybiAobWFwLl9kZWNvZGVkIHx8IChtYXAuX2RlY29kZWQgPSBkZWNvZGUobWFwLl9lbmNvZGVkKSkpO1xuICAgIH07XG4gICAgdHJhY2VTZWdtZW50ID0gKG1hcCwgbGluZSwgY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVkTWFwcGluZ3MobWFwKTtcbiAgICAgICAgLy8gSXQncyBjb21tb24gZm9yIHBhcmVudCBzb3VyY2UgbWFwcyB0byBoYXZlIHBvaW50ZXJzIHRvIGxpbmVzIHRoYXQgaGF2ZSBub1xuICAgICAgICAvLyBtYXBwaW5nIChsaWtlIGEgXCIvLyMgc291cmNlTWFwcGluZ1VSTD1cIikgYXQgdGhlIGVuZCBvZiB0aGUgY2hpbGQgZmlsZS5cbiAgICAgICAgaWYgKGxpbmUgPj0gZGVjb2RlZC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBkZWNvZGVkW2xpbmVdO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRyYWNlU2VnbWVudEludGVybmFsKHNlZ21lbnRzLCBtYXAuX2RlY29kZWRNZW1vLCBsaW5lLCBjb2x1bW4sIEdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID09PSAtMSA/IG51bGwgOiBzZWdtZW50c1tpbmRleF07XG4gICAgfTtcbiAgICBvcmlnaW5hbFBvc2l0aW9uRm9yJDEgPSAobWFwLCB7IGxpbmUsIGNvbHVtbiwgYmlhcyB9KSA9PiB7XG4gICAgICAgIGxpbmUtLTtcbiAgICAgICAgaWYgKGxpbmUgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKExJTkVfR1RSX1pFUk8pO1xuICAgICAgICBpZiAoY29sdW1uIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihDT0xfR1RSX0VRX1pFUk8pO1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlZE1hcHBpbmdzKG1hcCk7XG4gICAgICAgIC8vIEl0J3MgY29tbW9uIGZvciBwYXJlbnQgc291cmNlIG1hcHMgdG8gaGF2ZSBwb2ludGVycyB0byBsaW5lcyB0aGF0IGhhdmUgbm9cbiAgICAgICAgLy8gbWFwcGluZyAobGlrZSBhIFwiLy8jIHNvdXJjZU1hcHBpbmdVUkw9XCIpIGF0IHRoZSBlbmQgb2YgdGhlIGNoaWxkIGZpbGUuXG4gICAgICAgIGlmIChsaW5lID49IGRlY29kZWQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIE9NYXBwaW5nKG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IGRlY29kZWRbbGluZV07XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdHJhY2VTZWdtZW50SW50ZXJuYWwoc2VnbWVudHMsIG1hcC5fZGVjb2RlZE1lbW8sIGxpbmUsIGNvbHVtbiwgYmlhcyB8fCBHUkVBVEVTVF9MT1dFUl9CT1VORCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gT01hcHBpbmcobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1tpbmRleF07XG4gICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBPTWFwcGluZyhudWxsLCBudWxsLCBudWxsLCBudWxsKTtcbiAgICAgICAgY29uc3QgeyBuYW1lcywgcmVzb2x2ZWRTb3VyY2VzIH0gPSBtYXA7XG4gICAgICAgIHJldHVybiBPTWFwcGluZyhyZXNvbHZlZFNvdXJjZXNbc2VnbWVudFtTT1VSQ0VTX0lOREVYXV0sIHNlZ21lbnRbU09VUkNFX0xJTkVdICsgMSwgc2VnbWVudFtTT1VSQ0VfQ09MVU1OXSwgc2VnbWVudC5sZW5ndGggPT09IDUgPyBuYW1lc1tzZWdtZW50W05BTUVTX0lOREVYXV0gOiBudWxsKTtcbiAgICB9O1xufSkoKTtcbmZ1bmN0aW9uIE9NYXBwaW5nKHNvdXJjZSwgbGluZSwgY29sdW1uLCBuYW1lKSB7XG4gICAgcmV0dXJuIHsgc291cmNlLCBsaW5lLCBjb2x1bW4sIG5hbWUgfTtcbn1cbmZ1bmN0aW9uIHRyYWNlU2VnbWVudEludGVybmFsKHNlZ21lbnRzLCBtZW1vLCBsaW5lLCBjb2x1bW4sIGJpYXMpIHtcbiAgICBsZXQgaW5kZXggPSBtZW1vaXplZEJpbmFyeVNlYXJjaChzZWdtZW50cywgY29sdW1uLCBtZW1vLCBsaW5lKTtcbiAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgaW5kZXggPSAoYmlhcyA9PT0gTEVBU1RfVVBQRVJfQk9VTkQgPyB1cHBlckJvdW5kIDogbG93ZXJCb3VuZCkoc2VnbWVudHMsIGNvbHVtbiwgaW5kZXgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChiaWFzID09PSBMRUFTVF9VUFBFUl9CT1VORClcbiAgICAgICAgaW5kZXgrKztcbiAgICBpZiAoaW5kZXggPT09IC0xIHx8IGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGgpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICByZXR1cm4gaW5kZXg7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXNzb2NpYXRlZCB3aXRoIGBrZXlgIGluIHRoZSBiYWNraW5nIGFycmF5LCBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuXG4gKi9cbmxldCBnZXQ7XG4vKipcbiAqIFB1dHMgYGtleWAgaW50byB0aGUgYmFja2luZyBhcnJheSwgaWYgaXQgaXMgbm90IGFscmVhZHkgcHJlc2VudC4gUmV0dXJuc1xuICogdGhlIGluZGV4IG9mIHRoZSBga2V5YCBpbiB0aGUgYmFja2luZyBhcnJheS5cbiAqL1xubGV0IHB1dDtcbi8qKlxuICogU2V0QXJyYXkgYWN0cyBsaWtlIGEgYFNldGAgKGFsbG93aW5nIG9ubHkgb25lIG9jY3VycmVuY2Ugb2YgYSBzdHJpbmcgYGtleWApLCBidXQgcHJvdmlkZXMgdGhlXG4gKiBpbmRleCBvZiB0aGUgYGtleWAgaW4gdGhlIGJhY2tpbmcgYXJyYXkuXG4gKlxuICogVGhpcyBpcyBkZXNpZ25lZCB0byBhbGxvdyBzeW5jaHJvbml6aW5nIGEgc2Vjb25kIGFycmF5IHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBiYWNraW5nIGFycmF5LFxuICogbGlrZSBob3cgaW4gYSBzb3VyY2VtYXAgYHNvdXJjZXNDb250ZW50W2ldYCBpcyB0aGUgc291cmNlIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGBzb3VyY2VbaV1gLFxuICogYW5kIHRoZXJlIGFyZSBuZXZlciBkdXBsaWNhdGVzLlxuICovXG5jbGFzcyBTZXRBcnJheSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2luZGV4ZXMgPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgfVxufVxuKCgpID0+IHtcbiAgICBnZXQgPSAoc3RyYXJyLCBrZXkpID0+IHN0cmFyci5faW5kZXhlc1trZXldO1xuICAgIHB1dCA9IChzdHJhcnIsIGtleSkgPT4ge1xuICAgICAgICAvLyBUaGUga2V5IG1heSBvciBtYXkgbm90IGJlIHByZXNlbnQuIElmIGl0IGlzIHByZXNlbnQsIGl0J3MgYSBudW1iZXIuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZ2V0KHN0cmFyciwga2V5KTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIGNvbnN0IHsgYXJyYXksIF9pbmRleGVzOiBpbmRleGVzIH0gPSBzdHJhcnI7XG4gICAgICAgIHJldHVybiAoaW5kZXhlc1trZXldID0gYXJyYXkucHVzaChrZXkpIC0gMSk7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogQSBsb3ctbGV2ZWwgQVBJIHRvIGFzc29jaWF0ZSBhIGdlbmVyYXRlZCBwb3NpdGlvbiB3aXRoIGFuIG9yaWdpbmFsIHNvdXJjZSBwb3NpdGlvbi4gTGluZSBhbmRcbiAqIGNvbHVtbiBoZXJlIGFyZSAwLWJhc2VkLCB1bmxpa2UgYGFkZE1hcHBpbmdgLlxuICovXG5sZXQgYWRkU2VnbWVudDtcbi8qKlxuICogQWRkcy9yZW1vdmVzIHRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSB0byB0aGUgc291cmNlIG1hcC5cbiAqL1xubGV0IHNldFNvdXJjZUNvbnRlbnQ7XG4vKipcbiAqIFJldHVybnMgYSBzb3VyY2VtYXAgb2JqZWN0ICh3aXRoIGRlY29kZWQgbWFwcGluZ3MpIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGEgbGlicmFyeSB0aGF0IGV4cGVjdHNcbiAqIGEgc291cmNlbWFwLCBvciB0byBKU09OLnN0cmluZ2lmeS5cbiAqL1xubGV0IGRlY29kZWRNYXA7XG4vKipcbiAqIFJldHVybnMgYSBzb3VyY2VtYXAgb2JqZWN0ICh3aXRoIGVuY29kZWQgbWFwcGluZ3MpIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGEgbGlicmFyeSB0aGF0IGV4cGVjdHNcbiAqIGEgc291cmNlbWFwLCBvciB0byBKU09OLnN0cmluZ2lmeS5cbiAqL1xubGV0IGVuY29kZWRNYXA7XG4vKipcbiAqIFByb3ZpZGVzIHRoZSBzdGF0ZSB0byBnZW5lcmF0ZSBhIHNvdXJjZW1hcC5cbiAqL1xuY2xhc3MgR2VuTWFwcGluZyB7XG4gICAgY29uc3RydWN0b3IoeyBmaWxlLCBzb3VyY2VSb290IH0gPSB7fSkge1xuICAgICAgICB0aGlzLl9uYW1lcyA9IG5ldyBTZXRBcnJheSgpO1xuICAgICAgICB0aGlzLl9zb3VyY2VzID0gbmV3IFNldEFycmF5KCk7XG4gICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50ID0gW107XG4gICAgICAgIHRoaXMuX21hcHBpbmdzID0gW107XG4gICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7XG4gICAgICAgIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gICAgfVxufVxuKCgpID0+IHtcbiAgICBhZGRTZWdtZW50ID0gKG1hcCwgZ2VuTGluZSwgZ2VuQ29sdW1uLCBzb3VyY2UsIHNvdXJjZUxpbmUsIHNvdXJjZUNvbHVtbiwgbmFtZSkgPT4ge1xuICAgICAgICBjb25zdCB7IF9tYXBwaW5nczogbWFwcGluZ3MsIF9zb3VyY2VzOiBzb3VyY2VzLCBfc291cmNlc0NvbnRlbnQ6IHNvdXJjZXNDb250ZW50LCBfbmFtZXM6IG5hbWVzLCB9ID0gbWFwO1xuICAgICAgICBjb25zdCBsaW5lID0gZ2V0TGluZShtYXBwaW5ncywgZ2VuTGluZSk7XG4gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2VnID0gW2dlbkNvbHVtbl07XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGdldENvbHVtbkluZGV4KGxpbmUsIGdlbkNvbHVtbiwgc2VnKTtcbiAgICAgICAgICAgIHJldHVybiBpbnNlcnQobGluZSwgaW5kZXgsIHNlZyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlc0luZGV4ID0gcHV0KHNvdXJjZXMsIHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IHNlZyA9IG5hbWVcbiAgICAgICAgICAgID8gW2dlbkNvbHVtbiwgc291cmNlc0luZGV4LCBzb3VyY2VMaW5lLCBzb3VyY2VDb2x1bW4sIHB1dChuYW1lcywgbmFtZSldXG4gICAgICAgICAgICA6IFtnZW5Db2x1bW4sIHNvdXJjZXNJbmRleCwgc291cmNlTGluZSwgc291cmNlQ29sdW1uXTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBnZXRDb2x1bW5JbmRleChsaW5lLCBnZW5Db2x1bW4sIHNlZyk7XG4gICAgICAgIGlmIChzb3VyY2VzSW5kZXggPT09IHNvdXJjZXNDb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgIHNvdXJjZXNDb250ZW50W3NvdXJjZXNJbmRleF0gPSBudWxsO1xuICAgICAgICBpbnNlcnQobGluZSwgaW5kZXgsIHNlZyk7XG4gICAgfTtcbiAgICBzZXRTb3VyY2VDb250ZW50ID0gKG1hcCwgc291cmNlLCBjb250ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgX3NvdXJjZXM6IHNvdXJjZXMsIF9zb3VyY2VzQ29udGVudDogc291cmNlc0NvbnRlbnQgfSA9IG1hcDtcbiAgICAgICAgc291cmNlc0NvbnRlbnRbcHV0KHNvdXJjZXMsIHNvdXJjZSldID0gY29udGVudDtcbiAgICB9O1xuICAgIGRlY29kZWRNYXAgPSAobWFwKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZmlsZSwgc291cmNlUm9vdCwgX21hcHBpbmdzOiBtYXBwaW5ncywgX3NvdXJjZXM6IHNvdXJjZXMsIF9zb3VyY2VzQ29udGVudDogc291cmNlc0NvbnRlbnQsIF9uYW1lczogbmFtZXMsIH0gPSBtYXA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2ZXJzaW9uOiAzLFxuICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgIG5hbWVzOiBuYW1lcy5hcnJheSxcbiAgICAgICAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3QgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgc291cmNlczogc291cmNlcy5hcnJheSxcbiAgICAgICAgICAgIHNvdXJjZXNDb250ZW50LFxuICAgICAgICAgICAgbWFwcGluZ3MsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBlbmNvZGVkTWFwID0gKG1hcCkgPT4ge1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlZE1hcChtYXApO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWNvZGVkKSwgeyBtYXBwaW5nczogZW5jb2RlJDEoZGVjb2RlZC5tYXBwaW5ncykgfSk7XG4gICAgfTtcbn0pKCk7XG5mdW5jdGlvbiBnZXRMaW5lKG1hcHBpbmdzLCBpbmRleCkge1xuICAgIGZvciAobGV0IGkgPSBtYXBwaW5ncy5sZW5ndGg7IGkgPD0gaW5kZXg7IGkrKykge1xuICAgICAgICBtYXBwaW5nc1tpXSA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gbWFwcGluZ3NbaW5kZXhdO1xufVxuZnVuY3Rpb24gZ2V0Q29sdW1uSW5kZXgobGluZSwgY29sdW1uLCBzZWcpIHtcbiAgICBsZXQgaW5kZXggPSBsaW5lLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gaW5kZXggLSAxOyBpID49IDA7IGktLSwgaW5kZXgtLSkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gbGluZVtpXTtcbiAgICAgICAgY29uc3QgY29sID0gY3VycmVudFswXTtcbiAgICAgICAgaWYgKGNvbCA+IGNvbHVtbilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoY29sIDwgY29sdW1uKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNvbnN0IGNtcCA9IGNvbXBhcmUkMShjdXJyZW50LCBzZWcpO1xuICAgICAgICBpZiAoY21wID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICBpZiAoY21wIDwgMClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG59XG5mdW5jdGlvbiBjb21wYXJlJDEoYSwgYikge1xuICAgIGxldCBjbXAgPSBjb21wYXJlTnVtKGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gICAgaWYgKGNtcCAhPT0gMClcbiAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAvLyBXZSd2ZSBhbHJlYWR5IGNoZWNrZWQgZ2VuQ29sdW1uXG4gICAgaWYgKGEubGVuZ3RoID09PSAxKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBjbXAgPSBjb21wYXJlTnVtKGFbMV0sIGJbMV0pO1xuICAgIGlmIChjbXAgIT09IDApXG4gICAgICAgIHJldHVybiBjbXA7XG4gICAgY21wID0gY29tcGFyZU51bShhWzJdLCBiWzJdKTtcbiAgICBpZiAoY21wICE9PSAwKVxuICAgICAgICByZXR1cm4gY21wO1xuICAgIGNtcCA9IGNvbXBhcmVOdW0oYVszXSwgYlszXSk7XG4gICAgaWYgKGNtcCAhPT0gMClcbiAgICAgICAgcmV0dXJuIGNtcDtcbiAgICBpZiAoYS5sZW5ndGggPT09IDQpXG4gICAgICAgIHJldHVybiAwO1xuICAgIHJldHVybiBjb21wYXJlTnVtKGFbNF0sIGJbNF0pO1xufVxuZnVuY3Rpb24gY29tcGFyZU51bShhLCBiKSB7XG4gICAgcmV0dXJuIGEgLSBiO1xufVxuZnVuY3Rpb24gaW5zZXJ0KGFycmF5LCBpbmRleCwgdmFsdWUpIHtcbiAgICBpZiAoaW5kZXggPT09IC0xKVxuICAgICAgICByZXR1cm47XG4gICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aDsgaSA+IGluZGV4OyBpLS0pIHtcbiAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtpIC0gMV07XG4gICAgfVxuICAgIGFycmF5W2luZGV4XSA9IHZhbHVlO1xufVxuXG5jb25zdCBTT1VSQ0VMRVNTX01BUFBJTkcgPSB7XG4gICAgc291cmNlOiBudWxsLFxuICAgIGNvbHVtbjogbnVsbCxcbiAgICBsaW5lOiBudWxsLFxuICAgIG5hbWU6IG51bGwsXG4gICAgY29udGVudDogbnVsbCxcbn07XG5jb25zdCBFTVBUWV9TT1VSQ0VTID0gW107XG5mdW5jdGlvbiBTb3VyY2UobWFwLCBzb3VyY2VzLCBzb3VyY2UsIGNvbnRlbnQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBtYXAsXG4gICAgICAgIHNvdXJjZXMsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgY29udGVudCxcbiAgICB9O1xufVxuLyoqXG4gKiBNYXBTb3VyY2UgcmVwcmVzZW50cyBhIHNpbmdsZSBzb3VyY2VtYXAsIHdpdGggdGhlIGFiaWxpdHkgdG8gdHJhY2UgbWFwcGluZ3MgaW50byBpdHMgY2hpbGQgbm9kZXNcbiAqICh3aGljaCBtYXkgdGhlbXNlbHZlcyBiZSBTb3VyY2VNYXBUcmVlcykuXG4gKi9cbmZ1bmN0aW9uIE1hcFNvdXJjZShtYXAsIHNvdXJjZXMpIHtcbiAgICByZXR1cm4gU291cmNlKG1hcCwgc291cmNlcywgJycsIG51bGwpO1xufVxuLyoqXG4gKiBBIFwibGVhZlwiIG5vZGUgaW4gdGhlIHNvdXJjZW1hcCB0cmVlLCByZXByZXNlbnRpbmcgYW4gb3JpZ2luYWwsIHVubW9kaWZpZWQgc291cmNlIGZpbGUuIFJlY3Vyc2l2ZVxuICogc2VnbWVudCB0cmFjaW5nIGVuZHMgYXQgdGhlIGBPcmlnaW5hbFNvdXJjZWAuXG4gKi9cbmZ1bmN0aW9uIE9yaWdpbmFsU291cmNlKHNvdXJjZSwgY29udGVudCkge1xuICAgIHJldHVybiBTb3VyY2UobnVsbCwgRU1QVFlfU09VUkNFUywgc291cmNlLCBjb250ZW50KTtcbn1cbi8qKlxuICogdHJhY2VNYXBwaW5ncyBpcyBvbmx5IGNhbGxlZCBvbiB0aGUgcm9vdCBsZXZlbCBTb3VyY2VNYXBUcmVlLCBhbmQgYmVnaW5zIHRoZSBwcm9jZXNzIG9mXG4gKiByZXNvbHZpbmcgZWFjaCBtYXBwaW5nIGluIHRlcm1zIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKi9cbmZ1bmN0aW9uIHRyYWNlTWFwcGluZ3ModHJlZSkge1xuICAgIGNvbnN0IGdlbiA9IG5ldyBHZW5NYXBwaW5nKHsgZmlsZTogdHJlZS5tYXAuZmlsZSB9KTtcbiAgICBjb25zdCB7IHNvdXJjZXM6IHJvb3RTb3VyY2VzLCBtYXAgfSA9IHRyZWU7XG4gICAgY29uc3Qgcm9vdE5hbWVzID0gbWFwLm5hbWVzO1xuICAgIGNvbnN0IHJvb3RNYXBwaW5ncyA9IGRlY29kZWRNYXBwaW5ncyhtYXApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdE1hcHBpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gcm9vdE1hcHBpbmdzW2ldO1xuICAgICAgICBsZXQgbGFzdFNvdXJjZSA9IG51bGw7XG4gICAgICAgIGxldCBsYXN0U291cmNlTGluZSA9IG51bGw7XG4gICAgICAgIGxldCBsYXN0U291cmNlQ29sdW1uID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzZWdtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2pdO1xuICAgICAgICAgICAgY29uc3QgZ2VuQ29sID0gc2VnbWVudFswXTtcbiAgICAgICAgICAgIGxldCB0cmFjZWQgPSBTT1VSQ0VMRVNTX01BUFBJTkc7XG4gICAgICAgICAgICAvLyAxLWxlbmd0aCBzZWdtZW50cyBvbmx5IG1vdmUgdGhlIGN1cnJlbnQgZ2VuZXJhdGVkIGNvbHVtbiwgdGhlcmUncyBubyBzb3VyY2UgaW5mb3JtYXRpb25cbiAgICAgICAgICAgIC8vIHRvIGdhdGhlciBmcm9tIGl0LlxuICAgICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gcm9vdFNvdXJjZXNbc2VnbWVudFsxXV07XG4gICAgICAgICAgICAgICAgdHJhY2VkID0gb3JpZ2luYWxQb3NpdGlvbkZvcihzb3VyY2UsIHNlZ21lbnRbMl0sIHNlZ21lbnRbM10sIHNlZ21lbnQubGVuZ3RoID09PSA1ID8gcm9vdE5hbWVzW3NlZ21lbnRbNF1dIDogJycpO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0cmFjZSBpcyBpbnZhbGlkLCB0aGVuIHRoZSB0cmFjZSByYW4gaW50byBhIHNvdXJjZW1hcCB0aGF0IGRvZXNuJ3QgY29udGFpbiBhXG4gICAgICAgICAgICAgICAgLy8gcmVzcGVjdGl2ZSBzZWdtZW50IGludG8gYW4gb3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgICAgICAgIGlmICh0cmFjZWQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTbyB3ZSB0cmFjZWQgYSBzZWdtZW50IGRvd24gaW50byBpdHMgb3JpZ2luYWwgc291cmNlIGZpbGUuIE5vdyBwdXNoIGFcbiAgICAgICAgICAgIC8vIG5ldyBzZWdtZW50IHBvaW50aW5nIHRvIHRoaXMgbG9jYXRpb24uXG4gICAgICAgICAgICBjb25zdCB7IGNvbHVtbiwgbGluZSwgbmFtZSwgY29udGVudCwgc291cmNlIH0gPSB0cmFjZWQ7XG4gICAgICAgICAgICBpZiAobGluZSA9PT0gbGFzdFNvdXJjZUxpbmUgJiYgY29sdW1uID09PSBsYXN0U291cmNlQ29sdW1uICYmIHNvdXJjZSA9PT0gbGFzdFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdFNvdXJjZUxpbmUgPSBsaW5lO1xuICAgICAgICAgICAgbGFzdFNvdXJjZUNvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgICAgIGxhc3RTb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICAvLyBTaWdoLCBUeXBlU2NyaXB0IGNhbid0IGZpZ3VyZSBvdXQgc291cmNlL2xpbmUvY29sdW1uIGFyZSBlaXRoZXIgYWxsIG51bGwsIG9yIGFsbCBub24tbnVsbC4uLlxuICAgICAgICAgICAgYWRkU2VnbWVudChnZW4sIGksIGdlbkNvbCwgc291cmNlLCBsaW5lLCBjb2x1bW4sIG5hbWUpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICBzZXRTb3VyY2VDb250ZW50KGdlbiwgc291cmNlLCBjb250ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2VuO1xufVxuLyoqXG4gKiBvcmlnaW5hbFBvc2l0aW9uRm9yIGlzIG9ubHkgY2FsbGVkIG9uIGNoaWxkcmVuIFNvdXJjZU1hcFRyZWVzLiBJdCByZWN1cnNlcyBkb3duIGludG8gaXRzIG93blxuICogY2hpbGQgU291cmNlTWFwVHJlZXMsIHVudGlsIHdlIGZpbmQgdGhlIG9yaWdpbmFsIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIG9yaWdpbmFsUG9zaXRpb25Gb3Ioc291cmNlLCBsaW5lLCBjb2x1bW4sIG5hbWUpIHtcbiAgICBpZiAoIXNvdXJjZS5tYXApIHtcbiAgICAgICAgcmV0dXJuIHsgY29sdW1uLCBsaW5lLCBuYW1lLCBzb3VyY2U6IHNvdXJjZS5zb3VyY2UsIGNvbnRlbnQ6IHNvdXJjZS5jb250ZW50IH07XG4gICAgfVxuICAgIGNvbnN0IHNlZ21lbnQgPSB0cmFjZVNlZ21lbnQoc291cmNlLm1hcCwgbGluZSwgY29sdW1uKTtcbiAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIGEgc2VnbWVudCwgdGhlbiB0aGlzIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHNvdXJjZW1hcC5cbiAgICBpZiAoc2VnbWVudCA9PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAvLyAxLWxlbmd0aCBzZWdtZW50cyBvbmx5IG1vdmUgdGhlIGN1cnJlbnQgZ2VuZXJhdGVkIGNvbHVtbiwgdGhlcmUncyBubyBzb3VyY2UgaW5mb3JtYXRpb25cbiAgICAvLyB0byBnYXRoZXIgZnJvbSBpdC5cbiAgICBpZiAoc2VnbWVudC5sZW5ndGggPT09IDEpXG4gICAgICAgIHJldHVybiBTT1VSQ0VMRVNTX01BUFBJTkc7XG4gICAgcmV0dXJuIG9yaWdpbmFsUG9zaXRpb25Gb3Ioc291cmNlLnNvdXJjZXNbc2VnbWVudFsxXV0sIHNlZ21lbnRbMl0sIHNlZ21lbnRbM10sIHNlZ21lbnQubGVuZ3RoID09PSA1ID8gc291cmNlLm1hcC5uYW1lc1tzZWdtZW50WzRdXSA6IG5hbWUpO1xufVxuXG5mdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIFt2YWx1ZV07XG59XG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGJ1aWxkcyBhIHRyZWUgc3RydWN0dXJlIG91dCBvZiBzb3VyY2VtYXAgZmlsZXMsIHdpdGggZWFjaCBub2RlXG4gKiBiZWluZyBlaXRoZXIgYW4gYE9yaWdpbmFsU291cmNlYCBcImxlYWZcIiBvciBhIGBTb3VyY2VNYXBUcmVlYCBjb21wb3NlZCBvZlxuICogYE9yaWdpbmFsU291cmNlYHMgYW5kIGBTb3VyY2VNYXBUcmVlYHMuXG4gKlxuICogRXZlcnkgc291cmNlbWFwIGlzIGNvbXBvc2VkIG9mIGEgY29sbGVjdGlvbiBvZiBzb3VyY2UgZmlsZXMgYW5kIG1hcHBpbmdzXG4gKiBpbnRvIGxvY2F0aW9ucyBvZiB0aG9zZSBzb3VyY2UgZmlsZXMuIFdoZW4gd2UgZ2VuZXJhdGUgYSBgU291cmNlTWFwVHJlZWAgZm9yXG4gKiB0aGUgc291cmNlbWFwLCB3ZSBhdHRlbXB0IHRvIGxvYWQgZWFjaCBzb3VyY2UgZmlsZSdzIG93biBzb3VyY2VtYXAuIElmIGl0XG4gKiBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgc291cmNlbWFwLCBpdCBpcyBjb25zaWRlcmVkIGFuIG9yaWdpbmFsLFxuICogdW5tb2RpZmllZCBzb3VyY2UgZmlsZS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTb3VyY2VNYXBUcmVlKGlucHV0LCBsb2FkZXIpIHtcbiAgICBjb25zdCBtYXBzID0gYXNBcnJheShpbnB1dCkubWFwKChtKSA9PiBuZXcgVHJhY2VNYXAobSwgJycpKTtcbiAgICBjb25zdCBtYXAgPSBtYXBzLnBvcCgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobWFwc1tpXS5zb3VyY2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNmb3JtYXRpb24gbWFwICR7aX0gbXVzdCBoYXZlIGV4YWN0bHkgb25lIHNvdXJjZSBmaWxlLlxcbmAgK1xuICAgICAgICAgICAgICAgICdEaWQgeW91IHNwZWNpZnkgdGhlc2Ugd2l0aCB0aGUgbW9zdCByZWNlbnQgdHJhbnNmb3JtYXRpb24gbWFwcyBmaXJzdD8nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgdHJlZSA9IGJ1aWxkJDIobWFwLCBsb2FkZXIsICcnLCAwKTtcbiAgICBmb3IgKGxldCBpID0gbWFwcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0cmVlID0gTWFwU291cmNlKG1hcHNbaV0sIFt0cmVlXSk7XG4gICAgfVxuICAgIHJldHVybiB0cmVlO1xufVxuZnVuY3Rpb24gYnVpbGQkMihtYXAsIGxvYWRlciwgaW1wb3J0ZXIsIGltcG9ydGVyRGVwdGgpIHtcbiAgICBjb25zdCB7IHJlc29sdmVkU291cmNlcywgc291cmNlc0NvbnRlbnQgfSA9IG1hcDtcbiAgICBjb25zdCBkZXB0aCA9IGltcG9ydGVyRGVwdGggKyAxO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gcmVzb2x2ZWRTb3VyY2VzLm1hcCgoc291cmNlRmlsZSwgaSkgPT4ge1xuICAgICAgICAvLyBUaGUgbG9hZGluZyBjb250ZXh0IGdpdmVzIHRoZSBsb2FkZXIgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aHkgdGhpcyBmaWxlIGlzIGJlaW5nIGxvYWRlZFxuICAgICAgICAvLyAoZWcsIGZyb20gd2hpY2ggaW1wb3J0ZXIpLiBJdCBhbHNvIGFsbG93cyB0aGUgbG9hZGVyIHRvIG92ZXJyaWRlIHRoZSBsb2NhdGlvbiBvZiB0aGUgbG9hZGVkXG4gICAgICAgIC8vIHNvdXJjZW1hcC9vcmlnaW5hbCBzb3VyY2UsIG9yIHRvIG92ZXJyaWRlIHRoZSBjb250ZW50IGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZCBpZiBpdCdzXG4gICAgICAgIC8vIGFuIHVubW9kaWZpZWQgc291cmNlIGZpbGUuXG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGltcG9ydGVyLFxuICAgICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZUZpbGUgfHwgJycsXG4gICAgICAgICAgICBjb250ZW50OiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICAgIC8vIFVzZSB0aGUgcHJvdmlkZWQgbG9hZGVyIGNhbGxiYWNrIHRvIHJldHJpZXZlIHRoZSBmaWxlJ3Mgc291cmNlbWFwLlxuICAgICAgICAvLyBUT0RPOiBXZSBzaG91bGQgZXZlbnR1YWxseSBzdXBwb3J0IGFzeW5jIGxvYWRpbmcgb2Ygc291cmNlbWFwIGZpbGVzLlxuICAgICAgICBjb25zdCBzb3VyY2VNYXAgPSBsb2FkZXIoY3R4LnNvdXJjZSwgY3R4KTtcbiAgICAgICAgY29uc3QgeyBzb3VyY2UsIGNvbnRlbnQgfSA9IGN0eDtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzb3VyY2VtYXAsIHRoZW4gd2UgbmVlZCB0byByZWN1cnNlIGludG8gaXQgdG8gbG9hZCBpdHMgc291cmNlIGZpbGVzLlxuICAgICAgICBpZiAoc291cmNlTWFwKVxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkJDIobmV3IFRyYWNlTWFwKHNvdXJjZU1hcCwgc291cmNlKSwgbG9hZGVyLCBzb3VyY2UsIGRlcHRoKTtcbiAgICAgICAgLy8gRWxzZSwgaXQncyBhbiBhbiB1bm1vZGlmaWVkIHNvdXJjZSBmaWxlLlxuICAgICAgICAvLyBUaGUgY29udGVudHMgb2YgdGhpcyB1bm1vZGlmaWVkIHNvdXJjZSBmaWxlIGNhbiBiZSBvdmVycmlkZGVuIHZpYSB0aGUgbG9hZGVyIGNvbnRleHQsXG4gICAgICAgIC8vIGFsbG93aW5nIGl0IHRvIGJlIGV4cGxpY2l0bHkgbnVsbCBvciBhIHN0cmluZy4gSWYgaXQgcmVtYWlucyB1bmRlZmluZWQsIHdlIGZhbGwgYmFjayB0b1xuICAgICAgICAvLyB0aGUgaW1wb3J0aW5nIHNvdXJjZW1hcCdzIGBzb3VyY2VzQ29udGVudGAgZmllbGQuXG4gICAgICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSBjb250ZW50ICE9PSB1bmRlZmluZWQgPyBjb250ZW50IDogc291cmNlc0NvbnRlbnQgPyBzb3VyY2VzQ29udGVudFtpXSA6IG51bGw7XG4gICAgICAgIHJldHVybiBPcmlnaW5hbFNvdXJjZShzb3VyY2UsIHNvdXJjZUNvbnRlbnQpO1xuICAgIH0pO1xuICAgIHJldHVybiBNYXBTb3VyY2UobWFwLCBjaGlsZHJlbik7XG59XG5cbi8qKlxuICogQSBTb3VyY2VNYXAgdjMgY29tcGF0aWJsZSBzb3VyY2VtYXAsIHdoaWNoIG9ubHkgaW5jbHVkZXMgZmllbGRzIHRoYXQgd2VyZVxuICogcHJvdmlkZWQgdG8gaXQuXG4gKi9cbmxldCBTb3VyY2VNYXAkMSA9IGNsYXNzIFNvdXJjZU1hcCB7XG4gICAgY29uc3RydWN0b3IobWFwLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG91dCA9IG9wdGlvbnMuZGVjb2RlZE1hcHBpbmdzID8gZGVjb2RlZE1hcChtYXApIDogZW5jb2RlZE1hcChtYXApO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvdXQudmVyc2lvbjsgLy8gU291cmNlTWFwIHNwZWMgc2F5cyB0aGlzIHNob3VsZCBiZSBmaXJzdC5cbiAgICAgICAgdGhpcy5maWxlID0gb3V0LmZpbGU7XG4gICAgICAgIHRoaXMubWFwcGluZ3MgPSBvdXQubWFwcGluZ3M7XG4gICAgICAgIHRoaXMubmFtZXMgPSBvdXQubmFtZXM7XG4gICAgICAgIHRoaXMuc291cmNlUm9vdCA9IG91dC5zb3VyY2VSb290O1xuICAgICAgICB0aGlzLnNvdXJjZXMgPSBvdXQuc291cmNlcztcbiAgICAgICAgaWYgKCFvcHRpb25zLmV4Y2x1ZGVDb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXNDb250ZW50ID0gb3V0LnNvdXJjZXNDb250ZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBUcmFjZXMgdGhyb3VnaCBhbGwgdGhlIG1hcHBpbmdzIGluIHRoZSByb290IHNvdXJjZW1hcCwgdGhyb3VnaCB0aGUgc291cmNlc1xuICogKGFuZCB0aGVpciBzb3VyY2VtYXBzKSwgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgb3JpZ2luYWwgc291cmNlIGxvY2F0aW9uLlxuICpcbiAqIGBsb2FkZXJgIHdpbGwgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgZW5jb3VudGVyIGEgc291cmNlIGZpbGUuIElmIGl0IHJldHVybnNcbiAqIGEgc291cmNlbWFwLCB3ZSB3aWxsIHJlY3Vyc2UgaW50byB0aGF0IHNvdXJjZW1hcCB0byBjb250aW51ZSB0aGUgdHJhY2UuIElmXG4gKiBpdCByZXR1cm5zIGEgZmFsc2V5IHZhbHVlLCB0aGF0IHNvdXJjZSBmaWxlIGlzIHRyZWF0ZWQgYXMgYW4gb3JpZ2luYWwsXG4gKiB1bm1vZGlmaWVkIHNvdXJjZSBmaWxlLlxuICpcbiAqIFBhc3MgYGV4Y2x1ZGVDb250ZW50YCB0byBleGNsdWRlIGFueSBzZWxmLWNvbnRhaW5pbmcgc291cmNlIGZpbGUgY29udGVudFxuICogZnJvbSB0aGUgb3V0cHV0IHNvdXJjZW1hcC5cbiAqXG4gKiBQYXNzIGBkZWNvZGVkTWFwcGluZ3NgIHRvIHJlY2VpdmUgYSBTb3VyY2VNYXAgd2l0aCBkZWNvZGVkIChpbnN0ZWFkIG9mXG4gKiBWTFEgZW5jb2RlZCkgbWFwcGluZ3MuXG4gKi9cbmZ1bmN0aW9uIHJlbWFwcGluZyhpbnB1dCwgbG9hZGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0cyA9IHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyA/IG9wdGlvbnMgOiB7IGV4Y2x1ZGVDb250ZW50OiAhIW9wdGlvbnMsIGRlY29kZWRNYXBwaW5nczogZmFsc2UgfTtcbiAgICBjb25zdCB0cmVlID0gYnVpbGRTb3VyY2VNYXBUcmVlKGlucHV0LCBsb2FkZXIpO1xuICAgIHJldHVybiBuZXcgU291cmNlTWFwJDEodHJhY2VNYXBwaW5ncyh0cmVlKSwgb3B0cyk7XG59XG5cbnZhciBzcmNFeHBvcnRzJDEgPSB7fTtcbnZhciBzcmMkMiA9IHtcbiAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIHNyY0V4cG9ydHMkMTsgfSxcbiAgc2V0IGV4cG9ydHModil7IHNyY0V4cG9ydHMkMSA9IHY7IH0sXG59O1xuXG52YXIgYnJvd3NlckV4cG9ydHMkMSA9IHt9O1xudmFyIGJyb3dzZXIkMiA9IHtcbiAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIGJyb3dzZXJFeHBvcnRzJDE7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBicm93c2VyRXhwb3J0cyQxID0gdjsgfSxcbn07XG5cbi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgbXMkMTtcbnZhciBoYXNSZXF1aXJlZE1zJDE7XG5cbmZ1bmN0aW9uIHJlcXVpcmVNcyQxICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkTXMkMSkgcmV0dXJuIG1zJDE7XG5cdGhhc1JlcXVpcmVkTXMkMSA9IDE7XG5cdHZhciBzID0gMTAwMDtcblx0dmFyIG0gPSBzICogNjA7XG5cdHZhciBoID0gbSAqIDYwO1xuXHR2YXIgZCA9IGggKiAyNDtcblx0dmFyIHcgPSBkICogNztcblx0dmFyIHkgPSBkICogMzY1LjI1O1xuXG5cdC8qKlxuXHQgKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuXHQgKlxuXHQgKiBPcHRpb25zOlxuXHQgKlxuXHQgKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuXHQgKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcblx0ICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cblx0ICogQGFwaSBwdWJsaWNcblx0ICovXG5cblx0bXMkMSA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuXHQgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHQgIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcblx0ICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcblx0ICAgIHJldHVybiBwYXJzZSh2YWwpO1xuXHQgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuXHQgICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG5cdCAgfVxuXHQgIHRocm93IG5ldyBFcnJvcihcblx0ICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuXHQgICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG5cdCAgKTtcblx0fTtcblxuXHQvKipcblx0ICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RyXG5cdCAqIEByZXR1cm4ge051bWJlcn1cblx0ICogQGFwaSBwcml2YXRlXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIHBhcnNlKHN0cikge1xuXHQgIHN0ciA9IFN0cmluZyhzdHIpO1xuXHQgIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG5cdCAgICByZXR1cm47XG5cdCAgfVxuXHQgIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcblx0ICAgIHN0clxuXHQgICk7XG5cdCAgaWYgKCFtYXRjaCkge1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblx0ICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuXHQgIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG5cdCAgc3dpdGNoICh0eXBlKSB7XG5cdCAgICBjYXNlICd5ZWFycyc6XG5cdCAgICBjYXNlICd5ZWFyJzpcblx0ICAgIGNhc2UgJ3lycyc6XG5cdCAgICBjYXNlICd5cic6XG5cdCAgICBjYXNlICd5Jzpcblx0ICAgICAgcmV0dXJuIG4gKiB5O1xuXHQgICAgY2FzZSAnd2Vla3MnOlxuXHQgICAgY2FzZSAnd2Vlayc6XG5cdCAgICBjYXNlICd3Jzpcblx0ICAgICAgcmV0dXJuIG4gKiB3O1xuXHQgICAgY2FzZSAnZGF5cyc6XG5cdCAgICBjYXNlICdkYXknOlxuXHQgICAgY2FzZSAnZCc6XG5cdCAgICAgIHJldHVybiBuICogZDtcblx0ICAgIGNhc2UgJ2hvdXJzJzpcblx0ICAgIGNhc2UgJ2hvdXInOlxuXHQgICAgY2FzZSAnaHJzJzpcblx0ICAgIGNhc2UgJ2hyJzpcblx0ICAgIGNhc2UgJ2gnOlxuXHQgICAgICByZXR1cm4gbiAqIGg7XG5cdCAgICBjYXNlICdtaW51dGVzJzpcblx0ICAgIGNhc2UgJ21pbnV0ZSc6XG5cdCAgICBjYXNlICdtaW5zJzpcblx0ICAgIGNhc2UgJ21pbic6XG5cdCAgICBjYXNlICdtJzpcblx0ICAgICAgcmV0dXJuIG4gKiBtO1xuXHQgICAgY2FzZSAnc2Vjb25kcyc6XG5cdCAgICBjYXNlICdzZWNvbmQnOlxuXHQgICAgY2FzZSAnc2Vjcyc6XG5cdCAgICBjYXNlICdzZWMnOlxuXHQgICAgY2FzZSAncyc6XG5cdCAgICAgIHJldHVybiBuICogcztcblx0ICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG5cdCAgICBjYXNlICdtaWxsaXNlY29uZCc6XG5cdCAgICBjYXNlICdtc2Vjcyc6XG5cdCAgICBjYXNlICdtc2VjJzpcblx0ICAgIGNhc2UgJ21zJzpcblx0ICAgICAgcmV0dXJuIG47XG5cdCAgICBkZWZhdWx0OlxuXHQgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXHQgIH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG5cdCAqXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqIEBhcGkgcHJpdmF0ZVxuXHQgKi9cblxuXHRmdW5jdGlvbiBmbXRTaG9ydChtcykge1xuXHQgIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcblx0ICBpZiAobXNBYnMgPj0gZCkge1xuXHQgICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcblx0ICB9XG5cdCAgaWYgKG1zQWJzID49IGgpIHtcblx0ICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG5cdCAgfVxuXHQgIGlmIChtc0FicyA+PSBtKSB7XG5cdCAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuXHQgIH1cblx0ICBpZiAobXNBYnMgPj0gcykge1xuXHQgICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcblx0ICB9XG5cdCAgcmV0dXJuIG1zICsgJ21zJztcblx0fVxuXG5cdC8qKlxuXHQgKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cblx0ICpcblx0ICogQHBhcmFtIHtOdW1iZXJ9IG1zXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICogQGFwaSBwcml2YXRlXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIGZtdExvbmcobXMpIHtcblx0ICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG5cdCAgaWYgKG1zQWJzID49IGQpIHtcblx0ICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG5cdCAgfVxuXHQgIGlmIChtc0FicyA+PSBoKSB7XG5cdCAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcblx0ICB9XG5cdCAgaWYgKG1zQWJzID49IG0pIHtcblx0ICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG5cdCAgfVxuXHQgIGlmIChtc0FicyA+PSBzKSB7XG5cdCAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuXHQgIH1cblx0ICByZXR1cm4gbXMgKyAnIG1zJztcblx0fVxuXG5cdC8qKlxuXHQgKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cblx0ICovXG5cblx0ZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuXHQgIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG5cdCAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG5cdH1cblx0cmV0dXJuIG1zJDE7XG59XG5cbnZhciBjb21tb24kYjtcbnZhciBoYXNSZXF1aXJlZENvbW1vbjtcblxuZnVuY3Rpb24gcmVxdWlyZUNvbW1vbiAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZENvbW1vbikgcmV0dXJuIGNvbW1vbiRiO1xuXHRoYXNSZXF1aXJlZENvbW1vbiA9IDE7XG5cdC8qKlxuXHQgKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG5cdCAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRcdGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWc7XG5cdFx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRcdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0XHRjcmVhdGVEZWJ1Zy5kaXNhYmxlID0gZGlzYWJsZTtcblx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdFx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdFx0Y3JlYXRlRGVidWcuaHVtYW5pemUgPSByZXF1aXJlTXMkMSgpO1xuXHRcdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdFx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0XHRjcmVhdGVEZWJ1Z1trZXldID0gZW52W2tleV07XG5cdFx0fSk7XG5cblx0XHQvKipcblx0XHQqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMsIGFuZCBuYW1lcyB0byBza2lwLlxuXHRcdCovXG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHQvKipcblx0XHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0XHQqXG5cdFx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdFx0Ki9cblx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzID0ge307XG5cblx0XHQvKipcblx0XHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0XHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBzdHJpbmcgZm9yIHRoZSBkZWJ1ZyBpbnN0YW5jZSB0byBiZSBjb2xvcmVkXG5cdFx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0XHQqIEBhcGkgcHJpdmF0ZVxuXHRcdCovXG5cdFx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdFx0fVxuXHRcdGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yID0gc2VsZWN0Q29sb3I7XG5cblx0XHQvKipcblx0XHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHRcdCpcblx0XHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0XHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHRcdCogQGFwaSBwdWJsaWNcblx0XHQqL1xuXHRcdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdFx0bGV0IHByZXZUaW1lO1xuXHRcdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRcdGxldCBuYW1lc3BhY2VzQ2FjaGU7XG5cdFx0XHRsZXQgZW5hYmxlZENhY2hlO1xuXG5cdFx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHRcdC8vIERpc2FibGVkP1xuXHRcdFx0XHRpZiAoIWRlYnVnLmVuYWJsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzZWxmID0gZGVidWc7XG5cblx0XHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdFx0Y29uc3QgY3VyciA9IE51bWJlcihuZXcgRGF0ZSgpKTtcblx0XHRcdFx0Y29uc3QgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdFx0c2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0XHRcdHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0XHRhcmdzWzBdID0gY3JlYXRlRGVidWcuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRcdGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRcdGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCAobWF0Y2gsIGZvcm1hdCkgPT4ge1xuXHRcdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdFx0XHRcdHJldHVybiAnJSc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdFx0Y29uc3QgZm9ybWF0dGVyID0gY3JlYXRlRGVidWcuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB2YWwgPSBhcmdzW2luZGV4XTtcblx0XHRcdFx0XHRcdG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuXHRcdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdFx0YXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHRcdFx0Y29uc3QgbG9nRm4gPSBzZWxmLmxvZyB8fCBjcmVhdGVEZWJ1Zy5sb2c7XG5cdFx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRcdGRlYnVnLmNvbG9yID0gY3JlYXRlRGVidWcuc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblx0XHRcdGRlYnVnLmV4dGVuZCA9IGV4dGVuZDtcblx0XHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGRlYnVnLCAnZW5hYmxlZCcsIHtcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGVuYWJsZU92ZXJyaWRlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChuYW1lc3BhY2VzQ2FjaGUgIT09IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMpIHtcblx0XHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0XHRlbmFibGVkQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0c2V0OiB2ID0+IHtcblx0XHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdFx0aWYgKHR5cGVvZiBjcmVhdGVEZWJ1Zy5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLmluaXQoZGVidWcpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGVidWc7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0XHRjb25zdCBuZXdEZWJ1ZyA9IGNyZWF0ZURlYnVnKHRoaXMubmFtZXNwYWNlICsgKHR5cGVvZiBkZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gJzonIDogZGVsaW1pdGVyKSArIG5hbWVzcGFjZSk7XG5cdFx0XHRuZXdEZWJ1Zy5sb2cgPSB0aGlzLmxvZztcblx0XHRcdHJldHVybiBuZXdEZWJ1Zztcblx0XHR9XG5cblx0XHQvKipcblx0XHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0XHQqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG5cdFx0KlxuXHRcdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0XHQqIEBhcGkgcHVibGljXG5cdFx0Ki9cblx0XHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdFx0Y3JlYXRlRGVidWcuc2F2ZShuYW1lc3BhY2VzKTtcblx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzO1xuXG5cdFx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdFx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHRcdFx0bGV0IGk7XG5cdFx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdFx0Ly8gaWdub3JlIGVtcHR5IHN0cmluZ3Ncblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuXG5cdFx0XHRcdGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcblx0XHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zbGljZSgxKSArICckJykpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcblx0XHQqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuXHRcdCpcblx0XHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHRcdCogQGFwaSBwdWJsaWNcblx0XHQqL1xuXHRcdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0XHRjb25zdCBuYW1lc3BhY2VzID0gW1xuXHRcdFx0XHQuLi5jcmVhdGVEZWJ1Zy5uYW1lcy5tYXAodG9OYW1lc3BhY2UpLFxuXHRcdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdFx0XS5qb2luKCcsJyk7XG5cdFx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUoJycpO1xuXHRcdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdFx0KlxuXHRcdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0XHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdFx0KiBAYXBpIHB1YmxpY1xuXHRcdCovXG5cdFx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0XHRpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBpO1xuXHRcdFx0bGV0IGxlbjtcblxuXHRcdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0aWYgKGNyZWF0ZURlYnVnLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0KiBDb252ZXJ0IHJlZ2V4cCB0byBuYW1lc3BhY2Vcblx0XHQqXG5cdFx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdFx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHRcdCogQGFwaSBwcml2YXRlXG5cdFx0Ki9cblx0XHRmdW5jdGlvbiB0b05hbWVzcGFjZShyZWdleHApIHtcblx0XHRcdHJldHVybiByZWdleHAudG9TdHJpbmcoKVxuXHRcdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHRcdC5yZXBsYWNlKC9cXC5cXCpcXD8kLywgJyonKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQqIENvZXJjZSBgdmFsYC5cblx0XHQqXG5cdFx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0XHQqIEByZXR1cm4ge01peGVkfVxuXHRcdCogQGFwaSBwcml2YXRlXG5cdFx0Ki9cblx0XHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0XHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0KiBYWFggRE8gTk9UIFVTRS4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzdHViIGZ1bmN0aW9uLlxuXHRcdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHRcdCovXG5cdFx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHRcdH1cblxuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZShjcmVhdGVEZWJ1Zy5sb2FkKCkpO1xuXG5cdFx0cmV0dXJuIGNyZWF0ZURlYnVnO1xuXHR9XG5cblx0Y29tbW9uJGIgPSBzZXR1cDtcblx0cmV0dXJuIGNvbW1vbiRiO1xufVxuXG4vKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxudmFyIGhhc1JlcXVpcmVkQnJvd3NlciQxO1xuXG5mdW5jdGlvbiByZXF1aXJlQnJvd3NlciQxICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkQnJvd3NlciQxKSByZXR1cm4gYnJvd3NlckV4cG9ydHMkMTtcblx0aGFzUmVxdWlyZWRCcm93c2VyJDEgPSAxO1xuXHQoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXHRcdC8qKlxuXHRcdCAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cblx0XHQgKi9cblxuXHRcdGV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5cdFx0ZXhwb3J0cy5zYXZlID0gc2F2ZTtcblx0XHRleHBvcnRzLmxvYWQgPSBsb2FkO1xuXHRcdGV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuXHRcdGV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuXHRcdGV4cG9ydHMuZGVzdHJveSA9ICgoKSA9PiB7XG5cdFx0XHRsZXQgd2FybmVkID0gZmFsc2U7XG5cblx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdGlmICghd2FybmVkKSB7XG5cdFx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9KSgpO1xuXG5cdFx0LyoqXG5cdFx0ICogQ29sb3JzLlxuXHRcdCAqL1xuXG5cdFx0ZXhwb3J0cy5jb2xvcnMgPSBbXG5cdFx0XHQnIzAwMDBDQycsXG5cdFx0XHQnIzAwMDBGRicsXG5cdFx0XHQnIzAwMzNDQycsXG5cdFx0XHQnIzAwMzNGRicsXG5cdFx0XHQnIzAwNjZDQycsXG5cdFx0XHQnIzAwNjZGRicsXG5cdFx0XHQnIzAwOTlDQycsXG5cdFx0XHQnIzAwOTlGRicsXG5cdFx0XHQnIzAwQ0MwMCcsXG5cdFx0XHQnIzAwQ0MzMycsXG5cdFx0XHQnIzAwQ0M2NicsXG5cdFx0XHQnIzAwQ0M5OScsXG5cdFx0XHQnIzAwQ0NDQycsXG5cdFx0XHQnIzAwQ0NGRicsXG5cdFx0XHQnIzMzMDBDQycsXG5cdFx0XHQnIzMzMDBGRicsXG5cdFx0XHQnIzMzMzNDQycsXG5cdFx0XHQnIzMzMzNGRicsXG5cdFx0XHQnIzMzNjZDQycsXG5cdFx0XHQnIzMzNjZGRicsXG5cdFx0XHQnIzMzOTlDQycsXG5cdFx0XHQnIzMzOTlGRicsXG5cdFx0XHQnIzMzQ0MwMCcsXG5cdFx0XHQnIzMzQ0MzMycsXG5cdFx0XHQnIzMzQ0M2NicsXG5cdFx0XHQnIzMzQ0M5OScsXG5cdFx0XHQnIzMzQ0NDQycsXG5cdFx0XHQnIzMzQ0NGRicsXG5cdFx0XHQnIzY2MDBDQycsXG5cdFx0XHQnIzY2MDBGRicsXG5cdFx0XHQnIzY2MzNDQycsXG5cdFx0XHQnIzY2MzNGRicsXG5cdFx0XHQnIzY2Q0MwMCcsXG5cdFx0XHQnIzY2Q0MzMycsXG5cdFx0XHQnIzk5MDBDQycsXG5cdFx0XHQnIzk5MDBGRicsXG5cdFx0XHQnIzk5MzNDQycsXG5cdFx0XHQnIzk5MzNGRicsXG5cdFx0XHQnIzk5Q0MwMCcsXG5cdFx0XHQnIzk5Q0MzMycsXG5cdFx0XHQnI0NDMDAwMCcsXG5cdFx0XHQnI0NDMDAzMycsXG5cdFx0XHQnI0NDMDA2NicsXG5cdFx0XHQnI0NDMDA5OScsXG5cdFx0XHQnI0NDMDBDQycsXG5cdFx0XHQnI0NDMDBGRicsXG5cdFx0XHQnI0NDMzMwMCcsXG5cdFx0XHQnI0NDMzMzMycsXG5cdFx0XHQnI0NDMzM2NicsXG5cdFx0XHQnI0NDMzM5OScsXG5cdFx0XHQnI0NDMzNDQycsXG5cdFx0XHQnI0NDMzNGRicsXG5cdFx0XHQnI0NDNjYwMCcsXG5cdFx0XHQnI0NDNjYzMycsXG5cdFx0XHQnI0NDOTkwMCcsXG5cdFx0XHQnI0NDOTkzMycsXG5cdFx0XHQnI0NDQ0MwMCcsXG5cdFx0XHQnI0NDQ0MzMycsXG5cdFx0XHQnI0ZGMDAwMCcsXG5cdFx0XHQnI0ZGMDAzMycsXG5cdFx0XHQnI0ZGMDA2NicsXG5cdFx0XHQnI0ZGMDA5OScsXG5cdFx0XHQnI0ZGMDBDQycsXG5cdFx0XHQnI0ZGMDBGRicsXG5cdFx0XHQnI0ZGMzMwMCcsXG5cdFx0XHQnI0ZGMzMzMycsXG5cdFx0XHQnI0ZGMzM2NicsXG5cdFx0XHQnI0ZGMzM5OScsXG5cdFx0XHQnI0ZGMzNDQycsXG5cdFx0XHQnI0ZGMzNGRicsXG5cdFx0XHQnI0ZGNjYwMCcsXG5cdFx0XHQnI0ZGNjYzMycsXG5cdFx0XHQnI0ZGOTkwMCcsXG5cdFx0XHQnI0ZGOTkzMycsXG5cdFx0XHQnI0ZGQ0MwMCcsXG5cdFx0XHQnI0ZGQ0MzMydcblx0XHRdO1xuXG5cdFx0LyoqXG5cdFx0ICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcblx0XHQgKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cblx0XHQgKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG5cdFx0ICpcblx0XHQgKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuXHRcdCAqL1xuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcblx0XHRmdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdFx0XHQvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG5cdFx0XHQvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuXHRcdFx0Ly8gZXhwbGljaXRseVxuXHRcdFx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmICh3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHdpbmRvdy5wcm9jZXNzLl9fbndqcykpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cblx0XHRcdGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG5cdFx0XHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRcdFx0cmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG5cdFx0XHRcdC8vIElzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcblx0XHRcdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHRcdFx0Ly8gSXMgZmlyZWZveCA+PSB2MzE/XG5cdFx0XHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuXHRcdFx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHRcdFx0Ly8gRG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuXHRcdFx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cblx0XHQgKlxuXHRcdCAqIEBhcGkgcHVibGljXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0XHRcdGFyZ3NbMF0gPSAodGhpcy51c2VDb2xvcnMgPyAnJWMnIDogJycpICtcblx0XHRcdFx0dGhpcy5uYW1lc3BhY2UgK1xuXHRcdFx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdFx0XHRhcmdzWzBdICtcblx0XHRcdFx0KHRoaXMudXNlQ29sb3JzID8gJyVjICcgOiAnICcpICtcblx0XHRcdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRcdFx0aWYgKCF0aGlzLnVzZUNvbG9ycykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuXHRcdFx0YXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0Jyk7XG5cblx0XHRcdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdFx0XHQvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG5cdFx0XHQvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRsZXQgbGFzdEMgPSAwO1xuXHRcdFx0YXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIG1hdGNoID0+IHtcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gJyVjJykge1xuXHRcdFx0XHRcdC8vIFdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuXHRcdFx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRcdFx0bGFzdEMgPSBpbmRleDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBJbnZva2VzIGBjb25zb2xlLmRlYnVnKClgIHdoZW4gYXZhaWxhYmxlLlxuXHRcdCAqIE5vLW9wIHdoZW4gYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cblx0XHQgKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuXHRcdCAqIHRvIGBjb25zb2xlLmxvZ2AuXG5cdFx0ICpcblx0XHQgKiBAYXBpIHB1YmxpY1xuXHRcdCAqL1xuXHRcdGV4cG9ydHMubG9nID0gY29uc29sZS5kZWJ1ZyB8fCBjb25zb2xlLmxvZyB8fCAoKCkgPT4ge30pO1xuXG5cdFx0LyoqXG5cdFx0ICogU2F2ZSBgbmFtZXNwYWNlc2AuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHRcdCAqIEBhcGkgcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRcdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Ly8gU3dhbGxvd1xuXHRcdFx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBMb2FkIGBuYW1lc3BhY2VzYC5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcblx0XHQgKiBAYXBpIHByaXZhdGVcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBsb2FkKCkge1xuXHRcdFx0bGV0IHI7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHQvLyBTd2FsbG93XG5cdFx0XHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG5cdFx0XHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRcdFx0ciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcjtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG5cdFx0ICpcblx0XHQgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3Ncblx0XHQgKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuXHRcdCAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG5cdFx0ICogQGFwaSBwcml2YXRlXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHQvLyBUVk1MS2l0IChBcHBsZSBUViBKUyBSdW50aW1lKSBkb2VzIG5vdCBoYXZlIGEgd2luZG93IG9iamVjdCwganVzdCBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0XG5cdFx0XHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0XHRcdHJldHVybiBsb2NhbFN0b3JhZ2U7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHQvLyBTd2FsbG93XG5cdFx0XHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZUNvbW1vbigpKGV4cG9ydHMpO1xuXG5cdFx0Y29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cblx0XHQvKipcblx0XHQgKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG5cdFx0ICovXG5cblx0XHRmb3JtYXR0ZXJzLmogPSBmdW5jdGlvbiAodikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdFx0XHR9XG5cdFx0fTtcbn0gKGJyb3dzZXIkMiwgYnJvd3NlckV4cG9ydHMkMSkpO1xuXHRyZXR1cm4gYnJvd3NlckV4cG9ydHMkMTtcbn1cblxudmFyIG5vZGVFeHBvcnRzJDEgPSB7fTtcbnZhciBub2RlJDEgPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiBub2RlRXhwb3J0cyQxOyB9LFxuICBzZXQgZXhwb3J0cyh2KXsgbm9kZUV4cG9ydHMkMSA9IHY7IH0sXG59O1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGhhc1JlcXVpcmVkTm9kZSQxO1xuXG5mdW5jdGlvbiByZXF1aXJlTm9kZSQxICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkTm9kZSQxKSByZXR1cm4gbm9kZUV4cG9ydHMkMTtcblx0aGFzUmVxdWlyZWROb2RlJDEgPSAxO1xuXHQoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuXHRcdGNvbnN0IHR0eSA9IHJlcXVpcmUkJDAkMztcblx0XHRjb25zdCB1dGlsID0gcmVxdWlyZSQkMCQ2O1xuXG5cdFx0LyoqXG5cdFx0ICogVGhpcyBpcyB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG5cdFx0ICovXG5cblx0XHRleHBvcnRzLmluaXQgPSBpbml0O1xuXHRcdGV4cG9ydHMubG9nID0gbG9nO1xuXHRcdGV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5cdFx0ZXhwb3J0cy5zYXZlID0gc2F2ZTtcblx0XHRleHBvcnRzLmxvYWQgPSBsb2FkO1xuXHRcdGV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuXHRcdGV4cG9ydHMuZGVzdHJveSA9IHV0aWwuZGVwcmVjYXRlKFxuXHRcdFx0KCkgPT4ge30sXG5cdFx0XHQnSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLidcblx0XHQpO1xuXG5cdFx0LyoqXG5cdFx0ICogQ29sb3JzLlxuXHRcdCAqL1xuXG5cdFx0ZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gT3B0aW9uYWwgZGVwZW5kZW5jeSAoYXMgaW4sIGRvZXNuJ3QgbmVlZCB0byBiZSBpbnN0YWxsZWQsIE5PVCBsaWtlIG9wdGlvbmFsRGVwZW5kZW5jaWVzIGluIHBhY2thZ2UuanNvbilcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcblx0XHRcdGNvbnN0IHN1cHBvcnRzQ29sb3IgPSByZXF1aXJlKCdzdXBwb3J0cy1jb2xvcicpO1xuXG5cdFx0XHRpZiAoc3VwcG9ydHNDb2xvciAmJiAoc3VwcG9ydHNDb2xvci5zdGRlcnIgfHwgc3VwcG9ydHNDb2xvcikubGV2ZWwgPj0gMikge1xuXHRcdFx0XHRleHBvcnRzLmNvbG9ycyA9IFtcblx0XHRcdFx0XHQyMCxcblx0XHRcdFx0XHQyMSxcblx0XHRcdFx0XHQyNixcblx0XHRcdFx0XHQyNyxcblx0XHRcdFx0XHQzMixcblx0XHRcdFx0XHQzMyxcblx0XHRcdFx0XHQzOCxcblx0XHRcdFx0XHQzOSxcblx0XHRcdFx0XHQ0MCxcblx0XHRcdFx0XHQ0MSxcblx0XHRcdFx0XHQ0Mixcblx0XHRcdFx0XHQ0Myxcblx0XHRcdFx0XHQ0NCxcblx0XHRcdFx0XHQ0NSxcblx0XHRcdFx0XHQ1Nixcblx0XHRcdFx0XHQ1Nyxcblx0XHRcdFx0XHQ2Mixcblx0XHRcdFx0XHQ2Myxcblx0XHRcdFx0XHQ2OCxcblx0XHRcdFx0XHQ2OSxcblx0XHRcdFx0XHQ3NCxcblx0XHRcdFx0XHQ3NSxcblx0XHRcdFx0XHQ3Nixcblx0XHRcdFx0XHQ3Nyxcblx0XHRcdFx0XHQ3OCxcblx0XHRcdFx0XHQ3OSxcblx0XHRcdFx0XHQ4MCxcblx0XHRcdFx0XHQ4MSxcblx0XHRcdFx0XHQ5Mixcblx0XHRcdFx0XHQ5Myxcblx0XHRcdFx0XHQ5OCxcblx0XHRcdFx0XHQ5OSxcblx0XHRcdFx0XHQxMTIsXG5cdFx0XHRcdFx0MTEzLFxuXHRcdFx0XHRcdDEyOCxcblx0XHRcdFx0XHQxMjksXG5cdFx0XHRcdFx0MTM0LFxuXHRcdFx0XHRcdDEzNSxcblx0XHRcdFx0XHQxNDgsXG5cdFx0XHRcdFx0MTQ5LFxuXHRcdFx0XHRcdDE2MCxcblx0XHRcdFx0XHQxNjEsXG5cdFx0XHRcdFx0MTYyLFxuXHRcdFx0XHRcdDE2Myxcblx0XHRcdFx0XHQxNjQsXG5cdFx0XHRcdFx0MTY1LFxuXHRcdFx0XHRcdDE2Nixcblx0XHRcdFx0XHQxNjcsXG5cdFx0XHRcdFx0MTY4LFxuXHRcdFx0XHRcdDE2OSxcblx0XHRcdFx0XHQxNzAsXG5cdFx0XHRcdFx0MTcxLFxuXHRcdFx0XHRcdDE3Mixcblx0XHRcdFx0XHQxNzMsXG5cdFx0XHRcdFx0MTc4LFxuXHRcdFx0XHRcdDE3OSxcblx0XHRcdFx0XHQxODQsXG5cdFx0XHRcdFx0MTg1LFxuXHRcdFx0XHRcdDE5Nixcblx0XHRcdFx0XHQxOTcsXG5cdFx0XHRcdFx0MTk4LFxuXHRcdFx0XHRcdDE5OSxcblx0XHRcdFx0XHQyMDAsXG5cdFx0XHRcdFx0MjAxLFxuXHRcdFx0XHRcdDIwMixcblx0XHRcdFx0XHQyMDMsXG5cdFx0XHRcdFx0MjA0LFxuXHRcdFx0XHRcdDIwNSxcblx0XHRcdFx0XHQyMDYsXG5cdFx0XHRcdFx0MjA3LFxuXHRcdFx0XHRcdDIwOCxcblx0XHRcdFx0XHQyMDksXG5cdFx0XHRcdFx0MjE0LFxuXHRcdFx0XHRcdDIxNSxcblx0XHRcdFx0XHQyMjAsXG5cdFx0XHRcdFx0MjIxXG5cdFx0XHRcdF07XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdC8vIFN3YWxsb3cgLSB3ZSBvbmx5IGNhcmUgaWYgYHN1cHBvcnRzLWNvbG9yYCBpcyBhdmFpbGFibGU7IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBCdWlsZCB1cCB0aGUgZGVmYXVsdCBgaW5zcGVjdE9wdHNgIG9iamVjdCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG5cdFx0ICpcblx0XHQgKiAgICQgREVCVUdfQ09MT1JTPW5vIERFQlVHX0RFUFRIPTEwIERFQlVHX1NIT1dfSElEREVOPWVuYWJsZWQgbm9kZSBzY3JpcHQuanNcblx0XHQgKi9cblxuXHRcdGV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGtleSA9PiB7XG5cdFx0XHRyZXR1cm4gL15kZWJ1Z18vaS50ZXN0KGtleSk7XG5cdFx0fSkucmVkdWNlKChvYmosIGtleSkgPT4ge1xuXHRcdFx0Ly8gQ2FtZWwtY2FzZVxuXHRcdFx0Y29uc3QgcHJvcCA9IGtleVxuXHRcdFx0XHQuc3Vic3RyaW5nKDYpXG5cdFx0XHRcdC50b0xvd2VyQ2FzZSgpXG5cdFx0XHRcdC5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgaykgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBrLnRvVXBwZXJDYXNlKCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHQvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlIGludG8gSlMgdmFsdWVcblx0XHRcdGxldCB2YWwgPSBwcm9jZXNzLmVudltrZXldO1xuXHRcdFx0aWYgKC9eKHllc3xvbnx0cnVlfGVuYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdFx0XHR2YWwgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmICgvXihub3xvZmZ8ZmFsc2V8ZGlzYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdFx0XHR2YWwgPSBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAodmFsID09PSAnbnVsbCcpIHtcblx0XHRcdFx0dmFsID0gbnVsbDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IE51bWJlcih2YWwpO1xuXHRcdFx0fVxuXG5cdFx0XHRvYmpbcHJvcF0gPSB2YWw7XG5cdFx0XHRyZXR1cm4gb2JqO1xuXHRcdH0sIHt9KTtcblxuXHRcdC8qKlxuXHRcdCAqIElzIHN0ZG91dCBhIFRUWT8gQ29sb3JlZCBvdXRwdXQgaXMgZW5hYmxlZCB3aGVuIGB0cnVlYC5cblx0XHQgKi9cblxuXHRcdGZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0XHRcdHJldHVybiAnY29sb3JzJyBpbiBleHBvcnRzLmluc3BlY3RPcHRzID9cblx0XHRcdFx0Qm9vbGVhbihleHBvcnRzLmluc3BlY3RPcHRzLmNvbG9ycykgOlxuXHRcdFx0XHR0dHkuaXNhdHR5KHByb2Nlc3Muc3RkZXJyLmZkKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG5cdFx0ICpcblx0XHQgKiBAYXBpIHB1YmxpY1xuXHRcdCAqL1xuXG5cdFx0ZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdFx0XHRjb25zdCB7bmFtZXNwYWNlOiBuYW1lLCB1c2VDb2xvcnN9ID0gdGhpcztcblxuXHRcdFx0aWYgKHVzZUNvbG9ycykge1xuXHRcdFx0XHRjb25zdCBjID0gdGhpcy5jb2xvcjtcblx0XHRcdFx0Y29uc3QgY29sb3JDb2RlID0gJ1xcdTAwMUJbMycgKyAoYyA8IDggPyBjIDogJzg7NTsnICsgYyk7XG5cdFx0XHRcdGNvbnN0IHByZWZpeCA9IGAgICR7Y29sb3JDb2RlfTsxbSR7bmFtZX0gXFx1MDAxQlswbWA7XG5cblx0XHRcdFx0YXJnc1swXSA9IHByZWZpeCArIGFyZ3NbMF0uc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbicgKyBwcmVmaXgpO1xuXHRcdFx0XHRhcmdzLnB1c2goY29sb3JDb2RlICsgJ20rJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZikgKyAnXFx1MDAxQlswbScpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXJnc1swXSA9IGdldERhdGUoKSArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldERhdGUoKSB7XG5cdFx0XHRpZiAoZXhwb3J0cy5pbnNwZWN0T3B0cy5oaWRlRGF0ZSkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpICsgJyAnO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEludm9rZXMgYHV0aWwuZm9ybWF0KClgIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHdyaXRlcyB0byBzdGRlcnIuXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBsb2coLi4uYXJncykge1xuXHRcdFx0cmV0dXJuIHByb2Nlc3Muc3RkZXJyLndyaXRlKHV0aWwuZm9ybWF0KC4uLmFyZ3MpICsgJ1xcbicpO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0XHQgKiBAYXBpIHByaXZhdGVcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0XHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRcdHByb2Nlc3MuZW52LkRFQlVHID0gbmFtZXNwYWNlcztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuXHRcdFx0XHQvLyBzdHJpbmcgJ251bGwnIG9yICd1bmRlZmluZWQnLiBKdXN0IGRlbGV0ZSBpbnN0ZWFkLlxuXHRcdFx0XHRkZWxldGUgcHJvY2Vzcy5lbnYuREVCVUc7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogTG9hZCBgbmFtZXNwYWNlc2AuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG5cdFx0ICogQGFwaSBwcml2YXRlXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBsb2FkKCkge1xuXHRcdFx0cmV0dXJuIHByb2Nlc3MuZW52LkRFQlVHO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEluaXQgbG9naWMgZm9yIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuXHRcdCAqXG5cdFx0ICogQ3JlYXRlIGEgbmV3IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGluIGNhc2UgYHVzZUNvbG9yc2AgaXMgc2V0XG5cdFx0ICogZGlmZmVyZW50bHkgZm9yIGEgcGFydGljdWxhciBgZGVidWdgIGluc3RhbmNlLlxuXHRcdCAqL1xuXG5cdFx0ZnVuY3Rpb24gaW5pdChkZWJ1Zykge1xuXHRcdFx0ZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuXHRcdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHMuaW5zcGVjdE9wdHMpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGRlYnVnLmluc3BlY3RPcHRzW2tleXNbaV1dID0gZXhwb3J0cy5pbnNwZWN0T3B0c1trZXlzW2ldXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmVDb21tb24oKShleHBvcnRzKTtcblxuXHRcdGNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG5cdFx0LyoqXG5cdFx0ICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbCBvbiBhIHNpbmdsZSBsaW5lLlxuXHRcdCAqL1xuXG5cdFx0Zm9ybWF0dGVycy5vID0gZnVuY3Rpb24gKHYpIHtcblx0XHRcdHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cdFx0XHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpXG5cdFx0XHRcdC5zcGxpdCgnXFxuJylcblx0XHRcdFx0Lm1hcChzdHIgPT4gc3RyLnRyaW0oKSlcblx0XHRcdFx0LmpvaW4oJyAnKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogTWFwICVPIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbG93aW5nIG11bHRpcGxlIGxpbmVzIGlmIG5lZWRlZC5cblx0XHQgKi9cblxuXHRcdGZvcm1hdHRlcnMuTyA9IGZ1bmN0aW9uICh2KSB7XG5cdFx0XHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRcdFx0cmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKTtcblx0XHR9O1xufSAobm9kZSQxLCBub2RlRXhwb3J0cyQxKSk7XG5cdHJldHVybiBub2RlRXhwb3J0cyQxO1xufVxuXG4vKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciAvIG53anMgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbihmdW5jdGlvbiAobW9kdWxlKSB7XG5cdGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHByb2Nlc3MuYnJvd3NlciA9PT0gdHJ1ZSB8fCBwcm9jZXNzLl9fbndqcykge1xuXHRcdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZUJyb3dzZXIkMSgpO1xuXHR9IGVsc2Uge1xuXHRcdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZU5vZGUkMSgpO1xuXHR9XG59IChzcmMkMikpO1xuXG52YXIgX2RlYnVnID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHNyY0V4cG9ydHMkMSk7XG5cbmNvbnN0IGNyZWF0ZUZpbHRlciA9IGNyZWF0ZUZpbHRlciQxO1xuZnVuY3Rpb24gc2xhc2gkMShwKSB7XG4gICAgcmV0dXJuIHAucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xufVxuLyoqXG4gKiBQcmVwZW5kIGAvQGlkL2AgYW5kIHJlcGxhY2UgbnVsbCBieXRlIHNvIHRoZSBpZCBpcyBVUkwtc2FmZS5cbiAqIFRoaXMgaXMgcHJlcGVuZGVkIHRvIHJlc29sdmVkIGlkcyB0aGF0IGFyZSBub3QgdmFsaWQgYnJvd3NlclxuICogaW1wb3J0IHNwZWNpZmllcnMgYnkgdGhlIGltcG9ydEFuYWx5c2lzIHBsdWdpbi5cbiAqL1xuZnVuY3Rpb24gd3JhcElkKGlkKSB7XG4gICAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoVkFMSURfSURfUFJFRklYKVxuICAgICAgICA/IGlkXG4gICAgICAgIDogVkFMSURfSURfUFJFRklYICsgaWQucmVwbGFjZSgnXFwwJywgTlVMTF9CWVRFX1BMQUNFSE9MREVSKTtcbn1cbi8qKlxuICogVW5kbyB7QGxpbmsgd3JhcElkfSdzIGAvQGlkL2AgYW5kIG51bGwgYnl0ZSByZXBsYWNlbWVudHMuXG4gKi9cbmZ1bmN0aW9uIHVud3JhcElkKGlkKSB7XG4gICAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoVkFMSURfSURfUFJFRklYKVxuICAgICAgICA/IGlkLnNsaWNlKFZBTElEX0lEX1BSRUZJWC5sZW5ndGgpLnJlcGxhY2UoTlVMTF9CWVRFX1BMQUNFSE9MREVSLCAnXFwwJylcbiAgICAgICAgOiBpZDtcbn1cbmNvbnN0IGZsYXR0ZW5JZCA9IChpZCkgPT4gaWRcbiAgICAucmVwbGFjZSgvWy86XS9nLCAnXycpXG4gICAgLnJlcGxhY2UoL1xcLi9nLCAnX18nKVxuICAgIC5yZXBsYWNlKC8oXFxzKj5cXHMqKS9nLCAnX19fJylcbiAgICAucmVwbGFjZSgvIy9nLCAnX19fXycpO1xuY29uc3Qgbm9ybWFsaXplSWQgPSAoaWQpID0+IGlkLnJlcGxhY2UoLyhcXHMqPlxccyopL2csICcgPiAnKTtcbi8vVE9ETzogcmV2aXNpdCBsYXRlciB0byBzZWUgaWYgdGhlIGVkZ2UgY2FzZSB0aGF0IFwiY29tcGlsaW5nIHVzaW5nIG5vZGUgdjEyIGNvZGUgdG8gYmUgcnVuIGluIG5vZGUgdjE2IGluIHRoZSBzZXJ2ZXJcIiBpcyB3aGF0IHdlIGludGVuZCB0byBzdXBwb3J0LlxuY29uc3QgYnVpbHRpbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5idWlsdGluTW9kdWxlcyxcbiAgICAnYXNzZXJ0L3N0cmljdCcsXG4gICAgJ2RpYWdub3N0aWNzX2NoYW5uZWwnLFxuICAgICdkbnMvcHJvbWlzZXMnLFxuICAgICdmcy9wcm9taXNlcycsXG4gICAgJ3BhdGgvcG9zaXgnLFxuICAgICdwYXRoL3dpbjMyJyxcbiAgICAncmVhZGxpbmUvcHJvbWlzZXMnLFxuICAgICdzdHJlYW0vY29uc3VtZXJzJyxcbiAgICAnc3RyZWFtL3Byb21pc2VzJyxcbiAgICAnc3RyZWFtL3dlYicsXG4gICAgJ3RpbWVycy9wcm9taXNlcycsXG4gICAgJ3V0aWwvdHlwZXMnLFxuICAgICd3YXNpJyxcbl0pO1xuZnVuY3Rpb24gaXNCdWlsdGluKGlkKSB7XG4gICAgcmV0dXJuIGJ1aWx0aW5zLmhhcyhpZC5yZXBsYWNlKC9ebm9kZTovLCAnJykpO1xufVxuZnVuY3Rpb24gbW9kdWxlTGlzdENvbnRhaW5zKG1vZHVsZUxpc3QsIGlkKSB7XG4gICAgcmV0dXJuIG1vZHVsZUxpc3Q/LnNvbWUoKG0pID0+IG0gPT09IGlkIHx8IGlkLnN0YXJ0c1dpdGgobSArICcvJykpO1xufVxuZnVuY3Rpb24gaXNPcHRpbWl6YWJsZShpZCwgb3B0aW1pemVEZXBzKSB7XG4gICAgY29uc3QgeyBleHRlbnNpb25zIH0gPSBvcHRpbWl6ZURlcHM7XG4gICAgcmV0dXJuIChPUFRJTUlaQUJMRV9FTlRSWV9SRS50ZXN0KGlkKSB8fFxuICAgICAgICAoZXh0ZW5zaW9ucz8uc29tZSgoZXh0KSA9PiBpZC5lbmRzV2l0aChleHQpKSA/PyBmYWxzZSkpO1xufVxuY29uc3QgYmFyZUltcG9ydFJFID0gL15bXFx3QF0oPyEuKjpcXC9cXC8pLztcbmxldCBpc1J1bm5pbmdXaXRoWWFyblBucDtcbi8vIFRPRE86IHVzZSBpbXBvcnQoKVxuY29uc3QgX3JlcXVpcmUkMyA9IGNyZWF0ZVJlcXVpcmUkMShpbXBvcnQubWV0YS51cmwpO1xudHJ5IHtcbiAgICBpc1J1bm5pbmdXaXRoWWFyblBucCA9IEJvb2xlYW4oX3JlcXVpcmUkMygncG5wYXBpJykpO1xufVxuY2F0Y2ggeyB9XG5jb25zdCBzc3JFeHRlbnNpb25zID0gWycuanMnLCAnLmNqcycsICcuanNvbicsICcubm9kZSddO1xuZnVuY3Rpb24gcmVzb2x2ZUZyb20oaWQsIGJhc2VkaXIsIHByZXNlcnZlU3ltbGlua3MgPSBmYWxzZSwgc3NyID0gZmFsc2UpIHtcbiAgICByZXR1cm4gcmVzb2x2ZSQ0LnN5bmMoaWQsIHtcbiAgICAgICAgYmFzZWRpcixcbiAgICAgICAgcGF0aHM6IFtdLFxuICAgICAgICBleHRlbnNpb25zOiBzc3IgPyBzc3JFeHRlbnNpb25zIDogREVGQVVMVF9FWFRFTlNJT05TJDEsXG4gICAgICAgIC8vIG5lY2Vzc2FyeSB0byB3b3JrIHdpdGggcG5wbVxuICAgICAgICBwcmVzZXJ2ZVN5bWxpbmtzOiBwcmVzZXJ2ZVN5bWxpbmtzIHx8IGlzUnVubmluZ1dpdGhZYXJuUG5wIHx8IGZhbHNlLFxuICAgIH0pO1xufVxuLyoqXG4gKiBsaWtlIGByZXNvbHZlRnJvbWAgYnV0IHN1cHBvcnRzIHJlc29sdmluZyBgPmAgcGF0aCBpbiBgaWRgLFxuICogZm9yIGV4YW1wbGU6IGBmb28gPiBiYXIgPiBiYXpgXG4gKi9cbmZ1bmN0aW9uIG5lc3RlZFJlc29sdmVGcm9tKGlkLCBiYXNlZGlyLCBwcmVzZXJ2ZVN5bWxpbmtzID0gZmFsc2UsIHNzciA9IGZhbHNlKSB7XG4gICAgY29uc3QgcGtncyA9IGlkLnNwbGl0KCc+JykubWFwKChwa2cpID0+IHBrZy50cmltKCkpO1xuICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgcGtnIG9mIHBrZ3MpIHtcbiAgICAgICAgICAgIGJhc2VkaXIgPSByZXNvbHZlRnJvbShwa2csIGJhc2VkaXIsIHByZXNlcnZlU3ltbGlua3MsIHNzcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggeyB9XG4gICAgcmV0dXJuIGJhc2VkaXI7XG59XG4vLyBzZXQgaW4gYmluL3ZpdGUuanNcbmNvbnN0IGZpbHRlciA9IHByb2Nlc3MuZW52LlZJVEVfREVCVUdfRklMVEVSO1xuY29uc3QgREVCVUcgPSBwcm9jZXNzLmVudi5ERUJVRztcbmZ1bmN0aW9uIGNyZWF0ZURlYnVnZ2VyKG5hbWVzcGFjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgbG9nID0gX2RlYnVnKG5hbWVzcGFjZSk7XG4gICAgY29uc3QgeyBvbmx5V2hlbkZvY3VzZWQgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgZm9jdXMgPSB0eXBlb2Ygb25seVdoZW5Gb2N1c2VkID09PSAnc3RyaW5nJyA/IG9ubHlXaGVuRm9jdXNlZCA6IG5hbWVzcGFjZTtcbiAgICByZXR1cm4gKG1zZywgLi4uYXJncykgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyICYmICFtc2cuaW5jbHVkZXMoZmlsdGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvbmx5V2hlbkZvY3VzZWQgJiYgIURFQlVHPy5pbmNsdWRlcyhmb2N1cykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2cobXNnLCAuLi5hcmdzKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdGVzdENhc2VJbnNlbnNpdGl2ZUZTKCkge1xuICAgIGlmICghQ0xJRU5UX0VOVFJZLmVuZHNXaXRoKCdjbGllbnQubWpzJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgdGVzdCBjYXNlIGluc2Vuc2l0aXZlIEZTLCBDTElFTlRfRU5UUlkgY29uc3QgZG9lc24ndCBjb250YWluIGNsaWVudC5tanNgKTtcbiAgICB9XG4gICAgaWYgKCFmcyRsLmV4aXN0c1N5bmMoQ0xJRU5UX0VOVFJZKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCB0ZXN0IGNhc2UgaW5zZW5zaXRpdmUgRlMsIENMSUVOVF9FTlRSWSBkb2VzIG5vdCBwb2ludCB0byBhbiBleGlzdGluZyBmaWxlOiAnICtcbiAgICAgICAgICAgIENMSUVOVF9FTlRSWSk7XG4gICAgfVxuICAgIHJldHVybiBmcyRsLmV4aXN0c1N5bmMoQ0xJRU5UX0VOVFJZLnJlcGxhY2UoJ2NsaWVudC5tanMnLCAnY0xpRW5ULm1qcycpKTtcbn1cbmNvbnN0IGlzQ2FzZUluc2Vuc2l0aXZlRlMgPSB0ZXN0Q2FzZUluc2Vuc2l0aXZlRlMoKTtcbmNvbnN0IGlzV2luZG93cyQ0ID0gb3MkMy5wbGF0Zm9ybSgpID09PSAnd2luMzInO1xuY29uc3QgVk9MVU1FX1JFID0gL15bQS1aXTovaTtcbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgkMyhpZCkge1xuICAgIHJldHVybiBwYXRoJG8ucG9zaXgubm9ybWFsaXplKGlzV2luZG93cyQ0ID8gc2xhc2gkMShpZCkgOiBpZCk7XG59XG5mdW5jdGlvbiBmc1BhdGhGcm9tSWQoaWQpIHtcbiAgICBjb25zdCBmc1BhdGggPSBub3JtYWxpemVQYXRoJDMoaWQuc3RhcnRzV2l0aChGU19QUkVGSVgpID8gaWQuc2xpY2UoRlNfUFJFRklYLmxlbmd0aCkgOiBpZCk7XG4gICAgcmV0dXJuIGZzUGF0aC5zdGFydHNXaXRoKCcvJykgfHwgZnNQYXRoLm1hdGNoKFZPTFVNRV9SRSlcbiAgICAgICAgPyBmc1BhdGhcbiAgICAgICAgOiBgLyR7ZnNQYXRofWA7XG59XG5mdW5jdGlvbiBmc1BhdGhGcm9tVXJsKHVybCkge1xuICAgIHJldHVybiBmc1BhdGhGcm9tSWQoY2xlYW5VcmwodXJsKSk7XG59XG4vKipcbiAqIENoZWNrIGlmIGRpciBpcyBhIHBhcmVudCBvZiBmaWxlXG4gKlxuICogV2FybmluZzogcGFyYW1ldGVycyBhcmUgbm90IHZhbGlkYXRlZCwgb25seSB3b3JrcyB3aXRoIG5vcm1hbGl6ZWQgYWJzb2x1dGUgcGF0aHNcbiAqXG4gKiBAcGFyYW0gZGlyIC0gbm9ybWFsaXplZCBhYnNvbHV0ZSBwYXRoXG4gKiBAcGFyYW0gZmlsZSAtIG5vcm1hbGl6ZWQgYWJzb2x1dGUgcGF0aFxuICogQHJldHVybnMgdHJ1ZSBpZiBkaXIgaXMgYSBwYXJlbnQgb2YgZmlsZVxuICovXG5mdW5jdGlvbiBpc1BhcmVudERpcmVjdG9yeShkaXIsIGZpbGUpIHtcbiAgICBpZiAoIWRpci5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgIGRpciA9IGAke2Rpcn0vYDtcbiAgICB9XG4gICAgcmV0dXJuIChmaWxlLnN0YXJ0c1dpdGgoZGlyKSB8fFxuICAgICAgICAoaXNDYXNlSW5zZW5zaXRpdmVGUyAmJiBmaWxlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChkaXIudG9Mb3dlckNhc2UoKSkpKTtcbn1cbmZ1bmN0aW9uIGVuc3VyZVZvbHVtZUluUGF0aChmaWxlKSB7XG4gICAgcmV0dXJuIGlzV2luZG93cyQ0ID8gcGF0aCRvLnJlc29sdmUoZmlsZSkgOiBmaWxlO1xufVxuY29uc3QgcXVlcnlSRSA9IC9cXD8uKiQvcztcbmNvbnN0IGhhc2hSRSA9IC8jLiokL3M7XG5jb25zdCBjbGVhblVybCA9ICh1cmwpID0+IHVybC5yZXBsYWNlKGhhc2hSRSwgJycpLnJlcGxhY2UocXVlcnlSRSwgJycpO1xuY29uc3QgZXh0ZXJuYWxSRSA9IC9eKGh0dHBzPzopP1xcL1xcLy87XG5jb25zdCBpc0V4dGVybmFsVXJsID0gKHVybCkgPT4gZXh0ZXJuYWxSRS50ZXN0KHVybCk7XG5jb25zdCBkYXRhVXJsUkUgPSAvXlxccypkYXRhOi9pO1xuY29uc3QgaXNEYXRhVXJsID0gKHVybCkgPT4gZGF0YVVybFJFLnRlc3QodXJsKTtcbmNvbnN0IHZpcnR1YWxNb2R1bGVSRSA9IC9edmlydHVhbC1tb2R1bGU6LiovO1xuY29uc3QgdmlydHVhbE1vZHVsZVByZWZpeCA9ICd2aXJ0dWFsLW1vZHVsZTonO1xuY29uc3Qga25vd25Kc1NyY1JFID0gL1xcLig/OltqdF1zeD98bVtqdF1zfHZ1ZXxtYXJrb3xzdmVsdGV8YXN0cm98aW1iYSkoPzokfFxcPykvO1xuY29uc3QgaXNKU1JlcXVlc3QgPSAodXJsKSA9PiB7XG4gICAgdXJsID0gY2xlYW5VcmwodXJsKTtcbiAgICBpZiAoa25vd25Kc1NyY1JFLnRlc3QodXJsKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFwYXRoJG8uZXh0bmFtZSh1cmwpICYmICF1cmwuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmNvbnN0IGtub3duVHNSRSA9IC9cXC4oPzp0c3xtdHN8Y3RzfHRzeCkkLztcbmNvbnN0IGtub3duVHNPdXRwdXRSRSA9IC9cXC4oPzpqc3xtanN8Y2pzfGpzeCkkLztcbmNvbnN0IGlzVHNSZXF1ZXN0ID0gKHVybCkgPT4ga25vd25Uc1JFLnRlc3QodXJsKTtcbmNvbnN0IGlzUG9zc2libGVUc091dHB1dCA9ICh1cmwpID0+IGtub3duVHNPdXRwdXRSRS50ZXN0KGNsZWFuVXJsKHVybCkpO1xuZnVuY3Rpb24gZ2V0UG90ZW50aWFsVHNTcmNQYXRocyhmaWxlUGF0aCkge1xuICAgIGNvbnN0IFtuYW1lLCB0eXBlLCBxdWVyeSA9ICcnXSA9IGZpbGVQYXRoLnNwbGl0KC8oXFwuKD86W2NtXT9qc3xqc3gpKShcXD8uKik/JC8pO1xuICAgIGNvbnN0IHBhdGhzID0gW25hbWUgKyB0eXBlLnJlcGxhY2UoJ2pzJywgJ3RzJykgKyBxdWVyeV07XG4gICAgaWYgKCF0eXBlLmVuZHNXaXRoKCd4JykpIHtcbiAgICAgICAgcGF0aHMucHVzaChuYW1lICsgdHlwZS5yZXBsYWNlKCdqcycsICd0c3gnKSArIHF1ZXJ5KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhzO1xufVxuY29uc3QgaW1wb3J0UXVlcnlSRSA9IC8oXFw/fCYpaW1wb3J0PT8oPzomfCQpLztcbmNvbnN0IGRpcmVjdFJlcXVlc3RSRSQxID0gLyhcXD98JilkaXJlY3Q9Pyg/OiZ8JCkvO1xuY29uc3QgaW50ZXJuYWxQcmVmaXhlcyA9IFtcbiAgICBGU19QUkVGSVgsXG4gICAgVkFMSURfSURfUFJFRklYLFxuICAgIENMSUVOVF9QVUJMSUNfUEFUSCxcbiAgICBFTlZfUFVCTElDX1BBVEgsXG5dO1xuY29uc3QgSW50ZXJuYWxQcmVmaXhSRSA9IG5ldyBSZWdFeHAoYF4oPzoke2ludGVybmFsUHJlZml4ZXMuam9pbignfCcpfSlgKTtcbmNvbnN0IHRyYWlsaW5nU2VwYXJhdG9yUkUgPSAvWz8mXSQvO1xuY29uc3QgaXNJbXBvcnRSZXF1ZXN0ID0gKHVybCkgPT4gaW1wb3J0UXVlcnlSRS50ZXN0KHVybCk7XG5jb25zdCBpc0ludGVybmFsUmVxdWVzdCA9ICh1cmwpID0+IEludGVybmFsUHJlZml4UkUudGVzdCh1cmwpO1xuZnVuY3Rpb24gcmVtb3ZlSW1wb3J0UXVlcnkodXJsKSB7XG4gICAgcmV0dXJuIHVybC5yZXBsYWNlKGltcG9ydFF1ZXJ5UkUsICckMScpLnJlcGxhY2UodHJhaWxpbmdTZXBhcmF0b3JSRSwgJycpO1xufVxuZnVuY3Rpb24gcmVtb3ZlRGlyZWN0UXVlcnkodXJsKSB7XG4gICAgcmV0dXJuIHVybC5yZXBsYWNlKGRpcmVjdFJlcXVlc3RSRSQxLCAnJDEnKS5yZXBsYWNlKHRyYWlsaW5nU2VwYXJhdG9yUkUsICcnKTtcbn1cbmZ1bmN0aW9uIGluamVjdFF1ZXJ5KHVybCwgcXVlcnlUb0luamVjdCkge1xuICAgIC8vIGVuY29kZSBwZXJjZW50cyBmb3IgY29uc2lzdGVudCBiZWhhdmlvciB3aXRoIHBhdGhUb0ZpbGVVUkxcbiAgICAvLyBzZWUgIzI2MTQgZm9yIGRldGFpbHNcbiAgICBjb25zdCByZXNvbHZlZFVybCA9IG5ldyBVUkwkMyh1cmwucmVwbGFjZSgvJS9nLCAnJTI1JyksICdyZWxhdGl2ZTovLy8nKTtcbiAgICBjb25zdCB7IHNlYXJjaCwgaGFzaCB9ID0gcmVzb2x2ZWRVcmw7XG4gICAgbGV0IHBhdGhuYW1lID0gY2xlYW5VcmwodXJsKTtcbiAgICBwYXRobmFtZSA9IGlzV2luZG93cyQ0ID8gc2xhc2gkMShwYXRobmFtZSkgOiBwYXRobmFtZTtcbiAgICByZXR1cm4gYCR7cGF0aG5hbWV9PyR7cXVlcnlUb0luamVjdH0ke3NlYXJjaCA/IGAmYCArIHNlYXJjaC5zbGljZSgxKSA6ICcnfSR7aGFzaCA/PyAnJ31gO1xufVxuY29uc3QgdGltZXN0YW1wUkUgPSAvXFxidD1cXGR7MTN9Jj9cXGIvO1xuZnVuY3Rpb24gcmVtb3ZlVGltZXN0YW1wUXVlcnkodXJsKSB7XG4gICAgcmV0dXJuIHVybC5yZXBsYWNlKHRpbWVzdGFtcFJFLCAnJykucmVwbGFjZSh0cmFpbGluZ1NlcGFyYXRvclJFLCAnJyk7XG59XG5hc3luYyBmdW5jdGlvbiBhc3luY1JlcGxhY2UoaW5wdXQsIHJlLCByZXBsYWNlcikge1xuICAgIGxldCBtYXRjaDtcbiAgICBsZXQgcmVtYWluaW5nID0gaW5wdXQ7XG4gICAgbGV0IHJld3JpdHRlbiA9ICcnO1xuICAgIHdoaWxlICgobWF0Y2ggPSByZS5leGVjKHJlbWFpbmluZykpKSB7XG4gICAgICAgIHJld3JpdHRlbiArPSByZW1haW5pbmcuc2xpY2UoMCwgbWF0Y2guaW5kZXgpO1xuICAgICAgICByZXdyaXR0ZW4gKz0gYXdhaXQgcmVwbGFjZXIobWF0Y2gpO1xuICAgICAgICByZW1haW5pbmcgPSByZW1haW5pbmcuc2xpY2UobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpO1xuICAgIH1cbiAgICByZXdyaXR0ZW4gKz0gcmVtYWluaW5nO1xuICAgIHJldHVybiByZXdyaXR0ZW47XG59XG5mdW5jdGlvbiB0aW1lRnJvbShzdGFydCwgc3VidHJhY3QgPSAwKSB7XG4gICAgY29uc3QgdGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQgLSBzdWJ0cmFjdDtcbiAgICBjb25zdCB0aW1lU3RyaW5nID0gKHRpbWUudG9GaXhlZCgyKSArIGBtc2ApLnBhZEVuZCg1LCAnICcpO1xuICAgIGlmICh0aW1lIDwgMTApIHtcbiAgICAgICAgcmV0dXJuIHBpY29jb2xvcnNFeHBvcnRzLmdyZWVuKHRpbWVTdHJpbmcpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aW1lIDwgNTApIHtcbiAgICAgICAgcmV0dXJuIHBpY29jb2xvcnNFeHBvcnRzLnllbGxvdyh0aW1lU3RyaW5nKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBwaWNvY29sb3JzRXhwb3J0cy5yZWQodGltZVN0cmluZyk7XG4gICAgfVxufVxuLyoqXG4gKiBwcmV0dHkgdXJsIGZvciBsb2dnaW5nLlxuICovXG5mdW5jdGlvbiBwcmV0dGlmeVVybCh1cmwsIHJvb3QpIHtcbiAgICB1cmwgPSByZW1vdmVUaW1lc3RhbXBRdWVyeSh1cmwpO1xuICAgIGNvbnN0IGlzQWJzb2x1dGVGaWxlID0gdXJsLnN0YXJ0c1dpdGgocm9vdCk7XG4gICAgaWYgKGlzQWJzb2x1dGVGaWxlIHx8IHVybC5zdGFydHNXaXRoKEZTX1BSRUZJWCkpIHtcbiAgICAgICAgbGV0IGZpbGUgPSBwYXRoJG8ucmVsYXRpdmUocm9vdCwgaXNBYnNvbHV0ZUZpbGUgPyB1cmwgOiBmc1BhdGhGcm9tSWQodXJsKSk7XG4gICAgICAgIGNvbnN0IHNlZyA9IGZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgY29uc3QgbnBtSW5kZXggPSBzZWcuaW5kZXhPZihgbm9kZV9tb2R1bGVzYCk7XG4gICAgICAgIGNvbnN0IGlzU291cmNlTWFwID0gZmlsZS5lbmRzV2l0aCgnLm1hcCcpO1xuICAgICAgICBpZiAobnBtSW5kZXggPiAwKSB7XG4gICAgICAgICAgICBmaWxlID0gc2VnW25wbUluZGV4ICsgMV07XG4gICAgICAgICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgICAgICAgICBmaWxlID0gYCR7ZmlsZX0vJHtzZWdbbnBtSW5kZXggKyAyXX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsZSA9IGBucG06ICR7cGljb2NvbG9yc0V4cG9ydHMuZGltKGZpbGUpfSR7aXNTb3VyY2VNYXAgPyBgIChzb3VyY2UgbWFwKWAgOiBgYH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwaWNvY29sb3JzRXhwb3J0cy5kaW0oZmlsZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcGljb2NvbG9yc0V4cG9ydHMuZGltKHVybCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNPYmplY3QkMih2YWx1ZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cbmZ1bmN0aW9uIGlzRGVmaW5lZCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPSBudWxsO1xufVxuZnVuY3Rpb24gbG9va3VwRmlsZShkaXIsIGZvcm1hdHMsIG9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGZvcm1hdCBvZiBmb3JtYXRzKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aCRvLmpvaW4oZGlyLCBmb3JtYXQpO1xuICAgICAgICBpZiAoZnMkbC5leGlzdHNTeW5jKGZ1bGxQYXRoKSAmJiBmcyRsLnN0YXRTeW5jKGZ1bGxQYXRoKS5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9ucz8ucGF0aE9ubHlcbiAgICAgICAgICAgICAgICA/IGZ1bGxQYXRoXG4gICAgICAgICAgICAgICAgOiBmcyRsLnJlYWRGaWxlU3luYyhmdWxsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnM/LnByZWRpY2F0ZSB8fCBvcHRpb25zLnByZWRpY2F0ZShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoJG8uZGlybmFtZShkaXIpO1xuICAgIGlmIChwYXJlbnREaXIgIT09IGRpciAmJlxuICAgICAgICAoIW9wdGlvbnM/LnJvb3REaXIgfHwgcGFyZW50RGlyLnN0YXJ0c1dpdGgob3B0aW9ucz8ucm9vdERpcikpKSB7XG4gICAgICAgIHJldHVybiBsb29rdXBGaWxlKHBhcmVudERpciwgZm9ybWF0cywgb3B0aW9ucyk7XG4gICAgfVxufVxuY29uc3Qgc3BsaXRSRSA9IC9cXHI/XFxuLztcbmNvbnN0IHJhbmdlID0gMjtcbmZ1bmN0aW9uIHBhZCQxKHNvdXJjZSwgbiA9IDIpIHtcbiAgICBjb25zdCBsaW5lcyA9IHNvdXJjZS5zcGxpdChzcGxpdFJFKTtcbiAgICByZXR1cm4gbGluZXMubWFwKChsKSA9PiBgIGAucmVwZWF0KG4pICsgbCkuam9pbihgXFxuYCk7XG59XG5mdW5jdGlvbiBwb3NUb051bWJlcihzb3VyY2UsIHBvcykge1xuICAgIGlmICh0eXBlb2YgcG9zID09PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICBjb25zdCBsaW5lcyA9IHNvdXJjZS5zcGxpdChzcGxpdFJFKTtcbiAgICBjb25zdCB7IGxpbmUsIGNvbHVtbiB9ID0gcG9zO1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lIC0gMSAmJiBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3RhcnQgKz0gbGluZXNbaV0ubGVuZ3RoICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0ICsgY29sdW1uO1xufVxuZnVuY3Rpb24gbnVtYmVyVG9Qb3Moc291cmNlLCBvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgaWYgKG9mZnNldCA+IHNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvZmZzZXQgaXMgbG9uZ2VyIHRoYW4gc291cmNlIGxlbmd0aCEgb2Zmc2V0ICR7b2Zmc2V0fSA+IGxlbmd0aCAke3NvdXJjZS5sZW5ndGh9YCk7XG4gICAgfVxuICAgIGNvbnN0IGxpbmVzID0gc291cmNlLnNwbGl0KHNwbGl0UkUpO1xuICAgIGxldCBjb3VudGVkID0gMDtcbiAgICBsZXQgbGluZSA9IDA7XG4gICAgbGV0IGNvbHVtbiA9IDA7XG4gICAgZm9yICg7IGxpbmUgPCBsaW5lcy5sZW5ndGg7IGxpbmUrKykge1xuICAgICAgICBjb25zdCBsaW5lTGVuZ3RoID0gbGluZXNbbGluZV0ubGVuZ3RoICsgMTtcbiAgICAgICAgaWYgKGNvdW50ZWQgKyBsaW5lTGVuZ3RoID49IG9mZnNldCkge1xuICAgICAgICAgICAgY29sdW1uID0gb2Zmc2V0IC0gY291bnRlZCArIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb3VudGVkICs9IGxpbmVMZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB7IGxpbmU6IGxpbmUgKyAxLCBjb2x1bW4gfTtcbn1cbmZ1bmN0aW9uIGdlbmVyYXRlQ29kZUZyYW1lKHNvdXJjZSwgc3RhcnQgPSAwLCBlbmQpIHtcbiAgICBzdGFydCA9IHBvc1RvTnVtYmVyKHNvdXJjZSwgc3RhcnQpO1xuICAgIGVuZCA9IGVuZCB8fCBzdGFydDtcbiAgICBjb25zdCBsaW5lcyA9IHNvdXJjZS5zcGxpdChzcGxpdFJFKTtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGNvbnN0IHJlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY291bnQgKz0gbGluZXNbaV0ubGVuZ3RoICsgMTtcbiAgICAgICAgaWYgKGNvdW50ID49IHN0YXJ0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaSAtIHJhbmdlOyBqIDw9IGkgKyByYW5nZSB8fCBlbmQgPiBjb3VudDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGogPCAwIHx8IGogPj0gbGluZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gaiArIDE7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goYCR7bGluZX0keycgJy5yZXBlYXQoTWF0aC5tYXgoMyAtIFN0cmluZyhsaW5lKS5sZW5ndGgsIDApKX18ICAke2xpbmVzW2pdfWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSBsaW5lc1tqXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGogPT09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHVzaCB1bmRlcmxpbmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFkID0gTWF0aC5tYXgoc3RhcnQgLSAoY291bnQgLSBsaW5lTGVuZ3RoKSArIDEsIDApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCgxLCBlbmQgPiBjb3VudCA/IGxpbmVMZW5ndGggLSBwYWQgOiBlbmQgLSBzdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGAgICB8ICBgICsgJyAnLnJlcGVhdChwYWQpICsgJ14nLnJlcGVhdChsZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaiA+IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCA+IGNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heChNYXRoLm1pbihlbmQgLSBjb3VudCwgbGluZUxlbmd0aCksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goYCAgIHwgIGAgKyAnXicucmVwZWF0KGxlbmd0aCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGxpbmVMZW5ndGggKyAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXMuam9pbignXFxuJyk7XG59XG5mdW5jdGlvbiB3cml0ZUZpbGUoZmlsZW5hbWUsIGNvbnRlbnQpIHtcbiAgICBjb25zdCBkaXIgPSBwYXRoJG8uZGlybmFtZShmaWxlbmFtZSk7XG4gICAgaWYgKCFmcyRsLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgICAgICBmcyRsLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBmcyRsLndyaXRlRmlsZVN5bmMoZmlsZW5hbWUsIGNvbnRlbnQpO1xufVxuZnVuY3Rpb24gaXNGaWxlUmVhZGFibGUoZmlsZW5hbWUpIHtcbiAgICB0cnkge1xuICAgICAgICBmcyRsLmFjY2Vzc1N5bmMoZmlsZW5hbWUsIGZzJGwuY29uc3RhbnRzLlJfT0spO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuY29uc3Qgc3BsaXRGaXJzdERpclJFID0gLyguKz8pW1xcXFwvXSguKykvO1xuLyoqXG4gKiBEZWxldGUgZXZlcnkgZmlsZSBhbmQgc3ViZGlyZWN0b3J5LiAqKlRoZSBnaXZlbiBkaXJlY3RvcnkgbXVzdCBleGlzdC4qKlxuICogUGFzcyBhbiBvcHRpb25hbCBgc2tpcGAgYXJyYXkgdG8gcHJlc2VydmUgZmlsZXMgdW5kZXIgdGhlIHJvb3QgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBlbXB0eURpcihkaXIsIHNraXApIHtcbiAgICBjb25zdCBza2lwSW5EaXIgPSBbXTtcbiAgICBsZXQgbmVzdGVkID0gbnVsbDtcbiAgICBpZiAoc2tpcD8ubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBza2lwKSB7XG4gICAgICAgICAgICBpZiAocGF0aCRvLmRpcm5hbWUoZmlsZSkgIT09ICcuJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBmaWxlLm1hdGNoKHNwbGl0Rmlyc3REaXJSRSk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkID8/IChuZXN0ZWQgPSBuZXcgTWFwKCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbLCBuZXN0ZWREaXIsIHNraXBQYXRoXSA9IG1hdGNoZWQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXN0ZWRTa2lwID0gbmVzdGVkLmdldChuZXN0ZWREaXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZFNraXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFNraXAgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZC5zZXQobmVzdGVkRGlyLCBuZXN0ZWRTa2lwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZFNraXAuaW5jbHVkZXMoc2tpcFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRTa2lwLnB1c2goc2tpcFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2tpcEluRGlyLnB1c2goZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZzJGwucmVhZGRpclN5bmMoZGlyKSkge1xuICAgICAgICBpZiAoc2tpcEluRGlyLmluY2x1ZGVzKGZpbGUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmVzdGVkPy5oYXMoZmlsZSkpIHtcbiAgICAgICAgICAgIGVtcHR5RGlyKHBhdGgkby5yZXNvbHZlKGRpciwgZmlsZSksIG5lc3RlZC5nZXQoZmlsZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZnMkbC5ybVN5bmMocGF0aCRvLnJlc29sdmUoZGlyLCBmaWxlKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY29weURpcihzcmNEaXIsIGRlc3REaXIpIHtcbiAgICBmcyRsLm1rZGlyU3luYyhkZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZnMkbC5yZWFkZGlyU3luYyhzcmNEaXIpKSB7XG4gICAgICAgIGNvbnN0IHNyY0ZpbGUgPSBwYXRoJG8ucmVzb2x2ZShzcmNEaXIsIGZpbGUpO1xuICAgICAgICBpZiAoc3JjRmlsZSA9PT0gZGVzdERpcikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVzdEZpbGUgPSBwYXRoJG8ucmVzb2x2ZShkZXN0RGlyLCBmaWxlKTtcbiAgICAgICAgY29uc3Qgc3RhdCA9IGZzJGwuc3RhdFN5bmMoc3JjRmlsZSk7XG4gICAgICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIGNvcHlEaXIoc3JjRmlsZSwgZGVzdEZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZnMkbC5jb3B5RmlsZVN5bmMoc3JjRmlsZSwgZGVzdEZpbGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuY29uc3QgcmVtb3ZlRGlyID0gaXNXaW5kb3dzJDRcbiAgICA/IHByb21pc2lmeSQ0KGdyYWNlZnVsUmVtb3ZlRGlyKVxuICAgIDogZnVuY3Rpb24gcmVtb3ZlRGlyU3luYyhkaXIpIHtcbiAgICAgICAgLy8gd2hlbiByZW1vdmluZyBgLnZpdGUvZGVwc2AsIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIG5vZGVqcyBtYXkgYWxzbyByZW1vdmVcbiAgICAgICAgLy8gb3RoZXIgZGlyZWN0b3JpZXMgd2l0aGluIGAudml0ZS9gLCBpbmNsdWRpbmcgYC52aXRlL2RlcHNfdGVtcGAgKGJ1ZykuXG4gICAgICAgIC8vIHdvcmthcm91bmQgYnkgY2hlY2tpbmcgZm9yIGRpcmVjdG9yeSBleGlzdGVuY2UgYmVmb3JlIHJlbW92aW5nIGZvciBub3cuXG4gICAgICAgIGlmIChmcyRsLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgICAgICAgICAgZnMkbC5ybVN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuY29uc3QgcmVuYW1lRGlyID0gaXNXaW5kb3dzJDQgPyBwcm9taXNpZnkkNChncmFjZWZ1bFJlbmFtZSkgOiBmcyRsLnJlbmFtZVN5bmM7XG5mdW5jdGlvbiBlbnN1cmVXYXRjaGVkRmlsZSh3YXRjaGVyLCBmaWxlLCByb290KSB7XG4gICAgaWYgKGZpbGUgJiZcbiAgICAgICAgLy8gb25seSBuZWVkIHRvIHdhdGNoIGlmIG91dCBvZiByb290XG4gICAgICAgICFmaWxlLnN0YXJ0c1dpdGgocm9vdCArICcvJykgJiZcbiAgICAgICAgLy8gc29tZSByb2xsdXAgcGx1Z2lucyB1c2UgbnVsbCBieXRlcyBmb3IgcHJpdmF0ZSByZXNvbHZlZCBJZHNcbiAgICAgICAgIWZpbGUuaW5jbHVkZXMoJ1xcMCcpICYmXG4gICAgICAgIGZzJGwuZXhpc3RzU3luYyhmaWxlKSkge1xuICAgICAgICAvLyByZXNvbHZlIGZpbGUgdG8gbm9ybWFsaXplZCBzeXN0ZW0gcGF0aFxuICAgICAgICB3YXRjaGVyLmFkZChwYXRoJG8ucmVzb2x2ZShmaWxlKSk7XG4gICAgfVxufVxuY29uc3QgZXNjYXBlZFNwYWNlQ2hhcmFjdGVycyA9IC8oIHxcXFxcdHxcXFxcbnxcXFxcZnxcXFxccikrL2c7XG5jb25zdCBpbWFnZVNldFVybFJFID0gL14oPzpbXFx3XFwtXStcXCguKj9cXCl8Jy4qPyd8XCIuKj9cInxcXFMqKS87XG5mdW5jdGlvbiByZWR1Y2VTcmNzZXQocmV0KSB7XG4gICAgcmV0dXJuIHJldC5yZWR1Y2UoKHByZXYsIHsgdXJsLCBkZXNjcmlwdG9yIH0sIGluZGV4KSA9PiB7XG4gICAgICAgIGRlc2NyaXB0b3IgPz8gKGRlc2NyaXB0b3IgPSAnJyk7XG4gICAgICAgIHJldHVybiAocHJldiArPVxuICAgICAgICAgICAgdXJsICsgYCAke2Rlc2NyaXB0b3J9JHtpbmRleCA9PT0gcmV0Lmxlbmd0aCAtIDEgPyAnJyA6ICcsICd9YCk7XG4gICAgfSwgJycpO1xufVxuZnVuY3Rpb24gc3BsaXRTcmNTZXREZXNjcmlwdG9yKHNyY3MpIHtcbiAgICByZXR1cm4gc3BsaXRTcmNTZXQoc3JjcylcbiAgICAgICAgLm1hcCgocykgPT4ge1xuICAgICAgICBjb25zdCBzcmMgPSBzLnJlcGxhY2UoZXNjYXBlZFNwYWNlQ2hhcmFjdGVycywgJyAnKS50cmltKCk7XG4gICAgICAgIGNvbnN0IFt1cmxdID0gaW1hZ2VTZXRVcmxSRS5leGVjKHNyYykgfHwgWycnXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIGRlc2NyaXB0b3I6IHNyYz8uc2xpY2UodXJsLmxlbmd0aCkudHJpbSgpLFxuICAgICAgICB9O1xuICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKHsgdXJsIH0pID0+ICEhdXJsKTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NTcmNTZXQoc3JjcywgcmVwbGFjZXIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoc3BsaXRTcmNTZXREZXNjcmlwdG9yKHNyY3MpLm1hcChhc3luYyAoeyB1cmwsIGRlc2NyaXB0b3IgfSkgPT4gKHtcbiAgICAgICAgdXJsOiBhd2FpdCByZXBsYWNlcih7IHVybCwgZGVzY3JpcHRvciB9KSxcbiAgICAgICAgZGVzY3JpcHRvcixcbiAgICB9KSkpLnRoZW4oKHJldCkgPT4gcmVkdWNlU3Jjc2V0KHJldCkpO1xufVxuZnVuY3Rpb24gcHJvY2Vzc1NyY1NldFN5bmMoc3JjcywgcmVwbGFjZXIpIHtcbiAgICByZXR1cm4gcmVkdWNlU3Jjc2V0KHNwbGl0U3JjU2V0RGVzY3JpcHRvcihzcmNzKS5tYXAoKHsgdXJsLCBkZXNjcmlwdG9yIH0pID0+ICh7XG4gICAgICAgIHVybDogcmVwbGFjZXIoeyB1cmwsIGRlc2NyaXB0b3IgfSksXG4gICAgICAgIGRlc2NyaXB0b3IsXG4gICAgfSkpKTtcbn1cbmZ1bmN0aW9uIHNwbGl0U3JjU2V0KHNyY3MpIHtcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgIC8vIFRoZXJlIGNvdWxkIGJlIGEgJywnIGluc2lkZSBvZiB1cmwoZGF0YTouLi4pLCBsaW5lYXItZ3JhZGllbnQoLi4uKSBvciBcImRhdGE6Li4uXCJcbiAgICBjb25zdCBjbGVhbmVkU3JjcyA9IHNyY3MucmVwbGFjZSgvKD86dXJsfGltYWdlfGdyYWRpZW50fGNyb3NzLWZhZGUpXFwoW14pXSpcXCl8XCIoW15cIl18KD88PVxcXFwpXCIpKlwifCcoW14nXXwoPzw9XFxcXCknKSonL2csIGJsYW5rUmVwbGFjZXIpO1xuICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICBsZXQgc3BsaXRJbmRleDtcbiAgICBkbyB7XG4gICAgICAgIHNwbGl0SW5kZXggPSBjbGVhbmVkU3Jjcy5pbmRleE9mKCcsJywgc3RhcnRJbmRleCk7XG4gICAgICAgIHBhcnRzLnB1c2goc3Jjcy5zbGljZShzdGFydEluZGV4LCBzcGxpdEluZGV4ICE9PSAtMSA/IHNwbGl0SW5kZXggOiB1bmRlZmluZWQpKTtcbiAgICAgICAgc3RhcnRJbmRleCA9IHNwbGl0SW5kZXggKyAxO1xuICAgIH0gd2hpbGUgKHNwbGl0SW5kZXggIT09IC0xKTtcbiAgICByZXR1cm4gcGFydHM7XG59XG5mdW5jdGlvbiBlc2NhcGVUb0xpbnV4TGlrZVBhdGgocGF0aCkge1xuICAgIGlmICgvXltBLVpdOi8udGVzdChwYXRoKSkge1xuICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9eKFtBLVpdKTpcXC8vLCAnL3dpbmRvd3MvJDEvJyk7XG4gICAgfVxuICAgIGlmICgvXlxcL1teL10vLnRlc3QocGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGAvbGludXgke3BhdGh9YDtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59XG5mdW5jdGlvbiB1bmVzY2FwZVRvTGludXhMaWtlUGF0aChwYXRoKSB7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aCgnL2xpbnV4LycpKSB7XG4gICAgICAgIHJldHVybiBwYXRoLnNsaWNlKCcvbGludXgnLmxlbmd0aCk7XG4gICAgfVxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoJy93aW5kb3dzLycpKSB7XG4gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL15cXC93aW5kb3dzXFwvKFtBLVpdKVxcLy8sICckMTovJyk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xufVxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3N2ZWx0ZWpzL3N2ZWx0ZS9ibG9iL2FiZjExYmIwMmIyYWZiZDNlNGNhYzUwOWEwZjcwZTMxOGMzMDYzNjQvc3JjL2NvbXBpbGVyL3V0aWxzL21hcHBlZF9jb2RlLnRzI0wyMjFcbmNvbnN0IG51bGxTb3VyY2VNYXAgPSB7XG4gICAgbmFtZXM6IFtdLFxuICAgIHNvdXJjZXM6IFtdLFxuICAgIG1hcHBpbmdzOiAnJyxcbiAgICB2ZXJzaW9uOiAzLFxufTtcbmZ1bmN0aW9uIGNvbWJpbmVTb3VyY2VtYXBzKGZpbGVuYW1lLCBzb3VyY2VtYXBMaXN0LCBleGNsdWRlQ29udGVudCA9IHRydWUpIHtcbiAgICBpZiAoc291cmNlbWFwTGlzdC5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgc291cmNlbWFwTGlzdC5ldmVyeSgobSkgPT4gbS5zb3VyY2VzLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4ubnVsbFNvdXJjZU1hcCB9O1xuICAgIH1cbiAgICAvLyBoYWNrIGZvciBwYXJzZSBicm9rZW4gd2l0aCBub3JtYWxpemVkIGFic29sdXRlIHBhdGhzIG9uIHdpbmRvd3MgKEM6L3BhdGgvdG8vc29tZXRoaW5nKS5cbiAgICAvLyBlc2NhcGUgdGhlbSB0byBsaW51eCBsaWtlIHBhdGhzXG4gICAgLy8gYWxzbyBhdm9pZCBtdXRhdGlvbiBoZXJlIHRvIHByZXZlbnQgYnJlYWtpbmcgcGx1Z2luJ3MgdXNpbmcgY2FjaGUgdG8gZ2VuZXJhdGUgc291cmNlbWFwcyBsaWtlIHZ1ZSAoc2VlICM3NDQyKVxuICAgIHNvdXJjZW1hcExpc3QgPSBzb3VyY2VtYXBMaXN0Lm1hcCgoc291cmNlbWFwKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1NvdXJjZW1hcHMgPSB7IC4uLnNvdXJjZW1hcCB9O1xuICAgICAgICBuZXdTb3VyY2VtYXBzLnNvdXJjZXMgPSBzb3VyY2VtYXAuc291cmNlcy5tYXAoKHNvdXJjZSkgPT4gc291cmNlID8gZXNjYXBlVG9MaW51eExpa2VQYXRoKHNvdXJjZSkgOiBudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZW1hcC5zb3VyY2VSb290KSB7XG4gICAgICAgICAgICBuZXdTb3VyY2VtYXBzLnNvdXJjZVJvb3QgPSBlc2NhcGVUb0xpbnV4TGlrZVBhdGgoc291cmNlbWFwLnNvdXJjZVJvb3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdTb3VyY2VtYXBzO1xuICAgIH0pO1xuICAgIGNvbnN0IGVzY2FwZWRGaWxlbmFtZSA9IGVzY2FwZVRvTGludXhMaWtlUGF0aChmaWxlbmFtZSk7XG4gICAgLy8gV2UgZG9uJ3QgZGVjbGFyZSB0eXBlIGhlcmUgc28gd2UgY2FuIGNvbnZlcnQvZmFrZS9tYXAgYXMgUmF3U291cmNlTWFwXG4gICAgbGV0IG1hcDsgLy86IFNvdXJjZU1hcFxuICAgIGxldCBtYXBJbmRleCA9IDE7XG4gICAgY29uc3QgdXNlQXJyYXlJbnRlcmZhY2UgPSBzb3VyY2VtYXBMaXN0LnNsaWNlKDAsIC0xKS5maW5kKChtKSA9PiBtLnNvdXJjZXMubGVuZ3RoICE9PSAxKSA9PT0gdW5kZWZpbmVkO1xuICAgIGlmICh1c2VBcnJheUludGVyZmFjZSkge1xuICAgICAgICBtYXAgPSByZW1hcHBpbmcoc291cmNlbWFwTGlzdCwgKCkgPT4gbnVsbCwgZXhjbHVkZUNvbnRlbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbWFwID0gcmVtYXBwaW5nKHNvdXJjZW1hcExpc3RbMF0sIGZ1bmN0aW9uIGxvYWRlcihzb3VyY2VmaWxlKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlZmlsZSA9PT0gZXNjYXBlZEZpbGVuYW1lICYmIHNvdXJjZW1hcExpc3RbbWFwSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZW1hcExpc3RbbWFwSW5kZXgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZXhjbHVkZUNvbnRlbnQpO1xuICAgIH1cbiAgICBpZiAoIW1hcC5maWxlKSB7XG4gICAgICAgIGRlbGV0ZSBtYXAuZmlsZTtcbiAgICB9XG4gICAgLy8gdW5lc2NhcGUgdGhlIHByZXZpb3VzIGhhY2tcbiAgICBtYXAuc291cmNlcyA9IG1hcC5zb3VyY2VzLm1hcCgoc291cmNlKSA9PiBzb3VyY2UgPyB1bmVzY2FwZVRvTGludXhMaWtlUGF0aChzb3VyY2UpIDogc291cmNlKTtcbiAgICBtYXAuZmlsZSA9IGZpbGVuYW1lO1xuICAgIHJldHVybiBtYXA7XG59XG5mdW5jdGlvbiB1bmlxdWUoYXJyKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChhcnIpKTtcbn1cbi8qKlxuICogUmV0dXJucyByZXNvbHZlZCBsb2NhbGhvc3QgYWRkcmVzcyB3aGVuIGBkbnMubG9va3VwYCByZXN1bHQgZGlmZmVycyBmcm9tIEROU1xuICpcbiAqIGBkbnMubG9va3VwYCByZXN1bHQgaXMgc2FtZSB3aGVuIGRlZmF1bHRSZXN1bHRPcmRlciBpcyBgdmVyYmF0aW1gLlxuICogRXZlbiBpZiBkZWZhdWx0UmVzdWx0T3JkZXIgaXMgYGlwdjRmaXJzdGAsIGBkbnMubG9va3VwYCByZXN1bHQgbWF5YmUgc2FtZS5cbiAqIEZvciBleGFtcGxlLCB3aGVuIElQdjYgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGF0IG1hY2hpbmUvbmV0d29yay5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYWxob3N0QWRkcmVzc0lmRGlmZmVyc0Zyb21ETlMoKSB7XG4gICAgY29uc3QgW25vZGVSZXN1bHQsIGRuc1Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHByb21pc2VzLmxvb2t1cCgnbG9jYWxob3N0JyksXG4gICAgICAgIHByb21pc2VzLmxvb2t1cCgnbG9jYWxob3N0JywgeyB2ZXJiYXRpbTogdHJ1ZSB9KSxcbiAgICBdKTtcbiAgICBjb25zdCBpc1NhbWUgPSBub2RlUmVzdWx0LmZhbWlseSA9PT0gZG5zUmVzdWx0LmZhbWlseSAmJlxuICAgICAgICBub2RlUmVzdWx0LmFkZHJlc3MgPT09IGRuc1Jlc3VsdC5hZGRyZXNzO1xuICAgIHJldHVybiBpc1NhbWUgPyB1bmRlZmluZWQgOiBub2RlUmVzdWx0LmFkZHJlc3M7XG59XG5mdW5jdGlvbiBkaWZmRG5zT3JkZXJDaGFuZ2Uob2xkVXJscywgbmV3VXJscykge1xuICAgIHJldHVybiAhKG9sZFVybHMgPT09IG5ld1VybHMgfHxcbiAgICAgICAgKG9sZFVybHMgJiZcbiAgICAgICAgICAgIG5ld1VybHMgJiZcbiAgICAgICAgICAgIGFycmF5RXF1YWwob2xkVXJscy5sb2NhbCwgbmV3VXJscy5sb2NhbCkgJiZcbiAgICAgICAgICAgIGFycmF5RXF1YWwob2xkVXJscy5uZXR3b3JrLCBuZXdVcmxzLm5ldHdvcmspKSk7XG59XG5hc3luYyBmdW5jdGlvbiByZXNvbHZlSG9zdG5hbWUob3B0aW9uc0hvc3QpIHtcbiAgICBsZXQgaG9zdDtcbiAgICBpZiAob3B0aW9uc0hvc3QgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zSG9zdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgLy8gVXNlIGEgc2VjdXJlIGRlZmF1bHRcbiAgICAgICAgaG9zdCA9ICdsb2NhbGhvc3QnO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zSG9zdCA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBJZiBwYXNzZWQgLS1ob3N0IGluIHRoZSBDTEkgd2l0aG91dCBhcmd1bWVudHNcbiAgICAgICAgaG9zdCA9IHVuZGVmaW5lZDsgLy8gdW5kZWZpbmVkIHR5cGljYWxseSBtZWFucyAwLjAuMC4wIG9yIDo6IChsaXN0ZW4gb24gYWxsIElQcylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGhvc3QgPSBvcHRpb25zSG9zdDtcbiAgICB9XG4gICAgLy8gU2V0IGhvc3QgbmFtZSB0byBsb2NhbGhvc3Qgd2hlbiBwb3NzaWJsZVxuICAgIGxldCBuYW1lID0gaG9zdCA9PT0gdW5kZWZpbmVkIHx8IHdpbGRjYXJkSG9zdHMuaGFzKGhvc3QpID8gJ2xvY2FsaG9zdCcgOiBob3N0O1xuICAgIGlmIChob3N0ID09PSAnbG9jYWxob3N0Jykge1xuICAgICAgICAvLyBTZWUgIzg2NDcgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgY29uc3QgbG9jYWxob3N0QWRkciA9IGF3YWl0IGdldExvY2FsaG9zdEFkZHJlc3NJZkRpZmZlcnNGcm9tRE5TKCk7XG4gICAgICAgIGlmIChsb2NhbGhvc3RBZGRyKSB7XG4gICAgICAgICAgICBuYW1lID0gbG9jYWxob3N0QWRkcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBob3N0LCBuYW1lIH07XG59XG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2VydmVyVXJscyhzZXJ2ZXIsIG9wdGlvbnMsIGNvbmZpZykge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBzZXJ2ZXIuYWRkcmVzcygpO1xuICAgIGNvbnN0IGlzQWRkcmVzc0luZm8gPSAoeCkgPT4geD8uYWRkcmVzcztcbiAgICBpZiAoIWlzQWRkcmVzc0luZm8oYWRkcmVzcykpIHtcbiAgICAgICAgcmV0dXJuIHsgbG9jYWw6IFtdLCBuZXR3b3JrOiBbXSB9O1xuICAgIH1cbiAgICBjb25zdCBsb2NhbCA9IFtdO1xuICAgIGNvbnN0IG5ldHdvcmsgPSBbXTtcbiAgICBjb25zdCBob3N0bmFtZSA9IGF3YWl0IHJlc29sdmVIb3N0bmFtZShvcHRpb25zLmhvc3QpO1xuICAgIGNvbnN0IHByb3RvY29sID0gb3B0aW9ucy5odHRwcyA/ICdodHRwcycgOiAnaHR0cCc7XG4gICAgY29uc3QgcG9ydCA9IGFkZHJlc3MucG9ydDtcbiAgICBjb25zdCBiYXNlID0gY29uZmlnLnJhd0Jhc2UgPT09ICcuLycgfHwgY29uZmlnLnJhd0Jhc2UgPT09ICcnID8gJy8nIDogY29uZmlnLnJhd0Jhc2U7XG4gICAgaWYgKGhvc3RuYW1lLmhvc3QgJiYgbG9vcGJhY2tIb3N0cy5oYXMoaG9zdG5hbWUuaG9zdCkpIHtcbiAgICAgICAgbGV0IGhvc3RuYW1lTmFtZSA9IGhvc3RuYW1lLm5hbWU7XG4gICAgICAgIC8vIGlwdjYgaG9zdFxuICAgICAgICBpZiAoaG9zdG5hbWVOYW1lLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgICAgICAgIGhvc3RuYW1lTmFtZSA9IGBbJHtob3N0bmFtZU5hbWV9XWA7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYWwucHVzaChgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lTmFtZX06JHtwb3J0fSR7YmFzZX1gKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXMob3MkMy5uZXR3b3JrSW50ZXJmYWNlcygpKVxuICAgICAgICAgICAgLmZsYXRNYXAoKG5JbnRlcmZhY2UpID0+IG5JbnRlcmZhY2UgPz8gW10pXG4gICAgICAgICAgICAuZmlsdGVyKChkZXRhaWwpID0+IGRldGFpbCAmJlxuICAgICAgICAgICAgZGV0YWlsLmFkZHJlc3MgJiZcbiAgICAgICAgICAgIChkZXRhaWwuZmFtaWx5ID09PSAnSVB2NCcgfHxcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE5vZGUgMTguMCAtIDE4LjMgcmV0dXJucyBudW1iZXJcbiAgICAgICAgICAgICAgICBkZXRhaWwuZmFtaWx5ID09PSA0KSlcbiAgICAgICAgICAgIC5mb3JFYWNoKChkZXRhaWwpID0+IHtcbiAgICAgICAgICAgIGxldCBob3N0ID0gZGV0YWlsLmFkZHJlc3MucmVwbGFjZSgnMTI3LjAuMC4xJywgaG9zdG5hbWUubmFtZSk7XG4gICAgICAgICAgICAvLyBpcHY2IGhvc3RcbiAgICAgICAgICAgIGlmIChob3N0LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgICAgICAgICAgICBob3N0ID0gYFske2hvc3R9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke2hvc3R9OiR7cG9ydH0ke2Jhc2V9YDtcbiAgICAgICAgICAgIGlmIChkZXRhaWwuYWRkcmVzcy5pbmNsdWRlcygnMTI3LjAuMC4xJykpIHtcbiAgICAgICAgICAgICAgICBsb2NhbC5wdXNoKHVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXR3b3JrLnB1c2godXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IGxvY2FsLCBuZXR3b3JrIH07XG59XG5mdW5jdGlvbiBhcnJhaWZ5KHRhcmdldCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQgOiBbdGFyZ2V0XTtcbn1cbi8vIFRha2VuIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM2MzI4ODkwXG5jb25zdCBtdWx0aWxpbmVDb21tZW50c1JFJDEgPSAvXFwvXFwqW14qXSpcXCorKD86W14vKl1bXipdKlxcKispKlxcLy9nO1xuY29uc3Qgc2luZ2xlbGluZUNvbW1lbnRzUkUkMSA9IC9cXC9cXC8uKi9nO1xuY29uc3QgcmVxdWVzdFF1ZXJ5U3BsaXRSRSA9IC9cXD8oPyEuKlsvfH1dKS87XG4vLyBAdHMtZXhwZWN0LWVycm9yIGplc3Qgb25seSBleGlzdHMgd2hlbiBydW5uaW5nIEplc3RcbmNvbnN0IHVzaW5nRHluYW1pY0ltcG9ydCA9IHR5cGVvZiBqZXN0ID09PSAndW5kZWZpbmVkJztcbi8qKlxuICogRHluYW1pY2FsbHkgaW1wb3J0IGZpbGVzLiBJdCB3aWxsIG1ha2Ugc3VyZSBpdCdzIG5vdCBiZWluZyBjb21waWxlZCBhd2F5IGJ5IFRTL1JvbGx1cC5cbiAqXG4gKiBBcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBKZXN0J3MgbGFjayBvZiBzdGFibGUgRVNNIHN1cHBvcnQsIHdlIGZhbGxiYWNrIHRvIHJlcXVpcmVcbiAqIGlmIHdlJ3JlIGluIGEgSmVzdCBlbnZpcm9ubWVudC5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdml0ZWpzL3ZpdGUvcHVsbC81MTk3I2lzc3VlY29tbWVudC05MzgwNTQwNzdcbiAqXG4gKiBAcGFyYW0gZmlsZSBGaWxlIHBhdGggdG8gaW1wb3J0LlxuICovXG5jb25zdCBkeW5hbWljSW1wb3J0ID0gdXNpbmdEeW5hbWljSW1wb3J0XG4gICAgPyBuZXcgRnVuY3Rpb24oJ2ZpbGUnLCAncmV0dXJuIGltcG9ydChmaWxlKScpXG4gICAgOiBfcmVxdWlyZSQzO1xuZnVuY3Rpb24gcGFyc2VSZXF1ZXN0KGlkKSB7XG4gICAgY29uc3QgW18sIHNlYXJjaF0gPSBpZC5zcGxpdChyZXF1ZXN0UXVlcnlTcGxpdFJFLCAyKTtcbiAgICBpZiAoIXNlYXJjaCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaCkpO1xufVxuY29uc3QgYmxhbmtSZXBsYWNlciA9IChtYXRjaCkgPT4gJyAnLnJlcGVhdChtYXRjaC5sZW5ndGgpO1xuZnVuY3Rpb24gZ2V0SGFzaCh0ZXh0KSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhc2gkMignc2hhMjU2JykudXBkYXRlKHRleHQpLmRpZ2VzdCgnaGV4Jykuc3Vic3RyaW5nKDAsIDgpO1xufVxuY29uc3QgcmVxdWlyZVJlc29sdmVGcm9tUm9vdFdpdGhGYWxsYmFjayA9IChyb290LCBpZCkgPT4ge1xuICAgIGNvbnN0IHBhdGhzID0gX3JlcXVpcmUkMy5yZXNvbHZlLnBhdGhzPy4oaWQpIHx8IFtdO1xuICAgIC8vIFNlYXJjaCBpbiB0aGUgcm9vdCBkaXJlY3RvcnkgZmlyc3QsIGFuZCBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCByZXF1aXJlIHBhdGhzLlxuICAgIHBhdGhzLnVuc2hpZnQocm9vdCk7XG4gICAgLy8gVXNlIGByZXNvbHZlYCBwYWNrYWdlIHRvIGNoZWNrIGV4aXN0ZW5jZSBmaXJzdCwgc28gaWYgdGhlIHBhY2thZ2UgaXMgbm90IGZvdW5kLFxuICAgIC8vIGl0IHdvbid0IGJlIGNhY2hlZCBieSBub2RlanMsIHNpbmNlIHRoZXJlIGlzbid0IGEgd2F5IHRvIGludmFsaWRhdGUgdGhlbTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzQ0NjYzXG4gICAgcmVzb2x2ZSQ0LnN5bmMoaWQsIHsgYmFzZWRpcjogcm9vdCwgcGF0aHMgfSk7XG4gICAgLy8gVXNlIGByZXF1aXJlLnJlc29sdmVgIGFnYWluIGFzIHRoZSBgcmVzb2x2ZWAgcGFja2FnZSBkb2Vzbid0IHN1cHBvcnQgdGhlIGBleHBvcnRzYCBmaWVsZFxuICAgIHJldHVybiBfcmVxdWlyZSQzLnJlc29sdmUoaWQsIHsgcGF0aHMgfSk7XG59O1xuLy8gQmFzZWQgb24gbm9kZS1ncmFjZWZ1bC1mc1xuLy8gVGhlIElTQyBMaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTEtMjAyMiBJc2FhYyBaLiBTY2hsdWV0ZXIsIEJlbiBOb29yZGh1aXMsIGFuZCBDb250cmlidXRvcnNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS1ncmFjZWZ1bC1mcy9ibG9iL21haW4vTElDRU5TRVxuLy8gT24gV2luZG93cywgQS9WIHNvZnR3YXJlIGNhbiBsb2NrIHRoZSBkaXJlY3RvcnksIGNhdXNpbmcgdGhpc1xuLy8gdG8gZmFpbCB3aXRoIGFuIEVBQ0NFUyBvciBFUEVSTSBpZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5zIG5ld2x5XG4vLyBjcmVhdGVkIGZpbGVzLiBUaGUgb3JpZ2luYWwgdHJpZWQgZm9yIHVwIHRvIDYwIHNlY29uZHMsIHdlIG9ubHlcbi8vIHdhaXQgZm9yIDUgc2Vjb25kcywgYXMgYSBsb25nZXIgdGltZSB3b3VsZCBiZSBzZWVuIGFzIGFuIGVycm9yXG5jb25zdCBHUkFDRUZVTF9SRU5BTUVfVElNRU9VVCA9IDUwMDA7XG5mdW5jdGlvbiBncmFjZWZ1bFJlbmFtZShmcm9tLCB0bywgY2IpIHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgbGV0IGJhY2tvZmYgPSAwO1xuICAgIGZzJGwucmVuYW1lKGZyb20sIHRvLCBmdW5jdGlvbiBDQihlcikge1xuICAgICAgICBpZiAoZXIgJiZcbiAgICAgICAgICAgIChlci5jb2RlID09PSAnRUFDQ0VTJyB8fCBlci5jb2RlID09PSAnRVBFUk0nKSAmJlxuICAgICAgICAgICAgRGF0ZS5ub3coKSAtIHN0YXJ0IDwgR1JBQ0VGVUxfUkVOQU1FX1RJTUVPVVQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZzJGwuc3RhdCh0bywgZnVuY3Rpb24gKHN0YXRlciwgc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlciAmJiBzdGF0ZXIuY29kZSA9PT0gJ0VOT0VOVCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBmcyRsLnJlbmFtZShmcm9tLCB0bywgQ0IpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBDQihlcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBiYWNrb2ZmKTtcbiAgICAgICAgICAgIGlmIChiYWNrb2ZmIDwgMTAwKVxuICAgICAgICAgICAgICAgIGJhY2tvZmYgKz0gMTA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNiKVxuICAgICAgICAgICAgY2IoZXIpO1xuICAgIH0pO1xufVxuY29uc3QgR1JBQ0VGVUxfUkVNT1ZFX0RJUl9USU1FT1VUID0gNTAwMDtcbmZ1bmN0aW9uIGdyYWNlZnVsUmVtb3ZlRGlyKGRpciwgY2IpIHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgbGV0IGJhY2tvZmYgPSAwO1xuICAgIGZzJGwucm0oZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9LCBmdW5jdGlvbiBDQihlcikge1xuICAgICAgICBpZiAoZXIpIHtcbiAgICAgICAgICAgIGlmICgoZXIuY29kZSA9PT0gJ0VOT1RFTVBUWScgfHxcbiAgICAgICAgICAgICAgICBlci5jb2RlID09PSAnRUFDQ0VTJyB8fFxuICAgICAgICAgICAgICAgIGVyLmNvZGUgPT09ICdFUEVSTScpICYmXG4gICAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIHN0YXJ0IDwgR1JBQ0VGVUxfUkVNT1ZFX0RJUl9USU1FT1VUKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZzJGwucm0oZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9LCBDQik7XG4gICAgICAgICAgICAgICAgfSwgYmFja29mZik7XG4gICAgICAgICAgICAgICAgaWYgKGJhY2tvZmYgPCAxMDApXG4gICAgICAgICAgICAgICAgICAgIGJhY2tvZmYgKz0gMTA7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgICAgZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYilcbiAgICAgICAgICAgIGNiKGVyKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGVtcHR5Q3NzQ29tbWVudHMocmF3KSB7XG4gICAgcmV0dXJuIHJhdy5yZXBsYWNlKG11bHRpbGluZUNvbW1lbnRzUkUkMSwgKHMpID0+ICcgJy5yZXBlYXQocy5sZW5ndGgpKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUNvbW1lbnRzKHJhdykge1xuICAgIHJldHVybiByYXcucmVwbGFjZShtdWx0aWxpbmVDb21tZW50c1JFJDEsICcnKS5yZXBsYWNlKHNpbmdsZWxpbmVDb21tZW50c1JFJDEsICcnKTtcbn1cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnUmVjdXJzaXZlbHkoZGVmYXVsdHMsIG92ZXJyaWRlcywgcm9vdFBhdGgpIHtcbiAgICBjb25zdCBtZXJnZWQgPSB7IC4uLmRlZmF1bHRzIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3ZlcnJpZGVzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3ZlcnJpZGVzW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGlzdGluZyA9IG1lcmdlZFtrZXldO1xuICAgICAgICBpZiAoZXhpc3RpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgbWVyZ2VkW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpZWxkcyB0aGF0IHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZ1xuICAgICAgICBpZiAoa2V5ID09PSAnYWxpYXMnICYmIChyb290UGF0aCA9PT0gJ3Jlc29sdmUnIHx8IHJvb3RQYXRoID09PSAnJykpIHtcbiAgICAgICAgICAgIG1lcmdlZFtrZXldID0gbWVyZ2VBbGlhcyhleGlzdGluZywgdmFsdWUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSAnYXNzZXRzSW5jbHVkZScgJiYgcm9vdFBhdGggPT09ICcnKSB7XG4gICAgICAgICAgICBtZXJnZWRba2V5XSA9IFtdLmNvbmNhdChleGlzdGluZywgdmFsdWUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSAnbm9FeHRlcm5hbCcgJiZcbiAgICAgICAgICAgIHJvb3RQYXRoID09PSAnc3NyJyAmJlxuICAgICAgICAgICAgKGV4aXN0aW5nID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlKSkge1xuICAgICAgICAgICAgbWVyZ2VkW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBtZXJnZWRba2V5XSA9IFsuLi5hcnJhaWZ5KGV4aXN0aW5nID8/IFtdKSwgLi4uYXJyYWlmeSh2YWx1ZSA/PyBbXSldO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT2JqZWN0JDIoZXhpc3RpbmcpICYmIGlzT2JqZWN0JDIodmFsdWUpKSB7XG4gICAgICAgICAgICBtZXJnZWRba2V5XSA9IG1lcmdlQ29uZmlnUmVjdXJzaXZlbHkoZXhpc3RpbmcsIHZhbHVlLCByb290UGF0aCA/IGAke3Jvb3RQYXRofS4ke2tleX1gIDoga2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1lcmdlZFtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWQ7XG59XG5mdW5jdGlvbiBtZXJnZUNvbmZpZyhkZWZhdWx0cywgb3ZlcnJpZGVzLCBpc1Jvb3QgPSB0cnVlKSB7XG4gICAgcmV0dXJuIG1lcmdlQ29uZmlnUmVjdXJzaXZlbHkoZGVmYXVsdHMsIG92ZXJyaWRlcywgaXNSb290ID8gJycgOiAnLicpO1xufVxuZnVuY3Rpb24gbWVyZ2VBbGlhcyhhLCBiKSB7XG4gICAgaWYgKCFhKVxuICAgICAgICByZXR1cm4gYjtcbiAgICBpZiAoIWIpXG4gICAgICAgIHJldHVybiBhO1xuICAgIGlmIChpc09iamVjdCQyKGEpICYmIGlzT2JqZWN0JDIoYikpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYSwgLi4uYiB9O1xuICAgIH1cbiAgICAvLyB0aGUgb3JkZXIgaXMgZmxpcHBlZCBiZWNhdXNlIHRoZSBhbGlhcyBpcyByZXNvbHZlZCBmcm9tIHRvcC1kb3duLFxuICAgIC8vIHdoZXJlIHRoZSBsYXRlciBzaG91bGQgaGF2ZSBoaWdoZXIgcHJpb3JpdHlcbiAgICByZXR1cm4gWy4uLm5vcm1hbGl6ZUFsaWFzKGIpLCAuLi5ub3JtYWxpemVBbGlhcyhhKV07XG59XG5mdW5jdGlvbiBub3JtYWxpemVBbGlhcyhvID0gW10pIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvKVxuICAgICAgICA/IG8ubWFwKG5vcm1hbGl6ZVNpbmdsZUFsaWFzKVxuICAgICAgICA6IE9iamVjdC5rZXlzKG8pLm1hcCgoZmluZCkgPT4gbm9ybWFsaXplU2luZ2xlQWxpYXMoe1xuICAgICAgICAgICAgZmluZCxcbiAgICAgICAgICAgIHJlcGxhY2VtZW50OiBvW2ZpbmRdLFxuICAgICAgICB9KSk7XG59XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdml0ZWpzL3ZpdGUvaXNzdWVzLzEzNjNcbi8vIHdvcmsgYXJvdW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcGx1Z2lucy9pc3N1ZXMvNzU5XG5mdW5jdGlvbiBub3JtYWxpemVTaW5nbGVBbGlhcyh7IGZpbmQsIHJlcGxhY2VtZW50LCBjdXN0b21SZXNvbHZlciwgfSkge1xuICAgIGlmICh0eXBlb2YgZmluZCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgZmluZC5lbmRzV2l0aCgnLycpICYmXG4gICAgICAgIHJlcGxhY2VtZW50LmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgZmluZCA9IGZpbmQuc2xpY2UoMCwgZmluZC5sZW5ndGggLSAxKTtcbiAgICAgICAgcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudC5zbGljZSgwLCByZXBsYWNlbWVudC5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgY29uc3QgYWxpYXMgPSB7XG4gICAgICAgIGZpbmQsXG4gICAgICAgIHJlcGxhY2VtZW50LFxuICAgIH07XG4gICAgaWYgKGN1c3RvbVJlc29sdmVyKSB7XG4gICAgICAgIGFsaWFzLmN1c3RvbVJlc29sdmVyID0gY3VzdG9tUmVzb2x2ZXI7XG4gICAgfVxuICAgIHJldHVybiBhbGlhcztcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0cmFuc3BpbGVkIGNvZGUgcmVzdWx0IHdoZXJlIGxpbmUgbnVtYmVycyBhcmVuJ3QgYWx0ZXJlZCxcbiAqIHNvIHdlIGNhbiBza2lwIHNvdXJjZW1hcCBnZW5lcmF0aW9uIGR1cmluZyBkZXZcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtU3RhYmxlUmVzdWx0KHMsIGlkLCBjb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBzLnRvU3RyaW5nKCksXG4gICAgICAgIG1hcDogY29uZmlnLmNvbW1hbmQgPT09ICdidWlsZCcgJiYgY29uZmlnLmJ1aWxkLnNvdXJjZW1hcFxuICAgICAgICAgICAgPyBzLmdlbmVyYXRlTWFwKHsgaGlyZXM6IHRydWUsIHNvdXJjZTogaWQgfSlcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICB9O1xufVxuYXN5bmMgZnVuY3Rpb24gYXN5bmNGbGF0dGVuKGFycikge1xuICAgIGRvIHtcbiAgICAgICAgYXJyID0gKGF3YWl0IFByb21pc2UuYWxsKGFycikpLmZsYXQoSW5maW5pdHkpO1xuICAgIH0gd2hpbGUgKGFyci5zb21lKCh2KSA9PiB2Py50aGVuKSk7XG4gICAgcmV0dXJuIGFycjtcbn1cbi8vIHN0cmlwIFVURi04IEJPTVxuZnVuY3Rpb24gc3RyaXBCb21UYWcoY29udGVudCkge1xuICAgIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4ZmVmZikge1xuICAgICAgICByZXR1cm4gY29udGVudC5zbGljZSgxKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59XG5jb25zdCB3aW5kb3dzRHJpdmVQYXRoUHJlZml4UkUgPSAvXltBLVphLXpdOlsvXFxcXF0vO1xuLyoqXG4gKiBwYXRoLmlzQWJzb2x1dGUgYWxzbyByZXR1cm5zIHRydWUgZm9yIGRyaXZlIHJlbGF0aXZlIHBhdGhzIG9uIHdpbmRvd3MgKGUuZy4gL3NvbWV0aGluZylcbiAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBmb3IgdGhlbSBidXQgdHJ1ZSBmb3IgYWJzb2x1dGUgcGF0aHMgKGUuZy4gQzovc29tZXRoaW5nKVxuICovXG5jb25zdCBpc05vbkRyaXZlUmVsYXRpdmVBYnNvbHV0ZVBhdGggPSAocCkgPT4ge1xuICAgIGlmICghaXNXaW5kb3dzJDQpXG4gICAgICAgIHJldHVybiBwLnN0YXJ0c1dpdGgoJy8nKTtcbiAgICByZXR1cm4gd2luZG93c0RyaXZlUGF0aFByZWZpeFJFLnRlc3QocCk7XG59O1xuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSBmaWxlIGlzIGJlaW5nIHJlcXVlc3RlZCB3aXRoIHRoZSBjb3JyZWN0IGNhc2UsIHRvIGVuc3VyZVxuICogY29uc2lzdGVudCBiZWhhdmlvdXIgYmV0d2VlbiBkZXYgYW5kIHByb2QgYW5kIGFjcm9zcyBvcGVyYXRpbmcgc3lzdGVtcy5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkU2VydmVGaWxlKGZpbGVQYXRoLCByb290KSB7XG4gICAgLy8gY2FuIHNraXAgY2FzZSBjaGVjayBvbiBMaW51eFxuICAgIGlmICghaXNDYXNlSW5zZW5zaXRpdmVGUylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGhhc0NvcnJlY3RDYXNlKGZpbGVQYXRoLCByb290KTtcbn1cbi8qKlxuICogTm90ZSB0aGF0IHdlIGNhbid0IHVzZSByZWFscGF0aCBoZXJlLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZm9sbG93XG4gKiBzeW1saW5rcy5cbiAqL1xuZnVuY3Rpb24gaGFzQ29ycmVjdENhc2UoZmlsZSwgYXNzZXRzKSB7XG4gICAgaWYgKGZpbGUgPT09IGFzc2V0cylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aCRvLmRpcm5hbWUoZmlsZSk7XG4gICAgaWYgKGZzJGwucmVhZGRpclN5bmMocGFyZW50KS5pbmNsdWRlcyhwYXRoJG8uYmFzZW5hbWUoZmlsZSkpKSB7XG4gICAgICAgIHJldHVybiBoYXNDb3JyZWN0Q2FzZShwYXJlbnQsIGFzc2V0cyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGpvaW5VcmxTZWdtZW50cyhhLCBiKSB7XG4gICAgaWYgKCFhIHx8ICFiKSB7XG4gICAgICAgIHJldHVybiBhIHx8IGIgfHwgJyc7XG4gICAgfVxuICAgIGlmIChhLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgYSA9IGEuc3Vic3RyaW5nKDAsIGEubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIGlmICghYi5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgYiA9ICcvJyArIGI7XG4gICAgfVxuICAgIHJldHVybiBhICsgYjtcbn1cbmZ1bmN0aW9uIHN0cmlwQmFzZShwYXRoLCBiYXNlKSB7XG4gICAgaWYgKHBhdGggPT09IGJhc2UpIHtcbiAgICAgICAgcmV0dXJuICcvJztcbiAgICB9XG4gICAgY29uc3QgZGV2QmFzZSA9IGJhc2UuZW5kc1dpdGgoJy8nKSA/IGJhc2UgOiBiYXNlICsgJy8nO1xuICAgIHJldHVybiBwYXRoLnJlcGxhY2UoUmVnRXhwKCdeJyArIGRldkJhc2UpLCAnLycpO1xufVxuZnVuY3Rpb24gYXJyYXlFcXVhbChhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZXZhbFZhbHVlKHJhd1ZhbHVlKSB7XG4gICAgY29uc3QgZm4gPSBuZXcgRnVuY3Rpb24oYFxuICAgIHZhciBjb25zb2xlLCBleHBvcnRzLCBnbG9iYWwsIG1vZHVsZSwgcHJvY2VzcywgcmVxdWlyZVxuICAgIHJldHVybiAoXFxuJHtyYXdWYWx1ZX1cXG4pXG4gIGApO1xuICAgIHJldHVybiBmbigpO1xufVxuXG4vKiBlc2xpbnQgbm8tY29uc29sZTogMCAqL1xuY29uc3QgTG9nTGV2ZWxzID0ge1xuICAgIHNpbGVudDogMCxcbiAgICBlcnJvcjogMSxcbiAgICB3YXJuOiAyLFxuICAgIGluZm86IDMsXG59O1xubGV0IGxhc3RUeXBlO1xubGV0IGxhc3RNc2c7XG5sZXQgc2FtZUNvdW50ID0gMDtcbmZ1bmN0aW9uIGNsZWFyU2NyZWVuKCkge1xuICAgIGNvbnN0IHJlcGVhdENvdW50ID0gcHJvY2Vzcy5zdGRvdXQucm93cyAtIDI7XG4gICAgY29uc3QgYmxhbmsgPSByZXBlYXRDb3VudCA+IDAgPyAnXFxuJy5yZXBlYXQocmVwZWF0Q291bnQpIDogJyc7XG4gICAgY29uc29sZS5sb2coYmxhbmspO1xuICAgIHJlYWRsaW5lLmN1cnNvclRvKHByb2Nlc3Muc3Rkb3V0LCAwLCAwKTtcbiAgICByZWFkbGluZS5jbGVhclNjcmVlbkRvd24ocHJvY2Vzcy5zdGRvdXQpO1xufVxuZnVuY3Rpb24gY3JlYXRlTG9nZ2VyKGxldmVsID0gJ2luZm8nLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAob3B0aW9ucy5jdXN0b21Mb2dnZXIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY3VzdG9tTG9nZ2VyO1xuICAgIH1cbiAgICBjb25zdCBsb2dnZWRFcnJvcnMgPSBuZXcgV2Vha1NldCgpO1xuICAgIGNvbnN0IHsgcHJlZml4ID0gJ1t2aXRlXScsIGFsbG93Q2xlYXJTY3JlZW4gPSB0cnVlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHRocmVzaCA9IExvZ0xldmVsc1tsZXZlbF07XG4gICAgY29uc3QgY2FuQ2xlYXJTY3JlZW4gPSBhbGxvd0NsZWFyU2NyZWVuICYmIHByb2Nlc3Muc3Rkb3V0LmlzVFRZICYmICFwcm9jZXNzLmVudi5DSTtcbiAgICBjb25zdCBjbGVhciA9IGNhbkNsZWFyU2NyZWVuID8gY2xlYXJTY3JlZW4gOiAoKSA9PiB7IH07XG4gICAgZnVuY3Rpb24gb3V0cHV0KHR5cGUsIG1zZywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aHJlc2ggPj0gTG9nTGV2ZWxzW3R5cGVdKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRob2QgPSB0eXBlID09PSAnaW5mbycgPyAnbG9nJyA6IHR5cGU7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudGltZXN0YW1wKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IHR5cGUgPT09ICdpbmZvJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBwaWNvY29sb3JzRXhwb3J0cy5jeWFuKHBpY29jb2xvcnNFeHBvcnRzLmJvbGQocHJlZml4KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZSA9PT0gJ3dhcm4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwaWNvY29sb3JzRXhwb3J0cy55ZWxsb3cocGljb2NvbG9yc0V4cG9ydHMuYm9sZChwcmVmaXgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcGljb2NvbG9yc0V4cG9ydHMucmVkKHBpY29jb2xvcnNFeHBvcnRzLmJvbGQocHJlZml4KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtwaWNvY29sb3JzRXhwb3J0cy5kaW0obmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKSl9ICR7dGFnfSAke21zZ31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1zZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZWRFcnJvcnMuYWRkKG9wdGlvbnMuZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhbkNsZWFyU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IGxhc3RUeXBlICYmIG1zZyA9PT0gbGFzdE1zZykge1xuICAgICAgICAgICAgICAgICAgICBzYW1lQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZVttZXRob2RdKGZvcm1hdCgpLCBwaWNvY29sb3JzRXhwb3J0cy55ZWxsb3coYCh4JHtzYW1lQ291bnQgKyAxfSlgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzYW1lQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBsYXN0TXNnID0gbXNnO1xuICAgICAgICAgICAgICAgICAgICBsYXN0VHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsZWFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGVbbWV0aG9kXShmb3JtYXQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZVttZXRob2RdKGZvcm1hdCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB3YXJuZWRNZXNzYWdlcyA9IG5ldyBTZXQoKTtcbiAgICBjb25zdCBsb2dnZXIgPSB7XG4gICAgICAgIGhhc1dhcm5lZDogZmFsc2UsXG4gICAgICAgIGluZm8obXNnLCBvcHRzKSB7XG4gICAgICAgICAgICBvdXRwdXQoJ2luZm8nLCBtc2csIG9wdHMpO1xuICAgICAgICB9LFxuICAgICAgICB3YXJuKG1zZywgb3B0cykge1xuICAgICAgICAgICAgbG9nZ2VyLmhhc1dhcm5lZCA9IHRydWU7XG4gICAgICAgICAgICBvdXRwdXQoJ3dhcm4nLCBtc2csIG9wdHMpO1xuICAgICAgICB9LFxuICAgICAgICB3YXJuT25jZShtc2csIG9wdHMpIHtcbiAgICAgICAgICAgIGlmICh3YXJuZWRNZXNzYWdlcy5oYXMobXNnKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsb2dnZXIuaGFzV2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIG91dHB1dCgnd2FybicsIG1zZywgb3B0cyk7XG4gICAgICAgICAgICB3YXJuZWRNZXNzYWdlcy5hZGQobXNnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3IobXNnLCBvcHRzKSB7XG4gICAgICAgICAgICBsb2dnZXIuaGFzV2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIG91dHB1dCgnZXJyb3InLCBtc2csIG9wdHMpO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhclNjcmVlbih0eXBlKSB7XG4gICAgICAgICAgICBpZiAodGhyZXNoID49IExvZ0xldmVsc1t0eXBlXSkge1xuICAgICAgICAgICAgICAgIGNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGhhc0Vycm9yTG9nZ2VkKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VkRXJyb3JzLmhhcyhlcnJvcik7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gbG9nZ2VyO1xufVxuZnVuY3Rpb24gcHJpbnRTZXJ2ZXJVcmxzKHVybHMsIG9wdGlvbnNIb3N0LCBpbmZvKSB7XG4gICAgY29uc3QgY29sb3JVcmwgPSAodXJsKSA9PiBwaWNvY29sb3JzRXhwb3J0cy5jeWFuKHVybC5yZXBsYWNlKC86KFxcZCspXFwvLywgKF8sIHBvcnQpID0+IGA6JHtwaWNvY29sb3JzRXhwb3J0cy5ib2xkKHBvcnQpfS9gKSk7XG4gICAgZm9yIChjb25zdCB1cmwgb2YgdXJscy5sb2NhbCkge1xuICAgICAgICBpbmZvKGAgICR7cGljb2NvbG9yc0V4cG9ydHMuZ3JlZW4oJ1x1Mjc5QycpfSAgJHtwaWNvY29sb3JzRXhwb3J0cy5ib2xkKCdMb2NhbCcpfTogICAke2NvbG9yVXJsKHVybCl9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdXJsIG9mIHVybHMubmV0d29yaykge1xuICAgICAgICBpbmZvKGAgICR7cGljb2NvbG9yc0V4cG9ydHMuZ3JlZW4oJ1x1Mjc5QycpfSAgJHtwaWNvY29sb3JzRXhwb3J0cy5ib2xkKCdOZXR3b3JrJyl9OiAke2NvbG9yVXJsKHVybCl9YCk7XG4gICAgfVxuICAgIGlmICh1cmxzLm5ldHdvcmsubGVuZ3RoID09PSAwICYmIG9wdGlvbnNIb3N0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaW5mbyhwaWNvY29sb3JzRXhwb3J0cy5kaW0oYCAgJHtwaWNvY29sb3JzRXhwb3J0cy5ncmVlbignXHUyNzlDJyl9ICAke3BpY29jb2xvcnNFeHBvcnRzLmJvbGQoJ05ldHdvcmsnKX06IHVzZSBgKSArXG4gICAgICAgICAgICBwaWNvY29sb3JzRXhwb3J0cy5ib2xkKCctLWhvc3QnKSArXG4gICAgICAgICAgICBwaWNvY29sb3JzRXhwb3J0cy5kaW0oJyB0byBleHBvc2UnKSk7XG4gICAgfVxufVxuXG5jb25zdCBncm91cHMgPSBbXG4gICAgeyBuYW1lOiAnQXNzZXRzJywgY29sb3I6IHBpY29jb2xvcnNFeHBvcnRzLmdyZWVuIH0sXG4gICAgeyBuYW1lOiAnQ1NTJywgY29sb3I6IHBpY29jb2xvcnNFeHBvcnRzLm1hZ2VudGEgfSxcbiAgICB7IG5hbWU6ICdKUycsIGNvbG9yOiBwaWNvY29sb3JzRXhwb3J0cy5jeWFuIH0sXG5dO1xuZnVuY3Rpb24gYnVpbGRSZXBvcnRlclBsdWdpbihjb25maWcpIHtcbiAgICBjb25zdCBjb21wcmVzcyA9IHByb21pc2lmeSQ0KGd6aXApO1xuICAgIGNvbnN0IGNodW5rTGltaXQgPSBjb25maWcuYnVpbGQuY2h1bmtTaXplV2FybmluZ0xpbWl0O1xuICAgIGNvbnN0IHR0eSA9IHByb2Nlc3Muc3Rkb3V0LmlzVFRZICYmICFwcm9jZXNzLmVudi5DSTtcbiAgICBjb25zdCBzaG91bGRMb2dJbmZvID0gTG9nTGV2ZWxzW2NvbmZpZy5sb2dMZXZlbCB8fCAnaW5mbyddID49IExvZ0xldmVscy5pbmZvO1xuICAgIGxldCBoYXNUcmFuc2Zvcm1lZCA9IGZhbHNlO1xuICAgIGxldCBoYXNSZW5kZXJlZENodW5rID0gZmFsc2U7XG4gICAgbGV0IGhhc0NvbXByZXNzQ2h1bmsgPSBmYWxzZTtcbiAgICBsZXQgdHJhbnNmb3JtZWRDb3VudCA9IDA7XG4gICAgbGV0IGNodW5rQ291bnQgPSAwO1xuICAgIGxldCBjb21wcmVzc2VkQ291bnQgPSAwO1xuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGFzeW5jIGZ1bmN0aW9uIGdldENvbXByZXNzZWRTaXplKGNvZGUpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5idWlsZC5zc3IgfHwgIWNvbmZpZy5idWlsZC5yZXBvcnRDb21wcmVzc2VkU2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZExvZ0luZm8gJiYgIWhhc0NvbXByZXNzQ2h1bmspIHtcbiAgICAgICAgICAgIGlmICghdHR5KSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5pbmZvKCdjb21wdXRpbmcgZ3ppcCBzaXplLi4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cml0ZUxpbmUoJ2NvbXB1dGluZyBnemlwIHNpemUgKDApLi4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYXNDb21wcmVzc0NodW5rID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgY29tcHJlc3ModHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnID8gY29kZSA6IEJ1ZmZlci5mcm9tKGNvZGUpKTtcbiAgICAgICAgY29tcHJlc3NlZENvdW50Kys7XG4gICAgICAgIGlmIChzaG91bGRMb2dJbmZvICYmIHR0eSkge1xuICAgICAgICAgICAgd3JpdGVMaW5lKGBjb21wdXRpbmcgZ3ppcCBzaXplICgke2NvbXByZXNzZWRDb3VudH0pLi4uYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXByZXNzZWQubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBsb2dUcmFuc2Zvcm0gPSB0aHJvdHRsZSgoaWQpID0+IHtcbiAgICAgICAgd3JpdGVMaW5lKGB0cmFuc2Zvcm1pbmcgKCR7dHJhbnNmb3JtZWRDb3VudH0pICR7cGljb2NvbG9yc0V4cG9ydHMuZGltKHBhdGgkby5yZWxhdGl2ZShjb25maWcucm9vdCwgaWQpKX1gKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTpyZXBvcnRlcicsXG4gICAgICAgIHRyYW5zZm9ybShfLCBpZCkge1xuICAgICAgICAgICAgdHJhbnNmb3JtZWRDb3VudCsrO1xuICAgICAgICAgICAgaWYgKHNob3VsZExvZ0luZm8pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXR0eSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1RyYW5zZm9ybWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLmluZm8oYHRyYW5zZm9ybWluZy4uLmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaWQuaW5jbHVkZXMoYD9gKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgbG9nVHJhbnNmb3JtKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFzVHJhbnNmb3JtZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMoKSB7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9LFxuICAgICAgICBidWlsZEVuZCgpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRMb2dJbmZvKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR0eSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC5jbGVhckxpbmUoMCk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LmN1cnNvclRvKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLmluZm8oYCR7cGljb2NvbG9yc0V4cG9ydHMuZ3JlZW4oYFx1MjcxM2ApfSAke3RyYW5zZm9ybWVkQ291bnR9IG1vZHVsZXMgdHJhbnNmb3JtZWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlbmRlclN0YXJ0KCkge1xuICAgICAgICAgICAgY2h1bmtDb3VudCA9IDA7XG4gICAgICAgICAgICBjb21wcmVzc2VkQ291bnQgPSAwO1xuICAgICAgICB9LFxuICAgICAgICByZW5kZXJDaHVuaygpIHtcbiAgICAgICAgICAgIGNodW5rQ291bnQrKztcbiAgICAgICAgICAgIGlmIChzaG91bGRMb2dJbmZvKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0dHkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNSZW5kZXJlZENodW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLmluZm8oJ3JlbmRlcmluZyBjaHVua3MuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVMaW5lKGByZW5kZXJpbmcgY2h1bmtzICgke2NodW5rQ291bnR9KS4uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYXNSZW5kZXJlZENodW5rID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBnZW5lcmF0ZUJ1bmRsZSgpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRMb2dJbmZvICYmIHR0eSlcbiAgICAgICAgICAgICAgICBjbGVhckxpbmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgd3JpdGVCdW5kbGUoeyBkaXI6IG91dERpciB9LCBvdXRwdXQpIHtcbiAgICAgICAgICAgIGxldCBoYXNMYXJnZUNodW5rcyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHNob3VsZExvZ0luZm8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gKGF3YWl0IFByb21pc2UuYWxsKE9iamVjdC52YWx1ZXMob3V0cHV0KS5tYXAoYXN5bmMgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaHVuay50eXBlID09PSAnY2h1bmsnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNodW5rLmZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnSlMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IGNodW5rLmNvZGUubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRTaXplOiBhd2FpdCBnZXRDb21wcmVzc2VkU2l6ZShjaHVuay5jb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBTaXplOiBjaHVuay5tYXAgPyBjaHVuay5tYXAudG9TdHJpbmcoKS5sZW5ndGggOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVuay5maWxlTmFtZS5lbmRzV2l0aCgnLm1hcCcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDU1MgPSBjaHVuay5maWxlTmFtZS5lbmRzV2l0aCgnLmNzcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjaHVuay5maWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cDogaXNDU1MgPyAnQ1NTJyA6ICdBc3NldHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IGNodW5rLnNvdXJjZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwU2l6ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkU2l6ZTogaXNDU1NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBnZXRDb21wcmVzc2VkU2l6ZShjaHVuay5zb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSkpLmZpbHRlcihpc0RlZmluZWQpO1xuICAgICAgICAgICAgICAgIGlmICh0dHkpXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyTGluZSgpO1xuICAgICAgICAgICAgICAgIGxldCBsb25nZXN0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgYmlnZ2VzdFNpemUgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBiaWdnZXN0TWFwID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgYmlnZ2VzdENvbXByZXNzU2l6ZSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5uYW1lLmxlbmd0aCA+IGxvbmdlc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICBsb25nZXN0ID0gZW50cnkubmFtZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zaXplID4gYmlnZ2VzdFNpemUpXG4gICAgICAgICAgICAgICAgICAgICAgICBiaWdnZXN0U2l6ZSA9IGVudHJ5LnNpemU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5tYXBTaXplICYmIGVudHJ5Lm1hcFNpemUgPiBiaWdnZXN0TWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaWdnZXN0TWFwID0gZW50cnkubWFwU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuY29tcHJlc3NlZFNpemUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNvbXByZXNzZWRTaXplID4gYmlnZ2VzdENvbXByZXNzU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmlnZ2VzdENvbXByZXNzU2l6ZSA9IGVudHJ5LmNvbXByZXNzZWRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHNpemVQYWQgPSBkaXNwbGF5U2l6ZShiaWdnZXN0U2l6ZSkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcFBhZCA9IGRpc3BsYXlTaXplKGJpZ2dlc3RNYXApLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wcmVzc1BhZCA9IGRpc3BsYXlTaXplKGJpZ2dlc3RDb21wcmVzc1NpemUpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGl2ZU91dERpciA9IG5vcm1hbGl6ZVBhdGgkMyhwYXRoJG8ucmVsYXRpdmUoY29uZmlnLnJvb3QsIHBhdGgkby5yZXNvbHZlKGNvbmZpZy5yb290LCBvdXREaXIgPz8gY29uZmlnLmJ1aWxkLm91dERpcikpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhc3NldHNEaXIgPSBwYXRoJG8uam9pbihjb25maWcuYnVpbGQuYXNzZXRzRGlyLCAnLycpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gZW50cmllcy5maWx0ZXIoKGUpID0+IGUuZ3JvdXAgPT09IGdyb3VwLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbHRlcmVkLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZpbHRlcmVkLnNvcnQoKGEsIHopID0+IGEuc2l6ZSAtIHouc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTGFyZ2UgPSBncm91cC5uYW1lID09PSAnSlMnICYmIGVudHJ5LnNpemUgLyAxMDAwID4gY2h1bmtMaW1pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0xhcmdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xhcmdlQ2h1bmtzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVDb2xvciA9IGlzTGFyZ2UgPyBwaWNvY29sb3JzRXhwb3J0cy55ZWxsb3cgOiBwaWNvY29sb3JzRXhwb3J0cy5kaW07XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbG9nID0gcGljb2NvbG9yc0V4cG9ydHMuZGltKHJlbGF0aXZlT3V0RGlyICsgJy8nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyArPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjb25maWcuYnVpbGQubGliICYmIGVudHJ5Lm5hbWUuc3RhcnRzV2l0aChhc3NldHNEaXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGljb2NvbG9yc0V4cG9ydHMuZGltKGFzc2V0c0RpcikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAuY29sb3IoZW50cnkubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShhc3NldHNEaXIubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYWRFbmQobG9uZ2VzdCArIDIgLSBhc3NldHNEaXIubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBncm91cC5jb2xvcihlbnRyeS5uYW1lLnBhZEVuZChsb25nZXN0ICsgMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nICs9IHBpY29jb2xvcnNFeHBvcnRzLmJvbGQoc2l6ZUNvbG9yKGRpc3BsYXlTaXplKGVudHJ5LnNpemUpLnBhZFN0YXJ0KHNpemVQYWQpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuY29tcHJlc3NlZFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cgKz0gcGljb2NvbG9yc0V4cG9ydHMuZGltKGAgXHUyNTAyIGd6aXA6ICR7ZGlzcGxheVNpemUoZW50cnkuY29tcHJlc3NlZFNpemUpLnBhZFN0YXJ0KGNvbXByZXNzUGFkKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5tYXBTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nICs9IHBpY29jb2xvcnNFeHBvcnRzLmRpbShgIFx1MjUwMiBtYXA6ICR7ZGlzcGxheVNpemUoZW50cnkubWFwU2l6ZSkucGFkU3RhcnQobWFwUGFkKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIuaW5mbyhsb2cpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFzTGFyZ2VDaHVua3MgPSBPYmplY3QudmFsdWVzKG91dHB1dCkuc29tZSgoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNodW5rLnR5cGUgPT09ICdjaHVuaycgJiYgY2h1bmsuY29kZS5sZW5ndGggLyAxMDAwID4gY2h1bmtMaW1pdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNMYXJnZUNodW5rcyAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5idWlsZC5taW5pZnkgJiZcbiAgICAgICAgICAgICAgICAhY29uZmlnLmJ1aWxkLmxpYiAmJlxuICAgICAgICAgICAgICAgICFjb25maWcuYnVpbGQuc3NyKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmxvZ2dlci53YXJuKHBpY29jb2xvcnNFeHBvcnRzLnllbGxvdyhgXFxuKCEpIFNvbWUgY2h1bmtzIGFyZSBsYXJnZXIgdGhhbiAke2NodW5rTGltaXR9IGtCcyBhZnRlciBtaW5pZmljYXRpb24uIENvbnNpZGVyOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgLSBVc2luZyBkeW5hbWljIGltcG9ydCgpIHRvIGNvZGUtc3BsaXQgdGhlIGFwcGxpY2F0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAtIFVzZSBidWlsZC5yb2xsdXBPcHRpb25zLm91dHB1dC5tYW51YWxDaHVua3MgdG8gaW1wcm92ZSBjaHVua2luZzogaHR0cHM6Ly9yb2xsdXBqcy5vcmcvY29uZmlndXJhdGlvbi1vcHRpb25zLyNvdXRwdXQtbWFudWFsY2h1bmtzXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAtIEFkanVzdCBjaHVuayBzaXplIGxpbWl0IGZvciB0aGlzIHdhcm5pbmcgdmlhIGJ1aWxkLmNodW5rU2l6ZVdhcm5pbmdMaW1pdC5gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlQnVuZGxlKCkge1xuICAgICAgICAgICAgaWYgKHNob3VsZExvZ0luZm8gJiYgIWNvbmZpZy5idWlsZC53YXRjaCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIuaW5mbyhgJHtwaWNvY29sb3JzRXhwb3J0cy5ncmVlbihgXHUyNzEzYCl9IGJ1aWx0IGluICR7ZGlzcGxheVRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHdyaXRlTGluZShvdXRwdXQpIHtcbiAgICBjbGVhckxpbmUoKTtcbiAgICBpZiAob3V0cHV0Lmxlbmd0aCA8IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMpIHtcbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0cHV0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dC5zdWJzdHJpbmcoMCwgcHJvY2Vzcy5zdGRvdXQuY29sdW1ucyAtIDEpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbGVhckxpbmUoKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQuY2xlYXJMaW5lKDApO1xuICAgIHByb2Nlc3Muc3Rkb3V0LmN1cnNvclRvKDApO1xufVxuZnVuY3Rpb24gdGhyb3R0bGUoZm4pIHtcbiAgICBsZXQgdGltZXJIYW5kbGUgPSBudWxsO1xuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgICBpZiAodGltZXJIYW5kbGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgICB0aW1lckhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGltZXJIYW5kbGUgPSBudWxsO1xuICAgICAgICB9LCAxMDApO1xuICAgIH07XG59XG5mdW5jdGlvbiBkaXNwbGF5U2l6ZShieXRlcykge1xuICAgIHJldHVybiBgJHsoYnl0ZXMgLyAxMDAwKS50b0xvY2FsZVN0cmluZygnZW4nLCB7XG4gICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMixcbiAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAyLFxuICAgIH0pfSBrQmA7XG59XG5mdW5jdGlvbiBkaXNwbGF5VGltZSh0aW1lKSB7XG4gICAgLy8gZGlzcGxheToge1h9bXNcbiAgICBpZiAodGltZSA8IDEwMDApIHtcbiAgICAgICAgcmV0dXJuIGAke3RpbWV9bXNgO1xuICAgIH1cbiAgICB0aW1lID0gdGltZSAvIDEwMDA7XG4gICAgLy8gZGlzcGxheToge1h9c1xuICAgIGlmICh0aW1lIDwgNjApIHtcbiAgICAgICAgcmV0dXJuIGAke3RpbWUudG9GaXhlZCgyKX1zYDtcbiAgICB9XG4gICAgY29uc3QgbWlucyA9IHBhcnNlSW50KCh0aW1lIC8gNjApLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IHNlY29uZHMgPSB0aW1lICUgNjA7XG4gICAgLy8gZGlzcGxheToge1h9bSB7WX1zXG4gICAgcmV0dXJuIGAke21pbnN9bSR7c2Vjb25kcyA8IDEgPyAnJyA6IGAgJHtzZWNvbmRzLnRvRml4ZWQoMCl9c2B9YDtcbn1cblxuLy8gc3JjL2ZpbmQudHNcbmFzeW5jIGZ1bmN0aW9uIGZpbmQoZmlsZW5hbWUsIG9wdGlvbnMpIHtcbiAgbGV0IGRpciA9IHJlcXVpcmUkJDAkNC5kaXJuYW1lKHJlcXVpcmUkJDAkNC5yZXNvbHZlKGZpbGVuYW1lKSk7XG4gIGNvbnN0IHJvb3QgPSAob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5yb290KSA/IHJlcXVpcmUkJDAkNC5yZXNvbHZlKG9wdGlvbnMucm9vdCkgOiBudWxsO1xuICB3aGlsZSAoZGlyKSB7XG4gICAgY29uc3QgdHNjb25maWcgPSBhd2FpdCB0c2NvbmZpZ0luRGlyKGRpciwgb3B0aW9ucyk7XG4gICAgaWYgKHRzY29uZmlnKSB7XG4gICAgICByZXR1cm4gdHNjb25maWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb290ID09PSBkaXIpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnQgPSByZXF1aXJlJCQwJDQuZGlybmFtZShkaXIpO1xuICAgICAgaWYgKHBhcmVudCA9PT0gZGlyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyID0gcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYG5vIHRzY29uZmlnIGZpbGUgZm91bmQgZm9yICR7ZmlsZW5hbWV9YCk7XG59XG5hc3luYyBmdW5jdGlvbiB0c2NvbmZpZ0luRGlyKGRpciwgb3B0aW9ucykge1xuICBjb25zdCB0c2NvbmZpZyA9IHJlcXVpcmUkJDAkNC5qb2luKGRpciwgXCJ0c2NvbmZpZy5qc29uXCIpO1xuICBpZiAob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy50c0NvbmZpZ1BhdGhzKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMudHNDb25maWdQYXRocy5oYXModHNjb25maWcpID8gdHNjb25maWcgOiB2b2lkIDA7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgcHJvbWlzZXMkMS5zdGF0KHRzY29uZmlnKTtcbiAgICBpZiAoc3RhdC5pc0ZpbGUoKSB8fCBzdGF0LmlzRklGTygpKSB7XG4gICAgICByZXR1cm4gdHNjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUuY29kZSAhPT0gXCJFTk9FTlRcIikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGZpbmRBbGwoZGlyLCBvcHRpb25zKSB7XG4gIGNvbnN0IGZpbGVzID0gW107XG4gIGZvciBhd2FpdCAoY29uc3QgdHNjb25maWdGaWxlIG9mIGZpbmRUU0NvbmZpZyhyZXF1aXJlJCQwJDQucmVzb2x2ZShkaXIpLCBvcHRpb25zKSkge1xuICAgIGZpbGVzLnB1c2godHNjb25maWdGaWxlKTtcbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG5hc3luYyBmdW5jdGlvbiogZmluZFRTQ29uZmlnKGRpciwgb3B0aW9ucywgdmlzaXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpIHtcbiAgaWYgKCF2aXNpdGVkLmhhcyhkaXIpKSB7XG4gICAgdmlzaXRlZC5hZGQoZGlyKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IHByb21pc2VzJDEucmVhZGRpcihkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmICghKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuc2tpcCkgfHwgIW9wdGlvbnMuc2tpcChkaXJlbnQubmFtZSkpKSB7XG4gICAgICAgICAgeWllbGQqIGZpbmRUU0NvbmZpZyhyZXF1aXJlJCQwJDQucmVzb2x2ZShkaXIsIGRpcmVudC5uYW1lKSwgb3B0aW9ucywgdmlzaXRlZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lID09PSBcInRzY29uZmlnLmpzb25cIikge1xuICAgICAgICAgIHlpZWxkIHJlcXVpcmUkJDAkNC5yZXNvbHZlKGRpciwgZGlyZW50Lm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gXCJFQUNDRVNcIiB8fCBlLmNvZGUgPT09IFwiRU5PRU5UXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cblxuLy8gc3JjL3RvLWpzb24udHNcbmZ1bmN0aW9uIHRvSnNvbih0c2NvbmZpZ0pzb24pIHtcbiAgY29uc3Qgc3RyaXBwZWQgPSBzdHJpcERhbmdsaW5nQ29tbWEoc3RyaXBKc29uQ29tbWVudHMoc3RyaXBCb20odHNjb25maWdKc29uKSkpO1xuICBpZiAoc3RyaXBwZWQudHJpbSgpID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFwie31cIjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyaXBwZWQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHN0cmlwRGFuZ2xpbmdDb21tYShwc2V1ZG9Kc29uKSB7XG4gIGxldCBpbnNpZGVTdHJpbmcgPSBmYWxzZTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGxldCByZXN1bHQgPSBcIlwiO1xuICBsZXQgZGFuZ2xpbmdDb21tYVBvcyA9IG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHNldWRvSnNvbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnRDaGFyYWN0ZXIgPSBwc2V1ZG9Kc29uW2ldO1xuICAgIGlmIChjdXJyZW50Q2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBjb25zdCBlc2NhcGVkID0gaXNFc2NhcGVkKHBzZXVkb0pzb24sIGkpO1xuICAgICAgaWYgKCFlc2NhcGVkKSB7XG4gICAgICAgIGluc2lkZVN0cmluZyA9ICFpbnNpZGVTdHJpbmc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnNpZGVTdHJpbmcpIHtcbiAgICAgIGRhbmdsaW5nQ29tbWFQb3MgPSBudWxsO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjdXJyZW50Q2hhcmFjdGVyID09PSBcIixcIikge1xuICAgICAgZGFuZ2xpbmdDb21tYVBvcyA9IGk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGRhbmdsaW5nQ29tbWFQb3MpIHtcbiAgICAgIGlmIChjdXJyZW50Q2hhcmFjdGVyID09PSBcIn1cIiB8fCBjdXJyZW50Q2hhcmFjdGVyID09PSBcIl1cIikge1xuICAgICAgICByZXN1bHQgKz0gcHNldWRvSnNvbi5zbGljZShvZmZzZXQsIGRhbmdsaW5nQ29tbWFQb3MpICsgXCIgXCI7XG4gICAgICAgIG9mZnNldCA9IGRhbmdsaW5nQ29tbWFQb3MgKyAxO1xuICAgICAgICBkYW5nbGluZ0NvbW1hUG9zID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoIWN1cnJlbnRDaGFyYWN0ZXIubWF0Y2goL1xccy8pKSB7XG4gICAgICAgIGRhbmdsaW5nQ29tbWFQb3MgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0ICsgcHNldWRvSnNvbi5zdWJzdHJpbmcob2Zmc2V0KTtcbn1cbmZ1bmN0aW9uIGlzRXNjYXBlZChqc29uU3RyaW5nLCBxdW90ZVBvc2l0aW9uKSB7XG4gIGxldCBpbmRleCA9IHF1b3RlUG9zaXRpb24gLSAxO1xuICBsZXQgYmFja3NsYXNoQ291bnQgPSAwO1xuICB3aGlsZSAoanNvblN0cmluZ1tpbmRleF0gPT09IFwiXFxcXFwiKSB7XG4gICAgaW5kZXggLT0gMTtcbiAgICBiYWNrc2xhc2hDb3VudCArPSAxO1xuICB9XG4gIHJldHVybiBCb29sZWFuKGJhY2tzbGFzaENvdW50ICUgMik7XG59XG5mdW5jdGlvbiBzdHJpcChzdHJpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIHN0cmluZy5zbGljZShzdGFydCwgZW5kKS5yZXBsYWNlKC9cXFMvZywgXCIgXCIpO1xufVxudmFyIHNpbmdsZUNvbW1lbnQgPSBTeW1ib2woXCJzaW5nbGVDb21tZW50XCIpO1xudmFyIG11bHRpQ29tbWVudCA9IFN5bWJvbChcIm11bHRpQ29tbWVudFwiKTtcbmZ1bmN0aW9uIHN0cmlwSnNvbkNvbW1lbnRzKGpzb25TdHJpbmcpIHtcbiAgbGV0IGlzSW5zaWRlU3RyaW5nID0gZmFsc2U7XG4gIGxldCBpc0luc2lkZUNvbW1lbnQgPSBmYWxzZTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGxldCByZXN1bHQgPSBcIlwiO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwganNvblN0cmluZy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjdXJyZW50Q2hhcmFjdGVyID0ganNvblN0cmluZ1tpbmRleF07XG4gICAgY29uc3QgbmV4dENoYXJhY3RlciA9IGpzb25TdHJpbmdbaW5kZXggKyAxXTtcbiAgICBpZiAoIWlzSW5zaWRlQ29tbWVudCAmJiBjdXJyZW50Q2hhcmFjdGVyID09PSAnXCInKSB7XG4gICAgICBjb25zdCBlc2NhcGVkID0gaXNFc2NhcGVkKGpzb25TdHJpbmcsIGluZGV4KTtcbiAgICAgIGlmICghZXNjYXBlZCkge1xuICAgICAgICBpc0luc2lkZVN0cmluZyA9ICFpc0luc2lkZVN0cmluZztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzSW5zaWRlU3RyaW5nKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFpc0luc2lkZUNvbW1lbnQgJiYgY3VycmVudENoYXJhY3RlciArIG5leHRDaGFyYWN0ZXIgPT09IFwiLy9cIikge1xuICAgICAgcmVzdWx0ICs9IGpzb25TdHJpbmcuc2xpY2Uob2Zmc2V0LCBpbmRleCk7XG4gICAgICBvZmZzZXQgPSBpbmRleDtcbiAgICAgIGlzSW5zaWRlQ29tbWVudCA9IHNpbmdsZUNvbW1lbnQ7XG4gICAgICBpbmRleCsrO1xuICAgIH0gZWxzZSBpZiAoaXNJbnNpZGVDb21tZW50ID09PSBzaW5nbGVDb21tZW50ICYmIGN1cnJlbnRDaGFyYWN0ZXIgKyBuZXh0Q2hhcmFjdGVyID09PSBcIlxcclxcblwiKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgaXNJbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gICAgICByZXN1bHQgKz0gc3RyaXAoanNvblN0cmluZywgb2Zmc2V0LCBpbmRleCk7XG4gICAgICBvZmZzZXQgPSBpbmRleDtcbiAgICB9IGVsc2UgaWYgKGlzSW5zaWRlQ29tbWVudCA9PT0gc2luZ2xlQ29tbWVudCAmJiBjdXJyZW50Q2hhcmFjdGVyID09PSBcIlxcblwiKSB7XG4gICAgICBpc0luc2lkZUNvbW1lbnQgPSBmYWxzZTtcbiAgICAgIHJlc3VsdCArPSBzdHJpcChqc29uU3RyaW5nLCBvZmZzZXQsIGluZGV4KTtcbiAgICAgIG9mZnNldCA9IGluZGV4O1xuICAgIH0gZWxzZSBpZiAoIWlzSW5zaWRlQ29tbWVudCAmJiBjdXJyZW50Q2hhcmFjdGVyICsgbmV4dENoYXJhY3RlciA9PT0gXCIvKlwiKSB7XG4gICAgICByZXN1bHQgKz0ganNvblN0cmluZy5zbGljZShvZmZzZXQsIGluZGV4KTtcbiAgICAgIG9mZnNldCA9IGluZGV4O1xuICAgICAgaXNJbnNpZGVDb21tZW50ID0gbXVsdGlDb21tZW50O1xuICAgICAgaW5kZXgrKztcbiAgICB9IGVsc2UgaWYgKGlzSW5zaWRlQ29tbWVudCA9PT0gbXVsdGlDb21tZW50ICYmIGN1cnJlbnRDaGFyYWN0ZXIgKyBuZXh0Q2hhcmFjdGVyID09PSBcIiovXCIpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgICBpc0luc2lkZUNvbW1lbnQgPSBmYWxzZTtcbiAgICAgIHJlc3VsdCArPSBzdHJpcChqc29uU3RyaW5nLCBvZmZzZXQsIGluZGV4ICsgMSk7XG4gICAgICBvZmZzZXQgPSBpbmRleCArIDE7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQgKyAoaXNJbnNpZGVDb21tZW50ID8gc3RyaXAoanNvblN0cmluZy5zbGljZShvZmZzZXQpKSA6IGpzb25TdHJpbmcuc2xpY2Uob2Zmc2V0KSk7XG59XG5mdW5jdGlvbiBzdHJpcEJvbShzdHJpbmcpIHtcbiAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA2NTI3OSkge1xuICAgIHJldHVybiBzdHJpbmcuc2xpY2UoMSk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZztcbn1cbnZhciBQT1NJWF9TRVBfUkUgPSBuZXcgUmVnRXhwKFwiXFxcXFwiICsgcmVxdWlyZSQkMCQ0LnBvc2l4LnNlcCwgXCJnXCIpO1xudmFyIE5BVElWRV9TRVBfUkUgPSBuZXcgUmVnRXhwKFwiXFxcXFwiICsgcmVxdWlyZSQkMCQ0LnNlcCwgXCJnXCIpO1xudmFyIFBBVFRFUk5fUkVHRVhfQ0FDSEUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xudmFyIEdMT0JfQUxMX1BBVFRFUk4gPSBgKiovKmA7XG52YXIgREVGQVVMVF9FWFRFTlNJT05TID0gW1wiLnRzXCIsIFwiLnRzeFwiLCBcIi5tdHNcIiwgXCIuY3RzXCJdO1xudmFyIERFRkFVTFRfRVhURU5TSU9OU19SRV9HUk9VUCA9IGBcXFxcLig/OiR7REVGQVVMVF9FWFRFTlNJT05TLm1hcCgoZXh0KSA9PiBleHQuc3Vic3RyaW5nKDEpKS5qb2luKFxuICBcInxcIlxuKX0pYDtcbm5ldyBGdW5jdGlvbihcInBhdGhcIiwgXCJyZXR1cm4gaW1wb3J0KHBhdGgpLnRoZW4obSA9PiBtLmRlZmF1bHQpXCIpO1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVRTQ29uZmlnKGZpbGVuYW1lKSB7XG4gIGlmIChyZXF1aXJlJCQwJDQuZXh0bmFtZShmaWxlbmFtZSkgIT09IFwiLmpzb25cIikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0c2NvbmZpZyA9IHJlcXVpcmUkJDAkNC5yZXNvbHZlKGZpbGVuYW1lKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgcHJvbWlzZXMkMS5zdGF0KHRzY29uZmlnKTtcbiAgICBpZiAoc3RhdC5pc0ZpbGUoKSB8fCBzdGF0LmlzRklGTygpKSB7XG4gICAgICByZXR1cm4gdHNjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUuY29kZSAhPT0gXCJFTk9FTlRcIikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBubyB0c2NvbmZpZyBmaWxlIGZvdW5kIGZvciAke2ZpbGVuYW1lfWApO1xufVxuZnVuY3Rpb24gcG9zaXgybmF0aXZlKGZpbGVuYW1lKSB7XG4gIHJldHVybiByZXF1aXJlJCQwJDQucG9zaXguc2VwICE9PSByZXF1aXJlJCQwJDQuc2VwICYmIGZpbGVuYW1lLmluY2x1ZGVzKHJlcXVpcmUkJDAkNC5wb3NpeC5zZXApID8gZmlsZW5hbWUucmVwbGFjZShQT1NJWF9TRVBfUkUsIHJlcXVpcmUkJDAkNC5zZXApIDogZmlsZW5hbWU7XG59XG5mdW5jdGlvbiBuYXRpdmUycG9zaXgoZmlsZW5hbWUpIHtcbiAgcmV0dXJuIHJlcXVpcmUkJDAkNC5wb3NpeC5zZXAgIT09IHJlcXVpcmUkJDAkNC5zZXAgJiYgZmlsZW5hbWUuaW5jbHVkZXMocmVxdWlyZSQkMCQ0LnNlcCkgPyBmaWxlbmFtZS5yZXBsYWNlKE5BVElWRV9TRVBfUkUsIHJlcXVpcmUkJDAkNC5wb3NpeC5zZXApIDogZmlsZW5hbWU7XG59XG5mdW5jdGlvbiByZXNvbHZlMnBvc2l4KGRpciwgZmlsZW5hbWUpIHtcbiAgaWYgKHJlcXVpcmUkJDAkNC5zZXAgPT09IHJlcXVpcmUkJDAkNC5wb3NpeC5zZXApIHtcbiAgICByZXR1cm4gZGlyID8gcmVxdWlyZSQkMCQ0LnJlc29sdmUoZGlyLCBmaWxlbmFtZSkgOiByZXF1aXJlJCQwJDQucmVzb2x2ZShmaWxlbmFtZSk7XG4gIH1cbiAgcmV0dXJuIG5hdGl2ZTJwb3NpeChcbiAgICBkaXIgPyByZXF1aXJlJCQwJDQucmVzb2x2ZShwb3NpeDJuYXRpdmUoZGlyKSwgcG9zaXgybmF0aXZlKGZpbGVuYW1lKSkgOiByZXF1aXJlJCQwJDQucmVzb2x2ZShwb3NpeDJuYXRpdmUoZmlsZW5hbWUpKVxuICApO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVJlZmVyZW5jZWRUU0NvbmZpZ0ZpbGVzKHJlc3VsdCkge1xuICBjb25zdCBkaXIgPSByZXF1aXJlJCQwJDQuZGlybmFtZShyZXN1bHQudHNjb25maWdGaWxlKTtcbiAgcmV0dXJuIHJlc3VsdC50c2NvbmZpZy5yZWZlcmVuY2VzLm1hcCgocmVmKSA9PiB7XG4gICAgY29uc3QgcmVmUGF0aCA9IHJlZi5wYXRoLmVuZHNXaXRoKFwiLmpzb25cIikgPyByZWYucGF0aCA6IHJlcXVpcmUkJDAkNC5qb2luKHJlZi5wYXRoLCBcInRzY29uZmlnLmpzb25cIik7XG4gICAgcmV0dXJuIHJlc29sdmUycG9zaXgoZGlyLCByZWZQYXRoKTtcbiAgfSk7XG59XG5mdW5jdGlvbiByZXNvbHZlU29sdXRpb25UU0NvbmZpZyhmaWxlbmFtZSwgcmVzdWx0KSB7XG4gIGlmIChyZXN1bHQucmVmZXJlbmNlZCAmJiBERUZBVUxUX0VYVEVOU0lPTlMuc29tZSgoZXh0KSA9PiBmaWxlbmFtZS5lbmRzV2l0aChleHQpKSAmJiAhaXNJbmNsdWRlZChmaWxlbmFtZSwgcmVzdWx0KSkge1xuICAgIGNvbnN0IHNvbHV0aW9uVFNDb25maWcgPSByZXN1bHQucmVmZXJlbmNlZC5maW5kKFxuICAgICAgKHJlZmVyZW5jZWQpID0+IGlzSW5jbHVkZWQoZmlsZW5hbWUsIHJlZmVyZW5jZWQpXG4gICAgKTtcbiAgICBpZiAoc29sdXRpb25UU0NvbmZpZykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc29sdXRpb25UU0NvbmZpZyxcbiAgICAgICAgc29sdXRpb246IHJlc3VsdFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGlzSW5jbHVkZWQoZmlsZW5hbWUsIHJlc3VsdCkge1xuICBjb25zdCBkaXIgPSBuYXRpdmUycG9zaXgocmVxdWlyZSQkMCQ0LmRpcm5hbWUocmVzdWx0LnRzY29uZmlnRmlsZSkpO1xuICBjb25zdCBmaWxlcyA9IChyZXN1bHQudHNjb25maWcuZmlsZXMgfHwgW10pLm1hcCgoZmlsZSkgPT4gcmVzb2x2ZTJwb3NpeChkaXIsIGZpbGUpKTtcbiAgY29uc3QgYWJzb2x1dGVGaWxlbmFtZSA9IHJlc29sdmUycG9zaXgobnVsbCwgZmlsZW5hbWUpO1xuICBpZiAoZmlsZXMuaW5jbHVkZXMoZmlsZW5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgaXNJbmNsdWRlZDIgPSBpc0dsb2JNYXRjaChcbiAgICBhYnNvbHV0ZUZpbGVuYW1lLFxuICAgIGRpcixcbiAgICByZXN1bHQudHNjb25maWcuaW5jbHVkZSB8fCAocmVzdWx0LnRzY29uZmlnLmZpbGVzID8gW10gOiBbR0xPQl9BTExfUEFUVEVSTl0pXG4gICk7XG4gIGlmIChpc0luY2x1ZGVkMikge1xuICAgIGNvbnN0IGlzRXhjbHVkZWQgPSBpc0dsb2JNYXRjaChhYnNvbHV0ZUZpbGVuYW1lLCBkaXIsIHJlc3VsdC50c2NvbmZpZy5leGNsdWRlIHx8IFtdKTtcbiAgICByZXR1cm4gIWlzRXhjbHVkZWQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNHbG9iTWF0Y2goZmlsZW5hbWUsIGRpciwgcGF0dGVybnMpIHtcbiAgcmV0dXJuIHBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHtcbiAgICBsZXQgbGFzdFdpbGRjYXJkSW5kZXggPSBwYXR0ZXJuLmxlbmd0aDtcbiAgICBsZXQgaGFzV2lsZGNhcmQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gcGF0dGVybi5sZW5ndGggLSAxOyBpID4gLTE7IGktLSkge1xuICAgICAgaWYgKHBhdHRlcm5baV0gPT09IFwiKlwiIHx8IHBhdHRlcm5baV0gPT09IFwiP1wiKSB7XG4gICAgICAgIGxhc3RXaWxkY2FyZEluZGV4ID0gaTtcbiAgICAgICAgaGFzV2lsZGNhcmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxhc3RXaWxkY2FyZEluZGV4IDwgcGF0dGVybi5sZW5ndGggLSAxICYmICFmaWxlbmFtZS5lbmRzV2l0aChwYXR0ZXJuLnNsaWNlKGxhc3RXaWxkY2FyZEluZGV4ICsgMSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChwYXR0ZXJuLmVuZHNXaXRoKFwiKlwiKSAmJiAhREVGQVVMVF9FWFRFTlNJT05TLnNvbWUoKGV4dCkgPT4gZmlsZW5hbWUuZW5kc1dpdGgoZXh0KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHBhdHRlcm4gPT09IEdMT0JfQUxMX1BBVFRFUk4pIHtcbiAgICAgIHJldHVybiBmaWxlbmFtZS5zdGFydHNXaXRoKGAke2Rpcn0vYCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkUGF0dGVybiA9IHJlc29sdmUycG9zaXgoZGlyLCBwYXR0ZXJuKTtcbiAgICBsZXQgZmlyc3RXaWxkY2FyZEluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvbHZlZFBhdHRlcm4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZXNvbHZlZFBhdHRlcm5baV0gPT09IFwiKlwiIHx8IHJlc29sdmVkUGF0dGVybltpXSA9PT0gXCI/XCIpIHtcbiAgICAgICAgZmlyc3RXaWxkY2FyZEluZGV4ID0gaTtcbiAgICAgICAgaGFzV2lsZGNhcmQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpcnN0V2lsZGNhcmRJbmRleCA+IDEgJiYgIWZpbGVuYW1lLnN0YXJ0c1dpdGgocmVzb2x2ZWRQYXR0ZXJuLnNsaWNlKDAsIGZpcnN0V2lsZGNhcmRJbmRleCAtIDEpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWhhc1dpbGRjYXJkKSB7XG4gICAgICByZXR1cm4gZmlsZW5hbWUgPT09IHJlc29sdmVkUGF0dGVybjtcbiAgICB9XG4gICAgaWYgKFBBVFRFUk5fUkVHRVhfQ0FDSEUuaGFzKHJlc29sdmVkUGF0dGVybikpIHtcbiAgICAgIHJldHVybiBQQVRURVJOX1JFR0VYX0NBQ0hFLmdldChyZXNvbHZlZFBhdHRlcm4pLnRlc3QoZmlsZW5hbWUpO1xuICAgIH1cbiAgICBjb25zdCByZWdleCA9IHBhdHRlcm4ycmVnZXgocmVzb2x2ZWRQYXR0ZXJuKTtcbiAgICBQQVRURVJOX1JFR0VYX0NBQ0hFLnNldChyZXNvbHZlZFBhdHRlcm4sIHJlZ2V4KTtcbiAgICByZXR1cm4gcmVnZXgudGVzdChmaWxlbmFtZSk7XG4gIH0pO1xufVxuZnVuY3Rpb24gcGF0dGVybjJyZWdleChyZXNvbHZlZFBhdHRlcm4pIHtcbiAgbGV0IHJlZ2V4U3RyID0gXCJeXCI7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb2x2ZWRQYXR0ZXJuLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhciA9IHJlc29sdmVkUGF0dGVybltpXTtcbiAgICBpZiAoY2hhciA9PT0gXCI/XCIpIHtcbiAgICAgIHJlZ2V4U3RyICs9IFwiW15cXFxcL11cIjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCIqXCIpIHtcbiAgICAgIGlmIChyZXNvbHZlZFBhdHRlcm5baSArIDFdID09PSBcIipcIiAmJiByZXNvbHZlZFBhdHRlcm5baSArIDJdID09PSBcIi9cIikge1xuICAgICAgICBpICs9IDI7XG4gICAgICAgIHJlZ2V4U3RyICs9IFwiKD86W15cXFxcL10qXFxcXC8pKlwiO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlZ2V4U3RyICs9IFwiW15cXFxcL10qXCI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFwiLy4rXiR7fSgpfFtdXFxcXFwiLmluY2x1ZGVzKGNoYXIpKSB7XG4gICAgICByZWdleFN0ciArPSBgXFxcXGA7XG4gICAgfVxuICAgIHJlZ2V4U3RyICs9IGNoYXI7XG4gIH1cbiAgaWYgKHJlc29sdmVkUGF0dGVybi5lbmRzV2l0aChcIipcIikpIHtcbiAgICByZWdleFN0ciArPSBERUZBVUxUX0VYVEVOU0lPTlNfUkVfR1JPVVA7XG4gIH1cbiAgcmVnZXhTdHIgKz0gXCIkXCI7XG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4U3RyKTtcbn1cblxuLy8gc3JjL3BhcnNlLnRzXG5hc3luYyBmdW5jdGlvbiBwYXJzZSRmKGZpbGVuYW1lLCBvcHRpb25zKSB7XG4gIGNvbnN0IGNhY2hlID0gb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5jYWNoZTtcbiAgaWYgKGNhY2hlID09IG51bGwgPyB2b2lkIDAgOiBjYWNoZS5oYXMoZmlsZW5hbWUpKSB7XG4gICAgcmV0dXJuIGNhY2hlLmdldChmaWxlbmFtZSk7XG4gIH1cbiAgbGV0IHRzY29uZmlnRmlsZTtcbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMucmVzb2x2ZVdpdGhFbXB0eUlmQ29uZmlnTm90Rm91bmQpIHtcbiAgICB0cnkge1xuICAgICAgdHNjb25maWdGaWxlID0gYXdhaXQgcmVzb2x2ZVRTQ29uZmlnKGZpbGVuYW1lKSB8fCBhd2FpdCBmaW5kKGZpbGVuYW1lLCBvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBub3RGb3VuZFJlc3VsdCA9IHtcbiAgICAgICAgdHNjb25maWdGaWxlOiBcIm5vX3RzY29uZmlnX2ZpbGVfZm91bmRcIixcbiAgICAgICAgdHNjb25maWc6IHt9XG4gICAgICB9O1xuICAgICAgY2FjaGUgPT0gbnVsbCA/IHZvaWQgMCA6IGNhY2hlLnNldChmaWxlbmFtZSwgbm90Rm91bmRSZXN1bHQpO1xuICAgICAgcmV0dXJuIG5vdEZvdW5kUmVzdWx0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0c2NvbmZpZ0ZpbGUgPSBhd2FpdCByZXNvbHZlVFNDb25maWcoZmlsZW5hbWUpIHx8IGF3YWl0IGZpbmQoZmlsZW5hbWUsIG9wdGlvbnMpO1xuICB9XG4gIGxldCByZXN1bHQ7XG4gIGlmIChjYWNoZSA9PSBudWxsID8gdm9pZCAwIDogY2FjaGUuaGFzKHRzY29uZmlnRmlsZSkpIHtcbiAgICByZXN1bHQgPSBjYWNoZS5nZXQodHNjb25maWdGaWxlKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBhd2FpdCBwYXJzZUZpbGUkMSh0c2NvbmZpZ0ZpbGUsIGNhY2hlKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbcGFyc2VFeHRlbmRzKHJlc3VsdCwgY2FjaGUpLCBwYXJzZVJlZmVyZW5jZXMocmVzdWx0LCBjYWNoZSldKTtcbiAgICBjYWNoZSA9PSBudWxsID8gdm9pZCAwIDogY2FjaGUuc2V0KHRzY29uZmlnRmlsZSwgcmVzdWx0KTtcbiAgfVxuICByZXN1bHQgPSByZXNvbHZlU29sdXRpb25UU0NvbmZpZyhmaWxlbmFtZSwgcmVzdWx0KTtcbiAgY2FjaGUgPT0gbnVsbCA/IHZvaWQgMCA6IGNhY2hlLnNldChmaWxlbmFtZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlRmlsZSQxKHRzY29uZmlnRmlsZSwgY2FjaGUpIHtcbiAgaWYgKGNhY2hlID09IG51bGwgPyB2b2lkIDAgOiBjYWNoZS5oYXModHNjb25maWdGaWxlKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQodHNjb25maWdGaWxlKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHRzY29uZmlnSnNvbiA9IGF3YWl0IHByb21pc2VzJDEucmVhZEZpbGUodHNjb25maWdGaWxlLCBcInV0Zi04XCIpO1xuICAgIGNvbnN0IGpzb24gPSB0b0pzb24odHNjb25maWdKc29uKTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICB0c2NvbmZpZ0ZpbGUsXG4gICAgICB0c2NvbmZpZzogbm9ybWFsaXplVFNDb25maWcoSlNPTi5wYXJzZShqc29uKSwgcmVxdWlyZSQkMCQ0LmRpcm5hbWUodHNjb25maWdGaWxlKSlcbiAgICB9O1xuICAgIGNhY2hlID09IG51bGwgPyB2b2lkIDAgOiBjYWNoZS5zZXQodHNjb25maWdGaWxlLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgVFNDb25mY2tQYXJzZUVycm9yKFxuICAgICAgYHBhcnNpbmcgJHt0c2NvbmZpZ0ZpbGV9IGZhaWxlZDogJHtlfWAsXG4gICAgICBcIlBBUlNFX0ZJTEVcIixcbiAgICAgIHRzY29uZmlnRmlsZSxcbiAgICAgIGVcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVUU0NvbmZpZyh0c2NvbmZpZywgZGlyKSB7XG4gIHZhciBfYTtcbiAgaWYgKCgoX2EgPSB0c2NvbmZpZy5jb21waWxlck9wdGlvbnMpID09IG51bGwgPyB2b2lkIDAgOiBfYS5iYXNlVXJsKSAmJiAhcmVxdWlyZSQkMCQ0LmlzQWJzb2x1dGUodHNjb25maWcuY29tcGlsZXJPcHRpb25zLmJhc2VVcmwpKSB7XG4gICAgdHNjb25maWcuY29tcGlsZXJPcHRpb25zLmJhc2VVcmwgPSByZXNvbHZlMnBvc2l4KGRpciwgdHNjb25maWcuY29tcGlsZXJPcHRpb25zLmJhc2VVcmwpO1xuICB9XG4gIHJldHVybiB0c2NvbmZpZztcbn1cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlUmVmZXJlbmNlcyhyZXN1bHQsIGNhY2hlKSB7XG4gIGlmICghcmVzdWx0LnRzY29uZmlnLnJlZmVyZW5jZXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcmVmZXJlbmNlZEZpbGVzID0gcmVzb2x2ZVJlZmVyZW5jZWRUU0NvbmZpZ0ZpbGVzKHJlc3VsdCk7XG4gIGNvbnN0IHJlZmVyZW5jZWQgPSBhd2FpdCBQcm9taXNlLmFsbChyZWZlcmVuY2VkRmlsZXMubWFwKChmaWxlKSA9PiBwYXJzZUZpbGUkMShmaWxlLCBjYWNoZSkpKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwocmVmZXJlbmNlZC5tYXAoKHJlZikgPT4gcGFyc2VFeHRlbmRzKHJlZiwgY2FjaGUpKSk7XG4gIHJlc3VsdC5yZWZlcmVuY2VkID0gcmVmZXJlbmNlZDtcbn1cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlRXh0ZW5kcyhyZXN1bHQsIGNhY2hlKSB7XG4gIGlmICghcmVzdWx0LnRzY29uZmlnLmV4dGVuZHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZXh0ZW5kZWQgPSBbXG4gICAgeyB0c2NvbmZpZ0ZpbGU6IHJlc3VsdC50c2NvbmZpZ0ZpbGUsIHRzY29uZmlnOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc3VsdC50c2NvbmZpZykpIH1cbiAgXTtcbiAgbGV0IHBvcyA9IDA7XG4gIGNvbnN0IGV4dGVuZHNQYXRoID0gW107XG4gIGxldCBjdXJyZW50QnJhbmNoRGVwdGggPSAwO1xuICB3aGlsZSAocG9zIDwgZXh0ZW5kZWQubGVuZ3RoKSB7XG4gICAgY29uc3QgZXh0ZW5kaW5nID0gZXh0ZW5kZWRbcG9zXTtcbiAgICBleHRlbmRzUGF0aC5wdXNoKGV4dGVuZGluZy50c2NvbmZpZ0ZpbGUpO1xuICAgIGlmIChleHRlbmRpbmcudHNjb25maWcuZXh0ZW5kcykge1xuICAgICAgY3VycmVudEJyYW5jaERlcHRoICs9IDE7XG4gICAgICBsZXQgcmVzb2x2ZWRFeHRlbmRzO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGV4dGVuZGluZy50c2NvbmZpZy5leHRlbmRzKSkge1xuICAgICAgICByZXNvbHZlZEV4dGVuZHMgPSBbcmVzb2x2ZUV4dGVuZHMoZXh0ZW5kaW5nLnRzY29uZmlnLmV4dGVuZHMsIGV4dGVuZGluZy50c2NvbmZpZ0ZpbGUpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmVkRXh0ZW5kcyA9IGV4dGVuZGluZy50c2NvbmZpZy5leHRlbmRzLnJldmVyc2UoKS5tYXAoKGV4KSA9PiByZXNvbHZlRXh0ZW5kcyhleCwgZXh0ZW5kaW5nLnRzY29uZmlnRmlsZSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2lyY3VsYXJFeHRlbmRzID0gcmVzb2x2ZWRFeHRlbmRzLmZpbmQoXG4gICAgICAgICh0c2NvbmZpZ0ZpbGUpID0+IGV4dGVuZHNQYXRoLmluY2x1ZGVzKHRzY29uZmlnRmlsZSlcbiAgICAgICk7XG4gICAgICBpZiAoY2lyY3VsYXJFeHRlbmRzKSB7XG4gICAgICAgIGNvbnN0IGNpcmNsZSA9IGV4dGVuZHNQYXRoLmNvbmNhdChbY2lyY3VsYXJFeHRlbmRzXSkuam9pbihcIiAtPiBcIik7XG4gICAgICAgIHRocm93IG5ldyBUU0NvbmZja1BhcnNlRXJyb3IoXG4gICAgICAgICAgYENpcmN1bGFyIGRlcGVuZGVuY3kgaW4gXCJleHRlbmRzXCI6ICR7Y2lyY2xlfWAsXG4gICAgICAgICAgXCJFWFRFTkRTX0NJUkNVTEFSXCIsXG4gICAgICAgICAgcmVzdWx0LnRzY29uZmlnRmlsZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZXh0ZW5kZWQuc3BsaWNlKFxuICAgICAgICBwb3MgKyAxLFxuICAgICAgICAwLFxuICAgICAgICAuLi5hd2FpdCBQcm9taXNlLmFsbChyZXNvbHZlZEV4dGVuZHMubWFwKChmaWxlKSA9PiBwYXJzZUZpbGUkMShmaWxlLCBjYWNoZSkpKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXh0ZW5kc1BhdGguc3BsaWNlKC1jdXJyZW50QnJhbmNoRGVwdGgpO1xuICAgICAgY3VycmVudEJyYW5jaERlcHRoID0gMDtcbiAgICB9XG4gICAgcG9zID0gcG9zICsgMTtcbiAgfVxuICByZXN1bHQuZXh0ZW5kZWQgPSBleHRlbmRlZDtcbiAgZm9yIChjb25zdCBleHQgb2YgcmVzdWx0LmV4dGVuZGVkLnNsaWNlKDEpKSB7XG4gICAgZXh0ZW5kVFNDb25maWcocmVzdWx0LCBleHQpO1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlRXh0ZW5kcyhleHRlbmRlZCwgZnJvbSkge1xuICBsZXQgZXJyb3I7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJlcXVpcmUkMihmcm9tKS5yZXNvbHZlKGV4dGVuZGVkKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yID0gZTtcbiAgfVxuICBpZiAoIXJlcXVpcmUkJDAkNC5pc0Fic29sdXRlKGV4dGVuZGVkKSAmJiAhZXh0ZW5kZWQuc3RhcnRzV2l0aChcIi4vXCIpICYmICFleHRlbmRlZC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrRXh0ZW5kZWQgPSByZXF1aXJlJCQwJDQuam9pbihleHRlbmRlZCwgXCJ0c2NvbmZpZy5qc29uXCIpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVpcmUkMihmcm9tKS5yZXNvbHZlKGZhbGxiYWNrRXh0ZW5kZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yID0gZTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IFRTQ29uZmNrUGFyc2VFcnJvcihcbiAgICBgZmFpbGVkIHRvIHJlc29sdmUgXCJleHRlbmRzXCI6XCIke2V4dGVuZGVkfVwiIGluICR7ZnJvbX1gLFxuICAgIFwiRVhURU5EU19SRVNPTFZFXCIsXG4gICAgZnJvbSxcbiAgICBlcnJvclxuICApO1xufVxudmFyIEVYVEVOREFCTEVfS0VZUyA9IFtcbiAgXCJjb21waWxlck9wdGlvbnNcIixcbiAgXCJmaWxlc1wiLFxuICBcImluY2x1ZGVcIixcbiAgXCJleGNsdWRlXCIsXG4gIFwid2F0Y2hPcHRpb25zXCIsXG4gIFwiY29tcGlsZU9uU2F2ZVwiLFxuICBcInR5cGVBY3F1aXNpdGlvblwiLFxuICBcImJ1aWxkT3B0aW9uc1wiXG5dO1xuZnVuY3Rpb24gZXh0ZW5kVFNDb25maWcoZXh0ZW5kaW5nLCBleHRlbmRlZCkge1xuICBjb25zdCBleHRlbmRpbmdDb25maWcgPSBleHRlbmRpbmcudHNjb25maWc7XG4gIGNvbnN0IGV4dGVuZGVkQ29uZmlnID0gZXh0ZW5kZWQudHNjb25maWc7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IG5hdGl2ZTJwb3NpeChcbiAgICByZXF1aXJlJCQwJDQucmVsYXRpdmUocmVxdWlyZSQkMCQ0LmRpcm5hbWUoZXh0ZW5kaW5nLnRzY29uZmlnRmlsZSksIHJlcXVpcmUkJDAkNC5kaXJuYW1lKGV4dGVuZGVkLnRzY29uZmlnRmlsZSkpXG4gICk7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGV4dGVuZGVkQ29uZmlnKS5maWx0ZXIoKGtleTIpID0+IEVYVEVOREFCTEVfS0VZUy5pbmNsdWRlcyhrZXkyKSkpIHtcbiAgICBpZiAoa2V5ID09PSBcImNvbXBpbGVyT3B0aW9uc1wiKSB7XG4gICAgICBpZiAoIWV4dGVuZGluZ0NvbmZpZy5jb21waWxlck9wdGlvbnMpIHtcbiAgICAgICAgZXh0ZW5kaW5nQ29uZmlnLmNvbXBpbGVyT3B0aW9ucyA9IHt9O1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgT2JqZWN0LmtleXMoZXh0ZW5kZWRDb25maWcuY29tcGlsZXJPcHRpb25zKSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4dGVuZGluZ0NvbmZpZy5jb21waWxlck9wdGlvbnMsIG9wdGlvbikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBleHRlbmRpbmdDb25maWcuY29tcGlsZXJPcHRpb25zW29wdGlvbl0gPSByZWJhc2VSZWxhdGl2ZShcbiAgICAgICAgICBvcHRpb24sXG4gICAgICAgICAgZXh0ZW5kZWRDb25maWcuY29tcGlsZXJPcHRpb25zW29wdGlvbl0sXG4gICAgICAgICAgcmVsYXRpdmVQYXRoXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChleHRlbmRpbmdDb25maWdba2V5XSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoa2V5ID09PSBcIndhdGNoT3B0aW9uc1wiKSB7XG4gICAgICAgIGV4dGVuZGluZ0NvbmZpZy53YXRjaE9wdGlvbnMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgT2JqZWN0LmtleXMoZXh0ZW5kZWRDb25maWcud2F0Y2hPcHRpb25zKSkge1xuICAgICAgICAgIGV4dGVuZGluZ0NvbmZpZy53YXRjaE9wdGlvbnNbb3B0aW9uXSA9IHJlYmFzZVJlbGF0aXZlKFxuICAgICAgICAgICAgb3B0aW9uLFxuICAgICAgICAgICAgZXh0ZW5kZWRDb25maWcud2F0Y2hPcHRpb25zW29wdGlvbl0sXG4gICAgICAgICAgICByZWxhdGl2ZVBhdGhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleHRlbmRpbmdDb25maWdba2V5XSA9IHJlYmFzZVJlbGF0aXZlKGtleSwgZXh0ZW5kZWRDb25maWdba2V5XSwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbnZhciBSRUJBU0VfS0VZUyA9IFtcbiAgLy8gcm9vdFxuICBcImZpbGVzXCIsXG4gIFwiaW5jbHVkZVwiLFxuICBcImV4Y2x1ZGVcIixcbiAgLy8gY29tcGlsZXJPcHRpb25zXG4gIFwiYmFzZVVybFwiLFxuICBcInJvb3REaXJcIixcbiAgXCJyb290RGlyc1wiLFxuICBcInR5cGVSb290c1wiLFxuICBcIm91dERpclwiLFxuICBcIm91dEZpbGVcIixcbiAgXCJkZWNsYXJhdGlvbkRpclwiLFxuICAvLyB3YXRjaE9wdGlvbnNcbiAgXCJleGNsdWRlRGlyZWN0b3JpZXNcIixcbiAgXCJleGNsdWRlRmlsZXNcIlxuXTtcbmZ1bmN0aW9uIHJlYmFzZVJlbGF0aXZlKGtleSwgdmFsdWUsIHByZXBlbmRQYXRoKSB7XG4gIGlmICghUkVCQVNFX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKCh4KSA9PiByZWJhc2VQYXRoKHgsIHByZXBlbmRQYXRoKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlYmFzZVBhdGgodmFsdWUsIHByZXBlbmRQYXRoKTtcbiAgfVxufVxuZnVuY3Rpb24gcmViYXNlUGF0aCh2YWx1ZSwgcHJlcGVuZFBhdGgpIHtcbiAgaWYgKHJlcXVpcmUkJDAkNC5pc0Fic29sdXRlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVxdWlyZSQkMCQ0LnBvc2l4Lm5vcm1hbGl6ZShyZXF1aXJlJCQwJDQucG9zaXguam9pbihwcmVwZW5kUGF0aCwgdmFsdWUpKTtcbiAgfVxufVxudmFyIFRTQ29uZmNrUGFyc2VFcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBjb2RlLCB0c2NvbmZpZ0ZpbGUsIGNhdXNlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFRTQ29uZmNrUGFyc2VFcnJvci5wcm90b3R5cGUpO1xuICAgIHRoaXMubmFtZSA9IFRTQ29uZmNrUGFyc2VFcnJvci5uYW1lO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICAgIHRoaXMudHNjb25maWdGaWxlID0gdHNjb25maWdGaWxlO1xuICB9XG59O1xuXG5jb25zdCBkZWJ1ZyRmID0gY3JlYXRlRGVidWdnZXIoJ3ZpdGU6ZXNidWlsZCcpO1xuY29uc3QgSU5KRUNUX0hFTFBFUlNfSUlGRV9SRSA9IC9eKC4qPykoKD86Y29uc3R8dmFyKVxccytcXFMrXFxzKj1cXHMqZnVuY3Rpb25cXHMqXFwoW14pXSpcXClcXHMqXFx7Lio/XCJ1c2Ugc3RyaWN0XCI7KS9zO1xuY29uc3QgSU5KRUNUX0hFTFBFUlNfVU1EX1JFID0gL14oLio/KShcXChmdW5jdGlvblxcKFteKV0qXFwpXFxzKlxcey4rP2FtZC4rP2Z1bmN0aW9uXFwoW14pXSpcXClcXHMqXFx7Lio/XCJ1c2Ugc3RyaWN0XCI7KS9zO1xubGV0IHNlcnZlcjtcbmFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybVdpdGhFc2J1aWxkKGNvZGUsIGZpbGVuYW1lLCBvcHRpb25zLCBpbk1hcCkge1xuICAgIGxldCBsb2FkZXIgPSBvcHRpb25zPy5sb2FkZXI7XG4gICAgaWYgKCFsb2FkZXIpIHtcbiAgICAgICAgLy8gaWYgdGhlIGlkIGVuZHMgd2l0aCBhIHZhbGlkIGV4dCwgdXNlIGl0IChlLmcuIHZ1ZSBibG9ja3MpXG4gICAgICAgIC8vIG90aGVyd2lzZSwgY2xlYW51cCB0aGUgcXVlcnkgYmVmb3JlIGNoZWNraW5nIHRoZSBleHRcbiAgICAgICAgY29uc3QgZXh0ID0gcGF0aCRvXG4gICAgICAgICAgICAuZXh0bmFtZSgvXFwuXFx3KyQvLnRlc3QoZmlsZW5hbWUpID8gZmlsZW5hbWUgOiBjbGVhblVybChmaWxlbmFtZSkpXG4gICAgICAgICAgICAuc2xpY2UoMSk7XG4gICAgICAgIGlmIChleHQgPT09ICdjanMnIHx8IGV4dCA9PT0gJ21qcycpIHtcbiAgICAgICAgICAgIGxvYWRlciA9ICdqcyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0ID09PSAnY3RzJyB8fCBleHQgPT09ICdtdHMnKSB7XG4gICAgICAgICAgICBsb2FkZXIgPSAndHMnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9hZGVyID0gZXh0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB0c2NvbmZpZ1JhdyA9IG9wdGlvbnM/LnRzY29uZmlnUmF3O1xuICAgIC8vIGlmIG9wdGlvbnMgcHJvdmlkZSB0c2NvbmZpZ1JhdyBpbiBzdHJpbmcsIGl0IHRha2VzIGhpZ2hlc3QgcHJlY2VkZW5jZVxuICAgIGlmICh0eXBlb2YgdHNjb25maWdSYXcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIHRoZXNlIGZpZWxkcyB3b3VsZCBhZmZlY3QgdGhlIGNvbXBpbGF0aW9uIHJlc3VsdFxuICAgICAgICAvLyBodHRwczovL2VzYnVpbGQuZ2l0aHViLmlvL2NvbnRlbnQtdHlwZXMvI3RzY29uZmlnLWpzb25cbiAgICAgICAgY29uc3QgbWVhbmluZ2Z1bEZpZWxkcyA9IFtcbiAgICAgICAgICAgICdhbHdheXNTdHJpY3QnLFxuICAgICAgICAgICAgJ2ltcG9ydHNOb3RVc2VkQXNWYWx1ZXMnLFxuICAgICAgICAgICAgJ2pzeCcsXG4gICAgICAgICAgICAnanN4RmFjdG9yeScsXG4gICAgICAgICAgICAnanN4RnJhZ21lbnRGYWN0b3J5JyxcbiAgICAgICAgICAgICdqc3hJbXBvcnRTb3VyY2UnLFxuICAgICAgICAgICAgJ3ByZXNlcnZlVmFsdWVJbXBvcnRzJyxcbiAgICAgICAgICAgICd0YXJnZXQnLFxuICAgICAgICAgICAgJ3VzZURlZmluZUZvckNsYXNzRmllbGRzJyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgY29tcGlsZXJPcHRpb25zRm9yRmlsZSA9IHt9O1xuICAgICAgICBpZiAobG9hZGVyID09PSAndHMnIHx8IGxvYWRlciA9PT0gJ3RzeCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZFRzY29uZmlnID0gYXdhaXQgbG9hZFRzY29uZmlnSnNvbkZvckZpbGUoZmlsZW5hbWUpO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVkQ29tcGlsZXJPcHRpb25zID0gbG9hZGVkVHNjb25maWcuY29tcGlsZXJPcHRpb25zID8/IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBtZWFuaW5nZnVsRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkIGluIGxvYWRlZENvbXBpbGVyT3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFR5cGVTY3JpcHQgY2FuJ3QgdGVsbCB0aGV5IGFyZSBvZiB0aGUgc2FtZSB0eXBlXG4gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9uc0ZvckZpbGVbZmllbGRdID0gbG9hZGVkQ29tcGlsZXJPcHRpb25zW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHNjb25maWdSYXcgPSB7XG4gICAgICAgICAgICAuLi50c2NvbmZpZ1JhdyxcbiAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIC4uLmNvbXBpbGVyT3B0aW9uc0ZvckZpbGUsXG4gICAgICAgICAgICAgICAgLi4udHNjb25maWdSYXc/LmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgY29tcGlsZXJPcHRpb25zIH0gPSB0c2NvbmZpZ1JhdztcbiAgICAgICAgaWYgKGNvbXBpbGVyT3B0aW9ucykge1xuICAgICAgICAgICAgLy8gZXNidWlsZCBkZXJpdmVzIGB1c2VEZWZpbmVGb3JDbGFzc0ZpZWxkc2AgZnJvbSBgdGFyZ2V0YCBpbnN0ZWFkIG9mIGB0c2NvbmZpZy5jb21waWxlck9wdGlvbnMudGFyZ2V0YFxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2V2YW53L2VzYnVpbGQvaXNzdWVzLzI1ODRcbiAgICAgICAgICAgIC8vIGJ1dCB3ZSB3YW50IGB1c2VEZWZpbmVGb3JDbGFzc0ZpZWxkc2AgdG8gYmUgZGVyaXZlZCBmcm9tIGB0c2NvbmZpZy5jb21waWxlck9wdGlvbnMudGFyZ2V0YFxuICAgICAgICAgICAgaWYgKGNvbXBpbGVyT3B0aW9ucy51c2VEZWZpbmVGb3JDbGFzc0ZpZWxkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG93ZXJjYXNlVGFyZ2V0ID0gY29tcGlsZXJPcHRpb25zLnRhcmdldD8udG9Mb3dlckNhc2UoKSA/PyAnZXMzJztcbiAgICAgICAgICAgICAgICBpZiAobG93ZXJjYXNlVGFyZ2V0LnN0YXJ0c1dpdGgoJ2VzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNWZXJzaW9uID0gbG93ZXJjYXNlVGFyZ2V0LnNsaWNlKDIpO1xuICAgICAgICAgICAgICAgICAgICBjb21waWxlck9wdGlvbnMudXNlRGVmaW5lRm9yQ2xhc3NGaWVsZHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXNWZXJzaW9uID09PSAnbmV4dCcgfHwgK2VzVmVyc2lvbiA+PSAyMDIyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnVzZURlZmluZUZvckNsYXNzRmllbGRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkT3B0aW9ucyA9IHtcbiAgICAgICAgc291cmNlbWFwOiB0cnVlLFxuICAgICAgICAvLyBlbnN1cmUgc291cmNlIGZpbGUgbmFtZSBjb250YWlucyBmdWxsIHF1ZXJ5XG4gICAgICAgIHNvdXJjZWZpbGU6IGZpbGVuYW1lLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBsb2FkZXIsXG4gICAgICAgIHRzY29uZmlnUmF3LFxuICAgIH07XG4gICAgLy8gZXNidWlsZCB1c2VzIHRzY29uZmlnIGZpZWxkcyB3aGVuIGJvdGggdGhlIG5vcm1hbCBvcHRpb25zIGFuZCB0c2NvbmZpZyB3YXMgc2V0XG4gICAgLy8gYnV0IHdlIHdhbnQgdG8gcHJpb3JpdGl6ZSB0aGUgbm9ybWFsIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucyAmJlxuICAgICAgICB0eXBlb2YgcmVzb2x2ZWRPcHRpb25zLnRzY29uZmlnUmF3ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICByZXNvbHZlZE9wdGlvbnMudHNjb25maWdSYXcuY29tcGlsZXJPcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMuanN4ICYmIChyZXNvbHZlZE9wdGlvbnMudHNjb25maWdSYXcuY29tcGlsZXJPcHRpb25zLmpzeCA9IHVuZGVmaW5lZCk7XG4gICAgICAgIG9wdGlvbnMuanN4RmFjdG9yeSAmJlxuICAgICAgICAgICAgKHJlc29sdmVkT3B0aW9ucy50c2NvbmZpZ1Jhdy5jb21waWxlck9wdGlvbnMuanN4RmFjdG9yeSA9IHVuZGVmaW5lZCk7XG4gICAgICAgIG9wdGlvbnMuanN4RnJhZ21lbnQgJiZcbiAgICAgICAgICAgIChyZXNvbHZlZE9wdGlvbnMudHNjb25maWdSYXcuY29tcGlsZXJPcHRpb25zLmpzeEZyYWdtZW50RmFjdG9yeSA9XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkKTtcbiAgICAgICAgb3B0aW9ucy5qc3hJbXBvcnRTb3VyY2UgJiZcbiAgICAgICAgICAgIChyZXNvbHZlZE9wdGlvbnMudHNjb25maWdSYXcuY29tcGlsZXJPcHRpb25zLmpzeEltcG9ydFNvdXJjZSA9IHVuZGVmaW5lZCk7XG4gICAgICAgIG9wdGlvbnMudGFyZ2V0ICYmXG4gICAgICAgICAgICAocmVzb2x2ZWRPcHRpb25zLnRzY29uZmlnUmF3LmNvbXBpbGVyT3B0aW9ucy50YXJnZXQgPSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBkZWxldGUgcmVzb2x2ZWRPcHRpb25zLmluY2x1ZGU7XG4gICAgZGVsZXRlIHJlc29sdmVkT3B0aW9ucy5leGNsdWRlO1xuICAgIGRlbGV0ZSByZXNvbHZlZE9wdGlvbnMuanN4SW5qZWN0O1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybSQyKGNvZGUsIHJlc29sdmVkT3B0aW9ucyk7XG4gICAgICAgIGxldCBtYXA7XG4gICAgICAgIGlmIChpbk1hcCAmJiByZXNvbHZlZE9wdGlvbnMuc291cmNlbWFwKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0TWFwID0gSlNPTi5wYXJzZShyZXN1bHQubWFwKTtcbiAgICAgICAgICAgIG5leHRNYXAuc291cmNlc0NvbnRlbnQgPSBbXTtcbiAgICAgICAgICAgIG1hcCA9IGNvbWJpbmVTb3VyY2VtYXBzKGZpbGVuYW1lLCBbXG4gICAgICAgICAgICAgICAgbmV4dE1hcCxcbiAgICAgICAgICAgICAgICBpbk1hcCxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWFwID1cbiAgICAgICAgICAgICAgICByZXNvbHZlZE9wdGlvbnMuc291cmNlbWFwICYmIHJlc29sdmVkT3B0aW9ucy5zb3VyY2VtYXAgIT09ICdpbmxpbmUnXG4gICAgICAgICAgICAgICAgICAgID8gSlNPTi5wYXJzZShyZXN1bHQubWFwKVxuICAgICAgICAgICAgICAgICAgICA6IHsgbWFwcGluZ3M6ICcnIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgIG1hcCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZGVidWckZihgZXNidWlsZCBlcnJvciB3aXRoIG9wdGlvbnMgdXNlZDogYCwgcmVzb2x2ZWRPcHRpb25zKTtcbiAgICAgICAgLy8gcGF0Y2ggZXJyb3IgaW5mb3JtYXRpb25cbiAgICAgICAgaWYgKGUuZXJyb3JzKSB7XG4gICAgICAgICAgICBlLmZyYW1lID0gJyc7XG4gICAgICAgICAgICBlLmVycm9ycy5mb3JFYWNoKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgZS5mcmFtZSArPSBgXFxuYCArIHByZXR0aWZ5TWVzc2FnZShtLCBjb2RlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZS5sb2MgPSBlLmVycm9yc1swXS5sb2NhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVzYnVpbGRQbHVnaW4ob3B0aW9ucykge1xuICAgIGNvbnN0IGZpbHRlciA9IGNyZWF0ZUZpbHRlcihvcHRpb25zLmluY2x1ZGUgfHwgL1xcLihtP3RzfFtqdF1zeCkkLywgb3B0aW9ucy5leGNsdWRlIHx8IC9cXC5qcyQvKTtcbiAgICAvLyBSZW1vdmUgb3B0aW1pemF0aW9uIG9wdGlvbnMgZm9yIGRldiBhcyB3ZSBvbmx5IG5lZWQgdG8gdHJhbnNwaWxlIHRoZW0sXG4gICAgLy8gYW5kIGZvciBidWlsZCBhcyB0aGUgZmluYWwgb3B0aW1pemF0aW9uIGlzIGluIGBidWlsZEVzYnVpbGRQbHVnaW5gXG4gICAgY29uc3QgdHJhbnNmb3JtT3B0aW9ucyA9IHtcbiAgICAgICAgdGFyZ2V0OiAnZXNuZXh0JyxcbiAgICAgICAgY2hhcnNldDogJ3V0ZjgnLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgICBtaW5pZnlJZGVudGlmaWVyczogZmFsc2UsXG4gICAgICAgIG1pbmlmeVN5bnRheDogZmFsc2UsXG4gICAgICAgIG1pbmlmeVdoaXRlc3BhY2U6IGZhbHNlLFxuICAgICAgICB0cmVlU2hha2luZzogZmFsc2UsXG4gICAgICAgIC8vIGtlZXBOYW1lcyBpcyBub3QgbmVlZGVkIHdoZW4gbWluaWZ5IGlzIGRpc2FibGVkLlxuICAgICAgICAvLyBBbHNvIHRyYW5zZm9ybWluZyBtdWx0aXBsZSB0aW1lcyB3aXRoIGtlZXBOYW1lcyBlbmFibGVkIGJyZWFrc1xuICAgICAgICAvLyB0cmVlLXNoYWtpbmcuICgjOTE2NClcbiAgICAgICAga2VlcE5hbWVzOiBmYWxzZSxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmVzYnVpbGQnLFxuICAgICAgICBjb25maWd1cmVTZXJ2ZXIoX3NlcnZlcikge1xuICAgICAgICAgICAgc2VydmVyID0gX3NlcnZlcjtcbiAgICAgICAgICAgIHNlcnZlci53YXRjaGVyXG4gICAgICAgICAgICAgICAgLm9uKCdhZGQnLCByZWxvYWRPblRzY29uZmlnQ2hhbmdlKVxuICAgICAgICAgICAgICAgIC5vbignY2hhbmdlJywgcmVsb2FkT25Uc2NvbmZpZ0NoYW5nZSlcbiAgICAgICAgICAgICAgICAub24oJ3VubGluaycsIHJlbG9hZE9uVHNjb25maWdDaGFuZ2UpO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBjb25maWdSZXNvbHZlZChjb25maWcpIHtcbiAgICAgICAgICAgIGF3YWl0IGluaXRUU0NvbmZjayhjb25maWcpO1xuICAgICAgICB9LFxuICAgICAgICBidWlsZEVuZCgpIHtcbiAgICAgICAgICAgIC8vIHJlY3ljbGUgc2VydmUgdG8gYXZvaWQgcHJldmVudGluZyBOb2RlIHNlbGYtZXhpdCAoIzY4MTUpXG4gICAgICAgICAgICBzZXJ2ZXIgPSBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyB0cmFuc2Zvcm0oY29kZSwgaWQpIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIoaWQpIHx8IGZpbHRlcihjbGVhblVybChpZCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3JtV2l0aEVzYnVpbGQoY29kZSwgaWQsIHRyYW5zZm9ybU9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQud2FybmluZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndhcm4ocHJldHRpZnlNZXNzYWdlKG0sIGNvZGUpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmpzeEluamVjdCAmJiAvXFwuKD86anx0KXN4XFxiLy50ZXN0KGlkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY29kZSA9IG9wdGlvbnMuanN4SW5qZWN0ICsgJzsnICsgcmVzdWx0LmNvZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5jb2RlLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IHJlc3VsdC5tYXAsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufVxuY29uc3Qgcm9sbHVwVG9Fc2J1aWxkRm9ybWF0TWFwID0ge1xuICAgIGVzOiAnZXNtJyxcbiAgICBjanM6ICdjanMnLFxuICAgIC8vIHBhc3NpbmcgYHZhciBMaWIgPSAoKCkgPT4ge30pKClgIHRvIGVzYnVpbGQgd2l0aCBmb3JtYXQgPSBcImlpZmVcIlxuICAgIC8vIHdpbGwgdHVybiBpdCB0byBgKCgpID0+IHsgdmFyIExpYiA9ICgoKSA9PiB7fSkoKSB9KSgpYCxcbiAgICAvLyBzbyB3ZSByZW1vdmUgdGhlIGZvcm1hdCBjb25maWcgdG8gdGVsbCBlc2J1aWxkIG5vdCBkb2luZyB0aGlzXG4gICAgLy9cbiAgICAvLyBhbHRob3VnaCBlc2J1aWxkIGRvZXNuJ3QgY2hhbmdlIGZvcm1hdCwgdGhlcmUgaXMgc3RpbGwgcG9zc2liaWxpdHlcbiAgICAvLyB0aGF0IGB7IHRyZWVTaGFraW5nOiB0cnVlIH1gIHJlbW92ZXMgYSB0b3AtbGV2ZWwgbm8tc2lkZS1lZmZlY3QgdmFyaWFibGVcbiAgICAvLyBsaWtlOiBgdmFyIExpYiA9IDFgLCB3aGljaCBiZWNvbWVzIGBgIGFmdGVyIGVzYnVpbGQgdHJhbnNmb3JtaW5nLFxuICAgIC8vIGJ1dCB0aGFua2Z1bGx5IHJvbGx1cCBkb2VzIG5vdCBkbyB0aGlzIG9wdGltaXphdGlvbiBub3dcbiAgICBpaWZlOiB1bmRlZmluZWQsXG59O1xuY29uc3QgYnVpbGRFc2J1aWxkUGx1Z2luID0gKGNvbmZpZykgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmVzYnVpbGQtdHJhbnNwaWxlJyxcbiAgICAgICAgYXN5bmMgY29uZmlnUmVzb2x2ZWQoY29uZmlnKSB7XG4gICAgICAgICAgICBhd2FpdCBpbml0VFNDb25mY2soY29uZmlnKTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgcmVuZGVyQ2h1bmsoY29kZSwgY2h1bmssIG9wdHMpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaW5qZWN0ZWQgYnkgQHZpdGVqcy9wbHVnaW4tbGVnYWN5XG4gICAgICAgICAgICBpZiAob3B0cy5fX3ZpdGVfc2tpcF9lc2J1aWxkX18pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSByZXNvbHZlRXNidWlsZFRyYW5zcGlsZU9wdGlvbnMoY29uZmlnLCBvcHRzLmZvcm1hdCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRyYW5zZm9ybVdpdGhFc2J1aWxkKGNvZGUsIGNodW5rLmZpbGVOYW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChjb25maWcuYnVpbGQubGliKSB7XG4gICAgICAgICAgICAgICAgLy8gIzcxODgsIGVzYnVpbGQgYWRkcyBoZWxwZXJzIG91dCBvZiB0aGUgVU1EIGFuZCBJSUZFIHdyYXBwZXJzLCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgLy8gbmFtZXMgYXJlIG1pbmlmaWVkIHBvdGVudGlhbGx5IGNhdXNpbmcgY29sbGlzaW9uIHdpdGggb3RoZXIgZ2xvYmFscy5cbiAgICAgICAgICAgICAgICAvLyBXZSB1c2UgYSByZWdleCB0byBpbmplY3QgdGhlIGhlbHBlcnMgaW5zaWRlIHRoZSB3cmFwcGVycy5cbiAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIE1hZ2ljU3RyaW5nIGhlcmUgYmVjYXVzZSBib3RoIHRoZSBoZWxwZXJzIGFuZFxuICAgICAgICAgICAgICAgIC8vIHRoZSBoZWFkZXJzIGRvbid0IG1vZGlmeSB0aGUgc291cmNlbWFwXG4gICAgICAgICAgICAgICAgY29uc3QgaW5qZWN0SGVscGVycyA9IG9wdHMuZm9ybWF0ID09PSAndW1kJ1xuICAgICAgICAgICAgICAgICAgICA/IElOSkVDVF9IRUxQRVJTX1VNRF9SRVxuICAgICAgICAgICAgICAgICAgICA6IG9wdHMuZm9ybWF0ID09PSAnaWlmZSdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gSU5KRUNUX0hFTFBFUlNfSUlGRV9SRVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGluamVjdEhlbHBlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLmNvZGUgPSByZXMuY29kZS5yZXBsYWNlKGluamVjdEhlbHBlcnMsIChfLCBoZWxwZXJzLCBoZWFkZXIpID0+IGhlYWRlciArIGhlbHBlcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5mdW5jdGlvbiByZXNvbHZlRXNidWlsZFRyYW5zcGlsZU9wdGlvbnMoY29uZmlnLCBmb3JtYXQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcuYnVpbGQudGFyZ2V0O1xuICAgIGNvbnN0IG1pbmlmeSA9IGNvbmZpZy5idWlsZC5taW5pZnkgPT09ICdlc2J1aWxkJztcbiAgICBpZiAoKCF0YXJnZXQgfHwgdGFyZ2V0ID09PSAnZXNuZXh0JykgJiYgIW1pbmlmeSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gRG8gbm90IG1pbmlmeSB3aGl0ZXNwYWNlIGZvciBFUyBsaWIgb3V0cHV0IHNpbmNlIHRoYXQgd291bGQgcmVtb3ZlXG4gICAgLy8gcHVyZSBhbm5vdGF0aW9ucyBhbmQgYnJlYWsgdHJlZS1zaGFraW5nXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL2NvcmUvaXNzdWVzLzI4NjAjaXNzdWVjb21tZW50LTkyNjg4Mjc5M1xuICAgIGNvbnN0IGlzRXNMaWJCdWlsZCA9IGNvbmZpZy5idWlsZC5saWIgJiYgZm9ybWF0ID09PSAnZXMnO1xuICAgIGNvbnN0IGVzYnVpbGRPcHRpb25zID0gY29uZmlnLmVzYnVpbGQgfHwge307XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgY2hhcnNldDogJ3V0ZjgnLFxuICAgICAgICAuLi5lc2J1aWxkT3B0aW9ucyxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQgfHwgdW5kZWZpbmVkLFxuICAgICAgICBmb3JtYXQ6IHJvbGx1cFRvRXNidWlsZEZvcm1hdE1hcFtmb3JtYXRdLFxuICAgICAgICAvLyB0aGUgZmluYWwgYnVpbGQgc2hvdWxkIGFsd2F5cyBzdXBwb3J0IGR5bmFtaWMgaW1wb3J0IGFuZCBpbXBvcnQubWV0YS5cbiAgICAgICAgLy8gaWYgdGhleSBuZWVkIHRvIGJlIHBvbHlmaWxsZWQsIHBsdWdpbi1sZWdhY3kgc2hvdWxkIGJlIHVzZWQuXG4gICAgICAgIC8vIHBsdWdpbi1sZWdhY3kgZGV0ZWN0cyB0aGVzZSB0d28gZmVhdHVyZXMgd2hlbiBjaGVja2luZyBmb3IgbW9kZXJuIGNvZGUuXG4gICAgICAgIHN1cHBvcnRlZDoge1xuICAgICAgICAgICAgJ2R5bmFtaWMtaW1wb3J0JzogdHJ1ZSxcbiAgICAgICAgICAgICdpbXBvcnQtbWV0YSc6IHRydWUsXG4gICAgICAgICAgICAuLi5lc2J1aWxkT3B0aW9ucy5zdXBwb3J0ZWQsXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBJZiBubyBtaW5pZnksIGRpc2FibGUgYWxsIG1pbmlmeSBvcHRpb25zXG4gICAgaWYgKCFtaW5pZnkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgICAgICAgbWluaWZ5SWRlbnRpZmllcnM6IGZhbHNlLFxuICAgICAgICAgICAgbWluaWZ5U3ludGF4OiBmYWxzZSxcbiAgICAgICAgICAgIG1pbmlmeVdoaXRlc3BhY2U6IGZhbHNlLFxuICAgICAgICAgICAgdHJlZVNoYWtpbmc6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBJZiB1c2VyIGVuYWJsZSBmaW5lLWdyYWluIG1pbmlmeSBvcHRpb25zLCBtaW5pZnkgd2l0aCB0aGVpciBvcHRpb25zIGluc3RlYWRcbiAgICBpZiAob3B0aW9ucy5taW5pZnlJZGVudGlmaWVycyAhPSBudWxsIHx8XG4gICAgICAgIG9wdGlvbnMubWluaWZ5U3ludGF4ICE9IG51bGwgfHxcbiAgICAgICAgb3B0aW9ucy5taW5pZnlXaGl0ZXNwYWNlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGlzRXNMaWJCdWlsZCkge1xuICAgICAgICAgICAgLy8gRGlzYWJsZSBtaW5pZnkgd2hpdGVzcGFjZSBhcyBpdCBicmVha3MgdHJlZS1zaGFraW5nXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtaW5pZnlJZGVudGlmaWVyczogb3B0aW9ucy5taW5pZnlJZGVudGlmaWVycyA/PyB0cnVlLFxuICAgICAgICAgICAgICAgIG1pbmlmeVN5bnRheDogb3B0aW9ucy5taW5pZnlTeW50YXggPz8gdHJ1ZSxcbiAgICAgICAgICAgICAgICBtaW5pZnlXaGl0ZXNwYWNlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtaW5pZnlJZGVudGlmaWVyczogb3B0aW9ucy5taW5pZnlJZGVudGlmaWVycyA/PyB0cnVlLFxuICAgICAgICAgICAgICAgIG1pbmlmeVN5bnRheDogb3B0aW9ucy5taW5pZnlTeW50YXggPz8gdHJ1ZSxcbiAgICAgICAgICAgICAgICBtaW5pZnlXaGl0ZXNwYWNlOiBvcHRpb25zLm1pbmlmeVdoaXRlc3BhY2UgPz8gdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRWxzZSBhcHBseSBkZWZhdWx0IG1pbmlmeSBvcHRpb25zXG4gICAgaWYgKGlzRXNMaWJCdWlsZCkge1xuICAgICAgICAvLyBNaW5pZnkgYWxsIGV4Y2VwdCB3aGl0ZXNwYWNlIGFzIGl0IGJyZWFrcyB0cmVlLXNoYWtpbmdcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgICAgICAgbWluaWZ5SWRlbnRpZmllcnM6IHRydWUsXG4gICAgICAgICAgICBtaW5pZnlTeW50YXg6IHRydWUsXG4gICAgICAgICAgICBtaW5pZnlXaGl0ZXNwYWNlOiBmYWxzZSxcbiAgICAgICAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBwcmV0dGlmeU1lc3NhZ2UobSwgY29kZSkge1xuICAgIGxldCByZXMgPSBwaWNvY29sb3JzRXhwb3J0cy55ZWxsb3cobS50ZXh0KTtcbiAgICBpZiAobS5sb2NhdGlvbikge1xuICAgICAgICBjb25zdCBsaW5lcyA9IGNvZGUuc3BsaXQoL1xccj9cXG4vZyk7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBOdW1iZXIobS5sb2NhdGlvbi5saW5lKTtcbiAgICAgICAgY29uc3QgY29sdW1uID0gTnVtYmVyKG0ubG9jYXRpb24uY29sdW1uKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gbGluZXNcbiAgICAgICAgICAgIC5zbGljZSgwLCBsaW5lIC0gMSlcbiAgICAgICAgICAgIC5tYXAoKGwpID0+IGwubGVuZ3RoKVxuICAgICAgICAgICAgLnJlZHVjZSgodG90YWwsIGwpID0+IHRvdGFsICsgbCArIDEsIDApICsgY29sdW1uO1xuICAgICAgICByZXMgKz0gYFxcbmAgKyBnZW5lcmF0ZUNvZGVGcmFtZShjb2RlLCBvZmZzZXQsIG9mZnNldCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzICsgYFxcbmA7XG59XG5jb25zdCB0c2NvbmZja1BhcnNlT3B0aW9ucyA9IHtcbiAgICBjYWNoZTogbmV3IE1hcCgpLFxuICAgIHRzQ29uZmlnUGF0aHM6IHVuZGVmaW5lZCxcbiAgICByb290OiB1bmRlZmluZWQsXG4gICAgcmVzb2x2ZVdpdGhFbXB0eUlmQ29uZmlnTm90Rm91bmQ6IHRydWUsXG59O1xuYXN5bmMgZnVuY3Rpb24gaW5pdFRTQ29uZmNrKGNvbmZpZykge1xuICAgIGNvbnN0IHdvcmtzcGFjZVJvb3QgPSBzZWFyY2hGb3JXb3Jrc3BhY2VSb290KGNvbmZpZy5yb290KTtcbiAgICBkZWJ1ZyRmKGBpbml0IHRzY29uZmNrIChyb290OiAke3BpY29jb2xvcnNFeHBvcnRzLmN5YW4od29ya3NwYWNlUm9vdCl9KWApO1xuICAgIHRzY29uZmNrUGFyc2VPcHRpb25zLmNhY2hlLmNsZWFyKCk7XG4gICAgdHNjb25mY2tQYXJzZU9wdGlvbnMucm9vdCA9IHdvcmtzcGFjZVJvb3Q7XG4gICAgdHNjb25mY2tQYXJzZU9wdGlvbnMudHNDb25maWdQYXRocyA9IG5ldyBTZXQoW1xuICAgICAgICAuLi4oYXdhaXQgZmluZEFsbCh3b3Jrc3BhY2VSb290LCB7XG4gICAgICAgICAgICBza2lwOiAoZGlyKSA9PiBkaXIgPT09ICdub2RlX21vZHVsZXMnIHx8IGRpciA9PT0gJy5naXQnLFxuICAgICAgICB9KSksXG4gICAgXSk7XG4gICAgZGVidWckZihgaW5pdCB0c2NvbmZjayBlbmRgKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGxvYWRUc2NvbmZpZ0pzb25Gb3JGaWxlKGZpbGVuYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFyc2UkZihmaWxlbmFtZSwgdHNjb25mY2tQYXJzZU9wdGlvbnMpO1xuICAgICAgICAvLyB0c2NvbmZpZyBjb3VsZCBiZSBvdXQgb2Ygcm9vdCwgbWFrZSBzdXJlIGl0IGlzIHdhdGNoZWQgb24gZGV2XG4gICAgICAgIGlmIChzZXJ2ZXIgJiYgcmVzdWx0LnRzY29uZmlnRmlsZSAhPT0gJ25vX3RzY29uZmlnX2ZpbGVfZm91bmQnKSB7XG4gICAgICAgICAgICBlbnN1cmVXYXRjaGVkRmlsZShzZXJ2ZXIud2F0Y2hlciwgcmVzdWx0LnRzY29uZmlnRmlsZSwgc2VydmVyLmNvbmZpZy5yb290KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnRzY29uZmlnO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFRTQ29uZmNrUGFyc2VFcnJvcikge1xuICAgICAgICAgICAgLy8gdHNjb25maWcgY291bGQgYmUgb3V0IG9mIHJvb3QsIG1ha2Ugc3VyZSBpdCBpcyB3YXRjaGVkIG9uIGRldlxuICAgICAgICAgICAgaWYgKHNlcnZlciAmJiBlLnRzY29uZmlnRmlsZSkge1xuICAgICAgICAgICAgICAgIGVuc3VyZVdhdGNoZWRGaWxlKHNlcnZlci53YXRjaGVyLCBlLnRzY29uZmlnRmlsZSwgc2VydmVyLmNvbmZpZy5yb290KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbG9hZE9uVHNjb25maWdDaGFuZ2UoY2hhbmdlZEZpbGUpIHtcbiAgICAvLyBzZXJ2ZXIgY291bGQgYmUgY2xvc2VkIGV4dGVybmFsbHkgYWZ0ZXIgYSBmaWxlIGNoYW5nZSBpcyBkZXRlY3RlZFxuICAgIGlmICghc2VydmVyKVxuICAgICAgICByZXR1cm47XG4gICAgLy8gYW55IHRzY29uZmlnLmpzb24gdGhhdCdzIGFkZGVkIGluIHRoZSB3b3Jrc3BhY2UgY291bGQgYmUgY2xvc2VyIHRvIGEgY29kZSBmaWxlIHRoYW4gYSBwcmV2aW91c2x5IGNhY2hlZCBvbmVcbiAgICAvLyBhbnkganNvbiBmaWxlIGluIHRoZSB0c2NvbmZpZyBjYWNoZSBjb3VsZCBoYXZlIGJlZW4gdXNlZCB0byBjb21waWxlIHRzXG4gICAgaWYgKHBhdGgkby5iYXNlbmFtZShjaGFuZ2VkRmlsZSkgPT09ICd0c2NvbmZpZy5qc29uJyB8fFxuICAgICAgICAoY2hhbmdlZEZpbGUuZW5kc1dpdGgoJy5qc29uJykgJiZcbiAgICAgICAgICAgIHRzY29uZmNrUGFyc2VPcHRpb25zPy5jYWNoZT8uaGFzKGNoYW5nZWRGaWxlKSkpIHtcbiAgICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIuaW5mbyhgY2hhbmdlZCB0c2NvbmZpZyBmaWxlIGRldGVjdGVkOiAke2NoYW5nZWRGaWxlfSAtIENsZWFyaW5nIGNhY2hlIGFuZCBmb3JjaW5nIGZ1bGwtcmVsb2FkIHRvIGVuc3VyZSBUeXBlU2NyaXB0IGlzIGNvbXBpbGVkIHdpdGggdXBkYXRlZCBjb25maWcgdmFsdWVzLmAsIHsgY2xlYXI6IHNlcnZlci5jb25maWcuY2xlYXJTY3JlZW4sIHRpbWVzdGFtcDogdHJ1ZSB9KTtcbiAgICAgICAgLy8gY2xlYXIgbW9kdWxlIGdyYXBoIHRvIHJlbW92ZSBjb2RlIGNvbXBpbGVkIHdpdGggb3V0ZGF0ZWQgY29uZmlnXG4gICAgICAgIHNlcnZlci5tb2R1bGVHcmFwaC5pbnZhbGlkYXRlQWxsKCk7XG4gICAgICAgIC8vIHJlc2V0IHRzY29uZmNrIHNvIHRoYXQgcmVjb21waWxlIHdvcmtzIHdpdGggdXAyZGF0ZSBjb25maWdzXG4gICAgICAgIGluaXRUU0NvbmZjayhzZXJ2ZXIuY29uZmlnKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIC8vIHNlcnZlciBtYXkgbm90IGJlIGF2YWlsYWJsZSBpZiB2aXRlIGNvbmZpZyBpcyB1cGRhdGVkIGF0IHRoZSBzYW1lIHRpbWVcbiAgICAgICAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBmb3JjZSBmdWxsIHJlbG9hZFxuICAgICAgICAgICAgICAgIHNlcnZlci53cy5zZW5kKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Z1bGwtcmVsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogJyonLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbnZhciBkaXN0JDEgPSB7fTtcblxudmFyIF9faW1wb3J0RGVmYXVsdCA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZGlzdCQxLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBXb3JrZXJfMSA9IGRpc3QkMS5Xb3JrZXIgPSB2b2lkIDA7XG5jb25zdCBvc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUkJDIpO1xuY29uc3Qgd29ya2VyX3RocmVhZHNfMSA9IHJlcXVpcmUkJDE7XG5jbGFzcyBXb3JrZXIge1xuICAgIGNvbnN0cnVjdG9yKGZuLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5jb2RlID0gZ2VuV29ya2VyQ29kZShmbik7XG4gICAgICAgIHRoaXMubWF4ID0gb3B0aW9ucy5tYXggfHwgTWF0aC5tYXgoMSwgb3NfMS5kZWZhdWx0LmNwdXMoKS5sZW5ndGggLSAxKTtcbiAgICAgICAgdGhpcy5wb29sID0gW107XG4gICAgICAgIHRoaXMuaWRsZVBvb2wgPSBbXTtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgIH1cbiAgICBhc3luYyBydW4oLi4uYXJncykge1xuICAgICAgICBjb25zdCB3b3JrZXIgPSBhd2FpdCB0aGlzLl9nZXRBdmFpbGFibGVXb3JrZXIoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHdvcmtlci5jdXJyZW50UmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB3b3JrZXIuY3VycmVudFJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIHRoaXMucG9vbC5mb3JFYWNoKCh3KSA9PiB3LnVucmVmKCkpO1xuICAgICAgICB0aGlzLnF1ZXVlLmZvckVhY2goKFtfLCByZWplY3RdKSA9PiByZWplY3QobmV3IEVycm9yKCdNYWluIHdvcmtlciBwb29sIHN0b3BwZWQgYmVmb3JlIGEgd29ya2VyIHdhcyBhdmFpbGFibGUuJykpKTtcbiAgICAgICAgdGhpcy5wb29sID0gW107XG4gICAgICAgIHRoaXMuaWRsZVBvb2wgPSBbXTtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgIH1cbiAgICBhc3luYyBfZ2V0QXZhaWxhYmxlV29ya2VyKCkge1xuICAgICAgICAvLyBoYXMgaWRsZSBvbmU/XG4gICAgICAgIGlmICh0aGlzLmlkbGVQb29sLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWRsZVBvb2wuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjYW4gc3Bhd24gbW9yZT9cbiAgICAgICAgaWYgKHRoaXMucG9vbC5sZW5ndGggPCB0aGlzLm1heCkge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gbmV3IHdvcmtlcl90aHJlYWRzXzEuV29ya2VyKHRoaXMuY29kZSwgeyBldmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgd29ya2VyLm9uKCdtZXNzYWdlJywgKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHdvcmtlci5jdXJyZW50UmVzb2x2ZSAmJiB3b3JrZXIuY3VycmVudFJlc29sdmUocmVzKTtcbiAgICAgICAgICAgICAgICB3b3JrZXIuY3VycmVudFJlc29sdmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Fzc2lnbkRvbmVXb3JrZXIod29ya2VyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd29ya2VyLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB3b3JrZXIuY3VycmVudFJlamVjdCAmJiB3b3JrZXIuY3VycmVudFJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIHdvcmtlci5jdXJyZW50UmVqZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd29ya2VyLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5wb29sLmluZGV4T2Yod29ya2VyKTtcbiAgICAgICAgICAgICAgICBpZiAoaSA+IC0xKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvb2wuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlICE9PSAwICYmIHdvcmtlci5jdXJyZW50UmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5jdXJyZW50UmVqZWN0KG5ldyBFcnJvcihgV3Jva2VyIHN0b3BwZWQgd2l0aCBub24tMCBleGl0IGNvZGUgJHtjb2RlfWApKTtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLmN1cnJlbnRSZWplY3QgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wb29sLnB1c2god29ya2VyKTtcbiAgICAgICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm8gb25lIGlzIGF2YWlsYWJsZSwgd2UgaGF2ZSB0byB3YWl0XG4gICAgICAgIGxldCByZXNvbHZlO1xuICAgICAgICBsZXQgcmVqZWN0O1xuICAgICAgICBjb25zdCBvbldvcmtlckF2YWlsYWJsZVByb21pc2UgPSBuZXcgUHJvbWlzZSgociwgcmopID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUgPSByO1xuICAgICAgICAgICAgcmVqZWN0ID0gcmo7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnF1ZXVlLnB1c2goW3Jlc29sdmUsIHJlamVjdF0pO1xuICAgICAgICByZXR1cm4gb25Xb3JrZXJBdmFpbGFibGVQcm9taXNlO1xuICAgIH1cbiAgICBfYXNzaWduRG9uZVdvcmtlcih3b3JrZXIpIHtcbiAgICAgICAgLy8gc29tZW9uZSdzIHdhaXRpbmcgYWxyZWFkeT9cbiAgICAgICAgaWYgKHRoaXMucXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBbcmVzb2x2ZV0gPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICByZXNvbHZlKHdvcmtlcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGFrZSBhIHJlc3QuXG4gICAgICAgIHRoaXMuaWRsZVBvb2wucHVzaCh3b3JrZXIpO1xuICAgIH1cbn1cbldvcmtlcl8xID0gZGlzdCQxLldvcmtlciA9IFdvcmtlcjtcbmZ1bmN0aW9uIGdlbldvcmtlckNvZGUoZm4pIHtcbiAgICByZXR1cm4gYFxuY29uc3QgZG9Xb3JrID0gJHtmbi50b1N0cmluZygpfVxuXG5jb25zdCB7IHBhcmVudFBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJylcblxucGFyZW50UG9ydC5vbignbWVzc2FnZScsIGFzeW5jIChhcmdzKSA9PiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGRvV29yayguLi5hcmdzKVxuICBwYXJlbnRQb3J0LnBvc3RNZXNzYWdlKHJlcylcbn0pXG4gIGA7XG59XG5cbmxldCB0ZXJzZXJQYXRoO1xuY29uc3QgbG9hZFRlcnNlclBhdGggPSAocm9vdCkgPT4ge1xuICAgIGlmICh0ZXJzZXJQYXRoKVxuICAgICAgICByZXR1cm4gdGVyc2VyUGF0aDtcbiAgICB0cnkge1xuICAgICAgICB0ZXJzZXJQYXRoID0gcmVxdWlyZVJlc29sdmVGcm9tUm9vdFdpdGhGYWxsYmFjayhyb290LCAndGVyc2VyJyk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLmNvZGUgPT09ICdNT0RVTEVfTk9UX0ZPVU5EJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0ZXJzZXIgbm90IGZvdW5kLiBTaW5jZSBWaXRlIHYzLCB0ZXJzZXIgaGFzIGJlY29tZSBhbiBvcHRpb25hbCBkZXBlbmRlbmN5LiBZb3UgbmVlZCB0byBpbnN0YWxsIGl0LicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBFcnJvcihgdGVyc2VyIGZhaWxlZCB0byBsb2FkOlxcbiR7ZS5tZXNzYWdlfWApO1xuICAgICAgICAgICAgbWVzc2FnZS5zdGFjayA9IGUuc3RhY2sgKyAnXFxuJyArIG1lc3NhZ2Uuc3RhY2s7XG4gICAgICAgICAgICB0aHJvdyBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZXJzZXJQYXRoO1xufTtcbmZ1bmN0aW9uIHRlcnNlclBsdWdpbihjb25maWcpIHtcbiAgICBjb25zdCBtYWtlV29ya2VyID0gKCkgPT4gbmV3IFdvcmtlcl8xKGFzeW5jICh0ZXJzZXJQYXRoLCBjb2RlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIC8vIHRlc3QgZmFpbHMgd2hlbiB1c2luZyBgaW1wb3J0YC4gbWF5YmUgcmVsYXRlZDogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy80MzIwNVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzIC0tIHRoaXMgZnVuY3Rpb24gcnVucyBpbnNpZGUgY2pzXG4gICAgICAgIGNvbnN0IHRlcnNlciA9IHJlcXVpcmUodGVyc2VyUGF0aCk7XG4gICAgICAgIHJldHVybiB0ZXJzZXIubWluaWZ5KGNvZGUsIG9wdGlvbnMpO1xuICAgIH0pO1xuICAgIGxldCB3b3JrZXI7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3ZpdGU6dGVyc2VyJyxcbiAgICAgICAgYXN5bmMgcmVuZGVyQ2h1bmsoY29kZSwgX2NodW5rLCBvdXRwdXRPcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHBsdWdpbiBpcyBpbmNsdWRlZCBmb3IgYW55IG5vbi1mYWxzZSB2YWx1ZSBvZiBjb25maWcuYnVpbGQubWluaWZ5LFxuICAgICAgICAgICAgLy8gc28gdGhhdCBub3JtYWwgY2h1bmtzIGNhbiB1c2UgdGhlIHByZWZlcnJlZCBtaW5pZmllciwgYW5kIGxlZ2FjeSBjaHVua3NcbiAgICAgICAgICAgIC8vIGNhbiB1c2UgdGVyc2VyLlxuICAgICAgICAgICAgaWYgKGNvbmZpZy5idWlsZC5taW5pZnkgIT09ICd0ZXJzZXInICYmXG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpbmplY3RlZCBieSBAdml0ZWpzL3BsdWdpbi1sZWdhY3lcbiAgICAgICAgICAgICAgICAhb3V0cHV0T3B0aW9ucy5fX3ZpdGVfZm9yY2VfdGVyc2VyX18pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERvIG5vdCBtaW5pZnkgRVMgbGliIG91dHB1dCBzaW5jZSB0aGF0IHdvdWxkIHJlbW92ZSBwdXJlIGFubm90YXRpb25zXG4gICAgICAgICAgICAvLyBhbmQgYnJlYWsgdHJlZS1zaGFraW5nLlxuICAgICAgICAgICAgaWYgKGNvbmZpZy5idWlsZC5saWIgJiYgb3V0cHV0T3B0aW9ucy5mb3JtYXQgPT09ICdlcycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExhenkgbG9hZCB3b3JrZXIuXG4gICAgICAgICAgICB3b3JrZXIgfHwgKHdvcmtlciA9IG1ha2VXb3JrZXIoKSk7XG4gICAgICAgICAgICBjb25zdCB0ZXJzZXJQYXRoID0gbG9hZFRlcnNlclBhdGgoY29uZmlnLnJvb3QpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgd29ya2VyLnJ1bih0ZXJzZXJQYXRoLCBjb2RlLCB7XG4gICAgICAgICAgICAgICAgc2FmYXJpMTA6IHRydWUsXG4gICAgICAgICAgICAgICAgLi4uY29uZmlnLmJ1aWxkLnRlcnNlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgc291cmNlTWFwOiAhIW91dHB1dE9wdGlvbnMuc291cmNlbWFwLFxuICAgICAgICAgICAgICAgIG1vZHVsZTogb3V0cHV0T3B0aW9ucy5mb3JtYXQuc3RhcnRzV2l0aCgnZXMnKSxcbiAgICAgICAgICAgICAgICB0b3BsZXZlbDogb3V0cHV0T3B0aW9ucy5mb3JtYXQgPT09ICdjanMnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvZGU6IHJlcy5jb2RlLFxuICAgICAgICAgICAgICAgIG1hcDogcmVzLm1hcCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlQnVuZGxlKCkge1xuICAgICAgICAgICAgd29ya2VyPy5zdG9wKCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxudmFyIGpzb24gPSBKU09OO1xuXG52YXIgaXNBcnJheSQxID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeCkge1xuXHRyZXR1cm4ge30udG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuXHR2YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSB8fCBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xuXHR2YXIga2V5cyA9IFtdO1xuXHRmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG5cdFx0aWYgKGhhcy5jYWxsKG9iaiwga2V5KSkgeyBrZXlzLnB1c2goa2V5KTsgfVxuXHR9XG5cdHJldHVybiBrZXlzO1xufTtcblxudmFyIGpzb25TdGFibGVTdHJpbmdpZnkgPSBmdW5jdGlvbiAob2JqLCBvcHRzKSB7XG5cdGlmICghb3B0cykgeyBvcHRzID0ge307IH1cblx0aWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7IG9wdHMgPSB7IGNtcDogb3B0cyB9OyB9XG5cdHZhciBzcGFjZSA9IG9wdHMuc3BhY2UgfHwgJyc7XG5cdGlmICh0eXBlb2Ygc3BhY2UgPT09ICdudW1iZXInKSB7IHNwYWNlID0gQXJyYXkoc3BhY2UgKyAxKS5qb2luKCcgJyk7IH1cblx0dmFyIGN5Y2xlcyA9IHR5cGVvZiBvcHRzLmN5Y2xlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jeWNsZXMgOiBmYWxzZTtcblx0dmFyIHJlcGxhY2VyID0gb3B0cy5yZXBsYWNlciB8fCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cblx0dmFyIGNtcCA9IG9wdHMuY21wICYmIChmdW5jdGlvbiAoZikge1xuXHRcdHJldHVybiBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG5cdFx0XHRcdHZhciBhb2JqID0geyBrZXk6IGEsIHZhbHVlOiBub2RlW2FdIH07XG5cdFx0XHRcdHZhciBib2JqID0geyBrZXk6IGIsIHZhbHVlOiBub2RlW2JdIH07XG5cdFx0XHRcdHJldHVybiBmKGFvYmosIGJvYmopO1xuXHRcdFx0fTtcblx0XHR9O1xuXHR9KG9wdHMuY21wKSk7XG5cblx0dmFyIHNlZW4gPSBbXTtcblx0cmV0dXJuIChmdW5jdGlvbiBzdHJpbmdpZnkocGFyZW50LCBrZXksIG5vZGUsIGxldmVsKSB7XG5cdFx0dmFyIGluZGVudCA9IHNwYWNlID8gJ1xcbicgKyBuZXcgQXJyYXkobGV2ZWwgKyAxKS5qb2luKHNwYWNlKSA6ICcnO1xuXHRcdHZhciBjb2xvblNlcGFyYXRvciA9IHNwYWNlID8gJzogJyA6ICc6JztcblxuXHRcdGlmIChub2RlICYmIG5vZGUudG9KU09OICYmIHR5cGVvZiBub2RlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0bm9kZSA9IG5vZGUudG9KU09OKCk7XG5cdFx0fVxuXG5cdFx0bm9kZSA9IHJlcGxhY2VyLmNhbGwocGFyZW50LCBrZXksIG5vZGUpO1xuXG5cdFx0aWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnIHx8IG5vZGUgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBqc29uLnN0cmluZ2lmeShub2RlKTtcblx0XHR9XG5cdFx0aWYgKGlzQXJyYXkkMShub2RlKSkge1xuXHRcdFx0dmFyIG91dCA9IFtdO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBpdGVtID0gc3RyaW5naWZ5KG5vZGUsIGksIG5vZGVbaV0sIGxldmVsICsgMSkgfHwganNvbi5zdHJpbmdpZnkobnVsbCk7XG5cdFx0XHRcdG91dC5wdXNoKGluZGVudCArIHNwYWNlICsgaXRlbSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJ1snICsgb3V0LmpvaW4oJywnKSArIGluZGVudCArICddJztcblx0XHR9XG5cblx0XHRpZiAoc2Vlbi5pbmRleE9mKG5vZGUpICE9PSAtMSkge1xuXHRcdFx0aWYgKGN5Y2xlcykgeyByZXR1cm4ganNvbi5zdHJpbmdpZnkoJ19fY3ljbGVfXycpOyB9XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09OJyk7XG5cdFx0fSBlbHNlIHsgc2Vlbi5wdXNoKG5vZGUpOyB9XG5cblx0XHR2YXIga2V5cyA9IG9iamVjdEtleXMobm9kZSkuc29ydChjbXAgJiYgY21wKG5vZGUpKTtcblx0XHR2YXIgb3V0ID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIga2V5ID0ga2V5c1tpXTtcblx0XHRcdHZhciB2YWx1ZSA9IHN0cmluZ2lmeShub2RlLCBrZXksIG5vZGVba2V5XSwgbGV2ZWwgKyAxKTtcblxuXHRcdFx0aWYgKCF2YWx1ZSkgeyBjb250aW51ZTsgfVxuXG5cdFx0XHR2YXIga2V5VmFsdWUgPSBqc29uLnN0cmluZ2lmeShrZXkpXG5cdFx0XHRcdFx0KyBjb2xvblNlcGFyYXRvclxuXHRcdFx0XHRcdCsgdmFsdWU7XG5cblx0XHRcdG91dC5wdXNoKGluZGVudCArIHNwYWNlICsga2V5VmFsdWUpO1xuXHRcdH1cblx0XHRzZWVuLnNwbGljZShzZWVuLmluZGV4T2Yobm9kZSksIDEpO1xuXHRcdHJldHVybiAneycgKyBvdXQuam9pbignLCcpICsgaW5kZW50ICsgJ30nO1xuXG5cdH0oeyAnJzogb2JqIH0sICcnLCBvYmosIDApKTtcbn07XG5cbmNvbnN0IG1pbWVzJDEgPSB7XG4gIFwiZXpcIjogXCJhcHBsaWNhdGlvbi9hbmRyZXctaW5zZXRcIixcbiAgXCJhd1wiOiBcImFwcGxpY2F0aW9uL2FwcGxpeHdhcmVcIixcbiAgXCJhdG9tXCI6IFwiYXBwbGljYXRpb24vYXRvbSt4bWxcIixcbiAgXCJhdG9tY2F0XCI6IFwiYXBwbGljYXRpb24vYXRvbWNhdCt4bWxcIixcbiAgXCJhdG9tZGVsZXRlZFwiOiBcImFwcGxpY2F0aW9uL2F0b21kZWxldGVkK3htbFwiLFxuICBcImF0b21zdmNcIjogXCJhcHBsaWNhdGlvbi9hdG9tc3ZjK3htbFwiLFxuICBcImR3ZFwiOiBcImFwcGxpY2F0aW9uL2F0c2MtZHdkK3htbFwiLFxuICBcImhlbGRcIjogXCJhcHBsaWNhdGlvbi9hdHNjLWhlbGQreG1sXCIsXG4gIFwicnNhdFwiOiBcImFwcGxpY2F0aW9uL2F0c2MtcnNhdCt4bWxcIixcbiAgXCJiZG9jXCI6IFwiYXBwbGljYXRpb24vYmRvY1wiLFxuICBcInhjc1wiOiBcImFwcGxpY2F0aW9uL2NhbGVuZGFyK3htbFwiLFxuICBcImNjeG1sXCI6IFwiYXBwbGljYXRpb24vY2N4bWwreG1sXCIsXG4gIFwiY2RmeFwiOiBcImFwcGxpY2F0aW9uL2NkZngreG1sXCIsXG4gIFwiY2RtaWFcIjogXCJhcHBsaWNhdGlvbi9jZG1pLWNhcGFiaWxpdHlcIixcbiAgXCJjZG1pY1wiOiBcImFwcGxpY2F0aW9uL2NkbWktY29udGFpbmVyXCIsXG4gIFwiY2RtaWRcIjogXCJhcHBsaWNhdGlvbi9jZG1pLWRvbWFpblwiLFxuICBcImNkbWlvXCI6IFwiYXBwbGljYXRpb24vY2RtaS1vYmplY3RcIixcbiAgXCJjZG1pcVwiOiBcImFwcGxpY2F0aW9uL2NkbWktcXVldWVcIixcbiAgXCJjdVwiOiBcImFwcGxpY2F0aW9uL2N1LXNlZW1lXCIsXG4gIFwibXBkXCI6IFwiYXBwbGljYXRpb24vZGFzaCt4bWxcIixcbiAgXCJkYXZtb3VudFwiOiBcImFwcGxpY2F0aW9uL2Rhdm1vdW50K3htbFwiLFxuICBcImRia1wiOiBcImFwcGxpY2F0aW9uL2RvY2Jvb2sreG1sXCIsXG4gIFwiZHNzY1wiOiBcImFwcGxpY2F0aW9uL2Rzc2MrZGVyXCIsXG4gIFwieGRzc2NcIjogXCJhcHBsaWNhdGlvbi9kc3NjK3htbFwiLFxuICBcImVzXCI6IFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdFwiLFxuICBcImVjbWFcIjogXCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0XCIsXG4gIFwiZW1tYVwiOiBcImFwcGxpY2F0aW9uL2VtbWEreG1sXCIsXG4gIFwiZW1vdGlvbm1sXCI6IFwiYXBwbGljYXRpb24vZW1vdGlvbm1sK3htbFwiLFxuICBcImVwdWJcIjogXCJhcHBsaWNhdGlvbi9lcHViK3ppcFwiLFxuICBcImV4aVwiOiBcImFwcGxpY2F0aW9uL2V4aVwiLFxuICBcImZkdFwiOiBcImFwcGxpY2F0aW9uL2ZkdCt4bWxcIixcbiAgXCJwZnJcIjogXCJhcHBsaWNhdGlvbi9mb250LXRkcGZyXCIsXG4gIFwiZ2VvanNvblwiOiBcImFwcGxpY2F0aW9uL2dlbytqc29uXCIsXG4gIFwiZ21sXCI6IFwiYXBwbGljYXRpb24vZ21sK3htbFwiLFxuICBcImdweFwiOiBcImFwcGxpY2F0aW9uL2dweCt4bWxcIixcbiAgXCJneGZcIjogXCJhcHBsaWNhdGlvbi9neGZcIixcbiAgXCJnelwiOiBcImFwcGxpY2F0aW9uL2d6aXBcIixcbiAgXCJoanNvblwiOiBcImFwcGxpY2F0aW9uL2hqc29uXCIsXG4gIFwic3RrXCI6IFwiYXBwbGljYXRpb24vaHlwZXJzdHVkaW9cIixcbiAgXCJpbmtcIjogXCJhcHBsaWNhdGlvbi9pbmttbCt4bWxcIixcbiAgXCJpbmttbFwiOiBcImFwcGxpY2F0aW9uL2lua21sK3htbFwiLFxuICBcImlwZml4XCI6IFwiYXBwbGljYXRpb24vaXBmaXhcIixcbiAgXCJpdHNcIjogXCJhcHBsaWNhdGlvbi9pdHMreG1sXCIsXG4gIFwiamFyXCI6IFwiYXBwbGljYXRpb24vamF2YS1hcmNoaXZlXCIsXG4gIFwid2FyXCI6IFwiYXBwbGljYXRpb24vamF2YS1hcmNoaXZlXCIsXG4gIFwiZWFyXCI6IFwiYXBwbGljYXRpb24vamF2YS1hcmNoaXZlXCIsXG4gIFwic2VyXCI6IFwiYXBwbGljYXRpb24vamF2YS1zZXJpYWxpemVkLW9iamVjdFwiLFxuICBcImNsYXNzXCI6IFwiYXBwbGljYXRpb24vamF2YS12bVwiLFxuICBcImpzXCI6IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiLFxuICBcIm1qc1wiOiBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIixcbiAgXCJqc29uXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICBcIm1hcFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgXCJqc29uNVwiOiBcImFwcGxpY2F0aW9uL2pzb241XCIsXG4gIFwianNvbm1sXCI6IFwiYXBwbGljYXRpb24vanNvbm1sK2pzb25cIixcbiAgXCJqc29ubGRcIjogXCJhcHBsaWNhdGlvbi9sZCtqc29uXCIsXG4gIFwibGdyXCI6IFwiYXBwbGljYXRpb24vbGdyK3htbFwiLFxuICBcImxvc3R4bWxcIjogXCJhcHBsaWNhdGlvbi9sb3N0K3htbFwiLFxuICBcImhxeFwiOiBcImFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MFwiLFxuICBcImNwdFwiOiBcImFwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvXCIsXG4gIFwibWFkc1wiOiBcImFwcGxpY2F0aW9uL21hZHMreG1sXCIsXG4gIFwid2VibWFuaWZlc3RcIjogXCJhcHBsaWNhdGlvbi9tYW5pZmVzdCtqc29uXCIsXG4gIFwibXJjXCI6IFwiYXBwbGljYXRpb24vbWFyY1wiLFxuICBcIm1yY3hcIjogXCJhcHBsaWNhdGlvbi9tYXJjeG1sK3htbFwiLFxuICBcIm1hXCI6IFwiYXBwbGljYXRpb24vbWF0aGVtYXRpY2FcIixcbiAgXCJuYlwiOiBcImFwcGxpY2F0aW9uL21hdGhlbWF0aWNhXCIsXG4gIFwibWJcIjogXCJhcHBsaWNhdGlvbi9tYXRoZW1hdGljYVwiLFxuICBcIm1hdGhtbFwiOiBcImFwcGxpY2F0aW9uL21hdGhtbCt4bWxcIixcbiAgXCJtYm94XCI6IFwiYXBwbGljYXRpb24vbWJveFwiLFxuICBcIm1zY21sXCI6IFwiYXBwbGljYXRpb24vbWVkaWFzZXJ2ZXJjb250cm9sK3htbFwiLFxuICBcIm1ldGFsaW5rXCI6IFwiYXBwbGljYXRpb24vbWV0YWxpbmsreG1sXCIsXG4gIFwibWV0YTRcIjogXCJhcHBsaWNhdGlvbi9tZXRhbGluazQreG1sXCIsXG4gIFwibWV0c1wiOiBcImFwcGxpY2F0aW9uL21ldHMreG1sXCIsXG4gIFwibWFlaVwiOiBcImFwcGxpY2F0aW9uL21tdC1hZWkreG1sXCIsXG4gIFwibXVzZFwiOiBcImFwcGxpY2F0aW9uL21tdC11c2QreG1sXCIsXG4gIFwibW9kc1wiOiBcImFwcGxpY2F0aW9uL21vZHMreG1sXCIsXG4gIFwibTIxXCI6IFwiYXBwbGljYXRpb24vbXAyMVwiLFxuICBcIm1wMjFcIjogXCJhcHBsaWNhdGlvbi9tcDIxXCIsXG4gIFwibXA0c1wiOiBcImFwcGxpY2F0aW9uL21wNFwiLFxuICBcIm00cFwiOiBcImFwcGxpY2F0aW9uL21wNFwiLFxuICBcImRvY1wiOiBcImFwcGxpY2F0aW9uL21zd29yZFwiLFxuICBcImRvdFwiOiBcImFwcGxpY2F0aW9uL21zd29yZFwiLFxuICBcIm14ZlwiOiBcImFwcGxpY2F0aW9uL214ZlwiLFxuICBcIm5xXCI6IFwiYXBwbGljYXRpb24vbi1xdWFkc1wiLFxuICBcIm50XCI6IFwiYXBwbGljYXRpb24vbi10cmlwbGVzXCIsXG4gIFwiY2pzXCI6IFwiYXBwbGljYXRpb24vbm9kZVwiLFxuICBcImJpblwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImRtc1wiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImxyZlwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcIm1hclwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcInNvXCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gIFwiZGlzdFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImRpc3R6XCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gIFwicGtnXCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gIFwiYnBrXCI6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gIFwiZHVtcFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImVsY1wiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImRlcGxveVwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImV4ZVwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImRsbFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImRlYlwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImRtZ1wiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImlzb1wiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImltZ1wiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcIm1zaVwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcIm1zcFwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcIm1zbVwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcImJ1ZmZlclwiOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICBcIm9kYVwiOiBcImFwcGxpY2F0aW9uL29kYVwiLFxuICBcIm9wZlwiOiBcImFwcGxpY2F0aW9uL29lYnBzLXBhY2thZ2UreG1sXCIsXG4gIFwib2d4XCI6IFwiYXBwbGljYXRpb24vb2dnXCIsXG4gIFwib21kb2NcIjogXCJhcHBsaWNhdGlvbi9vbWRvYyt4bWxcIixcbiAgXCJvbmV0b2NcIjogXCJhcHBsaWNhdGlvbi9vbmVub3RlXCIsXG4gIFwib25ldG9jMlwiOiBcImFwcGxpY2F0aW9uL29uZW5vdGVcIixcbiAgXCJvbmV0bXBcIjogXCJhcHBsaWNhdGlvbi9vbmVub3RlXCIsXG4gIFwib25lcGtnXCI6IFwiYXBwbGljYXRpb24vb25lbm90ZVwiLFxuICBcIm94cHNcIjogXCJhcHBsaWNhdGlvbi9veHBzXCIsXG4gIFwicmVsb1wiOiBcImFwcGxpY2F0aW9uL3AycC1vdmVybGF5K3htbFwiLFxuICBcInhlclwiOiBcImFwcGxpY2F0aW9uL3BhdGNoLW9wcy1lcnJvcit4bWxcIixcbiAgXCJwZGZcIjogXCJhcHBsaWNhdGlvbi9wZGZcIixcbiAgXCJwZ3BcIjogXCJhcHBsaWNhdGlvbi9wZ3AtZW5jcnlwdGVkXCIsXG4gIFwiYXNjXCI6IFwiYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZVwiLFxuICBcInNpZ1wiOiBcImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmVcIixcbiAgXCJwcmZcIjogXCJhcHBsaWNhdGlvbi9waWNzLXJ1bGVzXCIsXG4gIFwicDEwXCI6IFwiYXBwbGljYXRpb24vcGtjczEwXCIsXG4gIFwicDdtXCI6IFwiYXBwbGljYXRpb24vcGtjczctbWltZVwiLFxuICBcInA3Y1wiOiBcImFwcGxpY2F0aW9uL3BrY3M3LW1pbWVcIixcbiAgXCJwN3NcIjogXCJhcHBsaWNhdGlvbi9wa2NzNy1zaWduYXR1cmVcIixcbiAgXCJwOFwiOiBcImFwcGxpY2F0aW9uL3BrY3M4XCIsXG4gIFwiYWNcIjogXCJhcHBsaWNhdGlvbi9wa2l4LWF0dHItY2VydFwiLFxuICBcImNlclwiOiBcImFwcGxpY2F0aW9uL3BraXgtY2VydFwiLFxuICBcImNybFwiOiBcImFwcGxpY2F0aW9uL3BraXgtY3JsXCIsXG4gIFwicGtpcGF0aFwiOiBcImFwcGxpY2F0aW9uL3BraXgtcGtpcGF0aFwiLFxuICBcInBraVwiOiBcImFwcGxpY2F0aW9uL3BraXhjbXBcIixcbiAgXCJwbHNcIjogXCJhcHBsaWNhdGlvbi9wbHMreG1sXCIsXG4gIFwiYWlcIjogXCJhcHBsaWNhdGlvbi9wb3N0c2NyaXB0XCIsXG4gIFwiZXBzXCI6IFwiYXBwbGljYXRpb24vcG9zdHNjcmlwdFwiLFxuICBcInBzXCI6IFwiYXBwbGljYXRpb24vcG9zdHNjcmlwdFwiLFxuICBcInByb3Z4XCI6IFwiYXBwbGljYXRpb24vcHJvdmVuYW5jZSt4bWxcIixcbiAgXCJjd3dcIjogXCJhcHBsaWNhdGlvbi9wcnMuY3d3XCIsXG4gIFwicHNrY3htbFwiOiBcImFwcGxpY2F0aW9uL3Bza2MreG1sXCIsXG4gIFwicmFtbFwiOiBcImFwcGxpY2F0aW9uL3JhbWwreWFtbFwiLFxuICBcInJkZlwiOiBcImFwcGxpY2F0aW9uL3JkZit4bWxcIixcbiAgXCJvd2xcIjogXCJhcHBsaWNhdGlvbi9yZGYreG1sXCIsXG4gIFwicmlmXCI6IFwiYXBwbGljYXRpb24vcmVnaW5mbyt4bWxcIixcbiAgXCJybmNcIjogXCJhcHBsaWNhdGlvbi9yZWxheC1uZy1jb21wYWN0LXN5bnRheFwiLFxuICBcInJsXCI6IFwiYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMreG1sXCIsXG4gIFwicmxkXCI6IFwiYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMtZGlmZit4bWxcIixcbiAgXCJyc1wiOiBcImFwcGxpY2F0aW9uL3Jscy1zZXJ2aWNlcyt4bWxcIixcbiAgXCJyYXBkXCI6IFwiYXBwbGljYXRpb24vcm91dGUtYXBkK3htbFwiLFxuICBcInNsc1wiOiBcImFwcGxpY2F0aW9uL3JvdXRlLXMtdHNpZCt4bWxcIixcbiAgXCJydXNkXCI6IFwiYXBwbGljYXRpb24vcm91dGUtdXNkK3htbFwiLFxuICBcImdiclwiOiBcImFwcGxpY2F0aW9uL3Jwa2ktZ2hvc3RidXN0ZXJzXCIsXG4gIFwibWZ0XCI6IFwiYXBwbGljYXRpb24vcnBraS1tYW5pZmVzdFwiLFxuICBcInJvYVwiOiBcImFwcGxpY2F0aW9uL3Jwa2ktcm9hXCIsXG4gIFwicnNkXCI6IFwiYXBwbGljYXRpb24vcnNkK3htbFwiLFxuICBcInJzc1wiOiBcImFwcGxpY2F0aW9uL3Jzcyt4bWxcIixcbiAgXCJydGZcIjogXCJhcHBsaWNhdGlvbi9ydGZcIixcbiAgXCJzYm1sXCI6IFwiYXBwbGljYXRpb24vc2JtbCt4bWxcIixcbiAgXCJzY3FcIjogXCJhcHBsaWNhdGlvbi9zY3ZwLWN2LXJlcXVlc3RcIixcbiAgXCJzY3NcIjogXCJhcHBsaWNhdGlvbi9zY3ZwLWN2LXJlc3BvbnNlXCIsXG4gIFwic3BxXCI6IFwiYXBwbGljYXRpb24vc2N2cC12cC1yZXF1ZXN0XCIsXG4gIFwic3BwXCI6IFwiYXBwbGljYXRpb24vc2N2cC12cC1yZXNwb25zZVwiLFxuICBcInNkcFwiOiBcImFwcGxpY2F0aW9uL3NkcFwiLFxuICBcInNlbm1seFwiOiBcImFwcGxpY2F0aW9uL3Nlbm1sK3htbFwiLFxuICBcInNlbnNtbHhcIjogXCJhcHBsaWNhdGlvbi9zZW5zbWwreG1sXCIsXG4gIFwic2V0cGF5XCI6IFwiYXBwbGljYXRpb24vc2V0LXBheW1lbnQtaW5pdGlhdGlvblwiLFxuICBcInNldHJlZ1wiOiBcImFwcGxpY2F0aW9uL3NldC1yZWdpc3RyYXRpb24taW5pdGlhdGlvblwiLFxuICBcInNoZlwiOiBcImFwcGxpY2F0aW9uL3NoZit4bWxcIixcbiAgXCJzaXZcIjogXCJhcHBsaWNhdGlvbi9zaWV2ZVwiLFxuICBcInNpZXZlXCI6IFwiYXBwbGljYXRpb24vc2lldmVcIixcbiAgXCJzbWlcIjogXCJhcHBsaWNhdGlvbi9zbWlsK3htbFwiLFxuICBcInNtaWxcIjogXCJhcHBsaWNhdGlvbi9zbWlsK3htbFwiLFxuICBcInJxXCI6IFwiYXBwbGljYXRpb24vc3BhcnFsLXF1ZXJ5XCIsXG4gIFwic3J4XCI6IFwiYXBwbGljYXRpb24vc3BhcnFsLXJlc3VsdHMreG1sXCIsXG4gIFwiZ3JhbVwiOiBcImFwcGxpY2F0aW9uL3NyZ3NcIixcbiAgXCJncnhtbFwiOiBcImFwcGxpY2F0aW9uL3NyZ3MreG1sXCIsXG4gIFwic3J1XCI6IFwiYXBwbGljYXRpb24vc3J1K3htbFwiLFxuICBcInNzZGxcIjogXCJhcHBsaWNhdGlvbi9zc2RsK3htbFwiLFxuICBcInNzbWxcIjogXCJhcHBsaWNhdGlvbi9zc21sK3htbFwiLFxuICBcInN3aWR0YWdcIjogXCJhcHBsaWNhdGlvbi9zd2lkK3htbFwiLFxuICBcInRlaVwiOiBcImFwcGxpY2F0aW9uL3RlaSt4bWxcIixcbiAgXCJ0ZWljb3JwdXNcIjogXCJhcHBsaWNhdGlvbi90ZWkreG1sXCIsXG4gIFwidGZpXCI6IFwiYXBwbGljYXRpb24vdGhyYXVkK3htbFwiLFxuICBcInRzZFwiOiBcImFwcGxpY2F0aW9uL3RpbWVzdGFtcGVkLWRhdGFcIixcbiAgXCJ0b21sXCI6IFwiYXBwbGljYXRpb24vdG9tbFwiLFxuICBcInRyaWdcIjogXCJhcHBsaWNhdGlvbi90cmlnXCIsXG4gIFwidHRtbFwiOiBcImFwcGxpY2F0aW9uL3R0bWwreG1sXCIsXG4gIFwidWJqXCI6IFwiYXBwbGljYXRpb24vdWJqc29uXCIsXG4gIFwicnNoZWV0XCI6IFwiYXBwbGljYXRpb24vdXJjLXJlc3NoZWV0K3htbFwiLFxuICBcInRkXCI6IFwiYXBwbGljYXRpb24vdXJjLXRhcmdldGRlc2MreG1sXCIsXG4gIFwidnhtbFwiOiBcImFwcGxpY2F0aW9uL3ZvaWNleG1sK3htbFwiLFxuICBcIndhc21cIjogXCJhcHBsaWNhdGlvbi93YXNtXCIsXG4gIFwid2d0XCI6IFwiYXBwbGljYXRpb24vd2lkZ2V0XCIsXG4gIFwiaGxwXCI6IFwiYXBwbGljYXRpb24vd2luaGxwXCIsXG4gIFwid3NkbFwiOiBcImFwcGxpY2F0aW9uL3dzZGwreG1sXCIsXG4gIFwid3Nwb2xpY3lcIjogXCJhcHBsaWNhdGlvbi93c3BvbGljeSt4bWxcIixcbiAgXCJ4YW1sXCI6IFwiYXBwbGljYXRpb24veGFtbCt4bWxcIixcbiAgXCJ4YXZcIjogXCJhcHBsaWNhdGlvbi94Y2FwLWF0dCt4bWxcIixcbiAgXCJ4Y2FcIjogXCJhcHBsaWNhdGlvbi94Y2FwLWNhcHMreG1sXCIsXG4gIFwieGRmXCI6IFwiYXBwbGljYXRpb24veGNhcC1kaWZmK3htbFwiLFxuICBcInhlbFwiOiBcImFwcGxpY2F0aW9uL3hjYXAtZWwreG1sXCIsXG4gIFwieG5zXCI6IFwiYXBwbGljYXRpb24veGNhcC1ucyt4bWxcIixcbiAgXCJ4ZW5jXCI6IFwiYXBwbGljYXRpb24veGVuYyt4bWxcIixcbiAgXCJ4aHRtbFwiOiBcImFwcGxpY2F0aW9uL3hodG1sK3htbFwiLFxuICBcInhodFwiOiBcImFwcGxpY2F0aW9uL3hodG1sK3htbFwiLFxuICBcInhsZlwiOiBcImFwcGxpY2F0aW9uL3hsaWZmK3htbFwiLFxuICBcInhtbFwiOiBcImFwcGxpY2F0aW9uL3htbFwiLFxuICBcInhzbFwiOiBcImFwcGxpY2F0aW9uL3htbFwiLFxuICBcInhzZFwiOiBcImFwcGxpY2F0aW9uL3htbFwiLFxuICBcInJuZ1wiOiBcImFwcGxpY2F0aW9uL3htbFwiLFxuICBcImR0ZFwiOiBcImFwcGxpY2F0aW9uL3htbC1kdGRcIixcbiAgXCJ4b3BcIjogXCJhcHBsaWNhdGlvbi94b3AreG1sXCIsXG4gIFwieHBsXCI6IFwiYXBwbGljYXRpb24veHByb2MreG1sXCIsXG4gIFwieHNsdFwiOiBcImFwcGxpY2F0aW9uL3htbFwiLFxuICBcInhzcGZcIjogXCJhcHBsaWNhdGlvbi94c3BmK3htbFwiLFxuICBcIm14bWxcIjogXCJhcHBsaWNhdGlvbi94dit4bWxcIixcbiAgXCJ4aHZtbFwiOiBcImFwcGxpY2F0aW9uL3h2K3htbFwiLFxuICBcInh2bWxcIjogXCJhcHBsaWNhdGlvbi94dit4bWxcIixcbiAgXCJ4dm1cIjogXCJhcHBsaWNhdGlvbi94dit4bWxcIixcbiAgXCJ5YW5nXCI6IFwiYXBwbGljYXRpb24veWFuZ1wiLFxuICBcInlpblwiOiBcImFwcGxpY2F0aW9uL3lpbit4bWxcIixcbiAgXCJ6aXBcIjogXCJhcHBsaWNhdGlvbi96aXBcIixcbiAgXCIzZ3BwXCI6IFwidmlkZW8vM2dwcFwiLFxuICBcImFkcFwiOiBcImF1ZGlvL2FkcGNtXCIsXG4gIFwiYW1yXCI6IFwiYXVkaW8vYW1yXCIsXG4gIFwiYXVcIjogXCJhdWRpby9iYXNpY1wiLFxuICBcInNuZFwiOiBcImF1ZGlvL2Jhc2ljXCIsXG4gIFwibWlkXCI6IFwiYXVkaW8vbWlkaVwiLFxuICBcIm1pZGlcIjogXCJhdWRpby9taWRpXCIsXG4gIFwia2FyXCI6IFwiYXVkaW8vbWlkaVwiLFxuICBcInJtaVwiOiBcImF1ZGlvL21pZGlcIixcbiAgXCJteG1mXCI6IFwiYXVkaW8vbW9iaWxlLXhtZlwiLFxuICBcIm1wM1wiOiBcImF1ZGlvL21wZWdcIixcbiAgXCJtNGFcIjogXCJhdWRpby9tcDRcIixcbiAgXCJtcDRhXCI6IFwiYXVkaW8vbXA0XCIsXG4gIFwibXBnYVwiOiBcImF1ZGlvL21wZWdcIixcbiAgXCJtcDJcIjogXCJhdWRpby9tcGVnXCIsXG4gIFwibXAyYVwiOiBcImF1ZGlvL21wZWdcIixcbiAgXCJtMmFcIjogXCJhdWRpby9tcGVnXCIsXG4gIFwibTNhXCI6IFwiYXVkaW8vbXBlZ1wiLFxuICBcIm9nYVwiOiBcImF1ZGlvL29nZ1wiLFxuICBcIm9nZ1wiOiBcImF1ZGlvL29nZ1wiLFxuICBcInNweFwiOiBcImF1ZGlvL29nZ1wiLFxuICBcIm9wdXNcIjogXCJhdWRpby9vZ2dcIixcbiAgXCJzM21cIjogXCJhdWRpby9zM21cIixcbiAgXCJzaWxcIjogXCJhdWRpby9zaWxrXCIsXG4gIFwid2F2XCI6IFwiYXVkaW8vd2F2XCIsXG4gIFwid2ViYVwiOiBcImF1ZGlvL3dlYm1cIixcbiAgXCJ4bVwiOiBcImF1ZGlvL3htXCIsXG4gIFwidHRjXCI6IFwiZm9udC9jb2xsZWN0aW9uXCIsXG4gIFwib3RmXCI6IFwiZm9udC9vdGZcIixcbiAgXCJ0dGZcIjogXCJmb250L3R0ZlwiLFxuICBcIndvZmZcIjogXCJmb250L3dvZmZcIixcbiAgXCJ3b2ZmMlwiOiBcImZvbnQvd29mZjJcIixcbiAgXCJleHJcIjogXCJpbWFnZS9hY2VzXCIsXG4gIFwiYXBuZ1wiOiBcImltYWdlL2FwbmdcIixcbiAgXCJhdmlmXCI6IFwiaW1hZ2UvYXZpZlwiLFxuICBcImJtcFwiOiBcImltYWdlL2JtcFwiLFxuICBcImNnbVwiOiBcImltYWdlL2NnbVwiLFxuICBcImRybGVcIjogXCJpbWFnZS9kaWNvbS1ybGVcIixcbiAgXCJlbWZcIjogXCJpbWFnZS9lbWZcIixcbiAgXCJmaXRzXCI6IFwiaW1hZ2UvZml0c1wiLFxuICBcImczXCI6IFwiaW1hZ2UvZzNmYXhcIixcbiAgXCJnaWZcIjogXCJpbWFnZS9naWZcIixcbiAgXCJoZWljXCI6IFwiaW1hZ2UvaGVpY1wiLFxuICBcImhlaWNzXCI6IFwiaW1hZ2UvaGVpYy1zZXF1ZW5jZVwiLFxuICBcImhlaWZcIjogXCJpbWFnZS9oZWlmXCIsXG4gIFwiaGVpZnNcIjogXCJpbWFnZS9oZWlmLXNlcXVlbmNlXCIsXG4gIFwiaGVqMlwiOiBcImltYWdlL2hlajJrXCIsXG4gIFwiaHNqMlwiOiBcImltYWdlL2hzajJcIixcbiAgXCJpZWZcIjogXCJpbWFnZS9pZWZcIixcbiAgXCJqbHNcIjogXCJpbWFnZS9qbHNcIixcbiAgXCJqcDJcIjogXCJpbWFnZS9qcDJcIixcbiAgXCJqcGcyXCI6IFwiaW1hZ2UvanAyXCIsXG4gIFwianBlZ1wiOiBcImltYWdlL2pwZWdcIixcbiAgXCJqcGdcIjogXCJpbWFnZS9qcGVnXCIsXG4gIFwianBlXCI6IFwiaW1hZ2UvanBlZ1wiLFxuICBcImpwaFwiOiBcImltYWdlL2pwaFwiLFxuICBcImpoY1wiOiBcImltYWdlL2pwaGNcIixcbiAgXCJqcG1cIjogXCJpbWFnZS9qcG1cIixcbiAgXCJqcHhcIjogXCJpbWFnZS9qcHhcIixcbiAgXCJqcGZcIjogXCJpbWFnZS9qcHhcIixcbiAgXCJqeHJcIjogXCJpbWFnZS9qeHJcIixcbiAgXCJqeHJhXCI6IFwiaW1hZ2UvanhyYVwiLFxuICBcImp4cnNcIjogXCJpbWFnZS9qeHJzXCIsXG4gIFwianhzXCI6IFwiaW1hZ2UvanhzXCIsXG4gIFwianhzY1wiOiBcImltYWdlL2p4c2NcIixcbiAgXCJqeHNpXCI6IFwiaW1hZ2UvanhzaVwiLFxuICBcImp4c3NcIjogXCJpbWFnZS9qeHNzXCIsXG4gIFwia3R4XCI6IFwiaW1hZ2Uva3R4XCIsXG4gIFwia3R4MlwiOiBcImltYWdlL2t0eDJcIixcbiAgXCJwbmdcIjogXCJpbWFnZS9wbmdcIixcbiAgXCJidGlmXCI6IFwiaW1hZ2UvcHJzLmJ0aWZcIixcbiAgXCJwdGlcIjogXCJpbWFnZS9wcnMucHRpXCIsXG4gIFwic2dpXCI6IFwiaW1hZ2Uvc2dpXCIsXG4gIFwic3ZnXCI6IFwiaW1hZ2Uvc3ZnK3htbFwiLFxuICBcInN2Z3pcIjogXCJpbWFnZS9zdmcreG1sXCIsXG4gIFwidDM4XCI6IFwiaW1hZ2UvdDM4XCIsXG4gIFwidGlmXCI6IFwiaW1hZ2UvdGlmZlwiLFxuICBcInRpZmZcIjogXCJpbWFnZS90aWZmXCIsXG4gIFwidGZ4XCI6IFwiaW1hZ2UvdGlmZi1meFwiLFxuICBcIndlYnBcIjogXCJpbWFnZS93ZWJwXCIsXG4gIFwid21mXCI6IFwiaW1hZ2Uvd21mXCIsXG4gIFwiZGlzcG9zaXRpb24tbm90aWZpY2F0aW9uXCI6IFwibWVzc2FnZS9kaXNwb3NpdGlvbi1ub3RpZmljYXRpb25cIixcbiAgXCJ1OG1zZ1wiOiBcIm1lc3NhZ2UvZ2xvYmFsXCIsXG4gIFwidThkc25cIjogXCJtZXNzYWdlL2dsb2JhbC1kZWxpdmVyeS1zdGF0dXNcIixcbiAgXCJ1OG1kblwiOiBcIm1lc3NhZ2UvZ2xvYmFsLWRpc3Bvc2l0aW9uLW5vdGlmaWNhdGlvblwiLFxuICBcInU4aGRyXCI6IFwibWVzc2FnZS9nbG9iYWwtaGVhZGVyc1wiLFxuICBcImVtbFwiOiBcIm1lc3NhZ2UvcmZjODIyXCIsXG4gIFwibWltZVwiOiBcIm1lc3NhZ2UvcmZjODIyXCIsXG4gIFwiM21mXCI6IFwibW9kZWwvM21mXCIsXG4gIFwiZ2x0ZlwiOiBcIm1vZGVsL2dsdGYranNvblwiLFxuICBcImdsYlwiOiBcIm1vZGVsL2dsdGYtYmluYXJ5XCIsXG4gIFwiaWdzXCI6IFwibW9kZWwvaWdlc1wiLFxuICBcImlnZXNcIjogXCJtb2RlbC9pZ2VzXCIsXG4gIFwibXNoXCI6IFwibW9kZWwvbWVzaFwiLFxuICBcIm1lc2hcIjogXCJtb2RlbC9tZXNoXCIsXG4gIFwic2lsb1wiOiBcIm1vZGVsL21lc2hcIixcbiAgXCJtdGxcIjogXCJtb2RlbC9tdGxcIixcbiAgXCJvYmpcIjogXCJtb2RlbC9vYmpcIixcbiAgXCJzdHB6XCI6IFwibW9kZWwvc3RlcCt6aXBcIixcbiAgXCJzdHB4elwiOiBcIm1vZGVsL3N0ZXAteG1sK3ppcFwiLFxuICBcInN0bFwiOiBcIm1vZGVsL3N0bFwiLFxuICBcIndybFwiOiBcIm1vZGVsL3ZybWxcIixcbiAgXCJ2cm1sXCI6IFwibW9kZWwvdnJtbFwiLFxuICBcIngzZGJcIjogXCJtb2RlbC94M2QrZmFzdGluZm9zZXRcIixcbiAgXCJ4M2RielwiOiBcIm1vZGVsL3gzZCtiaW5hcnlcIixcbiAgXCJ4M2R2XCI6IFwibW9kZWwveDNkLXZybWxcIixcbiAgXCJ4M2R2elwiOiBcIm1vZGVsL3gzZCt2cm1sXCIsXG4gIFwieDNkXCI6IFwibW9kZWwveDNkK3htbFwiLFxuICBcIngzZHpcIjogXCJtb2RlbC94M2QreG1sXCIsXG4gIFwiYXBwY2FjaGVcIjogXCJ0ZXh0L2NhY2hlLW1hbmlmZXN0XCIsXG4gIFwibWFuaWZlc3RcIjogXCJ0ZXh0L2NhY2hlLW1hbmlmZXN0XCIsXG4gIFwiaWNzXCI6IFwidGV4dC9jYWxlbmRhclwiLFxuICBcImlmYlwiOiBcInRleHQvY2FsZW5kYXJcIixcbiAgXCJjb2ZmZWVcIjogXCJ0ZXh0L2NvZmZlZXNjcmlwdFwiLFxuICBcImxpdGNvZmZlZVwiOiBcInRleHQvY29mZmVlc2NyaXB0XCIsXG4gIFwiY3NzXCI6IFwidGV4dC9jc3NcIixcbiAgXCJjc3ZcIjogXCJ0ZXh0L2NzdlwiLFxuICBcImh0bWxcIjogXCJ0ZXh0L2h0bWxcIixcbiAgXCJodG1cIjogXCJ0ZXh0L2h0bWxcIixcbiAgXCJzaHRtbFwiOiBcInRleHQvaHRtbFwiLFxuICBcImphZGVcIjogXCJ0ZXh0L2phZGVcIixcbiAgXCJqc3hcIjogXCJ0ZXh0L2pzeFwiLFxuICBcImxlc3NcIjogXCJ0ZXh0L2xlc3NcIixcbiAgXCJtYXJrZG93blwiOiBcInRleHQvbWFya2Rvd25cIixcbiAgXCJtZFwiOiBcInRleHQvbWFya2Rvd25cIixcbiAgXCJtbWxcIjogXCJ0ZXh0L21hdGhtbFwiLFxuICBcIm1keFwiOiBcInRleHQvbWR4XCIsXG4gIFwibjNcIjogXCJ0ZXh0L24zXCIsXG4gIFwidHh0XCI6IFwidGV4dC9wbGFpblwiLFxuICBcInRleHRcIjogXCJ0ZXh0L3BsYWluXCIsXG4gIFwiY29uZlwiOiBcInRleHQvcGxhaW5cIixcbiAgXCJkZWZcIjogXCJ0ZXh0L3BsYWluXCIsXG4gIFwibGlzdFwiOiBcInRleHQvcGxhaW5cIixcbiAgXCJsb2dcIjogXCJ0ZXh0L3BsYWluXCIsXG4gIFwiaW5cIjogXCJ0ZXh0L3BsYWluXCIsXG4gIFwiaW5pXCI6IFwidGV4dC9wbGFpblwiLFxuICBcImRzY1wiOiBcInRleHQvcHJzLmxpbmVzLnRhZ1wiLFxuICBcInJ0eFwiOiBcInRleHQvcmljaHRleHRcIixcbiAgXCJzZ21sXCI6IFwidGV4dC9zZ21sXCIsXG4gIFwic2dtXCI6IFwidGV4dC9zZ21sXCIsXG4gIFwic2hleFwiOiBcInRleHQvc2hleFwiLFxuICBcInNsaW1cIjogXCJ0ZXh0L3NsaW1cIixcbiAgXCJzbG1cIjogXCJ0ZXh0L3NsaW1cIixcbiAgXCJzcGR4XCI6IFwidGV4dC9zcGR4XCIsXG4gIFwic3R5bHVzXCI6IFwidGV4dC9zdHlsdXNcIixcbiAgXCJzdHlsXCI6IFwidGV4dC9zdHlsdXNcIixcbiAgXCJ0c3ZcIjogXCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzXCIsXG4gIFwidFwiOiBcInRleHQvdHJvZmZcIixcbiAgXCJ0clwiOiBcInRleHQvdHJvZmZcIixcbiAgXCJyb2ZmXCI6IFwidGV4dC90cm9mZlwiLFxuICBcIm1hblwiOiBcInRleHQvdHJvZmZcIixcbiAgXCJtZVwiOiBcInRleHQvdHJvZmZcIixcbiAgXCJtc1wiOiBcInRleHQvdHJvZmZcIixcbiAgXCJ0dGxcIjogXCJ0ZXh0L3R1cnRsZVwiLFxuICBcInVyaVwiOiBcInRleHQvdXJpLWxpc3RcIixcbiAgXCJ1cmlzXCI6IFwidGV4dC91cmktbGlzdFwiLFxuICBcInVybHNcIjogXCJ0ZXh0L3VyaS1saXN0XCIsXG4gIFwidmNhcmRcIjogXCJ0ZXh0L3ZjYXJkXCIsXG4gIFwidnR0XCI6IFwidGV4dC92dHRcIixcbiAgXCJ5YW1sXCI6IFwidGV4dC95YW1sXCIsXG4gIFwieW1sXCI6IFwidGV4dC95YW1sXCIsXG4gIFwiM2dwXCI6IFwidmlkZW8vM2dwcFwiLFxuICBcIjNnMlwiOiBcInZpZGVvLzNncHAyXCIsXG4gIFwiaDI2MVwiOiBcInZpZGVvL2gyNjFcIixcbiAgXCJoMjYzXCI6IFwidmlkZW8vaDI2M1wiLFxuICBcImgyNjRcIjogXCJ2aWRlby9oMjY0XCIsXG4gIFwibTRzXCI6IFwidmlkZW8vaXNvLnNlZ21lbnRcIixcbiAgXCJqcGd2XCI6IFwidmlkZW8vanBlZ1wiLFxuICBcImpwZ21cIjogXCJpbWFnZS9qcG1cIixcbiAgXCJtajJcIjogXCJ2aWRlby9tajJcIixcbiAgXCJtanAyXCI6IFwidmlkZW8vbWoyXCIsXG4gIFwidHNcIjogXCJ2aWRlby9tcDJ0XCIsXG4gIFwibXA0XCI6IFwidmlkZW8vbXA0XCIsXG4gIFwibXA0dlwiOiBcInZpZGVvL21wNFwiLFxuICBcIm1wZzRcIjogXCJ2aWRlby9tcDRcIixcbiAgXCJtcGVnXCI6IFwidmlkZW8vbXBlZ1wiLFxuICBcIm1wZ1wiOiBcInZpZGVvL21wZWdcIixcbiAgXCJtcGVcIjogXCJ2aWRlby9tcGVnXCIsXG4gIFwibTF2XCI6IFwidmlkZW8vbXBlZ1wiLFxuICBcIm0ydlwiOiBcInZpZGVvL21wZWdcIixcbiAgXCJvZ3ZcIjogXCJ2aWRlby9vZ2dcIixcbiAgXCJxdFwiOiBcInZpZGVvL3F1aWNrdGltZVwiLFxuICBcIm1vdlwiOiBcInZpZGVvL3F1aWNrdGltZVwiLFxuICBcIndlYm1cIjogXCJ2aWRlby93ZWJtXCJcbn07XG5cbmZ1bmN0aW9uIGxvb2t1cChleHRuKSB7XG5cdGxldCB0bXAgPSAoJycgKyBleHRuKS50cmltKCkudG9Mb3dlckNhc2UoKTtcblx0bGV0IGlkeCA9IHRtcC5sYXN0SW5kZXhPZignLicpO1xuXHRyZXR1cm4gbWltZXMkMVshfmlkeCA/IHRtcCA6IHRtcC5zdWJzdHJpbmcoKytpZHgpXTtcbn1cblxuY2xhc3MgQml0U2V0IHtcblx0Y29uc3RydWN0b3IoYXJnKSB7XG5cdFx0dGhpcy5iaXRzID0gYXJnIGluc3RhbmNlb2YgQml0U2V0ID8gYXJnLmJpdHMuc2xpY2UoKSA6IFtdO1xuXHR9XG5cblx0YWRkKG4pIHtcblx0XHR0aGlzLmJpdHNbbiA+PiA1XSB8PSAxIDw8IChuICYgMzEpO1xuXHR9XG5cblx0aGFzKG4pIHtcblx0XHRyZXR1cm4gISEodGhpcy5iaXRzW24gPj4gNV0gJiAoMSA8PCAobiAmIDMxKSkpO1xuXHR9XG59XG5cbmNsYXNzIENodW5rIHtcblx0Y29uc3RydWN0b3Ioc3RhcnQsIGVuZCwgY29udGVudCkge1xuXHRcdHRoaXMuc3RhcnQgPSBzdGFydDtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLm9yaWdpbmFsID0gY29udGVudDtcblxuXHRcdHRoaXMuaW50cm8gPSAnJztcblx0XHR0aGlzLm91dHJvID0gJyc7XG5cblx0XHR0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuXHRcdHRoaXMuc3RvcmVOYW1lID0gZmFsc2U7XG5cdFx0dGhpcy5lZGl0ZWQgPSBmYWxzZTtcblxuXHRcdHtcblx0XHRcdHRoaXMucHJldmlvdXMgPSBudWxsO1xuXHRcdFx0dGhpcy5uZXh0ID0gbnVsbDtcblx0XHR9XG5cdH1cblxuXHRhcHBlbmRMZWZ0KGNvbnRlbnQpIHtcblx0XHR0aGlzLm91dHJvICs9IGNvbnRlbnQ7XG5cdH1cblxuXHRhcHBlbmRSaWdodChjb250ZW50KSB7XG5cdFx0dGhpcy5pbnRybyA9IHRoaXMuaW50cm8gKyBjb250ZW50O1xuXHR9XG5cblx0Y2xvbmUoKSB7XG5cdFx0Y29uc3QgY2h1bmsgPSBuZXcgQ2h1bmsodGhpcy5zdGFydCwgdGhpcy5lbmQsIHRoaXMub3JpZ2luYWwpO1xuXG5cdFx0Y2h1bmsuaW50cm8gPSB0aGlzLmludHJvO1xuXHRcdGNodW5rLm91dHJvID0gdGhpcy5vdXRybztcblx0XHRjaHVuay5jb250ZW50ID0gdGhpcy5jb250ZW50O1xuXHRcdGNodW5rLnN0b3JlTmFtZSA9IHRoaXMuc3RvcmVOYW1lO1xuXHRcdGNodW5rLmVkaXRlZCA9IHRoaXMuZWRpdGVkO1xuXG5cdFx0cmV0dXJuIGNodW5rO1xuXHR9XG5cblx0Y29udGFpbnMoaW5kZXgpIHtcblx0XHRyZXR1cm4gdGhpcy5zdGFydCA8IGluZGV4ICYmIGluZGV4IDwgdGhpcy5lbmQ7XG5cdH1cblxuXHRlYWNoTmV4dChmbikge1xuXHRcdGxldCBjaHVuayA9IHRoaXM7XG5cdFx0d2hpbGUgKGNodW5rKSB7XG5cdFx0XHRmbihjaHVuayk7XG5cdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0fVxuXHR9XG5cblx0ZWFjaFByZXZpb3VzKGZuKSB7XG5cdFx0bGV0IGNodW5rID0gdGhpcztcblx0XHR3aGlsZSAoY2h1bmspIHtcblx0XHRcdGZuKGNodW5rKTtcblx0XHRcdGNodW5rID0gY2h1bmsucHJldmlvdXM7XG5cdFx0fVxuXHR9XG5cblx0ZWRpdChjb250ZW50LCBzdG9yZU5hbWUsIGNvbnRlbnRPbmx5KSB7XG5cdFx0dGhpcy5jb250ZW50ID0gY29udGVudDtcblx0XHRpZiAoIWNvbnRlbnRPbmx5KSB7XG5cdFx0XHR0aGlzLmludHJvID0gJyc7XG5cdFx0XHR0aGlzLm91dHJvID0gJyc7XG5cdFx0fVxuXHRcdHRoaXMuc3RvcmVOYW1lID0gc3RvcmVOYW1lO1xuXG5cdFx0dGhpcy5lZGl0ZWQgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwcmVwZW5kTGVmdChjb250ZW50KSB7XG5cdFx0dGhpcy5vdXRybyA9IGNvbnRlbnQgKyB0aGlzLm91dHJvO1xuXHR9XG5cblx0cHJlcGVuZFJpZ2h0KGNvbnRlbnQpIHtcblx0XHR0aGlzLmludHJvID0gY29udGVudCArIHRoaXMuaW50cm87XG5cdH1cblxuXHRzcGxpdChpbmRleCkge1xuXHRcdGNvbnN0IHNsaWNlSW5kZXggPSBpbmRleCAtIHRoaXMuc3RhcnQ7XG5cblx0XHRjb25zdCBvcmlnaW5hbEJlZm9yZSA9IHRoaXMub3JpZ2luYWwuc2xpY2UoMCwgc2xpY2VJbmRleCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxBZnRlciA9IHRoaXMub3JpZ2luYWwuc2xpY2Uoc2xpY2VJbmRleCk7XG5cblx0XHR0aGlzLm9yaWdpbmFsID0gb3JpZ2luYWxCZWZvcmU7XG5cblx0XHRjb25zdCBuZXdDaHVuayA9IG5ldyBDaHVuayhpbmRleCwgdGhpcy5lbmQsIG9yaWdpbmFsQWZ0ZXIpO1xuXHRcdG5ld0NodW5rLm91dHJvID0gdGhpcy5vdXRybztcblx0XHR0aGlzLm91dHJvID0gJyc7XG5cblx0XHR0aGlzLmVuZCA9IGluZGV4O1xuXG5cdFx0aWYgKHRoaXMuZWRpdGVkKSB7XG5cdFx0XHQvLyBUT0RPIGlzIHRoaXMgYmxvY2sgbmVjZXNzYXJ5Py4uLlxuXHRcdFx0bmV3Q2h1bmsuZWRpdCgnJywgZmFsc2UpO1xuXHRcdFx0dGhpcy5jb250ZW50ID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY29udGVudCA9IG9yaWdpbmFsQmVmb3JlO1xuXHRcdH1cblxuXHRcdG5ld0NodW5rLm5leHQgPSB0aGlzLm5leHQ7XG5cdFx0aWYgKG5ld0NodW5rLm5leHQpIG5ld0NodW5rLm5leHQucHJldmlvdXMgPSBuZXdDaHVuaztcblx0XHRuZXdDaHVuay5wcmV2aW91cyA9IHRoaXM7XG5cdFx0dGhpcy5uZXh0ID0gbmV3Q2h1bms7XG5cblx0XHRyZXR1cm4gbmV3Q2h1bms7XG5cdH1cblxuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gdGhpcy5pbnRybyArIHRoaXMuY29udGVudCArIHRoaXMub3V0cm87XG5cdH1cblxuXHR0cmltRW5kKHJ4KSB7XG5cdFx0dGhpcy5vdXRybyA9IHRoaXMub3V0cm8ucmVwbGFjZShyeCwgJycpO1xuXHRcdGlmICh0aGlzLm91dHJvLmxlbmd0aCkgcmV0dXJuIHRydWU7XG5cblx0XHRjb25zdCB0cmltbWVkID0gdGhpcy5jb250ZW50LnJlcGxhY2UocngsICcnKTtcblxuXHRcdGlmICh0cmltbWVkLmxlbmd0aCkge1xuXHRcdFx0aWYgKHRyaW1tZWQgIT09IHRoaXMuY29udGVudCkge1xuXHRcdFx0XHR0aGlzLnNwbGl0KHRoaXMuc3RhcnQgKyB0cmltbWVkLmxlbmd0aCkuZWRpdCgnJywgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmVkaXQoJycsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cblx0XHRcdHRoaXMuaW50cm8gPSB0aGlzLmludHJvLnJlcGxhY2UocngsICcnKTtcblx0XHRcdGlmICh0aGlzLmludHJvLmxlbmd0aCkgcmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0dHJpbVN0YXJ0KHJ4KSB7XG5cdFx0dGhpcy5pbnRybyA9IHRoaXMuaW50cm8ucmVwbGFjZShyeCwgJycpO1xuXHRcdGlmICh0aGlzLmludHJvLmxlbmd0aCkgcmV0dXJuIHRydWU7XG5cblx0XHRjb25zdCB0cmltbWVkID0gdGhpcy5jb250ZW50LnJlcGxhY2UocngsICcnKTtcblxuXHRcdGlmICh0cmltbWVkLmxlbmd0aCkge1xuXHRcdFx0aWYgKHRyaW1tZWQgIT09IHRoaXMuY29udGVudCkge1xuXHRcdFx0XHR0aGlzLnNwbGl0KHRoaXMuZW5kIC0gdHJpbW1lZC5sZW5ndGgpO1xuXHRcdFx0XHR0aGlzLmVkaXQoJycsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5lZGl0KCcnLCB1bmRlZmluZWQsIHRydWUpO1xuXG5cdFx0XHR0aGlzLm91dHJvID0gdGhpcy5vdXRyby5yZXBsYWNlKHJ4LCAnJyk7XG5cdFx0XHRpZiAodGhpcy5vdXRyby5sZW5ndGgpIHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBnZXRCdG9hICgpIHtcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiAoc3RyKSA9PiB3aW5kb3cuYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSkpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gKHN0cikgPT4gQnVmZmVyLmZyb20oc3RyLCAndXRmLTgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZW52aXJvbm1lbnQ6IGB3aW5kb3cuYnRvYWAgb3IgYEJ1ZmZlcmAgc2hvdWxkIGJlIHN1cHBvcnRlZC4nKTtcblx0XHR9O1xuXHR9XG59XG5cbmNvbnN0IGJ0b2EkMSA9IC8qI19fUFVSRV9fKi8gZ2V0QnRvYSgpO1xuXG5jbGFzcyBTb3VyY2VNYXAge1xuXHRjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzKSB7XG5cdFx0dGhpcy52ZXJzaW9uID0gMztcblx0XHR0aGlzLmZpbGUgPSBwcm9wZXJ0aWVzLmZpbGU7XG5cdFx0dGhpcy5zb3VyY2VzID0gcHJvcGVydGllcy5zb3VyY2VzO1xuXHRcdHRoaXMuc291cmNlc0NvbnRlbnQgPSBwcm9wZXJ0aWVzLnNvdXJjZXNDb250ZW50O1xuXHRcdHRoaXMubmFtZXMgPSBwcm9wZXJ0aWVzLm5hbWVzO1xuXHRcdHRoaXMubWFwcGluZ3MgPSBlbmNvZGUkMShwcm9wZXJ0aWVzLm1hcHBpbmdzKTtcblx0XHRpZiAodHlwZW9mIHByb3BlcnRpZXMueF9nb29nbGVfaWdub3JlTGlzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHRoaXMueF9nb29nbGVfaWdub3JlTGlzdCA9IHByb3BlcnRpZXMueF9nb29nbGVfaWdub3JlTGlzdDtcblx0XHR9XG5cdH1cblxuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG5cdH1cblxuXHR0b1VybCgpIHtcblx0XHRyZXR1cm4gJ2RhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwnICsgYnRvYSQxKHRoaXMudG9TdHJpbmcoKSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ3Vlc3NJbmRlbnQoY29kZSkge1xuXHRjb25zdCBsaW5lcyA9IGNvZGUuc3BsaXQoJ1xcbicpO1xuXG5cdGNvbnN0IHRhYmJlZCA9IGxpbmVzLmZpbHRlcigobGluZSkgPT4gL15cXHQrLy50ZXN0KGxpbmUpKTtcblx0Y29uc3Qgc3BhY2VkID0gbGluZXMuZmlsdGVyKChsaW5lKSA9PiAvXiB7Mix9Ly50ZXN0KGxpbmUpKTtcblxuXHRpZiAodGFiYmVkLmxlbmd0aCA9PT0gMCAmJiBzcGFjZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBNb3JlIGxpbmVzIHRhYmJlZCB0aGFuIHNwYWNlZD8gQXNzdW1lIHRhYnMsIGFuZFxuXHQvLyBkZWZhdWx0IHRvIHRhYnMgaW4gdGhlIGNhc2Ugb2YgYSB0aWUgKG9yIG5vdGhpbmdcblx0Ly8gdG8gZ28gb24pXG5cdGlmICh0YWJiZWQubGVuZ3RoID49IHNwYWNlZC5sZW5ndGgpIHtcblx0XHRyZXR1cm4gJ1xcdCc7XG5cdH1cblxuXHQvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gZ3Vlc3MgdGhlIG11bHRpcGxlXG5cdGNvbnN0IG1pbiA9IHNwYWNlZC5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XG5cdFx0Y29uc3QgbnVtU3BhY2VzID0gL14gKy8uZXhlYyhjdXJyZW50KVswXS5sZW5ndGg7XG5cdFx0cmV0dXJuIE1hdGgubWluKG51bVNwYWNlcywgcHJldmlvdXMpO1xuXHR9LCBJbmZpbml0eSk7XG5cblx0cmV0dXJuIG5ldyBBcnJheShtaW4gKyAxKS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbGF0aXZlUGF0aChmcm9tLCB0bykge1xuXHRjb25zdCBmcm9tUGFydHMgPSBmcm9tLnNwbGl0KC9bL1xcXFxdLyk7XG5cdGNvbnN0IHRvUGFydHMgPSB0by5zcGxpdCgvWy9cXFxcXS8pO1xuXG5cdGZyb21QYXJ0cy5wb3AoKTsgLy8gZ2V0IGRpcm5hbWVcblxuXHR3aGlsZSAoZnJvbVBhcnRzWzBdID09PSB0b1BhcnRzWzBdKSB7XG5cdFx0ZnJvbVBhcnRzLnNoaWZ0KCk7XG5cdFx0dG9QYXJ0cy5zaGlmdCgpO1xuXHR9XG5cblx0aWYgKGZyb21QYXJ0cy5sZW5ndGgpIHtcblx0XHRsZXQgaSA9IGZyb21QYXJ0cy5sZW5ndGg7XG5cdFx0d2hpbGUgKGktLSkgZnJvbVBhcnRzW2ldID0gJy4uJztcblx0fVxuXG5cdHJldHVybiBmcm9tUGFydHMuY29uY2F0KHRvUGFydHMpLmpvaW4oJy8nKTtcbn1cblxuY29uc3QgdG9TdHJpbmckMiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0JDEodGhpbmcpIHtcblx0cmV0dXJuIHRvU3RyaW5nJDIuY2FsbCh0aGluZykgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG5mdW5jdGlvbiBnZXRMb2NhdG9yKHNvdXJjZSkge1xuXHRjb25zdCBvcmlnaW5hbExpbmVzID0gc291cmNlLnNwbGl0KCdcXG4nKTtcblx0Y29uc3QgbGluZU9mZnNldHMgPSBbXTtcblxuXHRmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgaSA8IG9yaWdpbmFsTGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRsaW5lT2Zmc2V0cy5wdXNoKHBvcyk7XG5cdFx0cG9zICs9IG9yaWdpbmFsTGluZXNbaV0ubGVuZ3RoICsgMTtcblx0fVxuXG5cdHJldHVybiBmdW5jdGlvbiBsb2NhdGUoaW5kZXgpIHtcblx0XHRsZXQgaSA9IDA7XG5cdFx0bGV0IGogPSBsaW5lT2Zmc2V0cy5sZW5ndGg7XG5cdFx0d2hpbGUgKGkgPCBqKSB7XG5cdFx0XHRjb25zdCBtID0gKGkgKyBqKSA+PiAxO1xuXHRcdFx0aWYgKGluZGV4IDwgbGluZU9mZnNldHNbbV0pIHtcblx0XHRcdFx0aiA9IG07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpID0gbSArIDE7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IGxpbmUgPSBpIC0gMTtcblx0XHRjb25zdCBjb2x1bW4gPSBpbmRleCAtIGxpbmVPZmZzZXRzW2xpbmVdO1xuXHRcdHJldHVybiB7IGxpbmUsIGNvbHVtbiB9O1xuXHR9O1xufVxuXG5jbGFzcyBNYXBwaW5ncyB7XG5cdGNvbnN0cnVjdG9yKGhpcmVzKSB7XG5cdFx0dGhpcy5oaXJlcyA9IGhpcmVzO1xuXHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUxpbmUgPSAwO1xuXHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiA9IDA7XG5cdFx0dGhpcy5yYXcgPSBbXTtcblx0XHR0aGlzLnJhd1NlZ21lbnRzID0gdGhpcy5yYXdbdGhpcy5nZW5lcmF0ZWRDb2RlTGluZV0gPSBbXTtcblx0XHR0aGlzLnBlbmRpbmcgPSBudWxsO1xuXHR9XG5cblx0YWRkRWRpdChzb3VyY2VJbmRleCwgY29udGVudCwgbG9jLCBuYW1lSW5kZXgpIHtcblx0XHRpZiAoY29udGVudC5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IHNlZ21lbnQgPSBbdGhpcy5nZW5lcmF0ZWRDb2RlQ29sdW1uLCBzb3VyY2VJbmRleCwgbG9jLmxpbmUsIGxvYy5jb2x1bW5dO1xuXHRcdFx0aWYgKG5hbWVJbmRleCA+PSAwKSB7XG5cdFx0XHRcdHNlZ21lbnQucHVzaChuYW1lSW5kZXgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5yYXdTZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5wZW5kaW5nKSB7XG5cdFx0XHR0aGlzLnJhd1NlZ21lbnRzLnB1c2godGhpcy5wZW5kaW5nKTtcblx0XHR9XG5cblx0XHR0aGlzLmFkdmFuY2UoY29udGVudCk7XG5cdFx0dGhpcy5wZW5kaW5nID0gbnVsbDtcblx0fVxuXG5cdGFkZFVuZWRpdGVkQ2h1bmsoc291cmNlSW5kZXgsIGNodW5rLCBvcmlnaW5hbCwgbG9jLCBzb3VyY2VtYXBMb2NhdGlvbnMpIHtcblx0XHRsZXQgb3JpZ2luYWxDaGFySW5kZXggPSBjaHVuay5zdGFydDtcblx0XHRsZXQgZmlyc3QgPSB0cnVlO1xuXG5cdFx0d2hpbGUgKG9yaWdpbmFsQ2hhckluZGV4IDwgY2h1bmsuZW5kKSB7XG5cdFx0XHRpZiAodGhpcy5oaXJlcyB8fCBmaXJzdCB8fCBzb3VyY2VtYXBMb2NhdGlvbnMuaGFzKG9yaWdpbmFsQ2hhckluZGV4KSkge1xuXHRcdFx0XHR0aGlzLnJhd1NlZ21lbnRzLnB1c2goW3RoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiwgc291cmNlSW5kZXgsIGxvYy5saW5lLCBsb2MuY29sdW1uXSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvcmlnaW5hbFtvcmlnaW5hbENoYXJJbmRleF0gPT09ICdcXG4nKSB7XG5cdFx0XHRcdGxvYy5saW5lICs9IDE7XG5cdFx0XHRcdGxvYy5jb2x1bW4gPSAwO1xuXHRcdFx0XHR0aGlzLmdlbmVyYXRlZENvZGVMaW5lICs9IDE7XG5cdFx0XHRcdHRoaXMucmF3W3RoaXMuZ2VuZXJhdGVkQ29kZUxpbmVdID0gdGhpcy5yYXdTZWdtZW50cyA9IFtdO1xuXHRcdFx0XHR0aGlzLmdlbmVyYXRlZENvZGVDb2x1bW4gPSAwO1xuXHRcdFx0XHRmaXJzdCA9IHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsb2MuY29sdW1uICs9IDE7XG5cdFx0XHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiArPSAxO1xuXHRcdFx0XHRmaXJzdCA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRvcmlnaW5hbENoYXJJbmRleCArPSAxO1xuXHRcdH1cblxuXHRcdHRoaXMucGVuZGluZyA9IG51bGw7XG5cdH1cblxuXHRhZHZhbmNlKHN0cikge1xuXHRcdGlmICghc3RyKSByZXR1cm47XG5cblx0XHRjb25zdCBsaW5lcyA9IHN0ci5zcGxpdCgnXFxuJyk7XG5cblx0XHRpZiAobGluZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0dGhpcy5nZW5lcmF0ZWRDb2RlTGluZSsrO1xuXHRcdFx0XHR0aGlzLnJhd1t0aGlzLmdlbmVyYXRlZENvZGVMaW5lXSA9IHRoaXMucmF3U2VnbWVudHMgPSBbXTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2VuZXJhdGVkQ29kZUNvbHVtbiA9IDA7XG5cdFx0fVxuXG5cdFx0dGhpcy5nZW5lcmF0ZWRDb2RlQ29sdW1uICs9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aDtcblx0fVxufVxuXG5jb25zdCBuJDEgPSAnXFxuJztcblxuY29uc3Qgd2FybmVkID0ge1xuXHRpbnNlcnRMZWZ0OiBmYWxzZSxcblx0aW5zZXJ0UmlnaHQ6IGZhbHNlLFxuXHRzdG9yZU5hbWU6IGZhbHNlLFxufTtcblxuY2xhc3MgTWFnaWNTdHJpbmcge1xuXHRjb25zdHJ1Y3RvcihzdHJpbmcsIG9wdGlvbnMgPSB7fSkge1xuXHRcdGNvbnN0IGNodW5rID0gbmV3IENodW5rKDAsIHN0cmluZy5sZW5ndGgsIHN0cmluZyk7XG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG5cdFx0XHRvcmlnaW5hbDogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHN0cmluZyB9LFxuXHRcdFx0b3V0cm86IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiAnJyB9LFxuXHRcdFx0aW50cm86IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiAnJyB9LFxuXHRcdFx0Zmlyc3RDaHVuazogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IGNodW5rIH0sXG5cdFx0XHRsYXN0Q2h1bms6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBjaHVuayB9LFxuXHRcdFx0bGFzdFNlYXJjaGVkQ2h1bms6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBjaHVuayB9LFxuXHRcdFx0YnlTdGFydDogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHt9IH0sXG5cdFx0XHRieUVuZDogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHt9IH0sXG5cdFx0XHRmaWxlbmFtZTogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IG9wdGlvbnMuZmlsZW5hbWUgfSxcblx0XHRcdGluZGVudEV4Y2x1c2lvblJhbmdlczogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IG9wdGlvbnMuaW5kZW50RXhjbHVzaW9uUmFuZ2VzIH0sXG5cdFx0XHRzb3VyY2VtYXBMb2NhdGlvbnM6IHsgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBuZXcgQml0U2V0KCkgfSxcblx0XHRcdHN0b3JlZE5hbWVzOiB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZToge30gfSxcblx0XHRcdGluZGVudFN0cjogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9LFxuXHRcdFx0aWdub3JlTGlzdDogeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IG9wdGlvbnMuaWdub3JlTGlzdCB9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5ieVN0YXJ0WzBdID0gY2h1bms7XG5cdFx0dGhpcy5ieUVuZFtzdHJpbmcubGVuZ3RoXSA9IGNodW5rO1xuXHR9XG5cblx0YWRkU291cmNlbWFwTG9jYXRpb24oY2hhcikge1xuXHRcdHRoaXMuc291cmNlbWFwTG9jYXRpb25zLmFkZChjaGFyKTtcblx0fVxuXG5cdGFwcGVuZChjb250ZW50KSB7XG5cdFx0aWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignb3V0cm8gY29udGVudCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cblx0XHR0aGlzLm91dHJvICs9IGNvbnRlbnQ7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRhcHBlbmRMZWZ0KGluZGV4LCBjb250ZW50KSB7XG5cdFx0aWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5zZXJ0ZWQgY29udGVudCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cblx0XHR0aGlzLl9zcGxpdChpbmRleCk7XG5cblx0XHRjb25zdCBjaHVuayA9IHRoaXMuYnlFbmRbaW5kZXhdO1xuXG5cdFx0aWYgKGNodW5rKSB7XG5cdFx0XHRjaHVuay5hcHBlbmRMZWZ0KGNvbnRlbnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmludHJvICs9IGNvbnRlbnQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0YXBwZW5kUmlnaHQoaW5kZXgsIGNvbnRlbnQpIHtcblx0XHRpZiAodHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnNlcnRlZCBjb250ZW50IG11c3QgYmUgYSBzdHJpbmcnKTtcblxuXHRcdHRoaXMuX3NwbGl0KGluZGV4KTtcblxuXHRcdGNvbnN0IGNodW5rID0gdGhpcy5ieVN0YXJ0W2luZGV4XTtcblxuXHRcdGlmIChjaHVuaykge1xuXHRcdFx0Y2h1bmsuYXBwZW5kUmlnaHQoY29udGVudCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMub3V0cm8gKz0gY29udGVudDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRjbG9uZSgpIHtcblx0XHRjb25zdCBjbG9uZWQgPSBuZXcgTWFnaWNTdHJpbmcodGhpcy5vcmlnaW5hbCwgeyBmaWxlbmFtZTogdGhpcy5maWxlbmFtZSB9KTtcblxuXHRcdGxldCBvcmlnaW5hbENodW5rID0gdGhpcy5maXJzdENodW5rO1xuXHRcdGxldCBjbG9uZWRDaHVuayA9IChjbG9uZWQuZmlyc3RDaHVuayA9IGNsb25lZC5sYXN0U2VhcmNoZWRDaHVuayA9IG9yaWdpbmFsQ2h1bmsuY2xvbmUoKSk7XG5cblx0XHR3aGlsZSAob3JpZ2luYWxDaHVuaykge1xuXHRcdFx0Y2xvbmVkLmJ5U3RhcnRbY2xvbmVkQ2h1bmsuc3RhcnRdID0gY2xvbmVkQ2h1bms7XG5cdFx0XHRjbG9uZWQuYnlFbmRbY2xvbmVkQ2h1bmsuZW5kXSA9IGNsb25lZENodW5rO1xuXG5cdFx0XHRjb25zdCBuZXh0T3JpZ2luYWxDaHVuayA9IG9yaWdpbmFsQ2h1bmsubmV4dDtcblx0XHRcdGNvbnN0IG5leHRDbG9uZWRDaHVuayA9IG5leHRPcmlnaW5hbENodW5rICYmIG5leHRPcmlnaW5hbENodW5rLmNsb25lKCk7XG5cblx0XHRcdGlmIChuZXh0Q2xvbmVkQ2h1bmspIHtcblx0XHRcdFx0Y2xvbmVkQ2h1bmsubmV4dCA9IG5leHRDbG9uZWRDaHVuaztcblx0XHRcdFx0bmV4dENsb25lZENodW5rLnByZXZpb3VzID0gY2xvbmVkQ2h1bms7XG5cblx0XHRcdFx0Y2xvbmVkQ2h1bmsgPSBuZXh0Q2xvbmVkQ2h1bms7XG5cdFx0XHR9XG5cblx0XHRcdG9yaWdpbmFsQ2h1bmsgPSBuZXh0T3JpZ2luYWxDaHVuaztcblx0XHR9XG5cblx0XHRjbG9uZWQubGFzdENodW5rID0gY2xvbmVkQ2h1bms7XG5cblx0XHRpZiAodGhpcy5pbmRlbnRFeGNsdXNpb25SYW5nZXMpIHtcblx0XHRcdGNsb25lZC5pbmRlbnRFeGNsdXNpb25SYW5nZXMgPSB0aGlzLmluZGVudEV4Y2x1c2lvblJhbmdlcy5zbGljZSgpO1xuXHRcdH1cblxuXHRcdGNsb25lZC5zb3VyY2VtYXBMb2NhdGlvbnMgPSBuZXcgQml0U2V0KHRoaXMuc291cmNlbWFwTG9jYXRpb25zKTtcblxuXHRcdGNsb25lZC5pbnRybyA9IHRoaXMuaW50cm87XG5cdFx0Y2xvbmVkLm91dHJvID0gdGhpcy5vdXRybztcblxuXHRcdHJldHVybiBjbG9uZWQ7XG5cdH1cblxuXHRnZW5lcmF0ZURlY29kZWRNYXAob3B0aW9ucykge1xuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0Y29uc3Qgc291cmNlSW5kZXggPSAwO1xuXHRcdGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXModGhpcy5zdG9yZWROYW1lcyk7XG5cdFx0Y29uc3QgbWFwcGluZ3MgPSBuZXcgTWFwcGluZ3Mob3B0aW9ucy5oaXJlcyk7XG5cblx0XHRjb25zdCBsb2NhdGUgPSBnZXRMb2NhdG9yKHRoaXMub3JpZ2luYWwpO1xuXG5cdFx0aWYgKHRoaXMuaW50cm8pIHtcblx0XHRcdG1hcHBpbmdzLmFkdmFuY2UodGhpcy5pbnRybyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5maXJzdENodW5rLmVhY2hOZXh0KChjaHVuaykgPT4ge1xuXHRcdFx0Y29uc3QgbG9jID0gbG9jYXRlKGNodW5rLnN0YXJ0KTtcblxuXHRcdFx0aWYgKGNodW5rLmludHJvLmxlbmd0aCkgbWFwcGluZ3MuYWR2YW5jZShjaHVuay5pbnRybyk7XG5cblx0XHRcdGlmIChjaHVuay5lZGl0ZWQpIHtcblx0XHRcdFx0bWFwcGluZ3MuYWRkRWRpdChcblx0XHRcdFx0XHRzb3VyY2VJbmRleCxcblx0XHRcdFx0XHRjaHVuay5jb250ZW50LFxuXHRcdFx0XHRcdGxvYyxcblx0XHRcdFx0XHRjaHVuay5zdG9yZU5hbWUgPyBuYW1lcy5pbmRleE9mKGNodW5rLm9yaWdpbmFsKSA6IC0xXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXBwaW5ncy5hZGRVbmVkaXRlZENodW5rKHNvdXJjZUluZGV4LCBjaHVuaywgdGhpcy5vcmlnaW5hbCwgbG9jLCB0aGlzLnNvdXJjZW1hcExvY2F0aW9ucyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjaHVuay5vdXRyby5sZW5ndGgpIG1hcHBpbmdzLmFkdmFuY2UoY2h1bmsub3V0cm8pO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGZpbGU6IG9wdGlvbnMuZmlsZSA/IG9wdGlvbnMuZmlsZS5zcGxpdCgvWy9cXFxcXS8pLnBvcCgpIDogdW5kZWZpbmVkLFxuXHRcdFx0c291cmNlczogW29wdGlvbnMuc291cmNlID8gZ2V0UmVsYXRpdmVQYXRoKG9wdGlvbnMuZmlsZSB8fCAnJywgb3B0aW9ucy5zb3VyY2UpIDogKG9wdGlvbnMuZmlsZSB8fCAnJyldLFxuXHRcdFx0c291cmNlc0NvbnRlbnQ6IG9wdGlvbnMuaW5jbHVkZUNvbnRlbnQgPyBbdGhpcy5vcmlnaW5hbF0gOiB1bmRlZmluZWQsXG5cdFx0XHRuYW1lcyxcblx0XHRcdG1hcHBpbmdzOiBtYXBwaW5ncy5yYXcsXG5cdFx0XHR4X2dvb2dsZV9pZ25vcmVMaXN0OiB0aGlzLmlnbm9yZUxpc3QgPyBbc291cmNlSW5kZXhdIDogdW5kZWZpbmVkXG5cdFx0fTtcblx0fVxuXG5cdGdlbmVyYXRlTWFwKG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gbmV3IFNvdXJjZU1hcCh0aGlzLmdlbmVyYXRlRGVjb2RlZE1hcChvcHRpb25zKSk7XG5cdH1cblxuXHRfZW5zdXJlaW5kZW50U3RyKCkge1xuXHRcdGlmICh0aGlzLmluZGVudFN0ciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmluZGVudFN0ciA9IGd1ZXNzSW5kZW50KHRoaXMub3JpZ2luYWwpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRSYXdJbmRlbnRTdHJpbmcoKSB7XG5cdFx0dGhpcy5fZW5zdXJlaW5kZW50U3RyKCk7XG5cdFx0cmV0dXJuIHRoaXMuaW5kZW50U3RyO1xuXHR9XG5cblx0Z2V0SW5kZW50U3RyaW5nKCkge1xuXHRcdHRoaXMuX2Vuc3VyZWluZGVudFN0cigpO1xuXHRcdHJldHVybiB0aGlzLmluZGVudFN0ciA9PT0gbnVsbCA/ICdcXHQnIDogdGhpcy5pbmRlbnRTdHI7XG5cdH1cblxuXHRpbmRlbnQoaW5kZW50U3RyLCBvcHRpb25zKSB7XG5cdFx0Y29uc3QgcGF0dGVybiA9IC9eW15cXHJcXG5dL2dtO1xuXG5cdFx0aWYgKGlzT2JqZWN0JDEoaW5kZW50U3RyKSkge1xuXHRcdFx0b3B0aW9ucyA9IGluZGVudFN0cjtcblx0XHRcdGluZGVudFN0ciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAoaW5kZW50U3RyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuX2Vuc3VyZWluZGVudFN0cigpO1xuXHRcdFx0aW5kZW50U3RyID0gdGhpcy5pbmRlbnRTdHIgfHwgJ1xcdCc7XG5cdFx0fVxuXG5cdFx0aWYgKGluZGVudFN0ciA9PT0gJycpIHJldHVybiB0aGlzOyAvLyBub29wXG5cblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdC8vIFByb2Nlc3MgZXhjbHVzaW9uIHJhbmdlc1xuXHRcdGNvbnN0IGlzRXhjbHVkZWQgPSB7fTtcblxuXHRcdGlmIChvcHRpb25zLmV4Y2x1ZGUpIHtcblx0XHRcdGNvbnN0IGV4Y2x1c2lvbnMgPVxuXHRcdFx0XHR0eXBlb2Ygb3B0aW9ucy5leGNsdWRlWzBdID09PSAnbnVtYmVyJyA/IFtvcHRpb25zLmV4Y2x1ZGVdIDogb3B0aW9ucy5leGNsdWRlO1xuXHRcdFx0ZXhjbHVzaW9ucy5mb3JFYWNoKChleGNsdXNpb24pID0+IHtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IGV4Y2x1c2lvblswXTsgaSA8IGV4Y2x1c2lvblsxXTsgaSArPSAxKSB7XG5cdFx0XHRcdFx0aXNFeGNsdWRlZFtpXSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGxldCBzaG91bGRJbmRlbnROZXh0Q2hhcmFjdGVyID0gb3B0aW9ucy5pbmRlbnRTdGFydCAhPT0gZmFsc2U7XG5cdFx0Y29uc3QgcmVwbGFjZXIgPSAobWF0Y2gpID0+IHtcblx0XHRcdGlmIChzaG91bGRJbmRlbnROZXh0Q2hhcmFjdGVyKSByZXR1cm4gYCR7aW5kZW50U3RyfSR7bWF0Y2h9YDtcblx0XHRcdHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdH07XG5cblx0XHR0aGlzLmludHJvID0gdGhpcy5pbnRyby5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VyKTtcblxuXHRcdGxldCBjaGFySW5kZXggPSAwO1xuXHRcdGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblxuXHRcdHdoaWxlIChjaHVuaykge1xuXHRcdFx0Y29uc3QgZW5kID0gY2h1bmsuZW5kO1xuXG5cdFx0XHRpZiAoY2h1bmsuZWRpdGVkKSB7XG5cdFx0XHRcdGlmICghaXNFeGNsdWRlZFtjaGFySW5kZXhdKSB7XG5cdFx0XHRcdFx0Y2h1bmsuY29udGVudCA9IGNodW5rLmNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlcik7XG5cblx0XHRcdFx0XHRpZiAoY2h1bmsuY29udGVudC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIgPSBjaHVuay5jb250ZW50W2NodW5rLmNvbnRlbnQubGVuZ3RoIC0gMV0gPT09ICdcXG4nO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2hhckluZGV4ID0gY2h1bmsuc3RhcnQ7XG5cblx0XHRcdFx0d2hpbGUgKGNoYXJJbmRleCA8IGVuZCkge1xuXHRcdFx0XHRcdGlmICghaXNFeGNsdWRlZFtjaGFySW5kZXhdKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjaGFyID0gdGhpcy5vcmlnaW5hbFtjaGFySW5kZXhdO1xuXG5cdFx0XHRcdFx0XHRpZiAoY2hhciA9PT0gJ1xcbicpIHtcblx0XHRcdFx0XHRcdFx0c2hvdWxkSW5kZW50TmV4dENoYXJhY3RlciA9IHRydWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGNoYXIgIT09ICdcXHInICYmIHNob3VsZEluZGVudE5leHRDaGFyYWN0ZXIpIHtcblx0XHRcdFx0XHRcdFx0c2hvdWxkSW5kZW50TmV4dENoYXJhY3RlciA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChjaGFySW5kZXggPT09IGNodW5rLnN0YXJ0KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2h1bmsucHJlcGVuZFJpZ2h0KGluZGVudFN0cik7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc3BsaXRDaHVuayhjaHVuaywgY2hhckluZGV4KTtcblx0XHRcdFx0XHRcdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0XHRcdFx0XHRcdFx0Y2h1bmsucHJlcGVuZFJpZ2h0KGluZGVudFN0cik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjaGFySW5kZXggKz0gMTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRjaGFySW5kZXggPSBjaHVuay5lbmQ7XG5cdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0fVxuXG5cdFx0dGhpcy5vdXRybyA9IHRoaXMub3V0cm8ucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlcik7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGluc2VydCgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHQnbWFnaWNTdHJpbmcuaW5zZXJ0KC4uLikgaXMgZGVwcmVjYXRlZC4gVXNlIHByZXBlbmRSaWdodCguLi4pIG9yIGFwcGVuZExlZnQoLi4uKSdcblx0XHQpO1xuXHR9XG5cblx0aW5zZXJ0TGVmdChpbmRleCwgY29udGVudCkge1xuXHRcdGlmICghd2FybmVkLmluc2VydExlZnQpIHtcblx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0J21hZ2ljU3RyaW5nLmluc2VydExlZnQoLi4uKSBpcyBkZXByZWNhdGVkLiBVc2UgbWFnaWNTdHJpbmcuYXBwZW5kTGVmdCguLi4pIGluc3RlYWQnXG5cdFx0XHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcblx0XHRcdHdhcm5lZC5pbnNlcnRMZWZ0ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBlbmRMZWZ0KGluZGV4LCBjb250ZW50KTtcblx0fVxuXG5cdGluc2VydFJpZ2h0KGluZGV4LCBjb250ZW50KSB7XG5cdFx0aWYgKCF3YXJuZWQuaW5zZXJ0UmlnaHQpIHtcblx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0J21hZ2ljU3RyaW5nLmluc2VydFJpZ2h0KC4uLikgaXMgZGVwcmVjYXRlZC4gVXNlIG1hZ2ljU3RyaW5nLnByZXBlbmRSaWdodCguLi4pIGluc3RlYWQnXG5cdFx0XHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcblx0XHRcdHdhcm5lZC5pbnNlcnRSaWdodCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJlcGVuZFJpZ2h0KGluZGV4LCBjb250ZW50KTtcblx0fVxuXG5cdG1vdmUoc3RhcnQsIGVuZCwgaW5kZXgpIHtcblx0XHRpZiAoaW5kZXggPj0gc3RhcnQgJiYgaW5kZXggPD0gZW5kKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtb3ZlIGEgc2VsZWN0aW9uIGluc2lkZSBpdHNlbGYnKTtcblxuXHRcdHRoaXMuX3NwbGl0KHN0YXJ0KTtcblx0XHR0aGlzLl9zcGxpdChlbmQpO1xuXHRcdHRoaXMuX3NwbGl0KGluZGV4KTtcblxuXHRcdGNvbnN0IGZpcnN0ID0gdGhpcy5ieVN0YXJ0W3N0YXJ0XTtcblx0XHRjb25zdCBsYXN0ID0gdGhpcy5ieUVuZFtlbmRdO1xuXG5cdFx0Y29uc3Qgb2xkTGVmdCA9IGZpcnN0LnByZXZpb3VzO1xuXHRcdGNvbnN0IG9sZFJpZ2h0ID0gbGFzdC5uZXh0O1xuXG5cdFx0Y29uc3QgbmV3UmlnaHQgPSB0aGlzLmJ5U3RhcnRbaW5kZXhdO1xuXHRcdGlmICghbmV3UmlnaHQgJiYgbGFzdCA9PT0gdGhpcy5sYXN0Q2h1bmspIHJldHVybiB0aGlzO1xuXHRcdGNvbnN0IG5ld0xlZnQgPSBuZXdSaWdodCA/IG5ld1JpZ2h0LnByZXZpb3VzIDogdGhpcy5sYXN0Q2h1bms7XG5cblx0XHRpZiAob2xkTGVmdCkgb2xkTGVmdC5uZXh0ID0gb2xkUmlnaHQ7XG5cdFx0aWYgKG9sZFJpZ2h0KSBvbGRSaWdodC5wcmV2aW91cyA9IG9sZExlZnQ7XG5cblx0XHRpZiAobmV3TGVmdCkgbmV3TGVmdC5uZXh0ID0gZmlyc3Q7XG5cdFx0aWYgKG5ld1JpZ2h0KSBuZXdSaWdodC5wcmV2aW91cyA9IGxhc3Q7XG5cblx0XHRpZiAoIWZpcnN0LnByZXZpb3VzKSB0aGlzLmZpcnN0Q2h1bmsgPSBsYXN0Lm5leHQ7XG5cdFx0aWYgKCFsYXN0Lm5leHQpIHtcblx0XHRcdHRoaXMubGFzdENodW5rID0gZmlyc3QucHJldmlvdXM7XG5cdFx0XHR0aGlzLmxhc3RDaHVuay5uZXh0ID0gbnVsbDtcblx0XHR9XG5cblx0XHRmaXJzdC5wcmV2aW91cyA9IG5ld0xlZnQ7XG5cdFx0bGFzdC5uZXh0ID0gbmV3UmlnaHQgfHwgbnVsbDtcblxuXHRcdGlmICghbmV3TGVmdCkgdGhpcy5maXJzdENodW5rID0gZmlyc3Q7XG5cdFx0aWYgKCFuZXdSaWdodCkgdGhpcy5sYXN0Q2h1bmsgPSBsYXN0O1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0b3ZlcndyaXRlKHN0YXJ0LCBlbmQsIGNvbnRlbnQsIG9wdGlvbnMpIHtcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0XHRyZXR1cm4gdGhpcy51cGRhdGUoc3RhcnQsIGVuZCwgY29udGVudCwgeyAuLi5vcHRpb25zLCBvdmVyd3JpdGU6ICFvcHRpb25zLmNvbnRlbnRPbmx5IH0pO1xuXHR9XG5cblx0dXBkYXRlKHN0YXJ0LCBlbmQsIGNvbnRlbnQsIG9wdGlvbnMpIHtcblx0XHRpZiAodHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZXBsYWNlbWVudCBjb250ZW50IG11c3QgYmUgYSBzdHJpbmcnKTtcblxuXHRcdHdoaWxlIChzdGFydCA8IDApIHN0YXJ0ICs9IHRoaXMub3JpZ2luYWwubGVuZ3RoO1xuXHRcdHdoaWxlIChlbmQgPCAwKSBlbmQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7XG5cblx0XHRpZiAoZW5kID4gdGhpcy5vcmlnaW5hbC5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignZW5kIGlzIG91dCBvZiBib3VuZHMnKTtcblx0XHRpZiAoc3RhcnQgPT09IGVuZClcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0J0Nhbm5vdCBvdmVyd3JpdGUgYSB6ZXJvLWxlbmd0aCByYW5nZSBcdTIwMTMgdXNlIGFwcGVuZExlZnQgb3IgcHJlcGVuZFJpZ2h0IGluc3RlYWQnXG5cdFx0XHQpO1xuXG5cdFx0dGhpcy5fc3BsaXQoc3RhcnQpO1xuXHRcdHRoaXMuX3NwbGl0KGVuZCk7XG5cblx0XHRpZiAob3B0aW9ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0aWYgKCF3YXJuZWQuc3RvcmVOYW1lKSB7XG5cdFx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0XHQnVGhlIGZpbmFsIGFyZ3VtZW50IHRvIG1hZ2ljU3RyaW5nLm92ZXJ3cml0ZSguLi4pIHNob3VsZCBiZSBhbiBvcHRpb25zIG9iamVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yaWNoLWhhcnJpcy9tYWdpYy1zdHJpbmcnXG5cdFx0XHRcdCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXHRcdFx0XHR3YXJuZWQuc3RvcmVOYW1lID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0b3B0aW9ucyA9IHsgc3RvcmVOYW1lOiB0cnVlIH07XG5cdFx0fVxuXHRcdGNvbnN0IHN0b3JlTmFtZSA9IG9wdGlvbnMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RvcmVOYW1lIDogZmFsc2U7XG5cdFx0Y29uc3Qgb3ZlcndyaXRlID0gb3B0aW9ucyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5vdmVyd3JpdGUgOiBmYWxzZTtcblxuXHRcdGlmIChzdG9yZU5hbWUpIHtcblx0XHRcdGNvbnN0IG9yaWdpbmFsID0gdGhpcy5vcmlnaW5hbC5zbGljZShzdGFydCwgZW5kKTtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnN0b3JlZE5hbWVzLCBvcmlnaW5hbCwge1xuXHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0dmFsdWU6IHRydWUsXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBmaXJzdCA9IHRoaXMuYnlTdGFydFtzdGFydF07XG5cdFx0Y29uc3QgbGFzdCA9IHRoaXMuYnlFbmRbZW5kXTtcblxuXHRcdGlmIChmaXJzdCkge1xuXHRcdFx0bGV0IGNodW5rID0gZmlyc3Q7XG5cdFx0XHR3aGlsZSAoY2h1bmsgIT09IGxhc3QpIHtcblx0XHRcdFx0aWYgKGNodW5rLm5leHQgIT09IHRoaXMuYnlTdGFydFtjaHVuay5lbmRdKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgb3ZlcndyaXRlIGFjcm9zcyBhIHNwbGl0IHBvaW50Jyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2h1bmsgPSBjaHVuay5uZXh0O1xuXHRcdFx0XHRjaHVuay5lZGl0KCcnLCBmYWxzZSk7XG5cdFx0XHR9XG5cblx0XHRcdGZpcnN0LmVkaXQoY29udGVudCwgc3RvcmVOYW1lLCAhb3ZlcndyaXRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gbXVzdCBiZSBpbnNlcnRpbmcgYXQgdGhlIGVuZFxuXHRcdFx0Y29uc3QgbmV3Q2h1bmsgPSBuZXcgQ2h1bmsoc3RhcnQsIGVuZCwgJycpLmVkaXQoY29udGVudCwgc3RvcmVOYW1lKTtcblxuXHRcdFx0Ly8gVE9ETyBsYXN0IGNodW5rIGluIHRoZSBhcnJheSBtYXkgbm90IGJlIHRoZSBsYXN0IGNodW5rLCBpZiBpdCdzIG1vdmVkLi4uXG5cdFx0XHRsYXN0Lm5leHQgPSBuZXdDaHVuaztcblx0XHRcdG5ld0NodW5rLnByZXZpb3VzID0gbGFzdDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwcmVwZW5kKGNvbnRlbnQpIHtcblx0XHRpZiAodHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdvdXRybyBjb250ZW50IG11c3QgYmUgYSBzdHJpbmcnKTtcblxuXHRcdHRoaXMuaW50cm8gPSBjb250ZW50ICsgdGhpcy5pbnRybztcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByZXBlbmRMZWZ0KGluZGV4LCBjb250ZW50KSB7XG5cdFx0aWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5zZXJ0ZWQgY29udGVudCBtdXN0IGJlIGEgc3RyaW5nJyk7XG5cblx0XHR0aGlzLl9zcGxpdChpbmRleCk7XG5cblx0XHRjb25zdCBjaHVuayA9IHRoaXMuYnlFbmRbaW5kZXhdO1xuXG5cdFx0aWYgKGNodW5rKSB7XG5cdFx0XHRjaHVuay5wcmVwZW5kTGVmdChjb250ZW50KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5pbnRybyA9IGNvbnRlbnQgKyB0aGlzLmludHJvO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByZXBlbmRSaWdodChpbmRleCwgY29udGVudCkge1xuXHRcdGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2luc2VydGVkIGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZycpO1xuXG5cdFx0dGhpcy5fc3BsaXQoaW5kZXgpO1xuXG5cdFx0Y29uc3QgY2h1bmsgPSB0aGlzLmJ5U3RhcnRbaW5kZXhdO1xuXG5cdFx0aWYgKGNodW5rKSB7XG5cdFx0XHRjaHVuay5wcmVwZW5kUmlnaHQoY29udGVudCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMub3V0cm8gPSBjb250ZW50ICsgdGhpcy5vdXRybztcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRyZW1vdmUoc3RhcnQsIGVuZCkge1xuXHRcdHdoaWxlIChzdGFydCA8IDApIHN0YXJ0ICs9IHRoaXMub3JpZ2luYWwubGVuZ3RoO1xuXHRcdHdoaWxlIChlbmQgPCAwKSBlbmQgKz0gdGhpcy5vcmlnaW5hbC5sZW5ndGg7XG5cblx0XHRpZiAoc3RhcnQgPT09IGVuZCkgcmV0dXJuIHRoaXM7XG5cblx0XHRpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRoaXMub3JpZ2luYWwubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0NoYXJhY3RlciBpcyBvdXQgb2YgYm91bmRzJyk7XG5cdFx0aWYgKHN0YXJ0ID4gZW5kKSB0aHJvdyBuZXcgRXJyb3IoJ2VuZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBzdGFydCcpO1xuXG5cdFx0dGhpcy5fc3BsaXQoc3RhcnQpO1xuXHRcdHRoaXMuX3NwbGl0KGVuZCk7XG5cblx0XHRsZXQgY2h1bmsgPSB0aGlzLmJ5U3RhcnRbc3RhcnRdO1xuXG5cdFx0d2hpbGUgKGNodW5rKSB7XG5cdFx0XHRjaHVuay5pbnRybyA9ICcnO1xuXHRcdFx0Y2h1bmsub3V0cm8gPSAnJztcblx0XHRcdGNodW5rLmVkaXQoJycpO1xuXG5cdFx0XHRjaHVuayA9IGVuZCA+IGNodW5rLmVuZCA/IHRoaXMuYnlTdGFydFtjaHVuay5lbmRdIDogbnVsbDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRsYXN0Q2hhcigpIHtcblx0XHRpZiAodGhpcy5vdXRyby5sZW5ndGgpIHJldHVybiB0aGlzLm91dHJvW3RoaXMub3V0cm8ubGVuZ3RoIC0gMV07XG5cdFx0bGV0IGNodW5rID0gdGhpcy5sYXN0Q2h1bms7XG5cdFx0ZG8ge1xuXHRcdFx0aWYgKGNodW5rLm91dHJvLmxlbmd0aCkgcmV0dXJuIGNodW5rLm91dHJvW2NodW5rLm91dHJvLmxlbmd0aCAtIDFdO1xuXHRcdFx0aWYgKGNodW5rLmNvbnRlbnQubGVuZ3RoKSByZXR1cm4gY2h1bmsuY29udGVudFtjaHVuay5jb250ZW50Lmxlbmd0aCAtIDFdO1xuXHRcdFx0aWYgKGNodW5rLmludHJvLmxlbmd0aCkgcmV0dXJuIGNodW5rLmludHJvW2NodW5rLmludHJvLmxlbmd0aCAtIDFdO1xuXHRcdH0gd2hpbGUgKChjaHVuayA9IGNodW5rLnByZXZpb3VzKSk7XG5cdFx0aWYgKHRoaXMuaW50cm8ubGVuZ3RoKSByZXR1cm4gdGhpcy5pbnRyb1t0aGlzLmludHJvLmxlbmd0aCAtIDFdO1xuXHRcdHJldHVybiAnJztcblx0fVxuXG5cdGxhc3RMaW5lKCkge1xuXHRcdGxldCBsaW5lSW5kZXggPSB0aGlzLm91dHJvLmxhc3RJbmRleE9mKG4kMSk7XG5cdFx0aWYgKGxpbmVJbmRleCAhPT0gLTEpIHJldHVybiB0aGlzLm91dHJvLnN1YnN0cihsaW5lSW5kZXggKyAxKTtcblx0XHRsZXQgbGluZVN0ciA9IHRoaXMub3V0cm87XG5cdFx0bGV0IGNodW5rID0gdGhpcy5sYXN0Q2h1bms7XG5cdFx0ZG8ge1xuXHRcdFx0aWYgKGNodW5rLm91dHJvLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZUluZGV4ID0gY2h1bmsub3V0cm8ubGFzdEluZGV4T2YobiQxKTtcblx0XHRcdFx0aWYgKGxpbmVJbmRleCAhPT0gLTEpIHJldHVybiBjaHVuay5vdXRyby5zdWJzdHIobGluZUluZGV4ICsgMSkgKyBsaW5lU3RyO1xuXHRcdFx0XHRsaW5lU3RyID0gY2h1bmsub3V0cm8gKyBsaW5lU3RyO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2h1bmsuY29udGVudC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVJbmRleCA9IGNodW5rLmNvbnRlbnQubGFzdEluZGV4T2YobiQxKTtcblx0XHRcdFx0aWYgKGxpbmVJbmRleCAhPT0gLTEpIHJldHVybiBjaHVuay5jb250ZW50LnN1YnN0cihsaW5lSW5kZXggKyAxKSArIGxpbmVTdHI7XG5cdFx0XHRcdGxpbmVTdHIgPSBjaHVuay5jb250ZW50ICsgbGluZVN0cjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNodW5rLmludHJvLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZUluZGV4ID0gY2h1bmsuaW50cm8ubGFzdEluZGV4T2YobiQxKTtcblx0XHRcdFx0aWYgKGxpbmVJbmRleCAhPT0gLTEpIHJldHVybiBjaHVuay5pbnRyby5zdWJzdHIobGluZUluZGV4ICsgMSkgKyBsaW5lU3RyO1xuXHRcdFx0XHRsaW5lU3RyID0gY2h1bmsuaW50cm8gKyBsaW5lU3RyO1xuXHRcdFx0fVxuXHRcdH0gd2hpbGUgKChjaHVuayA9IGNodW5rLnByZXZpb3VzKSk7XG5cdFx0bGluZUluZGV4ID0gdGhpcy5pbnRyby5sYXN0SW5kZXhPZihuJDEpO1xuXHRcdGlmIChsaW5lSW5kZXggIT09IC0xKSByZXR1cm4gdGhpcy5pbnRyby5zdWJzdHIobGluZUluZGV4ICsgMSkgKyBsaW5lU3RyO1xuXHRcdHJldHVybiB0aGlzLmludHJvICsgbGluZVN0cjtcblx0fVxuXG5cdHNsaWNlKHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5vcmlnaW5hbC5sZW5ndGgpIHtcblx0XHR3aGlsZSAoc3RhcnQgPCAwKSBzdGFydCArPSB0aGlzLm9yaWdpbmFsLmxlbmd0aDtcblx0XHR3aGlsZSAoZW5kIDwgMCkgZW5kICs9IHRoaXMub3JpZ2luYWwubGVuZ3RoO1xuXG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xuXG5cdFx0Ly8gZmluZCBzdGFydCBjaHVua1xuXHRcdGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblx0XHR3aGlsZSAoY2h1bmsgJiYgKGNodW5rLnN0YXJ0ID4gc3RhcnQgfHwgY2h1bmsuZW5kIDw9IHN0YXJ0KSkge1xuXHRcdFx0Ly8gZm91bmQgZW5kIGNodW5rIGJlZm9yZSBzdGFydFxuXHRcdFx0aWYgKGNodW5rLnN0YXJ0IDwgZW5kICYmIGNodW5rLmVuZCA+PSBlbmQpIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblxuXHRcdFx0Y2h1bmsgPSBjaHVuay5uZXh0O1xuXHRcdH1cblxuXHRcdGlmIChjaHVuayAmJiBjaHVuay5lZGl0ZWQgJiYgY2h1bmsuc3RhcnQgIT09IHN0YXJ0KVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlIHJlcGxhY2VkIGNoYXJhY3RlciAke3N0YXJ0fSBhcyBzbGljZSBzdGFydCBhbmNob3IuYCk7XG5cblx0XHRjb25zdCBzdGFydENodW5rID0gY2h1bms7XG5cdFx0d2hpbGUgKGNodW5rKSB7XG5cdFx0XHRpZiAoY2h1bmsuaW50cm8gJiYgKHN0YXJ0Q2h1bmsgIT09IGNodW5rIHx8IGNodW5rLnN0YXJ0ID09PSBzdGFydCkpIHtcblx0XHRcdFx0cmVzdWx0ICs9IGNodW5rLmludHJvO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjb250YWluc0VuZCA9IGNodW5rLnN0YXJ0IDwgZW5kICYmIGNodW5rLmVuZCA+PSBlbmQ7XG5cdFx0XHRpZiAoY29udGFpbnNFbmQgJiYgY2h1bmsuZWRpdGVkICYmIGNodW5rLmVuZCAhPT0gZW5kKVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB1c2UgcmVwbGFjZWQgY2hhcmFjdGVyICR7ZW5kfSBhcyBzbGljZSBlbmQgYW5jaG9yLmApO1xuXG5cdFx0XHRjb25zdCBzbGljZVN0YXJ0ID0gc3RhcnRDaHVuayA9PT0gY2h1bmsgPyBzdGFydCAtIGNodW5rLnN0YXJ0IDogMDtcblx0XHRcdGNvbnN0IHNsaWNlRW5kID0gY29udGFpbnNFbmQgPyBjaHVuay5jb250ZW50Lmxlbmd0aCArIGVuZCAtIGNodW5rLmVuZCA6IGNodW5rLmNvbnRlbnQubGVuZ3RoO1xuXG5cdFx0XHRyZXN1bHQgKz0gY2h1bmsuY29udGVudC5zbGljZShzbGljZVN0YXJ0LCBzbGljZUVuZCk7XG5cblx0XHRcdGlmIChjaHVuay5vdXRybyAmJiAoIWNvbnRhaW5zRW5kIHx8IGNodW5rLmVuZCA9PT0gZW5kKSkge1xuXHRcdFx0XHRyZXN1bHQgKz0gY2h1bmsub3V0cm87XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjb250YWluc0VuZCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0Y2h1bmsgPSBjaHVuay5uZXh0O1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvLyBUT0RPIGRlcHJlY2F0ZSB0aGlzPyBub3QgcmVhbGx5IHZlcnkgdXNlZnVsXG5cdHNuaXAoc3RhcnQsIGVuZCkge1xuXHRcdGNvbnN0IGNsb25lID0gdGhpcy5jbG9uZSgpO1xuXHRcdGNsb25lLnJlbW92ZSgwLCBzdGFydCk7XG5cdFx0Y2xvbmUucmVtb3ZlKGVuZCwgY2xvbmUub3JpZ2luYWwubGVuZ3RoKTtcblxuXHRcdHJldHVybiBjbG9uZTtcblx0fVxuXG5cdF9zcGxpdChpbmRleCkge1xuXHRcdGlmICh0aGlzLmJ5U3RhcnRbaW5kZXhdIHx8IHRoaXMuYnlFbmRbaW5kZXhdKSByZXR1cm47XG5cblx0XHRsZXQgY2h1bmsgPSB0aGlzLmxhc3RTZWFyY2hlZENodW5rO1xuXHRcdGNvbnN0IHNlYXJjaEZvcndhcmQgPSBpbmRleCA+IGNodW5rLmVuZDtcblxuXHRcdHdoaWxlIChjaHVuaykge1xuXHRcdFx0aWYgKGNodW5rLmNvbnRhaW5zKGluZGV4KSkgcmV0dXJuIHRoaXMuX3NwbGl0Q2h1bmsoY2h1bmssIGluZGV4KTtcblxuXHRcdFx0Y2h1bmsgPSBzZWFyY2hGb3J3YXJkID8gdGhpcy5ieVN0YXJ0W2NodW5rLmVuZF0gOiB0aGlzLmJ5RW5kW2NodW5rLnN0YXJ0XTtcblx0XHR9XG5cdH1cblxuXHRfc3BsaXRDaHVuayhjaHVuaywgaW5kZXgpIHtcblx0XHRpZiAoY2h1bmsuZWRpdGVkICYmIGNodW5rLmNvbnRlbnQubGVuZ3RoKSB7XG5cdFx0XHQvLyB6ZXJvLWxlbmd0aCBlZGl0ZWQgY2h1bmtzIGFyZSBhIHNwZWNpYWwgY2FzZSAob3ZlcmxhcHBpbmcgcmVwbGFjZW1lbnRzKVxuXHRcdFx0Y29uc3QgbG9jID0gZ2V0TG9jYXRvcih0aGlzLm9yaWdpbmFsKShpbmRleCk7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBDYW5ub3Qgc3BsaXQgYSBjaHVuayB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZWRpdGVkICgke2xvYy5saW5lfToke2xvYy5jb2x1bW59IFx1MjAxMyBcIiR7Y2h1bmsub3JpZ2luYWx9XCIpYFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBuZXdDaHVuayA9IGNodW5rLnNwbGl0KGluZGV4KTtcblxuXHRcdHRoaXMuYnlFbmRbaW5kZXhdID0gY2h1bms7XG5cdFx0dGhpcy5ieVN0YXJ0W2luZGV4XSA9IG5ld0NodW5rO1xuXHRcdHRoaXMuYnlFbmRbbmV3Q2h1bmsuZW5kXSA9IG5ld0NodW5rO1xuXG5cdFx0aWYgKGNodW5rID09PSB0aGlzLmxhc3RDaHVuaykgdGhpcy5sYXN0Q2h1bmsgPSBuZXdDaHVuaztcblxuXHRcdHRoaXMubGFzdFNlYXJjaGVkQ2h1bmsgPSBjaHVuaztcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHRvU3RyaW5nKCkge1xuXHRcdGxldCBzdHIgPSB0aGlzLmludHJvO1xuXG5cdFx0bGV0IGNodW5rID0gdGhpcy5maXJzdENodW5rO1xuXHRcdHdoaWxlIChjaHVuaykge1xuXHRcdFx0c3RyICs9IGNodW5rLnRvU3RyaW5nKCk7XG5cdFx0XHRjaHVuayA9IGNodW5rLm5leHQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN0ciArIHRoaXMub3V0cm87XG5cdH1cblxuXHRpc0VtcHR5KCkge1xuXHRcdGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblx0XHRkbyB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChjaHVuay5pbnRyby5sZW5ndGggJiYgY2h1bmsuaW50cm8udHJpbSgpKSB8fFxuXHRcdFx0XHQoY2h1bmsuY29udGVudC5sZW5ndGggJiYgY2h1bmsuY29udGVudC50cmltKCkpIHx8XG5cdFx0XHRcdChjaHVuay5vdXRyby5sZW5ndGggJiYgY2h1bmsub3V0cm8udHJpbSgpKVxuXHRcdFx0KVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSB3aGlsZSAoKGNodW5rID0gY2h1bmsubmV4dCkpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0bGVuZ3RoKCkge1xuXHRcdGxldCBjaHVuayA9IHRoaXMuZmlyc3RDaHVuaztcblx0XHRsZXQgbGVuZ3RoID0gMDtcblx0XHRkbyB7XG5cdFx0XHRsZW5ndGggKz0gY2h1bmsuaW50cm8ubGVuZ3RoICsgY2h1bmsuY29udGVudC5sZW5ndGggKyBjaHVuay5vdXRyby5sZW5ndGg7XG5cdFx0fSB3aGlsZSAoKGNodW5rID0gY2h1bmsubmV4dCkpO1xuXHRcdHJldHVybiBsZW5ndGg7XG5cdH1cblxuXHR0cmltTGluZXMoKSB7XG5cdFx0cmV0dXJuIHRoaXMudHJpbSgnW1xcXFxyXFxcXG5dJyk7XG5cdH1cblxuXHR0cmltKGNoYXJUeXBlKSB7XG5cdFx0cmV0dXJuIHRoaXMudHJpbVN0YXJ0KGNoYXJUeXBlKS50cmltRW5kKGNoYXJUeXBlKTtcblx0fVxuXG5cdHRyaW1FbmRBYm9ydGVkKGNoYXJUeXBlKSB7XG5cdFx0Y29uc3QgcnggPSBuZXcgUmVnRXhwKChjaGFyVHlwZSB8fCAnXFxcXHMnKSArICcrJCcpO1xuXG5cdFx0dGhpcy5vdXRybyA9IHRoaXMub3V0cm8ucmVwbGFjZShyeCwgJycpO1xuXHRcdGlmICh0aGlzLm91dHJvLmxlbmd0aCkgcmV0dXJuIHRydWU7XG5cblx0XHRsZXQgY2h1bmsgPSB0aGlzLmxhc3RDaHVuaztcblxuXHRcdGRvIHtcblx0XHRcdGNvbnN0IGVuZCA9IGNodW5rLmVuZDtcblx0XHRcdGNvbnN0IGFib3J0ZWQgPSBjaHVuay50cmltRW5kKHJ4KTtcblxuXHRcdFx0Ly8gaWYgY2h1bmsgd2FzIHRyaW1tZWQsIHdlIGhhdmUgYSBuZXcgbGFzdENodW5rXG5cdFx0XHRpZiAoY2h1bmsuZW5kICE9PSBlbmQpIHtcblx0XHRcdFx0aWYgKHRoaXMubGFzdENodW5rID09PSBjaHVuaykge1xuXHRcdFx0XHRcdHRoaXMubGFzdENodW5rID0gY2h1bmsubmV4dDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYnlFbmRbY2h1bmsuZW5kXSA9IGNodW5rO1xuXHRcdFx0XHR0aGlzLmJ5U3RhcnRbY2h1bmsubmV4dC5zdGFydF0gPSBjaHVuay5uZXh0O1xuXHRcdFx0XHR0aGlzLmJ5RW5kW2NodW5rLm5leHQuZW5kXSA9IGNodW5rLm5leHQ7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhYm9ydGVkKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGNodW5rID0gY2h1bmsucHJldmlvdXM7XG5cdFx0fSB3aGlsZSAoY2h1bmspO1xuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dHJpbUVuZChjaGFyVHlwZSkge1xuXHRcdHRoaXMudHJpbUVuZEFib3J0ZWQoY2hhclR5cGUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdHRyaW1TdGFydEFib3J0ZWQoY2hhclR5cGUpIHtcblx0XHRjb25zdCByeCA9IG5ldyBSZWdFeHAoJ14nICsgKGNoYXJUeXBlIHx8ICdcXFxccycpICsgJysnKTtcblxuXHRcdHRoaXMuaW50cm8gPSB0aGlzLmludHJvLnJlcGxhY2UocngsICcnKTtcblx0XHRpZiAodGhpcy5pbnRyby5sZW5ndGgpIHJldHVybiB0cnVlO1xuXG5cdFx0bGV0IGNodW5rID0gdGhpcy5maXJzdENodW5rO1xuXG5cdFx0ZG8ge1xuXHRcdFx0Y29uc3QgZW5kID0gY2h1bmsuZW5kO1xuXHRcdFx0Y29uc3QgYWJvcnRlZCA9IGNodW5rLnRyaW1TdGFydChyeCk7XG5cblx0XHRcdGlmIChjaHVuay5lbmQgIT09IGVuZCkge1xuXHRcdFx0XHQvLyBzcGVjaWFsIGNhc2UuLi5cblx0XHRcdFx0aWYgKGNodW5rID09PSB0aGlzLmxhc3RDaHVuaykgdGhpcy5sYXN0Q2h1bmsgPSBjaHVuay5uZXh0O1xuXG5cdFx0XHRcdHRoaXMuYnlFbmRbY2h1bmsuZW5kXSA9IGNodW5rO1xuXHRcdFx0XHR0aGlzLmJ5U3RhcnRbY2h1bmsubmV4dC5zdGFydF0gPSBjaHVuay5uZXh0O1xuXHRcdFx0XHR0aGlzLmJ5RW5kW2NodW5rLm5leHQuZW5kXSA9IGNodW5rLm5leHQ7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhYm9ydGVkKSByZXR1cm4gdHJ1ZTtcblx0XHRcdGNodW5rID0gY2h1bmsubmV4dDtcblx0XHR9IHdoaWxlIChjaHVuayk7XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHR0cmltU3RhcnQoY2hhclR5cGUpIHtcblx0XHR0aGlzLnRyaW1TdGFydEFib3J0ZWQoY2hhclR5cGUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0aGFzQ2hhbmdlZCgpIHtcblx0XHRyZXR1cm4gdGhpcy5vcmlnaW5hbCAhPT0gdGhpcy50b1N0cmluZygpO1xuXHR9XG5cblx0X3JlcGxhY2VSZWdleHAoc2VhcmNoVmFsdWUsIHJlcGxhY2VtZW50KSB7XG5cdFx0ZnVuY3Rpb24gZ2V0UmVwbGFjZW1lbnQobWF0Y2gsIHN0cikge1xuXHRcdFx0aWYgKHR5cGVvZiByZXBsYWNlbWVudCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0cmV0dXJuIHJlcGxhY2VtZW50LnJlcGxhY2UoL1xcJChcXCR8JnxcXGQrKS9nLCAoXywgaSkgPT4ge1xuXHRcdFx0XHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9yZXBsYWNlI3NwZWNpZnlpbmdfYV9zdHJpbmdfYXNfYV9wYXJhbWV0ZXJcblx0XHRcdFx0XHRpZiAoaSA9PT0gJyQnKSByZXR1cm4gJyQnO1xuXHRcdFx0XHRcdGlmIChpID09PSAnJicpIHJldHVybiBtYXRjaFswXTtcblx0XHRcdFx0XHRjb25zdCBudW0gPSAraTtcblx0XHRcdFx0XHRpZiAobnVtIDwgbWF0Y2gubGVuZ3RoKSByZXR1cm4gbWF0Y2hbK2ldO1xuXHRcdFx0XHRcdHJldHVybiBgJCR7aX1gO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiByZXBsYWNlbWVudCguLi5tYXRjaCwgbWF0Y2guaW5kZXgsIHN0ciwgbWF0Y2guZ3JvdXBzKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZnVuY3Rpb24gbWF0Y2hBbGwocmUsIHN0cikge1xuXHRcdFx0bGV0IG1hdGNoO1xuXHRcdFx0Y29uc3QgbWF0Y2hlcyA9IFtdO1xuXHRcdFx0d2hpbGUgKChtYXRjaCA9IHJlLmV4ZWMoc3RyKSkpIHtcblx0XHRcdFx0bWF0Y2hlcy5wdXNoKG1hdGNoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaGVzO1xuXHRcdH1cblx0XHRpZiAoc2VhcmNoVmFsdWUuZ2xvYmFsKSB7XG5cdFx0XHRjb25zdCBtYXRjaGVzID0gbWF0Y2hBbGwoc2VhcmNoVmFsdWUsIHRoaXMub3JpZ2luYWwpO1xuXHRcdFx0bWF0Y2hlcy5mb3JFYWNoKChtYXRjaCkgPT4ge1xuXHRcdFx0XHRpZiAobWF0Y2guaW5kZXggIT0gbnVsbClcblx0XHRcdFx0XHR0aGlzLm92ZXJ3cml0ZShcblx0XHRcdFx0XHRcdG1hdGNoLmluZGV4LFxuXHRcdFx0XHRcdFx0bWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgsXG5cdFx0XHRcdFx0XHRnZXRSZXBsYWNlbWVudChtYXRjaCwgdGhpcy5vcmlnaW5hbClcblx0XHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gdGhpcy5vcmlnaW5hbC5tYXRjaChzZWFyY2hWYWx1ZSk7XG5cdFx0XHRpZiAobWF0Y2ggJiYgbWF0Y2guaW5kZXggIT0gbnVsbClcblx0XHRcdFx0dGhpcy5vdmVyd3JpdGUoXG5cdFx0XHRcdFx0bWF0Y2guaW5kZXgsXG5cdFx0XHRcdFx0bWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgsXG5cdFx0XHRcdFx0Z2V0UmVwbGFjZW1lbnQobWF0Y2gsIHRoaXMub3JpZ2luYWwpXG5cdFx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0X3JlcGxhY2VTdHJpbmcoc3RyaW5nLCByZXBsYWNlbWVudCkge1xuXHRcdGNvbnN0IHsgb3JpZ2luYWwgfSA9IHRoaXM7XG5cdFx0Y29uc3QgaW5kZXggPSBvcmlnaW5hbC5pbmRleE9mKHN0cmluZyk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHR0aGlzLm92ZXJ3cml0ZShpbmRleCwgaW5kZXggKyBzdHJpbmcubGVuZ3RoLCByZXBsYWNlbWVudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRyZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCkge1xuXHRcdGlmICh0eXBlb2Ygc2VhcmNoVmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fcmVwbGFjZVN0cmluZyhzZWFyY2hWYWx1ZSwgcmVwbGFjZW1lbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9yZXBsYWNlUmVnZXhwKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCk7XG5cdH1cblxuXHRfcmVwbGFjZUFsbFN0cmluZyhzdHJpbmcsIHJlcGxhY2VtZW50KSB7XG5cdFx0Y29uc3QgeyBvcmlnaW5hbCB9ID0gdGhpcztcblx0XHRjb25zdCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuXHRcdGZvciAoXG5cdFx0XHRsZXQgaW5kZXggPSBvcmlnaW5hbC5pbmRleE9mKHN0cmluZyk7XG5cdFx0XHRpbmRleCAhPT0gLTE7XG5cdFx0XHRpbmRleCA9IG9yaWdpbmFsLmluZGV4T2Yoc3RyaW5nLCBpbmRleCArIHN0cmluZ0xlbmd0aClcblx0XHQpIHtcblx0XHRcdHRoaXMub3ZlcndyaXRlKGluZGV4LCBpbmRleCArIHN0cmluZ0xlbmd0aCwgcmVwbGFjZW1lbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cmVwbGFjZUFsbChzZWFyY2hWYWx1ZSwgcmVwbGFjZW1lbnQpIHtcblx0XHRpZiAodHlwZW9mIHNlYXJjaFZhbHVlID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHRoaXMuX3JlcGxhY2VBbGxTdHJpbmcoc2VhcmNoVmFsdWUsIHJlcGxhY2VtZW50KTtcblx0XHR9XG5cblx0XHRpZiAoIXNlYXJjaFZhbHVlLmdsb2JhbCkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcblx0XHRcdFx0J01hZ2ljU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsIGNhbGxlZCB3aXRoIGEgbm9uLWdsb2JhbCBSZWdFeHAgYXJndW1lbnQnXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9yZXBsYWNlUmVnZXhwKHNlYXJjaFZhbHVlLCByZXBsYWNlbWVudCk7XG5cdH1cbn1cblxuY29uc3QgYXNzZXRVcmxSRSA9IC9fX1ZJVEVfQVNTRVRfXyhbYS16XFxkXSspX18oPzpcXCRfKC4qPylfXyk/L2c7XG5jb25zdCByYXdSRSA9IC8oPzpcXD98JilyYXcoPzomfCQpLztcbmNvbnN0IHVybFJFID0gLyhcXD98Jil1cmwoPzomfCQpLztcbmNvbnN0IGpzU291cmNlTWFwUkUgPSAvXFwuW2NtXT9qc1xcLm1hcCQvO1xuY29uc3QgYXNzZXRDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCBnZW5lcmF0ZWRBc3NldHMgPSBuZXcgV2Vha01hcCgpO1xuLy8gYWRkIG93biBkaWN0aW9uYXJ5IGVudHJ5IGJ5IGRpcmVjdGx5IGFzc2lnbmluZyBtcm1pbWVcbmZ1bmN0aW9uIHJlZ2lzdGVyQ3VzdG9tTWltZSgpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbHVrZWVkL21ybWltZS9pc3N1ZXMvM1xuICAgIG1pbWVzJDFbJ2ljbyddID0gJ2ltYWdlL3gtaWNvbic7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvTWVkaWEvRm9ybWF0cy9Db250YWluZXJzI2ZsYWNcbiAgICBtaW1lcyQxWydmbGFjJ10gPSAnYXVkaW8vZmxhYyc7XG4gICAgLy8gbXJtaW1lIGFuZCBtaW1lLWRiIGlzIG5vdCByZWxlYXNlZCB5ZXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9qc2h0dHAvbWltZS1kYi9jb21taXQvYzkyNDJhOWI3ZDRiYjI1ZDdhMGM5MjQ0YWRlYzc0YWVlZjA4ZDhhMVxuICAgIG1pbWVzJDFbJ2FhYyddID0gJ2F1ZGlvL2FhYyc7XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9CYXNpY3Nfb2ZfSFRUUC9NSU1FX3R5cGVzL0NvbW1vbl90eXBlc1xuICAgIG1pbWVzJDFbJ2VvdCddID0gJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0Jztcbn1cbmZ1bmN0aW9uIHJlbmRlckFzc2V0VXJsSW5KUyhjdHgsIGNvbmZpZywgY2h1bmssIG9wdHMsIGNvZGUpIHtcbiAgICBjb25zdCB0b1JlbGF0aXZlUnVudGltZSA9IGNyZWF0ZVRvSW1wb3J0TWV0YVVSTEJhc2VkUmVsYXRpdmVSdW50aW1lKG9wdHMuZm9ybWF0KTtcbiAgICBsZXQgbWF0Y2g7XG4gICAgbGV0IHM7XG4gICAgLy8gVXJscyBhZGRlZCB3aXRoIEpTIHVzaW5nIGUuZy5cbiAgICAvLyBpbWdFbGVtZW50LnNyYyA9IFwiX19WSVRFX0FTU0VUX181YWEwZGRjMF9fXCIgYXJlIHVzaW5nIHF1b3Rlc1xuICAgIC8vIFVybHMgYWRkZWQgaW4gQ1NTIHRoYXQgaXMgaW1wb3J0ZWQgaW4gSlMgZW5kIHVwIGxpa2VcbiAgICAvLyB2YXIgaW5saW5lZCA9IFwiLmlubGluZWR7Y29sb3I6Z3JlZW47YmFja2dyb3VuZDp1cmwoX19WSVRFX0FTU0VUX181YWEwZGRjMF9fKX1cXG5cIjtcbiAgICAvLyBJbiBib3RoIGNhc2VzLCB0aGUgd3JhcHBpbmcgc2hvdWxkIGFscmVhZHkgYmUgZmluZVxuICAgIGFzc2V0VXJsUkUubGFzdEluZGV4ID0gMDtcbiAgICB3aGlsZSAoKG1hdGNoID0gYXNzZXRVcmxSRS5leGVjKGNvZGUpKSkge1xuICAgICAgICBzIHx8IChzID0gbmV3IE1hZ2ljU3RyaW5nKGNvZGUpKTtcbiAgICAgICAgY29uc3QgW2Z1bGwsIHJlZmVyZW5jZUlkLCBwb3N0Zml4ID0gJyddID0gbWF0Y2g7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBjdHguZ2V0RmlsZU5hbWUocmVmZXJlbmNlSWQpO1xuICAgICAgICBjaHVuay52aXRlTWV0YWRhdGEuaW1wb3J0ZWRBc3NldHMuYWRkKGNsZWFuVXJsKGZpbGUpKTtcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBmaWxlICsgcG9zdGZpeDtcbiAgICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0b091dHB1dEZpbGVQYXRoSW5KUyhmaWxlbmFtZSwgJ2Fzc2V0JywgY2h1bmsuZmlsZU5hbWUsICdqcycsIGNvbmZpZywgdG9SZWxhdGl2ZVJ1bnRpbWUpO1xuICAgICAgICBjb25zdCByZXBsYWNlbWVudFN0cmluZyA9IHR5cGVvZiByZXBsYWNlbWVudCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkocmVwbGFjZW1lbnQpLnNsaWNlKDEsIC0xKVxuICAgICAgICAgICAgOiBgXCIrJHtyZXBsYWNlbWVudC5ydW50aW1lfStcImA7XG4gICAgICAgIHMudXBkYXRlKG1hdGNoLmluZGV4LCBtYXRjaC5pbmRleCArIGZ1bGwubGVuZ3RoLCByZXBsYWNlbWVudFN0cmluZyk7XG4gICAgfVxuICAgIC8vIFJlcGxhY2UgX19WSVRFX1BVQkxJQ19BU1NFVF9fNWFhMGRkYzBfXyB3aXRoIGFic29sdXRlIHBhdGhzXG4gICAgY29uc3QgcHVibGljQXNzZXRVcmxNYXAgPSBwdWJsaWNBc3NldFVybENhY2hlLmdldChjb25maWcpO1xuICAgIHB1YmxpY0Fzc2V0VXJsUkUubGFzdEluZGV4ID0gMDtcbiAgICB3aGlsZSAoKG1hdGNoID0gcHVibGljQXNzZXRVcmxSRS5leGVjKGNvZGUpKSkge1xuICAgICAgICBzIHx8IChzID0gbmV3IE1hZ2ljU3RyaW5nKGNvZGUpKTtcbiAgICAgICAgY29uc3QgW2Z1bGwsIGhhc2hdID0gbWF0Y2g7XG4gICAgICAgIGNvbnN0IHB1YmxpY1VybCA9IHB1YmxpY0Fzc2V0VXJsTWFwLmdldChoYXNoKS5zbGljZSgxKTtcbiAgICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0b091dHB1dEZpbGVQYXRoSW5KUyhwdWJsaWNVcmwsICdwdWJsaWMnLCBjaHVuay5maWxlTmFtZSwgJ2pzJywgY29uZmlnLCB0b1JlbGF0aXZlUnVudGltZSk7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VtZW50U3RyaW5nID0gdHlwZW9mIHJlcGxhY2VtZW50ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShyZXBsYWNlbWVudCkuc2xpY2UoMSwgLTEpXG4gICAgICAgICAgICA6IGBcIiske3JlcGxhY2VtZW50LnJ1bnRpbWV9K1wiYDtcbiAgICAgICAgcy51cGRhdGUobWF0Y2guaW5kZXgsIG1hdGNoLmluZGV4ICsgZnVsbC5sZW5ndGgsIHJlcGxhY2VtZW50U3RyaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG59XG4vKipcbiAqIEFsc28gc3VwcG9ydHMgbG9hZGluZyBwbGFpbiBzdHJpbmdzIHdpdGggaW1wb3J0IHRleHQgZnJvbSAnLi9mb28udHh0P3JhdydcbiAqL1xuZnVuY3Rpb24gYXNzZXRQbHVnaW4oY29uZmlnKSB7XG4gICAgcmVnaXN0ZXJDdXN0b21NaW1lKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3ZpdGU6YXNzZXQnLFxuICAgICAgICBidWlsZFN0YXJ0KCkge1xuICAgICAgICAgICAgYXNzZXRDYWNoZS5zZXQoY29uZmlnLCBuZXcgTWFwKCkpO1xuICAgICAgICAgICAgZ2VuZXJhdGVkQXNzZXRzLnNldChjb25maWcsIG5ldyBNYXAoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgICAgICAgaWYgKCFjb25maWcuYXNzZXRzSW5jbHVkZShjbGVhblVybChpZCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaW1wb3J0cyB0byBhYnNvbHV0ZSB1cmxzIHBvaW50aW5nIHRvIGZpbGVzIGluIC9wdWJsaWNcbiAgICAgICAgICAgIC8vIHdpbGwgZmFpbCB0byByZXNvbHZlIGluIHRoZSBtYWluIHJlc29sdmVyLiBoYW5kbGUgdGhlbSBoZXJlLlxuICAgICAgICAgICAgY29uc3QgcHVibGljRmlsZSA9IGNoZWNrUHVibGljRmlsZShpZCwgY29uZmlnKTtcbiAgICAgICAgICAgIGlmIChwdWJsaWNGaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aCgnXFwwJykpIHtcbiAgICAgICAgICAgICAgICAvLyBSb2xsdXAgY29udmVudGlvbiwgdGhpcyBpZCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGVcbiAgICAgICAgICAgICAgICAvLyBwbHVnaW4gdGhhdCBtYXJrZWQgaXQgd2l0aCBcXDBcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByYXcgcmVxdWVzdHMsIHJlYWQgZnJvbSBkaXNrXG4gICAgICAgICAgICBpZiAocmF3UkUudGVzdChpZCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gY2hlY2tQdWJsaWNGaWxlKGlkLCBjb25maWcpIHx8IGNsZWFuVXJsKGlkKTtcbiAgICAgICAgICAgICAgICAvLyByYXcgcXVlcnksIHJlYWQgZmlsZSBhbmQgcmV0dXJuIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgIHJldHVybiBgZXhwb3J0IGRlZmF1bHQgJHtKU09OLnN0cmluZ2lmeShhd2FpdCBwcm9taXNlcyQyLnJlYWRGaWxlKGZpbGUsICd1dGYtOCcpKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjb25maWcuYXNzZXRzSW5jbHVkZShjbGVhblVybChpZCkpICYmICF1cmxSRS50ZXN0KGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlkID0gaWQucmVwbGFjZSh1cmxSRSwgJyQxJykucmVwbGFjZSgvWz8mXSQvLCAnJyk7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBmaWxlVG9VcmwoaWQsIGNvbmZpZywgdGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gYGV4cG9ydCBkZWZhdWx0ICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gO1xuICAgICAgICB9LFxuICAgICAgICByZW5kZXJDaHVuayhjb2RlLCBjaHVuaywgb3B0cykge1xuICAgICAgICAgICAgY29uc3QgcyA9IHJlbmRlckFzc2V0VXJsSW5KUyh0aGlzLCBjb25maWcsIGNodW5rLCBvcHRzLCBjb2RlKTtcbiAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogcy50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IGNvbmZpZy5idWlsZC5zb3VyY2VtYXAgPyBzLmdlbmVyYXRlTWFwKHsgaGlyZXM6IHRydWUgfSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2VuZXJhdGVCdW5kbGUoXywgYnVuZGxlKSB7XG4gICAgICAgICAgICAvLyBkbyBub3QgZW1pdCBhc3NldHMgZm9yIFNTUiBidWlsZFxuICAgICAgICAgICAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnYnVpbGQnICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLmJ1aWxkLnNzciAmJlxuICAgICAgICAgICAgICAgICFjb25maWcuYnVpbGQuc3NyRW1pdEFzc2V0cykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBpbiBidW5kbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZVtmaWxlXS50eXBlID09PSAnYXNzZXQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhZmlsZS5lbmRzV2l0aCgnc3NyLW1hbmlmZXN0Lmpzb24nKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWpzU291cmNlTWFwUkUudGVzdChmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGJ1bmRsZVtmaWxlXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufVxuZnVuY3Rpb24gY2hlY2tQdWJsaWNGaWxlKHVybCwgeyBwdWJsaWNEaXIgfSkge1xuICAgIC8vIG5vdGUgaWYgdGhlIGZpbGUgaXMgaW4gL3B1YmxpYywgdGhlIHJlc29sdmVyIHdvdWxkIGhhdmUgcmV0dXJuZWQgaXRcbiAgICAvLyBhcy1pcyBzbyBpdCdzIG5vdCBnb2luZyB0byBiZSBhIGZ1bGx5IHJlc29sdmVkIHBhdGguXG4gICAgaWYgKCFwdWJsaWNEaXIgfHwgIXVybC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwdWJsaWNGaWxlID0gcGF0aCRvLmpvaW4ocHVibGljRGlyLCBjbGVhblVybCh1cmwpKTtcbiAgICBpZiAoIXB1YmxpY0ZpbGUuc3RhcnRzV2l0aChwdWJsaWNEaXIpKSB7XG4gICAgICAgIC8vIGNhbiBoYXBwZW4gaWYgVVJMIHN0YXJ0cyB3aXRoICcuLi8nXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGZzJGwuZXhpc3RzU3luYyhwdWJsaWNGaWxlKSkge1xuICAgICAgICByZXR1cm4gcHVibGljRmlsZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiBmaWxlVG9VcmwoaWQsIGNvbmZpZywgY3R4KSB7XG4gICAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnKSB7XG4gICAgICAgIHJldHVybiBmaWxlVG9EZXZVcmwoaWQsIGNvbmZpZyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmlsZVRvQnVpbHRVcmwoaWQsIGNvbmZpZywgY3R4KTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaWxlVG9EZXZVcmwoaWQsIGNvbmZpZykge1xuICAgIGxldCBydG47XG4gICAgaWYgKGNoZWNrUHVibGljRmlsZShpZCwgY29uZmlnKSkge1xuICAgICAgICAvLyBpbiBwdWJsaWMgZGlyLCBrZWVwIHRoZSB1cmwgYXMtaXNcbiAgICAgICAgcnRuID0gaWQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlkLnN0YXJ0c1dpdGgoY29uZmlnLnJvb3QpKSB7XG4gICAgICAgIC8vIGluIHByb2plY3Qgcm9vdCwgaW5mZXIgc2hvcnQgcHVibGljIHBhdGhcbiAgICAgICAgcnRuID0gJy8nICsgcGF0aCRvLnBvc2l4LnJlbGF0aXZlKGNvbmZpZy5yb290LCBpZCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBvdXRzaWRlIG9mIHByb2plY3Qgcm9vdCwgdXNlIGFic29sdXRlIGZzIHBhdGhcbiAgICAgICAgLy8gKHRoaXMgaXMgc3BlY2lhbCBoYW5kbGVkIGJ5IHRoZSBzZXJ2ZSBzdGF0aWMgbWlkZGxld2FyZVxuICAgICAgICBydG4gPSBwYXRoJG8ucG9zaXguam9pbihGU19QUkVGSVgsIGlkKTtcbiAgICB9XG4gICAgY29uc3QgYmFzZSA9IGpvaW5VcmxTZWdtZW50cyhjb25maWcuc2VydmVyPy5vcmlnaW4gPz8gJycsIGNvbmZpZy5iYXNlKTtcbiAgICByZXR1cm4gam9pblVybFNlZ21lbnRzKGJhc2UsIHJ0bi5yZXBsYWNlKC9eXFwvLywgJycpKTtcbn1cbmZ1bmN0aW9uIGdldFB1YmxpY0Fzc2V0RmlsZW5hbWUoaGFzaCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHB1YmxpY0Fzc2V0VXJsQ2FjaGUuZ2V0KGNvbmZpZyk/LmdldChoYXNoKTtcbn1cbmNvbnN0IHB1YmxpY0Fzc2V0VXJsQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgcHVibGljQXNzZXRVcmxSRSA9IC9fX1ZJVEVfUFVCTElDX0FTU0VUX18oW2EtelxcZF17OH0pX18vZztcbmZ1bmN0aW9uIHB1YmxpY0ZpbGVUb0J1aWx0VXJsKHVybCwgY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy5jb21tYW5kICE9PSAnYnVpbGQnKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IG5lZWQgcmVsYXRpdmUgYmFzZSBvciByZW5kZXJCdWlsdFVybCBzdXBwb3J0IGR1cmluZyBkZXZcbiAgICAgICAgcmV0dXJuIGpvaW5VcmxTZWdtZW50cyhjb25maWcuYmFzZSwgdXJsKTtcbiAgICB9XG4gICAgY29uc3QgaGFzaCA9IGdldEhhc2godXJsKTtcbiAgICBsZXQgY2FjaGUgPSBwdWJsaWNBc3NldFVybENhY2hlLmdldChjb25maWcpO1xuICAgIGlmICghY2FjaGUpIHtcbiAgICAgICAgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHB1YmxpY0Fzc2V0VXJsQ2FjaGUuc2V0KGNvbmZpZywgY2FjaGUpO1xuICAgIH1cbiAgICBpZiAoIWNhY2hlLmdldChoYXNoKSkge1xuICAgICAgICBjYWNoZS5zZXQoaGFzaCwgdXJsKTtcbiAgICB9XG4gICAgcmV0dXJuIGBfX1ZJVEVfUFVCTElDX0FTU0VUX18ke2hhc2h9X19gO1xufVxuY29uc3QgR0lUX0xGU19QUkVGSVggPSBCdWZmZXIkMS5mcm9tKCd2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tJyk7XG5mdW5jdGlvbiBpc0dpdExmc1BsYWNlaG9sZGVyKGNvbnRlbnQpIHtcbiAgICBpZiAoY29udGVudC5sZW5ndGggPCBHSVRfTEZTX1BSRUZJWC5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb250ZW50IGJlZ2lucyB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBzdHJpbmcgb2YgR2l0IExGUyBwbGFjZWhvbGRlcnNcbiAgICByZXR1cm4gR0lUX0xGU19QUkVGSVguY29tcGFyZShjb250ZW50LCAwLCBHSVRfTEZTX1BSRUZJWC5sZW5ndGgpID09PSAwO1xufVxuLyoqXG4gKiBSZWdpc3RlciBhbiBhc3NldCB0byBiZSBlbWl0dGVkIGFzIHBhcnQgb2YgdGhlIGJ1bmRsZSAoaWYgbmVjZXNzYXJ5KVxuICogYW5kIHJldHVybnMgdGhlIHJlc29sdmVkIHB1YmxpYyBVUkxcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmlsZVRvQnVpbHRVcmwoaWQsIGNvbmZpZywgcGx1Z2luQ29udGV4dCwgc2tpcFB1YmxpY0NoZWNrID0gZmFsc2UpIHtcbiAgICBpZiAoIXNraXBQdWJsaWNDaGVjayAmJiBjaGVja1B1YmxpY0ZpbGUoaWQsIGNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIHB1YmxpY0ZpbGVUb0J1aWx0VXJsKGlkLCBjb25maWcpO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZSA9IGFzc2V0Q2FjaGUuZ2V0KGNvbmZpZyk7XG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGlkKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IGZpbGUgPSBjbGVhblVybChpZCk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHByb21pc2VzJDIucmVhZEZpbGUoZmlsZSk7XG4gICAgbGV0IHVybDtcbiAgICBpZiAoY29uZmlnLmJ1aWxkLmxpYiB8fFxuICAgICAgICAoIWZpbGUuZW5kc1dpdGgoJy5zdmcnKSAmJlxuICAgICAgICAgICAgIWZpbGUuZW5kc1dpdGgoJy5odG1sJykgJiZcbiAgICAgICAgICAgIGNvbnRlbnQubGVuZ3RoIDwgTnVtYmVyKGNvbmZpZy5idWlsZC5hc3NldHNJbmxpbmVMaW1pdCkgJiZcbiAgICAgICAgICAgICFpc0dpdExmc1BsYWNlaG9sZGVyKGNvbnRlbnQpKSkge1xuICAgICAgICBpZiAoY29uZmlnLmJ1aWxkLmxpYiAmJiBpc0dpdExmc1BsYWNlaG9sZGVyKGNvbnRlbnQpKSB7XG4gICAgICAgICAgICBjb25maWcubG9nZ2VyLndhcm4ocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KGBJbmxpbmVkIGZpbGUgJHtpZH0gd2FzIG5vdCBkb3dubG9hZGVkIHZpYSBHaXQgTEZTYCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbWVUeXBlID0gbG9va3VwKGZpbGUpID8/ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuICAgICAgICAvLyBiYXNlNjQgaW5saW5lZCBhcyBhIHN0cmluZ1xuICAgICAgICB1cmwgPSBgZGF0YToke21pbWVUeXBlfTtiYXNlNjQsJHtjb250ZW50LnRvU3RyaW5nKCdiYXNlNjQnKX1gO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gZW1pdCBhcyBhc3NldFxuICAgICAgICBjb25zdCB7IHNlYXJjaCwgaGFzaCB9ID0gcGFyc2UkaShpZCk7XG4gICAgICAgIGNvbnN0IHBvc3RmaXggPSAoc2VhcmNoIHx8ICcnKSArIChoYXNoIHx8ICcnKTtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBwbHVnaW5Db250ZXh0LmVtaXRGaWxlKHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBhc3NldCBmaWxlIG5hbWVzXG4gICAgICAgICAgICBuYW1lOiBwYXRoJG8uYmFzZW5hbWUoZmlsZSksXG4gICAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgICAgICAgc291cmNlOiBjb250ZW50LFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxOYW1lID0gbm9ybWFsaXplUGF0aCQzKHBhdGgkby5yZWxhdGl2ZShjb25maWcucm9vdCwgZmlsZSkpO1xuICAgICAgICBnZW5lcmF0ZWRBc3NldHMuZ2V0KGNvbmZpZykuc2V0KHJlZmVyZW5jZUlkLCB7IG9yaWdpbmFsTmFtZSB9KTtcbiAgICAgICAgdXJsID0gYF9fVklURV9BU1NFVF9fJHtyZWZlcmVuY2VJZH1fXyR7cG9zdGZpeCA/IGAkXyR7cG9zdGZpeH1fX2AgOiBgYH1gOyAvLyBUT0RPX0JBU0VcbiAgICB9XG4gICAgY2FjaGUuc2V0KGlkLCB1cmwpO1xuICAgIHJldHVybiB1cmw7XG59XG5hc3luYyBmdW5jdGlvbiB1cmxUb0J1aWx0VXJsKHVybCwgaW1wb3J0ZXIsIGNvbmZpZywgcGx1Z2luQ29udGV4dCkge1xuICAgIGlmIChjaGVja1B1YmxpY0ZpbGUodXJsLCBjb25maWcpKSB7XG4gICAgICAgIHJldHVybiBwdWJsaWNGaWxlVG9CdWlsdFVybCh1cmwsIGNvbmZpZyk7XG4gICAgfVxuICAgIGNvbnN0IGZpbGUgPSB1cmwuc3RhcnRzV2l0aCgnLycpXG4gICAgICAgID8gcGF0aCRvLmpvaW4oY29uZmlnLnJvb3QsIHVybClcbiAgICAgICAgOiBwYXRoJG8uam9pbihwYXRoJG8uZGlybmFtZShpbXBvcnRlciksIHVybCk7XG4gICAgcmV0dXJuIGZpbGVUb0J1aWx0VXJsKGZpbGUsIGNvbmZpZywgcGx1Z2luQ29udGV4dCwgXG4gICAgLy8gc2tpcCBwdWJsaWMgY2hlY2sgc2luY2Ugd2UganVzdCBkaWQgaXQgYWJvdmVcbiAgICB0cnVlKTtcbn1cblxuZnVuY3Rpb24gbWFuaWZlc3RQbHVnaW4oY29uZmlnKSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB7fTtcbiAgICBsZXQgb3V0cHV0Q291bnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3ZpdGU6bWFuaWZlc3QnLFxuICAgICAgICBidWlsZFN0YXJ0KCkge1xuICAgICAgICAgICAgb3V0cHV0Q291bnQgPSAwO1xuICAgICAgICB9LFxuICAgICAgICBnZW5lcmF0ZUJ1bmRsZSh7IGZvcm1hdCB9LCBidW5kbGUpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldENodW5rTmFtZShjaHVuaykge1xuICAgICAgICAgICAgICAgIGlmIChjaHVuay5mYWNhZGVNb2R1bGVJZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IG5vcm1hbGl6ZVBhdGgkMyhwYXRoJG8ucmVsYXRpdmUoY29uZmlnLnJvb3QsIGNodW5rLmZhY2FkZU1vZHVsZUlkKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdzeXN0ZW0nICYmICFjaHVuay5uYW1lLmluY2x1ZGVzKCctbGVnYWN5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IHBhdGgkby5leHRuYW1lKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kUG9zID0gZXh0Lmxlbmd0aCAhPT0gMCA/IC1leHQubGVuZ3RoIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgZW5kUG9zKSArIGAtbGVnYWN5YCArIGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9cXDAvZywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBfYCArIHBhdGgkby5iYXNlbmFtZShjaHVuay5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxJbXBvcnRzKGltcG9ydHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEltcG9ydHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgaW1wb3J0cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlW2ZpbGVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW1wb3J0cy5wdXNoKGdldENodW5rTmFtZShidW5kbGVbZmlsZV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkSW1wb3J0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNodW5rKGNodW5rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuaWZlc3RDaHVuayA9IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogY2h1bmsuZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoY2h1bmsuZmFjYWRlTW9kdWxlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RDaHVuay5zcmMgPSBnZXRDaHVua05hbWUoY2h1bmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2h1bmsuaXNFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdENodW5rLmlzRW50cnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2h1bmsuaXNEeW5hbWljRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RDaHVuay5pc0R5bmFtaWNFbnRyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaHVuay5pbXBvcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbEltcG9ydHMgPSBnZXRJbnRlcm5hbEltcG9ydHMoY2h1bmsuaW1wb3J0cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbEltcG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RDaHVuay5pbXBvcnRzID0gaW50ZXJuYWxJbXBvcnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaHVuay5keW5hbWljSW1wb3J0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxJbXBvcnRzID0gZ2V0SW50ZXJuYWxJbXBvcnRzKGNodW5rLmR5bmFtaWNJbXBvcnRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsSW1wb3J0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdENodW5rLmR5bmFtaWNJbXBvcnRzID0gaW50ZXJuYWxJbXBvcnRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaHVuay52aXRlTWV0YWRhdGE/LmltcG9ydGVkQ3NzLnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RDaHVuay5jc3MgPSBbLi4uY2h1bmsudml0ZU1ldGFkYXRhLmltcG9ydGVkQ3NzXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNodW5rLnZpdGVNZXRhZGF0YT8uaW1wb3J0ZWRBc3NldHMuc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdENodW5rLmFzc2V0cyA9IFsuLi5jaHVuay52aXRlTWV0YWRhdGEuaW1wb3J0ZWRBc3NldHNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWFuaWZlc3RDaHVuaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUFzc2V0KGFzc2V0LCBzcmMsIGlzRW50cnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5pZmVzdENodW5rID0ge1xuICAgICAgICAgICAgICAgICAgICBmaWxlOiBhc3NldC5maWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGlzRW50cnkpXG4gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0Q2h1bmsuaXNFbnRyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hbmlmZXN0Q2h1bms7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZVRvQXNzZXRNZXRhID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3QgYXNzZXRzID0gZ2VuZXJhdGVkQXNzZXRzLmdldChjb25maWcpO1xuICAgICAgICAgICAgYXNzZXRzLmZvckVhY2goKGFzc2V0LCByZWZlcmVuY2VJZCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5nZXRGaWxlTmFtZShyZWZlcmVuY2VJZCk7XG4gICAgICAgICAgICAgICAgZmlsZU5hbWVUb0Fzc2V0TWV0YS5zZXQoZmlsZU5hbWUsIGFzc2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVUb0Fzc2V0ID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIGluIGJ1bmRsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gYnVuZGxlW2ZpbGVdO1xuICAgICAgICAgICAgICAgIGlmIChjaHVuay50eXBlID09PSAnY2h1bmsnKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0W2dldENodW5rTmFtZShjaHVuayldID0gY3JlYXRlQ2h1bmsoY2h1bmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaHVuay50eXBlID09PSAnYXNzZXQnICYmIHR5cGVvZiBjaHVuay5uYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgZXZlcnkgdW5pcXVlIGFzc2V0IHRvIHRoZSBtYW5pZmVzdCwga2V5ZWQgYnkgaXRzIG9yaWdpbmFsIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXNzZXRNZXRhID0gZmlsZU5hbWVUb0Fzc2V0TWV0YS5nZXQoY2h1bmsuZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBhc3NldE1ldGE/Lm9yaWdpbmFsTmFtZSA/PyBjaHVuay5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhc3NldCA9IGNyZWF0ZUFzc2V0KGNodW5rLCBzcmMsIGFzc2V0TWV0YT8uaXNFbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0W3NyY10gPSBhc3NldDtcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVUb0Fzc2V0LnNldChjaHVuay5maWxlTmFtZSwgYXNzZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFkZCBkZWR1cGxpY2F0ZWQgYXNzZXRzIHRvIHRoZSBtYW5pZmVzdFxuICAgICAgICAgICAgYXNzZXRzLmZvckVhY2goKHsgb3JpZ2luYWxOYW1lIH0sIHJlZmVyZW5jZUlkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYW5pZmVzdFtvcmlnaW5hbE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5nZXRGaWxlTmFtZShyZWZlcmVuY2VJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gZmlsZU5hbWVUb0Fzc2V0LmdldChmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhc3NldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3Rbb3JpZ2luYWxOYW1lXSA9IGFzc2V0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvdXRwdXRDb3VudCsrO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gY29uZmlnLmJ1aWxkLnJvbGx1cE9wdGlvbnM/Lm91dHB1dDtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dExlbmd0aCA9IEFycmF5LmlzQXJyYXkob3V0cHV0KSA/IG91dHB1dC5sZW5ndGggOiAxO1xuICAgICAgICAgICAgaWYgKG91dHB1dENvdW50ID49IG91dHB1dExlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogdHlwZW9mIGNvbmZpZy5idWlsZC5tYW5pZmVzdCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY29uZmlnLmJ1aWxkLm1hbmlmZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdtYW5pZmVzdC5qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Fzc2V0JyxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBqc29uU3RhYmxlU3RyaW5naWZ5KG1hbmlmZXN0LCB7IHNwYWNlOiAyIH0pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5cbi8vIFRoaXMgaXMgYmFzZWQgb24gQHJvbGx1cC9wbHVnaW4tZGF0YS11cmlcbmNvbnN0IGRhdGFVcmlSRSA9IC9eKFteL10rXFwvW147LF0rKSg7YmFzZTY0KT8sKFtcXHNcXFNdKikkLztcbmNvbnN0IGRhdGFVcmlQcmVmaXggPSBgL0BkYXRhLXVyaS9gO1xuLyoqXG4gKiBCdWlsZCBvbmx5LCBzaW5jZSBpbXBvcnRpbmcgZnJvbSBhIGRhdGEgVVJJIHdvcmtzIG5hdGl2ZWx5LlxuICovXG5mdW5jdGlvbiBkYXRhVVJJUGx1Z2luKCkge1xuICAgIGxldCByZXNvbHZlZDtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTpkYXRhLXVyaScsXG4gICAgICAgIGJ1aWxkU3RhcnQoKSB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHt9O1xuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgICAgICAgIGlmICghZGF0YVVyaVJFLnRlc3QoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMJDMoaWQpO1xuICAgICAgICAgICAgaWYgKHVyaS5wcm90b2NvbCAhPT0gJ2RhdGE6Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB1cmkucGF0aG5hbWUubWF0Y2goZGF0YVVyaVJFKTtcbiAgICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFssIG1pbWUsIGZvcm1hdCwgZGF0YV0gPSBtYXRjaDtcbiAgICAgICAgICAgIGlmIChtaW1lICE9PSAndGV4dC9qYXZhc2NyaXB0Jykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YSBVUkkgd2l0aCBub24tSmF2YVNjcmlwdCBtaW1lIHR5cGUgaXMgbm90IHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRlY29kZSBkYXRhXG4gICAgICAgICAgICBjb25zdCBiYXNlNjQgPSBmb3JtYXQgJiYgL2Jhc2U2NC9pLnRlc3QoZm9ybWF0LnN1YnN0cmluZygxKSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gYmFzZTY0XG4gICAgICAgICAgICAgICAgPyBCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04JylcbiAgICAgICAgICAgICAgICA6IGRhdGE7XG4gICAgICAgICAgICByZXNvbHZlZFtpZF0gPSBjb250ZW50O1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFVcmlQcmVmaXggKyBpZDtcbiAgICAgICAgfSxcbiAgICAgICAgbG9hZChpZCkge1xuICAgICAgICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoZGF0YVVyaVByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICBpZCA9IGlkLnNsaWNlKGRhdGFVcmlQcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRbaWRdIHx8IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuLyogZXMtbW9kdWxlLWxleGVyIDEuMi4wICovXG5jb25zdCBBPTE9PT1uZXcgVWludDhBcnJheShuZXcgVWludDE2QXJyYXkoWzFdKS5idWZmZXIpWzBdO2Z1bmN0aW9uIHBhcnNlJGUoRSxnPVwiQFwiKXtpZighQylyZXR1cm4gaW5pdC50aGVuKCgoKT0+cGFyc2UkZShFKSkpO2NvbnN0IEk9RS5sZW5ndGgrMSxvPShDLl9faGVhcF9iYXNlLnZhbHVlfHxDLl9faGVhcF9iYXNlKSs0KkktQy5tZW1vcnkuYnVmZmVyLmJ5dGVMZW5ndGg7bz4wJiZDLm1lbW9yeS5ncm93KE1hdGguY2VpbChvLzY1NTM2KSk7Y29uc3QgSz1DLnNhKEktMSk7aWYoKEE/QjpRKShFLG5ldyBVaW50MTZBcnJheShDLm1lbW9yeS5idWZmZXIsSyxJKSksIUMucGFyc2UoKSl0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgUGFyc2UgZXJyb3IgJHtnfToke0Uuc2xpY2UoMCxDLmUoKSkuc3BsaXQoXCJcXG5cIikubGVuZ3RofToke0MuZSgpLUUubGFzdEluZGV4T2YoXCJcXG5cIixDLmUoKS0xKX1gKSx7aWR4OkMuZSgpfSk7Y29uc3QgRD1bXSxrPVtdO2Zvcig7Qy5yaSgpOyl7Y29uc3QgQT1DLmlzKCksUT1DLmllKCksQj1DLmFpKCksZz1DLmlkKCksST1DLnNzKCksbz1DLnNlKCk7bGV0IEs7Qy5pcCgpJiYoSz1KKEUuc2xpY2UoLTE9PT1nP0EtMTpBLC0xPT09Zz9RKzE6USkpKSxELnB1c2goe246SyxzOkEsZTpRLHNzOkksc2U6byxkOmcsYTpCfSk7fWZvcig7Qy5yZSgpOyl7Y29uc3QgQT1DLmVzKCksUT1DLmVlKCksQj1DLmVscygpLGc9Qy5lbGUoKSxJPUUuc2xpY2UoQSxRKSxvPUlbMF0sSz1CPDA/dm9pZCAwOkUuc2xpY2UoQixnKSxEPUs/S1swXTpcIlwiO2sucHVzaCh7czpBLGU6USxsczpCLGxlOmcsbjonXCInPT09b3x8XCInXCI9PT1vP0ooSSk6SSxsbjonXCInPT09RHx8XCInXCI9PT1EP0ooSyk6S30pO31mdW5jdGlvbiBKKEEpe3RyeXtyZXR1cm4gKDAsIGV2YWwpKEEpfWNhdGNoKEEpe319cmV0dXJuIFtELGssISFDLmYoKV19ZnVuY3Rpb24gUShBLFEpe2NvbnN0IEI9QS5sZW5ndGg7bGV0IEM9MDtmb3IoO0M8Qjspe2NvbnN0IEI9QS5jaGFyQ29kZUF0KEMpO1FbQysrXT0oMjU1JkIpPDw4fEI+Pj44O319ZnVuY3Rpb24gQihBLFEpe2NvbnN0IEI9QS5sZW5ndGg7bGV0IEM9MDtmb3IoO0M8QjspUVtDXT1BLmNoYXJDb2RlQXQoQysrKTt9bGV0IEM7Y29uc3QgaW5pdD1XZWJBc3NlbWJseS5jb21waWxlKChFPVwiQUdGemJRRUFBQUFCS2doZ0FYOEJmMkFFZjM5L2Z3QmdBQUYvWUFBQVlBRi9BR0FEZjM5L0FYOWdBbjkvQVg5Z0FuOS9BQU12TGdBQkFRSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQUF3TURCQVFBQUFBREFBQUFBQU1EQUFVR0FBQUFCd0FHQWdVRUJRRndBUUVCQlFNQkFBRUdEd0ovQVVHdzhnQUxmd0JCc1BJQUN3ZHdFd1p0WlcxdmNua0NBQUp6WVFBQUFXVUFBd0pwY3dBRUFtbGxBQVVDYzNNQUJnSnpaUUFIQW1GcEFBZ0NhV1FBQ1FKcGNBQUtBbVZ6QUFzQ1pXVUFEQU5sYkhNQURRTmxiR1VBRGdKeWFRQVBBbkpsQUJBQlpnQVJCWEJoY25ObEFCSUxYMTlvWldGd1gySmhjMlVEQVFyQU95NW9BUUYvUVFBZ0FEWUM5QWxCQUNnQzBBa2lBU0FBUVFGMGFpSUFRUUE3QVFCQkFDQUFRUUpxSWdBMkF2Z0pRUUFnQURZQy9BbEJBRUVBTmdMVUNVRUFRUUEyQXVRSlFRQkJBRFlDM0FsQkFFRUFOZ0xZQ1VFQVFRQTJBdXdKUVFCQkFEWUM0QWtnQVF1ZkFRRURmMEVBS0FMa0NTRUVRUUJCQUNnQy9Ba2lCVFlDNUFsQkFDQUVOZ0xvQ1VFQUlBVkJJR28yQXZ3SklBUkJIR3BCMUFrZ0JCc2dCVFlDQUVFQUtBTElDU0VFUVFBb0FzUUpJUVlnQlNBQk5nSUFJQVVnQURZQ0NDQUZJQUlnQWtFQ2FrRUFJQVlnQTBZYklBUWdBMFliTmdJTUlBVWdBellDRkNBRlFRQTJBaEFnQlNBQ05nSUVJQVZCQURZQ0hDQUZRUUFvQXNRSklBTkdPZ0FZQzFZQkFYOUJBQ2dDN0FraUJFRVFha0hZQ1NBRUcwRUFLQUw4Q1NJRU5nSUFRUUFnQkRZQzdBbEJBQ0FFUVJScU5nTDhDU0FFUVFBMkFoQWdCQ0FETmdJTUlBUWdBallDQ0NBRUlBRTJBZ1FnQkNBQU5nSUFDd2dBUVFBb0FvQUtDeFVBUVFBb0F0d0pLQUlBUVFBb0F0QUphMEVCZFFzZUFRRi9RUUFvQXR3SktBSUVJZ0JCQUNnQzBBbHJRUUYxUVg4Z0FCc0xGUUJCQUNnQzNBa29BZ2hCQUNnQzBBbHJRUUYxQ3g0QkFYOUJBQ2dDM0Frb0Fnd2lBRUVBS0FMUUNXdEJBWFZCZnlBQUd3c2VBUUYvUVFBb0F0d0pLQUlRSWdCQkFDZ0MwQWxyUVFGMVFYOGdBQnNMT3dFQmZ3SkFRUUFvQXR3SktBSVVJZ0JCQUNnQ3hBbEhEUUJCZnc4TEFrQWdBRUVBS0FMSUNVY05BRUYrRHdzZ0FFRUFLQUxRQ1d0QkFYVUxDd0JCQUNnQzNBa3RBQmdMRlFCQkFDZ0M0QWtvQWdCQkFDZ0MwQWxyUVFGMUN4VUFRUUFvQXVBSktBSUVRUUFvQXRBSmEwRUJkUXNlQVFGL1FRQW9BdUFKS0FJSUlnQkJBQ2dDMEFsclFRRjFRWDhnQUJzTEhnRUJmMEVBS0FMZ0NTZ0NEQ0lBUVFBb0F0QUphMEVCZFVGL0lBQWJDeVVCQVg5QkFFRUFLQUxjQ1NJQVFSeHFRZFFKSUFBYktBSUFJZ0EyQXR3SklBQkJBRWNMSlFFQmYwRUFRUUFvQXVBSklnQkJFR3BCMkFrZ0FCc29BZ0FpQURZQzRBa2dBRUVBUndzSUFFRUFMUUNFQ2d2bURBRUdmeU1BUVlEUUFHc2lBQ1FBUVFCQkFUb0FoQXBCQUVFQUtBTE1DVFlDakFwQkFFRUFLQUxRQ1VGK2FpSUJOZ0tnQ2tFQUlBRkJBQ2dDOUFsQkFYUnFJZ0kyQXFRS1FRQkJBRHNCaGdwQkFFRUFPd0dJQ2tFQVFRQTZBSkFLUVFCQkFEWUNnQXBCQUVFQU9nRHdDVUVBSUFCQmdCQnFOZ0tVQ2tFQUlBQTJBcGdLUVFCQkFEb0FuQW9DUUFKQUFrQUNRQU5BUVFBZ0FVRUNhaUlETmdLZ0NpQUJJQUpQRFFFQ1FDQURMd0VBSWdKQmQycEJCVWtOQUFKQUFrQUNRQUpBQWtBZ0FrR2JmMm9PQlFFSUNBZ0NBQXNnQWtFZ1JnMEVJQUpCTDBZTkF5QUNRVHRHRFFJTUJ3dEJBQzhCaUFvTkFTQURFQk5GRFFFZ0FVRUVha0dDQ0VFS0VDME5BUkFVUVFBdEFJUUtEUUZCQUVFQUtBS2dDaUlCTmdLTUNnd0hDeUFERUJORkRRQWdBVUVFYWtHTUNFRUtFQzBOQUJBVkMwRUFRUUFvQXFBS05nS01DZ3dCQ3dKQUlBRXZBUVFpQTBFcVJnMEFJQU5CTDBjTkJCQVdEQUVMUVFFUUZ3dEJBQ2dDcEFvaEFrRUFLQUtnQ2lFQkRBQUxDMEVBSVFJZ0F5RUJRUUF0QVBBSkRRSU1BUXRCQUNBQk5nS2dDa0VBUVFBNkFJUUtDd05BUVFBZ0FVRUNhaUlETmdLZ0NnSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUJRUUFvQXFRS1R3MEFJQU12QVFBaUFrRjNha0VGU1EwSUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBa0ZnYWc0S0VoRUdFUkVSRVFVQkFnQUxBa0FDUUFKQUFrQWdBa0dnZjJvT0Nnc1VGQU1VQVJRVUZBSUFDeUFDUVlWL2FnNERCUk1HQ1F0QkFDOEJpQW9ORWlBREVCTkZEUklnQVVFRWFrR0NDRUVLRUMwTkVoQVVEQklMSUFNUUUwVU5FU0FCUVFScVFZd0lRUW9RTFEwUkVCVU1FUXNnQXhBVFJRMFFJQUVwQUFSQzdJQ0VnN0NPd0RsU0RSQWdBUzhCRENJRFFYZHFJZ0ZCRjBzTkRrRUJJQUYwUVorQWdBUnhSUTBPREE4TFFRQkJBQzhCaUFvaUFVRUJhanNCaUFwQkFDZ0NsQW9nQVVFRGRHb2lBVUVCTmdJQUlBRkJBQ2dDakFvMkFnUU1Ed3RCQUM4QmlBb2lBa1VOQzBFQUlBSkJmMm9pQkRzQmlBcEJBQzhCaGdvaUFrVU5EaUFDUVFKMFFRQW9BcGdLYWtGOGFpZ0NBQ0lGS0FJVVFRQW9BcFFLSUFSQi8vOERjVUVEZEdvb0FnUkhEUTRDUUNBRktBSUVEUUFnQlNBRE5nSUVDMEVBSUFKQmYybzdBWVlLSUFVZ0FVRUVhallDREF3T0N3SkFRUUFvQW93S0lnRXZBUUJCS1VjTkFFRUFLQUxrQ1NJRFJRMEFJQU1vQWdRZ0FVY05BRUVBUVFBb0F1Z0pJZ00yQXVRSkFrQWdBMFVOQUNBRFFRQTJBaHdNQVF0QkFFRUFOZ0xVQ1F0QkFFRUFMd0dJQ2lJRFFRRnFPd0dJQ2tFQUtBS1VDaUFEUVFOMGFpSURRUVpCQWtFQUxRQ2NDaHMyQWdBZ0F5QUJOZ0lFUVFCQkFEb0FuQW9NRFF0QkFDOEJpQW9pQVVVTkNVRUFJQUZCZjJvaUFUc0JpQXBCQUNnQ2xBb2dBVUgvL3dOeFFRTjBhaWdDQUVFRVJnMEVEQXdMUVNjUUdBd0xDMEVpRUJnTUNnc2dBa0V2UncwSkFrQUNRQ0FCTHdFRUlnRkJLa1lOQUNBQlFTOUhEUUVRRmd3TUMwRUJFQmNNQ3dzQ1FBSkFRUUFvQW93S0lnRXZBUUFpQXhBWlJRMEFBa0FDUUNBRFFWVnFEZ1FBQ0FFRENBc2dBVUYrYWk4QkFFRXJSZzBHREFjTElBRkJmbW92QVFCQkxVWU5CUXdHQ3dKQUlBTkIvUUJHRFFBZ0EwRXBSdzBGUVFBb0FwUUtRUUF2QVlnS1FRTjBhaWdDQkJBYVJRMEZEQVlMUVFBb0FwUUtRUUF2QVlnS1FRTjBhaUlDS0FJRUVCc05CU0FDS0FJQVFRWkdEUVVNQkFzZ0FVRithaThCQUVGUWFrSC8vd054UVFwSkRRTU1CQXRCQUNnQ2xBcEJBQzhCaUFvaUFVRURkQ0lEYWtFQUtBS01DallDQkVFQUlBRkJBV283QVlnS1FRQW9BcFFLSUFOcVFRTTJBZ0FMRUJ3TUJ3dEJBQzBBOEFsQkFDOEJoZ3BCQUM4QmlBcHlja1VoQWd3SkN5QUJFQjBOQUNBRFJRMEFJQU5CTDBaQkFDMEFrQXBCQUVkeERRQWdBVUYrYWlFQlFRQW9BdEFKSVFJQ1FBTkFJQUZCQW1vaUJDQUNUUTBCUVFBZ0FUWUNqQW9nQVM4QkFDRURJQUZCZm1vaUJDRUJJQU1RSGtVTkFBc2dCRUVDYWlFRUMwRUJJUVVnQTBILy93TnhFQjlGRFFFZ0JFRithaUVCQWtBRFFDQUJRUUpxSWdNZ0FrME5BVUVBSUFFMkFvd0tJQUV2QVFBaEF5QUJRWDVxSWdRaEFTQURFQjhOQUFzZ0JFRUNhaUVEQ3lBREVDQkZEUUVRSVVFQVFRQTZBSkFLREFVTEVDRkJBQ0VGQzBFQUlBVTZBSkFLREFNTEVDSkJBQ0VDREFVTElBTkJvQUZIRFFFTFFRQkJBVG9BbkFvTFFRQkJBQ2dDb0FvMkFvd0tDMEVBS0FLZ0NpRUJEQUFMQ3lBQVFZRFFBR29rQUNBQ0N4b0FBa0JCQUNnQzBBa2dBRWNOQUVFQkR3c2dBRUYrYWhBakM4MEpBUVYvUVFCQkFDZ0NvQW9pQUVFTWFpSUJOZ0tnQ2tFQUtBTHNDU0VDUVFFUUp5RURBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0JCQUNnQ29Bb2lCQ0FCUncwQUlBTVFKa1VOQVFzQ1FBSkFBa0FDUUNBRFFTcEdEUUFnQTBIN0FFY05BVUVBSUFSQkFtbzJBcUFLUVFFUUp5RUVRUUFvQXFBS0lRRURRQUpBQWtBZ0JFSC8vd054SWdOQklrWU5BQ0FEUVNkR0RRQWdBeEFxR2tFQUtBS2dDaUVEREFFTElBTVFHRUVBUVFBb0FxQUtRUUpxSWdNMkFxQUtDMEVCRUNjYUFrQWdBU0FERUNzaUJFRXNSdzBBUVFCQkFDZ0NvQXBCQW1vMkFxQUtRUUVRSnlFRUMwRUFLQUtnQ2lFRElBUkIvUUJHRFFNZ0F5QUJSZzBOSUFNaEFTQURRUUFvQXFRS1RRMEFEQTBMQzBFQUlBUkJBbW8yQXFBS1FRRVFKeHBCQUNnQ29Bb2lBeUFERUNzYURBSUxRUUJCQURvQWhBb0NRQUpBQWtBQ1FBSkFBa0FnQTBHZmYyb09EQUlJQkFFSUF3Z0lDQWdJQlFBTElBTkI5Z0JHRFFRTUJ3dEJBQ0FFUVE1cUlnTTJBcUFLQWtBQ1FBSkFRUUVRSjBHZmYyb09CZ0FRQWhBUUFSQUxRUUFvQXFBS0lnRXBBQUpDODREa2crQ053REZTRFE4Z0FTOEJDaEFmUlEwUFFRQWdBVUVLYWpZQ29BcEJBQkFuR2d0QkFDZ0NvQW9pQVVFQ2FrR2lDRUVPRUMwTkRpQUJMd0VRSWdCQmQyb2lBa0VYU3cwTFFRRWdBblJCbjRDQUJIRkZEUXNNREF0QkFDZ0NvQW9pQVNrQUFrTHNnSVNEc0k3QU9WSU5EU0FCTHdFS0lnQkJkMm9pQWtFWFRRMEhEQWdMUVFBZ0JFRUthallDb0FwQkFCQW5Ha0VBS0FLZ0NpRUVDMEVBSUFSQkVHbzJBcUFLQWtCQkFSQW5JZ1JCS2tjTkFFRUFRUUFvQXFBS1FRSnFOZ0tnQ2tFQkVDY2hCQXRCQUNnQ29Bb2hBeUFFRUNvYUlBTkJBQ2dDb0FvaUJDQURJQVFRQWtFQVFRQW9BcUFLUVg1cU5nS2dDZzhMQWtBZ0JDa0FBa0xzZ0lTRHNJN0FPVklOQUNBRUx3RUtFQjVGRFFCQkFDQUVRUXBxTmdLZ0NrRUJFQ2NoQkVFQUtBS2dDaUVESUFRUUtob2dBMEVBS0FLZ0NpSUVJQU1nQkJBQ1FRQkJBQ2dDb0FwQmZtbzJBcUFLRHd0QkFDQUVRUVJxSWdRMkFxQUtDMEVBSUFSQkJHb2lBellDb0FwQkFFRUFPZ0NFQ2dKQUEwQkJBQ0FEUVFKcU5nS2dDa0VCRUNjaEJFRUFLQUtnQ2lFRElBUVFLa0VnY2tIN0FFWU5BVUVBS0FLZ0NpSUVJQU5HRFFRZ0F5QUVJQU1nQkJBQ1FRRVFKMEVzUncwQlFRQW9BcUFLSVFNTUFBc0xRUUJCQUNnQ29BcEJmbW8yQXFBS0R3dEJBQ0FEUVFKcU5nS2dDZ3RCQVJBbklRUkJBQ2dDb0FvaEF3SkFJQVJCNWdCSERRQWdBMEVDYWtHY0NFRUdFQzBOQUVFQUlBTkJDR28yQXFBS0lBQkJBUkFuRUNrZ0FrRVFha0hZQ1NBQ0d5RURBMEFnQXlnQ0FDSURSUTBDSUFOQ0FEY0NDQ0FEUVJCcUlRTU1BQXNMUVFBZ0EwRithallDb0FvTER3dEJBU0FDZEVHZmdJQUVjUTBCQ3lBQVFhQUJSZzBBSUFCQit3QkhEUVFMUVFBZ0FVRUthallDb0FwQkFSQW5JZ0ZCK3dCR0RRTU1BZ3NDUUNBQVFWaHFEZ01CQXdFQUN5QUFRYUFCUncwQ0MwRUFJQUZCRUdvMkFxQUtBa0JCQVJBbklnRkJLa2NOQUVFQVFRQW9BcUFLUVFKcU5nS2dDa0VCRUNjaEFRc2dBVUVvUmcwQkMwRUFLQUtnQ2lFQ0lBRVFLaHBCQUNnQ29Bb2lBU0FDVFEwQUlBUWdBeUFDSUFFUUFrRUFRUUFvQXFBS1FYNXFOZ0tnQ2c4TElBUWdBMEVBUVFBUUFrRUFJQVJCREdvMkFxQUtEd3NRSWd2VUJnRUVmMEVBUVFBb0FxQUtJZ0JCREdvaUFUWUNvQW9DUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUVFQkVDY2lBa0ZaYWc0SUJBSUJCQUVCQVFNQUN5QUNRU0pHRFFNZ0FrSDdBRVlOQkF0QkFDZ0NvQW9nQVVjTkFrRUFJQUJCQ21vMkFxQUtEd3RCQUNnQ2xBcEJBQzhCaUFvaUFrRURkR29pQVVFQUtBS2dDallDQkVFQUlBSkJBV283QVlnS0lBRkJCVFlDQUVFQUtBS01DaThCQUVFdVJnMERRUUJCQUNnQ29Bb2lBVUVDYWpZQ29BcEJBUkFuSVFJZ0FFRUFLQUtnQ2tFQUlBRVFBVUVBUVFBdkFZWUtJZ0ZCQVdvN0FZWUtRUUFvQXBnS0lBRkJBblJxUVFBb0F1UUpOZ0lBQWtBZ0FrRWlSZzBBSUFKQkowWU5BRUVBUVFBb0FxQUtRWDVxTmdLZ0NnOExJQUlRR0VFQVFRQW9BcUFLUVFKcUlnSTJBcUFLQWtBQ1FBSkFRUUVRSjBGWGFnNEVBUUlDQUFJTFFRQkJBQ2dDb0FwQkFtbzJBcUFLUVFFUUp4cEJBQ2dDNUFraUFTQUNOZ0lFSUFGQkFUb0FHQ0FCUVFBb0FxQUtJZ0kyQWhCQkFDQUNRWDVxTmdLZ0NnOExRUUFvQXVRSklnRWdBallDQkNBQlFRRTZBQmhCQUVFQUx3R0lDa0YvYWpzQmlBb2dBVUVBS0FLZ0NrRUNhallDREVFQVFRQXZBWVlLUVg5cU93R0dDZzhMUVFCQkFDZ0NvQXBCZm1vMkFxQUtEd3RCQUVFQUtBS2dDa0VDYWpZQ29BcEJBUkFuUWUwQVJ3MENRUUFvQXFBS0lnSkJBbXBCbGdoQkJoQXREUUlDUUVFQUtBS01DaUlCRUNnTkFDQUJMd0VBUVM1R0RRTUxJQUFnQUNBQ1FRaHFRUUFvQXNnSkVBRVBDMEVBTHdHSUNnMENRUUFvQXFBS0lRSkJBQ2dDcEFvaEF3TkFJQUlnQTA4TkJRSkFBa0FnQWk4QkFDSUJRU2RHRFFBZ0FVRWlSdzBCQ3lBQUlBRVFLUThMUVFBZ0FrRUNhaUlDTmdLZ0Nnd0FDd3RCQUNnQ29Bb2hBa0VBTHdHSUNnMENBa0FEUUFKQUFrQUNRQ0FDUVFBb0FxUUtUdzBBUVFFUUp5SUNRU0pHRFFFZ0FrRW5SZzBCSUFKQi9RQkhEUUpCQUVFQUtBS2dDa0VDYWpZQ29Bb0xRUUVRSnlFQlFRQW9BcUFLSVFJQ1FDQUJRZVlBUncwQUlBSkJBbXBCbkFoQkJoQXREUWdMUVFBZ0FrRUlhallDb0FwQkFSQW5JZ0pCSWtZTkF5QUNRU2RHRFFNTUJ3c2dBaEFZQzBFQVFRQW9BcUFLUVFKcUlnSTJBcUFLREFBTEN5QUFJQUlRS1FzUEMwRUFRUUFvQXFBS1FYNXFOZ0tnQ2c4TFFRQWdBa0YrYWpZQ29Bb1BDeEFpQzBjQkEzOUJBQ2dDb0FwQkFtb2hBRUVBS0FLa0NpRUJBa0FEUUNBQUlnSkJmbW9nQVU4TkFTQUNRUUpxSVFBZ0FpOEJBRUYyYWc0RUFRQUFBUUFMQzBFQUlBSTJBcUFLQzVnQkFRTi9RUUJCQUNnQ29Bb2lBVUVDYWpZQ29Bb2dBVUVHYWlFQlFRQW9BcVFLSVFJRFFBSkFBa0FDUUNBQlFYeHFJQUpQRFFBZ0FVRithaThCQUNFREFrQUNRQ0FBRFFBZ0EwRXFSZzBCSUFOQmRtb09CQUlFQkFJRUN5QURRU3BIRFFNTElBRXZBUUJCTDBjTkFrRUFJQUZCZm1vMkFxQUtEQUVMSUFGQmZtb2hBUXRCQUNBQk5nS2dDZzhMSUFGQkFtb2hBUXdBQ3d1SUFRRUVmMEVBS0FLZ0NpRUJRUUFvQXFRS0lRSUNRQUpBQTBBZ0FTSURRUUpxSVFFZ0F5QUNUdzBCSUFFdkFRQWlCQ0FBUmcwQ0FrQWdCRUhjQUVZTkFDQUVRWFpxRGdRQ0FRRUNBUXNnQTBFRWFpRUJJQU12QVFSQkRVY05BQ0FEUVFacUlBRWdBeThCQmtFS1Joc2hBUXdBQ3d0QkFDQUJOZ0tnQ2hBaUR3dEJBQ0FCTmdLZ0NndHNBUUYvQWtBQ1FDQUFRVjlxSWdGQkJVc05BRUVCSUFGMFFURnhEUUVMSUFCQlJtcEIvLzhEY1VFR1NRMEFJQUJCS1VjZ0FFRllha0gvL3dOeFFRZEpjUTBBQWtBZ0FFR2xmMm9PQkFFQUFBRUFDeUFBUWYwQVJ5QUFRWVYvYWtILy93TnhRUVJKY1E4TFFRRUxMZ0VCZjBFQklRRUNRQ0FBUVpZSlFRVVFKQTBBSUFCQm9BbEJBeEFrRFFBZ0FFR21DVUVDRUNRaEFRc2dBUXVEQVFFQ2YwRUJJUUVDUUFKQUFrQUNRQUpBQWtBZ0FDOEJBQ0lDUVVWcURnUUZCQVFCQUFzQ1FDQUNRWnQvYWc0RUF3UUVBZ0FMSUFKQktVWU5CQ0FDUWZrQVJ3MERJQUJCZm1wQnNnbEJCaEFrRHdzZ0FFRithaThCQUVFOVJnOExJQUJCZm1wQnFnbEJCQkFrRHdzZ0FFRitha0crQ1VFREVDUVBDMEVBSVFFTElBRUwzZ0VCQkg5QkFDZ0NvQW9oQUVFQUtBS2tDaUVCQWtBQ1FBSkFBMEFnQUNJQ1FRSnFJUUFnQWlBQlR3MEJBa0FDUUFKQUlBQXZBUUFpQTBHa2Yyb09CUUlEQXdNQkFBc2dBMEVrUncwQ0lBSXZBUVJCK3dCSERRSkJBQ0FDUVFScUlnQTJBcUFLUVFCQkFDOEJpQW9pQWtFQmFqc0JpQXBCQUNnQ2xBb2dBa0VEZEdvaUFrRUVOZ0lBSUFJZ0FEWUNCQThMUVFBZ0FEWUNvQXBCQUVFQUx3R0lDa0YvYWlJQU93R0lDa0VBS0FLVUNpQUFRZi8vQTNGQkEzUnFLQUlBUVFOSERRTU1CQXNnQWtFRWFpRUFEQUFMQzBFQUlBQTJBcUFLQ3hBaUN3dTBBd0VDZjBFQUlRRUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FBTHdFQVFaeC9hZzRVQUFFQ0NRa0pDUU1KQ1FRRkNRa0dDUWNKQ1FnSkN3SkFBa0FnQUVGK2FpOEJBRUdYZjJvT0JBQUtDZ0VLQ3lBQVFYeHFRYm9JUVFJUUpBOExJQUJCZkdwQnZnaEJBeEFrRHdzQ1FBSkFBa0FnQUVGK2FpOEJBRUdOZjJvT0F3QUJBZ29MQWtBZ0FFRjhhaThCQUNJQ1FlRUFSZzBBSUFKQjdBQkhEUW9nQUVGNmFrSGxBQkFsRHdzZ0FFRjZha0hqQUJBbER3c2dBRUY4YWtIRUNFRUVFQ1FQQ3lBQVFYeHFRY3dJUVFZUUpBOExJQUJCZm1vdkFRQkI3d0JIRFFZZ0FFRjhhaThCQUVIbEFFY05CZ0pBSUFCQmVtb3ZBUUFpQWtId0FFWU5BQ0FDUWVNQVJ3MEhJQUJCZUdwQjJBaEJCaEFrRHdzZ0FFRjRha0hrQ0VFQ0VDUVBDeUFBUVg1cVFlZ0lRUVFRSkE4TFFRRWhBU0FBUVg1cUlnQkI2UUFRSlEwRUlBQkI4QWhCQlJBa0R3c2dBRUYrYWtIa0FCQWxEd3NnQUVGK2FrSDZDRUVIRUNRUEN5QUFRWDVxUVlnSlFRUVFKQThMQWtBZ0FFRithaThCQUNJQ1FlOEFSZzBBSUFKQjVRQkhEUUVnQUVGOGFrSHVBQkFsRHdzZ0FFRjhha0dRQ1VFREVDUWhBUXNnQVFzMEFRRi9RUUVoQVFKQUlBQkJkMnBCLy84RGNVRUZTUTBBSUFCQmdBRnlRYUFCUmcwQUlBQkJMa2NnQUJBbWNTRUJDeUFCQ3pBQkFYOENRQUpBSUFCQmQyb2lBVUVYU3cwQVFRRWdBWFJCallDQUJIRU5BUXNnQUVHZ0FVWU5BRUVBRHd0QkFRdE9BUUovUVFBaEFRSkFBa0FnQUM4QkFDSUNRZVVBUmcwQUlBSkI2d0JIRFFFZ0FFRitha0hvQ0VFRUVDUVBDeUFBUVg1cUx3RUFRZlVBUncwQUlBQkJmR3BCekFoQkJoQWtJUUVMSUFFTGNBRUNmd0pBQWtBRFFFRUFRUUFvQXFBS0lnQkJBbW9pQVRZQ29Bb2dBRUVBS0FLa0NrOE5BUUpBQWtBQ1FDQUJMd0VBSWdGQnBYOXFEZ0lCQWdBTEFrQWdBVUYyYWc0RUJBTURCQUFMSUFGQkwwY05BZ3dFQ3hBc0dnd0JDMEVBSUFCQkJHbzJBcUFLREFBTEN4QWlDd3MxQVFGL1FRQkJBVG9BOEFsQkFDZ0NvQW9oQUVFQVFRQW9BcVFLUVFKcU5nS2dDa0VBSUFCQkFDZ0MwQWxyUVFGMU5nS0FDZ3REQVFKL1FRRWhBUUpBSUFBdkFRQWlBa0YzYWtILy93TnhRUVZKRFFBZ0FrR0FBWEpCb0FGR0RRQkJBQ0VCSUFJUUprVU5BQ0FDUVM1SElBQVFLSElQQ3lBQkMwWUJBMzlCQUNFREFrQWdBQ0FDUVFGMElnSnJJZ1JCQW1vaUFFRUFLQUxRQ1NJRlNRMEFJQUFnQVNBQ0VDME5BQUpBSUFBZ0JVY05BRUVCRHdzZ0JCQWpJUU1MSUFNTFBRRUNmMEVBSVFJQ1FFRUFLQUxRQ1NJRElBQkxEUUFnQUM4QkFDQUJSdzBBQWtBZ0F5QUFSdzBBUVFFUEN5QUFRWDVxTHdFQUVCNGhBZ3NnQWd0b0FRSi9RUUVoQVFKQUFrQWdBRUZmYWlJQ1FRVkxEUUJCQVNBQ2RFRXhjUTBCQ3lBQVFmai9BM0ZCS0VZTkFDQUFRVVpxUWYvL0EzRkJCa2tOQUFKQUlBQkJwWDlxSWdKQkEwc05BQ0FDUVFGSERRRUxJQUJCaFg5cVFmLy9BM0ZCQkVraEFRc2dBUXVjQVFFRGYwRUFLQUtnQ2lFQkFrQURRQUpBQWtBZ0FTOEJBQ0lDUVM5SERRQUNRQ0FCTHdFQ0lnRkJLa1lOQUNBQlFTOUhEUVFRRmd3Q0N5QUFFQmNNQVFzQ1FBSkFJQUJGRFFBZ0FrRjNhaUlCUVJkTERRRkJBU0FCZEVHZmdJQUVjVVVOQVF3Q0N5QUNFQjlGRFFNTUFRc2dBa0dnQVVjTkFndEJBRUVBS0FLZ0NpSURRUUpxSWdFMkFxQUtJQU5CQUNnQ3BBcEpEUUFMQ3lBQ0N6RUJBWDlCQUNFQkFrQWdBQzhCQUVFdVJ3MEFJQUJCZm1vdkFRQkJMa2NOQUNBQVFYeHFMd0VBUVM1R0lRRUxJQUVMd2dNQkFYOENRQ0FCUVNKR0RRQWdBVUVuUmcwQUVDSVBDMEVBS0FLZ0NpRUNJQUVRR0NBQUlBSkJBbXBCQUNnQ29BcEJBQ2dDeEFrUUFVRUFRUUFvQXFBS1FRSnFOZ0tnQ2tFQUVDY2hBRUVBS0FLZ0NpRUJBa0FDUUNBQVFlRUFSdzBBSUFGQkFtcEJzQWhCQ2hBdFJRMEJDMEVBSUFGQmZtbzJBcUFLRHd0QkFDQUJRUXhxTmdLZ0NnSkFRUUVRSjBIN0FFWU5BRUVBSUFFMkFxQUtEd3RCQUNnQ29Bb2lBaUVBQTBCQkFDQUFRUUpxTmdLZ0NnSkFBa0FDUUVFQkVDY2lBRUVpUmcwQUlBQkJKMGNOQVVFbkVCaEJBRUVBS0FLZ0NrRUNhallDb0FwQkFSQW5JUUFNQWd0QkloQVlRUUJCQUNnQ29BcEJBbW8yQXFBS1FRRVFKeUVBREFFTElBQVFLaUVBQ3dKQUlBQkJPa1lOQUVFQUlBRTJBcUFLRHd0QkFFRUFLQUtnQ2tFQ2FqWUNvQW9DUUVFQkVDY2lBRUVpUmcwQUlBQkJKMFlOQUVFQUlBRTJBcUFLRHdzZ0FCQVlRUUJCQUNnQ29BcEJBbW8yQXFBS0FrQUNRRUVCRUNjaUFFRXNSZzBBSUFCQi9RQkdEUUZCQUNBQk5nS2dDZzhMUVFCQkFDZ0NvQXBCQW1vMkFxQUtRUUVRSjBIOUFFWU5BRUVBS0FLZ0NpRUFEQUVMQzBFQUtBTGtDU0lCSUFJMkFoQWdBVUVBS0FLZ0NrRUNhallDREF0dEFRSi9Ba0FDUUFOQUFrQWdBRUgvL3dOeElnRkJkMm9pQWtFWFN3MEFRUUVnQW5SQm40Q0FCSEVOQWdzZ0FVR2dBVVlOQVNBQUlRSWdBUkFtRFFKQkFDRUNRUUJCQUNnQ29Bb2lBRUVDYWpZQ29Bb2dBQzhCQWlJQURRQU1BZ3NMSUFBaEFnc2dBa0gvL3dOeEM2c0JBUVIvQWtBQ1FFRUFLQUtnQ2lJQ0x3RUFJZ05CNFFCR0RRQWdBU0VFSUFBaEJRd0JDMEVBSUFKQkJHbzJBcUFLUVFFUUp5RUNRUUFvQXFBS0lRVUNRQUpBSUFKQklrWU5BQ0FDUVNkR0RRQWdBaEFxR2tFQUtBS2dDaUVFREFFTElBSVFHRUVBUVFBb0FxQUtRUUpxSWdRMkFxQUtDMEVCRUNjaEEwRUFLQUtnQ2lFQ0N3SkFJQUlnQlVZTkFDQUZJQVJCQUNBQUlBQWdBVVlpQWh0QkFDQUJJQUliRUFJTElBTUxjZ0VFZjBFQUtBS2dDaUVBUVFBb0FxUUtJUUVDUUFKQUEwQWdBRUVDYWlFQ0lBQWdBVThOQVFKQUFrQWdBaThCQUNJRFFhUi9hZzRDQVFRQUN5QUNJUUFnQTBGMmFnNEVBZ0VCQWdFTElBQkJCR29oQUF3QUN3dEJBQ0FDTmdLZ0NoQWlRUUFQQzBFQUlBSTJBcUFLUWQwQUMwa0JBMzlCQUNFREFrQWdBa1VOQUFKQUEwQWdBQzBBQUNJRUlBRXRBQUFpQlVjTkFTQUJRUUZxSVFFZ0FFRUJhaUVBSUFKQmYyb2lBZzBBREFJTEN5QUVJQVZySVFNTElBTUxDK0lCQWdCQmdBZ0x4QUVBQUhnQWNBQnZBSElBZEFCdEFIQUFid0J5QUhRQVpRQjBBR0VBY2dCdkFHMEFkUUJ1QUdNQWRBQnBBRzhBYmdCekFITUFaUUJ5QUhRQWRnQnZBSGtBYVFCbEFHUUFaUUJzQUdVQVl3QnZBRzRBZEFCcEFHNEFhUUJ1QUhNQWRBQmhBRzRBZEFCNUFHSUFjZ0JsQUdFQWNnQmxBSFFBZFFCeUFHUUFaUUJpQUhVQVp3Qm5BR1VBWVFCM0FHRUFhUUIwQUdnQWNnQjNBR2dBYVFCc0FHVUFaZ0J2QUhJQWFRQm1BR01BWVFCMEFHTUFaZ0JwQUc0QVlRQnNBR3dBWlFCc0FITUFBRUhFQ1FzUUFRQUFBQUlBQUFBQUJBQUFNRGtBQUE9PVwiLFwidW5kZWZpbmVkXCIhPXR5cGVvZiBCdWZmZXI/QnVmZmVyLmZyb20oRSxcImJhc2U2NFwiKTpVaW50OEFycmF5LmZyb20oYXRvYihFKSwoQT0+QS5jaGFyQ29kZUF0KDApKSkpKS50aGVuKFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKS50aGVuKCgoe2V4cG9ydHM6QX0pPT57Qz1BO30pKTt2YXIgRTtcblxuY29uc3QgaXNEZWJ1ZyQ2ID0gISFwcm9jZXNzLmVudi5ERUJVRztcbmNvbnN0IGRlYnVnJGUgPSBjcmVhdGVEZWJ1Z2dlcigndml0ZTpzb3VyY2VtYXAnLCB7XG4gICAgb25seVdoZW5Gb2N1c2VkOiB0cnVlLFxufSk7XG4vLyBWaXJ0dWFsIG1vZHVsZXMgc2hvdWxkIGJlIHByZWZpeGVkIHdpdGggYSBudWxsIGJ5dGUgdG8gYXZvaWQgYVxuLy8gZmFsc2UgcG9zaXRpdmUgXCJtaXNzaW5nIHNvdXJjZVwiIHdhcm5pbmcuIFdlIGFsc28gY2hlY2sgZm9yIGNlcnRhaW5cbi8vIHByZWZpeGVzIHVzZWQgZm9yIHNwZWNpYWwgaGFuZGxpbmcgaW4gZXNidWlsZERlcFBsdWdpbi5cbmNvbnN0IHZpcnR1YWxTb3VyY2VSRSA9IC9eKD86ZGVwOnxicm93c2VyLWV4dGVybmFsOnx2aXJ0dWFsOil8XFwwLztcbmFzeW5jIGZ1bmN0aW9uIGluamVjdFNvdXJjZXNDb250ZW50KG1hcCwgZmlsZSwgbG9nZ2VyKSB7XG4gICAgbGV0IHNvdXJjZVJvb3Q7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gVGhlIHNvdXJjZSByb290IGlzIHVuZGVmaW5lZCBmb3IgdmlydHVhbCBtb2R1bGVzIGFuZCBwZXJtaXNzaW9uIGVycm9ycy5cbiAgICAgICAgc291cmNlUm9vdCA9IGF3YWl0IHByb21pc2VzJDIucmVhbHBhdGgocGF0aCRvLnJlc29sdmUocGF0aCRvLmRpcm5hbWUoZmlsZSksIG1hcC5zb3VyY2VSb290IHx8ICcnKSk7XG4gICAgfVxuICAgIGNhdGNoIHsgfVxuICAgIGNvbnN0IG1pc3NpbmdTb3VyY2VzID0gW107XG4gICAgbWFwLnNvdXJjZXNDb250ZW50ID0gYXdhaXQgUHJvbWlzZS5hbGwobWFwLnNvdXJjZXMubWFwKChzb3VyY2VQYXRoKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2VQYXRoICYmICF2aXJ0dWFsU291cmNlUkUudGVzdChzb3VyY2VQYXRoKSkge1xuICAgICAgICAgICAgc291cmNlUGF0aCA9IGRlY29kZVVSSShzb3VyY2VQYXRoKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VSb290KSB7XG4gICAgICAgICAgICAgICAgc291cmNlUGF0aCA9IHBhdGgkby5yZXNvbHZlKHNvdXJjZVJvb3QsIHNvdXJjZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VzJDIucmVhZEZpbGUoc291cmNlUGF0aCwgJ3V0Zi04JykuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1pc3NpbmdTb3VyY2VzLnB1c2goc291cmNlUGF0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9KSk7XG4gICAgLy8gVXNlIHRoaXMgY29tbWFuZFx1MjAyNlxuICAgIC8vICAgIERFQlVHPVwidml0ZTpzb3VyY2VtYXBcIiB2aXRlIGJ1aWxkXG4gICAgLy8gXHUyMDI2dG8gbG9nIHRoZSBtaXNzaW5nIHNvdXJjZXMuXG4gICAgaWYgKG1pc3NpbmdTb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICBsb2dnZXIud2Fybk9uY2UoYFNvdXJjZW1hcCBmb3IgXCIke2ZpbGV9XCIgcG9pbnRzIHRvIG1pc3Npbmcgc291cmNlIGZpbGVzYCk7XG4gICAgICAgIGlzRGVidWckNiAmJiBkZWJ1ZyRlKGBNaXNzaW5nIHNvdXJjZXM6XFxuICBgICsgbWlzc2luZ1NvdXJjZXMuam9pbihgXFxuICBgKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2VuU291cmNlTWFwVXJsKG1hcCkge1xuICAgIGlmICh0eXBlb2YgbWFwICE9PSAnc3RyaW5nJykge1xuICAgICAgICBtYXAgPSBKU09OLnN0cmluZ2lmeShtYXApO1xuICAgIH1cbiAgICByZXR1cm4gYGRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsJHtCdWZmZXIuZnJvbShtYXApLnRvU3RyaW5nKCdiYXNlNjQnKX1gO1xufVxuZnVuY3Rpb24gZ2V0Q29kZVdpdGhTb3VyY2VtYXAodHlwZSwgY29kZSwgbWFwKSB7XG4gICAgaWYgKGlzRGVidWckNikge1xuICAgICAgICBjb2RlICs9IGBcXG4vKiR7SlNPTi5zdHJpbmdpZnkobWFwLCBudWxsLCAyKS5yZXBsYWNlKC9cXCpcXC8vZywgJypcXFxcLycpfSovXFxuYDtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdqcycpIHtcbiAgICAgICAgY29kZSArPSBgXFxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9JHtnZW5Tb3VyY2VNYXBVcmwobWFwKX1gO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09PSAnY3NzJykge1xuICAgICAgICBjb2RlICs9IGBcXG4vKiMgc291cmNlTWFwcGluZ1VSTD0ke2dlblNvdXJjZU1hcFVybChtYXApfSAqL2A7XG4gICAgfVxuICAgIHJldHVybiBjb2RlO1xufVxuXG5mdW5jdGlvbiBlKGUsbixyKXt0aHJvdyBuZXcgRXJyb3Iocj9gTm8ga25vd24gY29uZGl0aW9ucyBmb3IgXCIke259XCIgc3BlY2lmaWVyIGluIFwiJHtlfVwiIHBhY2thZ2VgOmBNaXNzaW5nIFwiJHtufVwiIHNwZWNpZmllciBpbiBcIiR7ZX1cIiBwYWNrYWdlYCl9ZnVuY3Rpb24gbihuLGksbyxmKXtsZXQgcyx1LGw9cihuLG8pLGM9ZnVuY3Rpb24oZSl7bGV0IG49bmV3IFNldChbXCJkZWZhdWx0XCIsLi4uZS5jb25kaXRpb25zfHxbXV0pO3JldHVybiBlLnVuc2FmZXx8bi5hZGQoZS5yZXF1aXJlP1wicmVxdWlyZVwiOlwiaW1wb3J0XCIpLGUudW5zYWZlfHxuLmFkZChlLmJyb3dzZXI/XCJicm93c2VyXCI6XCJub2RlXCIpLG59KGZ8fHt9KSxhPWlbbF07aWYodm9pZCAwPT09YSl7bGV0IGUsbixyLHQ7Zm9yKHQgaW4gaSluJiZ0Lmxlbmd0aDxuLmxlbmd0aHx8KFwiL1wiPT09dFt0Lmxlbmd0aC0xXSYmbC5zdGFydHNXaXRoKHQpPyh1PWwuc3Vic3RyaW5nKHQubGVuZ3RoKSxuPXQpOnQubGVuZ3RoPjEmJihyPXQuaW5kZXhPZihcIipcIiwyKSx+ciYmKGU9UmVnRXhwKFwiXlwiK3Quc3Vic3RyaW5nKDAscikrXCIoLiopXCIrdC5zdWJzdHJpbmcoMStyKSkuZXhlYyhsKSxlJiZlWzFdJiYodT1lWzFdLG49dCkpKSk7YT1pW25dO31yZXR1cm4gYXx8ZShuLGwpLHM9dChhLGMpLHN8fGUobixsLDEpLHUmJmZ1bmN0aW9uKGUsbil7bGV0IHIsdD0wLGk9ZS5sZW5ndGgsbz0vWypdL2csZj0vWy9dJC87Zm9yKDt0PGk7dCsrKWVbdF09by50ZXN0KHI9ZVt0XSk/ci5yZXBsYWNlKG8sbik6Zi50ZXN0KHIpP3IrbjpyO30ocyx1KSxzfWZ1bmN0aW9uIHIoZSxuLHIpe2lmKGU9PT1ufHxcIi5cIj09PW4pcmV0dXJuIFwiLlwiO2xldCB0PWUrXCIvXCIsaT10Lmxlbmd0aCxvPW4uc2xpY2UoMCxpKT09PXQsZj1vP24uc2xpY2UoaSk6bjtyZXR1cm4gXCIjXCI9PT1mWzBdP2Y6b3x8IXI/XCIuL1wiPT09Zi5zbGljZSgwLDIpP2Y6XCIuL1wiK2Y6Zn1mdW5jdGlvbiB0KGUsbixyKXtpZihlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSlyZXR1cm4gciYmci5hZGQoZSksW2VdO2xldCBpLG87aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKG89cnx8bmV3IFNldCxpPTA7aTxlLmxlbmd0aDtpKyspdChlW2ldLG4sbyk7aWYoIXImJm8uc2l6ZSlyZXR1cm4gWy4uLm9dfWVsc2UgZm9yKGkgaW4gZSlpZihuLmhhcyhpKSlyZXR1cm4gdChlW2ldLG4scil9fWZ1bmN0aW9uIG8oZSxyLHQpe2xldCBpLG89ZS5leHBvcnRzO2lmKG8pe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBvKW89e1wiLlwiOm99O2Vsc2UgZm9yKGkgaW4gbyl7XCIuXCIhPT1pWzBdJiYobz17XCIuXCI6b30pO2JyZWFrfXJldHVybiBuKGUubmFtZSxvLHJ8fFwiLlwiLHQpfX1mdW5jdGlvbiBmKGUscix0KXtpZihlLmltcG9ydHMpcmV0dXJuIG4oZS5uYW1lLGUuaW1wb3J0cyxyLHQpfVxuXG4vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZC4gRG8gbm90IG1vZGlmeSBtYW51YWxseSFcbnZhciBhc3RyYWxJZGVudGlmaWVyQ29kZXMgPSBbNTA5LCAwLCAyMjcsIDAsIDE1MCwgNCwgMjk0LCA5LCAxMzY4LCAyLCAyLCAxLCA2LCAzLCA0MSwgMiwgNSwgMCwgMTY2LCAxLCA1NzQsIDMsIDksIDksIDM3MCwgMSwgODEsIDIsIDcxLCAxMCwgNTAsIDMsIDEyMywgMiwgNTQsIDE0LCAzMiwgMTAsIDMsIDEsIDExLCAzLCA0NiwgMTAsIDgsIDAsIDQ2LCA5LCA3LCAyLCAzNywgMTMsIDIsIDksIDYsIDEsIDQ1LCAwLCAxMywgMiwgNDksIDEzLCA5LCAzLCAyLCAxMSwgODMsIDExLCA3LCAwLCAzLCAwLCAxNTgsIDExLCA2LCA5LCA3LCAzLCA1NiwgMSwgMiwgNiwgMywgMSwgMywgMiwgMTAsIDAsIDExLCAxLCAzLCA2LCA0LCA0LCAxOTMsIDE3LCAxMCwgOSwgNSwgMCwgODIsIDE5LCAxMywgOSwgMjE0LCA2LCAzLCA4LCAyOCwgMSwgODMsIDE2LCAxNiwgOSwgODIsIDEyLCA5LCA5LCA4NCwgMTQsIDUsIDksIDI0MywgMTQsIDE2NiwgOSwgNzEsIDUsIDIsIDEsIDMsIDMsIDIsIDAsIDIsIDEsIDEzLCA5LCAxMjAsIDYsIDMsIDYsIDQsIDAsIDI5LCA5LCA0MSwgNiwgMiwgMywgOSwgMCwgMTAsIDEwLCA0NywgMTUsIDQwNiwgNywgMiwgNywgMTcsIDksIDU3LCAyMSwgMiwgMTMsIDEyMywgNSwgNCwgMCwgMiwgMSwgMiwgNiwgMiwgMCwgOSwgOSwgNDksIDQsIDIsIDEsIDIsIDQsIDksIDksIDMzMCwgMywgMTAsIDEsIDIsIDAsIDQ5LCA2LCA0LCA0LCAxNCwgOSwgNTM1MSwgMCwgNywgMTQsIDEzODM1LCA5LCA4NywgOSwgMzksIDQsIDYwLCA2LCAyNiwgOSwgMTAxNCwgMCwgMiwgNTQsIDgsIDMsIDgyLCAwLCAxMiwgMSwgMTk2MjgsIDEsIDQ3MDYsIDQ1LCAzLCAyMiwgNTQzLCA0LCA0LCA1LCA5LCA3LCAzLCA2LCAzMSwgMywgMTQ5LCAyLCAxNDE4LCA0OSwgNTEzLCA1NCwgNSwgNDksIDksIDAsIDE1LCAwLCAyMywgNCwgMiwgMTQsIDEzNjEsIDYsIDIsIDE2LCAzLCA2LCAyLCAxLCAyLCA0LCAxMDEsIDAsIDE2MSwgNiwgMTAsIDksIDM1NywgMCwgNjIsIDEzLCA0OTksIDEzLCA5ODMsIDYsIDExMCwgNiwgNiwgOSwgNDc1OSwgOSwgNzg3NzE5LCAyMzldO1xuXG4vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZC4gRG8gbm90IG1vZGlmeSBtYW51YWxseSFcbnZhciBhc3RyYWxJZGVudGlmaWVyU3RhcnRDb2RlcyA9IFswLCAxMSwgMiwgMjUsIDIsIDE4LCAyLCAxLCAyLCAxNCwgMywgMTMsIDM1LCAxMjIsIDcwLCA1MiwgMjY4LCAyOCwgNCwgNDgsIDQ4LCAzMSwgMTQsIDI5LCA2LCAzNywgMTEsIDI5LCAzLCAzNSwgNSwgNywgMiwgNCwgNDMsIDE1NywgMTksIDM1LCA1LCAzNSwgNSwgMzksIDksIDUxLCAxMywgMTAsIDIsIDE0LCAyLCA2LCAyLCAxLCAyLCAxMCwgMiwgMTQsIDIsIDYsIDIsIDEsIDY4LCAzMTAsIDEwLCAyMSwgMTEsIDcsIDI1LCA1LCAyLCA0MSwgMiwgOCwgNzAsIDUsIDMsIDAsIDIsIDQzLCAyLCAxLCA0LCAwLCAzLCAyMiwgMTEsIDIyLCAxMCwgMzAsIDY2LCAxOCwgMiwgMSwgMTEsIDIxLCAxMSwgMjUsIDcxLCA1NSwgNywgMSwgNjUsIDAsIDE2LCAzLCAyLCAyLCAyLCAyOCwgNDMsIDI4LCA0LCAyOCwgMzYsIDcsIDIsIDI3LCAyOCwgNTMsIDExLCAyMSwgMTEsIDE4LCAxNCwgMTcsIDExMSwgNzIsIDU2LCA1MCwgMTQsIDUwLCAxNCwgMzUsIDM0OSwgNDEsIDcsIDEsIDc5LCAyOCwgMTEsIDAsIDksIDIxLCA0MywgMTcsIDQ3LCAyMCwgMjgsIDIyLCAxMywgNTIsIDU4LCAxLCAzLCAwLCAxNCwgNDQsIDMzLCAyNCwgMjcsIDM1LCAzMCwgMCwgMywgMCwgOSwgMzQsIDQsIDAsIDEzLCA0NywgMTUsIDMsIDIyLCAwLCAyLCAwLCAzNiwgMTcsIDIsIDI0LCAyMCwgMSwgNjQsIDYsIDIsIDAsIDIsIDMsIDIsIDE0LCAyLCA5LCA4LCA0NiwgMzksIDcsIDMsIDEsIDMsIDIxLCAyLCA2LCAyLCAxLCAyLCA0LCA0LCAwLCAxOSwgMCwgMTMsIDQsIDE1OSwgNTIsIDE5LCAzLCAyMSwgMiwgMzEsIDQ3LCAyMSwgMSwgMiwgMCwgMTg1LCA0NiwgNDIsIDMsIDM3LCA0NywgMjEsIDAsIDYwLCA0MiwgMTQsIDAsIDcyLCAyNiwgMzgsIDYsIDE4NiwgNDMsIDExNywgNjMsIDMyLCA3LCAzLCAwLCAzLCA3LCAyLCAxLCAyLCAyMywgMTYsIDAsIDIsIDAsIDk1LCA3LCAzLCAzOCwgMTcsIDAsIDIsIDAsIDI5LCAwLCAxMSwgMzksIDgsIDAsIDIyLCAwLCAxMiwgNDUsIDIwLCAwLCAxOSwgNzIsIDI2NCwgOCwgMiwgMzYsIDE4LCAwLCA1MCwgMjksIDExMywgNiwgMiwgMSwgMiwgMzcsIDIyLCAwLCAyNiwgNSwgMiwgMSwgMiwgMzEsIDE1LCAwLCAzMjgsIDE4LCAxNiwgMCwgMiwgMTIsIDIsIDMzLCAxMjUsIDAsIDgwLCA5MjEsIDEwMywgMTEwLCAxOCwgMTk1LCAyNjM3LCA5NiwgMTYsIDEwNzEsIDE4LCA1LCA0MDI2LCA1ODIsIDg2MzQsIDU2OCwgOCwgMzAsIDE4LCA3OCwgMTgsIDI5LCAxOSwgNDcsIDE3LCAzLCAzMiwgMjAsIDYsIDE4LCA2ODksIDYzLCAxMjksIDc0LCA2LCAwLCA2NywgMTIsIDY1LCAxLCAyLCAwLCAyOSwgNjEzNSwgOSwgMTIzNywgNDMsIDgsIDg5MzYsIDMsIDIsIDYsIDIsIDEsIDIsIDI5MCwgMTYsIDAsIDMwLCAyLCAzLCAwLCAxNSwgMywgOSwgMzk1LCAyMzA5LCAxMDYsIDYsIDEyLCA0LCA4LCA4LCA5LCA1OTkxLCA4NCwgMiwgNzAsIDIsIDEsIDMsIDAsIDMsIDEsIDMsIDMsIDIsIDExLCAyLCAwLCAyLCA2LCAyLCA2NCwgMiwgMywgMywgNywgMiwgNiwgMiwgMjcsIDIsIDMsIDIsIDQsIDIsIDAsIDQsIDYsIDIsIDMzOSwgMywgMjQsIDIsIDI0LCAyLCAzMCwgMiwgMjQsIDIsIDMwLCAyLCAyNCwgMiwgMzAsIDIsIDI0LCAyLCAzMCwgMiwgMjQsIDIsIDcsIDE4NDUsIDMwLCA3LCA1LCAyNjIsIDYxLCAxNDcsIDQ0LCAxMSwgNiwgMTcsIDAsIDMyMiwgMjksIDE5LCA0MywgNDg1LCAyNywgNzU3LCA2LCAyLCAzLCAyLCAxLCAyLCAxNCwgMiwgMTk2LCA2MCwgNjcsIDgsIDAsIDEyMDUsIDMsIDIsIDI2LCAyLCAxLCAyLCAwLCAzLCAwLCAyLCA5LCAyLCAzLCAyLCAwLCAyLCAwLCA3LCAwLCA1LCAwLCAyLCAwLCAyLCAwLCAyLCAyLCAyLCAxLCAyLCAwLCAzLCAwLCAyLCAwLCAyLCAwLCAyLCAwLCAyLCAwLCAyLCAxLCAyLCAwLCAzLCAzLCAyLCA2LCAyLCAzLCAyLCAzLCAyLCAwLCAyLCA5LCAyLCAxNiwgNiwgMiwgMiwgNCwgMiwgMTYsIDQ0MjEsIDQyNzE5LCAzMywgNDE1MywgNywgMjIxLCAzLCA1NzYxLCAxNSwgNzQ3MiwgMzEwNCwgNTQxLCAxNTA3LCA0OTM4LCA2LCA0MTkxXTtcblxuLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQuIERvIG5vdCBtb2RpZnkgbWFudWFsbHkhXG52YXIgbm9uQVNDSUlpZGVudGlmaWVyQ2hhcnMgPSBcIlxcdTIwMGNcXHUyMDBkXFx4YjdcXHUwMzAwLVxcdTAzNmZcXHUwMzg3XFx1MDQ4My1cXHUwNDg3XFx1MDU5MS1cXHUwNWJkXFx1MDViZlxcdTA1YzFcXHUwNWMyXFx1MDVjNFxcdTA1YzVcXHUwNWM3XFx1MDYxMC1cXHUwNjFhXFx1MDY0Yi1cXHUwNjY5XFx1MDY3MFxcdTA2ZDYtXFx1MDZkY1xcdTA2ZGYtXFx1MDZlNFxcdTA2ZTdcXHUwNmU4XFx1MDZlYS1cXHUwNmVkXFx1MDZmMC1cXHUwNmY5XFx1MDcxMVxcdTA3MzAtXFx1MDc0YVxcdTA3YTYtXFx1MDdiMFxcdTA3YzAtXFx1MDdjOVxcdTA3ZWItXFx1MDdmM1xcdTA3ZmRcXHUwODE2LVxcdTA4MTlcXHUwODFiLVxcdTA4MjNcXHUwODI1LVxcdTA4MjdcXHUwODI5LVxcdTA4MmRcXHUwODU5LVxcdTA4NWJcXHUwODk4LVxcdTA4OWZcXHUwOGNhLVxcdTA4ZTFcXHUwOGUzLVxcdTA5MDNcXHUwOTNhLVxcdTA5M2NcXHUwOTNlLVxcdTA5NGZcXHUwOTUxLVxcdTA5NTdcXHUwOTYyXFx1MDk2M1xcdTA5NjYtXFx1MDk2ZlxcdTA5ODEtXFx1MDk4M1xcdTA5YmNcXHUwOWJlLVxcdTA5YzRcXHUwOWM3XFx1MDljOFxcdTA5Y2ItXFx1MDljZFxcdTA5ZDdcXHUwOWUyXFx1MDllM1xcdTA5ZTYtXFx1MDllZlxcdTA5ZmVcXHUwYTAxLVxcdTBhMDNcXHUwYTNjXFx1MGEzZS1cXHUwYTQyXFx1MGE0N1xcdTBhNDhcXHUwYTRiLVxcdTBhNGRcXHUwYTUxXFx1MGE2Ni1cXHUwYTcxXFx1MGE3NVxcdTBhODEtXFx1MGE4M1xcdTBhYmNcXHUwYWJlLVxcdTBhYzVcXHUwYWM3LVxcdTBhYzlcXHUwYWNiLVxcdTBhY2RcXHUwYWUyXFx1MGFlM1xcdTBhZTYtXFx1MGFlZlxcdTBhZmEtXFx1MGFmZlxcdTBiMDEtXFx1MGIwM1xcdTBiM2NcXHUwYjNlLVxcdTBiNDRcXHUwYjQ3XFx1MGI0OFxcdTBiNGItXFx1MGI0ZFxcdTBiNTUtXFx1MGI1N1xcdTBiNjJcXHUwYjYzXFx1MGI2Ni1cXHUwYjZmXFx1MGI4MlxcdTBiYmUtXFx1MGJjMlxcdTBiYzYtXFx1MGJjOFxcdTBiY2EtXFx1MGJjZFxcdTBiZDdcXHUwYmU2LVxcdTBiZWZcXHUwYzAwLVxcdTBjMDRcXHUwYzNjXFx1MGMzZS1cXHUwYzQ0XFx1MGM0Ni1cXHUwYzQ4XFx1MGM0YS1cXHUwYzRkXFx1MGM1NVxcdTBjNTZcXHUwYzYyXFx1MGM2M1xcdTBjNjYtXFx1MGM2ZlxcdTBjODEtXFx1MGM4M1xcdTBjYmNcXHUwY2JlLVxcdTBjYzRcXHUwY2M2LVxcdTBjYzhcXHUwY2NhLVxcdTBjY2RcXHUwY2Q1XFx1MGNkNlxcdTBjZTJcXHUwY2UzXFx1MGNlNi1cXHUwY2VmXFx1MGNmM1xcdTBkMDAtXFx1MGQwM1xcdTBkM2JcXHUwZDNjXFx1MGQzZS1cXHUwZDQ0XFx1MGQ0Ni1cXHUwZDQ4XFx1MGQ0YS1cXHUwZDRkXFx1MGQ1N1xcdTBkNjJcXHUwZDYzXFx1MGQ2Ni1cXHUwZDZmXFx1MGQ4MS1cXHUwZDgzXFx1MGRjYVxcdTBkY2YtXFx1MGRkNFxcdTBkZDZcXHUwZGQ4LVxcdTBkZGZcXHUwZGU2LVxcdTBkZWZcXHUwZGYyXFx1MGRmM1xcdTBlMzFcXHUwZTM0LVxcdTBlM2FcXHUwZTQ3LVxcdTBlNGVcXHUwZTUwLVxcdTBlNTlcXHUwZWIxXFx1MGViNC1cXHUwZWJjXFx1MGVjOC1cXHUwZWNlXFx1MGVkMC1cXHUwZWQ5XFx1MGYxOFxcdTBmMTlcXHUwZjIwLVxcdTBmMjlcXHUwZjM1XFx1MGYzN1xcdTBmMzlcXHUwZjNlXFx1MGYzZlxcdTBmNzEtXFx1MGY4NFxcdTBmODZcXHUwZjg3XFx1MGY4ZC1cXHUwZjk3XFx1MGY5OS1cXHUwZmJjXFx1MGZjNlxcdTEwMmItXFx1MTAzZVxcdTEwNDAtXFx1MTA0OVxcdTEwNTYtXFx1MTA1OVxcdTEwNWUtXFx1MTA2MFxcdTEwNjItXFx1MTA2NFxcdTEwNjctXFx1MTA2ZFxcdTEwNzEtXFx1MTA3NFxcdTEwODItXFx1MTA4ZFxcdTEwOGYtXFx1MTA5ZFxcdTEzNWQtXFx1MTM1ZlxcdTEzNjktXFx1MTM3MVxcdTE3MTItXFx1MTcxNVxcdTE3MzItXFx1MTczNFxcdTE3NTJcXHUxNzUzXFx1MTc3MlxcdTE3NzNcXHUxN2I0LVxcdTE3ZDNcXHUxN2RkXFx1MTdlMC1cXHUxN2U5XFx1MTgwYi1cXHUxODBkXFx1MTgwZi1cXHUxODE5XFx1MThhOVxcdTE5MjAtXFx1MTkyYlxcdTE5MzAtXFx1MTkzYlxcdTE5NDYtXFx1MTk0ZlxcdTE5ZDAtXFx1MTlkYVxcdTFhMTctXFx1MWExYlxcdTFhNTUtXFx1MWE1ZVxcdTFhNjAtXFx1MWE3Y1xcdTFhN2YtXFx1MWE4OVxcdTFhOTAtXFx1MWE5OVxcdTFhYjAtXFx1MWFiZFxcdTFhYmYtXFx1MWFjZVxcdTFiMDAtXFx1MWIwNFxcdTFiMzQtXFx1MWI0NFxcdTFiNTAtXFx1MWI1OVxcdTFiNmItXFx1MWI3M1xcdTFiODAtXFx1MWI4MlxcdTFiYTEtXFx1MWJhZFxcdTFiYjAtXFx1MWJiOVxcdTFiZTYtXFx1MWJmM1xcdTFjMjQtXFx1MWMzN1xcdTFjNDAtXFx1MWM0OVxcdTFjNTAtXFx1MWM1OVxcdTFjZDAtXFx1MWNkMlxcdTFjZDQtXFx1MWNlOFxcdTFjZWRcXHUxY2Y0XFx1MWNmNy1cXHUxY2Y5XFx1MWRjMC1cXHUxZGZmXFx1MjAzZlxcdTIwNDBcXHUyMDU0XFx1MjBkMC1cXHUyMGRjXFx1MjBlMVxcdTIwZTUtXFx1MjBmMFxcdTJjZWYtXFx1MmNmMVxcdTJkN2ZcXHUyZGUwLVxcdTJkZmZcXHUzMDJhLVxcdTMwMmZcXHUzMDk5XFx1MzA5YVxcdWE2MjAtXFx1YTYyOVxcdWE2NmZcXHVhNjc0LVxcdWE2N2RcXHVhNjllXFx1YTY5ZlxcdWE2ZjBcXHVhNmYxXFx1YTgwMlxcdWE4MDZcXHVhODBiXFx1YTgyMy1cXHVhODI3XFx1YTgyY1xcdWE4ODBcXHVhODgxXFx1YThiNC1cXHVhOGM1XFx1YThkMC1cXHVhOGQ5XFx1YThlMC1cXHVhOGYxXFx1YThmZi1cXHVhOTA5XFx1YTkyNi1cXHVhOTJkXFx1YTk0Ny1cXHVhOTUzXFx1YTk4MC1cXHVhOTgzXFx1YTliMy1cXHVhOWMwXFx1YTlkMC1cXHVhOWQ5XFx1YTllNVxcdWE5ZjAtXFx1YTlmOVxcdWFhMjktXFx1YWEzNlxcdWFhNDNcXHVhYTRjXFx1YWE0ZFxcdWFhNTAtXFx1YWE1OVxcdWFhN2ItXFx1YWE3ZFxcdWFhYjBcXHVhYWIyLVxcdWFhYjRcXHVhYWI3XFx1YWFiOFxcdWFhYmVcXHVhYWJmXFx1YWFjMVxcdWFhZWItXFx1YWFlZlxcdWFhZjVcXHVhYWY2XFx1YWJlMy1cXHVhYmVhXFx1YWJlY1xcdWFiZWRcXHVhYmYwLVxcdWFiZjlcXHVmYjFlXFx1ZmUwMC1cXHVmZTBmXFx1ZmUyMC1cXHVmZTJmXFx1ZmUzM1xcdWZlMzRcXHVmZTRkLVxcdWZlNGZcXHVmZjEwLVxcdWZmMTlcXHVmZjNmXCI7XG5cbi8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkLiBEbyBub3QgbW9kaWZ5IG1hbnVhbGx5IVxudmFyIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0Q2hhcnMgPSBcIlxceGFhXFx4YjVcXHhiYVxceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHUwMmMxXFx1MDJjNi1cXHUwMmQxXFx1MDJlMC1cXHUwMmU0XFx1MDJlY1xcdTAyZWVcXHUwMzcwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN2EtXFx1MDM3ZFxcdTAzN2ZcXHUwMzg2XFx1MDM4OC1cXHUwMzhhXFx1MDM4Y1xcdTAzOGUtXFx1MDNhMVxcdTAzYTMtXFx1MDNmNVxcdTAzZjctXFx1MDQ4MVxcdTA0OGEtXFx1MDUyZlxcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYwLVxcdTA1ODhcXHUwNWQwLVxcdTA1ZWFcXHUwNWVmLVxcdTA1ZjJcXHUwNjIwLVxcdTA2NGFcXHUwNjZlXFx1MDY2ZlxcdTA2NzEtXFx1MDZkM1xcdTA2ZDVcXHUwNmU1XFx1MDZlNlxcdTA2ZWVcXHUwNmVmXFx1MDZmYS1cXHUwNmZjXFx1MDZmZlxcdTA3MTBcXHUwNzEyLVxcdTA3MmZcXHUwNzRkLVxcdTA3YTVcXHUwN2IxXFx1MDdjYS1cXHUwN2VhXFx1MDdmNFxcdTA3ZjVcXHUwN2ZhXFx1MDgwMC1cXHUwODE1XFx1MDgxYVxcdTA4MjRcXHUwODI4XFx1MDg0MC1cXHUwODU4XFx1MDg2MC1cXHUwODZhXFx1MDg3MC1cXHUwODg3XFx1MDg4OS1cXHUwODhlXFx1MDhhMC1cXHUwOGM5XFx1MDkwNC1cXHUwOTM5XFx1MDkzZFxcdTA5NTBcXHUwOTU4LVxcdTA5NjFcXHUwOTcxLVxcdTA5ODBcXHUwOTg1LVxcdTA5OGNcXHUwOThmXFx1MDk5MFxcdTA5OTMtXFx1MDlhOFxcdTA5YWEtXFx1MDliMFxcdTA5YjJcXHUwOWI2LVxcdTA5YjlcXHUwOWJkXFx1MDljZVxcdTA5ZGNcXHUwOWRkXFx1MDlkZi1cXHUwOWUxXFx1MDlmMFxcdTA5ZjFcXHUwOWZjXFx1MGEwNS1cXHUwYTBhXFx1MGEwZlxcdTBhMTBcXHUwYTEzLVxcdTBhMjhcXHUwYTJhLVxcdTBhMzBcXHUwYTMyXFx1MGEzM1xcdTBhMzVcXHUwYTM2XFx1MGEzOFxcdTBhMzlcXHUwYTU5LVxcdTBhNWNcXHUwYTVlXFx1MGE3Mi1cXHUwYTc0XFx1MGE4NS1cXHUwYThkXFx1MGE4Zi1cXHUwYTkxXFx1MGE5My1cXHUwYWE4XFx1MGFhYS1cXHUwYWIwXFx1MGFiMlxcdTBhYjNcXHUwYWI1LVxcdTBhYjlcXHUwYWJkXFx1MGFkMFxcdTBhZTBcXHUwYWUxXFx1MGFmOVxcdTBiMDUtXFx1MGIwY1xcdTBiMGZcXHUwYjEwXFx1MGIxMy1cXHUwYjI4XFx1MGIyYS1cXHUwYjMwXFx1MGIzMlxcdTBiMzNcXHUwYjM1LVxcdTBiMzlcXHUwYjNkXFx1MGI1Y1xcdTBiNWRcXHUwYjVmLVxcdTBiNjFcXHUwYjcxXFx1MGI4M1xcdTBiODUtXFx1MGI4YVxcdTBiOGUtXFx1MGI5MFxcdTBiOTItXFx1MGI5NVxcdTBiOTlcXHUwYjlhXFx1MGI5Y1xcdTBiOWVcXHUwYjlmXFx1MGJhM1xcdTBiYTRcXHUwYmE4LVxcdTBiYWFcXHUwYmFlLVxcdTBiYjlcXHUwYmQwXFx1MGMwNS1cXHUwYzBjXFx1MGMwZS1cXHUwYzEwXFx1MGMxMi1cXHUwYzI4XFx1MGMyYS1cXHUwYzM5XFx1MGMzZFxcdTBjNTgtXFx1MGM1YVxcdTBjNWRcXHUwYzYwXFx1MGM2MVxcdTBjODBcXHUwYzg1LVxcdTBjOGNcXHUwYzhlLVxcdTBjOTBcXHUwYzkyLVxcdTBjYThcXHUwY2FhLVxcdTBjYjNcXHUwY2I1LVxcdTBjYjlcXHUwY2JkXFx1MGNkZFxcdTBjZGVcXHUwY2UwXFx1MGNlMVxcdTBjZjFcXHUwY2YyXFx1MGQwNC1cXHUwZDBjXFx1MGQwZS1cXHUwZDEwXFx1MGQxMi1cXHUwZDNhXFx1MGQzZFxcdTBkNGVcXHUwZDU0LVxcdTBkNTZcXHUwZDVmLVxcdTBkNjFcXHUwZDdhLVxcdTBkN2ZcXHUwZDg1LVxcdTBkOTZcXHUwZDlhLVxcdTBkYjFcXHUwZGIzLVxcdTBkYmJcXHUwZGJkXFx1MGRjMC1cXHUwZGM2XFx1MGUwMS1cXHUwZTMwXFx1MGUzMlxcdTBlMzNcXHUwZTQwLVxcdTBlNDZcXHUwZTgxXFx1MGU4MlxcdTBlODRcXHUwZTg2LVxcdTBlOGFcXHUwZThjLVxcdTBlYTNcXHUwZWE1XFx1MGVhNy1cXHUwZWIwXFx1MGViMlxcdTBlYjNcXHUwZWJkXFx1MGVjMC1cXHUwZWM0XFx1MGVjNlxcdTBlZGMtXFx1MGVkZlxcdTBmMDBcXHUwZjQwLVxcdTBmNDdcXHUwZjQ5LVxcdTBmNmNcXHUwZjg4LVxcdTBmOGNcXHUxMDAwLVxcdTEwMmFcXHUxMDNmXFx1MTA1MC1cXHUxMDU1XFx1MTA1YS1cXHUxMDVkXFx1MTA2MVxcdTEwNjVcXHUxMDY2XFx1MTA2ZS1cXHUxMDcwXFx1MTA3NS1cXHUxMDgxXFx1MTA4ZVxcdTEwYTAtXFx1MTBjNVxcdTEwYzdcXHUxMGNkXFx1MTBkMC1cXHUxMGZhXFx1MTBmYy1cXHUxMjQ4XFx1MTI0YS1cXHUxMjRkXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNWEtXFx1MTI1ZFxcdTEyNjAtXFx1MTI4OFxcdTEyOGEtXFx1MTI4ZFxcdTEyOTAtXFx1MTJiMFxcdTEyYjItXFx1MTJiNVxcdTEyYjgtXFx1MTJiZVxcdTEyYzBcXHUxMmMyLVxcdTEyYzVcXHUxMmM4LVxcdTEyZDZcXHUxMmQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNWFcXHUxMzgwLVxcdTEzOGZcXHUxM2EwLVxcdTEzZjVcXHUxM2Y4LVxcdTEzZmRcXHUxNDAxLVxcdTE2NmNcXHUxNjZmLVxcdTE2N2ZcXHUxNjgxLVxcdTE2OWFcXHUxNmEwLVxcdTE2ZWFcXHUxNmVlLVxcdTE2ZjhcXHUxNzAwLVxcdTE3MTFcXHUxNzFmLVxcdTE3MzFcXHUxNzQwLVxcdTE3NTFcXHUxNzYwLVxcdTE3NmNcXHUxNzZlLVxcdTE3NzBcXHUxNzgwLVxcdTE3YjNcXHUxN2Q3XFx1MTdkY1xcdTE4MjAtXFx1MTg3OFxcdTE4ODAtXFx1MThhOFxcdTE4YWFcXHUxOGIwLVxcdTE4ZjVcXHUxOTAwLVxcdTE5MWVcXHUxOTUwLVxcdTE5NmRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5YWJcXHUxOWIwLVxcdTE5YzlcXHUxYTAwLVxcdTFhMTZcXHUxYTIwLVxcdTFhNTRcXHUxYWE3XFx1MWIwNS1cXHUxYjMzXFx1MWI0NS1cXHUxYjRjXFx1MWI4My1cXHUxYmEwXFx1MWJhZVxcdTFiYWZcXHUxYmJhLVxcdTFiZTVcXHUxYzAwLVxcdTFjMjNcXHUxYzRkLVxcdTFjNGZcXHUxYzVhLVxcdTFjN2RcXHUxYzgwLVxcdTFjODhcXHUxYzkwLVxcdTFjYmFcXHUxY2JkLVxcdTFjYmZcXHUxY2U5LVxcdTFjZWNcXHUxY2VlLVxcdTFjZjNcXHUxY2Y1XFx1MWNmNlxcdTFjZmFcXHUxZDAwLVxcdTFkYmZcXHUxZTAwLVxcdTFmMTVcXHUxZjE4LVxcdTFmMWRcXHUxZjIwLVxcdTFmNDVcXHUxZjQ4LVxcdTFmNGRcXHUxZjUwLVxcdTFmNTdcXHUxZjU5XFx1MWY1YlxcdTFmNWRcXHUxZjVmLVxcdTFmN2RcXHUxZjgwLVxcdTFmYjRcXHUxZmI2LVxcdTFmYmNcXHUxZmJlXFx1MWZjMi1cXHUxZmM0XFx1MWZjNi1cXHUxZmNjXFx1MWZkMC1cXHUxZmQzXFx1MWZkNi1cXHUxZmRiXFx1MWZlMC1cXHUxZmVjXFx1MWZmMi1cXHUxZmY0XFx1MWZmNi1cXHUxZmZjXFx1MjA3MVxcdTIwN2ZcXHUyMDkwLVxcdTIwOWNcXHUyMTAyXFx1MjEwN1xcdTIxMGEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMWRcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJhLVxcdTIxMzlcXHUyMTNjLVxcdTIxM2ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRlXFx1MjE2MC1cXHUyMTg4XFx1MmMwMC1cXHUyY2U0XFx1MmNlYi1cXHUyY2VlXFx1MmNmMlxcdTJjZjNcXHUyZDAwLVxcdTJkMjVcXHUyZDI3XFx1MmQyZFxcdTJkMzAtXFx1MmQ2N1xcdTJkNmZcXHUyZDgwLVxcdTJkOTZcXHUyZGEwLVxcdTJkYTZcXHUyZGE4LVxcdTJkYWVcXHUyZGIwLVxcdTJkYjZcXHUyZGI4LVxcdTJkYmVcXHUyZGMwLVxcdTJkYzZcXHUyZGM4LVxcdTJkY2VcXHUyZGQwLVxcdTJkZDZcXHUyZGQ4LVxcdTJkZGVcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMjlcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM2NcXHUzMDQxLVxcdTMwOTZcXHUzMDliLVxcdTMwOWZcXHUzMGExLVxcdTMwZmFcXHUzMGZjLVxcdTMwZmZcXHUzMTA1LVxcdTMxMmZcXHUzMTMxLVxcdTMxOGVcXHUzMWEwLVxcdTMxYmZcXHUzMWYwLVxcdTMxZmZcXHUzNDAwLVxcdTRkYmZcXHU0ZTAwLVxcdWE0OGNcXHVhNGQwLVxcdWE0ZmRcXHVhNTAwLVxcdWE2MGNcXHVhNjEwLVxcdWE2MWZcXHVhNjJhXFx1YTYyYlxcdWE2NDAtXFx1YTY2ZVxcdWE2N2YtXFx1YTY5ZFxcdWE2YTAtXFx1YTZlZlxcdWE3MTctXFx1YTcxZlxcdWE3MjItXFx1YTc4OFxcdWE3OGItXFx1YTdjYVxcdWE3ZDBcXHVhN2QxXFx1YTdkM1xcdWE3ZDUtXFx1YTdkOVxcdWE3ZjItXFx1YTgwMVxcdWE4MDMtXFx1YTgwNVxcdWE4MDctXFx1YTgwYVxcdWE4MGMtXFx1YTgyMlxcdWE4NDAtXFx1YTg3M1xcdWE4ODItXFx1YThiM1xcdWE4ZjItXFx1YThmN1xcdWE4ZmJcXHVhOGZkXFx1YThmZVxcdWE5MGEtXFx1YTkyNVxcdWE5MzAtXFx1YTk0NlxcdWE5NjAtXFx1YTk3Y1xcdWE5ODQtXFx1YTliMlxcdWE5Y2ZcXHVhOWUwLVxcdWE5ZTRcXHVhOWU2LVxcdWE5ZWZcXHVhOWZhLVxcdWE5ZmVcXHVhYTAwLVxcdWFhMjhcXHVhYTQwLVxcdWFhNDJcXHVhYTQ0LVxcdWFhNGJcXHVhYTYwLVxcdWFhNzZcXHVhYTdhXFx1YWE3ZS1cXHVhYWFmXFx1YWFiMVxcdWFhYjVcXHVhYWI2XFx1YWFiOS1cXHVhYWJkXFx1YWFjMFxcdWFhYzJcXHVhYWRiLVxcdWFhZGRcXHVhYWUwLVxcdWFhZWFcXHVhYWYyLVxcdWFhZjRcXHVhYjAxLVxcdWFiMDZcXHVhYjA5LVxcdWFiMGVcXHVhYjExLVxcdWFiMTZcXHVhYjIwLVxcdWFiMjZcXHVhYjI4LVxcdWFiMmVcXHVhYjMwLVxcdWFiNWFcXHVhYjVjLVxcdWFiNjlcXHVhYjcwLVxcdWFiZTJcXHVhYzAwLVxcdWQ3YTNcXHVkN2IwLVxcdWQ3YzZcXHVkN2NiLVxcdWQ3ZmJcXHVmOTAwLVxcdWZhNmRcXHVmYTcwLVxcdWZhZDlcXHVmYjAwLVxcdWZiMDZcXHVmYjEzLVxcdWZiMTdcXHVmYjFkXFx1ZmIxZi1cXHVmYjI4XFx1ZmIyYS1cXHVmYjM2XFx1ZmIzOC1cXHVmYjNjXFx1ZmIzZVxcdWZiNDBcXHVmYjQxXFx1ZmI0M1xcdWZiNDRcXHVmYjQ2LVxcdWZiYjFcXHVmYmQzLVxcdWZkM2RcXHVmZDUwLVxcdWZkOGZcXHVmZDkyLVxcdWZkYzdcXHVmZGYwLVxcdWZkZmJcXHVmZTcwLVxcdWZlNzRcXHVmZTc2LVxcdWZlZmNcXHVmZjIxLVxcdWZmM2FcXHVmZjQxLVxcdWZmNWFcXHVmZjY2LVxcdWZmYmVcXHVmZmMyLVxcdWZmYzdcXHVmZmNhLVxcdWZmY2ZcXHVmZmQyLVxcdWZmZDdcXHVmZmRhLVxcdWZmZGNcIjtcblxuLy8gVGhlc2UgYXJlIGEgcnVuLWxlbmd0aCBhbmQgb2Zmc2V0IGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlXG5cbi8vIFJlc2VydmVkIHdvcmQgbGlzdHMgZm9yIHZhcmlvdXMgZGlhbGVjdHMgb2YgdGhlIGxhbmd1YWdlXG5cbnZhciByZXNlcnZlZFdvcmRzID0ge1xuICAzOiBcImFic3RyYWN0IGJvb2xlYW4gYnl0ZSBjaGFyIGNsYXNzIGRvdWJsZSBlbnVtIGV4cG9ydCBleHRlbmRzIGZpbmFsIGZsb2F0IGdvdG8gaW1wbGVtZW50cyBpbXBvcnQgaW50IGludGVyZmFjZSBsb25nIG5hdGl2ZSBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBzaG9ydCBzdGF0aWMgc3VwZXIgc3luY2hyb25pemVkIHRocm93cyB0cmFuc2llbnQgdm9sYXRpbGVcIixcbiAgNTogXCJjbGFzcyBlbnVtIGV4dGVuZHMgc3VwZXIgY29uc3QgZXhwb3J0IGltcG9ydFwiLFxuICA2OiBcImVudW1cIixcbiAgc3RyaWN0OiBcImltcGxlbWVudHMgaW50ZXJmYWNlIGxldCBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyBzdGF0aWMgeWllbGRcIixcbiAgc3RyaWN0QmluZDogXCJldmFsIGFyZ3VtZW50c1wiXG59O1xuXG4vLyBBbmQgdGhlIGtleXdvcmRzXG5cbnZhciBlY21hNUFuZExlc3NLZXl3b3JkcyA9IFwiYnJlYWsgY2FzZSBjYXRjaCBjb250aW51ZSBkZWJ1Z2dlciBkZWZhdWx0IGRvIGVsc2UgZmluYWxseSBmb3IgZnVuY3Rpb24gaWYgcmV0dXJuIHN3aXRjaCB0aHJvdyB0cnkgdmFyIHdoaWxlIHdpdGggbnVsbCB0cnVlIGZhbHNlIGluc3RhbmNlb2YgdHlwZW9mIHZvaWQgZGVsZXRlIG5ldyBpbiB0aGlzXCI7XG5cbnZhciBrZXl3b3JkcyQxID0ge1xuICA1OiBlY21hNUFuZExlc3NLZXl3b3JkcyxcbiAgXCI1bW9kdWxlXCI6IGVjbWE1QW5kTGVzc0tleXdvcmRzICsgXCIgZXhwb3J0IGltcG9ydFwiLFxuICA2OiBlY21hNUFuZExlc3NLZXl3b3JkcyArIFwiIGNvbnN0IGNsYXNzIGV4dGVuZHMgZXhwb3J0IGltcG9ydCBzdXBlclwiXG59O1xuXG52YXIga2V5d29yZFJlbGF0aW9uYWxPcGVyYXRvciA9IC9eaW4oc3RhbmNlb2YpPyQvO1xuXG4vLyAjIyBDaGFyYWN0ZXIgY2F0ZWdvcmllc1xuXG52YXIgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnQgPSBuZXcgUmVnRXhwKFwiW1wiICsgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyArIFwiXVwiKTtcbnZhciBub25BU0NJSWlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKFwiW1wiICsgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyArIG5vbkFTQ0lJaWRlbnRpZmllckNoYXJzICsgXCJdXCIpO1xuXG4vLyBUaGlzIGhhcyBhIGNvbXBsZXhpdHkgbGluZWFyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgY29kZS4gVGhlXG4vLyBhc3N1bXB0aW9uIGlzIHRoYXQgbG9va2luZyB1cCBhc3RyYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzIGlzXG4vLyByYXJlLlxuZnVuY3Rpb24gaXNJbkFzdHJhbFNldChjb2RlLCBzZXQpIHtcbiAgdmFyIHBvcyA9IDB4MTAwMDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcG9zICs9IHNldFtpXTtcbiAgICBpZiAocG9zID4gY29kZSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIHBvcyArPSBzZXRbaSArIDFdO1xuICAgIGlmIChwb3MgPj0gY29kZSkgeyByZXR1cm4gdHJ1ZSB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8vIFRlc3Qgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBjb2RlIHN0YXJ0cyBhbiBpZGVudGlmaWVyLlxuXG5mdW5jdGlvbiBpc0lkZW50aWZpZXJTdGFydChjb2RlLCBhc3RyYWwpIHtcbiAgaWYgKGNvZGUgPCA2NSkgeyByZXR1cm4gY29kZSA9PT0gMzYgfVxuICBpZiAoY29kZSA8IDkxKSB7IHJldHVybiB0cnVlIH1cbiAgaWYgKGNvZGUgPCA5NykgeyByZXR1cm4gY29kZSA9PT0gOTUgfVxuICBpZiAoY29kZSA8IDEyMykgeyByZXR1cm4gdHJ1ZSB9XG4gIGlmIChjb2RlIDw9IDB4ZmZmZikgeyByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSkgfVxuICBpZiAoYXN0cmFsID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfVxuICByZXR1cm4gaXNJbkFzdHJhbFNldChjb2RlLCBhc3RyYWxJZGVudGlmaWVyU3RhcnRDb2Rlcylcbn1cblxuLy8gVGVzdCB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIHBhcnQgb2YgYW4gaWRlbnRpZmllci5cblxuZnVuY3Rpb24gaXNJZGVudGlmaWVyQ2hhcihjb2RlLCBhc3RyYWwpIHtcbiAgaWYgKGNvZGUgPCA0OCkgeyByZXR1cm4gY29kZSA9PT0gMzYgfVxuICBpZiAoY29kZSA8IDU4KSB7IHJldHVybiB0cnVlIH1cbiAgaWYgKGNvZGUgPCA2NSkgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoY29kZSA8IDkxKSB7IHJldHVybiB0cnVlIH1cbiAgaWYgKGNvZGUgPCA5NykgeyByZXR1cm4gY29kZSA9PT0gOTUgfVxuICBpZiAoY29kZSA8IDEyMykgeyByZXR1cm4gdHJ1ZSB9XG4gIGlmIChjb2RlIDw9IDB4ZmZmZikgeyByZXR1cm4gY29kZSA+PSAweGFhICYmIG5vbkFTQ0lJaWRlbnRpZmllci50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkpIH1cbiAgaWYgKGFzdHJhbCA9PT0gZmFsc2UpIHsgcmV0dXJuIGZhbHNlIH1cbiAgcmV0dXJuIGlzSW5Bc3RyYWxTZXQoY29kZSwgYXN0cmFsSWRlbnRpZmllclN0YXJ0Q29kZXMpIHx8IGlzSW5Bc3RyYWxTZXQoY29kZSwgYXN0cmFsSWRlbnRpZmllckNvZGVzKVxufVxuXG4vLyAjIyBUb2tlbiB0eXBlc1xuXG4vLyBUaGUgYXNzaWdubWVudCBvZiBmaW5lLWdyYWluZWQsIGluZm9ybWF0aW9uLWNhcnJ5aW5nIHR5cGUgb2JqZWN0c1xuLy8gYWxsb3dzIHRoZSB0b2tlbml6ZXIgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGl0IGhhcyBhYm91dCBhXG4vLyB0b2tlbiBpbiBhIHdheSB0aGF0IGlzIHZlcnkgY2hlYXAgZm9yIHRoZSBwYXJzZXIgdG8gbG9vayB1cC5cblxuLy8gQWxsIHRva2VuIHR5cGUgdmFyaWFibGVzIHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZSwgdG8gbWFrZSB0aGVtXG4vLyBlYXN5IHRvIHJlY29nbml6ZS5cblxuLy8gVGhlIGBiZWZvcmVFeHByYCBwcm9wZXJ0eSBpcyB1c2VkIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIHJlZ3VsYXJcbi8vIGV4cHJlc3Npb25zIGFuZCBkaXZpc2lvbnMuIEl0IGlzIHNldCBvbiBhbGwgdG9rZW4gdHlwZXMgdGhhdCBjYW5cbi8vIGJlIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24gKHRodXMsIGEgc2xhc2ggYWZ0ZXIgdGhlbSB3b3VsZCBiZSBhXG4vLyByZWd1bGFyIGV4cHJlc3Npb24pLlxuLy9cbi8vIFRoZSBgc3RhcnRzRXhwcmAgcHJvcGVydHkgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgdG9rZW4gZW5kcyBhXG4vLyBgeWllbGRgIGV4cHJlc3Npb24uIEl0IGlzIHNldCBvbiBhbGwgdG9rZW4gdHlwZXMgdGhhdCBlaXRoZXIgY2FuXG4vLyBkaXJlY3RseSBzdGFydCBhbiBleHByZXNzaW9uIChsaWtlIGEgcXVvdGF0aW9uIG1hcmspIG9yIGNhblxuLy8gY29udGludWUgYW4gZXhwcmVzc2lvbiAobGlrZSB0aGUgYm9keSBvZiBhIHN0cmluZykuXG4vL1xuLy8gYGlzTG9vcGAgbWFya3MgYSBrZXl3b3JkIGFzIHN0YXJ0aW5nIGEgbG9vcCwgd2hpY2ggaXMgaW1wb3J0YW50XG4vLyB0byBrbm93IHdoZW4gcGFyc2luZyBhIGxhYmVsLCBpbiBvcmRlciB0byBhbGxvdyBvciBkaXNhbGxvd1xuLy8gY29udGludWUganVtcHMgdG8gdGhhdCBsYWJlbC5cblxudmFyIFRva2VuVHlwZSA9IGZ1bmN0aW9uIFRva2VuVHlwZShsYWJlbCwgY29uZikge1xuICBpZiAoIGNvbmYgPT09IHZvaWQgMCApIGNvbmYgPSB7fTtcblxuICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gIHRoaXMua2V5d29yZCA9IGNvbmYua2V5d29yZDtcbiAgdGhpcy5iZWZvcmVFeHByID0gISFjb25mLmJlZm9yZUV4cHI7XG4gIHRoaXMuc3RhcnRzRXhwciA9ICEhY29uZi5zdGFydHNFeHByO1xuICB0aGlzLmlzTG9vcCA9ICEhY29uZi5pc0xvb3A7XG4gIHRoaXMuaXNBc3NpZ24gPSAhIWNvbmYuaXNBc3NpZ247XG4gIHRoaXMucHJlZml4ID0gISFjb25mLnByZWZpeDtcbiAgdGhpcy5wb3N0Zml4ID0gISFjb25mLnBvc3RmaXg7XG4gIHRoaXMuYmlub3AgPSBjb25mLmJpbm9wIHx8IG51bGw7XG4gIHRoaXMudXBkYXRlQ29udGV4dCA9IG51bGw7XG59O1xuXG5mdW5jdGlvbiBiaW5vcChuYW1lLCBwcmVjKSB7XG4gIHJldHVybiBuZXcgVG9rZW5UeXBlKG5hbWUsIHtiZWZvcmVFeHByOiB0cnVlLCBiaW5vcDogcHJlY30pXG59XG52YXIgYmVmb3JlRXhwciA9IHtiZWZvcmVFeHByOiB0cnVlfSwgc3RhcnRzRXhwciA9IHtzdGFydHNFeHByOiB0cnVlfTtcblxuLy8gTWFwIGtleXdvcmQgbmFtZXMgdG8gdG9rZW4gdHlwZXMuXG5cbnZhciBrZXl3b3JkcyQyID0ge307XG5cbi8vIFN1Y2NpbmN0IGRlZmluaXRpb25zIG9mIGtleXdvcmQgdG9rZW4gdHlwZXNcbmZ1bmN0aW9uIGt3KG5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgb3B0aW9ucy5rZXl3b3JkID0gbmFtZTtcbiAgcmV0dXJuIGtleXdvcmRzJDJbbmFtZV0gPSBuZXcgVG9rZW5UeXBlKG5hbWUsIG9wdGlvbnMpXG59XG5cbnZhciB0eXBlcyQxID0ge1xuICBudW06IG5ldyBUb2tlblR5cGUoXCJudW1cIiwgc3RhcnRzRXhwciksXG4gIHJlZ2V4cDogbmV3IFRva2VuVHlwZShcInJlZ2V4cFwiLCBzdGFydHNFeHByKSxcbiAgc3RyaW5nOiBuZXcgVG9rZW5UeXBlKFwic3RyaW5nXCIsIHN0YXJ0c0V4cHIpLFxuICBuYW1lOiBuZXcgVG9rZW5UeXBlKFwibmFtZVwiLCBzdGFydHNFeHByKSxcbiAgcHJpdmF0ZUlkOiBuZXcgVG9rZW5UeXBlKFwicHJpdmF0ZUlkXCIsIHN0YXJ0c0V4cHIpLFxuICBlb2Y6IG5ldyBUb2tlblR5cGUoXCJlb2ZcIiksXG5cbiAgLy8gUHVuY3R1YXRpb24gdG9rZW4gdHlwZXMuXG4gIGJyYWNrZXRMOiBuZXcgVG9rZW5UeXBlKFwiW1wiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICBicmFja2V0UjogbmV3IFRva2VuVHlwZShcIl1cIiksXG4gIGJyYWNlTDogbmV3IFRva2VuVHlwZShcIntcIiwge2JlZm9yZUV4cHI6IHRydWUsIHN0YXJ0c0V4cHI6IHRydWV9KSxcbiAgYnJhY2VSOiBuZXcgVG9rZW5UeXBlKFwifVwiKSxcbiAgcGFyZW5MOiBuZXcgVG9rZW5UeXBlKFwiKFwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICBwYXJlblI6IG5ldyBUb2tlblR5cGUoXCIpXCIpLFxuICBjb21tYTogbmV3IFRva2VuVHlwZShcIixcIiwgYmVmb3JlRXhwciksXG4gIHNlbWk6IG5ldyBUb2tlblR5cGUoXCI7XCIsIGJlZm9yZUV4cHIpLFxuICBjb2xvbjogbmV3IFRva2VuVHlwZShcIjpcIiwgYmVmb3JlRXhwciksXG4gIGRvdDogbmV3IFRva2VuVHlwZShcIi5cIiksXG4gIHF1ZXN0aW9uOiBuZXcgVG9rZW5UeXBlKFwiP1wiLCBiZWZvcmVFeHByKSxcbiAgcXVlc3Rpb25Eb3Q6IG5ldyBUb2tlblR5cGUoXCI/LlwiKSxcbiAgYXJyb3c6IG5ldyBUb2tlblR5cGUoXCI9PlwiLCBiZWZvcmVFeHByKSxcbiAgdGVtcGxhdGU6IG5ldyBUb2tlblR5cGUoXCJ0ZW1wbGF0ZVwiKSxcbiAgaW52YWxpZFRlbXBsYXRlOiBuZXcgVG9rZW5UeXBlKFwiaW52YWxpZFRlbXBsYXRlXCIpLFxuICBlbGxpcHNpczogbmV3IFRva2VuVHlwZShcIi4uLlwiLCBiZWZvcmVFeHByKSxcbiAgYmFja1F1b3RlOiBuZXcgVG9rZW5UeXBlKFwiYFwiLCBzdGFydHNFeHByKSxcbiAgZG9sbGFyQnJhY2VMOiBuZXcgVG9rZW5UeXBlKFwiJHtcIiwge2JlZm9yZUV4cHI6IHRydWUsIHN0YXJ0c0V4cHI6IHRydWV9KSxcblxuICAvLyBPcGVyYXRvcnMuIFRoZXNlIGNhcnJ5IHNldmVyYWwga2luZHMgb2YgcHJvcGVydGllcyB0byBoZWxwIHRoZVxuICAvLyBwYXJzZXIgdXNlIHRoZW0gcHJvcGVybHkgKHRoZSBwcmVzZW5jZSBvZiB0aGVzZSBwcm9wZXJ0aWVzIGlzXG4gIC8vIHdoYXQgY2F0ZWdvcml6ZXMgdGhlbSBhcyBvcGVyYXRvcnMpLlxuICAvL1xuICAvLyBgYmlub3BgLCB3aGVuIHByZXNlbnQsIHNwZWNpZmllcyB0aGF0IHRoaXMgb3BlcmF0b3IgaXMgYSBiaW5hcnlcbiAgLy8gb3BlcmF0b3IsIGFuZCB3aWxsIHJlZmVyIHRvIGl0cyBwcmVjZWRlbmNlLlxuICAvL1xuICAvLyBgcHJlZml4YCBhbmQgYHBvc3RmaXhgIG1hcmsgdGhlIG9wZXJhdG9yIGFzIGEgcHJlZml4IG9yIHBvc3RmaXhcbiAgLy8gdW5hcnkgb3BlcmF0b3IuXG4gIC8vXG4gIC8vIGBpc0Fzc2lnbmAgbWFya3MgYWxsIG9mIGA9YCwgYCs9YCwgYC09YCBldGNldGVyYSwgd2hpY2ggYWN0IGFzXG4gIC8vIGJpbmFyeSBvcGVyYXRvcnMgd2l0aCBhIHZlcnkgbG93IHByZWNlZGVuY2UsIHRoYXQgc2hvdWxkIHJlc3VsdFxuICAvLyBpbiBBc3NpZ25tZW50RXhwcmVzc2lvbiBub2Rlcy5cblxuICBlcTogbmV3IFRva2VuVHlwZShcIj1cIiwge2JlZm9yZUV4cHI6IHRydWUsIGlzQXNzaWduOiB0cnVlfSksXG4gIGFzc2lnbjogbmV3IFRva2VuVHlwZShcIl89XCIsIHtiZWZvcmVFeHByOiB0cnVlLCBpc0Fzc2lnbjogdHJ1ZX0pLFxuICBpbmNEZWM6IG5ldyBUb2tlblR5cGUoXCIrKy8tLVwiLCB7cHJlZml4OiB0cnVlLCBwb3N0Zml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gIHByZWZpeDogbmV3IFRva2VuVHlwZShcIiEvflwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gIGxvZ2ljYWxPUjogYmlub3AoXCJ8fFwiLCAxKSxcbiAgbG9naWNhbEFORDogYmlub3AoXCImJlwiLCAyKSxcbiAgYml0d2lzZU9SOiBiaW5vcChcInxcIiwgMyksXG4gIGJpdHdpc2VYT1I6IGJpbm9wKFwiXlwiLCA0KSxcbiAgYml0d2lzZUFORDogYmlub3AoXCImXCIsIDUpLFxuICBlcXVhbGl0eTogYmlub3AoXCI9PS8hPS89PT0vIT09XCIsIDYpLFxuICByZWxhdGlvbmFsOiBiaW5vcChcIjwvPi88PS8+PVwiLCA3KSxcbiAgYml0U2hpZnQ6IGJpbm9wKFwiPDwvPj4vPj4+XCIsIDgpLFxuICBwbHVzTWluOiBuZXcgVG9rZW5UeXBlKFwiKy8tXCIsIHtiZWZvcmVFeHByOiB0cnVlLCBiaW5vcDogOSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gIG1vZHVsbzogYmlub3AoXCIlXCIsIDEwKSxcbiAgc3RhcjogYmlub3AoXCIqXCIsIDEwKSxcbiAgc2xhc2g6IGJpbm9wKFwiL1wiLCAxMCksXG4gIHN0YXJzdGFyOiBuZXcgVG9rZW5UeXBlKFwiKipcIiwge2JlZm9yZUV4cHI6IHRydWV9KSxcbiAgY29hbGVzY2U6IGJpbm9wKFwiPz9cIiwgMSksXG5cbiAgLy8gS2V5d29yZCB0b2tlbiB0eXBlcy5cbiAgX2JyZWFrOiBrdyhcImJyZWFrXCIpLFxuICBfY2FzZToga3coXCJjYXNlXCIsIGJlZm9yZUV4cHIpLFxuICBfY2F0Y2g6IGt3KFwiY2F0Y2hcIiksXG4gIF9jb250aW51ZToga3coXCJjb250aW51ZVwiKSxcbiAgX2RlYnVnZ2VyOiBrdyhcImRlYnVnZ2VyXCIpLFxuICBfZGVmYXVsdDoga3coXCJkZWZhdWx0XCIsIGJlZm9yZUV4cHIpLFxuICBfZG86IGt3KFwiZG9cIiwge2lzTG9vcDogdHJ1ZSwgYmVmb3JlRXhwcjogdHJ1ZX0pLFxuICBfZWxzZToga3coXCJlbHNlXCIsIGJlZm9yZUV4cHIpLFxuICBfZmluYWxseToga3coXCJmaW5hbGx5XCIpLFxuICBfZm9yOiBrdyhcImZvclwiLCB7aXNMb29wOiB0cnVlfSksXG4gIF9mdW5jdGlvbjoga3coXCJmdW5jdGlvblwiLCBzdGFydHNFeHByKSxcbiAgX2lmOiBrdyhcImlmXCIpLFxuICBfcmV0dXJuOiBrdyhcInJldHVyblwiLCBiZWZvcmVFeHByKSxcbiAgX3N3aXRjaDoga3coXCJzd2l0Y2hcIiksXG4gIF90aHJvdzoga3coXCJ0aHJvd1wiLCBiZWZvcmVFeHByKSxcbiAgX3RyeToga3coXCJ0cnlcIiksXG4gIF92YXI6IGt3KFwidmFyXCIpLFxuICBfY29uc3Q6IGt3KFwiY29uc3RcIiksXG4gIF93aGlsZToga3coXCJ3aGlsZVwiLCB7aXNMb29wOiB0cnVlfSksXG4gIF93aXRoOiBrdyhcIndpdGhcIiksXG4gIF9uZXc6IGt3KFwibmV3XCIsIHtiZWZvcmVFeHByOiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gIF90aGlzOiBrdyhcInRoaXNcIiwgc3RhcnRzRXhwciksXG4gIF9zdXBlcjoga3coXCJzdXBlclwiLCBzdGFydHNFeHByKSxcbiAgX2NsYXNzOiBrdyhcImNsYXNzXCIsIHN0YXJ0c0V4cHIpLFxuICBfZXh0ZW5kczoga3coXCJleHRlbmRzXCIsIGJlZm9yZUV4cHIpLFxuICBfZXhwb3J0OiBrdyhcImV4cG9ydFwiKSxcbiAgX2ltcG9ydDoga3coXCJpbXBvcnRcIiwgc3RhcnRzRXhwciksXG4gIF9udWxsOiBrdyhcIm51bGxcIiwgc3RhcnRzRXhwciksXG4gIF90cnVlOiBrdyhcInRydWVcIiwgc3RhcnRzRXhwciksXG4gIF9mYWxzZToga3coXCJmYWxzZVwiLCBzdGFydHNFeHByKSxcbiAgX2luOiBrdyhcImluXCIsIHtiZWZvcmVFeHByOiB0cnVlLCBiaW5vcDogN30pLFxuICBfaW5zdGFuY2VvZjoga3coXCJpbnN0YW5jZW9mXCIsIHtiZWZvcmVFeHByOiB0cnVlLCBiaW5vcDogN30pLFxuICBfdHlwZW9mOiBrdyhcInR5cGVvZlwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSksXG4gIF92b2lkOiBrdyhcInZvaWRcIiwge2JlZm9yZUV4cHI6IHRydWUsIHByZWZpeDogdHJ1ZSwgc3RhcnRzRXhwcjogdHJ1ZX0pLFxuICBfZGVsZXRlOiBrdyhcImRlbGV0ZVwiLCB7YmVmb3JlRXhwcjogdHJ1ZSwgcHJlZml4OiB0cnVlLCBzdGFydHNFeHByOiB0cnVlfSlcbn07XG5cbi8vIE1hdGNoZXMgYSB3aG9sZSBsaW5lIGJyZWFrICh3aGVyZSBDUkxGIGlzIGNvbnNpZGVyZWQgYSBzaW5nbGVcbi8vIGxpbmUgYnJlYWspLiBVc2VkIHRvIGNvdW50IGxpbmVzLlxuXG52YXIgbGluZUJyZWFrID0gL1xcclxcbj98XFxufFxcdTIwMjh8XFx1MjAyOS87XG52YXIgbGluZUJyZWFrRyA9IG5ldyBSZWdFeHAobGluZUJyZWFrLnNvdXJjZSwgXCJnXCIpO1xuXG5mdW5jdGlvbiBpc05ld0xpbmUoY29kZSkge1xuICByZXR1cm4gY29kZSA9PT0gMTAgfHwgY29kZSA9PT0gMTMgfHwgY29kZSA9PT0gMHgyMDI4IHx8IGNvZGUgPT09IDB4MjAyOVxufVxuXG5mdW5jdGlvbiBuZXh0TGluZUJyZWFrKGNvZGUsIGZyb20sIGVuZCkge1xuICBpZiAoIGVuZCA9PT0gdm9pZCAwICkgZW5kID0gY29kZS5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IGZyb207IGkgPCBlbmQ7IGkrKykge1xuICAgIHZhciBuZXh0ID0gY29kZS5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChpc05ld0xpbmUobmV4dCkpXG4gICAgICB7IHJldHVybiBpIDwgZW5kIC0gMSAmJiBuZXh0ID09PSAxMyAmJiBjb2RlLmNoYXJDb2RlQXQoaSArIDEpID09PSAxMCA/IGkgKyAyIDogaSArIDEgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG52YXIgbm9uQVNDSUl3aGl0ZXNwYWNlID0gL1tcXHUxNjgwXFx1MjAwMC1cXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1ZmVmZl0vO1xuXG52YXIgc2tpcFdoaXRlU3BhY2UgPSAvKD86XFxzfFxcL1xcLy4qfFxcL1xcKlteXSo/XFwqXFwvKSovZztcblxudmFyIHJlZiA9IE9iamVjdC5wcm90b3R5cGU7XG52YXIgaGFzT3duUHJvcGVydHkkMSA9IHJlZi5oYXNPd25Qcm9wZXJ0eTtcbnZhciB0b1N0cmluZyQxID0gcmVmLnRvU3RyaW5nO1xuXG52YXIgaGFzT3duID0gT2JqZWN0Lmhhc093biB8fCAoZnVuY3Rpb24gKG9iaiwgcHJvcE5hbWUpIHsgcmV0dXJuIChcbiAgaGFzT3duUHJvcGVydHkkMS5jYWxsKG9iaiwgcHJvcE5hbWUpXG4pOyB9KTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IChmdW5jdGlvbiAob2JqKSB7IHJldHVybiAoXG4gIHRvU3RyaW5nJDEuY2FsbChvYmopID09PSBcIltvYmplY3QgQXJyYXldXCJcbik7IH0pO1xuXG5mdW5jdGlvbiB3b3Jkc1JlZ2V4cCh3b3Jkcykge1xuICByZXR1cm4gbmV3IFJlZ0V4cChcIl4oPzpcIiArIHdvcmRzLnJlcGxhY2UoLyAvZywgXCJ8XCIpICsgXCIpJFwiKVxufVxuXG5mdW5jdGlvbiBjb2RlUG9pbnRUb1N0cmluZyhjb2RlKSB7XG4gIC8vIFVURi0xNiBEZWNvZGluZ1xuICBpZiAoY29kZSA8PSAweEZGRkYpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSkgfVxuICBjb2RlIC09IDB4MTAwMDA7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlID4+IDEwKSArIDB4RDgwMCwgKGNvZGUgJiAxMDIzKSArIDB4REMwMClcbn1cblxudmFyIGxvbmVTdXJyb2dhdGUgPSAvKD86W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0pLztcblxuLy8gVGhlc2UgYXJlIHVzZWQgd2hlbiBgb3B0aW9ucy5sb2NhdGlvbnNgIGlzIG9uLCBmb3IgdGhlXG4vLyBgc3RhcnRMb2NgIGFuZCBgZW5kTG9jYCBwcm9wZXJ0aWVzLlxuXG52YXIgUG9zaXRpb24gPSBmdW5jdGlvbiBQb3NpdGlvbihsaW5lLCBjb2wpIHtcbiAgdGhpcy5saW5lID0gbGluZTtcbiAgdGhpcy5jb2x1bW4gPSBjb2w7XG59O1xuXG5Qb3NpdGlvbi5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0IChuKSB7XG4gIHJldHVybiBuZXcgUG9zaXRpb24odGhpcy5saW5lLCB0aGlzLmNvbHVtbiArIG4pXG59O1xuXG52YXIgU291cmNlTG9jYXRpb24gPSBmdW5jdGlvbiBTb3VyY2VMb2NhdGlvbihwLCBzdGFydCwgZW5kKSB7XG4gIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgdGhpcy5lbmQgPSBlbmQ7XG4gIGlmIChwLnNvdXJjZUZpbGUgIT09IG51bGwpIHsgdGhpcy5zb3VyY2UgPSBwLnNvdXJjZUZpbGU7IH1cbn07XG5cbi8vIFRoZSBgZ2V0TGluZUluZm9gIGZ1bmN0aW9uIGlzIG1vc3RseSB1c2VmdWwgd2hlbiB0aGVcbi8vIGBsb2NhdGlvbnNgIG9wdGlvbiBpcyBvZmYgKGZvciBwZXJmb3JtYW5jZSByZWFzb25zKSBhbmQgeW91XG4vLyB3YW50IHRvIGZpbmQgdGhlIGxpbmUvY29sdW1uIHBvc2l0aW9uIGZvciBhIGdpdmVuIGNoYXJhY3RlclxuLy8gb2Zmc2V0LiBgaW5wdXRgIHNob3VsZCBiZSB0aGUgY29kZSBzdHJpbmcgdGhhdCB0aGUgb2Zmc2V0IHJlZmVyc1xuLy8gaW50by5cblxuZnVuY3Rpb24gZ2V0TGluZUluZm8oaW5wdXQsIG9mZnNldCkge1xuICBmb3IgKHZhciBsaW5lID0gMSwgY3VyID0gMDs7KSB7XG4gICAgdmFyIG5leHRCcmVhayA9IG5leHRMaW5lQnJlYWsoaW5wdXQsIGN1ciwgb2Zmc2V0KTtcbiAgICBpZiAobmV4dEJyZWFrIDwgMCkgeyByZXR1cm4gbmV3IFBvc2l0aW9uKGxpbmUsIG9mZnNldCAtIGN1cikgfVxuICAgICsrbGluZTtcbiAgICBjdXIgPSBuZXh0QnJlYWs7XG4gIH1cbn1cblxuLy8gQSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBnaXZlbiB0byBjb25maWd1cmUgdGhlIHBhcnNlciBwcm9jZXNzLlxuLy8gVGhlc2Ugb3B0aW9ucyBhcmUgcmVjb2duaXplZCAob25seSBgZWNtYVZlcnNpb25gIGlzIHJlcXVpcmVkKTpcblxudmFyIGRlZmF1bHRPcHRpb25zID0ge1xuICAvLyBgZWNtYVZlcnNpb25gIGluZGljYXRlcyB0aGUgRUNNQVNjcmlwdCB2ZXJzaW9uIHRvIHBhcnNlLiBNdXN0IGJlXG4gIC8vIGVpdGhlciAzLCA1LCA2IChvciAyMDE1KSwgNyAoMjAxNiksIDggKDIwMTcpLCA5ICgyMDE4KSwgMTBcbiAgLy8gKDIwMTkpLCAxMSAoMjAyMCksIDEyICgyMDIxKSwgMTMgKDIwMjIpLCAxNCAoMjAyMyksIG9yIGBcImxhdGVzdFwiYFxuICAvLyAodGhlIGxhdGVzdCB2ZXJzaW9uIHRoZSBsaWJyYXJ5IHN1cHBvcnRzKS4gVGhpcyBpbmZsdWVuY2VzXG4gIC8vIHN1cHBvcnQgZm9yIHN0cmljdCBtb2RlLCB0aGUgc2V0IG9mIHJlc2VydmVkIHdvcmRzLCBhbmQgc3VwcG9ydFxuICAvLyBmb3IgbmV3IHN5bnRheCBmZWF0dXJlcy5cbiAgZWNtYVZlcnNpb246IG51bGwsXG4gIC8vIGBzb3VyY2VUeXBlYCBpbmRpY2F0ZXMgdGhlIG1vZGUgdGhlIGNvZGUgc2hvdWxkIGJlIHBhcnNlZCBpbi5cbiAgLy8gQ2FuIGJlIGVpdGhlciBgXCJzY3JpcHRcImAgb3IgYFwibW9kdWxlXCJgLiBUaGlzIGluZmx1ZW5jZXMgZ2xvYmFsXG4gIC8vIHN0cmljdCBtb2RlIGFuZCBwYXJzaW5nIG9mIGBpbXBvcnRgIGFuZCBgZXhwb3J0YCBkZWNsYXJhdGlvbnMuXG4gIHNvdXJjZVR5cGU6IFwic2NyaXB0XCIsXG4gIC8vIGBvbkluc2VydGVkU2VtaWNvbG9uYCBjYW4gYmUgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkXG4gIC8vIHdoZW4gYSBzZW1pY29sb24gaXMgYXV0b21hdGljYWxseSBpbnNlcnRlZC4gSXQgd2lsbCBiZSBwYXNzZWRcbiAgLy8gdGhlIHBvc2l0aW9uIG9mIHRoZSBjb21tYSBhcyBhbiBvZmZzZXQsIGFuZCBpZiBgbG9jYXRpb25zYCBpc1xuICAvLyBlbmFibGVkLCBpdCBpcyBnaXZlbiB0aGUgbG9jYXRpb24gYXMgYSBge2xpbmUsIGNvbHVtbn1gIG9iamVjdFxuICAvLyBhcyBzZWNvbmQgYXJndW1lbnQuXG4gIG9uSW5zZXJ0ZWRTZW1pY29sb246IG51bGwsXG4gIC8vIGBvblRyYWlsaW5nQ29tbWFgIGlzIHNpbWlsYXIgdG8gYG9uSW5zZXJ0ZWRTZW1pY29sb25gLCBidXQgZm9yXG4gIC8vIHRyYWlsaW5nIGNvbW1hcy5cbiAgb25UcmFpbGluZ0NvbW1hOiBudWxsLFxuICAvLyBCeSBkZWZhdWx0LCByZXNlcnZlZCB3b3JkcyBhcmUgb25seSBlbmZvcmNlZCBpZiBlY21hVmVyc2lvbiA+PSA1LlxuICAvLyBTZXQgYGFsbG93UmVzZXJ2ZWRgIHRvIGEgYm9vbGVhbiB2YWx1ZSB0byBleHBsaWNpdGx5IHR1cm4gdGhpcyBvblxuICAvLyBhbiBvZmYuIFdoZW4gdGhpcyBvcHRpb24gaGFzIHRoZSB2YWx1ZSBcIm5ldmVyXCIsIHJlc2VydmVkIHdvcmRzXG4gIC8vIGFuZCBrZXl3b3JkcyBjYW4gYWxzbyBub3QgYmUgdXNlZCBhcyBwcm9wZXJ0eSBuYW1lcy5cbiAgYWxsb3dSZXNlcnZlZDogbnVsbCxcbiAgLy8gV2hlbiBlbmFibGVkLCBhIHJldHVybiBhdCB0aGUgdG9wIGxldmVsIGlzIG5vdCBjb25zaWRlcmVkIGFuXG4gIC8vIGVycm9yLlxuICBhbGxvd1JldHVybk91dHNpZGVGdW5jdGlvbjogZmFsc2UsXG4gIC8vIFdoZW4gZW5hYmxlZCwgaW1wb3J0L2V4cG9ydCBzdGF0ZW1lbnRzIGFyZSBub3QgY29uc3RyYWluZWQgdG9cbiAgLy8gYXBwZWFyaW5nIGF0IHRoZSB0b3Agb2YgdGhlIHByb2dyYW0sIGFuZCBhbiBpbXBvcnQubWV0YSBleHByZXNzaW9uXG4gIC8vIGluIGEgc2NyaXB0IGlzbid0IGNvbnNpZGVyZWQgYW4gZXJyb3IuXG4gIGFsbG93SW1wb3J0RXhwb3J0RXZlcnl3aGVyZTogZmFsc2UsXG4gIC8vIEJ5IGRlZmF1bHQsIGF3YWl0IGlkZW50aWZpZXJzIGFyZSBhbGxvd2VkIHRvIGFwcGVhciBhdCB0aGUgdG9wLWxldmVsIHNjb3BlIG9ubHkgaWYgZWNtYVZlcnNpb24gPj0gMjAyMi5cbiAgLy8gV2hlbiBlbmFibGVkLCBhd2FpdCBpZGVudGlmaWVycyBhcmUgYWxsb3dlZCB0byBhcHBlYXIgYXQgdGhlIHRvcC1sZXZlbCBzY29wZSxcbiAgLy8gYnV0IHRoZXkgYXJlIHN0aWxsIG5vdCBhbGxvd2VkIGluIG5vbi1hc3luYyBmdW5jdGlvbnMuXG4gIGFsbG93QXdhaXRPdXRzaWRlRnVuY3Rpb246IG51bGwsXG4gIC8vIFdoZW4gZW5hYmxlZCwgc3VwZXIgaWRlbnRpZmllcnMgYXJlIG5vdCBjb25zdHJhaW5lZCB0b1xuICAvLyBhcHBlYXJpbmcgaW4gbWV0aG9kcyBhbmQgZG8gbm90IHJhaXNlIGFuIGVycm9yIHdoZW4gdGhleSBhcHBlYXIgZWxzZXdoZXJlLlxuICBhbGxvd1N1cGVyT3V0c2lkZU1ldGhvZDogbnVsbCxcbiAgLy8gV2hlbiBlbmFibGVkLCBoYXNoYmFuZyBkaXJlY3RpdmUgaW4gdGhlIGJlZ2lubmluZyBvZiBmaWxlIGlzXG4gIC8vIGFsbG93ZWQgYW5kIHRyZWF0ZWQgYXMgYSBsaW5lIGNvbW1lbnQuIEVuYWJsZWQgYnkgZGVmYXVsdCB3aGVuXG4gIC8vIGBlY21hVmVyc2lvbmAgPj0gMjAyMy5cbiAgYWxsb3dIYXNoQmFuZzogZmFsc2UsXG4gIC8vIFdoZW4gYGxvY2F0aW9uc2AgaXMgb24sIGBsb2NgIHByb3BlcnRpZXMgaG9sZGluZyBvYmplY3RzIHdpdGhcbiAgLy8gYHN0YXJ0YCBhbmQgYGVuZGAgcHJvcGVydGllcyBpbiBge2xpbmUsIGNvbHVtbn1gIGZvcm0gKHdpdGhcbiAgLy8gbGluZSBiZWluZyAxLWJhc2VkIGFuZCBjb2x1bW4gMC1iYXNlZCkgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGVcbiAgLy8gbm9kZXMuXG4gIGxvY2F0aW9uczogZmFsc2UsXG4gIC8vIEEgZnVuY3Rpb24gY2FuIGJlIHBhc3NlZCBhcyBgb25Ub2tlbmAgb3B0aW9uLCB3aGljaCB3aWxsXG4gIC8vIGNhdXNlIEFjb3JuIHRvIGNhbGwgdGhhdCBmdW5jdGlvbiB3aXRoIG9iamVjdCBpbiB0aGUgc2FtZVxuICAvLyBmb3JtYXQgYXMgdG9rZW5zIHJldHVybmVkIGZyb20gYHRva2VuaXplcigpLmdldFRva2VuKClgLiBOb3RlXG4gIC8vIHRoYXQgeW91IGFyZSBub3QgYWxsb3dlZCB0byBjYWxsIHRoZSBwYXJzZXIgZnJvbSB0aGVcbiAgLy8gY2FsbGJhY2tcdTIwMTR0aGF0IHdpbGwgY29ycnVwdCBpdHMgaW50ZXJuYWwgc3RhdGUuXG4gIG9uVG9rZW46IG51bGwsXG4gIC8vIEEgZnVuY3Rpb24gY2FuIGJlIHBhc3NlZCBhcyBgb25Db21tZW50YCBvcHRpb24sIHdoaWNoIHdpbGxcbiAgLy8gY2F1c2UgQWNvcm4gdG8gY2FsbCB0aGF0IGZ1bmN0aW9uIHdpdGggYChibG9jaywgdGV4dCwgc3RhcnQsXG4gIC8vIGVuZClgIHBhcmFtZXRlcnMgd2hlbmV2ZXIgYSBjb21tZW50IGlzIHNraXBwZWQuIGBibG9ja2AgaXMgYVxuICAvLyBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGlzIGEgYmxvY2sgKGAvKiAqL2ApIGNvbW1lbnQsXG4gIC8vIGB0ZXh0YCBpcyB0aGUgY29udGVudCBvZiB0aGUgY29tbWVudCwgYW5kIGBzdGFydGAgYW5kIGBlbmRgIGFyZVxuICAvLyBjaGFyYWN0ZXIgb2Zmc2V0cyB0aGF0IGRlbm90ZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgY29tbWVudC5cbiAgLy8gV2hlbiB0aGUgYGxvY2F0aW9uc2Agb3B0aW9uIGlzIG9uLCB0d28gbW9yZSBwYXJhbWV0ZXJzIGFyZVxuICAvLyBwYXNzZWQsIHRoZSBmdWxsIGB7bGluZSwgY29sdW1ufWAgbG9jYXRpb25zIG9mIHRoZSBzdGFydCBhbmRcbiAgLy8gZW5kIG9mIHRoZSBjb21tZW50cy4gTm90ZSB0aGF0IHlvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2FsbCB0aGVcbiAgLy8gcGFyc2VyIGZyb20gdGhlIGNhbGxiYWNrXHUyMDE0dGhhdCB3aWxsIGNvcnJ1cHQgaXRzIGludGVybmFsIHN0YXRlLlxuICBvbkNvbW1lbnQ6IG51bGwsXG4gIC8vIE5vZGVzIGhhdmUgdGhlaXIgc3RhcnQgYW5kIGVuZCBjaGFyYWN0ZXJzIG9mZnNldHMgcmVjb3JkZWQgaW5cbiAgLy8gYHN0YXJ0YCBhbmQgYGVuZGAgcHJvcGVydGllcyAoZGlyZWN0bHkgb24gdGhlIG5vZGUsIHJhdGhlciB0aGFuXG4gIC8vIHRoZSBgbG9jYCBvYmplY3QsIHdoaWNoIGhvbGRzIGxpbmUvY29sdW1uIGRhdGEuIFRvIGFsc28gYWRkIGFcbiAgLy8gW3NlbWktc3RhbmRhcmRpemVkXVtyYW5nZV0gYHJhbmdlYCBwcm9wZXJ0eSBob2xkaW5nIGEgYFtzdGFydCxcbiAgLy8gZW5kXWAgYXJyYXkgd2l0aCB0aGUgc2FtZSBudW1iZXJzLCBzZXQgdGhlIGByYW5nZXNgIG9wdGlvbiB0b1xuICAvLyBgdHJ1ZWAuXG4gIC8vXG4gIC8vIFtyYW5nZV06IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTc0NTY3OFxuICByYW5nZXM6IGZhbHNlLFxuICAvLyBJdCBpcyBwb3NzaWJsZSB0byBwYXJzZSBtdWx0aXBsZSBmaWxlcyBpbnRvIGEgc2luZ2xlIEFTVCBieVxuICAvLyBwYXNzaW5nIHRoZSB0cmVlIHByb2R1Y2VkIGJ5IHBhcnNpbmcgdGhlIGZpcnN0IGZpbGUgYXNcbiAgLy8gYHByb2dyYW1gIG9wdGlvbiBpbiBzdWJzZXF1ZW50IHBhcnNlcy4gVGhpcyB3aWxsIGFkZCB0aGVcbiAgLy8gdG9wbGV2ZWwgZm9ybXMgb2YgdGhlIHBhcnNlZCBmaWxlIHRvIHRoZSBgUHJvZ3JhbWAgKHRvcCkgbm9kZVxuICAvLyBvZiBhbiBleGlzdGluZyBwYXJzZSB0cmVlLlxuICBwcm9ncmFtOiBudWxsLFxuICAvLyBXaGVuIGBsb2NhdGlvbnNgIGlzIG9uLCB5b3UgY2FuIHBhc3MgdGhpcyB0byByZWNvcmQgdGhlIHNvdXJjZVxuICAvLyBmaWxlIGluIGV2ZXJ5IG5vZGUncyBgbG9jYCBvYmplY3QuXG4gIHNvdXJjZUZpbGU6IG51bGwsXG4gIC8vIFRoaXMgdmFsdWUsIGlmIGdpdmVuLCBpcyBzdG9yZWQgaW4gZXZlcnkgbm9kZSwgd2hldGhlclxuICAvLyBgbG9jYXRpb25zYCBpcyBvbiBvciBvZmYuXG4gIGRpcmVjdFNvdXJjZUZpbGU6IG51bGwsXG4gIC8vIFdoZW4gZW5hYmxlZCwgcGFyZW50aGVzaXplZCBleHByZXNzaW9ucyBhcmUgcmVwcmVzZW50ZWQgYnlcbiAgLy8gKG5vbi1zdGFuZGFyZCkgUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZXNcbiAgcHJlc2VydmVQYXJlbnM6IGZhbHNlXG59O1xuXG4vLyBJbnRlcnByZXQgYW5kIGRlZmF1bHQgYW4gb3B0aW9ucyBvYmplY3RcblxudmFyIHdhcm5lZEFib3V0RWNtYVZlcnNpb24gPSBmYWxzZTtcblxuZnVuY3Rpb24gZ2V0T3B0aW9ucyhvcHRzKSB7XG4gIHZhciBvcHRpb25zID0ge307XG5cbiAgZm9yICh2YXIgb3B0IGluIGRlZmF1bHRPcHRpb25zKVxuICAgIHsgb3B0aW9uc1tvcHRdID0gb3B0cyAmJiBoYXNPd24ob3B0cywgb3B0KSA/IG9wdHNbb3B0XSA6IGRlZmF1bHRPcHRpb25zW29wdF07IH1cblxuICBpZiAob3B0aW9ucy5lY21hVmVyc2lvbiA9PT0gXCJsYXRlc3RcIikge1xuICAgIG9wdGlvbnMuZWNtYVZlcnNpb24gPSAxZTg7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5lY21hVmVyc2lvbiA9PSBudWxsKSB7XG4gICAgaWYgKCF3YXJuZWRBYm91dEVjbWFWZXJzaW9uICYmIHR5cGVvZiBjb25zb2xlID09PSBcIm9iamVjdFwiICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgd2FybmVkQWJvdXRFY21hVmVyc2lvbiA9IHRydWU7XG4gICAgICBjb25zb2xlLndhcm4oXCJTaW5jZSBBY29ybiA4LjAuMCwgb3B0aW9ucy5lY21hVmVyc2lvbiBpcyByZXF1aXJlZC5cXG5EZWZhdWx0aW5nIHRvIDIwMjAsIGJ1dCB0aGlzIHdpbGwgc3RvcCB3b3JraW5nIGluIHRoZSBmdXR1cmUuXCIpO1xuICAgIH1cbiAgICBvcHRpb25zLmVjbWFWZXJzaW9uID0gMTE7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5lY21hVmVyc2lvbiA+PSAyMDE1KSB7XG4gICAgb3B0aW9ucy5lY21hVmVyc2lvbiAtPSAyMDA5O1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuYWxsb3dSZXNlcnZlZCA9PSBudWxsKVxuICAgIHsgb3B0aW9ucy5hbGxvd1Jlc2VydmVkID0gb3B0aW9ucy5lY21hVmVyc2lvbiA8IDU7IH1cblxuICBpZiAoIW9wdHMgfHwgb3B0cy5hbGxvd0hhc2hCYW5nID09IG51bGwpXG4gICAgeyBvcHRpb25zLmFsbG93SGFzaEJhbmcgPSBvcHRpb25zLmVjbWFWZXJzaW9uID49IDE0OyB9XG5cbiAgaWYgKGlzQXJyYXkob3B0aW9ucy5vblRva2VuKSkge1xuICAgIHZhciB0b2tlbnMgPSBvcHRpb25zLm9uVG9rZW47XG4gICAgb3B0aW9ucy5vblRva2VuID0gZnVuY3Rpb24gKHRva2VuKSB7IHJldHVybiB0b2tlbnMucHVzaCh0b2tlbik7IH07XG4gIH1cbiAgaWYgKGlzQXJyYXkob3B0aW9ucy5vbkNvbW1lbnQpKVxuICAgIHsgb3B0aW9ucy5vbkNvbW1lbnQgPSBwdXNoQ29tbWVudChvcHRpb25zLCBvcHRpb25zLm9uQ29tbWVudCk7IH1cblxuICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBwdXNoQ29tbWVudChvcHRpb25zLCBhcnJheSkge1xuICByZXR1cm4gZnVuY3Rpb24oYmxvY2ssIHRleHQsIHN0YXJ0LCBlbmQsIHN0YXJ0TG9jLCBlbmRMb2MpIHtcbiAgICB2YXIgY29tbWVudCA9IHtcbiAgICAgIHR5cGU6IGJsb2NrID8gXCJCbG9ja1wiIDogXCJMaW5lXCIsXG4gICAgICB2YWx1ZTogdGV4dCxcbiAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgIGVuZDogZW5kXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5sb2NhdGlvbnMpXG4gICAgICB7IGNvbW1lbnQubG9jID0gbmV3IFNvdXJjZUxvY2F0aW9uKHRoaXMsIHN0YXJ0TG9jLCBlbmRMb2MpOyB9XG4gICAgaWYgKG9wdGlvbnMucmFuZ2VzKVxuICAgICAgeyBjb21tZW50LnJhbmdlID0gW3N0YXJ0LCBlbmRdOyB9XG4gICAgYXJyYXkucHVzaChjb21tZW50KTtcbiAgfVxufVxuXG4vLyBFYWNoIHNjb3BlIGdldHMgYSBiaXRzZXQgdGhhdCBtYXkgY29udGFpbiB0aGVzZSBmbGFnc1xudmFyXG4gICAgU0NPUEVfVE9QID0gMSxcbiAgICBTQ09QRV9GVU5DVElPTiA9IDIsXG4gICAgU0NPUEVfQVNZTkMgPSA0LFxuICAgIFNDT1BFX0dFTkVSQVRPUiA9IDgsXG4gICAgU0NPUEVfQVJST1cgPSAxNixcbiAgICBTQ09QRV9TSU1QTEVfQ0FUQ0ggPSAzMixcbiAgICBTQ09QRV9TVVBFUiA9IDY0LFxuICAgIFNDT1BFX0RJUkVDVF9TVVBFUiA9IDEyOCxcbiAgICBTQ09QRV9DTEFTU19TVEFUSUNfQkxPQ0sgPSAyNTYsXG4gICAgU0NPUEVfVkFSID0gU0NPUEVfVE9QIHwgU0NPUEVfRlVOQ1RJT04gfCBTQ09QRV9DTEFTU19TVEFUSUNfQkxPQ0s7XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uRmxhZ3MoYXN5bmMsIGdlbmVyYXRvcikge1xuICByZXR1cm4gU0NPUEVfRlVOQ1RJT04gfCAoYXN5bmMgPyBTQ09QRV9BU1lOQyA6IDApIHwgKGdlbmVyYXRvciA/IFNDT1BFX0dFTkVSQVRPUiA6IDApXG59XG5cbi8vIFVzZWQgaW4gY2hlY2tMVmFsKiBhbmQgZGVjbGFyZU5hbWUgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGEgYmluZGluZ1xudmFyXG4gICAgQklORF9OT05FID0gMCwgLy8gTm90IGEgYmluZGluZ1xuICAgIEJJTkRfVkFSID0gMSwgLy8gVmFyLXN0eWxlIGJpbmRpbmdcbiAgICBCSU5EX0xFWElDQUwgPSAyLCAvLyBMZXQtIG9yIGNvbnN0LXN0eWxlIGJpbmRpbmdcbiAgICBCSU5EX0ZVTkNUSU9OID0gMywgLy8gRnVuY3Rpb24gZGVjbGFyYXRpb25cbiAgICBCSU5EX1NJTVBMRV9DQVRDSCA9IDQsIC8vIFNpbXBsZSAoaWRlbnRpZmllciBwYXR0ZXJuKSBjYXRjaCBiaW5kaW5nXG4gICAgQklORF9PVVRTSURFID0gNTsgLy8gU3BlY2lhbCBjYXNlIGZvciBmdW5jdGlvbiBuYW1lcyBhcyBib3VuZCBpbnNpZGUgdGhlIGZ1bmN0aW9uXG5cbnZhciBQYXJzZXIkMSA9IGZ1bmN0aW9uIFBhcnNlcihvcHRpb25zLCBpbnB1dCwgc3RhcnRQb3MpIHtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA9IGdldE9wdGlvbnMob3B0aW9ucyk7XG4gIHRoaXMuc291cmNlRmlsZSA9IG9wdGlvbnMuc291cmNlRmlsZTtcbiAgdGhpcy5rZXl3b3JkcyA9IHdvcmRzUmVnZXhwKGtleXdvcmRzJDFbb3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ID8gNiA6IG9wdGlvbnMuc291cmNlVHlwZSA9PT0gXCJtb2R1bGVcIiA/IFwiNW1vZHVsZVwiIDogNV0pO1xuICB2YXIgcmVzZXJ2ZWQgPSBcIlwiO1xuICBpZiAob3B0aW9ucy5hbGxvd1Jlc2VydmVkICE9PSB0cnVlKSB7XG4gICAgcmVzZXJ2ZWQgPSByZXNlcnZlZFdvcmRzW29wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiA/IDYgOiBvcHRpb25zLmVjbWFWZXJzaW9uID09PSA1ID8gNSA6IDNdO1xuICAgIGlmIChvcHRpb25zLnNvdXJjZVR5cGUgPT09IFwibW9kdWxlXCIpIHsgcmVzZXJ2ZWQgKz0gXCIgYXdhaXRcIjsgfVxuICB9XG4gIHRoaXMucmVzZXJ2ZWRXb3JkcyA9IHdvcmRzUmVnZXhwKHJlc2VydmVkKTtcbiAgdmFyIHJlc2VydmVkU3RyaWN0ID0gKHJlc2VydmVkID8gcmVzZXJ2ZWQgKyBcIiBcIiA6IFwiXCIpICsgcmVzZXJ2ZWRXb3Jkcy5zdHJpY3Q7XG4gIHRoaXMucmVzZXJ2ZWRXb3Jkc1N0cmljdCA9IHdvcmRzUmVnZXhwKHJlc2VydmVkU3RyaWN0KTtcbiAgdGhpcy5yZXNlcnZlZFdvcmRzU3RyaWN0QmluZCA9IHdvcmRzUmVnZXhwKHJlc2VydmVkU3RyaWN0ICsgXCIgXCIgKyByZXNlcnZlZFdvcmRzLnN0cmljdEJpbmQpO1xuICB0aGlzLmlucHV0ID0gU3RyaW5nKGlucHV0KTtcblxuICAvLyBVc2VkIHRvIHNpZ25hbCB0byBjYWxsZXJzIG9mIGByZWFkV29yZDFgIHdoZXRoZXIgdGhlIHdvcmRcbiAgLy8gY29udGFpbmVkIGFueSBlc2NhcGUgc2VxdWVuY2VzLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdvcmRzIHdpdGhcbiAgLy8gZXNjYXBlIHNlcXVlbmNlcyBtdXN0IG5vdCBiZSBpbnRlcnByZXRlZCBhcyBrZXl3b3Jkcy5cbiAgdGhpcy5jb250YWluc0VzYyA9IGZhbHNlO1xuXG4gIC8vIFNldCB1cCB0b2tlbiBzdGF0ZVxuXG4gIC8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSB0b2tlbml6ZXIgaW4gdGhlIGlucHV0LlxuICBpZiAoc3RhcnRQb3MpIHtcbiAgICB0aGlzLnBvcyA9IHN0YXJ0UG9zO1xuICAgIHRoaXMubGluZVN0YXJ0ID0gdGhpcy5pbnB1dC5sYXN0SW5kZXhPZihcIlxcblwiLCBzdGFydFBvcyAtIDEpICsgMTtcbiAgICB0aGlzLmN1ckxpbmUgPSB0aGlzLmlucHV0LnNsaWNlKDAsIHRoaXMubGluZVN0YXJ0KS5zcGxpdChsaW5lQnJlYWspLmxlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnBvcyA9IHRoaXMubGluZVN0YXJ0ID0gMDtcbiAgICB0aGlzLmN1ckxpbmUgPSAxO1xuICB9XG5cbiAgLy8gUHJvcGVydGllcyBvZiB0aGUgY3VycmVudCB0b2tlbjpcbiAgLy8gSXRzIHR5cGVcbiAgdGhpcy50eXBlID0gdHlwZXMkMS5lb2Y7XG4gIC8vIEZvciB0b2tlbnMgdGhhdCBpbmNsdWRlIG1vcmUgaW5mb3JtYXRpb24gdGhhbiB0aGVpciB0eXBlLCB0aGUgdmFsdWVcbiAgdGhpcy52YWx1ZSA9IG51bGw7XG4gIC8vIEl0cyBzdGFydCBhbmQgZW5kIG9mZnNldFxuICB0aGlzLnN0YXJ0ID0gdGhpcy5lbmQgPSB0aGlzLnBvcztcbiAgLy8gQW5kLCBpZiBsb2NhdGlvbnMgYXJlIHVzZWQsIHRoZSB7bGluZSwgY29sdW1ufSBvYmplY3RcbiAgLy8gY29ycmVzcG9uZGluZyB0byB0aG9zZSBvZmZzZXRzXG4gIHRoaXMuc3RhcnRMb2MgPSB0aGlzLmVuZExvYyA9IHRoaXMuY3VyUG9zaXRpb24oKTtcblxuICAvLyBQb3NpdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHByZXZpb3VzIHRva2VuXG4gIHRoaXMubGFzdFRva0VuZExvYyA9IHRoaXMubGFzdFRva1N0YXJ0TG9jID0gbnVsbDtcbiAgdGhpcy5sYXN0VG9rU3RhcnQgPSB0aGlzLmxhc3RUb2tFbmQgPSB0aGlzLnBvcztcblxuICAvLyBUaGUgY29udGV4dCBzdGFjayBpcyB1c2VkIHRvIHN1cGVyZmljaWFsbHkgdHJhY2sgc3ludGFjdGljXG4gIC8vIGNvbnRleHQgdG8gcHJlZGljdCB3aGV0aGVyIGEgcmVndWxhciBleHByZXNzaW9uIGlzIGFsbG93ZWQgaW4gYVxuICAvLyBnaXZlbiBwb3NpdGlvbi5cbiAgdGhpcy5jb250ZXh0ID0gdGhpcy5pbml0aWFsQ29udGV4dCgpO1xuICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcblxuICAvLyBGaWd1cmUgb3V0IGlmIGl0J3MgYSBtb2R1bGUgY29kZS5cbiAgdGhpcy5pbk1vZHVsZSA9IG9wdGlvbnMuc291cmNlVHlwZSA9PT0gXCJtb2R1bGVcIjtcbiAgdGhpcy5zdHJpY3QgPSB0aGlzLmluTW9kdWxlIHx8IHRoaXMuc3RyaWN0RGlyZWN0aXZlKHRoaXMucG9zKTtcblxuICAvLyBVc2VkIHRvIHNpZ25pZnkgdGhlIHN0YXJ0IG9mIGEgcG90ZW50aWFsIGFycm93IGZ1bmN0aW9uXG4gIHRoaXMucG90ZW50aWFsQXJyb3dBdCA9IC0xO1xuICB0aGlzLnBvdGVudGlhbEFycm93SW5Gb3JBd2FpdCA9IGZhbHNlO1xuXG4gIC8vIFBvc2l0aW9ucyB0byBkZWxheWVkLWNoZWNrIHRoYXQgeWllbGQvYXdhaXQgZG9lcyBub3QgZXhpc3QgaW4gZGVmYXVsdCBwYXJhbWV0ZXJzLlxuICB0aGlzLnlpZWxkUG9zID0gdGhpcy5hd2FpdFBvcyA9IHRoaXMuYXdhaXRJZGVudFBvcyA9IDA7XG4gIC8vIExhYmVscyBpbiBzY29wZS5cbiAgdGhpcy5sYWJlbHMgPSBbXTtcbiAgLy8gVGh1cy1mYXIgdW5kZWZpbmVkIGV4cG9ydHMuXG4gIHRoaXMudW5kZWZpbmVkRXhwb3J0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gSWYgZW5hYmxlZCwgc2tpcCBsZWFkaW5nIGhhc2hiYW5nIGxpbmUuXG4gIGlmICh0aGlzLnBvcyA9PT0gMCAmJiBvcHRpb25zLmFsbG93SGFzaEJhbmcgJiYgdGhpcy5pbnB1dC5zbGljZSgwLCAyKSA9PT0gXCIjIVwiKVxuICAgIHsgdGhpcy5za2lwTGluZUNvbW1lbnQoMik7IH1cblxuICAvLyBTY29wZSB0cmFja2luZyBmb3IgZHVwbGljYXRlIHZhcmlhYmxlIG5hbWVzIChzZWUgc2NvcGUuanMpXG4gIHRoaXMuc2NvcGVTdGFjayA9IFtdO1xuICB0aGlzLmVudGVyU2NvcGUoU0NPUEVfVE9QKTtcblxuICAvLyBGb3IgUmVnRXhwIHZhbGlkYXRpb25cbiAgdGhpcy5yZWdleHBTdGF0ZSA9IG51bGw7XG5cbiAgLy8gVGhlIHN0YWNrIG9mIHByaXZhdGUgbmFtZXMuXG4gIC8vIEVhY2ggZWxlbWVudCBoYXMgdHdvIHByb3BlcnRpZXM6ICdkZWNsYXJlZCcgYW5kICd1c2VkJy5cbiAgLy8gV2hlbiBpdCBleGl0ZWQgZnJvbSB0aGUgb3V0ZXJtb3N0IGNsYXNzIGRlZmluaXRpb24sIGFsbCB1c2VkIHByaXZhdGUgbmFtZXMgbXVzdCBiZSBkZWNsYXJlZC5cbiAgdGhpcy5wcml2YXRlTmFtZVN0YWNrID0gW107XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBpbkZ1bmN0aW9uOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGluR2VuZXJhdG9yOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LGluQXN5bmM6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sY2FuQXdhaXQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYWxsb3dTdXBlcjogeyBjb25maWd1cmFibGU6IHRydWUgfSxhbGxvd0RpcmVjdFN1cGVyOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LHRyZWF0RnVuY3Rpb25zQXNWYXI6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sYWxsb3dOZXdEb3RUYXJnZXQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0saW5DbGFzc1N0YXRpY0Jsb2NrOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cblBhcnNlciQxLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlICgpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLm9wdGlvbnMucHJvZ3JhbSB8fCB0aGlzLnN0YXJ0Tm9kZSgpO1xuICB0aGlzLm5leHRUb2tlbigpO1xuICByZXR1cm4gdGhpcy5wYXJzZVRvcExldmVsKG5vZGUpXG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuaW5GdW5jdGlvbi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VmFyU2NvcGUoKS5mbGFncyAmIFNDT1BFX0ZVTkNUSU9OKSA+IDAgfTtcblxucHJvdG90eXBlQWNjZXNzb3JzLmluR2VuZXJhdG9yLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLmN1cnJlbnRWYXJTY29wZSgpLmZsYWdzICYgU0NPUEVfR0VORVJBVE9SKSA+IDAgJiYgIXRoaXMuY3VycmVudFZhclNjb3BlKCkuaW5DbGFzc0ZpZWxkSW5pdCB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuaW5Bc3luYy5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5jdXJyZW50VmFyU2NvcGUoKS5mbGFncyAmIFNDT1BFX0FTWU5DKSA+IDAgJiYgIXRoaXMuY3VycmVudFZhclNjb3BlKCkuaW5DbGFzc0ZpZWxkSW5pdCB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuY2FuQXdhaXQuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIHNjb3BlID0gdGhpcy5zY29wZVN0YWNrW2ldO1xuICAgIGlmIChzY29wZS5pbkNsYXNzRmllbGRJbml0IHx8IHNjb3BlLmZsYWdzICYgU0NPUEVfQ0xBU1NfU1RBVElDX0JMT0NLKSB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKHNjb3BlLmZsYWdzICYgU0NPUEVfRlVOQ1RJT04pIHsgcmV0dXJuIChzY29wZS5mbGFncyAmIFNDT1BFX0FTWU5DKSA+IDAgfVxuICB9XG4gIHJldHVybiAodGhpcy5pbk1vZHVsZSAmJiB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTMpIHx8IHRoaXMub3B0aW9ucy5hbGxvd0F3YWl0T3V0c2lkZUZ1bmN0aW9uXG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuYWxsb3dTdXBlci5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByZWYgPSB0aGlzLmN1cnJlbnRUaGlzU2NvcGUoKTtcbiAgICB2YXIgZmxhZ3MgPSByZWYuZmxhZ3M7XG4gICAgdmFyIGluQ2xhc3NGaWVsZEluaXQgPSByZWYuaW5DbGFzc0ZpZWxkSW5pdDtcbiAgcmV0dXJuIChmbGFncyAmIFNDT1BFX1NVUEVSKSA+IDAgfHwgaW5DbGFzc0ZpZWxkSW5pdCB8fCB0aGlzLm9wdGlvbnMuYWxsb3dTdXBlck91dHNpZGVNZXRob2Rcbn07XG5cbnByb3RvdHlwZUFjY2Vzc29ycy5hbGxvd0RpcmVjdFN1cGVyLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh0aGlzLmN1cnJlbnRUaGlzU2NvcGUoKS5mbGFncyAmIFNDT1BFX0RJUkVDVF9TVVBFUikgPiAwIH07XG5cbnByb3RvdHlwZUFjY2Vzc29ycy50cmVhdEZ1bmN0aW9uc0FzVmFyLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUodGhpcy5jdXJyZW50U2NvcGUoKSkgfTtcblxucHJvdG90eXBlQWNjZXNzb3JzLmFsbG93TmV3RG90VGFyZ2V0LmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlZiA9IHRoaXMuY3VycmVudFRoaXNTY29wZSgpO1xuICAgIHZhciBmbGFncyA9IHJlZi5mbGFncztcbiAgICB2YXIgaW5DbGFzc0ZpZWxkSW5pdCA9IHJlZi5pbkNsYXNzRmllbGRJbml0O1xuICByZXR1cm4gKGZsYWdzICYgKFNDT1BFX0ZVTkNUSU9OIHwgU0NPUEVfQ0xBU1NfU1RBVElDX0JMT0NLKSkgPiAwIHx8IGluQ2xhc3NGaWVsZEluaXRcbn07XG5cbnByb3RvdHlwZUFjY2Vzc29ycy5pbkNsYXNzU3RhdGljQmxvY2suZ2V0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKHRoaXMuY3VycmVudFZhclNjb3BlKCkuZmxhZ3MgJiBTQ09QRV9DTEFTU19TVEFUSUNfQkxPQ0spID4gMFxufTtcblxuUGFyc2VyJDEuZXh0ZW5kID0gZnVuY3Rpb24gZXh0ZW5kICgpIHtcbiAgICB2YXIgcGx1Z2lucyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBwbHVnaW5zWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgdmFyIGNscyA9IHRoaXM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykgeyBjbHMgPSBwbHVnaW5zW2ldKGNscyk7IH1cbiAgcmV0dXJuIGNsc1xufTtcblxuUGFyc2VyJDEucGFyc2UgPSBmdW5jdGlvbiBwYXJzZSAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyB0aGlzKG9wdGlvbnMsIGlucHV0KS5wYXJzZSgpXG59O1xuXG5QYXJzZXIkMS5wYXJzZUV4cHJlc3Npb25BdCA9IGZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbkF0IChpbnB1dCwgcG9zLCBvcHRpb25zKSB7XG4gIHZhciBwYXJzZXIgPSBuZXcgdGhpcyhvcHRpb25zLCBpbnB1dCwgcG9zKTtcbiAgcGFyc2VyLm5leHRUb2tlbigpO1xuICByZXR1cm4gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbigpXG59O1xuXG5QYXJzZXIkMS50b2tlbml6ZXIgPSBmdW5jdGlvbiB0b2tlbml6ZXIgKGlucHV0LCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgdGhpcyhvcHRpb25zLCBpbnB1dClcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBQYXJzZXIkMS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG52YXIgcHAkOSA9IFBhcnNlciQxLnByb3RvdHlwZTtcblxuLy8gIyMgUGFyc2VyIHV0aWxpdGllc1xuXG52YXIgbGl0ZXJhbCA9IC9eKD86JygoPzpcXFxcLnxbXidcXFxcXSkqPyknfFwiKCg/OlxcXFwufFteXCJcXFxcXSkqPylcIikvO1xucHAkOS5zdHJpY3REaXJlY3RpdmUgPSBmdW5jdGlvbihzdGFydCkge1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgNSkgeyByZXR1cm4gZmFsc2UgfVxuICBmb3IgKDs7KSB7XG4gICAgLy8gVHJ5IHRvIGZpbmQgc3RyaW5nIGxpdGVyYWwuXG4gICAgc2tpcFdoaXRlU3BhY2UubGFzdEluZGV4ID0gc3RhcnQ7XG4gICAgc3RhcnQgKz0gc2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzLmlucHV0KVswXS5sZW5ndGg7XG4gICAgdmFyIG1hdGNoID0gbGl0ZXJhbC5leGVjKHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQpKTtcbiAgICBpZiAoIW1hdGNoKSB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKChtYXRjaFsxXSB8fCBtYXRjaFsyXSkgPT09IFwidXNlIHN0cmljdFwiKSB7XG4gICAgICBza2lwV2hpdGVTcGFjZS5sYXN0SW5kZXggPSBzdGFydCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgIHZhciBzcGFjZUFmdGVyID0gc2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzLmlucHV0KSwgZW5kID0gc3BhY2VBZnRlci5pbmRleCArIHNwYWNlQWZ0ZXJbMF0ubGVuZ3RoO1xuICAgICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJBdChlbmQpO1xuICAgICAgcmV0dXJuIG5leHQgPT09IFwiO1wiIHx8IG5leHQgPT09IFwifVwiIHx8XG4gICAgICAgIChsaW5lQnJlYWsudGVzdChzcGFjZUFmdGVyWzBdKSAmJlxuICAgICAgICAgISgvWyhgLlsrXFwtLyolPD49LD9eJl0vLnRlc3QobmV4dCkgfHwgbmV4dCA9PT0gXCIhXCIgJiYgdGhpcy5pbnB1dC5jaGFyQXQoZW5kICsgMSkgPT09IFwiPVwiKSlcbiAgICB9XG4gICAgc3RhcnQgKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuXG4gICAgLy8gU2tpcCBzZW1pY29sb24sIGlmIGFueS5cbiAgICBza2lwV2hpdGVTcGFjZS5sYXN0SW5kZXggPSBzdGFydDtcbiAgICBzdGFydCArPSBza2lwV2hpdGVTcGFjZS5leGVjKHRoaXMuaW5wdXQpWzBdLmxlbmd0aDtcbiAgICBpZiAodGhpcy5pbnB1dFtzdGFydF0gPT09IFwiO1wiKVxuICAgICAgeyBzdGFydCsrOyB9XG4gIH1cbn07XG5cbi8vIFByZWRpY2F0ZSB0aGF0IHRlc3RzIHdoZXRoZXIgdGhlIG5leHQgdG9rZW4gaXMgb2YgdGhlIGdpdmVuXG4vLyB0eXBlLCBhbmQgaWYgeWVzLCBjb25zdW1lcyBpdCBhcyBhIHNpZGUgZWZmZWN0LlxuXG5wcCQ5LmVhdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZSkge1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn07XG5cbi8vIFRlc3RzIHdoZXRoZXIgcGFyc2VkIHRva2VuIGlzIGEgY29udGV4dHVhbCBrZXl3b3JkLlxuXG5wcCQ5LmlzQ29udGV4dHVhbCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMudHlwZSA9PT0gdHlwZXMkMS5uYW1lICYmIHRoaXMudmFsdWUgPT09IG5hbWUgJiYgIXRoaXMuY29udGFpbnNFc2Ncbn07XG5cbi8vIENvbnN1bWVzIGNvbnRleHR1YWwga2V5d29yZCBpZiBwb3NzaWJsZS5cblxucHAkOS5lYXRDb250ZXh0dWFsID0gZnVuY3Rpb24obmFtZSkge1xuICBpZiAoIXRoaXMuaXNDb250ZXh0dWFsKG5hbWUpKSB7IHJldHVybiBmYWxzZSB9XG4gIHRoaXMubmV4dCgpO1xuICByZXR1cm4gdHJ1ZVxufTtcblxuLy8gQXNzZXJ0cyB0aGF0IGZvbGxvd2luZyB0b2tlbiBpcyBnaXZlbiBjb250ZXh0dWFsIGtleXdvcmQuXG5cbnBwJDkuZXhwZWN0Q29udGV4dHVhbCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgaWYgKCF0aGlzLmVhdENvbnRleHR1YWwobmFtZSkpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbn07XG5cbi8vIFRlc3Qgd2hldGhlciBhIHNlbWljb2xvbiBjYW4gYmUgaW5zZXJ0ZWQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uXG5cbnBwJDkuY2FuSW5zZXJ0U2VtaWNvbG9uID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnR5cGUgPT09IHR5cGVzJDEuZW9mIHx8XG4gICAgdGhpcy50eXBlID09PSB0eXBlcyQxLmJyYWNlUiB8fFxuICAgIGxpbmVCcmVhay50ZXN0KHRoaXMuaW5wdXQuc2xpY2UodGhpcy5sYXN0VG9rRW5kLCB0aGlzLnN0YXJ0KSlcbn07XG5cbnBwJDkuaW5zZXJ0U2VtaWNvbG9uID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmNhbkluc2VydFNlbWljb2xvbigpKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5vbkluc2VydGVkU2VtaWNvbG9uKVxuICAgICAgeyB0aGlzLm9wdGlvbnMub25JbnNlcnRlZFNlbWljb2xvbih0aGlzLmxhc3RUb2tFbmQsIHRoaXMubGFzdFRva0VuZExvYyk7IH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59O1xuXG4vLyBDb25zdW1lIGEgc2VtaWNvbG9uLCBvciwgZmFpbGluZyB0aGF0LCBzZWUgaWYgd2UgYXJlIGFsbG93ZWQgdG9cbi8vIHByZXRlbmQgdGhhdCB0aGVyZSBpcyBhIHNlbWljb2xvbiBhdCB0aGlzIHBvc2l0aW9uLlxuXG5wcCQ5LnNlbWljb2xvbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuZWF0KHR5cGVzJDEuc2VtaSkgJiYgIXRoaXMuaW5zZXJ0U2VtaWNvbG9uKCkpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbn07XG5cbnBwJDkuYWZ0ZXJUcmFpbGluZ0NvbW1hID0gZnVuY3Rpb24odG9rVHlwZSwgbm90TmV4dCkge1xuICBpZiAodGhpcy50eXBlID09PSB0b2tUeXBlKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5vblRyYWlsaW5nQ29tbWEpXG4gICAgICB7IHRoaXMub3B0aW9ucy5vblRyYWlsaW5nQ29tbWEodGhpcy5sYXN0VG9rU3RhcnQsIHRoaXMubGFzdFRva1N0YXJ0TG9jKTsgfVxuICAgIGlmICghbm90TmV4dClcbiAgICAgIHsgdGhpcy5uZXh0KCk7IH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59O1xuXG4vLyBFeHBlY3QgYSB0b2tlbiBvZiBhIGdpdmVuIHR5cGUuIElmIGZvdW5kLCBjb25zdW1lIGl0LCBvdGhlcndpc2UsXG4vLyByYWlzZSBhbiB1bmV4cGVjdGVkIHRva2VuIGVycm9yLlxuXG5wcCQ5LmV4cGVjdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdGhpcy5lYXQodHlwZSkgfHwgdGhpcy51bmV4cGVjdGVkKCk7XG59O1xuXG4vLyBSYWlzZSBhbiB1bmV4cGVjdGVkIHRva2VuIGVycm9yLlxuXG5wcCQ5LnVuZXhwZWN0ZWQgPSBmdW5jdGlvbihwb3MpIHtcbiAgdGhpcy5yYWlzZShwb3MgIT0gbnVsbCA/IHBvcyA6IHRoaXMuc3RhcnQsIFwiVW5leHBlY3RlZCB0b2tlblwiKTtcbn07XG5cbnZhciBEZXN0cnVjdHVyaW5nRXJyb3JzID0gZnVuY3Rpb24gRGVzdHJ1Y3R1cmluZ0Vycm9ycygpIHtcbiAgdGhpcy5zaG9ydGhhbmRBc3NpZ24gPVxuICB0aGlzLnRyYWlsaW5nQ29tbWEgPVxuICB0aGlzLnBhcmVudGhlc2l6ZWRBc3NpZ24gPVxuICB0aGlzLnBhcmVudGhlc2l6ZWRCaW5kID1cbiAgdGhpcy5kb3VibGVQcm90byA9XG4gICAgLTE7XG59O1xuXG5wcCQ5LmNoZWNrUGF0dGVybkVycm9ycyA9IGZ1bmN0aW9uKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGlzQXNzaWduKSB7XG4gIGlmICghcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykgeyByZXR1cm4gfVxuICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hID4gLTEpXG4gICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hLCBcIkNvbW1hIGlzIG5vdCBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHJlc3QgZWxlbWVudFwiKTsgfVxuICB2YXIgcGFyZW5zID0gaXNBc3NpZ24gPyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ24gOiByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kO1xuICBpZiAocGFyZW5zID4gLTEpIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHBhcmVucywgaXNBc3NpZ24gPyBcIkFzc2lnbmluZyB0byBydmFsdWVcIiA6IFwiUGFyZW50aGVzaXplZCBwYXR0ZXJuXCIpOyB9XG59O1xuXG5wcCQ5LmNoZWNrRXhwcmVzc2lvbkVycm9ycyA9IGZ1bmN0aW9uKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGFuZFRocm93KSB7XG4gIGlmICghcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykgeyByZXR1cm4gZmFsc2UgfVxuICB2YXIgc2hvcnRoYW5kQXNzaWduID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5zaG9ydGhhbmRBc3NpZ247XG4gIHZhciBkb3VibGVQcm90byA9IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuZG91YmxlUHJvdG87XG4gIGlmICghYW5kVGhyb3cpIHsgcmV0dXJuIHNob3J0aGFuZEFzc2lnbiA+PSAwIHx8IGRvdWJsZVByb3RvID49IDAgfVxuICBpZiAoc2hvcnRoYW5kQXNzaWduID49IDApXG4gICAgeyB0aGlzLnJhaXNlKHNob3J0aGFuZEFzc2lnbiwgXCJTaG9ydGhhbmQgcHJvcGVydHkgYXNzaWdubWVudHMgYXJlIHZhbGlkIG9ubHkgaW4gZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuc1wiKTsgfVxuICBpZiAoZG91YmxlUHJvdG8gPj0gMClcbiAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShkb3VibGVQcm90bywgXCJSZWRlZmluaXRpb24gb2YgX19wcm90b19fIHByb3BlcnR5XCIpOyB9XG59O1xuXG5wcCQ5LmNoZWNrWWllbGRBd2FpdEluRGVmYXVsdFBhcmFtcyA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy55aWVsZFBvcyAmJiAoIXRoaXMuYXdhaXRQb3MgfHwgdGhpcy55aWVsZFBvcyA8IHRoaXMuYXdhaXRQb3MpKVxuICAgIHsgdGhpcy5yYWlzZSh0aGlzLnlpZWxkUG9zLCBcIllpZWxkIGV4cHJlc3Npb24gY2Fubm90IGJlIGEgZGVmYXVsdCB2YWx1ZVwiKTsgfVxuICBpZiAodGhpcy5hd2FpdFBvcylcbiAgICB7IHRoaXMucmFpc2UodGhpcy5hd2FpdFBvcywgXCJBd2FpdCBleHByZXNzaW9uIGNhbm5vdCBiZSBhIGRlZmF1bHQgdmFsdWVcIik7IH1cbn07XG5cbnBwJDkuaXNTaW1wbGVBc3NpZ25UYXJnZXQgPSBmdW5jdGlvbihleHByKSB7XG4gIGlmIChleHByLnR5cGUgPT09IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIilcbiAgICB7IHJldHVybiB0aGlzLmlzU2ltcGxlQXNzaWduVGFyZ2V0KGV4cHIuZXhwcmVzc2lvbikgfVxuICByZXR1cm4gZXhwci50eXBlID09PSBcIklkZW50aWZpZXJcIiB8fCBleHByLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiXG59O1xuXG52YXIgcHAkOCA9IFBhcnNlciQxLnByb3RvdHlwZTtcblxuLy8gIyMjIFN0YXRlbWVudCBwYXJzaW5nXG5cbi8vIFBhcnNlIGEgcHJvZ3JhbS4gSW5pdGlhbGl6ZXMgdGhlIHBhcnNlciwgcmVhZHMgYW55IG51bWJlciBvZlxuLy8gc3RhdGVtZW50cywgYW5kIHdyYXBzIHRoZW0gaW4gYSBQcm9ncmFtIG5vZGUuICBPcHRpb25hbGx5IHRha2VzIGFcbi8vIGBwcm9ncmFtYCBhcmd1bWVudC4gIElmIHByZXNlbnQsIHRoZSBzdGF0ZW1lbnRzIHdpbGwgYmUgYXBwZW5kZWRcbi8vIHRvIGl0cyBib2R5IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgbm9kZS5cblxucHAkOC5wYXJzZVRvcExldmVsID0gZnVuY3Rpb24obm9kZSkge1xuICB2YXIgZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGlmICghbm9kZS5ib2R5KSB7IG5vZGUuYm9keSA9IFtdOyB9XG4gIHdoaWxlICh0aGlzLnR5cGUgIT09IHR5cGVzJDEuZW9mKSB7XG4gICAgdmFyIHN0bXQgPSB0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwsIHRydWUsIGV4cG9ydHMpO1xuICAgIG5vZGUuYm9keS5wdXNoKHN0bXQpO1xuICB9XG4gIGlmICh0aGlzLmluTW9kdWxlKVxuICAgIHsgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBPYmplY3Qua2V5cyh0aGlzLnVuZGVmaW5lZEV4cG9ydHMpOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSlcbiAgICAgIHtcbiAgICAgICAgdmFyIG5hbWUgPSBsaXN0W2ldO1xuXG4gICAgICAgIHRoaXMucmFpc2VSZWNvdmVyYWJsZSh0aGlzLnVuZGVmaW5lZEV4cG9ydHNbbmFtZV0uc3RhcnQsIChcIkV4cG9ydCAnXCIgKyBuYW1lICsgXCInIGlzIG5vdCBkZWZpbmVkXCIpKTtcbiAgICAgIH0gfVxuICB0aGlzLmFkYXB0RGlyZWN0aXZlUHJvbG9ndWUobm9kZS5ib2R5KTtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUuc291cmNlVHlwZSA9IHRoaXMub3B0aW9ucy5zb3VyY2VUeXBlO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiUHJvZ3JhbVwiKVxufTtcblxudmFyIGxvb3BMYWJlbCA9IHtraW5kOiBcImxvb3BcIn0sIHN3aXRjaExhYmVsID0ge2tpbmQ6IFwic3dpdGNoXCJ9O1xuXG5wcCQ4LmlzTGV0ID0gZnVuY3Rpb24oY29udGV4dCkge1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgNiB8fCAhdGhpcy5pc0NvbnRleHR1YWwoXCJsZXRcIikpIHsgcmV0dXJuIGZhbHNlIH1cbiAgc2tpcFdoaXRlU3BhY2UubGFzdEluZGV4ID0gdGhpcy5wb3M7XG4gIHZhciBza2lwID0gc2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzLmlucHV0KTtcbiAgdmFyIG5leHQgPSB0aGlzLnBvcyArIHNraXBbMF0ubGVuZ3RoLCBuZXh0Q2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQobmV4dCk7XG4gIC8vIEZvciBhbWJpZ3VvdXMgY2FzZXMsIGRldGVybWluZSBpZiBhIExleGljYWxEZWNsYXJhdGlvbiAob3Igb25seSBhXG4gIC8vIFN0YXRlbWVudCkgaXMgYWxsb3dlZCBoZXJlLiBJZiBjb250ZXh0IGlzIG5vdCBlbXB0eSB0aGVuIG9ubHkgYSBTdGF0ZW1lbnRcbiAgLy8gaXMgYWxsb3dlZC4gSG93ZXZlciwgYGxldCBbYCBpcyBhbiBleHBsaWNpdCBuZWdhdGl2ZSBsb29rYWhlYWQgZm9yXG4gIC8vIEV4cHJlc3Npb25TdGF0ZW1lbnQsIHNvIHNwZWNpYWwtY2FzZSBpdCBmaXJzdC5cbiAgaWYgKG5leHRDaCA9PT0gOTEgfHwgbmV4dENoID09PSA5MikgeyByZXR1cm4gdHJ1ZSB9IC8vICdbJywgJy8nXG4gIGlmIChjb250ZXh0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKG5leHRDaCA9PT0gMTIzIHx8IG5leHRDaCA+IDB4ZDdmZiAmJiBuZXh0Q2ggPCAweGRjMDApIHsgcmV0dXJuIHRydWUgfSAvLyAneycsIGFzdHJhbFxuICBpZiAoaXNJZGVudGlmaWVyU3RhcnQobmV4dENoLCB0cnVlKSkge1xuICAgIHZhciBwb3MgPSBuZXh0ICsgMTtcbiAgICB3aGlsZSAoaXNJZGVudGlmaWVyQ2hhcihuZXh0Q2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQocG9zKSwgdHJ1ZSkpIHsgKytwb3M7IH1cbiAgICBpZiAobmV4dENoID09PSA5MiB8fCBuZXh0Q2ggPiAweGQ3ZmYgJiYgbmV4dENoIDwgMHhkYzAwKSB7IHJldHVybiB0cnVlIH1cbiAgICB2YXIgaWRlbnQgPSB0aGlzLmlucHV0LnNsaWNlKG5leHQsIHBvcyk7XG4gICAgaWYgKCFrZXl3b3JkUmVsYXRpb25hbE9wZXJhdG9yLnRlc3QoaWRlbnQpKSB7IHJldHVybiB0cnVlIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIGNoZWNrICdhc3luYyBbbm8gTGluZVRlcm1pbmF0b3IgaGVyZV0gZnVuY3Rpb24nXG4vLyAtICdhc3luYyAvKmZvbyovIGZ1bmN0aW9uJyBpcyBPSy5cbi8vIC0gJ2FzeW5jIC8qXFxuKi8gZnVuY3Rpb24nIGlzIGludmFsaWQuXG5wcCQ4LmlzQXN5bmNGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgOCB8fCAhdGhpcy5pc0NvbnRleHR1YWwoXCJhc3luY1wiKSlcbiAgICB7IHJldHVybiBmYWxzZSB9XG5cbiAgc2tpcFdoaXRlU3BhY2UubGFzdEluZGV4ID0gdGhpcy5wb3M7XG4gIHZhciBza2lwID0gc2tpcFdoaXRlU3BhY2UuZXhlYyh0aGlzLmlucHV0KTtcbiAgdmFyIG5leHQgPSB0aGlzLnBvcyArIHNraXBbMF0ubGVuZ3RoLCBhZnRlcjtcbiAgcmV0dXJuICFsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMucG9zLCBuZXh0KSkgJiZcbiAgICB0aGlzLmlucHV0LnNsaWNlKG5leHQsIG5leHQgKyA4KSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgKG5leHQgKyA4ID09PSB0aGlzLmlucHV0Lmxlbmd0aCB8fFxuICAgICAhKGlzSWRlbnRpZmllckNoYXIoYWZ0ZXIgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQobmV4dCArIDgpKSB8fCBhZnRlciA+IDB4ZDdmZiAmJiBhZnRlciA8IDB4ZGMwMCkpXG59O1xuXG4vLyBQYXJzZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4vL1xuLy8gSWYgZXhwZWN0aW5nIGEgc3RhdGVtZW50IGFuZCBmaW5kaW5nIGEgc2xhc2ggb3BlcmF0b3IsIHBhcnNlIGFcbi8vIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsLiBUaGlzIGlzIHRvIGhhbmRsZSBjYXNlcyBsaWtlXG4vLyBgaWYgKGZvbykgL2JsYWgvLmV4ZWMoZm9vKWAsIHdoZXJlIGxvb2tpbmcgYXQgdGhlIHByZXZpb3VzIHRva2VuXG4vLyBkb2VzIG5vdCBoZWxwLlxuXG5wcCQ4LnBhcnNlU3RhdGVtZW50ID0gZnVuY3Rpb24oY29udGV4dCwgdG9wTGV2ZWwsIGV4cG9ydHMpIHtcbiAgdmFyIHN0YXJ0dHlwZSA9IHRoaXMudHlwZSwgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCksIGtpbmQ7XG5cbiAgaWYgKHRoaXMuaXNMZXQoY29udGV4dCkpIHtcbiAgICBzdGFydHR5cGUgPSB0eXBlcyQxLl92YXI7XG4gICAga2luZCA9IFwibGV0XCI7XG4gIH1cblxuICAvLyBNb3N0IHR5cGVzIG9mIHN0YXRlbWVudHMgYXJlIHJlY29nbml6ZWQgYnkgdGhlIGtleXdvcmQgdGhleVxuICAvLyBzdGFydCB3aXRoLiBNYW55IGFyZSB0cml2aWFsIHRvIHBhcnNlLCBzb21lIHJlcXVpcmUgYSBiaXQgb2ZcbiAgLy8gY29tcGxleGl0eS5cblxuICBzd2l0Y2ggKHN0YXJ0dHlwZSkge1xuICBjYXNlIHR5cGVzJDEuX2JyZWFrOiBjYXNlIHR5cGVzJDEuX2NvbnRpbnVlOiByZXR1cm4gdGhpcy5wYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQobm9kZSwgc3RhcnR0eXBlLmtleXdvcmQpXG4gIGNhc2UgdHlwZXMkMS5fZGVidWdnZXI6IHJldHVybiB0aGlzLnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQobm9kZSlcbiAgY2FzZSB0eXBlcyQxLl9kbzogcmV0dXJuIHRoaXMucGFyc2VEb1N0YXRlbWVudChub2RlKVxuICBjYXNlIHR5cGVzJDEuX2ZvcjogcmV0dXJuIHRoaXMucGFyc2VGb3JTdGF0ZW1lbnQobm9kZSlcbiAgY2FzZSB0eXBlcyQxLl9mdW5jdGlvbjpcbiAgICAvLyBGdW5jdGlvbiBhcyBzb2xlIGJvZHkgb2YgZWl0aGVyIGFuIGlmIHN0YXRlbWVudCBvciBhIGxhYmVsZWQgc3RhdGVtZW50XG4gICAgLy8gd29ya3MsIGJ1dCBub3Qgd2hlbiBpdCBpcyBwYXJ0IG9mIGEgbGFiZWxlZCBzdGF0ZW1lbnQgdGhhdCBpcyB0aGUgc29sZVxuICAgIC8vIGJvZHkgb2YgYW4gaWYgc3RhdGVtZW50LlxuICAgIGlmICgoY29udGV4dCAmJiAodGhpcy5zdHJpY3QgfHwgY29udGV4dCAhPT0gXCJpZlwiICYmIGNvbnRleHQgIT09IFwibGFiZWxcIikpICYmIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvblN0YXRlbWVudChub2RlLCBmYWxzZSwgIWNvbnRleHQpXG4gIGNhc2UgdHlwZXMkMS5fY2xhc3M6XG4gICAgaWYgKGNvbnRleHQpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZUNsYXNzKG5vZGUsIHRydWUpXG4gIGNhc2UgdHlwZXMkMS5faWY6IHJldHVybiB0aGlzLnBhcnNlSWZTdGF0ZW1lbnQobm9kZSlcbiAgY2FzZSB0eXBlcyQxLl9yZXR1cm46IHJldHVybiB0aGlzLnBhcnNlUmV0dXJuU3RhdGVtZW50KG5vZGUpXG4gIGNhc2UgdHlwZXMkMS5fc3dpdGNoOiByZXR1cm4gdGhpcy5wYXJzZVN3aXRjaFN0YXRlbWVudChub2RlKVxuICBjYXNlIHR5cGVzJDEuX3Rocm93OiByZXR1cm4gdGhpcy5wYXJzZVRocm93U3RhdGVtZW50KG5vZGUpXG4gIGNhc2UgdHlwZXMkMS5fdHJ5OiByZXR1cm4gdGhpcy5wYXJzZVRyeVN0YXRlbWVudChub2RlKVxuICBjYXNlIHR5cGVzJDEuX2NvbnN0OiBjYXNlIHR5cGVzJDEuX3ZhcjpcbiAgICBraW5kID0ga2luZCB8fCB0aGlzLnZhbHVlO1xuICAgIGlmIChjb250ZXh0ICYmIGtpbmQgIT09IFwidmFyXCIpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZVZhclN0YXRlbWVudChub2RlLCBraW5kKVxuICBjYXNlIHR5cGVzJDEuX3doaWxlOiByZXR1cm4gdGhpcy5wYXJzZVdoaWxlU3RhdGVtZW50KG5vZGUpXG4gIGNhc2UgdHlwZXMkMS5fd2l0aDogcmV0dXJuIHRoaXMucGFyc2VXaXRoU3RhdGVtZW50KG5vZGUpXG4gIGNhc2UgdHlwZXMkMS5icmFjZUw6IHJldHVybiB0aGlzLnBhcnNlQmxvY2sodHJ1ZSwgbm9kZSlcbiAgY2FzZSB0eXBlcyQxLnNlbWk6IHJldHVybiB0aGlzLnBhcnNlRW1wdHlTdGF0ZW1lbnQobm9kZSlcbiAgY2FzZSB0eXBlcyQxLl9leHBvcnQ6XG4gIGNhc2UgdHlwZXMkMS5faW1wb3J0OlxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPiAxMCAmJiBzdGFydHR5cGUgPT09IHR5cGVzJDEuX2ltcG9ydCkge1xuICAgICAgc2tpcFdoaXRlU3BhY2UubGFzdEluZGV4ID0gdGhpcy5wb3M7XG4gICAgICB2YXIgc2tpcCA9IHNraXBXaGl0ZVNwYWNlLmV4ZWModGhpcy5pbnB1dCk7XG4gICAgICB2YXIgbmV4dCA9IHRoaXMucG9zICsgc2tpcFswXS5sZW5ndGgsIG5leHRDaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdChuZXh0KTtcbiAgICAgIGlmIChuZXh0Q2ggPT09IDQwIHx8IG5leHRDaCA9PT0gNDYpIC8vICcoJyBvciAnLidcbiAgICAgICAgeyByZXR1cm4gdGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSwgdGhpcy5wYXJzZUV4cHJlc3Npb24oKSkgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5vcHRpb25zLmFsbG93SW1wb3J0RXhwb3J0RXZlcnl3aGVyZSkge1xuICAgICAgaWYgKCF0b3BMZXZlbClcbiAgICAgICAgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiJ2ltcG9ydCcgYW5kICdleHBvcnQnIG1heSBvbmx5IGFwcGVhciBhdCB0aGUgdG9wIGxldmVsXCIpOyB9XG4gICAgICBpZiAoIXRoaXMuaW5Nb2R1bGUpXG4gICAgICAgIHsgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIidpbXBvcnQnIGFuZCAnZXhwb3J0JyBtYXkgYXBwZWFyIG9ubHkgd2l0aCAnc291cmNlVHlwZTogbW9kdWxlJ1wiKTsgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhcnR0eXBlID09PSB0eXBlcyQxLl9pbXBvcnQgPyB0aGlzLnBhcnNlSW1wb3J0KG5vZGUpIDogdGhpcy5wYXJzZUV4cG9ydChub2RlLCBleHBvcnRzKVxuXG4gICAgLy8gSWYgdGhlIHN0YXRlbWVudCBkb2VzIG5vdCBzdGFydCB3aXRoIGEgc3RhdGVtZW50IGtleXdvcmQgb3IgYVxuICAgIC8vIGJyYWNlLCBpdCdzIGFuIEV4cHJlc3Npb25TdGF0ZW1lbnQgb3IgTGFiZWxlZFN0YXRlbWVudC4gV2VcbiAgICAvLyBzaW1wbHkgc3RhcnQgcGFyc2luZyBhbiBleHByZXNzaW9uLCBhbmQgYWZ0ZXJ3YXJkcywgaWYgdGhlXG4gICAgLy8gbmV4dCB0b2tlbiBpcyBhIGNvbG9uIGFuZCB0aGUgZXhwcmVzc2lvbiB3YXMgYSBzaW1wbGVcbiAgICAvLyBJZGVudGlmaWVyIG5vZGUsIHdlIHN3aXRjaCB0byBpbnRlcnByZXRpbmcgaXQgYXMgYSBsYWJlbC5cbiAgZGVmYXVsdDpcbiAgICBpZiAodGhpcy5pc0FzeW5jRnVuY3Rpb24oKSkge1xuICAgICAgaWYgKGNvbnRleHQpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VGdW5jdGlvblN0YXRlbWVudChub2RlLCB0cnVlLCAhY29udGV4dClcbiAgICB9XG5cbiAgICB2YXIgbWF5YmVOYW1lID0gdGhpcy52YWx1ZSwgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgaWYgKHN0YXJ0dHlwZSA9PT0gdHlwZXMkMS5uYW1lICYmIGV4cHIudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiYgdGhpcy5lYXQodHlwZXMkMS5jb2xvbikpXG4gICAgICB7IHJldHVybiB0aGlzLnBhcnNlTGFiZWxlZFN0YXRlbWVudChub2RlLCBtYXliZU5hbWUsIGV4cHIsIGNvbnRleHQpIH1cbiAgICBlbHNlIHsgcmV0dXJuIHRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUsIGV4cHIpIH1cbiAgfVxufTtcblxucHAkOC5wYXJzZUJyZWFrQ29udGludWVTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBrZXl3b3JkKSB7XG4gIHZhciBpc0JyZWFrID0ga2V5d29yZCA9PT0gXCJicmVha1wiO1xuICB0aGlzLm5leHQoKTtcbiAgaWYgKHRoaXMuZWF0KHR5cGVzJDEuc2VtaSkgfHwgdGhpcy5pbnNlcnRTZW1pY29sb24oKSkgeyBub2RlLmxhYmVsID0gbnVsbDsgfVxuICBlbHNlIGlmICh0aGlzLnR5cGUgIT09IHR5cGVzJDEubmFtZSkgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICBlbHNlIHtcbiAgICBub2RlLmxhYmVsID0gdGhpcy5wYXJzZUlkZW50KCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgfVxuXG4gIC8vIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGFuIGFjdHVhbCBkZXN0aW5hdGlvbiB0byBicmVhayBvclxuICAvLyBjb250aW51ZSB0by5cbiAgdmFyIGkgPSAwO1xuICBmb3IgKDsgaSA8IHRoaXMubGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGxhYiA9IHRoaXMubGFiZWxzW2ldO1xuICAgIGlmIChub2RlLmxhYmVsID09IG51bGwgfHwgbGFiLm5hbWUgPT09IG5vZGUubGFiZWwubmFtZSkge1xuICAgICAgaWYgKGxhYi5raW5kICE9IG51bGwgJiYgKGlzQnJlYWsgfHwgbGFiLmtpbmQgPT09IFwibG9vcFwiKSkgeyBicmVhayB9XG4gICAgICBpZiAobm9kZS5sYWJlbCAmJiBpc0JyZWFrKSB7IGJyZWFrIH1cbiAgICB9XG4gIH1cbiAgaWYgKGkgPT09IHRoaXMubGFiZWxzLmxlbmd0aCkgeyB0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIFwiVW5zeW50YWN0aWMgXCIgKyBrZXl3b3JkKTsgfVxuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIGlzQnJlYWsgPyBcIkJyZWFrU3RhdGVtZW50XCIgOiBcIkNvbnRpbnVlU3RhdGVtZW50XCIpXG59O1xuXG5wcCQ4LnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gIHRoaXMubmV4dCgpO1xuICB0aGlzLnNlbWljb2xvbigpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRGVidWdnZXJTdGF0ZW1lbnRcIilcbn07XG5cbnBwJDgucGFyc2VEb1N0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIHRoaXMubGFiZWxzLnB1c2gobG9vcExhYmVsKTtcbiAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudChcImRvXCIpO1xuICB0aGlzLmxhYmVscy5wb3AoKTtcbiAgdGhpcy5leHBlY3QodHlwZXMkMS5fd2hpbGUpO1xuICBub2RlLnRlc3QgPSB0aGlzLnBhcnNlUGFyZW5FeHByZXNzaW9uKCk7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNilcbiAgICB7IHRoaXMuZWF0KHR5cGVzJDEuc2VtaSk7IH1cbiAgZWxzZVxuICAgIHsgdGhpcy5zZW1pY29sb24oKTsgfVxuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRG9XaGlsZVN0YXRlbWVudFwiKVxufTtcblxuLy8gRGlzYW1iaWd1YXRpbmcgYmV0d2VlbiBhIGBmb3JgIGFuZCBhIGBmb3JgL2BpbmAgb3IgYGZvcmAvYG9mYFxuLy8gbG9vcCBpcyBub24tdHJpdmlhbC4gQmFzaWNhbGx5LCB3ZSBoYXZlIHRvIHBhcnNlIHRoZSBpbml0IGB2YXJgXG4vLyBzdGF0ZW1lbnQgb3IgZXhwcmVzc2lvbiwgZGlzYWxsb3dpbmcgdGhlIGBpbmAgb3BlcmF0b3IgKHNlZVxuLy8gdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYHBhcnNlRXhwcmVzc2lvbmApLCBhbmQgdGhlbiBjaGVja1xuLy8gd2hldGhlciB0aGUgbmV4dCB0b2tlbiBpcyBgaW5gIG9yIGBvZmAuIFdoZW4gdGhlcmUgaXMgbm8gaW5pdFxuLy8gcGFydCAoc2VtaWNvbG9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzKSwgaXRcbi8vIGlzIGEgcmVndWxhciBgZm9yYCBsb29wLlxuXG5wcCQ4LnBhcnNlRm9yU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICB0aGlzLm5leHQoKTtcbiAgdmFyIGF3YWl0QXQgPSAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiYgdGhpcy5jYW5Bd2FpdCAmJiB0aGlzLmVhdENvbnRleHR1YWwoXCJhd2FpdFwiKSkgPyB0aGlzLmxhc3RUb2tTdGFydCA6IC0xO1xuICB0aGlzLmxhYmVscy5wdXNoKGxvb3BMYWJlbCk7XG4gIHRoaXMuZW50ZXJTY29wZSgwKTtcbiAgdGhpcy5leHBlY3QodHlwZXMkMS5wYXJlbkwpO1xuICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLnNlbWkpIHtcbiAgICBpZiAoYXdhaXRBdCA+IC0xKSB7IHRoaXMudW5leHBlY3RlZChhd2FpdEF0KTsgfVxuICAgIHJldHVybiB0aGlzLnBhcnNlRm9yKG5vZGUsIG51bGwpXG4gIH1cbiAgdmFyIGlzTGV0ID0gdGhpcy5pc0xldCgpO1xuICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLl92YXIgfHwgdGhpcy50eXBlID09PSB0eXBlcyQxLl9jb25zdCB8fCBpc0xldCkge1xuICAgIHZhciBpbml0JDEgPSB0aGlzLnN0YXJ0Tm9kZSgpLCBraW5kID0gaXNMZXQgPyBcImxldFwiIDogdGhpcy52YWx1ZTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICB0aGlzLnBhcnNlVmFyKGluaXQkMSwgdHJ1ZSwga2luZCk7XG4gICAgdGhpcy5maW5pc2hOb2RlKGluaXQkMSwgXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpO1xuICAgIGlmICgodGhpcy50eXBlID09PSB0eXBlcyQxLl9pbiB8fCAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkpICYmIGluaXQkMS5kZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMkMS5faW4pIHtcbiAgICAgICAgICBpZiAoYXdhaXRBdCA+IC0xKSB7IHRoaXMudW5leHBlY3RlZChhd2FpdEF0KTsgfVxuICAgICAgICB9IGVsc2UgeyBub2RlLmF3YWl0ID0gYXdhaXRBdCA+IC0xOyB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUZvckluKG5vZGUsIGluaXQkMSlcbiAgICB9XG4gICAgaWYgKGF3YWl0QXQgPiAtMSkgeyB0aGlzLnVuZXhwZWN0ZWQoYXdhaXRBdCk7IH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZUZvcihub2RlLCBpbml0JDEpXG4gIH1cbiAgdmFyIHN0YXJ0c1dpdGhMZXQgPSB0aGlzLmlzQ29udGV4dHVhbChcImxldFwiKSwgaXNGb3JPZiA9IGZhbHNlO1xuICB2YXIgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyA9IG5ldyBEZXN0cnVjdHVyaW5nRXJyb3JzO1xuICB2YXIgaW5pdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKGF3YWl0QXQgPiAtMSA/IFwiYXdhaXRcIiA6IHRydWUsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLl9pbiB8fCAoaXNGb3JPZiA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIHRoaXMuaXNDb250ZXh0dWFsKFwib2ZcIikpKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5KSB7XG4gICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLl9pbikge1xuICAgICAgICBpZiAoYXdhaXRBdCA+IC0xKSB7IHRoaXMudW5leHBlY3RlZChhd2FpdEF0KTsgfVxuICAgICAgfSBlbHNlIHsgbm9kZS5hd2FpdCA9IGF3YWl0QXQgPiAtMTsgfVxuICAgIH1cbiAgICBpZiAoc3RhcnRzV2l0aExldCAmJiBpc0Zvck9mKSB7IHRoaXMucmFpc2UoaW5pdC5zdGFydCwgXCJUaGUgbGVmdC1oYW5kIHNpZGUgb2YgYSBmb3Itb2YgbG9vcCBtYXkgbm90IHN0YXJ0IHdpdGggJ2xldCcuXCIpOyB9XG4gICAgdGhpcy50b0Fzc2lnbmFibGUoaW5pdCwgZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIHRoaXMuY2hlY2tMVmFsUGF0dGVybihpbml0KTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZUZvckluKG5vZGUsIGluaXQpXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGF3YWl0QXQgPiAtMSkgeyB0aGlzLnVuZXhwZWN0ZWQoYXdhaXRBdCk7IH1cbiAgcmV0dXJuIHRoaXMucGFyc2VGb3Iobm9kZSwgaW5pdClcbn07XG5cbnBwJDgucGFyc2VGdW5jdGlvblN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIGlzQXN5bmMsIGRlY2xhcmF0aW9uUG9zaXRpb24pIHtcbiAgdGhpcy5uZXh0KCk7XG4gIHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24obm9kZSwgRlVOQ19TVEFURU1FTlQgfCAoZGVjbGFyYXRpb25Qb3NpdGlvbiA/IDAgOiBGVU5DX0hBTkdJTkdfU1RBVEVNRU5UKSwgZmFsc2UsIGlzQXN5bmMpXG59O1xuXG5wcCQ4LnBhcnNlSWZTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gIHRoaXMubmV4dCgpO1xuICBub2RlLnRlc3QgPSB0aGlzLnBhcnNlUGFyZW5FeHByZXNzaW9uKCk7XG4gIC8vIGFsbG93IGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBpbiBicmFuY2hlcywgYnV0IG9ubHkgaW4gbm9uLXN0cmljdCBtb2RlXG4gIG5vZGUuY29uc2VxdWVudCA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJpZlwiKTtcbiAgbm9kZS5hbHRlcm5hdGUgPSB0aGlzLmVhdCh0eXBlcyQxLl9lbHNlKSA/IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJpZlwiKSA6IG51bGw7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJZlN0YXRlbWVudFwiKVxufTtcblxucHAkOC5wYXJzZVJldHVyblN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgaWYgKCF0aGlzLmluRnVuY3Rpb24gJiYgIXRoaXMub3B0aW9ucy5hbGxvd1JldHVybk91dHNpZGVGdW5jdGlvbilcbiAgICB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCIncmV0dXJuJyBvdXRzaWRlIG9mIGZ1bmN0aW9uXCIpOyB9XG4gIHRoaXMubmV4dCgpO1xuXG4gIC8vIEluIGByZXR1cm5gIChhbmQgYGJyZWFrYC9gY29udGludWVgKSwgdGhlIGtleXdvcmRzIHdpdGhcbiAgLy8gb3B0aW9uYWwgYXJndW1lbnRzLCB3ZSBlYWdlcmx5IGxvb2sgZm9yIGEgc2VtaWNvbG9uIG9yIHRoZVxuICAvLyBwb3NzaWJpbGl0eSB0byBpbnNlcnQgb25lLlxuXG4gIGlmICh0aGlzLmVhdCh0eXBlcyQxLnNlbWkpIHx8IHRoaXMuaW5zZXJ0U2VtaWNvbG9uKCkpIHsgbm9kZS5hcmd1bWVudCA9IG51bGw7IH1cbiAgZWxzZSB7IG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpOyB0aGlzLnNlbWljb2xvbigpOyB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJSZXR1cm5TdGF0ZW1lbnRcIilcbn07XG5cbnBwJDgucGFyc2VTd2l0Y2hTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlKSB7XG4gIHRoaXMubmV4dCgpO1xuICBub2RlLmRpc2NyaW1pbmFudCA9IHRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtcbiAgbm9kZS5jYXNlcyA9IFtdO1xuICB0aGlzLmV4cGVjdCh0eXBlcyQxLmJyYWNlTCk7XG4gIHRoaXMubGFiZWxzLnB1c2goc3dpdGNoTGFiZWwpO1xuICB0aGlzLmVudGVyU2NvcGUoMCk7XG5cbiAgLy8gU3RhdGVtZW50cyB1bmRlciBtdXN0IGJlIGdyb3VwZWQgKGJ5IGxhYmVsKSBpbiBTd2l0Y2hDYXNlXG4gIC8vIG5vZGVzLiBgY3VyYCBpcyB1c2VkIHRvIGtlZXAgdGhlIG5vZGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5XG4gIC8vIGFkZGluZyBzdGF0ZW1lbnRzIHRvLlxuXG4gIHZhciBjdXI7XG4gIGZvciAodmFyIHNhd0RlZmF1bHQgPSBmYWxzZTsgdGhpcy50eXBlICE9PSB0eXBlcyQxLmJyYWNlUjspIHtcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLl9jYXNlIHx8IHRoaXMudHlwZSA9PT0gdHlwZXMkMS5fZGVmYXVsdCkge1xuICAgICAgdmFyIGlzQ2FzZSA9IHRoaXMudHlwZSA9PT0gdHlwZXMkMS5fY2FzZTtcbiAgICAgIGlmIChjdXIpIHsgdGhpcy5maW5pc2hOb2RlKGN1ciwgXCJTd2l0Y2hDYXNlXCIpOyB9XG4gICAgICBub2RlLmNhc2VzLnB1c2goY3VyID0gdGhpcy5zdGFydE5vZGUoKSk7XG4gICAgICBjdXIuY29uc2VxdWVudCA9IFtdO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICBpZiAoaXNDYXNlKSB7XG4gICAgICAgIGN1ci50ZXN0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzYXdEZWZhdWx0KSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZSh0aGlzLmxhc3RUb2tTdGFydCwgXCJNdWx0aXBsZSBkZWZhdWx0IGNsYXVzZXNcIik7IH1cbiAgICAgICAgc2F3RGVmYXVsdCA9IHRydWU7XG4gICAgICAgIGN1ci50ZXN0ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhwZWN0KHR5cGVzJDEuY29sb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWN1cikgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgICAgY3VyLmNvbnNlcXVlbnQucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwpKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5leGl0U2NvcGUoKTtcbiAgaWYgKGN1cikgeyB0aGlzLmZpbmlzaE5vZGUoY3VyLCBcIlN3aXRjaENhc2VcIik7IH1cbiAgdGhpcy5uZXh0KCk7IC8vIENsb3NpbmcgYnJhY2VcbiAgdGhpcy5sYWJlbHMucG9wKCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJTd2l0Y2hTdGF0ZW1lbnRcIilcbn07XG5cbnBwJDgucGFyc2VUaHJvd1N0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIGlmIChsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpKVxuICAgIHsgdGhpcy5yYWlzZSh0aGlzLmxhc3RUb2tFbmQsIFwiSWxsZWdhbCBuZXdsaW5lIGFmdGVyIHRocm93XCIpOyB9XG4gIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICB0aGlzLnNlbWljb2xvbigpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiVGhyb3dTdGF0ZW1lbnRcIilcbn07XG5cbi8vIFJldXNlZCBlbXB0eSBhcnJheSBhZGRlZCBmb3Igbm9kZSBmaWVsZHMgdGhhdCBhcmUgYWx3YXlzIGVtcHR5LlxuXG52YXIgZW1wdHkkMSA9IFtdO1xuXG5wcCQ4LnBhcnNlVHJ5U3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICB0aGlzLm5leHQoKTtcbiAgbm9kZS5ibG9jayA9IHRoaXMucGFyc2VCbG9jaygpO1xuICBub2RlLmhhbmRsZXIgPSBudWxsO1xuICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLl9jYXRjaCkge1xuICAgIHZhciBjbGF1c2UgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIGlmICh0aGlzLmVhdCh0eXBlcyQxLnBhcmVuTCkpIHtcbiAgICAgIGNsYXVzZS5wYXJhbSA9IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICAgICAgdmFyIHNpbXBsZSA9IGNsYXVzZS5wYXJhbS50eXBlID09PSBcIklkZW50aWZpZXJcIjtcbiAgICAgIHRoaXMuZW50ZXJTY29wZShzaW1wbGUgPyBTQ09QRV9TSU1QTEVfQ0FUQ0ggOiAwKTtcbiAgICAgIHRoaXMuY2hlY2tMVmFsUGF0dGVybihjbGF1c2UucGFyYW0sIHNpbXBsZSA/IEJJTkRfU0lNUExFX0NBVENIIDogQklORF9MRVhJQ0FMKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR5cGVzJDEucGFyZW5SKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDEwKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICBjbGF1c2UucGFyYW0gPSBudWxsO1xuICAgICAgdGhpcy5lbnRlclNjb3BlKDApO1xuICAgIH1cbiAgICBjbGF1c2UuYm9keSA9IHRoaXMucGFyc2VCbG9jayhmYWxzZSk7XG4gICAgdGhpcy5leGl0U2NvcGUoKTtcbiAgICBub2RlLmhhbmRsZXIgPSB0aGlzLmZpbmlzaE5vZGUoY2xhdXNlLCBcIkNhdGNoQ2xhdXNlXCIpO1xuICB9XG4gIG5vZGUuZmluYWxpemVyID0gdGhpcy5lYXQodHlwZXMkMS5fZmluYWxseSkgPyB0aGlzLnBhcnNlQmxvY2soKSA6IG51bGw7XG4gIGlmICghbm9kZS5oYW5kbGVyICYmICFub2RlLmZpbmFsaXplcilcbiAgICB7IHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJNaXNzaW5nIGNhdGNoIG9yIGZpbmFsbHkgY2xhdXNlXCIpOyB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUcnlTdGF0ZW1lbnRcIilcbn07XG5cbnBwJDgucGFyc2VWYXJTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBraW5kKSB7XG4gIHRoaXMubmV4dCgpO1xuICB0aGlzLnBhcnNlVmFyKG5vZGUsIGZhbHNlLCBraW5kKTtcbiAgdGhpcy5zZW1pY29sb24oKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlZhcmlhYmxlRGVjbGFyYXRpb25cIilcbn07XG5cbnBwJDgucGFyc2VXaGlsZVN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUudGVzdCA9IHRoaXMucGFyc2VQYXJlbkV4cHJlc3Npb24oKTtcbiAgdGhpcy5sYWJlbHMucHVzaChsb29wTGFiZWwpO1xuICBub2RlLmJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KFwid2hpbGVcIik7XG4gIHRoaXMubGFiZWxzLnBvcCgpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiV2hpbGVTdGF0ZW1lbnRcIilcbn07XG5cbnBwJDgucGFyc2VXaXRoU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICBpZiAodGhpcy5zdHJpY3QpIHsgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIid3aXRoJyBpbiBzdHJpY3QgbW9kZVwiKTsgfVxuICB0aGlzLm5leHQoKTtcbiAgbm9kZS5vYmplY3QgPSB0aGlzLnBhcnNlUGFyZW5FeHByZXNzaW9uKCk7XG4gIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJ3aXRoXCIpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiV2l0aFN0YXRlbWVudFwiKVxufTtcblxucHAkOC5wYXJzZUVtcHR5U3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSkge1xuICB0aGlzLm5leHQoKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkVtcHR5U3RhdGVtZW50XCIpXG59O1xuXG5wcCQ4LnBhcnNlTGFiZWxlZFN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIG1heWJlTmFtZSwgZXhwciwgY29udGV4dCkge1xuICBmb3IgKHZhciBpJDEgPSAwLCBsaXN0ID0gdGhpcy5sYWJlbHM7IGkkMSA8IGxpc3QubGVuZ3RoOyBpJDEgKz0gMSlcbiAgICB7XG4gICAgdmFyIGxhYmVsID0gbGlzdFtpJDFdO1xuXG4gICAgaWYgKGxhYmVsLm5hbWUgPT09IG1heWJlTmFtZSlcbiAgICAgIHsgdGhpcy5yYWlzZShleHByLnN0YXJ0LCBcIkxhYmVsICdcIiArIG1heWJlTmFtZSArIFwiJyBpcyBhbHJlYWR5IGRlY2xhcmVkXCIpO1xuICB9IH1cbiAgdmFyIGtpbmQgPSB0aGlzLnR5cGUuaXNMb29wID8gXCJsb29wXCIgOiB0aGlzLnR5cGUgPT09IHR5cGVzJDEuX3N3aXRjaCA/IFwic3dpdGNoXCIgOiBudWxsO1xuICBmb3IgKHZhciBpID0gdGhpcy5sYWJlbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFiZWwkMSA9IHRoaXMubGFiZWxzW2ldO1xuICAgIGlmIChsYWJlbCQxLnN0YXRlbWVudFN0YXJ0ID09PSBub2RlLnN0YXJ0KSB7XG4gICAgICAvLyBVcGRhdGUgaW5mb3JtYXRpb24gYWJvdXQgcHJldmlvdXMgbGFiZWxzIG9uIHRoaXMgbm9kZVxuICAgICAgbGFiZWwkMS5zdGF0ZW1lbnRTdGFydCA9IHRoaXMuc3RhcnQ7XG4gICAgICBsYWJlbCQxLmtpbmQgPSBraW5kO1xuICAgIH0gZWxzZSB7IGJyZWFrIH1cbiAgfVxuICB0aGlzLmxhYmVscy5wdXNoKHtuYW1lOiBtYXliZU5hbWUsIGtpbmQ6IGtpbmQsIHN0YXRlbWVudFN0YXJ0OiB0aGlzLnN0YXJ0fSk7XG4gIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoY29udGV4dCA/IGNvbnRleHQuaW5kZXhPZihcImxhYmVsXCIpID09PSAtMSA/IGNvbnRleHQgKyBcImxhYmVsXCIgOiBjb250ZXh0IDogXCJsYWJlbFwiKTtcbiAgdGhpcy5sYWJlbHMucG9wKCk7XG4gIG5vZGUubGFiZWwgPSBleHByO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTGFiZWxlZFN0YXRlbWVudFwiKVxufTtcblxucHAkOC5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBleHByKSB7XG4gIG5vZGUuZXhwcmVzc2lvbiA9IGV4cHI7XG4gIHRoaXMuc2VtaWNvbG9uKCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHByZXNzaW9uU3RhdGVtZW50XCIpXG59O1xuXG4vLyBQYXJzZSBhIHNlbWljb2xvbi1lbmNsb3NlZCBibG9jayBvZiBzdGF0ZW1lbnRzLCBoYW5kbGluZyBgXCJ1c2Vcbi8vIHN0cmljdFwiYCBkZWNsYXJhdGlvbnMgd2hlbiBgYWxsb3dTdHJpY3RgIGlzIHRydWUgKHVzZWQgZm9yXG4vLyBmdW5jdGlvbiBib2RpZXMpLlxuXG5wcCQ4LnBhcnNlQmxvY2sgPSBmdW5jdGlvbihjcmVhdGVOZXdMZXhpY2FsU2NvcGUsIG5vZGUsIGV4aXRTdHJpY3QpIHtcbiAgaWYgKCBjcmVhdGVOZXdMZXhpY2FsU2NvcGUgPT09IHZvaWQgMCApIGNyZWF0ZU5ld0xleGljYWxTY29wZSA9IHRydWU7XG4gIGlmICggbm9kZSA9PT0gdm9pZCAwICkgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG5cbiAgbm9kZS5ib2R5ID0gW107XG4gIHRoaXMuZXhwZWN0KHR5cGVzJDEuYnJhY2VMKTtcbiAgaWYgKGNyZWF0ZU5ld0xleGljYWxTY29wZSkgeyB0aGlzLmVudGVyU2NvcGUoMCk7IH1cbiAgd2hpbGUgKHRoaXMudHlwZSAhPT0gdHlwZXMkMS5icmFjZVIpIHtcbiAgICB2YXIgc3RtdCA9IHRoaXMucGFyc2VTdGF0ZW1lbnQobnVsbCk7XG4gICAgbm9kZS5ib2R5LnB1c2goc3RtdCk7XG4gIH1cbiAgaWYgKGV4aXRTdHJpY3QpIHsgdGhpcy5zdHJpY3QgPSBmYWxzZTsgfVxuICB0aGlzLm5leHQoKTtcbiAgaWYgKGNyZWF0ZU5ld0xleGljYWxTY29wZSkgeyB0aGlzLmV4aXRTY29wZSgpOyB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJCbG9ja1N0YXRlbWVudFwiKVxufTtcblxuLy8gUGFyc2UgYSByZWd1bGFyIGBmb3JgIGxvb3AuIFRoZSBkaXNhbWJpZ3VhdGlvbiBjb2RlIGluXG4vLyBgcGFyc2VTdGF0ZW1lbnRgIHdpbGwgYWxyZWFkeSBoYXZlIHBhcnNlZCB0aGUgaW5pdCBzdGF0ZW1lbnQgb3Jcbi8vIGV4cHJlc3Npb24uXG5cbnBwJDgucGFyc2VGb3IgPSBmdW5jdGlvbihub2RlLCBpbml0KSB7XG4gIG5vZGUuaW5pdCA9IGluaXQ7XG4gIHRoaXMuZXhwZWN0KHR5cGVzJDEuc2VtaSk7XG4gIG5vZGUudGVzdCA9IHRoaXMudHlwZSA9PT0gdHlwZXMkMS5zZW1pID8gbnVsbCA6IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gIHRoaXMuZXhwZWN0KHR5cGVzJDEuc2VtaSk7XG4gIG5vZGUudXBkYXRlID0gdGhpcy50eXBlID09PSB0eXBlcyQxLnBhcmVuUiA/IG51bGwgOiB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICB0aGlzLmV4cGVjdCh0eXBlcyQxLnBhcmVuUik7XG4gIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJmb3JcIik7XG4gIHRoaXMuZXhpdFNjb3BlKCk7XG4gIHRoaXMubGFiZWxzLnBvcCgpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRm9yU3RhdGVtZW50XCIpXG59O1xuXG4vLyBQYXJzZSBhIGBmb3JgL2BpbmAgYW5kIGBmb3JgL2BvZmAgbG9vcCwgd2hpY2ggYXJlIGFsbW9zdFxuLy8gc2FtZSBmcm9tIHBhcnNlcidzIHBlcnNwZWN0aXZlLlxuXG5wcCQ4LnBhcnNlRm9ySW4gPSBmdW5jdGlvbihub2RlLCBpbml0KSB7XG4gIHZhciBpc0ZvckluID0gdGhpcy50eXBlID09PSB0eXBlcyQxLl9pbjtcbiAgdGhpcy5uZXh0KCk7XG5cbiAgaWYgKFxuICAgIGluaXQudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIgJiZcbiAgICBpbml0LmRlY2xhcmF0aW9uc1swXS5pbml0ICE9IG51bGwgJiZcbiAgICAoXG4gICAgICAhaXNGb3JJbiB8fFxuICAgICAgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgOCB8fFxuICAgICAgdGhpcy5zdHJpY3QgfHxcbiAgICAgIGluaXQua2luZCAhPT0gXCJ2YXJcIiB8fFxuICAgICAgaW5pdC5kZWNsYXJhdGlvbnNbMF0uaWQudHlwZSAhPT0gXCJJZGVudGlmaWVyXCJcbiAgICApXG4gICkge1xuICAgIHRoaXMucmFpc2UoXG4gICAgICBpbml0LnN0YXJ0LFxuICAgICAgKChpc0ZvckluID8gXCJmb3ItaW5cIiA6IFwiZm9yLW9mXCIpICsgXCIgbG9vcCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBtYXkgbm90IGhhdmUgYW4gaW5pdGlhbGl6ZXJcIilcbiAgICApO1xuICB9XG4gIG5vZGUubGVmdCA9IGluaXQ7XG4gIG5vZGUucmlnaHQgPSBpc0ZvckluID8gdGhpcy5wYXJzZUV4cHJlc3Npb24oKSA6IHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICB0aGlzLmV4cGVjdCh0eXBlcyQxLnBhcmVuUik7XG4gIG5vZGUuYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoXCJmb3JcIik7XG4gIHRoaXMuZXhpdFNjb3BlKCk7XG4gIHRoaXMubGFiZWxzLnBvcCgpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIGlzRm9ySW4gPyBcIkZvckluU3RhdGVtZW50XCIgOiBcIkZvck9mU3RhdGVtZW50XCIpXG59O1xuXG4vLyBQYXJzZSBhIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb25zLlxuXG5wcCQ4LnBhcnNlVmFyID0gZnVuY3Rpb24obm9kZSwgaXNGb3IsIGtpbmQpIHtcbiAgbm9kZS5kZWNsYXJhdGlvbnMgPSBbXTtcbiAgbm9kZS5raW5kID0ga2luZDtcbiAgZm9yICg7Oykge1xuICAgIHZhciBkZWNsID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLnBhcnNlVmFySWQoZGVjbCwga2luZCk7XG4gICAgaWYgKHRoaXMuZWF0KHR5cGVzJDEuZXEpKSB7XG4gICAgICBkZWNsLmluaXQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oaXNGb3IpO1xuICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gXCJjb25zdFwiICYmICEodGhpcy50eXBlID09PSB0eXBlcyQxLl9pbiB8fCAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgdGhpcy5pc0NvbnRleHR1YWwoXCJvZlwiKSkpKSB7XG4gICAgICB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgICB9IGVsc2UgaWYgKGRlY2wuaWQudHlwZSAhPT0gXCJJZGVudGlmaWVyXCIgJiYgIShpc0ZvciAmJiAodGhpcy50eXBlID09PSB0eXBlcyQxLl9pbiB8fCB0aGlzLmlzQ29udGV4dHVhbChcIm9mXCIpKSkpIHtcbiAgICAgIHRoaXMucmFpc2UodGhpcy5sYXN0VG9rRW5kLCBcIkNvbXBsZXggYmluZGluZyBwYXR0ZXJucyByZXF1aXJlIGFuIGluaXRpYWxpemF0aW9uIHZhbHVlXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWNsLmluaXQgPSBudWxsO1xuICAgIH1cbiAgICBub2RlLmRlY2xhcmF0aW9ucy5wdXNoKHRoaXMuZmluaXNoTm9kZShkZWNsLCBcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSk7XG4gICAgaWYgKCF0aGlzLmVhdCh0eXBlcyQxLmNvbW1hKSkgeyBicmVhayB9XG4gIH1cbiAgcmV0dXJuIG5vZGVcbn07XG5cbnBwJDgucGFyc2VWYXJJZCA9IGZ1bmN0aW9uKGRlY2wsIGtpbmQpIHtcbiAgZGVjbC5pZCA9IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICB0aGlzLmNoZWNrTFZhbFBhdHRlcm4oZGVjbC5pZCwga2luZCA9PT0gXCJ2YXJcIiA/IEJJTkRfVkFSIDogQklORF9MRVhJQ0FMLCBmYWxzZSk7XG59O1xuXG52YXIgRlVOQ19TVEFURU1FTlQgPSAxLCBGVU5DX0hBTkdJTkdfU1RBVEVNRU5UID0gMiwgRlVOQ19OVUxMQUJMRV9JRCA9IDQ7XG5cbi8vIFBhcnNlIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gb3IgbGl0ZXJhbCAoZGVwZW5kaW5nIG9uIHRoZVxuLy8gYHN0YXRlbWVudCAmIEZVTkNfU1RBVEVNRU5UYCkuXG5cbi8vIFJlbW92ZSBgYWxsb3dFeHByZXNzaW9uQm9keWAgZm9yIDcuMC4wLCBhcyBpdCBpcyBvbmx5IGNhbGxlZCB3aXRoIGZhbHNlXG5wcCQ4LnBhcnNlRnVuY3Rpb24gPSBmdW5jdGlvbihub2RlLCBzdGF0ZW1lbnQsIGFsbG93RXhwcmVzc2lvbkJvZHksIGlzQXN5bmMsIGZvckluaXQpIHtcbiAgdGhpcy5pbml0RnVuY3Rpb24obm9kZSk7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSB8fCB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiAhaXNBc3luYykge1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEuc3RhciAmJiAoc3RhdGVtZW50ICYgRlVOQ19IQU5HSU5HX1NUQVRFTUVOVCkpXG4gICAgICB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgbm9kZS5nZW5lcmF0b3IgPSB0aGlzLmVhdCh0eXBlcyQxLnN0YXIpO1xuICB9XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOClcbiAgICB7IG5vZGUuYXN5bmMgPSAhIWlzQXN5bmM7IH1cblxuICBpZiAoc3RhdGVtZW50ICYgRlVOQ19TVEFURU1FTlQpIHtcbiAgICBub2RlLmlkID0gKHN0YXRlbWVudCAmIEZVTkNfTlVMTEFCTEVfSUQpICYmIHRoaXMudHlwZSAhPT0gdHlwZXMkMS5uYW1lID8gbnVsbCA6IHRoaXMucGFyc2VJZGVudCgpO1xuICAgIGlmIChub2RlLmlkICYmICEoc3RhdGVtZW50ICYgRlVOQ19IQU5HSU5HX1NUQVRFTUVOVCkpXG4gICAgICAvLyBJZiBpdCBpcyBhIHJlZ3VsYXIgZnVuY3Rpb24gZGVjbGFyYXRpb24gaW4gc2xvcHB5IG1vZGUsIHRoZW4gaXQgaXNcbiAgICAgIC8vIHN1YmplY3QgdG8gQW5uZXggQiBzZW1hbnRpY3MgKEJJTkRfRlVOQ1RJT04pLiBPdGhlcndpc2UsIHRoZSBiaW5kaW5nXG4gICAgICAvLyBtb2RlIGRlcGVuZHMgb24gcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBzY29wZSAoc2VlXG4gICAgICAvLyB0cmVhdEZ1bmN0aW9uc0FzVmFyKS5cbiAgICAgIHsgdGhpcy5jaGVja0xWYWxTaW1wbGUobm9kZS5pZCwgKHRoaXMuc3RyaWN0IHx8IG5vZGUuZ2VuZXJhdG9yIHx8IG5vZGUuYXN5bmMpID8gdGhpcy50cmVhdEZ1bmN0aW9uc0FzVmFyID8gQklORF9WQVIgOiBCSU5EX0xFWElDQUwgOiBCSU5EX0ZVTkNUSU9OKTsgfVxuICB9XG5cbiAgdmFyIG9sZFlpZWxkUG9zID0gdGhpcy55aWVsZFBvcywgb2xkQXdhaXRQb3MgPSB0aGlzLmF3YWl0UG9zLCBvbGRBd2FpdElkZW50UG9zID0gdGhpcy5hd2FpdElkZW50UG9zO1xuICB0aGlzLnlpZWxkUG9zID0gMDtcbiAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gIHRoaXMuYXdhaXRJZGVudFBvcyA9IDA7XG4gIHRoaXMuZW50ZXJTY29wZShmdW5jdGlvbkZsYWdzKG5vZGUuYXN5bmMsIG5vZGUuZ2VuZXJhdG9yKSk7XG5cbiAgaWYgKCEoc3RhdGVtZW50ICYgRlVOQ19TVEFURU1FTlQpKVxuICAgIHsgbm9kZS5pZCA9IHRoaXMudHlwZSA9PT0gdHlwZXMkMS5uYW1lID8gdGhpcy5wYXJzZUlkZW50KCkgOiBudWxsOyB9XG5cbiAgdGhpcy5wYXJzZUZ1bmN0aW9uUGFyYW1zKG5vZGUpO1xuICB0aGlzLnBhcnNlRnVuY3Rpb25Cb2R5KG5vZGUsIGFsbG93RXhwcmVzc2lvbkJvZHksIGZhbHNlLCBmb3JJbml0KTtcblxuICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3M7XG4gIHRoaXMuYXdhaXRQb3MgPSBvbGRBd2FpdFBvcztcbiAgdGhpcy5hd2FpdElkZW50UG9zID0gb2xkQXdhaXRJZGVudFBvcztcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCAoc3RhdGVtZW50ICYgRlVOQ19TVEFURU1FTlQpID8gXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIgOiBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiKVxufTtcblxucHAkOC5wYXJzZUZ1bmN0aW9uUGFyYW1zID0gZnVuY3Rpb24obm9kZSkge1xuICB0aGlzLmV4cGVjdCh0eXBlcyQxLnBhcmVuTCk7XG4gIG5vZGUucGFyYW1zID0gdGhpcy5wYXJzZUJpbmRpbmdMaXN0KHR5cGVzJDEucGFyZW5SLCBmYWxzZSwgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDgpO1xuICB0aGlzLmNoZWNrWWllbGRBd2FpdEluRGVmYXVsdFBhcmFtcygpO1xufTtcblxuLy8gUGFyc2UgYSBjbGFzcyBkZWNsYXJhdGlvbiBvciBsaXRlcmFsIChkZXBlbmRpbmcgb24gdGhlXG4vLyBgaXNTdGF0ZW1lbnRgIHBhcmFtZXRlcikuXG5cbnBwJDgucGFyc2VDbGFzcyA9IGZ1bmN0aW9uKG5vZGUsIGlzU3RhdGVtZW50KSB7XG4gIHRoaXMubmV4dCgpO1xuXG4gIC8vIGVjbWEtMjYyIDE0LjYgQ2xhc3MgRGVmaW5pdGlvbnNcbiAgLy8gQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFsd2F5cyBzdHJpY3QgbW9kZSBjb2RlLlxuICB2YXIgb2xkU3RyaWN0ID0gdGhpcy5zdHJpY3Q7XG4gIHRoaXMuc3RyaWN0ID0gdHJ1ZTtcblxuICB0aGlzLnBhcnNlQ2xhc3NJZChub2RlLCBpc1N0YXRlbWVudCk7XG4gIHRoaXMucGFyc2VDbGFzc1N1cGVyKG5vZGUpO1xuICB2YXIgcHJpdmF0ZU5hbWVNYXAgPSB0aGlzLmVudGVyQ2xhc3NCb2R5KCk7XG4gIHZhciBjbGFzc0JvZHkgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICB2YXIgaGFkQ29uc3RydWN0b3IgPSBmYWxzZTtcbiAgY2xhc3NCb2R5LmJvZHkgPSBbXTtcbiAgdGhpcy5leHBlY3QodHlwZXMkMS5icmFjZUwpO1xuICB3aGlsZSAodGhpcy50eXBlICE9PSB0eXBlcyQxLmJyYWNlUikge1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5wYXJzZUNsYXNzRWxlbWVudChub2RlLnN1cGVyQ2xhc3MgIT09IG51bGwpO1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBjbGFzc0JvZHkuYm9keS5wdXNoKGVsZW1lbnQpO1xuICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJNZXRob2REZWZpbml0aW9uXCIgJiYgZWxlbWVudC5raW5kID09PSBcImNvbnN0cnVjdG9yXCIpIHtcbiAgICAgICAgaWYgKGhhZENvbnN0cnVjdG9yKSB7IHRoaXMucmFpc2UoZWxlbWVudC5zdGFydCwgXCJEdXBsaWNhdGUgY29uc3RydWN0b3IgaW4gdGhlIHNhbWUgY2xhc3NcIik7IH1cbiAgICAgICAgaGFkQ29uc3RydWN0b3IgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmtleSAmJiBlbGVtZW50LmtleS50eXBlID09PSBcIlByaXZhdGVJZGVudGlmaWVyXCIgJiYgaXNQcml2YXRlTmFtZUNvbmZsaWN0ZWQocHJpdmF0ZU5hbWVNYXAsIGVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMucmFpc2VSZWNvdmVyYWJsZShlbGVtZW50LmtleS5zdGFydCwgKFwiSWRlbnRpZmllciAnI1wiICsgKGVsZW1lbnQua2V5Lm5hbWUpICsgXCInIGhhcyBhbHJlYWR5IGJlZW4gZGVjbGFyZWRcIikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB0aGlzLnN0cmljdCA9IG9sZFN0cmljdDtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUuYm9keSA9IHRoaXMuZmluaXNoTm9kZShjbGFzc0JvZHksIFwiQ2xhc3NCb2R5XCIpO1xuICB0aGlzLmV4aXRDbGFzc0JvZHkoKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBpc1N0YXRlbWVudCA/IFwiQ2xhc3NEZWNsYXJhdGlvblwiIDogXCJDbGFzc0V4cHJlc3Npb25cIilcbn07XG5cbnBwJDgucGFyc2VDbGFzc0VsZW1lbnQgPSBmdW5jdGlvbihjb25zdHJ1Y3RvckFsbG93c1N1cGVyKSB7XG4gIGlmICh0aGlzLmVhdCh0eXBlcyQxLnNlbWkpKSB7IHJldHVybiBudWxsIH1cblxuICB2YXIgZWNtYVZlcnNpb24gPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb247XG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgdmFyIGtleU5hbWUgPSBcIlwiO1xuICB2YXIgaXNHZW5lcmF0b3IgPSBmYWxzZTtcbiAgdmFyIGlzQXN5bmMgPSBmYWxzZTtcbiAgdmFyIGtpbmQgPSBcIm1ldGhvZFwiO1xuICB2YXIgaXNTdGF0aWMgPSBmYWxzZTtcblxuICBpZiAodGhpcy5lYXRDb250ZXh0dWFsKFwic3RhdGljXCIpKSB7XG4gICAgLy8gUGFyc2Ugc3RhdGljIGluaXQgYmxvY2tcbiAgICBpZiAoZWNtYVZlcnNpb24gPj0gMTMgJiYgdGhpcy5lYXQodHlwZXMkMS5icmFjZUwpKSB7XG4gICAgICB0aGlzLnBhcnNlQ2xhc3NTdGF0aWNCbG9jayhub2RlKTtcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuICAgIGlmICh0aGlzLmlzQ2xhc3NFbGVtZW50TmFtZVN0YXJ0KCkgfHwgdGhpcy50eXBlID09PSB0eXBlcyQxLnN0YXIpIHtcbiAgICAgIGlzU3RhdGljID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5TmFtZSA9IFwic3RhdGljXCI7XG4gICAgfVxuICB9XG4gIG5vZGUuc3RhdGljID0gaXNTdGF0aWM7XG4gIGlmICgha2V5TmFtZSAmJiBlY21hVmVyc2lvbiA+PSA4ICYmIHRoaXMuZWF0Q29udGV4dHVhbChcImFzeW5jXCIpKSB7XG4gICAgaWYgKCh0aGlzLmlzQ2xhc3NFbGVtZW50TmFtZVN0YXJ0KCkgfHwgdGhpcy50eXBlID09PSB0eXBlcyQxLnN0YXIpICYmICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpKSB7XG4gICAgICBpc0FzeW5jID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5TmFtZSA9IFwiYXN5bmNcIjtcbiAgICB9XG4gIH1cbiAgaWYgKCFrZXlOYW1lICYmIChlY21hVmVyc2lvbiA+PSA5IHx8ICFpc0FzeW5jKSAmJiB0aGlzLmVhdCh0eXBlcyQxLnN0YXIpKSB7XG4gICAgaXNHZW5lcmF0b3IgPSB0cnVlO1xuICB9XG4gIGlmICgha2V5TmFtZSAmJiAhaXNBc3luYyAmJiAhaXNHZW5lcmF0b3IpIHtcbiAgICB2YXIgbGFzdFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBpZiAodGhpcy5lYXRDb250ZXh0dWFsKFwiZ2V0XCIpIHx8IHRoaXMuZWF0Q29udGV4dHVhbChcInNldFwiKSkge1xuICAgICAgaWYgKHRoaXMuaXNDbGFzc0VsZW1lbnROYW1lU3RhcnQoKSkge1xuICAgICAgICBraW5kID0gbGFzdFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5TmFtZSA9IGxhc3RWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQYXJzZSBlbGVtZW50IG5hbWVcbiAgaWYgKGtleU5hbWUpIHtcbiAgICAvLyAnYXN5bmMnLCAnZ2V0JywgJ3NldCcsIG9yICdzdGF0aWMnIHdlcmUgbm90IGEga2V5d29yZCBjb250ZXh0dWFsbHkuXG4gICAgLy8gVGhlIGxhc3QgdG9rZW4gaXMgYW55IG9mIHRob3NlLiBNYWtlIGl0IHRoZSBlbGVtZW50IG5hbWUuXG4gICAgbm9kZS5jb21wdXRlZCA9IGZhbHNlO1xuICAgIG5vZGUua2V5ID0gdGhpcy5zdGFydE5vZGVBdCh0aGlzLmxhc3RUb2tTdGFydCwgdGhpcy5sYXN0VG9rU3RhcnRMb2MpO1xuICAgIG5vZGUua2V5Lm5hbWUgPSBrZXlOYW1lO1xuICAgIHRoaXMuZmluaXNoTm9kZShub2RlLmtleSwgXCJJZGVudGlmaWVyXCIpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMucGFyc2VDbGFzc0VsZW1lbnROYW1lKG5vZGUpO1xuICB9XG5cbiAgLy8gUGFyc2UgZWxlbWVudCB2YWx1ZVxuICBpZiAoZWNtYVZlcnNpb24gPCAxMyB8fCB0aGlzLnR5cGUgPT09IHR5cGVzJDEucGFyZW5MIHx8IGtpbmQgIT09IFwibWV0aG9kXCIgfHwgaXNHZW5lcmF0b3IgfHwgaXNBc3luYykge1xuICAgIHZhciBpc0NvbnN0cnVjdG9yID0gIW5vZGUuc3RhdGljICYmIGNoZWNrS2V5TmFtZShub2RlLCBcImNvbnN0cnVjdG9yXCIpO1xuICAgIHZhciBhbGxvd3NEaXJlY3RTdXBlciA9IGlzQ29uc3RydWN0b3IgJiYgY29uc3RydWN0b3JBbGxvd3NTdXBlcjtcbiAgICAvLyBDb3VsZG4ndCBtb3ZlIHRoaXMgY2hlY2sgaW50byB0aGUgJ3BhcnNlQ2xhc3NNZXRob2QnIG1ldGhvZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiBraW5kICE9PSBcIm1ldGhvZFwiKSB7IHRoaXMucmFpc2Uobm9kZS5rZXkuc3RhcnQsIFwiQ29uc3RydWN0b3IgY2FuJ3QgaGF2ZSBnZXQvc2V0IG1vZGlmaWVyXCIpOyB9XG4gICAgbm9kZS5raW5kID0gaXNDb25zdHJ1Y3RvciA/IFwiY29uc3RydWN0b3JcIiA6IGtpbmQ7XG4gICAgdGhpcy5wYXJzZUNsYXNzTWV0aG9kKG5vZGUsIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBhbGxvd3NEaXJlY3RTdXBlcik7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5wYXJzZUNsYXNzRmllbGQobm9kZSk7XG4gIH1cblxuICByZXR1cm4gbm9kZVxufTtcblxucHAkOC5pc0NsYXNzRWxlbWVudE5hbWVTdGFydCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gKFxuICAgIHRoaXMudHlwZSA9PT0gdHlwZXMkMS5uYW1lIHx8XG4gICAgdGhpcy50eXBlID09PSB0eXBlcyQxLnByaXZhdGVJZCB8fFxuICAgIHRoaXMudHlwZSA9PT0gdHlwZXMkMS5udW0gfHxcbiAgICB0aGlzLnR5cGUgPT09IHR5cGVzJDEuc3RyaW5nIHx8XG4gICAgdGhpcy50eXBlID09PSB0eXBlcyQxLmJyYWNrZXRMIHx8XG4gICAgdGhpcy50eXBlLmtleXdvcmRcbiAgKVxufTtcblxucHAkOC5wYXJzZUNsYXNzRWxlbWVudE5hbWUgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEucHJpdmF0ZUlkKSB7XG4gICAgaWYgKHRoaXMudmFsdWUgPT09IFwiY29uc3RydWN0b3JcIikge1xuICAgICAgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIkNsYXNzZXMgY2FuJ3QgaGF2ZSBhbiBlbGVtZW50IG5hbWVkICcjY29uc3RydWN0b3InXCIpO1xuICAgIH1cbiAgICBlbGVtZW50LmNvbXB1dGVkID0gZmFsc2U7XG4gICAgZWxlbWVudC5rZXkgPSB0aGlzLnBhcnNlUHJpdmF0ZUlkZW50KCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5wYXJzZVByb3BlcnR5TmFtZShlbGVtZW50KTtcbiAgfVxufTtcblxucHAkOC5wYXJzZUNsYXNzTWV0aG9kID0gZnVuY3Rpb24obWV0aG9kLCBpc0dlbmVyYXRvciwgaXNBc3luYywgYWxsb3dzRGlyZWN0U3VwZXIpIHtcbiAgLy8gQ2hlY2sga2V5IGFuZCBmbGFnc1xuICB2YXIga2V5ID0gbWV0aG9kLmtleTtcbiAgaWYgKG1ldGhvZC5raW5kID09PSBcImNvbnN0cnVjdG9yXCIpIHtcbiAgICBpZiAoaXNHZW5lcmF0b3IpIHsgdGhpcy5yYWlzZShrZXkuc3RhcnQsIFwiQ29uc3RydWN0b3IgY2FuJ3QgYmUgYSBnZW5lcmF0b3JcIik7IH1cbiAgICBpZiAoaXNBc3luYykgeyB0aGlzLnJhaXNlKGtleS5zdGFydCwgXCJDb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhc3luYyBtZXRob2RcIik7IH1cbiAgfSBlbHNlIGlmIChtZXRob2Quc3RhdGljICYmIGNoZWNrS2V5TmFtZShtZXRob2QsIFwicHJvdG90eXBlXCIpKSB7XG4gICAgdGhpcy5yYWlzZShrZXkuc3RhcnQsIFwiQ2xhc3NlcyBtYXkgbm90IGhhdmUgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgcHJvdG90eXBlXCIpO1xuICB9XG5cbiAgLy8gUGFyc2UgdmFsdWVcbiAgdmFyIHZhbHVlID0gbWV0aG9kLnZhbHVlID0gdGhpcy5wYXJzZU1ldGhvZChpc0dlbmVyYXRvciwgaXNBc3luYywgYWxsb3dzRGlyZWN0U3VwZXIpO1xuXG4gIC8vIENoZWNrIHZhbHVlXG4gIGlmIChtZXRob2Qua2luZCA9PT0gXCJnZXRcIiAmJiB2YWx1ZS5wYXJhbXMubGVuZ3RoICE9PSAwKVxuICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHZhbHVlLnN0YXJ0LCBcImdldHRlciBzaG91bGQgaGF2ZSBubyBwYXJhbXNcIik7IH1cbiAgaWYgKG1ldGhvZC5raW5kID09PSBcInNldFwiICYmIHZhbHVlLnBhcmFtcy5sZW5ndGggIT09IDEpXG4gICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodmFsdWUuc3RhcnQsIFwic2V0dGVyIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtXCIpOyB9XG4gIGlmIChtZXRob2Qua2luZCA9PT0gXCJzZXRcIiAmJiB2YWx1ZS5wYXJhbXNbMF0udHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiKVxuICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHZhbHVlLnBhcmFtc1swXS5zdGFydCwgXCJTZXR0ZXIgY2Fubm90IHVzZSByZXN0IHBhcmFtc1wiKTsgfVxuXG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobWV0aG9kLCBcIk1ldGhvZERlZmluaXRpb25cIilcbn07XG5cbnBwJDgucGFyc2VDbGFzc0ZpZWxkID0gZnVuY3Rpb24oZmllbGQpIHtcbiAgaWYgKGNoZWNrS2V5TmFtZShmaWVsZCwgXCJjb25zdHJ1Y3RvclwiKSkge1xuICAgIHRoaXMucmFpc2UoZmllbGQua2V5LnN0YXJ0LCBcIkNsYXNzZXMgY2FuJ3QgaGF2ZSBhIGZpZWxkIG5hbWVkICdjb25zdHJ1Y3RvcidcIik7XG4gIH0gZWxzZSBpZiAoZmllbGQuc3RhdGljICYmIGNoZWNrS2V5TmFtZShmaWVsZCwgXCJwcm90b3R5cGVcIikpIHtcbiAgICB0aGlzLnJhaXNlKGZpZWxkLmtleS5zdGFydCwgXCJDbGFzc2VzIGNhbid0IGhhdmUgYSBzdGF0aWMgZmllbGQgbmFtZWQgJ3Byb3RvdHlwZSdcIik7XG4gIH1cblxuICBpZiAodGhpcy5lYXQodHlwZXMkMS5lcSkpIHtcbiAgICAvLyBUbyByYWlzZSBTeW50YXhFcnJvciBpZiAnYXJndW1lbnRzJyBleGlzdHMgaW4gdGhlIGluaXRpYWxpemVyLlxuICAgIHZhciBzY29wZSA9IHRoaXMuY3VycmVudFRoaXNTY29wZSgpO1xuICAgIHZhciBpbkNsYXNzRmllbGRJbml0ID0gc2NvcGUuaW5DbGFzc0ZpZWxkSW5pdDtcbiAgICBzY29wZS5pbkNsYXNzRmllbGRJbml0ID0gdHJ1ZTtcbiAgICBmaWVsZC52YWx1ZSA9IHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICAgIHNjb3BlLmluQ2xhc3NGaWVsZEluaXQgPSBpbkNsYXNzRmllbGRJbml0O1xuICB9IGVsc2Uge1xuICAgIGZpZWxkLnZhbHVlID0gbnVsbDtcbiAgfVxuICB0aGlzLnNlbWljb2xvbigpO1xuXG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUoZmllbGQsIFwiUHJvcGVydHlEZWZpbml0aW9uXCIpXG59O1xuXG5wcCQ4LnBhcnNlQ2xhc3NTdGF0aWNCbG9jayA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgbm9kZS5ib2R5ID0gW107XG5cbiAgdmFyIG9sZExhYmVscyA9IHRoaXMubGFiZWxzO1xuICB0aGlzLmxhYmVscyA9IFtdO1xuICB0aGlzLmVudGVyU2NvcGUoU0NPUEVfQ0xBU1NfU1RBVElDX0JMT0NLIHwgU0NPUEVfU1VQRVIpO1xuICB3aGlsZSAodGhpcy50eXBlICE9PSB0eXBlcyQxLmJyYWNlUikge1xuICAgIHZhciBzdG10ID0gdGhpcy5wYXJzZVN0YXRlbWVudChudWxsKTtcbiAgICBub2RlLmJvZHkucHVzaChzdG10KTtcbiAgfVxuICB0aGlzLm5leHQoKTtcbiAgdGhpcy5leGl0U2NvcGUoKTtcbiAgdGhpcy5sYWJlbHMgPSBvbGRMYWJlbHM7XG5cbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlN0YXRpY0Jsb2NrXCIpXG59O1xuXG5wcCQ4LnBhcnNlQ2xhc3NJZCA9IGZ1bmN0aW9uKG5vZGUsIGlzU3RhdGVtZW50KSB7XG4gIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEubmFtZSkge1xuICAgIG5vZGUuaWQgPSB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICBpZiAoaXNTdGF0ZW1lbnQpXG4gICAgICB7IHRoaXMuY2hlY2tMVmFsU2ltcGxlKG5vZGUuaWQsIEJJTkRfTEVYSUNBTCwgZmFsc2UpOyB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzU3RhdGVtZW50ID09PSB0cnVlKVxuICAgICAgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgIG5vZGUuaWQgPSBudWxsO1xuICB9XG59O1xuXG5wcCQ4LnBhcnNlQ2xhc3NTdXBlciA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgbm9kZS5zdXBlckNsYXNzID0gdGhpcy5lYXQodHlwZXMkMS5fZXh0ZW5kcykgPyB0aGlzLnBhcnNlRXhwclN1YnNjcmlwdHMobnVsbCwgZmFsc2UpIDogbnVsbDtcbn07XG5cbnBwJDguZW50ZXJDbGFzc0JvZHkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGVsZW1lbnQgPSB7ZGVjbGFyZWQ6IE9iamVjdC5jcmVhdGUobnVsbCksIHVzZWQ6IFtdfTtcbiAgdGhpcy5wcml2YXRlTmFtZVN0YWNrLnB1c2goZWxlbWVudCk7XG4gIHJldHVybiBlbGVtZW50LmRlY2xhcmVkXG59O1xuXG5wcCQ4LmV4aXRDbGFzc0JvZHkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlZiA9IHRoaXMucHJpdmF0ZU5hbWVTdGFjay5wb3AoKTtcbiAgdmFyIGRlY2xhcmVkID0gcmVmLmRlY2xhcmVkO1xuICB2YXIgdXNlZCA9IHJlZi51c2VkO1xuICB2YXIgbGVuID0gdGhpcy5wcml2YXRlTmFtZVN0YWNrLmxlbmd0aDtcbiAgdmFyIHBhcmVudCA9IGxlbiA9PT0gMCA/IG51bGwgOiB0aGlzLnByaXZhdGVOYW1lU3RhY2tbbGVuIC0gMV07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdXNlZC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBpZCA9IHVzZWRbaV07XG4gICAgaWYgKCFoYXNPd24oZGVjbGFyZWQsIGlkLm5hbWUpKSB7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC51c2VkLnB1c2goaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGlkLnN0YXJ0LCAoXCJQcml2YXRlIGZpZWxkICcjXCIgKyAoaWQubmFtZSkgKyBcIicgbXVzdCBiZSBkZWNsYXJlZCBpbiBhbiBlbmNsb3NpbmcgY2xhc3NcIikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gaXNQcml2YXRlTmFtZUNvbmZsaWN0ZWQocHJpdmF0ZU5hbWVNYXAsIGVsZW1lbnQpIHtcbiAgdmFyIG5hbWUgPSBlbGVtZW50LmtleS5uYW1lO1xuICB2YXIgY3VyciA9IHByaXZhdGVOYW1lTWFwW25hbWVdO1xuXG4gIHZhciBuZXh0ID0gXCJ0cnVlXCI7XG4gIGlmIChlbGVtZW50LnR5cGUgPT09IFwiTWV0aG9kRGVmaW5pdGlvblwiICYmIChlbGVtZW50LmtpbmQgPT09IFwiZ2V0XCIgfHwgZWxlbWVudC5raW5kID09PSBcInNldFwiKSkge1xuICAgIG5leHQgPSAoZWxlbWVudC5zdGF0aWMgPyBcInNcIiA6IFwiaVwiKSArIGVsZW1lbnQua2luZDtcbiAgfVxuXG4gIC8vIGBjbGFzcyB7IGdldCAjYSgpe307IHN0YXRpYyBzZXQgI2EoXyl7fSB9YCBpcyBhbHNvIGNvbmZsaWN0LlxuICBpZiAoXG4gICAgY3VyciA9PT0gXCJpZ2V0XCIgJiYgbmV4dCA9PT0gXCJpc2V0XCIgfHxcbiAgICBjdXJyID09PSBcImlzZXRcIiAmJiBuZXh0ID09PSBcImlnZXRcIiB8fFxuICAgIGN1cnIgPT09IFwic2dldFwiICYmIG5leHQgPT09IFwic3NldFwiIHx8XG4gICAgY3VyciA9PT0gXCJzc2V0XCIgJiYgbmV4dCA9PT0gXCJzZ2V0XCJcbiAgKSB7XG4gICAgcHJpdmF0ZU5hbWVNYXBbbmFtZV0gPSBcInRydWVcIjtcbiAgICByZXR1cm4gZmFsc2VcbiAgfSBlbHNlIGlmICghY3Vycikge1xuICAgIHByaXZhdGVOYW1lTWFwW25hbWVdID0gbmV4dDtcbiAgICByZXR1cm4gZmFsc2VcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrS2V5TmFtZShub2RlLCBuYW1lKSB7XG4gIHZhciBjb21wdXRlZCA9IG5vZGUuY29tcHV0ZWQ7XG4gIHZhciBrZXkgPSBub2RlLmtleTtcbiAgcmV0dXJuICFjb21wdXRlZCAmJiAoXG4gICAga2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIGtleS5uYW1lID09PSBuYW1lIHx8XG4gICAga2V5LnR5cGUgPT09IFwiTGl0ZXJhbFwiICYmIGtleS52YWx1ZSA9PT0gbmFtZVxuICApXG59XG5cbi8vIFBhcnNlcyBtb2R1bGUgZXhwb3J0IGRlY2xhcmF0aW9uLlxuXG5wcCQ4LnBhcnNlRXhwb3J0ID0gZnVuY3Rpb24obm9kZSwgZXhwb3J0cykge1xuICB0aGlzLm5leHQoKTtcbiAgLy8gZXhwb3J0ICogZnJvbSAnLi4uJ1xuICBpZiAodGhpcy5lYXQodHlwZXMkMS5zdGFyKSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTEpIHtcbiAgICAgIGlmICh0aGlzLmVhdENvbnRleHR1YWwoXCJhc1wiKSkge1xuICAgICAgICBub2RlLmV4cG9ydGVkID0gdGhpcy5wYXJzZU1vZHVsZUV4cG9ydE5hbWUoKTtcbiAgICAgICAgdGhpcy5jaGVja0V4cG9ydChleHBvcnRzLCBub2RlLmV4cG9ydGVkLCB0aGlzLmxhc3RUb2tTdGFydCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmV4cG9ydGVkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5leHBlY3RDb250ZXh0dWFsKFwiZnJvbVwiKTtcbiAgICBpZiAodGhpcy50eXBlICE9PSB0eXBlcyQxLnN0cmluZykgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUV4cHJBdG9tKCk7XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIilcbiAgfVxuICBpZiAodGhpcy5lYXQodHlwZXMkMS5fZGVmYXVsdCkpIHsgLy8gZXhwb3J0IGRlZmF1bHQgLi4uXG4gICAgdGhpcy5jaGVja0V4cG9ydChleHBvcnRzLCBcImRlZmF1bHRcIiwgdGhpcy5sYXN0VG9rU3RhcnQpO1xuICAgIHZhciBpc0FzeW5jO1xuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEuX2Z1bmN0aW9uIHx8IChpc0FzeW5jID0gdGhpcy5pc0FzeW5jRnVuY3Rpb24oKSkpIHtcbiAgICAgIHZhciBmTm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIGlmIChpc0FzeW5jKSB7IHRoaXMubmV4dCgpOyB9XG4gICAgICBub2RlLmRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUZ1bmN0aW9uKGZOb2RlLCBGVU5DX1NUQVRFTUVOVCB8IEZVTkNfTlVMTEFCTEVfSUQsIGZhbHNlLCBpc0FzeW5jKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMkMS5fY2xhc3MpIHtcbiAgICAgIHZhciBjTm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICBub2RlLmRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUNsYXNzKGNOb2RlLCBcIm51bGxhYmxlSURcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICAgIHRoaXMuc2VtaWNvbG9uKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIilcbiAgfVxuICAvLyBleHBvcnQgdmFyfGNvbnN0fGxldHxmdW5jdGlvbnxjbGFzcyAuLi5cbiAgaWYgKHRoaXMuc2hvdWxkUGFyc2VFeHBvcnRTdGF0ZW1lbnQoKSkge1xuICAgIG5vZGUuZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlU3RhdGVtZW50KG51bGwpO1xuICAgIGlmIChub2RlLmRlY2xhcmF0aW9uLnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKVxuICAgICAgeyB0aGlzLmNoZWNrVmFyaWFibGVFeHBvcnQoZXhwb3J0cywgbm9kZS5kZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnMpOyB9XG4gICAgZWxzZVxuICAgICAgeyB0aGlzLmNoZWNrRXhwb3J0KGV4cG9ydHMsIG5vZGUuZGVjbGFyYXRpb24uaWQsIG5vZGUuZGVjbGFyYXRpb24uaWQuc3RhcnQpOyB9XG4gICAgbm9kZS5zcGVjaWZpZXJzID0gW107XG4gICAgbm9kZS5zb3VyY2UgPSBudWxsO1xuICB9IGVsc2UgeyAvLyBleHBvcnQgeyB4LCB5IGFzIHogfSBbZnJvbSAnLi4uJ11cbiAgICBub2RlLmRlY2xhcmF0aW9uID0gbnVsbDtcbiAgICBub2RlLnNwZWNpZmllcnMgPSB0aGlzLnBhcnNlRXhwb3J0U3BlY2lmaWVycyhleHBvcnRzKTtcbiAgICBpZiAodGhpcy5lYXRDb250ZXh0dWFsKFwiZnJvbVwiKSkge1xuICAgICAgaWYgKHRoaXMudHlwZSAhPT0gdHlwZXMkMS5zdHJpbmcpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICAgIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZUV4cHJBdG9tKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gbm9kZS5zcGVjaWZpZXJzOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAvLyBjaGVjayBmb3Iga2V5d29yZHMgdXNlZCBhcyBsb2NhbCBuYW1lc1xuICAgICAgICB2YXIgc3BlYyA9IGxpc3RbaV07XG5cbiAgICAgICAgdGhpcy5jaGVja1VucmVzZXJ2ZWQoc3BlYy5sb2NhbCk7XG4gICAgICAgIC8vIGNoZWNrIGlmIGV4cG9ydCBpcyBkZWZpbmVkXG4gICAgICAgIHRoaXMuY2hlY2tMb2NhbEV4cG9ydChzcGVjLmxvY2FsKTtcblxuICAgICAgICBpZiAoc3BlYy5sb2NhbC50eXBlID09PSBcIkxpdGVyYWxcIikge1xuICAgICAgICAgIHRoaXMucmFpc2Uoc3BlYy5sb2NhbC5zdGFydCwgXCJBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGV4cG9ydGVkIGJpbmRpbmcgd2l0aG91dCBgZnJvbWAuXCIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc291cmNlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zZW1pY29sb24oKTtcbiAgfVxuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiKVxufTtcblxucHAkOC5jaGVja0V4cG9ydCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIHBvcykge1xuICBpZiAoIWV4cG9ydHMpIHsgcmV0dXJuIH1cbiAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiKVxuICAgIHsgbmFtZSA9IG5hbWUudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgPyBuYW1lLm5hbWUgOiBuYW1lLnZhbHVlOyB9XG4gIGlmIChoYXNPd24oZXhwb3J0cywgbmFtZSkpXG4gICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUocG9zLCBcIkR1cGxpY2F0ZSBleHBvcnQgJ1wiICsgbmFtZSArIFwiJ1wiKTsgfVxuICBleHBvcnRzW25hbWVdID0gdHJ1ZTtcbn07XG5cbnBwJDguY2hlY2tQYXR0ZXJuRXhwb3J0ID0gZnVuY3Rpb24oZXhwb3J0cywgcGF0KSB7XG4gIHZhciB0eXBlID0gcGF0LnR5cGU7XG4gIGlmICh0eXBlID09PSBcIklkZW50aWZpZXJcIilcbiAgICB7IHRoaXMuY2hlY2tFeHBvcnQoZXhwb3J0cywgcGF0LCBwYXQuc3RhcnQpOyB9XG4gIGVsc2UgaWYgKHR5cGUgPT09IFwiT2JqZWN0UGF0dGVyblwiKVxuICAgIHsgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBwYXQucHJvcGVydGllczsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpXG4gICAgICB7XG4gICAgICAgIHZhciBwcm9wID0gbGlzdFtpXTtcblxuICAgICAgICB0aGlzLmNoZWNrUGF0dGVybkV4cG9ydChleHBvcnRzLCBwcm9wKTtcbiAgICAgIH0gfVxuICBlbHNlIGlmICh0eXBlID09PSBcIkFycmF5UGF0dGVyblwiKVxuICAgIHsgZm9yICh2YXIgaSQxID0gMCwgbGlzdCQxID0gcGF0LmVsZW1lbnRzOyBpJDEgPCBsaXN0JDEubGVuZ3RoOyBpJDEgKz0gMSkge1xuICAgICAgdmFyIGVsdCA9IGxpc3QkMVtpJDFdO1xuXG4gICAgICAgIGlmIChlbHQpIHsgdGhpcy5jaGVja1BhdHRlcm5FeHBvcnQoZXhwb3J0cywgZWx0KTsgfVxuICAgIH0gfVxuICBlbHNlIGlmICh0eXBlID09PSBcIlByb3BlcnR5XCIpXG4gICAgeyB0aGlzLmNoZWNrUGF0dGVybkV4cG9ydChleHBvcnRzLCBwYXQudmFsdWUpOyB9XG4gIGVsc2UgaWYgKHR5cGUgPT09IFwiQXNzaWdubWVudFBhdHRlcm5cIilcbiAgICB7IHRoaXMuY2hlY2tQYXR0ZXJuRXhwb3J0KGV4cG9ydHMsIHBhdC5sZWZ0KTsgfVxuICBlbHNlIGlmICh0eXBlID09PSBcIlJlc3RFbGVtZW50XCIpXG4gICAgeyB0aGlzLmNoZWNrUGF0dGVybkV4cG9ydChleHBvcnRzLCBwYXQuYXJndW1lbnQpOyB9XG4gIGVsc2UgaWYgKHR5cGUgPT09IFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIilcbiAgICB7IHRoaXMuY2hlY2tQYXR0ZXJuRXhwb3J0KGV4cG9ydHMsIHBhdC5leHByZXNzaW9uKTsgfVxufTtcblxucHAkOC5jaGVja1ZhcmlhYmxlRXhwb3J0ID0gZnVuY3Rpb24oZXhwb3J0cywgZGVjbHMpIHtcbiAgaWYgKCFleHBvcnRzKSB7IHJldHVybiB9XG4gIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gZGVjbHM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgIHtcbiAgICB2YXIgZGVjbCA9IGxpc3RbaV07XG5cbiAgICB0aGlzLmNoZWNrUGF0dGVybkV4cG9ydChleHBvcnRzLCBkZWNsLmlkKTtcbiAgfVxufTtcblxucHAkOC5zaG91bGRQYXJzZUV4cG9ydFN0YXRlbWVudCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy50eXBlLmtleXdvcmQgPT09IFwidmFyXCIgfHxcbiAgICB0aGlzLnR5cGUua2V5d29yZCA9PT0gXCJjb25zdFwiIHx8XG4gICAgdGhpcy50eXBlLmtleXdvcmQgPT09IFwiY2xhc3NcIiB8fFxuICAgIHRoaXMudHlwZS5rZXl3b3JkID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0aGlzLmlzTGV0KCkgfHxcbiAgICB0aGlzLmlzQXN5bmNGdW5jdGlvbigpXG59O1xuXG4vLyBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGUgZXhwb3J0cy5cblxucHAkOC5wYXJzZUV4cG9ydFNwZWNpZmllcnMgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gIHZhciBub2RlcyA9IFtdLCBmaXJzdCA9IHRydWU7XG4gIC8vIGV4cG9ydCB7IHgsIHkgYXMgeiB9IFtmcm9tICcuLi4nXVxuICB0aGlzLmV4cGVjdCh0eXBlcyQxLmJyYWNlTCk7XG4gIHdoaWxlICghdGhpcy5lYXQodHlwZXMkMS5icmFjZVIpKSB7XG4gICAgaWYgKCFmaXJzdCkge1xuICAgICAgdGhpcy5leHBlY3QodHlwZXMkMS5jb21tYSk7XG4gICAgICBpZiAodGhpcy5hZnRlclRyYWlsaW5nQ29tbWEodHlwZXMkMS5icmFjZVIpKSB7IGJyZWFrIH1cbiAgICB9IGVsc2UgeyBmaXJzdCA9IGZhbHNlOyB9XG5cbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgbm9kZS5sb2NhbCA9IHRoaXMucGFyc2VNb2R1bGVFeHBvcnROYW1lKCk7XG4gICAgbm9kZS5leHBvcnRlZCA9IHRoaXMuZWF0Q29udGV4dHVhbChcImFzXCIpID8gdGhpcy5wYXJzZU1vZHVsZUV4cG9ydE5hbWUoKSA6IG5vZGUubG9jYWw7XG4gICAgdGhpcy5jaGVja0V4cG9ydChcbiAgICAgIGV4cG9ydHMsXG4gICAgICBub2RlLmV4cG9ydGVkLFxuICAgICAgbm9kZS5leHBvcnRlZC5zdGFydFxuICAgICk7XG4gICAgbm9kZXMucHVzaCh0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJFeHBvcnRTcGVjaWZpZXJcIikpO1xuICB9XG4gIHJldHVybiBub2Rlc1xufTtcblxuLy8gUGFyc2VzIGltcG9ydCBkZWNsYXJhdGlvbi5cblxucHAkOC5wYXJzZUltcG9ydCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIC8vIGltcG9ydCAnLi4uJ1xuICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLnN0cmluZykge1xuICAgIG5vZGUuc3BlY2lmaWVycyA9IGVtcHR5JDE7XG4gICAgbm9kZS5zb3VyY2UgPSB0aGlzLnBhcnNlRXhwckF0b20oKTtcbiAgfSBlbHNlIHtcbiAgICBub2RlLnNwZWNpZmllcnMgPSB0aGlzLnBhcnNlSW1wb3J0U3BlY2lmaWVycygpO1xuICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbChcImZyb21cIik7XG4gICAgbm9kZS5zb3VyY2UgPSB0aGlzLnR5cGUgPT09IHR5cGVzJDEuc3RyaW5nID8gdGhpcy5wYXJzZUV4cHJBdG9tKCkgOiB0aGlzLnVuZXhwZWN0ZWQoKTtcbiAgfVxuICB0aGlzLnNlbWljb2xvbigpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSW1wb3J0RGVjbGFyYXRpb25cIilcbn07XG5cbi8vIFBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSBpbXBvcnRzLlxuXG5wcCQ4LnBhcnNlSW1wb3J0U3BlY2lmaWVycyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbm9kZXMgPSBbXSwgZmlyc3QgPSB0cnVlO1xuICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLm5hbWUpIHtcbiAgICAvLyBpbXBvcnQgZGVmYXVsdE9iaiwgeyB4LCB5IGFzIHogfSBmcm9tICcuLi4nXG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIG5vZGUubG9jYWwgPSB0aGlzLnBhcnNlSWRlbnQoKTtcbiAgICB0aGlzLmNoZWNrTFZhbFNpbXBsZShub2RlLmxvY2FsLCBCSU5EX0xFWElDQUwpO1xuICAgIG5vZGVzLnB1c2godGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKSk7XG4gICAgaWYgKCF0aGlzLmVhdCh0eXBlcyQxLmNvbW1hKSkgeyByZXR1cm4gbm9kZXMgfVxuICB9XG4gIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEuc3Rhcikge1xuICAgIHZhciBub2RlJDEgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHRoaXMuZXhwZWN0Q29udGV4dHVhbChcImFzXCIpO1xuICAgIG5vZGUkMS5sb2NhbCA9IHRoaXMucGFyc2VJZGVudCgpO1xuICAgIHRoaXMuY2hlY2tMVmFsU2ltcGxlKG5vZGUkMS5sb2NhbCwgQklORF9MRVhJQ0FMKTtcbiAgICBub2Rlcy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlJDEsIFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpKTtcbiAgICByZXR1cm4gbm9kZXNcbiAgfVxuICB0aGlzLmV4cGVjdCh0eXBlcyQxLmJyYWNlTCk7XG4gIHdoaWxlICghdGhpcy5lYXQodHlwZXMkMS5icmFjZVIpKSB7XG4gICAgaWYgKCFmaXJzdCkge1xuICAgICAgdGhpcy5leHBlY3QodHlwZXMkMS5jb21tYSk7XG4gICAgICBpZiAodGhpcy5hZnRlclRyYWlsaW5nQ29tbWEodHlwZXMkMS5icmFjZVIpKSB7IGJyZWFrIH1cbiAgICB9IGVsc2UgeyBmaXJzdCA9IGZhbHNlOyB9XG5cbiAgICB2YXIgbm9kZSQyID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICBub2RlJDIuaW1wb3J0ZWQgPSB0aGlzLnBhcnNlTW9kdWxlRXhwb3J0TmFtZSgpO1xuICAgIGlmICh0aGlzLmVhdENvbnRleHR1YWwoXCJhc1wiKSkge1xuICAgICAgbm9kZSQyLmxvY2FsID0gdGhpcy5wYXJzZUlkZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hlY2tVbnJlc2VydmVkKG5vZGUkMi5pbXBvcnRlZCk7XG4gICAgICBub2RlJDIubG9jYWwgPSBub2RlJDIuaW1wb3J0ZWQ7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tMVmFsU2ltcGxlKG5vZGUkMi5sb2NhbCwgQklORF9MRVhJQ0FMKTtcbiAgICBub2Rlcy5wdXNoKHRoaXMuZmluaXNoTm9kZShub2RlJDIsIFwiSW1wb3J0U3BlY2lmaWVyXCIpKTtcbiAgfVxuICByZXR1cm4gbm9kZXNcbn07XG5cbnBwJDgucGFyc2VNb2R1bGVFeHBvcnROYW1lID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTMgJiYgdGhpcy50eXBlID09PSB0eXBlcyQxLnN0cmluZykge1xuICAgIHZhciBzdHJpbmdMaXRlcmFsID0gdGhpcy5wYXJzZUxpdGVyYWwodGhpcy52YWx1ZSk7XG4gICAgaWYgKGxvbmVTdXJyb2dhdGUudGVzdChzdHJpbmdMaXRlcmFsLnZhbHVlKSkge1xuICAgICAgdGhpcy5yYWlzZShzdHJpbmdMaXRlcmFsLnN0YXJ0LCBcIkFuIGV4cG9ydCBuYW1lIGNhbm5vdCBpbmNsdWRlIGEgbG9uZSBzdXJyb2dhdGUuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nTGl0ZXJhbFxuICB9XG4gIHJldHVybiB0aGlzLnBhcnNlSWRlbnQodHJ1ZSlcbn07XG5cbi8vIFNldCBgRXhwcmVzc2lvblN0YXRlbWVudCNkaXJlY3RpdmVgIHByb3BlcnR5IGZvciBkaXJlY3RpdmUgcHJvbG9ndWVzLlxucHAkOC5hZGFwdERpcmVjdGl2ZVByb2xvZ3VlID0gZnVuY3Rpb24oc3RhdGVtZW50cykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlbWVudHMubGVuZ3RoICYmIHRoaXMuaXNEaXJlY3RpdmVDYW5kaWRhdGUoc3RhdGVtZW50c1tpXSk7ICsraSkge1xuICAgIHN0YXRlbWVudHNbaV0uZGlyZWN0aXZlID0gc3RhdGVtZW50c1tpXS5leHByZXNzaW9uLnJhdy5zbGljZSgxLCAtMSk7XG4gIH1cbn07XG5wcCQ4LmlzRGlyZWN0aXZlQ2FuZGlkYXRlID0gZnVuY3Rpb24oc3RhdGVtZW50KSB7XG4gIHJldHVybiAoXG4gICAgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDUgJiZcbiAgICBzdGF0ZW1lbnQudHlwZSA9PT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgJiZcbiAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbi50eXBlID09PSBcIkxpdGVyYWxcIiAmJlxuICAgIHR5cGVvZiBzdGF0ZW1lbnQuZXhwcmVzc2lvbi52YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIC8vIFJlamVjdCBwYXJlbnRoZXNpemVkIHN0cmluZ3MuXG4gICAgKHRoaXMuaW5wdXRbc3RhdGVtZW50LnN0YXJ0XSA9PT0gXCJcXFwiXCIgfHwgdGhpcy5pbnB1dFtzdGF0ZW1lbnQuc3RhcnRdID09PSBcIidcIilcbiAgKVxufTtcblxudmFyIHBwJDcgPSBQYXJzZXIkMS5wcm90b3R5cGU7XG5cbi8vIENvbnZlcnQgZXhpc3RpbmcgZXhwcmVzc2lvbiBhdG9tIHRvIGFzc2lnbmFibGUgcGF0dGVyblxuLy8gaWYgcG9zc2libGUuXG5cbnBwJDcudG9Bc3NpZ25hYmxlID0gZnVuY3Rpb24obm9kZSwgaXNCaW5kaW5nLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiBub2RlKSB7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwiSWRlbnRpZmllclwiOlxuICAgICAgaWYgKHRoaXMuaW5Bc3luYyAmJiBub2RlLm5hbWUgPT09IFwiYXdhaXRcIilcbiAgICAgICAgeyB0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIFwiQ2Fubm90IHVzZSAnYXdhaXQnIGFzIGlkZW50aWZpZXIgaW5zaWRlIGFuIGFzeW5jIGZ1bmN0aW9uXCIpOyB9XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIk9iamVjdFBhdHRlcm5cIjpcbiAgICBjYXNlIFwiQXJyYXlQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCI6XG4gICAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIk9iamVjdEV4cHJlc3Npb25cIjpcbiAgICAgIG5vZGUudHlwZSA9IFwiT2JqZWN0UGF0dGVyblwiO1xuICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHsgdGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7IH1cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gbm9kZS5wcm9wZXJ0aWVzOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgcHJvcCA9IGxpc3RbaV07XG5cbiAgICAgIHRoaXMudG9Bc3NpZ25hYmxlKHByb3AsIGlzQmluZGluZyk7XG4gICAgICAgIC8vIEVhcmx5IGVycm9yOlxuICAgICAgICAvLyAgIEFzc2lnbm1lbnRSZXN0UHJvcGVydHlbWWllbGQsIEF3YWl0XSA6XG4gICAgICAgIC8vICAgICBgLi4uYCBEZXN0cnVjdHVyaW5nQXNzaWdubWVudFRhcmdldFtZaWVsZCwgQXdhaXRdXG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgSXQgaXMgYSBTeW50YXggRXJyb3IgaWYgfERlc3RydWN0dXJpbmdBc3NpZ25tZW50VGFyZ2V0fCBpcyBhbiB8QXJyYXlMaXRlcmFsfCBvciBhbiB8T2JqZWN0TGl0ZXJhbHwuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9wLnR5cGUgPT09IFwiUmVzdEVsZW1lbnRcIiAmJlxuICAgICAgICAgIChwcm9wLmFyZ3VtZW50LnR5cGUgPT09IFwiQXJyYXlQYXR0ZXJuXCIgfHwgcHJvcC5hcmd1bWVudC50eXBlID09PSBcIk9iamVjdFBhdHRlcm5cIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZShwcm9wLmFyZ3VtZW50LnN0YXJ0LCBcIlVuZXhwZWN0ZWQgdG9rZW5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiUHJvcGVydHlcIjpcbiAgICAgIC8vIEFzc2lnbm1lbnRQcm9wZXJ0eSBoYXMgdHlwZSA9PT0gXCJQcm9wZXJ0eVwiXG4gICAgICBpZiAobm9kZS5raW5kICE9PSBcImluaXRcIikgeyB0aGlzLnJhaXNlKG5vZGUua2V5LnN0YXJ0LCBcIk9iamVjdCBwYXR0ZXJuIGNhbid0IGNvbnRhaW4gZ2V0dGVyIG9yIHNldHRlclwiKTsgfVxuICAgICAgdGhpcy50b0Fzc2lnbmFibGUobm9kZS52YWx1ZSwgaXNCaW5kaW5nKTtcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiQXJyYXlFeHByZXNzaW9uXCI6XG4gICAgICBub2RlLnR5cGUgPSBcIkFycmF5UGF0dGVyblwiO1xuICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHsgdGhpcy5jaGVja1BhdHRlcm5FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7IH1cbiAgICAgIHRoaXMudG9Bc3NpZ25hYmxlTGlzdChub2RlLmVsZW1lbnRzLCBpc0JpbmRpbmcpO1xuICAgICAgYnJlYWtcblxuICAgIGNhc2UgXCJTcHJlYWRFbGVtZW50XCI6XG4gICAgICBub2RlLnR5cGUgPSBcIlJlc3RFbGVtZW50XCI7XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZShub2RlLmFyZ3VtZW50LCBpc0JpbmRpbmcpO1xuICAgICAgaWYgKG5vZGUuYXJndW1lbnQudHlwZSA9PT0gXCJBc3NpZ25tZW50UGF0dGVyblwiKVxuICAgICAgICB7IHRoaXMucmFpc2Uobm9kZS5hcmd1bWVudC5zdGFydCwgXCJSZXN0IGVsZW1lbnRzIGNhbm5vdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZVwiKTsgfVxuICAgICAgYnJlYWtcblxuICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgaWYgKG5vZGUub3BlcmF0b3IgIT09IFwiPVwiKSB7IHRoaXMucmFpc2Uobm9kZS5sZWZ0LmVuZCwgXCJPbmx5ICc9JyBvcGVyYXRvciBjYW4gYmUgdXNlZCBmb3Igc3BlY2lmeWluZyBkZWZhdWx0IHZhbHVlLlwiKTsgfVxuICAgICAgbm9kZS50eXBlID0gXCJBc3NpZ25tZW50UGF0dGVyblwiO1xuICAgICAgZGVsZXRlIG5vZGUub3BlcmF0b3I7XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZShub2RlLmxlZnQsIGlzQmluZGluZyk7XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXCI6XG4gICAgICB0aGlzLnRvQXNzaWduYWJsZShub2RlLmV4cHJlc3Npb24sIGlzQmluZGluZywgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgICBicmVha1xuXG4gICAgY2FzZSBcIkNoYWluRXhwcmVzc2lvblwiOlxuICAgICAgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuc3RhcnQsIFwiT3B0aW9uYWwgY2hhaW5pbmcgY2Fubm90IGFwcGVhciBpbiBsZWZ0LWhhbmQgc2lkZVwiKTtcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgaWYgKCFpc0JpbmRpbmcpIHsgYnJlYWsgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMucmFpc2Uobm9kZS5zdGFydCwgXCJBc3NpZ25pbmcgdG8gcnZhbHVlXCIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7IHRoaXMuY2hlY2tQYXR0ZXJuRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHRydWUpOyB9XG4gIHJldHVybiBub2RlXG59O1xuXG4vLyBDb252ZXJ0IGxpc3Qgb2YgZXhwcmVzc2lvbiBhdG9tcyB0byBiaW5kaW5nIGxpc3QuXG5cbnBwJDcudG9Bc3NpZ25hYmxlTGlzdCA9IGZ1bmN0aW9uKGV4cHJMaXN0LCBpc0JpbmRpbmcpIHtcbiAgdmFyIGVuZCA9IGV4cHJMaXN0Lmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmQ7IGkrKykge1xuICAgIHZhciBlbHQgPSBleHByTGlzdFtpXTtcbiAgICBpZiAoZWx0KSB7IHRoaXMudG9Bc3NpZ25hYmxlKGVsdCwgaXNCaW5kaW5nKTsgfVxuICB9XG4gIGlmIChlbmQpIHtcbiAgICB2YXIgbGFzdCA9IGV4cHJMaXN0W2VuZCAtIDFdO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPT09IDYgJiYgaXNCaW5kaW5nICYmIGxhc3QgJiYgbGFzdC50eXBlID09PSBcIlJlc3RFbGVtZW50XCIgJiYgbGFzdC5hcmd1bWVudC50eXBlICE9PSBcIklkZW50aWZpZXJcIilcbiAgICAgIHsgdGhpcy51bmV4cGVjdGVkKGxhc3QuYXJndW1lbnQuc3RhcnQpOyB9XG4gIH1cbiAgcmV0dXJuIGV4cHJMaXN0XG59O1xuXG4vLyBQYXJzZXMgc3ByZWFkIGVsZW1lbnQuXG5cbnBwJDcucGFyc2VTcHJlYWQgPSBmdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgdGhpcy5uZXh0KCk7XG4gIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiU3ByZWFkRWxlbWVudFwiKVxufTtcblxucHAkNy5wYXJzZVJlc3RCaW5kaW5nID0gZnVuY3Rpb24oKSB7XG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgdGhpcy5uZXh0KCk7XG5cbiAgLy8gUmVzdEVsZW1lbnQgaW5zaWRlIG9mIGEgZnVuY3Rpb24gcGFyYW1ldGVyIG11c3QgYmUgYW4gaWRlbnRpZmllclxuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID09PSA2ICYmIHRoaXMudHlwZSAhPT0gdHlwZXMkMS5uYW1lKVxuICAgIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cblxuICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZUJpbmRpbmdBdG9tKCk7XG5cbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlJlc3RFbGVtZW50XCIpXG59O1xuXG4vLyBQYXJzZXMgbHZhbHVlIChhc3NpZ25hYmxlKSBhdG9tLlxuXG5wcCQ3LnBhcnNlQmluZGluZ0F0b20gPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KSB7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICBjYXNlIHR5cGVzJDEuYnJhY2tldEw6XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICAgIG5vZGUuZWxlbWVudHMgPSB0aGlzLnBhcnNlQmluZGluZ0xpc3QodHlwZXMkMS5icmFja2V0UiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXJyYXlQYXR0ZXJuXCIpXG5cbiAgICBjYXNlIHR5cGVzJDEuYnJhY2VMOlxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VPYmoodHJ1ZSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMucGFyc2VJZGVudCgpXG59O1xuXG5wcCQ3LnBhcnNlQmluZGluZ0xpc3QgPSBmdW5jdGlvbihjbG9zZSwgYWxsb3dFbXB0eSwgYWxsb3dUcmFpbGluZ0NvbW1hKSB7XG4gIHZhciBlbHRzID0gW10sIGZpcnN0ID0gdHJ1ZTtcbiAgd2hpbGUgKCF0aGlzLmVhdChjbG9zZSkpIHtcbiAgICBpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTsgfVxuICAgIGVsc2UgeyB0aGlzLmV4cGVjdCh0eXBlcyQxLmNvbW1hKTsgfVxuICAgIGlmIChhbGxvd0VtcHR5ICYmIHRoaXMudHlwZSA9PT0gdHlwZXMkMS5jb21tYSkge1xuICAgICAgZWx0cy5wdXNoKG51bGwpO1xuICAgIH0gZWxzZSBpZiAoYWxsb3dUcmFpbGluZ0NvbW1hICYmIHRoaXMuYWZ0ZXJUcmFpbGluZ0NvbW1hKGNsb3NlKSkge1xuICAgICAgYnJlYWtcbiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMkMS5lbGxpcHNpcykge1xuICAgICAgdmFyIHJlc3QgPSB0aGlzLnBhcnNlUmVzdEJpbmRpbmcoKTtcbiAgICAgIHRoaXMucGFyc2VCaW5kaW5nTGlzdEl0ZW0ocmVzdCk7XG4gICAgICBlbHRzLnB1c2gocmVzdCk7XG4gICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLmNvbW1hKSB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCJDb21tYSBpcyBub3QgcGVybWl0dGVkIGFmdGVyIHRoZSByZXN0IGVsZW1lbnRcIik7IH1cbiAgICAgIHRoaXMuZXhwZWN0KGNsb3NlKTtcbiAgICAgIGJyZWFrXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlbGVtID0gdGhpcy5wYXJzZU1heWJlRGVmYXVsdCh0aGlzLnN0YXJ0LCB0aGlzLnN0YXJ0TG9jKTtcbiAgICAgIHRoaXMucGFyc2VCaW5kaW5nTGlzdEl0ZW0oZWxlbSk7XG4gICAgICBlbHRzLnB1c2goZWxlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbHRzXG59O1xuXG5wcCQ3LnBhcnNlQmluZGluZ0xpc3RJdGVtID0gZnVuY3Rpb24ocGFyYW0pIHtcbiAgcmV0dXJuIHBhcmFtXG59O1xuXG4vLyBQYXJzZXMgYXNzaWdubWVudCBwYXR0ZXJuIGFyb3VuZCBnaXZlbiBhdG9tIGlmIHBvc3NpYmxlLlxuXG5wcCQ3LnBhcnNlTWF5YmVEZWZhdWx0ID0gZnVuY3Rpb24oc3RhcnRQb3MsIHN0YXJ0TG9jLCBsZWZ0KSB7XG4gIGxlZnQgPSBsZWZ0IHx8IHRoaXMucGFyc2VCaW5kaW5nQXRvbSgpO1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgNiB8fCAhdGhpcy5lYXQodHlwZXMkMS5lcSkpIHsgcmV0dXJuIGxlZnQgfVxuICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgbm9kZS5sZWZ0ID0gbGVmdDtcbiAgbm9kZS5yaWdodCA9IHRoaXMucGFyc2VNYXliZUFzc2lnbigpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXNzaWdubWVudFBhdHRlcm5cIilcbn07XG5cbi8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGFsbCB2ZXJpZnkgdGhhdCBhIG5vZGUgaXMgYW4gbHZhbHVlIFx1MjAxNFxuLy8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIGJvdW5kLCBvciBhc3NpZ25lZCB0by4gSW4gb3JkZXIgdG8gZG8gc28sIHRoZXkgcGVyZm9ybVxuLy8gYSB2YXJpZXR5IG9mIGNoZWNrczpcbi8vXG4vLyAtIENoZWNrIHRoYXQgbm9uZSBvZiB0aGUgYm91bmQvYXNzaWduZWQtdG8gaWRlbnRpZmllcnMgYXJlIHJlc2VydmVkIHdvcmRzLlxuLy8gLSBSZWNvcmQgbmFtZSBkZWNsYXJhdGlvbnMgZm9yIGJpbmRpbmdzIGluIHRoZSBhcHByb3ByaWF0ZSBzY29wZS5cbi8vIC0gQ2hlY2sgZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzLCBpZiBjaGVja0NsYXNoZXMgaXMgc2V0LlxuLy9cbi8vIElmIGEgY29tcGxleCBiaW5kaW5nIHBhdHRlcm4gaXMgZW5jb3VudGVyZWQgKGUuZy4sIG9iamVjdCBhbmQgYXJyYXlcbi8vIGRlc3RydWN0dXJpbmcpLCB0aGUgZW50aXJlIHBhdHRlcm4gaXMgcmVjdXJzaXZlbHkgY2hlY2tlZC5cbi8vXG4vLyBUaGVyZSBhcmUgdGhyZWUgdmVyc2lvbnMgb2YgY2hlY2tMVmFsKigpIGFwcHJvcHJpYXRlIGZvciBkaWZmZXJlbnRcbi8vIGNpcmN1bXN0YW5jZXM6XG4vL1xuLy8gLSBjaGVja0xWYWxTaW1wbGUoKSBzaGFsbCBiZSB1c2VkIGlmIHRoZSBzeW50YWN0aWMgY29uc3RydWN0IHN1cHBvcnRzXG4vLyAgIG5vdGhpbmcgb3RoZXIgdGhhbiBpZGVudGlmaWVycyBhbmQgbWVtYmVyIGV4cHJlc3Npb25zLiBQYXJlbnRoZXNpemVkXG4vLyAgIGV4cHJlc3Npb25zIGFyZSBhbHNvIGNvcnJlY3RseSBoYW5kbGVkLiBUaGlzIGlzIGdlbmVyYWxseSBhcHByb3ByaWF0ZSBmb3Jcbi8vICAgY29uc3RydWN0cyBmb3Igd2hpY2ggdGhlIHNwZWMgc2F5c1xuLy9cbi8vICAgPiBJdCBpcyBhIFN5bnRheCBFcnJvciBpZiBBc3NpZ25tZW50VGFyZ2V0VHlwZSBvZiBbdGhlIHByb2R1Y3Rpb25dIGlzIG5vdFxuLy8gICA+IHNpbXBsZS5cbi8vXG4vLyAgIEl0IGlzIGFsc28gYXBwcm9wcmlhdGUgZm9yIGNoZWNraW5nIGlmIGFuIGlkZW50aWZpZXIgaXMgdmFsaWQgYW5kIG5vdFxuLy8gICBkZWZpbmVkIGVsc2V3aGVyZSwgbGlrZSBpbXBvcnQgZGVjbGFyYXRpb25zIG9yIGZ1bmN0aW9uL2NsYXNzIGlkZW50aWZpZXJzLlxuLy9cbi8vICAgRXhhbXBsZXMgd2hlcmUgdGhpcyBpcyB1c2VkIGluY2x1ZGU6XG4vLyAgICAgYSArPSBcdTIwMjY7XG4vLyAgICAgaW1wb3J0IGEgZnJvbSAnXHUyMDI2Jztcbi8vICAgd2hlcmUgYSBpcyB0aGUgbm9kZSB0byBiZSBjaGVja2VkLlxuLy9cbi8vIC0gY2hlY2tMVmFsUGF0dGVybigpIHNoYWxsIGJlIHVzZWQgaWYgdGhlIHN5bnRhY3RpYyBjb25zdHJ1Y3Qgc3VwcG9ydHNcbi8vICAgYW55dGhpbmcgY2hlY2tMVmFsU2ltcGxlKCkgc3VwcG9ydHMsIGFzIHdlbGwgYXMgb2JqZWN0IGFuZCBhcnJheVxuLy8gICBkZXN0cnVjdHVyaW5nIHBhdHRlcm5zLiBUaGlzIGlzIGdlbmVyYWxseSBhcHByb3ByaWF0ZSBmb3IgY29uc3RydWN0cyBmb3Jcbi8vICAgd2hpY2ggdGhlIHNwZWMgc2F5c1xuLy9cbi8vICAgPiBJdCBpcyBhIFN5bnRheCBFcnJvciBpZiBbdGhlIHByb2R1Y3Rpb25dIGlzIG5laXRoZXIgYW4gT2JqZWN0TGl0ZXJhbCBub3Jcbi8vICAgPiBhbiBBcnJheUxpdGVyYWwgYW5kIEFzc2lnbm1lbnRUYXJnZXRUeXBlIG9mIFt0aGUgcHJvZHVjdGlvbl0gaXMgbm90XG4vLyAgID4gc2ltcGxlLlxuLy9cbi8vICAgRXhhbXBsZXMgd2hlcmUgdGhpcyBpcyB1c2VkIGluY2x1ZGU6XG4vLyAgICAgKGEgPSBcdTIwMjYpO1xuLy8gICAgIGNvbnN0IGEgPSBcdTIwMjY7XG4vLyAgICAgdHJ5IHsgXHUyMDI2IH0gY2F0Y2ggKGEpIHsgXHUyMDI2IH1cbi8vICAgd2hlcmUgYSBpcyB0aGUgbm9kZSB0byBiZSBjaGVja2VkLlxuLy9cbi8vIC0gY2hlY2tMVmFsSW5uZXJQYXR0ZXJuKCkgc2hhbGwgYmUgdXNlZCBpZiB0aGUgc3ludGFjdGljIGNvbnN0cnVjdCBzdXBwb3J0c1xuLy8gICBhbnl0aGluZyBjaGVja0xWYWxQYXR0ZXJuKCkgc3VwcG9ydHMsIGFzIHdlbGwgYXMgZGVmYXVsdCBhc3NpZ25tZW50XG4vLyAgIHBhdHRlcm5zLCByZXN0IGVsZW1lbnRzLCBhbmQgb3RoZXIgY29uc3RydWN0cyB0aGF0IG1heSBhcHBlYXIgd2l0aGluIGFuXG4vLyAgIG9iamVjdCBvciBhcnJheSBkZXN0cnVjdHVyaW5nIHBhdHRlcm4uXG4vL1xuLy8gICBBcyBhIHNwZWNpYWwgY2FzZSwgZnVuY3Rpb24gcGFyYW1ldGVycyBhbHNvIHVzZSBjaGVja0xWYWxJbm5lclBhdHRlcm4oKSxcbi8vICAgYXMgdGhleSBhbHNvIHN1cHBvcnQgZGVmYXVsdHMgYW5kIHJlc3QgY29uc3RydWN0cy5cbi8vXG4vLyBUaGVzZSBmdW5jdGlvbnMgZGVsaWJlcmF0ZWx5IHN1cHBvcnQgYm90aCBhc3NpZ25tZW50IGFuZCBiaW5kaW5nIGNvbnN0cnVjdHMsXG4vLyBhcyB0aGUgbG9naWMgZm9yIGJvdGggaXMgZXhjZWVkaW5nbHkgc2ltaWxhci4gSWYgdGhlIG5vZGUgaXMgdGhlIHRhcmdldCBvZlxuLy8gYW4gYXNzaWdubWVudCwgdGhlbiBiaW5kaW5nVHlwZSBzaG91bGQgYmUgc2V0IHRvIEJJTkRfTk9ORS4gT3RoZXJ3aXNlLCBpdFxuLy8gc2hvdWxkIGJlIHNldCB0byB0aGUgYXBwcm9wcmlhdGUgQklORF8qIGNvbnN0YW50LCBsaWtlIEJJTkRfVkFSIG9yXG4vLyBCSU5EX0xFWElDQUwuXG4vL1xuLy8gSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEgbm9uLUJJTkRfTk9ORSBiaW5kaW5nVHlwZSwgdGhlblxuLy8gYWRkaXRpb25hbGx5IGEgY2hlY2tDbGFzaGVzIG9iamVjdCBtYXkgYmUgc3BlY2lmaWVkIHRvIGFsbG93IGNoZWNraW5nIGZvclxuLy8gZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzLiBjaGVja0NsYXNoZXMgaXMgaWdub3JlZCBpZiB0aGUgcHJvdmlkZWQgY29uc3RydWN0XG4vLyBpcyBhbiBhc3NpZ25tZW50IChpLmUuLCBiaW5kaW5nVHlwZSBpcyBCSU5EX05PTkUpLlxuXG5wcCQ3LmNoZWNrTFZhbFNpbXBsZSA9IGZ1bmN0aW9uKGV4cHIsIGJpbmRpbmdUeXBlLCBjaGVja0NsYXNoZXMpIHtcbiAgaWYgKCBiaW5kaW5nVHlwZSA9PT0gdm9pZCAwICkgYmluZGluZ1R5cGUgPSBCSU5EX05PTkU7XG5cbiAgdmFyIGlzQmluZCA9IGJpbmRpbmdUeXBlICE9PSBCSU5EX05PTkU7XG5cbiAgc3dpdGNoIChleHByLnR5cGUpIHtcbiAgY2FzZSBcIklkZW50aWZpZXJcIjpcbiAgICBpZiAodGhpcy5zdHJpY3QgJiYgdGhpcy5yZXNlcnZlZFdvcmRzU3RyaWN0QmluZC50ZXN0KGV4cHIubmFtZSkpXG4gICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCAoaXNCaW5kID8gXCJCaW5kaW5nIFwiIDogXCJBc3NpZ25pbmcgdG8gXCIpICsgZXhwci5uYW1lICsgXCIgaW4gc3RyaWN0IG1vZGVcIik7IH1cbiAgICBpZiAoaXNCaW5kKSB7XG4gICAgICBpZiAoYmluZGluZ1R5cGUgPT09IEJJTkRfTEVYSUNBTCAmJiBleHByLm5hbWUgPT09IFwibGV0XCIpXG4gICAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGV4cHIuc3RhcnQsIFwibGV0IGlzIGRpc2FsbG93ZWQgYXMgYSBsZXhpY2FsbHkgYm91bmQgbmFtZVwiKTsgfVxuICAgICAgaWYgKGNoZWNrQ2xhc2hlcykge1xuICAgICAgICBpZiAoaGFzT3duKGNoZWNrQ2xhc2hlcywgZXhwci5uYW1lKSlcbiAgICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCBcIkFyZ3VtZW50IG5hbWUgY2xhc2hcIik7IH1cbiAgICAgICAgY2hlY2tDbGFzaGVzW2V4cHIubmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGJpbmRpbmdUeXBlICE9PSBCSU5EX09VVFNJREUpIHsgdGhpcy5kZWNsYXJlTmFtZShleHByLm5hbWUsIGJpbmRpbmdUeXBlLCBleHByLnN0YXJ0KTsgfVxuICAgIH1cbiAgICBicmVha1xuXG4gIGNhc2UgXCJDaGFpbkV4cHJlc3Npb25cIjpcbiAgICB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoZXhwci5zdGFydCwgXCJPcHRpb25hbCBjaGFpbmluZyBjYW5ub3QgYXBwZWFyIGluIGxlZnQtaGFuZCBzaWRlXCIpO1xuICAgIGJyZWFrXG5cbiAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICBpZiAoaXNCaW5kKSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShleHByLnN0YXJ0LCBcIkJpbmRpbmcgbWVtYmVyIGV4cHJlc3Npb25cIik7IH1cbiAgICBicmVha1xuXG4gIGNhc2UgXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiOlxuICAgIGlmIChpc0JpbmQpIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGV4cHIuc3RhcnQsIFwiQmluZGluZyBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25cIik7IH1cbiAgICByZXR1cm4gdGhpcy5jaGVja0xWYWxTaW1wbGUoZXhwci5leHByZXNzaW9uLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKVxuXG4gIGRlZmF1bHQ6XG4gICAgdGhpcy5yYWlzZShleHByLnN0YXJ0LCAoaXNCaW5kID8gXCJCaW5kaW5nXCIgOiBcIkFzc2lnbmluZyB0b1wiKSArIFwiIHJ2YWx1ZVwiKTtcbiAgfVxufTtcblxucHAkNy5jaGVja0xWYWxQYXR0ZXJuID0gZnVuY3Rpb24oZXhwciwgYmluZGluZ1R5cGUsIGNoZWNrQ2xhc2hlcykge1xuICBpZiAoIGJpbmRpbmdUeXBlID09PSB2b2lkIDAgKSBiaW5kaW5nVHlwZSA9IEJJTkRfTk9ORTtcblxuICBzd2l0Y2ggKGV4cHIudHlwZSkge1xuICBjYXNlIFwiT2JqZWN0UGF0dGVyblwiOlxuICAgIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gZXhwci5wcm9wZXJ0aWVzOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIHByb3AgPSBsaXN0W2ldO1xuXG4gICAgdGhpcy5jaGVja0xWYWxJbm5lclBhdHRlcm4ocHJvcCwgYmluZGluZ1R5cGUsIGNoZWNrQ2xhc2hlcyk7XG4gICAgfVxuICAgIGJyZWFrXG5cbiAgY2FzZSBcIkFycmF5UGF0dGVyblwiOlxuICAgIGZvciAodmFyIGkkMSA9IDAsIGxpc3QkMSA9IGV4cHIuZWxlbWVudHM7IGkkMSA8IGxpc3QkMS5sZW5ndGg7IGkkMSArPSAxKSB7XG4gICAgICB2YXIgZWxlbSA9IGxpc3QkMVtpJDFdO1xuXG4gICAgaWYgKGVsZW0pIHsgdGhpcy5jaGVja0xWYWxJbm5lclBhdHRlcm4oZWxlbSwgYmluZGluZ1R5cGUsIGNoZWNrQ2xhc2hlcyk7IH1cbiAgICB9XG4gICAgYnJlYWtcblxuICBkZWZhdWx0OlxuICAgIHRoaXMuY2hlY2tMVmFsU2ltcGxlKGV4cHIsIGJpbmRpbmdUeXBlLCBjaGVja0NsYXNoZXMpO1xuICB9XG59O1xuXG5wcCQ3LmNoZWNrTFZhbElubmVyUGF0dGVybiA9IGZ1bmN0aW9uKGV4cHIsIGJpbmRpbmdUeXBlLCBjaGVja0NsYXNoZXMpIHtcbiAgaWYgKCBiaW5kaW5nVHlwZSA9PT0gdm9pZCAwICkgYmluZGluZ1R5cGUgPSBCSU5EX05PTkU7XG5cbiAgc3dpdGNoIChleHByLnR5cGUpIHtcbiAgY2FzZSBcIlByb3BlcnR5XCI6XG4gICAgLy8gQXNzaWdubWVudFByb3BlcnR5IGhhcyB0eXBlID09PSBcIlByb3BlcnR5XCJcbiAgICB0aGlzLmNoZWNrTFZhbElubmVyUGF0dGVybihleHByLnZhbHVlLCBiaW5kaW5nVHlwZSwgY2hlY2tDbGFzaGVzKTtcbiAgICBicmVha1xuXG4gIGNhc2UgXCJBc3NpZ25tZW50UGF0dGVyblwiOlxuICAgIHRoaXMuY2hlY2tMVmFsUGF0dGVybihleHByLmxlZnQsIGJpbmRpbmdUeXBlLCBjaGVja0NsYXNoZXMpO1xuICAgIGJyZWFrXG5cbiAgY2FzZSBcIlJlc3RFbGVtZW50XCI6XG4gICAgdGhpcy5jaGVja0xWYWxQYXR0ZXJuKGV4cHIuYXJndW1lbnQsIGJpbmRpbmdUeXBlLCBjaGVja0NsYXNoZXMpO1xuICAgIGJyZWFrXG5cbiAgZGVmYXVsdDpcbiAgICB0aGlzLmNoZWNrTFZhbFBhdHRlcm4oZXhwciwgYmluZGluZ1R5cGUsIGNoZWNrQ2xhc2hlcyk7XG4gIH1cbn07XG5cbi8vIFRoZSBhbGdvcml0aG0gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHJlZ2V4cCBjYW4gYXBwZWFyIGF0IGFcblxudmFyIFRva0NvbnRleHQgPSBmdW5jdGlvbiBUb2tDb250ZXh0KHRva2VuLCBpc0V4cHIsIHByZXNlcnZlU3BhY2UsIG92ZXJyaWRlLCBnZW5lcmF0b3IpIHtcbiAgdGhpcy50b2tlbiA9IHRva2VuO1xuICB0aGlzLmlzRXhwciA9ICEhaXNFeHByO1xuICB0aGlzLnByZXNlcnZlU3BhY2UgPSAhIXByZXNlcnZlU3BhY2U7XG4gIHRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTtcbiAgdGhpcy5nZW5lcmF0b3IgPSAhIWdlbmVyYXRvcjtcbn07XG5cbnZhciB0eXBlcyQyID0ge1xuICBiX3N0YXQ6IG5ldyBUb2tDb250ZXh0KFwie1wiLCBmYWxzZSksXG4gIGJfZXhwcjogbmV3IFRva0NvbnRleHQoXCJ7XCIsIHRydWUpLFxuICBiX3RtcGw6IG5ldyBUb2tDb250ZXh0KFwiJHtcIiwgZmFsc2UpLFxuICBwX3N0YXQ6IG5ldyBUb2tDb250ZXh0KFwiKFwiLCBmYWxzZSksXG4gIHBfZXhwcjogbmV3IFRva0NvbnRleHQoXCIoXCIsIHRydWUpLFxuICBxX3RtcGw6IG5ldyBUb2tDb250ZXh0KFwiYFwiLCB0cnVlLCB0cnVlLCBmdW5jdGlvbiAocCkgeyByZXR1cm4gcC50cnlSZWFkVGVtcGxhdGVUb2tlbigpOyB9KSxcbiAgZl9zdGF0OiBuZXcgVG9rQ29udGV4dChcImZ1bmN0aW9uXCIsIGZhbHNlKSxcbiAgZl9leHByOiBuZXcgVG9rQ29udGV4dChcImZ1bmN0aW9uXCIsIHRydWUpLFxuICBmX2V4cHJfZ2VuOiBuZXcgVG9rQ29udGV4dChcImZ1bmN0aW9uXCIsIHRydWUsIGZhbHNlLCBudWxsLCB0cnVlKSxcbiAgZl9nZW46IG5ldyBUb2tDb250ZXh0KFwiZnVuY3Rpb25cIiwgZmFsc2UsIGZhbHNlLCBudWxsLCB0cnVlKVxufTtcblxudmFyIHBwJDYgPSBQYXJzZXIkMS5wcm90b3R5cGU7XG5cbnBwJDYuaW5pdGlhbENvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFt0eXBlcyQyLmJfc3RhdF1cbn07XG5cbnBwJDYuY3VyQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jb250ZXh0W3RoaXMuY29udGV4dC5sZW5ndGggLSAxXVxufTtcblxucHAkNi5icmFjZUlzQmxvY2sgPSBmdW5jdGlvbihwcmV2VHlwZSkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5jdXJDb250ZXh0KCk7XG4gIGlmIChwYXJlbnQgPT09IHR5cGVzJDIuZl9leHByIHx8IHBhcmVudCA9PT0gdHlwZXMkMi5mX3N0YXQpXG4gICAgeyByZXR1cm4gdHJ1ZSB9XG4gIGlmIChwcmV2VHlwZSA9PT0gdHlwZXMkMS5jb2xvbiAmJiAocGFyZW50ID09PSB0eXBlcyQyLmJfc3RhdCB8fCBwYXJlbnQgPT09IHR5cGVzJDIuYl9leHByKSlcbiAgICB7IHJldHVybiAhcGFyZW50LmlzRXhwciB9XG5cbiAgLy8gVGhlIGNoZWNrIGZvciBgdHQubmFtZSAmJiBleHByQWxsb3dlZGAgZGV0ZWN0cyB3aGV0aGVyIHdlIGFyZVxuICAvLyBhZnRlciBhIGB5aWVsZGAgb3IgYG9mYCBjb25zdHJ1Y3QuIFNlZSB0aGUgYHVwZGF0ZUNvbnRleHRgIGZvclxuICAvLyBgdHQubmFtZWAuXG4gIGlmIChwcmV2VHlwZSA9PT0gdHlwZXMkMS5fcmV0dXJuIHx8IHByZXZUeXBlID09PSB0eXBlcyQxLm5hbWUgJiYgdGhpcy5leHByQWxsb3dlZClcbiAgICB7IHJldHVybiBsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpIH1cbiAgaWYgKHByZXZUeXBlID09PSB0eXBlcyQxLl9lbHNlIHx8IHByZXZUeXBlID09PSB0eXBlcyQxLnNlbWkgfHwgcHJldlR5cGUgPT09IHR5cGVzJDEuZW9mIHx8IHByZXZUeXBlID09PSB0eXBlcyQxLnBhcmVuUiB8fCBwcmV2VHlwZSA9PT0gdHlwZXMkMS5hcnJvdylcbiAgICB7IHJldHVybiB0cnVlIH1cbiAgaWYgKHByZXZUeXBlID09PSB0eXBlcyQxLmJyYWNlTClcbiAgICB7IHJldHVybiBwYXJlbnQgPT09IHR5cGVzJDIuYl9zdGF0IH1cbiAgaWYgKHByZXZUeXBlID09PSB0eXBlcyQxLl92YXIgfHwgcHJldlR5cGUgPT09IHR5cGVzJDEuX2NvbnN0IHx8IHByZXZUeXBlID09PSB0eXBlcyQxLm5hbWUpXG4gICAgeyByZXR1cm4gZmFsc2UgfVxuICByZXR1cm4gIXRoaXMuZXhwckFsbG93ZWRcbn07XG5cbnBwJDYuaW5HZW5lcmF0b3JDb250ZXh0ID0gZnVuY3Rpb24oKSB7XG4gIGZvciAodmFyIGkgPSB0aGlzLmNvbnRleHQubGVuZ3RoIC0gMTsgaSA+PSAxOyBpLS0pIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuY29udGV4dFtpXTtcbiAgICBpZiAoY29udGV4dC50b2tlbiA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgeyByZXR1cm4gY29udGV4dC5nZW5lcmF0b3IgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufTtcblxucHAkNi51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgdmFyIHVwZGF0ZSwgdHlwZSA9IHRoaXMudHlwZTtcbiAgaWYgKHR5cGUua2V5d29yZCAmJiBwcmV2VHlwZSA9PT0gdHlwZXMkMS5kb3QpXG4gICAgeyB0aGlzLmV4cHJBbGxvd2VkID0gZmFsc2U7IH1cbiAgZWxzZSBpZiAodXBkYXRlID0gdHlwZS51cGRhdGVDb250ZXh0KVxuICAgIHsgdXBkYXRlLmNhbGwodGhpcywgcHJldlR5cGUpOyB9XG4gIGVsc2VcbiAgICB7IHRoaXMuZXhwckFsbG93ZWQgPSB0eXBlLmJlZm9yZUV4cHI7IH1cbn07XG5cbi8vIFVzZWQgdG8gaGFuZGxlIGVnZGUgY2FzZXMgd2hlbiB0b2tlbiBjb250ZXh0IGNvdWxkIG5vdCBiZSBpbmZlcnJlZCBjb3JyZWN0bHkgZHVyaW5nIHRva2VuaXphdGlvbiBwaGFzZVxuXG5wcCQ2Lm92ZXJyaWRlQ29udGV4dCA9IGZ1bmN0aW9uKHRva2VuQ3R4KSB7XG4gIGlmICh0aGlzLmN1ckNvbnRleHQoKSAhPT0gdG9rZW5DdHgpIHtcbiAgICB0aGlzLmNvbnRleHRbdGhpcy5jb250ZXh0Lmxlbmd0aCAtIDFdID0gdG9rZW5DdHg7XG4gIH1cbn07XG5cbi8vIFRva2VuLXNwZWNpZmljIGNvbnRleHQgdXBkYXRlIGNvZGVcblxudHlwZXMkMS5wYXJlblIudXBkYXRlQ29udGV4dCA9IHR5cGVzJDEuYnJhY2VSLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuY29udGV4dC5sZW5ndGggPT09IDEpIHtcbiAgICB0aGlzLmV4cHJBbGxvd2VkID0gdHJ1ZTtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgb3V0ID0gdGhpcy5jb250ZXh0LnBvcCgpO1xuICBpZiAob3V0ID09PSB0eXBlcyQyLmJfc3RhdCAmJiB0aGlzLmN1ckNvbnRleHQoKS50b2tlbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgb3V0ID0gdGhpcy5jb250ZXh0LnBvcCgpO1xuICB9XG4gIHRoaXMuZXhwckFsbG93ZWQgPSAhb3V0LmlzRXhwcjtcbn07XG5cbnR5cGVzJDEuYnJhY2VMLnVwZGF0ZUNvbnRleHQgPSBmdW5jdGlvbihwcmV2VHlwZSkge1xuICB0aGlzLmNvbnRleHQucHVzaCh0aGlzLmJyYWNlSXNCbG9jayhwcmV2VHlwZSkgPyB0eXBlcyQyLmJfc3RhdCA6IHR5cGVzJDIuYl9leHByKTtcbiAgdGhpcy5leHByQWxsb3dlZCA9IHRydWU7XG59O1xuXG50eXBlcyQxLmRvbGxhckJyYWNlTC51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuY29udGV4dC5wdXNoKHR5cGVzJDIuYl90bXBsKTtcbiAgdGhpcy5leHByQWxsb3dlZCA9IHRydWU7XG59O1xuXG50eXBlcyQxLnBhcmVuTC51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgdmFyIHN0YXRlbWVudFBhcmVucyA9IHByZXZUeXBlID09PSB0eXBlcyQxLl9pZiB8fCBwcmV2VHlwZSA9PT0gdHlwZXMkMS5fZm9yIHx8IHByZXZUeXBlID09PSB0eXBlcyQxLl93aXRoIHx8IHByZXZUeXBlID09PSB0eXBlcyQxLl93aGlsZTtcbiAgdGhpcy5jb250ZXh0LnB1c2goc3RhdGVtZW50UGFyZW5zID8gdHlwZXMkMi5wX3N0YXQgOiB0eXBlcyQyLnBfZXhwcik7XG4gIHRoaXMuZXhwckFsbG93ZWQgPSB0cnVlO1xufTtcblxudHlwZXMkMS5pbmNEZWMudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICAvLyB0b2tFeHByQWxsb3dlZCBzdGF5cyB1bmNoYW5nZWRcbn07XG5cbnR5cGVzJDEuX2Z1bmN0aW9uLnVwZGF0ZUNvbnRleHQgPSB0eXBlcyQxLl9jbGFzcy51cGRhdGVDb250ZXh0ID0gZnVuY3Rpb24ocHJldlR5cGUpIHtcbiAgaWYgKHByZXZUeXBlLmJlZm9yZUV4cHIgJiYgcHJldlR5cGUgIT09IHR5cGVzJDEuX2Vsc2UgJiZcbiAgICAgICEocHJldlR5cGUgPT09IHR5cGVzJDEuc2VtaSAmJiB0aGlzLmN1ckNvbnRleHQoKSAhPT0gdHlwZXMkMi5wX3N0YXQpICYmXG4gICAgICAhKHByZXZUeXBlID09PSB0eXBlcyQxLl9yZXR1cm4gJiYgbGluZUJyZWFrLnRlc3QodGhpcy5pbnB1dC5zbGljZSh0aGlzLmxhc3RUb2tFbmQsIHRoaXMuc3RhcnQpKSkgJiZcbiAgICAgICEoKHByZXZUeXBlID09PSB0eXBlcyQxLmNvbG9uIHx8IHByZXZUeXBlID09PSB0eXBlcyQxLmJyYWNlTCkgJiYgdGhpcy5jdXJDb250ZXh0KCkgPT09IHR5cGVzJDIuYl9zdGF0KSlcbiAgICB7IHRoaXMuY29udGV4dC5wdXNoKHR5cGVzJDIuZl9leHByKTsgfVxuICBlbHNlXG4gICAgeyB0aGlzLmNvbnRleHQucHVzaCh0eXBlcyQyLmZfc3RhdCk7IH1cbiAgdGhpcy5leHByQWxsb3dlZCA9IGZhbHNlO1xufTtcblxudHlwZXMkMS5iYWNrUXVvdGUudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5jdXJDb250ZXh0KCkgPT09IHR5cGVzJDIucV90bXBsKVxuICAgIHsgdGhpcy5jb250ZXh0LnBvcCgpOyB9XG4gIGVsc2VcbiAgICB7IHRoaXMuY29udGV4dC5wdXNoKHR5cGVzJDIucV90bXBsKTsgfVxuICB0aGlzLmV4cHJBbGxvd2VkID0gZmFsc2U7XG59O1xuXG50eXBlcyQxLnN0YXIudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKHByZXZUeXBlKSB7XG4gIGlmIChwcmV2VHlwZSA9PT0gdHlwZXMkMS5fZnVuY3Rpb24pIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmNvbnRleHQubGVuZ3RoIC0gMTtcbiAgICBpZiAodGhpcy5jb250ZXh0W2luZGV4XSA9PT0gdHlwZXMkMi5mX2V4cHIpXG4gICAgICB7IHRoaXMuY29udGV4dFtpbmRleF0gPSB0eXBlcyQyLmZfZXhwcl9nZW47IH1cbiAgICBlbHNlXG4gICAgICB7IHRoaXMuY29udGV4dFtpbmRleF0gPSB0eXBlcyQyLmZfZ2VuOyB9XG4gIH1cbiAgdGhpcy5leHByQWxsb3dlZCA9IHRydWU7XG59O1xuXG50eXBlcyQxLm5hbWUudXBkYXRlQ29udGV4dCA9IGZ1bmN0aW9uKHByZXZUeXBlKSB7XG4gIHZhciBhbGxvd2VkID0gZmFsc2U7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiBwcmV2VHlwZSAhPT0gdHlwZXMkMS5kb3QpIHtcbiAgICBpZiAodGhpcy52YWx1ZSA9PT0gXCJvZlwiICYmICF0aGlzLmV4cHJBbGxvd2VkIHx8XG4gICAgICAgIHRoaXMudmFsdWUgPT09IFwieWllbGRcIiAmJiB0aGlzLmluR2VuZXJhdG9yQ29udGV4dCgpKVxuICAgICAgeyBhbGxvd2VkID0gdHJ1ZTsgfVxuICB9XG4gIHRoaXMuZXhwckFsbG93ZWQgPSBhbGxvd2VkO1xufTtcblxuLy8gQSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIgb3BlcmF0ZXMgYnkgZGVmaW5pbmcgZnVuY3Rpb25zIGZvciBhbGxcblxudmFyIHBwJDUgPSBQYXJzZXIkMS5wcm90b3R5cGU7XG5cbi8vIENoZWNrIGlmIHByb3BlcnR5IG5hbWUgY2xhc2hlcyB3aXRoIGFscmVhZHkgYWRkZWQuXG4vLyBPYmplY3QvY2xhc3MgZ2V0dGVycyBhbmQgc2V0dGVycyBhcmUgbm90IGFsbG93ZWQgdG8gY2xhc2ggXHUyMDE0XG4vLyBlaXRoZXIgd2l0aCBlYWNoIG90aGVyIG9yIHdpdGggYW4gaW5pdCBwcm9wZXJ0eSBcdTIwMTQgYW5kIGluXG4vLyBzdHJpY3QgbW9kZSwgaW5pdCBwcm9wZXJ0aWVzIGFyZSBhbHNvIG5vdCBhbGxvd2VkIHRvIGJlIHJlcGVhdGVkLlxuXG5wcCQ1LmNoZWNrUHJvcENsYXNoID0gZnVuY3Rpb24ocHJvcCwgcHJvcEhhc2gsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ICYmIHByb3AudHlwZSA9PT0gXCJTcHJlYWRFbGVtZW50XCIpXG4gICAgeyByZXR1cm4gfVxuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgJiYgKHByb3AuY29tcHV0ZWQgfHwgcHJvcC5tZXRob2QgfHwgcHJvcC5zaG9ydGhhbmQpKVxuICAgIHsgcmV0dXJuIH1cbiAgdmFyIGtleSA9IHByb3Aua2V5O1xuICB2YXIgbmFtZTtcbiAgc3dpdGNoIChrZXkudHlwZSkge1xuICBjYXNlIFwiSWRlbnRpZmllclwiOiBuYW1lID0ga2V5Lm5hbWU7IGJyZWFrXG4gIGNhc2UgXCJMaXRlcmFsXCI6IG5hbWUgPSBTdHJpbmcoa2V5LnZhbHVlKTsgYnJlYWtcbiAgZGVmYXVsdDogcmV0dXJuXG4gIH1cbiAgdmFyIGtpbmQgPSBwcm9wLmtpbmQ7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgIGlmIChuYW1lID09PSBcIl9fcHJvdG9fX1wiICYmIGtpbmQgPT09IFwiaW5pdFwiKSB7XG4gICAgICBpZiAocHJvcEhhc2gucHJvdG8pIHtcbiAgICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICAgICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5kb3VibGVQcm90byA8IDApIHtcbiAgICAgICAgICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMuZG91YmxlUHJvdG8gPSBrZXkuc3RhcnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmFpc2VSZWNvdmVyYWJsZShrZXkuc3RhcnQsIFwiUmVkZWZpbml0aW9uIG9mIF9fcHJvdG9fXyBwcm9wZXJ0eVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJvcEhhc2gucHJvdG8gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBuYW1lID0gXCIkXCIgKyBuYW1lO1xuICB2YXIgb3RoZXIgPSBwcm9wSGFzaFtuYW1lXTtcbiAgaWYgKG90aGVyKSB7XG4gICAgdmFyIHJlZGVmaW5pdGlvbjtcbiAgICBpZiAoa2luZCA9PT0gXCJpbml0XCIpIHtcbiAgICAgIHJlZGVmaW5pdGlvbiA9IHRoaXMuc3RyaWN0ICYmIG90aGVyLmluaXQgfHwgb3RoZXIuZ2V0IHx8IG90aGVyLnNldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVkZWZpbml0aW9uID0gb3RoZXIuaW5pdCB8fCBvdGhlcltraW5kXTtcbiAgICB9XG4gICAgaWYgKHJlZGVmaW5pdGlvbilcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKGtleS5zdGFydCwgXCJSZWRlZmluaXRpb24gb2YgcHJvcGVydHlcIik7IH1cbiAgfSBlbHNlIHtcbiAgICBvdGhlciA9IHByb3BIYXNoW25hbWVdID0ge1xuICAgICAgaW5pdDogZmFsc2UsXG4gICAgICBnZXQ6IGZhbHNlLFxuICAgICAgc2V0OiBmYWxzZVxuICAgIH07XG4gIH1cbiAgb3RoZXJba2luZF0gPSB0cnVlO1xufTtcblxuLy8gIyMjIEV4cHJlc3Npb24gcGFyc2luZ1xuXG4vLyBUaGVzZSBuZXN0LCBmcm9tIHRoZSBtb3N0IGdlbmVyYWwgZXhwcmVzc2lvbiB0eXBlIGF0IHRoZSB0b3AgdG9cbi8vICdhdG9taWMnLCBub25kaXZpc2libGUgZXhwcmVzc2lvbiB0eXBlcyBhdCB0aGUgYm90dG9tLiBNb3N0IG9mXG4vLyB0aGUgZnVuY3Rpb25zIHdpbGwgc2ltcGx5IGxldCB0aGUgZnVuY3Rpb24ocykgYmVsb3cgdGhlbSBwYXJzZSxcbi8vIGFuZCwgKmlmKiB0aGUgc3ludGFjdGljIGNvbnN0cnVjdCB0aGV5IGhhbmRsZSBpcyBwcmVzZW50LCB3cmFwXG4vLyB0aGUgQVNUIG5vZGUgdGhhdCB0aGUgaW5uZXIgcGFyc2VyIGdhdmUgdGhlbSBpbiBhbm90aGVyIG5vZGUuXG5cbi8vIFBhcnNlIGEgZnVsbCBleHByZXNzaW9uLiBUaGUgb3B0aW9uYWwgYXJndW1lbnRzIGFyZSB1c2VkIHRvXG4vLyBmb3JiaWQgdGhlIGBpbmAgb3BlcmF0b3IgKGluIGZvciBsb29wcyBpbml0YWxpemF0aW9uIGV4cHJlc3Npb25zKVxuLy8gYW5kIHByb3ZpZGUgcmVmZXJlbmNlIGZvciBzdG9yaW5nICc9JyBvcGVyYXRvciBpbnNpZGUgc2hvcnRoYW5kXG4vLyBwcm9wZXJ0eSBhc3NpZ25tZW50IGluIGNvbnRleHRzIHdoZXJlIGJvdGggb2JqZWN0IGV4cHJlc3Npb25cbi8vIGFuZCBvYmplY3QgcGF0dGVybiBtaWdodCBhcHBlYXIgKHNvIGl0J3MgcG9zc2libGUgdG8gcmFpc2Vcbi8vIGRlbGF5ZWQgc3ludGF4IGVycm9yIGF0IGNvcnJlY3QgcG9zaXRpb24pLlxuXG5wcCQ1LnBhcnNlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKGZvckluaXQsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICB2YXIgZXhwciA9IHRoaXMucGFyc2VNYXliZUFzc2lnbihmb3JJbml0LCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMkMS5jb21tYSkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIG5vZGUuZXhwcmVzc2lvbnMgPSBbZXhwcl07XG4gICAgd2hpbGUgKHRoaXMuZWF0KHR5cGVzJDEuY29tbWEpKSB7IG5vZGUuZXhwcmVzc2lvbnMucHVzaCh0aGlzLnBhcnNlTWF5YmVBc3NpZ24oZm9ySW5pdCwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykpOyB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlNlcXVlbmNlRXhwcmVzc2lvblwiKVxuICB9XG4gIHJldHVybiBleHByXG59O1xuXG4vLyBQYXJzZSBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24uIFRoaXMgaW5jbHVkZXMgYXBwbGljYXRpb25zIG9mXG4vLyBvcGVyYXRvcnMgbGlrZSBgKz1gLlxuXG5wcCQ1LnBhcnNlTWF5YmVBc3NpZ24gPSBmdW5jdGlvbihmb3JJbml0LCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCBhZnRlckxlZnRQYXJzZSkge1xuICBpZiAodGhpcy5pc0NvbnRleHR1YWwoXCJ5aWVsZFwiKSkge1xuICAgIGlmICh0aGlzLmluR2VuZXJhdG9yKSB7IHJldHVybiB0aGlzLnBhcnNlWWllbGQoZm9ySW5pdCkgfVxuICAgIC8vIFRoZSB0b2tlbml6ZXIgd2lsbCBhc3N1bWUgYW4gZXhwcmVzc2lvbiBpcyBhbGxvd2VkIGFmdGVyXG4gICAgLy8gYHlpZWxkYCwgYnV0IHRoaXMgaXNuJ3QgdGhhdCBraW5kIG9mIHlpZWxkXG4gICAgZWxzZSB7IHRoaXMuZXhwckFsbG93ZWQgPSBmYWxzZTsgfVxuICB9XG5cbiAgdmFyIG93bkRlc3RydWN0dXJpbmdFcnJvcnMgPSBmYWxzZSwgb2xkUGFyZW5Bc3NpZ24gPSAtMSwgb2xkVHJhaWxpbmdDb21tYSA9IC0xLCBvbGREb3VibGVQcm90byA9IC0xO1xuICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykge1xuICAgIG9sZFBhcmVuQXNzaWduID0gcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduO1xuICAgIG9sZFRyYWlsaW5nQ29tbWEgPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWE7XG4gICAgb2xkRG91YmxlUHJvdG8gPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLmRvdWJsZVByb3RvO1xuICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA9IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgPSBuZXcgRGVzdHJ1Y3R1cmluZ0Vycm9ycztcbiAgICBvd25EZXN0cnVjdHVyaW5nRXJyb3JzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMkMS5wYXJlbkwgfHwgdGhpcy50eXBlID09PSB0eXBlcyQxLm5hbWUpIHtcbiAgICB0aGlzLnBvdGVudGlhbEFycm93QXQgPSB0aGlzLnN0YXJ0O1xuICAgIHRoaXMucG90ZW50aWFsQXJyb3dJbkZvckF3YWl0ID0gZm9ySW5pdCA9PT0gXCJhd2FpdFwiO1xuICB9XG4gIHZhciBsZWZ0ID0gdGhpcy5wYXJzZU1heWJlQ29uZGl0aW9uYWwoZm9ySW5pdCwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gIGlmIChhZnRlckxlZnRQYXJzZSkgeyBsZWZ0ID0gYWZ0ZXJMZWZ0UGFyc2UuY2FsbCh0aGlzLCBsZWZ0LCBzdGFydFBvcywgc3RhcnRMb2MpOyB9XG4gIGlmICh0aGlzLnR5cGUuaXNBc3NpZ24pIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICBub2RlLm9wZXJhdG9yID0gdGhpcy52YWx1ZTtcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLmVxKVxuICAgICAgeyBsZWZ0ID0gdGhpcy50b0Fzc2lnbmFibGUobGVmdCwgZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpOyB9XG4gICAgaWYgKCFvd25EZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gICAgICByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ24gPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLmRvdWJsZVByb3RvID0gLTE7XG4gICAgfVxuICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbiA+PSBsZWZ0LnN0YXJ0KVxuICAgICAgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbiA9IC0xOyB9IC8vIHJlc2V0IGJlY2F1c2Ugc2hvcnRoYW5kIGRlZmF1bHQgd2FzIHVzZWQgY29ycmVjdGx5XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMkMS5lcSlcbiAgICAgIHsgdGhpcy5jaGVja0xWYWxQYXR0ZXJuKGxlZnQpOyB9XG4gICAgZWxzZVxuICAgICAgeyB0aGlzLmNoZWNrTFZhbFNpbXBsZShsZWZ0KTsgfVxuICAgIG5vZGUubGVmdCA9IGxlZnQ7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS5yaWdodCA9IHRoaXMucGFyc2VNYXliZUFzc2lnbihmb3JJbml0KTtcbiAgICBpZiAob2xkRG91YmxlUHJvdG8gPiAtMSkgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLmRvdWJsZVByb3RvID0gb2xkRG91YmxlUHJvdG87IH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIilcbiAgfSBlbHNlIHtcbiAgICBpZiAob3duRGVzdHJ1Y3R1cmluZ0Vycm9ycykgeyB0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0cnVlKTsgfVxuICB9XG4gIGlmIChvbGRQYXJlbkFzc2lnbiA+IC0xKSB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEFzc2lnbiA9IG9sZFBhcmVuQXNzaWduOyB9XG4gIGlmIChvbGRUcmFpbGluZ0NvbW1hID4gLTEpIHsgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hID0gb2xkVHJhaWxpbmdDb21tYTsgfVxuICByZXR1cm4gbGVmdFxufTtcblxuLy8gUGFyc2UgYSB0ZXJuYXJ5IGNvbmRpdGlvbmFsIChgPzpgKSBvcGVyYXRvci5cblxucHAkNS5wYXJzZU1heWJlQ29uZGl0aW9uYWwgPSBmdW5jdGlvbihmb3JJbml0LCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlRXhwck9wcyhmb3JJbml0LCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgaWYgKHRoaXMuY2hlY2tFeHByZXNzaW9uRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpKSB7IHJldHVybiBleHByIH1cbiAgaWYgKHRoaXMuZWF0KHR5cGVzJDEucXVlc3Rpb24pKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgbm9kZS50ZXN0ID0gZXhwcjtcbiAgICBub2RlLmNvbnNlcXVlbnQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcyQxLmNvbG9uKTtcbiAgICBub2RlLmFsdGVybmF0ZSA9IHRoaXMucGFyc2VNYXliZUFzc2lnbihmb3JJbml0KTtcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIpXG4gIH1cbiAgcmV0dXJuIGV4cHJcbn07XG5cbi8vIFN0YXJ0IHRoZSBwcmVjZWRlbmNlIHBhcnNlci5cblxucHAkNS5wYXJzZUV4cHJPcHMgPSBmdW5jdGlvbihmb3JJbml0LCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlTWF5YmVVbmFyeShyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCBmYWxzZSwgZmFsc2UsIGZvckluaXQpO1xuICBpZiAodGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycykpIHsgcmV0dXJuIGV4cHIgfVxuICByZXR1cm4gZXhwci5zdGFydCA9PT0gc3RhcnRQb3MgJiYgZXhwci50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIgPyBleHByIDogdGhpcy5wYXJzZUV4cHJPcChleHByLCBzdGFydFBvcywgc3RhcnRMb2MsIC0xLCBmb3JJbml0KVxufTtcblxuLy8gUGFyc2UgYmluYXJ5IG9wZXJhdG9ycyB3aXRoIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlIHBhcnNpbmdcbi8vIGFsZ29yaXRobS4gYGxlZnRgIGlzIHRoZSBsZWZ0LWhhbmQgc2lkZSBvZiB0aGUgb3BlcmF0b3IuXG4vLyBgbWluUHJlY2AgcHJvdmlkZXMgY29udGV4dCB0aGF0IGFsbG93cyB0aGUgZnVuY3Rpb24gdG8gc3RvcCBhbmRcbi8vIGRlZmVyIGZ1cnRoZXIgcGFyc2VyIHRvIG9uZSBvZiBpdHMgY2FsbGVycyB3aGVuIGl0IGVuY291bnRlcnMgYW5cbi8vIG9wZXJhdG9yIHRoYXQgaGFzIGEgbG93ZXIgcHJlY2VkZW5jZSB0aGFuIHRoZSBzZXQgaXQgaXMgcGFyc2luZy5cblxucHAkNS5wYXJzZUV4cHJPcCA9IGZ1bmN0aW9uKGxlZnQsIGxlZnRTdGFydFBvcywgbGVmdFN0YXJ0TG9jLCBtaW5QcmVjLCBmb3JJbml0KSB7XG4gIHZhciBwcmVjID0gdGhpcy50eXBlLmJpbm9wO1xuICBpZiAocHJlYyAhPSBudWxsICYmICghZm9ySW5pdCB8fCB0aGlzLnR5cGUgIT09IHR5cGVzJDEuX2luKSkge1xuICAgIGlmIChwcmVjID4gbWluUHJlYykge1xuICAgICAgdmFyIGxvZ2ljYWwgPSB0aGlzLnR5cGUgPT09IHR5cGVzJDEubG9naWNhbE9SIHx8IHRoaXMudHlwZSA9PT0gdHlwZXMkMS5sb2dpY2FsQU5EO1xuICAgICAgdmFyIGNvYWxlc2NlID0gdGhpcy50eXBlID09PSB0eXBlcyQxLmNvYWxlc2NlO1xuICAgICAgaWYgKGNvYWxlc2NlKSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgcHJlY2VkZW5jZSBvZiBgdHQuY29hbGVzY2VgIGFzIGVxdWFsIHRvIHRoZSByYW5nZSBvZiBsb2dpY2FsIGV4cHJlc3Npb25zLlxuICAgICAgICAvLyBJbiBvdGhlciB3b3JkcywgYG5vZGUucmlnaHRgIHNob3VsZG4ndCBjb250YWluIGxvZ2ljYWwgZXhwcmVzc2lvbnMgaW4gb3JkZXIgdG8gY2hlY2sgdGhlIG1peGVkIGVycm9yLlxuICAgICAgICBwcmVjID0gdHlwZXMkMS5sb2dpY2FsQU5ELmJpbm9wO1xuICAgICAgfVxuICAgICAgdmFyIG9wID0gdGhpcy52YWx1ZTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5wYXJzZUV4cHJPcCh0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCBmYWxzZSwgZmFsc2UsIGZvckluaXQpLCBzdGFydFBvcywgc3RhcnRMb2MsIHByZWMsIGZvckluaXQpO1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLmJ1aWxkQmluYXJ5KGxlZnRTdGFydFBvcywgbGVmdFN0YXJ0TG9jLCBsZWZ0LCByaWdodCwgb3AsIGxvZ2ljYWwgfHwgY29hbGVzY2UpO1xuICAgICAgaWYgKChsb2dpY2FsICYmIHRoaXMudHlwZSA9PT0gdHlwZXMkMS5jb2FsZXNjZSkgfHwgKGNvYWxlc2NlICYmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEubG9naWNhbE9SIHx8IHRoaXMudHlwZSA9PT0gdHlwZXMkMS5sb2dpY2FsQU5EKSkpIHtcbiAgICAgICAgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMuc3RhcnQsIFwiTG9naWNhbCBleHByZXNzaW9ucyBhbmQgY29hbGVzY2UgZXhwcmVzc2lvbnMgY2Fubm90IGJlIG1peGVkLiBXcmFwIGVpdGhlciBieSBwYXJlbnRoZXNlc1wiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBhcnNlRXhwck9wKG5vZGUsIGxlZnRTdGFydFBvcywgbGVmdFN0YXJ0TG9jLCBtaW5QcmVjLCBmb3JJbml0KVxuICAgIH1cbiAgfVxuICByZXR1cm4gbGVmdFxufTtcblxucHAkNS5idWlsZEJpbmFyeSA9IGZ1bmN0aW9uKHN0YXJ0UG9zLCBzdGFydExvYywgbGVmdCwgcmlnaHQsIG9wLCBsb2dpY2FsKSB7XG4gIGlmIChyaWdodC50eXBlID09PSBcIlByaXZhdGVJZGVudGlmaWVyXCIpIHsgdGhpcy5yYWlzZShyaWdodC5zdGFydCwgXCJQcml2YXRlIGlkZW50aWZpZXIgY2FuIG9ubHkgYmUgbGVmdCBzaWRlIG9mIGJpbmFyeSBleHByZXNzaW9uXCIpOyB9XG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICBub2RlLmxlZnQgPSBsZWZ0O1xuICBub2RlLm9wZXJhdG9yID0gb3A7XG4gIG5vZGUucmlnaHQgPSByaWdodDtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBsb2dpY2FsID8gXCJMb2dpY2FsRXhwcmVzc2lvblwiIDogXCJCaW5hcnlFeHByZXNzaW9uXCIpXG59O1xuXG4vLyBQYXJzZSB1bmFyeSBvcGVyYXRvcnMsIGJvdGggcHJlZml4IGFuZCBwb3N0Zml4LlxuXG5wcCQ1LnBhcnNlTWF5YmVVbmFyeSA9IGZ1bmN0aW9uKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIHNhd1VuYXJ5LCBpbmNEZWMsIGZvckluaXQpIHtcbiAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jLCBleHByO1xuICBpZiAodGhpcy5pc0NvbnRleHR1YWwoXCJhd2FpdFwiKSAmJiB0aGlzLmNhbkF3YWl0KSB7XG4gICAgZXhwciA9IHRoaXMucGFyc2VBd2FpdChmb3JJbml0KTtcbiAgICBzYXdVbmFyeSA9IHRydWU7XG4gIH0gZWxzZSBpZiAodGhpcy50eXBlLnByZWZpeCkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKSwgdXBkYXRlID0gdGhpcy50eXBlID09PSB0eXBlcyQxLmluY0RlYztcbiAgICBub2RlLm9wZXJhdG9yID0gdGhpcy52YWx1ZTtcbiAgICBub2RlLnByZWZpeCA9IHRydWU7XG4gICAgdGhpcy5uZXh0KCk7XG4gICAgbm9kZS5hcmd1bWVudCA9IHRoaXMucGFyc2VNYXliZVVuYXJ5KG51bGwsIHRydWUsIHVwZGF0ZSwgZm9ySW5pdCk7XG4gICAgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7XG4gICAgaWYgKHVwZGF0ZSkgeyB0aGlzLmNoZWNrTFZhbFNpbXBsZShub2RlLmFyZ3VtZW50KTsgfVxuICAgIGVsc2UgaWYgKHRoaXMuc3RyaWN0ICYmIG5vZGUub3BlcmF0b3IgPT09IFwiZGVsZXRlXCIgJiZcbiAgICAgICAgICAgICBub2RlLmFyZ3VtZW50LnR5cGUgPT09IFwiSWRlbnRpZmllclwiKVxuICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5zdGFydCwgXCJEZWxldGluZyBsb2NhbCB2YXJpYWJsZSBpbiBzdHJpY3QgbW9kZVwiKTsgfVxuICAgIGVsc2UgaWYgKG5vZGUub3BlcmF0b3IgPT09IFwiZGVsZXRlXCIgJiYgaXNQcml2YXRlRmllbGRBY2Nlc3Mobm9kZS5hcmd1bWVudCkpXG4gICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShub2RlLnN0YXJ0LCBcIlByaXZhdGUgZmllbGRzIGNhbiBub3QgYmUgZGVsZXRlZFwiKTsgfVxuICAgIGVsc2UgeyBzYXdVbmFyeSA9IHRydWU7IH1cbiAgICBleHByID0gdGhpcy5maW5pc2hOb2RlKG5vZGUsIHVwZGF0ZSA/IFwiVXBkYXRlRXhwcmVzc2lvblwiIDogXCJVbmFyeUV4cHJlc3Npb25cIik7XG4gIH0gZWxzZSBpZiAoIXNhd1VuYXJ5ICYmIHRoaXMudHlwZSA9PT0gdHlwZXMkMS5wcml2YXRlSWQpIHtcbiAgICBpZiAoZm9ySW5pdCB8fCB0aGlzLnByaXZhdGVOYW1lU3RhY2subGVuZ3RoID09PSAwKSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgZXhwciA9IHRoaXMucGFyc2VQcml2YXRlSWRlbnQoKTtcbiAgICAvLyBvbmx5IGNvdWxkIGJlIHByaXZhdGUgZmllbGRzIGluICdpbicsIHN1Y2ggYXMgI3ggaW4gb2JqXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gdHlwZXMkMS5faW4pIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgfSBlbHNlIHtcbiAgICBleHByID0gdGhpcy5wYXJzZUV4cHJTdWJzY3JpcHRzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGZvckluaXQpO1xuICAgIGlmICh0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSkgeyByZXR1cm4gZXhwciB9XG4gICAgd2hpbGUgKHRoaXMudHlwZS5wb3N0Zml4ICYmICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpKSB7XG4gICAgICB2YXIgbm9kZSQxID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgICAgbm9kZSQxLm9wZXJhdG9yID0gdGhpcy52YWx1ZTtcbiAgICAgIG5vZGUkMS5wcmVmaXggPSBmYWxzZTtcbiAgICAgIG5vZGUkMS5hcmd1bWVudCA9IGV4cHI7XG4gICAgICB0aGlzLmNoZWNrTFZhbFNpbXBsZShleHByKTtcbiAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgZXhwciA9IHRoaXMuZmluaXNoTm9kZShub2RlJDEsIFwiVXBkYXRlRXhwcmVzc2lvblwiKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWluY0RlYyAmJiB0aGlzLmVhdCh0eXBlcyQxLnN0YXJzdGFyKSkge1xuICAgIGlmIChzYXdVbmFyeSlcbiAgICAgIHsgdGhpcy51bmV4cGVjdGVkKHRoaXMubGFzdFRva1N0YXJ0KTsgfVxuICAgIGVsc2VcbiAgICAgIHsgcmV0dXJuIHRoaXMuYnVpbGRCaW5hcnkoc3RhcnRQb3MsIHN0YXJ0TG9jLCBleHByLCB0aGlzLnBhcnNlTWF5YmVVbmFyeShudWxsLCBmYWxzZSwgZmFsc2UsIGZvckluaXQpLCBcIioqXCIsIGZhbHNlKSB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV4cHJcbiAgfVxufTtcblxuZnVuY3Rpb24gaXNQcml2YXRlRmllbGRBY2Nlc3Mobm9kZSkge1xuICByZXR1cm4gKFxuICAgIG5vZGUudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIgJiYgbm9kZS5wcm9wZXJ0eS50eXBlID09PSBcIlByaXZhdGVJZGVudGlmaWVyXCIgfHxcbiAgICBub2RlLnR5cGUgPT09IFwiQ2hhaW5FeHByZXNzaW9uXCIgJiYgaXNQcml2YXRlRmllbGRBY2Nlc3Mobm9kZS5leHByZXNzaW9uKVxuICApXG59XG5cbi8vIFBhcnNlIGNhbGwsIGRvdCwgYW5kIGBbXWAtc3Vic2NyaXB0IGV4cHJlc3Npb25zLlxuXG5wcCQ1LnBhcnNlRXhwclN1YnNjcmlwdHMgPSBmdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCBmb3JJbml0KSB7XG4gIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlRXhwckF0b20ocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgZm9ySW5pdCk7XG4gIGlmIChleHByLnR5cGUgPT09IFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIiAmJiB0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva1N0YXJ0LCB0aGlzLmxhc3RUb2tFbmQpICE9PSBcIilcIilcbiAgICB7IHJldHVybiBleHByIH1cbiAgdmFyIHJlc3VsdCA9IHRoaXMucGFyc2VTdWJzY3JpcHRzKGV4cHIsIHN0YXJ0UG9zLCBzdGFydExvYywgZmFsc2UsIGZvckluaXQpO1xuICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyAmJiByZXN1bHQudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCIpIHtcbiAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduID49IHJlc3VsdC5zdGFydCkgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ24gPSAtMTsgfVxuICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kID49IHJlc3VsdC5zdGFydCkgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRCaW5kID0gLTE7IH1cbiAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hID49IHJlc3VsdC5zdGFydCkgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSAtMTsgfVxuICB9XG4gIHJldHVybiByZXN1bHRcbn07XG5cbnBwJDUucGFyc2VTdWJzY3JpcHRzID0gZnVuY3Rpb24oYmFzZSwgc3RhcnRQb3MsIHN0YXJ0TG9jLCBub0NhbGxzLCBmb3JJbml0KSB7XG4gIHZhciBtYXliZUFzeW5jQXJyb3cgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCAmJiBiYXNlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmIGJhc2UubmFtZSA9PT0gXCJhc3luY1wiICYmXG4gICAgICB0aGlzLmxhc3RUb2tFbmQgPT09IGJhc2UuZW5kICYmICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpICYmIGJhc2UuZW5kIC0gYmFzZS5zdGFydCA9PT0gNSAmJlxuICAgICAgdGhpcy5wb3RlbnRpYWxBcnJvd0F0ID09PSBiYXNlLnN0YXJ0O1xuICB2YXIgb3B0aW9uYWxDaGFpbmVkID0gZmFsc2U7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMucGFyc2VTdWJzY3JpcHQoYmFzZSwgc3RhcnRQb3MsIHN0YXJ0TG9jLCBub0NhbGxzLCBtYXliZUFzeW5jQXJyb3csIG9wdGlvbmFsQ2hhaW5lZCwgZm9ySW5pdCk7XG5cbiAgICBpZiAoZWxlbWVudC5vcHRpb25hbCkgeyBvcHRpb25hbENoYWluZWQgPSB0cnVlOyB9XG4gICAgaWYgKGVsZW1lbnQgPT09IGJhc2UgfHwgZWxlbWVudC50eXBlID09PSBcIkFycm93RnVuY3Rpb25FeHByZXNzaW9uXCIpIHtcbiAgICAgIGlmIChvcHRpb25hbENoYWluZWQpIHtcbiAgICAgICAgdmFyIGNoYWluTm9kZSA9IHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKTtcbiAgICAgICAgY2hhaW5Ob2RlLmV4cHJlc3Npb24gPSBlbGVtZW50O1xuICAgICAgICBlbGVtZW50ID0gdGhpcy5maW5pc2hOb2RlKGNoYWluTm9kZSwgXCJDaGFpbkV4cHJlc3Npb25cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudFxuICAgIH1cblxuICAgIGJhc2UgPSBlbGVtZW50O1xuICB9XG59O1xuXG5wcCQ1LnBhcnNlU3Vic2NyaXB0ID0gZnVuY3Rpb24oYmFzZSwgc3RhcnRQb3MsIHN0YXJ0TG9jLCBub0NhbGxzLCBtYXliZUFzeW5jQXJyb3csIG9wdGlvbmFsQ2hhaW5lZCwgZm9ySW5pdCkge1xuICB2YXIgb3B0aW9uYWxTdXBwb3J0ZWQgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTE7XG4gIHZhciBvcHRpb25hbCA9IG9wdGlvbmFsU3VwcG9ydGVkICYmIHRoaXMuZWF0KHR5cGVzJDEucXVlc3Rpb25Eb3QpO1xuICBpZiAobm9DYWxscyAmJiBvcHRpb25hbCkgeyB0aGlzLnJhaXNlKHRoaXMubGFzdFRva1N0YXJ0LCBcIk9wdGlvbmFsIGNoYWluaW5nIGNhbm5vdCBhcHBlYXIgaW4gdGhlIGNhbGxlZSBvZiBuZXcgZXhwcmVzc2lvbnNcIik7IH1cblxuICB2YXIgY29tcHV0ZWQgPSB0aGlzLmVhdCh0eXBlcyQxLmJyYWNrZXRMKTtcbiAgaWYgKGNvbXB1dGVkIHx8IChvcHRpb25hbCAmJiB0aGlzLnR5cGUgIT09IHR5cGVzJDEucGFyZW5MICYmIHRoaXMudHlwZSAhPT0gdHlwZXMkMS5iYWNrUXVvdGUpIHx8IHRoaXMuZWF0KHR5cGVzJDEuZG90KSkge1xuICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIG5vZGUub2JqZWN0ID0gYmFzZTtcbiAgICBpZiAoY29tcHV0ZWQpIHtcbiAgICAgIG5vZGUucHJvcGVydHkgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICAgICAgdGhpcy5leHBlY3QodHlwZXMkMS5icmFja2V0Uik7XG4gICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEucHJpdmF0ZUlkICYmIGJhc2UudHlwZSAhPT0gXCJTdXBlclwiKSB7XG4gICAgICBub2RlLnByb3BlcnR5ID0gdGhpcy5wYXJzZVByaXZhdGVJZGVudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnByb3BlcnR5ID0gdGhpcy5wYXJzZUlkZW50KHRoaXMub3B0aW9ucy5hbGxvd1Jlc2VydmVkICE9PSBcIm5ldmVyXCIpO1xuICAgIH1cbiAgICBub2RlLmNvbXB1dGVkID0gISFjb21wdXRlZDtcbiAgICBpZiAob3B0aW9uYWxTdXBwb3J0ZWQpIHtcbiAgICAgIG5vZGUub3B0aW9uYWwgPSBvcHRpb25hbDtcbiAgICB9XG4gICAgYmFzZSA9IHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk1lbWJlckV4cHJlc3Npb25cIik7XG4gIH0gZWxzZSBpZiAoIW5vQ2FsbHMgJiYgdGhpcy5lYXQodHlwZXMkMS5wYXJlbkwpKSB7XG4gICAgdmFyIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgPSBuZXcgRGVzdHJ1Y3R1cmluZ0Vycm9ycywgb2xkWWllbGRQb3MgPSB0aGlzLnlpZWxkUG9zLCBvbGRBd2FpdFBvcyA9IHRoaXMuYXdhaXRQb3MsIG9sZEF3YWl0SWRlbnRQb3MgPSB0aGlzLmF3YWl0SWRlbnRQb3M7XG4gICAgdGhpcy55aWVsZFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdElkZW50UG9zID0gMDtcbiAgICB2YXIgZXhwckxpc3QgPSB0aGlzLnBhcnNlRXhwckxpc3QodHlwZXMkMS5wYXJlblIsIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4LCBmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgaWYgKG1heWJlQXN5bmNBcnJvdyAmJiAhb3B0aW9uYWwgJiYgIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkgJiYgdGhpcy5lYXQodHlwZXMkMS5hcnJvdykpIHtcbiAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGZhbHNlKTtcbiAgICAgIHRoaXMuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zKCk7XG4gICAgICBpZiAodGhpcy5hd2FpdElkZW50UG9zID4gMClcbiAgICAgICAgeyB0aGlzLnJhaXNlKHRoaXMuYXdhaXRJZGVudFBvcywgXCJDYW5ub3QgdXNlICdhd2FpdCcgYXMgaWRlbnRpZmllciBpbnNpZGUgYW4gYXN5bmMgZnVuY3Rpb25cIik7IH1cbiAgICAgIHRoaXMueWllbGRQb3MgPSBvbGRZaWVsZFBvcztcbiAgICAgIHRoaXMuYXdhaXRQb3MgPSBvbGRBd2FpdFBvcztcbiAgICAgIHRoaXMuYXdhaXRJZGVudFBvcyA9IG9sZEF3YWl0SWRlbnRQb3M7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUFycm93RXhwcmVzc2lvbih0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyksIGV4cHJMaXN0LCB0cnVlLCBmb3JJbml0KVxuICAgIH1cbiAgICB0aGlzLmNoZWNrRXhwcmVzc2lvbkVycm9ycyhyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0cnVlKTtcbiAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3MgfHwgdGhpcy55aWVsZFBvcztcbiAgICB0aGlzLmF3YWl0UG9zID0gb2xkQXdhaXRQb3MgfHwgdGhpcy5hd2FpdFBvcztcbiAgICB0aGlzLmF3YWl0SWRlbnRQb3MgPSBvbGRBd2FpdElkZW50UG9zIHx8IHRoaXMuYXdhaXRJZGVudFBvcztcbiAgICB2YXIgbm9kZSQxID0gdGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpO1xuICAgIG5vZGUkMS5jYWxsZWUgPSBiYXNlO1xuICAgIG5vZGUkMS5hcmd1bWVudHMgPSBleHByTGlzdDtcbiAgICBpZiAob3B0aW9uYWxTdXBwb3J0ZWQpIHtcbiAgICAgIG5vZGUkMS5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgIH1cbiAgICBiYXNlID0gdGhpcy5maW5pc2hOb2RlKG5vZGUkMSwgXCJDYWxsRXhwcmVzc2lvblwiKTtcbiAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEuYmFja1F1b3RlKSB7XG4gICAgaWYgKG9wdGlvbmFsIHx8IG9wdGlvbmFsQ2hhaW5lZCkge1xuICAgICAgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIk9wdGlvbmFsIGNoYWluaW5nIGNhbm5vdCBhcHBlYXIgaW4gdGhlIHRhZyBvZiB0YWdnZWQgdGVtcGxhdGUgZXhwcmVzc2lvbnNcIik7XG4gICAgfVxuICAgIHZhciBub2RlJDIgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgbm9kZSQyLnRhZyA9IGJhc2U7XG4gICAgbm9kZSQyLnF1YXNpID0gdGhpcy5wYXJzZVRlbXBsYXRlKHtpc1RhZ2dlZDogdHJ1ZX0pO1xuICAgIGJhc2UgPSB0aGlzLmZpbmlzaE5vZGUobm9kZSQyLCBcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiKTtcbiAgfVxuICByZXR1cm4gYmFzZVxufTtcblxuLy8gUGFyc2UgYW4gYXRvbWljIGV4cHJlc3Npb24gXHUyMDE0IGVpdGhlciBhIHNpbmdsZSB0b2tlbiB0aGF0IGlzIGFuXG4vLyBleHByZXNzaW9uLCBhbiBleHByZXNzaW9uIHN0YXJ0ZWQgYnkgYSBrZXl3b3JkIGxpa2UgYGZ1bmN0aW9uYCBvclxuLy8gYG5ld2AsIG9yIGFuIGV4cHJlc3Npb24gd3JhcHBlZCBpbiBwdW5jdHVhdGlvbiBsaWtlIGAoKWAsIGBbXWAsXG4vLyBvciBge31gLlxuXG5wcCQ1LnBhcnNlRXhwckF0b20gPSBmdW5jdGlvbihyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCBmb3JJbml0KSB7XG4gIC8vIElmIGEgZGl2aXNpb24gb3BlcmF0b3IgYXBwZWFycyBpbiBhbiBleHByZXNzaW9uIHBvc2l0aW9uLCB0aGVcbiAgLy8gdG9rZW5pemVyIGdvdCBjb25mdXNlZCwgYW5kIHdlIGZvcmNlIGl0IHRvIHJlYWQgYSByZWdleHAgaW5zdGVhZC5cbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMkMS5zbGFzaCkgeyB0aGlzLnJlYWRSZWdleHAoKTsgfVxuXG4gIHZhciBub2RlLCBjYW5CZUFycm93ID0gdGhpcy5wb3RlbnRpYWxBcnJvd0F0ID09PSB0aGlzLnN0YXJ0O1xuICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICBjYXNlIHR5cGVzJDEuX3N1cGVyOlxuICAgIGlmICghdGhpcy5hbGxvd1N1cGVyKVxuICAgICAgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiJ3N1cGVyJyBrZXl3b3JkIG91dHNpZGUgYSBtZXRob2RcIik7IH1cbiAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLnBhcmVuTCAmJiAhdGhpcy5hbGxvd0RpcmVjdFN1cGVyKVxuICAgICAgeyB0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIFwic3VwZXIoKSBjYWxsIG91dHNpZGUgY29uc3RydWN0b3Igb2YgYSBzdWJjbGFzc1wiKTsgfVxuICAgIC8vIFRoZSBgc3VwZXJgIGtleXdvcmQgY2FuIGFwcGVhciBhdCBiZWxvdzpcbiAgICAvLyBTdXBlclByb3BlcnR5OlxuICAgIC8vICAgICBzdXBlciBbIEV4cHJlc3Npb24gXVxuICAgIC8vICAgICBzdXBlciAuIElkZW50aWZpZXJOYW1lXG4gICAgLy8gU3VwZXJDYWxsOlxuICAgIC8vICAgICBzdXBlciAoIEFyZ3VtZW50cyApXG4gICAgaWYgKHRoaXMudHlwZSAhPT0gdHlwZXMkMS5kb3QgJiYgdGhpcy50eXBlICE9PSB0eXBlcyQxLmJyYWNrZXRMICYmIHRoaXMudHlwZSAhPT0gdHlwZXMkMS5wYXJlbkwpXG4gICAgICB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIlN1cGVyXCIpXG5cbiAgY2FzZSB0eXBlcyQxLl90aGlzOlxuICAgIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUaGlzRXhwcmVzc2lvblwiKVxuXG4gIGNhc2UgdHlwZXMkMS5uYW1lOlxuICAgIHZhciBzdGFydFBvcyA9IHRoaXMuc3RhcnQsIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYywgY29udGFpbnNFc2MgPSB0aGlzLmNvbnRhaW5zRXNjO1xuICAgIHZhciBpZCA9IHRoaXMucGFyc2VJZGVudChmYWxzZSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4ICYmICFjb250YWluc0VzYyAmJiBpZC5uYW1lID09PSBcImFzeW5jXCIgJiYgIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkgJiYgdGhpcy5lYXQodHlwZXMkMS5fZnVuY3Rpb24pKSB7XG4gICAgICB0aGlzLm92ZXJyaWRlQ29udGV4dCh0eXBlcyQyLmZfZXhwcik7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUZ1bmN0aW9uKHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKSwgMCwgZmFsc2UsIHRydWUsIGZvckluaXQpXG4gICAgfVxuICAgIGlmIChjYW5CZUFycm93ICYmICF0aGlzLmNhbkluc2VydFNlbWljb2xvbigpKSB7XG4gICAgICBpZiAodGhpcy5lYXQodHlwZXMkMS5hcnJvdykpXG4gICAgICAgIHsgcmV0dXJuIHRoaXMucGFyc2VBcnJvd0V4cHJlc3Npb24odGhpcy5zdGFydE5vZGVBdChzdGFydFBvcywgc3RhcnRMb2MpLCBbaWRdLCBmYWxzZSwgZm9ySW5pdCkgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4ICYmIGlkLm5hbWUgPT09IFwiYXN5bmNcIiAmJiB0aGlzLnR5cGUgPT09IHR5cGVzJDEubmFtZSAmJiAhY29udGFpbnNFc2MgJiZcbiAgICAgICAgICAoIXRoaXMucG90ZW50aWFsQXJyb3dJbkZvckF3YWl0IHx8IHRoaXMudmFsdWUgIT09IFwib2ZcIiB8fCB0aGlzLmNvbnRhaW5zRXNjKSkge1xuICAgICAgICBpZCA9IHRoaXMucGFyc2VJZGVudChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmNhbkluc2VydFNlbWljb2xvbigpIHx8ICF0aGlzLmVhdCh0eXBlcyQxLmFycm93KSlcbiAgICAgICAgICB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKSwgW2lkXSwgdHJ1ZSwgZm9ySW5pdClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlkXG5cbiAgY2FzZSB0eXBlcyQxLnJlZ2V4cDpcbiAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIG5vZGUgPSB0aGlzLnBhcnNlTGl0ZXJhbCh2YWx1ZS52YWx1ZSk7XG4gICAgbm9kZS5yZWdleCA9IHtwYXR0ZXJuOiB2YWx1ZS5wYXR0ZXJuLCBmbGFnczogdmFsdWUuZmxhZ3N9O1xuICAgIHJldHVybiBub2RlXG5cbiAgY2FzZSB0eXBlcyQxLm51bTogY2FzZSB0eXBlcyQxLnN0cmluZzpcbiAgICByZXR1cm4gdGhpcy5wYXJzZUxpdGVyYWwodGhpcy52YWx1ZSlcblxuICBjYXNlIHR5cGVzJDEuX251bGw6IGNhc2UgdHlwZXMkMS5fdHJ1ZTogY2FzZSB0eXBlcyQxLl9mYWxzZTpcbiAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICBub2RlLnZhbHVlID0gdGhpcy50eXBlID09PSB0eXBlcyQxLl9udWxsID8gbnVsbCA6IHRoaXMudHlwZSA9PT0gdHlwZXMkMS5fdHJ1ZTtcbiAgICBub2RlLnJhdyA9IHRoaXMudHlwZS5rZXl3b3JkO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJMaXRlcmFsXCIpXG5cbiAgY2FzZSB0eXBlcyQxLnBhcmVuTDpcbiAgICB2YXIgc3RhcnQgPSB0aGlzLnN0YXJ0LCBleHByID0gdGhpcy5wYXJzZVBhcmVuQW5kRGlzdGluZ3Vpc2hFeHByZXNzaW9uKGNhbkJlQXJyb3csIGZvckluaXQpO1xuICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gICAgICBpZiAocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5wYXJlbnRoZXNpemVkQXNzaWduIDwgMCAmJiAhdGhpcy5pc1NpbXBsZUFzc2lnblRhcmdldChleHByKSlcbiAgICAgICAgeyByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnBhcmVudGhlc2l6ZWRBc3NpZ24gPSBzdGFydDsgfVxuICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEJpbmQgPCAwKVxuICAgICAgICB7IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMucGFyZW50aGVzaXplZEJpbmQgPSBzdGFydDsgfVxuICAgIH1cbiAgICByZXR1cm4gZXhwclxuXG4gIGNhc2UgdHlwZXMkMS5icmFja2V0TDpcbiAgICBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgICB0aGlzLm5leHQoKTtcbiAgICBub2RlLmVsZW1lbnRzID0gdGhpcy5wYXJzZUV4cHJMaXN0KHR5cGVzJDEuYnJhY2tldFIsIHRydWUsIHRydWUsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJBcnJheUV4cHJlc3Npb25cIilcblxuICBjYXNlIHR5cGVzJDEuYnJhY2VMOlxuICAgIHRoaXMub3ZlcnJpZGVDb250ZXh0KHR5cGVzJDIuYl9leHByKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZU9iaihmYWxzZSwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycylcblxuICBjYXNlIHR5cGVzJDEuX2Z1bmN0aW9uOlxuICAgIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICAgIHRoaXMubmV4dCgpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlRnVuY3Rpb24obm9kZSwgMClcblxuICBjYXNlIHR5cGVzJDEuX2NsYXNzOlxuICAgIHJldHVybiB0aGlzLnBhcnNlQ2xhc3ModGhpcy5zdGFydE5vZGUoKSwgZmFsc2UpXG5cbiAgY2FzZSB0eXBlcyQxLl9uZXc6XG4gICAgcmV0dXJuIHRoaXMucGFyc2VOZXcoKVxuXG4gIGNhc2UgdHlwZXMkMS5iYWNrUXVvdGU6XG4gICAgcmV0dXJuIHRoaXMucGFyc2VUZW1wbGF0ZSgpXG5cbiAgY2FzZSB0eXBlcyQxLl9pbXBvcnQ6XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSAxMSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VFeHBySW1wb3J0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudW5leHBlY3RlZCgpXG4gICAgfVxuXG4gIGRlZmF1bHQ6XG4gICAgdGhpcy51bmV4cGVjdGVkKCk7XG4gIH1cbn07XG5cbnBwJDUucGFyc2VFeHBySW1wb3J0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcblxuICAvLyBDb25zdW1lIGBpbXBvcnRgIGFzIGFuIGlkZW50aWZpZXIgZm9yIGBpbXBvcnQubWV0YWAuXG4gIC8vIEJlY2F1c2UgYHRoaXMucGFyc2VJZGVudCh0cnVlKWAgZG9lc24ndCBjaGVjayBlc2NhcGUgc2VxdWVuY2VzLCBpdCBuZWVkcyB0aGUgY2hlY2sgb2YgYHRoaXMuY29udGFpbnNFc2NgLlxuICBpZiAodGhpcy5jb250YWluc0VzYykgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJFc2NhcGUgc2VxdWVuY2UgaW4ga2V5d29yZCBpbXBvcnRcIik7IH1cbiAgdmFyIG1ldGEgPSB0aGlzLnBhcnNlSWRlbnQodHJ1ZSk7XG5cbiAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgY2FzZSB0eXBlcyQxLnBhcmVuTDpcbiAgICByZXR1cm4gdGhpcy5wYXJzZUR5bmFtaWNJbXBvcnQobm9kZSlcbiAgY2FzZSB0eXBlcyQxLmRvdDpcbiAgICBub2RlLm1ldGEgPSBtZXRhO1xuICAgIHJldHVybiB0aGlzLnBhcnNlSW1wb3J0TWV0YShub2RlKVxuICBkZWZhdWx0OlxuICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICB9XG59O1xuXG5wcCQ1LnBhcnNlRHluYW1pY0ltcG9ydCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdGhpcy5uZXh0KCk7IC8vIHNraXAgYChgXG5cbiAgLy8gUGFyc2Ugbm9kZS5zb3VyY2UuXG4gIG5vZGUuc291cmNlID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKCk7XG5cbiAgLy8gVmVyaWZ5IGVuZGluZy5cbiAgaWYgKCF0aGlzLmVhdCh0eXBlcyQxLnBhcmVuUikpIHtcbiAgICB2YXIgZXJyb3JQb3MgPSB0aGlzLnN0YXJ0O1xuICAgIGlmICh0aGlzLmVhdCh0eXBlcyQxLmNvbW1hKSAmJiB0aGlzLmVhdCh0eXBlcyQxLnBhcmVuUikpIHtcbiAgICAgIHRoaXMucmFpc2VSZWNvdmVyYWJsZShlcnJvclBvcywgXCJUcmFpbGluZyBjb21tYSBpcyBub3QgYWxsb3dlZCBpbiBpbXBvcnQoKVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51bmV4cGVjdGVkKGVycm9yUG9zKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiSW1wb3J0RXhwcmVzc2lvblwiKVxufTtcblxucHAkNS5wYXJzZUltcG9ydE1ldGEgPSBmdW5jdGlvbihub2RlKSB7XG4gIHRoaXMubmV4dCgpOyAvLyBza2lwIGAuYFxuXG4gIHZhciBjb250YWluc0VzYyA9IHRoaXMuY29udGFpbnNFc2M7XG4gIG5vZGUucHJvcGVydHkgPSB0aGlzLnBhcnNlSWRlbnQodHJ1ZSk7XG5cbiAgaWYgKG5vZGUucHJvcGVydHkubmFtZSAhPT0gXCJtZXRhXCIpXG4gICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5wcm9wZXJ0eS5zdGFydCwgXCJUaGUgb25seSB2YWxpZCBtZXRhIHByb3BlcnR5IGZvciBpbXBvcnQgaXMgJ2ltcG9ydC5tZXRhJ1wiKTsgfVxuICBpZiAoY29udGFpbnNFc2MpXG4gICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUobm9kZS5zdGFydCwgXCInaW1wb3J0Lm1ldGEnIG11c3Qgbm90IGNvbnRhaW4gZXNjYXBlZCBjaGFyYWN0ZXJzXCIpOyB9XG4gIGlmICh0aGlzLm9wdGlvbnMuc291cmNlVHlwZSAhPT0gXCJtb2R1bGVcIiAmJiAhdGhpcy5vcHRpb25zLmFsbG93SW1wb3J0RXhwb3J0RXZlcnl3aGVyZSlcbiAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShub2RlLnN0YXJ0LCBcIkNhbm5vdCB1c2UgJ2ltcG9ydC5tZXRhJyBvdXRzaWRlIGEgbW9kdWxlXCIpOyB9XG5cbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk1ldGFQcm9wZXJ0eVwiKVxufTtcblxucHAkNS5wYXJzZUxpdGVyYWwgPSBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gIG5vZGUudmFsdWUgPSB2YWx1ZTtcbiAgbm9kZS5yYXcgPSB0aGlzLmlucHV0LnNsaWNlKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTtcbiAgaWYgKG5vZGUucmF3LmNoYXJDb2RlQXQobm9kZS5yYXcubGVuZ3RoIC0gMSkgPT09IDExMCkgeyBub2RlLmJpZ2ludCA9IG5vZGUucmF3LnNsaWNlKDAsIC0xKS5yZXBsYWNlKC9fL2csIFwiXCIpOyB9XG4gIHRoaXMubmV4dCgpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTGl0ZXJhbFwiKVxufTtcblxucHAkNS5wYXJzZVBhcmVuRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmV4cGVjdCh0eXBlcyQxLnBhcmVuTCk7XG4gIHZhciB2YWwgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuICB0aGlzLmV4cGVjdCh0eXBlcyQxLnBhcmVuUik7XG4gIHJldHVybiB2YWxcbn07XG5cbnBwJDUucGFyc2VQYXJlbkFuZERpc3Rpbmd1aXNoRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKGNhbkJlQXJyb3csIGZvckluaXQpIHtcbiAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jLCB2YWwsIGFsbG93VHJhaWxpbmdDb21tYSA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4O1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHtcbiAgICB0aGlzLm5leHQoKTtcblxuICAgIHZhciBpbm5lclN0YXJ0UG9zID0gdGhpcy5zdGFydCwgaW5uZXJTdGFydExvYyA9IHRoaXMuc3RhcnRMb2M7XG4gICAgdmFyIGV4cHJMaXN0ID0gW10sIGZpcnN0ID0gdHJ1ZSwgbGFzdElzQ29tbWEgPSBmYWxzZTtcbiAgICB2YXIgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyA9IG5ldyBEZXN0cnVjdHVyaW5nRXJyb3JzLCBvbGRZaWVsZFBvcyA9IHRoaXMueWllbGRQb3MsIG9sZEF3YWl0UG9zID0gdGhpcy5hd2FpdFBvcywgc3ByZWFkU3RhcnQ7XG4gICAgdGhpcy55aWVsZFBvcyA9IDA7XG4gICAgdGhpcy5hd2FpdFBvcyA9IDA7XG4gICAgLy8gRG8gbm90IHNhdmUgYXdhaXRJZGVudFBvcyB0byBhbGxvdyBjaGVja2luZyBhd2FpdHMgbmVzdGVkIGluIHBhcmFtZXRlcnNcbiAgICB3aGlsZSAodGhpcy50eXBlICE9PSB0eXBlcyQxLnBhcmVuUikge1xuICAgICAgZmlyc3QgPyBmaXJzdCA9IGZhbHNlIDogdGhpcy5leHBlY3QodHlwZXMkMS5jb21tYSk7XG4gICAgICBpZiAoYWxsb3dUcmFpbGluZ0NvbW1hICYmIHRoaXMuYWZ0ZXJUcmFpbGluZ0NvbW1hKHR5cGVzJDEucGFyZW5SLCB0cnVlKSkge1xuICAgICAgICBsYXN0SXNDb21tYSA9IHRydWU7XG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMkMS5lbGxpcHNpcykge1xuICAgICAgICBzcHJlYWRTdGFydCA9IHRoaXMuc3RhcnQ7XG4gICAgICAgIGV4cHJMaXN0LnB1c2godGhpcy5wYXJzZVBhcmVuSXRlbSh0aGlzLnBhcnNlUmVzdEJpbmRpbmcoKSkpO1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLmNvbW1hKSB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCJDb21tYSBpcyBub3QgcGVybWl0dGVkIGFmdGVyIHRoZSByZXN0IGVsZW1lbnRcIik7IH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4cHJMaXN0LnB1c2godGhpcy5wYXJzZU1heWJlQXNzaWduKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLCB0aGlzLnBhcnNlUGFyZW5JdGVtKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBpbm5lckVuZFBvcyA9IHRoaXMubGFzdFRva0VuZCwgaW5uZXJFbmRMb2MgPSB0aGlzLmxhc3RUb2tFbmRMb2M7XG4gICAgdGhpcy5leHBlY3QodHlwZXMkMS5wYXJlblIpO1xuXG4gICAgaWYgKGNhbkJlQXJyb3cgJiYgIXRoaXMuY2FuSW5zZXJ0U2VtaWNvbG9uKCkgJiYgdGhpcy5lYXQodHlwZXMkMS5hcnJvdykpIHtcbiAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuRXJyb3JzKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGZhbHNlKTtcbiAgICAgIHRoaXMuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zKCk7XG4gICAgICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3M7XG4gICAgICB0aGlzLmF3YWl0UG9zID0gb2xkQXdhaXRQb3M7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZVBhcmVuQXJyb3dMaXN0KHN0YXJ0UG9zLCBzdGFydExvYywgZXhwckxpc3QsIGZvckluaXQpXG4gICAgfVxuXG4gICAgaWYgKCFleHByTGlzdC5sZW5ndGggfHwgbGFzdElzQ29tbWEpIHsgdGhpcy51bmV4cGVjdGVkKHRoaXMubGFzdFRva1N0YXJ0KTsgfVxuICAgIGlmIChzcHJlYWRTdGFydCkgeyB0aGlzLnVuZXhwZWN0ZWQoc3ByZWFkU3RhcnQpOyB9XG4gICAgdGhpcy5jaGVja0V4cHJlc3Npb25FcnJvcnMocmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgdHJ1ZSk7XG4gICAgdGhpcy55aWVsZFBvcyA9IG9sZFlpZWxkUG9zIHx8IHRoaXMueWllbGRQb3M7XG4gICAgdGhpcy5hd2FpdFBvcyA9IG9sZEF3YWl0UG9zIHx8IHRoaXMuYXdhaXRQb3M7XG5cbiAgICBpZiAoZXhwckxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgdmFsID0gdGhpcy5zdGFydE5vZGVBdChpbm5lclN0YXJ0UG9zLCBpbm5lclN0YXJ0TG9jKTtcbiAgICAgIHZhbC5leHByZXNzaW9ucyA9IGV4cHJMaXN0O1xuICAgICAgdGhpcy5maW5pc2hOb2RlQXQodmFsLCBcIlNlcXVlbmNlRXhwcmVzc2lvblwiLCBpbm5lckVuZFBvcywgaW5uZXJFbmRMb2MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWwgPSBleHByTGlzdFswXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFsID0gdGhpcy5wYXJzZVBhcmVuRXhwcmVzc2lvbigpO1xuICB9XG5cbiAgaWYgKHRoaXMub3B0aW9ucy5wcmVzZXJ2ZVBhcmVucykge1xuICAgIHZhciBwYXIgPSB0aGlzLnN0YXJ0Tm9kZUF0KHN0YXJ0UG9zLCBzdGFydExvYyk7XG4gICAgcGFyLmV4cHJlc3Npb24gPSB2YWw7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShwYXIsIFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsXG4gIH1cbn07XG5cbnBwJDUucGFyc2VQYXJlbkl0ZW0gPSBmdW5jdGlvbihpdGVtKSB7XG4gIHJldHVybiBpdGVtXG59O1xuXG5wcCQ1LnBhcnNlUGFyZW5BcnJvd0xpc3QgPSBmdW5jdGlvbihzdGFydFBvcywgc3RhcnRMb2MsIGV4cHJMaXN0LCBmb3JJbml0KSB7XG4gIHJldHVybiB0aGlzLnBhcnNlQXJyb3dFeHByZXNzaW9uKHRoaXMuc3RhcnROb2RlQXQoc3RhcnRQb3MsIHN0YXJ0TG9jKSwgZXhwckxpc3QsIGZhbHNlLCBmb3JJbml0KVxufTtcblxuLy8gTmV3J3MgcHJlY2VkZW5jZSBpcyBzbGlnaHRseSB0cmlja3kuIEl0IG11c3QgYWxsb3cgaXRzIGFyZ3VtZW50IHRvXG4vLyBiZSBhIGBbXWAgb3IgZG90IHN1YnNjcmlwdCBleHByZXNzaW9uLCBidXQgbm90IGEgY2FsbCBcdTIwMTQgYXQgbGVhc3QsXG4vLyBub3Qgd2l0aG91dCB3cmFwcGluZyBpdCBpbiBwYXJlbnRoZXNlcy4gVGh1cywgaXQgdXNlcyB0aGUgbm9DYWxsc1xuLy8gYXJndW1lbnQgdG8gcGFyc2VTdWJzY3JpcHRzIHRvIHByZXZlbnQgaXQgZnJvbSBjb25zdW1pbmcgdGhlXG4vLyBhcmd1bWVudCBsaXN0LlxuXG52YXIgZW1wdHkgPSBbXTtcblxucHAkNS5wYXJzZU5ldyA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5jb250YWluc0VzYykgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJFc2NhcGUgc2VxdWVuY2UgaW4ga2V5d29yZCBuZXdcIik7IH1cbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICB2YXIgbWV0YSA9IHRoaXMucGFyc2VJZGVudCh0cnVlKTtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIHRoaXMuZWF0KHR5cGVzJDEuZG90KSkge1xuICAgIG5vZGUubWV0YSA9IG1ldGE7XG4gICAgdmFyIGNvbnRhaW5zRXNjID0gdGhpcy5jb250YWluc0VzYztcbiAgICBub2RlLnByb3BlcnR5ID0gdGhpcy5wYXJzZUlkZW50KHRydWUpO1xuICAgIGlmIChub2RlLnByb3BlcnR5Lm5hbWUgIT09IFwidGFyZ2V0XCIpXG4gICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShub2RlLnByb3BlcnR5LnN0YXJ0LCBcIlRoZSBvbmx5IHZhbGlkIG1ldGEgcHJvcGVydHkgZm9yIG5ldyBpcyAnbmV3LnRhcmdldCdcIik7IH1cbiAgICBpZiAoY29udGFpbnNFc2MpXG4gICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShub2RlLnN0YXJ0LCBcIiduZXcudGFyZ2V0JyBtdXN0IG5vdCBjb250YWluIGVzY2FwZWQgY2hhcmFjdGVyc1wiKTsgfVxuICAgIGlmICghdGhpcy5hbGxvd05ld0RvdFRhcmdldClcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKG5vZGUuc3RhcnQsIFwiJ25ldy50YXJnZXQnIGNhbiBvbmx5IGJlIHVzZWQgaW4gZnVuY3Rpb25zIGFuZCBjbGFzcyBzdGF0aWMgYmxvY2tcIik7IH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiTWV0YVByb3BlcnR5XCIpXG4gIH1cbiAgdmFyIHN0YXJ0UG9zID0gdGhpcy5zdGFydCwgc3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jLCBpc0ltcG9ydCA9IHRoaXMudHlwZSA9PT0gdHlwZXMkMS5faW1wb3J0O1xuICBub2RlLmNhbGxlZSA9IHRoaXMucGFyc2VTdWJzY3JpcHRzKHRoaXMucGFyc2VFeHByQXRvbSgpLCBzdGFydFBvcywgc3RhcnRMb2MsIHRydWUsIGZhbHNlKTtcbiAgaWYgKGlzSW1wb3J0ICYmIG5vZGUuY2FsbGVlLnR5cGUgPT09IFwiSW1wb3J0RXhwcmVzc2lvblwiKSB7XG4gICAgdGhpcy5yYWlzZShzdGFydFBvcywgXCJDYW5ub3QgdXNlIG5ldyB3aXRoIGltcG9ydCgpXCIpO1xuICB9XG4gIGlmICh0aGlzLmVhdCh0eXBlcyQxLnBhcmVuTCkpIHsgbm9kZS5hcmd1bWVudHMgPSB0aGlzLnBhcnNlRXhwckxpc3QodHlwZXMkMS5wYXJlblIsIHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA4LCBmYWxzZSk7IH1cbiAgZWxzZSB7IG5vZGUuYXJndW1lbnRzID0gZW1wdHk7IH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIk5ld0V4cHJlc3Npb25cIilcbn07XG5cbi8vIFBhcnNlIHRlbXBsYXRlIGV4cHJlc3Npb24uXG5cbnBwJDUucGFyc2VUZW1wbGF0ZUVsZW1lbnQgPSBmdW5jdGlvbihyZWYpIHtcbiAgdmFyIGlzVGFnZ2VkID0gcmVmLmlzVGFnZ2VkO1xuXG4gIHZhciBlbGVtID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMkMS5pbnZhbGlkVGVtcGxhdGUpIHtcbiAgICBpZiAoIWlzVGFnZ2VkKSB7XG4gICAgICB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5zdGFydCwgXCJCYWQgZXNjYXBlIHNlcXVlbmNlIGluIHVudGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxcIik7XG4gICAgfVxuICAgIGVsZW0udmFsdWUgPSB7XG4gICAgICByYXc6IHRoaXMudmFsdWUsXG4gICAgICBjb29rZWQ6IG51bGxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGVsZW0udmFsdWUgPSB7XG4gICAgICByYXc6IHRoaXMuaW5wdXQuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5lbmQpLnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIiksXG4gICAgICBjb29rZWQ6IHRoaXMudmFsdWVcbiAgICB9O1xuICB9XG4gIHRoaXMubmV4dCgpO1xuICBlbGVtLnRhaWwgPSB0aGlzLnR5cGUgPT09IHR5cGVzJDEuYmFja1F1b3RlO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKGVsZW0sIFwiVGVtcGxhdGVFbGVtZW50XCIpXG59O1xuXG5wcCQ1LnBhcnNlVGVtcGxhdGUgPSBmdW5jdGlvbihyZWYpIHtcbiAgaWYgKCByZWYgPT09IHZvaWQgMCApIHJlZiA9IHt9O1xuICB2YXIgaXNUYWdnZWQgPSByZWYuaXNUYWdnZWQ7IGlmICggaXNUYWdnZWQgPT09IHZvaWQgMCApIGlzVGFnZ2VkID0gZmFsc2U7XG5cbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpO1xuICB0aGlzLm5leHQoKTtcbiAgbm9kZS5leHByZXNzaW9ucyA9IFtdO1xuICB2YXIgY3VyRWx0ID0gdGhpcy5wYXJzZVRlbXBsYXRlRWxlbWVudCh7aXNUYWdnZWQ6IGlzVGFnZ2VkfSk7XG4gIG5vZGUucXVhc2lzID0gW2N1ckVsdF07XG4gIHdoaWxlICghY3VyRWx0LnRhaWwpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLmVvZikgeyB0aGlzLnJhaXNlKHRoaXMucG9zLCBcIlVudGVybWluYXRlZCB0ZW1wbGF0ZSBsaXRlcmFsXCIpOyB9XG4gICAgdGhpcy5leHBlY3QodHlwZXMkMS5kb2xsYXJCcmFjZUwpO1xuICAgIG5vZGUuZXhwcmVzc2lvbnMucHVzaCh0aGlzLnBhcnNlRXhwcmVzc2lvbigpKTtcbiAgICB0aGlzLmV4cGVjdCh0eXBlcyQxLmJyYWNlUik7XG4gICAgbm9kZS5xdWFzaXMucHVzaChjdXJFbHQgPSB0aGlzLnBhcnNlVGVtcGxhdGVFbGVtZW50KHtpc1RhZ2dlZDogaXNUYWdnZWR9KSk7XG4gIH1cbiAgdGhpcy5uZXh0KCk7XG4gIHJldHVybiB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJUZW1wbGF0ZUxpdGVyYWxcIilcbn07XG5cbnBwJDUuaXNBc3luY1Byb3AgPSBmdW5jdGlvbihwcm9wKSB7XG4gIHJldHVybiAhcHJvcC5jb21wdXRlZCAmJiBwcm9wLmtleS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJiBwcm9wLmtleS5uYW1lID09PSBcImFzeW5jXCIgJiZcbiAgICAodGhpcy50eXBlID09PSB0eXBlcyQxLm5hbWUgfHwgdGhpcy50eXBlID09PSB0eXBlcyQxLm51bSB8fCB0aGlzLnR5cGUgPT09IHR5cGVzJDEuc3RyaW5nIHx8IHRoaXMudHlwZSA9PT0gdHlwZXMkMS5icmFja2V0TCB8fCB0aGlzLnR5cGUua2V5d29yZCB8fCAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiYgdGhpcy50eXBlID09PSB0eXBlcyQxLnN0YXIpKSAmJlxuICAgICFsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5zdGFydCkpXG59O1xuXG4vLyBQYXJzZSBhbiBvYmplY3QgbGl0ZXJhbCBvciBiaW5kaW5nIHBhdHRlcm4uXG5cbnBwJDUucGFyc2VPYmogPSBmdW5jdGlvbihpc1BhdHRlcm4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpLCBmaXJzdCA9IHRydWUsIHByb3BIYXNoID0ge307XG4gIG5vZGUucHJvcGVydGllcyA9IFtdO1xuICB0aGlzLm5leHQoKTtcbiAgd2hpbGUgKCF0aGlzLmVhdCh0eXBlcyQxLmJyYWNlUikpIHtcbiAgICBpZiAoIWZpcnN0KSB7XG4gICAgICB0aGlzLmV4cGVjdCh0eXBlcyQxLmNvbW1hKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNSAmJiB0aGlzLmFmdGVyVHJhaWxpbmdDb21tYSh0eXBlcyQxLmJyYWNlUikpIHsgYnJlYWsgfVxuICAgIH0gZWxzZSB7IGZpcnN0ID0gZmFsc2U7IH1cblxuICAgIHZhciBwcm9wID0gdGhpcy5wYXJzZVByb3BlcnR5KGlzUGF0dGVybiwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7XG4gICAgaWYgKCFpc1BhdHRlcm4pIHsgdGhpcy5jaGVja1Byb3BDbGFzaChwcm9wLCBwcm9wSGFzaCwgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyk7IH1cbiAgICBub2RlLnByb3BlcnRpZXMucHVzaChwcm9wKTtcbiAgfVxuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIGlzUGF0dGVybiA/IFwiT2JqZWN0UGF0dGVyblwiIDogXCJPYmplY3RFeHByZXNzaW9uXCIpXG59O1xuXG5wcCQ1LnBhcnNlUHJvcGVydHkgPSBmdW5jdGlvbihpc1BhdHRlcm4sIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgdmFyIHByb3AgPSB0aGlzLnN0YXJ0Tm9kZSgpLCBpc0dlbmVyYXRvciwgaXNBc3luYywgc3RhcnRQb3MsIHN0YXJ0TG9jO1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiYgdGhpcy5lYXQodHlwZXMkMS5lbGxpcHNpcykpIHtcbiAgICBpZiAoaXNQYXR0ZXJuKSB7XG4gICAgICBwcm9wLmFyZ3VtZW50ID0gdGhpcy5wYXJzZUlkZW50KGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEuY29tbWEpIHtcbiAgICAgICAgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0LCBcIkNvbW1hIGlzIG5vdCBwZXJtaXR0ZWQgYWZ0ZXIgdGhlIHJlc3QgZWxlbWVudFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmZpbmlzaE5vZGUocHJvcCwgXCJSZXN0RWxlbWVudFwiKVxuICAgIH1cbiAgICAvLyBQYXJzZSBhcmd1bWVudC5cbiAgICBwcm9wLmFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgICAvLyBUbyBkaXNhbGxvdyB0cmFpbGluZyBjb21tYSB2aWEgYHRoaXMudG9Bc3NpZ25hYmxlKClgLlxuICAgIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEuY29tbWEgJiYgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycyAmJiByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPCAwKSB7XG4gICAgICByZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnRyYWlsaW5nQ29tbWEgPSB0aGlzLnN0YXJ0O1xuICAgIH1cbiAgICAvLyBGaW5pc2hcbiAgICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKHByb3AsIFwiU3ByZWFkRWxlbWVudFwiKVxuICB9XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgIHByb3AubWV0aG9kID0gZmFsc2U7XG4gICAgcHJvcC5zaG9ydGhhbmQgPSBmYWxzZTtcbiAgICBpZiAoaXNQYXR0ZXJuIHx8IHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICAgIHN0YXJ0UG9zID0gdGhpcy5zdGFydDtcbiAgICAgIHN0YXJ0TG9jID0gdGhpcy5zdGFydExvYztcbiAgICB9XG4gICAgaWYgKCFpc1BhdHRlcm4pXG4gICAgICB7IGlzR2VuZXJhdG9yID0gdGhpcy5lYXQodHlwZXMkMS5zdGFyKTsgfVxuICB9XG4gIHZhciBjb250YWluc0VzYyA9IHRoaXMuY29udGFpbnNFc2M7XG4gIHRoaXMucGFyc2VQcm9wZXJ0eU5hbWUocHJvcCk7XG4gIGlmICghaXNQYXR0ZXJuICYmICFjb250YWluc0VzYyAmJiB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCAmJiAhaXNHZW5lcmF0b3IgJiYgdGhpcy5pc0FzeW5jUHJvcChwcm9wKSkge1xuICAgIGlzQXN5bmMgPSB0cnVlO1xuICAgIGlzR2VuZXJhdG9yID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiYgdGhpcy5lYXQodHlwZXMkMS5zdGFyKTtcbiAgICB0aGlzLnBhcnNlUHJvcGVydHlOYW1lKHByb3ApO1xuICB9IGVsc2Uge1xuICAgIGlzQXN5bmMgPSBmYWxzZTtcbiAgfVxuICB0aGlzLnBhcnNlUHJvcGVydHlWYWx1ZShwcm9wLCBpc1BhdHRlcm4sIGlzR2VuZXJhdG9yLCBpc0FzeW5jLCBzdGFydFBvcywgc3RhcnRMb2MsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMsIGNvbnRhaW5zRXNjKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShwcm9wLCBcIlByb3BlcnR5XCIpXG59O1xuXG5wcCQ1LnBhcnNlUHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uKHByb3AsIGlzUGF0dGVybiwgaXNHZW5lcmF0b3IsIGlzQXN5bmMsIHN0YXJ0UG9zLCBzdGFydExvYywgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycywgY29udGFpbnNFc2MpIHtcbiAgaWYgKChpc0dlbmVyYXRvciB8fCBpc0FzeW5jKSAmJiB0aGlzLnR5cGUgPT09IHR5cGVzJDEuY29sb24pXG4gICAgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuXG4gIGlmICh0aGlzLmVhdCh0eXBlcyQxLmNvbG9uKSkge1xuICAgIHByb3AudmFsdWUgPSBpc1BhdHRlcm4gPyB0aGlzLnBhcnNlTWF5YmVEZWZhdWx0KHRoaXMuc3RhcnQsIHRoaXMuc3RhcnRMb2MpIDogdGhpcy5wYXJzZU1heWJlQXNzaWduKGZhbHNlLCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKTtcbiAgICBwcm9wLmtpbmQgPSBcImluaXRcIjtcbiAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNiAmJiB0aGlzLnR5cGUgPT09IHR5cGVzJDEucGFyZW5MKSB7XG4gICAgaWYgKGlzUGF0dGVybikgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgIHByb3Aua2luZCA9IFwiaW5pdFwiO1xuICAgIHByb3AubWV0aG9kID0gdHJ1ZTtcbiAgICBwcm9wLnZhbHVlID0gdGhpcy5wYXJzZU1ldGhvZChpc0dlbmVyYXRvciwgaXNBc3luYyk7XG4gIH0gZWxzZSBpZiAoIWlzUGF0dGVybiAmJiAhY29udGFpbnNFc2MgJiZcbiAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNSAmJiAhcHJvcC5jb21wdXRlZCAmJiBwcm9wLmtleS50eXBlID09PSBcIklkZW50aWZpZXJcIiAmJlxuICAgICAgICAgICAgIChwcm9wLmtleS5uYW1lID09PSBcImdldFwiIHx8IHByb3Aua2V5Lm5hbWUgPT09IFwic2V0XCIpICYmXG4gICAgICAgICAgICAgKHRoaXMudHlwZSAhPT0gdHlwZXMkMS5jb21tYSAmJiB0aGlzLnR5cGUgIT09IHR5cGVzJDEuYnJhY2VSICYmIHRoaXMudHlwZSAhPT0gdHlwZXMkMS5lcSkpIHtcbiAgICBpZiAoaXNHZW5lcmF0b3IgfHwgaXNBc3luYykgeyB0aGlzLnVuZXhwZWN0ZWQoKTsgfVxuICAgIHByb3Aua2luZCA9IHByb3Aua2V5Lm5hbWU7XG4gICAgdGhpcy5wYXJzZVByb3BlcnR5TmFtZShwcm9wKTtcbiAgICBwcm9wLnZhbHVlID0gdGhpcy5wYXJzZU1ldGhvZChmYWxzZSk7XG4gICAgdmFyIHBhcmFtQ291bnQgPSBwcm9wLmtpbmQgPT09IFwiZ2V0XCIgPyAwIDogMTtcbiAgICBpZiAocHJvcC52YWx1ZS5wYXJhbXMubGVuZ3RoICE9PSBwYXJhbUNvdW50KSB7XG4gICAgICB2YXIgc3RhcnQgPSBwcm9wLnZhbHVlLnN0YXJ0O1xuICAgICAgaWYgKHByb3Aua2luZCA9PT0gXCJnZXRcIilcbiAgICAgICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsIFwiZ2V0dGVyIHNob3VsZCBoYXZlIG5vIHBhcmFtc1wiKTsgfVxuICAgICAgZWxzZVxuICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShzdGFydCwgXCJzZXR0ZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1cIik7IH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb3Aua2luZCA9PT0gXCJzZXRcIiAmJiBwcm9wLnZhbHVlLnBhcmFtc1swXS50eXBlID09PSBcIlJlc3RFbGVtZW50XCIpXG4gICAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHByb3AudmFsdWUucGFyYW1zWzBdLnN0YXJ0LCBcIlNldHRlciBjYW5ub3QgdXNlIHJlc3QgcGFyYW1zXCIpOyB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmICFwcm9wLmNvbXB1dGVkICYmIHByb3Aua2V5LnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgaWYgKGlzR2VuZXJhdG9yIHx8IGlzQXN5bmMpIHsgdGhpcy51bmV4cGVjdGVkKCk7IH1cbiAgICB0aGlzLmNoZWNrVW5yZXNlcnZlZChwcm9wLmtleSk7XG4gICAgaWYgKHByb3Aua2V5Lm5hbWUgPT09IFwiYXdhaXRcIiAmJiAhdGhpcy5hd2FpdElkZW50UG9zKVxuICAgICAgeyB0aGlzLmF3YWl0SWRlbnRQb3MgPSBzdGFydFBvczsgfVxuICAgIHByb3Aua2luZCA9IFwiaW5pdFwiO1xuICAgIGlmIChpc1BhdHRlcm4pIHtcbiAgICAgIHByb3AudmFsdWUgPSB0aGlzLnBhcnNlTWF5YmVEZWZhdWx0KHN0YXJ0UG9zLCBzdGFydExvYywgdGhpcy5jb3B5Tm9kZShwcm9wLmtleSkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLmVxICYmIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpIHtcbiAgICAgIGlmIChyZWZEZXN0cnVjdHVyaW5nRXJyb3JzLnNob3J0aGFuZEFzc2lnbiA8IDApXG4gICAgICAgIHsgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy5zaG9ydGhhbmRBc3NpZ24gPSB0aGlzLnN0YXJ0OyB9XG4gICAgICBwcm9wLnZhbHVlID0gdGhpcy5wYXJzZU1heWJlRGVmYXVsdChzdGFydFBvcywgc3RhcnRMb2MsIHRoaXMuY29weU5vZGUocHJvcC5rZXkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcC52YWx1ZSA9IHRoaXMuY29weU5vZGUocHJvcC5rZXkpO1xuICAgIH1cbiAgICBwcm9wLnNob3J0aGFuZCA9IHRydWU7XG4gIH0gZWxzZSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG59O1xuXG5wcCQ1LnBhcnNlUHJvcGVydHlOYW1lID0gZnVuY3Rpb24ocHJvcCkge1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHtcbiAgICBpZiAodGhpcy5lYXQodHlwZXMkMS5icmFja2V0TCkpIHtcbiAgICAgIHByb3AuY29tcHV0ZWQgPSB0cnVlO1xuICAgICAgcHJvcC5rZXkgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oKTtcbiAgICAgIHRoaXMuZXhwZWN0KHR5cGVzJDEuYnJhY2tldFIpO1xuICAgICAgcmV0dXJuIHByb3Aua2V5XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3AuY29tcHV0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb3Aua2V5ID0gdGhpcy50eXBlID09PSB0eXBlcyQxLm51bSB8fCB0aGlzLnR5cGUgPT09IHR5cGVzJDEuc3RyaW5nID8gdGhpcy5wYXJzZUV4cHJBdG9tKCkgOiB0aGlzLnBhcnNlSWRlbnQodGhpcy5vcHRpb25zLmFsbG93UmVzZXJ2ZWQgIT09IFwibmV2ZXJcIilcbn07XG5cbi8vIEluaXRpYWxpemUgZW1wdHkgZnVuY3Rpb24gbm9kZS5cblxucHAkNS5pbml0RnVuY3Rpb24gPSBmdW5jdGlvbihub2RlKSB7XG4gIG5vZGUuaWQgPSBudWxsO1xuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHsgbm9kZS5nZW5lcmF0b3IgPSBub2RlLmV4cHJlc3Npb24gPSBmYWxzZTsgfVxuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDgpIHsgbm9kZS5hc3luYyA9IGZhbHNlOyB9XG59O1xuXG4vLyBQYXJzZSBvYmplY3Qgb3IgY2xhc3MgbWV0aG9kLlxuXG5wcCQ1LnBhcnNlTWV0aG9kID0gZnVuY3Rpb24oaXNHZW5lcmF0b3IsIGlzQXN5bmMsIGFsbG93RGlyZWN0U3VwZXIpIHtcbiAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSgpLCBvbGRZaWVsZFBvcyA9IHRoaXMueWllbGRQb3MsIG9sZEF3YWl0UG9zID0gdGhpcy5hd2FpdFBvcywgb2xkQXdhaXRJZGVudFBvcyA9IHRoaXMuYXdhaXRJZGVudFBvcztcblxuICB0aGlzLmluaXRGdW5jdGlvbihub2RlKTtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2KVxuICAgIHsgbm9kZS5nZW5lcmF0b3IgPSBpc0dlbmVyYXRvcjsgfVxuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDgpXG4gICAgeyBub2RlLmFzeW5jID0gISFpc0FzeW5jOyB9XG5cbiAgdGhpcy55aWVsZFBvcyA9IDA7XG4gIHRoaXMuYXdhaXRQb3MgPSAwO1xuICB0aGlzLmF3YWl0SWRlbnRQb3MgPSAwO1xuICB0aGlzLmVudGVyU2NvcGUoZnVuY3Rpb25GbGFncyhpc0FzeW5jLCBub2RlLmdlbmVyYXRvcikgfCBTQ09QRV9TVVBFUiB8IChhbGxvd0RpcmVjdFN1cGVyID8gU0NPUEVfRElSRUNUX1NVUEVSIDogMCkpO1xuXG4gIHRoaXMuZXhwZWN0KHR5cGVzJDEucGFyZW5MKTtcbiAgbm9kZS5wYXJhbXMgPSB0aGlzLnBhcnNlQmluZGluZ0xpc3QodHlwZXMkMS5wYXJlblIsIGZhbHNlLCB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCk7XG4gIHRoaXMuY2hlY2tZaWVsZEF3YWl0SW5EZWZhdWx0UGFyYW1zKCk7XG4gIHRoaXMucGFyc2VGdW5jdGlvbkJvZHkobm9kZSwgZmFsc2UsIHRydWUsIGZhbHNlKTtcblxuICB0aGlzLnlpZWxkUG9zID0gb2xkWWllbGRQb3M7XG4gIHRoaXMuYXdhaXRQb3MgPSBvbGRBd2FpdFBvcztcbiAgdGhpcy5hd2FpdElkZW50UG9zID0gb2xkQXdhaXRJZGVudFBvcztcbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIkZ1bmN0aW9uRXhwcmVzc2lvblwiKVxufTtcblxuLy8gUGFyc2UgYXJyb3cgZnVuY3Rpb24gZXhwcmVzc2lvbiB3aXRoIGdpdmVuIHBhcmFtZXRlcnMuXG5cbnBwJDUucGFyc2VBcnJvd0V4cHJlc3Npb24gPSBmdW5jdGlvbihub2RlLCBwYXJhbXMsIGlzQXN5bmMsIGZvckluaXQpIHtcbiAgdmFyIG9sZFlpZWxkUG9zID0gdGhpcy55aWVsZFBvcywgb2xkQXdhaXRQb3MgPSB0aGlzLmF3YWl0UG9zLCBvbGRBd2FpdElkZW50UG9zID0gdGhpcy5hd2FpdElkZW50UG9zO1xuXG4gIHRoaXMuZW50ZXJTY29wZShmdW5jdGlvbkZsYWdzKGlzQXN5bmMsIGZhbHNlKSB8IFNDT1BFX0FSUk9XKTtcbiAgdGhpcy5pbml0RnVuY3Rpb24obm9kZSk7XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOCkgeyBub2RlLmFzeW5jID0gISFpc0FzeW5jOyB9XG5cbiAgdGhpcy55aWVsZFBvcyA9IDA7XG4gIHRoaXMuYXdhaXRQb3MgPSAwO1xuICB0aGlzLmF3YWl0SWRlbnRQb3MgPSAwO1xuXG4gIG5vZGUucGFyYW1zID0gdGhpcy50b0Fzc2lnbmFibGVMaXN0KHBhcmFtcywgdHJ1ZSk7XG4gIHRoaXMucGFyc2VGdW5jdGlvbkJvZHkobm9kZSwgdHJ1ZSwgZmFsc2UsIGZvckluaXQpO1xuXG4gIHRoaXMueWllbGRQb3MgPSBvbGRZaWVsZFBvcztcbiAgdGhpcy5hd2FpdFBvcyA9IG9sZEF3YWl0UG9zO1xuICB0aGlzLmF3YWl0SWRlbnRQb3MgPSBvbGRBd2FpdElkZW50UG9zO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIilcbn07XG5cbi8vIFBhcnNlIGZ1bmN0aW9uIGJvZHkgYW5kIGNoZWNrIHBhcmFtZXRlcnMuXG5cbnBwJDUucGFyc2VGdW5jdGlvbkJvZHkgPSBmdW5jdGlvbihub2RlLCBpc0Fycm93RnVuY3Rpb24sIGlzTWV0aG9kLCBmb3JJbml0KSB7XG4gIHZhciBpc0V4cHJlc3Npb24gPSBpc0Fycm93RnVuY3Rpb24gJiYgdGhpcy50eXBlICE9PSB0eXBlcyQxLmJyYWNlTDtcbiAgdmFyIG9sZFN0cmljdCA9IHRoaXMuc3RyaWN0LCB1c2VTdHJpY3QgPSBmYWxzZTtcblxuICBpZiAoaXNFeHByZXNzaW9uKSB7XG4gICAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZU1heWJlQXNzaWduKGZvckluaXQpO1xuICAgIG5vZGUuZXhwcmVzc2lvbiA9IHRydWU7XG4gICAgdGhpcy5jaGVja1BhcmFtcyhub2RlLCBmYWxzZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5vblNpbXBsZSA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA3ICYmICF0aGlzLmlzU2ltcGxlUGFyYW1MaXN0KG5vZGUucGFyYW1zKTtcbiAgICBpZiAoIW9sZFN0cmljdCB8fCBub25TaW1wbGUpIHtcbiAgICAgIHVzZVN0cmljdCA9IHRoaXMuc3RyaWN0RGlyZWN0aXZlKHRoaXMuZW5kKTtcbiAgICAgIC8vIElmIHRoaXMgaXMgYSBzdHJpY3QgbW9kZSBmdW5jdGlvbiwgdmVyaWZ5IHRoYXQgYXJndW1lbnQgbmFtZXNcbiAgICAgIC8vIGFyZSBub3QgcmVwZWF0ZWQsIGFuZCBpdCBkb2VzIG5vdCB0cnkgdG8gYmluZCB0aGUgd29yZHMgYGV2YWxgXG4gICAgICAvLyBvciBgYXJndW1lbnRzYC5cbiAgICAgIGlmICh1c2VTdHJpY3QgJiYgbm9uU2ltcGxlKVxuICAgICAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZShub2RlLnN0YXJ0LCBcIklsbGVnYWwgJ3VzZSBzdHJpY3QnIGRpcmVjdGl2ZSBpbiBmdW5jdGlvbiB3aXRoIG5vbi1zaW1wbGUgcGFyYW1ldGVyIGxpc3RcIik7IH1cbiAgICB9XG4gICAgLy8gU3RhcnQgYSBuZXcgc2NvcGUgd2l0aCByZWdhcmQgdG8gbGFiZWxzIGFuZCB0aGUgYGluRnVuY3Rpb25gXG4gICAgLy8gZmxhZyAocmVzdG9yZSB0aGVtIHRvIHRoZWlyIG9sZCB2YWx1ZSBhZnRlcndhcmRzKS5cbiAgICB2YXIgb2xkTGFiZWxzID0gdGhpcy5sYWJlbHM7XG4gICAgdGhpcy5sYWJlbHMgPSBbXTtcbiAgICBpZiAodXNlU3RyaWN0KSB7IHRoaXMuc3RyaWN0ID0gdHJ1ZTsgfVxuXG4gICAgLy8gQWRkIHRoZSBwYXJhbXMgdG8gdmFyRGVjbGFyZWROYW1lcyB0byBlbnN1cmUgdGhhdCBhbiBlcnJvciBpcyB0aHJvd25cbiAgICAvLyBpZiBhIGxldC9jb25zdCBkZWNsYXJhdGlvbiBpbiB0aGUgZnVuY3Rpb24gY2xhc2hlcyB3aXRoIG9uZSBvZiB0aGUgcGFyYW1zLlxuICAgIHRoaXMuY2hlY2tQYXJhbXMobm9kZSwgIW9sZFN0cmljdCAmJiAhdXNlU3RyaWN0ICYmICFpc0Fycm93RnVuY3Rpb24gJiYgIWlzTWV0aG9kICYmIHRoaXMuaXNTaW1wbGVQYXJhbUxpc3Qobm9kZS5wYXJhbXMpKTtcbiAgICAvLyBFbnN1cmUgdGhlIGZ1bmN0aW9uIG5hbWUgaXNuJ3QgYSBmb3JiaWRkZW4gaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZSwgZS5nLiAnZXZhbCdcbiAgICBpZiAodGhpcy5zdHJpY3QgJiYgbm9kZS5pZCkgeyB0aGlzLmNoZWNrTFZhbFNpbXBsZShub2RlLmlkLCBCSU5EX09VVFNJREUpOyB9XG4gICAgbm9kZS5ib2R5ID0gdGhpcy5wYXJzZUJsb2NrKGZhbHNlLCB1bmRlZmluZWQsIHVzZVN0cmljdCAmJiAhb2xkU3RyaWN0KTtcbiAgICBub2RlLmV4cHJlc3Npb24gPSBmYWxzZTtcbiAgICB0aGlzLmFkYXB0RGlyZWN0aXZlUHJvbG9ndWUobm9kZS5ib2R5LmJvZHkpO1xuICAgIHRoaXMubGFiZWxzID0gb2xkTGFiZWxzO1xuICB9XG4gIHRoaXMuZXhpdFNjb3BlKCk7XG59O1xuXG5wcCQ1LmlzU2ltcGxlUGFyYW1MaXN0ID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gcGFyYW1zOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSlcbiAgICB7XG4gICAgdmFyIHBhcmFtID0gbGlzdFtpXTtcblxuICAgIGlmIChwYXJhbS50eXBlICE9PSBcIklkZW50aWZpZXJcIikgeyByZXR1cm4gZmFsc2VcbiAgfSB9XG4gIHJldHVybiB0cnVlXG59O1xuXG4vLyBDaGVja3MgZnVuY3Rpb24gcGFyYW1zIGZvciB2YXJpb3VzIGRpc2FsbG93ZWQgcGF0dGVybnMgc3VjaCBhcyB1c2luZyBcImV2YWxcIlxuLy8gb3IgXCJhcmd1bWVudHNcIiBhbmQgZHVwbGljYXRlIHBhcmFtZXRlcnMuXG5cbnBwJDUuY2hlY2tQYXJhbXMgPSBmdW5jdGlvbihub2RlLCBhbGxvd0R1cGxpY2F0ZXMpIHtcbiAgdmFyIG5hbWVIYXNoID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBub2RlLnBhcmFtczsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpXG4gICAge1xuICAgIHZhciBwYXJhbSA9IGxpc3RbaV07XG5cbiAgICB0aGlzLmNoZWNrTFZhbElubmVyUGF0dGVybihwYXJhbSwgQklORF9WQVIsIGFsbG93RHVwbGljYXRlcyA/IG51bGwgOiBuYW1lSGFzaCk7XG4gIH1cbn07XG5cbi8vIFBhcnNlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zLCBhbmQgcmV0dXJucyB0aGVtIGFzXG4vLyBhbiBhcnJheS4gYGNsb3NlYCBpcyB0aGUgdG9rZW4gdHlwZSB0aGF0IGVuZHMgdGhlIGxpc3QsIGFuZFxuLy8gYGFsbG93RW1wdHlgIGNhbiBiZSB0dXJuZWQgb24gdG8gYWxsb3cgc3Vic2VxdWVudCBjb21tYXMgd2l0aFxuLy8gbm90aGluZyBpbiBiZXR3ZWVuIHRoZW0gdG8gYmUgcGFyc2VkIGFzIGBudWxsYCAod2hpY2ggaXMgbmVlZGVkXG4vLyBmb3IgYXJyYXkgbGl0ZXJhbHMpLlxuXG5wcCQ1LnBhcnNlRXhwckxpc3QgPSBmdW5jdGlvbihjbG9zZSwgYWxsb3dUcmFpbGluZ0NvbW1hLCBhbGxvd0VtcHR5LCByZWZEZXN0cnVjdHVyaW5nRXJyb3JzKSB7XG4gIHZhciBlbHRzID0gW10sIGZpcnN0ID0gdHJ1ZTtcbiAgd2hpbGUgKCF0aGlzLmVhdChjbG9zZSkpIHtcbiAgICBpZiAoIWZpcnN0KSB7XG4gICAgICB0aGlzLmV4cGVjdCh0eXBlcyQxLmNvbW1hKTtcbiAgICAgIGlmIChhbGxvd1RyYWlsaW5nQ29tbWEgJiYgdGhpcy5hZnRlclRyYWlsaW5nQ29tbWEoY2xvc2UpKSB7IGJyZWFrIH1cbiAgICB9IGVsc2UgeyBmaXJzdCA9IGZhbHNlOyB9XG5cbiAgICB2YXIgZWx0ID0gKHZvaWQgMCk7XG4gICAgaWYgKGFsbG93RW1wdHkgJiYgdGhpcy50eXBlID09PSB0eXBlcyQxLmNvbW1hKVxuICAgICAgeyBlbHQgPSBudWxsOyB9XG4gICAgZWxzZSBpZiAodGhpcy50eXBlID09PSB0eXBlcyQxLmVsbGlwc2lzKSB7XG4gICAgICBlbHQgPSB0aGlzLnBhcnNlU3ByZWFkKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgICAgaWYgKHJlZkRlc3RydWN0dXJpbmdFcnJvcnMgJiYgdGhpcy50eXBlID09PSB0eXBlcyQxLmNvbW1hICYmIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMudHJhaWxpbmdDb21tYSA8IDApXG4gICAgICAgIHsgcmVmRGVzdHJ1Y3R1cmluZ0Vycm9ycy50cmFpbGluZ0NvbW1hID0gdGhpcy5zdGFydDsgfVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oZmFsc2UsIHJlZkRlc3RydWN0dXJpbmdFcnJvcnMpO1xuICAgIH1cbiAgICBlbHRzLnB1c2goZWx0KTtcbiAgfVxuICByZXR1cm4gZWx0c1xufTtcblxucHAkNS5jaGVja1VucmVzZXJ2ZWQgPSBmdW5jdGlvbihyZWYpIHtcbiAgdmFyIHN0YXJ0ID0gcmVmLnN0YXJ0O1xuICB2YXIgZW5kID0gcmVmLmVuZDtcbiAgdmFyIG5hbWUgPSByZWYubmFtZTtcblxuICBpZiAodGhpcy5pbkdlbmVyYXRvciAmJiBuYW1lID09PSBcInlpZWxkXCIpXG4gICAgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsIFwiQ2Fubm90IHVzZSAneWllbGQnIGFzIGlkZW50aWZpZXIgaW5zaWRlIGEgZ2VuZXJhdG9yXCIpOyB9XG4gIGlmICh0aGlzLmluQXN5bmMgJiYgbmFtZSA9PT0gXCJhd2FpdFwiKVxuICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCBcIkNhbm5vdCB1c2UgJ2F3YWl0JyBhcyBpZGVudGlmaWVyIGluc2lkZSBhbiBhc3luYyBmdW5jdGlvblwiKTsgfVxuICBpZiAodGhpcy5jdXJyZW50VGhpc1Njb3BlKCkuaW5DbGFzc0ZpZWxkSW5pdCAmJiBuYW1lID09PSBcImFyZ3VtZW50c1wiKVxuICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCBcIkNhbm5vdCB1c2UgJ2FyZ3VtZW50cycgaW4gY2xhc3MgZmllbGQgaW5pdGlhbGl6ZXJcIik7IH1cbiAgaWYgKHRoaXMuaW5DbGFzc1N0YXRpY0Jsb2NrICYmIChuYW1lID09PSBcImFyZ3VtZW50c1wiIHx8IG5hbWUgPT09IFwiYXdhaXRcIikpXG4gICAgeyB0aGlzLnJhaXNlKHN0YXJ0LCAoXCJDYW5ub3QgdXNlIFwiICsgbmFtZSArIFwiIGluIGNsYXNzIHN0YXRpYyBpbml0aWFsaXphdGlvbiBibG9ja1wiKSk7IH1cbiAgaWYgKHRoaXMua2V5d29yZHMudGVzdChuYW1lKSlcbiAgICB7IHRoaXMucmFpc2Uoc3RhcnQsIChcIlVuZXhwZWN0ZWQga2V5d29yZCAnXCIgKyBuYW1lICsgXCInXCIpKTsgfVxuICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uIDwgNiAmJlxuICAgIHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQsIGVuZCkuaW5kZXhPZihcIlxcXFxcIikgIT09IC0xKSB7IHJldHVybiB9XG4gIHZhciByZSA9IHRoaXMuc3RyaWN0ID8gdGhpcy5yZXNlcnZlZFdvcmRzU3RyaWN0IDogdGhpcy5yZXNlcnZlZFdvcmRzO1xuICBpZiAocmUudGVzdChuYW1lKSkge1xuICAgIGlmICghdGhpcy5pbkFzeW5jICYmIG5hbWUgPT09IFwiYXdhaXRcIilcbiAgICAgIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHN0YXJ0LCBcIkNhbm5vdCB1c2Uga2V5d29yZCAnYXdhaXQnIG91dHNpZGUgYW4gYXN5bmMgZnVuY3Rpb25cIik7IH1cbiAgICB0aGlzLnJhaXNlUmVjb3ZlcmFibGUoc3RhcnQsIChcIlRoZSBrZXl3b3JkICdcIiArIG5hbWUgKyBcIicgaXMgcmVzZXJ2ZWRcIikpO1xuICB9XG59O1xuXG4vLyBQYXJzZSB0aGUgbmV4dCB0b2tlbiBhcyBhbiBpZGVudGlmaWVyLiBJZiBgbGliZXJhbGAgaXMgdHJ1ZSAodXNlZFxuLy8gd2hlbiBwYXJzaW5nIHByb3BlcnRpZXMpLCBpdCB3aWxsIGFsc28gY29udmVydCBrZXl3b3JkcyBpbnRvXG4vLyBpZGVudGlmaWVycy5cblxucHAkNS5wYXJzZUlkZW50ID0gZnVuY3Rpb24obGliZXJhbCkge1xuICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEubmFtZSkge1xuICAgIG5vZGUubmFtZSA9IHRoaXMudmFsdWU7XG4gIH0gZWxzZSBpZiAodGhpcy50eXBlLmtleXdvcmQpIHtcbiAgICBub2RlLm5hbWUgPSB0aGlzLnR5cGUua2V5d29yZDtcblxuICAgIC8vIFRvIGZpeCBodHRwczovL2dpdGh1Yi5jb20vYWNvcm5qcy9hY29ybi9pc3N1ZXMvNTc1XG4gICAgLy8gYGNsYXNzYCBhbmQgYGZ1bmN0aW9uYCBrZXl3b3JkcyBwdXNoIG5ldyBjb250ZXh0IGludG8gdGhpcy5jb250ZXh0LlxuICAgIC8vIEJ1dCB0aGVyZSBpcyBubyBjaGFuY2UgdG8gcG9wIHRoZSBjb250ZXh0IGlmIHRoZSBrZXl3b3JkIGlzIGNvbnN1bWVkIGFzIGFuIGlkZW50aWZpZXIgc3VjaCBhcyBhIHByb3BlcnR5IG5hbWUuXG4gICAgLy8gSWYgdGhlIHByZXZpb3VzIHRva2VuIGlzIGEgZG90LCB0aGlzIGRvZXMgbm90IGFwcGx5IGJlY2F1c2UgdGhlIGNvbnRleHQtbWFuYWdpbmcgY29kZSBhbHJlYWR5IGlnbm9yZWQgdGhlIGtleXdvcmRcbiAgICBpZiAoKG5vZGUubmFtZSA9PT0gXCJjbGFzc1wiIHx8IG5vZGUubmFtZSA9PT0gXCJmdW5jdGlvblwiKSAmJlxuICAgICAgICAodGhpcy5sYXN0VG9rRW5kICE9PSB0aGlzLmxhc3RUb2tTdGFydCArIDEgfHwgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMubGFzdFRva1N0YXJ0KSAhPT0gNDYpKSB7XG4gICAgICB0aGlzLmNvbnRleHQucG9wKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICB9XG4gIHRoaXMubmV4dCghIWxpYmVyYWwpO1xuICB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJJZGVudGlmaWVyXCIpO1xuICBpZiAoIWxpYmVyYWwpIHtcbiAgICB0aGlzLmNoZWNrVW5yZXNlcnZlZChub2RlKTtcbiAgICBpZiAobm9kZS5uYW1lID09PSBcImF3YWl0XCIgJiYgIXRoaXMuYXdhaXRJZGVudFBvcylcbiAgICAgIHsgdGhpcy5hd2FpdElkZW50UG9zID0gbm9kZS5zdGFydDsgfVxuICB9XG4gIHJldHVybiBub2RlXG59O1xuXG5wcCQ1LnBhcnNlUHJpdmF0ZUlkZW50ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgaWYgKHRoaXMudHlwZSA9PT0gdHlwZXMkMS5wcml2YXRlSWQpIHtcbiAgICBub2RlLm5hbWUgPSB0aGlzLnZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMudW5leHBlY3RlZCgpO1xuICB9XG4gIHRoaXMubmV4dCgpO1xuICB0aGlzLmZpbmlzaE5vZGUobm9kZSwgXCJQcml2YXRlSWRlbnRpZmllclwiKTtcblxuICAvLyBGb3IgdmFsaWRhdGluZyBleGlzdGVuY2VcbiAgaWYgKHRoaXMucHJpdmF0ZU5hbWVTdGFjay5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLnJhaXNlKG5vZGUuc3RhcnQsIChcIlByaXZhdGUgZmllbGQgJyNcIiArIChub2RlLm5hbWUpICsgXCInIG11c3QgYmUgZGVjbGFyZWQgaW4gYW4gZW5jbG9zaW5nIGNsYXNzXCIpKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnByaXZhdGVOYW1lU3RhY2tbdGhpcy5wcml2YXRlTmFtZVN0YWNrLmxlbmd0aCAtIDFdLnVzZWQucHVzaChub2RlKTtcbiAgfVxuXG4gIHJldHVybiBub2RlXG59O1xuXG4vLyBQYXJzZXMgeWllbGQgZXhwcmVzc2lvbiBpbnNpZGUgZ2VuZXJhdG9yLlxuXG5wcCQ1LnBhcnNlWWllbGQgPSBmdW5jdGlvbihmb3JJbml0KSB7XG4gIGlmICghdGhpcy55aWVsZFBvcykgeyB0aGlzLnlpZWxkUG9zID0gdGhpcy5zdGFydDsgfVxuXG4gIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoKTtcbiAgdGhpcy5uZXh0KCk7XG4gIGlmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEuc2VtaSB8fCB0aGlzLmNhbkluc2VydFNlbWljb2xvbigpIHx8ICh0aGlzLnR5cGUgIT09IHR5cGVzJDEuc3RhciAmJiAhdGhpcy50eXBlLnN0YXJ0c0V4cHIpKSB7XG4gICAgbm9kZS5kZWxlZ2F0ZSA9IGZhbHNlO1xuICAgIG5vZGUuYXJndW1lbnQgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIG5vZGUuZGVsZWdhdGUgPSB0aGlzLmVhdCh0eXBlcyQxLnN0YXIpO1xuICAgIG5vZGUuYXJndW1lbnQgPSB0aGlzLnBhcnNlTWF5YmVBc3NpZ24oZm9ySW5pdCk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoTm9kZShub2RlLCBcIllpZWxkRXhwcmVzc2lvblwiKVxufTtcblxucHAkNS5wYXJzZUF3YWl0ID0gZnVuY3Rpb24oZm9ySW5pdCkge1xuICBpZiAoIXRoaXMuYXdhaXRQb3MpIHsgdGhpcy5hd2FpdFBvcyA9IHRoaXMuc3RhcnQ7IH1cblxuICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKCk7XG4gIHRoaXMubmV4dCgpO1xuICBub2RlLmFyZ3VtZW50ID0gdGhpcy5wYXJzZU1heWJlVW5hcnkobnVsbCwgdHJ1ZSwgZmFsc2UsIGZvckluaXQpO1xuICByZXR1cm4gdGhpcy5maW5pc2hOb2RlKG5vZGUsIFwiQXdhaXRFeHByZXNzaW9uXCIpXG59O1xuXG52YXIgcHAkNCA9IFBhcnNlciQxLnByb3RvdHlwZTtcblxuLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJhaXNlIGV4Y2VwdGlvbnMgb24gcGFyc2UgZXJyb3JzLiBJdFxuLy8gdGFrZXMgYW4gb2Zmc2V0IGludGVnZXIgKGludG8gdGhlIGN1cnJlbnQgYGlucHV0YCkgdG8gaW5kaWNhdGVcbi8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IsIGF0dGFjaGVzIHRoZSBwb3NpdGlvbiB0byB0aGUgZW5kXG4vLyBvZiB0aGUgZXJyb3IgbWVzc2FnZSwgYW5kIHRoZW4gcmFpc2VzIGEgYFN5bnRheEVycm9yYCB3aXRoIHRoYXRcbi8vIG1lc3NhZ2UuXG5cbnBwJDQucmFpc2UgPSBmdW5jdGlvbihwb3MsIG1lc3NhZ2UpIHtcbiAgdmFyIGxvYyA9IGdldExpbmVJbmZvKHRoaXMuaW5wdXQsIHBvcyk7XG4gIG1lc3NhZ2UgKz0gXCIgKFwiICsgbG9jLmxpbmUgKyBcIjpcIiArIGxvYy5jb2x1bW4gKyBcIilcIjtcbiAgdmFyIGVyciA9IG5ldyBTeW50YXhFcnJvcihtZXNzYWdlKTtcbiAgZXJyLnBvcyA9IHBvczsgZXJyLmxvYyA9IGxvYzsgZXJyLnJhaXNlZEF0ID0gdGhpcy5wb3M7XG4gIHRocm93IGVyclxufTtcblxucHAkNC5yYWlzZVJlY292ZXJhYmxlID0gcHAkNC5yYWlzZTtcblxucHAkNC5jdXJQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgIHJldHVybiBuZXcgUG9zaXRpb24odGhpcy5jdXJMaW5lLCB0aGlzLnBvcyAtIHRoaXMubGluZVN0YXJ0KVxuICB9XG59O1xuXG52YXIgcHAkMyA9IFBhcnNlciQxLnByb3RvdHlwZTtcblxudmFyIFNjb3BlID0gZnVuY3Rpb24gU2NvcGUoZmxhZ3MpIHtcbiAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICAvLyBBIGxpc3Qgb2YgdmFyLWRlY2xhcmVkIG5hbWVzIGluIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGVcbiAgdGhpcy52YXIgPSBbXTtcbiAgLy8gQSBsaXN0IG9mIGxleGljYWxseS1kZWNsYXJlZCBuYW1lcyBpbiB0aGUgY3VycmVudCBsZXhpY2FsIHNjb3BlXG4gIHRoaXMubGV4aWNhbCA9IFtdO1xuICAvLyBBIGxpc3Qgb2YgbGV4aWNhbGx5LWRlY2xhcmVkIEZ1bmN0aW9uRGVjbGFyYXRpb24gbmFtZXMgaW4gdGhlIGN1cnJlbnQgbGV4aWNhbCBzY29wZVxuICB0aGlzLmZ1bmN0aW9ucyA9IFtdO1xuICAvLyBBIHN3aXRjaCB0byBkaXNhbGxvdyB0aGUgaWRlbnRpZmllciByZWZlcmVuY2UgJ2FyZ3VtZW50cydcbiAgdGhpcy5pbkNsYXNzRmllbGRJbml0ID0gZmFsc2U7XG59O1xuXG4vLyBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGtlZXAgdHJhY2sgb2YgZGVjbGFyZWQgdmFyaWFibGVzIGluIHRoZSBjdXJyZW50IHNjb3BlIGluIG9yZGVyIHRvIGRldGVjdCBkdXBsaWNhdGUgdmFyaWFibGUgbmFtZXMuXG5cbnBwJDMuZW50ZXJTY29wZSA9IGZ1bmN0aW9uKGZsYWdzKSB7XG4gIHRoaXMuc2NvcGVTdGFjay5wdXNoKG5ldyBTY29wZShmbGFncykpO1xufTtcblxucHAkMy5leGl0U2NvcGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zY29wZVN0YWNrLnBvcCgpO1xufTtcblxuLy8gVGhlIHNwZWMgc2F5czpcbi8vID4gQXQgdGhlIHRvcCBsZXZlbCBvZiBhIGZ1bmN0aW9uLCBvciBzY3JpcHQsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBhcmVcbi8vID4gdHJlYXRlZCBsaWtlIHZhciBkZWNsYXJhdGlvbnMgcmF0aGVyIHRoYW4gbGlrZSBsZXhpY2FsIGRlY2xhcmF0aW9ucy5cbnBwJDMudHJlYXRGdW5jdGlvbnNBc1ZhckluU2NvcGUgPSBmdW5jdGlvbihzY29wZSkge1xuICByZXR1cm4gKHNjb3BlLmZsYWdzICYgU0NPUEVfRlVOQ1RJT04pIHx8ICF0aGlzLmluTW9kdWxlICYmIChzY29wZS5mbGFncyAmIFNDT1BFX1RPUClcbn07XG5cbnBwJDMuZGVjbGFyZU5hbWUgPSBmdW5jdGlvbihuYW1lLCBiaW5kaW5nVHlwZSwgcG9zKSB7XG4gIHZhciByZWRlY2xhcmVkID0gZmFsc2U7XG4gIGlmIChiaW5kaW5nVHlwZSA9PT0gQklORF9MRVhJQ0FMKSB7XG4gICAgdmFyIHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGUoKTtcbiAgICByZWRlY2xhcmVkID0gc2NvcGUubGV4aWNhbC5pbmRleE9mKG5hbWUpID4gLTEgfHwgc2NvcGUuZnVuY3Rpb25zLmluZGV4T2YobmFtZSkgPiAtMSB8fCBzY29wZS52YXIuaW5kZXhPZihuYW1lKSA+IC0xO1xuICAgIHNjb3BlLmxleGljYWwucHVzaChuYW1lKTtcbiAgICBpZiAodGhpcy5pbk1vZHVsZSAmJiAoc2NvcGUuZmxhZ3MgJiBTQ09QRV9UT1ApKVxuICAgICAgeyBkZWxldGUgdGhpcy51bmRlZmluZWRFeHBvcnRzW25hbWVdOyB9XG4gIH0gZWxzZSBpZiAoYmluZGluZ1R5cGUgPT09IEJJTkRfU0lNUExFX0NBVENIKSB7XG4gICAgdmFyIHNjb3BlJDEgPSB0aGlzLmN1cnJlbnRTY29wZSgpO1xuICAgIHNjb3BlJDEubGV4aWNhbC5wdXNoKG5hbWUpO1xuICB9IGVsc2UgaWYgKGJpbmRpbmdUeXBlID09PSBCSU5EX0ZVTkNUSU9OKSB7XG4gICAgdmFyIHNjb3BlJDIgPSB0aGlzLmN1cnJlbnRTY29wZSgpO1xuICAgIGlmICh0aGlzLnRyZWF0RnVuY3Rpb25zQXNWYXIpXG4gICAgICB7IHJlZGVjbGFyZWQgPSBzY29wZSQyLmxleGljYWwuaW5kZXhPZihuYW1lKSA+IC0xOyB9XG4gICAgZWxzZVxuICAgICAgeyByZWRlY2xhcmVkID0gc2NvcGUkMi5sZXhpY2FsLmluZGV4T2YobmFtZSkgPiAtMSB8fCBzY29wZSQyLnZhci5pbmRleE9mKG5hbWUpID4gLTE7IH1cbiAgICBzY29wZSQyLmZ1bmN0aW9ucy5wdXNoKG5hbWUpO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSB0aGlzLnNjb3BlU3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHZhciBzY29wZSQzID0gdGhpcy5zY29wZVN0YWNrW2ldO1xuICAgICAgaWYgKHNjb3BlJDMubGV4aWNhbC5pbmRleE9mKG5hbWUpID4gLTEgJiYgISgoc2NvcGUkMy5mbGFncyAmIFNDT1BFX1NJTVBMRV9DQVRDSCkgJiYgc2NvcGUkMy5sZXhpY2FsWzBdID09PSBuYW1lKSB8fFxuICAgICAgICAgICF0aGlzLnRyZWF0RnVuY3Rpb25zQXNWYXJJblNjb3BlKHNjb3BlJDMpICYmIHNjb3BlJDMuZnVuY3Rpb25zLmluZGV4T2YobmFtZSkgPiAtMSkge1xuICAgICAgICByZWRlY2xhcmVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHNjb3BlJDMudmFyLnB1c2gobmFtZSk7XG4gICAgICBpZiAodGhpcy5pbk1vZHVsZSAmJiAoc2NvcGUkMy5mbGFncyAmIFNDT1BFX1RPUCkpXG4gICAgICAgIHsgZGVsZXRlIHRoaXMudW5kZWZpbmVkRXhwb3J0c1tuYW1lXTsgfVxuICAgICAgaWYgKHNjb3BlJDMuZmxhZ3MgJiBTQ09QRV9WQVIpIHsgYnJlYWsgfVxuICAgIH1cbiAgfVxuICBpZiAocmVkZWNsYXJlZCkgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUocG9zLCAoXCJJZGVudGlmaWVyICdcIiArIG5hbWUgKyBcIicgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZFwiKSk7IH1cbn07XG5cbnBwJDMuY2hlY2tMb2NhbEV4cG9ydCA9IGZ1bmN0aW9uKGlkKSB7XG4gIC8vIHNjb3BlLmZ1bmN0aW9ucyBtdXN0IGJlIGVtcHR5IGFzIE1vZHVsZSBjb2RlIGlzIGFsd2F5cyBzdHJpY3QuXG4gIGlmICh0aGlzLnNjb3BlU3RhY2tbMF0ubGV4aWNhbC5pbmRleE9mKGlkLm5hbWUpID09PSAtMSAmJlxuICAgICAgdGhpcy5zY29wZVN0YWNrWzBdLnZhci5pbmRleE9mKGlkLm5hbWUpID09PSAtMSkge1xuICAgIHRoaXMudW5kZWZpbmVkRXhwb3J0c1tpZC5uYW1lXSA9IGlkO1xuICB9XG59O1xuXG5wcCQzLmN1cnJlbnRTY29wZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zY29wZVN0YWNrW3RoaXMuc2NvcGVTdGFjay5sZW5ndGggLSAxXVxufTtcblxucHAkMy5jdXJyZW50VmFyU2NvcGUgPSBmdW5jdGlvbigpIHtcbiAgZm9yICh2YXIgaSA9IHRoaXMuc2NvcGVTdGFjay5sZW5ndGggLSAxOzsgaS0tKSB7XG4gICAgdmFyIHNjb3BlID0gdGhpcy5zY29wZVN0YWNrW2ldO1xuICAgIGlmIChzY29wZS5mbGFncyAmIFNDT1BFX1ZBUikgeyByZXR1cm4gc2NvcGUgfVxuICB9XG59O1xuXG4vLyBDb3VsZCBiZSB1c2VmdWwgZm9yIGB0aGlzYCwgYG5ldy50YXJnZXRgLCBgc3VwZXIoKWAsIGBzdXBlci5wcm9wZXJ0eWAsIGFuZCBgc3VwZXJbcHJvcGVydHldYC5cbnBwJDMuY3VycmVudFRoaXNTY29wZSA9IGZ1bmN0aW9uKCkge1xuICBmb3IgKHZhciBpID0gdGhpcy5zY29wZVN0YWNrLmxlbmd0aCAtIDE7OyBpLS0pIHtcbiAgICB2YXIgc2NvcGUgPSB0aGlzLnNjb3BlU3RhY2tbaV07XG4gICAgaWYgKHNjb3BlLmZsYWdzICYgU0NPUEVfVkFSICYmICEoc2NvcGUuZmxhZ3MgJiBTQ09QRV9BUlJPVykpIHsgcmV0dXJuIHNjb3BlIH1cbiAgfVxufTtcblxudmFyIE5vZGUgPSBmdW5jdGlvbiBOb2RlKHBhcnNlciwgcG9zLCBsb2MpIHtcbiAgdGhpcy50eXBlID0gXCJcIjtcbiAgdGhpcy5zdGFydCA9IHBvcztcbiAgdGhpcy5lbmQgPSAwO1xuICBpZiAocGFyc2VyLm9wdGlvbnMubG9jYXRpb25zKVxuICAgIHsgdGhpcy5sb2MgPSBuZXcgU291cmNlTG9jYXRpb24ocGFyc2VyLCBsb2MpOyB9XG4gIGlmIChwYXJzZXIub3B0aW9ucy5kaXJlY3RTb3VyY2VGaWxlKVxuICAgIHsgdGhpcy5zb3VyY2VGaWxlID0gcGFyc2VyLm9wdGlvbnMuZGlyZWN0U291cmNlRmlsZTsgfVxuICBpZiAocGFyc2VyLm9wdGlvbnMucmFuZ2VzKVxuICAgIHsgdGhpcy5yYW5nZSA9IFtwb3MsIDBdOyB9XG59O1xuXG4vLyBTdGFydCBhbiBBU1Qgbm9kZSwgYXR0YWNoaW5nIGEgc3RhcnQgb2Zmc2V0LlxuXG52YXIgcHAkMiA9IFBhcnNlciQxLnByb3RvdHlwZTtcblxucHAkMi5zdGFydE5vZGUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIHRoaXMuc3RhcnQsIHRoaXMuc3RhcnRMb2MpXG59O1xuXG5wcCQyLnN0YXJ0Tm9kZUF0ID0gZnVuY3Rpb24ocG9zLCBsb2MpIHtcbiAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIHBvcywgbG9jKVxufTtcblxuLy8gRmluaXNoIGFuIEFTVCBub2RlLCBhZGRpbmcgYHR5cGVgIGFuZCBgZW5kYCBwcm9wZXJ0aWVzLlxuXG5mdW5jdGlvbiBmaW5pc2hOb2RlQXQobm9kZSwgdHlwZSwgcG9zLCBsb2MpIHtcbiAgbm9kZS50eXBlID0gdHlwZTtcbiAgbm9kZS5lbmQgPSBwb3M7XG4gIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKVxuICAgIHsgbm9kZS5sb2MuZW5kID0gbG9jOyB9XG4gIGlmICh0aGlzLm9wdGlvbnMucmFuZ2VzKVxuICAgIHsgbm9kZS5yYW5nZVsxXSA9IHBvczsgfVxuICByZXR1cm4gbm9kZVxufVxuXG5wcCQyLmZpbmlzaE5vZGUgPSBmdW5jdGlvbihub2RlLCB0eXBlKSB7XG4gIHJldHVybiBmaW5pc2hOb2RlQXQuY2FsbCh0aGlzLCBub2RlLCB0eXBlLCB0aGlzLmxhc3RUb2tFbmQsIHRoaXMubGFzdFRva0VuZExvYylcbn07XG5cbi8vIEZpbmlzaCBub2RlIGF0IGdpdmVuIHBvc2l0aW9uXG5cbnBwJDIuZmluaXNoTm9kZUF0ID0gZnVuY3Rpb24obm9kZSwgdHlwZSwgcG9zLCBsb2MpIHtcbiAgcmV0dXJuIGZpbmlzaE5vZGVBdC5jYWxsKHRoaXMsIG5vZGUsIHR5cGUsIHBvcywgbG9jKVxufTtcblxucHAkMi5jb3B5Tm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdmFyIG5ld05vZGUgPSBuZXcgTm9kZSh0aGlzLCBub2RlLnN0YXJ0LCB0aGlzLnN0YXJ0TG9jKTtcbiAgZm9yICh2YXIgcHJvcCBpbiBub2RlKSB7IG5ld05vZGVbcHJvcF0gPSBub2RlW3Byb3BdOyB9XG4gIHJldHVybiBuZXdOb2RlXG59O1xuXG4vLyBUaGlzIGZpbGUgY29udGFpbnMgVW5pY29kZSBwcm9wZXJ0aWVzIGV4dHJhY3RlZCBmcm9tIHRoZSBFQ01BU2NyaXB0IHNwZWNpZmljYXRpb24uXG4vLyBUaGUgbGlzdHMgYXJlIGV4dHJhY3RlZCBsaWtlIHNvOlxuLy8gJCQoJyN0YWJsZS1iaW5hcnktdW5pY29kZS1wcm9wZXJ0aWVzID4gZmlndXJlID4gdGFibGUgPiB0Ym9keSA+IHRyID4gdGQ6bnRoLWNoaWxkKDEpIGNvZGUnKS5tYXAoZWwgPT4gZWwuaW5uZXJUZXh0KVxuXG4vLyAjdGFibGUtYmluYXJ5LXVuaWNvZGUtcHJvcGVydGllc1xudmFyIGVjbWE5QmluYXJ5UHJvcGVydGllcyA9IFwiQVNDSUkgQVNDSUlfSGV4X0RpZ2l0IEFIZXggQWxwaGFiZXRpYyBBbHBoYSBBbnkgQXNzaWduZWQgQmlkaV9Db250cm9sIEJpZGlfQyBCaWRpX01pcnJvcmVkIEJpZGlfTSBDYXNlX0lnbm9yYWJsZSBDSSBDYXNlZCBDaGFuZ2VzX1doZW5fQ2FzZWZvbGRlZCBDV0NGIENoYW5nZXNfV2hlbl9DYXNlbWFwcGVkIENXQ00gQ2hhbmdlc19XaGVuX0xvd2VyY2FzZWQgQ1dMIENoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWQgQ1dLQ0YgQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWQgQ1dUIENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkIENXVSBEYXNoIERlZmF1bHRfSWdub3JhYmxlX0NvZGVfUG9pbnQgREkgRGVwcmVjYXRlZCBEZXAgRGlhY3JpdGljIERpYSBFbW9qaSBFbW9qaV9Db21wb25lbnQgRW1vamlfTW9kaWZpZXIgRW1vamlfTW9kaWZpZXJfQmFzZSBFbW9qaV9QcmVzZW50YXRpb24gRXh0ZW5kZXIgRXh0IEdyYXBoZW1lX0Jhc2UgR3JfQmFzZSBHcmFwaGVtZV9FeHRlbmQgR3JfRXh0IEhleF9EaWdpdCBIZXggSURTX0JpbmFyeV9PcGVyYXRvciBJRFNCIElEU19UcmluYXJ5X09wZXJhdG9yIElEU1QgSURfQ29udGludWUgSURDIElEX1N0YXJ0IElEUyBJZGVvZ3JhcGhpYyBJZGVvIEpvaW5fQ29udHJvbCBKb2luX0MgTG9naWNhbF9PcmRlcl9FeGNlcHRpb24gTE9FIExvd2VyY2FzZSBMb3dlciBNYXRoIE5vbmNoYXJhY3Rlcl9Db2RlX1BvaW50IE5DaGFyIFBhdHRlcm5fU3ludGF4IFBhdF9TeW4gUGF0dGVybl9XaGl0ZV9TcGFjZSBQYXRfV1MgUXVvdGF0aW9uX01hcmsgUU1hcmsgUmFkaWNhbCBSZWdpb25hbF9JbmRpY2F0b3IgUkkgU2VudGVuY2VfVGVybWluYWwgU1Rlcm0gU29mdF9Eb3R0ZWQgU0QgVGVybWluYWxfUHVuY3R1YXRpb24gVGVybSBVbmlmaWVkX0lkZW9ncmFwaCBVSWRlbyBVcHBlcmNhc2UgVXBwZXIgVmFyaWF0aW9uX1NlbGVjdG9yIFZTIFdoaXRlX1NwYWNlIHNwYWNlIFhJRF9Db250aW51ZSBYSURDIFhJRF9TdGFydCBYSURTXCI7XG52YXIgZWNtYTEwQmluYXJ5UHJvcGVydGllcyA9IGVjbWE5QmluYXJ5UHJvcGVydGllcyArIFwiIEV4dGVuZGVkX1BpY3RvZ3JhcGhpY1wiO1xudmFyIGVjbWExMUJpbmFyeVByb3BlcnRpZXMgPSBlY21hMTBCaW5hcnlQcm9wZXJ0aWVzO1xudmFyIGVjbWExMkJpbmFyeVByb3BlcnRpZXMgPSBlY21hMTFCaW5hcnlQcm9wZXJ0aWVzICsgXCIgRUJhc2UgRUNvbXAgRU1vZCBFUHJlcyBFeHRQaWN0XCI7XG52YXIgZWNtYTEzQmluYXJ5UHJvcGVydGllcyA9IGVjbWExMkJpbmFyeVByb3BlcnRpZXM7XG52YXIgZWNtYTE0QmluYXJ5UHJvcGVydGllcyA9IGVjbWExM0JpbmFyeVByb3BlcnRpZXM7XG5cbnZhciB1bmljb2RlQmluYXJ5UHJvcGVydGllcyA9IHtcbiAgOTogZWNtYTlCaW5hcnlQcm9wZXJ0aWVzLFxuICAxMDogZWNtYTEwQmluYXJ5UHJvcGVydGllcyxcbiAgMTE6IGVjbWExMUJpbmFyeVByb3BlcnRpZXMsXG4gIDEyOiBlY21hMTJCaW5hcnlQcm9wZXJ0aWVzLFxuICAxMzogZWNtYTEzQmluYXJ5UHJvcGVydGllcyxcbiAgMTQ6IGVjbWExNEJpbmFyeVByb3BlcnRpZXNcbn07XG5cbi8vICN0YWJsZS11bmljb2RlLWdlbmVyYWwtY2F0ZWdvcnktdmFsdWVzXG52YXIgdW5pY29kZUdlbmVyYWxDYXRlZ29yeVZhbHVlcyA9IFwiQ2FzZWRfTGV0dGVyIExDIENsb3NlX1B1bmN0dWF0aW9uIFBlIENvbm5lY3Rvcl9QdW5jdHVhdGlvbiBQYyBDb250cm9sIENjIGNudHJsIEN1cnJlbmN5X1N5bWJvbCBTYyBEYXNoX1B1bmN0dWF0aW9uIFBkIERlY2ltYWxfTnVtYmVyIE5kIGRpZ2l0IEVuY2xvc2luZ19NYXJrIE1lIEZpbmFsX1B1bmN0dWF0aW9uIFBmIEZvcm1hdCBDZiBJbml0aWFsX1B1bmN0dWF0aW9uIFBpIExldHRlciBMIExldHRlcl9OdW1iZXIgTmwgTGluZV9TZXBhcmF0b3IgWmwgTG93ZXJjYXNlX0xldHRlciBMbCBNYXJrIE0gQ29tYmluaW5nX01hcmsgTWF0aF9TeW1ib2wgU20gTW9kaWZpZXJfTGV0dGVyIExtIE1vZGlmaWVyX1N5bWJvbCBTayBOb25zcGFjaW5nX01hcmsgTW4gTnVtYmVyIE4gT3Blbl9QdW5jdHVhdGlvbiBQcyBPdGhlciBDIE90aGVyX0xldHRlciBMbyBPdGhlcl9OdW1iZXIgTm8gT3RoZXJfUHVuY3R1YXRpb24gUG8gT3RoZXJfU3ltYm9sIFNvIFBhcmFncmFwaF9TZXBhcmF0b3IgWnAgUHJpdmF0ZV9Vc2UgQ28gUHVuY3R1YXRpb24gUCBwdW5jdCBTZXBhcmF0b3IgWiBTcGFjZV9TZXBhcmF0b3IgWnMgU3BhY2luZ19NYXJrIE1jIFN1cnJvZ2F0ZSBDcyBTeW1ib2wgUyBUaXRsZWNhc2VfTGV0dGVyIEx0IFVuYXNzaWduZWQgQ24gVXBwZXJjYXNlX0xldHRlciBMdVwiO1xuXG4vLyAjdGFibGUtdW5pY29kZS1zY3JpcHQtdmFsdWVzXG52YXIgZWNtYTlTY3JpcHRWYWx1ZXMgPSBcIkFkbGFtIEFkbG0gQWhvbSBBbmF0b2xpYW5fSGllcm9nbHlwaHMgSGx1dyBBcmFiaWMgQXJhYiBBcm1lbmlhbiBBcm1uIEF2ZXN0YW4gQXZzdCBCYWxpbmVzZSBCYWxpIEJhbXVtIEJhbXUgQmFzc2FfVmFoIEJhc3MgQmF0YWsgQmF0ayBCZW5nYWxpIEJlbmcgQmhhaWtzdWtpIEJoa3MgQm9wb21vZm8gQm9wbyBCcmFobWkgQnJhaCBCcmFpbGxlIEJyYWkgQnVnaW5lc2UgQnVnaSBCdWhpZCBCdWhkIENhbmFkaWFuX0Fib3JpZ2luYWwgQ2FucyBDYXJpYW4gQ2FyaSBDYXVjYXNpYW5fQWxiYW5pYW4gQWdoYiBDaGFrbWEgQ2FrbSBDaGFtIENoYW0gQ2hlcm9rZWUgQ2hlciBDb21tb24gWnl5eSBDb3B0aWMgQ29wdCBRYWFjIEN1bmVpZm9ybSBYc3V4IEN5cHJpb3QgQ3BydCBDeXJpbGxpYyBDeXJsIERlc2VyZXQgRHNydCBEZXZhbmFnYXJpIERldmEgRHVwbG95YW4gRHVwbCBFZ3lwdGlhbl9IaWVyb2dseXBocyBFZ3lwIEVsYmFzYW4gRWxiYSBFdGhpb3BpYyBFdGhpIEdlb3JnaWFuIEdlb3IgR2xhZ29saXRpYyBHbGFnIEdvdGhpYyBHb3RoIEdyYW50aGEgR3JhbiBHcmVlayBHcmVrIEd1amFyYXRpIEd1anIgR3VybXVraGkgR3VydSBIYW4gSGFuaSBIYW5ndWwgSGFuZyBIYW51bm9vIEhhbm8gSGF0cmFuIEhhdHIgSGVicmV3IEhlYnIgSGlyYWdhbmEgSGlyYSBJbXBlcmlhbF9BcmFtYWljIEFybWkgSW5oZXJpdGVkIFppbmggUWFhaSBJbnNjcmlwdGlvbmFsX1BhaGxhdmkgUGhsaSBJbnNjcmlwdGlvbmFsX1BhcnRoaWFuIFBydGkgSmF2YW5lc2UgSmF2YSBLYWl0aGkgS3RoaSBLYW5uYWRhIEtuZGEgS2F0YWthbmEgS2FuYSBLYXlhaF9MaSBLYWxpIEtoYXJvc2h0aGkgS2hhciBLaG1lciBLaG1yIEtob2praSBLaG9qIEtodWRhd2FkaSBTaW5kIExhbyBMYW9vIExhdGluIExhdG4gTGVwY2hhIExlcGMgTGltYnUgTGltYiBMaW5lYXJfQSBMaW5hIExpbmVhcl9CIExpbmIgTGlzdSBMaXN1IEx5Y2lhbiBMeWNpIEx5ZGlhbiBMeWRpIE1haGFqYW5pIE1haGogTWFsYXlhbGFtIE1seW0gTWFuZGFpYyBNYW5kIE1hbmljaGFlYW4gTWFuaSBNYXJjaGVuIE1hcmMgTWFzYXJhbV9Hb25kaSBHb25tIE1lZXRlaV9NYXllayBNdGVpIE1lbmRlX0tpa2FrdWkgTWVuZCBNZXJvaXRpY19DdXJzaXZlIE1lcmMgTWVyb2l0aWNfSGllcm9nbHlwaHMgTWVybyBNaWFvIFBscmQgTW9kaSBNb25nb2xpYW4gTW9uZyBNcm8gTXJvbyBNdWx0YW5pIE11bHQgTXlhbm1hciBNeW1yIE5hYmF0YWVhbiBOYmF0IE5ld19UYWlfTHVlIFRhbHUgTmV3YSBOZXdhIE5rbyBOa29vIE51c2h1IE5zaHUgT2doYW0gT2dhbSBPbF9DaGlraSBPbGNrIE9sZF9IdW5nYXJpYW4gSHVuZyBPbGRfSXRhbGljIEl0YWwgT2xkX05vcnRoX0FyYWJpYW4gTmFyYiBPbGRfUGVybWljIFBlcm0gT2xkX1BlcnNpYW4gWHBlbyBPbGRfU291dGhfQXJhYmlhbiBTYXJiIE9sZF9UdXJraWMgT3JraCBPcml5YSBPcnlhIE9zYWdlIE9zZ2UgT3NtYW55YSBPc21hIFBhaGF3aF9IbW9uZyBIbW5nIFBhbG15cmVuZSBQYWxtIFBhdV9DaW5fSGF1IFBhdWMgUGhhZ3NfUGEgUGhhZyBQaG9lbmljaWFuIFBobnggUHNhbHRlcl9QYWhsYXZpIFBobHAgUmVqYW5nIFJqbmcgUnVuaWMgUnVuciBTYW1hcml0YW4gU2FtciBTYXVyYXNodHJhIFNhdXIgU2hhcmFkYSBTaHJkIFNoYXZpYW4gU2hhdyBTaWRkaGFtIFNpZGQgU2lnbldyaXRpbmcgU2dudyBTaW5oYWxhIFNpbmggU29yYV9Tb21wZW5nIFNvcmEgU295b21ibyBTb3lvIFN1bmRhbmVzZSBTdW5kIFN5bG90aV9OYWdyaSBTeWxvIFN5cmlhYyBTeXJjIFRhZ2Fsb2cgVGdsZyBUYWdiYW53YSBUYWdiIFRhaV9MZSBUYWxlIFRhaV9UaGFtIExhbmEgVGFpX1ZpZXQgVGF2dCBUYWtyaSBUYWtyIFRhbWlsIFRhbWwgVGFuZ3V0IFRhbmcgVGVsdWd1IFRlbHUgVGhhYW5hIFRoYWEgVGhhaSBUaGFpIFRpYmV0YW4gVGlidCBUaWZpbmFnaCBUZm5nIFRpcmh1dGEgVGlyaCBVZ2FyaXRpYyBVZ2FyIFZhaSBWYWlpIFdhcmFuZ19DaXRpIFdhcmEgWWkgWWlpaSBaYW5hYmF6YXJfU3F1YXJlIFphbmJcIjtcbnZhciBlY21hMTBTY3JpcHRWYWx1ZXMgPSBlY21hOVNjcmlwdFZhbHVlcyArIFwiIERvZ3JhIERvZ3IgR3VuamFsYV9Hb25kaSBHb25nIEhhbmlmaV9Sb2hpbmd5YSBSb2hnIE1ha2FzYXIgTWFrYSBNZWRlZmFpZHJpbiBNZWRmIE9sZF9Tb2dkaWFuIFNvZ28gU29nZGlhbiBTb2dkXCI7XG52YXIgZWNtYTExU2NyaXB0VmFsdWVzID0gZWNtYTEwU2NyaXB0VmFsdWVzICsgXCIgRWx5bWFpYyBFbHltIE5hbmRpbmFnYXJpIE5hbmQgTnlpYWtlbmdfUHVhY2h1ZV9IbW9uZyBIbW5wIFdhbmNobyBXY2hvXCI7XG52YXIgZWNtYTEyU2NyaXB0VmFsdWVzID0gZWNtYTExU2NyaXB0VmFsdWVzICsgXCIgQ2hvcmFzbWlhbiBDaHJzIERpYWsgRGl2ZXNfQWt1cnUgS2hpdGFuX1NtYWxsX1NjcmlwdCBLaXRzIFllemkgWWV6aWRpXCI7XG52YXIgZWNtYTEzU2NyaXB0VmFsdWVzID0gZWNtYTEyU2NyaXB0VmFsdWVzICsgXCIgQ3lwcm9fTWlub2FuIENwbW4gT2xkX1V5Z2h1ciBPdWdyIFRhbmdzYSBUbnNhIFRvdG8gVml0aGt1cWkgVml0aFwiO1xudmFyIGVjbWExNFNjcmlwdFZhbHVlcyA9IGVjbWExM1NjcmlwdFZhbHVlcyArIFwiIEthd2kgTmFnX011bmRhcmkgTmFnbVwiO1xuXG52YXIgdW5pY29kZVNjcmlwdFZhbHVlcyA9IHtcbiAgOTogZWNtYTlTY3JpcHRWYWx1ZXMsXG4gIDEwOiBlY21hMTBTY3JpcHRWYWx1ZXMsXG4gIDExOiBlY21hMTFTY3JpcHRWYWx1ZXMsXG4gIDEyOiBlY21hMTJTY3JpcHRWYWx1ZXMsXG4gIDEzOiBlY21hMTNTY3JpcHRWYWx1ZXMsXG4gIDE0OiBlY21hMTRTY3JpcHRWYWx1ZXNcbn07XG5cbnZhciBkYXRhID0ge307XG5mdW5jdGlvbiBidWlsZFVuaWNvZGVEYXRhKGVjbWFWZXJzaW9uKSB7XG4gIHZhciBkID0gZGF0YVtlY21hVmVyc2lvbl0gPSB7XG4gICAgYmluYXJ5OiB3b3Jkc1JlZ2V4cCh1bmljb2RlQmluYXJ5UHJvcGVydGllc1tlY21hVmVyc2lvbl0gKyBcIiBcIiArIHVuaWNvZGVHZW5lcmFsQ2F0ZWdvcnlWYWx1ZXMpLFxuICAgIG5vbkJpbmFyeToge1xuICAgICAgR2VuZXJhbF9DYXRlZ29yeTogd29yZHNSZWdleHAodW5pY29kZUdlbmVyYWxDYXRlZ29yeVZhbHVlcyksXG4gICAgICBTY3JpcHQ6IHdvcmRzUmVnZXhwKHVuaWNvZGVTY3JpcHRWYWx1ZXNbZWNtYVZlcnNpb25dKVxuICAgIH1cbiAgfTtcbiAgZC5ub25CaW5hcnkuU2NyaXB0X0V4dGVuc2lvbnMgPSBkLm5vbkJpbmFyeS5TY3JpcHQ7XG5cbiAgZC5ub25CaW5hcnkuZ2MgPSBkLm5vbkJpbmFyeS5HZW5lcmFsX0NhdGVnb3J5O1xuICBkLm5vbkJpbmFyeS5zYyA9IGQubm9uQmluYXJ5LlNjcmlwdDtcbiAgZC5ub25CaW5hcnkuc2N4ID0gZC5ub25CaW5hcnkuU2NyaXB0X0V4dGVuc2lvbnM7XG59XG5cbmZvciAodmFyIGkkMSA9IDAsIGxpc3QgPSBbOSwgMTAsIDExLCAxMiwgMTMsIDE0XTsgaSQxIDwgbGlzdC5sZW5ndGg7IGkkMSArPSAxKSB7XG4gIHZhciBlY21hVmVyc2lvbiA9IGxpc3RbaSQxXTtcblxuICBidWlsZFVuaWNvZGVEYXRhKGVjbWFWZXJzaW9uKTtcbn1cblxudmFyIHBwJDEgPSBQYXJzZXIkMS5wcm90b3R5cGU7XG5cbnZhciBSZWdFeHBWYWxpZGF0aW9uU3RhdGUgPSBmdW5jdGlvbiBSZWdFeHBWYWxpZGF0aW9uU3RhdGUocGFyc2VyKSB7XG4gIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICB0aGlzLnZhbGlkRmxhZ3MgPSBcImdpbVwiICsgKHBhcnNlci5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYgPyBcInV5XCIgOiBcIlwiKSArIChwYXJzZXIub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5ID8gXCJzXCIgOiBcIlwiKSArIChwYXJzZXIub3B0aW9ucy5lY21hVmVyc2lvbiA+PSAxMyA/IFwiZFwiIDogXCJcIik7XG4gIHRoaXMudW5pY29kZVByb3BlcnRpZXMgPSBkYXRhW3BhcnNlci5vcHRpb25zLmVjbWFWZXJzaW9uID49IDE0ID8gMTQgOiBwYXJzZXIub3B0aW9ucy5lY21hVmVyc2lvbl07XG4gIHRoaXMuc291cmNlID0gXCJcIjtcbiAgdGhpcy5mbGFncyA9IFwiXCI7XG4gIHRoaXMuc3RhcnQgPSAwO1xuICB0aGlzLnN3aXRjaFUgPSBmYWxzZTtcbiAgdGhpcy5zd2l0Y2hOID0gZmFsc2U7XG4gIHRoaXMucG9zID0gMDtcbiAgdGhpcy5sYXN0SW50VmFsdWUgPSAwO1xuICB0aGlzLmxhc3RTdHJpbmdWYWx1ZSA9IFwiXCI7XG4gIHRoaXMubGFzdEFzc2VydGlvbklzUXVhbnRpZmlhYmxlID0gZmFsc2U7XG4gIHRoaXMubnVtQ2FwdHVyaW5nUGFyZW5zID0gMDtcbiAgdGhpcy5tYXhCYWNrUmVmZXJlbmNlID0gMDtcbiAgdGhpcy5ncm91cE5hbWVzID0gW107XG4gIHRoaXMuYmFja1JlZmVyZW5jZU5hbWVzID0gW107XG59O1xuXG5SZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQgKHN0YXJ0LCBwYXR0ZXJuLCBmbGFncykge1xuICB2YXIgdW5pY29kZSA9IGZsYWdzLmluZGV4T2YoXCJ1XCIpICE9PSAtMTtcbiAgdGhpcy5zdGFydCA9IHN0YXJ0IHwgMDtcbiAgdGhpcy5zb3VyY2UgPSBwYXR0ZXJuICsgXCJcIjtcbiAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICB0aGlzLnN3aXRjaFUgPSB1bmljb2RlICYmIHRoaXMucGFyc2VyLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNjtcbiAgdGhpcy5zd2l0Y2hOID0gdW5pY29kZSAmJiB0aGlzLnBhcnNlci5vcHRpb25zLmVjbWFWZXJzaW9uID49IDk7XG59O1xuXG5SZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLnJhaXNlID0gZnVuY3Rpb24gcmFpc2UgKG1lc3NhZ2UpIHtcbiAgdGhpcy5wYXJzZXIucmFpc2VSZWNvdmVyYWJsZSh0aGlzLnN0YXJ0LCAoXCJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbjogL1wiICsgKHRoaXMuc291cmNlKSArIFwiLzogXCIgKyBtZXNzYWdlKSk7XG59O1xuXG4vLyBJZiB1IGZsYWcgaXMgZ2l2ZW4sIHRoaXMgcmV0dXJucyB0aGUgY29kZSBwb2ludCBhdCB0aGUgaW5kZXggKGl0IGNvbWJpbmVzIGEgc3Vycm9nYXRlIHBhaXIpLlxuLy8gT3RoZXJ3aXNlLCB0aGlzIHJldHVybnMgdGhlIGNvZGUgdW5pdCBvZiB0aGUgaW5kZXggKGNhbiBiZSBhIHBhcnQgb2YgYSBzdXJyb2dhdGUgcGFpcikuXG5SZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24gYXQgKGksIGZvcmNlVSkge1xuICAgIGlmICggZm9yY2VVID09PSB2b2lkIDAgKSBmb3JjZVUgPSBmYWxzZTtcblxuICB2YXIgcyA9IHRoaXMuc291cmNlO1xuICB2YXIgbCA9IHMubGVuZ3RoO1xuICBpZiAoaSA+PSBsKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgdmFyIGMgPSBzLmNoYXJDb2RlQXQoaSk7XG4gIGlmICghKGZvcmNlVSB8fCB0aGlzLnN3aXRjaFUpIHx8IGMgPD0gMHhEN0ZGIHx8IGMgPj0gMHhFMDAwIHx8IGkgKyAxID49IGwpIHtcbiAgICByZXR1cm4gY1xuICB9XG4gIHZhciBuZXh0ID0gcy5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgcmV0dXJuIG5leHQgPj0gMHhEQzAwICYmIG5leHQgPD0gMHhERkZGID8gKGMgPDwgMTApICsgbmV4dCAtIDB4MzVGREMwMCA6IGNcbn07XG5cblJlZ0V4cFZhbGlkYXRpb25TdGF0ZS5wcm90b3R5cGUubmV4dEluZGV4ID0gZnVuY3Rpb24gbmV4dEluZGV4IChpLCBmb3JjZVUpIHtcbiAgICBpZiAoIGZvcmNlVSA9PT0gdm9pZCAwICkgZm9yY2VVID0gZmFsc2U7XG5cbiAgdmFyIHMgPSB0aGlzLnNvdXJjZTtcbiAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgaWYgKGkgPj0gbCkge1xuICAgIHJldHVybiBsXG4gIH1cbiAgdmFyIGMgPSBzLmNoYXJDb2RlQXQoaSksIG5leHQ7XG4gIGlmICghKGZvcmNlVSB8fCB0aGlzLnN3aXRjaFUpIHx8IGMgPD0gMHhEN0ZGIHx8IGMgPj0gMHhFMDAwIHx8IGkgKyAxID49IGwgfHxcbiAgICAgIChuZXh0ID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweERDMDAgfHwgbmV4dCA+IDB4REZGRikge1xuICAgIHJldHVybiBpICsgMVxuICB9XG4gIHJldHVybiBpICsgMlxufTtcblxuUmVnRXhwVmFsaWRhdGlvblN0YXRlLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24gY3VycmVudCAoZm9yY2VVKSB7XG4gICAgaWYgKCBmb3JjZVUgPT09IHZvaWQgMCApIGZvcmNlVSA9IGZhbHNlO1xuXG4gIHJldHVybiB0aGlzLmF0KHRoaXMucG9zLCBmb3JjZVUpXG59O1xuXG5SZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLmxvb2thaGVhZCA9IGZ1bmN0aW9uIGxvb2thaGVhZCAoZm9yY2VVKSB7XG4gICAgaWYgKCBmb3JjZVUgPT09IHZvaWQgMCApIGZvcmNlVSA9IGZhbHNlO1xuXG4gIHJldHVybiB0aGlzLmF0KHRoaXMubmV4dEluZGV4KHRoaXMucG9zLCBmb3JjZVUpLCBmb3JjZVUpXG59O1xuXG5SZWdFeHBWYWxpZGF0aW9uU3RhdGUucHJvdG90eXBlLmFkdmFuY2UgPSBmdW5jdGlvbiBhZHZhbmNlIChmb3JjZVUpIHtcbiAgICBpZiAoIGZvcmNlVSA9PT0gdm9pZCAwICkgZm9yY2VVID0gZmFsc2U7XG5cbiAgdGhpcy5wb3MgPSB0aGlzLm5leHRJbmRleCh0aGlzLnBvcywgZm9yY2VVKTtcbn07XG5cblJlZ0V4cFZhbGlkYXRpb25TdGF0ZS5wcm90b3R5cGUuZWF0ID0gZnVuY3Rpb24gZWF0IChjaCwgZm9yY2VVKSB7XG4gICAgaWYgKCBmb3JjZVUgPT09IHZvaWQgMCApIGZvcmNlVSA9IGZhbHNlO1xuXG4gIGlmICh0aGlzLmN1cnJlbnQoZm9yY2VVKSA9PT0gY2gpIHtcbiAgICB0aGlzLmFkdmFuY2UoZm9yY2VVKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGUgZmxhZ3MgcGFydCBvZiBhIGdpdmVuIFJlZ0V4cExpdGVyYWwuXG4gKlxuICogQHBhcmFtIHtSZWdFeHBWYWxpZGF0aW9uU3RhdGV9IHN0YXRlIFRoZSBzdGF0ZSB0byB2YWxpZGF0ZSBSZWdFeHAuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xucHAkMS52YWxpZGF0ZVJlZ0V4cEZsYWdzID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHZhbGlkRmxhZ3MgPSBzdGF0ZS52YWxpZEZsYWdzO1xuICB2YXIgZmxhZ3MgPSBzdGF0ZS5mbGFncztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGZsYWcgPSBmbGFncy5jaGFyQXQoaSk7XG4gICAgaWYgKHZhbGlkRmxhZ3MuaW5kZXhPZihmbGFnKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMucmFpc2Uoc3RhdGUuc3RhcnQsIFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ1wiKTtcbiAgICB9XG4gICAgaWYgKGZsYWdzLmluZGV4T2YoZmxhZywgaSArIDEpID4gLTEpIHtcbiAgICAgIHRoaXMucmFpc2Uoc3RhdGUuc3RhcnQsIFwiRHVwbGljYXRlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFnXCIpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGUgcGF0dGVybiBwYXJ0IG9mIGEgZ2l2ZW4gUmVnRXhwTGl0ZXJhbC5cbiAqXG4gKiBAcGFyYW0ge1JlZ0V4cFZhbGlkYXRpb25TdGF0ZX0gc3RhdGUgVGhlIHN0YXRlIHRvIHZhbGlkYXRlIFJlZ0V4cC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5wcCQxLnZhbGlkYXRlUmVnRXhwUGF0dGVybiA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHRoaXMucmVnZXhwX3BhdHRlcm4oc3RhdGUpO1xuXG4gIC8vIFRoZSBnb2FsIHN5bWJvbCBmb3IgdGhlIHBhcnNlIGlzIHxQYXR0ZXJuW35VLCB+Tl18LiBJZiB0aGUgcmVzdWx0IG9mXG4gIC8vIHBhcnNpbmcgY29udGFpbnMgYSB8R3JvdXBOYW1lfCwgcmVwYXJzZSB3aXRoIHRoZSBnb2FsIHN5bWJvbFxuICAvLyB8UGF0dGVyblt+VSwgK05dfCBhbmQgdXNlIHRoaXMgcmVzdWx0IGluc3RlYWQuIFRocm93IGEgKlN5bnRheEVycm9yKlxuICAvLyBleGNlcHRpb24gaWYgX1BfIGRpZCBub3QgY29uZm9ybSB0byB0aGUgZ3JhbW1hciwgaWYgYW55IGVsZW1lbnRzIG9mIF9QX1xuICAvLyB3ZXJlIG5vdCBtYXRjaGVkIGJ5IHRoZSBwYXJzZSwgb3IgaWYgYW55IEVhcmx5IEVycm9yIGNvbmRpdGlvbnMgZXhpc3QuXG4gIGlmICghc3RhdGUuc3dpdGNoTiAmJiB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSAmJiBzdGF0ZS5ncm91cE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBzdGF0ZS5zd2l0Y2hOID0gdHJ1ZTtcbiAgICB0aGlzLnJlZ2V4cF9wYXR0ZXJuKHN0YXRlKTtcbiAgfVxufTtcblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtUGF0dGVyblxucHAkMS5yZWdleHBfcGF0dGVybiA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHN0YXRlLnBvcyA9IDA7XG4gIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSA9IFwiXCI7XG4gIHN0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZSA9IGZhbHNlO1xuICBzdGF0ZS5udW1DYXB0dXJpbmdQYXJlbnMgPSAwO1xuICBzdGF0ZS5tYXhCYWNrUmVmZXJlbmNlID0gMDtcbiAgc3RhdGUuZ3JvdXBOYW1lcy5sZW5ndGggPSAwO1xuICBzdGF0ZS5iYWNrUmVmZXJlbmNlTmFtZXMubGVuZ3RoID0gMDtcblxuICB0aGlzLnJlZ2V4cF9kaXNqdW5jdGlvbihzdGF0ZSk7XG5cbiAgaWYgKHN0YXRlLnBvcyAhPT0gc3RhdGUuc291cmNlLmxlbmd0aCkge1xuICAgIC8vIE1ha2UgdGhlIHNhbWUgbWVzc2FnZXMgYXMgVjguXG4gICAgaWYgKHN0YXRlLmVhdCgweDI5IC8qICkgKi8pKSB7XG4gICAgICBzdGF0ZS5yYWlzZShcIlVubWF0Y2hlZCAnKSdcIik7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5lYXQoMHg1RCAvKiBdICovKSB8fCBzdGF0ZS5lYXQoMHg3RCAvKiB9ICovKSkge1xuICAgICAgc3RhdGUucmFpc2UoXCJMb25lIHF1YW50aWZpZXIgYnJhY2tldHNcIik7XG4gICAgfVxuICB9XG4gIGlmIChzdGF0ZS5tYXhCYWNrUmVmZXJlbmNlID4gc3RhdGUubnVtQ2FwdHVyaW5nUGFyZW5zKSB7XG4gICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGVzY2FwZVwiKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IHN0YXRlLmJhY2tSZWZlcmVuY2VOYW1lczsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgbmFtZSA9IGxpc3RbaV07XG5cbiAgICBpZiAoc3RhdGUuZ3JvdXBOYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIG5hbWVkIGNhcHR1cmUgcmVmZXJlbmNlZFwiKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLURpc2p1bmN0aW9uXG5wcCQxLnJlZ2V4cF9kaXNqdW5jdGlvbiA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHRoaXMucmVnZXhwX2FsdGVybmF0aXZlKHN0YXRlKTtcbiAgd2hpbGUgKHN0YXRlLmVhdCgweDdDIC8qIHwgKi8pKSB7XG4gICAgdGhpcy5yZWdleHBfYWx0ZXJuYXRpdmUoc3RhdGUpO1xuICB9XG5cbiAgLy8gTWFrZSB0aGUgc2FtZSBtZXNzYWdlIGFzIFY4LlxuICBpZiAodGhpcy5yZWdleHBfZWF0UXVhbnRpZmllcihzdGF0ZSwgdHJ1ZSkpIHtcbiAgICBzdGF0ZS5yYWlzZShcIk5vdGhpbmcgdG8gcmVwZWF0XCIpO1xuICB9XG4gIGlmIChzdGF0ZS5lYXQoMHg3QiAvKiB7ICovKSkge1xuICAgIHN0YXRlLnJhaXNlKFwiTG9uZSBxdWFudGlmaWVyIGJyYWNrZXRzXCIpO1xuICB9XG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1BbHRlcm5hdGl2ZVxucHAkMS5yZWdleHBfYWx0ZXJuYXRpdmUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB3aGlsZSAoc3RhdGUucG9zIDwgc3RhdGUuc291cmNlLmxlbmd0aCAmJiB0aGlzLnJlZ2V4cF9lYXRUZXJtKHN0YXRlKSlcbiAgICB7IH1cbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLWFubmV4Qi1UZXJtXG5wcCQxLnJlZ2V4cF9lYXRUZXJtID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgaWYgKHRoaXMucmVnZXhwX2VhdEFzc2VydGlvbihzdGF0ZSkpIHtcbiAgICAvLyBIYW5kbGUgYFF1YW50aWZpYWJsZUFzc2VydGlvbiBRdWFudGlmaWVyYCBhbHRlcm5hdGl2ZS5cbiAgICAvLyBgc3RhdGUubGFzdEFzc2VydGlvbklzUXVhbnRpZmlhYmxlYCBpcyB0cnVlIGlmIHRoZSBsYXN0IGVhdGVuIEFzc2VydGlvblxuICAgIC8vIGlzIGEgUXVhbnRpZmlhYmxlQXNzZXJ0aW9uLlxuICAgIGlmIChzdGF0ZS5sYXN0QXNzZXJ0aW9uSXNRdWFudGlmaWFibGUgJiYgdGhpcy5yZWdleHBfZWF0UXVhbnRpZmllcihzdGF0ZSkpIHtcbiAgICAgIC8vIE1ha2UgdGhlIHNhbWUgbWVzc2FnZSBhcyBWOC5cbiAgICAgIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBxdWFudGlmaWVyXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHN0YXRlLnN3aXRjaFUgPyB0aGlzLnJlZ2V4cF9lYXRBdG9tKHN0YXRlKSA6IHRoaXMucmVnZXhwX2VhdEV4dGVuZGVkQXRvbShzdGF0ZSkpIHtcbiAgICB0aGlzLnJlZ2V4cF9lYXRRdWFudGlmaWVyKHN0YXRlKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItQXNzZXJ0aW9uXG5wcCQxLnJlZ2V4cF9lYXRBc3NlcnRpb24gPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gIHN0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZSA9IGZhbHNlO1xuXG4gIC8vIF4sICRcbiAgaWYgKHN0YXRlLmVhdCgweDVFIC8qIF4gKi8pIHx8IHN0YXRlLmVhdCgweDI0IC8qICQgKi8pKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIFxcYiBcXEJcbiAgaWYgKHN0YXRlLmVhdCgweDVDIC8qIFxcICovKSkge1xuICAgIGlmIChzdGF0ZS5lYXQoMHg0MiAvKiBCICovKSB8fCBzdGF0ZS5lYXQoMHg2MiAvKiBiICovKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gIH1cblxuICAvLyBMb29rYWhlYWQgLyBMb29rYmVoaW5kXG4gIGlmIChzdGF0ZS5lYXQoMHgyOCAvKiAoICovKSAmJiBzdGF0ZS5lYXQoMHgzRiAvKiA/ICovKSkge1xuICAgIHZhciBsb29rYmVoaW5kID0gZmFsc2U7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA5KSB7XG4gICAgICBsb29rYmVoaW5kID0gc3RhdGUuZWF0KDB4M0MgLyogPCAqLyk7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5lYXQoMHgzRCAvKiA9ICovKSB8fCBzdGF0ZS5lYXQoMHgyMSAvKiAhICovKSkge1xuICAgICAgdGhpcy5yZWdleHBfZGlzanVuY3Rpb24oc3RhdGUpO1xuICAgICAgaWYgKCFzdGF0ZS5lYXQoMHgyOSAvKiApICovKSkge1xuICAgICAgICBzdGF0ZS5yYWlzZShcIlVudGVybWluYXRlZCBncm91cFwiKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxhc3RBc3NlcnRpb25Jc1F1YW50aWZpYWJsZSA9ICFsb29rYmVoaW5kO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1RdWFudGlmaWVyXG5wcCQxLnJlZ2V4cF9lYXRRdWFudGlmaWVyID0gZnVuY3Rpb24oc3RhdGUsIG5vRXJyb3IpIHtcbiAgaWYgKCBub0Vycm9yID09PSB2b2lkIDAgKSBub0Vycm9yID0gZmFsc2U7XG5cbiAgaWYgKHRoaXMucmVnZXhwX2VhdFF1YW50aWZpZXJQcmVmaXgoc3RhdGUsIG5vRXJyb3IpKSB7XG4gICAgc3RhdGUuZWF0KDB4M0YgLyogPyAqLyk7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLVF1YW50aWZpZXJQcmVmaXhcbnBwJDEucmVnZXhwX2VhdFF1YW50aWZpZXJQcmVmaXggPSBmdW5jdGlvbihzdGF0ZSwgbm9FcnJvcikge1xuICByZXR1cm4gKFxuICAgIHN0YXRlLmVhdCgweDJBIC8qICogKi8pIHx8XG4gICAgc3RhdGUuZWF0KDB4MkIgLyogKyAqLykgfHxcbiAgICBzdGF0ZS5lYXQoMHgzRiAvKiA/ICovKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdEJyYWNlZFF1YW50aWZpZXIoc3RhdGUsIG5vRXJyb3IpXG4gIClcbn07XG5wcCQxLnJlZ2V4cF9lYXRCcmFjZWRRdWFudGlmaWVyID0gZnVuY3Rpb24oc3RhdGUsIG5vRXJyb3IpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICBpZiAoc3RhdGUuZWF0KDB4N0IgLyogeyAqLykpIHtcbiAgICB2YXIgbWluID0gMCwgbWF4ID0gLTE7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdERlY2ltYWxEaWdpdHMoc3RhdGUpKSB7XG4gICAgICBtaW4gPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgICBpZiAoc3RhdGUuZWF0KDB4MkMgLyogLCAqLykgJiYgdGhpcy5yZWdleHBfZWF0RGVjaW1hbERpZ2l0cyhzdGF0ZSkpIHtcbiAgICAgICAgbWF4ID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmVhdCgweDdEIC8qIH0gKi8pKSB7XG4gICAgICAgIC8vIFN5bnRheEVycm9yIGluIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNzZWMtdGVybVxuICAgICAgICBpZiAobWF4ICE9PSAtMSAmJiBtYXggPCBtaW4gJiYgIW5vRXJyb3IpIHtcbiAgICAgICAgICBzdGF0ZS5yYWlzZShcIm51bWJlcnMgb3V0IG9mIG9yZGVyIGluIHt9IHF1YW50aWZpZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXRlLnN3aXRjaFUgJiYgIW5vRXJyb3IpIHtcbiAgICAgIHN0YXRlLnJhaXNlKFwiSW5jb21wbGV0ZSBxdWFudGlmaWVyXCIpO1xuICAgIH1cbiAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUF0b21cbnBwJDEucmVnZXhwX2VhdEF0b20gPSBmdW5jdGlvbihzdGF0ZSkge1xuICByZXR1cm4gKFxuICAgIHRoaXMucmVnZXhwX2VhdFBhdHRlcm5DaGFyYWN0ZXJzKHN0YXRlKSB8fFxuICAgIHN0YXRlLmVhdCgweDJFIC8qIC4gKi8pIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0UmV2ZXJzZVNvbGlkdXNBdG9tRXNjYXBlKHN0YXRlKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdENoYXJhY3RlckNsYXNzKHN0YXRlKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdFVuY2FwdHVyaW5nR3JvdXAoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0Q2FwdHVyaW5nR3JvdXAoc3RhdGUpXG4gIClcbn07XG5wcCQxLnJlZ2V4cF9lYXRSZXZlcnNlU29saWR1c0F0b21Fc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gIGlmIChzdGF0ZS5lYXQoMHg1QyAvKiBcXCAqLykpIHtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0QXRvbUVzY2FwZShzdGF0ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICB9XG4gIHJldHVybiBmYWxzZVxufTtcbnBwJDEucmVnZXhwX2VhdFVuY2FwdHVyaW5nR3JvdXAgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gIGlmIChzdGF0ZS5lYXQoMHgyOCAvKiAoICovKSkge1xuICAgIGlmIChzdGF0ZS5lYXQoMHgzRiAvKiA/ICovKSAmJiBzdGF0ZS5lYXQoMHgzQSAvKiA6ICovKSkge1xuICAgICAgdGhpcy5yZWdleHBfZGlzanVuY3Rpb24oc3RhdGUpO1xuICAgICAgaWYgKHN0YXRlLmVhdCgweDI5IC8qICkgKi8pKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBzdGF0ZS5yYWlzZShcIlVudGVybWluYXRlZCBncm91cFwiKTtcbiAgICB9XG4gICAgc3RhdGUucG9zID0gc3RhcnQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xucHAkMS5yZWdleHBfZWF0Q2FwdHVyaW5nR3JvdXAgPSBmdW5jdGlvbihzdGF0ZSkge1xuICBpZiAoc3RhdGUuZWF0KDB4MjggLyogKCAqLykpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkpIHtcbiAgICAgIHRoaXMucmVnZXhwX2dyb3VwU3BlY2lmaWVyKHN0YXRlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmN1cnJlbnQoKSA9PT0gMHgzRiAvKiA/ICovKSB7XG4gICAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgZ3JvdXBcIik7XG4gICAgfVxuICAgIHRoaXMucmVnZXhwX2Rpc2p1bmN0aW9uKHN0YXRlKTtcbiAgICBpZiAoc3RhdGUuZWF0KDB4MjkgLyogKSAqLykpIHtcbiAgICAgIHN0YXRlLm51bUNhcHR1cmluZ1BhcmVucyArPSAxO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgc3RhdGUucmFpc2UoXCJVbnRlcm1pbmF0ZWQgZ3JvdXBcIik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItRXh0ZW5kZWRBdG9tXG5wcCQxLnJlZ2V4cF9lYXRFeHRlbmRlZEF0b20gPSBmdW5jdGlvbihzdGF0ZSkge1xuICByZXR1cm4gKFxuICAgIHN0YXRlLmVhdCgweDJFIC8qIC4gKi8pIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0UmV2ZXJzZVNvbGlkdXNBdG9tRXNjYXBlKHN0YXRlKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdENoYXJhY3RlckNsYXNzKHN0YXRlKSB8fFxuICAgIHRoaXMucmVnZXhwX2VhdFVuY2FwdHVyaW5nR3JvdXAoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0Q2FwdHVyaW5nR3JvdXAoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0SW52YWxpZEJyYWNlZFF1YW50aWZpZXIoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0RXh0ZW5kZWRQYXR0ZXJuQ2hhcmFjdGVyKHN0YXRlKVxuICApXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItSW52YWxpZEJyYWNlZFF1YW50aWZpZXJcbnBwJDEucmVnZXhwX2VhdEludmFsaWRCcmFjZWRRdWFudGlmaWVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgaWYgKHRoaXMucmVnZXhwX2VhdEJyYWNlZFF1YW50aWZpZXIoc3RhdGUsIHRydWUpKSB7XG4gICAgc3RhdGUucmFpc2UoXCJOb3RoaW5nIHRvIHJlcGVhdFwiKTtcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLVN5bnRheENoYXJhY3RlclxucHAkMS5yZWdleHBfZWF0U3ludGF4Q2hhcmFjdGVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICBpZiAoaXNTeW50YXhDaGFyYWN0ZXIoY2gpKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gY2g7XG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuZnVuY3Rpb24gaXNTeW50YXhDaGFyYWN0ZXIoY2gpIHtcbiAgcmV0dXJuIChcbiAgICBjaCA9PT0gMHgyNCAvKiAkICovIHx8XG4gICAgY2ggPj0gMHgyOCAvKiAoICovICYmIGNoIDw9IDB4MkIgLyogKyAqLyB8fFxuICAgIGNoID09PSAweDJFIC8qIC4gKi8gfHxcbiAgICBjaCA9PT0gMHgzRiAvKiA/ICovIHx8XG4gICAgY2ggPj0gMHg1QiAvKiBbICovICYmIGNoIDw9IDB4NUUgLyogXiAqLyB8fFxuICAgIGNoID49IDB4N0IgLyogeyAqLyAmJiBjaCA8PSAweDdEIC8qIH0gKi9cbiAgKVxufVxuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1QYXR0ZXJuQ2hhcmFjdGVyXG4vLyBCdXQgZWF0IGVhZ2VyLlxucHAkMS5yZWdleHBfZWF0UGF0dGVybkNoYXJhY3RlcnMgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gIHZhciBjaCA9IDA7XG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5jdXJyZW50KCkpICE9PSAtMSAmJiAhaXNTeW50YXhDaGFyYWN0ZXIoY2gpKSB7XG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICB9XG4gIHJldHVybiBzdGF0ZS5wb3MgIT09IHN0YXJ0XG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItRXh0ZW5kZWRQYXR0ZXJuQ2hhcmFjdGVyXG5wcCQxLnJlZ2V4cF9lYXRFeHRlbmRlZFBhdHRlcm5DaGFyYWN0ZXIgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gIGlmIChcbiAgICBjaCAhPT0gLTEgJiZcbiAgICBjaCAhPT0gMHgyNCAvKiAkICovICYmXG4gICAgIShjaCA+PSAweDI4IC8qICggKi8gJiYgY2ggPD0gMHgyQiAvKiArICovKSAmJlxuICAgIGNoICE9PSAweDJFIC8qIC4gKi8gJiZcbiAgICBjaCAhPT0gMHgzRiAvKiA/ICovICYmXG4gICAgY2ggIT09IDB4NUIgLyogWyAqLyAmJlxuICAgIGNoICE9PSAweDVFIC8qIF4gKi8gJiZcbiAgICBjaCAhPT0gMHg3QyAvKiB8ICovXG4gICkge1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufTtcblxuLy8gR3JvdXBTcGVjaWZpZXIgOjpcbi8vICAgW2VtcHR5XVxuLy8gICBgP2AgR3JvdXBOYW1lXG5wcCQxLnJlZ2V4cF9ncm91cFNwZWNpZmllciA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lYXQoMHgzRiAvKiA/ICovKSkge1xuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRHcm91cE5hbWUoc3RhdGUpKSB7XG4gICAgICBpZiAoc3RhdGUuZ3JvdXBOYW1lcy5pbmRleE9mKHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSkgIT09IC0xKSB7XG4gICAgICAgIHN0YXRlLnJhaXNlKFwiRHVwbGljYXRlIGNhcHR1cmUgZ3JvdXAgbmFtZVwiKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmdyb3VwTmFtZXMucHVzaChzdGF0ZS5sYXN0U3RyaW5nVmFsdWUpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBncm91cFwiKTtcbiAgfVxufTtcblxuLy8gR3JvdXBOYW1lIDo6XG4vLyAgIGA8YCBSZWdFeHBJZGVudGlmaWVyTmFtZSBgPmBcbi8vIE5vdGU6IHRoaXMgdXBkYXRlcyBgc3RhdGUubGFzdFN0cmluZ1ZhbHVlYCBwcm9wZXJ0eSB3aXRoIHRoZSBlYXRlbiBuYW1lLlxucHAkMS5yZWdleHBfZWF0R3JvdXBOYW1lID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlID0gXCJcIjtcbiAgaWYgKHN0YXRlLmVhdCgweDNDIC8qIDwgKi8pKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdFJlZ0V4cElkZW50aWZpZXJOYW1lKHN0YXRlKSAmJiBzdGF0ZS5lYXQoMHgzRSAvKiA+ICovKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGNhcHR1cmUgZ3JvdXAgbmFtZVwiKTtcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIFJlZ0V4cElkZW50aWZpZXJOYW1lIDo6XG4vLyAgIFJlZ0V4cElkZW50aWZpZXJTdGFydFxuLy8gICBSZWdFeHBJZGVudGlmaWVyTmFtZSBSZWdFeHBJZGVudGlmaWVyUGFydFxuLy8gTm90ZTogdGhpcyB1cGRhdGVzIGBzdGF0ZS5sYXN0U3RyaW5nVmFsdWVgIHByb3BlcnR5IHdpdGggdGhlIGVhdGVuIG5hbWUuXG5wcCQxLnJlZ2V4cF9lYXRSZWdFeHBJZGVudGlmaWVyTmFtZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSA9IFwiXCI7XG4gIGlmICh0aGlzLnJlZ2V4cF9lYXRSZWdFeHBJZGVudGlmaWVyU3RhcnQoc3RhdGUpKSB7XG4gICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlICs9IGNvZGVQb2ludFRvU3RyaW5nKHN0YXRlLmxhc3RJbnRWYWx1ZSk7XG4gICAgd2hpbGUgKHRoaXMucmVnZXhwX2VhdFJlZ0V4cElkZW50aWZpZXJQYXJ0KHN0YXRlKSkge1xuICAgICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlICs9IGNvZGVQb2ludFRvU3RyaW5nKHN0YXRlLmxhc3RJbnRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBSZWdFeHBJZGVudGlmaWVyU3RhcnQgOjpcbi8vICAgVW5pY29kZUlEU3RhcnRcbi8vICAgYCRgXG4vLyAgIGBfYFxuLy8gICBgXFxgIFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZVsrVV1cbnBwJDEucmVnZXhwX2VhdFJlZ0V4cElkZW50aWZpZXJTdGFydCA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgdmFyIGZvcmNlVSA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSAxMTtcbiAgdmFyIGNoID0gc3RhdGUuY3VycmVudChmb3JjZVUpO1xuICBzdGF0ZS5hZHZhbmNlKGZvcmNlVSk7XG5cbiAgaWYgKGNoID09PSAweDVDIC8qIFxcICovICYmIHRoaXMucmVnZXhwX2VhdFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZShzdGF0ZSwgZm9yY2VVKSkge1xuICAgIGNoID0gc3RhdGUubGFzdEludFZhbHVlO1xuICB9XG4gIGlmIChpc1JlZ0V4cElkZW50aWZpZXJTdGFydChjaCkpIHtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBjaDtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc3RhdGUucG9zID0gc3RhcnQ7XG4gIHJldHVybiBmYWxzZVxufTtcbmZ1bmN0aW9uIGlzUmVnRXhwSWRlbnRpZmllclN0YXJ0KGNoKSB7XG4gIHJldHVybiBpc0lkZW50aWZpZXJTdGFydChjaCwgdHJ1ZSkgfHwgY2ggPT09IDB4MjQgLyogJCAqLyB8fCBjaCA9PT0gMHg1RiAvKiBfICovXG59XG5cbi8vIFJlZ0V4cElkZW50aWZpZXJQYXJ0IDo6XG4vLyAgIFVuaWNvZGVJRENvbnRpbnVlXG4vLyAgIGAkYFxuLy8gICBgX2Bcbi8vICAgYFxcYCBSZWdFeHBVbmljb2RlRXNjYXBlU2VxdWVuY2VbK1VdXG4vLyAgIDxaV05KPlxuLy8gICA8WldKPlxucHAkMS5yZWdleHBfZWF0UmVnRXhwSWRlbnRpZmllclBhcnQgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gIHZhciBmb3JjZVUgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTE7XG4gIHZhciBjaCA9IHN0YXRlLmN1cnJlbnQoZm9yY2VVKTtcbiAgc3RhdGUuYWR2YW5jZShmb3JjZVUpO1xuXG4gIGlmIChjaCA9PT0gMHg1QyAvKiBcXCAqLyAmJiB0aGlzLnJlZ2V4cF9lYXRSZWdFeHBVbmljb2RlRXNjYXBlU2VxdWVuY2Uoc3RhdGUsIGZvcmNlVSkpIHtcbiAgICBjaCA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgfVxuICBpZiAoaXNSZWdFeHBJZGVudGlmaWVyUGFydChjaCkpIHtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBjaDtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc3RhdGUucG9zID0gc3RhcnQ7XG4gIHJldHVybiBmYWxzZVxufTtcbmZ1bmN0aW9uIGlzUmVnRXhwSWRlbnRpZmllclBhcnQoY2gpIHtcbiAgcmV0dXJuIGlzSWRlbnRpZmllckNoYXIoY2gsIHRydWUpIHx8IGNoID09PSAweDI0IC8qICQgKi8gfHwgY2ggPT09IDB4NUYgLyogXyAqLyB8fCBjaCA9PT0gMHgyMDBDIC8qIDxaV05KPiAqLyB8fCBjaCA9PT0gMHgyMDBEIC8qIDxaV0o+ICovXG59XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLWFubmV4Qi1BdG9tRXNjYXBlXG5wcCQxLnJlZ2V4cF9lYXRBdG9tRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgaWYgKFxuICAgIHRoaXMucmVnZXhwX2VhdEJhY2tSZWZlcmVuY2Uoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3NFc2NhcGUoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyRXNjYXBlKHN0YXRlKSB8fFxuICAgIChzdGF0ZS5zd2l0Y2hOICYmIHRoaXMucmVnZXhwX2VhdEtHcm91cE5hbWUoc3RhdGUpKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgLy8gTWFrZSB0aGUgc2FtZSBtZXNzYWdlIGFzIFY4LlxuICAgIGlmIChzdGF0ZS5jdXJyZW50KCkgPT09IDB4NjMgLyogYyAqLykge1xuICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIHVuaWNvZGUgZXNjYXBlXCIpO1xuICAgIH1cbiAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgZXNjYXBlXCIpO1xuICB9XG4gIHJldHVybiBmYWxzZVxufTtcbnBwJDEucmVnZXhwX2VhdEJhY2tSZWZlcmVuY2UgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG4gIGlmICh0aGlzLnJlZ2V4cF9lYXREZWNpbWFsRXNjYXBlKHN0YXRlKSkge1xuICAgIHZhciBuID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgICAvLyBGb3IgU3ludGF4RXJyb3IgaW4gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3NlYy1hdG9tZXNjYXBlXG4gICAgICBpZiAobiA+IHN0YXRlLm1heEJhY2tSZWZlcmVuY2UpIHtcbiAgICAgICAgc3RhdGUubWF4QmFja1JlZmVyZW5jZSA9IG47XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAobiA8PSBzdGF0ZS5udW1DYXB0dXJpbmdQYXJlbnMpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICB9XG4gIHJldHVybiBmYWxzZVxufTtcbnBwJDEucmVnZXhwX2VhdEtHcm91cE5hbWUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICBpZiAoc3RhdGUuZWF0KDB4NkIgLyogayAqLykpIHtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0R3JvdXBOYW1lKHN0YXRlKSkge1xuICAgICAgc3RhdGUuYmFja1JlZmVyZW5jZU5hbWVzLnB1c2goc3RhdGUubGFzdFN0cmluZ1ZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBuYW1lZCByZWZlcmVuY2VcIik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItQ2hhcmFjdGVyRXNjYXBlXG5wcCQxLnJlZ2V4cF9lYXRDaGFyYWN0ZXJFc2NhcGUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICByZXR1cm4gKFxuICAgIHRoaXMucmVnZXhwX2VhdENvbnRyb2xFc2NhcGUoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0Q0NvbnRyb2xMZXR0ZXIoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0WmVybyhzdGF0ZSkgfHxcbiAgICB0aGlzLnJlZ2V4cF9lYXRIZXhFc2NhcGVTZXF1ZW5jZShzdGF0ZSkgfHxcbiAgICB0aGlzLnJlZ2V4cF9lYXRSZWdFeHBVbmljb2RlRXNjYXBlU2VxdWVuY2Uoc3RhdGUsIGZhbHNlKSB8fFxuICAgICghc3RhdGUuc3dpdGNoVSAmJiB0aGlzLnJlZ2V4cF9lYXRMZWdhY3lPY3RhbEVzY2FwZVNlcXVlbmNlKHN0YXRlKSkgfHxcbiAgICB0aGlzLnJlZ2V4cF9lYXRJZGVudGl0eUVzY2FwZShzdGF0ZSlcbiAgKVxufTtcbnBwJDEucmVnZXhwX2VhdENDb250cm9sTGV0dGVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICBpZiAoc3RhdGUuZWF0KDB4NjMgLyogYyAqLykpIHtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0Q29udHJvbExldHRlcihzdGF0ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICB9XG4gIHJldHVybiBmYWxzZVxufTtcbnBwJDEucmVnZXhwX2VhdFplcm8gPSBmdW5jdGlvbihzdGF0ZSkge1xuICBpZiAoc3RhdGUuY3VycmVudCgpID09PSAweDMwIC8qIDAgKi8gJiYgIWlzRGVjaW1hbERpZ2l0KHN0YXRlLmxvb2thaGVhZCgpKSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1Db250cm9sRXNjYXBlXG5wcCQxLnJlZ2V4cF9lYXRDb250cm9sRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICBpZiAoY2ggPT09IDB4NzQgLyogdCAqLykge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDB4MDk7IC8qIFxcdCAqL1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmIChjaCA9PT0gMHg2RSAvKiBuICovKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gMHgwQTsgLyogXFxuICovXG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKGNoID09PSAweDc2IC8qIHYgKi8pIHtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDBCOyAvKiBcXHYgKi9cbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAoY2ggPT09IDB4NjYgLyogZiAqLykge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDB4MEM7IC8qIFxcZiAqL1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmIChjaCA9PT0gMHg3MiAvKiByICovKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gMHgwRDsgLyogXFxyICovXG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1Db250cm9sTGV0dGVyXG5wcCQxLnJlZ2V4cF9lYXRDb250cm9sTGV0dGVyID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICBpZiAoaXNDb250cm9sTGV0dGVyKGNoKSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoICUgMHgyMDtcbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5mdW5jdGlvbiBpc0NvbnRyb2xMZXR0ZXIoY2gpIHtcbiAgcmV0dXJuIChcbiAgICAoY2ggPj0gMHg0MSAvKiBBICovICYmIGNoIDw9IDB4NUEgLyogWiAqLykgfHxcbiAgICAoY2ggPj0gMHg2MSAvKiBhICovICYmIGNoIDw9IDB4N0EgLyogeiAqLylcbiAgKVxufVxuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1SZWdFeHBVbmljb2RlRXNjYXBlU2VxdWVuY2VcbnBwJDEucmVnZXhwX2VhdFJlZ0V4cFVuaWNvZGVFc2NhcGVTZXF1ZW5jZSA9IGZ1bmN0aW9uKHN0YXRlLCBmb3JjZVUpIHtcbiAgaWYgKCBmb3JjZVUgPT09IHZvaWQgMCApIGZvcmNlVSA9IGZhbHNlO1xuXG4gIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgdmFyIHN3aXRjaFUgPSBmb3JjZVUgfHwgc3RhdGUuc3dpdGNoVTtcblxuICBpZiAoc3RhdGUuZWF0KDB4NzUgLyogdSAqLykpIHtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0Rml4ZWRIZXhEaWdpdHMoc3RhdGUsIDQpKSB7XG4gICAgICB2YXIgbGVhZCA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgICAgIGlmIChzd2l0Y2hVICYmIGxlYWQgPj0gMHhEODAwICYmIGxlYWQgPD0gMHhEQkZGKSB7XG4gICAgICAgIHZhciBsZWFkU3Vycm9nYXRlRW5kID0gc3RhdGUucG9zO1xuICAgICAgICBpZiAoc3RhdGUuZWF0KDB4NUMgLyogXFwgKi8pICYmIHN0YXRlLmVhdCgweDc1IC8qIHUgKi8pICYmIHRoaXMucmVnZXhwX2VhdEZpeGVkSGV4RGlnaXRzKHN0YXRlLCA0KSkge1xuICAgICAgICAgIHZhciB0cmFpbCA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgICAgICAgICBpZiAodHJhaWwgPj0gMHhEQzAwICYmIHRyYWlsIDw9IDB4REZGRikge1xuICAgICAgICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gKGxlYWQgLSAweEQ4MDApICogMHg0MDAgKyAodHJhaWwgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnBvcyA9IGxlYWRTdXJyb2dhdGVFbmQ7XG4gICAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGxlYWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBzd2l0Y2hVICYmXG4gICAgICBzdGF0ZS5lYXQoMHg3QiAvKiB7ICovKSAmJlxuICAgICAgdGhpcy5yZWdleHBfZWF0SGV4RGlnaXRzKHN0YXRlKSAmJlxuICAgICAgc3RhdGUuZWF0KDB4N0QgLyogfSAqLykgJiZcbiAgICAgIGlzVmFsaWRVbmljb2RlKHN0YXRlLmxhc3RJbnRWYWx1ZSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChzd2l0Y2hVKSB7XG4gICAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgdW5pY29kZSBlc2NhcGVcIik7XG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59O1xuZnVuY3Rpb24gaXNWYWxpZFVuaWNvZGUoY2gpIHtcbiAgcmV0dXJuIGNoID49IDAgJiYgY2ggPD0gMHgxMEZGRkZcbn1cblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtYW5uZXhCLUlkZW50aXR5RXNjYXBlXG5wcCQxLnJlZ2V4cF9lYXRJZGVudGl0eUVzY2FwZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5zd2l0Y2hVKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdFN5bnRheENoYXJhY3RlcihzdGF0ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZS5lYXQoMHgyRiAvKiAvICovKSkge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gMHgyRjsgLyogLyAqL1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gIGlmIChjaCAhPT0gMHg2MyAvKiBjICovICYmICghc3RhdGUuc3dpdGNoTiB8fCBjaCAhPT0gMHg2QiAvKiBrICovKSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1EZWNpbWFsRXNjYXBlXG5wcCQxLnJlZ2V4cF9lYXREZWNpbWFsRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgc3RhdGUubGFzdEludFZhbHVlID0gMDtcbiAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICBpZiAoY2ggPj0gMHgzMSAvKiAxICovICYmIGNoIDw9IDB4MzkgLyogOSAqLykge1xuICAgIGRvIHtcbiAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDEwICogc3RhdGUubGFzdEludFZhbHVlICsgKGNoIC0gMHgzMCAvKiAwICovKTtcbiAgICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICB9IHdoaWxlICgoY2ggPSBzdGF0ZS5jdXJyZW50KCkpID49IDB4MzAgLyogMCAqLyAmJiBjaCA8PSAweDM5IC8qIDkgKi8pXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUNoYXJhY3RlckNsYXNzRXNjYXBlXG5wcCQxLnJlZ2V4cF9lYXRDaGFyYWN0ZXJDbGFzc0VzY2FwZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBjaCA9IHN0YXRlLmN1cnJlbnQoKTtcblxuICBpZiAoaXNDaGFyYWN0ZXJDbGFzc0VzY2FwZShjaCkpIHtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAtMTtcbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChcbiAgICBzdGF0ZS5zd2l0Y2hVICYmXG4gICAgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDkgJiZcbiAgICAoY2ggPT09IDB4NTAgLyogUCAqLyB8fCBjaCA9PT0gMHg3MCAvKiBwICovKVxuICApIHtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAtMTtcbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgaWYgKFxuICAgICAgc3RhdGUuZWF0KDB4N0IgLyogeyAqLykgJiZcbiAgICAgIHRoaXMucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eVZhbHVlRXhwcmVzc2lvbihzdGF0ZSkgJiZcbiAgICAgIHN0YXRlLmVhdCgweDdEIC8qIH0gKi8pXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgcHJvcGVydHkgbmFtZVwiKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufTtcbmZ1bmN0aW9uIGlzQ2hhcmFjdGVyQ2xhc3NFc2NhcGUoY2gpIHtcbiAgcmV0dXJuIChcbiAgICBjaCA9PT0gMHg2NCAvKiBkICovIHx8XG4gICAgY2ggPT09IDB4NDQgLyogRCAqLyB8fFxuICAgIGNoID09PSAweDczIC8qIHMgKi8gfHxcbiAgICBjaCA9PT0gMHg1MyAvKiBTICovIHx8XG4gICAgY2ggPT09IDB4NzcgLyogdyAqLyB8fFxuICAgIGNoID09PSAweDU3IC8qIFcgKi9cbiAgKVxufVxuXG4vLyBVbmljb2RlUHJvcGVydHlWYWx1ZUV4cHJlc3Npb24gOjpcbi8vICAgVW5pY29kZVByb3BlcnR5TmFtZSBgPWAgVW5pY29kZVByb3BlcnR5VmFsdWVcbi8vICAgTG9uZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlXG5wcCQxLnJlZ2V4cF9lYXRVbmljb2RlUHJvcGVydHlWYWx1ZUV4cHJlc3Npb24gPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgc3RhcnQgPSBzdGF0ZS5wb3M7XG5cbiAgLy8gVW5pY29kZVByb3BlcnR5TmFtZSBgPWAgVW5pY29kZVByb3BlcnR5VmFsdWVcbiAgaWYgKHRoaXMucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eU5hbWUoc3RhdGUpICYmIHN0YXRlLmVhdCgweDNEIC8qID0gKi8pKSB7XG4gICAgdmFyIG5hbWUgPSBzdGF0ZS5sYXN0U3RyaW5nVmFsdWU7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eVZhbHVlKHN0YXRlKSkge1xuICAgICAgdmFyIHZhbHVlID0gc3RhdGUubGFzdFN0cmluZ1ZhbHVlO1xuICAgICAgdGhpcy5yZWdleHBfdmFsaWRhdGVVbmljb2RlUHJvcGVydHlOYW1lQW5kVmFsdWUoc3RhdGUsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHN0YXRlLnBvcyA9IHN0YXJ0O1xuXG4gIC8vIExvbmVVbmljb2RlUHJvcGVydHlOYW1lT3JWYWx1ZVxuICBpZiAodGhpcy5yZWdleHBfZWF0TG9uZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlKHN0YXRlKSkge1xuICAgIHZhciBuYW1lT3JWYWx1ZSA9IHN0YXRlLmxhc3RTdHJpbmdWYWx1ZTtcbiAgICB0aGlzLnJlZ2V4cF92YWxpZGF0ZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlKHN0YXRlLCBuYW1lT3JWYWx1ZSk7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5wcCQxLnJlZ2V4cF92YWxpZGF0ZVVuaWNvZGVQcm9wZXJ0eU5hbWVBbmRWYWx1ZSA9IGZ1bmN0aW9uKHN0YXRlLCBuYW1lLCB2YWx1ZSkge1xuICBpZiAoIWhhc093bihzdGF0ZS51bmljb2RlUHJvcGVydGllcy5ub25CaW5hcnksIG5hbWUpKVxuICAgIHsgc3RhdGUucmFpc2UoXCJJbnZhbGlkIHByb3BlcnR5IG5hbWVcIik7IH1cbiAgaWYgKCFzdGF0ZS51bmljb2RlUHJvcGVydGllcy5ub25CaW5hcnlbbmFtZV0udGVzdCh2YWx1ZSkpXG4gICAgeyBzdGF0ZS5yYWlzZShcIkludmFsaWQgcHJvcGVydHkgdmFsdWVcIik7IH1cbn07XG5wcCQxLnJlZ2V4cF92YWxpZGF0ZVVuaWNvZGVQcm9wZXJ0eU5hbWVPclZhbHVlID0gZnVuY3Rpb24oc3RhdGUsIG5hbWVPclZhbHVlKSB7XG4gIGlmICghc3RhdGUudW5pY29kZVByb3BlcnRpZXMuYmluYXJ5LnRlc3QobmFtZU9yVmFsdWUpKVxuICAgIHsgc3RhdGUucmFpc2UoXCJJbnZhbGlkIHByb3BlcnR5IG5hbWVcIik7IH1cbn07XG5cbi8vIFVuaWNvZGVQcm9wZXJ0eU5hbWUgOjpcbi8vICAgVW5pY29kZVByb3BlcnR5TmFtZUNoYXJhY3RlcnNcbnBwJDEucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eU5hbWUgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgY2ggPSAwO1xuICBzdGF0ZS5sYXN0U3RyaW5nVmFsdWUgPSBcIlwiO1xuICB3aGlsZSAoaXNVbmljb2RlUHJvcGVydHlOYW1lQ2hhcmFjdGVyKGNoID0gc3RhdGUuY3VycmVudCgpKSkge1xuICAgIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSArPSBjb2RlUG9pbnRUb1N0cmluZyhjaCk7XG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sYXN0U3RyaW5nVmFsdWUgIT09IFwiXCJcbn07XG5mdW5jdGlvbiBpc1VuaWNvZGVQcm9wZXJ0eU5hbWVDaGFyYWN0ZXIoY2gpIHtcbiAgcmV0dXJuIGlzQ29udHJvbExldHRlcihjaCkgfHwgY2ggPT09IDB4NUYgLyogXyAqL1xufVxuXG4vLyBVbmljb2RlUHJvcGVydHlWYWx1ZSA6OlxuLy8gICBVbmljb2RlUHJvcGVydHlWYWx1ZUNoYXJhY3RlcnNcbnBwJDEucmVnZXhwX2VhdFVuaWNvZGVQcm9wZXJ0eVZhbHVlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIGNoID0gMDtcbiAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlID0gXCJcIjtcbiAgd2hpbGUgKGlzVW5pY29kZVByb3BlcnR5VmFsdWVDaGFyYWN0ZXIoY2ggPSBzdGF0ZS5jdXJyZW50KCkpKSB7XG4gICAgc3RhdGUubGFzdFN0cmluZ1ZhbHVlICs9IGNvZGVQb2ludFRvU3RyaW5nKGNoKTtcbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLmxhc3RTdHJpbmdWYWx1ZSAhPT0gXCJcIlxufTtcbmZ1bmN0aW9uIGlzVW5pY29kZVByb3BlcnR5VmFsdWVDaGFyYWN0ZXIoY2gpIHtcbiAgcmV0dXJuIGlzVW5pY29kZVByb3BlcnR5TmFtZUNoYXJhY3RlcihjaCkgfHwgaXNEZWNpbWFsRGlnaXQoY2gpXG59XG5cbi8vIExvbmVVbmljb2RlUHJvcGVydHlOYW1lT3JWYWx1ZSA6OlxuLy8gICBVbmljb2RlUHJvcGVydHlWYWx1ZUNoYXJhY3RlcnNcbnBwJDEucmVnZXhwX2VhdExvbmVVbmljb2RlUHJvcGVydHlOYW1lT3JWYWx1ZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHJldHVybiB0aGlzLnJlZ2V4cF9lYXRVbmljb2RlUHJvcGVydHlWYWx1ZShzdGF0ZSlcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUNoYXJhY3RlckNsYXNzXG5wcCQxLnJlZ2V4cF9lYXRDaGFyYWN0ZXJDbGFzcyA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lYXQoMHg1QiAvKiBbICovKSkge1xuICAgIHN0YXRlLmVhdCgweDVFIC8qIF4gKi8pO1xuICAgIHRoaXMucmVnZXhwX2NsYXNzUmFuZ2VzKHN0YXRlKTtcbiAgICBpZiAoc3RhdGUuZWF0KDB4NUQgLyogXSAqLykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIFVucmVhY2hhYmxlIHNpbmNlIGl0IHRocmV3IFwidW50ZXJtaW5hdGVkIHJlZ3VsYXIgZXhwcmVzc2lvblwiIGVycm9yIGJlZm9yZS5cbiAgICBzdGF0ZS5yYWlzZShcIlVudGVybWluYXRlZCBjaGFyYWN0ZXIgY2xhc3NcIik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1DbGFzc1Jhbmdlc1xuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtTm9uZW1wdHlDbGFzc1Jhbmdlc1xuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtTm9uZW1wdHlDbGFzc1Jhbmdlc05vRGFzaFxucHAkMS5yZWdleHBfY2xhc3NSYW5nZXMgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB3aGlsZSAodGhpcy5yZWdleHBfZWF0Q2xhc3NBdG9tKHN0YXRlKSkge1xuICAgIHZhciBsZWZ0ID0gc3RhdGUubGFzdEludFZhbHVlO1xuICAgIGlmIChzdGF0ZS5lYXQoMHgyRCAvKiAtICovKSAmJiB0aGlzLnJlZ2V4cF9lYXRDbGFzc0F0b20oc3RhdGUpKSB7XG4gICAgICB2YXIgcmlnaHQgPSBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgICBpZiAoc3RhdGUuc3dpdGNoVSAmJiAobGVmdCA9PT0gLTEgfHwgcmlnaHQgPT09IC0xKSkge1xuICAgICAgICBzdGF0ZS5yYWlzZShcIkludmFsaWQgY2hhcmFjdGVyIGNsYXNzXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSAmJiBsZWZ0ID4gcmlnaHQpIHtcbiAgICAgICAgc3RhdGUucmFpc2UoXCJSYW5nZSBvdXQgb2Ygb3JkZXIgaW4gY2hhcmFjdGVyIGNsYXNzXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtQ2xhc3NBdG9tXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1DbGFzc0F0b21Ob0Rhc2hcbnBwJDEucmVnZXhwX2VhdENsYXNzQXRvbSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBzdGFydCA9IHN0YXRlLnBvcztcblxuICBpZiAoc3RhdGUuZWF0KDB4NUMgLyogXFwgKi8pKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdENsYXNzRXNjYXBlKHN0YXRlKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKHN0YXRlLnN3aXRjaFUpIHtcbiAgICAgIC8vIE1ha2UgdGhlIHNhbWUgbWVzc2FnZSBhcyBWOC5cbiAgICAgIHZhciBjaCQxID0gc3RhdGUuY3VycmVudCgpO1xuICAgICAgaWYgKGNoJDEgPT09IDB4NjMgLyogYyAqLyB8fCBpc09jdGFsRGlnaXQoY2gkMSkpIHtcbiAgICAgICAgc3RhdGUucmFpc2UoXCJJbnZhbGlkIGNsYXNzIGVzY2FwZVwiKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBlc2NhcGVcIik7XG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICB9XG5cbiAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICBpZiAoY2ggIT09IDB4NUQgLyogXSAqLykge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoO1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItQ2xhc3NFc2NhcGVcbnBwJDEucmVnZXhwX2VhdENsYXNzRXNjYXBlID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuXG4gIGlmIChzdGF0ZS5lYXQoMHg2MiAvKiBiICovKSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDB4MDg7IC8qIDxCUz4gKi9cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHN0YXRlLnN3aXRjaFUgJiYgc3RhdGUuZWF0KDB4MkQgLyogLSAqLykpIHtcbiAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAweDJEOyAvKiAtICovXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICghc3RhdGUuc3dpdGNoVSAmJiBzdGF0ZS5lYXQoMHg2MyAvKiBjICovKSkge1xuICAgIGlmICh0aGlzLnJlZ2V4cF9lYXRDbGFzc0NvbnRyb2xMZXR0ZXIoc3RhdGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICBzdGF0ZS5wb3MgPSBzdGFydDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgdGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyQ2xhc3NFc2NhcGUoc3RhdGUpIHx8XG4gICAgdGhpcy5yZWdleHBfZWF0Q2hhcmFjdGVyRXNjYXBlKHN0YXRlKVxuICApXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1hbm5leEItQ2xhc3NDb250cm9sTGV0dGVyXG5wcCQxLnJlZ2V4cF9lYXRDbGFzc0NvbnRyb2xMZXR0ZXIgPSBmdW5jdGlvbihzdGF0ZSkge1xuICB2YXIgY2ggPSBzdGF0ZS5jdXJyZW50KCk7XG4gIGlmIChpc0RlY2ltYWxEaWdpdChjaCkgfHwgY2ggPT09IDB4NUYgLyogXyAqLykge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoICUgMHgyMDtcbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn07XG5cbi8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUhleEVzY2FwZVNlcXVlbmNlXG5wcCQxLnJlZ2V4cF9lYXRIZXhFc2NhcGVTZXF1ZW5jZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgaWYgKHN0YXRlLmVhdCgweDc4IC8qIHggKi8pKSB7XG4gICAgaWYgKHRoaXMucmVnZXhwX2VhdEZpeGVkSGV4RGlnaXRzKHN0YXRlLCAyKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKHN0YXRlLnN3aXRjaFUpIHtcbiAgICAgIHN0YXRlLnJhaXNlKFwiSW52YWxpZCBlc2NhcGVcIik7XG4gICAgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICB9XG4gIHJldHVybiBmYWxzZVxufTtcblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtRGVjaW1hbERpZ2l0c1xucHAkMS5yZWdleHBfZWF0RGVjaW1hbERpZ2l0cyA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgdmFyIGNoID0gMDtcbiAgc3RhdGUubGFzdEludFZhbHVlID0gMDtcbiAgd2hpbGUgKGlzRGVjaW1hbERpZ2l0KGNoID0gc3RhdGUuY3VycmVudCgpKSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDEwICogc3RhdGUubGFzdEludFZhbHVlICsgKGNoIC0gMHgzMCAvKiAwICovKTtcbiAgICBzdGF0ZS5hZHZhbmNlKCk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLnBvcyAhPT0gc3RhcnRcbn07XG5mdW5jdGlvbiBpc0RlY2ltYWxEaWdpdChjaCkge1xuICByZXR1cm4gY2ggPj0gMHgzMCAvKiAwICovICYmIGNoIDw9IDB4MzkgLyogOSAqL1xufVxuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1IZXhEaWdpdHNcbnBwJDEucmVnZXhwX2VhdEhleERpZ2l0cyA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIHZhciBzdGFydCA9IHN0YXRlLnBvcztcbiAgdmFyIGNoID0gMDtcbiAgc3RhdGUubGFzdEludFZhbHVlID0gMDtcbiAgd2hpbGUgKGlzSGV4RGlnaXQoY2ggPSBzdGF0ZS5jdXJyZW50KCkpKSB7XG4gICAgc3RhdGUubGFzdEludFZhbHVlID0gMTYgKiBzdGF0ZS5sYXN0SW50VmFsdWUgKyBoZXhUb0ludChjaCk7XG4gICAgc3RhdGUuYWR2YW5jZSgpO1xuICB9XG4gIHJldHVybiBzdGF0ZS5wb3MgIT09IHN0YXJ0XG59O1xuZnVuY3Rpb24gaXNIZXhEaWdpdChjaCkge1xuICByZXR1cm4gKFxuICAgIChjaCA+PSAweDMwIC8qIDAgKi8gJiYgY2ggPD0gMHgzOSAvKiA5ICovKSB8fFxuICAgIChjaCA+PSAweDQxIC8qIEEgKi8gJiYgY2ggPD0gMHg0NiAvKiBGICovKSB8fFxuICAgIChjaCA+PSAweDYxIC8qIGEgKi8gJiYgY2ggPD0gMHg2NiAvKiBmICovKVxuICApXG59XG5mdW5jdGlvbiBoZXhUb0ludChjaCkge1xuICBpZiAoY2ggPj0gMHg0MSAvKiBBICovICYmIGNoIDw9IDB4NDYgLyogRiAqLykge1xuICAgIHJldHVybiAxMCArIChjaCAtIDB4NDEgLyogQSAqLylcbiAgfVxuICBpZiAoY2ggPj0gMHg2MSAvKiBhICovICYmIGNoIDw9IDB4NjYgLyogZiAqLykge1xuICAgIHJldHVybiAxMCArIChjaCAtIDB4NjEgLyogYSAqLylcbiAgfVxuICByZXR1cm4gY2ggLSAweDMwIC8qIDAgKi9cbn1cblxuLy8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi84LjAvI3Byb2QtYW5uZXhCLUxlZ2FjeU9jdGFsRXNjYXBlU2VxdWVuY2Vcbi8vIEFsbG93cyBvbmx5IDAtMzc3KG9jdGFsKSBpLmUuIDAtMjU1KGRlY2ltYWwpLlxucHAkMS5yZWdleHBfZWF0TGVnYWN5T2N0YWxFc2NhcGVTZXF1ZW5jZSA9IGZ1bmN0aW9uKHN0YXRlKSB7XG4gIGlmICh0aGlzLnJlZ2V4cF9lYXRPY3RhbERpZ2l0KHN0YXRlKSkge1xuICAgIHZhciBuMSA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgICBpZiAodGhpcy5yZWdleHBfZWF0T2N0YWxEaWdpdChzdGF0ZSkpIHtcbiAgICAgIHZhciBuMiA9IHN0YXRlLmxhc3RJbnRWYWx1ZTtcbiAgICAgIGlmIChuMSA8PSAzICYmIHRoaXMucmVnZXhwX2VhdE9jdGFsRGlnaXQoc3RhdGUpKSB7XG4gICAgICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IG4xICogNjQgKyBuMiAqIDggKyBzdGF0ZS5sYXN0SW50VmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5sYXN0SW50VmFsdWUgPSBuMSAqIDggKyBuMjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUubGFzdEludFZhbHVlID0gbjE7XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59O1xuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1PY3RhbERpZ2l0XG5wcCQxLnJlZ2V4cF9lYXRPY3RhbERpZ2l0ID0gZnVuY3Rpb24oc3RhdGUpIHtcbiAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICBpZiAoaXNPY3RhbERpZ2l0KGNoKSkge1xuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IGNoIC0gMHgzMDsgLyogMCAqL1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDA7XG4gIHJldHVybiBmYWxzZVxufTtcbmZ1bmN0aW9uIGlzT2N0YWxEaWdpdChjaCkge1xuICByZXR1cm4gY2ggPj0gMHgzMCAvKiAwICovICYmIGNoIDw9IDB4MzcgLyogNyAqL1xufVxuXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1IZXg0RGlnaXRzXG4vLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzguMC8jcHJvZC1IZXhEaWdpdFxuLy8gQW5kIEhleERpZ2l0IEhleERpZ2l0IGluIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNwcm9kLUhleEVzY2FwZVNlcXVlbmNlXG5wcCQxLnJlZ2V4cF9lYXRGaXhlZEhleERpZ2l0cyA9IGZ1bmN0aW9uKHN0YXRlLCBsZW5ndGgpIHtcbiAgdmFyIHN0YXJ0ID0gc3RhdGUucG9zO1xuICBzdGF0ZS5sYXN0SW50VmFsdWUgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGNoID0gc3RhdGUuY3VycmVudCgpO1xuICAgIGlmICghaXNIZXhEaWdpdChjaCkpIHtcbiAgICAgIHN0YXRlLnBvcyA9IHN0YXJ0O1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHN0YXRlLmxhc3RJbnRWYWx1ZSA9IDE2ICogc3RhdGUubGFzdEludFZhbHVlICsgaGV4VG9JbnQoY2gpO1xuICAgIHN0YXRlLmFkdmFuY2UoKTtcbiAgfVxuICByZXR1cm4gdHJ1ZVxufTtcblxuLy8gT2JqZWN0IHR5cGUgdXNlZCB0byByZXByZXNlbnQgdG9rZW5zLiBOb3RlIHRoYXQgbm9ybWFsbHksIHRva2Vuc1xuLy8gc2ltcGx5IGV4aXN0IGFzIHByb3BlcnRpZXMgb24gdGhlIHBhcnNlciBvYmplY3QuIFRoaXMgaXMgb25seVxuLy8gdXNlZCBmb3IgdGhlIG9uVG9rZW4gY2FsbGJhY2sgYW5kIHRoZSBleHRlcm5hbCB0b2tlbml6ZXIuXG5cbnZhciBUb2tlbiA9IGZ1bmN0aW9uIFRva2VuKHApIHtcbiAgdGhpcy50eXBlID0gcC50eXBlO1xuICB0aGlzLnZhbHVlID0gcC52YWx1ZTtcbiAgdGhpcy5zdGFydCA9IHAuc3RhcnQ7XG4gIHRoaXMuZW5kID0gcC5lbmQ7XG4gIGlmIChwLm9wdGlvbnMubG9jYXRpb25zKVxuICAgIHsgdGhpcy5sb2MgPSBuZXcgU291cmNlTG9jYXRpb24ocCwgcC5zdGFydExvYywgcC5lbmRMb2MpOyB9XG4gIGlmIChwLm9wdGlvbnMucmFuZ2VzKVxuICAgIHsgdGhpcy5yYW5nZSA9IFtwLnN0YXJ0LCBwLmVuZF07IH1cbn07XG5cbi8vICMjIFRva2VuaXplclxuXG52YXIgcHAgPSBQYXJzZXIkMS5wcm90b3R5cGU7XG5cbi8vIE1vdmUgdG8gdGhlIG5leHQgdG9rZW5cblxucHAubmV4dCA9IGZ1bmN0aW9uKGlnbm9yZUVzY2FwZVNlcXVlbmNlSW5LZXl3b3JkKSB7XG4gIGlmICghaWdub3JlRXNjYXBlU2VxdWVuY2VJbktleXdvcmQgJiYgdGhpcy50eXBlLmtleXdvcmQgJiYgdGhpcy5jb250YWluc0VzYylcbiAgICB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZSh0aGlzLnN0YXJ0LCBcIkVzY2FwZSBzZXF1ZW5jZSBpbiBrZXl3b3JkIFwiICsgdGhpcy50eXBlLmtleXdvcmQpOyB9XG4gIGlmICh0aGlzLm9wdGlvbnMub25Ub2tlbilcbiAgICB7IHRoaXMub3B0aW9ucy5vblRva2VuKG5ldyBUb2tlbih0aGlzKSk7IH1cblxuICB0aGlzLmxhc3RUb2tFbmQgPSB0aGlzLmVuZDtcbiAgdGhpcy5sYXN0VG9rU3RhcnQgPSB0aGlzLnN0YXJ0O1xuICB0aGlzLmxhc3RUb2tFbmRMb2MgPSB0aGlzLmVuZExvYztcbiAgdGhpcy5sYXN0VG9rU3RhcnRMb2MgPSB0aGlzLnN0YXJ0TG9jO1xuICB0aGlzLm5leHRUb2tlbigpO1xufTtcblxucHAuZ2V0VG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5uZXh0KCk7XG4gIHJldHVybiBuZXcgVG9rZW4odGhpcylcbn07XG5cbi8vIElmIHdlJ3JlIGluIGFuIEVTNiBlbnZpcm9ubWVudCwgbWFrZSBwYXJzZXJzIGl0ZXJhYmxlXG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIilcbiAgeyBwcFtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRoaXMkMSQxID0gdGhpcztcblxuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0b2tlbiA9IHRoaXMkMSQxLmdldFRva2VuKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZG9uZTogdG9rZW4udHlwZSA9PT0gdHlwZXMkMS5lb2YsXG4gICAgICAgICAgdmFsdWU6IHRva2VuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07IH1cblxuLy8gVG9nZ2xlIHN0cmljdCBtb2RlLiBSZS1yZWFkcyB0aGUgbmV4dCBudW1iZXIgb3Igc3RyaW5nIHRvIHBsZWFzZVxuLy8gcGVkYW50aWMgdGVzdHMgKGBcInVzZSBzdHJpY3RcIjsgMDEwO2Agc2hvdWxkIGZhaWwpLlxuXG4vLyBSZWFkIGEgc2luZ2xlIHRva2VuLCB1cGRhdGluZyB0aGUgcGFyc2VyIG9iamVjdCdzIHRva2VuLXJlbGF0ZWRcbi8vIHByb3BlcnRpZXMuXG5cbnBwLm5leHRUb2tlbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY3VyQ29udGV4dCA9IHRoaXMuY3VyQ29udGV4dCgpO1xuICBpZiAoIWN1ckNvbnRleHQgfHwgIWN1ckNvbnRleHQucHJlc2VydmVTcGFjZSkgeyB0aGlzLnNraXBTcGFjZSgpOyB9XG5cbiAgdGhpcy5zdGFydCA9IHRoaXMucG9zO1xuICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykgeyB0aGlzLnN0YXJ0TG9jID0gdGhpcy5jdXJQb3NpdGlvbigpOyB9XG4gIGlmICh0aGlzLnBvcyA+PSB0aGlzLmlucHV0Lmxlbmd0aCkgeyByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcyQxLmVvZikgfVxuXG4gIGlmIChjdXJDb250ZXh0Lm92ZXJyaWRlKSB7IHJldHVybiBjdXJDb250ZXh0Lm92ZXJyaWRlKHRoaXMpIH1cbiAgZWxzZSB7IHRoaXMucmVhZFRva2VuKHRoaXMuZnVsbENoYXJDb2RlQXRQb3MoKSk7IH1cbn07XG5cbnBwLnJlYWRUb2tlbiA9IGZ1bmN0aW9uKGNvZGUpIHtcbiAgLy8gSWRlbnRpZmllciBvciBrZXl3b3JkLiAnXFx1WFhYWCcgc2VxdWVuY2VzIGFyZSBhbGxvd2VkIGluXG4gIC8vIGlkZW50aWZpZXJzLCBzbyAnXFwnIGFsc28gZGlzcGF0Y2hlcyB0byB0aGF0LlxuICBpZiAoaXNJZGVudGlmaWVyU3RhcnQoY29kZSwgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHx8IGNvZGUgPT09IDkyIC8qICdcXCcgKi8pXG4gICAgeyByZXR1cm4gdGhpcy5yZWFkV29yZCgpIH1cblxuICByZXR1cm4gdGhpcy5nZXRUb2tlbkZyb21Db2RlKGNvZGUpXG59O1xuXG5wcC5mdWxsQ2hhckNvZGVBdFBvcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY29kZSA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyk7XG4gIGlmIChjb2RlIDw9IDB4ZDdmZiB8fCBjb2RlID49IDB4ZGMwMCkgeyByZXR1cm4gY29kZSB9XG4gIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gIHJldHVybiBuZXh0IDw9IDB4ZGJmZiB8fCBuZXh0ID49IDB4ZTAwMCA/IGNvZGUgOiAoY29kZSA8PCAxMCkgKyBuZXh0IC0gMHgzNWZkYzAwXG59O1xuXG5wcC5za2lwQmxvY2tDb21tZW50ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdGFydExvYyA9IHRoaXMub3B0aW9ucy5vbkNvbW1lbnQgJiYgdGhpcy5jdXJQb3NpdGlvbigpO1xuICB2YXIgc3RhcnQgPSB0aGlzLnBvcywgZW5kID0gdGhpcy5pbnB1dC5pbmRleE9mKFwiKi9cIiwgdGhpcy5wb3MgKz0gMik7XG4gIGlmIChlbmQgPT09IC0xKSB7IHRoaXMucmFpc2UodGhpcy5wb3MgLSAyLCBcIlVudGVybWluYXRlZCBjb21tZW50XCIpOyB9XG4gIHRoaXMucG9zID0gZW5kICsgMjtcbiAgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpIHtcbiAgICBmb3IgKHZhciBuZXh0QnJlYWsgPSAodm9pZCAwKSwgcG9zID0gc3RhcnQ7IChuZXh0QnJlYWsgPSBuZXh0TGluZUJyZWFrKHRoaXMuaW5wdXQsIHBvcywgdGhpcy5wb3MpKSA+IC0xOykge1xuICAgICAgKyt0aGlzLmN1ckxpbmU7XG4gICAgICBwb3MgPSB0aGlzLmxpbmVTdGFydCA9IG5leHRCcmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHRoaXMub3B0aW9ucy5vbkNvbW1lbnQpXG4gICAgeyB0aGlzLm9wdGlvbnMub25Db21tZW50KHRydWUsIHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQgKyAyLCBlbmQpLCBzdGFydCwgdGhpcy5wb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydExvYywgdGhpcy5jdXJQb3NpdGlvbigpKTsgfVxufTtcblxucHAuc2tpcExpbmVDb21tZW50ID0gZnVuY3Rpb24oc3RhcnRTa2lwKSB7XG4gIHZhciBzdGFydCA9IHRoaXMucG9zO1xuICB2YXIgc3RhcnRMb2MgPSB0aGlzLm9wdGlvbnMub25Db21tZW50ICYmIHRoaXMuY3VyUG9zaXRpb24oKTtcbiAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICs9IHN0YXJ0U2tpcCk7XG4gIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMuaW5wdXQubGVuZ3RoICYmICFpc05ld0xpbmUoY2gpKSB7XG4gICAgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQoKyt0aGlzLnBvcyk7XG4gIH1cbiAgaWYgKHRoaXMub3B0aW9ucy5vbkNvbW1lbnQpXG4gICAgeyB0aGlzLm9wdGlvbnMub25Db21tZW50KGZhbHNlLCB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0ICsgc3RhcnRTa2lwLCB0aGlzLnBvcyksIHN0YXJ0LCB0aGlzLnBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TG9jLCB0aGlzLmN1clBvc2l0aW9uKCkpOyB9XG59O1xuXG4vLyBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXJzZSBhbmQgYWZ0ZXIgZXZlcnkgdG9rZW4uIFNraXBzXG4vLyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cywgYW5kLlxuXG5wcC5za2lwU3BhY2UgPSBmdW5jdGlvbigpIHtcbiAgbG9vcDogd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5pbnB1dC5sZW5ndGgpIHtcbiAgICB2YXIgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICAgIHN3aXRjaCAoY2gpIHtcbiAgICBjYXNlIDMyOiBjYXNlIDE2MDogLy8gJyAnXG4gICAgICArK3RoaXMucG9zO1xuICAgICAgYnJlYWtcbiAgICBjYXNlIDEzOlxuICAgICAgaWYgKHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpID09PSAxMCkge1xuICAgICAgICArK3RoaXMucG9zO1xuICAgICAgfVxuICAgIGNhc2UgMTA6IGNhc2UgODIzMjogY2FzZSA4MjMzOlxuICAgICAgKyt0aGlzLnBvcztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7XG4gICAgICAgICsrdGhpcy5jdXJMaW5lO1xuICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMucG9zO1xuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICBjYXNlIDQ3OiAvLyAnLydcbiAgICAgIHN3aXRjaCAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSkpIHtcbiAgICAgIGNhc2UgNDI6IC8vICcqJ1xuICAgICAgICB0aGlzLnNraXBCbG9ja0NvbW1lbnQoKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgNDc6XG4gICAgICAgIHRoaXMuc2tpcExpbmVDb21tZW50KDIpO1xuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWsgbG9vcFxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKGNoID4gOCAmJiBjaCA8IDE0IHx8IGNoID49IDU3NjAgJiYgbm9uQVNDSUl3aGl0ZXNwYWNlLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjaCkpKSB7XG4gICAgICAgICsrdGhpcy5wb3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhayBsb29wXG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vLyBDYWxsZWQgYXQgdGhlIGVuZCBvZiBldmVyeSB0b2tlbi4gU2V0cyBgZW5kYCwgYHZhbGAsIGFuZFxuLy8gbWFpbnRhaW5zIGBjb250ZXh0YCBhbmQgYGV4cHJBbGxvd2VkYCwgYW5kIHNraXBzIHRoZSBzcGFjZSBhZnRlclxuLy8gdGhlIHRva2VuLCBzbyB0aGF0IHRoZSBuZXh0IG9uZSdzIGBzdGFydGAgd2lsbCBwb2ludCBhdCB0aGVcbi8vIHJpZ2h0IHBvc2l0aW9uLlxuXG5wcC5maW5pc2hUb2tlbiA9IGZ1bmN0aW9uKHR5cGUsIHZhbCkge1xuICB0aGlzLmVuZCA9IHRoaXMucG9zO1xuICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykgeyB0aGlzLmVuZExvYyA9IHRoaXMuY3VyUG9zaXRpb24oKTsgfVxuICB2YXIgcHJldlR5cGUgPSB0aGlzLnR5cGU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMudmFsdWUgPSB2YWw7XG5cbiAgdGhpcy51cGRhdGVDb250ZXh0KHByZXZUeXBlKTtcbn07XG5cbi8vICMjIyBUb2tlbiByZWFkaW5nXG5cbi8vIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIGZldGNoIHRoZSBuZXh0IHRva2VuLiBJdFxuLy8gaXMgc29tZXdoYXQgb2JzY3VyZSwgYmVjYXVzZSBpdCB3b3JrcyBpbiBjaGFyYWN0ZXIgY29kZXMgcmF0aGVyXG4vLyB0aGFuIGNoYXJhY3RlcnMsIGFuZCBiZWNhdXNlIG9wZXJhdG9yIHBhcnNpbmcgaGFzIGJlZW4gaW5saW5lZFxuLy8gaW50byBpdC5cbi8vXG4vLyBBbGwgaW4gdGhlIG5hbWUgb2Ygc3BlZWQuXG4vL1xucHAucmVhZFRva2VuX2RvdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICBpZiAobmV4dCA+PSA0OCAmJiBuZXh0IDw9IDU3KSB7IHJldHVybiB0aGlzLnJlYWROdW1iZXIodHJ1ZSkgfVxuICB2YXIgbmV4dDIgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKTtcbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSA2ICYmIG5leHQgPT09IDQ2ICYmIG5leHQyID09PSA0NikgeyAvLyA0NiA9IGRvdCAnLidcbiAgICB0aGlzLnBvcyArPSAzO1xuICAgIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzJDEuZWxsaXBzaXMpXG4gIH0gZWxzZSB7XG4gICAgKyt0aGlzLnBvcztcbiAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcyQxLmRvdClcbiAgfVxufTtcblxucHAucmVhZFRva2VuX3NsYXNoID0gZnVuY3Rpb24oKSB7IC8vICcvJ1xuICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICBpZiAodGhpcy5leHByQWxsb3dlZCkgeyArK3RoaXMucG9zOyByZXR1cm4gdGhpcy5yZWFkUmVnZXhwKCkgfVxuICBpZiAobmV4dCA9PT0gNjEpIHsgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMkMS5hc3NpZ24sIDIpIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMkMS5zbGFzaCwgMSlcbn07XG5cbnBwLnJlYWRUb2tlbl9tdWx0X21vZHVsb19leHAgPSBmdW5jdGlvbihjb2RlKSB7IC8vICclKidcbiAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgdmFyIHNpemUgPSAxO1xuICB2YXIgdG9rZW50eXBlID0gY29kZSA9PT0gNDIgPyB0eXBlcyQxLnN0YXIgOiB0eXBlcyQxLm1vZHVsbztcblxuICAvLyBleHBvbmVudGlhdGlvbiBvcGVyYXRvciAqKiBhbmQgKio9XG4gIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNyAmJiBjb2RlID09PSA0MiAmJiBuZXh0ID09PSA0Mikge1xuICAgICsrc2l6ZTtcbiAgICB0b2tlbnR5cGUgPSB0eXBlcyQxLnN0YXJzdGFyO1xuICAgIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKTtcbiAgfVxuXG4gIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcyQxLmFzc2lnbiwgc2l6ZSArIDEpIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoT3AodG9rZW50eXBlLCBzaXplKVxufTtcblxucHAucmVhZFRva2VuX3BpcGVfYW1wID0gZnVuY3Rpb24oY29kZSkgeyAvLyAnfCYnXG4gIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gIGlmIChuZXh0ID09PSBjb2RlKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSAxMikge1xuICAgICAgdmFyIG5leHQyID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMik7XG4gICAgICBpZiAobmV4dDIgPT09IDYxKSB7IHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzJDEuYXNzaWduLCAzKSB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmlzaE9wKGNvZGUgPT09IDEyNCA/IHR5cGVzJDEubG9naWNhbE9SIDogdHlwZXMkMS5sb2dpY2FsQU5ELCAyKVxuICB9XG4gIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcyQxLmFzc2lnbiwgMikgfVxuICByZXR1cm4gdGhpcy5maW5pc2hPcChjb2RlID09PSAxMjQgPyB0eXBlcyQxLmJpdHdpc2VPUiA6IHR5cGVzJDEuYml0d2lzZUFORCwgMSlcbn07XG5cbnBwLnJlYWRUb2tlbl9jYXJldCA9IGZ1bmN0aW9uKCkgeyAvLyAnXidcbiAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgaWYgKG5leHQgPT09IDYxKSB7IHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzJDEuYXNzaWduLCAyKSB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzJDEuYml0d2lzZVhPUiwgMSlcbn07XG5cbnBwLnJlYWRUb2tlbl9wbHVzX21pbiA9IGZ1bmN0aW9uKGNvZGUpIHsgLy8gJystJ1xuICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICBpZiAobmV4dCA9PT0gY29kZSkge1xuICAgIGlmIChuZXh0ID09PSA0NSAmJiAhdGhpcy5pbk1vZHVsZSAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKSA9PT0gNjIgJiZcbiAgICAgICAgKHRoaXMubGFzdFRva0VuZCA9PT0gMCB8fCBsaW5lQnJlYWsudGVzdCh0aGlzLmlucHV0LnNsaWNlKHRoaXMubGFzdFRva0VuZCwgdGhpcy5wb3MpKSkpIHtcbiAgICAgIC8vIEEgYC0tPmAgbGluZSBjb21tZW50XG4gICAgICB0aGlzLnNraXBMaW5lQ29tbWVudCgzKTtcbiAgICAgIHRoaXMuc2tpcFNwYWNlKCk7XG4gICAgICByZXR1cm4gdGhpcy5uZXh0VG9rZW4oKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcyQxLmluY0RlYywgMilcbiAgfVxuICBpZiAobmV4dCA9PT0gNjEpIHsgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMkMS5hc3NpZ24sIDIpIH1cbiAgcmV0dXJuIHRoaXMuZmluaXNoT3AodHlwZXMkMS5wbHVzTWluLCAxKVxufTtcblxucHAucmVhZFRva2VuX2x0X2d0ID0gZnVuY3Rpb24oY29kZSkgeyAvLyAnPD4nXG4gIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gIHZhciBzaXplID0gMTtcbiAgaWYgKG5leHQgPT09IGNvZGUpIHtcbiAgICBzaXplID0gY29kZSA9PT0gNjIgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMikgPT09IDYyID8gMyA6IDI7XG4gICAgaWYgKHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIHNpemUpID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcyQxLmFzc2lnbiwgc2l6ZSArIDEpIH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcyQxLmJpdFNoaWZ0LCBzaXplKVxuICB9XG4gIGlmIChuZXh0ID09PSAzMyAmJiBjb2RlID09PSA2MCAmJiAhdGhpcy5pbk1vZHVsZSAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKSA9PT0gNDUgJiZcbiAgICAgIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDMpID09PSA0NSkge1xuICAgIC8vIGA8IS0tYCwgYW4gWE1MLXN0eWxlIGNvbW1lbnQgdGhhdCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBsaW5lIGNvbW1lbnRcbiAgICB0aGlzLnNraXBMaW5lQ29tbWVudCg0KTtcbiAgICB0aGlzLnNraXBTcGFjZSgpO1xuICAgIHJldHVybiB0aGlzLm5leHRUb2tlbigpXG4gIH1cbiAgaWYgKG5leHQgPT09IDYxKSB7IHNpemUgPSAyOyB9XG4gIHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzJDEucmVsYXRpb25hbCwgc2l6ZSlcbn07XG5cbnBwLnJlYWRUb2tlbl9lcV9leGNsID0gZnVuY3Rpb24oY29kZSkgeyAvLyAnPSEnXG4gIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMSk7XG4gIGlmIChuZXh0ID09PSA2MSkgeyByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcyQxLmVxdWFsaXR5LCB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKSA9PT0gNjEgPyAzIDogMikgfVxuICBpZiAoY29kZSA9PT0gNjEgJiYgbmV4dCA9PT0gNjIgJiYgdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uID49IDYpIHsgLy8gJz0+J1xuICAgIHRoaXMucG9zICs9IDI7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5hcnJvdylcbiAgfVxuICByZXR1cm4gdGhpcy5maW5pc2hPcChjb2RlID09PSA2MSA/IHR5cGVzJDEuZXEgOiB0eXBlcyQxLnByZWZpeCwgMSlcbn07XG5cbnBwLnJlYWRUb2tlbl9xdWVzdGlvbiA9IGZ1bmN0aW9uKCkgeyAvLyAnPydcbiAgdmFyIGVjbWFWZXJzaW9uID0gdGhpcy5vcHRpb25zLmVjbWFWZXJzaW9uO1xuICBpZiAoZWNtYVZlcnNpb24gPj0gMTEpIHtcbiAgICB2YXIgbmV4dCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcyArIDEpO1xuICAgIGlmIChuZXh0ID09PSA0Nikge1xuICAgICAgdmFyIG5leHQyID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zICsgMik7XG4gICAgICBpZiAobmV4dDIgPCA0OCB8fCBuZXh0MiA+IDU3KSB7IHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzJDEucXVlc3Rpb25Eb3QsIDIpIH1cbiAgICB9XG4gICAgaWYgKG5leHQgPT09IDYzKSB7XG4gICAgICBpZiAoZWNtYVZlcnNpb24gPj0gMTIpIHtcbiAgICAgICAgdmFyIG5leHQyJDEgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAyKTtcbiAgICAgICAgaWYgKG5leHQyJDEgPT09IDYxKSB7IHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzJDEuYXNzaWduLCAzKSB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcyQxLmNvYWxlc2NlLCAyKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy5maW5pc2hPcCh0eXBlcyQxLnF1ZXN0aW9uLCAxKVxufTtcblxucHAucmVhZFRva2VuX251bWJlclNpZ24gPSBmdW5jdGlvbigpIHsgLy8gJyMnXG4gIHZhciBlY21hVmVyc2lvbiA9IHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbjtcbiAgdmFyIGNvZGUgPSAzNTsgLy8gJyMnXG4gIGlmIChlY21hVmVyc2lvbiA+PSAxMykge1xuICAgICsrdGhpcy5wb3M7XG4gICAgY29kZSA9IHRoaXMuZnVsbENoYXJDb2RlQXRQb3MoKTtcbiAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQoY29kZSwgdHJ1ZSkgfHwgY29kZSA9PT0gOTIgLyogJ1xcJyAqLykge1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5wcml2YXRlSWQsIHRoaXMucmVhZFdvcmQxKCkpXG4gICAgfVxuICB9XG5cbiAgdGhpcy5yYWlzZSh0aGlzLnBvcywgXCJVbmV4cGVjdGVkIGNoYXJhY3RlciAnXCIgKyBjb2RlUG9pbnRUb1N0cmluZyhjb2RlKSArIFwiJ1wiKTtcbn07XG5cbnBwLmdldFRva2VuRnJvbUNvZGUgPSBmdW5jdGlvbihjb2RlKSB7XG4gIHN3aXRjaCAoY29kZSkge1xuICAvLyBUaGUgaW50ZXJwcmV0YXRpb24gb2YgYSBkb3QgZGVwZW5kcyBvbiB3aGV0aGVyIGl0IGlzIGZvbGxvd2VkXG4gIC8vIGJ5IGEgZGlnaXQgb3IgYW5vdGhlciB0d28gZG90cy5cbiAgY2FzZSA0NjogLy8gJy4nXG4gICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX2RvdCgpXG5cbiAgLy8gUHVuY3R1YXRpb24gdG9rZW5zLlxuICBjYXNlIDQwOiArK3RoaXMucG9zOyByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcyQxLnBhcmVuTClcbiAgY2FzZSA0MTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5wYXJlblIpXG4gIGNhc2UgNTk6ICsrdGhpcy5wb3M7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzJDEuc2VtaSlcbiAgY2FzZSA0NDogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5jb21tYSlcbiAgY2FzZSA5MTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5icmFja2V0TClcbiAgY2FzZSA5MzogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5icmFja2V0UilcbiAgY2FzZSAxMjM6ICsrdGhpcy5wb3M7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzJDEuYnJhY2VMKVxuICBjYXNlIDEyNTogKyt0aGlzLnBvczsgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5icmFjZVIpXG4gIGNhc2UgNTg6ICsrdGhpcy5wb3M7IHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzJDEuY29sb24pXG5cbiAgY2FzZSA5NjogLy8gJ2AnXG4gICAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA8IDYpIHsgYnJlYWsgfVxuICAgICsrdGhpcy5wb3M7XG4gICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5iYWNrUXVvdGUpXG5cbiAgY2FzZSA0ODogLy8gJzAnXG4gICAgdmFyIG5leHQgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKTtcbiAgICBpZiAobmV4dCA9PT0gMTIwIHx8IG5leHQgPT09IDg4KSB7IHJldHVybiB0aGlzLnJlYWRSYWRpeE51bWJlcigxNikgfSAvLyAnMHgnLCAnMFgnIC0gaGV4IG51bWJlclxuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNikge1xuICAgICAgaWYgKG5leHQgPT09IDExMSB8fCBuZXh0ID09PSA3OSkgeyByZXR1cm4gdGhpcy5yZWFkUmFkaXhOdW1iZXIoOCkgfSAvLyAnMG8nLCAnME8nIC0gb2N0YWwgbnVtYmVyXG4gICAgICBpZiAobmV4dCA9PT0gOTggfHwgbmV4dCA9PT0gNjYpIHsgcmV0dXJuIHRoaXMucmVhZFJhZGl4TnVtYmVyKDIpIH0gLy8gJzBiJywgJzBCJyAtIGJpbmFyeSBudW1iZXJcbiAgICB9XG5cbiAgLy8gQW55dGhpbmcgZWxzZSBiZWdpbm5pbmcgd2l0aCBhIGRpZ2l0IGlzIGFuIGludGVnZXIsIG9jdGFsXG4gIC8vIG51bWJlciwgb3IgZmxvYXQuXG4gIGNhc2UgNDk6IGNhc2UgNTA6IGNhc2UgNTE6IGNhc2UgNTI6IGNhc2UgNTM6IGNhc2UgNTQ6IGNhc2UgNTU6IGNhc2UgNTY6IGNhc2UgNTc6IC8vIDEtOVxuICAgIHJldHVybiB0aGlzLnJlYWROdW1iZXIoZmFsc2UpXG5cbiAgLy8gUXVvdGVzIHByb2R1Y2Ugc3RyaW5ncy5cbiAgY2FzZSAzNDogY2FzZSAzOTogLy8gJ1wiJywgXCInXCJcbiAgICByZXR1cm4gdGhpcy5yZWFkU3RyaW5nKGNvZGUpXG5cbiAgLy8gT3BlcmF0b3JzIGFyZSBwYXJzZWQgaW5saW5lIGluIHRpbnkgc3RhdGUgbWFjaGluZXMuICc9JyAoNjEpIGlzXG4gIC8vIG9mdGVuIHJlZmVycmVkIHRvLiBgZmluaXNoT3BgIHNpbXBseSBza2lwcyB0aGUgYW1vdW50IG9mXG4gIC8vIGNoYXJhY3RlcnMgaXQgaXMgZ2l2ZW4gYXMgc2Vjb25kIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhIHRva2VuXG4gIC8vIG9mIHRoZSB0eXBlIGdpdmVuIGJ5IGl0cyBmaXJzdCBhcmd1bWVudC5cbiAgY2FzZSA0NzogLy8gJy8nXG4gICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX3NsYXNoKClcblxuICBjYXNlIDM3OiBjYXNlIDQyOiAvLyAnJSonXG4gICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX211bHRfbW9kdWxvX2V4cChjb2RlKVxuXG4gIGNhc2UgMTI0OiBjYXNlIDM4OiAvLyAnfCYnXG4gICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX3BpcGVfYW1wKGNvZGUpXG5cbiAgY2FzZSA5NDogLy8gJ14nXG4gICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX2NhcmV0KClcblxuICBjYXNlIDQzOiBjYXNlIDQ1OiAvLyAnKy0nXG4gICAgcmV0dXJuIHRoaXMucmVhZFRva2VuX3BsdXNfbWluKGNvZGUpXG5cbiAgY2FzZSA2MDogY2FzZSA2MjogLy8gJzw+J1xuICAgIHJldHVybiB0aGlzLnJlYWRUb2tlbl9sdF9ndChjb2RlKVxuXG4gIGNhc2UgNjE6IGNhc2UgMzM6IC8vICc9ISdcbiAgICByZXR1cm4gdGhpcy5yZWFkVG9rZW5fZXFfZXhjbChjb2RlKVxuXG4gIGNhc2UgNjM6IC8vICc/J1xuICAgIHJldHVybiB0aGlzLnJlYWRUb2tlbl9xdWVzdGlvbigpXG5cbiAgY2FzZSAxMjY6IC8vICd+J1xuICAgIHJldHVybiB0aGlzLmZpbmlzaE9wKHR5cGVzJDEucHJlZml4LCAxKVxuXG4gIGNhc2UgMzU6IC8vICcjJ1xuICAgIHJldHVybiB0aGlzLnJlYWRUb2tlbl9udW1iZXJTaWduKClcbiAgfVxuXG4gIHRoaXMucmFpc2UodGhpcy5wb3MsIFwiVW5leHBlY3RlZCBjaGFyYWN0ZXIgJ1wiICsgY29kZVBvaW50VG9TdHJpbmcoY29kZSkgKyBcIidcIik7XG59O1xuXG5wcC5maW5pc2hPcCA9IGZ1bmN0aW9uKHR5cGUsIHNpemUpIHtcbiAgdmFyIHN0ciA9IHRoaXMuaW5wdXQuc2xpY2UodGhpcy5wb3MsIHRoaXMucG9zICsgc2l6ZSk7XG4gIHRoaXMucG9zICs9IHNpemU7XG4gIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGUsIHN0cilcbn07XG5cbnBwLnJlYWRSZWdleHAgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGVzY2FwZWQsIGluQ2xhc3MsIHN0YXJ0ID0gdGhpcy5wb3M7XG4gIGZvciAoOzspIHtcbiAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5pbnB1dC5sZW5ndGgpIHsgdGhpcy5yYWlzZShzdGFydCwgXCJVbnRlcm1pbmF0ZWQgcmVndWxhciBleHByZXNzaW9uXCIpOyB9XG4gICAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQXQodGhpcy5wb3MpO1xuICAgIGlmIChsaW5lQnJlYWsudGVzdChjaCkpIHsgdGhpcy5yYWlzZShzdGFydCwgXCJVbnRlcm1pbmF0ZWQgcmVndWxhciBleHByZXNzaW9uXCIpOyB9XG4gICAgaWYgKCFlc2NhcGVkKSB7XG4gICAgICBpZiAoY2ggPT09IFwiW1wiKSB7IGluQ2xhc3MgPSB0cnVlOyB9XG4gICAgICBlbHNlIGlmIChjaCA9PT0gXCJdXCIgJiYgaW5DbGFzcykgeyBpbkNsYXNzID0gZmFsc2U7IH1cbiAgICAgIGVsc2UgaWYgKGNoID09PSBcIi9cIiAmJiAhaW5DbGFzcykgeyBicmVhayB9XG4gICAgICBlc2NhcGVkID0gY2ggPT09IFwiXFxcXFwiO1xuICAgIH0gZWxzZSB7IGVzY2FwZWQgPSBmYWxzZTsgfVxuICAgICsrdGhpcy5wb3M7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSB0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LCB0aGlzLnBvcyk7XG4gICsrdGhpcy5wb3M7XG4gIHZhciBmbGFnc1N0YXJ0ID0gdGhpcy5wb3M7XG4gIHZhciBmbGFncyA9IHRoaXMucmVhZFdvcmQxKCk7XG4gIGlmICh0aGlzLmNvbnRhaW5zRXNjKSB7IHRoaXMudW5leHBlY3RlZChmbGFnc1N0YXJ0KTsgfVxuXG4gIC8vIFZhbGlkYXRlIHBhdHRlcm5cbiAgdmFyIHN0YXRlID0gdGhpcy5yZWdleHBTdGF0ZSB8fCAodGhpcy5yZWdleHBTdGF0ZSA9IG5ldyBSZWdFeHBWYWxpZGF0aW9uU3RhdGUodGhpcykpO1xuICBzdGF0ZS5yZXNldChzdGFydCwgcGF0dGVybiwgZmxhZ3MpO1xuICB0aGlzLnZhbGlkYXRlUmVnRXhwRmxhZ3Moc3RhdGUpO1xuICB0aGlzLnZhbGlkYXRlUmVnRXhwUGF0dGVybihzdGF0ZSk7XG5cbiAgLy8gQ3JlYXRlIExpdGVyYWwjdmFsdWUgcHJvcGVydHkgdmFsdWUuXG4gIHZhciB2YWx1ZSA9IG51bGw7XG4gIHRyeSB7XG4gICAgdmFsdWUgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIEVTVHJlZSByZXF1aXJlcyBudWxsIGlmIGl0IGZhaWxlZCB0byBpbnN0YW50aWF0ZSBSZWdFeHAgb2JqZWN0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc3RyZWUvZXN0cmVlL2Jsb2IvYTI3MDAzYWRmNGZkN2JmYWQ0NGRlOWNlZjM3MmEyZWFjZDUyN2IxYy9lczUubWQjcmVnZXhwbGl0ZXJhbFxuICB9XG5cbiAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5yZWdleHAsIHtwYXR0ZXJuOiBwYXR0ZXJuLCBmbGFnczogZmxhZ3MsIHZhbHVlOiB2YWx1ZX0pXG59O1xuXG4vLyBSZWFkIGFuIGludGVnZXIgaW4gdGhlIGdpdmVuIHJhZGl4LiBSZXR1cm4gbnVsbCBpZiB6ZXJvIGRpZ2l0c1xuLy8gd2VyZSByZWFkLCB0aGUgaW50ZWdlciB2YWx1ZSBvdGhlcndpc2UuIFdoZW4gYGxlbmAgaXMgZ2l2ZW4sIHRoaXNcbi8vIHdpbGwgcmV0dXJuIGBudWxsYCB1bmxlc3MgdGhlIGludGVnZXIgaGFzIGV4YWN0bHkgYGxlbmAgZGlnaXRzLlxuXG5wcC5yZWFkSW50ID0gZnVuY3Rpb24ocmFkaXgsIGxlbiwgbWF5YmVMZWdhY3lPY3RhbE51bWVyaWNMaXRlcmFsKSB7XG4gIC8vIGBsZW5gIGlzIHVzZWQgZm9yIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzLiBJbiB0aGF0IGNhc2UsIGRpc2FsbG93IHNlcGFyYXRvcnMuXG4gIHZhciBhbGxvd1NlcGFyYXRvcnMgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTIgJiYgbGVuID09PSB1bmRlZmluZWQ7XG5cbiAgLy8gYG1heWJlTGVnYWN5T2N0YWxOdW1lcmljTGl0ZXJhbGAgaXMgdHJ1ZSBpZiBpdCBkb2Vzbid0IGhhdmUgcHJlZml4ICgweCwwbywwYilcbiAgLy8gYW5kIGlzbid0IGZyYWN0aW9uIHBhcnQgbm9yIGV4cG9uZW50IHBhcnQuIEluIHRoYXQgY2FzZSwgaWYgdGhlIGZpcnN0IGRpZ2l0XG4gIC8vIGlzIHplcm8gdGhlbiBkaXNhbGxvdyBzZXBhcmF0b3JzLlxuICB2YXIgaXNMZWdhY3lPY3RhbE51bWVyaWNMaXRlcmFsID0gbWF5YmVMZWdhY3lPY3RhbE51bWVyaWNMaXRlcmFsICYmIHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcykgPT09IDQ4O1xuXG4gIHZhciBzdGFydCA9IHRoaXMucG9zLCB0b3RhbCA9IDAsIGxhc3RDb2RlID0gMDtcbiAgZm9yICh2YXIgaSA9IDAsIGUgPSBsZW4gPT0gbnVsbCA/IEluZmluaXR5IDogbGVuOyBpIDwgZTsgKytpLCArK3RoaXMucG9zKSB7XG4gICAgdmFyIGNvZGUgPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpLCB2YWwgPSAodm9pZCAwKTtcblxuICAgIGlmIChhbGxvd1NlcGFyYXRvcnMgJiYgY29kZSA9PT0gOTUpIHtcbiAgICAgIGlmIChpc0xlZ2FjeU9jdGFsTnVtZXJpY0xpdGVyYWwpIHsgdGhpcy5yYWlzZVJlY292ZXJhYmxlKHRoaXMucG9zLCBcIk51bWVyaWMgc2VwYXJhdG9yIGlzIG5vdCBhbGxvd2VkIGluIGxlZ2FjeSBvY3RhbCBudW1lcmljIGxpdGVyYWxzXCIpOyB9XG4gICAgICBpZiAobGFzdENvZGUgPT09IDk1KSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZSh0aGlzLnBvcywgXCJOdW1lcmljIHNlcGFyYXRvciBtdXN0IGJlIGV4YWN0bHkgb25lIHVuZGVyc2NvcmVcIik7IH1cbiAgICAgIGlmIChpID09PSAwKSB7IHRoaXMucmFpc2VSZWNvdmVyYWJsZSh0aGlzLnBvcywgXCJOdW1lcmljIHNlcGFyYXRvciBpcyBub3QgYWxsb3dlZCBhdCB0aGUgZmlyc3Qgb2YgZGlnaXRzXCIpOyB9XG4gICAgICBsYXN0Q29kZSA9IGNvZGU7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChjb2RlID49IDk3KSB7IHZhbCA9IGNvZGUgLSA5NyArIDEwOyB9IC8vIGFcbiAgICBlbHNlIGlmIChjb2RlID49IDY1KSB7IHZhbCA9IGNvZGUgLSA2NSArIDEwOyB9IC8vIEFcbiAgICBlbHNlIGlmIChjb2RlID49IDQ4ICYmIGNvZGUgPD0gNTcpIHsgdmFsID0gY29kZSAtIDQ4OyB9IC8vIDAtOVxuICAgIGVsc2UgeyB2YWwgPSBJbmZpbml0eTsgfVxuICAgIGlmICh2YWwgPj0gcmFkaXgpIHsgYnJlYWsgfVxuICAgIGxhc3RDb2RlID0gY29kZTtcbiAgICB0b3RhbCA9IHRvdGFsICogcmFkaXggKyB2YWw7XG4gIH1cblxuICBpZiAoYWxsb3dTZXBhcmF0b3JzICYmIGxhc3RDb2RlID09PSA5NSkgeyB0aGlzLnJhaXNlUmVjb3ZlcmFibGUodGhpcy5wb3MgLSAxLCBcIk51bWVyaWMgc2VwYXJhdG9yIGlzIG5vdCBhbGxvd2VkIGF0IHRoZSBsYXN0IG9mIGRpZ2l0c1wiKTsgfVxuICBpZiAodGhpcy5wb3MgPT09IHN0YXJ0IHx8IGxlbiAhPSBudWxsICYmIHRoaXMucG9zIC0gc3RhcnQgIT09IGxlbikgeyByZXR1cm4gbnVsbCB9XG5cbiAgcmV0dXJuIHRvdGFsXG59O1xuXG5mdW5jdGlvbiBzdHJpbmdUb051bWJlcihzdHIsIGlzTGVnYWN5T2N0YWxOdW1lcmljTGl0ZXJhbCkge1xuICBpZiAoaXNMZWdhY3lPY3RhbE51bWVyaWNMaXRlcmFsKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHN0ciwgOClcbiAgfVxuXG4gIC8vIGBwYXJzZUZsb2F0KHZhbHVlKWAgc3RvcHMgcGFyc2luZyBhdCB0aGUgZmlyc3QgbnVtZXJpYyBzZXBhcmF0b3IgdGhlbiByZXR1cm5zIGEgd3JvbmcgdmFsdWUuXG4gIHJldHVybiBwYXJzZUZsb2F0KHN0ci5yZXBsYWNlKC9fL2csIFwiXCIpKVxufVxuXG5mdW5jdGlvbiBzdHJpbmdUb0JpZ0ludChzdHIpIHtcbiAgaWYgKHR5cGVvZiBCaWdJbnQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBgQmlnSW50KHZhbHVlKWAgdGhyb3dzIHN5bnRheCBlcnJvciBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG51bWVyaWMgc2VwYXJhdG9ycy5cbiAgcmV0dXJuIEJpZ0ludChzdHIucmVwbGFjZSgvXy9nLCBcIlwiKSlcbn1cblxucHAucmVhZFJhZGl4TnVtYmVyID0gZnVuY3Rpb24ocmFkaXgpIHtcbiAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7XG4gIHRoaXMucG9zICs9IDI7IC8vIDB4XG4gIHZhciB2YWwgPSB0aGlzLnJlYWRJbnQocmFkaXgpO1xuICBpZiAodmFsID09IG51bGwpIHsgdGhpcy5yYWlzZSh0aGlzLnN0YXJ0ICsgMiwgXCJFeHBlY3RlZCBudW1iZXIgaW4gcmFkaXggXCIgKyByYWRpeCk7IH1cbiAgaWYgKHRoaXMub3B0aW9ucy5lY21hVmVyc2lvbiA+PSAxMSAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpID09PSAxMTApIHtcbiAgICB2YWwgPSBzdHJpbmdUb0JpZ0ludCh0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LCB0aGlzLnBvcykpO1xuICAgICsrdGhpcy5wb3M7XG4gIH0gZWxzZSBpZiAoaXNJZGVudGlmaWVyU3RhcnQodGhpcy5mdWxsQ2hhckNvZGVBdFBvcygpKSkgeyB0aGlzLnJhaXNlKHRoaXMucG9zLCBcIklkZW50aWZpZXIgZGlyZWN0bHkgYWZ0ZXIgbnVtYmVyXCIpOyB9XG4gIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzJDEubnVtLCB2YWwpXG59O1xuXG4vLyBSZWFkIGFuIGludGVnZXIsIG9jdGFsIGludGVnZXIsIG9yIGZsb2F0aW5nLXBvaW50IG51bWJlci5cblxucHAucmVhZE51bWJlciA9IGZ1bmN0aW9uKHN0YXJ0c1dpdGhEb3QpIHtcbiAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7XG4gIGlmICghc3RhcnRzV2l0aERvdCAmJiB0aGlzLnJlYWRJbnQoMTAsIHVuZGVmaW5lZCwgdHJ1ZSkgPT09IG51bGwpIHsgdGhpcy5yYWlzZShzdGFydCwgXCJJbnZhbGlkIG51bWJlclwiKTsgfVxuICB2YXIgb2N0YWwgPSB0aGlzLnBvcyAtIHN0YXJ0ID49IDIgJiYgdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHN0YXJ0KSA9PT0gNDg7XG4gIGlmIChvY3RhbCAmJiB0aGlzLnN0cmljdCkgeyB0aGlzLnJhaXNlKHN0YXJ0LCBcIkludmFsaWQgbnVtYmVyXCIpOyB9XG4gIHZhciBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgaWYgKCFvY3RhbCAmJiAhc3RhcnRzV2l0aERvdCAmJiB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gMTEgJiYgbmV4dCA9PT0gMTEwKSB7XG4gICAgdmFyIHZhbCQxID0gc3RyaW5nVG9CaWdJbnQodGhpcy5pbnB1dC5zbGljZShzdGFydCwgdGhpcy5wb3MpKTtcbiAgICArK3RoaXMucG9zO1xuICAgIGlmIChpc0lkZW50aWZpZXJTdGFydCh0aGlzLmZ1bGxDaGFyQ29kZUF0UG9zKCkpKSB7IHRoaXMucmFpc2UodGhpcy5wb3MsIFwiSWRlbnRpZmllciBkaXJlY3RseSBhZnRlciBudW1iZXJcIik7IH1cbiAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcyQxLm51bSwgdmFsJDEpXG4gIH1cbiAgaWYgKG9jdGFsICYmIC9bODldLy50ZXN0KHRoaXMuaW5wdXQuc2xpY2Uoc3RhcnQsIHRoaXMucG9zKSkpIHsgb2N0YWwgPSBmYWxzZTsgfVxuICBpZiAobmV4dCA9PT0gNDYgJiYgIW9jdGFsKSB7IC8vICcuJ1xuICAgICsrdGhpcy5wb3M7XG4gICAgdGhpcy5yZWFkSW50KDEwKTtcbiAgICBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgfVxuICBpZiAoKG5leHQgPT09IDY5IHx8IG5leHQgPT09IDEwMSkgJiYgIW9jdGFsKSB7IC8vICdlRSdcbiAgICBuZXh0ID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KCsrdGhpcy5wb3MpO1xuICAgIGlmIChuZXh0ID09PSA0MyB8fCBuZXh0ID09PSA0NSkgeyArK3RoaXMucG9zOyB9IC8vICcrLSdcbiAgICBpZiAodGhpcy5yZWFkSW50KDEwKSA9PT0gbnVsbCkgeyB0aGlzLnJhaXNlKHN0YXJ0LCBcIkludmFsaWQgbnVtYmVyXCIpOyB9XG4gIH1cbiAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KHRoaXMuZnVsbENoYXJDb2RlQXRQb3MoKSkpIHsgdGhpcy5yYWlzZSh0aGlzLnBvcywgXCJJZGVudGlmaWVyIGRpcmVjdGx5IGFmdGVyIG51bWJlclwiKTsgfVxuXG4gIHZhciB2YWwgPSBzdHJpbmdUb051bWJlcih0aGlzLmlucHV0LnNsaWNlKHN0YXJ0LCB0aGlzLnBvcyksIG9jdGFsKTtcbiAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5udW0sIHZhbClcbn07XG5cbi8vIFJlYWQgYSBzdHJpbmcgdmFsdWUsIGludGVycHJldGluZyBiYWNrc2xhc2gtZXNjYXBlcy5cblxucHAucmVhZENvZGVQb2ludCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpLCBjb2RlO1xuXG4gIGlmIChjaCA9PT0gMTIzKSB7IC8vICd7J1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPCA2KSB7IHRoaXMudW5leHBlY3RlZCgpOyB9XG4gICAgdmFyIGNvZGVQb3MgPSArK3RoaXMucG9zO1xuICAgIGNvZGUgPSB0aGlzLnJlYWRIZXhDaGFyKHRoaXMuaW5wdXQuaW5kZXhPZihcIn1cIiwgdGhpcy5wb3MpIC0gdGhpcy5wb3MpO1xuICAgICsrdGhpcy5wb3M7XG4gICAgaWYgKGNvZGUgPiAweDEwRkZGRikgeyB0aGlzLmludmFsaWRTdHJpbmdUb2tlbihjb2RlUG9zLCBcIkNvZGUgcG9pbnQgb3V0IG9mIGJvdW5kc1wiKTsgfVxuICB9IGVsc2Uge1xuICAgIGNvZGUgPSB0aGlzLnJlYWRIZXhDaGFyKDQpO1xuICB9XG4gIHJldHVybiBjb2RlXG59O1xuXG5wcC5yZWFkU3RyaW5nID0gZnVuY3Rpb24ocXVvdGUpIHtcbiAgdmFyIG91dCA9IFwiXCIsIGNodW5rU3RhcnQgPSArK3RoaXMucG9zO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKHRoaXMucG9zID49IHRoaXMuaW5wdXQubGVuZ3RoKSB7IHRoaXMucmFpc2UodGhpcy5zdGFydCwgXCJVbnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50XCIpOyB9XG4gICAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICBpZiAoY2ggPT09IHF1b3RlKSB7IGJyZWFrIH1cbiAgICBpZiAoY2ggPT09IDkyKSB7IC8vICdcXCdcbiAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMucG9zKTtcbiAgICAgIG91dCArPSB0aGlzLnJlYWRFc2NhcGVkQ2hhcihmYWxzZSk7XG4gICAgICBjaHVua1N0YXJ0ID0gdGhpcy5wb3M7XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyMDI4IHx8IGNoID09PSAweDIwMjkpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPCAxMCkgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudFwiKTsgfVxuICAgICAgKyt0aGlzLnBvcztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubG9jYXRpb25zKSB7XG4gICAgICAgIHRoaXMuY3VyTGluZSsrO1xuICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMucG9zO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNOZXdMaW5lKGNoKSkgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudFwiKTsgfVxuICAgICAgKyt0aGlzLnBvcztcbiAgICB9XG4gIH1cbiAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MrKyk7XG4gIHJldHVybiB0aGlzLmZpbmlzaFRva2VuKHR5cGVzJDEuc3RyaW5nLCBvdXQpXG59O1xuXG4vLyBSZWFkcyB0ZW1wbGF0ZSBzdHJpbmcgdG9rZW5zLlxuXG52YXIgSU5WQUxJRF9URU1QTEFURV9FU0NBUEVfRVJST1IgPSB7fTtcblxucHAudHJ5UmVhZFRlbXBsYXRlVG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pblRlbXBsYXRlRWxlbWVudCA9IHRydWU7XG4gIHRyeSB7XG4gICAgdGhpcy5yZWFkVG1wbFRva2VuKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgPT09IElOVkFMSURfVEVNUExBVEVfRVNDQVBFX0VSUk9SKSB7XG4gICAgICB0aGlzLnJlYWRJbnZhbGlkVGVtcGxhdGVUb2tlbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cblxuICB0aGlzLmluVGVtcGxhdGVFbGVtZW50ID0gZmFsc2U7XG59O1xuXG5wcC5pbnZhbGlkU3RyaW5nVG9rZW4gPSBmdW5jdGlvbihwb3NpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAodGhpcy5pblRlbXBsYXRlRWxlbWVudCAmJiB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gOSkge1xuICAgIHRocm93IElOVkFMSURfVEVNUExBVEVfRVNDQVBFX0VSUk9SXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yYWlzZShwb3NpdGlvbiwgbWVzc2FnZSk7XG4gIH1cbn07XG5cbnBwLnJlYWRUbXBsVG9rZW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIG91dCA9IFwiXCIsIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgZm9yICg7Oykge1xuICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmlucHV0Lmxlbmd0aCkgeyB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHRlbXBsYXRlXCIpOyB9XG4gICAgdmFyIGNoID0gdGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKTtcbiAgICBpZiAoY2ggPT09IDk2IHx8IGNoID09PSAzNiAmJiB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MgKyAxKSA9PT0gMTIzKSB7IC8vICdgJywgJyR7J1xuICAgICAgaWYgKHRoaXMucG9zID09PSB0aGlzLnN0YXJ0ICYmICh0aGlzLnR5cGUgPT09IHR5cGVzJDEudGVtcGxhdGUgfHwgdGhpcy50eXBlID09PSB0eXBlcyQxLmludmFsaWRUZW1wbGF0ZSkpIHtcbiAgICAgICAgaWYgKGNoID09PSAzNikge1xuICAgICAgICAgIHRoaXMucG9zICs9IDI7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5kb2xsYXJCcmFjZUwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKyt0aGlzLnBvcztcbiAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlcyQxLmJhY2tRdW90ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb3V0ICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS50ZW1wbGF0ZSwgb3V0KVxuICAgIH1cbiAgICBpZiAoY2ggPT09IDkyKSB7IC8vICdcXCdcbiAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMucG9zKTtcbiAgICAgIG91dCArPSB0aGlzLnJlYWRFc2NhcGVkQ2hhcih0cnVlKTtcbiAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgICB9IGVsc2UgaWYgKGlzTmV3TGluZShjaCkpIHtcbiAgICAgIG91dCArPSB0aGlzLmlucHV0LnNsaWNlKGNodW5rU3RhcnQsIHRoaXMucG9zKTtcbiAgICAgICsrdGhpcy5wb3M7XG4gICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICBjYXNlIDEzOlxuICAgICAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KHRoaXMucG9zKSA9PT0gMTApIHsgKyt0aGlzLnBvczsgfVxuICAgICAgY2FzZSAxMDpcbiAgICAgICAgb3V0ICs9IFwiXFxuXCI7XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmxvY2F0aW9ucykge1xuICAgICAgICArK3RoaXMuY3VyTGluZTtcbiAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLnBvcztcbiAgICAgIH1cbiAgICAgIGNodW5rU3RhcnQgPSB0aGlzLnBvcztcbiAgICB9IGVsc2Uge1xuICAgICAgKyt0aGlzLnBvcztcbiAgICB9XG4gIH1cbn07XG5cbi8vIFJlYWRzIGEgdGVtcGxhdGUgdG9rZW4gdG8gc2VhcmNoIGZvciB0aGUgZW5kLCB3aXRob3V0IHZhbGlkYXRpbmcgYW55IGVzY2FwZSBzZXF1ZW5jZXNcbnBwLnJlYWRJbnZhbGlkVGVtcGxhdGVUb2tlbiA9IGZ1bmN0aW9uKCkge1xuICBmb3IgKDsgdGhpcy5wb3MgPCB0aGlzLmlucHV0Lmxlbmd0aDsgdGhpcy5wb3MrKykge1xuICAgIHN3aXRjaCAodGhpcy5pbnB1dFt0aGlzLnBvc10pIHtcbiAgICBjYXNlIFwiXFxcXFwiOlxuICAgICAgKyt0aGlzLnBvcztcbiAgICAgIGJyZWFrXG5cbiAgICBjYXNlIFwiJFwiOlxuICAgICAgaWYgKHRoaXMuaW5wdXRbdGhpcy5wb3MgKyAxXSAhPT0gXCJ7XCIpIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICBjYXNlIFwiYFwiOlxuICAgICAgcmV0dXJuIHRoaXMuZmluaXNoVG9rZW4odHlwZXMkMS5pbnZhbGlkVGVtcGxhdGUsIHRoaXMuaW5wdXQuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5wb3MpKVxuXG4gICAgLy8gbm8gZGVmYXVsdFxuICAgIH1cbiAgfVxuICB0aGlzLnJhaXNlKHRoaXMuc3RhcnQsIFwiVW50ZXJtaW5hdGVkIHRlbXBsYXRlXCIpO1xufTtcblxuLy8gVXNlZCB0byByZWFkIGVzY2FwZWQgY2hhcmFjdGVyc1xuXG5wcC5yZWFkRXNjYXBlZENoYXIgPSBmdW5jdGlvbihpblRlbXBsYXRlKSB7XG4gIHZhciBjaCA9IHRoaXMuaW5wdXQuY2hhckNvZGVBdCgrK3RoaXMucG9zKTtcbiAgKyt0aGlzLnBvcztcbiAgc3dpdGNoIChjaCkge1xuICBjYXNlIDExMDogcmV0dXJuIFwiXFxuXCIgLy8gJ24nIC0+ICdcXG4nXG4gIGNhc2UgMTE0OiByZXR1cm4gXCJcXHJcIiAvLyAncicgLT4gJ1xccidcbiAgY2FzZSAxMjA6IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMucmVhZEhleENoYXIoMikpIC8vICd4J1xuICBjYXNlIDExNzogcmV0dXJuIGNvZGVQb2ludFRvU3RyaW5nKHRoaXMucmVhZENvZGVQb2ludCgpKSAvLyAndSdcbiAgY2FzZSAxMTY6IHJldHVybiBcIlxcdFwiIC8vICd0JyAtPiAnXFx0J1xuICBjYXNlIDk4OiByZXR1cm4gXCJcXGJcIiAvLyAnYicgLT4gJ1xcYidcbiAgY2FzZSAxMTg6IHJldHVybiBcIlxcdTAwMGJcIiAvLyAndicgLT4gJ1xcdTAwMGInXG4gIGNhc2UgMTAyOiByZXR1cm4gXCJcXGZcIiAvLyAnZicgLT4gJ1xcZidcbiAgY2FzZSAxMzogaWYgKHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLnBvcykgPT09IDEwKSB7ICsrdGhpcy5wb3M7IH0gLy8gJ1xcclxcbidcbiAgY2FzZSAxMDogLy8gJyBcXG4nXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb2NhdGlvbnMpIHsgdGhpcy5saW5lU3RhcnQgPSB0aGlzLnBvczsgKyt0aGlzLmN1ckxpbmU7IH1cbiAgICByZXR1cm4gXCJcIlxuICBjYXNlIDU2OlxuICBjYXNlIDU3OlxuICAgIGlmICh0aGlzLnN0cmljdCkge1xuICAgICAgdGhpcy5pbnZhbGlkU3RyaW5nVG9rZW4oXG4gICAgICAgIHRoaXMucG9zIC0gMSxcbiAgICAgICAgXCJJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZVwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaW5UZW1wbGF0ZSkge1xuICAgICAgdmFyIGNvZGVQb3MgPSB0aGlzLnBvcyAtIDE7XG5cbiAgICAgIHRoaXMuaW52YWxpZFN0cmluZ1Rva2VuKFxuICAgICAgICBjb2RlUG9zLFxuICAgICAgICBcIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHRlbXBsYXRlIHN0cmluZ1wiXG4gICAgICApO1xuICAgIH1cbiAgZGVmYXVsdDpcbiAgICBpZiAoY2ggPj0gNDggJiYgY2ggPD0gNTUpIHtcbiAgICAgIHZhciBvY3RhbFN0ciA9IHRoaXMuaW5wdXQuc3Vic3RyKHRoaXMucG9zIC0gMSwgMykubWF0Y2goL15bMC03XSsvKVswXTtcbiAgICAgIHZhciBvY3RhbCA9IHBhcnNlSW50KG9jdGFsU3RyLCA4KTtcbiAgICAgIGlmIChvY3RhbCA+IDI1NSkge1xuICAgICAgICBvY3RhbFN0ciA9IG9jdGFsU3RyLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgb2N0YWwgPSBwYXJzZUludChvY3RhbFN0ciwgOCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBvcyArPSBvY3RhbFN0ci5sZW5ndGggLSAxO1xuICAgICAgY2ggPSB0aGlzLmlucHV0LmNoYXJDb2RlQXQodGhpcy5wb3MpO1xuICAgICAgaWYgKChvY3RhbFN0ciAhPT0gXCIwXCIgfHwgY2ggPT09IDU2IHx8IGNoID09PSA1NykgJiYgKHRoaXMuc3RyaWN0IHx8IGluVGVtcGxhdGUpKSB7XG4gICAgICAgIHRoaXMuaW52YWxpZFN0cmluZ1Rva2VuKFxuICAgICAgICAgIHRoaXMucG9zIC0gMSAtIG9jdGFsU3RyLmxlbmd0aCxcbiAgICAgICAgICBpblRlbXBsYXRlXG4gICAgICAgICAgICA/IFwiT2N0YWwgbGl0ZXJhbCBpbiB0ZW1wbGF0ZSBzdHJpbmdcIlxuICAgICAgICAgICAgOiBcIk9jdGFsIGxpdGVyYWwgaW4gc3RyaWN0IG1vZGVcIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUob2N0YWwpXG4gICAgfVxuICAgIGlmIChpc05ld0xpbmUoY2gpKSB7XG4gICAgICAvLyBVbmljb2RlIG5ldyBsaW5lIGNoYXJhY3RlcnMgYWZ0ZXIgXFwgZ2V0IHJlbW92ZWQgZnJvbSBvdXRwdXQgaW4gYm90aFxuICAgICAgLy8gdGVtcGxhdGUgbGl0ZXJhbHMgYW5kIHN0cmluZ3NcbiAgICAgIHJldHVybiBcIlwiXG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKVxuICB9XG59O1xuXG4vLyBVc2VkIHRvIHJlYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgKCdcXHgnLCAnXFx1JywgJ1xcVScpLlxuXG5wcC5yZWFkSGV4Q2hhciA9IGZ1bmN0aW9uKGxlbikge1xuICB2YXIgY29kZVBvcyA9IHRoaXMucG9zO1xuICB2YXIgbiA9IHRoaXMucmVhZEludCgxNiwgbGVuKTtcbiAgaWYgKG4gPT09IG51bGwpIHsgdGhpcy5pbnZhbGlkU3RyaW5nVG9rZW4oY29kZVBvcywgXCJCYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZVwiKTsgfVxuICByZXR1cm4gblxufTtcblxuLy8gUmVhZCBhbiBpZGVudGlmaWVyLCBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nLiBTZXRzIGB0aGlzLmNvbnRhaW5zRXNjYFxuLy8gdG8gd2hldGhlciB0aGUgd29yZCBjb250YWluZWQgYSAnXFx1JyBlc2NhcGUuXG4vL1xuLy8gSW5jcmVtZW50YWxseSBhZGRzIG9ubHkgZXNjYXBlZCBjaGFycywgYWRkaW5nIG90aGVyIGNodW5rcyBhcy1pc1xuLy8gYXMgYSBtaWNyby1vcHRpbWl6YXRpb24uXG5cbnBwLnJlYWRXb3JkMSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNvbnRhaW5zRXNjID0gZmFsc2U7XG4gIHZhciB3b3JkID0gXCJcIiwgZmlyc3QgPSB0cnVlLCBjaHVua1N0YXJ0ID0gdGhpcy5wb3M7XG4gIHZhciBhc3RyYWwgPSB0aGlzLm9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNjtcbiAgd2hpbGUgKHRoaXMucG9zIDwgdGhpcy5pbnB1dC5sZW5ndGgpIHtcbiAgICB2YXIgY2ggPSB0aGlzLmZ1bGxDaGFyQ29kZUF0UG9zKCk7XG4gICAgaWYgKGlzSWRlbnRpZmllckNoYXIoY2gsIGFzdHJhbCkpIHtcbiAgICAgIHRoaXMucG9zICs9IGNoIDw9IDB4ZmZmZiA/IDEgOiAyO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09IDkyKSB7IC8vIFwiXFxcIlxuICAgICAgdGhpcy5jb250YWluc0VzYyA9IHRydWU7XG4gICAgICB3b3JkICs9IHRoaXMuaW5wdXQuc2xpY2UoY2h1bmtTdGFydCwgdGhpcy5wb3MpO1xuICAgICAgdmFyIGVzY1N0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICBpZiAodGhpcy5pbnB1dC5jaGFyQ29kZUF0KCsrdGhpcy5wb3MpICE9PSAxMTcpIC8vIFwidVwiXG4gICAgICAgIHsgdGhpcy5pbnZhbGlkU3RyaW5nVG9rZW4odGhpcy5wb3MsIFwiRXhwZWN0aW5nIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlIFxcXFx1WFhYWFwiKTsgfVxuICAgICAgKyt0aGlzLnBvcztcbiAgICAgIHZhciBlc2MgPSB0aGlzLnJlYWRDb2RlUG9pbnQoKTtcbiAgICAgIGlmICghKGZpcnN0ID8gaXNJZGVudGlmaWVyU3RhcnQgOiBpc0lkZW50aWZpZXJDaGFyKShlc2MsIGFzdHJhbCkpXG4gICAgICAgIHsgdGhpcy5pbnZhbGlkU3RyaW5nVG9rZW4oZXNjU3RhcnQsIFwiSW52YWxpZCBVbmljb2RlIGVzY2FwZVwiKTsgfVxuICAgICAgd29yZCArPSBjb2RlUG9pbnRUb1N0cmluZyhlc2MpO1xuICAgICAgY2h1bmtTdGFydCA9IHRoaXMucG9zO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgICBmaXJzdCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB3b3JkICsgdGhpcy5pbnB1dC5zbGljZShjaHVua1N0YXJ0LCB0aGlzLnBvcylcbn07XG5cbi8vIFJlYWQgYW4gaWRlbnRpZmllciBvciBrZXl3b3JkIHRva2VuLiBXaWxsIGNoZWNrIGZvciByZXNlcnZlZFxuLy8gd29yZHMgd2hlbiBuZWNlc3NhcnkuXG5cbnBwLnJlYWRXb3JkID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3b3JkID0gdGhpcy5yZWFkV29yZDEoKTtcbiAgdmFyIHR5cGUgPSB0eXBlcyQxLm5hbWU7XG4gIGlmICh0aGlzLmtleXdvcmRzLnRlc3Qod29yZCkpIHtcbiAgICB0eXBlID0ga2V5d29yZHMkMlt3b3JkXTtcbiAgfVxuICByZXR1cm4gdGhpcy5maW5pc2hUb2tlbih0eXBlLCB3b3JkKVxufTtcblxuLy8gQWNvcm4gaXMgYSB0aW55LCBmYXN0IEphdmFTY3JpcHQgcGFyc2VyIHdyaXR0ZW4gaW4gSmF2YVNjcmlwdC5cblxudmFyIHZlcnNpb24kMiA9IFwiOC44LjJcIjtcblxuUGFyc2VyJDEuYWNvcm4gPSB7XG4gIFBhcnNlcjogUGFyc2VyJDEsXG4gIHZlcnNpb246IHZlcnNpb24kMixcbiAgZGVmYXVsdE9wdGlvbnM6IGRlZmF1bHRPcHRpb25zLFxuICBQb3NpdGlvbjogUG9zaXRpb24sXG4gIFNvdXJjZUxvY2F0aW9uOiBTb3VyY2VMb2NhdGlvbixcbiAgZ2V0TGluZUluZm86IGdldExpbmVJbmZvLFxuICBOb2RlOiBOb2RlLFxuICBUb2tlblR5cGU6IFRva2VuVHlwZSxcbiAgdG9rVHlwZXM6IHR5cGVzJDEsXG4gIGtleXdvcmRUeXBlczoga2V5d29yZHMkMixcbiAgVG9rQ29udGV4dDogVG9rQ29udGV4dCxcbiAgdG9rQ29udGV4dHM6IHR5cGVzJDIsXG4gIGlzSWRlbnRpZmllckNoYXI6IGlzSWRlbnRpZmllckNoYXIsXG4gIGlzSWRlbnRpZmllclN0YXJ0OiBpc0lkZW50aWZpZXJTdGFydCxcbiAgVG9rZW46IFRva2VuLFxuICBpc05ld0xpbmU6IGlzTmV3TGluZSxcbiAgbGluZUJyZWFrOiBsaW5lQnJlYWssXG4gIGxpbmVCcmVha0c6IGxpbmVCcmVha0csXG4gIG5vbkFTQ0lJd2hpdGVzcGFjZTogbm9uQVNDSUl3aGl0ZXNwYWNlXG59O1xuXG4vLyBUaGUgbWFpbiBleHBvcnRlZCBpbnRlcmZhY2UgKHVuZGVyIGBzZWxmLmFjb3JuYCB3aGVuIGluIHRoZVxuLy8gYnJvd3NlcikgaXMgYSBgcGFyc2VgIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjb2RlIHN0cmluZyBhbmRcbi8vIHJldHVybnMgYW4gYWJzdHJhY3Qgc3ludGF4IHRyZWUgYXMgc3BlY2lmaWVkIGJ5IFtNb3ppbGxhIHBhcnNlclxuLy8gQVBJXVthcGldLlxuLy9cbi8vIFthcGldOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1NwaWRlck1vbmtleS9QYXJzZXJfQVBJXG5cbmZ1bmN0aW9uIHBhcnNlJGQoaW5wdXQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIFBhcnNlciQxLnBhcnNlKGlucHV0LCBvcHRpb25zKVxufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHBhcnNlIGEgc2luZ2xlIGV4cHJlc3Npb24gYXQgYSBnaXZlblxuLy8gb2Zmc2V0IGluIGEgc3RyaW5nLiBVc2VmdWwgZm9yIHBhcnNpbmcgbWl4ZWQtbGFuZ3VhZ2UgZm9ybWF0c1xuLy8gdGhhdCBlbWJlZCBKYXZhU2NyaXB0IGV4cHJlc3Npb25zLlxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb25BdChpbnB1dCwgcG9zLCBvcHRpb25zKSB7XG4gIHJldHVybiBQYXJzZXIkMS5wYXJzZUV4cHJlc3Npb25BdChpbnB1dCwgcG9zLCBvcHRpb25zKVxufVxuXG4vLyBBY29ybiBpcyBvcmdhbml6ZWQgYXMgYSB0b2tlbml6ZXIgYW5kIGEgcmVjdXJzaXZlLWRlc2NlbnQgcGFyc2VyLlxuLy8gVGhlIGB0b2tlbml6ZXJgIGV4cG9ydCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIHRva2VuaXplci5cblxuZnVuY3Rpb24gdG9rZW5pemVyKGlucHV0LCBvcHRpb25zKSB7XG4gIHJldHVybiBQYXJzZXIkMS50b2tlbml6ZXIoaW5wdXQsIG9wdGlvbnMpXG59XG5cbnZhciBhY29ybiA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHROb2RlOiBOb2RlLFxuXHRQYXJzZXI6IFBhcnNlciQxLFxuXHRQb3NpdGlvbjogUG9zaXRpb24sXG5cdFNvdXJjZUxvY2F0aW9uOiBTb3VyY2VMb2NhdGlvbixcblx0VG9rQ29udGV4dDogVG9rQ29udGV4dCxcblx0VG9rZW46IFRva2VuLFxuXHRUb2tlblR5cGU6IFRva2VuVHlwZSxcblx0ZGVmYXVsdE9wdGlvbnM6IGRlZmF1bHRPcHRpb25zLFxuXHRnZXRMaW5lSW5mbzogZ2V0TGluZUluZm8sXG5cdGlzSWRlbnRpZmllckNoYXI6IGlzSWRlbnRpZmllckNoYXIsXG5cdGlzSWRlbnRpZmllclN0YXJ0OiBpc0lkZW50aWZpZXJTdGFydCxcblx0aXNOZXdMaW5lOiBpc05ld0xpbmUsXG5cdGtleXdvcmRUeXBlczoga2V5d29yZHMkMixcblx0bGluZUJyZWFrOiBsaW5lQnJlYWssXG5cdGxpbmVCcmVha0c6IGxpbmVCcmVha0csXG5cdG5vbkFTQ0lJd2hpdGVzcGFjZTogbm9uQVNDSUl3aGl0ZXNwYWNlLFxuXHRwYXJzZTogcGFyc2UkZCxcblx0cGFyc2VFeHByZXNzaW9uQXQ6IHBhcnNlRXhwcmVzc2lvbkF0LFxuXHR0b2tDb250ZXh0czogdHlwZXMkMixcblx0dG9rVHlwZXM6IHR5cGVzJDEsXG5cdHRva2VuaXplcjogdG9rZW5pemVyLFxuXHR2ZXJzaW9uOiB2ZXJzaW9uJDJcbn07XG5cbmNvbnN0IEhBU0hfUkUgPSAvIy9nO1xuY29uc3QgQU1QRVJTQU5EX1JFID0gLyYvZztcbmNvbnN0IEVRVUFMX1JFID0gLz0vZztcbmNvbnN0IFBMVVNfUkUgPSAvXFwrL2c7XG5jb25zdCBFTkNfQ0FSRVRfUkUgPSAvJTVlL2dpO1xuY29uc3QgRU5DX0JBQ0tUSUNLX1JFID0gLyU2MC9naTtcbmNvbnN0IEVOQ19QSVBFX1JFID0gLyU3Yy9naTtcbmNvbnN0IEVOQ19TUEFDRV9SRSA9IC8lMjAvZ2k7XG5mdW5jdGlvbiBlbmNvZGUodGV4dCkge1xuICByZXR1cm4gZW5jb2RlVVJJKFwiXCIgKyB0ZXh0KS5yZXBsYWNlKEVOQ19QSVBFX1JFLCBcInxcIik7XG59XG5mdW5jdGlvbiBlbmNvZGVRdWVyeVZhbHVlKGlucHV0KSB7XG4gIHJldHVybiBlbmNvZGUodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiID8gaW5wdXQgOiBKU09OLnN0cmluZ2lmeShpbnB1dCkpLnJlcGxhY2UoUExVU19SRSwgXCIlMkJcIikucmVwbGFjZShFTkNfU1BBQ0VfUkUsIFwiK1wiKS5yZXBsYWNlKEhBU0hfUkUsIFwiJTIzXCIpLnJlcGxhY2UoQU1QRVJTQU5EX1JFLCBcIiUyNlwiKS5yZXBsYWNlKEVOQ19CQUNLVElDS19SRSwgXCJgXCIpLnJlcGxhY2UoRU5DX0NBUkVUX1JFLCBcIl5cIik7XG59XG5mdW5jdGlvbiBlbmNvZGVRdWVyeUtleSh0ZXh0KSB7XG4gIHJldHVybiBlbmNvZGVRdWVyeVZhbHVlKHRleHQpLnJlcGxhY2UoRVFVQUxfUkUsIFwiJTNEXCIpO1xufVxuZnVuY3Rpb24gZW5jb2RlUXVlcnlJdGVtKGtleSwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICB9XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gZW5jb2RlUXVlcnlLZXkoa2V5KTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKChfdmFsdWUpID0+IGAke2VuY29kZVF1ZXJ5S2V5KGtleSl9PSR7ZW5jb2RlUXVlcnlWYWx1ZShfdmFsdWUpfWApLmpvaW4oXCImXCIpO1xuICB9XG4gIHJldHVybiBgJHtlbmNvZGVRdWVyeUtleShrZXkpfT0ke2VuY29kZVF1ZXJ5VmFsdWUodmFsdWUpfWA7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlRdWVyeShxdWVyeSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMocXVlcnkpLmZpbHRlcigoaykgPT4gcXVlcnlba10gIT09IHZvaWQgMCkubWFwKChrKSA9PiBlbmNvZGVRdWVyeUl0ZW0oaywgcXVlcnlba10pKS5qb2luKFwiJlwiKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hBbGwocmVnZXgsIHN0cmluZywgYWRkaXRpb24pIHtcbiAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIHN0cmluZy5tYXRjaEFsbChyZWdleCkpIHtcbiAgICBtYXRjaGVzLnB1c2goe1xuICAgICAgLi4uYWRkaXRpb24sXG4gICAgICAuLi5tYXRjaC5ncm91cHMsXG4gICAgICBjb2RlOiBtYXRjaFswXSxcbiAgICAgIHN0YXJ0OiBtYXRjaC5pbmRleCxcbiAgICAgIGVuZDogbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGhcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlcztcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBFcnJub0V4Y2VwdGlvbkZpZWxkc1xuICogQHByb3BlcnR5IHtudW1iZXIgfCB1bmRlZmluZWR9IFtlcnJub2RlXVxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IFtjb2RlXVxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IFtwYXRoXVxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IFtzeXNjYWxsXVxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IFt1cmxdXG4gKlxuICogQHR5cGVkZWYge0Vycm9yICYgRXJybm9FeGNlcHRpb25GaWVsZHN9IEVycm5vRXhjZXB0aW9uXG4gKi9cblxuY29uc3QgaXNXaW5kb3dzJDMgPSBwcm9jZXNzJDEucGxhdGZvcm0gPT09ICd3aW4zMic7XG5cbmNvbnN0IG93biQxID0ge30uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ3JlYXRlIGEgbGlzdCBzdHJpbmcgaW4gdGhlIGZvcm0gbGlrZSAnQSBhbmQgQicgb3IgJ0EsIEIsIC4uLiwgYW5kIFonLlxuICogV2UgY2Fubm90IHVzZSBJbnRsLkxpc3RGb3JtYXQgYmVjYXVzZSBpdCdzIG5vdCBhdmFpbGFibGUgaW5cbiAqIC0td2l0aG91dC1pbnRsIGJ1aWxkcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFycmF5XG4gKiAgIEFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3R5cGVdXG4gKiAgIFRoZSBsaXN0IHR5cGUgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBsYXN0IGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBmb3JtYXRMaXN0KGFycmF5LCB0eXBlID0gJ2FuZCcpIHtcbiAgcmV0dXJuIGFycmF5Lmxlbmd0aCA8IDNcbiAgICA/IGFycmF5LmpvaW4oYCAke3R5cGV9IGApXG4gICAgOiBgJHthcnJheS5zbGljZSgwLCAtMSkuam9pbignLCAnKX0sICR7dHlwZX0gJHthcnJheVthcnJheS5sZW5ndGggLSAxXX1gXG59XG5cbi8qKiBAdHlwZSB7TWFwPHN0cmluZywgTWVzc2FnZUZ1bmN0aW9ufHN0cmluZz59ICovXG5jb25zdCBtZXNzYWdlcyA9IG5ldyBNYXAoKTtcbmNvbnN0IG5vZGVJbnRlcm5hbFByZWZpeCA9ICdfX25vZGVfaW50ZXJuYWxfJztcbi8qKiBAdHlwZSB7bnVtYmVyfSAqL1xubGV0IHVzZXJTdGFja1RyYWNlTGltaXQ7XG5cbmNyZWF0ZUVycm9yKFxuICAnRVJSX0lOVkFMSURfTU9EVUxFX1NQRUNJRklFUicsXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZV1cbiAgICovXG4gIChyZXF1ZXN0LCByZWFzb24sIGJhc2UgPSB1bmRlZmluZWQpID0+IHtcbiAgICByZXR1cm4gYEludmFsaWQgbW9kdWxlIFwiJHtyZXF1ZXN0fVwiICR7cmVhc29ufSR7XG4gICAgICBiYXNlID8gYCBpbXBvcnRlZCBmcm9tICR7YmFzZX1gIDogJydcbiAgICB9YFxuICB9LFxuICBUeXBlRXJyb3Jcbik7XG5cbmNyZWF0ZUVycm9yKFxuICAnRVJSX0lOVkFMSURfUEFDS0FHRV9DT05GSUcnLFxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdXG4gICAqL1xuICAocGF0aCwgYmFzZSwgbWVzc2FnZSkgPT4ge1xuICAgIHJldHVybiBgSW52YWxpZCBwYWNrYWdlIGNvbmZpZyAke3BhdGh9JHtcbiAgICAgIGJhc2UgPyBgIHdoaWxlIGltcG9ydGluZyAke2Jhc2V9YCA6ICcnXG4gICAgfSR7bWVzc2FnZSA/IGAuICR7bWVzc2FnZX1gIDogJyd9YFxuICB9LFxuICBFcnJvclxuKTtcblxuY3JlYXRlRXJyb3IoXG4gICdFUlJfSU5WQUxJRF9QQUNLQUdFX1RBUkdFVCcsXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGtnUGF0aFxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzSW1wb3J0PWZhbHNlXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VdXG4gICAqL1xuICAocGtnUGF0aCwga2V5LCB0YXJnZXQsIGlzSW1wb3J0ID0gZmFsc2UsIGJhc2UgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCByZWxFcnJvciA9XG4gICAgICB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgIWlzSW1wb3J0ICYmXG4gICAgICB0YXJnZXQubGVuZ3RoID4gMCAmJlxuICAgICAgIXRhcmdldC5zdGFydHNXaXRoKCcuLycpO1xuICAgIGlmIChrZXkgPT09ICcuJykge1xuICAgICAgYXNzZXJ0JDEoaXNJbXBvcnQgPT09IGZhbHNlKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGBJbnZhbGlkIFwiZXhwb3J0c1wiIG1haW4gdGFyZ2V0ICR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0KX0gZGVmaW5lZCBgICtcbiAgICAgICAgYGluIHRoZSBwYWNrYWdlIGNvbmZpZyAke3BrZ1BhdGh9cGFja2FnZS5qc29uJHtcbiAgICAgICAgICBiYXNlID8gYCBpbXBvcnRlZCBmcm9tICR7YmFzZX1gIDogJydcbiAgICAgICAgfSR7cmVsRXJyb3IgPyAnOyB0YXJnZXRzIG11c3Qgc3RhcnQgd2l0aCBcIi4vXCInIDogJyd9YFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBgSW52YWxpZCBcIiR7XG4gICAgICBpc0ltcG9ydCA/ICdpbXBvcnRzJyA6ICdleHBvcnRzJ1xuICAgIH1cIiB0YXJnZXQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgIHRhcmdldFxuICAgICl9IGRlZmluZWQgZm9yICcke2tleX0nIGluIHRoZSBwYWNrYWdlIGNvbmZpZyAke3BrZ1BhdGh9cGFja2FnZS5qc29uJHtcbiAgICAgIGJhc2UgPyBgIGltcG9ydGVkIGZyb20gJHtiYXNlfWAgOiAnJ1xuICAgIH0ke3JlbEVycm9yID8gJzsgdGFyZ2V0cyBtdXN0IHN0YXJ0IHdpdGggXCIuL1wiJyA6ICcnfWBcbiAgfSxcbiAgRXJyb3Jcbik7XG5cbmNyZWF0ZUVycm9yKFxuICAnRVJSX01PRFVMRV9OT1RfRk9VTkQnLFxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlXVxuICAgKi9cbiAgKHBhdGgsIGJhc2UsIHR5cGUgPSAncGFja2FnZScpID0+IHtcbiAgICByZXR1cm4gYENhbm5vdCBmaW5kICR7dHlwZX0gJyR7cGF0aH0nIGltcG9ydGVkIGZyb20gJHtiYXNlfWBcbiAgfSxcbiAgRXJyb3Jcbik7XG5cbmNyZWF0ZUVycm9yKFxuICAnRVJSX05FVFdPUktfSU1QT1JUX0RJU0FMTE9XRUQnLFxuICBcImltcG9ydCBvZiAnJXMnIGJ5ICVzIGlzIG5vdCBzdXBwb3J0ZWQ6ICVzXCIsXG4gIEVycm9yXG4pO1xuXG5jcmVhdGVFcnJvcihcbiAgJ0VSUl9QQUNLQUdFX0lNUE9SVF9OT1RfREVGSU5FRCcsXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3BlY2lmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYWNrYWdlUGF0aFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVxuICAgKi9cbiAgKHNwZWNpZmllciwgcGFja2FnZVBhdGgsIGJhc2UpID0+IHtcbiAgICByZXR1cm4gYFBhY2thZ2UgaW1wb3J0IHNwZWNpZmllciBcIiR7c3BlY2lmaWVyfVwiIGlzIG5vdCBkZWZpbmVkJHtcbiAgICAgIHBhY2thZ2VQYXRoID8gYCBpbiBwYWNrYWdlICR7cGFja2FnZVBhdGh9cGFja2FnZS5qc29uYCA6ICcnXG4gICAgfSBpbXBvcnRlZCBmcm9tICR7YmFzZX1gXG4gIH0sXG4gIFR5cGVFcnJvclxuKTtcblxuY3JlYXRlRXJyb3IoXG4gICdFUlJfUEFDS0FHRV9QQVRIX05PVF9FWFBPUlRFRCcsXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGtnUGF0aFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VicGF0aFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VdXG4gICAqL1xuICAocGtnUGF0aCwgc3VicGF0aCwgYmFzZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGlmIChzdWJwYXRoID09PSAnLicpXG4gICAgICByZXR1cm4gYE5vIFwiZXhwb3J0c1wiIG1haW4gZGVmaW5lZCBpbiAke3BrZ1BhdGh9cGFja2FnZS5qc29uJHtcbiAgICAgICAgYmFzZSA/IGAgaW1wb3J0ZWQgZnJvbSAke2Jhc2V9YCA6ICcnXG4gICAgICB9YFxuICAgIHJldHVybiBgUGFja2FnZSBzdWJwYXRoICcke3N1YnBhdGh9JyBpcyBub3QgZGVmaW5lZCBieSBcImV4cG9ydHNcIiBpbiAke3BrZ1BhdGh9cGFja2FnZS5qc29uJHtcbiAgICAgIGJhc2UgPyBgIGltcG9ydGVkIGZyb20gJHtiYXNlfWAgOiAnJ1xuICAgIH1gXG4gIH0sXG4gIEVycm9yXG4pO1xuXG5jcmVhdGVFcnJvcihcbiAgJ0VSUl9VTlNVUFBPUlRFRF9ESVJfSU1QT1JUJyxcbiAgXCJEaXJlY3RvcnkgaW1wb3J0ICclcycgaXMgbm90IHN1cHBvcnRlZCBcIiArXG4gICAgJ3Jlc29sdmluZyBFUyBtb2R1bGVzIGltcG9ydGVkIGZyb20gJXMnLFxuICBFcnJvclxuKTtcblxuY3JlYXRlRXJyb3IoXG4gICdFUlJfVU5LTk9XTl9GSUxFX0VYVEVOU0lPTicsXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICAoZXh0LCBwYXRoKSA9PiB7XG4gICAgcmV0dXJuIGBVbmtub3duIGZpbGUgZXh0ZW5zaW9uIFwiJHtleHR9XCIgZm9yICR7cGF0aH1gXG4gIH0sXG4gIFR5cGVFcnJvclxuKTtcblxuY3JlYXRlRXJyb3IoXG4gICdFUlJfSU5WQUxJRF9BUkdfVkFMVUUnLFxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbj0naXMgaW52YWxpZCddXG4gICAqL1xuICAobmFtZSwgdmFsdWUsIHJlYXNvbiA9ICdpcyBpbnZhbGlkJykgPT4ge1xuICAgIGxldCBpbnNwZWN0ZWQgPSBpbnNwZWN0KHZhbHVlKTtcblxuICAgIGlmIChpbnNwZWN0ZWQubGVuZ3RoID4gMTI4KSB7XG4gICAgICBpbnNwZWN0ZWQgPSBgJHtpbnNwZWN0ZWQuc2xpY2UoMCwgMTI4KX0uLi5gO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSBuYW1lLmluY2x1ZGVzKCcuJykgPyAncHJvcGVydHknIDogJ2FyZ3VtZW50JztcblxuICAgIHJldHVybiBgVGhlICR7dHlwZX0gJyR7bmFtZX0nICR7cmVhc29ufS4gUmVjZWl2ZWQgJHtpbnNwZWN0ZWR9YFxuICB9LFxuICBUeXBlRXJyb3JcbiAgLy8gTm90ZTogZXh0cmEgY2xhc3NlcyBoYXZlIGJlZW4gc2hha2VuIG91dC5cbiAgLy8gLCBSYW5nZUVycm9yXG4pO1xuXG5jcmVhdGVFcnJvcihcbiAgJ0VSUl9VTlNVUFBPUlRFRF9FU01fVVJMX1NDSEVNRScsXG4gIC8qKlxuICAgKiBAcGFyYW0ge1VSTH0gdXJsXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwcG9ydGVkXG4gICAqL1xuICAodXJsLCBzdXBwb3J0ZWQpID0+IHtcbiAgICBsZXQgbWVzc2FnZSA9IGBPbmx5IFVSTHMgd2l0aCBhIHNjaGVtZSBpbjogJHtmb3JtYXRMaXN0KFxuICAgICAgc3VwcG9ydGVkXG4gICAgKX0gYXJlIHN1cHBvcnRlZCBieSB0aGUgZGVmYXVsdCBFU00gbG9hZGVyYDtcblxuICAgIGlmIChpc1dpbmRvd3MkMyAmJiB1cmwucHJvdG9jb2wubGVuZ3RoID09PSAyKSB7XG4gICAgICBtZXNzYWdlICs9ICcuIE9uIFdpbmRvd3MsIGFic29sdXRlIHBhdGhzIG11c3QgYmUgdmFsaWQgZmlsZTovLyBVUkxzJztcbiAgICB9XG5cbiAgICBtZXNzYWdlICs9IGAuIFJlY2VpdmVkIHByb3RvY29sICcke3VybC5wcm90b2NvbH0nYDtcbiAgICByZXR1cm4gbWVzc2FnZVxuICB9LFxuICBFcnJvclxuKTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZWdpc3RlcmluZyB0aGUgZXJyb3IgY29kZXMuIE9ubHkgdXNlZCBoZXJlLiBFeHBvcnRlZFxuICogKm9ubHkqIHRvIGFsbG93IGZvciB0ZXN0aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IHN5bVxuICogQHBhcmFtIHtNZXNzYWdlRnVuY3Rpb258c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBkZWZcbiAqIEByZXR1cm5zIHtuZXcgKC4uLmFyZ3M6IEFycmF5PGFueT4pID0+IEVycm9yfVxuICovXG5mdW5jdGlvbiBjcmVhdGVFcnJvcihzeW0sIHZhbHVlLCBkZWYpIHtcbiAgLy8gU3BlY2lhbCBjYXNlIGZvciBTeXN0ZW1FcnJvciB0aGF0IGZvcm1hdHMgdGhlIGVycm9yIG1lc3NhZ2UgZGlmZmVyZW50bHlcbiAgLy8gVGhlIFN5c3RlbUVycm9ycyBvbmx5IGhhdmUgU3lzdGVtRXJyb3IgYXMgdGhlaXIgYmFzZSBjbGFzc2VzLlxuICBtZXNzYWdlcy5zZXQoc3ltLCB2YWx1ZSk7XG5cbiAgcmV0dXJuIG1ha2VOb2RlRXJyb3JXaXRoQ29kZShkZWYsIHN5bSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IEJhc2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtFcnJvckNvbnN0cnVjdG9yfVxuICovXG5mdW5jdGlvbiBtYWtlTm9kZUVycm9yV2l0aENvZGUoQmFzZSwga2V5KSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgSXRcdTIwMTlzIGEgTm9kZSBlcnJvci5cbiAgcmV0dXJuIE5vZGVFcnJvclxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTx1bmtub3duPn0gYXJnc1xuICAgKi9cbiAgZnVuY3Rpb24gTm9kZUVycm9yKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBsaW1pdCA9IEVycm9yLnN0YWNrVHJhY2VMaW1pdDtcbiAgICBpZiAoaXNFcnJvclN0YWNrVHJhY2VMaW1pdFdyaXRhYmxlKCkpIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IDA7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgQmFzZSgpO1xuICAgIC8vIFJlc2V0IHRoZSBsaW1pdCBhbmQgc2V0dGluZyB0aGUgbmFtZSBwcm9wZXJ0eS5cbiAgICBpZiAoaXNFcnJvclN0YWNrVHJhY2VMaW1pdFdyaXRhYmxlKCkpIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IGxpbWl0O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBnZXRNZXNzYWdlKGtleSwgYXJncywgZXJyb3IpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGVycm9yLCB7XG4gICAgICAvLyBOb3RlOiBubyBuZWVkIHRvIGltcGxlbWVudCBga0lzTm9kZUVycm9yYCBzeW1ib2wsIHdvdWxkIGJlIGhhcmQsXG4gICAgICAvLyBwcm9iYWJseS5cbiAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgdmFsdWU6IG1lc3NhZ2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9LFxuICAgICAgdG9TdHJpbmc6IHtcbiAgICAgICAgLyoqIEB0aGlzIHtFcnJvcn0gKi9cbiAgICAgICAgdmFsdWUoKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3RoaXMubmFtZX0gWyR7a2V5fV06ICR7dGhpcy5tZXNzYWdlfWBcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNhcHR1cmVMYXJnZXJTdGFja1RyYWNlKGVycm9yKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEl0XHUyMDE5cyBhIE5vZGUgZXJyb3IuXG4gICAgZXJyb3IuY29kZSA9IGtleTtcbiAgICByZXR1cm4gZXJyb3JcbiAgfVxufVxuXG4vKipcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0Vycm9yU3RhY2tUcmFjZUxpbWl0V3JpdGFibGUoKSB7XG4gIC8vIERvIG5vIHRvdWNoIEVycm9yLnN0YWNrVHJhY2VMaW1pdCBhcyBWOCB3b3VsZCBhdHRlbXB0IHRvIGluc3RhbGxcbiAgLy8gaXQgYWdhaW4gZHVyaW5nIGRlc2VyaWFsaXphdGlvbi5cbiAgdHJ5IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBub3QgaW4gdHlwZXM/XG4gICAgaWYgKHY4LnN0YXJ0dXBTbmFwc2hvdC5pc0J1aWxkaW5nU25hcHNob3QoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9IGNhdGNoIHt9XG5cbiAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXJyb3IsICdzdGFja1RyYWNlTGltaXQnKTtcbiAgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBPYmplY3QuaXNFeHRlbnNpYmxlKEVycm9yKVxuICB9XG5cbiAgcmV0dXJuIG93biQxLmNhbGwoZGVzYywgJ3dyaXRhYmxlJykgJiYgZGVzYy53cml0YWJsZSAhPT0gdW5kZWZpbmVkXG4gICAgPyBkZXNjLndyaXRhYmxlXG4gICAgOiBkZXNjLnNldCAhPT0gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIHVubmVjZXNzYXJ5IGZyYW1lcyBmcm9tIE5vZGUuanMgY29yZSBlcnJvcnMuXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd259IFRcbiAqIEBwYXJhbSB7VH0gZm5cbiAqIEByZXR1cm5zIHtUfVxuICovXG5mdW5jdGlvbiBoaWRlU3RhY2tGcmFtZXMoZm4pIHtcbiAgLy8gV2UgcmVuYW1lIHRoZSBmdW5jdGlvbnMgdGhhdCB3aWxsIGJlIGhpZGRlbiB0byBjdXQgb2ZmIHRoZSBzdGFja3RyYWNlXG4gIC8vIGF0IHRoZSBvdXRlcm1vc3Qgb25lXG4gIGNvbnN0IGhpZGRlbiA9IG5vZGVJbnRlcm5hbFByZWZpeCArIGZuLm5hbWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ25hbWUnLCB7dmFsdWU6IGhpZGRlbn0pO1xuICByZXR1cm4gZm5cbn1cblxuY29uc3QgY2FwdHVyZUxhcmdlclN0YWNrVHJhY2UgPSBoaWRlU3RhY2tGcmFtZXMoXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICAgKiBAcmV0dXJucyB7RXJyb3J9XG4gICAqL1xuICAvLyBAdHMtZXhwZWN0LWVycm9yOiBmaW5lXG4gIGZ1bmN0aW9uIChlcnJvcikge1xuICAgIGNvbnN0IHN0YWNrVHJhY2VMaW1pdElzV3JpdGFibGUgPSBpc0Vycm9yU3RhY2tUcmFjZUxpbWl0V3JpdGFibGUoKTtcbiAgICBpZiAoc3RhY2tUcmFjZUxpbWl0SXNXcml0YWJsZSkge1xuICAgICAgdXNlclN0YWNrVHJhY2VMaW1pdCA9IEVycm9yLnN0YWNrVHJhY2VMaW1pdDtcbiAgICAgIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB9XG5cbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnJvcik7XG5cbiAgICAvLyBSZXNldCB0aGUgbGltaXRcbiAgICBpZiAoc3RhY2tUcmFjZUxpbWl0SXNXcml0YWJsZSkgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ID0gdXNlclN0YWNrVHJhY2VMaW1pdDtcblxuICAgIHJldHVybiBlcnJvclxuICB9XG4pO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7QXJyYXk8dW5rbm93bj59IGFyZ3NcbiAqIEBwYXJhbSB7RXJyb3J9IHNlbGZcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoa2V5LCBhcmdzLCBzZWxmKSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlcy5nZXQoa2V5KTtcbiAgYXNzZXJ0JDEodHlwZW9mIG1lc3NhZ2UgIT09ICd1bmRlZmluZWQnLCAnZXhwZWN0ZWQgYG1lc3NhZ2VgIHRvIGJlIGZvdW5kJyk7XG5cbiAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXNzZXJ0JDEoXG4gICAgICBtZXNzYWdlLmxlbmd0aCA8PSBhcmdzLmxlbmd0aCwgLy8gRGVmYXVsdCBvcHRpb25zIGRvIG5vdCBjb3VudC5cbiAgICAgIGBDb2RlOiAke2tleX07IFRoZSBwcm92aWRlZCBhcmd1bWVudHMgbGVuZ3RoICgke2FyZ3MubGVuZ3RofSkgZG9lcyBub3QgYCArXG4gICAgICAgIGBtYXRjaCB0aGUgcmVxdWlyZWQgb25lcyAoJHttZXNzYWdlLmxlbmd0aH0pLmBcbiAgICApO1xuICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KG1lc3NhZ2UsIHNlbGYsIGFyZ3MpXG4gIH1cblxuICBjb25zdCByZWdleCA9IC8lW2RmaWpvT3NdL2c7XG4gIGxldCBleHBlY3RlZExlbmd0aCA9IDA7XG4gIHdoaWxlIChyZWdleC5leGVjKG1lc3NhZ2UpICE9PSBudWxsKSBleHBlY3RlZExlbmd0aCsrO1xuICBhc3NlcnQkMShcbiAgICBleHBlY3RlZExlbmd0aCA9PT0gYXJncy5sZW5ndGgsXG4gICAgYENvZGU6ICR7a2V5fTsgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cyBsZW5ndGggKCR7YXJncy5sZW5ndGh9KSBkb2VzIG5vdCBgICtcbiAgICAgIGBtYXRjaCB0aGUgcmVxdWlyZWQgb25lcyAoJHtleHBlY3RlZExlbmd0aH0pLmBcbiAgKTtcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gbWVzc2FnZVxuXG4gIGFyZ3MudW5zaGlmdChtZXNzYWdlKTtcbiAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoZm9ybWF0JDIsIG51bGwsIGFyZ3MpXG59XG5wYXRoVG9GaWxlVVJMKHByb2Nlc3MuY3dkKCkpO1xuXG5jb25zdCBFU01fU1RBVElDX0lNUE9SVF9SRSA9IC8oPzw9XFxzfF58OylpbXBvcnRcXHMqKFtcXHNcIiddKig/PGltcG9ydHM+W1xcd1xcdFxcblxcciAkKiwve31dKylmcm9tXFxzKik/W1wiJ11cXHMqKD88c3BlY2lmaWVyPig/PD1cIlxccyopW15cIl0qW15cXHNcIl0oPz1cXHMqXCIpfCg/PD0nXFxzKilbXiddKlteXFxzJ10oPz1cXHMqJykpXFxzKltcIiddW1xccztdKi9nbTtcbmNvbnN0IFRZUEVfUkUgPSAvXlxccyo/dHlwZVxccy87XG5mdW5jdGlvbiBmaW5kU3RhdGljSW1wb3J0cyhjb2RlKSB7XG4gIHJldHVybiBtYXRjaEFsbChFU01fU1RBVElDX0lNUE9SVF9SRSwgY29kZSwgeyB0eXBlOiBcInN0YXRpY1wiIH0pO1xufVxuZnVuY3Rpb24gcGFyc2VTdGF0aWNJbXBvcnQobWF0Y2hlZCkge1xuICBjb25zdCBjbGVhbmVkSW1wb3J0cyA9IChtYXRjaGVkLmltcG9ydHMgfHwgXCJcIikucmVwbGFjZSgvKFxcL1xcL1teXFxuXSpcXG58XFwvXFwqLipcXCpcXC8pL2csIFwiXCIpLnJlcGxhY2UoL1xccysvZywgXCIgXCIpO1xuICBjb25zdCBuYW1lZEltcG9ydHMgPSB7fTtcbiAgZm9yIChjb25zdCBuYW1lZEltcG9ydCBvZiBjbGVhbmVkSW1wb3J0cy5tYXRjaCgveyhbXn1dKil9Lyk/LlsxXT8uc3BsaXQoXCIsXCIpIHx8IFtdKSB7XG4gICAgY29uc3QgWywgc291cmNlID0gbmFtZWRJbXBvcnQudHJpbSgpLCBpbXBvcnROYW1lID0gc291cmNlXSA9IG5hbWVkSW1wb3J0Lm1hdGNoKC9eXFxzKihcXFMqKSBhcyAoXFxTKilcXHMqJC8pIHx8IFtdO1xuICAgIGlmIChzb3VyY2UgJiYgIVRZUEVfUkUudGVzdChzb3VyY2UpKSB7XG4gICAgICBuYW1lZEltcG9ydHNbc291cmNlXSA9IGltcG9ydE5hbWU7XG4gICAgfVxuICB9XG4gIGNvbnN0IHRvcExldmVsSW1wb3J0cyA9IGNsZWFuZWRJbXBvcnRzLnJlcGxhY2UoL3soW159XSopfS8sIFwiXCIpO1xuICBjb25zdCBuYW1lc3BhY2VkSW1wb3J0ID0gdG9wTGV2ZWxJbXBvcnRzLm1hdGNoKC9cXCogYXMgXFxzKihcXFMqKS8pPy5bMV07XG4gIGNvbnN0IGRlZmF1bHRJbXBvcnQgPSB0b3BMZXZlbEltcG9ydHMuc3BsaXQoXCIsXCIpLmZpbmQoKGluZGV4KSA9PiAhL1sqe31dLy50ZXN0KGluZGV4KSk/LnRyaW0oKSB8fCB2b2lkIDA7XG4gIHJldHVybiB7XG4gICAgLi4ubWF0Y2hlZCxcbiAgICBkZWZhdWx0SW1wb3J0LFxuICAgIG5hbWVzcGFjZWRJbXBvcnQsXG4gICAgbmFtZWRJbXBvcnRzXG4gIH07XG59XG5cbmNvbnN0IEVTTV9SRSA9IC8oW1xccztdfF4pKGltcG9ydFtcXHNcXHcqLHt9XSpmcm9tfGltcG9ydFxccypbXCInKntdfGV4cG9ydFxcYlxccyooPzpbKntdfGRlZmF1bHR8Y2xhc3N8dHlwZXxmdW5jdGlvbnxjb25zdHx2YXJ8bGV0fGFzeW5jIGZ1bmN0aW9uKXxpbXBvcnRcXC5tZXRhXFxiKS9tO1xuZnVuY3Rpb24gaGFzRVNNU3ludGF4KGNvZGUpIHtcbiAgcmV0dXJuIEVTTV9SRS50ZXN0KGNvZGUpO1xufVxuXG5jb25zdCBpc0RlYnVnJDUgPSBwcm9jZXNzLmVudi5ERUJVRztcbmNvbnN0IGRlYnVnJGQgPSBjcmVhdGVEZWJ1Z2dlcigndml0ZTpyZXNvbHZlLWRldGFpbHMnLCB7XG4gICAgb25seVdoZW5Gb2N1c2VkOiB0cnVlLFxufSk7XG5mdW5jdGlvbiBpbnZhbGlkYXRlUGFja2FnZURhdGEocGFja2FnZUNhY2hlLCBwa2dQYXRoKSB7XG4gICAgcGFja2FnZUNhY2hlLmRlbGV0ZShwa2dQYXRoKTtcbiAgICBjb25zdCBwa2dEaXIgPSBwYXRoJG8uZGlybmFtZShwa2dQYXRoKTtcbiAgICBwYWNrYWdlQ2FjaGUuZm9yRWFjaCgocGtnLCBjYWNoZUtleSkgPT4ge1xuICAgICAgICBpZiAocGtnLmRpciA9PT0gcGtnRGlyKSB7XG4gICAgICAgICAgICBwYWNrYWdlQ2FjaGUuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VEYXRhKGlkLCBiYXNlZGlyLCBwcmVzZXJ2ZVN5bWxpbmtzID0gZmFsc2UsIHBhY2thZ2VDYWNoZSkge1xuICAgIGxldCBwa2c7XG4gICAgbGV0IGNhY2hlS2V5O1xuICAgIGlmIChwYWNrYWdlQ2FjaGUpIHtcbiAgICAgICAgY2FjaGVLZXkgPSBgJHtpZH0mJHtiYXNlZGlyfSYke3ByZXNlcnZlU3ltbGlua3N9YDtcbiAgICAgICAgaWYgKChwa2cgPSBwYWNrYWdlQ2FjaGUuZ2V0KGNhY2hlS2V5KSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwa2c7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHBrZ1BhdGg7XG4gICAgdHJ5IHtcbiAgICAgICAgcGtnUGF0aCA9IHJlc29sdmVGcm9tKGAke2lkfS9wYWNrYWdlLmpzb25gLCBiYXNlZGlyLCBwcmVzZXJ2ZVN5bWxpbmtzKTtcbiAgICAgICAgcGtnID0gbG9hZFBhY2thZ2VEYXRhKHBrZ1BhdGgsIHRydWUsIHBhY2thZ2VDYWNoZSk7XG4gICAgICAgIGlmIChwYWNrYWdlQ2FjaGUpIHtcbiAgICAgICAgICAgIHBhY2thZ2VDYWNoZS5zZXQoY2FjaGVLZXksIHBrZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBrZztcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikge1xuICAgICAgICAgICAgaXNEZWJ1ZyQ1ICYmIGRlYnVnJGQoYFBhcnNpbmcgZmFpbGVkOiAke3BrZ1BhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWdub3JlIGVycm9yIGZvciBtaXNzaW5nIHBhY2thZ2UuanNvblxuICAgICAgICBlbHNlIGlmIChlLmNvZGUgIT09ICdNT0RVTEVfTk9UX0ZPVU5EJykge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGxvYWRQYWNrYWdlRGF0YShwa2dQYXRoLCBwcmVzZXJ2ZVN5bWxpbmtzLCBwYWNrYWdlQ2FjaGUpIHtcbiAgICBpZiAoIXByZXNlcnZlU3ltbGlua3MpIHtcbiAgICAgICAgcGtnUGF0aCA9IGZzJGwucmVhbHBhdGhTeW5jLm5hdGl2ZShwa2dQYXRoKTtcbiAgICB9XG4gICAgbGV0IGNhY2hlZDtcbiAgICBpZiAoKGNhY2hlZCA9IHBhY2thZ2VDYWNoZT8uZ2V0KHBrZ1BhdGgpKSkge1xuICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShmcyRsLnJlYWRGaWxlU3luYyhwa2dQYXRoLCAndXRmLTgnKSk7XG4gICAgY29uc3QgcGtnRGlyID0gcGF0aCRvLmRpcm5hbWUocGtnUGF0aCk7XG4gICAgY29uc3QgeyBzaWRlRWZmZWN0cyB9ID0gZGF0YTtcbiAgICBsZXQgaGFzU2lkZUVmZmVjdHM7XG4gICAgaWYgKHR5cGVvZiBzaWRlRWZmZWN0cyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGhhc1NpZGVFZmZlY3RzID0gKCkgPT4gc2lkZUVmZmVjdHM7XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc2lkZUVmZmVjdHMpKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsUGFja2FnZVNpZGVFZmZlY3RzID0gc2lkZUVmZmVjdHMubWFwKChzaWRlRWZmZWN0KSA9PiB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogVGhlIGFycmF5IGFjY2VwdHMgc2ltcGxlIGdsb2IgcGF0dGVybnMgdG8gdGhlIHJlbGV2YW50IGZpbGVzLi4uIFBhdHRlcm5zIGxpa2UgKi5jc3MsIHdoaWNoIGRvIG5vdCBpbmNsdWRlIGEgLywgd2lsbCBiZSB0cmVhdGVkIGxpa2UgKipcXC8qLmNzcy5cbiAgICAgICAgICAgICAqIGh0dHBzOi8vd2VicGFjay5qcy5vcmcvZ3VpZGVzL3RyZWUtc2hha2luZy9cbiAgICAgICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS92aXRlanMvdml0ZS9wdWxsLzExODA3XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChzaWRlRWZmZWN0LmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2lkZUVmZmVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBgKiovJHtzaWRlRWZmZWN0fWA7XG4gICAgICAgIH0pO1xuICAgICAgICBoYXNTaWRlRWZmZWN0cyA9IGNyZWF0ZUZpbHRlcihmaW5hbFBhY2thZ2VTaWRlRWZmZWN0cywgbnVsbCwge1xuICAgICAgICAgICAgcmVzb2x2ZTogcGtnRGlyLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGhhc1NpZGVFZmZlY3RzID0gKCkgPT4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGtnID0ge1xuICAgICAgICBkaXI6IHBrZ0RpcixcbiAgICAgICAgZGF0YSxcbiAgICAgICAgaGFzU2lkZUVmZmVjdHMsXG4gICAgICAgIHdlYlJlc29sdmVkSW1wb3J0czoge30sXG4gICAgICAgIG5vZGVSZXNvbHZlZEltcG9ydHM6IHt9LFxuICAgICAgICBzZXRSZXNvbHZlZENhY2hlKGtleSwgZW50cnksIHRhcmdldFdlYikge1xuICAgICAgICAgICAgaWYgKHRhcmdldFdlYikge1xuICAgICAgICAgICAgICAgIHBrZy53ZWJSZXNvbHZlZEltcG9ydHNba2V5XSA9IGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGtnLm5vZGVSZXNvbHZlZEltcG9ydHNba2V5XSA9IGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRSZXNvbHZlZENhY2hlKGtleSwgdGFyZ2V0V2ViKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0V2ViKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBrZy53ZWJSZXNvbHZlZEltcG9ydHNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBwa2cubm9kZVJlc29sdmVkSW1wb3J0c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG4gICAgcGFja2FnZUNhY2hlPy5zZXQocGtnUGF0aCwgcGtnKTtcbiAgICByZXR1cm4gcGtnO1xufVxuZnVuY3Rpb24gd2F0Y2hQYWNrYWdlRGF0YVBsdWdpbihjb25maWcpIHtcbiAgICBjb25zdCB3YXRjaFF1ZXVlID0gbmV3IFNldCgpO1xuICAgIGxldCB3YXRjaEZpbGUgPSAoaWQpID0+IHtcbiAgICAgICAgd2F0Y2hRdWV1ZS5hZGQoaWQpO1xuICAgIH07XG4gICAgY29uc3QgeyBwYWNrYWdlQ2FjaGUgfSA9IGNvbmZpZztcbiAgICBjb25zdCBzZXRQYWNrYWdlRGF0YSA9IHBhY2thZ2VDYWNoZS5zZXQuYmluZChwYWNrYWdlQ2FjaGUpO1xuICAgIHBhY2thZ2VDYWNoZS5zZXQgPSAoaWQsIHBrZykgPT4ge1xuICAgICAgICBpZiAoaWQuZW5kc1dpdGgoJy5qc29uJykpIHtcbiAgICAgICAgICAgIHdhdGNoRmlsZShpZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldFBhY2thZ2VEYXRhKGlkLCBwa2cpO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3ZpdGU6d2F0Y2gtcGFja2FnZS1kYXRhJyxcbiAgICAgICAgYnVpbGRTdGFydCgpIHtcbiAgICAgICAgICAgIHdhdGNoRmlsZSA9IHRoaXMuYWRkV2F0Y2hGaWxlO1xuICAgICAgICAgICAgd2F0Y2hRdWV1ZS5mb3JFYWNoKHdhdGNoRmlsZSk7XG4gICAgICAgICAgICB3YXRjaFF1ZXVlLmNsZWFyKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGJ1aWxkRW5kKCkge1xuICAgICAgICAgICAgd2F0Y2hGaWxlID0gKGlkKSA9PiB3YXRjaFF1ZXVlLmFkZChpZCk7XG4gICAgICAgIH0sXG4gICAgICAgIHdhdGNoQ2hhbmdlKGlkKSB7XG4gICAgICAgICAgICBpZiAoaWQuZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYWNrYWdlRGF0YShwYWNrYWdlQ2FjaGUsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5jb25zdCBXT1JLRVJfRklMRV9JRCA9ICd3b3JrZXJfZmlsZSc7XG5jb25zdCB3b3JrZXJDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBpc1dvcmtlclJlcXVlc3QoaWQpIHtcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmVxdWVzdChpZCk7XG4gICAgaWYgKHF1ZXJ5ICYmIHF1ZXJ5W1dPUktFUl9GSUxFX0lEXSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzYXZlRW1pdFdvcmtlckFzc2V0KGNvbmZpZywgYXNzZXQpIHtcbiAgICBjb25zdCBmaWxlTmFtZSA9IGFzc2V0LmZpbGVOYW1lO1xuICAgIGNvbnN0IHdvcmtlck1hcCA9IHdvcmtlckNhY2hlLmdldChjb25maWcubWFpbkNvbmZpZyB8fCBjb25maWcpO1xuICAgIHdvcmtlck1hcC5hc3NldHMuc2V0KGZpbGVOYW1lLCBhc3NldCk7XG59XG4vLyBFbnN1cmUgdGhhdCBvbmx5IG9uZSByb2xsdXAgYnVpbGQgaXMgY2FsbGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gYXZvaWRcbi8vIGxlYWtpbmcgc3RhdGUgaW4gcGx1Z2lucyBiZXR3ZWVuIHdvcmtlciBidWlsZHMuXG4vLyBUT0RPOiBSZXZpZXcgaWYgd2UgY2FuIHBhcmFsbGVsaXplIHRoZSBidW5kbGluZyBvZiB3b3JrZXJzLlxuY29uc3Qgd29ya2VyQ29uZmlnU2VtYXBob3JlID0gbmV3IFdlYWtNYXAoKTtcbmFzeW5jIGZ1bmN0aW9uIGJ1bmRsZVdvcmtlckVudHJ5KGNvbmZpZywgaWQsIHF1ZXJ5KSB7XG4gICAgY29uc3QgcHJvY2Vzc2luZyA9IHdvcmtlckNvbmZpZ1NlbWFwaG9yZS5nZXQoY29uZmlnKTtcbiAgICBpZiAocHJvY2Vzc2luZykge1xuICAgICAgICBhd2FpdCBwcm9jZXNzaW5nO1xuICAgICAgICByZXR1cm4gYnVuZGxlV29ya2VyRW50cnkoY29uZmlnLCBpZCwgcXVlcnkpO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlID0gc2VyaWFsQnVuZGxlV29ya2VyRW50cnkoY29uZmlnLCBpZCwgcXVlcnkpO1xuICAgIHdvcmtlckNvbmZpZ1NlbWFwaG9yZS5zZXQoY29uZmlnLCBwcm9taXNlKTtcbiAgICBwcm9taXNlLnRoZW4oKCkgPT4gd29ya2VyQ29uZmlnU2VtYXBob3JlLmRlbGV0ZShjb25maWcpKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHNlcmlhbEJ1bmRsZVdvcmtlckVudHJ5KGNvbmZpZywgaWQsIHF1ZXJ5KSB7XG4gICAgLy8gYnVuZGxlIHRoZSBmaWxlIGFzIGVudHJ5IHRvIHN1cHBvcnQgaW1wb3J0c1xuICAgIGNvbnN0IHsgcm9sbHVwIH0gPSBhd2FpdCBpbXBvcnQoJ3JvbGx1cCcpO1xuICAgIGNvbnN0IHsgcGx1Z2lucywgcm9sbHVwT3B0aW9ucywgZm9ybWF0IH0gPSBjb25maWcud29ya2VyO1xuICAgIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IHJvbGx1cCh7XG4gICAgICAgIC4uLnJvbGx1cE9wdGlvbnMsXG4gICAgICAgIGlucHV0OiBjbGVhblVybChpZCksXG4gICAgICAgIHBsdWdpbnMsXG4gICAgICAgIG9ud2Fybih3YXJuaW5nLCB3YXJuKSB7XG4gICAgICAgICAgICBvblJvbGx1cFdhcm5pbmcod2FybmluZywgd2FybiwgY29uZmlnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJlc2VydmVFbnRyeVNpZ25hdHVyZXM6IGZhbHNlLFxuICAgIH0pO1xuICAgIGxldCBjaHVuaztcbiAgICB0cnkge1xuICAgICAgICBjb25zdCB3b3JrZXJPdXRwdXRDb25maWcgPSBjb25maWcud29ya2VyLnJvbGx1cE9wdGlvbnMub3V0cHV0O1xuICAgICAgICBjb25zdCB3b3JrZXJDb25maWcgPSB3b3JrZXJPdXRwdXRDb25maWdcbiAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheSh3b3JrZXJPdXRwdXRDb25maWcpXG4gICAgICAgICAgICAgICAgPyB3b3JrZXJPdXRwdXRDb25maWdbMF0gfHwge31cbiAgICAgICAgICAgICAgICA6IHdvcmtlck91dHB1dENvbmZpZ1xuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgY29uc3QgeyBvdXRwdXQ6IFtvdXRwdXRDaHVuaywgLi4ub3V0cHV0Q2h1bmtzXSwgfSA9IGF3YWl0IGJ1bmRsZS5nZW5lcmF0ZSh7XG4gICAgICAgICAgICBlbnRyeUZpbGVOYW1lczogcGF0aCRvLnBvc2l4LmpvaW4oY29uZmlnLmJ1aWxkLmFzc2V0c0RpciwgJ1tuYW1lXS1baGFzaF0uanMnKSxcbiAgICAgICAgICAgIGNodW5rRmlsZU5hbWVzOiBwYXRoJG8ucG9zaXguam9pbihjb25maWcuYnVpbGQuYXNzZXRzRGlyLCAnW25hbWVdLVtoYXNoXS5qcycpLFxuICAgICAgICAgICAgYXNzZXRGaWxlTmFtZXM6IHBhdGgkby5wb3NpeC5qb2luKGNvbmZpZy5idWlsZC5hc3NldHNEaXIsICdbbmFtZV0tW2hhc2hdLltleHRdJyksXG4gICAgICAgICAgICAuLi53b3JrZXJDb25maWcsXG4gICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICBzb3VyY2VtYXA6IGNvbmZpZy5idWlsZC5zb3VyY2VtYXAsXG4gICAgICAgIH0pO1xuICAgICAgICBjaHVuayA9IG91dHB1dENodW5rO1xuICAgICAgICBvdXRwdXRDaHVua3MuZm9yRWFjaCgob3V0cHV0Q2h1bmspID0+IHtcbiAgICAgICAgICAgIGlmIChvdXRwdXRDaHVuay50eXBlID09PSAnYXNzZXQnKSB7XG4gICAgICAgICAgICAgICAgc2F2ZUVtaXRXb3JrZXJBc3NldChjb25maWcsIG91dHB1dENodW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG91dHB1dENodW5rLnR5cGUgPT09ICdjaHVuaycpIHtcbiAgICAgICAgICAgICAgICBzYXZlRW1pdFdvcmtlckFzc2V0KGNvbmZpZywge1xuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogb3V0cHV0Q2h1bmsuZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogb3V0cHV0Q2h1bmsuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Fzc2V0JyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBidW5kbGUuY2xvc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIGVtaXRTb3VyY2VtYXBGb3JXb3JrZXJFbnRyeShjb25maWcsIHF1ZXJ5LCBjaHVuayk7XG59XG5mdW5jdGlvbiBlbWl0U291cmNlbWFwRm9yV29ya2VyRW50cnkoY29uZmlnLCBxdWVyeSwgY2h1bmspIHtcbiAgICBjb25zdCB7IG1hcDogc291cmNlbWFwIH0gPSBjaHVuaztcbiAgICBpZiAoc291cmNlbWFwKSB7XG4gICAgICAgIGlmIChjb25maWcuYnVpbGQuc291cmNlbWFwID09PSAnaGlkZGVuJyB8fFxuICAgICAgICAgICAgY29uZmlnLmJ1aWxkLnNvdXJjZW1hcCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHNvdXJjZW1hcC50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgbWFwRmlsZU5hbWUgPSBjaHVuay5maWxlTmFtZSArICcubWFwJztcbiAgICAgICAgICAgIHNhdmVFbWl0V29ya2VyQXNzZXQoY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgZmlsZU5hbWU6IG1hcEZpbGVOYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdhc3NldCcsXG4gICAgICAgICAgICAgICAgc291cmNlOiBkYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNodW5rO1xufVxuY29uc3Qgd29ya2VyQXNzZXRVcmxSRSA9IC9fX1ZJVEVfV09SS0VSX0FTU0VUX18oW2EtelxcZF17OH0pX18vZztcbmZ1bmN0aW9uIGVuY29kZVdvcmtlckFzc2V0RmlsZU5hbWUoZmlsZU5hbWUsIHdvcmtlckNhY2hlKSB7XG4gICAgY29uc3QgeyBmaWxlTmFtZUhhc2ggfSA9IHdvcmtlckNhY2hlO1xuICAgIGNvbnN0IGhhc2ggPSBnZXRIYXNoKGZpbGVOYW1lKTtcbiAgICBpZiAoIWZpbGVOYW1lSGFzaC5nZXQoaGFzaCkpIHtcbiAgICAgICAgZmlsZU5hbWVIYXNoLnNldChoYXNoLCBmaWxlTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBgX19WSVRFX1dPUktFUl9BU1NFVF9fJHtoYXNofV9fYDtcbn1cbmFzeW5jIGZ1bmN0aW9uIHdvcmtlckZpbGVUb1VybChjb25maWcsIGlkLCBxdWVyeSkge1xuICAgIGNvbnN0IHdvcmtlck1hcCA9IHdvcmtlckNhY2hlLmdldChjb25maWcubWFpbkNvbmZpZyB8fCBjb25maWcpO1xuICAgIGxldCBmaWxlTmFtZSA9IHdvcmtlck1hcC5idW5kbGUuZ2V0KGlkKTtcbiAgICBpZiAoIWZpbGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dENodW5rID0gYXdhaXQgYnVuZGxlV29ya2VyRW50cnkoY29uZmlnLCBpZCwgcXVlcnkpO1xuICAgICAgICBmaWxlTmFtZSA9IG91dHB1dENodW5rLmZpbGVOYW1lO1xuICAgICAgICBzYXZlRW1pdFdvcmtlckFzc2V0KGNvbmZpZywge1xuICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICBzb3VyY2U6IG91dHB1dENodW5rLmNvZGUsXG4gICAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgICB9KTtcbiAgICAgICAgd29ya2VyTWFwLmJ1bmRsZS5zZXQoaWQsIGZpbGVOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuY29kZVdvcmtlckFzc2V0RmlsZU5hbWUoZmlsZU5hbWUsIHdvcmtlck1hcCk7XG59XG5mdW5jdGlvbiB3ZWJXb3JrZXJQbHVnaW4oY29uZmlnKSB7XG4gICAgY29uc3QgaXNCdWlsZCA9IGNvbmZpZy5jb21tYW5kID09PSAnYnVpbGQnO1xuICAgIGxldCBzZXJ2ZXI7XG4gICAgY29uc3QgaXNXb3JrZXIgPSBjb25maWcuaXNXb3JrZXI7XG4gICAgY29uc3QgaXNXb3JrZXJRdWVyeUlkID0gKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFF1ZXJ5ID0gcGFyc2VSZXF1ZXN0KGlkKTtcbiAgICAgICAgaWYgKHBhcnNlZFF1ZXJ5ICYmXG4gICAgICAgICAgICAocGFyc2VkUXVlcnkud29ya2VyID8/IHBhcnNlZFF1ZXJ5LnNoYXJlZHdvcmtlcikgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3ZpdGU6d29ya2VyJyxcbiAgICAgICAgY29uZmlndXJlU2VydmVyKF9zZXJ2ZXIpIHtcbiAgICAgICAgICAgIHNlcnZlciA9IF9zZXJ2ZXI7XG4gICAgICAgIH0sXG4gICAgICAgIGJ1aWxkU3RhcnQoKSB7XG4gICAgICAgICAgICBpZiAoaXNXb3JrZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3JrZXJDYWNoZS5zZXQoY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgYXNzZXRzOiBuZXcgTWFwKCksXG4gICAgICAgICAgICAgICAgYnVuZGxlOiBuZXcgTWFwKCksXG4gICAgICAgICAgICAgICAgZmlsZU5hbWVIYXNoOiBuZXcgTWFwKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbG9hZChpZCkge1xuICAgICAgICAgICAgaWYgKGlzQnVpbGQgJiYgaXNXb3JrZXJRdWVyeUlkKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2hvdWxkVHJhbnNmb3JtQ2FjaGVkTW9kdWxlKHsgaWQgfSkge1xuICAgICAgICAgICAgaWYgKGlzQnVpbGQgJiYgaXNXb3JrZXJRdWVyeUlkKGlkKSAmJiBjb25maWcuYnVpbGQud2F0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgdHJhbnNmb3JtKHJhdywgaWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNzciA9IG9wdGlvbnM/LnNzciA9PT0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gcGFyc2VSZXF1ZXN0KGlkKTtcbiAgICAgICAgICAgIGlmIChxdWVyeSAmJiBxdWVyeVtXT1JLRVJfRklMRV9JRF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGltcG9ydCB3b3JrZXIgYnkgd29ya2VyIGNvbnN0cnVjdG9yIHdpbGwgaGF2ZSBxdWVyeS50eXBlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIgdHlwZSB3aWxsIGJlIGltcG9ydCB3b3JrZXIgYnkgZXNtXG4gICAgICAgICAgICAgICAgY29uc3Qgd29ya2VyVHlwZSA9IHF1ZXJ5Wyd0eXBlJ107XG4gICAgICAgICAgICAgICAgbGV0IGluamVjdEVudiA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICh3b3JrZXJUeXBlID09PSAnY2xhc3NpYycpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0RW52ID0gYGltcG9ydFNjcmlwdHMoJyR7RU5WX1BVQkxJQ19QQVRIfScpXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAod29ya2VyVHlwZSA9PT0gJ21vZHVsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0RW52ID0gYGltcG9ydCAnJHtFTlZfUFVCTElDX1BBVEh9J1xcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdvcmtlclR5cGUgPT09ICdpZ25vcmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0J1aWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RFbnYgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMgd29ya2VyIHR5cGUgd2UgY2FuJ3Qga25vdyBob3cgaW1wb3J0IHRoZSBlbnZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNvcHkgL0B2aXRlL2VudiBjb2RlIG9mIHNlcnZlciB0cmFuc2Zvcm0gcmVzdWx0IGludG8gZmlsZSBoZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbW9kdWxlR3JhcGggfSA9IHNlcnZlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IG1vZHVsZUdyYXBoLmdldE1vZHVsZUJ5SWQoRU5WX0VOVFJZKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdEVudiA9IG1vZHVsZT8udHJhbnNmb3JtUmVzdWx0Py5jb2RlIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IGluamVjdEVudiArIHJhdyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHF1ZXJ5ID09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAocXVlcnkgJiYgKHF1ZXJ5LndvcmtlciA/PyBxdWVyeS5zaGFyZWR3b3JrZXIpID09IG51bGwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc3RyaW5naWZpZWQgdXJsIG9yIGBuZXcgVVJMKC4uLilgXG4gICAgICAgICAgICBsZXQgdXJsO1xuICAgICAgICAgICAgY29uc3QgeyBmb3JtYXQgfSA9IGNvbmZpZy53b3JrZXI7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJDb25zdHJ1Y3RvciA9IHF1ZXJ5LnNoYXJlZHdvcmtlciAhPSBudWxsID8gJ1NoYXJlZFdvcmtlcicgOiAnV29ya2VyJztcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlclR5cGUgPSBpc0J1aWxkXG4gICAgICAgICAgICAgICAgPyBmb3JtYXQgPT09ICdlcydcbiAgICAgICAgICAgICAgICAgICAgPyAnbW9kdWxlJ1xuICAgICAgICAgICAgICAgICAgICA6ICdjbGFzc2ljJ1xuICAgICAgICAgICAgICAgIDogJ21vZHVsZSc7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJPcHRpb25zID0gd29ya2VyVHlwZSA9PT0gJ2NsYXNzaWMnID8gJycgOiAnLHt0eXBlOiBcIm1vZHVsZVwifSc7XG4gICAgICAgICAgICBpZiAoaXNCdWlsZCkge1xuICAgICAgICAgICAgICAgIGdldERlcHNPcHRpbWl6ZXIoY29uZmlnLCBzc3IpPy5yZWdpc3RlcldvcmtlcnNTb3VyY2UoaWQpO1xuICAgICAgICAgICAgICAgIGlmIChxdWVyeS5pbmxpbmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IGF3YWl0IGJ1bmRsZVdvcmtlckVudHJ5KGNvbmZpZywgaWQsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jb2RlZEpzID0gYGNvbnN0IGVuY29kZWRKcyA9IFwiJHtCdWZmZXIuZnJvbShjaHVuay5jb2RlKS50b1N0cmluZygnYmFzZTY0Jyl9XCI7YDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IFxuICAgICAgICAgICAgICAgICAgICAvLyBVc2luZyBibG9iIFVSTCBmb3IgU2hhcmVkV29ya2VyIHJlc3VsdHMgaW4gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGEgc2FtZSB3b3JrZXJcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyQ29uc3RydWN0b3IgPT09ICdXb3JrZXInXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAke2VuY29kZWRKc31cbiAgICAgICAgICBjb25zdCBibG9iID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuQmxvYiAmJiBuZXcgQmxvYihbYXRvYihlbmNvZGVkSnMpXSwgeyB0eXBlOiBcInRleHQvamF2YXNjcmlwdDtjaGFyc2V0PXV0Zi04XCIgfSk7XG4gICAgICAgICAgZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gV29ya2VyV3JhcHBlcigpIHtcbiAgICAgICAgICAgIGxldCBvYmpVUkw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBvYmpVUkwgPSBibG9iICYmICh3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkwpLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgICAgICAgaWYgKCFvYmpVUkwpIHRocm93ICcnXG4gICAgICAgICAgICAgIHJldHVybiBuZXcgJHt3b3JrZXJDb25zdHJ1Y3Rvcn0ob2JqVVJMKVxuICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgJHt3b3JrZXJDb25zdHJ1Y3Rvcn0oXCJkYXRhOmFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7YmFzZTY0LFwiICsgZW5jb2RlZEpzJHt3b3JrZXJPcHRpb25zfSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBvYmpVUkwgJiYgKHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCkucmV2b2tlT2JqZWN0VVJMKG9ialVSTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYCR7ZW5jb2RlZEpzfVxuICAgICAgICAgIGV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFdvcmtlcldyYXBwZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3ICR7d29ya2VyQ29uc3RydWN0b3J9KFwiZGF0YTphcHBsaWNhdGlvbi9qYXZhc2NyaXB0O2Jhc2U2NCxcIiArIGVuY29kZWRKcyR7d29ya2VyT3B0aW9uc30pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtcHR5IHNvdXJjZW1hcCB0byBzdXBwcmVzcyBSb2xsdXAgd2FybmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwOiB7IG1hcHBpbmdzOiAnJyB9LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gYXdhaXQgd29ya2VyRmlsZVRvVXJsKGNvbmZpZywgaWQsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cmwgPSBhd2FpdCBmaWxlVG9VcmwoY2xlYW5VcmwoaWQpLCBjb25maWcsIHRoaXMpO1xuICAgICAgICAgICAgICAgIHVybCA9IGluamVjdFF1ZXJ5KHVybCwgV09SS0VSX0ZJTEVfSUQpO1xuICAgICAgICAgICAgICAgIHVybCA9IGluamVjdFF1ZXJ5KHVybCwgYHR5cGU9JHt3b3JrZXJUeXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHF1ZXJ5LnVybCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogYGV4cG9ydCBkZWZhdWx0ICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IHsgbWFwcGluZ3M6ICcnIH0sIC8vIEVtcHR5IHNvdXJjZW1hcCB0byBzdXBwcmVzcyBSb2xsdXAgd2FybmluZ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvZGU6IGBleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBXb3JrZXJXcmFwcGVyKCkge1xuICAgICAgICAgIHJldHVybiBuZXcgJHt3b3JrZXJDb25zdHJ1Y3Rvcn0oJHtKU09OLnN0cmluZ2lmeSh1cmwpfSR7d29ya2VyT3B0aW9uc30pXG4gICAgICAgIH1gLFxuICAgICAgICAgICAgICAgIG1hcDogeyBtYXBwaW5nczogJycgfSwgLy8gRW1wdHkgc291cmNlbWFwIHRvIHN1cHByZXNzIFJvbGx1cCB3YXJuaW5nXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICByZW5kZXJDaHVuayhjb2RlLCBjaHVuaywgb3V0cHV0T3B0aW9ucykge1xuICAgICAgICAgICAgbGV0IHM7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChzICYmIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogcy50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IGNvbmZpZy5idWlsZC5zb3VyY2VtYXAgPyBzLmdlbmVyYXRlTWFwKHsgaGlyZXM6IHRydWUgfSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChjb2RlLm1hdGNoKHdvcmtlckFzc2V0VXJsUkUpIHx8IGNvZGUuaW5jbHVkZXMoJ2ltcG9ydC5tZXRhLnVybCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9SZWxhdGl2ZVJ1bnRpbWUgPSBjcmVhdGVUb0ltcG9ydE1ldGFVUkxCYXNlZFJlbGF0aXZlUnVudGltZShvdXRwdXRPcHRpb25zLmZvcm1hdCk7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoO1xuICAgICAgICAgICAgICAgIHMgPSBuZXcgTWFnaWNTdHJpbmcoY29kZSk7XG4gICAgICAgICAgICAgICAgd29ya2VyQXNzZXRVcmxSRS5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgXCJfX1ZJVEVfV09SS0VSX0FTU0VUX181YWEwZGRjMF9fXCIgdXNpbmcgcmVsYXRpdmUgcGF0aHNcbiAgICAgICAgICAgICAgICBjb25zdCB3b3JrZXJNYXAgPSB3b3JrZXJDYWNoZS5nZXQoY29uZmlnLm1haW5Db25maWcgfHwgY29uZmlnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGZpbGVOYW1lSGFzaCB9ID0gd29ya2VyTWFwO1xuICAgICAgICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSB3b3JrZXJBc3NldFVybFJFLmV4ZWMoY29kZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtmdWxsLCBoYXNoXSA9IG1hdGNoO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGZpbGVOYW1lSGFzaC5nZXQoaGFzaCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gdG9PdXRwdXRGaWxlUGF0aEluSlMoZmlsZW5hbWUsICdhc3NldCcsIGNodW5rLmZpbGVOYW1lLCAnanMnLCBjb25maWcsIHRvUmVsYXRpdmVSdW50aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZW1lbnRTdHJpbmcgPSB0eXBlb2YgcmVwbGFjZW1lbnQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHJlcGxhY2VtZW50KS5zbGljZSgxLCAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYFwiKyR7cmVwbGFjZW1lbnQucnVudGltZX0rXCJgO1xuICAgICAgICAgICAgICAgICAgICBzLnVwZGF0ZShtYXRjaC5pbmRleCwgbWF0Y2guaW5kZXggKyBmdWxsLmxlbmd0aCwgcmVwbGFjZW1lbnRTdHJpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2VuZXJhdGVCdW5kbGUob3B0cykge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBhc3NldCBlbWl0cyBhcmUgc2tpcHBlZCBpbiBsZWdhY3kgYnVuZGxlXG4gICAgICAgICAgICBpZiAob3B0cy5fX3ZpdGVfc2tpcF9hc3NldF9lbWl0X18gfHwgaXNXb3JrZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJNYXAgPSB3b3JrZXJDYWNoZS5nZXQoY29uZmlnKTtcbiAgICAgICAgICAgIHdvcmtlck1hcC5hc3NldHMuZm9yRWFjaCgoYXNzZXQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRGaWxlKGFzc2V0KTtcbiAgICAgICAgICAgICAgICB3b3JrZXJNYXAuYXNzZXRzLmRlbGV0ZShhc3NldC5maWxlTmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5jb25zdCBub3JtYWxpemVkQ2xpZW50RW50cnkkMSA9IG5vcm1hbGl6ZVBhdGgkMyhDTElFTlRfRU5UUlkpO1xuY29uc3Qgbm9ybWFsaXplZEVudkVudHJ5JDEgPSBub3JtYWxpemVQYXRoJDMoRU5WX0VOVFJZKTtcbi8vIHNwZWNpYWwgaWQgZm9yIHBhdGhzIG1hcmtlZCB3aXRoIGJyb3dzZXI6IGZhbHNlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9wYWNrYWdlLWJyb3dzZXItZmllbGQtc3BlYyNpZ25vcmUtYS1tb2R1bGVcbmNvbnN0IGJyb3dzZXJFeHRlcm5hbElkID0gJ19fdml0ZS1icm93c2VyLWV4dGVybmFsJztcbi8vIHNwZWNpYWwgaWQgZm9yIHBhY2thZ2VzIHRoYXQgYXJlIG9wdGlvbmFsIHBlZXIgZGVwc1xuY29uc3Qgb3B0aW9uYWxQZWVyRGVwSWQgPSAnX192aXRlLW9wdGlvbmFsLXBlZXItZGVwJztcbmNvbnN0IG5vZGVNb2R1bGVzSW5QYXRoUkUgPSAvKD86XnxcXC8pbm9kZV9tb2R1bGVzXFwvLztcbmNvbnN0IHN1YnBhdGhJbXBvcnRzUHJlZml4ID0gJyMnO1xuY29uc3QgaXNEZWJ1ZyQ0ID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5jb25zdCBkZWJ1ZyRjID0gY3JlYXRlRGVidWdnZXIoJ3ZpdGU6cmVzb2x2ZS1kZXRhaWxzJywge1xuICAgIG9ubHlXaGVuRm9jdXNlZDogdHJ1ZSxcbn0pO1xuZnVuY3Rpb24gcmVzb2x2ZVBsdWdpbihyZXNvbHZlT3B0aW9ucykge1xuICAgIGNvbnN0IHsgcm9vdCwgaXNQcm9kdWN0aW9uLCBhc1NyYywgc3NyQ29uZmlnLCBwcmVmZXJSZWxhdGl2ZSA9IGZhbHNlLCB9ID0gcmVzb2x2ZU9wdGlvbnM7XG4gICAgY29uc3QgeyB0YXJnZXQ6IHNzclRhcmdldCwgbm9FeHRlcm5hbDogc3NyTm9FeHRlcm5hbCB9ID0gc3NyQ29uZmlnID8/IHt9O1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOnJlc29sdmUnLFxuICAgICAgICBhc3luYyByZXNvbHZlSWQoaWQsIGltcG9ydGVyLCByZXNvbHZlT3B0cykge1xuICAgICAgICAgICAgY29uc3Qgc3NyID0gcmVzb2x2ZU9wdHM/LnNzciA9PT0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZGVsYXkgZGVwc09wdGltaXplciB1bnRpbCBoZXJlIGluc3RlYWQgb2YgcGFzc2luZyBpdCBhcyBhbiBvcHRpb25cbiAgICAgICAgICAgIC8vIHRoZSByZXNvbHZlUGx1Z2luIGJlY2F1c2UgdGhlIG9wdGltaXplciBpcyBjcmVhdGVkIG9uIHNlcnZlciBsaXN0ZW4gZHVyaW5nIGRldlxuICAgICAgICAgICAgY29uc3QgZGVwc09wdGltaXplciA9IHJlc29sdmVPcHRpb25zLmdldERlcHNPcHRpbWl6ZXI/Lihzc3IpO1xuICAgICAgICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoYnJvd3NlckV4dGVybmFsSWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0V2ViID0gIXNzciB8fCBzc3JUYXJnZXQgPT09ICd3ZWJ3b3JrZXInO1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBwYXNzZWQgYnkgQHJvbGx1cC9wbHVnaW4tY29tbW9uanNcbiAgICAgICAgICAgIGNvbnN0IGlzUmVxdWlyZSA9IHJlc29sdmVPcHRzPy5jdXN0b20/Llsnbm9kZS1yZXNvbHZlJ10/LmlzUmVxdWlyZSA/PyBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgaXNSZXF1aXJlLFxuICAgICAgICAgICAgICAgIC4uLnJlc29sdmVPcHRpb25zLFxuICAgICAgICAgICAgICAgIHNjYW46IHJlc29sdmVPcHRzPy5zY2FuID8/IHJlc29sdmVPcHRpb25zLnNjYW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVN1YnBhdGhJbXBvcnRzID0gKGlkLCBpbXBvcnRlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghaW1wb3J0ZXIgfHwgIWlkLnN0YXJ0c1dpdGgoc3VicGF0aEltcG9ydHNQcmVmaXgpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZWRpciA9IHBhdGgkby5kaXJuYW1lKGltcG9ydGVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwa2dKc29uUGF0aCA9IGxvb2t1cEZpbGUoYmFzZWRpciwgWydwYWNrYWdlLmpzb24nXSwge1xuICAgICAgICAgICAgICAgICAgICBwYXRoT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBrZ0pzb25QYXRoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgcGtnRGF0YSA9IGxvYWRQYWNrYWdlRGF0YShwa2dKc29uUGF0aCwgb3B0aW9ucy5wcmVzZXJ2ZVN5bWxpbmtzKTtcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0c1BhdGggPSByZXNvbHZlRXhwb3J0c09ySW1wb3J0cyhwa2dEYXRhLmRhdGEsIGlkLCBvcHRpb25zLCB0YXJnZXRXZWIsICdpbXBvcnRzJyk7XG4gICAgICAgICAgICAgICAgaWYgKGltcG9ydHNQYXRoPy5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0c1BhdGggPSBwYXRoJG8ucmVsYXRpdmUoYmFzZWRpciwgcGF0aCRvLmpvaW4ocGF0aCRvLmRpcm5hbWUocGtnSnNvblBhdGgpLCBpbXBvcnRzUGF0aCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWltcG9ydHNQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0c1BhdGggPSBgLi8ke2ltcG9ydHNQYXRofWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydHNQYXRoO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkSW1wb3J0cyA9IHJlc29sdmVTdWJwYXRoSW1wb3J0cyhpZCwgaW1wb3J0ZXIpO1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkSW1wb3J0cykge1xuICAgICAgICAgICAgICAgIGlkID0gcmVzb2x2ZWRJbXBvcnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGltcG9ydGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2ltcG9ydGVyID0gaXNXb3JrZXJSZXF1ZXN0KGltcG9ydGVyKVxuICAgICAgICAgICAgICAgICAgICA/IHNwbGl0RmlsZUFuZFBvc3RmaXgoaW1wb3J0ZXIpLmZpbGVcbiAgICAgICAgICAgICAgICAgICAgOiBpbXBvcnRlcjtcbiAgICAgICAgICAgICAgICBpZiAoaXNUc1JlcXVlc3QoX2ltcG9ydGVyKSB8fFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlT3B0cy5jdXN0b20/LmRlcFNjYW4/LmxvYWRlcj8uc3RhcnRzV2l0aCgndHMnKSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmlzRnJvbVRzSW1wb3J0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlTGFuZyA9IHRoaXMuZ2V0TW9kdWxlSW5mbyhfaW1wb3J0ZXIpPy5tZXRhPy52aXRlPy5sYW5nO1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmlzRnJvbVRzSW1wb3J0ZXIgPSBtb2R1bGVMYW5nICYmIGlzVHNSZXF1ZXN0KGAuJHttb2R1bGVMYW5nfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXM7XG4gICAgICAgICAgICAvLyByZXNvbHZlIHByZS1idW5kbGVkIGRlcHMgcmVxdWVzdHMsIHRoZXNlIGNvdWxkIGJlIHJlc29sdmVkIGJ5XG4gICAgICAgICAgICAvLyB0cnlGaWxlUmVzb2x2ZSBvciAvZnMvIHJlc29sdXRpb24gYnV0IHRoZXNlIGZpbGVzIG1heSBub3QgeWV0XG4gICAgICAgICAgICAvLyBleGlzdHMgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBkZXBzIHJlLXByb2Nlc3NpbmdcbiAgICAgICAgICAgIGlmIChhc1NyYyAmJiBkZXBzT3B0aW1pemVyPy5pc09wdGltaXplZERlcFVybChpZCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpbWl6ZWRQYXRoID0gaWQuc3RhcnRzV2l0aChGU19QUkVGSVgpXG4gICAgICAgICAgICAgICAgICAgID8gZnNQYXRoRnJvbUlkKGlkKVxuICAgICAgICAgICAgICAgICAgICA6IG5vcm1hbGl6ZVBhdGgkMyhlbnN1cmVWb2x1bWVJblBhdGgocGF0aCRvLnJlc29sdmUocm9vdCwgaWQuc2xpY2UoMSkpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGltaXplZFBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnN1cmVWZXJzaW9uUXVlcnkgPSAocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuaXNCdWlsZCAmJlxuICAgICAgICAgICAgICAgICAgICAhb3B0aW9ucy5zY2FuICYmXG4gICAgICAgICAgICAgICAgICAgIGRlcHNPcHRpbWl6ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgIShyZXNvbHZlZCA9PT0gbm9ybWFsaXplZENsaWVudEVudHJ5JDEgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkID09PSBub3JtYWxpemVkRW52RW50cnkkMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgZGlyZWN0IGltcG9ydHMgb2Ygbm9kZV9tb2R1bGVzIGhhdmUgdGhlIHNhbWUgdmVyc2lvbiBxdWVyeVxuICAgICAgICAgICAgICAgICAgICAvLyBhcyBpZiB0aGV5IHdvdWxkIGhhdmUgYmVlbiBpbXBvcnRlZCB0aHJvdWdoIGEgYmFyZSBpbXBvcnRcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBvcmlnaW5hbCBpZCB0byBkbyB0aGUgY2hlY2sgYXMgdGhlIHJlc29sdmVkIGlkIG1heSBiZSB0aGUgcmVhbFxuICAgICAgICAgICAgICAgICAgICAvLyBmaWxlIHBhdGggYWZ0ZXIgc3ltbGlua3MgcmVzb2x1dGlvblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc05vZGVNb2R1bGUgPSBub2RlTW9kdWxlc0luUGF0aFJFLnRlc3Qobm9ybWFsaXplUGF0aCQzKGlkKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVNb2R1bGVzSW5QYXRoUkUudGVzdChub3JtYWxpemVQYXRoJDMocmVzb2x2ZWQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTm9kZU1vZHVsZSAmJiAhcmVzb2x2ZWQubWF0Y2goREVQX1ZFUlNJT05fUkUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uSGFzaCA9IGRlcHNPcHRpbWl6ZXIubWV0YWRhdGEuYnJvd3Nlckhhc2g7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbkhhc2ggJiYgaXNPcHRpbWl6YWJsZShyZXNvbHZlZCwgZGVwc09wdGltaXplci5vcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkID0gaW5qZWN0UXVlcnkocmVzb2x2ZWQsIGB2PSR7dmVyc2lvbkhhc2h9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGV4cGxpY2l0IGZzIHBhdGhzIHRoYXQgc3RhcnRzIHdpdGggL0Bmcy8qXG4gICAgICAgICAgICBpZiAoYXNTcmMgJiYgaWQuc3RhcnRzV2l0aChGU19QUkVGSVgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnNQYXRoID0gZnNQYXRoRnJvbUlkKGlkKTtcbiAgICAgICAgICAgICAgICByZXMgPSB0cnlGc1Jlc29sdmUoZnNQYXRoLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpc0RlYnVnJDQgJiYgZGVidWckYyhgW0Bmc10gJHtwaWNvY29sb3JzRXhwb3J0cy5jeWFuKGlkKX0gLT4gJHtwaWNvY29sb3JzRXhwb3J0cy5kaW0ocmVzKX1gKTtcbiAgICAgICAgICAgICAgICAvLyBhbHdheXMgcmV0dXJuIGhlcmUgZXZlbiBpZiByZXMgZG9lc24ndCBleGlzdCBzaW5jZSAvQGZzLyBpcyBleHBsaWNpdFxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QgaXQgc2hvdWxkIGJlIGEgNDA0XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuc3VyZVZlcnNpb25RdWVyeShyZXMgfHwgZnNQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVSTFxuICAgICAgICAgICAgLy8gL2ZvbyAtPiAvZnMtcm9vdC9mb29cbiAgICAgICAgICAgIGlmIChhc1NyYyAmJiBpZC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmc1BhdGggPSBwYXRoJG8ucmVzb2x2ZShyb290LCBpZC5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgaWYgKChyZXMgPSB0cnlGc1Jlc29sdmUoZnNQYXRoLCBvcHRpb25zKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEZWJ1ZyQ0ICYmIGRlYnVnJGMoYFt1cmxdICR7cGljb2NvbG9yc0V4cG9ydHMuY3lhbihpZCl9IC0+ICR7cGljb2NvbG9yc0V4cG9ydHMuZGltKHJlcyl9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnN1cmVWZXJzaW9uUXVlcnkocmVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZWxhdGl2ZVxuICAgICAgICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoJy4nKSB8fFxuICAgICAgICAgICAgICAgICgocHJlZmVyUmVsYXRpdmUgfHwgaW1wb3J0ZXI/LmVuZHNXaXRoKCcuaHRtbCcpKSAmJiAvXlxcdy8udGVzdChpZCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZWRpciA9IGltcG9ydGVyID8gcGF0aCRvLmRpcm5hbWUoaW1wb3J0ZXIpIDogcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmc1BhdGggPSBwYXRoJG8ucmVzb2x2ZShiYXNlZGlyLCBpZCk7XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGJyb3dzZXIgZmllbGQgbWFwcGluZyBmb3IgcmVsYXRpdmUgaW1wb3J0c1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGc1BhdGggPSBub3JtYWxpemVQYXRoJDMoZnNQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwc09wdGltaXplcj8uaXNPcHRpbWl6ZWREZXBGaWxlKG5vcm1hbGl6ZWRGc1BhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9wdGltaXplZCBmaWxlcyBjb3VsZCBub3QgeWV0IGV4aXN0IGluIGRpc2ssIHJlc29sdmUgdG8gdGhlIGZ1bGwgcGF0aFxuICAgICAgICAgICAgICAgICAgICAvLyBJbmplY3QgdGhlIGN1cnJlbnQgYnJvd3Nlckhhc2ggdmVyc2lvbiBpZiB0aGUgcGF0aCBkb2Vzbid0IGhhdmUgb25lXG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9ybWFsaXplZEZzUGF0aC5tYXRjaChERVBfVkVSU0lPTl9SRSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJyb3dzZXJIYXNoID0gb3B0aW1pemVkRGVwSW5mb0Zyb21GaWxlKGRlcHNPcHRpbWl6ZXIubWV0YWRhdGEsIG5vcm1hbGl6ZWRGc1BhdGgpPy5icm93c2VySGFzaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicm93c2VySGFzaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmplY3RRdWVyeShub3JtYWxpemVkRnNQYXRoLCBgdj0ke2Jyb3dzZXJIYXNofWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkRnNQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0V2ViICYmXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYnJvd3NlckZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgIChyZXMgPSB0cnlSZXNvbHZlQnJvd3Nlck1hcHBpbmcoZnNQYXRoLCBpbXBvcnRlciwgb3B0aW9ucywgdHJ1ZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgocmVzID0gdHJ5RnNSZXNvbHZlKGZzUGF0aCwgb3B0aW9ucykpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IGVuc3VyZVZlcnNpb25RdWVyeShyZXMpO1xuICAgICAgICAgICAgICAgICAgICBpc0RlYnVnJDQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnJGMoYFtyZWxhdGl2ZV0gJHtwaWNvY29sb3JzRXhwb3J0cy5jeWFuKGlkKX0gLT4gJHtwaWNvY29sb3JzRXhwb3J0cy5kaW0ocmVzKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGtnID0gaW1wb3J0ZXIgIT0gbnVsbCAmJiBpZFRvUGtnTWFwLmdldChpbXBvcnRlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwa2cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9Qa2dNYXAuc2V0KHJlcywgcGtnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVTaWRlRWZmZWN0czogcGtnLmhhc1NpZGVFZmZlY3RzKHJlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZHJpdmUgcmVsYXRpdmUgZnMgcGF0aHMgKG9ubHkgd2luZG93cylcbiAgICAgICAgICAgIGlmIChpc1dpbmRvd3MkNCAmJiBpZC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlZGlyID0gaW1wb3J0ZXIgPyBwYXRoJG8uZGlybmFtZShpbXBvcnRlcikgOiBwcm9jZXNzLmN3ZCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZzUGF0aCA9IHBhdGgkby5yZXNvbHZlKGJhc2VkaXIsIGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoKHJlcyA9IHRyeUZzUmVzb2x2ZShmc1BhdGgsIG9wdGlvbnMpKSkge1xuICAgICAgICAgICAgICAgICAgICBpc0RlYnVnJDQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnJGMoYFtkcml2ZS1yZWxhdGl2ZV0gJHtwaWNvY29sb3JzRXhwb3J0cy5jeWFuKGlkKX0gLT4gJHtwaWNvY29sb3JzRXhwb3J0cy5kaW0ocmVzKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuc3VyZVZlcnNpb25RdWVyeShyZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFic29sdXRlIGZzIHBhdGhzXG4gICAgICAgICAgICBpZiAoaXNOb25Ecml2ZVJlbGF0aXZlQWJzb2x1dGVQYXRoKGlkKSAmJlxuICAgICAgICAgICAgICAgIChyZXMgPSB0cnlGc1Jlc29sdmUoaWQsIG9wdGlvbnMpKSkge1xuICAgICAgICAgICAgICAgIGlzRGVidWckNCAmJiBkZWJ1ZyRjKGBbZnNdICR7cGljb2NvbG9yc0V4cG9ydHMuY3lhbihpZCl9IC0+ICR7cGljb2NvbG9yc0V4cG9ydHMuZGltKHJlcyl9YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuc3VyZVZlcnNpb25RdWVyeShyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXh0ZXJuYWxcbiAgICAgICAgICAgIGlmIChpc0V4dGVybmFsVXJsKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICBleHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZGF0YSB1cmk6IHBhc3MgdGhyb3VnaCAodGhpcyBvbmx5IGhhcHBlbnMgZHVyaW5nIGJ1aWxkIGFuZCB3aWxsIGJlXG4gICAgICAgICAgICAvLyBoYW5kbGVkIGJ5IGRlZGljYXRlZCBwbHVnaW4pXG4gICAgICAgICAgICBpZiAoaXNEYXRhVXJsKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYmFyZSBwYWNrYWdlIGltcG9ydHMsIHBlcmZvcm0gbm9kZSByZXNvbHZlXG4gICAgICAgICAgICBpZiAoYmFyZUltcG9ydFJFLnRlc3QoaWQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuYWwgPSBvcHRpb25zLnNob3VsZEV4dGVybmFsaXplPy4oaWQpO1xuICAgICAgICAgICAgICAgIGlmICghZXh0ZXJuYWwgJiZcbiAgICAgICAgICAgICAgICAgICAgYXNTcmMgJiZcbiAgICAgICAgICAgICAgICAgICAgZGVwc09wdGltaXplciAmJlxuICAgICAgICAgICAgICAgICAgICAhb3B0aW9ucy5zY2FuICYmXG4gICAgICAgICAgICAgICAgICAgIChyZXMgPSBhd2FpdCB0cnlPcHRpbWl6ZWRSZXNvbHZlKGRlcHNPcHRpbWl6ZXIsIGlkLCBpbXBvcnRlcikpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRXZWIgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5icm93c2VyRmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgKHJlcyA9IHRyeVJlc29sdmVCcm93c2VyTWFwcGluZyhpZCwgaW1wb3J0ZXIsIG9wdGlvbnMsIGZhbHNlLCBleHRlcm5hbCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgocmVzID0gdHJ5Tm9kZVJlc29sdmUoaWQsIGltcG9ydGVyLCBvcHRpb25zLCB0YXJnZXRXZWIsIGRlcHNPcHRpbWl6ZXIsIHNzciwgZXh0ZXJuYWwpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBub2RlIGJ1aWx0LWlucy5cbiAgICAgICAgICAgICAgICAvLyBleHRlcm5hbGl6ZSBpZiBidWlsZGluZyBmb3IgU1NSLCBvdGhlcndpc2UgcmVkaXJlY3QgdG8gZW1wdHkgbW9kdWxlXG4gICAgICAgICAgICAgICAgaWYgKGlzQnVpbHRpbihpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNzcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzck5vRXh0ZXJuYWwgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBDYW5ub3QgYnVuZGxlIE5vZGUuanMgYnVpbHQtaW4gXCIke2lkfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBgIGltcG9ydGVkIGZyb20gXCIke3BhdGgkby5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBpbXBvcnRlcil9XCJgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IGAuIENvbnNpZGVyIGRpc2FibGluZyBzc3Iubm9FeHRlcm5hbCBvciByZW1vdmUgdGhlIGJ1aWx0LWluIGRlcGVuZGVuY3kuYDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFzU3JjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWckYyhgZXh0ZXJuYWxpemVkIG5vZGUgYnVpbHQtaW4gXCIke2lkfVwiIHRvIGVtcHR5IG1vZHVsZS4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoaW1wb3J0ZWQgYnk6ICR7cGljb2NvbG9yc0V4cG9ydHMud2hpdGUocGljb2NvbG9yc0V4cG9ydHMuZGltKGltcG9ydGVyKSl9KWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzUHJvZHVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYnJvd3NlckV4dGVybmFsSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGAke2Jyb3dzZXJFeHRlcm5hbElkfToke2lkfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc0RlYnVnJDQgJiYgZGVidWckYyhgW2ZhbGx0aHJvdWdoXSAke3BpY29jb2xvcnNFeHBvcnRzLmRpbShpZCl9YCk7XG4gICAgICAgIH0sXG4gICAgICAgIGxvYWQoaWQpIHtcbiAgICAgICAgICAgIGlmIChpZC5zdGFydHNXaXRoKGJyb3dzZXJFeHRlcm5hbElkKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc1Byb2R1Y3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBleHBvcnQgZGVmYXVsdCB7fWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZCA9IGlkLnNsaWNlKGJyb3dzZXJFeHRlcm5hbElkLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxcXG5leHBvcnQgZGVmYXVsdCBuZXcgUHJveHkoe30sIHtcbiAgZ2V0KF8sIGtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcXGBNb2R1bGUgXCIke2lkfVwiIGhhcyBiZWVuIGV4dGVybmFsaXplZCBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5LiBDYW5ub3QgYWNjZXNzIFwiJHtpZH0uXFwke2tleX1cIiBpbiBjbGllbnQgY29kZS4gIFNlZSBodHRwOi8vdml0ZWpzLmRldi9ndWlkZS90cm91Ymxlc2hvb3RpbmcuaHRtbCNtb2R1bGUtZXh0ZXJuYWxpemVkLWZvci1icm93c2VyLWNvbXBhdGliaWxpdHkgZm9yIG1vcmUgZGV0YWlscy5cXGApXG4gIH1cbn0pYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aChvcHRpb25hbFBlZXJEZXBJZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9kdWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgZXhwb3J0IGRlZmF1bHQge31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgWywgcGVlckRlcCwgcGFyZW50RGVwXSA9IGlkLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgdGhyb3cgbmV3IEVycm9yKFxcYENvdWxkIG5vdCByZXNvbHZlIFwiJHtwZWVyRGVwfVwiIGltcG9ydGVkIGJ5IFwiJHtwYXJlbnREZXB9XCIuIElzIGl0IGluc3RhbGxlZD9cXGApYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNwbGl0RmlsZUFuZFBvc3RmaXgocGF0aCkge1xuICAgIGxldCBmaWxlID0gcGF0aDtcbiAgICBsZXQgcG9zdGZpeCA9ICcnO1xuICAgIGxldCBwb3N0Zml4SW5kZXggPSBwYXRoLmluZGV4T2YoJz8nKTtcbiAgICBpZiAocG9zdGZpeEluZGV4IDwgMCkge1xuICAgICAgICBwb3N0Zml4SW5kZXggPSBwYXRoLmluZGV4T2YoJyMnKTtcbiAgICB9XG4gICAgaWYgKHBvc3RmaXhJbmRleCA+IDApIHtcbiAgICAgICAgZmlsZSA9IHBhdGguc2xpY2UoMCwgcG9zdGZpeEluZGV4KTtcbiAgICAgICAgcG9zdGZpeCA9IHBhdGguc2xpY2UocG9zdGZpeEluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZmlsZSwgcG9zdGZpeCB9O1xufVxuZnVuY3Rpb24gdHJ5RnNSZXNvbHZlKGZzUGF0aCwgb3B0aW9ucywgdHJ5SW5kZXggPSB0cnVlLCB0YXJnZXRXZWIgPSB0cnVlKSB7XG4gICAgY29uc3QgeyBmaWxlLCBwb3N0Zml4IH0gPSBzcGxpdEZpbGVBbmRQb3N0Zml4KGZzUGF0aCk7XG4gICAgbGV0IHJlcztcbiAgICAvLyBpZiB0aGVyZSBpcyBhIHBvc3RmaXgsIHRyeSByZXNvbHZpbmcgaXQgYXMgYSBjb21wbGV0ZSBwYXRoIGZpcnN0ICgjNDcwMylcbiAgICBpZiAocG9zdGZpeCAmJlxuICAgICAgICAocmVzID0gdHJ5UmVzb2x2ZUZpbGUoZnNQYXRoLCAnJywgb3B0aW9ucywgZmFsc2UsIHRhcmdldFdlYiwgb3B0aW9ucy50cnlQcmVmaXgsIG9wdGlvbnMuc2tpcFBhY2thZ2VKc29uKSkpIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKChyZXMgPSB0cnlSZXNvbHZlRmlsZShmaWxlLCBwb3N0Zml4LCBvcHRpb25zLCBmYWxzZSwgdGFyZ2V0V2ViLCBvcHRpb25zLnRyeVByZWZpeCwgb3B0aW9ucy5za2lwUGFja2FnZUpzb24pKSkge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBvcHRpb25zLmV4dGVuc2lvbnMpIHtcbiAgICAgICAgaWYgKHBvc3RmaXggJiZcbiAgICAgICAgICAgIChyZXMgPSB0cnlSZXNvbHZlRmlsZShmc1BhdGggKyBleHQsICcnLCBvcHRpb25zLCBmYWxzZSwgdGFyZ2V0V2ViLCBvcHRpb25zLnRyeVByZWZpeCwgb3B0aW9ucy5za2lwUGFja2FnZUpzb24sIGZhbHNlKSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChyZXMgPSB0cnlSZXNvbHZlRmlsZShmaWxlICsgZXh0LCBwb3N0Zml4LCBvcHRpb25zLCBmYWxzZSwgdGFyZ2V0V2ViLCBvcHRpb25zLnRyeVByZWZpeCwgb3B0aW9ucy5za2lwUGFja2FnZUpzb24sIGZhbHNlKSkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgYHRyeUluZGV4YCBmYWxzZSwgc2tpcCBhcyB3ZSd2ZSBhbHJlYWR5IHRlc3RlZCBhYm92ZVxuICAgIGlmICghdHJ5SW5kZXgpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAocG9zdGZpeCAmJlxuICAgICAgICAocmVzID0gdHJ5UmVzb2x2ZUZpbGUoZnNQYXRoLCAnJywgb3B0aW9ucywgdHJ5SW5kZXgsIHRhcmdldFdlYiwgb3B0aW9ucy50cnlQcmVmaXgsIG9wdGlvbnMuc2tpcFBhY2thZ2VKc29uKSkpIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKChyZXMgPSB0cnlSZXNvbHZlRmlsZShmaWxlLCBwb3N0Zml4LCBvcHRpb25zLCB0cnlJbmRleCwgdGFyZ2V0V2ViLCBvcHRpb25zLnRyeVByZWZpeCwgb3B0aW9ucy5za2lwUGFja2FnZUpzb24pKSkge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyeVJlc29sdmVGaWxlKGZpbGUsIHBvc3RmaXgsIG9wdGlvbnMsIHRyeUluZGV4LCB0YXJnZXRXZWIsIHRyeVByZWZpeCwgc2tpcFBhY2thZ2VKc29uLCBza2lwVHNFeHRlbnNpb24pIHtcbiAgICBsZXQgc3RhdDtcbiAgICB0cnkge1xuICAgICAgICBzdGF0ID0gZnMkbC5zdGF0U3luYyhmaWxlLCB7IHRocm93SWZOb0VudHJ5OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdGF0KSB7XG4gICAgICAgIGlmICghc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0UmVhbFBhdGgoZmlsZSwgb3B0aW9ucy5wcmVzZXJ2ZVN5bWxpbmtzKSArIHBvc3RmaXg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJ5SW5kZXgpIHtcbiAgICAgICAgICAgIGlmICghc2tpcFBhY2thZ2VKc29uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGtnUGF0aCA9IGZpbGUgKyAnL3BhY2thZ2UuanNvbic7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGF0aCBwb2ludHMgdG8gYSBub2RlIHBhY2thZ2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGtnID0gbG9hZFBhY2thZ2VEYXRhKHBrZ1BhdGgsIG9wdGlvbnMucHJlc2VydmVTeW1saW5rcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVBhY2thZ2VFbnRyeShmaWxlLCBwa2csIHRhcmdldFdlYiwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRyeUZzUmVzb2x2ZShmaWxlICsgJy9pbmRleCcsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKGluZGV4KVxuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCArIHBvc3RmaXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gdHJ5IHJlc29sdmUgLmpzIGltcG9ydCB0byB0eXBlc2NyaXB0IGZpbGVcbiAgICBpZiAoIXNraXBUc0V4dGVuc2lvbiAmJlxuICAgICAgICBvcHRpb25zLmlzRnJvbVRzSW1wb3J0ZXIgJiZcbiAgICAgICAgaXNQb3NzaWJsZVRzT3V0cHV0KGZpbGUpKSB7XG4gICAgICAgIGNvbnN0IHRzU3JjUGF0aHMgPSBnZXRQb3RlbnRpYWxUc1NyY1BhdGhzKGZpbGUpO1xuICAgICAgICBmb3IgKGNvbnN0IHNyY1BhdGggb2YgdHNTcmNQYXRocykge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gdHJ5UmVzb2x2ZUZpbGUoc3JjUGF0aCwgcG9zdGZpeCwgb3B0aW9ucywgdHJ5SW5kZXgsIHRhcmdldFdlYiwgdHJ5UHJlZml4LCBza2lwUGFja2FnZUpzb24sIHRydWUpO1xuICAgICAgICAgICAgaWYgKHJlcylcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRyeVByZWZpeCkge1xuICAgICAgICBjb25zdCBwcmVmaXhlZCA9IGAke3BhdGgkby5kaXJuYW1lKGZpbGUpfS8ke3RyeVByZWZpeH0ke3BhdGgkby5iYXNlbmFtZShmaWxlKX1gO1xuICAgICAgICByZXR1cm4gdHJ5UmVzb2x2ZUZpbGUocHJlZml4ZWQsIHBvc3RmaXgsIG9wdGlvbnMsIHRyeUluZGV4LCB0YXJnZXRXZWIpO1xuICAgIH1cbn1cbmNvbnN0IGlkVG9Qa2dNYXAgPSBuZXcgTWFwKCk7XG5mdW5jdGlvbiB0cnlOb2RlUmVzb2x2ZShpZCwgaW1wb3J0ZXIsIG9wdGlvbnMsIHRhcmdldFdlYiwgZGVwc09wdGltaXplciwgc3NyID0gZmFsc2UsIGV4dGVybmFsaXplLCBhbGxvd0xpbmtlZEV4dGVybmFsID0gdHJ1ZSkge1xuICAgIGNvbnN0IHsgcm9vdCwgZGVkdXBlLCBpc0J1aWxkLCBwcmVzZXJ2ZVN5bWxpbmtzLCBwYWNrYWdlQ2FjaGUgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcG9zc2libGVQa2dJZHMgPSBbXTtcbiAgICBmb3IgKGxldCBwcmV2U2xhc2hJbmRleCA9IC0xOzspIHtcbiAgICAgICAgbGV0IHNsYXNoSW5kZXggPSBpZC5pbmRleE9mKCcvJywgcHJldlNsYXNoSW5kZXggKyAxKTtcbiAgICAgICAgaWYgKHNsYXNoSW5kZXggPCAwKSB7XG4gICAgICAgICAgICBzbGFzaEluZGV4ID0gaWQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnQgPSBpZC5zbGljZShwcmV2U2xhc2hJbmRleCArIDEsIChwcmV2U2xhc2hJbmRleCA9IHNsYXNoSW5kZXgpKTtcbiAgICAgICAgaWYgKCFwYXJ0KSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBBc3N1bWUgcGF0aCBwYXJ0cyB3aXRoIGFuIGV4dGVuc2lvbiBhcmUgbm90IHBhY2thZ2Ugcm9vdHMsIGV4Y2VwdCBmb3IgdGhlXG4gICAgICAgIC8vIGZpcnN0IHBhdGggcGFydCAoc2luY2UgcGVyaW9kcyBhcmUgc2FkbHkgYWxsb3dlZCBpbiBwYWNrYWdlIG5hbWVzKS5cbiAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSwgc2tpcCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGlmIGl0IGJlZ2lucyB3aXRoIFwiQFwiXG4gICAgICAgIC8vIChzaW5jZSBcIkBmb28vYmFyXCIgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIHRvcC1sZXZlbCBwYXRoKS5cbiAgICAgICAgaWYgKHBvc3NpYmxlUGtnSWRzLmxlbmd0aCA/IHBhdGgkby5leHRuYW1lKHBhcnQpIDogcGFydFswXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3NzaWJsZVBrZ0lkID0gaWQuc2xpY2UoMCwgc2xhc2hJbmRleCk7XG4gICAgICAgIHBvc3NpYmxlUGtnSWRzLnB1c2gocG9zc2libGVQa2dJZCk7XG4gICAgfVxuICAgIGxldCBiYXNlZGlyO1xuICAgIGlmIChkZWR1cGU/LnNvbWUoKGlkKSA9PiBwb3NzaWJsZVBrZ0lkcy5pbmNsdWRlcyhpZCkpKSB7XG4gICAgICAgIGJhc2VkaXIgPSByb290O1xuICAgIH1cbiAgICBlbHNlIGlmIChpbXBvcnRlciAmJlxuICAgICAgICBwYXRoJG8uaXNBYnNvbHV0ZShpbXBvcnRlcikgJiZcbiAgICAgICAgZnMkbC5leGlzdHNTeW5jKGNsZWFuVXJsKGltcG9ydGVyKSkpIHtcbiAgICAgICAgYmFzZWRpciA9IHBhdGgkby5kaXJuYW1lKGltcG9ydGVyKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGJhc2VkaXIgPSByb290O1xuICAgIH1cbiAgICBsZXQgcGtnO1xuICAgIGxldCBwa2dJZDtcbiAgICAvLyBuZWFyZXN0IHBhY2thZ2UuanNvblxuICAgIGxldCBuZWFyZXN0UGtnO1xuICAgIGNvbnN0IHJvb3RQa2dJZCA9IHBvc3NpYmxlUGtnSWRzWzBdO1xuICAgIGNvbnN0IHJvb3RQa2cgPSByZXNvbHZlUGFja2FnZURhdGEocm9vdFBrZ0lkLCBiYXNlZGlyLCBwcmVzZXJ2ZVN5bWxpbmtzLCBwYWNrYWdlQ2FjaGUpO1xuICAgIGNvbnN0IG5lYXJlc3RQa2dJZCA9IFsuLi5wb3NzaWJsZVBrZ0lkc10ucmV2ZXJzZSgpLmZpbmQoKHBrZ0lkKSA9PiB7XG4gICAgICAgIG5lYXJlc3RQa2cgPSByZXNvbHZlUGFja2FnZURhdGEocGtnSWQsIGJhc2VkaXIsIHByZXNlcnZlU3ltbGlua3MsIHBhY2thZ2VDYWNoZSk7XG4gICAgICAgIHJldHVybiBuZWFyZXN0UGtnO1xuICAgIH0pO1xuICAgIGlmIChyb290UGtnPy5kYXRhPy5leHBvcnRzKSB7XG4gICAgICAgIHBrZ0lkID0gcm9vdFBrZ0lkO1xuICAgICAgICBwa2cgPSByb290UGtnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcGtnSWQgPSBuZWFyZXN0UGtnSWQ7XG4gICAgICAgIHBrZyA9IG5lYXJlc3RQa2c7XG4gICAgfVxuICAgIGlmICghcGtnIHx8ICFuZWFyZXN0UGtnKSB7XG4gICAgICAgIC8vIGlmIGltcG9ydCBjYW4ndCBiZSBmb3VuZCwgY2hlY2sgaWYgaXQncyBhbiBvcHRpb25hbCBwZWVyIGRlcC5cbiAgICAgICAgLy8gaWYgc28sIHdlIGNhbiByZXNvbHZlIHRvIGEgc3BlY2lhbCBpZCB0aGF0IGVycm9ycyBvbmx5IHdoZW4gaW1wb3J0ZWQuXG4gICAgICAgIGlmIChiYXNlZGlyICE9PSByb290ICYmIC8vIHJvb3QgaGFzIG5vIHBlZXIgZGVwXG4gICAgICAgICAgICAhaXNCdWlsdGluKGlkKSAmJlxuICAgICAgICAgICAgIWlkLmluY2x1ZGVzKCdcXDAnKSAmJlxuICAgICAgICAgICAgYmFyZUltcG9ydFJFLnRlc3QoaWQpKSB7XG4gICAgICAgICAgICAvLyBmaW5kIHBhY2thZ2UuanNvbiB3aXRoIGBuYW1lYCBhcyBtYWluXG4gICAgICAgICAgICBjb25zdCBtYWluUGFja2FnZUpzb24gPSBsb29rdXBGaWxlKGJhc2VkaXIsIFsncGFja2FnZS5qc29uJ10sIHtcbiAgICAgICAgICAgICAgICBwcmVkaWNhdGU6IChjb250ZW50KSA9PiAhIUpTT04ucGFyc2UoY29udGVudCkubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG1haW5QYWNrYWdlSnNvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1haW5Qa2cgPSBKU09OLnBhcnNlKG1haW5QYWNrYWdlSnNvbik7XG4gICAgICAgICAgICAgICAgaWYgKG1haW5Qa2cucGVlckRlcGVuZGVuY2llcz8uW2lkXSAmJlxuICAgICAgICAgICAgICAgICAgICBtYWluUGtnLnBlZXJEZXBlbmRlbmNpZXNNZXRhPy5baWRdPy5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGAke29wdGlvbmFsUGVlckRlcElkfToke2lkfToke21haW5Qa2cubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCByZXNvbHZlSWQgPSByZXNvbHZlUGFja2FnZUVudHJ5O1xuICAgIGxldCB1bnJlc29sdmVkSWQgPSBwa2dJZDtcbiAgICBjb25zdCBpc0RlZXBJbXBvcnQgPSB1bnJlc29sdmVkSWQgIT09IGlkO1xuICAgIGlmIChpc0RlZXBJbXBvcnQpIHtcbiAgICAgICAgcmVzb2x2ZUlkID0gcmVzb2x2ZURlZXBJbXBvcnQ7XG4gICAgICAgIHVucmVzb2x2ZWRJZCA9ICcuJyArIGlkLnNsaWNlKHBrZ0lkLmxlbmd0aCk7XG4gICAgfVxuICAgIGxldCByZXNvbHZlZDtcbiAgICB0cnkge1xuICAgICAgICByZXNvbHZlZCA9IHJlc29sdmVJZCh1bnJlc29sdmVkSWQsIHBrZywgdGFyZ2V0V2ViLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIW9wdGlvbnMudHJ5RXNtT25seSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghcmVzb2x2ZWQgJiYgb3B0aW9ucy50cnlFc21Pbmx5KSB7XG4gICAgICAgIHJlc29sdmVkID0gcmVzb2x2ZUlkKHVucmVzb2x2ZWRJZCwgcGtnLCB0YXJnZXRXZWIsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBpc1JlcXVpcmU6IGZhbHNlLFxuICAgICAgICAgICAgbWFpbkZpZWxkczogREVGQVVMVF9NQUlOX0ZJRUxEUyxcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IERFRkFVTFRfRVhURU5TSU9OUyQxLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFyZXNvbHZlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByb2Nlc3NSZXN1bHQgPSAocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgaWYgKCFleHRlcm5hbGl6ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IGV4dGVybmFsIHN5bWxpbmsgcGFja2FnZXNcbiAgICAgICAgaWYgKCFhbGxvd0xpbmtlZEV4dGVybmFsICYmICFyZXNvbHZlZC5pZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNvbHZlZEV4dCA9IHBhdGgkby5leHRuYW1lKHJlc29sdmVkLmlkKTtcbiAgICAgICAgLy8gZG9uJ3QgZXh0ZXJuYWwgbm9uLWpzIGltcG9ydHNcbiAgICAgICAgaWYgKHJlc29sdmVkRXh0ICYmXG4gICAgICAgICAgICByZXNvbHZlZEV4dCAhPT0gJy5qcycgJiZcbiAgICAgICAgICAgIHJlc29sdmVkRXh0ICE9PSAnLm1qcycgJiZcbiAgICAgICAgICAgIHJlc29sdmVkRXh0ICE9PSAnLmNqcycpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWRJZCA9IGlkO1xuICAgICAgICBpZiAoaXNEZWVwSW1wb3J0KSB7XG4gICAgICAgICAgICBpZiAoIXBrZz8uZGF0YS5leHBvcnRzICYmIHBhdGgkby5leHRuYW1lKGlkKSAhPT0gcmVzb2x2ZWRFeHQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlZElkID0gcmVzb2x2ZWQuaWQuc2xpY2UocmVzb2x2ZWQuaWQuaW5kZXhPZihpZCkpO1xuICAgICAgICAgICAgICAgIGlzRGVidWckNCAmJlxuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyRjKGBbcHJvY2Vzc1Jlc3VsdF0gJHtwaWNvY29sb3JzRXhwb3J0cy5jeWFuKGlkKX0gLT4gJHtwaWNvY29sb3JzRXhwb3J0cy5kaW0ocmVzb2x2ZWRJZCl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgLi4ucmVzb2x2ZWQsIGlkOiByZXNvbHZlZElkLCBleHRlcm5hbDogdHJ1ZSB9O1xuICAgIH07XG4gICAgLy8gbGluayBpZCB0byBwa2cgZm9yIGJyb3dzZXIgZmllbGQgbWFwcGluZyBjaGVja1xuICAgIGlkVG9Qa2dNYXAuc2V0KHJlc29sdmVkLCBwa2cpO1xuICAgIGlmICgoaXNCdWlsZCAmJiAhZGVwc09wdGltaXplcikgfHwgZXh0ZXJuYWxpemUpIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBwYWNrYWdlIHNpZGUgZWZmZWN0cyBmb3IgYnVpbGQgc28gdGhhdCByb2xsdXAgY2FuIGJldHRlclxuICAgICAgICAvLyBwZXJmb3JtIHRyZWUtc2hha2luZ1xuICAgICAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdCh7XG4gICAgICAgICAgICBpZDogcmVzb2x2ZWQsXG4gICAgICAgICAgICBtb2R1bGVTaWRlRWZmZWN0czogcGtnLmhhc1NpZGVFZmZlY3RzKHJlc29sdmVkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGV4dCA9IHBhdGgkby5leHRuYW1lKHJlc29sdmVkKTtcbiAgICBjb25zdCBpc0NKUyA9IGV4dCA9PT0gJy5janMnIHx8IChleHQgPT09ICcuanMnICYmIG5lYXJlc3RQa2cuZGF0YS50eXBlICE9PSAnbW9kdWxlJyk7XG4gICAgaWYgKCFvcHRpb25zLnNzck9wdGltaXplQ2hlY2sgJiZcbiAgICAgICAgKCFyZXNvbHZlZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykgfHwgLy8gbGlua2VkXG4gICAgICAgICAgICAhZGVwc09wdGltaXplciB8fCAvLyByZXNvbHZpbmcgYmVmb3JlIGxpc3RlbmluZyB0byB0aGUgc2VydmVyXG4gICAgICAgICAgICBvcHRpb25zLnNjYW4pIC8vIGluaXRpYWwgZXNidWlsZCBzY2FuIHBoYXNlXG4gICAgKSB7XG4gICAgICAgIHJldHVybiB7IGlkOiByZXNvbHZlZCB9O1xuICAgIH1cbiAgICAvLyBpZiB3ZSByZWFjaCBoZXJlLCBpdCdzIGEgdmFsaWQgZGVwIGltcG9ydCB0aGF0IGhhc24ndCBiZWVuIG9wdGltaXplZC5cbiAgICBjb25zdCBpc0pzVHlwZSA9IGRlcHNPcHRpbWl6ZXJcbiAgICAgICAgPyBpc09wdGltaXphYmxlKHJlc29sdmVkLCBkZXBzT3B0aW1pemVyLm9wdGlvbnMpXG4gICAgICAgIDogT1BUSU1JWkFCTEVfRU5UUllfUkUudGVzdChyZXNvbHZlZCk7XG4gICAgbGV0IGV4Y2x1ZGUgPSBkZXBzT3B0aW1pemVyPy5vcHRpb25zLmV4Y2x1ZGU7XG4gICAgbGV0IGluY2x1ZGUgPSBkZXBzT3B0aW1pemVyPy5vcHRpb25zLmluY2x1ZGU7XG4gICAgaWYgKG9wdGlvbnMuc3NyT3B0aW1pemVDaGVjaykge1xuICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRoZSBkZXBzT3B0aW1pemVyXG4gICAgICAgIGV4Y2x1ZGUgPSBvcHRpb25zLnNzckNvbmZpZz8ub3B0aW1pemVEZXBzPy5leGNsdWRlO1xuICAgICAgICBpbmNsdWRlID0gb3B0aW9ucy5zc3JDb25maWc/Lm9wdGltaXplRGVwcz8uaW5jbHVkZTtcbiAgICB9XG4gICAgY29uc3Qgc2tpcE9wdGltaXphdGlvbiA9ICFpc0pzVHlwZSB8fFxuICAgICAgICBpbXBvcnRlcj8uaW5jbHVkZXMoJ25vZGVfbW9kdWxlcycpIHx8XG4gICAgICAgIGV4Y2x1ZGU/LmluY2x1ZGVzKHBrZ0lkKSB8fFxuICAgICAgICBleGNsdWRlPy5pbmNsdWRlcyhpZCkgfHxcbiAgICAgICAgU1BFQ0lBTF9RVUVSWV9SRS50ZXN0KHJlc29sdmVkKSB8fFxuICAgICAgICAvLyBEdXJpbmcgZGV2IFNTUiwgd2UgZG9uJ3QgaGF2ZSBhIHdheSB0byByZWxvYWQgdGhlIG1vZHVsZSBncmFwaCBpZlxuICAgICAgICAvLyBhIG5vbi1vcHRpbWl6ZWQgZGVwIGlzIGZvdW5kLiBTbyB3ZSBuZWVkIHRvIHNraXAgb3B0aW1pemF0aW9uIGhlcmUuXG4gICAgICAgIC8vIFRoZSBvbmx5IG9wdGltaXplZCBkZXBzIGFyZSB0aGUgb25lcyBleHBsaWNpdGx5IGxpc3RlZCBpbiB0aGUgY29uZmlnLlxuICAgICAgICAoIW9wdGlvbnMuc3NyT3B0aW1pemVDaGVjayAmJiAhaXNCdWlsZCAmJiBzc3IpIHx8XG4gICAgICAgIC8vIE9ubHkgb3B0aW1pemUgbm9uLWV4dGVybmFsIENKUyBkZXBzIGR1cmluZyBTU1IgYnkgZGVmYXVsdFxuICAgICAgICAoc3NyICYmICFpc0NKUyAmJiAhKGluY2x1ZGU/LmluY2x1ZGVzKHBrZ0lkKSB8fCBpbmNsdWRlPy5pbmNsdWRlcyhpZCkpKTtcbiAgICBpZiAob3B0aW9ucy5zc3JPcHRpbWl6ZUNoZWNrKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogc2tpcE9wdGltaXphdGlvblxuICAgICAgICAgICAgICAgID8gaW5qZWN0UXVlcnkocmVzb2x2ZWQsIGBfX3ZpdGVfc2tpcF9vcHRpbWl6YXRpb25gKVxuICAgICAgICAgICAgICAgIDogcmVzb2x2ZWQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChza2lwT3B0aW1pemF0aW9uKSB7XG4gICAgICAgIC8vIGV4Y2x1ZGVkIGZyb20gb3B0aW1pemF0aW9uXG4gICAgICAgIC8vIEluamVjdCBhIHZlcnNpb24gcXVlcnkgdG8gbnBtIGRlcHMgc28gdGhhdCB0aGUgYnJvd3NlclxuICAgICAgICAvLyBjYW4gY2FjaGUgaXQgd2l0aG91dCByZS12YWxpZGF0aW9uLCBidXQgb25seSBkbyBzbyBmb3Iga25vd24ganMgdHlwZXMuXG4gICAgICAgIC8vIG90aGVyd2lzZSB3ZSBtYXkgaW50cm9kdWNlIGR1cGxpY2F0ZWQgbW9kdWxlcyBmb3IgZXh0ZXJuYWxpemVkIGZpbGVzXG4gICAgICAgIC8vIGZyb20gcHJlLWJ1bmRsZWQgZGVwcy5cbiAgICAgICAgaWYgKCFpc0J1aWxkKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uSGFzaCA9IGRlcHNPcHRpbWl6ZXIubWV0YWRhdGEuYnJvd3Nlckhhc2g7XG4gICAgICAgICAgICBpZiAodmVyc2lvbkhhc2ggJiYgaXNKc1R5cGUpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlZCA9IGluamVjdFF1ZXJ5KHJlc29sdmVkLCBgdj0ke3ZlcnNpb25IYXNofWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyB0aGlzIGlzIGEgbWlzc2luZyBpbXBvcnQsIHF1ZXVlIG9wdGltaXplLWRlcHMgcmUtcnVuIGFuZFxuICAgICAgICAvLyBnZXQgYSByZXNvbHZlZCBpdHMgb3B0aW1pemVkIGluZm9cbiAgICAgICAgY29uc3Qgb3B0aW1pemVkSW5mbyA9IGRlcHNPcHRpbWl6ZXIucmVnaXN0ZXJNaXNzaW5nSW1wb3J0KGlkLCByZXNvbHZlZCk7XG4gICAgICAgIHJlc29sdmVkID0gZGVwc09wdGltaXplci5nZXRPcHRpbWl6ZWREZXBJZChvcHRpbWl6ZWRJbmZvKTtcbiAgICB9XG4gICAgaWYgKGlzQnVpbGQpIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBwYWNrYWdlIHNpZGUgZWZmZWN0cyBmb3IgYnVpbGQgc28gdGhhdCByb2xsdXAgY2FuIGJldHRlclxuICAgICAgICAvLyBwZXJmb3JtIHRyZWUtc2hha2luZ1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IHJlc29sdmVkLFxuICAgICAgICAgICAgbW9kdWxlU2lkZUVmZmVjdHM6IHBrZy5oYXNTaWRlRWZmZWN0cyhyZXNvbHZlZCksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4geyBpZDogcmVzb2x2ZWQgfTtcbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiB0cnlPcHRpbWl6ZWRSZXNvbHZlKGRlcHNPcHRpbWl6ZXIsIGlkLCBpbXBvcnRlcikge1xuICAgIC8vIFRPRE86IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBzY2FubmluZyBpcyBkb25lIGhlcmUgYXMgdGhpcyBmdW5jdGlvblxuICAgIC8vIGlzIHVzZWQgaW4gdGhlIHByZUFsaWFzUGx1Z2luIHRvIGRlY2lkZSBpZiBhbiBhbGlhc2VkIGRlcCBpcyBvcHRpbWl6ZWQsXG4gICAgLy8gYW5kIGF2b2lkIHJlcGxhY2luZyB0aGUgYmFyZSBpbXBvcnQgd2l0aCB0aGUgcmVzb2x2ZWQgcGF0aC5cbiAgICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byByZW1vdmUgdGhpcyBpbiB0aGUgZnV0dXJlXG4gICAgYXdhaXQgZGVwc09wdGltaXplci5zY2FuUHJvY2Vzc2luZztcbiAgICBjb25zdCBtZXRhZGF0YSA9IGRlcHNPcHRpbWl6ZXIubWV0YWRhdGE7XG4gICAgY29uc3QgZGVwSW5mbyA9IG9wdGltaXplZERlcEluZm9Gcm9tSWQobWV0YWRhdGEsIGlkKTtcbiAgICBpZiAoZGVwSW5mbykge1xuICAgICAgICByZXR1cm4gZGVwc09wdGltaXplci5nZXRPcHRpbWl6ZWREZXBJZChkZXBJbmZvKTtcbiAgICB9XG4gICAgaWYgKCFpbXBvcnRlcilcbiAgICAgICAgcmV0dXJuO1xuICAgIC8vIGZ1cnRoZXIgY2hlY2sgaWYgaWQgaXMgaW1wb3J0ZWQgYnkgbmVzdGVkIGRlcGVuZGVuY3lcbiAgICBsZXQgcmVzb2x2ZWRTcmM7XG4gICAgZm9yIChjb25zdCBvcHRpbWl6ZWREYXRhIG9mIG1ldGFkYXRhLmRlcEluZm9MaXN0KSB7XG4gICAgICAgIGlmICghb3B0aW1pemVkRGF0YS5zcmMpXG4gICAgICAgICAgICBjb250aW51ZTsgLy8gSWdub3JlIGNodW5rc1xuICAgICAgICBjb25zdCBwa2dQYXRoID0gb3B0aW1pemVkRGF0YS5pZDtcbiAgICAgICAgLy8gY2hlY2sgZm9yIHNjZW5hcmlvcywgZS5nLlxuICAgICAgICAvLyAgIHBrZ1BhdGggID0+IFwibXktbGliID4gZm9vXCJcbiAgICAgICAgLy8gICBpZCAgICAgICA9PiBcImZvb1wiXG4gICAgICAgIC8vIHRoaXMgbmFycm93cyB0aGUgbmVlZCB0byBkbyBhIGZ1bGwgcmVzb2x2ZVxuICAgICAgICBpZiAoIXBrZ1BhdGguZW5kc1dpdGgoaWQpKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIC8vIGxhemlseSBpbml0aWFsaXplIHJlc29sdmVkU3JjXG4gICAgICAgIGlmIChyZXNvbHZlZFNyYyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgbWF5IHRocm93IGVycm9ycyBpZiB1bmFibGUgdG8gcmVzb2x2ZSwgZS5nLiBhbGlhc2VkIGlkXG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRTcmMgPSBub3JtYWxpemVQYXRoJDMocmVzb2x2ZUZyb20oaWQsIHBhdGgkby5kaXJuYW1lKGltcG9ydGVyKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYmVzdC1lZmZvcnQgb25seSBzbyBzd2FsbG93IGVycm9yc1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG1hdGNoIGJ5IHNyYyB0byBjb3JyZWN0bHkgaWRlbnRpZnkgaWYgaWQgYmVsb25ncyB0byBuZXN0ZWQgZGVwZW5kZW5jeVxuICAgICAgICBpZiAob3B0aW1pemVkRGF0YS5zcmMgPT09IHJlc29sdmVkU3JjKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVwc09wdGltaXplci5nZXRPcHRpbWl6ZWREZXBJZChvcHRpbWl6ZWREYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlRW50cnkoaWQsIHsgZGlyLCBkYXRhLCBzZXRSZXNvbHZlZENhY2hlLCBnZXRSZXNvbHZlZENhY2hlIH0sIHRhcmdldFdlYiwgb3B0aW9ucykge1xuICAgIGNvbnN0IGNhY2hlZCA9IGdldFJlc29sdmVkQ2FjaGUoJy4nLCB0YXJnZXRXZWIpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IGVudHJ5UG9pbnQ7XG4gICAgICAgIC8vIHJlc29sdmUgZXhwb3J0cyBmaWVsZCB3aXRoIGhpZ2hlc3QgcHJpb3JpdHlcbiAgICAgICAgLy8gdXNpbmcgaHR0cHM6Ly9naXRodWIuY29tL2x1a2VlZC9yZXNvbHZlLmV4cG9ydHNcbiAgICAgICAgaWYgKGRhdGEuZXhwb3J0cykge1xuICAgICAgICAgICAgZW50cnlQb2ludCA9IHJlc29sdmVFeHBvcnRzT3JJbXBvcnRzKGRhdGEsICcuJywgb3B0aW9ucywgdGFyZ2V0V2ViLCAnZXhwb3J0cycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc29sdmVkRnJvbUV4cG9ydHMgPSAhIWVudHJ5UG9pbnQ7XG4gICAgICAgIC8vIGlmIGV4cG9ydHMgcmVzb2x2ZWQgdG8gLm1qcywgc3RpbGwgcmVzb2x2ZSBvdGhlciBmaWVsZHMuXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSAubWpzIGZpbGVzIGNhbiB0ZWNobmljYWxseSBpbXBvcnQgLmNqcyBmaWxlcyB3aGljaCB3b3VsZFxuICAgICAgICAvLyBtYWtlIHRoZW0gaW52YWxpZCBmb3IgcHVyZSBFU00gZW52aXJvbm1lbnRzIC0gc28gaWYgb3RoZXIgbW9kdWxlL2Jyb3dzZXJcbiAgICAgICAgLy8gZmllbGRzIGFyZSBwcmVzZW50LCBwcmlvcml0aXplIHRob3NlIGluc3RlYWQuXG4gICAgICAgIGlmICh0YXJnZXRXZWIgJiZcbiAgICAgICAgICAgIG9wdGlvbnMuYnJvd3NlckZpZWxkICYmXG4gICAgICAgICAgICAoIWVudHJ5UG9pbnQgfHwgZW50cnlQb2ludC5lbmRzV2l0aCgnLm1qcycpKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgYnJvd3NlciBmaWVsZFxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RlZnVuY3R6b21iaWUvcGFja2FnZS1icm93c2VyLWZpZWxkLXNwZWNcbiAgICAgICAgICAgIGNvbnN0IGJyb3dzZXJFbnRyeSA9IHR5cGVvZiBkYXRhLmJyb3dzZXIgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBkYXRhLmJyb3dzZXJcbiAgICAgICAgICAgICAgICA6IGlzT2JqZWN0JDIoZGF0YS5icm93c2VyKSAmJiBkYXRhLmJyb3dzZXJbJy4nXTtcbiAgICAgICAgICAgIGlmIChicm93c2VyRW50cnkpIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgcGFja2FnZSBhbHNvIGhhcyBhIFwibW9kdWxlXCIgZmllbGQuXG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlzUmVxdWlyZSAmJlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm1haW5GaWVsZHMuaW5jbHVkZXMoJ21vZHVsZScpICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBkYXRhLm1vZHVsZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tb2R1bGUgIT09IGJyb3dzZXJFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBib3RoIGFyZSBwcmVzZW50LCB3ZSBtYXkgaGF2ZSBhIHByb2JsZW06IHNvbWUgcGFja2FnZSBwb2ludHMgYm90aFxuICAgICAgICAgICAgICAgICAgICAvLyB0byBFU00sIHdpdGggXCJtb2R1bGVcIiB0YXJnZXRpbmcgTm9kZS5qcywgd2hpbGUgc29tZSBwYWNrYWdlcyBwb2ludHNcbiAgICAgICAgICAgICAgICAgICAgLy8gXCJtb2R1bGVcIiB0byBicm93c2VyIEVTTSBhbmQgXCJicm93c2VyXCIgdG8gVU1EL0lJRkUuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBoZXVyaXN0aWNzIGhlcmUgaXMgdG8gYWN0dWFsbHkgcmVhZCB0aGUgYnJvd3NlciBlbnRyeSB3aGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIGFuZCBjaGVjayBmb3IgaGludHMgb2YgRVNNLiBJZiBpdCBpcyBub3QgRVNNLCBwcmVmZXIgXCJtb2R1bGVcIlxuICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkOyBPdGhlcndpc2UsIGFzc3VtZSBpdCdzIEVTTSBhbmQgdXNlIGl0LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZEJyb3dzZXJFbnRyeSA9IHRyeUZzUmVzb2x2ZShwYXRoJG8uam9pbihkaXIsIGJyb3dzZXJFbnRyeSksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRCcm93c2VyRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcyRsLnJlYWRGaWxlU3luYyhyZXNvbHZlZEJyb3dzZXJFbnRyeSwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRVNNU3ludGF4KGNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlrZWx5IEVTTSwgcHJlZmVyIGJyb3dzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVBvaW50ID0gYnJvd3NlckVudHJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLUVTTSwgVU1EIG9yIElJRkUgb3IgQ0pTKCEhISBlLmcuIGZpcmViYXNlIDcueCksIHByZWZlciBtb2R1bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVBvaW50ID0gZGF0YS5tb2R1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5UG9pbnQgPSBicm93c2VyRW50cnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZhbGxiYWNrIHRvIG1haW5GaWVsZHMgaWYgc3RpbGwgbm90IHJlc29sdmVkXG4gICAgICAgIC8vIFRPRE86IHJldmlldyBpZiBgLm1qc2AgY2hlY2sgaXMgc3RpbGwgbmVlZGVkXG4gICAgICAgIGlmICghcmVzb2x2ZWRGcm9tRXhwb3J0cyAmJiAoIWVudHJ5UG9pbnQgfHwgZW50cnlQb2ludC5lbmRzV2l0aCgnLm1qcycpKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBvcHRpb25zLm1haW5GaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQgPT09ICdicm93c2VyJylcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGFscmVhZHkgY2hlY2tlZCBhYm92ZVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtmaWVsZF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5UG9pbnQgPSBkYXRhW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVudHJ5UG9pbnQgfHwgKGVudHJ5UG9pbnQgPSBkYXRhLm1haW4pO1xuICAgICAgICAvLyB0cnkgZGVmYXVsdCBlbnRyeSB3aGVuIGVudHJ5IGlzIG5vdCBkZWZpbmVcbiAgICAgICAgLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9tb2R1bGVzLmh0bWwjYWxsLXRvZ2V0aGVyXG4gICAgICAgIGNvbnN0IGVudHJ5UG9pbnRzID0gZW50cnlQb2ludFxuICAgICAgICAgICAgPyBbZW50cnlQb2ludF1cbiAgICAgICAgICAgIDogWydpbmRleC5qcycsICdpbmRleC5qc29uJywgJ2luZGV4Lm5vZGUnXTtcbiAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgZW50cnlQb2ludHMpIHtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgc2NyaXB0cyB3aGVuIGxvb2tpbmcgZm9yIHNhc3NcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm1haW5GaWVsZHNbMF0gPT09ICdzYXNzJyAmJlxuICAgICAgICAgICAgICAgICFvcHRpb25zLmV4dGVuc2lvbnMuaW5jbHVkZXMocGF0aCRvLmV4dG5hbWUoZW50cnkpKSkge1xuICAgICAgICAgICAgICAgIGVudHJ5ID0gJyc7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5za2lwUGFja2FnZUpzb24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVzb2x2ZSBvYmplY3QgYnJvd3NlciBmaWVsZCBpbiBwYWNrYWdlLmpzb25cbiAgICAgICAgICAgIGNvbnN0IHsgYnJvd3NlcjogYnJvd3NlckZpZWxkIH0gPSBkYXRhO1xuICAgICAgICAgICAgaWYgKHRhcmdldFdlYiAmJiBvcHRpb25zLmJyb3dzZXJGaWVsZCAmJiBpc09iamVjdCQyKGJyb3dzZXJGaWVsZCkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeSA9IG1hcFdpdGhCcm93c2VyRmllbGQoZW50cnksIGJyb3dzZXJGaWVsZCkgfHwgZW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbnRyeVBvaW50UGF0aCA9IHBhdGgkby5qb2luKGRpciwgZW50cnkpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFbnRyeVBvaW50ID0gdHJ5RnNSZXNvbHZlKGVudHJ5UG9pbnRQYXRoLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZEVudHJ5UG9pbnQpIHtcbiAgICAgICAgICAgICAgICBpc0RlYnVnJDQgJiZcbiAgICAgICAgICAgICAgICAgICAgZGVidWckYyhgW3BhY2thZ2UgZW50cnldICR7cGljb2NvbG9yc0V4cG9ydHMuY3lhbihpZCl9IC0+ICR7cGljb2NvbG9yc0V4cG9ydHMuZGltKHJlc29sdmVkRW50cnlQb2ludCl9YCk7XG4gICAgICAgICAgICAgICAgc2V0UmVzb2x2ZWRDYWNoZSgnLicsIHJlc29sdmVkRW50cnlQb2ludCwgdGFyZ2V0V2ViKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRFbnRyeVBvaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHBhY2thZ2VFbnRyeUZhaWx1cmUoaWQsIGUubWVzc2FnZSk7XG4gICAgfVxuICAgIHBhY2thZ2VFbnRyeUZhaWx1cmUoaWQpO1xufVxuZnVuY3Rpb24gcGFja2FnZUVudHJ5RmFpbHVyZShpZCwgZGV0YWlscykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgZW50cnkgZm9yIHBhY2thZ2UgXCIke2lkfVwiLiBgICtcbiAgICAgICAgYFRoZSBwYWNrYWdlIG1heSBoYXZlIGluY29ycmVjdCBtYWluL21vZHVsZS9leHBvcnRzIHNwZWNpZmllZCBpbiBpdHMgcGFja2FnZS5qc29uYCArXG4gICAgICAgIChkZXRhaWxzID8gJzogJyArIGRldGFpbHMgOiAnLicpKTtcbn1cbmNvbnN0IGNvbmRpdGlvbmFsQ29uZGl0aW9ucyA9IG5ldyBTZXQoWydwcm9kdWN0aW9uJywgJ2RldmVsb3BtZW50JywgJ21vZHVsZSddKTtcbmZ1bmN0aW9uIHJlc29sdmVFeHBvcnRzT3JJbXBvcnRzKHBrZywga2V5LCBvcHRpb25zLCB0YXJnZXRXZWIsIHR5cGUpIHtcbiAgICBjb25zdCBvdmVycmlkZUNvbmRpdGlvbnMgPSBvcHRpb25zLm92ZXJyaWRlQ29uZGl0aW9uc1xuICAgICAgICA/IG5ldyBTZXQob3B0aW9ucy5vdmVycmlkZUNvbmRpdGlvbnMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBbXTtcbiAgICBpZiAoKCFvdmVycmlkZUNvbmRpdGlvbnMgfHwgb3ZlcnJpZGVDb25kaXRpb25zLmhhcygncHJvZHVjdGlvbicpKSAmJlxuICAgICAgICBvcHRpb25zLmlzUHJvZHVjdGlvbikge1xuICAgICAgICBjb25kaXRpb25zLnB1c2goJ3Byb2R1Y3Rpb24nKTtcbiAgICB9XG4gICAgaWYgKCghb3ZlcnJpZGVDb25kaXRpb25zIHx8IG92ZXJyaWRlQ29uZGl0aW9ucy5oYXMoJ2RldmVsb3BtZW50JykpICYmXG4gICAgICAgICFvcHRpb25zLmlzUHJvZHVjdGlvbikge1xuICAgICAgICBjb25kaXRpb25zLnB1c2goJ2RldmVsb3BtZW50Jyk7XG4gICAgfVxuICAgIGlmICgoIW92ZXJyaWRlQ29uZGl0aW9ucyB8fCBvdmVycmlkZUNvbmRpdGlvbnMuaGFzKCdtb2R1bGUnKSkgJiZcbiAgICAgICAgIW9wdGlvbnMuaXNSZXF1aXJlKSB7XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaCgnbW9kdWxlJyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm92ZXJyaWRlQ29uZGl0aW9ucykge1xuICAgICAgICBjb25kaXRpb25zLnB1c2goLi4ub3B0aW9ucy5vdmVycmlkZUNvbmRpdGlvbnMuZmlsdGVyKChjb25kaXRpb24pID0+IGNvbmRpdGlvbmFsQ29uZGl0aW9ucy5oYXMoY29uZGl0aW9uKSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zLmNvbmRpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25kaXRpb25zLnB1c2goLi4ub3B0aW9ucy5jb25kaXRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgZm4gPSB0eXBlID09PSAnaW1wb3J0cycgPyBmIDogbztcbiAgICBjb25zdCByZXN1bHQgPSBmbihwa2csIGtleSwge1xuICAgICAgICBicm93c2VyOiB0YXJnZXRXZWIgJiYgIWNvbmRpdGlvbnMuaW5jbHVkZXMoJ25vZGUnKSxcbiAgICAgICAgcmVxdWlyZTogb3B0aW9ucy5pc1JlcXVpcmUgJiYgIWNvbmRpdGlvbnMuaW5jbHVkZXMoJ2ltcG9ydCcpLFxuICAgICAgICBjb25kaXRpb25zLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQgPyByZXN1bHRbMF0gOiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiByZXNvbHZlRGVlcEltcG9ydChpZCwgeyB3ZWJSZXNvbHZlZEltcG9ydHMsIHNldFJlc29sdmVkQ2FjaGUsIGdldFJlc29sdmVkQ2FjaGUsIGRpciwgZGF0YSwgfSwgdGFyZ2V0V2ViLCBvcHRpb25zKSB7XG4gICAgY29uc3QgY2FjaGUgPSBnZXRSZXNvbHZlZENhY2hlKGlkLCB0YXJnZXRXZWIpO1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuICAgIGxldCByZWxhdGl2ZUlkID0gaWQ7XG4gICAgY29uc3QgeyBleHBvcnRzOiBleHBvcnRzRmllbGQsIGJyb3dzZXI6IGJyb3dzZXJGaWVsZCB9ID0gZGF0YTtcbiAgICAvLyBtYXAgcmVsYXRpdmUgYmFzZWQgb24gZXhwb3J0cyBkYXRhXG4gICAgaWYgKGV4cG9ydHNGaWVsZCkge1xuICAgICAgICBpZiAoaXNPYmplY3QkMihleHBvcnRzRmllbGQpICYmICFBcnJheS5pc0FycmF5KGV4cG9ydHNGaWVsZCkpIHtcbiAgICAgICAgICAgIC8vIHJlc29sdmUgd2l0aG91dCBwb3N0Zml4IChzZWUgIzcwOTgpXG4gICAgICAgICAgICBjb25zdCB7IGZpbGUsIHBvc3RmaXggfSA9IHNwbGl0RmlsZUFuZFBvc3RmaXgocmVsYXRpdmVJZCk7XG4gICAgICAgICAgICBjb25zdCBleHBvcnRzSWQgPSByZXNvbHZlRXhwb3J0c09ySW1wb3J0cyhkYXRhLCBmaWxlLCBvcHRpb25zLCB0YXJnZXRXZWIsICdleHBvcnRzJyk7XG4gICAgICAgICAgICBpZiAoZXhwb3J0c0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZUlkID0gZXhwb3J0c0lkICsgcG9zdGZpeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBub3QgZXhwb3NlZFxuICAgICAgICAgICAgcmVsYXRpdmVJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlbGF0aXZlSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2FnZSBzdWJwYXRoICcke3JlbGF0aXZlSWR9JyBpcyBub3QgZGVmaW5lZCBieSBcImV4cG9ydHNcIiBpbiBgICtcbiAgICAgICAgICAgICAgICBgJHtwYXRoJG8uam9pbihkaXIsICdwYWNrYWdlLmpzb24nKX0uYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodGFyZ2V0V2ViICYmIG9wdGlvbnMuYnJvd3NlckZpZWxkICYmIGlzT2JqZWN0JDIoYnJvd3NlckZpZWxkKSkge1xuICAgICAgICAvLyByZXNvbHZlIHdpdGhvdXQgcG9zdGZpeCAoc2VlICM3MDk4KVxuICAgICAgICBjb25zdCB7IGZpbGUsIHBvc3RmaXggfSA9IHNwbGl0RmlsZUFuZFBvc3RmaXgocmVsYXRpdmVJZCk7XG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IG1hcFdpdGhCcm93c2VyRmllbGQoZmlsZSwgYnJvd3NlckZpZWxkKTtcbiAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgICAgcmVsYXRpdmVJZCA9IG1hcHBlZCArIHBvc3RmaXg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFwcGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuICh3ZWJSZXNvbHZlZEltcG9ydHNbaWRdID0gYnJvd3NlckV4dGVybmFsSWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZWxhdGl2ZUlkKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5RnNSZXNvbHZlKHBhdGgkby5qb2luKGRpciwgcmVsYXRpdmVJZCksIG9wdGlvbnMsICFleHBvcnRzRmllbGQsIC8vIHRyeSBpbmRleCBvbmx5IGlmIG5vIGV4cG9ydHMgZmllbGRcbiAgICAgICAgdGFyZ2V0V2ViKTtcbiAgICAgICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgICAgICBpc0RlYnVnJDQgJiZcbiAgICAgICAgICAgICAgICBkZWJ1ZyRjKGBbbm9kZS9kZWVwLWltcG9ydF0gJHtwaWNvY29sb3JzRXhwb3J0cy5jeWFuKGlkKX0gLT4gJHtwaWNvY29sb3JzRXhwb3J0cy5kaW0ocmVzb2x2ZWQpfWApO1xuICAgICAgICAgICAgc2V0UmVzb2x2ZWRDYWNoZShpZCwgcmVzb2x2ZWQsIHRhcmdldFdlYik7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB0cnlSZXNvbHZlQnJvd3Nlck1hcHBpbmcoaWQsIGltcG9ydGVyLCBvcHRpb25zLCBpc0ZpbGVQYXRoLCBleHRlcm5hbGl6ZSkge1xuICAgIGxldCByZXM7XG4gICAgY29uc3QgcGtnID0gaW1wb3J0ZXIgJiYgKGlkVG9Qa2dNYXAuZ2V0KGltcG9ydGVyKSB8fCByZXNvbHZlUGtnKGltcG9ydGVyLCBvcHRpb25zKSk7XG4gICAgaWYgKHBrZyAmJiBpc09iamVjdCQyKHBrZy5kYXRhLmJyb3dzZXIpKSB7XG4gICAgICAgIGNvbnN0IG1hcElkID0gaXNGaWxlUGF0aCA/ICcuLycgKyBzbGFzaCQxKHBhdGgkby5yZWxhdGl2ZShwa2cuZGlyLCBpZCkpIDogaWQ7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJNYXBwZWRQYXRoID0gbWFwV2l0aEJyb3dzZXJGaWVsZChtYXBJZCwgcGtnLmRhdGEuYnJvd3Nlcik7XG4gICAgICAgIGlmIChicm93c2VyTWFwcGVkUGF0aCkge1xuICAgICAgICAgICAgaWYgKChyZXMgPSBiYXJlSW1wb3J0UkUudGVzdChicm93c2VyTWFwcGVkUGF0aClcbiAgICAgICAgICAgICAgICA/IHRyeU5vZGVSZXNvbHZlKGJyb3dzZXJNYXBwZWRQYXRoLCBpbXBvcnRlciwgb3B0aW9ucywgdHJ1ZSk/LmlkXG4gICAgICAgICAgICAgICAgOiB0cnlGc1Jlc29sdmUocGF0aCRvLmpvaW4ocGtnLmRpciwgYnJvd3Nlck1hcHBlZFBhdGgpLCBvcHRpb25zKSkpIHtcbiAgICAgICAgICAgICAgICBpc0RlYnVnJDQgJiZcbiAgICAgICAgICAgICAgICAgICAgZGVidWckYyhgW2Jyb3dzZXIgbWFwcGVkXSAke3BpY29jb2xvcnNFeHBvcnRzLmN5YW4oaWQpfSAtPiAke3BpY29jb2xvcnNFeHBvcnRzLmRpbShyZXMpfWApO1xuICAgICAgICAgICAgICAgIGlkVG9Qa2dNYXAuc2V0KHJlcywgcGtnKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiByZXMsXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZVNpZGVFZmZlY3RzOiBwa2cuaGFzU2lkZUVmZmVjdHMocmVzKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBleHRlcm5hbGl6ZSA/IHsgLi4ucmVzdWx0LCBleHRlcm5hbDogdHJ1ZSB9IDogcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJyb3dzZXJNYXBwZWRQYXRoID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXJFeHRlcm5hbElkO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBnaXZlbiBhIHJlbGF0aXZlIHBhdGggaW4gcGtnIGRpcixcbiAqIHJldHVybiBhIHJlbGF0aXZlIHBhdGggaW4gcGtnIGRpcixcbiAqIG1hcHBlZCB3aXRoIHRoZSBcIm1hcFwiIG9iamVjdFxuICpcbiAqIC0gUmV0dXJuaW5nIGB1bmRlZmluZWRgIG1lYW5zIHRoZXJlIGlzIG5vIGJyb3dzZXIgbWFwcGluZyBmb3IgdGhpcyBpZFxuICogLSBSZXR1cm5pbmcgYGZhbHNlYCBtZWFucyB0aGlzIGlkIGlzIGV4cGxpY2l0bHkgZXh0ZXJuYWxpemVkIGZvciBicm93c2VyXG4gKi9cbmZ1bmN0aW9uIG1hcFdpdGhCcm93c2VyRmllbGQocmVsYXRpdmVQYXRoSW5Qa2dEaXIsIG1hcCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aCRvLnBvc2l4Lm5vcm1hbGl6ZShyZWxhdGl2ZVBhdGhJblBrZ0Rpcik7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBwYXRoJG8ucG9zaXgubm9ybWFsaXplKGtleSk7XG4gICAgICAgIGlmIChub3JtYWxpemVkUGF0aCA9PT0gbm9ybWFsaXplZEtleSB8fFxuICAgICAgICAgICAgZXF1YWxXaXRob3V0U3VmZml4KG5vcm1hbGl6ZWRQYXRoLCBub3JtYWxpemVkS2V5LCAnLmpzJykgfHxcbiAgICAgICAgICAgIGVxdWFsV2l0aG91dFN1ZmZpeChub3JtYWxpemVkUGF0aCwgbm9ybWFsaXplZEtleSwgJy9pbmRleC5qcycpKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFwW2tleV07XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBlcXVhbFdpdGhvdXRTdWZmaXgocGF0aCwga2V5LCBzdWZmaXgpIHtcbiAgICByZXR1cm4ga2V5LmVuZHNXaXRoKHN1ZmZpeCkgJiYga2V5LnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKSA9PT0gcGF0aDtcbn1cbmZ1bmN0aW9uIGdldFJlYWxQYXRoKHJlc29sdmVkLCBwcmVzZXJ2ZVN5bWxpbmtzKSB7XG4gICAgcmVzb2x2ZWQgPSBlbnN1cmVWb2x1bWVJblBhdGgocmVzb2x2ZWQpO1xuICAgIGlmICghcHJlc2VydmVTeW1saW5rcyAmJiBicm93c2VyRXh0ZXJuYWxJZCAhPT0gcmVzb2x2ZWQpIHtcbiAgICAgICAgcmVzb2x2ZWQgPSBmcyRsLnJlYWxwYXRoU3luYyhyZXNvbHZlZCk7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVQYXRoJDMocmVzb2x2ZWQpO1xufVxuLyoqXG4gKiBpZiBpbXBvcnRlciB3YXMgbm90IHJlc29sdmVkIGJ5IHZpdGUncyByZXNvbHZlciBwcmV2aW91c2x5XG4gKiAod2hlbiBlc2J1aWxkIHJlc29sdmVkIGl0KVxuICogcmVzb2x2ZSBpbXBvcnRlcidzIHBrZyBhbmQgYWRkIHRvIGlkVG9Qa2dNYXBcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVBrZyhpbXBvcnRlciwgb3B0aW9ucykge1xuICAgIGNvbnN0IHsgcm9vdCwgcHJlc2VydmVTeW1saW5rcywgcGFja2FnZUNhY2hlIH0gPSBvcHRpb25zO1xuICAgIGlmIChpbXBvcnRlci5pbmNsdWRlcygnXFx4MDAnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcG9zc2libGVQa2dJZHMgPSBbXTtcbiAgICBmb3IgKGxldCBwcmV2U2xhc2hJbmRleCA9IC0xOzspIHtcbiAgICAgICAgY29uc3Qgc2xhc2hJbmRleCA9IGltcG9ydGVyLmluZGV4T2YoaXNXaW5kb3dzJDQgPyAnXFxcXCcgOiAnLycsIHByZXZTbGFzaEluZGV4KTtcbiAgICAgICAgaWYgKHNsYXNoSW5kZXggPCAwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBwcmV2U2xhc2hJbmRleCA9IHNsYXNoSW5kZXggKyAxO1xuICAgICAgICBjb25zdCBwb3NzaWJsZVBrZ0lkID0gaW1wb3J0ZXIuc2xpY2UoMCwgc2xhc2hJbmRleCk7XG4gICAgICAgIHBvc3NpYmxlUGtnSWRzLnB1c2gocG9zc2libGVQa2dJZCk7XG4gICAgfVxuICAgIGxldCBwa2c7XG4gICAgcG9zc2libGVQa2dJZHMucmV2ZXJzZSgpLmZpbmQoKHBrZ0lkKSA9PiB7XG4gICAgICAgIHBrZyA9IHJlc29sdmVQYWNrYWdlRGF0YShwa2dJZCwgcm9vdCwgcHJlc2VydmVTeW1saW5rcywgcGFja2FnZUNhY2hlKTtcbiAgICAgICAgcmV0dXJuIHBrZztcbiAgICB9KTtcbiAgICBpZiAocGtnKSB7XG4gICAgICAgIGlkVG9Qa2dNYXAuc2V0KGltcG9ydGVyLCBwa2cpO1xuICAgIH1cbiAgICByZXR1cm4gcGtnO1xufVxuXG5jb25zdCBleHRlcm5hbFdpdGhDb252ZXJzaW9uTmFtZXNwYWNlID0gJ3ZpdGU6ZGVwLXByZS1idW5kbGU6ZXh0ZXJuYWwtY29udmVyc2lvbic7XG5jb25zdCBjb252ZXJ0ZWRFeHRlcm5hbFByZWZpeCA9ICd2aXRlLWRlcC1wcmUtYnVuZGxlLWV4dGVybmFsOic7XG5jb25zdCBjanNFeHRlcm5hbEZhY2FkZU5hbWVzcGFjZSA9ICd2aXRlOmNqcy1leHRlcm5hbC1mYWNhZGUnO1xuY29uc3Qgbm9uRmFjYWRlUHJlZml4ID0gJ3ZpdGUtY2pzLWV4dGVybmFsLWZhY2FkZTonO1xuY29uc3QgZXh0ZXJuYWxUeXBlcyA9IFtcbiAgICAnY3NzJyxcbiAgICAvLyBzdXBwb3J0ZWQgcHJlLXByb2Nlc3NvciB0eXBlc1xuICAgICdsZXNzJyxcbiAgICAnc2FzcycsXG4gICAgJ3Njc3MnLFxuICAgICdzdHlsJyxcbiAgICAnc3R5bHVzJyxcbiAgICAncGNzcycsXG4gICAgJ3Bvc3Rjc3MnLFxuICAgIC8vIHdhc21cbiAgICAnd2FzbScsXG4gICAgLy8ga25vd24gU0ZDIHR5cGVzXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ21hcmtvJyxcbiAgICAnYXN0cm8nLFxuICAgICdpbWJhJyxcbiAgICAvLyBKU1gvVFNYIG1heSBiZSBjb25maWd1cmVkIHRvIGJlIGNvbXBpbGVkIGRpZmZlcmVudGx5IGZyb20gaG93IGVzYnVpbGRcbiAgICAvLyBoYW5kbGVzIGl0IGJ5IGRlZmF1bHQsIHNvIGV4Y2x1ZGUgdGhlbSBhcyB3ZWxsXG4gICAgJ2pzeCcsXG4gICAgJ3RzeCcsXG4gICAgLi4uS05PV05fQVNTRVRfVFlQRVMsXG5dO1xuZnVuY3Rpb24gZXNidWlsZERlcFBsdWdpbihxdWFsaWZpZWQsIGV4dGVybmFsLCBjb25maWcsIHNzcikge1xuICAgIGNvbnN0IHsgZXh0ZW5zaW9ucyB9ID0gZ2V0RGVwT3B0aW1pemF0aW9uQ29uZmlnKGNvbmZpZywgc3NyKTtcbiAgICAvLyByZW1vdmUgb3B0aW1pemFibGUgZXh0ZW5zaW9ucyBmcm9tIGBleHRlcm5hbFR5cGVzYCBsaXN0XG4gICAgY29uc3QgYWxsRXh0ZXJuYWxUeXBlcyA9IGV4dGVuc2lvbnNcbiAgICAgICAgPyBleHRlcm5hbFR5cGVzLmZpbHRlcigodHlwZSkgPT4gIWV4dGVuc2lvbnM/LmluY2x1ZGVzKCcuJyArIHR5cGUpKVxuICAgICAgICA6IGV4dGVybmFsVHlwZXM7XG4gICAgLy8gZGVmYXVsdCByZXNvbHZlciB3aGljaCBwcmVmZXJzIEVTTVxuICAgIGNvbnN0IF9yZXNvbHZlID0gY29uZmlnLmNyZWF0ZVJlc29sdmVyKHsgYXNTcmM6IGZhbHNlLCBzY2FuOiB0cnVlIH0pO1xuICAgIC8vIGNqcyByZXNvbHZlciB0aGF0IHByZWZlcnMgTm9kZVxuICAgIGNvbnN0IF9yZXNvbHZlUmVxdWlyZSA9IGNvbmZpZy5jcmVhdGVSZXNvbHZlcih7XG4gICAgICAgIGFzU3JjOiBmYWxzZSxcbiAgICAgICAgaXNSZXF1aXJlOiB0cnVlLFxuICAgICAgICBzY2FuOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc29sdmUgPSAoaWQsIGltcG9ydGVyLCBraW5kLCByZXNvbHZlRGlyKSA9PiB7XG4gICAgICAgIGxldCBfaW1wb3J0ZXI7XG4gICAgICAgIC8vIGV4cGxpY2l0IHJlc29sdmVEaXIgLSB0aGlzIGlzIHBhc3NlZCBvbmx5IGR1cmluZyB5YXJuIHBucCByZXNvbHZlIGZvclxuICAgICAgICAvLyBlbnRyaWVzXG4gICAgICAgIGlmIChyZXNvbHZlRGlyKSB7XG4gICAgICAgICAgICBfaW1wb3J0ZXIgPSBub3JtYWxpemVQYXRoJDMocGF0aCRvLmpvaW4ocmVzb2x2ZURpciwgJyonKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBtYXAgaW1wb3J0ZXIgaWRzIHRvIGZpbGUgcGF0aHMgZm9yIGNvcnJlY3QgcmVzb2x1dGlvblxuICAgICAgICAgICAgX2ltcG9ydGVyID0gaW1wb3J0ZXIgaW4gcXVhbGlmaWVkID8gcXVhbGlmaWVkW2ltcG9ydGVyXSA6IGltcG9ydGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0ga2luZC5zdGFydHNXaXRoKCdyZXF1aXJlJykgPyBfcmVzb2x2ZVJlcXVpcmUgOiBfcmVzb2x2ZTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGlkLCBfaW1wb3J0ZXIsIHVuZGVmaW5lZCwgc3NyKTtcbiAgICB9O1xuICAgIGNvbnN0IHJlc29sdmVSZXN1bHQgPSAoaWQsIHJlc29sdmVkKSA9PiB7XG4gICAgICAgIGlmIChyZXNvbHZlZC5zdGFydHNXaXRoKGJyb3dzZXJFeHRlcm5hbElkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwYXRoOiBpZCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6ICdicm93c2VyLWV4dGVybmFsJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc29sdmVkLnN0YXJ0c1dpdGgob3B0aW9uYWxQZWVyRGVwSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhdGg6IHJlc29sdmVkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogJ29wdGlvbmFsLXBlZXItZGVwJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNzciAmJiBpc0J1aWx0aW4ocmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRXh0ZXJuYWxVcmwocmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhdGg6IHJlc29sdmVkLFxuICAgICAgICAgICAgICAgIGV4dGVybmFsOiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogcGF0aCRvLnJlc29sdmUocmVzb2x2ZWQpLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3ZpdGU6ZGVwLXByZS1idW5kbGUnLFxuICAgICAgICBzZXR1cChidWlsZCkge1xuICAgICAgICAgICAgLy8gZXh0ZXJuYWxpemUgYXNzZXRzIGFuZCBjb21tb25seSBrbm93biBub24tanMgZmlsZSB0eXBlc1xuICAgICAgICAgICAgLy8gU2VlICM4NDU5IGZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhpcyByZXF1aXJlLWltcG9ydCBjb252ZXJzaW9uXG4gICAgICAgICAgICBidWlsZC5vblJlc29sdmUoe1xuICAgICAgICAgICAgICAgIGZpbHRlcjogbmV3IFJlZ0V4cChgXFxcXC4oYCArIGFsbEV4dGVybmFsVHlwZXMuam9pbignfCcpICsgYCkoXFxcXD8uKik/JGApLFxuICAgICAgICAgICAgfSwgYXN5bmMgKHsgcGF0aDogaWQsIGltcG9ydGVyLCBraW5kIH0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcHJlZml4IGV4aXN0LCBpdCBpcyBhbHJlYWR5IGNvbnZlcnRlZCB0byBgaW1wb3J0YCwgc28gc2V0IGBleHRlcm5hbDogdHJ1ZWBcbiAgICAgICAgICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aChjb252ZXJ0ZWRFeHRlcm5hbFByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGlkLnNsaWNlKGNvbnZlcnRlZEV4dGVybmFsUHJlZml4Lmxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlKGlkLCBpbXBvcnRlciwga2luZCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChraW5kID09PSAncmVxdWlyZS1jYWxsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBpdCBpcyBub3Qgc2V0IHRvIGBleHRlcm5hbDogdHJ1ZWAgdG8gY29udmVydCBgcmVxdWlyZWAgdG8gYGltcG9ydGBcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogcmVzb2x2ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBleHRlcm5hbFdpdGhDb252ZXJzaW9uTmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogcmVzb2x2ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogLy4vLCBuYW1lc3BhY2U6IGV4dGVybmFsV2l0aENvbnZlcnNpb25OYW1lc3BhY2UgfSwgKGFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbXBvcnQgaXRzZWxmIHdpdGggcHJlZml4ICh0aGlzIGlzIHRoZSBhY3R1YWwgcGFydCBvZiByZXF1aXJlLWltcG9ydCBjb252ZXJzaW9uKVxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSBgXCIke2NvbnZlcnRlZEV4dGVybmFsUHJlZml4fSR7YXJncy5wYXRofVwiYDtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50czogQ1NTX0xBTkdTX1JFLnRlc3QoYXJncy5wYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgaW1wb3J0ICR7bW9kdWxlUGF0aH07YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJHttb2R1bGVQYXRofTtgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZXhwb3J0ICogZnJvbSAke21vZHVsZVBhdGh9O2AsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmdW5jdGlvbiByZXNvbHZlRW50cnkoaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmbGF0SWQgPSBmbGF0dGVuSWQoaWQpO1xuICAgICAgICAgICAgICAgIGlmIChmbGF0SWQgaW4gcXVhbGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBxdWFsaWZpZWRbZmxhdElkXSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IC9eW1xcd0BdW146XS8gfSwgYXN5bmMgKHsgcGF0aDogaWQsIGltcG9ydGVyLCBraW5kIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlTGlzdENvbnRhaW5zKGV4dGVybmFsLCBpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVuc3VyZSBlc2J1aWxkIHVzZXMgb3VyIHJlc29sdmVkIGVudHJpZXNcbiAgICAgICAgICAgICAgICBsZXQgZW50cnk7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBlbnRyeSwgcmV0dXJuIGVudHJ5IG5hbWVzcGFjZSByZXNvbHZlIHJlc3VsdFxuICAgICAgICAgICAgICAgIGlmICghaW1wb3J0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChlbnRyeSA9IHJlc29sdmVFbnRyeShpZCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIGFsaWFzZWQgdG8gYW4gZW50cnkgLSBhbHNvIHJldHVybiBlbnRyeSBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxpYXNlZCA9IGF3YWl0IF9yZXNvbHZlKGlkLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxpYXNlZCAmJiAoZW50cnkgPSByZXNvbHZlRW50cnkoYWxpYXNlZCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdXNlIHZpdGUncyBvd24gcmVzb2x2ZXJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmUoaWQsIGltcG9ydGVyLCBraW5kKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVSZXN1bHQoaWQsIHJlc29sdmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogLy4qLywgbmFtZXNwYWNlOiAnYnJvd3Nlci1leHRlcm5hbCcgfSwgKHsgcGF0aCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5pc1Byb2R1Y3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiAnbW9kdWxlLmV4cG9ydHMgPSB7fScsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGluIENKUyB0byBpbnRlcmNlcHQgbmFtZWQgaW1wb3J0cy4gVXNlIGBPYmplY3QuY3JlYXRlYCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBQcm94eSBpbiB0aGUgcHJvdG90eXBlIHRvIHdvcmthcm91bmQgZXNidWlsZCBpc3N1ZS4gV2h5P1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHNob3J0LCBlc2J1aWxkIGNqcy0+ZXNtIGZsb3c6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBDcmVhdGUgZW1wdHkgb2JqZWN0IHVzaW5nIGBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihtb2R1bGUuZXhwb3J0cykpYC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIEFzc2lnbiBwcm9wcyBvZiBgbW9kdWxlLmV4cG9ydHNgIHRvIHRoZSBvYmplY3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiBSZXR1cm4gb2JqZWN0IGZvciBFU00gdXNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvIGBtb2R1bGUuZXhwb3J0cyA9IG5ldyBQcm94eSh7fSwge30pYCwgc3RlcCAxIHJldHVybnMgZW1wdHkgb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCAyIGRvZXMgbm90aGluZyBhcyB0aGVyZSdzIG5vIHByb3BzIGZvciBgbW9kdWxlLmV4cG9ydHNgLiBUaGUgZmluYWwgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBqdXN0IGFuIGVtcHR5IG9iamVjdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGluZyB0aGUgUHJveHkgaW4gdGhlIHByb3RvdHlwZSBzYXRpc2ZpZXMgc3RlcCAxIGltbWVkaWF0ZWx5LCB3aGljaCBtZWFuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJldHVybmVkIG9iamVjdCBpcyBhIFByb3h5IHRoYXQgd2UgY2FuIGludGVyY2VwdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBTa2lwIGtleXMgdGhhdCBhcmUgYWNjZXNzZWQgYnkgZXNidWlsZCBhbmQgYnJvd3NlciBkZXZ0b29scy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBgXFxcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZShuZXcgUHJveHkoe30sIHtcbiAgZ2V0KF8sIGtleSkge1xuICAgIGlmIChcbiAgICAgIGtleSAhPT0gJ19fZXNNb2R1bGUnICYmXG4gICAgICBrZXkgIT09ICdfX3Byb3RvX18nICYmXG4gICAgICBrZXkgIT09ICdjb25zdHJ1Y3RvcicgJiZcbiAgICAgIGtleSAhPT0gJ3NwbGljZSdcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2FybihcXGBNb2R1bGUgXCIke3BhdGh9XCIgaGFzIGJlZW4gZXh0ZXJuYWxpemVkIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHkuIENhbm5vdCBhY2Nlc3MgXCIke3BhdGh9LlxcJHtrZXl9XCIgaW4gY2xpZW50IGNvZGUuIFNlZSBodHRwOi8vdml0ZWpzLmRldi9ndWlkZS90cm91Ymxlc2hvb3RpbmcuaHRtbCNtb2R1bGUtZXh0ZXJuYWxpemVkLWZvci1icm93c2VyLWNvbXBhdGliaWxpdHkgZm9yIG1vcmUgZGV0YWlscy5cXGApXG4gICAgfVxuICB9XG59KSlgLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvLiovLCBuYW1lc3BhY2U6ICdvcHRpb25hbC1wZWVyLWRlcCcgfSwgKHsgcGF0aCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5pc1Byb2R1Y3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiAnbW9kdWxlLmV4cG9ydHMgPSB7fScsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbLCBwZWVyRGVwLCBwYXJlbnREZXBdID0gcGF0aC5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHM6IGB0aHJvdyBuZXcgRXJyb3IoXFxgQ291bGQgbm90IHJlc29sdmUgXCIke3BlZXJEZXB9XCIgaW1wb3J0ZWQgYnkgXCIke3BhcmVudERlcH1cIi4gSXMgaXQgaW5zdGFsbGVkP1xcYClgLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH07XG59XG4vLyBlc2J1aWxkIGRvZXNuJ3QgdHJhbnNwaWxlIGByZXF1aXJlKCdmb28nKWAgaW50byBgaW1wb3J0YCBzdGF0ZW1lbnRzIGlmICdmb28nIGlzIGV4dGVybmFsaXplZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2V2YW53L2VzYnVpbGQvaXNzdWVzLzU2NiNpc3N1ZWNvbW1lbnQtNzM1NTUxODM0XG5mdW5jdGlvbiBlc2J1aWxkQ2pzRXh0ZXJuYWxQbHVnaW4oZXh0ZXJuYWxzLCBwbGF0Zm9ybSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICdjanMtZXh0ZXJuYWwnLFxuICAgICAgICBzZXR1cChidWlsZCkge1xuICAgICAgICAgICAgY29uc3QgZXNjYXBlID0gKHRleHQpID0+IGBeJHt0ZXh0LnJlcGxhY2UoL1stL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKX0kYDtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IG5ldyBSZWdFeHAoZXh0ZXJuYWxzLm1hcChlc2NhcGUpLmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IG5ldyBSZWdFeHAoYF4ke25vbkZhY2FkZVByZWZpeH1gKSB9LCAoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGFyZ3MucGF0aC5zbGljZShub25GYWNhZGVQcmVmaXgubGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyIH0sIChhcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gcHJlc2VydmUgYHJlcXVpcmVgIGZvciBub2RlIGJlY2F1c2UgaXQncyBtb3JlIGFjY3VyYXRlIHRoYW4gY29udmVydGluZyBpdCB0byBpbXBvcnRcbiAgICAgICAgICAgICAgICBpZiAoYXJncy5raW5kID09PSAncmVxdWlyZS1jYWxsJyAmJiBwbGF0Zm9ybSAhPT0gJ25vZGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBhcmdzLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IGNqc0V4dGVybmFsRmFjYWRlTmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiBhcmdzLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVybmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogLy4qLywgbmFtZXNwYWNlOiBjanNFeHRlcm5hbEZhY2FkZU5hbWVzcGFjZSB9LCAoYXJncykgPT4gKHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogYGltcG9ydCAqIGFzIG0gZnJvbSAke0pTT04uc3RyaW5naWZ5KG5vbkZhY2FkZVByZWZpeCArIGFyZ3MucGF0aCl9O2AgKyBgbW9kdWxlLmV4cG9ydHMgPSBtO2AsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxudmFyIHRhc2tzID0ge307XG5cbnZhciB1dGlscyRnID0ge307XG5cbnZhciBhcnJheSQxID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcnJheSQxLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuYXJyYXkkMS5zcGxpdFdoZW4gPSBhcnJheSQxLmZsYXR0ZW4gPSB2b2lkIDA7XHJcbmZ1bmN0aW9uIGZsYXR0ZW4kMShpdGVtcykge1xyXG4gICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoY29sbGVjdGlvbiwgaXRlbSkgPT4gW10uY29uY2F0KGNvbGxlY3Rpb24sIGl0ZW0pLCBbXSk7XHJcbn1cclxuYXJyYXkkMS5mbGF0dGVuID0gZmxhdHRlbiQxO1xyXG5mdW5jdGlvbiBzcGxpdFdoZW4oaXRlbXMsIHByZWRpY2F0ZSkge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gW1tdXTtcclxuICAgIGxldCBncm91cEluZGV4ID0gMDtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICAgIGlmIChwcmVkaWNhdGUoaXRlbSkpIHtcclxuICAgICAgICAgICAgZ3JvdXBJbmRleCsrO1xyXG4gICAgICAgICAgICByZXN1bHRbZ3JvdXBJbmRleF0gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtncm91cEluZGV4XS5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuYXJyYXkkMS5zcGxpdFdoZW4gPSBzcGxpdFdoZW47XG5cbnZhciBlcnJubyQxID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJubyQxLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuZXJybm8kMS5pc0Vub2VudENvZGVFcnJvciA9IHZvaWQgMDtcclxuZnVuY3Rpb24gaXNFbm9lbnRDb2RlRXJyb3IoZXJyb3IpIHtcclxuICAgIHJldHVybiBlcnJvci5jb2RlID09PSAnRU5PRU5UJztcclxufVxyXG5lcnJubyQxLmlzRW5vZW50Q29kZUVycm9yID0gaXNFbm9lbnRDb2RlRXJyb3I7XG5cbnZhciBmcyRoID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcyRoLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuZnMkaC5jcmVhdGVEaXJlbnRGcm9tU3RhdHMgPSB2b2lkIDA7XHJcbmxldCBEaXJlbnRGcm9tU3RhdHMkMSA9IGNsYXNzIERpcmVudEZyb21TdGF0cyB7XHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBzdGF0cykge1xyXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5pc0Jsb2NrRGV2aWNlID0gc3RhdHMuaXNCbG9ja0RldmljZS5iaW5kKHN0YXRzKTtcclxuICAgICAgICB0aGlzLmlzQ2hhcmFjdGVyRGV2aWNlID0gc3RhdHMuaXNDaGFyYWN0ZXJEZXZpY2UuYmluZChzdGF0cyk7XHJcbiAgICAgICAgdGhpcy5pc0RpcmVjdG9yeSA9IHN0YXRzLmlzRGlyZWN0b3J5LmJpbmQoc3RhdHMpO1xyXG4gICAgICAgIHRoaXMuaXNGSUZPID0gc3RhdHMuaXNGSUZPLmJpbmQoc3RhdHMpO1xyXG4gICAgICAgIHRoaXMuaXNGaWxlID0gc3RhdHMuaXNGaWxlLmJpbmQoc3RhdHMpO1xyXG4gICAgICAgIHRoaXMuaXNTb2NrZXQgPSBzdGF0cy5pc1NvY2tldC5iaW5kKHN0YXRzKTtcclxuICAgICAgICB0aGlzLmlzU3ltYm9saWNMaW5rID0gc3RhdHMuaXNTeW1ib2xpY0xpbmsuYmluZChzdGF0cyk7XHJcbiAgICB9XHJcbn07XHJcbmZ1bmN0aW9uIGNyZWF0ZURpcmVudEZyb21TdGF0cyQxKG5hbWUsIHN0YXRzKSB7XHJcbiAgICByZXR1cm4gbmV3IERpcmVudEZyb21TdGF0cyQxKG5hbWUsIHN0YXRzKTtcclxufVxyXG5mcyRoLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IGNyZWF0ZURpcmVudEZyb21TdGF0cyQxO1xuXG52YXIgcGF0aCRoID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXRoJGgsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5wYXRoJGgucmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQgPSBwYXRoJGguZXNjYXBlID0gcGF0aCRoLm1ha2VBYnNvbHV0ZSA9IHBhdGgkaC51bml4aWZ5ID0gdm9pZCAwO1xyXG5jb25zdCBwYXRoJGcgPSByZXF1aXJlJCQwJDQ7XHJcbmNvbnN0IExFQURJTkdfRE9UX1NFR01FTlRfQ0hBUkFDVEVSU19DT1VOVCA9IDI7IC8vIC4vIG9yIC5cXFxcXHJcbmNvbnN0IFVORVNDQVBFRF9HTE9CX1NZTUJPTFNfUkUgPSAvKFxcXFw/KShbKCkqP1tcXF17fH1dfF4hfFshK0BdKD89XFwoKSkvZztcclxuLyoqXHJcbiAqIERlc2lnbmVkIHRvIHdvcmsgb25seSB3aXRoIHNpbXBsZSBwYXRoczogYGRpclxcXFxmaWxlYC5cclxuICovXHJcbmZ1bmN0aW9uIHVuaXhpZnkoZmlsZXBhdGgpIHtcclxuICAgIHJldHVybiBmaWxlcGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XHJcbn1cclxucGF0aCRoLnVuaXhpZnkgPSB1bml4aWZ5O1xyXG5mdW5jdGlvbiBtYWtlQWJzb2x1dGUoY3dkLCBmaWxlcGF0aCkge1xyXG4gICAgcmV0dXJuIHBhdGgkZy5yZXNvbHZlKGN3ZCwgZmlsZXBhdGgpO1xyXG59XHJcbnBhdGgkaC5tYWtlQWJzb2x1dGUgPSBtYWtlQWJzb2x1dGU7XHJcbmZ1bmN0aW9uIGVzY2FwZSQyKHBhdHRlcm4pIHtcclxuICAgIHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoVU5FU0NBUEVEX0dMT0JfU1lNQk9MU19SRSwgJ1xcXFwkMicpO1xyXG59XHJcbnBhdGgkaC5lc2NhcGUgPSBlc2NhcGUkMjtcclxuZnVuY3Rpb24gcmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQoZW50cnkpIHtcclxuICAgIC8vIFdlIGRvIG5vdCB1c2UgYHN0YXJ0c1dpdGhgIGJlY2F1c2UgdGhpcyBpcyAxMHggc2xvd2VyIHRoYW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbiBmb3Igc29tZSBjYXNlcy5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXN0cmluZy1zdGFydHMtZW5kcy13aXRoXHJcbiAgICBpZiAoZW50cnkuY2hhckF0KDApID09PSAnLicpIHtcclxuICAgICAgICBjb25zdCBzZWNvbmRDaGFyYWN0ZXJ5ID0gZW50cnkuY2hhckF0KDEpO1xyXG4gICAgICAgIGlmIChzZWNvbmRDaGFyYWN0ZXJ5ID09PSAnLycgfHwgc2Vjb25kQ2hhcmFjdGVyeSA9PT0gJ1xcXFwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS5zbGljZShMRUFESU5HX0RPVF9TRUdNRU5UX0NIQVJBQ1RFUlNfQ09VTlQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBlbnRyeTtcclxufVxyXG5wYXRoJGgucmVtb3ZlTGVhZGluZ0RvdFNlZ21lbnQgPSByZW1vdmVMZWFkaW5nRG90U2VnbWVudDtcblxudmFyIHBhdHRlcm4kMSA9IHt9O1xuXG4vKiFcbiAqIGlzLWV4dGdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLWV4dGdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbnZhciBpc0V4dGdsb2IkMSA9IGZ1bmN0aW9uIGlzRXh0Z2xvYihzdHIpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnIHx8IHN0ciA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgbWF0Y2g7XG4gIHdoaWxlICgobWF0Y2ggPSAvKFxcXFwpLnwoW0A/ISsqXVxcKC4qXFwpKS9nLmV4ZWMoc3RyKSkpIHtcbiAgICBpZiAobWF0Y2hbMl0pIHJldHVybiB0cnVlO1xuICAgIHN0ciA9IHN0ci5zbGljZShtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKiFcbiAqIGlzLWdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLWdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbnZhciBpc0V4dGdsb2IgPSBpc0V4dGdsb2IkMTtcbnZhciBjaGFycyA9IHsgJ3snOiAnfScsICcoJzogJyknLCAnWyc6ICddJ307XG52YXIgc3RyaWN0Q2hlY2sgPSBmdW5jdGlvbihzdHIpIHtcbiAgaWYgKHN0clswXSA9PT0gJyEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHBpcGVJbmRleCA9IC0yO1xuICB2YXIgY2xvc2VTcXVhcmVJbmRleCA9IC0yO1xuICB2YXIgY2xvc2VDdXJseUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZVBhcmVuSW5kZXggPSAtMjtcbiAgdmFyIGJhY2tTbGFzaEluZGV4ID0gLTI7XG4gIHdoaWxlIChpbmRleCA8IHN0ci5sZW5ndGgpIHtcbiAgICBpZiAoc3RyW2luZGV4XSA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RyW2luZGV4ICsgMV0gPT09ICc/JyAmJiAvW1xcXS4rKV0vLnRlc3Qoc3RyW2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChjbG9zZVNxdWFyZUluZGV4ICE9PSAtMSAmJiBzdHJbaW5kZXhdID09PSAnWycgJiYgc3RyW2luZGV4ICsgMV0gIT09ICddJykge1xuICAgICAgaWYgKGNsb3NlU3F1YXJlSW5kZXggPCBpbmRleCkge1xuICAgICAgICBjbG9zZVNxdWFyZUluZGV4ID0gc3RyLmluZGV4T2YoJ10nLCBpbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAoY2xvc2VTcXVhcmVJbmRleCA+IGluZGV4KSB7XG4gICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZVNxdWFyZUluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYmFja1NsYXNoSW5kZXggPSBzdHIuaW5kZXhPZignXFxcXCcsIGluZGV4KTtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlU3F1YXJlSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbG9zZUN1cmx5SW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICd7JyAmJiBzdHJbaW5kZXggKyAxXSAhPT0gJ30nKSB7XG4gICAgICBjbG9zZUN1cmx5SW5kZXggPSBzdHIuaW5kZXhPZignfScsIGluZGV4KTtcbiAgICAgIGlmIChjbG9zZUN1cmx5SW5kZXggPiBpbmRleCkge1xuICAgICAgICBiYWNrU2xhc2hJbmRleCA9IHN0ci5pbmRleE9mKCdcXFxcJywgaW5kZXgpO1xuICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VDdXJseUluZGV4KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xvc2VQYXJlbkluZGV4ICE9PSAtMSAmJiBzdHJbaW5kZXhdID09PSAnKCcgJiYgc3RyW2luZGV4ICsgMV0gPT09ICc/JyAmJiAvWzohPV0vLnRlc3Qoc3RyW2luZGV4ICsgMl0pICYmIHN0cltpbmRleCArIDNdICE9PSAnKScpIHtcbiAgICAgIGNsb3NlUGFyZW5JbmRleCA9IHN0ci5pbmRleE9mKCcpJywgaW5kZXgpO1xuICAgICAgaWYgKGNsb3NlUGFyZW5JbmRleCA+IGluZGV4KSB7XG4gICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBpbmRleCk7XG4gICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZVBhcmVuSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwaXBlSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICcoJyAmJiBzdHJbaW5kZXggKyAxXSAhPT0gJ3wnKSB7XG4gICAgICBpZiAocGlwZUluZGV4IDwgaW5kZXgpIHtcbiAgICAgICAgcGlwZUluZGV4ID0gc3RyLmluZGV4T2YoJ3wnLCBpbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAocGlwZUluZGV4ICE9PSAtMSAmJiBzdHJbcGlwZUluZGV4ICsgMV0gIT09ICcpJykge1xuICAgICAgICBjbG9zZVBhcmVuSW5kZXggPSBzdHIuaW5kZXhPZignKScsIHBpcGVJbmRleCk7XG4gICAgICAgIGlmIChjbG9zZVBhcmVuSW5kZXggPiBwaXBlSW5kZXgpIHtcbiAgICAgICAgICBiYWNrU2xhc2hJbmRleCA9IHN0ci5pbmRleE9mKCdcXFxcJywgcGlwZUluZGV4KTtcbiAgICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VQYXJlbkluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RyW2luZGV4XSA9PT0gJ1xcXFwnKSB7XG4gICAgICB2YXIgb3BlbiA9IHN0cltpbmRleCArIDFdO1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIHZhciBjbG9zZSA9IGNoYXJzW29wZW5dO1xuXG4gICAgICBpZiAoY2xvc2UpIHtcbiAgICAgICAgdmFyIG4gPSBzdHIuaW5kZXhPZihjbG9zZSwgaW5kZXgpO1xuICAgICAgICBpZiAobiAhPT0gLTEpIHtcbiAgICAgICAgICBpbmRleCA9IG4gKyAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJbaW5kZXhdID09PSAnIScpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbnZhciByZWxheGVkQ2hlY2sgPSBmdW5jdGlvbihzdHIpIHtcbiAgaWYgKHN0clswXSA9PT0gJyEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIGlmICgvWyo/e30oKVtcXF1dLy50ZXN0KHN0cltpbmRleF0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RyW2luZGV4XSA9PT0gJ1xcXFwnKSB7XG4gICAgICB2YXIgb3BlbiA9IHN0cltpbmRleCArIDFdO1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIHZhciBjbG9zZSA9IGNoYXJzW29wZW5dO1xuXG4gICAgICBpZiAoY2xvc2UpIHtcbiAgICAgICAgdmFyIG4gPSBzdHIuaW5kZXhPZihjbG9zZSwgaW5kZXgpO1xuICAgICAgICBpZiAobiAhPT0gLTEpIHtcbiAgICAgICAgICBpbmRleCA9IG4gKyAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJbaW5kZXhdID09PSAnIScpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbnZhciBpc0dsb2IkMiA9IGZ1bmN0aW9uIGlzR2xvYihzdHIsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnIHx8IHN0ciA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNFeHRnbG9iKHN0cikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBjaGVjayA9IHN0cmljdENoZWNrO1xuXG4gIC8vIG9wdGlvbmFsbHkgcmVsYXggY2hlY2tcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QgPT09IGZhbHNlKSB7XG4gICAgY2hlY2sgPSByZWxheGVkQ2hlY2s7XG4gIH1cblxuICByZXR1cm4gY2hlY2soc3RyKTtcbn07XG5cbnZhciBpc0dsb2IkMSA9IGlzR2xvYiQyO1xudmFyIHBhdGhQb3NpeERpcm5hbWUgPSByZXF1aXJlJCQwJDQucG9zaXguZGlybmFtZTtcbnZhciBpc1dpbjMyID0gcmVxdWlyZSQkMi5wbGF0Zm9ybSgpID09PSAnd2luMzInO1xuXG52YXIgc2xhc2ggPSAnLyc7XG52YXIgYmFja3NsYXNoID0gL1xcXFwvZztcbnZhciBlbmNsb3N1cmUgPSAvW1xce1xcW10uKltcXH1cXF1dJC87XG52YXIgZ2xvYmJ5ID0gLyhefFteXFxcXF0pKFtcXHtcXFtdfFxcKFteXFwpXSskKS87XG52YXIgZXNjYXBlZCA9IC9cXFxcKFtcXCFcXCpcXD9cXHxcXFtcXF1cXChcXClcXHtcXH1dKS9nO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmZsaXBCYWNrc2xhc2hlcz10cnVlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xudmFyIGdsb2JQYXJlbnQkMiA9IGZ1bmN0aW9uIGdsb2JQYXJlbnQoc3RyLCBvcHRzKSB7XG4gIHZhciBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IGZsaXBCYWNrc2xhc2hlczogdHJ1ZSB9LCBvcHRzKTtcblxuICAvLyBmbGlwIHdpbmRvd3MgcGF0aCBzZXBhcmF0b3JzXG4gIGlmIChvcHRpb25zLmZsaXBCYWNrc2xhc2hlcyAmJiBpc1dpbjMyICYmIHN0ci5pbmRleE9mKHNsYXNoKSA8IDApIHtcbiAgICBzdHIgPSBzdHIucmVwbGFjZShiYWNrc2xhc2gsIHNsYXNoKTtcbiAgfVxuXG4gIC8vIHNwZWNpYWwgY2FzZSBmb3Igc3RyaW5ncyBlbmRpbmcgaW4gZW5jbG9zdXJlIGNvbnRhaW5pbmcgcGF0aCBzZXBhcmF0b3JcbiAgaWYgKGVuY2xvc3VyZS50ZXN0KHN0cikpIHtcbiAgICBzdHIgKz0gc2xhc2g7XG4gIH1cblxuICAvLyBwcmVzZXJ2ZXMgZnVsbCBwYXRoIGluIGNhc2Ugb2YgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3JcbiAgc3RyICs9ICdhJztcblxuICAvLyByZW1vdmUgcGF0aCBwYXJ0cyB0aGF0IGFyZSBnbG9iYnlcbiAgZG8ge1xuICAgIHN0ciA9IHBhdGhQb3NpeERpcm5hbWUoc3RyKTtcbiAgfSB3aGlsZSAoaXNHbG9iJDEoc3RyKSB8fCBnbG9iYnkudGVzdChzdHIpKTtcblxuICAvLyByZW1vdmUgZXNjYXBlIGNoYXJzIGFuZCByZXR1cm4gcmVzdWx0XG4gIHJldHVybiBzdHIucmVwbGFjZShlc2NhcGVkLCAnJDEnKTtcbn07XG5cbnZhciB1dGlscyRmID0ge307XG5cbihmdW5jdGlvbiAoZXhwb3J0cykge1xuXG5cdGV4cG9ydHMuaXNJbnRlZ2VyID0gbnVtID0+IHtcblx0ICBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcblx0ICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG51bSk7XG5cdCAgfVxuXHQgIGlmICh0eXBlb2YgbnVtID09PSAnc3RyaW5nJyAmJiBudW0udHJpbSgpICE9PSAnJykge1xuXHQgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoTnVtYmVyKG51bSkpO1xuXHQgIH1cblx0ICByZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0LyoqXG5cdCAqIEZpbmQgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlXG5cdCAqL1xuXG5cdGV4cG9ydHMuZmluZCA9IChub2RlLCB0eXBlKSA9PiBub2RlLm5vZGVzLmZpbmQobm9kZSA9PiBub2RlLnR5cGUgPT09IHR5cGUpO1xuXG5cdC8qKlxuXHQgKiBGaW5kIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuXHQgKi9cblxuXHRleHBvcnRzLmV4Y2VlZHNMaW1pdCA9IChtaW4sIG1heCwgc3RlcCA9IDEsIGxpbWl0KSA9PiB7XG5cdCAgaWYgKGxpbWl0ID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuXHQgIGlmICghZXhwb3J0cy5pc0ludGVnZXIobWluKSB8fCAhZXhwb3J0cy5pc0ludGVnZXIobWF4KSkgcmV0dXJuIGZhbHNlO1xuXHQgIHJldHVybiAoKE51bWJlcihtYXgpIC0gTnVtYmVyKG1pbikpIC8gTnVtYmVyKHN0ZXApKSA+PSBsaW1pdDtcblx0fTtcblxuXHQvKipcblx0ICogRXNjYXBlIHRoZSBnaXZlbiBub2RlIHdpdGggJ1xcXFwnIGJlZm9yZSBub2RlLnZhbHVlXG5cdCAqL1xuXG5cdGV4cG9ydHMuZXNjYXBlTm9kZSA9IChibG9jaywgbiA9IDAsIHR5cGUpID0+IHtcblx0ICBsZXQgbm9kZSA9IGJsb2NrLm5vZGVzW25dO1xuXHQgIGlmICghbm9kZSkgcmV0dXJuO1xuXG5cdCAgaWYgKCh0eXBlICYmIG5vZGUudHlwZSA9PT0gdHlwZSkgfHwgbm9kZS50eXBlID09PSAnb3BlbicgfHwgbm9kZS50eXBlID09PSAnY2xvc2UnKSB7XG5cdCAgICBpZiAobm9kZS5lc2NhcGVkICE9PSB0cnVlKSB7XG5cdCAgICAgIG5vZGUudmFsdWUgPSAnXFxcXCcgKyBub2RlLnZhbHVlO1xuXHQgICAgICBub2RlLmVzY2FwZWQgPSB0cnVlO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBicmFjZSBub2RlIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBsaXRlcmFsIGJyYWNlc1xuXHQgKi9cblxuXHRleHBvcnRzLmVuY2xvc2VCcmFjZSA9IG5vZGUgPT4ge1xuXHQgIGlmIChub2RlLnR5cGUgIT09ICdicmFjZScpIHJldHVybiBmYWxzZTtcblx0ICBpZiAoKG5vZGUuY29tbWFzID4+IDAgKyBub2RlLnJhbmdlcyA+PiAwKSA9PT0gMCkge1xuXHQgICAgbm9kZS5pbnZhbGlkID0gdHJ1ZTtcblx0ICAgIHJldHVybiB0cnVlO1xuXHQgIH1cblx0ICByZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdHJ1ZSBpZiBhIGJyYWNlIG5vZGUgaXMgaW52YWxpZC5cblx0ICovXG5cblx0ZXhwb3J0cy5pc0ludmFsaWRCcmFjZSA9IGJsb2NrID0+IHtcblx0ICBpZiAoYmxvY2sudHlwZSAhPT0gJ2JyYWNlJykgcmV0dXJuIGZhbHNlO1xuXHQgIGlmIChibG9jay5pbnZhbGlkID09PSB0cnVlIHx8IGJsb2NrLmRvbGxhcikgcmV0dXJuIHRydWU7XG5cdCAgaWYgKChibG9jay5jb21tYXMgPj4gMCArIGJsb2NrLnJhbmdlcyA+PiAwKSA9PT0gMCkge1xuXHQgICAgYmxvY2suaW52YWxpZCA9IHRydWU7XG5cdCAgICByZXR1cm4gdHJ1ZTtcblx0ICB9XG5cdCAgaWYgKGJsb2NrLm9wZW4gIT09IHRydWUgfHwgYmxvY2suY2xvc2UgIT09IHRydWUpIHtcblx0ICAgIGJsb2NrLmludmFsaWQgPSB0cnVlO1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXHQgIHJldHVybiBmYWxzZTtcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJucyB0cnVlIGlmIGEgbm9kZSBpcyBhbiBvcGVuIG9yIGNsb3NlIG5vZGVcblx0ICovXG5cblx0ZXhwb3J0cy5pc09wZW5PckNsb3NlID0gbm9kZSA9PiB7XG5cdCAgaWYgKG5vZGUudHlwZSA9PT0gJ29wZW4nIHx8IG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykge1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXHQgIHJldHVybiBub2RlLm9wZW4gPT09IHRydWUgfHwgbm9kZS5jbG9zZSA9PT0gdHJ1ZTtcblx0fTtcblxuXHQvKipcblx0ICogUmVkdWNlIGFuIGFycmF5IG9mIHRleHQgbm9kZXMuXG5cdCAqL1xuXG5cdGV4cG9ydHMucmVkdWNlID0gbm9kZXMgPT4gbm9kZXMucmVkdWNlKChhY2MsIG5vZGUpID0+IHtcblx0ICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIGFjYy5wdXNoKG5vZGUudmFsdWUpO1xuXHQgIGlmIChub2RlLnR5cGUgPT09ICdyYW5nZScpIG5vZGUudHlwZSA9ICd0ZXh0Jztcblx0ICByZXR1cm4gYWNjO1xuXHR9LCBbXSk7XG5cblx0LyoqXG5cdCAqIEZsYXR0ZW4gYW4gYXJyYXlcblx0ICovXG5cblx0ZXhwb3J0cy5mbGF0dGVuID0gKC4uLmFyZ3MpID0+IHtcblx0ICBjb25zdCByZXN1bHQgPSBbXTtcblx0ICBjb25zdCBmbGF0ID0gYXJyID0+IHtcblx0ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgIGxldCBlbGUgPSBhcnJbaV07XG5cdCAgICAgIEFycmF5LmlzQXJyYXkoZWxlKSA/IGZsYXQoZWxlKSA6IGVsZSAhPT0gdm9pZCAwICYmIHJlc3VsdC5wdXNoKGVsZSk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcmVzdWx0O1xuXHQgIH07XG5cdCAgZmxhdChhcmdzKTtcblx0ICByZXR1cm4gcmVzdWx0O1xuXHR9O1xufSAodXRpbHMkZikpO1xuXG5jb25zdCB1dGlscyRlID0gdXRpbHMkZjtcblxudmFyIHN0cmluZ2lmeSQ3ID0gKGFzdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCBzdHJpbmdpZnkgPSAobm9kZSwgcGFyZW50ID0ge30pID0+IHtcbiAgICBsZXQgaW52YWxpZEJsb2NrID0gb3B0aW9ucy5lc2NhcGVJbnZhbGlkICYmIHV0aWxzJGUuaXNJbnZhbGlkQnJhY2UocGFyZW50KTtcbiAgICBsZXQgaW52YWxpZE5vZGUgPSBub2RlLmludmFsaWQgPT09IHRydWUgJiYgb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlO1xuICAgIGxldCBvdXRwdXQgPSAnJztcblxuICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICBpZiAoKGludmFsaWRCbG9jayB8fCBpbnZhbGlkTm9kZSkgJiYgdXRpbHMkZS5pc09wZW5PckNsb3NlKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiAnXFxcXCcgKyBub2RlLnZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzKSB7XG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBub2RlLm5vZGVzKSB7XG4gICAgICAgIG91dHB1dCArPSBzdHJpbmdpZnkoY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIHJldHVybiBzdHJpbmdpZnkoYXN0KTtcbn07XG5cbi8qIVxuICogaXMtbnVtYmVyIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1udW1iZXI+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbnZhciBpc051bWJlciQyID0gZnVuY3Rpb24obnVtKSB7XG4gIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBudW0gLSBudW0gPT09IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBudW0gPT09ICdzdHJpbmcnICYmIG51bS50cmltKCkgIT09ICcnKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSA/IE51bWJlci5pc0Zpbml0ZSgrbnVtKSA6IGlzRmluaXRlKCtudW0pO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qIVxuICogdG8tcmVnZXgtcmFuZ2UgPGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb21hdGNoL3RvLXJlZ2V4LXJhbmdlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG5jb25zdCBpc051bWJlciQxID0gaXNOdW1iZXIkMjtcblxuY29uc3QgdG9SZWdleFJhbmdlJDEgPSAobWluLCBtYXgsIG9wdGlvbnMpID0+IHtcbiAgaWYgKGlzTnVtYmVyJDEobWluKSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0b1JlZ2V4UmFuZ2U6IGV4cGVjdGVkIHRoZSBmaXJzdCBhcmd1bWVudCB0byBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgaWYgKG1heCA9PT0gdm9pZCAwIHx8IG1pbiA9PT0gbWF4KSB7XG4gICAgcmV0dXJuIFN0cmluZyhtaW4pO1xuICB9XG5cbiAgaWYgKGlzTnVtYmVyJDEobWF4KSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0b1JlZ2V4UmFuZ2U6IGV4cGVjdGVkIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBudW1iZXIuJyk7XG4gIH1cblxuICBsZXQgb3B0cyA9IHsgcmVsYXhaZXJvczogdHJ1ZSwgLi4ub3B0aW9ucyB9O1xuICBpZiAodHlwZW9mIG9wdHMuc3RyaWN0WmVyb3MgPT09ICdib29sZWFuJykge1xuICAgIG9wdHMucmVsYXhaZXJvcyA9IG9wdHMuc3RyaWN0WmVyb3MgPT09IGZhbHNlO1xuICB9XG5cbiAgbGV0IHJlbGF4ID0gU3RyaW5nKG9wdHMucmVsYXhaZXJvcyk7XG4gIGxldCBzaG9ydGhhbmQgPSBTdHJpbmcob3B0cy5zaG9ydGhhbmQpO1xuICBsZXQgY2FwdHVyZSA9IFN0cmluZyhvcHRzLmNhcHR1cmUpO1xuICBsZXQgd3JhcCA9IFN0cmluZyhvcHRzLndyYXApO1xuICBsZXQgY2FjaGVLZXkgPSBtaW4gKyAnOicgKyBtYXggKyAnPScgKyByZWxheCArIHNob3J0aGFuZCArIGNhcHR1cmUgKyB3cmFwO1xuXG4gIGlmICh0b1JlZ2V4UmFuZ2UkMS5jYWNoZS5oYXNPd25Qcm9wZXJ0eShjYWNoZUtleSkpIHtcbiAgICByZXR1cm4gdG9SZWdleFJhbmdlJDEuY2FjaGVbY2FjaGVLZXldLnJlc3VsdDtcbiAgfVxuXG4gIGxldCBhID0gTWF0aC5taW4obWluLCBtYXgpO1xuICBsZXQgYiA9IE1hdGgubWF4KG1pbiwgbWF4KTtcblxuICBpZiAoTWF0aC5hYnMoYSAtIGIpID09PSAxKSB7XG4gICAgbGV0IHJlc3VsdCA9IG1pbiArICd8JyArIG1heDtcbiAgICBpZiAob3B0cy5jYXB0dXJlKSB7XG4gICAgICByZXR1cm4gYCgke3Jlc3VsdH0pYDtcbiAgICB9XG4gICAgaWYgKG9wdHMud3JhcCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBgKD86JHtyZXN1bHR9KWA7XG4gIH1cblxuICBsZXQgaXNQYWRkZWQgPSBoYXNQYWRkaW5nKG1pbikgfHwgaGFzUGFkZGluZyhtYXgpO1xuICBsZXQgc3RhdGUgPSB7IG1pbiwgbWF4LCBhLCBiIH07XG4gIGxldCBwb3NpdGl2ZXMgPSBbXTtcbiAgbGV0IG5lZ2F0aXZlcyA9IFtdO1xuXG4gIGlmIChpc1BhZGRlZCkge1xuICAgIHN0YXRlLmlzUGFkZGVkID0gaXNQYWRkZWQ7XG4gICAgc3RhdGUubWF4TGVuID0gU3RyaW5nKHN0YXRlLm1heCkubGVuZ3RoO1xuICB9XG5cbiAgaWYgKGEgPCAwKSB7XG4gICAgbGV0IG5ld01pbiA9IGIgPCAwID8gTWF0aC5hYnMoYikgOiAxO1xuICAgIG5lZ2F0aXZlcyA9IHNwbGl0VG9QYXR0ZXJucyhuZXdNaW4sIE1hdGguYWJzKGEpLCBzdGF0ZSwgb3B0cyk7XG4gICAgYSA9IHN0YXRlLmEgPSAwO1xuICB9XG5cbiAgaWYgKGIgPj0gMCkge1xuICAgIHBvc2l0aXZlcyA9IHNwbGl0VG9QYXR0ZXJucyhhLCBiLCBzdGF0ZSwgb3B0cyk7XG4gIH1cblxuICBzdGF0ZS5uZWdhdGl2ZXMgPSBuZWdhdGl2ZXM7XG4gIHN0YXRlLnBvc2l0aXZlcyA9IHBvc2l0aXZlcztcbiAgc3RhdGUucmVzdWx0ID0gY29sbGF0ZVBhdHRlcm5zKG5lZ2F0aXZlcywgcG9zaXRpdmVzKTtcblxuICBpZiAob3B0cy5jYXB0dXJlID09PSB0cnVlKSB7XG4gICAgc3RhdGUucmVzdWx0ID0gYCgke3N0YXRlLnJlc3VsdH0pYDtcbiAgfSBlbHNlIGlmIChvcHRzLndyYXAgIT09IGZhbHNlICYmIChwb3NpdGl2ZXMubGVuZ3RoICsgbmVnYXRpdmVzLmxlbmd0aCkgPiAxKSB7XG4gICAgc3RhdGUucmVzdWx0ID0gYCg/OiR7c3RhdGUucmVzdWx0fSlgO1xuICB9XG5cbiAgdG9SZWdleFJhbmdlJDEuY2FjaGVbY2FjaGVLZXldID0gc3RhdGU7XG4gIHJldHVybiBzdGF0ZS5yZXN1bHQ7XG59O1xuXG5mdW5jdGlvbiBjb2xsYXRlUGF0dGVybnMobmVnLCBwb3MsIG9wdGlvbnMpIHtcbiAgbGV0IG9ubHlOZWdhdGl2ZSA9IGZpbHRlclBhdHRlcm5zKG5lZywgcG9zLCAnLScsIGZhbHNlKSB8fCBbXTtcbiAgbGV0IG9ubHlQb3NpdGl2ZSA9IGZpbHRlclBhdHRlcm5zKHBvcywgbmVnLCAnJywgZmFsc2UpIHx8IFtdO1xuICBsZXQgaW50ZXJzZWN0ZWQgPSBmaWx0ZXJQYXR0ZXJucyhuZWcsIHBvcywgJy0/JywgdHJ1ZSkgfHwgW107XG4gIGxldCBzdWJwYXR0ZXJucyA9IG9ubHlOZWdhdGl2ZS5jb25jYXQoaW50ZXJzZWN0ZWQpLmNvbmNhdChvbmx5UG9zaXRpdmUpO1xuICByZXR1cm4gc3VicGF0dGVybnMuam9pbignfCcpO1xufVxuXG5mdW5jdGlvbiBzcGxpdFRvUmFuZ2VzKG1pbiwgbWF4KSB7XG4gIGxldCBuaW5lcyA9IDE7XG4gIGxldCB6ZXJvcyA9IDE7XG5cbiAgbGV0IHN0b3AgPSBjb3VudE5pbmVzKG1pbiwgbmluZXMpO1xuICBsZXQgc3RvcHMgPSBuZXcgU2V0KFttYXhdKTtcblxuICB3aGlsZSAobWluIDw9IHN0b3AgJiYgc3RvcCA8PSBtYXgpIHtcbiAgICBzdG9wcy5hZGQoc3RvcCk7XG4gICAgbmluZXMgKz0gMTtcbiAgICBzdG9wID0gY291bnROaW5lcyhtaW4sIG5pbmVzKTtcbiAgfVxuXG4gIHN0b3AgPSBjb3VudFplcm9zKG1heCArIDEsIHplcm9zKSAtIDE7XG5cbiAgd2hpbGUgKG1pbiA8IHN0b3AgJiYgc3RvcCA8PSBtYXgpIHtcbiAgICBzdG9wcy5hZGQoc3RvcCk7XG4gICAgemVyb3MgKz0gMTtcbiAgICBzdG9wID0gY291bnRaZXJvcyhtYXggKyAxLCB6ZXJvcykgLSAxO1xuICB9XG5cbiAgc3RvcHMgPSBbLi4uc3RvcHNdO1xuICBzdG9wcy5zb3J0KGNvbXBhcmUpO1xuICByZXR1cm4gc3RvcHM7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhbmdlIHRvIGEgcmVnZXggcGF0dGVyblxuICogQHBhcmFtIHtOdW1iZXJ9IGBzdGFydGBcbiAqIEBwYXJhbSB7TnVtYmVyfSBgc3RvcGBcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiByYW5nZVRvUGF0dGVybihzdGFydCwgc3RvcCwgb3B0aW9ucykge1xuICBpZiAoc3RhcnQgPT09IHN0b3ApIHtcbiAgICByZXR1cm4geyBwYXR0ZXJuOiBzdGFydCwgY291bnQ6IFtdLCBkaWdpdHM6IDAgfTtcbiAgfVxuXG4gIGxldCB6aXBwZWQgPSB6aXAoc3RhcnQsIHN0b3ApO1xuICBsZXQgZGlnaXRzID0gemlwcGVkLmxlbmd0aDtcbiAgbGV0IHBhdHRlcm4gPSAnJztcbiAgbGV0IGNvdW50ID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZ2l0czsgaSsrKSB7XG4gICAgbGV0IFtzdGFydERpZ2l0LCBzdG9wRGlnaXRdID0gemlwcGVkW2ldO1xuXG4gICAgaWYgKHN0YXJ0RGlnaXQgPT09IHN0b3BEaWdpdCkge1xuICAgICAgcGF0dGVybiArPSBzdGFydERpZ2l0O1xuXG4gICAgfSBlbHNlIGlmIChzdGFydERpZ2l0ICE9PSAnMCcgfHwgc3RvcERpZ2l0ICE9PSAnOScpIHtcbiAgICAgIHBhdHRlcm4gKz0gdG9DaGFyYWN0ZXJDbGFzcyhzdGFydERpZ2l0LCBzdG9wRGlnaXQpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvdW50KSB7XG4gICAgcGF0dGVybiArPSBvcHRpb25zLnNob3J0aGFuZCA9PT0gdHJ1ZSA/ICdcXFxcZCcgOiAnWzAtOV0nO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0dGVybiwgY291bnQ6IFtjb3VudF0sIGRpZ2l0cyB9O1xufVxuXG5mdW5jdGlvbiBzcGxpdFRvUGF0dGVybnMobWluLCBtYXgsIHRvaywgb3B0aW9ucykge1xuICBsZXQgcmFuZ2VzID0gc3BsaXRUb1JhbmdlcyhtaW4sIG1heCk7XG4gIGxldCB0b2tlbnMgPSBbXTtcbiAgbGV0IHN0YXJ0ID0gbWluO1xuICBsZXQgcHJldjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBtYXggPSByYW5nZXNbaV07XG4gICAgbGV0IG9iaiA9IHJhbmdlVG9QYXR0ZXJuKFN0cmluZyhzdGFydCksIFN0cmluZyhtYXgpLCBvcHRpb25zKTtcbiAgICBsZXQgemVyb3MgPSAnJztcblxuICAgIGlmICghdG9rLmlzUGFkZGVkICYmIHByZXYgJiYgcHJldi5wYXR0ZXJuID09PSBvYmoucGF0dGVybikge1xuICAgICAgaWYgKHByZXYuY291bnQubGVuZ3RoID4gMSkge1xuICAgICAgICBwcmV2LmNvdW50LnBvcCgpO1xuICAgICAgfVxuXG4gICAgICBwcmV2LmNvdW50LnB1c2gob2JqLmNvdW50WzBdKTtcbiAgICAgIHByZXYuc3RyaW5nID0gcHJldi5wYXR0ZXJuICsgdG9RdWFudGlmaWVyKHByZXYuY291bnQpO1xuICAgICAgc3RhcnQgPSBtYXggKyAxO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRvay5pc1BhZGRlZCkge1xuICAgICAgemVyb3MgPSBwYWRaZXJvcyhtYXgsIHRvaywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgb2JqLnN0cmluZyA9IHplcm9zICsgb2JqLnBhdHRlcm4gKyB0b1F1YW50aWZpZXIob2JqLmNvdW50KTtcbiAgICB0b2tlbnMucHVzaChvYmopO1xuICAgIHN0YXJ0ID0gbWF4ICsgMTtcbiAgICBwcmV2ID0gb2JqO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cblxuZnVuY3Rpb24gZmlsdGVyUGF0dGVybnMoYXJyLCBjb21wYXJpc29uLCBwcmVmaXgsIGludGVyc2VjdGlvbiwgb3B0aW9ucykge1xuICBsZXQgcmVzdWx0ID0gW107XG5cbiAgZm9yIChsZXQgZWxlIG9mIGFycikge1xuICAgIGxldCB7IHN0cmluZyB9ID0gZWxlO1xuXG4gICAgLy8gb25seSBwdXNoIGlmIF9ib3RoXyBhcmUgbmVnYXRpdmUuLi5cbiAgICBpZiAoIWludGVyc2VjdGlvbiAmJiAhY29udGFpbnMoY29tcGFyaXNvbiwgJ3N0cmluZycsIHN0cmluZykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCArIHN0cmluZyk7XG4gICAgfVxuXG4gICAgLy8gb3IgX2JvdGhfIGFyZSBwb3NpdGl2ZVxuICAgIGlmIChpbnRlcnNlY3Rpb24gJiYgY29udGFpbnMoY29tcGFyaXNvbiwgJ3N0cmluZycsIHN0cmluZykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCArIHN0cmluZyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogWmlwIHN0cmluZ3NcbiAqL1xuXG5mdW5jdGlvbiB6aXAoYSwgYikge1xuICBsZXQgYXJyID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgYXJyLnB1c2goW2FbaV0sIGJbaV1dKTtcbiAgcmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIHJldHVybiBhID4gYiA/IDEgOiBiID4gYSA/IC0xIDogMDtcbn1cblxuZnVuY3Rpb24gY29udGFpbnMoYXJyLCBrZXksIHZhbCkge1xuICByZXR1cm4gYXJyLnNvbWUoZWxlID0+IGVsZVtrZXldID09PSB2YWwpO1xufVxuXG5mdW5jdGlvbiBjb3VudE5pbmVzKG1pbiwgbGVuKSB7XG4gIHJldHVybiBOdW1iZXIoU3RyaW5nKG1pbikuc2xpY2UoMCwgLWxlbikgKyAnOScucmVwZWF0KGxlbikpO1xufVxuXG5mdW5jdGlvbiBjb3VudFplcm9zKGludGVnZXIsIHplcm9zKSB7XG4gIHJldHVybiBpbnRlZ2VyIC0gKGludGVnZXIgJSBNYXRoLnBvdygxMCwgemVyb3MpKTtcbn1cblxuZnVuY3Rpb24gdG9RdWFudGlmaWVyKGRpZ2l0cykge1xuICBsZXQgW3N0YXJ0ID0gMCwgc3RvcCA9ICcnXSA9IGRpZ2l0cztcbiAgaWYgKHN0b3AgfHwgc3RhcnQgPiAxKSB7XG4gICAgcmV0dXJuIGB7JHtzdGFydCArIChzdG9wID8gJywnICsgc3RvcCA6ICcnKX19YDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIHRvQ2hhcmFjdGVyQ2xhc3MoYSwgYiwgb3B0aW9ucykge1xuICByZXR1cm4gYFske2F9JHsoYiAtIGEgPT09IDEpID8gJycgOiAnLSd9JHtifV1gO1xufVxuXG5mdW5jdGlvbiBoYXNQYWRkaW5nKHN0cikge1xuICByZXR1cm4gL14tPygwKylcXGQvLnRlc3Qoc3RyKTtcbn1cblxuZnVuY3Rpb24gcGFkWmVyb3ModmFsdWUsIHRvaywgb3B0aW9ucykge1xuICBpZiAoIXRvay5pc1BhZGRlZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGxldCBkaWZmID0gTWF0aC5hYnModG9rLm1heExlbiAtIFN0cmluZyh2YWx1ZSkubGVuZ3RoKTtcbiAgbGV0IHJlbGF4ID0gb3B0aW9ucy5yZWxheFplcm9zICE9PSBmYWxzZTtcblxuICBzd2l0Y2ggKGRpZmYpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gJyc7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIHJlbGF4ID8gJzA/JyA6ICcwJztcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gcmVsYXggPyAnMHswLDJ9JyA6ICcwMCc7XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHJlbGF4ID8gYDB7MCwke2RpZmZ9fWAgOiBgMHske2RpZmZ9fWA7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2FjaGVcbiAqL1xuXG50b1JlZ2V4UmFuZ2UkMS5jYWNoZSA9IHt9O1xudG9SZWdleFJhbmdlJDEuY2xlYXJDYWNoZSA9ICgpID0+ICh0b1JlZ2V4UmFuZ2UkMS5jYWNoZSA9IHt9KTtcblxuLyoqXG4gKiBFeHBvc2UgYHRvUmVnZXhSYW5nZWBcbiAqL1xuXG52YXIgdG9SZWdleFJhbmdlXzEgPSB0b1JlZ2V4UmFuZ2UkMTtcblxuLyohXG4gKiBmaWxsLXJhbmdlIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9maWxsLXJhbmdlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBKb24gU2NobGlua2VydC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG5jb25zdCB1dGlsJDEgPSByZXF1aXJlJCQwJDY7XG5jb25zdCB0b1JlZ2V4UmFuZ2UgPSB0b1JlZ2V4UmFuZ2VfMTtcblxuY29uc3QgaXNPYmplY3QgPSB2YWwgPT4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbmNvbnN0IHRyYW5zZm9ybSQxID0gdG9OdW1iZXIgPT4ge1xuICByZXR1cm4gdmFsdWUgPT4gdG9OdW1iZXIgPT09IHRydWUgPyBOdW1iZXIodmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbn07XG5cbmNvbnN0IGlzVmFsaWRWYWx1ZSA9IHZhbHVlID0+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICcnKTtcbn07XG5cbmNvbnN0IGlzTnVtYmVyID0gbnVtID0+IE51bWJlci5pc0ludGVnZXIoK251bSk7XG5cbmNvbnN0IHplcm9zID0gaW5wdXQgPT4ge1xuICBsZXQgdmFsdWUgPSBgJHtpbnB1dH1gO1xuICBsZXQgaW5kZXggPSAtMTtcbiAgaWYgKHZhbHVlWzBdID09PSAnLScpIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gIGlmICh2YWx1ZSA9PT0gJzAnKSByZXR1cm4gZmFsc2U7XG4gIHdoaWxlICh2YWx1ZVsrK2luZGV4XSA9PT0gJzAnKTtcbiAgcmV0dXJuIGluZGV4ID4gMDtcbn07XG5cbmNvbnN0IHN0cmluZ2lmeSQ2ID0gKHN0YXJ0LCBlbmQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHJpbmdpZnkgPT09IHRydWU7XG59O1xuXG5jb25zdCBwYWQgPSAoaW5wdXQsIG1heExlbmd0aCwgdG9OdW1iZXIpID0+IHtcbiAgaWYgKG1heExlbmd0aCA+IDApIHtcbiAgICBsZXQgZGFzaCA9IGlucHV0WzBdID09PSAnLScgPyAnLScgOiAnJztcbiAgICBpZiAoZGFzaCkgaW5wdXQgPSBpbnB1dC5zbGljZSgxKTtcbiAgICBpbnB1dCA9IChkYXNoICsgaW5wdXQucGFkU3RhcnQoZGFzaCA/IG1heExlbmd0aCAtIDEgOiBtYXhMZW5ndGgsICcwJykpO1xuICB9XG4gIGlmICh0b051bWJlciA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gU3RyaW5nKGlucHV0KTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59O1xuXG5jb25zdCB0b01heExlbiA9IChpbnB1dCwgbWF4TGVuZ3RoKSA9PiB7XG4gIGxldCBuZWdhdGl2ZSA9IGlucHV0WzBdID09PSAnLScgPyAnLScgOiAnJztcbiAgaWYgKG5lZ2F0aXZlKSB7XG4gICAgaW5wdXQgPSBpbnB1dC5zbGljZSgxKTtcbiAgICBtYXhMZW5ndGgtLTtcbiAgfVxuICB3aGlsZSAoaW5wdXQubGVuZ3RoIDwgbWF4TGVuZ3RoKSBpbnB1dCA9ICcwJyArIGlucHV0O1xuICByZXR1cm4gbmVnYXRpdmUgPyAoJy0nICsgaW5wdXQpIDogaW5wdXQ7XG59O1xuXG5jb25zdCB0b1NlcXVlbmNlID0gKHBhcnRzLCBvcHRpb25zKSA9PiB7XG4gIHBhcnRzLm5lZ2F0aXZlcy5zb3J0KChhLCBiKSA9PiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG4gIHBhcnRzLnBvc2l0aXZlcy5zb3J0KChhLCBiKSA9PiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG5cbiAgbGV0IHByZWZpeCA9IG9wdGlvbnMuY2FwdHVyZSA/ICcnIDogJz86JztcbiAgbGV0IHBvc2l0aXZlcyA9ICcnO1xuICBsZXQgbmVnYXRpdmVzID0gJyc7XG4gIGxldCByZXN1bHQ7XG5cbiAgaWYgKHBhcnRzLnBvc2l0aXZlcy5sZW5ndGgpIHtcbiAgICBwb3NpdGl2ZXMgPSBwYXJ0cy5wb3NpdGl2ZXMuam9pbignfCcpO1xuICB9XG5cbiAgaWYgKHBhcnRzLm5lZ2F0aXZlcy5sZW5ndGgpIHtcbiAgICBuZWdhdGl2ZXMgPSBgLSgke3ByZWZpeH0ke3BhcnRzLm5lZ2F0aXZlcy5qb2luKCd8Jyl9KWA7XG4gIH1cblxuICBpZiAocG9zaXRpdmVzICYmIG5lZ2F0aXZlcykge1xuICAgIHJlc3VsdCA9IGAke3Bvc2l0aXZlc318JHtuZWdhdGl2ZXN9YDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBwb3NpdGl2ZXMgfHwgbmVnYXRpdmVzO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMud3JhcCkge1xuICAgIHJldHVybiBgKCR7cHJlZml4fSR7cmVzdWx0fSlgO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHRvUmFuZ2UgPSAoYSwgYiwgaXNOdW1iZXJzLCBvcHRpb25zKSA9PiB7XG4gIGlmIChpc051bWJlcnMpIHtcbiAgICByZXR1cm4gdG9SZWdleFJhbmdlKGEsIGIsIHsgd3JhcDogZmFsc2UsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICBsZXQgc3RhcnQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHN0YXJ0O1xuXG4gIGxldCBzdG9wID0gU3RyaW5nLmZyb21DaGFyQ29kZShiKTtcbiAgcmV0dXJuIGBbJHtzdGFydH0tJHtzdG9wfV1gO1xufTtcblxuY29uc3QgdG9SZWdleCA9IChzdGFydCwgZW5kLCBvcHRpb25zKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXJ0KSkge1xuICAgIGxldCB3cmFwID0gb3B0aW9ucy53cmFwID09PSB0cnVlO1xuICAgIGxldCBwcmVmaXggPSBvcHRpb25zLmNhcHR1cmUgPyAnJyA6ICc/Oic7XG4gICAgcmV0dXJuIHdyYXAgPyBgKCR7cHJlZml4fSR7c3RhcnQuam9pbignfCcpfSlgIDogc3RhcnQuam9pbignfCcpO1xuICB9XG4gIHJldHVybiB0b1JlZ2V4UmFuZ2Uoc3RhcnQsIGVuZCwgb3B0aW9ucyk7XG59O1xuXG5jb25zdCByYW5nZUVycm9yID0gKC4uLmFyZ3MpID0+IHtcbiAgcmV0dXJuIG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHJhbmdlIGFyZ3VtZW50czogJyArIHV0aWwkMS5pbnNwZWN0KC4uLmFyZ3MpKTtcbn07XG5cbmNvbnN0IGludmFsaWRSYW5nZSA9IChzdGFydCwgZW5kLCBvcHRpb25zKSA9PiB7XG4gIGlmIChvcHRpb25zLnN0cmljdFJhbmdlcyA9PT0gdHJ1ZSkgdGhyb3cgcmFuZ2VFcnJvcihbc3RhcnQsIGVuZF0pO1xuICByZXR1cm4gW107XG59O1xuXG5jb25zdCBpbnZhbGlkU3RlcCA9IChzdGVwLCBvcHRpb25zKSA9PiB7XG4gIGlmIChvcHRpb25zLnN0cmljdFJhbmdlcyA9PT0gdHJ1ZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIHN0ZXAgXCIke3N0ZXB9XCIgdG8gYmUgYSBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gW107XG59O1xuXG5jb25zdCBmaWxsTnVtYmVycyA9IChzdGFydCwgZW5kLCBzdGVwID0gMSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCBhID0gTnVtYmVyKHN0YXJ0KTtcbiAgbGV0IGIgPSBOdW1iZXIoZW5kKTtcblxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoYSkgfHwgIU51bWJlci5pc0ludGVnZXIoYikpIHtcbiAgICBpZiAob3B0aW9ucy5zdHJpY3RSYW5nZXMgPT09IHRydWUpIHRocm93IHJhbmdlRXJyb3IoW3N0YXJ0LCBlbmRdKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyBmaXggbmVnYXRpdmUgemVyb1xuICBpZiAoYSA9PT0gMCkgYSA9IDA7XG4gIGlmIChiID09PSAwKSBiID0gMDtcblxuICBsZXQgZGVzY2VuZGluZyA9IGEgPiBiO1xuICBsZXQgc3RhcnRTdHJpbmcgPSBTdHJpbmcoc3RhcnQpO1xuICBsZXQgZW5kU3RyaW5nID0gU3RyaW5nKGVuZCk7XG4gIGxldCBzdGVwU3RyaW5nID0gU3RyaW5nKHN0ZXApO1xuICBzdGVwID0gTWF0aC5tYXgoTWF0aC5hYnMoc3RlcCksIDEpO1xuXG4gIGxldCBwYWRkZWQgPSB6ZXJvcyhzdGFydFN0cmluZykgfHwgemVyb3MoZW5kU3RyaW5nKSB8fCB6ZXJvcyhzdGVwU3RyaW5nKTtcbiAgbGV0IG1heExlbiA9IHBhZGRlZCA/IE1hdGgubWF4KHN0YXJ0U3RyaW5nLmxlbmd0aCwgZW5kU3RyaW5nLmxlbmd0aCwgc3RlcFN0cmluZy5sZW5ndGgpIDogMDtcbiAgbGV0IHRvTnVtYmVyID0gcGFkZGVkID09PSBmYWxzZSAmJiBzdHJpbmdpZnkkNihzdGFydCwgZW5kLCBvcHRpb25zKSA9PT0gZmFsc2U7XG4gIGxldCBmb3JtYXQgPSBvcHRpb25zLnRyYW5zZm9ybSB8fCB0cmFuc2Zvcm0kMSh0b051bWJlcik7XG5cbiAgaWYgKG9wdGlvbnMudG9SZWdleCAmJiBzdGVwID09PSAxKSB7XG4gICAgcmV0dXJuIHRvUmFuZ2UodG9NYXhMZW4oc3RhcnQsIG1heExlbiksIHRvTWF4TGVuKGVuZCwgbWF4TGVuKSwgdHJ1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBsZXQgcGFydHMgPSB7IG5lZ2F0aXZlczogW10sIHBvc2l0aXZlczogW10gfTtcbiAgbGV0IHB1c2ggPSBudW0gPT4gcGFydHNbbnVtIDwgMCA/ICduZWdhdGl2ZXMnIDogJ3Bvc2l0aXZlcyddLnB1c2goTWF0aC5hYnMobnVtKSk7XG4gIGxldCByYW5nZSA9IFtdO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIHdoaWxlIChkZXNjZW5kaW5nID8gYSA+PSBiIDogYSA8PSBiKSB7XG4gICAgaWYgKG9wdGlvbnMudG9SZWdleCA9PT0gdHJ1ZSAmJiBzdGVwID4gMSkge1xuICAgICAgcHVzaChhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2UucHVzaChwYWQoZm9ybWF0KGEsIGluZGV4KSwgbWF4TGVuLCB0b051bWJlcikpO1xuICAgIH1cbiAgICBhID0gZGVzY2VuZGluZyA/IGEgLSBzdGVwIDogYSArIHN0ZXA7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggPT09IHRydWUpIHtcbiAgICByZXR1cm4gc3RlcCA+IDFcbiAgICAgID8gdG9TZXF1ZW5jZShwYXJ0cywgb3B0aW9ucylcbiAgICAgIDogdG9SZWdleChyYW5nZSwgbnVsbCwgeyB3cmFwOiBmYWxzZSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIHJldHVybiByYW5nZTtcbn07XG5cbmNvbnN0IGZpbGxMZXR0ZXJzID0gKHN0YXJ0LCBlbmQsIHN0ZXAgPSAxLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKCghaXNOdW1iZXIoc3RhcnQpICYmIHN0YXJ0Lmxlbmd0aCA+IDEpIHx8ICghaXNOdW1iZXIoZW5kKSAmJiBlbmQubGVuZ3RoID4gMSkpIHtcbiAgICByZXR1cm4gaW52YWxpZFJhbmdlKHN0YXJ0LCBlbmQsIG9wdGlvbnMpO1xuICB9XG5cblxuICBsZXQgZm9ybWF0ID0gb3B0aW9ucy50cmFuc2Zvcm0gfHwgKHZhbCA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbCkpO1xuICBsZXQgYSA9IGAke3N0YXJ0fWAuY2hhckNvZGVBdCgwKTtcbiAgbGV0IGIgPSBgJHtlbmR9YC5jaGFyQ29kZUF0KDApO1xuXG4gIGxldCBkZXNjZW5kaW5nID0gYSA+IGI7XG4gIGxldCBtaW4gPSBNYXRoLm1pbihhLCBiKTtcbiAgbGV0IG1heCA9IE1hdGgubWF4KGEsIGIpO1xuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggJiYgc3RlcCA9PT0gMSkge1xuICAgIHJldHVybiB0b1JhbmdlKG1pbiwgbWF4LCBmYWxzZSwgb3B0aW9ucyk7XG4gIH1cblxuICBsZXQgcmFuZ2UgPSBbXTtcbiAgbGV0IGluZGV4ID0gMDtcblxuICB3aGlsZSAoZGVzY2VuZGluZyA/IGEgPj0gYiA6IGEgPD0gYikge1xuICAgIHJhbmdlLnB1c2goZm9ybWF0KGEsIGluZGV4KSk7XG4gICAgYSA9IGRlc2NlbmRpbmcgPyBhIC0gc3RlcCA6IGEgKyBzdGVwO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHRvUmVnZXgocmFuZ2UsIG51bGwsIHsgd3JhcDogZmFsc2UsIG9wdGlvbnMgfSk7XG4gIH1cblxuICByZXR1cm4gcmFuZ2U7XG59O1xuXG5jb25zdCBmaWxsJDIgPSAoc3RhcnQsIGVuZCwgc3RlcCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChlbmQgPT0gbnVsbCAmJiBpc1ZhbGlkVmFsdWUoc3RhcnQpKSB7XG4gICAgcmV0dXJuIFtzdGFydF07XG4gIH1cblxuICBpZiAoIWlzVmFsaWRWYWx1ZShzdGFydCkgfHwgIWlzVmFsaWRWYWx1ZShlbmQpKSB7XG4gICAgcmV0dXJuIGludmFsaWRSYW5nZShzdGFydCwgZW5kLCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RlcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmaWxsJDIoc3RhcnQsIGVuZCwgMSwgeyB0cmFuc2Zvcm06IHN0ZXAgfSk7XG4gIH1cblxuICBpZiAoaXNPYmplY3Qoc3RlcCkpIHtcbiAgICByZXR1cm4gZmlsbCQyKHN0YXJ0LCBlbmQsIDAsIHN0ZXApO1xuICB9XG5cbiAgbGV0IG9wdHMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgaWYgKG9wdHMuY2FwdHVyZSA9PT0gdHJ1ZSkgb3B0cy53cmFwID0gdHJ1ZTtcbiAgc3RlcCA9IHN0ZXAgfHwgb3B0cy5zdGVwIHx8IDE7XG5cbiAgaWYgKCFpc051bWJlcihzdGVwKSkge1xuICAgIGlmIChzdGVwICE9IG51bGwgJiYgIWlzT2JqZWN0KHN0ZXApKSByZXR1cm4gaW52YWxpZFN0ZXAoc3RlcCwgb3B0cyk7XG4gICAgcmV0dXJuIGZpbGwkMihzdGFydCwgZW5kLCAxLCBzdGVwKTtcbiAgfVxuXG4gIGlmIChpc051bWJlcihzdGFydCkgJiYgaXNOdW1iZXIoZW5kKSkge1xuICAgIHJldHVybiBmaWxsTnVtYmVycyhzdGFydCwgZW5kLCBzdGVwLCBvcHRzKTtcbiAgfVxuXG4gIHJldHVybiBmaWxsTGV0dGVycyhzdGFydCwgZW5kLCBNYXRoLm1heChNYXRoLmFicyhzdGVwKSwgMSksIG9wdHMpO1xufTtcblxudmFyIGZpbGxSYW5nZSA9IGZpbGwkMjtcblxuY29uc3QgZmlsbCQxID0gZmlsbFJhbmdlO1xuY29uc3QgdXRpbHMkZCA9IHV0aWxzJGY7XG5cbmNvbnN0IGNvbXBpbGUkMSA9IChhc3QsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgd2FsayA9IChub2RlLCBwYXJlbnQgPSB7fSkgPT4ge1xuICAgIGxldCBpbnZhbGlkQmxvY2sgPSB1dGlscyRkLmlzSW52YWxpZEJyYWNlKHBhcmVudCk7XG4gICAgbGV0IGludmFsaWROb2RlID0gbm9kZS5pbnZhbGlkID09PSB0cnVlICYmIG9wdGlvbnMuZXNjYXBlSW52YWxpZCA9PT0gdHJ1ZTtcbiAgICBsZXQgaW52YWxpZCA9IGludmFsaWRCbG9jayA9PT0gdHJ1ZSB8fCBpbnZhbGlkTm9kZSA9PT0gdHJ1ZTtcbiAgICBsZXQgcHJlZml4ID0gb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlID8gJ1xcXFwnIDogJyc7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuXG4gICAgaWYgKG5vZGUuaXNPcGVuID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ICsgbm9kZS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKG5vZGUuaXNDbG9zZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHByZWZpeCArIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ29wZW4nKSB7XG4gICAgICByZXR1cm4gaW52YWxpZCA/IChwcmVmaXggKyBub2RlLnZhbHVlKSA6ICcoJztcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgICByZXR1cm4gaW52YWxpZCA/IChwcmVmaXggKyBub2RlLnZhbHVlKSA6ICcpJztcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnY29tbWEnKSB7XG4gICAgICByZXR1cm4gbm9kZS5wcmV2LnR5cGUgPT09ICdjb21tYScgPyAnJyA6IChpbnZhbGlkID8gbm9kZS52YWx1ZSA6ICd8Jyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzICYmIG5vZGUucmFuZ2VzID4gMCkge1xuICAgICAgbGV0IGFyZ3MgPSB1dGlscyRkLnJlZHVjZShub2RlLm5vZGVzKTtcbiAgICAgIGxldCByYW5nZSA9IGZpbGwkMSguLi5hcmdzLCB7IC4uLm9wdGlvbnMsIHdyYXA6IGZhbHNlLCB0b1JlZ2V4OiB0cnVlIH0pO1xuXG4gICAgICBpZiAocmFuZ2UubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA+IDEgJiYgcmFuZ2UubGVuZ3RoID4gMSA/IGAoJHtyYW5nZX0pYCA6IHJhbmdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzKSB7XG4gICAgICBmb3IgKGxldCBjaGlsZCBvZiBub2RlLm5vZGVzKSB7XG4gICAgICAgIG91dHB1dCArPSB3YWxrKGNoaWxkLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICByZXR1cm4gd2Fsayhhc3QpO1xufTtcblxudmFyIGNvbXBpbGVfMSA9IGNvbXBpbGUkMTtcblxuY29uc3QgZmlsbCA9IGZpbGxSYW5nZTtcbmNvbnN0IHN0cmluZ2lmeSQ1ID0gc3RyaW5naWZ5JDc7XG5jb25zdCB1dGlscyRjID0gdXRpbHMkZjtcblxuY29uc3QgYXBwZW5kJDEgPSAocXVldWUgPSAnJywgc3Rhc2ggPSAnJywgZW5jbG9zZSA9IGZhbHNlKSA9PiB7XG4gIGxldCByZXN1bHQgPSBbXTtcblxuICBxdWV1ZSA9IFtdLmNvbmNhdChxdWV1ZSk7XG4gIHN0YXNoID0gW10uY29uY2F0KHN0YXNoKTtcblxuICBpZiAoIXN0YXNoLmxlbmd0aCkgcmV0dXJuIHF1ZXVlO1xuICBpZiAoIXF1ZXVlLmxlbmd0aCkge1xuICAgIHJldHVybiBlbmNsb3NlID8gdXRpbHMkYy5mbGF0dGVuKHN0YXNoKS5tYXAoZWxlID0+IGB7JHtlbGV9fWApIDogc3Rhc2g7XG4gIH1cblxuICBmb3IgKGxldCBpdGVtIG9mIHF1ZXVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIGZvciAobGV0IHZhbHVlIG9mIGl0ZW0pIHtcbiAgICAgICAgcmVzdWx0LnB1c2goYXBwZW5kJDEodmFsdWUsIHN0YXNoLCBlbmNsb3NlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGVsZSBvZiBzdGFzaCkge1xuICAgICAgICBpZiAoZW5jbG9zZSA9PT0gdHJ1ZSAmJiB0eXBlb2YgZWxlID09PSAnc3RyaW5nJykgZWxlID0gYHske2VsZX19YDtcbiAgICAgICAgcmVzdWx0LnB1c2goQXJyYXkuaXNBcnJheShlbGUpID8gYXBwZW5kJDEoaXRlbSwgZWxlLCBlbmNsb3NlKSA6IChpdGVtICsgZWxlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1dGlscyRjLmZsYXR0ZW4ocmVzdWx0KTtcbn07XG5cbmNvbnN0IGV4cGFuZCQyID0gKGFzdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCByYW5nZUxpbWl0ID0gb3B0aW9ucy5yYW5nZUxpbWl0ID09PSB2b2lkIDAgPyAxMDAwIDogb3B0aW9ucy5yYW5nZUxpbWl0O1xuXG4gIGxldCB3YWxrID0gKG5vZGUsIHBhcmVudCA9IHt9KSA9PiB7XG4gICAgbm9kZS5xdWV1ZSA9IFtdO1xuXG4gICAgbGV0IHAgPSBwYXJlbnQ7XG4gICAgbGV0IHEgPSBwYXJlbnQucXVldWU7XG5cbiAgICB3aGlsZSAocC50eXBlICE9PSAnYnJhY2UnICYmIHAudHlwZSAhPT0gJ3Jvb3QnICYmIHAucGFyZW50KSB7XG4gICAgICBwID0gcC5wYXJlbnQ7XG4gICAgICBxID0gcC5xdWV1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5pbnZhbGlkIHx8IG5vZGUuZG9sbGFyKSB7XG4gICAgICBxLnB1c2goYXBwZW5kJDEocS5wb3AoKSwgc3RyaW5naWZ5JDUobm9kZSwgb3B0aW9ucykpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnYnJhY2UnICYmIG5vZGUuaW52YWxpZCAhPT0gdHJ1ZSAmJiBub2RlLm5vZGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcS5wdXNoKGFwcGVuZCQxKHEucG9wKCksIFsne30nXSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzICYmIG5vZGUucmFuZ2VzID4gMCkge1xuICAgICAgbGV0IGFyZ3MgPSB1dGlscyRjLnJlZHVjZShub2RlLm5vZGVzKTtcblxuICAgICAgaWYgKHV0aWxzJGMuZXhjZWVkc0xpbWl0KC4uLmFyZ3MsIG9wdGlvbnMuc3RlcCwgcmFuZ2VMaW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2V4cGFuZGVkIGFycmF5IGxlbmd0aCBleGNlZWRzIHJhbmdlIGxpbWl0LiBVc2Ugb3B0aW9ucy5yYW5nZUxpbWl0IHRvIGluY3JlYXNlIG9yIGRpc2FibGUgdGhlIGxpbWl0LicpO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmFuZ2UgPSBmaWxsKC4uLmFyZ3MsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJhbmdlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByYW5nZSA9IHN0cmluZ2lmeSQ1KG5vZGUsIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBxLnB1c2goYXBwZW5kJDEocS5wb3AoKSwgcmFuZ2UpKTtcbiAgICAgIG5vZGUubm9kZXMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZW5jbG9zZSA9IHV0aWxzJGMuZW5jbG9zZUJyYWNlKG5vZGUpO1xuICAgIGxldCBxdWV1ZSA9IG5vZGUucXVldWU7XG4gICAgbGV0IGJsb2NrID0gbm9kZTtcblxuICAgIHdoaWxlIChibG9jay50eXBlICE9PSAnYnJhY2UnICYmIGJsb2NrLnR5cGUgIT09ICdyb290JyAmJiBibG9jay5wYXJlbnQpIHtcbiAgICAgIGJsb2NrID0gYmxvY2sucGFyZW50O1xuICAgICAgcXVldWUgPSBibG9jay5xdWV1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjaGlsZCA9IG5vZGUubm9kZXNbaV07XG5cbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnY29tbWEnICYmIG5vZGUudHlwZSA9PT0gJ2JyYWNlJykge1xuICAgICAgICBpZiAoaSA9PT0gMSkgcXVldWUucHVzaCgnJyk7XG4gICAgICAgIHF1ZXVlLnB1c2goJycpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgICAgcS5wdXNoKGFwcGVuZCQxKHEucG9wKCksIHF1ZXVlLCBlbmNsb3NlKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQudmFsdWUgJiYgY2hpbGQudHlwZSAhPT0gJ29wZW4nKSB7XG4gICAgICAgIHF1ZXVlLnB1c2goYXBwZW5kJDEocXVldWUucG9wKCksIGNoaWxkLnZhbHVlKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQubm9kZXMpIHtcbiAgICAgICAgd2FsayhjaGlsZCwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXVlO1xuICB9O1xuXG4gIHJldHVybiB1dGlscyRjLmZsYXR0ZW4od2Fsayhhc3QpKTtcbn07XG5cbnZhciBleHBhbmRfMSQxID0gZXhwYW5kJDI7XG5cbnZhciBjb25zdGFudHMkMyA9IHtcbiAgTUFYX0xFTkdUSDogMTAyNCAqIDY0LFxuXG4gIC8vIERpZ2l0c1xuICBDSEFSXzA6ICcwJywgLyogMCAqL1xuICBDSEFSXzk6ICc5JywgLyogOSAqL1xuXG4gIC8vIEFscGhhYmV0IGNoYXJzLlxuICBDSEFSX1VQUEVSQ0FTRV9BOiAnQScsIC8qIEEgKi9cbiAgQ0hBUl9MT1dFUkNBU0VfQTogJ2EnLCAvKiBhICovXG4gIENIQVJfVVBQRVJDQVNFX1o6ICdaJywgLyogWiAqL1xuICBDSEFSX0xPV0VSQ0FTRV9aOiAneicsIC8qIHogKi9cblxuICBDSEFSX0xFRlRfUEFSRU5USEVTRVM6ICcoJywgLyogKCAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTOiAnKScsIC8qICkgKi9cblxuICBDSEFSX0FTVEVSSVNLOiAnKicsIC8qICogKi9cblxuICAvLyBOb24tYWxwaGFiZXRpYyBjaGFycy5cbiAgQ0hBUl9BTVBFUlNBTkQ6ICcmJywgLyogJiAqL1xuICBDSEFSX0FUOiAnQCcsIC8qIEAgKi9cbiAgQ0hBUl9CQUNLU0xBU0g6ICdcXFxcJywgLyogXFwgKi9cbiAgQ0hBUl9CQUNLVElDSzogJ2AnLCAvKiBgICovXG4gIENIQVJfQ0FSUklBR0VfUkVUVVJOOiAnXFxyJywgLyogXFxyICovXG4gIENIQVJfQ0lSQ1VNRkxFWF9BQ0NFTlQ6ICdeJywgLyogXiAqL1xuICBDSEFSX0NPTE9OOiAnOicsIC8qIDogKi9cbiAgQ0hBUl9DT01NQTogJywnLCAvKiAsICovXG4gIENIQVJfRE9MTEFSOiAnJCcsIC8qIC4gKi9cbiAgQ0hBUl9ET1Q6ICcuJywgLyogLiAqL1xuICBDSEFSX0RPVUJMRV9RVU9URTogJ1wiJywgLyogXCIgKi9cbiAgQ0hBUl9FUVVBTDogJz0nLCAvKiA9ICovXG4gIENIQVJfRVhDTEFNQVRJT05fTUFSSzogJyEnLCAvKiAhICovXG4gIENIQVJfRk9STV9GRUVEOiAnXFxmJywgLyogXFxmICovXG4gIENIQVJfRk9SV0FSRF9TTEFTSDogJy8nLCAvKiAvICovXG4gIENIQVJfSEFTSDogJyMnLCAvKiAjICovXG4gIENIQVJfSFlQSEVOX01JTlVTOiAnLScsIC8qIC0gKi9cbiAgQ0hBUl9MRUZUX0FOR0xFX0JSQUNLRVQ6ICc8JywgLyogPCAqL1xuICBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0U6ICd7JywgLyogeyAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQ6ICdbJywgLyogWyAqL1xuICBDSEFSX0xJTkVfRkVFRDogJ1xcbicsIC8qIFxcbiAqL1xuICBDSEFSX05PX0JSRUFLX1NQQUNFOiAnXFx1MDBBMCcsIC8qIFxcdTAwQTAgKi9cbiAgQ0hBUl9QRVJDRU5UOiAnJScsIC8qICUgKi9cbiAgQ0hBUl9QTFVTOiAnKycsIC8qICsgKi9cbiAgQ0hBUl9RVUVTVElPTl9NQVJLOiAnPycsIC8qID8gKi9cbiAgQ0hBUl9SSUdIVF9BTkdMRV9CUkFDS0VUOiAnPicsIC8qID4gKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRTogJ30nLCAvKiB9ICovXG4gIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQ6ICddJywgLyogXSAqL1xuICBDSEFSX1NFTUlDT0xPTjogJzsnLCAvKiA7ICovXG4gIENIQVJfU0lOR0xFX1FVT1RFOiAnXFwnJywgLyogJyAqL1xuICBDSEFSX1NQQUNFOiAnICcsIC8qICAgKi9cbiAgQ0hBUl9UQUI6ICdcXHQnLCAvKiBcXHQgKi9cbiAgQ0hBUl9VTkRFUlNDT1JFOiAnXycsIC8qIF8gKi9cbiAgQ0hBUl9WRVJUSUNBTF9MSU5FOiAnfCcsIC8qIHwgKi9cbiAgQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0U6ICdcXHVGRUZGJyAvKiBcXHVGRUZGICovXG59O1xuXG5jb25zdCBzdHJpbmdpZnkkNCA9IHN0cmluZ2lmeSQ3O1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IHtcbiAgTUFYX0xFTkdUSCxcbiAgQ0hBUl9CQUNLU0xBU0gsIC8qIFxcICovXG4gIENIQVJfQkFDS1RJQ0ssIC8qIGAgKi9cbiAgQ0hBUl9DT01NQSwgLyogLCAqL1xuICBDSEFSX0RPVCwgLyogLiAqL1xuICBDSEFSX0xFRlRfUEFSRU5USEVTRVMsIC8qICggKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUywgLyogKSAqL1xuICBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UsIC8qIHsgKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSwgLyogfSAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQsIC8qIFsgKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCwgLyogXSAqL1xuICBDSEFSX0RPVUJMRV9RVU9URSwgLyogXCIgKi9cbiAgQ0hBUl9TSU5HTEVfUVVPVEUsIC8qICcgKi9cbiAgQ0hBUl9OT19CUkVBS19TUEFDRSxcbiAgQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0Vcbn0gPSBjb25zdGFudHMkMztcblxuLyoqXG4gKiBwYXJzZVxuICovXG5cbmNvbnN0IHBhcnNlJGMgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIH1cblxuICBsZXQgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGxldCBtYXggPSB0eXBlb2Ygb3B0cy5tYXhMZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5taW4oTUFYX0xFTkdUSCwgb3B0cy5tYXhMZW5ndGgpIDogTUFYX0xFTkdUSDtcbiAgaWYgKGlucHV0Lmxlbmd0aCA+IG1heCkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW5wdXQgbGVuZ3RoICgke2lucHV0Lmxlbmd0aH0pLCBleGNlZWRzIG1heCBjaGFyYWN0ZXJzICgke21heH0pYCk7XG4gIH1cblxuICBsZXQgYXN0ID0geyB0eXBlOiAncm9vdCcsIGlucHV0LCBub2RlczogW10gfTtcbiAgbGV0IHN0YWNrID0gW2FzdF07XG4gIGxldCBibG9jayA9IGFzdDtcbiAgbGV0IHByZXYgPSBhc3Q7XG4gIGxldCBicmFja2V0cyA9IDA7XG4gIGxldCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBkZXB0aCA9IDA7XG4gIGxldCB2YWx1ZTtcblxuICAvKipcbiAgICogSGVscGVyc1xuICAgKi9cblxuICBjb25zdCBhZHZhbmNlID0gKCkgPT4gaW5wdXRbaW5kZXgrK107XG4gIGNvbnN0IHB1c2ggPSBub2RlID0+IHtcbiAgICBpZiAobm9kZS50eXBlID09PSAndGV4dCcgJiYgcHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgcHJldi50eXBlID0gJ3RleHQnO1xuICAgIH1cblxuICAgIGlmIChwcmV2ICYmIHByZXYudHlwZSA9PT0gJ3RleHQnICYmIG5vZGUudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICBwcmV2LnZhbHVlICs9IG5vZGUudmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYmxvY2subm9kZXMucHVzaChub2RlKTtcbiAgICBub2RlLnBhcmVudCA9IGJsb2NrO1xuICAgIG5vZGUucHJldiA9IHByZXY7XG4gICAgcHJldiA9IG5vZGU7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG5cbiAgcHVzaCh7IHR5cGU6ICdib3MnIH0pO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGJsb2NrID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgdmFsdWUgPSBhZHZhbmNlKCk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZhbGlkIGNoYXJzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFIHx8IHZhbHVlID09PSBDSEFSX05PX0JSRUFLX1NQQUNFKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVkIGNoYXJzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfQkFDS1NMQVNIKSB7XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogKG9wdGlvbnMua2VlcEVzY2FwaW5nID8gdmFsdWUgOiAnJykgKyBhZHZhbmNlKCkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSaWdodCBzcXVhcmUgYnJhY2tldCAobGl0ZXJhbCk6ICddJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogJ1xcXFwnICsgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMZWZ0IHNxdWFyZSBicmFja2V0OiAnWydcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICBicmFja2V0cysrO1xuICAgICAgbGV0IG5leHQ7XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgdmFsdWUgKz0gbmV4dDtcblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgYnJhY2tldHMrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX0JBQ0tTTEFTSCkge1xuICAgICAgICAgIHZhbHVlICs9IGFkdmFuY2UoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICAgICAgYnJhY2tldHMtLTtcblxuICAgICAgICAgIGlmIChicmFja2V0cyA9PT0gMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyZW50aGVzZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBibG9jayA9IHB1c2goeyB0eXBlOiAncGFyZW4nLCBub2RlczogW10gfSk7XG4gICAgICBzdGFjay5wdXNoKGJsb2NrKTtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTKSB7XG4gICAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ3BhcmVuJykge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVvdGVzOiAnfFwifGBcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9ET1VCTEVfUVVPVEUgfHwgdmFsdWUgPT09IENIQVJfU0lOR0xFX1FVT1RFIHx8IHZhbHVlID09PSBDSEFSX0JBQ0tUSUNLKSB7XG4gICAgICBsZXQgb3BlbiA9IHZhbHVlO1xuICAgICAgbGV0IG5leHQ7XG5cbiAgICAgIGlmIChvcHRpb25zLmtlZXBRdW90ZXMgIT09IHRydWUpIHtcbiAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmIChuZXh0ID0gYWR2YW5jZSgpKSkge1xuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9CQUNLU0xBU0gpIHtcbiAgICAgICAgICB2YWx1ZSArPSBuZXh0ICsgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPT09IG9wZW4pIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5rZWVwUXVvdGVzID09PSB0cnVlKSB2YWx1ZSArPSBuZXh0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgKz0gbmV4dDtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMZWZ0IGN1cmx5IGJyYWNlOiAneydcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFKSB7XG4gICAgICBkZXB0aCsrO1xuXG4gICAgICBsZXQgZG9sbGFyID0gcHJldi52YWx1ZSAmJiBwcmV2LnZhbHVlLnNsaWNlKC0xKSA9PT0gJyQnIHx8IGJsb2NrLmRvbGxhciA9PT0gdHJ1ZTtcbiAgICAgIGxldCBicmFjZSA9IHtcbiAgICAgICAgdHlwZTogJ2JyYWNlJyxcbiAgICAgICAgb3BlbjogdHJ1ZSxcbiAgICAgICAgY2xvc2U6IGZhbHNlLFxuICAgICAgICBkb2xsYXIsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICBjb21tYXM6IDAsXG4gICAgICAgIHJhbmdlczogMCxcbiAgICAgICAgbm9kZXM6IFtdXG4gICAgICB9O1xuXG4gICAgICBibG9jayA9IHB1c2goYnJhY2UpO1xuICAgICAgc3RhY2sucHVzaChibG9jayk7XG4gICAgICBwdXNoKHsgdHlwZTogJ29wZW4nLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJpZ2h0IGN1cmx5IGJyYWNlOiAnfSdcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSkge1xuICAgICAgaWYgKGJsb2NrLnR5cGUgIT09ICdicmFjZScpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgdHlwZSA9ICdjbG9zZSc7XG4gICAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuICAgICAgYmxvY2suY2xvc2UgPSB0cnVlO1xuXG4gICAgICBwdXNoKHsgdHlwZSwgdmFsdWUgfSk7XG4gICAgICBkZXB0aC0tO1xuXG4gICAgICBibG9jayA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tbWE6ICcsJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0NPTU1BICYmIGRlcHRoID4gMCkge1xuICAgICAgaWYgKGJsb2NrLnJhbmdlcyA+IDApIHtcbiAgICAgICAgYmxvY2sucmFuZ2VzID0gMDtcbiAgICAgICAgbGV0IG9wZW4gPSBibG9jay5ub2Rlcy5zaGlmdCgpO1xuICAgICAgICBibG9jay5ub2RlcyA9IFtvcGVuLCB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHN0cmluZ2lmeSQ0KGJsb2NrKSB9XTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdjb21tYScsIHZhbHVlIH0pO1xuICAgICAgYmxvY2suY29tbWFzKys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3Q6ICcuJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX0RPVCAmJiBkZXB0aCA+IDAgJiYgYmxvY2suY29tbWFzID09PSAwKSB7XG4gICAgICBsZXQgc2libGluZ3MgPSBibG9jay5ub2RlcztcblxuICAgICAgaWYgKGRlcHRoID09PSAwIHx8IHNpYmxpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICAgIGJsb2NrLnJhbmdlID0gW107XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHByZXYudHlwZSA9ICdyYW5nZSc7XG5cbiAgICAgICAgaWYgKGJsb2NrLm5vZGVzLmxlbmd0aCAhPT0gMyAmJiBibG9jay5ub2Rlcy5sZW5ndGggIT09IDUpIHtcbiAgICAgICAgICBibG9jay5pbnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICBibG9jay5yYW5nZXMgPSAwO1xuICAgICAgICAgIHByZXYudHlwZSA9ICd0ZXh0JztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJsb2NrLnJhbmdlcysrO1xuICAgICAgICBibG9jay5hcmdzID0gW107XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldi50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIHNpYmxpbmdzLnBvcCgpO1xuXG4gICAgICAgIGxldCBiZWZvcmUgPSBzaWJsaW5nc1tzaWJsaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgYmVmb3JlLnZhbHVlICs9IHByZXYudmFsdWUgKyB2YWx1ZTtcbiAgICAgICAgcHJldiA9IGJlZm9yZTtcbiAgICAgICAgYmxvY2sucmFuZ2VzLS07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2RvdCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGV4dFxuICAgICAqL1xuXG4gICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gIH1cblxuICAvLyBNYXJrIGltYmFsYW5jZWQgYnJhY2VzIGFuZCBicmFja2V0cyBhcyBpbnZhbGlkXG4gIGRvIHtcbiAgICBibG9jayA9IHN0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGJsb2NrLnR5cGUgIT09ICdyb290Jykge1xuICAgICAgYmxvY2subm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgaWYgKCFub2RlLm5vZGVzKSB7XG4gICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ29wZW4nKSBub2RlLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ2Nsb3NlJykgbm9kZS5pc0Nsb3NlID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoIW5vZGUubm9kZXMpIG5vZGUudHlwZSA9ICd0ZXh0JztcbiAgICAgICAgICBub2RlLmludmFsaWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gZ2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYmxvY2sgb24gcGFyZW50Lm5vZGVzIChibG9jaydzIHNpYmxpbmdzKVxuICAgICAgbGV0IHBhcmVudCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgbGV0IGluZGV4ID0gcGFyZW50Lm5vZGVzLmluZGV4T2YoYmxvY2spO1xuICAgICAgLy8gcmVwbGFjZSB0aGUgKGludmFsaWQpIGJsb2NrIHdpdGggaXQncyBub2Rlc1xuICAgICAgcGFyZW50Lm5vZGVzLnNwbGljZShpbmRleCwgMSwgLi4uYmxvY2subm9kZXMpO1xuICAgIH1cbiAgfSB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCk7XG5cbiAgcHVzaCh7IHR5cGU6ICdlb3MnIH0pO1xuICByZXR1cm4gYXN0O1xufTtcblxudmFyIHBhcnNlXzEkMiA9IHBhcnNlJGM7XG5cbmNvbnN0IHN0cmluZ2lmeSQzID0gc3RyaW5naWZ5JDc7XG5jb25zdCBjb21waWxlID0gY29tcGlsZV8xO1xuY29uc3QgZXhwYW5kJDEgPSBleHBhbmRfMSQxO1xuY29uc3QgcGFyc2UkYiA9IHBhcnNlXzEkMjtcblxuLyoqXG4gKiBFeHBhbmQgdGhlIGdpdmVuIHBhdHRlcm4gb3IgY3JlYXRlIGEgcmVnZXgtY29tcGF0aWJsZSBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzKCd7YSxiLGN9JywgeyBjb21waWxlOiB0cnVlIH0pKTsgLy89PiBbJyhhfGJ8YyknXVxuICogY29uc29sZS5sb2coYnJhY2VzKCd7YSxiLGN9JykpOyAvLz0+IFsnYScsICdiJywgJ2MnXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuY29uc3QgYnJhY2VzJDIgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBsZXQgb3V0cHV0ID0gW107XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgZm9yIChsZXQgcGF0dGVybiBvZiBpbnB1dCkge1xuICAgICAgbGV0IHJlc3VsdCA9IGJyYWNlcyQyLmNyZWF0ZShwYXR0ZXJuLCBvcHRpb25zKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgb3V0cHV0LnB1c2goLi4ucmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IFtdLmNvbmNhdChicmFjZXMkMi5jcmVhdGUoaW5wdXQsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZXhwYW5kID09PSB0cnVlICYmIG9wdGlvbnMubm9kdXBlcyA9PT0gdHJ1ZSkge1xuICAgIG91dHB1dCA9IFsuLi5uZXcgU2V0KG91dHB1dCldO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXG4gKlxuICogYGBganNcbiAqIC8vIGJyYWNlcy5wYXJzZShwYXR0ZXJuLCBbLCBvcHRpb25zXSk7XG4gKiBjb25zdCBhc3QgPSBicmFjZXMucGFyc2UoJ2Eve2IsY30vZCcpO1xuICogY29uc29sZS5sb2coYXN0KTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gQnJhY2UgcGF0dGVybiB0byBwYXJzZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBBU1RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuYnJhY2VzJDIucGFyc2UgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4gcGFyc2UkYihpbnB1dCwgb3B0aW9ucyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJyYWNlcyBzdHJpbmcgZnJvbSBhbiBBU1QsIG9yIGFuIEFTVCBub2RlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGxldCBhc3QgPSBicmFjZXMucGFyc2UoJ2Zvby97YSxifS9iYXInKTtcbiAqIGNvbnNvbGUubG9nKHN0cmluZ2lmeShhc3Qubm9kZXNbMl0pKTsgLy89PiAne2EsYn0nXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIEJyYWNlIHBhdHRlcm4gb3IgQVNULlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgZXhwYW5kZWQgdmFsdWVzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMkMi5zdHJpbmdpZnkgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdHJpbmdpZnkkMyhicmFjZXMkMi5wYXJzZShpbnB1dCwgb3B0aW9ucyksIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZnkkMyhpbnB1dCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIENvbXBpbGVzIGEgYnJhY2UgcGF0dGVybiBpbnRvIGEgcmVnZXgtY29tcGF0aWJsZSwgb3B0aW1pemVkIHN0cmluZy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBbYnJhY2VzXSgjYnJhY2VzKSBmdW5jdGlvbiBieSBkZWZhdWx0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcy5jb21waWxlKCdhL3tiLGN9L2QnKSk7XG4gKiAvLz0+IFsnYS8oYnxjKS9kJ11cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgQnJhY2UgcGF0dGVybiBvciBBU1QuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcyQyLmNvbXBpbGUgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIGlucHV0ID0gYnJhY2VzJDIucGFyc2UoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBjb21waWxlKGlucHV0LCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogRXhwYW5kcyBhIGJyYWNlIHBhdHRlcm4gaW50byBhbiBhcnJheS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZVxuICogbWFpbiBbYnJhY2VzXSgjYnJhY2VzKSBmdW5jdGlvbiB3aGVuIGBvcHRpb25zLmV4cGFuZGAgaXMgdHJ1ZS4gQmVmb3JlXG4gKiB1c2luZyB0aGlzIG1ldGhvZCBpdCdzIHJlY29tbWVuZGVkIHRoYXQgeW91IHJlYWQgdGhlIFtwZXJmb3JtYW5jZSBub3Rlc10oI3BlcmZvcm1hbmNlKSlcbiAqIGFuZCBhZHZhbnRhZ2VzIG9mIHVzaW5nIFsuY29tcGlsZV0oI2NvbXBpbGUpIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzLmV4cGFuZCgnYS97YixjfS9kJykpO1xuICogLy89PiBbJ2EvYi9kJywgJ2EvYy9kJ107XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgQnJhY2UgcGF0dGVyblxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgZXhwYW5kZWQgdmFsdWVzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMkMi5leHBhbmQgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgIGlucHV0ID0gYnJhY2VzJDIucGFyc2UoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG5cbiAgbGV0IHJlc3VsdCA9IGV4cGFuZCQxKGlucHV0LCBvcHRpb25zKTtcblxuICAvLyBmaWx0ZXIgb3V0IGVtcHR5IHN0cmluZ3MgaWYgc3BlY2lmaWVkXG4gIGlmIChvcHRpb25zLm5vZW1wdHkgPT09IHRydWUpIHtcbiAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgLy8gZmlsdGVyIG91dCBkdXBsaWNhdGVzIGlmIHNwZWNpZmllZFxuICBpZiAob3B0aW9ucy5ub2R1cGVzID09PSB0cnVlKSB7XG4gICAgcmVzdWx0ID0gWy4uLm5ldyBTZXQocmVzdWx0KV07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBicmFjZSBwYXR0ZXJuIGFuZCByZXR1cm5zIGVpdGhlciBhbiBleHBhbmRlZCBhcnJheVxuICogKGlmIGBvcHRpb25zLmV4cGFuZGAgaXMgdHJ1ZSksIGEgaGlnaGx5IG9wdGltaXplZCByZWdleC1jb21wYXRpYmxlIHN0cmluZy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBbYnJhY2VzXSgjYnJhY2VzKSBmdW5jdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMuY3JlYXRlKCd1c2VyLXsyMDAuLjMwMH0vcHJvamVjdC17YSxiLGN9LXsxLi4xMH0nKSlcbiAqIC8vPT4gJ3VzZXItKDIwWzAtOV18MlsxLTldWzAtOV18MzAwKS9wcm9qZWN0LShhfGJ8YyktKFsxLTldfDEwKSdcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBCcmFjZSBwYXR0ZXJuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcyQyLmNyZWF0ZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChpbnB1dCA9PT0gJycgfHwgaW5wdXQubGVuZ3RoIDwgMykge1xuICAgIHJldHVybiBbaW5wdXRdO1xuICB9XG5cbiByZXR1cm4gb3B0aW9ucy5leHBhbmQgIT09IHRydWVcbiAgICA/IGJyYWNlcyQyLmNvbXBpbGUoaW5wdXQsIG9wdGlvbnMpXG4gICAgOiBicmFjZXMkMi5leHBhbmQoaW5wdXQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgXCJicmFjZXNcIlxuICovXG5cbnZhciBicmFjZXNfMSA9IGJyYWNlcyQyO1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSQkMCQ2O1xuY29uc3QgYnJhY2VzJDEgPSBicmFjZXNfMTtcbmNvbnN0IHBpY29tYXRjaCQyID0gcGljb21hdGNoRXhwb3J0cztcbmNvbnN0IHV0aWxzJGIgPSB1dGlscyRrO1xuY29uc3QgaXNFbXB0eVN0cmluZyA9IHZhbCA9PiB2YWwgPT09ICcnIHx8IHZhbCA9PT0gJy4vJztcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCBtYXRjaCBvbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tKGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tKFsnYS5qcycsICdhLnR4dCddLCBbJyouanMnXSkpO1xuICogLy89PiBbICdhLmpzJyBdXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5PHN0cmluZz59IGBsaXN0YCBMaXN0IG9mIHN0cmluZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheTxzdHJpbmc+fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBtYXRjaGVzXG4gKiBAc3VtbWFyeSBmYWxzZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5jb25zdCBtaWNyb21hdGNoJDEgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgcGF0dGVybnMgPSBbXS5jb25jYXQocGF0dGVybnMpO1xuICBsaXN0ID0gW10uY29uY2F0KGxpc3QpO1xuXG4gIGxldCBvbWl0ID0gbmV3IFNldCgpO1xuICBsZXQga2VlcCA9IG5ldyBTZXQoKTtcbiAgbGV0IGl0ZW1zID0gbmV3IFNldCgpO1xuICBsZXQgbmVnYXRpdmVzID0gMDtcblxuICBsZXQgb25SZXN1bHQgPSBzdGF0ZSA9PiB7XG4gICAgaXRlbXMuYWRkKHN0YXRlLm91dHB1dCk7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5vblJlc3VsdCkge1xuICAgICAgb3B0aW9ucy5vblJlc3VsdChzdGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgaXNNYXRjaCA9IHBpY29tYXRjaCQyKFN0cmluZyhwYXR0ZXJuc1tpXSksIHsgLi4ub3B0aW9ucywgb25SZXN1bHQgfSwgdHJ1ZSk7XG4gICAgbGV0IG5lZ2F0ZWQgPSBpc01hdGNoLnN0YXRlLm5lZ2F0ZWQgfHwgaXNNYXRjaC5zdGF0ZS5uZWdhdGVkRXh0Z2xvYjtcbiAgICBpZiAobmVnYXRlZCkgbmVnYXRpdmVzKys7XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIGxpc3QpIHtcbiAgICAgIGxldCBtYXRjaGVkID0gaXNNYXRjaChpdGVtLCB0cnVlKTtcblxuICAgICAgbGV0IG1hdGNoID0gbmVnYXRlZCA/ICFtYXRjaGVkLmlzTWF0Y2ggOiBtYXRjaGVkLmlzTWF0Y2g7XG4gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcblxuICAgICAgaWYgKG5lZ2F0ZWQpIHtcbiAgICAgICAgb21pdC5hZGQobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb21pdC5kZWxldGUobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgICBrZWVwLmFkZChtYXRjaGVkLm91dHB1dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IHJlc3VsdCA9IG5lZ2F0aXZlcyA9PT0gcGF0dGVybnMubGVuZ3RoID8gWy4uLml0ZW1zXSA6IFsuLi5rZWVwXTtcbiAgbGV0IG1hdGNoZXMgPSByZXN1bHQuZmlsdGVyKGl0ZW0gPT4gIW9taXQuaGFzKGl0ZW0pKTtcblxuICBpZiAob3B0aW9ucyAmJiBtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChvcHRpb25zLmZhaWxnbG9iID09PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1hdGNoZXMgZm91bmQgZm9yIFwiJHtwYXR0ZXJucy5qb2luKCcsICcpfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubm9udWxsID09PSB0cnVlIHx8IG9wdGlvbnMubnVsbGdsb2IgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnVuZXNjYXBlID8gcGF0dGVybnMubWFwKHAgPT4gcC5yZXBsYWNlKC9cXFxcL2csICcnKSkgOiBwYXR0ZXJucztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlcztcbn07XG5cbi8qKlxuICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqL1xuXG5taWNyb21hdGNoJDEubWF0Y2ggPSBtaWNyb21hdGNoJDE7XG5cbi8qKlxuICogUmV0dXJucyBhIG1hdGNoZXIgZnVuY3Rpb24gZnJvbSB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybmAgYW5kIGBvcHRpb25zYC5cbiAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiB0YWtlcyBhIHN0cmluZyB0byBtYXRjaCBhcyBpdHMgb25seSBhcmd1bWVudCBhbmQgcmV0dXJuc1xuICogdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgbWF0Y2guXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubWF0Y2hlcihwYXR0ZXJuWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IGlzTWF0Y2ggPSBtbS5tYXRjaGVyKCcqLiEoKmEpJyk7XG4gKiBjb25zb2xlLmxvZyhpc01hdGNoKCdhLmEnKSk7IC8vPT4gZmFsc2VcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYicpKTsgLy89PiB0cnVlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgR2xvYiBwYXR0ZXJuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gUmV0dXJucyBhIG1hdGNoZXIgZnVuY3Rpb24uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gkMS5tYXRjaGVyID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHBpY29tYXRjaCQyKHBhdHRlcm4sIG9wdGlvbnMpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiAqKmFueSoqIG9mIHRoZSBnaXZlbiBnbG9iIGBwYXR0ZXJuc2AgbWF0Y2ggdGhlIHNwZWNpZmllZCBgc3RyaW5nYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5pc01hdGNoKHN0cmluZywgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uaXNNYXRjaCgnYS5hJywgWydiLionLCAnKi5hJ10pKTsgLy89PiB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5pc01hdGNoKCdhLmEnLCAnYi4qJykpOyAvLz0+IGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYCBUaGUgc3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYFtvcHRpb25zXWAgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpLlxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwYXR0ZXJucyBtYXRjaCBgc3RyYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoJDEuaXNNYXRjaCA9IChzdHIsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiBwaWNvbWF0Y2gkMihwYXR0ZXJucywgb3B0aW9ucykoc3RyKTtcblxuLyoqXG4gKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICovXG5cbm1pY3JvbWF0Y2gkMS5hbnkgPSBtaWNyb21hdGNoJDEuaXNNYXRjaDtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJpbmdzIHRoYXQgXyoqZG8gbm90IG1hdGNoIGFueSoqXyBvZiB0aGUgZ2l2ZW4gYHBhdHRlcm5zYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5ub3QobGlzdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0ubm90KFsnYS5hJywgJ2IuYicsICdjLmMnXSwgJyouYScpKTtcbiAqIC8vPT4gWydiLmInLCAnYy5jJ11cbiAqIGBgYFxuICogQHBhcmFtIHtBcnJheX0gYGxpc3RgIEFycmF5IG9mIHN0cmluZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgKipkbyBub3QgbWF0Y2gqKiB0aGUgZ2l2ZW4gcGF0dGVybnMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gkMS5ub3QgPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBwYXR0ZXJucyA9IFtdLmNvbmNhdChwYXR0ZXJucykubWFwKFN0cmluZyk7XG4gIGxldCByZXN1bHQgPSBuZXcgU2V0KCk7XG4gIGxldCBpdGVtcyA9IFtdO1xuXG4gIGxldCBvblJlc3VsdCA9IHN0YXRlID0+IHtcbiAgICBpZiAob3B0aW9ucy5vblJlc3VsdCkgb3B0aW9ucy5vblJlc3VsdChzdGF0ZSk7XG4gICAgaXRlbXMucHVzaChzdGF0ZS5vdXRwdXQpO1xuICB9O1xuXG4gIGxldCBtYXRjaGVzID0gbmV3IFNldChtaWNyb21hdGNoJDEobGlzdCwgcGF0dGVybnMsIHsgLi4ub3B0aW9ucywgb25SZXN1bHQgfSkpO1xuXG4gIGZvciAobGV0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBpZiAoIW1hdGNoZXMuaGFzKGl0ZW0pKSB7XG4gICAgICByZXN1bHQuYWRkKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLnJlc3VsdF07XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYHN0cmluZ2AgY29udGFpbnMgdGhlIGdpdmVuIHBhdHRlcm4uIFNpbWlsYXJcbiAqIHRvIFsuaXNNYXRjaF0oI2lzTWF0Y2gpIGJ1dCB0aGUgcGF0dGVybiBjYW4gbWF0Y2ggYW55IHBhcnQgb2YgdGhlIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogdmFyIG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0uY29udGFpbnMoc3RyaW5nLCBwYXR0ZXJuWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmNvbnRhaW5zKCdhYS9iYi9jYycsICcqYicpKTtcbiAqIC8vPT4gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uY29udGFpbnMoJ2FhL2JiL2NjJywgJypkJykpO1xuICogLy89PiBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0cmAgVGhlIHN0cmluZyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIEdsb2IgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlIHBhdHRlcm5zIG1hdGNoZXMgYW55IHBhcnQgb2YgYHN0cmAuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gkMS5jb250YWlucyA9IChzdHIsIHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmc6IFwiJHt1dGlsLmluc3BlY3Qoc3RyKX1cImApO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zb21lKHAgPT4gbWljcm9tYXRjaCQxLmNvbnRhaW5zKHN0ciwgcCwgb3B0aW9ucykpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgIGlmIChpc0VtcHR5U3RyaW5nKHN0cikgfHwgaXNFbXB0eVN0cmluZyhwYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHIuaW5jbHVkZXMocGF0dGVybikgfHwgKHN0ci5zdGFydHNXaXRoKCcuLycpICYmIHN0ci5zbGljZSgyKS5pbmNsdWRlcyhwYXR0ZXJuKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaWNyb21hdGNoJDEuaXNNYXRjaChzdHIsIHBhdHRlcm4sIHsgLi4ub3B0aW9ucywgY29udGFpbnM6IHRydWUgfSk7XG59O1xuXG4vKipcbiAqIEZpbHRlciB0aGUga2V5cyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIGBnbG9iYCBwYXR0ZXJuXG4gKiBhbmQgYG9wdGlvbnNgLiBEb2VzIG5vdCBhdHRlbXB0IHRvIG1hdGNoIG5lc3RlZCBrZXlzLiBJZiB5b3UgbmVlZCB0aGlzIGZlYXR1cmUsXG4gKiB1c2UgW2dsb2Itb2JqZWN0XVtdIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubWF0Y2hLZXlzKG9iamVjdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3Qgb2JqID0geyBhYTogJ2EnLCBhYjogJ2InLCBhYzogJ2MnIH07XG4gKiBjb25zb2xlLmxvZyhtbS5tYXRjaEtleXMob2JqLCAnKmInKSk7XG4gKiAvLz0+IHsgYWI6ICdiJyB9XG4gKiBgYGBcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb2JqZWN0YCBUaGUgb2JqZWN0IHdpdGgga2V5cyB0byBmaWx0ZXIuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG9ubHkga2V5cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJucy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaCQxLm1hdGNoS2V5cyA9IChvYmosIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGlmICghdXRpbHMkYi5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCcpO1xuICB9XG4gIGxldCBrZXlzID0gbWljcm9tYXRjaCQxKE9iamVjdC5rZXlzKG9iaiksIHBhdHRlcm5zLCBvcHRpb25zKTtcbiAgbGV0IHJlcyA9IHt9O1xuICBmb3IgKGxldCBrZXkgb2Yga2V5cykgcmVzW2tleV0gPSBvYmpba2V5XTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHNvbWUgb2YgdGhlIHN0cmluZ3MgaW4gdGhlIGdpdmVuIGBsaXN0YCBtYXRjaCBhbnkgb2YgdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5zYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5zb21lKGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLnNvbWUoWydmb28uanMnLCAnYmFyLmpzJ10sIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLnNvbWUoWydmb28uanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBsaXN0YCBUaGUgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgdG8gdGVzdC4gUmV0dXJucyBhcyBzb29uIGFzIHRoZSBmaXJzdCBtYXRjaCBpcyBmb3VuZC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IGBwYXR0ZXJuc2AgbWF0Y2hlcyBhbnkgb2YgdGhlIHN0cmluZ3MgaW4gYGxpc3RgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gkMS5zb21lID0gKGxpc3QsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGxldCBpdGVtcyA9IFtdLmNvbmNhdChsaXN0KTtcblxuICBmb3IgKGxldCBwYXR0ZXJuIG9mIFtdLmNvbmNhdChwYXR0ZXJucykpIHtcbiAgICBsZXQgaXNNYXRjaCA9IHBpY29tYXRjaCQyKFN0cmluZyhwYXR0ZXJuKSwgb3B0aW9ucyk7XG4gICAgaWYgKGl0ZW1zLnNvbWUoaXRlbSA9PiBpc01hdGNoKGl0ZW0pKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGV2ZXJ5IHN0cmluZyBpbiB0aGUgZ2l2ZW4gYGxpc3RgIG1hdGNoZXNcbiAqIGFueSBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmV2ZXJ5KGxpc3QsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KCdmb28uanMnLCBbJ2Zvby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5ldmVyeShbJ2Zvby5qcycsICdiYXIuanMnXSwgWycqLmpzJ10pKTtcbiAqIC8vIHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KFsnZm9vLmpzJywgJ2Jhci5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICogY29uc29sZS5sb2cobW0uZXZlcnkoWydmb28uanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBsaXN0YCBUaGUgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYWxsIGBwYXR0ZXJuc2AgbWF0Y2hlcyBhbGwgb2YgdGhlIHN0cmluZ3MgaW4gYGxpc3RgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gkMS5ldmVyeSA9IChsaXN0LCBwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBsZXQgaXRlbXMgPSBbXS5jb25jYXQobGlzdCk7XG5cbiAgZm9yIChsZXQgcGF0dGVybiBvZiBbXS5jb25jYXQocGF0dGVybnMpKSB7XG4gICAgbGV0IGlzTWF0Y2ggPSBwaWNvbWF0Y2gkMihTdHJpbmcocGF0dGVybiksIG9wdGlvbnMpO1xuICAgIGlmICghaXRlbXMuZXZlcnkoaXRlbSA9PiBpc01hdGNoKGl0ZW0pKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmICoqYWxsKiogb2YgdGhlIGdpdmVuIGBwYXR0ZXJuc2AgbWF0Y2hcbiAqIHRoZSBzcGVjaWZpZWQgc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmFsbChzdHJpbmcsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWydmb28uanMnXSkpO1xuICogLy8gdHJ1ZVxuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5hbGwoJ2Zvby5qcycsIFsnKi5qcycsICdmb28uanMnXSkpO1xuICogLy8gdHJ1ZVxuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWycqLmpzJywgJ2YqJywgJypvKicsICcqby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgc3RyYCBUaGUgc3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwYXR0ZXJucyBtYXRjaCBgc3RyYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoJDEuYWxsID0gKHN0ciwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmc6IFwiJHt1dGlsLmluc3BlY3Qoc3RyKX1cImApO1xuICB9XG5cbiAgcmV0dXJuIFtdLmNvbmNhdChwYXR0ZXJucykuZXZlcnkocCA9PiBwaWNvbWF0Y2gkMihwLCBvcHRpb25zKShzdHIpKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBtYXRjaGVzIGNhcHR1cmVkIGJ5IGBwYXR0ZXJuYCBpbiBgc3RyaW5nLCBvciBgbnVsbGAgaWYgdGhlIHBhdHRlcm4gZGlkIG5vdCBtYXRjaC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5jYXB0dXJlKHBhdHRlcm4sIHN0cmluZ1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5jYXB0dXJlKCd0ZXN0LyouanMnLCAndGVzdC9mb28uanMnKSk7XG4gKiAvLz0+IFsnZm9vJ11cbiAqIGNvbnNvbGUubG9nKG1tLmNhcHR1cmUoJ3Rlc3QvKi5qcycsICdmb28vYmFyLmNzcycpKTtcbiAqIC8vPT4gbnVsbFxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGdsb2JgIEdsb2IgcGF0dGVybiB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgU3RyaW5nIHRvIG1hdGNoXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7QXJyYXl8bnVsbH0gUmV0dXJucyBhbiBhcnJheSBvZiBjYXB0dXJlcyBpZiB0aGUgaW5wdXQgbWF0Y2hlcyB0aGUgZ2xvYiBwYXR0ZXJuLCBvdGhlcndpc2UgYG51bGxgLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoJDEuY2FwdHVyZSA9IChnbG9iLCBpbnB1dCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcG9zaXggPSB1dGlscyRiLmlzV2luZG93cyhvcHRpb25zKTtcbiAgbGV0IHJlZ2V4ID0gcGljb21hdGNoJDIubWFrZVJlKFN0cmluZyhnbG9iKSwgeyAuLi5vcHRpb25zLCBjYXB0dXJlOiB0cnVlIH0pO1xuICBsZXQgbWF0Y2ggPSByZWdleC5leGVjKHBvc2l4ID8gdXRpbHMkYi50b1Bvc2l4U2xhc2hlcyhpbnB1dCkgOiBpbnB1dCk7XG5cbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIG1hdGNoLnNsaWNlKDEpLm1hcCh2ID0+IHYgPT09IHZvaWQgMCA/ICcnIDogdik7XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm1ha2VSZShwYXR0ZXJuWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLm1ha2VSZSgnKi5qcycpKTtcbiAqIC8vPT4gL14oPzooXFwuW1xcXFxcXC9dKT8oPyFcXC4pKD89LilbXlxcL10qP1xcLmpzKSQvXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgQSBnbG9iIHBhdHRlcm4gdG8gY29udmVydCB0byByZWdleC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1JlZ0V4cH0gUmV0dXJucyBhIHJlZ2V4IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gcGF0dGVybi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaCQxLm1ha2VSZSA9ICguLi5hcmdzKSA9PiBwaWNvbWF0Y2gkMi5tYWtlUmUoLi4uYXJncyk7XG5cbi8qKlxuICogU2NhbiBhIGdsb2IgcGF0dGVybiB0byBzZXBhcmF0ZSB0aGUgcGF0dGVybiBpbnRvIHNlZ21lbnRzLiBVc2VkXG4gKiBieSB0aGUgW3NwbGl0XSgjc3BsaXQpIG1ldGhvZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiBjb25zdCBzdGF0ZSA9IG1tLnNjYW4ocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gkMS5zY2FuID0gKC4uLmFyZ3MpID0+IHBpY29tYXRjaCQyLnNjYW4oLi4uYXJncyk7XG5cbi8qKlxuICogUGFyc2UgYSBnbG9iIHBhdHRlcm4gdG8gY3JlYXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGZvciBhIHJlZ3VsYXJcbiAqIGV4cHJlc3Npb24uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc3Qgc3RhdGUgPSBtbS5wYXJzZShwYXR0ZXJuWywgb3B0aW9uc10pO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGdsb2JgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggdXNlZnVsIHByb3BlcnRpZXMgYW5kIG91dHB1dCB0byBiZSB1c2VkIGFzIHJlZ2V4IHNvdXJjZSBzdHJpbmcuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gkMS5wYXJzZSA9IChwYXR0ZXJucywgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzID0gW107XG4gIGZvciAobGV0IHBhdHRlcm4gb2YgW10uY29uY2F0KHBhdHRlcm5zIHx8IFtdKSkge1xuICAgIGZvciAobGV0IHN0ciBvZiBicmFjZXMkMShTdHJpbmcocGF0dGVybiksIG9wdGlvbnMpKSB7XG4gICAgICByZXMucHVzaChwaWNvbWF0Y2gkMi5wYXJzZShzdHIsIG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgZ2l2ZW4gYnJhY2UgYHBhdHRlcm5gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB7IGJyYWNlcyB9ID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogY29uc29sZS5sb2coYnJhY2VzKCdmb28ve2EsYixjfS9iYXInKSk7XG4gKiAvLz0+IFsgJ2Zvby8oYXxifGMpL2JhcicgXVxuICpcbiAqIGNvbnNvbGUubG9nKGJyYWNlcygnZm9vL3thLGIsY30vYmFyJywgeyBleHBhbmQ6IHRydWUgfSkpO1xuICogLy89PiBbICdmb28vYS9iYXInLCAnZm9vL2IvYmFyJywgJ2Zvby9jL2JhcicgXVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gIFN0cmluZyB3aXRoIGJyYWNlIHBhdHRlcm4gdG8gcHJvY2Vzcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgQW55IFtvcHRpb25zXSgjb3B0aW9ucykgdG8gY2hhbmdlIGhvdyBleHBhbnNpb24gaXMgcGVyZm9ybWVkLiBTZWUgdGhlIFticmFjZXNdW10gbGlicmFyeSBmb3IgYWxsIGF2YWlsYWJsZSBvcHRpb25zLlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gkMS5icmFjZXMgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICBpZiAoKG9wdGlvbnMgJiYgb3B0aW9ucy5ub2JyYWNlID09PSB0cnVlKSB8fCAhL1xcey4qXFx9Ly50ZXN0KHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIFtwYXR0ZXJuXTtcbiAgfVxuICByZXR1cm4gYnJhY2VzJDEocGF0dGVybiwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEV4cGFuZCBicmFjZXNcbiAqL1xuXG5taWNyb21hdGNoJDEuYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuICByZXR1cm4gbWljcm9tYXRjaCQxLmJyYWNlcyhwYXR0ZXJuLCB7IC4uLm9wdGlvbnMsIGV4cGFuZDogdHJ1ZSB9KTtcbn07XG5cbi8qKlxuICogRXhwb3NlIG1pY3JvbWF0Y2hcbiAqL1xuXG52YXIgbWljcm9tYXRjaF8xID0gbWljcm9tYXRjaCQxO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocGF0dGVybiQxLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxucGF0dGVybiQxLm1hdGNoQW55ID0gcGF0dGVybiQxLmNvbnZlcnRQYXR0ZXJuc1RvUmUgPSBwYXR0ZXJuJDEubWFrZVJlID0gcGF0dGVybiQxLmdldFBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4kMS5leHBhbmRCcmFjZUV4cGFuc2lvbiA9IHBhdHRlcm4kMS5leHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbiA9IHBhdHRlcm4kMS5pc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybiA9IHBhdHRlcm4kMS5lbmRzV2l0aFNsYXNoR2xvYlN0YXIgPSBwYXR0ZXJuJDEuaGFzR2xvYlN0YXIgPSBwYXR0ZXJuJDEuZ2V0QmFzZURpcmVjdG9yeSA9IHBhdHRlcm4kMS5pc1BhdHRlcm5SZWxhdGVkVG9QYXJlbnREaXJlY3RvcnkgPSBwYXR0ZXJuJDEuZ2V0UGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeSA9IHBhdHRlcm4kMS5nZXRQYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkgPSBwYXR0ZXJuJDEuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IHBhdHRlcm4kMS5nZXROZWdhdGl2ZVBhdHRlcm5zID0gcGF0dGVybiQxLmlzUG9zaXRpdmVQYXR0ZXJuID0gcGF0dGVybiQxLmlzTmVnYXRpdmVQYXR0ZXJuID0gcGF0dGVybiQxLmNvbnZlcnRUb05lZ2F0aXZlUGF0dGVybiA9IHBhdHRlcm4kMS5jb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4gPSBwYXR0ZXJuJDEuaXNEeW5hbWljUGF0dGVybiA9IHBhdHRlcm4kMS5pc1N0YXRpY1BhdHRlcm4gPSB2b2lkIDA7XHJcbmNvbnN0IHBhdGgkZiA9IHJlcXVpcmUkJDAkNDtcclxuY29uc3QgZ2xvYlBhcmVudCQxID0gZ2xvYlBhcmVudCQyO1xyXG5jb25zdCBtaWNyb21hdGNoID0gbWljcm9tYXRjaF8xO1xyXG5jb25zdCBHTE9CU1RBUiQxID0gJyoqJztcclxuY29uc3QgRVNDQVBFX1NZTUJPTCA9ICdcXFxcJztcclxuY29uc3QgQ09NTU9OX0dMT0JfU1lNQk9MU19SRSA9IC9bKj9dfF4hLztcclxuY29uc3QgUkVHRVhfQ0hBUkFDVEVSX0NMQVNTX1NZTUJPTFNfUkUgPSAvXFxbW15bXSpdLztcclxuY29uc3QgUkVHRVhfR1JPVVBfU1lNQk9MU19SRSA9IC8oPzpefFteISorP0BdKVxcKFteKF0qXFx8W158XSpcXCkvO1xyXG5jb25zdCBHTE9CX0VYVEVOU0lPTl9TWU1CT0xTX1JFID0gL1shKis/QF1cXChbXihdKlxcKS87XHJcbmNvbnN0IEJSQUNFX0VYUEFOU0lPTl9TRVBBUkFUT1JTX1JFID0gLyx8XFwuXFwuLztcclxuZnVuY3Rpb24gaXNTdGF0aWNQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgcmV0dXJuICFpc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIG9wdGlvbnMpO1xyXG59XHJcbnBhdHRlcm4kMS5pc1N0YXRpY1BhdHRlcm4gPSBpc1N0YXRpY1BhdHRlcm47XHJcbmZ1bmN0aW9uIGlzRHluYW1pY1BhdHRlcm4ocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAvKipcclxuICAgICAqIEEgc3BlY2lhbCBjYXNlIHdpdGggYW4gZW1wdHkgc3RyaW5nIGlzIG5lY2Vzc2FyeSBmb3IgbWF0Y2hpbmcgcGF0dGVybnMgdGhhdCBzdGFydCB3aXRoIGEgZm9yd2FyZCBzbGFzaC5cclxuICAgICAqIEFuIGVtcHR5IHN0cmluZyBjYW5ub3QgYmUgYSBkeW5hbWljIHBhdHRlcm4uXHJcbiAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIHBhdHRlcm4gYC9saWIvKmAgd2lsbCBiZSBzcHJlYWQgaW50byBwYXJ0czogJycsICdsaWInLCAnKicuXHJcbiAgICAgKi9cclxuICAgIGlmIChwYXR0ZXJuID09PSAnJykge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiB0aGUgYGNhc2VTZW5zaXRpdmVNYXRjaGAgb3B0aW9uIGlzIGRpc2FibGVkLCBhbGwgcGF0dGVybnMgbXVzdCBiZSBtYXJrZWQgYXMgZHluYW1pYywgYmVjYXVzZSB3ZSBjYW5ub3QgY2hlY2tcclxuICAgICAqIGZpbGVwYXRoIGRpcmVjdGx5ICh3aXRob3V0IHJlYWQgZGlyZWN0b3J5KS5cclxuICAgICAqL1xyXG4gICAgaWYgKG9wdGlvbnMuY2FzZVNlbnNpdGl2ZU1hdGNoID09PSBmYWxzZSB8fCBwYXR0ZXJuLmluY2x1ZGVzKEVTQ0FQRV9TWU1CT0wpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoQ09NTU9OX0dMT0JfU1lNQk9MU19SRS50ZXN0KHBhdHRlcm4pIHx8IFJFR0VYX0NIQVJBQ1RFUl9DTEFTU19TWU1CT0xTX1JFLnRlc3QocGF0dGVybikgfHwgUkVHRVhfR1JPVVBfU1lNQk9MU19SRS50ZXN0KHBhdHRlcm4pKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAob3B0aW9ucy5leHRnbG9iICE9PSBmYWxzZSAmJiBHTE9CX0VYVEVOU0lPTl9TWU1CT0xTX1JFLnRlc3QocGF0dGVybikpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25zLmJyYWNlRXhwYW5zaW9uICE9PSBmYWxzZSAmJiBoYXNCcmFjZUV4cGFuc2lvbihwYXR0ZXJuKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbnBhdHRlcm4kMS5pc0R5bmFtaWNQYXR0ZXJuID0gaXNEeW5hbWljUGF0dGVybjtcclxuZnVuY3Rpb24gaGFzQnJhY2VFeHBhbnNpb24ocGF0dGVybikge1xyXG4gICAgY29uc3Qgb3BlbmluZ0JyYWNlSW5kZXggPSBwYXR0ZXJuLmluZGV4T2YoJ3snKTtcclxuICAgIGlmIChvcGVuaW5nQnJhY2VJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjbG9zaW5nQnJhY2VJbmRleCA9IHBhdHRlcm4uaW5kZXhPZignfScsIG9wZW5pbmdCcmFjZUluZGV4ICsgMSk7XHJcbiAgICBpZiAoY2xvc2luZ0JyYWNlSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYnJhY2VDb250ZW50ID0gcGF0dGVybi5zbGljZShvcGVuaW5nQnJhY2VJbmRleCwgY2xvc2luZ0JyYWNlSW5kZXgpO1xyXG4gICAgcmV0dXJuIEJSQUNFX0VYUEFOU0lPTl9TRVBBUkFUT1JTX1JFLnRlc3QoYnJhY2VDb250ZW50KTtcclxufVxyXG5mdW5jdGlvbiBjb252ZXJ0VG9Qb3NpdGl2ZVBhdHRlcm4ocGF0dGVybikge1xyXG4gICAgcmV0dXJuIGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pID8gcGF0dGVybi5zbGljZSgxKSA6IHBhdHRlcm47XHJcbn1cclxucGF0dGVybiQxLmNvbnZlcnRUb1Bvc2l0aXZlUGF0dGVybiA9IGNvbnZlcnRUb1Bvc2l0aXZlUGF0dGVybjtcclxuZnVuY3Rpb24gY29udmVydFRvTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pIHtcclxuICAgIHJldHVybiAnIScgKyBwYXR0ZXJuO1xyXG59XHJcbnBhdHRlcm4kMS5jb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4gPSBjb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm47XHJcbmZ1bmN0aW9uIGlzTmVnYXRpdmVQYXR0ZXJuKHBhdHRlcm4pIHtcclxuICAgIHJldHVybiBwYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJiBwYXR0ZXJuWzFdICE9PSAnKCc7XHJcbn1cclxucGF0dGVybiQxLmlzTmVnYXRpdmVQYXR0ZXJuID0gaXNOZWdhdGl2ZVBhdHRlcm47XHJcbmZ1bmN0aW9uIGlzUG9zaXRpdmVQYXR0ZXJuKHBhdHRlcm4pIHtcclxuICAgIHJldHVybiAhaXNOZWdhdGl2ZVBhdHRlcm4ocGF0dGVybik7XHJcbn1cclxucGF0dGVybiQxLmlzUG9zaXRpdmVQYXR0ZXJuID0gaXNQb3NpdGl2ZVBhdHRlcm47XHJcbmZ1bmN0aW9uIGdldE5lZ2F0aXZlUGF0dGVybnMocGF0dGVybnMpIHtcclxuICAgIHJldHVybiBwYXR0ZXJucy5maWx0ZXIoaXNOZWdhdGl2ZVBhdHRlcm4pO1xyXG59XHJcbnBhdHRlcm4kMS5nZXROZWdhdGl2ZVBhdHRlcm5zID0gZ2V0TmVnYXRpdmVQYXR0ZXJucztcclxuZnVuY3Rpb24gZ2V0UG9zaXRpdmVQYXR0ZXJucyQxKHBhdHRlcm5zKSB7XHJcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKGlzUG9zaXRpdmVQYXR0ZXJuKTtcclxufVxyXG5wYXR0ZXJuJDEuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGdldFBvc2l0aXZlUGF0dGVybnMkMTtcclxuLyoqXHJcbiAqIFJldHVybnMgcGF0dGVybnMgdGhhdCBjYW4gYmUgYXBwbGllZCBpbnNpZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyBbJy4vKicsICcqJywgJ2EvKiddXHJcbiAqIGdldFBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeShbJy4vKicsICcqJywgJ2EvKicsICcuLi8qJywgJy4vLi4vKiddKVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KHBhdHRlcm5zKSB7XHJcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKChwYXR0ZXJuKSA9PiAhaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5KHBhdHRlcm4pKTtcclxufVxyXG5wYXR0ZXJuJDEuZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5ID0gZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5O1xyXG4vKipcclxuICogUmV0dXJucyBwYXR0ZXJucyB0byBiZSBleHBhbmRlZCByZWxhdGl2ZSB0byAob3V0c2lkZSkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiAvLyBbJy4uLyonLCAnLi8uLi8qJ11cclxuICogZ2V0UGF0dGVybnNJbnNpZGVDdXJyZW50RGlyZWN0b3J5KFsnLi8qJywgJyonLCAnYS8qJywgJy4uLyonLCAnLi8uLi8qJ10pXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5KHBhdHRlcm5zKSB7XHJcbiAgICByZXR1cm4gcGF0dGVybnMuZmlsdGVyKGlzUGF0dGVyblJlbGF0ZWRUb1BhcmVudERpcmVjdG9yeSk7XHJcbn1cclxucGF0dGVybiQxLmdldFBhdHRlcm5zT3V0c2lkZUN1cnJlbnREaXJlY3RvcnkgPSBnZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5O1xyXG5mdW5jdGlvbiBpc1BhdHRlcm5SZWxhdGVkVG9QYXJlbnREaXJlY3RvcnkocGF0dGVybikge1xyXG4gICAgcmV0dXJuIHBhdHRlcm4uc3RhcnRzV2l0aCgnLi4nKSB8fCBwYXR0ZXJuLnN0YXJ0c1dpdGgoJy4vLi4nKTtcclxufVxyXG5wYXR0ZXJuJDEuaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5ID0gaXNQYXR0ZXJuUmVsYXRlZFRvUGFyZW50RGlyZWN0b3J5O1xyXG5mdW5jdGlvbiBnZXRCYXNlRGlyZWN0b3J5KHBhdHRlcm4pIHtcclxuICAgIHJldHVybiBnbG9iUGFyZW50JDEocGF0dGVybiwgeyBmbGlwQmFja3NsYXNoZXM6IGZhbHNlIH0pO1xyXG59XHJcbnBhdHRlcm4kMS5nZXRCYXNlRGlyZWN0b3J5ID0gZ2V0QmFzZURpcmVjdG9yeTtcclxuZnVuY3Rpb24gaGFzR2xvYlN0YXIocGF0dGVybikge1xyXG4gICAgcmV0dXJuIHBhdHRlcm4uaW5jbHVkZXMoR0xPQlNUQVIkMSk7XHJcbn1cclxucGF0dGVybiQxLmhhc0dsb2JTdGFyID0gaGFzR2xvYlN0YXI7XHJcbmZ1bmN0aW9uIGVuZHNXaXRoU2xhc2hHbG9iU3RhcihwYXR0ZXJuKSB7XHJcbiAgICByZXR1cm4gcGF0dGVybi5lbmRzV2l0aCgnLycgKyBHTE9CU1RBUiQxKTtcclxufVxyXG5wYXR0ZXJuJDEuZW5kc1dpdGhTbGFzaEdsb2JTdGFyID0gZW5kc1dpdGhTbGFzaEdsb2JTdGFyO1xyXG5mdW5jdGlvbiBpc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybihwYXR0ZXJuKSB7XHJcbiAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGgkZi5iYXNlbmFtZShwYXR0ZXJuKTtcclxuICAgIHJldHVybiBlbmRzV2l0aFNsYXNoR2xvYlN0YXIocGF0dGVybikgfHwgaXNTdGF0aWNQYXR0ZXJuKGJhc2VuYW1lKTtcclxufVxyXG5wYXR0ZXJuJDEuaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4gPSBpc0FmZmVjdERlcHRoT2ZSZWFkaW5nUGF0dGVybjtcclxuZnVuY3Rpb24gZXhwYW5kUGF0dGVybnNXaXRoQnJhY2VFeHBhbnNpb24ocGF0dGVybnMpIHtcclxuICAgIHJldHVybiBwYXR0ZXJucy5yZWR1Y2UoKGNvbGxlY3Rpb24sIHBhdHRlcm4pID0+IHtcclxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5jb25jYXQoZXhwYW5kQnJhY2VFeHBhbnNpb24ocGF0dGVybikpO1xyXG4gICAgfSwgW10pO1xyXG59XHJcbnBhdHRlcm4kMS5leHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbiA9IGV4cGFuZFBhdHRlcm5zV2l0aEJyYWNlRXhwYW5zaW9uO1xyXG5mdW5jdGlvbiBleHBhbmRCcmFjZUV4cGFuc2lvbihwYXR0ZXJuKSB7XHJcbiAgICByZXR1cm4gbWljcm9tYXRjaC5icmFjZXMocGF0dGVybiwge1xyXG4gICAgICAgIGV4cGFuZDogdHJ1ZSxcclxuICAgICAgICBub2R1cGVzOiB0cnVlXHJcbiAgICB9KTtcclxufVxyXG5wYXR0ZXJuJDEuZXhwYW5kQnJhY2VFeHBhbnNpb24gPSBleHBhbmRCcmFjZUV4cGFuc2lvbjtcclxuZnVuY3Rpb24gZ2V0UGF0dGVyblBhcnRzKHBhdHRlcm4sIG9wdGlvbnMpIHtcclxuICAgIGxldCB7IHBhcnRzIH0gPSBtaWNyb21hdGNoLnNjYW4ocGF0dGVybiwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyBwYXJ0czogdHJ1ZSB9KSk7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzY2FuIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGFycmF5IGluIHNvbWUgY2FzZXMuXHJcbiAgICAgKiBTZWUgbWljcm9tYXRjaC9waWNvbWF0Y2gjNTggZm9yIG1vcmUgZGV0YWlscy5cclxuICAgICAqL1xyXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHBhcnRzID0gW3BhdHRlcm5dO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc2NhbiBtZXRob2QgZG9lcyBub3QgcmV0dXJuIGFuIGVtcHR5IHBhcnQgZm9yIHRoZSBwYXR0ZXJuIHdpdGggYSBmb3J3YXJkIHNsYXNoLlxyXG4gICAgICogVGhpcyBpcyBhbm90aGVyIHBhcnQgb2YgbWljcm9tYXRjaC9waWNvbWF0Y2gjNTguXHJcbiAgICAgKi9cclxuICAgIGlmIChwYXJ0c1swXS5zdGFydHNXaXRoKCcvJykpIHtcclxuICAgICAgICBwYXJ0c1swXSA9IHBhcnRzWzBdLnNsaWNlKDEpO1xyXG4gICAgICAgIHBhcnRzLnVuc2hpZnQoJycpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhcnRzO1xyXG59XHJcbnBhdHRlcm4kMS5nZXRQYXR0ZXJuUGFydHMgPSBnZXRQYXR0ZXJuUGFydHM7XHJcbmZ1bmN0aW9uIG1ha2VSZShwYXR0ZXJuLCBvcHRpb25zKSB7XHJcbiAgICByZXR1cm4gbWljcm9tYXRjaC5tYWtlUmUocGF0dGVybiwgb3B0aW9ucyk7XHJcbn1cclxucGF0dGVybiQxLm1ha2VSZSA9IG1ha2VSZTtcclxuZnVuY3Rpb24gY29udmVydFBhdHRlcm5zVG9SZShwYXR0ZXJucywgb3B0aW9ucykge1xyXG4gICAgcmV0dXJuIHBhdHRlcm5zLm1hcCgocGF0dGVybikgPT4gbWFrZVJlKHBhdHRlcm4sIG9wdGlvbnMpKTtcclxufVxyXG5wYXR0ZXJuJDEuY29udmVydFBhdHRlcm5zVG9SZSA9IGNvbnZlcnRQYXR0ZXJuc1RvUmU7XHJcbmZ1bmN0aW9uIG1hdGNoQW55KGVudHJ5LCBwYXR0ZXJuc1JlKSB7XHJcbiAgICByZXR1cm4gcGF0dGVybnNSZS5zb21lKChwYXR0ZXJuUmUpID0+IHBhdHRlcm5SZS50ZXN0KGVudHJ5KSk7XHJcbn1cclxucGF0dGVybiQxLm1hdGNoQW55ID0gbWF0Y2hBbnk7XG5cbnZhciBzdHJlYW0kNCA9IHt9O1xuXG4vKlxuICogbWVyZ2UyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vdGVhbWJpdGlvbi9tZXJnZTJcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCBUZWFtYml0aW9uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKi9cbmNvbnN0IFN0cmVhbSA9IHJlcXVpcmUkJDAkNztcbmNvbnN0IFBhc3NUaHJvdWdoID0gU3RyZWFtLlBhc3NUaHJvdWdoO1xuY29uc3Qgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbnZhciBtZXJnZTJfMSA9IG1lcmdlMiQxO1xuXG5mdW5jdGlvbiBtZXJnZTIkMSAoKSB7XG4gIGNvbnN0IHN0cmVhbXNRdWV1ZSA9IFtdO1xuICBjb25zdCBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICBsZXQgbWVyZ2luZyA9IGZhbHNlO1xuICBsZXQgb3B0aW9ucyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcblxuICBpZiAob3B0aW9ucyAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zKSAmJiBvcHRpb25zLnBpcGUgPT0gbnVsbCkge1xuICAgIGFyZ3MucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgY29uc3QgZG9FbmQgPSBvcHRpb25zLmVuZCAhPT0gZmFsc2U7XG4gIGNvbnN0IGRvUGlwZUVycm9yID0gb3B0aW9ucy5waXBlRXJyb3IgPT09IHRydWU7XG4gIGlmIChvcHRpb25zLm9iamVjdE1vZGUgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMub2JqZWN0TW9kZSA9IHRydWU7XG4gIH1cbiAgaWYgKG9wdGlvbnMuaGlnaFdhdGVyTWFyayA9PSBudWxsKSB7XG4gICAgb3B0aW9ucy5oaWdoV2F0ZXJNYXJrID0gNjQgKiAxMDI0O1xuICB9XG4gIGNvbnN0IG1lcmdlZFN0cmVhbSA9IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIGZ1bmN0aW9uIGFkZFN0cmVhbSAoKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgc3RyZWFtc1F1ZXVlLnB1c2gocGF1c2VTdHJlYW1zKGFyZ3VtZW50c1tpXSwgb3B0aW9ucykpO1xuICAgIH1cbiAgICBtZXJnZVN0cmVhbSgpO1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZVN0cmVhbSAoKSB7XG4gICAgaWYgKG1lcmdpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBtZXJnaW5nID0gdHJ1ZTtcblxuICAgIGxldCBzdHJlYW1zID0gc3RyZWFtc1F1ZXVlLnNoaWZ0KCk7XG4gICAgaWYgKCFzdHJlYW1zKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVuZFN0cmVhbSk7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHN0cmVhbXMpKSB7XG4gICAgICBzdHJlYW1zID0gW3N0cmVhbXNdO1xuICAgIH1cblxuICAgIGxldCBwaXBlc0NvdW50ID0gc3RyZWFtcy5sZW5ndGggKyAxO1xuXG4gICAgZnVuY3Rpb24gbmV4dCAoKSB7XG4gICAgICBpZiAoLS1waXBlc0NvdW50ID4gMCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIG1lcmdpbmcgPSBmYWxzZTtcbiAgICAgIG1lcmdlU3RyZWFtKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGlwZSAoc3RyZWFtKSB7XG4gICAgICBmdW5jdGlvbiBvbmVuZCAoKSB7XG4gICAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignbWVyZ2UyVW5waXBlRW5kJywgb25lbmQpO1xuICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICAgICAgaWYgKGRvUGlwZUVycm9yKSB7XG4gICAgICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIG5leHQoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG9uZXJyb3IgKGVycikge1xuICAgICAgICBtZXJnZWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgfVxuICAgICAgLy8gc2tpcCBlbmRlZCBzdHJlYW1cbiAgICAgIGlmIChzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIHN0cmVhbS5vbignbWVyZ2UyVW5waXBlRW5kJywgb25lbmQpO1xuICAgICAgc3RyZWFtLm9uKCdlbmQnLCBvbmVuZCk7XG5cbiAgICAgIGlmIChkb1BpcGVFcnJvcikge1xuICAgICAgICBzdHJlYW0ub24oJ2Vycm9yJywgb25lcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHN0cmVhbS5waXBlKG1lcmdlZFN0cmVhbSwgeyBlbmQ6IGZhbHNlIH0pO1xuICAgICAgLy8gY29tcGF0aWJsZSBmb3Igb2xkIHN0cmVhbVxuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyZWFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcGlwZShzdHJlYW1zW2ldKTtcbiAgICB9XG5cbiAgICBuZXh0KCk7XG4gIH1cblxuICBmdW5jdGlvbiBlbmRTdHJlYW0gKCkge1xuICAgIG1lcmdpbmcgPSBmYWxzZTtcbiAgICAvLyBlbWl0ICdxdWV1ZURyYWluJyB3aGVuIGFsbCBzdHJlYW1zIG1lcmdlZC5cbiAgICBtZXJnZWRTdHJlYW0uZW1pdCgncXVldWVEcmFpbicpO1xuICAgIGlmIChkb0VuZCkge1xuICAgICAgbWVyZ2VkU3RyZWFtLmVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIG1lcmdlZFN0cmVhbS5zZXRNYXhMaXN0ZW5lcnMoMCk7XG4gIG1lcmdlZFN0cmVhbS5hZGQgPSBhZGRTdHJlYW07XG4gIG1lcmdlZFN0cmVhbS5vbigndW5waXBlJywgZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgIHN0cmVhbS5lbWl0KCdtZXJnZTJVbnBpcGVFbmQnKTtcbiAgfSk7XG5cbiAgaWYgKGFyZ3MubGVuZ3RoKSB7XG4gICAgYWRkU3RyZWFtLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9XG4gIHJldHVybiBtZXJnZWRTdHJlYW1cbn1cblxuLy8gY2hlY2sgYW5kIHBhdXNlIHN0cmVhbXMgZm9yIHBpcGUuXG5mdW5jdGlvbiBwYXVzZVN0cmVhbXMgKHN0cmVhbXMsIG9wdGlvbnMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHN0cmVhbXMpKSB7XG4gICAgLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG9sZC1zdHlsZSBzdHJlYW1zXG4gICAgaWYgKCFzdHJlYW1zLl9yZWFkYWJsZVN0YXRlICYmIHN0cmVhbXMucGlwZSkge1xuICAgICAgc3RyZWFtcyA9IHN0cmVhbXMucGlwZShQYXNzVGhyb3VnaChvcHRpb25zKSk7XG4gICAgfVxuICAgIGlmICghc3RyZWFtcy5fcmVhZGFibGVTdGF0ZSB8fCAhc3RyZWFtcy5wYXVzZSB8fCAhc3RyZWFtcy5waXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgcmVhZGFibGUgc3RyZWFtIGNhbiBiZSBtZXJnZWQuJylcbiAgICB9XG4gICAgc3RyZWFtcy5wYXVzZSgpO1xuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzdHJlYW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBzdHJlYW1zW2ldID0gcGF1c2VTdHJlYW1zKHN0cmVhbXNbaV0sIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyZWFtc1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoc3RyZWFtJDQsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5zdHJlYW0kNC5tZXJnZSA9IHZvaWQgMDtcclxuY29uc3QgbWVyZ2UyID0gbWVyZ2UyXzE7XHJcbmZ1bmN0aW9uIG1lcmdlJDEoc3RyZWFtcykge1xyXG4gICAgY29uc3QgbWVyZ2VkU3RyZWFtID0gbWVyZ2UyKHN0cmVhbXMpO1xyXG4gICAgc3RyZWFtcy5mb3JFYWNoKChzdHJlYW0pID0+IHtcclxuICAgICAgICBzdHJlYW0ub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IG1lcmdlZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycm9yKSk7XHJcbiAgICB9KTtcclxuICAgIG1lcmdlZFN0cmVhbS5vbmNlKCdjbG9zZScsICgpID0+IHByb3BhZ2F0ZUNsb3NlRXZlbnRUb1NvdXJjZXMoc3RyZWFtcykpO1xyXG4gICAgbWVyZ2VkU3RyZWFtLm9uY2UoJ2VuZCcsICgpID0+IHByb3BhZ2F0ZUNsb3NlRXZlbnRUb1NvdXJjZXMoc3RyZWFtcykpO1xyXG4gICAgcmV0dXJuIG1lcmdlZFN0cmVhbTtcclxufVxyXG5zdHJlYW0kNC5tZXJnZSA9IG1lcmdlJDE7XHJcbmZ1bmN0aW9uIHByb3BhZ2F0ZUNsb3NlRXZlbnRUb1NvdXJjZXMoc3RyZWFtcykge1xyXG4gICAgc3RyZWFtcy5mb3JFYWNoKChzdHJlYW0pID0+IHN0cmVhbS5lbWl0KCdjbG9zZScpKTtcclxufVxuXG52YXIgc3RyaW5nJDIgPSB7fTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0cmluZyQyLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuc3RyaW5nJDIuaXNFbXB0eSA9IHN0cmluZyQyLmlzU3RyaW5nID0gdm9pZCAwO1xyXG5mdW5jdGlvbiBpc1N0cmluZyhpbnB1dCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZyc7XHJcbn1cclxuc3RyaW5nJDIuaXNTdHJpbmcgPSBpc1N0cmluZztcclxuZnVuY3Rpb24gaXNFbXB0eSQxKGlucHV0KSB7XHJcbiAgICByZXR1cm4gaW5wdXQgPT09ICcnO1xyXG59XHJcbnN0cmluZyQyLmlzRW1wdHkgPSBpc0VtcHR5JDE7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1dGlscyRnLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudXRpbHMkZy5zdHJpbmcgPSB1dGlscyRnLnN0cmVhbSA9IHV0aWxzJGcucGF0dGVybiA9IHV0aWxzJGcucGF0aCA9IHV0aWxzJGcuZnMgPSB1dGlscyRnLmVycm5vID0gdXRpbHMkZy5hcnJheSA9IHZvaWQgMDtcclxuY29uc3QgYXJyYXkgPSBhcnJheSQxO1xyXG51dGlscyRnLmFycmF5ID0gYXJyYXk7XHJcbmNvbnN0IGVycm5vID0gZXJybm8kMTtcclxudXRpbHMkZy5lcnJubyA9IGVycm5vO1xyXG5jb25zdCBmcyRnID0gZnMkaDtcclxudXRpbHMkZy5mcyA9IGZzJGc7XHJcbmNvbnN0IHBhdGgkZSA9IHBhdGgkaDtcclxudXRpbHMkZy5wYXRoID0gcGF0aCRlO1xyXG5jb25zdCBwYXR0ZXJuID0gcGF0dGVybiQxO1xyXG51dGlscyRnLnBhdHRlcm4gPSBwYXR0ZXJuO1xyXG5jb25zdCBzdHJlYW0kMyA9IHN0cmVhbSQ0O1xyXG51dGlscyRnLnN0cmVhbSA9IHN0cmVhbSQzO1xyXG5jb25zdCBzdHJpbmckMSA9IHN0cmluZyQyO1xyXG51dGlscyRnLnN0cmluZyA9IHN0cmluZyQxO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkodGFza3MsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG50YXNrcy5jb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrID0gdGFza3MuY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzID0gdGFza3MuZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeSA9IHRhc2tzLmdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlID0gdGFza3MuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IHRhc2tzLmNvbnZlcnRQYXR0ZXJuc1RvVGFza3MgPSB0YXNrcy5nZW5lcmF0ZSA9IHZvaWQgMDtcclxuY29uc3QgdXRpbHMkYSA9IHV0aWxzJGc7XHJcbmZ1bmN0aW9uIGdlbmVyYXRlKHBhdHRlcm5zLCBzZXR0aW5ncykge1xyXG4gICAgY29uc3QgcG9zaXRpdmVQYXR0ZXJucyA9IGdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpO1xyXG4gICAgY29uc3QgbmVnYXRpdmVQYXR0ZXJucyA9IGdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlKHBhdHRlcm5zLCBzZXR0aW5ncy5pZ25vcmUpO1xyXG4gICAgY29uc3Qgc3RhdGljUGF0dGVybnMgPSBwb3NpdGl2ZVBhdHRlcm5zLmZpbHRlcigocGF0dGVybikgPT4gdXRpbHMkYS5wYXR0ZXJuLmlzU3RhdGljUGF0dGVybihwYXR0ZXJuLCBzZXR0aW5ncykpO1xyXG4gICAgY29uc3QgZHluYW1pY1BhdHRlcm5zID0gcG9zaXRpdmVQYXR0ZXJucy5maWx0ZXIoKHBhdHRlcm4pID0+IHV0aWxzJGEucGF0dGVybi5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm4sIHNldHRpbmdzKSk7XHJcbiAgICBjb25zdCBzdGF0aWNUYXNrcyA9IGNvbnZlcnRQYXR0ZXJuc1RvVGFza3Moc3RhdGljUGF0dGVybnMsIG5lZ2F0aXZlUGF0dGVybnMsIC8qIGR5bmFtaWMgKi8gZmFsc2UpO1xyXG4gICAgY29uc3QgZHluYW1pY1Rhc2tzID0gY29udmVydFBhdHRlcm5zVG9UYXNrcyhkeW5hbWljUGF0dGVybnMsIG5lZ2F0aXZlUGF0dGVybnMsIC8qIGR5bmFtaWMgKi8gdHJ1ZSk7XHJcbiAgICByZXR1cm4gc3RhdGljVGFza3MuY29uY2F0KGR5bmFtaWNUYXNrcyk7XHJcbn1cclxudGFza3MuZ2VuZXJhdGUgPSBnZW5lcmF0ZTtcclxuLyoqXHJcbiAqIFJldHVybnMgdGFza3MgZ3JvdXBlZCBieSBiYXNpYyBwYXR0ZXJuIGRpcmVjdG9yaWVzLlxyXG4gKlxyXG4gKiBQYXR0ZXJucyB0aGF0IGNhbiBiZSBmb3VuZCBpbnNpZGUgKGAuL2ApIGFuZCBvdXRzaWRlIChgLi4vYCkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkuXHJcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZGlyZWN0b3J5IHRyYXZlcnNhbCBzdGFydHMgYXQgdGhlIGJhc2UgZGlyZWN0b3J5IGFuZCBnb2VzIGRlZXBlci5cclxuICovXHJcbmZ1bmN0aW9uIGNvbnZlcnRQYXR0ZXJuc1RvVGFza3MocG9zaXRpdmUsIG5lZ2F0aXZlLCBkeW5hbWljKSB7XHJcbiAgICBjb25zdCB0YXNrcyA9IFtdO1xyXG4gICAgY29uc3QgcGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeSA9IHV0aWxzJGEucGF0dGVybi5nZXRQYXR0ZXJuc091dHNpZGVDdXJyZW50RGlyZWN0b3J5KHBvc2l0aXZlKTtcclxuICAgIGNvbnN0IHBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSA9IHV0aWxzJGEucGF0dGVybi5nZXRQYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnkocG9zaXRpdmUpO1xyXG4gICAgY29uc3Qgb3V0c2lkZUN1cnJlbnREaXJlY3RvcnlHcm91cCA9IGdyb3VwUGF0dGVybnNCeUJhc2VEaXJlY3RvcnkocGF0dGVybnNPdXRzaWRlQ3VycmVudERpcmVjdG9yeSk7XHJcbiAgICBjb25zdCBpbnNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXAgPSBncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5KHBhdHRlcm5zSW5zaWRlQ3VycmVudERpcmVjdG9yeSk7XHJcbiAgICB0YXNrcy5wdXNoKC4uLmNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcyhvdXRzaWRlQ3VycmVudERpcmVjdG9yeUdyb3VwLCBuZWdhdGl2ZSwgZHluYW1pYykpO1xyXG4gICAgLypcclxuICAgICAqIEZvciB0aGUgc2FrZSBvZiByZWR1Y2luZyBmdXR1cmUgYWNjZXNzZXMgdG8gdGhlIGZpbGUgc3lzdGVtLCB3ZSBtZXJnZSBhbGwgdGFza3Mgd2l0aGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxyXG4gICAgICogaW50byBhIGdsb2JhbCB0YXNrLCBpZiBhdCBsZWFzdCBvbmUgcGF0dGVybiByZWZlcnMgdG8gdGhlIHJvb3QgKGAuYCkuIEluIHRoaXMgY2FzZSwgdGhlIGdsb2JhbCB0YXNrIGNvdmVycyB0aGUgcmVzdC5cclxuICAgICAqL1xyXG4gICAgaWYgKCcuJyBpbiBpbnNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXApIHtcclxuICAgICAgICB0YXNrcy5wdXNoKGNvbnZlcnRQYXR0ZXJuR3JvdXBUb1Rhc2soJy4nLCBwYXR0ZXJuc0luc2lkZUN1cnJlbnREaXJlY3RvcnksIG5lZ2F0aXZlLCBkeW5hbWljKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICB0YXNrcy5wdXNoKC4uLmNvbnZlcnRQYXR0ZXJuR3JvdXBzVG9UYXNrcyhpbnNpZGVDdXJyZW50RGlyZWN0b3J5R3JvdXAsIG5lZ2F0aXZlLCBkeW5hbWljKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFza3M7XHJcbn1cclxudGFza3MuY29udmVydFBhdHRlcm5zVG9UYXNrcyA9IGNvbnZlcnRQYXR0ZXJuc1RvVGFza3M7XHJcbmZ1bmN0aW9uIGdldFBvc2l0aXZlUGF0dGVybnMocGF0dGVybnMpIHtcclxuICAgIHJldHVybiB1dGlscyRhLnBhdHRlcm4uZ2V0UG9zaXRpdmVQYXR0ZXJucyhwYXR0ZXJucyk7XHJcbn1cclxudGFza3MuZ2V0UG9zaXRpdmVQYXR0ZXJucyA9IGdldFBvc2l0aXZlUGF0dGVybnM7XHJcbmZ1bmN0aW9uIGdldE5lZ2F0aXZlUGF0dGVybnNBc1Bvc2l0aXZlKHBhdHRlcm5zLCBpZ25vcmUpIHtcclxuICAgIGNvbnN0IG5lZ2F0aXZlID0gdXRpbHMkYS5wYXR0ZXJuLmdldE5lZ2F0aXZlUGF0dGVybnMocGF0dGVybnMpLmNvbmNhdChpZ25vcmUpO1xyXG4gICAgY29uc3QgcG9zaXRpdmUgPSBuZWdhdGl2ZS5tYXAodXRpbHMkYS5wYXR0ZXJuLmNvbnZlcnRUb1Bvc2l0aXZlUGF0dGVybik7XHJcbiAgICByZXR1cm4gcG9zaXRpdmU7XHJcbn1cclxudGFza3MuZ2V0TmVnYXRpdmVQYXR0ZXJuc0FzUG9zaXRpdmUgPSBnZXROZWdhdGl2ZVBhdHRlcm5zQXNQb3NpdGl2ZTtcclxuZnVuY3Rpb24gZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeShwYXR0ZXJucykge1xyXG4gICAgY29uc3QgZ3JvdXAgPSB7fTtcclxuICAgIHJldHVybiBwYXR0ZXJucy5yZWR1Y2UoKGNvbGxlY3Rpb24sIHBhdHRlcm4pID0+IHtcclxuICAgICAgICBjb25zdCBiYXNlID0gdXRpbHMkYS5wYXR0ZXJuLmdldEJhc2VEaXJlY3RvcnkocGF0dGVybik7XHJcbiAgICAgICAgaWYgKGJhc2UgaW4gY29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICBjb2xsZWN0aW9uW2Jhc2VdLnB1c2gocGF0dGVybik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb2xsZWN0aW9uW2Jhc2VdID0gW3BhdHRlcm5dO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcclxuICAgIH0sIGdyb3VwKTtcclxufVxyXG50YXNrcy5ncm91cFBhdHRlcm5zQnlCYXNlRGlyZWN0b3J5ID0gZ3JvdXBQYXR0ZXJuc0J5QmFzZURpcmVjdG9yeTtcclxuZnVuY3Rpb24gY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzKHBvc2l0aXZlLCBuZWdhdGl2ZSwgZHluYW1pYykge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHBvc2l0aXZlKS5tYXAoKGJhc2UpID0+IHtcclxuICAgICAgICByZXR1cm4gY29udmVydFBhdHRlcm5Hcm91cFRvVGFzayhiYXNlLCBwb3NpdGl2ZVtiYXNlXSwgbmVnYXRpdmUsIGR5bmFtaWMpO1xyXG4gICAgfSk7XHJcbn1cclxudGFza3MuY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzID0gY29udmVydFBhdHRlcm5Hcm91cHNUb1Rhc2tzO1xyXG5mdW5jdGlvbiBjb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrKGJhc2UsIHBvc2l0aXZlLCBuZWdhdGl2ZSwgZHluYW1pYykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBkeW5hbWljLFxyXG4gICAgICAgIHBvc2l0aXZlLFxyXG4gICAgICAgIG5lZ2F0aXZlLFxyXG4gICAgICAgIGJhc2UsXHJcbiAgICAgICAgcGF0dGVybnM6IFtdLmNvbmNhdChwb3NpdGl2ZSwgbmVnYXRpdmUubWFwKHV0aWxzJGEucGF0dGVybi5jb252ZXJ0VG9OZWdhdGl2ZVBhdHRlcm4pKVxyXG4gICAgfTtcclxufVxyXG50YXNrcy5jb252ZXJ0UGF0dGVybkdyb3VwVG9UYXNrID0gY29udmVydFBhdHRlcm5Hcm91cFRvVGFzaztcblxudmFyIHBhdHRlcm5zID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYXR0ZXJucywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnBhdHRlcm5zLnJlbW92ZUR1cGxpY2F0ZVNsYXNoZXMgPSBwYXR0ZXJucy50cmFuc2Zvcm0gPSB2b2lkIDA7XHJcbi8qKlxyXG4gKiBNYXRjaGVzIGEgc2VxdWVuY2Ugb2YgdHdvIG9yIG1vcmUgY29uc2VjdXRpdmUgc2xhc2hlcywgZXhjbHVkaW5nIHRoZSBmaXJzdCB0d28gc2xhc2hlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuXHJcbiAqIFRoZSBsYXR0ZXIgaXMgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiB0aGUgZGV2aWNlIHBhdGggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgVU5DIHBhdGguXHJcbiAqIEB0b2RvIHJld3JpdGUgdG8gbmVnYXRpdmUgbG9va2JlaGluZCB3aXRoIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXHJcbiAqL1xyXG5jb25zdCBET1VCTEVfU0xBU0hfUkUkMSA9IC8oPyFeKVxcL3syLH0vZztcclxuZnVuY3Rpb24gdHJhbnNmb3JtKHBhdHRlcm5zKSB7XHJcbiAgICByZXR1cm4gcGF0dGVybnMubWFwKChwYXR0ZXJuKSA9PiByZW1vdmVEdXBsaWNhdGVTbGFzaGVzKHBhdHRlcm4pKTtcclxufVxyXG5wYXR0ZXJucy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XHJcbi8qKlxyXG4gKiBUaGlzIHBhY2thZ2Ugb25seSB3b3JrcyB3aXRoIGZvcndhcmQgc2xhc2hlcyBhcyBhIHBhdGggc2VwYXJhdG9yLlxyXG4gKiBCZWNhdXNlIG9mIHRoaXMsIHdlIGNhbm5vdCB1c2UgdGhlIHN0YW5kYXJkIGBwYXRoLm5vcm1hbGl6ZWAgbWV0aG9kLCBiZWNhdXNlIG9uIFdpbmRvd3MgcGxhdGZvcm0gaXQgd2lsbCB1c2Ugb2YgYmFja3NsYXNoZXMuXHJcbiAqL1xyXG5mdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVTbGFzaGVzKHBhdHRlcm4pIHtcclxuICAgIHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoRE9VQkxFX1NMQVNIX1JFJDEsICcvJyk7XHJcbn1cclxucGF0dGVybnMucmVtb3ZlRHVwbGljYXRlU2xhc2hlcyA9IHJlbW92ZUR1cGxpY2F0ZVNsYXNoZXM7XG5cbnZhciBhc3luYyQ3ID0ge307XG5cbnZhciBhc3luYyQ2ID0ge307XG5cbnZhciBvdXQkMyA9IHt9O1xuXG52YXIgYXN5bmMkNSA9IHt9O1xuXG52YXIgYXN5bmMkNCA9IHt9O1xuXG52YXIgb3V0JDIgPSB7fTtcblxudmFyIGFzeW5jJDMgPSB7fTtcblxudmFyIG91dCQxID0ge307XG5cbnZhciBhc3luYyQyID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhc3luYyQyLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmFzeW5jJDIucmVhZCA9IHZvaWQgMDtcbmZ1bmN0aW9uIHJlYWQkMyhwYXRoLCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICBzZXR0aW5ncy5mcy5sc3RhdChwYXRoLCAobHN0YXRFcnJvciwgbHN0YXQpID0+IHtcbiAgICAgICAgaWYgKGxzdGF0RXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2skMihjYWxsYmFjaywgbHN0YXRFcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsc3RhdC5pc1N5bWJvbGljTGluaygpIHx8ICFzZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2skMihjYWxsYmFjaywgbHN0YXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldHRpbmdzLmZzLnN0YXQocGF0aCwgKHN0YXRFcnJvciwgc3RhdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXRFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayQyKGNhbGxiYWNrLCBzdGF0RXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2skMihjYWxsYmFjaywgbHN0YXQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5tYXJrU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICAgICAgc3RhdC5pc1N5bWJvbGljTGluayA9ICgpID0+IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrJDIoY2FsbGJhY2ssIHN0YXQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmFzeW5jJDIucmVhZCA9IHJlYWQkMztcbmZ1bmN0aW9uIGNhbGxGYWlsdXJlQ2FsbGJhY2skMihjYWxsYmFjaywgZXJyb3IpIHtcbiAgICBjYWxsYmFjayhlcnJvcik7XG59XG5mdW5jdGlvbiBjYWxsU3VjY2Vzc0NhbGxiYWNrJDIoY2FsbGJhY2ssIHJlc3VsdCkge1xuICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG59XG5cbnZhciBzeW5jJDggPSB7fTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHN5bmMkOCwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5zeW5jJDgucmVhZCA9IHZvaWQgMDtcbmZ1bmN0aW9uIHJlYWQkMihwYXRoLCBzZXR0aW5ncykge1xuICAgIGNvbnN0IGxzdGF0ID0gc2V0dGluZ3MuZnMubHN0YXRTeW5jKHBhdGgpO1xuICAgIGlmICghbHN0YXQuaXNTeW1ib2xpY0xpbmsoKSB8fCAhc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rKSB7XG4gICAgICAgIHJldHVybiBsc3RhdDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdCA9IHNldHRpbmdzLmZzLnN0YXRTeW5jKHBhdGgpO1xuICAgICAgICBpZiAoc2V0dGluZ3MubWFya1N5bWJvbGljTGluaykge1xuICAgICAgICAgICAgc3RhdC5pc1N5bWJvbGljTGluayA9ICgpID0+IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXQ7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIXNldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaykge1xuICAgICAgICAgICAgcmV0dXJuIGxzdGF0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cbnN5bmMkOC5yZWFkID0gcmVhZCQyO1xuXG52YXIgc2V0dGluZ3MkMyA9IHt9O1xuXG52YXIgZnMkZiA9IHt9O1xuXG4oZnVuY3Rpb24gKGV4cG9ydHMpIHtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHRleHBvcnRzLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyID0gZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSID0gdm9pZCAwO1xuXHRjb25zdCBmcyA9IHJlcXVpcmUkJDBfX2RlZmF1bHQ7XG5cdGV4cG9ydHMuRklMRV9TWVNURU1fQURBUFRFUiA9IHtcblx0ICAgIGxzdGF0OiBmcy5sc3RhdCxcblx0ICAgIHN0YXQ6IGZzLnN0YXQsXG5cdCAgICBsc3RhdFN5bmM6IGZzLmxzdGF0U3luYyxcblx0ICAgIHN0YXRTeW5jOiBmcy5zdGF0U3luY1xuXHR9O1xuXHRmdW5jdGlvbiBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcihmc01ldGhvZHMpIHtcblx0ICAgIGlmIChmc01ldGhvZHMgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIHJldHVybiBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVI7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIpLCBmc01ldGhvZHMpO1xuXHR9XG5cdGV4cG9ydHMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIgPSBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcjtcbn0gKGZzJGYpKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHNldHRpbmdzJDMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnMkZSA9IGZzJGY7XG5sZXQgU2V0dGluZ3MkMiA9IGNsYXNzIFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5mb2xsb3dTeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmZvbGxvd1N5bWJvbGljTGluaywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZnMgPSBmcyRlLmNyZWF0ZUZpbGVTeXN0ZW1BZGFwdGVyKHRoaXMuX29wdGlvbnMuZnMpO1xuICAgICAgICB0aGlzLm1hcmtTeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm1hcmtTeW1ib2xpY0xpbmssIGZhbHNlKTtcbiAgICAgICAgdGhpcy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmsgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluaywgdHJ1ZSk7XG4gICAgfVxuICAgIF9nZXRWYWx1ZShvcHRpb24sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBvcHRpb24gIT09IG51bGwgJiYgb3B0aW9uICE9PSB2b2lkIDAgPyBvcHRpb24gOiB2YWx1ZTtcbiAgICB9XG59O1xuc2V0dGluZ3MkMy5kZWZhdWx0ID0gU2V0dGluZ3MkMjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KG91dCQxLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbm91dCQxLnN0YXRTeW5jID0gb3V0JDEuc3RhdCA9IG91dCQxLlNldHRpbmdzID0gdm9pZCAwO1xuY29uc3QgYXN5bmMkMSA9IGFzeW5jJDI7XG5jb25zdCBzeW5jJDcgPSBzeW5jJDg7XG5jb25zdCBzZXR0aW5nc18xJDMgPSBzZXR0aW5ncyQzO1xub3V0JDEuU2V0dGluZ3MgPSBzZXR0aW5nc18xJDMuZGVmYXVsdDtcbmZ1bmN0aW9uIHN0YXQkNChwYXRoLCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2ssIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXN5bmMkMS5yZWFkKHBhdGgsIGdldFNldHRpbmdzJDIoKSwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhc3luYyQxLnJlYWQocGF0aCwgZ2V0U2V0dGluZ3MkMihvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spLCBjYWxsYmFjayk7XG59XG5vdXQkMS5zdGF0ID0gc3RhdCQ0O1xuZnVuY3Rpb24gc3RhdFN5bmMocGF0aCwgb3B0aW9uc09yU2V0dGluZ3MpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzJDIob3B0aW9uc09yU2V0dGluZ3MpO1xuICAgIHJldHVybiBzeW5jJDcucmVhZChwYXRoLCBzZXR0aW5ncyk7XG59XG5vdXQkMS5zdGF0U3luYyA9IHN0YXRTeW5jO1xuZnVuY3Rpb24gZ2V0U2V0dGluZ3MkMihzZXR0aW5nc09yT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHNldHRpbmdzT3JPcHRpb25zIGluc3RhbmNlb2Ygc2V0dGluZ3NfMSQzLmRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzT3JPcHRpb25zO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHNldHRpbmdzXzEkMy5kZWZhdWx0KHNldHRpbmdzT3JPcHRpb25zKTtcbn1cblxuLyohIHF1ZXVlLW1pY3JvdGFzay4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuXG5sZXQgcHJvbWlzZTtcblxudmFyIHF1ZXVlTWljcm90YXNrXzEgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbidcbiAgPyBxdWV1ZU1pY3JvdGFzay5iaW5kKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogY29tbW9uanNHbG9iYWwpXG4gIC8vIHJldXNlIHJlc29sdmVkIHByb21pc2UsIGFuZCBhbGxvY2F0ZSBpdCBsYXppbHlcbiAgOiBjYiA9PiAocHJvbWlzZSB8fCAocHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpKSlcbiAgICAudGhlbihjYilcbiAgICAuY2F0Y2goZXJyID0+IHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlcnIgfSwgMCkpO1xuXG4vKiEgcnVuLXBhcmFsbGVsLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5cbnZhciBydW5QYXJhbGxlbF8xID0gcnVuUGFyYWxsZWw7XG5cbmNvbnN0IHF1ZXVlTWljcm90YXNrJDEgPSBxdWV1ZU1pY3JvdGFza18xO1xuXG5mdW5jdGlvbiBydW5QYXJhbGxlbCAodGFza3MsIGNiKSB7XG4gIGxldCByZXN1bHRzLCBwZW5kaW5nLCBrZXlzO1xuICBsZXQgaXNTeW5jID0gdHJ1ZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh0YXNrcykpIHtcbiAgICByZXN1bHRzID0gW107XG4gICAgcGVuZGluZyA9IHRhc2tzLmxlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gT2JqZWN0LmtleXModGFza3MpO1xuICAgIHJlc3VsdHMgPSB7fTtcbiAgICBwZW5kaW5nID0ga2V5cy5sZW5ndGg7XG4gIH1cblxuICBmdW5jdGlvbiBkb25lIChlcnIpIHtcbiAgICBmdW5jdGlvbiBlbmQgKCkge1xuICAgICAgaWYgKGNiKSBjYihlcnIsIHJlc3VsdHMpO1xuICAgICAgY2IgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoaXNTeW5jKSBxdWV1ZU1pY3JvdGFzayQxKGVuZCk7XG4gICAgZWxzZSBlbmQoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVhY2ggKGksIGVyciwgcmVzdWx0KSB7XG4gICAgcmVzdWx0c1tpXSA9IHJlc3VsdDtcbiAgICBpZiAoLS1wZW5kaW5nID09PSAwIHx8IGVycikge1xuICAgICAgZG9uZShlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghcGVuZGluZykge1xuICAgIC8vIGVtcHR5XG4gICAgZG9uZShudWxsKTtcbiAgfSBlbHNlIGlmIChrZXlzKSB7XG4gICAgLy8gb2JqZWN0XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHRhc2tzW2tleV0oZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7IGVhY2goa2V5LCBlcnIsIHJlc3VsdCk7IH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIGFycmF5XG4gICAgdGFza3MuZm9yRWFjaChmdW5jdGlvbiAodGFzaywgaSkge1xuICAgICAgdGFzayhmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsgZWFjaChpLCBlcnIsIHJlc3VsdCk7IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgaXNTeW5jID0gZmFsc2U7XG59XG5cbnZhciBjb25zdGFudHMkMiA9IHt9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RhbnRzJDIsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3RhbnRzJDIuSVNfU1VQUE9SVF9SRUFERElSX1dJVEhfRklMRV9UWVBFUyA9IHZvaWQgMDtcbmNvbnN0IE5PREVfUFJPQ0VTU19WRVJTSU9OX1BBUlRTID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KCcuJyk7XG5pZiAoTk9ERV9QUk9DRVNTX1ZFUlNJT05fUEFSVFNbMF0gPT09IHVuZGVmaW5lZCB8fCBOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUU1sxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGJlaGF2aW9yLiBUaGUgJ3Byb2Nlc3MudmVyc2lvbnMubm9kZScgdmFyaWFibGUgaGFzIGludmFsaWQgdmFsdWU6ICR7cHJvY2Vzcy52ZXJzaW9ucy5ub2RlfWApO1xufVxuY29uc3QgTUFKT1JfVkVSU0lPTiA9IE51bWJlci5wYXJzZUludChOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUU1swXSwgMTApO1xuY29uc3QgTUlOT1JfVkVSU0lPTiA9IE51bWJlci5wYXJzZUludChOT0RFX1BST0NFU1NfVkVSU0lPTl9QQVJUU1sxXSwgMTApO1xuY29uc3QgU1VQUE9SVEVEX01BSk9SX1ZFUlNJT04gPSAxMDtcbmNvbnN0IFNVUFBPUlRFRF9NSU5PUl9WRVJTSU9OID0gMTA7XG5jb25zdCBJU19NQVRDSEVEX0JZX01BSk9SID0gTUFKT1JfVkVSU0lPTiA+IFNVUFBPUlRFRF9NQUpPUl9WRVJTSU9OO1xuY29uc3QgSVNfTUFUQ0hFRF9CWV9NQUpPUl9BTkRfTUlOT1IgPSBNQUpPUl9WRVJTSU9OID09PSBTVVBQT1JURURfTUFKT1JfVkVSU0lPTiAmJiBNSU5PUl9WRVJTSU9OID49IFNVUFBPUlRFRF9NSU5PUl9WRVJTSU9OO1xuLyoqXG4gKiBJUyBgdHJ1ZWAgZm9yIE5vZGUuanMgMTAuMTAgYW5kIGdyZWF0ZXIuXG4gKi9cbmNvbnN0YW50cyQyLklTX1NVUFBPUlRfUkVBRERJUl9XSVRIX0ZJTEVfVFlQRVMgPSBJU19NQVRDSEVEX0JZX01BSk9SIHx8IElTX01BVENIRURfQllfTUFKT1JfQU5EX01JTk9SO1xuXG52YXIgdXRpbHMkOSA9IHt9O1xuXG52YXIgZnMkZCA9IHt9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZnMkZCwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mcyRkLmNyZWF0ZURpcmVudEZyb21TdGF0cyA9IHZvaWQgMDtcbmNsYXNzIERpcmVudEZyb21TdGF0cyB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgc3RhdHMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pc0Jsb2NrRGV2aWNlID0gc3RhdHMuaXNCbG9ja0RldmljZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc0NoYXJhY3RlckRldmljZSA9IHN0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRGlyZWN0b3J5ID0gc3RhdHMuaXNEaXJlY3RvcnkuYmluZChzdGF0cyk7XG4gICAgICAgIHRoaXMuaXNGSUZPID0gc3RhdHMuaXNGSUZPLmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzRmlsZSA9IHN0YXRzLmlzRmlsZS5iaW5kKHN0YXRzKTtcbiAgICAgICAgdGhpcy5pc1NvY2tldCA9IHN0YXRzLmlzU29ja2V0LmJpbmQoc3RhdHMpO1xuICAgICAgICB0aGlzLmlzU3ltYm9saWNMaW5rID0gc3RhdHMuaXNTeW1ib2xpY0xpbmsuYmluZChzdGF0cyk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKSB7XG4gICAgcmV0dXJuIG5ldyBEaXJlbnRGcm9tU3RhdHMobmFtZSwgc3RhdHMpO1xufVxuZnMkZC5jcmVhdGVEaXJlbnRGcm9tU3RhdHMgPSBjcmVhdGVEaXJlbnRGcm9tU3RhdHM7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1dGlscyQ5LCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnV0aWxzJDkuZnMgPSB2b2lkIDA7XG5jb25zdCBmcyRjID0gZnMkZDtcbnV0aWxzJDkuZnMgPSBmcyRjO1xuXG52YXIgY29tbW9uJGEgPSB7fTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbW1vbiRhLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbW1vbiRhLmpvaW5QYXRoU2VnbWVudHMgPSB2b2lkIDA7XG5mdW5jdGlvbiBqb2luUGF0aFNlZ21lbnRzJDEoYSwgYiwgc2VwYXJhdG9yKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvcnJlY3QgaGFuZGxpbmcgb2YgY2FzZXMgd2hlbiB0aGUgZmlyc3Qgc2VnbWVudCBpcyBhIHJvb3QgKGAvYCwgYEM6L2ApIG9yIFVOQyBwYXRoIChgLy8/L0M6L2ApLlxuICAgICAqL1xuICAgIGlmIChhLmVuZHNXaXRoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIGEgKyBiO1xuICAgIH1cbiAgICByZXR1cm4gYSArIHNlcGFyYXRvciArIGI7XG59XG5jb21tb24kYS5qb2luUGF0aFNlZ21lbnRzID0gam9pblBhdGhTZWdtZW50cyQxO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoYXN5bmMkMywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5hc3luYyQzLnJlYWRkaXIgPSBhc3luYyQzLnJlYWRkaXJXaXRoRmlsZVR5cGVzID0gYXN5bmMkMy5yZWFkID0gdm9pZCAwO1xuY29uc3QgZnNTdGF0JDUgPSBvdXQkMTtcbmNvbnN0IHJwbCA9IHJ1blBhcmFsbGVsXzE7XG5jb25zdCBjb25zdGFudHNfMSQxID0gY29uc3RhbnRzJDI7XG5jb25zdCB1dGlscyQ4ID0gdXRpbHMkOTtcbmNvbnN0IGNvbW1vbiQ5ID0gY29tbW9uJGE7XG5mdW5jdGlvbiByZWFkJDEoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICBpZiAoIXNldHRpbmdzLnN0YXRzICYmIGNvbnN0YW50c18xJDEuSVNfU1VQUE9SVF9SRUFERElSX1dJVEhfRklMRV9UWVBFUykge1xuICAgICAgICByZWFkZGlyV2l0aEZpbGVUeXBlcyQxKGRpcmVjdG9yeSwgc2V0dGluZ3MsIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZWFkZGlyJDMoZGlyZWN0b3J5LCBzZXR0aW5ncywgY2FsbGJhY2spO1xufVxuYXN5bmMkMy5yZWFkID0gcmVhZCQxO1xuZnVuY3Rpb24gcmVhZGRpcldpdGhGaWxlVHlwZXMkMShkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgIHNldHRpbmdzLmZzLnJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSwgKHJlYWRkaXJFcnJvciwgZGlyZW50cykgPT4ge1xuICAgICAgICBpZiAocmVhZGRpckVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrJDEoY2FsbGJhY2ssIHJlYWRkaXJFcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGRpcmVudHMubWFwKChkaXJlbnQpID0+ICh7XG4gICAgICAgICAgICBkaXJlbnQsXG4gICAgICAgICAgICBuYW1lOiBkaXJlbnQubmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGNvbW1vbiQ5LmpvaW5QYXRoU2VnbWVudHMoZGlyZWN0b3J5LCBkaXJlbnQubmFtZSwgc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpXG4gICAgICAgIH0pKTtcbiAgICAgICAgaWYgKCFzZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzKSB7XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrJDEoY2FsbGJhY2ssIGVudHJpZXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhc2tzID0gZW50cmllcy5tYXAoKGVudHJ5KSA9PiBtYWtlUnBsVGFza0VudHJ5KGVudHJ5LCBzZXR0aW5ncykpO1xuICAgICAgICBycGwodGFza3MsIChycGxFcnJvciwgcnBsRW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKHJwbEVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2FsbEZhaWx1cmVDYWxsYmFjayQxKGNhbGxiYWNrLCBycGxFcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbFN1Y2Nlc3NDYWxsYmFjayQxKGNhbGxiYWNrLCBycGxFbnRyaWVzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5hc3luYyQzLnJlYWRkaXJXaXRoRmlsZVR5cGVzID0gcmVhZGRpcldpdGhGaWxlVHlwZXMkMTtcbmZ1bmN0aW9uIG1ha2VScGxUYXNrRW50cnkoZW50cnksIHNldHRpbmdzKSB7XG4gICAgcmV0dXJuIChkb25lKSA9PiB7XG4gICAgICAgIGlmICghZW50cnkuZGlyZW50LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgIGRvbmUobnVsbCwgZW50cnkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNldHRpbmdzLmZzLnN0YXQoZW50cnkucGF0aCwgKHN0YXRFcnJvciwgc3RhdHMpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0RXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoc3RhdEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb25lKG51bGwsIGVudHJ5KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeS5kaXJlbnQgPSB1dGlscyQ4LmZzLmNyZWF0ZURpcmVudEZyb21TdGF0cyhlbnRyeS5uYW1lLCBzdGF0cyk7XG4gICAgICAgICAgICBkb25lKG51bGwsIGVudHJ5KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHJlYWRkaXIkMyhkaXJlY3RvcnksIHNldHRpbmdzLCBjYWxsYmFjaykge1xuICAgIHNldHRpbmdzLmZzLnJlYWRkaXIoZGlyZWN0b3J5LCAocmVhZGRpckVycm9yLCBuYW1lcykgPT4ge1xuICAgICAgICBpZiAocmVhZGRpckVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjYWxsRmFpbHVyZUNhbGxiYWNrJDEoY2FsbGJhY2ssIHJlYWRkaXJFcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFza3MgPSBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBjb21tb24kOS5qb2luUGF0aFNlZ21lbnRzKGRpcmVjdG9yeSwgbmFtZSwgc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIChkb25lKSA9PiB7XG4gICAgICAgICAgICAgICAgZnNTdGF0JDUuc3RhdChwYXRoLCBzZXR0aW5ncy5mc1N0YXRTZXR0aW5ncywgKGVycm9yLCBzdGF0cykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlbnQ6IHV0aWxzJDguZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3Muc3RhdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnN0YXRzID0gc3RhdHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZG9uZShudWxsLCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcnBsKHRhc2tzLCAocnBsRXJyb3IsIGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChycGxFcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2skMShjYWxsYmFjaywgcnBsRXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxTdWNjZXNzQ2FsbGJhY2skMShjYWxsYmFjaywgZW50cmllcyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuYXN5bmMkMy5yZWFkZGlyID0gcmVhZGRpciQzO1xuZnVuY3Rpb24gY2FsbEZhaWx1cmVDYWxsYmFjayQxKGNhbGxiYWNrLCBlcnJvcikge1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbn1cbmZ1bmN0aW9uIGNhbGxTdWNjZXNzQ2FsbGJhY2skMShjYWxsYmFjaywgcmVzdWx0KSB7XG4gICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbn1cblxudmFyIHN5bmMkNiA9IHt9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoc3luYyQ2LCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnN5bmMkNi5yZWFkZGlyID0gc3luYyQ2LnJlYWRkaXJXaXRoRmlsZVR5cGVzID0gc3luYyQ2LnJlYWQgPSB2b2lkIDA7XG5jb25zdCBmc1N0YXQkNCA9IG91dCQxO1xuY29uc3QgY29uc3RhbnRzXzEgPSBjb25zdGFudHMkMjtcbmNvbnN0IHV0aWxzJDcgPSB1dGlscyQ5O1xuY29uc3QgY29tbW9uJDggPSBjb21tb24kYTtcbmZ1bmN0aW9uIHJlYWQoZGlyZWN0b3J5LCBzZXR0aW5ncykge1xuICAgIGlmICghc2V0dGluZ3Muc3RhdHMgJiYgY29uc3RhbnRzXzEuSVNfU1VQUE9SVF9SRUFERElSX1dJVEhfRklMRV9UWVBFUykge1xuICAgICAgICByZXR1cm4gcmVhZGRpcldpdGhGaWxlVHlwZXMoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG4gICAgfVxuICAgIHJldHVybiByZWFkZGlyJDIoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG59XG5zeW5jJDYucmVhZCA9IHJlYWQ7XG5mdW5jdGlvbiByZWFkZGlyV2l0aEZpbGVUeXBlcyhkaXJlY3RvcnksIHNldHRpbmdzKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IHNldHRpbmdzLmZzLnJlYWRkaXJTeW5jKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBkaXJlbnRzLm1hcCgoZGlyZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgZGlyZW50LFxuICAgICAgICAgICAgbmFtZTogZGlyZW50Lm5hbWUsXG4gICAgICAgICAgICBwYXRoOiBjb21tb24kOC5qb2luUGF0aFNlZ21lbnRzKGRpcmVjdG9yeSwgZGlyZW50Lm5hbWUsIHNldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoZW50cnkuZGlyZW50LmlzU3ltYm9saWNMaW5rKCkgJiYgc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0cyA9IHNldHRpbmdzLmZzLnN0YXRTeW5jKGVudHJ5LnBhdGgpO1xuICAgICAgICAgICAgICAgIGVudHJ5LmRpcmVudCA9IHV0aWxzJDcuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKGVudHJ5Lm5hbWUsIHN0YXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy50aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9KTtcbn1cbnN5bmMkNi5yZWFkZGlyV2l0aEZpbGVUeXBlcyA9IHJlYWRkaXJXaXRoRmlsZVR5cGVzO1xuZnVuY3Rpb24gcmVhZGRpciQyKGRpcmVjdG9yeSwgc2V0dGluZ3MpIHtcbiAgICBjb25zdCBuYW1lcyA9IHNldHRpbmdzLmZzLnJlYWRkaXJTeW5jKGRpcmVjdG9yeSk7XG4gICAgcmV0dXJuIG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyeVBhdGggPSBjb21tb24kOC5qb2luUGF0aFNlZ21lbnRzKGRpcmVjdG9yeSwgbmFtZSwgc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgICAgICBjb25zdCBzdGF0cyA9IGZzU3RhdCQ0LnN0YXRTeW5jKGVudHJ5UGF0aCwgc2V0dGluZ3MuZnNTdGF0U2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBwYXRoOiBlbnRyeVBhdGgsXG4gICAgICAgICAgICBkaXJlbnQ6IHV0aWxzJDcuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKG5hbWUsIHN0YXRzKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2V0dGluZ3Muc3RhdHMpIHtcbiAgICAgICAgICAgIGVudHJ5LnN0YXRzID0gc3RhdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xufVxuc3luYyQ2LnJlYWRkaXIgPSByZWFkZGlyJDI7XG5cbnZhciBzZXR0aW5ncyQyID0ge307XG5cbnZhciBmcyRiID0ge307XG5cbihmdW5jdGlvbiAoZXhwb3J0cykge1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdGV4cG9ydHMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIgPSBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIgPSB2b2lkIDA7XG5cdGNvbnN0IGZzID0gcmVxdWlyZSQkMF9fZGVmYXVsdDtcblx0ZXhwb3J0cy5GSUxFX1NZU1RFTV9BREFQVEVSID0ge1xuXHQgICAgbHN0YXQ6IGZzLmxzdGF0LFxuXHQgICAgc3RhdDogZnMuc3RhdCxcblx0ICAgIGxzdGF0U3luYzogZnMubHN0YXRTeW5jLFxuXHQgICAgc3RhdFN5bmM6IGZzLnN0YXRTeW5jLFxuXHQgICAgcmVhZGRpcjogZnMucmVhZGRpcixcblx0ICAgIHJlYWRkaXJTeW5jOiBmcy5yZWFkZGlyU3luY1xuXHR9O1xuXHRmdW5jdGlvbiBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcihmc01ldGhvZHMpIHtcblx0ICAgIGlmIChmc01ldGhvZHMgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIHJldHVybiBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVI7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkZJTEVfU1lTVEVNX0FEQVBURVIpLCBmc01ldGhvZHMpO1xuXHR9XG5cdGV4cG9ydHMuY3JlYXRlRmlsZVN5c3RlbUFkYXB0ZXIgPSBjcmVhdGVGaWxlU3lzdGVtQWRhcHRlcjtcbn0gKGZzJGIpKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHNldHRpbmdzJDIsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgcGF0aCRkID0gcmVxdWlyZSQkMCQ0O1xuY29uc3QgZnNTdGF0JDMgPSBvdXQkMTtcbmNvbnN0IGZzJGEgPSBmcyRiO1xubGV0IFNldHRpbmdzJDEgPSBjbGFzcyBTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gX29wdGlvbnM7XG4gICAgICAgIHRoaXMuZm9sbG93U3ltYm9saWNMaW5rcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZm9sbG93U3ltYm9saWNMaW5rcywgZmFsc2UpO1xuICAgICAgICB0aGlzLmZzID0gZnMkYS5jcmVhdGVGaWxlU3lzdGVtQWRhcHRlcih0aGlzLl9vcHRpb25zLmZzKTtcbiAgICAgICAgdGhpcy5wYXRoU2VnbWVudFNlcGFyYXRvciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMucGF0aFNlZ21lbnRTZXBhcmF0b3IsIHBhdGgkZC5zZXApO1xuICAgICAgICB0aGlzLnN0YXRzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5zdGF0cywgZmFsc2UpO1xuICAgICAgICB0aGlzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rLCB0cnVlKTtcbiAgICAgICAgdGhpcy5mc1N0YXRTZXR0aW5ncyA9IG5ldyBmc1N0YXQkMy5TZXR0aW5ncyh7XG4gICAgICAgICAgICBmb2xsb3dTeW1ib2xpY0xpbms6IHRoaXMuZm9sbG93U3ltYm9saWNMaW5rcyxcbiAgICAgICAgICAgIGZzOiB0aGlzLmZzLFxuICAgICAgICAgICAgdGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rOiB0aGlzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGlua1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldFZhbHVlKG9wdGlvbiwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbiAhPT0gbnVsbCAmJiBvcHRpb24gIT09IHZvaWQgMCA/IG9wdGlvbiA6IHZhbHVlO1xuICAgIH1cbn07XG5zZXR0aW5ncyQyLmRlZmF1bHQgPSBTZXR0aW5ncyQxO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkob3V0JDIsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xub3V0JDIuU2V0dGluZ3MgPSBvdXQkMi5zY2FuZGlyU3luYyA9IG91dCQyLnNjYW5kaXIgPSB2b2lkIDA7XG5jb25zdCBhc3luYyA9IGFzeW5jJDM7XG5jb25zdCBzeW5jJDUgPSBzeW5jJDY7XG5jb25zdCBzZXR0aW5nc18xJDIgPSBzZXR0aW5ncyQyO1xub3V0JDIuU2V0dGluZ3MgPSBzZXR0aW5nc18xJDIuZGVmYXVsdDtcbmZ1bmN0aW9uIHNjYW5kaXIocGF0aCwgb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFzeW5jLnJlYWQocGF0aCwgZ2V0U2V0dGluZ3MkMSgpLCBvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGFzeW5jLnJlYWQocGF0aCwgZ2V0U2V0dGluZ3MkMShvcHRpb25zT3JTZXR0aW5nc09yQ2FsbGJhY2spLCBjYWxsYmFjayk7XG59XG5vdXQkMi5zY2FuZGlyID0gc2NhbmRpcjtcbmZ1bmN0aW9uIHNjYW5kaXJTeW5jKHBhdGgsIG9wdGlvbnNPclNldHRpbmdzKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyQxKG9wdGlvbnNPclNldHRpbmdzKTtcbiAgICByZXR1cm4gc3luYyQ1LnJlYWQocGF0aCwgc2V0dGluZ3MpO1xufVxub3V0JDIuc2NhbmRpclN5bmMgPSBzY2FuZGlyU3luYztcbmZ1bmN0aW9uIGdldFNldHRpbmdzJDEoc2V0dGluZ3NPck9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChzZXR0aW5nc09yT3B0aW9ucyBpbnN0YW5jZW9mIHNldHRpbmdzXzEkMi5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5nc09yT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBzZXR0aW5nc18xJDIuZGVmYXVsdChzZXR0aW5nc09yT3B0aW9ucyk7XG59XG5cbnZhciBxdWV1ZUV4cG9ydHMgPSB7fTtcbnZhciBxdWV1ZSA9IHtcbiAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIHF1ZXVlRXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IHF1ZXVlRXhwb3J0cyA9IHY7IH0sXG59O1xuXG5mdW5jdGlvbiByZXVzaWZ5JDEgKENvbnN0cnVjdG9yKSB7XG4gIHZhciBoZWFkID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gIHZhciB0YWlsID0gaGVhZDtcblxuICBmdW5jdGlvbiBnZXQgKCkge1xuICAgIHZhciBjdXJyZW50ID0gaGVhZDtcblxuICAgIGlmIChjdXJyZW50Lm5leHQpIHtcbiAgICAgIGhlYWQgPSBjdXJyZW50Lm5leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWQgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAgIHRhaWwgPSBoZWFkO1xuICAgIH1cblxuICAgIGN1cnJlbnQubmV4dCA9IG51bGw7XG5cbiAgICByZXR1cm4gY3VycmVudFxuICB9XG5cbiAgZnVuY3Rpb24gcmVsZWFzZSAob2JqKSB7XG4gICAgdGFpbC5uZXh0ID0gb2JqO1xuICAgIHRhaWwgPSBvYmo7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldDogZ2V0LFxuICAgIHJlbGVhc2U6IHJlbGVhc2VcbiAgfVxufVxuXG52YXIgcmV1c2lmeV8xID0gcmV1c2lmeSQxO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12YXIgKi9cblxudmFyIHJldXNpZnkgPSByZXVzaWZ5XzE7XG5cbmZ1bmN0aW9uIGZhc3RxdWV1ZSAoY29udGV4dCwgd29ya2VyLCBjb25jdXJyZW5jeSkge1xuICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25jdXJyZW5jeSA9IHdvcmtlcjtcbiAgICB3b3JrZXIgPSBjb250ZXh0O1xuICAgIGNvbnRleHQgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNvbmN1cnJlbmN5IDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmFzdHF1ZXVlIGNvbmN1cnJlbmN5IG11c3QgYmUgZ3JlYXRlciB0aGFuIDEnKVxuICB9XG5cbiAgdmFyIGNhY2hlID0gcmV1c2lmeShUYXNrKTtcbiAgdmFyIHF1ZXVlSGVhZCA9IG51bGw7XG4gIHZhciBxdWV1ZVRhaWwgPSBudWxsO1xuICB2YXIgX3J1bm5pbmcgPSAwO1xuICB2YXIgZXJyb3JIYW5kbGVyID0gbnVsbDtcblxuICB2YXIgc2VsZiA9IHtcbiAgICBwdXNoOiBwdXNoLFxuICAgIGRyYWluOiBub29wJDMsXG4gICAgc2F0dXJhdGVkOiBub29wJDMsXG4gICAgcGF1c2U6IHBhdXNlLFxuICAgIHBhdXNlZDogZmFsc2UsXG4gICAgY29uY3VycmVuY3k6IGNvbmN1cnJlbmN5LFxuICAgIHJ1bm5pbmc6IHJ1bm5pbmcsXG4gICAgcmVzdW1lOiByZXN1bWUsXG4gICAgaWRsZTogaWRsZSxcbiAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICBnZXRRdWV1ZTogZ2V0UXVldWUsXG4gICAgdW5zaGlmdDogdW5zaGlmdCxcbiAgICBlbXB0eTogbm9vcCQzLFxuICAgIGtpbGw6IGtpbGwsXG4gICAga2lsbEFuZERyYWluOiBraWxsQW5kRHJhaW4sXG4gICAgZXJyb3I6IGVycm9yXG4gIH07XG5cbiAgcmV0dXJuIHNlbGZcblxuICBmdW5jdGlvbiBydW5uaW5nICgpIHtcbiAgICByZXR1cm4gX3J1bm5pbmdcbiAgfVxuXG4gIGZ1bmN0aW9uIHBhdXNlICgpIHtcbiAgICBzZWxmLnBhdXNlZCA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBsZW5ndGggKCkge1xuICAgIHZhciBjdXJyZW50ID0gcXVldWVIZWFkO1xuICAgIHZhciBjb3VudGVyID0gMDtcblxuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgY291bnRlcisrO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudGVyXG4gIH1cblxuICBmdW5jdGlvbiBnZXRRdWV1ZSAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBxdWV1ZUhlYWQ7XG4gICAgdmFyIHRhc2tzID0gW107XG5cbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgdGFza3MucHVzaChjdXJyZW50LnZhbHVlKTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhc2tzXG4gIH1cblxuICBmdW5jdGlvbiByZXN1bWUgKCkge1xuICAgIGlmICghc2VsZi5wYXVzZWQpIHJldHVyblxuICAgIHNlbGYucGF1c2VkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLmNvbmN1cnJlbmN5OyBpKyspIHtcbiAgICAgIF9ydW5uaW5nKys7XG4gICAgICByZWxlYXNlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaWRsZSAoKSB7XG4gICAgcmV0dXJuIF9ydW5uaW5nID09PSAwICYmIHNlbGYubGVuZ3RoKCkgPT09IDBcbiAgfVxuXG4gIGZ1bmN0aW9uIHB1c2ggKHZhbHVlLCBkb25lKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBjYWNoZS5nZXQoKTtcblxuICAgIGN1cnJlbnQuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgY3VycmVudC5yZWxlYXNlID0gcmVsZWFzZTtcbiAgICBjdXJyZW50LnZhbHVlID0gdmFsdWU7XG4gICAgY3VycmVudC5jYWxsYmFjayA9IGRvbmUgfHwgbm9vcCQzO1xuICAgIGN1cnJlbnQuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuXG4gICAgaWYgKF9ydW5uaW5nID09PSBzZWxmLmNvbmN1cnJlbmN5IHx8IHNlbGYucGF1c2VkKSB7XG4gICAgICBpZiAocXVldWVUYWlsKSB7XG4gICAgICAgIHF1ZXVlVGFpbC5uZXh0ID0gY3VycmVudDtcbiAgICAgICAgcXVldWVUYWlsID0gY3VycmVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSGVhZCA9IGN1cnJlbnQ7XG4gICAgICAgIHF1ZXVlVGFpbCA9IGN1cnJlbnQ7XG4gICAgICAgIHNlbGYuc2F0dXJhdGVkKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF9ydW5uaW5nKys7XG4gICAgICB3b3JrZXIuY2FsbChjb250ZXh0LCBjdXJyZW50LnZhbHVlLCBjdXJyZW50LndvcmtlZCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdW5zaGlmdCAodmFsdWUsIGRvbmUpIHtcbiAgICB2YXIgY3VycmVudCA9IGNhY2hlLmdldCgpO1xuXG4gICAgY3VycmVudC5jb250ZXh0ID0gY29udGV4dDtcbiAgICBjdXJyZW50LnJlbGVhc2UgPSByZWxlYXNlO1xuICAgIGN1cnJlbnQudmFsdWUgPSB2YWx1ZTtcbiAgICBjdXJyZW50LmNhbGxiYWNrID0gZG9uZSB8fCBub29wJDM7XG5cbiAgICBpZiAoX3J1bm5pbmcgPT09IHNlbGYuY29uY3VycmVuY3kgfHwgc2VsZi5wYXVzZWQpIHtcbiAgICAgIGlmIChxdWV1ZUhlYWQpIHtcbiAgICAgICAgY3VycmVudC5uZXh0ID0gcXVldWVIZWFkO1xuICAgICAgICBxdWV1ZUhlYWQgPSBjdXJyZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVIZWFkID0gY3VycmVudDtcbiAgICAgICAgcXVldWVUYWlsID0gY3VycmVudDtcbiAgICAgICAgc2VsZi5zYXR1cmF0ZWQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3J1bm5pbmcrKztcbiAgICAgIHdvcmtlci5jYWxsKGNvbnRleHQsIGN1cnJlbnQudmFsdWUsIGN1cnJlbnQud29ya2VkKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWxlYXNlIChob2xkZXIpIHtcbiAgICBpZiAoaG9sZGVyKSB7XG4gICAgICBjYWNoZS5yZWxlYXNlKGhvbGRlcik7XG4gICAgfVxuICAgIHZhciBuZXh0ID0gcXVldWVIZWFkO1xuICAgIGlmIChuZXh0KSB7XG4gICAgICBpZiAoIXNlbGYucGF1c2VkKSB7XG4gICAgICAgIGlmIChxdWV1ZVRhaWwgPT09IHF1ZXVlSGVhZCkge1xuICAgICAgICAgIHF1ZXVlVGFpbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVIZWFkID0gbmV4dC5uZXh0O1xuICAgICAgICBuZXh0Lm5leHQgPSBudWxsO1xuICAgICAgICB3b3JrZXIuY2FsbChjb250ZXh0LCBuZXh0LnZhbHVlLCBuZXh0LndvcmtlZCk7XG4gICAgICAgIGlmIChxdWV1ZVRhaWwgPT09IG51bGwpIHtcbiAgICAgICAgICBzZWxmLmVtcHR5KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9ydW5uaW5nLS07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgtLV9ydW5uaW5nID09PSAwKSB7XG4gICAgICBzZWxmLmRyYWluKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24ga2lsbCAoKSB7XG4gICAgcXVldWVIZWFkID0gbnVsbDtcbiAgICBxdWV1ZVRhaWwgPSBudWxsO1xuICAgIHNlbGYuZHJhaW4gPSBub29wJDM7XG4gIH1cblxuICBmdW5jdGlvbiBraWxsQW5kRHJhaW4gKCkge1xuICAgIHF1ZXVlSGVhZCA9IG51bGw7XG4gICAgcXVldWVUYWlsID0gbnVsbDtcbiAgICBzZWxmLmRyYWluKCk7XG4gICAgc2VsZi5kcmFpbiA9IG5vb3AkMztcbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yIChoYW5kbGVyKSB7XG4gICAgZXJyb3JIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wJDMgKCkge31cblxuZnVuY3Rpb24gVGFzayAoKSB7XG4gIHRoaXMudmFsdWUgPSBudWxsO1xuICB0aGlzLmNhbGxiYWNrID0gbm9vcCQzO1xuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLnJlbGVhc2UgPSBub29wJDM7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMuZXJyb3JIYW5kbGVyID0gbnVsbDtcblxuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgdGhpcy53b3JrZWQgPSBmdW5jdGlvbiB3b3JrZWQgKGVyciwgcmVzdWx0KSB7XG4gICAgdmFyIGNhbGxiYWNrID0gc2VsZi5jYWxsYmFjaztcbiAgICB2YXIgZXJyb3JIYW5kbGVyID0gc2VsZi5lcnJvckhhbmRsZXI7XG4gICAgdmFyIHZhbCA9IHNlbGYudmFsdWU7XG4gICAgc2VsZi52YWx1ZSA9IG51bGw7XG4gICAgc2VsZi5jYWxsYmFjayA9IG5vb3AkMztcbiAgICBpZiAoc2VsZi5lcnJvckhhbmRsZXIpIHtcbiAgICAgIGVycm9ySGFuZGxlcihlcnIsIHZhbCk7XG4gICAgfVxuICAgIGNhbGxiYWNrLmNhbGwoc2VsZi5jb250ZXh0LCBlcnIsIHJlc3VsdCk7XG4gICAgc2VsZi5yZWxlYXNlKHNlbGYpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBxdWV1ZUFzUHJvbWlzZWQgKGNvbnRleHQsIHdvcmtlciwgY29uY3VycmVuY3kpIHtcbiAgaWYgKHR5cGVvZiBjb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uY3VycmVuY3kgPSB3b3JrZXI7XG4gICAgd29ya2VyID0gY29udGV4dDtcbiAgICBjb250ZXh0ID0gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzeW5jV3JhcHBlciAoYXJnLCBjYikge1xuICAgIHdvcmtlci5jYWxsKHRoaXMsIGFyZylcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgY2IobnVsbCwgcmVzKTtcbiAgICAgIH0sIGNiKTtcbiAgfVxuXG4gIHZhciBxdWV1ZSA9IGZhc3RxdWV1ZShjb250ZXh0LCBhc3luY1dyYXBwZXIsIGNvbmN1cnJlbmN5KTtcblxuICB2YXIgcHVzaENiID0gcXVldWUucHVzaDtcbiAgdmFyIHVuc2hpZnRDYiA9IHF1ZXVlLnVuc2hpZnQ7XG5cbiAgcXVldWUucHVzaCA9IHB1c2g7XG4gIHF1ZXVlLnVuc2hpZnQgPSB1bnNoaWZ0O1xuICBxdWV1ZS5kcmFpbmVkID0gZHJhaW5lZDtcblxuICByZXR1cm4gcXVldWVcblxuICBmdW5jdGlvbiBwdXNoICh2YWx1ZSkge1xuICAgIHZhciBwID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgcHVzaENiKHZhbHVlLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gTGV0J3MgZm9yayB0aGUgcHJvbWlzZSBjaGFpbiB0b1xuICAgIC8vIG1ha2UgdGhlIGVycm9yIGJ1YmJsZSB1cCB0byB0aGUgdXNlciBidXRcbiAgICAvLyBub3QgbGVhZCB0byBhIHVuaGFuZGxlZFJlamVjdGlvblxuICAgIHAuY2F0Y2gobm9vcCQzKTtcblxuICAgIHJldHVybiBwXG4gIH1cblxuICBmdW5jdGlvbiB1bnNoaWZ0ICh2YWx1ZSkge1xuICAgIHZhciBwID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdW5zaGlmdENiKHZhbHVlLCBmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gTGV0J3MgZm9yayB0aGUgcHJvbWlzZSBjaGFpbiB0b1xuICAgIC8vIG1ha2UgdGhlIGVycm9yIGJ1YmJsZSB1cCB0byB0aGUgdXNlciBidXRcbiAgICAvLyBub3QgbGVhZCB0byBhIHVuaGFuZGxlZFJlamVjdGlvblxuICAgIHAuY2F0Y2gobm9vcCQzKTtcblxuICAgIHJldHVybiBwXG4gIH1cblxuICBmdW5jdGlvbiBkcmFpbmVkICgpIHtcbiAgICB2YXIgcHJldmlvdXNEcmFpbiA9IHF1ZXVlLmRyYWluO1xuXG4gICAgdmFyIHAgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcXVldWUuZHJhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHByZXZpb3VzRHJhaW4oKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwXG4gIH1cbn1cblxucXVldWUuZXhwb3J0cyA9IGZhc3RxdWV1ZTtcbnF1ZXVlRXhwb3J0cy5wcm9taXNlID0gcXVldWVBc1Byb21pc2VkO1xuXG52YXIgY29tbW9uJDcgPSB7fTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbW1vbiQ3LCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbW1vbiQ3LmpvaW5QYXRoU2VnbWVudHMgPSBjb21tb24kNy5yZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3IgPSBjb21tb24kNy5pc0FwcGxpZWRGaWx0ZXIgPSBjb21tb24kNy5pc0ZhdGFsRXJyb3IgPSB2b2lkIDA7XG5mdW5jdGlvbiBpc0ZhdGFsRXJyb3Ioc2V0dGluZ3MsIGVycm9yKSB7XG4gICAgaWYgKHNldHRpbmdzLmVycm9yRmlsdGVyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIXNldHRpbmdzLmVycm9yRmlsdGVyKGVycm9yKTtcbn1cbmNvbW1vbiQ3LmlzRmF0YWxFcnJvciA9IGlzRmF0YWxFcnJvcjtcbmZ1bmN0aW9uIGlzQXBwbGllZEZpbHRlcihmaWx0ZXIsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGZpbHRlciA9PT0gbnVsbCB8fCBmaWx0ZXIodmFsdWUpO1xufVxuY29tbW9uJDcuaXNBcHBsaWVkRmlsdGVyID0gaXNBcHBsaWVkRmlsdGVyO1xuZnVuY3Rpb24gcmVwbGFjZVBhdGhTZWdtZW50U2VwYXJhdG9yKGZpbGVwYXRoLCBzZXBhcmF0b3IpIHtcbiAgICByZXR1cm4gZmlsZXBhdGguc3BsaXQoL1svXFxcXF0vKS5qb2luKHNlcGFyYXRvcik7XG59XG5jb21tb24kNy5yZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3IgPSByZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3I7XG5mdW5jdGlvbiBqb2luUGF0aFNlZ21lbnRzKGEsIGIsIHNlcGFyYXRvcikge1xuICAgIGlmIChhID09PSAnJykge1xuICAgICAgICByZXR1cm4gYjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvcnJlY3QgaGFuZGxpbmcgb2YgY2FzZXMgd2hlbiB0aGUgZmlyc3Qgc2VnbWVudCBpcyBhIHJvb3QgKGAvYCwgYEM6L2ApIG9yIFVOQyBwYXRoIChgLy8/L0M6L2ApLlxuICAgICAqL1xuICAgIGlmIChhLmVuZHNXaXRoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIGEgKyBiO1xuICAgIH1cbiAgICByZXR1cm4gYSArIHNlcGFyYXRvciArIGI7XG59XG5jb21tb24kNy5qb2luUGF0aFNlZ21lbnRzID0gam9pblBhdGhTZWdtZW50cztcblxudmFyIHJlYWRlciQxID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWFkZXIkMSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb21tb24kNiA9IGNvbW1vbiQ3O1xubGV0IFJlYWRlciQxID0gY2xhc3MgUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBfcm9vdDtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBjb21tb24kNi5yZXBsYWNlUGF0aFNlZ21lbnRTZXBhcmF0b3IoX3Jvb3QsIF9zZXR0aW5ncy5wYXRoU2VnbWVudFNlcGFyYXRvcik7XG4gICAgfVxufTtcbnJlYWRlciQxLmRlZmF1bHQgPSBSZWFkZXIkMTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGFzeW5jJDQsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlJCQwJDU7XG5jb25zdCBmc1NjYW5kaXIkMiA9IG91dCQyO1xuY29uc3QgZmFzdHEgPSBxdWV1ZUV4cG9ydHM7XG5jb25zdCBjb21tb24kNSA9IGNvbW1vbiQ3O1xuY29uc3QgcmVhZGVyXzEkNCA9IHJlYWRlciQxO1xuY2xhc3MgQXN5bmNSZWFkZXIgZXh0ZW5kcyByZWFkZXJfMSQ0LmRlZmF1bHQge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoX3Jvb3QsIF9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9zY2FuZGlyID0gZnNTY2FuZGlyJDIuc2NhbmRpcjtcbiAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fcXVldWUgPSBmYXN0cSh0aGlzLl93b3JrZXIuYmluZCh0aGlzKSwgdGhpcy5fc2V0dGluZ3MuY29uY3VycmVuY3kpO1xuICAgICAgICB0aGlzLl9pc0ZhdGFsRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcXVldWUuZHJhaW4gPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2lzRmF0YWxFcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCgnZW5kJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlYWQoKSB7XG4gICAgICAgIHRoaXMuX2lzRmF0YWxFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFRvUXVldWUodGhpcy5fcm9vdCwgdGhpcy5fc2V0dGluZ3MuYmFzZVBhdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXI7XG4gICAgfVxuICAgIGdldCBpc0Rlc3Ryb3llZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRGVzdHJveWVkO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5faXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHJlYWRlciBpcyBhbHJlYWR5IGRlc3Ryb3llZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcXVldWUua2lsbEFuZERyYWluKCk7XG4gICAgfVxuICAgIG9uRW50cnkoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5vbignZW50cnknLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIG9uRXJyb3IoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5vbmNlKCdlcnJvcicsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgb25FbmQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5vbmNlKCdlbmQnLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIF9wdXNoVG9RdWV1ZShkaXJlY3RvcnksIGJhc2UpIHtcbiAgICAgICAgY29uc3QgcXVldWVJdGVtID0geyBkaXJlY3RvcnksIGJhc2UgfTtcbiAgICAgICAgdGhpcy5fcXVldWUucHVzaChxdWV1ZUl0ZW0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3dvcmtlcihpdGVtLCBkb25lKSB7XG4gICAgICAgIHRoaXMuX3NjYW5kaXIoaXRlbS5kaXJlY3RvcnksIHRoaXMuX3NldHRpbmdzLmZzU2NhbmRpclNldHRpbmdzLCAoZXJyb3IsIGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRvbmUoZXJyb3IsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRW50cnkoZW50cnksIGl0ZW0uYmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb25lKG51bGwsIHVuZGVmaW5lZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfaGFuZGxlRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRGVzdHJveWVkIHx8ICFjb21tb24kNS5pc0ZhdGFsRXJyb3IodGhpcy5fc2V0dGluZ3MsIGVycm9yKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzRmF0YWxFcnJvciA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICB9XG4gICAgX2hhbmRsZUVudHJ5KGVudHJ5LCBiYXNlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Rlc3Ryb3llZCB8fCB0aGlzLl9pc0ZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmdWxscGF0aCA9IGVudHJ5LnBhdGg7XG4gICAgICAgIGlmIChiYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVudHJ5LnBhdGggPSBjb21tb24kNS5qb2luUGF0aFNlZ21lbnRzKGJhc2UsIGVudHJ5Lm5hbWUsIHRoaXMuX3NldHRpbmdzLnBhdGhTZWdtZW50U2VwYXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbW9uJDUuaXNBcHBsaWVkRmlsdGVyKHRoaXMuX3NldHRpbmdzLmVudHJ5RmlsdGVyLCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXRFbnRyeShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpICYmIGNvbW1vbiQ1LmlzQXBwbGllZEZpbHRlcih0aGlzLl9zZXR0aW5ncy5kZWVwRmlsdGVyLCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hUb1F1ZXVlKGZ1bGxwYXRoLCBiYXNlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBlbnRyeS5wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZW1pdEVudHJ5KGVudHJ5KSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCgnZW50cnknLCBlbnRyeSk7XG4gICAgfVxufVxuYXN5bmMkNC5kZWZhdWx0ID0gQXN5bmNSZWFkZXI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhc3luYyQ1LCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFzeW5jXzEkNCA9IGFzeW5jJDQ7XG5jbGFzcyBBc3luY1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihfcm9vdCwgX3NldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBfcm9vdDtcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSBfc2V0dGluZ3M7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG5ldyBhc3luY18xJDQuZGVmYXVsdCh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSBbXTtcbiAgICB9XG4gICAgcmVhZChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVudHJ5KChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RvcmFnZS5wdXNoKGVudHJ5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVuZCgoKSA9PiB7XG4gICAgICAgICAgICBjYWxsU3VjY2Vzc0NhbGxiYWNrKGNhbGxiYWNrLCB0aGlzLl9zdG9yYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3JlYWRlci5yZWFkKCk7XG4gICAgfVxufVxuYXN5bmMkNS5kZWZhdWx0ID0gQXN5bmNQcm92aWRlcjtcbmZ1bmN0aW9uIGNhbGxGYWlsdXJlQ2FsbGJhY2soY2FsbGJhY2ssIGVycm9yKSB7XG4gICAgY2FsbGJhY2soZXJyb3IpO1xufVxuZnVuY3Rpb24gY2FsbFN1Y2Nlc3NDYWxsYmFjayhjYWxsYmFjaywgZW50cmllcykge1xuICAgIGNhbGxiYWNrKG51bGwsIGVudHJpZXMpO1xufVxuXG52YXIgc3RyZWFtJDIgPSB7fTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0cmVhbSQyLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHN0cmVhbV8xJDUgPSByZXF1aXJlJCQwJDc7XG5jb25zdCBhc3luY18xJDMgPSBhc3luYyQ0O1xuY2xhc3MgU3RyZWFtUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKF9yb290LCBfc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IF9yb290O1xuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IGFzeW5jXzEkMy5kZWZhdWx0KHRoaXMuX3Jvb3QsIHRoaXMuX3NldHRpbmdzKTtcbiAgICAgICAgdGhpcy5fc3RyZWFtID0gbmV3IHN0cmVhbV8xJDUuUmVhZGFibGUoe1xuICAgICAgICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlYWQ6ICgpID0+IHsgfSxcbiAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3JlYWRlci5pc0Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlYWQoKSB7XG4gICAgICAgIHRoaXMuX3JlYWRlci5vbkVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVhZGVyLm9uRW50cnkoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdHJlYW0ucHVzaChlbnRyeSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIub25FbmQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RyZWFtLnB1c2gobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtO1xuICAgIH1cbn1cbnN0cmVhbSQyLmRlZmF1bHQgPSBTdHJlYW1Qcm92aWRlcjtcblxudmFyIHN5bmMkNCA9IHt9O1xuXG52YXIgc3luYyQzID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShzeW5jJDMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZnNTY2FuZGlyJDEgPSBvdXQkMjtcbmNvbnN0IGNvbW1vbiQ0ID0gY29tbW9uJDc7XG5jb25zdCByZWFkZXJfMSQzID0gcmVhZGVyJDE7XG5jbGFzcyBTeW5jUmVhZGVyIGV4dGVuZHMgcmVhZGVyXzEkMy5kZWZhdWx0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fc2NhbmRpciA9IGZzU2NhbmRpciQxLnNjYW5kaXJTeW5jO1xuICAgICAgICB0aGlzLl9zdG9yYWdlID0gW107XG4gICAgICAgIHRoaXMuX3F1ZXVlID0gbmV3IFNldCgpO1xuICAgIH1cbiAgICByZWFkKCkge1xuICAgICAgICB0aGlzLl9wdXNoVG9RdWV1ZSh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncy5iYXNlUGF0aCk7XG4gICAgICAgIHRoaXMuX2hhbmRsZVF1ZXVlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICAgIH1cbiAgICBfcHVzaFRvUXVldWUoZGlyZWN0b3J5LCBiYXNlKSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlLmFkZCh7IGRpcmVjdG9yeSwgYmFzZSB9KTtcbiAgICB9XG4gICAgX2hhbmRsZVF1ZXVlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fcXVldWUudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZURpcmVjdG9yeShpdGVtLmRpcmVjdG9yeSwgaXRlbS5iYXNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfaGFuZGxlRGlyZWN0b3J5KGRpcmVjdG9yeSwgYmFzZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IHRoaXMuX3NjYW5kaXIoZGlyZWN0b3J5LCB0aGlzLl9zZXR0aW5ncy5mc1NjYW5kaXJTZXR0aW5ncyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVFbnRyeShlbnRyeSwgYmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2hhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgICAgIGlmICghY29tbW9uJDQuaXNGYXRhbEVycm9yKHRoaXMuX3NldHRpbmdzLCBlcnJvcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgX2hhbmRsZUVudHJ5KGVudHJ5LCBiYXNlKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gZW50cnkucGF0aDtcbiAgICAgICAgaWYgKGJhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkucGF0aCA9IGNvbW1vbiQ0LmpvaW5QYXRoU2VnbWVudHMoYmFzZSwgZW50cnkubmFtZSwgdGhpcy5fc2V0dGluZ3MucGF0aFNlZ21lbnRTZXBhcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tb24kNC5pc0FwcGxpZWRGaWx0ZXIodGhpcy5fc2V0dGluZ3MuZW50cnlGaWx0ZXIsIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5fcHVzaFRvU3RvcmFnZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpICYmIGNvbW1vbiQ0LmlzQXBwbGllZEZpbHRlcih0aGlzLl9zZXR0aW5ncy5kZWVwRmlsdGVyLCBlbnRyeSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hUb1F1ZXVlKGZ1bGxwYXRoLCBiYXNlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBlbnRyeS5wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfcHVzaFRvU3RvcmFnZShlbnRyeSkge1xuICAgICAgICB0aGlzLl9zdG9yYWdlLnB1c2goZW50cnkpO1xuICAgIH1cbn1cbnN5bmMkMy5kZWZhdWx0ID0gU3luY1JlYWRlcjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHN5bmMkNCwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBzeW5jXzEkMyA9IHN5bmMkMztcbmNsYXNzIFN5bmNQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IoX3Jvb3QsIF9zZXR0aW5ncykge1xuICAgICAgICB0aGlzLl9yb290ID0gX3Jvb3Q7XG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgc3luY18xJDMuZGVmYXVsdCh0aGlzLl9yb290LCB0aGlzLl9zZXR0aW5ncyk7XG4gICAgfVxuICAgIHJlYWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIucmVhZCgpO1xuICAgIH1cbn1cbnN5bmMkNC5kZWZhdWx0ID0gU3luY1Byb3ZpZGVyO1xuXG52YXIgc2V0dGluZ3MkMSA9IHt9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoc2V0dGluZ3MkMSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBwYXRoJGMgPSByZXF1aXJlJCQwJDQ7XG5jb25zdCBmc1NjYW5kaXIgPSBvdXQkMjtcbmNsYXNzIFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5iYXNlUGF0aCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuYmFzZVBhdGgsIHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuY29uY3VycmVuY3kgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmNvbmN1cnJlbmN5LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICAgICAgICB0aGlzLmRlZXBGaWx0ZXIgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmRlZXBGaWx0ZXIsIG51bGwpO1xuICAgICAgICB0aGlzLmVudHJ5RmlsdGVyID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5lbnRyeUZpbHRlciwgbnVsbCk7XG4gICAgICAgIHRoaXMuZXJyb3JGaWx0ZXIgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmVycm9yRmlsdGVyLCBudWxsKTtcbiAgICAgICAgdGhpcy5wYXRoU2VnbWVudFNlcGFyYXRvciA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMucGF0aFNlZ21lbnRTZXBhcmF0b3IsIHBhdGgkYy5zZXApO1xuICAgICAgICB0aGlzLmZzU2NhbmRpclNldHRpbmdzID0gbmV3IGZzU2NhbmRpci5TZXR0aW5ncyh7XG4gICAgICAgICAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiB0aGlzLl9vcHRpb25zLmZvbGxvd1N5bWJvbGljTGlua3MsXG4gICAgICAgICAgICBmczogdGhpcy5fb3B0aW9ucy5mcyxcbiAgICAgICAgICAgIHBhdGhTZWdtZW50U2VwYXJhdG9yOiB0aGlzLl9vcHRpb25zLnBhdGhTZWdtZW50U2VwYXJhdG9yLFxuICAgICAgICAgICAgc3RhdHM6IHRoaXMuX29wdGlvbnMuc3RhdHMsXG4gICAgICAgICAgICB0aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbms6IHRoaXMuX29wdGlvbnMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0VmFsdWUob3B0aW9uLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9uICE9PSBudWxsICYmIG9wdGlvbiAhPT0gdm9pZCAwID8gb3B0aW9uIDogdmFsdWU7XG4gICAgfVxufVxuc2V0dGluZ3MkMS5kZWZhdWx0ID0gU2V0dGluZ3M7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShvdXQkMywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5vdXQkMy5TZXR0aW5ncyA9IG91dCQzLndhbGtTdHJlYW0gPSBvdXQkMy53YWxrU3luYyA9IG91dCQzLndhbGsgPSB2b2lkIDA7XG5jb25zdCBhc3luY18xJDIgPSBhc3luYyQ1O1xuY29uc3Qgc3RyZWFtXzEkNCA9IHN0cmVhbSQyO1xuY29uc3Qgc3luY18xJDIgPSBzeW5jJDQ7XG5jb25zdCBzZXR0aW5nc18xJDEgPSBzZXR0aW5ncyQxO1xub3V0JDMuU2V0dGluZ3MgPSBzZXR0aW5nc18xJDEuZGVmYXVsdDtcbmZ1bmN0aW9uIHdhbGskMihkaXJlY3RvcnksIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjaywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBuZXcgYXN5bmNfMSQyLmRlZmF1bHQoZGlyZWN0b3J5LCBnZXRTZXR0aW5ncygpKS5yZWFkKG9wdGlvbnNPclNldHRpbmdzT3JDYWxsYmFjayk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3IGFzeW5jXzEkMi5kZWZhdWx0KGRpcmVjdG9yeSwgZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3NPckNhbGxiYWNrKSkucmVhZChjYWxsYmFjayk7XG59XG5vdXQkMy53YWxrID0gd2FsayQyO1xuZnVuY3Rpb24gd2Fsa1N5bmMoZGlyZWN0b3J5LCBvcHRpb25zT3JTZXR0aW5ncykge1xuICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3Mob3B0aW9uc09yU2V0dGluZ3MpO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IHN5bmNfMSQyLmRlZmF1bHQoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG4gICAgcmV0dXJuIHByb3ZpZGVyLnJlYWQoKTtcbn1cbm91dCQzLndhbGtTeW5jID0gd2Fsa1N5bmM7XG5mdW5jdGlvbiB3YWxrU3RyZWFtKGRpcmVjdG9yeSwgb3B0aW9uc09yU2V0dGluZ3MpIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKG9wdGlvbnNPclNldHRpbmdzKTtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBzdHJlYW1fMSQ0LmRlZmF1bHQoZGlyZWN0b3J5LCBzZXR0aW5ncyk7XG4gICAgcmV0dXJuIHByb3ZpZGVyLnJlYWQoKTtcbn1cbm91dCQzLndhbGtTdHJlYW0gPSB3YWxrU3RyZWFtO1xuZnVuY3Rpb24gZ2V0U2V0dGluZ3Moc2V0dGluZ3NPck9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChzZXR0aW5nc09yT3B0aW9ucyBpbnN0YW5jZW9mIHNldHRpbmdzXzEkMS5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBzZXR0aW5nc09yT3B0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBzZXR0aW5nc18xJDEuZGVmYXVsdChzZXR0aW5nc09yT3B0aW9ucyk7XG59XG5cbnZhciByZWFkZXIgPSB7fTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlYWRlciwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmNvbnN0IHBhdGgkYiA9IHJlcXVpcmUkJDAkNDtcclxuY29uc3QgZnNTdGF0JDIgPSBvdXQkMTtcclxuY29uc3QgdXRpbHMkNiA9IHV0aWxzJGc7XHJcbmNsYXNzIFJlYWRlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MpIHtcclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcclxuICAgICAgICB0aGlzLl9mc1N0YXRTZXR0aW5ncyA9IG5ldyBmc1N0YXQkMi5TZXR0aW5ncyh7XHJcbiAgICAgICAgICAgIGZvbGxvd1N5bWJvbGljTGluazogdGhpcy5fc2V0dGluZ3MuZm9sbG93U3ltYm9saWNMaW5rcyxcclxuICAgICAgICAgICAgZnM6IHRoaXMuX3NldHRpbmdzLmZzLFxyXG4gICAgICAgICAgICB0aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbms6IHRoaXMuX3NldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3NcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9nZXRGdWxsRW50cnlQYXRoKGZpbGVwYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhdGgkYi5yZXNvbHZlKHRoaXMuX3NldHRpbmdzLmN3ZCwgZmlsZXBhdGgpO1xyXG4gICAgfVxyXG4gICAgX21ha2VFbnRyeShzdGF0cywgcGF0dGVybikge1xyXG4gICAgICAgIGNvbnN0IGVudHJ5ID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBwYXR0ZXJuLFxyXG4gICAgICAgICAgICBwYXRoOiBwYXR0ZXJuLFxyXG4gICAgICAgICAgICBkaXJlbnQ6IHV0aWxzJDYuZnMuY3JlYXRlRGlyZW50RnJvbVN0YXRzKHBhdHRlcm4sIHN0YXRzKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLnN0YXRzKSB7XHJcbiAgICAgICAgICAgIGVudHJ5LnN0YXRzID0gc3RhdHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbnRyeTtcclxuICAgIH1cclxuICAgIF9pc0ZhdGFsRXJyb3IoZXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gIXV0aWxzJDYuZXJybm8uaXNFbm9lbnRDb2RlRXJyb3IoZXJyb3IpICYmICF0aGlzLl9zZXR0aW5ncy5zdXBwcmVzc0Vycm9ycztcclxuICAgIH1cclxufVxyXG5yZWFkZXIuZGVmYXVsdCA9IFJlYWRlcjtcblxudmFyIHN0cmVhbSQxID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHJlYW0kMSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmNvbnN0IHN0cmVhbV8xJDMgPSByZXF1aXJlJCQwJDc7XHJcbmNvbnN0IGZzU3RhdCQxID0gb3V0JDE7XHJcbmNvbnN0IGZzV2FsayQyID0gb3V0JDM7XHJcbmNvbnN0IHJlYWRlcl8xJDIgPSByZWFkZXI7XHJcbmNsYXNzIFJlYWRlclN0cmVhbSBleHRlbmRzIHJlYWRlcl8xJDIuZGVmYXVsdCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgIHRoaXMuX3dhbGtTdHJlYW0gPSBmc1dhbGskMi53YWxrU3RyZWFtO1xyXG4gICAgICAgIHRoaXMuX3N0YXQgPSBmc1N0YXQkMS5zdGF0O1xyXG4gICAgfVxyXG4gICAgZHluYW1pYyhyb290LCBvcHRpb25zKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhbGtTdHJlYW0ocm9vdCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBzdGF0aWMocGF0dGVybnMsIG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBmaWxlcGF0aHMgPSBwYXR0ZXJucy5tYXAodGhpcy5fZ2V0RnVsbEVudHJ5UGF0aCwgdGhpcyk7XHJcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IHN0cmVhbV8xJDMuUGFzc1Rocm91Z2goeyBvYmplY3RNb2RlOiB0cnVlIH0pO1xyXG4gICAgICAgIHN0cmVhbS5fd3JpdGUgPSAoaW5kZXgsIF9lbmMsIGRvbmUpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJ5KGZpbGVwYXRoc1tpbmRleF0sIHBhdHRlcm5zW2luZGV4XSwgb3B0aW9ucylcclxuICAgICAgICAgICAgICAgIC50aGVuKChlbnRyeSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5ICE9PSBudWxsICYmIG9wdGlvbnMuZW50cnlGaWx0ZXIoZW50cnkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBmaWxlcGF0aHMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lbmQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGRvbmUoKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5jYXRjaChkb25lKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXBhdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZShpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcclxuICAgIH1cclxuICAgIF9nZXRFbnRyeShmaWxlcGF0aCwgcGF0dGVybiwgb3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRTdGF0KGZpbGVwYXRoKVxyXG4gICAgICAgICAgICAudGhlbigoc3RhdHMpID0+IHRoaXMuX21ha2VFbnRyeShzdGF0cywgcGF0dGVybikpXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZXJyb3JGaWx0ZXIoZXJyb3IpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9nZXRTdGF0KGZpbGVwYXRoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fc3RhdChmaWxlcGF0aCwgdGhpcy5fZnNTdGF0U2V0dGluZ3MsIChlcnJvciwgc3RhdHMpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciA9PT0gbnVsbCA/IHJlc29sdmUoc3RhdHMpIDogcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuc3RyZWFtJDEuZGVmYXVsdCA9IFJlYWRlclN0cmVhbTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGFzeW5jJDYsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCBmc1dhbGskMSA9IG91dCQzO1xyXG5jb25zdCByZWFkZXJfMSQxID0gcmVhZGVyO1xyXG5jb25zdCBzdHJlYW1fMSQyID0gc3RyZWFtJDE7XHJcbmNsYXNzIFJlYWRlckFzeW5jIGV4dGVuZHMgcmVhZGVyXzEkMS5kZWZhdWx0IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5fd2Fsa0FzeW5jID0gZnNXYWxrJDEud2FsaztcclxuICAgICAgICB0aGlzLl9yZWFkZXJTdHJlYW0gPSBuZXcgc3RyZWFtXzEkMi5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcclxuICAgIH1cclxuICAgIGR5bmFtaWMocm9vdCwgb3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dhbGtBc3luYyhyb290LCBvcHRpb25zLCAoZXJyb3IsIGVudHJpZXMpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW50cmllcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGFzeW5jIHN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTtcclxuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9yZWFkZXJTdHJlYW0uc3RhdGljKHBhdHRlcm5zLCBvcHRpb25zKTtcclxuICAgICAgICAvLyBBZnRlciAjMjM1LCByZXBsYWNlIGl0IHdpdGggYW4gYXN5bmNocm9ub3VzIGl0ZXJhdG9yLlxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHN0cmVhbS5vbmNlKCdlcnJvcicsIHJlamVjdCk7XHJcbiAgICAgICAgICAgIHN0cmVhbS5vbignZGF0YScsIChlbnRyeSkgPT4gZW50cmllcy5wdXNoKGVudHJ5KSk7XHJcbiAgICAgICAgICAgIHN0cmVhbS5vbmNlKCdlbmQnLCAoKSA9PiByZXNvbHZlKGVudHJpZXMpKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5hc3luYyQ2LmRlZmF1bHQgPSBSZWFkZXJBc3luYztcblxudmFyIHByb3ZpZGVyID0ge307XG5cbnZhciBkZWVwID0ge307XG5cbnZhciBwYXJ0aWFsID0ge307XG5cbnZhciBtYXRjaGVyID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXRjaGVyLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuY29uc3QgdXRpbHMkNSA9IHV0aWxzJGc7XHJcbmNsYXNzIE1hdGNoZXIge1xyXG4gICAgY29uc3RydWN0b3IoX3BhdHRlcm5zLCBfc2V0dGluZ3MsIF9taWNyb21hdGNoT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuX3BhdHRlcm5zID0gX3BhdHRlcm5zO1xyXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xyXG4gICAgICAgIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zID0gX21pY3JvbWF0Y2hPcHRpb25zO1xyXG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSBbXTtcclxuICAgICAgICB0aGlzLl9maWxsU3RvcmFnZSgpO1xyXG4gICAgfVxyXG4gICAgX2ZpbGxTdG9yYWdlKCkge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBvcmlnaW5hbCBwYXR0ZXJuIG1heSBpbmNsdWRlIGB7LCosKiosYS8qfWAsIHdoaWNoIHdpbGwgbGVhZCB0byBwcm9ibGVtcyB3aXRoIG1hdGNoaW5nICh1bnJlc29sdmVkIGxldmVsKS5cclxuICAgICAgICAgKiBTbywgYmVmb3JlIGV4cGFuZCBwYXR0ZXJucyB3aXRoIGJyYWNlIGV4cGFuc2lvbiBpbnRvIHNlcGFyYXRlZCBwYXR0ZXJucy5cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBwYXR0ZXJucyA9IHV0aWxzJDUucGF0dGVybi5leHBhbmRQYXR0ZXJuc1dpdGhCcmFjZUV4cGFuc2lvbih0aGlzLl9wYXR0ZXJucyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5fZ2V0UGF0dGVyblNlZ21lbnRzKHBhdHRlcm4pO1xyXG4gICAgICAgICAgICBjb25zdCBzZWN0aW9ucyA9IHRoaXMuX3NwbGl0U2VnbWVudHNJbnRvU2VjdGlvbnMoc2VnbWVudHMpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdG9yYWdlLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgY29tcGxldGU6IHNlY3Rpb25zLmxlbmd0aCA8PSAxLFxyXG4gICAgICAgICAgICAgICAgcGF0dGVybixcclxuICAgICAgICAgICAgICAgIHNlZ21lbnRzLFxyXG4gICAgICAgICAgICAgICAgc2VjdGlvbnNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2dldFBhdHRlcm5TZWdtZW50cyhwYXR0ZXJuKSB7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSB1dGlscyQ1LnBhdHRlcm4uZ2V0UGF0dGVyblBhcnRzKHBhdHRlcm4sIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gcGFydHMubWFwKChwYXJ0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWMgPSB1dGlscyQ1LnBhdHRlcm4uaXNEeW5hbWljUGF0dGVybihwYXJ0LCB0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIGlmICghZHluYW1pYykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBkeW5hbWljOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuOiBwYXJ0XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkeW5hbWljOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgcGF0dGVybjogcGFydCxcclxuICAgICAgICAgICAgICAgIHBhdHRlcm5SZTogdXRpbHMkNS5wYXR0ZXJuLm1ha2VSZShwYXJ0LCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucylcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF9zcGxpdFNlZ21lbnRzSW50b1NlY3Rpb25zKHNlZ21lbnRzKSB7XHJcbiAgICAgICAgcmV0dXJuIHV0aWxzJDUuYXJyYXkuc3BsaXRXaGVuKHNlZ21lbnRzLCAoc2VnbWVudCkgPT4gc2VnbWVudC5keW5hbWljICYmIHV0aWxzJDUucGF0dGVybi5oYXNHbG9iU3RhcihzZWdtZW50LnBhdHRlcm4pKTtcclxuICAgIH1cclxufVxyXG5tYXRjaGVyLmRlZmF1bHQgPSBNYXRjaGVyO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocGFydGlhbCwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmNvbnN0IG1hdGNoZXJfMSA9IG1hdGNoZXI7XHJcbmNsYXNzIFBhcnRpYWxNYXRjaGVyIGV4dGVuZHMgbWF0Y2hlcl8xLmRlZmF1bHQge1xyXG4gICAgbWF0Y2goZmlsZXBhdGgpIHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IGZpbGVwYXRoLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgY29uc3QgbGV2ZWxzID0gcGFydHMubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5fc3RvcmFnZS5maWx0ZXIoKGluZm8pID0+ICFpbmZvLmNvbXBsZXRlIHx8IGluZm8uc2VnbWVudHMubGVuZ3RoID4gbGV2ZWxzKTtcclxuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IHBhdHRlcm4uc2VjdGlvbnNbMF07XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBJbiB0aGlzIGNhc2UsIHRoZSBwYXR0ZXJuIGhhcyBhIGdsb2JzdGFyIGFuZCB3ZSBtdXN0IHJlYWQgYWxsIGRpcmVjdG9yaWVzIHVuY29uZGl0aW9uYWxseSxcclxuICAgICAgICAgICAgICogYnV0IG9ubHkgaWYgdGhlIGxldmVsIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpcnN0IGdyb3VwLlxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBmaXh0dXJlcy97YSxifS8qKlxyXG4gICAgICAgICAgICAgKiAgXiB0cnVlL2ZhbHNlICBeIGFsd2F5cyB0cnVlXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmICghcGF0dGVybi5jb21wbGV0ZSAmJiBsZXZlbHMgPiBzZWN0aW9uLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBwYXJ0cy5ldmVyeSgocGFydCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSBwYXR0ZXJuLnNlZ21lbnRzW2luZGV4XTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LmR5bmFtaWMgJiYgc2VnbWVudC5wYXR0ZXJuUmUudGVzdChwYXJ0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFzZWdtZW50LmR5bmFtaWMgJiYgc2VnbWVudC5wYXR0ZXJuID09PSBwYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxyXG5wYXJ0aWFsLmRlZmF1bHQgPSBQYXJ0aWFsTWF0Y2hlcjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlZXAsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCB1dGlscyQ0ID0gdXRpbHMkZztcclxuY29uc3QgcGFydGlhbF8xID0gcGFydGlhbDtcclxuY2xhc3MgRGVlcEZpbHRlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MsIF9taWNyb21hdGNoT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xyXG4gICAgICAgIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zID0gX21pY3JvbWF0Y2hPcHRpb25zO1xyXG4gICAgfVxyXG4gICAgZ2V0RmlsdGVyKGJhc2VQYXRoLCBwb3NpdGl2ZSwgbmVnYXRpdmUpIHtcclxuICAgICAgICBjb25zdCBtYXRjaGVyID0gdGhpcy5fZ2V0TWF0Y2hlcihwb3NpdGl2ZSk7XHJcbiAgICAgICAgY29uc3QgbmVnYXRpdmVSZSA9IHRoaXMuX2dldE5lZ2F0aXZlUGF0dGVybnNSZShuZWdhdGl2ZSk7XHJcbiAgICAgICAgcmV0dXJuIChlbnRyeSkgPT4gdGhpcy5fZmlsdGVyKGJhc2VQYXRoLCBlbnRyeSwgbWF0Y2hlciwgbmVnYXRpdmVSZSk7XHJcbiAgICB9XHJcbiAgICBfZ2V0TWF0Y2hlcihwYXR0ZXJucykge1xyXG4gICAgICAgIHJldHVybiBuZXcgcGFydGlhbF8xLmRlZmF1bHQocGF0dGVybnMsIHRoaXMuX3NldHRpbmdzLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBfZ2V0TmVnYXRpdmVQYXR0ZXJuc1JlKHBhdHRlcm5zKSB7XHJcbiAgICAgICAgY29uc3QgYWZmZWN0RGVwdGhPZlJlYWRpbmdQYXR0ZXJucyA9IHBhdHRlcm5zLmZpbHRlcih1dGlscyQ0LnBhdHRlcm4uaXNBZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm4pO1xyXG4gICAgICAgIHJldHVybiB1dGlscyQ0LnBhdHRlcm4uY29udmVydFBhdHRlcm5zVG9SZShhZmZlY3REZXB0aE9mUmVhZGluZ1BhdHRlcm5zLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICBfZmlsdGVyKGJhc2VQYXRoLCBlbnRyeSwgbWF0Y2hlciwgbmVnYXRpdmVSZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc1NraXBwZWRCeURlZXAoYmFzZVBhdGgsIGVudHJ5LnBhdGgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU2tpcHBlZFN5bWJvbGljTGluayhlbnRyeSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHV0aWxzJDQucGF0aC5yZW1vdmVMZWFkaW5nRG90U2VnbWVudChlbnRyeS5wYXRoKTtcclxuICAgICAgICBpZiAodGhpcy5faXNTa2lwcGVkQnlQb3NpdGl2ZVBhdHRlcm5zKGZpbGVwYXRoLCBtYXRjaGVyKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc1NraXBwZWRCeU5lZ2F0aXZlUGF0dGVybnMoZmlsZXBhdGgsIG5lZ2F0aXZlUmUpO1xyXG4gICAgfVxyXG4gICAgX2lzU2tpcHBlZEJ5RGVlcChiYXNlUGF0aCwgZW50cnlQYXRoKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQXZvaWQgdW5uZWNlc3NhcnkgZGVwdGggY2FsY3VsYXRpb25zIHdoZW4gaXQgZG9lc24ndCBtYXR0ZXIuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHRoaXMuX3NldHRpbmdzLmRlZXAgPT09IEluZmluaXR5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEVudHJ5TGV2ZWwoYmFzZVBhdGgsIGVudHJ5UGF0aCkgPj0gdGhpcy5fc2V0dGluZ3MuZGVlcDtcclxuICAgIH1cclxuICAgIF9nZXRFbnRyeUxldmVsKGJhc2VQYXRoLCBlbnRyeVBhdGgpIHtcclxuICAgICAgICBjb25zdCBlbnRyeVBhdGhEZXB0aCA9IGVudHJ5UGF0aC5zcGxpdCgnLycpLmxlbmd0aDtcclxuICAgICAgICBpZiAoYmFzZVBhdGggPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbnRyeVBhdGhEZXB0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYmFzZVBhdGhEZXB0aCA9IGJhc2VQYXRoLnNwbGl0KCcvJykubGVuZ3RoO1xyXG4gICAgICAgIHJldHVybiBlbnRyeVBhdGhEZXB0aCAtIGJhc2VQYXRoRGVwdGg7XHJcbiAgICB9XHJcbiAgICBfaXNTa2lwcGVkU3ltYm9saWNMaW5rKGVudHJ5KSB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLl9zZXR0aW5ncy5mb2xsb3dTeW1ib2xpY0xpbmtzICYmIGVudHJ5LmRpcmVudC5pc1N5bWJvbGljTGluaygpO1xyXG4gICAgfVxyXG4gICAgX2lzU2tpcHBlZEJ5UG9zaXRpdmVQYXR0ZXJucyhlbnRyeVBhdGgsIG1hdGNoZXIpIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuX3NldHRpbmdzLmJhc2VOYW1lTWF0Y2ggJiYgIW1hdGNoZXIubWF0Y2goZW50cnlQYXRoKTtcclxuICAgIH1cclxuICAgIF9pc1NraXBwZWRCeU5lZ2F0aXZlUGF0dGVybnMoZW50cnlQYXRoLCBwYXR0ZXJuc1JlKSB7XHJcbiAgICAgICAgcmV0dXJuICF1dGlscyQ0LnBhdHRlcm4ubWF0Y2hBbnkoZW50cnlQYXRoLCBwYXR0ZXJuc1JlKTtcclxuICAgIH1cclxufVxyXG5kZWVwLmRlZmF1bHQgPSBEZWVwRmlsdGVyO1xuXG52YXIgZW50cnkkMSA9IHt9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZW50cnkkMSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmNvbnN0IHV0aWxzJDMgPSB1dGlscyRnO1xyXG5jbGFzcyBFbnRyeUZpbHRlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MsIF9taWNyb21hdGNoT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xyXG4gICAgICAgIHRoaXMuX21pY3JvbWF0Y2hPcHRpb25zID0gX21pY3JvbWF0Y2hPcHRpb25zO1xyXG4gICAgICAgIHRoaXMuaW5kZXggPSBuZXcgTWFwKCk7XHJcbiAgICB9XHJcbiAgICBnZXRGaWx0ZXIocG9zaXRpdmUsIG5lZ2F0aXZlKSB7XHJcbiAgICAgICAgY29uc3QgcG9zaXRpdmVSZSA9IHV0aWxzJDMucGF0dGVybi5jb252ZXJ0UGF0dGVybnNUb1JlKHBvc2l0aXZlLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgbmVnYXRpdmVSZSA9IHV0aWxzJDMucGF0dGVybi5jb252ZXJ0UGF0dGVybnNUb1JlKG5lZ2F0aXZlLCB0aGlzLl9taWNyb21hdGNoT3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIChlbnRyeSkgPT4gdGhpcy5fZmlsdGVyKGVudHJ5LCBwb3NpdGl2ZVJlLCBuZWdhdGl2ZVJlKTtcclxuICAgIH1cclxuICAgIF9maWx0ZXIoZW50cnksIHBvc2l0aXZlUmUsIG5lZ2F0aXZlUmUpIHtcclxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MudW5pcXVlICYmIHRoaXMuX2lzRHVwbGljYXRlRW50cnkoZW50cnkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX29ubHlGaWxlRmlsdGVyKGVudHJ5KSB8fCB0aGlzLl9vbmx5RGlyZWN0b3J5RmlsdGVyKGVudHJ5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9pc1NraXBwZWRCeUFic29sdXRlTmVnYXRpdmVQYXR0ZXJucyhlbnRyeS5wYXRoLCBuZWdhdGl2ZVJlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gdGhpcy5fc2V0dGluZ3MuYmFzZU5hbWVNYXRjaCA/IGVudHJ5Lm5hbWUgOiBlbnRyeS5wYXRoO1xyXG4gICAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCk7XHJcbiAgICAgICAgY29uc3QgaXNNYXRjaGVkID0gdGhpcy5faXNNYXRjaFRvUGF0dGVybnMoZmlsZXBhdGgsIHBvc2l0aXZlUmUsIGlzRGlyZWN0b3J5KSAmJiAhdGhpcy5faXNNYXRjaFRvUGF0dGVybnMoZW50cnkucGF0aCwgbmVnYXRpdmVSZSwgaXNEaXJlY3RvcnkpO1xyXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy51bmlxdWUgJiYgaXNNYXRjaGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUluZGV4UmVjb3JkKGVudHJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzTWF0Y2hlZDtcclxuICAgIH1cclxuICAgIF9pc0R1cGxpY2F0ZUVudHJ5KGVudHJ5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXguaGFzKGVudHJ5LnBhdGgpO1xyXG4gICAgfVxyXG4gICAgX2NyZWF0ZUluZGV4UmVjb3JkKGVudHJ5KSB7XHJcbiAgICAgICAgdGhpcy5pbmRleC5zZXQoZW50cnkucGF0aCwgdW5kZWZpbmVkKTtcclxuICAgIH1cclxuICAgIF9vbmx5RmlsZUZpbHRlcihlbnRyeSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncy5vbmx5RmlsZXMgJiYgIWVudHJ5LmRpcmVudC5pc0ZpbGUoKTtcclxuICAgIH1cclxuICAgIF9vbmx5RGlyZWN0b3J5RmlsdGVyKGVudHJ5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzLm9ubHlEaXJlY3RvcmllcyAmJiAhZW50cnkuZGlyZW50LmlzRGlyZWN0b3J5KCk7XHJcbiAgICB9XHJcbiAgICBfaXNTa2lwcGVkQnlBYnNvbHV0ZU5lZ2F0aXZlUGF0dGVybnMoZW50cnlQYXRoLCBwYXR0ZXJuc1JlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5hYnNvbHV0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gdXRpbHMkMy5wYXRoLm1ha2VBYnNvbHV0ZSh0aGlzLl9zZXR0aW5ncy5jd2QsIGVudHJ5UGF0aCk7XHJcbiAgICAgICAgcmV0dXJuIHV0aWxzJDMucGF0dGVybi5tYXRjaEFueShmdWxscGF0aCwgcGF0dGVybnNSZSk7XHJcbiAgICB9XHJcbiAgICBfaXNNYXRjaFRvUGF0dGVybnMoZW50cnlQYXRoLCBwYXR0ZXJuc1JlLCBpc0RpcmVjdG9yeSkge1xyXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gdXRpbHMkMy5wYXRoLnJlbW92ZUxlYWRpbmdEb3RTZWdtZW50KGVudHJ5UGF0aCk7XHJcbiAgICAgICAgLy8gVHJ5aW5nIHRvIG1hdGNoIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBieSBwYXR0ZXJucy5cclxuICAgICAgICBjb25zdCBpc01hdGNoZWQgPSB1dGlscyQzLnBhdHRlcm4ubWF0Y2hBbnkoZmlsZXBhdGgsIHBhdHRlcm5zUmUpO1xyXG4gICAgICAgIC8vIEEgcGF0dGVybiB3aXRoIGEgdHJhaWxsaW5nIHNsYXNoIGNhbiBiZSB1c2VkIGZvciBkaXJlY3RvcnkgbWF0Y2hpbmcuXHJcbiAgICAgICAgLy8gVG8gYXBwbHkgc3VjaCBwYXR0ZXJuLCB3ZSBuZWVkIHRvIGFkZCBhIHRyYWxsaW5nIHNsYXNoIHRvIHRoZSBwYXRoLlxyXG4gICAgICAgIGlmICghaXNNYXRjaGVkICYmIGlzRGlyZWN0b3J5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1dGlscyQzLnBhdHRlcm4ubWF0Y2hBbnkoZmlsZXBhdGggKyAnLycsIHBhdHRlcm5zUmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXNNYXRjaGVkO1xyXG4gICAgfVxyXG59XHJcbmVudHJ5JDEuZGVmYXVsdCA9IEVudHJ5RmlsdGVyO1xuXG52YXIgZXJyb3IkMiA9IHt9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IkMiwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmNvbnN0IHV0aWxzJDIgPSB1dGlscyRnO1xyXG5jbGFzcyBFcnJvckZpbHRlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MpIHtcclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcclxuICAgIH1cclxuICAgIGdldEZpbHRlcigpIHtcclxuICAgICAgICByZXR1cm4gKGVycm9yKSA9PiB0aGlzLl9pc05vbkZhdGFsRXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgX2lzTm9uRmF0YWxFcnJvcihlcnJvcikge1xyXG4gICAgICAgIHJldHVybiB1dGlscyQyLmVycm5vLmlzRW5vZW50Q29kZUVycm9yKGVycm9yKSB8fCB0aGlzLl9zZXR0aW5ncy5zdXBwcmVzc0Vycm9ycztcclxuICAgIH1cclxufVxyXG5lcnJvciQyLmRlZmF1bHQgPSBFcnJvckZpbHRlcjtcblxudmFyIGVudHJ5ID0ge307XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbnRyeSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbmNvbnN0IHV0aWxzJDEgPSB1dGlscyRnO1xyXG5jbGFzcyBFbnRyeVRyYW5zZm9ybWVyIHtcclxuICAgIGNvbnN0cnVjdG9yKF9zZXR0aW5ncykge1xyXG4gICAgICAgIHRoaXMuX3NldHRpbmdzID0gX3NldHRpbmdzO1xyXG4gICAgfVxyXG4gICAgZ2V0VHJhbnNmb3JtZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIChlbnRyeSkgPT4gdGhpcy5fdHJhbnNmb3JtKGVudHJ5KTtcclxuICAgIH1cclxuICAgIF90cmFuc2Zvcm0oZW50cnkpIHtcclxuICAgICAgICBsZXQgZmlsZXBhdGggPSBlbnRyeS5wYXRoO1xyXG4gICAgICAgIGlmICh0aGlzLl9zZXR0aW5ncy5hYnNvbHV0ZSkge1xyXG4gICAgICAgICAgICBmaWxlcGF0aCA9IHV0aWxzJDEucGF0aC5tYWtlQWJzb2x1dGUodGhpcy5fc2V0dGluZ3MuY3dkLCBmaWxlcGF0aCk7XHJcbiAgICAgICAgICAgIGZpbGVwYXRoID0gdXRpbHMkMS5wYXRoLnVuaXhpZnkoZmlsZXBhdGgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3MubWFya0RpcmVjdG9yaWVzICYmIGVudHJ5LmRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XHJcbiAgICAgICAgICAgIGZpbGVwYXRoICs9ICcvJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5ncy5vYmplY3RNb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmaWxlcGF0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZW50cnkpLCB7IHBhdGg6IGZpbGVwYXRoIH0pO1xyXG4gICAgfVxyXG59XHJcbmVudHJ5LmRlZmF1bHQgPSBFbnRyeVRyYW5zZm9ybWVyO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdmlkZXIsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCBwYXRoJGEgPSByZXF1aXJlJCQwJDQ7XHJcbmNvbnN0IGRlZXBfMSA9IGRlZXA7XHJcbmNvbnN0IGVudHJ5XzEgPSBlbnRyeSQxO1xyXG5jb25zdCBlcnJvcl8xID0gZXJyb3IkMjtcclxuY29uc3QgZW50cnlfMiA9IGVudHJ5O1xyXG5jbGFzcyBQcm92aWRlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihfc2V0dGluZ3MpIHtcclxuICAgICAgICB0aGlzLl9zZXR0aW5ncyA9IF9zZXR0aW5ncztcclxuICAgICAgICB0aGlzLmVycm9yRmlsdGVyID0gbmV3IGVycm9yXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICAgICAgdGhpcy5lbnRyeUZpbHRlciA9IG5ldyBlbnRyeV8xLmRlZmF1bHQodGhpcy5fc2V0dGluZ3MsIHRoaXMuX2dldE1pY3JvbWF0Y2hPcHRpb25zKCkpO1xyXG4gICAgICAgIHRoaXMuZGVlcEZpbHRlciA9IG5ldyBkZWVwXzEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncywgdGhpcy5fZ2V0TWljcm9tYXRjaE9wdGlvbnMoKSk7XHJcbiAgICAgICAgdGhpcy5lbnRyeVRyYW5zZm9ybWVyID0gbmV3IGVudHJ5XzIuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICBfZ2V0Um9vdERpcmVjdG9yeSh0YXNrKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhdGgkYS5yZXNvbHZlKHRoaXMuX3NldHRpbmdzLmN3ZCwgdGFzay5iYXNlKTtcclxuICAgIH1cclxuICAgIF9nZXRSZWFkZXJPcHRpb25zKHRhc2spIHtcclxuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHRhc2suYmFzZSA9PT0gJy4nID8gJycgOiB0YXNrLmJhc2U7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgYmFzZVBhdGgsXHJcbiAgICAgICAgICAgIHBhdGhTZWdtZW50U2VwYXJhdG9yOiAnLycsXHJcbiAgICAgICAgICAgIGNvbmN1cnJlbmN5OiB0aGlzLl9zZXR0aW5ncy5jb25jdXJyZW5jeSxcclxuICAgICAgICAgICAgZGVlcEZpbHRlcjogdGhpcy5kZWVwRmlsdGVyLmdldEZpbHRlcihiYXNlUGF0aCwgdGFzay5wb3NpdGl2ZSwgdGFzay5uZWdhdGl2ZSksXHJcbiAgICAgICAgICAgIGVudHJ5RmlsdGVyOiB0aGlzLmVudHJ5RmlsdGVyLmdldEZpbHRlcih0YXNrLnBvc2l0aXZlLCB0YXNrLm5lZ2F0aXZlKSxcclxuICAgICAgICAgICAgZXJyb3JGaWx0ZXI6IHRoaXMuZXJyb3JGaWx0ZXIuZ2V0RmlsdGVyKCksXHJcbiAgICAgICAgICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IHRoaXMuX3NldHRpbmdzLmZvbGxvd1N5bWJvbGljTGlua3MsXHJcbiAgICAgICAgICAgIGZzOiB0aGlzLl9zZXR0aW5ncy5mcyxcclxuICAgICAgICAgICAgc3RhdHM6IHRoaXMuX3NldHRpbmdzLnN0YXRzLFxyXG4gICAgICAgICAgICB0aHJvd0Vycm9yT25Ccm9rZW5TeW1ib2xpY0xpbms6IHRoaXMuX3NldHRpbmdzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluayxcclxuICAgICAgICAgICAgdHJhbnNmb3JtOiB0aGlzLmVudHJ5VHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXIoKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBfZ2V0TWljcm9tYXRjaE9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZG90OiB0aGlzLl9zZXR0aW5ncy5kb3QsXHJcbiAgICAgICAgICAgIG1hdGNoQmFzZTogdGhpcy5fc2V0dGluZ3MuYmFzZU5hbWVNYXRjaCxcclxuICAgICAgICAgICAgbm9icmFjZTogIXRoaXMuX3NldHRpbmdzLmJyYWNlRXhwYW5zaW9uLFxyXG4gICAgICAgICAgICBub2Nhc2U6ICF0aGlzLl9zZXR0aW5ncy5jYXNlU2Vuc2l0aXZlTWF0Y2gsXHJcbiAgICAgICAgICAgIG5vZXh0OiAhdGhpcy5fc2V0dGluZ3MuZXh0Z2xvYixcclxuICAgICAgICAgICAgbm9nbG9ic3RhcjogIXRoaXMuX3NldHRpbmdzLmdsb2JzdGFyLFxyXG4gICAgICAgICAgICBwb3NpeDogdHJ1ZSxcclxuICAgICAgICAgICAgc3RyaWN0U2xhc2hlczogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbnByb3ZpZGVyLmRlZmF1bHQgPSBQcm92aWRlcjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGFzeW5jJDcsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCBhc3luY18xJDEgPSBhc3luYyQ2O1xyXG5jb25zdCBwcm92aWRlcl8xJDIgPSBwcm92aWRlcjtcclxuY2xhc3MgUHJvdmlkZXJBc3luYyBleHRlbmRzIHByb3ZpZGVyXzEkMi5kZWZhdWx0IHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgdGhpcy5fcmVhZGVyID0gbmV3IGFzeW5jXzEkMS5kZWZhdWx0KHRoaXMuX3NldHRpbmdzKTtcclxuICAgIH1cclxuICAgIGFzeW5jIHJlYWQodGFzaykge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9nZXRSb290RGlyZWN0b3J5KHRhc2spO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRSZWFkZXJPcHRpb25zKHRhc2spO1xyXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmFwaShyb290LCB0YXNrLCBvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gZW50cmllcy5tYXAoKGVudHJ5KSA9PiBvcHRpb25zLnRyYW5zZm9ybShlbnRyeSkpO1xyXG4gICAgfVxyXG4gICAgYXBpKHJvb3QsIHRhc2ssIG9wdGlvbnMpIHtcclxuICAgICAgICBpZiAodGFzay5keW5hbWljKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuZHluYW1pYyhyb290LCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRlci5zdGF0aWModGFzay5wYXR0ZXJucywgb3B0aW9ucyk7XHJcbiAgICB9XHJcbn1cclxuYXN5bmMkNy5kZWZhdWx0ID0gUHJvdmlkZXJBc3luYztcblxudmFyIHN0cmVhbSA9IHt9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoc3RyZWFtLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuY29uc3Qgc3RyZWFtXzEkMSA9IHJlcXVpcmUkJDAkNztcclxuY29uc3Qgc3RyZWFtXzIgPSBzdHJlYW0kMTtcclxuY29uc3QgcHJvdmlkZXJfMSQxID0gcHJvdmlkZXI7XHJcbmNsYXNzIFByb3ZpZGVyU3RyZWFtIGV4dGVuZHMgcHJvdmlkZXJfMSQxLmRlZmF1bHQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgc3RyZWFtXzIuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICByZWFkKHRhc2spIHtcclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fZ2V0Um9vdERpcmVjdG9yeSh0YXNrKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0UmVhZGVyT3B0aW9ucyh0YXNrKTtcclxuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmFwaShyb290LCB0YXNrLCBvcHRpb25zKTtcclxuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IG5ldyBzdHJlYW1fMSQxLlJlYWRhYmxlKHsgb2JqZWN0TW9kZTogdHJ1ZSwgcmVhZDogKCkgPT4geyB9IH0pO1xyXG4gICAgICAgIHNvdXJjZVxyXG4gICAgICAgICAgICAub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IGRlc3RpbmF0aW9uLmVtaXQoJ2Vycm9yJywgZXJyb3IpKVxyXG4gICAgICAgICAgICAub24oJ2RhdGEnLCAoZW50cnkpID0+IGRlc3RpbmF0aW9uLmVtaXQoJ2RhdGEnLCBvcHRpb25zLnRyYW5zZm9ybShlbnRyeSkpKVxyXG4gICAgICAgICAgICAub25jZSgnZW5kJywgKCkgPT4gZGVzdGluYXRpb24uZW1pdCgnZW5kJykpO1xyXG4gICAgICAgIGRlc3RpbmF0aW9uXHJcbiAgICAgICAgICAgIC5vbmNlKCdjbG9zZScsICgpID0+IHNvdXJjZS5kZXN0cm95KCkpO1xyXG4gICAgICAgIHJldHVybiBkZXN0aW5hdGlvbjtcclxuICAgIH1cclxuICAgIGFwaShyb290LCB0YXNrLCBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKHRhc2suZHluYW1pYykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLmR5bmFtaWMocm9vdCwgb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuc3RhdGljKHRhc2sucGF0dGVybnMsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG59XHJcbnN0cmVhbS5kZWZhdWx0ID0gUHJvdmlkZXJTdHJlYW07XG5cbnZhciBzeW5jJDIgPSB7fTtcblxudmFyIHN5bmMkMSA9IHt9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoc3luYyQxLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuY29uc3QgZnNTdGF0ID0gb3V0JDE7XHJcbmNvbnN0IGZzV2FsayA9IG91dCQzO1xyXG5jb25zdCByZWFkZXJfMSA9IHJlYWRlcjtcclxuY2xhc3MgUmVhZGVyU3luYyBleHRlbmRzIHJlYWRlcl8xLmRlZmF1bHQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLl93YWxrU3luYyA9IGZzV2Fsay53YWxrU3luYztcclxuICAgICAgICB0aGlzLl9zdGF0U3luYyA9IGZzU3RhdC5zdGF0U3luYztcclxuICAgIH1cclxuICAgIGR5bmFtaWMocm9vdCwgb3B0aW9ucykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl93YWxrU3luYyhyb290LCBvcHRpb25zKTtcclxuICAgIH1cclxuICAgIHN0YXRpYyhwYXR0ZXJucywgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZXBhdGggPSB0aGlzLl9nZXRGdWxsRW50cnlQYXRoKHBhdHRlcm4pO1xyXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2dldEVudHJ5KGZpbGVwYXRoLCBwYXR0ZXJuLCBvcHRpb25zKTtcclxuICAgICAgICAgICAgaWYgKGVudHJ5ID09PSBudWxsIHx8ICFvcHRpb25zLmVudHJ5RmlsdGVyKGVudHJ5KSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVudHJpZXM7XHJcbiAgICB9XHJcbiAgICBfZ2V0RW50cnkoZmlsZXBhdGgsIHBhdHRlcm4sIG9wdGlvbnMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuX2dldFN0YXQoZmlsZXBhdGgpO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUVudHJ5KHN0YXRzLCBwYXR0ZXJuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVycm9yRmlsdGVyKGVycm9yKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgX2dldFN0YXQoZmlsZXBhdGgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdFN5bmMoZmlsZXBhdGgsIHRoaXMuX2ZzU3RhdFNldHRpbmdzKTtcclxuICAgIH1cclxufVxyXG5zeW5jJDEuZGVmYXVsdCA9IFJlYWRlclN5bmM7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShzeW5jJDIsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xyXG5jb25zdCBzeW5jXzEkMSA9IHN5bmMkMTtcclxuY29uc3QgcHJvdmlkZXJfMSA9IHByb3ZpZGVyO1xyXG5jbGFzcyBQcm92aWRlclN5bmMgZXh0ZW5kcyBwcm92aWRlcl8xLmRlZmF1bHQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICB0aGlzLl9yZWFkZXIgPSBuZXcgc3luY18xJDEuZGVmYXVsdCh0aGlzLl9zZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICByZWFkKHRhc2spIHtcclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fZ2V0Um9vdERpcmVjdG9yeSh0YXNrKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0UmVhZGVyT3B0aW9ucyh0YXNrKTtcclxuICAgICAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5hcGkocm9vdCwgdGFzaywgb3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIGVudHJpZXMubWFwKG9wdGlvbnMudHJhbnNmb3JtKTtcclxuICAgIH1cclxuICAgIGFwaShyb290LCB0YXNrLCBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKHRhc2suZHluYW1pYykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZGVyLmR5bmFtaWMocm9vdCwgb3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkZXIuc3RhdGljKHRhc2sucGF0dGVybnMsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG59XHJcbnN5bmMkMi5kZWZhdWx0ID0gUHJvdmlkZXJTeW5jO1xuXG52YXIgc2V0dGluZ3MgPSB7fTtcblxuKGZ1bmN0aW9uIChleHBvcnRzKSB7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuXHRleHBvcnRzLkRFRkFVTFRfRklMRV9TWVNURU1fQURBUFRFUiA9IHZvaWQgMDtcclxuXHRjb25zdCBmcyA9IHJlcXVpcmUkJDBfX2RlZmF1bHQ7XHJcblx0Y29uc3Qgb3MgPSByZXF1aXJlJCQyO1xyXG5cdC8qKlxyXG5cdCAqIFRoZSBgb3MuY3B1c2AgbWV0aG9kIGNhbiByZXR1cm4gemVyby4gV2UgZXhwZWN0IHRoZSBudW1iZXIgb2YgY29yZXMgdG8gYmUgZ3JlYXRlciB0aGFuIHplcm8uXHJcblx0ICogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvN2ZhZWRkZjIzYTk4YzUzODk2ZjhiNTc0YTZlNjY1ODllOGZiMWViOC9saWIvb3MuanMjTDEwNi1MMTA3XHJcblx0ICovXHJcblx0Y29uc3QgQ1BVX0NPVU5UID0gTWF0aC5tYXgob3MuY3B1cygpLmxlbmd0aCwgMSk7XHJcblx0ZXhwb3J0cy5ERUZBVUxUX0ZJTEVfU1lTVEVNX0FEQVBURVIgPSB7XHJcblx0ICAgIGxzdGF0OiBmcy5sc3RhdCxcclxuXHQgICAgbHN0YXRTeW5jOiBmcy5sc3RhdFN5bmMsXHJcblx0ICAgIHN0YXQ6IGZzLnN0YXQsXHJcblx0ICAgIHN0YXRTeW5jOiBmcy5zdGF0U3luYyxcclxuXHQgICAgcmVhZGRpcjogZnMucmVhZGRpcixcclxuXHQgICAgcmVhZGRpclN5bmM6IGZzLnJlYWRkaXJTeW5jXHJcblx0fTtcclxuXHRjbGFzcyBTZXR0aW5ncyB7XHJcblx0ICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zID0ge30pIHtcclxuXHQgICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcclxuXHQgICAgICAgIHRoaXMuYWJzb2x1dGUgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmFic29sdXRlLCBmYWxzZSk7XHJcblx0ICAgICAgICB0aGlzLmJhc2VOYW1lTWF0Y2ggPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmJhc2VOYW1lTWF0Y2gsIGZhbHNlKTtcclxuXHQgICAgICAgIHRoaXMuYnJhY2VFeHBhbnNpb24gPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmJyYWNlRXhwYW5zaW9uLCB0cnVlKTtcclxuXHQgICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZU1hdGNoID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5jYXNlU2Vuc2l0aXZlTWF0Y2gsIHRydWUpO1xyXG5cdCAgICAgICAgdGhpcy5jb25jdXJyZW5jeSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuY29uY3VycmVuY3ksIENQVV9DT1VOVCk7XHJcblx0ICAgICAgICB0aGlzLmN3ZCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuY3dkLCBwcm9jZXNzLmN3ZCgpKTtcclxuXHQgICAgICAgIHRoaXMuZGVlcCA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZGVlcCwgSW5maW5pdHkpO1xyXG5cdCAgICAgICAgdGhpcy5kb3QgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLmRvdCwgZmFsc2UpO1xyXG5cdCAgICAgICAgdGhpcy5leHRnbG9iID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5leHRnbG9iLCB0cnVlKTtcclxuXHQgICAgICAgIHRoaXMuZm9sbG93U3ltYm9saWNMaW5rcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuZm9sbG93U3ltYm9saWNMaW5rcywgdHJ1ZSk7XHJcblx0ICAgICAgICB0aGlzLmZzID0gdGhpcy5fZ2V0RmlsZVN5c3RlbU1ldGhvZHModGhpcy5fb3B0aW9ucy5mcyk7XHJcblx0ICAgICAgICB0aGlzLmdsb2JzdGFyID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5nbG9ic3RhciwgdHJ1ZSk7XHJcblx0ICAgICAgICB0aGlzLmlnbm9yZSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuaWdub3JlLCBbXSk7XHJcblx0ICAgICAgICB0aGlzLm1hcmtEaXJlY3RvcmllcyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMubWFya0RpcmVjdG9yaWVzLCBmYWxzZSk7XHJcblx0ICAgICAgICB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLm9iamVjdE1vZGUsIGZhbHNlKTtcclxuXHQgICAgICAgIHRoaXMub25seURpcmVjdG9yaWVzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5vbmx5RGlyZWN0b3JpZXMsIGZhbHNlKTtcclxuXHQgICAgICAgIHRoaXMub25seUZpbGVzID0gdGhpcy5fZ2V0VmFsdWUodGhpcy5fb3B0aW9ucy5vbmx5RmlsZXMsIHRydWUpO1xyXG5cdCAgICAgICAgdGhpcy5zdGF0cyA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMuc3RhdHMsIGZhbHNlKTtcclxuXHQgICAgICAgIHRoaXMuc3VwcHJlc3NFcnJvcnMgPSB0aGlzLl9nZXRWYWx1ZSh0aGlzLl9vcHRpb25zLnN1cHByZXNzRXJyb3JzLCBmYWxzZSk7XHJcblx0ICAgICAgICB0aGlzLnRocm93RXJyb3JPbkJyb2tlblN5bWJvbGljTGluayA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMudGhyb3dFcnJvck9uQnJva2VuU3ltYm9saWNMaW5rLCBmYWxzZSk7XHJcblx0ICAgICAgICB0aGlzLnVuaXF1ZSA9IHRoaXMuX2dldFZhbHVlKHRoaXMuX29wdGlvbnMudW5pcXVlLCB0cnVlKTtcclxuXHQgICAgICAgIGlmICh0aGlzLm9ubHlEaXJlY3Rvcmllcykge1xyXG5cdCAgICAgICAgICAgIHRoaXMub25seUZpbGVzID0gZmFsc2U7XHJcblx0ICAgICAgICB9XHJcblx0ICAgICAgICBpZiAodGhpcy5zdGF0cykge1xyXG5cdCAgICAgICAgICAgIHRoaXMub2JqZWN0TW9kZSA9IHRydWU7XHJcblx0ICAgICAgICB9XHJcblx0ICAgIH1cclxuXHQgICAgX2dldFZhbHVlKG9wdGlvbiwgdmFsdWUpIHtcclxuXHQgICAgICAgIHJldHVybiBvcHRpb24gPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogb3B0aW9uO1xyXG5cdCAgICB9XHJcblx0ICAgIF9nZXRGaWxlU3lzdGVtTWV0aG9kcyhtZXRob2RzID0ge30pIHtcclxuXHQgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV4cG9ydHMuREVGQVVMVF9GSUxFX1NZU1RFTV9BREFQVEVSKSwgbWV0aG9kcyk7XHJcblx0ICAgIH1cclxuXHR9XHJcblx0ZXhwb3J0cy5kZWZhdWx0ID0gU2V0dGluZ3M7XG59IChzZXR0aW5ncykpO1xuXG5jb25zdCB0YXNrTWFuYWdlciA9IHRhc2tzO1xyXG5jb25zdCBwYXR0ZXJuTWFuYWdlciA9IHBhdHRlcm5zO1xyXG5jb25zdCBhc3luY18xID0gYXN5bmMkNztcclxuY29uc3Qgc3RyZWFtXzEgPSBzdHJlYW07XHJcbmNvbnN0IHN5bmNfMSA9IHN5bmMkMjtcclxuY29uc3Qgc2V0dGluZ3NfMSA9IHNldHRpbmdzO1xyXG5jb25zdCB1dGlscyA9IHV0aWxzJGc7XHJcbmFzeW5jIGZ1bmN0aW9uIEZhc3RHbG9iKHNvdXJjZSwgb3B0aW9ucykge1xyXG4gICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xyXG4gICAgY29uc3Qgd29ya3MgPSBnZXRXb3Jrcyhzb3VyY2UsIGFzeW5jXzEuZGVmYXVsdCwgb3B0aW9ucyk7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbCh3b3Jrcyk7XHJcbiAgICByZXR1cm4gdXRpbHMuYXJyYXkuZmxhdHRlbihyZXN1bHQpO1xyXG59XHJcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90eXBlc2NyaXB0LWVzbGludC90eXBlc2NyaXB0LWVzbGludC9pc3N1ZXMvNjBcclxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxyXG4oZnVuY3Rpb24gKEZhc3RHbG9iKSB7XHJcbiAgICBmdW5jdGlvbiBzeW5jKHNvdXJjZSwgb3B0aW9ucykge1xyXG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcclxuICAgICAgICBjb25zdCB3b3JrcyA9IGdldFdvcmtzKHNvdXJjZSwgc3luY18xLmRlZmF1bHQsIG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiB1dGlscy5hcnJheS5mbGF0dGVuKHdvcmtzKTtcclxuICAgIH1cclxuICAgIEZhc3RHbG9iLnN5bmMgPSBzeW5jO1xyXG4gICAgZnVuY3Rpb24gc3RyZWFtKHNvdXJjZSwgb3B0aW9ucykge1xyXG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcclxuICAgICAgICBjb25zdCB3b3JrcyA9IGdldFdvcmtzKHNvdXJjZSwgc3RyZWFtXzEuZGVmYXVsdCwgb3B0aW9ucyk7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHN0cmVhbSByZXR1cm5lZCBieSB0aGUgcHJvdmlkZXIgY2Fubm90IHdvcmsgd2l0aCBhbiBhc3luY2hyb25vdXMgaXRlcmF0b3IuXHJcbiAgICAgICAgICogVG8gc3VwcG9ydCBhc3luY2hyb25vdXMgaXRlcmF0b3JzLCByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgdGFza3MsIHdlIGFsd2F5cyBtdWx0aXBsZXggc3RyZWFtcy5cclxuICAgICAgICAgKiBUaGlzIGFmZmVjdHMgcGVyZm9ybWFuY2UgKCsyNSUpLiBJIGRvbid0IHNlZSBiZXN0IHNvbHV0aW9uIHJpZ2h0IG5vdy5cclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm4gdXRpbHMuc3RyZWFtLm1lcmdlKHdvcmtzKTtcclxuICAgIH1cclxuICAgIEZhc3RHbG9iLnN0cmVhbSA9IHN0cmVhbTtcclxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlVGFza3Moc291cmNlLCBvcHRpb25zKSB7XHJcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xyXG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gcGF0dGVybk1hbmFnZXIudHJhbnNmb3JtKFtdLmNvbmNhdChzb3VyY2UpKTtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IG5ldyBzZXR0aW5nc18xLmRlZmF1bHQob3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHRhc2tNYW5hZ2VyLmdlbmVyYXRlKHBhdHRlcm5zLCBzZXR0aW5ncyk7XHJcbiAgICB9XHJcbiAgICBGYXN0R2xvYi5nZW5lcmF0ZVRhc2tzID0gZ2VuZXJhdGVUYXNrcztcclxuICAgIGZ1bmN0aW9uIGlzRHluYW1pY1BhdHRlcm4oc291cmNlLCBvcHRpb25zKSB7XHJcbiAgICAgICAgYXNzZXJ0UGF0dGVybnNJbnB1dChzb3VyY2UpO1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gbmV3IHNldHRpbmdzXzEuZGVmYXVsdChvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gdXRpbHMucGF0dGVybi5pc0R5bmFtaWNQYXR0ZXJuKHNvdXJjZSwgc2V0dGluZ3MpO1xyXG4gICAgfVxyXG4gICAgRmFzdEdsb2IuaXNEeW5hbWljUGF0dGVybiA9IGlzRHluYW1pY1BhdHRlcm47XHJcbiAgICBmdW5jdGlvbiBlc2NhcGVQYXRoKHNvdXJjZSkge1xyXG4gICAgICAgIGFzc2VydFBhdHRlcm5zSW5wdXQoc291cmNlKTtcclxuICAgICAgICByZXR1cm4gdXRpbHMucGF0aC5lc2NhcGUoc291cmNlKTtcclxuICAgIH1cclxuICAgIEZhc3RHbG9iLmVzY2FwZVBhdGggPSBlc2NhcGVQYXRoO1xyXG59KShGYXN0R2xvYiB8fCAoRmFzdEdsb2IgPSB7fSkpO1xyXG5mdW5jdGlvbiBnZXRXb3Jrcyhzb3VyY2UsIF9Qcm92aWRlciwgb3B0aW9ucykge1xyXG4gICAgY29uc3QgcGF0dGVybnMgPSBwYXR0ZXJuTWFuYWdlci50cmFuc2Zvcm0oW10uY29uY2F0KHNvdXJjZSkpO1xyXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBuZXcgc2V0dGluZ3NfMS5kZWZhdWx0KG9wdGlvbnMpO1xyXG4gICAgY29uc3QgdGFza3MgPSB0YXNrTWFuYWdlci5nZW5lcmF0ZShwYXR0ZXJucywgc2V0dGluZ3MpO1xyXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgX1Byb3ZpZGVyKHNldHRpbmdzKTtcclxuICAgIHJldHVybiB0YXNrcy5tYXAocHJvdmlkZXIucmVhZCwgcHJvdmlkZXIpO1xyXG59XHJcbmZ1bmN0aW9uIGFzc2VydFBhdHRlcm5zSW5wdXQoaW5wdXQpIHtcclxuICAgIGNvbnN0IHNvdXJjZSA9IFtdLmNvbmNhdChpbnB1dCk7XHJcbiAgICBjb25zdCBpc1ZhbGlkU291cmNlID0gc291cmNlLmV2ZXJ5KChpdGVtKSA9PiB1dGlscy5zdHJpbmcuaXNTdHJpbmcoaXRlbSkgJiYgIXV0aWxzLnN0cmluZy5pc0VtcHR5KGl0ZW0pKTtcclxuICAgIGlmICghaXNWYWxpZFNvdXJjZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1BhdHRlcm5zIG11c3QgYmUgYSBzdHJpbmcgKG5vbiBlbXB0eSkgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xyXG4gICAgfVxyXG59XHJcbnZhciBvdXQgPSBGYXN0R2xvYjtcblxuY29uc3QgZGVidWckYiA9IGNyZWF0ZURlYnVnZ2VyKCd2aXRlOnNzci1leHRlcm5hbCcpO1xuLyoqXG4gKiBDb252ZXJ0cyBcInBhcmVudCA+IGNoaWxkXCIgc3ludGF4IHRvIGp1c3QgXCJjaGlsZFwiXG4gKi9cbmZ1bmN0aW9uIHN0cmlwTmVzdGluZyhwYWNrYWdlcykge1xuICAgIHJldHVybiBwYWNrYWdlcy5tYXAoKHMpID0+IHtcbiAgICAgICAgY29uc3QgYXJyID0gcy5zcGxpdCgnPicpO1xuICAgICAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXS50cmltKCk7XG4gICAgfSk7XG59XG4vKipcbiAqIEhldXJpc3RpY3MgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgYSBkZXBlbmRlbmN5IHNob3VsZCBiZSBleHRlcm5hbGl6ZWQgZm9yXG4gKiBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuXG4gKi9cbmZ1bmN0aW9uIGNqc1NzclJlc29sdmVFeHRlcm5hbHMoY29uZmlnLCBrbm93bkltcG9ydHMpIHtcbiAgICAvLyBzdHJpcCBuZXN0aW5nIHNpbmNlIGtub3duSW1wb3J0cyBtYXkgYmUgcGFzc2VkIGluIGZyb20gb3B0aW1pemVEZXBzIHdoaWNoXG4gICAgLy8gc3VwcG9ydHMgYSBcInBhcmVudCA+IGNoaWxkXCIgc3ludGF4XG4gICAga25vd25JbXBvcnRzID0gc3RyaXBOZXN0aW5nKGtub3duSW1wb3J0cyk7XG4gICAgY29uc3Qgc3NyQ29uZmlnID0gY29uZmlnLnNzcjtcbiAgICBpZiAoc3NyQ29uZmlnPy5ub0V4dGVybmFsID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3Qgc3NyRXh0ZXJuYWxzID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgc3NyQ29uZmlnPy5leHRlcm5hbD8uZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgc3NyRXh0ZXJuYWxzLmFkZChpZCk7XG4gICAgICAgIHNlZW4uYWRkKGlkKTtcbiAgICB9KTtcbiAgICBjanNTc3JDb2xsZWN0RXh0ZXJuYWxzKGNvbmZpZy5yb290LCBjb25maWcucmVzb2x2ZSwgc3NyRXh0ZXJuYWxzLCBzZWVuLCBjb25maWcubG9nZ2VyKTtcbiAgICBjb25zdCBpbXBvcnRlZERlcHMgPSBrbm93bkltcG9ydHMubWFwKGdldE5wbVBhY2thZ2VOYW1lKS5maWx0ZXIoaXNEZWZpbmVkKTtcbiAgICBmb3IgKGNvbnN0IGRlcCBvZiBpbXBvcnRlZERlcHMpIHtcbiAgICAgICAgLy8gQXNzdW1lIGV4dGVybmFsIGlmIG5vdCB5ZXQgc2VlblxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgcHJvamVjdCByb290IGFuZCBhbnkgbGlua2VkIHBhY2thZ2VzIGhhdmUgaGFkIHRoZWlyIGRlcGVuZGVuY2llcyBjaGVja2VkLFxuICAgICAgICAvLyBzbyB3ZSBjYW4gc2FmZWx5IG1hcmsgYW55IGtub3duSW1wb3J0cyBub3QgeWV0IHNlZW4gYXMgZXh0ZXJuYWwuIFRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gYmVcbiAgICAgICAgLy8gZGVwZW5kZW5jaWVzIG9mIHBhY2thZ2VzIGluIG5vZGVfbW9kdWxlcy5cbiAgICAgICAgaWYgKCFzZWVuLmhhcyhkZXApKSB7XG4gICAgICAgICAgICBzc3JFeHRlcm5hbHMuYWRkKGRlcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZW5zdXJlIGB2aXRlL2R5bmFtaWMtaW1wb3J0LXBvbHlmaWxsYCBpcyBidW5kbGVkIChpc3N1ZSAjMTg2NSlcbiAgICBzc3JFeHRlcm5hbHMuZGVsZXRlKCd2aXRlJyk7XG4gICAgbGV0IGV4dGVybmFscyA9IFsuLi5zc3JFeHRlcm5hbHNdO1xuICAgIGlmIChzc3JDb25maWc/Lm5vRXh0ZXJuYWwpIHtcbiAgICAgICAgZXh0ZXJuYWxzID0gZXh0ZXJuYWxzLmZpbHRlcihjcmVhdGVGaWx0ZXIodW5kZWZpbmVkLCBzc3JDb25maWcubm9FeHRlcm5hbCwgeyByZXNvbHZlOiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIHJldHVybiBleHRlcm5hbHM7XG59XG5jb25zdCBDSlNfQ09OVEVOVF9SRSA9IC9cXGJtb2R1bGVcXC5leHBvcnRzXFxifFxcYmV4cG9ydHNbLltdfFxcYnJlcXVpcmVcXHMqXFwofFxcYk9iamVjdFxcLig/OmRlZmluZVByb3BlcnR5fGRlZmluZVByb3BlcnRpZXN8YXNzaWduKVxccypcXChcXHMqZXhwb3J0c1xcYi87XG4vLyBUT0RPOiB1c2UgaW1wb3J0KClcbmNvbnN0IF9yZXF1aXJlJDIgPSBjcmVhdGVSZXF1aXJlJDEoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IGlzU3NyRXh0ZXJuYWxDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBzaG91bGRFeHRlcm5hbGl6ZUZvclNTUihpZCwgY29uZmlnKSB7XG4gICAgbGV0IGlzU3NyRXh0ZXJuYWwgPSBpc1NzckV4dGVybmFsQ2FjaGUuZ2V0KGNvbmZpZyk7XG4gICAgaWYgKCFpc1NzckV4dGVybmFsKSB7XG4gICAgICAgIGlzU3NyRXh0ZXJuYWwgPSBjcmVhdGVJc1NzckV4dGVybmFsKGNvbmZpZyk7XG4gICAgICAgIGlzU3NyRXh0ZXJuYWxDYWNoZS5zZXQoY29uZmlnLCBpc1NzckV4dGVybmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzU3NyRXh0ZXJuYWwoaWQpO1xufVxuZnVuY3Rpb24gY3JlYXRlSXNDb25maWd1cmVkQXNTc3JFeHRlcm5hbChjb25maWcpIHtcbiAgICBjb25zdCB7IHNzciwgcm9vdCB9ID0gY29uZmlnO1xuICAgIGNvbnN0IG5vRXh0ZXJuYWwgPSBzc3I/Lm5vRXh0ZXJuYWw7XG4gICAgY29uc3Qgbm9FeHRlcm5hbEZpbHRlciA9IG5vRXh0ZXJuYWwgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHR5cGVvZiBub0V4dGVybmFsICE9PSAnYm9vbGVhbicgJiZcbiAgICAgICAgY3JlYXRlRmlsdGVyKHVuZGVmaW5lZCwgbm9FeHRlcm5hbCwgeyByZXNvbHZlOiBmYWxzZSB9KTtcbiAgICBjb25zdCByZXNvbHZlT3B0aW9ucyA9IHtcbiAgICAgICAgLi4uY29uZmlnLnJlc29sdmUsXG4gICAgICAgIHJvb3QsXG4gICAgICAgIGlzUHJvZHVjdGlvbjogZmFsc2UsXG4gICAgICAgIGlzQnVpbGQ6IHRydWUsXG4gICAgfTtcbiAgICBjb25zdCBpc0V4dGVybmFsaXphYmxlID0gKGlkLCBjb25maWd1cmVkQXNFeHRlcm5hbCkgPT4ge1xuICAgICAgICBpZiAoIWJhcmVJbXBvcnRSRS50ZXN0KGlkKSB8fCBpZC5pbmNsdWRlcygnXFwwJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuICEhdHJ5Tm9kZVJlc29sdmUoaWQsIHVuZGVmaW5lZCwgcmVzb2x2ZU9wdGlvbnMsIHNzcj8udGFyZ2V0ID09PSAnd2Vid29ya2VyJywgdW5kZWZpbmVkLCB0cnVlLCBcbiAgICAgICAgICAgIC8vIHRyeSB0byBleHRlcm5hbGl6ZSwgd2lsbCByZXR1cm4gdW5kZWZpbmVkIG9yIGFuIG9iamVjdCB3aXRob3V0XG4gICAgICAgICAgICAvLyBhIGV4dGVybmFsIGZsYWcgaWYgaXQgaXNuJ3QgZXh0ZXJuYWxpemFibGVcbiAgICAgICAgICAgIHRydWUsIFxuICAgICAgICAgICAgLy8gQWxsb3cgbGlua2VkIHBhY2thZ2VzIHRvIGJlIGV4dGVybmFsaXplZCBpZiB0aGV5IGFyZSBleHBsaWNpdGx5XG4gICAgICAgICAgICAvLyBjb25maWd1cmVkIGFzIGV4dGVybmFsXG4gICAgICAgICAgICAhIWNvbmZpZ3VyZWRBc0V4dGVybmFsKT8uZXh0ZXJuYWw7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnJGIoYEZhaWxlZCB0byBub2RlIHJlc29sdmUgXCIke2lkfVwiLiBTa2lwcGluZyBleHRlcm5hbGl6aW5nIGl0IGJ5IGRlZmF1bHQuYCk7XG4gICAgICAgICAgICAvLyBtYXkgYmUgYW4gaW52YWxpZCBpbXBvcnQgdGhhdCdzIHJlc29sdmVkIGJ5IGEgcGx1Z2luXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBjb25maWd1cmVkIGFzIGV4dGVybmFsLCBmYWxzZSBpZiBpdCBpcyBmaWx0ZXJlZFxuICAgIC8vIGJ5IG5vRXh0ZXJuYWwgYW5kIHVuZGVmaW5lZCBpZiBpdCBpc24ndCBhZmZlY3RlZCBieSB0aGUgZXhwbGljaXQgY29uZmlnXG4gICAgcmV0dXJuIChpZCkgPT4ge1xuICAgICAgICBjb25zdCB7IHNzciB9ID0gY29uZmlnO1xuICAgICAgICBpZiAoc3NyKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlkIGlzIGRlZmluZWQgYXMgZXh0ZXJuYWwsIGZvcmNlIGl0IGFzIGV4dGVybmFsXG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgaW5kaXZpZHVhbCBwYWNrYWdlIGVudHJpZXMgYXJlIGFsbG93ZWQgaW4gc3NyLmV4dGVybmFsXG4gICAgICAgICAgICBzc3IuZXh0ZXJuYWw/LmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGtnTmFtZSA9IGdldE5wbVBhY2thZ2VOYW1lKGlkKTtcbiAgICAgICAgICAgIGlmICghcGtnTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc0V4dGVybmFsaXphYmxlKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIEEgcGFja2FnZSBuYW1lIGluIHNzci5leHRlcm5hbCBleHRlcm5hbGl6ZXMgZXZlcnlcbiAgICAgICAgICAgIC8vIGV4dGVybmFsaXphYmxlIHBhY2thZ2UgZW50cnlcbiAgICAgICAgICAgIHNzci5leHRlcm5hbD8uaW5jbHVkZXMocGtnTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNFeHRlcm5hbGl6YWJsZShpZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vRXh0ZXJuYWwgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAhbm9FeHRlcm5hbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub0V4dGVybmFsRmlsdGVyICYmICFub0V4dGVybmFsRmlsdGVyKHBrZ05hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0V4dGVybmFsaXphYmxlKGlkKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSXNTc3JFeHRlcm5hbChjb25maWcpIHtcbiAgICBjb25zdCBwcm9jZXNzZWRJZHMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgaXNDb25maWd1cmVkQXNFeHRlcm5hbCA9IGNyZWF0ZUlzQ29uZmlndXJlZEFzU3NyRXh0ZXJuYWwoY29uZmlnKTtcbiAgICByZXR1cm4gKGlkKSA9PiB7XG4gICAgICAgIGlmIChwcm9jZXNzZWRJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZElkcy5nZXQoaWQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBleHRlcm5hbCA9IGZhbHNlO1xuICAgICAgICBpZiAoIWlkLnN0YXJ0c1dpdGgoJy4nKSAmJiAhcGF0aCRvLmlzQWJzb2x1dGUoaWQpKSB7XG4gICAgICAgICAgICBleHRlcm5hbCA9IGlzQnVpbHRpbihpZCkgfHwgaXNDb25maWd1cmVkQXNFeHRlcm5hbChpZCk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc2VkSWRzLnNldChpZCwgZXh0ZXJuYWwpO1xuICAgICAgICByZXR1cm4gZXh0ZXJuYWw7XG4gICAgfTtcbn1cbi8vIFdoZW4gY29uZmlnLmV4cGVyaW1lbnRhbC5idWlsZFNzckNqc0V4dGVybmFsSGV1cmlzdGljcyBpcyBlbmFibGVkLCB0aGlzIGZ1bmN0aW9uXG4vLyBpcyB1c2VkIHJldmVydGluZyB0byB0aGUgVml0ZSAyLjkgU1NSIGV4dGVybmFsaXphdGlvbiBoZXVyaXN0aWNzXG5mdW5jdGlvbiBjanNTc3JDb2xsZWN0RXh0ZXJuYWxzKHJvb3QsIHJlc29sdmVPcHRpb25zLCBzc3JFeHRlcm5hbHMsIHNlZW4sIGxvZ2dlcikge1xuICAgIGNvbnN0IHJvb3RQa2dDb250ZW50ID0gbG9va3VwRmlsZShyb290LCBbJ3BhY2thZ2UuanNvbiddKTtcbiAgICBpZiAoIXJvb3RQa2dDb250ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm9vdFBrZyA9IEpTT04ucGFyc2Uocm9vdFBrZ0NvbnRlbnQpO1xuICAgIGNvbnN0IGRlcHMgPSB7XG4gICAgICAgIC4uLnJvb3RQa2cuZGV2RGVwZW5kZW5jaWVzLFxuICAgICAgICAuLi5yb290UGtnLmRlcGVuZGVuY2llcyxcbiAgICB9O1xuICAgIGNvbnN0IGludGVybmFsUmVzb2x2ZU9wdGlvbnMgPSB7XG4gICAgICAgIC4uLnJlc29sdmVPcHRpb25zLFxuICAgICAgICByb290LFxuICAgICAgICBpc1Byb2R1Y3Rpb246IGZhbHNlLFxuICAgICAgICBpc0J1aWxkOiB0cnVlLFxuICAgIH07XG4gICAgY29uc3QgZGVwc1RvVHJhY2UgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBpZCBpbiBkZXBzKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhpZCkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgc2Vlbi5hZGQoaWQpO1xuICAgICAgICBsZXQgZXNtRW50cnk7XG4gICAgICAgIGxldCByZXF1aXJlRW50cnk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlc21FbnRyeSA9IHRyeU5vZGVSZXNvbHZlKGlkLCB1bmRlZmluZWQsIGludGVybmFsUmVzb2x2ZU9wdGlvbnMsIHRydWUsIC8vIHdlIHNldCBgdGFyZ2V0V2ViYCB0byBgdHJ1ZWAgdG8gZ2V0IHRoZSBFU00gZW50cnlcbiAgICAgICAgICAgIHVuZGVmaW5lZCwgdHJ1ZSk/LmlkO1xuICAgICAgICAgICAgLy8gbm9ybWFsaXplUGF0aCByZXF1aXJlZCBmb3Igd2luZG93cy4gdHJ5Tm9kZVJlc29sdmUgdXNlcyBub3JtYWxpemVQYXRoXG4gICAgICAgICAgICAvLyB3aGljaCByZXR1cm5zIHdpdGggJy8nLCByZXF1aXJlLnJlc29sdmUgcmV0dXJucyB3aXRoICdcXFxcJ1xuICAgICAgICAgICAgcmVxdWlyZUVudHJ5ID0gbm9ybWFsaXplUGF0aCQzKF9yZXF1aXJlJDIucmVzb2x2ZShpZCwgeyBwYXRoczogW3Jvb3RdIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBubyBtYWluIGVudHJ5LCBidXQgZGVlcCBpbXBvcnRzIG1heSBiZSBhbGxvd2VkXG4gICAgICAgICAgICAgICAgY29uc3QgcGtnUGF0aCA9IHJlc29sdmVGcm9tKGAke2lkfS9wYWNrYWdlLmpzb25gLCByb290KTtcbiAgICAgICAgICAgICAgICBpZiAocGtnUGF0aC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykpIHtcbiAgICAgICAgICAgICAgICAgICAgc3NyRXh0ZXJuYWxzLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZXBzVG9UcmFjZS5hZGQocGF0aCRvLmRpcm5hbWUocGtnUGF0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHsgfVxuICAgICAgICAgICAgLy8gcmVzb2x2ZSBmYWlsZWQsIGFzc3VtZSBpbmNsdWRlXG4gICAgICAgICAgICBkZWJ1ZyRiKGBGYWlsZWQgdG8gcmVzb2x2ZSBlbnRyaWVzIGZvciBwYWNrYWdlIFwiJHtpZH1cIlxcbmAsIGUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm8gZXNtIGVudHJ5IGJ1dCBoYXMgcmVxdWlyZSBlbnRyeVxuICAgICAgICBpZiAoIWVzbUVudHJ5KSB7XG4gICAgICAgICAgICBzc3JFeHRlcm5hbHMuYWRkKGlkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0cmFjZSB0aGUgZGVwZW5kZW5jaWVzIG9mIGxpbmtlZCBwYWNrYWdlc1xuICAgICAgICBlbHNlIGlmICghZXNtRW50cnkuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcycpKSB7XG4gICAgICAgICAgICBjb25zdCBwa2dQYXRoID0gcmVzb2x2ZUZyb20oYCR7aWR9L3BhY2thZ2UuanNvbmAsIHJvb3QpO1xuICAgICAgICAgICAgZGVwc1RvVHJhY2UuYWRkKHBhdGgkby5kaXJuYW1lKHBrZ1BhdGgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBoYXMgc2VwYXJhdGUgZXNtL3JlcXVpcmUgZW50cnksIGFzc3VtZSByZXF1aXJlIGVudHJ5IGlzIGNqc1xuICAgICAgICBlbHNlIGlmIChlc21FbnRyeSAhPT0gcmVxdWlyZUVudHJ5KSB7XG4gICAgICAgICAgICBzc3JFeHRlcm5hbHMuYWRkKGlkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSdyZSBleHRlcm5hbGl6aW5nIEVTTSBhbmQgQ0pTIHNob3VsZCBiYXNpY2FsbHkganVzdCBhbHdheXMgZG8gaXQ/XG4gICAgICAgIC8vIG9yIGFyZSB0aGVyZSBvdGhlcnMgbGlrZSBTeXN0ZW1KUyAvIEFNRCB0aGF0IHdlJ2QgbmVlZCB0byBoYW5kbGU/XG4gICAgICAgIC8vIGZvciBub3csIHdlJ2xsIGp1c3QgbGVhdmUgdGhpcyBhcyBpc1xuICAgICAgICBlbHNlIGlmICgvXFwubT9qcyQvLnRlc3QoZXNtRW50cnkpKSB7XG4gICAgICAgICAgICBjb25zdCBwa2dQYXRoID0gcmVzb2x2ZUZyb20oYCR7aWR9L3BhY2thZ2UuanNvbmAsIHJvb3QpO1xuICAgICAgICAgICAgY29uc3QgcGtnQ29udGVudCA9IGZzJGwucmVhZEZpbGVTeW5jKHBrZ1BhdGgsICd1dGYtOCcpO1xuICAgICAgICAgICAgaWYgKCFwa2dDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKHBrZ0NvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKHBrZy50eXBlID09PSAnbW9kdWxlJyB8fCBlc21FbnRyeS5lbmRzV2l0aCgnLm1qcycpKSB7XG4gICAgICAgICAgICAgICAgc3NyRXh0ZXJuYWxzLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZW50cnkgaXMgY2pzXG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gZnMkbC5yZWFkRmlsZVN5bmMoZXNtRW50cnksICd1dGYtOCcpO1xuICAgICAgICAgICAgaWYgKENKU19DT05URU5UX1JFLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgICAgICAgICBzc3JFeHRlcm5hbHMuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGAke2lkfSBkb2Vzbid0IGFwcGVhciB0byBiZSB3cml0dGVuIGluIENKUywgYnV0IGFsc28gZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBFUyBtb2R1bGUgKGkuZS4gaXQgZG9lc24ndCBoYXZlIFwidHlwZVwiOiBcIm1vZHVsZVwiIG9yIGFuIC5tanMgZXh0ZW5zaW9uIGZvciB0aGUgZW50cnkgcG9pbnQpLiBQbGVhc2UgY29udGFjdCB0aGUgcGFja2FnZSBhdXRob3IgdG8gZml4LmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGVwUm9vdCBvZiBkZXBzVG9UcmFjZSkge1xuICAgICAgICBjanNTc3JDb2xsZWN0RXh0ZXJuYWxzKGRlcFJvb3QsIHJlc29sdmVPcHRpb25zLCBzc3JFeHRlcm5hbHMsIHNlZW4sIGxvZ2dlcik7XG4gICAgfVxufVxuZnVuY3Rpb24gY2pzU2hvdWxkRXh0ZXJuYWxpemVGb3JTU1IoaWQsIGV4dGVybmFscykge1xuICAgIGlmICghZXh0ZXJuYWxzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkID0gZXh0ZXJuYWxzLnNvbWUoKGUpID0+IHtcbiAgICAgICAgaWYgKGlkID09PSBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkZWVwIGltcG9ydHMsIGNoZWNrIGV4dCBiZWZvcmUgZXh0ZXJuYWxpemluZyAtIG9ubHkgZXh0ZXJuYWxpemVcbiAgICAgICAgLy8gZXh0ZW5zaW9uLWxlc3MgaW1wb3J0cyBhbmQgZXhwbGljaXQgLmpzIGltcG9ydHNcbiAgICAgICAgaWYgKGlkLnN0YXJ0c1dpdGgoZSArICcvJykgJiYgKCFwYXRoJG8uZXh0bmFtZShpZCkgfHwgaWQuZW5kc1dpdGgoJy5qcycpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2hvdWxkO1xufVxuZnVuY3Rpb24gZ2V0TnBtUGFja2FnZU5hbWUoaW1wb3J0UGF0aCkge1xuICAgIGNvbnN0IHBhcnRzID0gaW1wb3J0UGF0aC5zcGxpdCgnLycpO1xuICAgIGlmIChwYXJ0c1swXS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgaWYgKCFwYXJ0c1sxXSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gYCR7cGFydHNbMF19LyR7cGFydHNbMV19YDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJ0c1swXTtcbiAgICB9XG59XG5cbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9wbHVnaW5zL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL2pzb24vc3JjL2luZGV4LmpzXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcGx1Z2lucy9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cbi8vIEN1c3RvbSBqc29uIGZpbHRlciBmb3Igdml0ZVxuY29uc3QganNvbkV4dFJFID0gL1xcLmpzb24oPzokfFxcPykoPyFjb21tb25qcy0oPzpwcm94eXxleHRlcm5hbCkpLztcbmNvbnN0IGpzb25MYW5ncyA9IGBcXFxcLig/Ompzb258anNvbjUpKD86JHxcXFxcPylgO1xuY29uc3QganNvbkxhbmdSRSA9IG5ldyBSZWdFeHAoanNvbkxhbmdzKTtcbmNvbnN0IGlzSlNPTlJlcXVlc3QgPSAocmVxdWVzdCkgPT4ganNvbkxhbmdSRS50ZXN0KHJlcXVlc3QpO1xuZnVuY3Rpb24ganNvblBsdWdpbihvcHRpb25zID0ge30sIGlzQnVpbGQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTpqc29uJyxcbiAgICAgICAgdHJhbnNmb3JtKGpzb24sIGlkKSB7XG4gICAgICAgICAgICBpZiAoIWpzb25FeHRSRS50ZXN0KGlkKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmIChTUEVDSUFMX1FVRVJZX1JFLnRlc3QoaWQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAganNvbiA9IHN0cmlwQm9tVGFnKGpzb24pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zdHJpbmdpZnkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQnVpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyaW5nIGJ1aWxkLCBwYXJzZSB0aGVuIGRvdWJsZS1zdHJpbmdpZnkgdG8gcmVtb3ZlIGFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHdoaXRlc3BhY2VzIHRvIHJlZHVjZSBidW5kbGUgc2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBgZXhwb3J0IGRlZmF1bHQgSlNPTi5wYXJzZSgke0pTT04uc3RyaW5naWZ5KEpTT04uc3RyaW5naWZ5KEpTT04ucGFyc2UoanNvbikpKX0pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IHsgbWFwcGluZ3M6ICcnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBleHBvcnQgZGVmYXVsdCBKU09OLnBhcnNlKCR7SlNPTi5zdHJpbmdpZnkoanNvbil9KWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBkYXRhVG9Fc20ocGFyc2VkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJDb25zdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkRXhwb3J0czogb3B0aW9ucy5uYW1lZEV4cG9ydHMsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBtYXA6IHsgbWFwcGluZ3M6ICcnIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlTGlzdCA9IC9cXGQrLy5leGVjKGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBlcnJvck1lc3NhZ2VMaXN0ICYmIHBhcnNlSW50KGVycm9yTWVzc2FnZUxpc3RbMF0sIDEwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICA/IGAsIGludmFsaWQgSlNPTiBzeW50YXggZm91bmQgYXQgbGluZSAke3Bvc2l0aW9ufWBcbiAgICAgICAgICAgICAgICAgICAgOiBgLmA7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIEpTT04gZmlsZWAgKyBtc2csIGUuaWR4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5jb25zdCBFUlJfT1BUSU1JWkVfREVQU19QUk9DRVNTSU5HX0VSUk9SID0gJ0VSUl9PUFRJTUlaRV9ERVBTX1BST0NFU1NJTkdfRVJST1InO1xuY29uc3QgRVJSX09VVERBVEVEX09QVElNSVpFRF9ERVAgPSAnRVJSX09VVERBVEVEX09QVElNSVpFRF9ERVAnO1xuY29uc3QgaXNEZWJ1ZyQzID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5jb25zdCBkZWJ1ZyRhID0gY3JlYXRlRGVidWdnZXIoJ3ZpdGU6b3B0aW1pemUtZGVwcycpO1xuZnVuY3Rpb24gb3B0aW1pemVkRGVwc1BsdWdpbihjb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTpvcHRpbWl6ZWQtZGVwcycsXG4gICAgICAgIGFzeW5jIHJlc29sdmVJZChpZCwgc291cmNlLCB7IHNzciB9KSB7XG4gICAgICAgICAgICBpZiAoZ2V0RGVwc09wdGltaXplcihjb25maWcsIHNzcik/LmlzT3B0aW1pemVkRGVwRmlsZShpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIHRoaXMubG9hZCh7IGlkIH0pIGlzbid0IGltcGxlbWVudGVkIGluIFBsdWdpbkNvbnRhaW5lclxuICAgICAgICAvLyBUaGUgbG9naWMgdG8gcmVnaXN0ZXIgYW4gaWQgdG8gd2FpdCB1bnRpbCBpdCBpcyBwcm9jZXNzZWRcbiAgICAgICAgLy8gaXMgaW4gaW1wb3J0QW5hbHlzaXMsIHNlZSBjYWxsIHRvIGRlbGF5RGVwc09wdGltaXplclVudGlsXG4gICAgICAgIGFzeW5jIGxvYWQoaWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNzciA9IG9wdGlvbnM/LnNzciA9PT0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGRlcHNPcHRpbWl6ZXIgPSBnZXREZXBzT3B0aW1pemVyKGNvbmZpZywgc3NyKTtcbiAgICAgICAgICAgIGlmIChkZXBzT3B0aW1pemVyPy5pc09wdGltaXplZERlcEZpbGUoaWQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBkZXBzT3B0aW1pemVyLm1ldGFkYXRhO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBjbGVhblVybChpZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbk1hdGNoID0gaWQubWF0Y2goREVQX1ZFUlNJT05fUkUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyb3dzZXJIYXNoID0gdmVyc2lvbk1hdGNoXG4gICAgICAgICAgICAgICAgICAgID8gdmVyc2lvbk1hdGNoWzFdLnNwbGl0KCc9JylbMV1cbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgLy8gU2VhcmNoIGluIGJvdGggdGhlIGN1cnJlbnRseSBvcHRpbWl6ZWQgYW5kIG5ld2x5IGRpc2NvdmVyZWQgZGVwc1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBvcHRpbWl6ZWREZXBJbmZvRnJvbUZpbGUobWV0YWRhdGEsIGZpbGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChicm93c2VySGFzaCAmJiBpbmZvLmJyb3dzZXJIYXNoICE9PSBicm93c2VySGFzaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dPdXRkYXRlZFJlcXVlc3QoaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGVudHJ5IHBvaW50LCBpdCBtYXkgc3RpbGwgbm90IGJlIGJ1bmRsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGluZm8ucHJvY2Vzc2luZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVmcmVzaCBoYXMgbm90IGhhcHBlbmVkIGFmdGVyIHRpbWVvdXQsIFZpdGUgY29uc2lkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXMgaGFwcGVuZWQuIEluIHRoaXMgY2FzZSwgVml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyBhbiBlbXB0eSByZXNwb25zZSB0aGF0IHdpbGwgZXJyb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd1Byb2Nlc3NpbmdFcnJvcihpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3TWV0YWRhdGEgPSBkZXBzT3B0aW1pemVyLm1ldGFkYXRhO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEgIT09IG5ld01ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SW5mbyA9IG9wdGltaXplZERlcEluZm9Gcm9tRmlsZShuZXdNZXRhZGF0YSwgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5icm93c2VySGFzaCAhPT0gY3VycmVudEluZm8/LmJyb3dzZXJIYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dPdXRkYXRlZFJlcXVlc3QoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlzRGVidWckMyAmJiBkZWJ1ZyRhKGBsb2FkICR7cGljb2NvbG9yc0V4cG9ydHMuY3lhbihmaWxlKX1gKTtcbiAgICAgICAgICAgICAgICAvLyBMb2FkIHRoZSBmaWxlIGZyb20gdGhlIGNhY2hlIGluc3RlYWQgb2Ygd2FpdGluZyBmb3Igb3RoZXIgcGx1Z2luXG4gICAgICAgICAgICAgICAgLy8gbG9hZCBob29rcyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMsIG9uY2UgcHJvY2Vzc2luZyBpcyByZXNvbHZlZCxcbiAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBmaWxlIGhhcyBiZWVuIHByb3Blcmx5IHNhdmUgdG8gZGlza1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlcyQyLnJlYWRGaWxlKGZpbGUsICd1dGYtOCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBPdXRkYXRlZCBub24tZW50cnkgcG9pbnRzIChDSFVOSyksIGxvYWRlZCBhZnRlciBhIHJlcnVuXG4gICAgICAgICAgICAgICAgICAgIHRocm93T3V0ZGF0ZWRSZXF1ZXN0KGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIG9wdGltaXplZERlcHNCdWlsZFBsdWdpbihjb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTpvcHRpbWl6ZWQtZGVwcy1idWlsZCcsXG4gICAgICAgIGJ1aWxkU3RhcnQoKSB7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5pc1dvcmtlcikge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBydW4gZm9yIHRoZSBjdXJyZW50IGFjdGl2ZSBvcHRpbWl6ZXIsIGR1cmluZyBidWlsZFxuICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgYmUgdGhlIFNTUiBvcHRpbWl6ZXIgaWYgY29uZmlnLmJ1aWxkLnNzciBpcyBkZWZpbmVkXG4gICAgICAgICAgICAgICAgZ2V0RGVwc09wdGltaXplcihjb25maWcpPy5yZXNldFJlZ2lzdGVyZWRJZHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgcmVzb2x2ZUlkKGlkLCBpbXBvcnRlciwgeyBzc3IgfSkge1xuICAgICAgICAgICAgaWYgKGdldERlcHNPcHRpbWl6ZXIoY29uZmlnLCBzc3IpPy5pc09wdGltaXplZERlcEZpbGUoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm0oX2NvZGUsIGlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBzc3IgPSBvcHRpb25zPy5zc3IgPT09IHRydWU7XG4gICAgICAgICAgICBnZXREZXBzT3B0aW1pemVyKGNvbmZpZywgc3NyKT8uZGVsYXlEZXBzT3B0aW1pemVyVW50aWwoaWQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWQoeyBpZCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBsb2FkKGlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBzc3IgPSBvcHRpb25zPy5zc3IgPT09IHRydWU7XG4gICAgICAgICAgICBjb25zdCBkZXBzT3B0aW1pemVyID0gZ2V0RGVwc09wdGltaXplcihjb25maWcsIHNzcik7XG4gICAgICAgICAgICBpZiAoIWRlcHNPcHRpbWl6ZXI/LmlzT3B0aW1pemVkRGVwRmlsZShpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZXBzT3B0aW1pemVyPy5lbnN1cmVGaXJzdFJ1bigpO1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IGNsZWFuVXJsKGlkKTtcbiAgICAgICAgICAgIC8vIFNlYXJjaCBpbiBib3RoIHRoZSBjdXJyZW50bHkgb3B0aW1pemVkIGFuZCBuZXdseSBkaXNjb3ZlcmVkIGRlcHNcbiAgICAgICAgICAgIC8vIElmIGFsbCB0aGUgaW5wdXRzIGFyZSBkZXBlbmRlbmNpZXMsIHdlIGFyZW4ndCBnb2luZyB0byBnZXQgYW55XG4gICAgICAgICAgICBjb25zdCBpbmZvID0gb3B0aW1pemVkRGVwSW5mb0Zyb21GaWxlKGRlcHNPcHRpbWl6ZXIubWV0YWRhdGEsIGZpbGUpO1xuICAgICAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGVudHJ5IHBvaW50LCBpdCBtYXkgc3RpbGwgbm90IGJlIGJ1bmRsZWRcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaW5mby5wcm9jZXNzaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZWZyZXNoIGhhcyBub3QgaGFwcGVuZWQgYWZ0ZXIgdGltZW91dCwgVml0ZSBjb25zaWRlcnNcbiAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFzIGhhcHBlbmVkLiBJbiB0aGlzIGNhc2UsIFZpdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyBhbiBlbXB0eSByZXNwb25zZSB0aGF0IHdpbGwgZXJyb3IuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm93UHJvY2Vzc2luZ0Vycm9yKGlkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlzRGVidWckMyAmJiBkZWJ1ZyRhKGBsb2FkICR7cGljb2NvbG9yc0V4cG9ydHMuY3lhbihmaWxlKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTG9hZCB0aGUgZmlsZSBmcm9tIHRoZSBjYWNoZSBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIG90aGVyIHBsdWdpblxuICAgICAgICAgICAgLy8gbG9hZCBob29rcyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMsIG9uY2UgcHJvY2Vzc2luZyBpcyByZXNvbHZlZCxcbiAgICAgICAgICAgIC8vIHdlIGFyZSBzdXJlIHRoYXQgdGhlIGZpbGUgaGFzIGJlZW4gcHJvcGVybHkgc2F2ZSB0byBkaXNrXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBwcm9taXNlcyQyLnJlYWRGaWxlKGZpbGUsICd1dGYtOCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBPdXRkYXRlZCBub24tZW50cnkgcG9pbnRzIChDSFVOSyksIGxvYWRlZCBhZnRlciBhIHJlcnVuXG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5mdW5jdGlvbiB0aHJvd1Byb2Nlc3NpbmdFcnJvcihpZCkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgU29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuZWQgd2hpbGUgb3B0aW1pemluZyBcIiR7aWR9XCIuIGAgK1xuICAgICAgICBgVGhlIGN1cnJlbnQgcGFnZSBzaG91bGQgaGF2ZSByZWxvYWRlZCBieSBub3dgKTtcbiAgICBlcnIuY29kZSA9IEVSUl9PUFRJTUlaRV9ERVBTX1BST0NFU1NJTkdfRVJST1I7XG4gICAgLy8gVGhpcyBlcnJvciB3aWxsIGJlIGNhdWdodCBieSB0aGUgdHJhbnNmb3JtIG1pZGRsZXdhcmUgdGhhdCB3aWxsXG4gICAgLy8gc2VuZCBhIDUwNCBzdGF0dXMgY29kZSByZXF1ZXN0IHRpbWVvdXRcbiAgICB0aHJvdyBlcnI7XG59XG5mdW5jdGlvbiB0aHJvd091dGRhdGVkUmVxdWVzdChpZCkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgVGhlcmUgaXMgYSBuZXcgdmVyc2lvbiBvZiB0aGUgcHJlLWJ1bmRsZSBmb3IgXCIke2lkfVwiLCBgICtcbiAgICAgICAgYGEgcGFnZSByZWxvYWQgaXMgZ29pbmcgdG8gYXNrIGZvciBpdC5gKTtcbiAgICBlcnIuY29kZSA9IEVSUl9PVVREQVRFRF9PUFRJTUlaRURfREVQO1xuICAgIC8vIFRoaXMgZXJyb3Igd2lsbCBiZSBjYXVnaHQgYnkgdGhlIHRyYW5zZm9ybSBtaWRkbGV3YXJlIHRoYXQgd2lsbFxuICAgIC8vIHNlbmQgYSA1MDQgc3RhdHVzIGNvZGUgcmVxdWVzdCB0aW1lb3V0XG4gICAgdGhyb3cgZXJyO1xufVxuXG52YXIgZGlzdCA9IHt9O1xuXG4oZnVuY3Rpb24gKGV4cG9ydHMpIHtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHRleHBvcnRzLmxpbGNvbmZpZ1N5bmMgPSBleHBvcnRzLmxpbGNvbmZpZyA9IGV4cG9ydHMuZGVmYXVsdExvYWRlcnMgPSB2b2lkIDA7XG5cdGNvbnN0IHBhdGggPSByZXF1aXJlJCQwJDQ7XG5cdGNvbnN0IGZzID0gcmVxdWlyZSQkMF9fZGVmYXVsdDtcblx0Y29uc3Qgb3MgPSByZXF1aXJlJCQyO1xuXHRjb25zdCBmc1JlYWRGaWxlQXN5bmMgPSBmcy5wcm9taXNlcy5yZWFkRmlsZTtcblx0ZnVuY3Rpb24gZ2V0RGVmYXVsdFNlYXJjaFBsYWNlcyhuYW1lKSB7XG5cdCAgICByZXR1cm4gW1xuXHQgICAgICAgICdwYWNrYWdlLmpzb24nLFxuXHQgICAgICAgIGAuJHtuYW1lfXJjLmpzb25gLFxuXHQgICAgICAgIGAuJHtuYW1lfXJjLmpzYCxcblx0ICAgICAgICBgJHtuYW1lfS5jb25maWcuanNgLFxuXHQgICAgICAgIGAuJHtuYW1lfXJjLmNqc2AsXG5cdCAgICAgICAgYCR7bmFtZX0uY29uZmlnLmNqc2AsXG5cdCAgICBdO1xuXHR9XG5cdGZ1bmN0aW9uIGdldFNlYXJjaFBhdGhzKHN0YXJ0RGlyLCBzdG9wRGlyKSB7XG5cdCAgICByZXR1cm4gc3RhcnREaXJcblx0ICAgICAgICAuc3BsaXQocGF0aC5zZXApXG5cdCAgICAgICAgLnJlZHVjZVJpZ2h0KChhY2MsIF8sIGluZCwgYXJyKSA9PiB7XG5cdCAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBhcnIuc2xpY2UoMCwgaW5kICsgMSkuam9pbihwYXRoLnNlcCk7XG5cdCAgICAgICAgaWYgKCFhY2MucGFzc2VkU3RvcERpcilcblx0ICAgICAgICAgICAgYWNjLnNlYXJjaFBsYWNlcy5wdXNoKGN1cnJlbnRQYXRoIHx8IHBhdGguc2VwKTtcblx0ICAgICAgICBpZiAoY3VycmVudFBhdGggPT09IHN0b3BEaXIpXG5cdCAgICAgICAgICAgIGFjYy5wYXNzZWRTdG9wRGlyID0gdHJ1ZTtcblx0ICAgICAgICByZXR1cm4gYWNjO1xuXHQgICAgfSwgeyBzZWFyY2hQbGFjZXM6IFtdLCBwYXNzZWRTdG9wRGlyOiBmYWxzZSB9KS5zZWFyY2hQbGFjZXM7XG5cdH1cblx0ZXhwb3J0cy5kZWZhdWx0TG9hZGVycyA9IE9iamVjdC5mcmVlemUoe1xuXHQgICAgJy5qcyc6IF9fcmVxdWlyZSxcblx0ICAgICcuanNvbic6IF9fcmVxdWlyZSxcblx0ICAgICcuY2pzJzogX19yZXF1aXJlLFxuXHQgICAgbm9FeHQoXywgY29udGVudCkge1xuXHQgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbnRlbnQpO1xuXHQgICAgfSxcblx0fSk7XG5cdGZ1bmN0aW9uIGdldEV4dERlc2MoZXh0KSB7XG5cdCAgICByZXR1cm4gZXh0ID09PSAnbm9FeHQnID8gJ2ZpbGVzIHdpdGhvdXQgZXh0ZW5zaW9ucycgOiBgZXh0ZW5zaW9uIFwiJHtleHR9XCJgO1xuXHR9XG5cdGZ1bmN0aW9uIGdldE9wdGlvbnMobmFtZSwgb3B0aW9ucyA9IHt9KSB7XG5cdCAgICBjb25zdCBjb25mID0ge1xuXHQgICAgICAgIHN0b3BEaXI6IG9zLmhvbWVkaXIoKSxcblx0ICAgICAgICBzZWFyY2hQbGFjZXM6IGdldERlZmF1bHRTZWFyY2hQbGFjZXMobmFtZSksXG5cdCAgICAgICAgaWdub3JlRW1wdHlTZWFyY2hQbGFjZXM6IHRydWUsXG5cdCAgICAgICAgdHJhbnNmb3JtOiAoeCkgPT4geCxcblx0ICAgICAgICBwYWNrYWdlUHJvcDogW25hbWVdLFxuXHQgICAgICAgIC4uLm9wdGlvbnMsXG5cdCAgICAgICAgbG9hZGVyczogeyAuLi5leHBvcnRzLmRlZmF1bHRMb2FkZXJzLCAuLi5vcHRpb25zLmxvYWRlcnMgfSxcblx0ICAgIH07XG5cdCAgICBjb25mLnNlYXJjaFBsYWNlcy5mb3JFYWNoKHBsYWNlID0+IHtcblx0ICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmV4dG5hbWUocGxhY2UpIHx8ICdub0V4dCc7XG5cdCAgICAgICAgY29uc3QgbG9hZGVyID0gY29uZi5sb2FkZXJzW2tleV07XG5cdCAgICAgICAgaWYgKCFsb2FkZXIpIHtcblx0ICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBsb2FkZXIgc3BlY2lmaWVkIGZvciAke2dldEV4dERlc2Moa2V5KX0sIHNvIHNlYXJjaFBsYWNlcyBpdGVtIFwiJHtwbGFjZX1cIiBpcyBpbnZhbGlkYCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0eXBlb2YgbG9hZGVyICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbG9hZGVyIGZvciAke2dldEV4dERlc2Moa2V5KX0gaXMgbm90IGEgZnVuY3Rpb24gKHR5cGUgcHJvdmlkZWQ6IFwiJHt0eXBlb2YgbG9hZGVyfVwiKSwgc28gc2VhcmNoUGxhY2VzIGl0ZW0gXCIke3BsYWNlfVwiIGlzIGludmFsaWRgKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIHJldHVybiBjb25mO1xuXHR9XG5cdGZ1bmN0aW9uIGdldFBhY2thZ2VQcm9wKHByb3BzLCBvYmopIHtcblx0ICAgIGlmICh0eXBlb2YgcHJvcHMgPT09ICdzdHJpbmcnICYmIHByb3BzIGluIG9iailcblx0ICAgICAgICByZXR1cm4gb2JqW3Byb3BzXTtcblx0ICAgIHJldHVybiAoKEFycmF5LmlzQXJyYXkocHJvcHMpID8gcHJvcHMgOiBwcm9wcy5zcGxpdCgnLicpKS5yZWR1Y2UoKGFjYywgcHJvcCkgPT4gKGFjYyA9PT0gdW5kZWZpbmVkID8gYWNjIDogYWNjW3Byb3BdKSwgb2JqKSB8fCBudWxsKTtcblx0fVxuXHRmdW5jdGlvbiBnZXRTZWFyY2hJdGVtcyhzZWFyY2hQbGFjZXMsIHNlYXJjaFBhdGhzKSB7XG5cdCAgICByZXR1cm4gc2VhcmNoUGF0aHMucmVkdWNlKChhY2MsIHNlYXJjaFBhdGgpID0+IHtcblx0ICAgICAgICBzZWFyY2hQbGFjZXMuZm9yRWFjaChmaWxlTmFtZSA9PiBhY2MucHVzaCh7XG5cdCAgICAgICAgICAgIGZpbGVOYW1lLFxuXHQgICAgICAgICAgICBmaWxlcGF0aDogcGF0aC5qb2luKHNlYXJjaFBhdGgsIGZpbGVOYW1lKSxcblx0ICAgICAgICAgICAgbG9hZGVyS2V5OiBwYXRoLmV4dG5hbWUoZmlsZU5hbWUpIHx8ICdub0V4dCcsXG5cdCAgICAgICAgfSkpO1xuXHQgICAgICAgIHJldHVybiBhY2M7XG5cdCAgICB9LCBbXSk7XG5cdH1cblx0ZnVuY3Rpb24gdmFsaWRhdGVGaWxlUGF0aChmaWxlcGF0aCkge1xuXHQgICAgaWYgKCFmaWxlcGF0aClcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvYWQgbXVzdCBwYXNzIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuXHR9XG5cdGZ1bmN0aW9uIHZhbGlkYXRlTG9hZGVyKGxvYWRlciwgZXh0KSB7XG5cdCAgICBpZiAoIWxvYWRlcilcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGxvYWRlciBzcGVjaWZpZWQgZm9yIGV4dGVuc2lvbiBcIiR7ZXh0fVwiYCk7XG5cdCAgICBpZiAodHlwZW9mIGxvYWRlciAhPT0gJ2Z1bmN0aW9uJylcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvYWRlciBpcyBub3QgYSBmdW5jdGlvbicpO1xuXHR9XG5cdGZ1bmN0aW9uIGxpbGNvbmZpZyhuYW1lLCBvcHRpb25zKSB7XG5cdCAgICBjb25zdCB7IGlnbm9yZUVtcHR5U2VhcmNoUGxhY2VzLCBsb2FkZXJzLCBwYWNrYWdlUHJvcCwgc2VhcmNoUGxhY2VzLCBzdG9wRGlyLCB0cmFuc2Zvcm0sIH0gPSBnZXRPcHRpb25zKG5hbWUsIG9wdGlvbnMpO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgICBhc3luYyBzZWFyY2goc2VhcmNoRnJvbSA9IHByb2Nlc3MuY3dkKCkpIHtcblx0ICAgICAgICAgICAgY29uc3Qgc2VhcmNoUGF0aHMgPSBnZXRTZWFyY2hQYXRocyhzZWFyY2hGcm9tLCBzdG9wRGlyKTtcblx0ICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuXHQgICAgICAgICAgICAgICAgY29uZmlnOiBudWxsLFxuXHQgICAgICAgICAgICAgICAgZmlsZXBhdGg6ICcnLFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBjb25zdCBzZWFyY2hJdGVtcyA9IGdldFNlYXJjaEl0ZW1zKHNlYXJjaFBsYWNlcywgc2VhcmNoUGF0aHMpO1xuXHQgICAgICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGZpbGVwYXRoLCBsb2FkZXJLZXkgfSBvZiBzZWFyY2hJdGVtcykge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3MoZmlsZXBhdGgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gU3RyaW5nKGF3YWl0IGZzUmVhZEZpbGVBc3luYyhmaWxlcGF0aCkpO1xuXHQgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVyID0gbG9hZGVyc1tsb2FkZXJLZXldO1xuXHQgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lID09PSAncGFja2FnZS5qc29uJykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBrZyA9IGF3YWl0IGxvYWRlcihmaWxlcGF0aCwgY29udGVudCk7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF5YmVDb25maWcgPSBnZXRQYWNrYWdlUHJvcChwYWNrYWdlUHJvcCwgcGtnKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAobWF5YmVDb25maWcgIT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY29uZmlnID0gbWF5YmVDb25maWc7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5maWxlcGF0aCA9IGZpbGVwYXRoO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gY29udGVudC50cmltKCkgPT09ICcnO1xuXHQgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkgJiYgaWdub3JlRW1wdHlTZWFyY2hQbGFjZXMpXG5cdCAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5pc0VtcHR5ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICByZXN1bHQuY29uZmlnID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVMb2FkZXIobG9hZGVyLCBsb2FkZXJLZXkpO1xuXHQgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb25maWcgPSBhd2FpdCBsb2FkZXIoZmlsZXBhdGgsIGNvbnRlbnQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcmVzdWx0LmZpbGVwYXRoID0gZmlsZXBhdGg7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAocmVzdWx0LmZpbGVwYXRoID09PSAnJyAmJiByZXN1bHQuY29uZmlnID09PSBudWxsKVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybShudWxsKTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybShyZXN1bHQpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgYXN5bmMgbG9hZChmaWxlcGF0aCkge1xuXHQgICAgICAgICAgICB2YWxpZGF0ZUZpbGVQYXRoKGZpbGVwYXRoKTtcblx0ICAgICAgICAgICAgY29uc3QgYWJzUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlcGF0aCk7XG5cdCAgICAgICAgICAgIGNvbnN0IHsgYmFzZSwgZXh0IH0gPSBwYXRoLnBhcnNlKGFic1BhdGgpO1xuXHQgICAgICAgICAgICBjb25zdCBsb2FkZXJLZXkgPSBleHQgfHwgJ25vRXh0Jztcblx0ICAgICAgICAgICAgY29uc3QgbG9hZGVyID0gbG9hZGVyc1tsb2FkZXJLZXldO1xuXHQgICAgICAgICAgICB2YWxpZGF0ZUxvYWRlcihsb2FkZXIsIGxvYWRlcktleSk7XG5cdCAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBTdHJpbmcoYXdhaXQgZnNSZWFkRmlsZUFzeW5jKGFic1BhdGgpKTtcblx0ICAgICAgICAgICAgaWYgKGJhc2UgPT09ICdwYWNrYWdlLmpzb24nKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBwa2cgPSBhd2FpdCBsb2FkZXIoYWJzUGF0aCwgY29udGVudCk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtKHtcblx0ICAgICAgICAgICAgICAgICAgICBjb25maWc6IGdldFBhY2thZ2VQcm9wKHBhY2thZ2VQcm9wLCBwa2cpLFxuXHQgICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoOiBhYnNQYXRoLFxuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuXHQgICAgICAgICAgICAgICAgY29uZmlnOiBudWxsLFxuXHQgICAgICAgICAgICAgICAgZmlsZXBhdGg6IGFic1BhdGgsXG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBjb250ZW50LnRyaW0oKSA9PT0gJyc7XG5cdCAgICAgICAgICAgIGlmIChpc0VtcHR5ICYmIGlnbm9yZUVtcHR5U2VhcmNoUGxhY2VzKVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybSh7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uZmlnOiB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgICAgICAgICAgZmlsZXBhdGg6IGFic1BhdGgsXG5cdCAgICAgICAgICAgICAgICAgICAgaXNFbXB0eTogdHJ1ZSxcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICByZXN1bHQuY29uZmlnID0gaXNFbXB0eVxuXHQgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcblx0ICAgICAgICAgICAgICAgIDogYXdhaXQgbG9hZGVyKGFic1BhdGgsIGNvbnRlbnQpO1xuXHQgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtKGlzRW1wdHkgPyB7IC4uLnJlc3VsdCwgaXNFbXB0eSwgY29uZmlnOiB1bmRlZmluZWQgfSA6IHJlc3VsdCk7XG5cdCAgICAgICAgfSxcblx0ICAgIH07XG5cdH1cblx0ZXhwb3J0cy5saWxjb25maWcgPSBsaWxjb25maWc7XG5cdGZ1bmN0aW9uIGxpbGNvbmZpZ1N5bmMobmFtZSwgb3B0aW9ucykge1xuXHQgICAgY29uc3QgeyBpZ25vcmVFbXB0eVNlYXJjaFBsYWNlcywgbG9hZGVycywgcGFja2FnZVByb3AsIHNlYXJjaFBsYWNlcywgc3RvcERpciwgdHJhbnNmb3JtLCB9ID0gZ2V0T3B0aW9ucyhuYW1lLCBvcHRpb25zKTtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgICAgc2VhcmNoKHNlYXJjaEZyb20gPSBwcm9jZXNzLmN3ZCgpKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IHNlYXJjaFBhdGhzID0gZ2V0U2VhcmNoUGF0aHMoc2VhcmNoRnJvbSwgc3RvcERpcik7XG5cdCAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcblx0ICAgICAgICAgICAgICAgIGNvbmZpZzogbnVsbCxcblx0ICAgICAgICAgICAgICAgIGZpbGVwYXRoOiAnJyxcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgY29uc3Qgc2VhcmNoSXRlbXMgPSBnZXRTZWFyY2hJdGVtcyhzZWFyY2hQbGFjZXMsIHNlYXJjaFBhdGhzKTtcblx0ICAgICAgICAgICAgZm9yIChjb25zdCB7IGZpbGVOYW1lLCBmaWxlcGF0aCwgbG9hZGVyS2V5IH0gb2Ygc2VhcmNoSXRlbXMpIHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZnMuYWNjZXNzU3luYyhmaWxlcGF0aCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlciA9IGxvYWRlcnNbbG9hZGVyS2V5XTtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBTdHJpbmcoZnMucmVhZEZpbGVTeW5jKGZpbGVwYXRoKSk7XG5cdCAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUgPT09ICdwYWNrYWdlLmpzb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgcGtnID0gbG9hZGVyKGZpbGVwYXRoLCBjb250ZW50KTtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXliZUNvbmZpZyA9IGdldFBhY2thZ2VQcm9wKHBhY2thZ2VQcm9wLCBwa2cpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChtYXliZUNvbmZpZyAhPSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb25maWcgPSBtYXliZUNvbmZpZztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZpbGVwYXRoID0gZmlsZXBhdGg7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBjb250ZW50LnRyaW0oKSA9PT0gJyc7XG5cdCAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eSAmJiBpZ25vcmVFbXB0eVNlYXJjaFBsYWNlcylcblx0ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAgICAgICAgIGlmIChpc0VtcHR5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmlzRW1wdHkgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb25maWcgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUxvYWRlcihsb2FkZXIsIGxvYWRlcktleSk7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvbmZpZyA9IGxvYWRlcihmaWxlcGF0aCwgY29udGVudCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXN1bHQuZmlsZXBhdGggPSBmaWxlcGF0aDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChyZXN1bHQuZmlsZXBhdGggPT09ICcnICYmIHJlc3VsdC5jb25maWcgPT09IG51bGwpXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtKG51bGwpO1xuXHQgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtKHJlc3VsdCk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBsb2FkKGZpbGVwYXRoKSB7XG5cdCAgICAgICAgICAgIHZhbGlkYXRlRmlsZVBhdGgoZmlsZXBhdGgpO1xuXHQgICAgICAgICAgICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGZpbGVwYXRoKTtcblx0ICAgICAgICAgICAgY29uc3QgeyBiYXNlLCBleHQgfSA9IHBhdGgucGFyc2UoYWJzUGF0aCk7XG5cdCAgICAgICAgICAgIGNvbnN0IGxvYWRlcktleSA9IGV4dCB8fCAnbm9FeHQnO1xuXHQgICAgICAgICAgICBjb25zdCBsb2FkZXIgPSBsb2FkZXJzW2xvYWRlcktleV07XG5cdCAgICAgICAgICAgIHZhbGlkYXRlTG9hZGVyKGxvYWRlciwgbG9hZGVyS2V5KTtcblx0ICAgICAgICAgICAgY29uc3QgY29udGVudCA9IFN0cmluZyhmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCkpO1xuXHQgICAgICAgICAgICBpZiAoYmFzZSA9PT0gJ3BhY2thZ2UuanNvbicpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHBrZyA9IGxvYWRlcihhYnNQYXRoLCBjb250ZW50KTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm0oe1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZ2V0UGFja2FnZVByb3AocGFja2FnZVByb3AsIHBrZyksXG5cdCAgICAgICAgICAgICAgICAgICAgZmlsZXBhdGg6IGFic1BhdGgsXG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG5cdCAgICAgICAgICAgICAgICBjb25maWc6IG51bGwsXG5cdCAgICAgICAgICAgICAgICBmaWxlcGF0aDogYWJzUGF0aCxcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgY29uc3QgaXNFbXB0eSA9IGNvbnRlbnQudHJpbSgpID09PSAnJztcblx0ICAgICAgICAgICAgaWYgKGlzRW1wdHkgJiYgaWdub3JlRW1wdHlTZWFyY2hQbGFjZXMpXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtKHtcblx0ICAgICAgICAgICAgICAgICAgICBmaWxlcGF0aDogYWJzUGF0aCxcblx0ICAgICAgICAgICAgICAgICAgICBjb25maWc6IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgICAgICAgICBpc0VtcHR5OiB0cnVlLFxuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHJlc3VsdC5jb25maWcgPSBpc0VtcHR5ID8gdW5kZWZpbmVkIDogbG9hZGVyKGFic1BhdGgsIGNvbnRlbnQpO1xuXHQgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtKGlzRW1wdHkgPyB7IC4uLnJlc3VsdCwgaXNFbXB0eSwgY29uZmlnOiB1bmRlZmluZWQgfSA6IHJlc3VsdCk7XG5cdCAgICAgICAgfSxcblx0ICAgIH07XG5cdH1cblx0ZXhwb3J0cy5saWxjb25maWdTeW5jID0gbGlsY29uZmlnU3luYztcbn0gKGRpc3QpKTtcblxuY29uc3QgQUxJQVMgPSBTeW1ib2wuZm9yKCd5YW1sLmFsaWFzJyk7XG5jb25zdCBET0MgPSBTeW1ib2wuZm9yKCd5YW1sLmRvY3VtZW50Jyk7XG5jb25zdCBNQVAgPSBTeW1ib2wuZm9yKCd5YW1sLm1hcCcpO1xuY29uc3QgUEFJUiA9IFN5bWJvbC5mb3IoJ3lhbWwucGFpcicpO1xuY29uc3QgU0NBTEFSJDEgPSBTeW1ib2wuZm9yKCd5YW1sLnNjYWxhcicpO1xuY29uc3QgU0VRID0gU3ltYm9sLmZvcigneWFtbC5zZXEnKTtcbmNvbnN0IE5PREVfVFlQRSA9IFN5bWJvbC5mb3IoJ3lhbWwubm9kZS50eXBlJyk7XG5jb25zdCBpc0FsaWFzID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBBTElBUztcbmNvbnN0IGlzRG9jdW1lbnQgPSAobm9kZSkgPT4gISFub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlW05PREVfVFlQRV0gPT09IERPQztcbmNvbnN0IGlzTWFwID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBNQVA7XG5jb25zdCBpc1BhaXIgPSAobm9kZSkgPT4gISFub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlW05PREVfVFlQRV0gPT09IFBBSVI7XG5jb25zdCBpc1NjYWxhciQxID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBTQ0FMQVIkMTtcbmNvbnN0IGlzU2VxID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBTRVE7XG5mdW5jdGlvbiBpc0NvbGxlY3Rpb24kMShub2RlKSB7XG4gICAgaWYgKG5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnKVxuICAgICAgICBzd2l0Y2ggKG5vZGVbTk9ERV9UWVBFXSkge1xuICAgICAgICAgICAgY2FzZSBNQVA6XG4gICAgICAgICAgICBjYXNlIFNFUTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzTm9kZSQxKG5vZGUpIHtcbiAgICBpZiAobm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcpXG4gICAgICAgIHN3aXRjaCAobm9kZVtOT0RFX1RZUEVdKSB7XG4gICAgICAgICAgICBjYXNlIEFMSUFTOlxuICAgICAgICAgICAgY2FzZSBNQVA6XG4gICAgICAgICAgICBjYXNlIFNDQUxBUiQxOlxuICAgICAgICAgICAgY2FzZSBTRVE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5jb25zdCBoYXNBbmNob3IgPSAobm9kZSkgPT4gKGlzU2NhbGFyJDEobm9kZSkgfHwgaXNDb2xsZWN0aW9uJDEobm9kZSkpICYmICEhbm9kZS5hbmNob3I7XG5jbGFzcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodHlwZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTk9ERV9UWVBFLCB7IHZhbHVlOiB0eXBlIH0pO1xuICAgIH1cbiAgICAvKiogQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUuICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG59XG5cbmNvbnN0IEJSRUFLJDEgPSBTeW1ib2woJ2JyZWFrIHZpc2l0Jyk7XG5jb25zdCBTS0lQJDEgPSBTeW1ib2woJ3NraXAgY2hpbGRyZW4nKTtcbmNvbnN0IFJFTU9WRSQxID0gU3ltYm9sKCdyZW1vdmUgbm9kZScpO1xuLyoqXG4gKiBBcHBseSBhIHZpc2l0b3IgdG8gYW4gQVNUIG5vZGUgb3IgZG9jdW1lbnQuXG4gKlxuICogV2Fsa3MgdGhyb3VnaCB0aGUgdHJlZSAoZGVwdGgtZmlyc3QpIHN0YXJ0aW5nIGZyb20gYG5vZGVgLCBjYWxsaW5nIGFcbiAqIGB2aXNpdG9yYCBmdW5jdGlvbiB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICAgLSBga2V5YDogRm9yIHNlcXVlbmNlIHZhbHVlcyBhbmQgbWFwIGBQYWlyYCwgdGhlIG5vZGUncyBpbmRleCBpbiB0aGVcbiAqICAgICBjb2xsZWN0aW9uLiBXaXRoaW4gYSBgUGFpcmAsIGAna2V5J2Agb3IgYCd2YWx1ZSdgLCBjb3JyZXNwb25kaW5nbHkuXG4gKiAgICAgYG51bGxgIGZvciB0aGUgcm9vdCBub2RlLlxuICogICAtIGBub2RlYDogVGhlIGN1cnJlbnQgbm9kZS5cbiAqICAgLSBgcGF0aGA6IFRoZSBhbmNlc3RyeSBvZiB0aGUgY3VycmVudCBub2RlLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHZpc2l0b3IgbWF5IGJlIHVzZWQgdG8gY29udHJvbCB0aGUgdHJhdmVyc2FsOlxuICogICAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogRG8gbm90aGluZyBhbmQgY29udGludWVcbiAqICAgLSBgdmlzaXQuU0tJUGA6IERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCBjb250aW51ZSB3aXRoIG5leHRcbiAqICAgICBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBub2RlLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYE5vZGVgOiBSZXBsYWNlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgYnkgdmlzaXRpbmcgaXRcbiAqICAgLSBgbnVtYmVyYDogV2hpbGUgaXRlcmF0aW5nIHRoZSBpdGVtcyBvZiBhIHNlcXVlbmNlIG9yIG1hcCwgc2V0IHRoZSBpbmRleFxuICogICAgIG9mIHRoZSBuZXh0IHN0ZXAuIFRoaXMgaXMgdXNlZnVsIGVzcGVjaWFsbHkgaWYgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50XG4gKiAgICAgbm9kZSBoYXMgY2hhbmdlZC5cbiAqXG4gKiBJZiBgdmlzaXRvcmAgaXMgYSBzaW5nbGUgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHZhbHVlc1xuICogZW5jb3VudGVyZWQgaW4gdGhlIHRyZWUsIGluY2x1ZGluZyBlLmcuIGBudWxsYCB2YWx1ZXMuIEFsdGVybmF0aXZlbHksXG4gKiBzZXBhcmF0ZSB2aXNpdG9yIGZ1bmN0aW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IgZWFjaCBgTWFwYCwgYFBhaXJgLCBgU2VxYCxcbiAqIGBBbGlhc2AgYW5kIGBTY2FsYXJgIG5vZGUuIFRvIGRlZmluZSB0aGUgc2FtZSB2aXNpdG9yIGZ1bmN0aW9uIGZvciBtb3JlIHRoYW5cbiAqIG9uZSBub2RlIHR5cGUsIHVzZSB0aGUgYENvbGxlY3Rpb25gIChtYXAgYW5kIHNlcSksIGBWYWx1ZWAgKG1hcCwgc2VxICYgc2NhbGFyKVxuICogYW5kIGBOb2RlYCAoYWxpYXMsIG1hcCwgc2VxICYgc2NhbGFyKSB0YXJnZXRzLiBPZiBhbGwgdGhlc2UsIG9ubHkgdGhlIG1vc3RcbiAqIHNwZWNpZmljIGRlZmluZWQgb25lIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBub2RlLlxuICovXG5mdW5jdGlvbiB2aXNpdCQxKG5vZGUsIHZpc2l0b3IpIHtcbiAgICBjb25zdCB2aXNpdG9yXyA9IGluaXRWaXNpdG9yKHZpc2l0b3IpO1xuICAgIGlmIChpc0RvY3VtZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNkID0gdmlzaXRfKG51bGwsIG5vZGUuY29udGVudHMsIHZpc2l0b3JfLCBPYmplY3QuZnJlZXplKFtub2RlXSkpO1xuICAgICAgICBpZiAoY2QgPT09IFJFTU9WRSQxKVxuICAgICAgICAgICAgbm9kZS5jb250ZW50cyA9IG51bGw7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgdmlzaXRfKG51bGwsIG5vZGUsIHZpc2l0b3JfLCBPYmplY3QuZnJlZXplKFtdKSk7XG59XG4vLyBXaXRob3V0IHRoZSBgYXMgc3ltYm9sYCBjYXN0cywgVFMgZGVjbGFyZXMgdGhlc2UgaW4gdGhlIGB2aXNpdGBcbi8vIG5hbWVzcGFjZSB1c2luZyBgdmFyYCwgYnV0IHRoZW4gY29tcGxhaW5zIGFib3V0IHRoYXQgYmVjYXVzZVxuLy8gYHVuaXF1ZSBzeW1ib2xgIG11c3QgYmUgYGNvbnN0YC5cbi8qKiBUZXJtaW5hdGUgdmlzaXQgdHJhdmVyc2FsIGNvbXBsZXRlbHkgKi9cbnZpc2l0JDEuQlJFQUsgPSBCUkVBSyQxO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXQkMS5TS0lQID0gU0tJUCQxO1xuLyoqIFJlbW92ZSB0aGUgY3VycmVudCBub2RlICovXG52aXNpdCQxLlJFTU9WRSA9IFJFTU9WRSQxO1xuZnVuY3Rpb24gdmlzaXRfKGtleSwgbm9kZSwgdmlzaXRvciwgcGF0aCkge1xuICAgIGNvbnN0IGN0cmwgPSBjYWxsVmlzaXRvcihrZXksIG5vZGUsIHZpc2l0b3IsIHBhdGgpO1xuICAgIGlmIChpc05vZGUkMShjdHJsKSB8fCBpc1BhaXIoY3RybCkpIHtcbiAgICAgICAgcmVwbGFjZU5vZGUoa2V5LCBwYXRoLCBjdHJsKTtcbiAgICAgICAgcmV0dXJuIHZpc2l0XyhrZXksIGN0cmwsIHZpc2l0b3IsIHBhdGgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGN0cmwgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgIGlmIChpc0NvbGxlY3Rpb24kMShub2RlKSkge1xuICAgICAgICAgICAgcGF0aCA9IE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQobm9kZSkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2kgPSB2aXNpdF8oaSwgbm9kZS5pdGVtc1tpXSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjaSA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgICAgIGkgPSBjaSAtIDE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2kgPT09IEJSRUFLJDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSyQxO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBSRU1PVkUkMSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLml0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BhaXIobm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGggPSBPYmplY3QuZnJlZXplKHBhdGguY29uY2F0KG5vZGUpKTtcbiAgICAgICAgICAgIGNvbnN0IGNrID0gdmlzaXRfKCdrZXknLCBub2RlLmtleSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY2sgPT09IEJSRUFLJDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLJDE7XG4gICAgICAgICAgICBlbHNlIGlmIChjayA9PT0gUkVNT1ZFJDEpXG4gICAgICAgICAgICAgICAgbm9kZS5rZXkgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgY3YgPSB2aXNpdF8oJ3ZhbHVlJywgbm9kZS52YWx1ZSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY3YgPT09IEJSRUFLJDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLJDE7XG4gICAgICAgICAgICBlbHNlIGlmIChjdiA9PT0gUkVNT1ZFJDEpXG4gICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN0cmw7XG59XG4vKipcbiAqIEFwcGx5IGFuIGFzeW5jIHZpc2l0b3IgdG8gYW4gQVNUIG5vZGUgb3IgZG9jdW1lbnQuXG4gKlxuICogV2Fsa3MgdGhyb3VnaCB0aGUgdHJlZSAoZGVwdGgtZmlyc3QpIHN0YXJ0aW5nIGZyb20gYG5vZGVgLCBjYWxsaW5nIGFcbiAqIGB2aXNpdG9yYCBmdW5jdGlvbiB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICAgLSBga2V5YDogRm9yIHNlcXVlbmNlIHZhbHVlcyBhbmQgbWFwIGBQYWlyYCwgdGhlIG5vZGUncyBpbmRleCBpbiB0aGVcbiAqICAgICBjb2xsZWN0aW9uLiBXaXRoaW4gYSBgUGFpcmAsIGAna2V5J2Agb3IgYCd2YWx1ZSdgLCBjb3JyZXNwb25kaW5nbHkuXG4gKiAgICAgYG51bGxgIGZvciB0aGUgcm9vdCBub2RlLlxuICogICAtIGBub2RlYDogVGhlIGN1cnJlbnQgbm9kZS5cbiAqICAgLSBgcGF0aGA6IFRoZSBhbmNlc3RyeSBvZiB0aGUgY3VycmVudCBub2RlLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHZpc2l0b3IgbWF5IGJlIHVzZWQgdG8gY29udHJvbCB0aGUgdHJhdmVyc2FsOlxuICogICAtIGBQcm9taXNlYDogTXVzdCByZXNvbHZlIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlc1xuICogICAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogRG8gbm90aGluZyBhbmQgY29udGludWVcbiAqICAgLSBgdmlzaXQuU0tJUGA6IERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCBjb250aW51ZSB3aXRoIG5leHRcbiAqICAgICBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBub2RlLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYE5vZGVgOiBSZXBsYWNlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgYnkgdmlzaXRpbmcgaXRcbiAqICAgLSBgbnVtYmVyYDogV2hpbGUgaXRlcmF0aW5nIHRoZSBpdGVtcyBvZiBhIHNlcXVlbmNlIG9yIG1hcCwgc2V0IHRoZSBpbmRleFxuICogICAgIG9mIHRoZSBuZXh0IHN0ZXAuIFRoaXMgaXMgdXNlZnVsIGVzcGVjaWFsbHkgaWYgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50XG4gKiAgICAgbm9kZSBoYXMgY2hhbmdlZC5cbiAqXG4gKiBJZiBgdmlzaXRvcmAgaXMgYSBzaW5nbGUgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHZhbHVlc1xuICogZW5jb3VudGVyZWQgaW4gdGhlIHRyZWUsIGluY2x1ZGluZyBlLmcuIGBudWxsYCB2YWx1ZXMuIEFsdGVybmF0aXZlbHksXG4gKiBzZXBhcmF0ZSB2aXNpdG9yIGZ1bmN0aW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IgZWFjaCBgTWFwYCwgYFBhaXJgLCBgU2VxYCxcbiAqIGBBbGlhc2AgYW5kIGBTY2FsYXJgIG5vZGUuIFRvIGRlZmluZSB0aGUgc2FtZSB2aXNpdG9yIGZ1bmN0aW9uIGZvciBtb3JlIHRoYW5cbiAqIG9uZSBub2RlIHR5cGUsIHVzZSB0aGUgYENvbGxlY3Rpb25gIChtYXAgYW5kIHNlcSksIGBWYWx1ZWAgKG1hcCwgc2VxICYgc2NhbGFyKVxuICogYW5kIGBOb2RlYCAoYWxpYXMsIG1hcCwgc2VxICYgc2NhbGFyKSB0YXJnZXRzLiBPZiBhbGwgdGhlc2UsIG9ubHkgdGhlIG1vc3RcbiAqIHNwZWNpZmljIGRlZmluZWQgb25lIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBub2RlLlxuICovXG5hc3luYyBmdW5jdGlvbiB2aXNpdEFzeW5jKG5vZGUsIHZpc2l0b3IpIHtcbiAgICBjb25zdCB2aXNpdG9yXyA9IGluaXRWaXNpdG9yKHZpc2l0b3IpO1xuICAgIGlmIChpc0RvY3VtZW50KG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNkID0gYXdhaXQgdmlzaXRBc3luY18obnVsbCwgbm9kZS5jb250ZW50cywgdmlzaXRvcl8sIE9iamVjdC5mcmVlemUoW25vZGVdKSk7XG4gICAgICAgIGlmIChjZCA9PT0gUkVNT1ZFJDEpXG4gICAgICAgICAgICBub2RlLmNvbnRlbnRzID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICBhd2FpdCB2aXNpdEFzeW5jXyhudWxsLCBub2RlLCB2aXNpdG9yXywgT2JqZWN0LmZyZWV6ZShbXSkpO1xufVxuLy8gV2l0aG91dCB0aGUgYGFzIHN5bWJvbGAgY2FzdHMsIFRTIGRlY2xhcmVzIHRoZXNlIGluIHRoZSBgdmlzaXRgXG4vLyBuYW1lc3BhY2UgdXNpbmcgYHZhcmAsIGJ1dCB0aGVuIGNvbXBsYWlucyBhYm91dCB0aGF0IGJlY2F1c2Vcbi8vIGB1bmlxdWUgc3ltYm9sYCBtdXN0IGJlIGBjb25zdGAuXG4vKiogVGVybWluYXRlIHZpc2l0IHRyYXZlcnNhbCBjb21wbGV0ZWx5ICovXG52aXNpdEFzeW5jLkJSRUFLID0gQlJFQUskMTtcbi8qKiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgKi9cbnZpc2l0QXN5bmMuU0tJUCA9IFNLSVAkMTtcbi8qKiBSZW1vdmUgdGhlIGN1cnJlbnQgbm9kZSAqL1xudmlzaXRBc3luYy5SRU1PVkUgPSBSRU1PVkUkMTtcbmFzeW5jIGZ1bmN0aW9uIHZpc2l0QXN5bmNfKGtleSwgbm9kZSwgdmlzaXRvciwgcGF0aCkge1xuICAgIGNvbnN0IGN0cmwgPSBhd2FpdCBjYWxsVmlzaXRvcihrZXksIG5vZGUsIHZpc2l0b3IsIHBhdGgpO1xuICAgIGlmIChpc05vZGUkMShjdHJsKSB8fCBpc1BhaXIoY3RybCkpIHtcbiAgICAgICAgcmVwbGFjZU5vZGUoa2V5LCBwYXRoLCBjdHJsKTtcbiAgICAgICAgcmV0dXJuIHZpc2l0QXN5bmNfKGtleSwgY3RybCwgdmlzaXRvciwgcGF0aCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3RybCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbiQxKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaSA9IGF3YWl0IHZpc2l0QXN5bmNfKGksIG5vZGUuaXRlbXNbaV0sIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2kgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgICAgICBpID0gY2kgLSAxO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBCUkVBSyQxKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUskMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gUkVNT1ZFJDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5pdGVtcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBjb25zdCBjayA9IGF3YWl0IHZpc2l0QXN5bmNfKCdrZXknLCBub2RlLmtleSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY2sgPT09IEJSRUFLJDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLJDE7XG4gICAgICAgICAgICBlbHNlIGlmIChjayA9PT0gUkVNT1ZFJDEpXG4gICAgICAgICAgICAgICAgbm9kZS5rZXkgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgY3YgPSBhd2FpdCB2aXNpdEFzeW5jXygndmFsdWUnLCBub2RlLnZhbHVlLCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgIGlmIChjdiA9PT0gQlJFQUskMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUskMTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGN2ID09PSBSRU1PVkUkMSlcbiAgICAgICAgICAgICAgICBub2RlLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3RybDtcbn1cbmZ1bmN0aW9uIGluaXRWaXNpdG9yKHZpc2l0b3IpIHtcbiAgICBpZiAodHlwZW9mIHZpc2l0b3IgPT09ICdvYmplY3QnICYmXG4gICAgICAgICh2aXNpdG9yLkNvbGxlY3Rpb24gfHwgdmlzaXRvci5Ob2RlIHx8IHZpc2l0b3IuVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIEFsaWFzOiB2aXNpdG9yLk5vZGUsXG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuTm9kZSxcbiAgICAgICAgICAgIFNjYWxhcjogdmlzaXRvci5Ob2RlLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLk5vZGVcbiAgICAgICAgfSwgdmlzaXRvci5WYWx1ZSAmJiB7XG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuVmFsdWUsXG4gICAgICAgICAgICBTY2FsYXI6IHZpc2l0b3IuVmFsdWUsXG4gICAgICAgICAgICBTZXE6IHZpc2l0b3IuVmFsdWVcbiAgICAgICAgfSwgdmlzaXRvci5Db2xsZWN0aW9uICYmIHtcbiAgICAgICAgICAgIE1hcDogdmlzaXRvci5Db2xsZWN0aW9uLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLkNvbGxlY3Rpb25cbiAgICAgICAgfSwgdmlzaXRvcik7XG4gICAgfVxuICAgIHJldHVybiB2aXNpdG9yO1xufVxuZnVuY3Rpb24gY2FsbFZpc2l0b3Ioa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiB2aXNpdG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gdmlzaXRvcihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc01hcChub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuTWFwPy4oa2V5LCBub2RlLCBwYXRoKTtcbiAgICBpZiAoaXNTZXEobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLlNlcT8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzUGFpcihub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuUGFpcj8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzU2NhbGFyJDEobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLlNjYWxhcj8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzQWxpYXMobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLkFsaWFzPy4oa2V5LCBub2RlLCBwYXRoKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gcmVwbGFjZU5vZGUoa2V5LCBwYXRoLCBub2RlKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIGlmIChpc0NvbGxlY3Rpb24kMShwYXJlbnQpKSB7XG4gICAgICAgIHBhcmVudC5pdGVtc1trZXldID0gbm9kZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQYWlyKHBhcmVudCkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ2tleScpXG4gICAgICAgICAgICBwYXJlbnQua2V5ID0gbm9kZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFyZW50LnZhbHVlID0gbm9kZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNEb2N1bWVudChwYXJlbnQpKSB7XG4gICAgICAgIHBhcmVudC5jb250ZW50cyA9IG5vZGU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwdCA9IGlzQWxpYXMocGFyZW50KSA/ICdhbGlhcycgOiAnc2NhbGFyJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVwbGFjZSBub2RlIHdpdGggJHtwdH0gcGFyZW50YCk7XG4gICAgfVxufVxuXG5jb25zdCBlc2NhcGVDaGFycyA9IHtcbiAgICAnISc6ICclMjEnLFxuICAgICcsJzogJyUyQycsXG4gICAgJ1snOiAnJTVCJyxcbiAgICAnXSc6ICclNUQnLFxuICAgICd7JzogJyU3QicsXG4gICAgJ30nOiAnJTdEJ1xufTtcbmNvbnN0IGVzY2FwZVRhZ05hbWUgPSAodG4pID0+IHRuLnJlcGxhY2UoL1shLFtcXF17fV0vZywgY2ggPT4gZXNjYXBlQ2hhcnNbY2hdKTtcbmNsYXNzIERpcmVjdGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHlhbWwsIHRhZ3MpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBkaXJlY3RpdmVzLWVuZC9kb2Mtc3RhcnQgbWFya2VyIGAtLS1gLiBJZiBgbnVsbGAsIGEgbWFya2VyIG1heSBzdGlsbCBiZVxuICAgICAgICAgKiBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnQncyBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZG9jU3RhcnQgPSBudWxsO1xuICAgICAgICAvKiogVGhlIGRvYy1lbmQgbWFya2VyIGAuLi5gLiAgKi9cbiAgICAgICAgdGhpcy5kb2NFbmQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy55YW1sID0gT2JqZWN0LmFzc2lnbih7fSwgRGlyZWN0aXZlcy5kZWZhdWx0WWFtbCwgeWFtbCk7XG4gICAgICAgIHRoaXMudGFncyA9IE9iamVjdC5hc3NpZ24oe30sIERpcmVjdGl2ZXMuZGVmYXVsdFRhZ3MsIHRhZ3MpO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY29weSA9IG5ldyBEaXJlY3RpdmVzKHRoaXMueWFtbCwgdGhpcy50YWdzKTtcbiAgICAgICAgY29weS5kb2NTdGFydCA9IHRoaXMuZG9jU3RhcnQ7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEdXJpbmcgcGFyc2luZywgZ2V0IGEgRGlyZWN0aXZlcyBpbnN0YW5jZSBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQgYW5kXG4gICAgICogdXBkYXRlIHRoZSBzdHJlYW0gc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHZlcnNpb24ncyBzcGVjLlxuICAgICAqL1xuICAgIGF0RG9jdW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBEaXJlY3RpdmVzKHRoaXMueWFtbCwgdGhpcy50YWdzKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnlhbWwudmVyc2lvbikge1xuICAgICAgICAgICAgY2FzZSAnMS4xJzpcbiAgICAgICAgICAgICAgICB0aGlzLmF0TmV4dERvY3VtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzEuMic6XG4gICAgICAgICAgICAgICAgdGhpcy5hdE5leHREb2N1bWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMueWFtbCA9IHtcbiAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQ6IERpcmVjdGl2ZXMuZGVmYXVsdFlhbWwuZXhwbGljaXQsXG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICcxLjInXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRUYWdzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb25FcnJvciAtIE1heSBiZSBjYWxsZWQgZXZlbiBpZiB0aGUgYWN0aW9uIHdhcyBzdWNjZXNzZnVsXG4gICAgICogQHJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3NcbiAgICAgKi9cbiAgICBhZGQobGluZSwgb25FcnJvcikge1xuICAgICAgICBpZiAodGhpcy5hdE5leHREb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy55YW1sID0geyBleHBsaWNpdDogRGlyZWN0aXZlcy5kZWZhdWx0WWFtbC5leHBsaWNpdCwgdmVyc2lvbjogJzEuMScgfTtcbiAgICAgICAgICAgIHRoaXMudGFncyA9IE9iamVjdC5hc3NpZ24oe30sIERpcmVjdGl2ZXMuZGVmYXVsdFRhZ3MpO1xuICAgICAgICAgICAgdGhpcy5hdE5leHREb2N1bWVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnRzID0gbGluZS50cmltKCkuc3BsaXQoL1sgXFx0XSsvKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnJVRBRyc6IHtcbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoMCwgJyVUQUcgZGlyZWN0aXZlIHNob3VsZCBjb250YWluIGV4YWN0bHkgdHdvIHBhcnRzJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBbaGFuZGxlLCBwcmVmaXhdID0gcGFydHM7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzW2hhbmRsZV0gPSBwcmVmaXg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICclWUFNTCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnlhbWwuZXhwbGljaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcigwLCAnJVlBTUwgZGlyZWN0aXZlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHBhcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBbdmVyc2lvbl0gPSBwYXJ0cztcbiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA9PT0gJzEuMScgfHwgdmVyc2lvbiA9PT0gJzEuMicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55YW1sLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSAvXlxcZCtcXC5cXGQrJC8udGVzdCh2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcig2LCBgVW5zdXBwb3J0ZWQgWUFNTCB2ZXJzaW9uICR7dmVyc2lvbn1gLCBpc1ZhbGlkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgb25FcnJvcigwLCBgVW5rbm93biBkaXJlY3RpdmUgJHtuYW1lfWAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhIHRhZywgbWF0Y2hpbmcgaGFuZGxlcyB0byB0aG9zZSBkZWZpbmVkIGluICVUQUcgZGlyZWN0aXZlcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVkIHRhZywgd2hpY2ggbWF5IGFsc28gYmUgdGhlIG5vbi1zcGVjaWZpYyB0YWcgYCchJ2Agb3IgYVxuICAgICAqICAgYCchbG9jYWwnYCB0YWcsIG9yIGBudWxsYCBpZiB1bnJlc29sdmFibGUuXG4gICAgICovXG4gICAgdGFnTmFtZShzb3VyY2UsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gJyEnKVxuICAgICAgICAgICAgcmV0dXJuICchJzsgLy8gbm9uLXNwZWNpZmljIHRhZ1xuICAgICAgICBpZiAoc291cmNlWzBdICE9PSAnIScpIHtcbiAgICAgICAgICAgIG9uRXJyb3IoYE5vdCBhIHZhbGlkIHRhZzogJHtzb3VyY2V9YCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlWzFdID09PSAnPCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmJhdGltID0gc291cmNlLnNsaWNlKDIsIC0xKTtcbiAgICAgICAgICAgIGlmICh2ZXJiYXRpbSA9PT0gJyEnIHx8IHZlcmJhdGltID09PSAnISEnKSB7XG4gICAgICAgICAgICAgICAgb25FcnJvcihgVmVyYmF0aW0gdGFncyBhcmVuJ3QgcmVzb2x2ZWQsIHNvICR7c291cmNlfSBpcyBpbnZhbGlkLmApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV0gIT09ICc+JylcbiAgICAgICAgICAgICAgICBvbkVycm9yKCdWZXJiYXRpbSB0YWdzIG11c3QgZW5kIHdpdGggYSA+Jyk7XG4gICAgICAgICAgICByZXR1cm4gdmVyYmF0aW07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgWywgaGFuZGxlLCBzdWZmaXhdID0gc291cmNlLm1hdGNoKC9eKC4qISkoW14hXSopJC8pO1xuICAgICAgICBpZiAoIXN1ZmZpeClcbiAgICAgICAgICAgIG9uRXJyb3IoYFRoZSAke3NvdXJjZX0gdGFnIGhhcyBubyBzdWZmaXhgKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy50YWdzW2hhbmRsZV07XG4gICAgICAgIGlmIChwcmVmaXgpXG4gICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgZGVjb2RlVVJJQ29tcG9uZW50KHN1ZmZpeCk7XG4gICAgICAgIGlmIChoYW5kbGUgPT09ICchJylcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7IC8vIGxvY2FsIHRhZ1xuICAgICAgICBvbkVycm9yKGBDb3VsZCBub3QgcmVzb2x2ZSB0YWc6ICR7c291cmNlfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBmdWxseSByZXNvbHZlZCB0YWcsIHJldHVybnMgaXRzIHByaW50YWJsZSBzdHJpbmcgZm9ybSxcbiAgICAgKiB0YWtpbmcgaW50byBhY2NvdW50IGN1cnJlbnQgdGFnIHByZWZpeGVzIGFuZCBkZWZhdWx0cy5cbiAgICAgKi9cbiAgICB0YWdTdHJpbmcodGFnKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2hhbmRsZSwgcHJlZml4XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnRhZ3MpKSB7XG4gICAgICAgICAgICBpZiAodGFnLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlICsgZXNjYXBlVGFnTmFtZSh0YWcuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnWzBdID09PSAnIScgPyB0YWcgOiBgITwke3RhZ30+YDtcbiAgICB9XG4gICAgdG9TdHJpbmcoZG9jKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy55YW1sLmV4cGxpY2l0XG4gICAgICAgICAgICA/IFtgJVlBTUwgJHt0aGlzLnlhbWwudmVyc2lvbiB8fCAnMS4yJ31gXVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgY29uc3QgdGFnRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMudGFncyk7XG4gICAgICAgIGxldCB0YWdOYW1lcztcbiAgICAgICAgaWYgKGRvYyAmJiB0YWdFbnRyaWVzLmxlbmd0aCA+IDAgJiYgaXNOb2RlJDEoZG9jLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgY29uc3QgdGFncyA9IHt9O1xuICAgICAgICAgICAgdmlzaXQkMShkb2MuY29udGVudHMsIChfa2V5LCBub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTm9kZSQxKG5vZGUpICYmIG5vZGUudGFnKVxuICAgICAgICAgICAgICAgICAgICB0YWdzW25vZGUudGFnXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRhZ05hbWVzID0gT2JqZWN0LmtleXModGFncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGFnTmFtZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbaGFuZGxlLCBwcmVmaXhdIG9mIHRhZ0VudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGUgPT09ICchIScgJiYgcHJlZml4ID09PSAndGFnOnlhbWwub3JnLDIwMDI6JylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZG9jIHx8IHRhZ05hbWVzLnNvbWUodG4gPT4gdG4uc3RhcnRzV2l0aChwcmVmaXgpKSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGAlVEFHICR7aGFuZGxlfSAke3ByZWZpeH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gICAgfVxufVxuRGlyZWN0aXZlcy5kZWZhdWx0WWFtbCA9IHsgZXhwbGljaXQ6IGZhbHNlLCB2ZXJzaW9uOiAnMS4yJyB9O1xuRGlyZWN0aXZlcy5kZWZhdWx0VGFncyA9IHsgJyEhJzogJ3RhZzp5YW1sLm9yZywyMDAyOicgfTtcblxuLyoqXG4gKiBWZXJpZnkgdGhhdCB0aGUgaW5wdXQgc3RyaW5nIGlzIGEgdmFsaWQgYW5jaG9yLlxuICpcbiAqIFdpbGwgdGhyb3cgb24gZXJyb3JzLlxuICovXG5mdW5jdGlvbiBhbmNob3JJc1ZhbGlkKGFuY2hvcikge1xuICAgIGlmICgvW1xceDAwLVxceDE5XFxzLFtcXF17fV0vLnRlc3QoYW5jaG9yKSkge1xuICAgICAgICBjb25zdCBzYSA9IEpTT04uc3RyaW5naWZ5KGFuY2hvcik7XG4gICAgICAgIGNvbnN0IG1zZyA9IGBBbmNob3IgbXVzdCBub3QgY29udGFpbiB3aGl0ZXNwYWNlIG9yIGNvbnRyb2wgY2hhcmFjdGVyczogJHtzYX1gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBhbmNob3JOYW1lcyhyb290KSB7XG4gICAgY29uc3QgYW5jaG9ycyA9IG5ldyBTZXQoKTtcbiAgICB2aXNpdCQxKHJvb3QsIHtcbiAgICAgICAgVmFsdWUoX2tleSwgbm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUuYW5jaG9yKVxuICAgICAgICAgICAgICAgIGFuY2hvcnMuYWRkKG5vZGUuYW5jaG9yKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbmNob3JzO1xufVxuLyoqIEZpbmQgYSBuZXcgYW5jaG9yIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gYHByZWZpeGAgYW5kIGEgb25lLWluZGV4ZWQgc3VmZml4LiAqL1xuZnVuY3Rpb24gZmluZE5ld0FuY2hvcihwcmVmaXgsIGV4Y2x1ZGUpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgdHJ1ZTsgKytpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBgJHtwcmVmaXh9JHtpfWA7XG4gICAgICAgIGlmICghZXhjbHVkZS5oYXMobmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVOb2RlQW5jaG9ycyhkb2MsIHByZWZpeCkge1xuICAgIGNvbnN0IGFsaWFzT2JqZWN0cyA9IFtdO1xuICAgIGNvbnN0IHNvdXJjZU9iamVjdHMgPSBuZXcgTWFwKCk7XG4gICAgbGV0IHByZXZBbmNob3JzID0gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBvbkFuY2hvcjogKHNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgYWxpYXNPYmplY3RzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIGlmICghcHJldkFuY2hvcnMpXG4gICAgICAgICAgICAgICAgcHJldkFuY2hvcnMgPSBhbmNob3JOYW1lcyhkb2MpO1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gZmluZE5ld0FuY2hvcihwcmVmaXgsIHByZXZBbmNob3JzKTtcbiAgICAgICAgICAgIHByZXZBbmNob3JzLmFkZChhbmNob3IpO1xuICAgICAgICAgICAgcmV0dXJuIGFuY2hvcjtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcywgdGhlIHNvdXJjZSBub2RlIGlzIG9ubHkgcmVzb2x2ZWQgYWZ0ZXIgYWxsXG4gICAgICAgICAqIG9mIGl0cyBjaGlsZCBub2RlcyBhcmUuIFRoaXMgaXMgd2h5IGFuY2hvcnMgYXJlIHNldCBvbmx5IGFmdGVyIGFsbCBvZlxuICAgICAgICAgKiB0aGUgbm9kZXMgaGF2ZSBiZWVuIGNyZWF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICBzZXRBbmNob3JzOiAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBhbGlhc09iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWYgPSBzb3VyY2VPYmplY3RzLmdldChzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVmID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICAgICByZWYuYW5jaG9yICYmXG4gICAgICAgICAgICAgICAgICAgIChpc1NjYWxhciQxKHJlZi5ub2RlKSB8fCBpc0NvbGxlY3Rpb24kMShyZWYubm9kZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZi5ub2RlLmFuY2hvciA9IHJlZi5hbmNob3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgcmVwZWF0ZWQgb2JqZWN0ICh0aGlzIHNob3VsZCBub3QgaGFwcGVuKScpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlT2JqZWN0c1xuICAgIH07XG59XG5cbmNsYXNzIEFsaWFzIGV4dGVuZHMgTm9kZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSkge1xuICAgICAgICBzdXBlcihBTElBUyk7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3RhZycsIHtcbiAgICAgICAgICAgIHNldCgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsaWFzIG5vZGVzIGNhbm5vdCBoYXZlIHRhZ3MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgdGhlIHZhbHVlIG9mIHRoaXMgYWxpYXMgd2l0aGluIGBkb2NgLCBmaW5kaW5nIHRoZSBsYXN0XG4gICAgICogaW5zdGFuY2Ugb2YgdGhlIGBzb3VyY2VgIGFuY2hvciBiZWZvcmUgdGhpcyBub2RlLlxuICAgICAqL1xuICAgIHJlc29sdmUoZG9jKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmlzaXQkMShkb2MsIHtcbiAgICAgICAgICAgIE5vZGU6IChfa2V5LCBub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdCQxLkJSRUFLO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmFuY2hvciA9PT0gdGhpcy5zb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgdG9KU09OKF9hcmcsIGN0eCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiB7IHNvdXJjZTogdGhpcy5zb3VyY2UgfTtcbiAgICAgICAgY29uc3QgeyBhbmNob3JzLCBkb2MsIG1heEFsaWFzQ291bnQgfSA9IGN0eDtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlKGRvYyk7XG4gICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgVW5yZXNvbHZlZCBhbGlhcyAodGhlIGFuY2hvciBtdXN0IGJlIHNldCBiZWZvcmUgdGhlIGFsaWFzKTogJHt0aGlzLnNvdXJjZX1gO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IGFuY2hvcnMuZ2V0KHNvdXJjZSk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoIWRhdGEgfHwgZGF0YS5yZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gJ1RoaXMgc2hvdWxkIG5vdCBoYXBwZW46IEFsaWFzIGFuY2hvciB3YXMgbm90IHJlc29sdmVkPyc7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4QWxpYXNDb3VudCA+PSAwKSB7XG4gICAgICAgICAgICBkYXRhLmNvdW50ICs9IDE7XG4gICAgICAgICAgICBpZiAoZGF0YS5hbGlhc0NvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgIGRhdGEuYWxpYXNDb3VudCA9IGdldEFsaWFzQ291bnQoZG9jLCBzb3VyY2UsIGFuY2hvcnMpO1xuICAgICAgICAgICAgaWYgKGRhdGEuY291bnQgKiBkYXRhLmFsaWFzQ291bnQgPiBtYXhBbGlhc0NvdW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gJ0V4Y2Vzc2l2ZSBhbGlhcyBjb3VudCBpbmRpY2F0ZXMgYSByZXNvdXJjZSBleGhhdXN0aW9uIGF0dGFjayc7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGEucmVzO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIF9vbkNvbW1lbnQsIF9vbkNob21wS2VlcCkge1xuICAgICAgICBjb25zdCBzcmMgPSBgKiR7dGhpcy5zb3VyY2V9YDtcbiAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgICAgYW5jaG9ySXNWYWxpZCh0aGlzLnNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMudmVyaWZ5QWxpYXNPcmRlciAmJiAhY3R4LmFuY2hvcnMuaGFzKHRoaXMuc291cmNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBVbnJlc29sdmVkIGFsaWFzICh0aGUgYW5jaG9yIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgYWxpYXMpOiAke3RoaXMuc291cmNlfWA7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3R4LmltcGxpY2l0S2V5KVxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtzcmN9IGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNyYztcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRBbGlhc0NvdW50KGRvYywgbm9kZSwgYW5jaG9ycykge1xuICAgIGlmIChpc0FsaWFzKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IG5vZGUucmVzb2x2ZShkb2MpO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBhbmNob3JzICYmIHNvdXJjZSAmJiBhbmNob3JzLmdldChzb3VyY2UpO1xuICAgICAgICByZXR1cm4gYW5jaG9yID8gYW5jaG9yLmNvdW50ICogYW5jaG9yLmFsaWFzQ291bnQgOiAwO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0NvbGxlY3Rpb24kMShub2RlKSkge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygbm9kZS5pdGVtcykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGdldEFsaWFzQ291bnQoZG9jLCBpdGVtLCBhbmNob3JzKTtcbiAgICAgICAgICAgIGlmIChjID4gY291bnQpXG4gICAgICAgICAgICAgICAgY291bnQgPSBjO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQYWlyKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGtjID0gZ2V0QWxpYXNDb3VudChkb2MsIG5vZGUua2V5LCBhbmNob3JzKTtcbiAgICAgICAgY29uc3QgdmMgPSBnZXRBbGlhc0NvdW50KGRvYywgbm9kZS52YWx1ZSwgYW5jaG9ycyk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChrYywgdmMpO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjb252ZXJ0IGFueSBub2RlIG9yIGl0cyBjb250ZW50cyB0byBuYXRpdmUgSmF2YVNjcmlwdFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbnB1dCB2YWx1ZVxuICogQHBhcmFtIGFyZyAtIElmIGB2YWx1ZWAgZGVmaW5lcyBhIGB0b0pTT04oKWAgbWV0aG9kLCB1c2UgdGhpc1xuICogICBhcyBpdHMgZmlyc3QgYXJndW1lbnRcbiAqIEBwYXJhbSBjdHggLSBDb252ZXJzaW9uIGNvbnRleHQsIG9yaWdpbmFsbHkgc2V0IGluIERvY3VtZW50I3RvSlMoKS4gSWZcbiAqICAgYHsga2VlcDogdHJ1ZSB9YCBpcyBub3Qgc2V0LCBvdXRwdXQgc2hvdWxkIGJlIHN1aXRhYmxlIGZvciBKU09OXG4gKiAgIHN0cmluZ2lmaWNhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdG9KUyh2YWx1ZSwgYXJnLCBjdHgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoKHYsIGkpID0+IHRvSlModiwgU3RyaW5nKGkpLCBjdHgpKTtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXG4gICAgICAgIGlmICghY3R4IHx8ICFoYXNBbmNob3IodmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvSlNPTihhcmcsIGN0eCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7IGFsaWFzQ291bnQ6IDAsIGNvdW50OiAxLCByZXM6IHVuZGVmaW5lZCB9O1xuICAgICAgICBjdHguYW5jaG9ycy5zZXQodmFsdWUsIGRhdGEpO1xuICAgICAgICBjdHgub25DcmVhdGUgPSByZXMgPT4ge1xuICAgICAgICAgICAgZGF0YS5yZXMgPSByZXM7XG4gICAgICAgICAgICBkZWxldGUgY3R4Lm9uQ3JlYXRlO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB2YWx1ZS50b0pTT04oYXJnLCBjdHgpO1xuICAgICAgICBpZiAoY3R4Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnICYmICFjdHg/LmtlZXApXG4gICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuY29uc3QgaXNTY2FsYXJWYWx1ZSA9ICh2YWx1ZSkgPT4gIXZhbHVlIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jyk7XG5jbGFzcyBTY2FsYXIgZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgc3VwZXIoU0NBTEFSJDEpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHRvSlNPTihhcmcsIGN0eCkge1xuICAgICAgICByZXR1cm4gY3R4Py5rZWVwID8gdGhpcy52YWx1ZSA6IHRvSlModGhpcy52YWx1ZSwgYXJnLCBjdHgpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlKTtcbiAgICB9XG59XG5TY2FsYXIuQkxPQ0tfRk9MREVEID0gJ0JMT0NLX0ZPTERFRCc7XG5TY2FsYXIuQkxPQ0tfTElURVJBTCA9ICdCTE9DS19MSVRFUkFMJztcblNjYWxhci5QTEFJTiA9ICdQTEFJTic7XG5TY2FsYXIuUVVPVEVfRE9VQkxFID0gJ1FVT1RFX0RPVUJMRSc7XG5TY2FsYXIuUVVPVEVfU0lOR0xFID0gJ1FVT1RFX1NJTkdMRSc7XG5cbmNvbnN0IGRlZmF1bHRUYWdQcmVmaXggPSAndGFnOnlhbWwub3JnLDIwMDI6JztcbmZ1bmN0aW9uIGZpbmRUYWdPYmplY3QodmFsdWUsIHRhZ05hbWUsIHRhZ3MpIHtcbiAgICBpZiAodGFnTmFtZSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRhZ3MuZmlsdGVyKHQgPT4gdC50YWcgPT09IHRhZ05hbWUpO1xuICAgICAgICBjb25zdCB0YWdPYmogPSBtYXRjaC5maW5kKHQgPT4gIXQuZm9ybWF0KSA/PyBtYXRjaFswXTtcbiAgICAgICAgaWYgKCF0YWdPYmopXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhZyAke3RhZ05hbWV9IG5vdCBmb3VuZGApO1xuICAgICAgICByZXR1cm4gdGFnT2JqO1xuICAgIH1cbiAgICByZXR1cm4gdGFncy5maW5kKHQgPT4gdC5pZGVudGlmeT8uKHZhbHVlKSAmJiAhdC5mb3JtYXQpO1xufVxuZnVuY3Rpb24gY3JlYXRlTm9kZSh2YWx1ZSwgdGFnTmFtZSwgY3R4KSB7XG4gICAgaWYgKGlzRG9jdW1lbnQodmFsdWUpKVxuICAgICAgICB2YWx1ZSA9IHZhbHVlLmNvbnRlbnRzO1xuICAgIGlmIChpc05vZGUkMSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBpZiAoaXNQYWlyKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBtYXAgPSBjdHguc2NoZW1hW01BUF0uY3JlYXRlTm9kZT8uKGN0eC5zY2hlbWEsIG51bGwsIGN0eCk7XG4gICAgICAgIG1hcC5pdGVtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbiB8fFxuICAgICAgICAodHlwZW9mIEJpZ0ludCA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJpZ0ludCkgLy8gbm90IHN1cHBvcnRlZCBldmVyeXdoZXJlXG4gICAgKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2VyaWFsaXplanNvbnByb3BlcnR5XG4gICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVPZigpO1xuICAgIH1cbiAgICBjb25zdCB7IGFsaWFzRHVwbGljYXRlT2JqZWN0cywgb25BbmNob3IsIG9uVGFnT2JqLCBzY2hlbWEsIHNvdXJjZU9iamVjdHMgfSA9IGN0eDtcbiAgICAvLyBEZXRlY3QgZHVwbGljYXRlIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgb2JqZWN0ICYgdXNlIEFsaWFzIG5vZGVzIGZvciBhbGxcbiAgICAvLyBhZnRlciBmaXJzdC4gVGhlIGByZWZgIHdyYXBwZXIgYWxsb3dzIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIHRvIHJlc29sdmUuXG4gICAgbGV0IHJlZiA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYWxpYXNEdXBsaWNhdGVPYmplY3RzICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmVmID0gc291cmNlT2JqZWN0cy5nZXQodmFsdWUpO1xuICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBpZiAoIXJlZi5hbmNob3IpXG4gICAgICAgICAgICAgICAgcmVmLmFuY2hvciA9IG9uQW5jaG9yKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWxpYXMocmVmLmFuY2hvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZWYgPSB7IGFuY2hvcjogbnVsbCwgbm9kZTogbnVsbCB9O1xuICAgICAgICAgICAgc291cmNlT2JqZWN0cy5zZXQodmFsdWUsIHJlZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhZ05hbWU/LnN0YXJ0c1dpdGgoJyEhJykpXG4gICAgICAgIHRhZ05hbWUgPSBkZWZhdWx0VGFnUHJlZml4ICsgdGFnTmFtZS5zbGljZSgyKTtcbiAgICBsZXQgdGFnT2JqID0gZmluZFRhZ09iamVjdCh2YWx1ZSwgdGFnTmFtZSwgc2NoZW1hLnRhZ3MpO1xuICAgIGlmICghdGFnT2JqKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvSlNPTigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBTY2FsYXIodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICByZWYubm9kZSA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB0YWdPYmogPVxuICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBNYXBcbiAgICAgICAgICAgICAgICA/IHNjaGVtYVtNQVBdXG4gICAgICAgICAgICAgICAgOiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IHNjaGVtYVtTRVFdXG4gICAgICAgICAgICAgICAgICAgIDogc2NoZW1hW01BUF07XG4gICAgfVxuICAgIGlmIChvblRhZ09iaikge1xuICAgICAgICBvblRhZ09iaih0YWdPYmopO1xuICAgICAgICBkZWxldGUgY3R4Lm9uVGFnT2JqO1xuICAgIH1cbiAgICBjb25zdCBub2RlID0gdGFnT2JqPy5jcmVhdGVOb2RlXG4gICAgICAgID8gdGFnT2JqLmNyZWF0ZU5vZGUoY3R4LnNjaGVtYSwgdmFsdWUsIGN0eClcbiAgICAgICAgOiBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICBpZiAodGFnTmFtZSlcbiAgICAgICAgbm9kZS50YWcgPSB0YWdOYW1lO1xuICAgIGlmIChyZWYpXG4gICAgICAgIHJlZi5ub2RlID0gbm9kZTtcbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdGlvbkZyb21QYXRoKHNjaGVtYSwgcGF0aCwgdmFsdWUpIHtcbiAgICBsZXQgdiA9IHZhbHVlO1xuICAgIGZvciAobGV0IGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIGNvbnN0IGsgPSBwYXRoW2ldO1xuICAgICAgICBpZiAodHlwZW9mIGsgPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoaykgJiYgayA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gW107XG4gICAgICAgICAgICBhW2tdID0gdjtcbiAgICAgICAgICAgIHYgPSBhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdiA9IG5ldyBNYXAoW1trLCB2XV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVOb2RlKHYsIHVuZGVmaW5lZCwge1xuICAgICAgICBhbGlhc0R1cGxpY2F0ZU9iamVjdHM6IGZhbHNlLFxuICAgICAgICBrZWVwVW5kZWZpbmVkOiBmYWxzZSxcbiAgICAgICAgb25BbmNob3I6ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgcGxlYXNlIHJlcG9ydCBhIGJ1Zy4nKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBzb3VyY2VPYmplY3RzOiBuZXcgTWFwKClcbiAgICB9KTtcbn1cbi8vIFR5cGUgZ3VhcmQgaXMgaW50ZW50aW9uYWxseSBhIGxpdHRsZSB3cm9uZyBzbyBhcyB0byBiZSBtb3JlIHVzZWZ1bCxcbi8vIGFzIGl0IGRvZXMgbm90IGNvdmVyIHVudHlwYWJsZSBlbXB0eSBub24tc3RyaW5nIGl0ZXJhYmxlcyAoZS5nLiBbXSkuXG5jb25zdCBpc0VtcHR5UGF0aCA9IChwYXRoKSA9PiBwYXRoID09IG51bGwgfHxcbiAgICAodHlwZW9mIHBhdGggPT09ICdvYmplY3QnICYmICEhcGF0aFtTeW1ib2wuaXRlcmF0b3JdKCkubmV4dCgpLmRvbmUpO1xuY2xhc3MgQ29sbGVjdGlvbiBleHRlbmRzIE5vZGVCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIodHlwZSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2NoZW1hJywge1xuICAgICAgICAgICAgdmFsdWU6IHNjaGVtYSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNjaGVtYSAtIElmIGRlZmluZWQsIG92ZXJ3cml0ZXMgdGhlIG9yaWdpbmFsJ3Mgc2NoZW1hXG4gICAgICovXG4gICAgY2xvbmUoc2NoZW1hKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModGhpcykpO1xuICAgICAgICBpZiAoc2NoZW1hKVxuICAgICAgICAgICAgY29weS5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIGNvcHkuaXRlbXMgPSBjb3B5Lml0ZW1zLm1hcChpdCA9PiBpc05vZGUkMShpdCkgfHwgaXNQYWlyKGl0KSA/IGl0LmNsb25lKHNjaGVtYSkgOiBpdCk7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlKVxuICAgICAgICAgICAgY29weS5yYW5nZSA9IHRoaXMucmFuZ2Uuc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB2YWx1ZSB0byB0aGUgY29sbGVjdGlvbi4gRm9yIGAhIW1hcGAgYW5kIGAhIW9tYXBgIHRoZSB2YWx1ZSBtdXN0XG4gICAgICogYmUgYSBQYWlyIGluc3RhbmNlIG9yIGEgYHsga2V5LCB2YWx1ZSB9YCBvYmplY3QsIHdoaWNoIG1heSBub3QgaGF2ZSBhIGtleVxuICAgICAqIHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG1hcC5cbiAgICAgKi9cbiAgICBhZGRJbihwYXRoLCB2YWx1ZSkge1xuICAgICAgICBpZiAoaXNFbXB0eVBhdGgocGF0aCkpXG4gICAgICAgICAgICB0aGlzLmFkZCh2YWx1ZSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRoO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaXNDb2xsZWN0aW9uJDEobm9kZSkpXG4gICAgICAgICAgICAgICAgbm9kZS5hZGRJbihyZXN0LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIHJlc3QsIHZhbHVlKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgJHtrZXl9LiBSZW1haW5pbmcgcGF0aDogJHtyZXN0fWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlSW4ocGF0aCkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbiQxKG5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGUuZGVsZXRlSW4ocmVzdCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0ICR7a2V5fS4gUmVtYWluaW5nIHBhdGg6ICR7cmVzdH1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpdGVtIGF0IGBrZXlgLCBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQuIEJ5IGRlZmF1bHQgdW53cmFwc1xuICAgICAqIHNjYWxhciB2YWx1ZXMgZnJvbSB0aGVpciBzdXJyb3VuZGluZyBub2RlOyB0byBkaXNhYmxlIHNldCBga2VlcFNjYWxhcmAgdG9cbiAgICAgKiBgdHJ1ZWAgKGNvbGxlY3Rpb25zIGFyZSBhbHdheXMgcmV0dXJuZWQgaW50YWN0KS5cbiAgICAgKi9cbiAgICBnZXRJbihwYXRoLCBrZWVwU2NhbGFyKSB7XG4gICAgICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0aDtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAha2VlcFNjYWxhciAmJiBpc1NjYWxhciQxKG5vZGUpID8gbm9kZS52YWx1ZSA6IG5vZGU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24kMShub2RlKSA/IG5vZGUuZ2V0SW4ocmVzdCwga2VlcFNjYWxhcikgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGhhc0FsbE51bGxWYWx1ZXMoYWxsb3dTY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZXZlcnkobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzUGFpcihub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBuID0gbm9kZS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAobiA9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgKGFsbG93U2NhbGFyICYmXG4gICAgICAgICAgICAgICAgICAgIGlzU2NhbGFyJDEobikgJiZcbiAgICAgICAgICAgICAgICAgICAgbi52YWx1ZSA9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICFuLmNvbW1lbnRCZWZvcmUgJiZcbiAgICAgICAgICAgICAgICAgICAgIW4uY29tbWVudCAmJlxuICAgICAgICAgICAgICAgICAgICAhbi50YWcpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY29sbGVjdGlvbiBpbmNsdWRlcyBhIHZhbHVlIHdpdGggdGhlIGtleSBga2V5YC5cbiAgICAgKi9cbiAgICBoYXNJbihwYXRoKSB7XG4gICAgICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0aDtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzKGtleSk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uJDEobm9kZSkgPyBub2RlLmhhc0luKHJlc3QpIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBpbiB0aGlzIGNvbGxlY3Rpb24uIEZvciBgISFzZXRgLCBgdmFsdWVgIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBib29sZWFuIHRvIGFkZC9yZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgc2V0LlxuICAgICAqL1xuICAgIHNldEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0aDtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICAgICAgaWYgKGlzQ29sbGVjdGlvbiQxKG5vZGUpKVxuICAgICAgICAgICAgICAgIG5vZGUuc2V0SW4ocmVzdCwgdmFsdWUpO1xuICAgICAgICAgICAgZWxzZSBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuc2NoZW1hKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCByZXN0LCB2YWx1ZSkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0ICR7a2V5fS4gUmVtYWluaW5nIHBhdGg6ICR7cmVzdH1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbkNvbGxlY3Rpb24ubWF4Rmxvd1N0cmluZ1NpbmdsZUxpbmVMZW5ndGggPSA2MDtcblxuLyoqXG4gKiBTdHJpbmdpZmllcyBhIGNvbW1lbnQuXG4gKlxuICogRW1wdHkgY29tbWVudCBsaW5lcyBhcmUgbGVmdCBlbXB0eSxcbiAqIGxpbmVzIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgc3BhY2UgYXJlIHJlcGxhY2VkIGJ5IGAjYCxcbiAqIGFuZCBhbGwgb3RoZXIgbGluZXMgYXJlIHByZWZpeGVkIHdpdGggYSBgI2AuXG4gKi9cbmNvbnN0IHN0cmluZ2lmeUNvbW1lbnQgPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXig/ISQpKD86ICQpPy9nbSwgJyMnKTtcbmZ1bmN0aW9uIGluZGVudENvbW1lbnQoY29tbWVudCwgaW5kZW50KSB7XG4gICAgaWYgKC9eXFxuKyQvLnRlc3QoY29tbWVudCkpXG4gICAgICAgIHJldHVybiBjb21tZW50LnN1YnN0cmluZygxKTtcbiAgICByZXR1cm4gaW5kZW50ID8gY29tbWVudC5yZXBsYWNlKC9eKD8hICokKS9nbSwgaW5kZW50KSA6IGNvbW1lbnQ7XG59XG5jb25zdCBsaW5lQ29tbWVudCA9IChzdHIsIGluZGVudCwgY29tbWVudCkgPT4gc3RyLmVuZHNXaXRoKCdcXG4nKVxuICAgID8gaW5kZW50Q29tbWVudChjb21tZW50LCBpbmRlbnQpXG4gICAgOiBjb21tZW50LmluY2x1ZGVzKCdcXG4nKVxuICAgICAgICA/ICdcXG4nICsgaW5kZW50Q29tbWVudChjb21tZW50LCBpbmRlbnQpXG4gICAgICAgIDogKHN0ci5lbmRzV2l0aCgnICcpID8gJycgOiAnICcpICsgY29tbWVudDtcblxuY29uc3QgRk9MRF9GTE9XID0gJ2Zsb3cnO1xuY29uc3QgRk9MRF9CTE9DSyA9ICdibG9jayc7XG5jb25zdCBGT0xEX1FVT1RFRCA9ICdxdW90ZWQnO1xuLyoqXG4gKiBUcmllcyB0byBrZWVwIGlucHV0IGF0IHVwIHRvIGBsaW5lV2lkdGhgIGNoYXJhY3RlcnMsIHNwbGl0dGluZyBvbmx5IG9uIHNwYWNlc1xuICogbm90IGZvbGxvd2VkIGJ5IG5ld2xpbmVzIG9yIHNwYWNlcyB1bmxlc3MgYG1vZGVgIGlzIGAncXVvdGVkJ2AuIExpbmVzIGFyZVxuICogdGVybWluYXRlZCB3aXRoIGBcXG5gIGFuZCBzdGFydGVkIHdpdGggYGluZGVudGAuXG4gKi9cbmZ1bmN0aW9uIGZvbGRGbG93TGluZXModGV4dCwgaW5kZW50LCBtb2RlID0gJ2Zsb3cnLCB7IGluZGVudEF0U3RhcnQsIGxpbmVXaWR0aCA9IDgwLCBtaW5Db250ZW50V2lkdGggPSAyMCwgb25Gb2xkLCBvbk92ZXJmbG93IH0gPSB7fSkge1xuICAgIGlmICghbGluZVdpZHRoIHx8IGxpbmVXaWR0aCA8IDApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGVuZFN0ZXAgPSBNYXRoLm1heCgxICsgbWluQ29udGVudFdpZHRoLCAxICsgbGluZVdpZHRoIC0gaW5kZW50Lmxlbmd0aCk7XG4gICAgaWYgKHRleHQubGVuZ3RoIDw9IGVuZFN0ZXApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGZvbGRzID0gW107XG4gICAgY29uc3QgZXNjYXBlZEZvbGRzID0ge307XG4gICAgbGV0IGVuZCA9IGxpbmVXaWR0aCAtIGluZGVudC5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBpbmRlbnRBdFN0YXJ0ID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoaW5kZW50QXRTdGFydCA+IGxpbmVXaWR0aCAtIE1hdGgubWF4KDIsIG1pbkNvbnRlbnRXaWR0aCkpXG4gICAgICAgICAgICBmb2xkcy5wdXNoKDApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBlbmQgPSBsaW5lV2lkdGggLSBpbmRlbnRBdFN0YXJ0O1xuICAgIH1cbiAgICBsZXQgc3BsaXQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHByZXYgPSB1bmRlZmluZWQ7XG4gICAgbGV0IG92ZXJmbG93ID0gZmFsc2U7XG4gICAgbGV0IGkgPSAtMTtcbiAgICBsZXQgZXNjU3RhcnQgPSAtMTtcbiAgICBsZXQgZXNjRW5kID0gLTE7XG4gICAgaWYgKG1vZGUgPT09IEZPTERfQkxPQ0spIHtcbiAgICAgICAgaSA9IGNvbnN1bWVNb3JlSW5kZW50ZWRMaW5lcyh0ZXh0LCBpKTtcbiAgICAgICAgaWYgKGkgIT09IC0xKVxuICAgICAgICAgICAgZW5kID0gaSArIGVuZFN0ZXA7XG4gICAgfVxuICAgIGZvciAobGV0IGNoOyAoY2ggPSB0ZXh0WyhpICs9IDEpXSk7KSB7XG4gICAgICAgIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCAmJiBjaCA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBlc2NTdGFydCA9IGk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRleHRbaSArIDFdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gNTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVSc6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gOTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXNjRW5kID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAobW9kZSA9PT0gRk9MRF9CTE9DSylcbiAgICAgICAgICAgICAgICBpID0gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGkpO1xuICAgICAgICAgICAgZW5kID0gaSArIGVuZFN0ZXA7XG4gICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnICYmXG4gICAgICAgICAgICAgICAgcHJldiAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICcgJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICdcXG4nICYmXG4gICAgICAgICAgICAgICAgcHJldiAhPT0gJ1xcdCcpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBzdXJyb3VuZGVkIGJ5IG5vbi1zcGFjZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBuZXdsaW5lICsgaW5kZW50XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRleHRbaSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09ICcgJyAmJiBuZXh0ICE9PSAnXFxuJyAmJiBuZXh0ICE9PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgc3BsaXQgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgPj0gZW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvbGRzLnB1c2goc3BsaXQpO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBzcGxpdCArIGVuZFN0ZXA7XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGl0ZS1zcGFjZSBjb2xsZWN0ZWQgYXQgZW5kIG1heSBzdHJldGNoIHBhc3QgbGluZVdpZHRoXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2ID09PSAnICcgfHwgcHJldiA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gdGV4dFsoaSArPSAxKV07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3VudCBmb3IgbmV3bGluZSBlc2NhcGUsIGJ1dCBkb24ndCBicmVhayBwcmVjZWRpbmcgZXNjYXBlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGogPSBpID4gZXNjRW5kICsgMSA/IGkgLSAyIDogZXNjU3RhcnQgLSAxO1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWlsIG91dCBpZiBsaW5lV2lkdGggJiBtaW5Db250ZW50V2lkdGggYXJlIHNob3J0ZXIgdGhhbiBhbiBlc2NhcGUgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIGlmIChlc2NhcGVkRm9sZHNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgZm9sZHMucHVzaChqKTtcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZEZvbGRzW2pdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gaiArIGVuZFN0ZXA7XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcmV2ID0gY2g7XG4gICAgfVxuICAgIGlmIChvdmVyZmxvdyAmJiBvbk92ZXJmbG93KVxuICAgICAgICBvbk92ZXJmbG93KCk7XG4gICAgaWYgKGZvbGRzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgaWYgKG9uRm9sZClcbiAgICAgICAgb25Gb2xkKCk7XG4gICAgbGV0IHJlcyA9IHRleHQuc2xpY2UoMCwgZm9sZHNbMF0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9sZHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgZm9sZCA9IGZvbGRzW2ldO1xuICAgICAgICBjb25zdCBlbmQgPSBmb2xkc1tpICsgMV0gfHwgdGV4dC5sZW5ndGg7XG4gICAgICAgIGlmIChmb2xkID09PSAwKVxuICAgICAgICAgICAgcmVzID0gYFxcbiR7aW5kZW50fSR7dGV4dC5zbGljZSgwLCBlbmQpfWA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09IEZPTERfUVVPVEVEICYmIGVzY2FwZWRGb2xkc1tmb2xkXSlcbiAgICAgICAgICAgICAgICByZXMgKz0gYCR7dGV4dFtmb2xkXX1cXFxcYDtcbiAgICAgICAgICAgIHJlcyArPSBgXFxuJHtpbmRlbnR9JHt0ZXh0LnNsaWNlKGZvbGQgKyAxLCBlbmQpfWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogUHJlc3VtZXMgYGkgKyAxYCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lXG4gKiBAcmV0dXJucyBpbmRleCBvZiBsYXN0IG5ld2xpbmUgaW4gbW9yZS1pbmRlbnRlZCBibG9ja1xuICovXG5mdW5jdGlvbiBjb25zdW1lTW9yZUluZGVudGVkTGluZXModGV4dCwgaSkge1xuICAgIGxldCBjaCA9IHRleHRbaSArIDFdO1xuICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaCA9IHRleHRbKGkgKz0gMSldO1xuICAgICAgICB9IHdoaWxlIChjaCAmJiBjaCAhPT0gJ1xcbicpO1xuICAgICAgICBjaCA9IHRleHRbaSArIDFdO1xuICAgIH1cbiAgICByZXR1cm4gaTtcbn1cblxuY29uc3QgZ2V0Rm9sZE9wdGlvbnMgPSAoY3R4KSA9PiAoe1xuICAgIGluZGVudEF0U3RhcnQ6IGN0eC5pbmRlbnRBdFN0YXJ0LFxuICAgIGxpbmVXaWR0aDogY3R4Lm9wdGlvbnMubGluZVdpZHRoLFxuICAgIG1pbkNvbnRlbnRXaWR0aDogY3R4Lm9wdGlvbnMubWluQ29udGVudFdpZHRoXG59KTtcbi8vIEFsc28gY2hlY2tzIGZvciBsaW5lcyBzdGFydGluZyB3aXRoICUsIGFzIHBhcnNpbmcgdGhlIG91dHB1dCBhcyBZQU1MIDEuMSB3aWxsXG4vLyBwcmVzdW1lIHRoYXQncyBzdGFydGluZyBhIG5ldyBkb2N1bWVudC5cbmNvbnN0IGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIgPSAoc3RyKSA9PiAvXiglfC0tLXxcXC5cXC5cXC4pL20udGVzdChzdHIpO1xuZnVuY3Rpb24gbGluZUxlbmd0aE92ZXJMaW1pdChzdHIsIGxpbmVXaWR0aCwgaW5kZW50TGVuZ3RoKSB7XG4gICAgaWYgKCFsaW5lV2lkdGggfHwgbGluZVdpZHRoIDwgMClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGxpbWl0ID0gbGluZVdpZHRoIC0gaW5kZW50TGVuZ3RoO1xuICAgIGNvbnN0IHN0ckxlbiA9IHN0ci5sZW5ndGg7XG4gICAgaWYgKHN0ckxlbiA8PSBsaW1pdClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBzdGFydCA9IDA7IGkgPCBzdHJMZW47ICsraSkge1xuICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxuJykge1xuICAgICAgICAgICAgaWYgKGkgLSBzdGFydCA+IGxpbWl0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIGlmIChzdHJMZW4gLSBzdGFydCA8PSBsaW1pdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBkb3VibGVRdW90ZWRTdHJpbmcodmFsdWUsIGN0eCkge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgaWYgKGN0eC5vcHRpb25zLmRvdWJsZVF1b3RlZEFzSlNPTilcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgY29uc3QgeyBpbXBsaWNpdEtleSB9ID0gY3R4O1xuICAgIGNvbnN0IG1pbk11bHRpTGluZUxlbmd0aCA9IGN0eC5vcHRpb25zLmRvdWJsZVF1b3RlZE1pbk11bHRpTGluZUxlbmd0aDtcbiAgICBjb25zdCBpbmRlbnQgPSBjdHguaW5kZW50IHx8IChjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSA/ICcgICcgOiAnJyk7XG4gICAgbGV0IHN0ciA9ICcnO1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDAsIGNoID0ganNvbltpXTsgY2g7IGNoID0ganNvblsrK2ldKSB7XG4gICAgICAgIGlmIChjaCA9PT0gJyAnICYmIGpzb25baSArIDFdID09PSAnXFxcXCcgJiYganNvbltpICsgMl0gPT09ICduJykge1xuICAgICAgICAgICAgLy8gc3BhY2UgYmVmb3JlIG5ld2xpbmUgbmVlZHMgdG8gYmUgZXNjYXBlZCB0byBub3QgYmUgZm9sZGVkXG4gICAgICAgICAgICBzdHIgKz0ganNvbi5zbGljZShzdGFydCwgaSkgKyAnXFxcXCAnO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgc3RhcnQgPSBpO1xuICAgICAgICAgICAgY2ggPSAnXFxcXCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoID09PSAnXFxcXCcpXG4gICAgICAgICAgICBzd2l0Y2ggKGpzb25baSArIDFdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBqc29uLnNsaWNlKHN0YXJ0LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBqc29uLnN1YnN0cihpICsgMiwgNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDAwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMDcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxhJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDAwYic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXHYnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDFiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwODUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxOJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDBhMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXF8nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcyMDI4JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcTCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzIwMjknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxQJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUuc3Vic3RyKDAsIDIpID09PSAnMDAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxceCcgKyBjb2RlLnN1YnN0cigyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGpzb24uc3Vic3RyKGksIDYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA1O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICduJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0S2V5IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uW2kgKyAyXSA9PT0gJ1wiJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAganNvbi5sZW5ndGggPCBtaW5NdWx0aUxpbmVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbGRpbmcgd2lsbCBlYXQgZmlyc3QgbmV3bGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGpzb24uc2xpY2Uoc3RhcnQsIGkpICsgJ1xcblxcbic7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoanNvbltpICsgMl0gPT09ICdcXFxcJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25baSArIDNdID09PSAnbicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uW2kgKyA0XSAhPT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gaW5kZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BhY2UgYWZ0ZXIgbmV3bGluZSBuZWVkcyB0byBiZSBlc2NhcGVkIHRvIG5vdCBiZSBmb2xkZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uW2kgKyAyXSA9PT0gJyAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgc3RyID0gc3RhcnQgPyBzdHIgKyBqc29uLnNsaWNlKHN0YXJ0KSA6IGpzb247XG4gICAgcmV0dXJuIGltcGxpY2l0S2V5XG4gICAgICAgID8gc3RyXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhzdHIsIGluZGVudCwgRk9MRF9RVU9URUQsIGdldEZvbGRPcHRpb25zKGN0eCkpO1xufVxuZnVuY3Rpb24gc2luZ2xlUXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpIHtcbiAgICBpZiAoY3R4Lm9wdGlvbnMuc2luZ2xlUXVvdGUgPT09IGZhbHNlIHx8XG4gICAgICAgIChjdHguaW1wbGljaXRLZXkgJiYgdmFsdWUuaW5jbHVkZXMoJ1xcbicpKSB8fFxuICAgICAgICAvWyBcXHRdXFxufFxcblsgXFx0XS8udGVzdCh2YWx1ZSkgLy8gc2luZ2xlIHF1b3RlZCBzdHJpbmcgY2FuJ3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYXJvdW5kIG5ld2xpbmVcbiAgICApXG4gICAgICAgIHJldHVybiBkb3VibGVRdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgY29uc3QgaW5kZW50ID0gY3R4LmluZGVudCB8fCAoY29udGFpbnNEb2N1bWVudE1hcmtlcih2YWx1ZSkgPyAnICAnIDogJycpO1xuICAgIGNvbnN0IHJlcyA9IFwiJ1wiICsgdmFsdWUucmVwbGFjZSgvJy9nLCBcIicnXCIpLnJlcGxhY2UoL1xcbisvZywgYCQmXFxuJHtpbmRlbnR9YCkgKyBcIidcIjtcbiAgICByZXR1cm4gY3R4LmltcGxpY2l0S2V5XG4gICAgICAgID8gcmVzXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhyZXMsIGluZGVudCwgRk9MRF9GTE9XLCBnZXRGb2xkT3B0aW9ucyhjdHgpKTtcbn1cbmZ1bmN0aW9uIHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KSB7XG4gICAgY29uc3QgeyBzaW5nbGVRdW90ZSB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgbGV0IHFzO1xuICAgIGlmIChzaW5nbGVRdW90ZSA9PT0gZmFsc2UpXG4gICAgICAgIHFzID0gZG91YmxlUXVvdGVkU3RyaW5nO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBoYXNEb3VibGUgPSB2YWx1ZS5pbmNsdWRlcygnXCInKTtcbiAgICAgICAgY29uc3QgaGFzU2luZ2xlID0gdmFsdWUuaW5jbHVkZXMoXCInXCIpO1xuICAgICAgICBpZiAoaGFzRG91YmxlICYmICFoYXNTaW5nbGUpXG4gICAgICAgICAgICBxcyA9IHNpbmdsZVF1b3RlZFN0cmluZztcbiAgICAgICAgZWxzZSBpZiAoaGFzU2luZ2xlICYmICFoYXNEb3VibGUpXG4gICAgICAgICAgICBxcyA9IGRvdWJsZVF1b3RlZFN0cmluZztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcXMgPSBzaW5nbGVRdW90ZSA/IHNpbmdsZVF1b3RlZFN0cmluZyA6IGRvdWJsZVF1b3RlZFN0cmluZztcbiAgICB9XG4gICAgcmV0dXJuIHFzKHZhbHVlLCBjdHgpO1xufVxuZnVuY3Rpb24gYmxvY2tTdHJpbmcoeyBjb21tZW50LCB0eXBlLCB2YWx1ZSB9LCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBjb25zdCB7IGJsb2NrUXVvdGUsIGNvbW1lbnRTdHJpbmcsIGxpbmVXaWR0aCB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgLy8gMS4gQmxvY2sgY2FuJ3QgZW5kIGluIHdoaXRlc3BhY2UgdW5sZXNzIHRoZSBsYXN0IGxpbmUgaXMgbm9uLWVtcHR5LlxuICAgIC8vIDIuIFN0cmluZ3MgY29uc2lzdGluZyBvZiBvbmx5IHdoaXRlc3BhY2UgYXJlIGJlc3QgcmVuZGVyZWQgZXhwbGljaXRseS5cbiAgICBpZiAoIWJsb2NrUXVvdGUgfHwgL1xcbltcXHQgXSskLy50ZXN0KHZhbHVlKSB8fCAvXlxccyokLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICAgIH1cbiAgICBjb25zdCBpbmRlbnQgPSBjdHguaW5kZW50IHx8XG4gICAgICAgIChjdHguZm9yY2VCbG9ja0luZGVudCB8fCBjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSA/ICcgICcgOiAnJyk7XG4gICAgY29uc3QgbGl0ZXJhbCA9IGJsb2NrUXVvdGUgPT09ICdsaXRlcmFsJ1xuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBibG9ja1F1b3RlID09PSAnZm9sZGVkJyB8fCB0eXBlID09PSBTY2FsYXIuQkxPQ0tfRk9MREVEXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IHR5cGUgPT09IFNjYWxhci5CTE9DS19MSVRFUkFMXG4gICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgOiAhbGluZUxlbmd0aE92ZXJMaW1pdCh2YWx1ZSwgbGluZVdpZHRoLCBpbmRlbnQubGVuZ3RoKTtcbiAgICBpZiAoIXZhbHVlKVxuICAgICAgICByZXR1cm4gbGl0ZXJhbCA/ICd8XFxuJyA6ICc+XFxuJztcbiAgICAvLyBkZXRlcm1pbmUgY2hvbXBpbmcgZnJvbSB3aGl0ZXNwYWNlIGF0IHZhbHVlIGVuZFxuICAgIGxldCBjaG9tcDtcbiAgICBsZXQgZW5kU3RhcnQ7XG4gICAgZm9yIChlbmRTdGFydCA9IHZhbHVlLmxlbmd0aDsgZW5kU3RhcnQgPiAwOyAtLWVuZFN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IGNoID0gdmFsdWVbZW5kU3RhcnQgLSAxXTtcbiAgICAgICAgaWYgKGNoICE9PSAnXFxuJyAmJiBjaCAhPT0gJ1xcdCcgJiYgY2ggIT09ICcgJylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsZXQgZW5kID0gdmFsdWUuc3Vic3RyaW5nKGVuZFN0YXJ0KTtcbiAgICBjb25zdCBlbmRObFBvcyA9IGVuZC5pbmRleE9mKCdcXG4nKTtcbiAgICBpZiAoZW5kTmxQb3MgPT09IC0xKSB7XG4gICAgICAgIGNob21wID0gJy0nOyAvLyBzdHJpcFxuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZSA9PT0gZW5kIHx8IGVuZE5sUG9zICE9PSBlbmQubGVuZ3RoIC0gMSkge1xuICAgICAgICBjaG9tcCA9ICcrJzsgLy8ga2VlcFxuICAgICAgICBpZiAob25DaG9tcEtlZXApXG4gICAgICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hvbXAgPSAnJzsgLy8gY2xpcFxuICAgIH1cbiAgICBpZiAoZW5kKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgLWVuZC5sZW5ndGgpO1xuICAgICAgICBpZiAoZW5kW2VuZC5sZW5ndGggLSAxXSA9PT0gJ1xcbicpXG4gICAgICAgICAgICBlbmQgPSBlbmQuc2xpY2UoMCwgLTEpO1xuICAgICAgICBlbmQgPSBlbmQucmVwbGFjZSgvXFxuKyg/IVxcbnwkKS9nLCBgJCYke2luZGVudH1gKTtcbiAgICB9XG4gICAgLy8gZGV0ZXJtaW5lIGluZGVudCBpbmRpY2F0b3IgZnJvbSB3aGl0ZXNwYWNlIGF0IHZhbHVlIHN0YXJ0XG4gICAgbGV0IHN0YXJ0V2l0aFNwYWNlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0RW5kO1xuICAgIGxldCBzdGFydE5sUG9zID0gLTE7XG4gICAgZm9yIChzdGFydEVuZCA9IDA7IHN0YXJ0RW5kIDwgdmFsdWUubGVuZ3RoOyArK3N0YXJ0RW5kKSB7XG4gICAgICAgIGNvbnN0IGNoID0gdmFsdWVbc3RhcnRFbmRdO1xuICAgICAgICBpZiAoY2ggPT09ICcgJylcbiAgICAgICAgICAgIHN0YXJ0V2l0aFNwYWNlID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdcXG4nKVxuICAgICAgICAgICAgc3RhcnRObFBvcyA9IHN0YXJ0RW5kO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgbGV0IHN0YXJ0ID0gdmFsdWUuc3Vic3RyaW5nKDAsIHN0YXJ0TmxQb3MgPCBzdGFydEVuZCA/IHN0YXJ0TmxQb3MgKyAxIDogc3RhcnRFbmQpO1xuICAgIGlmIChzdGFydCkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyhzdGFydC5sZW5ndGgpO1xuICAgICAgICBzdGFydCA9IHN0YXJ0LnJlcGxhY2UoL1xcbisvZywgYCQmJHtpbmRlbnR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGVudFNpemUgPSBpbmRlbnQgPyAnMicgOiAnMSc7IC8vIHJvb3QgaXMgYXQgLTFcbiAgICBsZXQgaGVhZGVyID0gKGxpdGVyYWwgPyAnfCcgOiAnPicpICsgKHN0YXJ0V2l0aFNwYWNlID8gaW5kZW50U2l6ZSA6ICcnKSArIGNob21wO1xuICAgIGlmIChjb21tZW50KSB7XG4gICAgICAgIGhlYWRlciArPSAnICcgKyBjb21tZW50U3RyaW5nKGNvbW1lbnQucmVwbGFjZSgvID9bXFxyXFxuXSsvZywgJyAnKSk7XG4gICAgICAgIGlmIChvbkNvbW1lbnQpXG4gICAgICAgICAgICBvbkNvbW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKGxpdGVyYWwpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXG4rL2csIGAkJiR7aW5kZW50fWApO1xuICAgICAgICByZXR1cm4gYCR7aGVhZGVyfVxcbiR7aW5kZW50fSR7c3RhcnR9JHt2YWx1ZX0ke2VuZH1gO1xuICAgIH1cbiAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAgIC5yZXBsYWNlKC9cXG4rL2csICdcXG4kJicpXG4gICAgICAgIC5yZXBsYWNlKC8oPzpefFxcbikoW1xcdCBdLiopKD86KFtcXG5cXHQgXSopXFxuKD8hW1xcblxcdCBdKSk/L2csICckMSQyJykgLy8gbW9yZS1pbmRlbnRlZCBsaW5lcyBhcmVuJ3QgZm9sZGVkXG4gICAgICAgIC8vICAgICAgICAgICAgICAgIF4gbW9yZS1pbmQuIF4gZW1wdHkgICAgIF4gY2FwdHVyZSBuZXh0IGVtcHR5IGxpbmVzIG9ubHkgYXQgZW5kIG9mIGluZGVudFxuICAgICAgICAucmVwbGFjZSgvXFxuKy9nLCBgJCYke2luZGVudH1gKTtcbiAgICBjb25zdCBib2R5ID0gZm9sZEZsb3dMaW5lcyhgJHtzdGFydH0ke3ZhbHVlfSR7ZW5kfWAsIGluZGVudCwgRk9MRF9CTE9DSywgZ2V0Rm9sZE9wdGlvbnMoY3R4KSk7XG4gICAgcmV0dXJuIGAke2hlYWRlcn1cXG4ke2luZGVudH0ke2JvZHl9YDtcbn1cbmZ1bmN0aW9uIHBsYWluU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIGNvbnN0IHsgdHlwZSwgdmFsdWUgfSA9IGl0ZW07XG4gICAgY29uc3QgeyBhY3R1YWxTdHJpbmcsIGltcGxpY2l0S2V5LCBpbmRlbnQsIGluRmxvdyB9ID0gY3R4O1xuICAgIGlmICgoaW1wbGljaXRLZXkgJiYgL1tcXG5bXFxde30sXS8udGVzdCh2YWx1ZSkpIHx8XG4gICAgICAgIChpbkZsb3cgJiYgL1tbXFxde30sXS8udGVzdCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgfVxuICAgIGlmICghdmFsdWUgfHxcbiAgICAgICAgL15bXFxuXFx0ICxbXFxde30jJiohfD4nXCIlQGBdfF5bPy1dJHxeWz8tXVsgXFx0XXxbXFxuOl1bIFxcdF18WyBcXHRdXFxufFtcXG5cXHQgXSN8W1xcblxcdCA6XSQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIC8vIG5vdCBhbGxvd2VkOlxuICAgICAgICAvLyAtIGVtcHR5IHN0cmluZywgJy0nIG9yICc/J1xuICAgICAgICAvLyAtIHN0YXJ0IHdpdGggYW4gaW5kaWNhdG9yIGNoYXJhY3RlciAoZXhjZXB0IFs/Oi1dKSBvciAvWz8tXSAvXG4gICAgICAgIC8vIC0gJ1xcbiAnLCAnOiAnIG9yICcgXFxuJyBhbnl3aGVyZVxuICAgICAgICAvLyAtICcjJyBub3QgcHJlY2VkZWQgYnkgYSBub24tc3BhY2UgY2hhclxuICAgICAgICAvLyAtIGVuZCB3aXRoICcgJyBvciAnOidcbiAgICAgICAgcmV0dXJuIGltcGxpY2l0S2V5IHx8IGluRmxvdyB8fCAhdmFsdWUuaW5jbHVkZXMoJ1xcbicpXG4gICAgICAgICAgICA/IHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KVxuICAgICAgICAgICAgOiBibG9ja1N0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbiAgICBpZiAoIWltcGxpY2l0S2V5ICYmXG4gICAgICAgICFpbkZsb3cgJiZcbiAgICAgICAgdHlwZSAhPT0gU2NhbGFyLlBMQUlOICYmXG4gICAgICAgIHZhbHVlLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAvLyBXaGVyZSBhbGxvd2VkICYgdHlwZSBub3Qgc2V0IGV4cGxpY2l0bHksIHByZWZlciBibG9jayBzdHlsZSBmb3IgbXVsdGlsaW5lIHN0cmluZ3NcbiAgICAgICAgcmV0dXJuIGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxuICAgIGlmIChpbmRlbnQgPT09ICcnICYmIGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpKSB7XG4gICAgICAgIGN0eC5mb3JjZUJsb2NrSW5kZW50ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxuICAgIGNvbnN0IHN0ciA9IHZhbHVlLnJlcGxhY2UoL1xcbisvZywgYCQmXFxuJHtpbmRlbnR9YCk7XG4gICAgLy8gVmVyaWZ5IHRoYXQgb3V0cHV0IHdpbGwgYmUgcGFyc2VkIGFzIGEgc3RyaW5nLCBhcyBlLmcuIHBsYWluIG51bWJlcnMgYW5kXG4gICAgLy8gYm9vbGVhbnMgZ2V0IHBhcnNlZCB3aXRoIHRob3NlIHR5cGVzIGluIHYxLjIgKGUuZy4gJzQyJywgJ3RydWUnICYgJzAuOWUtMycpLFxuICAgIC8vIGFuZCBvdGhlcnMgaW4gdjEuMS5cbiAgICBpZiAoYWN0dWFsU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRlc3QgPSAodGFnKSA9PiB0YWcuZGVmYXVsdCAmJiB0YWcudGFnICE9PSAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyAmJiB0YWcudGVzdD8udGVzdChzdHIpO1xuICAgICAgICBjb25zdCB7IGNvbXBhdCwgdGFncyB9ID0gY3R4LmRvYy5zY2hlbWE7XG4gICAgICAgIGlmICh0YWdzLnNvbWUodGVzdCkgfHwgY29tcGF0Py5zb21lKHRlc3QpKVxuICAgICAgICAgICAgcmV0dXJuIHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIGltcGxpY2l0S2V5XG4gICAgICAgID8gc3RyXG4gICAgICAgIDogZm9sZEZsb3dMaW5lcyhzdHIsIGluZGVudCwgRk9MRF9GTE9XLCBnZXRGb2xkT3B0aW9ucyhjdHgpKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeVN0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBjb25zdCB7IGltcGxpY2l0S2V5LCBpbkZsb3cgfSA9IGN0eDtcbiAgICBjb25zdCBzcyA9IHR5cGVvZiBpdGVtLnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGl0ZW1cbiAgICAgICAgOiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7IHZhbHVlOiBTdHJpbmcoaXRlbS52YWx1ZSkgfSk7XG4gICAgbGV0IHsgdHlwZSB9ID0gaXRlbTtcbiAgICBpZiAodHlwZSAhPT0gU2NhbGFyLlFVT1RFX0RPVUJMRSkge1xuICAgICAgICAvLyBmb3JjZSBkb3VibGUgcXVvdGVzIG9uIGNvbnRyb2wgY2hhcmFjdGVycyAmIHVucGFpcmVkIHN1cnJvZ2F0ZXNcbiAgICAgICAgaWYgKC9bXFx4MDAtXFx4MDhcXHgwYi1cXHgxZlxceDdmLVxceDlmXFx1e0Q4MDB9LVxcdXtERkZGfV0vdS50ZXN0KHNzLnZhbHVlKSlcbiAgICAgICAgICAgIHR5cGUgPSBTY2FsYXIuUVVPVEVfRE9VQkxFO1xuICAgIH1cbiAgICBjb25zdCBfc3RyaW5naWZ5ID0gKF90eXBlKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoX3R5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLkJMT0NLX0ZPTERFRDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLkJMT0NLX0xJVEVSQUw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcGxpY2l0S2V5IHx8IGluRmxvd1xuICAgICAgICAgICAgICAgICAgICA/IHF1b3RlZFN0cmluZyhzcy52YWx1ZSwgY3R4KSAvLyBibG9ja3MgYXJlIG5vdCB2YWxpZCBpbnNpZGUgZmxvdyBjb250YWluZXJzXG4gICAgICAgICAgICAgICAgICAgIDogYmxvY2tTdHJpbmcoc3MsIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5RVU9URV9ET1VCTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZVF1b3RlZFN0cmluZyhzcy52YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLlFVT1RFX1NJTkdMRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gc2luZ2xlUXVvdGVkU3RyaW5nKHNzLnZhbHVlLCBjdHgpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXIuUExBSU46XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBsYWluU3RyaW5nKHNzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IHJlcyA9IF9zdHJpbmdpZnkodHlwZSk7XG4gICAgaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCB7IGRlZmF1bHRLZXlUeXBlLCBkZWZhdWx0U3RyaW5nVHlwZSB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHQgPSAoaW1wbGljaXRLZXkgJiYgZGVmYXVsdEtleVR5cGUpIHx8IGRlZmF1bHRTdHJpbmdUeXBlO1xuICAgICAgICByZXMgPSBfc3RyaW5naWZ5KHQpO1xuICAgICAgICBpZiAocmVzID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkZWZhdWx0IHN0cmluZyB0eXBlICR7dH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3RyaW5naWZ5Q29udGV4dChkb2MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBvcHQgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgYmxvY2tRdW90ZTogdHJ1ZSxcbiAgICAgICAgY29tbWVudFN0cmluZzogc3RyaW5naWZ5Q29tbWVudCxcbiAgICAgICAgZGVmYXVsdEtleVR5cGU6IG51bGwsXG4gICAgICAgIGRlZmF1bHRTdHJpbmdUeXBlOiAnUExBSU4nLFxuICAgICAgICBkaXJlY3RpdmVzOiBudWxsLFxuICAgICAgICBkb3VibGVRdW90ZWRBc0pTT046IGZhbHNlLFxuICAgICAgICBkb3VibGVRdW90ZWRNaW5NdWx0aUxpbmVMZW5ndGg6IDQwLFxuICAgICAgICBmYWxzZVN0cjogJ2ZhbHNlJyxcbiAgICAgICAgaW5kZW50U2VxOiB0cnVlLFxuICAgICAgICBsaW5lV2lkdGg6IDgwLFxuICAgICAgICBtaW5Db250ZW50V2lkdGg6IDIwLFxuICAgICAgICBudWxsU3RyOiAnbnVsbCcsXG4gICAgICAgIHNpbXBsZUtleXM6IGZhbHNlLFxuICAgICAgICBzaW5nbGVRdW90ZTogbnVsbCxcbiAgICAgICAgdHJ1ZVN0cjogJ3RydWUnLFxuICAgICAgICB2ZXJpZnlBbGlhc09yZGVyOiB0cnVlXG4gICAgfSwgZG9jLnNjaGVtYS50b1N0cmluZ09wdGlvbnMsIG9wdGlvbnMpO1xuICAgIGxldCBpbkZsb3c7XG4gICAgc3dpdGNoIChvcHQuY29sbGVjdGlvblN0eWxlKSB7XG4gICAgICAgIGNhc2UgJ2Jsb2NrJzpcbiAgICAgICAgICAgIGluRmxvdyA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zsb3cnOlxuICAgICAgICAgICAgaW5GbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaW5GbG93ID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYW5jaG9yczogbmV3IFNldCgpLFxuICAgICAgICBkb2MsXG4gICAgICAgIGluZGVudDogJycsXG4gICAgICAgIGluZGVudFN0ZXA6IHR5cGVvZiBvcHQuaW5kZW50ID09PSAnbnVtYmVyJyA/ICcgJy5yZXBlYXQob3B0LmluZGVudCkgOiAnICAnLFxuICAgICAgICBpbkZsb3csXG4gICAgICAgIG9wdGlvbnM6IG9wdFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRUYWdPYmplY3QodGFncywgaXRlbSkge1xuICAgIGlmIChpdGVtLnRhZykge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRhZ3MuZmlsdGVyKHQgPT4gdC50YWcgPT09IGl0ZW0udGFnKTtcbiAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2guZmluZCh0ID0+IHQuZm9ybWF0ID09PSBpdGVtLmZvcm1hdCkgPz8gbWF0Y2hbMF07XG4gICAgfVxuICAgIGxldCB0YWdPYmogPSB1bmRlZmluZWQ7XG4gICAgbGV0IG9iajtcbiAgICBpZiAoaXNTY2FsYXIkMShpdGVtKSkge1xuICAgICAgICBvYmogPSBpdGVtLnZhbHVlO1xuICAgICAgICBjb25zdCBtYXRjaCA9IHRhZ3MuZmlsdGVyKHQgPT4gdC5pZGVudGlmeT8uKG9iaikpO1xuICAgICAgICB0YWdPYmogPVxuICAgICAgICAgICAgbWF0Y2guZmluZCh0ID0+IHQuZm9ybWF0ID09PSBpdGVtLmZvcm1hdCkgPz8gbWF0Y2guZmluZCh0ID0+ICF0LmZvcm1hdCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvYmogPSBpdGVtO1xuICAgICAgICB0YWdPYmogPSB0YWdzLmZpbmQodCA9PiB0Lm5vZGVDbGFzcyAmJiBvYmogaW5zdGFuY2VvZiB0Lm5vZGVDbGFzcyk7XG4gICAgfVxuICAgIGlmICghdGFnT2JqKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBvYmo/LmNvbnN0cnVjdG9yPy5uYW1lID8/IHR5cGVvZiBvYmo7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFnIG5vdCByZXNvbHZlZCBmb3IgJHtuYW1lfSB2YWx1ZWApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnT2JqO1xufVxuLy8gbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB2YWx1ZSBzdHJpbmdpZmllciB0byBhbGxvdyBmb3IgY2lyY3VsYXIgYW5jaG9yIHJlZnNcbmZ1bmN0aW9uIHN0cmluZ2lmeVByb3BzKG5vZGUsIHRhZ09iaiwgeyBhbmNob3JzLCBkb2MgfSkge1xuICAgIGlmICghZG9jLmRpcmVjdGl2ZXMpXG4gICAgICAgIHJldHVybiAnJztcbiAgICBjb25zdCBwcm9wcyA9IFtdO1xuICAgIGNvbnN0IGFuY2hvciA9IChpc1NjYWxhciQxKG5vZGUpIHx8IGlzQ29sbGVjdGlvbiQxKG5vZGUpKSAmJiBub2RlLmFuY2hvcjtcbiAgICBpZiAoYW5jaG9yICYmIGFuY2hvcklzVmFsaWQoYW5jaG9yKSkge1xuICAgICAgICBhbmNob3JzLmFkZChhbmNob3IpO1xuICAgICAgICBwcm9wcy5wdXNoKGAmJHthbmNob3J9YCk7XG4gICAgfVxuICAgIGNvbnN0IHRhZyA9IG5vZGUudGFnID8gbm9kZS50YWcgOiB0YWdPYmouZGVmYXVsdCA/IG51bGwgOiB0YWdPYmoudGFnO1xuICAgIGlmICh0YWcpXG4gICAgICAgIHByb3BzLnB1c2goZG9jLmRpcmVjdGl2ZXMudGFnU3RyaW5nKHRhZykpO1xuICAgIHJldHVybiBwcm9wcy5qb2luKCcgJyk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkkMihpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBpZiAoaXNQYWlyKGl0ZW0pKVxuICAgICAgICByZXR1cm4gaXRlbS50b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIGlmIChpc0FsaWFzKGl0ZW0pKSB7XG4gICAgICAgIGlmIChjdHguZG9jLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICByZXR1cm4gaXRlbS50b1N0cmluZyhjdHgpO1xuICAgICAgICBpZiAoY3R4LnJlc29sdmVkQWxpYXNlcz8uaGFzKGl0ZW0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3Qgc3RyaW5naWZ5IGNpcmN1bGFyIHN0cnVjdHVyZSB3aXRob3V0IGFsaWFzIG5vZGVzYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3R4LnJlc29sdmVkQWxpYXNlcylcbiAgICAgICAgICAgICAgICBjdHgucmVzb2x2ZWRBbGlhc2VzLmFkZChpdGVtKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjdHgucmVzb2x2ZWRBbGlhc2VzID0gbmV3IFNldChbaXRlbV0pO1xuICAgICAgICAgICAgaXRlbSA9IGl0ZW0ucmVzb2x2ZShjdHguZG9jKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgdGFnT2JqID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG5vZGUgPSBpc05vZGUkMShpdGVtKVxuICAgICAgICA/IGl0ZW1cbiAgICAgICAgOiBjdHguZG9jLmNyZWF0ZU5vZGUoaXRlbSwgeyBvblRhZ09iajogbyA9PiAodGFnT2JqID0gbykgfSk7XG4gICAgaWYgKCF0YWdPYmopXG4gICAgICAgIHRhZ09iaiA9IGdldFRhZ09iamVjdChjdHguZG9jLnNjaGVtYS50YWdzLCBub2RlKTtcbiAgICBjb25zdCBwcm9wcyA9IHN0cmluZ2lmeVByb3BzKG5vZGUsIHRhZ09iaiwgY3R4KTtcbiAgICBpZiAocHJvcHMubGVuZ3RoID4gMClcbiAgICAgICAgY3R4LmluZGVudEF0U3RhcnQgPSAoY3R4LmluZGVudEF0U3RhcnQgPz8gMCkgKyBwcm9wcy5sZW5ndGggKyAxO1xuICAgIGNvbnN0IHN0ciA9IHR5cGVvZiB0YWdPYmouc3RyaW5naWZ5ID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdGFnT2JqLnN0cmluZ2lmeShub2RlLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApXG4gICAgICAgIDogaXNTY2FsYXIkMShub2RlKVxuICAgICAgICAgICAgPyBzdHJpbmdpZnlTdHJpbmcobm9kZSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKVxuICAgICAgICAgICAgOiBub2RlLnRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgaWYgKCFwcm9wcylcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICByZXR1cm4gaXNTY2FsYXIkMShub2RlKSB8fCBzdHJbMF0gPT09ICd7JyB8fCBzdHJbMF0gPT09ICdbJ1xuICAgICAgICA/IGAke3Byb3BzfSAke3N0cn1gXG4gICAgICAgIDogYCR7cHJvcHN9XFxuJHtjdHguaW5kZW50fSR7c3RyfWA7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVBhaXIoeyBrZXksIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIGNvbnN0IHsgYWxsTnVsbFZhbHVlcywgZG9jLCBpbmRlbnQsIGluZGVudFN0ZXAsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZywgaW5kZW50U2VxLCBzaW1wbGVLZXlzIH0gfSA9IGN0eDtcbiAgICBsZXQga2V5Q29tbWVudCA9IChpc05vZGUkMShrZXkpICYmIGtleS5jb21tZW50KSB8fCBudWxsO1xuICAgIGlmIChzaW1wbGVLZXlzKSB7XG4gICAgICAgIGlmIChrZXlDb21tZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dpdGggc2ltcGxlIGtleXMsIGtleSBub2RlcyBjYW5ub3QgaGF2ZSBjb21tZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0NvbGxlY3Rpb24kMShrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSAnV2l0aCBzaW1wbGUga2V5cywgY29sbGVjdGlvbiBjYW5ub3QgYmUgdXNlZCBhcyBhIGtleSB2YWx1ZSc7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgZXhwbGljaXRLZXkgPSAhc2ltcGxlS2V5cyAmJlxuICAgICAgICAoIWtleSB8fFxuICAgICAgICAgICAgKGtleUNvbW1lbnQgJiYgdmFsdWUgPT0gbnVsbCAmJiAhY3R4LmluRmxvdykgfHxcbiAgICAgICAgICAgIGlzQ29sbGVjdGlvbiQxKGtleSkgfHxcbiAgICAgICAgICAgIChpc1NjYWxhciQxKGtleSlcbiAgICAgICAgICAgICAgICA/IGtleS50eXBlID09PSBTY2FsYXIuQkxPQ0tfRk9MREVEIHx8IGtleS50eXBlID09PSBTY2FsYXIuQkxPQ0tfTElURVJBTFxuICAgICAgICAgICAgICAgIDogdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpKTtcbiAgICBjdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHtcbiAgICAgICAgYWxsTnVsbFZhbHVlczogZmFsc2UsXG4gICAgICAgIGltcGxpY2l0S2V5OiAhZXhwbGljaXRLZXkgJiYgKHNpbXBsZUtleXMgfHwgIWFsbE51bGxWYWx1ZXMpLFxuICAgICAgICBpbmRlbnQ6IGluZGVudCArIGluZGVudFN0ZXBcbiAgICB9KTtcbiAgICBsZXQga2V5Q29tbWVudERvbmUgPSBmYWxzZTtcbiAgICBsZXQgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgbGV0IHN0ciA9IHN0cmluZ2lmeSQyKGtleSwgY3R4LCAoKSA9PiAoa2V5Q29tbWVudERvbmUgPSB0cnVlKSwgKCkgPT4gKGNob21wS2VlcCA9IHRydWUpKTtcbiAgICBpZiAoIWV4cGxpY2l0S2V5ICYmICFjdHguaW5GbG93ICYmIHN0ci5sZW5ndGggPiAxMDI0KSB7XG4gICAgICAgIGlmIChzaW1wbGVLZXlzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXaXRoIHNpbXBsZSBrZXlzLCBzaW5nbGUgbGluZSBzY2FsYXIgbXVzdCBub3Qgc3BhbiBtb3JlIHRoYW4gMTAyNCBjaGFyYWN0ZXJzJyk7XG4gICAgICAgIGV4cGxpY2l0S2V5ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGN0eC5pbkZsb3cpIHtcbiAgICAgICAgaWYgKGFsbE51bGxWYWx1ZXMgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGtleUNvbW1lbnREb25lICYmIG9uQ29tbWVudClcbiAgICAgICAgICAgICAgICBvbkNvbW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiBzdHIgPT09ICcnID8gJz8nIDogZXhwbGljaXRLZXkgPyBgPyAke3N0cn1gIDogc3RyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKChhbGxOdWxsVmFsdWVzICYmICFzaW1wbGVLZXlzKSB8fCAodmFsdWUgPT0gbnVsbCAmJiBleHBsaWNpdEtleSkpIHtcbiAgICAgICAgc3RyID0gYD8gJHtzdHJ9YDtcbiAgICAgICAgaWYgKGtleUNvbW1lbnQgJiYgIWtleUNvbW1lbnREb25lKSB7XG4gICAgICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjdHguaW5kZW50LCBjb21tZW50U3RyaW5nKGtleUNvbW1lbnQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaG9tcEtlZXAgJiYgb25DaG9tcEtlZXApXG4gICAgICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBpZiAoa2V5Q29tbWVudERvbmUpXG4gICAgICAgIGtleUNvbW1lbnQgPSBudWxsO1xuICAgIGlmIChleHBsaWNpdEtleSkge1xuICAgICAgICBpZiAoa2V5Q29tbWVudClcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGNvbW1lbnRTdHJpbmcoa2V5Q29tbWVudCkpO1xuICAgICAgICBzdHIgPSBgPyAke3N0cn1cXG4ke2luZGVudH06YDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0ciA9IGAke3N0cn06YDtcbiAgICAgICAgaWYgKGtleUNvbW1lbnQpXG4gICAgICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjdHguaW5kZW50LCBjb21tZW50U3RyaW5nKGtleUNvbW1lbnQpKTtcbiAgICB9XG4gICAgbGV0IHZjYiA9ICcnO1xuICAgIGxldCB2YWx1ZUNvbW1lbnQgPSBudWxsO1xuICAgIGlmIChpc05vZGUkMSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLnNwYWNlQmVmb3JlKVxuICAgICAgICAgICAgdmNiID0gJ1xcbic7XG4gICAgICAgIGlmICh2YWx1ZS5jb21tZW50QmVmb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBjcyA9IGNvbW1lbnRTdHJpbmcodmFsdWUuY29tbWVudEJlZm9yZSk7XG4gICAgICAgICAgICB2Y2IgKz0gYFxcbiR7aW5kZW50Q29tbWVudChjcywgY3R4LmluZGVudCl9YDtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZUNvbW1lbnQgPSB2YWx1ZS5jb21tZW50O1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHZhbHVlID0gZG9jLmNyZWF0ZU5vZGUodmFsdWUpO1xuICAgIH1cbiAgICBjdHguaW1wbGljaXRLZXkgPSBmYWxzZTtcbiAgICBpZiAoIWV4cGxpY2l0S2V5ICYmICFrZXlDb21tZW50ICYmIGlzU2NhbGFyJDEodmFsdWUpKVxuICAgICAgICBjdHguaW5kZW50QXRTdGFydCA9IHN0ci5sZW5ndGggKyAxO1xuICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgIGlmICghaW5kZW50U2VxICYmXG4gICAgICAgIGluZGVudFN0ZXAubGVuZ3RoID49IDIgJiZcbiAgICAgICAgIWN0eC5pbkZsb3cgJiZcbiAgICAgICAgIWV4cGxpY2l0S2V5ICYmXG4gICAgICAgIGlzU2VxKHZhbHVlKSAmJlxuICAgICAgICAhdmFsdWUuZmxvdyAmJlxuICAgICAgICAhdmFsdWUudGFnICYmXG4gICAgICAgICF2YWx1ZS5hbmNob3IpIHtcbiAgICAgICAgLy8gSWYgaW5kZW50U2VxID09PSBmYWxzZSwgY29uc2lkZXIgJy0gJyBhcyBwYXJ0IG9mIGluZGVudGF0aW9uIHdoZXJlIHBvc3NpYmxlXG4gICAgICAgIGN0eC5pbmRlbnQgPSBjdHguaW5kZW50LnN1YnN0cigyKTtcbiAgICB9XG4gICAgbGV0IHZhbHVlQ29tbWVudERvbmUgPSBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZVN0ciA9IHN0cmluZ2lmeSQyKHZhbHVlLCBjdHgsICgpID0+ICh2YWx1ZUNvbW1lbnREb25lID0gdHJ1ZSksICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKSk7XG4gICAgbGV0IHdzID0gJyAnO1xuICAgIGlmICh2Y2IgfHwga2V5Q29tbWVudCkge1xuICAgICAgICBpZiAodmFsdWVTdHIgPT09ICcnICYmICFjdHguaW5GbG93KVxuICAgICAgICAgICAgd3MgPSB2Y2IgPT09ICdcXG4nID8gJ1xcblxcbicgOiB2Y2I7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHdzID0gYCR7dmNifVxcbiR7Y3R4LmluZGVudH1gO1xuICAgIH1cbiAgICBlbHNlIGlmICghZXhwbGljaXRLZXkgJiYgaXNDb2xsZWN0aW9uJDEodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGZsb3cgPSB2YWx1ZVN0clswXSA9PT0gJ1snIHx8IHZhbHVlU3RyWzBdID09PSAneyc7XG4gICAgICAgIGlmICghZmxvdyB8fCB2YWx1ZVN0ci5pbmNsdWRlcygnXFxuJykpXG4gICAgICAgICAgICB3cyA9IGBcXG4ke2N0eC5pbmRlbnR9YDtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWVTdHIgPT09ICcnIHx8IHZhbHVlU3RyWzBdID09PSAnXFxuJylcbiAgICAgICAgd3MgPSAnJztcbiAgICBzdHIgKz0gd3MgKyB2YWx1ZVN0cjtcbiAgICBpZiAoY3R4LmluRmxvdykge1xuICAgICAgICBpZiAodmFsdWVDb21tZW50RG9uZSAmJiBvbkNvbW1lbnQpXG4gICAgICAgICAgICBvbkNvbW1lbnQoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWVDb21tZW50ICYmICF2YWx1ZUNvbW1lbnREb25lKSB7XG4gICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGNvbW1lbnRTdHJpbmcodmFsdWVDb21tZW50KSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNob21wS2VlcCAmJiBvbkNob21wS2VlcCkge1xuICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiB3YXJuKGxvZ0xldmVsLCB3YXJuaW5nKSB7XG4gICAgaWYgKGxvZ0xldmVsID09PSAnZGVidWcnIHx8IGxvZ0xldmVsID09PSAnd2FybicpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVtaXRXYXJuaW5nKVxuICAgICAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyh3YXJuaW5nKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgIH1cbn1cblxuY29uc3QgTUVSR0VfS0VZID0gJzw8JztcbmZ1bmN0aW9uIGFkZFBhaXJUb0pTTWFwKGN0eCwgbWFwLCB7IGtleSwgdmFsdWUgfSkge1xuICAgIGlmIChjdHg/LmRvYy5zY2hlbWEubWVyZ2UgJiYgaXNNZXJnZUtleShrZXkpKSB7XG4gICAgICAgIHZhbHVlID0gaXNBbGlhcyh2YWx1ZSkgPyB2YWx1ZS5yZXNvbHZlKGN0eC5kb2MpIDogdmFsdWU7XG4gICAgICAgIGlmIChpc1NlcSh2YWx1ZSkpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIHZhbHVlLml0ZW1zKVxuICAgICAgICAgICAgICAgIG1lcmdlVG9KU01hcChjdHgsIG1hcCwgaXQpO1xuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXQgb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgbWVyZ2VUb0pTTWFwKGN0eCwgbWFwLCBpdCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG1lcmdlVG9KU01hcChjdHgsIG1hcCwgdmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QganNLZXkgPSB0b0pTKGtleSwgJycsIGN0eCk7XG4gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIG1hcC5zZXQoanNLZXksIHRvSlModmFsdWUsIGpzS2V5LCBjdHgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXAgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIG1hcC5hZGQoanNLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RyaW5nS2V5ID0gc3RyaW5naWZ5S2V5KGtleSwganNLZXksIGN0eCk7XG4gICAgICAgICAgICBjb25zdCBqc1ZhbHVlID0gdG9KUyh2YWx1ZSwgc3RyaW5nS2V5LCBjdHgpO1xuICAgICAgICAgICAgaWYgKHN0cmluZ0tleSBpbiBtYXApXG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1hcCwgc3RyaW5nS2V5LCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBqc1ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbWFwW3N0cmluZ0tleV0gPSBqc1ZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG59XG5jb25zdCBpc01lcmdlS2V5ID0gKGtleSkgPT4ga2V5ID09PSBNRVJHRV9LRVkgfHxcbiAgICAoaXNTY2FsYXIkMShrZXkpICYmXG4gICAgICAgIGtleS52YWx1ZSA9PT0gTUVSR0VfS0VZICYmXG4gICAgICAgICgha2V5LnR5cGUgfHwga2V5LnR5cGUgPT09IFNjYWxhci5QTEFJTikpO1xuLy8gSWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIG1lcmdlIGtleSBpcyBhIHNpbmdsZSBtYXBwaW5nIG5vZGUsIGVhY2ggb2Zcbi8vIGl0cyBrZXkvdmFsdWUgcGFpcnMgaXMgaW5zZXJ0ZWQgaW50byB0aGUgY3VycmVudCBtYXBwaW5nLCB1bmxlc3MgdGhlIGtleVxuLy8gYWxyZWFkeSBleGlzdHMgaW4gaXQuIElmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lcmdlIGtleSBpcyBhXG4vLyBzZXF1ZW5jZSwgdGhlbiB0aGlzIHNlcXVlbmNlIGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gbWFwcGluZyBub2RlcyBhbmQgZWFjaFxuLy8gb2YgdGhlc2Ugbm9kZXMgaXMgbWVyZ2VkIGluIHR1cm4gYWNjb3JkaW5nIHRvIGl0cyBvcmRlciBpbiB0aGUgc2VxdWVuY2UuXG4vLyBLZXlzIGluIG1hcHBpbmcgbm9kZXMgZWFybGllciBpbiB0aGUgc2VxdWVuY2Ugb3ZlcnJpZGUga2V5cyBzcGVjaWZpZWQgaW5cbi8vIGxhdGVyIG1hcHBpbmcgbm9kZXMuIC0tIGh0dHA6Ly95YW1sLm9yZy90eXBlL21lcmdlLmh0bWxcbmZ1bmN0aW9uIG1lcmdlVG9KU01hcChjdHgsIG1hcCwgdmFsdWUpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBjdHggJiYgaXNBbGlhcyh2YWx1ZSkgPyB2YWx1ZS5yZXNvbHZlKGN0eC5kb2MpIDogdmFsdWU7XG4gICAgaWYgKCFpc01hcChzb3VyY2UpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lcmdlIHNvdXJjZXMgbXVzdCBiZSBtYXBzIG9yIG1hcCBhbGlhc2VzJyk7XG4gICAgY29uc3Qgc3JjTWFwID0gc291cmNlLnRvSlNPTihudWxsLCBjdHgsIE1hcCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc3JjTWFwKSB7XG4gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgIGlmICghbWFwLmhhcyhrZXkpKVxuICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFwIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBtYXAuYWRkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtYXAsIGtleSkpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXAsIGtleSwge1xuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5S2V5KGtleSwganNLZXksIGN0eCkge1xuICAgIGlmIChqc0tleSA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIGlmICh0eXBlb2YganNLZXkgIT09ICdvYmplY3QnKVxuICAgICAgICByZXR1cm4gU3RyaW5nKGpzS2V5KTtcbiAgICBpZiAoaXNOb2RlJDEoa2V5KSAmJiBjdHggJiYgY3R4LmRvYykge1xuICAgICAgICBjb25zdCBzdHJDdHggPSBjcmVhdGVTdHJpbmdpZnlDb250ZXh0KGN0eC5kb2MsIHt9KTtcbiAgICAgICAgc3RyQ3R4LmFuY2hvcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjdHguYW5jaG9ycy5rZXlzKCkpXG4gICAgICAgICAgICBzdHJDdHguYW5jaG9ycy5hZGQobm9kZS5hbmNob3IpO1xuICAgICAgICBzdHJDdHguaW5GbG93ID0gdHJ1ZTtcbiAgICAgICAgc3RyQ3R4LmluU3RyaW5naWZ5S2V5ID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc3RyS2V5ID0ga2V5LnRvU3RyaW5nKHN0ckN0eCk7XG4gICAgICAgIGlmICghY3R4Lm1hcEtleVdhcm5lZCkge1xuICAgICAgICAgICAgbGV0IGpzb25TdHIgPSBKU09OLnN0cmluZ2lmeShzdHJLZXkpO1xuICAgICAgICAgICAgaWYgKGpzb25TdHIubGVuZ3RoID4gNDApXG4gICAgICAgICAgICAgICAganNvblN0ciA9IGpzb25TdHIuc3Vic3RyaW5nKDAsIDM2KSArICcuLi5cIic7XG4gICAgICAgICAgICB3YXJuKGN0eC5kb2Mub3B0aW9ucy5sb2dMZXZlbCwgYEtleXMgd2l0aCBjb2xsZWN0aW9uIHZhbHVlcyB3aWxsIGJlIHN0cmluZ2lmaWVkIGR1ZSB0byBKUyBPYmplY3QgcmVzdHJpY3Rpb25zOiAke2pzb25TdHJ9LiBTZXQgbWFwQXNNYXA6IHRydWUgdG8gdXNlIG9iamVjdCBrZXlzLmApO1xuICAgICAgICAgICAgY3R4Lm1hcEtleVdhcm5lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cktleTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzS2V5KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGFpcihrZXksIHZhbHVlLCBjdHgpIHtcbiAgICBjb25zdCBrID0gY3JlYXRlTm9kZShrZXksIHVuZGVmaW5lZCwgY3R4KTtcbiAgICBjb25zdCB2ID0gY3JlYXRlTm9kZSh2YWx1ZSwgdW5kZWZpbmVkLCBjdHgpO1xuICAgIHJldHVybiBuZXcgUGFpcihrLCB2KTtcbn1cbmNsYXNzIFBhaXIge1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUgPSBudWxsKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBOT0RFX1RZUEUsIHsgdmFsdWU6IFBBSVIgfSk7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGNsb25lKHNjaGVtYSkge1xuICAgICAgICBsZXQgeyBrZXksIHZhbHVlIH0gPSB0aGlzO1xuICAgICAgICBpZiAoaXNOb2RlJDEoa2V5KSlcbiAgICAgICAgICAgIGtleSA9IGtleS5jbG9uZShzY2hlbWEpO1xuICAgICAgICBpZiAoaXNOb2RlJDEodmFsdWUpKVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5jbG9uZShzY2hlbWEpO1xuICAgICAgICByZXR1cm4gbmV3IFBhaXIoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHRvSlNPTihfLCBjdHgpIHtcbiAgICAgICAgY29uc3QgcGFpciA9IGN0eD8ubWFwQXNNYXAgPyBuZXcgTWFwKCkgOiB7fTtcbiAgICAgICAgcmV0dXJuIGFkZFBhaXJUb0pTTWFwKGN0eCwgcGFpciwgdGhpcyk7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICByZXR1cm4gY3R4Py5kb2NcbiAgICAgICAgICAgID8gc3RyaW5naWZ5UGFpcih0aGlzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApXG4gICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5Q29sbGVjdGlvbihjb2xsZWN0aW9uLCBjdHgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmbG93ID0gY3R4LmluRmxvdyA/PyBjb2xsZWN0aW9uLmZsb3c7XG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gZmxvdyA/IHN0cmluZ2lmeUZsb3dDb2xsZWN0aW9uIDogc3RyaW5naWZ5QmxvY2tDb2xsZWN0aW9uO1xuICAgIHJldHVybiBzdHJpbmdpZnkoY29sbGVjdGlvbiwgY3R4LCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeUJsb2NrQ29sbGVjdGlvbih7IGNvbW1lbnQsIGl0ZW1zIH0sIGN0eCwgeyBibG9ja0l0ZW1QcmVmaXgsIGZsb3dDaGFycywgaXRlbUluZGVudCwgb25DaG9tcEtlZXAsIG9uQ29tbWVudCB9KSB7XG4gICAgY29uc3QgeyBpbmRlbnQsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZyB9IH0gPSBjdHg7XG4gICAgY29uc3QgaXRlbUN0eCA9IE9iamVjdC5hc3NpZ24oe30sIGN0eCwgeyBpbmRlbnQ6IGl0ZW1JbmRlbnQsIHR5cGU6IG51bGwgfSk7XG4gICAgbGV0IGNob21wS2VlcCA9IGZhbHNlOyAvLyBmbGFnIGZvciB0aGUgcHJlY2VkaW5nIG5vZGUncyBzdGF0dXNcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBsZXQgY29tbWVudCA9IG51bGw7XG4gICAgICAgIGlmIChpc05vZGUkMShpdGVtKSkge1xuICAgICAgICAgICAgaWYgKCFjaG9tcEtlZXAgJiYgaXRlbS5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaXRlbS5jb21tZW50QmVmb3JlLCBjaG9tcEtlZXApO1xuICAgICAgICAgICAgaWYgKGl0ZW0uY29tbWVudClcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gaXRlbS5jb21tZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGFpcihpdGVtKSkge1xuICAgICAgICAgICAgY29uc3QgaWsgPSBpc05vZGUkMShpdGVtLmtleSkgPyBpdGVtLmtleSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaWspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNob21wS2VlcCAmJiBpay5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpay5jb21tZW50QmVmb3JlLCBjaG9tcEtlZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgICAgICBsZXQgc3RyID0gc3RyaW5naWZ5JDIoaXRlbSwgaXRlbUN0eCwgKCkgPT4gKGNvbW1lbnQgPSBudWxsKSwgKCkgPT4gKGNob21wS2VlcCA9IHRydWUpKTtcbiAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBpdGVtSW5kZW50LCBjb21tZW50U3RyaW5nKGNvbW1lbnQpKTtcbiAgICAgICAgaWYgKGNob21wS2VlcCAmJiBjb21tZW50KVxuICAgICAgICAgICAgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgICAgIGxpbmVzLnB1c2goYmxvY2tJdGVtUHJlZml4ICsgc3RyKTtcbiAgICB9XG4gICAgbGV0IHN0cjtcbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHN0ciA9IGZsb3dDaGFycy5zdGFydCArIGZsb3dDaGFycy5lbmQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdHIgPSBsaW5lc1swXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICAgICAgc3RyICs9IGxpbmUgPyBgXFxuJHtpbmRlbnR9JHtsaW5lfWAgOiAnXFxuJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBzdHIgKz0gJ1xcbicgKyBpbmRlbnRDb21tZW50KGNvbW1lbnRTdHJpbmcoY29tbWVudCksIGluZGVudCk7XG4gICAgICAgIGlmIChvbkNvbW1lbnQpXG4gICAgICAgICAgICBvbkNvbW1lbnQoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hvbXBLZWVwICYmIG9uQ2hvbXBLZWVwKVxuICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlGbG93Q29sbGVjdGlvbih7IGNvbW1lbnQsIGl0ZW1zIH0sIGN0eCwgeyBmbG93Q2hhcnMsIGl0ZW1JbmRlbnQsIG9uQ29tbWVudCB9KSB7XG4gICAgY29uc3QgeyBpbmRlbnQsIGluZGVudFN0ZXAsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZyB9IH0gPSBjdHg7XG4gICAgaXRlbUluZGVudCArPSBpbmRlbnRTdGVwO1xuICAgIGNvbnN0IGl0ZW1DdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHtcbiAgICAgICAgaW5kZW50OiBpdGVtSW5kZW50LFxuICAgICAgICBpbkZsb3c6IHRydWUsXG4gICAgICAgIHR5cGU6IG51bGxcbiAgICB9KTtcbiAgICBsZXQgcmVxTmV3bGluZSA9IGZhbHNlO1xuICAgIGxldCBsaW5lc0F0VmFsdWUgPSAwO1xuICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgIGxldCBjb21tZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKGlzTm9kZSQxKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaXRlbS5jb21tZW50QmVmb3JlLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdGVtLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKGl0ZW0pKSB7XG4gICAgICAgICAgICBjb25zdCBpayA9IGlzTm9kZSQxKGl0ZW0ua2V5KSA/IGl0ZW0ua2V5IDogbnVsbDtcbiAgICAgICAgICAgIGlmIChpaykge1xuICAgICAgICAgICAgICAgIGlmIChpay5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgYWRkQ29tbWVudEJlZm9yZShjdHgsIGxpbmVzLCBpay5jb21tZW50QmVmb3JlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlrLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIHJlcU5ld2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaXYgPSBpc05vZGUkMShpdGVtLnZhbHVlKSA/IGl0ZW0udmFsdWUgOiBudWxsO1xuICAgICAgICAgICAgaWYgKGl2KSB7XG4gICAgICAgICAgICAgICAgaWYgKGl2LmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdi5jb21tZW50O1xuICAgICAgICAgICAgICAgIGlmIChpdi5jb21tZW50QmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICByZXFOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0udmFsdWUgPT0gbnVsbCAmJiBpayAmJiBpay5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgY29tbWVudCA9IGlrLmNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICByZXFOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgbGV0IHN0ciA9IHN0cmluZ2lmeSQyKGl0ZW0sIGl0ZW1DdHgsICgpID0+IChjb21tZW50ID0gbnVsbCkpO1xuICAgICAgICBpZiAoaSA8IGl0ZW1zLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICBzdHIgKz0gJywnO1xuICAgICAgICBpZiAoY29tbWVudClcbiAgICAgICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGl0ZW1JbmRlbnQsIGNvbW1lbnRTdHJpbmcoY29tbWVudCkpO1xuICAgICAgICBpZiAoIXJlcU5ld2xpbmUgJiYgKGxpbmVzLmxlbmd0aCA+IGxpbmVzQXRWYWx1ZSB8fCBzdHIuaW5jbHVkZXMoJ1xcbicpKSlcbiAgICAgICAgICAgIHJlcU5ld2xpbmUgPSB0cnVlO1xuICAgICAgICBsaW5lcy5wdXNoKHN0cik7XG4gICAgICAgIGxpbmVzQXRWYWx1ZSA9IGxpbmVzLmxlbmd0aDtcbiAgICB9XG4gICAgbGV0IHN0cjtcbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IGZsb3dDaGFycztcbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0YXJ0ICsgZW5kO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFyZXFOZXdsaW5lKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBsaW5lcy5yZWR1Y2UoKHN1bSwgbGluZSkgPT4gc3VtICsgbGluZS5sZW5ndGggKyAyLCAyKTtcbiAgICAgICAgICAgIHJlcU5ld2xpbmUgPSBsZW4gPiBDb2xsZWN0aW9uLm1heEZsb3dTdHJpbmdTaW5nbGVMaW5lTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXFOZXdsaW5lKSB7XG4gICAgICAgICAgICBzdHIgPSBzdGFydDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcylcbiAgICAgICAgICAgICAgICBzdHIgKz0gbGluZSA/IGBcXG4ke2luZGVudFN0ZXB9JHtpbmRlbnR9JHtsaW5lfWAgOiAnXFxuJztcbiAgICAgICAgICAgIHN0ciArPSBgXFxuJHtpbmRlbnR9JHtlbmR9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0ciA9IGAke3N0YXJ0fSAke2xpbmVzLmpvaW4oJyAnKX0gJHtlbmR9YDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjb21tZW50U3RyaW5nKGNvbW1lbnQpLCBpbmRlbnQpO1xuICAgICAgICBpZiAob25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBhZGRDb21tZW50QmVmb3JlKHsgaW5kZW50LCBvcHRpb25zOiB7IGNvbW1lbnRTdHJpbmcgfSB9LCBsaW5lcywgY29tbWVudCwgY2hvbXBLZWVwKSB7XG4gICAgaWYgKGNvbW1lbnQgJiYgY2hvbXBLZWVwKVxuICAgICAgICBjb21tZW50ID0gY29tbWVudC5yZXBsYWNlKC9eXFxuKy8sICcnKTtcbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBjb25zdCBpYyA9IGluZGVudENvbW1lbnQoY29tbWVudFN0cmluZyhjb21tZW50KSwgaW5kZW50KTtcbiAgICAgICAgbGluZXMucHVzaChpYy50cmltU3RhcnQoKSk7IC8vIEF2b2lkIGRvdWJsZSBpbmRlbnQgb24gZmlyc3QgbGluZVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZmluZFBhaXIoaXRlbXMsIGtleSkge1xuICAgIGNvbnN0IGsgPSBpc1NjYWxhciQxKGtleSkgPyBrZXkudmFsdWUgOiBrZXk7XG4gICAgZm9yIChjb25zdCBpdCBvZiBpdGVtcykge1xuICAgICAgICBpZiAoaXNQYWlyKGl0KSkge1xuICAgICAgICAgICAgaWYgKGl0LmtleSA9PT0ga2V5IHx8IGl0LmtleSA9PT0gaylcbiAgICAgICAgICAgICAgICByZXR1cm4gaXQ7XG4gICAgICAgICAgICBpZiAoaXNTY2FsYXIkMShpdC5rZXkpICYmIGl0LmtleS52YWx1ZSA9PT0gaylcbiAgICAgICAgICAgICAgICByZXR1cm4gaXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmNsYXNzIFlBTUxNYXAgZXh0ZW5kcyBDb2xsZWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoTUFQLCBzY2hlbWEpO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgdGFnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICd0YWc6eWFtbC5vcmcsMjAwMjptYXAnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3ZlcndyaXRlIC0gSWYgbm90IHNldCBgdHJ1ZWAsIHVzaW5nIGEga2V5IHRoYXQgaXMgYWxyZWFkeSBpbiB0aGVcbiAgICAgKiAgIGNvbGxlY3Rpb24gd2lsbCB0aHJvdy4gT3RoZXJ3aXNlLCBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyB2YWx1ZS5cbiAgICAgKi9cbiAgICBhZGQocGFpciwgb3ZlcndyaXRlKSB7XG4gICAgICAgIGxldCBfcGFpcjtcbiAgICAgICAgaWYgKGlzUGFpcihwYWlyKSlcbiAgICAgICAgICAgIF9wYWlyID0gcGFpcjtcbiAgICAgICAgZWxzZSBpZiAoIXBhaXIgfHwgdHlwZW9mIHBhaXIgIT09ICdvYmplY3QnIHx8ICEoJ2tleScgaW4gcGFpcikpIHtcbiAgICAgICAgICAgIC8vIEluIFR5cGVTY3JpcHQsIHRoaXMgbmV2ZXIgaGFwcGVucy5cbiAgICAgICAgICAgIF9wYWlyID0gbmV3IFBhaXIocGFpciwgcGFpcj8udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIF9wYWlyID0gbmV3IFBhaXIocGFpci5rZXksIHBhaXIudmFsdWUpO1xuICAgICAgICBjb25zdCBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywgX3BhaXIua2V5KTtcbiAgICAgICAgY29uc3Qgc29ydEVudHJpZXMgPSB0aGlzLnNjaGVtYT8uc29ydE1hcEVudHJpZXM7XG4gICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICBpZiAoIW92ZXJ3cml0ZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEtleSAke19wYWlyLmtleX0gYWxyZWFkeSBzZXRgKTtcbiAgICAgICAgICAgIC8vIEZvciBzY2FsYXJzLCBrZWVwIHRoZSBvbGQgbm9kZSAmIGl0cyBjb21tZW50cyBhbmQgYW5jaG9yc1xuICAgICAgICAgICAgaWYgKGlzU2NhbGFyJDEocHJldi52YWx1ZSkgJiYgaXNTY2FsYXJWYWx1ZShfcGFpci52YWx1ZSkpXG4gICAgICAgICAgICAgICAgcHJldi52YWx1ZS52YWx1ZSA9IF9wYWlyLnZhbHVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHByZXYudmFsdWUgPSBfcGFpci52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzb3J0RW50cmllcykge1xuICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuaXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gc29ydEVudHJpZXMoX3BhaXIsIGl0ZW0pIDwgMCk7XG4gICAgICAgICAgICBpZiAoaSA9PT0gLTEpXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKF9wYWlyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZShpLCAwLCBfcGFpcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goX3BhaXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgY29uc3QgaXQgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgICAgICBpZiAoIWl0KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBkZWwgPSB0aGlzLml0ZW1zLnNwbGljZSh0aGlzLml0ZW1zLmluZGV4T2YoaXQpLCAxKTtcbiAgICAgICAgcmV0dXJuIGRlbC5sZW5ndGggPiAwO1xuICAgIH1cbiAgICBnZXQoa2V5LCBrZWVwU2NhbGFyKSB7XG4gICAgICAgIGNvbnN0IGl0ID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGl0Py52YWx1ZTtcbiAgICAgICAgcmV0dXJuICgha2VlcFNjYWxhciAmJiBpc1NjYWxhciQxKG5vZGUpID8gbm9kZS52YWx1ZSA6IG5vZGUpID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgIH1cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmFkZChuZXcgUGFpcihrZXksIHZhbHVlKSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjdHggLSBDb252ZXJzaW9uIGNvbnRleHQsIG9yaWdpbmFsbHkgc2V0IGluIERvY3VtZW50I3RvSlMoKVxuICAgICAqIEBwYXJhbSB7Q2xhc3N9IFR5cGUgLSBJZiBzZXQsIGZvcmNlcyB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbiB0eXBlXG4gICAgICogQHJldHVybnMgSW5zdGFuY2Ugb2YgVHlwZSwgTWFwLCBvciBPYmplY3RcbiAgICAgKi9cbiAgICB0b0pTT04oXywgY3R4LCBUeXBlKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IFR5cGUgPyBuZXcgVHlwZSgpIDogY3R4Py5tYXBBc01hcCA/IG5ldyBNYXAoKSA6IHt9O1xuICAgICAgICBpZiAoY3R4Py5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShtYXApO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcylcbiAgICAgICAgICAgIGFkZFBhaXJUb0pTTWFwKGN0eCwgbWFwLCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcykge1xuICAgICAgICAgICAgaWYgKCFpc1BhaXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXAgaXRlbXMgbXVzdCBhbGwgYmUgcGFpcnM7IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoaXRlbSl9IGluc3RlYWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWN0eC5hbGxOdWxsVmFsdWVzICYmIHRoaXMuaGFzQWxsTnVsbFZhbHVlcyhmYWxzZSkpXG4gICAgICAgICAgICBjdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHsgYWxsTnVsbFZhbHVlczogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeUNvbGxlY3Rpb24odGhpcywgY3R4LCB7XG4gICAgICAgICAgICBibG9ja0l0ZW1QcmVmaXg6ICcnLFxuICAgICAgICAgICAgZmxvd0NoYXJzOiB7IHN0YXJ0OiAneycsIGVuZDogJ30nIH0sXG4gICAgICAgICAgICBpdGVtSW5kZW50OiBjdHguaW5kZW50IHx8ICcnLFxuICAgICAgICAgICAgb25DaG9tcEtlZXAsXG4gICAgICAgICAgICBvbkNvbW1lbnRcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXAoc2NoZW1hLCBvYmosIGN0eCkge1xuICAgIGNvbnN0IHsga2VlcFVuZGVmaW5lZCwgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICBjb25zdCBtYXAgPSBuZXcgWUFNTE1hcChzY2hlbWEpO1xuICAgIGNvbnN0IGFkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICB2YWx1ZSA9IHJlcGxhY2VyLmNhbGwob2JqLCBrZXksIHZhbHVlKTtcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXBsYWNlcikgJiYgIXJlcGxhY2VyLmluY2x1ZGVzKGtleSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGtlZXBVbmRlZmluZWQpXG4gICAgICAgICAgICBtYXAuaXRlbXMucHVzaChjcmVhdGVQYWlyKGtleSwgdmFsdWUsIGN0eCkpO1xuICAgIH07XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmopXG4gICAgICAgICAgICBhZGQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKVxuICAgICAgICAgICAgYWRkKGtleSwgb2JqW2tleV0pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNjaGVtYS5zb3J0TWFwRW50cmllcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtYXAuaXRlbXMuc29ydChzY2hlbWEuc29ydE1hcEVudHJpZXMpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxuY29uc3QgbWFwID0ge1xuICAgIGNvbGxlY3Rpb246ICdtYXAnLFxuICAgIGNyZWF0ZU5vZGU6IGNyZWF0ZU1hcCxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIG5vZGVDbGFzczogWUFNTE1hcCxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjptYXAnLFxuICAgIHJlc29sdmUobWFwLCBvbkVycm9yKSB7XG4gICAgICAgIGlmICghaXNNYXAobWFwKSlcbiAgICAgICAgICAgIG9uRXJyb3IoJ0V4cGVjdGVkIGEgbWFwcGluZyBmb3IgdGhpcyB0YWcnKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG59O1xuXG5jbGFzcyBZQU1MU2VxIGV4dGVuZHMgQ29sbGVjdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKFNFUSwgc2NoZW1hKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IHRhZ05hbWUoKSB7XG4gICAgICAgIHJldHVybiAndGFnOnlhbWwub3JnLDIwMDI6c2VxJztcbiAgICB9XG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogYGtleWAgbXVzdCBjb250YWluIGEgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBmb3IgdGhpcyB0byBzdWNjZWVkLlxuICAgICAqIEl0IG1heSBiZSB3cmFwcGVkIGluIGEgYFNjYWxhcmAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLlxuICAgICAqL1xuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBkZWwgPSB0aGlzLml0ZW1zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICByZXR1cm4gZGVsLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgaXQgPSB0aGlzLml0ZW1zW2lkeF07XG4gICAgICAgIHJldHVybiAha2VlcFNjYWxhciAmJiBpc1NjYWxhciQxKGl0KSA/IGl0LnZhbHVlIDogaXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY29sbGVjdGlvbiBpbmNsdWRlcyBhIHZhbHVlIHdpdGggdGhlIGtleSBga2V5YC5cbiAgICAgKlxuICAgICAqIGBrZXlgIG11c3QgY29udGFpbiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgZm9yIHRoaXMgdG8gc3VjY2VlZC5cbiAgICAgKiBJdCBtYXkgYmUgd3JhcHBlZCBpbiBhIGBTY2FsYXJgLlxuICAgICAqL1xuICAgIGhhcyhrZXkpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpZHggPT09ICdudW1iZXInICYmIGlkeCA8IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgaW4gdGhpcyBjb2xsZWN0aW9uLiBGb3IgYCEhc2V0YCwgYHZhbHVlYCBuZWVkcyB0byBiZSBhXG4gICAgICogYm9vbGVhbiB0byBhZGQvcmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIHNldC5cbiAgICAgKlxuICAgICAqIElmIGBrZXlgIGRvZXMgbm90IGNvbnRhaW4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyLCB0aGlzIHdpbGwgdGhyb3cuXG4gICAgICogSXQgbWF5IGJlIHdyYXBwZWQgaW4gYSBgU2NhbGFyYC5cbiAgICAgKi9cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIGlkeCAhPT0gJ251bWJlcicpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgdmFsaWQgaW5kZXgsIG5vdCAke2tleX0uYCk7XG4gICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLml0ZW1zW2lkeF07XG4gICAgICAgIGlmIChpc1NjYWxhciQxKHByZXYpICYmIGlzU2NhbGFyVmFsdWUodmFsdWUpKVxuICAgICAgICAgICAgcHJldi52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLml0ZW1zW2lkeF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdG9KU09OKF8sIGN0eCkge1xuICAgICAgICBjb25zdCBzZXEgPSBbXTtcbiAgICAgICAgaWYgKGN0eD8ub25DcmVhdGUpXG4gICAgICAgICAgICBjdHgub25DcmVhdGUoc2VxKTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pdGVtcylcbiAgICAgICAgICAgIHNlcS5wdXNoKHRvSlMoaXRlbSwgU3RyaW5nKGkrKyksIGN0eCkpO1xuICAgICAgICByZXR1cm4gc2VxO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlDb2xsZWN0aW9uKHRoaXMsIGN0eCwge1xuICAgICAgICAgICAgYmxvY2tJdGVtUHJlZml4OiAnLSAnLFxuICAgICAgICAgICAgZmxvd0NoYXJzOiB7IHN0YXJ0OiAnWycsIGVuZDogJ10nIH0sXG4gICAgICAgICAgICBpdGVtSW5kZW50OiAoY3R4LmluZGVudCB8fCAnJykgKyAnICAnLFxuICAgICAgICAgICAgb25DaG9tcEtlZXAsXG4gICAgICAgICAgICBvbkNvbW1lbnRcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNJdGVtSW5kZXgoa2V5KSB7XG4gICAgbGV0IGlkeCA9IGlzU2NhbGFyJDEoa2V5KSA/IGtleS52YWx1ZSA6IGtleTtcbiAgICBpZiAoaWR4ICYmIHR5cGVvZiBpZHggPT09ICdzdHJpbmcnKVxuICAgICAgICBpZHggPSBOdW1iZXIoaWR4KTtcbiAgICByZXR1cm4gdHlwZW9mIGlkeCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcihpZHgpICYmIGlkeCA+PSAwXG4gICAgICAgID8gaWR4XG4gICAgICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2VxKHNjaGVtYSwgb2JqLCBjdHgpIHtcbiAgICBjb25zdCB7IHJlcGxhY2VyIH0gPSBjdHg7XG4gICAgY29uc3Qgc2VxID0gbmV3IFlBTUxTZXEoc2NoZW1hKTtcbiAgICBpZiAob2JqICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3Qob2JqKSkge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAobGV0IGl0IG9mIG9iaikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IG9iaiBpbnN0YW5jZW9mIFNldCA/IGl0IDogU3RyaW5nKGkrKyk7XG4gICAgICAgICAgICAgICAgaXQgPSByZXBsYWNlci5jYWxsKG9iaiwga2V5LCBpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXEuaXRlbXMucHVzaChjcmVhdGVOb2RlKGl0LCB1bmRlZmluZWQsIGN0eCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZXE7XG59XG5jb25zdCBzZXEgPSB7XG4gICAgY29sbGVjdGlvbjogJ3NlcScsXG4gICAgY3JlYXRlTm9kZTogY3JlYXRlU2VxLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgbm9kZUNsYXNzOiBZQU1MU2VxLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnNlcScsXG4gICAgcmVzb2x2ZShzZXEsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc1NlcShzZXEpKVxuICAgICAgICAgICAgb25FcnJvcignRXhwZWN0ZWQgYSBzZXF1ZW5jZSBmb3IgdGhpcyB0YWcnKTtcbiAgICAgICAgcmV0dXJuIHNlcTtcbiAgICB9XG59O1xuXG5jb25zdCBzdHJpbmcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLFxuICAgIHJlc29sdmU6IHN0ciA9PiBzdHIsXG4gICAgc3RyaW5naWZ5KGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBjdHggPSBPYmplY3QuYXNzaWduKHsgYWN0dWFsU3RyaW5nOiB0cnVlIH0sIGN0eCk7XG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICB9XG59O1xuXG5jb25zdCBudWxsVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PSBudWxsLFxuICAgIGNyZWF0ZU5vZGU6ICgpID0+IG5ldyBTY2FsYXIobnVsbCksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJyxcbiAgICB0ZXN0OiAvXig/On58W05uXXVsbHxOVUxMKT8kLyxcbiAgICByZXNvbHZlOiAoKSA9PiBuZXcgU2NhbGFyKG51bGwpLFxuICAgIHN0cmluZ2lmeTogKHsgc291cmNlIH0sIGN0eCkgPT4gdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgJiYgbnVsbFRhZy50ZXN0LnRlc3Qoc291cmNlKVxuICAgICAgICA/IHNvdXJjZVxuICAgICAgICA6IGN0eC5vcHRpb25zLm51bGxTdHJcbn07XG5cbmNvbnN0IGJvb2xUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gICAgdGVzdDogL14oPzpbVHRdcnVlfFRSVUV8W0ZmXWFsc2V8RkFMU0UpJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IG5ldyBTY2FsYXIoc3RyWzBdID09PSAndCcgfHwgc3RyWzBdID09PSAnVCcpLFxuICAgIHN0cmluZ2lmeSh7IHNvdXJjZSwgdmFsdWUgfSwgY3R4KSB7XG4gICAgICAgIGlmIChzb3VyY2UgJiYgYm9vbFRhZy50ZXN0LnRlc3Qoc291cmNlKSkge1xuICAgICAgICAgICAgY29uc3Qgc3YgPSBzb3VyY2VbMF0gPT09ICd0JyB8fCBzb3VyY2VbMF0gPT09ICdUJztcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gc3YpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgPyBjdHgub3B0aW9ucy50cnVlU3RyIDogY3R4Lm9wdGlvbnMuZmFsc2VTdHI7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5TnVtYmVyKHsgZm9ybWF0LCBtaW5GcmFjdGlvbkRpZ2l0cywgdGFnLCB2YWx1ZSB9KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpXG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIGNvbnN0IG51bSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKCFpc0Zpbml0ZShudW0pKVxuICAgICAgICByZXR1cm4gaXNOYU4obnVtKSA/ICcubmFuJyA6IG51bSA8IDAgPyAnLS5pbmYnIDogJy5pbmYnO1xuICAgIGxldCBuID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmICghZm9ybWF0ICYmXG4gICAgICAgIG1pbkZyYWN0aW9uRGlnaXRzICYmXG4gICAgICAgICghdGFnIHx8IHRhZyA9PT0gJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JykgJiZcbiAgICAgICAgL15cXGQvLnRlc3QobikpIHtcbiAgICAgICAgbGV0IGkgPSBuLmluZGV4T2YoJy4nKTtcbiAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICBpID0gbi5sZW5ndGg7XG4gICAgICAgICAgICBuICs9ICcuJztcbiAgICAgICAgfVxuICAgICAgICBsZXQgZCA9IG1pbkZyYWN0aW9uRGlnaXRzIC0gKG4ubGVuZ3RoIC0gaSAtIDEpO1xuICAgICAgICB3aGlsZSAoZC0tID4gMClcbiAgICAgICAgICAgIG4gKz0gJzAnO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbn1cblxuY29uc3QgZmxvYXROYU4kMSA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXig/OlstK10/XFwuKD86aW5mfEluZnxJTkZ8bmFufE5hTnxOQU4pKSQvLFxuICAgIHJlc29sdmU6IHN0ciA9PiBzdHIuc2xpY2UoLTMpLnRvTG93ZXJDYXNlKCkgPT09ICduYW4nXG4gICAgICAgID8gTmFOXG4gICAgICAgIDogc3RyWzBdID09PSAnLSdcbiAgICAgICAgICAgID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgICAgICAgICA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGZsb2F0RXhwJDEgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgZm9ybWF0OiAnRVhQJyxcbiAgICB0ZXN0OiAvXlstK10/KD86XFwuWzAtOV0rfFswLTldKyg/OlxcLlswLTldKik/KVtlRV1bLStdP1swLTldKyQvLFxuICAgIHJlc29sdmU6IHN0ciA9PiBwYXJzZUZsb2F0KHN0ciksXG4gICAgc3RyaW5naWZ5KG5vZGUpIHtcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKG5vZGUudmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNGaW5pdGUobnVtKSA/IG51bS50b0V4cG9uZW50aWFsKCkgOiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG4gICAgfVxufTtcbmNvbnN0IGZsb2F0JDEgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgdGVzdDogL15bLStdPyg/OlxcLlswLTldK3xbMC05XStcXC5bMC05XSopJC8sXG4gICAgcmVzb2x2ZShzdHIpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBTY2FsYXIocGFyc2VGbG9hdChzdHIpKTtcbiAgICAgICAgY29uc3QgZG90ID0gc3RyLmluZGV4T2YoJy4nKTtcbiAgICAgICAgaWYgKGRvdCAhPT0gLTEgJiYgc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJzAnKVxuICAgICAgICAgICAgbm9kZS5taW5GcmFjdGlvbkRpZ2l0cyA9IHN0ci5sZW5ndGggLSBkb3QgLSAxO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9LFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuXG5jb25zdCBpbnRJZGVudGlmeSQyID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xuY29uc3QgaW50UmVzb2x2ZSQxID0gKHN0ciwgb2Zmc2V0LCByYWRpeCwgeyBpbnRBc0JpZ0ludCB9KSA9PiAoaW50QXNCaWdJbnQgPyBCaWdJbnQoc3RyKSA6IHBhcnNlSW50KHN0ci5zdWJzdHJpbmcob2Zmc2V0KSwgcmFkaXgpKTtcbmZ1bmN0aW9uIGludFN0cmluZ2lmeSQxKG5vZGUsIHJhZGl4LCBwcmVmaXgpIHtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSBub2RlO1xuICAgIGlmIChpbnRJZGVudGlmeSQyKHZhbHVlKSAmJiB2YWx1ZSA+PSAwKVxuICAgICAgICByZXR1cm4gcHJlZml4ICsgdmFsdWUudG9TdHJpbmcocmFkaXgpO1xuICAgIHJldHVybiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG59XG5jb25zdCBpbnRPY3QkMSA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gaW50SWRlbnRpZnkkMih2YWx1ZSkgJiYgdmFsdWUgPj0gMCxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnT0NUJyxcbiAgICB0ZXN0OiAvXjBvWzAtN10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZSQxKHN0ciwgMiwgOCwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5JDEobm9kZSwgOCwgJzBvJylcbn07XG5jb25zdCBpbnQkMSA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnkkMixcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgdGVzdDogL15bLStdP1swLTldKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUkMShzdHIsIDAsIDEwLCBvcHQpLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuY29uc3QgaW50SGV4JDEgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IGludElkZW50aWZ5JDIodmFsdWUpICYmIHZhbHVlID49IDAsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ0hFWCcsXG4gICAgdGVzdDogL14weFswLTlhLWZBLUZdKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUkMShzdHIsIDIsIDE2LCBvcHQpLFxuICAgIHN0cmluZ2lmeTogbm9kZSA9PiBpbnRTdHJpbmdpZnkkMShub2RlLCAxNiwgJzB4Jylcbn07XG5cbmNvbnN0IHNjaGVtYSQyID0gW1xuICAgIG1hcCxcbiAgICBzZXEsXG4gICAgc3RyaW5nLFxuICAgIG51bGxUYWcsXG4gICAgYm9vbFRhZyxcbiAgICBpbnRPY3QkMSxcbiAgICBpbnQkMSxcbiAgICBpbnRIZXgkMSxcbiAgICBmbG9hdE5hTiQxLFxuICAgIGZsb2F0RXhwJDEsXG4gICAgZmxvYXQkMVxuXTtcblxuZnVuY3Rpb24gaW50SWRlbnRpZnkkMSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xufVxuY29uc3Qgc3RyaW5naWZ5SlNPTiA9ICh7IHZhbHVlIH0pID0+IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbmNvbnN0IGpzb25TY2FsYXJzID0gW1xuICAgIHtcbiAgICAgICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicsXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBzdHIsXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgPT0gbnVsbCxcbiAgICAgICAgY3JlYXRlTm9kZTogKCkgPT4gbmV3IFNjYWxhcihudWxsKSxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6bnVsbCcsXG4gICAgICAgIHRlc3Q6IC9ebnVsbCQvLFxuICAgICAgICByZXNvbHZlOiAoKSA9PiBudWxsLFxuICAgICAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeUpTT05cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpib29sJyxcbiAgICAgICAgdGVzdDogL150cnVlfGZhbHNlJC8sXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBzdHIgPT09ICd0cnVlJyxcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSQxLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgICAgICB0ZXN0OiAvXi0/KD86MHxbMS05XVswLTldKikkLyxcbiAgICAgICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIHsgaW50QXNCaWdJbnQgfSkgPT4gaW50QXNCaWdJbnQgPyBCaWdJbnQoc3RyKSA6IHBhcnNlSW50KHN0ciwgMTApLFxuICAgICAgICBzdHJpbmdpZnk6ICh7IHZhbHVlIH0pID0+IGludElkZW50aWZ5JDEodmFsdWUpID8gdmFsdWUudG9TdHJpbmcoKSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgICAgICB0ZXN0OiAvXi0/KD86MHxbMS05XVswLTldKikoPzpcXC5bMC05XSopPyg/OltlRV1bLStdP1swLTldKyk/JC8sXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBwYXJzZUZsb2F0KHN0ciksXG4gICAgICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxuICAgIH1cbl07XG5jb25zdCBqc29uRXJyb3IgPSB7XG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICcnLFxuICAgIHRlc3Q6IC9eLyxcbiAgICByZXNvbHZlKHN0ciwgb25FcnJvcikge1xuICAgICAgICBvbkVycm9yKGBVbnJlc29sdmVkIHBsYWluIHNjYWxhciAke0pTT04uc3RyaW5naWZ5KHN0cil9YCk7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxufTtcbmNvbnN0IHNjaGVtYSQxID0gW21hcCwgc2VxXS5jb25jYXQoanNvblNjYWxhcnMsIGpzb25FcnJvcik7XG5cbmNvbnN0IGJpbmFyeSA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5LFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJpbmFyeScsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJ1ZmZlciBpbiBub2RlIGFuZCBhbiBVaW50OEFycmF5IGluIGJyb3dzZXJzXG4gICAgICpcbiAgICAgKiBUbyB1c2UgdGhlIHJlc3VsdGluZyBidWZmZXIgYXMgYW4gaW1hZ2UsIHlvdSdsbCB3YW50IHRvIGRvIHNvbWV0aGluZyBsaWtlOlxuICAgICAqXG4gICAgICogICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2ltYWdlL2pwZWcnIH0pXG4gICAgICogICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGhvdG8nKS5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICovXG4gICAgcmVzb2x2ZShzcmMsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShzcmMsICdiYXNlNjQnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gT24gSUUgMTEsIGF0b2IoKSBjYW4ndCBoYW5kbGUgbmV3bGluZXNcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IGF0b2Ioc3JjLnJlcGxhY2UoL1tcXG5cXHJdL2csICcnKSk7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9uRXJyb3IoJ1RoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGJpbmFyeSB0YWdzOyBlaXRoZXIgQnVmZmVyIG9yIGF0b2IgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgICAgIHJldHVybiBzcmM7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHN0cmluZ2lmeSh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBjb25zdCBidWYgPSB2YWx1ZTsgLy8gY2hlY2tlZCBlYXJsaWVyIGJ5IGJpbmFyeS5pZGVudGlmeSgpXG4gICAgICAgIGxldCBzdHI7XG4gICAgICAgIGlmICh0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzdHIgPVxuICAgICAgICAgICAgICAgIGJ1ZiBpbnN0YW5jZW9mIEJ1ZmZlclxuICAgICAgICAgICAgICAgICAgICA/IGJ1Zi50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgICAgICAgICAgICAgOiBCdWZmZXIuZnJvbShidWYuYnVmZmVyKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGxldCBzID0gJyc7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgICAgICAgICAgIHN0ciA9IGJ0b2Eocyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nIGJpbmFyeSB0YWdzOyBlaXRoZXIgQnVmZmVyIG9yIGJ0b2EgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXR5cGUpXG4gICAgICAgICAgICB0eXBlID0gU2NhbGFyLkJMT0NLX0xJVEVSQUw7XG4gICAgICAgIGlmICh0eXBlICE9PSBTY2FsYXIuUVVPVEVfRE9VQkxFKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBNYXRoLm1heChjdHgub3B0aW9ucy5saW5lV2lkdGggLSBjdHguaW5kZW50Lmxlbmd0aCwgY3R4Lm9wdGlvbnMubWluQ29udGVudFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBNYXRoLmNlaWwoc3RyLmxlbmd0aCAvIGxpbmVXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IG5ldyBBcnJheShuKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBvID0gMDsgaSA8IG47ICsraSwgbyArPSBsaW5lV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsaW5lc1tpXSA9IHN0ci5zdWJzdHIobywgbGluZVdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ciA9IGxpbmVzLmpvaW4odHlwZSA9PT0gU2NhbGFyLkJMT0NLX0xJVEVSQUwgPyAnXFxuJyA6ICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeVN0cmluZyh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlOiBzdHIgfSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiByZXNvbHZlUGFpcnMoc2VxLCBvbkVycm9yKSB7XG4gICAgaWYgKGlzU2VxKHNlcSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXEuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gc2VxLml0ZW1zW2ldO1xuICAgICAgICAgICAgaWYgKGlzUGFpcihpdGVtKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzTWFwKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbXMubGVuZ3RoID4gMSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcignRWFjaCBwYWlyIG11c3QgaGF2ZSBpdHMgb3duIHNlcXVlbmNlIGluZGljYXRvcicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBpdGVtLml0ZW1zWzBdIHx8IG5ldyBQYWlyKG5ldyBTY2FsYXIobnVsbCkpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbW1lbnRCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIHBhaXIua2V5LmNvbW1lbnRCZWZvcmUgPSBwYWlyLmtleS5jb21tZW50QmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAke2l0ZW0uY29tbWVudEJlZm9yZX1cXG4ke3BhaXIua2V5LmNvbW1lbnRCZWZvcmV9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbiA9IHBhaXIudmFsdWUgPz8gcGFpci5rZXk7XG4gICAgICAgICAgICAgICAgICAgIGNuLmNvbW1lbnQgPSBjbi5jb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAke2l0ZW0uY29tbWVudH1cXG4ke2NuLmNvbW1lbnR9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGl0ZW0gPSBwYWlyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VxLml0ZW1zW2ldID0gaXNQYWlyKGl0ZW0pID8gaXRlbSA6IG5ldyBQYWlyKGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgb25FcnJvcignRXhwZWN0ZWQgYSBzZXF1ZW5jZSBmb3IgdGhpcyB0YWcnKTtcbiAgICByZXR1cm4gc2VxO1xufVxuZnVuY3Rpb24gY3JlYXRlUGFpcnMoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSB7XG4gICAgY29uc3QgeyByZXBsYWNlciB9ID0gY3R4O1xuICAgIGNvbnN0IHBhaXJzID0gbmV3IFlBTUxTZXEoc2NoZW1hKTtcbiAgICBwYWlycy50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnO1xuICAgIGxldCBpID0gMDtcbiAgICBpZiAoaXRlcmFibGUgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyYWJsZSkpXG4gICAgICAgIGZvciAobGV0IGl0IG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIGl0ID0gcmVwbGFjZXIuY2FsbChpdGVyYWJsZSwgU3RyaW5nKGkrKyksIGl0KTtcbiAgICAgICAgICAgIGxldCBrZXksIHZhbHVlO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBpdFswXTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpdFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBba2V5LCB2YWx1ZV0gdHVwbGU6ICR7aXR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpdCAmJiBpdCBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaXRba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCB7IGtleTogdmFsdWUgfSB0dXBsZTogJHtpdH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtleSA9IGl0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFpcnMuaXRlbXMucHVzaChjcmVhdGVQYWlyKGtleSwgdmFsdWUsIGN0eCkpO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHBhaXJzO1xufVxuY29uc3QgcGFpcnMgPSB7XG4gICAgY29sbGVjdGlvbjogJ3NlcScsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnLFxuICAgIHJlc29sdmU6IHJlc29sdmVQYWlycyxcbiAgICBjcmVhdGVOb2RlOiBjcmVhdGVQYWlyc1xufTtcblxuY2xhc3MgWUFNTE9NYXAgZXh0ZW5kcyBZQU1MU2VxIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hZGQgPSBZQU1MTWFwLnByb3RvdHlwZS5hZGQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWxldGUgPSBZQU1MTWFwLnByb3RvdHlwZS5kZWxldGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5nZXQgPSBZQU1MTWFwLnByb3RvdHlwZS5nZXQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5oYXMgPSBZQU1MTWFwLnByb3RvdHlwZS5oYXMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zZXQgPSBZQU1MTWFwLnByb3RvdHlwZS5zZXQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy50YWcgPSBZQU1MT01hcC50YWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIGBjdHhgIGlzIGdpdmVuLCB0aGUgcmV0dXJuIHR5cGUgaXMgYWN0dWFsbHkgYE1hcDx1bmtub3duLCB1bmtub3duPmAsXG4gICAgICogYnV0IFR5cGVTY3JpcHQgd29uJ3QgYWxsb3cgd2lkZW5pbmcgdGhlIHNpZ25hdHVyZSBvZiBhIGNoaWxkIG1ldGhvZC5cbiAgICAgKi9cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvSlNPTihfKTtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAoY3R4Py5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShtYXApO1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgdGhpcy5pdGVtcykge1xuICAgICAgICAgICAgbGV0IGtleSwgdmFsdWU7XG4gICAgICAgICAgICBpZiAoaXNQYWlyKHBhaXIpKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gdG9KUyhwYWlyLmtleSwgJycsIGN0eCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0b0pTKHBhaXIudmFsdWUsIGtleSwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtleSA9IHRvSlMocGFpciwgJycsIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWFwLmhhcyhrZXkpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3JkZXJlZCBtYXBzIG11c3Qgbm90IGluY2x1ZGUgZHVwbGljYXRlIGtleXMnKTtcbiAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG59XG5ZQU1MT01hcC50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6b21hcCc7XG5jb25zdCBvbWFwID0ge1xuICAgIGNvbGxlY3Rpb246ICdzZXEnLFxuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIE1hcCxcbiAgICBub2RlQ2xhc3M6IFlBTUxPTWFwLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnLFxuICAgIHJlc29sdmUoc2VxLCBvbkVycm9yKSB7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gcmVzb2x2ZVBhaXJzKHNlcSwgb25FcnJvcik7XG4gICAgICAgIGNvbnN0IHNlZW5LZXlzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgeyBrZXkgfSBvZiBwYWlycy5pdGVtcykge1xuICAgICAgICAgICAgaWYgKGlzU2NhbGFyJDEoa2V5KSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWVuS2V5cy5pbmNsdWRlcyhrZXkudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoYE9yZGVyZWQgbWFwcyBtdXN0IG5vdCBpbmNsdWRlIGR1cGxpY2F0ZSBrZXlzOiAke2tleS52YWx1ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5LZXlzLnB1c2goa2V5LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFlBTUxPTWFwKCksIHBhaXJzKTtcbiAgICB9LFxuICAgIGNyZWF0ZU5vZGUoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSB7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gY3JlYXRlUGFpcnMoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KTtcbiAgICAgICAgY29uc3Qgb21hcCA9IG5ldyBZQU1MT01hcCgpO1xuICAgICAgICBvbWFwLml0ZW1zID0gcGFpcnMuaXRlbXM7XG4gICAgICAgIHJldHVybiBvbWFwO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGJvb2xTdHJpbmdpZnkoeyB2YWx1ZSwgc291cmNlIH0sIGN0eCkge1xuICAgIGNvbnN0IGJvb2xPYmogPSB2YWx1ZSA/IHRydWVUYWcgOiBmYWxzZVRhZztcbiAgICBpZiAoc291cmNlICYmIGJvb2xPYmoudGVzdC50ZXN0KHNvdXJjZSkpXG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgcmV0dXJuIHZhbHVlID8gY3R4Lm9wdGlvbnMudHJ1ZVN0ciA6IGN0eC5vcHRpb25zLmZhbHNlU3RyO1xufVxuY29uc3QgdHJ1ZVRhZyA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgPT09IHRydWUsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpib29sJyxcbiAgICB0ZXN0OiAvXig/Oll8eXxbWXldZXN8WUVTfFtUdF1ydWV8VFJVRXxbT29dbnxPTikkLyxcbiAgICByZXNvbHZlOiAoKSA9PiBuZXcgU2NhbGFyKHRydWUpLFxuICAgIHN0cmluZ2lmeTogYm9vbFN0cmluZ2lmeVxufTtcbmNvbnN0IGZhbHNlVGFnID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSA9PT0gZmFsc2UsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpib29sJyxcbiAgICB0ZXN0OiAvXig/Ok58bnxbTm5db3xOT3xbRmZdYWxzZXxGQUxTRXxbT29dZmZ8T0ZGKSQvaSxcbiAgICByZXNvbHZlOiAoKSA9PiBuZXcgU2NhbGFyKGZhbHNlKSxcbiAgICBzdHJpbmdpZnk6IGJvb2xTdHJpbmdpZnlcbn07XG5cbmNvbnN0IGZsb2F0TmFOID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eWy0rXT9cXC4oPzppbmZ8SW5mfElORnxuYW58TmFOfE5BTikkLyxcbiAgICByZXNvbHZlOiAoc3RyKSA9PiBzdHIuc2xpY2UoLTMpLnRvTG93ZXJDYXNlKCkgPT09ICduYW4nXG4gICAgICAgID8gTmFOXG4gICAgICAgIDogc3RyWzBdID09PSAnLSdcbiAgICAgICAgICAgID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgICAgICAgICA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGZsb2F0RXhwID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIGZvcm1hdDogJ0VYUCcsXG4gICAgdGVzdDogL15bLStdPyg/OlswLTldWzAtOV9dKik/KD86XFwuWzAtOV9dKik/W2VFXVstK10/WzAtOV0rJC8sXG4gICAgcmVzb2x2ZTogKHN0cikgPT4gcGFyc2VGbG9hdChzdHIucmVwbGFjZSgvXy9nLCAnJykpLFxuICAgIHN0cmluZ2lmeShub2RlKSB7XG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihub2RlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzRmluaXRlKG51bSkgPyBudW0udG9FeHBvbmVudGlhbCgpIDogc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xuICAgIH1cbn07XG5jb25zdCBmbG9hdCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICB0ZXN0OiAvXlstK10/KD86WzAtOV1bMC05X10qKT9cXC5bMC05X10qJC8sXG4gICAgcmVzb2x2ZShzdHIpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBTY2FsYXIocGFyc2VGbG9hdChzdHIucmVwbGFjZSgvXy9nLCAnJykpKTtcbiAgICAgICAgY29uc3QgZG90ID0gc3RyLmluZGV4T2YoJy4nKTtcbiAgICAgICAgaWYgKGRvdCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGYgPSBzdHIuc3Vic3RyaW5nKGRvdCArIDEpLnJlcGxhY2UoL18vZywgJycpO1xuICAgICAgICAgICAgaWYgKGZbZi5sZW5ndGggLSAxXSA9PT0gJzAnKVxuICAgICAgICAgICAgICAgIG5vZGUubWluRnJhY3Rpb25EaWdpdHMgPSBmLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9LFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuXG5jb25zdCBpbnRJZGVudGlmeSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbmZ1bmN0aW9uIGludFJlc29sdmUoc3RyLCBvZmZzZXQsIHJhZGl4LCB7IGludEFzQmlnSW50IH0pIHtcbiAgICBjb25zdCBzaWduID0gc3RyWzBdO1xuICAgIGlmIChzaWduID09PSAnLScgfHwgc2lnbiA9PT0gJysnKVxuICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKG9mZnNldCkucmVwbGFjZSgvXy9nLCAnJyk7XG4gICAgaWYgKGludEFzQmlnSW50KSB7XG4gICAgICAgIHN3aXRjaCAocmFkaXgpIHtcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBzdHIgPSBgMGIke3N0cn1gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgIHN0ciA9IGAwbyR7c3RyfWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgIHN0ciA9IGAweCR7c3RyfWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbiA9IEJpZ0ludChzdHIpO1xuICAgICAgICByZXR1cm4gc2lnbiA9PT0gJy0nID8gQmlnSW50KC0xKSAqIG4gOiBuO1xuICAgIH1cbiAgICBjb25zdCBuID0gcGFyc2VJbnQoc3RyLCByYWRpeCk7XG4gICAgcmV0dXJuIHNpZ24gPT09ICctJyA/IC0xICogbiA6IG47XG59XG5mdW5jdGlvbiBpbnRTdHJpbmdpZnkobm9kZSwgcmFkaXgsIHByZWZpeCkge1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IG5vZGU7XG4gICAgaWYgKGludElkZW50aWZ5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBzdHIgPSB2YWx1ZS50b1N0cmluZyhyYWRpeCk7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8IDAgPyAnLScgKyBwcmVmaXggKyBzdHIuc3Vic3RyKDEpIDogcHJlZml4ICsgc3RyO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xufVxuY29uc3QgaW50QmluID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnQklOJyxcbiAgICB0ZXN0OiAvXlstK10/MGJbMC0xX10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDIsIDIsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCAyLCAnMGInKVxufTtcbmNvbnN0IGludE9jdCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ09DVCcsXG4gICAgdGVzdDogL15bLStdPzBbMC03X10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDEsIDgsIG9wdCksXG4gICAgc3RyaW5naWZ5OiBub2RlID0+IGludFN0cmluZ2lmeShub2RlLCA4LCAnMCcpXG59O1xuY29uc3QgaW50ID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgdGVzdDogL15bLStdP1swLTldWzAtOV9dKiQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAwLCAxMCwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGludEhleCA9IHtcbiAgICBpZGVudGlmeTogaW50SWRlbnRpZnksXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ0hFWCcsXG4gICAgdGVzdDogL15bLStdPzB4WzAtOWEtZkEtRl9dKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAyLCAxNiwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDE2LCAnMHgnKVxufTtcblxuY2xhc3MgWUFNTFNldCBleHRlbmRzIFlBTUxNYXAge1xuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSkge1xuICAgICAgICBzdXBlcihzY2hlbWEpO1xuICAgICAgICB0aGlzLnRhZyA9IFlBTUxTZXQudGFnO1xuICAgIH1cbiAgICBhZGQoa2V5KSB7XG4gICAgICAgIGxldCBwYWlyO1xuICAgICAgICBpZiAoaXNQYWlyKGtleSkpXG4gICAgICAgICAgICBwYWlyID0ga2V5O1xuICAgICAgICBlbHNlIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgJ2tleScgaW4ga2V5ICYmXG4gICAgICAgICAgICAndmFsdWUnIGluIGtleSAmJlxuICAgICAgICAgICAga2V5LnZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgcGFpciA9IG5ldyBQYWlyKGtleS5rZXksIG51bGwpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwYWlyID0gbmV3IFBhaXIoa2V5LCBudWxsKTtcbiAgICAgICAgY29uc3QgcHJldiA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIHBhaXIua2V5KTtcbiAgICAgICAgaWYgKCFwcmV2KVxuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHBhaXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBga2VlcFBhaXJgIGlzIGB0cnVlYCwgcmV0dXJucyB0aGUgUGFpciBtYXRjaGluZyBga2V5YC5cbiAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoYXQgUGFpcidzIGtleS5cbiAgICAgKi9cbiAgICBnZXQoa2V5LCBrZWVwUGFpcikge1xuICAgICAgICBjb25zdCBwYWlyID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgcmV0dXJuICFrZWVwUGFpciAmJiBpc1BhaXIocGFpcilcbiAgICAgICAgICAgID8gaXNTY2FsYXIkMShwYWlyLmtleSlcbiAgICAgICAgICAgICAgICA/IHBhaXIua2V5LnZhbHVlXG4gICAgICAgICAgICAgICAgOiBwYWlyLmtleVxuICAgICAgICAgICAgOiBwYWlyO1xuICAgIH1cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGJvb2xlYW4gdmFsdWUgZm9yIHNldChrZXksIHZhbHVlKSBpbiBhIFlBTUwgc2V0LCBub3QgJHt0eXBlb2YgdmFsdWV9YCk7XG4gICAgICAgIGNvbnN0IHByZXYgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgICAgICBpZiAocHJldiAmJiAhdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKHRoaXMuaXRlbXMuaW5kZXhPZihwcmV2KSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXByZXYgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChuZXcgUGFpcihrZXkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIHJldHVybiBzdXBlci50b0pTT04oXywgY3R4LCBTZXQpO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmhhc0FsbE51bGxWYWx1ZXModHJ1ZSkpXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoT2JqZWN0LmFzc2lnbih7fSwgY3R4LCB7IGFsbE51bGxWYWx1ZXM6IHRydWUgfSksIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldCBpdGVtcyBtdXN0IGFsbCBoYXZlIG51bGwgdmFsdWVzJyk7XG4gICAgfVxufVxuWUFNTFNldC50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6c2V0JztcbmNvbnN0IHNldCA9IHtcbiAgICBjb2xsZWN0aW9uOiAnbWFwJyxcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgaW5zdGFuY2VvZiBTZXQsXG4gICAgbm9kZUNsYXNzOiBZQU1MU2V0LFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnNldCcsXG4gICAgcmVzb2x2ZShtYXAsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKGlzTWFwKG1hcCkpIHtcbiAgICAgICAgICAgIGlmIChtYXAuaGFzQWxsTnVsbFZhbHVlcyh0cnVlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgWUFNTFNldCgpLCBtYXApO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG9uRXJyb3IoJ1NldCBpdGVtcyBtdXN0IGFsbCBoYXZlIG51bGwgdmFsdWVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgb25FcnJvcignRXhwZWN0ZWQgYSBtYXBwaW5nIGZvciB0aGlzIHRhZycpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0sXG4gICAgY3JlYXRlTm9kZShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpIHtcbiAgICAgICAgY29uc3QgeyByZXBsYWNlciB9ID0gY3R4O1xuICAgICAgICBjb25zdCBzZXQgPSBuZXcgWUFNTFNldChzY2hlbWEpO1xuICAgICAgICBpZiAoaXRlcmFibGUgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyYWJsZSkpXG4gICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVwbGFjZXIuY2FsbChpdGVyYWJsZSwgdmFsdWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBzZXQuaXRlbXMucHVzaChjcmVhdGVQYWlyKHZhbHVlLCBudWxsLCBjdHgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG59O1xuXG4vKiogSW50ZXJuYWwgdHlwZXMgaGFuZGxlIGJpZ2ludCBhcyBudW1iZXIsIGJlY2F1c2UgVFMgY2FuJ3QgZmlndXJlIGl0IG91dC4gKi9cbmZ1bmN0aW9uIHBhcnNlU2V4YWdlc2ltYWwoc3RyLCBhc0JpZ0ludCkge1xuICAgIGNvbnN0IHNpZ24gPSBzdHJbMF07XG4gICAgY29uc3QgcGFydHMgPSBzaWduID09PSAnLScgfHwgc2lnbiA9PT0gJysnID8gc3RyLnN1YnN0cmluZygxKSA6IHN0cjtcbiAgICBjb25zdCBudW0gPSAobikgPT4gYXNCaWdJbnQgPyBCaWdJbnQobikgOiBOdW1iZXIobik7XG4gICAgY29uc3QgcmVzID0gcGFydHNcbiAgICAgICAgLnJlcGxhY2UoL18vZywgJycpXG4gICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgIC5yZWR1Y2UoKHJlcywgcCkgPT4gcmVzICogbnVtKDYwKSArIG51bShwKSwgbnVtKDApKTtcbiAgICByZXR1cm4gKHNpZ24gPT09ICctJyA/IG51bSgtMSkgKiByZXMgOiByZXMpO1xufVxuLyoqXG4gKiBoaGhoOm1tOnNzLnNzc1xuICpcbiAqIEludGVybmFsIHR5cGVzIGhhbmRsZSBiaWdpbnQgYXMgbnVtYmVyLCBiZWNhdXNlIFRTIGNhbid0IGZpZ3VyZSBpdCBvdXQuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeVNleGFnZXNpbWFsKG5vZGUpIHtcbiAgICBsZXQgeyB2YWx1ZSB9ID0gbm9kZTtcbiAgICBsZXQgbnVtID0gKG4pID0+IG47XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpXG4gICAgICAgIG51bSA9IG4gPT4gQmlnSW50KG4pO1xuICAgIGVsc2UgaWYgKGlzTmFOKHZhbHVlKSB8fCAhaXNGaW5pdGUodmFsdWUpKVxuICAgICAgICByZXR1cm4gc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xuICAgIGxldCBzaWduID0gJyc7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICBzaWduID0gJy0nO1xuICAgICAgICB2YWx1ZSAqPSBudW0oLTEpO1xuICAgIH1cbiAgICBjb25zdCBfNjAgPSBudW0oNjApO1xuICAgIGNvbnN0IHBhcnRzID0gW3ZhbHVlICUgXzYwXTsgLy8gc2Vjb25kcywgaW5jbHVkaW5nIG1zXG4gICAgaWYgKHZhbHVlIDwgNjApIHtcbiAgICAgICAgcGFydHMudW5zaGlmdCgwKTsgLy8gYXQgbGVhc3Qgb25lIDogaXMgcmVxdWlyZWRcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhbHVlID0gKHZhbHVlIC0gcGFydHNbMF0pIC8gXzYwO1xuICAgICAgICBwYXJ0cy51bnNoaWZ0KHZhbHVlICUgXzYwKTsgLy8gbWludXRlc1xuICAgICAgICBpZiAodmFsdWUgPj0gNjApIHtcbiAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlIC0gcGFydHNbMF0pIC8gXzYwO1xuICAgICAgICAgICAgcGFydHMudW5zaGlmdCh2YWx1ZSk7IC8vIGhvdXJzXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChzaWduICtcbiAgICAgICAgcGFydHNcbiAgICAgICAgICAgIC5tYXAobiA9PiAobiA8IDEwID8gJzAnICsgU3RyaW5nKG4pIDogU3RyaW5nKG4pKSlcbiAgICAgICAgICAgIC5qb2luKCc6JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8wMDAwMDBcXGQqJC8sICcnKSAvLyAlIDYwIG1heSBpbnRyb2R1Y2UgZXJyb3JcbiAgICApO1xufVxuY29uc3QgaW50VGltZSA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnVElNRScsXG4gICAgdGVzdDogL15bLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIHsgaW50QXNCaWdJbnQgfSkgPT4gcGFyc2VTZXhhZ2VzaW1hbChzdHIsIGludEFzQmlnSW50KSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeVNleGFnZXNpbWFsXG59O1xuY29uc3QgZmxvYXRUaW1lID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIGZvcm1hdDogJ1RJTUUnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pK1xcLlswLTlfXSokLyxcbiAgICByZXNvbHZlOiBzdHIgPT4gcGFyc2VTZXhhZ2VzaW1hbChzdHIsIGZhbHNlKSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeVNleGFnZXNpbWFsXG59O1xuY29uc3QgdGltZXN0YW1wID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLFxuICAgIC8vIElmIHRoZSB0aW1lIHpvbmUgaXMgb21pdHRlZCwgdGhlIHRpbWVzdGFtcCBpcyBhc3N1bWVkIHRvIGJlIHNwZWNpZmllZCBpbiBVVEMuIFRoZSB0aW1lIHBhcnRcbiAgICAvLyBtYXkgYmUgb21pdHRlZCBhbHRvZ2V0aGVyLCByZXN1bHRpbmcgaW4gYSBkYXRlIGZvcm1hdC4gSW4gc3VjaCBhIGNhc2UsIHRoZSB0aW1lIHBhcnQgaXNcbiAgICAvLyBhc3N1bWVkIHRvIGJlIDAwOjAwOjAwWiAoc3RhcnQgb2YgZGF5LCBVVEMpLlxuICAgIHRlc3Q6IFJlZ0V4cCgnXihbMC05XXs0fSktKFswLTldezEsMn0pLShbMC05XXsxLDJ9KScgKyAvLyBZWVlZLU1tLURkXG4gICAgICAgICcoPzonICsgLy8gdGltZSBpcyBvcHRpb25hbFxuICAgICAgICAnKD86dHxUfFsgXFxcXHRdKyknICsgLy8gdCB8IFQgfCB3aGl0ZXNwYWNlXG4gICAgICAgICcoWzAtOV17MSwyfSk6KFswLTldezEsMn0pOihbMC05XXsxLDJ9KFxcXFwuWzAtOV0rKT8pJyArIC8vIEhoOk1tOlNzKC5zcyk/XG4gICAgICAgICcoPzpbIFxcXFx0XSooWnxbLStdWzAxMl0/WzAtOV0oPzo6WzAtOV17Mn0pPykpPycgKyAvLyBaIHwgKzUgfCAtMDM6MzBcbiAgICAgICAgJyk/JCcpLFxuICAgIHJlc29sdmUoc3RyKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc3RyLm1hdGNoKHRpbWVzdGFtcC50ZXN0KTtcbiAgICAgICAgaWYgKCFtYXRjaClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignISF0aW1lc3RhbXAgZXhwZWN0cyBhIGRhdGUsIHN0YXJ0aW5nIHdpdGggeXl5eS1tbS1kZCcpO1xuICAgICAgICBjb25zdCBbLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZF0gPSBtYXRjaC5tYXAoTnVtYmVyKTtcbiAgICAgICAgY29uc3QgbWlsbGlzZWMgPSBtYXRjaFs3XSA/IE51bWJlcigobWF0Y2hbN10gKyAnMDAnKS5zdWJzdHIoMSwgMykpIDogMDtcbiAgICAgICAgbGV0IGRhdGUgPSBEYXRlLlVUQyh5ZWFyLCBtb250aCAtIDEsIGRheSwgaG91ciB8fCAwLCBtaW51dGUgfHwgMCwgc2Vjb25kIHx8IDAsIG1pbGxpc2VjKTtcbiAgICAgICAgY29uc3QgdHogPSBtYXRjaFs4XTtcbiAgICAgICAgaWYgKHR6ICYmIHR6ICE9PSAnWicpIHtcbiAgICAgICAgICAgIGxldCBkID0gcGFyc2VTZXhhZ2VzaW1hbCh0eiwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGQpIDwgMzApXG4gICAgICAgICAgICAgICAgZCAqPSA2MDtcbiAgICAgICAgICAgIGRhdGUgLT0gNjAwMDAgKiBkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcbiAgICB9LFxuICAgIHN0cmluZ2lmeTogKHsgdmFsdWUgfSkgPT4gdmFsdWUudG9JU09TdHJpbmcoKS5yZXBsYWNlKC8oKFQwMDowMCk/OjAwKT9cXC4wMDBaJC8sICcnKVxufTtcblxuY29uc3Qgc2NoZW1hID0gW1xuICAgIG1hcCxcbiAgICBzZXEsXG4gICAgc3RyaW5nLFxuICAgIG51bGxUYWcsXG4gICAgdHJ1ZVRhZyxcbiAgICBmYWxzZVRhZyxcbiAgICBpbnRCaW4sXG4gICAgaW50T2N0LFxuICAgIGludCxcbiAgICBpbnRIZXgsXG4gICAgZmxvYXROYU4sXG4gICAgZmxvYXRFeHAsXG4gICAgZmxvYXQsXG4gICAgYmluYXJ5LFxuICAgIG9tYXAsXG4gICAgcGFpcnMsXG4gICAgc2V0LFxuICAgIGludFRpbWUsXG4gICAgZmxvYXRUaW1lLFxuICAgIHRpbWVzdGFtcFxuXTtcblxuY29uc3Qgc2NoZW1hcyA9IG5ldyBNYXAoW1xuICAgIFsnY29yZScsIHNjaGVtYSQyXSxcbiAgICBbJ2ZhaWxzYWZlJywgW21hcCwgc2VxLCBzdHJpbmddXSxcbiAgICBbJ2pzb24nLCBzY2hlbWEkMV0sXG4gICAgWyd5YW1sMTEnLCBzY2hlbWFdLFxuICAgIFsneWFtbC0xLjEnLCBzY2hlbWFdXG5dKTtcbmNvbnN0IHRhZ3NCeU5hbWUgPSB7XG4gICAgYmluYXJ5LFxuICAgIGJvb2w6IGJvb2xUYWcsXG4gICAgZmxvYXQ6IGZsb2F0JDEsXG4gICAgZmxvYXRFeHA6IGZsb2F0RXhwJDEsXG4gICAgZmxvYXROYU46IGZsb2F0TmFOJDEsXG4gICAgZmxvYXRUaW1lLFxuICAgIGludDogaW50JDEsXG4gICAgaW50SGV4OiBpbnRIZXgkMSxcbiAgICBpbnRPY3Q6IGludE9jdCQxLFxuICAgIGludFRpbWUsXG4gICAgbWFwLFxuICAgIG51bGw6IG51bGxUYWcsXG4gICAgb21hcCxcbiAgICBwYWlycyxcbiAgICBzZXEsXG4gICAgc2V0LFxuICAgIHRpbWVzdGFtcFxufTtcbmNvbnN0IGNvcmVLbm93blRhZ3MgPSB7XG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOmJpbmFyeSc6IGJpbmFyeSxcbiAgICAndGFnOnlhbWwub3JnLDIwMDI6b21hcCc6IG9tYXAsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJzogcGFpcnMsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOnNldCc6IHNldCxcbiAgICAndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJzogdGltZXN0YW1wXG59O1xuZnVuY3Rpb24gZ2V0VGFncyhjdXN0b21UYWdzLCBzY2hlbWFOYW1lKSB7XG4gICAgbGV0IHRhZ3MgPSBzY2hlbWFzLmdldChzY2hlbWFOYW1lKTtcbiAgICBpZiAoIXRhZ3MpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VzdG9tVGFncykpXG4gICAgICAgICAgICB0YWdzID0gW107XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20oc2NoZW1hcy5rZXlzKCkpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihrZXkgPT4ga2V5ICE9PSAneWFtbDExJylcbiAgICAgICAgICAgICAgICAubWFwKGtleSA9PiBKU09OLnN0cmluZ2lmeShrZXkpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHNjaGVtYSBcIiR7c2NoZW1hTmFtZX1cIjsgdXNlIG9uZSBvZiAke2tleXN9IG9yIGRlZmluZSBjdXN0b21UYWdzIGFycmF5YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3VzdG9tVGFncykpIHtcbiAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgY3VzdG9tVGFncylcbiAgICAgICAgICAgIHRhZ3MgPSB0YWdzLmNvbmNhdCh0YWcpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgY3VzdG9tVGFncyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0YWdzID0gY3VzdG9tVGFncyh0YWdzLnNsaWNlKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGFncy5tYXAodGFnID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YWcgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgY29uc3QgdGFnT2JqID0gdGFnc0J5TmFtZVt0YWddO1xuICAgICAgICBpZiAodGFnT2JqKVxuICAgICAgICAgICAgcmV0dXJuIHRhZ09iajtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRhZ3NCeU5hbWUpXG4gICAgICAgICAgICAubWFwKGtleSA9PiBKU09OLnN0cmluZ2lmeShrZXkpKVxuICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjdXN0b20gdGFnIFwiJHt0YWd9XCI7IHVzZSBvbmUgb2YgJHtrZXlzfWApO1xuICAgIH0pO1xufVxuXG5jb25zdCBzb3J0TWFwRW50cmllc0J5S2V5ID0gKGEsIGIpID0+IGEua2V5IDwgYi5rZXkgPyAtMSA6IGEua2V5ID4gYi5rZXkgPyAxIDogMDtcbmNsYXNzIFNjaGVtYSB7XG4gICAgY29uc3RydWN0b3IoeyBjb21wYXQsIGN1c3RvbVRhZ3MsIG1lcmdlLCByZXNvbHZlS25vd25UYWdzLCBzY2hlbWEsIHNvcnRNYXBFbnRyaWVzLCB0b1N0cmluZ0RlZmF1bHRzIH0pIHtcbiAgICAgICAgdGhpcy5jb21wYXQgPSBBcnJheS5pc0FycmF5KGNvbXBhdClcbiAgICAgICAgICAgID8gZ2V0VGFncyhjb21wYXQsICdjb21wYXQnKVxuICAgICAgICAgICAgOiBjb21wYXRcbiAgICAgICAgICAgICAgICA/IGdldFRhZ3MobnVsbCwgY29tcGF0KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgdGhpcy5tZXJnZSA9ICEhbWVyZ2U7XG4gICAgICAgIHRoaXMubmFtZSA9ICh0eXBlb2Ygc2NoZW1hID09PSAnc3RyaW5nJyAmJiBzY2hlbWEpIHx8ICdjb3JlJztcbiAgICAgICAgdGhpcy5rbm93blRhZ3MgPSByZXNvbHZlS25vd25UYWdzID8gY29yZUtub3duVGFncyA6IHt9O1xuICAgICAgICB0aGlzLnRhZ3MgPSBnZXRUYWdzKGN1c3RvbVRhZ3MsIHRoaXMubmFtZSk7XG4gICAgICAgIHRoaXMudG9TdHJpbmdPcHRpb25zID0gdG9TdHJpbmdEZWZhdWx0cyA/PyBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTUFQLCB7IHZhbHVlOiBtYXAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTQ0FMQVIkMSwgeyB2YWx1ZTogc3RyaW5nIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU0VRLCB7IHZhbHVlOiBzZXEgfSk7XG4gICAgICAgIC8vIFVzZWQgYnkgY3JlYXRlTWFwKClcbiAgICAgICAgdGhpcy5zb3J0TWFwRW50cmllcyA9XG4gICAgICAgICAgICB0eXBlb2Ygc29ydE1hcEVudHJpZXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICA/IHNvcnRNYXBFbnRyaWVzXG4gICAgICAgICAgICAgICAgOiBzb3J0TWFwRW50cmllcyA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA/IHNvcnRNYXBFbnRyaWVzQnlLZXlcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY29weSA9IE9iamVjdC5jcmVhdGUoU2NoZW1hLnByb3RvdHlwZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModGhpcykpO1xuICAgICAgICBjb3B5LnRhZ3MgPSB0aGlzLnRhZ3Muc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlEb2N1bWVudChkb2MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGxldCBoYXNEaXJlY3RpdmVzID0gb3B0aW9ucy5kaXJlY3RpdmVzID09PSB0cnVlO1xuICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZXMgIT09IGZhbHNlICYmIGRvYy5kaXJlY3RpdmVzKSB7XG4gICAgICAgIGNvbnN0IGRpciA9IGRvYy5kaXJlY3RpdmVzLnRvU3RyaW5nKGRvYyk7XG4gICAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goZGlyKTtcbiAgICAgICAgICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvYy5kaXJlY3RpdmVzLmRvY1N0YXJ0KVxuICAgICAgICAgICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChoYXNEaXJlY3RpdmVzKVxuICAgICAgICBsaW5lcy5wdXNoKCctLS0nKTtcbiAgICBjb25zdCBjdHggPSBjcmVhdGVTdHJpbmdpZnlDb250ZXh0KGRvYywgb3B0aW9ucyk7XG4gICAgY29uc3QgeyBjb21tZW50U3RyaW5nIH0gPSBjdHgub3B0aW9ucztcbiAgICBpZiAoZG9jLmNvbW1lbnRCZWZvcmUpIHtcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgIGxpbmVzLnVuc2hpZnQoJycpO1xuICAgICAgICBjb25zdCBjcyA9IGNvbW1lbnRTdHJpbmcoZG9jLmNvbW1lbnRCZWZvcmUpO1xuICAgICAgICBsaW5lcy51bnNoaWZ0KGluZGVudENvbW1lbnQoY3MsICcnKSk7XG4gICAgfVxuICAgIGxldCBjaG9tcEtlZXAgPSBmYWxzZTtcbiAgICBsZXQgY29udGVudENvbW1lbnQgPSBudWxsO1xuICAgIGlmIChkb2MuY29udGVudHMpIHtcbiAgICAgICAgaWYgKGlzTm9kZSQxKGRvYy5jb250ZW50cykpIHtcbiAgICAgICAgICAgIGlmIChkb2MuY29udGVudHMuc3BhY2VCZWZvcmUgJiYgaGFzRGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGlmIChkb2MuY29udGVudHMuY29tbWVudEJlZm9yZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzID0gY29tbWVudFN0cmluZyhkb2MuY29udGVudHMuY29tbWVudEJlZm9yZSk7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChpbmRlbnRDb21tZW50KGNzLCAnJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdG9wLWxldmVsIGJsb2NrIHNjYWxhcnMgbmVlZCB0byBiZSBpbmRlbnRlZCBpZiBmb2xsb3dlZCBieSBhIGNvbW1lbnRcbiAgICAgICAgICAgIGN0eC5mb3JjZUJsb2NrSW5kZW50ID0gISFkb2MuY29tbWVudDtcbiAgICAgICAgICAgIGNvbnRlbnRDb21tZW50ID0gZG9jLmNvbnRlbnRzLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb25DaG9tcEtlZXAgPSBjb250ZW50Q29tbWVudCA/IHVuZGVmaW5lZCA6ICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKTtcbiAgICAgICAgbGV0IGJvZHkgPSBzdHJpbmdpZnkkMihkb2MuY29udGVudHMsIGN0eCwgKCkgPT4gKGNvbnRlbnRDb21tZW50ID0gbnVsbCksIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgaWYgKGNvbnRlbnRDb21tZW50KVxuICAgICAgICAgICAgYm9keSArPSBsaW5lQ29tbWVudChib2R5LCAnJywgY29tbWVudFN0cmluZyhjb250ZW50Q29tbWVudCkpO1xuICAgICAgICBpZiAoKGJvZHlbMF0gPT09ICd8JyB8fCBib2R5WzBdID09PSAnPicpICYmXG4gICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9PT0gJy0tLScpIHtcbiAgICAgICAgICAgIC8vIFRvcC1sZXZlbCBibG9jayBzY2FsYXJzIHdpdGggYSBwcmVjZWRpbmcgZG9jIG1hcmtlciBvdWdodCB0byB1c2UgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGxpbmUgZm9yIHRoZWlyIGhlYWRlci5cbiAgICAgICAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID0gYC0tLSAke2JvZHl9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsaW5lcy5wdXNoKGJvZHkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChzdHJpbmdpZnkkMihkb2MuY29udGVudHMsIGN0eCkpO1xuICAgIH1cbiAgICBpZiAoZG9jLmRpcmVjdGl2ZXM/LmRvY0VuZCkge1xuICAgICAgICBpZiAoZG9jLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gY29tbWVudFN0cmluZyhkb2MuY29tbWVudCk7XG4gICAgICAgICAgICBpZiAoY3MuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaCgnLi4uJyk7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChpbmRlbnRDb21tZW50KGNzLCAnJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChgLi4uICR7Y3N9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKCcuLi4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGRjID0gZG9jLmNvbW1lbnQ7XG4gICAgICAgIGlmIChkYyAmJiBjaG9tcEtlZXApXG4gICAgICAgICAgICBkYyA9IGRjLnJlcGxhY2UoL15cXG4rLywgJycpO1xuICAgICAgICBpZiAoZGMpIHtcbiAgICAgICAgICAgIGlmICgoIWNob21wS2VlcCB8fCBjb250ZW50Q29tbWVudCkgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gIT09ICcnKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgbGluZXMucHVzaChpbmRlbnRDb21tZW50KGNvbW1lbnRTdHJpbmcoZGMpLCAnJykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgdGhlIEpTT04ucGFyc2UgcmV2aXZlciBhbGdvcml0aG0gYXMgZGVmaW5lZCBpbiB0aGUgRUNNQS0yNjIgc3BlYyxcbiAqIGluIHNlY3Rpb24gMjQuNS4xLjEgXCJSdW50aW1lIFNlbWFudGljczogSW50ZXJuYWxpemVKU09OUHJvcGVydHlcIiBvZiB0aGVcbiAqIDIwMjEgZWRpdGlvbjogaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1qc29uLnBhcnNlXG4gKlxuICogSW5jbHVkZXMgZXh0ZW5zaW9ucyBmb3IgaGFuZGxpbmcgTWFwIGFuZCBTZXQgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gYXBwbHlSZXZpdmVyKHJldml2ZXIsIG9iaiwga2V5LCB2YWwpIHtcbiAgICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB2YWwubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MCA9IHZhbFtpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIFN0cmluZyhpKSwgdjApO1xuICAgICAgICAgICAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsW2ldO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MClcbiAgICAgICAgICAgICAgICAgICAgdmFsW2ldID0gdjE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgQXJyYXkuZnJvbSh2YWwua2V5cygpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYwID0gdmFsLmdldChrKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIGssIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgdmFsLmRlbGV0ZShrKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2MSAhPT0gdjApXG4gICAgICAgICAgICAgICAgICAgIHZhbC5zZXQoaywgdjEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB2MCBvZiBBcnJheS5mcm9tKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIHYwLCB2MCk7XG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHZhbC5kZWxldGUodjApO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MCkge1xuICAgICAgICAgICAgICAgICAgICB2YWwuZGVsZXRlKHYwKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsLmFkZCh2MSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdjBdIG9mIE9iamVjdC5lbnRyaWVzKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIGssIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZhbFtrXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2MSAhPT0gdjApXG4gICAgICAgICAgICAgICAgICAgIHZhbFtrXSA9IHYxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXZpdmVyLmNhbGwob2JqLCBrZXksIHZhbCk7XG59XG5cbmNsYXNzIERvY3VtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyoqIEEgY29tbWVudCBiZWZvcmUgdGhpcyBEb2N1bWVudCAqL1xuICAgICAgICB0aGlzLmNvbW1lbnRCZWZvcmUgPSBudWxsO1xuICAgICAgICAvKiogQSBjb21tZW50IGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgRG9jdW1lbnQgKi9cbiAgICAgICAgdGhpcy5jb21tZW50ID0gbnVsbDtcbiAgICAgICAgLyoqIEVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgcGFyc2luZy4gKi9cbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgLyoqIFdhcm5pbmdzIGVuY291bnRlcmVkIGR1cmluZyBwYXJzaW5nLiAqL1xuICAgICAgICB0aGlzLndhcm5pbmdzID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBOT0RFX1RZUEUsIHsgdmFsdWU6IERPQyB9KTtcbiAgICAgICAgbGV0IF9yZXBsYWNlciA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShyZXBsYWNlcikpIHtcbiAgICAgICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXBsYWNlcikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgICAgICAgICAgcmVwbGFjZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0ID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBpbnRBc0JpZ0ludDogZmFsc2UsXG4gICAgICAgICAgICBrZWVwU291cmNlVG9rZW5zOiBmYWxzZSxcbiAgICAgICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgICAgICBwcmV0dHlFcnJvcnM6IHRydWUsXG4gICAgICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgICAgICB1bmlxdWVLZXlzOiB0cnVlLFxuICAgICAgICAgICAgdmVyc2lvbjogJzEuMidcbiAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdDtcbiAgICAgICAgbGV0IHsgdmVyc2lvbiB9ID0gb3B0O1xuICAgICAgICBpZiAob3B0aW9ucz8uX2RpcmVjdGl2ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IG9wdGlvbnMuX2RpcmVjdGl2ZXMuYXREb2N1bWVudCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlcy55YW1sLmV4cGxpY2l0KVxuICAgICAgICAgICAgICAgIHZlcnNpb24gPSB0aGlzLmRpcmVjdGl2ZXMueWFtbC52ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IG5ldyBEaXJlY3RpdmVzKHsgdmVyc2lvbiB9KTtcbiAgICAgICAgdGhpcy5zZXRTY2hlbWEodmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IG51bGw7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IHRoaXMuY3JlYXRlTm9kZSh2YWx1ZSwgX3JlcGxhY2VyLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBkZWVwIGNvcHkgb2YgdGhpcyBEb2N1bWVudCBhbmQgaXRzIGNvbnRlbnRzLlxuICAgICAqXG4gICAgICogQ3VzdG9tIE5vZGUgdmFsdWVzIHRoYXQgaW5oZXJpdCBmcm9tIGBPYmplY3RgIHN0aWxsIHJlZmVyIHRvIHRoZWlyIG9yaWdpbmFsIGluc3RhbmNlcy5cbiAgICAgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY29weSA9IE9iamVjdC5jcmVhdGUoRG9jdW1lbnQucHJvdG90eXBlLCB7XG4gICAgICAgICAgICBbTk9ERV9UWVBFXTogeyB2YWx1ZTogRE9DIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvcHkuY29tbWVudEJlZm9yZSA9IHRoaXMuY29tbWVudEJlZm9yZTtcbiAgICAgICAgY29weS5jb21tZW50ID0gdGhpcy5jb21tZW50O1xuICAgICAgICBjb3B5LmVycm9ycyA9IHRoaXMuZXJyb3JzLnNsaWNlKCk7XG4gICAgICAgIGNvcHkud2FybmluZ3MgPSB0aGlzLndhcm5pbmdzLnNsaWNlKCk7XG4gICAgICAgIGNvcHkub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICBjb3B5LmRpcmVjdGl2ZXMgPSB0aGlzLmRpcmVjdGl2ZXMuY2xvbmUoKTtcbiAgICAgICAgY29weS5zY2hlbWEgPSB0aGlzLnNjaGVtYS5jbG9uZSgpO1xuICAgICAgICBjb3B5LmNvbnRlbnRzID0gaXNOb2RlJDEodGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5jbG9uZShjb3B5LnNjaGVtYSlcbiAgICAgICAgICAgIDogdGhpcy5jb250ZW50cztcbiAgICAgICAgaWYgKHRoaXMucmFuZ2UpXG4gICAgICAgICAgICBjb3B5LnJhbmdlID0gdGhpcy5yYW5nZS5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqIEFkZHMgYSB2YWx1ZSB0byB0aGUgZG9jdW1lbnQuICovXG4gICAgYWRkKHZhbHVlKSB7XG4gICAgICAgIGlmIChhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpKVxuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5hZGQodmFsdWUpO1xuICAgIH1cbiAgICAvKiogQWRkcyBhIHZhbHVlIHRvIHRoZSBkb2N1bWVudC4gKi9cbiAgICBhZGRJbihwYXRoLCB2YWx1ZSkge1xuICAgICAgICBpZiAoYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSlcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMuYWRkSW4ocGF0aCwgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgYEFsaWFzYCBub2RlLCBlbnN1cmluZyB0aGF0IHRoZSB0YXJnZXQgYG5vZGVgIGhhcyB0aGUgcmVxdWlyZWQgYW5jaG9yLlxuICAgICAqXG4gICAgICogSWYgYG5vZGVgIGFscmVhZHkgaGFzIGFuIGFuY2hvciwgYG5hbWVgIGlzIGlnbm9yZWQuXG4gICAgICogT3RoZXJ3aXNlLCB0aGUgYG5vZGUuYW5jaG9yYCB2YWx1ZSB3aWxsIGJlIHNldCB0byBgbmFtZWAsXG4gICAgICogb3IgaWYgYW4gYW5jaG9yIHdpdGggdGhhdCBuYW1lIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgZG9jdW1lbnQsXG4gICAgICogYG5hbWVgIHdpbGwgYmUgdXNlZCBhcyBhIHByZWZpeCBmb3IgYSBuZXcgdW5pcXVlIGFuY2hvci5cbiAgICAgKiBJZiBgbmFtZWAgaXMgdW5kZWZpbmVkLCB0aGUgZ2VuZXJhdGVkIGFuY2hvciB3aWxsIHVzZSAnYScgYXMgYSBwcmVmaXguXG4gICAgICovXG4gICAgY3JlYXRlQWxpYXMobm9kZSwgbmFtZSkge1xuICAgICAgICBpZiAoIW5vZGUuYW5jaG9yKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2ID0gYW5jaG9yTmFtZXModGhpcyk7XG4gICAgICAgICAgICBub2RlLmFuY2hvciA9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgICAgICAgICAgICAgIW5hbWUgfHwgcHJldi5oYXMobmFtZSkgPyBmaW5kTmV3QW5jaG9yKG5hbWUgfHwgJ2EnLCBwcmV2KSA6IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhcyhub2RlLmFuY2hvcik7XG4gICAgfVxuICAgIGNyZWF0ZU5vZGUodmFsdWUsIHJlcGxhY2VyLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBfcmVwbGFjZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhbHVlID0gcmVwbGFjZXIuY2FsbCh7ICcnOiB2YWx1ZSB9LCAnJywgdmFsdWUpO1xuICAgICAgICAgICAgX3JlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXBsYWNlcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleVRvU3RyID0gKHYpID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJyB8fCB2IGluc3RhbmNlb2YgU3RyaW5nIHx8IHYgaW5zdGFuY2VvZiBOdW1iZXI7XG4gICAgICAgICAgICBjb25zdCBhc1N0ciA9IHJlcGxhY2VyLmZpbHRlcihrZXlUb1N0cikubWFwKFN0cmluZyk7XG4gICAgICAgICAgICBpZiAoYXNTdHIubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXBsYWNlciA9IHJlcGxhY2VyLmNvbmNhdChhc1N0cik7XG4gICAgICAgICAgICBfcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmVwbGFjZXIpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSByZXBsYWNlcjtcbiAgICAgICAgICAgIHJlcGxhY2VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgYWxpYXNEdXBsaWNhdGVPYmplY3RzLCBhbmNob3JQcmVmaXgsIGZsb3csIGtlZXBVbmRlZmluZWQsIG9uVGFnT2JqLCB0YWcgfSA9IG9wdGlvbnMgPz8ge307XG4gICAgICAgIGNvbnN0IHsgb25BbmNob3IsIHNldEFuY2hvcnMsIHNvdXJjZU9iamVjdHMgfSA9IGNyZWF0ZU5vZGVBbmNob3JzKHRoaXMsIFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICAgICAgYW5jaG9yUHJlZml4IHx8ICdhJyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGFsaWFzRHVwbGljYXRlT2JqZWN0czogYWxpYXNEdXBsaWNhdGVPYmplY3RzID8/IHRydWUsXG4gICAgICAgICAgICBrZWVwVW5kZWZpbmVkOiBrZWVwVW5kZWZpbmVkID8/IGZhbHNlLFxuICAgICAgICAgICAgb25BbmNob3IsXG4gICAgICAgICAgICBvblRhZ09iaixcbiAgICAgICAgICAgIHJlcGxhY2VyOiBfcmVwbGFjZXIsXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxuICAgICAgICAgICAgc291cmNlT2JqZWN0c1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBub2RlID0gY3JlYXRlTm9kZSh2YWx1ZSwgdGFnLCBjdHgpO1xuICAgICAgICBpZiAoZmxvdyAmJiBpc0NvbGxlY3Rpb24kMShub2RlKSlcbiAgICAgICAgICAgIG5vZGUuZmxvdyA9IHRydWU7XG4gICAgICAgIHNldEFuY2hvcnMoKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBrZXkgYW5kIGEgdmFsdWUgaW50byBhIGBQYWlyYCB1c2luZyB0aGUgY3VycmVudCBzY2hlbWEsXG4gICAgICogcmVjdXJzaXZlbHkgd3JhcHBpbmcgYWxsIHZhbHVlcyBhcyBgU2NhbGFyYCBvciBgQ29sbGVjdGlvbmAgbm9kZXMuXG4gICAgICovXG4gICAgY3JlYXRlUGFpcihrZXksIHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgayA9IHRoaXMuY3JlYXRlTm9kZShrZXksIG51bGwsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy5jcmVhdGVOb2RlKHZhbHVlLCBudWxsLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWlyKGssIHYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIHJldHVybiBhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpID8gdGhpcy5jb250ZW50cy5kZWxldGUoa2V5KSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgdmFsdWUgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZWxldGVJbihwYXRoKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudHMgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpXG4gICAgICAgICAgICA/IHRoaXMuY29udGVudHMuZGVsZXRlSW4ocGF0aClcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBga2V5YCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLiBCeSBkZWZhdWx0IHVud3JhcHNcbiAgICAgKiBzY2FsYXIgdmFsdWVzIGZyb20gdGhlaXIgc3Vycm91bmRpbmcgbm9kZTsgdG8gZGlzYWJsZSBzZXQgYGtlZXBTY2FsYXJgIHRvXG4gICAgICogYHRydWVgIChjb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJldHVybmVkIGludGFjdCkuXG4gICAgICovXG4gICAgZ2V0KGtleSwga2VlcFNjYWxhcikge1xuICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uJDEodGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5nZXQoa2V5LCBrZWVwU2NhbGFyKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaXRlbSBhdCBgcGF0aGAsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4gQnkgZGVmYXVsdCB1bndyYXBzXG4gICAgICogc2NhbGFyIHZhbHVlcyBmcm9tIHRoZWlyIHN1cnJvdW5kaW5nIG5vZGU7IHRvIGRpc2FibGUgc2V0IGBrZWVwU2NhbGFyYCB0b1xuICAgICAqIGB0cnVlYCAoY29sbGVjdGlvbnMgYXJlIGFsd2F5cyByZXR1cm5lZCBpbnRhY3QpLlxuICAgICAqL1xuICAgIGdldEluKHBhdGgsIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKVxuICAgICAgICAgICAgcmV0dXJuICFrZWVwU2NhbGFyICYmIGlzU2NhbGFyJDEodGhpcy5jb250ZW50cylcbiAgICAgICAgICAgICAgICA/IHRoaXMuY29udGVudHMudmFsdWVcbiAgICAgICAgICAgICAgICA6IHRoaXMuY29udGVudHM7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24kMSh0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmdldEluKHBhdGgsIGtlZXBTY2FsYXIpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBkb2N1bWVudCBpbmNsdWRlcyBhIHZhbHVlIHdpdGggdGhlIGtleSBga2V5YC5cbiAgICAgKi9cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24kMSh0aGlzLmNvbnRlbnRzKSA/IHRoaXMuY29udGVudHMuaGFzKGtleSkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBkb2N1bWVudCBpbmNsdWRlcyBhIHZhbHVlIGF0IGBwYXRoYC5cbiAgICAgKi9cbiAgICBoYXNJbihwYXRoKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24kMSh0aGlzLmNvbnRlbnRzKSA/IHRoaXMuY29udGVudHMuaGFzSW4ocGF0aCkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgZG9jdW1lbnQuIEZvciBgISFzZXRgLCBgdmFsdWVgIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBib29sZWFuIHRvIGFkZC9yZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgc2V0LlxuICAgICAqL1xuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIFtrZXldLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgZG9jdW1lbnQuIEZvciBgISFzZXRgLCBgdmFsdWVgIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBib29sZWFuIHRvIGFkZC9yZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgc2V0LlxuICAgICAqL1xuICAgIHNldEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSlcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSB2YWx1ZTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzID0gY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCBBcnJheS5mcm9tKHBhdGgpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5zZXRJbihwYXRoLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBZQU1MIHZlcnNpb24gYW5kIHNjaGVtYSB1c2VkIGJ5IHRoZSBkb2N1bWVudC5cbiAgICAgKiBBIGBudWxsYCB2ZXJzaW9uIGRpc2FibGVzIHN1cHBvcnQgZm9yIGRpcmVjdGl2ZXMsIGV4cGxpY2l0IHRhZ3MsIGFuY2hvcnMsIGFuZCBhbGlhc2VzLlxuICAgICAqIEl0IGFsc28gcmVxdWlyZXMgdGhlIGBzY2hlbWFgIG9wdGlvbiB0byBiZSBnaXZlbiBhcyBhIGBTY2hlbWFgIGluc3RhbmNlIHZhbHVlLlxuICAgICAqXG4gICAgICogT3ZlcnJpZGVzIGFsbCBwcmV2aW91c2x5IHNldCBzY2hlbWEgb3B0aW9ucy5cbiAgICAgKi9cbiAgICBzZXRTY2hlbWEodmVyc2lvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICB2ZXJzaW9uID0gU3RyaW5nKHZlcnNpb24pO1xuICAgICAgICBsZXQgb3B0O1xuICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJzEuMSc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLnlhbWwudmVyc2lvbiA9ICcxLjEnO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gbmV3IERpcmVjdGl2ZXMoeyB2ZXJzaW9uOiAnMS4xJyB9KTtcbiAgICAgICAgICAgICAgICBvcHQgPSB7IG1lcmdlOiB0cnVlLCByZXNvbHZlS25vd25UYWdzOiBmYWxzZSwgc2NoZW1hOiAneWFtbC0xLjEnIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxLjInOlxuICAgICAgICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLnlhbWwudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb24gfSk7XG4gICAgICAgICAgICAgICAgb3B0ID0geyBtZXJnZTogZmFsc2UsIHJlc29sdmVLbm93blRhZ3M6IHRydWUsIHNjaGVtYTogJ2NvcmUnIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIG51bGw6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZGlyZWN0aXZlcztcbiAgICAgICAgICAgICAgICBvcHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN2ID0gSlNPTi5zdHJpbmdpZnkodmVyc2lvbik7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAnMS4xJywgJzEuMicgb3IgbnVsbCBhcyBmaXJzdCBhcmd1bWVudCwgYnV0IGZvdW5kOiAke3N2fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vdCB1c2luZyBgaW5zdGFuY2VvZiBTY2hlbWFgIHRvIGFsbG93IGZvciBkdWNrIHR5cGluZ1xuICAgICAgICBpZiAob3B0aW9ucy5zY2hlbWEgaW5zdGFuY2VvZiBPYmplY3QpXG4gICAgICAgICAgICB0aGlzLnNjaGVtYSA9IG9wdGlvbnMuc2NoZW1hO1xuICAgICAgICBlbHNlIGlmIChvcHQpXG4gICAgICAgICAgICB0aGlzLnNjaGVtYSA9IG5ldyBTY2hlbWEoT2JqZWN0LmFzc2lnbihvcHQsIG9wdGlvbnMpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBXaXRoIGEgbnVsbCBZQU1MIHZlcnNpb24sIHRoZSB7IHNjaGVtYTogU2NoZW1hIH0gb3B0aW9uIGlzIHJlcXVpcmVkYCk7XG4gICAgfVxuICAgIC8vIGpzb24gJiBqc29uQXJnIGFyZSBvbmx5IHVzZWQgZnJvbSB0b0pTT04oKVxuICAgIHRvSlMoeyBqc29uLCBqc29uQXJnLCBtYXBBc01hcCwgbWF4QWxpYXNDb3VudCwgb25BbmNob3IsIHJldml2ZXIgfSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGFuY2hvcnM6IG5ldyBNYXAoKSxcbiAgICAgICAgICAgIGRvYzogdGhpcyxcbiAgICAgICAgICAgIGtlZXA6ICFqc29uLFxuICAgICAgICAgICAgbWFwQXNNYXA6IG1hcEFzTWFwID09PSB0cnVlLFxuICAgICAgICAgICAgbWFwS2V5V2FybmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG1heEFsaWFzQ291bnQ6IHR5cGVvZiBtYXhBbGlhc0NvdW50ID09PSAnbnVtYmVyJyA/IG1heEFsaWFzQ291bnQgOiAxMDAsXG4gICAgICAgICAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeSQyXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHRvSlModGhpcy5jb250ZW50cywganNvbkFyZyA/PyAnJywgY3R4KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkFuY2hvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBjb3VudCwgcmVzIH0gb2YgY3R4LmFuY2hvcnMudmFsdWVzKCkpXG4gICAgICAgICAgICAgICAgb25BbmNob3IocmVzLCBjb3VudCk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcmV2aXZlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhcHBseVJldml2ZXIocmV2aXZlciwgeyAnJzogcmVzIH0sICcnLCByZXMpXG4gICAgICAgICAgICA6IHJlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkb2N1bWVudCBgY29udGVudHNgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGpzb25BcmcgVXNlZCBieSBgSlNPTi5zdHJpbmdpZnlgIHRvIGluZGljYXRlIHRoZSBhcnJheSBpbmRleCBvclxuICAgICAqICAgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICB0b0pTT04oanNvbkFyZywgb25BbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9KUyh7IGpzb246IHRydWUsIGpzb25BcmcsIG1hcEFzTWFwOiBmYWxzZSwgb25BbmNob3IgfSk7XG4gICAgfVxuICAgIC8qKiBBIFlBTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRvY3VtZW50LiAqL1xuICAgIHRvU3RyaW5nKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5lcnJvcnMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRG9jdW1lbnQgd2l0aCBlcnJvcnMgY2Fubm90IGJlIHN0cmluZ2lmaWVkJyk7XG4gICAgICAgIGlmICgnaW5kZW50JyBpbiBvcHRpb25zICYmXG4gICAgICAgICAgICAoIU51bWJlci5pc0ludGVnZXIob3B0aW9ucy5pbmRlbnQpIHx8IE51bWJlcihvcHRpb25zLmluZGVudCkgPD0gMCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmluZGVudCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiaW5kZW50XCIgb3B0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBub3QgJHtzfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlEb2N1bWVudCh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhc3NlcnRDb2xsZWN0aW9uKGNvbnRlbnRzKSB7XG4gICAgaWYgKGlzQ29sbGVjdGlvbiQxKGNvbnRlbnRzKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBhIFlBTUwgY29sbGVjdGlvbiBhcyBkb2N1bWVudCBjb250ZW50cycpO1xufVxuXG5jbGFzcyBZQU1MRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgcG9zLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgIH1cbn1cbmNsYXNzIFlBTUxQYXJzZUVycm9yIGV4dGVuZHMgWUFNTEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3MsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoJ1lBTUxQYXJzZUVycm9yJywgcG9zLCBjb2RlLCBtZXNzYWdlKTtcbiAgICB9XG59XG5jbGFzcyBZQU1MV2FybmluZyBleHRlbmRzIFlBTUxFcnJvciB7XG4gICAgY29uc3RydWN0b3IocG9zLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCdZQU1MV2FybmluZycsIHBvcywgY29kZSwgbWVzc2FnZSk7XG4gICAgfVxufVxuY29uc3QgcHJldHRpZnlFcnJvciA9IChzcmMsIGxjKSA9PiAoZXJyb3IpID0+IHtcbiAgICBpZiAoZXJyb3IucG9zWzBdID09PSAtMSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGVycm9yLmxpbmVQb3MgPSBlcnJvci5wb3MubWFwKHBvcyA9PiBsYy5saW5lUG9zKHBvcykpO1xuICAgIGNvbnN0IHsgbGluZSwgY29sIH0gPSBlcnJvci5saW5lUG9zWzBdO1xuICAgIGVycm9yLm1lc3NhZ2UgKz0gYCBhdCBsaW5lICR7bGluZX0sIGNvbHVtbiAke2NvbH1gO1xuICAgIGxldCBjaSA9IGNvbCAtIDE7XG4gICAgbGV0IGxpbmVTdHIgPSBzcmNcbiAgICAgICAgLnN1YnN0cmluZyhsYy5saW5lU3RhcnRzW2xpbmUgLSAxXSwgbGMubGluZVN0YXJ0c1tsaW5lXSlcbiAgICAgICAgLnJlcGxhY2UoL1tcXG5cXHJdKyQvLCAnJyk7XG4gICAgLy8gVHJpbSB0byBtYXggODAgY2hhcnMsIGtlZXBpbmcgY29sIHBvc2l0aW9uIG5lYXIgdGhlIG1pZGRsZVxuICAgIGlmIChjaSA+PSA2MCAmJiBsaW5lU3RyLmxlbmd0aCA+IDgwKSB7XG4gICAgICAgIGNvbnN0IHRyaW1TdGFydCA9IE1hdGgubWluKGNpIC0gMzksIGxpbmVTdHIubGVuZ3RoIC0gNzkpO1xuICAgICAgICBsaW5lU3RyID0gJ1x1MjAyNicgKyBsaW5lU3RyLnN1YnN0cmluZyh0cmltU3RhcnQpO1xuICAgICAgICBjaSAtPSB0cmltU3RhcnQgLSAxO1xuICAgIH1cbiAgICBpZiAobGluZVN0ci5sZW5ndGggPiA4MClcbiAgICAgICAgbGluZVN0ciA9IGxpbmVTdHIuc3Vic3RyaW5nKDAsIDc5KSArICdcdTIwMjYnO1xuICAgIC8vIEluY2x1ZGUgcHJldmlvdXMgbGluZSBpbiBjb250ZXh0IGlmIHBvaW50aW5nIGF0IGxpbmUgc3RhcnRcbiAgICBpZiAobGluZSA+IDEgJiYgL14gKiQvLnRlc3QobGluZVN0ci5zdWJzdHJpbmcoMCwgY2kpKSkge1xuICAgICAgICAvLyBSZWdleHAgd29uJ3QgbWF0Y2ggaWYgc3RhcnQgaXMgdHJpbW1lZFxuICAgICAgICBsZXQgcHJldiA9IHNyYy5zdWJzdHJpbmcobGMubGluZVN0YXJ0c1tsaW5lIC0gMl0sIGxjLmxpbmVTdGFydHNbbGluZSAtIDFdKTtcbiAgICAgICAgaWYgKHByZXYubGVuZ3RoID4gODApXG4gICAgICAgICAgICBwcmV2ID0gcHJldi5zdWJzdHJpbmcoMCwgNzkpICsgJ1x1MjAyNlxcbic7XG4gICAgICAgIGxpbmVTdHIgPSBwcmV2ICsgbGluZVN0cjtcbiAgICB9XG4gICAgaWYgKC9bXiBdLy50ZXN0KGxpbmVTdHIpKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDE7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVycm9yLmxpbmVQb3NbMV07XG4gICAgICAgIGlmIChlbmQgJiYgZW5kLmxpbmUgPT09IGxpbmUgJiYgZW5kLmNvbCA+IGNvbCkge1xuICAgICAgICAgICAgY291bnQgPSBNYXRoLm1pbihlbmQuY29sIC0gY29sLCA4MCAtIGNpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2ludGVyID0gJyAnLnJlcGVhdChjaSkgKyAnXicucmVwZWF0KGNvdW50KTtcbiAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgOlxcblxcbiR7bGluZVN0cn1cXG4ke3BvaW50ZXJ9XFxuYDtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiByZXNvbHZlUHJvcHModG9rZW5zLCB7IGZsb3csIGluZGljYXRvciwgbmV4dCwgb2Zmc2V0LCBvbkVycm9yLCBzdGFydE9uTmV3bGluZSB9KSB7XG4gICAgbGV0IHNwYWNlQmVmb3JlID0gZmFsc2U7XG4gICAgbGV0IGF0TmV3bGluZSA9IHN0YXJ0T25OZXdsaW5lO1xuICAgIGxldCBoYXNTcGFjZSA9IHN0YXJ0T25OZXdsaW5lO1xuICAgIGxldCBjb21tZW50ID0gJyc7XG4gICAgbGV0IGNvbW1lbnRTZXAgPSAnJztcbiAgICBsZXQgaGFzTmV3bGluZSA9IGZhbHNlO1xuICAgIGxldCBoYXNOZXdsaW5lQWZ0ZXJQcm9wID0gZmFsc2U7XG4gICAgbGV0IHJlcVNwYWNlID0gZmFsc2U7XG4gICAgbGV0IGFuY2hvciA9IG51bGw7XG4gICAgbGV0IHRhZyA9IG51bGw7XG4gICAgbGV0IGNvbW1hID0gbnVsbDtcbiAgICBsZXQgZm91bmQgPSBudWxsO1xuICAgIGxldCBzdGFydCA9IG51bGw7XG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgaWYgKHJlcVNwYWNlKSB7XG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3NwYWNlJyAmJlxuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgIT09ICduZXdsaW5lJyAmJlxuICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgIT09ICdjb21tYScpXG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbi5vZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnVGFncyBhbmQgYW5jaG9ycyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBuZXh0IHRva2VuIGJ5IHdoaXRlIHNwYWNlJyk7XG4gICAgICAgICAgICByZXFTcGFjZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgICAgIC8vIEF0IHRoZSBkb2MgbGV2ZWwsIHRhYnMgYXQgbGluZSBzdGFydCBtYXkgYmUgcGFyc2VkXG4gICAgICAgICAgICAgICAgLy8gYXMgbGVhZGluZyB3aGl0ZSBzcGFjZSByYXRoZXIgdGhhbiBpbmRlbnRhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBJbiBhIGZsb3cgY29sbGVjdGlvbiwgb25seSB0aGUgcGFyc2VyIGhhbmRsZXMgaW5kZW50LlxuICAgICAgICAgICAgICAgIGlmICghZmxvdyAmJlxuICAgICAgICAgICAgICAgICAgICBhdE5ld2xpbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yICE9PSAnZG9jLXN0YXJ0JyAmJlxuICAgICAgICAgICAgICAgICAgICB0b2tlbi5zb3VyY2VbMF0gPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVEFCX0FTX0lOREVOVCcsICdUYWJzIGFyZSBub3QgYWxsb3dlZCBhcyBpbmRlbnRhdGlvbicpO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNTcGFjZSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ01JU1NJTkdfQ0hBUicsICdDb21tZW50cyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIG90aGVyIHRva2VucyBieSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2IgPSB0b2tlbi5zb3VyY2Uuc3Vic3RyaW5nKDEpIHx8ICcgJztcbiAgICAgICAgICAgICAgICBpZiAoIWNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjYjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gY29tbWVudFNlcCArIGNiO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRTZXAgPSAnJztcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGlmIChhdE5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ICs9IHRva2VuLnNvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VCZWZvcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRTZXAgKz0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgICAgIGF0TmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaGFzTmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvciB8fCB0YWcpXG4gICAgICAgICAgICAgICAgICAgIGhhc05ld2xpbmVBZnRlclByb3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcilcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ01VTFRJUExFX0FOQ0hPUlMnLCAnQSBub2RlIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGFuY2hvcicpO1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5zb3VyY2UuZW5kc1dpdGgoJzonKSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbi5vZmZzZXQgKyB0b2tlbi5zb3VyY2UubGVuZ3RoIC0gMSwgJ0JBRF9BTElBUycsICdBbmNob3IgZW5kaW5nIGluIDogaXMgYW1iaWd1b3VzJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gdG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHRva2VuLm9mZnNldDtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlcVNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RhZyc6IHtcbiAgICAgICAgICAgICAgICBpZiAodGFnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTVVMVElQTEVfVEFHUycsICdBIG5vZGUgY2FuIGhhdmUgYXQgbW9zdCBvbmUgdGFnJyk7XG4gICAgICAgICAgICAgICAgdGFnID0gdG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHRva2VuLm9mZnNldDtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlcVNwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgaW5kaWNhdG9yOlxuICAgICAgICAgICAgICAgIC8vIENvdWxkIGhlcmUgaGFuZGxlIHByZWNlZGluZyBjb21tZW50cyBkaWZmZXJlbnRseVxuICAgICAgICAgICAgICAgIGlmIChhbmNob3IgfHwgdGFnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnQkFEX1BST1BfT1JERVInLCBgQW5jaG9ycyBhbmQgdGFncyBtdXN0IGJlIGFmdGVyIHRoZSAke3Rva2VuLnNvdXJjZX0gaW5kaWNhdG9yYCk7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICR7dG9rZW4uc291cmNlfSBpbiAke2Zsb3cgPz8gJ2NvbGxlY3Rpb24nfWApO1xuICAgICAgICAgICAgICAgIGZvdW5kID0gdG9rZW47XG4gICAgICAgICAgICAgICAgYXROZXdsaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaGFzU3BhY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICBpZiAoZmxvdykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWEpXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICwgaW4gJHtmbG93fWApO1xuICAgICAgICAgICAgICAgICAgICBjb21tYSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzU3BhY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZSBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkICR7dG9rZW4udHlwZX0gdG9rZW5gKTtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGxhc3QgPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGVuZCA9IGxhc3QgPyBsYXN0Lm9mZnNldCArIGxhc3Quc291cmNlLmxlbmd0aCA6IG9mZnNldDtcbiAgICBpZiAocmVxU3BhY2UgJiZcbiAgICAgICAgbmV4dCAmJlxuICAgICAgICBuZXh0LnR5cGUgIT09ICdzcGFjZScgJiZcbiAgICAgICAgbmV4dC50eXBlICE9PSAnbmV3bGluZScgJiZcbiAgICAgICAgbmV4dC50eXBlICE9PSAnY29tbWEnICYmXG4gICAgICAgIChuZXh0LnR5cGUgIT09ICdzY2FsYXInIHx8IG5leHQuc291cmNlICE9PSAnJykpXG4gICAgICAgIG9uRXJyb3IobmV4dC5vZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnVGFncyBhbmQgYW5jaG9ycyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBuZXh0IHRva2VuIGJ5IHdoaXRlIHNwYWNlJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWEsXG4gICAgICAgIGZvdW5kLFxuICAgICAgICBzcGFjZUJlZm9yZSxcbiAgICAgICAgY29tbWVudCxcbiAgICAgICAgaGFzTmV3bGluZSxcbiAgICAgICAgaGFzTmV3bGluZUFmdGVyUHJvcCxcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICB0YWcsXG4gICAgICAgIGVuZCxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0ID8/IGVuZFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTmV3bGluZShrZXkpIHtcbiAgICBpZiAoIWtleSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgc3dpdGNoIChrZXkudHlwZSkge1xuICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgaWYgKGtleS5zb3VyY2UuaW5jbHVkZXMoJ1xcbicpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKGtleS5lbmQpXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiBrZXkuZW5kKVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3QudHlwZSA9PT0gJ25ld2xpbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIGtleS5pdGVtcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgaXQuc3RhcnQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdC50eXBlID09PSAnbmV3bGluZScpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIGl0LnNlcClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdC50eXBlID09PSAnbmV3bGluZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zTmV3bGluZShpdC5rZXkpIHx8IGNvbnRhaW5zTmV3bGluZShpdC52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmbG93SW5kZW50Q2hlY2soaW5kZW50LCBmYywgb25FcnJvcikge1xuICAgIGlmIChmYz8udHlwZSA9PT0gJ2Zsb3ctY29sbGVjdGlvbicpIHtcbiAgICAgICAgY29uc3QgZW5kID0gZmMuZW5kWzBdO1xuICAgICAgICBpZiAoZW5kLmluZGVudCA9PT0gaW5kZW50ICYmXG4gICAgICAgICAgICAoZW5kLnNvdXJjZSA9PT0gJ10nIHx8IGVuZC5zb3VyY2UgPT09ICd9JykgJiZcbiAgICAgICAgICAgIGNvbnRhaW5zTmV3bGluZShmYykpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdGbG93IGVuZCBpbmRpY2F0b3Igc2hvdWxkIGJlIG1vcmUgaW5kZW50ZWQgdGhhbiBwYXJlbnQnO1xuICAgICAgICAgICAgb25FcnJvcihlbmQsICdCQURfSU5ERU5UJywgbXNnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbWFwSW5jbHVkZXMoY3R4LCBpdGVtcywgc2VhcmNoKSB7XG4gICAgY29uc3QgeyB1bmlxdWVLZXlzIH0gPSBjdHgub3B0aW9ucztcbiAgICBpZiAodW5pcXVlS2V5cyA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBpc0VxdWFsID0gdHlwZW9mIHVuaXF1ZUtleXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyB1bmlxdWVLZXlzXG4gICAgICAgIDogKGEsIGIpID0+IGEgPT09IGIgfHxcbiAgICAgICAgICAgIChpc1NjYWxhciQxKGEpICYmXG4gICAgICAgICAgICAgICAgaXNTY2FsYXIkMShiKSAmJlxuICAgICAgICAgICAgICAgIGEudmFsdWUgPT09IGIudmFsdWUgJiZcbiAgICAgICAgICAgICAgICAhKGEudmFsdWUgPT09ICc8PCcgJiYgY3R4LnNjaGVtYS5tZXJnZSkpO1xuICAgIHJldHVybiBpdGVtcy5zb21lKHBhaXIgPT4gaXNFcXVhbChwYWlyLmtleSwgc2VhcmNoKSk7XG59XG5cbmNvbnN0IHN0YXJ0Q29sTXNnID0gJ0FsbCBtYXBwaW5nIGl0ZW1zIG11c3Qgc3RhcnQgYXQgdGhlIHNhbWUgY29sdW1uJztcbmZ1bmN0aW9uIHJlc29sdmVCbG9ja01hcCh7IGNvbXBvc2VOb2RlLCBjb21wb3NlRW1wdHlOb2RlIH0sIGN0eCwgYm0sIG9uRXJyb3IpIHtcbiAgICBjb25zdCBtYXAgPSBuZXcgWUFNTE1hcChjdHguc2NoZW1hKTtcbiAgICBpZiAoY3R4LmF0Um9vdClcbiAgICAgICAgY3R4LmF0Um9vdCA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSBibS5vZmZzZXQ7XG4gICAgZm9yIChjb25zdCBjb2xsSXRlbSBvZiBibS5pdGVtcykge1xuICAgICAgICBjb25zdCB7IHN0YXJ0LCBrZXksIHNlcCwgdmFsdWUgfSA9IGNvbGxJdGVtO1xuICAgICAgICAvLyBrZXkgcHJvcGVydGllc1xuICAgICAgICBjb25zdCBrZXlQcm9wcyA9IHJlc29sdmVQcm9wcyhzdGFydCwge1xuICAgICAgICAgICAgaW5kaWNhdG9yOiAnZXhwbGljaXQta2V5LWluZCcsXG4gICAgICAgICAgICBuZXh0OiBrZXkgPz8gc2VwPy5bMF0sXG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGltcGxpY2l0S2V5ID0gIWtleVByb3BzLmZvdW5kO1xuICAgICAgICBpZiAoaW1wbGljaXRLZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5LnR5cGUgPT09ICdibG9jay1zZXEnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JMT0NLX0FTX0lNUExJQ0lUX0tFWScsICdBIGJsb2NrIHNlcXVlbmNlIG1heSBub3QgYmUgdXNlZCBhcyBhbiBpbXBsaWNpdCBtYXAga2V5Jyk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoJ2luZGVudCcgaW4ga2V5ICYmIGtleS5pbmRlbnQgIT09IGJtLmluZGVudClcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCQURfSU5ERU5UJywgc3RhcnRDb2xNc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFrZXlQcm9wcy5hbmNob3IgJiYgIWtleVByb3BzLnRhZyAmJiAhc2VwKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYXNzZXJ0IGJlaW5nIGF0IGxhc3QgaXRlbT9cbiAgICAgICAgICAgICAgICBpZiAoa2V5UHJvcHMuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFwLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuY29tbWVudCArPSAnXFxuJyArIGtleVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5jb21tZW50ID0ga2V5UHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2V5UHJvcHMuaGFzTmV3bGluZUFmdGVyUHJvcCB8fCBjb250YWluc05ld2xpbmUoa2V5KSkge1xuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5ID8/IHN0YXJ0W3N0YXJ0Lmxlbmd0aCAtIDFdLCAnTVVMVElMSU5FX0lNUExJQ0lUX0tFWScsICdJbXBsaWNpdCBrZXlzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleVByb3BzLmZvdW5kPy5pbmRlbnQgIT09IGJtLmluZGVudCkge1xuICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCQURfSU5ERU5UJywgc3RhcnRDb2xNc2cpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGtleSB2YWx1ZVxuICAgICAgICBjb25zdCBrZXlTdGFydCA9IGtleVByb3BzLmVuZDtcbiAgICAgICAgY29uc3Qga2V5Tm9kZSA9IGtleVxuICAgICAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIGtleSwga2V5UHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBrZXlTdGFydCwgc3RhcnQsIG51bGwsIGtleVByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgaWYgKGN0eC5zY2hlbWEuY29tcGF0KVxuICAgICAgICAgICAgZmxvd0luZGVudENoZWNrKGJtLmluZGVudCwga2V5LCBvbkVycm9yKTtcbiAgICAgICAgaWYgKG1hcEluY2x1ZGVzKGN0eCwgbWFwLml0ZW1zLCBrZXlOb2RlKSlcbiAgICAgICAgICAgIG9uRXJyb3Ioa2V5U3RhcnQsICdEVVBMSUNBVEVfS0VZJywgJ01hcCBrZXlzIG11c3QgYmUgdW5pcXVlJyk7XG4gICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXNcbiAgICAgICAgY29uc3QgdmFsdWVQcm9wcyA9IHJlc29sdmVQcm9wcyhzZXAgPz8gW10sIHtcbiAgICAgICAgICAgIGluZGljYXRvcjogJ21hcC12YWx1ZS1pbmQnLFxuICAgICAgICAgICAgbmV4dDogdmFsdWUsXG4gICAgICAgICAgICBvZmZzZXQ6IGtleU5vZGUucmFuZ2VbMl0sXG4gICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6ICFrZXkgfHwga2V5LnR5cGUgPT09ICdibG9jay1zY2FsYXInXG4gICAgICAgIH0pO1xuICAgICAgICBvZmZzZXQgPSB2YWx1ZVByb3BzLmVuZDtcbiAgICAgICAgaWYgKHZhbHVlUHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdEtleSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZT8udHlwZSA9PT0gJ2Jsb2NrLW1hcCcgJiYgIXZhbHVlUHJvcHMuaGFzTmV3bGluZSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCTE9DS19BU19JTVBMSUNJVF9LRVknLCAnTmVzdGVkIG1hcHBpbmdzIGFyZSBub3QgYWxsb3dlZCBpbiBjb21wYWN0IG1hcHBpbmdzJyk7XG4gICAgICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLnN0cmljdCAmJlxuICAgICAgICAgICAgICAgICAgICBrZXlQcm9wcy5zdGFydCA8IHZhbHVlUHJvcHMuZm91bmQub2Zmc2V0IC0gMTAyNClcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihrZXlOb2RlLnJhbmdlLCAnS0VZX09WRVJfMTAyNF9DSEFSUycsICdUaGUgOiBpbmRpY2F0b3IgbXVzdCBiZSBhdCBtb3N0IDEwMjQgY2hhcnMgYWZ0ZXIgdGhlIHN0YXJ0IG9mIGFuIGltcGxpY2l0IGJsb2NrIG1hcHBpbmcga2V5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB2YWx1ZSB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdmFsdWVOb2RlID0gdmFsdWVcbiAgICAgICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwgdmFsdWUsIHZhbHVlUHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgb2Zmc2V0LCBzZXAsIG51bGwsIHZhbHVlUHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGN0eC5zY2hlbWEuY29tcGF0KVxuICAgICAgICAgICAgICAgIGZsb3dJbmRlbnRDaGVjayhibS5pbmRlbnQsIHZhbHVlLCBvbkVycm9yKTtcbiAgICAgICAgICAgIG9mZnNldCA9IHZhbHVlTm9kZS5yYW5nZVsyXTtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBuZXcgUGFpcihrZXlOb2RlLCB2YWx1ZU5vZGUpO1xuICAgICAgICAgICAgaWYgKGN0eC5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMpXG4gICAgICAgICAgICAgICAgcGFpci5zcmNUb2tlbiA9IGNvbGxJdGVtO1xuICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2gocGFpcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBrZXkgd2l0aCBubyB2YWx1ZVxuICAgICAgICAgICAgaWYgKGltcGxpY2l0S2V5KVxuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5Tm9kZS5yYW5nZSwgJ01JU1NJTkdfQ0hBUicsICdJbXBsaWNpdCBtYXAga2V5cyBuZWVkIHRvIGJlIGZvbGxvd2VkIGJ5IG1hcCB2YWx1ZXMnKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVByb3BzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5Tm9kZS5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBrZXlOb2RlLmNvbW1lbnQgKz0gJ1xcbicgKyB2YWx1ZVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBrZXlOb2RlLmNvbW1lbnQgPSB2YWx1ZVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gbmV3IFBhaXIoa2V5Tm9kZSk7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMua2VlcFNvdXJjZVRva2VucylcbiAgICAgICAgICAgICAgICBwYWlyLnNyY1Rva2VuID0gY29sbEl0ZW07XG4gICAgICAgICAgICBtYXAuaXRlbXMucHVzaChwYWlyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtYXAucmFuZ2UgPSBbYm0ub2Zmc2V0LCBvZmZzZXQsIG9mZnNldF07XG4gICAgcmV0dXJuIG1hcDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrU2VxKHsgY29tcG9zZU5vZGUsIGNvbXBvc2VFbXB0eU5vZGUgfSwgY3R4LCBicywgb25FcnJvcikge1xuICAgIGNvbnN0IHNlcSA9IG5ldyBZQU1MU2VxKGN0eC5zY2hlbWEpO1xuICAgIGlmIChjdHguYXRSb290KVxuICAgICAgICBjdHguYXRSb290ID0gZmFsc2U7XG4gICAgbGV0IG9mZnNldCA9IGJzLm9mZnNldDtcbiAgICBmb3IgKGNvbnN0IHsgc3RhcnQsIHZhbHVlIH0gb2YgYnMuaXRlbXMpIHtcbiAgICAgICAgY29uc3QgcHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgICAgIGluZGljYXRvcjogJ3NlcS1pdGVtLWluZCcsXG4gICAgICAgICAgICBuZXh0OiB2YWx1ZSxcbiAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICAgIG9uRXJyb3IsXG4gICAgICAgICAgICBzdGFydE9uTmV3bGluZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgb2Zmc2V0ID0gcHJvcHMuZW5kO1xuICAgICAgICBpZiAoIXByb3BzLmZvdW5kKSB7XG4gICAgICAgICAgICBpZiAocHJvcHMuYW5jaG9yIHx8IHByb3BzLnRhZyB8fCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50eXBlID09PSAnYmxvY2stc2VxJylcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdCQURfSU5ERU5UJywgJ0FsbCBzZXF1ZW5jZSBpdGVtcyBtdXN0IHN0YXJ0IGF0IHRoZSBzYW1lIGNvbHVtbicpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnU2VxdWVuY2UgaXRlbSB3aXRob3V0IC0gaW5kaWNhdG9yJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBhc3NlcnQgYmVpbmcgYXQgbGFzdCBpdGVtP1xuICAgICAgICAgICAgICAgIGlmIChwcm9wcy5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBzZXEuY29tbWVudCA9IHByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZSA9IHZhbHVlXG4gICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwgdmFsdWUsIHByb3BzLCBvbkVycm9yKVxuICAgICAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgb2Zmc2V0LCBzdGFydCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICBpZiAoY3R4LnNjaGVtYS5jb21wYXQpXG4gICAgICAgICAgICBmbG93SW5kZW50Q2hlY2soYnMuaW5kZW50LCB2YWx1ZSwgb25FcnJvcik7XG4gICAgICAgIG9mZnNldCA9IG5vZGUucmFuZ2VbMl07XG4gICAgICAgIHNlcS5pdGVtcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICBzZXEucmFuZ2UgPSBbYnMub2Zmc2V0LCBvZmZzZXQsIG9mZnNldF07XG4gICAgcmV0dXJuIHNlcTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUVuZChlbmQsIG9mZnNldCwgcmVxU3BhY2UsIG9uRXJyb3IpIHtcbiAgICBsZXQgY29tbWVudCA9ICcnO1xuICAgIGlmIChlbmQpIHtcbiAgICAgICAgbGV0IGhhc1NwYWNlID0gZmFsc2U7XG4gICAgICAgIGxldCBzZXAgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc291cmNlLCB0eXBlIH0gPSB0b2tlbjtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICAgICAgaGFzU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVxU3BhY2UgJiYgIWhhc1NwYWNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ01JU1NJTkdfQ0hBUicsICdDb21tZW50cyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIG90aGVyIHRva2VucyBieSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gc291cmNlLnN1YnN0cmluZygxKSB8fCAnICc7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjYjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCArPSBzZXAgKyBjYjtcbiAgICAgICAgICAgICAgICAgICAgc2VwID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXAgKz0gc291cmNlO1xuICAgICAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgJHt0eXBlfSBhdCBub2RlIGVuZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29tbWVudCwgb2Zmc2V0IH07XG59XG5cbmNvbnN0IGJsb2NrTXNnID0gJ0Jsb2NrIGNvbGxlY3Rpb25zIGFyZSBub3QgYWxsb3dlZCB3aXRoaW4gZmxvdyBjb2xsZWN0aW9ucyc7XG5jb25zdCBpc0Jsb2NrID0gKHRva2VuKSA9PiB0b2tlbiAmJiAodG9rZW4udHlwZSA9PT0gJ2Jsb2NrLW1hcCcgfHwgdG9rZW4udHlwZSA9PT0gJ2Jsb2NrLXNlcScpO1xuZnVuY3Rpb24gcmVzb2x2ZUZsb3dDb2xsZWN0aW9uKHsgY29tcG9zZU5vZGUsIGNvbXBvc2VFbXB0eU5vZGUgfSwgY3R4LCBmYywgb25FcnJvcikge1xuICAgIGNvbnN0IGlzTWFwID0gZmMuc3RhcnQuc291cmNlID09PSAneyc7XG4gICAgY29uc3QgZmNOYW1lID0gaXNNYXAgPyAnZmxvdyBtYXAnIDogJ2Zsb3cgc2VxdWVuY2UnO1xuICAgIGNvbnN0IGNvbGwgPSBpc01hcFxuICAgICAgICA/IG5ldyBZQU1MTWFwKGN0eC5zY2hlbWEpXG4gICAgICAgIDogbmV3IFlBTUxTZXEoY3R4LnNjaGVtYSk7XG4gICAgY29sbC5mbG93ID0gdHJ1ZTtcbiAgICBjb25zdCBhdFJvb3QgPSBjdHguYXRSb290O1xuICAgIGlmIChhdFJvb3QpXG4gICAgICAgIGN0eC5hdFJvb3QgPSBmYWxzZTtcbiAgICBsZXQgb2Zmc2V0ID0gZmMub2Zmc2V0ICsgZmMuc3RhcnQuc291cmNlLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZjLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGNvbGxJdGVtID0gZmMuaXRlbXNbaV07XG4gICAgICAgIGNvbnN0IHsgc3RhcnQsIGtleSwgc2VwLCB2YWx1ZSB9ID0gY29sbEl0ZW07XG4gICAgICAgIGNvbnN0IHByb3BzID0gcmVzb2x2ZVByb3BzKHN0YXJ0LCB7XG4gICAgICAgICAgICBmbG93OiBmY05hbWUsXG4gICAgICAgICAgICBpbmRpY2F0b3I6ICdleHBsaWNpdC1rZXktaW5kJyxcbiAgICAgICAgICAgIG5leHQ6IGtleSA/PyBzZXA/LlswXSxcbiAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICAgIG9uRXJyb3IsXG4gICAgICAgICAgICBzdGFydE9uTmV3bGluZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIGlmICghcHJvcHMuYW5jaG9yICYmICFwcm9wcy50YWcgJiYgIXNlcCAmJiAhdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBwcm9wcy5jb21tYSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5jb21tYSwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5leHBlY3RlZCAsIGluICR7ZmNOYW1lfWApO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPCBmYy5pdGVtcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHByb3BzLnN0YXJ0LCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkIGVtcHR5IGl0ZW0gaW4gJHtmY05hbWV9YCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGwuY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCArPSAnXFxuJyArIHByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCA9IHByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9mZnNldCA9IHByb3BzLmVuZDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNNYXAgJiYgY3R4Lm9wdGlvbnMuc3RyaWN0ICYmIGNvbnRhaW5zTmV3bGluZShrZXkpKVxuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5LCAvLyBjaGVja2VkIGJ5IGNvbnRhaW5zTmV3bGluZSgpXG4gICAgICAgICAgICAgICAgJ01VTFRJTElORV9JTVBMSUNJVF9LRVknLCAnSW1wbGljaXQga2V5cyBvZiBmbG93IHNlcXVlbmNlIHBhaXJzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICBpZiAocHJvcHMuY29tbWEpXG4gICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5jb21tYSwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5leHBlY3RlZCAsIGluICR7ZmNOYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFwcm9wcy5jb21tYSlcbiAgICAgICAgICAgICAgICBvbkVycm9yKHByb3BzLnN0YXJ0LCAnTUlTU0lOR19DSEFSJywgYE1pc3NpbmcgLCBiZXR3ZWVuICR7ZmNOYW1lfSBpdGVtc2ApO1xuICAgICAgICAgICAgaWYgKHByb3BzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJldkl0ZW1Db21tZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgbG9vcDogZm9yIChjb25zdCBzdCBvZiBzdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZJdGVtQ29tbWVudCA9IHN0LnNvdXJjZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJldkl0ZW1Db21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gY29sbC5pdGVtc1tjb2xsLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQYWlyKHByZXYpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IHByZXYudmFsdWUgPz8gcHJldi5rZXk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2LmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2LmNvbW1lbnQgKz0gJ1xcbicgKyBwcmV2SXRlbUNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYuY29tbWVudCA9IHByZXZJdGVtQ29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuY29tbWVudCA9IHByb3BzLmNvbW1lbnQuc3Vic3RyaW5nKHByZXZJdGVtQ29tbWVudC5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc01hcCAmJiAhc2VwICYmICFwcm9wcy5mb3VuZCkge1xuICAgICAgICAgICAgLy8gaXRlbSBpcyBhIHZhbHVlIGluIGEgc2VxXG4gICAgICAgICAgICAvLyBcdTIxOTIga2V5ICYgc2VwIGFyZSBlbXB0eSwgc3RhcnQgZG9lcyBub3QgaW5jbHVkZSA/IG9yIDpcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlTm9kZSA9IHZhbHVlXG4gICAgICAgICAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIHZhbHVlLCBwcm9wcywgb25FcnJvcilcbiAgICAgICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBwcm9wcy5lbmQsIHNlcCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICAgICAgY29sbC5pdGVtcy5wdXNoKHZhbHVlTm9kZSk7XG4gICAgICAgICAgICBvZmZzZXQgPSB2YWx1ZU5vZGUucmFuZ2VbMl07XG4gICAgICAgICAgICBpZiAoaXNCbG9jayh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgb25FcnJvcih2YWx1ZU5vZGUucmFuZ2UsICdCTE9DS19JTl9GTE9XJywgYmxvY2tNc2cpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaXRlbSBpcyBhIGtleSt2YWx1ZSBwYWlyXG4gICAgICAgICAgICAvLyBrZXkgdmFsdWVcbiAgICAgICAgICAgIGNvbnN0IGtleVN0YXJ0ID0gcHJvcHMuZW5kO1xuICAgICAgICAgICAgY29uc3Qga2V5Tm9kZSA9IGtleVxuICAgICAgICAgICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCBrZXksIHByb3BzLCBvbkVycm9yKVxuICAgICAgICAgICAgICAgIDogY29tcG9zZUVtcHR5Tm9kZShjdHgsIGtleVN0YXJ0LCBzdGFydCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGlzQmxvY2soa2V5KSlcbiAgICAgICAgICAgICAgICBvbkVycm9yKGtleU5vZGUucmFuZ2UsICdCTE9DS19JTl9GTE9XJywgYmxvY2tNc2cpO1xuICAgICAgICAgICAgLy8gdmFsdWUgcHJvcGVydGllc1xuICAgICAgICAgICAgY29uc3QgdmFsdWVQcm9wcyA9IHJlc29sdmVQcm9wcyhzZXAgPz8gW10sIHtcbiAgICAgICAgICAgICAgICBmbG93OiBmY05hbWUsXG4gICAgICAgICAgICAgICAgaW5kaWNhdG9yOiAnbWFwLXZhbHVlLWluZCcsXG4gICAgICAgICAgICAgICAgbmV4dDogdmFsdWUsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBrZXlOb2RlLnJhbmdlWzJdLFxuICAgICAgICAgICAgICAgIG9uRXJyb3IsXG4gICAgICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVByb3BzLmZvdW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc01hcCAmJiAhcHJvcHMuZm91bmQgJiYgY3R4Lm9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIHNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdCA9PT0gdmFsdWVQcm9wcy5mb3VuZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LnR5cGUgPT09ICduZXdsaW5lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHN0LCAnTVVMVElMSU5FX0lNUExJQ0lUX0tFWScsICdJbXBsaWNpdCBrZXlzIG9mIGZsb3cgc2VxdWVuY2UgcGFpcnMgbmVlZCB0byBiZSBvbiBhIHNpbmdsZSBsaW5lJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BzLnN0YXJ0IDwgdmFsdWVQcm9wcy5mb3VuZC5vZmZzZXQgLSAxMDI0KVxuICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcih2YWx1ZVByb3BzLmZvdW5kLCAnS0VZX09WRVJfMTAyNF9DSEFSUycsICdUaGUgOiBpbmRpY2F0b3IgbXVzdCBiZSBhdCBtb3N0IDEwMjQgY2hhcnMgYWZ0ZXIgdGhlIHN0YXJ0IG9mIGFuIGltcGxpY2l0IGZsb3cgc2VxdWVuY2Uga2V5Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoJ3NvdXJjZScgaW4gdmFsdWUgJiYgdmFsdWUuc291cmNlICYmIHZhbHVlLnNvdXJjZVswXSA9PT0gJzonKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHZhbHVlLCAnTUlTU0lOR19DSEFSJywgYE1pc3Npbmcgc3BhY2UgYWZ0ZXIgOiBpbiAke2ZjTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodmFsdWVQcm9wcy5zdGFydCwgJ01JU1NJTkdfQ0hBUicsIGBNaXNzaW5nICwgb3IgOiBiZXR3ZWVuICR7ZmNOYW1lfSBpdGVtc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdmFsdWUgdmFsdWVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlTm9kZSA9IHZhbHVlXG4gICAgICAgICAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIHZhbHVlLCB2YWx1ZVByb3BzLCBvbkVycm9yKVxuICAgICAgICAgICAgICAgIDogdmFsdWVQcm9wcy5mb3VuZFxuICAgICAgICAgICAgICAgICAgICA/IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCB2YWx1ZVByb3BzLmVuZCwgc2VwLCBudWxsLCB2YWx1ZVByb3BzLCBvbkVycm9yKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBpZiAodmFsdWVOb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQmxvY2sodmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHZhbHVlTm9kZS5yYW5nZSwgJ0JMT0NLX0lOX0ZMT1cnLCBibG9ja01zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZVByb3BzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5Tm9kZS5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBrZXlOb2RlLmNvbW1lbnQgKz0gJ1xcbicgKyB2YWx1ZVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBrZXlOb2RlLmNvbW1lbnQgPSB2YWx1ZVByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gbmV3IFBhaXIoa2V5Tm9kZSwgdmFsdWVOb2RlKTtcbiAgICAgICAgICAgIGlmIChjdHgub3B0aW9ucy5rZWVwU291cmNlVG9rZW5zKVxuICAgICAgICAgICAgICAgIHBhaXIuc3JjVG9rZW4gPSBjb2xsSXRlbTtcbiAgICAgICAgICAgIGlmIChpc01hcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IGNvbGw7XG4gICAgICAgICAgICAgICAgaWYgKG1hcEluY2x1ZGVzKGN0eCwgbWFwLml0ZW1zLCBrZXlOb2RlKSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihrZXlTdGFydCwgJ0RVUExJQ0FURV9LRVknLCAnTWFwIGtleXMgbXVzdCBiZSB1bmlxdWUnKTtcbiAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaChwYWlyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IG5ldyBZQU1MTWFwKGN0eC5zY2hlbWEpO1xuICAgICAgICAgICAgICAgIG1hcC5mbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaChwYWlyKTtcbiAgICAgICAgICAgICAgICBjb2xsLml0ZW1zLnB1c2gobWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCA9IHZhbHVlTm9kZSA/IHZhbHVlTm9kZS5yYW5nZVsyXSA6IHZhbHVlUHJvcHMuZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGV4cGVjdGVkRW5kID0gaXNNYXAgPyAnfScgOiAnXSc7XG4gICAgY29uc3QgW2NlLCAuLi5lZV0gPSBmYy5lbmQ7XG4gICAgbGV0IGNlUG9zID0gb2Zmc2V0O1xuICAgIGlmIChjZSAmJiBjZS5zb3VyY2UgPT09IGV4cGVjdGVkRW5kKVxuICAgICAgICBjZVBvcyA9IGNlLm9mZnNldCArIGNlLnNvdXJjZS5sZW5ndGg7XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmY05hbWVbMF0udG9VcHBlckNhc2UoKSArIGZjTmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIGNvbnN0IG1zZyA9IGF0Um9vdFxuICAgICAgICAgICAgPyBgJHtuYW1lfSBtdXN0IGVuZCB3aXRoIGEgJHtleHBlY3RlZEVuZH1gXG4gICAgICAgICAgICA6IGAke25hbWV9IGluIGJsb2NrIGNvbGxlY3Rpb24gbXVzdCBiZSBzdWZmaWNpZW50bHkgaW5kZW50ZWQgYW5kIGVuZCB3aXRoIGEgJHtleHBlY3RlZEVuZH1gO1xuICAgICAgICBvbkVycm9yKG9mZnNldCwgYXRSb290ID8gJ01JU1NJTkdfQ0hBUicgOiAnQkFEX0lOREVOVCcsIG1zZyk7XG4gICAgICAgIGlmIChjZSAmJiBjZS5zb3VyY2UubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgZWUudW5zaGlmdChjZSk7XG4gICAgfVxuICAgIGlmIChlZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlc29sdmVFbmQoZWUsIGNlUG9zLCBjdHgub3B0aW9ucy5zdHJpY3QsIG9uRXJyb3IpO1xuICAgICAgICBpZiAoZW5kLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChjb2xsLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgY29sbC5jb21tZW50ICs9ICdcXG4nICsgZW5kLmNvbW1lbnQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY29sbC5jb21tZW50ID0gZW5kLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29sbC5yYW5nZSA9IFtmYy5vZmZzZXQsIGNlUG9zLCBlbmQub2Zmc2V0XTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbGwucmFuZ2UgPSBbZmMub2Zmc2V0LCBjZVBvcywgY2VQb3NdO1xuICAgIH1cbiAgICByZXR1cm4gY29sbDtcbn1cblxuZnVuY3Rpb24gY29tcG9zZUNvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIHRhZ1Rva2VuLCBvbkVycm9yKSB7XG4gICAgbGV0IGNvbGw7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2Jsb2NrLW1hcCc6IHtcbiAgICAgICAgICAgIGNvbGwgPSByZXNvbHZlQmxvY2tNYXAoQ04sIGN0eCwgdG9rZW4sIG9uRXJyb3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgY29sbCA9IHJlc29sdmVCbG9ja1NlcShDTiwgY3R4LCB0b2tlbiwgb25FcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOiB7XG4gICAgICAgICAgICBjb2xsID0gcmVzb2x2ZUZsb3dDb2xsZWN0aW9uKENOLCBjdHgsIHRva2VuLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghdGFnVG9rZW4pXG4gICAgICAgIHJldHVybiBjb2xsO1xuICAgIGNvbnN0IHRhZ05hbWUgPSBjdHguZGlyZWN0aXZlcy50YWdOYW1lKHRhZ1Rva2VuLnNvdXJjZSwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpKTtcbiAgICBpZiAoIXRhZ05hbWUpXG4gICAgICAgIHJldHVybiBjb2xsO1xuICAgIC8vIENhc3QgbmVlZGVkIGR1ZSB0bzogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zODQxXG4gICAgY29uc3QgQ29sbCA9IGNvbGwuY29uc3RydWN0b3I7XG4gICAgaWYgKHRhZ05hbWUgPT09ICchJyB8fCB0YWdOYW1lID09PSBDb2xsLnRhZ05hbWUpIHtcbiAgICAgICAgY29sbC50YWcgPSBDb2xsLnRhZ05hbWU7XG4gICAgICAgIHJldHVybiBjb2xsO1xuICAgIH1cbiAgICBjb25zdCBleHBUeXBlID0gaXNNYXAoY29sbCkgPyAnbWFwJyA6ICdzZXEnO1xuICAgIGxldCB0YWcgPSBjdHguc2NoZW1hLnRhZ3MuZmluZCh0ID0+IHQuY29sbGVjdGlvbiA9PT0gZXhwVHlwZSAmJiB0LnRhZyA9PT0gdGFnTmFtZSk7XG4gICAgaWYgKCF0YWcpIHtcbiAgICAgICAgY29uc3Qga3QgPSBjdHguc2NoZW1hLmtub3duVGFnc1t0YWdOYW1lXTtcbiAgICAgICAgaWYgKGt0ICYmIGt0LmNvbGxlY3Rpb24gPT09IGV4cFR5cGUpIHtcbiAgICAgICAgICAgIGN0eC5zY2hlbWEudGFncy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGt0LCB7IGRlZmF1bHQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgIHRhZyA9IGt0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb25FcnJvcih0YWdUb2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIGBVbnJlc29sdmVkIHRhZzogJHt0YWdOYW1lfWAsIHRydWUpO1xuICAgICAgICAgICAgY29sbC50YWcgPSB0YWdOYW1lO1xuICAgICAgICAgICAgcmV0dXJuIGNvbGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzID0gdGFnLnJlc29sdmUoY29sbCwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpLCBjdHgub3B0aW9ucyk7XG4gICAgY29uc3Qgbm9kZSA9IGlzTm9kZSQxKHJlcylcbiAgICAgICAgPyByZXNcbiAgICAgICAgOiBuZXcgU2NhbGFyKHJlcyk7XG4gICAgbm9kZS5yYW5nZSA9IGNvbGwucmFuZ2U7XG4gICAgbm9kZS50YWcgPSB0YWdOYW1lO1xuICAgIGlmICh0YWc/LmZvcm1hdClcbiAgICAgICAgbm9kZS5mb3JtYXQgPSB0YWcuZm9ybWF0O1xuICAgIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQmxvY2tTY2FsYXIoc2NhbGFyLCBzdHJpY3QsIG9uRXJyb3IpIHtcbiAgICBjb25zdCBzdGFydCA9IHNjYWxhci5vZmZzZXQ7XG4gICAgY29uc3QgaGVhZGVyID0gcGFyc2VCbG9ja1NjYWxhckhlYWRlcihzY2FsYXIsIHN0cmljdCwgb25FcnJvcik7XG4gICAgaWYgKCFoZWFkZXIpXG4gICAgICAgIHJldHVybiB7IHZhbHVlOiAnJywgdHlwZTogbnVsbCwgY29tbWVudDogJycsIHJhbmdlOiBbc3RhcnQsIHN0YXJ0LCBzdGFydF0gfTtcbiAgICBjb25zdCB0eXBlID0gaGVhZGVyLm1vZGUgPT09ICc+JyA/IFNjYWxhci5CTE9DS19GT0xERUQgOiBTY2FsYXIuQkxPQ0tfTElURVJBTDtcbiAgICBjb25zdCBsaW5lcyA9IHNjYWxhci5zb3VyY2UgPyBzcGxpdExpbmVzKHNjYWxhci5zb3VyY2UpIDogW107XG4gICAgLy8gZGV0ZXJtaW5lIHRoZSBlbmQgb2YgY29udGVudCAmIHN0YXJ0IG9mIGNob21waW5nXG4gICAgbGV0IGNob21wU3RhcnQgPSBsaW5lcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBsaW5lc1tpXVsxXTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09ICcnIHx8IGNvbnRlbnQgPT09ICdcXHInKVxuICAgICAgICAgICAgY2hvbXBTdGFydCA9IGk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBzaG9ydGN1dCBmb3IgZW1wdHkgY29udGVudHNcbiAgICBpZiAoY2hvbXBTdGFydCA9PT0gMCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGhlYWRlci5jaG9tcCA9PT0gJysnICYmIGxpbmVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gJ1xcbicucmVwZWF0KE1hdGgubWF4KDEsIGxpbmVzLmxlbmd0aCAtIDEpKVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgbGV0IGVuZCA9IHN0YXJ0ICsgaGVhZGVyLmxlbmd0aDtcbiAgICAgICAgaWYgKHNjYWxhci5zb3VyY2UpXG4gICAgICAgICAgICBlbmQgKz0gc2NhbGFyLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB7IHZhbHVlLCB0eXBlLCBjb21tZW50OiBoZWFkZXIuY29tbWVudCwgcmFuZ2U6IFtzdGFydCwgZW5kLCBlbmRdIH07XG4gICAgfVxuICAgIC8vIGZpbmQgdGhlIGluZGVudGF0aW9uIGxldmVsIHRvIHRyaW0gZnJvbSBzdGFydFxuICAgIGxldCB0cmltSW5kZW50ID0gc2NhbGFyLmluZGVudCArIGhlYWRlci5pbmRlbnQ7XG4gICAgbGV0IG9mZnNldCA9IHNjYWxhci5vZmZzZXQgKyBoZWFkZXIubGVuZ3RoO1xuICAgIGxldCBjb250ZW50U3RhcnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hvbXBTdGFydDsgKytpKSB7XG4gICAgICAgIGNvbnN0IFtpbmRlbnQsIGNvbnRlbnRdID0gbGluZXNbaV07XG4gICAgICAgIGlmIChjb250ZW50ID09PSAnJyB8fCBjb250ZW50ID09PSAnXFxyJykge1xuICAgICAgICAgICAgaWYgKGhlYWRlci5pbmRlbnQgPT09IDAgJiYgaW5kZW50Lmxlbmd0aCA+IHRyaW1JbmRlbnQpXG4gICAgICAgICAgICAgICAgdHJpbUluZGVudCA9IGluZGVudC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaW5kZW50Lmxlbmd0aCA8IHRyaW1JbmRlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0Jsb2NrIHNjYWxhcnMgd2l0aCBtb3JlLWluZGVudGVkIGxlYWRpbmcgZW1wdHkgbGluZXMgbXVzdCB1c2UgYW4gZXhwbGljaXQgaW5kZW50YXRpb24gaW5kaWNhdG9yJztcbiAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCArIGluZGVudC5sZW5ndGgsICdNSVNTSU5HX0NIQVInLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoZWFkZXIuaW5kZW50ID09PSAwKVxuICAgICAgICAgICAgICAgIHRyaW1JbmRlbnQgPSBpbmRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgY29udGVudFN0YXJ0ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG9mZnNldCArPSBpbmRlbnQubGVuZ3RoICsgY29udGVudC5sZW5ndGggKyAxO1xuICAgIH1cbiAgICAvLyBpbmNsdWRlIHRyYWlsaW5nIG1vcmUtaW5kZW50ZWQgZW1wdHkgbGluZXMgaW4gY29udGVudFxuICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IGNob21wU3RhcnQ7IC0taSkge1xuICAgICAgICBpZiAobGluZXNbaV1bMF0ubGVuZ3RoID4gdHJpbUluZGVudClcbiAgICAgICAgICAgIGNob21wU3RhcnQgPSBpICsgMTtcbiAgICB9XG4gICAgbGV0IHZhbHVlID0gJyc7XG4gICAgbGV0IHNlcCA9ICcnO1xuICAgIGxldCBwcmV2TW9yZUluZGVudGVkID0gZmFsc2U7XG4gICAgLy8gbGVhZGluZyB3aGl0ZXNwYWNlIGlzIGtlcHQgaW50YWN0XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50U3RhcnQ7ICsraSlcbiAgICAgICAgdmFsdWUgKz0gbGluZXNbaV1bMF0uc2xpY2UodHJpbUluZGVudCkgKyAnXFxuJztcbiAgICBmb3IgKGxldCBpID0gY29udGVudFN0YXJ0OyBpIDwgY2hvbXBTdGFydDsgKytpKSB7XG4gICAgICAgIGxldCBbaW5kZW50LCBjb250ZW50XSA9IGxpbmVzW2ldO1xuICAgICAgICBvZmZzZXQgKz0gaW5kZW50Lmxlbmd0aCArIGNvbnRlbnQubGVuZ3RoICsgMTtcbiAgICAgICAgY29uc3QgY3JsZiA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXSA9PT0gJ1xccic7XG4gICAgICAgIGlmIChjcmxmKVxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgLTEpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgYWxyZWFkeSBjYXVnaHQgaW4gbGV4ZXIgKi9cbiAgICAgICAgaWYgKGNvbnRlbnQgJiYgaW5kZW50Lmxlbmd0aCA8IHRyaW1JbmRlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IGhlYWRlci5pbmRlbnRcbiAgICAgICAgICAgICAgICA/ICdleHBsaWNpdCBpbmRlbnRhdGlvbiBpbmRpY2F0b3InXG4gICAgICAgICAgICAgICAgOiAnZmlyc3QgbGluZSc7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYEJsb2NrIHNjYWxhciBsaW5lcyBtdXN0IG5vdCBiZSBsZXNzIGluZGVudGVkIHRoYW4gdGhlaXIgJHtzcmN9YDtcbiAgICAgICAgICAgIG9uRXJyb3Iob2Zmc2V0IC0gY29udGVudC5sZW5ndGggLSAoY3JsZiA/IDIgOiAxKSwgJ0JBRF9JTkRFTlQnLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIGluZGVudCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlID09PSBTY2FsYXIuQkxPQ0tfTElURVJBTCkge1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgaW5kZW50LnNsaWNlKHRyaW1JbmRlbnQpICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGVudC5sZW5ndGggPiB0cmltSW5kZW50IHx8IGNvbnRlbnRbMF0gPT09ICdcXHQnKSB7XG4gICAgICAgICAgICAvLyBtb3JlLWluZGVudGVkIGNvbnRlbnQgd2l0aGluIGEgZm9sZGVkIGJsb2NrXG4gICAgICAgICAgICBpZiAoc2VwID09PSAnICcpXG4gICAgICAgICAgICAgICAgc2VwID0gJ1xcbic7XG4gICAgICAgICAgICBlbHNlIGlmICghcHJldk1vcmVJbmRlbnRlZCAmJiBzZXAgPT09ICdcXG4nKVxuICAgICAgICAgICAgICAgIHNlcCA9ICdcXG5cXG4nO1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgaW5kZW50LnNsaWNlKHRyaW1JbmRlbnQpICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICAgICAgcHJldk1vcmVJbmRlbnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGVudCA9PT0gJycpIHtcbiAgICAgICAgICAgIC8vIGVtcHR5IGxpbmVcbiAgICAgICAgICAgIGlmIChzZXAgPT09ICdcXG4nKVxuICAgICAgICAgICAgICAgIHZhbHVlICs9ICdcXG4nO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNlcCA9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgKz0gc2VwICsgY29udGVudDtcbiAgICAgICAgICAgIHNlcCA9ICcgJztcbiAgICAgICAgICAgIHByZXZNb3JlSW5kZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzd2l0Y2ggKGhlYWRlci5jaG9tcCkge1xuICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBjaG9tcFN0YXJ0OyBpIDwgbGluZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbicgKyBsaW5lc1tpXVswXS5zbGljZSh0cmltSW5kZW50KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSAhPT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhbHVlICs9ICdcXG4nO1xuICAgIH1cbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGhlYWRlci5sZW5ndGggKyBzY2FsYXIuc291cmNlLmxlbmd0aDtcbiAgICByZXR1cm4geyB2YWx1ZSwgdHlwZSwgY29tbWVudDogaGVhZGVyLmNvbW1lbnQsIHJhbmdlOiBbc3RhcnQsIGVuZCwgZW5kXSB9O1xufVxuZnVuY3Rpb24gcGFyc2VCbG9ja1NjYWxhckhlYWRlcih7IG9mZnNldCwgcHJvcHMgfSwgc3RyaWN0LCBvbkVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmIHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgaWYgKHByb3BzWzBdLnR5cGUgIT09ICdibG9jay1zY2FsYXItaGVhZGVyJykge1xuICAgICAgICBvbkVycm9yKHByb3BzWzBdLCAnSU1QT1NTSUJMRScsICdCbG9jayBzY2FsYXIgaGVhZGVyIG5vdCBmb3VuZCcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyBzb3VyY2UgfSA9IHByb3BzWzBdO1xuICAgIGNvbnN0IG1vZGUgPSBzb3VyY2VbMF07XG4gICAgbGV0IGluZGVudCA9IDA7XG4gICAgbGV0IGNob21wID0gJyc7XG4gICAgbGV0IGVycm9yID0gLTE7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzb3VyY2UubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgY2ggPSBzb3VyY2VbaV07XG4gICAgICAgIGlmICghY2hvbXAgJiYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykpXG4gICAgICAgICAgICBjaG9tcCA9IGNoO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBOdW1iZXIoY2gpO1xuICAgICAgICAgICAgaWYgKCFpbmRlbnQgJiYgbilcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBuO1xuICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT09IC0xKVxuICAgICAgICAgICAgICAgIGVycm9yID0gb2Zmc2V0ICsgaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IgIT09IC0xKVxuICAgICAgICBvbkVycm9yKGVycm9yLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBCbG9jayBzY2FsYXIgaGVhZGVyIGluY2x1ZGVzIGV4dHJhIGNoYXJhY3RlcnM6ICR7c291cmNlfWApO1xuICAgIGxldCBoYXNTcGFjZSA9IGZhbHNlO1xuICAgIGxldCBjb21tZW50ID0gJyc7XG4gICAgbGV0IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwcm9wcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHByb3BzW2ldO1xuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgbGVuZ3RoICs9IHRva2VuLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBpZiAoc3RyaWN0ICYmICFoYXNTcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0NvbW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gb3RoZXIgdG9rZW5zIGJ5IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMnO1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTUlTU0lOR19DSEFSJywgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlbmd0aCArPSB0b2tlbi5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSB0b2tlbi5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgdG9rZW4ubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgbGVuZ3RoICs9IHRva2VuLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVW5leHBlY3RlZCB0b2tlbiBpbiBibG9jayBzY2FsYXIgaGVhZGVyOiAke3Rva2VuLnR5cGV9YDtcbiAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRzID0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgICAgIGlmICh0cyAmJiB0eXBlb2YgdHMgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICBsZW5ndGggKz0gdHMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IG1vZGUsIGluZGVudCwgY2hvbXAsIGNvbW1lbnQsIGxlbmd0aCB9O1xufVxuLyoqIEByZXR1cm5zIEFycmF5IG9mIGxpbmVzIHNwbGl0IHVwIGFzIGBbaW5kZW50LCBjb250ZW50XWAgKi9cbmZ1bmN0aW9uIHNwbGl0TGluZXMoc291cmNlKSB7XG4gICAgY29uc3Qgc3BsaXQgPSBzb3VyY2Uuc3BsaXQoL1xcbiggKikvKTtcbiAgICBjb25zdCBmaXJzdCA9IHNwbGl0WzBdO1xuICAgIGNvbnN0IG0gPSBmaXJzdC5tYXRjaCgvXiggKikvKTtcbiAgICBjb25zdCBsaW5lMCA9IG0/LlsxXVxuICAgICAgICA/IFttWzFdLCBmaXJzdC5zbGljZShtWzFdLmxlbmd0aCldXG4gICAgICAgIDogWycnLCBmaXJzdF07XG4gICAgY29uc3QgbGluZXMgPSBbbGluZTBdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXQubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgIGxpbmVzLnB1c2goW3NwbGl0W2ldLCBzcGxpdFtpICsgMV1dKTtcbiAgICByZXR1cm4gbGluZXM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVGbG93U2NhbGFyKHNjYWxhciwgc3RyaWN0LCBvbkVycm9yKSB7XG4gICAgY29uc3QgeyBvZmZzZXQsIHR5cGUsIHNvdXJjZSwgZW5kIH0gPSBzY2FsYXI7XG4gICAgbGV0IF90eXBlO1xuICAgIGxldCB2YWx1ZTtcbiAgICBjb25zdCBfb25FcnJvciA9IChyZWwsIGNvZGUsIG1zZykgPT4gb25FcnJvcihvZmZzZXQgKyByZWwsIGNvZGUsIG1zZyk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgICAgICBfdHlwZSA9IFNjYWxhci5QTEFJTjtcbiAgICAgICAgICAgIHZhbHVlID0gcGxhaW5WYWx1ZShzb3VyY2UsIF9vbkVycm9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICBfdHlwZSA9IFNjYWxhci5RVU9URV9TSU5HTEU7XG4gICAgICAgICAgICB2YWx1ZSA9IHNpbmdsZVF1b3RlZFZhbHVlKHNvdXJjZSwgX29uRXJyb3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIF90eXBlID0gU2NhbGFyLlFVT1RFX0RPVUJMRTtcbiAgICAgICAgICAgIHZhbHVlID0gZG91YmxlUXVvdGVkVmFsdWUoc291cmNlLCBfb25FcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG9uRXJyb3Ioc2NhbGFyLCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBFeHBlY3RlZCBhIGZsb3cgc2NhbGFyIHZhbHVlLCBidXQgZm91bmQ6ICR7dHlwZX1gKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgIHR5cGU6IG51bGwsXG4gICAgICAgICAgICAgICAgY29tbWVudDogJycsXG4gICAgICAgICAgICAgICAgcmFuZ2U6IFtvZmZzZXQsIG9mZnNldCArIHNvdXJjZS5sZW5ndGgsIG9mZnNldCArIHNvdXJjZS5sZW5ndGhdXG4gICAgICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZUVuZCA9IG9mZnNldCArIHNvdXJjZS5sZW5ndGg7XG4gICAgY29uc3QgcmUgPSByZXNvbHZlRW5kKGVuZCwgdmFsdWVFbmQsIHN0cmljdCwgb25FcnJvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHR5cGU6IF90eXBlLFxuICAgICAgICBjb21tZW50OiByZS5jb21tZW50LFxuICAgICAgICByYW5nZTogW29mZnNldCwgdmFsdWVFbmQsIHJlLm9mZnNldF1cbiAgICB9O1xufVxuZnVuY3Rpb24gcGxhaW5WYWx1ZShzb3VyY2UsIG9uRXJyb3IpIHtcbiAgICBsZXQgYmFkQ2hhciA9ICcnO1xuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAgICBiYWRDaGFyID0gJ2EgdGFiIGNoYXJhY3Rlcic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnLCc6XG4gICAgICAgICAgICBiYWRDaGFyID0gJ2Zsb3cgaW5kaWNhdG9yIGNoYXJhY3RlciAsJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICclJzpcbiAgICAgICAgICAgIGJhZENoYXIgPSAnZGlyZWN0aXZlIGluZGljYXRvciBjaGFyYWN0ZXIgJSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgIGNhc2UgJz4nOiB7XG4gICAgICAgICAgICBiYWRDaGFyID0gYGJsb2NrIHNjYWxhciBpbmRpY2F0b3IgJHtzb3VyY2VbMF19YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0AnOlxuICAgICAgICBjYXNlICdgJzoge1xuICAgICAgICAgICAgYmFkQ2hhciA9IGByZXNlcnZlZCBjaGFyYWN0ZXIgJHtzb3VyY2VbMF19YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChiYWRDaGFyKVxuICAgICAgICBvbkVycm9yKDAsICdCQURfU0NBTEFSX1NUQVJUJywgYFBsYWluIHZhbHVlIGNhbm5vdCBzdGFydCB3aXRoICR7YmFkQ2hhcn1gKTtcbiAgICByZXR1cm4gZm9sZExpbmVzKHNvdXJjZSk7XG59XG5mdW5jdGlvbiBzaW5nbGVRdW90ZWRWYWx1ZShzb3VyY2UsIG9uRXJyb3IpIHtcbiAgICBpZiAoc291cmNlW3NvdXJjZS5sZW5ndGggLSAxXSAhPT0gXCInXCIgfHwgc291cmNlLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgb25FcnJvcihzb3VyY2UubGVuZ3RoLCAnTUlTU0lOR19DSEFSJywgXCJNaXNzaW5nIGNsb3NpbmcgJ3F1b3RlXCIpO1xuICAgIHJldHVybiBmb2xkTGluZXMoc291cmNlLnNsaWNlKDEsIC0xKSkucmVwbGFjZSgvJycvZywgXCInXCIpO1xufVxuZnVuY3Rpb24gZm9sZExpbmVzKHNvdXJjZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBuZWdhdGl2ZSBsb29rYmVoaW5kIGhlcmUgYW5kIGluIHRoZSBgcmVgIFJlZ0V4cCBpcyB0b1xuICAgICAqIHByZXZlbnQgY2F1c2luZyBhIHBvbHlub21pYWwgc2VhcmNoIHRpbWUgaW4gY2VydGFpbiBjYXNlcy5cbiAgICAgKlxuICAgICAqIFRoZSB0cnktY2F0Y2ggaXMgZm9yIFNhZmFyaSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IHRoaXMgeWV0OlxuICAgICAqIGh0dHBzOi8vY2FuaXVzZS5jb20vanMtcmVnZXhwLWxvb2tiZWhpbmRcbiAgICAgKi9cbiAgICBsZXQgZmlyc3QsIGxpbmU7XG4gICAgdHJ5IHtcbiAgICAgICAgZmlyc3QgPSBuZXcgUmVnRXhwKCcoLio/KSg/PCFbIFxcdF0pWyBcXHRdKlxccj9cXG4nLCAnc3knKTtcbiAgICAgICAgbGluZSA9IG5ldyBSZWdFeHAoJ1sgXFx0XSooLio/KSg/Oig/PCFbIFxcdF0pWyBcXHRdKik/XFxyP1xcbicsICdzeScpO1xuICAgIH1cbiAgICBjYXRjaCAoXykge1xuICAgICAgICBmaXJzdCA9IC8oLio/KVsgXFx0XSpcXHI/XFxuL3N5O1xuICAgICAgICBsaW5lID0gL1sgXFx0XSooLio/KVsgXFx0XSpcXHI/XFxuL3N5O1xuICAgIH1cbiAgICBsZXQgbWF0Y2ggPSBmaXJzdC5leGVjKHNvdXJjZSk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICBsZXQgcmVzID0gbWF0Y2hbMV07XG4gICAgbGV0IHNlcCA9ICcgJztcbiAgICBsZXQgcG9zID0gZmlyc3QubGFzdEluZGV4O1xuICAgIGxpbmUubGFzdEluZGV4ID0gcG9zO1xuICAgIHdoaWxlICgobWF0Y2ggPSBsaW5lLmV4ZWMoc291cmNlKSkpIHtcbiAgICAgICAgaWYgKG1hdGNoWzFdID09PSAnJykge1xuICAgICAgICAgICAgaWYgKHNlcCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgcmVzICs9IHNlcDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZXAgPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcyArPSBzZXAgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgIHNlcCA9ICcgJztcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBsaW5lLmxhc3RJbmRleDtcbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IC9bIFxcdF0qKC4qKS9zeTtcbiAgICBsYXN0Lmxhc3RJbmRleCA9IHBvcztcbiAgICBtYXRjaCA9IGxhc3QuZXhlYyhzb3VyY2UpO1xuICAgIHJldHVybiByZXMgKyBzZXAgKyAobWF0Y2g/LlsxXSA/PyAnJyk7XG59XG5mdW5jdGlvbiBkb3VibGVRdW90ZWRWYWx1ZShzb3VyY2UsIG9uRXJyb3IpIHtcbiAgICBsZXQgcmVzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzb3VyY2UubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGNvbnN0IGNoID0gc291cmNlW2ldO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHNvdXJjZVtpICsgMV0gPT09ICdcXG4nKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9sZCwgb2Zmc2V0IH0gPSBmb2xkTmV3bGluZShzb3VyY2UsIGkpO1xuICAgICAgICAgICAgcmVzICs9IGZvbGQ7XG4gICAgICAgICAgICBpID0gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gc291cmNlWysraV07XG4gICAgICAgICAgICBjb25zdCBjYyA9IGVzY2FwZUNvZGVzW25leHRdO1xuICAgICAgICAgICAgaWYgKGNjKVxuICAgICAgICAgICAgICAgIHJlcyArPSBjYztcbiAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBlc2NhcGVkIG5ld2xpbmVzLCBidXQgc3RpbGwgdHJpbSB0aGUgZm9sbG93aW5nIGxpbmVcbiAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlW2kgKyAxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlWysraSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PT0gJ1xccicgJiYgc291cmNlW2kgKyAxXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAvLyBza2lwIGVzY2FwZWQgQ1JMRiBuZXdsaW5lcywgYnV0IHN0aWxsIHRyaW0gdGhlIGZvbGxvd2luZyBsaW5lXG4gICAgICAgICAgICAgICAgbmV4dCA9IHNvdXJjZVsrK2kgKyAxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlWysraSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PT0gJ3gnIHx8IG5leHQgPT09ICd1JyB8fCBuZXh0ID09PSAnVScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSB7IHg6IDIsIHU6IDQsIFU6IDggfVtuZXh0XTtcbiAgICAgICAgICAgICAgICByZXMgKz0gcGFyc2VDaGFyQ29kZShzb3VyY2UsIGkgKyAxLCBsZW5ndGgsIG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIGkgKz0gbGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmF3ID0gc291cmNlLnN1YnN0cihpIC0gMSwgMik7XG4gICAgICAgICAgICAgICAgb25FcnJvcihpIC0gMSwgJ0JBRF9EUV9FU0NBUEUnLCBgSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgJHtyYXd9YCk7XG4gICAgICAgICAgICAgICAgcmVzICs9IHJhdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICAgICAgLy8gdHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlXG4gICAgICAgICAgICBjb25zdCB3c1N0YXJ0ID0gaTtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gc291cmNlW2kgKyAxXTtcbiAgICAgICAgICAgIHdoaWxlIChuZXh0ID09PSAnICcgfHwgbmV4dCA9PT0gJ1xcdCcpXG4gICAgICAgICAgICAgICAgbmV4dCA9IHNvdXJjZVsrK2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChuZXh0ICE9PSAnXFxuJyAmJiAhKG5leHQgPT09ICdcXHInICYmIHNvdXJjZVtpICsgMl0gPT09ICdcXG4nKSlcbiAgICAgICAgICAgICAgICByZXMgKz0gaSA+IHdzU3RhcnQgPyBzb3VyY2Uuc2xpY2Uod3NTdGFydCwgaSArIDEpIDogY2g7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXMgKz0gY2g7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV0gIT09ICdcIicgfHwgc291cmNlLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgb25FcnJvcihzb3VyY2UubGVuZ3RoLCAnTUlTU0lOR19DSEFSJywgJ01pc3NpbmcgY2xvc2luZyBcInF1b3RlJyk7XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogRm9sZCBhIHNpbmdsZSBuZXdsaW5lIGludG8gYSBzcGFjZSwgbXVsdGlwbGUgbmV3bGluZXMgdG8gTiAtIDEgbmV3bGluZXMuXG4gKiBQcmVzdW1lcyBgc291cmNlW29mZnNldF0gPT09ICdcXG4nYFxuICovXG5mdW5jdGlvbiBmb2xkTmV3bGluZShzb3VyY2UsIG9mZnNldCkge1xuICAgIGxldCBmb2xkID0gJyc7XG4gICAgbGV0IGNoID0gc291cmNlW29mZnNldCArIDFdO1xuICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JyB8fCBjaCA9PT0gJ1xcbicgfHwgY2ggPT09ICdcXHInKSB7XG4gICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgc291cmNlW29mZnNldCArIDJdICE9PSAnXFxuJylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAoY2ggPT09ICdcXG4nKVxuICAgICAgICAgICAgZm9sZCArPSAnXFxuJztcbiAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgIGNoID0gc291cmNlW29mZnNldCArIDFdO1xuICAgIH1cbiAgICBpZiAoIWZvbGQpXG4gICAgICAgIGZvbGQgPSAnICc7XG4gICAgcmV0dXJuIHsgZm9sZCwgb2Zmc2V0IH07XG59XG5jb25zdCBlc2NhcGVDb2RlcyA9IHtcbiAgICAnMCc6ICdcXDAnLFxuICAgIGE6ICdcXHgwNycsXG4gICAgYjogJ1xcYicsXG4gICAgZTogJ1xceDFiJyxcbiAgICBmOiAnXFxmJyxcbiAgICBuOiAnXFxuJyxcbiAgICByOiAnXFxyJyxcbiAgICB0OiAnXFx0JyxcbiAgICB2OiAnXFx2JyxcbiAgICBOOiAnXFx1MDA4NScsXG4gICAgXzogJ1xcdTAwYTAnLFxuICAgIEw6ICdcXHUyMDI4JyxcbiAgICBQOiAnXFx1MjAyOScsXG4gICAgJyAnOiAnICcsXG4gICAgJ1wiJzogJ1wiJyxcbiAgICAnLyc6ICcvJyxcbiAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICAnXFx0JzogJ1xcdCdcbn07XG5mdW5jdGlvbiBwYXJzZUNoYXJDb2RlKHNvdXJjZSwgb2Zmc2V0LCBsZW5ndGgsIG9uRXJyb3IpIHtcbiAgICBjb25zdCBjYyA9IHNvdXJjZS5zdWJzdHIob2Zmc2V0LCBsZW5ndGgpO1xuICAgIGNvbnN0IG9rID0gY2MubGVuZ3RoID09PSBsZW5ndGggJiYgL15bMC05YS1mQS1GXSskLy50ZXN0KGNjKTtcbiAgICBjb25zdCBjb2RlID0gb2sgPyBwYXJzZUludChjYywgMTYpIDogTmFOO1xuICAgIGlmIChpc05hTihjb2RlKSkge1xuICAgICAgICBjb25zdCByYXcgPSBzb3VyY2Uuc3Vic3RyKG9mZnNldCAtIDIsIGxlbmd0aCArIDIpO1xuICAgICAgICBvbkVycm9yKG9mZnNldCAtIDIsICdCQURfRFFfRVNDQVBFJywgYEludmFsaWQgZXNjYXBlIHNlcXVlbmNlICR7cmF3fWApO1xuICAgICAgICByZXR1cm4gcmF3O1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZSk7XG59XG5cbmZ1bmN0aW9uIGNvbXBvc2VTY2FsYXIoY3R4LCB0b2tlbiwgdGFnVG9rZW4sIG9uRXJyb3IpIHtcbiAgICBjb25zdCB7IHZhbHVlLCB0eXBlLCBjb21tZW50LCByYW5nZSB9ID0gdG9rZW4udHlwZSA9PT0gJ2Jsb2NrLXNjYWxhcidcbiAgICAgICAgPyByZXNvbHZlQmxvY2tTY2FsYXIodG9rZW4sIGN0eC5vcHRpb25zLnN0cmljdCwgb25FcnJvcilcbiAgICAgICAgOiByZXNvbHZlRmxvd1NjYWxhcih0b2tlbiwgY3R4Lm9wdGlvbnMuc3RyaWN0LCBvbkVycm9yKTtcbiAgICBjb25zdCB0YWdOYW1lID0gdGFnVG9rZW5cbiAgICAgICAgPyBjdHguZGlyZWN0aXZlcy50YWdOYW1lKHRhZ1Rva2VuLnNvdXJjZSwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpKVxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3QgdGFnID0gdGFnVG9rZW4gJiYgdGFnTmFtZVxuICAgICAgICA/IGZpbmRTY2FsYXJUYWdCeU5hbWUoY3R4LnNjaGVtYSwgdmFsdWUsIHRhZ05hbWUsIHRhZ1Rva2VuLCBvbkVycm9yKVxuICAgICAgICA6IHRva2VuLnR5cGUgPT09ICdzY2FsYXInXG4gICAgICAgICAgICA/IGZpbmRTY2FsYXJUYWdCeVRlc3QoY3R4LCB2YWx1ZSwgdG9rZW4sIG9uRXJyb3IpXG4gICAgICAgICAgICA6IGN0eC5zY2hlbWFbU0NBTEFSJDFdO1xuICAgIGxldCBzY2FsYXI7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gdGFnLnJlc29sdmUodmFsdWUsIG1zZyA9PiBvbkVycm9yKHRhZ1Rva2VuID8/IHRva2VuLCAnVEFHX1JFU09MVkVfRkFJTEVEJywgbXNnKSwgY3R4Lm9wdGlvbnMpO1xuICAgICAgICBzY2FsYXIgPSBpc1NjYWxhciQxKHJlcykgPyByZXMgOiBuZXcgU2NhbGFyKHJlcyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIG9uRXJyb3IodGFnVG9rZW4gPz8gdG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpO1xuICAgICAgICBzY2FsYXIgPSBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICB9XG4gICAgc2NhbGFyLnJhbmdlID0gcmFuZ2U7XG4gICAgc2NhbGFyLnNvdXJjZSA9IHZhbHVlO1xuICAgIGlmICh0eXBlKVxuICAgICAgICBzY2FsYXIudHlwZSA9IHR5cGU7XG4gICAgaWYgKHRhZ05hbWUpXG4gICAgICAgIHNjYWxhci50YWcgPSB0YWdOYW1lO1xuICAgIGlmICh0YWcuZm9ybWF0KVxuICAgICAgICBzY2FsYXIuZm9ybWF0ID0gdGFnLmZvcm1hdDtcbiAgICBpZiAoY29tbWVudClcbiAgICAgICAgc2NhbGFyLmNvbW1lbnQgPSBjb21tZW50O1xuICAgIHJldHVybiBzY2FsYXI7XG59XG5mdW5jdGlvbiBmaW5kU2NhbGFyVGFnQnlOYW1lKHNjaGVtYSwgdmFsdWUsIHRhZ05hbWUsIHRhZ1Rva2VuLCBvbkVycm9yKSB7XG4gICAgaWYgKHRhZ05hbWUgPT09ICchJylcbiAgICAgICAgcmV0dXJuIHNjaGVtYVtTQ0FMQVIkMV07IC8vIG5vbi1zcGVjaWZpYyB0YWdcbiAgICBjb25zdCBtYXRjaFdpdGhUZXN0ID0gW107XG4gICAgZm9yIChjb25zdCB0YWcgb2Ygc2NoZW1hLnRhZ3MpIHtcbiAgICAgICAgaWYgKCF0YWcuY29sbGVjdGlvbiAmJiB0YWcudGFnID09PSB0YWdOYW1lKSB7XG4gICAgICAgICAgICBpZiAodGFnLmRlZmF1bHQgJiYgdGFnLnRlc3QpXG4gICAgICAgICAgICAgICAgbWF0Y2hXaXRoVGVzdC5wdXNoKHRhZyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBtYXRjaFdpdGhUZXN0KVxuICAgICAgICBpZiAodGFnLnRlc3Q/LnRlc3QodmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICBjb25zdCBrdCA9IHNjaGVtYS5rbm93blRhZ3NbdGFnTmFtZV07XG4gICAgaWYgKGt0ICYmICFrdC5jb2xsZWN0aW9uKSB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBrbm93biB0YWcgaXMgYXZhaWxhYmxlIGZvciBzdHJpbmdpZnlpbmcsXG4gICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBnZXQgdXNlZCBieSBkZWZhdWx0LlxuICAgICAgICBzY2hlbWEudGFncy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGt0LCB7IGRlZmF1bHQ6IGZhbHNlLCB0ZXN0OiB1bmRlZmluZWQgfSkpO1xuICAgICAgICByZXR1cm4ga3Q7XG4gICAgfVxuICAgIG9uRXJyb3IodGFnVG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBgVW5yZXNvbHZlZCB0YWc6ICR7dGFnTmFtZX1gLCB0YWdOYW1lICE9PSAndGFnOnlhbWwub3JnLDIwMDI6c3RyJyk7XG4gICAgcmV0dXJuIHNjaGVtYVtTQ0FMQVIkMV07XG59XG5mdW5jdGlvbiBmaW5kU2NhbGFyVGFnQnlUZXN0KHsgZGlyZWN0aXZlcywgc2NoZW1hIH0sIHZhbHVlLCB0b2tlbiwgb25FcnJvcikge1xuICAgIGNvbnN0IHRhZyA9IHNjaGVtYS50YWdzLmZpbmQodGFnID0+IHRhZy5kZWZhdWx0ICYmIHRhZy50ZXN0Py50ZXN0KHZhbHVlKSkgfHwgc2NoZW1hW1NDQUxBUiQxXTtcbiAgICBpZiAoc2NoZW1hLmNvbXBhdCkge1xuICAgICAgICBjb25zdCBjb21wYXQgPSBzY2hlbWEuY29tcGF0LmZpbmQodGFnID0+IHRhZy5kZWZhdWx0ICYmIHRhZy50ZXN0Py50ZXN0KHZhbHVlKSkgPz9cbiAgICAgICAgICAgIHNjaGVtYVtTQ0FMQVIkMV07XG4gICAgICAgIGlmICh0YWcudGFnICE9PSBjb21wYXQudGFnKSB7XG4gICAgICAgICAgICBjb25zdCB0cyA9IGRpcmVjdGl2ZXMudGFnU3RyaW5nKHRhZy50YWcpO1xuICAgICAgICAgICAgY29uc3QgY3MgPSBkaXJlY3RpdmVzLnRhZ1N0cmluZyhjb21wYXQudGFnKTtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBWYWx1ZSBtYXkgYmUgcGFyc2VkIGFzIGVpdGhlciAke3RzfSBvciAke2NzfWA7XG4gICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVEFHX1JFU09MVkVfRkFJTEVEJywgbXNnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFnO1xufVxuXG5mdW5jdGlvbiBlbXB0eVNjYWxhclBvc2l0aW9uKG9mZnNldCwgYmVmb3JlLCBwb3MpIHtcbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAgIGlmIChwb3MgPT09IG51bGwpXG4gICAgICAgICAgICBwb3MgPSBiZWZvcmUubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gcG9zIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGxldCBzdCA9IGJlZm9yZVtpXTtcbiAgICAgICAgICAgIHN3aXRjaCAoc3QudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IHN0LnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHksIGFuIGVtcHR5IHNjYWxhciBpcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBub24tZW1wdHlcbiAgICAgICAgICAgIC8vIG5vZGUsIGJ1dCBpdCdzIG1vcmUgdXNlZnVsIHRvIHBsYWNlIGl0IGFmdGVyIGFueSB3aGl0ZXNwYWNlLlxuICAgICAgICAgICAgc3QgPSBiZWZvcmVbKytpXTtcbiAgICAgICAgICAgIHdoaWxlIChzdD8udHlwZSA9PT0gJ3NwYWNlJykge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBzdC5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHN0ID0gYmVmb3JlWysraV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5jb25zdCBDTiA9IHsgY29tcG9zZU5vZGUsIGNvbXBvc2VFbXB0eU5vZGUgfTtcbmZ1bmN0aW9uIGNvbXBvc2VOb2RlKGN0eCwgdG9rZW4sIHByb3BzLCBvbkVycm9yKSB7XG4gICAgY29uc3QgeyBzcGFjZUJlZm9yZSwgY29tbWVudCwgYW5jaG9yLCB0YWcgfSA9IHByb3BzO1xuICAgIGxldCBub2RlO1xuICAgIGxldCBpc1NyY1Rva2VuID0gdHJ1ZTtcbiAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICAgICAgbm9kZSA9IGNvbXBvc2VBbGlhcyhjdHgsIHRva2VuLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGlmIChhbmNob3IgfHwgdGFnKVxuICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdBTElBU19QUk9QUycsICdBbiBhbGlhcyBub2RlIG11c3Qgbm90IHNwZWNpZnkgYW55IHByb3BlcnRpZXMnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgIG5vZGUgPSBjb21wb3NlU2NhbGFyKGN0eCwgdG9rZW4sIHRhZywgb25FcnJvcik7XG4gICAgICAgICAgICBpZiAoYW5jaG9yKVxuICAgICAgICAgICAgICAgIG5vZGUuYW5jaG9yID0gYW5jaG9yLnNvdXJjZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzpcbiAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIG5vZGUgPSBjb21wb3NlQ29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgdGFnLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGlmIChhbmNob3IpXG4gICAgICAgICAgICAgICAgbm9kZS5hbmNob3IgPSBhbmNob3Iuc291cmNlLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdG9rZW4udHlwZSA9PT0gJ2Vycm9yJ1xuICAgICAgICAgICAgICAgID8gdG9rZW4ubWVzc2FnZVxuICAgICAgICAgICAgICAgIDogYFVuc3VwcG9ydGVkIHRva2VuICh0eXBlOiAke3Rva2VuLnR5cGV9KWA7XG4gICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnVU5FWFBFQ1RFRF9UT0tFTicsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgbm9kZSA9IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCB0b2tlbi5vZmZzZXQsIHVuZGVmaW5lZCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICAgICAgaXNTcmNUb2tlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhbmNob3IgJiYgbm9kZS5hbmNob3IgPT09ICcnKVxuICAgICAgICBvbkVycm9yKGFuY2hvciwgJ0JBRF9BTElBUycsICdBbmNob3IgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZycpO1xuICAgIGlmIChzcGFjZUJlZm9yZSlcbiAgICAgICAgbm9kZS5zcGFjZUJlZm9yZSA9IHRydWU7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdzY2FsYXInICYmIHRva2VuLnNvdXJjZSA9PT0gJycpXG4gICAgICAgICAgICBub2RlLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBub2RlLmNvbW1lbnRCZWZvcmUgPSBjb21tZW50O1xuICAgIH1cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFR5cGUgY2hlY2tpbmcgbWlzc2VzIG1lYW5pbmcgb2YgaXNTcmNUb2tlblxuICAgIGlmIChjdHgub3B0aW9ucy5rZWVwU291cmNlVG9rZW5zICYmIGlzU3JjVG9rZW4pXG4gICAgICAgIG5vZGUuc3JjVG9rZW4gPSB0b2tlbjtcbiAgICByZXR1cm4gbm9kZTtcbn1cbmZ1bmN0aW9uIGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBvZmZzZXQsIGJlZm9yZSwgcG9zLCB7IHNwYWNlQmVmb3JlLCBjb21tZW50LCBhbmNob3IsIHRhZyB9LCBvbkVycm9yKSB7XG4gICAgY29uc3QgdG9rZW4gPSB7XG4gICAgICAgIHR5cGU6ICdzY2FsYXInLFxuICAgICAgICBvZmZzZXQ6IGVtcHR5U2NhbGFyUG9zaXRpb24ob2Zmc2V0LCBiZWZvcmUsIHBvcyksXG4gICAgICAgIGluZGVudDogLTEsXG4gICAgICAgIHNvdXJjZTogJydcbiAgICB9O1xuICAgIGNvbnN0IG5vZGUgPSBjb21wb3NlU2NhbGFyKGN0eCwgdG9rZW4sIHRhZywgb25FcnJvcik7XG4gICAgaWYgKGFuY2hvcikge1xuICAgICAgICBub2RlLmFuY2hvciA9IGFuY2hvci5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICBpZiAobm9kZS5hbmNob3IgPT09ICcnKVxuICAgICAgICAgICAgb25FcnJvcihhbmNob3IsICdCQURfQUxJQVMnLCAnQW5jaG9yIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICB9XG4gICAgaWYgKHNwYWNlQmVmb3JlKVxuICAgICAgICBub2RlLnNwYWNlQmVmb3JlID0gdHJ1ZTtcbiAgICBpZiAoY29tbWVudClcbiAgICAgICAgbm9kZS5jb21tZW50ID0gY29tbWVudDtcbiAgICByZXR1cm4gbm9kZTtcbn1cbmZ1bmN0aW9uIGNvbXBvc2VBbGlhcyh7IG9wdGlvbnMgfSwgeyBvZmZzZXQsIHNvdXJjZSwgZW5kIH0sIG9uRXJyb3IpIHtcbiAgICBjb25zdCBhbGlhcyA9IG5ldyBBbGlhcyhzb3VyY2Uuc3Vic3RyaW5nKDEpKTtcbiAgICBpZiAoYWxpYXMuc291cmNlID09PSAnJylcbiAgICAgICAgb25FcnJvcihvZmZzZXQsICdCQURfQUxJQVMnLCAnQWxpYXMgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZycpO1xuICAgIGlmIChhbGlhcy5zb3VyY2UuZW5kc1dpdGgoJzonKSlcbiAgICAgICAgb25FcnJvcihvZmZzZXQgKyBzb3VyY2UubGVuZ3RoIC0gMSwgJ0JBRF9BTElBUycsICdBbGlhcyBlbmRpbmcgaW4gOiBpcyBhbWJpZ3VvdXMnLCB0cnVlKTtcbiAgICBjb25zdCB2YWx1ZUVuZCA9IG9mZnNldCArIHNvdXJjZS5sZW5ndGg7XG4gICAgY29uc3QgcmUgPSByZXNvbHZlRW5kKGVuZCwgdmFsdWVFbmQsIG9wdGlvbnMuc3RyaWN0LCBvbkVycm9yKTtcbiAgICBhbGlhcy5yYW5nZSA9IFtvZmZzZXQsIHZhbHVlRW5kLCByZS5vZmZzZXRdO1xuICAgIGlmIChyZS5jb21tZW50KVxuICAgICAgICBhbGlhcy5jb21tZW50ID0gcmUuY29tbWVudDtcbiAgICByZXR1cm4gYWxpYXM7XG59XG5cbmZ1bmN0aW9uIGNvbXBvc2VEb2Mob3B0aW9ucywgZGlyZWN0aXZlcywgeyBvZmZzZXQsIHN0YXJ0LCB2YWx1ZSwgZW5kIH0sIG9uRXJyb3IpIHtcbiAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7IF9kaXJlY3RpdmVzOiBkaXJlY3RpdmVzIH0sIG9wdGlvbnMpO1xuICAgIGNvbnN0IGRvYyA9IG5ldyBEb2N1bWVudCh1bmRlZmluZWQsIG9wdHMpO1xuICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgYXRSb290OiB0cnVlLFxuICAgICAgICBkaXJlY3RpdmVzOiBkb2MuZGlyZWN0aXZlcyxcbiAgICAgICAgb3B0aW9uczogZG9jLm9wdGlvbnMsXG4gICAgICAgIHNjaGVtYTogZG9jLnNjaGVtYVxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgaW5kaWNhdG9yOiAnZG9jLXN0YXJ0JyxcbiAgICAgICAgbmV4dDogdmFsdWUgPz8gZW5kPy5bMF0sXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb25FcnJvcixcbiAgICAgICAgc3RhcnRPbk5ld2xpbmU6IHRydWVcbiAgICB9KTtcbiAgICBpZiAocHJvcHMuZm91bmQpIHtcbiAgICAgICAgZG9jLmRpcmVjdGl2ZXMuZG9jU3RhcnQgPSB0cnVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgICh2YWx1ZS50eXBlID09PSAnYmxvY2stbWFwJyB8fCB2YWx1ZS50eXBlID09PSAnYmxvY2stc2VxJykgJiZcbiAgICAgICAgICAgICFwcm9wcy5oYXNOZXdsaW5lKVxuICAgICAgICAgICAgb25FcnJvcihwcm9wcy5lbmQsICdNSVNTSU5HX0NIQVInLCAnQmxvY2sgY29sbGVjdGlvbiBjYW5ub3Qgc3RhcnQgb24gc2FtZSBsaW5lIHdpdGggZGlyZWN0aXZlcy1lbmQgbWFya2VyJyk7XG4gICAgfVxuICAgIGRvYy5jb250ZW50cyA9IHZhbHVlXG4gICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgcHJvcHMsIG9uRXJyb3IpXG4gICAgICAgIDogY29tcG9zZUVtcHR5Tm9kZShjdHgsIHByb3BzLmVuZCwgc3RhcnQsIG51bGwsIHByb3BzLCBvbkVycm9yKTtcbiAgICBjb25zdCBjb250ZW50RW5kID0gZG9jLmNvbnRlbnRzLnJhbmdlWzJdO1xuICAgIGNvbnN0IHJlID0gcmVzb2x2ZUVuZChlbmQsIGNvbnRlbnRFbmQsIGZhbHNlLCBvbkVycm9yKTtcbiAgICBpZiAocmUuY29tbWVudClcbiAgICAgICAgZG9jLmNvbW1lbnQgPSByZS5jb21tZW50O1xuICAgIGRvYy5yYW5nZSA9IFtvZmZzZXQsIGNvbnRlbnRFbmQsIHJlLm9mZnNldF07XG4gICAgcmV0dXJuIGRvYztcbn1cblxuZnVuY3Rpb24gZ2V0RXJyb3JQb3Moc3JjKSB7XG4gICAgaWYgKHR5cGVvZiBzcmMgPT09ICdudW1iZXInKVxuICAgICAgICByZXR1cm4gW3NyYywgc3JjICsgMV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3JjKSlcbiAgICAgICAgcmV0dXJuIHNyYy5sZW5ndGggPT09IDIgPyBzcmMgOiBbc3JjWzBdLCBzcmNbMV1dO1xuICAgIGNvbnN0IHsgb2Zmc2V0LCBzb3VyY2UgfSA9IHNyYztcbiAgICByZXR1cm4gW29mZnNldCwgb2Zmc2V0ICsgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnID8gc291cmNlLmxlbmd0aCA6IDEpXTtcbn1cbmZ1bmN0aW9uIHBhcnNlUHJlbHVkZShwcmVsdWRlKSB7XG4gICAgbGV0IGNvbW1lbnQgPSAnJztcbiAgICBsZXQgYXRDb21tZW50ID0gZmFsc2U7XG4gICAgbGV0IGFmdGVyRW1wdHlMaW5lID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVsdWRlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHByZWx1ZGVbaV07XG4gICAgICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgICAgICBjYXNlICcjJzpcbiAgICAgICAgICAgICAgICBjb21tZW50ICs9XG4gICAgICAgICAgICAgICAgICAgIChjb21tZW50ID09PSAnJyA/ICcnIDogYWZ0ZXJFbXB0eUxpbmUgPyAnXFxuXFxuJyA6ICdcXG4nKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoc291cmNlLnN1YnN0cmluZygxKSB8fCAnICcpO1xuICAgICAgICAgICAgICAgIGF0Q29tbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYWZ0ZXJFbXB0eUxpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgICAgIGlmIChwcmVsdWRlW2kgKyAxXT8uWzBdICE9PSAnIycpXG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICBhdENvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBtYXkgYmUgd3JvbmcgYWZ0ZXIgZG9jLWVuZCwgYnV0IGluIHRoYXQgY2FzZSBpdCBkb2Vzbid0IG1hdHRlclxuICAgICAgICAgICAgICAgIGlmICghYXRDb21tZW50KVxuICAgICAgICAgICAgICAgICAgICBhZnRlckVtcHR5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYXRDb21tZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29tbWVudCwgYWZ0ZXJFbXB0eUxpbmUgfTtcbn1cbi8qKlxuICogQ29tcG9zZSBhIHN0cmVhbSBvZiBDU1Qgbm9kZXMgaW50byBhIHN0cmVhbSBvZiBZQU1MIERvY3VtZW50cy5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQ29tcG9zZXIsIFBhcnNlciB9IGZyb20gJ3lhbWwnXG4gKlxuICogY29uc3Qgc3JjOiBzdHJpbmcgPSAuLi5cbiAqIGNvbnN0IHRva2VucyA9IG5ldyBQYXJzZXIoKS5wYXJzZShzcmMpXG4gKiBjb25zdCBkb2NzID0gbmV3IENvbXBvc2VyKCkuY29tcG9zZSh0b2tlbnMpXG4gKiBgYGBcbiAqL1xuY2xhc3MgQ29tcG9zZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRvYyA9IG51bGw7XG4gICAgICAgIHRoaXMuYXREaXJlY3RpdmVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJlbHVkZSA9IFtdO1xuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgICB0aGlzLndhcm5pbmdzID0gW107XG4gICAgICAgIHRoaXMub25FcnJvciA9IChzb3VyY2UsIGNvZGUsIG1lc3NhZ2UsIHdhcm5pbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IGdldEVycm9yUG9zKHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAod2FybmluZylcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdzLnB1c2gobmV3IFlBTUxXYXJuaW5nKHBvcywgY29kZSwgbWVzc2FnZSkpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IFlBTUxQYXJzZUVycm9yKHBvcywgY29kZSwgbWVzc2FnZSkpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gbmV3IERpcmVjdGl2ZXMoeyB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gfHwgJzEuMicgfSk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIGRlY29yYXRlKGRvYywgYWZ0ZXJEb2MpIHtcbiAgICAgICAgY29uc3QgeyBjb21tZW50LCBhZnRlckVtcHR5TGluZSB9ID0gcGFyc2VQcmVsdWRlKHRoaXMucHJlbHVkZSk7XG4gICAgICAgIC8vY29uc29sZS5sb2coeyBkYzogZG9jLmNvbW1lbnQsIHByZWx1ZGUsIGNvbW1lbnQgfSlcbiAgICAgICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRjID0gZG9jLmNvbnRlbnRzO1xuICAgICAgICAgICAgaWYgKGFmdGVyRG9jKSB7XG4gICAgICAgICAgICAgICAgZG9jLmNvbW1lbnQgPSBkb2MuY29tbWVudCA/IGAke2RvYy5jb21tZW50fVxcbiR7Y29tbWVudH1gIDogY29tbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFmdGVyRW1wdHlMaW5lIHx8IGRvYy5kaXJlY3RpdmVzLmRvY1N0YXJ0IHx8ICFkYykge1xuICAgICAgICAgICAgICAgIGRvYy5jb21tZW50QmVmb3JlID0gY29tbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzQ29sbGVjdGlvbiQxKGRjKSAmJiAhZGMuZmxvdyAmJiBkYy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gZGMuaXRlbXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGlzUGFpcihpdCkpXG4gICAgICAgICAgICAgICAgICAgIGl0ID0gaXQua2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gaXQuY29tbWVudEJlZm9yZTtcbiAgICAgICAgICAgICAgICBpdC5jb21tZW50QmVmb3JlID0gY2IgPyBgJHtjb21tZW50fVxcbiR7Y2J9YCA6IGNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYiA9IGRjLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgICAgICAgICAgZGMuY29tbWVudEJlZm9yZSA9IGNiID8gYCR7Y29tbWVudH1cXG4ke2NifWAgOiBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhZnRlckRvYykge1xuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZG9jLmVycm9ycywgdGhpcy5lcnJvcnMpO1xuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZG9jLndhcm5pbmdzLCB0aGlzLndhcm5pbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRvYy5lcnJvcnMgPSB0aGlzLmVycm9ycztcbiAgICAgICAgICAgIGRvYy53YXJuaW5ncyA9IHRoaXMud2FybmluZ3M7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVsdWRlID0gW107XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgIHRoaXMud2FybmluZ3MgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3VycmVudCBzdHJlYW0gc3RhdHVzIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogTW9zdGx5IHVzZWZ1bCBhdCB0aGUgZW5kIG9mIGlucHV0IGZvciBhbiBlbXB0eSBzdHJlYW0uXG4gICAgICovXG4gICAgc3RyZWFtSW5mbygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcnNlUHJlbHVkZSh0aGlzLnByZWx1ZGUpLmNvbW1lbnQsXG4gICAgICAgICAgICBkaXJlY3RpdmVzOiB0aGlzLmRpcmVjdGl2ZXMsXG4gICAgICAgICAgICBlcnJvcnM6IHRoaXMuZXJyb3JzLFxuICAgICAgICAgICAgd2FybmluZ3M6IHRoaXMud2FybmluZ3NcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcG9zZSB0b2tlbnMgaW50byBkb2N1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9yY2VEb2MgLSBJZiB0aGUgc3RyZWFtIGNvbnRhaW5zIG5vIGRvY3VtZW50LCBzdGlsbCBlbWl0IGEgZmluYWwgZG9jdW1lbnQgaW5jbHVkaW5nIGFueSBjb21tZW50cyBhbmQgZGlyZWN0aXZlcyB0aGF0IHdvdWxkIGJlIGFwcGxpZWQgdG8gYSBzdWJzZXF1ZW50IGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBlbmRPZmZzZXQgLSBTaG91bGQgYmUgc2V0IGlmIGBmb3JjZURvY2AgaXMgYWxzbyBzZXQsIHRvIHNldCB0aGUgZG9jdW1lbnQgcmFuZ2UgZW5kIGFuZCB0byBpbmRpY2F0ZSBlcnJvcnMgY29ycmVjdGx5LlxuICAgICAqL1xuICAgICpjb21wb3NlKHRva2VucywgZm9yY2VEb2MgPSBmYWxzZSwgZW5kT2Zmc2V0ID0gLTEpIHtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpXG4gICAgICAgICAgICB5aWVsZCogdGhpcy5uZXh0KHRva2VuKTtcbiAgICAgICAgeWllbGQqIHRoaXMuZW5kKGZvcmNlRG9jLCBlbmRPZmZzZXQpO1xuICAgIH1cbiAgICAvKiogQWR2YW5jZSB0aGUgY29tcG9zZXIgYnkgb25lIENTVCB0b2tlbi4gKi9cbiAgICAqbmV4dCh0b2tlbikge1xuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RpcmVjdGl2ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLmFkZCh0b2tlbi5zb3VyY2UsIChvZmZzZXQsIG1lc3NhZ2UsIHdhcm5pbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zID0gZ2V0RXJyb3JQb3ModG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICBwb3NbMF0gKz0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IocG9zLCAnQkFEX0RJUkVDVElWRScsIG1lc3NhZ2UsIHdhcm5pbmcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucHJlbHVkZS5wdXNoKHRva2VuLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdERpcmVjdGl2ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZG9jdW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG9jID0gY29tcG9zZURvYyh0aGlzLm9wdGlvbnMsIHRoaXMuZGlyZWN0aXZlcywgdG9rZW4sIHRoaXMub25FcnJvcik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXREaXJlY3RpdmVzICYmICFkb2MuZGlyZWN0aXZlcy5kb2NTdGFydClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKHRva2VuLCAnTUlTU0lOR19DSEFSJywgJ01pc3NpbmcgZGlyZWN0aXZlcy1lbmQvZG9jLXN0YXJ0IGluZGljYXRvciBsaW5lJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvcmF0ZShkb2MsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kb2MpXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuZG9jO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICAgICAgICAgIHRoaXMuYXREaXJlY3RpdmVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdieXRlLW9yZGVyLW1hcmsnOlxuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICB0aGlzLnByZWx1ZGUucHVzaCh0b2tlbi5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gdG9rZW4uc291cmNlXG4gICAgICAgICAgICAgICAgICAgID8gYCR7dG9rZW4ubWVzc2FnZX06ICR7SlNPTi5zdHJpbmdpZnkodG9rZW4uc291cmNlKX1gXG4gICAgICAgICAgICAgICAgICAgIDogdG9rZW4ubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBZQU1MUGFyc2VFcnJvcihnZXRFcnJvclBvcyh0b2tlbiksICdVTkVYUEVDVEVEX1RPS0VOJywgbXNnKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdERpcmVjdGl2ZXMgfHwgIXRoaXMuZG9jKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2RvYy1lbmQnOiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRvYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAnVW5leHBlY3RlZCBkb2MtZW5kIHdpdGhvdXQgcHJlY2VkaW5nIGRvY3VtZW50JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgWUFNTFBhcnNlRXJyb3IoZ2V0RXJyb3JQb3ModG9rZW4pLCAnVU5FWFBFQ1RFRF9UT0tFTicsIG1zZykpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5kb2MuZGlyZWN0aXZlcy5kb2NFbmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IHJlc29sdmVFbmQodG9rZW4uZW5kLCB0b2tlbi5vZmZzZXQgKyB0b2tlbi5zb3VyY2UubGVuZ3RoLCB0aGlzLmRvYy5vcHRpb25zLnN0cmljdCwgdGhpcy5vbkVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRlKHRoaXMuZG9jLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGMgPSB0aGlzLmRvYy5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvYy5jb21tZW50ID0gZGMgPyBgJHtkY31cXG4ke2VuZC5jb21tZW50fWAgOiBlbmQuY29tbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5kb2MucmFuZ2VbMl0gPSBlbmQub2Zmc2V0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBZQU1MUGFyc2VFcnJvcihnZXRFcnJvclBvcyh0b2tlbiksICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuc3VwcG9ydGVkIHRva2VuICR7dG9rZW4udHlwZX1gKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBhdCBlbmQgb2YgaW5wdXQgdG8geWllbGQgYW55IHJlbWFpbmluZyBkb2N1bWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JjZURvYyAtIElmIHRoZSBzdHJlYW0gY29udGFpbnMgbm8gZG9jdW1lbnQsIHN0aWxsIGVtaXQgYSBmaW5hbCBkb2N1bWVudCBpbmNsdWRpbmcgYW55IGNvbW1lbnRzIGFuZCBkaXJlY3RpdmVzIHRoYXQgd291bGQgYmUgYXBwbGllZCB0byBhIHN1YnNlcXVlbnQgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIGVuZE9mZnNldCAtIFNob3VsZCBiZSBzZXQgaWYgYGZvcmNlRG9jYCBpcyBhbHNvIHNldCwgdG8gc2V0IHRoZSBkb2N1bWVudCByYW5nZSBlbmQgYW5kIHRvIGluZGljYXRlIGVycm9ycyBjb3JyZWN0bHkuXG4gICAgICovXG4gICAgKmVuZChmb3JjZURvYyA9IGZhbHNlLCBlbmRPZmZzZXQgPSAtMSkge1xuICAgICAgICBpZiAodGhpcy5kb2MpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb3JhdGUodGhpcy5kb2MsIHRydWUpO1xuICAgICAgICAgICAgeWllbGQgdGhpcy5kb2M7XG4gICAgICAgICAgICB0aGlzLmRvYyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZm9yY2VEb2MpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHsgX2RpcmVjdGl2ZXM6IHRoaXMuZGlyZWN0aXZlcyB9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgZG9jID0gbmV3IERvY3VtZW50KHVuZGVmaW5lZCwgb3B0cyk7XG4gICAgICAgICAgICBpZiAodGhpcy5hdERpcmVjdGl2ZXMpXG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVuZE9mZnNldCwgJ01JU1NJTkdfQ0hBUicsICdNaXNzaW5nIGRpcmVjdGl2ZXMtZW5kIGluZGljYXRvciBsaW5lJyk7XG4gICAgICAgICAgICBkb2MucmFuZ2UgPSBbMCwgZW5kT2Zmc2V0LCBlbmRPZmZzZXRdO1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0ZShkb2MsIGZhbHNlKTtcbiAgICAgICAgICAgIHlpZWxkIGRvYztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFzU2NhbGFyKHRva2VuLCBzdHJpY3QgPSB0cnVlLCBvbkVycm9yKSB7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICAgIGNvbnN0IF9vbkVycm9yID0gKHBvcywgY29kZSwgbWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHlwZW9mIHBvcyA9PT0gJ251bWJlcicgPyBwb3MgOiBBcnJheS5pc0FycmF5KHBvcykgPyBwb3NbMF0gOiBwb3Mub2Zmc2V0O1xuICAgICAgICAgICAgaWYgKG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsIGNvZGUsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZQU1MUGFyc2VFcnJvcihbb2Zmc2V0LCBvZmZzZXQgKyAxXSwgY29kZSwgbWVzc2FnZSk7XG4gICAgICAgIH07XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUZsb3dTY2FsYXIodG9rZW4sIHN0cmljdCwgX29uRXJyb3IpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUJsb2NrU2NhbGFyKHRva2VuLCBzdHJpY3QsIF9vbkVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHNjYWxhciB0b2tlbiB3aXRoIGB2YWx1ZWBcbiAqXG4gKiBWYWx1ZXMgdGhhdCByZXByZXNlbnQgYW4gYWN0dWFsIHN0cmluZyBidXQgbWF5IGJlIHBhcnNlZCBhcyBhIGRpZmZlcmVudCB0eXBlIHNob3VsZCB1c2UgYSBgdHlwZWAgb3RoZXIgdGhhbiBgJ1BMQUlOJ2AsXG4gKiBhcyB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgYW55IHNjaGVtYSBvcGVyYXRpb25zIGFuZCB3b24ndCBjaGVjayBmb3Igc3VjaCBjb25mbGljdHMuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLCB3aGljaCB3aWxsIGhhdmUgaXRzIGNvbnRlbnQgcHJvcGVybHkgaW5kZW50ZWQuXG4gKiBAcGFyYW0gY29udGV4dC5lbmQgQ29tbWVudHMgYW5kIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdmFsdWUsIG9yIGFmdGVyIHRoZSBibG9jayBzY2FsYXIgaGVhZGVyLiBJZiB1bmRlZmluZWQsIGEgbmV3bGluZSB3aWxsIGJlIGFkZGVkLlxuICogQHBhcmFtIGNvbnRleHQuaW1wbGljaXRLZXkgQmVpbmcgd2l0aGluIGFuIGltcGxpY2l0IGtleSBtYXkgYWZmZWN0IHRoZSByZXNvbHZlZCB0eXBlIG9mIHRoZSB0b2tlbidzIHZhbHVlLlxuICogQHBhcmFtIGNvbnRleHQuaW5kZW50IFRoZSBpbmRlbnQgbGV2ZWwgb2YgdGhlIHRva2VuLlxuICogQHBhcmFtIGNvbnRleHQuaW5GbG93IElzIHRoaXMgc2NhbGFyIHdpdGhpbiBhIGZsb3cgY29sbGVjdGlvbj8gVGhpcyBtYXkgYWZmZWN0IHRoZSByZXNvbHZlZCB0eXBlIG9mIHRoZSB0b2tlbidzIHZhbHVlLlxuICogQHBhcmFtIGNvbnRleHQub2Zmc2V0IFRoZSBvZmZzZXQgcG9zaXRpb24gb2YgdGhlIHRva2VuLlxuICogQHBhcmFtIGNvbnRleHQudHlwZSBUaGUgcHJlZmVycmVkIHR5cGUgb2YgdGhlIHNjYWxhciB0b2tlbi4gSWYgdW5kZWZpbmVkLCB0aGUgcHJldmlvdXMgdHlwZSBvZiB0aGUgYHRva2VuYCB3aWxsIGJlIHVzZWQsIGRlZmF1bHRpbmcgdG8gYCdQTEFJTidgLlxuICovXG5mdW5jdGlvbiBjcmVhdGVTY2FsYXJUb2tlbih2YWx1ZSwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgaW1wbGljaXRLZXkgPSBmYWxzZSwgaW5kZW50LCBpbkZsb3cgPSBmYWxzZSwgb2Zmc2V0ID0gLTEsIHR5cGUgPSAnUExBSU4nIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0cmluZ2lmeVN0cmluZyh7IHR5cGUsIHZhbHVlIH0sIHtcbiAgICAgICAgaW1wbGljaXRLZXksXG4gICAgICAgIGluZGVudDogaW5kZW50ID4gMCA/ICcgJy5yZXBlYXQoaW5kZW50KSA6ICcnLFxuICAgICAgICBpbkZsb3csXG4gICAgICAgIG9wdGlvbnM6IHsgYmxvY2tRdW90ZTogdHJ1ZSwgbGluZVdpZHRoOiAtMSB9XG4gICAgfSk7XG4gICAgY29uc3QgZW5kID0gY29udGV4dC5lbmQgPz8gW1xuICAgICAgICB7IHR5cGU6ICduZXdsaW5lJywgb2Zmc2V0OiAtMSwgaW5kZW50LCBzb3VyY2U6ICdcXG4nIH1cbiAgICBdO1xuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICBjYXNlICc+Jzoge1xuICAgICAgICAgICAgY29uc3QgaGUgPSBzb3VyY2UuaW5kZXhPZignXFxuJyk7XG4gICAgICAgICAgICBjb25zdCBoZWFkID0gc291cmNlLnN1YnN0cmluZygwLCBoZSk7XG4gICAgICAgICAgICBjb25zdCBib2R5ID0gc291cmNlLnN1YnN0cmluZyhoZSArIDEpICsgJ1xcbic7XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IFtcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdibG9jay1zY2FsYXItaGVhZGVyJywgb2Zmc2V0LCBpbmRlbnQsIHNvdXJjZTogaGVhZCB9XG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKCFhZGRFbmR0b0Jsb2NrUHJvcHMocHJvcHMsIGVuZCkpXG4gICAgICAgICAgICAgICAgcHJvcHMucHVzaCh7IHR5cGU6ICduZXdsaW5lJywgb2Zmc2V0OiAtMSwgaW5kZW50LCBzb3VyY2U6ICdcXG4nIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2Jsb2NrLXNjYWxhcicsIG9mZnNldCwgaW5kZW50LCBwcm9wcywgc291cmNlOiBib2R5IH07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJywgb2Zmc2V0LCBpbmRlbnQsIHNvdXJjZSwgZW5kIH07XG4gICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2luZ2xlLXF1b3RlZC1zY2FsYXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlLCBlbmQgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdzY2FsYXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlLCBlbmQgfTtcbiAgICB9XG59XG4vKipcbiAqIFNldCB0aGUgdmFsdWUgb2YgYHRva2VuYCB0byB0aGUgZ2l2ZW4gc3RyaW5nIGB2YWx1ZWAsIG92ZXJ3cml0aW5nIGFueSBwcmV2aW91cyBjb250ZW50cyBhbmQgdHlwZSB0aGF0IGl0IG1heSBoYXZlLlxuICpcbiAqIEJlc3QgZWZmb3J0cyBhcmUgbWFkZSB0byByZXRhaW4gYW55IGNvbW1lbnRzIHByZXZpb3VzbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdG9rZW5gLFxuICogdGhvdWdoIGFsbCBjb250ZW50cyB3aXRoaW4gYSBjb2xsZWN0aW9uJ3MgYGl0ZW1zYCB3aWxsIGJlIG92ZXJ3cml0dGVuLlxuICpcbiAqIFZhbHVlcyB0aGF0IHJlcHJlc2VudCBhbiBhY3R1YWwgc3RyaW5nIGJ1dCBtYXkgYmUgcGFyc2VkIGFzIGEgZGlmZmVyZW50IHR5cGUgc2hvdWxkIHVzZSBhIGB0eXBlYCBvdGhlciB0aGFuIGAnUExBSU4nYCxcbiAqIGFzIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBhbnkgc2NoZW1hIG9wZXJhdGlvbnMgYW5kIHdvbid0IGNoZWNrIGZvciBzdWNoIGNvbmZsaWN0cy5cbiAqXG4gKiBAcGFyYW0gdG9rZW4gQW55IHRva2VuLiBJZiBpdCBkb2VzIG5vdCBpbmNsdWRlIGFuIGBpbmRlbnRgIHZhbHVlLCB0aGUgdmFsdWUgd2lsbCBiZSBzdHJpbmdpZmllZCBhcyBpZiBpdCB3ZXJlIGFuIGltcGxpY2l0IGtleS5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSwgd2hpY2ggd2lsbCBoYXZlIGl0cyBjb250ZW50IHByb3Blcmx5IGluZGVudGVkLlxuICogQHBhcmFtIGNvbnRleHQuYWZ0ZXJLZXkgSW4gbW9zdCBjYXNlcywgdmFsdWVzIGFmdGVyIGEga2V5IHNob3VsZCBoYXZlIGFuIGFkZGl0aW9uYWwgbGV2ZWwgb2YgaW5kZW50YXRpb24uXG4gKiBAcGFyYW0gY29udGV4dC5pbXBsaWNpdEtleSBCZWluZyB3aXRoaW4gYW4gaW1wbGljaXQga2V5IG1heSBhZmZlY3QgdGhlIHJlc29sdmVkIHR5cGUgb2YgdGhlIHRva2VuJ3MgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dC5pbkZsb3cgQmVpbmcgd2l0aGluIGEgZmxvdyBjb2xsZWN0aW9uIG1heSBhZmZlY3QgdGhlIHJlc29sdmVkIHR5cGUgb2YgdGhlIHRva2VuJ3MgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dC50eXBlIFRoZSBwcmVmZXJyZWQgdHlwZSBvZiB0aGUgc2NhbGFyIHRva2VuLiBJZiB1bmRlZmluZWQsIHRoZSBwcmV2aW91cyB0eXBlIG9mIHRoZSBgdG9rZW5gIHdpbGwgYmUgdXNlZCwgZGVmYXVsdGluZyB0byBgJ1BMQUlOJ2AuXG4gKi9cbmZ1bmN0aW9uIHNldFNjYWxhclZhbHVlKHRva2VuLCB2YWx1ZSwgY29udGV4dCA9IHt9KSB7XG4gICAgbGV0IHsgYWZ0ZXJLZXkgPSBmYWxzZSwgaW1wbGljaXRLZXkgPSBmYWxzZSwgaW5GbG93ID0gZmFsc2UsIHR5cGUgfSA9IGNvbnRleHQ7XG4gICAgbGV0IGluZGVudCA9ICdpbmRlbnQnIGluIHRva2VuID8gdG9rZW4uaW5kZW50IDogbnVsbDtcbiAgICBpZiAoYWZ0ZXJLZXkgJiYgdHlwZW9mIGluZGVudCA9PT0gJ251bWJlcicpXG4gICAgICAgIGluZGVudCArPSAyO1xuICAgIGlmICghdHlwZSlcbiAgICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdRVU9URV9TSU5HTEUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHR5cGUgPSAnUVVPVEVfRE9VQkxFJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhcic6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSB0b2tlbi5wcm9wc1swXTtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLnR5cGUgIT09ICdibG9jay1zY2FsYXItaGVhZGVyJylcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJsb2NrIHNjYWxhciBoZWFkZXInKTtcbiAgICAgICAgICAgICAgICB0eXBlID0gaGVhZGVyLnNvdXJjZVswXSA9PT0gJz4nID8gJ0JMT0NLX0ZPTERFRCcgOiAnQkxPQ0tfTElURVJBTCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHR5cGUgPSAnUExBSU4nO1xuICAgICAgICB9XG4gICAgY29uc3Qgc291cmNlID0gc3RyaW5naWZ5U3RyaW5nKHsgdHlwZSwgdmFsdWUgfSwge1xuICAgICAgICBpbXBsaWNpdEtleTogaW1wbGljaXRLZXkgfHwgaW5kZW50ID09PSBudWxsLFxuICAgICAgICBpbmRlbnQ6IGluZGVudCAhPT0gbnVsbCAmJiBpbmRlbnQgPiAwID8gJyAnLnJlcGVhdChpbmRlbnQpIDogJycsXG4gICAgICAgIGluRmxvdyxcbiAgICAgICAgb3B0aW9uczogeyBibG9ja1F1b3RlOiB0cnVlLCBsaW5lV2lkdGg6IC0xIH1cbiAgICB9KTtcbiAgICBzd2l0Y2ggKHNvdXJjZVswXSkge1xuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICBzZXRCbG9ja1NjYWxhclZhbHVlKHRva2VuLCBzb3VyY2UpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIHNldEZsb3dTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlLCAnZG91YmxlLXF1b3RlZC1zY2FsYXInKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgc2V0Rmxvd1NjYWxhclZhbHVlKHRva2VuLCBzb3VyY2UsICdzaW5nbGUtcXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzZXRGbG93U2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSwgJ3NjYWxhcicpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldEJsb2NrU2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSkge1xuICAgIGNvbnN0IGhlID0gc291cmNlLmluZGV4T2YoJ1xcbicpO1xuICAgIGNvbnN0IGhlYWQgPSBzb3VyY2Uuc3Vic3RyaW5nKDAsIGhlKTtcbiAgICBjb25zdCBib2R5ID0gc291cmNlLnN1YnN0cmluZyhoZSArIDEpICsgJ1xcbic7XG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHRva2VuLnByb3BzWzBdO1xuICAgICAgICBpZiAoaGVhZGVyLnR5cGUgIT09ICdibG9jay1zY2FsYXItaGVhZGVyJylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBibG9jayBzY2FsYXIgaGVhZGVyJyk7XG4gICAgICAgIGhlYWRlci5zb3VyY2UgPSBoZWFkO1xuICAgICAgICB0b2tlbi5zb3VyY2UgPSBib2R5O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBvZmZzZXQgfSA9IHRva2VuO1xuICAgICAgICBjb25zdCBpbmRlbnQgPSAnaW5kZW50JyBpbiB0b2tlbiA/IHRva2VuLmluZGVudCA6IC0xO1xuICAgICAgICBjb25zdCBwcm9wcyA9IFtcbiAgICAgICAgICAgIHsgdHlwZTogJ2Jsb2NrLXNjYWxhci1oZWFkZXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlOiBoZWFkIH1cbiAgICAgICAgXTtcbiAgICAgICAgaWYgKCFhZGRFbmR0b0Jsb2NrUHJvcHMocHJvcHMsICdlbmQnIGluIHRva2VuID8gdG9rZW4uZW5kIDogdW5kZWZpbmVkKSlcbiAgICAgICAgICAgIHByb3BzLnB1c2goeyB0eXBlOiAnbmV3bGluZScsIG9mZnNldDogLTEsIGluZGVudCwgc291cmNlOiAnXFxuJyB9KTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModG9rZW4pKVxuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ3R5cGUnICYmIGtleSAhPT0gJ29mZnNldCcpXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuW2tleV07XG4gICAgICAgIE9iamVjdC5hc3NpZ24odG9rZW4sIHsgdHlwZTogJ2Jsb2NrLXNjYWxhcicsIGluZGVudCwgcHJvcHMsIHNvdXJjZTogYm9keSB9KTtcbiAgICB9XG59XG4vKiogQHJldHVybnMgYHRydWVgIGlmIGxhc3QgdG9rZW4gaXMgYSBuZXdsaW5lICovXG5mdW5jdGlvbiBhZGRFbmR0b0Jsb2NrUHJvcHMocHJvcHMsIGVuZCkge1xuICAgIGlmIChlbmQpXG4gICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgZW5kKVxuICAgICAgICAgICAgc3dpdGNoIChzdC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHN0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goc3QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzZXRGbG93U2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSwgdHlwZSkge1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIHRva2VuLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgdG9rZW4uc291cmNlID0gc291cmNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhcic6IHtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRva2VuLnByb3BzLnNsaWNlKDEpO1xuICAgICAgICAgICAgbGV0IG9hID0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICh0b2tlbi5wcm9wc1swXS50eXBlID09PSAnYmxvY2stc2NhbGFyLWhlYWRlcicpXG4gICAgICAgICAgICAgICAgb2EgLT0gdG9rZW4ucHJvcHNbMF0uc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdG9rIG9mIGVuZClcbiAgICAgICAgICAgICAgICB0b2sub2Zmc2V0ICs9IG9hO1xuICAgICAgICAgICAgZGVsZXRlIHRva2VuLnByb3BzO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0b2tlbiwgeyB0eXBlLCBzb3VyY2UsIGVuZCB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Jsb2NrLW1hcCc6XG4gICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHRva2VuLm9mZnNldCArIHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBubCA9IHsgdHlwZTogJ25ld2xpbmUnLCBvZmZzZXQsIGluZGVudDogdG9rZW4uaW5kZW50LCBzb3VyY2U6ICdcXG4nIH07XG4gICAgICAgICAgICBkZWxldGUgdG9rZW4uaXRlbXM7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRva2VuLCB7IHR5cGUsIHNvdXJjZSwgZW5kOiBbbmxdIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc3QgaW5kZW50ID0gJ2luZGVudCcgaW4gdG9rZW4gPyB0b2tlbi5pbmRlbnQgOiAtMTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9ICdlbmQnIGluIHRva2VuICYmIEFycmF5LmlzQXJyYXkodG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgID8gdG9rZW4uZW5kLmZpbHRlcihzdCA9PiBzdC50eXBlID09PSAnc3BhY2UnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0LnR5cGUgPT09ICdjb21tZW50JyB8fFxuICAgICAgICAgICAgICAgICAgICBzdC50eXBlID09PSAnbmV3bGluZScpXG4gICAgICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRva2VuKSlcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScgJiYga2V5ICE9PSAnb2Zmc2V0JylcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRva2VuW2tleV07XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRva2VuLCB7IHR5cGUsIGluZGVudCwgc291cmNlLCBlbmQgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogU3RyaW5naWZ5IGEgQ1NUIGRvY3VtZW50LCB0b2tlbiwgb3IgY29sbGVjdGlvbiBpdGVtXG4gKlxuICogRmFpciB3YXJuaW5nOiBUaGlzIGFwcGxpZXMgbm8gdmFsaWRhdGlvbiB3aGF0c29ldmVyLCBhbmRcbiAqIHNpbXBseSBjb25jYXRlbmF0ZXMgdGhlIHNvdXJjZXMgaW4gdGhlaXIgbG9naWNhbCBvcmRlci5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5JDEgPSAoY3N0KSA9PiAndHlwZScgaW4gY3N0ID8gc3RyaW5naWZ5VG9rZW4oY3N0KSA6IHN0cmluZ2lmeUl0ZW0oY3N0KTtcbmZ1bmN0aW9uIHN0cmluZ2lmeVRva2VuKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhcic6IHtcbiAgICAgICAgICAgIGxldCByZXMgPSAnJztcbiAgICAgICAgICAgIGZvciAoY29uc3QgdG9rIG9mIHRva2VuLnByb3BzKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzdHJpbmdpZnlUb2tlbih0b2spO1xuICAgICAgICAgICAgcmV0dXJuIHJlcyArIHRva2VuLnNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdibG9jay1tYXAnOlxuICAgICAgICBjYXNlICdibG9jay1zZXEnOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdG9rZW4uaXRlbXMpXG4gICAgICAgICAgICAgICAgcmVzICs9IHN0cmluZ2lmeUl0ZW0oaXRlbSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6IHtcbiAgICAgICAgICAgIGxldCByZXMgPSB0b2tlbi5zdGFydC5zb3VyY2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdG9rZW4uaXRlbXMpXG4gICAgICAgICAgICAgICAgcmVzICs9IHN0cmluZ2lmeUl0ZW0oaXRlbSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2N1bWVudCc6IHtcbiAgICAgICAgICAgIGxldCByZXMgPSBzdHJpbmdpZnlJdGVtKHRva2VuKTtcbiAgICAgICAgICAgIGlmICh0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiB0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSBzdC5zb3VyY2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGxldCByZXMgPSB0b2tlbi5zb3VyY2U7XG4gICAgICAgICAgICBpZiAoJ2VuZCcgaW4gdG9rZW4gJiYgdG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgdG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeUl0ZW0oeyBzdGFydCwga2V5LCBzZXAsIHZhbHVlIH0pIHtcbiAgICBsZXQgcmVzID0gJyc7XG4gICAgZm9yIChjb25zdCBzdCBvZiBzdGFydClcbiAgICAgICAgcmVzICs9IHN0LnNvdXJjZTtcbiAgICBpZiAoa2V5KVxuICAgICAgICByZXMgKz0gc3RyaW5naWZ5VG9rZW4oa2V5KTtcbiAgICBpZiAoc2VwKVxuICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIHNlcClcbiAgICAgICAgICAgIHJlcyArPSBzdC5zb3VyY2U7XG4gICAgaWYgKHZhbHVlKVxuICAgICAgICByZXMgKz0gc3RyaW5naWZ5VG9rZW4odmFsdWUpO1xuICAgIHJldHVybiByZXM7XG59XG5cbmNvbnN0IEJSRUFLID0gU3ltYm9sKCdicmVhayB2aXNpdCcpO1xuY29uc3QgU0tJUCA9IFN5bWJvbCgnc2tpcCBjaGlsZHJlbicpO1xuY29uc3QgUkVNT1ZFID0gU3ltYm9sKCdyZW1vdmUgaXRlbScpO1xuLyoqXG4gKiBBcHBseSBhIHZpc2l0b3IgdG8gYSBDU1QgZG9jdW1lbnQgb3IgaXRlbS5cbiAqXG4gKiBXYWxrcyB0aHJvdWdoIHRoZSB0cmVlIChkZXB0aC1maXJzdCkgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCwgY2FsbGluZyBhXG4gKiBgdmlzaXRvcmAgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzIHdoZW4gZW50ZXJpbmcgZWFjaCBpdGVtOlxuICogICAtIGBpdGVtYDogVGhlIGN1cnJlbnQgaXRlbSwgd2hpY2ggaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBtZW1iZXJzOlxuICogICAgIC0gYHN0YXJ0OiBTb3VyY2VUb2tlbltdYCBcdTIwMTMgU291cmNlIHRva2VucyBiZWZvcmUgdGhlIGtleSBvciB2YWx1ZSxcbiAqICAgICAgIHBvc3NpYmx5IGluY2x1ZGluZyBpdHMgYW5jaG9yIG9yIHRhZy5cbiAqICAgICAtIGBrZXk/OiBUb2tlbiB8IG51bGxgIFx1MjAxMyBTZXQgZm9yIHBhaXIgdmFsdWVzLiBNYXkgdGhlbiBiZSBgbnVsbGAsIGlmXG4gKiAgICAgICB0aGUga2V5IGJlZm9yZSB0aGUgYDpgIHNlcGFyYXRvciBpcyBlbXB0eS5cbiAqICAgICAtIGBzZXA/OiBTb3VyY2VUb2tlbltdYCBcdTIwMTMgU291cmNlIHRva2VucyBiZXR3ZWVuIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSxcbiAqICAgICAgIHdoaWNoIHNob3VsZCBpbmNsdWRlIHRoZSBgOmAgbWFwIHZhbHVlIGluZGljYXRvciBpZiBgdmFsdWVgIGlzIHNldC5cbiAqICAgICAtIGB2YWx1ZT86IFRva2VuYCBcdTIwMTMgVGhlIHZhbHVlIG9mIGEgc2VxdWVuY2UgaXRlbSwgb3Igb2YgYSBtYXAgcGFpci5cbiAqICAgLSBgcGF0aGA6IFRoZSBzdGVwcyBmcm9tIHRoZSByb290IHRvIHRoZSBjdXJyZW50IG5vZGUsIGFzIGFuIGFycmF5IG9mXG4gKiAgICAgYFsna2V5JyB8ICd2YWx1ZScsIG51bWJlcl1gIHR1cGxlcy5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB2aXNpdG9yIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHRyYXZlcnNhbDpcbiAqICAgLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IERvIG5vdGhpbmcgYW5kIGNvbnRpbnVlXG4gKiAgIC0gYHZpc2l0LlNLSVBgOiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoaXMgdG9rZW4sIGNvbnRpbnVlIHdpdGhcbiAqICAgICAgbmV4dCBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBpdGVtLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYG51bWJlcmA6IFNldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgc3RlcC4gVGhpcyBpcyB1c2VmdWwgZXNwZWNpYWxseSBpZlxuICogICAgIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCB0b2tlbiBoYXMgY2hhbmdlZC5cbiAqICAgLSBgZnVuY3Rpb25gOiBEZWZpbmUgdGhlIG5leHQgdmlzaXRvciBmb3IgdGhpcyBpdGVtLiBBZnRlciB0aGUgb3JpZ2luYWxcbiAqICAgICB2aXNpdG9yIGlzIGNhbGxlZCBvbiBpdGVtIGVudHJ5LCBuZXh0IHZpc2l0b3JzIGFyZSBjYWxsZWQgYWZ0ZXIgaGFuZGxpbmdcbiAqICAgICBhIG5vbi1lbXB0eSBga2V5YCBhbmQgd2hlbiBleGl0aW5nIHRoZSBpdGVtLlxuICovXG5mdW5jdGlvbiB2aXNpdChjc3QsIHZpc2l0b3IpIHtcbiAgICBpZiAoJ3R5cGUnIGluIGNzdCAmJiBjc3QudHlwZSA9PT0gJ2RvY3VtZW50JylcbiAgICAgICAgY3N0ID0geyBzdGFydDogY3N0LnN0YXJ0LCB2YWx1ZTogY3N0LnZhbHVlIH07XG4gICAgX3Zpc2l0KE9iamVjdC5mcmVlemUoW10pLCBjc3QsIHZpc2l0b3IpO1xufVxuLy8gV2l0aG91dCB0aGUgYGFzIHN5bWJvbGAgY2FzdHMsIFRTIGRlY2xhcmVzIHRoZXNlIGluIHRoZSBgdmlzaXRgXG4vLyBuYW1lc3BhY2UgdXNpbmcgYHZhcmAsIGJ1dCB0aGVuIGNvbXBsYWlucyBhYm91dCB0aGF0IGJlY2F1c2Vcbi8vIGB1bmlxdWUgc3ltYm9sYCBtdXN0IGJlIGBjb25zdGAuXG4vKiogVGVybWluYXRlIHZpc2l0IHRyYXZlcnNhbCBjb21wbGV0ZWx5ICovXG52aXNpdC5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgaXRlbSAqL1xudmlzaXQuU0tJUCA9IFNLSVA7XG4vKiogUmVtb3ZlIHRoZSBjdXJyZW50IGl0ZW0gKi9cbnZpc2l0LlJFTU9WRSA9IFJFTU9WRTtcbi8qKiBGaW5kIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290ICovXG52aXNpdC5pdGVtQXRQYXRoID0gKGNzdCwgcGF0aCkgPT4ge1xuICAgIGxldCBpdGVtID0gY3N0O1xuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBpbmRleF0gb2YgcGF0aCkge1xuICAgICAgICBjb25zdCB0b2sgPSBpdGVtPy5bZmllbGRdO1xuICAgICAgICBpZiAodG9rICYmICdpdGVtcycgaW4gdG9rKSB7XG4gICAgICAgICAgICBpdGVtID0gdG9rLml0ZW1zW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbn07XG4vKipcbiAqIEdldCB0aGUgaW1tZWRpYXRlIHBhcmVudCBjb2xsZWN0aW9uIG9mIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290LlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgY29sbGVjdGlvbiBpcyBub3QgZm91bmQsIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgdGhlIGl0ZW0gaXRzZWxmIGV4aXN0cy5cbiAqL1xudmlzaXQucGFyZW50Q29sbGVjdGlvbiA9IChjc3QsIHBhdGgpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSB2aXNpdC5pdGVtQXRQYXRoKGNzdCwgcGF0aC5zbGljZSgwLCAtMSkpO1xuICAgIGNvbnN0IGZpZWxkID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdWzBdO1xuICAgIGNvbnN0IGNvbGwgPSBwYXJlbnQ/LltmaWVsZF07XG4gICAgaWYgKGNvbGwgJiYgJ2l0ZW1zJyBpbiBjb2xsKVxuICAgICAgICByZXR1cm4gY29sbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBjb2xsZWN0aW9uIG5vdCBmb3VuZCcpO1xufTtcbmZ1bmN0aW9uIF92aXNpdChwYXRoLCBpdGVtLCB2aXNpdG9yKSB7XG4gICAgbGV0IGN0cmwgPSB2aXNpdG9yKGl0ZW0sIHBhdGgpO1xuICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ3N5bWJvbCcpXG4gICAgICAgIHJldHVybiBjdHJsO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgWydrZXknLCAndmFsdWUnXSkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IGl0ZW1bZmllbGRdO1xuICAgICAgICBpZiAodG9rZW4gJiYgJ2l0ZW1zJyBpbiB0b2tlbikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbi5pdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpID0gX3Zpc2l0KE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQoW1tmaWVsZCwgaV1dKSksIHRva2VuLml0ZW1zW2ldLCB2aXNpdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNpID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNpIC0gMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLml0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ2Z1bmN0aW9uJyAmJiBmaWVsZCA9PT0gJ2tleScpXG4gICAgICAgICAgICAgICAgY3RybCA9IGN0cmwoaXRlbSwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBjdHJsID09PSAnZnVuY3Rpb24nID8gY3RybChpdGVtLCBwYXRoKSA6IGN0cmw7XG59XG5cbi8qKiBUaGUgYnl0ZSBvcmRlciBtYXJrICovXG5jb25zdCBCT00gPSAnXFx1e0ZFRkZ9Jztcbi8qKiBTdGFydCBvZiBkb2MtbW9kZSAqL1xuY29uc3QgRE9DVU1FTlQgPSAnXFx4MDInOyAvLyBDMDogU3RhcnQgb2YgVGV4dFxuLyoqIFVuZXhwZWN0ZWQgZW5kIG9mIGZsb3ctbW9kZSAqL1xuY29uc3QgRkxPV19FTkQgPSAnXFx4MTgnOyAvLyBDMDogQ2FuY2VsXG4vKiogTmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZSAqL1xuY29uc3QgU0NBTEFSID0gJ1xceDFmJzsgLy8gQzA6IFVuaXQgU2VwYXJhdG9yXG4vKiogQHJldHVybnMgYHRydWVgIGlmIGB0b2tlbmAgaXMgYSBmbG93IG9yIGJsb2NrIGNvbGxlY3Rpb24gKi9cbmNvbnN0IGlzQ29sbGVjdGlvbiA9ICh0b2tlbikgPT4gISF0b2tlbiAmJiAnaXRlbXMnIGluIHRva2VuO1xuLyoqIEByZXR1cm5zIGB0cnVlYCBpZiBgdG9rZW5gIGlzIGEgZmxvdyBvciBibG9jayBzY2FsYXI7IG5vdCBhbiBhbGlhcyAqL1xuY29uc3QgaXNTY2FsYXIgPSAodG9rZW4pID0+ICEhdG9rZW4gJiZcbiAgICAodG9rZW4udHlwZSA9PT0gJ3NjYWxhcicgfHxcbiAgICAgICAgdG9rZW4udHlwZSA9PT0gJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJyB8fFxuICAgICAgICB0b2tlbi50eXBlID09PSAnZG91YmxlLXF1b3RlZC1zY2FsYXInIHx8XG4gICAgICAgIHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInKTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogR2V0IGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbGV4ZXIgdG9rZW4gKi9cbmZ1bmN0aW9uIHByZXR0eVRva2VuKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICBjYXNlIEJPTTpcbiAgICAgICAgICAgIHJldHVybiAnPEJPTT4nO1xuICAgICAgICBjYXNlIERPQ1VNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICc8RE9DPic7XG4gICAgICAgIGNhc2UgRkxPV19FTkQ6XG4gICAgICAgICAgICByZXR1cm4gJzxGTE9XX0VORD4nO1xuICAgICAgICBjYXNlIFNDQUxBUjpcbiAgICAgICAgICAgIHJldHVybiAnPFNDQUxBUj4nO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRva2VuKTtcbiAgICB9XG59XG4vKiogSWRlbnRpZnkgdGhlIHR5cGUgb2YgYSBsZXhlciB0b2tlbi4gTWF5IHJldHVybiBgbnVsbGAgZm9yIHVua25vd24gdG9rZW5zLiAqL1xuZnVuY3Rpb24gdG9rZW5UeXBlKHNvdXJjZSkge1xuICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgIGNhc2UgQk9NOlxuICAgICAgICAgICAgcmV0dXJuICdieXRlLW9yZGVyLW1hcmsnO1xuICAgICAgICBjYXNlIERPQ1VNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICdkb2MtbW9kZSc7XG4gICAgICAgIGNhc2UgRkxPV19FTkQ6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctZXJyb3ItZW5kJztcbiAgICAgICAgY2FzZSBTQ0FMQVI6XG4gICAgICAgICAgICByZXR1cm4gJ3NjYWxhcic7XG4gICAgICAgIGNhc2UgJy0tLSc6XG4gICAgICAgICAgICByZXR1cm4gJ2RvYy1zdGFydCc7XG4gICAgICAgIGNhc2UgJy4uLic6XG4gICAgICAgICAgICByZXR1cm4gJ2RvYy1lbmQnO1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICdcXG4nOlxuICAgICAgICBjYXNlICdcXHJcXG4nOlxuICAgICAgICAgICAgcmV0dXJuICduZXdsaW5lJztcbiAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICByZXR1cm4gJ3NlcS1pdGVtLWluZCc7XG4gICAgICAgIGNhc2UgJz8nOlxuICAgICAgICAgICAgcmV0dXJuICdleHBsaWNpdC1rZXktaW5kJztcbiAgICAgICAgY2FzZSAnOic6XG4gICAgICAgICAgICByZXR1cm4gJ21hcC12YWx1ZS1pbmQnO1xuICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1tYXAtc3RhcnQnO1xuICAgICAgICBjYXNlICd9JzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1tYXAtZW5kJztcbiAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctc2VxLXN0YXJ0JztcbiAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctc2VxLWVuZCc7XG4gICAgICAgIGNhc2UgJywnOlxuICAgICAgICAgICAgcmV0dXJuICdjb21tYSc7XG4gICAgfVxuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIGNhc2UgJyAnOlxuICAgICAgICBjYXNlICdcXHQnOlxuICAgICAgICAgICAgcmV0dXJuICdzcGFjZSc7XG4gICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgcmV0dXJuICdjb21tZW50JztcbiAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICByZXR1cm4gJ2RpcmVjdGl2ZS1saW5lJztcbiAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICByZXR1cm4gJ2FsaWFzJztcbiAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICByZXR1cm4gJ2FuY2hvcic7XG4gICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgcmV0dXJuICd0YWcnO1xuICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgcmV0dXJuICdzaW5nbGUtcXVvdGVkLXNjYWxhcic7XG4gICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIHJldHVybiAnZG91YmxlLXF1b3RlZC1zY2FsYXInO1xuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICByZXR1cm4gJ2Jsb2NrLXNjYWxhci1oZWFkZXInO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGNzdCA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRCT006IEJPTSxcblx0RE9DVU1FTlQ6IERPQ1VNRU5ULFxuXHRGTE9XX0VORDogRkxPV19FTkQsXG5cdFNDQUxBUjogU0NBTEFSLFxuXHRjcmVhdGVTY2FsYXJUb2tlbjogY3JlYXRlU2NhbGFyVG9rZW4sXG5cdGlzQ29sbGVjdGlvbjogaXNDb2xsZWN0aW9uLFxuXHRpc1NjYWxhcjogaXNTY2FsYXIsXG5cdHByZXR0eVRva2VuOiBwcmV0dHlUb2tlbixcblx0cmVzb2x2ZUFzU2NhbGFyOiByZXNvbHZlQXNTY2FsYXIsXG5cdHNldFNjYWxhclZhbHVlOiBzZXRTY2FsYXJWYWx1ZSxcblx0c3RyaW5naWZ5OiBzdHJpbmdpZnkkMSxcblx0dG9rZW5UeXBlOiB0b2tlblR5cGUsXG5cdHZpc2l0OiB2aXNpdFxufTtcblxuLypcblNUQVJUIC0+IHN0cmVhbVxuXG5zdHJlYW1cbiAgZGlyZWN0aXZlIC0+IGxpbmUtZW5kIC0+IHN0cmVhbVxuICBpbmRlbnQgKyBsaW5lLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGxpbmUtc3RhcnRcblxubGluZS1lbmRcbiAgY29tbWVudCAtPiBsaW5lLWVuZFxuICBuZXdsaW5lIC0+IC5cbiAgaW5wdXQtZW5kIC0+IEVORFxuXG5saW5lLXN0YXJ0XG4gIGRvYy1zdGFydCAtPiBkb2NcbiAgZG9jLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGluZGVudCAtPiBibG9jay1zdGFydFxuXG5ibG9jay1zdGFydFxuICBzZXEtaXRlbS1zdGFydCAtPiBibG9jay1zdGFydFxuICBleHBsaWNpdC1rZXktc3RhcnQgLT4gYmxvY2stc3RhcnRcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGJsb2NrLXN0YXJ0XG4gIFtlbHNlXSAtPiBkb2NcblxuZG9jXG4gIGxpbmUtZW5kIC0+IGxpbmUtc3RhcnRcbiAgc3BhY2VzIC0+IGRvY1xuICBhbmNob3IgLT4gZG9jXG4gIHRhZyAtPiBkb2NcbiAgZmxvdy1zdGFydCAtPiBmbG93IC0+IGRvY1xuICBmbG93LWVuZCAtPiBlcnJvciAtPiBkb2NcbiAgc2VxLWl0ZW0tc3RhcnQgLT4gZXJyb3IgLT4gZG9jXG4gIGV4cGxpY2l0LWtleS1zdGFydCAtPiBlcnJvciAtPiBkb2NcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGRvY1xuICBhbGlhcyAtPiBkb2NcbiAgcXVvdGUtc3RhcnQgLT4gcXVvdGVkLXNjYWxhciAtPiBkb2NcbiAgYmxvY2stc2NhbGFyLWhlYWRlciAtPiBsaW5lLWVuZCAtPiBibG9jay1zY2FsYXIobWluKSAtPiBsaW5lLXN0YXJ0XG4gIFtlbHNlXSAtPiBwbGFpbi1zY2FsYXIoZmFsc2UsIG1pbikgLT4gZG9jXG5cbmZsb3dcbiAgbGluZS1lbmQgLT4gZmxvd1xuICBzcGFjZXMgLT4gZmxvd1xuICBhbmNob3IgLT4gZmxvd1xuICB0YWcgLT4gZmxvd1xuICBmbG93LXN0YXJ0IC0+IGZsb3cgLT4gZmxvd1xuICBmbG93LWVuZCAtPiAuXG4gIHNlcS1pdGVtLXN0YXJ0IC0+IGVycm9yIC0+IGZsb3dcbiAgZXhwbGljaXQta2V5LXN0YXJ0IC0+IGZsb3dcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGZsb3dcbiAgYWxpYXMgLT4gZmxvd1xuICBxdW90ZS1zdGFydCAtPiBxdW90ZWQtc2NhbGFyIC0+IGZsb3dcbiAgY29tbWEgLT4gZmxvd1xuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKHRydWUsIDApIC0+IGZsb3dcblxucXVvdGVkLXNjYWxhclxuICBxdW90ZS1lbmQgLT4gLlxuICBbZWxzZV0gLT4gcXVvdGVkLXNjYWxhclxuXG5ibG9jay1zY2FsYXIobWluKVxuICBuZXdsaW5lICsgcGVlayhpbmRlbnQgPCBtaW4pIC0+IC5cbiAgW2Vsc2VdIC0+IGJsb2NrLXNjYWxhcihtaW4pXG5cbnBsYWluLXNjYWxhcihpcy1mbG93LCBtaW4pXG4gIHNjYWxhci1lbmQoaXMtZmxvdykgLT4gLlxuICBwZWVrKG5ld2xpbmUgKyAoaW5kZW50IDwgbWluKSkgLT4gLlxuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKG1pbilcbiovXG5mdW5jdGlvbiBpc0VtcHR5KGNoKSB7XG4gICAgc3dpdGNoIChjaCkge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgY2FzZSAnICc6XG4gICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgIGNhc2UgJ1xccic6XG4gICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jb25zdCBoZXhEaWdpdHMgPSAnMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZicuc3BsaXQoJycpO1xuY29uc3QgdGFnQ2hhcnMgPSBcIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LSM7Lz86QCY9KyRfLiF+KicoKVwiLnNwbGl0KCcnKTtcbmNvbnN0IGludmFsaWRGbG93U2NhbGFyQ2hhcnMgPSAnLFtde30nLnNwbGl0KCcnKTtcbmNvbnN0IGludmFsaWRBbmNob3JDaGFycyA9ICcgLFtde31cXG5cXHJcXHQnLnNwbGl0KCcnKTtcbmNvbnN0IGlzTm90QW5jaG9yQ2hhciA9IChjaCkgPT4gIWNoIHx8IGludmFsaWRBbmNob3JDaGFycy5pbmNsdWRlcyhjaCk7XG4vKipcbiAqIFNwbGl0cyBhbiBpbnB1dCBzdHJpbmcgaW50byBsZXhpY2FsIHRva2VucywgaS5lLiBzbWFsbGVyIHN0cmluZ3MgdGhhdCBhcmVcbiAqIGVhc2lseSBpZGVudGlmaWFibGUgYnkgYHRva2Vucy50b2tlblR5cGUoKWAuXG4gKlxuICogTGV4aW5nIHN0YXJ0cyBhbHdheXMgaW4gYSBcInN0cmVhbVwiIGNvbnRleHQuIEluY29tcGxldGUgaW5wdXQgbWF5IGJlIGJ1ZmZlcmVkXG4gKiB1bnRpbCBhIGNvbXBsZXRlIHRva2VuIGNhbiBiZSBlbWl0dGVkLlxuICpcbiAqIEluIGFkZGl0aW9uIHRvIHNsaWNlcyBvZiB0aGUgb3JpZ2luYWwgaW5wdXQsIHRoZSBmb2xsb3dpbmcgY29udHJvbCBjaGFyYWN0ZXJzXG4gKiBtYXkgYWxzbyBiZSBlbWl0dGVkOlxuICpcbiAqIC0gYFxceDAyYCAoU3RhcnQgb2YgVGV4dCk6IEEgZG9jdW1lbnQgc3RhcnRzIHdpdGggdGhlIG5leHQgdG9rZW5cbiAqIC0gYFxceDE4YCAoQ2FuY2VsKTogVW5leHBlY3RlZCBlbmQgb2YgZmxvdy1tb2RlIChpbmRpY2F0ZXMgYW4gZXJyb3IpXG4gKiAtIGBcXHgxZmAgKFVuaXQgU2VwYXJhdG9yKTogTmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZVxuICogLSBgXFx1e0ZFRkZ9YCAoQnl0ZSBvcmRlciBtYXJrKTogRW1pdHRlZCBzZXBhcmF0ZWx5IG91dHNpZGUgZG9jdW1lbnRzXG4gKi9cbmNsYXNzIExleGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIG1hcmtzIHRoZSBlbmQgb2ZcbiAgICAgICAgICogYWxsIGlucHV0XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF0RW5kID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeHBsaWNpdCBpbmRlbnQgc2V0IGluIGJsb2NrIHNjYWxhciBoZWFkZXIsIGFzIGFuIG9mZnNldCBmcm9tIHRoZSBjdXJyZW50XG4gICAgICAgICAqIG1pbmltdW0gaW5kZW50LCBzbyBlLmcuIHNldCB0byAxIGZyb20gYSBoZWFkZXIgYHwyK2AuIFNldCB0byAtMSBpZiBub3RcbiAgICAgICAgICogZXhwbGljaXRseSBzZXQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmJsb2NrU2NhbGFySW5kZW50ID0gLTE7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCbG9jayBzY2FsYXJzIHRoYXQgaW5jbHVkZSBhICsgKGtlZXApIGNob21waW5nIGluZGljYXRvciBpbiB0aGVpciBoZWFkZXJcbiAgICAgICAgICogaW5jbHVkZSB0cmFpbGluZyBlbXB0eSBsaW5lcywgd2hpY2ggYXJlIG90aGVyd2lzZSBleGNsdWRlZCBmcm9tIHRoZVxuICAgICAgICAgKiBzY2FsYXIncyBjb250ZW50cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJLZWVwID0gZmFsc2U7XG4gICAgICAgIC8qKiBDdXJyZW50IGlucHV0ICovXG4gICAgICAgIHRoaXMuYnVmZmVyID0gJyc7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGbGFnIG5vdGluZyB3aGV0aGVyIHRoZSBtYXAgdmFsdWUgaW5kaWNhdG9yIDogY2FuIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGlzXG4gICAgICAgICAqIG5vZGUgd2l0aGluIGEgZmxvdyBjb250ZXh0LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgIC8qKiBDb3VudCBvZiBzdXJyb3VuZGluZyBmbG93IGNvbGxlY3Rpb24gbGV2ZWxzLiAqL1xuICAgICAgICB0aGlzLmZsb3dMZXZlbCA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNaW5pbXVtIGxldmVsIG9mIGluZGVudGF0aW9uIHJlcXVpcmVkIGZvciBuZXh0IGxpbmVzIHRvIGJlIHBhcnNlZCBhcyBhXG4gICAgICAgICAqIHBhcnQgb2YgdGhlIGN1cnJlbnQgc2NhbGFyIHZhbHVlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gMDtcbiAgICAgICAgLyoqIEluZGVudGF0aW9uIGxldmVsIG9mIHRoZSBjdXJyZW50IGxpbmUuICovXG4gICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSAwO1xuICAgICAgICAvKiogUG9zaXRpb24gb2YgdGhlIG5leHQgXFxuIGNoYXJhY3Rlci4gKi9cbiAgICAgICAgdGhpcy5saW5lRW5kUG9zID0gbnVsbDtcbiAgICAgICAgLyoqIFN0b3JlcyB0aGUgc3RhdGUgb2YgdGhlIGxleGVyIGlmIHJlYWNoaW5nIHRoZSBlbmQgb2YgaW5jcG9tcGxldGUgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgICAgICAgLyoqIEEgcG9pbnRlciB0byBgYnVmZmVyYDsgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGxleGVyLiAqL1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIFlBTUwgdG9rZW5zIGZyb20gdGhlIGBzb3VyY2VgIHN0cmluZy4gSWYgYGluY29tcGxldGVgLFxuICAgICAqIGEgcGFydCBvZiB0aGUgbGFzdCBsaW5lIG1heSBiZSBsZWZ0IGFzIGEgYnVmZmVyIGZvciB0aGUgbmV4dCBjYWxsLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBnZW5lcmF0b3Igb2YgbGV4aWNhbCB0b2tlbnNcbiAgICAgKi9cbiAgICAqbGV4KHNvdXJjZSwgaW5jb21wbGV0ZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlciArIHNvdXJjZSA6IHNvdXJjZTtcbiAgICAgICAgICAgIHRoaXMubGluZUVuZFBvcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdEVuZCA9ICFpbmNvbXBsZXRlO1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMubmV4dCA/PyAnc3RyZWFtJztcbiAgICAgICAgd2hpbGUgKG5leHQgJiYgKGluY29tcGxldGUgfHwgdGhpcy5oYXNDaGFycygxKSkpXG4gICAgICAgICAgICBuZXh0ID0geWllbGQqIHRoaXMucGFyc2VOZXh0KG5leHQpO1xuICAgIH1cbiAgICBhdExpbmVFbmQoKSB7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3M7XG4gICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICB3aGlsZSAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcpXG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIGlmICghY2ggfHwgY2ggPT09ICcjJyB8fCBjaCA9PT0gJ1xcbicpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGNoID09PSAnXFxyJylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcltpICsgMV0gPT09ICdcXG4nO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNoYXJBdChuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLnBvcyArIG5dO1xuICAgIH1cbiAgICBjb250aW51ZVNjYWxhcihvZmZzZXQpIHtcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbb2Zmc2V0XTtcbiAgICAgICAgaWYgKHRoaXMuaW5kZW50TmV4dCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpbmRlbnQgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGNoID09PSAnICcpXG4gICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2luZGVudCArIG9mZnNldF07XG4gICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuYnVmZmVyW2luZGVudCArIG9mZnNldCArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnXFxuJyB8fCAoIW5leHQgJiYgIXRoaXMuYXRFbmQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0ICsgaW5kZW50ICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjaCA9PT0gJ1xcbicgfHwgaW5kZW50ID49IHRoaXMuaW5kZW50TmV4dCB8fCAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgICAgID8gb2Zmc2V0ICsgaW5kZW50XG4gICAgICAgICAgICAgICAgOiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJy4nKSB7XG4gICAgICAgICAgICBjb25zdCBkdCA9IHRoaXMuYnVmZmVyLnN1YnN0cihvZmZzZXQsIDMpO1xuICAgICAgICAgICAgaWYgKChkdCA9PT0gJy0tLScgfHwgZHQgPT09ICcuLi4nKSAmJiBpc0VtcHR5KHRoaXMuYnVmZmVyW29mZnNldCArIDNdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gICAgZ2V0TGluZSgpIHtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMubGluZUVuZFBvcztcbiAgICAgICAgaWYgKHR5cGVvZiBlbmQgIT09ICdudW1iZXInIHx8IChlbmQgIT09IC0xICYmIGVuZCA8IHRoaXMucG9zKSkge1xuICAgICAgICAgICAgZW5kID0gdGhpcy5idWZmZXIuaW5kZXhPZignXFxuJywgdGhpcy5wb3MpO1xuICAgICAgICAgICAgdGhpcy5saW5lRW5kUG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPT09IC0xKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXRFbmQgPyB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MpIDogbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyW2VuZCAtIDFdID09PSAnXFxyJylcbiAgICAgICAgICAgIGVuZCAtPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuc3Vic3RyaW5nKHRoaXMucG9zLCBlbmQpO1xuICAgIH1cbiAgICBoYXNDaGFycyhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyArIG4gPD0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgIH1cbiAgICBzZXROZXh0KHN0YXRlKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gdGhpcy5idWZmZXIuc3Vic3RyaW5nKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBudWxsO1xuICAgICAgICB0aGlzLm5leHQgPSBzdGF0ZTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHBlZWsobikge1xuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuc3Vic3RyKHRoaXMucG9zLCBuKTtcbiAgICB9XG4gICAgKnBhcnNlTmV4dChuZXh0KSB7XG4gICAgICAgIHN3aXRjaCAobmV4dCkge1xuICAgICAgICAgICAgY2FzZSAnc3RyZWFtJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VTdHJlYW0oKTtcbiAgICAgICAgICAgIGNhc2UgJ2xpbmUtc3RhcnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUxpbmVTdGFydCgpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc3RhcnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUJsb2NrU3RhcnQoKTtcbiAgICAgICAgICAgIGNhc2UgJ2RvYyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlRG9jdW1lbnQoKTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3cnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUZsb3dDb2xsZWN0aW9uKCk7XG4gICAgICAgICAgICBjYXNlICdxdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VRdW90ZWRTY2FsYXIoKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTY2FsYXIoKTtcbiAgICAgICAgICAgIGNhc2UgJ3BsYWluLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlUGxhaW5TY2FsYXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqcGFyc2VTdHJlYW0oKSB7XG4gICAgICAgIGxldCBsaW5lID0gdGhpcy5nZXRMaW5lKCk7XG4gICAgICAgIGlmIChsaW5lID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnc3RyZWFtJyk7XG4gICAgICAgIGlmIChsaW5lWzBdID09PSBCT00pIHtcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGluZVswXSA9PT0gJyUnKSB7XG4gICAgICAgICAgICBsZXQgZGlyRW5kID0gbGluZS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBjcyA9IGxpbmUuaW5kZXhPZignIycpO1xuICAgICAgICAgICAgaWYgKGNzICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoID0gbGluZVtjcyAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgZGlyRW5kID0gY3MgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaCA9IGxpbmVbZGlyRW5kIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnICcgfHwgY2ggPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBkaXJFbmQgLT0gMTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbiA9ICh5aWVsZCogdGhpcy5wdXNoQ291bnQoZGlyRW5kKSkgKyAoeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKSk7XG4gICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBuKTsgLy8gcG9zc2libGUgY29tbWVudFxuICAgICAgICAgICAgdGhpcy5wdXNoTmV3bGluZSgpO1xuICAgICAgICAgICAgcmV0dXJuICdzdHJlYW0nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF0TGluZUVuZCgpKSB7XG4gICAgICAgICAgICBjb25zdCBzcCA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBzcCk7XG4gICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoTmV3bGluZSgpO1xuICAgICAgICAgICAgcmV0dXJuICdzdHJlYW0nO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkIERPQ1VNRU5UO1xuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICB9XG4gICAgKnBhcnNlTGluZVN0YXJ0KCkge1xuICAgICAgICBjb25zdCBjaCA9IHRoaXMuY2hhckF0KDApO1xuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnbGluZS1zdGFydCcpO1xuICAgICAgICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJy4nKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQgJiYgIXRoaXMuaGFzQ2hhcnMoNCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnbGluZS1zdGFydCcpO1xuICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMucGVlaygzKTtcbiAgICAgICAgICAgIGlmIChzID09PSAnLS0tJyAmJiBpc0VtcHR5KHRoaXMuY2hhckF0KDMpKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudFZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiAnZG9jJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHMgPT09ICcuLi4nICYmIGlzRW1wdHkodGhpcy5jaGFyQXQoMykpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDMpO1xuICAgICAgICAgICAgICAgIHJldHVybiAnc3RyZWFtJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGVudFZhbHVlID0geWllbGQqIHRoaXMucHVzaFNwYWNlcyhmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmluZGVudE5leHQgPiB0aGlzLmluZGVudFZhbHVlICYmICFpc0VtcHR5KHRoaXMuY2hhckF0KDEpKSlcbiAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IHRoaXMuaW5kZW50VmFsdWU7XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUJsb2NrU3RhcnQoKTtcbiAgICB9XG4gICAgKnBhcnNlQmxvY2tTdGFydCgpIHtcbiAgICAgICAgY29uc3QgW2NoMCwgY2gxXSA9IHRoaXMucGVlaygyKTtcbiAgICAgICAgaWYgKCFjaDEgJiYgIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdibG9jay1zdGFydCcpO1xuICAgICAgICBpZiAoKGNoMCA9PT0gJy0nIHx8IGNoMCA9PT0gJz8nIHx8IGNoMCA9PT0gJzonKSAmJiBpc0VtcHR5KGNoMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSAoeWllbGQqIHRoaXMucHVzaENvdW50KDEpKSArICh5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IHRoaXMuaW5kZW50VmFsdWUgKyAxO1xuICAgICAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSArPSBuO1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZG9jJztcbiAgICB9XG4gICAgKnBhcnNlRG9jdW1lbnQoKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdkb2MnKTtcbiAgICAgICAgbGV0IG4gPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudChsaW5lLmxlbmd0aCAtIG4pO1xuICAgICAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hOZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIGNhc2UgJ1snOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9IDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ30nOlxuICAgICAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoVW50aWwoaXNOb3RBbmNob3JDaGFyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZUZsb3dDb2xsZWN0aW9uKCkge1xuICAgICAgICBsZXQgbmwsIHNwO1xuICAgICAgICBsZXQgaW5kZW50ID0gLTE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5sID0geWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIGlmIChubCA+IDApIHtcbiAgICAgICAgICAgICAgICBzcCA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSBpbmRlbnQgPSBzcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNwID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIH0gd2hpbGUgKG5sICsgc3AgPiAwKTtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICBpZiAobGluZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Zsb3cnKTtcbiAgICAgICAgaWYgKChpbmRlbnQgIT09IC0xICYmIGluZGVudCA8IHRoaXMuaW5kZW50TmV4dCAmJiBsaW5lWzBdICE9PSAnIycpIHx8XG4gICAgICAgICAgICAoaW5kZW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgKGxpbmUuc3RhcnRzV2l0aCgnLS0tJykgfHwgbGluZS5zdGFydHNXaXRoKCcuLi4nKSkgJiZcbiAgICAgICAgICAgICAgICBpc0VtcHR5KGxpbmVbM10pKSkge1xuICAgICAgICAgICAgLy8gQWxsb3dpbmcgZm9yIHRoZSB0ZXJtaW5hbCBdIG9yIH0gYXQgdGhlIHNhbWUgKHJhdGhlciB0aGFuIGdyZWF0ZXIpXG4gICAgICAgICAgICAvLyBpbmRlbnQgbGV2ZWwgYXMgdGhlIGluaXRpYWwgWyBvciB7IGlzIHRlY2huaWNhbGx5IGludmFsaWQsIGJ1dFxuICAgICAgICAgICAgLy8gZmFpbGluZyBoZXJlIHdvdWxkIGJlIHN1cnByaXNpbmcgdG8gdXNlcnMuXG4gICAgICAgICAgICBjb25zdCBhdEZsb3dFbmRNYXJrZXIgPSBpbmRlbnQgPT09IHRoaXMuaW5kZW50TmV4dCAtIDEgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIChsaW5lWzBdID09PSAnXScgfHwgbGluZVswXSA9PT0gJ30nKTtcbiAgICAgICAgICAgIGlmICghYXRGbG93RW5kTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgICAgICAgICB5aWVsZCBGTE9XX0VORDtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgIHdoaWxlIChsaW5lW25dID09PSAnLCcpIHtcbiAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZmxvdyc7XG4gICAgICAgICAgICBjYXNlICcjJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAneyc6XG4gICAgICAgICAgICBjYXNlICdbJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93TGV2ZWwgKz0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAnfSc6XG4gICAgICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCAtPSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dMZXZlbCA/ICdmbG93JyA6ICdkb2MnO1xuICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFVudGlsKGlzTm90QW5jaG9yQ2hhcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VRdW90ZWRTY2FsYXIoKTtcbiAgICAgICAgICAgIGNhc2UgJzonOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuY2hhckF0KDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dLZXkgfHwgaXNFbXB0eShuZXh0KSB8fCBuZXh0ID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVF1b3RlZFNjYWxhcigpIHtcbiAgICAgICAgY29uc3QgcXVvdGUgPSB0aGlzLmNoYXJBdCgwKTtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMuYnVmZmVyLmluZGV4T2YocXVvdGUsIHRoaXMucG9zICsgMSk7XG4gICAgICAgIGlmIChxdW90ZSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbmQgIT09IC0xICYmIHRoaXMuYnVmZmVyW2VuZCArIDFdID09PSBcIidcIilcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKFwiJ1wiLCBlbmQgKyAyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRvdWJsZS1xdW90ZVxuICAgICAgICAgICAgd2hpbGUgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyW2VuZCAtIDEgLSBuXSA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgICAgICAgICBuICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKG4gJSAyID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcIicsIGVuZCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgbG9va2luZyBmb3IgbmV3bGluZXMgd2l0aGluIHRoZSBxdW90ZXNcbiAgICAgICAgY29uc3QgcWIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgICAgICAgbGV0IG5sID0gcWIuaW5kZXhPZignXFxuJywgdGhpcy5wb3MpO1xuICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICB3aGlsZSAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSB0aGlzLmNvbnRpbnVlU2NhbGFyKG5sICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGNzID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbmwgPSBxYi5pbmRleE9mKCdcXG4nLCBjcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvciBjYXVzZWQgYnkgYW4gdW5leHBlY3RlZCB1bmluZGVudFxuICAgICAgICAgICAgICAgIGVuZCA9IG5sIC0gKHFiW25sIC0gMV0gPT09ICdcXHInID8gMiA6IDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGVuZCArIDEsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd0xldmVsID8gJ2Zsb3cnIDogJ2RvYyc7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU2NhbGFySGVhZGVyKCkge1xuICAgICAgICB0aGlzLmJsb2NrU2NhbGFySW5kZW50ID0gLTE7XG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJLZWVwID0gZmFsc2U7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICBpZiAoY2ggPT09ICcrJylcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrU2NhbGFyS2VlcCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChjaCA+ICcwJyAmJiBjaCA8PSAnOScpXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NjYWxhckluZGVudCA9IE51bWJlcihjaCkgLSAxO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2ggIT09ICctJylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFVudGlsKGNoID0+IGlzRW1wdHkoY2gpIHx8IGNoID09PSAnIycpO1xuICAgIH1cbiAgICAqcGFyc2VCbG9ja1NjYWxhcigpIHtcbiAgICAgICAgbGV0IG5sID0gdGhpcy5wb3MgLSAxOyAvLyBtYXkgYmUgLTEgaWYgdGhpcy5wb3MgPT09IDBcbiAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgbG9vcDogZm9yIChsZXQgaSA9IHRoaXMucG9zOyAoY2ggPSB0aGlzLmJ1ZmZlcltpXSk7ICsraSkge1xuICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgICAgICAgbmwgPSBpO1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdcXHInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXNjYWxhcicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc2NhbGFyJyk7XG4gICAgICAgIGlmIChpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja1NjYWxhckluZGVudCA9PT0gLTEpXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gaW5kZW50O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCArPSB0aGlzLmJsb2NrU2NhbGFySW5kZW50O1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5jb250aW51ZVNjYWxhcihubCArIDEpO1xuICAgICAgICAgICAgICAgIGlmIChjcyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIG5sID0gdGhpcy5idWZmZXIuaW5kZXhPZignXFxuJywgY3MpO1xuICAgICAgICAgICAgfSB3aGlsZSAobmwgIT09IC0xKTtcbiAgICAgICAgICAgIGlmIChubCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXNjYWxhcicpO1xuICAgICAgICAgICAgICAgIG5sID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5ibG9ja1NjYWxhcktlZXApIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IG5sIC0gMTtcbiAgICAgICAgICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInKVxuICAgICAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWy0taV07XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdENoYXIgPSBpOyAvLyBEcm9wIHRoZSBsaW5lIGlmIGxhc3QgY2hhciBub3QgbW9yZSBpbmRlbnRlZFxuICAgICAgICAgICAgICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclstLWldO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcbicgJiYgaSA+PSB0aGlzLnBvcyAmJiBpICsgMSArIGluZGVudCA+IGxhc3RDaGFyKVxuICAgICAgICAgICAgICAgICAgICBubCA9IGk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkIFNDQUxBUjtcbiAgICAgICAgeWllbGQqIHRoaXMucHVzaFRvSW5kZXgobmwgKyAxLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgfVxuICAgICpwYXJzZVBsYWluU2NhbGFyKCkge1xuICAgICAgICBjb25zdCBpbkZsb3cgPSB0aGlzLmZsb3dMZXZlbCA+IDA7XG4gICAgICAgIGxldCBlbmQgPSB0aGlzLnBvcyAtIDE7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3MgLSAxO1xuICAgICAgICBsZXQgY2g7XG4gICAgICAgIHdoaWxlICgoY2ggPSB0aGlzLmJ1ZmZlclsrK2ldKSkge1xuICAgICAgICAgICAgaWYgKGNoID09PSAnOicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5idWZmZXJbaSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChpc0VtcHR5KG5leHQpIHx8IChpbkZsb3cgJiYgbmV4dCA9PT0gJywnKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRW1wdHkoY2gpKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gJ1xcbic7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdGhpcy5idWZmZXJbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnIycgfHwgKGluRmxvdyAmJiBpbnZhbGlkRmxvd1NjYWxhckNoYXJzLmluY2x1ZGVzKG5leHQpKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcyA9IHRoaXMuY29udGludWVTY2FsYXIoaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3MgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBNYXRoLm1heChpLCBjcyAtIDIpOyAvLyB0byBhZHZhbmNlLCBidXQgc3RpbGwgYWNjb3VudCBmb3IgJyAjJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpbkZsb3cgJiYgaW52YWxpZEZsb3dTY2FsYXJDaGFycy5pbmNsdWRlcyhjaCkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ3BsYWluLXNjYWxhcicpO1xuICAgICAgICB5aWVsZCBTQ0FMQVI7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGVuZCArIDEsIHRydWUpO1xuICAgICAgICByZXR1cm4gaW5GbG93ID8gJ2Zsb3cnIDogJ2RvYyc7XG4gICAgfVxuICAgICpwdXNoQ291bnQobikge1xuICAgICAgICBpZiAobiA+IDApIHtcbiAgICAgICAgICAgIHlpZWxkIHRoaXMuYnVmZmVyLnN1YnN0cih0aGlzLnBvcywgbik7XG4gICAgICAgICAgICB0aGlzLnBvcyArPSBuO1xuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgICpwdXNoVG9JbmRleChpLCBhbGxvd0VtcHR5KSB7XG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLmJ1ZmZlci5zbGljZSh0aGlzLnBvcywgaSk7XG4gICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICB5aWVsZCBzO1xuICAgICAgICAgICAgdGhpcy5wb3MgKz0gcy5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWxsb3dFbXB0eSlcbiAgICAgICAgICAgIHlpZWxkICcnO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgKnB1c2hJbmRpY2F0b3JzKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY2hhckF0KDApKSB7XG4gICAgICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gKCh5aWVsZCogdGhpcy5wdXNoVGFnKCkpICtcbiAgICAgICAgICAgICAgICAgICAgKHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSkpICtcbiAgICAgICAgICAgICAgICAgICAgKHlpZWxkKiB0aGlzLnB1c2hJbmRpY2F0b3JzKCkpKTtcbiAgICAgICAgICAgIGNhc2UgJyYnOlxuICAgICAgICAgICAgICAgIHJldHVybiAoKHlpZWxkKiB0aGlzLnB1c2hVbnRpbChpc05vdEFuY2hvckNoYXIpKSArXG4gICAgICAgICAgICAgICAgICAgICh5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpKSArXG4gICAgICAgICAgICAgICAgICAgICh5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpKSk7XG4gICAgICAgICAgICBjYXNlICctJzogLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgY2FzZSAnPyc6IC8vIHRoaXMgaXMgYW4gZXJyb3Igb3V0c2lkZSBmbG93IGNvbGxlY3Rpb25zXG4gICAgICAgICAgICBjYXNlICc6Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluRmxvdyA9IHRoaXMuZmxvd0xldmVsID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaDEgPSB0aGlzLmNoYXJBdCgxKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShjaDEpIHx8IChpbkZsb3cgJiYgaW52YWxpZEZsb3dTY2FsYXJDaGFycy5pbmNsdWRlcyhjaDEpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWluRmxvdylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IHRoaXMuaW5kZW50VmFsdWUgKyAxO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmZsb3dLZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoeWllbGQqIHRoaXMucHVzaENvdW50KDEpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHlpZWxkKiB0aGlzLnB1c2hJbmRpY2F0b3JzKCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgICpwdXNoVGFnKCkge1xuICAgICAgICBpZiAodGhpcy5jaGFyQXQoMSkgPT09ICc8Jykge1xuICAgICAgICAgICAgbGV0IGkgPSB0aGlzLnBvcyArIDI7XG4gICAgICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltpXTtcbiAgICAgICAgICAgIHdoaWxlICghaXNFbXB0eShjaCkgJiYgY2ggIT09ICc+JylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFRvSW5kZXgoY2ggPT09ICc+JyA/IGkgKyAxIDogaSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGkgPSB0aGlzLnBvcyArIDE7XG4gICAgICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltpXTtcbiAgICAgICAgICAgIHdoaWxlIChjaCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWdDaGFycy5pbmNsdWRlcyhjaCkpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJyUnICYmXG4gICAgICAgICAgICAgICAgICAgIGhleERpZ2l0cy5pbmNsdWRlcyh0aGlzLmJ1ZmZlcltpICsgMV0pICYmXG4gICAgICAgICAgICAgICAgICAgIGhleERpZ2l0cy5pbmNsdWRlcyh0aGlzLmJ1ZmZlcltpICsgMl0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKGkgKz0gMyldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqcHVzaE5ld2xpbmUoKSB7XG4gICAgICAgIGNvbnN0IGNoID0gdGhpcy5idWZmZXJbdGhpcy5wb3NdO1xuICAgICAgICBpZiAoY2ggPT09ICdcXG4nKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdcXHInICYmIHRoaXMuY2hhckF0KDEpID09PSAnXFxuJylcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoQ291bnQoMik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAqcHVzaFNwYWNlcyhhbGxvd1RhYnMpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcyAtIDE7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2ldO1xuICAgICAgICB9IHdoaWxlIChjaCA9PT0gJyAnIHx8IChhbGxvd1RhYnMgJiYgY2ggPT09ICdcXHQnKSk7XG4gICAgICAgIGNvbnN0IG4gPSBpIC0gdGhpcy5wb3M7XG4gICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5idWZmZXIuc3Vic3RyKHRoaXMucG9zLCBuKTtcbiAgICAgICAgICAgIHRoaXMucG9zID0gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgKnB1c2hVbnRpbCh0ZXN0KSB7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3M7XG4gICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICB3aGlsZSAoIXRlc3QoY2gpKVxuICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2ldO1xuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFRvSW5kZXgoaSwgZmFsc2UpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUcmFja3MgbmV3bGluZXMgZHVyaW5nIHBhcnNpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZSBhbiBlZmZpY2llbnQgQVBJIGZvclxuICogZGV0ZXJtaW5pbmcgdGhlIG9uZS1pbmRleGVkIGB7IGxpbmUsIGNvbCB9YCBwb3NpdGlvbiBmb3IgYW55IG9mZnNldFxuICogd2l0aGluIHRoZSBpbnB1dC5cbiAqL1xuY2xhc3MgTGluZUNvdW50ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpbmVTdGFydHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNob3VsZCBiZSBjYWxsZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIGNhbGxcbiAgICAgICAgICogYGxpbmVDb3VudGVyLmxpbmVTdGFydHMuc29ydCgpYCBiZWZvcmUgY2FsbGluZyBgbGluZVBvcygpYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkTmV3TGluZSA9IChvZmZzZXQpID0+IHRoaXMubGluZVN0YXJ0cy5wdXNoKG9mZnNldCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggYW5kIHJldHVybnMgdGhlIDEtaW5kZXhlZCB7IGxpbmUsIGNvbCB9XG4gICAgICAgICAqIHBvc2l0aW9uIG9mIGBvZmZzZXRgLiBJZiBgbGluZSA9PT0gMGAsIGBhZGROZXdMaW5lYCBoYXMgbmV2ZXIgYmVlblxuICAgICAgICAgKiBjYWxsZWQgb3IgYG9mZnNldGAgaXMgYmVmb3JlIHRoZSBmaXJzdCBrbm93biBuZXdsaW5lLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5saW5lUG9zID0gKG9mZnNldCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxvdyA9IDA7XG4gICAgICAgICAgICBsZXQgaGlnaCA9IHRoaXMubGluZVN0YXJ0cy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOyAvLyBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGluZVN0YXJ0c1ttaWRdIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVTdGFydHNbbG93XSA9PT0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxpbmU6IGxvdyArIDEsIGNvbDogMSB9O1xuICAgICAgICAgICAgaWYgKGxvdyA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4geyBsaW5lOiAwLCBjb2w6IG9mZnNldCB9O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmxpbmVTdGFydHNbbG93IC0gMV07XG4gICAgICAgICAgICByZXR1cm4geyBsaW5lOiBsb3csIGNvbDogb2Zmc2V0IC0gc3RhcnQgKyAxIH07XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpbmNsdWRlc1Rva2VuKGxpc3QsIHR5cGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpXG4gICAgICAgIGlmIChsaXN0W2ldLnR5cGUgPT09IHR5cGUpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBmaW5kTm9uRW1wdHlJbmRleChsaXN0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHN3aXRjaCAobGlzdFtpXS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBpc0Zsb3dUb2tlbih0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4/LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFByZXZQcm9wcyhwYXJlbnQpIHtcbiAgICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2RvY3VtZW50JzpcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuc3RhcnQ7XG4gICAgICAgIGNhc2UgJ2Jsb2NrLW1hcCc6IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ID0gcGFyZW50Lml0ZW1zW3BhcmVudC5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIHJldHVybiBpdC5zZXAgPz8gaXQuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzpcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuaXRlbXNbcGFyZW50Lml0ZW1zLmxlbmd0aCAtIDFdLnN0YXJ0O1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbn1cbi8qKiBOb3RlOiBNYXkgbW9kaWZ5IGlucHV0IGFycmF5ICovXG5mdW5jdGlvbiBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldikge1xuICAgIGlmIChwcmV2Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIGxldCBpID0gcHJldi5sZW5ndGg7XG4gICAgbG9vcDogd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgIHN3aXRjaCAocHJldltpXS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkb2Mtc3RhcnQnOlxuICAgICAgICAgICAgY2FzZSAnZXhwbGljaXQta2V5LWluZCc6XG4gICAgICAgICAgICBjYXNlICdtYXAtdmFsdWUtaW5kJzpcbiAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdoaWxlIChwcmV2WysraV0/LnR5cGUgPT09ICdzcGFjZScpIHtcbiAgICAgICAgLyogbG9vcCAqL1xuICAgIH1cbiAgICByZXR1cm4gcHJldi5zcGxpY2UoaSwgcHJldi5sZW5ndGgpO1xufVxuZnVuY3Rpb24gZml4Rmxvd1NlcUl0ZW1zKGZjKSB7XG4gICAgaWYgKGZjLnN0YXJ0LnR5cGUgPT09ICdmbG93LXNlcS1zdGFydCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdCBvZiBmYy5pdGVtcykge1xuICAgICAgICAgICAgaWYgKGl0LnNlcCAmJlxuICAgICAgICAgICAgICAgICFpdC52YWx1ZSAmJlxuICAgICAgICAgICAgICAgICFpbmNsdWRlc1Rva2VuKGl0LnN0YXJ0LCAnZXhwbGljaXQta2V5LWluZCcpICYmXG4gICAgICAgICAgICAgICAgIWluY2x1ZGVzVG9rZW4oaXQuc2VwLCAnbWFwLXZhbHVlLWluZCcpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0LmtleSlcbiAgICAgICAgICAgICAgICAgICAgaXQudmFsdWUgPSBpdC5rZXk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGl0LmtleTtcbiAgICAgICAgICAgICAgICBpZiAoaXNGbG93VG9rZW4oaXQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZS5lbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShpdC52YWx1ZS5lbmQsIGl0LnNlcCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnZhbHVlLmVuZCA9IGl0LnNlcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShpdC5zdGFydCwgaXQuc2VwKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgaXQuc2VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIFlBTUwgY29uY3JldGUgc3ludGF4IHRyZWUgKENTVCkgcGFyc2VyXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHNyYzogc3RyaW5nID0gLi4uXG4gKiBmb3IgKGNvbnN0IHRva2VuIG9mIG5ldyBQYXJzZXIoKS5wYXJzZShzcmMpKSB7XG4gKiAgIC8vIHRva2VuOiBUb2tlblxuICogfVxuICogYGBgXG4gKlxuICogVG8gdXNlIHRoZSBwYXJzZXIgd2l0aCBhIHVzZXItcHJvdmlkZWQgbGV4ZXI6XG4gKlxuICogYGBgdHNcbiAqIGZ1bmN0aW9uKiBwYXJzZShzb3VyY2U6IHN0cmluZywgbGV4ZXI6IExleGVyKSB7XG4gKiAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoKVxuICogICBmb3IgKGNvbnN0IGxleGVtZSBvZiBsZXhlci5sZXgoc291cmNlKSlcbiAqICAgICB5aWVsZCogcGFyc2VyLm5leHQobGV4ZW1lKVxuICogICB5aWVsZCogcGFyc2VyLmVuZCgpXG4gKiB9XG4gKlxuICogY29uc3Qgc3JjOiBzdHJpbmcgPSAuLi5cbiAqIGNvbnN0IGxleGVyID0gbmV3IExleGVyKClcbiAqIGZvciAoY29uc3QgdG9rZW4gb2YgcGFyc2Uoc3JjLCBsZXhlcikpIHtcbiAqICAgLy8gdG9rZW46IFRva2VuXG4gKiB9XG4gKiBgYGBcbiAqL1xuY2xhc3MgUGFyc2VyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb25OZXdMaW5lIC0gSWYgZGVmaW5lZCwgY2FsbGVkIHNlcGFyYXRlbHkgd2l0aCB0aGUgc3RhcnQgcG9zaXRpb24gb2ZcbiAgICAgKiAgIGVhY2ggbmV3IGxpbmUgKGluIGBwYXJzZSgpYCwgaW5jbHVkaW5nIHRoZSBzdGFydCBvZiBpbnB1dCkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob25OZXdMaW5lKSB7XG4gICAgICAgIC8qKiBJZiB0cnVlLCBzcGFjZSBhbmQgc2VxdWVuY2UgaW5kaWNhdG9ycyBjb3VudCBhcyBpbmRlbnRhdGlvbiAqL1xuICAgICAgICB0aGlzLmF0TmV3TGluZSA9IHRydWU7XG4gICAgICAgIC8qKiBJZiB0cnVlLCBuZXh0IHRva2VuIGlzIGEgc2NhbGFyIHZhbHVlICovXG4gICAgICAgIHRoaXMuYXRTY2FsYXIgPSBmYWxzZTtcbiAgICAgICAgLyoqIEN1cnJlbnQgaW5kZW50YXRpb24gbGV2ZWwgKi9cbiAgICAgICAgdGhpcy5pbmRlbnQgPSAwO1xuICAgICAgICAvKiogQ3VycmVudCBvZmZzZXQgc2luY2UgdGhlIHN0YXJ0IG9mIHBhcnNpbmcgKi9cbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICAvKiogT24gdGhlIHNhbWUgbGluZSB3aXRoIGEgYmxvY2sgbWFwIGtleSAqL1xuICAgICAgICB0aGlzLm9uS2V5TGluZSA9IGZhbHNlO1xuICAgICAgICAvKiogVG9wIGluZGljYXRlcyB0aGUgbm9kZSB0aGF0J3MgY3VycmVudGx5IGJlaW5nIGJ1aWx0ICovXG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgLyoqIFRoZSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgdG9rZW4sIHNldCBpbiBwYXJzZSgpICovXG4gICAgICAgIHRoaXMuc291cmNlID0gJyc7XG4gICAgICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgY3VycmVudCB0b2tlbiwgc2V0IGluIHBhcnNlKCkgKi9cbiAgICAgICAgdGhpcy50eXBlID0gJyc7XG4gICAgICAgIC8vIE11c3QgYmUgZGVmaW5lZCBhZnRlciBgbmV4dCgpYFxuICAgICAgICB0aGlzLmxleGVyID0gbmV3IExleGVyKCk7XG4gICAgICAgIHRoaXMub25OZXdMaW5lID0gb25OZXdMaW5lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZSBgc291cmNlYCBhcyBhIFlBTUwgc3RyZWFtLlxuICAgICAqIElmIGBpbmNvbXBsZXRlYCwgYSBwYXJ0IG9mIHRoZSBsYXN0IGxpbmUgbWF5IGJlIGxlZnQgYXMgYSBidWZmZXIgZm9yIHRoZSBuZXh0IGNhbGwuXG4gICAgICpcbiAgICAgKiBFcnJvcnMgYXJlIG5vdCB0aHJvd24sIGJ1dCB5aWVsZGVkIGFzIGB7IHR5cGU6ICdlcnJvcicsIG1lc3NhZ2UgfWAgdG9rZW5zLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSBnZW5lcmF0b3Igb2YgdG9rZW5zIHJlcHJlc2VudGluZyBlYWNoIGRpcmVjdGl2ZSwgZG9jdW1lbnQsIGFuZCBvdGhlciBzdHJ1Y3R1cmUuXG4gICAgICovXG4gICAgKnBhcnNlKHNvdXJjZSwgaW5jb21wbGV0ZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLm9uTmV3TGluZSAmJiB0aGlzLm9mZnNldCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMub25OZXdMaW5lKDApO1xuICAgICAgICBmb3IgKGNvbnN0IGxleGVtZSBvZiB0aGlzLmxleGVyLmxleChzb3VyY2UsIGluY29tcGxldGUpKVxuICAgICAgICAgICAgeWllbGQqIHRoaXMubmV4dChsZXhlbWUpO1xuICAgICAgICBpZiAoIWluY29tcGxldGUpXG4gICAgICAgICAgICB5aWVsZCogdGhpcy5lbmQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWR2YW5jZSB0aGUgcGFyc2VyIGJ5IHRoZSBgc291cmNlYCBvZiBvbmUgbGV4aWNhbCB0b2tlbi5cbiAgICAgKi9cbiAgICAqbmV4dChzb3VyY2UpIHtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIGlmICh0aGlzLmF0U2NhbGFyKSB7XG4gICAgICAgICAgICB0aGlzLmF0U2NhbGFyID0gZmFsc2U7XG4gICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCArPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0b2tlblR5cGUoc291cmNlKTtcbiAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYE5vdCBhIFlBTUwgdG9rZW46ICR7c291cmNlfWA7XG4gICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoeyB0eXBlOiAnZXJyb3InLCBvZmZzZXQ6IHRoaXMub2Zmc2V0LCBtZXNzYWdlLCBzb3VyY2UgfSk7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCArPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdzY2FsYXInKSB7XG4gICAgICAgICAgICB0aGlzLmF0TmV3TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5hdFNjYWxhciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSAnc2NhbGFyJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGVudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uTmV3TGluZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0ICsgc291cmNlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXROZXdMaW5lICYmIHNvdXJjZVswXSA9PT0gJyAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZXhwbGljaXQta2V5LWluZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2VxLWl0ZW0taW5kJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXROZXdMaW5lKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZG9jLW1vZGUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb3ctZXJyb3ItZW5kJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXROZXdMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9mZnNldCArPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBDYWxsIGF0IGVuZCBvZiBpbnB1dCB0byBwdXNoIG91dCBhbnkgcmVtYWluaW5nIGNvbnN0cnVjdGlvbnMgKi9cbiAgICAqZW5kKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5zdGFjay5sZW5ndGggPiAwKVxuICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgfVxuICAgIGdldCBzb3VyY2VUb2tlbigpIHtcbiAgICAgICAgY29uc3Qgc3QgPSB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2VcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHN0O1xuICAgIH1cbiAgICAqc3RlcCgpIHtcbiAgICAgICAgY29uc3QgdG9wID0gdGhpcy5wZWVrKDEpO1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnZG9jLWVuZCcgJiYgKCF0b3AgfHwgdG9wLnR5cGUgIT09ICdkb2MtZW5kJykpIHtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLnN0YWNrLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdkb2MtZW5kJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdG9wKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnN0cmVhbSgpO1xuICAgICAgICBzd2l0Y2ggKHRvcC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmRvY3VtZW50KHRvcCk7XG4gICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5zY2FsYXIodG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmJsb2NrU2NhbGFyKHRvcCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1tYXAnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5ibG9ja01hcCh0b3ApO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2VxJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuYmxvY2tTZXF1ZW5jZSh0b3ApO1xuICAgICAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuZmxvd0NvbGxlY3Rpb24odG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1lbmQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5kb2N1bWVudEVuZCh0b3ApO1xuICAgICAgICB9XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgIH1cbiAgICBwZWVrKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSBuXTtcbiAgICB9XG4gICAgKnBvcChlcnJvcikge1xuICAgICAgICBjb25zdCB0b2tlbiA9IGVycm9yID8/IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ1RyaWVkIHRvIHBvcCBhbiBlbXB0eSBzdGFjayc7XG4gICAgICAgICAgICB5aWVsZCB7IHR5cGU6ICdlcnJvcicsIG9mZnNldDogdGhpcy5vZmZzZXQsIHNvdXJjZTogJycsIG1lc3NhZ2UgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0b3AgPSB0aGlzLnBlZWsoMSk7XG4gICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2Jsb2NrLXNjYWxhcicpIHtcbiAgICAgICAgICAgICAgICAvLyBCbG9jayBzY2FsYXJzIHVzZSB0aGVpciBwYXJlbnQgcmF0aGVyIHRoYW4gaGVhZGVyIGluZGVudFxuICAgICAgICAgICAgICAgIHRva2VuLmluZGVudCA9ICdpbmRlbnQnIGluIHRvcCA/IHRvcC5pbmRlbnQgOiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gJ2Zsb3ctY29sbGVjdGlvbicgJiYgdG9wLnR5cGUgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYWxsIGluZGVudCBmb3IgdG9wLWxldmVsIGZsb3cgY29sbGVjdGlvbnNcbiAgICAgICAgICAgICAgICB0b2tlbi5pbmRlbnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdmbG93LWNvbGxlY3Rpb24nKVxuICAgICAgICAgICAgICAgIGZpeEZsb3dTZXFJdGVtcyh0b2tlbik7XG4gICAgICAgICAgICBzd2l0Y2ggKHRvcC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZG9jdW1lbnQnOlxuICAgICAgICAgICAgICAgICAgICB0b3AudmFsdWUgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICAgICAgdG9wLnByb3BzLnB1c2godG9rZW4pOyAvLyBlcnJvclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdibG9jay1tYXAnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ID0gdG9wLml0ZW1zW3RvcC5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwga2V5OiB0b2tlbiwgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnZhbHVlID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogdG9rZW4sIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9ICFpbmNsdWRlc1Rva2VuKGl0LnN0YXJ0LCAnZXhwbGljaXQta2V5LWluZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdibG9jay1zZXEnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ID0gdG9wLml0ZW1zW3RvcC5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLml0ZW1zLnB1c2goeyBzdGFydDogW10sIHZhbHVlOiB0b2tlbiB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQudmFsdWUgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXQgPSB0b3AuaXRlbXNbdG9wLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0IHx8IGl0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogdG9rZW4sIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnNlcClcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnZhbHVlID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiB0b2tlbiwgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AodG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCh0b3AudHlwZSA9PT0gJ2RvY3VtZW50JyB8fFxuICAgICAgICAgICAgICAgIHRvcC50eXBlID09PSAnYmxvY2stbWFwJyB8fFxuICAgICAgICAgICAgICAgIHRvcC50eXBlID09PSAnYmxvY2stc2VxJykgJiZcbiAgICAgICAgICAgICAgICAodG9rZW4udHlwZSA9PT0gJ2Jsb2NrLW1hcCcgfHwgdG9rZW4udHlwZSA9PT0gJ2Jsb2NrLXNlcScpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IHRva2VuLml0ZW1zW3Rva2VuLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0ICYmXG4gICAgICAgICAgICAgICAgICAgICFsYXN0LnNlcCAmJlxuICAgICAgICAgICAgICAgICAgICAhbGFzdC52YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICBsYXN0LnN0YXJ0Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmluZE5vbkVtcHR5SW5kZXgobGFzdC5zdGFydCkgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgICh0b2tlbi5pbmRlbnQgPT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Quc3RhcnQuZXZlcnkoc3QgPT4gc3QudHlwZSAhPT0gJ2NvbW1lbnQnIHx8IHN0LmluZGVudCA8IHRva2VuLmluZGVudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3AudHlwZSA9PT0gJ2RvY3VtZW50JylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5lbmQgPSBsYXN0LnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuaXRlbXMucHVzaCh7IHN0YXJ0OiBsYXN0LnN0YXJ0IH0pO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbi5pdGVtcy5zcGxpY2UoLTEsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAqc3RyZWFtKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZGlyZWN0aXZlLWxpbmUnOlxuICAgICAgICAgICAgICAgIHlpZWxkIHsgdHlwZTogJ2RpcmVjdGl2ZScsIG9mZnNldDogdGhpcy5vZmZzZXQsIHNvdXJjZTogdGhpcy5zb3VyY2UgfTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlICdieXRlLW9yZGVyLW1hcmsnOlxuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLnNvdXJjZVRva2VuO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1tb2RlJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1zdGFydCc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RvYy1zdGFydCcpXG4gICAgICAgICAgICAgICAgICAgIGRvYy5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChkb2MpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBVbmV4cGVjdGVkICR7dGhpcy50eXBlfSB0b2tlbiBpbiBZQU1MIHN0cmVhbWAsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgIH07XG4gICAgfVxuICAgICpkb2N1bWVudChkb2MpIHtcbiAgICAgICAgaWYgKGRvYy52YWx1ZSlcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5saW5lRW5kKGRvYyk7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkb2Mtc3RhcnQnOiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbmROb25FbXB0eUluZGV4KGRvYy5zdGFydCkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZG9jLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnYW5jaG9yJzpcbiAgICAgICAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGRvYy5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidiA9IHRoaXMuc3RhcnRCbG9ja1ZhbHVlKGRvYyk7XG4gICAgICAgIGlmIChidilcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgVW5leHBlY3RlZCAke3RoaXMudHlwZX0gdG9rZW4gaW4gWUFNTCBkb2N1bWVudGAsXG4gICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqc2NhbGFyKHNjYWxhcikge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnbWFwLXZhbHVlLWluZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBnZXRQcmV2UHJvcHModGhpcy5wZWVrKDIpKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gZ2V0Rmlyc3RLZXlTdGFydFByb3BzKHByZXYpO1xuICAgICAgICAgICAgbGV0IHNlcDtcbiAgICAgICAgICAgIGlmIChzY2FsYXIuZW5kKSB7XG4gICAgICAgICAgICAgICAgc2VwID0gc2NhbGFyLmVuZDtcbiAgICAgICAgICAgICAgICBzZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgc2NhbGFyLmVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZXAgPSBbdGhpcy5zb3VyY2VUb2tlbl07XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLW1hcCcsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBzY2FsYXIub2Zmc2V0LFxuICAgICAgICAgICAgICAgIGluZGVudDogc2NhbGFyLmluZGVudCxcbiAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogc2NhbGFyLCBzZXAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV0gPSBtYXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgeWllbGQqIHRoaXMubGluZUVuZChzY2FsYXIpO1xuICAgIH1cbiAgICAqYmxvY2tTY2FsYXIoc2NhbGFyKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHNjYWxhci5wcm9wcy5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgICAgICAgICAgc2NhbGFyLnNvdXJjZSA9IHRoaXMuc291cmNlO1xuICAgICAgICAgICAgICAgIC8vIGJsb2NrLXNjYWxhciBzb3VyY2UgaW5jbHVkZXMgdHJhaWxpbmcgbmV3bGluZVxuICAgICAgICAgICAgICAgIHRoaXMuYXROZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25OZXdMaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBubCA9IHRoaXMuc291cmNlLmluZGV4T2YoJ1xcbicpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5sICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTmV3TGluZSh0aGlzLm9mZnNldCArIG5sKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5sID0gdGhpcy5zb3VyY2UuaW5kZXhPZignXFxuJywgbmwpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAqYmxvY2tNYXAobWFwKSB7XG4gICAgICAgIGNvbnN0IGl0ID0gbWFwLml0ZW1zW21hcC5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgLy8gaXQuc2VwIGlzIHRydWUtaXNoIGlmIHBhaXIgYWxyZWFkeSBoYXMga2V5IG9yIDogc2VwYXJhdG9yXG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAnZW5kJyBpbiBpdC52YWx1ZSA/IGl0LnZhbHVlLmVuZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IEFycmF5LmlzQXJyYXkoZW5kKSA/IGVuZFtlbmQubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Py50eXBlID09PSAnY29tbWVudCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ/LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0LnNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICAgICAgaWYgKGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0LnNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRJbmRlbnRlZENvbW1lbnQoaXQuc3RhcnQsIG1hcC5pbmRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gbWFwLml0ZW1zW21hcC5pdGVtcy5sZW5ndGggLSAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IHByZXY/LnZhbHVlPy5lbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZW5kLCBpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5kZW50ID49IG1hcC5pbmRlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0TmV4dEl0ZW0gPSAhdGhpcy5vbktleUxpbmUgJiYgdGhpcy5pbmRlbnQgPT09IG1hcC5pbmRlbnQgJiYgaXQuc2VwO1xuICAgICAgICAgICAgLy8gRm9yIGVtcHR5IG5vZGVzLCBhc3NpZ24gbmV3bGluZS1zZXBhcmF0ZWQgbm90IGluZGVudGVkIGVtcHR5IHRva2VucyB0byBmb2xsb3dpbmcgbm9kZVxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gW107XG4gICAgICAgICAgICBpZiAoYXROZXh0SXRlbSAmJiBpdC5zZXAgJiYgIWl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmwgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0LnNlcC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdCA9IGl0LnNlcFtpXTtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBubC5wdXNoKGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LmluZGVudCA+IG1hcC5pbmRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5sLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5sLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5sLmxlbmd0aCA+PSAyKVxuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGl0LnNlcC5zcGxpY2UobmxbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdhbmNob3InOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdE5leHRJdGVtIHx8IGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnZXhwbGljaXQta2V5LWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQuc2VwICYmICFpbmNsdWRlc1Rva2VuKGl0LnN0YXJ0LCAnZXhwbGljaXQta2V5LWluZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0TmV4dEl0ZW0gfHwgaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0OiBbdGhpcy5zb3VyY2VUb2tlbl0gfV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ2V4cGxpY2l0LWtleS1pbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ25ld2xpbmUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmNsdWRlc1Rva2VuKGl0LnNlcCwgJ21hcC12YWx1ZS1pbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRmxvd1Rva2VuKGl0LmtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zZXAsICduZXdsaW5lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaXQua2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcCA9IGl0LnNlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGUgZ3VhcmQgaXMgd3JvbmcgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdC5rZXksIGRlbGV0ZSBpdC5zZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLW1hcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydCwga2V5LCBzZXAgfV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgYWN0dWFsbHkgYXQgbmV4dCBpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwID0gaXQuc2VwLmNvbmNhdChzdGFydCwgdGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC5zZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXQuc2VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpdCwgeyBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQudmFsdWUgfHwgYXROZXh0SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHsgc3RhcnQsIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmNsdWRlc1Rva2VuKGl0LnNlcCwgJ21hcC12YWx1ZS1pbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQ6IFtdLCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC5zZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZzID0gdGhpcy5mbG93U2NhbGFyKHRoaXMudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdE5leHRJdGVtIHx8IGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0LCBrZXk6IGZzLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGZzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBmcywgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnYgPSB0aGlzLnN0YXJ0QmxvY2tWYWx1ZShtYXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdE5leHRJdGVtICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnYudHlwZSAhPT0gJ2Jsb2NrLXNlcScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlc1Rva2VuKGl0LnN0YXJ0LCAnZXhwbGljaXQta2V5LWluZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICB9XG4gICAgKmJsb2NrU2VxdWVuY2Uoc2VxKSB7XG4gICAgICAgIGNvbnN0IGl0ID0gc2VxLml0ZW1zW3NlcS5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAnZW5kJyBpbiBpdC52YWx1ZSA/IGl0LnZhbHVlLmVuZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IEFycmF5LmlzQXJyYXkoZW5kKSA/IGVuZFtlbmQubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Py50eXBlID09PSAnY29tbWVudCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ/LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcS5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgc2VxLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdEluZGVudGVkQ29tbWVudChpdC5zdGFydCwgc2VxLmluZGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBzZXEuaXRlbXNbc2VxLml0ZW1zLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcHJldj8udmFsdWU/LmVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShlbmQsIGl0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXEuaXRlbXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICBjYXNlICd0YWcnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSB8fCB0aGlzLmluZGVudCA8PSBzZXEuaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZW50ICE9PSBzZXEuaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUgfHwgaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ3NlcS1pdGVtLWluZCcpKVxuICAgICAgICAgICAgICAgICAgICBzZXEuaXRlbXMucHVzaCh7IHN0YXJ0OiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPiBzZXEuaW5kZW50KSB7XG4gICAgICAgICAgICBjb25zdCBidiA9IHRoaXMuc3RhcnRCbG9ja1ZhbHVlKHNlcSk7XG4gICAgICAgICAgICBpZiAoYnYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goYnYpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgICAqZmxvd0NvbGxlY3Rpb24oZmMpIHtcbiAgICAgICAgY29uc3QgaXQgPSBmYy5pdGVtc1tmYy5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2Zsb3ctZXJyb3ItZW5kJykge1xuICAgICAgICAgICAgbGV0IHRvcDtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB0b3AgPSB0aGlzLnBlZWsoMSk7XG4gICAgICAgICAgICB9IHdoaWxlICh0b3AgJiYgdG9wLnR5cGUgPT09ICdmbG93LWNvbGxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmYy5lbmQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdCB8fCBpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0IHx8IGl0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZmMuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBjYXNlICdhbmNob3InOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZzID0gdGhpcy5mbG93U2NhbGFyKHRoaXMudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFtdLCBrZXk6IGZzLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZnMpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogZnMsIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZmxvdy1tYXAtZW5kJzpcbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LXNlcS1lbmQnOlxuICAgICAgICAgICAgICAgICAgICBmYy5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnYgPSB0aGlzLnN0YXJ0QmxvY2tWYWx1ZShmYyk7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICAgICAgaWYgKGJ2KVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBlZWsoMik7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdibG9jay1tYXAnICYmXG4gICAgICAgICAgICAgICAgKCh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJyAmJiBwYXJlbnQuaW5kZW50ID09PSBmYy5pbmRlbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnR5cGUgPT09ICduZXdsaW5lJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXBhcmVudC5pdGVtc1twYXJlbnQuaXRlbXMubGVuZ3RoIC0gMV0uc2VwKSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJyAmJlxuICAgICAgICAgICAgICAgIHBhcmVudC50eXBlICE9PSAnZmxvdy1jb2xsZWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBnZXRQcmV2UHJvcHMocGFyZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhwcmV2KTtcbiAgICAgICAgICAgICAgICBmaXhGbG93U2VxSXRlbXMoZmMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcCA9IGZjLmVuZC5zcGxpY2UoMSwgZmMuZW5kLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBmYy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudDogZmMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogZmMsIHNlcCB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXSA9IG1hcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLmxpbmVFbmQoZmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZsb3dTY2FsYXIodHlwZSkge1xuICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpIHtcbiAgICAgICAgICAgIGxldCBubCA9IHRoaXMuc291cmNlLmluZGV4T2YoJ1xcbicpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChubCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0ICsgbmwpO1xuICAgICAgICAgICAgICAgIG5sID0gdGhpcy5zb3VyY2UuaW5kZXhPZignXFxuJywgbmwpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBzdGFydEJsb2NrVmFsdWUocGFyZW50KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dTY2FsYXIodGhpcy50eXBlKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhci1oZWFkZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1zY2FsYXInLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogW3RoaXMuc291cmNlVG9rZW5dLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICcnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctbWFwLXN0YXJ0JzpcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctc2VxLXN0YXJ0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvdy1jb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc291cmNlVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlICdzZXEtaXRlbS1pbmQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1zZXEnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzoge1xuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gZ2V0UHJldlByb3BzKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICAgICAgc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0IH1dXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBnZXRQcmV2UHJvcHMocGFyZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhwcmV2KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH1dXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgYXRJbmRlbnRlZENvbW1lbnQoc3RhcnQsIGluZGVudCkge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSAnY29tbWVudCcpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmluZGVudCA8PSBpbmRlbnQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBzdGFydC5ldmVyeShzdCA9PiBzdC50eXBlID09PSAnbmV3bGluZScgfHwgc3QudHlwZSA9PT0gJ3NwYWNlJyk7XG4gICAgfVxuICAgICpkb2N1bWVudEVuZChkb2NFbmQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ2RvYy1tb2RlJykge1xuICAgICAgICAgICAgaWYgKGRvY0VuZC5lbmQpXG4gICAgICAgICAgICAgICAgZG9jRW5kLmVuZC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGRvY0VuZC5lbmQgPSBbdGhpcy5zb3VyY2VUb2tlbl07XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnbmV3bGluZScpXG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgKmxpbmVFbmQodG9rZW4pIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1zdGFydCc6XG4gICAgICAgICAgICBjYXNlICdkb2MtZW5kJzpcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctc2VxLWVuZCc6XG4gICAgICAgICAgICBjYXNlICdmbG93LW1hcC1lbmQnOlxuICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHZhbHVlcyBhcmUgZXJyb3JzXG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4uZW5kLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0b2tlbi5lbmQgPSBbdGhpcy5zb3VyY2VUb2tlbl07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ25ld2xpbmUnKVxuICAgICAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwcmV0dHlFcnJvcnMgPSBvcHRpb25zLnByZXR0eUVycm9ycyAhPT0gZmFsc2U7XG4gICAgY29uc3QgbGluZUNvdW50ZXIgPSBvcHRpb25zLmxpbmVDb3VudGVyIHx8IChwcmV0dHlFcnJvcnMgJiYgbmV3IExpbmVDb3VudGVyKCkpIHx8IG51bGw7XG4gICAgcmV0dXJuIHsgbGluZUNvdW50ZXIsIHByZXR0eUVycm9ycyB9O1xufVxuLyoqXG4gKiBQYXJzZSB0aGUgaW5wdXQgYXMgYSBzdHJlYW0gb2YgWUFNTCBkb2N1bWVudHMuXG4gKlxuICogRG9jdW1lbnRzIHNob3VsZCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyIGJ5IGAuLi5gIG9yIGAtLS1gIG1hcmtlciBsaW5lcy5cbiAqXG4gKiBAcmV0dXJucyBJZiBhbiBlbXB0eSBgZG9jc2AgYXJyYXkgaXMgcmV0dXJuZWQsIGl0IHdpbGwgYmUgb2YgdHlwZVxuICogICBFbXB0eVN0cmVhbSBhbmQgY29udGFpbiBhZGRpdGlvbmFsIHN0cmVhbSBpbmZvcm1hdGlvbi4gSW5cbiAqICAgVHlwZVNjcmlwdCwgeW91IHNob3VsZCB1c2UgYCdlbXB0eScgaW4gZG9jc2AgYXMgYSB0eXBlIGd1YXJkIGZvciBpdC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VBbGxEb2N1bWVudHMoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfSA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpbmVDb3VudGVyPy5hZGROZXdMaW5lKTtcbiAgICBjb25zdCBjb21wb3NlciA9IG5ldyBDb21wb3NlcihvcHRpb25zKTtcbiAgICBjb25zdCBkb2NzID0gQXJyYXkuZnJvbShjb21wb3Nlci5jb21wb3NlKHBhcnNlci5wYXJzZShzb3VyY2UpKSk7XG4gICAgaWYgKHByZXR0eUVycm9ycyAmJiBsaW5lQ291bnRlcilcbiAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgICAgICAgZG9jLmVycm9ycy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICAgICAgZG9jLndhcm5pbmdzLmZvckVhY2gocHJldHRpZnlFcnJvcihzb3VyY2UsIGxpbmVDb3VudGVyKSk7XG4gICAgICAgIH1cbiAgICBpZiAoZG9jcy5sZW5ndGggPiAwKVxuICAgICAgICByZXR1cm4gZG9jcztcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbXSwgeyBlbXB0eTogdHJ1ZSB9LCBjb21wb3Nlci5zdHJlYW1JbmZvKCkpO1xufVxuLyoqIFBhcnNlIGFuIGlucHV0IHN0cmluZyBpbnRvIGEgc2luZ2xlIFlBTUwuRG9jdW1lbnQgKi9cbmZ1bmN0aW9uIHBhcnNlRG9jdW1lbnQoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfSA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpbmVDb3VudGVyPy5hZGROZXdMaW5lKTtcbiAgICBjb25zdCBjb21wb3NlciA9IG5ldyBDb21wb3NlcihvcHRpb25zKTtcbiAgICAvLyBgZG9jYCBpcyBhbHdheXMgc2V0IGJ5IGNvbXBvc2UuZW5kKHRydWUpIGF0IHRoZSB2ZXJ5IGxhdGVzdFxuICAgIGxldCBkb2MgPSBudWxsO1xuICAgIGZvciAoY29uc3QgX2RvYyBvZiBjb21wb3Nlci5jb21wb3NlKHBhcnNlci5wYXJzZShzb3VyY2UpLCB0cnVlLCBzb3VyY2UubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIWRvYylcbiAgICAgICAgICAgIGRvYyA9IF9kb2M7XG4gICAgICAgIGVsc2UgaWYgKGRvYy5vcHRpb25zLmxvZ0xldmVsICE9PSAnc2lsZW50Jykge1xuICAgICAgICAgICAgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MUGFyc2VFcnJvcihfZG9jLnJhbmdlLnNsaWNlKDAsIDIpLCAnTVVMVElQTEVfRE9DUycsICdTb3VyY2UgY29udGFpbnMgbXVsdGlwbGUgZG9jdW1lbnRzOyBwbGVhc2UgdXNlIFlBTUwucGFyc2VBbGxEb2N1bWVudHMoKScpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV0dHlFcnJvcnMgJiYgbGluZUNvdW50ZXIpIHtcbiAgICAgICAgZG9jLmVycm9ycy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICBkb2Mud2FybmluZ3MuZm9yRWFjaChwcmV0dGlmeUVycm9yKHNvdXJjZSwgbGluZUNvdW50ZXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGRvYztcbn1cbmZ1bmN0aW9uIHBhcnNlJGEoc3JjLCByZXZpdmVyLCBvcHRpb25zKSB7XG4gICAgbGV0IF9yZXZpdmVyID0gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgcmV2aXZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBfcmV2aXZlciA9IHJldml2ZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXZpdmVyICYmIHR5cGVvZiByZXZpdmVyID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRpb25zID0gcmV2aXZlcjtcbiAgICB9XG4gICAgY29uc3QgZG9jID0gcGFyc2VEb2N1bWVudChzcmMsIG9wdGlvbnMpO1xuICAgIGlmICghZG9jKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBkb2Mud2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IHdhcm4oZG9jLm9wdGlvbnMubG9nTGV2ZWwsIHdhcm5pbmcpKTtcbiAgICBpZiAoZG9jLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChkb2Mub3B0aW9ucy5sb2dMZXZlbCAhPT0gJ3NpbGVudCcpXG4gICAgICAgICAgICB0aHJvdyBkb2MuZXJyb3JzWzBdO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBkb2MuZXJyb3JzID0gW107XG4gICAgfVxuICAgIHJldHVybiBkb2MudG9KUyhPYmplY3QuYXNzaWduKHsgcmV2aXZlcjogX3Jldml2ZXIgfSwgb3B0aW9ucykpO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5KHZhbHVlLCByZXBsYWNlciwgb3B0aW9ucykge1xuICAgIGxldCBfcmVwbGFjZXIgPSBudWxsO1xuICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicgfHwgQXJyYXkuaXNBcnJheShyZXBsYWNlcikpIHtcbiAgICAgICAgX3JlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiByZXBsYWNlcikge1xuICAgICAgICBvcHRpb25zID0gcmVwbGFjZXI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLmxlbmd0aDtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IGluZGVudCA9IE1hdGgucm91bmQob3B0aW9ucyk7XG4gICAgICAgIG9wdGlvbnMgPSBpbmRlbnQgPCAxID8gdW5kZWZpbmVkIDogaW5kZW50ID4gOCA/IHsgaW5kZW50OiA4IH0gOiB7IGluZGVudCB9O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB7IGtlZXBVbmRlZmluZWQgfSA9IG9wdGlvbnMgPz8gcmVwbGFjZXIgPz8ge307XG4gICAgICAgIGlmICgha2VlcFVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRG9jdW1lbnQodmFsdWUsIF9yZXBsYWNlciwgb3B0aW9ucykudG9TdHJpbmcob3B0aW9ucyk7XG59XG5cbnZhciBZQU1MID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdEFsaWFzOiBBbGlhcyxcblx0Q1NUOiBjc3QsXG5cdENvbXBvc2VyOiBDb21wb3Nlcixcblx0RG9jdW1lbnQ6IERvY3VtZW50LFxuXHRMZXhlcjogTGV4ZXIsXG5cdExpbmVDb3VudGVyOiBMaW5lQ291bnRlcixcblx0UGFpcjogUGFpcixcblx0UGFyc2VyOiBQYXJzZXIsXG5cdFNjYWxhcjogU2NhbGFyLFxuXHRTY2hlbWE6IFNjaGVtYSxcblx0WUFNTEVycm9yOiBZQU1MRXJyb3IsXG5cdFlBTUxNYXA6IFlBTUxNYXAsXG5cdFlBTUxQYXJzZUVycm9yOiBZQU1MUGFyc2VFcnJvcixcblx0WUFNTFNlcTogWUFNTFNlcSxcblx0WUFNTFdhcm5pbmc6IFlBTUxXYXJuaW5nLFxuXHRpc0FsaWFzOiBpc0FsaWFzLFxuXHRpc0NvbGxlY3Rpb246IGlzQ29sbGVjdGlvbiQxLFxuXHRpc0RvY3VtZW50OiBpc0RvY3VtZW50LFxuXHRpc01hcDogaXNNYXAsXG5cdGlzTm9kZTogaXNOb2RlJDEsXG5cdGlzUGFpcjogaXNQYWlyLFxuXHRpc1NjYWxhcjogaXNTY2FsYXIkMSxcblx0aXNTZXE6IGlzU2VxLFxuXHRwYXJzZTogcGFyc2UkYSxcblx0cGFyc2VBbGxEb2N1bWVudHM6IHBhcnNlQWxsRG9jdW1lbnRzLFxuXHRwYXJzZURvY3VtZW50OiBwYXJzZURvY3VtZW50LFxuXHRzdHJpbmdpZnk6IHN0cmluZ2lmeSxcblx0dmlzaXQ6IHZpc2l0JDEsXG5cdHZpc2l0QXN5bmM6IHZpc2l0QXN5bmNcbn07XG5cbi8vIGBleHBvcnQgKiBhcyBkZWZhdWx0IGZyb20gLi4uYCBmYWlscyBvbiBXZWJwYWNrIHY0XG5cbnZhciBicm93c2VyJDEgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0QWxpYXM6IEFsaWFzLFxuXHRDU1Q6IGNzdCxcblx0Q29tcG9zZXI6IENvbXBvc2VyLFxuXHREb2N1bWVudDogRG9jdW1lbnQsXG5cdExleGVyOiBMZXhlcixcblx0TGluZUNvdW50ZXI6IExpbmVDb3VudGVyLFxuXHRQYWlyOiBQYWlyLFxuXHRQYXJzZXI6IFBhcnNlcixcblx0U2NhbGFyOiBTY2FsYXIsXG5cdFNjaGVtYTogU2NoZW1hLFxuXHRZQU1MRXJyb3I6IFlBTUxFcnJvcixcblx0WUFNTE1hcDogWUFNTE1hcCxcblx0WUFNTFBhcnNlRXJyb3I6IFlBTUxQYXJzZUVycm9yLFxuXHRZQU1MU2VxOiBZQU1MU2VxLFxuXHRZQU1MV2FybmluZzogWUFNTFdhcm5pbmcsXG5cdGRlZmF1bHQ6IFlBTUwsXG5cdGlzQWxpYXM6IGlzQWxpYXMsXG5cdGlzQ29sbGVjdGlvbjogaXNDb2xsZWN0aW9uJDEsXG5cdGlzRG9jdW1lbnQ6IGlzRG9jdW1lbnQsXG5cdGlzTWFwOiBpc01hcCxcblx0aXNOb2RlOiBpc05vZGUkMSxcblx0aXNQYWlyOiBpc1BhaXIsXG5cdGlzU2NhbGFyOiBpc1NjYWxhciQxLFxuXHRpc1NlcTogaXNTZXEsXG5cdHBhcnNlOiBwYXJzZSRhLFxuXHRwYXJzZUFsbERvY3VtZW50czogcGFyc2VBbGxEb2N1bWVudHMsXG5cdHBhcnNlRG9jdW1lbnQ6IHBhcnNlRG9jdW1lbnQsXG5cdHN0cmluZ2lmeTogc3RyaW5naWZ5LFxuXHR2aXNpdDogdmlzaXQkMSxcblx0dmlzaXRBc3luYzogdmlzaXRBc3luY1xufTtcblxudmFyIHJlcXVpcmUkJDMkMSA9IC8qQF9fUFVSRV9fKi9nZXRBdWdtZW50ZWROYW1lc3BhY2UoYnJvd3NlciQxKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG4vbm8tZGVwcmVjYXRlZC1hcGlcbmNvbnN0IHsgY3JlYXRlUmVxdWlyZSwgY3JlYXRlUmVxdWlyZUZyb21QYXRoIH0gPSByZXF1aXJlJCQwJDg7XG5cbmZ1bmN0aW9uIHJlcSQyIChuYW1lLCByb290RmlsZSkge1xuICBjb25zdCBjcmVhdGUgPSBjcmVhdGVSZXF1aXJlIHx8IGNyZWF0ZVJlcXVpcmVGcm9tUGF0aDtcbiAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZShyb290RmlsZSk7XG4gIHJldHVybiByZXF1aXJlKG5hbWUpXG59XG5cbnZhciByZXFfMSA9IHJlcSQyO1xuXG5jb25zdCByZXEkMSA9IHJlcV8xO1xuXG4vKipcbiAqIExvYWQgT3B0aW9uc1xuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIG9wdGlvbnNcbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IGNvbmZpZyAgUG9zdENTUyBDb25maWdcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IG9wdGlvbnMgUG9zdENTUyBPcHRpb25zXG4gKi9cbmNvbnN0IG9wdGlvbnMgPSAoY29uZmlnLCBmaWxlKSA9PiB7XG4gIGlmIChjb25maWcucGFyc2VyICYmIHR5cGVvZiBjb25maWcucGFyc2VyID09PSAnc3RyaW5nJykge1xuICAgIHRyeSB7XG4gICAgICBjb25maWcucGFyc2VyID0gcmVxJDEoY29uZmlnLnBhcnNlciwgZmlsZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExvYWRpbmcgUG9zdENTUyBQYXJzZXIgZmFpbGVkOiAke2Vyci5tZXNzYWdlfVxcblxcbihAJHtmaWxlfSlgKVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuc3ludGF4ICYmIHR5cGVvZiBjb25maWcuc3ludGF4ID09PSAnc3RyaW5nJykge1xuICAgIHRyeSB7XG4gICAgICBjb25maWcuc3ludGF4ID0gcmVxJDEoY29uZmlnLnN5bnRheCwgZmlsZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExvYWRpbmcgUG9zdENTUyBTeW50YXggZmFpbGVkOiAke2Vyci5tZXNzYWdlfVxcblxcbihAJHtmaWxlfSlgKVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuc3RyaW5naWZpZXIgJiYgdHlwZW9mIGNvbmZpZy5zdHJpbmdpZmllciA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnkge1xuICAgICAgY29uZmlnLnN0cmluZ2lmaWVyID0gcmVxJDEoY29uZmlnLnN0cmluZ2lmaWVyLCBmaWxlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTG9hZGluZyBQb3N0Q1NTIFN0cmluZ2lmaWVyIGZhaWxlZDogJHtlcnIubWVzc2FnZX1cXG5cXG4oQCR7ZmlsZX0pYClcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnBsdWdpbnMpIHtcbiAgICBkZWxldGUgY29uZmlnLnBsdWdpbnM7XG4gIH1cblxuICByZXR1cm4gY29uZmlnXG59O1xuXG52YXIgb3B0aW9uc18xID0gb3B0aW9ucztcblxuY29uc3QgcmVxID0gcmVxXzE7XG5cbi8qKlxuICogUGx1Z2luIExvYWRlclxuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIGxvYWRcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHBsdWdpbiBQb3N0Q1NTIFBsdWdpbiBOYW1lXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgUG9zdENTUyBQbHVnaW4gT3B0aW9uc1xuICpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBQb3N0Q1NTIFBsdWdpblxuICovXG5jb25zdCBsb2FkID0gKHBsdWdpbiwgb3B0aW9ucywgZmlsZSkgPT4ge1xuICB0cnkge1xuICAgIGlmIChcbiAgICAgIG9wdGlvbnMgPT09IG51bGwgfHxcbiAgICAgIG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gcmVxKHBsdWdpbiwgZmlsZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlcShwbHVnaW4sIGZpbGUpKG9wdGlvbnMpXG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYExvYWRpbmcgUG9zdENTUyBQbHVnaW4gZmFpbGVkOiAke2Vyci5tZXNzYWdlfVxcblxcbihAJHtmaWxlfSlgKVxuICB9XG59O1xuXG4vKipcbiAqIExvYWQgUGx1Z2luc1xuICpcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIHBsdWdpbnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFBvc3RDU1MgQ29uZmlnIFBsdWdpbnNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheX0gcGx1Z2lucyBQb3N0Q1NTIFBsdWdpbnNcbiAqL1xuY29uc3QgcGx1Z2lucyA9IChjb25maWcsIGZpbGUpID0+IHtcbiAgbGV0IHBsdWdpbnMgPSBbXTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcucGx1Z2lucykpIHtcbiAgICBwbHVnaW5zID0gY29uZmlnLnBsdWdpbnMuZmlsdGVyKEJvb2xlYW4pO1xuICB9IGVsc2Uge1xuICAgIHBsdWdpbnMgPSBPYmplY3Qua2V5cyhjb25maWcucGx1Z2lucylcbiAgICAgIC5maWx0ZXIoKHBsdWdpbikgPT4ge1xuICAgICAgICByZXR1cm4gY29uZmlnLnBsdWdpbnNbcGx1Z2luXSAhPT0gZmFsc2UgPyBwbHVnaW4gOiAnJ1xuICAgICAgfSlcbiAgICAgIC5tYXAoKHBsdWdpbikgPT4ge1xuICAgICAgICByZXR1cm4gbG9hZChwbHVnaW4sIGNvbmZpZy5wbHVnaW5zW3BsdWdpbl0sIGZpbGUpXG4gICAgICB9KTtcbiAgfVxuXG4gIGlmIChwbHVnaW5zLmxlbmd0aCAmJiBwbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBwbHVnaW5zLmZvckVhY2goKHBsdWdpbiwgaSkgPT4ge1xuICAgICAgaWYgKHBsdWdpbi5kZWZhdWx0KSB7XG4gICAgICAgIHBsdWdpbiA9IHBsdWdpbi5kZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAocGx1Z2luLnBvc3Rjc3MgPT09IHRydWUpIHtcbiAgICAgICAgcGx1Z2luID0gcGx1Z2luKCk7XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbi5wb3N0Y3NzKSB7XG4gICAgICAgIHBsdWdpbiA9IHBsdWdpbi5wb3N0Y3NzO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAhKFxuICAgICAgICAgICh0eXBlb2YgcGx1Z2luID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHBsdWdpbi5wbHVnaW5zKSkgfHxcbiAgICAgICAgICAodHlwZW9mIHBsdWdpbiA9PT0gJ29iamVjdCcgJiYgcGx1Z2luLnBvc3Rjc3NQbHVnaW4pIHx8XG4gICAgICAgICAgKHR5cGVvZiBwbHVnaW4gPT09ICdmdW5jdGlvbicpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFBvc3RDU1MgUGx1Z2luIGZvdW5kIGF0OiBwbHVnaW5zWyR7aX1dXFxuXFxuKEAke2ZpbGV9KWApXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcGx1Z2luc1xufTtcblxudmFyIHBsdWdpbnNfMSA9IHBsdWdpbnM7XG5cbmNvbnN0IHJlc29sdmUgPSByZXF1aXJlJCQwJDQucmVzb2x2ZTtcbmNvbnN0IHVybCQ0ID0gcmVxdWlyZSQkMCQ5O1xuXG5jb25zdCBjb25maWckMSA9IGRpc3Q7XG5jb25zdCB5YW1sID0gcmVxdWlyZSQkMyQxO1xuXG5jb25zdCBsb2FkT3B0aW9ucyA9IG9wdGlvbnNfMTtcbmNvbnN0IGxvYWRQbHVnaW5zID0gcGx1Z2luc18xO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY29uc3QgaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gKG9iaikgPT4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTtcblxuLyoqXG4gKiBQcm9jZXNzIHRoZSByZXN1bHQgZnJvbSBjb3NtaWNvbmZpZ1xuICpcbiAqIEBwYXJhbSAge09iamVjdH0gY3R4IENvbmZpZyBDb250ZXh0XG4gKiBAcGFyYW0gIHtPYmplY3R9IHJlc3VsdCBDb3NtaWNvbmZpZyByZXN1bHRcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IFBvc3RDU1MgQ29uZmlnXG4gKi9cbmNvbnN0IHByb2Nlc3NSZXN1bHQgPSAoY3R4LCByZXN1bHQpID0+IHtcbiAgY29uc3QgZmlsZSA9IHJlc3VsdC5maWxlcGF0aCB8fCAnJztcbiAgbGV0IGNvbmZpZyA9IGludGVyb3BSZXF1aXJlRGVmYXVsdChyZXN1bHQuY29uZmlnKS5kZWZhdWx0IHx8IHt9O1xuXG4gIGlmICh0eXBlb2YgY29uZmlnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uZmlnID0gY29uZmlnKGN0eCk7XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnLCBjdHgpO1xuICB9XG5cbiAgaWYgKCFjb25maWcucGx1Z2lucykge1xuICAgIGNvbmZpZy5wbHVnaW5zID0gW107XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBsdWdpbnM6IGxvYWRQbHVnaW5zKGNvbmZpZywgZmlsZSksXG4gICAgb3B0aW9uczogbG9hZE9wdGlvbnMoY29uZmlnLCBmaWxlKSxcbiAgICBmaWxlXG4gIH1cbn07XG5cbi8qKlxuICogQnVpbGRzIHRoZSBDb25maWcgQ29udGV4dFxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gY3R4IENvbmZpZyBDb250ZXh0XG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBDb25maWcgQ29udGV4dFxuICovXG5jb25zdCBjcmVhdGVDb250ZXh0ID0gKGN0eCkgPT4ge1xuICAvKipcbiAgICogQHR5cGUge09iamVjdH1cbiAgICpcbiAgICogQHByb3Age1N0cmluZ30gY3dkPXByb2Nlc3MuY3dkKCkgQ29uZmlnIHNlYXJjaCBzdGFydCBsb2NhdGlvblxuICAgKiBAcHJvcCB7U3RyaW5nfSBlbnY9cHJvY2Vzcy5lbnYuTk9ERV9FTlYgQ29uZmlnIEVudmlyb21lbnQsIHdpbGwgYmUgc2V0IHRvIGBkZXZlbG9wbWVudGAgYnkgYHBvc3Rjc3MtbG9hZC1jb25maWdgIGlmIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgaXMgYHVuZGVmaW5lZGBcbiAgICovXG4gIGN0eCA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBlbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WXG4gIH0sIGN0eCk7XG5cbiAgaWYgKCFjdHguZW52KSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPSAnZGV2ZWxvcG1lbnQnO1xuICB9XG5cbiAgcmV0dXJuIGN0eFxufTtcblxuY29uc3QgaW1wb3J0RGVmYXVsdCA9IGFzeW5jIGZpbGVwYXRoID0+IHtcbiAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KHVybCQ0LnBhdGhUb0ZpbGVVUkwoZmlsZXBhdGgpLmhyZWYpO1xuICByZXR1cm4gbW9kdWxlLmRlZmF1bHRcbn07XG5cbmNvbnN0IGFkZFR5cGVTY3JpcHRMb2FkZXIgPSAob3B0aW9ucyA9IHt9LCBsb2FkZXIpID0+IHtcbiAgY29uc3QgbW9kdWxlTmFtZSA9ICdwb3N0Y3NzJztcblxuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgc2VhcmNoUGxhY2VzOiBbXG4gICAgICAuLi4ob3B0aW9ucy5zZWFyY2hQbGFjZXMgfHwgW10pLFxuICAgICAgJ3BhY2thZ2UuanNvbicsXG4gICAgICBgLiR7bW9kdWxlTmFtZX1yY2AsXG4gICAgICBgLiR7bW9kdWxlTmFtZX1yYy5qc29uYCxcbiAgICAgIGAuJHttb2R1bGVOYW1lfXJjLnlhbWxgLFxuICAgICAgYC4ke21vZHVsZU5hbWV9cmMueW1sYCxcbiAgICAgIGAuJHttb2R1bGVOYW1lfXJjLnRzYCxcbiAgICAgIGAuJHttb2R1bGVOYW1lfXJjLmpzYCxcbiAgICAgIGAuJHttb2R1bGVOYW1lfXJjLmNqc2AsXG4gICAgICBgLiR7bW9kdWxlTmFtZX1yYy5tanNgLFxuICAgICAgYCR7bW9kdWxlTmFtZX0uY29uZmlnLnRzYCxcbiAgICAgIGAke21vZHVsZU5hbWV9LmNvbmZpZy5qc2AsXG4gICAgICBgJHttb2R1bGVOYW1lfS5jb25maWcuY2pzYCxcbiAgICAgIGAke21vZHVsZU5hbWV9LmNvbmZpZy5tanNgXG4gICAgXSxcbiAgICBsb2FkZXJzOiB7XG4gICAgICAuLi5vcHRpb25zLmxvYWRlcnMsXG4gICAgICAnLnlhbWwnOiAoZmlsZXBhdGgsIGNvbnRlbnQpID0+IHlhbWwucGFyc2UoY29udGVudCksXG4gICAgICAnLnltbCc6IChmaWxlcGF0aCwgY29udGVudCkgPT4geWFtbC5wYXJzZShjb250ZW50KSxcbiAgICAgICcuanMnOiBpbXBvcnREZWZhdWx0LFxuICAgICAgJy5janMnOiBpbXBvcnREZWZhdWx0LFxuICAgICAgJy5tanMnOiBpbXBvcnREZWZhdWx0LFxuICAgICAgJy50cyc6IGxvYWRlclxuICAgIH1cbiAgfVxufTtcblxuY29uc3Qgd2l0aFR5cGVTY3JpcHRMb2FkZXIgPSAocmNGdW5jKSA9PiB7XG4gIHJldHVybiAoY3R4LCBwYXRoLCBvcHRpb25zKSA9PiB7XG4gICAgcmV0dXJuIHJjRnVuYyhjdHgsIHBhdGgsIGFkZFR5cGVTY3JpcHRMb2FkZXIob3B0aW9ucywgKGNvbmZpZ0ZpbGUpID0+IHtcbiAgICAgIGxldCByZWdpc3RlcmVyID0geyBlbmFibGVkICgpIHt9IH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFJlZ2lzdGVyIFR5cGVTY3JpcHQgY29tcGlsZXIgaW5zdGFuY2VcbiAgICAgICAgcmVnaXN0ZXJlciA9IF9fcmVxdWlyZSgndHMtbm9kZScpLnJlZ2lzdGVyKCk7XG5cbiAgICAgICAgcmV0dXJuIF9fcmVxdWlyZShjb25maWdGaWxlKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCd0cy1ub2RlJyBpcyByZXF1aXJlZCBmb3IgdGhlIFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiBmaWxlcy4gTWFrZSBzdXJlIGl0IGlzIGluc3RhbGxlZFxcbkVycm9yOiAke2Vyci5tZXNzYWdlfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlZ2lzdGVyZXIuZW5hYmxlZChmYWxzZSk7XG4gICAgICB9XG4gICAgfSkpXG4gIH1cbn07XG5cbi8qKlxuICogTG9hZCBDb25maWdcbiAqXG4gKiBAbWV0aG9kIHJjXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBjdHggQ29uZmlnIENvbnRleHRcbiAqIEBwYXJhbSAge1N0cmluZ30gcGF0aCBDb25maWcgUGF0aFxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zIENvbmZpZyBPcHRpb25zXG4gKlxuICogQHJldHVybiB7UHJvbWlzZX0gY29uZmlnIFBvc3RDU1MgQ29uZmlnXG4gKi9cbmNvbnN0IHJjID0gd2l0aFR5cGVTY3JpcHRMb2FkZXIoKGN0eCwgcGF0aCwgb3B0aW9ucykgPT4ge1xuICAvKipcbiAgICogQHR5cGUge09iamVjdH0gVGhlIGZ1bGwgQ29uZmlnIENvbnRleHRcbiAgICovXG4gIGN0eCA9IGNyZWF0ZUNvbnRleHQoY3R4KTtcblxuICAvKipcbiAgICogQHR5cGUge1N0cmluZ30gYHByb2Nlc3MuY3dkKClgXG4gICAqL1xuICBwYXRoID0gcGF0aCA/IHJlc29sdmUocGF0aCkgOiBwcm9jZXNzLmN3ZCgpO1xuXG4gIHJldHVybiBjb25maWckMS5saWxjb25maWcoJ3Bvc3Rjc3MnLCBvcHRpb25zKVxuICAgIC5zZWFyY2gocGF0aClcbiAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIFBvc3RDU1MgQ29uZmlnIGZvdW5kIGluOiAke3BhdGh9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByb2Nlc3NSZXN1bHQoY3R4LCByZXN1bHQpXG4gICAgfSlcbn0pO1xuXG4vKipcbiAqIEF1dG9sb2FkIENvbmZpZyBmb3IgUG9zdENTU1xuICpcbiAqIEBhdXRob3IgTWljaGFlbCBDaW5pYXdza3kgQG1pY2hhZWwtY2luaWF3c2t5IDxtaWNoYWVsLmNpbmlhd3NreUBnbWFpbC5jb20+XG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBAbW9kdWxlIHBvc3Rjc3MtbG9hZC1jb25maWdcbiAqIEB2ZXJzaW9uIDIuMS4wXG4gKlxuICogQHJlcXVpcmVzIGNvbXNpY29uZmlnXG4gKiBAcmVxdWlyZXMgLi9vcHRpb25zXG4gKiBAcmVxdWlyZXMgLi9wbHVnaW5zXG4gKi9cbnZhciBzcmMkMSA9IHJjO1xuXG5mdW5jdGlvbiBzdHJpcExpdGVyYWxBY29ybihjb2RlKSB7XG4gIGNvbnN0IEZJTEwgPSBcIiBcIjtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGZ1bmN0aW9uIGZ1bGZpbGwoaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPiByZXN1bHQubGVuZ3RoKVxuICAgICAgcmVzdWx0ICs9IGNvZGUuc2xpY2UocmVzdWx0Lmxlbmd0aCwgaW5kZXgpLnJlcGxhY2UoL1teXFxuXS9nLCBGSUxMKTtcbiAgfVxuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZXIoY29kZSwge1xuICAgIGVjbWFWZXJzaW9uOiBcImxhdGVzdFwiLFxuICAgIHNvdXJjZVR5cGU6IFwibW9kdWxlXCIsXG4gICAgYWxsb3dIYXNoQmFuZzogdHJ1ZSxcbiAgICBhbGxvd0F3YWl0T3V0c2lkZUZ1bmN0aW9uOiB0cnVlLFxuICAgIGFsbG93SW1wb3J0RXhwb3J0RXZlcnl3aGVyZTogdHJ1ZVxuICB9KTtcbiAgY29uc3QgaW50ZXIgPSB0b2tlbnNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWU6IHRva2VuIH0gPSBpbnRlci5uZXh0KCk7XG4gICAgaWYgKGRvbmUpXG4gICAgICBicmVhaztcbiAgICBmdWxmaWxsKHRva2VuLnN0YXJ0KTtcbiAgICBpZiAodG9rZW4udHlwZS5sYWJlbCA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJlc3VsdCArPSBjb2RlW3Rva2VuLnN0YXJ0XSArIEZJTEwucmVwZWF0KHRva2VuLmVuZCAtIHRva2VuLnN0YXJ0IC0gMikgKyBjb2RlW3Rva2VuLmVuZCAtIDFdO1xuICAgIGVsc2UgaWYgKHRva2VuLnR5cGUubGFiZWwgPT09IFwidGVtcGxhdGVcIilcbiAgICAgIHJlc3VsdCArPSBGSUxMLnJlcGVhdCh0b2tlbi5lbmQgLSB0b2tlbi5zdGFydCk7XG4gICAgZWxzZVxuICAgICAgcmVzdWx0ICs9IGNvZGUuc2xpY2UodG9rZW4uc3RhcnQsIHRva2VuLmVuZCk7XG4gIH1cbiAgZnVsZmlsbChjb2RlLmxlbmd0aCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IG11bHRpbGluZUNvbW1lbnRzUkUgPSAvXFwvXFwqKFteKlxcL10pKj9cXCpcXC8vZ21zO1xuY29uc3Qgc2luZ2xlbGluZUNvbW1lbnRzUkUgPSAvKD86XnxcXG58XFxyKVxccypcXC9cXC8uKig/OlxccnxcXG58JCkvZ207XG5jb25zdCB0ZW1wbGF0ZUxpdGVyYWxSRSA9IC9cXCRcXHsoXFxzKig/Oig/IVxcJFxceykufFxcbnxcXHIpKj9cXHMqKVxcfS9nO1xuY29uc3QgcXVvdGVzUkUgPSBbXG4gIC8oW1wiJ2BdKSgoPzpcXFxcXFwxfCg/IVxcMSl8LnxcXHIpKj8pXFwxL2dtLFxuICAvKFtgXSkoKD86XFxcXFxcMXwoPyFcXDEpfC58XFxufFxccikqPylcXDEvZ21cbiAgLy8gbXVsdGktbGluZSBzdHJpbmdzIChpLmUuIHRlbXBsYXRlIGxpdGVyYWxzIG9ubHkpXG5dO1xuZnVuY3Rpb24gc3RyaXBMaXRlcmFsUmVnZXgoY29kZSkge1xuICBjb2RlID0gY29kZS5yZXBsYWNlKG11bHRpbGluZUNvbW1lbnRzUkUsIChzKSA9PiBcIiBcIi5yZXBlYXQocy5sZW5ndGgpKS5yZXBsYWNlKHNpbmdsZWxpbmVDb21tZW50c1JFLCAocykgPT4gXCIgXCIucmVwZWF0KHMubGVuZ3RoKSk7XG4gIGxldCBleHBhbmRlZCA9IGNvZGU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIGNvbnN0IGJlZm9yZSA9IGV4cGFuZGVkO1xuICAgIGV4cGFuZGVkID0gZXhwYW5kZWQucmVwbGFjZSh0ZW1wbGF0ZUxpdGVyYWxSRSwgXCJgICQxYFwiKTtcbiAgICBpZiAoZXhwYW5kZWQgPT09IGJlZm9yZSlcbiAgICAgIGJyZWFrO1xuICB9XG4gIHF1b3Rlc1JFLmZvckVhY2goKHJlKSA9PiB7XG4gICAgZXhwYW5kZWQgPSBleHBhbmRlZC5yZXBsYWNlKHJlLCAocywgcXVvdGUsIGJvZHksIGluZGV4KSA9PiB7XG4gICAgICBjb2RlID0gY29kZS5zbGljZSgwLCBpbmRleCArIDEpICsgXCIgXCIucmVwZWF0KHMubGVuZ3RoIC0gMikgKyBjb2RlLnNsaWNlKGluZGV4ICsgcy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiBxdW90ZSArIFwiIFwiLnJlcGVhdChzLmxlbmd0aCAtIDIpICsgcXVvdGU7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gY29kZTtcbn1cblxuZnVuY3Rpb24gc3RyaXBMaXRlcmFsKGNvZGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc3RyaXBMaXRlcmFsQWNvcm4oY29kZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gc3RyaXBMaXRlcmFsUmVnZXgoY29kZSk7XG4gIH1cbn1cblxudmFyIG1haW5FeHBvcnRzID0ge307XG52YXIgbWFpbiQxID0ge1xuICBnZXQgZXhwb3J0cygpeyByZXR1cm4gbWFpbkV4cG9ydHM7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBtYWluRXhwb3J0cyA9IHY7IH0sXG59O1xuXG52YXIgbmFtZSA9IFwiZG90ZW52XCI7XG52YXIgdmVyc2lvbiQxID0gXCIxNi4wLjNcIjtcbnZhciBkZXNjcmlwdGlvbiA9IFwiTG9hZHMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gLmVudiBmaWxlXCI7XG52YXIgbWFpbiA9IFwibGliL21haW4uanNcIjtcbnZhciB0eXBlcyA9IFwibGliL21haW4uZC50c1wiO1xudmFyIGV4cG9ydHMgPSB7XG5cdFwiLlwiOiB7XG5cdFx0cmVxdWlyZTogXCIuL2xpYi9tYWluLmpzXCIsXG5cdFx0dHlwZXM6IFwiLi9saWIvbWFpbi5kLnRzXCIsXG5cdFx0XCJkZWZhdWx0XCI6IFwiLi9saWIvbWFpbi5qc1wiXG5cdH0sXG5cdFwiLi9jb25maWdcIjogXCIuL2NvbmZpZy5qc1wiLFxuXHRcIi4vY29uZmlnLmpzXCI6IFwiLi9jb25maWcuanNcIixcblx0XCIuL2xpYi9lbnYtb3B0aW9uc1wiOiBcIi4vbGliL2Vudi1vcHRpb25zLmpzXCIsXG5cdFwiLi9saWIvZW52LW9wdGlvbnMuanNcIjogXCIuL2xpYi9lbnYtb3B0aW9ucy5qc1wiLFxuXHRcIi4vbGliL2NsaS1vcHRpb25zXCI6IFwiLi9saWIvY2xpLW9wdGlvbnMuanNcIixcblx0XCIuL2xpYi9jbGktb3B0aW9ucy5qc1wiOiBcIi4vbGliL2NsaS1vcHRpb25zLmpzXCIsXG5cdFwiLi9wYWNrYWdlLmpzb25cIjogXCIuL3BhY2thZ2UuanNvblwiXG59O1xudmFyIHNjcmlwdHMgPSB7XG5cdFwiZHRzLWNoZWNrXCI6IFwidHNjIC0tcHJvamVjdCB0ZXN0cy90eXBlcy90c2NvbmZpZy5qc29uXCIsXG5cdGxpbnQ6IFwic3RhbmRhcmRcIixcblx0XCJsaW50LXJlYWRtZVwiOiBcInN0YW5kYXJkLW1hcmtkb3duXCIsXG5cdHByZXRlc3Q6IFwibnBtIHJ1biBsaW50ICYmIG5wbSBydW4gZHRzLWNoZWNrXCIsXG5cdHRlc3Q6IFwidGFwIHRlc3RzLyouanMgLS0xMDAgLVJzcGVjXCIsXG5cdHByZXJlbGVhc2U6IFwibnBtIHRlc3RcIixcblx0cmVsZWFzZTogXCJzdGFuZGFyZC12ZXJzaW9uXCJcbn07XG52YXIgcmVwb3NpdG9yeSA9IHtcblx0dHlwZTogXCJnaXRcIixcblx0dXJsOiBcImdpdDovL2dpdGh1Yi5jb20vbW90ZG90bGEvZG90ZW52LmdpdFwiXG59O1xudmFyIGtleXdvcmRzID0gW1xuXHRcImRvdGVudlwiLFxuXHRcImVudlwiLFxuXHRcIi5lbnZcIixcblx0XCJlbnZpcm9ubWVudFwiLFxuXHRcInZhcmlhYmxlc1wiLFxuXHRcImNvbmZpZ1wiLFxuXHRcInNldHRpbmdzXCJcbl07XG52YXIgcmVhZG1lRmlsZW5hbWUgPSBcIlJFQURNRS5tZFwiO1xudmFyIGxpY2Vuc2UgPSBcIkJTRC0yLUNsYXVzZVwiO1xudmFyIGRldkRlcGVuZGVuY2llcyA9IHtcblx0XCJAdHlwZXMvbm9kZVwiOiBcIl4xNy4wLjlcIixcblx0ZGVjYWNoZTogXCJeNC42LjFcIixcblx0ZHRzbGludDogXCJeMy43LjBcIixcblx0c2lub246IFwiXjEyLjAuMVwiLFxuXHRzdGFuZGFyZDogXCJeMTYuMC40XCIsXG5cdFwic3RhbmRhcmQtbWFya2Rvd25cIjogXCJeNy4xLjBcIixcblx0XCJzdGFuZGFyZC12ZXJzaW9uXCI6IFwiXjkuMy4yXCIsXG5cdHRhcDogXCJeMTUuMS42XCIsXG5cdHRhcjogXCJeNi4xLjExXCIsXG5cdHR5cGVzY3JpcHQ6IFwiXjQuNS40XCJcbn07XG52YXIgZW5naW5lcyA9IHtcblx0bm9kZTogXCI+PTEyXCJcbn07XG52YXIgcmVxdWlyZSQkMyA9IHtcblx0bmFtZTogbmFtZSxcblx0dmVyc2lvbjogdmVyc2lvbiQxLFxuXHRkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG5cdG1haW46IG1haW4sXG5cdHR5cGVzOiB0eXBlcyxcblx0ZXhwb3J0czogZXhwb3J0cyxcblx0c2NyaXB0czogc2NyaXB0cyxcblx0cmVwb3NpdG9yeTogcmVwb3NpdG9yeSxcblx0a2V5d29yZHM6IGtleXdvcmRzLFxuXHRyZWFkbWVGaWxlbmFtZTogcmVhZG1lRmlsZW5hbWUsXG5cdGxpY2Vuc2U6IGxpY2Vuc2UsXG5cdGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLFxuXHRlbmdpbmVzOiBlbmdpbmVzXG59O1xuXG5jb25zdCBmcyQ5ID0gcmVxdWlyZSQkMF9fZGVmYXVsdDtcbmNvbnN0IHBhdGgkOSA9IHJlcXVpcmUkJDAkNDtcbmNvbnN0IG9zJDIgPSByZXF1aXJlJCQyO1xuY29uc3QgcGFja2FnZUpzb24gPSByZXF1aXJlJCQzO1xuXG5jb25zdCB2ZXJzaW9uID0gcGFja2FnZUpzb24udmVyc2lvbjtcblxuY29uc3QgTElORSA9IC8oPzpefF4pXFxzKig/OmV4cG9ydFxccyspPyhbXFx3Li1dKykoPzpcXHMqPVxccyo/fDpcXHMrPykoXFxzKicoPzpcXFxcJ3xbXiddKSonfFxccypcIig/OlxcXFxcInxbXlwiXSkqXCJ8XFxzKmAoPzpcXFxcYHxbXmBdKSpgfFteI1xcclxcbl0rKT9cXHMqKD86Iy4qKT8oPzokfCQpL21nO1xuXG4vLyBQYXJzZXIgc3JjIGludG8gYW4gT2JqZWN0XG5mdW5jdGlvbiBwYXJzZSQ5IChzcmMpIHtcbiAgY29uc3Qgb2JqID0ge307XG5cbiAgLy8gQ29udmVydCBidWZmZXIgdG8gc3RyaW5nXG4gIGxldCBsaW5lcyA9IHNyYy50b1N0cmluZygpO1xuXG4gIC8vIENvbnZlcnQgbGluZSBicmVha3MgdG8gc2FtZSBmb3JtYXRcbiAgbGluZXMgPSBsaW5lcy5yZXBsYWNlKC9cXHJcXG4/L21nLCAnXFxuJyk7XG5cbiAgbGV0IG1hdGNoO1xuICB3aGlsZSAoKG1hdGNoID0gTElORS5leGVjKGxpbmVzKSkgIT0gbnVsbCkge1xuICAgIGNvbnN0IGtleSA9IG1hdGNoWzFdO1xuXG4gICAgLy8gRGVmYXVsdCB1bmRlZmluZWQgb3IgbnVsbCB0byBlbXB0eSBzdHJpbmdcbiAgICBsZXQgdmFsdWUgPSAobWF0Y2hbMl0gfHwgJycpO1xuXG4gICAgLy8gUmVtb3ZlIHdoaXRlc3BhY2VcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcblxuICAgIC8vIENoZWNrIGlmIGRvdWJsZSBxdW90ZWRcbiAgICBjb25zdCBtYXliZVF1b3RlID0gdmFsdWVbMF07XG5cbiAgICAvLyBSZW1vdmUgc3Vycm91bmRpbmcgcXVvdGVzXG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eKFsnXCJgXSkoW1xcc1xcU10qKVxcMSQvbWcsICckMicpO1xuXG4gICAgLy8gRXhwYW5kIG5ld2xpbmVzIGlmIGRvdWJsZSBxdW90ZWRcbiAgICBpZiAobWF5YmVRdW90ZSA9PT0gJ1wiJykge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXFxcbi9nLCAnXFxuJyk7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcXFxyL2csICdcXHInKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdG8gb2JqZWN0XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuZnVuY3Rpb24gX2xvZyAobWVzc2FnZSkge1xuICBjb25zb2xlLmxvZyhgW2RvdGVudkAke3ZlcnNpb259XVtERUJVR10gJHttZXNzYWdlfWApO1xufVxuXG5mdW5jdGlvbiBfcmVzb2x2ZUhvbWUgKGVudlBhdGgpIHtcbiAgcmV0dXJuIGVudlBhdGhbMF0gPT09ICd+JyA/IHBhdGgkOS5qb2luKG9zJDIuaG9tZWRpcigpLCBlbnZQYXRoLnNsaWNlKDEpKSA6IGVudlBhdGhcbn1cblxuLy8gUG9wdWxhdGVzIHByb2Nlc3MuZW52IGZyb20gLmVudiBmaWxlXG5mdW5jdGlvbiBjb25maWcgKG9wdGlvbnMpIHtcbiAgbGV0IGRvdGVudlBhdGggPSBwYXRoJDkucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudicpO1xuICBsZXQgZW5jb2RpbmcgPSAndXRmOCc7XG4gIGNvbnN0IGRlYnVnID0gQm9vbGVhbihvcHRpb25zICYmIG9wdGlvbnMuZGVidWcpO1xuICBjb25zdCBvdmVycmlkZSA9IEJvb2xlYW4ob3B0aW9ucyAmJiBvcHRpb25zLm92ZXJyaWRlKTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnBhdGggIT0gbnVsbCkge1xuICAgICAgZG90ZW52UGF0aCA9IF9yZXNvbHZlSG9tZShvcHRpb25zLnBhdGgpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5lbmNvZGluZyAhPSBudWxsKSB7XG4gICAgICBlbmNvZGluZyA9IG9wdGlvbnMuZW5jb2Rpbmc7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBTcGVjaWZ5aW5nIGFuIGVuY29kaW5nIHJldHVybnMgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGJ1ZmZlclxuICAgIGNvbnN0IHBhcnNlZCA9IERvdGVudk1vZHVsZS5wYXJzZShmcyQ5LnJlYWRGaWxlU3luYyhkb3RlbnZQYXRoLCB7IGVuY29kaW5nIH0pKTtcblxuICAgIE9iamVjdC5rZXlzKHBhcnNlZCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm9jZXNzLmVudiwga2V5KSkge1xuICAgICAgICBwcm9jZXNzLmVudltrZXldID0gcGFyc2VkW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3ZlcnJpZGUgPT09IHRydWUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVudltrZXldID0gcGFyc2VkW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICBpZiAob3ZlcnJpZGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIF9sb2coYFwiJHtrZXl9XCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIFxcYHByb2Nlc3MuZW52XFxgIGFuZCBXQVMgb3ZlcndyaXR0ZW5gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX2xvZyhgXCIke2tleX1cIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gXFxgcHJvY2Vzcy5lbnZcXGAgYW5kIHdhcyBOT1Qgb3ZlcndyaXR0ZW5gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7IHBhcnNlZCB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIF9sb2coYEZhaWxlZCB0byBsb2FkICR7ZG90ZW52UGF0aH0gJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZXJyb3I6IGUgfVxuICB9XG59XG5cbmNvbnN0IERvdGVudk1vZHVsZSA9IHtcbiAgY29uZmlnLFxuICBwYXJzZTogcGFyc2UkOVxufTtcblxubWFpbkV4cG9ydHMuY29uZmlnID0gRG90ZW52TW9kdWxlLmNvbmZpZztcbnZhciBwYXJzZV8xJDEgPSBtYWluRXhwb3J0cy5wYXJzZSA9IERvdGVudk1vZHVsZS5wYXJzZTtcbm1haW4kMS5leHBvcnRzID0gRG90ZW52TW9kdWxlO1xuXG5mdW5jdGlvbiBfaW50ZXJwb2xhdGUgKGVudlZhbHVlLCBlbnZpcm9ubWVudCwgY29uZmlnKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSBlbnZWYWx1ZS5tYXRjaCgvKC4/XFwkeypbXFx3XSooPzo6LVtcXHcvXSopP30qKS9nKSB8fCBbXTtcblxuICByZXR1cm4gbWF0Y2hlcy5yZWR1Y2UoZnVuY3Rpb24gKG5ld0VudiwgbWF0Y2gsIGluZGV4KSB7XG4gICAgY29uc3QgcGFydHMgPSAvKC4/KVxcJHsqKFtcXHddKig/OjotW1xcdy9dKik/KT99Ki9nLmV4ZWMobWF0Y2gpO1xuICAgIGlmICghcGFydHMgfHwgcGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV3RW52XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZml4ID0gcGFydHNbMV07XG5cbiAgICBsZXQgdmFsdWUsIHJlcGxhY2VQYXJ0O1xuXG4gICAgaWYgKHByZWZpeCA9PT0gJ1xcXFwnKSB7XG4gICAgICByZXBsYWNlUGFydCA9IHBhcnRzWzBdO1xuICAgICAgdmFsdWUgPSByZXBsYWNlUGFydC5yZXBsYWNlKCdcXFxcJCcsICckJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBBVENIOiBjb21wYXRpYmxlIHdpdGggZW52IHZhcmlhYmxlcyBlbmRlZCB3aXRoIHVuZXNjYXBlZCAkXG4gICAgICBpZighcGFydHNbMl0pIHtcbiAgICAgICAgcmV0dXJuIG5ld0VudlxuICAgICAgfVxuICAgICAgY29uc3Qga2V5UGFydHMgPSBwYXJ0c1syXS5zcGxpdCgnOi0nKTtcbiAgICAgIGNvbnN0IGtleSA9IGtleVBhcnRzWzBdO1xuICAgICAgcmVwbGFjZVBhcnQgPSBwYXJ0c1swXS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCk7XG4gICAgICAvLyBwcm9jZXNzLmVudiB2YWx1ZSAnd2lucycgb3ZlciAuZW52IGZpbGUncyB2YWx1ZVxuICAgICAgdmFsdWUgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZW52aXJvbm1lbnQsIGtleSlcbiAgICAgICAgPyBlbnZpcm9ubWVudFtrZXldXG4gICAgICAgIDogKGNvbmZpZy5wYXJzZWRba2V5XSB8fCBrZXlQYXJ0c1sxXSB8fCAnJyk7XG5cbiAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBmb3VuZCwgcmVtb3ZlIG5lc3RlZCBleHBhbnNpb25zLlxuICAgICAgaWYgKGtleVBhcnRzLmxlbmd0aCA+IDEgJiYgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZU5lc3RlZCA9IG1hdGNoZXNbaW5kZXggKyAxXTtcbiAgICAgICAgbWF0Y2hlc1tpbmRleCArIDFdID0gJyc7XG5cbiAgICAgICAgbmV3RW52ID0gbmV3RW52LnJlcGxhY2UocmVwbGFjZU5lc3RlZCwgJycpO1xuICAgICAgfVxuICAgICAgLy8gUmVzb2x2ZSByZWN1cnNpdmUgaW50ZXJwb2xhdGlvbnNcbiAgICAgIHZhbHVlID0gX2ludGVycG9sYXRlKHZhbHVlLCBlbnZpcm9ubWVudCwgY29uZmlnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RW52LnJlcGxhY2UocmVwbGFjZVBhcnQsIHZhbHVlKVxuICB9LCBlbnZWYWx1ZSlcbn1cblxuZnVuY3Rpb24gZXhwYW5kIChjb25maWcpIHtcbiAgLy8gaWYgaWdub3JpbmcgcHJvY2Vzcy5lbnYsIHVzZSBhIGJsYW5rIG9iamVjdFxuICBjb25zdCBlbnZpcm9ubWVudCA9IGNvbmZpZy5pZ25vcmVQcm9jZXNzRW52ID8ge30gOiBwcm9jZXNzLmVudjtcblxuICBmb3IgKGNvbnN0IGNvbmZpZ0tleSBpbiBjb25maWcucGFyc2VkKSB7XG4gICAgY29uc3QgdmFsdWUgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZW52aXJvbm1lbnQsIGNvbmZpZ0tleSkgPyBlbnZpcm9ubWVudFtjb25maWdLZXldIDogY29uZmlnLnBhcnNlZFtjb25maWdLZXldO1xuXG4gICAgY29uZmlnLnBhcnNlZFtjb25maWdLZXldID0gX2ludGVycG9sYXRlKHZhbHVlLCBlbnZpcm9ubWVudCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vIFBBVENIOiBkb24ndCB3cml0ZSB0byBwcm9jZXNzLmVudlxuICAvLyBmb3IgKGNvbnN0IHByb2Nlc3NLZXkgaW4gY29uZmlnLnBhcnNlZCkge1xuICAvLyAgIGVudmlyb25tZW50W3Byb2Nlc3NLZXldID0gY29uZmlnLnBhcnNlZFtwcm9jZXNzS2V5XVxuICAvLyB9XG5cbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG52YXIgZXhwYW5kXzEgPSBleHBhbmQ7XG5cbmZ1bmN0aW9uIGxvYWRFbnYobW9kZSwgZW52RGlyLCBwcmVmaXhlcyA9ICdWSVRFXycpIHtcbiAgICBpZiAobW9kZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwibG9jYWxcIiBjYW5ub3QgYmUgdXNlZCBhcyBhIG1vZGUgbmFtZSBiZWNhdXNlIGl0IGNvbmZsaWN0cyB3aXRoIGAgK1xuICAgICAgICAgICAgYHRoZSAubG9jYWwgcG9zdGZpeCBmb3IgLmVudiBmaWxlcy5gKTtcbiAgICB9XG4gICAgcHJlZml4ZXMgPSBhcnJhaWZ5KHByZWZpeGVzKTtcbiAgICBjb25zdCBlbnYgPSB7fTtcbiAgICBjb25zdCBlbnZGaWxlcyA9IFtcbiAgICAgICAgLyoqIGRlZmF1bHQgZmlsZSAqLyBgLmVudmAsXG4gICAgICAgIC8qKiBsb2NhbCBmaWxlICovIGAuZW52LmxvY2FsYCxcbiAgICAgICAgLyoqIG1vZGUgZmlsZSAqLyBgLmVudi4ke21vZGV9YCxcbiAgICAgICAgLyoqIG1vZGUgbG9jYWwgZmlsZSAqLyBgLmVudi4ke21vZGV9LmxvY2FsYCxcbiAgICBdO1xuICAgIGNvbnN0IHBhcnNlZCA9IE9iamVjdC5mcm9tRW50cmllcyhlbnZGaWxlcy5mbGF0TWFwKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBsb29rdXBGaWxlKGVudkRpciwgW2ZpbGVdLCB7XG4gICAgICAgICAgICBwYXRoT25seTogdHJ1ZSxcbiAgICAgICAgICAgIHJvb3REaXI6IGVudkRpcixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcGF0aClcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHBhcnNlXzEkMShmcyRsLnJlYWRGaWxlU3luYyhwYXRoKSkpO1xuICAgIH0pKTtcbiAgICAvLyB0ZXN0IE5PREVfRU5WIG92ZXJyaWRlIGJlZm9yZSBleHBhbmQgYXMgb3RoZXJ3aXNlIHByb2Nlc3MuZW52Lk5PREVfRU5WIHdvdWxkIG92ZXJyaWRlIHRoaXNcbiAgICBpZiAocGFyc2VkLk5PREVfRU5WICYmIHByb2Nlc3MuZW52LlZJVEVfVVNFUl9OT0RFX0VOViA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb2Nlc3MuZW52LlZJVEVfVVNFUl9OT0RFX0VOViA9IHBhcnNlZC5OT0RFX0VOVjtcbiAgICB9XG4gICAgLy8gc3VwcG9ydCBCUk9XU0VSIGFuZCBCUk9XU0VSX0FSR1MgZW52IHZhcmlhYmxlc1xuICAgIGlmIChwYXJzZWQuQlJPV1NFUiAmJiBwcm9jZXNzLmVudi5CUk9XU0VSID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuQlJPV1NFUiA9IHBhcnNlZC5CUk9XU0VSO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLkJST1dTRVJfQVJHUyAmJiBwcm9jZXNzLmVudi5CUk9XU0VSX0FSR1MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9jZXNzLmVudi5CUk9XU0VSX0FSR1MgPSBwYXJzZWQuQlJPV1NFUl9BUkdTO1xuICAgIH1cbiAgICAvLyBsZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZSBlYWNoIG90aGVyXG4gICAgLy8gYGV4cGFuZGAgcGF0Y2hlZCBpbiBwYXRjaGVzL2RvdGVudi1leHBhbmRAOS4wLjAucGF0Y2hcbiAgICBleHBhbmRfMSh7IHBhcnNlZCB9KTtcbiAgICAvLyBvbmx5IGtleXMgdGhhdCBzdGFydCB3aXRoIHByZWZpeCBhcmUgZXhwb3NlZCB0byBjbGllbnRcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChwcmVmaXhlcy5zb21lKChwcmVmaXgpID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpKSB7XG4gICAgICAgICAgICBlbnZba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhY3R1YWwgZW52IHZhcmlhYmxlcyBzdGFydGluZyB3aXRoIFZJVEVfKlxuICAgIC8vIHRoZXNlIGFyZSB0eXBpY2FsbHkgcHJvdmlkZWQgaW5saW5lIGFuZCBzaG91bGQgYmUgcHJpb3JpdGl6ZWRcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9jZXNzLmVudikge1xuICAgICAgICBpZiAocHJlZml4ZXMuc29tZSgocHJlZml4KSA9PiBrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSkge1xuICAgICAgICAgICAgZW52W2tleV0gPSBwcm9jZXNzLmVudltrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnY7XG59XG5mdW5jdGlvbiByZXNvbHZlRW52UHJlZml4KHsgZW52UHJlZml4ID0gJ1ZJVEVfJywgfSkge1xuICAgIGVudlByZWZpeCA9IGFycmFpZnkoZW52UHJlZml4KTtcbiAgICBpZiAoZW52UHJlZml4LnNvbWUoKHByZWZpeCkgPT4gcHJlZml4ID09PSAnJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBlbnZQcmVmaXggb3B0aW9uIGNvbnRhaW5zIHZhbHVlICcnLCB3aGljaCBjb3VsZCBsZWFkIHVuZXhwZWN0ZWQgZXhwb3N1cmUgb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uLmApO1xuICAgIH1cbiAgICByZXR1cm4gZW52UHJlZml4O1xufVxuXG5jb25zdCBtb2R1bGVQcmVsb2FkUG9seWZpbGxJZCA9ICd2aXRlL21vZHVsZXByZWxvYWQtcG9seWZpbGwnO1xuY29uc3QgcmVzb2x2ZWRNb2R1bGVQcmVsb2FkUG9seWZpbGxJZCA9ICdcXDAnICsgbW9kdWxlUHJlbG9hZFBvbHlmaWxsSWQ7XG5mdW5jdGlvbiBtb2R1bGVQcmVsb2FkUG9seWZpbGxQbHVnaW4oY29uZmlnKSB7XG4gICAgLy8gYGlzTW9kZXJuRmxhZ2AgaXMgb25seSBhdmFpbGFibGUgZHVyaW5nIGJ1aWxkIHNpbmNlIGl0IGlzIHJlc29sdmVkIGJ5IGB2aXRlOmJ1aWxkLWltcG9ydC1hbmFseXNpc2BcbiAgICBjb25zdCBza2lwID0gY29uZmlnLmNvbW1hbmQgIT09ICdidWlsZCcgfHwgY29uZmlnLmJ1aWxkLnNzcjtcbiAgICBsZXQgcG9seWZpbGxTdHJpbmc7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3ZpdGU6bW9kdWxlcHJlbG9hZC1wb2x5ZmlsbCcsXG4gICAgICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgICAgICAgaWYgKGlkID09PSBtb2R1bGVQcmVsb2FkUG9seWZpbGxJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZE1vZHVsZVByZWxvYWRQb2x5ZmlsbElkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsb2FkKGlkKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT09IHJlc29sdmVkTW9kdWxlUHJlbG9hZFBvbHlmaWxsSWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcG9seWZpbGxTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9seWZpbGxTdHJpbmcgPSBgJHtpc01vZGVybkZsYWd9JiYoJHtwb2x5ZmlsbC50b1N0cmluZygpfSgpKTtgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcG9seWZpbGxTdHJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBvbHlmaWxsKCkge1xuICAgIGNvbnN0IHJlbExpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJykucmVsTGlzdDtcbiAgICBpZiAocmVsTGlzdCAmJiByZWxMaXN0LnN1cHBvcnRzICYmIHJlbExpc3Quc3VwcG9ydHMoJ21vZHVsZXByZWxvYWQnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgbGluayBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3JlbD1cIm1vZHVsZXByZWxvYWRcIl0nKSkge1xuICAgICAgICBwcm9jZXNzUHJlbG9hZChsaW5rKTtcbiAgICB9XG4gICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucykge1xuICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgIT09ICdjaGlsZExpc3QnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgbXV0YXRpb24uYWRkZWROb2Rlcykge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnRhZ05hbWUgPT09ICdMSU5LJyAmJiBub2RlLnJlbCA9PT0gJ21vZHVsZXByZWxvYWQnKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUHJlbG9hZChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pLm9ic2VydmUoZG9jdW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuICAgIGZ1bmN0aW9uIGdldEZldGNoT3B0cyhsaW5rKSB7XG4gICAgICAgIGNvbnN0IGZldGNoT3B0cyA9IHt9O1xuICAgICAgICBpZiAobGluay5pbnRlZ3JpdHkpXG4gICAgICAgICAgICBmZXRjaE9wdHMuaW50ZWdyaXR5ID0gbGluay5pbnRlZ3JpdHk7XG4gICAgICAgIGlmIChsaW5rLnJlZmVycmVyUG9saWN5KVxuICAgICAgICAgICAgZmV0Y2hPcHRzLnJlZmVycmVyUG9saWN5ID0gbGluay5yZWZlcnJlclBvbGljeTtcbiAgICAgICAgaWYgKGxpbmsuY3Jvc3NPcmlnaW4gPT09ICd1c2UtY3JlZGVudGlhbHMnKVxuICAgICAgICAgICAgZmV0Y2hPcHRzLmNyZWRlbnRpYWxzID0gJ2luY2x1ZGUnO1xuICAgICAgICBlbHNlIGlmIChsaW5rLmNyb3NzT3JpZ2luID09PSAnYW5vbnltb3VzJylcbiAgICAgICAgICAgIGZldGNoT3B0cy5jcmVkZW50aWFscyA9ICdvbWl0JztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmV0Y2hPcHRzLmNyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJztcbiAgICAgICAgcmV0dXJuIGZldGNoT3B0cztcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvY2Vzc1ByZWxvYWQobGluaykge1xuICAgICAgICBpZiAobGluay5lcClcbiAgICAgICAgICAgIC8vIGVwIG1hcmtlciA9IHByb2Nlc3NlZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsaW5rLmVwID0gdHJ1ZTtcbiAgICAgICAgLy8gcHJlcG9wdWxhdGUgdGhlIGxvYWQgcmVjb3JkXG4gICAgICAgIGNvbnN0IGZldGNoT3B0cyA9IGdldEZldGNoT3B0cyhsaW5rKTtcbiAgICAgICAgZmV0Y2gobGluay5ocmVmLCBmZXRjaE9wdHMpO1xuICAgIH1cbn1cblxuY29uc3QgaHRtbFByb3h5UkUkMSA9IC9cXD9odG1sLXByb3h5PT8oPzomaW5saW5lLWNzcyk/JmluZGV4PShcXGQrKVxcLihqc3xjc3MpJC87XG5jb25zdCBpbmxpbmVDU1NSRSQxID0gL19fVklURV9JTkxJTkVfQ1NTX18oW2EtelxcZF17OH1fXFxkKylfXy9nO1xuLy8gRG8gbm90IGFsbG93IHByZWNlZGluZyAnLicsIGJ1dCBkbyBhbGxvdyBwcmVjZWRpbmcgJy4uLicgZm9yIHNwcmVhZCBvcGVyYXRpb25zXG5jb25zdCBpbmxpbmVJbXBvcnRSRSA9IC8oPzwhKD88IVxcLlxcLilcXC4pXFxiaW1wb3J0XFxzKlxcKChcIig/OlteXCJdfCg/PD1cXFxcKVwiKSpcInwnKD86W14nXXwoPzw9XFxcXCknKSonKVxcKS9nO1xuY29uc3QgaHRtbExhbmdSRSA9IC9cXC4oPzpodG1sfGh0bSkkLztcbmNvbnN0IGltcG9ydE1hcFJFID0gL1sgXFx0XSo8c2NyaXB0W14+XSp0eXBlXFxzKj1cXHMqKD86XCJpbXBvcnRtYXBcInwnaW1wb3J0bWFwJ3xpbXBvcnRtYXApW14+XSo+Lio/PFxcL3NjcmlwdD4vaXM7XG5jb25zdCBtb2R1bGVTY3JpcHRSRSA9IC9bIFxcdF0qPHNjcmlwdFtePl0qdHlwZVxccyo9XFxzKig/OlwibW9kdWxlXCJ8J21vZHVsZSd8bW9kdWxlKVtePl0qPi9pO1xuY29uc3QgbW9kdWxlUHJlbG9hZExpbmtSRSA9IC9bIFxcdF0qPGxpbmtbXj5dKnJlbFxccyo9XFxzKig/OlwibW9kdWxlcHJlbG9hZFwifCdtb2R1bGVwcmVsb2FkJ3xtb2R1bGVwcmVsb2FkKVtcXHNcXFNdKj9cXC8+L2k7XG5jb25zdCBpbXBvcnRNYXBBcHBlbmRSRSA9IG5ldyBSZWdFeHAoW21vZHVsZVNjcmlwdFJFLCBtb2R1bGVQcmVsb2FkTGlua1JFXS5tYXAoKHIpID0+IHIuc291cmNlKS5qb2luKCd8JyksICdpJyk7XG5jb25zdCBpc0hUTUxQcm94eSA9IChpZCkgPT4gaHRtbFByb3h5UkUkMS50ZXN0KGlkKTtcbmNvbnN0IGlzSFRNTFJlcXVlc3QgPSAocmVxdWVzdCkgPT4gaHRtbExhbmdSRS50ZXN0KHJlcXVlc3QpO1xuLy8gSFRNTCBQcm94eSBDYWNoZXMgYXJlIHN0b3JlZCBieSBjb25maWcgLT4gZmlsZVBhdGggLT4gaW5kZXhcbmNvbnN0IGh0bWxQcm94eU1hcCA9IG5ldyBXZWFrTWFwKCk7XG4vLyBIVE1MIFByb3h5IFRyYW5zZm9ybSByZXN1bHQgYXJlIHN0b3JlZCBieSBjb25maWdcbi8vIGAke2hhc2goaW1wb3J0ZXIpfV8ke3F1ZXJ5LmluZGV4fWAgLT4gdHJhbnNmb3JtZWQgY3NzIGNvZGVcbi8vIFBTOiBrZXkgbGlrZSBgaGFzaCgvdml0ZS9wbGF5Z3JvdW5kL2Fzc2V0cy9pbmRleC5odG1sKV8xYClcbmNvbnN0IGh0bWxQcm94eVJlc3VsdCA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGh0bWxJbmxpbmVQcm94eVBsdWdpbihjb25maWcpIHtcbiAgICAvLyBTaG91bGQgZG8gdGhpcyB3aGVuIGBjb25zdHJ1Y3RvcmAgcmF0aGVyIHRoYW4gd2hlbiBgYnVpbGRTdGFydGAsXG4gICAgLy8gYGJ1aWxkU3RhcnRgIHdpbGwgYmUgdHJpZ2dlcmVkIG11bHRpcGxlIHRpbWVzIHRoZW4gdGhlIGNhY2hlZCByZXN1bHQgd2lsbCBiZSBlbXB0aWVkLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92aXRlanMvdml0ZS9pc3N1ZXMvNjM3MlxuICAgIGh0bWxQcm94eU1hcC5zZXQoY29uZmlnLCBuZXcgTWFwKCkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmh0bWwtaW5saW5lLXByb3h5JyxcbiAgICAgICAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgICAgICAgICBpZiAoaHRtbFByb3h5UkUkMS50ZXN0KGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbG9hZChpZCkge1xuICAgICAgICAgICAgY29uc3QgcHJveHlNYXRjaCA9IGlkLm1hdGNoKGh0bWxQcm94eVJFJDEpO1xuICAgICAgICAgICAgaWYgKHByb3h5TWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihwcm94eU1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gY2xlYW5VcmwoaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGZpbGUucmVwbGFjZShub3JtYWxpemVQYXRoJDMoY29uZmlnLnJvb3QpLCAnJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaHRtbFByb3h5TWFwLmdldChjb25maWcpLmdldCh1cmwpW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1hdGNoaW5nIEhUTUwgcHJveHkgbW9kdWxlIGZvdW5kIGZyb20gJHtpZH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGFkZFRvSFRNTFByb3h5Q2FjaGUoY29uZmlnLCBmaWxlUGF0aCwgaW5kZXgsIHJlc3VsdCkge1xuICAgIGlmICghaHRtbFByb3h5TWFwLmdldChjb25maWcpKSB7XG4gICAgICAgIGh0bWxQcm94eU1hcC5zZXQoY29uZmlnLCBuZXcgTWFwKCkpO1xuICAgIH1cbiAgICBpZiAoIWh0bWxQcm94eU1hcC5nZXQoY29uZmlnKS5nZXQoZmlsZVBhdGgpKSB7XG4gICAgICAgIGh0bWxQcm94eU1hcC5nZXQoY29uZmlnKS5zZXQoZmlsZVBhdGgsIFtdKTtcbiAgICB9XG4gICAgaHRtbFByb3h5TWFwLmdldChjb25maWcpLmdldChmaWxlUGF0aClbaW5kZXhdID0gcmVzdWx0O1xufVxuZnVuY3Rpb24gYWRkVG9IVE1MUHJveHlUcmFuc2Zvcm1SZXN1bHQoaGFzaCwgY29kZSkge1xuICAgIGh0bWxQcm94eVJlc3VsdC5zZXQoaGFzaCwgY29kZSk7XG59XG4vLyB0aGlzIGV4dGVuZHMgdGhlIGNvbmZpZyBpbiBAdnVlL2NvbXBpbGVyLXNmYyB3aXRoIDxsaW5rIGhyZWY+XG5jb25zdCBhc3NldEF0dHJzQ29uZmlnID0ge1xuICAgIGxpbms6IFsnaHJlZiddLFxuICAgIHZpZGVvOiBbJ3NyYycsICdwb3N0ZXInXSxcbiAgICBzb3VyY2U6IFsnc3JjJywgJ3NyY3NldCddLFxuICAgIGltZzogWydzcmMnLCAnc3Jjc2V0J10sXG4gICAgaW1hZ2U6IFsneGxpbms6aHJlZicsICdocmVmJ10sXG4gICAgdXNlOiBbJ3hsaW5rOmhyZWYnLCAnaHJlZiddLFxufTtcbmNvbnN0IGlzQXN5bmNTY3JpcHRNYXAgPSBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gbm9kZUlzRWxlbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZU5hbWVbMF0gIT09ICcjJztcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlTm9kZXMobm9kZSwgdmlzaXRvcikge1xuICAgIHZpc2l0b3Iobm9kZSk7XG4gICAgaWYgKG5vZGVJc0VsZW1lbnQobm9kZSkgfHxcbiAgICAgICAgbm9kZS5ub2RlTmFtZSA9PT0gJyNkb2N1bWVudCcgfHxcbiAgICAgICAgbm9kZS5ub2RlTmFtZSA9PT0gJyNkb2N1bWVudC1mcmFnbWVudCcpIHtcbiAgICAgICAgbm9kZS5jaGlsZE5vZGVzLmZvckVhY2goKGNoaWxkTm9kZSkgPT4gdHJhdmVyc2VOb2RlcyhjaGlsZE5vZGUsIHZpc2l0b3IpKTtcbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiB0cmF2ZXJzZUh0bWwoaHRtbCwgZmlsZVBhdGgsIHZpc2l0b3IpIHtcbiAgICAvLyBsYXp5IGxvYWQgY29tcGlsZXJcbiAgICBjb25zdCB7IHBhcnNlIH0gPSBhd2FpdCBpbXBvcnQoJy4vZGVwLTk4ZDA3ZjcxLmpzJyk7XG4gICAgY29uc3QgYXN0ID0gcGFyc2UoaHRtbCwge1xuICAgICAgICBzY3JpcHRpbmdFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgc291cmNlQ29kZUxvY2F0aW9uSW5mbzogdHJ1ZSxcbiAgICAgICAgb25QYXJzZUVycm9yOiAoZSkgPT4ge1xuICAgICAgICAgICAgaGFuZGxlUGFyc2VFcnJvcihlLCBodG1sLCBmaWxlUGF0aCk7XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgdHJhdmVyc2VOb2Rlcyhhc3QsIHZpc2l0b3IpO1xufVxuZnVuY3Rpb24gZ2V0U2NyaXB0SW5mbyhub2RlKSB7XG4gICAgbGV0IHNyYztcbiAgICBsZXQgc291cmNlQ29kZUxvY2F0aW9uO1xuICAgIGxldCBpc01vZHVsZSA9IGZhbHNlO1xuICAgIGxldCBpc0FzeW5jID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBwIG9mIG5vZGUuYXR0cnMpIHtcbiAgICAgICAgaWYgKHAucHJlZml4ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKHAubmFtZSA9PT0gJ3NyYycpIHtcbiAgICAgICAgICAgIGlmICghc3JjKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gcDtcbiAgICAgICAgICAgICAgICBzb3VyY2VDb2RlTG9jYXRpb24gPSBub2RlLnNvdXJjZUNvZGVMb2NhdGlvbj8uYXR0cnNbJ3NyYyddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHAubmFtZSA9PT0gJ3R5cGUnICYmIHAudmFsdWUgJiYgcC52YWx1ZSA9PT0gJ21vZHVsZScpIHtcbiAgICAgICAgICAgIGlzTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwLm5hbWUgPT09ICdhc3luYycpIHtcbiAgICAgICAgICAgIGlzQXN5bmMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHNyYywgc291cmNlQ29kZUxvY2F0aW9uLCBpc01vZHVsZSwgaXNBc3luYyB9O1xufVxuY29uc3QgYXR0clZhbHVlU3RhcnRSRSA9IC89XFxzKiguKS87XG5mdW5jdGlvbiBvdmVyd3JpdGVBdHRyVmFsdWUocywgc291cmNlQ29kZUxvY2F0aW9uLCBuZXdWYWx1ZSkge1xuICAgIGNvbnN0IHNyY1N0cmluZyA9IHMuc2xpY2Uoc291cmNlQ29kZUxvY2F0aW9uLnN0YXJ0T2Zmc2V0LCBzb3VyY2VDb2RlTG9jYXRpb24uZW5kT2Zmc2V0KTtcbiAgICBjb25zdCB2YWx1ZVN0YXJ0ID0gc3JjU3RyaW5nLm1hdGNoKGF0dHJWYWx1ZVN0YXJ0UkUpO1xuICAgIGlmICghdmFsdWVTdGFydCkge1xuICAgICAgICAvLyBvdmVyd3JpdGUgYXR0ciB2YWx1ZSBjYW4gb25seSBiZSBjYWxsZWQgZm9yIGEgd2VsbC1kZWZpbmVkIHZhbHVlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgW3ZpdGU6aHRtbF0gaW50ZXJuYWwgZXJyb3IsIGZhaWxlZCB0byBvdmVyd3JpdGUgYXR0cmlidXRlIHZhbHVlYCk7XG4gICAgfVxuICAgIGNvbnN0IHdyYXBPZmZzZXQgPSB2YWx1ZVN0YXJ0WzFdID09PSAnXCInIHx8IHZhbHVlU3RhcnRbMV0gPT09IFwiJ1wiID8gMSA6IDA7XG4gICAgY29uc3QgdmFsdWVPZmZzZXQgPSB2YWx1ZVN0YXJ0LmluZGV4ICsgdmFsdWVTdGFydFswXS5sZW5ndGggLSAxO1xuICAgIHMudXBkYXRlKHNvdXJjZUNvZGVMb2NhdGlvbi5zdGFydE9mZnNldCArIHZhbHVlT2Zmc2V0ICsgd3JhcE9mZnNldCwgc291cmNlQ29kZUxvY2F0aW9uLmVuZE9mZnNldCAtIHdyYXBPZmZzZXQsIG5ld1ZhbHVlKTtcbiAgICByZXR1cm4gcztcbn1cbi8qKlxuICogRm9ybWF0IHBhcnNlNSBAdHlwZSB7UGFyc2VyRXJyb3J9IHRvIEB0eXBlIHtSb2xsdXBFcnJvcn1cbiAqL1xuZnVuY3Rpb24gZm9ybWF0UGFyc2VFcnJvcihwYXJzZXJFcnJvciwgaWQsIGh0bWwpIHtcbiAgICBjb25zdCBmb3JtYXR0ZWRFcnJvciA9IHtcbiAgICAgICAgY29kZTogcGFyc2VyRXJyb3IuY29kZSxcbiAgICAgICAgbWVzc2FnZTogYHBhcnNlNSBlcnJvciBjb2RlICR7cGFyc2VyRXJyb3IuY29kZX1gLFxuICAgICAgICBmcmFtZTogZ2VuZXJhdGVDb2RlRnJhbWUoaHRtbCwgcGFyc2VyRXJyb3Iuc3RhcnRPZmZzZXQpLFxuICAgICAgICBsb2M6IHtcbiAgICAgICAgICAgIGZpbGU6IGlkLFxuICAgICAgICAgICAgbGluZTogcGFyc2VyRXJyb3Iuc3RhcnRMaW5lLFxuICAgICAgICAgICAgY29sdW1uOiBwYXJzZXJFcnJvci5zdGFydENvbCxcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBmb3JtYXR0ZWRFcnJvcjtcbn1cbmZ1bmN0aW9uIGhhbmRsZVBhcnNlRXJyb3IocGFyc2VyRXJyb3IsIGh0bWwsIGZpbGVQYXRoKSB7XG4gICAgc3dpdGNoIChwYXJzZXJFcnJvci5jb2RlKSB7XG4gICAgICAgIGNhc2UgJ21pc3NpbmctZG9jdHlwZSc6XG4gICAgICAgICAgICAvLyBpZ25vcmUgbWlzc2luZyBET0NUWVBFXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ2FiYW5kb25lZC1oZWFkLWVsZW1lbnQtY2hpbGQnOlxuICAgICAgICAgICAgLy8gQWNjZXB0IGVsZW1lbnRzIHdpdGhvdXQgY2xvc2luZyB0YWcgaW4gPGhlYWQ+XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ2R1cGxpY2F0ZS1hdHRyaWJ1dGUnOlxuICAgICAgICAgICAgLy8gQWNjZXB0IGR1cGxpY2F0ZSBhdHRyaWJ1dGVzICM5NTY2XG4gICAgICAgICAgICAvLyBUaGUgZmlyc3QgYXR0cmlidXRlIGlzIHVzZWQsIGJyb3dzZXJzIHNpbGVudGx5IGlnbm9yZSBkdXBsaWNhdGVzXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ25vbi12b2lkLWh0bWwtZWxlbWVudC1zdGFydC10YWctd2l0aC10cmFpbGluZy1zb2xpZHVzJzpcbiAgICAgICAgICAgIC8vIEFsbG93IHNlbGYgY2xvc2luZyBvbiBub24tdm9pZCBlbGVtZW50cyAjMTA0MzlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VFcnJvciA9IGZvcm1hdFBhcnNlRXJyb3IocGFyc2VyRXJyb3IsIGZpbGVQYXRoLCBodG1sKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBwYXJzZSBIVE1MOyAke3BhcnNlRXJyb3IubWVzc2FnZX1cXG5gICtcbiAgICAgICAgYCBhdCAke3BhcnNlRXJyb3IubG9jLmZpbGV9OiR7cGFyc2VFcnJvci5sb2MubGluZX06JHtwYXJzZUVycm9yLmxvYy5jb2x1bW59XFxuYCArXG4gICAgICAgIGAke3BhcnNlRXJyb3IuZnJhbWV9YCk7XG59XG4vKipcbiAqIENvbXBpbGVzIGluZGV4Lmh0bWwgaW50byBhbiBlbnRyeSBqcyBtb2R1bGVcbiAqL1xuZnVuY3Rpb24gYnVpbGRIdG1sUGx1Z2luKGNvbmZpZykge1xuICAgIGNvbnN0IFtwcmVIb29rcywgbm9ybWFsSG9va3MsIHBvc3RIb29rc10gPSByZXNvbHZlSHRtbFRyYW5zZm9ybXMoY29uZmlnLnBsdWdpbnMpO1xuICAgIHByZUhvb2tzLnVuc2hpZnQocHJlSW1wb3J0TWFwSG9vayhjb25maWcpKTtcbiAgICBwcmVIb29rcy5wdXNoKGh0bWxFbnZIb29rKGNvbmZpZykpO1xuICAgIHBvc3RIb29rcy5wdXNoKHBvc3RJbXBvcnRNYXBIb29rKCkpO1xuICAgIGNvbnN0IHByb2Nlc3NlZEh0bWwgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgaXNFeGNsdWRlZFVybCA9ICh1cmwpID0+IHVybC5zdGFydHNXaXRoKCcjJykgfHxcbiAgICAgICAgaXNFeHRlcm5hbFVybCh1cmwpIHx8XG4gICAgICAgIGlzRGF0YVVybCh1cmwpIHx8XG4gICAgICAgIGNoZWNrUHVibGljRmlsZSh1cmwsIGNvbmZpZyk7XG4gICAgLy8gU2FtZSByZWFzb24gd2l0aCBgaHRtbElubGluZVByb3h5UGx1Z2luYFxuICAgIGlzQXN5bmNTY3JpcHRNYXAuc2V0KGNvbmZpZywgbmV3IE1hcCgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTpidWlsZC1odG1sJyxcbiAgICAgICAgYXN5bmMgdHJhbnNmb3JtKGh0bWwsIGlkKSB7XG4gICAgICAgICAgICBpZiAoaWQuZW5kc1dpdGgoJy5odG1sJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGl2ZVVybFBhdGggPSBwYXRoJG8ucG9zaXgucmVsYXRpdmUoY29uZmlnLnJvb3QsIG5vcm1hbGl6ZVBhdGgkMyhpZCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHB1YmxpY1BhdGggPSBgLyR7cmVsYXRpdmVVcmxQYXRofWA7XG4gICAgICAgICAgICAgICAgY29uc3QgcHVibGljQmFzZSA9IGdldEJhc2VJbkhUTUwocmVsYXRpdmVVcmxQYXRoLCBjb25maWcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHB1YmxpY1RvUmVsYXRpdmUgPSAoZmlsZW5hbWUsIGltcG9ydGVyKSA9PiBwdWJsaWNCYXNlICsgZmlsZW5hbWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9PdXRwdXRQdWJsaWNGaWxlUGF0aCA9ICh1cmwpID0+IHRvT3V0cHV0RmlsZVBhdGhJbkh0bWwodXJsLnNsaWNlKDEpLCAncHVibGljJywgcmVsYXRpdmVVcmxQYXRoLCAnaHRtbCcsIGNvbmZpZywgcHVibGljVG9SZWxhdGl2ZSk7XG4gICAgICAgICAgICAgICAgLy8gcHJlLXRyYW5zZm9ybVxuICAgICAgICAgICAgICAgIGh0bWwgPSBhd2FpdCBhcHBseUh0bWxUcmFuc2Zvcm1zKGh0bWwsIHByZUhvb2tzLCB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHB1YmxpY1BhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBpZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQganMgPSAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gbmV3IE1hZ2ljU3RyaW5nKGh0bWwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0VXJscyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdFVybHMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZVVybHMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgaW5saW5lTW9kdWxlSW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICBsZXQgZXZlcnlTY3JpcHRJc0FzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgc29tZVNjcmlwdHNBcmVBc3luYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxldCBzb21lU2NyaXB0c0FyZURlZmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYXdhaXQgdHJhdmVyc2VIdG1sKGh0bWwsIGlkLCAobm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVJc0VsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvdWxkUmVtb3ZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNjcmlwdCB0YWdzXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAnc2NyaXB0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBzcmMsIHNvdXJjZUNvZGVMb2NhdGlvbiwgaXNNb2R1bGUsIGlzQXN5bmMgfSA9IGdldFNjcmlwdEluZm8obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBzcmMgJiYgc3JjLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNQdWJsaWNGaWxlID0gISEodXJsICYmIGNoZWNrUHVibGljRmlsZSh1cmwsIGNvbmZpZykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHVibGljRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jaW5nIHB1YmxpYyBkaXIgdXJsLCBwcmVmaXggd2l0aCBiYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlQXR0clZhbHVlKHMsIHNvdXJjZUNvZGVMb2NhdGlvbiwgdG9PdXRwdXRQdWJsaWNGaWxlUGF0aCh1cmwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZU1vZHVsZUluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVybCAmJiAhaXNFeGNsdWRlZFVybCh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIHNyYz1cIi4uLlwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGl0IGFzIGFuIGltcG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcyArPSBgXFxuaW1wb3J0ICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSZW1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdE5vZGUgPSBub2RlLmNoaWxkTm9kZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gc2NyaXB0Tm9kZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPHNjcmlwdCB0eXBlPVwibW9kdWxlXCI+Li4uPC9zY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gaWQucmVwbGFjZShub3JtYWxpemVQYXRoJDMoY29uZmlnLnJvb3QpLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvSFRNTFByb3h5Q2FjaGUoY29uZmlnLCBmaWxlUGF0aCwgaW5saW5lTW9kdWxlSW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IGNvbnRlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganMgKz0gYFxcbmltcG9ydCBcIiR7aWR9P2h0bWwtcHJveHkmaW5kZXg9JHtpbmxpbmVNb2R1bGVJbmRleH0uanNcImA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlbW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZXJ5U2NyaXB0SXNBc3luYyAmJiAoZXZlcnlTY3JpcHRJc0FzeW5jID0gaXNBc3luYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZVNjcmlwdHNBcmVBc3luYyB8fCAoc29tZVNjcmlwdHNBcmVBc3luYyA9IGlzQXN5bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVTY3JpcHRzQXJlRGVmZXIgfHwgKHNvbWVTY3JpcHRzQXJlRGVmZXIgPSAhaXNBc3luYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh1cmwgJiYgIWlzUHVibGljRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZFVybCh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIud2FybihgPHNjcmlwdCBzcmM9XCIke3VybH1cIj4gaW4gXCIke3B1YmxpY1BhdGh9XCIgY2FuJ3QgYmUgYnVuZGxlZCB3aXRob3V0IHR5cGU9XCJtb2R1bGVcIiBhdHRyaWJ1dGVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0Tm9kZSA9IG5vZGUuY2hpbGROb2Rlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbkNvZGUgPSBzdHJpcExpdGVyYWwoc2NyaXB0Tm9kZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZUltcG9ydFJFLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IGlubGluZUltcG9ydFJFLmV4ZWMoY2xlYW5Db2RlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyAxOiB1cmwsIGluZGV4IH0gPSBtYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRVcmwgPSBjbGVhbkNvZGUuaW5kZXhPZih1cmwsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydFVybCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgdXJsLmxlbmd0aCAtIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gc2NyaXB0Tm9kZS5zb3VyY2VDb2RlTG9jYXRpb24uc3RhcnRPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFVybHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQgKyBzdGFydE9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZW5kICsgc3RhcnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHNjcmlwdE5vZGUudmFsdWUuc2xpY2Uoc3RhcnQsIGVuZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgYXNzZXQgcmVmZXJlbmNlcyBpbiBpbmRleC5odG1sLCBhbHNvIGdlbmVyYXRlIGFuIGltcG9ydFxuICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZW1lbnQgZm9yIGVhY2ggLSB0aGlzIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgYXNzZXQgcGx1Z2luXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0QXR0cnMgPSBhc3NldEF0dHJzQ29uZmlnW25vZGUubm9kZU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXNzZXRBdHRycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIG5vZGUuYXR0cnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyS2V5ID0gZ2V0QXR0cktleShwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocC52YWx1ZSAmJiBhc3NldEF0dHJzLmluY2x1ZGVzKGF0dHJLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJTb3VyY2VDb2RlTG9jYXRpb24gPSBub2RlLnNvdXJjZUNvZGVMb2NhdGlvbi5hdHRyc1thdHRyS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXRzVXJsIG1heSBiZSBlbmNvZGVVUklcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gZGVjb2RlVVJJKHAudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRXhjbHVkZWRVcmwodXJsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICdsaW5rJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ1NTUmVxdWVzdCh1cmwpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgaWYgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQgKCM2NzQ4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFub2RlLmF0dHJzLnNvbWUoKHApID0+IHAucHJlZml4ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHAubmFtZSA9PT0gJ21lZGlhJyB8fCBwLm5hbWUgPT09ICdkaXNhYmxlZCcpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENTUyByZWZlcmVuY2VzLCBjb252ZXJ0IHRvIGltcG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltcG9ydEV4cHJlc3Npb24gPSBgXFxuaW1wb3J0ICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlVXJscy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogbm9kZS5zb3VyY2VDb2RlTG9jYXRpb24uc3RhcnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbm9kZS5zb3VyY2VDb2RlTG9jYXRpb24uZW5kT2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzICs9IGltcG9ydEV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NldFVybHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHI6IHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvZGVMb2NhdGlvbjogYXR0clNvdXJjZUNvZGVMb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja1B1YmxpY0ZpbGUodXJsLCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVBdHRyVmFsdWUocywgYXR0clNvdXJjZUNvZGVMb2NhdGlvbiwgdG9PdXRwdXRQdWJsaWNGaWxlUGF0aCh1cmwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyA8dGFnIHN0eWxlPVwiLi4uIHVybCguLi4pIC4uLlwiPjwvdGFnPlxuICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0IGlubGluZSBzdHlsZXMgYXMgdmlydHVhbCBjc3MgYW5kIGFkZCBjbGFzcyBhdHRyaWJ1dGUgdG8gdGFnIGZvciBzZWxlY3RpbmdcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5saW5lU3R5bGUgPSBub2RlLmF0dHJzLmZpbmQoKHByb3ApID0+IHByb3AucHJlZml4ID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3AubmFtZSA9PT0gJ3N0eWxlJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC52YWx1ZS5pbmNsdWRlcygndXJsKCcpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZVN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVNb2R1bGVJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBgaW5saW5lIHN0eWxlYCB0byBjbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGltcG9ydCBjc3MgaW4ganMgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGlubGluZVN0eWxlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBpZC5yZXBsYWNlKG5vcm1hbGl6ZVBhdGgkMyhjb25maWcucm9vdCksICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvSFRNTFByb3h5Q2FjaGUoY29uZmlnLCBmaWxlUGF0aCwgaW5saW5lTW9kdWxlSW5kZXgsIHsgY29kZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgdHJhbnNmb3JtIHdpdGggY3NzIHBsdWdpbiBhbmQgY2FjaGUgcmVzdWx0IHdpdGggY3NzLXBvc3QgcGx1Z2luXG4gICAgICAgICAgICAgICAgICAgICAgICBqcyArPSBgXFxuaW1wb3J0IFwiJHtpZH0/aHRtbC1wcm94eSZpbmxpbmUtY3NzJmluZGV4PSR7aW5saW5lTW9kdWxlSW5kZXh9LmNzc1wiYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBnZXRIYXNoKGNsZWFuVXJsKGlkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHRyYW5zZm9ybSBpbiBgYXBwbHlIdG1sVHJhbnNmb3Jtc2BcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvZGVMb2NhdGlvbiA9IG5vZGUuc291cmNlQ29kZUxvY2F0aW9uLmF0dHJzWydzdHlsZSddO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlQXR0clZhbHVlKHMsIHNvdXJjZUNvZGVMb2NhdGlvbiwgYF9fVklURV9JTkxJTkVfQ1NTX18ke2hhc2h9XyR7aW5saW5lTW9kdWxlSW5kZXh9X19gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyA8c3R5bGU+Li4uPC9zdHlsZT5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICdzdHlsZScgJiYgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVOb2RlID0gbm9kZS5jaGlsZE5vZGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBpZC5yZXBsYWNlKG5vcm1hbGl6ZVBhdGgkMyhjb25maWcucm9vdCksICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZU1vZHVsZUluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRUb0hUTUxQcm94eUNhY2hlKGNvbmZpZywgZmlsZVBhdGgsIGlubGluZU1vZHVsZUluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogc3R5bGVOb2RlLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqcyArPSBgXFxuaW1wb3J0IFwiJHtpZH0/aHRtbC1wcm94eSZpbmxpbmUtY3NzJmluZGV4PSR7aW5saW5lTW9kdWxlSW5kZXh9LmNzc1wiYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBnZXRIYXNoKGNsZWFuVXJsKGlkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHRyYW5zZm9ybSBpbiBgYXBwbHlIdG1sVHJhbnNmb3Jtc2BcbiAgICAgICAgICAgICAgICAgICAgICAgIHMudXBkYXRlKHN0eWxlTm9kZS5zb3VyY2VDb2RlTG9jYXRpb24uc3RhcnRPZmZzZXQsIHN0eWxlTm9kZS5zb3VyY2VDb2RlTG9jYXRpb24uZW5kT2Zmc2V0LCBgX19WSVRFX0lOTElORV9DU1NfXyR7aGFzaH1fJHtpbmxpbmVNb2R1bGVJbmRleH1fX2ApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRSZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgc2NyaXB0IHRhZyBmcm9tIHRoZSBodG1sLiB3ZSBhcmUgZ29pbmcgdG8gaW5qZWN0IG5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lcyBpbiB0aGUgZW5kLlxuICAgICAgICAgICAgICAgICAgICAgICAgcy5yZW1vdmUobm9kZS5zb3VyY2VDb2RlTG9jYXRpb24uc3RhcnRPZmZzZXQsIG5vZGUuc291cmNlQ29kZUxvY2F0aW9uLmVuZE9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpc0FzeW5jU2NyaXB0TWFwLmdldChjb25maWcpLnNldChpZCwgZXZlcnlTY3JpcHRJc0FzeW5jKTtcbiAgICAgICAgICAgICAgICBpZiAoc29tZVNjcmlwdHNBcmVBc3luYyAmJiBzb21lU2NyaXB0c0FyZURlZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIud2FybihgXFxuTWl4ZWQgYXN5bmMgYW5kIGRlZmVyIHNjcmlwdCBtb2R1bGVzIGluICR7aWR9LCBvdXRwdXQgc2NyaXB0IHdpbGwgZmFsbGJhY2sgdG8gZGVmZXIuIEV2ZXJ5IHNjcmlwdCwgaW5jbHVkaW5nIGlubGluZSBvbmVzLCBuZWVkIHRvIGJlIG1hcmtlZCBhcyBhc3luYyBmb3IgeW91ciBvdXRwdXQgc2NyaXB0IHRvIGJlIGFzeW5jLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBlbmNvdW50ZXJlZCBhc3NldCB1cmwsIHJld3JpdGUgb3JpZ2luYWwgaHRtbCBzbyB0aGF0IGl0XG4gICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlcyB0aGUgcG9zdC1idWlsZCBsb2NhdGlvbiwgaWdub3JpbmcgZW1wdHkgYXR0cmlidXRlcyBhbmRcbiAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzIHRoYXQgZGlyZWN0bHkgcmVmZXJlbmNlIG5hbWVkIG91dHB1dC5cbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lZE91dHB1dCA9IE9iamVjdC5rZXlzKGNvbmZpZz8uYnVpbGQ/LnJvbGx1cE9wdGlvbnM/LmlucHV0IHx8IHt9KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHsgYXR0ciwgc291cmNlQ29kZUxvY2F0aW9uIH0gb2YgYXNzZXRVcmxzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFzc2V0c1VybCBtYXkgYmUgZW5jb2RlVVJJXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBkZWNvZGVVUkkoYXR0ci52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICE9PSAnJyAmJiAvLyBFbXB0eSBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgICAgICFuYW1lZE91dHB1dC5pbmNsdWRlcyhjb250ZW50KSAmJiAvLyBEaXJlY3QgcmVmZXJlbmNlIHRvIG5hbWVkIG91dHB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgIW5hbWVkT3V0cHV0LmluY2x1ZGVzKGNvbnRlbnQucmVwbGFjZSgvXlxcLy8sICcnKSkgLy8gQWxsb3cgZm9yIGFic29sdXRlIHJlZmVyZW5jZXMgYXMgbmFtZWQgb3V0cHV0IGNhbid0IGJlIGFuIGFic29sdXRlIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGF0dHIucHJlZml4ID09PSB1bmRlZmluZWQgJiYgYXR0ci5uYW1lID09PSAnc3Jjc2V0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IHByb2Nlc3NTcmNTZXQoY29udGVudCwgKHsgdXJsIH0pID0+IHVybFRvQnVpbHRVcmwodXJsLCBpZCwgY29uZmlnLCB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhd2FpdCB1cmxUb0J1aWx0VXJsKGNvbnRlbnQsIGlkLCBjb25maWcsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZUF0dHJWYWx1ZShzLCBzb3VyY2VDb2RlTG9jYXRpb24sIHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVtaXQgPHNjcmlwdD5pbXBvcnQoXCIuL2FhYVwiKTwvc2NyaXB0PiBhc3NldFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgeyBzdGFydCwgZW5kLCB1cmwgfSBvZiBzY3JpcHRVcmxzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZFVybCh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzLnVwZGF0ZShzdGFydCwgZW5kLCBhd2FpdCB1cmxUb0J1aWx0VXJsKHVybCwgaWQsIGNvbmZpZywgdGhpcykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrUHVibGljRmlsZSh1cmwsIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHMudXBkYXRlKHN0YXJ0LCBlbmQsIHRvT3V0cHV0UHVibGljRmlsZVBhdGgodXJsKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIj4gaWYgaXRzIHVybCBjYW4ndCBiZSByZXNvbHZlZFxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkU3R5bGVVcmxzID0gYXdhaXQgUHJvbWlzZS5hbGwoc3R5bGVVcmxzLm1hcChhc3luYyAoc3R5bGVVcmwpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnN0eWxlVXJsLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZDogYXdhaXQgdGhpcy5yZXNvbHZlKHN0eWxlVXJsLnVybCwgaWQpLFxuICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IHN0YXJ0LCBlbmQsIHVybCwgcmVzb2x2ZWQgfSBvZiByZXNvbHZlZFN0eWxlVXJscykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmxvZ2dlci53YXJuT25jZShgXFxuJHt1cmx9IGRvZXNuJ3QgZXhpc3QgYXQgYnVpbGQgdGltZSwgaXQgd2lsbCByZW1haW4gdW5jaGFuZ2VkIHRvIGJlIHJlc29sdmVkIGF0IHJ1bnRpbWVgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGltcG9ydEV4cHJlc3Npb24gPSBgXFxuaW1wb3J0ICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAganMgPSBqcy5yZXBsYWNlKGltcG9ydEV4cHJlc3Npb24sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHMucmVtb3ZlKHN0YXJ0LCBlbmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb2Nlc3NlZEh0bWwuc2V0KGlkLCBzLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIC8vIGluamVjdCBtb2R1bGUgcHJlbG9hZCBwb2x5ZmlsbCBvbmx5IHdoZW4gY29uZmlndXJlZCBhbmQgbmVlZGVkXG4gICAgICAgICAgICAgICAgY29uc3QgeyBtb2R1bGVQcmVsb2FkIH0gPSBjb25maWcuYnVpbGQ7XG4gICAgICAgICAgICAgICAgaWYgKChtb2R1bGVQcmVsb2FkID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgbW9kdWxlUHJlbG9hZCA9PT0gJ29iamVjdCcgJiYgbW9kdWxlUHJlbG9hZC5wb2x5ZmlsbCkpICYmXG4gICAgICAgICAgICAgICAgICAgIChzb21lU2NyaXB0c0FyZUFzeW5jIHx8IHNvbWVTY3JpcHRzQXJlRGVmZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGpzID0gYGltcG9ydCBcIiR7bW9kdWxlUHJlbG9hZFBvbHlmaWxsSWR9XCI7XFxuJHtqc31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ganM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdlbmVyYXRlQnVuZGxlKG9wdGlvbnMsIGJ1bmRsZSkge1xuICAgICAgICAgICAgY29uc3QgYW5hbHl6ZWRDaHVuayA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNvbnN0IGdldEltcG9ydGVkQ2h1bmtzID0gKGNodW5rLCBzZWVuID0gbmV3IFNldCgpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgICAgICAgICAgICAgY2h1bmsuaW1wb3J0cy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGltcG9ydGVlID0gYnVuZGxlW2ZpbGVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWU/LnR5cGUgPT09ICdjaHVuaycgJiYgIXNlZW4uaGFzKGZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWVuLmFkZChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3Qtb3JkZXIgdHJhdmVyc2FsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaCguLi5nZXRJbXBvcnRlZENodW5rcyhpbXBvcnRlZSwgc2VlbikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goaW1wb3J0ZWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNodW5rcztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0b1NjcmlwdFRhZyA9IChjaHVuaywgdG9PdXRwdXRQYXRoLCBpc0FzeW5jKSA9PiAoe1xuICAgICAgICAgICAgICAgIHRhZzogJ3NjcmlwdCcsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uKGlzQXN5bmMgPyB7IGFzeW5jOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgICAgICAgICAgICBjcm9zc29yaWdpbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiB0b091dHB1dFBhdGgoY2h1bmsuZmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHRvUHJlbG9hZFRhZyA9IChmaWxlbmFtZSwgdG9PdXRwdXRQYXRoKSA9PiAoe1xuICAgICAgICAgICAgICAgIHRhZzogJ2xpbmsnLFxuICAgICAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgIHJlbDogJ21vZHVsZXByZWxvYWQnLFxuICAgICAgICAgICAgICAgICAgICBjcm9zc29yaWdpbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaHJlZjogdG9PdXRwdXRQYXRoKGZpbGVuYW1lKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBnZXRDc3NUYWdzRm9yQ2h1bmsgPSAoY2h1bmssIHRvT3V0cHV0UGF0aCwgc2VlbiA9IG5ldyBTZXQoKSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoIWFuYWx5emVkQ2h1bmsuaGFzKGNodW5rKSkge1xuICAgICAgICAgICAgICAgICAgICBhbmFseXplZENodW5rLnNldChjaHVuaywgMSk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rLmltcG9ydHMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0ZWUgPSBidW5kbGVbZmlsZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWU/LnR5cGUgPT09ICdjaHVuaycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdzLnB1c2goLi4uZ2V0Q3NzVGFnc0ZvckNodW5rKGltcG9ydGVlLCB0b091dHB1dFBhdGgsIHNlZW4pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNodW5rLnZpdGVNZXRhZGF0YS5pbXBvcnRlZENzcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2Vlbi5oYXMoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4uYWRkKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFncy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6ICdsaW5rJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWw6ICdzdHlsZXNoZWV0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogdG9PdXRwdXRQYXRoKGZpbGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YWdzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2lkLCBodG1sXSBvZiBwcm9jZXNzZWRIdG1sKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVVcmxQYXRoID0gcGF0aCRvLnBvc2l4LnJlbGF0aXZlKGNvbmZpZy5yb290LCBub3JtYWxpemVQYXRoJDMoaWQpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhc3NldHNCYXNlID0gZ2V0QmFzZUluSFRNTChyZWxhdGl2ZVVybFBhdGgsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9PdXRwdXRGaWxlUGF0aCA9IChmaWxlbmFtZSwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNFeHRlcm5hbFVybChmaWxlbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b091dHB1dEZpbGVQYXRoSW5IdG1sKGZpbGVuYW1lLCB0eXBlLCByZWxhdGl2ZVVybFBhdGgsICdodG1sJywgY29uZmlnLCAoZmlsZW5hbWUsIGltcG9ydGVyKSA9PiBhc3NldHNCYXNlICsgZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b091dHB1dEFzc2V0RmlsZVBhdGggPSAoZmlsZW5hbWUpID0+IHRvT3V0cHV0RmlsZVBhdGgoZmlsZW5hbWUsICdhc3NldCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvT3V0cHV0UHVibGljQXNzZXRGaWxlUGF0aCA9IChmaWxlbmFtZSkgPT4gdG9PdXRwdXRGaWxlUGF0aChmaWxlbmFtZSwgJ3B1YmxpYycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQXN5bmMgPSBpc0FzeW5jU2NyaXB0TWFwLmdldChjb25maWcpLmdldChpZCk7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGh0bWw7XG4gICAgICAgICAgICAgICAgLy8gZmluZCBjb3JyZXNwb25kaW5nIGVudHJ5IGNodW5rXG4gICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBPYmplY3QudmFsdWVzKGJ1bmRsZSkuZmluZCgoY2h1bmspID0+IGNodW5rLnR5cGUgPT09ICdjaHVuaycgJiZcbiAgICAgICAgICAgICAgICAgICAgY2h1bmsuaXNFbnRyeSAmJlxuICAgICAgICAgICAgICAgICAgICBjaHVuay5mYWNhZGVNb2R1bGVJZCA9PT0gaWQpO1xuICAgICAgICAgICAgICAgIGxldCBjYW5JbmxpbmVFbnRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIGluamVjdCBjaHVuayBhc3NldCBsaW5rc1xuICAgICAgICAgICAgICAgIGlmIChjaHVuaykge1xuICAgICAgICAgICAgICAgICAgICAvLyBhbiBlbnRyeSBjaHVuayBjYW4gYmUgaW5saW5lZCBpZlxuICAgICAgICAgICAgICAgICAgICAvLyAgLSBpdCdzIGFuIEVTIG1vZHVsZSAoZS5nLiBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBsZWdhY3kgcGx1Z2luKVxuICAgICAgICAgICAgICAgICAgICAvLyAgLSBpdCBjb250YWlucyBubyBtZWFuaW5nZnVsIGNvZGUgb3RoZXIgdGhhbiBpbXBvcnQgc3RhdGVtZW50c1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdlcycgJiYgaXNFbnRpcmVseUltcG9ydChjaHVuay5jb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuSW5saW5lRW50cnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gbm90IGlubGluZWQsIGluamVjdCA8c2NyaXB0PiBmb3IgZW50cnkgYW5kIG1vZHVsZXByZWxvYWQgaXRzIGRlcGVuZGVuY2llc1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGlubGluZWQsIGRpc2NhcmQgZW50cnkgY2h1bmsgYW5kIGluamVjdCA8c2NyaXB0PiBmb3IgZXZlcnl0aGluZyBpbiBwb3N0LW9yZGVyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGltcG9ydHMgPSBnZXRJbXBvcnRlZENodW5rcyhjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhc3NldFRhZ3M7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5JbmxpbmVFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXRUYWdzID0gaW1wb3J0cy5tYXAoKGNodW5rKSA9PiB0b1NjcmlwdFRhZyhjaHVuaywgdG9PdXRwdXRBc3NldEZpbGVQYXRoLCBpc0FzeW5jKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NldFRhZ3MgPSBbdG9TY3JpcHRUYWcoY2h1bmssIHRvT3V0cHV0QXNzZXRGaWxlUGF0aCwgaXNBc3luYyldO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBtb2R1bGVQcmVsb2FkIH0gPSBjb25maWcuYnVpbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlUHJlbG9hZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlRGVwZW5kZW5jaWVzID0gdHlwZW9mIG1vZHVsZVByZWxvYWQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVByZWxvYWQucmVzb2x2ZURlcGVuZGVuY2llcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRzRmlsZU5hbWVzID0gaW1wb3J0cy5tYXAoKGNodW5rKSA9PiBjaHVuay5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWREZXBzID0gcmVzb2x2ZURlcGVuZGVuY2llc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlc29sdmVEZXBlbmRlbmNpZXMoY2h1bmsuZmlsZU5hbWUsIGltcG9ydHNGaWxlTmFtZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RJZDogcmVsYXRpdmVVcmxQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdFR5cGU6ICdodG1sJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbXBvcnRzRmlsZU5hbWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2V0VGFncy5wdXNoKC4uLnJlc29sdmVkRGVwcy5tYXAoKGkpID0+IHRvUHJlbG9hZFRhZyhpLCB0b091dHB1dEFzc2V0RmlsZVBhdGgpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXNzZXRUYWdzLnB1c2goLi4uZ2V0Q3NzVGFnc0ZvckNodW5rKGNodW5rLCB0b091dHB1dEFzc2V0RmlsZVBhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaW5qZWN0VG9IZWFkKHJlc3VsdCwgYXNzZXRUYWdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaW5qZWN0IGNzcyBsaW5rIHdoZW4gY3NzQ29kZVNwbGl0IGlzIGZhbHNlXG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcuYnVpbGQuY3NzQ29kZVNwbGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzc0NodW5rID0gT2JqZWN0LnZhbHVlcyhidW5kbGUpLmZpbmQoKGNodW5rKSA9PiBjaHVuay50eXBlID09PSAnYXNzZXQnICYmIGNodW5rLm5hbWUgPT09ICdzdHlsZS5jc3MnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNzc0NodW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBpbmplY3RUb0hlYWQocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6ICdsaW5rJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbDogJ3N0eWxlc2hlZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogdG9PdXRwdXRBc3NldEZpbGVQYXRoKGNzc0NodW5rLmZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gbm8gdXNlIGFzc2V0cyBwbHVnaW4gYmVjYXVzZSBpdCB3aWxsIGVtaXQgZmlsZVxuICAgICAgICAgICAgICAgIGxldCBtYXRjaDtcbiAgICAgICAgICAgICAgICBsZXQgcztcbiAgICAgICAgICAgICAgICBpbmxpbmVDU1NSRSQxLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IGlubGluZUNTU1JFJDEuZXhlYyhyZXN1bHQpKSkge1xuICAgICAgICAgICAgICAgICAgICBzIHx8IChzID0gbmV3IE1hZ2ljU3RyaW5nKHJlc3VsdCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IDA6IGZ1bGwsIDE6IHNjb3BlZE5hbWUgfSA9IG1hdGNoO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjc3NUcmFuc2Zvcm1lZENvZGUgPSBodG1sUHJveHlSZXN1bHQuZ2V0KHNjb3BlZE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBzLnVwZGF0ZShtYXRjaC5pbmRleCwgbWF0Y2guaW5kZXggKyBmdWxsLmxlbmd0aCwgY3NzVHJhbnNmb3JtZWRDb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcy50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBhcHBseUh0bWxUcmFuc2Zvcm1zKHJlc3VsdCwgWy4uLm5vcm1hbEhvb2tzLCAuLi5wb3N0SG9va3NdLCB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICcvJyArIHJlbGF0aXZlVXJsUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGlkLFxuICAgICAgICAgICAgICAgICAgICBidW5kbGUsXG4gICAgICAgICAgICAgICAgICAgIGNodW5rLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIHJlc29sdmUgYXNzZXQgdXJsIHJlZmVyZW5jZXNcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShhc3NldFVybFJFLCAoXywgZmlsZUhhc2gsIHBvc3RmaXggPSAnJykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9PdXRwdXRBc3NldEZpbGVQYXRoKHRoaXMuZ2V0RmlsZU5hbWUoZmlsZUhhc2gpKSArIHBvc3RmaXg7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UocHVibGljQXNzZXRVcmxSRSwgKF8sIGZpbGVIYXNoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVQYXRoJDModG9PdXRwdXRQdWJsaWNBc3NldEZpbGVQYXRoKGdldFB1YmxpY0Fzc2V0RmlsZW5hbWUoZmlsZUhhc2gsIGNvbmZpZykpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoY2h1bmsgJiYgY2FuSW5saW5lRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGltcG9ydHMgZnJvbSBlbnRyeSBoYXZlIGJlZW4gaW5saW5lZCB0byBodG1sLCBwcmV2ZW50IHJvbGx1cCBmcm9tIG91dHB1dHRpbmcgaXRcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGJ1bmRsZVtjaHVuay5maWxlTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0RW1pdE5hbWUgPSBub3JtYWxpemVQYXRoJDMocGF0aCRvLnJlbGF0aXZlKGNvbmZpZy5yb290LCBpZCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogc2hvcnRFbWl0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHByZUltcG9ydE1hcEhvb2soY29uZmlnKSB7XG4gICAgcmV0dXJuIChodG1sLCBjdHgpID0+IHtcbiAgICAgICAgY29uc3QgaW1wb3J0TWFwSW5kZXggPSBodG1sLm1hdGNoKGltcG9ydE1hcFJFKT8uaW5kZXg7XG4gICAgICAgIGlmIChpbXBvcnRNYXBJbmRleCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBpbXBvcnRNYXBBcHBlbmRJbmRleCA9IGh0bWwubWF0Y2goaW1wb3J0TWFwQXBwZW5kUkUpPy5pbmRleDtcbiAgICAgICAgaWYgKGltcG9ydE1hcEFwcGVuZEluZGV4ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChpbXBvcnRNYXBBcHBlbmRJbmRleCA8IGltcG9ydE1hcEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGl2ZUh0bWwgPSBub3JtYWxpemVQYXRoJDMocGF0aCRvLnJlbGF0aXZlKGNvbmZpZy5yb290LCBjdHguZmlsZW5hbWUpKTtcbiAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIud2Fybk9uY2UocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KHBpY29jb2xvcnNFeHBvcnRzLmJvbGQoYCghKSA8c2NyaXB0IHR5cGU9XCJpbXBvcnRtYXBcIj4gc2hvdWxkIGNvbWUgYmVmb3JlIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiPiBhbmQgPGxpbmsgcmVsPVwibW9kdWxlcHJlbG9hZFwiPiBpbiAvJHtyZWxhdGl2ZUh0bWx9YCkpKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIE1vdmUgaW1wb3J0bWFwIGJlZm9yZSB0aGUgZmlyc3QgbW9kdWxlIHNjcmlwdCBhbmQgbW9kdWxlcHJlbG9hZCBsaW5rXG4gKi9cbmZ1bmN0aW9uIHBvc3RJbXBvcnRNYXBIb29rKCkge1xuICAgIHJldHVybiAoaHRtbCkgPT4ge1xuICAgICAgICBpZiAoIWltcG9ydE1hcEFwcGVuZFJFLnRlc3QoaHRtbCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBpbXBvcnRNYXA7XG4gICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoaW1wb3J0TWFwUkUsIChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgaW1wb3J0TWFwID0gbWF0Y2g7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaW1wb3J0TWFwKSB7XG4gICAgICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKGltcG9ydE1hcEFwcGVuZFJFLCAobWF0Y2gpID0+IGAke2ltcG9ydE1hcH1cXG4ke21hdGNofWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgIH07XG59XG4vKipcbiAqIFN1cHBvcnQgYCVFTlZfTkFNRSVgIHN5bnRheCBpbiBodG1sIGZpbGVzXG4gKi9cbmZ1bmN0aW9uIGh0bWxFbnZIb29rKGNvbmZpZykge1xuICAgIGNvbnN0IHBhdHRlcm4gPSAvJShcXFMrPyklL2c7XG4gICAgY29uc3QgZW52UHJlZml4ID0gcmVzb2x2ZUVudlByZWZpeCh7IGVudlByZWZpeDogY29uZmlnLmVudlByZWZpeCB9KTtcbiAgICBjb25zdCBlbnYgPSB7IC4uLmNvbmZpZy5lbnYgfTtcbiAgICAvLyBhY2NvdW50IGZvciB1c2VyIGVudiBkZWZpbmVzXG4gICAgZm9yIChjb25zdCBrZXkgaW4gY29uZmlnLmRlZmluZSkge1xuICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoYGltcG9ydC5tZXRhLmVudi5gKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gY29uZmlnLmRlZmluZVtrZXldO1xuICAgICAgICAgICAgZW52W2tleS5zbGljZSgxNildID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyB2YWwgOiBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAoaHRtbCwgY3R4KSA9PiB7XG4gICAgICAgIHJldHVybiBodG1sLnJlcGxhY2UocGF0dGVybiwgKHRleHQsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSBpbiBlbnYpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZW52UHJlZml4LnNvbWUoKHByZWZpeCkgPT4ga2V5LnN0YXJ0c1dpdGgocHJlZml4KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVIdG1sID0gbm9ybWFsaXplUGF0aCQzKHBhdGgkby5yZWxhdGl2ZShjb25maWcucm9vdCwgY3R4LmZpbGVuYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIud2FybihwaWNvY29sb3JzRXhwb3J0cy55ZWxsb3cocGljb2NvbG9yc0V4cG9ydHMuYm9sZChgKCEpICR7dGV4dH0gaXMgbm90IGRlZmluZWQgaW4gZW52IHZhcmlhYmxlcyBmb3VuZCBpbiAvJHtyZWxhdGl2ZUh0bWx9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgdmFyaWFibGUgbWlzdHlwZWQ/YCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlSHRtbFRyYW5zZm9ybXMocGx1Z2lucykge1xuICAgIGNvbnN0IHByZUhvb2tzID0gW107XG4gICAgY29uc3Qgbm9ybWFsSG9va3MgPSBbXTtcbiAgICBjb25zdCBwb3N0SG9va3MgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgICAgIGNvbnN0IGhvb2sgPSBwbHVnaW4udHJhbnNmb3JtSW5kZXhIdG1sO1xuICAgICAgICBpZiAoIWhvb2spXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBob29rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBub3JtYWxIb29rcy5wdXNoKGhvb2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gYGVuZm9yY2VgIGhhZCBvbmx5IHR3byBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBgdHJhbnNmb3JtSW5kZXhIdG1sYCBob29rXG4gICAgICAgICAgICAvLyBgJ3ByZSdgIGFuZCBgJ3Bvc3QnYCAodGhlIGRlZmF1bHQpLiBgb3JkZXJgIG5vdyB3b3JrcyB3aXRoIHRocmVlIHZhbHVlc1xuICAgICAgICAgICAgLy8gdG8gYWxpZ24gd2l0aCBvdGhlciBob29rcyAoYCdwcmUnYCwgbm9ybWFsLCBhbmQgYCdwb3N0J2ApLiBXZSBtYXBcbiAgICAgICAgICAgIC8vIGJvdGggYGVuZm9yY2U6ICdwb3N0J2AgdG8gYG9yZGVyOiB1bmRlZmluZWRgIHRvIGF2b2lkIGEgYnJlYWtpbmcgY2hhbmdlXG4gICAgICAgICAgICBjb25zdCBvcmRlciA9IGhvb2sub3JkZXIgPz8gKGhvb2suZW5mb3JjZSA9PT0gJ3ByZScgPyAncHJlJyA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHVuaW9uIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBob29rLmhhbmRsZXIgPz8gaG9vay50cmFuc2Zvcm07XG4gICAgICAgICAgICBpZiAob3JkZXIgPT09ICdwcmUnKSB7XG4gICAgICAgICAgICAgICAgcHJlSG9va3MucHVzaChoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9yZGVyID09PSAncG9zdCcpIHtcbiAgICAgICAgICAgICAgICBwb3N0SG9va3MucHVzaChoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vcm1hbEhvb2tzLnB1c2goaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtwcmVIb29rcywgbm9ybWFsSG9va3MsIHBvc3RIb29rc107XG59XG5hc3luYyBmdW5jdGlvbiBhcHBseUh0bWxUcmFuc2Zvcm1zKGh0bWwsIGhvb2tzLCBjdHgpIHtcbiAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgaG9vayhodG1sLCBjdHgpO1xuICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBodG1sID0gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRhZ3M7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSB7XG4gICAgICAgICAgICAgICAgdGFncyA9IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGh0bWwgPSByZXMuaHRtbCB8fCBodG1sO1xuICAgICAgICAgICAgICAgIHRhZ3MgPSByZXMudGFncztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhlYWRUYWdzID0gW107XG4gICAgICAgICAgICBjb25zdCBoZWFkUHJlcGVuZFRhZ3MgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGJvZHlUYWdzID0gW107XG4gICAgICAgICAgICBjb25zdCBib2R5UHJlcGVuZFRhZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnLmluamVjdFRvID09PSAnYm9keScpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keVRhZ3MucHVzaCh0YWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0YWcuaW5qZWN0VG8gPT09ICdib2R5LXByZXBlbmQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHlQcmVwZW5kVGFncy5wdXNoKHRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhZy5pbmplY3RUbyA9PT0gJ2hlYWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRUYWdzLnB1c2godGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRQcmVwZW5kVGFncy5wdXNoKHRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaHRtbCA9IGluamVjdFRvSGVhZChodG1sLCBoZWFkUHJlcGVuZFRhZ3MsIHRydWUpO1xuICAgICAgICAgICAgaHRtbCA9IGluamVjdFRvSGVhZChodG1sLCBoZWFkVGFncyk7XG4gICAgICAgICAgICBodG1sID0gaW5qZWN0VG9Cb2R5KGh0bWwsIGJvZHlQcmVwZW5kVGFncywgdHJ1ZSk7XG4gICAgICAgICAgICBodG1sID0gaW5qZWN0VG9Cb2R5KGh0bWwsIGJvZHlUYWdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaHRtbDtcbn1cbmNvbnN0IGltcG9ydFJFID0gL1xcYmltcG9ydFxccyooXCJbXlwiXSpbXlxcXFxdXCJ8J1teJ10qW15cXFxcXScpOyovZztcbmNvbnN0IGNvbW1lbnRSRSQxID0gL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiokL2dtO1xuZnVuY3Rpb24gaXNFbnRpcmVseUltcG9ydChjb2RlKSB7XG4gICAgLy8gb25seSBjb25zaWRlciBcInNpZGUtZWZmZWN0XCIgaW1wb3J0cywgd2hpY2ggbWF0Y2ggPHNjcmlwdCB0eXBlPW1vZHVsZT4gc2VtYW50aWNzIGV4YWN0bHlcbiAgICAvLyB0aGUgcmVnZXhlcyB3aWxsIHJlbW92ZSB0b28gbGl0dGxlIGluIHNvbWUgZXhvdGljIGNhc2VzLCBidXQgZmFsc2UtbmVnYXRpdmVzIGFyZSBhbHJpZ2h0XG4gICAgcmV0dXJuICFjb2RlLnJlcGxhY2UoaW1wb3J0UkUsICcnKS5yZXBsYWNlKGNvbW1lbnRSRSQxLCAnJykudHJpbSgpLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGdldEJhc2VJbkhUTUwodXJsUmVsYXRpdmVQYXRoLCBjb25maWcpIHtcbiAgICAvLyBQcmVmZXIgZXhwbGljaXQgVVJMIGlmIGRlZmluZWQgZm9yIGxpbmtpbmcgdG8gYXNzZXRzIGFuZCBwdWJsaWMgZmlsZXMgZnJvbSBIVE1MLFxuICAgIC8vIGV2ZW4gd2hlbiBiYXNlIHJlbGF0aXZlIGlzIHNwZWNpZmllZFxuICAgIHJldHVybiBjb25maWcuYmFzZSA9PT0gJy4vJyB8fCBjb25maWcuYmFzZSA9PT0gJydcbiAgICAgICAgPyBwYXRoJG8ucG9zaXguam9pbihwYXRoJG8ucG9zaXgucmVsYXRpdmUodXJsUmVsYXRpdmVQYXRoLCAnJykuc2xpY2UoMCwgLTIpLCAnLi8nKVxuICAgICAgICA6IGNvbmZpZy5iYXNlO1xufVxuY29uc3QgaGVhZEluamVjdFJFID0gLyhbIFxcdF0qKTxcXC9oZWFkPi9pO1xuY29uc3QgaGVhZFByZXBlbmRJbmplY3RSRSA9IC8oWyBcXHRdKik8aGVhZFtePl0qPi9pO1xuY29uc3QgaHRtbEluamVjdFJFID0gLzxcXC9odG1sPi9pO1xuY29uc3QgaHRtbFByZXBlbmRJbmplY3RSRSA9IC8oWyBcXHRdKik8aHRtbFtePl0qPi9pO1xuY29uc3QgYm9keUluamVjdFJFID0gLyhbIFxcdF0qKTxcXC9ib2R5Pi9pO1xuY29uc3QgYm9keVByZXBlbmRJbmplY3RSRSA9IC8oWyBcXHRdKik8Ym9keVtePl0qPi9pO1xuY29uc3QgZG9jdHlwZVByZXBlbmRJbmplY3RSRSA9IC88IWRvY3R5cGUgaHRtbD4vaTtcbmZ1bmN0aW9uIGluamVjdFRvSGVhZChodG1sLCB0YWdzLCBwcmVwZW5kID0gZmFsc2UpIHtcbiAgICBpZiAodGFncy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBodG1sO1xuICAgIGlmIChwcmVwZW5kKSB7XG4gICAgICAgIC8vIGluamVjdCBhcyB0aGUgZmlyc3QgZWxlbWVudCBvZiBoZWFkXG4gICAgICAgIGlmIChoZWFkUHJlcGVuZEluamVjdFJFLnRlc3QoaHRtbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sLnJlcGxhY2UoaGVhZFByZXBlbmRJbmplY3RSRSwgKG1hdGNoLCBwMSkgPT4gYCR7bWF0Y2h9XFxuJHtzZXJpYWxpemVUYWdzKHRhZ3MsIGluY3JlbWVudEluZGVudChwMSkpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBpbmplY3QgYmVmb3JlIGhlYWQgY2xvc2VcbiAgICAgICAgaWYgKGhlYWRJbmplY3RSRS50ZXN0KGh0bWwpKSB7XG4gICAgICAgICAgICAvLyByZXNwZWN0IGluZGVudGF0aW9uIG9mIGhlYWQgdGFnXG4gICAgICAgICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKGhlYWRJbmplY3RSRSwgKG1hdGNoLCBwMSkgPT4gYCR7c2VyaWFsaXplVGFncyh0YWdzLCBpbmNyZW1lbnRJbmRlbnQocDEpKX0ke21hdGNofWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRyeSB0byBpbmplY3QgYmVmb3JlIHRoZSBib2R5IHRhZ1xuICAgICAgICBpZiAoYm9keVByZXBlbmRJbmplY3RSRS50ZXN0KGh0bWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKGJvZHlQcmVwZW5kSW5qZWN0UkUsIChtYXRjaCwgcDEpID0+IGAke3NlcmlhbGl6ZVRhZ3ModGFncywgcDEpfVxcbiR7bWF0Y2h9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgbm8gaGVhZCB0YWcgaXMgcHJlc2VudCwgd2UgcHJlcGVuZCB0aGUgdGFnIGZvciBib3RoIHByZXBlbmQgYW5kIGFwcGVuZFxuICAgIHJldHVybiBwcmVwZW5kSW5qZWN0RmFsbGJhY2soaHRtbCwgdGFncyk7XG59XG5mdW5jdGlvbiBpbmplY3RUb0JvZHkoaHRtbCwgdGFncywgcHJlcGVuZCA9IGZhbHNlKSB7XG4gICAgaWYgKHRhZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICBpZiAocHJlcGVuZCkge1xuICAgICAgICAvLyBpbmplY3QgYWZ0ZXIgYm9keSBvcGVuXG4gICAgICAgIGlmIChib2R5UHJlcGVuZEluamVjdFJFLnRlc3QoaHRtbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sLnJlcGxhY2UoYm9keVByZXBlbmRJbmplY3RSRSwgKG1hdGNoLCBwMSkgPT4gYCR7bWF0Y2h9XFxuJHtzZXJpYWxpemVUYWdzKHRhZ3MsIGluY3JlbWVudEluZGVudChwMSkpfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIG5vIHRoZXJlIGlzIG5vIGJvZHkgdGFnLCBpbmplY3QgYWZ0ZXIgaGVhZCBvciBmYWxsYmFjayB0byBwcmVwZW5kIGluIGh0bWxcbiAgICAgICAgaWYgKGhlYWRJbmplY3RSRS50ZXN0KGh0bWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKGhlYWRJbmplY3RSRSwgKG1hdGNoLCBwMSkgPT4gYCR7bWF0Y2h9XFxuJHtzZXJpYWxpemVUYWdzKHRhZ3MsIHAxKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlcGVuZEluamVjdEZhbGxiYWNrKGh0bWwsIHRhZ3MpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gaW5qZWN0IGJlZm9yZSBib2R5IGNsb3NlXG4gICAgICAgIGlmIChib2R5SW5qZWN0UkUudGVzdChodG1sKSkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWwucmVwbGFjZShib2R5SW5qZWN0UkUsIChtYXRjaCwgcDEpID0+IGAke3NlcmlhbGl6ZVRhZ3ModGFncywgaW5jcmVtZW50SW5kZW50KHAxKSl9JHttYXRjaH1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBubyBib2R5IHRhZyBpcyBwcmVzZW50LCBhcHBlbmQgdG8gdGhlIGh0bWwgdGFnLCBvciBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlXG4gICAgICAgIGlmIChodG1sSW5qZWN0UkUudGVzdChodG1sKSkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWwucmVwbGFjZShodG1sSW5qZWN0UkUsIGAke3NlcmlhbGl6ZVRhZ3ModGFncyl9XFxuJCZgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbCArIGBcXG5gICsgc2VyaWFsaXplVGFncyh0YWdzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwcmVwZW5kSW5qZWN0RmFsbGJhY2soaHRtbCwgdGFncykge1xuICAgIC8vIHByZXBlbmQgdG8gdGhlIGh0bWwgdGFnLCBhcHBlbmQgYWZ0ZXIgZG9jdHlwZSwgb3IgdGhlIGRvY3VtZW50IHN0YXJ0XG4gICAgaWYgKGh0bWxQcmVwZW5kSW5qZWN0UkUudGVzdChodG1sKSkge1xuICAgICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKGh0bWxQcmVwZW5kSW5qZWN0UkUsIGAkJlxcbiR7c2VyaWFsaXplVGFncyh0YWdzKX1gKTtcbiAgICB9XG4gICAgaWYgKGRvY3R5cGVQcmVwZW5kSW5qZWN0UkUudGVzdChodG1sKSkge1xuICAgICAgICByZXR1cm4gaHRtbC5yZXBsYWNlKGRvY3R5cGVQcmVwZW5kSW5qZWN0UkUsIGAkJlxcbiR7c2VyaWFsaXplVGFncyh0YWdzKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZVRhZ3ModGFncykgKyBodG1sO1xufVxuY29uc3QgdW5hcnlUYWdzID0gbmV3IFNldChbJ2xpbmsnLCAnbWV0YScsICdiYXNlJ10pO1xuZnVuY3Rpb24gc2VyaWFsaXplVGFnKHsgdGFnLCBhdHRycywgY2hpbGRyZW4gfSwgaW5kZW50ID0gJycpIHtcbiAgICBpZiAodW5hcnlUYWdzLmhhcyh0YWcpKSB7XG4gICAgICAgIHJldHVybiBgPCR7dGFnfSR7c2VyaWFsaXplQXR0cnMoYXR0cnMpfT5gO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGA8JHt0YWd9JHtzZXJpYWxpemVBdHRycyhhdHRycyl9PiR7c2VyaWFsaXplVGFncyhjaGlsZHJlbiwgaW5jcmVtZW50SW5kZW50KGluZGVudCkpfTwvJHt0YWd9PmA7XG4gICAgfVxufVxuZnVuY3Rpb24gc2VyaWFsaXplVGFncyh0YWdzLCBpbmRlbnQgPSAnJykge1xuICAgIGlmICh0eXBlb2YgdGFncyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRhZ3M7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRhZ3MgJiYgdGFncy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRhZ3MubWFwKCh0YWcpID0+IGAke2luZGVudH0ke3NlcmlhbGl6ZVRhZyh0YWcsIGluZGVudCl9XFxuYCkuam9pbignJyk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUF0dHJzKGF0dHJzKSB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYXR0cnNba2V5XSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXMgKz0gYXR0cnNba2V5XSA/IGAgJHtrZXl9YCA6IGBgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzICs9IGAgJHtrZXl9PSR7SlNPTi5zdHJpbmdpZnkoYXR0cnNba2V5XSl9YDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gaW5jcmVtZW50SW5kZW50KGluZGVudCA9ICcnKSB7XG4gICAgcmV0dXJuIGAke2luZGVudH0ke2luZGVudFswXSA9PT0gJ1xcdCcgPyAnXFx0JyA6ICcgICd9YDtcbn1cbmZ1bmN0aW9uIGdldEF0dHJLZXkoYXR0cikge1xuICAgIHJldHVybiBhdHRyLnByZWZpeCA9PT0gdW5kZWZpbmVkID8gYXR0ci5uYW1lIDogYCR7YXR0ci5wcmVmaXh9OiR7YXR0ci5uYW1lfWA7XG59XG5cbmNvbnN0IGNzc01vZHVsZVJFID0gbmV3IFJlZ0V4cChgXFxcXC5tb2R1bGUke0NTU19MQU5HU19SRS5zb3VyY2V9YCk7XG5jb25zdCBkaXJlY3RSZXF1ZXN0UkUgPSAvKD86XFw/fCYpZGlyZWN0XFxiLztcbmNvbnN0IGh0bWxQcm94eVJFID0gLyg/OlxcP3wmKWh0bWwtcHJveHlcXGIvO1xuY29uc3QgY29tbW9uanNQcm94eVJFID0gL1xcP2NvbW1vbmpzLXByb3h5LztcbmNvbnN0IGlubGluZVJFID0gLyg/OlxcP3wmKWlubGluZVxcYi87XG5jb25zdCBpbmxpbmVDU1NSRSA9IC8oPzpcXD98JilpbmxpbmUtY3NzXFxiLztcbmNvbnN0IHVzZWRSRSA9IC8oPzpcXD98Jil1c2VkXFxiLztcbmNvbnN0IHZhclJFID0gL152YXJcXCgvaTtcbmNvbnN0IGNzc0J1bmRsZU5hbWUgPSAnc3R5bGUuY3NzJztcbmNvbnN0IGlzQ1NTUmVxdWVzdCA9IChyZXF1ZXN0KSA9PiBDU1NfTEFOR1NfUkUudGVzdChyZXF1ZXN0KTtcbmNvbnN0IGlzTW9kdWxlQ1NTUmVxdWVzdCA9IChyZXF1ZXN0KSA9PiBjc3NNb2R1bGVSRS50ZXN0KHJlcXVlc3QpO1xuY29uc3QgaXNEaXJlY3RDU1NSZXF1ZXN0ID0gKHJlcXVlc3QpID0+IENTU19MQU5HU19SRS50ZXN0KHJlcXVlc3QpICYmIGRpcmVjdFJlcXVlc3RSRS50ZXN0KHJlcXVlc3QpO1xuY29uc3QgaXNEaXJlY3RSZXF1ZXN0ID0gKHJlcXVlc3QpID0+IGRpcmVjdFJlcXVlc3RSRS50ZXN0KHJlcXVlc3QpO1xuY29uc3QgY3NzTW9kdWxlc0NhY2hlID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHJlbW92ZWRQdXJlQ3NzRmlsZXNDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCBwb3N0Y3NzQ29uZmlnQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGVuY29kZVB1YmxpY1VybHNJbkNTUyhjb25maWcpIHtcbiAgICByZXR1cm4gY29uZmlnLmNvbW1hbmQgPT09ICdidWlsZCc7XG59XG4vKipcbiAqIFBsdWdpbiBhcHBsaWVkIGJlZm9yZSB1c2VyIHBsdWdpbnNcbiAqL1xuZnVuY3Rpb24gY3NzUGx1Z2luKGNvbmZpZykge1xuICAgIGxldCBzZXJ2ZXI7XG4gICAgbGV0IG1vZHVsZUNhY2hlO1xuICAgIGNvbnN0IHJlc29sdmVVcmwgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoe1xuICAgICAgICBwcmVmZXJSZWxhdGl2ZTogdHJ1ZSxcbiAgICAgICAgdHJ5SW5kZXg6IGZhbHNlLFxuICAgICAgICBleHRlbnNpb25zOiBbXSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTpjc3MnLFxuICAgICAgICBjb25maWd1cmVTZXJ2ZXIoX3NlcnZlcikge1xuICAgICAgICAgICAgc2VydmVyID0gX3NlcnZlcjtcbiAgICAgICAgfSxcbiAgICAgICAgYnVpbGRTdGFydCgpIHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSBhIG5ldyBjYWNoZSBmb3IgZXZlcnkgYnVpbGQgKGkuZS4gcmVidWlsZGluZyBpbiB3YXRjaCBtb2RlKVxuICAgICAgICAgICAgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjc3NNb2R1bGVzQ2FjaGUuc2V0KGNvbmZpZywgbW9kdWxlQ2FjaGUpO1xuICAgICAgICAgICAgcmVtb3ZlZFB1cmVDc3NGaWxlc0NhY2hlLnNldChjb25maWcsIG5ldyBNYXAoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHRyYW5zZm9ybShyYXcsIGlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIWlzQ1NTUmVxdWVzdChpZCkgfHxcbiAgICAgICAgICAgICAgICBjb21tb25qc1Byb3h5UkUudGVzdChpZCkgfHxcbiAgICAgICAgICAgICAgICBTUEVDSUFMX1FVRVJZX1JFLnRlc3QoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3NyID0gb3B0aW9ucz8uc3NyID09PSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgdXJsUmVwbGFjZXIgPSBhc3luYyAodXJsLCBpbXBvcnRlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja1B1YmxpY0ZpbGUodXJsLCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVQdWJsaWNVcmxzSW5DU1MoY29uZmlnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHB1YmxpY0ZpbGVUb0J1aWx0VXJsKHVybCwgY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqb2luVXJsU2VnbWVudHMoY29uZmlnLmJhc2UsIHVybCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlVXJsKHVybCwgaW1wb3J0ZXIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVRvVXJsKHJlc29sdmVkLCBjb25maWcsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmNvbW1hbmQgPT09ICdidWlsZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gIzk4MDAgSWYgd2UgY2Fubm90IHJlc29sdmUgdGhlIGNzcyB1cmwsIGxlYXZlIGEgd2FybmluZy5cbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmxvZ2dlci53YXJuT25jZShgXFxuJHt1cmx9IHJlZmVyZW5jZWQgaW4gJHtpZH0gZGlkbid0IHJlc29sdmUgYXQgYnVpbGQgdGltZSwgaXQgd2lsbCByZW1haW4gdW5jaGFuZ2VkIHRvIGJlIHJlc29sdmVkIGF0IHJ1bnRpbWVgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB7IGNvZGU6IGNzcywgbW9kdWxlcywgZGVwcywgbWFwLCB9ID0gYXdhaXQgY29tcGlsZUNTUyhpZCwgcmF3LCBjb25maWcsIHVybFJlcGxhY2VyKTtcbiAgICAgICAgICAgIGlmIChtb2R1bGVzKSB7XG4gICAgICAgICAgICAgICAgbW9kdWxlQ2FjaGUuc2V0KGlkLCBtb2R1bGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRyYWNrIGRlcHMgZm9yIGJ1aWxkIHdhdGNoIG1vZGVcbiAgICAgICAgICAgIGlmIChjb25maWcuY29tbWFuZCA9PT0gJ2J1aWxkJyAmJiBjb25maWcuYnVpbGQud2F0Y2ggJiYgZGVwcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBkZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkV2F0Y2hGaWxlKGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRldlxuICAgICAgICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICAgICAgICAgIC8vIHNlcnZlciBvbmx5IGxvZ2ljIGZvciBoYW5kbGluZyBDU1MgQGltcG9ydCBkZXBlbmRlbmN5IGhtclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgbW9kdWxlR3JhcGggfSA9IHNlcnZlcjtcbiAgICAgICAgICAgICAgICBjb25zdCB0aGlzTW9kdWxlID0gbW9kdWxlR3JhcGguZ2V0TW9kdWxlQnlJZChpZCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ1NTIG1vZHVsZXMgY2Fubm90IHNlbGYtYWNjZXB0IHNpbmNlIGl0IGV4cG9ydHMgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZkFjY2VwdGluZyA9ICFtb2R1bGVzICYmICFpbmxpbmVSRS50ZXN0KGlkKSAmJiAhaHRtbFByb3h5UkUudGVzdChpZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgZGVwcyBpbiB0aGUgbW9kdWxlIGdyYXBoIHNvIGVkaXRzIHRvIEBpbXBvcnQgY3NzIGNhbiB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWluIGltcG9ydCB0byBob3QgdXBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXBNb2R1bGVzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2QmFzZSA9IGNvbmZpZy5iYXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGRlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBNb2R1bGVzLmFkZChpc0NTU1JlcXVlc3QoZmlsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtb2R1bGVHcmFwaC5jcmVhdGVGaWxlT25seUVudHJ5KGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXdhaXQgbW9kdWxlR3JhcGguZW5zdXJlRW50cnlGcm9tVXJsKHN0cmlwQmFzZShhd2FpdCBmaWxlVG9VcmwoZmlsZSwgY29uZmlnLCB0aGlzKSwgKGNvbmZpZy5zZXJ2ZXI/Lm9yaWdpbiA/PyAnJykgKyBkZXZCYXNlKSwgc3NyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVHcmFwaC51cGRhdGVNb2R1bGVJbmZvKHRoaXNNb2R1bGUsIGRlcE1vZHVsZXMsIG51bGwsIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJvb3QgQ1NTIHByb3h5IG1vZHVsZSBpcyBzZWxmLWFjY2VwdGluZyBhbmQgc2hvdWxkIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSBhbiBleHBsaWNpdCBhY2NlcHQgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNldCgpLCBudWxsLCBpc1NlbGZBY2NlcHRpbmcsIHNzcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZGVwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkV2F0Y2hGaWxlKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc01vZHVsZS5pc1NlbGZBY2NlcHRpbmcgPSBpc1NlbGZBY2NlcHRpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvZGU6IGNzcyxcbiAgICAgICAgICAgICAgICBtYXAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH07XG59XG4vKipcbiAqIFBsdWdpbiBhcHBsaWVkIGFmdGVyIHVzZXIgcGx1Z2luc1xuICovXG5mdW5jdGlvbiBjc3NQb3N0UGx1Z2luKGNvbmZpZykge1xuICAgIC8vIHN0eWxlcyBpbml0aWFsaXphdGlvbiBpbiBidWlsZFN0YXJ0IGNhdXNlcyBhIHN0eWxpbmcgbG9zcyBpbiB3YXRjaFxuICAgIGNvbnN0IHN0eWxlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgcHVyZUNzc0NodW5rcztcbiAgICAvLyB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSByb2xsdXAgb3V0cHV0cyBhbmQgZXh0cmFjdGluZyBDU1MsIG9ubHkgZW1pdCBvbmNlLFxuICAgIC8vIHNpbmNlIG91dHB1dCBmb3JtYXRzIGhhdmUgbm8gZWZmZWN0IG9uIHRoZSBnZW5lcmF0ZWQgQ1NTLlxuICAgIGxldCBvdXRwdXRUb0V4dHJhY3RlZENTU01hcDtcbiAgICBsZXQgaGFzRW1pdHRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHJvbGx1cE9wdGlvbnNPdXRwdXQgPSBjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucy5vdXRwdXQ7XG4gICAgY29uc3QgYXNzZXRGaWxlTmFtZXMgPSAoQXJyYXkuaXNBcnJheShyb2xsdXBPcHRpb25zT3V0cHV0KVxuICAgICAgICA/IHJvbGx1cE9wdGlvbnNPdXRwdXRbMF1cbiAgICAgICAgOiByb2xsdXBPcHRpb25zT3V0cHV0KT8uYXNzZXRGaWxlTmFtZXM7XG4gICAgY29uc3QgZ2V0Q3NzQXNzZXREaXJuYW1lID0gKGNzc0Fzc2V0TmFtZSkgPT4ge1xuICAgICAgICBpZiAoIWFzc2V0RmlsZU5hbWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlnLmJ1aWxkLmFzc2V0c0RpcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXNzZXRGaWxlTmFtZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aCRvLmRpcm5hbWUoYXNzZXRGaWxlTmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGgkby5kaXJuYW1lKGFzc2V0RmlsZU5hbWVzKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBjc3NBc3NldE5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2Fzc2V0JyxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICcvKiB2aXRlIGludGVybmFsIGNhbGwsIGlnbm9yZSAqLycsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmNzcy1wb3N0JyxcbiAgICAgICAgYnVpbGRTdGFydCgpIHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSBuZXcgY2FjaGVzIGZvciBldmVyeSBidWlsZCAoaS5lLiByZWJ1aWxkaW5nIGluIHdhdGNoIG1vZGUpXG4gICAgICAgICAgICBwdXJlQ3NzQ2h1bmtzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgb3V0cHV0VG9FeHRyYWN0ZWRDU1NNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBoYXNFbWl0dGVkID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHRyYW5zZm9ybShjc3MsIGlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIWlzQ1NTUmVxdWVzdChpZCkgfHxcbiAgICAgICAgICAgICAgICBjb21tb25qc1Byb3h5UkUudGVzdChpZCkgfHxcbiAgICAgICAgICAgICAgICBTUEVDSUFMX1FVRVJZX1JFLnRlc3QoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3NzID0gc3RyaXBCb21UYWcoY3NzKTtcbiAgICAgICAgICAgIGNvbnN0IGlubGluZWQgPSBpbmxpbmVSRS50ZXN0KGlkKTtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZXMgPSBjc3NNb2R1bGVzQ2FjaGUuZ2V0KGNvbmZpZykuZ2V0KGlkKTtcbiAgICAgICAgICAgIC8vICM2OTg0LCAjNzU1MlxuICAgICAgICAgICAgLy8gYGZvby5tb2R1bGUuY3NzYCA9PiBtb2R1bGVzQ29kZVxuICAgICAgICAgICAgLy8gYGZvby5tb2R1bGUuY3NzP2lubGluZWAgPT4gY3NzQ29udGVudFxuICAgICAgICAgICAgY29uc3QgbW9kdWxlc0NvZGUgPSBtb2R1bGVzICYmXG4gICAgICAgICAgICAgICAgIWlubGluZWQgJiZcbiAgICAgICAgICAgICAgICBkYXRhVG9Fc20obW9kdWxlcywgeyBuYW1lZEV4cG9ydHM6IHRydWUsIHByZWZlckNvbnN0OiB0cnVlIH0pO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5jb21tYW5kID09PSAnc2VydmUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2V0Q29udGVudFdpdGhTb3VyY2VtYXAgPSBhc3luYyAoY29udGVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmNzcz8uZGV2U291cmNlbWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VtYXAgPSB0aGlzLmdldENvbWJpbmVkU291cmNlbWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlbWFwLm1hcHBpbmdzICYmICFzb3VyY2VtYXAuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpbmplY3RTb3VyY2VzQ29udGVudChzb3VyY2VtYXAsIGNsZWFuVXJsKGlkKSwgY29uZmlnLmxvZ2dlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29kZVdpdGhTb3VyY2VtYXAoJ2NzcycsIGNvbnRlbnQsIHNvdXJjZW1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoaXNEaXJlY3RDU1NSZXF1ZXN0KGlkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2V0Q29udGVudFdpdGhTb3VyY2VtYXAoY3NzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gc2VydmVyIG9ubHlcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uc3NyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGVzQ29kZSB8fCBgZXhwb3J0IGRlZmF1bHQgJHtKU09OLnN0cmluZ2lmeShjc3MpfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpbmxpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgZXhwb3J0IGRlZmF1bHQgJHtKU09OLnN0cmluZ2lmeShjc3MpfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNzc0NvbnRlbnQgPSBhd2FpdCBnZXRDb250ZW50V2l0aFNvdXJjZW1hcChjc3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBbXG4gICAgICAgICAgICAgICAgICAgIGBpbXBvcnQgeyB1cGRhdGVTdHlsZSBhcyBfX3ZpdGVfX3VwZGF0ZVN0eWxlLCByZW1vdmVTdHlsZSBhcyBfX3ZpdGVfX3JlbW92ZVN0eWxlIH0gZnJvbSAke0pTT04uc3RyaW5naWZ5KHBhdGgkby5wb3NpeC5qb2luKGNvbmZpZy5iYXNlLCBDTElFTlRfUFVCTElDX1BBVEgpKX1gLFxuICAgICAgICAgICAgICAgICAgICBgY29uc3QgX192aXRlX19pZCA9ICR7SlNPTi5zdHJpbmdpZnkoaWQpfWAsXG4gICAgICAgICAgICAgICAgICAgIGBjb25zdCBfX3ZpdGVfX2NzcyA9ICR7SlNPTi5zdHJpbmdpZnkoY3NzQ29udGVudCl9YCxcbiAgICAgICAgICAgICAgICAgICAgYF9fdml0ZV9fdXBkYXRlU3R5bGUoX192aXRlX19pZCwgX192aXRlX19jc3MpYCxcbiAgICAgICAgICAgICAgICAgICAgLy8gY3NzIG1vZHVsZXMgZXhwb3J0cyBjaGFuZ2Ugb24gZWRpdCBzbyBpdCBjYW4ndCBzZWxmIGFjY2VwdFxuICAgICAgICAgICAgICAgICAgICBgJHttb2R1bGVzQ29kZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYGltcG9ydC5tZXRhLmhvdC5hY2NlcHQoKVxcbmV4cG9ydCBkZWZhdWx0IF9fdml0ZV9fY3NzYH1gLFxuICAgICAgICAgICAgICAgICAgICBgaW1wb3J0Lm1ldGEuaG90LnBydW5lKCgpID0+IF9fdml0ZV9fcmVtb3ZlU3R5bGUoX192aXRlX19pZCkpYCxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGNvZGUsIG1hcDogeyBtYXBwaW5nczogJycgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYnVpbGQgQ1NTIGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICAgIC8vIHJlY29yZCBjc3NcbiAgICAgICAgICAgIC8vIGNhY2hlIGNzcyBjb21waWxlIHJlc3VsdCB0byBtYXBcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIHVzZSB0aGUgY2FjaGUgcmVwbGFjZSBpbmxpbmUtc3R5bGUtZmxhZyB3aGVuIGBnZW5lcmF0ZUJ1bmRsZWAgaW4gdml0ZTpidWlsZC1odG1sIHBsdWdpblxuICAgICAgICAgICAgY29uc3QgaW5saW5lQ1NTID0gaW5saW5lQ1NTUkUudGVzdChpZCk7XG4gICAgICAgICAgICBjb25zdCBpc0hUTUxQcm94eSA9IGh0bWxQcm94eVJFLnRlc3QoaWQpO1xuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSBwYXJzZVJlcXVlc3QoaWQpO1xuICAgICAgICAgICAgaWYgKGlubGluZUNTUyAmJiBpc0hUTUxQcm94eSkge1xuICAgICAgICAgICAgICAgIGFkZFRvSFRNTFByb3h5VHJhbnNmb3JtUmVzdWx0KGAke2dldEhhc2goY2xlYW5VcmwoaWQpKX1fJHtOdW1iZXIucGFyc2VJbnQocXVlcnkuaW5kZXgpfWAsIGNzcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBleHBvcnQgZGVmYXVsdCAnJ2A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlubGluZWQpIHtcbiAgICAgICAgICAgICAgICBzdHlsZXMuc2V0KGlkLCBjc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvZGU7XG4gICAgICAgICAgICBpZiAodXNlZFJFLnRlc3QoaWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZHVsZXNDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBtb2R1bGVzQ29kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gY3NzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmJ1aWxkLmNzc01pbmlmeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGF3YWl0IG1pbmlmeUNTUyhjb250ZW50LCBjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBgZXhwb3J0IGRlZmF1bHQgJHtKU09OLnN0cmluZ2lmeShjb250ZW50KX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlmIG1vZHVsZUNvZGUgZXhpc3RzIHJldHVybiBpdCAqKmV2ZW4gaWYqKiBpdCBkb2VzIG5vdCBoYXZlIGA/dXNlZGBcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgZGlzYWJsZSB0cmVlLXNoYWtlIHRvIHdvcmsgd2l0aCBgaW1wb3J0ICcuL2Zvby5tb2R1bGUuY3NzJ2AgYnV0IHRoaXMgdXN1YWxseSBkb2VzIG5vdCBoYXBwZW5cbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgbGltaXRhdGlvbiBvZiB0aGUgY3VycmVudCBhcHByb2FjaCBieSBgP3VzZWRgIHRvIG1ha2UgdHJlZS1zaGFrZSB3b3JrXG4gICAgICAgICAgICAgICAgLy8gU2VlICM4OTM2IGZvciBtb3JlIGRldGFpbHNcbiAgICAgICAgICAgICAgICBjb2RlID0gbW9kdWxlc0NvZGUgfHwgYGV4cG9ydCBkZWZhdWx0ICcnYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICBtYXA6IHsgbWFwcGluZ3M6ICcnIH0sXG4gICAgICAgICAgICAgICAgLy8gYXZvaWQgdGhlIGNzcyBtb2R1bGUgZnJvbSBiZWluZyB0cmVlLXNoYWtlbiBzbyB0aGF0IHdlIGNhbiByZXRyaWV2ZVxuICAgICAgICAgICAgICAgIC8vIGl0IGluIHJlbmRlckNodW5rKClcbiAgICAgICAgICAgICAgICBtb2R1bGVTaWRlRWZmZWN0czogaW5saW5lZCA/IGZhbHNlIDogJ25vLXRyZWVzaGFrZScsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyByZW5kZXJDaHVuayhjb2RlLCBjaHVuaywgb3B0cykge1xuICAgICAgICAgICAgbGV0IGNodW5rQ1NTID0gJyc7XG4gICAgICAgICAgICBsZXQgaXNQdXJlQ3NzQ2h1bmsgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoY2h1bmsubW9kdWxlcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZXMuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgICAgICBjaHVua0NTUyArPSBzdHlsZXMuZ2V0KGlkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBjc3MgbW9kdWxlIGNvbnRhaW5zIEpTLCBzbyBpdCBtYWtlcyB0aGlzIG5vdCBhIHB1cmUgY3NzIGNodW5rXG4gICAgICAgICAgICAgICAgICAgIGlmIChjc3NNb2R1bGVSRS50ZXN0KGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNQdXJlQ3NzQ2h1bmsgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG1vZHVsZSBkb2VzIG5vdCBoYXZlIGEgc3R5bGUsIHRoZW4gaXQncyBub3QgYSBwdXJlIGNzcyBjaHVuay5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0cnVlIGJlY2F1c2UgaW4gdGhlIGB0cmFuc2Zvcm1gIGhvb2sgYWJvdmUsIG9ubHkgbW9kdWxlc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGFyZSBjc3MgZ2V0cyBhZGRlZCB0byB0aGUgYHN0eWxlc2AgbWFwLlxuICAgICAgICAgICAgICAgICAgICBpc1B1cmVDc3NDaHVuayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2h1bmtDU1MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHB1YmxpY0Fzc2V0VXJsTWFwID0gcHVibGljQXNzZXRVcmxDYWNoZS5nZXQoY29uZmlnKTtcbiAgICAgICAgICAgIC8vIHJlc29sdmUgYXNzZXQgVVJMIHBsYWNlaG9sZGVycyB0byB0aGVpciBidWlsdCBmaWxlIFVSTHNcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVBc3NldFVybHNJbkNzcyA9IChjaHVua0NTUywgY3NzQXNzZXROYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5jb2RlZFB1YmxpY1VybHMgPSBlbmNvZGVQdWJsaWNVcmxzSW5DU1MoY29uZmlnKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGl2ZSA9IGNvbmZpZy5iYXNlID09PSAnLi8nIHx8IGNvbmZpZy5iYXNlID09PSAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBjc3NBc3NldERpcm5hbWUgPSBlbmNvZGVkUHVibGljVXJscyB8fCByZWxhdGl2ZVxuICAgICAgICAgICAgICAgICAgICA/IGdldENzc0Fzc2V0RGlybmFtZShjc3NBc3NldE5hbWUpXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvUmVsYXRpdmUgPSAoZmlsZW5hbWUsIGltcG9ydGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aXZlIGJhc2UgKyBleHRyYWN0ZWQgQ1NTXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgkby5wb3NpeC5yZWxhdGl2ZShjc3NBc3NldERpcm5hbWUsIGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJylcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVsYXRpdmVQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcuLycgKyByZWxhdGl2ZVBhdGg7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGFzc2V0IHVybCByZWZlcmVuY2VzIHdpdGggcmVzb2x2ZWQgdXJsLlxuICAgICAgICAgICAgICAgIGNodW5rQ1NTID0gY2h1bmtDU1MucmVwbGFjZShhc3NldFVybFJFLCAoXywgZmlsZUhhc2gsIHBvc3RmaXggPSAnJykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMuZ2V0RmlsZU5hbWUoZmlsZUhhc2gpICsgcG9zdGZpeDtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmsudml0ZU1ldGFkYXRhLmltcG9ydGVkQXNzZXRzLmFkZChjbGVhblVybChmaWxlbmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9PdXRwdXRGaWxlUGF0aEluQ3NzKGZpbGVuYW1lLCAnYXNzZXQnLCBjc3NBc3NldE5hbWUsICdjc3MnLCBjb25maWcsIHRvUmVsYXRpdmUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIHJlc29sdmUgcHVibGljIFVSTCBmcm9tIENTUyBwYXRoc1xuICAgICAgICAgICAgICAgIGlmIChlbmNvZGVkUHVibGljVXJscykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGhUb1B1YmxpY0Zyb21DU1MgPSBwYXRoJG8ucG9zaXgucmVsYXRpdmUoY3NzQXNzZXREaXJuYW1lLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rQ1NTID0gY2h1bmtDU1MucmVwbGFjZShwdWJsaWNBc3NldFVybFJFLCAoXywgaGFzaCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHVibGljVXJsID0gcHVibGljQXNzZXRVcmxNYXAuZ2V0KGhhc2gpLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvT3V0cHV0RmlsZVBhdGhJbkNzcyhwdWJsaWNVcmwsICdwdWJsaWMnLCBjc3NBc3NldE5hbWUsICdjc3MnLCBjb25maWcsICgpID0+IGAke3JlbGF0aXZlUGF0aFRvUHVibGljRnJvbUNTU30vJHtwdWJsaWNVcmx9YCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2h1bmtDU1M7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZnVuY3Rpb24gZW5zdXJlRmlsZUV4dChuYW1lLCBleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplUGF0aCQzKHBhdGgkby5mb3JtYXQoeyAuLi5wYXRoJG8ucGFyc2UobmFtZSksIGJhc2U6IHVuZGVmaW5lZCwgZXh0IH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25maWcuYnVpbGQuY3NzQ29kZVNwbGl0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUHVyZUNzc0NodW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzaGFyZWQgQ1NTLW9ubHkgY2h1bmsgdGhhdCBpcyBlbXB0eS5cbiAgICAgICAgICAgICAgICAgICAgcHVyZUNzc0NodW5rcy5hZGQoY2h1bmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0cy5mb3JtYXQgPT09ICdlcycgfHwgb3B0cy5mb3JtYXQgPT09ICdjanMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzc0Fzc2V0TmFtZSA9IGNodW5rLmZhY2FkZU1vZHVsZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5vcm1hbGl6ZVBhdGgkMyhwYXRoJG8ucmVsYXRpdmUoY29uZmlnLnJvb3QsIGNodW5rLmZhY2FkZU1vZHVsZUlkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2h1bmsubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFuZyA9IHBhdGgkby5leHRuYW1lKGNzc0Fzc2V0TmFtZSkuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzc0ZpbGVOYW1lID0gZW5zdXJlRmlsZUV4dChjc3NBc3NldE5hbWUsICcuY3NzJyk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rQ1NTID0gcmVzb2x2ZUFzc2V0VXJsc0luQ3NzKGNodW5rQ1NTLCBjc3NBc3NldE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua0NTUyA9IGF3YWl0IGZpbmFsaXplQ3NzKGNodW5rQ1NTLCB0cnVlLCBjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IGNvcnJlc3BvbmRpbmcgY3NzIGZpbGVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSB0aGlzLmVtaXRGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhdGgkby5iYXNlbmFtZShjc3NGaWxlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBjaHVua0NTUyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTmFtZSA9IGlzUHJlUHJvY2Vzc29yKGxhbmcpID8gY3NzQXNzZXROYW1lIDogY3NzRmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRW50cnkgPSBjaHVuay5pc0VudHJ5ICYmIGlzUHVyZUNzc0NodW5rO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRBc3NldHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoY29uZmlnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNldChyZWZlcmVuY2VJZCwgeyBvcmlnaW5hbE5hbWUsIGlzRW50cnkgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rLnZpdGVNZXRhZGF0YS5pbXBvcnRlZENzcy5hZGQodGhpcy5nZXRGaWxlTmFtZShyZWZlcmVuY2VJZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghY29uZmlnLmJ1aWxkLnNzcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBsZWdhY3kgYnVpbGQgYW5kIGlubGluZSBjc3NcbiAgICAgICAgICAgICAgICAgICAgLy8gRW50cnkgY2h1bmsgQ1NTIHdpbGwgYmUgY29sbGVjdGVkIGludG8gYGNodW5rLnZpdGVNZXRhZGF0YS5pbXBvcnRlZENzc2BcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGluamVjdGVkIGxhdGVyIGJ5IHRoZSBgJ3ZpdGU6YnVpbGQtaHRtbCdgIHBsdWdpbiBpbnRvIHRoZSBgaW5kZXguaHRtbGBcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gaXQgd2lsbCBiZSBkdXBsaWNhdGVkLiAoaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlL2lzc3Vlcy8yMDYyI2lzc3VlY29tbWVudC03ODIzODgwMTApXG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1dCBiZWNhdXNlIGVudHJ5IGNodW5rIGNhbiBiZSBpbXBvcnRlZCBieSBkeW5hbWljIGltcG9ydCxcbiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHJlbW92ZSB0aGUgaW5saW5lZCBDU1MuICgjMTAyODUpXG4gICAgICAgICAgICAgICAgICAgIGNodW5rQ1NTID0gYXdhaXQgZmluYWxpemVDc3MoY2h1bmtDU1MsIHRydWUsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjc3NTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShjaHVua0NTUyk7XG4gICAgICAgICAgICAgICAgICAgIGNzc1N0cmluZyA9XG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJBc3NldFVybEluSlModGhpcywgY29uZmlnLCBjaHVuaywgb3B0cywgY3NzU3RyaW5nKT8udG9TdHJpbmcoKSB8fCBjc3NTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gYF9fdml0ZV9zdHlsZV9fYDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5qZWN0Q29kZSA9IGB2YXIgJHtzdHlsZX0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7c3R5bGV9LnRleHRDb250ZW50ID0gJHtjc3NTdHJpbmd9O2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoJHtzdHlsZX0pO2A7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBJZHggPSBjb2RlLmluZGV4T2YoJ1N5c3RlbS5yZWdpc3RlcicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnNlcnRNYXJrID0gXCIndXNlIHN0cmljdCc7XCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluc2VydElkeCA9IGNvZGUuaW5kZXhPZihpbnNlcnRNYXJrLCB3cmFwSWR4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBNYWdpY1N0cmluZyhjb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcy5hcHBlbmRMZWZ0KGluc2VydElkeCArIGluc2VydE1hcmsubGVuZ3RoLCBpbmplY3RDb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5idWlsZC5zb3VyY2VtYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmUgcHVibGljIFVSTCBmcm9tIENTUyBwYXRocywgd2UgbmVlZCB0byB1c2UgYWJzb2x1dGUgcGF0aHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogcy50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogcy5nZW5lcmF0ZU1hcCh7IGhpcmVzOiB0cnVlIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNvZGU6IHMudG9TdHJpbmcoKSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2h1bmtDU1MgPSByZXNvbHZlQXNzZXRVcmxzSW5Dc3MoY2h1bmtDU1MsIGNzc0J1bmRsZU5hbWUpO1xuICAgICAgICAgICAgICAgIC8vIGZpbmFsaXplQ3NzIGlzIGNhbGxlZCBmb3IgdGhlIGFnZ3JlZ2F0ZWQgY2h1bmsgaW4gZ2VuZXJhdGVCdW5kbGVcbiAgICAgICAgICAgICAgICBvdXRwdXRUb0V4dHJhY3RlZENTU01hcC5zZXQob3B0cywgKG91dHB1dFRvRXh0cmFjdGVkQ1NTTWFwLmdldChvcHRzKSB8fCAnJykgKyBjaHVua0NTUyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgYXVnbWVudENodW5rSGFzaChjaHVuaykge1xuICAgICAgICAgICAgaWYgKGNodW5rLnZpdGVNZXRhZGF0YT8uaW1wb3J0ZWRDc3Muc2l6ZSkge1xuICAgICAgICAgICAgICAgIGxldCBoYXNoID0gJyc7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBjaHVuay52aXRlTWV0YWRhdGEuaW1wb3J0ZWRDc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzaCArPSBpZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGdlbmVyYXRlQnVuZGxlKG9wdHMsIGJ1bmRsZSkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBhc3NldCBlbWl0cyBhcmUgc2tpcHBlZCBpbiBsZWdhY3kgYnVuZGxlXG4gICAgICAgICAgICBpZiAob3B0cy5fX3ZpdGVfc2tpcF9hc3NldF9lbWl0X18pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZW1vdmUgZW1wdHkgY3NzIGNodW5rcyBhbmQgdGhlaXIgaW1wb3J0c1xuICAgICAgICAgICAgaWYgKHB1cmVDc3NDaHVua3Muc2l6ZSkge1xuICAgICAgICAgICAgICAgIC8vIG1hcCBlYWNoIHB1cmUgY3NzIGNodW5rIChyZW5kZXJlZCBjaHVuaykgdG8gaXQncyBjb3JyZXNwb25kaW5nIGJ1bmRsZVxuICAgICAgICAgICAgICAgIC8vIGNodW5rLiB3ZSBjaGVjayB0aGF0IGJ5IGNvbXBhcmluZyB0aGUgYG1vZHVsZUlkc2AgYXMgdGhleSBoYXZlIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgIC8vIGZpbGVuYW1lcyAocmVuZGVyZWQgY2h1bmsgaGFzIHRoZSAhfntYWFh9fiBwbGFjZWhvbGRlcilcbiAgICAgICAgICAgICAgICBjb25zdCBwdXJlQ3NzQ2h1bmtOYW1lcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHVyZUNzc0NodW5rIG9mIHB1cmVDc3NDaHVua3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYnVuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidW5kbGVDaHVuayA9IGJ1bmRsZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUNodW5rLnR5cGUgPT09ICdjaHVuaycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheUVxdWFsKGJ1bmRsZUNodW5rLm1vZHVsZUlkcywgcHVyZUNzc0NodW5rLm1vZHVsZUlkcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJlQ3NzQ2h1bmtOYW1lcy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZW1wdHlDaHVua0ZpbGVzID0gcHVyZUNzc0NodW5rTmFtZXNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoZmlsZSkgPT4gcGF0aCRvLmJhc2VuYW1lKGZpbGUpKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignfCcpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXC4vZywgJ1xcXFwuJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW1wdHlDaHVua1JFID0gbmV3IFJlZ0V4cChvcHRzLmZvcm1hdCA9PT0gJ2VzJ1xuICAgICAgICAgICAgICAgICAgICA/IGBcXFxcYmltcG9ydFxcXFxzKltcIiddW15cIiddKig/OiR7ZW1wdHlDaHVua0ZpbGVzfSlbXCInXTtcXG4/YFxuICAgICAgICAgICAgICAgICAgICA6IGBcXFxcYnJlcXVpcmVcXFxcKFxcXFxzKltcIiddW15cIiddKig/OiR7ZW1wdHlDaHVua0ZpbGVzfSlbXCInXVxcXFwpO1xcbj9gLCAnZycpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBpbiBidW5kbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBidW5kbGVbZmlsZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaHVuay50eXBlID09PSAnY2h1bmsnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgcHVyZSBjc3MgY2h1bmsgZnJvbSBvdGhlciBjaHVuaydzIGltcG9ydHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYWxzbyByZWdpc3RlciB0aGUgZW1pdHRlZCBDU1MgZmlsZXMgdW5kZXIgdGhlIGltcG9ydGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaHVua3MgaW5zdGVhZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLmltcG9ydHMgPSBjaHVuay5pbXBvcnRzLmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdXJlQ3NzQ2h1bmtOYW1lcy5pbmNsdWRlcyhmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGltcG9ydGVkQ3NzIH0gPSBidW5kbGVbZmlsZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52aXRlTWV0YWRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGVkQ3NzLmZvckVhY2goKGZpbGUpID0+IGNodW5rLnZpdGVNZXRhZGF0YS5pbXBvcnRlZENzcy5hZGQoZmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVuay5jb2RlID0gY2h1bmsuY29kZS5yZXBsYWNlKGVtcHR5Q2h1bmtSRSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgY3NzIGltcG9ydCB3aGlsZSBwcmVzZXJ2aW5nIHNvdXJjZSBtYXAgbG9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIChtKSA9PiBgLyogZW1wdHkgY3NzICR7JycucGFkRW5kKG0ubGVuZ3RoIC0gMTUpfSovYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZFB1cmVDc3NGaWxlcyA9IHJlbW92ZWRQdXJlQ3NzRmlsZXNDYWNoZS5nZXQoY29uZmlnKTtcbiAgICAgICAgICAgICAgICBwdXJlQ3NzQ2h1bmtOYW1lcy5mb3JFYWNoKChmaWxlTmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVkUHVyZUNzc0ZpbGVzLnNldChmaWxlTmFtZSwgYnVuZGxlW2ZpbGVOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBidW5kbGVbZmlsZU5hbWVdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGV4dHJhY3RlZENzcyA9IG91dHB1dFRvRXh0cmFjdGVkQ1NTTWFwLmdldChvcHRzKTtcbiAgICAgICAgICAgIGlmIChleHRyYWN0ZWRDc3MgJiYgIWhhc0VtaXR0ZWQpIHtcbiAgICAgICAgICAgICAgICBoYXNFbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBleHRyYWN0ZWRDc3MgPSBhd2FpdCBmaW5hbGl6ZUNzcyhleHRyYWN0ZWRDc3MsIHRydWUsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0RmlsZSh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGNzc0J1bmRsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhc3NldCcsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZXh0cmFjdGVkQ3NzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDU1NSZXNvbHZlcnMoY29uZmlnKSB7XG4gICAgbGV0IGNzc1Jlc29sdmU7XG4gICAgbGV0IHNhc3NSZXNvbHZlO1xuICAgIGxldCBsZXNzUmVzb2x2ZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgY3NzKCkge1xuICAgICAgICAgICAgcmV0dXJuIChjc3NSZXNvbHZlIHx8XG4gICAgICAgICAgICAgICAgKGNzc1Jlc29sdmUgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoe1xuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zOiBbJy5jc3MnXSxcbiAgICAgICAgICAgICAgICAgICAgbWFpbkZpZWxkczogWydzdHlsZSddLFxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbJ3N0eWxlJ10sXG4gICAgICAgICAgICAgICAgICAgIHRyeUluZGV4OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcHJlZmVyUmVsYXRpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IHNhc3MoKSB7XG4gICAgICAgICAgICByZXR1cm4gKHNhc3NSZXNvbHZlIHx8XG4gICAgICAgICAgICAgICAgKHNhc3NSZXNvbHZlID0gY29uZmlnLmNyZWF0ZVJlc29sdmVyKHtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uczogWycuc2NzcycsICcuc2FzcycsICcuY3NzJ10sXG4gICAgICAgICAgICAgICAgICAgIG1haW5GaWVsZHM6IFsnc2FzcycsICdzdHlsZSddLFxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbJ3Nhc3MnLCAnc3R5bGUnXSxcbiAgICAgICAgICAgICAgICAgICAgdHJ5SW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRyeVByZWZpeDogJ18nLFxuICAgICAgICAgICAgICAgICAgICBwcmVmZXJSZWxhdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgbGVzcygpIHtcbiAgICAgICAgICAgIHJldHVybiAobGVzc1Jlc29sdmUgfHxcbiAgICAgICAgICAgICAgICAobGVzc1Jlc29sdmUgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoe1xuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zOiBbJy5sZXNzJywgJy5jc3MnXSxcbiAgICAgICAgICAgICAgICAgICAgbWFpbkZpZWxkczogWydsZXNzJywgJ3N0eWxlJ10sXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFsnbGVzcycsICdzdHlsZSddLFxuICAgICAgICAgICAgICAgICAgICB0cnlJbmRleDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHByZWZlclJlbGF0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldENzc1Jlc29sdmVyc0tleXMocmVzb2x2ZXJzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc29sdmVycyk7XG59XG5jb25zdCBjb25maWdUb0F0SW1wb3J0UmVzb2x2ZXJzID0gbmV3IFdlYWtNYXAoKTtcbmFzeW5jIGZ1bmN0aW9uIGNvbXBpbGVDU1MoaWQsIGNvZGUsIGNvbmZpZywgdXJsUmVwbGFjZXIpIHtcbiAgICBjb25zdCB7IG1vZHVsZXM6IG1vZHVsZXNPcHRpb25zLCBwcmVwcm9jZXNzb3JPcHRpb25zLCBkZXZTb3VyY2VtYXAsIH0gPSBjb25maWcuY3NzIHx8IHt9O1xuICAgIGNvbnN0IGlzTW9kdWxlID0gbW9kdWxlc09wdGlvbnMgIT09IGZhbHNlICYmIGNzc01vZHVsZVJFLnRlc3QoaWQpO1xuICAgIC8vIGFsdGhvdWdoIGF0IHNlcnZlIHRpbWUgaXQgY2FuIHdvcmsgd2l0aG91dCBwcm9jZXNzaW5nLCB3ZSBkbyBuZWVkIHRvXG4gICAgLy8gY3Jhd2wgdGhlbSBpbiBvcmRlciB0byByZWdpc3RlciB3YXRjaCBkZXBlbmRlbmNpZXMuXG4gICAgY29uc3QgbmVlZElubGluZUltcG9ydCA9IGNvZGUuaW5jbHVkZXMoJ0BpbXBvcnQnKTtcbiAgICBjb25zdCBoYXNVcmwgPSBjc3NVcmxSRS50ZXN0KGNvZGUpIHx8IGNzc0ltYWdlU2V0UkUudGVzdChjb2RlKTtcbiAgICBjb25zdCBsYW5nID0gaWQubWF0Y2goQ1NTX0xBTkdTX1JFKT8uWzFdO1xuICAgIGNvbnN0IHBvc3Rjc3NDb25maWcgPSBhd2FpdCByZXNvbHZlUG9zdGNzc0NvbmZpZyhjb25maWcsIGdldENzc0RpYWxlY3QobGFuZykpO1xuICAgIC8vIDEuIHBsYWluIGNzcyB0aGF0IG5lZWRzIG5vIHByb2Nlc3NpbmdcbiAgICBpZiAobGFuZyA9PT0gJ2NzcycgJiZcbiAgICAgICAgIXBvc3Rjc3NDb25maWcgJiZcbiAgICAgICAgIWlzTW9kdWxlICYmXG4gICAgICAgICFuZWVkSW5saW5lSW1wb3J0ICYmXG4gICAgICAgICFoYXNVcmwpIHtcbiAgICAgICAgcmV0dXJuIHsgY29kZSwgbWFwOiBudWxsIH07XG4gICAgfVxuICAgIGxldCBwcmVwcm9jZXNzb3JNYXA7XG4gICAgbGV0IG1vZHVsZXM7XG4gICAgY29uc3QgZGVwcyA9IG5ldyBTZXQoKTtcbiAgICBsZXQgYXRJbXBvcnRSZXNvbHZlcnMgPSBjb25maWdUb0F0SW1wb3J0UmVzb2x2ZXJzLmdldChjb25maWcpO1xuICAgIGlmICghYXRJbXBvcnRSZXNvbHZlcnMpIHtcbiAgICAgICAgYXRJbXBvcnRSZXNvbHZlcnMgPSBjcmVhdGVDU1NSZXNvbHZlcnMoY29uZmlnKTtcbiAgICAgICAgY29uZmlnVG9BdEltcG9ydFJlc29sdmVycy5zZXQoY29uZmlnLCBhdEltcG9ydFJlc29sdmVycyk7XG4gICAgfVxuICAgIC8vIDIuIHByZS1wcm9jZXNzb3JzOiBzYXNzIGV0Yy5cbiAgICBpZiAoaXNQcmVQcm9jZXNzb3IobGFuZykpIHtcbiAgICAgICAgY29uc3QgcHJlUHJvY2Vzc29yID0gcHJlUHJvY2Vzc29yc1tsYW5nXTtcbiAgICAgICAgbGV0IG9wdHMgPSAocHJlcHJvY2Vzc29yT3B0aW9ucyAmJiBwcmVwcm9jZXNzb3JPcHRpb25zW2xhbmddKSB8fCB7fTtcbiAgICAgICAgLy8gc3VwcG9ydCBAaW1wb3J0IGZyb20gbm9kZSBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdFxuICAgICAgICBzd2l0Y2ggKGxhbmcpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzY3NzXCIgLyogUHJlcHJvY2Vzc0xhbmcuc2NzcyAqLzpcbiAgICAgICAgICAgIGNhc2UgXCJzYXNzXCIgLyogUHJlcHJvY2Vzc0xhbmcuc2FzcyAqLzpcbiAgICAgICAgICAgICAgICBvcHRzID0ge1xuICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUGF0aHM6IFsnbm9kZV9tb2R1bGVzJ10sXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzOiBjb25maWcucmVzb2x2ZS5hbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImxlc3NcIiAvKiBQcmVwcm9jZXNzTGFuZy5sZXNzICovOlxuICAgICAgICAgICAgY2FzZSBcInN0eWxcIiAvKiBQcmVwcm9jZXNzTGFuZy5zdHlsICovOlxuICAgICAgICAgICAgY2FzZSBcInN0eWx1c1wiIC8qIFByZXByb2Nlc3NMYW5nLnN0eWx1cyAqLzpcbiAgICAgICAgICAgICAgICBvcHRzID0ge1xuICAgICAgICAgICAgICAgICAgICBwYXRoczogWydub2RlX21vZHVsZXMnXSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXM6IGNvbmZpZy5yZXNvbHZlLmFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW1wb3J0YW50OiBzZXQgdGhpcyBmb3IgcmVsYXRpdmUgaW1wb3J0IHJlc29sdmluZ1xuICAgICAgICBvcHRzLmZpbGVuYW1lID0gY2xlYW5VcmwoaWQpO1xuICAgICAgICBvcHRzLmVuYWJsZVNvdXJjZW1hcCA9IGRldlNvdXJjZW1hcCA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgcHJlcHJvY2Vzc1Jlc3VsdCA9IGF3YWl0IHByZVByb2Nlc3Nvcihjb2RlLCBjb25maWcucm9vdCwgb3B0cywgYXRJbXBvcnRSZXNvbHZlcnMpO1xuICAgICAgICBpZiAocHJlcHJvY2Vzc1Jlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgcHJlcHJvY2Vzc1Jlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb2RlID0gcHJlcHJvY2Vzc1Jlc3VsdC5jb2RlO1xuICAgICAgICBwcmVwcm9jZXNzb3JNYXAgPSBjb21iaW5lU291cmNlbWFwc0lmRXhpc3RzKG9wdHMuZmlsZW5hbWUsIHByZXByb2Nlc3NSZXN1bHQubWFwLCBwcmVwcm9jZXNzUmVzdWx0LmFkZGl0aW9uYWxNYXApO1xuICAgICAgICBpZiAocHJlcHJvY2Vzc1Jlc3VsdC5kZXBzKSB7XG4gICAgICAgICAgICBwcmVwcm9jZXNzUmVzdWx0LmRlcHMuZm9yRWFjaCgoZGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gc29tZXRpbWVzIHNhc3MgcmVnaXN0ZXJzIHRoZSBmaWxlIGl0c2VsZiBhcyBhIGRlcFxuICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVQYXRoJDMoZGVwKSAhPT0gbm9ybWFsaXplUGF0aCQzKG9wdHMuZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcHMuYWRkKGRlcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gMy4gcG9zdGNzc1xuICAgIGNvbnN0IHBvc3Rjc3NPcHRpb25zID0gKHBvc3Rjc3NDb25maWcgJiYgcG9zdGNzc0NvbmZpZy5vcHRpb25zKSB8fCB7fTtcbiAgICAvLyBmb3Igc3VnYXJzcyBjaGFuZ2UgcGFyc2VyXG4gICAgaWYgKGxhbmcgPT09ICdzc3MnKSB7XG4gICAgICAgIHBvc3Rjc3NPcHRpb25zLnBhcnNlciA9IGxvYWRQcmVwcm9jZXNzb3IoXCJzdWdhcnNzXCIgLyogUG9zdENzc0RpYWxlY3RMYW5nLnNzcyAqLywgY29uZmlnLnJvb3QpO1xuICAgIH1cbiAgICBjb25zdCBwb3N0Y3NzUGx1Z2lucyA9IHBvc3Rjc3NDb25maWcgJiYgcG9zdGNzc0NvbmZpZy5wbHVnaW5zID8gcG9zdGNzc0NvbmZpZy5wbHVnaW5zLnNsaWNlKCkgOiBbXTtcbiAgICBpZiAobmVlZElubGluZUltcG9ydCkge1xuICAgICAgICBwb3N0Y3NzUGx1Z2lucy51bnNoaWZ0KChhd2FpdCBpbXBvcnQoJy4vZGVwLTUzZGMxZWY0LmpzJykudGhlbihmdW5jdGlvbiAobikgeyByZXR1cm4gbi5pOyB9KSkuZGVmYXVsdCh7XG4gICAgICAgICAgICBhc3luYyByZXNvbHZlKGlkLCBiYXNlZGlyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHVibGljRmlsZSA9IGNoZWNrUHVibGljRmlsZShpZCwgY29uZmlnKTtcbiAgICAgICAgICAgICAgICBpZiAocHVibGljRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHVibGljRmlsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBhdEltcG9ydFJlc29sdmVycy5jc3MoaWQsIHBhdGgkby5qb2luKGJhc2VkaXIsICcqJykpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aCRvLnJlc29sdmUocmVzb2x2ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZUxheWVyKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGB2aXRlLS1hbm9uLWxheWVyLSR7Z2V0SGFzaChpZCl9LSR7aW5kZXh9YDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaWYgKHVybFJlcGxhY2VyKSB7XG4gICAgICAgIHBvc3Rjc3NQbHVnaW5zLnB1c2goVXJsUmV3cml0ZVBvc3Rjc3NQbHVnaW4oe1xuICAgICAgICAgICAgcmVwbGFjZXI6IHVybFJlcGxhY2VyLFxuICAgICAgICAgICAgbG9nZ2VyOiBjb25maWcubG9nZ2VyLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGlmIChpc01vZHVsZSkge1xuICAgICAgICBwb3N0Y3NzUGx1Z2lucy51bnNoaWZ0KChhd2FpdCBpbXBvcnQoJy4vZGVwLWY2M2I1NmFlLmpzJykudGhlbihmdW5jdGlvbiAobikgeyByZXR1cm4gbi5pOyB9KSkuZGVmYXVsdCh7XG4gICAgICAgICAgICAuLi5tb2R1bGVzT3B0aW9ucyxcbiAgICAgICAgICAgIGxvY2Fsc0NvbnZlbnRpb246IG1vZHVsZXNPcHRpb25zPy5sb2NhbHNDb252ZW50aW9uLFxuICAgICAgICAgICAgZ2V0SlNPTihjc3NGaWxlTmFtZSwgX21vZHVsZXMsIG91dHB1dEZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgbW9kdWxlcyA9IF9tb2R1bGVzO1xuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVzT3B0aW9ucyAmJiB0eXBlb2YgbW9kdWxlc09wdGlvbnMuZ2V0SlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGVzT3B0aW9ucy5nZXRKU09OKGNzc0ZpbGVOYW1lLCBfbW9kdWxlcywgb3V0cHV0RmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyByZXNvbHZlKGlkLCBpbXBvcnRlcikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGdldENzc1Jlc29sdmVyc0tleXMoYXRJbXBvcnRSZXNvbHZlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgYXRJbXBvcnRSZXNvbHZlcnNba2V5XShpZCwgaW1wb3J0ZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoJG8ucmVzb2x2ZShyZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBpZiAoIXBvc3Rjc3NQbHVnaW5zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIG1hcDogcHJlcHJvY2Vzc29yTWFwLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBsZXQgcG9zdGNzc1Jlc3VsdDtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSByZW1vdmVEaXJlY3RRdWVyeShpZCk7XG4gICAgICAgIC8vIHBvc3Rjc3MgaXMgYW4gdW5idW5kbGVkIGRlcCBhbmQgc2hvdWxkIGJlIGxhenkgaW1wb3J0ZWRcbiAgICAgICAgcG9zdGNzc1Jlc3VsdCA9IGF3YWl0IChhd2FpdCBpbXBvcnQoJ3Bvc3Rjc3MnKSlcbiAgICAgICAgICAgIC5kZWZhdWx0KHBvc3Rjc3NQbHVnaW5zKVxuICAgICAgICAgICAgLnByb2Nlc3MoY29kZSwge1xuICAgICAgICAgICAgLi4ucG9zdGNzc09wdGlvbnMsXG4gICAgICAgICAgICB0bzogc291cmNlLFxuICAgICAgICAgICAgZnJvbTogc291cmNlLFxuICAgICAgICAgICAgLi4uKGRldlNvdXJjZW1hcFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBtYXA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3Rjc3MgbWF5IHJldHVybiB2aXJ0dWFsIGZpbGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3Qgb2J0YWluIGNvbnRlbnQgb2YgdGhlbSwgc28gdGhpcyBuZWVkcyB0byBiZSBlbmFibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzQ29udGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gXCJwcmV2OiBwcmVwcm9jZXNzb3JNYXBcIiwgdGhlIHJlc3VsdCBtYXAgbWF5IGluY2x1ZGUgZHVwbGljYXRlIGZpbGVuYW1lIGluIGBwb3N0Y3NzUmVzdWx0Lm1hcC5zb3VyY2VzYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldjogcHJlcHJvY2Vzc29yTWFwLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHJlY29yZCBDU1MgZGVwZW5kZW5jaWVzIGZyb20gQGltcG9ydHNcbiAgICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHBvc3Rjc3NSZXN1bHQubWVzc2FnZXMpIHtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09ICdkZXBlbmRlbmN5Jykge1xuICAgICAgICAgICAgICAgIGRlcHMuYWRkKG5vcm1hbGl6ZVBhdGgkMyhtZXNzYWdlLmZpbGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2Rpci1kZXBlbmRlbmN5Jykge1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3N0Y3NzL3Bvc3Rjc3MvYmxvYi9tYWluL2RvY3MvZ3VpZGVsaW5lcy9wbHVnaW4ubWQjMy1kZXBlbmRlbmNpZXNcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRpciwgZ2xvYjogZ2xvYlBhdHRlcm4gPSAnKionIH0gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSBvdXQuZXNjYXBlUGF0aChub3JtYWxpemVQYXRoJDMocGF0aCRvLnJlc29sdmUocGF0aCRvLmRpcm5hbWUoaWQpLCBkaXIpKSkgK1xuICAgICAgICAgICAgICAgICAgICBgL2AgK1xuICAgICAgICAgICAgICAgICAgICBnbG9iUGF0dGVybjtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlcyA9IG91dC5zeW5jKHBhdHRlcm4sIHtcbiAgICAgICAgICAgICAgICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwcy5hZGQoZmlsZXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ3dhcm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBbdml0ZTpjc3NdICR7bWVzc2FnZS50ZXh0fWA7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubGluZSAmJiBtZXNzYWdlLmNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYFxcbiR7Z2VuZXJhdGVDb2RlRnJhbWUoY29kZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogbWVzc2FnZS5saW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBtZXNzYWdlLmNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgfSl9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uZmlnLmxvZ2dlci53YXJuKHBpY29jb2xvcnNFeHBvcnRzLnllbGxvdyhtc2cpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBlLm1lc3NhZ2UgPSBgW3Bvc3Rjc3NdICR7ZS5tZXNzYWdlfWA7XG4gICAgICAgIGUuY29kZSA9IGNvZGU7XG4gICAgICAgIGUubG9jID0ge1xuICAgICAgICAgICAgY29sdW1uOiBlLmNvbHVtbixcbiAgICAgICAgICAgIGxpbmU6IGUubGluZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgaWYgKCFkZXZTb3VyY2VtYXApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFzdDogcG9zdGNzc1Jlc3VsdCxcbiAgICAgICAgICAgIGNvZGU6IHBvc3Rjc3NSZXN1bHQuY3NzLFxuICAgICAgICAgICAgbWFwOiB7IG1hcHBpbmdzOiAnJyB9LFxuICAgICAgICAgICAgbW9kdWxlcyxcbiAgICAgICAgICAgIGRlcHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJhd1Bvc3Rjc3NNYXAgPSBwb3N0Y3NzUmVzdWx0Lm1hcC50b0pTT04oKTtcbiAgICBjb25zdCBwb3N0Y3NzTWFwID0gYXdhaXQgZm9ybWF0UG9zdGNzc1NvdXJjZU1hcChcbiAgICAvLyB2ZXJzaW9uIHByb3BlcnR5IG9mIHJhd1Bvc3Rjc3NNYXAgaXMgZGVjbGFyZWQgYXMgc3RyaW5nXG4gICAgLy8gYnV0IGFjdHVhbGx5IGl0IGlzIGEgbnVtYmVyXG4gICAgcmF3UG9zdGNzc01hcCwgY2xlYW5VcmwoaWQpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhc3Q6IHBvc3Rjc3NSZXN1bHQsXG4gICAgICAgIGNvZGU6IHBvc3Rjc3NSZXN1bHQuY3NzLFxuICAgICAgICBtYXA6IGNvbWJpbmVTb3VyY2VtYXBzSWZFeGlzdHMoY2xlYW5VcmwoaWQpLCBwb3N0Y3NzTWFwLCBwcmVwcm9jZXNzb3JNYXApLFxuICAgICAgICBtb2R1bGVzLFxuICAgICAgICBkZXBzLFxuICAgIH07XG59XG4vKipcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcHJvY2Vzc0NTUyhjb2RlLCBmaWxlbmFtZSwgY29uZmlnKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNvbXBpbGVDU1MoZmlsZW5hbWUsIGNvZGUsIGNvbmZpZyk7XG59XG5hc3luYyBmdW5jdGlvbiBmb3JtYXRQb3N0Y3NzU291cmNlTWFwKHJhd01hcCwgZmlsZSkge1xuICAgIGNvbnN0IGlucHV0RmlsZURpciA9IHBhdGgkby5kaXJuYW1lKGZpbGUpO1xuICAgIGNvbnN0IHNvdXJjZXMgPSByYXdNYXAuc291cmNlcy5tYXAoKHNvdXJjZSkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhblNvdXJjZSA9IGNsZWFuVXJsKGRlY29kZVVSSUNvbXBvbmVudChzb3VyY2UpKTtcbiAgICAgICAgLy8gcG9zdGNzcyByZXR1cm5zIHZpcnR1YWwgZmlsZXNcbiAgICAgICAgaWYgKC9ePC4rPiQvLnRlc3QoY2xlYW5Tb3VyY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxcMCR7Y2xlYW5Tb3VyY2V9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9ybWFsaXplUGF0aCQzKHBhdGgkby5yZXNvbHZlKGlucHV0RmlsZURpciwgY2xlYW5Tb3VyY2UpKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmaWxlLFxuICAgICAgICBtYXBwaW5nczogcmF3TWFwLm1hcHBpbmdzLFxuICAgICAgICBuYW1lczogcmF3TWFwLm5hbWVzLFxuICAgICAgICBzb3VyY2VzLFxuICAgICAgICBzb3VyY2VzQ29udGVudDogcmF3TWFwLnNvdXJjZXNDb250ZW50LFxuICAgICAgICB2ZXJzaW9uOiByYXdNYXAudmVyc2lvbixcbiAgICB9O1xufVxuZnVuY3Rpb24gY29tYmluZVNvdXJjZW1hcHNJZkV4aXN0cyhmaWxlbmFtZSwgbWFwMSwgbWFwMikge1xuICAgIHJldHVybiBtYXAxICYmIG1hcDJcbiAgICAgICAgPyBjb21iaW5lU291cmNlbWFwcyhmaWxlbmFtZSwgW1xuICAgICAgICAgICAgLy8gdHlwZSBvZiB2ZXJzaW9uIHByb3BlcnR5IG9mIEV4aXN0aW5nUmF3U291cmNlTWFwIGlzIG51bWJlclxuICAgICAgICAgICAgLy8gYnV0IGl0IGlzIGFsd2F5cyAzXG4gICAgICAgICAgICBtYXAxLFxuICAgICAgICAgICAgbWFwMixcbiAgICAgICAgXSlcbiAgICAgICAgOiBtYXAxO1xufVxuYXN5bmMgZnVuY3Rpb24gZmluYWxpemVDc3MoY3NzLCBtaW5pZnksIGNvbmZpZykge1xuICAgIC8vIGhvaXN0IGV4dGVybmFsIEBpbXBvcnRzIGFuZCBAY2hhcnNldCB0byB0aGUgdG9wIG9mIHRoZSBDU1MgY2h1bmsgcGVyIHNwZWMgKCMxODQ1IGFuZCAjNjMzMylcbiAgICBpZiAoY3NzLmluY2x1ZGVzKCdAaW1wb3J0JykgfHwgY3NzLmluY2x1ZGVzKCdAY2hhcnNldCcpKSB7XG4gICAgICAgIGNzcyA9IGF3YWl0IGhvaXN0QXRSdWxlcyhjc3MpO1xuICAgIH1cbiAgICBpZiAobWluaWZ5ICYmIGNvbmZpZy5idWlsZC5jc3NNaW5pZnkpIHtcbiAgICAgICAgY3NzID0gYXdhaXQgbWluaWZ5Q1NTKGNzcywgY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNzcztcbn1cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQb3N0Y3NzQ29uZmlnKGNvbmZpZywgZGlhbGVjdCA9ICdjc3MnKSB7XG4gICAgcG9zdGNzc0NvbmZpZ0NhY2hlW2RpYWxlY3RdID8/IChwb3N0Y3NzQ29uZmlnQ2FjaGVbZGlhbGVjdF0gPSBuZXcgV2Vha01hcCgpKTtcbiAgICBsZXQgcmVzdWx0ID0gcG9zdGNzc0NvbmZpZ0NhY2hlW2RpYWxlY3RdLmdldChjb25maWcpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBpbmxpbmUgcG9zdGNzcyBjb25maWcgdmlhIHZpdGUgY29uZmlnXG4gICAgY29uc3QgaW5saW5lT3B0aW9ucyA9IGNvbmZpZy5jc3M/LnBvc3Rjc3M7XG4gICAgaWYgKGlzT2JqZWN0JDIoaW5saW5lT3B0aW9ucykpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4uaW5saW5lT3B0aW9ucyB9O1xuICAgICAgICBkZWxldGUgb3B0aW9ucy5wbHVnaW5zO1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgcGx1Z2luczogaW5saW5lT3B0aW9ucy5wbHVnaW5zIHx8IFtdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoUGF0aCA9IHR5cGVvZiBpbmxpbmVPcHRpb25zID09PSAnc3RyaW5nJyA/IGlubGluZU9wdGlvbnMgOiBjb25maWcucm9vdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHNyYyQxKHt9LCBzZWFyY2hQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKCEvTm8gUG9zdENTUyBDb25maWcgZm91bmQvLnRlc3QoZS5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBuYW1lLCBtZXNzYWdlLCBzdGFjayB9ID0gZTtcbiAgICAgICAgICAgICAgICAgICAgZS5uYW1lID0gJ0ZhaWxlZCB0byBsb2FkIFBvc3RDU1MgY29uZmlnJztcbiAgICAgICAgICAgICAgICAgICAgZS5tZXNzYWdlID0gYEZhaWxlZCB0byBsb2FkIFBvc3RDU1MgY29uZmlnIChzZWFyY2hQYXRoOiAke3NlYXJjaFBhdGh9KTogWyR7bmFtZX1dICR7bWVzc2FnZX1cXG4ke3N0YWNrfWA7XG4gICAgICAgICAgICAgICAgICAgIGUuc3RhY2sgPSAnJzsgLy8gYWRkIHN0YWNrIHRvIG1lc3NhZ2UgdG8gcmV0YWluIHN0YWNrXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIFBvc3RDU1MgY29uZmlnOiAke2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwb3N0Y3NzQ29uZmlnQ2FjaGVbZGlhbGVjdF0uc2V0KGNvbmZpZywgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy1zeW50YXgtMy8jaWRlbnRpZmllci1jb2RlLXBvaW50XG5jb25zdCBjc3NVcmxSRSA9IC8oPzw9XnxbXlxcd1xcLVxcdTAwODAtXFx1ZmZmZl0pdXJsXFwoKFxccyooJ1teJ10rJ3xcIlteXCJdK1wiKVxccyp8W14nXCIpXSspXFwpLztcbmNvbnN0IGNzc0RhdGFVcmlSRSA9IC8oPzw9XnxbXlxcd1xcLVxcdTAwODAtXFx1ZmZmZl0pZGF0YS11cmlcXCgoXFxzKignW14nXSsnfFwiW15cIl0rXCIpXFxzKnxbXidcIildKylcXCkvO1xuY29uc3QgaW1wb3J0Q3NzUkUgPSAvQGltcG9ydCAoJ1teJ10rXFwuY3NzJ3xcIlteXCJdK1xcLmNzc1wifFteJ1wiKV0rXFwuY3NzKS87XG4vLyBBc3N1bWluZyBhIGZ1bmN0aW9uIG5hbWUgd29uJ3QgYmUgbG9uZ2VyIHRoYW4gMjU2IGNoYXJzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXVudXNlZC1jYXB0dXJpbmctZ3JvdXAgLS0gZG9lc24ndCBkZXRlY3QgYXN5bmNSZXBsYWNlIHVzYWdlXG5jb25zdCBjc3NJbWFnZVNldFJFID0gLyg/PD1pbWFnZS1zZXRcXCgpKCg/OltcXHdcXC1dezEsMjU2fVxcKFteKV0qXFwpfFteKV0pKikoPz1cXCkpLztcbmNvbnN0IFVybFJld3JpdGVQb3N0Y3NzUGx1Z2luID0gKG9wdHMpID0+IHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYXNlIG9yIHJlcGxhY2UgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9zdGNzc1BsdWdpbjogJ3ZpdGUtdXJsLXJld3JpdGUnLFxuICAgICAgICBPbmNlKHJvb3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgICAgICByb290LndhbGtEZWNscygoZGVjbGFyYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRlciA9IGRlY2xhcmF0aW9uLnNvdXJjZT8uaW5wdXQuZmlsZTtcbiAgICAgICAgICAgICAgICBpZiAoIWltcG9ydGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdHMubG9nZ2VyLndhcm5PbmNlKCdcXG5BIFBvc3RDU1MgcGx1Z2luIGRpZCBub3QgcGFzcyB0aGUgYGZyb21gIG9wdGlvbiB0byBgcG9zdGNzcy5wYXJzZWAuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgbWF5IGNhdXNlIGltcG9ydGVkIGFzc2V0cyB0byBiZSBpbmNvcnJlY3RseSB0cmFuc2Zvcm1lZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIklmIHlvdSd2ZSByZWNlbnRseSBhZGRlZCBhIFBvc3RDU1MgcGx1Z2luIHRoYXQgcmFpc2VkIHRoaXMgd2FybmluZywgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3BsZWFzZSBjb250YWN0IHRoZSBwYWNrYWdlIGF1dGhvciB0byBmaXggdGhlIGlzc3VlLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpc0Nzc1VybCA9IGNzc1VybFJFLnRlc3QoZGVjbGFyYXRpb24udmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3NzSW1hZ2VTZXQgPSBjc3NJbWFnZVNldFJFLnRlc3QoZGVjbGFyYXRpb24udmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Nzc1VybCB8fCBpc0Nzc0ltYWdlU2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VyRm9yRGVjbGFyYXRpb24gPSAocmF3VXJsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5yZXBsYWNlcihyYXdVcmwsIGltcG9ydGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV3cml0ZXJUb1VzZSA9IGlzQ3NzSW1hZ2VTZXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmV3cml0ZUNzc0ltYWdlU2V0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJld3JpdGVDc3NVcmxzO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHJld3JpdGVyVG9Vc2UoZGVjbGFyYXRpb24udmFsdWUsIHJlcGxhY2VyRm9yRGVjbGFyYXRpb24pLnRoZW4oKHVybCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24udmFsdWUgPSB1cmw7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59O1xuVXJsUmV3cml0ZVBvc3Rjc3NQbHVnaW4ucG9zdGNzcyA9IHRydWU7XG5mdW5jdGlvbiByZXdyaXRlQ3NzVXJscyhjc3MsIHJlcGxhY2VyKSB7XG4gICAgcmV0dXJuIGFzeW5jUmVwbGFjZShjc3MsIGNzc1VybFJFLCBhc3luYyAobWF0Y2gpID0+IHtcbiAgICAgICAgY29uc3QgW21hdGNoZWQsIHJhd1VybF0gPSBtYXRjaDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRvVXJsUmVwbGFjZShyYXdVcmwudHJpbSgpLCBtYXRjaGVkLCByZXBsYWNlcik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiByZXdyaXRlQ3NzRGF0YVVyaXMoY3NzLCByZXBsYWNlcikge1xuICAgIHJldHVybiBhc3luY1JlcGxhY2UoY3NzLCBjc3NEYXRhVXJpUkUsIGFzeW5jIChtYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCBbbWF0Y2hlZCwgcmF3VXJsXSA9IG1hdGNoO1xuICAgICAgICByZXR1cm4gYXdhaXQgZG9VcmxSZXBsYWNlKHJhd1VybC50cmltKCksIG1hdGNoZWQsIHJlcGxhY2VyLCAnZGF0YS11cmknKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJld3JpdGVJbXBvcnRDc3MoY3NzLCByZXBsYWNlcikge1xuICAgIHJldHVybiBhc3luY1JlcGxhY2UoY3NzLCBpbXBvcnRDc3NSRSwgYXN5bmMgKG1hdGNoKSA9PiB7XG4gICAgICAgIGNvbnN0IFttYXRjaGVkLCByYXdVcmxdID0gbWF0Y2g7XG4gICAgICAgIHJldHVybiBhd2FpdCBkb0ltcG9ydENTU1JlcGxhY2UocmF3VXJsLCBtYXRjaGVkLCByZXBsYWNlcik7XG4gICAgfSk7XG59XG4vLyBUT0RPOiBpbWFnZSBhbmQgY3Jvc3MtZmFkZSBjb3VsZCBjb250YWluIGEgXCJ1cmxcIiB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZFxuLy8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzcy1pbWFnZXMtNC8jaW1hZ2Utbm90YXRpb25cbi8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtaW1hZ2VzLTQvI2Nyb3NzLWZhZGUtZnVuY3Rpb25cbmNvbnN0IGNzc05vdFByb2Nlc3NlZFJFID0gLyg/OmdyYWRpZW50fGVsZW1lbnR8Y3Jvc3MtZmFkZXxpbWFnZSlcXCgvO1xuYXN5bmMgZnVuY3Rpb24gcmV3cml0ZUNzc0ltYWdlU2V0KGNzcywgcmVwbGFjZXIpIHtcbiAgICByZXR1cm4gYXdhaXQgYXN5bmNSZXBsYWNlKGNzcywgY3NzSW1hZ2VTZXRSRSwgYXN5bmMgKG1hdGNoKSA9PiB7XG4gICAgICAgIGNvbnN0IFssIHJhd1VybF0gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgcHJvY2Vzc1NyY1NldChyYXdVcmwsIGFzeW5jICh7IHVybCB9KSA9PiB7XG4gICAgICAgICAgICAvLyB0aGUgdXJsIG1heWJlIHVybCguLi4pXG4gICAgICAgICAgICBpZiAoY3NzVXJsUkUudGVzdCh1cmwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJld3JpdGVDc3NVcmxzKHVybCwgcmVwbGFjZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjc3NOb3RQcm9jZXNzZWRSRS50ZXN0KHVybCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZG9VcmxSZXBsYWNlKHVybCwgdXJsLCByZXBsYWNlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9KTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGRvVXJsUmVwbGFjZShyYXdVcmwsIG1hdGNoZWQsIHJlcGxhY2VyLCBmdW5jTmFtZSA9ICd1cmwnKSB7XG4gICAgbGV0IHdyYXAgPSAnJztcbiAgICBjb25zdCBmaXJzdCA9IHJhd1VybFswXTtcbiAgICBpZiAoZmlyc3QgPT09IGBcImAgfHwgZmlyc3QgPT09IGAnYCkge1xuICAgICAgICB3cmFwID0gZmlyc3Q7XG4gICAgICAgIHJhd1VybCA9IHJhd1VybC5zbGljZSgxLCAtMSk7XG4gICAgfVxuICAgIGlmIChpc0V4dGVybmFsVXJsKHJhd1VybCkgfHxcbiAgICAgICAgaXNEYXRhVXJsKHJhd1VybCkgfHxcbiAgICAgICAgcmF3VXJsLnN0YXJ0c1dpdGgoJyMnKSB8fFxuICAgICAgICB2YXJSRS50ZXN0KHJhd1VybCkpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IG5ld1VybCA9IGF3YWl0IHJlcGxhY2VyKHJhd1VybCk7XG4gICAgaWYgKHdyYXAgPT09ICcnICYmIG5ld1VybCAhPT0gZW5jb2RlVVJJKG5ld1VybCkpIHtcbiAgICAgICAgLy8gVGhlIG5ldyB1cmwgbWlnaHQgbmVlZCB3cmFwcGluZyBldmVuIGlmIHRoZSBvcmlnaW5hbCBkaWQgbm90IGhhdmUgaXQsIGUuZy4gaWYgYSBzcGFjZSB3YXMgYWRkZWQgZHVyaW5nIHJlcGxhY2VtZW50XG4gICAgICAgIHdyYXAgPSBcIidcIjtcbiAgICB9XG4gICAgcmV0dXJuIGAke2Z1bmNOYW1lfSgke3dyYXB9JHtuZXdVcmx9JHt3cmFwfSlgO1xufVxuYXN5bmMgZnVuY3Rpb24gZG9JbXBvcnRDU1NSZXBsYWNlKHJhd1VybCwgbWF0Y2hlZCwgcmVwbGFjZXIpIHtcbiAgICBsZXQgd3JhcCA9ICcnO1xuICAgIGNvbnN0IGZpcnN0ID0gcmF3VXJsWzBdO1xuICAgIGlmIChmaXJzdCA9PT0gYFwiYCB8fCBmaXJzdCA9PT0gYCdgKSB7XG4gICAgICAgIHdyYXAgPSBmaXJzdDtcbiAgICAgICAgcmF3VXJsID0gcmF3VXJsLnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gICAgaWYgKGlzRXh0ZXJuYWxVcmwocmF3VXJsKSB8fCBpc0RhdGFVcmwocmF3VXJsKSB8fCByYXdVcmwuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVkO1xuICAgIH1cbiAgICByZXR1cm4gYEBpbXBvcnQgJHt3cmFwfSR7YXdhaXQgcmVwbGFjZXIocmF3VXJsKX0ke3dyYXB9YDtcbn1cbmFzeW5jIGZ1bmN0aW9uIG1pbmlmeUNTUyhjc3MsIGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgY29kZSwgd2FybmluZ3MgfSA9IGF3YWl0IHRyYW5zZm9ybSQyKGNzcywge1xuICAgICAgICAgICAgbG9hZGVyOiAnY3NzJyxcbiAgICAgICAgICAgIHRhcmdldDogY29uZmlnLmJ1aWxkLmNzc1RhcmdldCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAuLi5yZXNvbHZlRXNidWlsZE1pbmlmeU9wdGlvbnMoY29uZmlnLmVzYnVpbGQgfHwge30pLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHdhcm5pbmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbXNncyA9IGF3YWl0IGZvcm1hdE1lc3NhZ2VzKHdhcm5pbmdzLCB7IGtpbmQ6ICd3YXJuaW5nJyB9KTtcbiAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIud2FybihwaWNvY29sb3JzRXhwb3J0cy55ZWxsb3coYHdhcm5pbmdzIHdoZW4gbWluaWZ5aW5nIGNzczpcXG4ke21zZ3Muam9pbignXFxuJyl9YCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZS5lcnJvcnMpIHtcbiAgICAgICAgICAgIGUubWVzc2FnZSA9ICdbZXNidWlsZCBjc3MgbWluaWZ5XSAnICsgZS5tZXNzYWdlO1xuICAgICAgICAgICAgY29uc3QgbXNncyA9IGF3YWl0IGZvcm1hdE1lc3NhZ2VzKGUuZXJyb3JzLCB7IGtpbmQ6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICBlLmZyYW1lID0gJ1xcbicgKyBtc2dzLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgZS5sb2MgPSBlLmVycm9yc1swXS5sb2NhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVFc2J1aWxkTWluaWZ5T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgY29uc3QgYmFzZSA9IHtcbiAgICAgICAgbG9nTGV2ZWw6IG9wdGlvbnMubG9nTGV2ZWwsXG4gICAgICAgIGxvZ0xpbWl0OiBvcHRpb25zLmxvZ0xpbWl0LFxuICAgICAgICBsb2dPdmVycmlkZTogb3B0aW9ucy5sb2dPdmVycmlkZSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zLm1pbmlmeUlkZW50aWZpZXJzICE9IG51bGwgfHxcbiAgICAgICAgb3B0aW9ucy5taW5pZnlTeW50YXggIT0gbnVsbCB8fFxuICAgICAgICBvcHRpb25zLm1pbmlmeVdoaXRlc3BhY2UgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICAgIG1pbmlmeUlkZW50aWZpZXJzOiBvcHRpb25zLm1pbmlmeUlkZW50aWZpZXJzID8/IHRydWUsXG4gICAgICAgICAgICBtaW5pZnlTeW50YXg6IG9wdGlvbnMubWluaWZ5U3ludGF4ID8/IHRydWUsXG4gICAgICAgICAgICBtaW5pZnlXaGl0ZXNwYWNlOiBvcHRpb25zLm1pbmlmeVdoaXRlc3BhY2UgPz8gdHJ1ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2UsIG1pbmlmeTogdHJ1ZSB9O1xuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGhvaXN0QXRSdWxlcyhjc3MpIHtcbiAgICBjb25zdCBzID0gbmV3IE1hZ2ljU3RyaW5nKGNzcyk7XG4gICAgY29uc3QgY2xlYW5Dc3MgPSBlbXB0eUNzc0NvbW1lbnRzKGNzcyk7XG4gICAgbGV0IG1hdGNoO1xuICAgIC8vICMxODQ1XG4gICAgLy8gQ1NTIEBpbXBvcnQgY2FuIG9ubHkgYXBwZWFyIGF0IHRvcCBvZiB0aGUgZmlsZS4gV2UgbmVlZCB0byBob2lzdCBhbGwgQGltcG9ydFxuICAgIC8vIHRvIHRvcCB3aGVuIG11bHRpcGxlIGZpbGVzIGFyZSBjb25jYXRlbmF0ZWQuXG4gICAgLy8gbWF0Y2ggdW50aWwgc2VtaWNvbG9uIHRoYXQncyBub3QgaW4gcXVvdGVzXG4gICAgY29uc3QgYXRJbXBvcnRSRSA9IC9AaW1wb3J0KD86XFxzKig/OnVybFxcKFteKV0qXFwpfFwiKD86W15cIl18KD88PVxcXFwpXCIpKlwifCcoPzpbXiddfCg/PD1cXFxcKScpKicpLio/fFteO10qKTsvZztcbiAgICB3aGlsZSAoKG1hdGNoID0gYXRJbXBvcnRSRS5leGVjKGNsZWFuQ3NzKSkpIHtcbiAgICAgICAgcy5yZW1vdmUobWF0Y2guaW5kZXgsIG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgLy8gVXNlIGBhcHBlbmRMZWZ0YCBpbnN0ZWFkIG9mIGBwcmVwZW5kYCB0byBwcmVzZXJ2ZSBvcmlnaW5hbCBAaW1wb3J0IG9yZGVyXG4gICAgICAgIHMuYXBwZW5kTGVmdCgwLCBtYXRjaFswXSk7XG4gICAgfVxuICAgIC8vICM2MzMzXG4gICAgLy8gQ1NTIEBjaGFyc2V0IG11c3QgYmUgdGhlIHRvcC1maXJzdCBpbiB0aGUgZmlsZSwgaG9pc3QgdGhlIGZpcnN0IHRvIHRvcFxuICAgIGNvbnN0IGF0Q2hhcnNldFJFID0gL0BjaGFyc2V0KD86XFxzKig/OlwiKD86W15cIl18KD88PVxcXFwpXCIpKlwifCcoPzpbXiddfCg/PD1cXFxcKScpKicpLio/fFteO10qKTsvZztcbiAgICBsZXQgZm91bmRDaGFyc2V0ID0gZmFsc2U7XG4gICAgd2hpbGUgKChtYXRjaCA9IGF0Q2hhcnNldFJFLmV4ZWMoY2xlYW5Dc3MpKSkge1xuICAgICAgICBzLnJlbW92ZShtYXRjaC5pbmRleCwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICBpZiAoIWZvdW5kQ2hhcnNldCkge1xuICAgICAgICAgICAgcy5wcmVwZW5kKG1hdGNoWzBdKTtcbiAgICAgICAgICAgIGZvdW5kQ2hhcnNldCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHMudG9TdHJpbmcoKTtcbn1cbmNvbnN0IGxvYWRlZFByZXByb2Nlc3NvcnMgPSB7fTtcbi8vIFRPRE86IHVzZSBkeW5hbWljIGltcG9ydFxuY29uc3QgX3JlcXVpcmUkMSA9IGNyZWF0ZVJlcXVpcmUkMShpbXBvcnQubWV0YS51cmwpO1xuZnVuY3Rpb24gbG9hZFByZXByb2Nlc3NvcihsYW5nLCByb290KSB7XG4gICAgaWYgKGxhbmcgaW4gbG9hZGVkUHJlcHJvY2Vzc29ycykge1xuICAgICAgICByZXR1cm4gbG9hZGVkUHJlcHJvY2Vzc29yc1tsYW5nXTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXF1aXJlUmVzb2x2ZUZyb21Sb290V2l0aEZhbGxiYWNrKHJvb3QsIGxhbmcpO1xuICAgICAgICByZXR1cm4gKGxvYWRlZFByZXByb2Nlc3NvcnNbbGFuZ10gPSBfcmVxdWlyZSQxKHJlc29sdmVkKSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLmNvZGUgPT09ICdNT0RVTEVfTk9UX0ZPVU5EJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcmVwcm9jZXNzb3IgZGVwZW5kZW5jeSBcIiR7bGFuZ31cIiBub3QgZm91bmQuIERpZCB5b3UgaW5zdGFsbCBpdD9gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgRXJyb3IoYFByZXByb2Nlc3NvciBkZXBlbmRlbmN5IFwiJHtsYW5nfVwiIGZhaWxlZCB0byBsb2FkOlxcbiR7ZS5tZXNzYWdlfWApO1xuICAgICAgICAgICAgbWVzc2FnZS5zdGFjayA9IGUuc3RhY2sgKyAnXFxuJyArIG1lc3NhZ2Uuc3RhY2s7XG4gICAgICAgICAgICB0aHJvdyBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gaW4gdW5peCwgc2NzcyBtaWdodCBhcHBlbmQgYGxvY2F0aW9uLmhyZWZgIGluIGVudmlyb25tZW50cyB0aGF0IHNoaW0gYGxvY2F0aW9uYFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL2RhcnQtc2Fzcy9pc3N1ZXMvNzEwXG5mdW5jdGlvbiBjbGVhblNjc3NCdWdVcmwodXJsKSB7XG4gICAgaWYgKFxuICAgIC8vIGNoZWNrIGJ1ZyB2aWEgYHdpbmRvd2AgYW5kIGBsb2NhdGlvbmAgZ2xvYmFsXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gICAgICAgIHJldHVybiB1cmwucmVwbGFjZShwcmVmaXgsICcnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufVxuZnVuY3Rpb24gZml4U2Nzc0J1Z0ltcG9ydFZhbHVlKGRhdGEpIHtcbiAgICAvLyB0aGUgc2NzcyBidWcgZG9lc24ndCBsb2FkIGZpbGVzIHByb3Blcmx5IHNvIHdlIGhhdmUgdG8gbG9hZCBpdCBvdXJzZWx2ZXNcbiAgICAvLyB0byBwcmV2ZW50IGludGVybmFsIGVycm9yIHdoZW4gaXQgbG9hZHMgaXRzZWxmXG4gICAgaWYgKFxuICAgIC8vIGNoZWNrIGJ1ZyB2aWEgYHdpbmRvd2AgYW5kIGBsb2NhdGlvbmAgZ2xvYmFsXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgdHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBkYXRhICYmXG4gICAgICAgICdmaWxlJyBpbiBkYXRhICYmXG4gICAgICAgICghKCdjb250ZW50cycgaW4gZGF0YSkgfHwgZGF0YS5jb250ZW50cyA9PSBudWxsKSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHdlIG5lZWQgdG8gcHJlc2VydmUgZmlsZSBwcm9wZXJ0eSBmb3IgSE1SXG4gICAgICAgIGRhdGEuY29udGVudHMgPSBmcyRsLnJlYWRGaWxlU3luYyhkYXRhLmZpbGUsICd1dGYtOCcpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbn1cbi8vIC5zY3NzLy5zYXNzIHByb2Nlc3NvclxuY29uc3Qgc2NzcyA9IGFzeW5jIChzb3VyY2UsIHJvb3QsIG9wdGlvbnMsIHJlc29sdmVycykgPT4ge1xuICAgIGNvbnN0IHJlbmRlciA9IGxvYWRQcmVwcm9jZXNzb3IoXCJzYXNzXCIgLyogUHJlcHJvY2Vzc0xhbmcuc2FzcyAqLywgcm9vdCkucmVuZGVyO1xuICAgIC8vIE5PVEU6IGBzYXNzYCBhbHdheXMgcnVucyBpdCdzIG93biBpbXBvcnRlciBmaXJzdCwgYW5kIG9ubHkgZmFsbHMgYmFjayB0b1xuICAgIC8vIHRoZSBgaW1wb3J0ZXJgIG9wdGlvbiB3aGVuIGl0IGNhbid0IHJlc29sdmUgYSBwYXRoXG4gICAgY29uc3QgaW50ZXJuYWxJbXBvcnRlciA9ICh1cmwsIGltcG9ydGVyLCBkb25lKSA9PiB7XG4gICAgICAgIGltcG9ydGVyID0gY2xlYW5TY3NzQnVnVXJsKGltcG9ydGVyKTtcbiAgICAgICAgcmVzb2x2ZXJzLnNhc3ModXJsLCBpbXBvcnRlcikudGhlbigocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCkge1xuICAgICAgICAgICAgICAgIHJlYmFzZVVybHMocmVzb2x2ZWQsIG9wdGlvbnMuZmlsZW5hbWUsIG9wdGlvbnMuYWxpYXMsICckJylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IGRvbmU/LihmaXhTY3NzQnVnSW1wb3J0VmFsdWUoZGF0YSkpKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGRhdGEpID0+IGRvbmU/LihkYXRhKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb25lPy4obnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgaW1wb3J0ZXIgPSBbaW50ZXJuYWxJbXBvcnRlcl07XG4gICAgaWYgKG9wdGlvbnMuaW1wb3J0ZXIpIHtcbiAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLmltcG9ydGVyKVxuICAgICAgICAgICAgPyBpbXBvcnRlci51bnNoaWZ0KC4uLm9wdGlvbnMuaW1wb3J0ZXIpXG4gICAgICAgICAgICA6IGltcG9ydGVyLnVuc2hpZnQob3B0aW9ucy5pbXBvcnRlcik7XG4gICAgfVxuICAgIGNvbnN0IHsgY29udGVudDogZGF0YSwgbWFwOiBhZGRpdGlvbmFsTWFwIH0gPSBhd2FpdCBnZXRTb3VyY2Uoc291cmNlLCBvcHRpb25zLmZpbGVuYW1lLCBvcHRpb25zLmFkZGl0aW9uYWxEYXRhLCBvcHRpb25zLmVuYWJsZVNvdXJjZW1hcCk7XG4gICAgY29uc3QgZmluYWxPcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBkYXRhLFxuICAgICAgICBmaWxlOiBvcHRpb25zLmZpbGVuYW1lLFxuICAgICAgICBvdXRGaWxlOiBvcHRpb25zLmZpbGVuYW1lLFxuICAgICAgICBpbXBvcnRlcixcbiAgICAgICAgLi4uKG9wdGlvbnMuZW5hYmxlU291cmNlbWFwXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgICAgICAgICAgICAgb21pdFNvdXJjZU1hcFVybDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzb3VyY2VNYXBSb290OiBwYXRoJG8uZGlybmFtZShvcHRpb25zLmZpbGVuYW1lKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVuZGVyKGZpbmFsT3B0aW9ucywgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRlcHMgPSByZXN1bHQuc3RhdHMuaW5jbHVkZWRGaWxlcy5tYXAoKGYpID0+IGNsZWFuU2Nzc0J1Z1VybChmKSk7XG4gICAgICAgIGNvbnN0IG1hcCA9IHJlc3VsdC5tYXBcbiAgICAgICAgICAgID8gSlNPTi5wYXJzZShyZXN1bHQubWFwLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5jc3MudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG1hcCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxNYXAsXG4gICAgICAgICAgICBkZXBzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAvLyBub3JtYWxpemUgU0FTUyBlcnJvclxuICAgICAgICBlLm1lc3NhZ2UgPSBgW3Nhc3NdICR7ZS5tZXNzYWdlfWA7XG4gICAgICAgIGUuaWQgPSBlLmZpbGU7XG4gICAgICAgIGUuZnJhbWUgPSBlLmZvcm1hdHRlZDtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogJycsIGVycm9yOiBlLCBkZXBzOiBbXSB9O1xuICAgIH1cbn07XG5jb25zdCBzYXNzID0gKHNvdXJjZSwgcm9vdCwgb3B0aW9ucywgYWxpYXNSZXNvbHZlcikgPT4gc2Nzcyhzb3VyY2UsIHJvb3QsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGluZGVudGVkU3ludGF4OiB0cnVlLFxufSwgYWxpYXNSZXNvbHZlcik7XG4vKipcbiAqIHJlbGF0aXZlIHVybCgpIGluc2lkZSBcXEBpbXBvcnRlZCBzYXNzIGFuZCBsZXNzIGZpbGVzIG11c3QgYmUgcmViYXNlZCB0byB1c2VcbiAqIHJvb3QgZmlsZSBhcyBiYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWJhc2VVcmxzKGZpbGUsIHJvb3RGaWxlLCBhbGlhcywgdmFyaWFibGVQcmVmaXgpIHtcbiAgICBmaWxlID0gcGF0aCRvLnJlc29sdmUoZmlsZSk7IC8vIGVuc3VyZSBvcy1zcGVjaWZpYyBmbGFzaGVzXG4gICAgLy8gaW4gdGhlIHNhbWUgZGlyLCBubyBuZWVkIHRvIHJlYmFzZVxuICAgIGNvbnN0IGZpbGVEaXIgPSBwYXRoJG8uZGlybmFtZShmaWxlKTtcbiAgICBjb25zdCByb290RGlyID0gcGF0aCRvLmRpcm5hbWUocm9vdEZpbGUpO1xuICAgIGlmIChmaWxlRGlyID09PSByb290RGlyKSB7XG4gICAgICAgIHJldHVybiB7IGZpbGUgfTtcbiAgICB9XG4gICAgY29uc3QgY29udGVudCA9IGZzJGwucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpO1xuICAgIC8vIG5vIHVybCgpXG4gICAgY29uc3QgaGFzVXJscyA9IGNzc1VybFJFLnRlc3QoY29udGVudCk7XG4gICAgLy8gZGF0YS11cmkoKSBjYWxsc1xuICAgIGNvbnN0IGhhc0RhdGFVcmlzID0gY3NzRGF0YVVyaVJFLnRlc3QoY29udGVudCk7XG4gICAgLy8gbm8gQGltcG9ydCB4eHguY3NzXG4gICAgY29uc3QgaGFzSW1wb3J0Q3NzID0gaW1wb3J0Q3NzUkUudGVzdChjb250ZW50KTtcbiAgICBpZiAoIWhhc1VybHMgJiYgIWhhc0RhdGFVcmlzICYmICFoYXNJbXBvcnRDc3MpIHtcbiAgICAgICAgcmV0dXJuIHsgZmlsZSB9O1xuICAgIH1cbiAgICBsZXQgcmViYXNlZDtcbiAgICBjb25zdCByZWJhc2VGbiA9ICh1cmwpID0+IHtcbiAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCcvJykpXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICAvLyBpZ25vcmUgdXJsJ3Mgc3RhcnRpbmcgd2l0aCB2YXJpYWJsZVxuICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgodmFyaWFibGVQcmVmaXgpKVxuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgLy8gbWF0Y2ggYWxpYXMsIG5vIG5lZWQgdG8gcmV3cml0ZVxuICAgICAgICBmb3IgKGNvbnN0IHsgZmluZCB9IG9mIGFsaWFzKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gdHlwZW9mIGZpbmQgPT09ICdzdHJpbmcnID8gdXJsLnN0YXJ0c1dpdGgoZmluZCkgOiBmaW5kLnRlc3QodXJsKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhYnNvbHV0ZSA9IHBhdGgkby5yZXNvbHZlKGZpbGVEaXIsIHVybCk7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlID0gcGF0aCRvLnJlbGF0aXZlKHJvb3REaXIsIGFic29sdXRlKTtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgkMyhyZWxhdGl2ZSk7XG4gICAgfTtcbiAgICAvLyBmaXggY3NzIGltcG9ydHMgaW4gbGVzcyBzdWNoIGFzIGBAaW1wb3J0IFwiZm9vLmNzc1wiYFxuICAgIGlmIChoYXNJbXBvcnRDc3MpIHtcbiAgICAgICAgcmViYXNlZCA9IGF3YWl0IHJld3JpdGVJbXBvcnRDc3MoY29udGVudCwgcmViYXNlRm4pO1xuICAgIH1cbiAgICBpZiAoaGFzVXJscykge1xuICAgICAgICByZWJhc2VkID0gYXdhaXQgcmV3cml0ZUNzc1VybHMocmViYXNlZCB8fCBjb250ZW50LCByZWJhc2VGbik7XG4gICAgfVxuICAgIGlmIChoYXNEYXRhVXJpcykge1xuICAgICAgICByZWJhc2VkID0gYXdhaXQgcmV3cml0ZUNzc0RhdGFVcmlzKHJlYmFzZWQgfHwgY29udGVudCwgcmViYXNlRm4pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmaWxlLFxuICAgICAgICBjb250ZW50czogcmViYXNlZCxcbiAgICB9O1xufVxuLy8gLmxlc3NcbmNvbnN0IGxlc3MgPSBhc3luYyAoc291cmNlLCByb290LCBvcHRpb25zLCByZXNvbHZlcnMpID0+IHtcbiAgICBjb25zdCBub2RlTGVzcyA9IGxvYWRQcmVwcm9jZXNzb3IoXCJsZXNzXCIgLyogUHJlcHJvY2Vzc0xhbmcubGVzcyAqLywgcm9vdCk7XG4gICAgY29uc3Qgdml0ZVJlc29sdmVyUGx1Z2luID0gY3JlYXRlVml0ZUxlc3NQbHVnaW4obm9kZUxlc3MsIG9wdGlvbnMuZmlsZW5hbWUsIG9wdGlvbnMuYWxpYXMsIHJlc29sdmVycyk7XG4gICAgY29uc3QgeyBjb250ZW50LCBtYXA6IGFkZGl0aW9uYWxNYXAgfSA9IGF3YWl0IGdldFNvdXJjZShzb3VyY2UsIG9wdGlvbnMuZmlsZW5hbWUsIG9wdGlvbnMuYWRkaXRpb25hbERhdGEsIG9wdGlvbnMuZW5hYmxlU291cmNlbWFwKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IG5vZGVMZXNzLnJlbmRlcihjb250ZW50LCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgcGx1Z2luczogW3ZpdGVSZXNvbHZlclBsdWdpbiwgLi4uKG9wdGlvbnMucGx1Z2lucyB8fCBbXSldLFxuICAgICAgICAgICAgLi4uKG9wdGlvbnMuZW5hYmxlU291cmNlbWFwXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU1hcDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U291cmNlRmlsZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VNYXBGaWxlSW5saW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IGU7XG4gICAgICAgIC8vIG5vcm1hbGl6ZSBlcnJvciBpbmZvXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFcnJvciA9IG5ldyBFcnJvcihgW2xlc3NdICR7ZXJyb3IubWVzc2FnZSB8fCBlcnJvci50eXBlfWApO1xuICAgICAgICBub3JtYWxpemVkRXJyb3IubG9jID0ge1xuICAgICAgICAgICAgZmlsZTogZXJyb3IuZmlsZW5hbWUgfHwgb3B0aW9ucy5maWxlbmFtZSxcbiAgICAgICAgICAgIGxpbmU6IGVycm9yLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGVycm9yLmNvbHVtbixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHsgY29kZTogJycsIGVycm9yOiBub3JtYWxpemVkRXJyb3IsIGRlcHM6IFtdIH07XG4gICAgfVxuICAgIGNvbnN0IG1hcCA9IHJlc3VsdC5tYXAgJiYgSlNPTi5wYXJzZShyZXN1bHQubWFwKTtcbiAgICBpZiAobWFwKSB7XG4gICAgICAgIGRlbGV0ZSBtYXAuc291cmNlc0NvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHJlc3VsdC5jc3MudG9TdHJpbmcoKSxcbiAgICAgICAgbWFwLFxuICAgICAgICBhZGRpdGlvbmFsTWFwLFxuICAgICAgICBkZXBzOiByZXN1bHQuaW1wb3J0cyxcbiAgICB9O1xufTtcbi8qKlxuICogTGVzcyBtYW5hZ2VyLCBsYXp5IGluaXRpYWxpemVkXG4gKi9cbmxldCBWaXRlTGVzc01hbmFnZXI7XG5mdW5jdGlvbiBjcmVhdGVWaXRlTGVzc1BsdWdpbihsZXNzLCByb290RmlsZSwgYWxpYXMsIHJlc29sdmVycykge1xuICAgIGlmICghVml0ZUxlc3NNYW5hZ2VyKSB7XG4gICAgICAgIFZpdGVMZXNzTWFuYWdlciA9IGNsYXNzIFZpdGVNYW5hZ2VyIGV4dGVuZHMgbGVzcy5GaWxlTWFuYWdlciB7XG4gICAgICAgICAgICBjb25zdHJ1Y3Rvcihyb290RmlsZSwgcmVzb2x2ZXJzLCBhbGlhcykge1xuICAgICAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290RmlsZSA9IHJvb3RGaWxlO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZXJzID0gcmVzb2x2ZXJzO1xuICAgICAgICAgICAgICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1cHBvcnRzKGZpbGVuYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFpc0V4dGVybmFsVXJsKGZpbGVuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1cHBvcnRzU3luYygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3luYyBsb2FkRmlsZShmaWxlbmFtZSwgZGlyLCBvcHRzLCBlbnYpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMucmVzb2x2ZXJzLmxlc3MoZmlsZW5hbWUsIHBhdGgkby5qb2luKGRpciwgJyonKSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYmFzZVVybHMocmVzb2x2ZWQsIHRoaXMucm9vdEZpbGUsIHRoaXMuYWxpYXMsICdAJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50cztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAnY29udGVudHMnIGluIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSByZXN1bHQuY29udGVudHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cyA9IGZzJGwucmVhZEZpbGVTeW5jKHJlc29sdmVkLCAndXRmLTgnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhdGgkby5yZXNvbHZlKHJlc29sdmVkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWRGaWxlKGZpbGVuYW1lLCBkaXIsIG9wdHMsIGVudik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YWxsKF8sIHBsdWdpbk1hbmFnZXIpIHtcbiAgICAgICAgICAgIHBsdWdpbk1hbmFnZXIuYWRkRmlsZU1hbmFnZXIobmV3IFZpdGVMZXNzTWFuYWdlcihyb290RmlsZSwgcmVzb2x2ZXJzLCBhbGlhcykpO1xuICAgICAgICB9LFxuICAgICAgICBtaW5WZXJzaW9uOiBbMywgMCwgMF0sXG4gICAgfTtcbn1cbi8vIC5zdHlsXG5jb25zdCBzdHlsID0gYXN5bmMgKHNvdXJjZSwgcm9vdCwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG5vZGVTdHlsdXMgPSBsb2FkUHJlcHJvY2Vzc29yKFwic3R5bHVzXCIgLyogUHJlcHJvY2Vzc0xhbmcuc3R5bHVzICovLCByb290KTtcbiAgICAvLyBHZXQgc291cmNlIHdpdGggcHJlcHJvY2Vzc29yIG9wdGlvbnMuYWRkaXRpb25hbERhdGEuIE1ha2Ugc3VyZSBhIG5ldyBsaW5lIHNlcGFyYXRvclxuICAgIC8vIGlzIGFkZGVkIHRvIGF2b2lkIGFueSByZW5kZXIgZXJyb3IsIGFzIGFkZGVkIHN0eWx1cyBjb250ZW50IG1heSBub3QgaGF2ZSBzZW1pLWNvbG9uIHNlcGFyYXRvcnNcbiAgICBjb25zdCB7IGNvbnRlbnQsIG1hcDogYWRkaXRpb25hbE1hcCB9ID0gYXdhaXQgZ2V0U291cmNlKHNvdXJjZSwgb3B0aW9ucy5maWxlbmFtZSwgb3B0aW9ucy5hZGRpdGlvbmFsRGF0YSwgb3B0aW9ucy5lbmFibGVTb3VyY2VtYXAsICdcXG4nKTtcbiAgICAvLyBHZXQgcHJlcHJvY2Vzc29yIG9wdGlvbnMuaW1wb3J0cyBkZXBlbmRlbmNpZXMgYXMgc3R5bHVzXG4gICAgLy8gZG9lcyBub3QgcmV0dXJuIHRoZW0gd2l0aCBpdHMgYnVpbHRpbiBgLmRlcHMoKWAgbWV0aG9kXG4gICAgY29uc3QgaW1wb3J0c0RlcHMgPSAob3B0aW9ucy5pbXBvcnRzID8/IFtdKS5tYXAoKGRlcCkgPT4gcGF0aCRvLnJlc29sdmUoZGVwKSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVmID0gbm9kZVN0eWx1cyhjb250ZW50LCBvcHRpb25zKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVmaW5lKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zLmRlZmluZSkge1xuICAgICAgICAgICAgICAgIHJlZi5kZWZpbmUoa2V5LCBvcHRpb25zLmRlZmluZVtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVTb3VyY2VtYXApIHtcbiAgICAgICAgICAgIHJlZi5zZXQoJ3NvdXJjZW1hcCcsIHtcbiAgICAgICAgICAgICAgICBjb21tZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbmxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGJhc2VQYXRoOiByb290LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVmLnJlbmRlcigpO1xuICAgICAgICAvLyBDb25jYXQgaW1wb3J0cyBkZXBzIHdpdGggY29tcHV0ZWQgZGVwc1xuICAgICAgICBjb25zdCBkZXBzID0gWy4uLnJlZi5kZXBzKCksIC4uLmltcG9ydHNEZXBzXTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzb3VyY2VtYXAgZXhpc3RzXG4gICAgICAgIGNvbnN0IG1hcCA9IHJlZi5zb3VyY2VtYXA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiByZXN1bHQsXG4gICAgICAgICAgICBtYXA6IGZvcm1hdFN0eWx1c1NvdXJjZU1hcChtYXAsIHJvb3QpLFxuICAgICAgICAgICAgYWRkaXRpb25hbE1hcCxcbiAgICAgICAgICAgIGRlcHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGUubWVzc2FnZSA9IGBbc3R5bHVzXSAke2UubWVzc2FnZX1gO1xuICAgICAgICByZXR1cm4geyBjb2RlOiAnJywgZXJyb3I6IGUsIGRlcHM6IFtdIH07XG4gICAgfVxufTtcbmZ1bmN0aW9uIGZvcm1hdFN0eWx1c1NvdXJjZU1hcChtYXBCZWZvcmUsIHJvb3QpIHtcbiAgICBpZiAoIW1hcEJlZm9yZSlcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXAgPSB7IC4uLm1hcEJlZm9yZSB9O1xuICAgIGNvbnN0IHJlc29sdmVGcm9tUm9vdCA9IChwKSA9PiBub3JtYWxpemVQYXRoJDMocGF0aCRvLnJlc29sdmUocm9vdCwgcCkpO1xuICAgIGlmIChtYXAuZmlsZSkge1xuICAgICAgICBtYXAuZmlsZSA9IHJlc29sdmVGcm9tUm9vdChtYXAuZmlsZSk7XG4gICAgfVxuICAgIG1hcC5zb3VyY2VzID0gbWFwLnNvdXJjZXMubWFwKHJlc29sdmVGcm9tUm9vdCk7XG4gICAgcmV0dXJuIG1hcDtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldFNvdXJjZShzb3VyY2UsIGZpbGVuYW1lLCBhZGRpdGlvbmFsRGF0YSwgZW5hYmxlU291cmNlbWFwLCBzZXAgPSAnJykge1xuICAgIGlmICghYWRkaXRpb25hbERhdGEpXG4gICAgICAgIHJldHVybiB7IGNvbnRlbnQ6IHNvdXJjZSB9O1xuICAgIGlmICh0eXBlb2YgYWRkaXRpb25hbERhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFkZGl0aW9uYWxEYXRhKHNvdXJjZSwgZmlsZW5hbWUpO1xuICAgICAgICBpZiAodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4geyBjb250ZW50OiBuZXdDb250ZW50IH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0NvbnRlbnQ7XG4gICAgfVxuICAgIGlmICghZW5hYmxlU291cmNlbWFwKSB7XG4gICAgICAgIHJldHVybiB7IGNvbnRlbnQ6IGFkZGl0aW9uYWxEYXRhICsgc2VwICsgc291cmNlIH07XG4gICAgfVxuICAgIGNvbnN0IG1zID0gbmV3IE1hZ2ljU3RyaW5nKHNvdXJjZSk7XG4gICAgbXMuYXBwZW5kTGVmdCgwLCBzZXApO1xuICAgIG1zLmFwcGVuZExlZnQoMCwgYWRkaXRpb25hbERhdGEpO1xuICAgIGNvbnN0IG1hcCA9IG1zLmdlbmVyYXRlTWFwKHsgaGlyZXM6IHRydWUgfSk7XG4gICAgbWFwLmZpbGUgPSBmaWxlbmFtZTtcbiAgICBtYXAuc291cmNlcyA9IFtmaWxlbmFtZV07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogbXMudG9TdHJpbmcoKSxcbiAgICAgICAgbWFwLFxuICAgIH07XG59XG5jb25zdCBwcmVQcm9jZXNzb3JzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgW1wibGVzc1wiIC8qIFByZXByb2Nlc3NMYW5nLmxlc3MgKi9dOiBsZXNzLFxuICAgIFtcInNhc3NcIiAvKiBQcmVwcm9jZXNzTGFuZy5zYXNzICovXTogc2FzcyxcbiAgICBbXCJzY3NzXCIgLyogUHJlcHJvY2Vzc0xhbmcuc2NzcyAqL106IHNjc3MsXG4gICAgW1wic3R5bFwiIC8qIFByZXByb2Nlc3NMYW5nLnN0eWwgKi9dOiBzdHlsLFxuICAgIFtcInN0eWx1c1wiIC8qIFByZXByb2Nlc3NMYW5nLnN0eWx1cyAqL106IHN0eWwsXG59KTtcbmZ1bmN0aW9uIGlzUHJlUHJvY2Vzc29yKGxhbmcpIHtcbiAgICByZXR1cm4gbGFuZyAmJiBsYW5nIGluIHByZVByb2Nlc3NvcnM7XG59XG5mdW5jdGlvbiBnZXRDc3NEaWFsZWN0KGxhbmcpIHtcbiAgICByZXR1cm4gbGFuZyA9PT0gJ3NzcycgPyAnc3NzJyA6ICdjc3MnO1xufVxuXG4vLyBBU1Qgd2Fsa2VyIG1vZHVsZSBmb3IgTW96aWxsYSBQYXJzZXIgQVBJIGNvbXBhdGlibGUgdHJlZXNcblxuZnVuY3Rpb24gbWFrZVRlc3QodGVzdCkge1xuICBpZiAodHlwZW9mIHRlc3QgPT09IFwic3RyaW5nXCIpXG4gICAgeyByZXR1cm4gZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHR5cGUgPT09IHRlc3Q7IH0gfVxuICBlbHNlIGlmICghdGVzdClcbiAgICB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9IH1cbiAgZWxzZVxuICAgIHsgcmV0dXJuIHRlc3QgfVxufVxuXG52YXIgRm91bmQgPSBmdW5jdGlvbiBGb3VuZChub2RlLCBzdGF0ZSkgeyB0aGlzLm5vZGUgPSBub2RlOyB0aGlzLnN0YXRlID0gc3RhdGU7IH07XG5cbi8vIEZpbmQgYSBub2RlIHdpdGggYSBnaXZlbiBzdGFydCwgZW5kLCBhbmQgdHlwZSAoYWxsIGFyZSBvcHRpb25hbCxcbi8vIG51bGwgY2FuIGJlIHVzZWQgYXMgd2lsZGNhcmQpLiBSZXR1cm5zIGEge25vZGUsIHN0YXRlfSBvYmplY3QsIG9yXG4vLyB1bmRlZmluZWQgd2hlbiBpdCBkb2Vzbid0IGZpbmQgYSBtYXRjaGluZyBub2RlLlxuZnVuY3Rpb24gZmluZE5vZGVBdChub2RlLCBzdGFydCwgZW5kLCB0ZXN0LCBiYXNlVmlzaXRvciwgc3RhdGUpIHtcbiAgaWYgKCFiYXNlVmlzaXRvcikgeyBiYXNlVmlzaXRvciA9IGJhc2U7IH1cbiAgdGVzdCA9IG1ha2VUZXN0KHRlc3QpO1xuICB0cnkge1xuICAgIChmdW5jdGlvbiBjKG5vZGUsIHN0LCBvdmVycmlkZSkge1xuICAgICAgdmFyIHR5cGUgPSBvdmVycmlkZSB8fCBub2RlLnR5cGU7XG4gICAgICBpZiAoKHN0YXJ0ID09IG51bGwgfHwgbm9kZS5zdGFydCA8PSBzdGFydCkgJiZcbiAgICAgICAgICAoZW5kID09IG51bGwgfHwgbm9kZS5lbmQgPj0gZW5kKSlcbiAgICAgICAgeyBiYXNlVmlzaXRvclt0eXBlXShub2RlLCBzdCwgYyk7IH1cbiAgICAgIGlmICgoc3RhcnQgPT0gbnVsbCB8fCBub2RlLnN0YXJ0ID09PSBzdGFydCkgJiZcbiAgICAgICAgICAoZW5kID09IG51bGwgfHwgbm9kZS5lbmQgPT09IGVuZCkgJiZcbiAgICAgICAgICB0ZXN0KHR5cGUsIG5vZGUpKVxuICAgICAgICB7IHRocm93IG5ldyBGb3VuZChub2RlLCBzdCkgfVxuICAgIH0pKG5vZGUsIHN0YXRlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgRm91bmQpIHsgcmV0dXJuIGUgfVxuICAgIHRocm93IGVcbiAgfVxufVxuXG5mdW5jdGlvbiBza2lwVGhyb3VnaChub2RlLCBzdCwgYykgeyBjKG5vZGUsIHN0KTsgfVxuZnVuY3Rpb24gaWdub3JlKF9ub2RlLCBfc3QsIF9jKSB7fVxuXG4vLyBOb2RlIHdhbGtlcnMuXG5cbnZhciBiYXNlID0ge307XG5cbmJhc2UuUHJvZ3JhbSA9IGJhc2UuQmxvY2tTdGF0ZW1lbnQgPSBiYXNlLlN0YXRpY0Jsb2NrID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gbm9kZS5ib2R5OyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSlcbiAgICB7XG4gICAgdmFyIHN0bXQgPSBsaXN0W2ldO1xuXG4gICAgYyhzdG10LCBzdCwgXCJTdGF0ZW1lbnRcIik7XG4gIH1cbn07XG5iYXNlLlN0YXRlbWVudCA9IHNraXBUaHJvdWdoO1xuYmFzZS5FbXB0eVN0YXRlbWVudCA9IGlnbm9yZTtcbmJhc2UuRXhwcmVzc2lvblN0YXRlbWVudCA9IGJhc2UuUGFyZW50aGVzaXplZEV4cHJlc3Npb24gPSBiYXNlLkNoYWluRXhwcmVzc2lvbiA9XG4gIGZ1bmN0aW9uIChub2RlLCBzdCwgYykgeyByZXR1cm4gYyhub2RlLmV4cHJlc3Npb24sIHN0LCBcIkV4cHJlc3Npb25cIik7IH07XG5iYXNlLklmU3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7XG4gIGMobm9kZS50ZXN0LCBzdCwgXCJFeHByZXNzaW9uXCIpO1xuICBjKG5vZGUuY29uc2VxdWVudCwgc3QsIFwiU3RhdGVtZW50XCIpO1xuICBpZiAobm9kZS5hbHRlcm5hdGUpIHsgYyhub2RlLmFsdGVybmF0ZSwgc3QsIFwiU3RhdGVtZW50XCIpOyB9XG59O1xuYmFzZS5MYWJlbGVkU3RhdGVtZW50ID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7IHJldHVybiBjKG5vZGUuYm9keSwgc3QsIFwiU3RhdGVtZW50XCIpOyB9O1xuYmFzZS5CcmVha1N0YXRlbWVudCA9IGJhc2UuQ29udGludWVTdGF0ZW1lbnQgPSBpZ25vcmU7XG5iYXNlLldpdGhTdGF0ZW1lbnQgPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgYyhub2RlLm9iamVjdCwgc3QsIFwiRXhwcmVzc2lvblwiKTtcbiAgYyhub2RlLmJvZHksIHN0LCBcIlN0YXRlbWVudFwiKTtcbn07XG5iYXNlLlN3aXRjaFN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBjKG5vZGUuZGlzY3JpbWluYW50LCBzdCwgXCJFeHByZXNzaW9uXCIpO1xuICBmb3IgKHZhciBpJDEgPSAwLCBsaXN0JDEgPSBub2RlLmNhc2VzOyBpJDEgPCBsaXN0JDEubGVuZ3RoOyBpJDEgKz0gMSkge1xuICAgIHZhciBjcyA9IGxpc3QkMVtpJDFdO1xuXG4gICAgaWYgKGNzLnRlc3QpIHsgYyhjcy50ZXN0LCBzdCwgXCJFeHByZXNzaW9uXCIpOyB9XG4gICAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBjcy5jb25zZXF1ZW50OyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSlcbiAgICAgIHtcbiAgICAgIHZhciBjb25zID0gbGlzdFtpXTtcblxuICAgICAgYyhjb25zLCBzdCwgXCJTdGF0ZW1lbnRcIik7XG4gICAgfVxuICB9XG59O1xuYmFzZS5Td2l0Y2hDYXNlID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7XG4gIGlmIChub2RlLnRlc3QpIHsgYyhub2RlLnRlc3QsIHN0LCBcIkV4cHJlc3Npb25cIik7IH1cbiAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBub2RlLmNvbnNlcXVlbnQ7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgIHtcbiAgICB2YXIgY29ucyA9IGxpc3RbaV07XG5cbiAgICBjKGNvbnMsIHN0LCBcIlN0YXRlbWVudFwiKTtcbiAgfVxufTtcbmJhc2UuUmV0dXJuU3RhdGVtZW50ID0gYmFzZS5ZaWVsZEV4cHJlc3Npb24gPSBiYXNlLkF3YWl0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBpZiAobm9kZS5hcmd1bWVudCkgeyBjKG5vZGUuYXJndW1lbnQsIHN0LCBcIkV4cHJlc3Npb25cIik7IH1cbn07XG5iYXNlLlRocm93U3RhdGVtZW50ID0gYmFzZS5TcHJlYWRFbGVtZW50ID1cbiAgZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7IHJldHVybiBjKG5vZGUuYXJndW1lbnQsIHN0LCBcIkV4cHJlc3Npb25cIik7IH07XG5iYXNlLlRyeVN0YXRlbWVudCA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBjKG5vZGUuYmxvY2ssIHN0LCBcIlN0YXRlbWVudFwiKTtcbiAgaWYgKG5vZGUuaGFuZGxlcikgeyBjKG5vZGUuaGFuZGxlciwgc3QpOyB9XG4gIGlmIChub2RlLmZpbmFsaXplcikgeyBjKG5vZGUuZmluYWxpemVyLCBzdCwgXCJTdGF0ZW1lbnRcIik7IH1cbn07XG5iYXNlLkNhdGNoQ2xhdXNlID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7XG4gIGlmIChub2RlLnBhcmFtKSB7IGMobm9kZS5wYXJhbSwgc3QsIFwiUGF0dGVyblwiKTsgfVxuICBjKG5vZGUuYm9keSwgc3QsIFwiU3RhdGVtZW50XCIpO1xufTtcbmJhc2UuV2hpbGVTdGF0ZW1lbnQgPSBiYXNlLkRvV2hpbGVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgYyhub2RlLnRlc3QsIHN0LCBcIkV4cHJlc3Npb25cIik7XG4gIGMobm9kZS5ib2R5LCBzdCwgXCJTdGF0ZW1lbnRcIik7XG59O1xuYmFzZS5Gb3JTdGF0ZW1lbnQgPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgaWYgKG5vZGUuaW5pdCkgeyBjKG5vZGUuaW5pdCwgc3QsIFwiRm9ySW5pdFwiKTsgfVxuICBpZiAobm9kZS50ZXN0KSB7IGMobm9kZS50ZXN0LCBzdCwgXCJFeHByZXNzaW9uXCIpOyB9XG4gIGlmIChub2RlLnVwZGF0ZSkgeyBjKG5vZGUudXBkYXRlLCBzdCwgXCJFeHByZXNzaW9uXCIpOyB9XG4gIGMobm9kZS5ib2R5LCBzdCwgXCJTdGF0ZW1lbnRcIik7XG59O1xuYmFzZS5Gb3JJblN0YXRlbWVudCA9IGJhc2UuRm9yT2ZTdGF0ZW1lbnQgPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgYyhub2RlLmxlZnQsIHN0LCBcIkZvckluaXRcIik7XG4gIGMobm9kZS5yaWdodCwgc3QsIFwiRXhwcmVzc2lvblwiKTtcbiAgYyhub2RlLmJvZHksIHN0LCBcIlN0YXRlbWVudFwiKTtcbn07XG5iYXNlLkZvckluaXQgPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpIHsgYyhub2RlLCBzdCk7IH1cbiAgZWxzZSB7IGMobm9kZSwgc3QsIFwiRXhwcmVzc2lvblwiKTsgfVxufTtcbmJhc2UuRGVidWdnZXJTdGF0ZW1lbnQgPSBpZ25vcmU7XG5cbmJhc2UuRnVuY3Rpb25EZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykgeyByZXR1cm4gYyhub2RlLCBzdCwgXCJGdW5jdGlvblwiKTsgfTtcbmJhc2UuVmFyaWFibGVEZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IG5vZGUuZGVjbGFyYXRpb25zOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSlcbiAgICB7XG4gICAgdmFyIGRlY2wgPSBsaXN0W2ldO1xuXG4gICAgYyhkZWNsLCBzdCk7XG4gIH1cbn07XG5iYXNlLlZhcmlhYmxlRGVjbGFyYXRvciA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBjKG5vZGUuaWQsIHN0LCBcIlBhdHRlcm5cIik7XG4gIGlmIChub2RlLmluaXQpIHsgYyhub2RlLmluaXQsIHN0LCBcIkV4cHJlc3Npb25cIik7IH1cbn07XG5cbmJhc2UuRnVuY3Rpb24gPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgaWYgKG5vZGUuaWQpIHsgYyhub2RlLmlkLCBzdCwgXCJQYXR0ZXJuXCIpOyB9XG4gIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gbm9kZS5wYXJhbXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgIHtcbiAgICB2YXIgcGFyYW0gPSBsaXN0W2ldO1xuXG4gICAgYyhwYXJhbSwgc3QsIFwiUGF0dGVyblwiKTtcbiAgfVxuICBjKG5vZGUuYm9keSwgc3QsIG5vZGUuZXhwcmVzc2lvbiA/IFwiRXhwcmVzc2lvblwiIDogXCJTdGF0ZW1lbnRcIik7XG59O1xuXG5iYXNlLlBhdHRlcm4gPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpXG4gICAgeyBjKG5vZGUsIHN0LCBcIlZhcmlhYmxlUGF0dGVyblwiKTsgfVxuICBlbHNlIGlmIChub2RlLnR5cGUgPT09IFwiTWVtYmVyRXhwcmVzc2lvblwiKVxuICAgIHsgYyhub2RlLCBzdCwgXCJNZW1iZXJQYXR0ZXJuXCIpOyB9XG4gIGVsc2VcbiAgICB7IGMobm9kZSwgc3QpOyB9XG59O1xuYmFzZS5WYXJpYWJsZVBhdHRlcm4gPSBpZ25vcmU7XG5iYXNlLk1lbWJlclBhdHRlcm4gPSBza2lwVGhyb3VnaDtcbmJhc2UuUmVzdEVsZW1lbnQgPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHsgcmV0dXJuIGMobm9kZS5hcmd1bWVudCwgc3QsIFwiUGF0dGVyblwiKTsgfTtcbmJhc2UuQXJyYXlQYXR0ZXJuID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gbm9kZS5lbGVtZW50czsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgZWx0ID0gbGlzdFtpXTtcblxuICAgIGlmIChlbHQpIHsgYyhlbHQsIHN0LCBcIlBhdHRlcm5cIik7IH1cbiAgfVxufTtcbmJhc2UuT2JqZWN0UGF0dGVybiA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IG5vZGUucHJvcGVydGllczsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgcHJvcCA9IGxpc3RbaV07XG5cbiAgICBpZiAocHJvcC50eXBlID09PSBcIlByb3BlcnR5XCIpIHtcbiAgICAgIGlmIChwcm9wLmNvbXB1dGVkKSB7IGMocHJvcC5rZXksIHN0LCBcIkV4cHJlc3Npb25cIik7IH1cbiAgICAgIGMocHJvcC52YWx1ZSwgc3QsIFwiUGF0dGVyblwiKTtcbiAgICB9IGVsc2UgaWYgKHByb3AudHlwZSA9PT0gXCJSZXN0RWxlbWVudFwiKSB7XG4gICAgICBjKHByb3AuYXJndW1lbnQsIHN0LCBcIlBhdHRlcm5cIik7XG4gICAgfVxuICB9XG59O1xuXG5iYXNlLkV4cHJlc3Npb24gPSBza2lwVGhyb3VnaDtcbmJhc2UuVGhpc0V4cHJlc3Npb24gPSBiYXNlLlN1cGVyID0gYmFzZS5NZXRhUHJvcGVydHkgPSBpZ25vcmU7XG5iYXNlLkFycmF5RXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IG5vZGUuZWxlbWVudHM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGVsdCA9IGxpc3RbaV07XG5cbiAgICBpZiAoZWx0KSB7IGMoZWx0LCBzdCwgXCJFeHByZXNzaW9uXCIpOyB9XG4gIH1cbn07XG5iYXNlLk9iamVjdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGxpc3QgPSBub2RlLnByb3BlcnRpZXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgIHtcbiAgICB2YXIgcHJvcCA9IGxpc3RbaV07XG5cbiAgICBjKHByb3AsIHN0KTtcbiAgfVxufTtcbmJhc2UuRnVuY3Rpb25FeHByZXNzaW9uID0gYmFzZS5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiA9IGJhc2UuRnVuY3Rpb25EZWNsYXJhdGlvbjtcbmJhc2UuU2VxdWVuY2VFeHByZXNzaW9uID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gbm9kZS5leHByZXNzaW9uczsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpXG4gICAge1xuICAgIHZhciBleHByID0gbGlzdFtpXTtcblxuICAgIGMoZXhwciwgc3QsIFwiRXhwcmVzc2lvblwiKTtcbiAgfVxufTtcbmJhc2UuVGVtcGxhdGVMaXRlcmFsID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsaXN0ID0gbm9kZS5xdWFzaXM7IGkgPCBsaXN0Lmxlbmd0aDsgaSArPSAxKVxuICAgIHtcbiAgICB2YXIgcXVhc2kgPSBsaXN0W2ldO1xuXG4gICAgYyhxdWFzaSwgc3QpO1xuICB9XG5cbiAgZm9yICh2YXIgaSQxID0gMCwgbGlzdCQxID0gbm9kZS5leHByZXNzaW9uczsgaSQxIDwgbGlzdCQxLmxlbmd0aDsgaSQxICs9IDEpXG4gICAge1xuICAgIHZhciBleHByID0gbGlzdCQxW2kkMV07XG5cbiAgICBjKGV4cHIsIHN0LCBcIkV4cHJlc3Npb25cIik7XG4gIH1cbn07XG5iYXNlLlRlbXBsYXRlRWxlbWVudCA9IGlnbm9yZTtcbmJhc2UuVW5hcnlFeHByZXNzaW9uID0gYmFzZS5VcGRhdGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7XG4gIGMobm9kZS5hcmd1bWVudCwgc3QsIFwiRXhwcmVzc2lvblwiKTtcbn07XG5iYXNlLkJpbmFyeUV4cHJlc3Npb24gPSBiYXNlLkxvZ2ljYWxFeHByZXNzaW9uID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7XG4gIGMobm9kZS5sZWZ0LCBzdCwgXCJFeHByZXNzaW9uXCIpO1xuICBjKG5vZGUucmlnaHQsIHN0LCBcIkV4cHJlc3Npb25cIik7XG59O1xuYmFzZS5Bc3NpZ25tZW50RXhwcmVzc2lvbiA9IGJhc2UuQXNzaWdubWVudFBhdHRlcm4gPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgYyhub2RlLmxlZnQsIHN0LCBcIlBhdHRlcm5cIik7XG4gIGMobm9kZS5yaWdodCwgc3QsIFwiRXhwcmVzc2lvblwiKTtcbn07XG5iYXNlLkNvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBjKG5vZGUudGVzdCwgc3QsIFwiRXhwcmVzc2lvblwiKTtcbiAgYyhub2RlLmNvbnNlcXVlbnQsIHN0LCBcIkV4cHJlc3Npb25cIik7XG4gIGMobm9kZS5hbHRlcm5hdGUsIHN0LCBcIkV4cHJlc3Npb25cIik7XG59O1xuYmFzZS5OZXdFeHByZXNzaW9uID0gYmFzZS5DYWxsRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBjKG5vZGUuY2FsbGVlLCBzdCwgXCJFeHByZXNzaW9uXCIpO1xuICBpZiAobm9kZS5hcmd1bWVudHMpXG4gICAgeyBmb3IgKHZhciBpID0gMCwgbGlzdCA9IG5vZGUuYXJndW1lbnRzOyBpIDwgbGlzdC5sZW5ndGg7IGkgKz0gMSlcbiAgICAgIHtcbiAgICAgICAgdmFyIGFyZyA9IGxpc3RbaV07XG5cbiAgICAgICAgYyhhcmcsIHN0LCBcIkV4cHJlc3Npb25cIik7XG4gICAgICB9IH1cbn07XG5iYXNlLk1lbWJlckV4cHJlc3Npb24gPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgYyhub2RlLm9iamVjdCwgc3QsIFwiRXhwcmVzc2lvblwiKTtcbiAgaWYgKG5vZGUuY29tcHV0ZWQpIHsgYyhub2RlLnByb3BlcnR5LCBzdCwgXCJFeHByZXNzaW9uXCIpOyB9XG59O1xuYmFzZS5FeHBvcnROYW1lZERlY2xhcmF0aW9uID0gYmFzZS5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb24gPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgaWYgKG5vZGUuZGVjbGFyYXRpb24pXG4gICAgeyBjKG5vZGUuZGVjbGFyYXRpb24sIHN0LCBub2RlLnR5cGUgPT09IFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiIHx8IG5vZGUuZGVjbGFyYXRpb24uaWQgPyBcIlN0YXRlbWVudFwiIDogXCJFeHByZXNzaW9uXCIpOyB9XG4gIGlmIChub2RlLnNvdXJjZSkgeyBjKG5vZGUuc291cmNlLCBzdCwgXCJFeHByZXNzaW9uXCIpOyB9XG59O1xuYmFzZS5FeHBvcnRBbGxEZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBpZiAobm9kZS5leHBvcnRlZClcbiAgICB7IGMobm9kZS5leHBvcnRlZCwgc3QpOyB9XG4gIGMobm9kZS5zb3VyY2UsIHN0LCBcIkV4cHJlc3Npb25cIik7XG59O1xuYmFzZS5JbXBvcnREZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IG5vZGUuc3BlY2lmaWVyczsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpXG4gICAge1xuICAgIHZhciBzcGVjID0gbGlzdFtpXTtcblxuICAgIGMoc3BlYywgc3QpO1xuICB9XG4gIGMobm9kZS5zb3VyY2UsIHN0LCBcIkV4cHJlc3Npb25cIik7XG59O1xuYmFzZS5JbXBvcnRFeHByZXNzaW9uID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7XG4gIGMobm9kZS5zb3VyY2UsIHN0LCBcIkV4cHJlc3Npb25cIik7XG59O1xuYmFzZS5JbXBvcnRTcGVjaWZpZXIgPSBiYXNlLkltcG9ydERlZmF1bHRTcGVjaWZpZXIgPSBiYXNlLkltcG9ydE5hbWVzcGFjZVNwZWNpZmllciA9IGJhc2UuSWRlbnRpZmllciA9IGJhc2UuUHJpdmF0ZUlkZW50aWZpZXIgPSBiYXNlLkxpdGVyYWwgPSBpZ25vcmU7XG5cbmJhc2UuVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKG5vZGUsIHN0LCBjKSB7XG4gIGMobm9kZS50YWcsIHN0LCBcIkV4cHJlc3Npb25cIik7XG4gIGMobm9kZS5xdWFzaSwgc3QsIFwiRXhwcmVzc2lvblwiKTtcbn07XG5iYXNlLkNsYXNzRGVjbGFyYXRpb24gPSBiYXNlLkNsYXNzRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykgeyByZXR1cm4gYyhub2RlLCBzdCwgXCJDbGFzc1wiKTsgfTtcbmJhc2UuQ2xhc3MgPSBmdW5jdGlvbiAobm9kZSwgc3QsIGMpIHtcbiAgaWYgKG5vZGUuaWQpIHsgYyhub2RlLmlkLCBzdCwgXCJQYXR0ZXJuXCIpOyB9XG4gIGlmIChub2RlLnN1cGVyQ2xhc3MpIHsgYyhub2RlLnN1cGVyQ2xhc3MsIHN0LCBcIkV4cHJlc3Npb25cIik7IH1cbiAgYyhub2RlLmJvZHksIHN0KTtcbn07XG5iYXNlLkNsYXNzQm9keSA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBmb3IgKHZhciBpID0gMCwgbGlzdCA9IG5vZGUuYm9keTsgaSA8IGxpc3QubGVuZ3RoOyBpICs9IDEpXG4gICAge1xuICAgIHZhciBlbHQgPSBsaXN0W2ldO1xuXG4gICAgYyhlbHQsIHN0KTtcbiAgfVxufTtcbmJhc2UuTWV0aG9kRGVmaW5pdGlvbiA9IGJhc2UuUHJvcGVydHlEZWZpbml0aW9uID0gYmFzZS5Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChub2RlLCBzdCwgYykge1xuICBpZiAobm9kZS5jb21wdXRlZCkgeyBjKG5vZGUua2V5LCBzdCwgXCJFeHByZXNzaW9uXCIpOyB9XG4gIGlmIChub2RlLnZhbHVlKSB7IGMobm9kZS52YWx1ZSwgc3QsIFwiRXhwcmVzc2lvblwiKTsgfVxufTtcblxuY29uc3QgeyBpc01hdGNoOiBpc01hdGNoJDEsIHNjYW4gfSA9IG1pY3JvbWF0Y2hfMTtcbmZ1bmN0aW9uIGdldEFmZmVjdGVkR2xvYk1vZHVsZXMoZmlsZSwgc2VydmVyKSB7XG4gICAgY29uc3QgbW9kdWxlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2lkLCBhbGxHbG9ic10gb2Ygc2VydmVyLl9pbXBvcnRHbG9iTWFwKSB7XG4gICAgICAgIGlmIChhbGxHbG9icy5zb21lKChnbG9iKSA9PiBpc01hdGNoJDEoZmlsZSwgZ2xvYikpKVxuICAgICAgICAgICAgbW9kdWxlcy5wdXNoKC4uLihzZXJ2ZXIubW9kdWxlR3JhcGguZ2V0TW9kdWxlc0J5RmlsZShpZCkgfHwgW10pKTtcbiAgICB9XG4gICAgbW9kdWxlcy5mb3JFYWNoKChpKSA9PiB7XG4gICAgICAgIGlmIChpPy5maWxlKVxuICAgICAgICAgICAgc2VydmVyLm1vZHVsZUdyYXBoLm9uRmlsZUNoYW5nZShpLmZpbGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBtb2R1bGVzO1xufVxuZnVuY3Rpb24gaW1wb3J0R2xvYlBsdWdpbihjb25maWcpIHtcbiAgICBsZXQgc2VydmVyO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmltcG9ydC1nbG9iJyxcbiAgICAgICAgY29uZmlndXJlU2VydmVyKF9zZXJ2ZXIpIHtcbiAgICAgICAgICAgIHNlcnZlciA9IF9zZXJ2ZXI7XG4gICAgICAgICAgICBzZXJ2ZXIuX2ltcG9ydEdsb2JNYXAuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICAgICAgICBpZiAoIWNvZGUuaW5jbHVkZXMoJ2ltcG9ydC5tZXRhLmdsb2InKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1HbG9iSW1wb3J0KGNvZGUsIGlkLCBjb25maWcucm9vdCwgKGltKSA9PiB0aGlzLnJlc29sdmUoaW0sIGlkKS50aGVuKChpKSA9PiBpPy5pZCB8fCBpbSksIGNvbmZpZy5pc1Byb2R1Y3Rpb24sIGNvbmZpZy5leHBlcmltZW50YWwuaW1wb3J0R2xvYlJlc3RvcmVFeHRlbnNpb24pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsR2xvYnMgPSByZXN1bHQubWF0Y2hlcy5tYXAoKGkpID0+IGkuZ2xvYnNSZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgICAgIHNlcnZlci5faW1wb3J0R2xvYk1hcC5zZXQoaWQsIGFsbEdsb2JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVN0YWJsZVJlc3VsdChyZXN1bHQucywgaWQsIGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmNvbnN0IGltcG9ydEdsb2JSRSA9IC9cXGJpbXBvcnRcXC5tZXRhXFwuKGdsb2J8Z2xvYkVhZ2VyfGdsb2JFYWdlckRlZmF1bHQpKD86PFxcdys+KT9cXHMqXFwoL2c7XG5jb25zdCBrbm93bk9wdGlvbnMgPSB7XG4gICAgYXM6IFsnc3RyaW5nJ10sXG4gICAgZWFnZXI6IFsnYm9vbGVhbiddLFxuICAgIGltcG9ydDogWydzdHJpbmcnXSxcbiAgICBleGhhdXN0aXZlOiBbJ2Jvb2xlYW4nXSxcbiAgICBxdWVyeTogWydvYmplY3QnLCAnc3RyaW5nJ10sXG59O1xuY29uc3QgZm9yY2VEZWZhdWx0QXMgPSBbJ3JhdycsICd1cmwnXTtcbmZ1bmN0aW9uIGVyciQxKGUsIHBvcykge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGUpO1xuICAgIGVycm9yLnBvcyA9IHBvcztcbiAgICByZXR1cm4gZXJyb3I7XG59XG5mdW5jdGlvbiBwYXJzZUdsb2JPcHRpb25zKHJhd09wdHMsIG9wdHNTdGFydEluZGV4KSB7XG4gICAgbGV0IG9wdHMgPSB7fTtcbiAgICB0cnkge1xuICAgICAgICBvcHRzID0gZXZhbFZhbHVlKHJhd09wdHMpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHRocm93IGVyciQxKCdWaXRlIGlzIHVuYWJsZSB0byBwYXJzZSB0aGUgZ2xvYiBvcHRpb25zIGFzIHRoZSB2YWx1ZSBpcyBub3Qgc3RhdGljJywgb3B0c1N0YXJ0SW5kZXgpO1xuICAgIH1cbiAgICBpZiAob3B0cyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3B0cykge1xuICAgICAgICBpZiAoIShrZXkgaW4ga25vd25PcHRpb25zKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyJDEoYFVua25vd24gZ2xvYiBvcHRpb24gXCIke2tleX1cImAsIG9wdHNTdGFydEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSBrbm93bk9wdGlvbnNba2V5XTtcbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gdHlwZW9mIG9wdHNba2V5XTtcbiAgICAgICAgaWYgKCFhbGxvd2VkVHlwZXMuaW5jbHVkZXModmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyJDEoYEV4cGVjdGVkIGdsb2Igb3B0aW9uIFwiJHtrZXl9XCIgdG8gYmUgb2YgdHlwZSAke2FsbG93ZWRUeXBlcy5qb2luKCcgb3IgJyl9LCBidXQgZ290ICR7dmFsdWVUeXBlfWAsIG9wdHNTdGFydEluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMucXVlcnkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9wdHMucXVlcnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3B0cy5xdWVyeVtrZXldO1xuICAgICAgICAgICAgaWYgKCFbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnIkMShgRXhwZWN0ZWQgZ2xvYiBvcHRpb24gXCJxdWVyeS4ke2tleX1cIiB0byBiZSBvZiB0eXBlIHN0cmluZywgbnVtYmVyLCBvciBib29sZWFuLCBidXQgZ290ICR7dHlwZW9mIHZhbHVlfWAsIG9wdHNTdGFydEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0cy5hcyAmJiBmb3JjZURlZmF1bHRBcy5pbmNsdWRlcyhvcHRzLmFzKSkge1xuICAgICAgICBpZiAob3B0cy5pbXBvcnQgJiYgb3B0cy5pbXBvcnQgIT09ICdkZWZhdWx0JyAmJiBvcHRzLmltcG9ydCAhPT0gJyonKVxuICAgICAgICAgICAgdGhyb3cgZXJyJDEoYE9wdGlvbiBcImltcG9ydFwiIGNhbiBvbmx5IGJlIFwiZGVmYXVsdFwiIG9yIFwiKlwiIHdoZW4gXCJhc1wiIGlzIFwiJHtvcHRzLmFzfVwiLCBidXQgZ290IFwiJHtvcHRzLmltcG9ydH1cImAsIG9wdHNTdGFydEluZGV4KTtcbiAgICAgICAgb3B0cy5pbXBvcnQgPSBvcHRzLmltcG9ydCB8fCAnZGVmYXVsdCc7XG4gICAgfVxuICAgIGlmIChvcHRzLmFzICYmIG9wdHMucXVlcnkpXG4gICAgICAgIHRocm93IGVyciQxKCdPcHRpb25zIFwiYXNcIiBhbmQgXCJxdWVyeVwiIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyJywgb3B0c1N0YXJ0SW5kZXgpO1xuICAgIGlmIChvcHRzLmFzKVxuICAgICAgICBvcHRzLnF1ZXJ5ID0gb3B0cy5hcztcbiAgICByZXR1cm4gb3B0cztcbn1cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlSW1wb3J0R2xvYihjb2RlLCBpbXBvcnRlciwgcm9vdCwgcmVzb2x2ZUlkKSB7XG4gICAgbGV0IGNsZWFuQ29kZTtcbiAgICB0cnkge1xuICAgICAgICBjbGVhbkNvZGUgPSBzdHJpcExpdGVyYWwoY29kZSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHNraXAgaW52YWxpZCBqcyBjb2RlXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hlcyA9IEFycmF5LmZyb20oY2xlYW5Db2RlLm1hdGNoQWxsKGltcG9ydEdsb2JSRSkpO1xuICAgIGNvbnN0IHRhc2tzID0gbWF0Y2hlcy5tYXAoYXN5bmMgKG1hdGNoLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gbWF0Y2hbMV07XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbWF0Y2guaW5kZXg7XG4gICAgICAgIGNvbnN0IGVyciA9IChtc2cpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgRXJyb3IoYEludmFsaWQgZ2xvYiBpbXBvcnQgc3ludGF4OiAke21zZ31gKTtcbiAgICAgICAgICAgIGUucG9zID0gc3RhcnQ7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGFzdDtcbiAgICAgICAgbGV0IGxhc3RUb2tlblBvcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFzdCA9IHBhcnNlRXhwcmVzc2lvbkF0KGNvZGUsIHN0YXJ0LCB7XG4gICAgICAgICAgICAgICAgZWNtYVZlcnNpb246ICdsYXRlc3QnLFxuICAgICAgICAgICAgICAgIHNvdXJjZVR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgICAgICAgIHJhbmdlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvblRva2VuOiAodG9rZW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFRva2VuUG9zID0gdG9rZW4uZW5kO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc3QgX2UgPSBlO1xuICAgICAgICAgICAgaWYgKF9lLm1lc3NhZ2UgJiYgX2UubWVzc2FnZS5zdGFydHNXaXRoKCdVbnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50JykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChsYXN0VG9rZW5Qb3MgPT0gbnVsbCB8fCBsYXN0VG9rZW5Qb3MgPD0gc3RhcnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgX2U7XG4gICAgICAgICAgICAvLyB0YWlsaW5nIGNvbW1hIGluIG9iamVjdCBvciBhcnJheSB3aWxsIG1ha2UgdGhlIHBhcnNlciB0aGluayBpdCdzIGEgY29tbWEgb3BlcmF0aW9uXG4gICAgICAgICAgICAvLyB3ZSB0cnkgdG8gcGFyc2UgYWdhaW4gcmVtb3ZpbmcgdGhlIGNvbW1hXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IGNvZGUuc2xpY2Uoc3RhcnQsIGxhc3RUb2tlblBvcykucmVwbGFjZSgvWyxcXHNdKiQvLCAnJyk7XG4gICAgICAgICAgICAgICAgYXN0ID0gcGFyc2VFeHByZXNzaW9uQXQoJyAnLnJlcGVhdChzdGFydCkgKyBzdGF0ZW1lbnQsIC8vIHRvIGtlZXAgdGhlIGFzdCBwb3NpdGlvblxuICAgICAgICAgICAgICAgIHN0YXJ0LCB7XG4gICAgICAgICAgICAgICAgICAgIGVjbWFWZXJzaW9uOiAnbGF0ZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlVHlwZTogJ21vZHVsZScsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBfZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3VuZCA9IGZpbmROb2RlQXQoYXN0LCBzdGFydCwgdW5kZWZpbmVkLCAnQ2FsbEV4cHJlc3Npb24nKTtcbiAgICAgICAgaWYgKCFmb3VuZClcbiAgICAgICAgICAgIHRocm93IGVycihgRXhwZWN0IENhbGxFeHByZXNzaW9uLCBnb3QgJHthc3QudHlwZX1gKTtcbiAgICAgICAgYXN0ID0gZm91bmQubm9kZTtcbiAgICAgICAgaWYgKGFzdC5hcmd1bWVudHMubGVuZ3RoIDwgMSB8fCBhc3QuYXJndW1lbnRzLmxlbmd0aCA+IDIpXG4gICAgICAgICAgICB0aHJvdyBlcnIoYEV4cGVjdGVkIDEtMiBhcmd1bWVudHMsIGJ1dCBnb3QgJHthc3QuYXJndW1lbnRzLmxlbmd0aH1gKTtcbiAgICAgICAgY29uc3QgYXJnMSA9IGFzdC5hcmd1bWVudHNbMF07XG4gICAgICAgIGNvbnN0IGFyZzIgPSBhc3QuYXJndW1lbnRzWzFdO1xuICAgICAgICBjb25zdCBnbG9icyA9IFtdO1xuICAgICAgICBjb25zdCB2YWxpZGF0ZUxpdGVyYWwgPSAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdMaXRlcmFsJykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycihgRXhwZWN0ZWQgZ2xvYiB0byBiZSBhIHN0cmluZywgYnV0IGdvdCBcIiR7dHlwZW9mIGVsZW1lbnQudmFsdWV9XCJgKTtcbiAgICAgICAgICAgICAgICBnbG9icy5wdXNoKGVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC50eXBlID09PSAnVGVtcGxhdGVMaXRlcmFsJykge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmV4cHJlc3Npb25zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnIoYEV4cGVjdGVkIGdsb2IgdG8gYmUgYSBzdHJpbmcsIGJ1dCBnb3QgZHluYW1pYyB0ZW1wbGF0ZSBsaXRlcmFsYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdsb2JzLnB1c2goZWxlbWVudC5xdWFzaXNbMF0udmFsdWUucmF3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGVycignQ291bGQgb25seSB1c2UgbGl0ZXJhbHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGFyZzEudHlwZSA9PT0gJ0FycmF5RXhwcmVzc2lvbicpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcmcxLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGVMaXRlcmFsKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsaWRhdGVMaXRlcmFsKGFyZzEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFyZzJcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKGFyZzIpIHtcbiAgICAgICAgICAgIGlmIChhcmcyLnR5cGUgIT09ICdPYmplY3RFeHByZXNzaW9uJylcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnIoYEV4cGVjdGVkIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0IGxpdGVyYWwsIGJ1dCBnb3QgXCIke2FyZzIudHlwZX1cImApO1xuICAgICAgICAgICAgb3B0aW9ucyA9IHBhcnNlR2xvYk9wdGlvbnMoY29kZS5zbGljZShhcmcyLnJhbmdlWzBdLCBhcmcyLnJhbmdlWzFdKSwgYXJnMi5yYW5nZVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kID0gYXN0LnJhbmdlWzFdO1xuICAgICAgICBjb25zdCBnbG9ic1Jlc29sdmVkID0gYXdhaXQgUHJvbWlzZS5hbGwoZ2xvYnMubWFwKChnbG9iKSA9PiB0b0Fic29sdXRlR2xvYihnbG9iLCByb290LCBpbXBvcnRlciwgcmVzb2x2ZUlkKSkpO1xuICAgICAgICBjb25zdCBpc1JlbGF0aXZlID0gZ2xvYnMuZXZlcnkoKGkpID0+ICcuIScuaW5jbHVkZXMoaVswXSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWF0Y2gsXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGdsb2JzLFxuICAgICAgICAgICAgZ2xvYnNSZXNvbHZlZCxcbiAgICAgICAgICAgIGlzUmVsYXRpdmUsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiAoYXdhaXQgUHJvbWlzZS5hbGwodGFza3MpKS5maWx0ZXIoQm9vbGVhbik7XG59XG5jb25zdCBpbXBvcnRQcmVmaXggPSAnX192aXRlX2dsb2JfJztcbmNvbnN0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIHJlbGF0aXZlLCBqb2luIH0gPSBwb3NpeCQxO1xuY29uc3Qgd2FybmVkQ1NTRGVmYXVsdEltcG9ydFZhck5hbWUgPSAnX192aXRlX3dhcm5lZF9jc3NfZGVmYXVsdF9pbXBvcnQnO1xuY29uc3QganNvblN0cmluZ2lmeUluT25lbGluZSA9IChpbnB1dCkgPT4gSlNPTi5zdHJpbmdpZnkoaW5wdXQpLnJlcGxhY2UoL1t7LDpdL2csICckJiAnKS5yZXBsYWNlKC9cXH0vZywgJyB9Jyk7XG5jb25zdCBjcmVhdGVDc3NEZWZhdWx0SW1wb3J0V2FybmluZyA9IChnbG9icywgb3B0aW9ucykgPT4gYGlmICghJHt3YXJuZWRDU1NEZWZhdWx0SW1wb3J0VmFyTmFtZX0pIHtgICtcbiAgICBgJHt3YXJuZWRDU1NEZWZhdWx0SW1wb3J0VmFyTmFtZX0gPSB0cnVlO2AgK1xuICAgIGBjb25zb2xlLndhcm4oJHtKU09OLnN0cmluZ2lmeSgnRGVmYXVsdCBpbXBvcnQgb2YgQ1NTIHdpdGhvdXQgYD9pbmxpbmVgIGlzIGRlcHJlY2F0ZWQuICcgK1xuICAgICAgICBcIkFkZCB0aGUgYHsgcXVlcnk6ICc/aW5saW5lJyB9YCBnbG9iIG9wdGlvbiB0byBmaXggdGhpcy5cXG5cIiArXG4gICAgICAgIGBGb3IgZXhhbXBsZTogXFxgaW1wb3J0Lm1ldGEuZ2xvYigke2pzb25TdHJpbmdpZnlJbk9uZWxpbmUoZ2xvYnMubGVuZ3RoID09PSAxID8gZ2xvYnNbMF0gOiBnbG9icyl9LCAke2pzb25TdHJpbmdpZnlJbk9uZWxpbmUoeyAuLi5vcHRpb25zLCBxdWVyeTogJz9pbmxpbmUnIH0pfSlcXGBgKX0pO2AgK1xuICAgIGB9YDtcbi8qKlxuICogQHBhcmFtIG9wdGltaXplRXhwb3J0IGZvciBkeW5hbWljSW1wb3J0VmFyIHBsdWdpbiBkb24ndCBuZWVkIHRvIG9wdGltaXplIGV4cG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdHJhbnNmb3JtR2xvYkltcG9ydChjb2RlLCBpZCwgcm9vdCwgcmVzb2x2ZUlkLCBpc1Byb2R1Y3Rpb24sIHJlc3RvcmVRdWVyeUV4dGVuc2lvbiA9IGZhbHNlKSB7XG4gICAgaWQgPSBzbGFzaCQxKGlkKTtcbiAgICByb290ID0gc2xhc2gkMShyb290KTtcbiAgICBjb25zdCBpc1ZpcnR1YWwgPSBpc1ZpcnR1YWxNb2R1bGUoaWQpO1xuICAgIGNvbnN0IGRpciA9IGlzVmlydHVhbCA/IHVuZGVmaW5lZCA6IGRpcm5hbWUoaWQpO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBhd2FpdCBwYXJzZUltcG9ydEdsb2IoY29kZSwgaXNWaXJ0dWFsID8gdW5kZWZpbmVkIDogaWQsIHJvb3QsIHJlc29sdmVJZCk7XG4gICAgY29uc3QgbWF0Y2hlZEZpbGVzID0gbmV3IFNldCgpO1xuICAgIC8vIFRPRE86IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgbWF0Y2hlcy5mb3JFYWNoKChpKSA9PiB7XG4gICAgICAgIGlmIChpLnR5cGUgPT09ICdnbG9iRWFnZXInKVxuICAgICAgICAgICAgaS5vcHRpb25zLmVhZ2VyID0gdHJ1ZTtcbiAgICAgICAgaWYgKGkudHlwZSA9PT0gJ2dsb2JFYWdlckRlZmF1bHQnKSB7XG4gICAgICAgICAgICBpLm9wdGlvbnMuZWFnZXIgPSB0cnVlO1xuICAgICAgICAgICAgaS5vcHRpb25zLmltcG9ydCA9ICdkZWZhdWx0JztcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghbWF0Y2hlcy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHMgPSBuZXcgTWFnaWNTdHJpbmcoY29kZSk7XG4gICAgY29uc3Qgc3RhdGljSW1wb3J0cyA9IChhd2FpdCBQcm9taXNlLmFsbChtYXRjaGVzLm1hcChhc3luYyAoeyBnbG9icywgZ2xvYnNSZXNvbHZlZCwgaXNSZWxhdGl2ZSwgb3B0aW9ucywgaW5kZXgsIHN0YXJ0LCBlbmQsIH0pID0+IHtcbiAgICAgICAgY29uc3QgY3dkID0gZ2V0Q29tbW9uQmFzZShnbG9ic1Jlc29sdmVkKSA/PyByb290O1xuICAgICAgICBjb25zdCBmaWxlcyA9IChhd2FpdCBvdXQoZ2xvYnNSZXNvbHZlZCwge1xuICAgICAgICAgICAgY3dkLFxuICAgICAgICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICAgICAgICBkb3Q6ICEhb3B0aW9ucy5leGhhdXN0aXZlLFxuICAgICAgICAgICAgaWdub3JlOiBvcHRpb25zLmV4aGF1c3RpdmVcbiAgICAgICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICAgICAgOiBbam9pbihjd2QsICcqKi9ub2RlX21vZHVsZXMvKionKV0sXG4gICAgICAgIH0pKVxuICAgICAgICAgICAgLmZpbHRlcigoZmlsZSkgPT4gZmlsZSAhPT0gaWQpXG4gICAgICAgICAgICAuc29ydCgpO1xuICAgICAgICBjb25zdCBvYmplY3RQcm9wcyA9IFtdO1xuICAgICAgICBjb25zdCBzdGF0aWNJbXBvcnRzID0gW107XG4gICAgICAgIGxldCBxdWVyeSA9ICFvcHRpb25zLnF1ZXJ5XG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IHR5cGVvZiBvcHRpb25zLnF1ZXJ5ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5xdWVyeVxuICAgICAgICAgICAgICAgIDogc3RyaW5naWZ5UXVlcnkob3B0aW9ucy5xdWVyeSk7XG4gICAgICAgIGlmIChxdWVyeSAmJiAhcXVlcnkuc3RhcnRzV2l0aCgnPycpKVxuICAgICAgICAgICAgcXVlcnkgPSBgPyR7cXVlcnl9YDtcbiAgICAgICAgY29uc3QgcmVzb2x2ZVBhdGhzID0gKGZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmICghZGlyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVsYXRpdmUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluIHZpcnR1YWwgbW9kdWxlcywgYWxsIGdsb2JzIG11c3Qgc3RhcnQgd2l0aCAnLydcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBgLyR7cmVsYXRpdmUocm9vdCwgZmlsZSl9YDtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBmaWxlUGF0aCwgaW1wb3J0UGF0aDogZmlsZVBhdGggfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpbXBvcnRQYXRoID0gcmVsYXRpdmUoZGlyLCBmaWxlKTtcbiAgICAgICAgICAgIGlmICghaW1wb3J0UGF0aC5zdGFydHNXaXRoKCcuJykpXG4gICAgICAgICAgICAgICAgaW1wb3J0UGF0aCA9IGAuLyR7aW1wb3J0UGF0aH1gO1xuICAgICAgICAgICAgbGV0IGZpbGVQYXRoO1xuICAgICAgICAgICAgaWYgKGlzUmVsYXRpdmUpIHtcbiAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IGltcG9ydFBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IHJlbGF0aXZlKHJvb3QsIGZpbGUpO1xuICAgICAgICAgICAgICAgIGlmICghZmlsZVBhdGguc3RhcnRzV2l0aCgnLicpKVxuICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IGAvJHtmaWxlUGF0aH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZmlsZVBhdGgsIGltcG9ydFBhdGggfTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGluY2x1ZGVzQ1NTID0gZmFsc2U7XG4gICAgICAgIGZpbGVzLmZvckVhY2goKGZpbGUsIGkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gcmVzb2x2ZVBhdGhzKGZpbGUpO1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRocy5maWxlUGF0aDtcbiAgICAgICAgICAgIGxldCBpbXBvcnRQYXRoID0gcGF0aHMuaW1wb3J0UGF0aDtcbiAgICAgICAgICAgIGxldCBpbXBvcnRRdWVyeSA9IHF1ZXJ5O1xuICAgICAgICAgICAgaWYgKGltcG9ydFF1ZXJ5ICYmIGltcG9ydFF1ZXJ5ICE9PSAnP3JhdycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gYmFzZW5hbWUoZmlsZSkuc3BsaXQoJy4nKS5zbGljZSgtMSlbMF07XG4gICAgICAgICAgICAgICAgaWYgKGZpbGVFeHRlbnNpb24gJiYgcmVzdG9yZVF1ZXJ5RXh0ZW5zaW9uKVxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRRdWVyeSA9IGAke2ltcG9ydFF1ZXJ5fSZsYW5nLiR7ZmlsZUV4dGVuc2lvbn1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW1wb3J0UGF0aCA9IGAke2ltcG9ydFBhdGh9JHtpbXBvcnRRdWVyeX1gO1xuICAgICAgICAgICAgY29uc3QgaXNDU1MgPSAhcXVlcnkgJiYgaXNDU1NSZXF1ZXN0KGZpbGUpICYmICFpc01vZHVsZUNTU1JlcXVlc3QoZmlsZSk7XG4gICAgICAgICAgICBpbmNsdWRlc0NTUyB8fCAoaW5jbHVkZXNDU1MgPSBpc0NTUyk7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnRLZXkgPSBvcHRpb25zLmltcG9ydCAmJiBvcHRpb25zLmltcG9ydCAhPT0gJyonXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLmltcG9ydFxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZWFnZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YXJpYWJsZU5hbWUgPSBgJHtpbXBvcnRQcmVmaXh9JHtpbmRleH1fJHtpfWA7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGltcG9ydEtleVxuICAgICAgICAgICAgICAgICAgICA/IGB7ICR7aW1wb3J0S2V5fSBhcyAke3ZhcmlhYmxlTmFtZX0gfWBcbiAgICAgICAgICAgICAgICAgICAgOiBgKiBhcyAke3ZhcmlhYmxlTmFtZX1gO1xuICAgICAgICAgICAgICAgIHN0YXRpY0ltcG9ydHMucHVzaChgaW1wb3J0ICR7ZXhwcmVzc2lvbn0gZnJvbSAke0pTT04uc3RyaW5naWZ5KGltcG9ydFBhdGgpfWApO1xuICAgICAgICAgICAgICAgIGlmICghaXNQcm9kdWN0aW9uICYmIGlzQ1NTKSB7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdFByb3BzLnB1c2goYGdldCAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0oKSB7ICR7Y3JlYXRlQ3NzRGVmYXVsdEltcG9ydFdhcm5pbmcoZ2xvYnMsIG9wdGlvbnMpfSByZXR1cm4gJHt2YXJpYWJsZU5hbWV9IH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdFByb3BzLnB1c2goYCR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfTogJHt2YXJpYWJsZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydFN0YXRlbWVudCA9IGBpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pYDtcbiAgICAgICAgICAgICAgICBpZiAoaW1wb3J0S2V5KVxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRTdGF0ZW1lbnQgKz0gYC50aGVuKG0gPT4gbVske0pTT04uc3RyaW5naWZ5KGltcG9ydEtleSl9XSlgO1xuICAgICAgICAgICAgICAgIGlmICghaXNQcm9kdWN0aW9uICYmIGlzQ1NTKSB7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdFByb3BzLnB1c2goYCR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfTogKCkgPT4geyAke2NyZWF0ZUNzc0RlZmF1bHRJbXBvcnRXYXJuaW5nKGdsb2JzLCBvcHRpb25zKX0gcmV0dXJuICR7aW1wb3J0U3RhdGVtZW50fX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdFByb3BzLnB1c2goYCR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfTogKCkgPT4gJHtpbXBvcnRTdGF0ZW1lbnR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZmlsZXMuZm9yRWFjaCgoaSkgPT4gbWF0Y2hlZEZpbGVzLmFkZChpKSk7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsTGluZUJyZWFrQ291bnQgPSBjb2RlLnNsaWNlKHN0YXJ0LCBlbmQpLm1hdGNoKC9cXG4vZyk/Lmxlbmd0aCA/PyAwO1xuICAgICAgICBjb25zdCBsaW5lQnJlYWtzID0gb3JpZ2luYWxMaW5lQnJlYWtDb3VudCA+IDBcbiAgICAgICAgICAgID8gJ1xcbicucmVwZWF0KG9yaWdpbmFsTGluZUJyZWFrQ291bnQpXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICBsZXQgcmVwbGFjZW1lbnQ7XG4gICAgICAgIGlmICghaXNQcm9kdWN0aW9uICYmIGluY2x1ZGVzQ1NTKSB7XG4gICAgICAgICAgICByZXBsYWNlbWVudCA9XG4gICAgICAgICAgICAgICAgJy8qICNfX1BVUkVfXyAqLyBPYmplY3QuYXNzaWduKCcgK1xuICAgICAgICAgICAgICAgICAgICAnKCgpID0+IHsnICtcbiAgICAgICAgICAgICAgICAgICAgYGxldCAke3dhcm5lZENTU0RlZmF1bHRJbXBvcnRWYXJOYW1lfSA9IGZhbHNlO2AgK1xuICAgICAgICAgICAgICAgICAgICBgcmV0dXJuIHske29iamVjdFByb3BzLmpvaW4oJywnKX0ke2xpbmVCcmVha3N9fTtgICtcbiAgICAgICAgICAgICAgICAgICAgJ30pKCknICtcbiAgICAgICAgICAgICAgICAgICAgJyknO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBgLyogI19fUFVSRV9fICovIE9iamVjdC5hc3NpZ24oeyR7b2JqZWN0UHJvcHMuam9pbignLCcpfSR7bGluZUJyZWFrc319KWA7XG4gICAgICAgIH1cbiAgICAgICAgcy5vdmVyd3JpdGUoc3RhcnQsIGVuZCwgcmVwbGFjZW1lbnQpO1xuICAgICAgICByZXR1cm4gc3RhdGljSW1wb3J0cztcbiAgICB9KSkpLmZsYXQoKTtcbiAgICBpZiAoc3RhdGljSW1wb3J0cy5sZW5ndGgpXG4gICAgICAgIHMucHJlcGVuZChgJHtzdGF0aWNJbXBvcnRzLmpvaW4oJzsnKX07YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcyxcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgZmlsZXM6IG1hdGNoZWRGaWxlcyxcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2xvYlNhZmVQYXRoKHBhdGgpIHtcbiAgICAvLyBzbGFzaCBwYXRoIHRvIGVuc3VyZSBcXCBpcyBjb252ZXJ0ZWQgdG8gLyBhcyBcXCBjb3VsZCBsZWFkIHRvIGEgZG91YmxlIGVzY2FwZSBzY2VuYXJpb1xuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXJtbG5jL2Zhc3QtZ2xvYiNhZHZhbmNlZC1zeW50YXhcbiAgICByZXR1cm4gb3V0LmVzY2FwZVBhdGgobm9ybWFsaXplUGF0aCQzKHBhdGgpKTtcbn1cbmZ1bmN0aW9uIGxhc3ROdGhDaGFyKHN0ciwgbikge1xuICAgIHJldHVybiBzdHIuY2hhckF0KHN0ci5sZW5ndGggLSAxIC0gbik7XG59XG5mdW5jdGlvbiBnbG9iU2FmZVJlc29sdmVkUGF0aChyZXNvbHZlZCwgZ2xvYikge1xuICAgIC8vIHdlIGhhdmUgdG8gZXNjYXBlIHNwZWNpYWwgZ2xvYiBjaGFyYWN0ZXJzIGluIHRoZSByZXNvbHZlZCBwYXRoLCBidXQga2VlcCB0aGUgdXNlciBzcGVjaWZpZWQgZ2xvYmJ5IHN1ZmZpeFxuICAgIC8vIHdhbGsgYmFjayBib3RoIHN0cmluZ3MgdW50aWwgYSBjaGFyYWN0ZXIgZGlmZmVyZW5jZSBpcyBmb3VuZFxuICAgIC8vIHRoZW4gc2xpY2UgdXAgdGhlIHJlc29sdmVkIHBhdGggYXQgdGhhdCBwb3MgYW5kIGVzY2FwZSB0aGUgZmlyc3QgcGFydFxuICAgIGxldCBudW1FcXVhbCA9IDA7XG4gICAgY29uc3QgbWF4RXF1YWwgPSBNYXRoLm1pbihyZXNvbHZlZC5sZW5ndGgsIGdsb2IubGVuZ3RoKTtcbiAgICB3aGlsZSAobnVtRXF1YWwgPCBtYXhFcXVhbCAmJlxuICAgICAgICBsYXN0TnRoQ2hhcihyZXNvbHZlZCwgbnVtRXF1YWwpID09PSBsYXN0TnRoQ2hhcihnbG9iLCBudW1FcXVhbCkpIHtcbiAgICAgICAgbnVtRXF1YWwgKz0gMTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGljUGFydEVuZCA9IHJlc29sdmVkLmxlbmd0aCAtIG51bUVxdWFsO1xuICAgIGNvbnN0IHN0YXRpY1BhcnQgPSByZXNvbHZlZC5zbGljZSgwLCBzdGF0aWNQYXJ0RW5kKTtcbiAgICBjb25zdCBkeW5hbWljUGFydCA9IHJlc29sdmVkLnNsaWNlKHN0YXRpY1BhcnRFbmQpO1xuICAgIHJldHVybiBnbG9iU2FmZVBhdGgoc3RhdGljUGFydCkgKyBkeW5hbWljUGFydDtcbn1cbmFzeW5jIGZ1bmN0aW9uIHRvQWJzb2x1dGVHbG9iKGdsb2IsIHJvb3QsIGltcG9ydGVyLCByZXNvbHZlSWQpIHtcbiAgICBsZXQgcHJlID0gJyc7XG4gICAgaWYgKGdsb2Iuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIHByZSA9ICchJztcbiAgICAgICAgZ2xvYiA9IGdsb2Iuc2xpY2UoMSk7XG4gICAgfVxuICAgIHJvb3QgPSBnbG9iU2FmZVBhdGgocm9vdCk7XG4gICAgY29uc3QgZGlyID0gaW1wb3J0ZXIgPyBnbG9iU2FmZVBhdGgoZGlybmFtZShpbXBvcnRlcikpIDogcm9vdDtcbiAgICBpZiAoZ2xvYi5zdGFydHNXaXRoKCcvJykpXG4gICAgICAgIHJldHVybiBwcmUgKyBwb3NpeCQxLmpvaW4ocm9vdCwgZ2xvYi5zbGljZSgxKSk7XG4gICAgaWYgKGdsb2Iuc3RhcnRzV2l0aCgnLi8nKSlcbiAgICAgICAgcmV0dXJuIHByZSArIHBvc2l4JDEuam9pbihkaXIsIGdsb2Iuc2xpY2UoMikpO1xuICAgIGlmIChnbG9iLnN0YXJ0c1dpdGgoJy4uLycpKVxuICAgICAgICByZXR1cm4gcHJlICsgcG9zaXgkMS5qb2luKGRpciwgZ2xvYik7XG4gICAgaWYgKGdsb2Iuc3RhcnRzV2l0aCgnKionKSlcbiAgICAgICAgcmV0dXJuIHByZSArIGdsb2I7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBub3JtYWxpemVQYXRoJDMoKGF3YWl0IHJlc29sdmVJZChnbG9iLCBpbXBvcnRlcikpIHx8IGdsb2IpO1xuICAgIGlmIChpc0Fic29sdXRlJDIocmVzb2x2ZWQpKSB7XG4gICAgICAgIHJldHVybiBwcmUgKyBnbG9iU2FmZVJlc29sdmVkUGF0aChyZXNvbHZlZCwgZ2xvYik7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnbG9iOiBcIiR7Z2xvYn1cIiAocmVzb2x2ZWQ6IFwiJHtyZXNvbHZlZH1cIikuIEl0IG11c3Qgc3RhcnQgd2l0aCAnLycgb3IgJy4vJ2ApO1xufVxuZnVuY3Rpb24gZ2V0Q29tbW9uQmFzZShnbG9ic1Jlc29sdmVkKSB7XG4gICAgY29uc3QgYmFzZXMgPSBnbG9ic1Jlc29sdmVkXG4gICAgICAgIC5maWx0ZXIoKGcpID0+ICFnLnN0YXJ0c1dpdGgoJyEnKSlcbiAgICAgICAgLm1hcCgoZ2xvYikgPT4ge1xuICAgICAgICBsZXQgeyBiYXNlIH0gPSBzY2FuKGdsb2IpO1xuICAgICAgICAvLyBgc2NhbignYS9mb28uanMnKWAgcmV0dXJucyBgYmFzZTogJ2EvZm9vLmpzJ2BcbiAgICAgICAgaWYgKHBvc2l4JDEuYmFzZW5hbWUoYmFzZSkuaW5jbHVkZXMoJy4nKSlcbiAgICAgICAgICAgIGJhc2UgPSBwb3NpeCQxLmRpcm5hbWUoYmFzZSk7XG4gICAgICAgIHJldHVybiBiYXNlO1xuICAgIH0pO1xuICAgIGlmICghYmFzZXMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgY29tbW9uQW5jZXN0b3IgPSAnJztcbiAgICBjb25zdCBkaXJTID0gYmFzZXNbMF0uc3BsaXQoJy8nKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpclMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gZGlyUy5zbGljZSgwLCBpICsgMSkuam9pbignLycpO1xuICAgICAgICBpZiAoYmFzZXMuZXZlcnkoKGJhc2UpID0+IGJhc2Uuc3RhcnRzV2l0aChjYW5kaWRhdGUpKSlcbiAgICAgICAgICAgIGNvbW1vbkFuY2VzdG9yID0gY2FuZGlkYXRlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKCFjb21tb25BbmNlc3RvcilcbiAgICAgICAgY29tbW9uQW5jZXN0b3IgPSAnLyc7XG4gICAgcmV0dXJuIGNvbW1vbkFuY2VzdG9yO1xufVxuZnVuY3Rpb24gaXNWaXJ0dWFsTW9kdWxlKGlkKSB7XG4gICAgLy8gaHR0cHM6Ly92aXRlanMuZGV2L2d1aWRlL2FwaS1wbHVnaW4uaHRtbCN2aXJ0dWFsLW1vZHVsZXMtY29udmVudGlvblxuICAgIHJldHVybiBpZC5zdGFydHNXaXRoKCd2aXJ0dWFsOicpIHx8IGlkLnN0YXJ0c1dpdGgoJ1xcMCcpIHx8ICFpZC5pbmNsdWRlcygnLycpO1xufVxuXG5jb25zdCBkZWJ1Z0htciA9IGNyZWF0ZURlYnVnZ2VyKCd2aXRlOmhtcicpO1xuY29uc3Qgbm9ybWFsaXplZENsaWVudERpciA9IG5vcm1hbGl6ZVBhdGgkMyhDTElFTlRfRElSKTtcbmZ1bmN0aW9uIGdldFNob3J0TmFtZShmaWxlLCByb290KSB7XG4gICAgcmV0dXJuIGZpbGUuc3RhcnRzV2l0aChyb290ICsgJy8nKSA/IHBhdGgkby5wb3NpeC5yZWxhdGl2ZShyb290LCBmaWxlKSA6IGZpbGU7XG59XG5hc3luYyBmdW5jdGlvbiBoYW5kbGVITVJVcGRhdGUoZmlsZSwgc2VydmVyLCBjb25maWdPbmx5KSB7XG4gICAgY29uc3QgeyB3cywgY29uZmlnLCBtb2R1bGVHcmFwaCB9ID0gc2VydmVyO1xuICAgIGNvbnN0IHNob3J0RmlsZSA9IGdldFNob3J0TmFtZShmaWxlLCBjb25maWcucm9vdCk7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoJG8uYmFzZW5hbWUoZmlsZSk7XG4gICAgY29uc3QgaXNDb25maWcgPSBmaWxlID09PSBjb25maWcuY29uZmlnRmlsZTtcbiAgICBjb25zdCBpc0NvbmZpZ0RlcGVuZGVuY3kgPSBjb25maWcuY29uZmlnRmlsZURlcGVuZGVuY2llcy5zb21lKChuYW1lKSA9PiBmaWxlID09PSBuYW1lKTtcbiAgICBjb25zdCBpc0VudiA9IGNvbmZpZy5pbmxpbmVDb25maWcuZW52RmlsZSAhPT0gZmFsc2UgJiZcbiAgICAgICAgKGZpbGVOYW1lID09PSAnLmVudicgfHwgZmlsZU5hbWUuc3RhcnRzV2l0aCgnLmVudi4nKSk7XG4gICAgaWYgKGlzQ29uZmlnIHx8IGlzQ29uZmlnRGVwZW5kZW5jeSB8fCBpc0Vudikge1xuICAgICAgICAvLyBhdXRvIHJlc3RhcnQgc2VydmVyXG4gICAgICAgIGRlYnVnSG1yKGBbY29uZmlnIGNoYW5nZV0gJHtwaWNvY29sb3JzRXhwb3J0cy5kaW0oc2hvcnRGaWxlKX1gKTtcbiAgICAgICAgY29uZmlnLmxvZ2dlci5pbmZvKHBpY29jb2xvcnNFeHBvcnRzLmdyZWVuKGAke3BhdGgkby5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlKX0gY2hhbmdlZCwgcmVzdGFydGluZyBzZXJ2ZXIuLi5gKSwgeyBjbGVhcjogdHJ1ZSwgdGltZXN0YW1wOiB0cnVlIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgc2VydmVyLnJlc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5lcnJvcihwaWNvY29sb3JzRXhwb3J0cy5yZWQoZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbmZpZ09ubHkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1Z0htcihgW2ZpbGUgY2hhbmdlXSAke3BpY29jb2xvcnNFeHBvcnRzLmRpbShzaG9ydEZpbGUpfWApO1xuICAgIC8vIChkZXYgb25seSkgdGhlIGNsaWVudCBpdHNlbGYgY2Fubm90IGJlIGhvdCB1cGRhdGVkLlxuICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgobm9ybWFsaXplZENsaWVudERpcikpIHtcbiAgICAgICAgd3Muc2VuZCh7XG4gICAgICAgICAgICB0eXBlOiAnZnVsbC1yZWxvYWQnLFxuICAgICAgICAgICAgcGF0aDogJyonLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RzID0gbW9kdWxlR3JhcGguZ2V0TW9kdWxlc0J5RmlsZShmaWxlKTtcbiAgICAvLyBjaGVjayBpZiBhbnkgcGx1Z2luIHdhbnRzIHRvIHBlcmZvcm0gY3VzdG9tIEhNUiBoYW5kbGluZ1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaG1yQ29udGV4dCA9IHtcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICBtb2R1bGVzOiBtb2RzID8gWy4uLm1vZHNdIDogW10sXG4gICAgICAgIHJlYWQ6ICgpID0+IHJlYWRNb2RpZmllZEZpbGUoZmlsZSksXG4gICAgICAgIHNlcnZlcixcbiAgICB9O1xuICAgIGZvciAoY29uc3QgaG9vayBvZiBjb25maWcuZ2V0U29ydGVkUGx1Z2luSG9va3MoJ2hhbmRsZUhvdFVwZGF0ZScpKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkTW9kdWxlcyA9IGF3YWl0IGhvb2soaG1yQ29udGV4dCk7XG4gICAgICAgIGlmIChmaWx0ZXJlZE1vZHVsZXMpIHtcbiAgICAgICAgICAgIGhtckNvbnRleHQubW9kdWxlcyA9IGZpbHRlcmVkTW9kdWxlcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhtckNvbnRleHQubW9kdWxlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gaHRtbCBmaWxlIGNhbm5vdCBiZSBob3QgdXBkYXRlZFxuICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgnLmh0bWwnKSkge1xuICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5pbmZvKHBpY29jb2xvcnNFeHBvcnRzLmdyZWVuKGBwYWdlIHJlbG9hZCBgKSArIHBpY29jb2xvcnNFeHBvcnRzLmRpbShzaG9ydEZpbGUpLCB7XG4gICAgICAgICAgICAgICAgY2xlYXI6IHRydWUsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3cy5zZW5kKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZnVsbC1yZWxvYWQnLFxuICAgICAgICAgICAgICAgIHBhdGg6IGNvbmZpZy5zZXJ2ZXIubWlkZGxld2FyZU1vZGVcbiAgICAgICAgICAgICAgICAgICAgPyAnKidcbiAgICAgICAgICAgICAgICAgICAgOiAnLycgKyBub3JtYWxpemVQYXRoJDMocGF0aCRvLnJlbGF0aXZlKGNvbmZpZy5yb290LCBmaWxlKSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxvYWRlZCBidXQgbm90IGluIHRoZSBtb2R1bGUgZ3JhcGgsIHByb2JhYmx5IG5vdCBqc1xuICAgICAgICAgICAgZGVidWdIbXIoYFtubyBtb2R1bGVzIG1hdGNoZWRdICR7cGljb2NvbG9yc0V4cG9ydHMuZGltKHNob3J0RmlsZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1cGRhdGVNb2R1bGVzKHNob3J0RmlsZSwgaG1yQ29udGV4dC5tb2R1bGVzLCB0aW1lc3RhbXAsIHNlcnZlcik7XG59XG5mdW5jdGlvbiB1cGRhdGVNb2R1bGVzKGZpbGUsIG1vZHVsZXMsIHRpbWVzdGFtcCwgeyBjb25maWcsIHdzLCBtb2R1bGVHcmFwaCB9LCBhZnRlckludmFsaWRhdGlvbikge1xuICAgIGNvbnN0IHVwZGF0ZXMgPSBbXTtcbiAgICBjb25zdCBpbnZhbGlkYXRlZE1vZHVsZXMgPSBuZXcgU2V0KCk7XG4gICAgbGV0IG5lZWRGdWxsUmVsb2FkID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBtb2Qgb2YgbW9kdWxlcykge1xuICAgICAgICBtb2R1bGVHcmFwaC5pbnZhbGlkYXRlTW9kdWxlKG1vZCwgaW52YWxpZGF0ZWRNb2R1bGVzLCB0aW1lc3RhbXAsIHRydWUpO1xuICAgICAgICBpZiAobmVlZEZ1bGxSZWxvYWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJvdW5kYXJpZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGNvbnN0IGhhc0RlYWRFbmQgPSBwcm9wYWdhdGVVcGRhdGUobW9kLCBib3VuZGFyaWVzKTtcbiAgICAgICAgaWYgKGhhc0RlYWRFbmQpIHtcbiAgICAgICAgICAgIG5lZWRGdWxsUmVsb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZXMucHVzaCguLi5bLi4uYm91bmRhcmllc10ubWFwKCh7IGJvdW5kYXJ5LCBhY2NlcHRlZFZpYSB9KSA9PiAoe1xuICAgICAgICAgICAgdHlwZTogYCR7Ym91bmRhcnkudHlwZX0tdXBkYXRlYCxcbiAgICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgICAgIHBhdGg6IG5vcm1hbGl6ZUhtclVybChib3VuZGFyeS51cmwpLFxuICAgICAgICAgICAgZXhwbGljaXRJbXBvcnRSZXF1aXJlZDogYm91bmRhcnkudHlwZSA9PT0gJ2pzJ1xuICAgICAgICAgICAgICAgID8gaXNFeHBsaWNpdEltcG9ydFJlcXVpcmVkKGFjY2VwdGVkVmlhLnVybClcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFjY2VwdGVkUGF0aDogbm9ybWFsaXplSG1yVXJsKGFjY2VwdGVkVmlhLnVybCksXG4gICAgICAgIH0pKSk7XG4gICAgfVxuICAgIGlmIChuZWVkRnVsbFJlbG9hZCkge1xuICAgICAgICBjb25maWcubG9nZ2VyLmluZm8ocGljb2NvbG9yc0V4cG9ydHMuZ3JlZW4oYHBhZ2UgcmVsb2FkIGApICsgcGljb2NvbG9yc0V4cG9ydHMuZGltKGZpbGUpLCB7XG4gICAgICAgICAgICBjbGVhcjogIWFmdGVySW52YWxpZGF0aW9uLFxuICAgICAgICAgICAgdGltZXN0YW1wOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgd3Muc2VuZCh7XG4gICAgICAgICAgICB0eXBlOiAnZnVsbC1yZWxvYWQnLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodXBkYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVidWdIbXIocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KGBubyB1cGRhdGUgaGFwcGVuZWQgYCkgKyBwaWNvY29sb3JzRXhwb3J0cy5kaW0oZmlsZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbmZpZy5sb2dnZXIuaW5mbyhwaWNvY29sb3JzRXhwb3J0cy5ncmVlbihgaG1yIHVwZGF0ZSBgKSArXG4gICAgICAgIHBpY29jb2xvcnNFeHBvcnRzLmRpbShbLi4ubmV3IFNldCh1cGRhdGVzLm1hcCgodSkgPT4gdS5wYXRoKSldLmpvaW4oJywgJykpLCB7IGNsZWFyOiAhYWZ0ZXJJbnZhbGlkYXRpb24sIHRpbWVzdGFtcDogdHJ1ZSB9KTtcbiAgICB3cy5zZW5kKHtcbiAgICAgICAgdHlwZTogJ3VwZGF0ZScsXG4gICAgICAgIHVwZGF0ZXMsXG4gICAgfSk7XG59XG5hc3luYyBmdW5jdGlvbiBoYW5kbGVGaWxlQWRkVW5saW5rKGZpbGUsIHNlcnZlcikge1xuICAgIGNvbnN0IG1vZHVsZXMgPSBbLi4uKHNlcnZlci5tb2R1bGVHcmFwaC5nZXRNb2R1bGVzQnlGaWxlKGZpbGUpIHx8IFtdKV07XG4gICAgbW9kdWxlcy5wdXNoKC4uLmdldEFmZmVjdGVkR2xvYk1vZHVsZXMoZmlsZSwgc2VydmVyKSk7XG4gICAgaWYgKG1vZHVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB1cGRhdGVNb2R1bGVzKGdldFNob3J0TmFtZShmaWxlLCBzZXJ2ZXIuY29uZmlnLnJvb3QpLCB1bmlxdWUobW9kdWxlcyksIERhdGUubm93KCksIHNlcnZlcik7XG4gICAgfVxufVxuZnVuY3Rpb24gYXJlQWxsSW1wb3J0c0FjY2VwdGVkKGltcG9ydGVkQmluZGluZ3MsIGFjY2VwdGVkRXhwb3J0cykge1xuICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBpbXBvcnRlZEJpbmRpbmdzKSB7XG4gICAgICAgIGlmICghYWNjZXB0ZWRFeHBvcnRzLmhhcyhiaW5kaW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcHJvcGFnYXRlVXBkYXRlKG5vZGUsIGJvdW5kYXJpZXMsIGN1cnJlbnRDaGFpbiA9IFtub2RlXSkge1xuICAgIC8vICM3NTYxXG4gICAgLy8gaWYgdGhlIGltcG9ydHMgb2YgYG5vZGVgIGhhdmUgbm90IGJlZW4gYW5hbHl6ZWQsIHRoZW4gYG5vZGVgIGhhcyBub3RcbiAgICAvLyBiZWVuIGxvYWRlZCBpbiB0aGUgYnJvd3NlciBhbmQgd2Ugc2hvdWxkIHN0b3AgcHJvcGFnYXRpb24uXG4gICAgaWYgKG5vZGUuaWQgJiYgbm9kZS5pc1NlbGZBY2NlcHRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWJ1Z0htcihgW3Byb3BhZ2F0ZSB1cGRhdGVdIHN0b3AgcHJvcGFnYXRpb24gYmVjYXVzZSBub3QgYW5hbHl6ZWQ6ICR7cGljb2NvbG9yc0V4cG9ydHMuZGltKG5vZGUuaWQpfWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChub2RlLmlzU2VsZkFjY2VwdGluZykge1xuICAgICAgICBib3VuZGFyaWVzLmFkZCh7XG4gICAgICAgICAgICBib3VuZGFyeTogbm9kZSxcbiAgICAgICAgICAgIGFjY2VwdGVkVmlhOiBub2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gYWRkaXRpb25hbGx5IGNoZWNrIGZvciBDU1MgaW1wb3J0ZXJzLCBzaW5jZSBhIFBvc3RDU1MgcGx1Z2luIGxpa2VcbiAgICAgICAgLy8gVGFpbHdpbmQgSklUIG1heSByZWdpc3RlciBhbnkgZmlsZSBhcyBhIGRlcGVuZGVuY3kgdG8gYSBDU1MgZmlsZS5cbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRlciBvZiBub2RlLmltcG9ydGVycykge1xuICAgICAgICAgICAgaWYgKGlzQ1NTUmVxdWVzdChpbXBvcnRlci51cmwpICYmICFjdXJyZW50Q2hhaW4uaW5jbHVkZXMoaW1wb3J0ZXIpKSB7XG4gICAgICAgICAgICAgICAgcHJvcGFnYXRlVXBkYXRlKGltcG9ydGVyLCBib3VuZGFyaWVzLCBjdXJyZW50Q2hhaW4uY29uY2F0KGltcG9ydGVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBBIHBhcnRpYWxseSBhY2NlcHRlZCBtb2R1bGUgd2l0aCBubyBpbXBvcnRlcnMgaXMgY29uc2lkZXJlZCBzZWxmIGFjY2VwdGluZyxcbiAgICAvLyBiZWNhdXNlIHRoZSBkZWFsIGlzIFwidGhlcmUgYXJlIHBhcnRzIG9mIG15c2VsZiBJIGNhbid0IHNlbGYgYWNjZXB0IGlmIHRoZXlcbiAgICAvLyBhcmUgdXNlZCBvdXRzaWRlIG9mIG1lXCIuXG4gICAgLy8gQWxzbywgdGhlIGltcG9ydGVkIG1vZHVsZSAodGhpcyBvbmUpIG11c3QgYmUgdXBkYXRlZCBiZWZvcmUgdGhlIGltcG9ydGVycyxcbiAgICAvLyBzbyB0aGF0IHRoZXkgZG8gZ2V0IHRoZSBmcmVzaCBpbXBvcnRlZCBtb2R1bGUgd2hlbi9pZiB0aGV5IGFyZSByZWxvYWRlZC5cbiAgICBpZiAobm9kZS5hY2NlcHRlZEhtckV4cG9ydHMpIHtcbiAgICAgICAgYm91bmRhcmllcy5hZGQoe1xuICAgICAgICAgICAgYm91bmRhcnk6IG5vZGUsXG4gICAgICAgICAgICBhY2NlcHRlZFZpYTogbm9kZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIW5vZGUuaW1wb3J0ZXJzLnNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vICMzNzE2LCAjMzkxM1xuICAgICAgICAvLyBGb3IgYSBub24tQ1NTIGZpbGUsIGlmIGFsbCBvZiBpdHMgaW1wb3J0ZXJzIGFyZSBDU1MgZmlsZXMgKHJlZ2lzdGVyZWQgdmlhXG4gICAgICAgIC8vIFBvc3RDU1MgcGx1Z2lucykgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBkZWFkIGVuZCBhbmQgZm9yY2UgZnVsbCByZWxvYWQuXG4gICAgICAgIGlmICghaXNDU1NSZXF1ZXN0KG5vZGUudXJsKSAmJlxuICAgICAgICAgICAgWy4uLm5vZGUuaW1wb3J0ZXJzXS5ldmVyeSgoaSkgPT4gaXNDU1NSZXF1ZXN0KGkudXJsKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgaW1wb3J0ZXIgb2Ygbm9kZS5pbXBvcnRlcnMpIHtcbiAgICAgICAgY29uc3Qgc3ViQ2hhaW4gPSBjdXJyZW50Q2hhaW4uY29uY2F0KGltcG9ydGVyKTtcbiAgICAgICAgaWYgKGltcG9ydGVyLmFjY2VwdGVkSG1yRGVwcy5oYXMobm9kZSkpIHtcbiAgICAgICAgICAgIGJvdW5kYXJpZXMuYWRkKHtcbiAgICAgICAgICAgICAgICBib3VuZGFyeTogaW1wb3J0ZXIsXG4gICAgICAgICAgICAgICAgYWNjZXB0ZWRWaWE6IG5vZGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlkICYmIG5vZGUuYWNjZXB0ZWRIbXJFeHBvcnRzICYmIGltcG9ydGVyLmltcG9ydGVkQmluZGluZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkQmluZGluZ3NGcm9tTm9kZSA9IGltcG9ydGVyLmltcG9ydGVkQmluZGluZ3MuZ2V0KG5vZGUuaWQpO1xuICAgICAgICAgICAgaWYgKGltcG9ydGVkQmluZGluZ3NGcm9tTm9kZSAmJlxuICAgICAgICAgICAgICAgIGFyZUFsbEltcG9ydHNBY2NlcHRlZChpbXBvcnRlZEJpbmRpbmdzRnJvbU5vZGUsIG5vZGUuYWNjZXB0ZWRIbXJFeHBvcnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50Q2hhaW4uaW5jbHVkZXMoaW1wb3J0ZXIpKSB7XG4gICAgICAgICAgICAvLyBjaXJjdWxhciBkZXBzIGlzIGNvbnNpZGVyZWQgZGVhZCBlbmRcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wYWdhdGVVcGRhdGUoaW1wb3J0ZXIsIGJvdW5kYXJpZXMsIHN1YkNoYWluKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFuZGxlUHJ1bmVkTW9kdWxlcyhtb2RzLCB7IHdzIH0pIHtcbiAgICAvLyB1cGRhdGUgdGhlIGRpc3Bvc2VkIG1vZHVsZXMnIGhtciB0aW1lc3RhbXBcbiAgICAvLyBzaW5jZSBpZiBpdCdzIHJlLWltcG9ydGVkLCBpdCBzaG91bGQgcmUtYXBwbHkgc2lkZSBlZmZlY3RzXG4gICAgLy8gYW5kIHdpdGhvdXQgdGhlIHRpbWVzdGFtcCB0aGUgYnJvd3NlciB3aWxsIG5vdCByZS1pbXBvcnQgaXQhXG4gICAgY29uc3QgdCA9IERhdGUubm93KCk7XG4gICAgbW9kcy5mb3JFYWNoKChtb2QpID0+IHtcbiAgICAgICAgbW9kLmxhc3RITVJUaW1lc3RhbXAgPSB0O1xuICAgICAgICBkZWJ1Z0htcihgW2Rpc3Bvc2VdICR7cGljb2NvbG9yc0V4cG9ydHMuZGltKG1vZC5maWxlKX1gKTtcbiAgICB9KTtcbiAgICB3cy5zZW5kKHtcbiAgICAgICAgdHlwZTogJ3BydW5lJyxcbiAgICAgICAgcGF0aHM6IFsuLi5tb2RzXS5tYXAoKG0pID0+IG0udXJsKSxcbiAgICB9KTtcbn1cbi8qKlxuICogTGV4IGltcG9ydC5tZXRhLmhvdC5hY2NlcHQoKSBmb3IgYWNjZXB0ZWQgZGVwcy5cbiAqIFNpbmNlIGhvdC5hY2NlcHQoKSBjYW4gb25seSBhY2NlcHQgc3RyaW5nIGxpdGVyYWxzIG9yIGFycmF5IG9mIHN0cmluZ1xuICogbGl0ZXJhbHMsIHdlIGRvbid0IHJlYWxseSBuZWVkIGEgaGVhdnkgQGJhYmVsL3BhcnNlIGNhbGwgb24gdGhlIGVudGlyZSBzb3VyY2UuXG4gKlxuICogQHJldHVybnMgc2VsZkFjY2VwdHNcbiAqL1xuZnVuY3Rpb24gbGV4QWNjZXB0ZWRIbXJEZXBzKGNvZGUsIHN0YXJ0LCB1cmxzKSB7XG4gICAgbGV0IHN0YXRlID0gMCAvKiBMZXhlclN0YXRlLmluQ2FsbCAqLztcbiAgICAvLyB0aGUgc3RhdGUgY2FuIG9ubHkgYmUgMiBsZXZlbHMgZGVlcCBzbyBubyBuZWVkIGZvciBhIHN0YWNrXG4gICAgbGV0IHByZXZTdGF0ZSA9IDAgLyogTGV4ZXJTdGF0ZS5pbkNhbGwgKi87XG4gICAgbGV0IGN1cnJlbnREZXAgPSAnJztcbiAgICBmdW5jdGlvbiBhZGREZXAoaW5kZXgpIHtcbiAgICAgICAgdXJscy5hZGQoe1xuICAgICAgICAgICAgdXJsOiBjdXJyZW50RGVwLFxuICAgICAgICAgICAgc3RhcnQ6IGluZGV4IC0gY3VycmVudERlcC5sZW5ndGggLSAxLFxuICAgICAgICAgICAgZW5kOiBpbmRleCArIDEsXG4gICAgICAgIH0pO1xuICAgICAgICBjdXJyZW50RGVwID0gJyc7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNvZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hhciA9IGNvZGUuY2hhckF0KGkpO1xuICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIDAgLyogTGV4ZXJTdGF0ZS5pbkNhbGwgKi86XG4gICAgICAgICAgICBjYXNlIDQgLyogTGV4ZXJTdGF0ZS5pbkFycmF5ICovOlxuICAgICAgICAgICAgICAgIGlmIChjaGFyID09PSBgJ2ApIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldlN0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMSAvKiBMZXhlclN0YXRlLmluU2luZ2xlUXVvdGVTdHJpbmcgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT09IGBcImApIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldlN0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMiAvKiBMZXhlclN0YXRlLmluRG91YmxlUXVvdGVTdHJpbmcgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT09ICdgJykge1xuICAgICAgICAgICAgICAgICAgICBwcmV2U3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzIC8qIExleGVyU3RhdGUuaW5UZW1wbGF0ZVN0cmluZyAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoL1xccy8udGVzdChjaGFyKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMCAvKiBMZXhlclN0YXRlLmluQ2FsbCAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09IGBbYCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNCAvKiBMZXhlclN0YXRlLmluQXJyYXkgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFjaGluZyBoZXJlIG1lYW5zIHRoZSBmaXJzdCBhcmcgaXMgbmVpdGhlciBhIHN0cmluZyBsaXRlcmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9yIGFuIEFycmF5IGxpdGVyYWwgKGRpcmVjdCBjYWxsYmFjaykgb3IgdGhlcmUgaXMgbm8gYXJnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gYm90aCBjYXNlIHRoaXMgaW5kaWNhdGVzIGEgc2VsZi1hY2NlcHRpbmcgbW9kdWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGRvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gNCAvKiBMZXhlclN0YXRlLmluQXJyYXkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyID09PSBgXWApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGRvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXIgPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IkMShpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMSAvKiBMZXhlclN0YXRlLmluU2luZ2xlUXVvdGVTdHJpbmcgKi86XG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09IGAnYCkge1xuICAgICAgICAgICAgICAgICAgICBhZGREZXAoaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2U3RhdGUgPT09IDAgLyogTGV4ZXJTdGF0ZS5pbkNhbGwgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY2VwdCgnZm9vJywgLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBwcmV2U3RhdGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXAgKz0gY2hhcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDIgLyogTGV4ZXJTdGF0ZS5pbkRvdWJsZVF1b3RlU3RyaW5nICovOlxuICAgICAgICAgICAgICAgIGlmIChjaGFyID09PSBgXCJgKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZERlcChpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZTdGF0ZSA9PT0gMCAvKiBMZXhlclN0YXRlLmluQ2FsbCAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjZXB0KCdmb28nLCAuLi4pXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHByZXZTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcCArPSBjaGFyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMyAvKiBMZXhlclN0YXRlLmluVGVtcGxhdGVTdHJpbmcgKi86XG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgPT09ICdgJykge1xuICAgICAgICAgICAgICAgICAgICBhZGREZXAoaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2U3RhdGUgPT09IDAgLyogTGV4ZXJTdGF0ZS5pbkNhbGwgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY2VwdCgnZm9vJywgLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBwcmV2U3RhdGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhciA9PT0gJyQnICYmIGNvZGUuY2hhckF0KGkgKyAxKSA9PT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yJDEoaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVwICs9IGNoYXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gaW1wb3J0Lm1ldGEuaG90IGxleGVyIHN0YXRlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gbGV4QWNjZXB0ZWRIbXJFeHBvcnRzKGNvZGUsIHN0YXJ0LCBleHBvcnROYW1lcykge1xuICAgIGNvbnN0IHVybHMgPSBuZXcgU2V0KCk7XG4gICAgbGV4QWNjZXB0ZWRIbXJEZXBzKGNvZGUsIHN0YXJ0LCB1cmxzKTtcbiAgICBmb3IgKGNvbnN0IHsgdXJsIH0gb2YgdXJscykge1xuICAgICAgICBleHBvcnROYW1lcy5hZGQodXJsKTtcbiAgICB9XG4gICAgcmV0dXJuIHVybHMuc2l6ZSA+IDA7XG59XG5mdW5jdGlvbiBub3JtYWxpemVIbXJVcmwodXJsKSB7XG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCgnLicpICYmICF1cmwuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgIHVybCA9IHdyYXBJZCh1cmwpO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xufVxuZnVuY3Rpb24gZXJyb3IkMShwb3MpIHtcbiAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYGltcG9ydC5tZXRhLmhvdC5hY2NlcHQoKSBjYW4gb25seSBhY2NlcHQgc3RyaW5nIGxpdGVyYWxzIG9yIGFuIGAgK1xuICAgICAgICBgQXJyYXkgb2Ygc3RyaW5nIGxpdGVyYWxzLmApO1xuICAgIGVyci5wb3MgPSBwb3M7XG4gICAgdGhyb3cgZXJyO1xufVxuLy8gdml0ZWpzL3ZpdGUjNjEwIHdoZW4gaG90LXJlbG9hZGluZyBWdWUgZmlsZXMsIHdlIHJlYWQgaW1tZWRpYXRlbHkgb24gZmlsZVxuLy8gY2hhbmdlIGV2ZW50IGFuZCBzb21ldGltZXMgdGhpcyBjYW4gYmUgdG9vIGVhcmx5IGFuZCBnZXQgYW4gZW1wdHkgYnVmZmVyLlxuLy8gUG9sbCB1bnRpbCB0aGUgZmlsZSdzIG1vZGlmaWVkIHRpbWUgaGFzIGNoYW5nZWQgYmVmb3JlIHJlYWRpbmcgYWdhaW4uXG5hc3luYyBmdW5jdGlvbiByZWFkTW9kaWZpZWRGaWxlKGZpbGUpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMkbC5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04Jyk7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IG10aW1lID0gZnMkbC5zdGF0U3luYyhmaWxlKS5tdGltZU1zO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4ge1xuICAgICAgICAgICAgbGV0IG4gPSAwO1xuICAgICAgICAgICAgY29uc3QgcG9sbCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBuKys7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3TXRpbWUgPSBmcyRsLnN0YXRTeW5jKGZpbGUpLm10aW1lTXM7XG4gICAgICAgICAgICAgICAgaWYgKG5ld010aW1lICE9PSBtdGltZSB8fCBuID4gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgcigwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQocG9sbCwgMTApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHBvbGwsIDEwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmcyRsLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cbn1cblxuLyohXG4gKiBldGFnXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbnZhciBldGFnXzEgPSBldGFnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBjcnlwdG8gPSByZXF1aXJlJCQ1JDE7XG52YXIgU3RhdHMgPSByZXF1aXJlJCQwX19kZWZhdWx0LlN0YXRzO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogR2VuZXJhdGUgYW4gZW50aXR5IHRhZy5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcnxzdHJpbmd9IGVudGl0eVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBlbnRpdHl0YWcgKGVudGl0eSkge1xuICBpZiAoZW50aXR5Lmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGZhc3QtcGF0aCBlbXB0eVxuICAgIHJldHVybiAnXCIwLTJqbWo3bDVyU3cweVZiL3ZsV0FZa0svWUJ3a1wiJ1xuICB9XG5cbiAgLy8gY29tcHV0ZSBoYXNoIG9mIGVudGl0eVxuICB2YXIgaGFzaCA9IGNyeXB0b1xuICAgIC5jcmVhdGVIYXNoKCdzaGExJylcbiAgICAudXBkYXRlKGVudGl0eSwgJ3V0ZjgnKVxuICAgIC5kaWdlc3QoJ2Jhc2U2NCcpXG4gICAgLnN1YnN0cmluZygwLCAyNyk7XG5cbiAgLy8gY29tcHV0ZSBsZW5ndGggb2YgZW50aXR5XG4gIHZhciBsZW4gPSB0eXBlb2YgZW50aXR5ID09PSAnc3RyaW5nJ1xuICAgID8gQnVmZmVyLmJ5dGVMZW5ndGgoZW50aXR5LCAndXRmOCcpXG4gICAgOiBlbnRpdHkubGVuZ3RoO1xuXG4gIHJldHVybiAnXCInICsgbGVuLnRvU3RyaW5nKDE2KSArICctJyArIGhhc2ggKyAnXCInXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc2ltcGxlIEVUYWcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfFN0YXRzfSBlbnRpdHlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMud2Vha11cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBldGFnIChlbnRpdHksIG9wdGlvbnMpIHtcbiAgaWYgKGVudGl0eSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgZW50aXR5IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIHN1cHBvcnQgZnMuU3RhdHMgb2JqZWN0XG4gIHZhciBpc1N0YXRzID0gaXNzdGF0cyhlbnRpdHkpO1xuICB2YXIgd2VhayA9IG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMud2VhayA9PT0gJ2Jvb2xlYW4nXG4gICAgPyBvcHRpb25zLndlYWtcbiAgICA6IGlzU3RhdHM7XG5cbiAgLy8gdmFsaWRhdGUgYXJndW1lbnRcbiAgaWYgKCFpc1N0YXRzICYmIHR5cGVvZiBlbnRpdHkgIT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNCdWZmZXIoZW50aXR5KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IGVudGl0eSBtdXN0IGJlIHN0cmluZywgQnVmZmVyLCBvciBmcy5TdGF0cycpXG4gIH1cblxuICAvLyBnZW5lcmF0ZSBlbnRpdHkgdGFnXG4gIHZhciB0YWcgPSBpc1N0YXRzXG4gICAgPyBzdGF0dGFnKGVudGl0eSlcbiAgICA6IGVudGl0eXRhZyhlbnRpdHkpO1xuXG4gIHJldHVybiB3ZWFrXG4gICAgPyAnVy8nICsgdGFnXG4gICAgOiB0YWdcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgb2JqZWN0IGlzIGEgU3RhdHMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc3N0YXRzIChvYmopIHtcbiAgLy8gZ2VudWluZSBmcy5TdGF0c1xuICBpZiAodHlwZW9mIFN0YXRzID09PSAnZnVuY3Rpb24nICYmIG9iaiBpbnN0YW5jZW9mIFN0YXRzKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIHF1YWNrIHF1YWNrXG4gIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICAnY3RpbWUnIGluIG9iaiAmJiB0b1N0cmluZy5jYWxsKG9iai5jdGltZSkgPT09ICdbb2JqZWN0IERhdGVdJyAmJlxuICAgICdtdGltZScgaW4gb2JqICYmIHRvU3RyaW5nLmNhbGwob2JqLm10aW1lKSA9PT0gJ1tvYmplY3QgRGF0ZV0nICYmXG4gICAgJ2lubycgaW4gb2JqICYmIHR5cGVvZiBvYmouaW5vID09PSAnbnVtYmVyJyAmJlxuICAgICdzaXplJyBpbiBvYmogJiYgdHlwZW9mIG9iai5zaXplID09PSAnbnVtYmVyJ1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgdGFnIGZvciBhIHN0YXQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHN0YXRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3RhdHRhZyAoc3RhdCkge1xuICB2YXIgbXRpbWUgPSBzdGF0Lm10aW1lLmdldFRpbWUoKS50b1N0cmluZygxNik7XG4gIHZhciBzaXplID0gc3RhdC5zaXplLnRvU3RyaW5nKDE2KTtcblxuICByZXR1cm4gJ1wiJyArIHNpemUgKyAnLScgKyBtdGltZSArICdcIidcbn1cblxudmFyIGNvbnZlcnRTb3VyY2VNYXAgPSB7fTtcblxuKGZ1bmN0aW9uIChleHBvcnRzKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdjb21tZW50UmVnZXgnLCB7XG5cdCAgZ2V0OiBmdW5jdGlvbiBnZXRDb21tZW50UmVnZXggKCkge1xuXHQgICAgLy8gR3JvdXBzOiAxOiBtZWRpYSB0eXBlLCAyOiBNSU1FIHR5cGUsIDM6IGNoYXJzZXQsIDQ6IGVuY29kaW5nLCA1OiBkYXRhLlxuXHQgICAgcmV0dXJuIC9eXFxzKj9cXC9bXFwvXFwqXVtAI11cXHMrP3NvdXJjZU1hcHBpbmdVUkw9ZGF0YTooKCg/OmFwcGxpY2F0aW9ufHRleHQpXFwvanNvbikoPzo7Y2hhcnNldD0oW147LF0rPyk/KT8pPyg/OjsoYmFzZTY0KSk/LCguKj8pJC9tZztcblx0ICB9XG5cdH0pO1xuXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdtYXBGaWxlQ29tbWVudFJlZ2V4Jywge1xuXHQgIGdldDogZnVuY3Rpb24gZ2V0TWFwRmlsZUNvbW1lbnRSZWdleCAoKSB7XG5cdCAgICAvLyBNYXRjaGVzIHNvdXJjZU1hcHBpbmdVUkwgaW4gZWl0aGVyIC8vIG9yIC8qIGNvbW1lbnQgc3R5bGVzLlxuXHQgICAgcmV0dXJuIC8oPzpcXC9cXC9bQCNdWyBcXHRdKz9zb3VyY2VNYXBwaW5nVVJMPShbXlxccydcImBdKz8pWyBcXHRdKj8kKXwoPzpcXC9cXCpbQCNdWyBcXHRdK3NvdXJjZU1hcHBpbmdVUkw9KFteKl0rPylbIFxcdF0qPyg/OlxcKlxcLyl7MX1bIFxcdF0qPyQpL21nO1xuXHQgIH1cblx0fSk7XG5cblx0dmFyIGRlY29kZUJhc2U2NDtcblx0aWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG5cdCAgaWYgKHR5cGVvZiBCdWZmZXIuZnJvbSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgZGVjb2RlQmFzZTY0ID0gZGVjb2RlQmFzZTY0V2l0aEJ1ZmZlckZyb207XG5cdCAgfSBlbHNlIHtcblx0ICAgIGRlY29kZUJhc2U2NCA9IGRlY29kZUJhc2U2NFdpdGhOZXdCdWZmZXI7XG5cdCAgfVxuXHR9IGVsc2Uge1xuXHQgIGRlY29kZUJhc2U2NCA9IGRlY29kZUJhc2U2NFdpdGhBdG9iO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGVjb2RlQmFzZTY0V2l0aEJ1ZmZlckZyb20oYmFzZTY0KSB7XG5cdCAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRmdW5jdGlvbiBkZWNvZGVCYXNlNjRXaXRoTmV3QnVmZmVyKGJhc2U2NCkge1xuXHQgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG5cdCAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgdG8gZGVjb2RlIG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuXHQgIH1cblx0ICByZXR1cm4gbmV3IEJ1ZmZlcihiYXNlNjQsICdiYXNlNjQnKS50b1N0cmluZygpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGVjb2RlQmFzZTY0V2l0aEF0b2IoYmFzZTY0KSB7XG5cdCAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoYXRvYihiYXNlNjQpKSk7XG5cdH1cblxuXHRmdW5jdGlvbiBzdHJpcENvbW1lbnQoc20pIHtcblx0ICByZXR1cm4gc20uc3BsaXQoJywnKS5wb3AoKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHJlYWRGcm9tRmlsZU1hcChzbSwgcmVhZCkge1xuXHQgIHZhciByID0gZXhwb3J0cy5tYXBGaWxlQ29tbWVudFJlZ2V4LmV4ZWMoc20pO1xuXHQgIC8vIGZvciBzb21lIG9kZCByZWFzb24gLy8jIC4uIGNhcHR1cmVzIGluIDEgYW5kIC8qIC4uICovIGluIDJcblx0ICB2YXIgZmlsZW5hbWUgPSByWzFdIHx8IHJbMl07XG5cblx0ICB0cnkge1xuXHQgICAgdmFyIHNtID0gcmVhZChmaWxlbmFtZSk7XG5cdCAgICBpZiAoc20gIT0gbnVsbCAmJiB0eXBlb2Ygc20uY2F0Y2ggPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgcmV0dXJuIHNtLmNhdGNoKHRocm93RXJyb3IpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcmV0dXJuIHNtO1xuXHQgICAgfVxuXHQgIH0gY2F0Y2ggKGUpIHtcblx0ICAgIHRocm93RXJyb3IoZSk7XG5cdCAgfVxuXG5cdCAgZnVuY3Rpb24gdGhyb3dFcnJvcihlKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSBtYXAgZmlsZSBhdCAnICsgZmlsZW5hbWUgKyAnXFxuJyArIGUuc3RhY2spO1xuXHQgIH1cblx0fVxuXG5cdGZ1bmN0aW9uIENvbnZlcnRlciAoc20sIG9wdHMpIHtcblx0ICBvcHRzID0gb3B0cyB8fCB7fTtcblxuXHQgIGlmIChvcHRzLmhhc0NvbW1lbnQpIHtcblx0ICAgIHNtID0gc3RyaXBDb21tZW50KHNtKTtcblx0ICB9XG5cblx0ICBpZiAob3B0cy5lbmNvZGluZyA9PT0gJ2Jhc2U2NCcpIHtcblx0ICAgIHNtID0gZGVjb2RlQmFzZTY0KHNtKTtcblx0ICB9IGVsc2UgaWYgKG9wdHMuZW5jb2RpbmcgPT09ICd1cmknKSB7XG5cdCAgICBzbSA9IGRlY29kZVVSSUNvbXBvbmVudChzbSk7XG5cdCAgfVxuXG5cdCAgaWYgKG9wdHMuaXNKU09OIHx8IG9wdHMuZW5jb2RpbmcpIHtcblx0ICAgIHNtID0gSlNPTi5wYXJzZShzbSk7XG5cdCAgfVxuXG5cdCAgdGhpcy5zb3VyY2VtYXAgPSBzbTtcblx0fVxuXG5cdENvbnZlcnRlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKHNwYWNlKSB7XG5cdCAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuc291cmNlbWFwLCBudWxsLCBzcGFjZSk7XG5cdH07XG5cblx0aWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG5cdCAgaWYgKHR5cGVvZiBCdWZmZXIuZnJvbSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgQ29udmVydGVyLnByb3RvdHlwZS50b0Jhc2U2NCA9IGVuY29kZUJhc2U2NFdpdGhCdWZmZXJGcm9tO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBDb252ZXJ0ZXIucHJvdG90eXBlLnRvQmFzZTY0ID0gZW5jb2RlQmFzZTY0V2l0aE5ld0J1ZmZlcjtcblx0ICB9XG5cdH0gZWxzZSB7XG5cdCAgQ29udmVydGVyLnByb3RvdHlwZS50b0Jhc2U2NCA9IGVuY29kZUJhc2U2NFdpdGhCdG9hO1xuXHR9XG5cblx0ZnVuY3Rpb24gZW5jb2RlQmFzZTY0V2l0aEJ1ZmZlckZyb20oKSB7XG5cdCAgdmFyIGpzb24gPSB0aGlzLnRvSlNPTigpO1xuXHQgIHJldHVybiBCdWZmZXIuZnJvbShqc29uLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblx0fVxuXG5cdGZ1bmN0aW9uIGVuY29kZUJhc2U2NFdpdGhOZXdCdWZmZXIoKSB7XG5cdCAgdmFyIGpzb24gPSB0aGlzLnRvSlNPTigpO1xuXHQgIGlmICh0eXBlb2YganNvbiA9PT0gJ251bWJlcicpIHtcblx0ICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBqc29uIHRvIGVuY29kZSBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcblx0ICB9XG5cdCAgcmV0dXJuIG5ldyBCdWZmZXIoanNvbiwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cdH1cblxuXHRmdW5jdGlvbiBlbmNvZGVCYXNlNjRXaXRoQnRvYSgpIHtcblx0ICB2YXIganNvbiA9IHRoaXMudG9KU09OKCk7XG5cdCAgcmV0dXJuIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGpzb24pKSk7XG5cdH1cblxuXHRDb252ZXJ0ZXIucHJvdG90eXBlLnRvVVJJID0gZnVuY3Rpb24gKCkge1xuXHQgIHZhciBqc29uID0gdGhpcy50b0pTT04oKTtcblx0ICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGpzb24pO1xuXHR9O1xuXG5cdENvbnZlcnRlci5wcm90b3R5cGUudG9Db21tZW50ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICB2YXIgZW5jb2RpbmcsIGNvbnRlbnQsIGRhdGE7XG5cdCAgaWYgKG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmVuY29kaW5nID09PSAndXJpJykge1xuXHQgICAgZW5jb2RpbmcgPSAnJztcblx0ICAgIGNvbnRlbnQgPSB0aGlzLnRvVVJJKCk7XG5cdCAgfSBlbHNlIHtcblx0ICAgIGVuY29kaW5nID0gJztiYXNlNjQnO1xuXHQgICAgY29udGVudCA9IHRoaXMudG9CYXNlNjQoKTtcblx0ICB9XG5cdCAgZGF0YSA9ICdzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04JyArIGVuY29kaW5nICsgJywnICsgY29udGVudDtcblx0ICByZXR1cm4gb3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMubXVsdGlsaW5lID8gJy8qIyAnICsgZGF0YSArICcgKi8nIDogJy8vIyAnICsgZGF0YTtcblx0fTtcblxuXHQvLyByZXR1cm5zIGNvcHkgaW5zdGVhZCBvZiBvcmlnaW5hbFxuXHRDb252ZXJ0ZXIucHJvdG90eXBlLnRvT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgIHJldHVybiBKU09OLnBhcnNlKHRoaXMudG9KU09OKCkpO1xuXHR9O1xuXG5cdENvbnZlcnRlci5wcm90b3R5cGUuYWRkUHJvcGVydHkgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHQgIGlmICh0aGlzLnNvdXJjZW1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BlcnR5IFwiJyArIGtleSArICdcIiBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgc291cmNlbWFwLCB1c2Ugc2V0IHByb3BlcnR5IGluc3RlYWQnKTtcblx0ICByZXR1cm4gdGhpcy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTtcblx0fTtcblxuXHRDb252ZXJ0ZXIucHJvdG90eXBlLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0ICB0aGlzLnNvdXJjZW1hcFtrZXldID0gdmFsdWU7XG5cdCAgcmV0dXJuIHRoaXM7XG5cdH07XG5cblx0Q29udmVydGVyLnByb3RvdHlwZS5nZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChrZXkpIHtcblx0ICByZXR1cm4gdGhpcy5zb3VyY2VtYXBba2V5XTtcblx0fTtcblxuXHRleHBvcnRzLmZyb21PYmplY3QgPSBmdW5jdGlvbiAob2JqKSB7XG5cdCAgcmV0dXJuIG5ldyBDb252ZXJ0ZXIob2JqKTtcblx0fTtcblxuXHRleHBvcnRzLmZyb21KU09OID0gZnVuY3Rpb24gKGpzb24pIHtcblx0ICByZXR1cm4gbmV3IENvbnZlcnRlcihqc29uLCB7IGlzSlNPTjogdHJ1ZSB9KTtcblx0fTtcblxuXHRleHBvcnRzLmZyb21VUkkgPSBmdW5jdGlvbiAodXJpKSB7XG5cdCAgcmV0dXJuIG5ldyBDb252ZXJ0ZXIodXJpLCB7IGVuY29kaW5nOiAndXJpJyB9KTtcblx0fTtcblxuXHRleHBvcnRzLmZyb21CYXNlNjQgPSBmdW5jdGlvbiAoYmFzZTY0KSB7XG5cdCAgcmV0dXJuIG5ldyBDb252ZXJ0ZXIoYmFzZTY0LCB7IGVuY29kaW5nOiAnYmFzZTY0JyB9KTtcblx0fTtcblxuXHRleHBvcnRzLmZyb21Db21tZW50ID0gZnVuY3Rpb24gKGNvbW1lbnQpIHtcblx0ICB2YXIgbSwgZW5jb2Rpbmc7XG5cdCAgY29tbWVudCA9IGNvbW1lbnRcblx0ICAgIC5yZXBsYWNlKC9eXFwvXFwqL2csICcvLycpXG5cdCAgICAucmVwbGFjZSgvXFwqXFwvJC9nLCAnJyk7XG5cdCAgbSA9IGV4cG9ydHMuY29tbWVudFJlZ2V4LmV4ZWMoY29tbWVudCk7XG5cdCAgZW5jb2RpbmcgPSBtICYmIG1bNF0gfHwgJ3VyaSc7XG5cdCAgcmV0dXJuIG5ldyBDb252ZXJ0ZXIoY29tbWVudCwgeyBlbmNvZGluZzogZW5jb2RpbmcsIGhhc0NvbW1lbnQ6IHRydWUgfSk7XG5cdH07XG5cblx0ZnVuY3Rpb24gbWFrZUNvbnZlcnRlcihzbSkge1xuXHQgIHJldHVybiBuZXcgQ29udmVydGVyKHNtLCB7IGlzSlNPTjogdHJ1ZSB9KTtcblx0fVxuXG5cdGV4cG9ydHMuZnJvbU1hcEZpbGVDb21tZW50ID0gZnVuY3Rpb24gKGNvbW1lbnQsIHJlYWQpIHtcblx0ICBpZiAodHlwZW9mIHJlYWQgPT09ICdzdHJpbmcnKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoXG5cdCAgICAgICdTdHJpbmcgZGlyZWN0b3J5IHBhdGhzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIHdpdGggYGZyb21NYXBGaWxlQ29tbWVudGBcXG4nICtcblx0ICAgICAgJ1BsZWFzZSByZXZpZXcgdGhlIFVwZ3JhZGluZyBkb2N1bWVudGF0aW9uIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS90aGxvcmVuei9jb252ZXJ0LXNvdXJjZS1tYXAjdXBncmFkaW5nJ1xuXHQgICAgKVxuXHQgIH1cblxuXHQgIHZhciBzbSA9IHJlYWRGcm9tRmlsZU1hcChjb21tZW50LCByZWFkKTtcblx0ICBpZiAoc20gIT0gbnVsbCAmJiB0eXBlb2Ygc20udGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgcmV0dXJuIHNtLnRoZW4obWFrZUNvbnZlcnRlcik7XG5cdCAgfSBlbHNlIHtcblx0ICAgIHJldHVybiBtYWtlQ29udmVydGVyKHNtKTtcblx0ICB9XG5cdH07XG5cblx0Ly8gRmluZHMgbGFzdCBzb3VyY2VtYXAgY29tbWVudCBpbiBmaWxlIG9yIHJldHVybnMgbnVsbCBpZiBub25lIHdhcyBmb3VuZFxuXHRleHBvcnRzLmZyb21Tb3VyY2UgPSBmdW5jdGlvbiAoY29udGVudCkge1xuXHQgIHZhciBtID0gY29udGVudC5tYXRjaChleHBvcnRzLmNvbW1lbnRSZWdleCk7XG5cdCAgcmV0dXJuIG0gPyBleHBvcnRzLmZyb21Db21tZW50KG0ucG9wKCkpIDogbnVsbDtcblx0fTtcblxuXHQvLyBGaW5kcyBsYXN0IHNvdXJjZW1hcCBjb21tZW50IGluIGZpbGUgb3IgcmV0dXJucyBudWxsIGlmIG5vbmUgd2FzIGZvdW5kXG5cdGV4cG9ydHMuZnJvbU1hcEZpbGVTb3VyY2UgPSBmdW5jdGlvbiAoY29udGVudCwgcmVhZCkge1xuXHQgIGlmICh0eXBlb2YgcmVhZCA9PT0gJ3N0cmluZycpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcihcblx0ICAgICAgJ1N0cmluZyBkaXJlY3RvcnkgcGF0aHMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgd2l0aCBgZnJvbU1hcEZpbGVTb3VyY2VgXFxuJyArXG5cdCAgICAgICdQbGVhc2UgcmV2aWV3IHRoZSBVcGdyYWRpbmcgZG9jdW1lbnRhdGlvbiBhdCBodHRwczovL2dpdGh1Yi5jb20vdGhsb3JlbnovY29udmVydC1zb3VyY2UtbWFwI3VwZ3JhZGluZydcblx0ICAgIClcblx0ICB9XG5cdCAgdmFyIG0gPSBjb250ZW50Lm1hdGNoKGV4cG9ydHMubWFwRmlsZUNvbW1lbnRSZWdleCk7XG5cdCAgcmV0dXJuIG0gPyBleHBvcnRzLmZyb21NYXBGaWxlQ29tbWVudChtLnBvcCgpLCByZWFkKSA6IG51bGw7XG5cdH07XG5cblx0ZXhwb3J0cy5yZW1vdmVDb21tZW50cyA9IGZ1bmN0aW9uIChzcmMpIHtcblx0ICByZXR1cm4gc3JjLnJlcGxhY2UoZXhwb3J0cy5jb21tZW50UmVnZXgsICcnKTtcblx0fTtcblxuXHRleHBvcnRzLnJlbW92ZU1hcEZpbGVDb21tZW50cyA9IGZ1bmN0aW9uIChzcmMpIHtcblx0ICByZXR1cm4gc3JjLnJlcGxhY2UoZXhwb3J0cy5tYXBGaWxlQ29tbWVudFJlZ2V4LCAnJyk7XG5cdH07XG5cblx0ZXhwb3J0cy5nZW5lcmF0ZU1hcEZpbGVDb21tZW50ID0gZnVuY3Rpb24gKGZpbGUsIG9wdGlvbnMpIHtcblx0ICB2YXIgZGF0YSA9ICdzb3VyY2VNYXBwaW5nVVJMPScgKyBmaWxlO1xuXHQgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMubXVsdGlsaW5lID8gJy8qIyAnICsgZGF0YSArICcgKi8nIDogJy8vIyAnICsgZGF0YTtcblx0fTtcbn0gKGNvbnZlcnRTb3VyY2VNYXApKTtcblxuZnVuY3Rpb24gdG90YWxpc3QoZGlyLCBjYWxsYmFjaywgcHJlPScnKSB7XG5cdGRpciA9IHJlc29sdmUkMygnLicsIGRpcik7XG5cdGxldCBhcnIgPSByZWFkZGlyU3luYyhkaXIpO1xuXHRsZXQgaT0wLCBhYnMsIHN0YXRzO1xuXHRmb3IgKDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuXHRcdGFicyA9IGpvaW4kMShkaXIsIGFycltpXSk7XG5cdFx0c3RhdHMgPSBzdGF0U3luYyQxKGFicyk7XG5cdFx0c3RhdHMuaXNEaXJlY3RvcnkoKVxuXHRcdFx0PyB0b3RhbGlzdChhYnMsIGNhbGxiYWNrLCBqb2luJDEocHJlLCBhcnJbaV0pKVxuXHRcdFx0OiBjYWxsYmFjayhqb2luJDEocHJlLCBhcnJbaV0pLCBhYnMsIHN0YXRzKTtcblx0fVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIFBhcnNlZFVSTFxuICogQHR5cGUge2ltcG9ydCgnLicpLlBhcnNlZFVSTH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAqIEBwcm9wZXJ0eSB7UGFyc2VkVVJMfSBfcGFyc2VkVXJsXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1JlcXVlc3R9IHJlcVxuICogQHJldHVybnMge1BhcnNlZFVSTHx2b2lkfVxuICovXG5mdW5jdGlvbiBwYXJzZSQ4KHJlcSkge1xuXHRsZXQgcmF3ID0gcmVxLnVybDtcblx0aWYgKHJhdyA9PSBudWxsKSByZXR1cm47XG5cblx0bGV0IHByZXYgPSByZXEuX3BhcnNlZFVybDtcblx0aWYgKHByZXYgJiYgcHJldi5yYXcgPT09IHJhdykgcmV0dXJuIHByZXY7XG5cblx0bGV0IHBhdGhuYW1lPXJhdywgc2VhcmNoPScnLCBxdWVyeTtcblxuXHRpZiAocmF3Lmxlbmd0aCA+IDEpIHtcblx0XHRsZXQgaWR4ID0gcmF3LmluZGV4T2YoJz8nLCAxKTtcblxuXHRcdGlmIChpZHggIT09IC0xKSB7XG5cdFx0XHRzZWFyY2ggPSByYXcuc3Vic3RyaW5nKGlkeCk7XG5cdFx0XHRwYXRobmFtZSA9IHJhdy5zdWJzdHJpbmcoMCwgaWR4KTtcblx0XHRcdGlmIChzZWFyY2gubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRxdWVyeSA9IHFzLnBhcnNlKHNlYXJjaC5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXEuX3BhcnNlZFVybCA9IHsgcGF0aG5hbWUsIHNlYXJjaCwgcXVlcnksIHJhdyB9O1xufVxuXG5jb25zdCBub29wJDIgPSAoKSA9PiB7fTtcblxuZnVuY3Rpb24gaXNNYXRjaCh1cmksIGFycikge1xuXHRmb3IgKGxldCBpPTA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoYXJyW2ldLnRlc3QodXJpKSkgcmV0dXJuIHRydWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gdG9Bc3N1bWUodXJpLCBleHRucykge1xuXHRsZXQgaT0wLCB4LCBsZW49dXJpLmxlbmd0aCAtIDE7XG5cdGlmICh1cmkuY2hhckNvZGVBdChsZW4pID09PSA0Nykge1xuXHRcdHVyaSA9IHVyaS5zdWJzdHJpbmcoMCwgbGVuKTtcblx0fVxuXG5cdGxldCBhcnI9W10sIHRtcD1gJHt1cml9L2luZGV4YDtcblx0Zm9yICg7IGkgPCBleHRucy5sZW5ndGg7IGkrKykge1xuXHRcdHggPSBleHRuc1tpXSA/IGAuJHtleHRuc1tpXX1gIDogJyc7XG5cdFx0aWYgKHVyaSkgYXJyLnB1c2godXJpICsgeCk7XG5cdFx0YXJyLnB1c2godG1wICsgeCk7XG5cdH1cblxuXHRyZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiB2aWFDYWNoZShjYWNoZSwgdXJpLCBleHRucykge1xuXHRsZXQgaT0wLCBkYXRhLCBhcnI9dG9Bc3N1bWUodXJpLCBleHRucyk7XG5cdGZvciAoOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKGRhdGEgPSBjYWNoZVthcnJbaV1dKSByZXR1cm4gZGF0YTtcblx0fVxufVxuXG5mdW5jdGlvbiB2aWFMb2NhbChkaXIsIGlzRXRhZywgdXJpLCBleHRucywgc2hvdWxkU2VydmUpIHtcblx0bGV0IGk9MCwgYXJyPXRvQXNzdW1lKHVyaSwgZXh0bnMpO1xuXHRsZXQgYWJzLCBzdGF0cywgbmFtZSwgaGVhZGVycztcblx0Zm9yICg7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcblx0XHRhYnMgPSBub3JtYWxpemUoam9pbiQxKGRpciwgbmFtZT1hcnJbaV0pKTtcblx0XHRpZiAoYWJzLnN0YXJ0c1dpdGgoZGlyKSAmJiByZXF1aXJlJCQwJDIuZXhpc3RzU3luYyhhYnMpKSB7XG5cdFx0XHRzdGF0cyA9IHJlcXVpcmUkJDAkMi5zdGF0U3luYyhhYnMpO1xuXHRcdFx0aWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKHNob3VsZFNlcnZlICYmICFzaG91bGRTZXJ2ZShhYnMpKSBjb250aW51ZTtcblx0XHRcdGhlYWRlcnMgPSB0b0hlYWRlcnMobmFtZSwgc3RhdHMsIGlzRXRhZyk7XG5cdFx0XHRoZWFkZXJzWydDYWNoZS1Db250cm9sJ10gPSBpc0V0YWcgPyAnbm8tY2FjaGUnIDogJ25vLXN0b3JlJztcblx0XHRcdHJldHVybiB7IGFicywgc3RhdHMsIGhlYWRlcnMgfTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gaXM0MDQocmVxLCByZXMpIHtcblx0cmV0dXJuIChyZXMuc3RhdHVzQ29kZT00MDQscmVzLmVuZCgpKTtcbn1cblxuZnVuY3Rpb24gc2VuZCQyKHJlcSwgcmVzLCBmaWxlLCBzdGF0cywgaGVhZGVycykge1xuXHRsZXQgY29kZT0yMDAsIHRtcCwgb3B0cz17fTtcblx0aGVhZGVycyA9IHsgLi4uaGVhZGVycyB9O1xuXG5cdGZvciAobGV0IGtleSBpbiBoZWFkZXJzKSB7XG5cdFx0dG1wID0gcmVzLmdldEhlYWRlcihrZXkpO1xuXHRcdGlmICh0bXApIGhlYWRlcnNba2V5XSA9IHRtcDtcblx0fVxuXG5cdGlmICh0bXAgPSByZXMuZ2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKSkge1xuXHRcdGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gdG1wO1xuXHR9XG5cblx0aWYgKHJlcS5oZWFkZXJzLnJhbmdlKSB7XG5cdFx0Y29kZSA9IDIwNjtcblx0XHRsZXQgW3gsIHldID0gcmVxLmhlYWRlcnMucmFuZ2UucmVwbGFjZSgnYnl0ZXM9JywgJycpLnNwbGl0KCctJyk7XG5cdFx0bGV0IGVuZCA9IG9wdHMuZW5kID0gcGFyc2VJbnQoeSwgMTApIHx8IHN0YXRzLnNpemUgLSAxO1xuXHRcdGxldCBzdGFydCA9IG9wdHMuc3RhcnQgPSBwYXJzZUludCh4LCAxMCkgfHwgMDtcblxuXHRcdGlmIChzdGFydCA+PSBzdGF0cy5zaXplIHx8IGVuZCA+PSBzdGF0cy5zaXplKSB7XG5cdFx0XHRyZXMuc2V0SGVhZGVyKCdDb250ZW50LVJhbmdlJywgYGJ5dGVzICovJHtzdGF0cy5zaXplfWApO1xuXHRcdFx0cmVzLnN0YXR1c0NvZGUgPSA0MTY7XG5cdFx0XHRyZXR1cm4gcmVzLmVuZCgpO1xuXHRcdH1cblxuXHRcdGhlYWRlcnNbJ0NvbnRlbnQtUmFuZ2UnXSA9IGBieXRlcyAke3N0YXJ0fS0ke2VuZH0vJHtzdGF0cy5zaXplfWA7XG5cdFx0aGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IChlbmQgLSBzdGFydCArIDEpO1xuXHRcdGhlYWRlcnNbJ0FjY2VwdC1SYW5nZXMnXSA9ICdieXRlcyc7XG5cdH1cblxuXHRyZXMud3JpdGVIZWFkKGNvZGUsIGhlYWRlcnMpO1xuXHRyZXF1aXJlJCQwJDIuY3JlYXRlUmVhZFN0cmVhbShmaWxlLCBvcHRzKS5waXBlKHJlcyk7XG59XG5cbmNvbnN0IEVOQ09ESU5HID0ge1xuXHQnLmJyJzogJ2JyJyxcblx0Jy5neic6ICdnemlwJyxcbn07XG5cbmZ1bmN0aW9uIHRvSGVhZGVycyhuYW1lLCBzdGF0cywgaXNFdGFnKSB7XG5cdGxldCBlbmMgPSBFTkNPRElOR1tuYW1lLnNsaWNlKC0zKV07XG5cblx0bGV0IGN0eXBlID0gbG9va3VwKG5hbWUuc2xpY2UoMCwgZW5jICYmIC0zKSkgfHwgJyc7XG5cdGlmIChjdHlwZSA9PT0gJ3RleHQvaHRtbCcpIGN0eXBlICs9ICc7Y2hhcnNldD11dGYtOCc7XG5cblx0bGV0IGhlYWRlcnMgPSB7XG5cdFx0J0NvbnRlbnQtTGVuZ3RoJzogc3RhdHMuc2l6ZSxcblx0XHQnQ29udGVudC1UeXBlJzogY3R5cGUsXG5cdFx0J0xhc3QtTW9kaWZpZWQnOiBzdGF0cy5tdGltZS50b1VUQ1N0cmluZygpLFxuXHR9O1xuXG5cdGlmIChlbmMpIGhlYWRlcnNbJ0NvbnRlbnQtRW5jb2RpbmcnXSA9IGVuYztcblx0aWYgKGlzRXRhZykgaGVhZGVyc1snRVRhZyddID0gYFcvXCIke3N0YXRzLnNpemV9LSR7c3RhdHMubXRpbWUuZ2V0VGltZSgpfVwiYDtcblxuXHRyZXR1cm4gaGVhZGVycztcbn1cblxuZnVuY3Rpb24gc2lydiAoZGlyLCBvcHRzPXt9KSB7XG5cdGRpciA9IHJlc29sdmUkMyhkaXIgfHwgJy4nKTtcblxuXHRsZXQgaXNOb3RGb3VuZCA9IG9wdHMub25Ob01hdGNoIHx8IGlzNDA0O1xuXHRsZXQgc2V0SGVhZGVycyA9IG9wdHMuc2V0SGVhZGVycyB8fCBub29wJDI7XG5cblx0bGV0IGV4dGVuc2lvbnMgPSBvcHRzLmV4dGVuc2lvbnMgfHwgWydodG1sJywgJ2h0bSddO1xuXHRsZXQgZ3ppcHMgPSBvcHRzLmd6aXAgJiYgZXh0ZW5zaW9ucy5tYXAoeCA9PiBgJHt4fS5nemApLmNvbmNhdCgnZ3onKTtcblx0bGV0IGJyb3RzID0gb3B0cy5icm90bGkgJiYgZXh0ZW5zaW9ucy5tYXAoeCA9PiBgJHt4fS5icmApLmNvbmNhdCgnYnInKTtcblxuXHRjb25zdCBGSUxFUyA9IHt9O1xuXG5cdGxldCBmYWxsYmFjayA9ICcvJztcblx0bGV0IGlzRXRhZyA9ICEhb3B0cy5ldGFnO1xuXHRsZXQgaXNTUEEgPSAhIW9wdHMuc2luZ2xlO1xuXHRpZiAodHlwZW9mIG9wdHMuc2luZ2xlID09PSAnc3RyaW5nJykge1xuXHRcdGxldCBpZHggPSBvcHRzLnNpbmdsZS5sYXN0SW5kZXhPZignLicpO1xuXHRcdGZhbGxiYWNrICs9ICEhfmlkeCA/IG9wdHMuc2luZ2xlLnN1YnN0cmluZygwLCBpZHgpIDogb3B0cy5zaW5nbGU7XG5cdH1cblxuXHRsZXQgaWdub3JlcyA9IFtdO1xuXHRpZiAob3B0cy5pZ25vcmVzICE9PSBmYWxzZSkge1xuXHRcdGlnbm9yZXMucHVzaCgvWy9dKFtBLVphLXpcXHNcXGR+JC5fLV0rXFwuXFx3Kyl7MSx9JC8pOyAvLyBhbnkgZXh0blxuXHRcdGlmIChvcHRzLmRvdGZpbGVzKSBpZ25vcmVzLnB1c2goL1xcL1xcLlxcdy8pO1xuXHRcdGVsc2UgaWdub3Jlcy5wdXNoKC9cXC9cXC53ZWxsLWtub3duLyk7XG5cdFx0W10uY29uY2F0KG9wdHMuaWdub3JlcyB8fCBbXSkuZm9yRWFjaCh4ID0+IHtcblx0XHRcdGlnbm9yZXMucHVzaChuZXcgUmVnRXhwKHgsICdpJykpO1xuXHRcdH0pO1xuXHR9XG5cblx0bGV0IGNjID0gb3B0cy5tYXhBZ2UgIT0gbnVsbCAmJiBgcHVibGljLG1heC1hZ2U9JHtvcHRzLm1heEFnZX1gO1xuXHRpZiAoY2MgJiYgb3B0cy5pbW11dGFibGUpIGNjICs9ICcsaW1tdXRhYmxlJztcblx0ZWxzZSBpZiAoY2MgJiYgb3B0cy5tYXhBZ2UgPT09IDApIGNjICs9ICcsbXVzdC1yZXZhbGlkYXRlJztcblxuXHRpZiAoIW9wdHMuZGV2KSB7XG5cdFx0dG90YWxpc3QoZGlyLCAobmFtZSwgYWJzLCBzdGF0cykgPT4ge1xuXHRcdFx0aWYgKC9cXC53ZWxsLWtub3duW1xcXFwrXFwvXS8udGVzdChuYW1lKSkgOyAvLyBrZWVwXG5cdFx0XHRlbHNlIGlmICghb3B0cy5kb3RmaWxlcyAmJiAvKF5cXC58W1xcXFwrfFxcLytdXFwuKS8udGVzdChuYW1lKSkgcmV0dXJuO1xuXG5cdFx0XHRsZXQgaGVhZGVycyA9IHRvSGVhZGVycyhuYW1lLCBzdGF0cywgaXNFdGFnKTtcblx0XHRcdGlmIChjYykgaGVhZGVyc1snQ2FjaGUtQ29udHJvbCddID0gY2M7XG5cblx0XHRcdEZJTEVTWycvJyArIG5hbWUubm9ybWFsaXplKCkucmVwbGFjZSgvXFxcXCsvZywgJy8nKV0gPSB7IGFicywgc3RhdHMsIGhlYWRlcnMgfTtcblx0XHR9KTtcblx0fVxuXG5cdGxldCBsb29rdXAgPSBvcHRzLmRldiA/IHZpYUxvY2FsLmJpbmQoMCwgZGlyLCBpc0V0YWcpIDogdmlhQ2FjaGUuYmluZCgwLCBGSUxFUyk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xuXHRcdGxldCBleHRucyA9IFsnJ107XG5cdFx0bGV0IHBhdGhuYW1lID0gcGFyc2UkOChyZXEpLnBhdGhuYW1lO1xuXHRcdGxldCB2YWwgPSByZXEuaGVhZGVyc1snYWNjZXB0LWVuY29kaW5nJ10gfHwgJyc7XG5cdFx0aWYgKGd6aXBzICYmIHZhbC5pbmNsdWRlcygnZ3ppcCcpKSBleHRucy51bnNoaWZ0KC4uLmd6aXBzKTtcblx0XHRpZiAoYnJvdHMgJiYgLyhicnxicm90bGkpL2kudGVzdCh2YWwpKSBleHRucy51bnNoaWZ0KC4uLmJyb3RzKTtcblx0XHRleHRucy5wdXNoKC4uLmV4dGVuc2lvbnMpOyAvLyBbLi4uYnIsIC4uLmd6LCBvcmlnLCAuLi5leHRzXVxuXG5cdFx0aWYgKHBhdGhuYW1lLmluZGV4T2YoJyUnKSAhPT0gLTEpIHtcblx0XHRcdHRyeSB7IHBhdGhuYW1lID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhuYW1lKTsgfVxuXHRcdFx0Y2F0Y2ggKGVycikgeyAvKiBtYWxmb3JtIHVyaSAqLyB9XG5cdFx0fVxuXG5cdFx0bGV0IGRhdGEgPSBsb29rdXAocGF0aG5hbWUsIGV4dG5zLCBvcHRzLnNob3VsZFNlcnZlKSB8fCBpc1NQQSAmJiAhaXNNYXRjaChwYXRobmFtZSwgaWdub3JlcykgJiYgbG9va3VwKGZhbGxiYWNrLCBleHRucywgb3B0cy5zaG91bGRTZXJ2ZSk7XG5cdFx0aWYgKCFkYXRhKSByZXR1cm4gbmV4dCA/IG5leHQoKSA6IGlzTm90Rm91bmQocmVxLCByZXMpO1xuXG5cdFx0aWYgKGlzRXRhZyAmJiByZXEuaGVhZGVyc1snaWYtbm9uZS1tYXRjaCddID09PSBkYXRhLmhlYWRlcnNbJ0VUYWcnXSkge1xuXHRcdFx0cmVzLndyaXRlSGVhZCgzMDQpO1xuXHRcdFx0cmV0dXJuIHJlcy5lbmQoKTtcblx0XHR9XG5cblx0XHRpZiAoZ3ppcHMgfHwgYnJvdHMpIHtcblx0XHRcdHJlcy5zZXRIZWFkZXIoJ1ZhcnknLCAnQWNjZXB0LUVuY29kaW5nJyk7XG5cdFx0fVxuXG5cdFx0c2V0SGVhZGVycyhyZXMsIHBhdGhuYW1lLCBkYXRhLnN0YXRzKTtcblx0XHRzZW5kJDIocmVxLCByZXMsIGRhdGEuYWJzLCBkYXRhLnN0YXRzLCBkYXRhLmhlYWRlcnMpO1xuXHR9O1xufVxuXG5jb25zdCBzaXJ2T3B0aW9ucyA9ICh7IGhlYWRlcnMsIHNob3VsZFNlcnZlLCB9KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGV2OiB0cnVlLFxuICAgICAgICBldGFnOiB0cnVlLFxuICAgICAgICBleHRlbnNpb25zOiBbXSxcbiAgICAgICAgc2V0SGVhZGVycyhyZXMsIHBhdGhuYW1lKSB7XG4gICAgICAgICAgICAvLyBNYXRjaGVzIGpzLCBqc3gsIHRzLCB0c3guXG4gICAgICAgICAgICAvLyBUaGUgcmVhc29uIHRoaXMgaXMgZG9uZSwgaXMgdGhhdCB0aGUgLnRzIGZpbGUgZXh0ZW5zaW9uIGlzIHJlc2VydmVkXG4gICAgICAgICAgICAvLyBmb3IgdGhlIE1JTUUgdHlwZSB2aWRlby9tcDJ0LiBJbiBhbG1vc3QgYWxsIGNhc2VzLCB3ZSBjYW4gZXhwZWN0XG4gICAgICAgICAgICAvLyB0aGVzZSBmaWxlcyB0byBiZSBUeXBlU2NyaXB0IGZpbGVzLCBhbmQgZm9yIFZpdGUgdG8gc2VydmUgdGhlbSB3aXRoXG4gICAgICAgICAgICAvLyB0aGlzIENvbnRlbnQtVHlwZS5cbiAgICAgICAgICAgIGlmICgvXFwuW3RqXXN4PyQvLnRlc3QocGF0aG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihuYW1lLCBoZWFkZXJzW25hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNob3VsZFNlcnZlLFxuICAgIH07XG59O1xuZnVuY3Rpb24gc2VydmVQdWJsaWNNaWRkbGV3YXJlKGRpciwgaGVhZGVycykge1xuICAgIGNvbnN0IHNlcnZlID0gc2lydihkaXIsIHNpcnZPcHRpb25zKHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgc2hvdWxkU2VydmU6IChmaWxlUGF0aCkgPT4gc2hvdWxkU2VydmVGaWxlKGZpbGVQYXRoLCBkaXIpLFxuICAgIH0pKTtcbiAgICAvLyBLZWVwIHRoZSBuYW1lZCBmdW5jdGlvbi4gVGhlIG5hbWUgaXMgdmlzaWJsZSBpbiBkZWJ1ZyBsb2dzIHZpYSBgREVCVUc9Y29ubmVjdDpkaXNwYXRjaGVyIC4uLmBcbiAgICByZXR1cm4gZnVuY3Rpb24gdml0ZVNlcnZlUHVibGljTWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCkge1xuICAgICAgICAvLyBza2lwIGltcG9ydCByZXF1ZXN0IGFuZCBpbnRlcm5hbCByZXF1ZXN0cyBgL0Bmcy8gL0B2aXRlLWNsaWVudGAgZXRjLi4uXG4gICAgICAgIGlmIChpc0ltcG9ydFJlcXVlc3QocmVxLnVybCkgfHwgaXNJbnRlcm5hbFJlcXVlc3QocmVxLnVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VydmUocmVxLCByZXMsIG5leHQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzZXJ2ZVN0YXRpY01pZGRsZXdhcmUoZGlyLCBzZXJ2ZXIpIHtcbiAgICBjb25zdCBzZXJ2ZSA9IHNpcnYoZGlyLCBzaXJ2T3B0aW9ucyh7XG4gICAgICAgIGhlYWRlcnM6IHNlcnZlci5jb25maWcuc2VydmVyLmhlYWRlcnMsXG4gICAgfSkpO1xuICAgIC8vIEtlZXAgdGhlIG5hbWVkIGZ1bmN0aW9uLiBUaGUgbmFtZSBpcyB2aXNpYmxlIGluIGRlYnVnIGxvZ3MgdmlhIGBERUJVRz1jb25uZWN0OmRpc3BhdGNoZXIgLi4uYFxuICAgIHJldHVybiBmdW5jdGlvbiB2aXRlU2VydmVTdGF0aWNNaWRkbGV3YXJlKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgICAgIC8vIG9ubHkgc2VydmUgdGhlIGZpbGUgaWYgaXQncyBub3QgYW4gaHRtbCByZXF1ZXN0IG9yIGVuZHMgd2l0aCBgL2BcbiAgICAgICAgLy8gc28gdGhhdCBodG1sIHJlcXVlc3RzIGNhbiBmYWxsdGhyb3VnaCB0byBvdXIgaHRtbCBtaWRkbGV3YXJlIGZvclxuICAgICAgICAvLyBzcGVjaWFsIHByb2Nlc3NpbmdcbiAgICAgICAgLy8gYWxzbyBza2lwIGludGVybmFsIHJlcXVlc3RzIGAvQGZzLyAvQHZpdGUtY2xpZW50YCBldGMuLi5cbiAgICAgICAgY29uc3QgY2xlYW5lZFVybCA9IGNsZWFuVXJsKHJlcS51cmwpO1xuICAgICAgICBpZiAoY2xlYW5lZFVybC5lbmRzV2l0aCgnLycpIHx8XG4gICAgICAgICAgICBwYXRoJG8uZXh0bmFtZShjbGVhbmVkVXJsKSA9PT0gJy5odG1sJyB8fFxuICAgICAgICAgICAgaXNJbnRlcm5hbFJlcXVlc3QocmVxLnVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsLCAnaHR0cDovL2V4YW1wbGUuY29tJyk7XG4gICAgICAgIGNvbnN0IHBhdGhuYW1lID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5wYXRobmFtZSk7XG4gICAgICAgIC8vIGFwcGx5IGFsaWFzZXMgdG8gc3RhdGljIHJlcXVlc3RzIGFzIHdlbGxcbiAgICAgICAgbGV0IHJlZGlyZWN0ZWRQYXRobmFtZTtcbiAgICAgICAgZm9yIChjb25zdCB7IGZpbmQsIHJlcGxhY2VtZW50IH0gb2Ygc2VydmVyLmNvbmZpZy5yZXNvbHZlLmFsaWFzKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gdHlwZW9mIGZpbmQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBwYXRobmFtZS5zdGFydHNXaXRoKGZpbmQpXG4gICAgICAgICAgICAgICAgOiBmaW5kLnRlc3QocGF0aG5hbWUpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdGVkUGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKGZpbmQsIHJlcGxhY2VtZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVkaXJlY3RlZFBhdGhuYW1lKSB7XG4gICAgICAgICAgICAvLyBkaXIgaXMgcHJlLW5vcm1hbGl6ZWQgdG8gcG9zaXggc3R5bGVcbiAgICAgICAgICAgIGlmIChyZWRpcmVjdGVkUGF0aG5hbWUuc3RhcnRzV2l0aChkaXIpKSB7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RlZFBhdGhuYW1lID0gcmVkaXJlY3RlZFBhdGhuYW1lLnNsaWNlKGRpci5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aG5hbWUgPSByZWRpcmVjdGVkUGF0aG5hbWUgfHwgcGF0aG5hbWU7XG4gICAgICAgIGxldCBmaWxlVXJsID0gcGF0aCRvLnJlc29sdmUoZGlyLCByZXNvbHZlZFBhdGhuYW1lLnJlcGxhY2UoL15cXC8vLCAnJykpO1xuICAgICAgICBpZiAocmVzb2x2ZWRQYXRobmFtZS5lbmRzV2l0aCgnLycpICYmICFmaWxlVXJsLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIGZpbGVVcmwgPSBmaWxlVXJsICsgJy8nO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW5zdXJlU2VydmluZ0FjY2VzcyhmaWxlVXJsLCBzZXJ2ZXIsIHJlcywgbmV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVkaXJlY3RlZFBhdGhuYW1lKSB7XG4gICAgICAgICAgICB1cmwucGF0aG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQocmVkaXJlY3RlZFBhdGhuYW1lKTtcbiAgICAgICAgICAgIHJlcS51cmwgPSB1cmwuaHJlZi5zbGljZSh1cmwub3JpZ2luLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VydmUocmVxLCByZXMsIG5leHQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzZXJ2ZVJhd0ZzTWlkZGxld2FyZShzZXJ2ZXIpIHtcbiAgICBjb25zdCBzZXJ2ZUZyb21Sb290ID0gc2lydignLycsIHNpcnZPcHRpb25zKHsgaGVhZGVyczogc2VydmVyLmNvbmZpZy5zZXJ2ZXIuaGVhZGVycyB9KSk7XG4gICAgLy8gS2VlcCB0aGUgbmFtZWQgZnVuY3Rpb24uIFRoZSBuYW1lIGlzIHZpc2libGUgaW4gZGVidWcgbG9ncyB2aWEgYERFQlVHPWNvbm5lY3Q6ZGlzcGF0Y2hlciAuLi5gXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHZpdGVTZXJ2ZVJhd0ZzTWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwsICdodHRwOi8vZXhhbXBsZS5jb20nKTtcbiAgICAgICAgLy8gSW4gc29tZSBjYXNlcyAoZS5nLiBsaW5rZWQgbW9ub3JlcG9zKSBmaWxlcyBvdXRzaWRlIG9mIHJvb3Qgd2lsbFxuICAgICAgICAvLyByZWZlcmVuY2UgYXNzZXRzIHRoYXQgYXJlIGFsc28gb3V0IG9mIHNlcnZlZCByb290LiBJbiBzdWNoIGNhc2VzXG4gICAgICAgIC8vIHRoZSBwYXRocyBhcmUgcmV3cml0dGVuIHRvIGAvQGZzL2AgcHJlZml4ZWQgcGF0aHMgYW5kIG11c3QgYmUgc2VydmVkIGJ5XG4gICAgICAgIC8vIHNlYXJjaGluZyBiYXNlZCBmcm9tIGZzIHJvb3QuXG4gICAgICAgIGlmICh1cmwucGF0aG5hbWUuc3RhcnRzV2l0aChGU19QUkVGSVgpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXRobmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmwucGF0aG5hbWUpO1xuICAgICAgICAgICAgLy8gcmVzdHJpY3QgZmlsZXMgb3V0c2lkZSBvZiBgZnMuYWxsb3dgXG4gICAgICAgICAgICBpZiAoIWVuc3VyZVNlcnZpbmdBY2Nlc3Moc2xhc2gkMShwYXRoJG8ucmVzb2x2ZShmc1BhdGhGcm9tSWQocGF0aG5hbWUpKSksIHNlcnZlciwgcmVzLCBuZXh0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBuZXdQYXRobmFtZSA9IHBhdGhuYW1lLnNsaWNlKEZTX1BSRUZJWC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGlzV2luZG93cyQ0KVxuICAgICAgICAgICAgICAgIG5ld1BhdGhuYW1lID0gbmV3UGF0aG5hbWUucmVwbGFjZSgvXltBLVpdOi9pLCAnJyk7XG4gICAgICAgICAgICB1cmwucGF0aG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmV3UGF0aG5hbWUpO1xuICAgICAgICAgICAgcmVxLnVybCA9IHVybC5ocmVmLnNsaWNlKHVybC5vcmlnaW4ubGVuZ3RoKTtcbiAgICAgICAgICAgIHNlcnZlRnJvbVJvb3QocmVxLCByZXMsIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGlzRmlsZVNlcnZpbmdBbGxvd2VkKHVybCwgc2VydmVyKSB7XG4gICAgaWYgKCFzZXJ2ZXIuY29uZmlnLnNlcnZlci5mcy5zdHJpY3QpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGZpbGUgPSBmc1BhdGhGcm9tVXJsKHVybCk7XG4gICAgaWYgKHNlcnZlci5fZnNEZW55R2xvYihmaWxlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChzZXJ2ZXIubW9kdWxlR3JhcGguc2FmZU1vZHVsZXNQYXRoLmhhcyhmaWxlKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHNlcnZlci5jb25maWcuc2VydmVyLmZzLmFsbG93LnNvbWUoKGRpcikgPT4gaXNQYXJlbnREaXJlY3RvcnkoZGlyLCBmaWxlKSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGVuc3VyZVNlcnZpbmdBY2Nlc3ModXJsLCBzZXJ2ZXIsIHJlcywgbmV4dCkge1xuICAgIGlmIChpc0ZpbGVTZXJ2aW5nQWxsb3dlZCh1cmwsIHNlcnZlcikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChpc0ZpbGVSZWFkYWJsZShjbGVhblVybCh1cmwpKSkge1xuICAgICAgICBjb25zdCB1cmxNZXNzYWdlID0gYFRoZSByZXF1ZXN0IHVybCBcIiR7dXJsfVwiIGlzIG91dHNpZGUgb2YgVml0ZSBzZXJ2aW5nIGFsbG93IGxpc3QuYDtcbiAgICAgICAgY29uc3QgaGludE1lc3NhZ2UgPSBgXG4ke3NlcnZlci5jb25maWcuc2VydmVyLmZzLmFsbG93Lm1hcCgoaSkgPT4gYC0gJHtpfWApLmpvaW4oJ1xcbicpfVxuXG5SZWZlciB0byBkb2NzIGh0dHBzOi8vdml0ZWpzLmRldi9jb25maWcvc2VydmVyLW9wdGlvbnMuaHRtbCNzZXJ2ZXItZnMtYWxsb3cgZm9yIGNvbmZpZ3VyYXRpb25zIGFuZCBtb3JlIGRldGFpbHMuYDtcbiAgICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIuZXJyb3IodXJsTWVzc2FnZSk7XG4gICAgICAgIHNlcnZlci5jb25maWcubG9nZ2VyLndhcm5PbmNlKGhpbnRNZXNzYWdlICsgJ1xcbicpO1xuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDQwMztcbiAgICAgICAgcmVzLndyaXRlKHJlbmRlclJlc3RyaWN0ZWRFcnJvckhUTUwodXJsTWVzc2FnZSArICdcXG4nICsgaGludE1lc3NhZ2UpKTtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgd2Ugc2hvdWxkbid0IHJlc3RyaWN0IHRoaXMgcGF0aCBhcyBpdCBjYW5cbiAgICAgICAgLy8gYmUgYW4gQVBJIGNhbGwuIE1pZGRsZXdhcmVzIHdvdWxkIGlzc3VlIGEgNDA0IGlmIHRoZSBmaWxlIGlzbid0IGhhbmRsZWRcbiAgICAgICAgbmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiByZW5kZXJSZXN0cmljdGVkRXJyb3JIVE1MKG1zZykge1xuICAgIC8vIHRvIGhhdmUgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgYXV0b2NvbXBsZXRpb24gaW4gSURFXG4gICAgY29uc3QgaHRtbCA9IFN0cmluZy5yYXc7XG4gICAgcmV0dXJuIGh0bWwgYFxuICAgIDxib2R5PlxuICAgICAgPGgxPjQwMyBSZXN0cmljdGVkPC9oMT5cbiAgICAgIDxwPiR7bXNnLnJlcGxhY2UoL1xcbi9nLCAnPGJyLz4nKX08L3A+XG4gICAgICA8c3R5bGU+XG4gICAgICAgIGJvZHkge1xuICAgICAgICAgIHBhZGRpbmc6IDFlbSAyZW07XG4gICAgICAgIH1cbiAgICAgIDwvc3R5bGU+XG4gICAgPC9ib2R5PlxuICBgO1xufVxuXG5jb25zdCBFUlJfTE9BRF9VUkwgPSAnRVJSX0xPQURfVVJMJztcbmNvbnN0IEVSUl9MT0FEX1BVQkxJQ19VUkwgPSAnRVJSX0xPQURfUFVCTElDX1VSTCc7XG5jb25zdCBkZWJ1Z0xvYWQgPSBjcmVhdGVEZWJ1Z2dlcigndml0ZTpsb2FkJyk7XG5jb25zdCBkZWJ1Z1RyYW5zZm9ybSA9IGNyZWF0ZURlYnVnZ2VyKCd2aXRlOnRyYW5zZm9ybScpO1xuY29uc3QgZGVidWdDYWNoZSQxID0gY3JlYXRlRGVidWdnZXIoJ3ZpdGU6Y2FjaGUnKTtcbmNvbnN0IGlzRGVidWckMiA9ICEhcHJvY2Vzcy5lbnYuREVCVUc7XG5mdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KHVybCwgc2VydmVyLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IChvcHRpb25zLnNzciA/ICdzc3I6JyA6IG9wdGlvbnMuaHRtbCA/ICdodG1sOicgOiAnJykgKyB1cmw7XG4gICAgLy8gVGhpcyBtb2R1bGUgbWF5IGdldCBpbnZhbGlkYXRlZCB3aGlsZSB3ZSBhcmUgcHJvY2Vzc2luZyBpdC4gRm9yIGV4YW1wbGVcbiAgICAvLyB3aGVuIGEgZnVsbCBwYWdlIHJlbG9hZCBpcyBuZWVkZWQgYWZ0ZXIgdGhlIHJlLXByb2Nlc3Npbmcgb2YgcHJlLWJ1bmRsZWRcbiAgICAvLyBkZXBlbmRlbmNpZXMgd2hlbiBhIG1pc3NpbmcgZGVwIGlzIGRpc2NvdmVyZWQuIFdlIHNhdmUgdGhlIGN1cnJlbnQgdGltZVxuICAgIC8vIHRvIGNvbXBhcmUgaXQgdG8gdGhlIGxhc3QgaW52YWxpZGF0aW9uIHBlcmZvcm1lZCB0byBrbm93IGlmIHdlIHNob3VsZFxuICAgIC8vIGNhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIG9yIHdlIHNob3VsZCBkaXNjYXJkIGl0IGFzIHN0YWxlLlxuICAgIC8vXG4gICAgLy8gQSBtb2R1bGUgY2FuIGJlIGludmFsaWRhdGVkIGR1ZSB0bzpcbiAgICAvLyAxLiBBIGZ1bGwgcmVsb2FkIGJlY2F1c2Ugb2YgcHJlLWJ1bmRsaW5nIG5ld2x5IGRpc2NvdmVyZWQgZGVwc1xuICAgIC8vIDIuIEEgZnVsbCByZWxvYWQgYWZ0ZXIgYSBjb25maWcgY2hhbmdlXG4gICAgLy8gMy4gVGhlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhlIG1vZHVsZSBjaGFuZ2VkXG4gICAgLy8gNC4gSW52YWxpZGF0aW9uIGZvciBhIHZpcnR1YWwgbW9kdWxlXG4gICAgLy9cbiAgICAvLyBGb3IgMSBhbmQgMiwgYSBuZXcgcmVxdWVzdCBmb3IgdGhpcyBtb2R1bGUgd2lsbCBiZSBpc3N1ZWQgYWZ0ZXJcbiAgICAvLyB0aGUgaW52YWxpZGF0aW9uIGFzIHBhcnQgb2YgdGhlIGJyb3dzZXIgcmVsb2FkaW5nIHRoZSBwYWdlLiBGb3IgMyBhbmQgNFxuICAgIC8vIHRoZXJlIG1heSBub3QgYmUgYSBuZXcgcmVxdWVzdCByaWdodCBhd2F5IGJlY2F1c2Ugb2YgSE1SIGhhbmRsaW5nLlxuICAgIC8vIEluIGFsbCBjYXNlcywgdGhlIG5leHQgdGltZSB0aGlzIG1vZHVsZSBpcyByZXF1ZXN0ZWQsIGl0IHNob3VsZCBiZVxuICAgIC8vIHJlLXByb2Nlc3NlZC5cbiAgICAvL1xuICAgIC8vIFdlIHNhdmUgdGhlIHRpbWVzdGFtcCB3aGVuIHdlIHN0YXJ0IHByb2Nlc3NpbmcgYW5kIGNvbXBhcmUgaXQgd2l0aCB0aGVcbiAgICAvLyBsYXN0IHRpbWUgdGhpcyBtb2R1bGUgaXMgaW52YWxpZGF0ZWRcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHBlbmRpbmcgPSBzZXJ2ZXIuX3BlbmRpbmdSZXF1ZXN0cy5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgIHJldHVybiBzZXJ2ZXIubW9kdWxlR3JhcGhcbiAgICAgICAgICAgIC5nZXRNb2R1bGVCeVVybChyZW1vdmVUaW1lc3RhbXBRdWVyeSh1cmwpLCBvcHRpb25zLnNzcilcbiAgICAgICAgICAgIC50aGVuKChtb2R1bGUpID0+IHtcbiAgICAgICAgICAgIGlmICghbW9kdWxlIHx8IHBlbmRpbmcudGltZXN0YW1wID4gbW9kdWxlLmxhc3RJbnZhbGlkYXRpb25UaW1lc3RhbXApIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcGVuZGluZyByZXF1ZXN0IGlzIHN0aWxsIHZhbGlkLCB3ZSBjYW4gc2FmZWx5IHJldXNlIGl0cyByZXN1bHRcbiAgICAgICAgICAgICAgICByZXR1cm4gcGVuZGluZy5yZXF1ZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUmVxdWVzdCAxIGZvciBtb2R1bGUgQSAgICAgKHBlbmRpbmcudGltZXN0YW1wKVxuICAgICAgICAgICAgICAgIC8vIEludmFsaWRhdGUgbW9kdWxlIEEgICAgICAgIChtb2R1bGUubGFzdEludmFsaWRhdGlvblRpbWVzdGFtcClcbiAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0IDIgZm9yIG1vZHVsZSBBICAgICAodGltZXN0YW1wKVxuICAgICAgICAgICAgICAgIC8vIEZpcnN0IHJlcXVlc3QgaGFzIGJlZW4gaW52YWxpZGF0ZWQsIGFib3J0IGl0IHRvIGNsZWFyIHRoZSBjYWNoZSxcbiAgICAgICAgICAgICAgICAvLyB0aGVuIHBlcmZvcm0gYSBuZXcgZG9UcmFuc2Zvcm0uXG4gICAgICAgICAgICAgICAgcGVuZGluZy5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1SZXF1ZXN0KHVybCwgc2VydmVyLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSBkb1RyYW5zZm9ybSh1cmwsIHNlcnZlciwgb3B0aW9ucywgdGltZXN0YW1wKTtcbiAgICAvLyBBdm9pZCBjbGVhcmluZyB0aGUgY2FjaGUgb2YgZnV0dXJlIHJlcXVlc3RzIGlmIGFib3J0ZWRcbiAgICBsZXQgY2xlYXJlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNsZWFyQ2FjaGUgPSAoKSA9PiB7XG4gICAgICAgIGlmICghY2xlYXJlZCkge1xuICAgICAgICAgICAgc2VydmVyLl9wZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICAgICAgICAgIGNsZWFyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBDYWNoZSB0aGUgcmVxdWVzdCBhbmQgY2xlYXIgaXQgb25jZSBwcm9jZXNzaW5nIGlzIGRvbmVcbiAgICBzZXJ2ZXIuX3BlbmRpbmdSZXF1ZXN0cy5zZXQoY2FjaGVLZXksIHtcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICBhYm9ydDogY2xlYXJDYWNoZSxcbiAgICB9KTtcbiAgICByZXF1ZXN0LnRoZW4oY2xlYXJDYWNoZSwgY2xlYXJDYWNoZSk7XG4gICAgcmV0dXJuIHJlcXVlc3Q7XG59XG5hc3luYyBmdW5jdGlvbiBkb1RyYW5zZm9ybSh1cmwsIHNlcnZlciwgb3B0aW9ucywgdGltZXN0YW1wKSB7XG4gICAgdXJsID0gcmVtb3ZlVGltZXN0YW1wUXVlcnkodXJsKTtcbiAgICBjb25zdCB7IGNvbmZpZywgcGx1Z2luQ29udGFpbmVyIH0gPSBzZXJ2ZXI7XG4gICAgY29uc3QgcHJldHR5VXJsID0gaXNEZWJ1ZyQyID8gcHJldHRpZnlVcmwodXJsLCBjb25maWcucm9vdCkgOiAnJztcbiAgICBjb25zdCBzc3IgPSAhIW9wdGlvbnMuc3NyO1xuICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IHNlcnZlci5tb2R1bGVHcmFwaC5nZXRNb2R1bGVCeVVybCh1cmwsIHNzcik7XG4gICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSBhIGZyZXNoIGNhY2hlXG4gICAgY29uc3QgY2FjaGVkID0gbW9kdWxlICYmIChzc3IgPyBtb2R1bGUuc3NyVHJhbnNmb3JtUmVzdWx0IDogbW9kdWxlLnRyYW5zZm9ybVJlc3VsdCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAvLyBUT0RPOiBjaGVjayBpZiB0aGUgbW9kdWxlIGlzIFwicGFydGlhbGx5IGludmFsaWRhdGVkXCIgLSBpLmUuIGFuIGltcG9ydFxuICAgICAgICAvLyBkb3duIHRoZSBjaGFpbiBoYXMgYmVlbiBmdWxseSBpbnZhbGlkYXRlZCwgYnV0IHRoaXMgY3VycmVudCBtb2R1bGUnc1xuICAgICAgICAvLyBjb250ZW50IGhhcyBub3QgY2hhbmdlZC5cbiAgICAgICAgLy8gaW4gdGhpcyBjYXNlLCB3ZSBjYW4gcmV1c2UgaXRzIHByZXZpb3VzIGNhY2hlZCByZXN1bHQgYW5kIG9ubHkgdXBkYXRlXG4gICAgICAgIC8vIGl0cyBpbXBvcnQgdGltZXN0YW1wcy5cbiAgICAgICAgaXNEZWJ1ZyQyICYmIGRlYnVnQ2FjaGUkMShgW21lbW9yeV0gJHtwcmV0dHlVcmx9YCk7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIC8vIHJlc29sdmVcbiAgICBjb25zdCBpZCA9IChhd2FpdCBwbHVnaW5Db250YWluZXIucmVzb2x2ZUlkKHVybCwgdW5kZWZpbmVkLCB7IHNzciB9KSk/LmlkIHx8IHVybDtcbiAgICBjb25zdCByZXN1bHQgPSBsb2FkQW5kVHJhbnNmb3JtKGlkLCB1cmwsIHNlcnZlciwgb3B0aW9ucywgdGltZXN0YW1wKTtcbiAgICBnZXREZXBzT3B0aW1pemVyKGNvbmZpZywgc3NyKT8uZGVsYXlEZXBzT3B0aW1pemVyVW50aWwoaWQsICgpID0+IHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmFzeW5jIGZ1bmN0aW9uIGxvYWRBbmRUcmFuc2Zvcm0oaWQsIHVybCwgc2VydmVyLCBvcHRpb25zLCB0aW1lc3RhbXApIHtcbiAgICBjb25zdCB7IGNvbmZpZywgcGx1Z2luQ29udGFpbmVyLCBtb2R1bGVHcmFwaCwgd2F0Y2hlciB9ID0gc2VydmVyO1xuICAgIGNvbnN0IHsgcm9vdCwgbG9nZ2VyIH0gPSBjb25maWc7XG4gICAgY29uc3QgcHJldHR5VXJsID0gaXNEZWJ1ZyQyID8gcHJldHRpZnlVcmwodXJsLCBjb25maWcucm9vdCkgOiAnJztcbiAgICBjb25zdCBzc3IgPSAhIW9wdGlvbnMuc3NyO1xuICAgIGNvbnN0IGZpbGUgPSBjbGVhblVybChpZCk7XG4gICAgbGV0IGNvZGUgPSBudWxsO1xuICAgIGxldCBtYXAgPSBudWxsO1xuICAgIC8vIGxvYWRcbiAgICBjb25zdCBsb2FkU3RhcnQgPSBpc0RlYnVnJDIgPyBwZXJmb3JtYW5jZS5ub3coKSA6IDA7XG4gICAgY29uc3QgbG9hZFJlc3VsdCA9IGF3YWl0IHBsdWdpbkNvbnRhaW5lci5sb2FkKGlkLCB7IHNzciB9KTtcbiAgICBpZiAobG9hZFJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gaHRtbCByZXF1ZXN0IGFuZCB0aGVyZSBpcyBubyBsb2FkIHJlc3VsdCwgc2tpcCBhaGVhZCB0b1xuICAgICAgICAvLyBTUEEgZmFsbGJhY2suXG4gICAgICAgIGlmIChvcHRpb25zLmh0bWwgJiYgIWlkLmVuZHNXaXRoKCcuaHRtbCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyB0cnkgZmFsbGJhY2sgbG9hZGluZyBpdCBmcm9tIGZzIGFzIHN0cmluZ1xuICAgICAgICAvLyBpZiB0aGUgZmlsZSBpcyBhIGJpbmFyeSwgdGhlcmUgc2hvdWxkIGJlIGEgcGx1Z2luIHRoYXQgYWxyZWFkeSBsb2FkZWQgaXRcbiAgICAgICAgLy8gYXMgc3RyaW5nXG4gICAgICAgIC8vIG9ubHkgdHJ5IHRoZSBmYWxsYmFjayBpZiBhY2Nlc3MgaXMgYWxsb3dlZCwgc2tpcCBmb3Igb3V0IG9mIHJvb3QgdXJsXG4gICAgICAgIC8vIGxpa2UgL3NlcnZpY2Utd29ya2VyLmpzIG9yIC9hcGkvdXNlcnNcbiAgICAgICAgaWYgKG9wdGlvbnMuc3NyIHx8IGlzRmlsZVNlcnZpbmdBbGxvd2VkKGZpbGUsIHNlcnZlcikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29kZSA9IGF3YWl0IHByb21pc2VzJDIucmVhZEZpbGUoZmlsZSwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICAgICAgaXNEZWJ1ZyQyICYmIGRlYnVnTG9hZChgJHt0aW1lRnJvbShsb2FkU3RhcnQpfSBbZnNdICR7cHJldHR5VXJsfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBtYXAgPSAoY29udmVydFNvdXJjZU1hcC5mcm9tU291cmNlKGNvZGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCBjb252ZXJ0U291cmNlTWFwLmZyb21NYXBGaWxlU291cmNlKGNvZGUsIGNyZWF0ZUNvbnZlcnRTb3VyY2VNYXBSZWFkTWFwKGZpbGUpKSkpPy50b09iamVjdCgpO1xuICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoY29udmVydFNvdXJjZU1hcC5tYXBGaWxlQ29tbWVudFJlZ2V4LCBibGFua1JlcGxhY2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBsb2FkIHNvdXJjZSBtYXAgZm9yICR7dXJsfS5gLCB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaXNEZWJ1ZyQyICYmIGRlYnVnTG9hZChgJHt0aW1lRnJvbShsb2FkU3RhcnQpfSBbcGx1Z2luXSAke3ByZXR0eVVybH1gKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0JDIobG9hZFJlc3VsdCkpIHtcbiAgICAgICAgICAgIGNvZGUgPSBsb2FkUmVzdWx0LmNvZGU7XG4gICAgICAgICAgICBtYXAgPSBsb2FkUmVzdWx0Lm1hcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvZGUgPSBsb2FkUmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb2RlID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgaXNQdWJsaWNGaWxlID0gY2hlY2tQdWJsaWNGaWxlKHVybCwgY29uZmlnKTtcbiAgICAgICAgY29uc3QgbXNnID0gaXNQdWJsaWNGaWxlXG4gICAgICAgICAgICA/IGBUaGlzIGZpbGUgaXMgaW4gL3B1YmxpYyBhbmQgd2lsbCBiZSBjb3BpZWQgYXMtaXMgZHVyaW5nIGJ1aWxkIHdpdGhvdXQgYCArXG4gICAgICAgICAgICAgICAgYGdvaW5nIHRocm91Z2ggdGhlIHBsdWdpbiB0cmFuc2Zvcm1zLCBhbmQgdGhlcmVmb3JlIHNob3VsZCBub3QgYmUgYCArXG4gICAgICAgICAgICAgICAgYGltcG9ydGVkIGZyb20gc291cmNlIGNvZGUuIEl0IGNhbiBvbmx5IGJlIHJlZmVyZW5jZWQgdmlhIEhUTUwgdGFncy5gXG4gICAgICAgICAgICA6IGBEb2VzIHRoZSBmaWxlIGV4aXN0P2A7XG4gICAgICAgIGNvbnN0IGltcG9ydGVyTW9kID0gc2VydmVyLm1vZHVsZUdyYXBoLmlkVG9Nb2R1bGVNYXBcbiAgICAgICAgICAgIC5nZXQoaWQpXG4gICAgICAgICAgICA/LmltcG9ydGVycy52YWx1ZXMoKVxuICAgICAgICAgICAgLm5leHQoKS52YWx1ZTtcbiAgICAgICAgY29uc3QgaW1wb3J0ZXIgPSBpbXBvcnRlck1vZD8uZmlsZSB8fCBpbXBvcnRlck1vZD8udXJsO1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHVybCAke3VybH0gKHJlc29sdmVkIGlkOiAke2lkfSkke2ltcG9ydGVyID8gYCBpbiAke2ltcG9ydGVyfWAgOiAnJ30uICR7bXNnfWApO1xuICAgICAgICBlcnIuY29kZSA9IGlzUHVibGljRmlsZSA/IEVSUl9MT0FEX1BVQkxJQ19VUkwgOiBFUlJfTE9BRF9VUkw7XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgLy8gZW5zdXJlIG1vZHVsZSBpbiBncmFwaCBhZnRlciBzdWNjZXNzZnVsIGxvYWRcbiAgICBjb25zdCBtb2QgPSBhd2FpdCBtb2R1bGVHcmFwaC5lbnN1cmVFbnRyeUZyb21VcmwodXJsLCBzc3IpO1xuICAgIGVuc3VyZVdhdGNoZWRGaWxlKHdhdGNoZXIsIG1vZC5maWxlLCByb290KTtcbiAgICAvLyB0cmFuc2Zvcm1cbiAgICBjb25zdCB0cmFuc2Zvcm1TdGFydCA9IGlzRGVidWckMiA/IHBlcmZvcm1hbmNlLm5vdygpIDogMDtcbiAgICBjb25zdCB0cmFuc2Zvcm1SZXN1bHQgPSBhd2FpdCBwbHVnaW5Db250YWluZXIudHJhbnNmb3JtKGNvZGUsIGlkLCB7XG4gICAgICAgIGluTWFwOiBtYXAsXG4gICAgICAgIHNzcixcbiAgICB9KTtcbiAgICBjb25zdCBvcmlnaW5hbENvZGUgPSBjb2RlO1xuICAgIGlmICh0cmFuc2Zvcm1SZXN1bHQgPT0gbnVsbCB8fFxuICAgICAgICAoaXNPYmplY3QkMih0cmFuc2Zvcm1SZXN1bHQpICYmIHRyYW5zZm9ybVJlc3VsdC5jb2RlID09IG51bGwpKSB7XG4gICAgICAgIC8vIG5vIHRyYW5zZm9ybSBhcHBsaWVkLCBrZWVwIGNvZGUgYXMtaXNcbiAgICAgICAgaXNEZWJ1ZyQyICYmXG4gICAgICAgICAgICBkZWJ1Z1RyYW5zZm9ybSh0aW1lRnJvbSh0cmFuc2Zvcm1TdGFydCkgKyBwaWNvY29sb3JzRXhwb3J0cy5kaW0oYCBbc2tpcHBlZF0gJHtwcmV0dHlVcmx9YCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaXNEZWJ1ZyQyICYmIGRlYnVnVHJhbnNmb3JtKGAke3RpbWVGcm9tKHRyYW5zZm9ybVN0YXJ0KX0gJHtwcmV0dHlVcmx9YCk7XG4gICAgICAgIGNvZGUgPSB0cmFuc2Zvcm1SZXN1bHQuY29kZTtcbiAgICAgICAgbWFwID0gdHJhbnNmb3JtUmVzdWx0Lm1hcDtcbiAgICB9XG4gICAgaWYgKG1hcCAmJiBtb2QuZmlsZSkge1xuICAgICAgICBtYXAgPSAodHlwZW9mIG1hcCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKG1hcCkgOiBtYXApO1xuICAgICAgICBpZiAobWFwLm1hcHBpbmdzICYmICFtYXAuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgICAgICAgIGF3YWl0IGluamVjdFNvdXJjZXNDb250ZW50KG1hcCwgbW9kLmZpbGUsIGxvZ2dlcik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgc291cmNlc0luZGV4ID0gMDsgc291cmNlc0luZGV4IDwgbWFwLnNvdXJjZXMubGVuZ3RoOyArK3NvdXJjZXNJbmRleCkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlUGF0aCA9IG1hcC5zb3VyY2VzW3NvdXJjZXNJbmRleF07XG4gICAgICAgICAgICBpZiAoIXNvdXJjZVBhdGgpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VtYXBQYXRoID0gYCR7bW9kLmZpbGV9Lm1hcGA7XG4gICAgICAgICAgICBjb25zdCBpZ25vcmVMaXN0ID0gY29uZmlnLnNlcnZlci5zb3VyY2VtYXBJZ25vcmVMaXN0KHBhdGgkby5pc0Fic29sdXRlKHNvdXJjZVBhdGgpXG4gICAgICAgICAgICAgICAgPyBzb3VyY2VQYXRoXG4gICAgICAgICAgICAgICAgOiBwYXRoJG8ucmVzb2x2ZShwYXRoJG8uZGlybmFtZShzb3VyY2VtYXBQYXRoKSwgc291cmNlUGF0aCksIHNvdXJjZW1hcFBhdGgpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZ25vcmVMaXN0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2Fybignc291cmNlbWFwSWdub3JlTGlzdCBmdW5jdGlvbiBtdXN0IHJldHVybiBhIGJvb2xlYW4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaWdub3JlTGlzdCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXAueF9nb29nbGVfaWdub3JlTGlzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcC54X2dvb2dsZV9pZ25vcmVMaXN0ID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbWFwLnhfZ29vZ2xlX2lnbm9yZUxpc3QuaW5jbHVkZXMoc291cmNlc0luZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICBtYXAueF9nb29nbGVfaWdub3JlTGlzdC5wdXNoKHNvdXJjZXNJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmV3cml0ZSBzb3VyY2VzIHRvIHJlbGF0aXZlIHBhdGhzIHRvIGdpdmUgZGVidWdnZXJzIHRoZSBjaGFuY2VcbiAgICAgICAgICAgIC8vIHRvIHJlc29sdmUgYW5kIGRpc3BsYXkgdGhlbSBpbiBhIG1lYW5pbmdmdWwgd2F5IChyYXRoZXIgdGhhblxuICAgICAgICAgICAgLy8gd2l0aCBhYnNvbHV0ZSBwYXRocykuXG4gICAgICAgICAgICBpZiAocGF0aCRvLmlzQWJzb2x1dGUoc291cmNlUGF0aCkgJiYgcGF0aCRvLmlzQWJzb2x1dGUobW9kLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgbWFwLnNvdXJjZXNbc291cmNlc0luZGV4XSA9IHBhdGgkby5yZWxhdGl2ZShwYXRoJG8uZGlybmFtZShtb2QuZmlsZSksIHNvdXJjZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHNzciAmJiAhc2VydmVyLmNvbmZpZy5leHBlcmltZW50YWwuc2tpcFNzclRyYW5zZm9ybVxuICAgICAgICA/IGF3YWl0IHNlcnZlci5zc3JUcmFuc2Zvcm0oY29kZSwgbWFwLCB1cmwsIG9yaWdpbmFsQ29kZSlcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgbWFwLFxuICAgICAgICAgICAgZXRhZzogZXRhZ18xKGNvZGUsIHsgd2VhazogdHJ1ZSB9KSxcbiAgICAgICAgfTtcbiAgICAvLyBPbmx5IGNhY2hlIHRoZSByZXN1bHQgaWYgdGhlIG1vZHVsZSB3YXNuJ3QgaW52YWxpZGF0ZWQgd2hpbGUgaXQgd2FzXG4gICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBpdCBpcyByZS1wcm9jZXNzZWQgbmV4dCB0aW1lIGlmIGl0IGlzIHN0YWxlXG4gICAgaWYgKHRpbWVzdGFtcCA+IG1vZC5sYXN0SW52YWxpZGF0aW9uVGltZXN0YW1wKSB7XG4gICAgICAgIGlmIChzc3IpXG4gICAgICAgICAgICBtb2Quc3NyVHJhbnNmb3JtUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtb2QudHJhbnNmb3JtUmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY3JlYXRlQ29udmVydFNvdXJjZU1hcFJlYWRNYXAob3JpZ2luYWxGaWxlTmFtZSkge1xuICAgIHJldHVybiAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VzJDIucmVhZEZpbGUocGF0aCRvLnJlc29sdmUocGF0aCRvLmRpcm5hbWUob3JpZ2luYWxGaWxlTmFtZSksIGZpbGVuYW1lKSwgJ3V0Zi04Jyk7XG4gICAgfTtcbn1cblxuY29uc3QgaXNEZWJ1ZyQxID0gISFwcm9jZXNzLmVudi5ERUJVRztcbmNvbnN0IGRlYnVnJDkgPSBjcmVhdGVEZWJ1Z2dlcigndml0ZTppbXBvcnQtYW5hbHlzaXMnKTtcbmNvbnN0IGNsaWVudERpciA9IG5vcm1hbGl6ZVBhdGgkMyhDTElFTlRfRElSKTtcbmNvbnN0IHNraXBSRSA9IC9cXC4oPzptYXB8anNvbikoPzokfFxcPykvO1xuY29uc3QgY2FuU2tpcEltcG9ydEFuYWx5c2lzID0gKGlkKSA9PiBza2lwUkUudGVzdChpZCkgfHwgaXNEaXJlY3RDU1NSZXF1ZXN0KGlkKTtcbmNvbnN0IG9wdGltaXplZERlcENodW5rUkUkMSA9IC9cXC9jaHVuay1bQS1aXFxkXXs4fVxcLmpzLztcbmNvbnN0IG9wdGltaXplZERlcER5bmFtaWNSRSQxID0gLy1bQS1aXFxkXXs4fVxcLmpzLztcbmZ1bmN0aW9uIGlzRXhwbGljaXRJbXBvcnRSZXF1aXJlZCh1cmwpIHtcbiAgICByZXR1cm4gIWlzSlNSZXF1ZXN0KGNsZWFuVXJsKHVybCkpICYmICFpc0NTU1JlcXVlc3QodXJsKTtcbn1cbmZ1bmN0aW9uIG1hcmtFeHBsaWNpdEltcG9ydCh1cmwpIHtcbiAgICBpZiAoaXNFeHBsaWNpdEltcG9ydFJlcXVpcmVkKHVybCkpIHtcbiAgICAgICAgcmV0dXJuIGluamVjdFF1ZXJ5KHVybCwgJ2ltcG9ydCcpO1xuICAgIH1cbiAgICByZXR1cm4gdXJsO1xufVxuZnVuY3Rpb24gZXh0cmFjdEltcG9ydGVkQmluZGluZ3MoaWQsIHNvdXJjZSwgaW1wb3J0U3BlYywgaW1wb3J0ZWRCaW5kaW5ncykge1xuICAgIGxldCBiaW5kaW5ncyA9IGltcG9ydGVkQmluZGluZ3MuZ2V0KGlkKTtcbiAgICBpZiAoIWJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmdzID0gbmV3IFNldCgpO1xuICAgICAgICBpbXBvcnRlZEJpbmRpbmdzLnNldChpZCwgYmluZGluZ3MpO1xuICAgIH1cbiAgICBjb25zdCBpc0R5bmFtaWMgPSBpbXBvcnRTcGVjLmQgPiAtMTtcbiAgICBjb25zdCBpc01ldGEgPSBpbXBvcnRTcGVjLmQgPT09IC0yO1xuICAgIGlmIChpc0R5bmFtaWMgfHwgaXNNZXRhKSB7XG4gICAgICAgIC8vIHRoaXMgYmFzaWNhbGx5IG1lYW5zIHRoZSBtb2R1bGUgd2lsbCBiZSBpbXBhY3RlZCBieSBhbnkgY2hhbmdlIGluIGl0cyBkZXBcbiAgICAgICAgYmluZGluZ3MuYWRkKCcqJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhwID0gc291cmNlLnNsaWNlKGltcG9ydFNwZWMuc3MsIGltcG9ydFNwZWMuc2UpO1xuICAgIGNvbnN0IFttYXRjaDBdID0gZmluZFN0YXRpY0ltcG9ydHMoZXhwKTtcbiAgICBpZiAoIW1hdGNoMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlU3RhdGljSW1wb3J0KG1hdGNoMCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLm5hbWVzcGFjZWRJbXBvcnQpIHtcbiAgICAgICAgYmluZGluZ3MuYWRkKCcqJyk7XG4gICAgfVxuICAgIGlmIChwYXJzZWQuZGVmYXVsdEltcG9ydCkge1xuICAgICAgICBiaW5kaW5ncy5hZGQoJ2RlZmF1bHQnKTtcbiAgICB9XG4gICAgaWYgKHBhcnNlZC5uYW1lZEltcG9ydHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHBhcnNlZC5uYW1lZEltcG9ydHMpKSB7XG4gICAgICAgICAgICBiaW5kaW5ncy5hZGQobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFNlcnZlci1vbmx5IHBsdWdpbiB0aGF0IGxleGVzLCByZXNvbHZlcywgcmV3cml0ZXMgYW5kIGFuYWx5emVzIHVybCBpbXBvcnRzLlxuICpcbiAqIC0gSW1wb3J0cyBhcmUgcmVzb2x2ZWQgdG8gZW5zdXJlIHRoZXkgZXhpc3Qgb24gZGlza1xuICpcbiAqIC0gTGV4ZXMgSE1SIGFjY2VwdCBjYWxscyBhbmQgdXBkYXRlcyBpbXBvcnQgcmVsYXRpb25zaGlwcyBpbiB0aGUgbW9kdWxlIGdyYXBoXG4gKlxuICogLSBCYXJlIG1vZHVsZSBpbXBvcnRzIGFyZSByZXNvbHZlZCAoYnkgQHJvbGx1cC1wbHVnaW4vbm9kZS1yZXNvbHZlKSB0b1xuICogYWJzb2x1dGUgZmlsZSBwYXRocywgZS5nLlxuICpcbiAqICAgICBgYGBqc1xuICogICAgIGltcG9ydCAnZm9vJ1xuICogICAgIGBgYFxuICogICAgIGlzIHJld3JpdHRlbiB0b1xuICogICAgIGBgYGpzXG4gKiAgICAgaW1wb3J0ICcvQGZzLy9wcm9qZWN0L25vZGVfbW9kdWxlcy9mb28vZGlzdC9mb28uanMnXG4gKiAgICAgYGBgXG4gKlxuICogLSBDU1MgaW1wb3J0cyBhcmUgYXBwZW5kZWQgd2l0aCBgLmpzYCBzaW5jZSBib3RoIHRoZSBqcyBtb2R1bGUgYW5kIHRoZSBhY3R1YWxcbiAqIGNzcyAocmVmZXJlbmNlZCB2aWEgYDxsaW5rPmApIG1heSBnbyB0aHJvdWdoIHRoZSB0cmFuc2Zvcm0gcGlwZWxpbmU6XG4gKlxuICogICAgIGBgYGpzXG4gKiAgICAgaW1wb3J0ICcuL3N0eWxlLmNzcydcbiAqICAgICBgYGBcbiAqICAgICBpcyByZXdyaXR0ZW4gdG9cbiAqICAgICBgYGBqc1xuICogICAgIGltcG9ydCAnLi9zdHlsZS5jc3MuanMnXG4gKiAgICAgYGBgXG4gKi9cbmZ1bmN0aW9uIGltcG9ydEFuYWx5c2lzUGx1Z2luKGNvbmZpZykge1xuICAgIGNvbnN0IHsgcm9vdCwgYmFzZSB9ID0gY29uZmlnO1xuICAgIGNvbnN0IGNsaWVudFB1YmxpY1BhdGggPSBwYXRoJG8ucG9zaXguam9pbihiYXNlLCBDTElFTlRfUFVCTElDX1BBVEgpO1xuICAgIGNvbnN0IGVuYWJsZVBhcnRpYWxBY2NlcHQgPSBjb25maWcuZXhwZXJpbWVudGFsPy5obXJQYXJ0aWFsQWNjZXB0O1xuICAgIGxldCBzZXJ2ZXI7XG4gICAgbGV0IF9lbnY7XG4gICAgZnVuY3Rpb24gZ2V0RW52KHNzcikge1xuICAgICAgICBpZiAoIV9lbnYpIHtcbiAgICAgICAgICAgIF9lbnYgPSBgaW1wb3J0Lm1ldGEuZW52ID0gJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgLi4uY29uZmlnLmVudixcbiAgICAgICAgICAgICAgICBTU1I6ICdfX3ZpdGVfX3Nzcl9fJyxcbiAgICAgICAgICAgIH0pfTtgO1xuICAgICAgICAgICAgLy8gYWNjb3VudCBmb3IgdXNlciBlbnYgZGVmaW5lc1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29uZmlnLmRlZmluZSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChgaW1wb3J0Lm1ldGEuZW52LmApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNvbmZpZy5kZWZpbmVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgX2VudiArPSBgJHtrZXl9ID0gJHt0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IHZhbCA6IEpTT04uc3RyaW5naWZ5KHZhbCl9O2A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfZW52LnJlcGxhY2UoJ1wiX192aXRlX19zc3JfX1wiJywgc3NyICsgJycpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTppbXBvcnQtYW5hbHlzaXMnLFxuICAgICAgICBjb25maWd1cmVTZXJ2ZXIoX3NlcnZlcikge1xuICAgICAgICAgICAgc2VydmVyID0gX3NlcnZlcjtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgdHJhbnNmb3JtKHNvdXJjZSwgaW1wb3J0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIEluIGEgcmVhbCBhcHAgYHNlcnZlcmAgaXMgYWx3YXlzIGRlZmluZWQsIGJ1dCBpdCBpcyB1bmRlZmluZWQgd2hlblxuICAgICAgICAgICAgLy8gcnVubmluZyBzcmMvbm9kZS9zZXJ2ZXIvX190ZXN0c19fL3BsdWdpbkNvbnRhaW5lci5zcGVjLnRzXG4gICAgICAgICAgICBpZiAoIXNlcnZlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3NyID0gb3B0aW9ucz8uc3NyID09PSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgcHJldHR5SW1wb3J0ZXIgPSBwcmV0dGlmeVVybChpbXBvcnRlciwgcm9vdCk7XG4gICAgICAgICAgICBpZiAoY2FuU2tpcEltcG9ydEFuYWx5c2lzKGltcG9ydGVyKSkge1xuICAgICAgICAgICAgICAgIGlzRGVidWckMSAmJiBkZWJ1ZyQ5KHBpY29jb2xvcnNFeHBvcnRzLmRpbShgW3NraXBwZWRdICR7cHJldHR5SW1wb3J0ZXJ9YCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgIGF3YWl0IGluaXQ7XG4gICAgICAgICAgICBsZXQgaW1wb3J0cztcbiAgICAgICAgICAgIGxldCBleHBvcnRzO1xuICAgICAgICAgICAgc291cmNlID0gc3RyaXBCb21UYWcoc291cmNlKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgW2ltcG9ydHMsIGV4cG9ydHNdID0gcGFyc2UkZShzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1Z1ZSA9IGltcG9ydGVyLmVuZHNXaXRoKCcudnVlJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNKc3ggPSBpbXBvcnRlci5lbmRzV2l0aCgnLmpzeCcpIHx8IGltcG9ydGVyLmVuZHNXaXRoKCcudHN4Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF5YmVKU1ggPSAhaXNWdWUgJiYgaXNKU1JlcXVlc3QoaW1wb3J0ZXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGlzVnVlXG4gICAgICAgICAgICAgICAgICAgID8gYEluc3RhbGwgQHZpdGVqcy9wbHVnaW4tdnVlIHRvIGhhbmRsZSAudnVlIGZpbGVzLmBcbiAgICAgICAgICAgICAgICAgICAgOiBtYXliZUpTWFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBpc0pzeFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYElmIHlvdSB1c2UgdHNjb25maWcuanNvbiwgbWFrZSBzdXJlIHRvIG5vdCBzZXQganN4IHRvIHByZXNlcnZlLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGBJZiB5b3UgYXJlIHVzaW5nIEpTWCwgbWFrZSBzdXJlIHRvIG5hbWUgdGhlIGZpbGUgd2l0aCB0aGUgLmpzeCBvciAudHN4IGV4dGVuc2lvbi5gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBZb3UgbWF5IG5lZWQgdG8gaW5zdGFsbCBhcHByb3ByaWF0ZSBwbHVnaW5zIHRvIGhhbmRsZSB0aGUgJHtwYXRoJG8uZXh0bmFtZShpbXBvcnRlcil9IGZpbGUgZm9ybWF0LCBvciBpZiBpdCdzIGFuIGFzc2V0LCBhZGQgXCIqKi8qJHtwYXRoJG8uZXh0bmFtZShpbXBvcnRlcil9XCIgdG8gXFxgYXNzZXRzSW5jbHVkZVxcYCBpbiB5b3VyIGNvbmZpZ3VyYXRpb24uYDtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBGYWlsZWQgdG8gcGFyc2Ugc291cmNlIGZvciBpbXBvcnQgYW5hbHlzaXMgYmVjYXVzZSB0aGUgY29udGVudCBgICtcbiAgICAgICAgICAgICAgICAgICAgYGNvbnRhaW5zIGludmFsaWQgSlMgc3ludGF4LiBgICtcbiAgICAgICAgICAgICAgICAgICAgbXNnLCBlLmlkeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkZXBzT3B0aW1pemVyID0gZ2V0RGVwc09wdGltaXplcihjb25maWcsIHNzcik7XG4gICAgICAgICAgICBjb25zdCB7IG1vZHVsZUdyYXBoIH0gPSBzZXJ2ZXI7XG4gICAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgdHJhbnNmb3JtIHBoYXNlIG9mIHRoZSBpbXBvcnRlciwgaXQgbXVzdFxuICAgICAgICAgICAgLy8gaGF2ZSBiZWVuIGxvYWRlZCBzbyBpdHMgZW50cnkgaXMgZ3VhcmFudGVlZCBpbiB0aGUgbW9kdWxlIGdyYXBoLlxuICAgICAgICAgICAgY29uc3QgaW1wb3J0ZXJNb2R1bGUgPSBtb2R1bGVHcmFwaC5nZXRNb2R1bGVCeUlkKGltcG9ydGVyKTtcbiAgICAgICAgICAgIGlmICghaW1wb3J0ZXJNb2R1bGUgJiYgZGVwc09wdGltaXplcj8uaXNPcHRpbWl6ZWREZXBGaWxlKGltcG9ydGVyKSkge1xuICAgICAgICAgICAgICAgIC8vIElkcyBvZiBvcHRpbWl6ZWQgZGVwcyBjb3VsZCBiZSBpbnZhbGlkYXRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBncmFwaFxuICAgICAgICAgICAgICAgIC8vIFJldHVybiB3aXRob3V0IHRyYW5zZm9ybWluZywgdGhpcyByZXF1ZXN0IGlzIG5vIGxvbmdlciB2YWxpZCwgYSBmdWxsIHJlbG9hZFxuICAgICAgICAgICAgICAgIC8vIGlzIGdvaW5nIHRvIHJlcXVlc3QgdGhpcyBpZCBhZ2Fpbi4gVGhyb3dpbmcgYW4gb3V0ZGF0ZWQgZXJyb3Igc28gd2VcbiAgICAgICAgICAgICAgICAvLyBwcm9wZXJseSBmaW5pc2ggdGhlIHJlcXVlc3Qgd2l0aCBhIDUwNCBzZW50IHRvIHRoZSBicm93c2VyLlxuICAgICAgICAgICAgICAgIHRocm93T3V0ZGF0ZWRSZXF1ZXN0KGltcG9ydGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaW1wb3J0cy5sZW5ndGggJiYgIXRoaXMuX2FkZGVkSW1wb3J0cykge1xuICAgICAgICAgICAgICAgIGltcG9ydGVyTW9kdWxlLmlzU2VsZkFjY2VwdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlzRGVidWckMSAmJlxuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyQ5KGAke3RpbWVGcm9tKHN0YXJ0KX0gJHtwaWNvY29sb3JzRXhwb3J0cy5kaW0oYFtubyBpbXBvcnRzXSAke3ByZXR0eUltcG9ydGVyfWApfWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaGFzSE1SID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaXNTZWxmQWNjZXB0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaGFzRW52ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbmVlZFF1ZXJ5SW5qZWN0SGVscGVyID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcztcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9ICgpID0+IHMgfHwgKHMgPSBuZXcgTWFnaWNTdHJpbmcoc291cmNlKSk7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnRlZFVybHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBjb25zdCBzdGF0aWNJbXBvcnRlZFVybHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBjb25zdCBhY2NlcHRlZFVybHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBsZXQgaXNQYXJ0aWFsbHlTZWxmQWNjZXB0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBhY2NlcHRlZEV4cG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnRlZEJpbmRpbmdzID0gZW5hYmxlUGFydGlhbEFjY2VwdFxuICAgICAgICAgICAgICAgID8gbmV3IE1hcCgpXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgY29uc3QgdG9BYnNvbHV0ZVVybCA9ICh1cmwpID0+IHBhdGgkby5wb3NpeC5yZXNvbHZlKHBhdGgkby5wb3NpeC5kaXJuYW1lKGltcG9ydGVyTW9kdWxlLnVybCksIHVybCk7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVVcmwgPSBhc3luYyAodXJsLCBwb3MsIGZvcmNlU2tpcEltcG9ydEFuYWx5c2lzID0gZmFsc2UpID0+IHtcbiAgICAgICAgICAgICAgICB1cmwgPSBzdHJpcEJhc2UodXJsLCBiYXNlKTtcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0ZXJGaWxlID0gaW1wb3J0ZXI7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW1pemVEZXBzID0gZ2V0RGVwT3B0aW1pemF0aW9uQ29uZmlnKGNvbmZpZywgc3NyKTtcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlTGlzdENvbnRhaW5zKG9wdGltaXplRGVwcz8uZXhjbHVkZSwgdXJsKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVwc09wdGltaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVwc09wdGltaXplci5zY2FuUHJvY2Vzc2luZztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBkZXBlbmRlbmN5IGVuY291bnRlcmVkIGluIHRoZSBvcHRpbWl6ZWQgZmlsZSB3YXMgZXhjbHVkZWQgZnJvbSB0aGUgb3B0aW1pemF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVwZW5kZW5jeSBuZWVkcyB0byBiZSByZXNvbHZlZCBzdGFydGluZyBmcm9tIHRoZSBvcmlnaW5hbCBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIG9wdGltaXplZCBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHN0YXJ0aW5nIGZyb20gbm9kZV9tb2R1bGVzLy52aXRlIHdpbGwgbm90IGZpbmQgdGhlIGRlcGVuZGVuY3kgaWYgaXQgd2FzIG5vdCBob2lzdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhhdCBpcywgaWYgaXQgaXMgdW5kZXIgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBpbiB0aGUgcGFja2FnZSBzb3VyY2Ugb2YgdGhlIG9wdGltaXplZCBmaWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpbWl6ZWRNb2R1bGUgb2YgZGVwc09wdGltaXplci5tZXRhZGF0YS5kZXBJbmZvTGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW1pemVkTW9kdWxlLnNyYylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIElnbm9yZSBjaHVua3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW1pemVkTW9kdWxlLmZpbGUgPT09IGltcG9ydGVyTW9kdWxlLmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZXJGaWxlID0gb3B0aW1pemVkTW9kdWxlLnNyYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLnJlc29sdmUodXJsLCBpbXBvcnRlckZpbGUpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4gc3NyLCB3ZSBzaG91bGQgbGV0IG5vZGUgaGFuZGxlIHRoZSBtaXNzaW5nIG1vZHVsZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNzcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt1cmwsIHVybF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZml4Izk1MzQsIHByZXZlbnQgdGhlIGltcG9ydGVyTW9kdWxlTm9kZSBiZWluZyBzdG9wcGVkIGZyb20gcHJvcGFnYXRpbmcgdXBkYXRlc1xuICAgICAgICAgICAgICAgICAgICBpbXBvcnRlck1vZHVsZS5pc1NlbGZBY2NlcHRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIGltcG9ydCBcIiR7dXJsfVwiIGZyb20gXCIke3BhdGgkby5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBpbXBvcnRlckZpbGUpfVwiLiBEb2VzIHRoZSBmaWxlIGV4aXN0P2AsIHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVsYXRpdmUgPSB1cmwuc3RhcnRzV2l0aCgnLicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZkltcG9ydCA9ICFpc1JlbGF0aXZlICYmIGNsZWFuVXJsKHVybCkgPT09IGNsZWFuVXJsKGltcG9ydGVyKTtcbiAgICAgICAgICAgICAgICAvLyBub3JtYWxpemUgYWxsIGltcG9ydHMgaW50byByZXNvbHZlZCBVUkxzXG4gICAgICAgICAgICAgICAgLy8gZS5nLiBgaW1wb3J0ICdmb28nYCAtPiBgaW1wb3J0ICcvQGZzLy4uLi9ub2RlX21vZHVsZXMvZm9vL2luZGV4LmpzJ2BcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuaWQuc3RhcnRzV2l0aChyb290ICsgJy8nKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbiByb290OiBpbmZlciBzaG9ydCBhYnNvbHV0ZSBwYXRoIGZyb20gcm9vdFxuICAgICAgICAgICAgICAgICAgICB1cmwgPSByZXNvbHZlZC5pZC5zbGljZShyb290Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc29sdmVkLmlkLnN0YXJ0c1dpdGgoZ2V0RGVwc0NhY2hlRGlyUHJlZml4KGNvbmZpZykpIHx8XG4gICAgICAgICAgICAgICAgICAgIGZzJGwuZXhpc3RzU3luYyhjbGVhblVybChyZXNvbHZlZC5pZCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFuIG9wdGltaXplZCBkZXBzIG1heSBub3QgeWV0IGV4aXN0cyBpbiB0aGUgZmlsZXN5c3RlbSwgb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gYSByZWd1bGFyIGZpbGUgZXhpc3RzIGJ1dCBpcyBvdXQgb2Ygcm9vdDogcmV3cml0ZSB0byBhYnNvbHV0ZSAvQGZzLyBwYXRoc1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBwYXRoJG8ucG9zaXguam9pbihGU19QUkVGSVgsIHJlc29sdmVkLmlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IHJlc29sdmVkLmlkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNFeHRlcm5hbFVybCh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbdXJsLCB1cmxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVzb2x2ZWQgaWQgaXMgbm90IGEgdmFsaWQgYnJvd3NlciBpbXBvcnQgc3BlY2lmaWVyLFxuICAgICAgICAgICAgICAgIC8vIHByZWZpeCBpdCB0byBtYWtlIGl0IHZhbGlkLiBXZSB3aWxsIHN0cmlwIHRoaXMgYmVmb3JlIGZlZWRpbmcgaXRcbiAgICAgICAgICAgICAgICAvLyBiYWNrIGludG8gdGhlIHRyYW5zZm9ybSBwaXBlbGluZVxuICAgICAgICAgICAgICAgIGlmICghdXJsLnN0YXJ0c1dpdGgoJy4nKSAmJiAhdXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSB3cmFwSWQocmVzb2x2ZWQuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSBVUkwgYnJvd3Nlci12YWxpZCBpZiBub3QgU1NSXG4gICAgICAgICAgICAgICAgaWYgKCFzc3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBub24tanMvY3NzIGltcG9ydHMgd2l0aCBgP2ltcG9ydGBcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gbWFya0V4cGxpY2l0SW1wb3J0KHVybCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1cmwgaXNuJ3QgYSByZXF1ZXN0IGZvciBhIHByZS1idW5kbGVkIGNvbW1vbiBjaHVuayxcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHJlbGF0aXZlIGpzL2NzcyBpbXBvcnRzLCBvciBzZWxmLW1vZHVsZSB2aXJ0dWFsIGltcG9ydHNcbiAgICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gdnVlIGJsb2NrcyksIGluaGVyaXQgaW1wb3J0ZXIncyB2ZXJzaW9uIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBkbyB0aGlzIGZvciB1bmtub3duIHR5cGUgaW1wb3J0cywgb3RoZXJ3aXNlIHRoZSBhcHBlbmRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBxdWVyeSBjYW4gYnJlYWsgM3JkIHBhcnR5IHBsdWdpbidzIGV4dGVuc2lvbiBjaGVja3MuXG4gICAgICAgICAgICAgICAgICAgIGlmICgoaXNSZWxhdGl2ZSB8fCBpc1NlbGZJbXBvcnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhL1s/Jl1pbXBvcnQ9P1xcYi8udGVzdCh1cmwpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdXJsLm1hdGNoKERFUF9WRVJTSU9OX1JFKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbk1hdGNoID0gaW1wb3J0ZXIubWF0Y2goREVQX1ZFUlNJT05fUkUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb25NYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGluamVjdFF1ZXJ5KHVybCwgdmVyc2lvbk1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgZGVwIGhhcyBiZWVuIGhtciB1cGRhdGVkLiBJZiB5ZXMsIHdlIG5lZWQgdG8gYXR0YWNoXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0cyBsYXN0IHVwZGF0ZWQgdGltZXN0YW1wIHRvIGZvcmNlIHRoZSBicm93c2VyIHRvIGZldGNoIHRoZSBtb3N0XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwLXRvLWRhdGUgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZS5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5IHNldHRpbmcgYGlzU2VsZkFjY2VwdGluZ2AgdW50aWwgdGhlIGZpbGUgaXMgYWN0dWFsbHkgdXNlZCAoIzc4NzApXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXBNb2R1bGUgPSBhd2FpdCBtb2R1bGVHcmFwaC5lbnN1cmVFbnRyeUZyb21VcmwodW53cmFwSWQodXJsKSwgc3NyLCBjYW5Ta2lwSW1wb3J0QW5hbHlzaXModXJsKSB8fCBmb3JjZVNraXBJbXBvcnRBbmFseXNpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwTW9kdWxlLmxhc3RITVJUaW1lc3RhbXAgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gaW5qZWN0UXVlcnkodXJsLCBgdD0ke2RlcE1vZHVsZS5sYXN0SE1SVGltZXN0YW1wfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIGRlcCBmYWlscyB0byByZXNvbHZlIChub24tZXhpc3RlbnQgaW1wb3J0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0YWNoIGxvY2F0aW9uIHRvIHRoZSBtaXNzaW5nIGltcG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wb3MgPSBwb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXBlbmQgYmFzZVxuICAgICAgICAgICAgICAgICAgICB1cmwgPSBqb2luVXJsU2VnbWVudHMoYmFzZSwgdXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt1cmwsIHJlc29sdmVkLmlkXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaW1wb3J0cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHM6IHN0YXJ0LCBlOiBlbmQsIHNzOiBleHBTdGFydCwgc2U6IGV4cEVuZCwgZDogZHluYW1pY0luZGV4LCBcbiAgICAgICAgICAgICAgICAvLyAjMjA4MyBVc2VyIG1heSB1c2UgZXNjYXBlIHBhdGgsXG4gICAgICAgICAgICAgICAgLy8gc28gdXNlIGltcG9ydHNbaW5kZXhdLm4gdG8gZ2V0IHRoZSB1bmVzY2FwZWQgc3RyaW5nXG4gICAgICAgICAgICAgICAgbjogc3BlY2lmaWVyLCBhOiBhc3NlcnRJbmRleCwgfSA9IGltcG9ydHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhd1VybCA9IHNvdXJjZS5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpbXBvcnQubWV0YSB1c2FnZVxuICAgICAgICAgICAgICAgIGlmIChyYXdVcmwgPT09ICdpbXBvcnQubWV0YScpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IHNvdXJjZS5zbGljZShlbmQsIGVuZCArIDQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gJy5ob3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNITVIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kSG90ID0gZW5kICsgNCArIChzb3VyY2VbZW5kICsgNF0gPT09ICc/JyA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2Uuc2xpY2UoZW5kSG90LCBlbmRIb3QgKyA3KSA9PT0gJy5hY2NlcHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVydGhlciBhbmFseXplIGFjY2VwdGVkIG1vZHVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlLnNsaWNlKGVuZEhvdCwgZW5kSG90ICsgMTQpID09PSAnLmFjY2VwdEV4cG9ydHMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxleEFjY2VwdGVkSG1yRXhwb3J0cyhzb3VyY2UsIHNvdXJjZS5pbmRleE9mKCcoJywgZW5kSG90ICsgMTQpICsgMSwgYWNjZXB0ZWRFeHBvcnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQYXJ0aWFsbHlTZWxmQWNjZXB0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGV4QWNjZXB0ZWRIbXJEZXBzKHNvdXJjZSwgc291cmNlLmluZGV4T2YoJygnLCBlbmRIb3QgKyA3KSArIDEsIGFjY2VwdGVkVXJscykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxmQWNjZXB0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcCA9PT0gJy5lbnYnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFbnYgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpc0R5bmFtaWNJbXBvcnQgPSBkeW5hbWljSW5kZXggPiAtMTtcbiAgICAgICAgICAgICAgICAvLyBzdHJpcCBpbXBvcnQgYXNzZXJ0aW9ucyBhcyB3ZSBjYW4gcHJvY2VzcyB0aGVtIG91cnNlbHZlc1xuICAgICAgICAgICAgICAgIGlmICghaXNEeW5hbWljSW1wb3J0ICYmIGFzc2VydEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyKCkucmVtb3ZlKGVuZCArIDEsIGV4cEVuZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHN0YXRpYyBpbXBvcnQgb3IgdmFsaWQgc3RyaW5nIGluIGR5bmFtaWMgaW1wb3J0XG4gICAgICAgICAgICAgICAgLy8gSWYgcmVzb2x2YWJsZSwgbGV0J3MgcmVzb2x2ZSBpdFxuICAgICAgICAgICAgICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBleHRlcm5hbCAvIGRhdGEgdXJpXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0V4dGVybmFsVXJsKHNwZWNpZmllcikgfHwgaXNEYXRhVXJsKHNwZWNpZmllcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHNraXAgc3NyIGV4dGVybmFsXG4gICAgICAgICAgICAgICAgICAgIGlmIChzc3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubGVnYWN5Py5idWlsZFNzckNqc0V4dGVybmFsSGV1cmlzdGljcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjanNTaG91bGRFeHRlcm5hbGl6ZUZvclNTUihzcGVjaWZpZXIsIHNlcnZlci5fc3NyRXh0ZXJuYWxzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaG91bGRFeHRlcm5hbGl6ZUZvclNTUihzcGVjaWZpZXIsIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0J1aWx0aW4oc3BlY2lmaWVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHNraXAgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGVjaWZpZXIgPT09IGNsaWVudFB1YmxpY1BhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHdhcm4gaW1wb3J0cyB0byBub24tYXNzZXQgL3B1YmxpYyBmaWxlc1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy8nKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWNvbmZpZy5hc3NldHNJbmNsdWRlKGNsZWFuVXJsKHNwZWNpZmllcikpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhc3BlY2lmaWVyLmVuZHNXaXRoKCcuanNvbicpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1B1YmxpY0ZpbGUoc3BlY2lmaWVyLCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbXBvcnQgbm9uLWFzc2V0IGZpbGUgJHtzcGVjaWZpZXJ9IHdoaWNoIGlzIGluc2lkZSAvcHVibGljLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBKUy9DU1MgZmlsZXMgaW5zaWRlIC9wdWJsaWMgYXJlIGNvcGllZCBhcy1pcyBvbiBidWlsZCBhbmQgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGNhbiBvbmx5IGJlIHJlZmVyZW5jZWQgdmlhIDxzY3JpcHQgc3JjPiBvciA8bGluayBocmVmPiBpbiBodG1sLmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBbdXJsLCByZXNvbHZlZElkXSA9IGF3YWl0IG5vcm1hbGl6ZVVybChzcGVjaWZpZXIsIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0R5bmFtaWNJbXBvcnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXNwZWNpZmllci5pbmNsdWRlcygnPycpICYmIC8vIGlnbm9yZSBjdXN0b20gcXVlcmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDU1NSZXF1ZXN0KHJlc29sdmVkSWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhaXNNb2R1bGVDU1NSZXF1ZXN0KHJlc29sdmVkSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VFeHAgPSBzb3VyY2Uuc2xpY2UoZXhwU3RhcnQsIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VFeHAuaW5jbHVkZXMoJ2Zyb20nKSAmJiAvLyBjaGVjayBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNvdXJjZUV4cC5pbmNsdWRlcygnX192aXRlX2dsb2JfJykgLy8gZ2xvYiBoYW5kbGVzIGRlcHJlY2F0aW9uIG1lc3NhZ2UgaXRzZWxmXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdJbXBvcnQgPSBzb3VyY2VFeHAgKyBzcGVjaWZpZXIgKyBgP2lubGluZWAgKyBzb3VyY2Uuc2xpY2UoZW5kLCBleHBFbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2FybihgXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY29jb2xvcnNFeHBvcnRzLmN5YW4oaW1wb3J0ZXJNb2R1bGUuZmlsZSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY29jb2xvcnNFeHBvcnRzLnJlc2V0KGdlbmVyYXRlQ29kZUZyYW1lKHNvdXJjZSwgc3RhcnQpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljb2NvbG9yc0V4cG9ydHMueWVsbG93KGBEZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzIGZyb20gQ1NTIGZpbGVzIGFyZSBkZXByZWNhdGVkLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBVc2UgdGhlID9pbmxpbmUgcXVlcnkgaW5zdGVhZC4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRm9yIGV4YW1wbGU6ICR7bmV3SW1wb3J0fWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgYXMgc2FmZSBtb2R1bGVzXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlcj8ubW9kdWxlR3JhcGguc2FmZU1vZHVsZXNQYXRoLmFkZChmc1BhdGhGcm9tVXJsKHVybCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXJsICE9PSBzcGVjaWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXdyaXRlRG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcHNPcHRpbWl6ZXI/LmlzT3B0aW1pemVkRGVwRmlsZShyZXNvbHZlZElkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZXNvbHZlZElkLm1hdGNoKG9wdGltaXplZERlcENodW5rUkUkMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igb3B0aW1pemVkIGNqcyBkZXBzLCBzdXBwb3J0IG5hbWVkIGltcG9ydHMgYnkgcmV3cml0aW5nIG5hbWVkIGltcG9ydHMgdG8gY29uc3QgYXNzaWdubWVudHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJuYWwgb3B0aW1pemVkIGNodW5rcyBkb24ndCBuZWVkIGVzIGludGVyb3AgYW5kIGFyZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBicm93c2VySGFzaCBpbiByZXNvbHZlZElkIGNvdWxkIGJlIHN0YWxlIGluIHdoaWNoIGNhc2UgdGhlcmUgd2lsbCBiZSBhIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYWdlIHJlbG9hZC4gV2UgY291bGQgcmV0dXJuIGEgNDA0IGluIHRoYXQgY2FzZSBidXQgaXQgaXMgc2FmZSB0byByZXR1cm4gdGhlIHJlcXVlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gY2xlYW5VcmwocmVzb2x2ZWRJZCk7IC8vIFJlbW92ZSA/dj17aGFzaH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZWVkc0ludGVyb3AgPSBhd2FpdCBvcHRpbWl6ZWREZXBOZWVkc0ludGVyb3AoZGVwc09wdGltaXplci5tZXRhZGF0YSwgZmlsZSwgY29uZmlnLCBzc3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc0ludGVyb3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb24tZW50cnkgZHluYW1pYyBpbXBvcnRzIGZyb20gZGVwZW5kZW5jaWVzIHdpbGwgcmVhY2ggaGVyZSBhcyB0aGVyZSBpc24ndFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpbWl6ZSBpbmZvIGZvciB0aGVtLCBidXQgdGhleSBkb24ndCBuZWVkIGVzIGludGVyb3AuIElmIHRoZSByZXF1ZXN0IGlzbid0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgZHluYW1pYyBpbXBvcnQsIHRoZW4gaXQgaXMgYW4gaW50ZXJuYWwgVml0ZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGUubWF0Y2gob3B0aW1pemVkRGVwRHluYW1pY1JFJDEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLmVycm9yKHBpY29jb2xvcnNFeHBvcnRzLnJlZChgVml0ZSBFcnJvciwgJHt1cmx9IG9wdGltaXplZCBpbmZvIHNob3VsZCBiZSBkZWZpbmVkYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5lZWRzSW50ZXJvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyQ5KGAke3VybH0gbmVlZHMgaW50ZXJvcGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm9wTmFtZWRJbXBvcnRzKHN0cigpLCBpbXBvcnRzW2luZGV4XSwgdXJsLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVEb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzb3VyY2UgY29kZSBpbXBvcnRzIGJ1aWx0aW4gbW9kdWxlcyB2aWEgbmFtZWQgaW1wb3J0cywgdGhlIHN0dWIgcHJveHkgZXhwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBmYWlsIGFzIGl0J3MgYGV4cG9ydCBkZWZhdWx0YCBvbmx5LiBBcHBseSBpbnRlcm9wIGZvciBidWlsdGluIG1vZHVsZXMgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3RseSB0aHJvdyB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVybC5pbmNsdWRlcyhicm93c2VyRXh0ZXJuYWxJZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2Uuc2xpY2UoZXhwU3RhcnQsIHN0YXJ0KS5pbmNsdWRlcygneycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJvcE5hbWVkSW1wb3J0cyhzdHIoKSwgaW1wb3J0c1tpbmRleF0sIHVybCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVEb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV3cml0ZURvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV3cml0dGVuVXJsID0gSlNPTi5zdHJpbmdpZnkodXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRHluYW1pY0ltcG9ydClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0dGVuVXJsID0gcmV3cml0dGVuVXJsLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoKS5vdmVyd3JpdGUoc3RhcnQsIGVuZCwgcmV3cml0dGVuVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCBmb3IgSE1SIGltcG9ydCBjaGFpbiBhbmFseXNpc1xuICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gdW53cmFwIGFuZCBub3JtYWxpemUgYXdheSBiYXNlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhtclVybCA9IHVud3JhcElkKHN0cmlwQmFzZSh1cmwsIGJhc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZWRVcmxzLmFkZChobXJVcmwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlUGFydGlhbEFjY2VwdCAmJiBpbXBvcnRlZEJpbmRpbmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0SW1wb3J0ZWRCaW5kaW5ncyhyZXNvbHZlZElkLCBzb3VyY2UsIGltcG9ydHNbaW5kZXhdLCBpbXBvcnRlZEJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRHluYW1pY0ltcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHByZS10cmFuc2Zvcm1pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY0ltcG9ydGVkVXJscy5hZGQoeyB1cmw6IGhtclVybCwgaWQ6IHJlc29sdmVkSWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWltcG9ydGVyLnN0YXJ0c1dpdGgoY2xpZW50RGlyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWltcG9ydGVyLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgQHZpdGUtaWdub3JlIHdoaWNoIHN1cHByZXNzZXMgZHluYW1pYyBpbXBvcnQgd2FybmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzVml0ZUlnbm9yZSA9IC9cXC9cXCpcXHMqQHZpdGUtaWdub3JlXFxzKlxcKlxcLy8udGVzdChcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlIGV4cHJlc3Npb24gaW5zaWRlIHBhcmVuc1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLnNsaWNlKGR5bmFtaWNJbmRleCArIDEsIGVuZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNWaXRlSWdub3JlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53YXJuKGBcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljb2NvbG9yc0V4cG9ydHMuY3lhbihpbXBvcnRlck1vZHVsZS5maWxlKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljb2NvbG9yc0V4cG9ydHMucmVzZXQoZ2VuZXJhdGVDb2RlRnJhbWUoc291cmNlLCBzdGFydCkpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljb2NvbG9yc0V4cG9ydHMueWVsbG93KGBcXG5UaGUgYWJvdmUgZHluYW1pYyBpbXBvcnQgY2Fubm90IGJlIGFuYWx5emVkIGJ5IFZpdGUuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgU2VlICR7cGljb2NvbG9yc0V4cG9ydHMuYmx1ZShgaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9wbHVnaW5zL3RyZWUvbWFzdGVyL3BhY2thZ2VzL2R5bmFtaWMtaW1wb3J0LXZhcnMjbGltaXRhdGlvbnNgKX0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZm9yIHN1cHBvcnRlZCBkeW5hbWljIGltcG9ydCBmb3JtYXRzLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBJZiB0aGlzIGlzIGludGVuZGVkIHRvIGJlIGxlZnQgYXMtaXMsIHlvdSBjYW4gdXNlIHRoZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAvKiBAdml0ZS1pZ25vcmUgKi8gY29tbWVudCBpbnNpZGUgdGhlIGltcG9ydCgpIGNhbGwgdG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nLlxcbmApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNzcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gcmF3VXJsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98KFteXFxcXDpdfF4pXFwvXFwvLiokL2dtLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEvXig/OicuKid8XCIuKlwifGAuKmApJC8udGVzdCh1cmwpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHBsaWNpdEltcG9ydFJlcXVpcmVkKHVybC5zbGljZSgxLCAtMSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZFF1ZXJ5SW5qZWN0SGVscGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoKS5vdmVyd3JpdGUoc3RhcnQsIGVuZCwgYF9fdml0ZV9faW5qZWN0UXVlcnkoJHt1cmx9LCAnaW1wb3J0JylgLCB7IGNvbnRlbnRPbmx5OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc0Vudikge1xuICAgICAgICAgICAgICAgIC8vIGluamVjdCBpbXBvcnQubWV0YS5lbnZcbiAgICAgICAgICAgICAgICBzdHIoKS5wcmVwZW5kKGdldEVudihzc3IpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoYXNITVIgJiYgIXNzcikge1xuICAgICAgICAgICAgICAgIGRlYnVnSG1yKGAke2lzU2VsZkFjY2VwdGluZ1xuICAgICAgICAgICAgICAgICAgICA/IGBbc2VsZi1hY2NlcHRzXWBcbiAgICAgICAgICAgICAgICAgICAgOiBpc1BhcnRpYWxseVNlbGZBY2NlcHRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYFthY2NlcHRzLWV4cG9ydHNdYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhY2NlcHRlZFVybHMuc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYFthY2NlcHRzLWRlcHNdYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYFtkZXRlY3RlZCBhcGkgdXNhZ2VdYH0gJHtwcmV0dHlJbXBvcnRlcn1gKTtcbiAgICAgICAgICAgICAgICAvLyBpbmplY3QgaG90IGNvbnRleHRcbiAgICAgICAgICAgICAgICBzdHIoKS5wcmVwZW5kKGBpbXBvcnQgeyBjcmVhdGVIb3RDb250ZXh0IGFzIF9fdml0ZV9fY3JlYXRlSG90Q29udGV4dCB9IGZyb20gXCIke2NsaWVudFB1YmxpY1BhdGh9XCI7YCArXG4gICAgICAgICAgICAgICAgICAgIGBpbXBvcnQubWV0YS5ob3QgPSBfX3ZpdGVfX2NyZWF0ZUhvdENvbnRleHQoJHtKU09OLnN0cmluZ2lmeShub3JtYWxpemVIbXJVcmwoaW1wb3J0ZXJNb2R1bGUudXJsKSl9KTtgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZWVkUXVlcnlJbmplY3RIZWxwZXIpIHtcbiAgICAgICAgICAgICAgICBzdHIoKS5wcmVwZW5kKGBpbXBvcnQgeyBpbmplY3RRdWVyeSBhcyBfX3ZpdGVfX2luamVjdFF1ZXJ5IH0gZnJvbSBcIiR7Y2xpZW50UHVibGljUGF0aH1cIjtgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBhbmQgcmV3cml0ZSBhY2NlcHRlZCB1cmxzXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkQWNjZXB0ZWRVcmxzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IHVybCwgc3RhcnQsIGVuZCB9IG9mIGFjY2VwdGVkVXJscykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtub3JtYWxpemVkXSA9IGF3YWl0IG1vZHVsZUdyYXBoLnJlc29sdmVVcmwodG9BYnNvbHV0ZVVybChtYXJrRXhwbGljaXRJbXBvcnQodXJsKSksIHNzcik7XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZEFjY2VwdGVkVXJscy5hZGQobm9ybWFsaXplZCk7XG4gICAgICAgICAgICAgICAgc3RyKCkub3ZlcndyaXRlKHN0YXJ0LCBlbmQsIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWQpLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBtb2R1bGUgZ3JhcGggZm9yIEhNUiBhbmFseXNpcy5cbiAgICAgICAgICAgIC8vIG5vZGUgQ1NTIGltcG9ydHMgZG9lcyBpdHMgb3duIGdyYXBoIHVwZGF0ZSBpbiB0aGUgY3NzIHBsdWdpbiBzbyB3ZVxuICAgICAgICAgICAgLy8gb25seSBoYW5kbGUganMgZ3JhcGggdXBkYXRlcyBoZXJlLlxuICAgICAgICAgICAgaWYgKCFpc0NTU1JlcXVlc3QoaW1wb3J0ZXIpKSB7XG4gICAgICAgICAgICAgICAgLy8gYXR0YWNoZWQgYnkgcGx1Z2luQ29udGFpbmVyLmFkZFdhdGNoRmlsZVxuICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbkltcG9ydHMgPSB0aGlzLl9hZGRlZEltcG9ydHM7XG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbkltcG9ydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IFByb21pc2UuYWxsKFsuLi5wbHVnaW5JbXBvcnRzXS5tYXAoKGlkKSA9PiBub3JtYWxpemVVcmwoaWQsIDAsIHRydWUpKSkpLmZvckVhY2goKFt1cmxdKSA9PiBpbXBvcnRlZFVybHMuYWRkKHVybCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBITVIgdHJhbnNmb3JtcyBhcmUgbm8tb3BzIGluIFNTUiwgc28gYW4gYGFjY2VwdGAgY2FsbCB3aWxsXG4gICAgICAgICAgICAgICAgLy8gbmV2ZXIgYmUgaW5qZWN0ZWQuIEF2b2lkIHVwZGF0aW5nIHRoZSBgaXNTZWxmQWNjZXB0aW5nYFxuICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGZvciBvdXIgbW9kdWxlIG5vZGUgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgICAgIGlmIChzc3IgJiYgaW1wb3J0ZXJNb2R1bGUuaXNTZWxmQWNjZXB0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzU2VsZkFjY2VwdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGEgcGFydGlhbGx5IGFjY2VwdGVkIG1vZHVsZSB0aGF0IGFjY2VwdHMgYWxsIGl0cyBleHBvcnRzXG4gICAgICAgICAgICAgICAgLy8gYmVoYXZlcyBsaWtlIGEgc2VsZi1hY2NlcHRlZCBtb2R1bGUgaW4gcHJhY3RpY2VcbiAgICAgICAgICAgICAgICBpZiAoIWlzU2VsZkFjY2VwdGluZyAmJlxuICAgICAgICAgICAgICAgICAgICBpc1BhcnRpYWxseVNlbGZBY2NlcHRpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0ZWRFeHBvcnRzLnNpemUgPj0gZXhwb3J0cy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5ldmVyeSgoZSkgPT4gYWNjZXB0ZWRFeHBvcnRzLmhhcyhlLm4pKSkge1xuICAgICAgICAgICAgICAgICAgICBpc1NlbGZBY2NlcHRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcnVuZWRJbXBvcnRzID0gYXdhaXQgbW9kdWxlR3JhcGgudXBkYXRlTW9kdWxlSW5mbyhpbXBvcnRlck1vZHVsZSwgaW1wb3J0ZWRVcmxzLCBpbXBvcnRlZEJpbmRpbmdzLCBub3JtYWxpemVkQWNjZXB0ZWRVcmxzLCBpc1BhcnRpYWxseVNlbGZBY2NlcHRpbmcgPyBhY2NlcHRlZEV4cG9ydHMgOiBudWxsLCBpc1NlbGZBY2NlcHRpbmcsIHNzcik7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0hNUiAmJiBwcnVuZWRJbXBvcnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVBydW5lZE1vZHVsZXMocHJ1bmVkSW1wb3J0cywgc2VydmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc0RlYnVnJDEgJiZcbiAgICAgICAgICAgICAgICBkZWJ1ZyQ5KGAke3RpbWVGcm9tKHN0YXJ0KX0gJHtwaWNvY29sb3JzRXhwb3J0cy5kaW0oYFske2ltcG9ydGVkVXJscy5zaXplfSBpbXBvcnRzIHJld3JpdHRlbl0gJHtwcmV0dHlJbXBvcnRlcn1gKX1gKTtcbiAgICAgICAgICAgIC8vIHByZS10cmFuc2Zvcm0ga25vd24gZGlyZWN0IGltcG9ydHNcbiAgICAgICAgICAgIC8vIFRoZXNlIHJlcXVlc3RzIHdpbGwgYWxzbyBiZSByZWdpc3RlcmVkIGluIHRyYW5zZm9ybVJlcXVlc3QgdG8gYmUgYXdhaXRlZFxuICAgICAgICAgICAgLy8gYnkgdGhlIGRlcHMgb3B0aW1pemVyXG4gICAgICAgICAgICBpZiAoY29uZmlnLnNlcnZlci5wcmVUcmFuc2Zvcm1SZXF1ZXN0cyAmJiBzdGF0aWNJbXBvcnRlZFVybHMuc2l6ZSkge1xuICAgICAgICAgICAgICAgIHN0YXRpY0ltcG9ydGVkVXJscy5mb3JFYWNoKCh7IHVybCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IHJlbW92ZUltcG9ydFF1ZXJ5KHVybCk7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3QodXJsLCBzZXJ2ZXIsIHsgc3NyIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZT8uY29kZSA9PT0gRVJSX09VVERBVEVEX09QVElNSVpFRF9ERVApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFyZSBleHBlY3RlZCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmV4cGVjdGVkIGVycm9yLCBsb2cgdGhlIGlzc3VlIGJ1dCBhdm9pZCBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLmVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtU3RhYmxlUmVzdWx0KHMsIGltcG9ydGVyLCBjb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufVxuZnVuY3Rpb24gaW50ZXJvcE5hbWVkSW1wb3J0cyhzdHIsIGltcG9ydFNwZWNpZmllciwgcmV3cml0dGVuVXJsLCBpbXBvcnRJbmRleCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IHN0ci5vcmlnaW5hbDtcbiAgICBjb25zdCB7IHM6IHN0YXJ0LCBlOiBlbmQsIHNzOiBleHBTdGFydCwgc2U6IGV4cEVuZCwgZDogZHluYW1pY0luZGV4LCB9ID0gaW1wb3J0U3BlY2lmaWVyO1xuICAgIGlmIChkeW5hbWljSW5kZXggPiAtMSkge1xuICAgICAgICAvLyByZXdyaXRlIGBpbXBvcnQoJ3BhY2thZ2UnKWAgdG8gZXhwb3NlIHRoZSBkZWZhdWx0IGRpcmVjdGx5XG4gICAgICAgIHN0ci5vdmVyd3JpdGUoZXhwU3RhcnQsIGV4cEVuZCwgYGltcG9ydCgnJHtyZXdyaXR0ZW5Vcmx9JykudGhlbihtID0+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuX19lc01vZHVsZSA/IG0uZGVmYXVsdCA6ICh7IC4uLm0uZGVmYXVsdCwgZGVmYXVsdDogbS5kZWZhdWx0IH0pKWAsIHsgY29udGVudE9ubHk6IHRydWUgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBleHAgPSBzb3VyY2Uuc2xpY2UoZXhwU3RhcnQsIGV4cEVuZCk7XG4gICAgICAgIGNvbnN0IHJhd1VybCA9IHNvdXJjZS5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgY29uc3QgcmV3cml0dGVuID0gdHJhbnNmb3JtQ2pzSW1wb3J0KGV4cCwgcmV3cml0dGVuVXJsLCByYXdVcmwsIGltcG9ydEluZGV4KTtcbiAgICAgICAgaWYgKHJld3JpdHRlbikge1xuICAgICAgICAgICAgc3RyLm92ZXJ3cml0ZShleHBTdGFydCwgZXhwRW5kLCByZXdyaXR0ZW4sIHsgY29udGVudE9ubHk6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyAjMTQzOSBleHBvcnQgKiBmcm9tICcuLi4nXG4gICAgICAgICAgICBzdHIub3ZlcndyaXRlKHN0YXJ0LCBlbmQsIHJld3JpdHRlblVybCwgeyBjb250ZW50T25seTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogRGV0ZWN0IGltcG9ydCBzdGF0ZW1lbnRzIHRvIGEga25vd24gb3B0aW1pemVkIENKUyBkZXBlbmRlbmN5IGFuZCBwcm92aWRlXG4gKiBFUyBuYW1lZCBpbXBvcnRzIGludGVyb3AuIFdlIGRvIHRoaXMgYnkgcmV3cml0aW5nIG5hbWVkIGltcG9ydHMgdG8gYSB2YXJpYWJsZVxuICogYXNzaWdubWVudCB0byB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBvbiB0aGUgYG1vZHVsZS5leHBvcnRzYCBvZiB0aGUgY2pzXG4gKiBtb2R1bGUuIE5vdGUgdGhpcyBkb2Vzbid0IHN1cHBvcnQgZHluYW1pYyByZS1hc3NpZ25tZW50cyBmcm9tIHdpdGhpbiB0aGUgY2pzXG4gKiBtb2R1bGUuXG4gKlxuICogTm90ZSB0aGF0IGVzLW1vZHVsZS1sZXhlciB0cmVhdHMgYGV4cG9ydCAqIGZyb20gJy4uLidgIGFzIGFuIGltcG9ydCBhcyB3ZWxsLFxuICogc28sIHdlIG1heSBlbmNvdW50ZXIgRXhwb3J0QWxsRGVjbGFyYXRpb24gaGVyZSwgaW4gd2hpY2ggY2FzZSBgdW5kZWZpbmVkYFxuICogd2lsbCBiZSByZXR1cm5lZC5cbiAqXG4gKiBDcmVkaXRzIFxcQGNzcjYzMiB2aWEgIzgzN1xuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1DanNJbXBvcnQoaW1wb3J0RXhwLCB1cmwsIHJhd1VybCwgaW1wb3J0SW5kZXgpIHtcbiAgICBjb25zdCBub2RlID0gcGFyc2UkZChpbXBvcnRFeHAsIHtcbiAgICAgICAgZWNtYVZlcnNpb246ICdsYXRlc3QnLFxuICAgICAgICBzb3VyY2VUeXBlOiAnbW9kdWxlJyxcbiAgICB9KS5ib2R5WzBdO1xuICAgIGlmIChub2RlLnR5cGUgPT09ICdJbXBvcnREZWNsYXJhdGlvbicgfHxcbiAgICAgICAgbm9kZS50eXBlID09PSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicpIHtcbiAgICAgICAgaWYgKCFub2RlLnNwZWNpZmllcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYGltcG9ydCBcIiR7dXJsfVwiYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbXBvcnROYW1lcyA9IFtdO1xuICAgICAgICBjb25zdCBleHBvcnROYW1lcyA9IFtdO1xuICAgICAgICBsZXQgZGVmYXVsdEV4cG9ydHMgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBzcGVjIG9mIG5vZGUuc3BlY2lmaWVycykge1xuICAgICAgICAgICAgaWYgKHNwZWMudHlwZSA9PT0gJ0ltcG9ydFNwZWNpZmllcicgJiZcbiAgICAgICAgICAgICAgICBzcGVjLmltcG9ydGVkLnR5cGUgPT09ICdJZGVudGlmaWVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkTmFtZSA9IHNwZWMuaW1wb3J0ZWQubmFtZTtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbE5hbWUgPSBzcGVjLmxvY2FsLm5hbWU7XG4gICAgICAgICAgICAgICAgaW1wb3J0TmFtZXMucHVzaCh7IGltcG9ydGVkTmFtZSwgbG9jYWxOYW1lIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3BlYy50eXBlID09PSAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcicpIHtcbiAgICAgICAgICAgICAgICBpbXBvcnROYW1lcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZWROYW1lOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZTogc3BlYy5sb2NhbC5uYW1lLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3BlYy50eXBlID09PSAnSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyJykge1xuICAgICAgICAgICAgICAgIGltcG9ydE5hbWVzLnB1c2goeyBpbXBvcnRlZE5hbWU6ICcqJywgbG9jYWxOYW1lOiBzcGVjLmxvY2FsLm5hbWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzcGVjLnR5cGUgPT09ICdFeHBvcnRTcGVjaWZpZXInICYmXG4gICAgICAgICAgICAgICAgc3BlYy5leHBvcnRlZC50eXBlID09PSAnSWRlbnRpZmllcicpIHtcbiAgICAgICAgICAgICAgICAvLyBmb3IgRXhwb3J0U3BlY2lmaWVyLCBsb2NhbCBuYW1lIGlzIHNhbWUgYXMgaW1wb3J0ZWQgbmFtZVxuICAgICAgICAgICAgICAgIC8vIHByZWZpeCB0aGUgdmFyaWFibGUgbmFtZSB0byBhdm9pZCBjbGFzaGluZyB3aXRoIG90aGVyIGxvY2FsIHZhcmlhYmxlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkTmFtZSA9IHNwZWMubG9jYWwubmFtZTtcbiAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHNwZWNpZnkgZXhwb3J0ZWQgbmFtZSBhcyB2YXJpYWJsZSBhbmQgcmUtZXhwb3J0IGl0XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWROYW1lID0gc3BlYy5leHBvcnRlZC5uYW1lO1xuICAgICAgICAgICAgICAgIGlmIChleHBvcnRlZE5hbWUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RXhwb3J0cyA9IG1ha2VMZWdhbElkZW50aWZpZXIoYF9fdml0ZV9fY2pzRXhwb3J0RGVmYXVsdF8ke2ltcG9ydEluZGV4fWApO1xuICAgICAgICAgICAgICAgICAgICBpbXBvcnROYW1lcy5wdXNoKHsgaW1wb3J0ZWROYW1lLCBsb2NhbE5hbWU6IGRlZmF1bHRFeHBvcnRzIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxOYW1lID0gbWFrZUxlZ2FsSWRlbnRpZmllcihgX192aXRlX19janNFeHBvcnRfJHtleHBvcnRlZE5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGltcG9ydE5hbWVzLnB1c2goeyBpbXBvcnRlZE5hbWUsIGxvY2FsTmFtZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZXhwb3J0TmFtZXMucHVzaChgJHtsb2NhbE5hbWV9IGFzICR7ZXhwb3J0ZWROYW1lfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBtdWx0aXBsZSBpbXBvcnQgZm9yIHNhbWUgaWQgaW4gb25lIGZpbGUsXG4gICAgICAgIC8vIGltcG9ydEluZGV4IHdpbGwgcHJldmVudCB0aGUgY2pzTW9kdWxlTmFtZSB0byBiZSBkdXBsaWNhdGVcbiAgICAgICAgY29uc3QgY2pzTW9kdWxlTmFtZSA9IG1ha2VMZWdhbElkZW50aWZpZXIoYF9fdml0ZV9fY2pzSW1wb3J0JHtpbXBvcnRJbmRleH1fJHtyYXdVcmx9YCk7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gW2BpbXBvcnQgJHtjanNNb2R1bGVOYW1lfSBmcm9tIFwiJHt1cmx9XCJgXTtcbiAgICAgICAgaW1wb3J0TmFtZXMuZm9yRWFjaCgoeyBpbXBvcnRlZE5hbWUsIGxvY2FsTmFtZSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW1wb3J0ZWROYW1lID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGBjb25zdCAke2xvY2FsTmFtZX0gPSAke2Nqc01vZHVsZU5hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpbXBvcnRlZE5hbWUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goYGNvbnN0ICR7bG9jYWxOYW1lfSA9ICR7Y2pzTW9kdWxlTmFtZX0uX19lc01vZHVsZSA/ICR7Y2pzTW9kdWxlTmFtZX0uZGVmYXVsdCA6ICR7Y2pzTW9kdWxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goYGNvbnN0ICR7bG9jYWxOYW1lfSA9ICR7Y2pzTW9kdWxlTmFtZX1bXCIke2ltcG9ydGVkTmFtZX1cIl1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChkZWZhdWx0RXhwb3J0cykge1xuICAgICAgICAgICAgbGluZXMucHVzaChgZXhwb3J0IGRlZmF1bHQgJHtkZWZhdWx0RXhwb3J0c31gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwb3J0TmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGBleHBvcnQgeyAke2V4cG9ydE5hbWVzLmpvaW4oJywgJyl9IH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZXMuam9pbignOyAnKTtcbiAgICB9XG59XG5cbi8vIGlkcyBpbiB0cmFuc2Zvcm0gYXJlIG5vcm1hbGl6ZWQgdG8gdW5peCBzdHlsZVxuY29uc3Qgbm9ybWFsaXplZENsaWVudEVudHJ5ID0gbm9ybWFsaXplUGF0aCQzKENMSUVOVF9FTlRSWSk7XG5jb25zdCBub3JtYWxpemVkRW52RW50cnkgPSBub3JtYWxpemVQYXRoJDMoRU5WX0VOVFJZKTtcbi8qKlxuICogc29tZSB2YWx1ZXMgdXNlZCBieSB0aGUgY2xpZW50IG5lZWRzIHRvIGJlIGR5bmFtaWNhbGx5IGluamVjdGVkIGJ5IHRoZSBzZXJ2ZXJcbiAqIEBzZXJ2ZXItb25seVxuICovXG5mdW5jdGlvbiBjbGllbnRJbmplY3Rpb25zUGx1Z2luKGNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmNsaWVudC1pbmplY3QnLFxuICAgICAgICBhc3luYyB0cmFuc2Zvcm0oY29kZSwgaWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gbm9ybWFsaXplZENsaWVudEVudHJ5IHx8IGlkID09PSBub3JtYWxpemVkRW52RW50cnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFNlcnZlckhvc3RuYW1lID0gKGF3YWl0IHJlc29sdmVIb3N0bmFtZShjb25maWcuc2VydmVyLmhvc3QpKS5uYW1lO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkU2VydmVyUG9ydCA9IGNvbmZpZy5zZXJ2ZXIucG9ydDtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXZCYXNlID0gY29uZmlnLmJhc2U7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VydmVySG9zdCA9IGAke3Jlc29sdmVkU2VydmVySG9zdG5hbWV9OiR7cmVzb2x2ZWRTZXJ2ZXJQb3J0fSR7ZGV2QmFzZX1gO1xuICAgICAgICAgICAgICAgIGxldCBobXJDb25maWcgPSBjb25maWcuc2VydmVyLmhtcjtcbiAgICAgICAgICAgICAgICBobXJDb25maWcgPSBpc09iamVjdCQyKGhtckNvbmZpZykgPyBobXJDb25maWcgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdCA9IGhtckNvbmZpZz8uaG9zdCB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3RvY29sID0gaG1yQ29uZmlnPy5wcm90b2NvbCB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBobXJDb25maWc/LnRpbWVvdXQgfHwgMzAwMDA7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheSA9IGhtckNvbmZpZz8ub3ZlcmxheSAhPT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNIbXJTZXJ2ZXJTcGVjaWZpZWQgPSAhIWhtckNvbmZpZz8uc2VydmVyO1xuICAgICAgICAgICAgICAgIC8vIGhtci5jbGllbnRQb3J0IC0+IGhtci5wb3J0XG4gICAgICAgICAgICAgICAgLy8gLT4gKDI0Njc4IGlmIG1pZGRsZXdhcmUgbW9kZSBhbmQgSE1SIHNlcnZlciBpcyBub3Qgc3BlY2lmaWVkKSAtPiBuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucG9ydFxuICAgICAgICAgICAgICAgIGxldCBwb3J0ID0gaG1yQ29uZmlnPy5jbGllbnRQb3J0IHx8IGhtckNvbmZpZz8ucG9ydCB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcuc2VydmVyLm1pZGRsZXdhcmVNb2RlICYmICFpc0htclNlcnZlclNwZWNpZmllZCkge1xuICAgICAgICAgICAgICAgICAgICBwb3J0IHx8IChwb3J0ID0gMjQ2NzgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZGlyZWN0VGFyZ2V0ID0gaG1yQ29uZmlnPy5ob3N0IHx8IHJlc29sdmVkU2VydmVySG9zdG5hbWU7XG4gICAgICAgICAgICAgICAgZGlyZWN0VGFyZ2V0ICs9IGA6JHtobXJDb25maWc/LnBvcnQgfHwgcmVzb2x2ZWRTZXJ2ZXJQb3J0fWA7XG4gICAgICAgICAgICAgICAgZGlyZWN0VGFyZ2V0ICs9IGRldkJhc2U7XG4gICAgICAgICAgICAgICAgbGV0IGhtckJhc2UgPSBkZXZCYXNlO1xuICAgICAgICAgICAgICAgIGlmIChobXJDb25maWc/LnBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaG1yQmFzZSA9IHBhdGgkby5wb3NpeC5qb2luKGhtckJhc2UsIGhtckNvbmZpZy5wYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoYF9fTU9ERV9fYCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnLm1vZGUpKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvX19CQVNFX18vZywgSlNPTi5zdHJpbmdpZnkoZGV2QmFzZSkpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGBfX0RFRklORVNfX2AsIHNlcmlhbGl6ZURlZmluZShjb25maWcuZGVmaW5lIHx8IHt9KSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoYF9fU0VSVkVSX0hPU1RfX2AsIEpTT04uc3RyaW5naWZ5KHNlcnZlckhvc3QpKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShgX19ITVJfUFJPVE9DT0xfX2AsIEpTT04uc3RyaW5naWZ5KHByb3RvY29sKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoYF9fSE1SX0hPU1ROQU1FX19gLCBKU09OLnN0cmluZ2lmeShob3N0KSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoYF9fSE1SX1BPUlRfX2AsIEpTT04uc3RyaW5naWZ5KHBvcnQpKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShgX19ITVJfRElSRUNUX1RBUkdFVF9fYCwgSlNPTi5zdHJpbmdpZnkoZGlyZWN0VGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoYF9fSE1SX0JBU0VfX2AsIEpTT04uc3RyaW5naWZ5KGhtckJhc2UpKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShgX19ITVJfVElNRU9VVF9fYCwgSlNPTi5zdHJpbmdpZnkodGltZW91dCkpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGBfX0hNUl9FTkFCTEVfT1ZFUkxBWV9fYCwgSlNPTi5zdHJpbmdpZnkob3ZlcmxheSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIW9wdGlvbnM/LnNzciAmJiBjb2RlLmluY2x1ZGVzKCdwcm9jZXNzLmVudi5OT0RFX0VOVicpKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVwbGFjZSBwcm9jZXNzLmVudi5OT0RFX0VOViBpbnN0ZWFkIG9mIGRlZmluaW5nIGEgZ2xvYmFsXG4gICAgICAgICAgICAgICAgLy8gZm9yIGl0IHRvIGF2b2lkIHNoaW1taW5nIGEgYHByb2Nlc3NgIG9iamVjdCBkdXJpbmcgZGV2LFxuICAgICAgICAgICAgICAgIC8vIGF2b2lkaW5nIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIGRldiBhbmQgYnVpbGRcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5yZXBsYWNlKC8oXFxiZ2xvYmFsKFRoaXMpP1xcLik/XFxicHJvY2Vzc1xcLmVudlxcLk5PREVfRU5WXFxiL2csIGNvbmZpZy5kZWZpbmU/LlsncHJvY2Vzcy5lbnYuTk9ERV9FTlYnXSB8fFxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShwcm9jZXNzLmVudi5OT0RFX0VOViB8fCBjb25maWcubW9kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5mdW5jdGlvbiBzZXJpYWxpemVEZWZpbmUoZGVmaW5lKSB7XG4gICAgbGV0IHJlcyA9IGB7YDtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkZWZpbmUpIHtcbiAgICAgICAgY29uc3QgdmFsID0gZGVmaW5lW2tleV07XG4gICAgICAgIHJlcyArPSBgJHtKU09OLnN0cmluZ2lmeShrZXkpfTogJHt0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IGAoJHt2YWx9KWAgOiBKU09OLnN0cmluZ2lmeSh2YWwpfSwgYDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcyArIGB9YDtcbn1cblxuY29uc3Qgd2FzbUhlbHBlcklkID0gJ1xcMHZpdGUvd2FzbS1oZWxwZXInO1xuY29uc3Qgd2FzbUhlbHBlciA9IGFzeW5jIChvcHRzID0ge30sIHVybCkgPT4ge1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCdkYXRhOicpKSB7XG4gICAgICAgIGNvbnN0IHVybENvbnRlbnQgPSB1cmwucmVwbGFjZSgvXmRhdGE6Lio/YmFzZTY0LC8sICcnKTtcbiAgICAgICAgbGV0IGJ5dGVzO1xuICAgICAgICBpZiAodHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgQnVmZmVyLmZyb20gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGJ5dGVzID0gQnVmZmVyLmZyb20odXJsQ29udGVudCwgJ2Jhc2U2NCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBhdG9iID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKHVybENvbnRlbnQpO1xuICAgICAgICAgICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5U3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnl0ZXNbaV0gPSBiaW5hcnlTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGRlY29kZSBiYXNlNjQtZW5jb2RlZCBkYXRhIFVSTCwgQnVmZmVyIGFuZCBhdG9iIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYnl0ZXMsIG9wdHMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21kbi93ZWJhc3NlbWJseS1leGFtcGxlcy9pc3N1ZXMvNVxuICAgICAgICAvLyBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyByZXF1aXJlcyB0aGUgc2VydmVyIHRvIHByb3ZpZGUgdGhlXG4gICAgICAgIC8vIGNvcnJlY3QgTUlNRSB0eXBlIGZvciAud2FzbSBmaWxlcywgd2hpY2ggdW5mb3J0dW5hdGVseSBkb2Vzbid0IHdvcmsgZm9yXG4gICAgICAgIC8vIGEgbG90IG9mIHN0YXRpYyBmaWxlIHNlcnZlcnMsIHNvIHdlIGp1c3Qgd29yayBhcm91bmQgaXQgYnkgZ2V0dGluZyB0aGVcbiAgICAgICAgLy8gcmF3IGJ1ZmZlci5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSB8fCAnJztcbiAgICAgICAgaWYgKCdpbnN0YW50aWF0ZVN0cmVhbWluZycgaW4gV2ViQXNzZW1ibHkgJiZcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL3dhc20nKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcocmVzcG9uc2UsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJ1ZmZlciwgb3B0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5pbnN0YW5jZTtcbn07XG5jb25zdCB3YXNtSGVscGVyQ29kZSA9IHdhc21IZWxwZXIudG9TdHJpbmcoKTtcbmNvbnN0IHdhc21IZWxwZXJQbHVnaW4gPSAoY29uZmlnKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3ZpdGU6d2FzbS1oZWxwZXInLFxuICAgICAgICByZXNvbHZlSWQoaWQpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gd2FzbUhlbHBlcklkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBsb2FkKGlkKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT09IHdhc21IZWxwZXJJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgZXhwb3J0IGRlZmF1bHQgJHt3YXNtSGVscGVyQ29kZX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpZC5lbmRzV2l0aCgnLndhc20/aW5pdCcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgZmlsZVRvVXJsKGlkLCBjb25maWcsIHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIGBcbmltcG9ydCBpbml0V2FzbSBmcm9tIFwiJHt3YXNtSGVscGVySWR9XCJcbmV4cG9ydCBkZWZhdWx0IG9wdHMgPT4gaW5pdFdhc20ob3B0cywgJHtKU09OLnN0cmluZ2lmeSh1cmwpfSlcbmA7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5jb25zdCB3YXNtRmFsbGJhY2tQbHVnaW4gPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3ZpdGU6d2FzbS1mYWxsYmFjaycsXG4gICAgICAgIGFzeW5jIGxvYWQoaWQpIHtcbiAgICAgICAgICAgIGlmICghaWQuZW5kc1dpdGgoJy53YXNtJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiRVNNIGludGVncmF0aW9uIHByb3Bvc2FsIGZvciBXYXNtXCIgaXMgbm90IHN1cHBvcnRlZCBjdXJyZW50bHkuICcgK1xuICAgICAgICAgICAgICAgICdVc2Ugdml0ZS1wbHVnaW4td2FzbSBvciBvdGhlciBjb21tdW5pdHkgcGx1Z2lucyB0byBoYW5kbGUgdGhpcy4gJyArXG4gICAgICAgICAgICAgICAgJ0FsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIGAud2FzbT9pbml0YCBvciBgLndhc20/dXJsYC4gJyArXG4gICAgICAgICAgICAgICAgJ1NlZSBodHRwczovL3ZpdGVqcy5kZXYvZ3VpZGUvZmVhdHVyZXMuaHRtbCN3ZWJhc3NlbWJseSBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgICAgICB9LFxuICAgIH07XG59O1xuXG4vKipcbiAqIEEgcGx1Z2luIHRvIGF2b2lkIGFuIGFsaWFzZWQgQU5EIG9wdGltaXplZCBkZXAgZnJvbSBiZWluZyBhbGlhc2VkIGluIHNyY1xuICovXG5mdW5jdGlvbiBwcmVBbGlhc1BsdWdpbihjb25maWcpIHtcbiAgICBjb25zdCBmaW5kUGF0dGVybnMgPSBnZXRBbGlhc1BhdHRlcm5zKGNvbmZpZy5yZXNvbHZlLmFsaWFzKTtcbiAgICBjb25zdCBpc0NvbmZpZ3VyZWRBc0V4dGVybmFsID0gY3JlYXRlSXNDb25maWd1cmVkQXNTc3JFeHRlcm5hbChjb25maWcpO1xuICAgIGNvbnN0IGlzQnVpbGQgPSBjb25maWcuY29tbWFuZCA9PT0gJ2J1aWxkJztcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTpwcmUtYWxpYXMnLFxuICAgICAgICBhc3luYyByZXNvbHZlSWQoaWQsIGltcG9ydGVyLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBzc3IgPSBvcHRpb25zPy5zc3IgPT09IHRydWU7XG4gICAgICAgICAgICBjb25zdCBkZXBzT3B0aW1pemVyID0gZ2V0RGVwc09wdGltaXplcihjb25maWcsIHNzcik7XG4gICAgICAgICAgICBpZiAoaW1wb3J0ZXIgJiZcbiAgICAgICAgICAgICAgICBkZXBzT3B0aW1pemVyICYmXG4gICAgICAgICAgICAgICAgYmFyZUltcG9ydFJFLnRlc3QoaWQpICYmXG4gICAgICAgICAgICAgICAgIW9wdGlvbnM/LnNjYW4gJiZcbiAgICAgICAgICAgICAgICBpZCAhPT0gJ0B2aXRlL2NsaWVudCcgJiZcbiAgICAgICAgICAgICAgICBpZCAhPT0gJ0B2aXRlL2VudicpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmluZFBhdHRlcm5zLmZpbmQoKHBhdHRlcm4pID0+IG1hdGNoZXMocGF0dGVybiwgaWQpKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpbWl6ZWRJZCA9IGF3YWl0IHRyeU9wdGltaXplZFJlc29sdmUoZGVwc09wdGltaXplciwgaWQsIGltcG9ydGVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGltaXplZElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW1pemVkSWQ7IC8vIGFsaWFzZWQgZGVwIGFscmVhZHkgb3B0aW1pemVkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLnJlc29sdmUoaWQsIGltcG9ydGVyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwU2VsZjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQgJiYgIWRlcHNPcHRpbWl6ZXIuaXNPcHRpbWl6ZWREZXBGaWxlKHJlc29sdmVkLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW1pemVEZXBzID0gZGVwc09wdGltaXplci5vcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IGNsZWFuVXJsKHJlc29sdmVkLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVmlydHVhbCA9IHJlc29sdmVkSWQgPT09IGlkIHx8IHJlc29sdmVkSWQuaW5jbHVkZXMoJ1xcMCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZpcnR1YWwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcyRsLmV4aXN0c1N5bmMocmVzb2x2ZWRJZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbW9kdWxlTGlzdENvbnRhaW5zKG9wdGltaXplRGVwcy5leGNsdWRlLCBpZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoJG8uaXNBYnNvbHV0ZShyZXNvbHZlZElkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNvbHZlZElkLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZURlcHMuaW5jbHVkZT8uaW5jbHVkZXMoaWQpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3B0aW1pemFibGUocmVzb2x2ZWRJZCwgb3B0aW1pemVEZXBzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoaXNCdWlsZCAmJiBzc3IgJiYgaXNDb25maWd1cmVkQXNFeHRlcm5hbChpZCkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzc3IgfHwgb3B0aW1pemVBbGlhc1JlcGxhY2VtZW50Rm9yU1NSKHJlc29sdmVkSWQsIG9wdGltaXplRGVwcykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxpYXNlZCBkZXAgaGFzIG5vdCB5ZXQgYmVlbiBvcHRpbWl6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpbWl6ZWRJbmZvID0gZGVwc09wdGltaXplci5yZWdpc3Rlck1pc3NpbmdJbXBvcnQoaWQsIHJlc29sdmVkSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGlkOiBkZXBzT3B0aW1pemVyLmdldE9wdGltaXplZERlcElkKG9wdGltaXplZEluZm8pIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufVxuZnVuY3Rpb24gb3B0aW1pemVBbGlhc1JlcGxhY2VtZW50Rm9yU1NSKGlkLCBvcHRpbWl6ZURlcHMpIHtcbiAgICBpZiAob3B0aW1pemVEZXBzLmluY2x1ZGU/LmluY2x1ZGVzKGlkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gSW4gdGhlIHJlZ3VsYXIgcmVzb2x1dGlvbiwgdGhlIGRlZmF1bHQgZm9yIG5vbi1leHRlcm5hbCBtb2R1bGVzIGlzIHRvXG4gICAgLy8gYmUgb3B0aW1pemVkIGlmIHRoZXkgYXJlIENKUy4gSGVyZSwgd2UgZG9uJ3QgaGF2ZSB0aGUgcGFja2FnZSBpZCBidXRcbiAgICAvLyBvbmx5IHRoZSByZXBsYWNlbWVudCBmaWxlIHBhdGguIFdlIGNvdWxkIGZpbmQgdGhlIHBhY2thZ2UuanNvbiBmcm9tXG4gICAgLy8gdGhlIGlkIGFuZCByZXNwZWN0IHRoZSBzYW1lIGRlZmF1bHQgaW4gdGhlIGZ1dHVyZS5cbiAgICAvLyBEZWZhdWx0IHRvIG5vdCBvcHRpbWl6ZSBhbiBhbGlhc2VkIHJlcGxhY2VtZW50IGZvciBub3csIGZvcmNpbmcgdGhlXG4gICAgLy8gdXNlciB0byBleHBsaWNpdGx5IGFkZCBpdCB0byB0aGUgc3NyLm9wdGltaXplRGVwcy5pbmNsdWRlIGxpc3QuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLy8gSW4gc3luYyB3aXRoIHJvbGx1cCBwbHVnaW4gYWxpYXMgbG9naWNcbmZ1bmN0aW9uIG1hdGNoZXMocGF0dGVybiwgaW1wb3J0ZWUpIHtcbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gcGF0dGVybi50ZXN0KGltcG9ydGVlKTtcbiAgICB9XG4gICAgaWYgKGltcG9ydGVlLmxlbmd0aCA8IHBhdHRlcm4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGltcG9ydGVlID09PSBwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaW1wb3J0ZWUuc3RhcnRzV2l0aChwYXR0ZXJuICsgJy8nKTtcbn1cbmZ1bmN0aW9uIGdldEFsaWFzUGF0dGVybnMoZW50cmllcykge1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJpZXMpKSB7XG4gICAgICAgIHJldHVybiBlbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5LmZpbmQpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZW50cmllcykubWFwKChbZmluZF0pID0+IGZpbmQpO1xufVxuXG5jb25zdCBub25Kc1JlID0gL1xcLmpzb24oPzokfFxcPykvO1xuY29uc3QgbWV0YUVudlJlID0gL2ltcG9ydFxcLm1ldGFcXC5lbnZcXC4oLispLztcbmNvbnN0IGlzTm9uSnNSZXF1ZXN0ID0gKHJlcXVlc3QpID0+IG5vbkpzUmUudGVzdChyZXF1ZXN0KTtcbmZ1bmN0aW9uIGRlZmluZVBsdWdpbihjb25maWcpIHtcbiAgICBjb25zdCBpc0J1aWxkID0gY29uZmlnLmNvbW1hbmQgPT09ICdidWlsZCc7XG4gICAgY29uc3QgaXNCdWlsZExpYiA9IGlzQnVpbGQgJiYgY29uZmlnLmJ1aWxkLmxpYjtcbiAgICAvLyBpZ25vcmUgcmVwbGFjZSBwcm9jZXNzLmVudiBpbiBsaWIgYnVpbGRcbiAgICBjb25zdCBwcm9jZXNzRW52ID0ge307XG4gICAgY29uc3QgcHJvY2Vzc05vZGVFbnYgPSB7fTtcbiAgICBpZiAoIWlzQnVpbGRMaWIpIHtcbiAgICAgICAgY29uc3Qgbm9kZUVudiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8IGNvbmZpZy5tb2RlO1xuICAgICAgICBPYmplY3QuYXNzaWduKHByb2Nlc3NFbnYsIHtcbiAgICAgICAgICAgICdwcm9jZXNzLmVudi4nOiBgKHt9KS5gLFxuICAgICAgICAgICAgJ2dsb2JhbC5wcm9jZXNzLmVudi4nOiBgKHt9KS5gLFxuICAgICAgICAgICAgJ2dsb2JhbFRoaXMucHJvY2Vzcy5lbnYuJzogYCh7fSkuYCxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocHJvY2Vzc05vZGVFbnYsIHtcbiAgICAgICAgICAgICdwcm9jZXNzLmVudi5OT0RFX0VOVic6IEpTT04uc3RyaW5naWZ5KG5vZGVFbnYpLFxuICAgICAgICAgICAgJ2dsb2JhbC5wcm9jZXNzLmVudi5OT0RFX0VOVic6IEpTT04uc3RyaW5naWZ5KG5vZGVFbnYpLFxuICAgICAgICAgICAgJ2dsb2JhbFRoaXMucHJvY2Vzcy5lbnYuTk9ERV9FTlYnOiBKU09OLnN0cmluZ2lmeShub2RlRW52KSxcbiAgICAgICAgICAgIF9fdml0ZV9wcm9jZXNzX2Vudl9OT0RFX0VOVjogSlNPTi5zdHJpbmdpZnkobm9kZUVudiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB1c2VyRGVmaW5lID0ge307XG4gICAgY29uc3QgdXNlckRlZmluZUVudiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGNvbmZpZy5kZWZpbmUpIHtcbiAgICAgICAgY29uc3QgdmFsID0gY29uZmlnLmRlZmluZVtrZXldO1xuICAgICAgICB1c2VyRGVmaW5lW2tleV0gPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IHZhbCA6IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSBgaW1wb3J0Lm1ldGEuZW52YCBvYmplY3QgaGFzIHVzZXIgZGVmaW5lIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKGlzQnVpbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0ga2V5Lm1hdGNoKG1ldGFFbnZSZSk7XG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICB1c2VyRGVmaW5lRW52W21hdGNoWzFdXSA9XG4gICAgICAgICAgICAgICAgICAgIC8vIHRlc3QgaWYgdmFsdWUgaXMgcmF3IGlkZW50aWZpZXIgdG8gd3JhcCB3aXRoIF9fdml0ZV9fIHNvIHdoZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5naWZpZWQgZm9yIGBpbXBvcnQubWV0YS5lbnZgLCB3ZSBjYW4gcmVtb3ZlIHRoZSBxdW90ZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJldGFpbiBiZWluZyBhbiBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIC9eW1xccHtMfV8kXS91LnRlc3QodmFsLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYF9fdml0ZV9fZGVmaW5lX18ke3ZhbH1gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBkdXJpbmcgZGV2LCBpbXBvcnQubWV0YSBwcm9wZXJ0aWVzIGFyZSBoYW5kbGVkIGJ5IGltcG9ydEFuYWx5c2lzIHBsdWdpbi5cbiAgICBjb25zdCBpbXBvcnRNZXRhS2V5cyA9IHt9O1xuICAgIGNvbnN0IGltcG9ydE1ldGFGYWxsYmFja0tleXMgPSB7fTtcbiAgICBpZiAoaXNCdWlsZCkge1xuICAgICAgICAvLyBzZXQgaGVyZSB0byBhbGxvdyBvdmVycmlkZSB3aXRoIGNvbmZpZy5kZWZpbmVcbiAgICAgICAgaW1wb3J0TWV0YUtleXNbJ2ltcG9ydC5tZXRhLmhvdCddID0gYHVuZGVmaW5lZGA7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNvbmZpZy5lbnYpIHtcbiAgICAgICAgICAgIGltcG9ydE1ldGFLZXlzW2BpbXBvcnQubWV0YS5lbnYuJHtrZXl9YF0gPSBKU09OLnN0cmluZ2lmeShjb25maWcuZW52W2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaW1wb3J0TWV0YUZhbGxiYWNrS2V5cywge1xuICAgICAgICAgICAgJ2ltcG9ydC5tZXRhLmVudi4nOiBgKHt9KS5gLFxuICAgICAgICAgICAgJ2ltcG9ydC5tZXRhLmVudic6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAuLi5jb25maWcuZW52LFxuICAgICAgICAgICAgICAgIFNTUjogJ19fdml0ZV9fc3NyX18nLFxuICAgICAgICAgICAgICAgIC4uLnVzZXJEZWZpbmVFbnYsXG4gICAgICAgICAgICB9KS5yZXBsYWNlKC9cIl9fdml0ZV9fZGVmaW5lX18oLis/KVwiL2csIChfLCB2YWwpID0+IHZhbCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJbXBvcnRNZXRhS2V5cyhzc3IpIHtcbiAgICAgICAgaWYgKCFpc0J1aWxkKVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uaW1wb3J0TWV0YUtleXMsXG4gICAgICAgICAgICAnaW1wb3J0Lm1ldGEuZW52LlNTUic6IHNzciArICcnLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJbXBvcnRNZXRhRmFsbGJhY2tLZXlzKHNzcikge1xuICAgICAgICBpZiAoIWlzQnVpbGQpXG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5pbXBvcnRNZXRhRmFsbGJhY2tLZXlzLFxuICAgICAgICAgICAgJ2ltcG9ydC5tZXRhLmVudic6IGltcG9ydE1ldGFGYWxsYmFja0tleXNbJ2ltcG9ydC5tZXRhLmVudiddLnJlcGxhY2UoJ1wiX192aXRlX19zc3JfX1wiJywgc3NyICsgJycpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVBhdHRlcm4oc3NyKSB7XG4gICAgICAgIGNvbnN0IHJlcGxhY2VQcm9jZXNzRW52ID0gIXNzciB8fCBjb25maWcuc3NyPy50YXJnZXQgPT09ICd3ZWJ3b3JrZXInO1xuICAgICAgICBjb25zdCByZXBsYWNlbWVudHMgPSB7XG4gICAgICAgICAgICAuLi4ocmVwbGFjZVByb2Nlc3NFbnYgPyBwcm9jZXNzTm9kZUVudiA6IHt9KSxcbiAgICAgICAgICAgIC4uLmdldEltcG9ydE1ldGFLZXlzKHNzciksXG4gICAgICAgICAgICAuLi51c2VyRGVmaW5lLFxuICAgICAgICAgICAgLi4uZ2V0SW1wb3J0TWV0YUZhbGxiYWNrS2V5cyhzc3IpLFxuICAgICAgICAgICAgLi4uKHJlcGxhY2VQcm9jZXNzRW52ID8gcHJvY2Vzc0VudiA6IHt9KSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGlzQnVpbGQgJiYgIXJlcGxhY2VQcm9jZXNzRW52KSB7XG4gICAgICAgICAgICByZXBsYWNlbWVudHNbJ19fdml0ZV9wcm9jZXNzX2Vudl9OT0RFX0VOViddID0gJ3Byb2Nlc3MuZW52Lk5PREVfRU5WJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXBsYWNlbWVudHNLZXlzID0gT2JqZWN0LmtleXMocmVwbGFjZW1lbnRzKTtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHJlcGxhY2VtZW50c0tleXMubGVuZ3RoXG4gICAgICAgICAgICA/IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAvLyBNdXN0bid0IGJlIHByZWNlZGVkIGJ5IGEgY2hhciB0aGF0IGNhbiBiZSBwYXJ0IG9mIGFuIGlkZW50aWZpZXJcbiAgICAgICAgICAgIC8vIG9yIGEgJy4nIHRoYXQgaXNuJ3QgcGFydCBvZiBhIHNwcmVhZCBvcGVyYXRvclxuICAgICAgICAgICAgJyg/PCFbXFxcXHB7TH1cXFxccHtOfV8kXXwoPzwhXFxcXC5cXFxcLilcXFxcLikoJyArXG4gICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzS2V5c1xuICAgICAgICAgICAgICAgICAgICAubWFwKChzdHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLVtcXF0ve30oKSorPy5cXFxcXiR8XS9nLCAnXFxcXCQmJyk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ3wnKSArXG4gICAgICAgICAgICAgICAgLy8gTXVzdG4ndCBiZSBmb2xsb3dlZCBieSBhIGNoYXIgdGhhdCBjYW4gYmUgcGFydCBvZiBhbiBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgLy8gb3IgYW4gYXNzaWdubWVudCAoYnV0IGFsbG93IGVxdWFsaXR5IG9wZXJhdG9ycylcbiAgICAgICAgICAgICAgICAnKSg/Oig/PD1cXFxcLil8KD8hW1xcXFxwe0x9XFxcXHB7Tn1fJF18XFxcXHMqPz1bXj1dKSknLCAnZ3UnKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICByZXR1cm4gW3JlcGxhY2VtZW50cywgcGF0dGVybl07XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRQYXR0ZXJuID0gZ2VuZXJhdGVQYXR0ZXJuKGZhbHNlKTtcbiAgICBjb25zdCBzc3JQYXR0ZXJuID0gZ2VuZXJhdGVQYXR0ZXJuKHRydWUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmRlZmluZScsXG4gICAgICAgIHRyYW5zZm9ybShjb2RlLCBpZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3Qgc3NyID0gb3B0aW9ucz8uc3NyID09PSB0cnVlO1xuICAgICAgICAgICAgaWYgKCFzc3IgJiYgIWlzQnVpbGQpIHtcbiAgICAgICAgICAgICAgICAvLyBmb3IgZGV2IHdlIGluamVjdCBhY3R1YWwgZ2xvYmFsIGRlZmluZXMgaW4gdGhlIHZpdGUgY2xpZW50IHRvXG4gICAgICAgICAgICAgICAgLy8gYXZvaWQgdGhlIHRyYW5zZm9ybSBjb3N0LlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIGV4Y2x1ZGUgaHRtbCwgY3NzIGFuZCBzdGF0aWMgYXNzZXRzIGZvciBwZXJmb3JtYW5jZVxuICAgICAgICAgICAgaXNIVE1MUmVxdWVzdChpZCkgfHxcbiAgICAgICAgICAgICAgICBpc0NTU1JlcXVlc3QoaWQpIHx8XG4gICAgICAgICAgICAgICAgaXNOb25Kc1JlcXVlc3QoaWQpIHx8XG4gICAgICAgICAgICAgICAgY29uZmlnLmFzc2V0c0luY2x1ZGUoaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgW3JlcGxhY2VtZW50cywgcGF0dGVybl0gPSBzc3IgPyBzc3JQYXR0ZXJuIDogZGVmYXVsdFBhdHRlcm47XG4gICAgICAgICAgICBpZiAoIXBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzc3IgJiYgIWlzQnVpbGQpIHtcbiAgICAgICAgICAgICAgICAvLyBzc3IgKyBkZXYsIHNpbXBsZSByZXBsYWNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUucmVwbGFjZShwYXR0ZXJuLCAoXywgbWF0Y2gpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnICsgcmVwbGFjZW1lbnRzW21hdGNoXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgTWFnaWNTdHJpbmcoY29kZSk7XG4gICAgICAgICAgICBsZXQgaGFzUmVwbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBtYXRjaDtcbiAgICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoY29kZSkpKSB7XG4gICAgICAgICAgICAgICAgaGFzUmVwbGFjZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gbWF0Y2guaW5kZXg7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSAnJyArIHJlcGxhY2VtZW50c1ttYXRjaFsxXV07XG4gICAgICAgICAgICAgICAgcy51cGRhdGUoc3RhcnQsIGVuZCwgcmVwbGFjZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFoYXNSZXBsYWNlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVN0YWJsZVJlc3VsdChzLCBpZCwgY29uZmlnKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5jb25zdCBpZ25vcmVGbGFnUkUgPSAvXFwvXFwqXFxzKkB2aXRlLWlnbm9yZVxccypcXCpcXC8vO1xuZnVuY3Rpb24gZXJyKGUsIHBvcykge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGUpO1xuICAgIGVycm9yLnBvcyA9IHBvcztcbiAgICByZXR1cm4gZXJyb3I7XG59XG5mdW5jdGlvbiBwYXJzZVdvcmtlck9wdGlvbnMocmF3T3B0cywgb3B0c1N0YXJ0SW5kZXgpIHtcbiAgICBsZXQgb3B0cyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICAgIG9wdHMgPSBldmFsVmFsdWUocmF3T3B0cyk7XG4gICAgfVxuICAgIGNhdGNoIHtcbiAgICAgICAgdGhyb3cgZXJyKCdWaXRlIGlzIHVuYWJsZSB0byBwYXJzZSB0aGUgd29ya2VyIG9wdGlvbnMgYXMgdGhlIHZhbHVlIGlzIG5vdCBzdGF0aWMuJyArXG4gICAgICAgICAgICAnVG8gaWdub3JlIHRoaXMgZXJyb3IsIHBsZWFzZSB1c2UgLyogQHZpdGUtaWdub3JlICovIGluIHRoZSB3b3JrZXIgb3B0aW9ucy4nLCBvcHRzU3RhcnRJbmRleCk7XG4gICAgfVxuICAgIGlmIChvcHRzID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IGVycihgRXhwZWN0ZWQgd29ya2VyIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0LCBnb3QgJHt0eXBlb2Ygb3B0c31gLCBvcHRzU3RhcnRJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBvcHRzO1xufVxuZnVuY3Rpb24gZ2V0V29ya2VyVHlwZShyYXcsIGNsZWFuLCBpKSB7XG4gICAgY29uc3QgY29tbWFJbmRleCA9IGNsZWFuLmluZGV4T2YoJywnLCBpKTtcbiAgICBpZiAoY29tbWFJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuICdjbGFzc2ljJztcbiAgICB9XG4gICAgY29uc3QgZW5kSW5kZXggPSBjbGVhbi5pbmRleE9mKCcpJywgaSk7XG4gICAgLy8gY2FzZTogJykgLi4uICwnIG1lYW4gbm8gd29ya2VyIG9wdGlvbnMgcGFyYW1zXG4gICAgaWYgKGNvbW1hSW5kZXggPiBlbmRJbmRleCkge1xuICAgICAgICByZXR1cm4gJ2NsYXNzaWMnO1xuICAgIH1cbiAgICAvLyBuZWVkIHRvIGZpbmQgaW4gY29tbWVudCBjb2RlXG4gICAgY29uc3Qgd29ya2VyT3B0U3RyaW5nID0gcmF3XG4gICAgICAgIC5zdWJzdHJpbmcoY29tbWFJbmRleCArIDEsIGVuZEluZGV4KVxuICAgICAgICAucmVwbGFjZSgvXFx9W1xcc1xcU10qLC9nLCAnfScpOyAvLyBzdHJpcCB0cmFpbGluZyBjb21tYSBmb3IgcGFyc2luZ1xuICAgIGNvbnN0IGhhc1ZpdGVJZ25vcmUgPSBpZ25vcmVGbGFnUkUudGVzdCh3b3JrZXJPcHRTdHJpbmcpO1xuICAgIGlmIChoYXNWaXRlSWdub3JlKSB7XG4gICAgICAgIHJldHVybiAnaWdub3JlJztcbiAgICB9XG4gICAgLy8gbmVlZCB0byBmaW5kIGluIG5vIGNvbW1lbnQgY29kZVxuICAgIGNvbnN0IGNsZWFuV29ya2VyT3B0U3RyaW5nID0gY2xlYW4uc3Vic3RyaW5nKGNvbW1hSW5kZXggKyAxLCBlbmRJbmRleCkudHJpbSgpO1xuICAgIGlmICghY2xlYW5Xb3JrZXJPcHRTdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAnY2xhc3NpYyc7XG4gICAgfVxuICAgIGNvbnN0IHdvcmtlck9wdHMgPSBwYXJzZVdvcmtlck9wdGlvbnMod29ya2VyT3B0U3RyaW5nLCBjb21tYUluZGV4ICsgMSk7XG4gICAgaWYgKHdvcmtlck9wdHMudHlwZSAmJiBbJ2NsYXNzaWMnLCAnbW9kdWxlJ10uaW5jbHVkZXMod29ya2VyT3B0cy50eXBlKSkge1xuICAgICAgICByZXR1cm4gd29ya2VyT3B0cy50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gJ2NsYXNzaWMnO1xufVxuZnVuY3Rpb24gd29ya2VySW1wb3J0TWV0YVVybFBsdWdpbihjb25maWcpIHtcbiAgICBjb25zdCBpc0J1aWxkID0gY29uZmlnLmNvbW1hbmQgPT09ICdidWlsZCc7XG4gICAgbGV0IHdvcmtlclJlc29sdmVyO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOndvcmtlci1pbXBvcnQtbWV0YS11cmwnLFxuICAgICAgICBhc3luYyB0cmFuc2Zvcm0oY29kZSwgaWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNzciA9IG9wdGlvbnM/LnNzciA9PT0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucz8uc3NyICYmXG4gICAgICAgICAgICAgICAgKGNvZGUuaW5jbHVkZXMoJ25ldyBXb3JrZXInKSB8fCBjb2RlLmluY2x1ZGVzKCduZXcgU2hhcmVkV29ya2VyJykpICYmXG4gICAgICAgICAgICAgICAgY29kZS5pbmNsdWRlcygnbmV3IFVSTCcpICYmXG4gICAgICAgICAgICAgICAgY29kZS5pbmNsdWRlcyhgaW1wb3J0Lm1ldGEudXJsYCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmVxdWVzdChpZCk7XG4gICAgICAgICAgICAgICAgbGV0IHM7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xlYW5TdHJpbmcgPSBzdHJpcExpdGVyYWwoY29kZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29ya2VySW1wb3J0TWV0YVVybFJFID0gL1xcYm5ld1xccysoPzpXb3JrZXJ8U2hhcmVkV29ya2VyKVxccypcXChcXHMqKG5ld1xccytVUkxcXHMqXFwoXFxzKignW14nXSsnfFwiW15cIl0rXCJ8YFteYF0rYClcXHMqLFxccyppbXBvcnRcXC5tZXRhXFwudXJsXFxzKlxcKSkvZztcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2g7XG4gICAgICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHdvcmtlckltcG9ydE1ldGFVcmxSRS5leGVjKGNsZWFuU3RyaW5nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyAwOiBhbGxFeHAsIDE6IGV4cCwgMjogZW1wdHlVcmwsIGluZGV4IH0gPSBtYXRjaDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsSW5kZXggPSBhbGxFeHAuaW5kZXhPZihleHApICsgaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybFN0YXJ0ID0gY2xlYW5TdHJpbmcuaW5kZXhPZihlbXB0eVVybCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxFbmQgPSB1cmxTdGFydCArIGVtcHR5VXJsLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VXJsID0gY29kZS5zbGljZSh1cmxTdGFydCwgdXJsRW5kKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcG90ZW50aWFsIGR5bmFtaWMgdGVtcGxhdGUgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYXdVcmxbMF0gPT09ICdgJyAmJiAvXFwkXFx7Ly50ZXN0KHJhd1VybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoYFxcYG5ldyBVUkwodXJsLCBpbXBvcnQubWV0YS51cmwpXFxgIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZHluYW1pYyB0ZW1wbGF0ZSBzdHJpbmcuYCwgdXJsSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHMgfHwgKHMgPSBuZXcgTWFnaWNTdHJpbmcoY29kZSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JrZXJUeXBlID0gZ2V0V29ya2VyVHlwZShjb2RlLCBjbGVhblN0cmluZywgaW5kZXggKyBhbGxFeHAubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gcmF3VXJsLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gcGF0aCRvLnJlc29sdmUocGF0aCRvLmRpcm5hbWUoaWQpLCB1cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyUmVzb2x2ZXIgPz8gKHdvcmtlclJlc29sdmVyID0gY29uZmlnLmNyZWF0ZVJlc29sdmVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlJbmRleDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVyUmVsYXRpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gYXdhaXQgd29ya2VyUmVzb2x2ZXIodXJsLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlID8/IChmaWxlID0gdXJsLnN0YXJ0c1dpdGgoJy8nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2xhc2gkMShwYXRoJG8uam9pbihjb25maWcucHVibGljRGlyLCB1cmwpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2xhc2gkMShwYXRoJG8ucmVzb2x2ZShwYXRoJG8uZGlybmFtZShpZCksIHVybCkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgYnVpbHRVcmw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0J1aWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXREZXBzT3B0aW1pemVyKGNvbmZpZywgc3NyKT8ucmVnaXN0ZXJXb3JrZXJzU291cmNlKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0VXJsID0gYXdhaXQgd29ya2VyRmlsZVRvVXJsKGNvbmZpZywgZmlsZSwgcXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRVcmwgPSBhd2FpdCBmaWxlVG9VcmwoY2xlYW5VcmwoZmlsZSksIGNvbmZpZywgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWlsdFVybCA9IGluamVjdFF1ZXJ5KGJ1aWx0VXJsLCBXT1JLRVJfRklMRV9JRCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWlsdFVybCA9IGluamVjdFF1ZXJ5KGJ1aWx0VXJsLCBgdHlwZT0ke3dvcmtlclR5cGV9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcy51cGRhdGUodXJsSW5kZXgsIHVybEluZGV4ICsgZXhwLmxlbmd0aCwgYG5ldyBVUkwoJHtKU09OLnN0cmluZ2lmeShidWlsdFVybCl9LCBzZWxmLmxvY2F0aW9uKWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtU3RhYmxlUmVzdWx0KHMsIGlkLCBjb25maWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnQgYG5ldyBVUkwoJy4vZm9vLnBuZycsIGltcG9ydC5tZXRhLnVybClgIHRvIGl0cyByZXNvbHZlZCBidWlsdCBVUkxcbiAqXG4gKiBTdXBwb3J0cyB0ZW1wbGF0ZSBzdHJpbmcgd2l0aCBkeW5hbWljIHNlZ21lbnRzOlxuICogYGBgXG4gKiBuZXcgVVJMKGAuL2Rpci8ke25hbWV9LnBuZ2AsIGltcG9ydC5tZXRhLnVybClcbiAqIC8vIHRyYW5zZm9ybWVkIHRvXG4gKiBpbXBvcnQubWV0YS5nbG9iKCcuL2Rpci8qKi5wbmcnLCB7IGVhZ2VyOiB0cnVlLCBpbXBvcnQ6ICdkZWZhdWx0JyB9KVtgLi9kaXIvJHtuYW1lfS5wbmdgXVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGFzc2V0SW1wb3J0TWV0YVVybFBsdWdpbihjb25maWcpIHtcbiAgICBjb25zdCBub3JtYWxpemVkUHVibGljRGlyID0gbm9ybWFsaXplUGF0aCQzKGNvbmZpZy5wdWJsaWNEaXIpO1xuICAgIGxldCBhc3NldFJlc29sdmVyO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmFzc2V0LWltcG9ydC1tZXRhLXVybCcsXG4gICAgICAgIGFzeW5jIHRyYW5zZm9ybShjb2RlLCBpZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zPy5zc3IgJiZcbiAgICAgICAgICAgICAgICBpZCAhPT0gcHJlbG9hZEhlbHBlcklkICYmXG4gICAgICAgICAgICAgICAgY29kZS5pbmNsdWRlcygnbmV3IFVSTCcpICYmXG4gICAgICAgICAgICAgICAgY29kZS5pbmNsdWRlcyhgaW1wb3J0Lm1ldGEudXJsYCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcztcbiAgICAgICAgICAgICAgICBjb25zdCBhc3NldEltcG9ydE1ldGFVcmxSRSA9IC9cXGJuZXdcXHMrVVJMXFxzKlxcKFxccyooJ1teJ10rJ3xcIlteXCJdK1wifGBbXmBdK2ApXFxzKixcXHMqaW1wb3J0XFwubWV0YVxcLnVybFxccyooPzosXFxzKik/XFwpL2c7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xlYW5TdHJpbmcgPSBzdHJpcExpdGVyYWwoY29kZSk7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoO1xuICAgICAgICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBhc3NldEltcG9ydE1ldGFVcmxSRS5leGVjKGNsZWFuU3RyaW5nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyAwOiBleHAsIDE6IGVtcHR5VXJsLCBpbmRleCB9ID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybFN0YXJ0ID0gY2xlYW5TdHJpbmcuaW5kZXhPZihlbXB0eVVybCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmxFbmQgPSB1cmxTdGFydCArIGVtcHR5VXJsLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VXJsID0gY29kZS5zbGljZSh1cmxTdGFydCwgdXJsRW5kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcyA9IG5ldyBNYWdpY1N0cmluZyhjb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcG90ZW50aWFsIGR5bmFtaWMgdGVtcGxhdGUgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIGlmIChyYXdVcmxbMF0gPT09ICdgJyAmJiAvXFwkXFx7Ly50ZXN0KHJhd1VybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzdCA9IHRoaXMucGFyc2UocmF3VXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlTGl0ZXJhbCA9IGFzdC5ib2R5WzBdLmV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVMaXRlcmFsLmV4cHJlc3Npb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm4gPSBKU09OLnN0cmluZ2lmeShidWlsZEdsb2JQYXR0ZXJuKHRlbXBsYXRlTGl0ZXJhbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IG5hdGl2ZSBpbXBvcnQubWV0YS51cmwgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgYmFzZWxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgc28gd2UgdXNlIHRoZSBnbG9iYWwgbG9jYXRpb24gaGVyZS4gSXQgY2FuIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93LmxvY2F0aW9uIG9yIHNlbGYubG9jYXRpb24gaW4gY2FzZSBpdCBpcyB1c2VkIGluIGEgV2ViIFdvcmtlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvc2VsZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudXBkYXRlKGluZGV4LCBpbmRleCArIGV4cC5sZW5ndGgsIGBuZXcgVVJMKChpbXBvcnQubWV0YS5nbG9iKCR7cGF0dGVybn0sIHsgZWFnZXI6IHRydWUsIGltcG9ydDogJ2RlZmF1bHQnLCBhczogJ3VybCcgfSkpWyR7cmF3VXJsfV0sIHNlbGYubG9jYXRpb24pYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gcmF3VXJsLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gc2xhc2gkMShwYXRoJG8ucmVzb2x2ZShwYXRoJG8uZGlybmFtZShpZCksIHVybCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXRSZXNvbHZlciA/PyAoYXNzZXRSZXNvbHZlciA9IGNvbmZpZy5jcmVhdGVSZXNvbHZlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkZpZWxkczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5SW5kZXg6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlclJlbGF0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGF3YWl0IGFzc2V0UmVzb2x2ZXIodXJsLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlID8/IChmaWxlID0gdXJsLnN0YXJ0c1dpdGgoJy8nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2xhc2gkMShwYXRoJG8uam9pbihjb25maWcucHVibGljRGlyLCB1cmwpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2xhc2gkMShwYXRoJG8ucmVzb2x2ZShwYXRoJG8uZGlybmFtZShpZCksIHVybCkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgZmluYWwgYXNzZXQgVVJMLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCxcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgZmFsbCBiYWNrIHRvIHRoZSBpbml0aWFsIFVSTCBhbmQgbGV0IGl0IHJlc29sdmUgaW4gcnVudGltZVxuICAgICAgICAgICAgICAgICAgICBsZXQgYnVpbHRVcmw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1BhcmVudERpcmVjdG9yeShub3JtYWxpemVkUHVibGljRGlyLCBmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdWJsaWNQYXRoID0gJy8nICsgcGF0aCRvLnBvc2l4LnJlbGF0aXZlKG5vcm1hbGl6ZWRQdWJsaWNEaXIsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsdFVybCA9IGF3YWl0IGZpbGVUb1VybChwdWJsaWNQYXRoLCBjb25maWcsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRVcmwgPSBhd2FpdCBmaWxlVG9VcmwoZmlsZSwgY29uZmlnLCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZywgd2UnbGwgbG9nIGEgd2FybmluZyBhZnRlciB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidWlsdFVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3RXhwID0gY29kZS5zbGljZShpbmRleCwgaW5kZXggKyBleHAubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIud2Fybk9uY2UoYFxcbiR7cmF3RXhwfSBkb2Vzbid0IGV4aXN0IGF0IGJ1aWxkIHRpbWUsIGl0IHdpbGwgcmVtYWluIHVuY2hhbmdlZCB0byBiZSByZXNvbHZlZCBhdCBydW50aW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWlsdFVybCA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzLnVwZGF0ZShpbmRleCwgaW5kZXggKyBleHAubGVuZ3RoLCBgbmV3IFVSTCgke0pTT04uc3RyaW5naWZ5KGJ1aWx0VXJsKX0sIHNlbGYubG9jYXRpb24pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1TdGFibGVSZXN1bHQocywgaWQsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkR2xvYlBhdHRlcm4oYXN0KSB7XG4gICAgbGV0IHBhdHRlcm4gPSAnJztcbiAgICBsZXQgbGFzdEVsZW1lbnRJbmRleCA9IC0xO1xuICAgIGZvciAoY29uc3QgZXhwIG9mIGFzdC5leHByZXNzaW9ucykge1xuICAgICAgICBmb3IgKGxldCBpID0gbGFzdEVsZW1lbnRJbmRleCArIDE7IGkgPCBhc3QucXVhc2lzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbCA9IGFzdC5xdWFzaXNbaV07XG4gICAgICAgICAgICBpZiAoZWwuZW5kIDwgZXhwLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgcGF0dGVybiArPSBlbC52YWx1ZS5yYXc7XG4gICAgICAgICAgICAgICAgbGFzdEVsZW1lbnRJbmRleCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGF0dGVybiArPSAnKionO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gbGFzdEVsZW1lbnRJbmRleCArIDE7IGkgPCBhc3QucXVhc2lzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBhdHRlcm4gKz0gYXN0LnF1YXNpc1tpXS52YWx1ZS5yYXc7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuO1xufVxuXG4vKipcbiAqIHBsdWdpbiB0byBlbnN1cmUgcm9sbHVwIGNhbiB3YXRjaCBjb3JyZWN0bHkuXG4gKi9cbmZ1bmN0aW9uIGVuc3VyZVdhdGNoUGx1Z2luKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmVuc3VyZS13YXRjaCcsXG4gICAgICAgIGxvYWQoaWQpIHtcbiAgICAgICAgICAgIGlmIChxdWVyeVJFLnRlc3QoaWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRXYXRjaEZpbGUoY2xlYW5VcmwoaWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbi8qKlxuICogUHJlcGFyZXMgdGhlIHJlbmRlcmVkIGNodW5rcyB0byBjb250YWluIGFkZGl0aW9uYWwgbWV0YWRhdGEgZHVyaW5nIGJ1aWxkLlxuICovXG5mdW5jdGlvbiBtZXRhZGF0YVBsdWdpbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTpidWlsZC1tZXRhZGF0YScsXG4gICAgICAgIGFzeW5jIHJlbmRlckNodW5rKF9jb2RlLCBjaHVuaykge1xuICAgICAgICAgICAgY2h1bmsudml0ZU1ldGFkYXRhID0ge1xuICAgICAgICAgICAgICAgIGltcG9ydGVkQXNzZXRzOiBuZXcgU2V0KCksXG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRDc3M6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5jbGFzcyBWYXJpYWJsZUR5bmFtaWNJbXBvcnRFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgKi9cbmNvbnN0IGV4YW1wbGUgPSAnRm9yIGV4YW1wbGU6IGltcG9ydChgLi9mb28vJHtiYXJ9LmpzYCkuJztcblxuZnVuY3Rpb24gc2FuaXRpemVTdHJpbmcoc3RyKSB7XG4gIGlmIChzdHIuaW5jbHVkZXMoJyonKSkge1xuICAgIHRocm93IG5ldyBWYXJpYWJsZUR5bmFtaWNJbXBvcnRFcnJvcignQSBkeW5hbWljIGltcG9ydCBjYW5ub3QgY29udGFpbiAqIGNoYXJhY3RlcnMuJyk7XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gdGVtcGxhdGVMaXRlcmFsVG9HbG9iKG5vZGUpIHtcbiAgbGV0IGdsb2IgPSAnJztcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUucXVhc2lzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgZ2xvYiArPSBzYW5pdGl6ZVN0cmluZyhub2RlLnF1YXNpc1tpXS52YWx1ZS5yYXcpO1xuICAgIGlmIChub2RlLmV4cHJlc3Npb25zW2ldKSB7XG4gICAgICBnbG9iICs9IGV4cHJlc3Npb25Ub0dsb2Iobm9kZS5leHByZXNzaW9uc1tpXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdsb2I7XG59XG5cbmZ1bmN0aW9uIGNhbGxFeHByZXNzaW9uVG9HbG9iKG5vZGUpIHtcbiAgY29uc3QgeyBjYWxsZWUgfSA9IG5vZGU7XG4gIGlmIChcbiAgICBjYWxsZWUudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nICYmXG4gICAgY2FsbGVlLnByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJlxuICAgIGNhbGxlZS5wcm9wZXJ0eS5uYW1lID09PSAnY29uY2F0J1xuICApIHtcbiAgICByZXR1cm4gYCR7ZXhwcmVzc2lvblRvR2xvYihjYWxsZWUub2JqZWN0KX0ke25vZGUuYXJndW1lbnRzLm1hcChleHByZXNzaW9uVG9HbG9iKS5qb2luKCcnKX1gO1xuICB9XG4gIHJldHVybiAnKic7XG59XG5cbmZ1bmN0aW9uIGJpbmFyeUV4cHJlc3Npb25Ub0dsb2Iobm9kZSkge1xuICBpZiAobm9kZS5vcGVyYXRvciAhPT0gJysnKSB7XG4gICAgdGhyb3cgbmV3IFZhcmlhYmxlRHluYW1pY0ltcG9ydEVycm9yKGAke25vZGUub3BlcmF0b3J9IG9wZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQuYCk7XG4gIH1cblxuICByZXR1cm4gYCR7ZXhwcmVzc2lvblRvR2xvYihub2RlLmxlZnQpfSR7ZXhwcmVzc2lvblRvR2xvYihub2RlLnJpZ2h0KX1gO1xufVxuXG5mdW5jdGlvbiBleHByZXNzaW9uVG9HbG9iKG5vZGUpIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlICdUZW1wbGF0ZUxpdGVyYWwnOlxuICAgICAgcmV0dXJuIHRlbXBsYXRlTGl0ZXJhbFRvR2xvYihub2RlKTtcbiAgICBjYXNlICdDYWxsRXhwcmVzc2lvbic6XG4gICAgICByZXR1cm4gY2FsbEV4cHJlc3Npb25Ub0dsb2Iobm9kZSk7XG4gICAgY2FzZSAnQmluYXJ5RXhwcmVzc2lvbic6XG4gICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvblRvR2xvYihub2RlKTtcbiAgICBjYXNlICdMaXRlcmFsJzoge1xuICAgICAgcmV0dXJuIHNhbml0aXplU3RyaW5nKG5vZGUudmFsdWUpO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcqJztcbiAgfVxufVxuXG5jb25zdCBkZWZhdWx0UHJvdG9jb2wgPSAnZmlsZTonO1xuY29uc3QgaWdub3JlZFByb3RvY29scyA9IFsnZGF0YTonLCAnaHR0cDonLCAnaHR0cHM6J107XG5cbmZ1bmN0aW9uIHNob3VsZElnbm9yZShnbG9iKSB7XG4gIGNvbnN0IGNvbnRhaW5zQXN0ZXJpc2sgPSBnbG9iLmluY2x1ZGVzKCcqJyk7XG5cbiAgY29uc3QgZ2xvYlVSTCA9IG5ldyBVUkwoZ2xvYiwgZGVmYXVsdFByb3RvY29sKTtcblxuICBjb25zdCBjb250YWluc0lnbm9yZWRQcm90b2NvbCA9IGlnbm9yZWRQcm90b2NvbHMuc29tZShcbiAgICAoaWdub3JlZFByb3RvY29sKSA9PiBpZ25vcmVkUHJvdG9jb2wgPT09IGdsb2JVUkwucHJvdG9jb2xcbiAgKTtcblxuICByZXR1cm4gIWNvbnRhaW5zQXN0ZXJpc2sgfHwgY29udGFpbnNJZ25vcmVkUHJvdG9jb2w7XG59XG5cbmZ1bmN0aW9uIGR5bmFtaWNJbXBvcnRUb0dsb2Iobm9kZSwgc291cmNlU3RyaW5nKSB7XG4gIGxldCBnbG9iID0gZXhwcmVzc2lvblRvR2xvYihub2RlKTtcblxuICBpZiAoc2hvdWxkSWdub3JlKGdsb2IpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnbG9iID0gZ2xvYi5yZXBsYWNlKC9cXCpcXCovZywgJyonKTtcblxuICBpZiAoZ2xvYi5zdGFydHNXaXRoKCcqJykpIHtcbiAgICB0aHJvdyBuZXcgVmFyaWFibGVEeW5hbWljSW1wb3J0RXJyb3IoXG4gICAgICBgaW52YWxpZCBpbXBvcnQgXCIke3NvdXJjZVN0cmluZ31cIi4gSXQgY2Fubm90IGJlIHN0YXRpY2FsbHkgYW5hbHl6ZWQuIFZhcmlhYmxlIGR5bmFtaWMgaW1wb3J0cyBtdXN0IHN0YXJ0IHdpdGggLi8gYW5kIGJlIGxpbWl0ZWQgdG8gYSBzcGVjaWZpYyBkaXJlY3RvcnkuICR7ZXhhbXBsZX1gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChnbG9iLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHRocm93IG5ldyBWYXJpYWJsZUR5bmFtaWNJbXBvcnRFcnJvcihcbiAgICAgIGBpbnZhbGlkIGltcG9ydCBcIiR7c291cmNlU3RyaW5nfVwiLiBWYXJpYWJsZSBhYnNvbHV0ZSBpbXBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkLCBpbXBvcnRzIG11c3Qgc3RhcnQgd2l0aCAuLyBpbiB0aGUgc3RhdGljIHBhcnQgb2YgdGhlIGltcG9ydC4gJHtleGFtcGxlfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKCFnbG9iLnN0YXJ0c1dpdGgoJy4vJykgJiYgIWdsb2Iuc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICB0aHJvdyBuZXcgVmFyaWFibGVEeW5hbWljSW1wb3J0RXJyb3IoXG4gICAgICBgaW52YWxpZCBpbXBvcnQgXCIke3NvdXJjZVN0cmluZ31cIi4gVmFyaWFibGUgYmFyZSBpbXBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkLCBpbXBvcnRzIG11c3Qgc3RhcnQgd2l0aCAuLyBpbiB0aGUgc3RhdGljIHBhcnQgb2YgdGhlIGltcG9ydC4gJHtleGFtcGxlfWBcbiAgICApO1xuICB9XG5cbiAgLy8gRGlzYWxsb3cgLi8qLmV4dFxuICBjb25zdCBvd25EaXJlY3RvcnlTdGFyRXh0ZW5zaW9uID0gL15cXC5cXC9cXCpcXC5bXFx3XSskLztcbiAgaWYgKG93bkRpcmVjdG9yeVN0YXJFeHRlbnNpb24udGVzdChnbG9iKSkge1xuICAgIHRocm93IG5ldyBWYXJpYWJsZUR5bmFtaWNJbXBvcnRFcnJvcihcbiAgICAgIGAke1xuICAgICAgICBgaW52YWxpZCBpbXBvcnQgXCIke3NvdXJjZVN0cmluZ31cIi4gVmFyaWFibGUgaW1wb3J0cyBjYW5ub3QgaW1wb3J0IHRoZWlyIG93biBkaXJlY3RvcnksIGAgK1xuICAgICAgICAncGxhY2UgaW1wb3J0cyBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeSBvciBtYWtlIHRoZSBpbXBvcnQgZmlsZW5hbWUgbW9yZSBzcGVjaWZpYy4gJ1xuICAgICAgfSR7ZXhhbXBsZX1gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChyZXF1aXJlJCQwJDQuZXh0bmFtZShnbG9iKSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVmFyaWFibGVEeW5hbWljSW1wb3J0RXJyb3IoXG4gICAgICBgaW52YWxpZCBpbXBvcnQgXCIke3NvdXJjZVN0cmluZ31cIi4gQSBmaWxlIGV4dGVuc2lvbiBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBzdGF0aWMgcGFydCBvZiB0aGUgaW1wb3J0LiAke2V4YW1wbGV9YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZ2xvYjtcbn1cblxuY29uc3QgZHluYW1pY0ltcG9ydEhlbHBlcklkID0gJ1xcMHZpdGUvZHluYW1pYy1pbXBvcnQtaGVscGVyJztcbmNvbnN0IGR5bmFtaWNJbXBvcnRIZWxwZXIgPSAoZ2xvYiwgcGF0aCkgPT4ge1xuICAgIGNvbnN0IHYgPSBnbG9iW3BhdGhdO1xuICAgIGlmICh2KSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyA/IHYoKSA6IFByb21pc2UucmVzb2x2ZSh2KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+IHtcbiAgICAgICAgKHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJyA/IHF1ZXVlTWljcm90YXNrIDogc2V0VGltZW91dCkocmVqZWN0LmJpbmQobnVsbCwgbmV3IEVycm9yKCdVbmtub3duIHZhcmlhYmxlIGR5bmFtaWMgaW1wb3J0OiAnICsgcGF0aCkpKTtcbiAgICB9KTtcbn07XG5mdW5jdGlvbiBwYXJzZUR5bmFtaWNJbXBvcnRQYXR0ZXJuKHN0cmluZ3MpIHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHN0cmluZ3Muc2xpY2UoMSwgLTEpO1xuICAgIGNvbnN0IHJhd1F1ZXJ5ID0gcGFyc2VSZXF1ZXN0KGZpbGVuYW1lKTtcbiAgICBsZXQgZ2xvYlBhcmFtcyA9IG51bGw7XG4gICAgY29uc3QgYXN0ID0gcGFyc2UkZChzdHJpbmdzLCB7XG4gICAgICAgIGVjbWFWZXJzaW9uOiAnbGF0ZXN0JyxcbiAgICAgICAgc291cmNlVHlwZTogJ21vZHVsZScsXG4gICAgfSkuYm9keVswXS5leHByZXNzaW9uO1xuICAgIGNvbnN0IHVzZXJQYXR0ZXJuUXVlcnkgPSBkeW5hbWljSW1wb3J0VG9HbG9iKGFzdCwgZmlsZW5hbWUpO1xuICAgIGlmICghdXNlclBhdHRlcm5RdWVyeSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgW3VzZXJQYXR0ZXJuXSA9IHVzZXJQYXR0ZXJuUXVlcnkuc3BsaXQocmVxdWVzdFF1ZXJ5U3BsaXRSRSwgMik7XG4gICAgY29uc3QgW3Jhd1BhdHRlcm5dID0gZmlsZW5hbWUuc3BsaXQocmVxdWVzdFF1ZXJ5U3BsaXRSRSwgMik7XG4gICAgaWYgKHJhd1F1ZXJ5Py5yYXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBnbG9iUGFyYW1zID0geyBhczogJ3JhdycgfTtcbiAgICB9XG4gICAgaWYgKHJhd1F1ZXJ5Py51cmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBnbG9iUGFyYW1zID0geyBhczogJ3VybCcgfTtcbiAgICB9XG4gICAgaWYgKHJhd1F1ZXJ5Py53b3JrZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBnbG9iUGFyYW1zID0geyBhczogJ3dvcmtlcicgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2xvYlBhcmFtcyxcbiAgICAgICAgdXNlclBhdHRlcm4sXG4gICAgICAgIHJhd1BhdHRlcm4sXG4gICAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybUR5bmFtaWNJbXBvcnQoaW1wb3J0U291cmNlLCBpbXBvcnRlciwgcmVzb2x2ZSwgcm9vdCkge1xuICAgIGlmIChpbXBvcnRTb3VyY2VbMV0gIT09ICcuJyAmJiBpbXBvcnRTb3VyY2VbMV0gIT09ICcvJykge1xuICAgICAgICBjb25zdCByZXNvbHZlZEZpbGVOYW1lID0gYXdhaXQgcmVzb2x2ZShpbXBvcnRTb3VyY2Uuc2xpY2UoMSwgLTEpLCBpbXBvcnRlcik7XG4gICAgICAgIGlmICghcmVzb2x2ZWRGaWxlTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVsYXRpdmVGaWxlTmFtZSA9IHBvc2l4JDEucmVsYXRpdmUocG9zaXgkMS5kaXJuYW1lKG5vcm1hbGl6ZVBhdGgkMyhpbXBvcnRlcikpLCBub3JtYWxpemVQYXRoJDMocmVzb2x2ZWRGaWxlTmFtZSkpO1xuICAgICAgICBpbXBvcnRTb3VyY2UgPSBub3JtYWxpemVQYXRoJDMoJ2AnICsgKHJlbGF0aXZlRmlsZU5hbWVbMF0gPT09ICcuJyA/ICcnIDogJy4vJykgKyByZWxhdGl2ZUZpbGVOYW1lICsgJ2AnKTtcbiAgICB9XG4gICAgY29uc3QgZHluYW1pY0ltcG9ydFBhdHRlcm4gPSBwYXJzZUR5bmFtaWNJbXBvcnRQYXR0ZXJuKGltcG9ydFNvdXJjZSk7XG4gICAgaWYgKCFkeW5hbWljSW1wb3J0UGF0dGVybikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyBnbG9iUGFyYW1zLCByYXdQYXR0ZXJuLCB1c2VyUGF0dGVybiB9ID0gZHluYW1pY0ltcG9ydFBhdHRlcm47XG4gICAgY29uc3QgcGFyYW1zID0gZ2xvYlBhcmFtc1xuICAgICAgICA/IGAsICR7SlNPTi5zdHJpbmdpZnkoeyAuLi5nbG9iUGFyYW1zLCBpbXBvcnQ6ICcqJyB9KX1gXG4gICAgICAgIDogJyc7XG4gICAgbGV0IG5ld1Jhd1BhdHRlcm4gPSBwb3NpeCQxLnJlbGF0aXZlKHBvc2l4JDEuZGlybmFtZShpbXBvcnRlciksIGF3YWl0IHRvQWJzb2x1dGVHbG9iKHJhd1BhdHRlcm4sIHJvb3QsIGltcG9ydGVyLCByZXNvbHZlKSk7XG4gICAgaWYgKCEvXlxcLnsxLDJ9XFwvLy50ZXN0KG5ld1Jhd1BhdHRlcm4pKSB7XG4gICAgICAgIG5ld1Jhd1BhdHRlcm4gPSBgLi8ke25ld1Jhd1BhdHRlcm59YDtcbiAgICB9XG4gICAgY29uc3QgZXhwID0gYChpbXBvcnQubWV0YS5nbG9iKCR7SlNPTi5zdHJpbmdpZnkodXNlclBhdHRlcm4pfSR7cGFyYW1zfSkpYDtcbiAgICByZXR1cm4ge1xuICAgICAgICByYXdQYXR0ZXJuOiBuZXdSYXdQYXR0ZXJuLFxuICAgICAgICBwYXR0ZXJuOiB1c2VyUGF0dGVybixcbiAgICAgICAgZ2xvYjogZXhwLFxuICAgIH07XG59XG5mdW5jdGlvbiBkeW5hbWljSW1wb3J0VmFyc1BsdWdpbihjb25maWcpIHtcbiAgICBjb25zdCByZXNvbHZlID0gY29uZmlnLmNyZWF0ZVJlc29sdmVyKHtcbiAgICAgICAgcHJlZmVyUmVsYXRpdmU6IHRydWUsXG4gICAgICAgIHRyeUluZGV4OiBmYWxzZSxcbiAgICAgICAgZXh0ZW5zaW9uczogW10sXG4gICAgfSk7XG4gICAgY29uc3QgeyBpbmNsdWRlLCBleGNsdWRlLCB3YXJuT25FcnJvciB9ID0gY29uZmlnLmJ1aWxkLmR5bmFtaWNJbXBvcnRWYXJzT3B0aW9ucztcbiAgICBjb25zdCBmaWx0ZXIgPSBjcmVhdGVGaWx0ZXIoaW5jbHVkZSwgZXhjbHVkZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogJ3ZpdGU6ZHluYW1pYy1pbXBvcnQtdmFycycsXG4gICAgICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgICAgICAgaWYgKGlkID09PSBkeW5hbWljSW1wb3J0SGVscGVySWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxvYWQoaWQpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gZHluYW1pY0ltcG9ydEhlbHBlcklkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdleHBvcnQgZGVmYXVsdCAnICsgZHluYW1pY0ltcG9ydEhlbHBlci50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyB0cmFuc2Zvcm0oc291cmNlLCBpbXBvcnRlcikge1xuICAgICAgICAgICAgaWYgKCFmaWx0ZXIoaW1wb3J0ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgaW5pdDtcbiAgICAgICAgICAgIGxldCBpbXBvcnRzID0gW107XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGltcG9ydHMgPSBwYXJzZSRlKHNvdXJjZSlbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhcyBpdCBtaWdodCBub3QgYmUgYSBKUyBmaWxlLCB0aGUgc3Vic2VxdWVudCBwbHVnaW5zIHdpbGwgY2F0Y2ggdGhlIGVycm9yXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWltcG9ydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcztcbiAgICAgICAgICAgIGxldCBuZWVkRHluYW1pY0ltcG9ydEhlbHBlciA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGltcG9ydHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzOiBzdGFydCwgZTogZW5kLCBzczogZXhwU3RhcnQsIHNlOiBleHBFbmQsIGQ6IGR5bmFtaWNJbmRleCwgfSA9IGltcG9ydHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChkeW5hbWljSW5kZXggPT09IC0xIHx8IHNvdXJjZVtzdGFydF0gIT09ICdgJykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcyB8fCAocyA9IG5ldyBNYWdpY1N0cmluZyhzb3VyY2UpKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gaW1wb3J0IHN0cmluZyBpcyB1c2luZyBiYWNrdGlja3MsIGVzLW1vZHVsZS1sZXhlciBgZW5kYCBjYXB0dXJlc1xuICAgICAgICAgICAgICAgICAgICAvLyB1bnRpbCB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcywgaW5zdGVhZCBvZiB0aGUgY2xvc2luZyBiYWNrdGljay5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgbWF5IGJlIGlubGluZSBjb21tZW50cyBiZXR3ZWVuIHRoZSBiYWNrdGljayBhbmQgdGhlIGNsb3NpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50aGVzaXMsIHNvIHdlIG1hbnVhbGx5IHJlbW92ZSB0aGVtIGZvciBub3cuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZ3V5YmVkZm9yZC9lcy1tb2R1bGUtbGV4ZXIvaXNzdWVzLzExOFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRTb3VyY2UgPSByZW1vdmVDb21tZW50cyhzb3VyY2Uuc2xpY2Uoc3RhcnQsIGVuZCkpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3JtRHluYW1pY0ltcG9ydChpbXBvcnRTb3VyY2UsIGltcG9ydGVyLCByZXNvbHZlLCBjb25maWcucm9vdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2Fybk9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2FybihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgeyByYXdQYXR0ZXJuLCBnbG9iIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgbmVlZER5bmFtaWNJbXBvcnRIZWxwZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHMub3ZlcndyaXRlKGV4cFN0YXJ0LCBleHBFbmQsIGBfX3ZhcmlhYmxlRHluYW1pY0ltcG9ydFJ1bnRpbWVIZWxwZXIoJHtnbG9ifSwgXFxgJHtyYXdQYXR0ZXJufVxcYClgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWREeW5hbWljSW1wb3J0SGVscGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHMucHJlcGVuZChgaW1wb3J0IF9fdmFyaWFibGVEeW5hbWljSW1wb3J0UnVudGltZUhlbHBlciBmcm9tIFwiJHtkeW5hbWljSW1wb3J0SGVscGVySWR9XCI7YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1TdGFibGVSZXN1bHQocywgaW1wb3J0ZXIsIGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpbnMoY29uZmlnLCBwcmVQbHVnaW5zLCBub3JtYWxQbHVnaW5zLCBwb3N0UGx1Z2lucykge1xuICAgIGNvbnN0IGlzQnVpbGQgPSBjb25maWcuY29tbWFuZCA9PT0gJ2J1aWxkJztcbiAgICBjb25zdCBpc1dhdGNoID0gaXNCdWlsZCAmJiAhIWNvbmZpZy5idWlsZC53YXRjaDtcbiAgICBjb25zdCBidWlsZFBsdWdpbnMgPSBpc0J1aWxkXG4gICAgICAgID8gYXdhaXQgKGF3YWl0IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gYnVpbGQkMTsgfSkpLnJlc29sdmVCdWlsZFBsdWdpbnMoY29uZmlnKVxuICAgICAgICA6IHsgcHJlOiBbXSwgcG9zdDogW10gfTtcbiAgICBjb25zdCB7IG1vZHVsZVByZWxvYWQgfSA9IGNvbmZpZy5idWlsZDtcbiAgICByZXR1cm4gW1xuICAgICAgICBpc1dhdGNoID8gZW5zdXJlV2F0Y2hQbHVnaW4oKSA6IG51bGwsXG4gICAgICAgIGlzQnVpbGQgPyBtZXRhZGF0YVBsdWdpbigpIDogbnVsbCxcbiAgICAgICAgcHJlQWxpYXNQbHVnaW4oY29uZmlnKSxcbiAgICAgICAgYWxpYXMkMSh7IGVudHJpZXM6IGNvbmZpZy5yZXNvbHZlLmFsaWFzIH0pLFxuICAgICAgICAuLi5wcmVQbHVnaW5zLFxuICAgICAgICBtb2R1bGVQcmVsb2FkID09PSB0cnVlIHx8XG4gICAgICAgICAgICAodHlwZW9mIG1vZHVsZVByZWxvYWQgPT09ICdvYmplY3QnICYmIG1vZHVsZVByZWxvYWQucG9seWZpbGwpXG4gICAgICAgICAgICA/IG1vZHVsZVByZWxvYWRQb2x5ZmlsbFBsdWdpbihjb25maWcpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIC4uLihpc0RlcHNPcHRpbWl6ZXJFbmFibGVkKGNvbmZpZywgZmFsc2UpIHx8XG4gICAgICAgICAgICBpc0RlcHNPcHRpbWl6ZXJFbmFibGVkKGNvbmZpZywgdHJ1ZSlcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgIGlzQnVpbGRcbiAgICAgICAgICAgICAgICAgICAgPyBvcHRpbWl6ZWREZXBzQnVpbGRQbHVnaW4oY29uZmlnKVxuICAgICAgICAgICAgICAgICAgICA6IG9wdGltaXplZERlcHNQbHVnaW4oY29uZmlnKSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICByZXNvbHZlUGx1Z2luKHtcbiAgICAgICAgICAgIC4uLmNvbmZpZy5yZXNvbHZlLFxuICAgICAgICAgICAgcm9vdDogY29uZmlnLnJvb3QsXG4gICAgICAgICAgICBpc1Byb2R1Y3Rpb246IGNvbmZpZy5pc1Byb2R1Y3Rpb24sXG4gICAgICAgICAgICBpc0J1aWxkLFxuICAgICAgICAgICAgcGFja2FnZUNhY2hlOiBjb25maWcucGFja2FnZUNhY2hlLFxuICAgICAgICAgICAgc3NyQ29uZmlnOiBjb25maWcuc3NyLFxuICAgICAgICAgICAgYXNTcmM6IHRydWUsXG4gICAgICAgICAgICBnZXREZXBzT3B0aW1pemVyOiAoc3NyKSA9PiBnZXREZXBzT3B0aW1pemVyKGNvbmZpZywgc3NyKSxcbiAgICAgICAgICAgIHNob3VsZEV4dGVybmFsaXplOiBpc0J1aWxkICYmIGNvbmZpZy5idWlsZC5zc3IgJiYgY29uZmlnLnNzcj8uZm9ybWF0ICE9PSAnY2pzJ1xuICAgICAgICAgICAgICAgID8gKGlkKSA9PiBzaG91bGRFeHRlcm5hbGl6ZUZvclNTUihpZCwgY29uZmlnKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KSxcbiAgICAgICAgaHRtbElubGluZVByb3h5UGx1Z2luKGNvbmZpZyksXG4gICAgICAgIGNzc1BsdWdpbihjb25maWcpLFxuICAgICAgICBjb25maWcuZXNidWlsZCAhPT0gZmFsc2UgPyBlc2J1aWxkUGx1Z2luKGNvbmZpZy5lc2J1aWxkKSA6IG51bGwsXG4gICAgICAgIGpzb25QbHVnaW4oe1xuICAgICAgICAgICAgbmFtZWRFeHBvcnRzOiB0cnVlLFxuICAgICAgICAgICAgLi4uY29uZmlnLmpzb24sXG4gICAgICAgIH0sIGlzQnVpbGQpLFxuICAgICAgICB3YXNtSGVscGVyUGx1Z2luKGNvbmZpZyksXG4gICAgICAgIHdlYldvcmtlclBsdWdpbihjb25maWcpLFxuICAgICAgICBhc3NldFBsdWdpbihjb25maWcpLFxuICAgICAgICAuLi5ub3JtYWxQbHVnaW5zLFxuICAgICAgICB3YXNtRmFsbGJhY2tQbHVnaW4oKSxcbiAgICAgICAgZGVmaW5lUGx1Z2luKGNvbmZpZyksXG4gICAgICAgIGNzc1Bvc3RQbHVnaW4oY29uZmlnKSxcbiAgICAgICAgaXNCdWlsZCAmJiBidWlsZEh0bWxQbHVnaW4oY29uZmlnKSxcbiAgICAgICAgd29ya2VySW1wb3J0TWV0YVVybFBsdWdpbihjb25maWcpLFxuICAgICAgICBhc3NldEltcG9ydE1ldGFVcmxQbHVnaW4oY29uZmlnKSxcbiAgICAgICAgLi4uYnVpbGRQbHVnaW5zLnByZSxcbiAgICAgICAgZHluYW1pY0ltcG9ydFZhcnNQbHVnaW4oY29uZmlnKSxcbiAgICAgICAgaW1wb3J0R2xvYlBsdWdpbihjb25maWcpLFxuICAgICAgICAuLi5wb3N0UGx1Z2lucyxcbiAgICAgICAgLi4uYnVpbGRQbHVnaW5zLnBvc3QsXG4gICAgICAgIC8vIGludGVybmFsIHNlcnZlci1vbmx5IHBsdWdpbnMgYXJlIGFsd2F5cyBhcHBsaWVkIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICAuLi4oaXNCdWlsZFxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiBbY2xpZW50SW5qZWN0aW9uc1BsdWdpbihjb25maWcpLCBpbXBvcnRBbmFseXNpc1BsdWdpbihjb25maWcpXSksXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XG59XG5mdW5jdGlvbiBjcmVhdGVQbHVnaW5Ib29rVXRpbHMocGx1Z2lucykge1xuICAgIC8vIHNvcnQgcGx1Z2lucyBwZXIgaG9va1xuICAgIGNvbnN0IHNvcnRlZFBsdWdpbnNDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICBmdW5jdGlvbiBnZXRTb3J0ZWRQbHVnaW5zKGhvb2tOYW1lKSB7XG4gICAgICAgIGlmIChzb3J0ZWRQbHVnaW5zQ2FjaGUuaGFzKGhvb2tOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBzb3J0ZWRQbHVnaW5zQ2FjaGUuZ2V0KGhvb2tOYW1lKTtcbiAgICAgICAgY29uc3Qgc29ydGVkID0gZ2V0U29ydGVkUGx1Z2luc0J5SG9vayhob29rTmFtZSwgcGx1Z2lucyk7XG4gICAgICAgIHNvcnRlZFBsdWdpbnNDYWNoZS5zZXQoaG9va05hbWUsIHNvcnRlZCk7XG4gICAgICAgIHJldHVybiBzb3J0ZWQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFNvcnRlZFBsdWdpbkhvb2tzKGhvb2tOYW1lKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbnMgPSBnZXRTb3J0ZWRQbHVnaW5zKGhvb2tOYW1lKTtcbiAgICAgICAgcmV0dXJuIHBsdWdpbnNcbiAgICAgICAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhvb2sgPSBwW2hvb2tOYW1lXTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgaG9vayA9PT0gJ29iamVjdCcgJiYgJ2hhbmRsZXInIGluIGhvb2tcbiAgICAgICAgICAgICAgICA/IGhvb2suaGFuZGxlclxuICAgICAgICAgICAgICAgIDogaG9vaztcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGdldFNvcnRlZFBsdWdpbnMsXG4gICAgICAgIGdldFNvcnRlZFBsdWdpbkhvb2tzLFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRTb3J0ZWRQbHVnaW5zQnlIb29rKGhvb2tOYW1lLCBwbHVnaW5zKSB7XG4gICAgY29uc3QgcHJlID0gW107XG4gICAgY29uc3Qgbm9ybWFsID0gW107XG4gICAgY29uc3QgcG9zdCA9IFtdO1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgY29uc3QgaG9vayA9IHBsdWdpbltob29rTmFtZV07XG4gICAgICAgIGlmIChob29rKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhvb2sgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhvb2sub3JkZXIgPT09ICdwcmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZS5wdXNoKHBsdWdpbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaG9vay5vcmRlciA9PT0gJ3Bvc3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc3QucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub3JtYWwucHVzaChwbHVnaW4pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbLi4ucHJlLCAuLi5ub3JtYWwsIC4uLnBvc3RdO1xufVxuXG5mdW5jdGlvbiBhbnNpUmVnZXgoe29ubHlGaXJzdCA9IGZhbHNlfSA9IHt9KSB7XG5cdGNvbnN0IHBhdHRlcm4gPSBbXG5cdCAgICAnW1xcXFx1MDAxQlxcXFx1MDA5Ql1bW1xcXFxdKCkjOz9dKig/Oig/Oig/Oig/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSspKnxbYS16QS1aXFxcXGRdKyg/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSopKik/XFxcXHUwMDA3KScsXG5cdFx0Jyg/Oig/OlxcXFxkezEsNH0oPzo7XFxcXGR7MCw0fSkqKT9bXFxcXGRBLVBSLVRaY2YtbnRxcnk9Pjx+XSkpJ1xuXHRdLmpvaW4oJ3wnKTtcblxuXHRyZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLCBvbmx5Rmlyc3QgPyB1bmRlZmluZWQgOiAnZycpO1xufVxuXG5mdW5jdGlvbiBzdHJpcEFuc2koc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGEgXFxgc3RyaW5nXFxgLCBnb3QgXFxgJHt0eXBlb2Ygc3RyaW5nfVxcYGApO1xuXHR9XG5cblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKGFuc2lSZWdleCgpLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVFcnJvcihlcnIpIHtcbiAgICAvLyBvbmx5IGNvcHkgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQgYW5kIGF2b2lkIHNlcmlhbGl6aW5nIHVubmVjZXNzYXJ5XG4gICAgLy8gcHJvcGVydGllcywgc2luY2Ugc29tZSBlcnJvcnMgbWF5IGF0dGFjaCBmdWxsIG9iamVjdHMgKGUuZy4gUG9zdENTUylcbiAgICByZXR1cm4ge1xuICAgICAgICBtZXNzYWdlOiBzdHJpcEFuc2koZXJyLm1lc3NhZ2UpLFxuICAgICAgICBzdGFjazogc3RyaXBBbnNpKGNsZWFuU3RhY2soZXJyLnN0YWNrIHx8ICcnKSksXG4gICAgICAgIGlkOiBlcnIuaWQsXG4gICAgICAgIGZyYW1lOiBzdHJpcEFuc2koZXJyLmZyYW1lIHx8ICcnKSxcbiAgICAgICAgcGx1Z2luOiBlcnIucGx1Z2luLFxuICAgICAgICBwbHVnaW5Db2RlOiBlcnIucGx1Z2luQ29kZSxcbiAgICAgICAgbG9jOiBlcnIubG9jLFxuICAgIH07XG59XG5mdW5jdGlvbiBidWlsZEVycm9yTWVzc2FnZShlcnIsIGFyZ3MgPSBbXSwgaW5jbHVkZVN0YWNrID0gdHJ1ZSkge1xuICAgIGlmIChlcnIucGx1Z2luKVxuICAgICAgICBhcmdzLnB1c2goYCAgUGx1Z2luOiAke3BpY29jb2xvcnNFeHBvcnRzLm1hZ2VudGEoZXJyLnBsdWdpbil9YCk7XG4gICAgY29uc3QgbG9jID0gZXJyLmxvYyA/IGA6JHtlcnIubG9jLmxpbmV9OiR7ZXJyLmxvYy5jb2x1bW59YCA6ICcnO1xuICAgIGlmIChlcnIuaWQpXG4gICAgICAgIGFyZ3MucHVzaChgICBGaWxlOiAke3BpY29jb2xvcnNFeHBvcnRzLmN5YW4oZXJyLmlkKX0ke2xvY31gKTtcbiAgICBpZiAoZXJyLmZyYW1lKVxuICAgICAgICBhcmdzLnB1c2gocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KHBhZCQxKGVyci5mcmFtZSkpKTtcbiAgICBpZiAoaW5jbHVkZVN0YWNrICYmIGVyci5zdGFjaylcbiAgICAgICAgYXJncy5wdXNoKHBhZCQxKGNsZWFuU3RhY2soZXJyLnN0YWNrKSkpO1xuICAgIHJldHVybiBhcmdzLmpvaW4oJ1xcbicpO1xufVxuZnVuY3Rpb24gY2xlYW5TdGFjayhzdGFjaykge1xuICAgIHJldHVybiBzdGFja1xuICAgICAgICAuc3BsaXQoL1xcbi9nKVxuICAgICAgICAuZmlsdGVyKChsKSA9PiAvXlxccyphdC8udGVzdChsKSlcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xufVxuZnVuY3Rpb24gbG9nRXJyb3Ioc2VydmVyLCBlcnIpIHtcbiAgICBjb25zdCBtc2cgPSBidWlsZEVycm9yTWVzc2FnZShlcnIsIFtcbiAgICAgICAgcGljb2NvbG9yc0V4cG9ydHMucmVkKGBJbnRlcm5hbCBzZXJ2ZXIgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCksXG4gICAgXSk7XG4gICAgc2VydmVyLmNvbmZpZy5sb2dnZXIuZXJyb3IobXNnLCB7XG4gICAgICAgIGNsZWFyOiB0cnVlLFxuICAgICAgICB0aW1lc3RhbXA6IHRydWUsXG4gICAgICAgIGVycm9yOiBlcnIsXG4gICAgfSk7XG4gICAgc2VydmVyLndzLnNlbmQoe1xuICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICBlcnI6IHByZXBhcmVFcnJvcihlcnIpLFxuICAgIH0pO1xufVxuZnVuY3Rpb24gZXJyb3JNaWRkbGV3YXJlKHNlcnZlciwgYWxsb3dOZXh0ID0gZmFsc2UpIHtcbiAgICAvLyBub3RlIHRoZSA0IGFyZ3MgbXVzdCBiZSBrZXB0IGZvciBjb25uZWN0IHRvIHRyZWF0IHRoaXMgYXMgZXJyb3IgbWlkZGxld2FyZVxuICAgIC8vIEtlZXAgdGhlIG5hbWVkIGZ1bmN0aW9uLiBUaGUgbmFtZSBpcyB2aXNpYmxlIGluIGRlYnVnIGxvZ3MgdmlhIGBERUJVRz1jb25uZWN0OmRpc3BhdGNoZXIgLi4uYFxuICAgIHJldHVybiBmdW5jdGlvbiB2aXRlRXJyb3JNaWRkbGV3YXJlKGVyciwgX3JlcSwgcmVzLCBuZXh0KSB7XG4gICAgICAgIGxvZ0Vycm9yKHNlcnZlciwgZXJyKTtcbiAgICAgICAgaWYgKGFsbG93TmV4dCkge1xuICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgICAgICAgICByZXMuZW5kKGBcbiAgICAgICAgPCFET0NUWVBFIGh0bWw+XG4gICAgICAgIDxodG1sIGxhbmc9XCJlblwiPlxuICAgICAgICAgIDxoZWFkPlxuICAgICAgICAgICAgPG1ldGEgY2hhcnNldD1cIlVURi04XCIgLz5cbiAgICAgICAgICAgIDx0aXRsZT5FcnJvcjwvdGl0bGU+XG4gICAgICAgICAgICA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIj5cbiAgICAgICAgICAgICAgaW1wb3J0IHsgRXJyb3JPdmVybGF5IH0gZnJvbSAnL0B2aXRlL2NsaWVudCdcbiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChuZXcgRXJyb3JPdmVybGF5KCR7SlNPTi5zdHJpbmdpZnkocHJlcGFyZUVycm9yKGVycikpLnJlcGxhY2UoLzwvZywgJ1xcXFx1MDAzYycpfSkpXG4gICAgICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgICA8L2hlYWQ+XG4gICAgICAgICAgPGJvZHk+XG4gICAgICAgICAgPC9ib2R5PlxuICAgICAgICA8L2h0bWw+XG4gICAgICBgKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qKlxuICogVGhpcyBmaWxlIGlzIHJlZmFjdG9yZWQgaW50byBUeXBlU2NyaXB0IGJhc2VkIG9uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vcHJlYWN0anMvd21yL2Jsb2IvbWFpbi9wYWNrYWdlcy93bXIvc3JjL2xpYi9yb2xsdXAtcGx1Z2luLWNvbnRhaW5lci5qc1xuICovXG5sZXQgcGFyc2VyID0gUGFyc2VyJDE7XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVQbHVnaW5Db250YWluZXIoY29uZmlnLCBtb2R1bGVHcmFwaCwgd2F0Y2hlcikge1xuICAgIGNvbnN0IGlzRGVidWcgPSBwcm9jZXNzLmVudi5ERUJVRztcbiAgICBjb25zdCB7IHBsdWdpbnMsIGxvZ2dlciwgcm9vdCwgYnVpbGQ6IHsgcm9sbHVwT3B0aW9ucyB9LCB9ID0gY29uZmlnO1xuICAgIGNvbnN0IHsgZ2V0U29ydGVkUGx1Z2luSG9va3MsIGdldFNvcnRlZFBsdWdpbnMgfSA9IGNyZWF0ZVBsdWdpbkhvb2tVdGlscyhwbHVnaW5zKTtcbiAgICBjb25zdCBzZWVuUmVzb2x2ZXMgPSB7fTtcbiAgICBjb25zdCBkZWJ1Z1Jlc29sdmUgPSBjcmVhdGVEZWJ1Z2dlcigndml0ZTpyZXNvbHZlJyk7XG4gICAgY29uc3QgZGVidWdQbHVnaW5SZXNvbHZlID0gY3JlYXRlRGVidWdnZXIoJ3ZpdGU6cGx1Z2luLXJlc29sdmUnLCB7XG4gICAgICAgIG9ubHlXaGVuRm9jdXNlZDogJ3ZpdGU6cGx1Z2luJyxcbiAgICB9KTtcbiAgICBjb25zdCBkZWJ1Z1BsdWdpblRyYW5zZm9ybSA9IGNyZWF0ZURlYnVnZ2VyKCd2aXRlOnBsdWdpbi10cmFuc2Zvcm0nLCB7XG4gICAgICAgIG9ubHlXaGVuRm9jdXNlZDogJ3ZpdGU6cGx1Z2luJyxcbiAgICB9KTtcbiAgICBjb25zdCBkZWJ1Z1NvdXJjZW1hcENvbWJpbmVGbGFnID0gJ3ZpdGU6c291cmNlbWFwLWNvbWJpbmUnO1xuICAgIGNvbnN0IGlzRGVidWdTb3VyY2VtYXBDb21iaW5lRm9jdXNlZCA9IHByb2Nlc3MuZW52LkRFQlVHPy5pbmNsdWRlcyhkZWJ1Z1NvdXJjZW1hcENvbWJpbmVGbGFnKTtcbiAgICBjb25zdCBkZWJ1Z1NvdXJjZW1hcENvbWJpbmVGaWx0ZXIgPSBwcm9jZXNzLmVudi5ERUJVR19WSVRFX1NPVVJDRU1BUF9DT01CSU5FX0ZJTFRFUjtcbiAgICBjb25zdCBkZWJ1Z1NvdXJjZW1hcENvbWJpbmUgPSBjcmVhdGVEZWJ1Z2dlcigndml0ZTpzb3VyY2VtYXAtY29tYmluZScsIHtcbiAgICAgICAgb25seVdoZW5Gb2N1c2VkOiB0cnVlLFxuICAgIH0pO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0IHdhdGNoRmlsZXMgPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgbWluaW1hbENvbnRleHQgPSB7XG4gICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgIHJvbGx1cFZlcnNpb246IFZFUlNJT04sXG4gICAgICAgICAgICB3YXRjaE1vZGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBmdW5jdGlvbiB3YXJuSW5jb21wYXRpYmxlTWV0aG9kKG1ldGhvZCwgcGx1Z2luKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKHBpY29jb2xvcnNFeHBvcnRzLmN5YW4oYFtwbHVnaW46JHtwbHVnaW59XSBgKSArXG4gICAgICAgICAgICBwaWNvY29sb3JzRXhwb3J0cy55ZWxsb3coYGNvbnRleHQgbWV0aG9kICR7cGljb2NvbG9yc0V4cG9ydHMuYm9sZChgJHttZXRob2R9KClgKX0gaXMgbm90IHN1cHBvcnRlZCBpbiBzZXJ2ZSBtb2RlLiBUaGlzIHBsdWdpbiBpcyBsaWtlbHkgbm90IHZpdGUtY29tcGF0aWJsZS5gKSk7XG4gICAgfVxuICAgIC8vIHBhcmFsbGVsLCBpZ25vcmVzIHJldHVybnNcbiAgICBhc3luYyBmdW5jdGlvbiBob29rUGFyYWxsZWwoaG9va05hbWUsIGNvbnRleHQsIGFyZ3MpIHtcbiAgICAgICAgY29uc3QgcGFyYWxsZWxQcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBnZXRTb3J0ZWRQbHVnaW5zKGhvb2tOYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgaG9vayA9IHBsdWdpbltob29rTmFtZV07XG4gICAgICAgICAgICBpZiAoIWhvb2spXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGhvb2sgaXMgbm90IGEgcHJpbWl0aXZlXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gJ2hhbmRsZXInIGluIGhvb2sgPyBob29rLmhhbmRsZXIgOiBob29rO1xuICAgICAgICAgICAgaWYgKGhvb2suc2VxdWVudGlhbCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHBhcmFsbGVsUHJvbWlzZXMpO1xuICAgICAgICAgICAgICAgIHBhcmFsbGVsUHJvbWlzZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyLmFwcGx5KGNvbnRleHQocGx1Z2luKSwgYXJncyhwbHVnaW4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmFsbGVsUHJvbWlzZXMucHVzaChoYW5kbGVyLmFwcGx5KGNvbnRleHQocGx1Z2luKSwgYXJncyhwbHVnaW4pKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocGFyYWxsZWxQcm9taXNlcyk7XG4gICAgfVxuICAgIC8vIHRocm93IHdoZW4gYW4gdW5zdXBwb3J0ZWQgTW9kdWxlSW5mbyBwcm9wZXJ0eSBpcyBhY2Nlc3NlZCxcbiAgICAvLyBzbyB0aGF0IGluY29tcGF0aWJsZSBwbHVnaW5zIGZhaWwgaW4gYSBub24tY3J5cHRpYyB3YXkuXG4gICAgY29uc3QgTW9kdWxlSW5mb1Byb3h5ID0ge1xuICAgICAgICBnZXQoaW5mbywga2V5KSB7XG4gICAgICAgICAgICBpZiAoa2V5IGluIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5mb1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRG9uJ3QgdGhyb3cgYW4gZXJyb3Igd2hlbiByZXR1cm5pbmcgZnJvbSBhbiBhc3luYyBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ3RoZW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IEVycm9yKGBbdml0ZV0gVGhlIFwiJHtrZXl9XCIgcHJvcGVydHkgb2YgTW9kdWxlSW5mbyBpcyBub3Qgc3VwcG9ydGVkLmApO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgLy8gc2FtZSBkZWZhdWx0IHZhbHVlIG9mIFwibW9kdWxlSW5mby5tZXRhXCIgYXMgaW4gUm9sbHVwXG4gICAgY29uc3QgRU1QVFlfT0JKRUNUID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAgZnVuY3Rpb24gZ2V0TW9kdWxlSW5mbyhpZCkge1xuICAgICAgICBjb25zdCBtb2R1bGUgPSBtb2R1bGVHcmFwaD8uZ2V0TW9kdWxlQnlJZChpZCk7XG4gICAgICAgIGlmICghbW9kdWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vZHVsZS5pbmZvKSB7XG4gICAgICAgICAgICBtb2R1bGUuaW5mbyA9IG5ldyBQcm94eSh7IGlkLCBtZXRhOiBtb2R1bGUubWV0YSB8fCBFTVBUWV9PQkpFQ1QgfSwgTW9kdWxlSW5mb1Byb3h5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlLmluZm87XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZU1vZHVsZUluZm8oaWQsIHsgbWV0YSB9KSB7XG4gICAgICAgIGlmIChtZXRhKSB7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGVJbmZvID0gZ2V0TW9kdWxlSW5mbyhpZCk7XG4gICAgICAgICAgICBpZiAobW9kdWxlSW5mbykge1xuICAgICAgICAgICAgICAgIG1vZHVsZUluZm8ubWV0YSA9IHsgLi4ubW9kdWxlSW5mby5tZXRhLCAuLi5tZXRhIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gd2Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb250ZXh0IGZvciBlYWNoIGFzeW5jIGhvb2sgcGlwZWxpbmUgc28gdGhhdCB0aGVcbiAgICAvLyBhY3RpdmUgcGx1Z2luIGluIHRoYXQgcGlwZWxpbmUgY2FuIGJlIHRyYWNrZWQgaW4gYSBjb25jdXJyZW5jeS1zYWZlIG1hbm5lci5cbiAgICAvLyB1c2luZyBhIGNsYXNzIHRvIG1ha2UgY3JlYXRpbmcgbmV3IGNvbnRleHRzIG1vcmUgZWZmaWNpZW50XG4gICAgY2xhc3MgQ29udGV4dCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKGluaXRpYWxQbHVnaW4pIHtcbiAgICAgICAgICAgIHRoaXMubWV0YSA9IG1pbmltYWxDb250ZXh0Lm1ldGE7XG4gICAgICAgICAgICB0aGlzLnNzciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fc2NhbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlSWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlQ29kZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9hZGRlZEltcG9ydHMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlUGx1Z2luID0gaW5pdGlhbFBsdWdpbiB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHBhcnNlKGNvZGUsIG9wdHMgPSB7fSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZShjb2RlLCB7XG4gICAgICAgICAgICAgICAgc291cmNlVHlwZTogJ21vZHVsZScsXG4gICAgICAgICAgICAgICAgZWNtYVZlcnNpb246ICdsYXRlc3QnLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgcmVzb2x2ZShpZCwgaW1wb3J0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBza2lwO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LnNraXBTZWxmICYmIHRoaXMuX2FjdGl2ZVBsdWdpbikge1xuICAgICAgICAgICAgICAgIHNraXAgPSBuZXcgU2V0KHRoaXMuX3Jlc29sdmVTa2lwcyk7XG4gICAgICAgICAgICAgICAgc2tpcC5hZGQodGhpcy5fYWN0aXZlUGx1Z2luKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBvdXQgPSBhd2FpdCBjb250YWluZXIucmVzb2x2ZUlkKGlkLCBpbXBvcnRlciwge1xuICAgICAgICAgICAgICAgIGFzc2VydGlvbnM6IG9wdGlvbnM/LmFzc2VydGlvbnMsXG4gICAgICAgICAgICAgICAgY3VzdG9tOiBvcHRpb25zPy5jdXN0b20sXG4gICAgICAgICAgICAgICAgaXNFbnRyeTogISFvcHRpb25zPy5pc0VudHJ5LFxuICAgICAgICAgICAgICAgIHNraXAsXG4gICAgICAgICAgICAgICAgc3NyOiB0aGlzLnNzcixcbiAgICAgICAgICAgICAgICBzY2FuOiB0aGlzLl9zY2FuLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG91dCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgb3V0ID0geyBpZDogb3V0IH07XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGxvYWQob3B0aW9ucykge1xuICAgICAgICAgICAgLy8gV2UgbWF5IG5vdCBoYXZlIGFkZGVkIHRoaXMgdG8gb3VyIG1vZHVsZSBncmFwaCB5ZXQsIHNvIGVuc3VyZSBpdCBleGlzdHNcbiAgICAgICAgICAgIGF3YWl0IG1vZHVsZUdyYXBoPy5lbnN1cmVFbnRyeUZyb21Vcmwob3B0aW9ucy5pZCk7XG4gICAgICAgICAgICAvLyBOb3QgYWxsIG9wdGlvbnMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gbWFrZSBzZW5zZSBpbiB0aGUgY29udGV4dCBvZiBsb2FkaW5nIGluZGl2aWR1YWwgZmlsZXMsXG4gICAgICAgICAgICAvLyBidXQgd2UgY2FuIGF0IGxlYXN0IHVwZGF0ZSB0aGUgbW9kdWxlIGluZm8gcHJvcGVydGllcyB3ZSBzdXBwb3J0XG4gICAgICAgICAgICB1cGRhdGVNb2R1bGVJbmZvKG9wdGlvbnMuaWQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgYXdhaXQgY29udGFpbmVyLmxvYWQob3B0aW9ucy5pZCwgeyBzc3I6IHRoaXMuc3NyIH0pO1xuICAgICAgICAgICAgY29uc3QgbW9kdWxlSW5mbyA9IHRoaXMuZ2V0TW9kdWxlSW5mbyhvcHRpb25zLmlkKTtcbiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBkdWUgdG8gY2FsbGluZyBlbnN1cmVFbnRyeUZyb21VcmwsIGJ1dCAxKSBvdXIgdHlwZXMgY2FuJ3QgZW5zdXJlIHRoYXRcbiAgICAgICAgICAgIC8vIGFuZCAyKSBtb2R1bGVHcmFwaCBtYXkgbm90IGhhdmUgYmVlbiBwcm92aWRlZCAodGhvdWdoIGluIHRoZSBzaXR1YXRpb25zIHdoZXJlIHRoYXQgaGFwcGVucyxcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZCBuZXZlciBoYXZlIHBsdWdpbnMgY2FsbGluZyB0aGlzLmxvYWQpXG4gICAgICAgICAgICBpZiAoIW1vZHVsZUluZm8pXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEZhaWxlZCB0byBsb2FkIG1vZHVsZSB3aXRoIGlkICR7b3B0aW9ucy5pZH1gKTtcbiAgICAgICAgICAgIHJldHVybiBtb2R1bGVJbmZvO1xuICAgICAgICB9XG4gICAgICAgIGdldE1vZHVsZUluZm8oaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRNb2R1bGVJbmZvKGlkKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRNb2R1bGVJZHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9kdWxlR3JhcGhcbiAgICAgICAgICAgICAgICA/IG1vZHVsZUdyYXBoLmlkVG9Nb2R1bGVNYXAua2V5cygpXG4gICAgICAgICAgICAgICAgOiBBcnJheS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICB9XG4gICAgICAgIGFkZFdhdGNoRmlsZShpZCkge1xuICAgICAgICAgICAgd2F0Y2hGaWxlcy5hZGQoaWQpO1xuICAgICAgICAgICAgKHRoaXMuX2FkZGVkSW1wb3J0cyB8fCAodGhpcy5fYWRkZWRJbXBvcnRzID0gbmV3IFNldCgpKSkuYWRkKGlkKTtcbiAgICAgICAgICAgIGlmICh3YXRjaGVyKVxuICAgICAgICAgICAgICAgIGVuc3VyZVdhdGNoZWRGaWxlKHdhdGNoZXIsIGlkLCByb290KTtcbiAgICAgICAgfVxuICAgICAgICBnZXRXYXRjaEZpbGVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIFsuLi53YXRjaEZpbGVzXTtcbiAgICAgICAgfVxuICAgICAgICBlbWl0RmlsZShhc3NldE9yRmlsZSkge1xuICAgICAgICAgICAgd2FybkluY29tcGF0aWJsZU1ldGhvZChgZW1pdEZpbGVgLCB0aGlzLl9hY3RpdmVQbHVnaW4ubmFtZSk7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgc2V0QXNzZXRTb3VyY2UoKSB7XG4gICAgICAgICAgICB3YXJuSW5jb21wYXRpYmxlTWV0aG9kKGBzZXRBc3NldFNvdXJjZWAsIHRoaXMuX2FjdGl2ZVBsdWdpbi5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRGaWxlTmFtZSgpIHtcbiAgICAgICAgICAgIHdhcm5JbmNvbXBhdGlibGVNZXRob2QoYGdldEZpbGVOYW1lYCwgdGhpcy5fYWN0aXZlUGx1Z2luLm5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHdhcm4oZSwgcG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IGZvcm1hdEVycm9yKGUsIHBvc2l0aW9uLCB0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGJ1aWxkRXJyb3JNZXNzYWdlKGVyciwgW3BpY29jb2xvcnNFeHBvcnRzLnllbGxvdyhgd2FybmluZzogJHtlcnIubWVzc2FnZX1gKV0sIGZhbHNlKTtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKG1zZywge1xuICAgICAgICAgICAgICAgIGNsZWFyOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yKGUsIHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAvLyBlcnJvciB0aHJvd24gaGVyZSBpcyBjYXVnaHQgYnkgdGhlIHRyYW5zZm9ybSBtaWRkbGV3YXJlIGFuZCBwYXNzZWQgb25cbiAgICAgICAgICAgIC8vIHRoZSB0aGUgZXJyb3IgbWlkZGxld2FyZS5cbiAgICAgICAgICAgIHRocm93IGZvcm1hdEVycm9yKGUsIHBvc2l0aW9uLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBmb3JtYXRFcnJvcihlLCBwb3NpdGlvbiwgY3R4KSB7XG4gICAgICAgIGNvbnN0IGVyciA9ICh0eXBlb2YgZSA9PT0gJ3N0cmluZycgPyBuZXcgRXJyb3IoZSkgOiBlKTtcbiAgICAgICAgaWYgKGVyci5wbHVnaW5Db2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyOyAvLyBUaGUgcGx1Z2luIGxpa2VseSBjYWxsZWQgYHRoaXMuZXJyb3JgXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVyci5maWxlICYmIGVyci5uYW1lID09PSAnQ3NzU3ludGF4RXJyb3InKSB7XG4gICAgICAgICAgICBlcnIuaWQgPSBub3JtYWxpemVQYXRoJDMoZXJyLmZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguX2FjdGl2ZVBsdWdpbilcbiAgICAgICAgICAgIGVyci5wbHVnaW4gPSBjdHguX2FjdGl2ZVBsdWdpbi5uYW1lO1xuICAgICAgICBpZiAoY3R4Ll9hY3RpdmVJZCAmJiAhZXJyLmlkKVxuICAgICAgICAgICAgZXJyLmlkID0gY3R4Ll9hY3RpdmVJZDtcbiAgICAgICAgaWYgKGN0eC5fYWN0aXZlQ29kZSkge1xuICAgICAgICAgICAgZXJyLnBsdWdpbkNvZGUgPSBjdHguX2FjdGl2ZUNvZGU7XG4gICAgICAgICAgICAvLyBzb21lIHJvbGx1cCBwbHVnaW5zLCBlLmcuIGpzb24sIHNldHMgZXJyLnBvc2l0aW9uIGluc3RlYWQgb2YgZXJyLnBvc1xuICAgICAgICAgICAgY29uc3QgcG9zID0gcG9zaXRpb24gPz8gZXJyLnBvcyA/PyBlcnIucG9zaXRpb247XG4gICAgICAgICAgICBpZiAocG9zICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXJyTG9jYXRpb247XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyTG9jYXRpb24gPSBudW1iZXJUb1BvcyhjdHguX2FjdGl2ZUNvZGUsIHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihwaWNvY29sb3JzRXhwb3J0cy5yZWQoYEVycm9yIGluIGVycm9yIGhhbmRsZXI6XFxuJHtlcnIyLnN0YWNrIHx8IGVycjIubWVzc2FnZX1cXG5gKSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIHByaW50IGV4dHJhIG5ld2xpbmUgdG8gc2VwYXJhdGUgdGhlIHR3byBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgeyBlcnJvcjogZXJyMiB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlcnIubG9jID0gZXJyLmxvYyB8fCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IGVyci5pZCxcbiAgICAgICAgICAgICAgICAgICAgLi4uZXJyTG9jYXRpb24sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBlcnIuZnJhbWUgPSBlcnIuZnJhbWUgfHwgZ2VuZXJhdGVDb2RlRnJhbWUoY3R4Ll9hY3RpdmVDb2RlLCBwb3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXJyLmxvYykge1xuICAgICAgICAgICAgICAgIC8vIGNzcyBwcmVwcm9jZXNzb3JzIG1heSByZXBvcnQgZXJyb3JzIGluIGFuIGluY2x1ZGVkIGZpbGVcbiAgICAgICAgICAgICAgICBpZiAoIWVyci5mcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29kZSA9IGN0eC5fYWN0aXZlQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyci5sb2MuZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmlkID0gbm9ybWFsaXplUGF0aCQzKGVyci5sb2MuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBmcyRsLnJlYWRGaWxlU3luYyhlcnIubG9jLmZpbGUsICd1dGYtOCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggeyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXJyLmZyYW1lID0gZ2VuZXJhdGVDb2RlRnJhbWUoY29kZSwgZXJyLmxvYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXJyLmxpbmUgJiYgZXJyLmNvbHVtbikge1xuICAgICAgICAgICAgICAgIGVyci5sb2MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IGVyci5pZCxcbiAgICAgICAgICAgICAgICAgICAgbGluZTogZXJyLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZXJyLmNvbHVtbixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVyci5mcmFtZSA9IGVyci5mcmFtZSB8fCBnZW5lcmF0ZUNvZGVGcmFtZShlcnIuaWQsIGVyci5sb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0eCBpbnN0YW5jZW9mIFRyYW5zZm9ybUNvbnRleHQgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXJyLmxvYz8ubGluZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXJyLmxvYz8uY29sdW1uID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhd1NvdXJjZU1hcCA9IGN0eC5fZ2V0Q29tYmluZWRTb3VyY2VtYXAoKTtcbiAgICAgICAgICAgICAgICBpZiAocmF3U291cmNlTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYWNlZCA9IG5ldyBUcmFjZU1hcChyYXdTb3VyY2VNYXApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHNvdXJjZSwgbGluZSwgY29sdW1uIH0gPSBvcmlnaW5hbFBvc2l0aW9uRm9yJDEodHJhY2VkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiBOdW1iZXIoZXJyLmxvYy5saW5lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogTnVtYmVyKGVyci5sb2MuY29sdW1uKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgJiYgbGluZSAhPSBudWxsICYmIGNvbHVtbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIubG9jID0geyBmaWxlOiBzb3VyY2UsIGxpbmUsIGNvbHVtbiB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGVyci5sb2MpIHtcbiAgICAgICAgICAgIGlmICghZXJyLmZyYW1lKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBlcnIucGx1Z2luQ29kZTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmxvYy5maWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVyci5pZCA9IG5vcm1hbGl6ZVBhdGgkMyhlcnIubG9jLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGZzJGwucmVhZEZpbGVTeW5jKGVyci5sb2MuZmlsZSwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCB7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgICAgICAgICBlcnIuZnJhbWUgPSBnZW5lcmF0ZUNvZGVGcmFtZShjb2RlLCBlcnIubG9jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlcnIubG9jPy5jb2x1bW4gIT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB0eXBlb2YgZXJyLmxvYz8ubGluZSAhPT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICFlcnIubG9jPy5maWxlKSB7XG4gICAgICAgICAgICBkZWxldGUgZXJyLmxvYztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjbGFzcyBUcmFuc2Zvcm1Db250ZXh0IGV4dGVuZHMgQ29udGV4dCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKGZpbGVuYW1lLCBjb2RlLCBpbk1hcCkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxTb3VyY2VtYXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VtYXBDaGFpbiA9IFtdO1xuICAgICAgICAgICAgdGhpcy5jb21iaW5lZE1hcCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsQ29kZSA9IGNvZGU7XG4gICAgICAgICAgICBpZiAoaW5NYXApIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Z1NvdXJjZW1hcENvbWJpbmVGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaW5qZWN0IG5hbWUgZm9yIGRlYnVnIHB1cnBvc2VcbiAgICAgICAgICAgICAgICAgICAgaW5NYXAubmFtZSA9ICckaW5NYXAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZW1hcENoYWluLnB1c2goaW5NYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF9nZXRDb21iaW5lZFNvdXJjZW1hcChjcmVhdGVJZk51bGwgPSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKGRlYnVnU291cmNlbWFwQ29tYmluZUZpbHRlciAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZW5hbWUuaW5jbHVkZXMoZGVidWdTb3VyY2VtYXBDb21iaW5lRmlsdGVyKSkge1xuICAgICAgICAgICAgICAgIGRlYnVnU291cmNlbWFwQ29tYmluZSgnLS0tLS0tLS0tLScsIHRoaXMuZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgIGRlYnVnU291cmNlbWFwQ29tYmluZSh0aGlzLmNvbWJpbmVkTWFwKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z1NvdXJjZW1hcENvbWJpbmUodGhpcy5zb3VyY2VtYXBDaGFpbik7XG4gICAgICAgICAgICAgICAgZGVidWdTb3VyY2VtYXBDb21iaW5lKCctLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29tYmluZWRNYXAgPSB0aGlzLmNvbWJpbmVkTWFwO1xuICAgICAgICAgICAgZm9yIChsZXQgbSBvZiB0aGlzLnNvdXJjZW1hcENoYWluKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgbSA9IEpTT04ucGFyc2UobSk7XG4gICAgICAgICAgICAgICAgaWYgKCEoJ3ZlcnNpb24nIGluIG0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5LCBudWxsaWZpZWQgc291cmNlIG1hcFxuICAgICAgICAgICAgICAgICAgICBjb21iaW5lZE1hcCA9IHRoaXMuY29tYmluZWRNYXAgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZW1hcENoYWluLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNvbWJpbmVkTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkTWFwID0gbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkTWFwID0gY29tYmluZVNvdXJjZW1hcHMoY2xlYW5VcmwodGhpcy5maWxlbmFtZSksIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNDb250ZW50OiBjb21iaW5lZE1hcC5zb3VyY2VzQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZE1hcCxcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjb21iaW5lZE1hcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJZk51bGxcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgTWFnaWNTdHJpbmcodGhpcy5vcmlnaW5hbENvZGUpLmdlbmVyYXRlTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVDb250ZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGlyZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGNsZWFuVXJsKHRoaXMuZmlsZW5hbWUpLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29tYmluZWRNYXAgIT09IHRoaXMuY29tYmluZWRNYXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmVkTWFwID0gY29tYmluZWRNYXA7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VtYXBDaGFpbi5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWRNYXA7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0Q29tYmluZWRTb3VyY2VtYXAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29tYmluZWRTb3VyY2VtYXAodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNsb3NlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHtcbiAgICAgICAgb3B0aW9uczogYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gcm9sbHVwT3B0aW9ucztcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uc0hvb2sgb2YgZ2V0U29ydGVkUGx1Z2luSG9va3MoJ29wdGlvbnMnKSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAoYXdhaXQgb3B0aW9uc0hvb2suY2FsbChtaW5pbWFsQ29udGV4dCwgb3B0aW9ucykpIHx8IG9wdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5hY29ybkluamVjdFBsdWdpbnMpIHtcbiAgICAgICAgICAgICAgICBwYXJzZXIgPSBQYXJzZXIkMS5leHRlbmQoLi4uYXJyYWlmeShvcHRpb25zLmFjb3JuSW5qZWN0UGx1Z2lucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhY29ybixcbiAgICAgICAgICAgICAgICBhY29ybkluamVjdFBsdWdpbnM6IFtdLFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSgpLFxuICAgICAgICBnZXRNb2R1bGVJbmZvLFxuICAgICAgICBhc3luYyBidWlsZFN0YXJ0KCkge1xuICAgICAgICAgICAgYXdhaXQgaG9va1BhcmFsbGVsKCdidWlsZFN0YXJ0JywgKHBsdWdpbikgPT4gbmV3IENvbnRleHQocGx1Z2luKSwgKCkgPT4gW2NvbnRhaW5lci5vcHRpb25zXSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHJlc29sdmVJZChyYXdJZCwgaW1wb3J0ZXIgPSBqb2luJDIocm9vdCwgJ2luZGV4Lmh0bWwnKSwgb3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3Qgc2tpcCA9IG9wdGlvbnM/LnNraXA7XG4gICAgICAgICAgICBjb25zdCBzc3IgPSBvcHRpb25zPy5zc3I7XG4gICAgICAgICAgICBjb25zdCBzY2FuID0gISFvcHRpb25zPy5zY2FuO1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gbmV3IENvbnRleHQoKTtcbiAgICAgICAgICAgIGN0eC5zc3IgPSAhIXNzcjtcbiAgICAgICAgICAgIGN0eC5fc2NhbiA9IHNjYW47XG4gICAgICAgICAgICBjdHguX3Jlc29sdmVTa2lwcyA9IHNraXA7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlU3RhcnQgPSBpc0RlYnVnID8gcGVyZm9ybWFuY2Uubm93KCkgOiAwO1xuICAgICAgICAgICAgbGV0IGlkID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpYWwgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIGdldFNvcnRlZFBsdWdpbnMoJ3Jlc29sdmVJZCcpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwbHVnaW4ucmVzb2x2ZUlkKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoc2tpcD8uaGFzKHBsdWdpbikpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGN0eC5fYWN0aXZlUGx1Z2luID0gcGx1Z2luO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpblJlc29sdmVTdGFydCA9IGlzRGVidWcgPyBwZXJmb3JtYW5jZS5ub3coKSA6IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICdoYW5kbGVyJyBpbiBwbHVnaW4ucmVzb2x2ZUlkXG4gICAgICAgICAgICAgICAgICAgID8gcGx1Z2luLnJlc29sdmVJZC5oYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgIDogcGx1Z2luLnJlc29sdmVJZDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmNhbGwoY3R4LCByYXdJZCwgaW1wb3J0ZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0aW9uczogb3B0aW9ucz8uYXNzZXJ0aW9ucyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tOiBvcHRpb25zPy5jdXN0b20sXG4gICAgICAgICAgICAgICAgICAgIGlzRW50cnk6ICEhb3B0aW9ucz8uaXNFbnRyeSxcbiAgICAgICAgICAgICAgICAgICAgc3NyLFxuICAgICAgICAgICAgICAgICAgICBzY2FuLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWQgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZCA9IHJlc3VsdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwYXJ0aWFsLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpc0RlYnVnICYmXG4gICAgICAgICAgICAgICAgICAgIGRlYnVnUGx1Z2luUmVzb2x2ZSh0aW1lRnJvbShwbHVnaW5SZXNvbHZlU3RhcnQpLCBwbHVnaW4ubmFtZSwgcHJldHRpZnlVcmwoaWQsIHJvb3QpKTtcbiAgICAgICAgICAgICAgICAvLyByZXNvbHZlSWQoKSBpcyBob29rRmlyc3QgLSBmaXJzdCBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNEZWJ1ZyAmJiByYXdJZCAhPT0gaWQgJiYgIXJhd0lkLnN0YXJ0c1dpdGgoRlNfUFJFRklYKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHJhd0lkICsgaWQ7XG4gICAgICAgICAgICAgICAgLy8gYXZvaWQgc3BhbW1pbmdcbiAgICAgICAgICAgICAgICBpZiAoIXNlZW5SZXNvbHZlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5SZXNvbHZlc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdSZXNvbHZlKGAke3RpbWVGcm9tKHJlc29sdmVTdGFydCl9ICR7cGljb2NvbG9yc0V4cG9ydHMuY3lhbihyYXdJZCl9IC0+ICR7cGljb2NvbG9yc0V4cG9ydHMuZGltKGlkKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICBwYXJ0aWFsLmlkID0gaXNFeHRlcm5hbFVybChpZCkgPyBpZCA6IG5vcm1hbGl6ZVBhdGgkMyhpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgbG9hZChpZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3Qgc3NyID0gb3B0aW9ucz8uc3NyO1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gbmV3IENvbnRleHQoKTtcbiAgICAgICAgICAgIGN0eC5zc3IgPSAhIXNzcjtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIGdldFNvcnRlZFBsdWdpbnMoJ2xvYWQnKSkge1xuICAgICAgICAgICAgICAgIGlmICghcGx1Z2luLmxvYWQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGN0eC5fYWN0aXZlUGx1Z2luID0gcGx1Z2luO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAnaGFuZGxlcicgaW4gcGx1Z2luLmxvYWQgPyBwbHVnaW4ubG9hZC5oYW5kbGVyIDogcGx1Z2luLmxvYWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5jYWxsKGN0eCwgaWQsIHsgc3NyIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QkMihyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVNb2R1bGVJbmZvKGlkLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHRyYW5zZm9ybShjb2RlLCBpZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgaW5NYXAgPSBvcHRpb25zPy5pbk1hcDtcbiAgICAgICAgICAgIGNvbnN0IHNzciA9IG9wdGlvbnM/LnNzcjtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IG5ldyBUcmFuc2Zvcm1Db250ZXh0KGlkLCBjb2RlLCBpbk1hcCk7XG4gICAgICAgICAgICBjdHguc3NyID0gISFzc3I7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBnZXRTb3J0ZWRQbHVnaW5zKCd0cmFuc2Zvcm0nKSkge1xuICAgICAgICAgICAgICAgIGlmICghcGx1Z2luLnRyYW5zZm9ybSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY3R4Ll9hY3RpdmVQbHVnaW4gPSBwbHVnaW47XG4gICAgICAgICAgICAgICAgY3R4Ll9hY3RpdmVJZCA9IGlkO1xuICAgICAgICAgICAgICAgIGN0eC5fYWN0aXZlQ29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpc0RlYnVnID8gcGVyZm9ybWFuY2Uubm93KCkgOiAwO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICdoYW5kbGVyJyBpbiBwbHVnaW4udHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgICAgID8gcGx1Z2luLnRyYW5zZm9ybS5oYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgIDogcGx1Z2luLnRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmNhbGwoY3R4LCBjb2RlLCBpZCwgeyBzc3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlzRGVidWcgJiZcbiAgICAgICAgICAgICAgICAgICAgZGVidWdQbHVnaW5UcmFuc2Zvcm0odGltZUZyb20oc3RhcnQpLCBwbHVnaW4ubmFtZSwgcHJldHRpZnlVcmwoaWQsIHJvb3QpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QkMihyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gcmVzdWx0LmNvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lm1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnU291cmNlbWFwQ29tYmluZUZvY3VzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpbmplY3QgcGx1Z2luIG5hbWUgZm9yIGRlYnVnIHB1cnBvc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm1hcC5uYW1lID0gcGx1Z2luLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5zb3VyY2VtYXBDaGFpbi5wdXNoKHJlc3VsdC5tYXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1vZHVsZUluZm8oaWQsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2RlID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICBtYXA6IGN0eC5fZ2V0Q29tYmluZWRTb3VyY2VtYXAoKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICAgICAgaWYgKGNsb3NlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjdHggPSBuZXcgQ29udGV4dCgpO1xuICAgICAgICAgICAgYXdhaXQgaG9va1BhcmFsbGVsKCdidWlsZEVuZCcsICgpID0+IGN0eCwgKCkgPT4gW10pO1xuICAgICAgICAgICAgYXdhaXQgaG9va1BhcmFsbGVsKCdjbG9zZUJ1bmRsZScsICgpID0+IGN0eCwgKCkgPT4gW10pO1xuICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBjb250YWluZXI7XG59XG5cbmNvbnN0IGRlYnVnJDggPSBjcmVhdGVEZWJ1Z2dlcigndml0ZTpkZXBzJyk7XG5jb25zdCBodG1sVHlwZXNSRSA9IC9cXC4oaHRtbHx2dWV8c3ZlbHRlfGFzdHJvfGltYmEpJC87XG4vLyBBIHNpbXBsZSByZWdleCB0byBkZXRlY3QgaW1wb3J0IHNvdXJjZXMuIFRoaXMgaXMgb25seSB1c2VkIG9uXG4vLyA8c2NyaXB0IGxhbmc9XCJ0c1wiPiBibG9ja3MgaW4gdnVlIChzZXR1cCBvbmx5KSBvciBzdmVsdGUgZmlsZXMsIHNpbmNlXG4vLyBzZWVtaW5nbHkgdW51c2VkIGltcG9ydHMgYXJlIGRyb3BwZWQgYnkgZXNidWlsZCB3aGVuIHRyYW5zcGlsaW5nIFRTIHdoaWNoXG4vLyBwcmV2ZW50cyBpdCBmcm9tIGNyYXdsaW5nIGZ1cnRoZXIuXG4vLyBXZSBjYW4ndCB1c2UgZXMtbW9kdWxlLWxleGVyIGJlY2F1c2UgaXQgY2FuJ3QgaGFuZGxlIFRTLCBhbmQgZG9uJ3Qgd2FudCB0b1xuLy8gdXNlIEFjb3JuIGJlY2F1c2UgaXQncyBzbG93LiBMdWNraWx5IHRoaXMgZG9lc24ndCBoYXZlIHRvIGJlIGJ1bGxldCBwcm9vZlxuLy8gc2luY2UgZXZlbiBtaXNzZWQgaW1wb3J0cyBjYW4gYmUgY2F1Z2h0IGF0IHJ1bnRpbWUsIGFuZCBmYWxzZSBwb3NpdGl2ZXMgd2lsbFxuLy8gc2ltcGx5IGJlIGlnbm9yZWQuXG5jb25zdCBpbXBvcnRzUkUgPSAvKD88IVxcL1xcLy4qKSg/PD1efDt8XFwqXFwvKVxccyppbXBvcnQoPyFcXHMrdHlwZSkoPzpbXFx3Knt9XFxuXFxyXFx0LCBdK2Zyb20pP1xccyooXCJbXlwiXStcInwnW14nXSsnKVxccyooPz0kfDt8XFwvXFwvfFxcL1xcKikvZ207XG5mdW5jdGlvbiBzY2FuSW1wb3J0cyhjb25maWcpIHtcbiAgICAvLyBPbmx5IHVzZWQgdG8gc2NhbiBub24tc3NyIGNvZGVcbiAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGRlcHMgPSB7fTtcbiAgICBjb25zdCBtaXNzaW5nID0ge307XG4gICAgbGV0IGVudHJpZXM7XG4gICAgY29uc3Qgc2NhbkNvbnRleHQgPSB7IGNhbmNlbGxlZDogZmFsc2UgfTtcbiAgICBjb25zdCBlc2J1aWxkQ29udGV4dCA9IGNvbXB1dGVFbnRyaWVzKGNvbmZpZykudGhlbigoY29tcHV0ZWRFbnRyaWVzKSA9PiB7XG4gICAgICAgIGVudHJpZXMgPSBjb21wdXRlZEVudHJpZXM7XG4gICAgICAgIGlmICghZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlnLm9wdGltaXplRGVwcy5lbnRyaWVzICYmICFjb25maWcub3B0aW1pemVEZXBzLmluY2x1ZGUpIHtcbiAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLndhcm4ocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KCcoISkgQ291bGQgbm90IGF1dG8tZGV0ZXJtaW5lIGVudHJ5IHBvaW50IGZyb20gcm9sbHVwT3B0aW9ucyBvciBodG1sIGZpbGVzICcgK1xuICAgICAgICAgICAgICAgICAgICAnYW5kIHRoZXJlIGFyZSBubyBleHBsaWNpdCBvcHRpbWl6ZURlcHMuaW5jbHVkZSBwYXR0ZXJucy4gJyArXG4gICAgICAgICAgICAgICAgICAgICdTa2lwcGluZyBkZXBlbmRlbmN5IHByZS1idW5kbGluZy4nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjYW5Db250ZXh0LmNhbmNlbGxlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZGVidWckOChgQ3Jhd2xpbmcgZGVwZW5kZW5jaWVzIHVzaW5nIGVudHJpZXM6XFxuICAke2VudHJpZXMuam9pbignXFxuICAnKX1gKTtcbiAgICAgICAgcmV0dXJuIHByZXBhcmVFc2J1aWxkU2Nhbm5lcihjb25maWcsIGVudHJpZXMsIGRlcHMsIG1pc3NpbmcsIHNjYW5Db250ZXh0KTtcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBlc2J1aWxkQ29udGV4dFxuICAgICAgICAudGhlbigoY29udGV4dCkgPT4ge1xuICAgICAgICBmdW5jdGlvbiBkaXNwb3NlQ29udGV4dCgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0Py5kaXNwb3NlKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZSBlc2J1aWxkIGNvbnRleHQnLCB7IGVycm9yOiBlIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb250ZXh0IHx8IHNjYW5Db250ZXh0Py5jYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIGRpc3Bvc2VDb250ZXh0KCk7XG4gICAgICAgICAgICByZXR1cm4geyBkZXBzOiB7fSwgbWlzc2luZzoge30gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dFxuICAgICAgICAgICAgLnJlYnVpbGQoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgYSBmaXhlZCBvcmRlciBzbyBoYXNoZXMgYXJlIHN0YWJsZSBhbmQgaW1wcm92ZSBsb2dzXG4gICAgICAgICAgICAgICAgZGVwczogb3JkZXJlZERlcGVuZGVuY2llcyhkZXBzKSxcbiAgICAgICAgICAgICAgICBtaXNzaW5nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkaXNwb3NlQ29udGV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9KVxuICAgICAgICAuY2F0Y2goYXN5bmMgKGUpID0+IHtcbiAgICAgICAgaWYgKGUuZXJyb3JzICYmIGUubWVzc2FnZS5pbmNsdWRlcygnVGhlIGJ1aWxkIHdhcyBjYW5jZWxlZCcpKSB7XG4gICAgICAgICAgICAvLyBlc2J1aWxkIGxvZ3MgYW4gZXJyb3Igd2hlbiBjYW5jZWxsaW5nLCBidXQgdGhpcyBpcyBleHBlY3RlZCBzb1xuICAgICAgICAgICAgLy8gcmV0dXJuIGFuIGVtcHR5IHJlc3VsdCBpbnN0ZWFkXG4gICAgICAgICAgICByZXR1cm4geyBkZXBzOiB7fSwgbWlzc2luZzoge30gfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmVwZW5kTWVzc2FnZSA9IHBpY29jb2xvcnNFeHBvcnRzLnJlZChgXFxcbiAgRmFpbGVkIHRvIHNjYW4gZm9yIGRlcGVuZGVuY2llcyBmcm9tIGVudHJpZXM6XG4gICR7ZW50cmllcy5qb2luKCdcXG4nKX1cblxuICBgKTtcbiAgICAgICAgaWYgKGUuZXJyb3JzKSB7XG4gICAgICAgICAgICBjb25zdCBtc2dzID0gYXdhaXQgZm9ybWF0TWVzc2FnZXMoZS5lcnJvcnMsIHtcbiAgICAgICAgICAgICAgICBraW5kOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvbG9yOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlLm1lc3NhZ2UgPSBwcmVwZW5kTWVzc2FnZSArIG1zZ3Muam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlLm1lc3NhZ2UgPSBwcmVwZW5kTWVzc2FnZSArIGUubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgZGVidWckOChgU2NhbiBjb21wbGV0ZWQgaW4gJHsocGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCkudG9GaXhlZCgyKX1tczpgLCBkZXBzKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjYW5jZWw6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHNjYW5Db250ZXh0LmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZXNidWlsZENvbnRleHQudGhlbigoY29udGV4dCkgPT4gY29udGV4dD8uY2FuY2VsKCkpO1xuICAgICAgICB9LFxuICAgICAgICByZXN1bHQsXG4gICAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGNvbXB1dGVFbnRyaWVzKGNvbmZpZykge1xuICAgIGxldCBlbnRyaWVzID0gW107XG4gICAgY29uc3QgZXhwbGljaXRFbnRyeVBhdHRlcm5zID0gY29uZmlnLm9wdGltaXplRGVwcy5lbnRyaWVzO1xuICAgIGNvbnN0IGJ1aWxkSW5wdXQgPSBjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucz8uaW5wdXQ7XG4gICAgaWYgKGV4cGxpY2l0RW50cnlQYXR0ZXJucykge1xuICAgICAgICBlbnRyaWVzID0gYXdhaXQgZ2xvYkVudHJpZXMoZXhwbGljaXRFbnRyeVBhdHRlcm5zLCBjb25maWcpO1xuICAgIH1cbiAgICBlbHNlIGlmIChidWlsZElucHV0KSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVQYXRoID0gKHApID0+IHBhdGgkby5yZXNvbHZlKGNvbmZpZy5yb290LCBwKTtcbiAgICAgICAgaWYgKHR5cGVvZiBidWlsZElucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cmllcyA9IFtyZXNvbHZlUGF0aChidWlsZElucHV0KV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShidWlsZElucHV0KSkge1xuICAgICAgICAgICAgZW50cmllcyA9IGJ1aWxkSW5wdXQubWFwKHJlc29sdmVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdCQyKGJ1aWxkSW5wdXQpKSB7XG4gICAgICAgICAgICBlbnRyaWVzID0gT2JqZWN0LnZhbHVlcyhidWlsZElucHV0KS5tYXAocmVzb2x2ZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJvbGx1cE9wdGlvbnMuaW5wdXQgdmFsdWUuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVudHJpZXMgPSBhd2FpdCBnbG9iRW50cmllcygnKiovKi5odG1sJywgY29uZmlnKTtcbiAgICB9XG4gICAgLy8gTm9uLXN1cHBvcnRlZCBlbnRyeSBmaWxlIHR5cGVzIGFuZCB2aXJ0dWFsIGZpbGVzIHNob3VsZCBub3QgYmUgc2Nhbm5lZCBmb3JcbiAgICAvLyBkZXBlbmRlbmNpZXMuXG4gICAgZW50cmllcyA9IGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gaXNTY2FubmFibGUoZW50cnkpICYmIGZzJGwuZXhpc3RzU3luYyhlbnRyeSkpO1xuICAgIHJldHVybiBlbnRyaWVzO1xufVxuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUVzYnVpbGRTY2FubmVyKGNvbmZpZywgZW50cmllcywgZGVwcywgbWlzc2luZywgc2NhbkNvbnRleHQpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBhd2FpdCBjcmVhdGVQbHVnaW5Db250YWluZXIoY29uZmlnKTtcbiAgICBpZiAoc2NhbkNvbnRleHQ/LmNhbmNlbGxlZClcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHBsdWdpbiA9IGVzYnVpbGRTY2FuUGx1Z2luKGNvbmZpZywgY29udGFpbmVyLCBkZXBzLCBtaXNzaW5nLCBlbnRyaWVzKTtcbiAgICBjb25zdCB7IHBsdWdpbnMgPSBbXSwgLi4uZXNidWlsZE9wdGlvbnMgfSA9IGNvbmZpZy5vcHRpbWl6ZURlcHM/LmVzYnVpbGRPcHRpb25zID8/IHt9O1xuICAgIHJldHVybiBhd2FpdCBlc2J1aWxkLmNvbnRleHQoe1xuICAgICAgICBhYnNXb3JraW5nRGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICB3cml0ZTogZmFsc2UsXG4gICAgICAgIHN0ZGluOiB7XG4gICAgICAgICAgICBjb250ZW50czogZW50cmllcy5tYXAoKGUpID0+IGBpbXBvcnQgJHtKU09OLnN0cmluZ2lmeShlKX1gKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgICAgfSxcbiAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXG4gICAgICAgIHBsdWdpbnM6IFsuLi5wbHVnaW5zLCBwbHVnaW5dLFxuICAgICAgICAuLi5lc2J1aWxkT3B0aW9ucyxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG9yZGVyZWREZXBlbmRlbmNpZXMoZGVwcykge1xuICAgIGNvbnN0IGRlcHNMaXN0ID0gT2JqZWN0LmVudHJpZXMoZGVwcyk7XG4gICAgLy8gRW5zdXJlIHRoZSBzYW1lIGJyb3dzZXJIYXNoIGZvciB0aGUgc2FtZSBzZXQgb2YgZGVwZW5kZW5jaWVzXG4gICAgZGVwc0xpc3Quc29ydCgoYSwgYikgPT4gYVswXS5sb2NhbGVDb21wYXJlKGJbMF0pKTtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGRlcHNMaXN0KTtcbn1cbmZ1bmN0aW9uIGdsb2JFbnRyaWVzKHBhdHRlcm4sIGNvbmZpZykge1xuICAgIHJldHVybiBvdXQocGF0dGVybiwge1xuICAgICAgICBjd2Q6IGNvbmZpZy5yb290LFxuICAgICAgICBpZ25vcmU6IFtcbiAgICAgICAgICAgICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAgICAgICAgICAgYCoqLyR7Y29uZmlnLmJ1aWxkLm91dERpcn0vKipgLFxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlbid0IGV4cGxpY2l0IGVudHJpZXMsIGFsc28gaWdub3JlIG90aGVyIGNvbW1vbiBmb2xkZXJzXG4gICAgICAgICAgICAuLi4oY29uZmlnLm9wdGltaXplRGVwcy5lbnRyaWVzXG4gICAgICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgICAgIDogW2AqKi9fX3Rlc3RzX18vKipgLCBgKiovY292ZXJhZ2UvKipgXSksXG4gICAgICAgIF0sXG4gICAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgICBzdXBwcmVzc0Vycm9yczogdHJ1ZSwgLy8gc3VwcHJlc3MgRUFDQ0VTIGVycm9yc1xuICAgIH0pO1xufVxuY29uc3Qgc2NyaXB0TW9kdWxlUkUgPSAvKDxzY3JpcHRcXGJbXj5dK3R5cGVcXHMqPVxccyooPzpcIm1vZHVsZVwifCdtb2R1bGUnKVtePl0qPikoLio/KTxcXC9zY3JpcHQ+L2dpcztcbmNvbnN0IHNjcmlwdFJFID0gLyg8c2NyaXB0KD86XFxzW14+XSo+fD4pKSguKj8pPFxcL3NjcmlwdD4vZ2lzO1xuY29uc3QgY29tbWVudFJFID0gLzwhLS0uKj8tLT4vZ3M7XG5jb25zdCBzcmNSRSA9IC9cXGJzcmNcXHMqPVxccyooPzpcIihbXlwiXSspXCJ8JyhbXiddKyknfChbXlxccydcIj5dKykpL2k7XG5jb25zdCB0eXBlUkUgPSAvXFxidHlwZVxccyo9XFxzKig/OlwiKFteXCJdKylcInwnKFteJ10rKSd8KFteXFxzJ1wiPl0rKSkvaTtcbmNvbnN0IGxhbmdSRSA9IC9cXGJsYW5nXFxzKj1cXHMqKD86XCIoW15cIl0rKVwifCcoW14nXSspJ3woW15cXHMnXCI+XSspKS9pO1xuY29uc3QgY29udGV4dFJFID0gL1xcYmNvbnRleHRcXHMqPVxccyooPzpcIihbXlwiXSspXCJ8JyhbXiddKyknfChbXlxccydcIj5dKykpL2k7XG5mdW5jdGlvbiBlc2J1aWxkU2NhblBsdWdpbihjb25maWcsIGNvbnRhaW5lciwgZGVwSW1wb3J0cywgbWlzc2luZywgZW50cmllcykge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcmVzb2x2ZSA9IGFzeW5jIChpZCwgaW1wb3J0ZXIsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gaWQgKyAoaW1wb3J0ZXIgJiYgcGF0aCRvLmRpcm5hbWUoaW1wb3J0ZXIpKTtcbiAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgY29udGFpbmVyLnJlc29sdmVJZChpZCwgaW1wb3J0ZXIgJiYgbm9ybWFsaXplUGF0aCQzKGltcG9ydGVyKSwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHNjYW46IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXMgPSByZXNvbHZlZD8uaWQ7XG4gICAgICAgIHNlZW4uc2V0KGtleSwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIGNvbnN0IGluY2x1ZGUgPSBjb25maWcub3B0aW1pemVEZXBzPy5pbmNsdWRlO1xuICAgIGNvbnN0IGV4Y2x1ZGUgPSBbXG4gICAgICAgIC4uLihjb25maWcub3B0aW1pemVEZXBzPy5leGNsdWRlIHx8IFtdKSxcbiAgICAgICAgJ0B2aXRlL2NsaWVudCcsXG4gICAgICAgICdAdml0ZS9lbnYnLFxuICAgIF07XG4gICAgY29uc3QgZXh0ZXJuYWxVbmxlc3NFbnRyeSA9ICh7IHBhdGggfSkgPT4gKHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgZXh0ZXJuYWw6ICFlbnRyaWVzLmluY2x1ZGVzKHBhdGgpLFxuICAgIH0pO1xuICAgIGNvbnN0IGRvVHJhbnNmb3JtR2xvYkltcG9ydCA9IGFzeW5jIChjb250ZW50cywgaWQsIGxvYWRlcikgPT4ge1xuICAgICAgICBsZXQgdHJhbnNwaWxlZENvbnRlbnRzO1xuICAgICAgICAvLyB0cmFuc3BpbGUgYmVjYXVzZSBgdHJhbnNmb3JtR2xvYkltcG9ydGAgb25seSBleHBlY3RzIGpzXG4gICAgICAgIGlmIChsb2FkZXIgIT09ICdqcycpIHtcbiAgICAgICAgICAgIHRyYW5zcGlsZWRDb250ZW50cyA9IChhd2FpdCB0cmFuc2Zvcm0kMihjb250ZW50cywgeyBsb2FkZXIgfSkpLmNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cmFuc3BpbGVkQ29udGVudHMgPSBjb250ZW50cztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm1HbG9iSW1wb3J0KHRyYW5zcGlsZWRDb250ZW50cywgaWQsIGNvbmZpZy5yb290LCByZXNvbHZlLCBjb25maWcuaXNQcm9kdWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdD8ucy50b1N0cmluZygpIHx8IHRyYW5zcGlsZWRDb250ZW50cztcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmRlcC1zY2FuJyxcbiAgICAgICAgc2V0dXAoYnVpbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdHMgPSB7fTtcbiAgICAgICAgICAgIC8vIGV4dGVybmFsIHVybHNcbiAgICAgICAgICAgIGJ1aWxkLm9uUmVzb2x2ZSh7IGZpbHRlcjogZXh0ZXJuYWxSRSB9LCAoeyBwYXRoIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBleHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIC8vIGRhdGEgdXJsc1xuICAgICAgICAgICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiBkYXRhVXJsUkUgfSwgKHsgcGF0aCB9KSA9PiAoe1xuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgZXh0ZXJuYWw6IHRydWUsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAvLyBsb2NhbCBzY3JpcHRzIChgPHNjcmlwdD5gIGluIFN2ZWx0ZSBhbmQgYDxzY3JpcHQgc2V0dXA+YCBpbiBWdWUpXG4gICAgICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IHZpcnR1YWxNb2R1bGVSRSB9LCAoeyBwYXRoIH0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBzdHJpcCBwcmVmaXggdG8gZ2V0IHZhbGlkIGZpbGVzeXN0ZW0gcGF0aCBzbyBlc2J1aWxkIGNhbiByZXNvbHZlIGltcG9ydHMgaW4gdGhlIGZpbGVcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogcGF0aC5yZXBsYWNlKHZpcnR1YWxNb2R1bGVQcmVmaXgsICcnKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiAnc2NyaXB0JyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IC8uKi8sIG5hbWVzcGFjZTogJ3NjcmlwdCcgfSwgKHsgcGF0aCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdHNbcGF0aF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGh0bWwgdHlwZXM6IGV4dHJhY3Qgc2NyaXB0IGNvbnRlbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IGh0bWxUeXBlc1JFIH0sIGFzeW5jICh7IHBhdGgsIGltcG9ydGVyIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmUocGF0aCwgaW1wb3J0ZXIpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHNjYW5uZXIgdG8gc2NhbiBodG1sIHR5cGVzIGluIG5vZGVfbW9kdWxlcy5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjYW4gb3B0aW1pemUgdGhpcyBodG1sIHR5cGUsIHNraXAgaXQgc28gaXQncyBoYW5kbGVkIGJ5IHRoZVxuICAgICAgICAgICAgICAgIC8vIGJhcmUgaW1wb3J0IHJlc29sdmUsIGFuZCByZWNvcmRlZCBhcyBvcHRpbWl6YXRpb24gZGVwLlxuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNPcHRpbWl6YWJsZShyZXNvbHZlZCwgY29uZmlnLm9wdGltaXplRGVwcykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiByZXNvbHZlZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlOiAnaHRtbCcsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gZXh0cmFjdCBzY3JpcHRzIGluc2lkZSBIVE1MLWxpa2UgZmlsZXMgYW5kIHRyZWF0IGl0IGFzIGEganMgbW9kdWxlXG4gICAgICAgICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IGh0bWxUeXBlc1JFLCBuYW1lc3BhY2U6ICdodG1sJyB9LCBhc3luYyAoeyBwYXRoIH0pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmF3ID0gZnMkbC5yZWFkRmlsZVN5bmMocGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICAgICAgLy8gQXZvaWQgbWF0Y2hpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbW1lbnRcbiAgICAgICAgICAgICAgICByYXcgPSByYXcucmVwbGFjZShjb21tZW50UkUsICc8IS0tLS0+Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNIdG1sID0gcGF0aC5lbmRzV2l0aCgnLmh0bWwnKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IGlzSHRtbCA/IHNjcmlwdE1vZHVsZVJFIDogc2NyaXB0UkU7XG4gICAgICAgICAgICAgICAgcmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQganMgPSAnJztcbiAgICAgICAgICAgICAgICBsZXQgc2NyaXB0SWQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhyYXcpKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbLCBvcGVuVGFnLCBjb250ZW50XSA9IG1hdGNoO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlTWF0Y2ggPSBvcGVuVGFnLm1hdGNoKHR5cGVSRSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlTWF0Y2ggJiYgKHR5cGVNYXRjaFsxXSB8fCB0eXBlTWF0Y2hbMl0gfHwgdHlwZU1hdGNoWzNdKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFuZ01hdGNoID0gb3BlblRhZy5tYXRjaChsYW5nUkUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYW5nID0gbGFuZ01hdGNoICYmIChsYW5nTWF0Y2hbMV0gfHwgbGFuZ01hdGNoWzJdIHx8IGxhbmdNYXRjaFszXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdHlwZT1cImFwcGxpY2F0aW9uL2xkK2pzb25cIiBhbmQgb3RoZXIgbm9uLUpTIHR5cGVzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhKHR5cGUuaW5jbHVkZXMoJ2phdmFzY3JpcHQnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuaW5jbHVkZXMoJ2VjbWFzY3JpcHQnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT09ICdtb2R1bGUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvYWRlciA9ICdqcyc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYW5nID09PSAndHMnIHx8IGxhbmcgPT09ICd0c3gnIHx8IGxhbmcgPT09ICdqc3gnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSBsYW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhdGguZW5kc1dpdGgoJy5hc3RybycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSAndHMnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNyY01hdGNoID0gb3BlblRhZy5tYXRjaChzcmNSRSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcmNNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3JjID0gc3JjTWF0Y2hbMV0gfHwgc3JjTWF0Y2hbMl0gfHwgc3JjTWF0Y2hbM107XG4gICAgICAgICAgICAgICAgICAgICAgICBqcyArPSBgaW1wb3J0ICR7SlNPTi5zdHJpbmdpZnkoc3JjKX1cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRlbnQudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVhc29uIHdoeSB2aXJ0dWFsIG1vZHVsZXMgYXJlIG5lZWRlZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFRoZXJlIGNhbiBiZSBtb2R1bGUgc2NyaXB0cyAoYDxzY3JpcHQgY29udGV4dD1cIm1vZHVsZVwiPmAgaW4gU3ZlbHRlIGFuZCBgPHNjcmlwdD5gIGluIFZ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGxvY2FsIHNjcmlwdHMgKGA8c2NyaXB0PmAgaW4gU3ZlbHRlIGFuZCBgPHNjcmlwdCBzZXR1cD5gIGluIFZ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBtb2R1bGUgc2NyaXB0cyBpbiBodG1sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGhhbmRsZSB0aGVzZSBzZXBhcmF0ZWx5IGluIGNhc2UgdmFyaWFibGUgbmFtZXMgYXJlIHJldXNlZCBiZXR3ZWVuIHRoZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZCBpbXBvcnRzIGluIFRTIHRvIHByZXZlbnQgZXNidWlsZCBmcm9tIHJlbW92aW5nIHRoZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZXkgbWF5IGJlIHVzZWQgaW4gdGhlIHRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IGNvbnRlbnQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2FkZXIuc3RhcnRzV2l0aCgndHMnKSA/IGV4dHJhY3RJbXBvcnRQYXRocyhjb250ZW50KSA6ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGAke3BhdGh9P2lkPSR7c2NyaXB0SWQrK31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRzLmluY2x1ZGVzKCdpbXBvcnQubWV0YS5nbG9iJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHM6IGF3YWl0IGRvVHJhbnNmb3JtR2xvYkltcG9ydChjb250ZW50cywgcGF0aCwgbG9hZGVyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luRGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbFR5cGU6IHsgbG9hZGVyIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luRGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbFR5cGU6IHsgbG9hZGVyIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpcnR1YWxNb2R1bGVQYXRoID0gSlNPTi5zdHJpbmdpZnkodmlydHVhbE1vZHVsZVByZWZpeCArIGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0TWF0Y2ggPSBvcGVuVGFnLm1hdGNoKGNvbnRleHRSRSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY29udGV4dE1hdGNoICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRleHRNYXRjaFsxXSB8fCBjb250ZXh0TWF0Y2hbMl0gfHwgY29udGV4dE1hdGNoWzNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVzcGVjaWFsbHkgZm9yIFN2ZWx0ZSBmaWxlcywgZXhwb3J0cyBpbiA8c2NyaXB0IGNvbnRleHQ9XCJtb2R1bGVcIj4gbWVhbnMgbW9kdWxlIGV4cG9ydHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBvcnRzIGluIDxzY3JpcHQ+IG1lYW5zIGNvbXBvbmVudCBwcm9wcy4gVG8gYXZvaWQgaGF2aW5nIHR3byBzYW1lIGV4cG9ydCBuYW1lIGZyb20gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFyIGV4cG9ydHMsIHdlIG5lZWQgdG8gaWdub3JlIGV4cG9ydHMgaW4gPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCcuc3ZlbHRlJykgJiYgY29udGV4dCAhPT0gJ21vZHVsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcyArPSBgaW1wb3J0ICR7dmlydHVhbE1vZHVsZVBhdGh9XFxuYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzICs9IGBleHBvcnQgKiBmcm9tICR7dmlydHVhbE1vZHVsZVBhdGh9XFxuYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdHJpZ2dlciBpbmNvcnJlY3RseSBpZiBgZXhwb3J0IGRlZmF1bHRgIGlzIGNvbnRhaW5lZFxuICAgICAgICAgICAgICAgIC8vIGFueXdoZXJlIGluIGEgc3RyaW5nLiBTdmVsdGUgYW5kIEFzdHJvIGZpbGVzIGNhbid0IGhhdmVcbiAgICAgICAgICAgICAgICAvLyBgZXhwb3J0IGRlZmF1bHRgIGFzIGNvZGUgc28gd2Uga25vdyBpZiBpdCdzIGVuY291bnRlcmVkIGl0J3MgYVxuICAgICAgICAgICAgICAgIC8vIGZhbHNlIHBvc2l0aXZlIChlLmcuIGNvbnRhaW5lZCBpbiBhIHN0cmluZylcbiAgICAgICAgICAgICAgICBpZiAoIXBhdGguZW5kc1dpdGgoJy52dWUnKSB8fCAhanMuaW5jbHVkZXMoJ2V4cG9ydCBkZWZhdWx0JykpIHtcbiAgICAgICAgICAgICAgICAgICAganMgKz0gJ1xcbmV4cG9ydCBkZWZhdWx0IHt9JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50czoganMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gYmFyZSBpbXBvcnRzOiByZWNvcmQgYW5kIGV4dGVybmFsaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICAgIGJ1aWxkLm9uUmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgLy8gYXZvaWQgbWF0Y2hpbmcgd2luZG93cyB2b2x1bWVcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IC9eW1xcd0BdW146XS8sXG4gICAgICAgICAgICB9LCBhc3luYyAoeyBwYXRoOiBpZCwgaW1wb3J0ZXIsIHBsdWdpbkRhdGEgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVMaXN0Q29udGFpbnMoZXhjbHVkZSwgaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBleHRlcm5hbFVubGVzc0VudHJ5KHsgcGF0aDogaWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkZXBJbXBvcnRzW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0ZXJuYWxVbmxlc3NFbnRyeSh7IHBhdGg6IGlkIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmUoaWQsIGltcG9ydGVyLCB7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwU2NhbjogeyBsb2FkZXI6IHBsdWdpbkRhdGE/Lmh0bWxUeXBlPy5sb2FkZXIgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZEV4dGVybmFsaXplRGVwKHJlc29sdmVkLCBpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHRlcm5hbFVubGVzc0VudHJ5KHsgcGF0aDogaWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSB8fCBpbmNsdWRlPy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcGVuZGVuY3kgb3IgZm9yY2VkIGluY2x1ZGVkLCBleHRlcm5hbGl6ZSBhbmQgc3RvcCBjcmF3bGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT3B0aW1pemFibGUocmVzb2x2ZWQsIGNvbmZpZy5vcHRpbWl6ZURlcHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwSW1wb3J0c1tpZF0gPSByZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHRlcm5hbFVubGVzc0VudHJ5KHsgcGF0aDogaWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNTY2FubmFibGUocmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lc3BhY2UgPSBodG1sVHlwZXNSRS50ZXN0KHJlc29sdmVkKSA/ICdodG1sJyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmtlZCBwYWNrYWdlLCBrZWVwIGNyYXdsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgkby5yZXNvbHZlKHJlc29sdmVkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsVW5sZXNzRW50cnkoeyBwYXRoOiBpZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWlzc2luZ1tpZF0gPSBub3JtYWxpemVQYXRoJDMoaW1wb3J0ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gRXh0ZXJuYWxpemVkIGZpbGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICAgIC8vIHRoZXNlIGFyZSBkb25lIG9uIHJhdyBpZHMgdXNpbmcgZXNidWlsZCdzIG5hdGl2ZSByZWdleCBmaWx0ZXIgc28gaXRcbiAgICAgICAgICAgIC8vIHNob3VsZCBiZSBmYXN0ZXIgdGhhbiBkb2luZyBpdCBpbiB0aGUgY2F0Y2gtYWxsIHZpYSBqc1xuICAgICAgICAgICAgLy8gdGhleSBhcmUgZG9uZSBhZnRlciB0aGUgYmFyZSBpbXBvcnQgcmVzb2x2ZSBiZWNhdXNlIGEgcGFja2FnZSBuYW1lXG4gICAgICAgICAgICAvLyBtYXkgZW5kIHdpdGggdGhlc2UgZXh0ZW5zaW9uc1xuICAgICAgICAgICAgLy8gY3NzXG4gICAgICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IENTU19MQU5HU19SRSB9LCBleHRlcm5hbFVubGVzc0VudHJ5KTtcbiAgICAgICAgICAgIC8vIGpzb24gJiB3YXNtXG4gICAgICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IC9cXC4oanNvbnxqc29uNXx3YXNtKSQvIH0sIGV4dGVybmFsVW5sZXNzRW50cnkpO1xuICAgICAgICAgICAgLy8ga25vd24gYXNzZXQgdHlwZXNcbiAgICAgICAgICAgIGJ1aWxkLm9uUmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgZmlsdGVyOiBuZXcgUmVnRXhwKGBcXFxcLigke0tOT1dOX0FTU0VUX1RZUEVTLmpvaW4oJ3wnKX0pJGApLFxuICAgICAgICAgICAgfSwgZXh0ZXJuYWxVbmxlc3NFbnRyeSk7XG4gICAgICAgICAgICAvLyBrbm93biB2aXRlIHF1ZXJ5IHR5cGVzOiA/d29ya2VyLCA/cmF3XG4gICAgICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IFNQRUNJQUxfUVVFUllfUkUgfSwgKHsgcGF0aCB9KSA9PiAoe1xuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgZXh0ZXJuYWw6IHRydWUsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAvLyBjYXRjaCBhbGwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgYnVpbGQub25SZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IC8uKi8sXG4gICAgICAgICAgICB9LCBhc3luYyAoeyBwYXRoOiBpZCwgaW1wb3J0ZXIsIHBsdWdpbkRhdGEgfSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHVzZSB2aXRlIHJlc29sdmVyIHRvIHN1cHBvcnQgdXJscyBhbmQgb21pdHRlZCBleHRlbnNpb25zXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlKGlkLCBpbXBvcnRlciwge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b206IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcFNjYW46IHsgbG9hZGVyOiBwbHVnaW5EYXRhPy5odG1sVHlwZT8ubG9hZGVyIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRFeHRlcm5hbGl6ZURlcChyZXNvbHZlZCwgaWQpIHx8ICFpc1NjYW5uYWJsZShyZXNvbHZlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHRlcm5hbFVubGVzc0VudHJ5KHsgcGF0aDogaWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gaHRtbFR5cGVzUkUudGVzdChyZXNvbHZlZCkgPyAnaHRtbCcgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBwYXRoJG8ucmVzb2x2ZShjbGVhblVybChyZXNvbHZlZCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x2ZSBmYWlsZWQuLi4gcHJvYmFibHkgdW5zdXBwb3J0ZWQgdHlwZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXh0ZXJuYWxVbmxlc3NFbnRyeSh7IHBhdGg6IGlkIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gZm9yIGpzeC90c3gsIHdlIG5lZWQgdG8gYWNjZXNzIHRoZSBjb250ZW50IGFuZCBjaGVjayBmb3JcbiAgICAgICAgICAgIC8vIHByZXNlbmNlIG9mIGltcG9ydC5tZXRhLmdsb2IsIHNpbmNlIGl0IHJlc3VsdHMgaW4gaW1wb3J0IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgIC8vIGJ1dCBpc24ndCBjcmF3bGVkIGJ5IGVzYnVpbGQuXG4gICAgICAgICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IEpTX1RZUEVTX1JFIH0sIGFzeW5jICh7IHBhdGg6IGlkIH0pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZXh0ID0gcGF0aCRvLmV4dG5hbWUoaWQpLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIGlmIChleHQgPT09ICdtanMnKVxuICAgICAgICAgICAgICAgICAgICBleHQgPSAnanMnO1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50cyA9IGZzJGwucmVhZEZpbGVTeW5jKGlkLCAndXRmLTgnKTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0LmVuZHNXaXRoKCd4JykgJiYgY29uZmlnLmVzYnVpbGQgJiYgY29uZmlnLmVzYnVpbGQuanN4SW5qZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gY29uZmlnLmVzYnVpbGQuanN4SW5qZWN0ICsgYFxcbmAgKyBjb250ZW50cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbG9hZGVyID0gY29uZmlnLm9wdGltaXplRGVwcz8uZXNidWlsZE9wdGlvbnM/LmxvYWRlcj8uW2AuJHtleHR9YF0gfHxcbiAgICAgICAgICAgICAgICAgICAgZXh0O1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50cy5pbmNsdWRlcygnaW1wb3J0Lm1ldGEuZ2xvYicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50czogYXdhaXQgZG9UcmFuc2Zvcm1HbG9iSW1wb3J0KGNvbnRlbnRzLCBpZCwgbG9hZGVyKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8qKlxuICogd2hlbiB1c2luZyBUUyArIChWdWUgKyBgPHNjcmlwdCBzZXR1cD5gKSBvciBTdmVsdGUsIGltcG9ydHMgbWF5IHNlZW1cbiAqIHVudXNlZCB0byBlc2J1aWxkIGFuZCBkcm9wcGVkIGluIHRoZSBidWlsZCBvdXRwdXQsIHdoaWNoIHByZXZlbnRzXG4gKiBlc2J1aWxkIGZyb20gY3Jhd2xpbmcgZnVydGhlci5cbiAqIHRoZSBzb2x1dGlvbiBpcyB0byBhZGQgYGltcG9ydCAneCdgIGZvciBldmVyeSBzb3VyY2UgdG8gZm9yY2VcbiAqIGVzYnVpbGQgdG8ga2VlcCBjcmF3bGluZyBkdWUgdG8gcG90ZW50aWFsIHNpZGUgZWZmZWN0cy5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEltcG9ydFBhdGhzKGNvZGUpIHtcbiAgICAvLyBlbXB0eSBzaW5nbGVsaW5lICYgbXVsdGlsaW5lIGNvbW1lbnRzIHRvIGF2b2lkIG1hdGNoaW5nIGNvbW1lbnRzXG4gICAgY29kZSA9IGNvZGVcbiAgICAgICAgLnJlcGxhY2UobXVsdGlsaW5lQ29tbWVudHNSRSQxLCAnLyogKi8nKVxuICAgICAgICAucmVwbGFjZShzaW5nbGVsaW5lQ29tbWVudHNSRSQxLCAnJyk7XG4gICAgbGV0IGpzID0gJyc7XG4gICAgbGV0IG07XG4gICAgaW1wb3J0c1JFLmxhc3RJbmRleCA9IDA7XG4gICAgd2hpbGUgKChtID0gaW1wb3J0c1JFLmV4ZWMoY29kZSkpICE9IG51bGwpIHtcbiAgICAgICAganMgKz0gYFxcbmltcG9ydCAke21bMV19YDtcbiAgICB9XG4gICAgcmV0dXJuIGpzO1xufVxuZnVuY3Rpb24gc2hvdWxkRXh0ZXJuYWxpemVEZXAocmVzb2x2ZWRJZCwgcmF3SWQpIHtcbiAgICAvLyBub3QgYSB2YWxpZCBmaWxlIHBhdGhcbiAgICBpZiAoIXBhdGgkby5pc0Fic29sdXRlKHJlc29sdmVkSWQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyB2aXJ0dWFsIGlkXG4gICAgaWYgKHJlc29sdmVkSWQgPT09IHJhd0lkIHx8IHJlc29sdmVkSWQuaW5jbHVkZXMoJ1xcMCcpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpc1NjYW5uYWJsZShpZCkge1xuICAgIHJldHVybiBKU19UWVBFU19SRS50ZXN0KGlkKSB8fCBodG1sVHlwZXNSRS50ZXN0KGlkKTtcbn1cblxuY29uc3QgaXNEZWJ1Z0VuYWJsZWQkMSA9IF9kZWJ1Zygndml0ZTpkZXBzJykuZW5hYmxlZDtcbi8qKlxuICogVGhlIGFtb3VudCB0byB3YWl0IGZvciByZXF1ZXN0cyB0byByZWdpc3RlciBuZXdseSBmb3VuZCBkZXBlbmRlbmNpZXMgYmVmb3JlIHRyaWdnZXJpbmdcbiAqIGEgcmUtYnVuZGxlICsgcGFnZSByZWxvYWRcbiAqL1xuY29uc3QgZGVib3VuY2VNcyA9IDEwMDtcbmNvbnN0IGRlcHNPcHRpbWl6ZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgZGV2U3NyRGVwc09wdGltaXplck1hcCA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBnZXREZXBzT3B0aW1pemVyKGNvbmZpZywgc3NyKSB7XG4gICAgLy8gV29ya2VycyBjb21waWxhdGlvbiBzaGFyZXMgdGhlIERlcHNPcHRpbWl6ZXIgZnJvbSB0aGUgbWFpbiBidWlsZFxuICAgIGNvbnN0IGlzRGV2U3NyID0gc3NyICYmIGNvbmZpZy5jb21tYW5kICE9PSAnYnVpbGQnO1xuICAgIHJldHVybiAoaXNEZXZTc3IgPyBkZXZTc3JEZXBzT3B0aW1pemVyTWFwIDogZGVwc09wdGltaXplck1hcCkuZ2V0KGNvbmZpZy5tYWluQ29uZmlnIHx8IGNvbmZpZyk7XG59XG5hc3luYyBmdW5jdGlvbiBpbml0RGVwc09wdGltaXplcihjb25maWcsIHNlcnZlcikge1xuICAgIC8vIE5vbiBEZXYgU1NSIE9wdGltaXplclxuICAgIGNvbnN0IHNzciA9IGNvbmZpZy5jb21tYW5kID09PSAnYnVpbGQnICYmICEhY29uZmlnLmJ1aWxkLnNzcjtcbiAgICBpZiAoIWdldERlcHNPcHRpbWl6ZXIoY29uZmlnLCBzc3IpKSB7XG4gICAgICAgIGF3YWl0IGNyZWF0ZURlcHNPcHRpbWl6ZXIoY29uZmlnLCBzZXJ2ZXIpO1xuICAgIH1cbn1cbmxldCBjcmVhdGluZ0RldlNzck9wdGltaXplcjtcbmFzeW5jIGZ1bmN0aW9uIGluaXREZXZTc3JEZXBzT3B0aW1pemVyKGNvbmZpZywgc2VydmVyKSB7XG4gICAgaWYgKGdldERlcHNPcHRpbWl6ZXIoY29uZmlnLCB0cnVlKSkge1xuICAgICAgICAvLyBzc3JcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY3JlYXRpbmdEZXZTc3JPcHRpbWl6ZXIpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0aW5nRGV2U3NyT3B0aW1pemVyO1xuICAgIH1cbiAgICBjcmVhdGluZ0RldlNzck9wdGltaXplciA9IChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEltcG9ydGFudDogc2Nhbm5pbmcgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgc3RhcnRpbmcgdGhlIFNTUiBkZXYgb3B0aW1pemVyXG4gICAgICAgIC8vIElmIHNzckxvYWRNb2R1bGUgaXMgY2FsbGVkIGJlZm9yZSBzZXJ2ZXIubGlzdGVuKCksIHRoZSBtYWluIGRlcHMgb3B0aW1pemVyXG4gICAgICAgIC8vIHdpbGwgbm90IGJlIHlldCBjcmVhdGVkXG4gICAgICAgIGNvbnN0IHNzciA9IGZhbHNlO1xuICAgICAgICBpZiAoIWdldERlcHNPcHRpbWl6ZXIoY29uZmlnLCBzc3IpKSB7XG4gICAgICAgICAgICBhd2FpdCBpbml0RGVwc09wdGltaXplcihjb25maWcsIHNlcnZlcik7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZ2V0RGVwc09wdGltaXplcihjb25maWcsIHNzcikuc2NhblByb2Nlc3Npbmc7XG4gICAgICAgIGF3YWl0IGNyZWF0ZURldlNzckRlcHNPcHRpbWl6ZXIoY29uZmlnKTtcbiAgICAgICAgY3JlYXRpbmdEZXZTc3JPcHRpbWl6ZXIgPSB1bmRlZmluZWQ7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gYXdhaXQgY3JlYXRpbmdEZXZTc3JPcHRpbWl6ZXI7XG59XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVEZXBzT3B0aW1pemVyKGNvbmZpZywgc2VydmVyKSB7XG4gICAgY29uc3QgeyBsb2dnZXIgfSA9IGNvbmZpZztcbiAgICBjb25zdCBpc0J1aWxkID0gY29uZmlnLmNvbW1hbmQgPT09ICdidWlsZCc7XG4gICAgY29uc3Qgc3NyID0gaXNCdWlsZCAmJiAhIWNvbmZpZy5idWlsZC5zc3I7IC8vIHNhZmUgYXMgRGV2IFNTUiBkb24ndCB1c2UgdGhpcyBvcHRpbWl6ZXJcbiAgICBjb25zdCBzZXNzaW9uVGltZXN0YW1wID0gRGF0ZS5ub3coKS50b1N0cmluZygpO1xuICAgIGNvbnN0IGNhY2hlZE1ldGFkYXRhID0gbG9hZENhY2hlZERlcE9wdGltaXphdGlvbk1ldGFkYXRhKGNvbmZpZywgc3NyKTtcbiAgICBsZXQgaGFuZGxlO1xuICAgIGxldCBjbG9zZWQgPSBmYWxzZTtcbiAgICBsZXQgbWV0YWRhdGEgPSBjYWNoZWRNZXRhZGF0YSB8fCBpbml0RGVwc09wdGltaXplck1ldGFkYXRhKGNvbmZpZywgc3NyLCBzZXNzaW9uVGltZXN0YW1wKTtcbiAgICBjb25zdCBkZXBzT3B0aW1pemVyID0ge1xuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgcmVnaXN0ZXJNaXNzaW5nSW1wb3J0LFxuICAgICAgICBydW46ICgpID0+IGRlYm91bmNlZFByb2Nlc3NpbmcoMCksXG4gICAgICAgIGlzT3B0aW1pemVkRGVwRmlsZTogKGlkKSA9PiBpc09wdGltaXplZERlcEZpbGUoaWQsIGNvbmZpZyksXG4gICAgICAgIGlzT3B0aW1pemVkRGVwVXJsOiBjcmVhdGVJc09wdGltaXplZERlcFVybChjb25maWcpLFxuICAgICAgICBnZXRPcHRpbWl6ZWREZXBJZDogKGRlcEluZm8pID0+IGlzQnVpbGQgPyBkZXBJbmZvLmZpbGUgOiBgJHtkZXBJbmZvLmZpbGV9P3Y9JHtkZXBJbmZvLmJyb3dzZXJIYXNofWAsXG4gICAgICAgIHJlZ2lzdGVyV29ya2Vyc1NvdXJjZSxcbiAgICAgICAgZGVsYXlEZXBzT3B0aW1pemVyVW50aWwsXG4gICAgICAgIHJlc2V0UmVnaXN0ZXJlZElkcyxcbiAgICAgICAgZW5zdXJlRmlyc3RSdW4sXG4gICAgICAgIGNsb3NlLFxuICAgICAgICBvcHRpb25zOiBnZXREZXBPcHRpbWl6YXRpb25Db25maWcoY29uZmlnLCBzc3IpLFxuICAgIH07XG4gICAgZGVwc09wdGltaXplck1hcC5zZXQoY29uZmlnLCBkZXBzT3B0aW1pemVyKTtcbiAgICBsZXQgbmV3RGVwc0Rpc2NvdmVyZWQgPSBmYWxzZTtcbiAgICBsZXQgbmV3RGVwc1RvTG9nID0gW107XG4gICAgbGV0IG5ld0RlcHNUb0xvZ0hhbmRsZTtcbiAgICBjb25zdCBsb2dOZXdseURpc2NvdmVyZWREZXBzID0gKCkgPT4ge1xuICAgICAgICBpZiAobmV3RGVwc1RvTG9nLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5pbmZvKHBpY29jb2xvcnNFeHBvcnRzLmdyZWVuKGBcdTI3MjggbmV3IGRlcGVuZGVuY2llcyBvcHRpbWl6ZWQ6ICR7ZGVwc0xvZ1N0cmluZyhuZXdEZXBzVG9Mb2cpfWApLCB7XG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXdEZXBzVG9Mb2cgPSBbXTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IGRlcE9wdGltaXphdGlvblByb2Nlc3NpbmcgPSBuZXdEZXBPcHRpbWl6YXRpb25Qcm9jZXNzaW5nKCk7XG4gICAgbGV0IGRlcE9wdGltaXphdGlvblByb2Nlc3NpbmdRdWV1ZSA9IFtdO1xuICAgIGNvbnN0IHJlc29sdmVFbnF1ZXVlZFByb2Nlc3NpbmdQcm9taXNlcyA9ICgpID0+IHtcbiAgICAgICAgLy8gUmVzb2x2ZSBhbGwgdGhlIHByb2Nlc3NpbmdzIChpbmNsdWRpbmcgdGhlIG9uZXMgd2hpY2ggd2VyZSBkZWxheWVkKVxuICAgICAgICBmb3IgKGNvbnN0IHByb2Nlc3Npbmcgb2YgZGVwT3B0aW1pemF0aW9uUHJvY2Vzc2luZ1F1ZXVlKSB7XG4gICAgICAgICAgICBwcm9jZXNzaW5nLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBkZXBPcHRpbWl6YXRpb25Qcm9jZXNzaW5nUXVldWUgPSBbXTtcbiAgICB9O1xuICAgIGxldCBlbnF1ZXVlZFJlcnVuO1xuICAgIGxldCBjdXJyZW50bHlQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgLy8gSWYgdGhlcmUgd2Fzbid0IGEgY2FjaGUgb3IgaXQgaXMgb3V0ZGF0ZWQsIHdlIG5lZWQgdG8gcHJlcGFyZSBhIGZpcnN0IHJ1blxuICAgIGxldCBmaXJzdFJ1bkNhbGxlZCA9ICEhY2FjaGVkTWV0YWRhdGE7XG4gICAgbGV0IG9wdGltaXphdGlvblJlc3VsdDtcbiAgICBsZXQgZGlzY292ZXI7XG4gICAgbGV0IG9wdGltaXppbmdOZXdEZXBzO1xuICAgIGFzeW5jIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgZGlzY292ZXI/LmNhbmNlbCgpLFxuICAgICAgICAgICAgZGVwc09wdGltaXplci5zY2FuUHJvY2Vzc2luZyxcbiAgICAgICAgICAgIG9wdGltaXphdGlvblJlc3VsdD8uY2FuY2VsKCksXG4gICAgICAgICAgICBvcHRpbWl6aW5nTmV3RGVwcyxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGlmICghY2FjaGVkTWV0YWRhdGEpIHtcbiAgICAgICAgLy8gRW50ZXIgcHJvY2Vzc2luZyBzdGF0ZSB1bnRpbCBjcmF3bCBvZiBzdGF0aWMgaW1wb3J0cyBlbmRzXG4gICAgICAgIGN1cnJlbnRseVByb2Nlc3NpbmcgPSB0cnVlO1xuICAgICAgICAvLyBJbml0aWFsaXplIGRpc2NvdmVyZWQgZGVwcyB3aXRoIG1hbnVhbGx5IGFkZGVkIG9wdGltaXplRGVwcy5pbmNsdWRlIGluZm9cbiAgICAgICAgY29uc3QgZGVwcyA9IHt9O1xuICAgICAgICBhd2FpdCBhZGRNYW51YWxseUluY2x1ZGVkT3B0aW1pemVEZXBzKGRlcHMsIGNvbmZpZywgc3NyKTtcbiAgICAgICAgY29uc3QgZGlzY292ZXJlZCA9IGF3YWl0IHRvRGlzY292ZXJlZERlcGVuZGVuY2llcyhjb25maWcsIGRlcHMsIHNzciwgc2Vzc2lvblRpbWVzdGFtcCk7XG4gICAgICAgIGZvciAoY29uc3QgZGVwSW5mbyBvZiBPYmplY3QudmFsdWVzKGRpc2NvdmVyZWQpKSB7XG4gICAgICAgICAgICBhZGRPcHRpbWl6ZWREZXBJbmZvKG1ldGFkYXRhLCAnZGlzY292ZXJlZCcsIHtcbiAgICAgICAgICAgICAgICAuLi5kZXBJbmZvLFxuICAgICAgICAgICAgICAgIHByb2Nlc3Npbmc6IGRlcE9wdGltaXphdGlvblByb2Nlc3NpbmcucHJvbWlzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbmV3RGVwc0Rpc2NvdmVyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNCdWlsZCkge1xuICAgICAgICAgICAgLy8gSW1wb3J0YW50LCB0aGUgc2Nhbm5lciBpcyBkZXYgb25seVxuICAgICAgICAgICAgZGVwc09wdGltaXplci5zY2FuUHJvY2Vzc2luZyA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRW5zdXJlIHNlcnZlciBsaXN0ZW4gaXMgY2FsbGVkIGJlZm9yZSB0aGUgc2Nhbm5lclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdnZXJWaXRlRGVwcyhwaWNvY29sb3JzRXhwb3J0cy5ncmVlbihgc2Nhbm5pbmcgZm9yIGRlcGVuZGVuY2llcy4uLmApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gZGlzY292ZXJQcm9qZWN0RGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXBzID0gYXdhaXQgZGlzY292ZXIucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlclZpdGVEZXBzKHBpY29jb2xvcnNFeHBvcnRzLmdyZWVuKE9iamVjdC5rZXlzKGRlcHMpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGBkZXBlbmRlbmNpZXMgZm91bmQgYnkgc2Nhbm5lcjogJHtkZXBzTG9nU3RyaW5nKE9iamVjdC5rZXlzKGRlcHMpKX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBgbm8gZGVwZW5kZW5jaWVzIGZvdW5kIGJ5IHNjYW5uZXJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlc2UgZGVwZW5kZW5jaWVzIHRvIHRoZSBkaXNjb3ZlcmVkIGxpc3QsIGFzIHRoZXNlIGFyZSBjdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgYnkgdGhlIHByZUFsaWFzUGx1Z2luIHRvIHN1cHBvcnQgYWxpYXNlZCBhbmQgb3B0aW1pemVkIGRlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFsc28gdXNlZCBieSB0aGUgQ0pTIGV4dGVybmFsaXphdGlvbiBoZXVyaXN0aWNzIGluIGxlZ2FjeSBtb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIE9iamVjdC5rZXlzKGRlcHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YS5kaXNjb3ZlcmVkW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRNaXNzaW5nRGVwKGlkLCBkZXBzW2lkXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga25vd25EZXBzID0gcHJlcGFyZUtub3duRGVwcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGRldiwgd2UgcnVuIHRoZSBzY2FubmVyIGFuZCB0aGUgZmlyc3Qgb3B0aW1pemF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gb24gdGhlIGJhY2tncm91bmQsIGJ1dCB3ZSB3YWl0IHVudGlsIGNyYXdsaW5nIGhhcyBlbmRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZGVjaWRlIGlmIHdlIHNlbmQgdGhpcyByZXN1bHQgdG8gdGhlIGJyb3dzZXIgb3Igd2UgbmVlZCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gYW5vdGhlciBvcHRpbWl6ZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb25SZXN1bHQgPSBydW5PcHRpbWl6ZURlcHMoY29uZmlnLCBrbm93bkRlcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZS5zdGFjayB8fCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwc09wdGltaXplci5zY2FuUHJvY2Vzc2luZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc3RhcnROZXh0RGlzY292ZXJlZEJhdGNoKCkge1xuICAgICAgICBuZXdEZXBzRGlzY292ZXJlZCA9IGZhbHNlO1xuICAgICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgZGVwT3B0aW1pemF0aW9uUHJvY2Vzc2luZyB0byB0aGUgcXVldWUsIHRoZXNlXG4gICAgICAgIC8vIHByb21pc2VzIGFyZSBnb2luZyB0byBiZSByZXNvbHZlZCBvbmNlIGEgcmVydW4gaXMgY29tbWl0dGVkXG4gICAgICAgIGRlcE9wdGltaXphdGlvblByb2Nlc3NpbmdRdWV1ZS5wdXNoKGRlcE9wdGltaXphdGlvblByb2Nlc3NpbmcpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcHJvbWlzZSBmb3IgdGhlIG5leHQgcmVydW4sIGRpc2NvdmVyZWQgbWlzc2luZ1xuICAgICAgICAvLyBkZXBlbmRlbmNpZXMgd2lsbCBiZSBhc3NpZ25lZCB0aGlzIHByb21pc2UgZnJvbSB0aGlzIHBvaW50XG4gICAgICAgIGRlcE9wdGltaXphdGlvblByb2Nlc3NpbmcgPSBuZXdEZXBPcHRpbWl6YXRpb25Qcm9jZXNzaW5nKCk7XG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uIG9wdGltaXplTmV3RGVwcygpIHtcbiAgICAgICAgLy8gYSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIG9wdGltaXplRGVwcyByZXJ1biB3aWxsIGVuZCB1cFxuICAgICAgICAvLyBjcmVhdGluZyBuZXcgYnVuZGxlZCB2ZXJzaW9uIG9mIGFsbCBjdXJyZW50IGFuZCBkaXNjb3ZlcmVkIGRlcHNcbiAgICAgICAgLy8gaW4gdGhlIGNhY2hlIGRpciBhbmQgYSBuZXcgbWV0YWRhdGEgaW5mbyBvYmplY3QgYXNzaWduZWRcbiAgICAgICAgLy8gdG8gX21ldGFkYXRhLiBBIGZ1bGxSZWxvYWQgaXMgb25seSBpc3N1ZWQgaWYgdGhlIHByZXZpb3VzIGJ1bmRsZWRcbiAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGhhdmUgY2hhbmdlZC5cbiAgICAgICAgLy8gaWYgdGhlIHJlcnVuIGZhaWxzLCBfbWV0YWRhdGEgcmVtYWlucyB1bnRvdWNoZWQsIGN1cnJlbnQgZGlzY292ZXJlZFxuICAgICAgICAvLyBkZXBzIGFyZSBjbGVhbmVkLCBhbmQgYSBmdWxsUmVsb2FkIGlzIGlzc3VlZFxuICAgICAgICAvLyBBbGwgZGVwcywgcHJldmlvdXMga25vd24gYW5kIG5ld2x5IGRpc2NvdmVyZWQgYXJlIHJlYnVuZGxlZCxcbiAgICAgICAgLy8gcmVzcGVjdCBpbnNlcnRpb24gb3JkZXIgdG8ga2VlcCB0aGUgbWV0YWRhdGEgZmlsZSBzdGFibGVcbiAgICAgICAgY29uc3Qga25vd25EZXBzID0gcHJlcGFyZUtub3duRGVwcygpO1xuICAgICAgICBzdGFydE5leHREaXNjb3ZlcmVkQmF0Y2goKTtcbiAgICAgICAgb3B0aW1pemF0aW9uUmVzdWx0ID0gcnVuT3B0aW1pemVEZXBzKGNvbmZpZywga25vd25EZXBzKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG9wdGltaXphdGlvblJlc3VsdC5yZXN1bHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByZXBhcmVLbm93bkRlcHMoKSB7XG4gICAgICAgIGNvbnN0IGtub3duRGVwcyA9IHt9O1xuICAgICAgICAvLyBDbG9uZSBvcHRpbWl6ZWQgaW5mbyBvYmplY3RzLCBmaWxlSGFzaCwgYnJvd3Nlckhhc2ggbWF5IGJlIGNoYW5nZWQgZm9yIHRoZW1cbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgT2JqZWN0LmtleXMobWV0YWRhdGEub3B0aW1pemVkKSkge1xuICAgICAgICAgICAga25vd25EZXBzW2RlcF0gPSB7IC4uLm1ldGFkYXRhLm9wdGltaXplZFtkZXBdIH07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBkZXAgb2YgT2JqZWN0LmtleXMobWV0YWRhdGEuZGlzY292ZXJlZCkpIHtcbiAgICAgICAgICAgIC8vIENsb25lIHRoZSBkaXNjb3ZlcmVkIGluZm8gZGlzY2FyZGluZyBpdHMgcHJvY2Vzc2luZyBwcm9taXNlXG4gICAgICAgICAgICBjb25zdCB7IHByb2Nlc3NpbmcsIC4uLmluZm8gfSA9IG1ldGFkYXRhLmRpc2NvdmVyZWRbZGVwXTtcbiAgICAgICAgICAgIGtub3duRGVwc1tkZXBdID0gaW5mbztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga25vd25EZXBzO1xuICAgIH1cbiAgICBhc3luYyBmdW5jdGlvbiBydW5PcHRpbWl6ZXIocHJlUnVuUmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IGlzUmVydW4gPSBmaXJzdFJ1bkNhbGxlZDtcbiAgICAgICAgZmlyc3RSdW5DYWxsZWQgPSB0cnVlO1xuICAgICAgICAvLyBFbnN1cmUgdGhhdCByZXJ1biBpcyBjYWxsZWQgc2VxdWVudGlhbGx5XG4gICAgICAgIGVucXVldWVkUmVydW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IGEgcmVydW4gd2lsbCBub3QgYmUgaXNzdWVkIGZvciBjdXJyZW50IGRpc2NvdmVyZWQgZGVwc1xuICAgICAgICBpZiAoaGFuZGxlKVxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgICAgIGlmIChjbG9zZWQgfHwgT2JqZWN0LmtleXMobWV0YWRhdGEuZGlzY292ZXJlZCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjdXJyZW50bHlQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudGx5UHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzaW5nUmVzdWx0ID0gcHJlUnVuUmVzdWx0ID8/IChhd2FpdCAob3B0aW1pemluZ05ld0RlcHMgPSBvcHRpbWl6ZU5ld0RlcHMoKSkpO1xuICAgICAgICAgICAgb3B0aW1pemluZ05ld0RlcHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdSZXN1bHQuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZUVucXVldWVkUHJvY2Vzc2luZ1Byb21pc2VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3RGF0YSA9IHByb2Nlc3NpbmdSZXN1bHQubWV0YWRhdGE7XG4gICAgICAgICAgICBjb25zdCBuZWVkc0ludGVyb3BNaXNtYXRjaCA9IGZpbmRJbnRlcm9wTWlzbWF0Y2hlcyhtZXRhZGF0YS5kaXNjb3ZlcmVkLCBuZXdEYXRhLm9wdGltaXplZCk7XG4gICAgICAgICAgICAvLyBBZnRlciBhIHJlLW9wdGltaXphdGlvbiwgaWYgdGhlIGludGVybmFsIGJ1bmRsZWQgY2h1bmtzIGNoYW5nZSBhIGZ1bGwgcGFnZSByZWxvYWRcbiAgICAgICAgICAgIC8vIGlzIHJlcXVpcmVkLiBJZiB0aGUgZmlsZXMgYXJlIHN0YWJsZSwgd2UgY2FuIGF2b2lkIHRoZSByZWxvYWQgdGhhdCBpcyBleHBlbnNpdmVcbiAgICAgICAgICAgIC8vIGZvciBsYXJnZSBhcHBsaWNhdGlvbnMuIENvbXBhcmluZyB0aGVpciBmaWxlSGFzaCB3ZSBjYW4gZmluZCBvdXQgaWYgaXQgaXMgc2FmZSB0b1xuICAgICAgICAgICAgLy8ga2VlcCB0aGUgY3VycmVudCBicm93c2VyIHN0YXRlLlxuICAgICAgICAgICAgY29uc3QgbmVlZHNSZWxvYWQgPSBuZWVkc0ludGVyb3BNaXNtYXRjaC5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEuaGFzaCAhPT0gbmV3RGF0YS5oYXNoIHx8XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMobWV0YWRhdGEub3B0aW1pemVkKS5zb21lKChkZXApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtZXRhZGF0YS5vcHRpbWl6ZWRbZGVwXS5maWxlSGFzaCAhPT0gbmV3RGF0YS5vcHRpbWl6ZWRbZGVwXS5maWxlSGFzaCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBjb21taXRQcm9jZXNzaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NpbmdSZXN1bHQuY29tbWl0KCk7XG4gICAgICAgICAgICAgICAgLy8gV2hpbGUgb3B0aW1pemVEZXBzIGlzIHJ1bm5pbmcsIG5ldyBtaXNzaW5nIGRlcHMgbWF5IGJlIGRpc2NvdmVyZWQsXG4gICAgICAgICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB0aGV5IHdpbGwga2VlcCBiZWluZyBhZGRlZCB0byBtZXRhZGF0YS5kaXNjb3ZlcmVkXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBtZXRhZGF0YS5kaXNjb3ZlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3RGF0YS5vcHRpbWl6ZWRbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRPcHRpbWl6ZWREZXBJbmZvKG5ld0RhdGEsICdkaXNjb3ZlcmVkJywgbWV0YWRhdGEuZGlzY292ZXJlZFtpZF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IHJlbG9hZCB0aGUgcGFnZSwgd2UgbmVlZCB0byBrZWVwIGJyb3dzZXJIYXNoIHN0YWJsZVxuICAgICAgICAgICAgICAgIGlmICghbmVlZHNSZWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5icm93c2VySGFzaCA9IG1ldGFkYXRhLmJyb3dzZXJIYXNoO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBpbiBuZXdEYXRhLmNodW5rcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YS5jaHVua3NbZGVwXS5icm93c2VySGFzaCA9IG1ldGFkYXRhLmJyb3dzZXJIYXNoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVwIGluIG5ld0RhdGEub3B0aW1pemVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEYXRhLm9wdGltaXplZFtkZXBdLmJyb3dzZXJIYXNoID0gKG1ldGFkYXRhLm9wdGltaXplZFtkZXBdIHx8IG1ldGFkYXRhLmRpc2NvdmVyZWRbZGVwXSkuYnJvd3Nlckhhc2g7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tbWl0IGhhc2ggYW5kIG5lZWRzSW50ZXJvcCBjaGFuZ2VzIHRvIHRoZSBkaXNjb3ZlcmVkIGRlcHMgaW5mb1xuICAgICAgICAgICAgICAgIC8vIG9iamVjdC4gQWxsb3cgZm9yIGNvZGUgdG8gYXdhaXQgZm9yIHRoZSBkaXNjb3ZlcmVkIHByb2Nlc3NpbmcgcHJvbWlzZVxuICAgICAgICAgICAgICAgIC8vIGFuZCB1c2UgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBzYW1lIG9iamVjdFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbyBpbiBuZXdEYXRhLm9wdGltaXplZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNjb3ZlcmVkID0gbWV0YWRhdGEuZGlzY292ZXJlZFtvXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2NvdmVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGltaXplZCA9IG5ld0RhdGEub3B0aW1pemVkW29dO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXJlZC5icm93c2VySGFzaCA9IG9wdGltaXplZC5icm93c2VySGFzaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyZWQuZmlsZUhhc2ggPSBvcHRpbWl6ZWQuZmlsZUhhc2g7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlcmVkLm5lZWRzSW50ZXJvcCA9IG9wdGltaXplZC5uZWVkc0ludGVyb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlcmVkLnByb2Nlc3NpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVydW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RGVwc1RvTG9nLnB1c2goLi4uT2JqZWN0LmtleXMobmV3RGF0YS5vcHRpbWl6ZWQpLmZpbHRlcigoZGVwKSA9PiAhbWV0YWRhdGEub3B0aW1pemVkW2RlcF0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBkZXBzT3B0aW1pemVyLm1ldGFkYXRhID0gbmV3RGF0YTtcbiAgICAgICAgICAgICAgICByZXNvbHZlRW5xdWV1ZWRQcm9jZXNzaW5nUHJvbWlzZXMoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoIW5lZWRzUmVsb2FkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29tbWl0UHJvY2Vzc2luZygpO1xuICAgICAgICAgICAgICAgIGlmICghaXNEZWJ1Z0VuYWJsZWQkMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3RGVwc1RvTG9nSGFuZGxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG5ld0RlcHNUb0xvZ0hhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0RlcHNUb0xvZ0hhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGVwc1RvTG9nSGFuZGxlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nTmV3bHlEaXNjb3ZlcmVkRGVwcygpO1xuICAgICAgICAgICAgICAgICAgICB9LCAyICogZGVib3VuY2VNcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlclZpdGVEZXBzKHBpY29jb2xvcnNFeHBvcnRzLmdyZWVuKGBcdTI3MjggJHshaXNSZXJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZGVwZW5kZW5jaWVzIG9wdGltaXplZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYG9wdGltaXplZCBkZXBlbmRlbmNpZXMgdW5jaGFuZ2VkYH1gKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0RlcHNEaXNjb3ZlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBuZXdseSBkaXNjb3ZlcmVkIGRlcHMsIGFuZCBhbm90aGVyIHJlcnVuIGlzIGFib3V0IHRvIGJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVkLiBBdm9pZCB0aGUgY3VycmVudCBmdWxsIHJlbG9hZCBkaXNjYXJkaW5nIHRoaXMgcmVydW4gcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHJlc29sdmUgdGhlIHByb2Nlc3NpbmcgcHJvbWlzZSwgYXMgdGhleSB3aWxsIGJlIHJlc29sdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYSByZXJ1biBpcyBjb21taXR0ZWRcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ1Jlc3VsdC5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdnZXJWaXRlRGVwcyhwaWNvY29sb3JzRXhwb3J0cy5ncmVlbihgXHUyNzI4IGRlbGF5aW5nIHJlbG9hZCBhcyBuZXcgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBmb3VuZC4uLmApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbW1pdFByb2Nlc3NpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0RlYnVnRW5hYmxlZCQxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3RGVwc1RvTG9nSGFuZGxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChuZXdEZXBzVG9Mb2dIYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGVwc1RvTG9nSGFuZGxlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nTmV3bHlEaXNjb3ZlcmVkRGVwcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHBpY29jb2xvcnNFeHBvcnRzLmdyZWVuKGBcdTI3Mjggb3B0aW1pemVkIGRlcGVuZGVuY2llcyBjaGFuZ2VkLiByZWxvYWRpbmdgKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRzSW50ZXJvcE1pc21hdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIud2FybihgTWl4ZWQgRVNNIGFuZCBDSlMgZGV0ZWN0ZWQgaW4gJHtwaWNvY29sb3JzRXhwb3J0cy55ZWxsb3cobmVlZHNJbnRlcm9wTWlzbWF0Y2guam9pbignLCAnKSl9LCBhZGQgJHtuZWVkc0ludGVyb3BNaXNtYXRjaC5sZW5ndGggPT09IDEgPyAnaXQnIDogJ3RoZW0nfSB0byBvcHRpbWl6ZURlcHMubmVlZHNJbnRlcm9wIHRvIHNwZWVkIHVwIGNvbGQgc3RhcnRgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnVsbFJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHBpY29jb2xvcnNFeHBvcnRzLnJlZChgZXJyb3Igd2hpbGUgdXBkYXRpbmcgZGVwZW5kZW5jaWVzOlxcbiR7ZS5zdGFja31gKSwgeyB0aW1lc3RhbXA6IHRydWUsIGVycm9yOiBlIH0pO1xuICAgICAgICAgICAgcmVzb2x2ZUVucXVldWVkUHJvY2Vzc2luZ1Byb21pc2VzKCk7XG4gICAgICAgICAgICAvLyBSZXNldCBtaXNzaW5nIGRlcHMsIGxldCB0aGUgc2VydmVyIHJlZGlzY292ZXIgdGhlIGRlcGVuZGVuY2llc1xuICAgICAgICAgICAgbWV0YWRhdGEuZGlzY292ZXJlZCA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRseVByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgZW5xdWV1ZWRSZXJ1bmAgY291bGQgZXhpc3QgYmVjYXVzZSBgZGVib3VuY2VkUHJvY2Vzc2luZ2AgbWF5IHJ1biB3aGlsZSBhd2FpdGVkXG4gICAgICAgIGVucXVldWVkUmVydW4/LigpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmdWxsUmVsb2FkKCkge1xuICAgICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgICAgICAvLyBDYWNoZWQgdHJhbnNmb3JtIHJlc3VsdHMgaGF2ZSBzdGFsZSBpbXBvcnRzIChyZXNvbHZlZCB0b1xuICAgICAgICAgICAgLy8gb2xkIGxvY2F0aW9ucykgc28gdGhleSBuZWVkIHRvIGJlIGludmFsaWRhdGVkIGJlZm9yZSB0aGUgcGFnZSBpc1xuICAgICAgICAgICAgLy8gcmVsb2FkZWQuXG4gICAgICAgICAgICBzZXJ2ZXIubW9kdWxlR3JhcGguaW52YWxpZGF0ZUFsbCgpO1xuICAgICAgICAgICAgc2VydmVyLndzLnNlbmQoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmdWxsLXJlbG9hZCcsXG4gICAgICAgICAgICAgICAgcGF0aDogJyonLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gcmVydW4oKSB7XG4gICAgICAgIC8vIGRlYm91bmNlIHRpbWUgdG8gd2FpdCBmb3IgbmV3IG1pc3NpbmcgZGVwcyBmaW5pc2hlZCwgaXNzdWUgYSBuZXdcbiAgICAgICAgLy8gb3B0aW1pemF0aW9uIG9mIGRlcHMgKGJvdGggb2xkIGFuZCBuZXdseSBmb3VuZCkgb25jZSB0aGUgcHJldmlvdXNcbiAgICAgICAgLy8gb3B0aW1pemVEZXBzIHByb2Nlc3NpbmcgaXMgZmluaXNoZWRcbiAgICAgICAgY29uc3QgZGVwcyA9IE9iamVjdC5rZXlzKG1ldGFkYXRhLmRpc2NvdmVyZWQpO1xuICAgICAgICBjb25zdCBkZXBzU3RyaW5nID0gZGVwc0xvZ1N0cmluZyhkZXBzKTtcbiAgICAgICAgZGVidWdnZXJWaXRlRGVwcyhwaWNvY29sb3JzRXhwb3J0cy5ncmVlbihgbmV3IGRlcGVuZGVuY2llcyBmb3VuZDogJHtkZXBzU3RyaW5nfWApKTtcbiAgICAgICAgcnVuT3B0aW1pemVyKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldERpc2NvdmVyZWRCcm93c2VySGFzaChoYXNoLCBkZXBzLCBtaXNzaW5nKSB7XG4gICAgICAgIHJldHVybiBnZXRIYXNoKGhhc2ggKyBKU09OLnN0cmluZ2lmeShkZXBzKSArIEpTT04uc3RyaW5naWZ5KG1pc3NpbmcpICsgc2Vzc2lvblRpbWVzdGFtcCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlZ2lzdGVyTWlzc2luZ0ltcG9ydChpZCwgcmVzb2x2ZWQpIHtcbiAgICAgICAgY29uc3Qgb3B0aW1pemVkID0gbWV0YWRhdGEub3B0aW1pemVkW2lkXTtcbiAgICAgICAgaWYgKG9wdGltaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGltaXplZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaHVuayA9IG1ldGFkYXRhLmNodW5rc1tpZF07XG4gICAgICAgIGlmIChjaHVuaykge1xuICAgICAgICAgICAgcmV0dXJuIGNodW5rO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtaXNzaW5nID0gbWV0YWRhdGEuZGlzY292ZXJlZFtpZF07XG4gICAgICAgIGlmIChtaXNzaW5nKSB7XG4gICAgICAgICAgICAvLyBXZSBhcmUgYWxyZWFkeSBkaXNjb3ZlciB0aGlzIGRlcGVuZGVuY3lcbiAgICAgICAgICAgIC8vIEl0IHdpbGwgYmUgcHJvY2Vzc2VkIGluIHRoZSBuZXh0IHJlcnVuIGNhbGxcbiAgICAgICAgICAgIHJldHVybiBtaXNzaW5nO1xuICAgICAgICB9XG4gICAgICAgIG1pc3NpbmcgPSBhZGRNaXNzaW5nRGVwKGlkLCByZXNvbHZlZCk7XG4gICAgICAgIC8vIFVudGlsIHRoZSBmaXJzdCBvcHRpbWl6ZSBydW4gaXMgY2FsbGVkLCBhdm9pZCB0cmlnZ2VyaW5nIHByb2Nlc3NpbmdcbiAgICAgICAgLy8gV2UnbGwgd2FpdCB1bnRpbCB0aGUgdXNlciBjb2RlYmFzZSBpcyBlYWdlcmx5IHByb2Nlc3NlZCBieSBWaXRlIHNvXG4gICAgICAgIC8vIHdlIGNhbiBnZXQgYSBsaXN0IG9mIGV2ZXJ5IG1pc3NpbmcgZGVwZW5kZW5jeSBiZWZvcmUgZ2l2aW5nIHRvIHRoZVxuICAgICAgICAvLyBicm93c2VyIGEgZGVwZW5kZW5jeSB0aGF0IG1heSBiZSBvdXRkYXRlZCwgdGh1cyBhdm9pZGluZyBmdWxsIHBhZ2UgcmVsb2Fkc1xuICAgICAgICBpZiAoZmlyc3RSdW5DYWxsZWQpIHtcbiAgICAgICAgICAgIC8vIERlYm91bmNlZCByZXJ1biwgbGV0IG90aGVyIG1pc3NpbmcgZGVwZW5kZW5jaWVzIGJlIGRpc2NvdmVyZWQgYmVmb3JlXG4gICAgICAgICAgICAvLyB0aGUgcnVubmluZyBuZXh0IG9wdGltaXplRGVwc1xuICAgICAgICAgICAgZGVib3VuY2VkUHJvY2Vzc2luZygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiB0aGUgcGF0aCBmb3IgdGhlIG9wdGltaXplZCBidW5kbGUsIHRoaXMgcGF0aCBpcyBrbm93biBiZWZvcmVcbiAgICAgICAgLy8gZXNidWlsZCBpcyBydW4gdG8gZ2VuZXJhdGUgdGhlIHByZS1idW5kbGVcbiAgICAgICAgcmV0dXJuIG1pc3Npbmc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1pc3NpbmdEZXAoaWQsIHJlc29sdmVkKSB7XG4gICAgICAgIG5ld0RlcHNEaXNjb3ZlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGFkZE9wdGltaXplZERlcEluZm8obWV0YWRhdGEsICdkaXNjb3ZlcmVkJywge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBmaWxlOiBnZXRPcHRpbWl6ZWREZXBQYXRoKGlkLCBjb25maWcsIHNzciksXG4gICAgICAgICAgICBzcmM6IHJlc29sdmVkLFxuICAgICAgICAgICAgLy8gQWRkaW5nIGEgYnJvd3Nlckhhc2ggdG8gdGhpcyBtaXNzaW5nIGRlcGVuZGVuY3kgdGhhdCBpcyB1bmlxdWUgdG9cbiAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHN0YXRlIG9mIGtub3duICsgbWlzc2luZyBkZXBzLiBJZiBpdHMgb3B0aW1pemVEZXBzIHJ1blxuICAgICAgICAgICAgLy8gZG9lc24ndCBhbHRlciB0aGUgYnVuZGxlZCBmaWxlcyBvZiBwcmV2aW91cyBrbm93biBkZXBlbmRlbmNpZXMsXG4gICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIGEgZnVsbCByZWxvYWQgYW5kIHRoaXMgYnJvd3Nlckhhc2ggd2lsbCBiZSBrZXB0XG4gICAgICAgICAgICBicm93c2VySGFzaDogZ2V0RGlzY292ZXJlZEJyb3dzZXJIYXNoKG1ldGFkYXRhLmhhc2gsIGRlcHNGcm9tT3B0aW1pemVkRGVwSW5mbyhtZXRhZGF0YS5vcHRpbWl6ZWQpLCBkZXBzRnJvbU9wdGltaXplZERlcEluZm8obWV0YWRhdGEuZGlzY292ZXJlZCkpLFxuICAgICAgICAgICAgLy8gbG9hZGluZyBvZiB0aGlzIHByZS1idW5kbGVkIGRlcCBuZWVkcyB0byBhd2FpdCBmb3IgaXRzIHByb2Nlc3NpbmdcbiAgICAgICAgICAgIC8vIHByb21pc2UgdG8gYmUgcmVzb2x2ZWRcbiAgICAgICAgICAgIHByb2Nlc3Npbmc6IGRlcE9wdGltaXphdGlvblByb2Nlc3NpbmcucHJvbWlzZSxcbiAgICAgICAgICAgIGV4cG9ydHNEYXRhOiBleHRyYWN0RXhwb3J0c0RhdGEocmVzb2x2ZWQsIGNvbmZpZywgc3NyKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlYm91bmNlZFByb2Nlc3NpbmcodGltZW91dCA9IGRlYm91bmNlTXMpIHtcbiAgICAgICAgaWYgKCFuZXdEZXBzRGlzY292ZXJlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlYm91bmNlZCByZXJ1biwgbGV0IG90aGVyIG1pc3NpbmcgZGVwZW5kZW5jaWVzIGJlIGRpc2NvdmVyZWQgYmVmb3JlXG4gICAgICAgIC8vIHRoZSBydW5uaW5nIG5leHQgb3B0aW1pemVEZXBzXG4gICAgICAgIGVucXVldWVkUmVydW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChoYW5kbGUpXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICAgICAgaWYgKG5ld0RlcHNUb0xvZ0hhbmRsZSlcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChuZXdEZXBzVG9Mb2dIYW5kbGUpO1xuICAgICAgICBuZXdEZXBzVG9Mb2dIYW5kbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGhhbmRsZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaGFuZGxlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZW5xdWV1ZWRSZXJ1biA9IHJlcnVuO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50bHlQcm9jZXNzaW5nKSB7XG4gICAgICAgICAgICAgICAgZW5xdWV1ZWRSZXJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gb25DcmF3bEVuZCgpIHtcbiAgICAgICAgZGVidWdnZXJWaXRlRGVwcyhwaWNvY29sb3JzRXhwb3J0cy5ncmVlbihgXHUyNzI4IHN0YXRpYyBpbXBvcnRzIGNyYXdsIGVuZGVkYCkpO1xuICAgICAgICBpZiAoZmlyc3RSdW5DYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50bHlQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNyYXdsRGVwcyA9IE9iamVjdC5rZXlzKG1ldGFkYXRhLmRpc2NvdmVyZWQpO1xuICAgICAgICAvLyBBd2FpdCBmb3IgdGhlIHNjYW4rb3B0aW1pemUgc3RlcCBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgIC8vIEl0IG5vcm1hbGx5IHNob3VsZCBiZSBvdmVyIGJ5IHRoZSB0aW1lIGNyYXdsaW5nIG9mIHVzZXIgY29kZSBlbmRlZFxuICAgICAgICBhd2FpdCBkZXBzT3B0aW1pemVyLnNjYW5Qcm9jZXNzaW5nO1xuICAgICAgICBpZiAoIWlzQnVpbGQgJiYgb3B0aW1pemF0aW9uUmVzdWx0KSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcHRpbWl6YXRpb25SZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgb3B0aW1pemF0aW9uUmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc2NhbkRlcHMgPSBPYmplY3Qua2V5cyhyZXN1bHQubWV0YWRhdGEub3B0aW1pemVkKTtcbiAgICAgICAgICAgIGlmIChzY2FuRGVwcy5sZW5ndGggPT09IDAgJiYgY3Jhd2xEZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyVml0ZURlcHMocGljb2NvbG9yc0V4cG9ydHMuZ3JlZW4oYFx1MjcyOCBubyBkZXBlbmRlbmNpZXMgZm91bmQgYnkgdGhlIHNjYW5uZXIgb3IgY3Jhd2xpbmcgc3RhdGljIGltcG9ydHNgKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIGZpcnN0UnVuQ2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZWVkc0ludGVyb3BNaXNtYXRjaCA9IGZpbmRJbnRlcm9wTWlzbWF0Y2hlcyhtZXRhZGF0YS5kaXNjb3ZlcmVkLCByZXN1bHQubWV0YWRhdGEub3B0aW1pemVkKTtcbiAgICAgICAgICAgIGNvbnN0IHNjYW5uZXJNaXNzZWREZXBzID0gY3Jhd2xEZXBzLnNvbWUoKGRlcCkgPT4gIXNjYW5EZXBzLmluY2x1ZGVzKGRlcCkpO1xuICAgICAgICAgICAgY29uc3Qgb3V0ZGF0ZWRSZXN1bHQgPSBuZWVkc0ludGVyb3BNaXNtYXRjaC5sZW5ndGggPiAwIHx8IHNjYW5uZXJNaXNzZWREZXBzO1xuICAgICAgICAgICAgaWYgKG91dGRhdGVkUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgLy8gRHJvcCB0aGlzIHNjYW4gcmVzdWx0LCBhbmQgcGVyZm9ybSBhIG5ldyBvcHRpbWl6YXRpb24gdG8gYXZvaWQgYSBmdWxsIHJlbG9hZFxuICAgICAgICAgICAgICAgIHJlc3VsdC5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICAvLyBBZGQgZGVwcyBmb3VuZCBieSB0aGUgc2Nhbm5lciB0byB0aGUgZGlzY292ZXJlZCBkZXBzIHdoaWxlIGNyYXdsaW5nXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXAgb2Ygc2NhbkRlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjcmF3bERlcHMuaW5jbHVkZXMoZGVwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWlzc2luZ0RlcChkZXAsIHJlc3VsdC5tZXRhZGF0YS5vcHRpbWl6ZWRbZGVwXS5zcmMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzY2FubmVyTWlzc2VkRGVwcykge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlclZpdGVEZXBzKHBpY29jb2xvcnNFeHBvcnRzLnllbGxvdyhgXHUyNzI4IG5ldyBkZXBlbmRlbmNpZXMgd2VyZSBmb3VuZCB3aGlsZSBjcmF3bGluZyB0aGF0IHdlcmVuJ3QgZGV0ZWN0ZWQgYnkgdGhlIHNjYW5uZXJgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyVml0ZURlcHMocGljb2NvbG9yc0V4cG9ydHMuZ3JlZW4oYFx1MjcyOCByZS1ydW5uaW5nIG9wdGltaXplcmApKTtcbiAgICAgICAgICAgICAgICBkZWJvdW5jZWRQcm9jZXNzaW5nKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXJWaXRlRGVwcyhwaWNvY29sb3JzRXhwb3J0cy5ncmVlbihgXHUyNzI4IHVzaW5nIHBvc3Qtc2NhbiBvcHRpbWl6ZXIgcmVzdWx0LCB0aGUgc2Nhbm5lciBmb3VuZCBldmVyeSB1c2VkIGRlcGVuZGVuY3lgKSk7XG4gICAgICAgICAgICAgICAgc3RhcnROZXh0RGlzY292ZXJlZEJhdGNoKCk7XG4gICAgICAgICAgICAgICAgcnVuT3B0aW1pemVyKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3Jhd2xEZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyVml0ZURlcHMocGljb2NvbG9yc0V4cG9ydHMuZ3JlZW4oYFx1MjcyOCBubyBkZXBlbmRlbmNpZXMgZm91bmQgd2hpbGUgY3Jhd2xpbmcgdGhlIHN0YXRpYyBpbXBvcnRzYCkpO1xuICAgICAgICAgICAgICAgIGZpcnN0UnVuQ2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHRoZSBmaXJzdCBvcHRpbWl6ZXIgcnVuXG4gICAgICAgICAgICAgICAgZGVib3VuY2VkUHJvY2Vzc2luZygwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBydW5PcHRpbWl6ZXJJZklkbGVBZnRlck1zID0gMTAwO1xuICAgIGxldCByZWdpc3RlcmVkSWRzID0gW107XG4gICAgbGV0IHNlZW5JZHMgPSBuZXcgU2V0KCk7XG4gICAgbGV0IHdvcmtlcnNTb3VyY2VzID0gbmV3IFNldCgpO1xuICAgIGxldCB3YWl0aW5nT247XG4gICAgbGV0IGZpcnN0UnVuRW5zdXJlZCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIHJlc2V0UmVnaXN0ZXJlZElkcygpIHtcbiAgICAgICAgcmVnaXN0ZXJlZElkcyA9IFtdO1xuICAgICAgICBzZWVuSWRzID0gbmV3IFNldCgpO1xuICAgICAgICB3b3JrZXJzU291cmNlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgd2FpdGluZ09uID0gdW5kZWZpbmVkO1xuICAgICAgICBmaXJzdFJ1bkVuc3VyZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gSWYgYWxsIHRoZSBpbnB1dHMgYXJlIGRlcGVuZGVuY2llcywgd2UgYXJlbid0IGdvaW5nIHRvIGdldCBhbnlcbiAgICAvLyBkZWxheURlcHNPcHRpbWl6ZXJVbnRpbChpZCkgY2FsbHMuIFdlIG5lZWQgdG8gZ3VhcmQgYWdhaW5zdCB0aGlzXG4gICAgLy8gYnkgZm9yY2luZyBhIHJlcnVuIGlmIG5vIGRlcHMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWRcbiAgICBmdW5jdGlvbiBlbnN1cmVGaXJzdFJ1bigpIHtcbiAgICAgICAgaWYgKCFmaXJzdFJ1bkVuc3VyZWQgJiYgIWZpcnN0UnVuQ2FsbGVkICYmIHJlZ2lzdGVyZWRJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCAmJiByZWdpc3RlcmVkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBvbkNyYXdsRW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcnVuT3B0aW1pemVySWZJZGxlQWZ0ZXJNcyk7XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3RSdW5FbnN1cmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVnaXN0ZXJXb3JrZXJzU291cmNlKGlkKSB7XG4gICAgICAgIHdvcmtlcnNTb3VyY2VzLmFkZChpZCk7XG4gICAgICAgIC8vIEF2b2lkIHdhaXRpbmcgZm9yIHRoaXMgaWQsIGFzIGl0IG1heSBiZSBibG9ja2VkIGJ5IHRoZSByb2xsdXBcbiAgICAgICAgLy8gYnVuZGxpbmcgcHJvY2VzcyBvZiB0aGUgd29ya2VyIHRoYXQgYWxzbyBkZXBlbmRzIG9uIHRoZSBvcHRpbWl6ZXJcbiAgICAgICAgcmVnaXN0ZXJlZElkcyA9IHJlZ2lzdGVyZWRJZHMuZmlsdGVyKChyZWdpc3RlcmVkKSA9PiByZWdpc3RlcmVkLmlkICE9PSBpZCk7XG4gICAgICAgIGlmICh3YWl0aW5nT24gPT09IGlkKSB7XG4gICAgICAgICAgICB3YWl0aW5nT24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBydW5PcHRpbWl6ZXJXaGVuSWRsZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlbGF5RGVwc09wdGltaXplclVudGlsKGlkLCBkb25lKSB7XG4gICAgICAgIGlmICghZGVwc09wdGltaXplci5pc09wdGltaXplZERlcEZpbGUoaWQpICYmICFzZWVuSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHNlZW5JZHMuYWRkKGlkKTtcbiAgICAgICAgICAgIHJlZ2lzdGVyZWRJZHMucHVzaCh7IGlkLCBkb25lIH0pO1xuICAgICAgICAgICAgcnVuT3B0aW1pemVyV2hlbklkbGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBydW5PcHRpbWl6ZXJXaGVuSWRsZSgpIHtcbiAgICAgICAgaWYgKCF3YWl0aW5nT24pIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSByZWdpc3RlcmVkSWRzLnBvcCgpO1xuICAgICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgICAgICB3YWl0aW5nT24gPSBuZXh0LmlkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyTG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgd2FpdGluZ09uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCAmJiAhd29ya2Vyc1NvdXJjZXMuaGFzKG5leHQuaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuT3B0aW1pemVyV2hlbklkbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ3Jhd2xFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbmV4dFxuICAgICAgICAgICAgICAgICAgICAuZG9uZSgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChhZnRlckxvYWQsIHJlZ2lzdGVyZWRJZHMubGVuZ3RoID4gMCA/IDAgOiBydW5PcHRpbWl6ZXJJZklkbGVBZnRlck1zKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goYWZ0ZXJMb2FkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURldlNzckRlcHNPcHRpbWl6ZXIoY29uZmlnKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCBvcHRpbWl6ZVNlcnZlclNzckRlcHMoY29uZmlnKTtcbiAgICBjb25zdCBkZXBzT3B0aW1pemVyID0ge1xuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgaXNPcHRpbWl6ZWREZXBGaWxlOiAoaWQpID0+IGlzT3B0aW1pemVkRGVwRmlsZShpZCwgY29uZmlnKSxcbiAgICAgICAgaXNPcHRpbWl6ZWREZXBVcmw6IGNyZWF0ZUlzT3B0aW1pemVkRGVwVXJsKGNvbmZpZyksXG4gICAgICAgIGdldE9wdGltaXplZERlcElkOiAoZGVwSW5mbykgPT4gYCR7ZGVwSW5mby5maWxlfT92PSR7ZGVwSW5mby5icm93c2VySGFzaH1gLFxuICAgICAgICByZWdpc3Rlck1pc3NpbmdJbXBvcnQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVml0ZSBJbnRlcm5hbCBFcnJvcjogcmVnaXN0ZXJNaXNzaW5nSW1wb3J0IGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGV2IFNTUicpO1xuICAgICAgICB9LFxuICAgICAgICAvLyBub29wLCB0aGVyZSBpcyBubyBzY2FubmluZyBkdXJpbmcgZGV2IFNTUlxuICAgICAgICAvLyB0aGUgb3B0aW1pemVyIGJsb2NrcyB0aGUgc2VydmVyIHN0YXJ0XG4gICAgICAgIHJ1bjogKCkgPT4geyB9LFxuICAgICAgICByZWdpc3RlcldvcmtlcnNTb3VyY2U6IChpZCkgPT4geyB9LFxuICAgICAgICBkZWxheURlcHNPcHRpbWl6ZXJVbnRpbDogKGlkLCBkb25lKSA9PiB7IH0sXG4gICAgICAgIHJlc2V0UmVnaXN0ZXJlZElkczogKCkgPT4geyB9LFxuICAgICAgICBlbnN1cmVGaXJzdFJ1bjogKCkgPT4geyB9LFxuICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4geyB9LFxuICAgICAgICBvcHRpb25zOiBjb25maWcuc3NyLm9wdGltaXplRGVwcyxcbiAgICB9O1xuICAgIGRldlNzckRlcHNPcHRpbWl6ZXJNYXAuc2V0KGNvbmZpZywgZGVwc09wdGltaXplcik7XG59XG5mdW5jdGlvbiBmaW5kSW50ZXJvcE1pc21hdGNoZXMoZGlzY292ZXJlZCwgb3B0aW1pemVkKSB7XG4gICAgY29uc3QgbmVlZHNJbnRlcm9wTWlzbWF0Y2ggPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRlcCBpbiBkaXNjb3ZlcmVkKSB7XG4gICAgICAgIGNvbnN0IGRpc2NvdmVyZWREZXBJbmZvID0gZGlzY292ZXJlZFtkZXBdO1xuICAgICAgICBjb25zdCBkZXBJbmZvID0gb3B0aW1pemVkW2RlcF07XG4gICAgICAgIGlmIChkZXBJbmZvKSB7XG4gICAgICAgICAgICBpZiAoZGlzY292ZXJlZERlcEluZm8ubmVlZHNJbnRlcm9wICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBkZXBJbmZvLm5lZWRzSW50ZXJvcCAhPT0gZGlzY292ZXJlZERlcEluZm8ubmVlZHNJbnRlcm9wKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBvbmx5IGhhcHBlbnMgd2hlbiBhIGRpc2NvdmVyZWQgZGVwZW5kZW5jeSBoYXMgbWl4ZWQgRVNNIGFuZCBDSlMgc3ludGF4XG4gICAgICAgICAgICAgICAgLy8gYW5kIGl0IGhhc24ndCBiZWVuIG1hbnVhbGx5IGFkZGVkIHRvIG9wdGltaXplRGVwcy5uZWVkc0ludGVyb3BcbiAgICAgICAgICAgICAgICBuZWVkc0ludGVyb3BNaXNtYXRjaC5wdXNoKGRlcCk7XG4gICAgICAgICAgICAgICAgZGVidWdnZXJWaXRlRGVwcyhwaWNvY29sb3JzRXhwb3J0cy5jeWFuKGBcdTI3MjggbmVlZHNJbnRlcm9wIG1pc21hdGNoIGRldGVjdGVkIGZvciAke2RlcH1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5lZWRzSW50ZXJvcE1pc21hdGNoO1xufVxuXG5jb25zdCBkZWJ1Z2dlclZpdGVEZXBzID0gY3JlYXRlRGVidWdnZXIoJ3ZpdGU6ZGVwcycpO1xuY29uc3QgZGVidWckNyA9IGRlYnVnZ2VyVml0ZURlcHM7XG5jb25zdCBpc0RlYnVnRW5hYmxlZCA9IF9kZWJ1Zygndml0ZTpkZXBzJykuZW5hYmxlZDtcbmNvbnN0IGpzRXh0ZW5zaW9uUkUgPSAvXFwuanMkL2k7XG5jb25zdCBqc01hcEV4dGVuc2lvblJFID0gL1xcLmpzXFwubWFwJC9pO1xuLyoqXG4gKiBTY2FuIGFuZCBvcHRpbWl6ZSBkZXBlbmRlbmNpZXMgd2l0aGluIGEgcHJvamVjdC5cbiAqIFVzZWQgYnkgVml0ZSBDTEkgd2hlbiBydW5uaW5nIGB2aXRlIG9wdGltaXplYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gb3B0aW1pemVEZXBzKGNvbmZpZywgZm9yY2UgPSBjb25maWcub3B0aW1pemVEZXBzLmZvcmNlLCBhc0NvbW1hbmQgPSBmYWxzZSkge1xuICAgIGNvbnN0IGxvZyA9IGFzQ29tbWFuZCA/IGNvbmZpZy5sb2dnZXIuaW5mbyA6IGRlYnVnJDc7XG4gICAgY29uc3Qgc3NyID0gY29uZmlnLmNvbW1hbmQgPT09ICdidWlsZCcgJiYgISFjb25maWcuYnVpbGQuc3NyO1xuICAgIGNvbnN0IGNhY2hlZE1ldGFkYXRhID0gbG9hZENhY2hlZERlcE9wdGltaXphdGlvbk1ldGFkYXRhKGNvbmZpZywgc3NyLCBmb3JjZSwgYXNDb21tYW5kKTtcbiAgICBpZiAoY2FjaGVkTWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZE1ldGFkYXRhO1xuICAgIH1cbiAgICBjb25zdCBkZXBzID0gYXdhaXQgZGlzY292ZXJQcm9qZWN0RGVwZW5kZW5jaWVzKGNvbmZpZykucmVzdWx0O1xuICAgIGNvbnN0IGRlcHNTdHJpbmcgPSBkZXBzTG9nU3RyaW5nKE9iamVjdC5rZXlzKGRlcHMpKTtcbiAgICBsb2cocGljb2NvbG9yc0V4cG9ydHMuZ3JlZW4oYE9wdGltaXppbmcgZGVwZW5kZW5jaWVzOlxcbiAgJHtkZXBzU3RyaW5nfWApKTtcbiAgICBhd2FpdCBhZGRNYW51YWxseUluY2x1ZGVkT3B0aW1pemVEZXBzKGRlcHMsIGNvbmZpZywgc3NyKTtcbiAgICBjb25zdCBkZXBzSW5mbyA9IHRvRGlzY292ZXJlZERlcGVuZGVuY2llcyhjb25maWcsIGRlcHMsIHNzcik7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuT3B0aW1pemVEZXBzKGNvbmZpZywgZGVwc0luZm8pLnJlc3VsdDtcbiAgICBhd2FpdCByZXN1bHQuY29tbWl0KCk7XG4gICAgcmV0dXJuIHJlc3VsdC5tZXRhZGF0YTtcbn1cbmFzeW5jIGZ1bmN0aW9uIG9wdGltaXplU2VydmVyU3NyRGVwcyhjb25maWcpIHtcbiAgICBjb25zdCBzc3IgPSB0cnVlO1xuICAgIGNvbnN0IGNhY2hlZE1ldGFkYXRhID0gbG9hZENhY2hlZERlcE9wdGltaXphdGlvbk1ldGFkYXRhKGNvbmZpZywgc3NyLCBjb25maWcub3B0aW1pemVEZXBzLmZvcmNlLCBmYWxzZSk7XG4gICAgaWYgKGNhY2hlZE1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRNZXRhZGF0YTtcbiAgICB9XG4gICAgbGV0IGFsc29JbmNsdWRlO1xuICAgIGxldCBub0V4dGVybmFsRmlsdGVyO1xuICAgIGNvbnN0IHsgZXhjbHVkZSB9ID0gZ2V0RGVwT3B0aW1pemF0aW9uQ29uZmlnKGNvbmZpZywgc3NyKTtcbiAgICBjb25zdCBub0V4dGVybmFsID0gY29uZmlnLnNzcj8ubm9FeHRlcm5hbDtcbiAgICBpZiAobm9FeHRlcm5hbCkge1xuICAgICAgICBhbHNvSW5jbHVkZSA9IGFycmFpZnkobm9FeHRlcm5hbCkuZmlsdGVyKChuZSkgPT4gdHlwZW9mIG5lID09PSAnc3RyaW5nJyk7XG4gICAgICAgIG5vRXh0ZXJuYWxGaWx0ZXIgPVxuICAgICAgICAgICAgbm9FeHRlcm5hbCA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgID8gKGRlcCkgPT4gdHJ1ZVxuICAgICAgICAgICAgICAgIDogY3JlYXRlRmlsdGVyJDEodW5kZWZpbmVkLCBleGNsdWRlLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBkZXBzID0ge307XG4gICAgYXdhaXQgYWRkTWFudWFsbHlJbmNsdWRlZE9wdGltaXplRGVwcyhkZXBzLCBjb25maWcsIHNzciwgYWxzb0luY2x1ZGUsIG5vRXh0ZXJuYWxGaWx0ZXIpO1xuICAgIGNvbnN0IGRlcHNJbmZvID0gdG9EaXNjb3ZlcmVkRGVwZW5kZW5jaWVzKGNvbmZpZywgZGVwcywgdHJ1ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuT3B0aW1pemVEZXBzKGNvbmZpZywgZGVwc0luZm8sIHRydWUpLnJlc3VsdDtcbiAgICBhd2FpdCByZXN1bHQuY29tbWl0KCk7XG4gICAgcmV0dXJuIHJlc3VsdC5tZXRhZGF0YTtcbn1cbmZ1bmN0aW9uIGluaXREZXBzT3B0aW1pemVyTWV0YWRhdGEoY29uZmlnLCBzc3IsIHRpbWVzdGFtcCkge1xuICAgIGNvbnN0IGhhc2ggPSBnZXREZXBIYXNoKGNvbmZpZywgc3NyKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBoYXNoLFxuICAgICAgICBicm93c2VySGFzaDogZ2V0T3B0aW1pemVkQnJvd3Nlckhhc2goaGFzaCwge30sIHRpbWVzdGFtcCksXG4gICAgICAgIG9wdGltaXplZDoge30sXG4gICAgICAgIGNodW5rczoge30sXG4gICAgICAgIGRpc2NvdmVyZWQ6IHt9LFxuICAgICAgICBkZXBJbmZvTGlzdDogW10sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGFkZE9wdGltaXplZERlcEluZm8obWV0YWRhdGEsIHR5cGUsIGRlcEluZm8pIHtcbiAgICBtZXRhZGF0YVt0eXBlXVtkZXBJbmZvLmlkXSA9IGRlcEluZm87XG4gICAgbWV0YWRhdGEuZGVwSW5mb0xpc3QucHVzaChkZXBJbmZvKTtcbiAgICByZXR1cm4gZGVwSW5mbztcbn1cbi8qKlxuICogQ3JlYXRlcyB0aGUgaW5pdGlhbCBkZXAgb3B0aW1pemF0aW9uIG1ldGFkYXRhLCBsb2FkaW5nIGl0IGZyb20gdGhlIGRlcHMgY2FjaGVcbiAqIGlmIGl0IGV4aXN0cyBhbmQgcHJlLWJ1bmRsaW5nIGlzbid0IGZvcmNlZFxuICovXG5mdW5jdGlvbiBsb2FkQ2FjaGVkRGVwT3B0aW1pemF0aW9uTWV0YWRhdGEoY29uZmlnLCBzc3IsIGZvcmNlID0gY29uZmlnLm9wdGltaXplRGVwcy5mb3JjZSwgYXNDb21tYW5kID0gZmFsc2UpIHtcbiAgICBjb25zdCBsb2cgPSBhc0NvbW1hbmQgPyBjb25maWcubG9nZ2VyLmluZm8gOiBkZWJ1ZyQ3O1xuICAgIC8vIEJlZm9yZSBWaXRlIDIuOSwgZGVwZW5kZW5jaWVzIHdlcmUgY2FjaGVkIGluIHRoZSByb290IG9mIHRoZSBjYWNoZURpclxuICAgIC8vIEZvciBjb21wYXQsIHdlIHJlbW92ZSB0aGUgY2FjaGUgaWYgd2UgZmluZCB0aGUgb2xkIHN0cnVjdHVyZVxuICAgIGlmIChmcyRsLmV4aXN0c1N5bmMocGF0aCRvLmpvaW4oY29uZmlnLmNhY2hlRGlyLCAnX21ldGFkYXRhLmpzb24nKSkpIHtcbiAgICAgICAgZW1wdHlEaXIoY29uZmlnLmNhY2hlRGlyKTtcbiAgICB9XG4gICAgY29uc3QgZGVwc0NhY2hlRGlyID0gZ2V0RGVwc0NhY2hlRGlyKGNvbmZpZywgc3NyKTtcbiAgICBpZiAoIWZvcmNlKSB7XG4gICAgICAgIGxldCBjYWNoZWRNZXRhZGF0YTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZE1ldGFkYXRhUGF0aCA9IHBhdGgkby5qb2luKGRlcHNDYWNoZURpciwgJ19tZXRhZGF0YS5qc29uJyk7XG4gICAgICAgICAgICBjYWNoZWRNZXRhZGF0YSA9IHBhcnNlRGVwc09wdGltaXplck1ldGFkYXRhKGZzJGwucmVhZEZpbGVTeW5jKGNhY2hlZE1ldGFkYXRhUGF0aCwgJ3V0Zi04JyksIGRlcHNDYWNoZURpcik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAvLyBoYXNoIGlzIGNvbnNpc3RlbnQsIG5vIG5lZWQgdG8gcmUtYnVuZGxlXG4gICAgICAgIGlmIChjYWNoZWRNZXRhZGF0YSAmJiBjYWNoZWRNZXRhZGF0YS5oYXNoID09PSBnZXREZXBIYXNoKGNvbmZpZywgc3NyKSkge1xuICAgICAgICAgICAgbG9nKCdIYXNoIGlzIGNvbnNpc3RlbnQuIFNraXBwaW5nLiBVc2UgLS1mb3JjZSB0byBvdmVycmlkZS4nKTtcbiAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gY29tbWl0IG9yIGNhbmNlbCBhcyB3ZSBhcmUgdXNpbmcgdGhlIGNhY2hlLCB3ZSBvbmx5XG4gICAgICAgICAgICAvLyBuZWVkIHRvIHJlc29sdmUgdGhlIHByb2Nlc3NpbmcgcHJvbWlzZSBzbyByZXF1ZXN0cyBjYW4gbW92ZSBvblxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZE1ldGFkYXRhO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25maWcubG9nZ2VyLmluZm8oJ0ZvcmNlZCByZS1vcHRpbWl6YXRpb24gb2YgZGVwZW5kZW5jaWVzJyk7XG4gICAgfVxuICAgIC8vIFN0YXJ0IHdpdGggYSBmcmVzaCBjYWNoZVxuICAgIGZzJGwucm1TeW5jKGRlcHNDYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xufVxuLyoqXG4gKiBJbml0aWFsIG9wdGltaXplRGVwcyBhdCBzZXJ2ZXIgc3RhcnQuIFBlcmZvcm0gYSBmYXN0IHNjYW4gdXNpbmcgZXNidWlsZCB0b1xuICogZmluZCBkZXBzIHRvIHByZS1idW5kbGUgYW5kIGluY2x1ZGUgdXNlciBoYXJkLWNvZGVkIGRlcGVuZGVuY2llc1xuICovXG5mdW5jdGlvbiBkaXNjb3ZlclByb2plY3REZXBlbmRlbmNpZXMoY29uZmlnKSB7XG4gICAgY29uc3QgeyBjYW5jZWwsIHJlc3VsdCB9ID0gc2NhbkltcG9ydHMoY29uZmlnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjYW5jZWwsXG4gICAgICAgIHJlc3VsdDogcmVzdWx0LnRoZW4oKHsgZGVwcywgbWlzc2luZyB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtaXNzaW5nSWRzID0gT2JqZWN0LmtleXMobWlzc2luZyk7XG4gICAgICAgICAgICBpZiAobWlzc2luZ0lkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzIGFyZSBpbXBvcnRlZCBidXQgY291bGQgbm90IGJlIHJlc29sdmVkOlxcblxcbiAgJHttaXNzaW5nSWRzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGlkKSA9PiBgJHtwaWNvY29sb3JzRXhwb3J0cy5jeWFuKGlkKX0gJHtwaWNvY29sb3JzRXhwb3J0cy53aGl0ZShwaWNvY29sb3JzRXhwb3J0cy5kaW0oYChpbXBvcnRlZCBieSAke21pc3NpbmdbaWRdfSlgKSl9YClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oYFxcbiAgYCl9XFxuXFxuQXJlIHRoZXkgaW5zdGFsbGVkP2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlcHM7XG4gICAgICAgIH0pLFxuICAgIH07XG59XG5mdW5jdGlvbiB0b0Rpc2NvdmVyZWREZXBlbmRlbmNpZXMoY29uZmlnLCBkZXBzLCBzc3IsIHRpbWVzdGFtcCkge1xuICAgIGNvbnN0IGJyb3dzZXJIYXNoID0gZ2V0T3B0aW1pemVkQnJvd3Nlckhhc2goZ2V0RGVwSGFzaChjb25maWcsIHNzciksIGRlcHMsIHRpbWVzdGFtcCk7XG4gICAgY29uc3QgZGlzY292ZXJlZCA9IHt9O1xuICAgIGZvciAoY29uc3QgaWQgaW4gZGVwcykge1xuICAgICAgICBjb25zdCBzcmMgPSBkZXBzW2lkXTtcbiAgICAgICAgZGlzY292ZXJlZFtpZF0gPSB7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGZpbGU6IGdldE9wdGltaXplZERlcFBhdGgoaWQsIGNvbmZpZywgc3NyKSxcbiAgICAgICAgICAgIHNyYyxcbiAgICAgICAgICAgIGJyb3dzZXJIYXNoOiBicm93c2VySGFzaCxcbiAgICAgICAgICAgIGV4cG9ydHNEYXRhOiBleHRyYWN0RXhwb3J0c0RhdGEoc3JjLCBjb25maWcsIHNzciksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBkaXNjb3ZlcmVkO1xufVxuZnVuY3Rpb24gZGVwc0xvZ1N0cmluZyhxdWFsaWZpZWRJZHMpIHtcbiAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIHBpY29jb2xvcnNFeHBvcnRzLnllbGxvdyhxdWFsaWZpZWRJZHMuam9pbihgLCBgKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB0b3RhbCA9IHF1YWxpZmllZElkcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG1heExpc3RlZCA9IDU7XG4gICAgICAgIGNvbnN0IGxpc3RlZCA9IE1hdGgubWluKHRvdGFsLCBtYXhMaXN0ZWQpO1xuICAgICAgICBjb25zdCBleHRyYSA9IE1hdGgubWF4KDAsIHRvdGFsIC0gbWF4TGlzdGVkKTtcbiAgICAgICAgcmV0dXJuIHBpY29jb2xvcnNFeHBvcnRzLnllbGxvdyhxdWFsaWZpZWRJZHMuc2xpY2UoMCwgbGlzdGVkKS5qb2luKGAsIGApICtcbiAgICAgICAgICAgIChleHRyYSA+IDAgPyBgLCAuLi5hbmQgJHtleHRyYX0gbW9yZWAgOiBgYCkpO1xuICAgIH1cbn1cbi8qKlxuICogSW50ZXJuYWxseSwgVml0ZSB1c2VzIHRoaXMgZnVuY3Rpb24gdG8gcHJlcGFyZSBhIG9wdGltaXplRGVwcyBydW4uIFdoZW4gVml0ZSBzdGFydHMsIHdlIGNhbiBnZXRcbiAqIHRoZSBtZXRhZGF0YSBhbmQgc3RhcnQgdGhlIHNlcnZlciB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBvcHRpbWl6ZURlcHMgcHJvY2Vzc2luZyB0byBiZSBjb21wbGV0ZWRcbiAqL1xuZnVuY3Rpb24gcnVuT3B0aW1pemVEZXBzKHJlc29sdmVkQ29uZmlnLCBkZXBzSW5mbywgc3NyID0gcmVzb2x2ZWRDb25maWcuY29tbWFuZCA9PT0gJ2J1aWxkJyAmJlxuICAgICEhcmVzb2x2ZWRDb25maWcuYnVpbGQuc3NyKSB7XG4gICAgY29uc3Qgb3B0aW1pemVyQ29udGV4dCA9IHsgY2FuY2VsbGVkOiBmYWxzZSB9O1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgLi4ucmVzb2x2ZWRDb25maWcsXG4gICAgICAgIGNvbW1hbmQ6ICdidWlsZCcsXG4gICAgfTtcbiAgICBjb25zdCBkZXBzQ2FjaGVEaXIgPSBnZXREZXBzQ2FjaGVEaXIocmVzb2x2ZWRDb25maWcsIHNzcik7XG4gICAgY29uc3QgcHJvY2Vzc2luZ0NhY2hlRGlyID0gZ2V0UHJvY2Vzc2luZ0RlcHNDYWNoZURpcihyZXNvbHZlZENvbmZpZywgc3NyKTtcbiAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhbCBkaXJlY3Rvcnkgc28gd2UgZG9uJ3QgbmVlZCB0byBkZWxldGUgb3B0aW1pemVkIGRlcHNcbiAgICAvLyB1bnRpbCB0aGV5IGhhdmUgYmVlbiBwcm9jZXNzZWQuIFRoaXMgYWxzbyBhdm9pZHMgbGVhdmluZyB0aGUgZGVwcyBjYWNoZVxuICAgIC8vIGRpcmVjdG9yeSBpbiBhIGNvcnJ1cHRlZCBzdGF0ZSBpZiB0aGVyZSBpcyBhbiBlcnJvclxuICAgIGlmIChmcyRsLmV4aXN0c1N5bmMocHJvY2Vzc2luZ0NhY2hlRGlyKSkge1xuICAgICAgICBlbXB0eURpcihwcm9jZXNzaW5nQ2FjaGVEaXIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZnMkbC5ta2RpclN5bmMocHJvY2Vzc2luZ0NhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLy8gYSBoaW50IGZvciBOb2RlLmpzXG4gICAgLy8gYWxsIGZpbGVzIGluIHRoZSBjYWNoZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIHJlY29nbml6ZWQgYXMgRVMgbW9kdWxlc1xuICAgIHdyaXRlRmlsZShwYXRoJG8ucmVzb2x2ZShwcm9jZXNzaW5nQ2FjaGVEaXIsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnbW9kdWxlJyB9KSk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBpbml0RGVwc09wdGltaXplck1ldGFkYXRhKGNvbmZpZywgc3NyKTtcbiAgICBtZXRhZGF0YS5icm93c2VySGFzaCA9IGdldE9wdGltaXplZEJyb3dzZXJIYXNoKG1ldGFkYXRhLmhhc2gsIGRlcHNGcm9tT3B0aW1pemVkRGVwSW5mbyhkZXBzSW5mbykpO1xuICAgIC8vIFdlIHByZWJ1bmRsZSBkZXBlbmRlbmNpZXMgd2l0aCBlc2J1aWxkIGFuZCBjYWNoZSB0aGVtLCBidXQgdGhlcmUgaXMgbm8gbmVlZFxuICAgIC8vIHRvIHdhaXQgaGVyZS4gQ29kZSB0aGF0IG5lZWRzIHRvIGFjY2VzcyB0aGUgY2FjaGVkIGRlcHMgbmVlZHMgdG8gYXdhaXRcbiAgICAvLyB0aGUgb3B0aW1pemVkRGVwSW5mby5wcm9jZXNzaW5nIHByb21pc2UgZm9yIGVhY2ggZGVwXG4gICAgY29uc3QgcXVhbGlmaWVkSWRzID0gT2JqZWN0LmtleXMoZGVwc0luZm8pO1xuICAgIGxldCBjbGVhbmVkID0gZmFsc2U7XG4gICAgY29uc3QgY2xlYW5VcCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFjbGVhbmVkKSB7XG4gICAgICAgICAgICBjbGVhbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGZzJGwucm1TeW5jKHByb2Nlc3NpbmdDYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBjcmVhdGVQcm9jZXNzaW5nUmVzdWx0ID0gKCkgPT4gKHtcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGFzeW5jIGNvbW1pdCgpIHtcbiAgICAgICAgICAgIGlmIChjbGVhbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWaXRlIEludGVybmFsIEVycm9yOiBDYW4ndCBjb21taXQgb3B0aW1pemVEZXBzIHByb2Nlc3NpbmcgcmVzdWx0LCBpdCBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdyaXRlIG1ldGFkYXRhIGZpbGUsIGRlbGV0ZSBgZGVwc2AgZm9sZGVyIGFuZCByZW5hbWUgdGhlIGBwcm9jZXNzaW5nYCBmb2xkZXIgdG8gYGRlcHNgXG4gICAgICAgICAgICAvLyBQcm9jZXNzaW5nIGlzIGRvbmUsIHdlIGNhbiBub3cgcmVwbGFjZSB0aGUgZGVwc0NhY2hlRGlyIHdpdGggcHJvY2Vzc2luZ0NhY2hlRGlyXG4gICAgICAgICAgICAvLyBSZXdpcmUgdGhlIGZpbGUgcGF0aHMgZnJvbSB0aGUgdGVtcG9yYWwgcHJvY2Vzc2luZyBkaXIgdG8gdGhlIGZpbmFsIGRlcHMgY2FjaGUgZGlyXG4gICAgICAgICAgICBhd2FpdCByZW1vdmVEaXIoZGVwc0NhY2hlRGlyKTtcbiAgICAgICAgICAgIGF3YWl0IHJlbmFtZURpcihwcm9jZXNzaW5nQ2FjaGVEaXIsIGRlcHNDYWNoZURpcik7XG4gICAgICAgIH0sXG4gICAgICAgIGNhbmNlbDogY2xlYW5VcCxcbiAgICB9KTtcbiAgICBpZiAoIXF1YWxpZmllZElkcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhbmNlbDogYXN5bmMgKCkgPT4gY2xlYW5VcCgpLFxuICAgICAgICAgICAgcmVzdWx0OiBQcm9taXNlLnJlc29sdmUoY3JlYXRlUHJvY2Vzc2luZ1Jlc3VsdCgpKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCBwcmVwYXJlZFJ1biA9IHByZXBhcmVFc2J1aWxkT3B0aW1pemVyUnVuKHJlc29sdmVkQ29uZmlnLCBkZXBzSW5mbywgc3NyLCBwcm9jZXNzaW5nQ2FjaGVEaXIsIG9wdGltaXplckNvbnRleHQpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHByZXBhcmVkUnVuLnRoZW4oKHsgY29udGV4dCwgaWRUb0V4cG9ydHMgfSkgPT4ge1xuICAgICAgICBmdW5jdGlvbiBkaXNwb3NlQ29udGV4dCgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0Py5kaXNwb3NlKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZGlzcG9zZSBlc2J1aWxkIGNvbnRleHQnLCB7IGVycm9yOiBlIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb250ZXh0IHx8IG9wdGltaXplckNvbnRleHQuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICBkaXNwb3NlQ29udGV4dCgpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2Nlc3NpbmdSZXN1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dFxuICAgICAgICAgICAgLnJlYnVpbGQoKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHJlc3VsdC5tZXRhZmlsZTtcbiAgICAgICAgICAgIC8vIHRoZSBwYXRocyBpbiBgbWV0YS5vdXRwdXRzYCBhcmUgcmVsYXRpdmUgdG8gYHByb2Nlc3MuY3dkKClgXG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzaW5nQ2FjaGVEaXJPdXRwdXRQYXRoID0gcGF0aCRvLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHByb2Nlc3NpbmdDYWNoZURpcik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGRlcHNJbmZvKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gZXNidWlsZE91dHB1dEZyb21JZChtZXRhLm91dHB1dHMsIGlkLCBwcm9jZXNzaW5nQ2FjaGVEaXIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXhwb3J0c0RhdGEsIC4uLmluZm8gfSA9IGRlcHNJbmZvW2lkXTtcbiAgICAgICAgICAgICAgICBhZGRPcHRpbWl6ZWREZXBJbmZvKG1ldGFkYXRhLCAnb3B0aW1pemVkJywge1xuICAgICAgICAgICAgICAgICAgICAuLi5pbmZvLFxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gaGFzaCB0aGUgb3V0cHV0LmltcG9ydHMgaW4gdG8gY2hlY2sgZm9yIHN0YWJpbGl0eSwgYnV0IGFkZGluZyB0aGUgaGFzaFxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZmlsZSBwYXRoIGdpdmVzIHVzIGEgdW5pcXVlIGhhc2ggdGhhdCBtYXkgYmUgdXNlZnVsIGZvciBvdGhlciB0aGluZ3MgaW4gdGhlIGZ1dHVyZVxuICAgICAgICAgICAgICAgICAgICBmaWxlSGFzaDogZ2V0SGFzaChtZXRhZGF0YS5oYXNoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHNJbmZvW2lkXS5maWxlICtcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG91dHB1dC5pbXBvcnRzKSksXG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXJIYXNoOiBtZXRhZGF0YS5icm93c2VySGFzaCxcbiAgICAgICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYnVuZGxpbmcgd2UgaGF2ZSBtb3JlIGluZm9ybWF0aW9uIGFuZCBjYW4gd2FybiB0aGUgdXNlciBhYm91dCBsZWdhY3kgcGFja2FnZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCByZXF1aXJlIG1hbnVhbCBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIG5lZWRzSW50ZXJvcDogbmVlZHNJbnRlcm9wKGNvbmZpZywgc3NyLCBpZCwgaWRUb0V4cG9ydHNbaWRdLCBvdXRwdXQpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBvIG9mIE9iamVjdC5rZXlzKG1ldGEub3V0cHV0cykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW8ubWF0Y2goanNNYXBFeHRlbnNpb25SRSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBwYXRoJG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZWxhdGl2ZShwcm9jZXNzaW5nQ2FjaGVEaXJPdXRwdXRQYXRoLCBvKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoanNFeHRlbnNpb25SRSwgJycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gZ2V0T3B0aW1pemVkRGVwUGF0aChpZCwgcmVzb2x2ZWRDb25maWcsIHNzcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmluZE9wdGltaXplZERlcEluZm9JblJlY29yZChtZXRhZGF0YS5vcHRpbWl6ZWQsIChkZXBJbmZvKSA9PiBkZXBJbmZvLmZpbGUgPT09IGZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRPcHRpbWl6ZWREZXBJbmZvKG1ldGFkYXRhLCAnY2h1bmtzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHNJbnRlcm9wOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VySGFzaDogbWV0YWRhdGEuYnJvd3Nlckhhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRhdGFQYXRoID0gcGF0aCRvLmpvaW4ocHJvY2Vzc2luZ0NhY2hlRGlyLCAnX21ldGFkYXRhLmpzb24nKTtcbiAgICAgICAgICAgIHdyaXRlRmlsZShkYXRhUGF0aCwgc3RyaW5naWZ5RGVwc09wdGltaXplck1ldGFkYXRhKG1ldGFkYXRhLCBkZXBzQ2FjaGVEaXIpKTtcbiAgICAgICAgICAgIGRlYnVnJDcoYGRlcHMgYnVuZGxlZCBpbiAkeyhwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KS50b0ZpeGVkKDIpfW1zYCk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUHJvY2Vzc2luZ1Jlc3VsdCgpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5lcnJvcnMgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdUaGUgYnVpbGQgd2FzIGNhbmNlbGVkJykpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2J1aWxkIGxvZ3MgYW4gZXJyb3Igd2hlbiBjYW5jZWxsaW5nLCBidXQgdGhpcyBpcyBleHBlY3RlZCBzb1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiBhbiBlbXB0eSByZXN1bHQgaW5zdGVhZFxuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcm9jZXNzaW5nUmVzdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRpc3Bvc2VDb250ZXh0KCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJlc3VsdC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIGNsZWFuVXAoKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgICAgICBvcHRpbWl6ZXJDb250ZXh0LmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB7IGNvbnRleHQgfSA9IGF3YWl0IHByZXBhcmVkUnVuO1xuICAgICAgICAgICAgYXdhaXQgY29udGV4dD8uY2FuY2VsKCk7XG4gICAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdCxcbiAgICB9O1xufVxuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUVzYnVpbGRPcHRpbWl6ZXJSdW4ocmVzb2x2ZWRDb25maWcsIGRlcHNJbmZvLCBzc3IsIHByb2Nlc3NpbmdDYWNoZURpciwgb3B0aW1pemVyQ29udGV4dCkge1xuICAgIGNvbnN0IGlzQnVpbGQgPSByZXNvbHZlZENvbmZpZy5jb21tYW5kID09PSAnYnVpbGQnO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgLi4ucmVzb2x2ZWRDb25maWcsXG4gICAgICAgIGNvbW1hbmQ6ICdidWlsZCcsXG4gICAgfTtcbiAgICAvLyBlc2J1aWxkIGdlbmVyYXRlcyBuZXN0ZWQgZGlyZWN0b3J5IG91dHB1dCB3aXRoIGxvd2VzdCBjb21tb24gYW5jZXN0b3IgYmFzZVxuICAgIC8vIHRoaXMgaXMgdW5wcmVkaWN0YWJsZSBhbmQgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGFuYWx5emUgZW50cnkgLyBvdXRwdXRcbiAgICAvLyBtYXBwaW5nLiBTbyB3aGF0IHdlIGRvIGhlcmUgaXM6XG4gICAgLy8gMS4gZmxhdHRlbiBhbGwgaWRzIHRvIGVsaW1pbmF0ZSBzbGFzaFxuICAgIC8vIDIuIGluIHRoZSBwbHVnaW4sIHJlYWQgdGhlIGVudHJ5IG91cnNlbHZlcyBhcyB2aXJ0dWFsIGZpbGVzIHRvIHJldGFpbiB0aGVcbiAgICAvLyAgICBwYXRoLlxuICAgIGNvbnN0IGZsYXRJZERlcHMgPSB7fTtcbiAgICBjb25zdCBpZFRvRXhwb3J0cyA9IHt9O1xuICAgIGNvbnN0IG9wdGltaXplRGVwcyA9IGdldERlcE9wdGltaXphdGlvbkNvbmZpZyhjb25maWcsIHNzcik7XG4gICAgY29uc3QgeyBwbHVnaW5zOiBwbHVnaW5zRnJvbUNvbmZpZyA9IFtdLCAuLi5lc2J1aWxkT3B0aW9ucyB9ID0gb3B0aW1pemVEZXBzPy5lc2J1aWxkT3B0aW9ucyA/PyB7fTtcbiAgICBmb3IgKGNvbnN0IGlkIGluIGRlcHNJbmZvKSB7XG4gICAgICAgIGNvbnN0IHNyYyA9IGRlcHNJbmZvW2lkXS5zcmM7XG4gICAgICAgIGNvbnN0IGV4cG9ydHNEYXRhID0gYXdhaXQgKGRlcHNJbmZvW2lkXS5leHBvcnRzRGF0YSA/P1xuICAgICAgICAgICAgZXh0cmFjdEV4cG9ydHNEYXRhKHNyYywgY29uZmlnLCBzc3IpKTtcbiAgICAgICAgaWYgKGV4cG9ydHNEYXRhLmpzeExvYWRlcikge1xuICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgb3B0aW1pemF0aW9uIHdvbid0IGZhaWwgYnkgZGVmYXVsdGluZyAnLmpzJyB0byB0aGUgSlNYIHBhcnNlci5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdXNlZnVsIGZvciBwYWNrYWdlcyBzdWNoIGFzIEdhdHNieS5cbiAgICAgICAgICAgIGVzYnVpbGRPcHRpb25zLmxvYWRlciA9IHtcbiAgICAgICAgICAgICAgICAnLmpzJzogJ2pzeCcsXG4gICAgICAgICAgICAgICAgLi4uZXNidWlsZE9wdGlvbnMubG9hZGVyLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmbGF0SWQgPSBmbGF0dGVuSWQoaWQpO1xuICAgICAgICBmbGF0SWREZXBzW2ZsYXRJZF0gPSBzcmM7XG4gICAgICAgIGlkVG9FeHBvcnRzW2lkXSA9IGV4cG9ydHNEYXRhO1xuICAgIH1cbiAgICBpZiAob3B0aW1pemVyQ29udGV4dC5jYW5jZWxsZWQpXG4gICAgICAgIHJldHVybiB7IGNvbnRleHQ6IHVuZGVmaW5lZCwgaWRUb0V4cG9ydHMgfTtcbiAgICAvLyBlc2J1aWxkIGF1dG9tYXRpY2FsbHkgcmVwbGFjZXMgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgZm9yIHBsYXRmb3JtICdicm93c2VyJ1xuICAgIC8vIEluIGxpYiBtb2RlLCB3ZSBuZWVkIHRvIGtlZXAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgdW50b3VjaGVkLCBzbyB0byBhdCBidWlsZFxuICAgIC8vIHRpbWUgd2UgcmVwbGFjZSBpdCBieSBfX3ZpdGVfcHJvY2Vzc19lbnZfTk9ERV9FTlYuIFRoaXMgcGxhY2Vob2xkZXIgd2lsbCBiZVxuICAgIC8vIGxhdGVyIHJlcGxhY2VkIGJ5IHRoZSBkZWZpbmUgcGx1Z2luXG4gICAgY29uc3QgZGVmaW5lID0ge1xuICAgICAgICAncHJvY2Vzcy5lbnYuTk9ERV9FTlYnOiBpc0J1aWxkXG4gICAgICAgICAgICA/ICdfX3ZpdGVfcHJvY2Vzc19lbnZfTk9ERV9FTlYnXG4gICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8IGNvbmZpZy5tb2RlKSxcbiAgICB9O1xuICAgIGNvbnN0IHBsYXRmb3JtID0gc3NyICYmIGNvbmZpZy5zc3I/LnRhcmdldCAhPT0gJ3dlYndvcmtlcicgPyAnbm9kZScgOiAnYnJvd3Nlcic7XG4gICAgY29uc3QgZXh0ZXJuYWwgPSBbLi4uKG9wdGltaXplRGVwcz8uZXhjbHVkZSA/PyBbXSldO1xuICAgIGlmIChpc0J1aWxkKSB7XG4gICAgICAgIGxldCByb2xsdXBPcHRpb25zRXh0ZXJuYWwgPSBjb25maWc/LmJ1aWxkPy5yb2xsdXBPcHRpb25zPy5leHRlcm5hbDtcbiAgICAgICAgaWYgKHJvbGx1cE9wdGlvbnNFeHRlcm5hbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb2xsdXBPcHRpb25zRXh0ZXJuYWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcm9sbHVwT3B0aW9uc0V4dGVybmFsID0gW3JvbGx1cE9wdGlvbnNFeHRlcm5hbF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPOiBkZWNpZGUgd2hldGhlciB0byBzdXBwb3J0IFJlZ0V4cCBhbmQgZnVuY3Rpb24gb3B0aW9uc1xuICAgICAgICAgICAgLy8gVGhleSdyZSBub3Qgc3VwcG9ydGVkIHlldCBiZWNhdXNlIGBvcHRpbWl6ZURlcHMuZXhjbHVkZWAgY3VycmVudGx5IG9ubHkgYWNjZXB0cyBzdHJpbmdzXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocm9sbHVwT3B0aW9uc0V4dGVybmFsKSB8fFxuICAgICAgICAgICAgICAgIHJvbGx1cE9wdGlvbnNFeHRlcm5hbC5zb21lKChleHQpID0+IHR5cGVvZiBleHQgIT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3ZpdGVdICdidWlsZC5yb2xsdXBPcHRpb25zLmV4dGVybmFsJyBjYW4gb25seSBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIG9yIGEgc3RyaW5nIHdoZW4gdXNpbmcgZXNidWlsZCBvcHRpbWl6YXRpb24gYXQgYnVpbGQgdGltZS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV4dGVybmFsLnB1c2goLi4ucm9sbHVwT3B0aW9uc0V4dGVybmFsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwbHVnaW5zID0gWy4uLnBsdWdpbnNGcm9tQ29uZmlnXTtcbiAgICBpZiAoZXh0ZXJuYWwubGVuZ3RoKSB7XG4gICAgICAgIHBsdWdpbnMucHVzaChlc2J1aWxkQ2pzRXh0ZXJuYWxQbHVnaW4oZXh0ZXJuYWwsIHBsYXRmb3JtKSk7XG4gICAgfVxuICAgIHBsdWdpbnMucHVzaChlc2J1aWxkRGVwUGx1Z2luKGZsYXRJZERlcHMsIGV4dGVybmFsLCBjb25maWcsIHNzcikpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBhd2FpdCBlc2J1aWxkLmNvbnRleHQoe1xuICAgICAgICBhYnNXb3JraW5nRGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICBlbnRyeVBvaW50czogT2JqZWN0LmtleXMoZmxhdElkRGVwcyksXG4gICAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIHBsYXRmb3JtICduZXV0cmFsJywgYXMgZXNidWlsZCBoYXMgY3VzdG9tIGhhbmRsaW5nXG4gICAgICAgIC8vIHdoZW4gdGhlIHBsYXRmb3JtIGlzICdub2RlJyBvciAnYnJvd3NlcicgdGhhdCBjYW4ndCBiZSBlbXVsYXRlZFxuICAgICAgICAvLyBieSB1c2luZyBtYWluRmllbGRzIGFuZCBjb25kaXRpb25zXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBkZWZpbmUsXG4gICAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXZhbncvZXNidWlsZC9pc3N1ZXMvMTkyMSNpc3N1ZWNvbW1lbnQtMTE1Mjk5MTY5NFxuICAgICAgICBiYW5uZXI6IHBsYXRmb3JtID09PSAnbm9kZSdcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGpzOiBgaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ21vZHVsZSc7Y29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtgLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhcmdldDogaXNCdWlsZCA/IGNvbmZpZy5idWlsZC50YXJnZXQgfHwgdW5kZWZpbmVkIDogRVNCVUlMRF9NT0RVTEVTX1RBUkdFVCxcbiAgICAgICAgZXh0ZXJuYWwsXG4gICAgICAgIGxvZ0xldmVsOiAnZXJyb3InLFxuICAgICAgICBzcGxpdHRpbmc6IHRydWUsXG4gICAgICAgIHNvdXJjZW1hcDogdHJ1ZSxcbiAgICAgICAgb3V0ZGlyOiBwcm9jZXNzaW5nQ2FjaGVEaXIsXG4gICAgICAgIGlnbm9yZUFubm90YXRpb25zOiAhaXNCdWlsZCxcbiAgICAgICAgbWV0YWZpbGU6IHRydWUsXG4gICAgICAgIHBsdWdpbnMsXG4gICAgICAgIGNoYXJzZXQ6ICd1dGY4JyxcbiAgICAgICAgLi4uZXNidWlsZE9wdGlvbnMsXG4gICAgICAgIHN1cHBvcnRlZDoge1xuICAgICAgICAgICAgJ2R5bmFtaWMtaW1wb3J0JzogdHJ1ZSxcbiAgICAgICAgICAgICdpbXBvcnQtbWV0YSc6IHRydWUsXG4gICAgICAgICAgICAuLi5lc2J1aWxkT3B0aW9ucy5zdXBwb3J0ZWQsXG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgY29udGV4dCwgaWRUb0V4cG9ydHMgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGZpbmRLbm93bkltcG9ydHMoY29uZmlnLCBzc3IpIHtcbiAgICBjb25zdCB7IGRlcHMgfSA9IGF3YWl0IHNjYW5JbXBvcnRzKGNvbmZpZykucmVzdWx0O1xuICAgIGF3YWl0IGFkZE1hbnVhbGx5SW5jbHVkZWRPcHRpbWl6ZURlcHMoZGVwcywgY29uZmlnLCBzc3IpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhkZXBzKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGFkZE1hbnVhbGx5SW5jbHVkZWRPcHRpbWl6ZURlcHMoZGVwcywgY29uZmlnLCBzc3IsIGV4dHJhID0gW10sIGZpbHRlcikge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBjb25maWc7XG4gICAgY29uc3Qgb3B0aW1pemVEZXBzID0gZ2V0RGVwT3B0aW1pemF0aW9uQ29uZmlnKGNvbmZpZywgc3NyKTtcbiAgICBjb25zdCBvcHRpbWl6ZURlcHNJbmNsdWRlID0gb3B0aW1pemVEZXBzPy5pbmNsdWRlID8/IFtdO1xuICAgIGlmIChvcHRpbWl6ZURlcHNJbmNsdWRlLmxlbmd0aCB8fCBleHRyYS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdW5hYmxlVG9PcHRpbWl6ZSA9IChpZCwgbXNnKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW1pemVEZXBzSW5jbHVkZS5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihgJHttc2d9OiAke3BpY29jb2xvcnNFeHBvcnRzLmN5YW4oaWQpfSwgcHJlc2VudCBpbiAnJHtzc3IgPyAnc3NyLicgOiAnJ31vcHRpbWl6ZURlcHMuaW5jbHVkZSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZSA9IGNyZWF0ZU9wdGltaXplRGVwc0luY2x1ZGVSZXNvbHZlcihjb25maWcsIHNzcik7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgWy4uLm9wdGltaXplRGVwc0luY2x1ZGUsIC4uLmV4dHJhXSkge1xuICAgICAgICAgICAgLy8gbm9ybWFsaXplICdmb28gICA+YmFyYCBhcyAnZm9vID4gYmFyJyB0byBwcmV2ZW50IHNhbWUgaWQgYmVpbmcgYWRkZWRcbiAgICAgICAgICAgIC8vIGFuZCBmb3IgcHJldHR5IHByaW50aW5nXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBub3JtYWxpemVJZChpZCk7XG4gICAgICAgICAgICBpZiAoIWRlcHNbbm9ybWFsaXplZElkXSAmJiBmaWx0ZXI/Lihub3JtYWxpemVkSWQpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgcmVzb2x2ZShpZCk7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc09wdGltaXphYmxlKGVudHJ5LCBvcHRpbWl6ZURlcHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVudHJ5LmVuZHNXaXRoKCc/X192aXRlX3NraXBfb3B0aW1pemF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzW25vcm1hbGl6ZWRJZF0gPSBlbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZVRvT3B0aW1pemUoaWQsICdDYW5ub3Qgb3B0aW1pemUgZGVwZW5kZW5jeScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1bmFibGVUb09wdGltaXplKGlkLCAnRmFpbGVkIHRvIHJlc29sdmUgZGVwZW5kZW5jeScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZU9wdGltaXplRGVwc0luY2x1ZGVSZXNvbHZlcihjb25maWcsIHNzcikge1xuICAgIGNvbnN0IHJlc29sdmUgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoe1xuICAgICAgICBhc1NyYzogZmFsc2UsXG4gICAgICAgIHNjYW46IHRydWUsXG4gICAgICAgIHNzck9wdGltaXplQ2hlY2s6IHNzcixcbiAgICAgICAgc3NyQ29uZmlnOiBjb25maWcuc3NyLFxuICAgIH0pO1xuICAgIHJldHVybiBhc3luYyAoaWQpID0+IHtcbiAgICAgICAgY29uc3QgbGFzdEFycm93SW5kZXggPSBpZC5sYXN0SW5kZXhPZignPicpO1xuICAgICAgICBpZiAobGFzdEFycm93SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZShpZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHNzcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc3BsaXQgbmVzdGVkIHNlbGVjdGVkIGlkIGJ5IGxhc3QgJz4nLCBmb3IgZXhhbXBsZTpcbiAgICAgICAgLy8gJ2ZvbyA+IGJhciA+IGJheicgPT4gJ2ZvbyA+IGJhcicgJiAnYmF6J1xuICAgICAgICBjb25zdCBuZXN0ZWRSb290ID0gaWQuc3Vic3RyaW5nKDAsIGxhc3RBcnJvd0luZGV4KS50cmltKCk7XG4gICAgICAgIGNvbnN0IG5lc3RlZFBhdGggPSBpZC5zdWJzdHJpbmcobGFzdEFycm93SW5kZXggKyAxKS50cmltKCk7XG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBuZXN0ZWRSZXNvbHZlRnJvbShuZXN0ZWRSb290LCBjb25maWcucm9vdCwgY29uZmlnLnJlc29sdmUucHJlc2VydmVTeW1saW5rcywgc3NyKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmUobmVzdGVkUGF0aCwgYmFzZWRpciwgdW5kZWZpbmVkLCBzc3IpO1xuICAgIH07XG59XG5mdW5jdGlvbiBuZXdEZXBPcHRpbWl6YXRpb25Qcm9jZXNzaW5nKCkge1xuICAgIGxldCByZXNvbHZlO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUpID0+IHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlO1xuICAgIH0pO1xuICAgIHJldHVybiB7IHByb21pc2UsIHJlc29sdmU6IHJlc29sdmUgfTtcbn1cbi8vIENvbnZlcnQgdG8geyBpZDogc3JjIH1cbmZ1bmN0aW9uIGRlcHNGcm9tT3B0aW1pemVkRGVwSW5mbyhkZXBzSW5mbykge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoZGVwc0luZm8pLm1hcCgoZCkgPT4gW2RbMF0sIGRbMV0uc3JjXSkpO1xufVxuZnVuY3Rpb24gZ2V0T3B0aW1pemVkRGVwUGF0aChpZCwgY29uZmlnLCBzc3IpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplUGF0aCQzKHBhdGgkby5yZXNvbHZlKGdldERlcHNDYWNoZURpcihjb25maWcsIHNzciksIGZsYXR0ZW5JZChpZCkgKyAnLmpzJykpO1xufVxuZnVuY3Rpb24gZ2V0RGVwc0NhY2hlU3VmZml4KGNvbmZpZywgc3NyKSB7XG4gICAgbGV0IHN1ZmZpeCA9ICcnO1xuICAgIGlmIChjb25maWcuY29tbWFuZCA9PT0gJ2J1aWxkJykge1xuICAgICAgICAvLyBEaWZmZXJlbnRpYXRlIGJ1aWxkIGNhY2hlcyBkZXBlbmRpbmcgb24gb3V0RGlyIHRvIGFsbG93IHBhcmFsbGVsIGJ1aWxkc1xuICAgICAgICBjb25zdCB7IG91dERpciB9ID0gY29uZmlnLmJ1aWxkO1xuICAgICAgICBjb25zdCBidWlsZElkID0gb3V0RGlyLmxlbmd0aCA+IDggfHwgb3V0RGlyLmluY2x1ZGVzKCcvJykgPyBnZXRIYXNoKG91dERpcikgOiBvdXREaXI7XG4gICAgICAgIHN1ZmZpeCArPSBgX2J1aWxkLSR7YnVpbGRJZH1gO1xuICAgIH1cbiAgICBpZiAoc3NyKSB7XG4gICAgICAgIHN1ZmZpeCArPSAnX3Nzcic7XG4gICAgfVxuICAgIHJldHVybiBzdWZmaXg7XG59XG5mdW5jdGlvbiBnZXREZXBzQ2FjaGVEaXIoY29uZmlnLCBzc3IpIHtcbiAgICByZXR1cm4gZ2V0RGVwc0NhY2hlRGlyUHJlZml4KGNvbmZpZykgKyBnZXREZXBzQ2FjaGVTdWZmaXgoY29uZmlnLCBzc3IpO1xufVxuZnVuY3Rpb24gZ2V0UHJvY2Vzc2luZ0RlcHNDYWNoZURpcihjb25maWcsIHNzcikge1xuICAgIHJldHVybiAoZ2V0RGVwc0NhY2hlRGlyUHJlZml4KGNvbmZpZykgK1xuICAgICAgICBnZXREZXBzQ2FjaGVTdWZmaXgoY29uZmlnLCBzc3IpICtcbiAgICAgICAgJ190ZW1wXycgK1xuICAgICAgICBnZXRIYXNoKERhdGUubm93KCkudG9TdHJpbmcoKSkpO1xufVxuZnVuY3Rpb24gZ2V0RGVwc0NhY2hlRGlyUHJlZml4KGNvbmZpZykge1xuICAgIHJldHVybiBub3JtYWxpemVQYXRoJDMocGF0aCRvLnJlc29sdmUoY29uZmlnLmNhY2hlRGlyLCAnZGVwcycpKTtcbn1cbmZ1bmN0aW9uIGlzT3B0aW1pemVkRGVwRmlsZShpZCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIGlkLnN0YXJ0c1dpdGgoZ2V0RGVwc0NhY2hlRGlyUHJlZml4KGNvbmZpZykpO1xufVxuZnVuY3Rpb24gY3JlYXRlSXNPcHRpbWl6ZWREZXBVcmwoY29uZmlnKSB7XG4gICAgY29uc3QgeyByb290IH0gPSBjb25maWc7XG4gICAgY29uc3QgZGVwc0NhY2hlRGlyID0gZ2V0RGVwc0NhY2hlRGlyUHJlZml4KGNvbmZpZyk7XG4gICAgLy8gZGV0ZXJtaW5lIHRoZSB1cmwgcHJlZml4IG9mIGZpbGVzIGluc2lkZSBjYWNoZSBkaXJlY3RvcnlcbiAgICBjb25zdCBkZXBzQ2FjaGVEaXJSZWxhdGl2ZSA9IG5vcm1hbGl6ZVBhdGgkMyhwYXRoJG8ucmVsYXRpdmUocm9vdCwgZGVwc0NhY2hlRGlyKSk7XG4gICAgY29uc3QgZGVwc0NhY2hlRGlyUHJlZml4ID0gZGVwc0NhY2hlRGlyUmVsYXRpdmUuc3RhcnRzV2l0aCgnLi4vJylcbiAgICAgICAgPyAvLyBpZiB0aGUgY2FjaGUgZGlyZWN0b3J5IGlzIG91dHNpZGUgcm9vdCwgdGhlIHVybCBwcmVmaXggd291bGQgYmUgc29tZXRoaW5nXG4gICAgICAgICAgICAvLyBsaWtlICcvQGZzL2Fic29sdXRlL3BhdGgvdG8vbm9kZV9tb2R1bGVzLy52aXRlJ1xuICAgICAgICAgICAgYC9AZnMvJHtub3JtYWxpemVQYXRoJDMoZGVwc0NhY2hlRGlyKS5yZXBsYWNlKC9eXFwvLywgJycpfWBcbiAgICAgICAgOiAvLyBpZiB0aGUgY2FjaGUgZGlyZWN0b3J5IGlzIGluc2lkZSByb290LCB0aGUgdXJsIHByZWZpeCB3b3VsZCBiZSBzb21ldGhpbmdcbiAgICAgICAgICAgIC8vIGxpa2UgJy9ub2RlX21vZHVsZXMvLnZpdGUnXG4gICAgICAgICAgICBgLyR7ZGVwc0NhY2hlRGlyUmVsYXRpdmV9YDtcbiAgICByZXR1cm4gZnVuY3Rpb24gaXNPcHRpbWl6ZWREZXBVcmwodXJsKSB7XG4gICAgICAgIHJldHVybiB1cmwuc3RhcnRzV2l0aChkZXBzQ2FjaGVEaXJQcmVmaXgpO1xuICAgIH07XG59XG5mdW5jdGlvbiBwYXJzZURlcHNPcHRpbWl6ZXJNZXRhZGF0YShqc29uTWV0YWRhdGEsIGRlcHNDYWNoZURpcikge1xuICAgIGNvbnN0IHsgaGFzaCwgYnJvd3Nlckhhc2gsIG9wdGltaXplZCwgY2h1bmtzIH0gPSBKU09OLnBhcnNlKGpzb25NZXRhZGF0YSwgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgLy8gUGF0aHMgY2FuIGJlIGFic29sdXRlIG9yIHJlbGF0aXZlIHRvIHRoZSBkZXBzIGNhY2hlIGRpciB3aGVyZVxuICAgICAgICAvLyB0aGUgX21ldGFkYXRhLmpzb24gaXMgbG9jYXRlZFxuICAgICAgICBpZiAoa2V5ID09PSAnZmlsZScgfHwga2V5ID09PSAnc3JjJykge1xuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgkMyhwYXRoJG8ucmVzb2x2ZShkZXBzQ2FjaGVEaXIsIHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICAgIGlmICghY2h1bmtzIHx8XG4gICAgICAgIE9iamVjdC52YWx1ZXMob3B0aW1pemVkKS5zb21lKChkZXBJbmZvKSA9PiAhZGVwSW5mby5maWxlSGFzaCkpIHtcbiAgICAgICAgLy8gb3V0ZGF0ZWQgX21ldGFkYXRhLmpzb24gdmVyc2lvbiwgaWdub3JlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICAgIGhhc2gsXG4gICAgICAgIGJyb3dzZXJIYXNoLFxuICAgICAgICBvcHRpbWl6ZWQ6IHt9LFxuICAgICAgICBkaXNjb3ZlcmVkOiB7fSxcbiAgICAgICAgY2h1bmtzOiB7fSxcbiAgICAgICAgZGVwSW5mb0xpc3Q6IFtdLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyhvcHRpbWl6ZWQpKSB7XG4gICAgICAgIGFkZE9wdGltaXplZERlcEluZm8obWV0YWRhdGEsICdvcHRpbWl6ZWQnLCB7XG4gICAgICAgICAgICAuLi5vcHRpbWl6ZWRbaWRdLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBicm93c2VySGFzaCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXMoY2h1bmtzKSkge1xuICAgICAgICBhZGRPcHRpbWl6ZWREZXBJbmZvKG1ldGFkYXRhLCAnY2h1bmtzJywge1xuICAgICAgICAgICAgLi4uY2h1bmtzW2lkXSxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgYnJvd3Nlckhhc2gsXG4gICAgICAgICAgICBuZWVkc0ludGVyb3A6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xufVxuLyoqXG4gKiBTdHJpbmdpZnkgbWV0YWRhdGEgZm9yIGRlcHMgY2FjaGUuIFJlbW92ZSBwcm9jZXNzaW5nIHByb21pc2VzXG4gKiBhbmQgaW5kaXZpZHVhbCBkZXAgaW5mbyBicm93c2VySGFzaC4gT25jZSB0aGUgY2FjaGUgaXMgcmVsb2FkXG4gKiB0aGUgbmV4dCB0aW1lIHRoZSBzZXJ2ZXIgc3RhcnQgd2UgbmVlZCB0byB1c2UgdGhlIGdsb2JhbFxuICogYnJvd3Nlckhhc2ggdG8gYWxsb3cgbG9uZyB0ZXJtIGNhY2hpbmdcbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5RGVwc09wdGltaXplck1ldGFkYXRhKG1ldGFkYXRhLCBkZXBzQ2FjaGVEaXIpIHtcbiAgICBjb25zdCB7IGhhc2gsIGJyb3dzZXJIYXNoLCBvcHRpbWl6ZWQsIGNodW5rcyB9ID0gbWV0YWRhdGE7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgaGFzaCxcbiAgICAgICAgYnJvd3Nlckhhc2gsXG4gICAgICAgIG9wdGltaXplZDogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC52YWx1ZXMob3B0aW1pemVkKS5tYXAoKHsgaWQsIHNyYywgZmlsZSwgZmlsZUhhc2gsIG5lZWRzSW50ZXJvcCB9KSA9PiBbXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzcmMsXG4gICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICBmaWxlSGFzaCxcbiAgICAgICAgICAgICAgICBuZWVkc0ludGVyb3AsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdKSksXG4gICAgICAgIGNodW5rczogT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC52YWx1ZXMoY2h1bmtzKS5tYXAoKHsgaWQsIGZpbGUgfSkgPT4gW2lkLCB7IGZpbGUgfV0pKSxcbiAgICB9LCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAvLyBQYXRocyBjYW4gYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8gdGhlIGRlcHMgY2FjaGUgZGlyIHdoZXJlXG4gICAgICAgIC8vIHRoZSBfbWV0YWRhdGEuanNvbiBpcyBsb2NhdGVkXG4gICAgICAgIGlmIChrZXkgPT09ICdmaWxlJyB8fCBrZXkgPT09ICdzcmMnKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplUGF0aCQzKHBhdGgkby5yZWxhdGl2ZShkZXBzQ2FjaGVEaXIsIHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sIDIpO1xufVxuZnVuY3Rpb24gZXNidWlsZE91dHB1dEZyb21JZChvdXRwdXRzLCBpZCwgY2FjaGVEaXJPdXRwdXRQYXRoKSB7XG4gICAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBmbGF0SWQgPSBmbGF0dGVuSWQoaWQpICsgJy5qcyc7XG4gICAgY29uc3Qgbm9ybWFsaXplZE91dHB1dFBhdGggPSBub3JtYWxpemVQYXRoJDMocGF0aCRvLnJlbGF0aXZlKGN3ZCwgcGF0aCRvLmpvaW4oY2FjaGVEaXJPdXRwdXRQYXRoLCBmbGF0SWQpKSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1tub3JtYWxpemVkT3V0cHV0UGF0aF07XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbiAgICAvLyBJZiB0aGUgcm9vdCBkaXIgd2FzIHN5bWxpbmtlZCwgZXNidWlsZCBjb3VsZCByZXR1cm4gb3V0cHV0IGtleXMgYXMgYC4uL2N3ZC9gXG4gICAgLy8gTm9ybWFsaXplIGtleXMgdG8gc3VwcG9ydCB0aGlzIGNhc2UgdG9vXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3V0cHV0cykpIHtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZVBhdGgkMyhwYXRoJG8ucmVsYXRpdmUoY3dkLCBrZXkpKSA9PT0gbm9ybWFsaXplZE91dHB1dFBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RFeHBvcnRzRGF0YShmaWxlUGF0aCwgY29uZmlnLCBzc3IpIHtcbiAgICBhd2FpdCBpbml0O1xuICAgIGNvbnN0IG9wdGltaXplRGVwcyA9IGdldERlcE9wdGltaXphdGlvbkNvbmZpZyhjb25maWcsIHNzcik7XG4gICAgY29uc3QgZXNidWlsZE9wdGlvbnMgPSBvcHRpbWl6ZURlcHM/LmVzYnVpbGRPcHRpb25zID8/IHt9O1xuICAgIGlmIChvcHRpbWl6ZURlcHMuZXh0ZW5zaW9ucz8uc29tZSgoZXh0KSA9PiBmaWxlUGF0aC5lbmRzV2l0aChleHQpKSkge1xuICAgICAgICAvLyBGb3IgY3VzdG9tIHN1cHBvcnRlZCBleHRlbnNpb25zLCBidWlsZCB0aGUgZW50cnkgZmlsZSB0byB0cmFuc2Zvcm0gaXQgaW50byBKUyxcbiAgICAgICAgLy8gYW5kIHRoZW4gcGFyc2Ugd2l0aCBlcy1tb2R1bGUtbGV4ZXIuIE5vdGUgdGhhdCB0aGUgYGJ1bmRsZWAgb3B0aW9uIGlzIG5vdCBgdHJ1ZWAsXG4gICAgICAgIC8vIHNvIG9ubHkgdGhlIGVudHJ5IGZpbGUgaXMgYmVpbmcgdHJhbnNmb3JtZWQuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkJDMoe1xuICAgICAgICAgICAgLi4uZXNidWlsZE9wdGlvbnMsXG4gICAgICAgICAgICBlbnRyeVBvaW50czogW2ZpbGVQYXRoXSxcbiAgICAgICAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgICAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBbaW1wb3J0cywgZXhwb3J0cywgZmFjYWRlXSA9IHBhcnNlJGUocmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGFzSW1wb3J0czogaW1wb3J0cy5sZW5ndGggPiAwLFxuICAgICAgICAgICAgZXhwb3J0czogZXhwb3J0cy5tYXAoKGUpID0+IGUubiksXG4gICAgICAgICAgICBmYWNhZGUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGxldCBwYXJzZVJlc3VsdDtcbiAgICBsZXQgdXNlZEpzeExvYWRlciA9IGZhbHNlO1xuICAgIGNvbnN0IGVudHJ5Q29udGVudCA9IGZzJGwucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICB0cnkge1xuICAgICAgICBwYXJzZVJlc3VsdCA9IHBhcnNlJGUoZW50cnlDb250ZW50KTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICBjb25zdCBsb2FkZXIgPSBlc2J1aWxkT3B0aW9ucy5sb2FkZXI/LltwYXRoJG8uZXh0bmFtZShmaWxlUGF0aCldIHx8ICdqc3gnO1xuICAgICAgICBkZWJ1ZyQ3KGBVbmFibGUgdG8gcGFyc2U6ICR7ZmlsZVBhdGh9LlxcbiBUcnlpbmcgYWdhaW4gd2l0aCBhICR7bG9hZGVyfSB0cmFuc2Zvcm0uYCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gYXdhaXQgdHJhbnNmb3JtV2l0aEVzYnVpbGQoZW50cnlDb250ZW50LCBmaWxlUGF0aCwge1xuICAgICAgICAgICAgbG9hZGVyLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gRW5zdXJlIHRoYXQgb3B0aW1pemF0aW9uIHdvbid0IGZhaWwgYnkgZGVmYXVsdGluZyAnLmpzJyB0byB0aGUgSlNYIHBhcnNlci5cbiAgICAgICAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHBhY2thZ2VzIHN1Y2ggYXMgR2F0c2J5LlxuICAgICAgICBlc2J1aWxkT3B0aW9ucy5sb2FkZXIgPSB7XG4gICAgICAgICAgICAnLmpzJzogJ2pzeCcsXG4gICAgICAgICAgICAuLi5lc2J1aWxkT3B0aW9ucy5sb2FkZXIsXG4gICAgICAgIH07XG4gICAgICAgIHBhcnNlUmVzdWx0ID0gcGFyc2UkZSh0cmFuc2Zvcm1lZC5jb2RlKTtcbiAgICAgICAgdXNlZEpzeExvYWRlciA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IFtpbXBvcnRzLCBleHBvcnRzLCBmYWNhZGVdID0gcGFyc2VSZXN1bHQ7XG4gICAgY29uc3QgZXhwb3J0c0RhdGEgPSB7XG4gICAgICAgIGhhc0ltcG9ydHM6IGltcG9ydHMubGVuZ3RoID4gMCxcbiAgICAgICAgZXhwb3J0czogZXhwb3J0cy5tYXAoKGUpID0+IGUubiksXG4gICAgICAgIGZhY2FkZSxcbiAgICAgICAgaGFzUmVFeHBvcnRzOiBpbXBvcnRzLnNvbWUoKHsgc3MsIHNlIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4cCA9IGVudHJ5Q29udGVudC5zbGljZShzcywgc2UpO1xuICAgICAgICAgICAgcmV0dXJuIC9leHBvcnRcXHMrXFwqXFxzK2Zyb20vLnRlc3QoZXhwKTtcbiAgICAgICAgfSksXG4gICAgICAgIGpzeExvYWRlcjogdXNlZEpzeExvYWRlcixcbiAgICB9O1xuICAgIHJldHVybiBleHBvcnRzRGF0YTtcbn1cbmZ1bmN0aW9uIG5lZWRzSW50ZXJvcChjb25maWcsIHNzciwgaWQsIGV4cG9ydHNEYXRhLCBvdXRwdXQpIHtcbiAgICBpZiAoZ2V0RGVwT3B0aW1pemF0aW9uQ29uZmlnKGNvbmZpZywgc3NyKT8ubmVlZHNJbnRlcm9wPy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHsgaGFzSW1wb3J0cywgZXhwb3J0cyB9ID0gZXhwb3J0c0RhdGE7XG4gICAgLy8gZW50cnkgaGFzIG5vIEVTTSBzeW50YXggLSBsaWtlbHkgQ0pTIG9yIFVNRFxuICAgIGlmICghZXhwb3J0cy5sZW5ndGggJiYgIWhhc0ltcG9ydHMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgLy8gaWYgYSBwZWVyIGRlcGVuZGVuY3kgdXNlZCByZXF1aXJlKCkgb24gYW4gRVNNIGRlcGVuZGVuY3ksIGVzYnVpbGQgdHVybnMgdGhlXG4gICAgICAgIC8vIEVTTSBkZXBlbmRlbmN5J3MgZW50cnkgY2h1bmsgaW50byBhIHNpbmdsZSBkZWZhdWx0IGV4cG9ydC4uLiBkZXRlY3RcbiAgICAgICAgLy8gc3VjaCBjYXNlcyBieSBjaGVja2luZyBleHBvcnRzIG1pc21hdGNoLCBhbmQgZm9yY2UgaW50ZXJvcC5cbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkRXhwb3J0cyA9IG91dHB1dC5leHBvcnRzO1xuICAgICAgICBpZiAoIWdlbmVyYXRlZEV4cG9ydHMgfHxcbiAgICAgICAgICAgIChpc1NpbmdsZURlZmF1bHRFeHBvcnQoZ2VuZXJhdGVkRXhwb3J0cykgJiZcbiAgICAgICAgICAgICAgICAhaXNTaW5nbGVEZWZhdWx0RXhwb3J0KGV4cG9ydHMpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNTaW5nbGVEZWZhdWx0RXhwb3J0KGV4cG9ydHMpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5sZW5ndGggPT09IDEgJiYgZXhwb3J0c1swXSA9PT0gJ2RlZmF1bHQnO1xufVxuY29uc3QgbG9ja2ZpbGVGb3JtYXRzID0gW1xuICAgIHsgbmFtZTogJ3BhY2thZ2UtbG9jay5qc29uJywgY2hlY2tQYXRjaGVzOiB0cnVlIH0sXG4gICAgeyBuYW1lOiAneWFybi5sb2NrJywgY2hlY2tQYXRjaGVzOiB0cnVlIH0sXG4gICAgeyBuYW1lOiAncG5wbS1sb2NrLnlhbWwnLCBjaGVja1BhdGNoZXM6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAnYnVuLmxvY2tiJywgY2hlY2tQYXRjaGVzOiB0cnVlIH0sXG5dO1xuZnVuY3Rpb24gZ2V0RGVwSGFzaChjb25maWcsIHNzcikge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IGxvb2t1cEZpbGUoY29uZmlnLnJvb3QsIGxvY2tmaWxlRm9ybWF0cy5tYXAoKGwpID0+IGwubmFtZSksIHsgcGF0aE9ubHk6IHRydWUgfSk7XG4gICAgbGV0IGNvbnRlbnQgPSBsb2NrZmlsZVBhdGggPyBmcyRsLnJlYWRGaWxlU3luYyhsb2NrZmlsZVBhdGgsICd1dGYtOCcpIDogJyc7XG4gICAgaWYgKGxvY2tmaWxlUGF0aCkge1xuICAgICAgICBjb25zdCBsb2NrZmlsZU5hbWUgPSBwYXRoJG8uYmFzZW5hbWUobG9ja2ZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgeyBjaGVja1BhdGNoZXMgfSA9IGxvY2tmaWxlRm9ybWF0cy5maW5kKChmKSA9PiBmLm5hbWUgPT09IGxvY2tmaWxlTmFtZSk7XG4gICAgICAgIGlmIChjaGVja1BhdGNoZXMpIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgb2YgaHR0cHM6Ly9naXRodWIuY29tL2RzMzAwL3BhdGNoLXBhY2thZ2VcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aCRvLmpvaW4ocGF0aCRvLmRpcm5hbWUobG9ja2ZpbGVQYXRoKSwgJ3BhdGNoZXMnKTtcbiAgICAgICAgICAgIGlmIChmcyRsLmV4aXN0c1N5bmMoZnVsbFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcyRsLnN0YXRTeW5jKGZ1bGxQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IHN0YXRzLm10aW1lTXMudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYWxzbyB0YWtlIGNvbmZpZyBpbnRvIGFjY291bnRcbiAgICAvLyBvbmx5IGEgc3Vic2V0IG9mIGNvbmZpZyBvcHRpb25zIHRoYXQgY2FuIGFmZmVjdCBkZXAgb3B0aW1pemF0aW9uXG4gICAgY29uc3Qgb3B0aW1pemVEZXBzID0gZ2V0RGVwT3B0aW1pemF0aW9uQ29uZmlnKGNvbmZpZywgc3NyKTtcbiAgICBjb250ZW50ICs9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbW9kZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgY29uZmlnLm1vZGUsXG4gICAgICAgIHJvb3Q6IGNvbmZpZy5yb290LFxuICAgICAgICByZXNvbHZlOiBjb25maWcucmVzb2x2ZSxcbiAgICAgICAgYnVpbGRUYXJnZXQ6IGNvbmZpZy5idWlsZC50YXJnZXQsXG4gICAgICAgIGFzc2V0c0luY2x1ZGU6IGNvbmZpZy5hc3NldHNJbmNsdWRlLFxuICAgICAgICBwbHVnaW5zOiBjb25maWcucGx1Z2lucy5tYXAoKHApID0+IHAubmFtZSksXG4gICAgICAgIG9wdGltaXplRGVwczoge1xuICAgICAgICAgICAgaW5jbHVkZTogb3B0aW1pemVEZXBzPy5pbmNsdWRlLFxuICAgICAgICAgICAgZXhjbHVkZTogb3B0aW1pemVEZXBzPy5leGNsdWRlLFxuICAgICAgICAgICAgZXNidWlsZE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpbWl6ZURlcHM/LmVzYnVpbGRPcHRpb25zLFxuICAgICAgICAgICAgICAgIHBsdWdpbnM6IG9wdGltaXplRGVwcz8uZXNidWlsZE9wdGlvbnM/LnBsdWdpbnM/Lm1hcCgocCkgPT4gcC5uYW1lKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSwgKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgfHwgdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gZ2V0SGFzaChjb250ZW50KTtcbn1cbmZ1bmN0aW9uIGdldE9wdGltaXplZEJyb3dzZXJIYXNoKGhhc2gsIGRlcHMsIHRpbWVzdGFtcCA9ICcnKSB7XG4gICAgcmV0dXJuIGdldEhhc2goaGFzaCArIEpTT04uc3RyaW5naWZ5KGRlcHMpICsgdGltZXN0YW1wKTtcbn1cbmZ1bmN0aW9uIG9wdGltaXplZERlcEluZm9Gcm9tSWQobWV0YWRhdGEsIGlkKSB7XG4gICAgcmV0dXJuIChtZXRhZGF0YS5vcHRpbWl6ZWRbaWRdIHx8IG1ldGFkYXRhLmRpc2NvdmVyZWRbaWRdIHx8IG1ldGFkYXRhLmNodW5rc1tpZF0pO1xufVxuZnVuY3Rpb24gb3B0aW1pemVkRGVwSW5mb0Zyb21GaWxlKG1ldGFkYXRhLCBmaWxlKSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhLmRlcEluZm9MaXN0LmZpbmQoKGRlcEluZm8pID0+IGRlcEluZm8uZmlsZSA9PT0gZmlsZSk7XG59XG5mdW5jdGlvbiBmaW5kT3B0aW1pemVkRGVwSW5mb0luUmVjb3JkKGRlcGVuZGVuY2llc0luZm8sIGNhbGxiYWNrRm4pIHtcbiAgICBmb3IgKGNvbnN0IG8gb2YgT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzSW5mbykpIHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGRlcGVuZGVuY2llc0luZm9bb107XG4gICAgICAgIGlmIChjYWxsYmFja0ZuKGluZm8sIG8pKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgICAgfVxuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIG9wdGltaXplZERlcE5lZWRzSW50ZXJvcChtZXRhZGF0YSwgZmlsZSwgY29uZmlnLCBzc3IpIHtcbiAgICBjb25zdCBkZXBJbmZvID0gb3B0aW1pemVkRGVwSW5mb0Zyb21GaWxlKG1ldGFkYXRhLCBmaWxlKTtcbiAgICBpZiAoZGVwSW5mbz8uc3JjICYmIGRlcEluZm8ubmVlZHNJbnRlcm9wID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVwSW5mby5leHBvcnRzRGF0YSA/PyAoZGVwSW5mby5leHBvcnRzRGF0YSA9IGV4dHJhY3RFeHBvcnRzRGF0YShkZXBJbmZvLnNyYywgY29uZmlnLCBzc3IpKTtcbiAgICAgICAgZGVwSW5mby5uZWVkc0ludGVyb3AgPSBuZWVkc0ludGVyb3AoY29uZmlnLCBzc3IsIGRlcEluZm8uaWQsIGF3YWl0IGRlcEluZm8uZXhwb3J0c0RhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVwSW5mbz8ubmVlZHNJbnRlcm9wO1xufVxuY29uc3QgTUFYX1RFTVBfRElSX0FHRV9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwRGVwc0NhY2hlU3RhbGVEaXJzKGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhY2hlRGlyID0gcGF0aCRvLnJlc29sdmUoY29uZmlnLmNhY2hlRGlyKTtcbiAgICAgICAgaWYgKGZzJGwuZXhpc3RzU3luYyhjYWNoZURpcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmc3AucmVhZGRpcihjYWNoZURpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgICAgICAgICAgIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBkaXJlbnQubmFtZS5pbmNsdWRlcygnX3RlbXBfJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcERpclBhdGggPSBwYXRoJG8ucmVzb2x2ZShjb25maWcuY2FjaGVEaXIsIGRpcmVudC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmc3Auc3RhdCh0ZW1wRGlyUGF0aCkuY2F0Y2goKF8pID0+IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHM/Lm10aW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpIC0gc3RhdHMubXRpbWUuZ2V0VGltZSgpID4gTUFYX1RFTVBfRElSX0FHRV9NUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVtb3ZlRGlyKHRlbXBEaXJQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbmZpZy5sb2dnZXIuZXJyb3IoZXJyKTtcbiAgICB9XG59XG5cbnZhciBpbmRleCQxID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdGFkZE1hbnVhbGx5SW5jbHVkZWRPcHRpbWl6ZURlcHM6IGFkZE1hbnVhbGx5SW5jbHVkZWRPcHRpbWl6ZURlcHMsXG5cdGFkZE9wdGltaXplZERlcEluZm86IGFkZE9wdGltaXplZERlcEluZm8sXG5cdGNsZWFudXBEZXBzQ2FjaGVTdGFsZURpcnM6IGNsZWFudXBEZXBzQ2FjaGVTdGFsZURpcnMsXG5cdGNyZWF0ZUlzT3B0aW1pemVkRGVwVXJsOiBjcmVhdGVJc09wdGltaXplZERlcFVybCxcblx0ZGVidWdnZXJWaXRlRGVwczogZGVidWdnZXJWaXRlRGVwcyxcblx0ZGVwc0Zyb21PcHRpbWl6ZWREZXBJbmZvOiBkZXBzRnJvbU9wdGltaXplZERlcEluZm8sXG5cdGRlcHNMb2dTdHJpbmc6IGRlcHNMb2dTdHJpbmcsXG5cdGRpc2NvdmVyUHJvamVjdERlcGVuZGVuY2llczogZGlzY292ZXJQcm9qZWN0RGVwZW5kZW5jaWVzLFxuXHRleHRyYWN0RXhwb3J0c0RhdGE6IGV4dHJhY3RFeHBvcnRzRGF0YSxcblx0ZmluZEtub3duSW1wb3J0czogZmluZEtub3duSW1wb3J0cyxcblx0Z2V0RGVwSGFzaDogZ2V0RGVwSGFzaCxcblx0Z2V0RGVwc0NhY2hlRGlyOiBnZXREZXBzQ2FjaGVEaXIsXG5cdGdldERlcHNDYWNoZURpclByZWZpeDogZ2V0RGVwc0NhY2hlRGlyUHJlZml4LFxuXHRnZXREZXBzT3B0aW1pemVyOiBnZXREZXBzT3B0aW1pemVyLFxuXHRnZXRPcHRpbWl6ZWREZXBQYXRoOiBnZXRPcHRpbWl6ZWREZXBQYXRoLFxuXHRpbml0RGVwc09wdGltaXplcjogaW5pdERlcHNPcHRpbWl6ZXIsXG5cdGluaXREZXBzT3B0aW1pemVyTWV0YWRhdGE6IGluaXREZXBzT3B0aW1pemVyTWV0YWRhdGEsXG5cdGluaXREZXZTc3JEZXBzT3B0aW1pemVyOiBpbml0RGV2U3NyRGVwc09wdGltaXplcixcblx0aXNPcHRpbWl6ZWREZXBGaWxlOiBpc09wdGltaXplZERlcEZpbGUsXG5cdGxvYWRDYWNoZWREZXBPcHRpbWl6YXRpb25NZXRhZGF0YTogbG9hZENhY2hlZERlcE9wdGltaXphdGlvbk1ldGFkYXRhLFxuXHRuZXdEZXBPcHRpbWl6YXRpb25Qcm9jZXNzaW5nOiBuZXdEZXBPcHRpbWl6YXRpb25Qcm9jZXNzaW5nLFxuXHRvcHRpbWl6ZURlcHM6IG9wdGltaXplRGVwcyxcblx0b3B0aW1pemVTZXJ2ZXJTc3JEZXBzOiBvcHRpbWl6ZVNlcnZlclNzckRlcHMsXG5cdG9wdGltaXplZERlcEluZm9Gcm9tRmlsZTogb3B0aW1pemVkRGVwSW5mb0Zyb21GaWxlLFxuXHRvcHRpbWl6ZWREZXBJbmZvRnJvbUlkOiBvcHRpbWl6ZWREZXBJbmZvRnJvbUlkLFxuXHRvcHRpbWl6ZWREZXBOZWVkc0ludGVyb3A6IG9wdGltaXplZERlcE5lZWRzSW50ZXJvcCxcblx0cnVuT3B0aW1pemVEZXBzOiBydW5PcHRpbWl6ZURlcHMsXG5cdHRvRGlzY292ZXJlZERlcGVuZGVuY2llczogdG9EaXNjb3ZlcmVkRGVwZW5kZW5jaWVzXG59O1xuXG4vKipcbiAqIEEgZmxhZyBmb3IgaW5qZWN0ZWQgaGVscGVycy4gVGhpcyBmbGFnIHdpbGwgYmUgc2V0IHRvIGBmYWxzZWAgaWYgdGhlIG91dHB1dFxuICogdGFyZ2V0IGlzIG5vdCBuYXRpdmUgZXMgLSBzbyB0aGF0IGluamVjdGVkIGhlbHBlciBsb2dpYyBjYW4gYmUgY29uZGl0aW9uYWxseVxuICogZHJvcHBlZC5cbiAqL1xuY29uc3QgaXNNb2Rlcm5GbGFnID0gYF9fVklURV9JU19NT0RFUk5fX2A7XG5jb25zdCBwcmVsb2FkTWV0aG9kID0gYF9fdml0ZVByZWxvYWRgO1xuY29uc3QgcHJlbG9hZE1hcmtlciA9IGBfX1ZJVEVfUFJFTE9BRF9fYDtcbmNvbnN0IHByZWxvYWRIZWxwZXJJZCA9ICdcXDB2aXRlL3ByZWxvYWQtaGVscGVyJztcbmNvbnN0IHByZWxvYWRNYXJrZXJXaXRoUXVvdGUgPSBgXCIke3ByZWxvYWRNYXJrZXJ9XCJgO1xuY29uc3QgZHluYW1pY0ltcG9ydFByZWZpeFJFID0gL2ltcG9ydFxccypcXCgvO1xuLy8gVE9ETzogYWJzdHJhY3RcbmNvbnN0IG9wdGltaXplZERlcENodW5rUkUgPSAvXFwvY2h1bmstW0EtWlxcZF17OH1cXC5qcy87XG5jb25zdCBvcHRpbWl6ZWREZXBEeW5hbWljUkUgPSAvLVtBLVpcXGRdezh9XFwuanMvO1xuZnVuY3Rpb24gdG9SZWxhdGl2ZVBhdGgoZmlsZW5hbWUsIGltcG9ydGVyKSB7XG4gICAgY29uc3QgcmVsUGF0aCA9IHBhdGgkby5yZWxhdGl2ZShwYXRoJG8uZGlybmFtZShpbXBvcnRlciksIGZpbGVuYW1lKTtcbiAgICByZXR1cm4gcmVsUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxQYXRoIDogYC4vJHtyZWxQYXRofWA7XG59XG4vKipcbiAqIEhlbHBlciBmb3IgcHJlbG9hZGluZyBDU1MgYW5kIGRpcmVjdCBpbXBvcnRzIG9mIGFzeW5jIGNodW5rcyBpbiBwYXJhbGxlbCB0b1xuICogdGhlIGFzeW5jIGNodW5rIGl0c2VsZi5cbiAqL1xuZnVuY3Rpb24gZGV0ZWN0U2NyaXB0UmVsKCkge1xuICAgIGNvbnN0IHJlbExpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJykucmVsTGlzdDtcbiAgICByZXR1cm4gcmVsTGlzdCAmJiByZWxMaXN0LnN1cHBvcnRzICYmIHJlbExpc3Quc3VwcG9ydHMoJ21vZHVsZXByZWxvYWQnKVxuICAgICAgICA/ICdtb2R1bGVwcmVsb2FkJ1xuICAgICAgICA6ICdwcmVsb2FkJztcbn1cbmZ1bmN0aW9uIHByZWxvYWQoYmFzZU1vZHVsZSwgZGVwcywgaW1wb3J0ZXJVcmwpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIF9fVklURV9JU19NT0RFUk5fXyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggYm9vbGVhbiBsYXRlclxuICAgIGlmICghX19WSVRFX0lTX01PREVSTl9fIHx8ICFkZXBzIHx8IGRlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBiYXNlTW9kdWxlKCk7XG4gICAgfVxuICAgIGNvbnN0IGxpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpbmsnKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoZGVwcy5tYXAoKGRlcCkgPT4ge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGFzc2V0c1VSTCBpcyBkZWNsYXJlZCBiZWZvcmUgcHJlbG9hZC50b1N0cmluZygpXG4gICAgICAgIGRlcCA9IGFzc2V0c1VSTChkZXAsIGltcG9ydGVyVXJsKTtcbiAgICAgICAgaWYgKGRlcCBpbiBzZWVuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzZWVuW2RlcF0gPSB0cnVlO1xuICAgICAgICBjb25zdCBpc0NzcyA9IGRlcC5lbmRzV2l0aCgnLmNzcycpO1xuICAgICAgICBjb25zdCBjc3NTZWxlY3RvciA9IGlzQ3NzID8gJ1tyZWw9XCJzdHlsZXNoZWV0XCJdJyA6ICcnO1xuICAgICAgICBjb25zdCBpc0Jhc2VSZWxhdGl2ZSA9ICEhaW1wb3J0ZXJVcmw7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBmaWxlIGlzIGFscmVhZHkgcHJlbG9hZGVkIGJ5IFNTUiBtYXJrdXBcbiAgICAgICAgaWYgKGlzQmFzZVJlbGF0aXZlKSB7XG4gICAgICAgICAgICAvLyBXaGVuIGlzQmFzZVJlbGF0aXZlIGlzIHRydWUgdGhlbiB3ZSBoYXZlIGBpbXBvcnRlclVybGAgYW5kIGBkZXBgIGlzXG4gICAgICAgICAgICAvLyBhbHJlYWR5IGNvbnZlcnRlZCB0byBhbiBhYnNvbHV0ZSBVUkwgYnkgdGhlIGBhc3NldHNVUkxgIGZ1bmN0aW9uXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbGlua3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rID0gbGlua3NbaV07XG4gICAgICAgICAgICAgICAgLy8gVGhlIGBsaW5rc1tpXS5ocmVmYCBpcyBhbiBhYnNvbHV0ZSBVUkwgdGhhbmtzIHRvIGJyb3dzZXIgZG9pbmcgdGhlIHdvcmtcbiAgICAgICAgICAgICAgICAvLyBmb3IgdXMuIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jb21tb24tZG9tLWludGVyZmFjZXMuaHRtbCNyZWZsZWN0aW5nLWNvbnRlbnQtYXR0cmlidXRlcy1pbi1pZGwtYXR0cmlidXRlczppZGwtZG9tc3RyaW5nLTVcbiAgICAgICAgICAgICAgICBpZiAobGluay5ocmVmID09PSBkZXAgJiYgKCFpc0NzcyB8fCBsaW5rLnJlbCA9PT0gJ3N0eWxlc2hlZXQnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGxpbmtbaHJlZj1cIiR7ZGVwfVwiXSR7Y3NzU2VsZWN0b3J9YCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBsaW5rLnJlbCA9IGlzQ3NzID8gJ3N0eWxlc2hlZXQnIDogc2NyaXB0UmVsO1xuICAgICAgICBpZiAoIWlzQ3NzKSB7XG4gICAgICAgICAgICBsaW5rLmFzID0gJ3NjcmlwdCc7XG4gICAgICAgICAgICBsaW5rLmNyb3NzT3JpZ2luID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgbGluay5ocmVmID0gZGVwO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspO1xuICAgICAgICBpZiAoaXNDc3MpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCByZXMpO1xuICAgICAgICAgICAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiByZWoobmV3IEVycm9yKGBVbmFibGUgdG8gcHJlbG9hZCBDU1MgZm9yICR7ZGVwfWApKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pKS50aGVuKCgpID0+IGJhc2VNb2R1bGUoKSk7XG59XG4vKipcbiAqIEJ1aWxkIG9ubHkuIER1cmluZyBzZXJ2ZSB0aGlzIGlzIHBlcmZvcm1lZCBhcyBwYXJ0IG9mIC4vaW1wb3J0QW5hbHlzaXMuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW1wb3J0QW5hbHlzaXNQbHVnaW4oY29uZmlnKSB7XG4gICAgY29uc3Qgc3NyID0gISFjb25maWcuYnVpbGQuc3NyO1xuICAgIGNvbnN0IGlzV29ya2VyID0gY29uZmlnLmlzV29ya2VyO1xuICAgIGNvbnN0IGluc2VydFByZWxvYWQgPSAhKHNzciB8fFxuICAgICAgICAhIWNvbmZpZy5idWlsZC5saWIgfHxcbiAgICAgICAgaXNXb3JrZXIgfHxcbiAgICAgICAgY29uZmlnLmJ1aWxkLm1vZHVsZVByZWxvYWQgPT09IGZhbHNlKTtcbiAgICBjb25zdCByZXNvbHZlTW9kdWxlUHJlbG9hZERlcGVuZGVuY2llcyA9IGNvbmZpZy5idWlsZC5tb2R1bGVQcmVsb2FkICYmIGNvbmZpZy5idWlsZC5tb2R1bGVQcmVsb2FkLnJlc29sdmVEZXBlbmRlbmNpZXM7XG4gICAgY29uc3QgcmVuZGVyQnVpbHRVcmwgPSBjb25maWcuZXhwZXJpbWVudGFsLnJlbmRlckJ1aWx0VXJsO1xuICAgIGNvbnN0IGN1c3RvbU1vZHVsZVByZWxvYWRQYXRocyA9ICEhKHJlc29sdmVNb2R1bGVQcmVsb2FkRGVwZW5kZW5jaWVzIHx8IHJlbmRlckJ1aWx0VXJsKTtcbiAgICBjb25zdCBpc1JlbGF0aXZlQmFzZSA9IGNvbmZpZy5iYXNlID09PSAnLi8nIHx8IGNvbmZpZy5iYXNlID09PSAnJztcbiAgICBjb25zdCBvcHRpbWl6ZU1vZHVsZVByZWxvYWRSZWxhdGl2ZVBhdGhzID0gaXNSZWxhdGl2ZUJhc2UgJiYgIWN1c3RvbU1vZHVsZVByZWxvYWRQYXRocztcbiAgICBjb25zdCB7IG1vZHVsZVByZWxvYWQgfSA9IGNvbmZpZy5idWlsZDtcbiAgICBjb25zdCBzY3JpcHRSZWwgPSBtb2R1bGVQcmVsb2FkICYmIG1vZHVsZVByZWxvYWQucG9seWZpbGxcbiAgICAgICAgPyBgJ21vZHVsZXByZWxvYWQnYFxuICAgICAgICA6IGAoJHtkZXRlY3RTY3JpcHRSZWwudG9TdHJpbmcoKX0pKClgO1xuICAgIC8vIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgY2FzZXMgZm9yIHRoZSBwcmVsb2FkIGxpc3QgZm9ybWF0IGluIF9fdml0ZVByZWxvYWRcbiAgICAvL1xuICAgIC8vIF9fdml0ZVByZWxvYWQoKCkgPT4gaW1wb3J0KGFzeW5jQ2h1bmspLCBbIC4uLmRlcHMuLi4gXSlcbiAgICAvL1xuICAgIC8vIFRoaXMgaXMgbWFpbnRhaW5lZCB0byBrZWVwIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFzIHNvbWUgdXNlcnMgZGV2ZWxvcGVkIHBsdWdpbnNcbiAgICAvLyB1c2luZyByZWdleCBvdmVyIHRoaXMgbGlzdCB0byB3b3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgbW9kdWxlIHByZWxvYWQgd2Fzbid0XG4gICAgLy8gY29uZmlndXJhYmxlLlxuICAgIGNvbnN0IGFzc2V0c1VSTCA9IGN1c3RvbU1vZHVsZVByZWxvYWRQYXRoc1xuICAgICAgICA/IC8vIElmIGBleHBlcmltZW50YWwucmVuZGVyQnVpbHRVcmxgIG9yIGBidWlsZC5tb2R1bGVQcmVsb2FkLnJlc29sdmVEZXBlbmRlbmNpZXNgIGFyZSB1c2VkXG4gICAgICAgICAgICAvLyB0aGUgZGVwZW5kZW5jaWVzIGFyZSBhbHJlYWR5IHJlc29sdmVkLiBUbyBhdm9pZCB0aGUgbmVlZCBmb3IgYG5ldyBVUkwoZGVwLCBpbXBvcnQubWV0YS51cmwpYFxuICAgICAgICAgICAgLy8gYSBoZWxwZXIgYF9fdml0ZVByZWxvYWRSZWxhdGl2ZURlcGAgaXMgdXNlZCB0byByZXNvbHZlIGZyb20gcmVsYXRpdmUgcGF0aHMgd2hpY2ggY2FuIGJlIG1pbmltaXplZC5cbiAgICAgICAgICAgIGBmdW5jdGlvbihkZXAsIGltcG9ydGVyVXJsKSB7IHJldHVybiBkZXAuc3RhcnRzV2l0aCgnLicpID8gbmV3IFVSTChkZXAsIGltcG9ydGVyVXJsKS5ocmVmIDogZGVwIH1gXG4gICAgICAgIDogb3B0aW1pemVNb2R1bGVQcmVsb2FkUmVsYXRpdmVQYXRoc1xuICAgICAgICAgICAgPyAvLyBJZiB0aGVyZSBpc24ndCBjdXN0b20gcmVzb2x2ZXJzIGFmZmVjdGluZyB0aGUgZGVwcyBsaXN0LCBkZXBzIGluIHRoZSBsaXN0IGFyZSByZWxhdGl2ZVxuICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBjdXJyZW50IGNodW5rIGFuZCBhcmUgcmVzb2x2ZWQgdG8gYWJzb2x1dGUgVVJMIGJ5IHRoZSBfX3ZpdGVQcmVsb2FkIGhlbHBlciBpdHNlbGYuXG4gICAgICAgICAgICAgICAgLy8gVGhlIGltcG9ydGVyVXJsIGlzIHBhc3NlZCBhcyB0aGlyZCBwYXJhbWV0ZXIgdG8gX192aXRlUHJlbG9hZCBpbiB0aGlzIGNhc2VcbiAgICAgICAgICAgICAgICBgZnVuY3Rpb24oZGVwLCBpbXBvcnRlclVybCkgeyByZXR1cm4gbmV3IFVSTChkZXAsIGltcG9ydGVyVXJsKS5ocmVmIH1gXG4gICAgICAgICAgICA6IC8vIElmIHRoZSBiYXNlIGlzbid0IHJlbGF0aXZlLCB0aGVuIHRoZSBkZXBzIGFyZSByZWxhdGl2ZSB0byB0aGUgcHJvamVjdHMgYG91dERpcmAgYW5kIHRoZSBiYXNlXG4gICAgICAgICAgICAgICAgLy8gaXMgYXBwZW5kZWQgaW5zaWRlIF9fdml0ZVByZWxvYWQgdG9vLlxuICAgICAgICAgICAgICAgIGBmdW5jdGlvbihkZXApIHsgcmV0dXJuICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLmJhc2UpfStkZXAgfWA7XG4gICAgY29uc3QgcHJlbG9hZENvZGUgPSBgY29uc3Qgc2NyaXB0UmVsID0gJHtzY3JpcHRSZWx9O2NvbnN0IGFzc2V0c1VSTCA9ICR7YXNzZXRzVVJMfTtjb25zdCBzZWVuID0ge307ZXhwb3J0IGNvbnN0ICR7cHJlbG9hZE1ldGhvZH0gPSAke3ByZWxvYWQudG9TdHJpbmcoKX1gO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmJ1aWxkLWltcG9ydC1hbmFseXNpcycsXG4gICAgICAgIHJlc29sdmVJZChpZCkge1xuICAgICAgICAgICAgaWYgKGlkID09PSBwcmVsb2FkSGVscGVySWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxvYWQoaWQpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gcHJlbG9hZEhlbHBlcklkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWxvYWRDb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyB0cmFuc2Zvcm0oc291cmNlLCBpbXBvcnRlcikge1xuICAgICAgICAgICAgaWYgKGltcG9ydGVyLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSAmJlxuICAgICAgICAgICAgICAgICFkeW5hbWljSW1wb3J0UHJlZml4UkUudGVzdChzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgaW5pdDtcbiAgICAgICAgICAgIGxldCBpbXBvcnRzID0gW107XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGltcG9ydHMgPSBwYXJzZSRlKHNvdXJjZSlbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZSwgZS5pZHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpbXBvcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyByb290IH0gPSBjb25maWc7XG4gICAgICAgICAgICBjb25zdCBkZXBzT3B0aW1pemVyID0gZ2V0RGVwc09wdGltaXplcihjb25maWcsIHNzcik7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVVcmwgPSBhc3luYyAodXJsLCBwb3MpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW1wb3J0ZXJGaWxlID0gaW1wb3J0ZXI7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW1pemVEZXBzID0gZ2V0RGVwT3B0aW1pemF0aW9uQ29uZmlnKGNvbmZpZywgc3NyKTtcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlTGlzdENvbnRhaW5zKG9wdGltaXplRGVwcz8uZXhjbHVkZSwgdXJsKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVwc09wdGltaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVwc09wdGltaXplci5zY2FuUHJvY2Vzc2luZztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBkZXBlbmRlbmN5IGVuY291bnRlcmVkIGluIHRoZSBvcHRpbWl6ZWQgZmlsZSB3YXMgZXhjbHVkZWQgZnJvbSB0aGUgb3B0aW1pemF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVwZW5kZW5jeSBuZWVkcyB0byBiZSByZXNvbHZlZCBzdGFydGluZyBmcm9tIHRoZSBvcmlnaW5hbCBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIG9wdGltaXplZCBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHN0YXJ0aW5nIGZyb20gbm9kZV9tb2R1bGVzLy52aXRlIHdpbGwgbm90IGZpbmQgdGhlIGRlcGVuZGVuY3kgaWYgaXQgd2FzIG5vdCBob2lzdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhhdCBpcywgaWYgaXQgaXMgdW5kZXIgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBpbiB0aGUgcGFja2FnZSBzb3VyY2Ugb2YgdGhlIG9wdGltaXplZCBmaWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpbWl6ZWRNb2R1bGUgb2YgZGVwc09wdGltaXplci5tZXRhZGF0YS5kZXBJbmZvTGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW1pemVkTW9kdWxlLnNyYylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIElnbm9yZSBjaHVua3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW1pemVkTW9kdWxlLmZpbGUgPT09IGltcG9ydGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGVyRmlsZSA9IG9wdGltaXplZE1vZHVsZS5zcmM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy5yZXNvbHZlKHVybCwgaW1wb3J0ZXJGaWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluIHNzciwgd2Ugc2hvdWxkIGxldCBub2RlIGhhbmRsZSB0aGUgbWlzc2luZyBtb2R1bGVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChzc3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbdXJsLCB1cmxdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBpbXBvcnQgXCIke3VybH1cIiBmcm9tIFwiJHtwYXRoJG8ucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgaW1wb3J0ZXJGaWxlKX1cIi4gRG9lcyB0aGUgZmlsZSBleGlzdD9gLCBwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBub3JtYWxpemUgYWxsIGltcG9ydHMgaW50byByZXNvbHZlZCBVUkxzXG4gICAgICAgICAgICAgICAgLy8gZS5nLiBgaW1wb3J0ICdmb28nYCAtPiBgaW1wb3J0ICcvQGZzLy4uLi9ub2RlX21vZHVsZXMvZm9vL2luZGV4LmpzJ2BcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuaWQuc3RhcnRzV2l0aChyb290ICsgJy8nKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbiByb290OiBpbmZlciBzaG9ydCBhYnNvbHV0ZSBwYXRoIGZyb20gcm9vdFxuICAgICAgICAgICAgICAgICAgICB1cmwgPSByZXNvbHZlZC5pZC5zbGljZShyb290Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSByZXNvbHZlZC5pZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzRXh0ZXJuYWxVcmwodXJsKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VybCwgdXJsXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFt1cmwsIHJlc29sdmVkLmlkXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgcztcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9ICgpID0+IHMgfHwgKHMgPSBuZXcgTWFnaWNTdHJpbmcoc291cmNlKSk7XG4gICAgICAgICAgICBsZXQgbmVlZFByZWxvYWRIZWxwZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpbXBvcnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgczogc3RhcnQsIGU6IGVuZCwgc3M6IGV4cFN0YXJ0LCBzZTogZXhwRW5kLCBuOiBzcGVjaWZpZXIsIGQ6IGR5bmFtaWNJbmRleCwgYTogYXNzZXJ0SW5kZXgsIH0gPSBpbXBvcnRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0R5bmFtaWNJbXBvcnQgPSBkeW5hbWljSW5kZXggPiAtMTtcbiAgICAgICAgICAgICAgICAvLyBzdHJpcCBpbXBvcnQgYXNzZXJ0aW9ucyBhcyB3ZSBjYW4gcHJvY2VzcyB0aGVtIG91cnNlbHZlc1xuICAgICAgICAgICAgICAgIGlmICghaXNEeW5hbWljSW1wb3J0ICYmIGFzc2VydEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyKCkucmVtb3ZlKGVuZCArIDEsIGV4cEVuZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0R5bmFtaWNJbXBvcnQgJiYgaW5zZXJ0UHJlbG9hZCkge1xuICAgICAgICAgICAgICAgICAgICBuZWVkUHJlbG9hZEhlbHBlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHN0cigpLnByZXBlbmRMZWZ0KGV4cFN0YXJ0LCBgJHtwcmVsb2FkTWV0aG9kfSgoKSA9PiBgKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyKCkuYXBwZW5kUmlnaHQoZXhwRW5kLCBgLCR7aXNNb2Rlcm5GbGFnfT9cIiR7cHJlbG9hZE1hcmtlcn1cIjp2b2lkIDAke29wdGltaXplTW9kdWxlUHJlbG9hZFJlbGF0aXZlUGF0aHMgfHwgY3VzdG9tTW9kdWxlUHJlbG9hZFBhdGhzXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICcsaW1wb3J0Lm1ldGEudXJsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ30pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHN0YXRpYyBpbXBvcnQgb3IgdmFsaWQgc3RyaW5nIGluIGR5bmFtaWMgaW1wb3J0XG4gICAgICAgICAgICAgICAgLy8gSWYgcmVzb2x2YWJsZSwgbGV0J3MgcmVzb2x2ZSBpdFxuICAgICAgICAgICAgICAgIGlmIChkZXBzT3B0aW1pemVyICYmIHNwZWNpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGV4dGVybmFsIC8gZGF0YSB1cmlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRXh0ZXJuYWxVcmwoc3BlY2lmaWVyKSB8fCBpc0RhdGFVcmwoc3BlY2lmaWVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsaXplXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFt1cmwsIHJlc29sdmVkSWRdID0gYXdhaXQgbm9ybWFsaXplVXJsKHNwZWNpZmllciwgc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXJsICE9PSBzcGVjaWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXBzT3B0aW1pemVyLmlzT3B0aW1pemVkRGVwRmlsZShyZXNvbHZlZElkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZXNvbHZlZElkLm1hdGNoKG9wdGltaXplZERlcENodW5rUkUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGNsZWFuVXJsKHJlc29sdmVkSWQpOyAvLyBSZW1vdmUgP3Y9e2hhc2h9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVlZHNJbnRlcm9wID0gYXdhaXQgb3B0aW1pemVkRGVwTmVlZHNJbnRlcm9wKGRlcHNPcHRpbWl6ZXIubWV0YWRhdGEsIGZpbGUsIGNvbmZpZywgc3NyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV3cml0ZURvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNJbnRlcm9wID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9uLWVudHJ5IGR5bmFtaWMgaW1wb3J0cyBmcm9tIGRlcGVuZGVuY2llcyB3aWxsIHJlYWNoIGhlcmUgYXMgdGhlcmUgaXNuJ3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pemUgaW5mbyBmb3IgdGhlbSwgYnV0IHRoZXkgZG9uJ3QgbmVlZCBlcyBpbnRlcm9wLiBJZiB0aGUgcmVxdWVzdCBpc24ndFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGR5bmFtaWMgaW1wb3J0LCB0aGVuIGl0IGlzIGFuIGludGVybmFsIFZpdGUgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlLm1hdGNoKG9wdGltaXplZERlcER5bmFtaWNSRSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIuZXJyb3IocGljb2NvbG9yc0V4cG9ydHMucmVkKGBWaXRlIEVycm9yLCAke3VybH0gb3B0aW1pemVkIGluZm8gc2hvdWxkIGJlIGRlZmluZWRgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmVlZHNJbnRlcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmZpZy5sb2dnZXIuaW5mbyhgJHt1cmx9IG5lZWRzIGludGVyb3BgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm9wTmFtZWRJbXBvcnRzKHN0cigpLCBpbXBvcnRzW2luZGV4XSwgdXJsLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVEb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXdyaXRlRG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV3cml0dGVuVXJsID0gSlNPTi5zdHJpbmdpZnkoZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNEeW5hbWljSW1wb3J0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0dGVuVXJsID0gcmV3cml0dGVuVXJsLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKCkudXBkYXRlKHN0YXJ0LCBlbmQsIHJld3JpdHRlblVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudGlhdGUgQ1NTIGltcG9ydHMgdGhhdCB1c2UgdGhlIGRlZmF1bHQgZXhwb3J0IGZyb20gdGhvc2UgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBieSBpbmplY3RpbmcgYSA/dXNlZCBxdWVyeSAtIHRoaXMgYWxsb3dzIHVzIHRvIGF2b2lkIGluY2x1ZGluZ1xuICAgICAgICAgICAgICAgIC8vIHRoZSBDU1Mgc3RyaW5nIHdoZW4gdW5uZWNlc3NhcnkgKGVzYnVpbGQgaGFzIHRyb3VibGUgdHJlZS1zaGFraW5nXG4gICAgICAgICAgICAgICAgLy8gdGhlbSlcbiAgICAgICAgICAgICAgICBpZiAoc3BlY2lmaWVyICYmXG4gICAgICAgICAgICAgICAgICAgIGlzQ1NTUmVxdWVzdChzcGVjaWZpZXIpICYmXG4gICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBpbmplY3QgP3VzZWQgcXVlcnkgd2hlbiBpdCBpcyBhIGR5bmFtaWMgaW1wb3J0XG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gd2F5IHRvIGNoZWNrIHdoZXRoZXIgdGhlIGRlZmF1bHQgZXhwb3J0IGlzIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgKHNvdXJjZS5zbGljZShleHBTdGFydCwgc3RhcnQpLmluY2x1ZGVzKCdmcm9tJykgfHwgaXNEeW5hbWljSW1wb3J0KSAmJlxuICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGhhcyA/dXNlZCBxdWVyeSAoYnkgaW1wb3J0Lm1ldGEuZ2xvYilcbiAgICAgICAgICAgICAgICAgICAgIXNwZWNpZmllci5tYXRjaCgvXFw/dXNlZCgmfCQpLykgJiZcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgYXBwZW5kID91c2VkIHdoZW4gU1BFQ0lBTF9RVUVSWV9SRSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgIXNwZWNpZmllci5tYXRjaChTUEVDSUFMX1FVRVJZX1JFKSAmJlxuICAgICAgICAgICAgICAgICAgICAvLyBlZGdlIGNhc2UgZm9yIHBhY2thZ2UgbmFtZXMgZW5kaW5nIHdpdGggLmNzcyAoZS5nIG5vcm1hbGl6ZS5jc3MpXG4gICAgICAgICAgICAgICAgICAgICEoYmFyZUltcG9ydFJFLnRlc3Qoc3BlY2lmaWVyKSAmJiAhc3BlY2lmaWVyLmluY2x1ZGVzKCcvJykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHNwZWNpZmllci5yZXBsYWNlKC9cXD98JC8sIChtKSA9PiBgP3VzZWQke20gPyAnJicgOiAnJ31gKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyKCkudXBkYXRlKHN0YXJ0LCBlbmQsIGlzRHluYW1pY0ltcG9ydCA/IGAnJHt1cmx9J2AgOiB1cmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZWVkUHJlbG9hZEhlbHBlciAmJlxuICAgICAgICAgICAgICAgIGluc2VydFByZWxvYWQgJiZcbiAgICAgICAgICAgICAgICAhc291cmNlLmluY2x1ZGVzKGBjb25zdCAke3ByZWxvYWRNZXRob2R9ID1gKSkge1xuICAgICAgICAgICAgICAgIHN0cigpLnByZXBlbmQoYGltcG9ydCB7ICR7cHJlbG9hZE1ldGhvZH0gfSBmcm9tIFwiJHtwcmVsb2FkSGVscGVySWR9XCI7YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwOiBjb25maWcuYnVpbGQuc291cmNlbWFwID8gcy5nZW5lcmF0ZU1hcCh7IGhpcmVzOiB0cnVlIH0pIDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZW5kZXJDaHVuayhjb2RlLCBfLCB7IGZvcm1hdCB9KSB7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugb25seSBwZXJmb3JtIHRoZSBwcmVsb2FkIGxvZ2ljIGluIG1vZGVybiBidWlsZHMuXG4gICAgICAgICAgICBpZiAoY29kZS5pbmRleE9mKGlzTW9kZXJuRmxhZykgPiAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChpc01vZGVybkZsYWcsICdnJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNNb2Rlcm4gPSBTdHJpbmcoZm9ybWF0ID09PSAnZXMnKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmJ1aWxkLnNvdXJjZW1hcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gbmV3IE1hZ2ljU3RyaW5nKGNvZGUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSByZS5leGVjKGNvZGUpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcy51cGRhdGUobWF0Y2guaW5kZXgsIG1hdGNoLmluZGV4ICsgaXNNb2Rlcm5GbGFnLmxlbmd0aCwgaXNNb2Rlcm4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBzLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXA6IHMuZ2VuZXJhdGVNYXAoeyBoaXJlczogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLnJlcGxhY2UocmUsIGlzTW9kZXJuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2VuZXJhdGVCdW5kbGUoeyBmb3JtYXQgfSwgYnVuZGxlKSB7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ICE9PSAnZXMnIHx8XG4gICAgICAgICAgICAgICAgc3NyIHx8XG4gICAgICAgICAgICAgICAgaXNXb3JrZXIgfHxcbiAgICAgICAgICAgICAgICBjb25maWcuYnVpbGQubW9kdWxlUHJlbG9hZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgaW4gYnVuZGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBidW5kbGVbZmlsZV07XG4gICAgICAgICAgICAgICAgLy8gY2FuJ3QgdXNlIGNodW5rLmR5bmFtaWNJbXBvcnRzLmxlbmd0aCBoZXJlIHNpbmNlIHNvbWUgbW9kdWxlcyBlLmcuXG4gICAgICAgICAgICAgICAgLy8gZHluYW1pYyBpbXBvcnQgdG8gY29uc3RhbnQganNvbiBtYXkgZ2V0IGlubGluZWQuXG4gICAgICAgICAgICAgICAgaWYgKGNodW5rLnR5cGUgPT09ICdjaHVuaycgJiYgY2h1bmsuY29kZS5pbmRleE9mKHByZWxvYWRNYXJrZXIpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGNodW5rLmNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRzO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0cyA9IHBhcnNlJGUoY29kZSlbMF0uZmlsdGVyKChpKSA9PiBpLmQgPiAtMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZSwgZS5pZHgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgTWFnaWNTdHJpbmcoY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJld3JvdGVNYXJrZXJTdGFydFBvcyA9IG5ldyBTZXQoKTsgLy8gcG9zaXRpb24gb2YgdGhlIGxlYWRpbmcgZG91YmxlIHF1b3RlXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGltcG9ydHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG8gaGFuZGxlIGVzY2FwZSBzZXF1ZW5jZXMgaW4gc3BlY2lmaWVyIHN0cmluZ3MsIHRoZSAubiBmaWVsZCB3aWxsIGJlIHByb3ZpZGVkIHdoZXJlIHBvc3NpYmxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbjogbmFtZSwgczogc3RhcnQsIGU6IGVuZCwgc3M6IGV4cFN0YXJ0LCBzZTogZXhwRW5kLCB9ID0gaW1wb3J0c1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGNodW5rIGJlaW5nIGltcG9ydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IG5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3VXJsID0gY29kZS5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd1VybFswXSA9PT0gYFwiYCAmJiByYXdVcmxbcmF3VXJsLmxlbmd0aCAtIDFdID09PSBgXCJgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gcmF3VXJsLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGFzUmVtb3ZlZFB1cmVDc3NDaHVuayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxpemVkRmlsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRGaWxlID0gcGF0aCRvLnBvc2l4LmpvaW4ocGF0aCRvLnBvc2l4LmRpcm5hbWUoY2h1bmsuZmlsZU5hbWUpLCB1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lckZpbGVuYW1lID0gY2h1bmsuZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpdGVyYWwgaW1wb3J0IC0gdHJhY2UgZGlyZWN0IGltcG9ydHMgYW5kIGFkZCB0byBkZXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGREZXBzID0gKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT09IG93bmVyRmlsZW5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuYWx5emVkLmhhcyhmaWxlbmFtZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHl6ZWQuYWRkKGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gYnVuZGxlW2ZpbGVuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVuaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMuYWRkKGNodW5rLmZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuay5pbXBvcnRzLmZvckVhY2goYWRkRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGNzcyBpbXBvcnRlZCBieSBjdXJyZW50IGNodW5rIGlzIGxvYWRlZCBhZnRlciB0aGUgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvIHRoZSBzdHlsZSBvZiBjdXJyZW50IGNodW5rIHdvbid0IGJlIG92ZXJ3cml0dGVuIHVuZXhwZWN0ZWRseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuay52aXRlTWV0YWRhdGEuaW1wb3J0ZWRDc3MuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmFkZChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRQdXJlQ3NzRmlsZXMgPSByZW1vdmVkUHVyZUNzc0ZpbGVzQ2FjaGUuZ2V0KGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSByZW1vdmVkUHVyZUNzc0ZpbGVzLmdldChmaWxlbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVuay52aXRlTWV0YWRhdGEuaW1wb3J0ZWRDc3Muc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsudml0ZU1ldGFkYXRhLmltcG9ydGVkQ3NzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmFkZChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUmVtb3ZlZFB1cmVDc3NDaHVuayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy51cGRhdGUoZXhwU3RhcnQsIGV4cEVuZCwgJ1Byb21pc2UucmVzb2x2ZSh7fSknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZERlcHMobm9ybWFsaXplZEZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWFya2VyU3RhcnRQb3MgPSBjb2RlLmluZGV4T2YocHJlbG9hZE1hcmtlcldpdGhRdW90ZSwgZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXggaXNzdWUgIzMwNTFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFya2VyU3RhcnRQb3MgPT09IC0xICYmIGltcG9ydHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlclN0YXJ0UG9zID0gY29kZS5pbmRleE9mKHByZWxvYWRNYXJrZXJXaXRoUXVvdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFya2VyU3RhcnRQb3MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZXAgbGlzdCBpbmNsdWRlcyB0aGUgbWFpbiBjaHVuaywgc28gb25seSBuZWVkIHRvIHJlbG9hZCB3aGVuIHRoZXJlIGFyZSBhY3R1YWwgb3RoZXIgZGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwc0FycmF5ID0gZGVwcy5zaXplID4gMSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFpbiBjaHVuayBpcyByZW1vdmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGFzUmVtb3ZlZFB1cmVDc3NDaHVuayAmJiBkZXBzLnNpemUgPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbLi4uZGVwc11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZW5kZXJlZERlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkRmlsZSAmJiBjdXN0b21Nb2R1bGVQcmVsb2FkUGF0aHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbW9kdWxlUHJlbG9hZCB9ID0gY29uZmlnLmJ1aWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZURlcGVuZGVuY2llcyA9IG1vZHVsZVByZWxvYWQgJiYgbW9kdWxlUHJlbG9hZC5yZXNvbHZlRGVwZW5kZW5jaWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc29sdmVkRGVwcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgbGV0IHRoZSB1c2VyIHJlbW92ZSBjc3MgZGVwcyBhcyB0aGVzZSBhcmVuJ3QgcmVhbGx5IHByZWxvYWRzLCB0aGV5IGFyZSBqdXN0IHVzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgbWVjaGFuaXNtIGFzIG1vZHVsZSBwcmVsb2FkcyBmb3IgdGhpcyBjaHVua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzc0RlcHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdGhlckRlcHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBkZXBzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlcC5lbmRzV2l0aCgnLmNzcycpID8gY3NzRGVwcyA6IG90aGVyRGVwcykucHVzaChkZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZERlcHMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlc29sdmVEZXBlbmRlbmNpZXMobm9ybWFsaXplZEZpbGUsIG90aGVyRGVwcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdElkOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdFR5cGU6ICdqcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jc3NEZXBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZERlcHMgPSBkZXBzQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERlcHMgPSByZXNvbHZlZERlcHMubWFwKChkZXApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRvT3V0cHV0RmlsZVBhdGhJbkpTKGRlcCwgJ2Fzc2V0JywgY2h1bmsuZmlsZU5hbWUsICdqcycsIGNvbmZpZywgdG9SZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50U3RyaW5nID0gdHlwZW9mIHJlcGxhY2VtZW50ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHJlcGxhY2VtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlcGxhY2VtZW50LnJ1bnRpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlZERlcHMgPSBkZXBzQXJyYXkubWFwKChkKSA9PiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGluY2x1ZGUgdGhlIGFzc2V0cyBkaXIgaWYgdGhlIGRlZmF1bHQgYXNzZXQgZmlsZSBuYW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHVzZWQsIHRoZSBwYXRoIHdpbGwgYmUgcmVjb25zdHJ1Y3RlZCBieSB0aGUgaW1wb3J0IHByZWxvYWQgaGVscGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvcHRpbWl6ZU1vZHVsZVByZWxvYWRSZWxhdGl2ZVBhdGhzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0b1JlbGF0aXZlUGF0aChkLCBmaWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudXBkYXRlKG1hcmtlclN0YXJ0UG9zLCBtYXJrZXJTdGFydFBvcyArIHByZWxvYWRNYXJrZXJXaXRoUXVvdGUubGVuZ3RoLCBgWyR7cmVuZGVyZWREZXBzLmpvaW4oJywnKX1dYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JvdGVNYXJrZXJTdGFydFBvcy5hZGQobWFya2VyU3RhcnRQb3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBtYXkgc3RpbGwgYmUgbWFya2VycyBkdWUgdG8gaW5saW5lZCBkeW5hbWljIGltcG9ydHMsIHJlbW92ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhbGwgdGhlIG1hcmtlcnMgcmVnYXJkbGVzc1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFya2VyU3RhcnRQb3MgPSBjb2RlLmluZGV4T2YocHJlbG9hZE1hcmtlcldpdGhRdW90ZSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChtYXJrZXJTdGFydFBvcyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJld3JvdGVNYXJrZXJTdGFydFBvcy5oYXMobWFya2VyU3RhcnRQb3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy51cGRhdGUobWFya2VyU3RhcnRQb3MsIG1hcmtlclN0YXJ0UG9zICsgcHJlbG9hZE1hcmtlcldpdGhRdW90ZS5sZW5ndGgsICd2b2lkIDAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlclN0YXJ0UG9zID0gY29kZS5pbmRleE9mKHByZWxvYWRNYXJrZXJXaXRoUXVvdGUsIG1hcmtlclN0YXJ0UG9zICsgcHJlbG9hZE1hcmtlcldpdGhRdW90ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzLmhhc0NoYW5nZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsuY29kZSA9IHMudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuYnVpbGQuc291cmNlbWFwICYmIGNodW5rLm1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRNYXAgPSBzLmdlbmVyYXRlTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBjaHVuay5maWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlyZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwID0gY29tYmluZVNvdXJjZW1hcHMoY2h1bmsuZmlsZU5hbWUsIFtuZXh0TWFwLCBjaHVuay5tYXBdLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnRvVXJsID0gKCkgPT4gZ2VuU291cmNlTWFwVXJsKG1hcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsubWFwID0gbWFwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHNzck1hbmlmZXN0UGx1Z2luKGNvbmZpZykge1xuICAgIC8vIG1vZHVsZSBpZCA9PiBwcmVsb2FkIGFzc2V0cyBtYXBwaW5nXG4gICAgY29uc3Qgc3NyTWFuaWZlc3QgPSB7fTtcbiAgICBjb25zdCBiYXNlID0gY29uZmlnLmJhc2U7IC8vIFRPRE86YmFzZVxuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOnNzci1tYW5pZmVzdCcsXG4gICAgICAgIGdlbmVyYXRlQnVuZGxlKF9vcHRpb25zLCBidW5kbGUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBpbiBidW5kbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IGJ1bmRsZVtmaWxlXTtcbiAgICAgICAgICAgICAgICBpZiAoY2h1bmsudHlwZSA9PT0gJ2NodW5rJykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGNodW5rLm1vZHVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IG5vcm1hbGl6ZVBhdGgkMyhyZWxhdGl2ZSQyKGNvbmZpZy5yb290LCBpZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQ2h1bmtzID0gc3NyTWFuaWZlc3Rbbm9ybWFsaXplZElkXSA/PyAoc3NyTWFuaWZlc3Rbbm9ybWFsaXplZElkXSA9IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2h1bmsuaXNFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZENodW5rcy5wdXNoKGpvaW5VcmxTZWdtZW50cyhiYXNlLCBjaHVuay5maWxlTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxsaW5rPiB0YWdzIGZvciBlbnRyeSBjaHVua3MgYXJlIGFscmVhZHkgZ2VuZXJhdGVkIGluIHN0YXRpYyBIVE1MLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIG9ubHkgbmVlZCB0byByZWNvcmQgaW5mbyBmb3Igbm9uLWVudHJ5IGNodW5rcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuay52aXRlTWV0YWRhdGEuaW1wb3J0ZWRDc3MuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRDaHVua3MucHVzaChqb2luVXJsU2VnbWVudHMoYmFzZSwgZmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsudml0ZU1ldGFkYXRhLmltcG9ydGVkQXNzZXRzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRDaHVua3MucHVzaChqb2luVXJsU2VnbWVudHMoYmFzZSwgZmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rLmNvZGUuaW5jbHVkZXMocHJlbG9hZE1ldGhvZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIGNzcyBkZXBzIG1hcFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGNodW5rLmNvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0cyA9IHBhcnNlJGUoY29kZSlbMF0uZmlsdGVyKChpKSA9PiBpLm4gJiYgaS5kID4gLTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGUsIGUuaWR4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpbXBvcnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHM6IHN0YXJ0LCBlOiBlbmQsIG46IG5hbWUgfSA9IGltcG9ydHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgY2h1bmsgYmVpbmcgaW1wb3J0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gY29kZS5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lckZpbGVuYW1lID0gY2h1bmsuZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpdGVyYWwgaW1wb3J0IC0gdHJhY2UgZGlyZWN0IGltcG9ydHMgYW5kIGFkZCB0byBkZXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGREZXBzID0gKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT09IG93bmVyRmlsZW5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuYWx5emVkLmhhcyhmaWxlbmFtZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHl6ZWQuYWRkKGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gYnVuZGxlW2ZpbGVuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVuaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLnZpdGVNZXRhZGF0YS5pbXBvcnRlZENzcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMucHVzaChqb2luVXJsU2VnbWVudHMoYmFzZSwgZmlsZSkpOyAvLyBUT0RPOmJhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuay5pbXBvcnRzLmZvckVhY2goYWRkRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlID0gbm9ybWFsaXplUGF0aCQzKGpvaW4kMihkaXJuYW1lJDIoY2h1bmsuZmlsZU5hbWUpLCB1cmwuc2xpY2UoMSwgLTEpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZERlcHMobm9ybWFsaXplZEZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3JNYW5pZmVzdFtiYXNlbmFtZSQyKG5hbWUpXSA9IGRlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbWl0RmlsZSh7XG4gICAgICAgICAgICAgICAgZmlsZU5hbWU6IHR5cGVvZiBjb25maWcuYnVpbGQuc3NyTWFuaWZlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gY29uZmlnLmJ1aWxkLnNzck1hbmlmZXN0XG4gICAgICAgICAgICAgICAgICAgIDogJ3Nzci1tYW5pZmVzdC5qc29uJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgICAgICAgICAgIHNvdXJjZToganNvblN0YWJsZVN0cmluZ2lmeShzc3JNYW5pZmVzdCwgeyBzcGFjZTogMiB9KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbi8qKlxuICogQSBwbHVnaW4gdG8gcHJvdmlkZSBidWlsZCBsb2FkIGZhbGxiYWNrIGZvciBhcmJpdHJhcnkgcmVxdWVzdCB3aXRoIHF1ZXJpZXMuXG4gKi9cbmZ1bmN0aW9uIGxvYWRGYWxsYmFja1BsdWdpbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTpsb2FkLWZhbGxiYWNrJyxcbiAgICAgICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBhZGQgYGF3YWl0YCBoZXJlLCB3ZSBjb3VsZG4ndCBjYXRjaCB0aGUgZXJyb3IgaW4gcmVhZEZpbGVcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZXMkMi5yZWFkRmlsZShjbGVhblVybChpZCksICd1dGYtOCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZXMkMi5yZWFkRmlsZShpZCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUNob2tpZGFyT3B0aW9ucyhjb25maWcsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGlnbm9yZWQgPSBbXSwgLi4ub3RoZXJPcHRpb25zIH0gPSBvcHRpb25zID8/IHt9O1xuICAgIGNvbnN0IHJlc29sdmVkV2F0Y2hPcHRpb25zID0ge1xuICAgICAgICBpZ25vcmVkOiBbXG4gICAgICAgICAgICAnKiovLmdpdC8qKicsXG4gICAgICAgICAgICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgICAgICAgICAgICcqKi90ZXN0LXJlc3VsdHMvKionLFxuICAgICAgICAgICAgb3V0LmVzY2FwZVBhdGgoY29uZmlnLmNhY2hlRGlyKSArICcvKionLFxuICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoaWdub3JlZCkgPyBpZ25vcmVkIDogW2lnbm9yZWRdKSxcbiAgICAgICAgXSxcbiAgICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICAgICAgaWdub3JlUGVybWlzc2lvbkVycm9yczogdHJ1ZSxcbiAgICAgICAgLi4ub3RoZXJPcHRpb25zLFxuICAgIH07XG4gICAgcmV0dXJuIHJlc29sdmVkV2F0Y2hPcHRpb25zO1xufVxuXG4vKipcbiAqIG1ha2Ugc3VyZSBzeXN0ZW1qcyByZWdpc3RlciB3cmFwIHRvIGhhZCBjb21wbGV0ZSBwYXJhbWV0ZXJzIGluIHN5c3RlbSBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gY29tcGxldGVTeXN0ZW1XcmFwUGx1Z2luKCkge1xuICAgIGNvbnN0IFN5c3RlbUpTV3JhcFJFID0gL1N5c3RlbS5yZWdpc3RlclxcKC4qKFxcKGV4cG9ydHNcXCl8XFwoXFwpKS9nO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6ICd2aXRlOmZvcmNlLXN5c3RlbWpzLXdyYXAtY29tcGxldGUnLFxuICAgICAgICByZW5kZXJDaHVuayhjb2RlLCBjaHVuaywgb3B0cykge1xuICAgICAgICAgICAgaWYgKG9wdHMuZm9ybWF0ID09PSAnc3lzdGVtJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IGNvZGUucmVwbGFjZShTeXN0ZW1KU1dyYXBSRSwgKHMsIHMxKSA9PiBzLnJlcGxhY2UoczEsICcoZXhwb3J0cywgbW9kdWxlKScpKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwOiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuY29uc3QgYWxpYXMgPSB7XG4gICAganM6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JyxcbiAgICBjc3M6ICd0ZXh0L2NzcycsXG4gICAgaHRtbDogJ3RleHQvaHRtbCcsXG4gICAganNvbjogJ2FwcGxpY2F0aW9uL2pzb24nLFxufTtcbmZ1bmN0aW9uIHNlbmQkMShyZXEsIHJlcywgY29udGVudCwgdHlwZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHsgZXRhZyA9IGV0YWdfMShjb250ZW50LCB7IHdlYWs6IHRydWUgfSksIGNhY2hlQ29udHJvbCA9ICduby1jYWNoZScsIGhlYWRlcnMsIG1hcCwgfSA9IG9wdGlvbnM7XG4gICAgaWYgKHJlcy53cml0YWJsZUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlcS5oZWFkZXJzWydpZi1ub25lLW1hdGNoJ10gPT09IGV0YWcpIHtcbiAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSAzMDQ7XG4gICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCBhbGlhc1t0eXBlXSB8fCB0eXBlKTtcbiAgICByZXMuc2V0SGVhZGVyKCdDYWNoZS1Db250cm9sJywgY2FjaGVDb250cm9sKTtcbiAgICByZXMuc2V0SGVhZGVyKCdFdGFnJywgZXRhZyk7XG4gICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIobmFtZSwgaGVhZGVyc1tuYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaW5qZWN0IHNvdXJjZSBtYXAgcmVmZXJlbmNlXG4gICAgaWYgKG1hcCAmJiBtYXAubWFwcGluZ3MpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdqcycgfHwgdHlwZSA9PT0gJ2NzcycpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBnZXRDb2RlV2l0aFNvdXJjZW1hcCh0eXBlLCBjb250ZW50LnRvU3RyaW5nKCksIG1hcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVzLnN0YXR1c0NvZGUgPSAyMDA7XG4gICAgcmVzLmVuZChjb250ZW50KTtcbiAgICByZXR1cm47XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS92aXRlanMvdml0ZS9pc3N1ZXMvMjgyMCNpc3N1ZWNvbW1lbnQtODEyNDk1MDc5XG5jb25zdCBST09UX0ZJTEVTID0gW1xuICAgIC8vICcuZ2l0JyxcbiAgICAvLyBodHRwczovL3BucG0uanMub3JnL3dvcmtzcGFjZXMvXG4gICAgJ3BucG0td29ya3NwYWNlLnlhbWwnLFxuICAgIC8vIGh0dHBzOi8vcnVzaGpzLmlvL3BhZ2VzL2FkdmFuY2VkL2NvbmZpZ19maWxlcy9cbiAgICAvLyAncnVzaC5qc29uJyxcbiAgICAvLyBodHRwczovL254LmRldi9sYXRlc3QvcmVhY3QvZ2V0dGluZy1zdGFydGVkL254LXNldHVwXG4gICAgLy8gJ3dvcmtzcGFjZS5qc29uJyxcbiAgICAvLyAnbnguanNvbicsXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xlcm5hL2xlcm5hI2xlcm5hanNvblxuICAgICdsZXJuYS5qc29uJyxcbl07XG4vLyBucG06IGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y3L3VzaW5nLW5wbS93b3Jrc3BhY2VzI2luc3RhbGxpbmctd29ya3NwYWNlc1xuLy8geWFybjogaHR0cHM6Ly9jbGFzc2ljLnlhcm5wa2cuY29tL2VuL2RvY3Mvd29ya3NwYWNlcy8jdG9jLWhvdy10by11c2UtaXRcbmZ1bmN0aW9uIGhhc1dvcmtzcGFjZVBhY2thZ2VKU09OKHJvb3QpIHtcbiAgICBjb25zdCBwYXRoID0gam9pbiQyKHJvb3QsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZiAoIWlzRmlsZVJlYWRhYmxlKHBhdGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY29udGVudCA9IEpTT04ucGFyc2UoZnMkbC5yZWFkRmlsZVN5bmMocGF0aCwgJ3V0Zi04JykpIHx8IHt9O1xuICAgIHJldHVybiAhIWNvbnRlbnQud29ya3NwYWNlcztcbn1cbmZ1bmN0aW9uIGhhc1Jvb3RGaWxlKHJvb3QpIHtcbiAgICByZXR1cm4gUk9PVF9GSUxFUy5zb21lKChmaWxlKSA9PiBmcyRsLmV4aXN0c1N5bmMoam9pbiQyKHJvb3QsIGZpbGUpKSk7XG59XG5mdW5jdGlvbiBoYXNQYWNrYWdlSlNPTihyb290KSB7XG4gICAgY29uc3QgcGF0aCA9IGpvaW4kMihyb290LCAncGFja2FnZS5qc29uJyk7XG4gICAgcmV0dXJuIGZzJGwuZXhpc3RzU3luYyhwYXRoKTtcbn1cbi8qKlxuICogU2VhcmNoIHVwIGZvciB0aGUgbmVhcmVzdCBgcGFja2FnZS5qc29uYFxuICovXG5mdW5jdGlvbiBzZWFyY2hGb3JQYWNrYWdlUm9vdChjdXJyZW50LCByb290ID0gY3VycmVudCkge1xuICAgIGlmIChoYXNQYWNrYWdlSlNPTihjdXJyZW50KSlcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgY29uc3QgZGlyID0gZGlybmFtZSQyKGN1cnJlbnQpO1xuICAgIC8vIHJlYWNoIHRoZSBmcyByb290XG4gICAgaWYgKCFkaXIgfHwgZGlyID09PSBjdXJyZW50KVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICByZXR1cm4gc2VhcmNoRm9yUGFja2FnZVJvb3QoZGlyLCByb290KTtcbn1cbi8qKlxuICogU2VhcmNoIHVwIGZvciB0aGUgbmVhcmVzdCB3b3Jrc3BhY2Ugcm9vdFxuICovXG5mdW5jdGlvbiBzZWFyY2hGb3JXb3Jrc3BhY2VSb290KGN1cnJlbnQsIHJvb3QgPSBzZWFyY2hGb3JQYWNrYWdlUm9vdChjdXJyZW50KSkge1xuICAgIGlmIChoYXNSb290RmlsZShjdXJyZW50KSlcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgaWYgKGhhc1dvcmtzcGFjZVBhY2thZ2VKU09OKGN1cnJlbnQpKVxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICBjb25zdCBkaXIgPSBkaXJuYW1lJDIoY3VycmVudCk7XG4gICAgLy8gcmVhY2ggdGhlIGZzIHJvb3RcbiAgICBpZiAoIWRpciB8fCBkaXIgPT09IGN1cnJlbnQpXG4gICAgICAgIHJldHVybiByb290O1xuICAgIHJldHVybiBzZWFyY2hGb3JXb3Jrc3BhY2VSb290KGRpciwgcm9vdCk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVCdWlsZE9wdGlvbnMocmF3LCBsb2dnZXIsIHJvb3QpIHtcbiAgICBjb25zdCBkZXByZWNhdGVkUG9seWZpbGxNb2R1bGVQcmVsb2FkID0gcmF3Py5wb2x5ZmlsbE1vZHVsZVByZWxvYWQ7XG4gICAgaWYgKHJhdykge1xuICAgICAgICBjb25zdCB7IHBvbHlmaWxsTW9kdWxlUHJlbG9hZCwgLi4ucmVzdCB9ID0gcmF3O1xuICAgICAgICByYXcgPSByZXN0O1xuICAgICAgICBpZiAoZGVwcmVjYXRlZFBvbHlmaWxsTW9kdWxlUHJlbG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybigncG9seWZpbGxNb2R1bGVQcmVsb2FkIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb2R1bGVQcmVsb2FkLnBvbHlmaWxsIGluc3RlYWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRQb2x5ZmlsbE1vZHVsZVByZWxvYWQgPT09IGZhbHNlICYmXG4gICAgICAgICAgICByYXcubW9kdWxlUHJlbG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByYXcubW9kdWxlUHJlbG9hZCA9IHsgcG9seWZpbGw6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbW9kdWxlUHJlbG9hZCA9IHJhdz8ubW9kdWxlUHJlbG9hZDtcbiAgICBjb25zdCBkZWZhdWx0TW9kdWxlUHJlbG9hZCA9IHtcbiAgICAgICAgcG9seWZpbGw6IHRydWUsXG4gICAgfTtcbiAgICBjb25zdCBkZWZhdWx0QnVpbGRPcHRpb25zID0ge1xuICAgICAgICBvdXREaXI6ICdkaXN0JyxcbiAgICAgICAgYXNzZXRzRGlyOiAnYXNzZXRzJyxcbiAgICAgICAgYXNzZXRzSW5saW5lTGltaXQ6IDQwOTYsXG4gICAgICAgIGNzc0NvZGVTcGxpdDogIXJhdz8ubGliLFxuICAgICAgICBzb3VyY2VtYXA6IGZhbHNlLFxuICAgICAgICByb2xsdXBPcHRpb25zOiB7fSxcbiAgICAgICAgbWluaWZ5OiByYXc/LnNzciA/IGZhbHNlIDogJ2VzYnVpbGQnLFxuICAgICAgICB0ZXJzZXJPcHRpb25zOiB7fSxcbiAgICAgICAgd3JpdGU6IHRydWUsXG4gICAgICAgIGVtcHR5T3V0RGlyOiBudWxsLFxuICAgICAgICBjb3B5UHVibGljRGlyOiB0cnVlLFxuICAgICAgICBtYW5pZmVzdDogZmFsc2UsXG4gICAgICAgIGxpYjogZmFsc2UsXG4gICAgICAgIHNzcjogZmFsc2UsXG4gICAgICAgIHNzck1hbmlmZXN0OiBmYWxzZSxcbiAgICAgICAgc3NyRW1pdEFzc2V0czogZmFsc2UsXG4gICAgICAgIHJlcG9ydENvbXByZXNzZWRTaXplOiB0cnVlLFxuICAgICAgICBjaHVua1NpemVXYXJuaW5nTGltaXQ6IDUwMCxcbiAgICAgICAgd2F0Y2g6IG51bGwsXG4gICAgfTtcbiAgICBjb25zdCB1c2VyQnVpbGRPcHRpb25zID0gcmF3XG4gICAgICAgID8gbWVyZ2VDb25maWcoZGVmYXVsdEJ1aWxkT3B0aW9ucywgcmF3KVxuICAgICAgICA6IGRlZmF1bHRCdWlsZE9wdGlvbnM7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGYWxsYmFjayBvcHRpb25zIGluc3RlYWQgb2YgbWVyZ2luZ1xuICAgIGNvbnN0IHJlc29sdmVkID0ge1xuICAgICAgICB0YXJnZXQ6ICdtb2R1bGVzJyxcbiAgICAgICAgY3NzVGFyZ2V0OiBmYWxzZSxcbiAgICAgICAgLi4udXNlckJ1aWxkT3B0aW9ucyxcbiAgICAgICAgY29tbW9uanNPcHRpb25zOiB7XG4gICAgICAgICAgICBpbmNsdWRlOiBbL25vZGVfbW9kdWxlcy9dLFxuICAgICAgICAgICAgZXh0ZW5zaW9uczogWycuanMnLCAnLmNqcyddLFxuICAgICAgICAgICAgLi4udXNlckJ1aWxkT3B0aW9ucy5jb21tb25qc09wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIGR5bmFtaWNJbXBvcnRWYXJzT3B0aW9uczoge1xuICAgICAgICAgICAgd2Fybk9uRXJyb3I6IHRydWUsXG4gICAgICAgICAgICBleGNsdWRlOiBbL25vZGVfbW9kdWxlcy9dLFxuICAgICAgICAgICAgLi4udXNlckJ1aWxkT3B0aW9ucy5keW5hbWljSW1wb3J0VmFyc09wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlc29sdmUgdG8gZmFsc2UgfCBvYmplY3RcbiAgICAgICAgbW9kdWxlUHJlbG9hZDogbW9kdWxlUHJlbG9hZCA9PT0gZmFsc2VcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogdHlwZW9mIG1vZHVsZVByZWxvYWQgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRlZmF1bHRNb2R1bGVQcmVsb2FkLFxuICAgICAgICAgICAgICAgICAgICAuLi5tb2R1bGVQcmVsb2FkLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IGRlZmF1bHRNb2R1bGVQcmVsb2FkLFxuICAgIH07XG4gICAgLy8gaGFuZGxlIHNwZWNpYWwgYnVpbGQgdGFyZ2V0c1xuICAgIGlmIChyZXNvbHZlZC50YXJnZXQgPT09ICdtb2R1bGVzJykge1xuICAgICAgICByZXNvbHZlZC50YXJnZXQgPSBFU0JVSUxEX01PRFVMRVNfVEFSR0VUO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZXNvbHZlZC50YXJnZXQgPT09ICdlc25leHQnICYmIHJlc29sdmVkLm1pbmlmeSA9PT0gJ3RlcnNlcicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRlcnNlclBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmVSZXNvbHZlRnJvbVJvb3RXaXRoRmFsbGJhY2socm9vdCwgJ3RlcnNlci9wYWNrYWdlLmpzb24nKTtcbiAgICAgICAgICAgIGNvbnN0IHRlcnNlclBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcyRsLnJlYWRGaWxlU3luYyh0ZXJzZXJQYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpKTtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0ZXJzZXJQYWNrYWdlSnNvbi52ZXJzaW9uLnNwbGl0KCcuJyk7XG4gICAgICAgICAgICBpZiAodlswXSA9PT0gJzUnICYmIHZbMV0gPCAxNikge1xuICAgICAgICAgICAgICAgIC8vIGVzbmV4dCArIHRlcnNlciA1LjE2PDogbGltaXQgdG8gZXMyMDIxIHNvIGl0IGNhbiBiZSBtaW5pZmllZCBieSB0ZXJzZXJcbiAgICAgICAgICAgICAgICByZXNvbHZlZC50YXJnZXQgPSAnZXMyMDIxJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCB7IH1cbiAgICB9XG4gICAgaWYgKCFyZXNvbHZlZC5jc3NUYXJnZXQpIHtcbiAgICAgICAgcmVzb2x2ZWQuY3NzVGFyZ2V0ID0gcmVzb2x2ZWQudGFyZ2V0O1xuICAgIH1cbiAgICAvLyBub3JtYWxpemUgZmFsc2Ugc3RyaW5nIGludG8gYWN0dWFsIGZhbHNlXG4gICAgaWYgKHJlc29sdmVkLm1pbmlmeSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXNvbHZlZC5taW5pZnkgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHJlc29sdmVkLm1pbmlmeSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXNvbHZlZC5taW5pZnkgPSAnZXNidWlsZCc7XG4gICAgfVxuICAgIGlmIChyZXNvbHZlZC5jc3NNaW5pZnkgPT0gbnVsbCkge1xuICAgICAgICByZXNvbHZlZC5jc3NNaW5pZnkgPSAhIXJlc29sdmVkLm1pbmlmeTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkO1xufVxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJ1aWxkUGx1Z2lucyhjb25maWcpIHtcbiAgICBjb25zdCBvcHRpb25zID0gY29uZmlnLmJ1aWxkO1xuICAgIGNvbnN0IHsgY29tbW9uanNPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHVzZVBsdWdpbkNvbW1vbmpzID0gIUFycmF5LmlzQXJyYXkoY29tbW9uanNPcHRpb25zPy5pbmNsdWRlKSB8fFxuICAgICAgICBjb21tb25qc09wdGlvbnM/LmluY2x1ZGUubGVuZ3RoICE9PSAwO1xuICAgIGNvbnN0IHJvbGx1cE9wdGlvbnNQbHVnaW5zID0gb3B0aW9ucy5yb2xsdXBPcHRpb25zLnBsdWdpbnM7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJlOiBbXG4gICAgICAgICAgICBjb21wbGV0ZVN5c3RlbVdyYXBQbHVnaW4oKSxcbiAgICAgICAgICAgIC4uLihvcHRpb25zLndhdGNoID8gW2Vuc3VyZVdhdGNoUGx1Z2luKCldIDogW10pLFxuICAgICAgICAgICAgd2F0Y2hQYWNrYWdlRGF0YVBsdWdpbihjb25maWcpLFxuICAgICAgICAgICAgLi4uKHVzZVBsdWdpbkNvbW1vbmpzID8gW2NvbW1vbmpzKG9wdGlvbnMuY29tbW9uanNPcHRpb25zKV0gOiBbXSksXG4gICAgICAgICAgICBkYXRhVVJJUGx1Z2luKCksXG4gICAgICAgICAgICAuLi4oYXdhaXQgYXN5bmNGbGF0dGVuKEFycmF5LmlzQXJyYXkocm9sbHVwT3B0aW9uc1BsdWdpbnMpXG4gICAgICAgICAgICAgICAgPyByb2xsdXBPcHRpb25zUGx1Z2luc1xuICAgICAgICAgICAgICAgIDogW3JvbGx1cE9wdGlvbnNQbHVnaW5zXSkpLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgXSxcbiAgICAgICAgcG9zdDogW1xuICAgICAgICAgICAgYnVpbGRJbXBvcnRBbmFseXNpc1BsdWdpbihjb25maWcpLFxuICAgICAgICAgICAgLi4uKGNvbmZpZy5lc2J1aWxkICE9PSBmYWxzZSA/IFtidWlsZEVzYnVpbGRQbHVnaW4oY29uZmlnKV0gOiBbXSksXG4gICAgICAgICAgICAuLi4ob3B0aW9ucy5taW5pZnkgPyBbdGVyc2VyUGx1Z2luKGNvbmZpZyldIDogW10pLFxuICAgICAgICAgICAgLi4uKG9wdGlvbnMubWFuaWZlc3QgPyBbbWFuaWZlc3RQbHVnaW4oY29uZmlnKV0gOiBbXSksXG4gICAgICAgICAgICAuLi4ob3B0aW9ucy5zc3JNYW5pZmVzdCA/IFtzc3JNYW5pZmVzdFBsdWdpbihjb25maWcpXSA6IFtdKSxcbiAgICAgICAgICAgIC4uLighY29uZmlnLmlzV29ya2VyID8gW2J1aWxkUmVwb3J0ZXJQbHVnaW4oY29uZmlnKV0gOiBbXSksXG4gICAgICAgICAgICBsb2FkRmFsbGJhY2tQbHVnaW4oKSxcbiAgICAgICAgXSxcbiAgICB9O1xufVxuLyoqXG4gKiBCdW5kbGVzIHRoZSBhcHAgZm9yIHByb2R1Y3Rpb24uXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSBjb250YWluaW5nIHRoZSBidWlsZCByZXN1bHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGlubGluZUNvbmZpZyA9IHt9KSB7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVzb2x2ZUNvbmZpZyhpbmxpbmVDb25maWcsICdidWlsZCcsICdwcm9kdWN0aW9uJywgJ3Byb2R1Y3Rpb24nKTtcbiAgICBjb25zdCBvcHRpb25zID0gY29uZmlnLmJ1aWxkO1xuICAgIGNvbnN0IHNzciA9ICEhb3B0aW9ucy5zc3I7XG4gICAgY29uc3QgbGliT3B0aW9ucyA9IG9wdGlvbnMubGliO1xuICAgIGNvbmZpZy5sb2dnZXIuaW5mbyhwaWNvY29sb3JzRXhwb3J0cy5jeWFuKGB2aXRlIHYke1ZFUlNJT04kMX0gJHtwaWNvY29sb3JzRXhwb3J0cy5ncmVlbihgYnVpbGRpbmcgJHtzc3IgPyBgU1NSIGJ1bmRsZSBgIDogYGB9Zm9yICR7Y29uZmlnLm1vZGV9Li4uYCl9YCkpO1xuICAgIGNvbnN0IHJlc29sdmUgPSAocCkgPT4gcGF0aCRvLnJlc29sdmUoY29uZmlnLnJvb3QsIHApO1xuICAgIGNvbnN0IGlucHV0ID0gbGliT3B0aW9uc1xuICAgICAgICA/IG9wdGlvbnMucm9sbHVwT3B0aW9ucz8uaW5wdXQgfHxcbiAgICAgICAgICAgICh0eXBlb2YgbGliT3B0aW9ucy5lbnRyeSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IHJlc29sdmUobGliT3B0aW9ucy5lbnRyeSlcbiAgICAgICAgICAgICAgICA6IEFycmF5LmlzQXJyYXkobGliT3B0aW9ucy5lbnRyeSlcbiAgICAgICAgICAgICAgICAgICAgPyBsaWJPcHRpb25zLmVudHJ5Lm1hcChyZXNvbHZlKVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhsaWJPcHRpb25zLmVudHJ5KS5tYXAoKFthbGlhcywgZmlsZV0pID0+IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgXSkpKVxuICAgICAgICA6IHR5cGVvZiBvcHRpb25zLnNzciA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gcmVzb2x2ZShvcHRpb25zLnNzcilcbiAgICAgICAgICAgIDogb3B0aW9ucy5yb2xsdXBPcHRpb25zPy5pbnB1dCB8fCByZXNvbHZlKCdpbmRleC5odG1sJyk7XG4gICAgaWYgKHNzciAmJiB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnICYmIGlucHV0LmVuZHNXaXRoKCcuaHRtbCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgcm9sbHVwT3B0aW9ucy5pbnB1dCBzaG91bGQgbm90IGJlIGFuIGh0bWwgZmlsZSB3aGVuIGJ1aWxkaW5nIGZvciBTU1IuIGAgK1xuICAgICAgICAgICAgYFBsZWFzZSBzcGVjaWZ5IGEgZGVkaWNhdGVkIFNTUiBlbnRyeS5gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0RGlyID0gcmVzb2x2ZShvcHRpb25zLm91dERpcik7XG4gICAgLy8gaW5qZWN0IHNzciBhcmcgdG8gcGx1Z2luIGxvYWQvdHJhbnNmb3JtIGhvb2tzXG4gICAgY29uc3QgcGx1Z2lucyA9IChzc3IgPyBjb25maWcucGx1Z2lucy5tYXAoKHApID0+IGluamVjdFNzckZsYWdUb0hvb2tzKHApKSA6IGNvbmZpZy5wbHVnaW5zKTtcbiAgICBjb25zdCB1c2VyRXh0ZXJuYWwgPSBvcHRpb25zLnJvbGx1cE9wdGlvbnM/LmV4dGVybmFsO1xuICAgIGxldCBleHRlcm5hbCA9IHVzZXJFeHRlcm5hbDtcbiAgICAvLyBJbiBDSlMsIHdlIGNhbiBwYXNzIHRoZSBleHRlcm5hbHMgdG8gcm9sbHVwIGFzIGlzLiBJbiBFU00sIHdlIG5lZWQgdG9cbiAgICAvLyBkbyBpdCBpbiB0aGUgcmVzb2x2ZSBwbHVnaW4gc28gd2UgY2FuIGFkZCB0aGUgcmVzb2x2ZWQgZXh0ZW5zaW9uIGZvclxuICAgIC8vIGRlZXAgbm9kZV9tb2R1bGVzIGltcG9ydHNcbiAgICBpZiAoc3NyICYmIGNvbmZpZy5sZWdhY3k/LmJ1aWxkU3NyQ2pzRXh0ZXJuYWxIZXVyaXN0aWNzKSB7XG4gICAgICAgIGV4dGVybmFsID0gYXdhaXQgY2pzU3NyUmVzb2x2ZUV4dGVybmFsKGNvbmZpZywgdXNlckV4dGVybmFsKTtcbiAgICB9XG4gICAgaWYgKGlzRGVwc09wdGltaXplckVuYWJsZWQoY29uZmlnLCBzc3IpKSB7XG4gICAgICAgIGF3YWl0IGluaXREZXBzT3B0aW1pemVyKGNvbmZpZyk7XG4gICAgfVxuICAgIGNvbnN0IHJvbGx1cE9wdGlvbnMgPSB7XG4gICAgICAgIGNvbnRleHQ6ICdnbG9iYWxUaGlzJyxcbiAgICAgICAgcHJlc2VydmVFbnRyeVNpZ25hdHVyZXM6IHNzclxuICAgICAgICAgICAgPyAnYWxsb3ctZXh0ZW5zaW9uJ1xuICAgICAgICAgICAgOiBsaWJPcHRpb25zXG4gICAgICAgICAgICAgICAgPyAnc3RyaWN0J1xuICAgICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgIGNhY2hlOiBjb25maWcuYnVpbGQud2F0Y2ggPyB1bmRlZmluZWQgOiBmYWxzZSxcbiAgICAgICAgLi4ub3B0aW9ucy5yb2xsdXBPcHRpb25zLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcGx1Z2lucyxcbiAgICAgICAgZXh0ZXJuYWwsXG4gICAgICAgIG9ud2Fybih3YXJuaW5nLCB3YXJuKSB7XG4gICAgICAgICAgICBvblJvbGx1cFdhcm5pbmcod2FybmluZywgd2FybiwgY29uZmlnKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IG91dHB1dEJ1aWxkRXJyb3IgPSAoZSkgPT4ge1xuICAgICAgICBsZXQgbXNnID0gcGljb2NvbG9yc0V4cG9ydHMucmVkKChlLnBsdWdpbiA/IGBbJHtlLnBsdWdpbn1dIGAgOiAnJykgKyBlLm1lc3NhZ2UpO1xuICAgICAgICBpZiAoZS5pZCkge1xuICAgICAgICAgICAgbXNnICs9IGBcXG5maWxlOiAke3BpY29jb2xvcnNFeHBvcnRzLmN5YW4oZS5pZCArIChlLmxvYyA/IGA6JHtlLmxvYy5saW5lfToke2UubG9jLmNvbHVtbn1gIDogJycpKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlLmZyYW1lKSB7XG4gICAgICAgICAgICBtc2cgKz0gYFxcbmAgKyBwaWNvY29sb3JzRXhwb3J0cy55ZWxsb3coZS5mcmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnLmxvZ2dlci5lcnJvcihtc2csIHsgZXJyb3I6IGUgfSk7XG4gICAgfTtcbiAgICBsZXQgYnVuZGxlO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkT3V0cHV0T3B0aW9ucyA9IChvdXRwdXQgPSB7fSkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlL2lzc3Vlcy81ODEyI2lzc3VlY29tbWVudC05ODQzNDU2MThcbiAgICAgICAgICAgIGlmIChvdXRwdXQub3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmxvZ2dlci53YXJuKGBZb3UndmUgc2V0IFwicm9sbHVwT3B0aW9ucy5vdXRwdXQub3V0cHV0XCIgaW4geW91ciBjb25maWcuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgVGhpcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIG92ZXJyaWRlIGFsbCBWaXRlLmpzIGRlZmF1bHQgb3V0cHV0IG9wdGlvbnMuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgUGxlYXNlIHVzZSBcInJvbGx1cE9wdGlvbnMub3V0cHV0XCIgaW5zdGVhZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNzck5vZGVCdWlsZCA9IHNzciAmJiBjb25maWcuc3NyLnRhcmdldCA9PT0gJ25vZGUnO1xuICAgICAgICAgICAgY29uc3Qgc3NyV29ya2VyQnVpbGQgPSBzc3IgJiYgY29uZmlnLnNzci50YXJnZXQgPT09ICd3ZWJ3b3JrZXInO1xuICAgICAgICAgICAgY29uc3QgY2pzU3NyQnVpbGQgPSBzc3IgJiYgY29uZmlnLnNzci5mb3JtYXQgPT09ICdjanMnO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0ID0gb3V0cHV0LmZvcm1hdCB8fCAoY2pzU3NyQnVpbGQgPyAnY2pzJyA6ICdlcycpO1xuICAgICAgICAgICAgY29uc3QganNFeHQgPSBzc3JOb2RlQnVpbGQgfHwgbGliT3B0aW9uc1xuICAgICAgICAgICAgICAgID8gcmVzb2x2ZU91dHB1dEpzRXh0ZW5zaW9uKGZvcm1hdCwgZ2V0UGtnSnNvbihjb25maWcucm9vdCk/LnR5cGUpXG4gICAgICAgICAgICAgICAgOiAnanMnO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkaXI6IG91dERpcixcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGZvcm1hdCBpcyAnZXMnIGZvciByZWd1bGFyIGFuZCBmb3IgU1NSIGJ1aWxkc1xuICAgICAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgICAgICBleHBvcnRzOiBjanNTc3JCdWlsZCA/ICduYW1lZCcgOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgc291cmNlbWFwOiBvcHRpb25zLnNvdXJjZW1hcCxcbiAgICAgICAgICAgICAgICBuYW1lOiBsaWJPcHRpb25zID8gbGliT3B0aW9ucy5uYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIC8vIGVzMjAxNSBlbmFibGVzIGBnZW5lcmF0ZWRDb2RlLnN5bWJvbHNgXG4gICAgICAgICAgICAgICAgLy8gLSAjNzY0IGFkZCBgU3ltYm9sLnRvU3RyaW5nVGFnYCB3aGVuIGJ1aWxkIGVzIG1vZHVsZSBpbnRvIGNqcyBjaHVua1xuICAgICAgICAgICAgICAgIC8vIC0gIzEwNDggYWRkIGBTeW1ib2wudG9TdHJpbmdUYWdgIGZvciBtb2R1bGUgZGVmYXVsdCBleHBvcnRcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZWRDb2RlOiAnZXMyMDE1JyxcbiAgICAgICAgICAgICAgICBlbnRyeUZpbGVOYW1lczogc3NyXG4gICAgICAgICAgICAgICAgICAgID8gYFtuYW1lXS4ke2pzRXh0fWBcbiAgICAgICAgICAgICAgICAgICAgOiBsaWJPcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICh7IG5hbWUgfSkgPT4gcmVzb2x2ZUxpYkZpbGVuYW1lKGxpYk9wdGlvbnMsIGZvcm1hdCwgbmFtZSwgY29uZmlnLnJvb3QsIGpzRXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXRoJG8ucG9zaXguam9pbihvcHRpb25zLmFzc2V0c0RpciwgYFtuYW1lXS1baGFzaF0uJHtqc0V4dH1gKSxcbiAgICAgICAgICAgICAgICBjaHVua0ZpbGVOYW1lczogbGliT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICA/IGBbbmFtZV0tW2hhc2hdLiR7anNFeHR9YFxuICAgICAgICAgICAgICAgICAgICA6IHBhdGgkby5wb3NpeC5qb2luKG9wdGlvbnMuYXNzZXRzRGlyLCBgW25hbWVdLVtoYXNoXS4ke2pzRXh0fWApLFxuICAgICAgICAgICAgICAgIGFzc2V0RmlsZU5hbWVzOiBsaWJPcHRpb25zXG4gICAgICAgICAgICAgICAgICAgID8gYFtuYW1lXS5bZXh0XWBcbiAgICAgICAgICAgICAgICAgICAgOiBwYXRoJG8ucG9zaXguam9pbihvcHRpb25zLmFzc2V0c0RpciwgYFtuYW1lXS1baGFzaF0uW2V4dF1gKSxcbiAgICAgICAgICAgICAgICBpbmxpbmVEeW5hbWljSW1wb3J0czogb3V0cHV0LmZvcm1hdCA9PT0gJ3VtZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZvcm1hdCA9PT0gJ2lpZmUnIHx8XG4gICAgICAgICAgICAgICAgICAgIChzc3JXb3JrZXJCdWlsZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgT2JqZWN0LmtleXMoaW5wdXQpLmxlbmd0aCA9PT0gMSkpLFxuICAgICAgICAgICAgICAgIC4uLm91dHB1dCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIC8vIHJlc29sdmUgbGliIG1vZGUgb3V0cHV0c1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gcmVzb2x2ZUJ1aWxkT3V0cHV0cyhvcHRpb25zLnJvbGx1cE9wdGlvbnM/Lm91dHB1dCwgbGliT3B0aW9ucywgY29uZmlnLmxvZ2dlcik7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRPdXRwdXRzID0gW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG91dHB1dHMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc29sdmVkT3V0cHV0IG9mIG91dHB1dHMpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkT3V0cHV0cy5wdXNoKGJ1aWxkT3V0cHV0T3B0aW9ucyhyZXNvbHZlZE91dHB1dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbm9ybWFsaXplZE91dHB1dHMucHVzaChidWlsZE91dHB1dE9wdGlvbnMob3V0cHV0cykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG91dERpcnMgPSBub3JtYWxpemVkT3V0cHV0cy5tYXAoKHsgZGlyIH0pID0+IHJlc29sdmUoZGlyKSk7XG4gICAgICAgIC8vIHdhdGNoIGZpbGUgY2hhbmdlcyB3aXRoIHJvbGx1cFxuICAgICAgICBpZiAoY29uZmlnLmJ1aWxkLndhdGNoKSB7XG4gICAgICAgICAgICBjb25maWcubG9nZ2VyLmluZm8ocGljb2NvbG9yc0V4cG9ydHMuY3lhbihgXFxud2F0Y2hpbmcgZm9yIGZpbGUgY2hhbmdlcy4uLmApKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ2hva2lkYXJPcHRpb25zID0gcmVzb2x2ZUNob2tpZGFyT3B0aW9ucyhjb25maWcsIGNvbmZpZy5idWlsZC53YXRjaC5jaG9raWRhcik7XG4gICAgICAgICAgICBjb25zdCB7IHdhdGNoIH0gPSBhd2FpdCBpbXBvcnQoJ3JvbGx1cCcpO1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKHtcbiAgICAgICAgICAgICAgICAuLi5yb2xsdXBPcHRpb25zLFxuICAgICAgICAgICAgICAgIG91dHB1dDogbm9ybWFsaXplZE91dHB1dHMsXG4gICAgICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29uZmlnLmJ1aWxkLndhdGNoLFxuICAgICAgICAgICAgICAgICAgICBjaG9raWRhcjogcmVzb2x2ZWRDaG9raWRhck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd2F0Y2hlci5vbignZXZlbnQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0JVTkRMRV9TVEFSVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5pbmZvKHBpY29jb2xvcnNFeHBvcnRzLmN5YW4oYFxcbmJ1aWxkIHN0YXJ0ZWQuLi5gKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLndyaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlT3V0RGlyKG91dERpcnMsIG9wdGlvbnMuZW1wdHlPdXREaXIsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQuY29kZSA9PT0gJ0JVTkRMRV9FTkQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnJlc3VsdC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLmluZm8ocGljb2NvbG9yc0V4cG9ydHMuY3lhbihgYnVpbHQgaW4gJHtldmVudC5kdXJhdGlvbn1tcy5gKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LmNvZGUgPT09ICdFUlJPUicpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVpbGRFcnJvcihldmVudC5lcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gd2F0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyB3cml0ZSBvciBnZW5lcmF0ZSBmaWxlcyB3aXRoIHJvbGx1cFxuICAgICAgICBjb25zdCB7IHJvbGx1cCB9ID0gYXdhaXQgaW1wb3J0KCdyb2xsdXAnKTtcbiAgICAgICAgYnVuZGxlID0gYXdhaXQgcm9sbHVwKHJvbGx1cE9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy53cml0ZSkge1xuICAgICAgICAgICAgcHJlcGFyZU91dERpcihvdXREaXJzLCBvcHRpb25zLmVtcHR5T3V0RGlyLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBub3JtYWxpemVkT3V0cHV0cykge1xuICAgICAgICAgICAgcmVzLnB1c2goYXdhaXQgYnVuZGxlW29wdGlvbnMud3JpdGUgPyAnd3JpdGUnIDogJ2dlbmVyYXRlJ10ob3V0cHV0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob3V0cHV0cykgPyByZXMgOiByZXNbMF07XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIG91dHB1dEJ1aWxkRXJyb3IoZSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBpZiAoYnVuZGxlKVxuICAgICAgICAgICAgYXdhaXQgYnVuZGxlLmNsb3NlKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZU91dERpcihvdXREaXJzLCBlbXB0eU91dERpciwgY29uZmlnKSB7XG4gICAgY29uc3Qgbm9uRHVwbGljYXRlRGlycyA9IG5ldyBTZXQob3V0RGlycyk7XG4gICAgbGV0IG91dHNpZGUgPSBmYWxzZTtcbiAgICBpZiAoZW1wdHlPdXREaXIgPT0gbnVsbCkge1xuICAgICAgICBmb3IgKGNvbnN0IG91dERpciBvZiBub25EdXBsaWNhdGVEaXJzKSB7XG4gICAgICAgICAgICBpZiAoZnMkbC5leGlzdHNTeW5jKG91dERpcikgJiZcbiAgICAgICAgICAgICAgICAhbm9ybWFsaXplUGF0aCQzKG91dERpcikuc3RhcnRzV2l0aChjb25maWcucm9vdCArICcvJykpIHtcbiAgICAgICAgICAgICAgICAvLyB3YXJuIGlmIG91dERpciBpcyBvdXRzaWRlIG9mIHJvb3RcbiAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLndhcm4ocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KGBcXG4ke3BpY29jb2xvcnNFeHBvcnRzLmJvbGQoYCghKWApfSBvdXREaXIgJHtwaWNvY29sb3JzRXhwb3J0cy53aGl0ZShwaWNvY29sb3JzRXhwb3J0cy5kaW0ob3V0RGlyKSl9IGlzIG5vdCBpbnNpZGUgcHJvamVjdCByb290IGFuZCB3aWxsIG5vdCBiZSBlbXB0aWVkLlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgVXNlIC0tZW1wdHlPdXREaXIgdG8gb3ZlcnJpZGUuXFxuYCkpO1xuICAgICAgICAgICAgICAgIG91dHNpZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3V0RGlyIG9mIG5vbkR1cGxpY2F0ZURpcnMpIHtcbiAgICAgICAgaWYgKCFvdXRzaWRlICYmIGVtcHR5T3V0RGlyICE9PSBmYWxzZSAmJiBmcyRsLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgICAgICAgICAgLy8gc2tpcCB0aG9zZSBvdGhlciBvdXREaXJzIHdoaWNoIGFyZSBuZXN0ZWQgaW4gY3VycmVudCBvdXREaXJcbiAgICAgICAgICAgIGNvbnN0IHNraXBEaXJzID0gb3V0RGlyc1xuICAgICAgICAgICAgICAgIC5tYXAoKGRpcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlID0gcGF0aCRvLnJlbGF0aXZlKG91dERpciwgZGlyKTtcbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpdmUgJiZcbiAgICAgICAgICAgICAgICAgICAgIXJlbGF0aXZlLnN0YXJ0c1dpdGgoJy4uJykgJiZcbiAgICAgICAgICAgICAgICAgICAgIXBhdGgkby5pc0Fic29sdXRlKHJlbGF0aXZlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgIGVtcHR5RGlyKG91dERpciwgWy4uLnNraXBEaXJzLCAnLmdpdCddKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmJ1aWxkLmNvcHlQdWJsaWNEaXIgJiZcbiAgICAgICAgICAgIGNvbmZpZy5wdWJsaWNEaXIgJiZcbiAgICAgICAgICAgIGZzJGwuZXhpc3RzU3luYyhjb25maWcucHVibGljRGlyKSkge1xuICAgICAgICAgICAgY29weURpcihjb25maWcucHVibGljRGlyLCBvdXREaXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0UGtnSnNvbihyb290KSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UobG9va3VwRmlsZShyb290LCBbJ3BhY2thZ2UuanNvbiddKSB8fCBge31gKTtcbn1cbmZ1bmN0aW9uIGdldFBrZ05hbWUobmFtZSkge1xuICAgIHJldHVybiBuYW1lPy5zdGFydHNXaXRoKCdAJykgPyBuYW1lLnNwbGl0KCcvJylbMV0gOiBuYW1lO1xufVxuZnVuY3Rpb24gcmVzb2x2ZU91dHB1dEpzRXh0ZW5zaW9uKGZvcm1hdCwgdHlwZSA9ICdjb21tb25qcycpIHtcbiAgICBpZiAodHlwZSA9PT0gJ21vZHVsZScpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCA9PT0gJ2NqcycgfHwgZm9ybWF0ID09PSAndW1kJyA/ICdjanMnIDogJ2pzJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQgPT09ICdlcycgPyAnbWpzJyA6ICdqcyc7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUxpYkZpbGVuYW1lKGxpYk9wdGlvbnMsIGZvcm1hdCwgZW50cnlOYW1lLCByb290LCBleHRlbnNpb24pIHtcbiAgICBpZiAodHlwZW9mIGxpYk9wdGlvbnMuZmlsZU5hbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGxpYk9wdGlvbnMuZmlsZU5hbWUoZm9ybWF0LCBlbnRyeU5hbWUpO1xuICAgIH1cbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGdldFBrZ0pzb24ocm9vdCk7XG4gICAgY29uc3QgbmFtZSA9IGxpYk9wdGlvbnMuZmlsZU5hbWUgfHxcbiAgICAgICAgKHR5cGVvZiBsaWJPcHRpb25zLmVudHJ5ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBnZXRQa2dOYW1lKHBhY2thZ2VKc29uLm5hbWUpXG4gICAgICAgICAgICA6IGVudHJ5TmFtZSk7XG4gICAgaWYgKCFuYW1lKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hbWUgaW4gcGFja2FnZS5qc29uIGlzIHJlcXVpcmVkIGlmIG9wdGlvbiBcImJ1aWxkLmxpYi5maWxlTmFtZVwiIGlzIG5vdCBwcm92aWRlZC4nKTtcbiAgICBleHRlbnNpb24gPz8gKGV4dGVuc2lvbiA9IHJlc29sdmVPdXRwdXRKc0V4dGVuc2lvbihmb3JtYXQsIHBhY2thZ2VKc29uLnR5cGUpKTtcbiAgICBpZiAoZm9ybWF0ID09PSAnY2pzJyB8fCBmb3JtYXQgPT09ICdlcycpIHtcbiAgICAgICAgcmV0dXJuIGAke25hbWV9LiR7ZXh0ZW5zaW9ufWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtuYW1lfS4ke2Zvcm1hdH0uJHtleHRlbnNpb259YDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVCdWlsZE91dHB1dHMob3V0cHV0cywgbGliT3B0aW9ucywgbG9nZ2VyKSB7XG4gICAgaWYgKGxpYk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbGliSGFzTXVsdGlwbGVFbnRyaWVzID0gdHlwZW9mIGxpYk9wdGlvbnMuZW50cnkgIT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKGxpYk9wdGlvbnMuZW50cnkpLmxlbmd0aCA+IDE7XG4gICAgICAgIGNvbnN0IGxpYkZvcm1hdHMgPSBsaWJPcHRpb25zLmZvcm1hdHMgfHxcbiAgICAgICAgICAgIChsaWJIYXNNdWx0aXBsZUVudHJpZXMgPyBbJ2VzJywgJ2NqcyddIDogWydlcycsICd1bWQnXSk7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvdXRwdXRzKSkge1xuICAgICAgICAgICAgaWYgKGxpYkZvcm1hdHMuaW5jbHVkZXMoJ3VtZCcpIHx8IGxpYkZvcm1hdHMuaW5jbHVkZXMoJ2lpZmUnKSkge1xuICAgICAgICAgICAgICAgIGlmIChsaWJIYXNNdWx0aXBsZUVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBlbnRyeSBwb2ludHMgYXJlIG5vdCBzdXBwb3J0ZWQgd2hlbiBvdXRwdXQgZm9ybWF0cyBpbmNsdWRlIFwidW1kXCIgb3IgXCJpaWZlXCIuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbGliT3B0aW9ucy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3B0aW9uIFwiYnVpbGQubGliLm5hbWVcIiBpcyByZXF1aXJlZCB3aGVuIG91dHB1dCBmb3JtYXRzIGluY2x1ZGUgXCJ1bWRcIiBvciBcImlpZmVcIi4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbGliRm9ybWF0cy5tYXAoKGZvcm1hdCkgPT4gKHsgLi4ub3V0cHV0cywgZm9ybWF0IH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCeSB0aGlzIHBvaW50LCB3ZSBrbm93IFwib3V0cHV0c1wiIGlzIGFuIEFycmF5LlxuICAgICAgICBpZiAobGliT3B0aW9ucy5mb3JtYXRzKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihwaWNvY29sb3JzRXhwb3J0cy55ZWxsb3coJ1wiYnVpbGQubGliLmZvcm1hdHNcIiB3aWxsIGJlIGlnbm9yZWQgYmVjYXVzZSBcImJ1aWxkLnJvbGx1cE9wdGlvbnMub3V0cHV0XCIgaXMgYWxyZWFkeSBhbiBhcnJheSBmb3JtYXQuJykpO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dHMuZm9yRWFjaCgob3V0cHV0KSA9PiB7XG4gICAgICAgICAgICBpZiAoWyd1bWQnLCAnaWlmZSddLmluY2x1ZGVzKG91dHB1dC5mb3JtYXQpICYmICFvdXRwdXQubmFtZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW50cmllcyBpbiBcImJ1aWxkLnJvbGx1cE9wdGlvbnMub3V0cHV0XCIgbXVzdCBzcGVjaWZ5IFwibmFtZVwiIHdoZW4gdGhlIGZvcm1hdCBpcyBcInVtZFwiIG9yIFwiaWlmZVwiLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dHM7XG59XG5jb25zdCB3YXJuaW5nSWdub3JlTGlzdCA9IFtgQ0lSQ1VMQVJfREVQRU5ERU5DWWAsIGBUSElTX0lTX1VOREVGSU5FRGBdO1xuY29uc3QgZHluYW1pY0ltcG9ydFdhcm5pbmdJZ25vcmVMaXN0ID0gW1xuICAgIGBVbnN1cHBvcnRlZCBleHByZXNzaW9uYCxcbiAgICBgc3RhdGljYWxseSBhbmFseXplZGAsXG5dO1xuZnVuY3Rpb24gb25Sb2xsdXBXYXJuaW5nKHdhcm5pbmcsIHdhcm4sIGNvbmZpZykge1xuICAgIGlmICh3YXJuaW5nLmNvZGUgPT09ICdVTlJFU09MVkVEX0lNUE9SVCcpIHtcbiAgICAgICAgY29uc3QgaWQgPSB3YXJuaW5nLmlkO1xuICAgICAgICBjb25zdCBleHBvcnRlciA9IHdhcm5pbmcuZXhwb3J0ZXI7XG4gICAgICAgIC8vIHRocm93IHVubGVzcyBpdCdzIGNvbW1vbmpzIGV4dGVybmFsLi4uXG4gICAgICAgIGlmICghaWQgfHwgIS9cXD9jb21tb25qcy1leHRlcm5hbCQvLnRlc3QoaWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFt2aXRlXTogUm9sbHVwIGZhaWxlZCB0byByZXNvbHZlIGltcG9ydCBcIiR7ZXhwb3J0ZXJ9XCIgZnJvbSBcIiR7aWR9XCIuXFxuYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgdW5pbnRlbmRlZCBiZWNhdXNlIGl0IGNhbiBicmVhayB5b3VyIGFwcGxpY2F0aW9uIGF0IHJ1bnRpbWUuXFxuYCArXG4gICAgICAgICAgICAgICAgYElmIHlvdSBkbyB3YW50IHRvIGV4dGVybmFsaXplIHRoaXMgbW9kdWxlIGV4cGxpY2l0bHkgYWRkIGl0IHRvXFxuYCArXG4gICAgICAgICAgICAgICAgYFxcYGJ1aWxkLnJvbGx1cE9wdGlvbnMuZXh0ZXJuYWxcXGBgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAod2FybmluZy5wbHVnaW4gPT09ICdyb2xsdXAtcGx1Z2luLWR5bmFtaWMtaW1wb3J0LXZhcmlhYmxlcycgJiZcbiAgICAgICAgZHluYW1pY0ltcG9ydFdhcm5pbmdJZ25vcmVMaXN0LnNvbWUoKG1zZykgPT4gd2FybmluZy5tZXNzYWdlLmluY2x1ZGVzKG1zZykpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF3YXJuaW5nSWdub3JlTGlzdC5pbmNsdWRlcyh3YXJuaW5nLmNvZGUpKSB7XG4gICAgICAgIGNvbnN0IHVzZXJPbldhcm4gPSBjb25maWcuYnVpbGQucm9sbHVwT3B0aW9ucz8ub253YXJuO1xuICAgICAgICBpZiAodXNlck9uV2Fybikge1xuICAgICAgICAgICAgdXNlck9uV2Fybih3YXJuaW5nLCB3YXJuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3YXJuaW5nLmNvZGUgPT09ICdQTFVHSU5fV0FSTklORycpIHtcbiAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIud2FybihgJHtwaWNvY29sb3JzRXhwb3J0cy5ib2xkKHBpY29jb2xvcnNFeHBvcnRzLnllbGxvdyhgW3BsdWdpbjoke3dhcm5pbmcucGx1Z2lufV1gKSl9ICR7cGljb2NvbG9yc0V4cG9ydHMueWVsbG93KHdhcm5pbmcubWVzc2FnZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3YXJuKHdhcm5pbmcpO1xuICAgICAgICB9XG4gICAgfVxufVxuYXN5bmMgZnVuY3Rpb24gY2pzU3NyUmVzb2x2ZUV4dGVybmFsKGNvbmZpZywgdXNlcikge1xuICAgIC8vIHNlZSBpZiB3ZSBoYXZlIGNhY2hlZCBkZXBzIGRhdGEgYXZhaWxhYmxlXG4gICAgbGV0IGtub3duSW1wb3J0cztcbiAgICBjb25zdCBkYXRhUGF0aCA9IHBhdGgkby5qb2luKGdldERlcHNDYWNoZURpcihjb25maWcsIGZhbHNlKSwgJ19tZXRhZGF0YS5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMkbC5yZWFkRmlsZVN5bmMoZGF0YVBhdGgsICd1dGYtOCcpKTtcbiAgICAgICAga25vd25JbXBvcnRzID0gT2JqZWN0LmtleXMoZGF0YS5vcHRpbWl6ZWQpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkgeyB9XG4gICAgaWYgKCFrbm93bkltcG9ydHMpIHtcbiAgICAgICAgLy8gbm8gZGV2IGRlcHMgb3B0aW1pemF0aW9uIGRhdGEsIGRvIGEgZnJlc2ggc2NhblxuICAgICAgICBrbm93bkltcG9ydHMgPSBhd2FpdCBmaW5kS25vd25JbXBvcnRzKGNvbmZpZywgZmFsc2UpOyAvLyBuZWVkcyB0byB1c2Ugbm9uLXNzclxuICAgIH1cbiAgICBjb25zdCBzc3JFeHRlcm5hbHMgPSBjanNTc3JSZXNvbHZlRXh0ZXJuYWxzKGNvbmZpZywga25vd25JbXBvcnRzKTtcbiAgICByZXR1cm4gKGlkLCBwYXJlbnRJZCwgaXNSZXNvbHZlZCkgPT4ge1xuICAgICAgICBjb25zdCBpc0V4dGVybmFsID0gY2pzU2hvdWxkRXh0ZXJuYWxpemVGb3JTU1IoaWQsIHNzckV4dGVybmFscyk7XG4gICAgICAgIGlmIChpc0V4dGVybmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVVc2VyRXh0ZXJuYWwodXNlciwgaWQsIHBhcmVudElkLCBpc1Jlc29sdmVkKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlVXNlckV4dGVybmFsKHVzZXIsIGlkLCBwYXJlbnRJZCwgaXNSZXNvbHZlZCkge1xuICAgIGlmICh0eXBlb2YgdXNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdXNlcihpZCwgcGFyZW50SWQsIGlzUmVzb2x2ZWQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHVzZXIpKSB7XG4gICAgICAgIHJldHVybiB1c2VyLnNvbWUoKHRlc3QpID0+IGlzRXh0ZXJuYWwoaWQsIHRlc3QpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBpc0V4dGVybmFsKGlkLCB1c2VyKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0V4dGVybmFsKGlkLCB0ZXN0KSB7XG4gICAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaWQgPT09IHRlc3Q7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdGVzdC50ZXN0KGlkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbmplY3RTc3JGbGFnVG9Ib29rcyhwbHVnaW4pIHtcbiAgICBjb25zdCB7IHJlc29sdmVJZCwgbG9hZCwgdHJhbnNmb3JtIH0gPSBwbHVnaW47XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucGx1Z2luLFxuICAgICAgICByZXNvbHZlSWQ6IHdyYXBTc3JSZXNvbHZlSWQocmVzb2x2ZUlkKSxcbiAgICAgICAgbG9hZDogd3JhcFNzckxvYWQobG9hZCksXG4gICAgICAgIHRyYW5zZm9ybTogd3JhcFNzclRyYW5zZm9ybSh0cmFuc2Zvcm0pLFxuICAgIH07XG59XG5mdW5jdGlvbiB3cmFwU3NyUmVzb2x2ZUlkKGhvb2spIHtcbiAgICBpZiAoIWhvb2spXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBmbiA9ICdoYW5kbGVyJyBpbiBob29rID8gaG9vay5oYW5kbGVyIDogaG9vaztcbiAgICBjb25zdCBoYW5kbGVyID0gZnVuY3Rpb24gKGlkLCBpbXBvcnRlciwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBpZCwgaW1wb3J0ZXIsIGluamVjdFNzckZsYWcob3B0aW9ucykpO1xuICAgIH07XG4gICAgaWYgKCdoYW5kbGVyJyBpbiBob29rKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5ob29rLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHdyYXBTc3JMb2FkKGhvb2spIHtcbiAgICBpZiAoIWhvb2spXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBmbiA9ICdoYW5kbGVyJyBpbiBob29rID8gaG9vay5oYW5kbGVyIDogaG9vaztcbiAgICBjb25zdCBoYW5kbGVyID0gZnVuY3Rpb24gKGlkLCAuLi5hcmdzKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IFJlY2VpdmluZyBvcHRpb25zIHBhcmFtIHRvIGJlIGZ1dHVyZS1wcm9vZiBpZiBSb2xsdXAgYWRkcyBpdFxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBpZCwgaW5qZWN0U3NyRmxhZyhhcmdzWzBdKSk7XG4gICAgfTtcbiAgICBpZiAoJ2hhbmRsZXInIGluIGhvb2spIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmhvb2ssXG4gICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXI7XG4gICAgfVxufVxuZnVuY3Rpb24gd3JhcFNzclRyYW5zZm9ybShob29rKSB7XG4gICAgaWYgKCFob29rKVxuICAgICAgICByZXR1cm47XG4gICAgY29uc3QgZm4gPSAnaGFuZGxlcicgaW4gaG9vayA/IGhvb2suaGFuZGxlciA6IGhvb2s7XG4gICAgY29uc3QgaGFuZGxlciA9IGZ1bmN0aW9uIChjb2RlLCBpbXBvcnRlciwgLi4uYXJncykge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBSZWNlaXZpbmcgb3B0aW9ucyBwYXJhbSB0byBiZSBmdXR1cmUtcHJvb2YgaWYgUm9sbHVwIGFkZHMgaXRcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgY29kZSwgaW1wb3J0ZXIsIGluamVjdFNzckZsYWcoYXJnc1swXSkpO1xuICAgIH07XG4gICAgaWYgKCdoYW5kbGVyJyBpbiBob29rKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5ob29rLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluamVjdFNzckZsYWcob3B0aW9ucykge1xuICAgIHJldHVybiB7IC4uLihvcHRpb25zID8/IHt9KSwgc3NyOiB0cnVlIH07XG59XG4vKlxuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgY29waWVkIGZyb20gcm9sbHVwXG4gIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcm9sbHVwL2Jsb2IvYzUyNjk3NDdjZDNkZDE0YzRiMzA2ZThjZWEzNmYyNDhkOWMxYWEwMS9zcmMvYXN0L25vZGVzL01ldGFQcm9wZXJ0eS50cyNMMTg5LUwyMzJcblxuICBodHRwczovL2dpdGh1Yi5jb20vcm9sbHVwL3JvbGx1cFxuICBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAgQ29weXJpZ2h0IChjKSAyMDE3IFt0aGVzZSBwZW9wbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcm9sbHVwL2dyYXBocy9jb250cmlidXRvcnMpXG4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiovXG5jb25zdCBnZXRSZXNvbHZlVXJsID0gKHBhdGgsIFVSTCA9ICdVUkwnKSA9PiBgbmV3ICR7VVJMfSgke3BhdGh9KS5ocmVmYDtcbmNvbnN0IGdldFJlbGF0aXZlVXJsRnJvbURvY3VtZW50ID0gKHJlbGF0aXZlUGF0aCwgdW1kID0gZmFsc2UpID0+IGdldFJlc29sdmVVcmwoYCcke3JlbGF0aXZlUGF0aH0nLCAke3VtZCA/IGB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnID8gbG9jYXRpb24uaHJlZiA6IGAgOiAnJ31kb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjIHx8IGRvY3VtZW50LmJhc2VVUklgKTtcbmNvbnN0IHJlbGF0aXZlVXJsTWVjaGFuaXNtcyA9IHtcbiAgICBhbWQ6IChyZWxhdGl2ZVBhdGgpID0+IHtcbiAgICAgICAgaWYgKHJlbGF0aXZlUGF0aFswXSAhPT0gJy4nKVxuICAgICAgICAgICAgcmVsYXRpdmVQYXRoID0gJy4vJyArIHJlbGF0aXZlUGF0aDtcbiAgICAgICAgcmV0dXJuIGdldFJlc29sdmVVcmwoYHJlcXVpcmUudG9VcmwoJyR7cmVsYXRpdmVQYXRofScpLCBkb2N1bWVudC5iYXNlVVJJYCk7XG4gICAgfSxcbiAgICBjanM6IChyZWxhdGl2ZVBhdGgpID0+IGAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyA/ICR7Z2V0UmVzb2x2ZVVybChgJ2ZpbGU6JyArIF9fZGlybmFtZSArICcvJHtyZWxhdGl2ZVBhdGh9J2AsIGAocmVxdWlyZSgndScgKyAncmwnKS5VUkwpYCl9IDogJHtnZXRSZWxhdGl2ZVVybEZyb21Eb2N1bWVudChyZWxhdGl2ZVBhdGgpfSlgLFxuICAgIGVzOiAocmVsYXRpdmVQYXRoKSA9PiBnZXRSZXNvbHZlVXJsKGAnJHtyZWxhdGl2ZVBhdGh9JywgaW1wb3J0Lm1ldGEudXJsYCksXG4gICAgaWlmZTogKHJlbGF0aXZlUGF0aCkgPT4gZ2V0UmVsYXRpdmVVcmxGcm9tRG9jdW1lbnQocmVsYXRpdmVQYXRoKSxcbiAgICAvLyBOT1RFOiBtYWtlIHN1cmUgcm9sbHVwIGdlbmVyYXRlIGBtb2R1bGVgIHBhcmFtc1xuICAgIHN5c3RlbTogKHJlbGF0aXZlUGF0aCkgPT4gZ2V0UmVzb2x2ZVVybChgJyR7cmVsYXRpdmVQYXRofScsIG1vZHVsZS5tZXRhLnVybGApLFxuICAgIHVtZDogKHJlbGF0aXZlUGF0aCkgPT4gYCh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBsb2NhdGlvbiA9PT0gJ3VuZGVmaW5lZCcgPyAke2dldFJlc29sdmVVcmwoYCdmaWxlOicgKyBfX2Rpcm5hbWUgKyAnLyR7cmVsYXRpdmVQYXRofSdgLCBgKHJlcXVpcmUoJ3UnICsgJ3JsJykuVVJMKWApfSA6ICR7Z2V0UmVsYXRpdmVVcmxGcm9tRG9jdW1lbnQocmVsYXRpdmVQYXRoLCB0cnVlKX0pYCxcbn07XG5mdW5jdGlvbiB0b091dHB1dEZpbGVQYXRoSW5KUyhmaWxlbmFtZSwgdHlwZSwgaG9zdElkLCBob3N0VHlwZSwgY29uZmlnLCB0b1JlbGF0aXZlKSB7XG4gICAgY29uc3QgeyByZW5kZXJCdWlsdFVybCB9ID0gY29uZmlnLmV4cGVyaW1lbnRhbDtcbiAgICBsZXQgcmVsYXRpdmUgPSBjb25maWcuYmFzZSA9PT0gJycgfHwgY29uZmlnLmJhc2UgPT09ICcuLyc7XG4gICAgaWYgKHJlbmRlckJ1aWx0VXJsKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlbmRlckJ1aWx0VXJsKGZpbGVuYW1lLCB7XG4gICAgICAgICAgICBob3N0SWQsXG4gICAgICAgICAgICBob3N0VHlwZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBzc3I6ICEhY29uZmlnLmJ1aWxkLnNzcixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5ydW50aW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcnVudGltZTogcmVzdWx0LnJ1bnRpbWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0LnJlbGF0aXZlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZSA9IHJlc3VsdC5yZWxhdGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlbGF0aXZlICYmICFjb25maWcuYnVpbGQuc3NyKSB7XG4gICAgICAgIHJldHVybiB0b1JlbGF0aXZlKGZpbGVuYW1lLCBob3N0SWQpO1xuICAgIH1cbiAgICByZXR1cm4gam9pblVybFNlZ21lbnRzKGNvbmZpZy5iYXNlLCBmaWxlbmFtZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVUb0ltcG9ydE1ldGFVUkxCYXNlZFJlbGF0aXZlUnVudGltZShmb3JtYXQpIHtcbiAgICBjb25zdCB0b1JlbGF0aXZlUGF0aCA9IHJlbGF0aXZlVXJsTWVjaGFuaXNtc1tmb3JtYXRdO1xuICAgIHJldHVybiAoZmlsZW5hbWUsIGltcG9ydGVyKSA9PiAoe1xuICAgICAgICBydW50aW1lOiB0b1JlbGF0aXZlUGF0aChwYXRoJG8ucG9zaXgucmVsYXRpdmUocGF0aCRvLmRpcm5hbWUoaW1wb3J0ZXIpLCBmaWxlbmFtZSkpLFxuICAgIH0pO1xufVxuZnVuY3Rpb24gdG9PdXRwdXRGaWxlUGF0aFdpdGhvdXRSdW50aW1lKGZpbGVuYW1lLCB0eXBlLCBob3N0SWQsIGhvc3RUeXBlLCBjb25maWcsIHRvUmVsYXRpdmUpIHtcbiAgICBjb25zdCB7IHJlbmRlckJ1aWx0VXJsIH0gPSBjb25maWcuZXhwZXJpbWVudGFsO1xuICAgIGxldCByZWxhdGl2ZSA9IGNvbmZpZy5iYXNlID09PSAnJyB8fCBjb25maWcuYmFzZSA9PT0gJy4vJztcbiAgICBpZiAocmVuZGVyQnVpbHRVcmwpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVuZGVyQnVpbHRVcmwoZmlsZW5hbWUsIHtcbiAgICAgICAgICAgIGhvc3RJZCxcbiAgICAgICAgICAgIGhvc3RUeXBlLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIHNzcjogISFjb25maWcuYnVpbGQuc3NyLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnJ1bnRpbWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHsgcnVudGltZTogXCIke3Jlc3VsdC5ydW50aW1lfVwiIH0gaXMgbm90IHN1cHBvcnRlZCBmb3IgYXNzZXRzIGluICR7aG9zdFR5cGV9IGZpbGVzOiAke2ZpbGVuYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQucmVsYXRpdmUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlID0gcmVzdWx0LnJlbGF0aXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVsYXRpdmUgJiYgIWNvbmZpZy5idWlsZC5zc3IpIHtcbiAgICAgICAgcmV0dXJuIHRvUmVsYXRpdmUoZmlsZW5hbWUsIGhvc3RJZCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gam9pblVybFNlZ21lbnRzKGNvbmZpZy5iYXNlLCBmaWxlbmFtZSk7XG4gICAgfVxufVxuY29uc3QgdG9PdXRwdXRGaWxlUGF0aEluQ3NzID0gdG9PdXRwdXRGaWxlUGF0aFdpdGhvdXRSdW50aW1lO1xuY29uc3QgdG9PdXRwdXRGaWxlUGF0aEluSHRtbCA9IHRvT3V0cHV0RmlsZVBhdGhXaXRob3V0UnVudGltZTtcblxudmFyIGJ1aWxkJDEgPSB7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0YnVpbGQ6IGJ1aWxkLFxuXHRjcmVhdGVUb0ltcG9ydE1ldGFVUkxCYXNlZFJlbGF0aXZlUnVudGltZTogY3JlYXRlVG9JbXBvcnRNZXRhVVJMQmFzZWRSZWxhdGl2ZVJ1bnRpbWUsXG5cdG9uUm9sbHVwV2FybmluZzogb25Sb2xsdXBXYXJuaW5nLFxuXHRyZXNvbHZlQnVpbGRPcHRpb25zOiByZXNvbHZlQnVpbGRPcHRpb25zLFxuXHRyZXNvbHZlQnVpbGRPdXRwdXRzOiByZXNvbHZlQnVpbGRPdXRwdXRzLFxuXHRyZXNvbHZlQnVpbGRQbHVnaW5zOiByZXNvbHZlQnVpbGRQbHVnaW5zLFxuXHRyZXNvbHZlTGliRmlsZW5hbWU6IHJlc29sdmVMaWJGaWxlbmFtZSxcblx0dG9PdXRwdXRGaWxlUGF0aEluQ3NzOiB0b091dHB1dEZpbGVQYXRoSW5Dc3MsXG5cdHRvT3V0cHV0RmlsZVBhdGhJbkh0bWw6IHRvT3V0cHV0RmlsZVBhdGhJbkh0bWwsXG5cdHRvT3V0cHV0RmlsZVBhdGhJbkpTOiB0b091dHB1dEZpbGVQYXRoSW5KUyxcblx0dG9PdXRwdXRGaWxlUGF0aFdpdGhvdXRSdW50aW1lOiB0b091dHB1dEZpbGVQYXRoV2l0aG91dFJ1bnRpbWVcbn07XG5cbnZhciBzcmNFeHBvcnRzID0ge307XG52YXIgc3JjID0ge1xuICBnZXQgZXhwb3J0cygpeyByZXR1cm4gc3JjRXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IHNyY0V4cG9ydHMgPSB2OyB9LFxufTtcblxudmFyIGJyb3dzZXJFeHBvcnRzID0ge307XG52YXIgYnJvd3NlciA9IHtcbiAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIGJyb3dzZXJFeHBvcnRzOyB9LFxuICBzZXQgZXhwb3J0cyh2KXsgYnJvd3NlckV4cG9ydHMgPSB2OyB9LFxufTtcblxudmFyIGRlYnVnRXhwb3J0cyA9IHt9O1xudmFyIGRlYnVnJDYgPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiBkZWJ1Z0V4cG9ydHM7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBkZWJ1Z0V4cG9ydHMgPSB2OyB9LFxufTtcblxuLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBtcztcbnZhciBoYXNSZXF1aXJlZE1zO1xuXG5mdW5jdGlvbiByZXF1aXJlTXMgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRNcykgcmV0dXJuIG1zO1xuXHRoYXNSZXF1aXJlZE1zID0gMTtcblx0dmFyIHMgPSAxMDAwO1xuXHR2YXIgbSA9IHMgKiA2MDtcblx0dmFyIGggPSBtICogNjA7XG5cdHZhciBkID0gaCAqIDI0O1xuXHR2YXIgeSA9IGQgKiAzNjUuMjU7XG5cblx0LyoqXG5cdCAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG5cdCAqXG5cdCAqIE9wdGlvbnM6XG5cdCAqXG5cdCAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuXHQgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG5cdCAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuXHQgKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuXHQgKiBAYXBpIHB1YmxpY1xuXHQgKi9cblxuXHRtcyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuXHQgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHQgIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcblx0ICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcblx0ICAgIHJldHVybiBwYXJzZSh2YWwpO1xuXHQgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsKSA9PT0gZmFsc2UpIHtcblx0ICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuXHQgIH1cblx0ICB0aHJvdyBuZXcgRXJyb3IoXG5cdCAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcblx0ICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuXHQgICk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0clxuXHQgKiBAcmV0dXJuIHtOdW1iZXJ9XG5cdCAqIEBhcGkgcHJpdmF0ZVxuXHQgKi9cblxuXHRmdW5jdGlvbiBwYXJzZShzdHIpIHtcblx0ICBzdHIgPSBTdHJpbmcoc3RyKTtcblx0ICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblx0ICB2YXIgbWF0Y2ggPSAvXigoPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuXHQgICAgc3RyXG5cdCAgKTtcblx0ICBpZiAoIW1hdGNoKSB7XG5cdCAgICByZXR1cm47XG5cdCAgfVxuXHQgIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG5cdCAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcblx0ICBzd2l0Y2ggKHR5cGUpIHtcblx0ICAgIGNhc2UgJ3llYXJzJzpcblx0ICAgIGNhc2UgJ3llYXInOlxuXHQgICAgY2FzZSAneXJzJzpcblx0ICAgIGNhc2UgJ3lyJzpcblx0ICAgIGNhc2UgJ3knOlxuXHQgICAgICByZXR1cm4gbiAqIHk7XG5cdCAgICBjYXNlICdkYXlzJzpcblx0ICAgIGNhc2UgJ2RheSc6XG5cdCAgICBjYXNlICdkJzpcblx0ICAgICAgcmV0dXJuIG4gKiBkO1xuXHQgICAgY2FzZSAnaG91cnMnOlxuXHQgICAgY2FzZSAnaG91cic6XG5cdCAgICBjYXNlICdocnMnOlxuXHQgICAgY2FzZSAnaHInOlxuXHQgICAgY2FzZSAnaCc6XG5cdCAgICAgIHJldHVybiBuICogaDtcblx0ICAgIGNhc2UgJ21pbnV0ZXMnOlxuXHQgICAgY2FzZSAnbWludXRlJzpcblx0ICAgIGNhc2UgJ21pbnMnOlxuXHQgICAgY2FzZSAnbWluJzpcblx0ICAgIGNhc2UgJ20nOlxuXHQgICAgICByZXR1cm4gbiAqIG07XG5cdCAgICBjYXNlICdzZWNvbmRzJzpcblx0ICAgIGNhc2UgJ3NlY29uZCc6XG5cdCAgICBjYXNlICdzZWNzJzpcblx0ICAgIGNhc2UgJ3NlYyc6XG5cdCAgICBjYXNlICdzJzpcblx0ICAgICAgcmV0dXJuIG4gKiBzO1xuXHQgICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcblx0ICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcblx0ICAgIGNhc2UgJ21zZWNzJzpcblx0ICAgIGNhc2UgJ21zZWMnOlxuXHQgICAgY2FzZSAnbXMnOlxuXHQgICAgICByZXR1cm4gbjtcblx0ICAgIGRlZmF1bHQ6XG5cdCAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cdCAgfVxuXHR9XG5cblx0LyoqXG5cdCAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cblx0ICpcblx0ICogQHBhcmFtIHtOdW1iZXJ9IG1zXG5cdCAqIEByZXR1cm4ge1N0cmluZ31cblx0ICogQGFwaSBwcml2YXRlXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG5cdCAgaWYgKG1zID49IGQpIHtcblx0ICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG5cdCAgfVxuXHQgIGlmIChtcyA+PSBoKSB7XG5cdCAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuXHQgIH1cblx0ICBpZiAobXMgPj0gbSkge1xuXHQgICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcblx0ICB9XG5cdCAgaWYgKG1zID49IHMpIHtcblx0ICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG5cdCAgfVxuXHQgIHJldHVybiBtcyArICdtcyc7XG5cdH1cblxuXHQvKipcblx0ICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG5cdCAqXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuXHQgKiBAcmV0dXJuIHtTdHJpbmd9XG5cdCAqIEBhcGkgcHJpdmF0ZVxuXHQgKi9cblxuXHRmdW5jdGlvbiBmbXRMb25nKG1zKSB7XG5cdCAgcmV0dXJuIHBsdXJhbChtcywgZCwgJ2RheScpIHx8XG5cdCAgICBwbHVyYWwobXMsIGgsICdob3VyJykgfHxcblx0ICAgIHBsdXJhbChtcywgbSwgJ21pbnV0ZScpIHx8XG5cdCAgICBwbHVyYWwobXMsIHMsICdzZWNvbmQnKSB8fFxuXHQgICAgbXMgKyAnIG1zJztcblx0fVxuXG5cdC8qKlxuXHQgKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cblx0ICovXG5cblx0ZnVuY3Rpb24gcGx1cmFsKG1zLCBuLCBuYW1lKSB7XG5cdCAgaWYgKG1zIDwgbikge1xuXHQgICAgcmV0dXJuO1xuXHQgIH1cblx0ICBpZiAobXMgPCBuICogMS41KSB7XG5cdCAgICByZXR1cm4gTWF0aC5mbG9vcihtcyAvIG4pICsgJyAnICsgbmFtZTtcblx0ICB9XG5cdCAgcmV0dXJuIE1hdGguY2VpbChtcyAvIG4pICsgJyAnICsgbmFtZSArICdzJztcblx0fVxuXHRyZXR1cm4gbXM7XG59XG5cbnZhciBoYXNSZXF1aXJlZERlYnVnO1xuXG5mdW5jdGlvbiByZXF1aXJlRGVidWcgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWREZWJ1ZykgcmV0dXJuIGRlYnVnRXhwb3J0cztcblx0aGFzUmVxdWlyZWREZWJ1ZyA9IDE7XG5cdChmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cdFx0LyoqXG5cdFx0ICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuXHRcdCAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG5cdFx0ICpcblx0XHQgKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG5cdFx0ICovXG5cblx0XHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnWydkZWZhdWx0J10gPSBjcmVhdGVEZWJ1Zztcblx0XHRleHBvcnRzLmNvZXJjZSA9IGNvZXJjZTtcblx0XHRleHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRcdGV4cG9ydHMuZW5hYmxlID0gZW5hYmxlO1xuXHRcdGV4cG9ydHMuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdFx0ZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmVNcygpO1xuXG5cdFx0LyoqXG5cdFx0ICogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdFx0ICovXG5cblx0XHRleHBvcnRzLm5hbWVzID0gW107XG5cdFx0ZXhwb3J0cy5za2lwcyA9IFtdO1xuXG5cdFx0LyoqXG5cdFx0ICogTWFwIG9mIHNwZWNpYWwgXCIlblwiIGhhbmRsaW5nIGZ1bmN0aW9ucywgZm9yIHRoZSBkZWJ1ZyBcImZvcm1hdFwiIGFyZ3VtZW50LlxuXHRcdCAqXG5cdFx0ICogVmFsaWQga2V5IG5hbWVzIGFyZSBhIHNpbmdsZSwgbG93ZXIgb3IgdXBwZXItY2FzZSBsZXR0ZXIsIGkuZS4gXCJuXCIgYW5kIFwiTlwiLlxuXHRcdCAqL1xuXG5cdFx0ZXhwb3J0cy5mb3JtYXR0ZXJzID0ge307XG5cblx0XHQvKipcblx0XHQgKiBQcmV2aW91cyBsb2cgdGltZXN0YW1wLlxuXHRcdCAqL1xuXG5cdFx0dmFyIHByZXZUaW1lO1xuXG5cdFx0LyoqXG5cdFx0ICogU2VsZWN0IGEgY29sb3IuXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHRcdCAqIEByZXR1cm4ge051bWJlcn1cblx0XHQgKiBAYXBpIHByaXZhdGVcblx0XHQgKi9cblxuXHRcdGZ1bmN0aW9uIHNlbGVjdENvbG9yKG5hbWVzcGFjZSkge1xuXHRcdCAgdmFyIGhhc2ggPSAwLCBpO1xuXG5cdFx0ICBmb3IgKGkgaW4gbmFtZXNwYWNlKSB7XG5cdFx0ICAgIGhhc2ggID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBuYW1lc3BhY2UuY2hhckNvZGVBdChpKTtcblx0XHQgICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHQgIH1cblxuXHRcdCAgcmV0dXJuIGV4cG9ydHMuY29sb3JzW01hdGguYWJzKGhhc2gpICUgZXhwb3J0cy5jb2xvcnMubGVuZ3RoXTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0XHQgKiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0XHQgKiBAYXBpIHB1YmxpY1xuXHRcdCAqL1xuXG5cdFx0ZnVuY3Rpb24gY3JlYXRlRGVidWcobmFtZXNwYWNlKSB7XG5cblx0XHQgIGZ1bmN0aW9uIGRlYnVnKCkge1xuXHRcdCAgICAvLyBkaXNhYmxlZD9cblx0XHQgICAgaWYgKCFkZWJ1Zy5lbmFibGVkKSByZXR1cm47XG5cblx0XHQgICAgdmFyIHNlbGYgPSBkZWJ1ZztcblxuXHRcdCAgICAvLyBzZXQgYGRpZmZgIHRpbWVzdGFtcFxuXHRcdCAgICB2YXIgY3VyciA9ICtuZXcgRGF0ZSgpO1xuXHRcdCAgICB2YXIgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdCAgICBzZWxmLmRpZmYgPSBtcztcblx0XHQgICAgc2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0ICAgIHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0ICAgIHByZXZUaW1lID0gY3VycjtcblxuXHRcdCAgICAvLyB0dXJuIHRoZSBgYXJndW1lbnRzYCBpbnRvIGEgcHJvcGVyIEFycmF5XG5cdFx0ICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuXHRcdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcblx0XHQgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuXHRcdCAgICB9XG5cblx0XHQgICAgYXJnc1swXSA9IGV4cG9ydHMuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0ICAgIGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGFyZ3NbMF0pIHtcblx0XHQgICAgICAvLyBhbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdCAgICAgIGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHQgICAgfVxuXG5cdFx0ICAgIC8vIGFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0ICAgIHZhciBpbmRleCA9IDA7XG5cdFx0ICAgIGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCBmdW5jdGlvbihtYXRjaCwgZm9ybWF0KSB7XG5cdFx0ICAgICAgLy8gaWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuXHRcdCAgICAgIGlmIChtYXRjaCA9PT0gJyUlJykgcmV0dXJuIG1hdGNoO1xuXHRcdCAgICAgIGluZGV4Kys7XG5cdFx0ICAgICAgdmFyIGZvcm1hdHRlciA9IGV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdCAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZm9ybWF0dGVyKSB7XG5cdFx0ICAgICAgICB2YXIgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0ICAgICAgICBtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cblx0XHQgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcblx0XHQgICAgICAgIGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHQgICAgICAgIGluZGV4LS07XG5cdFx0ICAgICAgfVxuXHRcdCAgICAgIHJldHVybiBtYXRjaDtcblx0XHQgICAgfSk7XG5cblx0XHQgICAgLy8gYXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcblx0XHQgICAgZXhwb3J0cy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHQgICAgdmFyIGxvZ0ZuID0gZGVidWcubG9nIHx8IGV4cG9ydHMubG9nIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG5cdFx0ICAgIGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdCAgfVxuXG5cdFx0ICBkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0ICBkZWJ1Zy5lbmFibGVkID0gZXhwb3J0cy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0ICBkZWJ1Zy51c2VDb2xvcnMgPSBleHBvcnRzLnVzZUNvbG9ycygpO1xuXHRcdCAgZGVidWcuY29sb3IgPSBzZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXG5cdFx0ICAvLyBlbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdCAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBleHBvcnRzLmluaXQpIHtcblx0XHQgICAgZXhwb3J0cy5pbml0KGRlYnVnKTtcblx0XHQgIH1cblxuXHRcdCAgcmV0dXJuIGRlYnVnO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0XHQgKiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0XHQgKiBAYXBpIHB1YmxpY1xuXHRcdCAqL1xuXG5cdFx0ZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcblx0XHQgIGV4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTtcblxuXHRcdCAgZXhwb3J0cy5uYW1lcyA9IFtdO1xuXHRcdCAgZXhwb3J0cy5za2lwcyA9IFtdO1xuXG5cdFx0ICB2YXIgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuXHRcdCAgdmFyIGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuXHRcdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdCAgICBpZiAoIXNwbGl0W2ldKSBjb250aW51ZTsgLy8gaWdub3JlIGVtcHR5IHN0cmluZ3Ncblx0XHQgICAgbmFtZXNwYWNlcyA9IHNwbGl0W2ldLnJlcGxhY2UoL1xcKi9nLCAnLio/Jyk7XG5cdFx0ICAgIGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcblx0XHQgICAgICBleHBvcnRzLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuXHRcdCAgICB9IGVsc2Uge1xuXHRcdCAgICAgIGV4cG9ydHMubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHQgICAgfVxuXHRcdCAgfVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuXHRcdCAqXG5cdFx0ICogQGFwaSBwdWJsaWNcblx0XHQgKi9cblxuXHRcdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0ICBleHBvcnRzLmVuYWJsZSgnJyk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufVxuXHRcdCAqIEBhcGkgcHVibGljXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcblx0XHQgIHZhciBpLCBsZW47XG5cdFx0ICBmb3IgKGkgPSAwLCBsZW4gPSBleHBvcnRzLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0ICAgIGlmIChleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcblx0XHQgICAgICByZXR1cm4gZmFsc2U7XG5cdFx0ICAgIH1cblx0XHQgIH1cblx0XHQgIGZvciAoaSA9IDAsIGxlbiA9IGV4cG9ydHMubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHQgICAgaWYgKGV4cG9ydHMubmFtZXNbaV0udGVzdChuYW1lKSkge1xuXHRcdCAgICAgIHJldHVybiB0cnVlO1xuXHRcdCAgICB9XG5cdFx0ICB9XG5cdFx0ICByZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQ29lcmNlIGB2YWxgLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdFx0ICogQHJldHVybiB7TWl4ZWR9XG5cdFx0ICogQGFwaSBwcml2YXRlXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0ICBpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG5cdFx0ICByZXR1cm4gdmFsO1xuXHRcdH1cbn0gKGRlYnVnJDYsIGRlYnVnRXhwb3J0cykpO1xuXHRyZXR1cm4gZGVidWdFeHBvcnRzO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxudmFyIGhhc1JlcXVpcmVkQnJvd3NlcjtcblxuZnVuY3Rpb24gcmVxdWlyZUJyb3dzZXIgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRCcm93c2VyKSByZXR1cm4gYnJvd3NlckV4cG9ydHM7XG5cdGhhc1JlcXVpcmVkQnJvd3NlciA9IDE7XG5cdChmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cdFx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZURlYnVnKCk7XG5cdFx0ZXhwb3J0cy5sb2cgPSBsb2c7XG5cdFx0ZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcblx0XHRleHBvcnRzLnNhdmUgPSBzYXZlO1xuXHRcdGV4cG9ydHMubG9hZCA9IGxvYWQ7XG5cdFx0ZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5cdFx0ZXhwb3J0cy5zdG9yYWdlID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZVxuXHRcdCAgICAgICAgICAgICAgICYmICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWUuc3RvcmFnZVxuXHRcdCAgICAgICAgICAgICAgICAgID8gY2hyb21lLnN0b3JhZ2UubG9jYWxcblx0XHQgICAgICAgICAgICAgICAgICA6IGxvY2Fsc3RvcmFnZSgpO1xuXG5cdFx0LyoqXG5cdFx0ICogQ29sb3JzLlxuXHRcdCAqL1xuXG5cdFx0ZXhwb3J0cy5jb2xvcnMgPSBbXG5cdFx0ICAnbGlnaHRzZWFncmVlbicsXG5cdFx0ICAnZm9yZXN0Z3JlZW4nLFxuXHRcdCAgJ2dvbGRlbnJvZCcsXG5cdFx0ICAnZG9kZ2VyYmx1ZScsXG5cdFx0ICAnZGFya29yY2hpZCcsXG5cdFx0ICAnY3JpbXNvbidcblx0XHRdO1xuXG5cdFx0LyoqXG5cdFx0ICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcblx0XHQgKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cblx0XHQgKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG5cdFx0ICpcblx0XHQgKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuXHRcdCAqL1xuXG5cdFx0ZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHRcdCAgLy8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuXHRcdCAgLy8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0XHQgIC8vIGV4cGxpY2l0bHlcblx0XHQgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG5cdFx0ICAgIHJldHVybiB0cnVlO1xuXHRcdCAgfVxuXG5cdFx0ICAvLyBpcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHRcdCAgLy8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcblx0XHQgIHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuXHRcdCAgICAvLyBpcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0ICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG5cdFx0ICAgIC8vIGlzIGZpcmVmb3ggPj0gdjMxP1xuXHRcdCAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQgICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG5cdFx0ICAgIC8vIGRvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcblx0XHQgICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG5cdFx0ICovXG5cblx0XHRleHBvcnRzLmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uKHYpIHtcblx0XHQgIHRyeSB7XG5cdFx0ICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcblx0XHQgIH0gY2F0Y2ggKGVycikge1xuXHRcdCAgICByZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyLm1lc3NhZ2U7XG5cdFx0ICB9XG5cdFx0fTtcblxuXG5cdFx0LyoqXG5cdFx0ICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuXHRcdCAqXG5cdFx0ICogQGFwaSBwdWJsaWNcblx0XHQgKi9cblxuXHRcdGZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRcdCAgdmFyIHVzZUNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXG5cdFx0ICBhcmdzWzBdID0gKHVzZUNvbG9ycyA/ICclYycgOiAnJylcblx0XHQgICAgKyB0aGlzLm5hbWVzcGFjZVxuXHRcdCAgICArICh1c2VDb2xvcnMgPyAnICVjJyA6ICcgJylcblx0XHQgICAgKyBhcmdzWzBdXG5cdFx0ICAgICsgKHVzZUNvbG9ycyA/ICclYyAnIDogJyAnKVxuXHRcdCAgICArICcrJyArIGV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRcdCAgaWYgKCF1c2VDb2xvcnMpIHJldHVybjtcblxuXHRcdCAgdmFyIGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuXHRcdCAgYXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0Jyk7XG5cblx0XHQgIC8vIHRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdFx0ICAvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG5cdFx0ICAvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cblx0XHQgIHZhciBpbmRleCA9IDA7XG5cdFx0ICB2YXIgbGFzdEMgPSAwO1xuXHRcdCAgYXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG5cdFx0ICAgIGlmICgnJSUnID09PSBtYXRjaCkgcmV0dXJuO1xuXHRcdCAgICBpbmRleCsrO1xuXHRcdCAgICBpZiAoJyVjJyA9PT0gbWF0Y2gpIHtcblx0XHQgICAgICAvLyB3ZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHQgICAgICAvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuXHRcdCAgICAgIGxhc3RDID0gaW5kZXg7XG5cdFx0ICAgIH1cblx0XHQgIH0pO1xuXG5cdFx0ICBhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogSW52b2tlcyBgY29uc29sZS5sb2coKWAgd2hlbiBhdmFpbGFibGUuXG5cdFx0ICogTm8tb3Agd2hlbiBgY29uc29sZS5sb2dgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cblx0XHQgKlxuXHRcdCAqIEBhcGkgcHVibGljXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBsb2coKSB7XG5cdFx0ICAvLyB0aGlzIGhhY2tlcnkgaXMgcmVxdWlyZWQgZm9yIElFOC85LCB3aGVyZVxuXHRcdCAgLy8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24gZG9lc24ndCBoYXZlICdhcHBseSdcblx0XHQgIHJldHVybiAnb2JqZWN0JyA9PT0gdHlwZW9mIGNvbnNvbGVcblx0XHQgICAgJiYgY29uc29sZS5sb2dcblx0XHQgICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogU2F2ZSBgbmFtZXNwYWNlc2AuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHRcdCAqIEBhcGkgcHJpdmF0ZVxuXHRcdCAqL1xuXG5cdFx0ZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdFx0ICB0cnkge1xuXHRcdCAgICBpZiAobnVsbCA9PSBuYW1lc3BhY2VzKSB7XG5cdFx0ICAgICAgZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0ICAgIH0gZWxzZSB7XG5cdFx0ICAgICAgZXhwb3J0cy5zdG9yYWdlLmRlYnVnID0gbmFtZXNwYWNlcztcblx0XHQgICAgfVxuXHRcdCAgfSBjYXRjaChlKSB7fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIExvYWQgYG5hbWVzcGFjZXNgLlxuXHRcdCAqXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuXHRcdCAqIEBhcGkgcHJpdmF0ZVxuXHRcdCAqL1xuXG5cdFx0ZnVuY3Rpb24gbG9hZCgpIHtcblx0XHQgIHZhciByO1xuXHRcdCAgdHJ5IHtcblx0XHQgICAgciA9IGV4cG9ydHMuc3RvcmFnZS5kZWJ1Zztcblx0XHQgIH0gY2F0Y2goZSkge31cblxuXHRcdCAgLy8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRcdCAgaWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG5cdFx0ICAgIHIgPSBwcm9jZXNzLmVudi5ERUJVRztcblx0XHQgIH1cblxuXHRcdCAgcmV0dXJuIHI7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBsb2NhbFN0b3JhZ2UuZGVidWdgIGluaXRpYWxseS5cblx0XHQgKi9cblxuXHRcdGV4cG9ydHMuZW5hYmxlKGxvYWQoKSk7XG5cblx0XHQvKipcblx0XHQgKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG5cdFx0ICpcblx0XHQgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3Ncblx0XHQgKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuXHRcdCAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG5cdFx0ICogQGFwaSBwcml2YXRlXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdFx0ICB0cnkge1xuXHRcdCAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZTtcblx0XHQgIH0gY2F0Y2ggKGUpIHt9XG5cdFx0fVxufSAoYnJvd3NlciwgYnJvd3NlckV4cG9ydHMpKTtcblx0cmV0dXJuIGJyb3dzZXJFeHBvcnRzO1xufVxuXG52YXIgbm9kZUV4cG9ydHMgPSB7fTtcbnZhciBub2RlID0ge1xuICBnZXQgZXhwb3J0cygpeyByZXR1cm4gbm9kZUV4cG9ydHM7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBub2RlRXhwb3J0cyA9IHY7IH0sXG59O1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGhhc1JlcXVpcmVkTm9kZTtcblxuZnVuY3Rpb24gcmVxdWlyZU5vZGUgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWROb2RlKSByZXR1cm4gbm9kZUV4cG9ydHM7XG5cdGhhc1JlcXVpcmVkTm9kZSA9IDE7XG5cdChmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cdFx0dmFyIHR0eSA9IHJlcXVpcmUkJDAkMztcblx0XHR2YXIgdXRpbCA9IHJlcXVpcmUkJDAkNjtcblxuXHRcdC8qKlxuXHRcdCAqIFRoaXMgaXMgdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuXHRcdCAqXG5cdFx0ICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuXHRcdCAqL1xuXG5cdFx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZURlYnVnKCk7XG5cdFx0ZXhwb3J0cy5pbml0ID0gaW5pdDtcblx0XHRleHBvcnRzLmxvZyA9IGxvZztcblx0XHRleHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuXHRcdGV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5cdFx0ZXhwb3J0cy5sb2FkID0gbG9hZDtcblx0XHRleHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcblxuXHRcdC8qKlxuXHRcdCAqIENvbG9ycy5cblx0XHQgKi9cblxuXHRcdGV4cG9ydHMuY29sb3JzID0gWzYsIDIsIDMsIDQsIDUsIDFdO1xuXG5cdFx0LyoqXG5cdFx0ICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuXHRcdCAqXG5cdFx0ICogICAkIERFQlVHX0NPTE9SUz1ubyBERUJVR19ERVBUSD0xMCBERUJVR19TSE9XX0hJRERFTj1lbmFibGVkIG5vZGUgc2NyaXB0LmpzXG5cdFx0ICovXG5cblx0XHRleHBvcnRzLmluc3BlY3RPcHRzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG5cdFx0ICByZXR1cm4gL15kZWJ1Z18vaS50ZXN0KGtleSk7XG5cdFx0fSkucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuXHRcdCAgLy8gY2FtZWwtY2FzZVxuXHRcdCAgdmFyIHByb3AgPSBrZXlcblx0XHQgICAgLnN1YnN0cmluZyg2KVxuXHRcdCAgICAudG9Mb3dlckNhc2UoKVxuXHRcdCAgICAucmVwbGFjZSgvXyhbYS16XSkvZywgZnVuY3Rpb24gKF8sIGspIHsgcmV0dXJuIGsudG9VcHBlckNhc2UoKSB9KTtcblxuXHRcdCAgLy8gY29lcmNlIHN0cmluZyB2YWx1ZSBpbnRvIEpTIHZhbHVlXG5cdFx0ICB2YXIgdmFsID0gcHJvY2Vzcy5lbnZba2V5XTtcblx0XHQgIGlmICgvXih5ZXN8b258dHJ1ZXxlbmFibGVkKSQvaS50ZXN0KHZhbCkpIHZhbCA9IHRydWU7XG5cdFx0ICBlbHNlIGlmICgvXihub3xvZmZ8ZmFsc2V8ZGlzYWJsZWQpJC9pLnRlc3QodmFsKSkgdmFsID0gZmFsc2U7XG5cdFx0ICBlbHNlIGlmICh2YWwgPT09ICdudWxsJykgdmFsID0gbnVsbDtcblx0XHQgIGVsc2UgdmFsID0gTnVtYmVyKHZhbCk7XG5cblx0XHQgIG9ialtwcm9wXSA9IHZhbDtcblx0XHQgIHJldHVybiBvYmo7XG5cdFx0fSwge30pO1xuXG5cdFx0LyoqXG5cdFx0ICogVGhlIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSB0aGUgYGRlYnVnKClgIGNhbGxzIHRvLlxuXHRcdCAqIFNldCB0aGUgYERFQlVHX0ZEYCBlbnYgdmFyaWFibGUgdG8gb3ZlcnJpZGUgd2l0aCBhbm90aGVyIHZhbHVlLiBpLmUuOlxuXHRcdCAqXG5cdFx0ICogICAkIERFQlVHX0ZEPTMgbm9kZSBzY3JpcHQuanMgMz5kZWJ1Zy5sb2dcblx0XHQgKi9cblxuXHRcdHZhciBmZCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkRFQlVHX0ZELCAxMCkgfHwgMjtcblxuXHRcdGlmICgxICE9PSBmZCAmJiAyICE9PSBmZCkge1xuXHRcdCAgdXRpbC5kZXByZWNhdGUoZnVuY3Rpb24oKXt9LCAnZXhjZXB0IGZvciBzdGRlcnIoMikgYW5kIHN0ZG91dCgxKSwgYW55IG90aGVyIHVzYWdlIG9mIERFQlVHX0ZEIGlzIGRlcHJlY2F0ZWQuIE92ZXJyaWRlIGRlYnVnLmxvZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbG9nIGZ1bmN0aW9uIChodHRwczovL2dpdC5pby9kZWJ1Z19mZCknKSgpO1xuXHRcdH1cblxuXHRcdHZhciBzdHJlYW0gPSAxID09PSBmZCA/IHByb2Nlc3Muc3Rkb3V0IDpcblx0XHQgICAgICAgICAgICAgMiA9PT0gZmQgPyBwcm9jZXNzLnN0ZGVyciA6XG5cdFx0ICAgICAgICAgICAgIGNyZWF0ZVdyaXRhYmxlU3RkaW9TdHJlYW0oZmQpO1xuXG5cdFx0LyoqXG5cdFx0ICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuXHRcdCAqL1xuXG5cdFx0ZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHRcdCAgcmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHNcblx0XHQgICAgPyBCb29sZWFuKGV4cG9ydHMuaW5zcGVjdE9wdHMuY29sb3JzKVxuXHRcdCAgICA6IHR0eS5pc2F0dHkoZmQpO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGwgb24gYSBzaW5nbGUgbGluZS5cblx0XHQgKi9cblxuXHRcdGV4cG9ydHMuZm9ybWF0dGVycy5vID0gZnVuY3Rpb24odikge1xuXHRcdCAgdGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblx0XHQgIHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cylcblx0XHQgICAgLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24oc3RyKSB7XG5cdFx0ICAgICAgcmV0dXJuIHN0ci50cmltKClcblx0XHQgICAgfSkuam9pbignICcpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsb3dpbmcgbXVsdGlwbGUgbGluZXMgaWYgbmVlZGVkLlxuXHRcdCAqL1xuXG5cdFx0ZXhwb3J0cy5mb3JtYXR0ZXJzLk8gPSBmdW5jdGlvbih2KSB7XG5cdFx0ICB0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRcdCAgcmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQWRkcyBBTlNJIGNvbG9yIGVzY2FwZSBjb2RlcyBpZiBlbmFibGVkLlxuXHRcdCAqXG5cdFx0ICogQGFwaSBwdWJsaWNcblx0XHQgKi9cblxuXHRcdGZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRcdCAgdmFyIG5hbWUgPSB0aGlzLm5hbWVzcGFjZTtcblx0XHQgIHZhciB1c2VDb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblxuXHRcdCAgaWYgKHVzZUNvbG9ycykge1xuXHRcdCAgICB2YXIgYyA9IHRoaXMuY29sb3I7XG5cdFx0ICAgIHZhciBwcmVmaXggPSAnICBcXHUwMDFiWzMnICsgYyArICc7MW0nICsgbmFtZSArICcgJyArICdcXHUwMDFiWzBtJztcblxuXHRcdCAgICBhcmdzWzBdID0gcHJlZml4ICsgYXJnc1swXS5zcGxpdCgnXFxuJykuam9pbignXFxuJyArIHByZWZpeCk7XG5cdFx0ICAgIGFyZ3MucHVzaCgnXFx1MDAxYlszJyArIGMgKyAnbSsnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMWJbMG0nKTtcblx0XHQgIH0gZWxzZSB7XG5cdFx0ICAgIGFyZ3NbMF0gPSBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKClcblx0XHQgICAgICArICcgJyArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuXHRcdCAgfVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEludm9rZXMgYHV0aWwuZm9ybWF0KClgIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHdyaXRlcyB0byBgc3RyZWFtYC5cblx0XHQgKi9cblxuXHRcdGZ1bmN0aW9uIGxvZygpIHtcblx0XHQgIHJldHVybiBzdHJlYW0ud3JpdGUodXRpbC5mb3JtYXQuYXBwbHkodXRpbCwgYXJndW1lbnRzKSArICdcXG4nKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBTYXZlIGBuYW1lc3BhY2VzYC5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdFx0ICogQGFwaSBwcml2YXRlXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0XHQgIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcblx0XHQgICAgLy8gSWYgeW91IHNldCBhIHByb2Nlc3MuZW52IGZpZWxkIHRvIG51bGwgb3IgdW5kZWZpbmVkLCBpdCBnZXRzIGNhc3QgdG8gdGhlXG5cdFx0ICAgIC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG5cdFx0ICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5ERUJVRztcblx0XHQgIH0gZWxzZSB7XG5cdFx0ICAgIHByb2Nlc3MuZW52LkRFQlVHID0gbmFtZXNwYWNlcztcblx0XHQgIH1cblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBMb2FkIGBuYW1lc3BhY2VzYC5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcblx0XHQgKiBAYXBpIHByaXZhdGVcblx0XHQgKi9cblxuXHRcdGZ1bmN0aW9uIGxvYWQoKSB7XG5cdFx0ICByZXR1cm4gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQ29waWVkIGZyb20gYG5vZGUvc3JjL25vZGUuanNgLlxuXHRcdCAqXG5cdFx0ICogWFhYOiBJdCdzIGxhbWUgdGhhdCBub2RlIGRvZXNuJ3QgZXhwb3NlIHRoaXMgQVBJIG91dC1vZi10aGUtYm94LiBJdCBhbHNvXG5cdFx0ICogcmVsaWVzIG9uIHRoZSB1bmRvY3VtZW50ZWQgYHR0eV93cmFwLmd1ZXNzSGFuZGxlVHlwZSgpYCB3aGljaCBpcyBhbHNvIGxhbWUuXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBjcmVhdGVXcml0YWJsZVN0ZGlvU3RyZWFtIChmZCkge1xuXHRcdCAgdmFyIHN0cmVhbTtcblx0XHQgIHZhciB0dHlfd3JhcCA9IHByb2Nlc3MuYmluZGluZygndHR5X3dyYXAnKTtcblxuXHRcdCAgLy8gTm90ZSBzdHJlYW0uX3R5cGUgaXMgdXNlZCBmb3IgdGVzdC1tb2R1bGUtbG9hZC1saXN0LmpzXG5cblx0XHQgIHN3aXRjaCAodHR5X3dyYXAuZ3Vlc3NIYW5kbGVUeXBlKGZkKSkge1xuXHRcdCAgICBjYXNlICdUVFknOlxuXHRcdCAgICAgIHN0cmVhbSA9IG5ldyB0dHkuV3JpdGVTdHJlYW0oZmQpO1xuXHRcdCAgICAgIHN0cmVhbS5fdHlwZSA9ICd0dHknO1xuXG5cdFx0ICAgICAgLy8gSGFjayB0byBoYXZlIHN0cmVhbSBub3Qga2VlcCB0aGUgZXZlbnQgbG9vcCBhbGl2ZS5cblx0XHQgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzI2XG5cdFx0ICAgICAgaWYgKHN0cmVhbS5faGFuZGxlICYmIHN0cmVhbS5faGFuZGxlLnVucmVmKSB7XG5cdFx0ICAgICAgICBzdHJlYW0uX2hhbmRsZS51bnJlZigpO1xuXHRcdCAgICAgIH1cblx0XHQgICAgICBicmVhaztcblxuXHRcdCAgICBjYXNlICdGSUxFJzpcblx0XHQgICAgICB2YXIgZnMgPSByZXF1aXJlJCQwX19kZWZhdWx0O1xuXHRcdCAgICAgIHN0cmVhbSA9IG5ldyBmcy5TeW5jV3JpdGVTdHJlYW0oZmQsIHsgYXV0b0Nsb3NlOiBmYWxzZSB9KTtcblx0XHQgICAgICBzdHJlYW0uX3R5cGUgPSAnZnMnO1xuXHRcdCAgICAgIGJyZWFrO1xuXG5cdFx0ICAgIGNhc2UgJ1BJUEUnOlxuXHRcdCAgICBjYXNlICdUQ1AnOlxuXHRcdCAgICAgIHZhciBuZXQgPSByZXF1aXJlJCQzJDI7XG5cdFx0ICAgICAgc3RyZWFtID0gbmV3IG5ldC5Tb2NrZXQoe1xuXHRcdCAgICAgICAgZmQ6IGZkLFxuXHRcdCAgICAgICAgcmVhZGFibGU6IGZhbHNlLFxuXHRcdCAgICAgICAgd3JpdGFibGU6IHRydWVcblx0XHQgICAgICB9KTtcblxuXHRcdCAgICAgIC8vIEZJWE1FIFNob3VsZCBwcm9iYWJseSBoYXZlIGFuIG9wdGlvbiBpbiBuZXQuU29ja2V0IHRvIGNyZWF0ZSBhXG5cdFx0ICAgICAgLy8gc3RyZWFtIGZyb20gYW4gZXhpc3RpbmcgZmQgd2hpY2ggaXMgd3JpdGFibGUgb25seS4gQnV0IGZvciBub3dcblx0XHQgICAgICAvLyB3ZSdsbCBqdXN0IGFkZCB0aGlzIGhhY2sgYW5kIHNldCB0aGUgYHJlYWRhYmxlYCBtZW1iZXIgdG8gZmFsc2UuXG5cdFx0ICAgICAgLy8gVGVzdDogLi9ub2RlIHRlc3QvZml4dHVyZXMvZWNoby5qcyA8IC9ldGMvcGFzc3dkXG5cdFx0ICAgICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG5cdFx0ICAgICAgc3RyZWFtLnJlYWQgPSBudWxsO1xuXHRcdCAgICAgIHN0cmVhbS5fdHlwZSA9ICdwaXBlJztcblxuXHRcdCAgICAgIC8vIEZJWE1FIEhhY2sgdG8gaGF2ZSBzdHJlYW0gbm90IGtlZXAgdGhlIGV2ZW50IGxvb3AgYWxpdmUuXG5cdFx0ICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcyNlxuXHRcdCAgICAgIGlmIChzdHJlYW0uX2hhbmRsZSAmJiBzdHJlYW0uX2hhbmRsZS51bnJlZikge1xuXHRcdCAgICAgICAgc3RyZWFtLl9oYW5kbGUudW5yZWYoKTtcblx0XHQgICAgICB9XG5cdFx0ICAgICAgYnJlYWs7XG5cblx0XHQgICAgZGVmYXVsdDpcblx0XHQgICAgICAvLyBQcm9iYWJseSBhbiBlcnJvciBvbiBpbiB1dl9ndWVzc19oYW5kbGUoKVxuXHRcdCAgICAgIHRocm93IG5ldyBFcnJvcignSW1wbGVtZW50IG1lLiBVbmtub3duIHN0cmVhbSBmaWxlIHR5cGUhJyk7XG5cdFx0ICB9XG5cblx0XHQgIC8vIEZvciBzdXBwb3J0aW5nIGxlZ2FjeSBBUEkgd2UgcHV0IHRoZSBGRCBoZXJlLlxuXHRcdCAgc3RyZWFtLmZkID0gZmQ7XG5cblx0XHQgIHN0cmVhbS5faXNTdGRpbyA9IHRydWU7XG5cblx0XHQgIHJldHVybiBzdHJlYW07XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogSW5pdCBsb2dpYyBmb3IgYGRlYnVnYCBpbnN0YW5jZXMuXG5cdFx0ICpcblx0XHQgKiBDcmVhdGUgYSBuZXcgYGluc3BlY3RPcHRzYCBvYmplY3QgaW4gY2FzZSBgdXNlQ29sb3JzYCBpcyBzZXRcblx0XHQgKiBkaWZmZXJlbnRseSBmb3IgYSBwYXJ0aWN1bGFyIGBkZWJ1Z2AgaW5zdGFuY2UuXG5cdFx0ICovXG5cblx0XHRmdW5jdGlvbiBpbml0IChkZWJ1Zykge1xuXHRcdCAgZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuXHRcdCAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhleHBvcnRzLmluc3BlY3RPcHRzKTtcblx0XHQgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdCAgICBkZWJ1Zy5pbnNwZWN0T3B0c1trZXlzW2ldXSA9IGV4cG9ydHMuaW5zcGVjdE9wdHNba2V5c1tpXV07XG5cdFx0ICB9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBwcm9jZXNzLmVudi5ERUJVR2AgaW5pdGlhbGx5LlxuXHRcdCAqL1xuXG5cdFx0ZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcbn0gKG5vZGUsIG5vZGVFeHBvcnRzKSk7XG5cdHJldHVybiBub2RlRXhwb3J0cztcbn1cblxuLyoqXG4gKiBEZXRlY3QgRWxlY3Ryb24gcmVuZGVyZXIgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbihmdW5jdGlvbiAobW9kdWxlKSB7XG5cdGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG5cdCAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlQnJvd3NlcigpO1xuXHR9IGVsc2Uge1xuXHQgIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZU5vZGUoKTtcblx0fVxufSAoc3JjKSk7XG5cbi8qIVxuICogZW5jb2RldXJsXG4gKiBDb3B5cmlnaHQoYykgMjAxNiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG52YXIgZW5jb2RldXJsID0gZW5jb2RlVXJsJDE7XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIG5vbi1VUkwgY29kZSBwb2ludHMsICphZnRlciogZW5jb2RpbmcgKGkuZS4gbm90IGluY2x1ZGluZyBcIiVcIilcbiAqIGFuZCBpbmNsdWRpbmcgaW52YWxpZCBlc2NhcGUgc2VxdWVuY2VzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRU5DT0RFX0NIQVJTX1JFR0VYUCA9IC8oPzpbXlxceDIxXFx4MjVcXHgyNi1cXHgzQlxceDNEXFx4M0YtXFx4NUJcXHg1RFxceDVGXFx4NjEtXFx4N0FcXHg3RV18JSg/OlteMC05QS1GYS1mXXxbMC05QS1GYS1mXVteMC05QS1GYS1mXXwkKSkrL2c7XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHVubWF0Y2hlZCBzdXJyb2dhdGUgcGFpci5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIFVOTUFUQ0hFRF9TVVJST0dBVEVfUEFJUl9SRUdFWFAgPSAvKF58W15cXHVEODAwLVxcdURCRkZdKVtcXHVEQzAwLVxcdURGRkZdfFtcXHVEODAwLVxcdURCRkZdKFteXFx1REMwMC1cXHVERkZGXXwkKS9nO1xuXG4vKipcbiAqIFN0cmluZyB0byByZXBsYWNlIHVubWF0Y2hlZCBzdXJyb2dhdGUgcGFpciB3aXRoLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgVU5NQVRDSEVEX1NVUlJPR0FURV9QQUlSX1JFUExBQ0UgPSAnJDFcXHVGRkZEJDInO1xuXG4vKipcbiAqIEVuY29kZSBhIFVSTCB0byBhIHBlcmNlbnQtZW5jb2RlZCBmb3JtLCBleGNsdWRpbmcgYWxyZWFkeS1lbmNvZGVkIHNlcXVlbmNlcy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSBhbiBhbHJlYWR5LWVuY29kZWQgVVJMIGFuZCBlbmNvZGUgYWxsIHRoZSBub24tVVJMXG4gKiBjb2RlIHBvaW50cy4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBlbmNvZGUgdGhlIFwiJVwiIGNoYXJhY3RlciB1bmxlc3MgaXQgaXNcbiAqIG5vdCBwYXJ0IG9mIGEgdmFsaWQgc2VxdWVuY2UgKGAlMjBgIHdpbGwgYmUgbGVmdCBhcy1pcywgYnV0IGAlZm9vYCB3aWxsXG4gKiBiZSBlbmNvZGVkIGFzIGAlMjVmb29gKS5cbiAqXG4gKiBUaGlzIGVuY29kZSBpcyBtZWFudCB0byBiZSBcInNhZmVcIiBhbmQgZG9lcyBub3QgdGhyb3cgZXJyb3JzLiBJdCB3aWxsIHRyeSBhc1xuICogaGFyZCBhcyBpdCBjYW4gdG8gcHJvcGVybHkgZW5jb2RlIHRoZSBnaXZlbiBVUkwsIGluY2x1ZGluZyByZXBsYWNpbmcgYW55IHJhdyxcbiAqIHVucGFpcmVkIHN1cnJvZ2F0ZSBwYWlycyB3aXRoIHRoZSBVbmljb2RlIHJlcGxhY2VtZW50IGNoYXJhY3RlciBwcmlvciB0b1xuICogZW5jb2RpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuY29kZVVybCQxICh1cmwpIHtcbiAgcmV0dXJuIFN0cmluZyh1cmwpXG4gICAgLnJlcGxhY2UoVU5NQVRDSEVEX1NVUlJPR0FURV9QQUlSX1JFR0VYUCwgVU5NQVRDSEVEX1NVUlJPR0FURV9QQUlSX1JFUExBQ0UpXG4gICAgLnJlcGxhY2UoRU5DT0RFX0NIQVJTX1JFR0VYUCwgZW5jb2RlVVJJKVxufVxuXG4vKiFcbiAqIGVzY2FwZS1odG1sXG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBBbmRyZWFzIEx1YmJlXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBUaWFuY2hlbmcgXCJUaW1vdGh5XCIgR3VcbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIG1hdGNoSHRtbFJlZ0V4cCA9IC9bXCInJjw+XS87XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxudmFyIGVzY2FwZUh0bWxfMSA9IGVzY2FwZUh0bWwkMTtcblxuLyoqXG4gKiBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcgb2YgaHRtbC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGVzY2FwZSBmb3IgaW5zZXJ0aW5nIGludG8gSFRNTFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVzY2FwZUh0bWwkMShzdHJpbmcpIHtcbiAgdmFyIHN0ciA9ICcnICsgc3RyaW5nO1xuICB2YXIgbWF0Y2ggPSBtYXRjaEh0bWxSZWdFeHAuZXhlYyhzdHIpO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgdmFyIGVzY2FwZTtcbiAgdmFyIGh0bWwgPSAnJztcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxhc3RJbmRleCA9IDA7XG5cbiAgZm9yIChpbmRleCA9IG1hdGNoLmluZGV4OyBpbmRleCA8IHN0ci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBzd2l0Y2ggKHN0ci5jaGFyQ29kZUF0KGluZGV4KSkge1xuICAgICAgY2FzZSAzNDogLy8gXCJcbiAgICAgICAgZXNjYXBlID0gJyZxdW90Oyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzODogLy8gJlxuICAgICAgICBlc2NhcGUgPSAnJmFtcDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzk6IC8vICdcbiAgICAgICAgZXNjYXBlID0gJyYjMzk7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYwOiAvLyA8XG4gICAgICAgIGVzY2FwZSA9ICcmbHQ7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYyOiAvLyA+XG4gICAgICAgIGVzY2FwZSA9ICcmZ3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobGFzdEluZGV4ICE9PSBpbmRleCkge1xuICAgICAgaHRtbCArPSBzdHIuc3Vic3RyaW5nKGxhc3RJbmRleCwgaW5kZXgpO1xuICAgIH1cblxuICAgIGxhc3RJbmRleCA9IGluZGV4ICsgMTtcbiAgICBodG1sICs9IGVzY2FwZTtcbiAgfVxuXG4gIHJldHVybiBsYXN0SW5kZXggIT09IGluZGV4XG4gICAgPyBodG1sICsgc3RyLnN1YnN0cmluZyhsYXN0SW5kZXgsIGluZGV4KVxuICAgIDogaHRtbDtcbn1cblxudmFyIG9uRmluaXNoZWRFeHBvcnRzID0ge307XG52YXIgb25GaW5pc2hlZCQyID0ge1xuICBnZXQgZXhwb3J0cygpeyByZXR1cm4gb25GaW5pc2hlZEV4cG9ydHM7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBvbkZpbmlzaGVkRXhwb3J0cyA9IHY7IH0sXG59O1xuXG4vKiFcbiAqIGVlLWZpcnN0XG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxudmFyIGVlRmlyc3QgPSBmaXJzdCQxO1xuXG4vKipcbiAqIEdldCB0aGUgZmlyc3QgZXZlbnQgaW4gYSBzZXQgb2YgZXZlbnQgZW1pdHRlcnMgYW5kIGV2ZW50IHBhaXJzLlxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IHN0dWZmXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBkb25lXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZmlyc3QkMShzdHVmZiwgZG9uZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3R1ZmYpKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZyBtdXN0IGJlIGFuIGFycmF5IG9mIFtlZSwgZXZlbnRzLi4uXSBhcnJheXMnKVxuXG4gIHZhciBjbGVhbnVwcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R1ZmYubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYXJyID0gc3R1ZmZbaV07XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSB8fCBhcnIubGVuZ3RoIDwgMilcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VhY2ggYXJyYXkgbWVtYmVyIG11c3QgYmUgW2VlLCBldmVudHMuLi5dJylcblxuICAgIHZhciBlZSA9IGFyclswXTtcblxuICAgIGZvciAodmFyIGogPSAxOyBqIDwgYXJyLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZXZlbnQgPSBhcnJbal07XG4gICAgICB2YXIgZm4gPSBsaXN0ZW5lcihldmVudCwgY2FsbGJhY2spO1xuXG4gICAgICAvLyBsaXN0ZW4gdG8gdGhlIGV2ZW50XG4gICAgICBlZS5vbihldmVudCwgZm4pO1xuICAgICAgLy8gcHVzaCB0aGlzIGxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIGNsZWFudXBzXG4gICAgICBjbGVhbnVwcy5wdXNoKHtcbiAgICAgICAgZWU6IGVlLFxuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGZuOiBmbixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgIGNsZWFudXAoKTtcbiAgICBkb25lLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHZhciB4O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xlYW51cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHggPSBjbGVhbnVwc1tpXTtcbiAgICAgIHguZWUucmVtb3ZlTGlzdGVuZXIoeC5ldmVudCwgeC5mbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdGh1bmsoZm4pIHtcbiAgICBkb25lID0gZm47XG4gIH1cblxuICB0aHVuay5jYW5jZWwgPSBjbGVhbnVwO1xuXG4gIHJldHVybiB0aHVua1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxpc3RlbmVyKGV2ZW50LCBkb25lKSB7XG4gIHJldHVybiBmdW5jdGlvbiBvbmV2ZW50KGFyZzEpIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICB2YXIgZWUgPSB0aGlzO1xuICAgIHZhciBlcnIgPSBldmVudCA9PT0gJ2Vycm9yJ1xuICAgICAgPyBhcmcxXG4gICAgICA6IG51bGw7XG5cbiAgICAvLyBjb3B5IGFyZ3MgdG8gcHJldmVudCBhcmd1bWVudHMgZXNjYXBpbmcgc2NvcGVcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgZG9uZShlcnIsIGVlLCBldmVudCwgYXJncyk7XG4gIH1cbn1cblxuLyohXG4gKiBvbi1maW5pc2hlZFxuICogQ29weXJpZ2h0KGMpIDIwMTMgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5vbkZpbmlzaGVkJDIuZXhwb3J0cyA9IG9uRmluaXNoZWQkMTtcbm9uRmluaXNoZWRFeHBvcnRzLmlzRmluaXNoZWQgPSBpc0ZpbmlzaGVkJDE7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGZpcnN0ID0gZWVGaXJzdDtcblxuLyoqXG4gKiBWYXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgZGVmZXIkMiA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbidcbiAgPyBzZXRJbW1lZGlhdGVcbiAgOiBmdW5jdGlvbihmbil7IHByb2Nlc3MubmV4dFRpY2soZm4uYmluZC5hcHBseShmbiwgYXJndW1lbnRzKSk7IH07XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdoZW4gdGhlIHJlc3BvbnNlIGhhcyBmaW5pc2hlZCwgdXNlZnVsIGZvclxuICogY2xlYW5pbmcgdXAgcmVzb3VyY2VzIGFmdGVyd2FyZHMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG1zZ1xuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBvbkZpbmlzaGVkJDEobXNnLCBsaXN0ZW5lcikge1xuICBpZiAoaXNGaW5pc2hlZCQxKG1zZykgIT09IGZhbHNlKSB7XG4gICAgZGVmZXIkMihsaXN0ZW5lciwgbnVsbCwgbXNnKTtcbiAgICByZXR1cm4gbXNnXG4gIH1cblxuICAvLyBhdHRhY2ggdGhlIGxpc3RlbmVyIHRvIHRoZSBtZXNzYWdlXG4gIGF0dGFjaExpc3RlbmVyKG1zZywgbGlzdGVuZXIpO1xuXG4gIHJldHVybiBtc2dcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgbWVzc2FnZSBpcyBhbHJlYWR5IGZpbmlzaGVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBtc2dcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gaXNGaW5pc2hlZCQxKG1zZykge1xuICB2YXIgc29ja2V0ID0gbXNnLnNvY2tldDtcblxuICBpZiAodHlwZW9mIG1zZy5maW5pc2hlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgLy8gT3V0Z29pbmdNZXNzYWdlXG4gICAgcmV0dXJuIEJvb2xlYW4obXNnLmZpbmlzaGVkIHx8IChzb2NrZXQgJiYgIXNvY2tldC53cml0YWJsZSkpXG4gIH1cblxuICBpZiAodHlwZW9mIG1zZy5jb21wbGV0ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgLy8gSW5jb21pbmdNZXNzYWdlXG4gICAgcmV0dXJuIEJvb2xlYW4obXNnLnVwZ3JhZGUgfHwgIXNvY2tldCB8fCAhc29ja2V0LnJlYWRhYmxlIHx8IChtc2cuY29tcGxldGUgJiYgIW1zZy5yZWFkYWJsZSkpXG4gIH1cblxuICAvLyBkb24ndCBrbm93XG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBBdHRhY2ggYSBmaW5pc2hlZCBsaXN0ZW5lciB0byB0aGUgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbXNnXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBhdHRhY2hGaW5pc2hlZExpc3RlbmVyKG1zZywgY2FsbGJhY2spIHtcbiAgdmFyIGVlTXNnO1xuICB2YXIgZWVTb2NrZXQ7XG4gIHZhciBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIG9uRmluaXNoKGVycm9yKSB7XG4gICAgZWVNc2cuY2FuY2VsKCk7XG4gICAgZWVTb2NrZXQuY2FuY2VsKCk7XG5cbiAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgY2FsbGJhY2soZXJyb3IpO1xuICB9XG5cbiAgLy8gZmluaXNoZWQgb24gZmlyc3QgbWVzc2FnZSBldmVudFxuICBlZU1zZyA9IGVlU29ja2V0ID0gZmlyc3QoW1ttc2csICdlbmQnLCAnZmluaXNoJ11dLCBvbkZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gb25Tb2NrZXQoc29ja2V0KSB7XG4gICAgLy8gcmVtb3ZlIGxpc3RlbmVyXG4gICAgbXNnLnJlbW92ZUxpc3RlbmVyKCdzb2NrZXQnLCBvblNvY2tldCk7XG5cbiAgICBpZiAoZmluaXNoZWQpIHJldHVyblxuICAgIGlmIChlZU1zZyAhPT0gZWVTb2NrZXQpIHJldHVyblxuXG4gICAgLy8gZmluaXNoZWQgb24gZmlyc3Qgc29ja2V0IGV2ZW50XG4gICAgZWVTb2NrZXQgPSBmaXJzdChbW3NvY2tldCwgJ2Vycm9yJywgJ2Nsb3NlJ11dLCBvbkZpbmlzaCk7XG4gIH1cblxuICBpZiAobXNnLnNvY2tldCkge1xuICAgIC8vIHNvY2tldCBhbHJlYWR5IGFzc2lnbmVkXG4gICAgb25Tb2NrZXQobXNnLnNvY2tldCk7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyB3YWl0IGZvciBzb2NrZXQgdG8gYmUgYXNzaWduZWRcbiAgbXNnLm9uKCdzb2NrZXQnLCBvblNvY2tldCk7XG5cbiAgaWYgKG1zZy5zb2NrZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIG5vZGUuanMgMC44IHBhdGNoXG4gICAgcGF0Y2hBc3NpZ25Tb2NrZXQobXNnLCBvblNvY2tldCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRhY2ggdGhlIGxpc3RlbmVyIHRvIHRoZSBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBtc2dcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBhdHRhY2hMaXN0ZW5lcihtc2csIGxpc3RlbmVyKSB7XG4gIHZhciBhdHRhY2hlZCA9IG1zZy5fX29uRmluaXNoZWQ7XG5cbiAgLy8gY3JlYXRlIGEgcHJpdmF0ZSBzaW5nbGUgbGlzdGVuZXIgd2l0aCBxdWV1ZVxuICBpZiAoIWF0dGFjaGVkIHx8ICFhdHRhY2hlZC5xdWV1ZSkge1xuICAgIGF0dGFjaGVkID0gbXNnLl9fb25GaW5pc2hlZCA9IGNyZWF0ZUxpc3RlbmVyKG1zZyk7XG4gICAgYXR0YWNoRmluaXNoZWRMaXN0ZW5lcihtc2csIGF0dGFjaGVkKTtcbiAgfVxuXG4gIGF0dGFjaGVkLnF1ZXVlLnB1c2gobGlzdGVuZXIpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBsaXN0ZW5lciBvbiBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBtc2dcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVMaXN0ZW5lcihtc2cpIHtcbiAgZnVuY3Rpb24gbGlzdGVuZXIoZXJyKSB7XG4gICAgaWYgKG1zZy5fX29uRmluaXNoZWQgPT09IGxpc3RlbmVyKSBtc2cuX19vbkZpbmlzaGVkID0gbnVsbDtcbiAgICBpZiAoIWxpc3RlbmVyLnF1ZXVlKSByZXR1cm5cblxuICAgIHZhciBxdWV1ZSA9IGxpc3RlbmVyLnF1ZXVlO1xuICAgIGxpc3RlbmVyLnF1ZXVlID0gbnVsbDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlW2ldKGVyciwgbXNnKTtcbiAgICB9XG4gIH1cblxuICBsaXN0ZW5lci5xdWV1ZSA9IFtdO1xuXG4gIHJldHVybiBsaXN0ZW5lclxufVxuXG4vKipcbiAqIFBhdGNoIFNlcnZlclJlc3BvbnNlLnByb3RvdHlwZS5hc3NpZ25Tb2NrZXQgZm9yIG5vZGUuanMgMC44LlxuICpcbiAqIEBwYXJhbSB7U2VydmVyUmVzcG9uc2V9IHJlc1xuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGF0Y2hBc3NpZ25Tb2NrZXQocmVzLCBjYWxsYmFjaykge1xuICB2YXIgYXNzaWduU29ja2V0ID0gcmVzLmFzc2lnblNvY2tldDtcblxuICBpZiAodHlwZW9mIGFzc2lnblNvY2tldCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuXG5cbiAgLy8gcmVzLm9uKCdzb2NrZXQnLCBjYWxsYmFjaykgaXMgYnJva2VuIGluIDAuOFxuICByZXMuYXNzaWduU29ja2V0ID0gZnVuY3Rpb24gX2Fzc2lnblNvY2tldChzb2NrZXQpIHtcbiAgICBhc3NpZ25Tb2NrZXQuY2FsbCh0aGlzLCBzb2NrZXQpO1xuICAgIGNhbGxiYWNrKHNvY2tldCk7XG4gIH07XG59XG5cbnZhciBwYXJzZXVybEV4cG9ydHMgPSB7fTtcbnZhciBwYXJzZXVybCQxID0ge1xuICBnZXQgZXhwb3J0cygpeyByZXR1cm4gcGFyc2V1cmxFeHBvcnRzOyB9LFxuICBzZXQgZXhwb3J0cyh2KXsgcGFyc2V1cmxFeHBvcnRzID0gdjsgfSxcbn07XG5cbi8qIVxuICogcGFyc2V1cmxcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNyBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgdXJsJDMgPSByZXF1aXJlJCQwJDk7XG52YXIgcGFyc2UkNyA9IHVybCQzLnBhcnNlO1xudmFyIFVybCA9IHVybCQzLlVybDtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5wYXJzZXVybCQxLmV4cG9ydHMgPSBwYXJzZXVybDtcbnBhcnNldXJsRXhwb3J0cy5vcmlnaW5hbCA9IG9yaWdpbmFsdXJsO1xuXG4vKipcbiAqIFBhcnNlIHRoZSBgcmVxYCB1cmwgd2l0aCBtZW1vaXphdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1NlcnZlclJlcXVlc3R9IHJlcVxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHBhcnNldXJsIChyZXEpIHtcbiAgdmFyIHVybCA9IHJlcS51cmw7XG5cbiAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gVVJMIGlzIHVuZGVmaW5lZFxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHZhciBwYXJzZWQgPSByZXEuX3BhcnNlZFVybDtcblxuICBpZiAoZnJlc2godXJsLCBwYXJzZWQpKSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBVUkwgcGFyc2VcbiAgICByZXR1cm4gcGFyc2VkXG4gIH1cblxuICAvLyBQYXJzZSB0aGUgVVJMXG4gIHBhcnNlZCA9IGZhc3RwYXJzZSh1cmwpO1xuICBwYXJzZWQuX3JhdyA9IHVybDtcblxuICByZXR1cm4gKHJlcS5fcGFyc2VkVXJsID0gcGFyc2VkKVxufVxuLyoqXG4gKiBQYXJzZSB0aGUgYHJlcWAgb3JpZ2luYWwgdXJsIHdpdGggZmFsbGJhY2sgYW5kIG1lbW9pemF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U2VydmVyUmVxdWVzdH0gcmVxXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gb3JpZ2luYWx1cmwgKHJlcSkge1xuICB2YXIgdXJsID0gcmVxLm9yaWdpbmFsVXJsO1xuXG4gIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykge1xuICAgIC8vIEZhbGxiYWNrXG4gICAgcmV0dXJuIHBhcnNldXJsKHJlcSlcbiAgfVxuXG4gIHZhciBwYXJzZWQgPSByZXEuX3BhcnNlZE9yaWdpbmFsVXJsO1xuXG4gIGlmIChmcmVzaCh1cmwsIHBhcnNlZCkpIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIFVSTCBwYXJzZVxuICAgIHJldHVybiBwYXJzZWRcbiAgfVxuXG4gIC8vIFBhcnNlIHRoZSBVUkxcbiAgcGFyc2VkID0gZmFzdHBhcnNlKHVybCk7XG4gIHBhcnNlZC5fcmF3ID0gdXJsO1xuXG4gIHJldHVybiAocmVxLl9wYXJzZWRPcmlnaW5hbFVybCA9IHBhcnNlZClcbn1cbi8qKlxuICogUGFyc2UgdGhlIGBzdHJgIHVybCB3aXRoIGZhc3QtcGF0aCBzaG9ydC1jdXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmYXN0cGFyc2UgKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgc3RyLmNoYXJDb2RlQXQoMCkgIT09IDB4MmYgLyogLyAqLykge1xuICAgIHJldHVybiBwYXJzZSQ3KHN0cilcbiAgfVxuXG4gIHZhciBwYXRobmFtZSA9IHN0cjtcbiAgdmFyIHF1ZXJ5ID0gbnVsbDtcbiAgdmFyIHNlYXJjaCA9IG51bGw7XG5cbiAgLy8gVGhpcyB0YWtlcyB0aGUgcmVnZXhwIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL3B1bGwvNzg3OFxuICAvLyBXaGljaCBpcyAvXihcXC9bXj8jXFxzXSopKFxcP1teI1xcc10qKT8kL1xuICAvLyBBbmQgdW5yb2xscyBpdCBpbnRvIGEgZm9yIGxvb3BcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBzd2l0Y2ggKHN0ci5jaGFyQ29kZUF0KGkpKSB7XG4gICAgICBjYXNlIDB4M2Y6IC8qID8gICovXG4gICAgICAgIGlmIChzZWFyY2ggPT09IG51bGwpIHtcbiAgICAgICAgICBwYXRobmFtZSA9IHN0ci5zdWJzdHJpbmcoMCwgaSk7XG4gICAgICAgICAgcXVlcnkgPSBzdHIuc3Vic3RyaW5nKGkgKyAxKTtcbiAgICAgICAgICBzZWFyY2ggPSBzdHIuc3Vic3RyaW5nKGkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDB4MDk6IC8qIFxcdCAqL1xuICAgICAgY2FzZSAweDBhOiAvKiBcXG4gKi9cbiAgICAgIGNhc2UgMHgwYzogLyogXFxmICovXG4gICAgICBjYXNlIDB4MGQ6IC8qIFxcciAqL1xuICAgICAgY2FzZSAweDIwOiAvKiAgICAqL1xuICAgICAgY2FzZSAweDIzOiAvKiAjICAqL1xuICAgICAgY2FzZSAweGEwOlxuICAgICAgY2FzZSAweGZlZmY6XG4gICAgICAgIHJldHVybiBwYXJzZSQ3KHN0cilcbiAgICB9XG4gIH1cblxuICB2YXIgdXJsID0gVXJsICE9PSB1bmRlZmluZWRcbiAgICA/IG5ldyBVcmwoKVxuICAgIDoge307XG5cbiAgdXJsLnBhdGggPSBzdHI7XG4gIHVybC5ocmVmID0gc3RyO1xuICB1cmwucGF0aG5hbWUgPSBwYXRobmFtZTtcblxuICBpZiAoc2VhcmNoICE9PSBudWxsKSB7XG4gICAgdXJsLnF1ZXJ5ID0gcXVlcnk7XG4gICAgdXJsLnNlYXJjaCA9IHNlYXJjaDtcbiAgfVxuXG4gIHJldHVybiB1cmxcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgcGFyc2VkIGlzIHN0aWxsIGZyZXNoIGZvciB1cmwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICogQHBhcmFtIHtvYmplY3R9IHBhcnNlZFVybFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZnJlc2ggKHVybCwgcGFyc2VkVXJsKSB7XG4gIHJldHVybiB0eXBlb2YgcGFyc2VkVXJsID09PSAnb2JqZWN0JyAmJlxuICAgIHBhcnNlZFVybCAhPT0gbnVsbCAmJlxuICAgIChVcmwgPT09IHVuZGVmaW5lZCB8fCBwYXJzZWRVcmwgaW5zdGFuY2VvZiBVcmwpICYmXG4gICAgcGFyc2VkVXJsLl9yYXcgPT09IHVybFxufVxuXG52YXIgcmVxdWlyZSQkMCQxID0ge1xuXHRcIjEwMFwiOiBcIkNvbnRpbnVlXCIsXG5cdFwiMTAxXCI6IFwiU3dpdGNoaW5nIFByb3RvY29sc1wiLFxuXHRcIjEwMlwiOiBcIlByb2Nlc3NpbmdcIixcblx0XCIxMDNcIjogXCJFYXJseSBIaW50c1wiLFxuXHRcIjIwMFwiOiBcIk9LXCIsXG5cdFwiMjAxXCI6IFwiQ3JlYXRlZFwiLFxuXHRcIjIwMlwiOiBcIkFjY2VwdGVkXCIsXG5cdFwiMjAzXCI6IFwiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb25cIixcblx0XCIyMDRcIjogXCJObyBDb250ZW50XCIsXG5cdFwiMjA1XCI6IFwiUmVzZXQgQ29udGVudFwiLFxuXHRcIjIwNlwiOiBcIlBhcnRpYWwgQ29udGVudFwiLFxuXHRcIjIwN1wiOiBcIk11bHRpLVN0YXR1c1wiLFxuXHRcIjIwOFwiOiBcIkFscmVhZHkgUmVwb3J0ZWRcIixcblx0XCIyMjZcIjogXCJJTSBVc2VkXCIsXG5cdFwiMzAwXCI6IFwiTXVsdGlwbGUgQ2hvaWNlc1wiLFxuXHRcIjMwMVwiOiBcIk1vdmVkIFBlcm1hbmVudGx5XCIsXG5cdFwiMzAyXCI6IFwiRm91bmRcIixcblx0XCIzMDNcIjogXCJTZWUgT3RoZXJcIixcblx0XCIzMDRcIjogXCJOb3QgTW9kaWZpZWRcIixcblx0XCIzMDVcIjogXCJVc2UgUHJveHlcIixcblx0XCIzMDZcIjogXCIoVW51c2VkKVwiLFxuXHRcIjMwN1wiOiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLFxuXHRcIjMwOFwiOiBcIlBlcm1hbmVudCBSZWRpcmVjdFwiLFxuXHRcIjQwMFwiOiBcIkJhZCBSZXF1ZXN0XCIsXG5cdFwiNDAxXCI6IFwiVW5hdXRob3JpemVkXCIsXG5cdFwiNDAyXCI6IFwiUGF5bWVudCBSZXF1aXJlZFwiLFxuXHRcIjQwM1wiOiBcIkZvcmJpZGRlblwiLFxuXHRcIjQwNFwiOiBcIk5vdCBGb3VuZFwiLFxuXHRcIjQwNVwiOiBcIk1ldGhvZCBOb3QgQWxsb3dlZFwiLFxuXHRcIjQwNlwiOiBcIk5vdCBBY2NlcHRhYmxlXCIsXG5cdFwiNDA3XCI6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcblx0XCI0MDhcIjogXCJSZXF1ZXN0IFRpbWVvdXRcIixcblx0XCI0MDlcIjogXCJDb25mbGljdFwiLFxuXHRcIjQxMFwiOiBcIkdvbmVcIixcblx0XCI0MTFcIjogXCJMZW5ndGggUmVxdWlyZWRcIixcblx0XCI0MTJcIjogXCJQcmVjb25kaXRpb24gRmFpbGVkXCIsXG5cdFwiNDEzXCI6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIixcblx0XCI0MTRcIjogXCJVUkkgVG9vIExvbmdcIixcblx0XCI0MTVcIjogXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCIsXG5cdFwiNDE2XCI6IFwiUmFuZ2UgTm90IFNhdGlzZmlhYmxlXCIsXG5cdFwiNDE3XCI6IFwiRXhwZWN0YXRpb24gRmFpbGVkXCIsXG5cdFwiNDE4XCI6IFwiSSdtIGEgdGVhcG90XCIsXG5cdFwiNDIxXCI6IFwiTWlzZGlyZWN0ZWQgUmVxdWVzdFwiLFxuXHRcIjQyMlwiOiBcIlVucHJvY2Vzc2FibGUgRW50aXR5XCIsXG5cdFwiNDIzXCI6IFwiTG9ja2VkXCIsXG5cdFwiNDI0XCI6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcblx0XCI0MjVcIjogXCJVbm9yZGVyZWQgQ29sbGVjdGlvblwiLFxuXHRcIjQyNlwiOiBcIlVwZ3JhZGUgUmVxdWlyZWRcIixcblx0XCI0MjhcIjogXCJQcmVjb25kaXRpb24gUmVxdWlyZWRcIixcblx0XCI0MjlcIjogXCJUb28gTWFueSBSZXF1ZXN0c1wiLFxuXHRcIjQzMVwiOiBcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIixcblx0XCI0NTFcIjogXCJVbmF2YWlsYWJsZSBGb3IgTGVnYWwgUmVhc29uc1wiLFxuXHRcIjUwMFwiOiBcIkludGVybmFsIFNlcnZlciBFcnJvclwiLFxuXHRcIjUwMVwiOiBcIk5vdCBJbXBsZW1lbnRlZFwiLFxuXHRcIjUwMlwiOiBcIkJhZCBHYXRld2F5XCIsXG5cdFwiNTAzXCI6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuXHRcIjUwNFwiOiBcIkdhdGV3YXkgVGltZW91dFwiLFxuXHRcIjUwNVwiOiBcIkhUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkXCIsXG5cdFwiNTA2XCI6IFwiVmFyaWFudCBBbHNvIE5lZ290aWF0ZXNcIixcblx0XCI1MDdcIjogXCJJbnN1ZmZpY2llbnQgU3RvcmFnZVwiLFxuXHRcIjUwOFwiOiBcIkxvb3AgRGV0ZWN0ZWRcIixcblx0XCI1MDlcIjogXCJCYW5kd2lkdGggTGltaXQgRXhjZWVkZWRcIixcblx0XCI1MTBcIjogXCJOb3QgRXh0ZW5kZWRcIixcblx0XCI1MTFcIjogXCJOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCJcbn07XG5cbi8qIVxuICogc3RhdHVzZXNcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGNvZGVzID0gcmVxdWlyZSQkMCQxO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbnZhciBzdGF0dXNlcyQxID0gc3RhdHVzO1xuXG4vLyBzdGF0dXMgY29kZSB0byBtZXNzYWdlIG1hcFxuc3RhdHVzLlNUQVRVU19DT0RFUyA9IGNvZGVzO1xuXG4vLyBhcnJheSBvZiBzdGF0dXMgY29kZXNcbnN0YXR1cy5jb2RlcyA9IHBvcHVsYXRlU3RhdHVzZXNNYXAoc3RhdHVzLCBjb2Rlcyk7XG5cbi8vIHN0YXR1cyBjb2RlcyBmb3IgcmVkaXJlY3RzXG5zdGF0dXMucmVkaXJlY3QgPSB7XG4gIDMwMDogdHJ1ZSxcbiAgMzAxOiB0cnVlLFxuICAzMDI6IHRydWUsXG4gIDMwMzogdHJ1ZSxcbiAgMzA1OiB0cnVlLFxuICAzMDc6IHRydWUsXG4gIDMwODogdHJ1ZVxufTtcblxuLy8gc3RhdHVzIGNvZGVzIGZvciBlbXB0eSBib2RpZXNcbnN0YXR1cy5lbXB0eSA9IHtcbiAgMjA0OiB0cnVlLFxuICAyMDU6IHRydWUsXG4gIDMwNDogdHJ1ZVxufTtcblxuLy8gc3RhdHVzIGNvZGVzIGZvciB3aGVuIHlvdSBzaG91bGQgcmV0cnkgdGhlIHJlcXVlc3RcbnN0YXR1cy5yZXRyeSA9IHtcbiAgNTAyOiB0cnVlLFxuICA1MDM6IHRydWUsXG4gIDUwNDogdHJ1ZVxufTtcblxuLyoqXG4gKiBQb3B1bGF0ZSB0aGUgc3RhdHVzZXMgbWFwIGZvciBnaXZlbiBjb2Rlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcG9wdWxhdGVTdGF0dXNlc01hcCAoc3RhdHVzZXMsIGNvZGVzKSB7XG4gIHZhciBhcnIgPSBbXTtcblxuICBPYmplY3Qua2V5cyhjb2RlcykuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoQ29kZSAoY29kZSkge1xuICAgIHZhciBtZXNzYWdlID0gY29kZXNbY29kZV07XG4gICAgdmFyIHN0YXR1cyA9IE51bWJlcihjb2RlKTtcblxuICAgIC8vIFBvcHVsYXRlIHByb3BlcnRpZXNcbiAgICBzdGF0dXNlc1tzdGF0dXNdID0gbWVzc2FnZTtcbiAgICBzdGF0dXNlc1ttZXNzYWdlXSA9IHN0YXR1cztcbiAgICBzdGF0dXNlc1ttZXNzYWdlLnRvTG93ZXJDYXNlKCldID0gc3RhdHVzO1xuXG4gICAgLy8gQWRkIHRvIGFycmF5XG4gICAgYXJyLnB1c2goc3RhdHVzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGFyclxufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhdHVzIGNvZGUuXG4gKlxuICogR2l2ZW4gYSBudW1iZXIsIHRoaXMgd2lsbCB0aHJvdyBpZiBpdCBpcyBub3QgYSBrbm93biBzdGF0dXNcbiAqIGNvZGUsIG90aGVyd2lzZSB0aGUgY29kZSB3aWxsIGJlIHJldHVybmVkLiBHaXZlbiBhIHN0cmluZyxcbiAqIHRoZSBzdHJpbmcgd2lsbCBiZSBwYXJzZWQgZm9yIGEgbnVtYmVyIGFuZCByZXR1cm4gdGhlIGNvZGVcbiAqIGlmIHZhbGlkLCBvdGhlcndpc2Ugd2lsbCBsb29rdXAgdGhlIGNvZGUgYXNzdW1pbmcgdGhpcyBpc1xuICogdGhlIHN0YXR1cyBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gY29kZVxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzdGF0dXMgKGNvZGUpIHtcbiAgaWYgKHR5cGVvZiBjb2RlID09PSAnbnVtYmVyJykge1xuICAgIGlmICghc3RhdHVzW2NvZGVdKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdHVzIGNvZGU6ICcgKyBjb2RlKVxuICAgIHJldHVybiBjb2RlXG4gIH1cblxuICBpZiAodHlwZW9mIGNvZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY29kZSBtdXN0IGJlIGEgbnVtYmVyIG9yIHN0cmluZycpXG4gIH1cblxuICAvLyAnNDAzJ1xuICB2YXIgbiA9IHBhcnNlSW50KGNvZGUsIDEwKTtcbiAgaWYgKCFpc05hTihuKSkge1xuICAgIGlmICghc3RhdHVzW25dKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdHVzIGNvZGU6ICcgKyBuKVxuICAgIHJldHVybiBuXG4gIH1cblxuICBuID0gc3RhdHVzW2NvZGUudG9Mb3dlckNhc2UoKV07XG4gIGlmICghbikgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHN0YXR1cyBtZXNzYWdlOiBcIicgKyBjb2RlICsgJ1wiJylcbiAgcmV0dXJuIG5cbn1cblxuLyohXG4gKiB1bnBpcGVcbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbnZhciB1bnBpcGVfMSA9IHVucGlwZSQxO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGVyZSBhcmUgTm9kZS5qcyBwaXBlLWxpa2UgZGF0YSBsaXN0ZW5lcnMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGhhc1BpcGVEYXRhTGlzdGVuZXJzKHN0cmVhbSkge1xuICB2YXIgbGlzdGVuZXJzID0gc3RyZWFtLmxpc3RlbmVycygnZGF0YScpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGxpc3RlbmVyc1tpXS5uYW1lID09PSAnb25kYXRhJykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBVbnBpcGUgYSBzdHJlYW0gZnJvbSBhbGwgZGVzdGluYXRpb25zLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB1bnBpcGUkMShzdHJlYW0pIHtcbiAgaWYgKCFzdHJlYW0pIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzdHJlYW0gaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0udW5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gbmV3LXN0eWxlXG4gICAgc3RyZWFtLnVucGlwZSgpO1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gTm9kZS5qcyAwLjggaGFja1xuICBpZiAoIWhhc1BpcGVEYXRhTGlzdGVuZXJzKHN0cmVhbSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBsaXN0ZW5lcjtcbiAgdmFyIGxpc3RlbmVycyA9IHN0cmVhbS5saXN0ZW5lcnMoJ2Nsb3NlJyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcblxuICAgIGlmIChsaXN0ZW5lci5uYW1lICE9PSAnY2xlYW51cCcgJiYgbGlzdGVuZXIubmFtZSAhPT0gJ29uY2xvc2UnKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIGludm9rZSB0aGUgbGlzdGVuZXJcbiAgICBsaXN0ZW5lci5jYWxsKHN0cmVhbSk7XG4gIH1cbn1cblxuLyohXG4gKiBmaW5hbGhhbmRsZXJcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTcgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGRlYnVnJDUgPSBzcmNFeHBvcnRzKCdmaW5hbGhhbmRsZXInKTtcbnZhciBlbmNvZGVVcmwgPSBlbmNvZGV1cmw7XG52YXIgZXNjYXBlSHRtbCA9IGVzY2FwZUh0bWxfMTtcbnZhciBvbkZpbmlzaGVkID0gb25GaW5pc2hlZEV4cG9ydHM7XG52YXIgcGFyc2VVcmwkMSA9IHBhcnNldXJsRXhwb3J0cztcbnZhciBzdGF0dXNlcyA9IHN0YXR1c2VzJDE7XG52YXIgdW5waXBlID0gdW5waXBlXzE7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIERPVUJMRV9TUEFDRV9SRUdFWFAgPSAvXFx4MjB7Mn0vZztcbnZhciBORVdMSU5FX1JFR0VYUCA9IC9cXG4vZztcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnZhciBkZWZlciQxID0gdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IHNldEltbWVkaWF0ZVxuICA6IGZ1bmN0aW9uIChmbikgeyBwcm9jZXNzLm5leHRUaWNrKGZuLmJpbmQuYXBwbHkoZm4sIGFyZ3VtZW50cykpOyB9O1xudmFyIGlzRmluaXNoZWQgPSBvbkZpbmlzaGVkLmlzRmluaXNoZWQ7XG5cbi8qKlxuICogQ3JlYXRlIGEgbWluaW1hbCBIVE1MIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUh0bWxEb2N1bWVudCAobWVzc2FnZSkge1xuICB2YXIgYm9keSA9IGVzY2FwZUh0bWwobWVzc2FnZSlcbiAgICAucmVwbGFjZShORVdMSU5FX1JFR0VYUCwgJzxicj4nKVxuICAgIC5yZXBsYWNlKERPVUJMRV9TUEFDRV9SRUdFWFAsICcgJm5ic3A7Jyk7XG5cbiAgcmV0dXJuICc8IURPQ1RZUEUgaHRtbD5cXG4nICtcbiAgICAnPGh0bWwgbGFuZz1cImVuXCI+XFxuJyArXG4gICAgJzxoZWFkPlxcbicgK1xuICAgICc8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cXG4nICtcbiAgICAnPHRpdGxlPkVycm9yPC90aXRsZT5cXG4nICtcbiAgICAnPC9oZWFkPlxcbicgK1xuICAgICc8Ym9keT5cXG4nICtcbiAgICAnPHByZT4nICsgYm9keSArICc8L3ByZT5cXG4nICtcbiAgICAnPC9ib2R5PlxcbicgK1xuICAgICc8L2h0bWw+XFxuJ1xufVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbnZhciBmaW5hbGhhbmRsZXJfMSA9IGZpbmFsaGFuZGxlciQxO1xuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgZmluYWwgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtSZXF1ZXN0fSByZXFcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZmluYWxoYW5kbGVyJDEgKHJlcSwgcmVzLCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBnZXQgZW52aXJvbm1lbnRcbiAgdmFyIGVudiA9IG9wdHMuZW52IHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG5cbiAgLy8gZ2V0IGVycm9yIGNhbGxiYWNrXG4gIHZhciBvbmVycm9yID0gb3B0cy5vbmVycm9yO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGhlYWRlcnM7XG4gICAgdmFyIG1zZztcbiAgICB2YXIgc3RhdHVzO1xuXG4gICAgLy8gaWdub3JlIDQwNCBvbiBpbi1mbGlnaHQgcmVzcG9uc2VcbiAgICBpZiAoIWVyciAmJiBoZWFkZXJzU2VudChyZXMpKSB7XG4gICAgICBkZWJ1ZyQ1KCdjYW5ub3QgNDA0IGFmdGVyIGhlYWRlcnMgc2VudCcpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW5oYW5kbGVkIGVycm9yXG4gICAgaWYgKGVycikge1xuICAgICAgLy8gcmVzcGVjdCBzdGF0dXMgY29kZSBmcm9tIGVycm9yXG4gICAgICBzdGF0dXMgPSBnZXRFcnJvclN0YXR1c0NvZGUoZXJyKTtcblxuICAgICAgaWYgKHN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGZhbGxiYWNrIHRvIHN0YXR1cyBjb2RlIG9uIHJlc3BvbnNlXG4gICAgICAgIHN0YXR1cyA9IGdldFJlc3BvbnNlU3RhdHVzQ29kZShyZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVzcGVjdCBoZWFkZXJzIGZyb20gZXJyb3JcbiAgICAgICAgaGVhZGVycyA9IGdldEVycm9ySGVhZGVycyhlcnIpO1xuICAgICAgfVxuXG4gICAgICAvLyBnZXQgZXJyb3IgbWVzc2FnZVxuICAgICAgbXNnID0gZ2V0RXJyb3JNZXNzYWdlKGVyciwgc3RhdHVzLCBlbnYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub3QgZm91bmRcbiAgICAgIHN0YXR1cyA9IDQwNDtcbiAgICAgIG1zZyA9ICdDYW5ub3QgJyArIHJlcS5tZXRob2QgKyAnICcgKyBlbmNvZGVVcmwoZ2V0UmVzb3VyY2VOYW1lKHJlcSkpO1xuICAgIH1cblxuICAgIGRlYnVnJDUoJ2RlZmF1bHQgJXMnLCBzdGF0dXMpO1xuXG4gICAgLy8gc2NoZWR1bGUgb25lcnJvciBjYWxsYmFja1xuICAgIGlmIChlcnIgJiYgb25lcnJvcikge1xuICAgICAgZGVmZXIkMShvbmVycm9yLCBlcnIsIHJlcSwgcmVzKTtcbiAgICB9XG5cbiAgICAvLyBjYW5ub3QgYWN0dWFsbHkgcmVzcG9uZFxuICAgIGlmIChoZWFkZXJzU2VudChyZXMpKSB7XG4gICAgICBkZWJ1ZyQ1KCdjYW5ub3QgJWQgYWZ0ZXIgaGVhZGVycyBzZW50Jywgc3RhdHVzKTtcbiAgICAgIHJlcS5zb2NrZXQuZGVzdHJveSgpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gc2VuZCByZXNwb25zZVxuICAgIHNlbmQocmVxLCByZXMsIHN0YXR1cywgaGVhZGVycywgbXNnKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBoZWFkZXJzIGZyb20gRXJyb3Igb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHJldHVybiB7b2JqZWN0fVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRFcnJvckhlYWRlcnMgKGVycikge1xuICBpZiAoIWVyci5oZWFkZXJzIHx8IHR5cGVvZiBlcnIuaGVhZGVycyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICB2YXIgaGVhZGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXJyLmhlYWRlcnMpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGhlYWRlcnNba2V5XSA9IGVyci5oZWFkZXJzW2tleV07XG4gIH1cblxuICByZXR1cm4gaGVhZGVyc1xufVxuXG4vKipcbiAqIEdldCBtZXNzYWdlIGZyb20gRXJyb3Igb2JqZWN0LCBmYWxsYmFjayB0byBzdGF0dXMgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbnZcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlIChlcnIsIHN0YXR1cywgZW52KSB7XG4gIHZhciBtc2c7XG5cbiAgaWYgKGVudiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gdXNlIGVyci5zdGFjaywgd2hpY2ggdHlwaWNhbGx5IGluY2x1ZGVzIGVyci5tZXNzYWdlXG4gICAgbXNnID0gZXJyLnN0YWNrO1xuXG4gICAgLy8gZmFsbGJhY2sgdG8gZXJyLnRvU3RyaW5nKCkgd2hlbiBwb3NzaWJsZVxuICAgIGlmICghbXNnICYmIHR5cGVvZiBlcnIudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1zZyA9IGVyci50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtc2cgfHwgc3RhdHVzZXNbc3RhdHVzXVxufVxuXG4vKipcbiAqIEdldCBzdGF0dXMgY29kZSBmcm9tIEVycm9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXJyb3JTdGF0dXNDb2RlIChlcnIpIHtcbiAgLy8gY2hlY2sgZXJyLnN0YXR1c1xuICBpZiAodHlwZW9mIGVyci5zdGF0dXMgPT09ICdudW1iZXInICYmIGVyci5zdGF0dXMgPj0gNDAwICYmIGVyci5zdGF0dXMgPCA2MDApIHtcbiAgICByZXR1cm4gZXJyLnN0YXR1c1xuICB9XG5cbiAgLy8gY2hlY2sgZXJyLnN0YXR1c0NvZGVcbiAgaWYgKHR5cGVvZiBlcnIuc3RhdHVzQ29kZSA9PT0gJ251bWJlcicgJiYgZXJyLnN0YXR1c0NvZGUgPj0gNDAwICYmIGVyci5zdGF0dXNDb2RlIDwgNjAwKSB7XG4gICAgcmV0dXJuIGVyci5zdGF0dXNDb2RlXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogR2V0IHJlc291cmNlIG5hbWUgZm9yIHRoZSByZXF1ZXN0LlxuICpcbiAqIFRoaXMgaXMgdHlwaWNhbGx5IGp1c3QgdGhlIG9yaWdpbmFsIHBhdGhuYW1lIG9mIHRoZSByZXF1ZXN0XG4gKiBidXQgd2lsbCBmYWxsYmFjayB0byBcInJlc291cmNlXCIgaXMgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAqXG4gKiBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gcmVxXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldFJlc291cmNlTmFtZSAocmVxKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlVXJsJDEub3JpZ2luYWwocmVxKS5wYXRobmFtZVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuICdyZXNvdXJjZSdcbiAgfVxufVxuXG4vKipcbiAqIEdldCBzdGF0dXMgY29kZSBmcm9tIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7T3V0Z29pbmdNZXNzYWdlfSByZXNcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0UmVzcG9uc2VTdGF0dXNDb2RlIChyZXMpIHtcbiAgdmFyIHN0YXR1cyA9IHJlcy5zdGF0dXNDb2RlO1xuXG4gIC8vIGRlZmF1bHQgc3RhdHVzIGNvZGUgdG8gNTAwIGlmIG91dHNpZGUgdmFsaWQgcmFuZ2VcbiAgaWYgKHR5cGVvZiBzdGF0dXMgIT09ICdudW1iZXInIHx8IHN0YXR1cyA8IDQwMCB8fCBzdGF0dXMgPiA1OTkpIHtcbiAgICBzdGF0dXMgPSA1MDA7XG4gIH1cblxuICByZXR1cm4gc3RhdHVzXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSByZXNwb25zZSBoZWFkZXJzIGhhdmUgYmVlbiBzZW50LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBoZWFkZXJzU2VudCAocmVzKSB7XG4gIHJldHVybiB0eXBlb2YgcmVzLmhlYWRlcnNTZW50ICE9PSAnYm9vbGVhbidcbiAgICA/IEJvb2xlYW4ocmVzLl9oZWFkZXIpXG4gICAgOiByZXMuaGVhZGVyc1NlbnRcbn1cblxuLyoqXG4gKiBTZW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7SW5jb21pbmdNZXNzYWdlfSByZXFcbiAqIEBwYXJhbSB7T3V0Z29pbmdNZXNzYWdlfSByZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBoZWFkZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZW5kIChyZXEsIHJlcywgc3RhdHVzLCBoZWFkZXJzLCBtZXNzYWdlKSB7XG4gIGZ1bmN0aW9uIHdyaXRlICgpIHtcbiAgICAvLyByZXNwb25zZSBib2R5XG4gICAgdmFyIGJvZHkgPSBjcmVhdGVIdG1sRG9jdW1lbnQobWVzc2FnZSk7XG5cbiAgICAvLyByZXNwb25zZSBzdGF0dXNcbiAgICByZXMuc3RhdHVzQ29kZSA9IHN0YXR1cztcbiAgICByZXMuc3RhdHVzTWVzc2FnZSA9IHN0YXR1c2VzW3N0YXR1c107XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzXG4gICAgc2V0SGVhZGVycyhyZXMsIGhlYWRlcnMpO1xuXG4gICAgLy8gc2VjdXJpdHkgaGVhZGVyc1xuICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtU2VjdXJpdHktUG9saWN5JywgXCJkZWZhdWx0LXNyYyAnbm9uZSdcIik7XG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJyk7XG5cbiAgICAvLyBzdGFuZGFyZCBoZWFkZXJzXG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgQnVmZmVyLmJ5dGVMZW5ndGgoYm9keSwgJ3V0ZjgnKSk7XG5cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICByZXMuZW5kKCk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXMuZW5kKGJvZHksICd1dGY4Jyk7XG4gIH1cblxuICBpZiAoaXNGaW5pc2hlZChyZXEpKSB7XG4gICAgd3JpdGUoKTtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIHVucGlwZSBldmVyeXRoaW5nIGZyb20gdGhlIHJlcXVlc3RcbiAgdW5waXBlKHJlcSk7XG5cbiAgLy8gZmx1c2ggdGhlIHJlcXVlc3RcbiAgb25GaW5pc2hlZChyZXEsIHdyaXRlKTtcbiAgcmVxLnJlc3VtZSgpO1xufVxuXG4vKipcbiAqIFNldCByZXNwb25zZSBoZWFkZXJzIGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T3V0Z29pbmdNZXNzYWdlfSByZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBoZWFkZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNldEhlYWRlcnMgKHJlcywgaGVhZGVycykge1xuICBpZiAoIWhlYWRlcnMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHJlcy5zZXRIZWFkZXIoa2V5LCBoZWFkZXJzW2tleV0pO1xuICB9XG59XG5cbnZhciB1dGlsc01lcmdlRXhwb3J0cyA9IHt9O1xudmFyIHV0aWxzTWVyZ2UgPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiB1dGlsc01lcmdlRXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IHV0aWxzTWVyZ2VFeHBvcnRzID0gdjsgfSxcbn07XG5cbi8qKlxuICogTWVyZ2Ugb2JqZWN0IGIgd2l0aCBvYmplY3QgYS5cbiAqXG4gKiAgICAgdmFyIGEgPSB7IGZvbzogJ2JhcicgfVxuICogICAgICAgLCBiID0geyBiYXI6ICdiYXonIH07XG4gKlxuICogICAgIG1lcmdlKGEsIGIpO1xuICogICAgIC8vID0+IHsgZm9vOiAnYmFyJywgYmFyOiAnYmF6JyB9XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFcbiAqIEBwYXJhbSB7T2JqZWN0fSBiXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbihmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYSwgYil7XG5cdCAgaWYgKGEgJiYgYikge1xuXHQgICAgZm9yICh2YXIga2V5IGluIGIpIHtcblx0ICAgICAgYVtrZXldID0gYltrZXldO1xuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gYTtcblx0fTtcbn0gKHV0aWxzTWVyZ2UpKTtcblxuLyohXG4gKiBjb25uZWN0XG4gKiBDb3B5cmlnaHQoYykgMjAxMCBTZW5jaGEgSW5jLlxuICogQ29weXJpZ2h0KGMpIDIwMTEgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkZWJ1ZyQ0ID0gc3JjRXhwb3J0cygnY29ubmVjdDpkaXNwYXRjaGVyJyk7XG52YXIgRXZlbnRFbWl0dGVyJDMgPSByZXF1aXJlJCQwJDUuRXZlbnRFbWl0dGVyO1xudmFyIGZpbmFsaGFuZGxlciA9IGZpbmFsaGFuZGxlcl8xO1xudmFyIGh0dHAkNCA9IHJlcXVpcmUkJDEkMTtcbnZhciBtZXJnZSA9IHV0aWxzTWVyZ2VFeHBvcnRzO1xudmFyIHBhcnNlVXJsID0gcGFyc2V1cmxFeHBvcnRzO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbnZhciBjb25uZWN0ID0gY3JlYXRlU2VydmVyJDE7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGVudiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG52YXIgcHJvdG8gPSB7fTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnZhciBkZWZlciA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbidcbiAgPyBzZXRJbW1lZGlhdGVcbiAgOiBmdW5jdGlvbihmbil7IHByb2Nlc3MubmV4dFRpY2soZm4uYmluZC5hcHBseShmbiwgYXJndW1lbnRzKSk7IH07XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGNvbm5lY3Qgc2VydmVyLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZVNlcnZlciQxKCkge1xuICBmdW5jdGlvbiBhcHAocmVxLCByZXMsIG5leHQpeyBhcHAuaGFuZGxlKHJlcSwgcmVzLCBuZXh0KTsgfVxuICBtZXJnZShhcHAsIHByb3RvKTtcbiAgbWVyZ2UoYXBwLCBFdmVudEVtaXR0ZXIkMy5wcm90b3R5cGUpO1xuICBhcHAucm91dGUgPSAnLyc7XG4gIGFwcC5zdGFjayA9IFtdO1xuICByZXR1cm4gYXBwO1xufVxuXG4vKipcbiAqIFV0aWxpemUgdGhlIGdpdmVuIG1pZGRsZXdhcmUgYGhhbmRsZWAgdG8gdGhlIGdpdmVuIGByb3V0ZWAsXG4gKiBkZWZhdWx0aW5nIHRvIF8vXy4gVGhpcyBcInJvdXRlXCIgaXMgdGhlIG1vdW50LXBvaW50IGZvciB0aGVcbiAqIG1pZGRsZXdhcmUsIHdoZW4gZ2l2ZW4gYSB2YWx1ZSBvdGhlciB0aGFuIF8vXyB0aGUgbWlkZGxld2FyZVxuICogaXMgb25seSBlZmZlY3RpdmUgd2hlbiB0aGF0IHNlZ21lbnQgaXMgcHJlc2VudCBpbiB0aGUgcmVxdWVzdCdzXG4gKiBwYXRobmFtZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSBpZiB3ZSB3ZXJlIHRvIG1vdW50IGEgZnVuY3Rpb24gYXQgXy9hZG1pbl8sIGl0IHdvdWxkXG4gKiBiZSBpbnZva2VkIG9uIF8vYWRtaW5fLCBhbmQgXy9hZG1pbi9zZXR0aW5nc18sIGhvd2V2ZXIgaXQgd291bGRcbiAqIG5vdCBiZSBpbnZva2VkIGZvciBfL18sIG9yIF8vcG9zdHNfLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufFNlcnZlcn0gcm91dGUsIGNhbGxiYWNrIG9yIHNlcnZlclxuICogQHBhcmFtIHtGdW5jdGlvbnxTZXJ2ZXJ9IGNhbGxiYWNrIG9yIHNlcnZlclxuICogQHJldHVybiB7U2VydmVyfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5wcm90by51c2UgPSBmdW5jdGlvbiB1c2Uocm91dGUsIGZuKSB7XG4gIHZhciBoYW5kbGUgPSBmbjtcbiAgdmFyIHBhdGggPSByb3V0ZTtcblxuICAvLyBkZWZhdWx0IHJvdXRlIHRvICcvJ1xuICBpZiAodHlwZW9mIHJvdXRlICE9PSAnc3RyaW5nJykge1xuICAgIGhhbmRsZSA9IHJvdXRlO1xuICAgIHBhdGggPSAnLyc7XG4gIH1cblxuICAvLyB3cmFwIHN1Yi1hcHBzXG4gIGlmICh0eXBlb2YgaGFuZGxlLmhhbmRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzZXJ2ZXIgPSBoYW5kbGU7XG4gICAgc2VydmVyLnJvdXRlID0gcGF0aDtcbiAgICBoYW5kbGUgPSBmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHtcbiAgICAgIHNlcnZlci5oYW5kbGUocmVxLCByZXMsIG5leHQpO1xuICAgIH07XG4gIH1cblxuICAvLyB3cmFwIHZhbmlsbGEgaHR0cC5TZXJ2ZXJzXG4gIGlmIChoYW5kbGUgaW5zdGFuY2VvZiBodHRwJDQuU2VydmVyKSB7XG4gICAgaGFuZGxlID0gaGFuZGxlLmxpc3RlbmVycygncmVxdWVzdCcpWzBdO1xuICB9XG5cbiAgLy8gc3RyaXAgdHJhaWxpbmcgc2xhc2hcbiAgaWYgKHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gJy8nKSB7XG4gICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpO1xuICB9XG5cbiAgLy8gYWRkIHRoZSBtaWRkbGV3YXJlXG4gIGRlYnVnJDQoJ3VzZSAlcyAlcycsIHBhdGggfHwgJy8nLCBoYW5kbGUubmFtZSB8fCAnYW5vbnltb3VzJyk7XG4gIHRoaXMuc3RhY2sucHVzaCh7IHJvdXRlOiBwYXRoLCBoYW5kbGU6IGhhbmRsZSB9KTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogSGFuZGxlIHNlcnZlciByZXF1ZXN0cywgcHVudGluZyB0aGVtIGRvd25cbiAqIHRoZSBtaWRkbGV3YXJlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxucHJvdG8uaGFuZGxlID0gZnVuY3Rpb24gaGFuZGxlKHJlcSwgcmVzLCBvdXQpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHByb3RvaG9zdCA9IGdldFByb3RvaG9zdChyZXEudXJsKSB8fCAnJztcbiAgdmFyIHJlbW92ZWQgPSAnJztcbiAgdmFyIHNsYXNoQWRkZWQgPSBmYWxzZTtcbiAgdmFyIHN0YWNrID0gdGhpcy5zdGFjaztcblxuICAvLyBmaW5hbCBmdW5jdGlvbiBoYW5kbGVyXG4gIHZhciBkb25lID0gb3V0IHx8IGZpbmFsaGFuZGxlcihyZXEsIHJlcywge1xuICAgIGVudjogZW52LFxuICAgIG9uZXJyb3I6IGxvZ2Vycm9yXG4gIH0pO1xuXG4gIC8vIHN0b3JlIHRoZSBvcmlnaW5hbCBVUkxcbiAgcmVxLm9yaWdpbmFsVXJsID0gcmVxLm9yaWdpbmFsVXJsIHx8IHJlcS51cmw7XG5cbiAgZnVuY3Rpb24gbmV4dChlcnIpIHtcbiAgICBpZiAoc2xhc2hBZGRlZCkge1xuICAgICAgcmVxLnVybCA9IHJlcS51cmwuc3Vic3RyKDEpO1xuICAgICAgc2xhc2hBZGRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChyZW1vdmVkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmVxLnVybCA9IHByb3RvaG9zdCArIHJlbW92ZWQgKyByZXEudXJsLnN1YnN0cihwcm90b2hvc3QubGVuZ3RoKTtcbiAgICAgIHJlbW92ZWQgPSAnJztcbiAgICB9XG5cbiAgICAvLyBuZXh0IGNhbGxiYWNrXG4gICAgdmFyIGxheWVyID0gc3RhY2tbaW5kZXgrK107XG5cbiAgICAvLyBhbGwgZG9uZVxuICAgIGlmICghbGF5ZXIpIHtcbiAgICAgIGRlZmVyKGRvbmUsIGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gcm91dGUgZGF0YVxuICAgIHZhciBwYXRoID0gcGFyc2VVcmwocmVxKS5wYXRobmFtZSB8fCAnLyc7XG4gICAgdmFyIHJvdXRlID0gbGF5ZXIucm91dGU7XG5cbiAgICAvLyBza2lwIHRoaXMgbGF5ZXIgaWYgdGhlIHJvdXRlIGRvZXNuJ3QgbWF0Y2hcbiAgICBpZiAocGF0aC50b0xvd2VyQ2FzZSgpLnN1YnN0cigwLCByb3V0ZS5sZW5ndGgpICE9PSByb3V0ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gbmV4dChlcnIpO1xuICAgIH1cblxuICAgIC8vIHNraXAgaWYgcm91dGUgbWF0Y2ggZG9lcyBub3QgYm9yZGVyIFwiL1wiLCBcIi5cIiwgb3IgZW5kXG4gICAgdmFyIGMgPSBwYXRoLmxlbmd0aCA+IHJvdXRlLmxlbmd0aCAmJiBwYXRoW3JvdXRlLmxlbmd0aF07XG4gICAgaWYgKGMgJiYgYyAhPT0gJy8nICYmIGMgIT09ICcuJykge1xuICAgICAgcmV0dXJuIG5leHQoZXJyKTtcbiAgICB9XG5cbiAgICAvLyB0cmltIG9mZiB0aGUgcGFydCBvZiB0aGUgdXJsIHRoYXQgbWF0Y2hlcyB0aGUgcm91dGVcbiAgICBpZiAocm91dGUubGVuZ3RoICE9PSAwICYmIHJvdXRlICE9PSAnLycpIHtcbiAgICAgIHJlbW92ZWQgPSByb3V0ZTtcbiAgICAgIHJlcS51cmwgPSBwcm90b2hvc3QgKyByZXEudXJsLnN1YnN0cihwcm90b2hvc3QubGVuZ3RoICsgcmVtb3ZlZC5sZW5ndGgpO1xuXG4gICAgICAvLyBlbnN1cmUgbGVhZGluZyBzbGFzaFxuICAgICAgaWYgKCFwcm90b2hvc3QgJiYgcmVxLnVybFswXSAhPT0gJy8nKSB7XG4gICAgICAgIHJlcS51cmwgPSAnLycgKyByZXEudXJsO1xuICAgICAgICBzbGFzaEFkZGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxsIHRoZSBsYXllciBoYW5kbGVcbiAgICBjYWxsKGxheWVyLmhhbmRsZSwgcm91dGUsIGVyciwgcmVxLCByZXMsIG5leHQpO1xuICB9XG5cbiAgbmV4dCgpO1xufTtcblxuLyoqXG4gKiBMaXN0ZW4gZm9yIGNvbm5lY3Rpb25zLlxuICpcbiAqIFRoaXMgbWV0aG9kIHRha2VzIHRoZSBzYW1lIGFyZ3VtZW50c1xuICogYXMgbm9kZSdzIGBodHRwLlNlcnZlciNsaXN0ZW4oKWAuXG4gKlxuICogSFRUUCBhbmQgSFRUUFM6XG4gKlxuICogSWYgeW91IHJ1biB5b3VyIGFwcGxpY2F0aW9uIGJvdGggYXMgSFRUUFxuICogYW5kIEhUVFBTIHlvdSBtYXkgd3JhcCB0aGVtIGluZGl2aWR1YWxseSxcbiAqIHNpbmNlIHlvdXIgQ29ubmVjdCBcInNlcnZlclwiIGlzIHJlYWxseSBqdXN0XG4gKiBhIEphdmFTY3JpcHQgYEZ1bmN0aW9uYC5cbiAqXG4gKiAgICAgIHZhciBjb25uZWN0ID0gcmVxdWlyZSgnY29ubmVjdCcpXG4gKiAgICAgICAgLCBodHRwID0gcmVxdWlyZSgnaHR0cCcpXG4gKiAgICAgICAgLCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG4gKlxuICogICAgICB2YXIgYXBwID0gY29ubmVjdCgpO1xuICpcbiAqICAgICAgaHR0cC5jcmVhdGVTZXJ2ZXIoYXBwKS5saXN0ZW4oODApO1xuICogICAgICBodHRwcy5jcmVhdGVTZXJ2ZXIob3B0aW9ucywgYXBwKS5saXN0ZW4oNDQzKTtcbiAqXG4gKiBAcmV0dXJuIHtodHRwLlNlcnZlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucHJvdG8ubGlzdGVuID0gZnVuY3Rpb24gbGlzdGVuKCkge1xuICB2YXIgc2VydmVyID0gaHR0cCQ0LmNyZWF0ZVNlcnZlcih0aGlzKTtcbiAgcmV0dXJuIHNlcnZlci5saXN0ZW4uYXBwbHkoc2VydmVyLCBhcmd1bWVudHMpO1xufTtcblxuLyoqXG4gKiBJbnZva2UgYSByb3V0ZSBoYW5kbGUuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNhbGwoaGFuZGxlLCByb3V0ZSwgZXJyLCByZXEsIHJlcywgbmV4dCkge1xuICB2YXIgYXJpdHkgPSBoYW5kbGUubGVuZ3RoO1xuICB2YXIgZXJyb3IgPSBlcnI7XG4gIHZhciBoYXNFcnJvciA9IEJvb2xlYW4oZXJyKTtcblxuICBkZWJ1ZyQ0KCclcyAlcyA6ICVzJywgaGFuZGxlLm5hbWUgfHwgJzxhbm9ueW1vdXM+Jywgcm91dGUsIHJlcS5vcmlnaW5hbFVybCk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoaGFzRXJyb3IgJiYgYXJpdHkgPT09IDQpIHtcbiAgICAgIC8vIGVycm9yLWhhbmRsaW5nIG1pZGRsZXdhcmVcbiAgICAgIGhhbmRsZShlcnIsIHJlcSwgcmVzLCBuZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKCFoYXNFcnJvciAmJiBhcml0eSA8IDQpIHtcbiAgICAgIC8vIHJlcXVlc3QtaGFuZGxpbmcgbWlkZGxld2FyZVxuICAgICAgaGFuZGxlKHJlcSwgcmVzLCBuZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyByZXBsYWNlIHRoZSBlcnJvclxuICAgIGVycm9yID0gZTtcbiAgfVxuXG4gIC8vIGNvbnRpbnVlXG4gIG5leHQoZXJyb3IpO1xufVxuXG4vKipcbiAqIExvZyBlcnJvciB1c2luZyBjb25zb2xlLmVycm9yLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2dlcnJvcihlcnIpIHtcbiAgaWYgKGVudiAhPT0gJ3Rlc3QnKSBjb25zb2xlLmVycm9yKGVyci5zdGFjayB8fCBlcnIudG9TdHJpbmcoKSk7XG59XG5cbi8qKlxuICogR2V0IGdldCBwcm90b2NvbCArIGhvc3QgZm9yIGEgVVJMLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0UHJvdG9ob3N0KHVybCkge1xuICBpZiAodXJsLmxlbmd0aCA9PT0gMCB8fCB1cmxbMF0gPT09ICcvJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgZnFkbkluZGV4ID0gdXJsLmluZGV4T2YoJzovLycpO1xuXG4gIHJldHVybiBmcWRuSW5kZXggIT09IC0xICYmIHVybC5sYXN0SW5kZXhPZignPycsIGZxZG5JbmRleCkgPT09IC0xXG4gICAgPyB1cmwuc3Vic3RyKDAsIHVybC5pbmRleE9mKCcvJywgMyArIGZxZG5JbmRleCkpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbnZhciBsaWJFeHBvcnRzJDEgPSB7fTtcbnZhciBsaWIkMSA9IHtcbiAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIGxpYkV4cG9ydHMkMTsgfSxcbiAgc2V0IGV4cG9ydHModil7IGxpYkV4cG9ydHMkMSA9IHY7IH0sXG59O1xuXG4vKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbnZhciBvYmplY3RBc3NpZ24gPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuXG52YXIgdmFyeUV4cG9ydHMgPSB7fTtcbnZhciB2YXJ5JDEgPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiB2YXJ5RXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IHZhcnlFeHBvcnRzID0gdjsgfSxcbn07XG5cbi8qIVxuICogdmFyeVxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNyBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG52YXJ5JDEuZXhwb3J0cyA9IHZhcnk7XG52YXJ5RXhwb3J0cy5hcHBlbmQgPSBhcHBlbmQ7XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGZpZWxkLW5hbWUgaW4gUkZDIDcyMzAgc2VjIDMuMlxuICpcbiAqIGZpZWxkLW5hbWUgICAgPSB0b2tlblxuICogdG9rZW4gICAgICAgICA9IDEqdGNoYXJcbiAqIHRjaGFyICAgICAgICAgPSBcIiFcIiAvIFwiI1wiIC8gXCIkXCIgLyBcIiVcIiAvIFwiJlwiIC8gXCInXCIgLyBcIipcIlxuICogICAgICAgICAgICAgICAvIFwiK1wiIC8gXCItXCIgLyBcIi5cIiAvIFwiXlwiIC8gXCJfXCIgLyBcImBcIiAvIFwifFwiIC8gXCJ+XCJcbiAqICAgICAgICAgICAgICAgLyBESUdJVCAvIEFMUEhBXG4gKiAgICAgICAgICAgICAgIDsgYW55IFZDSEFSLCBleGNlcHQgZGVsaW1pdGVyc1xuICovXG5cbnZhciBGSUVMRF9OQU1FX1JFR0VYUCA9IC9eWyEjJCUmJyorXFwtLl5fYHx+MC05QS1aYS16XSskLztcblxuLyoqXG4gKiBBcHBlbmQgYSBmaWVsZCB0byBhIHZhcnkgaGVhZGVyLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGFwcGVuZCAoaGVhZGVyLCBmaWVsZCkge1xuICBpZiAodHlwZW9mIGhlYWRlciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdoZWFkZXIgYXJndW1lbnQgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKCFmaWVsZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpZWxkIGFyZ3VtZW50IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIGdldCBmaWVsZHMgYXJyYXlcbiAgdmFyIGZpZWxkcyA9ICFBcnJheS5pc0FycmF5KGZpZWxkKVxuICAgID8gcGFyc2UkNihTdHJpbmcoZmllbGQpKVxuICAgIDogZmllbGQ7XG5cbiAgLy8gYXNzZXJ0IG9uIGludmFsaWQgZmllbGQgbmFtZXNcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBmaWVsZHMubGVuZ3RoOyBqKyspIHtcbiAgICBpZiAoIUZJRUxEX05BTUVfUkVHRVhQLnRlc3QoZmllbGRzW2pdKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmllbGQgYXJndW1lbnQgY29udGFpbnMgYW4gaW52YWxpZCBoZWFkZXIgbmFtZScpXG4gICAgfVxuICB9XG5cbiAgLy8gZXhpc3RpbmcsIHVuc3BlY2lmaWVkIHZhcnlcbiAgaWYgKGhlYWRlciA9PT0gJyonKSB7XG4gICAgcmV0dXJuIGhlYWRlclxuICB9XG5cbiAgLy8gZW51bWVyYXRlIGN1cnJlbnQgdmFsdWVzXG4gIHZhciB2YWwgPSBoZWFkZXI7XG4gIHZhciB2YWxzID0gcGFyc2UkNihoZWFkZXIudG9Mb3dlckNhc2UoKSk7XG5cbiAgLy8gdW5zcGVjaWZpZWQgdmFyeVxuICBpZiAoZmllbGRzLmluZGV4T2YoJyonKSAhPT0gLTEgfHwgdmFscy5pbmRleE9mKCcqJykgIT09IC0xKSB7XG4gICAgcmV0dXJuICcqJ1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZmxkID0gZmllbGRzW2ldLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBhcHBlbmQgdmFsdWUgKGNhc2UtcHJlc2VydmluZylcbiAgICBpZiAodmFscy5pbmRleE9mKGZsZCkgPT09IC0xKSB7XG4gICAgICB2YWxzLnB1c2goZmxkKTtcbiAgICAgIHZhbCA9IHZhbFxuICAgICAgICA/IHZhbCArICcsICcgKyBmaWVsZHNbaV1cbiAgICAgICAgOiBmaWVsZHNbaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG4vKipcbiAqIFBhcnNlIGEgdmFyeSBoZWFkZXIgaW50byBhbiBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2UkNiAoaGVhZGVyKSB7XG4gIHZhciBlbmQgPSAwO1xuICB2YXIgbGlzdCA9IFtdO1xuICB2YXIgc3RhcnQgPSAwO1xuXG4gIC8vIGdhdGhlciB0b2tlbnNcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhlYWRlci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHN3aXRjaCAoaGVhZGVyLmNoYXJDb2RlQXQoaSkpIHtcbiAgICAgIGNhc2UgMHgyMDogLyogICAqL1xuICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgICAgICAgIHN0YXJ0ID0gZW5kID0gaSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMHgyYzogLyogLCAqL1xuICAgICAgICBsaXN0LnB1c2goaGVhZGVyLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7XG4gICAgICAgIHN0YXJ0ID0gZW5kID0gaSArIDE7XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbmQgPSBpICsgMTtcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyBmaW5hbCB0b2tlblxuICBsaXN0LnB1c2goaGVhZGVyLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7XG5cbiAgcmV0dXJuIGxpc3Rcbn1cblxuLyoqXG4gKiBNYXJrIHRoYXQgYSByZXF1ZXN0IGlzIHZhcmllZCBvbiBhIGhlYWRlciBmaWVsZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVzXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gZmllbGRcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB2YXJ5IChyZXMsIGZpZWxkKSB7XG4gIGlmICghcmVzIHx8ICFyZXMuZ2V0SGVhZGVyIHx8ICFyZXMuc2V0SGVhZGVyKSB7XG4gICAgLy8gcXVhY2sgcXVhY2tcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZXMgYXJndW1lbnQgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgLy8gZ2V0IGV4aXN0aW5nIGhlYWRlclxuICB2YXIgdmFsID0gcmVzLmdldEhlYWRlcignVmFyeScpIHx8ICcnO1xuICB2YXIgaGVhZGVyID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgPyB2YWwuam9pbignLCAnKVxuICAgIDogU3RyaW5nKHZhbCk7XG5cbiAgLy8gc2V0IG5ldyBoZWFkZXJcbiAgaWYgKCh2YWwgPSBhcHBlbmQoaGVhZGVyLCBmaWVsZCkpKSB7XG4gICAgcmVzLnNldEhlYWRlcignVmFyeScsIHZhbCk7XG4gIH1cbn1cblxuKGZ1bmN0aW9uICgpIHtcblxuICB2YXIgYXNzaWduID0gb2JqZWN0QXNzaWduO1xuICB2YXIgdmFyeSA9IHZhcnlFeHBvcnRzO1xuXG4gIHZhciBkZWZhdWx0cyA9IHtcbiAgICBvcmlnaW46ICcqJyxcbiAgICBtZXRob2RzOiAnR0VULEhFQUQsUFVULFBBVENILFBPU1QsREVMRVRFJyxcbiAgICBwcmVmbGlnaHRDb250aW51ZTogZmFsc2UsXG4gICAgb3B0aW9uc1N1Y2Nlc3NTdGF0dXM6IDIwNFxuICB9O1xuXG4gIGZ1bmN0aW9uIGlzU3RyaW5nKHMpIHtcbiAgICByZXR1cm4gdHlwZW9mIHMgPT09ICdzdHJpbmcnIHx8IHMgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpc09yaWdpbkFsbG93ZWQob3JpZ2luLCBhbGxvd2VkT3JpZ2luKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYWxsb3dlZE9yaWdpbikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsb3dlZE9yaWdpbi5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaXNPcmlnaW5BbGxvd2VkKG9yaWdpbiwgYWxsb3dlZE9yaWdpbltpXSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcoYWxsb3dlZE9yaWdpbikpIHtcbiAgICAgIHJldHVybiBvcmlnaW4gPT09IGFsbG93ZWRPcmlnaW47XG4gICAgfSBlbHNlIGlmIChhbGxvd2VkT3JpZ2luIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICByZXR1cm4gYWxsb3dlZE9yaWdpbi50ZXN0KG9yaWdpbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAhIWFsbG93ZWRPcmlnaW47XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29uZmlndXJlT3JpZ2luKG9wdGlvbnMsIHJlcSkge1xuICAgIHZhciByZXF1ZXN0T3JpZ2luID0gcmVxLmhlYWRlcnMub3JpZ2luLFxuICAgICAgaGVhZGVycyA9IFtdLFxuICAgICAgaXNBbGxvd2VkO1xuXG4gICAgaWYgKCFvcHRpb25zLm9yaWdpbiB8fCBvcHRpb25zLm9yaWdpbiA9PT0gJyonKSB7XG4gICAgICAvLyBhbGxvdyBhbnkgb3JpZ2luXG4gICAgICBoZWFkZXJzLnB1c2goW3tcbiAgICAgICAga2V5OiAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJyxcbiAgICAgICAgdmFsdWU6ICcqJ1xuICAgICAgfV0pO1xuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcob3B0aW9ucy5vcmlnaW4pKSB7XG4gICAgICAvLyBmaXhlZCBvcmlnaW5cbiAgICAgIGhlYWRlcnMucHVzaChbe1xuICAgICAgICBrZXk6ICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLFxuICAgICAgICB2YWx1ZTogb3B0aW9ucy5vcmlnaW5cbiAgICAgIH1dKTtcbiAgICAgIGhlYWRlcnMucHVzaChbe1xuICAgICAgICBrZXk6ICdWYXJ5JyxcbiAgICAgICAgdmFsdWU6ICdPcmlnaW4nXG4gICAgICB9XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzQWxsb3dlZCA9IGlzT3JpZ2luQWxsb3dlZChyZXF1ZXN0T3JpZ2luLCBvcHRpb25zLm9yaWdpbik7XG4gICAgICAvLyByZWZsZWN0IG9yaWdpblxuICAgICAgaGVhZGVycy5wdXNoKFt7XG4gICAgICAgIGtleTogJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsXG4gICAgICAgIHZhbHVlOiBpc0FsbG93ZWQgPyByZXF1ZXN0T3JpZ2luIDogZmFsc2VcbiAgICAgIH1dKTtcbiAgICAgIGhlYWRlcnMucHVzaChbe1xuICAgICAgICBrZXk6ICdWYXJ5JyxcbiAgICAgICAgdmFsdWU6ICdPcmlnaW4nXG4gICAgICB9XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBmdW5jdGlvbiBjb25maWd1cmVNZXRob2RzKG9wdGlvbnMpIHtcbiAgICB2YXIgbWV0aG9kcyA9IG9wdGlvbnMubWV0aG9kcztcbiAgICBpZiAobWV0aG9kcy5qb2luKSB7XG4gICAgICBtZXRob2RzID0gb3B0aW9ucy5tZXRob2RzLmpvaW4oJywnKTsgLy8gLm1ldGhvZHMgaXMgYW4gYXJyYXksIHNvIHR1cm4gaXQgaW50byBhIHN0cmluZ1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAga2V5OiAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcycsXG4gICAgICB2YWx1ZTogbWV0aG9kc1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjb25maWd1cmVDcmVkZW50aWFscyhvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuY3JlZGVudGlhbHMgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJyxcbiAgICAgICAgdmFsdWU6ICd0cnVlJ1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBjb25maWd1cmVBbGxvd2VkSGVhZGVycyhvcHRpb25zLCByZXEpIHtcbiAgICB2YXIgYWxsb3dlZEhlYWRlcnMgPSBvcHRpb25zLmFsbG93ZWRIZWFkZXJzIHx8IG9wdGlvbnMuaGVhZGVycztcbiAgICB2YXIgaGVhZGVycyA9IFtdO1xuXG4gICAgaWYgKCFhbGxvd2VkSGVhZGVycykge1xuICAgICAgYWxsb3dlZEhlYWRlcnMgPSByZXEuaGVhZGVyc1snYWNjZXNzLWNvbnRyb2wtcmVxdWVzdC1oZWFkZXJzJ107IC8vIC5oZWFkZXJzIHdhc24ndCBzcGVjaWZpZWQsIHNvIHJlZmxlY3QgdGhlIHJlcXVlc3QgaGVhZGVyc1xuICAgICAgaGVhZGVycy5wdXNoKFt7XG4gICAgICAgIGtleTogJ1ZhcnknLFxuICAgICAgICB2YWx1ZTogJ0FjY2Vzcy1Db250cm9sLVJlcXVlc3QtSGVhZGVycydcbiAgICAgIH1dKTtcbiAgICB9IGVsc2UgaWYgKGFsbG93ZWRIZWFkZXJzLmpvaW4pIHtcbiAgICAgIGFsbG93ZWRIZWFkZXJzID0gYWxsb3dlZEhlYWRlcnMuam9pbignLCcpOyAvLyAuaGVhZGVycyBpcyBhbiBhcnJheSwgc28gdHVybiBpdCBpbnRvIGEgc3RyaW5nXG4gICAgfVxuICAgIGlmIChhbGxvd2VkSGVhZGVycyAmJiBhbGxvd2VkSGVhZGVycy5sZW5ndGgpIHtcbiAgICAgIGhlYWRlcnMucHVzaChbe1xuICAgICAgICBrZXk6ICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJyxcbiAgICAgICAgdmFsdWU6IGFsbG93ZWRIZWFkZXJzXG4gICAgICB9XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBmdW5jdGlvbiBjb25maWd1cmVFeHBvc2VkSGVhZGVycyhvcHRpb25zKSB7XG4gICAgdmFyIGhlYWRlcnMgPSBvcHRpb25zLmV4cG9zZWRIZWFkZXJzO1xuICAgIGlmICghaGVhZGVycykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzLmpvaW4pIHtcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmpvaW4oJywnKTsgLy8gLmhlYWRlcnMgaXMgYW4gYXJyYXksIHNvIHR1cm4gaXQgaW50byBhIHN0cmluZ1xuICAgIH1cbiAgICBpZiAoaGVhZGVycyAmJiBoZWFkZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiAnQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMnLFxuICAgICAgICB2YWx1ZTogaGVhZGVyc1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBjb25maWd1cmVNYXhBZ2Uob3B0aW9ucykge1xuICAgIHZhciBtYXhBZ2UgPSAodHlwZW9mIG9wdGlvbnMubWF4QWdlID09PSAnbnVtYmVyJyB8fCBvcHRpb25zLm1heEFnZSkgJiYgb3B0aW9ucy5tYXhBZ2UudG9TdHJpbmcoKTtcbiAgICBpZiAobWF4QWdlICYmIG1heEFnZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogJ0FjY2Vzcy1Db250cm9sLU1heC1BZ2UnLFxuICAgICAgICB2YWx1ZTogbWF4QWdlXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5SGVhZGVycyhoZWFkZXJzLCByZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGhlYWRlcnMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICB2YXIgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVyKSkge1xuICAgICAgICAgIGFwcGx5SGVhZGVycyhoZWFkZXIsIHJlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyLmtleSA9PT0gJ1ZhcnknICYmIGhlYWRlci52YWx1ZSkge1xuICAgICAgICAgIHZhcnkocmVzLCBoZWFkZXIudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGhlYWRlci52YWx1ZSkge1xuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoaGVhZGVyLmtleSwgaGVhZGVyLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcnMob3B0aW9ucywgcmVxLCByZXMsIG5leHQpIHtcbiAgICB2YXIgaGVhZGVycyA9IFtdLFxuICAgICAgbWV0aG9kID0gcmVxLm1ldGhvZCAmJiByZXEubWV0aG9kLnRvVXBwZXJDYXNlICYmIHJlcS5tZXRob2QudG9VcHBlckNhc2UoKTtcblxuICAgIGlmIChtZXRob2QgPT09ICdPUFRJT05TJykge1xuICAgICAgLy8gcHJlZmxpZ2h0XG4gICAgICBoZWFkZXJzLnB1c2goY29uZmlndXJlT3JpZ2luKG9wdGlvbnMsIHJlcSkpO1xuICAgICAgaGVhZGVycy5wdXNoKGNvbmZpZ3VyZUNyZWRlbnRpYWxzKG9wdGlvbnMpKTtcbiAgICAgIGhlYWRlcnMucHVzaChjb25maWd1cmVNZXRob2RzKG9wdGlvbnMpKTtcbiAgICAgIGhlYWRlcnMucHVzaChjb25maWd1cmVBbGxvd2VkSGVhZGVycyhvcHRpb25zLCByZXEpKTtcbiAgICAgIGhlYWRlcnMucHVzaChjb25maWd1cmVNYXhBZ2Uob3B0aW9ucykpO1xuICAgICAgaGVhZGVycy5wdXNoKGNvbmZpZ3VyZUV4cG9zZWRIZWFkZXJzKG9wdGlvbnMpKTtcbiAgICAgIGFwcGx5SGVhZGVycyhoZWFkZXJzLCByZXMpO1xuXG4gICAgICBpZiAob3B0aW9ucy5wcmVmbGlnaHRDb250aW51ZSkge1xuICAgICAgICBuZXh0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTYWZhcmkgKGFuZCBwb3RlbnRpYWxseSBvdGhlciBicm93c2VycykgbmVlZCBjb250ZW50LWxlbmd0aCAwLFxuICAgICAgICAvLyAgIGZvciAyMDQgb3IgdGhleSBqdXN0IGhhbmcgd2FpdGluZyBmb3IgYSBib2R5XG4gICAgICAgIHJlcy5zdGF0dXNDb2RlID0gb3B0aW9ucy5vcHRpb25zU3VjY2Vzc1N0YXR1cztcbiAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1MZW5ndGgnLCAnMCcpO1xuICAgICAgICByZXMuZW5kKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFjdHVhbCByZXNwb25zZVxuICAgICAgaGVhZGVycy5wdXNoKGNvbmZpZ3VyZU9yaWdpbihvcHRpb25zLCByZXEpKTtcbiAgICAgIGhlYWRlcnMucHVzaChjb25maWd1cmVDcmVkZW50aWFscyhvcHRpb25zKSk7XG4gICAgICBoZWFkZXJzLnB1c2goY29uZmlndXJlRXhwb3NlZEhlYWRlcnMob3B0aW9ucykpO1xuICAgICAgYXBwbHlIZWFkZXJzKGhlYWRlcnMsIHJlcyk7XG4gICAgICBuZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWlkZGxld2FyZVdyYXBwZXIobykge1xuICAgIC8vIGlmIG9wdGlvbnMgYXJlIHN0YXRpYyAoZWl0aGVyIHZpYSBkZWZhdWx0cyBvciBjdXN0b20gb3B0aW9ucyBwYXNzZWQgaW4pLCB3cmFwIGluIGEgZnVuY3Rpb25cbiAgICB2YXIgb3B0aW9uc0NhbGxiYWNrID0gbnVsbDtcbiAgICBpZiAodHlwZW9mIG8gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbnNDYWxsYmFjayA9IG87XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnNDYWxsYmFjayA9IGZ1bmN0aW9uIChyZXEsIGNiKSB7XG4gICAgICAgIGNiKG51bGwsIG8pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gY29yc01pZGRsZXdhcmUocmVxLCByZXMsIG5leHQpIHtcbiAgICAgIG9wdGlvbnNDYWxsYmFjayhyZXEsIGZ1bmN0aW9uIChlcnIsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIG5leHQoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgY29yc09wdGlvbnMgPSBhc3NpZ24oe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcbiAgICAgICAgICB2YXIgb3JpZ2luQ2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgIGlmIChjb3JzT3B0aW9ucy5vcmlnaW4gJiYgdHlwZW9mIGNvcnNPcHRpb25zLm9yaWdpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3JpZ2luQ2FsbGJhY2sgPSBjb3JzT3B0aW9ucy5vcmlnaW47XG4gICAgICAgICAgfSBlbHNlIGlmIChjb3JzT3B0aW9ucy5vcmlnaW4pIHtcbiAgICAgICAgICAgIG9yaWdpbkNhbGxiYWNrID0gZnVuY3Rpb24gKG9yaWdpbiwgY2IpIHtcbiAgICAgICAgICAgICAgY2IobnVsbCwgY29yc09wdGlvbnMub3JpZ2luKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9yaWdpbkNhbGxiYWNrKSB7XG4gICAgICAgICAgICBvcmlnaW5DYWxsYmFjayhyZXEuaGVhZGVycy5vcmlnaW4sIGZ1bmN0aW9uIChlcnIyLCBvcmlnaW4pIHtcbiAgICAgICAgICAgICAgaWYgKGVycjIgfHwgIW9yaWdpbikge1xuICAgICAgICAgICAgICAgIG5leHQoZXJyMik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29yc09wdGlvbnMub3JpZ2luID0gb3JpZ2luO1xuICAgICAgICAgICAgICAgIGNvcnMoY29yc09wdGlvbnMsIHJlcSwgcmVzLCBuZXh0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvLyBjYW4gcGFzcyBlaXRoZXIgYW4gb3B0aW9ucyBoYXNoLCBhbiBvcHRpb25zIGRlbGVnYXRlLCBvciBub3RoaW5nXG4gIGxpYiQxLmV4cG9ydHMgPSBtaWRkbGV3YXJlV3JhcHBlcjtcblxufSgpKTtcblxudmFyIGNob2tpZGFyID0ge307XG5cbmNvbnN0IGZzJDggPSByZXF1aXJlJCQwX19kZWZhdWx0O1xuY29uc3QgeyBSZWFkYWJsZSB9ID0gcmVxdWlyZSQkMCQ3O1xuY29uc3Qgc3lzUGF0aCQzID0gcmVxdWlyZSQkMCQ0O1xuY29uc3QgeyBwcm9taXNpZnk6IHByb21pc2lmeSQzIH0gPSByZXF1aXJlJCQwJDY7XG5jb25zdCBwaWNvbWF0Y2gkMSA9IHBpY29tYXRjaEV4cG9ydHM7XG5cbmNvbnN0IHJlYWRkaXIkMSA9IHByb21pc2lmeSQzKGZzJDgucmVhZGRpcik7XG5jb25zdCBzdGF0JDMgPSBwcm9taXNpZnkkMyhmcyQ4LnN0YXQpO1xuY29uc3QgbHN0YXQkMiA9IHByb21pc2lmeSQzKGZzJDgubHN0YXQpO1xuY29uc3QgcmVhbHBhdGgkMSA9IHByb21pc2lmeSQzKGZzJDgucmVhbHBhdGgpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEVudHJ5SW5mb1xuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBmdWxsUGF0aFxuICogQHByb3BlcnR5IHtmcy5TdGF0cz19IHN0YXRzXG4gKiBAcHJvcGVydHkge2ZzLkRpcmVudD19IGRpcmVudFxuICogQHByb3BlcnR5IHtTdHJpbmd9IGJhc2VuYW1lXG4gKi9cblxuY29uc3QgQkFORyQyID0gJyEnO1xuY29uc3QgUkVDVVJTSVZFX0VSUk9SX0NPREUgPSAnUkVBRERJUlBfUkVDVVJTSVZFX0VSUk9SJztcbmNvbnN0IE5PUk1BTF9GTE9XX0VSUk9SUyA9IG5ldyBTZXQoWydFTk9FTlQnLCAnRVBFUk0nLCAnRUFDQ0VTJywgJ0VMT09QJywgUkVDVVJTSVZFX0VSUk9SX0NPREVdKTtcbmNvbnN0IEZJTEVfVFlQRSA9ICdmaWxlcyc7XG5jb25zdCBESVJfVFlQRSA9ICdkaXJlY3Rvcmllcyc7XG5jb25zdCBGSUxFX0RJUl9UWVBFID0gJ2ZpbGVzX2RpcmVjdG9yaWVzJztcbmNvbnN0IEVWRVJZVEhJTkdfVFlQRSA9ICdhbGwnO1xuY29uc3QgQUxMX1RZUEVTID0gW0ZJTEVfVFlQRSwgRElSX1RZUEUsIEZJTEVfRElSX1RZUEUsIEVWRVJZVEhJTkdfVFlQRV07XG5cbmNvbnN0IGlzTm9ybWFsRmxvd0Vycm9yID0gZXJyb3IgPT4gTk9STUFMX0ZMT1dfRVJST1JTLmhhcyhlcnJvci5jb2RlKTtcbmNvbnN0IFttYWosIG1pbl0gPSBwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoJy4nKS5zbGljZSgwLCAyKS5tYXAobiA9PiBOdW1iZXIucGFyc2VJbnQobiwgMTApKTtcbmNvbnN0IHdhbnRCaWdpbnRGc1N0YXRzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyAmJiAobWFqID4gMTAgfHwgKG1haiA9PT0gMTAgJiYgbWluID49IDUpKTtcblxuY29uc3Qgbm9ybWFsaXplRmlsdGVyID0gZmlsdGVyID0+IHtcbiAgaWYgKGZpbHRlciA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZmlsdGVyO1xuXG4gIGlmICh0eXBlb2YgZmlsdGVyID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGdsb2IgPSBwaWNvbWF0Y2gkMShmaWx0ZXIudHJpbSgpKTtcbiAgICByZXR1cm4gZW50cnkgPT4gZ2xvYihlbnRyeS5iYXNlbmFtZSk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7XG4gICAgY29uc3QgcG9zaXRpdmUgPSBbXTtcbiAgICBjb25zdCBuZWdhdGl2ZSA9IFtdO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBmaWx0ZXIpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBpdGVtLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkLmNoYXJBdCgwKSA9PT0gQkFORyQyKSB7XG4gICAgICAgIG5lZ2F0aXZlLnB1c2gocGljb21hdGNoJDEodHJpbW1lZC5zbGljZSgxKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9zaXRpdmUucHVzaChwaWNvbWF0Y2gkMSh0cmltbWVkKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5lZ2F0aXZlLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChwb3NpdGl2ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBlbnRyeSA9PlxuICAgICAgICAgIHBvc2l0aXZlLnNvbWUoZiA9PiBmKGVudHJ5LmJhc2VuYW1lKSkgJiYgIW5lZ2F0aXZlLnNvbWUoZiA9PiBmKGVudHJ5LmJhc2VuYW1lKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnkgPT4gIW5lZ2F0aXZlLnNvbWUoZiA9PiBmKGVudHJ5LmJhc2VuYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeSA9PiBwb3NpdGl2ZS5zb21lKGYgPT4gZihlbnRyeS5iYXNlbmFtZSkpO1xuICB9XG59O1xuXG5jbGFzcyBSZWFkZGlycFN0cmVhbSBleHRlbmRzIFJlYWRhYmxlIHtcbiAgc3RhdGljIGdldCBkZWZhdWx0T3B0aW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcm9vdDogJy4nLFxuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgICAgIGZpbGVGaWx0ZXI6IChwYXRoKSA9PiB0cnVlLFxuICAgICAgZGlyZWN0b3J5RmlsdGVyOiAocGF0aCkgPT4gdHJ1ZSxcbiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgICAgIHR5cGU6IEZJTEVfVFlQRSxcbiAgICAgIGxzdGF0OiBmYWxzZSxcbiAgICAgIGRlcHRoOiAyMTQ3NDgzNjQ4LFxuICAgICAgYWx3YXlzU3RhdDogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgIGF1dG9EZXN0cm95OiB0cnVlLFxuICAgICAgaGlnaFdhdGVyTWFyazogb3B0aW9ucy5oaWdoV2F0ZXJNYXJrIHx8IDQwOTZcbiAgICB9KTtcbiAgICBjb25zdCBvcHRzID0geyAuLi5SZWFkZGlycFN0cmVhbS5kZWZhdWx0T3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIGNvbnN0IHsgcm9vdCwgdHlwZSB9ID0gb3B0cztcblxuICAgIHRoaXMuX2ZpbGVGaWx0ZXIgPSBub3JtYWxpemVGaWx0ZXIob3B0cy5maWxlRmlsdGVyKTtcbiAgICB0aGlzLl9kaXJlY3RvcnlGaWx0ZXIgPSBub3JtYWxpemVGaWx0ZXIob3B0cy5kaXJlY3RvcnlGaWx0ZXIpO1xuXG4gICAgY29uc3Qgc3RhdE1ldGhvZCA9IG9wdHMubHN0YXQgPyBsc3RhdCQyIDogc3RhdCQzO1xuICAgIC8vIFVzZSBiaWdpbnQgc3RhdHMgaWYgaXQncyB3aW5kb3dzIGFuZCBzdGF0KCkgc3VwcG9ydHMgb3B0aW9ucyAobm9kZSAxMCspLlxuICAgIGlmICh3YW50QmlnaW50RnNTdGF0cykge1xuICAgICAgdGhpcy5fc3RhdCA9IHBhdGggPT4gc3RhdE1ldGhvZChwYXRoLCB7IGJpZ2ludDogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RhdCA9IHN0YXRNZXRob2Q7XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4RGVwdGggPSBvcHRzLmRlcHRoO1xuICAgIHRoaXMuX3dhbnRzRGlyID0gW0RJUl9UWVBFLCBGSUxFX0RJUl9UWVBFLCBFVkVSWVRISU5HX1RZUEVdLmluY2x1ZGVzKHR5cGUpO1xuICAgIHRoaXMuX3dhbnRzRmlsZSA9IFtGSUxFX1RZUEUsIEZJTEVfRElSX1RZUEUsIEVWRVJZVEhJTkdfVFlQRV0uaW5jbHVkZXModHlwZSk7XG4gICAgdGhpcy5fd2FudHNFdmVyeXRoaW5nID0gdHlwZSA9PT0gRVZFUllUSElOR19UWVBFO1xuICAgIHRoaXMuX3Jvb3QgPSBzeXNQYXRoJDMucmVzb2x2ZShyb290KTtcbiAgICB0aGlzLl9pc0RpcmVudCA9ICgnRGlyZW50JyBpbiBmcyQ4KSAmJiAhb3B0cy5hbHdheXNTdGF0O1xuICAgIHRoaXMuX3N0YXRzUHJvcCA9IHRoaXMuX2lzRGlyZW50ID8gJ2RpcmVudCcgOiAnc3RhdHMnO1xuICAgIHRoaXMuX3JkT3B0aW9ucyA9IHsgZW5jb2Rpbmc6ICd1dGY4Jywgd2l0aEZpbGVUeXBlczogdGhpcy5faXNEaXJlbnQgfTtcblxuICAgIC8vIExhdW5jaCBzdHJlYW0gd2l0aCBvbmUgcGFyZW50LCB0aGUgcm9vdCBkaXIuXG4gICAgdGhpcy5wYXJlbnRzID0gW3RoaXMuX2V4cGxvcmVEaXIocm9vdCwgMSldO1xuICAgIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuICAgIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgYXN5bmMgX3JlYWQoYmF0Y2gpIHtcbiAgICBpZiAodGhpcy5yZWFkaW5nKSByZXR1cm47XG4gICAgdGhpcy5yZWFkaW5nID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICB3aGlsZSAoIXRoaXMuZGVzdHJveWVkICYmIGJhdGNoID4gMCkge1xuICAgICAgICBjb25zdCB7IHBhdGgsIGRlcHRoLCBmaWxlcyA9IFtdIH0gPSB0aGlzLnBhcmVudCB8fCB7fTtcblxuICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHNsaWNlID0gZmlsZXMuc3BsaWNlKDAsIGJhdGNoKS5tYXAoZGlyZW50ID0+IHRoaXMuX2Zvcm1hdEVudHJ5KGRpcmVudCwgcGF0aCkpO1xuICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgYXdhaXQgUHJvbWlzZS5hbGwoc2xpY2UpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgZW50cnlUeXBlID0gYXdhaXQgdGhpcy5fZ2V0RW50cnlUeXBlKGVudHJ5KTtcbiAgICAgICAgICAgIGlmIChlbnRyeVR5cGUgPT09ICdkaXJlY3RvcnknICYmIHRoaXMuX2RpcmVjdG9yeUZpbHRlcihlbnRyeSkpIHtcbiAgICAgICAgICAgICAgaWYgKGRlcHRoIDw9IHRoaXMuX21heERlcHRoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRzLnB1c2godGhpcy5fZXhwbG9yZURpcihlbnRyeS5mdWxsUGF0aCwgZGVwdGggKyAxKSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAodGhpcy5fd2FudHNEaXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgIGJhdGNoLS07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGVudHJ5VHlwZSA9PT0gJ2ZpbGUnIHx8IHRoaXMuX2luY2x1ZGVBc0ZpbGUoZW50cnkpKSAmJiB0aGlzLl9maWxlRmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5fd2FudHNGaWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICBiYXRjaC0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50cy5wb3AoKTtcbiAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucGFyZW50ID0gYXdhaXQgcGFyZW50O1xuICAgICAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuZGVzdHJveShlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9leHBsb3JlRGlyKHBhdGgsIGRlcHRoKSB7XG4gICAgbGV0IGZpbGVzO1xuICAgIHRyeSB7XG4gICAgICBmaWxlcyA9IGF3YWl0IHJlYWRkaXIkMShwYXRoLCB0aGlzLl9yZE9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9vbkVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZmlsZXMsIGRlcHRoLCBwYXRoIH07XG4gIH1cblxuICBhc3luYyBfZm9ybWF0RW50cnkoZGlyZW50LCBwYXRoKSB7XG4gICAgbGV0IGVudHJ5O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHRoaXMuX2lzRGlyZW50ID8gZGlyZW50Lm5hbWUgOiBkaXJlbnQ7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHN5c1BhdGgkMy5yZXNvbHZlKHN5c1BhdGgkMy5qb2luKHBhdGgsIGJhc2VuYW1lKSk7XG4gICAgICBlbnRyeSA9IHsgcGF0aDogc3lzUGF0aCQzLnJlbGF0aXZlKHRoaXMuX3Jvb3QsIGZ1bGxQYXRoKSwgZnVsbFBhdGgsIGJhc2VuYW1lIH07XG4gICAgICBlbnRyeVt0aGlzLl9zdGF0c1Byb3BdID0gdGhpcy5faXNEaXJlbnQgPyBkaXJlbnQgOiBhd2FpdCB0aGlzLl9zdGF0KGZ1bGxQYXRoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX29uRXJyb3IoZXJyKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgX29uRXJyb3IoZXJyKSB7XG4gICAgaWYgKGlzTm9ybWFsRmxvd0Vycm9yKGVycikgJiYgIXRoaXMuZGVzdHJveWVkKSB7XG4gICAgICB0aGlzLmVtaXQoJ3dhcm4nLCBlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlc3Ryb3koZXJyKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfZ2V0RW50cnlUeXBlKGVudHJ5KSB7XG4gICAgLy8gZW50cnkgbWF5IGJlIHVuZGVmaW5lZCwgYmVjYXVzZSBhIHdhcm5pbmcgb3IgYW4gZXJyb3Igd2VyZSBlbWl0dGVkXG4gICAgLy8gYW5kIHRoZSBzdGF0c1Byb3AgaXMgdW5kZWZpbmVkXG4gICAgY29uc3Qgc3RhdHMgPSBlbnRyeSAmJiBlbnRyeVt0aGlzLl9zdGF0c1Byb3BdO1xuICAgIGlmICghc3RhdHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICByZXR1cm4gJ2ZpbGUnO1xuICAgIH1cbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgcmV0dXJuICdkaXJlY3RvcnknO1xuICAgIH1cbiAgICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgY29uc3QgZnVsbCA9IGVudHJ5LmZ1bGxQYXRoO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW50cnlSZWFsUGF0aCA9IGF3YWl0IHJlYWxwYXRoJDEoZnVsbCk7XG4gICAgICAgIGNvbnN0IGVudHJ5UmVhbFBhdGhTdGF0cyA9IGF3YWl0IGxzdGF0JDIoZW50cnlSZWFsUGF0aCk7XG4gICAgICAgIGlmIChlbnRyeVJlYWxQYXRoU3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgICByZXR1cm4gJ2ZpbGUnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeVJlYWxQYXRoU3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIGNvbnN0IGxlbiA9IGVudHJ5UmVhbFBhdGgubGVuZ3RoO1xuICAgICAgICAgIGlmIChmdWxsLnN0YXJ0c1dpdGgoZW50cnlSZWFsUGF0aCkgJiYgZnVsbC5zdWJzdHIobGVuLCAxKSA9PT0gc3lzUGF0aCQzLnNlcCkge1xuICAgICAgICAgICAgY29uc3QgcmVjdXJzaXZlRXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBDaXJjdWxhciBzeW1saW5rIGRldGVjdGVkOiBcIiR7ZnVsbH1cIiBwb2ludHMgdG8gXCIke2VudHJ5UmVhbFBhdGh9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVjdXJzaXZlRXJyb3IuY29kZSA9IFJFQ1VSU0lWRV9FUlJPUl9DT0RFO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uRXJyb3IocmVjdXJzaXZlRXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gJ2RpcmVjdG9yeSc7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX29uRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9pbmNsdWRlQXNGaWxlKGVudHJ5KSB7XG4gICAgY29uc3Qgc3RhdHMgPSBlbnRyeSAmJiBlbnRyeVt0aGlzLl9zdGF0c1Byb3BdO1xuXG4gICAgcmV0dXJuIHN0YXRzICYmIHRoaXMuX3dhbnRzRXZlcnl0aGluZyAmJiAhc3RhdHMuaXNEaXJlY3RvcnkoKTtcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlYWRkaXJwQXJndW1lbnRzXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uPX0gZmlsZUZpbHRlclxuICogQHByb3BlcnR5IHtGdW5jdGlvbj19IGRpcmVjdG9yeUZpbHRlclxuICogQHByb3BlcnR5IHtTdHJpbmc9fSB0eXBlXG4gKiBAcHJvcGVydHkge051bWJlcj19IGRlcHRoXG4gKiBAcHJvcGVydHkge1N0cmluZz19IHJvb3RcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbj19IGxzdGF0XG4gKiBAcHJvcGVydHkge0Jvb2xlYW49fSBiaWdpbnRcbiAqL1xuXG4vKipcbiAqIE1haW4gZnVuY3Rpb24gd2hpY2ggZW5kcyB1cCBjYWxsaW5nIHJlYWRkaXJSZWMgYW5kIHJlYWRzIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gZ2l2ZW4gcm9vdCByZWN1cnNpdmVseS5cbiAqIEBwYXJhbSB7U3RyaW5nfSByb290IFJvb3QgZGlyZWN0b3J5XG4gKiBAcGFyYW0ge1JlYWRkaXJwQXJndW1lbnRzPX0gb3B0aW9ucyBPcHRpb25zIHRvIHNwZWNpZnkgcm9vdCAoc3RhcnQgZGlyZWN0b3J5KSwgZmlsdGVycyBhbmQgcmVjdXJzaW9uIGRlcHRoXG4gKi9cbmNvbnN0IHJlYWRkaXJwJDEgPSAocm9vdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCB0eXBlID0gb3B0aW9ucy5lbnRyeVR5cGUgfHwgb3B0aW9ucy50eXBlO1xuICBpZiAodHlwZSA9PT0gJ2JvdGgnKSB0eXBlID0gRklMRV9ESVJfVFlQRTsgLy8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHlcbiAgaWYgKHR5cGUpIG9wdGlvbnMudHlwZSA9IHR5cGU7XG4gIGlmICghcm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVhZGRpcnA6IHJvb3QgYXJndW1lbnQgaXMgcmVxdWlyZWQuIFVzYWdlOiByZWFkZGlycChyb290LCBvcHRpb25zKScpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByb290ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlYWRkaXJwOiByb290IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcuIFVzYWdlOiByZWFkZGlycChyb290LCBvcHRpb25zKScpO1xuICB9IGVsc2UgaWYgKHR5cGUgJiYgIUFMTF9UWVBFUy5pbmNsdWRlcyh0eXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVhZGRpcnA6IEludmFsaWQgdHlwZSBwYXNzZWQuIFVzZSBvbmUgb2YgJHtBTExfVFlQRVMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIG9wdGlvbnMucm9vdCA9IHJvb3Q7XG4gIHJldHVybiBuZXcgUmVhZGRpcnBTdHJlYW0ob3B0aW9ucyk7XG59O1xuXG5jb25zdCByZWFkZGlycFByb21pc2UgPSAocm9vdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgZmlsZXMgPSBbXTtcbiAgICByZWFkZGlycCQxKHJvb3QsIG9wdGlvbnMpXG4gICAgICAub24oJ2RhdGEnLCBlbnRyeSA9PiBmaWxlcy5wdXNoKGVudHJ5KSlcbiAgICAgIC5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShmaWxlcykpXG4gICAgICAub24oJ2Vycm9yJywgZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XG4gIH0pO1xufTtcblxucmVhZGRpcnAkMS5wcm9taXNlID0gcmVhZGRpcnBQcm9taXNlO1xucmVhZGRpcnAkMS5SZWFkZGlycFN0cmVhbSA9IFJlYWRkaXJwU3RyZWFtO1xucmVhZGRpcnAkMS5kZWZhdWx0ID0gcmVhZGRpcnAkMTtcblxudmFyIHJlYWRkaXJwXzEgPSByZWFkZGlycCQxO1xuXG52YXIgYW55bWF0Y2hFeHBvcnRzID0ge307XG52YXIgYW55bWF0Y2gkMiA9IHtcbiAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIGFueW1hdGNoRXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IGFueW1hdGNoRXhwb3J0cyA9IHY7IH0sXG59O1xuXG4vKiFcbiAqIG5vcm1hbGl6ZS1wYXRoIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9ub3JtYWxpemUtcGF0aD5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgSm9uIFNjaGxpbmtlcnQuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxudmFyIG5vcm1hbGl6ZVBhdGgkMiA9IGZ1bmN0aW9uKHBhdGgsIHN0cmlwVHJhaWxpbmcpIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cGVjdGVkIHBhdGggdG8gYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlmIChwYXRoID09PSAnXFxcXCcgfHwgcGF0aCA9PT0gJy8nKSByZXR1cm4gJy8nO1xuXG4gIHZhciBsZW4gPSBwYXRoLmxlbmd0aDtcbiAgaWYgKGxlbiA8PSAxKSByZXR1cm4gcGF0aDtcblxuICAvLyBlbnN1cmUgdGhhdCB3aW4zMiBuYW1lc3BhY2VzIGhhcyB0d28gbGVhZGluZyBzbGFzaGVzLCBzbyB0aGF0IHRoZSBwYXRoIGlzXG4gIC8vIGhhbmRsZWQgcHJvcGVybHkgYnkgdGhlIHdpbjMyIHZlcnNpb24gb2YgcGF0aC5wYXJzZSgpIGFmdGVyIGJlaW5nIG5vcm1hbGl6ZWRcbiAgLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvYWEzNjUyNDcodj12cy44NSkuYXNweCNuYW1lc3BhY2VzXG4gIHZhciBwcmVmaXggPSAnJztcbiAgaWYgKGxlbiA+IDQgJiYgcGF0aFszXSA9PT0gJ1xcXFwnKSB7XG4gICAgdmFyIGNoID0gcGF0aFsyXTtcbiAgICBpZiAoKGNoID09PSAnPycgfHwgY2ggPT09ICcuJykgJiYgcGF0aC5zbGljZSgwLCAyKSA9PT0gJ1xcXFxcXFxcJykge1xuICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMik7XG4gICAgICBwcmVmaXggPSAnLy8nO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzZWdzID0gcGF0aC5zcGxpdCgvWy9cXFxcXSsvKTtcbiAgaWYgKHN0cmlwVHJhaWxpbmcgIT09IGZhbHNlICYmIHNlZ3Nbc2Vncy5sZW5ndGggLSAxXSA9PT0gJycpIHtcbiAgICBzZWdzLnBvcCgpO1xuICB9XG4gIHJldHVybiBwcmVmaXggKyBzZWdzLmpvaW4oJy8nKTtcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhbnltYXRjaEV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5jb25zdCBwaWNvbWF0Y2ggPSBwaWNvbWF0Y2hFeHBvcnRzO1xuY29uc3Qgbm9ybWFsaXplUGF0aCQxID0gbm9ybWFsaXplUGF0aCQyO1xuXG4vKipcbiAqIEB0eXBlZGVmIHsodGVzdFN0cmluZzogc3RyaW5nKSA9PiBib29sZWFufSBBbnltYXRjaEZuXG4gKiBAdHlwZWRlZiB7c3RyaW5nfFJlZ0V4cHxBbnltYXRjaEZufSBBbnltYXRjaFBhdHRlcm5cbiAqIEB0eXBlZGVmIHtBbnltYXRjaFBhdHRlcm58QW55bWF0Y2hQYXR0ZXJuW119IEFueW1hdGNoTWF0Y2hlclxuICovXG5jb25zdCBCQU5HJDEgPSAnISc7XG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7cmV0dXJuSW5kZXg6IGZhbHNlfTtcbmNvbnN0IGFycmlmeSQxID0gKGl0ZW0pID0+IEFycmF5LmlzQXJyYXkoaXRlbSkgPyBpdGVtIDogW2l0ZW1dO1xuXG4vKipcbiAqIEBwYXJhbSB7QW55bWF0Y2hQYXR0ZXJufSBtYXRjaGVyXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHJldHVybnMge0FueW1hdGNoRm59XG4gKi9cbmNvbnN0IGNyZWF0ZVBhdHRlcm4gPSAobWF0Y2hlciwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF0Y2hlcjtcbiAgfVxuICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZ2xvYiA9IHBpY29tYXRjaChtYXRjaGVyLCBvcHRpb25zKTtcbiAgICByZXR1cm4gKHN0cmluZykgPT4gbWF0Y2hlciA9PT0gc3RyaW5nIHx8IGdsb2Ioc3RyaW5nKTtcbiAgfVxuICBpZiAobWF0Y2hlciBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiAoc3RyaW5nKSA9PiBtYXRjaGVyLnRlc3Qoc3RyaW5nKTtcbiAgfVxuICByZXR1cm4gKHN0cmluZykgPT4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXk8RnVuY3Rpb24+fSBwYXR0ZXJuc1xuICogQHBhcmFtIHtBcnJheTxGdW5jdGlvbj59IG5lZ1BhdHRlcm5zXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYXJnc1xuICogQHBhcmFtIHtCb29sZWFufSByZXR1cm5JbmRleFxuICogQHJldHVybnMge2Jvb2xlYW58bnVtYmVyfVxuICovXG5jb25zdCBtYXRjaFBhdHRlcm5zID0gKHBhdHRlcm5zLCBuZWdQYXR0ZXJucywgYXJncywgcmV0dXJuSW5kZXgpID0+IHtcbiAgY29uc3QgaXNMaXN0ID0gQXJyYXkuaXNBcnJheShhcmdzKTtcbiAgY29uc3QgX3BhdGggPSBpc0xpc3QgPyBhcmdzWzBdIDogYXJncztcbiAgaWYgKCFpc0xpc3QgJiYgdHlwZW9mIF9wYXRoICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FueW1hdGNoOiBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZzogZ290ICcgK1xuICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKF9wYXRoKSlcbiAgfVxuICBjb25zdCBwYXRoID0gbm9ybWFsaXplUGF0aCQxKF9wYXRoKTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbmVnUGF0dGVybnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3Qgbmdsb2IgPSBuZWdQYXR0ZXJuc1tpbmRleF07XG4gICAgaWYgKG5nbG9iKHBhdGgpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuSW5kZXggPyAtMSA6IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFwcGxpZWQgPSBpc0xpc3QgJiYgW3BhdGhdLmNvbmNhdChhcmdzLnNsaWNlKDEpKTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhdHRlcm5zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBwYXR0ZXJuc1tpbmRleF07XG4gICAgaWYgKGlzTGlzdCA/IHBhdHRlcm4oLi4uYXBwbGllZCkgOiBwYXR0ZXJuKHBhdGgpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuSW5kZXggPyBpbmRleCA6IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldHVybkluZGV4ID8gLTEgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtBbnltYXRjaE1hdGNoZXJ9IG1hdGNoZXJzXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gdGVzdFN0cmluZ1xuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtib29sZWFufG51bWJlcnxGdW5jdGlvbn1cbiAqL1xuY29uc3QgYW55bWF0Y2gkMSA9IChtYXRjaGVycywgdGVzdFN0cmluZywgb3B0aW9ucyA9IERFRkFVTFRfT1BUSU9OUykgPT4ge1xuICBpZiAobWF0Y2hlcnMgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FueW1hdGNoOiBzcGVjaWZ5IGZpcnN0IGFyZ3VtZW50Jyk7XG4gIH1cbiAgY29uc3Qgb3B0cyA9IHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicgPyB7cmV0dXJuSW5kZXg6IG9wdGlvbnN9IDogb3B0aW9ucztcbiAgY29uc3QgcmV0dXJuSW5kZXggPSBvcHRzLnJldHVybkluZGV4IHx8IGZhbHNlO1xuXG4gIC8vIEVhcmx5IGNhY2hlIGZvciBtYXRjaGVycy5cbiAgY29uc3QgbXRjaGVycyA9IGFycmlmeSQxKG1hdGNoZXJzKTtcbiAgY29uc3QgbmVnYXRlZEdsb2JzID0gbXRjaGVyc1xuICAgIC5maWx0ZXIoaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycgJiYgaXRlbS5jaGFyQXQoMCkgPT09IEJBTkckMSlcbiAgICAubWFwKGl0ZW0gPT4gaXRlbS5zbGljZSgxKSlcbiAgICAubWFwKGl0ZW0gPT4gcGljb21hdGNoKGl0ZW0sIG9wdHMpKTtcbiAgY29uc3QgcGF0dGVybnMgPSBtdGNoZXJzXG4gICAgLmZpbHRlcihpdGVtID0+IHR5cGVvZiBpdGVtICE9PSAnc3RyaW5nJyB8fCAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnICYmIGl0ZW0uY2hhckF0KDApICE9PSBCQU5HJDEpKVxuICAgIC5tYXAobWF0Y2hlciA9PiBjcmVhdGVQYXR0ZXJuKG1hdGNoZXIsIG9wdHMpKTtcblxuICBpZiAodGVzdFN0cmluZyA9PSBudWxsKSB7XG4gICAgcmV0dXJuICh0ZXN0U3RyaW5nLCByaSA9IGZhbHNlKSA9PiB7XG4gICAgICBjb25zdCByZXR1cm5JbmRleCA9IHR5cGVvZiByaSA9PT0gJ2Jvb2xlYW4nID8gcmkgOiBmYWxzZTtcbiAgICAgIHJldHVybiBtYXRjaFBhdHRlcm5zKHBhdHRlcm5zLCBuZWdhdGVkR2xvYnMsIHRlc3RTdHJpbmcsIHJldHVybkluZGV4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF0Y2hQYXR0ZXJucyhwYXR0ZXJucywgbmVnYXRlZEdsb2JzLCB0ZXN0U3RyaW5nLCByZXR1cm5JbmRleCk7XG59O1xuXG5hbnltYXRjaCQxLmRlZmF1bHQgPSBhbnltYXRjaCQxO1xuYW55bWF0Y2gkMi5leHBvcnRzID0gYW55bWF0Y2gkMTtcblxudmFyIGJpbmFyeUV4dGVuc2lvbnNFeHBvcnRzID0ge307XG52YXIgYmluYXJ5RXh0ZW5zaW9ucyQxID0ge1xuICBnZXQgZXhwb3J0cygpeyByZXR1cm4gYmluYXJ5RXh0ZW5zaW9uc0V4cG9ydHM7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBiaW5hcnlFeHRlbnNpb25zRXhwb3J0cyA9IHY7IH0sXG59O1xuXG52YXIgcmVxdWlyZSQkMCA9IFtcblx0XCIzZG1cIixcblx0XCIzZHNcIixcblx0XCIzZzJcIixcblx0XCIzZ3BcIixcblx0XCI3elwiLFxuXHRcImFcIixcblx0XCJhYWNcIixcblx0XCJhZHBcIixcblx0XCJhaVwiLFxuXHRcImFpZlwiLFxuXHRcImFpZmZcIixcblx0XCJhbHpcIixcblx0XCJhcGVcIixcblx0XCJhcGtcIixcblx0XCJhcHBpbWFnZVwiLFxuXHRcImFyXCIsXG5cdFwiYXJqXCIsXG5cdFwiYXNmXCIsXG5cdFwiYXVcIixcblx0XCJhdmlcIixcblx0XCJiYWtcIixcblx0XCJiYW1sXCIsXG5cdFwiYmhcIixcblx0XCJiaW5cIixcblx0XCJia1wiLFxuXHRcImJtcFwiLFxuXHRcImJ0aWZcIixcblx0XCJiejJcIixcblx0XCJiemlwMlwiLFxuXHRcImNhYlwiLFxuXHRcImNhZlwiLFxuXHRcImNnbVwiLFxuXHRcImNsYXNzXCIsXG5cdFwiY214XCIsXG5cdFwiY3Bpb1wiLFxuXHRcImNyMlwiLFxuXHRcImN1clwiLFxuXHRcImRhdFwiLFxuXHRcImRjbVwiLFxuXHRcImRlYlwiLFxuXHRcImRleFwiLFxuXHRcImRqdnVcIixcblx0XCJkbGxcIixcblx0XCJkbWdcIixcblx0XCJkbmdcIixcblx0XCJkb2NcIixcblx0XCJkb2NtXCIsXG5cdFwiZG9jeFwiLFxuXHRcImRvdFwiLFxuXHRcImRvdG1cIixcblx0XCJkcmFcIixcblx0XCJEU19TdG9yZVwiLFxuXHRcImRza1wiLFxuXHRcImR0c1wiLFxuXHRcImR0c2hkXCIsXG5cdFwiZHZiXCIsXG5cdFwiZHdnXCIsXG5cdFwiZHhmXCIsXG5cdFwiZWNlbHA0ODAwXCIsXG5cdFwiZWNlbHA3NDcwXCIsXG5cdFwiZWNlbHA5NjAwXCIsXG5cdFwiZWdnXCIsXG5cdFwiZW9sXCIsXG5cdFwiZW90XCIsXG5cdFwiZXB1YlwiLFxuXHRcImV4ZVwiLFxuXHRcImY0dlwiLFxuXHRcImZic1wiLFxuXHRcImZoXCIsXG5cdFwiZmxhXCIsXG5cdFwiZmxhY1wiLFxuXHRcImZsYXRwYWtcIixcblx0XCJmbGlcIixcblx0XCJmbHZcIixcblx0XCJmcHhcIixcblx0XCJmc3RcIixcblx0XCJmdnRcIixcblx0XCJnM1wiLFxuXHRcImdoXCIsXG5cdFwiZ2lmXCIsXG5cdFwiZ3JhZmZsZVwiLFxuXHRcImd6XCIsXG5cdFwiZ3ppcFwiLFxuXHRcImgyNjFcIixcblx0XCJoMjYzXCIsXG5cdFwiaDI2NFwiLFxuXHRcImljbnNcIixcblx0XCJpY29cIixcblx0XCJpZWZcIixcblx0XCJpbWdcIixcblx0XCJpcGFcIixcblx0XCJpc29cIixcblx0XCJqYXJcIixcblx0XCJqcGVnXCIsXG5cdFwianBnXCIsXG5cdFwianBndlwiLFxuXHRcImpwbVwiLFxuXHRcImp4clwiLFxuXHRcImtleVwiLFxuXHRcImt0eFwiLFxuXHRcImxoYVwiLFxuXHRcImxpYlwiLFxuXHRcImx2cFwiLFxuXHRcImx6XCIsXG5cdFwibHpoXCIsXG5cdFwibHptYVwiLFxuXHRcImx6b1wiLFxuXHRcIm0zdVwiLFxuXHRcIm00YVwiLFxuXHRcIm00dlwiLFxuXHRcIm1hclwiLFxuXHRcIm1kaVwiLFxuXHRcIm1odFwiLFxuXHRcIm1pZFwiLFxuXHRcIm1pZGlcIixcblx0XCJtajJcIixcblx0XCJta2FcIixcblx0XCJta3ZcIixcblx0XCJtbXJcIixcblx0XCJtbmdcIixcblx0XCJtb2JpXCIsXG5cdFwibW92XCIsXG5cdFwibW92aWVcIixcblx0XCJtcDNcIixcblx0XCJtcDRcIixcblx0XCJtcDRhXCIsXG5cdFwibXBlZ1wiLFxuXHRcIm1wZ1wiLFxuXHRcIm1wZ2FcIixcblx0XCJteHVcIixcblx0XCJuZWZcIixcblx0XCJucHhcIixcblx0XCJudW1iZXJzXCIsXG5cdFwibnVwa2dcIixcblx0XCJvXCIsXG5cdFwib2RwXCIsXG5cdFwib2RzXCIsXG5cdFwib2R0XCIsXG5cdFwib2dhXCIsXG5cdFwib2dnXCIsXG5cdFwib2d2XCIsXG5cdFwib3RmXCIsXG5cdFwib3R0XCIsXG5cdFwicGFnZXNcIixcblx0XCJwYm1cIixcblx0XCJwY3hcIixcblx0XCJwZGJcIixcblx0XCJwZGZcIixcblx0XCJwZWFcIixcblx0XCJwZ21cIixcblx0XCJwaWNcIixcblx0XCJwbmdcIixcblx0XCJwbm1cIixcblx0XCJwb3RcIixcblx0XCJwb3RtXCIsXG5cdFwicG90eFwiLFxuXHRcInBwYVwiLFxuXHRcInBwYW1cIixcblx0XCJwcG1cIixcblx0XCJwcHNcIixcblx0XCJwcHNtXCIsXG5cdFwicHBzeFwiLFxuXHRcInBwdFwiLFxuXHRcInBwdG1cIixcblx0XCJwcHR4XCIsXG5cdFwicHNkXCIsXG5cdFwicHlhXCIsXG5cdFwicHljXCIsXG5cdFwicHlvXCIsXG5cdFwicHl2XCIsXG5cdFwicXRcIixcblx0XCJyYXJcIixcblx0XCJyYXNcIixcblx0XCJyYXdcIixcblx0XCJyZXNvdXJjZXNcIixcblx0XCJyZ2JcIixcblx0XCJyaXBcIixcblx0XCJybGNcIixcblx0XCJybWZcIixcblx0XCJybXZiXCIsXG5cdFwicnBtXCIsXG5cdFwicnRmXCIsXG5cdFwicnpcIixcblx0XCJzM21cIixcblx0XCJzN3pcIixcblx0XCJzY3B0XCIsXG5cdFwic2dpXCIsXG5cdFwic2hhclwiLFxuXHRcInNuYXBcIixcblx0XCJzaWxcIixcblx0XCJza2V0Y2hcIixcblx0XCJzbGtcIixcblx0XCJzbXZcIixcblx0XCJzbmtcIixcblx0XCJzb1wiLFxuXHRcInN0bFwiLFxuXHRcInN1b1wiLFxuXHRcInN1YlwiLFxuXHRcInN3ZlwiLFxuXHRcInRhclwiLFxuXHRcInRielwiLFxuXHRcInRiejJcIixcblx0XCJ0Z2FcIixcblx0XCJ0Z3pcIixcblx0XCJ0aG14XCIsXG5cdFwidGlmXCIsXG5cdFwidGlmZlwiLFxuXHRcInRselwiLFxuXHRcInR0Y1wiLFxuXHRcInR0ZlwiLFxuXHRcInR4elwiLFxuXHRcInVkZlwiLFxuXHRcInV2aFwiLFxuXHRcInV2aVwiLFxuXHRcInV2bVwiLFxuXHRcInV2cFwiLFxuXHRcInV2c1wiLFxuXHRcInV2dVwiLFxuXHRcInZpdlwiLFxuXHRcInZvYlwiLFxuXHRcIndhclwiLFxuXHRcIndhdlwiLFxuXHRcIndheFwiLFxuXHRcIndibXBcIixcblx0XCJ3ZHBcIixcblx0XCJ3ZWJhXCIsXG5cdFwid2VibVwiLFxuXHRcIndlYnBcIixcblx0XCJ3aGxcIixcblx0XCJ3aW1cIixcblx0XCJ3bVwiLFxuXHRcIndtYVwiLFxuXHRcIndtdlwiLFxuXHRcIndteFwiLFxuXHRcIndvZmZcIixcblx0XCJ3b2ZmMlwiLFxuXHRcIndybVwiLFxuXHRcInd2eFwiLFxuXHRcInhibVwiLFxuXHRcInhpZlwiLFxuXHRcInhsYVwiLFxuXHRcInhsYW1cIixcblx0XCJ4bHNcIixcblx0XCJ4bHNiXCIsXG5cdFwieGxzbVwiLFxuXHRcInhsc3hcIixcblx0XCJ4bHRcIixcblx0XCJ4bHRtXCIsXG5cdFwieGx0eFwiLFxuXHRcInhtXCIsXG5cdFwieG1pbmRcIixcblx0XCJ4cGlcIixcblx0XCJ4cG1cIixcblx0XCJ4d2RcIixcblx0XCJ4elwiLFxuXHRcInpcIixcblx0XCJ6aXBcIixcblx0XCJ6aXB4XCJcbl07XG5cbihmdW5jdGlvbiAobW9kdWxlKSB7XG5cdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSQkMDtcbn0gKGJpbmFyeUV4dGVuc2lvbnMkMSkpO1xuXG5jb25zdCBwYXRoJDggPSByZXF1aXJlJCQwJDQ7XG5jb25zdCBiaW5hcnlFeHRlbnNpb25zID0gYmluYXJ5RXh0ZW5zaW9uc0V4cG9ydHM7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSBuZXcgU2V0KGJpbmFyeUV4dGVuc2lvbnMpO1xuXG52YXIgaXNCaW5hcnlQYXRoJDEgPSBmaWxlUGF0aCA9PiBleHRlbnNpb25zLmhhcyhwYXRoJDguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSk7XG5cbnZhciBjb25zdGFudHMkMSA9IHt9O1xuXG4oZnVuY3Rpb24gKGV4cG9ydHMpIHtcblxuXHRjb25zdCB7c2VwfSA9IHJlcXVpcmUkJDAkNDtcblx0Y29uc3Qge3BsYXRmb3JtfSA9IHByb2Nlc3M7XG5cdGNvbnN0IG9zID0gcmVxdWlyZSQkMjtcblxuXHRleHBvcnRzLkVWX0FMTCA9ICdhbGwnO1xuXHRleHBvcnRzLkVWX1JFQURZID0gJ3JlYWR5Jztcblx0ZXhwb3J0cy5FVl9BREQgPSAnYWRkJztcblx0ZXhwb3J0cy5FVl9DSEFOR0UgPSAnY2hhbmdlJztcblx0ZXhwb3J0cy5FVl9BRERfRElSID0gJ2FkZERpcic7XG5cdGV4cG9ydHMuRVZfVU5MSU5LID0gJ3VubGluayc7XG5cdGV4cG9ydHMuRVZfVU5MSU5LX0RJUiA9ICd1bmxpbmtEaXInO1xuXHRleHBvcnRzLkVWX1JBVyA9ICdyYXcnO1xuXHRleHBvcnRzLkVWX0VSUk9SID0gJ2Vycm9yJztcblxuXHRleHBvcnRzLlNUUl9EQVRBID0gJ2RhdGEnO1xuXHRleHBvcnRzLlNUUl9FTkQgPSAnZW5kJztcblx0ZXhwb3J0cy5TVFJfQ0xPU0UgPSAnY2xvc2UnO1xuXG5cdGV4cG9ydHMuRlNFVkVOVF9DUkVBVEVEID0gJ2NyZWF0ZWQnO1xuXHRleHBvcnRzLkZTRVZFTlRfTU9ESUZJRUQgPSAnbW9kaWZpZWQnO1xuXHRleHBvcnRzLkZTRVZFTlRfREVMRVRFRCA9ICdkZWxldGVkJztcblx0ZXhwb3J0cy5GU0VWRU5UX01PVkVEID0gJ21vdmVkJztcblx0ZXhwb3J0cy5GU0VWRU5UX0NMT05FRCA9ICdjbG9uZWQnO1xuXHRleHBvcnRzLkZTRVZFTlRfVU5LTk9XTiA9ICd1bmtub3duJztcblx0ZXhwb3J0cy5GU0VWRU5UX1RZUEVfRklMRSA9ICdmaWxlJztcblx0ZXhwb3J0cy5GU0VWRU5UX1RZUEVfRElSRUNUT1JZID0gJ2RpcmVjdG9yeSc7XG5cdGV4cG9ydHMuRlNFVkVOVF9UWVBFX1NZTUxJTksgPSAnc3ltbGluayc7XG5cblx0ZXhwb3J0cy5LRVlfTElTVEVORVJTID0gJ2xpc3RlbmVycyc7XG5cdGV4cG9ydHMuS0VZX0VSUiA9ICdlcnJIYW5kbGVycyc7XG5cdGV4cG9ydHMuS0VZX1JBVyA9ICdyYXdFbWl0dGVycyc7XG5cdGV4cG9ydHMuSEFORExFUl9LRVlTID0gW2V4cG9ydHMuS0VZX0xJU1RFTkVSUywgZXhwb3J0cy5LRVlfRVJSLCBleHBvcnRzLktFWV9SQVddO1xuXG5cdGV4cG9ydHMuRE9UX1NMQVNIID0gYC4ke3NlcH1gO1xuXG5cdGV4cG9ydHMuQkFDS19TTEFTSF9SRSA9IC9cXFxcL2c7XG5cdGV4cG9ydHMuRE9VQkxFX1NMQVNIX1JFID0gL1xcL1xcLy87XG5cdGV4cG9ydHMuU0xBU0hfT1JfQkFDS19TTEFTSF9SRSA9IC9bL1xcXFxdLztcblx0ZXhwb3J0cy5ET1RfUkUgPSAvXFwuLipcXC4oc3dbcHhdKSR8fiR8XFwuc3VibC4qXFwudG1wLztcblx0ZXhwb3J0cy5SRVBMQUNFUl9SRSA9IC9eXFwuWy9cXFxcXS87XG5cblx0ZXhwb3J0cy5TTEFTSCA9ICcvJztcblx0ZXhwb3J0cy5TTEFTSF9TTEFTSCA9ICcvLyc7XG5cdGV4cG9ydHMuQlJBQ0VfU1RBUlQgPSAneyc7XG5cdGV4cG9ydHMuQkFORyA9ICchJztcblx0ZXhwb3J0cy5PTkVfRE9UID0gJy4nO1xuXHRleHBvcnRzLlRXT19ET1RTID0gJy4uJztcblx0ZXhwb3J0cy5TVEFSID0gJyonO1xuXHRleHBvcnRzLkdMT0JTVEFSID0gJyoqJztcblx0ZXhwb3J0cy5ST09UX0dMT0JTVEFSID0gJy8qKi8qJztcblx0ZXhwb3J0cy5TTEFTSF9HTE9CU1RBUiA9ICcvKionO1xuXHRleHBvcnRzLkRJUl9TVUZGSVggPSAnRGlyJztcblx0ZXhwb3J0cy5BTllNQVRDSF9PUFRTID0ge2RvdDogdHJ1ZX07XG5cdGV4cG9ydHMuU1RSSU5HX1RZUEUgPSAnc3RyaW5nJztcblx0ZXhwb3J0cy5GVU5DVElPTl9UWVBFID0gJ2Z1bmN0aW9uJztcblx0ZXhwb3J0cy5FTVBUWV9TVFIgPSAnJztcblx0ZXhwb3J0cy5FTVBUWV9GTiA9ICgpID0+IHt9O1xuXHRleHBvcnRzLklERU5USVRZX0ZOID0gdmFsID0+IHZhbDtcblxuXHRleHBvcnRzLmlzV2luZG93cyA9IHBsYXRmb3JtID09PSAnd2luMzInO1xuXHRleHBvcnRzLmlzTWFjb3MgPSBwbGF0Zm9ybSA9PT0gJ2Rhcndpbic7XG5cdGV4cG9ydHMuaXNMaW51eCA9IHBsYXRmb3JtID09PSAnbGludXgnO1xuXHRleHBvcnRzLmlzSUJNaSA9IG9zLnR5cGUoKSA9PT0gJ09TNDAwJztcbn0gKGNvbnN0YW50cyQxKSk7XG5cbmNvbnN0IGZzJDcgPSByZXF1aXJlJCQwX19kZWZhdWx0O1xuY29uc3Qgc3lzUGF0aCQyID0gcmVxdWlyZSQkMCQ0O1xuY29uc3QgeyBwcm9taXNpZnk6IHByb21pc2lmeSQyIH0gPSByZXF1aXJlJCQwJDY7XG5jb25zdCBpc0JpbmFyeVBhdGggPSBpc0JpbmFyeVBhdGgkMTtcbmNvbnN0IHtcbiAgaXNXaW5kb3dzOiBpc1dpbmRvd3MkMixcbiAgaXNMaW51eCxcbiAgRU1QVFlfRk46IEVNUFRZX0ZOJDIsXG4gIEVNUFRZX1NUUjogRU1QVFlfU1RSJDEsXG4gIEtFWV9MSVNURU5FUlMsXG4gIEtFWV9FUlIsXG4gIEtFWV9SQVcsXG4gIEhBTkRMRVJfS0VZUyxcbiAgRVZfQ0hBTkdFOiBFVl9DSEFOR0UkMixcbiAgRVZfQUREOiBFVl9BREQkMixcbiAgRVZfQUREX0RJUjogRVZfQUREX0RJUiQyLFxuICBFVl9FUlJPUjogRVZfRVJST1IkMixcbiAgU1RSX0RBVEE6IFNUUl9EQVRBJDEsXG4gIFNUUl9FTkQ6IFNUUl9FTkQkMixcbiAgQlJBQ0VfU1RBUlQ6IEJSQUNFX1NUQVJUJDEsXG4gIFNUQVJcbn0gPSBjb25zdGFudHMkMTtcblxuY29uc3QgVEhST1RUTEVfTU9ERV9XQVRDSCA9ICd3YXRjaCc7XG5cbmNvbnN0IG9wZW4kMSA9IHByb21pc2lmeSQyKGZzJDcub3Blbik7XG5jb25zdCBzdGF0JDIgPSBwcm9taXNpZnkkMihmcyQ3LnN0YXQpO1xuY29uc3QgbHN0YXQkMSA9IHByb21pc2lmeSQyKGZzJDcubHN0YXQpO1xuY29uc3QgY2xvc2UgPSBwcm9taXNpZnkkMihmcyQ3LmNsb3NlKTtcbmNvbnN0IGZzcmVhbHBhdGggPSBwcm9taXNpZnkkMihmcyQ3LnJlYWxwYXRoKTtcblxuY29uc3Qgc3RhdE1ldGhvZHMkMSA9IHsgbHN0YXQ6IGxzdGF0JDEsIHN0YXQ6IHN0YXQkMiB9O1xuXG4vLyBUT0RPOiBlbWl0IGVycm9ycyBwcm9wZXJseS4gRXhhbXBsZTogRU1GSUxFIG9uIE1hY29zLlxuY29uc3QgZm9yZWFjaCA9ICh2YWwsIGZuKSA9PiB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICB2YWwuZm9yRWFjaChmbik7XG4gIH0gZWxzZSB7XG4gICAgZm4odmFsKTtcbiAgfVxufTtcblxuY29uc3QgYWRkQW5kQ29udmVydCA9IChtYWluLCBwcm9wLCBpdGVtKSA9PiB7XG4gIGxldCBjb250YWluZXIgPSBtYWluW3Byb3BdO1xuICBpZiAoIShjb250YWluZXIgaW5zdGFuY2VvZiBTZXQpKSB7XG4gICAgbWFpbltwcm9wXSA9IGNvbnRhaW5lciA9IG5ldyBTZXQoW2NvbnRhaW5lcl0pO1xuICB9XG4gIGNvbnRhaW5lci5hZGQoaXRlbSk7XG59O1xuXG5jb25zdCBjbGVhckl0ZW0gPSBjb250ID0+IGtleSA9PiB7XG4gIGNvbnN0IHNldCA9IGNvbnRba2V5XTtcbiAgaWYgKHNldCBpbnN0YW5jZW9mIFNldCkge1xuICAgIHNldC5jbGVhcigpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBjb250W2tleV07XG4gIH1cbn07XG5cbmNvbnN0IGRlbEZyb21TZXQgPSAobWFpbiwgcHJvcCwgaXRlbSkgPT4ge1xuICBjb25zdCBjb250YWluZXIgPSBtYWluW3Byb3BdO1xuICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgY29udGFpbmVyLmRlbGV0ZShpdGVtKTtcbiAgfSBlbHNlIGlmIChjb250YWluZXIgPT09IGl0ZW0pIHtcbiAgICBkZWxldGUgbWFpbltwcm9wXTtcbiAgfVxufTtcblxuY29uc3QgaXNFbXB0eVNldCA9ICh2YWwpID0+IHZhbCBpbnN0YW5jZW9mIFNldCA/IHZhbC5zaXplID09PSAwIDogIXZhbDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7U3RyaW5nfSBQYXRoXG4gKi9cblxuLy8gZnNfd2F0Y2ggaGVscGVyc1xuXG4vLyBvYmplY3QgdG8gaG9sZCBwZXItcHJvY2VzcyBmc193YXRjaCBpbnN0YW5jZXNcbi8vIChtYXkgYmUgc2hhcmVkIGFjcm9zcyBjaG9raWRhciBGU1dhdGNoZXIgaW5zdGFuY2VzKVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZzV2F0Y2hDb250YWluZXJcbiAqIEBwcm9wZXJ0eSB7U2V0fSBsaXN0ZW5lcnNcbiAqIEBwcm9wZXJ0eSB7U2V0fSBlcnJIYW5kbGVyc1xuICogQHByb3BlcnR5IHtTZXR9IHJhd0VtaXR0ZXJzXG4gKiBAcHJvcGVydHkge2ZzLkZTV2F0Y2hlcj19IHdhdGNoZXJcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbj19IHdhdGNoZXJVbnVzYWJsZVxuICovXG5cbi8qKlxuICogQHR5cGUge01hcDxTdHJpbmcsRnNXYXRjaENvbnRhaW5lcj59XG4gKi9cbmNvbnN0IEZzV2F0Y2hJbnN0YW5jZXMgPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogSW5zdGFudGlhdGVzIHRoZSBmc193YXRjaCBpbnRlcmZhY2VcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIHRvIGJlIHdhdGNoZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byBmc193YXRjaFxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgbWFpbiBldmVudCBoYW5kbGVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcnJIYW5kbGVyIGVtaXRzIGluZm8gYWJvdXQgZXJyb3JzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbWl0UmF3IGVtaXRzIHJhdyBldmVudCBkYXRhXG4gKiBAcmV0dXJucyB7ZnMuRlNXYXRjaGVyfSBuZXcgZnNldmVudHMgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRnNXYXRjaEluc3RhbmNlKHBhdGgsIG9wdGlvbnMsIGxpc3RlbmVyLCBlcnJIYW5kbGVyLCBlbWl0UmF3KSB7XG4gIGNvbnN0IGhhbmRsZUV2ZW50ID0gKHJhd0V2ZW50LCBldlBhdGgpID0+IHtcbiAgICBsaXN0ZW5lcihwYXRoKTtcbiAgICBlbWl0UmF3KHJhd0V2ZW50LCBldlBhdGgsIHt3YXRjaGVkUGF0aDogcGF0aH0pO1xuXG4gICAgLy8gZW1pdCBiYXNlZCBvbiBldmVudHMgb2NjdXJyaW5nIGZvciBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5J3Mgd2F0Y2hlciBpblxuICAgIC8vIGNhc2UgdGhlIGZpbGUncyB3YXRjaGVyIG1pc3NlcyBpdCAoYW5kIHJlbHkgb24gdGhyb3R0bGluZyB0byBkZS1kdXBlKVxuICAgIGlmIChldlBhdGggJiYgcGF0aCAhPT0gZXZQYXRoKSB7XG4gICAgICBmc1dhdGNoQnJvYWRjYXN0KFxuICAgICAgICBzeXNQYXRoJDIucmVzb2x2ZShwYXRoLCBldlBhdGgpLCBLRVlfTElTVEVORVJTLCBzeXNQYXRoJDIuam9pbihwYXRoLCBldlBhdGgpXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMkNy53YXRjaChwYXRoLCBvcHRpb25zLCBoYW5kbGVFdmVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZXJySGFuZGxlcihlcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIHBhc3NpbmcgZnNfd2F0Y2ggZXZlbnQgZGF0YSB0byBhIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzXG4gKiBAcGFyYW0ge1BhdGh9IGZ1bGxQYXRoIGFic29sdXRlIHBhdGggYm91bmQgdG8gZnNfd2F0Y2ggaW5zdGFuY2VcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIGxpc3RlbmVyIHR5cGVcbiAqIEBwYXJhbSB7Kj19IHZhbDEgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byBsaXN0ZW5lcnNcbiAqIEBwYXJhbSB7Kj19IHZhbDJcbiAqIEBwYXJhbSB7Kj19IHZhbDNcbiAqL1xuY29uc3QgZnNXYXRjaEJyb2FkY2FzdCA9IChmdWxsUGF0aCwgdHlwZSwgdmFsMSwgdmFsMiwgdmFsMykgPT4ge1xuICBjb25zdCBjb250ID0gRnNXYXRjaEluc3RhbmNlcy5nZXQoZnVsbFBhdGgpO1xuICBpZiAoIWNvbnQpIHJldHVybjtcbiAgZm9yZWFjaChjb250W3R5cGVdLCAobGlzdGVuZXIpID0+IHtcbiAgICBsaXN0ZW5lcih2YWwxLCB2YWwyLCB2YWwzKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEluc3RhbnRpYXRlcyB0aGUgZnNfd2F0Y2ggaW50ZXJmYWNlIG9yIGJpbmRzIGxpc3RlbmVyc1xuICogdG8gYW4gZXhpc3Rpbmcgb25lIGNvdmVyaW5nIHRoZSBzYW1lIGZpbGUgc3lzdGVtIGVudHJ5XG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtTdHJpbmd9IGZ1bGxQYXRoIGFic29sdXRlIHBhdGhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byBmc193YXRjaFxuICogQHBhcmFtIHtPYmplY3R9IGhhbmRsZXJzIGNvbnRhaW5lciBmb3IgZXZlbnQgbGlzdGVuZXIgZnVuY3Rpb25zXG4gKi9cbmNvbnN0IHNldEZzV2F0Y2hMaXN0ZW5lciA9IChwYXRoLCBmdWxsUGF0aCwgb3B0aW9ucywgaGFuZGxlcnMpID0+IHtcbiAgY29uc3Qge2xpc3RlbmVyLCBlcnJIYW5kbGVyLCByYXdFbWl0dGVyfSA9IGhhbmRsZXJzO1xuICBsZXQgY29udCA9IEZzV2F0Y2hJbnN0YW5jZXMuZ2V0KGZ1bGxQYXRoKTtcblxuICAvKiogQHR5cGUge2ZzLkZTV2F0Y2hlcj19ICovXG4gIGxldCB3YXRjaGVyO1xuICBpZiAoIW9wdGlvbnMucGVyc2lzdGVudCkge1xuICAgIHdhdGNoZXIgPSBjcmVhdGVGc1dhdGNoSW5zdGFuY2UoXG4gICAgICBwYXRoLCBvcHRpb25zLCBsaXN0ZW5lciwgZXJySGFuZGxlciwgcmF3RW1pdHRlclxuICAgICk7XG4gICAgcmV0dXJuIHdhdGNoZXIuY2xvc2UuYmluZCh3YXRjaGVyKTtcbiAgfVxuICBpZiAoY29udCkge1xuICAgIGFkZEFuZENvbnZlcnQoY29udCwgS0VZX0xJU1RFTkVSUywgbGlzdGVuZXIpO1xuICAgIGFkZEFuZENvbnZlcnQoY29udCwgS0VZX0VSUiwgZXJySGFuZGxlcik7XG4gICAgYWRkQW5kQ29udmVydChjb250LCBLRVlfUkFXLCByYXdFbWl0dGVyKTtcbiAgfSBlbHNlIHtcbiAgICB3YXRjaGVyID0gY3JlYXRlRnNXYXRjaEluc3RhbmNlKFxuICAgICAgcGF0aCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBmc1dhdGNoQnJvYWRjYXN0LmJpbmQobnVsbCwgZnVsbFBhdGgsIEtFWV9MSVNURU5FUlMpLFxuICAgICAgZXJySGFuZGxlciwgLy8gbm8gbmVlZCB0byB1c2UgYnJvYWRjYXN0IGhlcmVcbiAgICAgIGZzV2F0Y2hCcm9hZGNhc3QuYmluZChudWxsLCBmdWxsUGF0aCwgS0VZX1JBVylcbiAgICApO1xuICAgIGlmICghd2F0Y2hlcikgcmV0dXJuO1xuICAgIHdhdGNoZXIub24oRVZfRVJST1IkMiwgYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICBjb25zdCBicm9hZGNhc3RFcnIgPSBmc1dhdGNoQnJvYWRjYXN0LmJpbmQobnVsbCwgZnVsbFBhdGgsIEtFWV9FUlIpO1xuICAgICAgY29udC53YXRjaGVyVW51c2FibGUgPSB0cnVlOyAvLyBkb2N1bWVudGVkIHNpbmNlIE5vZGUgMTAuNC4xXG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvaXNzdWVzLzQzMzdcbiAgICAgIGlmIChpc1dpbmRvd3MkMiAmJiBlcnJvci5jb2RlID09PSAnRVBFUk0nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmQgPSBhd2FpdCBvcGVuJDEocGF0aCwgJ3InKTtcbiAgICAgICAgICBhd2FpdCBjbG9zZShmZCk7XG4gICAgICAgICAgYnJvYWRjYXN0RXJyKGVycm9yKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJvYWRjYXN0RXJyKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb250ID0ge1xuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcixcbiAgICAgIGVyckhhbmRsZXJzOiBlcnJIYW5kbGVyLFxuICAgICAgcmF3RW1pdHRlcnM6IHJhd0VtaXR0ZXIsXG4gICAgICB3YXRjaGVyXG4gICAgfTtcbiAgICBGc1dhdGNoSW5zdGFuY2VzLnNldChmdWxsUGF0aCwgY29udCk7XG4gIH1cbiAgLy8gY29uc3QgaW5kZXggPSBjb250Lmxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcblxuICAvLyByZW1vdmVzIHRoaXMgaW5zdGFuY2UncyBsaXN0ZW5lcnMgYW5kIGNsb3NlcyB0aGUgdW5kZXJseWluZyBmc193YXRjaFxuICAvLyBpbnN0YW5jZSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBsaXN0ZW5lcnMgbGVmdFxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRlbEZyb21TZXQoY29udCwgS0VZX0xJU1RFTkVSUywgbGlzdGVuZXIpO1xuICAgIGRlbEZyb21TZXQoY29udCwgS0VZX0VSUiwgZXJySGFuZGxlcik7XG4gICAgZGVsRnJvbVNldChjb250LCBLRVlfUkFXLCByYXdFbWl0dGVyKTtcbiAgICBpZiAoaXNFbXB0eVNldChjb250Lmxpc3RlbmVycykpIHtcbiAgICAgIC8vIENoZWNrIHRvIHByb3RlY3QgYWdhaW5zdCBpc3N1ZSBnaC03MzAuXG4gICAgICAvLyBpZiAoY29udC53YXRjaGVyVW51c2FibGUpIHtcbiAgICAgIGNvbnQud2F0Y2hlci5jbG9zZSgpO1xuICAgICAgLy8gfVxuICAgICAgRnNXYXRjaEluc3RhbmNlcy5kZWxldGUoZnVsbFBhdGgpO1xuICAgICAgSEFORExFUl9LRVlTLmZvckVhY2goY2xlYXJJdGVtKGNvbnQpKTtcbiAgICAgIGNvbnQud2F0Y2hlciA9IHVuZGVmaW5lZDtcbiAgICAgIE9iamVjdC5mcmVlemUoY29udCk7XG4gICAgfVxuICB9O1xufTtcblxuLy8gZnNfd2F0Y2hGaWxlIGhlbHBlcnNcblxuLy8gb2JqZWN0IHRvIGhvbGQgcGVyLXByb2Nlc3MgZnNfd2F0Y2hGaWxlIGluc3RhbmNlc1xuLy8gKG1heSBiZSBzaGFyZWQgYWNyb3NzIGNob2tpZGFyIEZTV2F0Y2hlciBpbnN0YW5jZXMpXG5jb25zdCBGc1dhdGNoRmlsZUluc3RhbmNlcyA9IG5ldyBNYXAoKTtcblxuLyoqXG4gKiBJbnN0YW50aWF0ZXMgdGhlIGZzX3dhdGNoRmlsZSBpbnRlcmZhY2Ugb3IgYmluZHMgbGlzdGVuZXJzXG4gKiB0byBhbiBleGlzdGluZyBvbmUgY292ZXJpbmcgdGhlIHNhbWUgZmlsZSBzeXN0ZW0gZW50cnlcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIHRvIGJlIHdhdGNoZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBmdWxsUGF0aCBhYnNvbHV0ZSBwYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byBmc193YXRjaEZpbGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYW5kbGVycyBjb250YWluZXIgZm9yIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uc1xuICogQHJldHVybnMge0Z1bmN0aW9ufSBjbG9zZXJcbiAqL1xuY29uc3Qgc2V0RnNXYXRjaEZpbGVMaXN0ZW5lciA9IChwYXRoLCBmdWxsUGF0aCwgb3B0aW9ucywgaGFuZGxlcnMpID0+IHtcbiAgY29uc3Qge2xpc3RlbmVyLCByYXdFbWl0dGVyfSA9IGhhbmRsZXJzO1xuICBsZXQgY29udCA9IEZzV2F0Y2hGaWxlSW5zdGFuY2VzLmdldChmdWxsUGF0aCk7XG5cbiAgY29uc3QgY29wdHMgPSBjb250ICYmIGNvbnQub3B0aW9ucztcbiAgaWYgKGNvcHRzICYmIChjb3B0cy5wZXJzaXN0ZW50IDwgb3B0aW9ucy5wZXJzaXN0ZW50IHx8IGNvcHRzLmludGVydmFsID4gb3B0aW9ucy5pbnRlcnZhbCkpIHtcbiAgICBmcyQ3LnVud2F0Y2hGaWxlKGZ1bGxQYXRoKTtcbiAgICBjb250ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycywgcHJlZmVyLWRlc3RydWN0dXJpbmcgKi9cblxuICBpZiAoY29udCkge1xuICAgIGFkZEFuZENvbnZlcnQoY29udCwgS0VZX0xJU1RFTkVSUywgbGlzdGVuZXIpO1xuICAgIGFkZEFuZENvbnZlcnQoY29udCwgS0VZX1JBVywgcmF3RW1pdHRlcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ET1xuICAgIC8vIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICAgIC8vIHJhd0VtaXR0ZXJzLmFkZChyYXdFbWl0dGVyKTtcbiAgICBjb250ID0ge1xuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcixcbiAgICAgIHJhd0VtaXR0ZXJzOiByYXdFbWl0dGVyLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHdhdGNoZXI6IGZzJDcud2F0Y2hGaWxlKGZ1bGxQYXRoLCBvcHRpb25zLCAoY3VyciwgcHJldikgPT4ge1xuICAgICAgICBmb3JlYWNoKGNvbnQucmF3RW1pdHRlcnMsIChyYXdFbWl0dGVyKSA9PiB7XG4gICAgICAgICAgcmF3RW1pdHRlcihFVl9DSEFOR0UkMiwgZnVsbFBhdGgsIHtjdXJyLCBwcmV2fSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjdXJybXRpbWUgPSBjdXJyLm10aW1lTXM7XG4gICAgICAgIGlmIChjdXJyLnNpemUgIT09IHByZXYuc2l6ZSB8fCBjdXJybXRpbWUgPiBwcmV2Lm10aW1lTXMgfHwgY3Vycm10aW1lID09PSAwKSB7XG4gICAgICAgICAgZm9yZWFjaChjb250Lmxpc3RlbmVycywgKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihwYXRoLCBjdXJyKSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfTtcbiAgICBGc1dhdGNoRmlsZUluc3RhbmNlcy5zZXQoZnVsbFBhdGgsIGNvbnQpO1xuICB9XG4gIC8vIGNvbnN0IGluZGV4ID0gY29udC5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG5cbiAgLy8gUmVtb3ZlcyB0aGlzIGluc3RhbmNlJ3MgbGlzdGVuZXJzIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcgZnNfd2F0Y2hGaWxlXG4gIC8vIGluc3RhbmNlIGlmIHRoZXJlIGFyZSBubyBtb3JlIGxpc3RlbmVycyBsZWZ0LlxuICByZXR1cm4gKCkgPT4ge1xuICAgIGRlbEZyb21TZXQoY29udCwgS0VZX0xJU1RFTkVSUywgbGlzdGVuZXIpO1xuICAgIGRlbEZyb21TZXQoY29udCwgS0VZX1JBVywgcmF3RW1pdHRlcik7XG4gICAgaWYgKGlzRW1wdHlTZXQoY29udC5saXN0ZW5lcnMpKSB7XG4gICAgICBGc1dhdGNoRmlsZUluc3RhbmNlcy5kZWxldGUoZnVsbFBhdGgpO1xuICAgICAgZnMkNy51bndhdGNoRmlsZShmdWxsUGF0aCk7XG4gICAgICBjb250Lm9wdGlvbnMgPSBjb250LndhdGNoZXIgPSB1bmRlZmluZWQ7XG4gICAgICBPYmplY3QuZnJlZXplKGNvbnQpO1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogQG1peGluXG4gKi9cbmxldCBOb2RlRnNIYW5kbGVyJDEgPSBjbGFzcyBOb2RlRnNIYW5kbGVyIHtcblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2luZGV4XCIpLkZTV2F0Y2hlcn0gZnNXXG4gKi9cbmNvbnN0cnVjdG9yKGZzVykge1xuICB0aGlzLmZzdyA9IGZzVztcbiAgdGhpcy5fYm91bmRIYW5kbGVFcnJvciA9IChlcnJvcikgPT4gZnNXLl9oYW5kbGVFcnJvcihlcnJvcik7XG59XG5cbi8qKlxuICogV2F0Y2ggZmlsZSBmb3IgY2hhbmdlcyB3aXRoIGZzX3dhdGNoRmlsZSBvciBmc193YXRjaC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIHRvIGZpbGUgb3IgZGlyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBvbiBmcyBjaGFuZ2VcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gY2xvc2VyIGZvciB0aGUgd2F0Y2hlciBpbnN0YW5jZVxuICovXG5fd2F0Y2hXaXRoTm9kZUZzKHBhdGgsIGxpc3RlbmVyKSB7XG4gIGNvbnN0IG9wdHMgPSB0aGlzLmZzdy5vcHRpb25zO1xuICBjb25zdCBkaXJlY3RvcnkgPSBzeXNQYXRoJDIuZGlybmFtZShwYXRoKTtcbiAgY29uc3QgYmFzZW5hbWUgPSBzeXNQYXRoJDIuYmFzZW5hbWUocGF0aCk7XG4gIGNvbnN0IHBhcmVudCA9IHRoaXMuZnN3Ll9nZXRXYXRjaGVkRGlyKGRpcmVjdG9yeSk7XG4gIHBhcmVudC5hZGQoYmFzZW5hbWUpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBzeXNQYXRoJDIucmVzb2x2ZShwYXRoKTtcbiAgY29uc3Qgb3B0aW9ucyA9IHtwZXJzaXN0ZW50OiBvcHRzLnBlcnNpc3RlbnR9O1xuICBpZiAoIWxpc3RlbmVyKSBsaXN0ZW5lciA9IEVNUFRZX0ZOJDI7XG5cbiAgbGV0IGNsb3NlcjtcbiAgaWYgKG9wdHMudXNlUG9sbGluZykge1xuICAgIG9wdGlvbnMuaW50ZXJ2YWwgPSBvcHRzLmVuYWJsZUJpbmFyeUludGVydmFsICYmIGlzQmluYXJ5UGF0aChiYXNlbmFtZSkgP1xuICAgICAgb3B0cy5iaW5hcnlJbnRlcnZhbCA6IG9wdHMuaW50ZXJ2YWw7XG4gICAgY2xvc2VyID0gc2V0RnNXYXRjaEZpbGVMaXN0ZW5lcihwYXRoLCBhYnNvbHV0ZVBhdGgsIG9wdGlvbnMsIHtcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgcmF3RW1pdHRlcjogdGhpcy5mc3cuX2VtaXRSYXdcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjbG9zZXIgPSBzZXRGc1dhdGNoTGlzdGVuZXIocGF0aCwgYWJzb2x1dGVQYXRoLCBvcHRpb25zLCB7XG4gICAgICBsaXN0ZW5lcixcbiAgICAgIGVyckhhbmRsZXI6IHRoaXMuX2JvdW5kSGFuZGxlRXJyb3IsXG4gICAgICByYXdFbWl0dGVyOiB0aGlzLmZzdy5fZW1pdFJhd1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBjbG9zZXI7XG59XG5cbi8qKlxuICogV2F0Y2ggYSBmaWxlIGFuZCBlbWl0IGFkZCBldmVudCBpZiB3YXJyYW50ZWQuXG4gKiBAcGFyYW0ge1BhdGh9IGZpbGUgUGF0aFxuICogQHBhcmFtIHtmcy5TdGF0c30gc3RhdHMgcmVzdWx0IG9mIGZzX3N0YXRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5pdGlhbEFkZCB3YXMgdGhlIGZpbGUgYWRkZWQgYXQgd2F0Y2ggaW5zdGFudGlhdGlvbj9cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gY2xvc2VyIGZvciB0aGUgd2F0Y2hlciBpbnN0YW5jZVxuICovXG5faGFuZGxlRmlsZShmaWxlLCBzdGF0cywgaW5pdGlhbEFkZCkge1xuICBpZiAodGhpcy5mc3cuY2xvc2VkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGRpcm5hbWUgPSBzeXNQYXRoJDIuZGlybmFtZShmaWxlKTtcbiAgY29uc3QgYmFzZW5hbWUgPSBzeXNQYXRoJDIuYmFzZW5hbWUoZmlsZSk7XG4gIGNvbnN0IHBhcmVudCA9IHRoaXMuZnN3Ll9nZXRXYXRjaGVkRGlyKGRpcm5hbWUpO1xuICAvLyBzdGF0cyBpcyBhbHdheXMgcHJlc2VudFxuICBsZXQgcHJldlN0YXRzID0gc3RhdHM7XG5cbiAgLy8gaWYgdGhlIGZpbGUgaXMgYWxyZWFkeSBiZWluZyB3YXRjaGVkLCBkbyBub3RoaW5nXG4gIGlmIChwYXJlbnQuaGFzKGJhc2VuYW1lKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGxpc3RlbmVyID0gYXN5bmMgKHBhdGgsIG5ld1N0YXRzKSA9PiB7XG4gICAgaWYgKCF0aGlzLmZzdy5fdGhyb3R0bGUoVEhST1RUTEVfTU9ERV9XQVRDSCwgZmlsZSwgNSkpIHJldHVybjtcbiAgICBpZiAoIW5ld1N0YXRzIHx8IG5ld1N0YXRzLm10aW1lTXMgPT09IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5ld1N0YXRzID0gYXdhaXQgc3RhdCQyKGZpbGUpO1xuICAgICAgICBpZiAodGhpcy5mc3cuY2xvc2VkKSByZXR1cm47XG4gICAgICAgIC8vIENoZWNrIHRoYXQgY2hhbmdlIGV2ZW50IHdhcyBub3QgZmlyZWQgYmVjYXVzZSBvZiBjaGFuZ2VkIG9ubHkgYWNjZXNzVGltZS5cbiAgICAgICAgY29uc3QgYXQgPSBuZXdTdGF0cy5hdGltZU1zO1xuICAgICAgICBjb25zdCBtdCA9IG5ld1N0YXRzLm10aW1lTXM7XG4gICAgICAgIGlmICghYXQgfHwgYXQgPD0gbXQgfHwgbXQgIT09IHByZXZTdGF0cy5tdGltZU1zKSB7XG4gICAgICAgICAgdGhpcy5mc3cuX2VtaXQoRVZfQ0hBTkdFJDIsIGZpbGUsIG5ld1N0YXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNMaW51eCAmJiBwcmV2U3RhdHMuaW5vICE9PSBuZXdTdGF0cy5pbm8pIHtcbiAgICAgICAgICB0aGlzLmZzdy5fY2xvc2VGaWxlKHBhdGgpO1xuICAgICAgICAgIHByZXZTdGF0cyA9IG5ld1N0YXRzO1xuICAgICAgICAgIHRoaXMuZnN3Ll9hZGRQYXRoQ2xvc2VyKHBhdGgsIHRoaXMuX3dhdGNoV2l0aE5vZGVGcyhmaWxlLCBsaXN0ZW5lcikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZTdGF0cyA9IG5ld1N0YXRzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGaXggaXNzdWVzIHdoZXJlIG10aW1lIGlzIG51bGwgYnV0IGZpbGUgaXMgc3RpbGwgcHJlc2VudFxuICAgICAgICB0aGlzLmZzdy5fcmVtb3ZlKGRpcm5hbWUsIGJhc2VuYW1lKTtcbiAgICAgIH1cbiAgICAgIC8vIGFkZCBpcyBhYm91dCB0byBiZSBlbWl0dGVkIGlmIGZpbGUgbm90IGFscmVhZHkgdHJhY2tlZCBpbiBwYXJlbnRcbiAgICB9IGVsc2UgaWYgKHBhcmVudC5oYXMoYmFzZW5hbWUpKSB7XG4gICAgICAvLyBDaGVjayB0aGF0IGNoYW5nZSBldmVudCB3YXMgbm90IGZpcmVkIGJlY2F1c2Ugb2YgY2hhbmdlZCBvbmx5IGFjY2Vzc1RpbWUuXG4gICAgICBjb25zdCBhdCA9IG5ld1N0YXRzLmF0aW1lTXM7XG4gICAgICBjb25zdCBtdCA9IG5ld1N0YXRzLm10aW1lTXM7XG4gICAgICBpZiAoIWF0IHx8IGF0IDw9IG10IHx8IG10ICE9PSBwcmV2U3RhdHMubXRpbWVNcykge1xuICAgICAgICB0aGlzLmZzdy5fZW1pdChFVl9DSEFOR0UkMiwgZmlsZSwgbmV3U3RhdHMpO1xuICAgICAgfVxuICAgICAgcHJldlN0YXRzID0gbmV3U3RhdHM7XG4gICAgfVxuICB9O1xuICAvLyBraWNrIG9mZiB0aGUgd2F0Y2hlclxuICBjb25zdCBjbG9zZXIgPSB0aGlzLl93YXRjaFdpdGhOb2RlRnMoZmlsZSwgbGlzdGVuZXIpO1xuXG4gIC8vIGVtaXQgYW4gYWRkIGV2ZW50IGlmIHdlJ3JlIHN1cHBvc2VkIHRvXG4gIGlmICghKGluaXRpYWxBZGQgJiYgdGhpcy5mc3cub3B0aW9ucy5pZ25vcmVJbml0aWFsKSAmJiB0aGlzLmZzdy5faXNudElnbm9yZWQoZmlsZSkpIHtcbiAgICBpZiAoIXRoaXMuZnN3Ll90aHJvdHRsZShFVl9BREQkMiwgZmlsZSwgMCkpIHJldHVybjtcbiAgICB0aGlzLmZzdy5fZW1pdChFVl9BREQkMiwgZmlsZSwgc3RhdHMpO1xuICB9XG5cbiAgcmV0dXJuIGNsb3Nlcjtcbn1cblxuLyoqXG4gKiBIYW5kbGUgc3ltbGlua3MgZW5jb3VudGVyZWQgd2hpbGUgcmVhZGluZyBhIGRpci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBlbnRyeSByZXR1cm5lZCBieSByZWFkZGlycFxuICogQHBhcmFtIHtTdHJpbmd9IGRpcmVjdG9yeSBwYXRoIG9mIGRpciBiZWluZyByZWFkXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBvZiB0aGlzIGl0ZW1cbiAqIEBwYXJhbSB7U3RyaW5nfSBpdGVtIGJhc2VuYW1lIG9mIHRoaXMgaXRlbVxuICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59IHRydWUgaWYgbm8gbW9yZSBwcm9jZXNzaW5nIGlzIG5lZWRlZCBmb3IgdGhpcyBlbnRyeS5cbiAqL1xuYXN5bmMgX2hhbmRsZVN5bWxpbmsoZW50cnksIGRpcmVjdG9yeSwgcGF0aCwgaXRlbSkge1xuICBpZiAodGhpcy5mc3cuY2xvc2VkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGZ1bGwgPSBlbnRyeS5mdWxsUGF0aDtcbiAgY29uc3QgZGlyID0gdGhpcy5mc3cuX2dldFdhdGNoZWREaXIoZGlyZWN0b3J5KTtcblxuICBpZiAoIXRoaXMuZnN3Lm9wdGlvbnMuZm9sbG93U3ltbGlua3MpIHtcbiAgICAvLyB3YXRjaCBzeW1saW5rIGRpcmVjdGx5IChkb24ndCBmb2xsb3cpIGFuZCBkZXRlY3QgY2hhbmdlc1xuICAgIHRoaXMuZnN3Ll9pbmNyUmVhZHlDb3VudCgpO1xuXG4gICAgbGV0IGxpbmtQYXRoO1xuICAgIHRyeSB7XG4gICAgICBsaW5rUGF0aCA9IGF3YWl0IGZzcmVhbHBhdGgocGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5mc3cuX2VtaXRSZWFkeSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZnN3LmNsb3NlZCkgcmV0dXJuO1xuICAgIGlmIChkaXIuaGFzKGl0ZW0pKSB7XG4gICAgICBpZiAodGhpcy5mc3cuX3N5bWxpbmtQYXRocy5nZXQoZnVsbCkgIT09IGxpbmtQYXRoKSB7XG4gICAgICAgIHRoaXMuZnN3Ll9zeW1saW5rUGF0aHMuc2V0KGZ1bGwsIGxpbmtQYXRoKTtcbiAgICAgICAgdGhpcy5mc3cuX2VtaXQoRVZfQ0hBTkdFJDIsIHBhdGgsIGVudHJ5LnN0YXRzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZGlyLmFkZChpdGVtKTtcbiAgICAgIHRoaXMuZnN3Ll9zeW1saW5rUGF0aHMuc2V0KGZ1bGwsIGxpbmtQYXRoKTtcbiAgICAgIHRoaXMuZnN3Ll9lbWl0KEVWX0FERCQyLCBwYXRoLCBlbnRyeS5zdGF0cyk7XG4gICAgfVxuICAgIHRoaXMuZnN3Ll9lbWl0UmVhZHkoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGRvbid0IGZvbGxvdyB0aGUgc2FtZSBzeW1saW5rIG1vcmUgdGhhbiBvbmNlXG4gIGlmICh0aGlzLmZzdy5fc3ltbGlua1BhdGhzLmhhcyhmdWxsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdGhpcy5mc3cuX3N5bWxpbmtQYXRocy5zZXQoZnVsbCwgdHJ1ZSk7XG59XG5cbl9oYW5kbGVSZWFkKGRpcmVjdG9yeSwgaW5pdGlhbEFkZCwgd2gsIHRhcmdldCwgZGlyLCBkZXB0aCwgdGhyb3R0bGVyKSB7XG4gIC8vIE5vcm1hbGl6ZSB0aGUgZGlyZWN0b3J5IG5hbWUgb24gV2luZG93c1xuICBkaXJlY3RvcnkgPSBzeXNQYXRoJDIuam9pbihkaXJlY3RvcnksIEVNUFRZX1NUUiQxKTtcblxuICBpZiAoIXdoLmhhc0dsb2IpIHtcbiAgICB0aHJvdHRsZXIgPSB0aGlzLmZzdy5fdGhyb3R0bGUoJ3JlYWRkaXInLCBkaXJlY3RvcnksIDEwMDApO1xuICAgIGlmICghdGhyb3R0bGVyKSByZXR1cm47XG4gIH1cblxuICBjb25zdCBwcmV2aW91cyA9IHRoaXMuZnN3Ll9nZXRXYXRjaGVkRGlyKHdoLnBhdGgpO1xuICBjb25zdCBjdXJyZW50ID0gbmV3IFNldCgpO1xuXG4gIGxldCBzdHJlYW0gPSB0aGlzLmZzdy5fcmVhZGRpcnAoZGlyZWN0b3J5LCB7XG4gICAgZmlsZUZpbHRlcjogZW50cnkgPT4gd2guZmlsdGVyUGF0aChlbnRyeSksXG4gICAgZGlyZWN0b3J5RmlsdGVyOiBlbnRyeSA9PiB3aC5maWx0ZXJEaXIoZW50cnkpLFxuICAgIGRlcHRoOiAwXG4gIH0pLm9uKFNUUl9EQVRBJDEsIGFzeW5jIChlbnRyeSkgPT4ge1xuICAgIGlmICh0aGlzLmZzdy5jbG9zZWQpIHtcbiAgICAgIHN0cmVhbSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXRlbSA9IGVudHJ5LnBhdGg7XG4gICAgbGV0IHBhdGggPSBzeXNQYXRoJDIuam9pbihkaXJlY3RvcnksIGl0ZW0pO1xuICAgIGN1cnJlbnQuYWRkKGl0ZW0pO1xuXG4gICAgaWYgKGVudHJ5LnN0YXRzLmlzU3ltYm9saWNMaW5rKCkgJiYgYXdhaXQgdGhpcy5faGFuZGxlU3ltbGluayhlbnRyeSwgZGlyZWN0b3J5LCBwYXRoLCBpdGVtKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZzdy5jbG9zZWQpIHtcbiAgICAgIHN0cmVhbSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmlsZXMgdGhhdCBwcmVzZW50IGluIGN1cnJlbnQgZGlyZWN0b3J5IHNuYXBzaG90XG4gICAgLy8gYnV0IGFic2VudCBpbiBwcmV2aW91cyBhcmUgYWRkZWQgdG8gd2F0Y2ggbGlzdCBhbmRcbiAgICAvLyBlbWl0IGBhZGRgIGV2ZW50LlxuICAgIGlmIChpdGVtID09PSB0YXJnZXQgfHwgIXRhcmdldCAmJiAhcHJldmlvdXMuaGFzKGl0ZW0pKSB7XG4gICAgICB0aGlzLmZzdy5faW5jclJlYWR5Q291bnQoKTtcblxuICAgICAgLy8gZW5zdXJlIHJlbGF0aXZlbmVzcyBvZiBwYXRoIGlzIHByZXNlcnZlZCBpbiBjYXNlIG9mIHdhdGNoZXIgcmV1c2VcbiAgICAgIHBhdGggPSBzeXNQYXRoJDIuam9pbihkaXIsIHN5c1BhdGgkMi5yZWxhdGl2ZShkaXIsIHBhdGgpKTtcblxuICAgICAgdGhpcy5fYWRkVG9Ob2RlRnMocGF0aCwgaW5pdGlhbEFkZCwgd2gsIGRlcHRoICsgMSk7XG4gICAgfVxuICB9KS5vbihFVl9FUlJPUiQyLCB0aGlzLl9ib3VuZEhhbmRsZUVycm9yKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PlxuICAgIHN0cmVhbS5vbmNlKFNUUl9FTkQkMiwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZnN3LmNsb3NlZCkge1xuICAgICAgICBzdHJlYW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdhc1Rocm90dGxlZCA9IHRocm90dGxlciA/IHRocm90dGxlci5jbGVhcigpIDogZmFsc2U7XG5cbiAgICAgIHJlc29sdmUoKTtcblxuICAgICAgLy8gRmlsZXMgdGhhdCBhYnNlbnQgaW4gY3VycmVudCBkaXJlY3Rvcnkgc25hcHNob3RcbiAgICAgIC8vIGJ1dCBwcmVzZW50IGluIHByZXZpb3VzIGVtaXQgYHJlbW92ZWAgZXZlbnRcbiAgICAgIC8vIGFuZCBhcmUgcmVtb3ZlZCBmcm9tIEB3YXRjaGVkW2RpcmVjdG9yeV0uXG4gICAgICBwcmV2aW91cy5nZXRDaGlsZHJlbigpLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbSAhPT0gZGlyZWN0b3J5ICYmXG4gICAgICAgICAgIWN1cnJlbnQuaGFzKGl0ZW0pICYmXG4gICAgICAgICAgLy8gaW4gY2FzZSBvZiBpbnRlcnNlY3RpbmcgZ2xvYnM7XG4gICAgICAgICAgLy8gYSBwYXRoIG1heSBoYXZlIGJlZW4gZmlsdGVyZWQgb3V0IG9mIHRoaXMgcmVhZGRpciwgYnV0XG4gICAgICAgICAgLy8gc2hvdWxkbid0IGJlIHJlbW92ZWQgYmVjYXVzZSBpdCBtYXRjaGVzIGEgZGlmZmVyZW50IGdsb2JcbiAgICAgICAgICAoIXdoLmhhc0dsb2IgfHwgd2guZmlsdGVyUGF0aCh7XG4gICAgICAgICAgICBmdWxsUGF0aDogc3lzUGF0aCQyLnJlc29sdmUoZGlyZWN0b3J5LCBpdGVtKVxuICAgICAgICAgIH0pKTtcbiAgICAgIH0pLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgdGhpcy5mc3cuX3JlbW92ZShkaXJlY3RvcnksIGl0ZW0pO1xuICAgICAgfSk7XG5cbiAgICAgIHN0cmVhbSA9IHVuZGVmaW5lZDtcblxuICAgICAgLy8gb25lIG1vcmUgdGltZSBmb3IgYW55IG1pc3NlZCBpbiBjYXNlIGNoYW5nZXMgY2FtZSBpbiBleHRyZW1lbHkgcXVpY2tseVxuICAgICAgaWYgKHdhc1Rocm90dGxlZCkgdGhpcy5faGFuZGxlUmVhZChkaXJlY3RvcnksIGZhbHNlLCB3aCwgdGFyZ2V0LCBkaXIsIGRlcHRoLCB0aHJvdHRsZXIpO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogUmVhZCBkaXJlY3RvcnkgdG8gYWRkIC8gcmVtb3ZlIGZpbGVzIGZyb20gYEB3YXRjaGVkYCBsaXN0IGFuZCByZS1yZWFkIGl0IG9uIGNoYW5nZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBkaXIgZnMgcGF0aFxuICogQHBhcmFtIHtmcy5TdGF0c30gc3RhdHNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5pdGlhbEFkZFxuICogQHBhcmFtIHtOdW1iZXJ9IGRlcHRoIHJlbGF0aXZlIHRvIHVzZXItc3VwcGxpZWQgcGF0aFxuICogQHBhcmFtIHtTdHJpbmd9IHRhcmdldCBjaGlsZCBwYXRoIHRhcmdldGVkIGZvciB3YXRjaFxuICogQHBhcmFtIHtPYmplY3R9IHdoIENvbW1vbiB3YXRjaCBoZWxwZXJzIGZvciB0aGlzIHBhdGhcbiAqIEBwYXJhbSB7U3RyaW5nfSByZWFscGF0aFxuICogQHJldHVybnMge1Byb21pc2U8RnVuY3Rpb24+fSBjbG9zZXIgZm9yIHRoZSB3YXRjaGVyIGluc3RhbmNlLlxuICovXG5hc3luYyBfaGFuZGxlRGlyKGRpciwgc3RhdHMsIGluaXRpYWxBZGQsIGRlcHRoLCB0YXJnZXQsIHdoLCByZWFscGF0aCkge1xuICBjb25zdCBwYXJlbnREaXIgPSB0aGlzLmZzdy5fZ2V0V2F0Y2hlZERpcihzeXNQYXRoJDIuZGlybmFtZShkaXIpKTtcbiAgY29uc3QgdHJhY2tlZCA9IHBhcmVudERpci5oYXMoc3lzUGF0aCQyLmJhc2VuYW1lKGRpcikpO1xuICBpZiAoIShpbml0aWFsQWRkICYmIHRoaXMuZnN3Lm9wdGlvbnMuaWdub3JlSW5pdGlhbCkgJiYgIXRhcmdldCAmJiAhdHJhY2tlZCkge1xuICAgIGlmICghd2guaGFzR2xvYiB8fCB3aC5nbG9iRmlsdGVyKGRpcikpIHRoaXMuZnN3Ll9lbWl0KEVWX0FERF9ESVIkMiwgZGlyLCBzdGF0cyk7XG4gIH1cblxuICAvLyBlbnN1cmUgZGlyIGlzIHRyYWNrZWQgKGhhcm1sZXNzIGlmIHJlZHVuZGFudClcbiAgcGFyZW50RGlyLmFkZChzeXNQYXRoJDIuYmFzZW5hbWUoZGlyKSk7XG4gIHRoaXMuZnN3Ll9nZXRXYXRjaGVkRGlyKGRpcik7XG4gIGxldCB0aHJvdHRsZXI7XG4gIGxldCBjbG9zZXI7XG5cbiAgY29uc3Qgb0RlcHRoID0gdGhpcy5mc3cub3B0aW9ucy5kZXB0aDtcbiAgaWYgKChvRGVwdGggPT0gbnVsbCB8fCBkZXB0aCA8PSBvRGVwdGgpICYmICF0aGlzLmZzdy5fc3ltbGlua1BhdGhzLmhhcyhyZWFscGF0aCkpIHtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlUmVhZChkaXIsIGluaXRpYWxBZGQsIHdoLCB0YXJnZXQsIGRpciwgZGVwdGgsIHRocm90dGxlcik7XG4gICAgICBpZiAodGhpcy5mc3cuY2xvc2VkKSByZXR1cm47XG4gICAgfVxuXG4gICAgY2xvc2VyID0gdGhpcy5fd2F0Y2hXaXRoTm9kZUZzKGRpciwgKGRpclBhdGgsIHN0YXRzKSA9PiB7XG4gICAgICAvLyBpZiBjdXJyZW50IGRpcmVjdG9yeSBpcyByZW1vdmVkLCBkbyBub3RoaW5nXG4gICAgICBpZiAoc3RhdHMgJiYgc3RhdHMubXRpbWVNcyA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICB0aGlzLl9oYW5kbGVSZWFkKGRpclBhdGgsIGZhbHNlLCB3aCwgdGFyZ2V0LCBkaXIsIGRlcHRoLCB0aHJvdHRsZXIpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBjbG9zZXI7XG59XG5cbi8qKlxuICogSGFuZGxlIGFkZGVkIGZpbGUsIGRpcmVjdG9yeSwgb3IgZ2xvYiBwYXR0ZXJuLlxuICogRGVsZWdhdGVzIGNhbGwgdG8gX2hhbmRsZUZpbGUgLyBfaGFuZGxlRGlyIGFmdGVyIGNoZWNrcy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIHRvIGZpbGUgb3IgaXJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaW5pdGlhbEFkZCB3YXMgdGhlIGZpbGUgYWRkZWQgYXQgd2F0Y2ggaW5zdGFudGlhdGlvbj9cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcmlvcldoIGRlcHRoIHJlbGF0aXZlIHRvIHVzZXItc3VwcGxpZWQgcGF0aFxuICogQHBhcmFtIHtOdW1iZXJ9IGRlcHRoIENoaWxkIHBhdGggYWN0dWFsbHkgdGFyZ2V0ZWQgZm9yIHdhdGNoXG4gKiBAcGFyYW0ge1N0cmluZz19IHRhcmdldCBDaGlsZCBwYXRoIGFjdHVhbGx5IHRhcmdldGVkIGZvciB3YXRjaFxuICogQHJldHVybnMge1Byb21pc2V9XG4gKi9cbmFzeW5jIF9hZGRUb05vZGVGcyhwYXRoLCBpbml0aWFsQWRkLCBwcmlvcldoLCBkZXB0aCwgdGFyZ2V0KSB7XG4gIGNvbnN0IHJlYWR5ID0gdGhpcy5mc3cuX2VtaXRSZWFkeTtcbiAgaWYgKHRoaXMuZnN3Ll9pc0lnbm9yZWQocGF0aCkgfHwgdGhpcy5mc3cuY2xvc2VkKSB7XG4gICAgcmVhZHkoKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB3aCA9IHRoaXMuZnN3Ll9nZXRXYXRjaEhlbHBlcnMocGF0aCwgZGVwdGgpO1xuICBpZiAoIXdoLmhhc0dsb2IgJiYgcHJpb3JXaCkge1xuICAgIHdoLmhhc0dsb2IgPSBwcmlvcldoLmhhc0dsb2I7XG4gICAgd2guZ2xvYkZpbHRlciA9IHByaW9yV2guZ2xvYkZpbHRlcjtcbiAgICB3aC5maWx0ZXJQYXRoID0gZW50cnkgPT4gcHJpb3JXaC5maWx0ZXJQYXRoKGVudHJ5KTtcbiAgICB3aC5maWx0ZXJEaXIgPSBlbnRyeSA9PiBwcmlvcldoLmZpbHRlckRpcihlbnRyeSk7XG4gIH1cblxuICAvLyBldmFsdWF0ZSB3aGF0IGlzIGF0IHRoZSBwYXRoIHdlJ3JlIGJlaW5nIGFza2VkIHRvIHdhdGNoXG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0TWV0aG9kcyQxW3doLnN0YXRNZXRob2RdKHdoLndhdGNoUGF0aCk7XG4gICAgaWYgKHRoaXMuZnN3LmNsb3NlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmZzdy5faXNJZ25vcmVkKHdoLndhdGNoUGF0aCwgc3RhdHMpKSB7XG4gICAgICByZWFkeSgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGxvdyA9IHRoaXMuZnN3Lm9wdGlvbnMuZm9sbG93U3ltbGlua3MgJiYgIXBhdGguaW5jbHVkZXMoU1RBUikgJiYgIXBhdGguaW5jbHVkZXMoQlJBQ0VfU1RBUlQkMSk7XG4gICAgbGV0IGNsb3NlcjtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29uc3QgYWJzUGF0aCA9IHN5c1BhdGgkMi5yZXNvbHZlKHBhdGgpO1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aCA9IGZvbGxvdyA/IGF3YWl0IGZzcmVhbHBhdGgocGF0aCkgOiBwYXRoO1xuICAgICAgaWYgKHRoaXMuZnN3LmNsb3NlZCkgcmV0dXJuO1xuICAgICAgY2xvc2VyID0gYXdhaXQgdGhpcy5faGFuZGxlRGlyKHdoLndhdGNoUGF0aCwgc3RhdHMsIGluaXRpYWxBZGQsIGRlcHRoLCB0YXJnZXQsIHdoLCB0YXJnZXRQYXRoKTtcbiAgICAgIGlmICh0aGlzLmZzdy5jbG9zZWQpIHJldHVybjtcbiAgICAgIC8vIHByZXNlcnZlIHRoaXMgc3ltbGluaydzIHRhcmdldCBwYXRoXG4gICAgICBpZiAoYWJzUGF0aCAhPT0gdGFyZ2V0UGF0aCAmJiB0YXJnZXRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5mc3cuX3N5bWxpbmtQYXRocy5zZXQoYWJzUGF0aCwgdGFyZ2V0UGF0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICBjb25zdCB0YXJnZXRQYXRoID0gZm9sbG93ID8gYXdhaXQgZnNyZWFscGF0aChwYXRoKSA6IHBhdGg7XG4gICAgICBpZiAodGhpcy5mc3cuY2xvc2VkKSByZXR1cm47XG4gICAgICBjb25zdCBwYXJlbnQgPSBzeXNQYXRoJDIuZGlybmFtZSh3aC53YXRjaFBhdGgpO1xuICAgICAgdGhpcy5mc3cuX2dldFdhdGNoZWREaXIocGFyZW50KS5hZGQod2gud2F0Y2hQYXRoKTtcbiAgICAgIHRoaXMuZnN3Ll9lbWl0KEVWX0FERCQyLCB3aC53YXRjaFBhdGgsIHN0YXRzKTtcbiAgICAgIGNsb3NlciA9IGF3YWl0IHRoaXMuX2hhbmRsZURpcihwYXJlbnQsIHN0YXRzLCBpbml0aWFsQWRkLCBkZXB0aCwgcGF0aCwgd2gsIHRhcmdldFBhdGgpO1xuICAgICAgaWYgKHRoaXMuZnN3LmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAvLyBwcmVzZXJ2ZSB0aGlzIHN5bWxpbmsncyB0YXJnZXQgcGF0aFxuICAgICAgaWYgKHRhcmdldFBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmZzdy5fc3ltbGlua1BhdGhzLnNldChzeXNQYXRoJDIucmVzb2x2ZShwYXRoKSwgdGFyZ2V0UGF0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNsb3NlciA9IHRoaXMuX2hhbmRsZUZpbGUod2gud2F0Y2hQYXRoLCBzdGF0cywgaW5pdGlhbEFkZCk7XG4gICAgfVxuICAgIHJlYWR5KCk7XG5cbiAgICB0aGlzLmZzdy5fYWRkUGF0aENsb3NlcihwYXRoLCBjbG9zZXIpO1xuICAgIHJldHVybiBmYWxzZTtcblxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0aGlzLmZzdy5faGFuZGxlRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZWFkeSgpO1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICB9XG59XG5cbn07XG5cbnZhciBub2RlZnNIYW5kbGVyID0gTm9kZUZzSGFuZGxlciQxO1xuXG52YXIgZnNldmVudHNIYW5kbGVyRXhwb3J0cyA9IHt9O1xudmFyIGZzZXZlbnRzSGFuZGxlciA9IHtcbiAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIGZzZXZlbnRzSGFuZGxlckV4cG9ydHM7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBmc2V2ZW50c0hhbmRsZXJFeHBvcnRzID0gdjsgfSxcbn07XG5cbmNvbnN0IGZzJDYgPSByZXF1aXJlJCQwX19kZWZhdWx0O1xuY29uc3Qgc3lzUGF0aCQxID0gcmVxdWlyZSQkMCQ0O1xuY29uc3QgeyBwcm9taXNpZnk6IHByb21pc2lmeSQxIH0gPSByZXF1aXJlJCQwJDY7XG5cbmxldCBmc2V2ZW50cztcbnRyeSB7XG4gIGZzZXZlbnRzID0gX19yZXF1aXJlKCdmc2V2ZW50cycpO1xufSBjYXRjaCAoZXJyb3IpIHtcbiAgaWYgKHByb2Nlc3MuZW52LkNIT0tJREFSX1BSSU5UX0ZTRVZFTlRTX1JFUVVJUkVfRVJST1IpIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xufVxuXG5pZiAoZnNldmVudHMpIHtcbiAgLy8gVE9ETzogcmVhbCBjaGVja1xuICBjb25zdCBtdGNoID0gcHJvY2Vzcy52ZXJzaW9uLm1hdGNoKC92KFxcZCspXFwuKFxcZCspLyk7XG4gIGlmIChtdGNoICYmIG10Y2hbMV0gJiYgbXRjaFsyXSkge1xuICAgIGNvbnN0IG1haiA9IE51bWJlci5wYXJzZUludChtdGNoWzFdLCAxMCk7XG4gICAgY29uc3QgbWluID0gTnVtYmVyLnBhcnNlSW50KG10Y2hbMl0sIDEwKTtcbiAgICBpZiAobWFqID09PSA4ICYmIG1pbiA8IDE2KSB7XG4gICAgICBmc2V2ZW50cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuY29uc3Qge1xuICBFVl9BREQ6IEVWX0FERCQxLFxuICBFVl9DSEFOR0U6IEVWX0NIQU5HRSQxLFxuICBFVl9BRERfRElSOiBFVl9BRERfRElSJDEsXG4gIEVWX1VOTElOSzogRVZfVU5MSU5LJDEsXG4gIEVWX0VSUk9SOiBFVl9FUlJPUiQxLFxuICBTVFJfREFUQSxcbiAgU1RSX0VORDogU1RSX0VORCQxLFxuICBGU0VWRU5UX0NSRUFURUQsXG4gIEZTRVZFTlRfTU9ESUZJRUQsXG4gIEZTRVZFTlRfREVMRVRFRCxcbiAgRlNFVkVOVF9NT1ZFRCxcbiAgLy8gRlNFVkVOVF9DTE9ORUQsXG4gIEZTRVZFTlRfVU5LTk9XTixcbiAgRlNFVkVOVF9UWVBFX0ZJTEUsXG4gIEZTRVZFTlRfVFlQRV9ESVJFQ1RPUlksXG4gIEZTRVZFTlRfVFlQRV9TWU1MSU5LLFxuXG4gIFJPT1RfR0xPQlNUQVIsXG4gIERJUl9TVUZGSVgsXG4gIERPVF9TTEFTSCxcbiAgRlVOQ1RJT05fVFlQRTogRlVOQ1RJT05fVFlQRSQxLFxuICBFTVBUWV9GTjogRU1QVFlfRk4kMSxcbiAgSURFTlRJVFlfRk5cbn0gPSBjb25zdGFudHMkMTtcblxuY29uc3QgRGVwdGggPSAodmFsdWUpID0+IGlzTmFOKHZhbHVlKSA/IHt9IDoge2RlcHRoOiB2YWx1ZX07XG5cbmNvbnN0IHN0YXQkMSA9IHByb21pc2lmeSQxKGZzJDYuc3RhdCk7XG5jb25zdCBsc3RhdCA9IHByb21pc2lmeSQxKGZzJDYubHN0YXQpO1xuY29uc3QgcmVhbHBhdGggPSBwcm9taXNpZnkkMShmcyQ2LnJlYWxwYXRoKTtcblxuY29uc3Qgc3RhdE1ldGhvZHMgPSB7IHN0YXQ6IHN0YXQkMSwgbHN0YXQgfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7U3RyaW5nfSBQYXRoXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBGc0V2ZW50c1dhdGNoQ29udGFpbmVyXG4gKiBAcHJvcGVydHkge1NldDxGdW5jdGlvbj59IGxpc3RlbmVyc1xuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gcmF3RW1pdHRlclxuICogQHByb3BlcnR5IHt7c3RvcDogRnVuY3Rpb259fSB3YXRjaGVyXG4gKi9cblxuLy8gZnNldmVudHMgaW5zdGFuY2UgaGVscGVyIGZ1bmN0aW9uc1xuLyoqXG4gKiBPYmplY3QgdG8gaG9sZCBwZXItcHJvY2VzcyBmc2V2ZW50cyBpbnN0YW5jZXMgKG1heSBiZSBzaGFyZWQgYWNyb3NzIGNob2tpZGFyIEZTV2F0Y2hlciBpbnN0YW5jZXMpXG4gKiBAdHlwZSB7TWFwPFBhdGgsRnNFdmVudHNXYXRjaENvbnRhaW5lcj59XG4gKi9cbmNvbnN0IEZTRXZlbnRzV2F0Y2hlcnMgPSBuZXcgTWFwKCk7XG5cbi8vIFRocmVzaG9sZCBvZiBkdXBsaWNhdGUgcGF0aCBwcmVmaXhlcyBhdCB3aGljaCB0byBzdGFydFxuLy8gY29uc29saWRhdGluZyBnb2luZyBmb3J3YXJkXG5jb25zdCBjb25zb2xpZGF0ZVRocmVzaGhvbGQgPSAxMDtcblxuY29uc3Qgd3JvbmdFdmVudEZsYWdzID0gbmV3IFNldChbXG4gIDY5ODg4LCA3MDQwMCwgNzE0MjQsIDcyNzA0LCA3MzQ3MiwgMTMxMzI4LCAxMzE4NDAsIDI2MjkxMlxuXSk7XG5cbi8qKlxuICogSW5zdGFudGlhdGVzIHRoZSBmc2V2ZW50cyBpbnRlcmZhY2VcbiAqIEBwYXJhbSB7UGF0aH0gcGF0aCBwYXRoIHRvIGJlIHdhdGNoZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGNhbGxlZCB3aGVuIGZzZXZlbnRzIGlzIGJvdW5kIGFuZCByZWFkeVxuICogQHJldHVybnMge3tzdG9wOiBGdW5jdGlvbn19IG5ldyBmc2V2ZW50cyBpbnN0YW5jZVxuICovXG5jb25zdCBjcmVhdGVGU0V2ZW50c0luc3RhbmNlID0gKHBhdGgsIGNhbGxiYWNrKSA9PiB7XG4gIGNvbnN0IHN0b3AgPSBmc2V2ZW50cy53YXRjaChwYXRoLCBjYWxsYmFjayk7XG4gIHJldHVybiB7c3RvcH07XG59O1xuXG4vKipcbiAqIEluc3RhbnRpYXRlcyB0aGUgZnNldmVudHMgaW50ZXJmYWNlIG9yIGJpbmRzIGxpc3RlbmVycyB0byBhbiBleGlzdGluZyBvbmUgY292ZXJpbmdcbiAqIHRoZSBzYW1lIGZpbGUgdHJlZS5cbiAqIEBwYXJhbSB7UGF0aH0gcGF0aCAgICAgICAgICAgLSB0byBiZSB3YXRjaGVkXG4gKiBAcGFyYW0ge1BhdGh9IHJlYWxQYXRoICAgICAgIC0gcmVhbCBwYXRoIGZvciBzeW1saW5rc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgICAtIGNhbGxlZCB3aGVuIGZzZXZlbnRzIGVtaXRzIGV2ZW50c1xuICogQHBhcmFtIHtGdW5jdGlvbn0gcmF3RW1pdHRlciAtIHBhc3NlcyBkYXRhIHRvIGxpc3RlbmVycyBvZiB0aGUgJ3JhdycgZXZlbnRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gY2xvc2VyXG4gKi9cbmZ1bmN0aW9uIHNldEZTRXZlbnRzTGlzdGVuZXIocGF0aCwgcmVhbFBhdGgsIGxpc3RlbmVyLCByYXdFbWl0dGVyKSB7XG4gIGxldCB3YXRjaFBhdGggPSBzeXNQYXRoJDEuZXh0bmFtZShyZWFsUGF0aCkgPyBzeXNQYXRoJDEuZGlybmFtZShyZWFsUGF0aCkgOiByZWFsUGF0aDtcblxuICBjb25zdCBwYXJlbnRQYXRoID0gc3lzUGF0aCQxLmRpcm5hbWUod2F0Y2hQYXRoKTtcbiAgbGV0IGNvbnQgPSBGU0V2ZW50c1dhdGNoZXJzLmdldCh3YXRjaFBhdGgpO1xuXG4gIC8vIElmIHdlJ3ZlIGFjY3VtdWxhdGVkIGEgc3Vic3RhbnRpYWwgbnVtYmVyIG9mIHBhdGhzIHRoYXRcbiAgLy8gY291bGQgaGF2ZSBiZWVuIGNvbnNvbGlkYXRlZCBieSB3YXRjaGluZyBvbmUgZGlyZWN0b3J5XG4gIC8vIGFib3ZlIHRoZSBjdXJyZW50IG9uZSwgY3JlYXRlIGEgd2F0Y2hlciBvbiB0aGUgcGFyZW50XG4gIC8vIHBhdGggaW5zdGVhZCwgc28gdGhhdCB3ZSBkbyBjb25zb2xpZGF0ZSBnb2luZyBmb3J3YXJkLlxuICBpZiAoY291bGRDb25zb2xpZGF0ZShwYXJlbnRQYXRoKSkge1xuICAgIHdhdGNoUGF0aCA9IHBhcmVudFBhdGg7XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFBhdGggPSBzeXNQYXRoJDEucmVzb2x2ZShwYXRoKTtcbiAgY29uc3QgaGFzU3ltbGluayA9IHJlc29sdmVkUGF0aCAhPT0gcmVhbFBhdGg7XG5cbiAgY29uc3QgZmlsdGVyZWRMaXN0ZW5lciA9IChmdWxsUGF0aCwgZmxhZ3MsIGluZm8pID0+IHtcbiAgICBpZiAoaGFzU3ltbGluaykgZnVsbFBhdGggPSBmdWxsUGF0aC5yZXBsYWNlKHJlYWxQYXRoLCByZXNvbHZlZFBhdGgpO1xuICAgIGlmIChcbiAgICAgIGZ1bGxQYXRoID09PSByZXNvbHZlZFBhdGggfHxcbiAgICAgICFmdWxsUGF0aC5pbmRleE9mKHJlc29sdmVkUGF0aCArIHN5c1BhdGgkMS5zZXApXG4gICAgKSBsaXN0ZW5lcihmdWxsUGF0aCwgZmxhZ3MsIGluZm8pO1xuICB9O1xuXG4gIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB3YXRjaGVyIG9uIGEgcGFyZW50IHBhdGhcbiAgLy8gbW9kaWZpZXMgYHdhdGNoUGF0aGAgdG8gdGhlIHBhcmVudCBwYXRoIHdoZW4gaXQgZmluZHMgYSBtYXRjaFxuICBsZXQgd2F0Y2hlZFBhcmVudCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHdhdGNoZWRQYXRoIG9mIEZTRXZlbnRzV2F0Y2hlcnMua2V5cygpKSB7XG4gICAgaWYgKHJlYWxQYXRoLmluZGV4T2Yoc3lzUGF0aCQxLnJlc29sdmUod2F0Y2hlZFBhdGgpICsgc3lzUGF0aCQxLnNlcCkgPT09IDApIHtcbiAgICAgIHdhdGNoUGF0aCA9IHdhdGNoZWRQYXRoO1xuICAgICAgY29udCA9IEZTRXZlbnRzV2F0Y2hlcnMuZ2V0KHdhdGNoUGF0aCk7XG4gICAgICB3YXRjaGVkUGFyZW50ID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb250IHx8IHdhdGNoZWRQYXJlbnQpIHtcbiAgICBjb250Lmxpc3RlbmVycy5hZGQoZmlsdGVyZWRMaXN0ZW5lcik7XG4gIH0gZWxzZSB7XG4gICAgY29udCA9IHtcbiAgICAgIGxpc3RlbmVyczogbmV3IFNldChbZmlsdGVyZWRMaXN0ZW5lcl0pLFxuICAgICAgcmF3RW1pdHRlcixcbiAgICAgIHdhdGNoZXI6IGNyZWF0ZUZTRXZlbnRzSW5zdGFuY2Uod2F0Y2hQYXRoLCAoZnVsbFBhdGgsIGZsYWdzKSA9PiB7XG4gICAgICAgIGlmICghY29udC5saXN0ZW5lcnMuc2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBpbmZvID0gZnNldmVudHMuZ2V0SW5mbyhmdWxsUGF0aCwgZmxhZ3MpO1xuICAgICAgICBjb250Lmxpc3RlbmVycy5mb3JFYWNoKGxpc3QgPT4ge1xuICAgICAgICAgIGxpc3QoZnVsbFBhdGgsIGZsYWdzLCBpbmZvKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29udC5yYXdFbWl0dGVyKGluZm8uZXZlbnQsIGZ1bGxQYXRoLCBpbmZvKTtcbiAgICAgIH0pXG4gICAgfTtcbiAgICBGU0V2ZW50c1dhdGNoZXJzLnNldCh3YXRjaFBhdGgsIGNvbnQpO1xuICB9XG5cbiAgLy8gcmVtb3ZlcyB0aGlzIGluc3RhbmNlJ3MgbGlzdGVuZXJzIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcgZnNldmVudHNcbiAgLy8gaW5zdGFuY2UgaWYgdGhlcmUgYXJlIG5vIG1vcmUgbGlzdGVuZXJzIGxlZnRcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjb25zdCBsc3QgPSBjb250Lmxpc3RlbmVycztcblxuICAgIGxzdC5kZWxldGUoZmlsdGVyZWRMaXN0ZW5lcik7XG4gICAgaWYgKCFsc3Quc2l6ZSkge1xuICAgICAgRlNFdmVudHNXYXRjaGVycy5kZWxldGUod2F0Y2hQYXRoKTtcbiAgICAgIGlmIChjb250LndhdGNoZXIpIHJldHVybiBjb250LndhdGNoZXIuc3RvcCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb250LnJhd0VtaXR0ZXIgPSBjb250LndhdGNoZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY29udCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbi8vIERlY2lkZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgc3RhcnQgYSBuZXcgaGlnaGVyLWxldmVsXG4vLyBwYXJlbnQgd2F0Y2hlclxuY29uc3QgY291bGRDb25zb2xpZGF0ZSA9IChwYXRoKSA9PiB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3Qgd2F0Y2hQYXRoIG9mIEZTRXZlbnRzV2F0Y2hlcnMua2V5cygpKSB7XG4gICAgaWYgKHdhdGNoUGF0aC5pbmRleE9mKHBhdGgpID09PSAwKSB7XG4gICAgICBjb3VudCsrO1xuICAgICAgaWYgKGNvdW50ID49IGNvbnNvbGlkYXRlVGhyZXNoaG9sZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vLyByZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGZzZXZlbnRzIGNhbiBiZSB1c2VkXG5jb25zdCBjYW5Vc2UgPSAoKSA9PiBmc2V2ZW50cyAmJiBGU0V2ZW50c1dhdGNoZXJzLnNpemUgPCAxMjg7XG5cbi8vIGRldGVybWluZXMgc3ViZGlyZWN0b3J5IHRyYXZlcnNhbCBsZXZlbHMgZnJvbSByb290IHRvIHBhdGhcbmNvbnN0IGNhbGNEZXB0aCA9IChwYXRoLCByb290KSA9PiB7XG4gIGxldCBpID0gMDtcbiAgd2hpbGUgKCFwYXRoLmluZGV4T2Yocm9vdCkgJiYgKHBhdGggPSBzeXNQYXRoJDEuZGlybmFtZShwYXRoKSkgIT09IHJvb3QpIGkrKztcbiAgcmV0dXJuIGk7XG59O1xuXG4vLyByZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmc2V2ZW50cycgZXZlbnQgaW5mbyBoYXMgdGhlIHNhbWUgdHlwZVxuLy8gYXMgdGhlIG9uZSByZXR1cm5lZCBieSBmcy5zdGF0XG5jb25zdCBzYW1lVHlwZXMgPSAoaW5mbywgc3RhdHMpID0+IChcbiAgaW5mby50eXBlID09PSBGU0VWRU5UX1RZUEVfRElSRUNUT1JZICYmIHN0YXRzLmlzRGlyZWN0b3J5KCkgfHxcbiAgaW5mby50eXBlID09PSBGU0VWRU5UX1RZUEVfU1lNTElOSyAmJiBzdGF0cy5pc1N5bWJvbGljTGluaygpIHx8XG4gIGluZm8udHlwZSA9PT0gRlNFVkVOVF9UWVBFX0ZJTEUgJiYgc3RhdHMuaXNGaWxlKClcbik7XG5cbi8qKlxuICogQG1peGluXG4gKi9cbmxldCBGc0V2ZW50c0hhbmRsZXIkMSA9IGNsYXNzIEZzRXZlbnRzSGFuZGxlciB7XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4uL2luZGV4JykuRlNXYXRjaGVyfSBmc3dcbiAqL1xuY29uc3RydWN0b3IoZnN3KSB7XG4gIHRoaXMuZnN3ID0gZnN3O1xufVxuY2hlY2tJZ25vcmVkKHBhdGgsIHN0YXRzKSB7XG4gIGNvbnN0IGlwYXRocyA9IHRoaXMuZnN3Ll9pZ25vcmVkUGF0aHM7XG4gIGlmICh0aGlzLmZzdy5faXNJZ25vcmVkKHBhdGgsIHN0YXRzKSkge1xuICAgIGlwYXRocy5hZGQocGF0aCk7XG4gICAgaWYgKHN0YXRzICYmIHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGlwYXRocy5hZGQocGF0aCArIFJPT1RfR0xPQlNUQVIpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlwYXRocy5kZWxldGUocGF0aCk7XG4gIGlwYXRocy5kZWxldGUocGF0aCArIFJPT1RfR0xPQlNUQVIpO1xufVxuXG5hZGRPckNoYW5nZShwYXRoLCBmdWxsUGF0aCwgcmVhbFBhdGgsIHBhcmVudCwgd2F0Y2hlZERpciwgaXRlbSwgaW5mbywgb3B0cykge1xuICBjb25zdCBldmVudCA9IHdhdGNoZWREaXIuaGFzKGl0ZW0pID8gRVZfQ0hBTkdFJDEgOiBFVl9BREQkMTtcbiAgdGhpcy5oYW5kbGVFdmVudChldmVudCwgcGF0aCwgZnVsbFBhdGgsIHJlYWxQYXRoLCBwYXJlbnQsIHdhdGNoZWREaXIsIGl0ZW0sIGluZm8sIG9wdHMpO1xufVxuXG5hc3luYyBjaGVja0V4aXN0cyhwYXRoLCBmdWxsUGF0aCwgcmVhbFBhdGgsIHBhcmVudCwgd2F0Y2hlZERpciwgaXRlbSwgaW5mbywgb3B0cykge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdCQxKHBhdGgpO1xuICAgIGlmICh0aGlzLmZzdy5jbG9zZWQpIHJldHVybjtcbiAgICBpZiAoc2FtZVR5cGVzKGluZm8sIHN0YXRzKSkge1xuICAgICAgdGhpcy5hZGRPckNoYW5nZShwYXRoLCBmdWxsUGF0aCwgcmVhbFBhdGgsIHBhcmVudCwgd2F0Y2hlZERpciwgaXRlbSwgaW5mbywgb3B0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlRXZlbnQoRVZfVU5MSU5LJDEsIHBhdGgsIGZ1bGxQYXRoLCByZWFsUGF0aCwgcGFyZW50LCB3YXRjaGVkRGlyLCBpdGVtLCBpbmZvLCBvcHRzKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yLmNvZGUgPT09ICdFQUNDRVMnKSB7XG4gICAgICB0aGlzLmFkZE9yQ2hhbmdlKHBhdGgsIGZ1bGxQYXRoLCByZWFsUGF0aCwgcGFyZW50LCB3YXRjaGVkRGlyLCBpdGVtLCBpbmZvLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVFdmVudChFVl9VTkxJTkskMSwgcGF0aCwgZnVsbFBhdGgsIHJlYWxQYXRoLCBwYXJlbnQsIHdhdGNoZWREaXIsIGl0ZW0sIGluZm8sIG9wdHMpO1xuICAgIH1cbiAgfVxufVxuXG5oYW5kbGVFdmVudChldmVudCwgcGF0aCwgZnVsbFBhdGgsIHJlYWxQYXRoLCBwYXJlbnQsIHdhdGNoZWREaXIsIGl0ZW0sIGluZm8sIG9wdHMpIHtcbiAgaWYgKHRoaXMuZnN3LmNsb3NlZCB8fCB0aGlzLmNoZWNrSWdub3JlZChwYXRoKSkgcmV0dXJuO1xuXG4gIGlmIChldmVudCA9PT0gRVZfVU5MSU5LJDEpIHtcbiAgICBjb25zdCBpc0RpcmVjdG9yeSA9IGluZm8udHlwZSA9PT0gRlNFVkVOVF9UWVBFX0RJUkVDVE9SWTtcbiAgICAvLyBzdXBwcmVzcyB1bmxpbmsgZXZlbnRzIG9uIG5ldmVyIGJlZm9yZSBzZWVuIGZpbGVzXG4gICAgaWYgKGlzRGlyZWN0b3J5IHx8IHdhdGNoZWREaXIuaGFzKGl0ZW0pKSB7XG4gICAgICB0aGlzLmZzdy5fcmVtb3ZlKHBhcmVudCwgaXRlbSwgaXNEaXJlY3RvcnkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZXZlbnQgPT09IEVWX0FERCQxKSB7XG4gICAgICAvLyB0cmFjayBuZXcgZGlyZWN0b3JpZXNcbiAgICAgIGlmIChpbmZvLnR5cGUgPT09IEZTRVZFTlRfVFlQRV9ESVJFQ1RPUlkpIHRoaXMuZnN3Ll9nZXRXYXRjaGVkRGlyKHBhdGgpO1xuXG4gICAgICBpZiAoaW5mby50eXBlID09PSBGU0VWRU5UX1RZUEVfU1lNTElOSyAmJiBvcHRzLmZvbGxvd1N5bWxpbmtzKSB7XG4gICAgICAgIC8vIHB1c2ggc3ltbGlua3MgYmFjayB0byB0aGUgdG9wIG9mIHRoZSBzdGFjayB0byBnZXQgaGFuZGxlZFxuICAgICAgICBjb25zdCBjdXJEZXB0aCA9IG9wdHMuZGVwdGggPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgdW5kZWZpbmVkIDogY2FsY0RlcHRoKGZ1bGxQYXRoLCByZWFsUGF0aCkgKyAxO1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkVG9Gc0V2ZW50cyhwYXRoLCBmYWxzZSwgdHJ1ZSwgY3VyRGVwdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyB0cmFjayBuZXcgcGF0aHNcbiAgICAgIC8vIChvdGhlciB0aGFuIHN5bWxpbmtzIGJlaW5nIGZvbGxvd2VkLCB3aGljaCB3aWxsIGJlIHRyYWNrZWQgc29vbilcbiAgICAgIHRoaXMuZnN3Ll9nZXRXYXRjaGVkRGlyKHBhcmVudCkuYWRkKGl0ZW0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7J2FkZCd8J2FkZERpcid8J3VubGluayd8J3VubGlua0Rpcid9XG4gICAgICovXG4gICAgY29uc3QgZXZlbnROYW1lID0gaW5mby50eXBlID09PSBGU0VWRU5UX1RZUEVfRElSRUNUT1JZID8gZXZlbnQgKyBESVJfU1VGRklYIDogZXZlbnQ7XG4gICAgdGhpcy5mc3cuX2VtaXQoZXZlbnROYW1lLCBwYXRoKTtcbiAgICBpZiAoZXZlbnROYW1lID09PSBFVl9BRERfRElSJDEpIHRoaXMuX2FkZFRvRnNFdmVudHMocGF0aCwgZmFsc2UsIHRydWUpO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlIHN5bWxpbmtzIGVuY291bnRlcmVkIGR1cmluZyBkaXJlY3Rvcnkgc2NhblxuICogQHBhcmFtIHtTdHJpbmd9IHdhdGNoUGF0aCAgLSBmaWxlL2RpciBwYXRoIHRvIGJlIHdhdGNoZWQgd2l0aCBmc2V2ZW50c1xuICogQHBhcmFtIHtTdHJpbmd9IHJlYWxQYXRoICAgLSByZWFsIHBhdGggKGluIGNhc2Ugb2Ygc3ltbGlua3MpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gIC0gcGF0aCB0cmFuc2Zvcm1lclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZ2xvYkZpbHRlciAtIHBhdGggZmlsdGVyIGluIGNhc2UgYSBnbG9iIHBhdHRlcm4gd2FzIHByb3ZpZGVkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGNsb3NlciBmb3IgdGhlIHdhdGNoZXIgaW5zdGFuY2VcbiovXG5fd2F0Y2hXaXRoRnNFdmVudHMod2F0Y2hQYXRoLCByZWFsUGF0aCwgdHJhbnNmb3JtLCBnbG9iRmlsdGVyKSB7XG4gIGlmICh0aGlzLmZzdy5jbG9zZWQgfHwgdGhpcy5mc3cuX2lzSWdub3JlZCh3YXRjaFBhdGgpKSByZXR1cm47XG4gIGNvbnN0IG9wdHMgPSB0aGlzLmZzdy5vcHRpb25zO1xuICBjb25zdCB3YXRjaENhbGxiYWNrID0gYXN5bmMgKGZ1bGxQYXRoLCBmbGFncywgaW5mbykgPT4ge1xuICAgIGlmICh0aGlzLmZzdy5jbG9zZWQpIHJldHVybjtcbiAgICBpZiAoXG4gICAgICBvcHRzLmRlcHRoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGNhbGNEZXB0aChmdWxsUGF0aCwgcmVhbFBhdGgpID4gb3B0cy5kZXB0aFxuICAgICkgcmV0dXJuO1xuICAgIGNvbnN0IHBhdGggPSB0cmFuc2Zvcm0oc3lzUGF0aCQxLmpvaW4oXG4gICAgICB3YXRjaFBhdGgsIHN5c1BhdGgkMS5yZWxhdGl2ZSh3YXRjaFBhdGgsIGZ1bGxQYXRoKVxuICAgICkpO1xuICAgIGlmIChnbG9iRmlsdGVyICYmICFnbG9iRmlsdGVyKHBhdGgpKSByZXR1cm47XG4gICAgLy8gZW5zdXJlIGRpcmVjdG9yaWVzIGFyZSB0cmFja2VkXG4gICAgY29uc3QgcGFyZW50ID0gc3lzUGF0aCQxLmRpcm5hbWUocGF0aCk7XG4gICAgY29uc3QgaXRlbSA9IHN5c1BhdGgkMS5iYXNlbmFtZShwYXRoKTtcbiAgICBjb25zdCB3YXRjaGVkRGlyID0gdGhpcy5mc3cuX2dldFdhdGNoZWREaXIoXG4gICAgICBpbmZvLnR5cGUgPT09IEZTRVZFTlRfVFlQRV9ESVJFQ1RPUlkgPyBwYXRoIDogcGFyZW50XG4gICAgKTtcblxuICAgIC8vIGNvcnJlY3QgZm9yIHdyb25nIGV2ZW50cyBlbWl0dGVkXG4gICAgaWYgKHdyb25nRXZlbnRGbGFncy5oYXMoZmxhZ3MpIHx8IGluZm8uZXZlbnQgPT09IEZTRVZFTlRfVU5LTk9XTikge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLmlnbm9yZWQgPT09IEZVTkNUSU9OX1RZUEUkMSkge1xuICAgICAgICBsZXQgc3RhdHM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RhdHMgPSBhd2FpdCBzdGF0JDEocGF0aCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgICBpZiAodGhpcy5mc3cuY2xvc2VkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNoZWNrSWdub3JlZChwYXRoLCBzdGF0cykpIHJldHVybjtcbiAgICAgICAgaWYgKHNhbWVUeXBlcyhpbmZvLCBzdGF0cykpIHtcbiAgICAgICAgICB0aGlzLmFkZE9yQ2hhbmdlKHBhdGgsIGZ1bGxQYXRoLCByZWFsUGF0aCwgcGFyZW50LCB3YXRjaGVkRGlyLCBpdGVtLCBpbmZvLCBvcHRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUV2ZW50KEVWX1VOTElOSyQxLCBwYXRoLCBmdWxsUGF0aCwgcmVhbFBhdGgsIHBhcmVudCwgd2F0Y2hlZERpciwgaXRlbSwgaW5mbywgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hlY2tFeGlzdHMocGF0aCwgZnVsbFBhdGgsIHJlYWxQYXRoLCBwYXJlbnQsIHdhdGNoZWREaXIsIGl0ZW0sIGluZm8sIG9wdHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGluZm8uZXZlbnQpIHtcbiAgICAgIGNhc2UgRlNFVkVOVF9DUkVBVEVEOlxuICAgICAgY2FzZSBGU0VWRU5UX01PRElGSUVEOlxuICAgICAgICByZXR1cm4gdGhpcy5hZGRPckNoYW5nZShwYXRoLCBmdWxsUGF0aCwgcmVhbFBhdGgsIHBhcmVudCwgd2F0Y2hlZERpciwgaXRlbSwgaW5mbywgb3B0cyk7XG4gICAgICBjYXNlIEZTRVZFTlRfREVMRVRFRDpcbiAgICAgIGNhc2UgRlNFVkVOVF9NT1ZFRDpcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tFeGlzdHMocGF0aCwgZnVsbFBhdGgsIHJlYWxQYXRoLCBwYXJlbnQsIHdhdGNoZWREaXIsIGl0ZW0sIGluZm8sIG9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBjbG9zZXIgPSBzZXRGU0V2ZW50c0xpc3RlbmVyKFxuICAgIHdhdGNoUGF0aCxcbiAgICByZWFsUGF0aCxcbiAgICB3YXRjaENhbGxiYWNrLFxuICAgIHRoaXMuZnN3Ll9lbWl0UmF3XG4gICk7XG5cbiAgdGhpcy5mc3cuX2VtaXRSZWFkeSgpO1xuICByZXR1cm4gY2xvc2VyO1xufVxuXG4vKipcbiAqIEhhbmRsZSBzeW1saW5rcyBlbmNvdW50ZXJlZCBkdXJpbmcgZGlyZWN0b3J5IHNjYW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBsaW5rUGF0aCBwYXRoIHRvIHN5bWxpbmtcbiAqIEBwYXJhbSB7U3RyaW5nfSBmdWxsUGF0aCBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBzeW1saW5rXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gcHJlLWV4aXN0aW5nIHBhdGggdHJhbnNmb3JtZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjdXJEZXB0aCBsZXZlbCBvZiBzdWJkaXJlY3RvcmllcyB0cmF2ZXJzZWQgdG8gd2hlcmUgc3ltbGluayBpc1xuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmFzeW5jIF9oYW5kbGVGc0V2ZW50c1N5bWxpbmsobGlua1BhdGgsIGZ1bGxQYXRoLCB0cmFuc2Zvcm0sIGN1ckRlcHRoKSB7XG4gIC8vIGRvbid0IGZvbGxvdyB0aGUgc2FtZSBzeW1saW5rIG1vcmUgdGhhbiBvbmNlXG4gIGlmICh0aGlzLmZzdy5jbG9zZWQgfHwgdGhpcy5mc3cuX3N5bWxpbmtQYXRocy5oYXMoZnVsbFBhdGgpKSByZXR1cm47XG5cbiAgdGhpcy5mc3cuX3N5bWxpbmtQYXRocy5zZXQoZnVsbFBhdGgsIHRydWUpO1xuICB0aGlzLmZzdy5faW5jclJlYWR5Q291bnQoKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGxpbmtUYXJnZXQgPSBhd2FpdCByZWFscGF0aChsaW5rUGF0aCk7XG4gICAgaWYgKHRoaXMuZnN3LmNsb3NlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmZzdy5faXNJZ25vcmVkKGxpbmtUYXJnZXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5mc3cuX2VtaXRSZWFkeSgpO1xuICAgIH1cblxuICAgIHRoaXMuZnN3Ll9pbmNyUmVhZHlDb3VudCgpO1xuXG4gICAgLy8gYWRkIHRoZSBsaW5rVGFyZ2V0IGZvciB3YXRjaGluZyB3aXRoIGEgd3JhcHBlciBmb3IgdHJhbnNmb3JtXG4gICAgLy8gdGhhdCBjYXVzZXMgZW1pdHRlZCBwYXRocyB0byBpbmNvcnBvcmF0ZSB0aGUgbGluaydzIHBhdGhcbiAgICB0aGlzLl9hZGRUb0ZzRXZlbnRzKGxpbmtUYXJnZXQgfHwgbGlua1BhdGgsIChwYXRoKSA9PiB7XG4gICAgICBsZXQgYWxpYXNlZFBhdGggPSBsaW5rUGF0aDtcbiAgICAgIGlmIChsaW5rVGFyZ2V0ICYmIGxpbmtUYXJnZXQgIT09IERPVF9TTEFTSCkge1xuICAgICAgICBhbGlhc2VkUGF0aCA9IHBhdGgucmVwbGFjZShsaW5rVGFyZ2V0LCBsaW5rUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKHBhdGggIT09IERPVF9TTEFTSCkge1xuICAgICAgICBhbGlhc2VkUGF0aCA9IHN5c1BhdGgkMS5qb2luKGxpbmtQYXRoLCBwYXRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cmFuc2Zvcm0oYWxpYXNlZFBhdGgpO1xuICAgIH0sIGZhbHNlLCBjdXJEZXB0aCk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBpZiAodGhpcy5mc3cuX2hhbmRsZUVycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZnN3Ll9lbWl0UmVhZHkoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtQYXRofSBuZXdQYXRoXG4gKiBAcGFyYW0ge2ZzLlN0YXRzfSBzdGF0c1xuICovXG5lbWl0QWRkKG5ld1BhdGgsIHN0YXRzLCBwcm9jZXNzUGF0aCwgb3B0cywgZm9yY2VBZGQpIHtcbiAgY29uc3QgcHAgPSBwcm9jZXNzUGF0aChuZXdQYXRoKTtcbiAgY29uc3QgaXNEaXIgPSBzdGF0cy5pc0RpcmVjdG9yeSgpO1xuICBjb25zdCBkaXJPYmogPSB0aGlzLmZzdy5fZ2V0V2F0Y2hlZERpcihzeXNQYXRoJDEuZGlybmFtZShwcCkpO1xuICBjb25zdCBiYXNlID0gc3lzUGF0aCQxLmJhc2VuYW1lKHBwKTtcblxuICAvLyBlbnN1cmUgZW1wdHkgZGlycyBnZXQgdHJhY2tlZFxuICBpZiAoaXNEaXIpIHRoaXMuZnN3Ll9nZXRXYXRjaGVkRGlyKHBwKTtcbiAgaWYgKGRpck9iai5oYXMoYmFzZSkpIHJldHVybjtcbiAgZGlyT2JqLmFkZChiYXNlKTtcblxuICBpZiAoIW9wdHMuaWdub3JlSW5pdGlhbCB8fCBmb3JjZUFkZCA9PT0gdHJ1ZSkge1xuICAgIHRoaXMuZnN3Ll9lbWl0KGlzRGlyID8gRVZfQUREX0RJUiQxIDogRVZfQUREJDEsIHBwLCBzdGF0cyk7XG4gIH1cbn1cblxuaW5pdFdhdGNoKHJlYWxQYXRoLCBwYXRoLCB3aCwgcHJvY2Vzc1BhdGgpIHtcbiAgaWYgKHRoaXMuZnN3LmNsb3NlZCkgcmV0dXJuO1xuICBjb25zdCBjbG9zZXIgPSB0aGlzLl93YXRjaFdpdGhGc0V2ZW50cyhcbiAgICB3aC53YXRjaFBhdGgsXG4gICAgc3lzUGF0aCQxLnJlc29sdmUocmVhbFBhdGggfHwgd2gud2F0Y2hQYXRoKSxcbiAgICBwcm9jZXNzUGF0aCxcbiAgICB3aC5nbG9iRmlsdGVyXG4gICk7XG4gIHRoaXMuZnN3Ll9hZGRQYXRoQ2xvc2VyKHBhdGgsIGNsb3Nlcik7XG59XG5cbi8qKlxuICogSGFuZGxlIGFkZGVkIHBhdGggd2l0aCBmc2V2ZW50c1xuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggZmlsZS9kaXIgcGF0aCBvciBnbG9iIHBhdHRlcm5cbiAqIEBwYXJhbSB7RnVuY3Rpb258Qm9vbGVhbj19IHRyYW5zZm9ybSBjb252ZXJ0cyB3b3JraW5nIHBhdGggdG8gd2hhdCB0aGUgdXNlciBleHBlY3RzXG4gKiBAcGFyYW0ge0Jvb2xlYW49fSBmb3JjZUFkZCBlbnN1cmUgYWRkIGlzIGVtaXR0ZWRcbiAqIEBwYXJhbSB7TnVtYmVyPX0gcHJpb3JEZXB0aCBMZXZlbCBvZiBzdWJkaXJlY3RvcmllcyBhbHJlYWR5IHRyYXZlcnNlZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5hc3luYyBfYWRkVG9Gc0V2ZW50cyhwYXRoLCB0cmFuc2Zvcm0sIGZvcmNlQWRkLCBwcmlvckRlcHRoKSB7XG4gIGlmICh0aGlzLmZzdy5jbG9zZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb3B0cyA9IHRoaXMuZnN3Lm9wdGlvbnM7XG4gIGNvbnN0IHByb2Nlc3NQYXRoID0gdHlwZW9mIHRyYW5zZm9ybSA9PT0gRlVOQ1RJT05fVFlQRSQxID8gdHJhbnNmb3JtIDogSURFTlRJVFlfRk47XG5cbiAgY29uc3Qgd2ggPSB0aGlzLmZzdy5fZ2V0V2F0Y2hIZWxwZXJzKHBhdGgpO1xuXG4gIC8vIGV2YWx1YXRlIHdoYXQgaXMgYXQgdGhlIHBhdGggd2UncmUgYmVpbmcgYXNrZWQgdG8gd2F0Y2hcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXRNZXRob2RzW3doLnN0YXRNZXRob2RdKHdoLndhdGNoUGF0aCk7XG4gICAgaWYgKHRoaXMuZnN3LmNsb3NlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmZzdy5faXNJZ25vcmVkKHdoLndhdGNoUGF0aCwgc3RhdHMpKSB7XG4gICAgICB0aHJvdyBudWxsO1xuICAgIH1cbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgLy8gZW1pdCBhZGREaXIgdW5sZXNzIHRoaXMgaXMgYSBnbG9iIHBhcmVudFxuICAgICAgaWYgKCF3aC5nbG9iRmlsdGVyKSB0aGlzLmVtaXRBZGQocHJvY2Vzc1BhdGgocGF0aCksIHN0YXRzLCBwcm9jZXNzUGF0aCwgb3B0cywgZm9yY2VBZGQpO1xuXG4gICAgICAvLyBkb24ndCByZWN1cnNlIGZ1cnRoZXIgaWYgaXQgd291bGQgZXhjZWVkIGRlcHRoIHNldHRpbmdcbiAgICAgIGlmIChwcmlvckRlcHRoICYmIHByaW9yRGVwdGggPiBvcHRzLmRlcHRoKSByZXR1cm47XG5cbiAgICAgIC8vIHNjYW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJcbiAgICAgIHRoaXMuZnN3Ll9yZWFkZGlycCh3aC53YXRjaFBhdGgsIHtcbiAgICAgICAgZmlsZUZpbHRlcjogZW50cnkgPT4gd2guZmlsdGVyUGF0aChlbnRyeSksXG4gICAgICAgIGRpcmVjdG9yeUZpbHRlcjogZW50cnkgPT4gd2guZmlsdGVyRGlyKGVudHJ5KSxcbiAgICAgICAgLi4uRGVwdGgob3B0cy5kZXB0aCAtIChwcmlvckRlcHRoIHx8IDApKVxuICAgICAgfSkub24oU1RSX0RBVEEsIChlbnRyeSkgPT4ge1xuICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIGZpbHRlclBhdGggb24gZGlycyBiL2MgZmlsdGVyRGlyIGlzIGxlc3MgcmVzdHJpY3RpdmVcbiAgICAgICAgaWYgKHRoaXMuZnN3LmNsb3NlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuc3RhdHMuaXNEaXJlY3RvcnkoKSAmJiAhd2guZmlsdGVyUGF0aChlbnRyeSkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBqb2luZWRQYXRoID0gc3lzUGF0aCQxLmpvaW4od2gud2F0Y2hQYXRoLCBlbnRyeS5wYXRoKTtcbiAgICAgICAgY29uc3Qge2Z1bGxQYXRofSA9IGVudHJ5O1xuXG4gICAgICAgIGlmICh3aC5mb2xsb3dTeW1saW5rcyAmJiBlbnRyeS5zdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgLy8gcHJlc2VydmUgdGhlIGN1cnJlbnQgZGVwdGggaGVyZSBzaW5jZSBpdCBjYW4ndCBiZSBkZXJpdmVkIGZyb21cbiAgICAgICAgICAvLyByZWFsIHBhdGhzIHBhc3QgdGhlIHN5bWxpbmtcbiAgICAgICAgICBjb25zdCBjdXJEZXB0aCA9IG9wdHMuZGVwdGggPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB1bmRlZmluZWQgOiBjYWxjRGVwdGgoam9pbmVkUGF0aCwgc3lzUGF0aCQxLnJlc29sdmUod2gud2F0Y2hQYXRoKSkgKyAxO1xuXG4gICAgICAgICAgdGhpcy5faGFuZGxlRnNFdmVudHNTeW1saW5rKGpvaW5lZFBhdGgsIGZ1bGxQYXRoLCBwcm9jZXNzUGF0aCwgY3VyRGVwdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZW1pdEFkZChqb2luZWRQYXRoLCBlbnRyeS5zdGF0cywgcHJvY2Vzc1BhdGgsIG9wdHMsIGZvcmNlQWRkKTtcbiAgICAgICAgfVxuICAgICAgfSkub24oRVZfRVJST1IkMSwgRU1QVFlfRk4kMSkub24oU1RSX0VORCQxLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZnN3Ll9lbWl0UmVhZHkoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXRBZGQod2gud2F0Y2hQYXRoLCBzdGF0cywgcHJvY2Vzc1BhdGgsIG9wdHMsIGZvcmNlQWRkKTtcbiAgICAgIHRoaXMuZnN3Ll9lbWl0UmVhZHkoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFlcnJvciB8fCB0aGlzLmZzdy5faGFuZGxlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAvLyBUT0RPOiBTdHJhbmdlIHRoaW5nOiBcInNob3VsZCBub3QgY2hva2Ugb24gYW4gaWdub3JlZCB3YXRjaCBwYXRoXCIgd2lsbCBiZSBmYWlsZWQgd2l0aG91dCAyIHJlYWR5IGNhbGxzIC1fXy1cbiAgICAgIHRoaXMuZnN3Ll9lbWl0UmVhZHkoKTtcbiAgICAgIHRoaXMuZnN3Ll9lbWl0UmVhZHkoKTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5wZXJzaXN0ZW50ICYmIGZvcmNlQWRkICE9PSB0cnVlKSB7XG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09IEZVTkNUSU9OX1RZUEUkMSkge1xuICAgICAgLy8gcmVhbHBhdGggaGFzIGFscmVhZHkgYmVlbiByZXNvbHZlZFxuICAgICAgdGhpcy5pbml0V2F0Y2godW5kZWZpbmVkLCBwYXRoLCB3aCwgcHJvY2Vzc1BhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcmVhbFBhdGg7XG4gICAgICB0cnkge1xuICAgICAgICByZWFsUGF0aCA9IGF3YWl0IHJlYWxwYXRoKHdoLndhdGNoUGF0aCk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgdGhpcy5pbml0V2F0Y2gocmVhbFBhdGgsIHBhdGgsIHdoLCBwcm9jZXNzUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbn07XG5cbmZzZXZlbnRzSGFuZGxlci5leHBvcnRzID0gRnNFdmVudHNIYW5kbGVyJDE7XG5mc2V2ZW50c0hhbmRsZXJFeHBvcnRzLmNhblVzZSA9IGNhblVzZTtcblxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlciQyIH0gPSByZXF1aXJlJCQwJDU7XG5jb25zdCBmcyQ1ID0gcmVxdWlyZSQkMF9fZGVmYXVsdDtcbmNvbnN0IHN5c1BhdGggPSByZXF1aXJlJCQwJDQ7XG5jb25zdCB7IHByb21pc2lmeSB9ID0gcmVxdWlyZSQkMCQ2O1xuY29uc3QgcmVhZGRpcnAgPSByZWFkZGlycF8xO1xuY29uc3QgYW55bWF0Y2ggPSBhbnltYXRjaEV4cG9ydHMuZGVmYXVsdDtcbmNvbnN0IGdsb2JQYXJlbnQgPSBnbG9iUGFyZW50JDI7XG5jb25zdCBpc0dsb2IgPSBpc0dsb2IkMjtcbmNvbnN0IGJyYWNlcyA9IGJyYWNlc18xO1xuY29uc3Qgbm9ybWFsaXplUGF0aCA9IG5vcm1hbGl6ZVBhdGgkMjtcblxuY29uc3QgTm9kZUZzSGFuZGxlciA9IG5vZGVmc0hhbmRsZXI7XG5jb25zdCBGc0V2ZW50c0hhbmRsZXIgPSBmc2V2ZW50c0hhbmRsZXJFeHBvcnRzO1xuY29uc3Qge1xuICBFVl9BTEwsXG4gIEVWX1JFQURZLFxuICBFVl9BREQsXG4gIEVWX0NIQU5HRSxcbiAgRVZfVU5MSU5LLFxuICBFVl9BRERfRElSLFxuICBFVl9VTkxJTktfRElSLFxuICBFVl9SQVcsXG4gIEVWX0VSUk9SLFxuXG4gIFNUUl9DTE9TRSxcbiAgU1RSX0VORCxcblxuICBCQUNLX1NMQVNIX1JFLFxuICBET1VCTEVfU0xBU0hfUkUsXG4gIFNMQVNIX09SX0JBQ0tfU0xBU0hfUkUsXG4gIERPVF9SRSxcbiAgUkVQTEFDRVJfUkUsXG5cbiAgU0xBU0gsXG4gIFNMQVNIX1NMQVNILFxuICBCUkFDRV9TVEFSVCxcbiAgQkFORyxcbiAgT05FX0RPVCxcbiAgVFdPX0RPVFMsXG4gIEdMT0JTVEFSLFxuICBTTEFTSF9HTE9CU1RBUixcbiAgQU5ZTUFUQ0hfT1BUUyxcbiAgU1RSSU5HX1RZUEUsXG4gIEZVTkNUSU9OX1RZUEUsXG4gIEVNUFRZX1NUUixcbiAgRU1QVFlfRk4sXG5cbiAgaXNXaW5kb3dzOiBpc1dpbmRvd3MkMSxcbiAgaXNNYWNvcyxcbiAgaXNJQk1pXG59ID0gY29uc3RhbnRzJDE7XG5cbmNvbnN0IHN0YXQgPSBwcm9taXNpZnkoZnMkNS5zdGF0KTtcbmNvbnN0IHJlYWRkaXIgPSBwcm9taXNpZnkoZnMkNS5yZWFkZGlyKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7U3RyaW5nfSBQYXRoXG4gKiBAdHlwZWRlZiB7J2FsbCd8J2FkZCd8J2FkZERpcid8J2NoYW5nZSd8J3VubGluayd8J3VubGlua0Rpcid8J3Jhdyd8J2Vycm9yJ3wncmVhZHknfSBFdmVudE5hbWVcbiAqIEB0eXBlZGVmIHsncmVhZGRpcid8J3dhdGNoJ3wnYWRkJ3wncmVtb3ZlJ3wnY2hhbmdlJ30gVGhyb3R0bGVUeXBlXG4gKi9cblxuLyoqXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gV2F0Y2hIZWxwZXJzXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGZvbGxvd1N5bWxpbmtzXG4gKiBAcHJvcGVydHkgeydzdGF0J3wnbHN0YXQnfSBzdGF0TWV0aG9kXG4gKiBAcHJvcGVydHkge1BhdGh9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7UGF0aH0gd2F0Y2hQYXRoXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBlbnRyeVBhdGhcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaGFzR2xvYlxuICogQHByb3BlcnR5IHtPYmplY3R9IGdsb2JGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGZpbHRlclBhdGhcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGZpbHRlckRpclxuICovXG5cbmNvbnN0IGFycmlmeSA9ICh2YWx1ZSA9IFtdKSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbmNvbnN0IGZsYXR0ZW4gPSAobGlzdCwgcmVzdWx0ID0gW10pID0+IHtcbiAgbGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBmbGF0dGVuKGl0ZW0sIHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB1bmlmeVBhdGhzID0gKHBhdGhzXykgPT4ge1xuICAvKipcbiAgICogQHR5cGUge0FycmF5PFN0cmluZz59XG4gICAqL1xuICBjb25zdCBwYXRocyA9IGZsYXR0ZW4oYXJyaWZ5KHBhdGhzXykpO1xuICBpZiAoIXBhdGhzLmV2ZXJ5KHAgPT4gdHlwZW9mIHAgPT09IFNUUklOR19UWVBFKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vbi1zdHJpbmcgcHJvdmlkZWQgYXMgd2F0Y2ggcGF0aDogJHtwYXRoc31gKTtcbiAgfVxuICByZXR1cm4gcGF0aHMubWFwKG5vcm1hbGl6ZVBhdGhUb1VuaXgpO1xufTtcblxuLy8gSWYgU0xBU0hfU0xBU0ggb2NjdXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgcGF0aCwgaXQgaXMgbm90IHJlcGxhY2VkXG4vLyAgICAgYmVjYXVzZSBcIi8vU3RvcmFnZVBDL0RyaXZlUG9vbC9Nb3ZpZXNcIiBpcyBhIHZhbGlkIG5ldHdvcmsgcGF0aFxuY29uc3QgdG9Vbml4ID0gKHN0cmluZykgPT4ge1xuICBsZXQgc3RyID0gc3RyaW5nLnJlcGxhY2UoQkFDS19TTEFTSF9SRSwgU0xBU0gpO1xuICBsZXQgcHJlcGVuZCA9IGZhbHNlO1xuICBpZiAoc3RyLnN0YXJ0c1dpdGgoU0xBU0hfU0xBU0gpKSB7XG4gICAgcHJlcGVuZCA9IHRydWU7XG4gIH1cbiAgd2hpbGUgKHN0ci5tYXRjaChET1VCTEVfU0xBU0hfUkUpKSB7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoRE9VQkxFX1NMQVNIX1JFLCBTTEFTSCk7XG4gIH1cbiAgaWYgKHByZXBlbmQpIHtcbiAgICBzdHIgPSBTTEFTSCArIHN0cjtcbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuLy8gT3VyIHZlcnNpb24gb2YgdXBhdGgubm9ybWFsaXplXG4vLyBUT0RPOiB0aGlzIGlzIG5vdCBlcXVhbCB0byBwYXRoLW5vcm1hbGl6ZSBtb2R1bGUgLSBpbnZlc3RpZ2F0ZSB3aHlcbmNvbnN0IG5vcm1hbGl6ZVBhdGhUb1VuaXggPSAocGF0aCkgPT4gdG9Vbml4KHN5c1BhdGgubm9ybWFsaXplKHRvVW5peChwYXRoKSkpO1xuXG5jb25zdCBub3JtYWxpemVJZ25vcmVkID0gKGN3ZCA9IEVNUFRZX1NUUikgPT4gKHBhdGgpID0+IHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSBTVFJJTkdfVFlQRSkgcmV0dXJuIHBhdGg7XG4gIHJldHVybiBub3JtYWxpemVQYXRoVG9Vbml4KHN5c1BhdGguaXNBYnNvbHV0ZShwYXRoKSA/IHBhdGggOiBzeXNQYXRoLmpvaW4oY3dkLCBwYXRoKSk7XG59O1xuXG5jb25zdCBnZXRBYnNvbHV0ZVBhdGggPSAocGF0aCwgY3dkKSA9PiB7XG4gIGlmIChzeXNQYXRoLmlzQWJzb2x1dGUocGF0aCkpIHtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuICBpZiAocGF0aC5zdGFydHNXaXRoKEJBTkcpKSB7XG4gICAgcmV0dXJuIEJBTkcgKyBzeXNQYXRoLmpvaW4oY3dkLCBwYXRoLnNsaWNlKDEpKTtcbiAgfVxuICByZXR1cm4gc3lzUGF0aC5qb2luKGN3ZCwgcGF0aCk7XG59O1xuXG5jb25zdCB1bmRlZiA9IChvcHRzLCBrZXkpID0+IG9wdHNba2V5XSA9PT0gdW5kZWZpbmVkO1xuXG4vKipcbiAqIERpcmVjdG9yeSBlbnRyeS5cbiAqIEBwcm9wZXJ0eSB7UGF0aH0gcGF0aFxuICogQHByb3BlcnR5IHtTZXQ8UGF0aD59IGl0ZW1zXG4gKi9cbmNsYXNzIERpckVudHJ5IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7UGF0aH0gZGlyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlbW92ZVdhdGNoZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKGRpciwgcmVtb3ZlV2F0Y2hlcikge1xuICAgIHRoaXMucGF0aCA9IGRpcjtcbiAgICB0aGlzLl9yZW1vdmVXYXRjaGVyID0gcmVtb3ZlV2F0Y2hlcjtcbiAgICAvKiogQHR5cGUge1NldDxQYXRoPn0gKi9cbiAgICB0aGlzLml0ZW1zID0gbmV3IFNldCgpO1xuICB9XG5cbiAgYWRkKGl0ZW0pIHtcbiAgICBjb25zdCB7aXRlbXN9ID0gdGhpcztcbiAgICBpZiAoIWl0ZW1zKSByZXR1cm47XG4gICAgaWYgKGl0ZW0gIT09IE9ORV9ET1QgJiYgaXRlbSAhPT0gVFdPX0RPVFMpIGl0ZW1zLmFkZChpdGVtKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZShpdGVtKSB7XG4gICAgY29uc3Qge2l0ZW1zfSA9IHRoaXM7XG4gICAgaWYgKCFpdGVtcykgcmV0dXJuO1xuICAgIGl0ZW1zLmRlbGV0ZShpdGVtKTtcbiAgICBpZiAoaXRlbXMuc2l6ZSA+IDApIHJldHVybjtcblxuICAgIGNvbnN0IGRpciA9IHRoaXMucGF0aDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVhZGRpcihkaXIpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHRoaXMuX3JlbW92ZVdhdGNoZXIpIHtcbiAgICAgICAgdGhpcy5fcmVtb3ZlV2F0Y2hlcihzeXNQYXRoLmRpcm5hbWUoZGlyKSwgc3lzUGF0aC5iYXNlbmFtZShkaXIpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYXMoaXRlbSkge1xuICAgIGNvbnN0IHtpdGVtc30gPSB0aGlzO1xuICAgIGlmICghaXRlbXMpIHJldHVybjtcbiAgICByZXR1cm4gaXRlbXMuaGFzKGl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fVxuICAgKi9cbiAgZ2V0Q2hpbGRyZW4oKSB7XG4gICAgY29uc3Qge2l0ZW1zfSA9IHRoaXM7XG4gICAgaWYgKCFpdGVtcykgcmV0dXJuO1xuICAgIHJldHVybiBbLi4uaXRlbXMudmFsdWVzKCldO1xuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLml0ZW1zLmNsZWFyKCk7XG4gICAgZGVsZXRlIHRoaXMucGF0aDtcbiAgICBkZWxldGUgdGhpcy5fcmVtb3ZlV2F0Y2hlcjtcbiAgICBkZWxldGUgdGhpcy5pdGVtcztcbiAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuICB9XG59XG5cbmNvbnN0IFNUQVRfTUVUSE9EX0YgPSAnc3RhdCc7XG5jb25zdCBTVEFUX01FVEhPRF9MID0gJ2xzdGF0JztcbmNsYXNzIFdhdGNoSGVscGVyIHtcbiAgY29uc3RydWN0b3IocGF0aCwgd2F0Y2hQYXRoLCBmb2xsb3csIGZzdykge1xuICAgIHRoaXMuZnN3ID0gZnN3O1xuICAgIHRoaXMucGF0aCA9IHBhdGggPSBwYXRoLnJlcGxhY2UoUkVQTEFDRVJfUkUsIEVNUFRZX1NUUik7XG4gICAgdGhpcy53YXRjaFBhdGggPSB3YXRjaFBhdGg7XG4gICAgdGhpcy5mdWxsV2F0Y2hQYXRoID0gc3lzUGF0aC5yZXNvbHZlKHdhdGNoUGF0aCk7XG4gICAgdGhpcy5oYXNHbG9iID0gd2F0Y2hQYXRoICE9PSBwYXRoO1xuICAgIC8qKiBAdHlwZSB7b2JqZWN0fGJvb2xlYW59ICovXG4gICAgaWYgKHBhdGggPT09IEVNUFRZX1NUUikgdGhpcy5oYXNHbG9iID0gZmFsc2U7XG4gICAgdGhpcy5nbG9iU3ltbGluayA9IHRoaXMuaGFzR2xvYiAmJiBmb2xsb3cgPyB1bmRlZmluZWQgOiBmYWxzZTtcbiAgICB0aGlzLmdsb2JGaWx0ZXIgPSB0aGlzLmhhc0dsb2IgPyBhbnltYXRjaChwYXRoLCB1bmRlZmluZWQsIEFOWU1BVENIX09QVFMpIDogZmFsc2U7XG4gICAgdGhpcy5kaXJQYXJ0cyA9IHRoaXMuZ2V0RGlyUGFydHMocGF0aCk7XG4gICAgdGhpcy5kaXJQYXJ0cy5mb3JFYWNoKChwYXJ0cykgPT4ge1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHBhcnRzLnBvcCgpO1xuICAgIH0pO1xuICAgIHRoaXMuZm9sbG93U3ltbGlua3MgPSBmb2xsb3c7XG4gICAgdGhpcy5zdGF0TWV0aG9kID0gZm9sbG93ID8gU1RBVF9NRVRIT0RfRiA6IFNUQVRfTUVUSE9EX0w7XG4gIH1cblxuICBjaGVja0dsb2JTeW1saW5rKGVudHJ5KSB7XG4gICAgLy8gb25seSBuZWVkIHRvIHJlc29sdmUgb25jZVxuICAgIC8vIGZpcnN0IGVudHJ5IHNob3VsZCBhbHdheXMgaGF2ZSBlbnRyeS5wYXJlbnREaXIgPT09IEVNUFRZX1NUUlxuICAgIGlmICh0aGlzLmdsb2JTeW1saW5rID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZ2xvYlN5bWxpbmsgPSBlbnRyeS5mdWxsUGFyZW50RGlyID09PSB0aGlzLmZ1bGxXYXRjaFBhdGggP1xuICAgICAgICBmYWxzZSA6IHtyZWFsUGF0aDogZW50cnkuZnVsbFBhcmVudERpciwgbGlua1BhdGg6IHRoaXMuZnVsbFdhdGNoUGF0aH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2xvYlN5bWxpbmspIHtcbiAgICAgIHJldHVybiBlbnRyeS5mdWxsUGF0aC5yZXBsYWNlKHRoaXMuZ2xvYlN5bWxpbmsucmVhbFBhdGgsIHRoaXMuZ2xvYlN5bWxpbmsubGlua1BhdGgpO1xuICAgIH1cblxuICAgIHJldHVybiBlbnRyeS5mdWxsUGF0aDtcbiAgfVxuXG4gIGVudHJ5UGF0aChlbnRyeSkge1xuICAgIHJldHVybiBzeXNQYXRoLmpvaW4odGhpcy53YXRjaFBhdGgsXG4gICAgICBzeXNQYXRoLnJlbGF0aXZlKHRoaXMud2F0Y2hQYXRoLCB0aGlzLmNoZWNrR2xvYlN5bWxpbmsoZW50cnkpKVxuICAgICk7XG4gIH1cblxuICBmaWx0ZXJQYXRoKGVudHJ5KSB7XG4gICAgY29uc3Qge3N0YXRzfSA9IGVudHJ5O1xuICAgIGlmIChzdGF0cyAmJiBzdGF0cy5pc1N5bWJvbGljTGluaygpKSByZXR1cm4gdGhpcy5maWx0ZXJEaXIoZW50cnkpO1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHRoaXMuZW50cnlQYXRoKGVudHJ5KTtcbiAgICBjb25zdCBtYXRjaGVzR2xvYiA9IHRoaXMuaGFzR2xvYiAmJiB0eXBlb2YgdGhpcy5nbG9iRmlsdGVyID09PSBGVU5DVElPTl9UWVBFID9cbiAgICAgIHRoaXMuZ2xvYkZpbHRlcihyZXNvbHZlZFBhdGgpIDogdHJ1ZTtcbiAgICByZXR1cm4gbWF0Y2hlc0dsb2IgJiZcbiAgICAgIHRoaXMuZnN3Ll9pc250SWdub3JlZChyZXNvbHZlZFBhdGgsIHN0YXRzKSAmJlxuICAgICAgdGhpcy5mc3cuX2hhc1JlYWRQZXJtaXNzaW9ucyhzdGF0cyk7XG4gIH1cblxuICBnZXREaXJQYXJ0cyhwYXRoKSB7XG4gICAgaWYgKCF0aGlzLmhhc0dsb2IpIHJldHVybiBbXTtcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgIGNvbnN0IGV4cGFuZGVkUGF0aCA9IHBhdGguaW5jbHVkZXMoQlJBQ0VfU1RBUlQpID8gYnJhY2VzLmV4cGFuZChwYXRoKSA6IFtwYXRoXTtcbiAgICBleHBhbmRlZFBhdGguZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgICAgcGFydHMucHVzaChzeXNQYXRoLnJlbGF0aXZlKHRoaXMud2F0Y2hQYXRoLCBwYXRoKS5zcGxpdChTTEFTSF9PUl9CQUNLX1NMQVNIX1JFKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcnRzO1xuICB9XG5cbiAgZmlsdGVyRGlyKGVudHJ5KSB7XG4gICAgaWYgKHRoaXMuaGFzR2xvYikge1xuICAgICAgY29uc3QgZW50cnlQYXJ0cyA9IHRoaXMuZ2V0RGlyUGFydHModGhpcy5jaGVja0dsb2JTeW1saW5rKGVudHJ5KSk7XG4gICAgICBsZXQgZ2xvYnN0YXIgPSBmYWxzZTtcbiAgICAgIHRoaXMudW5tYXRjaGVkR2xvYiA9ICF0aGlzLmRpclBhcnRzLnNvbWUoKHBhcnRzKSA9PiB7XG4gICAgICAgIHJldHVybiBwYXJ0cy5ldmVyeSgocGFydCwgaSkgPT4ge1xuICAgICAgICAgIGlmIChwYXJ0ID09PSBHTE9CU1RBUikgZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBnbG9ic3RhciB8fCAhZW50cnlQYXJ0c1swXVtpXSB8fCBhbnltYXRjaChwYXJ0LCBlbnRyeVBhcnRzWzBdW2ldLCBBTllNQVRDSF9PUFRTKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLnVubWF0Y2hlZEdsb2IgJiYgdGhpcy5mc3cuX2lzbnRJZ25vcmVkKHRoaXMuZW50cnlQYXRoKGVudHJ5KSwgZW50cnkuc3RhdHMpO1xuICB9XG59XG5cbi8qKlxuICogV2F0Y2hlcyBmaWxlcyAmIGRpcmVjdG9yaWVzIGZvciBjaGFuZ2VzLiBFbWl0dGVkIGV2ZW50czpcbiAqIGBhZGRgLCBgYWRkRGlyYCwgYGNoYW5nZWAsIGB1bmxpbmtgLCBgdW5saW5rRGlyYCwgYGFsbGAsIGBlcnJvcmBcbiAqXG4gKiAgICAgbmV3IEZTV2F0Y2hlcigpXG4gKiAgICAgICAuYWRkKGRpcmVjdG9yaWVzKVxuICogICAgICAgLm9uKCdhZGQnLCBwYXRoID0+IGxvZygnRmlsZScsIHBhdGgsICd3YXMgYWRkZWQnKSlcbiAqL1xuY2xhc3MgRlNXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyJDIge1xuLy8gTm90IGluZGVudGluZyBtZXRob2RzIGZvciBoaXN0b3J5IHNha2U7IGZvciBub3cuXG5jb25zdHJ1Y3Rvcihfb3B0cykge1xuICBzdXBlcigpO1xuXG4gIGNvbnN0IG9wdHMgPSB7fTtcbiAgaWYgKF9vcHRzKSBPYmplY3QuYXNzaWduKG9wdHMsIF9vcHRzKTsgLy8gZm9yIGZyb3plbiBvYmplY3RzXG5cbiAgLyoqIEB0eXBlIHtNYXA8U3RyaW5nLCBEaXJFbnRyeT59ICovXG4gIHRoaXMuX3dhdGNoZWQgPSBuZXcgTWFwKCk7XG4gIC8qKiBAdHlwZSB7TWFwPFN0cmluZywgQXJyYXk+fSAqL1xuICB0aGlzLl9jbG9zZXJzID0gbmV3IE1hcCgpO1xuICAvKiogQHR5cGUge1NldDxTdHJpbmc+fSAqL1xuICB0aGlzLl9pZ25vcmVkUGF0aHMgPSBuZXcgU2V0KCk7XG5cbiAgLyoqIEB0eXBlIHtNYXA8VGhyb3R0bGVUeXBlLCBNYXA+fSAqL1xuICB0aGlzLl90aHJvdHRsZWQgPSBuZXcgTWFwKCk7XG5cbiAgLyoqIEB0eXBlIHtNYXA8UGF0aCwgU3RyaW5nfEJvb2xlYW4+fSAqL1xuICB0aGlzLl9zeW1saW5rUGF0aHMgPSBuZXcgTWFwKCk7XG5cbiAgdGhpcy5fc3RyZWFtcyA9IG5ldyBTZXQoKTtcbiAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcblxuICAvLyBTZXQgdXAgZGVmYXVsdCBvcHRpb25zLlxuICBpZiAodW5kZWYob3B0cywgJ3BlcnNpc3RlbnQnKSkgb3B0cy5wZXJzaXN0ZW50ID0gdHJ1ZTtcbiAgaWYgKHVuZGVmKG9wdHMsICdpZ25vcmVJbml0aWFsJykpIG9wdHMuaWdub3JlSW5pdGlhbCA9IGZhbHNlO1xuICBpZiAodW5kZWYob3B0cywgJ2lnbm9yZVBlcm1pc3Npb25FcnJvcnMnKSkgb3B0cy5pZ25vcmVQZXJtaXNzaW9uRXJyb3JzID0gZmFsc2U7XG4gIGlmICh1bmRlZihvcHRzLCAnaW50ZXJ2YWwnKSkgb3B0cy5pbnRlcnZhbCA9IDEwMDtcbiAgaWYgKHVuZGVmKG9wdHMsICdiaW5hcnlJbnRlcnZhbCcpKSBvcHRzLmJpbmFyeUludGVydmFsID0gMzAwO1xuICBpZiAodW5kZWYob3B0cywgJ2Rpc2FibGVHbG9iYmluZycpKSBvcHRzLmRpc2FibGVHbG9iYmluZyA9IGZhbHNlO1xuICBvcHRzLmVuYWJsZUJpbmFyeUludGVydmFsID0gb3B0cy5iaW5hcnlJbnRlcnZhbCAhPT0gb3B0cy5pbnRlcnZhbDtcblxuICAvLyBFbmFibGUgZnNldmVudHMgb24gT1MgWCB3aGVuIHBvbGxpbmcgaXNuJ3QgZXhwbGljaXRseSBlbmFibGVkLlxuICBpZiAodW5kZWYob3B0cywgJ3VzZUZzRXZlbnRzJykpIG9wdHMudXNlRnNFdmVudHMgPSAhb3B0cy51c2VQb2xsaW5nO1xuXG4gIC8vIElmIHdlIGNhbid0IHVzZSBmc2V2ZW50cywgZW5zdXJlIHRoZSBvcHRpb25zIHJlZmxlY3QgaXQncyBkaXNhYmxlZC5cbiAgY29uc3QgY2FuVXNlRnNFdmVudHMgPSBGc0V2ZW50c0hhbmRsZXIuY2FuVXNlKCk7XG4gIGlmICghY2FuVXNlRnNFdmVudHMpIG9wdHMudXNlRnNFdmVudHMgPSBmYWxzZTtcblxuICAvLyBVc2UgcG9sbGluZyBvbiBNYWMgaWYgbm90IHVzaW5nIGZzZXZlbnRzLlxuICAvLyBPdGhlciBwbGF0Zm9ybXMgdXNlIG5vbi1wb2xsaW5nIGZzX3dhdGNoLlxuICBpZiAodW5kZWYob3B0cywgJ3VzZVBvbGxpbmcnKSAmJiAhb3B0cy51c2VGc0V2ZW50cykge1xuICAgIG9wdHMudXNlUG9sbGluZyA9IGlzTWFjb3M7XG4gIH1cblxuICAvLyBBbHdheXMgZGVmYXVsdCB0byBwb2xsaW5nIG9uIElCTSBpIGJlY2F1c2UgZnMud2F0Y2goKSBpcyBub3QgYXZhaWxhYmxlIG9uIElCTSBpLlxuICBpZihpc0lCTWkpIHtcbiAgICBvcHRzLnVzZVBvbGxpbmcgPSB0cnVlO1xuICB9XG5cbiAgLy8gR2xvYmFsIG92ZXJyaWRlICh1c2VmdWwgZm9yIGVuZC1kZXZlbG9wZXJzIHRoYXQgbmVlZCB0byBmb3JjZSBwb2xsaW5nIGZvciBhbGxcbiAgLy8gaW5zdGFuY2VzIG9mIGNob2tpZGFyLCByZWdhcmRsZXNzIG9mIHVzYWdlL2RlcGVuZGVuY3kgZGVwdGgpXG4gIGNvbnN0IGVudlBvbGwgPSBwcm9jZXNzLmVudi5DSE9LSURBUl9VU0VQT0xMSU5HO1xuICBpZiAoZW52UG9sbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZW52TG93ZXIgPSBlbnZQb2xsLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoZW52TG93ZXIgPT09ICdmYWxzZScgfHwgZW52TG93ZXIgPT09ICcwJykge1xuICAgICAgb3B0cy51c2VQb2xsaW5nID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChlbnZMb3dlciA9PT0gJ3RydWUnIHx8IGVudkxvd2VyID09PSAnMScpIHtcbiAgICAgIG9wdHMudXNlUG9sbGluZyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdHMudXNlUG9sbGluZyA9ICEhZW52TG93ZXI7XG4gICAgfVxuICB9XG4gIGNvbnN0IGVudkludGVydmFsID0gcHJvY2Vzcy5lbnYuQ0hPS0lEQVJfSU5URVJWQUw7XG4gIGlmIChlbnZJbnRlcnZhbCkge1xuICAgIG9wdHMuaW50ZXJ2YWwgPSBOdW1iZXIucGFyc2VJbnQoZW52SW50ZXJ2YWwsIDEwKTtcbiAgfVxuXG4gIC8vIEVkaXRvciBhdG9taWMgd3JpdGUgbm9ybWFsaXphdGlvbiBlbmFibGVkIGJ5IGRlZmF1bHQgd2l0aCBmcy53YXRjaFxuICBpZiAodW5kZWYob3B0cywgJ2F0b21pYycpKSBvcHRzLmF0b21pYyA9ICFvcHRzLnVzZVBvbGxpbmcgJiYgIW9wdHMudXNlRnNFdmVudHM7XG4gIGlmIChvcHRzLmF0b21pYykgdGhpcy5fcGVuZGluZ1VubGlua3MgPSBuZXcgTWFwKCk7XG5cbiAgaWYgKHVuZGVmKG9wdHMsICdmb2xsb3dTeW1saW5rcycpKSBvcHRzLmZvbGxvd1N5bWxpbmtzID0gdHJ1ZTtcblxuICBpZiAodW5kZWYob3B0cywgJ2F3YWl0V3JpdGVGaW5pc2gnKSkgb3B0cy5hd2FpdFdyaXRlRmluaXNoID0gZmFsc2U7XG4gIGlmIChvcHRzLmF3YWl0V3JpdGVGaW5pc2ggPT09IHRydWUpIG9wdHMuYXdhaXRXcml0ZUZpbmlzaCA9IHt9O1xuICBjb25zdCBhd2YgPSBvcHRzLmF3YWl0V3JpdGVGaW5pc2g7XG4gIGlmIChhd2YpIHtcbiAgICBpZiAoIWF3Zi5zdGFiaWxpdHlUaHJlc2hvbGQpIGF3Zi5zdGFiaWxpdHlUaHJlc2hvbGQgPSAyMDAwO1xuICAgIGlmICghYXdmLnBvbGxJbnRlcnZhbCkgYXdmLnBvbGxJbnRlcnZhbCA9IDEwMDtcbiAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gbmV3IE1hcCgpO1xuICB9XG4gIGlmIChvcHRzLmlnbm9yZWQpIG9wdHMuaWdub3JlZCA9IGFycmlmeShvcHRzLmlnbm9yZWQpO1xuXG4gIGxldCByZWFkeUNhbGxzID0gMDtcbiAgdGhpcy5fZW1pdFJlYWR5ID0gKCkgPT4ge1xuICAgIHJlYWR5Q2FsbHMrKztcbiAgICBpZiAocmVhZHlDYWxscyA+PSB0aGlzLl9yZWFkeUNvdW50KSB7XG4gICAgICB0aGlzLl9lbWl0UmVhZHkgPSBFTVBUWV9GTjtcbiAgICAgIHRoaXMuX3JlYWR5RW1pdHRlZCA9IHRydWU7XG4gICAgICAvLyB1c2UgcHJvY2Vzcy5uZXh0VGljayB0byBhbGxvdyB0aW1lIGZvciBsaXN0ZW5lciB0byBiZSBib3VuZFxuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB0aGlzLmVtaXQoRVZfUkVBRFkpKTtcbiAgICB9XG4gIH07XG4gIHRoaXMuX2VtaXRSYXcgPSAoLi4uYXJncykgPT4gdGhpcy5lbWl0KEVWX1JBVywgLi4uYXJncyk7XG4gIHRoaXMuX3JlYWR5RW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRzO1xuXG4gIC8vIEluaXRpYWxpemUgd2l0aCBwcm9wZXIgd2F0Y2hlci5cbiAgaWYgKG9wdHMudXNlRnNFdmVudHMpIHtcbiAgICB0aGlzLl9mc0V2ZW50c0hhbmRsZXIgPSBuZXcgRnNFdmVudHNIYW5kbGVyKHRoaXMpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX25vZGVGc0hhbmRsZXIgPSBuZXcgTm9kZUZzSGFuZGxlcih0aGlzKTtcbiAgfVxuXG4gIC8vIFlvdVx1MjAxOXJlIGZyb3plbiB3aGVuIHlvdXIgaGVhcnRcdTIwMTlzIG5vdCBvcGVuLlxuICBPYmplY3QuZnJlZXplKG9wdHMpO1xufVxuXG4vLyBQdWJsaWMgbWV0aG9kc1xuXG4vKipcbiAqIEFkZHMgcGF0aHMgdG8gYmUgd2F0Y2hlZCBvbiBhbiBleGlzdGluZyBGU1dhdGNoZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7UGF0aHxBcnJheTxQYXRoPn0gcGF0aHNfXG4gKiBAcGFyYW0ge1N0cmluZz19IF9vcmlnQWRkIHByaXZhdGU7IGZvciBoYW5kbGluZyBub24tZXhpc3RlbnQgcGF0aHMgdG8gYmUgd2F0Y2hlZFxuICogQHBhcmFtIHtCb29sZWFuPX0gX2ludGVybmFsIHByaXZhdGU7IGluZGljYXRlcyBhIG5vbi11c2VyIGFkZFxuICogQHJldHVybnMge0ZTV2F0Y2hlcn0gZm9yIGNoYWluaW5nXG4gKi9cbmFkZChwYXRoc18sIF9vcmlnQWRkLCBfaW50ZXJuYWwpIHtcbiAgY29uc3Qge2N3ZCwgZGlzYWJsZUdsb2JiaW5nfSA9IHRoaXMub3B0aW9ucztcbiAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgbGV0IHBhdGhzID0gdW5pZnlQYXRocyhwYXRoc18pO1xuICBpZiAoY3dkKSB7XG4gICAgcGF0aHMgPSBwYXRocy5tYXAoKHBhdGgpID0+IHtcbiAgICAgIGNvbnN0IGFic1BhdGggPSBnZXRBYnNvbHV0ZVBhdGgocGF0aCwgY3dkKTtcblxuICAgICAgLy8gQ2hlY2sgYHBhdGhgIGluc3RlYWQgb2YgYGFic1BhdGhgIGJlY2F1c2UgdGhlIGN3ZCBwb3J0aW9uIGNhbid0IGJlIGEgZ2xvYlxuICAgICAgaWYgKGRpc2FibGVHbG9iYmluZyB8fCAhaXNHbG9iKHBhdGgpKSB7XG4gICAgICAgIHJldHVybiBhYnNQYXRoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgoYWJzUGF0aCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBzZXQgYXNpZGUgbmVnYXRlZCBnbG9iIHN0cmluZ3NcbiAgcGF0aHMgPSBwYXRocy5maWx0ZXIoKHBhdGgpID0+IHtcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKEJBTkcpKSB7XG4gICAgICB0aGlzLl9pZ25vcmVkUGF0aHMuYWRkKHBhdGguc2xpY2UoMSkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGlmIGEgcGF0aCBpcyBiZWluZyBhZGRlZCB0aGF0IHdhcyBwcmV2aW91c2x5IGlnbm9yZWQsIHN0b3AgaWdub3JpbmcgaXRcbiAgICB0aGlzLl9pZ25vcmVkUGF0aHMuZGVsZXRlKHBhdGgpO1xuICAgIHRoaXMuX2lnbm9yZWRQYXRocy5kZWxldGUocGF0aCArIFNMQVNIX0dMT0JTVEFSKTtcblxuICAgIC8vIHJlc2V0IHRoZSBjYWNoZWQgdXNlcklnbm9yZWQgYW55bWF0Y2ggZm5cbiAgICAvLyB0byBtYWtlIGlnbm9yZWRQYXRocyBjaGFuZ2VzIGVmZmVjdGl2ZVxuICAgIHRoaXMuX3VzZXJJZ25vcmVkID0gdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuXG4gIGlmICh0aGlzLm9wdGlvbnMudXNlRnNFdmVudHMgJiYgdGhpcy5fZnNFdmVudHNIYW5kbGVyKSB7XG4gICAgaWYgKCF0aGlzLl9yZWFkeUNvdW50KSB0aGlzLl9yZWFkeUNvdW50ID0gcGF0aHMubGVuZ3RoO1xuICAgIGlmICh0aGlzLm9wdGlvbnMucGVyc2lzdGVudCkgdGhpcy5fcmVhZHlDb3VudCAqPSAyO1xuICAgIHBhdGhzLmZvckVhY2goKHBhdGgpID0+IHRoaXMuX2ZzRXZlbnRzSGFuZGxlci5fYWRkVG9Gc0V2ZW50cyhwYXRoKSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCF0aGlzLl9yZWFkeUNvdW50KSB0aGlzLl9yZWFkeUNvdW50ID0gMDtcbiAgICB0aGlzLl9yZWFkeUNvdW50ICs9IHBhdGhzLmxlbmd0aDtcbiAgICBQcm9taXNlLmFsbChcbiAgICAgIHBhdGhzLm1hcChhc3luYyBwYXRoID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fbm9kZUZzSGFuZGxlci5fYWRkVG9Ob2RlRnMocGF0aCwgIV9pbnRlcm5hbCwgMCwgMCwgX29yaWdBZGQpO1xuICAgICAgICBpZiAocmVzKSB0aGlzLl9lbWl0UmVhZHkoKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47XG4gICAgICByZXN1bHRzLmZpbHRlcihpdGVtID0+IGl0ZW0pLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIHRoaXMuYWRkKHN5c1BhdGguZGlybmFtZShpdGVtKSwgc3lzUGF0aC5iYXNlbmFtZShfb3JpZ0FkZCB8fCBpdGVtKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIENsb3NlIHdhdGNoZXJzIG9yIHN0YXJ0IGlnbm9yaW5nIGV2ZW50cyBmcm9tIHNwZWNpZmllZCBwYXRocy5cbiAqIEBwYXJhbSB7UGF0aHxBcnJheTxQYXRoPn0gcGF0aHNfIC0gc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MsIGZpbGUvZGlyZWN0b3J5IHBhdGhzIGFuZC9vciBnbG9ic1xuICogQHJldHVybnMge0ZTV2F0Y2hlcn0gZm9yIGNoYWluaW5nXG4qL1xudW53YXRjaChwYXRoc18pIHtcbiAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm4gdGhpcztcbiAgY29uc3QgcGF0aHMgPSB1bmlmeVBhdGhzKHBhdGhzXyk7XG4gIGNvbnN0IHtjd2R9ID0gdGhpcy5vcHRpb25zO1xuXG4gIHBhdGhzLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAvLyBjb252ZXJ0IHRvIGFic29sdXRlIHBhdGggdW5sZXNzIHJlbGF0aXZlIHBhdGggYWxyZWFkeSBtYXRjaGVzXG4gICAgaWYgKCFzeXNQYXRoLmlzQWJzb2x1dGUocGF0aCkgJiYgIXRoaXMuX2Nsb3NlcnMuaGFzKHBhdGgpKSB7XG4gICAgICBpZiAoY3dkKSBwYXRoID0gc3lzUGF0aC5qb2luKGN3ZCwgcGF0aCk7XG4gICAgICBwYXRoID0gc3lzUGF0aC5yZXNvbHZlKHBhdGgpO1xuICAgIH1cblxuICAgIHRoaXMuX2Nsb3NlUGF0aChwYXRoKTtcblxuICAgIHRoaXMuX2lnbm9yZWRQYXRocy5hZGQocGF0aCk7XG4gICAgaWYgKHRoaXMuX3dhdGNoZWQuaGFzKHBhdGgpKSB7XG4gICAgICB0aGlzLl9pZ25vcmVkUGF0aHMuYWRkKHBhdGggKyBTTEFTSF9HTE9CU1RBUik7XG4gICAgfVxuXG4gICAgLy8gcmVzZXQgdGhlIGNhY2hlZCB1c2VySWdub3JlZCBhbnltYXRjaCBmblxuICAgIC8vIHRvIG1ha2UgaWdub3JlZFBhdGhzIGNoYW5nZXMgZWZmZWN0aXZlXG4gICAgdGhpcy5fdXNlcklnbm9yZWQgPSB1bmRlZmluZWQ7XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIENsb3NlIHdhdGNoZXJzIGFuZCByZW1vdmUgYWxsIGxpc3RlbmVycyBmcm9tIHdhdGNoZWQgcGF0aHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0uXG4qL1xuY2xvc2UoKSB7XG4gIGlmICh0aGlzLmNsb3NlZCkgcmV0dXJuIHRoaXMuX2Nsb3NlUHJvbWlzZTtcbiAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuXG4gIC8vIE1lbW9yeSBtYW5hZ2VtZW50LlxuICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICBjb25zdCBjbG9zZXJzID0gW107XG4gIHRoaXMuX2Nsb3NlcnMuZm9yRWFjaChjbG9zZXJMaXN0ID0+IGNsb3Nlckxpc3QuZm9yRWFjaChjbG9zZXIgPT4ge1xuICAgIGNvbnN0IHByb21pc2UgPSBjbG9zZXIoKTtcbiAgICBpZiAocHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2UpIGNsb3NlcnMucHVzaChwcm9taXNlKTtcbiAgfSkpO1xuICB0aGlzLl9zdHJlYW1zLmZvckVhY2goc3RyZWFtID0+IHN0cmVhbS5kZXN0cm95KCkpO1xuICB0aGlzLl91c2VySWdub3JlZCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fcmVhZHlDb3VudCA9IDA7XG4gIHRoaXMuX3JlYWR5RW1pdHRlZCA9IGZhbHNlO1xuICB0aGlzLl93YXRjaGVkLmZvckVhY2goZGlyZW50ID0+IGRpcmVudC5kaXNwb3NlKCkpO1xuICBbJ2Nsb3NlcnMnLCAnd2F0Y2hlZCcsICdzdHJlYW1zJywgJ3N5bWxpbmtQYXRocycsICd0aHJvdHRsZWQnXS5mb3JFYWNoKGtleSA9PiB7XG4gICAgdGhpc1tgXyR7a2V5fWBdLmNsZWFyKCk7XG4gIH0pO1xuXG4gIHRoaXMuX2Nsb3NlUHJvbWlzZSA9IGNsb3NlcnMubGVuZ3RoID8gUHJvbWlzZS5hbGwoY2xvc2VycykudGhlbigoKSA9PiB1bmRlZmluZWQpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHJldHVybiB0aGlzLl9jbG9zZVByb21pc2U7XG59XG5cbi8qKlxuICogRXhwb3NlIGxpc3Qgb2Ygd2F0Y2hlZCBwYXRoc1xuICogQHJldHVybnMge09iamVjdH0gZm9yIGNoYWluaW5nXG4qL1xuZ2V0V2F0Y2hlZCgpIHtcbiAgY29uc3Qgd2F0Y2hMaXN0ID0ge307XG4gIHRoaXMuX3dhdGNoZWQuZm9yRWFjaCgoZW50cnksIGRpcikgPT4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMub3B0aW9ucy5jd2QgPyBzeXNQYXRoLnJlbGF0aXZlKHRoaXMub3B0aW9ucy5jd2QsIGRpcikgOiBkaXI7XG4gICAgd2F0Y2hMaXN0W2tleSB8fCBPTkVfRE9UXSA9IGVudHJ5LmdldENoaWxkcmVuKCkuc29ydCgpO1xuICB9KTtcbiAgcmV0dXJuIHdhdGNoTGlzdDtcbn1cblxuZW1pdFdpdGhBbGwoZXZlbnQsIGFyZ3MpIHtcbiAgdGhpcy5lbWl0KC4uLmFyZ3MpO1xuICBpZiAoZXZlbnQgIT09IEVWX0VSUk9SKSB0aGlzLmVtaXQoRVZfQUxMLCAuLi5hcmdzKTtcbn1cblxuLy8gQ29tbW9uIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogTm9ybWFsaXplIGFuZCBlbWl0IGV2ZW50cy5cbiAqIENhbGxpbmcgX2VtaXQgRE9FUyBOT1QgTUVBTiBlbWl0KCkgd291bGQgYmUgY2FsbGVkIVxuICogQHBhcmFtIHtFdmVudE5hbWV9IGV2ZW50IFR5cGUgb2YgZXZlbnRcbiAqIEBwYXJhbSB7UGF0aH0gcGF0aCBGaWxlIG9yIGRpcmVjdG9yeSBwYXRoXG4gKiBAcGFyYW0geyo9fSB2YWwxIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgd2l0aCBldmVudFxuICogQHBhcmFtIHsqPX0gdmFsMlxuICogQHBhcmFtIHsqPX0gdmFsM1xuICogQHJldHVybnMgdGhlIGVycm9yIGlmIGRlZmluZWQsIG90aGVyd2lzZSB0aGUgdmFsdWUgb2YgdGhlIEZTV2F0Y2hlciBpbnN0YW5jZSdzIGBjbG9zZWRgIGZsYWdcbiAqL1xuYXN5bmMgX2VtaXQoZXZlbnQsIHBhdGgsIHZhbDEsIHZhbDIsIHZhbDMpIHtcbiAgaWYgKHRoaXMuY2xvc2VkKSByZXR1cm47XG5cbiAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgaWYgKGlzV2luZG93cyQxKSBwYXRoID0gc3lzUGF0aC5ub3JtYWxpemUocGF0aCk7XG4gIGlmIChvcHRzLmN3ZCkgcGF0aCA9IHN5c1BhdGgucmVsYXRpdmUob3B0cy5jd2QsIHBhdGgpO1xuICAvKiogQHR5cGUgQXJyYXk8YW55PiAqL1xuICBjb25zdCBhcmdzID0gW2V2ZW50LCBwYXRoXTtcbiAgaWYgKHZhbDMgIT09IHVuZGVmaW5lZCkgYXJncy5wdXNoKHZhbDEsIHZhbDIsIHZhbDMpO1xuICBlbHNlIGlmICh2YWwyICE9PSB1bmRlZmluZWQpIGFyZ3MucHVzaCh2YWwxLCB2YWwyKTtcbiAgZWxzZSBpZiAodmFsMSAhPT0gdW5kZWZpbmVkKSBhcmdzLnB1c2godmFsMSk7XG5cbiAgY29uc3QgYXdmID0gb3B0cy5hd2FpdFdyaXRlRmluaXNoO1xuICBsZXQgcHc7XG4gIGlmIChhd2YgJiYgKHB3ID0gdGhpcy5fcGVuZGluZ1dyaXRlcy5nZXQocGF0aCkpKSB7XG4gICAgcHcubGFzdENoYW5nZSA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAob3B0cy5hdG9taWMpIHtcbiAgICBpZiAoZXZlbnQgPT09IEVWX1VOTElOSykge1xuICAgICAgdGhpcy5fcGVuZGluZ1VubGlua3Muc2V0KHBhdGgsIGFyZ3MpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdVbmxpbmtzLmZvckVhY2goKGVudHJ5LCBwYXRoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0KC4uLmVudHJ5KTtcbiAgICAgICAgICB0aGlzLmVtaXQoRVZfQUxMLCAuLi5lbnRyeSk7XG4gICAgICAgICAgdGhpcy5fcGVuZGluZ1VubGlua3MuZGVsZXRlKHBhdGgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIHR5cGVvZiBvcHRzLmF0b21pYyA9PT0gJ251bWJlcicgPyBvcHRzLmF0b21pYyA6IDEwMCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKGV2ZW50ID09PSBFVl9BREQgJiYgdGhpcy5fcGVuZGluZ1VubGlua3MuaGFzKHBhdGgpKSB7XG4gICAgICBldmVudCA9IGFyZ3NbMF0gPSBFVl9DSEFOR0U7XG4gICAgICB0aGlzLl9wZW5kaW5nVW5saW5rcy5kZWxldGUocGF0aCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGF3ZiAmJiAoZXZlbnQgPT09IEVWX0FERCB8fCBldmVudCA9PT0gRVZfQ0hBTkdFKSAmJiB0aGlzLl9yZWFkeUVtaXR0ZWQpIHtcbiAgICBjb25zdCBhd2ZFbWl0ID0gKGVyciwgc3RhdHMpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZXZlbnQgPSBhcmdzWzBdID0gRVZfRVJST1I7XG4gICAgICAgIGFyZ3NbMV0gPSBlcnI7XG4gICAgICAgIHRoaXMuZW1pdFdpdGhBbGwoZXZlbnQsIGFyZ3MpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0cykge1xuICAgICAgICAvLyBpZiBzdGF0cyBkb2Vzbid0IGV4aXN0IHRoZSBmaWxlIG11c3QgaGF2ZSBiZWVuIGRlbGV0ZWRcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikge1xuICAgICAgICAgIGFyZ3NbMl0gPSBzdGF0cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcmdzLnB1c2goc3RhdHMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdFdpdGhBbGwoZXZlbnQsIGFyZ3MpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLl9hd2FpdFdyaXRlRmluaXNoKHBhdGgsIGF3Zi5zdGFiaWxpdHlUaHJlc2hvbGQsIGV2ZW50LCBhd2ZFbWl0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmIChldmVudCA9PT0gRVZfQ0hBTkdFKSB7XG4gICAgY29uc3QgaXNUaHJvdHRsZWQgPSAhdGhpcy5fdGhyb3R0bGUoRVZfQ0hBTkdFLCBwYXRoLCA1MCk7XG4gICAgaWYgKGlzVGhyb3R0bGVkKSByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmIChvcHRzLmFsd2F5c1N0YXQgJiYgdmFsMSA9PT0gdW5kZWZpbmVkICYmXG4gICAgKGV2ZW50ID09PSBFVl9BREQgfHwgZXZlbnQgPT09IEVWX0FERF9ESVIgfHwgZXZlbnQgPT09IEVWX0NIQU5HRSlcbiAgKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBvcHRzLmN3ZCA/IHN5c1BhdGguam9pbihvcHRzLmN3ZCwgcGF0aCkgOiBwYXRoO1xuICAgIGxldCBzdGF0cztcbiAgICB0cnkge1xuICAgICAgc3RhdHMgPSBhd2FpdCBzdGF0KGZ1bGxQYXRoKTtcbiAgICB9IGNhdGNoIChlcnIpIHt9XG4gICAgLy8gU3VwcHJlc3MgZXZlbnQgd2hlbiBmc19zdGF0IGZhaWxzLCB0byBhdm9pZCBzZW5kaW5nIHVuZGVmaW5lZCAnc3RhdCdcbiAgICBpZiAoIXN0YXRzIHx8IHRoaXMuY2xvc2VkKSByZXR1cm47XG4gICAgYXJncy5wdXNoKHN0YXRzKTtcbiAgfVxuICB0aGlzLmVtaXRXaXRoQWxsKGV2ZW50LCBhcmdzKTtcblxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBDb21tb24gaGFuZGxlciBmb3IgZXJyb3JzXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICogQHJldHVybnMge0Vycm9yfEJvb2xlYW59IFRoZSBlcnJvciBpZiBkZWZpbmVkLCBvdGhlcndpc2UgdGhlIHZhbHVlIG9mIHRoZSBGU1dhdGNoZXIgaW5zdGFuY2UncyBgY2xvc2VkYCBmbGFnXG4gKi9cbl9oYW5kbGVFcnJvcihlcnJvcikge1xuICBjb25zdCBjb2RlID0gZXJyb3IgJiYgZXJyb3IuY29kZTtcbiAgaWYgKGVycm9yICYmIGNvZGUgIT09ICdFTk9FTlQnICYmIGNvZGUgIT09ICdFTk9URElSJyAmJlxuICAgICghdGhpcy5vcHRpb25zLmlnbm9yZVBlcm1pc3Npb25FcnJvcnMgfHwgKGNvZGUgIT09ICdFUEVSTScgJiYgY29kZSAhPT0gJ0VBQ0NFUycpKVxuICApIHtcbiAgICB0aGlzLmVtaXQoRVZfRVJST1IsIGVycm9yKTtcbiAgfVxuICByZXR1cm4gZXJyb3IgfHwgdGhpcy5jbG9zZWQ7XG59XG5cbi8qKlxuICogSGVscGVyIHV0aWxpdHkgZm9yIHRocm90dGxpbmdcbiAqIEBwYXJhbSB7VGhyb3R0bGVUeXBlfSBhY3Rpb25UeXBlIHR5cGUgYmVpbmcgdGhyb3R0bGVkXG4gKiBAcGFyYW0ge1BhdGh9IHBhdGggYmVpbmcgYWN0ZWQgdXBvblxuICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVvdXQgZHVyYXRpb24gb2YgdGltZSB0byBzdXBwcmVzcyBkdXBsaWNhdGUgYWN0aW9uc1xuICogQHJldHVybnMge09iamVjdHxmYWxzZX0gdHJhY2tpbmcgb2JqZWN0IG9yIGZhbHNlIGlmIGFjdGlvbiBzaG91bGQgYmUgc3VwcHJlc3NlZFxuICovXG5fdGhyb3R0bGUoYWN0aW9uVHlwZSwgcGF0aCwgdGltZW91dCkge1xuICBpZiAoIXRoaXMuX3Rocm90dGxlZC5oYXMoYWN0aW9uVHlwZSkpIHtcbiAgICB0aGlzLl90aHJvdHRsZWQuc2V0KGFjdGlvblR5cGUsIG5ldyBNYXAoKSk7XG4gIH1cblxuICAvKiogQHR5cGUge01hcDxQYXRoLCBPYmplY3Q+fSAqL1xuICBjb25zdCBhY3Rpb24gPSB0aGlzLl90aHJvdHRsZWQuZ2V0KGFjdGlvblR5cGUpO1xuICAvKiogQHR5cGUge09iamVjdH0gKi9cbiAgY29uc3QgYWN0aW9uUGF0aCA9IGFjdGlvbi5nZXQocGF0aCk7XG5cbiAgaWYgKGFjdGlvblBhdGgpIHtcbiAgICBhY3Rpb25QYXRoLmNvdW50Kys7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IHRpbWVvdXRPYmplY3Q7XG4gIGNvbnN0IGNsZWFyID0gKCkgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSBhY3Rpb24uZ2V0KHBhdGgpO1xuICAgIGNvbnN0IGNvdW50ID0gaXRlbSA/IGl0ZW0uY291bnQgOiAwO1xuICAgIGFjdGlvbi5kZWxldGUocGF0aCk7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRPYmplY3QpO1xuICAgIGlmIChpdGVtKSBjbGVhclRpbWVvdXQoaXRlbS50aW1lb3V0T2JqZWN0KTtcbiAgICByZXR1cm4gY291bnQ7XG4gIH07XG4gIHRpbWVvdXRPYmplY3QgPSBzZXRUaW1lb3V0KGNsZWFyLCB0aW1lb3V0KTtcbiAgY29uc3QgdGhyID0ge3RpbWVvdXRPYmplY3QsIGNsZWFyLCBjb3VudDogMH07XG4gIGFjdGlvbi5zZXQocGF0aCwgdGhyKTtcbiAgcmV0dXJuIHRocjtcbn1cblxuX2luY3JSZWFkeUNvdW50KCkge1xuICByZXR1cm4gdGhpcy5fcmVhZHlDb3VudCsrO1xufVxuXG4vKipcbiAqIEF3YWl0cyB3cml0ZSBvcGVyYXRpb24gdG8gZmluaXNoLlxuICogUG9sbHMgYSBuZXdseSBjcmVhdGVkIGZpbGUgZm9yIHNpemUgdmFyaWF0aW9ucy4gV2hlbiBmaWxlcyBzaXplIGRvZXMgbm90IGNoYW5nZSBmb3IgJ3RocmVzaG9sZCcgbWlsbGlzZWNvbmRzIGNhbGxzIGNhbGxiYWNrLlxuICogQHBhcmFtIHtQYXRofSBwYXRoIGJlaW5nIGFjdGVkIHVwb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB0aHJlc2hvbGQgVGltZSBpbiBtaWxsaXNlY29uZHMgYSBmaWxlIHNpemUgbXVzdCBiZSBmaXhlZCBiZWZvcmUgYWNrbm93bGVkZ2luZyB3cml0ZSBPUCBpcyBmaW5pc2hlZFxuICogQHBhcmFtIHtFdmVudE5hbWV9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhd2ZFbWl0IENhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHJlYWR5IGZvciBldmVudCB0byBiZSBlbWl0dGVkLlxuICovXG5fYXdhaXRXcml0ZUZpbmlzaChwYXRoLCB0aHJlc2hvbGQsIGV2ZW50LCBhd2ZFbWl0KSB7XG4gIGxldCB0aW1lb3V0SGFuZGxlcjtcblxuICBsZXQgZnVsbFBhdGggPSBwYXRoO1xuICBpZiAodGhpcy5vcHRpb25zLmN3ZCAmJiAhc3lzUGF0aC5pc0Fic29sdXRlKHBhdGgpKSB7XG4gICAgZnVsbFBhdGggPSBzeXNQYXRoLmpvaW4odGhpcy5vcHRpb25zLmN3ZCwgcGF0aCk7XG4gIH1cblxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gIGNvbnN0IGF3YWl0V3JpdGVGaW5pc2ggPSAocHJldlN0YXQpID0+IHtcbiAgICBmcyQ1LnN0YXQoZnVsbFBhdGgsIChlcnIsIGN1clN0YXQpID0+IHtcbiAgICAgIGlmIChlcnIgfHwgIXRoaXMuX3BlbmRpbmdXcml0ZXMuaGFzKHBhdGgpKSB7XG4gICAgICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgIT09ICdFTk9FTlQnKSBhd2ZFbWl0KGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm93ID0gTnVtYmVyKG5ldyBEYXRlKCkpO1xuXG4gICAgICBpZiAocHJldlN0YXQgJiYgY3VyU3RhdC5zaXplICE9PSBwcmV2U3RhdC5zaXplKSB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMuZ2V0KHBhdGgpLmxhc3RDaGFuZ2UgPSBub3c7XG4gICAgICB9XG4gICAgICBjb25zdCBwdyA9IHRoaXMuX3BlbmRpbmdXcml0ZXMuZ2V0KHBhdGgpO1xuICAgICAgY29uc3QgZGYgPSBub3cgLSBwdy5sYXN0Q2hhbmdlO1xuXG4gICAgICBpZiAoZGYgPj0gdGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMuZGVsZXRlKHBhdGgpO1xuICAgICAgICBhd2ZFbWl0KHVuZGVmaW5lZCwgY3VyU3RhdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lb3V0SGFuZGxlciA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgYXdhaXRXcml0ZUZpbmlzaCxcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYXdhaXRXcml0ZUZpbmlzaC5wb2xsSW50ZXJ2YWwsXG4gICAgICAgICAgY3VyU3RhdFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcy5oYXMocGF0aCkpIHtcbiAgICB0aGlzLl9wZW5kaW5nV3JpdGVzLnNldChwYXRoLCB7XG4gICAgICBsYXN0Q2hhbmdlOiBub3csXG4gICAgICBjYW5jZWxXYWl0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMuZGVsZXRlKHBhdGgpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGltZW91dEhhbmRsZXIgPSBzZXRUaW1lb3V0KFxuICAgICAgYXdhaXRXcml0ZUZpbmlzaCxcbiAgICAgIHRoaXMub3B0aW9ucy5hd2FpdFdyaXRlRmluaXNoLnBvbGxJbnRlcnZhbFxuICAgICk7XG4gIH1cbn1cblxuX2dldEdsb2JJZ25vcmVkKCkge1xuICByZXR1cm4gWy4uLnRoaXMuX2lnbm9yZWRQYXRocy52YWx1ZXMoKV07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHVzZXIgaGFzIGFza2VkIHRvIGlnbm9yZSB0aGlzIHBhdGguXG4gKiBAcGFyYW0ge1BhdGh9IHBhdGggZmlsZXBhdGggb3IgZGlyXG4gKiBAcGFyYW0ge2ZzLlN0YXRzPX0gc3RhdHMgcmVzdWx0IG9mIGZzLnN0YXRcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5faXNJZ25vcmVkKHBhdGgsIHN0YXRzKSB7XG4gIGlmICh0aGlzLm9wdGlvbnMuYXRvbWljICYmIERPVF9SRS50ZXN0KHBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCF0aGlzLl91c2VySWdub3JlZCkge1xuICAgIGNvbnN0IHtjd2R9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IGlnbiA9IHRoaXMub3B0aW9ucy5pZ25vcmVkO1xuXG4gICAgY29uc3QgaWdub3JlZCA9IGlnbiAmJiBpZ24ubWFwKG5vcm1hbGl6ZUlnbm9yZWQoY3dkKSk7XG4gICAgY29uc3QgcGF0aHMgPSBhcnJpZnkoaWdub3JlZClcbiAgICAgIC5maWx0ZXIoKHBhdGgpID0+IHR5cGVvZiBwYXRoID09PSBTVFJJTkdfVFlQRSAmJiAhaXNHbG9iKHBhdGgpKVxuICAgICAgLm1hcCgocGF0aCkgPT4gcGF0aCArIFNMQVNIX0dMT0JTVEFSKTtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5fZ2V0R2xvYklnbm9yZWQoKS5tYXAobm9ybWFsaXplSWdub3JlZChjd2QpKS5jb25jYXQoaWdub3JlZCwgcGF0aHMpO1xuICAgIHRoaXMuX3VzZXJJZ25vcmVkID0gYW55bWF0Y2gobGlzdCwgdW5kZWZpbmVkLCBBTllNQVRDSF9PUFRTKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl91c2VySWdub3JlZChbcGF0aCwgc3RhdHNdKTtcbn1cblxuX2lzbnRJZ25vcmVkKHBhdGgsIHN0YXQpIHtcbiAgcmV0dXJuICF0aGlzLl9pc0lnbm9yZWQocGF0aCwgc3RhdCk7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgYSBzZXQgb2YgY29tbW9uIGhlbHBlcnMgYW5kIHByb3BlcnRpZXMgcmVsYXRpbmcgdG8gc3ltbGluayBhbmQgZ2xvYiBoYW5kbGluZy5cbiAqIEBwYXJhbSB7UGF0aH0gcGF0aCBmaWxlLCBkaXJlY3RvcnksIG9yIGdsb2IgcGF0dGVybiBiZWluZyB3YXRjaGVkXG4gKiBAcGFyYW0ge051bWJlcj19IGRlcHRoIGF0IGFueSBkZXB0aCA+IDAsIHRoaXMgaXNuJ3QgYSBnbG9iXG4gKiBAcmV0dXJucyB7V2F0Y2hIZWxwZXJ9IG9iamVjdCBjb250YWluaW5nIGhlbHBlcnMgZm9yIHRoaXMgcGF0aFxuICovXG5fZ2V0V2F0Y2hIZWxwZXJzKHBhdGgsIGRlcHRoKSB7XG4gIGNvbnN0IHdhdGNoUGF0aCA9IGRlcHRoIHx8IHRoaXMub3B0aW9ucy5kaXNhYmxlR2xvYmJpbmcgfHwgIWlzR2xvYihwYXRoKSA/IHBhdGggOiBnbG9iUGFyZW50KHBhdGgpO1xuICBjb25zdCBmb2xsb3cgPSB0aGlzLm9wdGlvbnMuZm9sbG93U3ltbGlua3M7XG5cbiAgcmV0dXJuIG5ldyBXYXRjaEhlbHBlcihwYXRoLCB3YXRjaFBhdGgsIGZvbGxvdywgdGhpcyk7XG59XG5cbi8vIERpcmVjdG9yeSBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFByb3ZpZGVzIGRpcmVjdG9yeSB0cmFja2luZyBvYmplY3RzXG4gKiBAcGFyYW0ge1N0cmluZ30gZGlyZWN0b3J5IHBhdGggb2YgdGhlIGRpcmVjdG9yeVxuICogQHJldHVybnMge0RpckVudHJ5fSB0aGUgZGlyZWN0b3J5J3MgdHJhY2tpbmcgb2JqZWN0XG4gKi9cbl9nZXRXYXRjaGVkRGlyKGRpcmVjdG9yeSkge1xuICBpZiAoIXRoaXMuX2JvdW5kUmVtb3ZlKSB0aGlzLl9ib3VuZFJlbW92ZSA9IHRoaXMuX3JlbW92ZS5iaW5kKHRoaXMpO1xuICBjb25zdCBkaXIgPSBzeXNQYXRoLnJlc29sdmUoZGlyZWN0b3J5KTtcbiAgaWYgKCF0aGlzLl93YXRjaGVkLmhhcyhkaXIpKSB0aGlzLl93YXRjaGVkLnNldChkaXIsIG5ldyBEaXJFbnRyeShkaXIsIHRoaXMuX2JvdW5kUmVtb3ZlKSk7XG4gIHJldHVybiB0aGlzLl93YXRjaGVkLmdldChkaXIpO1xufVxuXG4vLyBGaWxlIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENoZWNrIGZvciByZWFkIHBlcm1pc3Npb25zLlxuICogQmFzZWQgb24gdGhpcyBhbnN3ZXIgb24gU086IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMTc4MTQwNC8xMzU4NDA1XG4gKiBAcGFyYW0ge2ZzLlN0YXRzfSBzdGF0cyAtIG9iamVjdCwgcmVzdWx0IG9mIGZzX3N0YXRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlsZSBjYW4gYmUgcmVhZFxuKi9cbl9oYXNSZWFkUGVybWlzc2lvbnMoc3RhdHMpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVQZXJtaXNzaW9uRXJyb3JzKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBzdGF0cy5tb2RlIG1heSBiZSBiaWdpbnRcbiAgY29uc3QgbWQgPSBzdGF0cyAmJiBOdW1iZXIucGFyc2VJbnQoc3RhdHMubW9kZSwgMTApO1xuICBjb25zdCBzdCA9IG1kICYgMG83Nzc7XG4gIGNvbnN0IGl0ID0gTnVtYmVyLnBhcnNlSW50KHN0LnRvU3RyaW5nKDgpWzBdLCAxMCk7XG4gIHJldHVybiBCb29sZWFuKDQgJiBpdCk7XG59XG5cbi8qKlxuICogSGFuZGxlcyBlbWl0dGluZyB1bmxpbmsgZXZlbnRzIGZvclxuICogZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCBhbmQgdmlhIHJlY3Vyc2lvbiwgZm9yXG4gKiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2l0aGluIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHVubGlua2VkXG4gKiBAcGFyYW0ge1N0cmluZ30gZGlyZWN0b3J5IHdpdGhpbiB3aGljaCB0aGUgZm9sbG93aW5nIGl0ZW0gaXMgbG9jYXRlZFxuICogQHBhcmFtIHtTdHJpbmd9IGl0ZW0gICAgICBiYXNlIHBhdGggb2YgaXRlbS9kaXJlY3RvcnlcbiAqIEByZXR1cm5zIHt2b2lkfVxuKi9cbl9yZW1vdmUoZGlyZWN0b3J5LCBpdGVtLCBpc0RpcmVjdG9yeSkge1xuICAvLyBpZiB3aGF0IGlzIGJlaW5nIGRlbGV0ZWQgaXMgYSBkaXJlY3RvcnksIGdldCB0aGF0IGRpcmVjdG9yeSdzIHBhdGhzXG4gIC8vIGZvciByZWN1cnNpdmUgZGVsZXRpbmcgYW5kIGNsZWFuaW5nIG9mIHdhdGNoZWQgb2JqZWN0XG4gIC8vIGlmIGl0IGlzIG5vdCBhIGRpcmVjdG9yeSwgbmVzdGVkRGlyZWN0b3J5Q2hpbGRyZW4gd2lsbCBiZSBlbXB0eSBhcnJheVxuICBjb25zdCBwYXRoID0gc3lzUGF0aC5qb2luKGRpcmVjdG9yeSwgaXRlbSk7XG4gIGNvbnN0IGZ1bGxQYXRoID0gc3lzUGF0aC5yZXNvbHZlKHBhdGgpO1xuICBpc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5ICE9IG51bGxcbiAgICA/IGlzRGlyZWN0b3J5XG4gICAgOiB0aGlzLl93YXRjaGVkLmhhcyhwYXRoKSB8fCB0aGlzLl93YXRjaGVkLmhhcyhmdWxsUGF0aCk7XG5cbiAgLy8gcHJldmVudCBkdXBsaWNhdGUgaGFuZGxpbmcgaW4gY2FzZSBvZiBhcnJpdmluZyBoZXJlIG5lYXJseSBzaW11bHRhbmVvdXNseVxuICAvLyB2aWEgbXVsdGlwbGUgcGF0aHMgKHN1Y2ggYXMgX2hhbmRsZUZpbGUgYW5kIF9oYW5kbGVEaXIpXG4gIGlmICghdGhpcy5fdGhyb3R0bGUoJ3JlbW92ZScsIHBhdGgsIDEwMCkpIHJldHVybjtcblxuICAvLyBpZiB0aGUgb25seSB3YXRjaGVkIGZpbGUgaXMgcmVtb3ZlZCwgd2F0Y2ggZm9yIGl0cyByZXR1cm5cbiAgaWYgKCFpc0RpcmVjdG9yeSAmJiAhdGhpcy5vcHRpb25zLnVzZUZzRXZlbnRzICYmIHRoaXMuX3dhdGNoZWQuc2l6ZSA9PT0gMSkge1xuICAgIHRoaXMuYWRkKGRpcmVjdG9yeSwgaXRlbSwgdHJ1ZSk7XG4gIH1cblxuICAvLyBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZSB3YXRjaGVkIG9iamVjdCBpbiBlaXRoZXIgY2FzZVxuICAvLyBzbyB3ZSBnb3QgdG8gZG8gdGhlIGRpcmVjdG9yeSBjaGVjayBiZWZvcmVoYW5kXG4gIGNvbnN0IHdwID0gdGhpcy5fZ2V0V2F0Y2hlZERpcihwYXRoKTtcbiAgY29uc3QgbmVzdGVkRGlyZWN0b3J5Q2hpbGRyZW4gPSB3cC5nZXRDaGlsZHJlbigpO1xuXG4gIC8vIFJlY3Vyc2l2ZWx5IHJlbW92ZSBjaGlsZHJlbiBkaXJlY3RvcmllcyAvIGZpbGVzLlxuICBuZXN0ZWREaXJlY3RvcnlDaGlsZHJlbi5mb3JFYWNoKG5lc3RlZCA9PiB0aGlzLl9yZW1vdmUocGF0aCwgbmVzdGVkKSk7XG5cbiAgLy8gQ2hlY2sgaWYgaXRlbSB3YXMgb24gdGhlIHdhdGNoZWQgbGlzdCBhbmQgcmVtb3ZlIGl0XG4gIGNvbnN0IHBhcmVudCA9IHRoaXMuX2dldFdhdGNoZWREaXIoZGlyZWN0b3J5KTtcbiAgY29uc3Qgd2FzVHJhY2tlZCA9IHBhcmVudC5oYXMoaXRlbSk7XG4gIHBhcmVudC5yZW1vdmUoaXRlbSk7XG5cbiAgLy8gRml4ZXMgaXNzdWUgIzEwNDIgLT4gUmVsYXRpdmUgcGF0aHMgd2VyZSBkZXRlY3RlZCBhbmQgYWRkZWQgYXMgc3ltbGlua3NcbiAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvY2hva2lkYXIvYmxvYi9lMTc1M2RkYmM5NTcxYmRjMzNiNGE0YWYxNzJkNTJjYjZlNjExYzEwL2xpYi9ub2RlZnMtaGFuZGxlci5qcyNMNjEyKSxcbiAgLy8gYnV0IG5ldmVyIHJlbW92ZWQgZnJvbSB0aGUgbWFwIGluIGNhc2UgdGhlIHBhdGggd2FzIGRlbGV0ZWQuXG4gIC8vIFRoaXMgbGVhZHMgdG8gYW4gaW5jb3JyZWN0IHN0YXRlIGlmIHRoZSBwYXRoIHdhcyByZWNyZWF0ZWQ6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvY2hva2lkYXIvYmxvYi9lMTc1M2RkYmM5NTcxYmRjMzNiNGE0YWYxNzJkNTJjYjZlNjExYzEwL2xpYi9ub2RlZnMtaGFuZGxlci5qcyNMNTUzXG4gIGlmICh0aGlzLl9zeW1saW5rUGF0aHMuaGFzKGZ1bGxQYXRoKSkge1xuICAgIHRoaXMuX3N5bWxpbmtQYXRocy5kZWxldGUoZnVsbFBhdGgpO1xuICB9XG5cbiAgLy8gSWYgd2Ugd2FpdCBmb3IgdGhpcyBmaWxlIHRvIGJlIGZ1bGx5IHdyaXR0ZW4sIGNhbmNlbCB0aGUgd2FpdC5cbiAgbGV0IHJlbFBhdGggPSBwYXRoO1xuICBpZiAodGhpcy5vcHRpb25zLmN3ZCkgcmVsUGF0aCA9IHN5c1BhdGgucmVsYXRpdmUodGhpcy5vcHRpb25zLmN3ZCwgcGF0aCk7XG4gIGlmICh0aGlzLm9wdGlvbnMuYXdhaXRXcml0ZUZpbmlzaCAmJiB0aGlzLl9wZW5kaW5nV3JpdGVzLmhhcyhyZWxQYXRoKSkge1xuICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5fcGVuZGluZ1dyaXRlcy5nZXQocmVsUGF0aCkuY2FuY2VsV2FpdCgpO1xuICAgIGlmIChldmVudCA9PT0gRVZfQUREKSByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgRW50cnkgd2lsbCBlaXRoZXIgYmUgYSBkaXJlY3RvcnkgdGhhdCBqdXN0IGdvdCByZW1vdmVkXG4gIC8vIG9yIGEgYm9ndXMgZW50cnkgdG8gYSBmaWxlLCBpbiBlaXRoZXIgY2FzZSB3ZSBoYXZlIHRvIHJlbW92ZSBpdFxuICB0aGlzLl93YXRjaGVkLmRlbGV0ZShwYXRoKTtcbiAgdGhpcy5fd2F0Y2hlZC5kZWxldGUoZnVsbFBhdGgpO1xuICBjb25zdCBldmVudE5hbWUgPSBpc0RpcmVjdG9yeSA/IEVWX1VOTElOS19ESVIgOiBFVl9VTkxJTks7XG4gIGlmICh3YXNUcmFja2VkICYmICF0aGlzLl9pc0lnbm9yZWQocGF0aCkpIHRoaXMuX2VtaXQoZXZlbnROYW1lLCBwYXRoKTtcblxuICAvLyBBdm9pZCBjb25mbGljdHMgaWYgd2UgbGF0ZXIgY3JlYXRlIGFub3RoZXIgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWVcbiAgaWYgKCF0aGlzLm9wdGlvbnMudXNlRnNFdmVudHMpIHtcbiAgICB0aGlzLl9jbG9zZVBhdGgocGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbG9zZXMgYWxsIHdhdGNoZXJzIGZvciBhIHBhdGhcbiAqIEBwYXJhbSB7UGF0aH0gcGF0aFxuICovXG5fY2xvc2VQYXRoKHBhdGgpIHtcbiAgdGhpcy5fY2xvc2VGaWxlKHBhdGgpO1xuICBjb25zdCBkaXIgPSBzeXNQYXRoLmRpcm5hbWUocGF0aCk7XG4gIHRoaXMuX2dldFdhdGNoZWREaXIoZGlyKS5yZW1vdmUoc3lzUGF0aC5iYXNlbmFtZShwYXRoKSk7XG59XG5cbi8qKlxuICogQ2xvc2VzIG9ubHkgZmlsZS1zcGVjaWZpYyB3YXRjaGVyc1xuICogQHBhcmFtIHtQYXRofSBwYXRoXG4gKi9cbl9jbG9zZUZpbGUocGF0aCkge1xuICBjb25zdCBjbG9zZXJzID0gdGhpcy5fY2xvc2Vycy5nZXQocGF0aCk7XG4gIGlmICghY2xvc2VycykgcmV0dXJuO1xuICBjbG9zZXJzLmZvckVhY2goY2xvc2VyID0+IGNsb3NlcigpKTtcbiAgdGhpcy5fY2xvc2Vycy5kZWxldGUocGF0aCk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7UGF0aH0gcGF0aFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2xvc2VyXG4gKi9cbl9hZGRQYXRoQ2xvc2VyKHBhdGgsIGNsb3Nlcikge1xuICBpZiAoIWNsb3NlcikgcmV0dXJuO1xuICBsZXQgbGlzdCA9IHRoaXMuX2Nsb3NlcnMuZ2V0KHBhdGgpO1xuICBpZiAoIWxpc3QpIHtcbiAgICBsaXN0ID0gW107XG4gICAgdGhpcy5fY2xvc2Vycy5zZXQocGF0aCwgbGlzdCk7XG4gIH1cbiAgbGlzdC5wdXNoKGNsb3Nlcik7XG59XG5cbl9yZWFkZGlycChyb290LCBvcHRzKSB7XG4gIGlmICh0aGlzLmNsb3NlZCkgcmV0dXJuO1xuICBjb25zdCBvcHRpb25zID0ge3R5cGU6IEVWX0FMTCwgYWx3YXlzU3RhdDogdHJ1ZSwgbHN0YXQ6IHRydWUsIC4uLm9wdHN9O1xuICBsZXQgc3RyZWFtID0gcmVhZGRpcnAocm9vdCwgb3B0aW9ucyk7XG4gIHRoaXMuX3N0cmVhbXMuYWRkKHN0cmVhbSk7XG4gIHN0cmVhbS5vbmNlKFNUUl9DTE9TRSwgKCkgPT4ge1xuICAgIHN0cmVhbSA9IHVuZGVmaW5lZDtcbiAgfSk7XG4gIHN0cmVhbS5vbmNlKFNUUl9FTkQsICgpID0+IHtcbiAgICBpZiAoc3RyZWFtKSB7XG4gICAgICB0aGlzLl9zdHJlYW1zLmRlbGV0ZShzdHJlYW0pO1xuICAgICAgc3RyZWFtID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59XG5cbn1cblxuLy8gRXhwb3J0IEZTV2F0Y2hlciBjbGFzc1xuY2hva2lkYXIuRlNXYXRjaGVyID0gRlNXYXRjaGVyO1xuXG4vKipcbiAqIEluc3RhbnRpYXRlcyB3YXRjaGVyIHdpdGggcGF0aHMgdG8gYmUgdHJhY2tlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5PFN0cmluZz59IHBhdGhzIGZpbGUvZGlyZWN0b3J5IHBhdGhzIGFuZC9vciBnbG9ic1xuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zIGNob2tpZGFyIG9wdHNcbiAqIEByZXR1cm5zIGFuIGluc3RhbmNlIG9mIEZTV2F0Y2hlciBmb3IgY2hhaW5pbmcuXG4gKi9cbmNvbnN0IHdhdGNoID0gKHBhdGhzLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHdhdGNoZXIgPSBuZXcgRlNXYXRjaGVyKG9wdGlvbnMpO1xuICB3YXRjaGVyLmFkZChwYXRocyk7XG4gIHJldHVybiB3YXRjaGVyO1xufTtcblxuY2hva2lkYXIud2F0Y2ggPSB3YXRjaDtcblxudmFyIHNoZWxsUXVvdGUkMSA9IHt9O1xuXG5zaGVsbFF1b3RlJDEucXVvdGUgPSBmdW5jdGlvbiAoeHMpIHtcbiAgICByZXR1cm4geHMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgIGlmIChzICYmIHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIHMub3AucmVwbGFjZSgvKC4pL2csICdcXFxcJDEnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgvW1wiXFxzXS8udGVzdChzKSAmJiAhLycvLnRlc3QocykpIHtcbiAgICAgICAgICAgIHJldHVybiBcIidcIiArIHMucmVwbGFjZSgvKFsnXFxcXF0pL2csICdcXFxcJDEnKSArIFwiJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKC9bXCInXFxzXS8udGVzdChzKSkge1xuICAgICAgICAgICAgcmV0dXJuICdcIicgKyBzLnJlcGxhY2UoLyhbXCJcXFxcJGAhXSkvZywgJ1xcXFwkMScpICsgJ1wiJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcocykucmVwbGFjZSgvKFtBLVphLXpdOik/KFsjIVwiJCYnKCkqLDo7PD0+P0BcXFtcXFxcXFxdXmB7fH1dKS9nLCAnJDFcXFxcJDInKTtcbiAgICAgICAgfVxuICAgIH0pLmpvaW4oJyAnKTtcbn07XG5cbi8vICc8KCcgaXMgcHJvY2VzcyBzdWJzdGl0dXRpb24gb3BlcmF0b3IgYW5kXG4vLyBjYW4gYmUgcGFyc2VkIHRoZSBzYW1lIGFzIGNvbnRyb2wgb3BlcmF0b3JcbnZhciBDT05UUk9MID0gJyg/OicgKyBbXG4gICAgJ1xcXFx8XFxcXHwnLCAnXFxcXCZcXFxcJicsICc7OycsICdcXFxcfFxcXFwmJywgJ1xcXFw8XFxcXCgnLCAnPj4nLCAnPlxcXFwmJywgJ1smOygpfDw+XSdcbl0uam9pbignfCcpICsgJyknO1xudmFyIE1FVEEgPSAnfCY7KCk8PiBcXFxcdCc7XG52YXIgQkFSRVdPUkQgPSAnKFxcXFxcXFxcW1xcJ1wiJyArIE1FVEEgKyAnXXxbXlxcXFxzXFwnXCInICsgTUVUQSArICddKSsnO1xudmFyIFNJTkdMRV9RVU9URSA9ICdcIigoXFxcXFxcXFxcInxbXlwiXSkqPylcIic7XG52YXIgRE9VQkxFX1FVT1RFID0gJ1xcJygoXFxcXFxcXFxcXCd8W15cXCddKSo/KVxcJyc7XG5cbnZhciBUT0tFTiA9ICcnO1xuZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICBUT0tFTiArPSAoTWF0aC5wb3coMTYsOCkqTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMTYpO1xufVxuXG5zaGVsbFF1b3RlJDEucGFyc2UgPSBmdW5jdGlvbiAocywgZW52LCBvcHRzKSB7XG4gICAgdmFyIG1hcHBlZCA9IHBhcnNlJDUocywgZW52LCBvcHRzKTtcbiAgICBpZiAodHlwZW9mIGVudiAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG1hcHBlZDtcbiAgICByZXR1cm4gbWFwcGVkLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcyA9PT0gJ29iamVjdCcpIHJldHVybiBhY2MuY29uY2F0KHMpO1xuICAgICAgICB2YXIgeHMgPSBzLnNwbGl0KFJlZ0V4cCgnKCcgKyBUT0tFTiArICcuKj8nICsgVE9LRU4gKyAnKScsICdnJykpO1xuICAgICAgICBpZiAoeHMubGVuZ3RoID09PSAxKSByZXR1cm4gYWNjLmNvbmNhdCh4c1swXSk7XG4gICAgICAgIHJldHVybiBhY2MuY29uY2F0KHhzLmZpbHRlcihCb29sZWFuKS5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIGlmIChSZWdFeHAoJ14nICsgVE9LRU4pLnRlc3QoeCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh4LnNwbGl0KFRPS0VOKVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHJldHVybiB4O1xuICAgICAgICB9KSk7XG4gICAgfSwgW10pO1xufTtcblxuZnVuY3Rpb24gcGFyc2UkNSAocywgZW52LCBvcHRzKSB7XG4gICAgdmFyIGNodW5rZXIgPSBuZXcgUmVnRXhwKFtcbiAgICAgICAgJygnICsgQ09OVFJPTCArICcpJywgLy8gY29udHJvbCBjaGFyc1xuICAgICAgICAnKCcgKyBCQVJFV09SRCArICd8JyArIFNJTkdMRV9RVU9URSArICd8JyArIERPVUJMRV9RVU9URSArICcpKidcbiAgICBdLmpvaW4oJ3wnKSwgJ2cnKTtcbiAgICB2YXIgbWF0Y2ggPSBzLm1hdGNoKGNodW5rZXIpLmZpbHRlcihCb29sZWFuKTtcbiAgICB2YXIgY29tbWVudGVkID0gZmFsc2U7XG5cbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gW107XG4gICAgaWYgKCFlbnYpIGVudiA9IHt9O1xuICAgIGlmICghb3B0cykgb3B0cyA9IHt9O1xuICAgIHJldHVybiBtYXRjaC5tYXAoZnVuY3Rpb24gKHMsIGopIHtcbiAgICAgICAgaWYgKGNvbW1lbnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChSZWdFeHAoJ14nICsgQ09OVFJPTCArICckJykudGVzdChzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgb3A6IHMgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmQtd3JpdHRlbiBzY2FubmVyL3BhcnNlciBmb3IgQmFzaCBxdW90aW5nIHJ1bGVzOlxuICAgICAgICAvL1xuICAgICAgICAvLyAgMS4gaW5zaWRlIHNpbmdsZSBxdW90ZXMsIGFsbCBjaGFyYWN0ZXJzIGFyZSBwcmludGVkIGxpdGVyYWxseS5cbiAgICAgICAgLy8gIDIuIGluc2lkZSBkb3VibGUgcXVvdGVzLCBhbGwgY2hhcmFjdGVycyBhcmUgcHJpbnRlZCBsaXRlcmFsbHlcbiAgICAgICAgLy8gICAgIGV4Y2VwdCB2YXJpYWJsZXMgcHJlZml4ZWQgYnkgJyQnIGFuZCBiYWNrc2xhc2hlcyBmb2xsb3dlZCBieVxuICAgICAgICAvLyAgICAgZWl0aGVyIGEgZG91YmxlIHF1b3RlIG9yIGFub3RoZXIgYmFja3NsYXNoLlxuICAgICAgICAvLyAgMy4gb3V0c2lkZSBvZiBhbnkgcXVvdGVzLCBiYWNrc2xhc2hlcyBhcmUgdHJlYXRlZCBhcyBlc2NhcGVcbiAgICAgICAgLy8gICAgIGNoYXJhY3RlcnMgYW5kIG5vdCBwcmludGVkICh1bmxlc3MgdGhleSBhcmUgdGhlbXNlbHZlcyBlc2NhcGVkKVxuICAgICAgICAvLyAgNC4gcXVvdGUgY29udGV4dCBjYW4gc3dpdGNoIG1pZC10b2tlbiBpZiB0aGVyZSBpcyBubyB3aGl0ZXNwYWNlXG4gICAgICAgIC8vICAgICBiZXR3ZWVuIHRoZSB0d28gcXVvdGUgY29udGV4dHMgKGUuZy4gYWxsJ29uZSdcInRva2VuXCIgcGFyc2VzIGFzXG4gICAgICAgIC8vICAgICBcImFsbG9uZXRva2VuXCIpXG4gICAgICAgIHZhciBTUSA9IFwiJ1wiO1xuICAgICAgICB2YXIgRFEgPSAnXCInO1xuICAgICAgICB2YXIgRFMgPSAnJCc7XG4gICAgICAgIHZhciBCUyA9IG9wdHMuZXNjYXBlIHx8ICdcXFxcJztcbiAgICAgICAgdmFyIHF1b3RlID0gZmFsc2U7XG4gICAgICAgIHZhciBlc2MgPSBmYWxzZTtcbiAgICAgICAgdmFyIG91dCA9ICcnO1xuICAgICAgICB2YXIgaXNHbG9iID0gZmFsc2U7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjID0gcy5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpc0dsb2IgPSBpc0dsb2IgfHwgKCFxdW90ZSAmJiAoYyA9PT0gJyonIHx8IGMgPT09ICc/JykpO1xuICAgICAgICAgICAgaWYgKGVzYykge1xuICAgICAgICAgICAgICAgIG91dCArPSBjO1xuICAgICAgICAgICAgICAgIGVzYyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocXVvdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA9PT0gcXVvdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocXVvdGUgPT0gU1EpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBEb3VibGUgcXVvdGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IEJTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gRFEgfHwgYyA9PT0gQlMgfHwgYyA9PT0gRFMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gYztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IEJTICsgYztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09PSBEUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHBhcnNlRW52VmFyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gYztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09IERRIHx8IGMgPT09IFNRKSB7XG4gICAgICAgICAgICAgICAgcXVvdGUgPSBjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoUmVnRXhwKCdeJyArIENPTlRST0wgKyAnJCcpLnRlc3QoYykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBvcDogcyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoUmVnRXhwKCdeIyQnKS50ZXN0KGMpKSB7XG4gICAgICAgICAgICAgICAgY29tbWVudGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAob3V0Lmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbb3V0LCB7IGNvbW1lbnQ6IHMuc2xpY2UoaSsxKSArIG1hdGNoLnNsaWNlKGorMSkuam9pbignICcpIH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gW3sgY29tbWVudDogcy5zbGljZShpKzEpICsgbWF0Y2guc2xpY2UoaisxKS5qb2luKCcgJykgfV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjID09PSBCUykge1xuICAgICAgICAgICAgICAgIGVzYyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjID09PSBEUykge1xuICAgICAgICAgICAgICAgIG91dCArPSBwYXJzZUVudlZhcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBvdXQgKz0gYztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0dsb2IpIHJldHVybiB7b3A6ICdnbG9iJywgcGF0dGVybjogb3V0fTtcblxuICAgICAgICByZXR1cm4gb3V0O1xuXG4gICAgICAgIGZ1bmN0aW9uIHBhcnNlRW52VmFyKCkge1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgdmFyIHZhcmVuZCwgdmFybmFtZTtcbiAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgIGlmIChzLmNoYXJBdChpKSA9PT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIGlmIChzLmNoYXJBdChpKSA9PT0gJ30nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCBzdWJzdGl0dXRpb246IFwiICsgcy5zdWJzdHIoaSAtIDIsIDMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyZW5kID0gcy5pbmRleE9mKCd9JywgaSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhcmVuZCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIHN1YnN0aXR1dGlvbjogXCIgKyBzLnN1YnN0cihpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhcm5hbWUgPSBzLnN1YnN0cihpLCB2YXJlbmQgLSBpKTtcbiAgICAgICAgICAgICAgICBpID0gdmFyZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoL1sqQCM/JCFfXFwtXS8udGVzdChzLmNoYXJBdChpKSkpIHtcbiAgICAgICAgICAgICAgICB2YXJuYW1lID0gcy5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyZW5kID0gcy5zdWJzdHIoaSkubWF0Y2goL1teXFx3XFxkX10vKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmVuZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXJuYW1lID0gcy5zdWJzdHIoaSk7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXJuYW1lID0gcy5zdWJzdHIoaSwgdmFyZW5kLmluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgaSArPSB2YXJlbmQuaW5kZXggLSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZXRWYXIobnVsbCwgJycsIHZhcm5hbWUpO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAvLyBmaW5hbGl6ZSBwYXJzZWQgYXJ1bWVudHNcbiAgICAucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGFyZyl7XG4gICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJldi5jb25jYXQoYXJnKTtcbiAgICB9LFtdKTtcblxuICAgIGZ1bmN0aW9uIGdldFZhciAoXywgcHJlLCBrZXkpIHtcbiAgICAgICAgdmFyIHIgPSB0eXBlb2YgZW52ID09PSAnZnVuY3Rpb24nID8gZW52KGtleSkgOiBlbnZba2V5XTtcbiAgICAgICAgaWYgKHIgPT09IHVuZGVmaW5lZCAmJiBrZXkgIT0gJycpXG4gICAgICAgICAgICByID0gJyc7XG4gICAgICAgIGVsc2UgaWYgKHIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHIgPSAnJCc7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIHByZSArIFRPS0VOICsgSlNPTi5zdHJpbmdpZnkocikgKyBUT0tFTjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHJldHVybiBwcmUgKyByO1xuICAgIH1cbn1cblxudmFyIG9zeCA9IHtcbiAgJy9BcHBsaWNhdGlvbnMvQXRvbS5hcHAvQ29udGVudHMvTWFjT1MvQXRvbSc6ICdhdG9tJyxcbiAgJy9BcHBsaWNhdGlvbnMvQXRvbSBCZXRhLmFwcC9Db250ZW50cy9NYWNPUy9BdG9tIEJldGEnOlxuICAgICcvQXBwbGljYXRpb25zL0F0b20gQmV0YS5hcHAvQ29udGVudHMvTWFjT1MvQXRvbSBCZXRhJyxcbiAgJy9BcHBsaWNhdGlvbnMvQnJhY2tldHMuYXBwL0NvbnRlbnRzL01hY09TL0JyYWNrZXRzJzogJ2JyYWNrZXRzJyxcbiAgJy9BcHBsaWNhdGlvbnMvU3VibGltZSBUZXh0LmFwcC9Db250ZW50cy9NYWNPUy9TdWJsaW1lIFRleHQnOlxuICAgICcvQXBwbGljYXRpb25zL1N1YmxpbWUgVGV4dC5hcHAvQ29udGVudHMvU2hhcmVkU3VwcG9ydC9iaW4vc3VibCcsXG4gICcvQXBwbGljYXRpb25zL1N1YmxpbWUgVGV4dC5hcHAvQ29udGVudHMvTWFjT1Mvc3VibGltZV90ZXh0JzpcbiAgICAnL0FwcGxpY2F0aW9ucy9TdWJsaW1lIFRleHQuYXBwL0NvbnRlbnRzL1NoYXJlZFN1cHBvcnQvYmluL3N1YmwnLFxuICAnL0FwcGxpY2F0aW9ucy9TdWJsaW1lIFRleHQgMi5hcHAvQ29udGVudHMvTWFjT1MvU3VibGltZSBUZXh0IDInOlxuICAgICcvQXBwbGljYXRpb25zL1N1YmxpbWUgVGV4dCAyLmFwcC9Db250ZW50cy9TaGFyZWRTdXBwb3J0L2Jpbi9zdWJsJyxcbiAgJy9BcHBsaWNhdGlvbnMvU3VibGltZSBUZXh0IERldi5hcHAvQ29udGVudHMvTWFjT1MvU3VibGltZSBUZXh0JzpcbiAgICAnL0FwcGxpY2F0aW9ucy9TdWJsaW1lIFRleHQgRGV2LmFwcC9Db250ZW50cy9TaGFyZWRTdXBwb3J0L2Jpbi9zdWJsJyxcbiAgJy9BcHBsaWNhdGlvbnMvVmlzdWFsIFN0dWRpbyBDb2RlLmFwcC9Db250ZW50cy9NYWNPUy9FbGVjdHJvbic6ICdjb2RlJyxcbiAgJy9BcHBsaWNhdGlvbnMvVmlzdWFsIFN0dWRpbyBDb2RlIC0gSW5zaWRlcnMuYXBwL0NvbnRlbnRzL01hY09TL0VsZWN0cm9uJzpcbiAgICAnY29kZS1pbnNpZGVycycsXG4gICcvQXBwbGljYXRpb25zL1ZTQ29kaXVtLmFwcC9Db250ZW50cy9NYWNPUy9FbGVjdHJvbic6ICdjb2RpdW0nLFxuICAnL0FwcGxpY2F0aW9ucy9BcHBDb2RlLmFwcC9Db250ZW50cy9NYWNPUy9hcHBjb2RlJzpcbiAgICAnL0FwcGxpY2F0aW9ucy9BcHBDb2RlLmFwcC9Db250ZW50cy9NYWNPUy9hcHBjb2RlJyxcbiAgJy9BcHBsaWNhdGlvbnMvQ0xpb24uYXBwL0NvbnRlbnRzL01hY09TL2NsaW9uJzpcbiAgICAnL0FwcGxpY2F0aW9ucy9DTGlvbi5hcHAvQ29udGVudHMvTWFjT1MvY2xpb24nLFxuICAnL0FwcGxpY2F0aW9ucy9JbnRlbGxpSiBJREVBLmFwcC9Db250ZW50cy9NYWNPUy9pZGVhJzpcbiAgICAnL0FwcGxpY2F0aW9ucy9JbnRlbGxpSiBJREVBLmFwcC9Db250ZW50cy9NYWNPUy9pZGVhJyxcbiAgJy9BcHBsaWNhdGlvbnMvUGhwU3Rvcm0uYXBwL0NvbnRlbnRzL01hY09TL3BocHN0b3JtJzpcbiAgICAnL0FwcGxpY2F0aW9ucy9QaHBTdG9ybS5hcHAvQ29udGVudHMvTWFjT1MvcGhwc3Rvcm0nLFxuICAnL0FwcGxpY2F0aW9ucy9QeUNoYXJtLmFwcC9Db250ZW50cy9NYWNPUy9weWNoYXJtJzpcbiAgICAnL0FwcGxpY2F0aW9ucy9QeUNoYXJtLmFwcC9Db250ZW50cy9NYWNPUy9weWNoYXJtJyxcbiAgJy9BcHBsaWNhdGlvbnMvUHlDaGFybSBDRS5hcHAvQ29udGVudHMvTWFjT1MvcHljaGFybSc6XG4gICAgJy9BcHBsaWNhdGlvbnMvUHlDaGFybSBDRS5hcHAvQ29udGVudHMvTWFjT1MvcHljaGFybScsXG4gICcvQXBwbGljYXRpb25zL1J1YnlNaW5lLmFwcC9Db250ZW50cy9NYWNPUy9ydWJ5bWluZSc6XG4gICAgJy9BcHBsaWNhdGlvbnMvUnVieU1pbmUuYXBwL0NvbnRlbnRzL01hY09TL3J1YnltaW5lJyxcbiAgJy9BcHBsaWNhdGlvbnMvV2ViU3Rvcm0uYXBwL0NvbnRlbnRzL01hY09TL3dlYnN0b3JtJzpcbiAgICAnL0FwcGxpY2F0aW9ucy9XZWJTdG9ybS5hcHAvQ29udGVudHMvTWFjT1Mvd2Vic3Rvcm0nLFxuICAnL0FwcGxpY2F0aW9ucy9NYWNWaW0uYXBwL0NvbnRlbnRzL01hY09TL01hY1ZpbSc6ICdtdmltJyxcbiAgJy9BcHBsaWNhdGlvbnMvR29MYW5kLmFwcC9Db250ZW50cy9NYWNPUy9nb2xhbmQnOlxuICAgICcvQXBwbGljYXRpb25zL0dvTGFuZC5hcHAvQ29udGVudHMvTWFjT1MvZ29sYW5kJyxcbiAgJy9BcHBsaWNhdGlvbnMvUmlkZXIuYXBwL0NvbnRlbnRzL01hY09TL3JpZGVyJzpcbiAgICAnL0FwcGxpY2F0aW9ucy9SaWRlci5hcHAvQ29udGVudHMvTWFjT1MvcmlkZXInXG59O1xuXG52YXIgbGludXggPSB7XG4gIGF0b206ICdhdG9tJyxcbiAgQnJhY2tldHM6ICdicmFja2V0cycsXG4gIGNvZGU6ICdjb2RlJyxcbiAgJ2NvZGUtaW5zaWRlcnMnOiAnY29kZS1pbnNpZGVycycsXG4gIGNvZGl1bTogJ2NvZGl1bScsXG4gIHZzY29kaXVtOiAndnNjb2RpdW0nLFxuICBlbWFjczogJ2VtYWNzJyxcbiAgZ3ZpbTogJ2d2aW0nLFxuICAnaWRlYS5zaCc6ICdpZGVhJyxcbiAgJ3BocHN0b3JtLnNoJzogJ3BocHN0b3JtJyxcbiAgJ3B5Y2hhcm0uc2gnOiAncHljaGFybScsXG4gICdydWJ5bWluZS5zaCc6ICdydWJ5bWluZScsXG4gIHN1YmxpbWVfdGV4dDogJ3N1YmwnLFxuICB2aW06ICd2aW0nLFxuICAnd2Vic3Rvcm0uc2gnOiAnd2Vic3Rvcm0nLFxuICAnZ29sYW5kLnNoJzogJ2dvbGFuZCcsXG4gICdyaWRlci5zaCc6ICdyaWRlcidcbn07XG5cbnZhciB3aW5kb3dzJDEgPSBbXG4gICdCcmFja2V0cy5leGUnLFxuICAnQ29kZS5leGUnLFxuICAnQ29kZSAtIEluc2lkZXJzLmV4ZScsXG4gICdWU0NvZGl1bS5leGUnLFxuICAnYXRvbS5leGUnLFxuICAnc3VibGltZV90ZXh0LmV4ZScsXG4gICdub3RlcGFkKysuZXhlJyxcbiAgJ2NsaW9uLmV4ZScsXG4gICdjbGlvbjY0LmV4ZScsXG4gICdpZGVhLmV4ZScsXG4gICdpZGVhNjQuZXhlJyxcbiAgJ3BocHN0b3JtLmV4ZScsXG4gICdwaHBzdG9ybTY0LmV4ZScsXG4gICdweWNoYXJtLmV4ZScsXG4gICdweWNoYXJtNjQuZXhlJyxcbiAgJ3J1YnltaW5lLmV4ZScsXG4gICdydWJ5bWluZTY0LmV4ZScsXG4gICd3ZWJzdG9ybS5leGUnLFxuICAnd2Vic3Rvcm02NC5leGUnLFxuICAnZ29sYW5kLmV4ZScsXG4gICdnb2xhbmQ2NC5leGUnLFxuICAncmlkZXIuZXhlJyxcbiAgJ3JpZGVyNjQuZXhlJ1xuXTtcblxuY29uc3QgcGF0aCQ3ID0gcmVxdWlyZSQkMCQ0O1xuY29uc3Qgc2hlbGxRdW90ZSA9IHNoZWxsUXVvdGUkMTtcbmNvbnN0IGNoaWxkUHJvY2VzcyQyID0gcmVxdWlyZSQkMiQxO1xuXG4vLyBNYXAgZnJvbSBmdWxsIHByb2Nlc3MgbmFtZSB0byBiaW5hcnkgdGhhdCBzdGFydHMgdGhlIHByb2Nlc3Ncbi8vIFdlIGNhbid0IGp1c3QgcmUtdXNlIGZ1bGwgcHJvY2VzcyBuYW1lLCBiZWNhdXNlIGl0IHdpbGwgc3Bhd24gYSBuZXcgaW5zdGFuY2Vcbi8vIG9mIHRoZSBhcHAgZXZlcnkgdGltZVxuY29uc3QgQ09NTU9OX0VESVRPUlNfT1NYID0gb3N4O1xuY29uc3QgQ09NTU9OX0VESVRPUlNfTElOVVggPSBsaW51eDtcbmNvbnN0IENPTU1PTl9FRElUT1JTX1dJTiA9IHdpbmRvd3MkMTtcblxudmFyIGd1ZXNzID0gZnVuY3Rpb24gZ3Vlc3NFZGl0b3IgKHNwZWNpZmllZEVkaXRvcikge1xuICBpZiAoc3BlY2lmaWVkRWRpdG9yKSB7XG4gICAgcmV0dXJuIHNoZWxsUXVvdGUucGFyc2Uoc3BlY2lmaWVkRWRpdG9yKVxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52LkxBVU5DSF9FRElUT1IpIHtcbiAgICByZXR1cm4gW3Byb2Nlc3MuZW52LkxBVU5DSF9FRElUT1JdXG4gIH1cblxuICBpZiAocHJvY2Vzcy52ZXJzaW9ucy53ZWJjb250YWluZXIpIHtcbiAgICByZXR1cm4gW3Byb2Nlc3MuZW52LkVESVRPUiB8fCAnY29kZSddXG4gIH1cblxuICAvLyBXZSBjYW4gZmluZCBvdXQgd2hpY2ggZWRpdG9yIGlzIGN1cnJlbnRseSBydW5uaW5nIGJ5OlxuICAvLyBgcHMgeGAgb24gbWFjT1MgYW5kIExpbnV4XG4gIC8vIGBHZXQtUHJvY2Vzc2Agb24gV2luZG93c1xuICB0cnkge1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gY2hpbGRQcm9jZXNzJDJcbiAgICAgICAgLmV4ZWNTeW5jKCdwcyB4IC1vIGNvbW09Jywge1xuICAgICAgICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdpZ25vcmUnXVxuICAgICAgICB9KVxuICAgICAgICAudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHByb2Nlc3NOYW1lcyA9IE9iamVjdC5rZXlzKENPTU1PTl9FRElUT1JTX09TWCk7XG4gICAgICBjb25zdCBwcm9jZXNzTGlzdCA9IG91dHB1dC5zcGxpdCgnXFxuJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwcm9jZXNzTmFtZSA9IHByb2Nlc3NOYW1lc1tpXTtcbiAgICAgICAgLy8gRmluZCBlZGl0b3IgYnkgZXhhY3QgbWF0Y2guXG4gICAgICAgIGlmIChvdXRwdXQuaW5kZXhPZihwcm9jZXNzTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIFtDT01NT05fRURJVE9SU19PU1hbcHJvY2Vzc05hbWVdXVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb2Nlc3NOYW1lV2l0aG91dEFwcGxpY2F0aW9ucyA9IHByb2Nlc3NOYW1lLnJlcGxhY2UoJy9BcHBsaWNhdGlvbnMnLCAnJyk7XG4gICAgICAgIC8vIEZpbmQgZWRpdG9yIGluc3RhbGxhdGlvbiBub3QgaW4gL0FwcGxpY2F0aW9ucy5cbiAgICAgICAgaWYgKG91dHB1dC5pbmRleE9mKHByb2Nlc3NOYW1lV2l0aG91dEFwcGxpY2F0aW9ucykgIT09IC0xKSB7XG4gICAgICAgICAgLy8gVXNlIHRoZSBDTEkgY29tbWFuZCBpZiBvbmUgaXMgc3BlY2lmaWVkXG4gICAgICAgICAgaWYgKHByb2Nlc3NOYW1lICE9PSBDT01NT05fRURJVE9SU19PU1hbcHJvY2Vzc05hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm4gW0NPTU1PTl9FRElUT1JTX09TWFtwcm9jZXNzTmFtZV1dXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFVzZSBhIHBhcnRpYWwgbWF0Y2ggdG8gZmluZCB0aGUgcnVubmluZyBwcm9jZXNzIHBhdGguICBJZiBvbmUgaXMgZm91bmQsIHVzZSB0aGVcbiAgICAgICAgICAvLyBleGlzdGluZyBwYXRoIHNpbmNlIGl0IGNhbiBiZSBydW5uaW5nIGZyb20gYW55d2hlcmUuXG4gICAgICAgICAgY29uc3QgcnVubmluZ1Byb2Nlc3MgPSBwcm9jZXNzTGlzdC5maW5kKChwcm9jTmFtZSkgPT4gcHJvY05hbWUuZW5kc1dpdGgocHJvY2Vzc05hbWVXaXRob3V0QXBwbGljYXRpb25zKSk7XG4gICAgICAgICAgaWYgKHJ1bm5pbmdQcm9jZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbcnVubmluZ1Byb2Nlc3NdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBjaGlsZFByb2Nlc3MkMlxuICAgICAgICAuZXhlY1N5bmMoXG4gICAgICAgICAgJ3Bvd2Vyc2hlbGwgLU5vUHJvZmlsZSAtQ29tbWFuZCBcIkdldC1DaW1JbnN0YW5jZSAtUXVlcnkgXFxcXFwic2VsZWN0IGV4ZWN1dGFibGVwYXRoIGZyb20gd2luMzJfcHJvY2VzcyB3aGVyZSBleGVjdXRhYmxlcGF0aCBpcyBub3QgbnVsbFxcXFxcIiB8ICUgeyAkXy5FeGVjdXRhYmxlUGF0aCB9XCInLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdpZ25vcmUnXVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgICAudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHJ1bm5pbmdQcm9jZXNzZXMgPSBvdXRwdXQuc3BsaXQoJ1xcclxcbicpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydW5uaW5nUHJvY2Vzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQcm9jZXNzUGF0aCA9IHJ1bm5pbmdQcm9jZXNzZXNbaV0udHJpbSgpO1xuICAgICAgICBjb25zdCBzaG9ydFByb2Nlc3NOYW1lID0gcGF0aCQ3LmJhc2VuYW1lKGZ1bGxQcm9jZXNzUGF0aCk7XG5cbiAgICAgICAgaWYgKENPTU1PTl9FRElUT1JTX1dJTi5pbmRleE9mKHNob3J0UHJvY2Vzc05hbWUpICE9PSAtMSkge1xuICAgICAgICAgIHJldHVybiBbZnVsbFByb2Nlc3NQYXRoXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gICAgICAvLyAtLW5vLWhlYWRpbmcgTm8gaGVhZGVyIGxpbmVcbiAgICAgIC8vIHggTGlzdCBhbGwgcHJvY2Vzc2VzIG93bmVkIGJ5IHlvdVxuICAgICAgLy8gLW8gY29tbSBOZWVkIG9ubHkgbmFtZXMgY29sdW1uXG4gICAgICBjb25zdCBvdXRwdXQgPSBjaGlsZFByb2Nlc3MkMlxuICAgICAgICAuZXhlY1N5bmMoJ3BzIHggLS1uby1oZWFkaW5nIC1vIGNvbW0gLS1zb3J0PWNvbW0nLCB7XG4gICAgICAgICAgc3RkaW86IFsncGlwZScsICdwaXBlJywgJ2lnbm9yZSddXG4gICAgICAgIH0pXG4gICAgICAgIC50b1N0cmluZygpO1xuICAgICAgY29uc3QgcHJvY2Vzc05hbWVzID0gT2JqZWN0LmtleXMoQ09NTU9OX0VESVRPUlNfTElOVVgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJvY2Vzc05hbWUgPSBwcm9jZXNzTmFtZXNbaV07XG4gICAgICAgIGlmIChvdXRwdXQuaW5kZXhPZihwcm9jZXNzTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIFtDT01NT05fRURJVE9SU19MSU5VWFtwcm9jZXNzTmFtZV1dXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gSWdub3JlLi4uXG4gIH1cblxuICAvLyBMYXN0IHJlc29ydCwgdXNlIG9sZCBza29vbCBlbnYgdmFyc1xuICBpZiAocHJvY2Vzcy5lbnYuVklTVUFMKSB7XG4gICAgcmV0dXJuIFtwcm9jZXNzLmVudi5WSVNVQUxdXG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuRURJVE9SKSB7XG4gICAgcmV0dXJuIFtwcm9jZXNzLmVudi5FRElUT1JdXG4gIH1cblxuICByZXR1cm4gW251bGxdXG59O1xuXG5jb25zdCBwYXRoJDYgPSByZXF1aXJlJCQwJDQ7XG5cbi8vIG5vcm1hbGl6ZSBmaWxlL2xpbmUgbnVtYmVycyBpbnRvIGNvbW1hbmQgbGluZSBhcmdzIGZvciBzcGVjaWZpYyBlZGl0b3JzXG52YXIgZ2V0QXJncyA9IGZ1bmN0aW9uIGdldEFyZ3VtZW50c0ZvclBvc2l0aW9uIChcbiAgZWRpdG9yLFxuICBmaWxlTmFtZSxcbiAgbGluZU51bWJlcixcbiAgY29sdW1uTnVtYmVyID0gMVxuKSB7XG4gIGNvbnN0IGVkaXRvckJhc2VuYW1lID0gcGF0aCQ2LmJhc2VuYW1lKGVkaXRvcikucmVwbGFjZSgvXFwuKGV4ZXxjbWR8YmF0KSQvaSwgJycpO1xuICBzd2l0Y2ggKGVkaXRvckJhc2VuYW1lKSB7XG4gICAgY2FzZSAnYXRvbSc6XG4gICAgY2FzZSAnQXRvbSc6XG4gICAgY2FzZSAnQXRvbSBCZXRhJzpcbiAgICBjYXNlICdzdWJsJzpcbiAgICBjYXNlICdzdWJsaW1lJzpcbiAgICBjYXNlICdzdWJsaW1lX3RleHQnOlxuICAgIGNhc2UgJ3dzdG9ybSc6XG4gICAgY2FzZSAnY2hhcm0nOlxuICAgICAgcmV0dXJuIFtgJHtmaWxlTmFtZX06JHtsaW5lTnVtYmVyfToke2NvbHVtbk51bWJlcn1gXVxuICAgIGNhc2UgJ25vdGVwYWQrKyc6XG4gICAgICByZXR1cm4gWyctbicgKyBsaW5lTnVtYmVyLCAnLWMnICsgY29sdW1uTnVtYmVyLCBmaWxlTmFtZV1cbiAgICBjYXNlICd2aW0nOlxuICAgIGNhc2UgJ212aW0nOlxuICAgICAgcmV0dXJuIFtgK2NhbGwgY3Vyc29yKCR7bGluZU51bWJlcn0sICR7Y29sdW1uTnVtYmVyfSlgLCBmaWxlTmFtZV1cbiAgICBjYXNlICdqb2UnOlxuICAgIGNhc2UgJ2d2aW0nOlxuICAgICAgcmV0dXJuIFsnKycgKyBgJHtsaW5lTnVtYmVyfWAsIGZpbGVOYW1lXVxuICAgIGNhc2UgJ2VtYWNzJzpcbiAgICBjYXNlICdlbWFjc2NsaWVudCc6XG4gICAgICByZXR1cm4gW2ArJHtsaW5lTnVtYmVyfToke2NvbHVtbk51bWJlcn1gLCBmaWxlTmFtZV1cbiAgICBjYXNlICdybWF0ZSc6XG4gICAgY2FzZSAnbWF0ZSc6XG4gICAgY2FzZSAnbWluZSc6XG4gICAgICByZXR1cm4gWyctLWxpbmUnLCBsaW5lTnVtYmVyLCBmaWxlTmFtZV1cbiAgICBjYXNlICdjb2RlJzpcbiAgICBjYXNlICdDb2RlJzpcbiAgICBjYXNlICdjb2RlLWluc2lkZXJzJzpcbiAgICBjYXNlICdDb2RlIC0gSW5zaWRlcnMnOlxuICAgIGNhc2UgJ2NvZGl1bSc6XG4gICAgY2FzZSAndnNjb2RpdW0nOlxuICAgIGNhc2UgJ1ZTQ29kaXVtJzpcbiAgICAgIHJldHVybiBbJy1yJywgJy1nJywgYCR7ZmlsZU5hbWV9OiR7bGluZU51bWJlcn06JHtjb2x1bW5OdW1iZXJ9YF1cbiAgICBjYXNlICdhcHBjb2RlJzpcbiAgICBjYXNlICdjbGlvbic6XG4gICAgY2FzZSAnY2xpb242NCc6XG4gICAgY2FzZSAnaWRlYSc6XG4gICAgY2FzZSAnaWRlYTY0JzpcbiAgICBjYXNlICdwaHBzdG9ybSc6XG4gICAgY2FzZSAncGhwc3Rvcm02NCc6XG4gICAgY2FzZSAncHljaGFybSc6XG4gICAgY2FzZSAncHljaGFybTY0JzpcbiAgICBjYXNlICdydWJ5bWluZSc6XG4gICAgY2FzZSAncnVieW1pbmU2NCc6XG4gICAgY2FzZSAnd2Vic3Rvcm0nOlxuICAgIGNhc2UgJ3dlYnN0b3JtNjQnOlxuICAgIGNhc2UgJ2dvbGFuZCc6XG4gICAgY2FzZSAnZ29sYW5kNjQnOlxuICAgIGNhc2UgJ3JpZGVyJzpcbiAgICBjYXNlICdyaWRlcjY0JzpcbiAgICAgIHJldHVybiBbJy0tbGluZScsIGxpbmVOdW1iZXIsICctLWNvbHVtbicsIGNvbHVtbk51bWJlciwgZmlsZU5hbWVdXG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTEFVTkNIX0VESVRPUikge1xuICAgIHJldHVybiBbZmlsZU5hbWUsIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlcl1cbiAgfVxuXG4gIC8vIEZvciBhbGwgb3RoZXJzLCBkcm9wIHRoZSBsaW5lTnVtYmVyIHVudGlsIHdlIGhhdmVcbiAgLy8gYSBtYXBwaW5nIGFib3ZlLCBzaW5jZSBwcm92aWRpbmcgdGhlIGxpbmVOdW1iZXIgaW5jb3JyZWN0bHlcbiAgLy8gY2FuIHJlc3VsdCBpbiBlcnJvcnMgb3IgY29uZnVzaW5nIGJlaGF2aW9yLlxuICByZXR1cm4gW2ZpbGVOYW1lXVxufTtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29raW5jdWJhdG9yL2NyZWF0ZS1yZWFjdC1hcHAvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICpcbiAqIE1vZGlmaWVkIGJ5IFl1eGkgRXZhbiBZb3VcbiAqL1xuXG5jb25zdCBmcyQ0ID0gcmVxdWlyZSQkMF9fZGVmYXVsdDtcbmNvbnN0IG9zJDEgPSByZXF1aXJlJCQyO1xuY29uc3QgcGF0aCQ1ID0gcmVxdWlyZSQkMCQ0O1xuY29uc3QgY29sb3JzID0gcGljb2NvbG9yc0V4cG9ydHM7XG5jb25zdCBjaGlsZFByb2Nlc3MkMSA9IHJlcXVpcmUkJDIkMTtcblxuY29uc3QgZ3Vlc3NFZGl0b3IgPSBndWVzcztcbmNvbnN0IGdldEFyZ3VtZW50c0ZvclBvc2l0aW9uID0gZ2V0QXJncztcblxuZnVuY3Rpb24gd3JhcEVycm9yQ2FsbGJhY2sgKGNiKSB7XG4gIHJldHVybiAoZmlsZU5hbWUsIGVycm9yTWVzc2FnZSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjb2xvcnMucmVkKCdDb3VsZCBub3Qgb3BlbiAnICsgcGF0aCQ1LmJhc2VuYW1lKGZpbGVOYW1lKSArICcgaW4gdGhlIGVkaXRvci4nKVxuICAgICk7XG4gICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgaWYgKGVycm9yTWVzc2FnZVtlcnJvck1lc3NhZ2UubGVuZ3RoIC0gMV0gIT09ICcuJykge1xuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gJy4nO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNvbG9ycy5yZWQoJ1RoZSBlZGl0b3IgcHJvY2VzcyBleGl0ZWQgd2l0aCBhbiBlcnJvcjogJyArIGVycm9yTWVzc2FnZSlcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgaWYgKGNiKSBjYihmaWxlTmFtZSwgZXJyb3JNZXNzYWdlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1Rlcm1pbmFsRWRpdG9yIChlZGl0b3IpIHtcbiAgc3dpdGNoIChlZGl0b3IpIHtcbiAgICBjYXNlICd2aW0nOlxuICAgIGNhc2UgJ2VtYWNzJzpcbiAgICBjYXNlICduYW5vJzpcbiAgICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IHBvc2l0aW9uUkUgPSAvOihcXGQrKSg6KFxcZCspKT8kLztcbmZ1bmN0aW9uIHBhcnNlRmlsZSAoZmlsZSkge1xuICBjb25zdCBmaWxlTmFtZSA9IGZpbGUucmVwbGFjZShwb3NpdGlvblJFLCAnJyk7XG4gIGNvbnN0IG1hdGNoID0gZmlsZS5tYXRjaChwb3NpdGlvblJFKTtcbiAgY29uc3QgbGluZU51bWJlciA9IG1hdGNoICYmIG1hdGNoWzFdO1xuICBjb25zdCBjb2x1bW5OdW1iZXIgPSBtYXRjaCAmJiBtYXRjaFszXTtcbiAgcmV0dXJuIHtcbiAgICBmaWxlTmFtZSxcbiAgICBsaW5lTnVtYmVyLFxuICAgIGNvbHVtbk51bWJlclxuICB9XG59XG5cbmxldCBfY2hpbGRQcm9jZXNzID0gbnVsbDtcblxuZnVuY3Rpb24gbGF1bmNoRWRpdG9yIChmaWxlLCBzcGVjaWZpZWRFZGl0b3IsIG9uRXJyb3JDYWxsYmFjaykge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUZpbGUoZmlsZSk7XG4gIGxldCB7IGZpbGVOYW1lIH0gPSBwYXJzZWQ7XG4gIGNvbnN0IHsgbGluZU51bWJlciwgY29sdW1uTnVtYmVyIH0gPSBwYXJzZWQ7XG5cbiAgaWYgKCFmcyQ0LmV4aXN0c1N5bmMoZmlsZU5hbWUpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodHlwZW9mIHNwZWNpZmllZEVkaXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9uRXJyb3JDYWxsYmFjayA9IHNwZWNpZmllZEVkaXRvcjtcbiAgICBzcGVjaWZpZWRFZGl0b3IgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBvbkVycm9yQ2FsbGJhY2sgPSB3cmFwRXJyb3JDYWxsYmFjayhvbkVycm9yQ2FsbGJhY2spO1xuXG4gIGNvbnN0IFtlZGl0b3IsIC4uLmFyZ3NdID0gZ3Vlc3NFZGl0b3Ioc3BlY2lmaWVkRWRpdG9yKTtcbiAgaWYgKCFlZGl0b3IpIHtcbiAgICBvbkVycm9yQ2FsbGJhY2soZmlsZU5hbWUsIG51bGwpO1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKFxuICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICdsaW51eCcgJiZcbiAgICBmaWxlTmFtZS5zdGFydHNXaXRoKCcvbW50LycpICYmXG4gICAgL01pY3Jvc29mdC9pLnRlc3Qob3MkMS5yZWxlYXNlKCkpXG4gICkge1xuICAgIC8vIEFzc3VtZSBXU0wgLyBcIkJhc2ggb24gVWJ1bnR1IG9uIFdpbmRvd3NcIiBpcyBiZWluZyB1c2VkLCBhbmRcbiAgICAvLyB0aGF0IHRoZSBmaWxlIGV4aXN0cyBvbiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbS5cbiAgICAvLyBgb3MucmVsZWFzZSgpYCBpcyBcIjQuNC4wLTQzLU1pY3Jvc29mdFwiIGluIHRoZSBjdXJyZW50IHJlbGVhc2VcbiAgICAvLyBidWlsZCBvZiBXU0wsIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9CYXNoT25XaW5kb3dzL2lzc3Vlcy80MjMjaXNzdWVjb21tZW50LTIyMTYyNzM2NFxuICAgIC8vIFdoZW4gYSBXaW5kb3dzIGVkaXRvciBpcyBzcGVjaWZpZWQsIGludGVyb3AgZnVuY3Rpb25hbGl0eSBjYW5cbiAgICAvLyBoYW5kbGUgdGhlIHBhdGggdHJhbnNsYXRpb24sIGJ1dCBvbmx5IGlmIGEgcmVsYXRpdmUgcGF0aCBpcyB1c2VkLlxuICAgIGZpbGVOYW1lID0gcGF0aCQ1LnJlbGF0aXZlKCcnLCBmaWxlTmFtZSk7XG4gIH1cblxuICBpZiAobGluZU51bWJlcikge1xuICAgIGNvbnN0IGV4dHJhQXJncyA9IGdldEFyZ3VtZW50c0ZvclBvc2l0aW9uKGVkaXRvciwgZmlsZU5hbWUsIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlcik7XG4gICAgYXJncy5wdXNoLmFwcGx5KGFyZ3MsIGV4dHJhQXJncyk7XG4gIH0gZWxzZSB7XG4gICAgYXJncy5wdXNoKGZpbGVOYW1lKTtcbiAgfVxuXG4gIGlmIChfY2hpbGRQcm9jZXNzICYmIGlzVGVybWluYWxFZGl0b3IoZWRpdG9yKSkge1xuICAgIC8vIFRoZXJlJ3MgYW4gZXhpc3RpbmcgZWRpdG9yIHByb2Nlc3MgYWxyZWFkeSBhbmQgaXQncyBhdHRhY2hlZFxuICAgIC8vIHRvIHRoZSB0ZXJtaW5hbCwgc28gZ28ga2lsbCBpdC4gT3RoZXJ3aXNlIHR3byBzZXBhcmF0ZSBlZGl0b3JcbiAgICAvLyBpbnN0YW5jZXMgYXR0YWNoIHRvIHRoZSBzdGRpbi9zdGRvdXQgd2hpY2ggZ2V0cyBjb25mdXNpbmcuXG4gICAgX2NoaWxkUHJvY2Vzcy5raWxsKCdTSUdLSUxMJyk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIC8vIE9uIFdpbmRvd3MsIGxhdW5jaCB0aGUgZWRpdG9yIGluIGEgc2hlbGwgYmVjYXVzZSBzcGF3biBjYW4gb25seVxuICAgIC8vIGxhdW5jaCAuZXhlIGZpbGVzLlxuICAgIF9jaGlsZFByb2Nlc3MgPSBjaGlsZFByb2Nlc3MkMS5zcGF3bihcbiAgICAgICdjbWQuZXhlJyxcbiAgICAgIFsnL0MnLCBlZGl0b3JdLmNvbmNhdChhcmdzKSxcbiAgICAgIHsgc3RkaW86ICdpbmhlcml0JyB9XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBfY2hpbGRQcm9jZXNzID0gY2hpbGRQcm9jZXNzJDEuc3Bhd24oZWRpdG9yLCBhcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gIH1cbiAgX2NoaWxkUHJvY2Vzcy5vbignZXhpdCcsIGZ1bmN0aW9uIChlcnJvckNvZGUpIHtcbiAgICBfY2hpbGRQcm9jZXNzID0gbnVsbDtcblxuICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgIG9uRXJyb3JDYWxsYmFjayhmaWxlTmFtZSwgJyhjb2RlICcgKyBlcnJvckNvZGUgKyAnKScpO1xuICAgIH1cbiAgfSk7XG5cbiAgX2NoaWxkUHJvY2Vzcy5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICBvbkVycm9yQ2FsbGJhY2soZmlsZU5hbWUsIGVycm9yLm1lc3NhZ2UpO1xuICB9KTtcbn1cblxudmFyIGxhdW5jaEVkaXRvcl8xID0gbGF1bmNoRWRpdG9yO1xuXG5jb25zdCB1cmwkMiA9IHJlcXVpcmUkJDAkOTtcbmNvbnN0IHBhdGgkNCA9IHJlcXVpcmUkJDAkNDtcbmNvbnN0IGxhdW5jaCA9IGxhdW5jaEVkaXRvcl8xO1xuXG52YXIgbGF1bmNoRWRpdG9yTWlkZGxld2FyZSA9IChzcGVjaWZpZWRFZGl0b3IsIHNyY1Jvb3QsIG9uRXJyb3JDYWxsYmFjaykgPT4ge1xuICBpZiAodHlwZW9mIHNwZWNpZmllZEVkaXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9uRXJyb3JDYWxsYmFjayA9IHNwZWNpZmllZEVkaXRvcjtcbiAgICBzcGVjaWZpZWRFZGl0b3IgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIHNyY1Jvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvbkVycm9yQ2FsbGJhY2sgPSBzcmNSb290O1xuICAgIHNyY1Jvb3QgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBzcmNSb290ID0gc3JjUm9vdCB8fCBwcm9jZXNzLmN3ZCgpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBsYXVuY2hFZGl0b3JNaWRkbGV3YXJlIChyZXEsIHJlcywgbmV4dCkge1xuICAgIGNvbnN0IHsgZmlsZSB9ID0gdXJsJDIucGFyc2UocmVxLnVybCwgdHJ1ZSkucXVlcnkgfHwge307XG4gICAgaWYgKCFmaWxlKSB7XG4gICAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICAgIHJlcy5lbmQoYGxhdW5jaC1lZGl0b3ItbWlkZGxld2FyZTogcmVxdWlyZWQgcXVlcnkgcGFyYW0gXCJmaWxlXCIgaXMgbWlzc2luZy5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF1bmNoKHBhdGgkNC5yZXNvbHZlKHNyY1Jvb3QsIGZpbGUpLCBzcGVjaWZpZWRFZGl0b3IsIG9uRXJyb3JDYWxsYmFjayk7XG4gICAgICByZXMuZW5kKCk7XG4gICAgfVxuICB9XG59O1xuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlSHR0cFNlcnZlcih7IHByb3h5IH0sIGFwcCwgaHR0cHNPcHRpb25zKSB7XG4gICAgaWYgKCFodHRwc09wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBjcmVhdGVTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpodHRwJyk7XG4gICAgICAgIHJldHVybiBjcmVhdGVTZXJ2ZXIoYXBwKTtcbiAgICB9XG4gICAgLy8gIzQ4NCBmYWxsYmFjayB0byBodHRwMSB3aGVuIHByb3h5IGlzIG5lZWRlZC5cbiAgICBpZiAocHJveHkpIHtcbiAgICAgICAgY29uc3QgeyBjcmVhdGVTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpodHRwcycpO1xuICAgICAgICByZXR1cm4gY3JlYXRlU2VydmVyKGh0dHBzT3B0aW9ucywgYXBwKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgY3JlYXRlU2VjdXJlU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6aHR0cDInKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNlY3VyZVNlcnZlcih7XG4gICAgICAgICAgICAvLyBNYW51YWxseSBpbmNyZWFzZSB0aGUgc2Vzc2lvbiBtZW1vcnkgdG8gcHJldmVudCA1MDIgRU5IQU5DRV9ZT1VSX0NBTE1cbiAgICAgICAgICAgIC8vIGVycm9ycyBvbiBsYXJnZSBudW1iZXJzIG9mIHJlcXVlc3RzXG4gICAgICAgICAgICBtYXhTZXNzaW9uTWVtb3J5OiAxMDAwLFxuICAgICAgICAgICAgLi4uaHR0cHNPcHRpb25zLFxuICAgICAgICAgICAgYWxsb3dIVFRQMTogdHJ1ZSxcbiAgICAgICAgfSwgXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogaXMgdGhpcyBjb3JyZWN0P1xuICAgICAgICBhcHApO1xuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVIdHRwc0NvbmZpZyhodHRwcykge1xuICAgIGlmICghaHR0cHMpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaHR0cHNPcHRpb24gPSBpc09iamVjdCQyKGh0dHBzKSA/IHsgLi4uaHR0cHMgfSA6IHt9O1xuICAgIGNvbnN0IHsgY2EsIGNlcnQsIGtleSwgcGZ4IH0gPSBodHRwc09wdGlvbjtcbiAgICBPYmplY3QuYXNzaWduKGh0dHBzT3B0aW9uLCB7XG4gICAgICAgIGNhOiByZWFkRmlsZUlmRXhpc3RzKGNhKSxcbiAgICAgICAgY2VydDogcmVhZEZpbGVJZkV4aXN0cyhjZXJ0KSxcbiAgICAgICAga2V5OiByZWFkRmlsZUlmRXhpc3RzKGtleSksXG4gICAgICAgIHBmeDogcmVhZEZpbGVJZkV4aXN0cyhwZngpLFxuICAgIH0pO1xuICAgIHJldHVybiBodHRwc09wdGlvbjtcbn1cbmZ1bmN0aW9uIHJlYWRGaWxlSWZFeGlzdHModmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGZzJGwucmVhZEZpbGVTeW5jKHBhdGgkby5yZXNvbHZlKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5hc3luYyBmdW5jdGlvbiBodHRwU2VydmVyU3RhcnQoaHR0cFNlcnZlciwgc2VydmVyT3B0aW9ucykge1xuICAgIGxldCB7IHBvcnQsIHN0cmljdFBvcnQsIGhvc3QsIGxvZ2dlciB9ID0gc2VydmVyT3B0aW9ucztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICAgICAgICAgIGlmIChzdHJpY3RQb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBTZXJ2ZXIucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZWApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBQb3J0ICR7cG9ydH0gaXMgaW4gdXNlLCB0cnlpbmcgYW5vdGhlciBvbmUuLi5gKTtcbiAgICAgICAgICAgICAgICAgICAgaHR0cFNlcnZlci5saXN0ZW4oKytwb3J0LCBob3N0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBodHRwU2VydmVyLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaHR0cFNlcnZlci5vbignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgaHR0cFNlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCwgKCkgPT4ge1xuICAgICAgICAgICAgaHR0cFNlcnZlci5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICAgIHJlc29sdmUocG9ydCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gc2V0Q2xpZW50RXJyb3JIYW5kbGVyKHNlcnZlciwgbG9nZ2VyKSB7XG4gICAgc2VydmVyLm9uKCdjbGllbnRFcnJvcicsIChlcnIsIHNvY2tldCkgPT4ge1xuICAgICAgICBsZXQgbXNnID0gJzQwMCBCYWQgUmVxdWVzdCc7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0hQRV9IRUFERVJfT1ZFUkZMT1cnKSB7XG4gICAgICAgICAgICBtc2cgPSAnNDMxIFJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2UnO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4ocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KCdTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggc3RhdHVzIGNvZGUgNDMxLiAnICtcbiAgICAgICAgICAgICAgICAnU2VlIGh0dHBzOi8vdml0ZWpzLmRldi9ndWlkZS90cm91Ymxlc2hvb3RpbmcuaHRtbCNfNDMxLXJlcXVlc3QtaGVhZGVyLWZpZWxkcy10b28tbGFyZ2UuJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VDT05OUkVTRVQnIHx8ICFzb2NrZXQud3JpdGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzb2NrZXQuZW5kKGBIVFRQLzEuMSAke21zZ31cXHJcXG5cXHJcXG5gKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnZXN0cmVlJykuTm9kZX0gTm9kZVxuICogQHR5cGVkZWYge3tcbiAqICAgc2tpcDogKCkgPT4gdm9pZDtcbiAqICAgcmVtb3ZlOiAoKSA9PiB2b2lkO1xuICogICByZXBsYWNlOiAobm9kZTogTm9kZSkgPT4gdm9pZDtcbiAqIH19IFdhbGtlckNvbnRleHRcbiAqL1xuXG5jbGFzcyBXYWxrZXJCYXNlIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0LyoqIEB0eXBlIHtib29sZWFufSAqL1xuXHRcdHRoaXMuc2hvdWxkX3NraXAgPSBmYWxzZTtcblxuXHRcdC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cblx0XHR0aGlzLnNob3VsZF9yZW1vdmUgPSBmYWxzZTtcblxuXHRcdC8qKiBAdHlwZSB7Tm9kZSB8IG51bGx9ICovXG5cdFx0dGhpcy5yZXBsYWNlbWVudCA9IG51bGw7XG5cblx0XHQvKiogQHR5cGUge1dhbGtlckNvbnRleHR9ICovXG5cdFx0dGhpcy5jb250ZXh0ID0ge1xuXHRcdFx0c2tpcDogKCkgPT4gKHRoaXMuc2hvdWxkX3NraXAgPSB0cnVlKSxcblx0XHRcdHJlbW92ZTogKCkgPT4gKHRoaXMuc2hvdWxkX3JlbW92ZSA9IHRydWUpLFxuXHRcdFx0cmVwbGFjZTogKG5vZGUpID0+ICh0aGlzLnJlcGxhY2VtZW50ID0gbm9kZSlcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEB0ZW1wbGF0ZSB7Tm9kZX0gUGFyZW50XG5cdCAqIEBwYXJhbSB7UGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50XG5cdCAqIEBwYXJhbSB7a2V5b2YgUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZH0gcHJvcFxuXHQgKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IGluZGV4XG5cdCAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuXHQgKi9cblx0cmVwbGFjZShwYXJlbnQsIHByb3AsIGluZGV4LCBub2RlKSB7XG5cdFx0aWYgKHBhcmVudCAmJiBwcm9wKSB7XG5cdFx0XHRpZiAoaW5kZXggIT0gbnVsbCkge1xuXHRcdFx0XHQvKiogQHR5cGUge0FycmF5PE5vZGU+fSAqLyAocGFyZW50W3Byb3BdKVtpbmRleF0gPSBub2RlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0LyoqIEB0eXBlIHtOb2RlfSAqLyAocGFyZW50W3Byb3BdKSA9IG5vZGU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEB0ZW1wbGF0ZSB7Tm9kZX0gUGFyZW50XG5cdCAqIEBwYXJhbSB7UGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZH0gcGFyZW50XG5cdCAqIEBwYXJhbSB7a2V5b2YgUGFyZW50IHwgbnVsbCB8IHVuZGVmaW5lZH0gcHJvcFxuXHQgKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IGluZGV4XG5cdCAqL1xuXHRyZW1vdmUocGFyZW50LCBwcm9wLCBpbmRleCkge1xuXHRcdGlmIChwYXJlbnQgJiYgcHJvcCkge1xuXHRcdFx0aWYgKGluZGV4ICE9PSBudWxsICYmIGluZGV4ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0LyoqIEB0eXBlIHtBcnJheTxOb2RlPn0gKi8gKHBhcmVudFtwcm9wXSkuc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBwYXJlbnRbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHR5cGVkZWYgeyBpbXBvcnQoJ2VzdHJlZScpLk5vZGV9IE5vZGVcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuL3dhbGtlci5qcycpLldhbGtlckNvbnRleHR9IFdhbGtlckNvbnRleHRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgICB0aGlzOiBXYWxrZXJDb250ZXh0LFxuICogICAgbm9kZTogTm9kZSxcbiAqICAgIHBhcmVudDogTm9kZSB8IG51bGwsXG4gKiAgICBrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCB8IG51bGwgfCB1bmRlZmluZWQsXG4gKiAgICBpbmRleDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZFxuICogKSA9PiB2b2lkfSBTeW5jSGFuZGxlclxuICovXG5cbmNsYXNzIFN5bmNXYWxrZXIgZXh0ZW5kcyBXYWxrZXJCYXNlIHtcblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3luY0hhbmRsZXJ9IFtlbnRlcl1cblx0ICogQHBhcmFtIHtTeW5jSGFuZGxlcn0gW2xlYXZlXVxuXHQgKi9cblx0Y29uc3RydWN0b3IoZW50ZXIsIGxlYXZlKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cblx0XHR0aGlzLnNob3VsZF9za2lwID0gZmFsc2U7XG5cblx0XHQvKiogQHR5cGUge2Jvb2xlYW59ICovXG5cdFx0dGhpcy5zaG91bGRfcmVtb3ZlID0gZmFsc2U7XG5cblx0XHQvKiogQHR5cGUge05vZGUgfCBudWxsfSAqL1xuXHRcdHRoaXMucmVwbGFjZW1lbnQgPSBudWxsO1xuXG5cdFx0LyoqIEB0eXBlIHtXYWxrZXJDb250ZXh0fSAqL1xuXHRcdHRoaXMuY29udGV4dCA9IHtcblx0XHRcdHNraXA6ICgpID0+ICh0aGlzLnNob3VsZF9za2lwID0gdHJ1ZSksXG5cdFx0XHRyZW1vdmU6ICgpID0+ICh0aGlzLnNob3VsZF9yZW1vdmUgPSB0cnVlKSxcblx0XHRcdHJlcGxhY2U6IChub2RlKSA9PiAodGhpcy5yZXBsYWNlbWVudCA9IG5vZGUpXG5cdFx0fTtcblxuXHRcdC8qKiBAdHlwZSB7U3luY0hhbmRsZXIgfCB1bmRlZmluZWR9ICovXG5cdFx0dGhpcy5lbnRlciA9IGVudGVyO1xuXG5cdFx0LyoqIEB0eXBlIHtTeW5jSGFuZGxlciB8IHVuZGVmaW5lZH0gKi9cblx0XHR0aGlzLmxlYXZlID0gbGVhdmU7XG5cdH1cblxuXHQvKipcblx0ICogQHRlbXBsYXRlIHtOb2RlfSBQYXJlbnRcblx0ICogQHBhcmFtIHtOb2RlfSBub2RlXG5cdCAqIEBwYXJhbSB7UGFyZW50IHwgbnVsbH0gcGFyZW50XG5cdCAqIEBwYXJhbSB7a2V5b2YgUGFyZW50fSBbcHJvcF1cblx0ICogQHBhcmFtIHtudW1iZXIgfCBudWxsfSBbaW5kZXhdXG5cdCAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cblx0ICovXG5cdHZpc2l0KG5vZGUsIHBhcmVudCwgcHJvcCwgaW5kZXgpIHtcblx0XHRpZiAobm9kZSkge1xuXHRcdFx0aWYgKHRoaXMuZW50ZXIpIHtcblx0XHRcdFx0Y29uc3QgX3Nob3VsZF9za2lwID0gdGhpcy5zaG91bGRfc2tpcDtcblx0XHRcdFx0Y29uc3QgX3Nob3VsZF9yZW1vdmUgPSB0aGlzLnNob3VsZF9yZW1vdmU7XG5cdFx0XHRcdGNvbnN0IF9yZXBsYWNlbWVudCA9IHRoaXMucmVwbGFjZW1lbnQ7XG5cdFx0XHRcdHRoaXMuc2hvdWxkX3NraXAgPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5zaG91bGRfcmVtb3ZlID0gZmFsc2U7XG5cdFx0XHRcdHRoaXMucmVwbGFjZW1lbnQgPSBudWxsO1xuXG5cdFx0XHRcdHRoaXMuZW50ZXIuY2FsbCh0aGlzLmNvbnRleHQsIG5vZGUsIHBhcmVudCwgcHJvcCwgaW5kZXgpO1xuXG5cdFx0XHRcdGlmICh0aGlzLnJlcGxhY2VtZW50KSB7XG5cdFx0XHRcdFx0bm9kZSA9IHRoaXMucmVwbGFjZW1lbnQ7XG5cdFx0XHRcdFx0dGhpcy5yZXBsYWNlKHBhcmVudCwgcHJvcCwgaW5kZXgsIG5vZGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuc2hvdWxkX3JlbW92ZSkge1xuXHRcdFx0XHRcdHRoaXMucmVtb3ZlKHBhcmVudCwgcHJvcCwgaW5kZXgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgc2tpcHBlZCA9IHRoaXMuc2hvdWxkX3NraXA7XG5cdFx0XHRcdGNvbnN0IHJlbW92ZWQgPSB0aGlzLnNob3VsZF9yZW1vdmU7XG5cblx0XHRcdFx0dGhpcy5zaG91bGRfc2tpcCA9IF9zaG91bGRfc2tpcDtcblx0XHRcdFx0dGhpcy5zaG91bGRfcmVtb3ZlID0gX3Nob3VsZF9yZW1vdmU7XG5cdFx0XHRcdHRoaXMucmVwbGFjZW1lbnQgPSBfcmVwbGFjZW1lbnQ7XG5cblx0XHRcdFx0aWYgKHNraXBwZWQpIHJldHVybiBub2RlO1xuXHRcdFx0XHRpZiAocmVtb3ZlZCkgcmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8qKiBAdHlwZSB7a2V5b2YgTm9kZX0gKi9cblx0XHRcdGxldCBrZXk7XG5cblx0XHRcdGZvciAoa2V5IGluIG5vZGUpIHtcblx0XHRcdFx0LyoqIEB0eXBlIHt1bmtub3dufSAqL1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcblxuXHRcdFx0XHRpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgbm9kZXMgPSAvKiogQHR5cGUge0FycmF5PHVua25vd24+fSAqLyAodmFsdWUpO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBpdGVtID0gbm9kZXNbaV07XG5cdFx0XHRcdFx0XHRcdGlmIChpc05vZGUoaXRlbSkpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIXRoaXMudmlzaXQoaXRlbSwgbm9kZSwga2V5LCBpKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlZFxuXHRcdFx0XHRcdFx0XHRcdFx0aS0tO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaXNOb2RlKHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0dGhpcy52aXNpdCh2YWx1ZSwgbm9kZSwga2V5LCBudWxsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMubGVhdmUpIHtcblx0XHRcdFx0Y29uc3QgX3JlcGxhY2VtZW50ID0gdGhpcy5yZXBsYWNlbWVudDtcblx0XHRcdFx0Y29uc3QgX3Nob3VsZF9yZW1vdmUgPSB0aGlzLnNob3VsZF9yZW1vdmU7XG5cdFx0XHRcdHRoaXMucmVwbGFjZW1lbnQgPSBudWxsO1xuXHRcdFx0XHR0aGlzLnNob3VsZF9yZW1vdmUgPSBmYWxzZTtcblxuXHRcdFx0XHR0aGlzLmxlYXZlLmNhbGwodGhpcy5jb250ZXh0LCBub2RlLCBwYXJlbnQsIHByb3AsIGluZGV4KTtcblxuXHRcdFx0XHRpZiAodGhpcy5yZXBsYWNlbWVudCkge1xuXHRcdFx0XHRcdG5vZGUgPSB0aGlzLnJlcGxhY2VtZW50O1xuXHRcdFx0XHRcdHRoaXMucmVwbGFjZShwYXJlbnQsIHByb3AsIGluZGV4LCBub2RlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0aGlzLnNob3VsZF9yZW1vdmUpIHtcblx0XHRcdFx0XHR0aGlzLnJlbW92ZShwYXJlbnQsIHByb3AsIGluZGV4KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHJlbW92ZWQgPSB0aGlzLnNob3VsZF9yZW1vdmU7XG5cblx0XHRcdFx0dGhpcy5yZXBsYWNlbWVudCA9IF9yZXBsYWNlbWVudDtcblx0XHRcdFx0dGhpcy5zaG91bGRfcmVtb3ZlID0gX3Nob3VsZF9yZW1vdmU7XG5cblx0XHRcdFx0aWYgKHJlbW92ZWQpIHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBub2RlO1xuXHR9XG59XG5cbi8qKlxuICogRHVja3R5cGUgYSBub2RlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBOb2RlfVxuICovXG5mdW5jdGlvbiBpc05vZGUodmFsdWUpIHtcblx0cmV0dXJuIChcblx0XHR2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICd0eXBlJyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudHlwZSA9PT0gJ3N0cmluZydcblx0KTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdlc3RyZWUnKS5Ob2RlfSBOb2RlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL3N5bmMuanMnKS5TeW5jSGFuZGxlcn0gU3luY0hhbmRsZXJcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vYXN5bmMuanMnKS5Bc3luY0hhbmRsZXJ9IEFzeW5jSGFuZGxlclxuICovXG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSBhc3RcbiAqIEBwYXJhbSB7e1xuICogICBlbnRlcj86IFN5bmNIYW5kbGVyXG4gKiAgIGxlYXZlPzogU3luY0hhbmRsZXJcbiAqIH19IHdhbGtlclxuICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICovXG5mdW5jdGlvbiB3YWxrJDEoYXN0LCB7IGVudGVyLCBsZWF2ZSB9KSB7XG5cdGNvbnN0IGluc3RhbmNlID0gbmV3IFN5bmNXYWxrZXIoZW50ZXIsIGxlYXZlKTtcblx0cmV0dXJuIGluc3RhbmNlLnZpc2l0KGFzdCwgbnVsbCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJ2VzdHJlZScpLk5vZGV9IHBhcmFtXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RfbmFtZXMocGFyYW0pIHtcblx0cmV0dXJuIGV4dHJhY3RfaWRlbnRpZmllcnMocGFyYW0pLm1hcChub2RlID0+IG5vZGUubmFtZSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJ2VzdHJlZScpLk5vZGV9IHBhcmFtXG4gKiBAcGFyYW0ge2ltcG9ydCgnZXN0cmVlJykuSWRlbnRpZmllcltdfSBub2Rlc1xuICogQHJldHVybnMge2ltcG9ydCgnZXN0cmVlJykuSWRlbnRpZmllcltdfVxuICovXG5mdW5jdGlvbiBleHRyYWN0X2lkZW50aWZpZXJzKHBhcmFtLCBub2RlcyA9IFtdKSB7XG5cdHN3aXRjaCAocGFyYW0udHlwZSkge1xuXHRcdGNhc2UgJ0lkZW50aWZpZXInOlxuXHRcdFx0bm9kZXMucHVzaChwYXJhbSk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ01lbWJlckV4cHJlc3Npb24nOlxuXHRcdFx0bGV0IG9iamVjdCA9IHBhcmFtO1xuXHRcdFx0d2hpbGUgKG9iamVjdC50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicpIHtcblx0XHRcdFx0b2JqZWN0ID0gLyoqIEB0eXBlIHthbnl9ICovIChvYmplY3Qub2JqZWN0KTtcblx0XHRcdH1cblx0XHRcdG5vZGVzLnB1c2goLyoqIEB0eXBlIHthbnl9ICovIChvYmplY3QpKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnT2JqZWN0UGF0dGVybic6XG5cdFx0XHQvKiogQHBhcmFtIHtpbXBvcnQoJ2VzdHJlZScpLlByb3BlcnR5IHwgaW1wb3J0KCdlc3RyZWUnKS5SZXN0RWxlbWVudH0gcHJvcCAqL1xuXHRcdFx0Y29uc3QgaGFuZGxlX3Byb3AgPSAocHJvcCkgPT4ge1xuXHRcdFx0XHRpZiAocHJvcC50eXBlID09PSAnUmVzdEVsZW1lbnQnKSB7XG5cdFx0XHRcdFx0ZXh0cmFjdF9pZGVudGlmaWVycyhwcm9wLmFyZ3VtZW50LCBub2Rlcyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZXh0cmFjdF9pZGVudGlmaWVycyhwcm9wLnZhbHVlLCBub2Rlcyk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdHBhcmFtLnByb3BlcnRpZXMuZm9yRWFjaChoYW5kbGVfcHJvcCk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ0FycmF5UGF0dGVybic6XG5cdFx0XHQvKiogQHBhcmFtIHtpbXBvcnQoJ2VzdHJlZScpLk5vZGV9IGVsZW1lbnQgKi9cblx0XHRcdGNvbnN0IGhhbmRsZV9lbGVtZW50ID0gKGVsZW1lbnQpID0+IHtcblx0XHRcdFx0aWYgKGVsZW1lbnQpIGV4dHJhY3RfaWRlbnRpZmllcnMoZWxlbWVudCwgbm9kZXMpO1xuXHRcdFx0fTtcblxuXHRcdFx0cGFyYW0uZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuXHRcdFx0XHRpZiAoZWxlbWVudCkge1xuXHRcdFx0XHRcdGhhbmRsZV9lbGVtZW50KGVsZW1lbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSAnUmVzdEVsZW1lbnQnOlxuXHRcdFx0ZXh0cmFjdF9pZGVudGlmaWVycyhwYXJhbS5hcmd1bWVudCwgbm9kZXMpO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdBc3NpZ25tZW50UGF0dGVybic6XG5cdFx0XHRleHRyYWN0X2lkZW50aWZpZXJzKHBhcmFtLmxlZnQsIG5vZGVzKTtcblx0XHRcdGJyZWFrO1xuXHR9XG5cblx0cmV0dXJuIG5vZGVzO1xufVxuXG5jb25zdCBzc3JNb2R1bGVFeHBvcnRzS2V5ID0gYF9fdml0ZV9zc3JfZXhwb3J0c19fYDtcbmNvbnN0IHNzckltcG9ydEtleSA9IGBfX3ZpdGVfc3NyX2ltcG9ydF9fYDtcbmNvbnN0IHNzckR5bmFtaWNJbXBvcnRLZXkgPSBgX192aXRlX3Nzcl9keW5hbWljX2ltcG9ydF9fYDtcbmNvbnN0IHNzckV4cG9ydEFsbEtleSA9IGBfX3ZpdGVfc3NyX2V4cG9ydEFsbF9fYDtcbmNvbnN0IHNzckltcG9ydE1ldGFLZXkgPSBgX192aXRlX3Nzcl9pbXBvcnRfbWV0YV9fYDtcbmFzeW5jIGZ1bmN0aW9uIHNzclRyYW5zZm9ybShjb2RlLCBpbk1hcCwgdXJsLCBvcmlnaW5hbENvZGUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucz8uanNvbj8uc3RyaW5naWZ5ICYmIGlzSlNPTlJlcXVlc3QodXJsKSkge1xuICAgICAgICByZXR1cm4gc3NyVHJhbnNmb3JtSlNPTihjb2RlLCBpbk1hcCk7XG4gICAgfVxuICAgIHJldHVybiBzc3JUcmFuc2Zvcm1TY3JpcHQoY29kZSwgaW5NYXAsIHVybCwgb3JpZ2luYWxDb2RlKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHNzclRyYW5zZm9ybUpTT04oY29kZSwgaW5NYXApIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBjb2RlLnJlcGxhY2UoJ2V4cG9ydCBkZWZhdWx0JywgYCR7c3NyTW9kdWxlRXhwb3J0c0tleX0uZGVmYXVsdCA9YCksXG4gICAgICAgIG1hcDogaW5NYXAsXG4gICAgICAgIGRlcHM6IFtdLFxuICAgICAgICBkeW5hbWljRGVwczogW10sXG4gICAgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHNzclRyYW5zZm9ybVNjcmlwdChjb2RlLCBpbk1hcCwgdXJsLCBvcmlnaW5hbENvZGUpIHtcbiAgICBjb25zdCBzID0gbmV3IE1hZ2ljU3RyaW5nKGNvZGUpO1xuICAgIGxldCBhc3Q7XG4gICAgdHJ5IHtcbiAgICAgICAgYXN0ID0gcGFyc2VyLnBhcnNlKGNvZGUsIHtcbiAgICAgICAgICAgIHNvdXJjZVR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgICAgZWNtYVZlcnNpb246ICdsYXRlc3QnLFxuICAgICAgICAgICAgbG9jYXRpb25zOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dIYXNoQmFuZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFlcnIubG9jIHx8ICFlcnIubG9jLmxpbmUpXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBlcnIubG9jLmxpbmU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyc2UgZmFpbHVyZTogJHtlcnIubWVzc2FnZX1cXG5BdCBmaWxlOiAke3VybH1cXG5Db250ZW50cyBvZiBsaW5lICR7bGluZX06ICR7Y29kZS5zcGxpdCgnXFxuJylbbGluZSAtIDFdfWApO1xuICAgIH1cbiAgICBsZXQgdWlkID0gMDtcbiAgICBjb25zdCBkZXBzID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGR5bmFtaWNEZXBzID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGlkVG9JbXBvcnRNYXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgZGVjbGFyZWRDb25zdCA9IG5ldyBTZXQoKTtcbiAgICBmdW5jdGlvbiBkZWZpbmVJbXBvcnQobm9kZSwgc291cmNlKSB7XG4gICAgICAgIGRlcHMuYWRkKHNvdXJjZSk7XG4gICAgICAgIGNvbnN0IGltcG9ydElkID0gYF9fdml0ZV9zc3JfaW1wb3J0XyR7dWlkKyt9X19gO1xuICAgICAgICBzLmFwcGVuZFJpZ2h0KG5vZGUuc3RhcnQsIGBjb25zdCAke2ltcG9ydElkfSA9IGF3YWl0ICR7c3NySW1wb3J0S2V5fSgke0pTT04uc3RyaW5naWZ5KHNvdXJjZSl9KTtcXG5gKTtcbiAgICAgICAgcmV0dXJuIGltcG9ydElkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZpbmVFeHBvcnQocG9zaXRpb24sIG5hbWUsIGxvY2FsID0gbmFtZSkge1xuICAgICAgICBzLmFwcGVuZExlZnQocG9zaXRpb24sIGBcXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoJHtzc3JNb2R1bGVFeHBvcnRzS2V5fSwgXCIke25hbWV9XCIsIGAgK1xuICAgICAgICAgICAgYHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCBnZXQoKXsgcmV0dXJuICR7bG9jYWx9IH19KTtgKTtcbiAgICB9XG4gICAgLy8gMS4gY2hlY2sgYWxsIGltcG9ydCBzdGF0ZW1lbnRzIGFuZCByZWNvcmQgaWQgLT4gaW1wb3J0TmFtZSBtYXBcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgYXN0LmJvZHkpIHtcbiAgICAgICAgLy8gaW1wb3J0IGZvbyBmcm9tICdmb28nIC0tPiBmb28gLT4gX19pbXBvcnRfZm9vX18uZGVmYXVsdFxuICAgICAgICAvLyBpbXBvcnQgeyBiYXogfSBmcm9tICdmb28nIC0tPiBiYXogLT4gX19pbXBvcnRfZm9vX18uYmF6XG4gICAgICAgIC8vIGltcG9ydCAqIGFzIG9rIGZyb20gJ2ZvbycgLS0+IG9rIC0+IF9faW1wb3J0X2Zvb19fXG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdJbXBvcnREZWNsYXJhdGlvbicpIHtcbiAgICAgICAgICAgIHMucmVtb3ZlKG5vZGUuc3RhcnQsIG5vZGUuZW5kKTtcbiAgICAgICAgICAgIGNvbnN0IGltcG9ydElkID0gZGVmaW5lSW1wb3J0KG5vZGUsIG5vZGUuc291cmNlLnZhbHVlKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3BlYyBvZiBub2RlLnNwZWNpZmllcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3BlYy50eXBlID09PSAnSW1wb3J0U3BlY2lmaWVyJykge1xuICAgICAgICAgICAgICAgICAgICBpZFRvSW1wb3J0TWFwLnNldChzcGVjLmxvY2FsLm5hbWUsIGAke2ltcG9ydElkfS4ke3NwZWMuaW1wb3J0ZWQubmFtZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3BlYy50eXBlID09PSAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcicpIHtcbiAgICAgICAgICAgICAgICAgICAgaWRUb0ltcG9ydE1hcC5zZXQoc3BlYy5sb2NhbC5uYW1lLCBgJHtpbXBvcnRJZH0uZGVmYXVsdGApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIHNwZWNpZmllclxuICAgICAgICAgICAgICAgICAgICBpZFRvSW1wb3J0TWFwLnNldChzcGVjLmxvY2FsLm5hbWUsIGltcG9ydElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gMi4gY2hlY2sgYWxsIGV4cG9ydCBzdGF0ZW1lbnRzIGFuZCBkZWZpbmUgZXhwb3J0c1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBhc3QuYm9keSkge1xuICAgICAgICAvLyBuYW1lZCBleHBvcnRzXG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJykge1xuICAgICAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbi50eXBlID09PSAnRnVuY3Rpb25EZWNsYXJhdGlvbicgfHxcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbi50eXBlID09PSAnQ2xhc3NEZWNsYXJhdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGZvbygpIHt9XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZUV4cG9ydChub2RlLmVuZCwgbm9kZS5kZWNsYXJhdGlvbi5pZC5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBjb25zdCBmb28gPSAxLCBiYXIgPSAyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygbm9kZS5kZWNsYXJhdGlvbi5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gZXh0cmFjdF9uYW1lcyhkZWNsYXJhdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVFeHBvcnQobm9kZS5lbmQsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHMucmVtb3ZlKG5vZGUuc3RhcnQsIG5vZGUuZGVjbGFyYXRpb24uc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcy5yZW1vdmUobm9kZS5zdGFydCwgbm9kZS5lbmQpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBleHBvcnQgeyBmb28sIGJhciB9IGZyb20gJy4vZm9vJ1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRJZCA9IGRlZmluZUltcG9ydChub2RlLCBub2RlLnNvdXJjZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3BlYyBvZiBub2RlLnNwZWNpZmllcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZUV4cG9ydChub2RlLmVuZCwgc3BlYy5leHBvcnRlZC5uYW1lLCBgJHtpbXBvcnRJZH0uJHtzcGVjLmxvY2FsLm5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cG9ydCB7IGZvbywgYmFyIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzcGVjIG9mIG5vZGUuc3BlY2lmaWVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWwgPSBzcGVjLmxvY2FsLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gaWRUb0ltcG9ydE1hcC5nZXQobG9jYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lRXhwb3J0KG5vZGUuZW5kLCBzcGVjLmV4cG9ydGVkLm5hbWUsIGJpbmRpbmcgfHwgbG9jYWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGRlZmF1bHQgZXhwb3J0XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uVHlwZXMgPSBbJ0Z1bmN0aW9uRXhwcmVzc2lvbicsICdDbGFzc0V4cHJlc3Npb24nXTtcbiAgICAgICAgICAgIGlmICgnaWQnIGluIG5vZGUuZGVjbGFyYXRpb24gJiZcbiAgICAgICAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uLmlkICYmXG4gICAgICAgICAgICAgICAgIWV4cHJlc3Npb25UeXBlcy5pbmNsdWRlcyhub2RlLmRlY2xhcmF0aW9uLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gbmFtZWQgaG9pc3RhYmxlL2NsYXNzIGV4cG9ydHNcbiAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb28oKSB7fVxuICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IGNsYXNzIEEge31cbiAgICAgICAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IG5vZGUuZGVjbGFyYXRpb24uaWQ7XG4gICAgICAgICAgICAgICAgcy5yZW1vdmUobm9kZS5zdGFydCwgbm9kZS5zdGFydCArIDE1IC8qICdleHBvcnQgZGVmYXVsdCAnLmxlbmd0aCAqLyk7XG4gICAgICAgICAgICAgICAgcy5hcHBlbmQoYFxcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSgke3Nzck1vZHVsZUV4cG9ydHNLZXl9LCBcImRlZmF1bHRcIiwgYCArXG4gICAgICAgICAgICAgICAgICAgIGB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6ICR7bmFtZX0gfSk7YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMgZGVmYXVsdCBleHBvcnRzXG4gICAgICAgICAgICAgICAgcy51cGRhdGUobm9kZS5zdGFydCwgbm9kZS5zdGFydCArIDE0IC8qICdleHBvcnQgZGVmYXVsdCcubGVuZ3RoICovLCBgJHtzc3JNb2R1bGVFeHBvcnRzS2V5fS5kZWZhdWx0ID1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBleHBvcnQgKiBmcm9tICcuL2ZvbydcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0V4cG9ydEFsbERlY2xhcmF0aW9uJykge1xuICAgICAgICAgICAgcy5yZW1vdmUobm9kZS5zdGFydCwgbm9kZS5lbmQpO1xuICAgICAgICAgICAgY29uc3QgaW1wb3J0SWQgPSBkZWZpbmVJbXBvcnQobm9kZSwgbm9kZS5zb3VyY2UudmFsdWUpO1xuICAgICAgICAgICAgaWYgKG5vZGUuZXhwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVFeHBvcnQobm9kZS5lbmQsIG5vZGUuZXhwb3J0ZWQubmFtZSwgYCR7aW1wb3J0SWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzLmFwcGVuZExlZnQobm9kZS5lbmQsIGAke3NzckV4cG9ydEFsbEtleX0oJHtpbXBvcnRJZH0pO2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIDMuIGNvbnZlcnQgcmVmZXJlbmNlcyB0byBpbXBvcnQgYmluZGluZ3MgJiBpbXBvcnQubWV0YSByZWZlcmVuY2VzXG4gICAgd2Fsayhhc3QsIHtcbiAgICAgICAgb25JZGVudGlmaWVyKGlkLCBwYXJlbnQsIHBhcmVudFN0YWNrKSB7XG4gICAgICAgICAgICBjb25zdCBncmFuZHBhcmVudCA9IHBhcmVudFN0YWNrWzFdO1xuICAgICAgICAgICAgY29uc3QgYmluZGluZyA9IGlkVG9JbXBvcnRNYXAuZ2V0KGlkLm5hbWUpO1xuICAgICAgICAgICAgaWYgKCFiaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RhdGljUHJvcGVydHkocGFyZW50KSAmJiBwYXJlbnQuc2hvcnRoYW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gbGV0IGJpbmRpbmcgdXNlZCBpbiBhIHByb3BlcnR5IHNob3J0aGFuZFxuICAgICAgICAgICAgICAgIC8vIHsgZm9vIH0gLT4geyBmb286IF9faW1wb3J0X3hfXy5mb28gfVxuICAgICAgICAgICAgICAgIC8vIHNraXAgZm9yIGRlc3RydWN0dXJpbmcgcGF0dGVybnNcbiAgICAgICAgICAgICAgICBpZiAoIWlzTm9kZUluUGF0dGVybihwYXJlbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgIGlzSW5EZXN0cnVjdHVyaW5nQXNzaWdubWVudChwYXJlbnQsIHBhcmVudFN0YWNrKSkge1xuICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZExlZnQoaWQuZW5kLCBgOiAke2JpbmRpbmd9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKHBhcmVudC50eXBlID09PSAnUHJvcGVydHlEZWZpbml0aW9uJyAmJlxuICAgICAgICAgICAgICAgIGdyYW5kcGFyZW50Py50eXBlID09PSAnQ2xhc3NCb2R5JykgfHxcbiAgICAgICAgICAgICAgICAocGFyZW50LnR5cGUgPT09ICdDbGFzc0RlY2xhcmF0aW9uJyAmJiBpZCA9PT0gcGFyZW50LnN1cGVyQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWNsYXJlZENvbnN0LmhhcyhpZC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZENvbnN0LmFkZChpZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRlIHRoZSB0b3AtbW9zdCBub2RlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlY2xhcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcE5vZGUgPSBwYXJlbnRTdGFja1twYXJlbnRTdGFjay5sZW5ndGggLSAyXTtcbiAgICAgICAgICAgICAgICAgICAgcy5wcmVwZW5kUmlnaHQodG9wTm9kZS5zdGFydCwgYGNvbnN0ICR7aWQubmFtZX0gPSAke2JpbmRpbmd9O1xcbmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHMudXBkYXRlKGlkLnN0YXJ0LCBpZC5lbmQsIGJpbmRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkltcG9ydE1ldGEobm9kZSkge1xuICAgICAgICAgICAgcy51cGRhdGUobm9kZS5zdGFydCwgbm9kZS5lbmQsIHNzckltcG9ydE1ldGFLZXkpO1xuICAgICAgICB9LFxuICAgICAgICBvbkR5bmFtaWNJbXBvcnQobm9kZSkge1xuICAgICAgICAgICAgcy51cGRhdGUobm9kZS5zdGFydCwgbm9kZS5zdGFydCArIDYsIHNzckR5bmFtaWNJbXBvcnRLZXkpO1xuICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ0ltcG9ydEV4cHJlc3Npb24nICYmIG5vZGUuc291cmNlLnR5cGUgPT09ICdMaXRlcmFsJykge1xuICAgICAgICAgICAgICAgIGR5bmFtaWNEZXBzLmFkZChub2RlLnNvdXJjZS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgbGV0IG1hcCA9IHMuZ2VuZXJhdGVNYXAoeyBoaXJlczogdHJ1ZSB9KTtcbiAgICBpZiAoaW5NYXAgJiYgaW5NYXAubWFwcGluZ3MgJiYgaW5NYXAuc291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1hcCA9IGNvbWJpbmVTb3VyY2VtYXBzKHVybCwgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm1hcCxcbiAgICAgICAgICAgICAgICBzb3VyY2VzOiBpbk1hcC5zb3VyY2VzLFxuICAgICAgICAgICAgICAgIHNvdXJjZXNDb250ZW50OiBpbk1hcC5zb3VyY2VzQ29udGVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbk1hcCxcbiAgICAgICAgXSwgZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbWFwLnNvdXJjZXMgPSBbdXJsXTtcbiAgICAgICAgLy8gbmVlZHMgdG8gdXNlIG9yaWdpbmFsQ29kZSBpbnN0ZWFkIG9mIGNvZGVcbiAgICAgICAgLy8gYmVjYXVzZSBjb2RlIG1pZ2h0IGJlIGFscmVhZHkgdHJhbnNmb3JtZWQgZXZlbiBpZiBtYXAgaXMgbnVsbFxuICAgICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSBbb3JpZ2luYWxDb2RlXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogcy50b1N0cmluZygpLFxuICAgICAgICBtYXAsXG4gICAgICAgIGRlcHM6IFsuLi5kZXBzXSxcbiAgICAgICAgZHluYW1pY0RlcHM6IFsuLi5keW5hbWljRGVwc10sXG4gICAgfTtcbn1cbmNvbnN0IGlzTm9kZUluUGF0dGVybldlYWtTZXQgPSBuZXcgV2Vha1NldCgpO1xuY29uc3Qgc2V0SXNOb2RlSW5QYXR0ZXJuID0gKG5vZGUpID0+IGlzTm9kZUluUGF0dGVybldlYWtTZXQuYWRkKG5vZGUpO1xuY29uc3QgaXNOb2RlSW5QYXR0ZXJuID0gKG5vZGUpID0+IGlzTm9kZUluUGF0dGVybldlYWtTZXQuaGFzKG5vZGUpO1xuLyoqXG4gKiBTYW1lIGxvZ2ljIGZyb20gXFxAdnVlL2NvbXBpbGVyLWNvcmUgJiBcXEB2dWUvY29tcGlsZXItc2ZjXG4gKiBFeGNlcHQgdGhpcyBpcyB1c2luZyBhY29ybiBBU1RcbiAqL1xuZnVuY3Rpb24gd2Fsayhyb290LCB7IG9uSWRlbnRpZmllciwgb25JbXBvcnRNZXRhLCBvbkR5bmFtaWNJbXBvcnQgfSkge1xuICAgIGNvbnN0IHBhcmVudFN0YWNrID0gW107XG4gICAgY29uc3QgdmFyS2luZFN0YWNrID0gW107XG4gICAgY29uc3Qgc2NvcGVNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgIGNvbnN0IGlkZW50aWZpZXJzID0gW107XG4gICAgY29uc3Qgc2V0U2NvcGUgPSAobm9kZSwgbmFtZSkgPT4ge1xuICAgICAgICBsZXQgc2NvcGVJZHMgPSBzY29wZU1hcC5nZXQobm9kZSk7XG4gICAgICAgIGlmIChzY29wZUlkcyAmJiBzY29wZUlkcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNjb3BlSWRzKSB7XG4gICAgICAgICAgICBzY29wZUlkcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHNjb3BlTWFwLnNldChub2RlLCBzY29wZUlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGVJZHMuYWRkKG5hbWUpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gaXNJblNjb3BlKG5hbWUsIHBhcmVudHMpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVudHMuc29tZSgobm9kZSkgPT4gbm9kZSAmJiBzY29wZU1hcC5nZXQobm9kZSk/LmhhcyhuYW1lKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZVBhdHRlcm4ocCwgcGFyZW50U2NvcGUpIHtcbiAgICAgICAgaWYgKHAudHlwZSA9PT0gJ0lkZW50aWZpZXInKSB7XG4gICAgICAgICAgICBzZXRTY29wZShwYXJlbnRTY29wZSwgcC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwLnR5cGUgPT09ICdSZXN0RWxlbWVudCcpIHtcbiAgICAgICAgICAgIGhhbmRsZVBhdHRlcm4ocC5hcmd1bWVudCwgcGFyZW50U2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHAudHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nKSB7XG4gICAgICAgICAgICBwLnByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkudHlwZSA9PT0gJ1Jlc3RFbGVtZW50Jykge1xuICAgICAgICAgICAgICAgICAgICBzZXRTY29wZShwYXJlbnRTY29wZSwgcHJvcGVydHkuYXJndW1lbnQubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXR0ZXJuKHByb3BlcnR5LnZhbHVlLCBwYXJlbnRTY29wZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocC50eXBlID09PSAnQXJyYXlQYXR0ZXJuJykge1xuICAgICAgICAgICAgcC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGF0dGVybihlbGVtZW50LCBwYXJlbnRTY29wZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocC50eXBlID09PSAnQXNzaWdubWVudFBhdHRlcm4nKSB7XG4gICAgICAgICAgICBoYW5kbGVQYXR0ZXJuKHAubGVmdCwgcGFyZW50U2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0U2NvcGUocGFyZW50U2NvcGUsIHAubmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2FsayQxKHJvb3QsIHtcbiAgICAgICAgZW50ZXIobm9kZSwgcGFyZW50KSB7XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnSW1wb3J0RGVjbGFyYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2tpcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdHJhY2sgcGFyZW50IHN0YWNrLCBza2lwIGZvciBcImVsc2UtaWZcIi9cImVsc2VcIiBicmFuY2hlcyBhcyBhY29ybiBuZXN0c1xuICAgICAgICAgICAgLy8gdGhlIGFzdCB3aXRoaW4gXCJpZlwiIG5vZGVzIGluc3RlYWQgb2YgZmxhdHRlbmluZyB0aGVtXG4gICAgICAgICAgICBpZiAocGFyZW50ICYmXG4gICAgICAgICAgICAgICAgIShwYXJlbnQudHlwZSA9PT0gJ0lmU3RhdGVtZW50JyAmJiBub2RlID09PSBwYXJlbnQuYWx0ZXJuYXRlKSkge1xuICAgICAgICAgICAgICAgIHBhcmVudFN0YWNrLnVuc2hpZnQocGFyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRyYWNrIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGtpbmQgc3RhY2sgdXNlZCBieSBWYXJpYWJsZURlY2xhcmF0b3JcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJykge1xuICAgICAgICAgICAgICAgIHZhcktpbmRTdGFjay51bnNoaWZ0KG5vZGUua2luZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnTWV0YVByb3BlcnR5JyAmJiBub2RlLm1ldGEubmFtZSA9PT0gJ2ltcG9ydCcpIHtcbiAgICAgICAgICAgICAgICBvbkltcG9ydE1ldGEobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdJbXBvcnRFeHByZXNzaW9uJykge1xuICAgICAgICAgICAgICAgIG9uRHluYW1pY0ltcG9ydChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdJZGVudGlmaWVyJykge1xuICAgICAgICAgICAgICAgIGlmICghaXNJblNjb3BlKG5vZGUubmFtZSwgcGFyZW50U3RhY2spICYmXG4gICAgICAgICAgICAgICAgICAgIGlzUmVmSWRlbnRpZmllcihub2RlLCBwYXJlbnQsIHBhcmVudFN0YWNrKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdGhlIGlkZW50aWZpZXIsIGZvciBERlMgLT4gQkZTXG4gICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJzLnB1c2goW25vZGUsIHBhcmVudFN0YWNrLnNsaWNlKDApXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNGdW5jdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGl0IGNvdWxkIGJlIHNoYWRvd2luZyBhbiBpbXBvcnRcbiAgICAgICAgICAgICAgICAvLyBBZGQgaXRzIG5hbWUgdG8gdGhlIHNjb3BlIHNvIGl0IHdvbid0IGdldCByZXBsYWNlZFxuICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdGdW5jdGlvbkRlY2xhcmF0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IGZpbmRQYXJlbnRTY29wZShwYXJlbnRTdGFjayk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRTY29wZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2NvcGUocGFyZW50U2NvcGUsIG5vZGUuaWQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gd2FsayBmdW5jdGlvbiBleHByZXNzaW9ucyBhbmQgYWRkIGl0cyBhcmd1bWVudHMgdG8ga25vd24gaWRlbnRpZmllcnNcbiAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGRvbid0IHByZWZpeCB0aGVtXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJhbXMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocC50eXBlID09PSAnT2JqZWN0UGF0dGVybicgfHwgcC50eXBlID09PSAnQXJyYXlQYXR0ZXJuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGF0dGVybihwLCBub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3YWxrJDEocC50eXBlID09PSAnQXNzaWdubWVudFBhdHRlcm4nID8gcC5sZWZ0IDogcCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXIoY2hpbGQsIHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgcGFyYW1zIGRlZmF1bHQgdmFsdWUgb2YgZGVzdHJ1Y3R1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Py50eXBlID09PSAnQXNzaWdubWVudFBhdHRlcm4nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD8ucmlnaHQgPT09IGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNraXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgIT09ICdJZGVudGlmaWVyJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZWNvcmQgYXMgc2NvcGUgdmFyaWFibGUgaWYgaXMgYSBkZXN0cnVjdHVyaW5nIGtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdGF0aWNQcm9wZXJ0eUtleShjaGlsZCwgcGFyZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZWNvcmQgaWYgdGhpcyBpcyBhIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NpZ25tZW50IG9mIGEgZGVzdHJ1Y3R1cmluZyB2YXJpYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGFyZW50Py50eXBlID09PSAnVGVtcGxhdGVMaXRlcmFsJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ/LmV4cHJlc3Npb25zLmluY2x1ZGVzKGNoaWxkKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudD8udHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJyAmJiBwYXJlbnQ/LmNhbGxlZSA9PT0gY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2NvcGUobm9kZSwgY2hpbGQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gJ1Byb3BlcnR5JyAmJiBwYXJlbnQudHlwZSA9PT0gJ09iamVjdFBhdHRlcm4nKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBwcm9wZXJ0eSBpbiBkZXN0cnVjdHVyaW5nIHBhdHRlcm5cbiAgICAgICAgICAgICAgICBzZXRJc05vZGVJblBhdHRlcm4obm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0b3InKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50RnVuY3Rpb24gPSBmaW5kUGFyZW50U2NvcGUocGFyZW50U3RhY2ssIHZhcktpbmRTdGFja1swXSA9PT0gJ3ZhcicpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXR0ZXJuKG5vZGUuaWQsIHBhcmVudEZ1bmN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdDYXRjaENsYXVzZScgJiYgbm9kZS5wYXJhbSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZVBhdHRlcm4obm9kZS5wYXJhbSwgbm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGxlYXZlKG5vZGUsIHBhcmVudCkge1xuICAgICAgICAgICAgLy8gdW50cmFjayBwYXJlbnQgc3RhY2sgZnJvbSBhYm92ZVxuICAgICAgICAgICAgaWYgKHBhcmVudCAmJlxuICAgICAgICAgICAgICAgICEocGFyZW50LnR5cGUgPT09ICdJZlN0YXRlbWVudCcgJiYgbm9kZSA9PT0gcGFyZW50LmFsdGVybmF0ZSkpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRTdGFjay5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgdmFyS2luZFN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgLy8gZW1pdCB0aGUgaWRlbnRpZmllciBldmVudHMgaW4gQkZTIHNvIHRoZSBob2lzdGVkIGRlY2xhcmF0aW9uc1xuICAgIC8vIGNhbiBiZSBjYXB0dXJlZCBjb3JyZWN0bHlcbiAgICBpZGVudGlmaWVycy5mb3JFYWNoKChbbm9kZSwgc3RhY2tdKSA9PiB7XG4gICAgICAgIGlmICghaXNJblNjb3BlKG5vZGUubmFtZSwgc3RhY2spKVxuICAgICAgICAgICAgb25JZGVudGlmaWVyKG5vZGUsIHN0YWNrWzBdLCBzdGFjayk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc1JlZklkZW50aWZpZXIoaWQsIHBhcmVudCwgcGFyZW50U3RhY2spIHtcbiAgICAvLyBkZWNsYXJhdGlvbiBpZFxuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gJ0NhdGNoQ2xhdXNlJyB8fFxuICAgICAgICAoKHBhcmVudC50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdG9yJyB8fFxuICAgICAgICAgICAgcGFyZW50LnR5cGUgPT09ICdDbGFzc0RlY2xhcmF0aW9uJykgJiZcbiAgICAgICAgICAgIHBhcmVudC5pZCA9PT0gaWQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGlzRnVuY3Rpb24ocGFyZW50KSkge1xuICAgICAgICAvLyBmdW5jdGlvbiBkZWNsYXJhdGlvbi9leHByZXNzaW9uIGlkXG4gICAgICAgIGlmIChwYXJlbnQuaWQgPT09IGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcGFyYW1zIGxpc3RcbiAgICAgICAgaWYgKHBhcmVudC5wYXJhbXMuaW5jbHVkZXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gY2xhc3MgbWV0aG9kIG5hbWVcbiAgICBpZiAocGFyZW50LnR5cGUgPT09ICdNZXRob2REZWZpbml0aW9uJyAmJiAhcGFyZW50LmNvbXB1dGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gcHJvcGVydHkga2V5XG4gICAgaWYgKGlzU3RhdGljUHJvcGVydHlLZXkoaWQsIHBhcmVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBvYmplY3QgZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuXG4gICAgaWYgKGlzTm9kZUluUGF0dGVybihwYXJlbnQpICYmIHBhcmVudC52YWx1ZSA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBub24tYXNzaWdubWVudCBhcnJheSBkZXN0cnVjdHVyaW5nIHBhdHRlcm5cbiAgICBpZiAocGFyZW50LnR5cGUgPT09ICdBcnJheVBhdHRlcm4nICYmXG4gICAgICAgICFpc0luRGVzdHJ1Y3R1cmluZ0Fzc2lnbm1lbnQocGFyZW50LCBwYXJlbnRTdGFjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBtZW1iZXIgZXhwcmVzc2lvbiBwcm9wZXJ0eVxuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nICYmXG4gICAgICAgIHBhcmVudC5wcm9wZXJ0eSA9PT0gaWQgJiZcbiAgICAgICAgIXBhcmVudC5jb21wdXRlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChwYXJlbnQudHlwZSA9PT0gJ0V4cG9ydFNwZWNpZmllcicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBpcyBhIHNwZWNpYWwga2V5d29yZCBidXQgcGFyc2VkIGFzIGlkZW50aWZpZXJcbiAgICBpZiAoaWQubmFtZSA9PT0gJ2FyZ3VtZW50cycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IGlzU3RhdGljUHJvcGVydHkgPSAobm9kZSkgPT4gbm9kZSAmJiBub2RlLnR5cGUgPT09ICdQcm9wZXJ0eScgJiYgIW5vZGUuY29tcHV0ZWQ7XG5jb25zdCBpc1N0YXRpY1Byb3BlcnR5S2V5ID0gKG5vZGUsIHBhcmVudCkgPT4gaXNTdGF0aWNQcm9wZXJ0eShwYXJlbnQpICYmIHBhcmVudC5rZXkgPT09IG5vZGU7XG5jb25zdCBmdW5jdGlvbk5vZGVUeXBlUkUgPSAvRnVuY3Rpb24oPzpFeHByZXNzaW9ufERlY2xhcmF0aW9uKSR8TWV0aG9kJC87XG5mdW5jdGlvbiBpc0Z1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb25Ob2RlVHlwZVJFLnRlc3Qobm9kZS50eXBlKTtcbn1cbmZ1bmN0aW9uIGZpbmRQYXJlbnRTY29wZShwYXJlbnRTdGFjaywgaXNWYXIgPSBmYWxzZSkge1xuICAgIGNvbnN0IHByZWRpY2F0ZSA9IGlzVmFyXG4gICAgICAgID8gaXNGdW5jdGlvblxuICAgICAgICA6IChub2RlKSA9PiBub2RlLnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCc7XG4gICAgcmV0dXJuIHBhcmVudFN0YWNrLmZpbmQocHJlZGljYXRlKTtcbn1cbmZ1bmN0aW9uIGlzSW5EZXN0cnVjdHVyaW5nQXNzaWdubWVudChwYXJlbnQsIHBhcmVudFN0YWNrKSB7XG4gICAgaWYgKHBhcmVudCAmJlxuICAgICAgICAocGFyZW50LnR5cGUgPT09ICdQcm9wZXJ0eScgfHwgcGFyZW50LnR5cGUgPT09ICdBcnJheVBhdHRlcm4nKSkge1xuICAgICAgICByZXR1cm4gcGFyZW50U3RhY2suc29tZSgoaSkgPT4gaS50eXBlID09PSAnQXNzaWdubWVudEV4cHJlc3Npb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5sZXQgb2Zmc2V0O1xudHJ5IHtcbiAgICBuZXcgRnVuY3Rpb24oJ3Rocm93IG5ldyBFcnJvcigxKScpKCk7XG59XG5jYXRjaCAoZSkge1xuICAgIC8vIGluIE5vZGUgMTIsIHN0YWNrIHRyYWNlcyBhY2NvdW50IGZvciB0aGUgZnVuY3Rpb24gd3JhcHBlci5cbiAgICAvLyBpbiBOb2RlIDEzIGFuZCBsYXRlciwgdGhlIGZ1bmN0aW9uIHdyYXBwZXIgYWRkcyB0d28gbGluZXMsXG4gICAgLy8gd2hpY2ggbXVzdCBiZSBzdWJ0cmFjdGVkIHRvIGdlbmVyYXRlIGEgdmFsaWQgbWFwcGluZ1xuICAgIGNvbnN0IG1hdGNoID0gLzooXFxkKyk6XFxkK1xcKSQvLmV4ZWMoZS5zdGFjay5zcGxpdCgnXFxuJylbMV0pO1xuICAgIG9mZnNldCA9IG1hdGNoID8gK21hdGNoWzFdIC0gMSA6IDA7XG59XG5mdW5jdGlvbiBzc3JSZXdyaXRlU3RhY2t0cmFjZShzdGFjaywgbW9kdWxlR3JhcGgpIHtcbiAgICByZXR1cm4gc3RhY2tcbiAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICAgIHJldHVybiBsaW5lLnJlcGxhY2UoL14gezR9YXQgKD86KFxcUy4qPylcXHNcXCgpPyguKz8pOihcXGQrKSg/OjooXFxkKykpP1xcKT8vLCAoaW5wdXQsIHZhck5hbWUsIHVybCwgbGluZSwgY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXVybClcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBtb2R1bGVHcmFwaC51cmxUb01vZHVsZU1hcC5nZXQodXJsKTtcbiAgICAgICAgICAgIGNvbnN0IHJhd1NvdXJjZU1hcCA9IG1vZD8uc3NyVHJhbnNmb3JtUmVzdWx0Py5tYXA7XG4gICAgICAgICAgICBpZiAoIXJhd1NvdXJjZU1hcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRyYWNlZCA9IG5ldyBUcmFjZU1hcChyYXdTb3VyY2VNYXApO1xuICAgICAgICAgICAgY29uc3QgcG9zID0gb3JpZ2luYWxQb3NpdGlvbkZvciQxKHRyYWNlZCwge1xuICAgICAgICAgICAgICAgIGxpbmU6IE51bWJlcihsaW5lKSAtIG9mZnNldCxcbiAgICAgICAgICAgICAgICBjb2x1bW46IE51bWJlcihjb2x1bW4pLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXBvcy5zb3VyY2UgfHwgcG9zLmxpbmUgPT0gbnVsbCB8fCBwb3MuY29sdW1uID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0cmltbWVkVmFyTmFtZSA9IHZhck5hbWUudHJpbSgpO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYCR7cG9zLnNvdXJjZX06JHtwb3MubGluZX06JHtwb3MuY29sdW1ufWA7XG4gICAgICAgICAgICBpZiAoIXRyaW1tZWRWYXJOYW1lIHx8IHRyaW1tZWRWYXJOYW1lID09PSAnZXZhbCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCAgICBhdCAke3NvdXJjZX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAgICAgYXQgJHt0cmltbWVkVmFyTmFtZX0gKCR7c291cmNlfSlgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KVxuICAgICAgICAuam9pbignXFxuJyk7XG59XG5mdW5jdGlvbiByZWJpbmRFcnJvclN0YWNrdHJhY2UoZSwgc3RhY2t0cmFjZSkge1xuICAgIGNvbnN0IHsgY29uZmlndXJhYmxlLCB3cml0YWJsZSB9ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCAnc3RhY2snKTtcbiAgICBpZiAoY29uZmlndXJhYmxlKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCAnc3RhY2snLCB7XG4gICAgICAgICAgICB2YWx1ZTogc3RhY2t0cmFjZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHdyaXRhYmxlKSB7XG4gICAgICAgIGUuc3RhY2sgPSBzdGFja3RyYWNlO1xuICAgIH1cbn1cbmNvbnN0IHJld3JvdGVTdGFja3RyYWNlcyA9IG5ldyBXZWFrU2V0KCk7XG5mdW5jdGlvbiBzc3JGaXhTdGFja3RyYWNlKGUsIG1vZHVsZUdyYXBoKSB7XG4gICAgaWYgKCFlLnN0YWNrKVxuICAgICAgICByZXR1cm47XG4gICAgLy8gc3RhY2t0cmFjZSBzaG91bGRuJ3QgYmUgcmV3cml0dGVuIG1vcmUgdGhhbiBvbmNlXG4gICAgaWYgKHJld3JvdGVTdGFja3RyYWNlcy5oYXMoZSkpXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBzdGFja3RyYWNlID0gc3NyUmV3cml0ZVN0YWNrdHJhY2UoZS5zdGFjaywgbW9kdWxlR3JhcGgpO1xuICAgIHJlYmluZEVycm9yU3RhY2t0cmFjZShlLCBzdGFja3RyYWNlKTtcbiAgICByZXdyb3RlU3RhY2t0cmFjZXMuYWRkKGUpO1xufVxuXG5jb25zdCBwZW5kaW5nTW9kdWxlcyA9IG5ldyBNYXAoKTtcbmNvbnN0IHBlbmRpbmdJbXBvcnRzID0gbmV3IE1hcCgpO1xuYXN5bmMgZnVuY3Rpb24gc3NyTG9hZE1vZHVsZSh1cmwsIHNlcnZlciwgY29udGV4dCA9IHsgZ2xvYmFsIH0sIHVybFN0YWNrID0gW10sIGZpeFN0YWNrdHJhY2UpIHtcbiAgICB1cmwgPSB1bndyYXBJZCh1cmwpO1xuICAgIC8vIHdoZW4gd2UgaW5zdGFudGlhdGUgbXVsdGlwbGUgZGVwZW5kZW5jeSBtb2R1bGVzIGluIHBhcmFsbGVsLCB0aGV5IG1heVxuICAgIC8vIHBvaW50IHRvIHNoYXJlZCBtb2R1bGVzLiBXZSBuZWVkIHRvIGF2b2lkIGR1cGxpY2F0ZSBpbnN0YW50aWF0aW9uIGF0dGVtcHRzXG4gICAgLy8gYnkgcmVnaXN0ZXIgZXZlcnkgbW9kdWxlIGFzIHBlbmRpbmcgc3luY2hyb25vdXNseSBzbyB0aGF0IGFsbCBzdWJzZXF1ZW50XG4gICAgLy8gcmVxdWVzdCB0byB0aGF0IG1vZHVsZSBhcmUgc2ltcGx5IHdhaXRpbmcgb24gdGhlIHNhbWUgcHJvbWlzZS5cbiAgICBjb25zdCBwZW5kaW5nID0gcGVuZGluZ01vZHVsZXMuZ2V0KHVybCk7XG4gICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmc7XG4gICAgfVxuICAgIGNvbnN0IG1vZHVsZVByb21pc2UgPSBpbnN0YW50aWF0ZU1vZHVsZSh1cmwsIHNlcnZlciwgY29udGV4dCwgdXJsU3RhY2ssIGZpeFN0YWNrdHJhY2UpO1xuICAgIHBlbmRpbmdNb2R1bGVzLnNldCh1cmwsIG1vZHVsZVByb21pc2UpO1xuICAgIG1vZHVsZVByb21pc2VcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgcGVuZGluZ0ltcG9ydHMuZGVsZXRlKHVybCk7XG4gICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBwZW5kaW5nTW9kdWxlcy5kZWxldGUodXJsKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbW9kdWxlUHJvbWlzZTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbnRpYXRlTW9kdWxlKHVybCwgc2VydmVyLCBjb250ZXh0ID0geyBnbG9iYWwgfSwgdXJsU3RhY2sgPSBbXSwgZml4U3RhY2t0cmFjZSkge1xuICAgIGNvbnN0IHsgbW9kdWxlR3JhcGggfSA9IHNlcnZlcjtcbiAgICBjb25zdCBtb2QgPSBhd2FpdCBtb2R1bGVHcmFwaC5lbnN1cmVFbnRyeUZyb21VcmwodXJsLCB0cnVlKTtcbiAgICBpZiAobW9kLnNzckVycm9yKSB7XG4gICAgICAgIHRocm93IG1vZC5zc3JFcnJvcjtcbiAgICB9XG4gICAgaWYgKG1vZC5zc3JNb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIG1vZC5zc3JNb2R1bGU7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IG1vZC5zc3JUcmFuc2Zvcm1SZXN1bHQgfHxcbiAgICAgICAgKGF3YWl0IHRyYW5zZm9ybVJlcXVlc3QodXJsLCBzZXJ2ZXIsIHsgc3NyOiB0cnVlIH0pKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAvLyBUT0RPIG1vcmUgaW5mbz8gaXMgdGhpcyBldmVuIG5lY2Vzc2FyeT9cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gbG9hZCBtb2R1bGUgZm9yIHNzcjogJHt1cmx9YCk7XG4gICAgfVxuICAgIGNvbnN0IHNzck1vZHVsZSA9IHtcbiAgICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdNb2R1bGUnLFxuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNzck1vZHVsZSwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuICAgIC8vIFRvbGVyYXRlIGNpcmN1bGFyIGltcG9ydHMgYnkgZW5zdXJpbmcgdGhlIG1vZHVsZSBjYW4gYmVcbiAgICAvLyByZWZlcmVuY2VkIGJlZm9yZSBpdCdzIGJlZW4gaW5zdGFudGlhdGVkLlxuICAgIG1vZC5zc3JNb2R1bGUgPSBzc3JNb2R1bGU7XG4gICAgY29uc3Qgc3NySW1wb3J0TWV0YSA9IHtcbiAgICAgICAgLy8gVGhlIGZpbGVzeXN0ZW0gVVJMLCBtYXRjaGluZyBuYXRpdmUgTm9kZS5qcyBtb2R1bGVzXG4gICAgICAgIHVybDogcGF0aFRvRmlsZVVSTChtb2QuZmlsZSkudG9TdHJpbmcoKSxcbiAgICB9O1xuICAgIHVybFN0YWNrID0gdXJsU3RhY2suY29uY2F0KHVybCk7XG4gICAgY29uc3QgaXNDaXJjdWxhciA9ICh1cmwpID0+IHVybFN0YWNrLmluY2x1ZGVzKHVybCk7XG4gICAgY29uc3QgeyBpc1Byb2R1Y3Rpb24sIHJlc29sdmU6IHsgZGVkdXBlLCBwcmVzZXJ2ZVN5bWxpbmtzIH0sIHJvb3QsIH0gPSBzZXJ2ZXIuY29uZmlnO1xuICAgIGNvbnN0IHJlc29sdmVPcHRpb25zID0ge1xuICAgICAgICBtYWluRmllbGRzOiBbJ21haW4nXSxcbiAgICAgICAgYnJvd3NlckZpZWxkOiB0cnVlLFxuICAgICAgICBjb25kaXRpb25zOiBbXSxcbiAgICAgICAgb3ZlcnJpZGVDb25kaXRpb25zOiBbJ3Byb2R1Y3Rpb24nLCAnZGV2ZWxvcG1lbnQnXSxcbiAgICAgICAgZXh0ZW5zaW9uczogWycuanMnLCAnLmNqcycsICcuanNvbiddLFxuICAgICAgICBkZWR1cGUsXG4gICAgICAgIHByZXNlcnZlU3ltbGlua3MsXG4gICAgICAgIGlzQnVpbGQ6IGZhbHNlLFxuICAgICAgICBpc1Byb2R1Y3Rpb24sXG4gICAgICAgIHJvb3QsXG4gICAgfTtcbiAgICAvLyBTaW5jZSBkeW5hbWljIGltcG9ydHMgY2FuIGhhcHBlbiBpbiBwYXJhbGxlbCwgd2UgbmVlZCB0b1xuICAgIC8vIGFjY291bnQgZm9yIG11bHRpcGxlIHBlbmRpbmcgZGVwcyBhbmQgZHVwbGljYXRlIGltcG9ydHMuXG4gICAgY29uc3QgcGVuZGluZ0RlcHMgPSBbXTtcbiAgICBjb25zdCBzc3JJbXBvcnQgPSBhc3luYyAoZGVwKSA9PiB7XG4gICAgICAgIGlmIChkZXBbMF0gIT09ICcuJyAmJiBkZXBbMF0gIT09ICcvJykge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVJbXBvcnQoZGVwLCBtb2QuZmlsZSwgcmVzb2x2ZU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnZlcnQgdG8gcm9sbHVwIFVSTCBiZWNhdXNlIGBwZW5kaW5nSW1wb3J0c2AsIGBtb2R1bGVHcmFwaC51cmxUb01vZHVsZU1hcGAgcmVxdWlyZXMgdGhhdFxuICAgICAgICBkZXAgPSB1bndyYXBJZChkZXApO1xuICAgICAgICBpZiAoIWlzQ2lyY3VsYXIoZGVwKSAmJiAhcGVuZGluZ0ltcG9ydHMuZ2V0KGRlcCk/LnNvbWUoaXNDaXJjdWxhcikpIHtcbiAgICAgICAgICAgIHBlbmRpbmdEZXBzLnB1c2goZGVwKTtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nRGVwcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nSW1wb3J0cy5zZXQodXJsLCBwZW5kaW5nRGVwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBzc3JMb2FkTW9kdWxlKGRlcCwgc2VydmVyLCBjb250ZXh0LCB1cmxTdGFjaywgZml4U3RhY2t0cmFjZSk7XG4gICAgICAgICAgICBpZiAocGVuZGluZ0RlcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZ0ltcG9ydHMuZGVsZXRlKHVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nRGVwcy5zcGxpY2UocGVuZGluZ0RlcHMuaW5kZXhPZihkZXApLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiBsb2NhbCBtb2R1bGUgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gIzU0NzBcbiAgICAgICAgICAgIHJldHVybiBtb2Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZUdyYXBoLnVybFRvTW9kdWxlTWFwLmdldChkZXApPy5zc3JNb2R1bGU7XG4gICAgfTtcbiAgICBjb25zdCBzc3JEeW5hbWljSW1wb3J0ID0gKGRlcCkgPT4ge1xuICAgICAgICAvLyAjMzA4NyBkeW5hbWljIGltcG9ydCB2YXJzIGlzIGlnbm9yZWQgYXQgcmV3cml0ZSBpbXBvcnQgcGF0aCxcbiAgICAgICAgLy8gc28gaGVyZSBuZWVkIHByb2Nlc3MgcmVsYXRpdmUgcGF0aFxuICAgICAgICBpZiAoZGVwWzBdID09PSAnLicpIHtcbiAgICAgICAgICAgIGRlcCA9IHBhdGgkby5wb3NpeC5yZXNvbHZlKHBhdGgkby5kaXJuYW1lKHVybCksIGRlcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNzckltcG9ydChkZXApO1xuICAgIH07XG4gICAgZnVuY3Rpb24gc3NyRXhwb3J0QWxsKHNvdXJjZU1vZHVsZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2VNb2R1bGUpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzc3JNb2R1bGUsIGtleSwge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VNb2R1bGVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IEFzeW5jRnVuY3Rpb24gPSBhc3luYyBmdW5jdGlvbiAoKSB7IH0uY29uc3RydWN0b3I7XG4gICAgICAgIGNvbnN0IGluaXRNb2R1bGUgPSBuZXcgQXN5bmNGdW5jdGlvbihgZ2xvYmFsYCwgc3NyTW9kdWxlRXhwb3J0c0tleSwgc3NySW1wb3J0TWV0YUtleSwgc3NySW1wb3J0S2V5LCBzc3JEeW5hbWljSW1wb3J0S2V5LCBzc3JFeHBvcnRBbGxLZXksICdcInVzZSBzdHJpY3RcIjsnICsgcmVzdWx0LmNvZGUgKyBgXFxuLy8jIHNvdXJjZVVSTD0ke21vZC51cmx9YCk7XG4gICAgICAgIGF3YWl0IGluaXRNb2R1bGUoY29udGV4dC5nbG9iYWwsIHNzck1vZHVsZSwgc3NySW1wb3J0TWV0YSwgc3NySW1wb3J0LCBzc3JEeW5hbWljSW1wb3J0LCBzc3JFeHBvcnRBbGwpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBtb2Quc3NyRXJyb3IgPSBlO1xuICAgICAgICBpZiAoZS5zdGFjayAmJiBmaXhTdGFja3RyYWNlKSB7XG4gICAgICAgICAgICBzc3JGaXhTdGFja3RyYWNlKGUsIG1vZHVsZUdyYXBoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci5lcnJvcihwaWNvY29sb3JzRXhwb3J0cy5yZWQoYEVycm9yIHdoZW4gZXZhbHVhdGluZyBTU1IgbW9kdWxlICR7dXJsfTpgICtcbiAgICAgICAgICAgIChlLmltcG9ydGVlID8gYCBmYWlsZWQgdG8gaW1wb3J0IFwiJHtlLmltcG9ydGVlfVwiXFxuYCA6ICdcXG4nKSksIHtcbiAgICAgICAgICAgIHRpbWVzdGFtcDogdHJ1ZSxcbiAgICAgICAgICAgIGNsZWFyOiBzZXJ2ZXIuY29uZmlnLmNsZWFyU2NyZWVuLFxuICAgICAgICAgICAgZXJyb3I6IGUsXG4gICAgICAgIH0pO1xuICAgICAgICBkZWxldGUgZS5pbXBvcnRlZTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoc3NyTW9kdWxlKTtcbn1cbi8vIEluIG5vZGVAMTIrIHdlIGNhbiB1c2UgZHluYW1pYyBpbXBvcnQgdG8gbG9hZCBDSlMgYW5kIEVTTVxuYXN5bmMgZnVuY3Rpb24gbm9kZUltcG9ydChpZCwgaW1wb3J0ZXIsIHJlc29sdmVPcHRpb25zKSB7XG4gICAgbGV0IHVybDtcbiAgICBpZiAoaWQuc3RhcnRzV2l0aCgnbm9kZTonKSB8fCBpc0J1aWx0aW4oaWQpKSB7XG4gICAgICAgIHVybCA9IGlkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlOb2RlUmVzb2x2ZShpZCwgaW1wb3J0ZXIsIFxuICAgICAgICAvLyBOb24tZXh0ZXJuYWwgbW9kdWxlcyBjYW4gaW1wb3J0IEVTTS1vbmx5IG1vZHVsZXMsIGJ1dCBvbmx5IG91dHNpZGVcbiAgICAgICAgLy8gb2YgdGVzdCBydW5zLCBiZWNhdXNlIHdlIHVzZSBOb2RlIGByZXF1aXJlYCBpbiBKZXN0IHRvIGF2b2lkIHNlZ2ZhdWx0LlxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGplc3Qgb25seSBleGlzdHMgd2hlbiBydW5uaW5nIEplc3RcbiAgICAgICAgdHlwZW9mIGplc3QgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IHsgLi4ucmVzb2x2ZU9wdGlvbnMsIHRyeUVzbU9ubHk6IHRydWUgfVxuICAgICAgICAgICAgOiByZXNvbHZlT3B0aW9ucywgZmFsc2UpO1xuICAgICAgICBpZiAoIXJlc29sdmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIG1vZHVsZSAnJHtpZH0nIGltcG9ydGVkIGZyb20gJyR7aW1wb3J0ZXJ9J2ApO1xuICAgICAgICAgICAgZXJyLmNvZGUgPSAnRVJSX01PRFVMRV9OT1RfRk9VTkQnO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHVybCA9IHJlc29sdmVkLmlkO1xuICAgICAgICBpZiAodXNpbmdEeW5hbWljSW1wb3J0KSB7XG4gICAgICAgICAgICB1cmwgPSBwYXRoVG9GaWxlVVJMKHVybCkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBkeW5hbWljSW1wb3J0KHVybCk7XG4gICAgICAgIHJldHVybiBwcm94eUVTTShtb2QpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIHRlbGwgZXh0ZXJuYWwgZXJyb3IgaGFuZGxlciB3aGljaCBtb2Qgd2FzIGltcG9ydGVkIHdpdGggZXJyb3JcbiAgICAgICAgZXJyLmltcG9ydGVlID0gaWQ7XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG59XG4vLyByb2xsdXAtc3R5bGUgZGVmYXVsdCBpbXBvcnQgaW50ZXJvcCBmb3IgY2pzXG5mdW5jdGlvbiBwcm94eUVTTShtb2QpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IHNlbnNpYmxlIG9wdGlvbiB3aGVuIHRoZSBleHBvcnRzIG9iamVjdCBpcyBhIHByaW1pdGl2ZVxuICAgIGlmIChpc1ByaW1pdGl2ZShtb2QpKVxuICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBtb2QgfTtcbiAgICBsZXQgZGVmYXVsdEV4cG9ydCA9ICdkZWZhdWx0JyBpbiBtb2QgPyBtb2QuZGVmYXVsdCA6IG1vZDtcbiAgICBpZiAoIWlzUHJpbWl0aXZlKGRlZmF1bHRFeHBvcnQpICYmICdfX2VzTW9kdWxlJyBpbiBkZWZhdWx0RXhwb3J0KSB7XG4gICAgICAgIG1vZCA9IGRlZmF1bHRFeHBvcnQ7XG4gICAgICAgIGlmICgnZGVmYXVsdCcgaW4gZGVmYXVsdEV4cG9ydCkge1xuICAgICAgICAgICAgZGVmYXVsdEV4cG9ydCA9IGRlZmF1bHRFeHBvcnQuZGVmYXVsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3h5KG1vZCwge1xuICAgICAgICBnZXQobW9kLCBwcm9wKSB7XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ2RlZmF1bHQnKVxuICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0RXhwb3J0O1xuICAgICAgICAgICAgcmV0dXJuIG1vZFtwcm9wXSA/PyBkZWZhdWx0RXhwb3J0Py5bcHJvcF07XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuICAgIHJldHVybiAhdmFsdWUgfHwgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKTtcbn1cblxuZnVuY3Rpb24gYmluZFNob3J0Y3V0cyhzZXJ2ZXIsIG9wdHMpIHtcbiAgICBpZiAoIXNlcnZlci5odHRwU2VydmVyIHx8ICFwcm9jZXNzLnN0ZGluLmlzVFRZIHx8IHByb2Nlc3MuZW52LkNJKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2VydmVyLl9zaG9ydGN1dHNPcHRpb25zID0gb3B0cztcbiAgICBpZiAob3B0cy5wcmludCkge1xuICAgICAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci5pbmZvKHBpY29jb2xvcnNFeHBvcnRzLmRpbShwaWNvY29sb3JzRXhwb3J0cy5ncmVlbignICBcdTI3OUMnKSkgK1xuICAgICAgICAgICAgcGljb2NvbG9yc0V4cG9ydHMuZGltKCcgIHByZXNzICcpICtcbiAgICAgICAgICAgIHBpY29jb2xvcnNFeHBvcnRzLmJvbGQoJ2gnKSArXG4gICAgICAgICAgICBwaWNvY29sb3JzRXhwb3J0cy5kaW0oJyB0byBzaG93IGhlbHAnKSk7XG4gICAgfVxuICAgIGNvbnN0IHNob3J0Y3V0cyA9IChvcHRzLmN1c3RvbVNob3J0Y3V0cyA/PyBbXSlcbiAgICAgICAgLmZpbHRlcihpc0RlZmluZWQpXG4gICAgICAgIC5jb25jYXQoQkFTRV9TSE9SVENVVFMpO1xuICAgIGxldCBhY3Rpb25SdW5uaW5nID0gZmFsc2U7XG4gICAgY29uc3Qgb25JbnB1dCA9IGFzeW5jIChpbnB1dCkgPT4ge1xuICAgICAgICAvLyBjdHJsK2Mgb3IgY3RybCtkXG4gICAgICAgIGlmIChpbnB1dCA9PT0gJ1xceDAzJyB8fCBpbnB1dCA9PT0gJ1xceDA0Jykge1xuICAgICAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCkuZmluYWxseSgoKSA9PiBwcm9jZXNzLmV4aXQoMSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb25SdW5uaW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoaW5wdXQgPT09ICdoJykge1xuICAgICAgICAgICAgc2VydmVyLmNvbmZpZy5sb2dnZXIuaW5mbyhbXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgcGljb2NvbG9yc0V4cG9ydHMuYm9sZCgnICBTaG9ydGN1dHMnKSxcbiAgICAgICAgICAgICAgICAuLi5zaG9ydGN1dHMubWFwKChzaG9ydGN1dCkgPT4gcGljb2NvbG9yc0V4cG9ydHMuZGltKCcgIHByZXNzICcpICtcbiAgICAgICAgICAgICAgICAgICAgcGljb2NvbG9yc0V4cG9ydHMuYm9sZChzaG9ydGN1dC5rZXkpICtcbiAgICAgICAgICAgICAgICAgICAgcGljb2NvbG9yc0V4cG9ydHMuZGltKGAgdG8gJHtzaG9ydGN1dC5kZXNjcmlwdGlvbn1gKSksXG4gICAgICAgICAgICBdLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaG9ydGN1dCA9IHNob3J0Y3V0cy5maW5kKChzaG9ydGN1dCkgPT4gc2hvcnRjdXQua2V5ID09PSBpbnB1dCk7XG4gICAgICAgIGlmICghc2hvcnRjdXQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGFjdGlvblJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICBhd2FpdCBzaG9ydGN1dC5hY3Rpb24oc2VydmVyKTtcbiAgICAgICAgYWN0aW9uUnVubmluZyA9IGZhbHNlO1xuICAgIH07XG4gICAgcHJvY2Vzcy5zdGRpbi5zZXRSYXdNb2RlKHRydWUpO1xuICAgIHByb2Nlc3Muc3RkaW4ub24oJ2RhdGEnLCBvbklucHV0KS5zZXRFbmNvZGluZygndXRmOCcpLnJlc3VtZSgpO1xuICAgIHNlcnZlci5odHRwU2VydmVyLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5vZmYoJ2RhdGEnLCBvbklucHV0KS5wYXVzZSgpO1xuICAgIH0pO1xufVxuY29uc3QgQkFTRV9TSE9SVENVVFMgPSBbXG4gICAge1xuICAgICAgICBrZXk6ICdyJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdyZXN0YXJ0IHRoZSBzZXJ2ZXInLFxuICAgICAgICBhc3luYyBhY3Rpb24oc2VydmVyKSB7XG4gICAgICAgICAgICBhd2FpdCBzZXJ2ZXIucmVzdGFydCgpO1xuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBrZXk6ICd1JyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdzaG93IHNlcnZlciB1cmwnLFxuICAgICAgICBhY3Rpb24oc2VydmVyKSB7XG4gICAgICAgICAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci5pbmZvKCcnKTtcbiAgICAgICAgICAgIHNlcnZlci5wcmludFVybHMoKTtcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAga2V5OiAnbycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnb3BlbiBpbiBicm93c2VyJyxcbiAgICAgICAgYWN0aW9uKHNlcnZlcikge1xuICAgICAgICAgICAgc2VydmVyLm9wZW5Ccm93c2VyKCk7XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGtleTogJ2MnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ2NsZWFyIGNvbnNvbGUnLFxuICAgICAgICBhY3Rpb24oc2VydmVyKSB7XG4gICAgICAgICAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci5jbGVhclNjcmVlbignZXJyb3InKTtcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAga2V5OiAncScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAncXVpdCcsXG4gICAgICAgIGFzeW5jIGFjdGlvbihzZXJ2ZXIpIHtcbiAgICAgICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpLmZpbmFsbHkoKCkgPT4gcHJvY2Vzcy5leGl0KCkpO1xuICAgICAgICB9LFxuICAgIH0sXG5dO1xuXG52YXIgYnVmZmVyVXRpbEV4cG9ydHMgPSB7fTtcbnZhciBidWZmZXJVdGlsJDEgPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiBidWZmZXJVdGlsRXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IGJ1ZmZlclV0aWxFeHBvcnRzID0gdjsgfSxcbn07XG5cbnZhciBjb25zdGFudHMgPSB7XG4gIEJJTkFSWV9UWVBFUzogWydub2RlYnVmZmVyJywgJ2FycmF5YnVmZmVyJywgJ2ZyYWdtZW50cyddLFxuICBFTVBUWV9CVUZGRVI6IEJ1ZmZlci5hbGxvYygwKSxcbiAgR1VJRDogJzI1OEVBRkE1LUU5MTQtNDdEQS05NUNBLUM1QUIwREM4NUIxMScsXG4gIGtGb3JPbkV2ZW50QXR0cmlidXRlOiBTeW1ib2woJ2tJc0Zvck9uRXZlbnRBdHRyaWJ1dGUnKSxcbiAga0xpc3RlbmVyOiBTeW1ib2woJ2tMaXN0ZW5lcicpLFxuICBrU3RhdHVzQ29kZTogU3ltYm9sKCdzdGF0dXMtY29kZScpLFxuICBrV2ViU29ja2V0OiBTeW1ib2woJ3dlYnNvY2tldCcpLFxuICBOT09QOiAoKSA9PiB7fVxufTtcblxuY29uc3QgeyBFTVBUWV9CVUZGRVI6IEVNUFRZX0JVRkZFUiQzIH0gPSBjb25zdGFudHM7XG5cbmNvbnN0IEZhc3RCdWZmZXIkMiA9IEJ1ZmZlcltTeW1ib2wuc3BlY2llc107XG5cbi8qKlxuICogTWVyZ2VzIGFuIGFycmF5IG9mIGJ1ZmZlcnMgaW50byBhIG5ldyBidWZmZXIuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJbXX0gbGlzdCBUaGUgYXJyYXkgb2YgYnVmZmVycyB0byBjb25jYXRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0b3RhbExlbmd0aCBUaGUgdG90YWwgbGVuZ3RoIG9mIGJ1ZmZlcnMgaW4gdGhlIGxpc3RcbiAqIEByZXR1cm4ge0J1ZmZlcn0gVGhlIHJlc3VsdGluZyBidWZmZXJcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gY29uY2F0JDEobGlzdCwgdG90YWxMZW5ndGgpIHtcbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gRU1QVFlfQlVGRkVSJDM7XG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkgcmV0dXJuIGxpc3RbMF07XG5cbiAgY29uc3QgdGFyZ2V0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKHRvdGFsTGVuZ3RoKTtcbiAgbGV0IG9mZnNldCA9IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYnVmID0gbGlzdFtpXTtcbiAgICB0YXJnZXQuc2V0KGJ1Ziwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gYnVmLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChvZmZzZXQgPCB0b3RhbExlbmd0aCkge1xuICAgIHJldHVybiBuZXcgRmFzdEJ1ZmZlciQyKHRhcmdldC5idWZmZXIsIHRhcmdldC5ieXRlT2Zmc2V0LCBvZmZzZXQpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqXG4gKiBNYXNrcyBhIGJ1ZmZlciB1c2luZyB0aGUgZ2l2ZW4gbWFzay5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gc291cmNlIFRoZSBidWZmZXIgdG8gbWFza1xuICogQHBhcmFtIHtCdWZmZXJ9IG1hc2sgVGhlIG1hc2sgdG8gdXNlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gb3V0cHV0IFRoZSBidWZmZXIgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBUaGUgb2Zmc2V0IGF0IHdoaWNoIHRvIHN0YXJ0IHdyaXRpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGggVGhlIG51bWJlciBvZiBieXRlcyB0byBtYXNrLlxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBfbWFzayhzb3VyY2UsIG1hc2ssIG91dHB1dCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFtvZmZzZXQgKyBpXSA9IHNvdXJjZVtpXSBeIG1hc2tbaSAmIDNdO1xuICB9XG59XG5cbi8qKlxuICogVW5tYXNrcyBhIGJ1ZmZlciB1c2luZyB0aGUgZ2l2ZW4gbWFzay5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gdW5tYXNrXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayBUaGUgbWFzayB0byB1c2VcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gX3VubWFzayhidWZmZXIsIG1hc2spIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpKyspIHtcbiAgICBidWZmZXJbaV0gXj0gbWFza1tpICYgM107XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJ1ZmZlciB0byBhbiBgQXJyYXlCdWZmZXJgLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWYgVGhlIGJ1ZmZlciB0byBjb252ZXJ0XG4gKiBAcmV0dXJuIHtBcnJheUJ1ZmZlcn0gQ29udmVydGVkIGJ1ZmZlclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiB0b0FycmF5QnVmZmVyJDEoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBidWYuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gYnVmLmJ1ZmZlcjtcbiAgfVxuXG4gIHJldHVybiBidWYuYnVmZmVyLnNsaWNlKGJ1Zi5ieXRlT2Zmc2V0LCBidWYuYnl0ZU9mZnNldCArIGJ1Zi5sZW5ndGgpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGBkYXRhYCB0byBhIGBCdWZmZXJgLlxuICpcbiAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgZGF0YSB0byBjb252ZXJ0XG4gKiBAcmV0dXJuIHtCdWZmZXJ9IFRoZSBidWZmZXJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn1cbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gdG9CdWZmZXIkMihkYXRhKSB7XG4gIHRvQnVmZmVyJDIucmVhZE9ubHkgPSB0cnVlO1xuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoZGF0YSkpIHJldHVybiBkYXRhO1xuXG4gIGxldCBidWY7XG5cbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIGJ1ZiA9IG5ldyBGYXN0QnVmZmVyJDIoZGF0YSk7XG4gIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpKSB7XG4gICAgYnVmID0gbmV3IEZhc3RCdWZmZXIkMihkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBkYXRhLmJ5dGVMZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgIHRvQnVmZmVyJDIucmVhZE9ubHkgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBidWY7XG59XG5cbmJ1ZmZlclV0aWwkMS5leHBvcnRzID0ge1xuICBjb25jYXQ6IGNvbmNhdCQxLFxuICBtYXNrOiBfbWFzayxcbiAgdG9BcnJheUJ1ZmZlcjogdG9BcnJheUJ1ZmZlciQxLFxuICB0b0J1ZmZlcjogdG9CdWZmZXIkMixcbiAgdW5tYXNrOiBfdW5tYXNrXG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAgKi9cbmlmICghcHJvY2Vzcy5lbnYuV1NfTk9fQlVGRkVSX1VUSUwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBidWZmZXJVdGlsID0gcmVxdWlyZSgnYnVmZmVydXRpbCcpO1xuXG4gICAgYnVmZmVyVXRpbEV4cG9ydHMubWFzayA9IGZ1bmN0aW9uIChzb3VyY2UsIG1hc2ssIG91dHB1dCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICAgIGlmIChsZW5ndGggPCA0OCkgX21hc2soc291cmNlLCBtYXNrLCBvdXRwdXQsIG9mZnNldCwgbGVuZ3RoKTtcbiAgICAgIGVsc2UgYnVmZmVyVXRpbC5tYXNrKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCk7XG4gICAgfTtcblxuICAgIGJ1ZmZlclV0aWxFeHBvcnRzLnVubWFzayA9IGZ1bmN0aW9uIChidWZmZXIsIG1hc2spIHtcbiAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgMzIpIF91bm1hc2soYnVmZmVyLCBtYXNrKTtcbiAgICAgIGVsc2UgYnVmZmVyVXRpbC51bm1hc2soYnVmZmVyLCBtYXNrKTtcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gQ29udGludWUgcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3IuXG4gIH1cbn1cblxuY29uc3Qga0RvbmUgPSBTeW1ib2woJ2tEb25lJyk7XG5jb25zdCBrUnVuID0gU3ltYm9sKCdrUnVuJyk7XG5cbi8qKlxuICogQSB2ZXJ5IHNpbXBsZSBqb2IgcXVldWUgd2l0aCBhZGp1c3RhYmxlIGNvbmN1cnJlbmN5LiBBZGFwdGVkIGZyb21cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9TVFJNTC9hc3luYy1saW1pdGVyXG4gKi9cbmxldCBMaW1pdGVyJDEgPSBjbGFzcyBMaW1pdGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYExpbWl0ZXJgLlxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2NvbmN1cnJlbmN5PUluZmluaXR5XSBUaGUgbWF4aW11bSBudW1iZXIgb2Ygam9icyBhbGxvd2VkXG4gICAqICAgICB0byBydW4gY29uY3VycmVudGx5XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25jdXJyZW5jeSkge1xuICAgIHRoaXNba0RvbmVdID0gKCkgPT4ge1xuICAgICAgdGhpcy5wZW5kaW5nLS07XG4gICAgICB0aGlzW2tSdW5dKCk7XG4gICAgfTtcbiAgICB0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3kgfHwgSW5maW5pdHk7XG4gICAgdGhpcy5qb2JzID0gW107XG4gICAgdGhpcy5wZW5kaW5nID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgam9iIHRvIHRoZSBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gam9iIFRoZSBqb2IgdG8gcnVuXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGFkZChqb2IpIHtcbiAgICB0aGlzLmpvYnMucHVzaChqb2IpO1xuICAgIHRoaXNba1J1bl0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgam9iIGZyb20gdGhlIHF1ZXVlIGFuZCBydW5zIGl0IGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgW2tSdW5dKCkge1xuICAgIGlmICh0aGlzLnBlbmRpbmcgPT09IHRoaXMuY29uY3VycmVuY3kpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmpvYnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBqb2IgPSB0aGlzLmpvYnMuc2hpZnQoKTtcblxuICAgICAgdGhpcy5wZW5kaW5nKys7XG4gICAgICBqb2IodGhpc1trRG9uZV0pO1xuICAgIH1cbiAgfVxufTtcblxudmFyIGxpbWl0ZXIgPSBMaW1pdGVyJDE7XG5cbmNvbnN0IHpsaWIgPSByZXF1aXJlJCQwJGE7XG5cbmNvbnN0IGJ1ZmZlclV0aWwgPSBidWZmZXJVdGlsRXhwb3J0cztcbmNvbnN0IExpbWl0ZXIgPSBsaW1pdGVyO1xuY29uc3QgeyBrU3RhdHVzQ29kZToga1N0YXR1c0NvZGUkMiB9ID0gY29uc3RhbnRzO1xuXG5jb25zdCBGYXN0QnVmZmVyJDEgPSBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdO1xuY29uc3QgVFJBSUxFUiA9IEJ1ZmZlci5mcm9tKFsweDAwLCAweDAwLCAweGZmLCAweGZmXSk7XG5jb25zdCBrUGVyTWVzc2FnZURlZmxhdGUgPSBTeW1ib2woJ3Blcm1lc3NhZ2UtZGVmbGF0ZScpO1xuY29uc3Qga1RvdGFsTGVuZ3RoID0gU3ltYm9sKCd0b3RhbC1sZW5ndGgnKTtcbmNvbnN0IGtDYWxsYmFjayA9IFN5bWJvbCgnY2FsbGJhY2snKTtcbmNvbnN0IGtCdWZmZXJzID0gU3ltYm9sKCdidWZmZXJzJyk7XG5jb25zdCBrRXJyb3IkMSA9IFN5bWJvbCgnZXJyb3InKTtcblxuLy9cbi8vIFdlIGxpbWl0IHpsaWIgY29uY3VycmVuY3ksIHdoaWNoIHByZXZlbnRzIHNldmVyZSBtZW1vcnkgZnJhZ21lbnRhdGlvblxuLy8gYXMgZG9jdW1lbnRlZCBpbiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzg4NzEjaXNzdWVjb21tZW50LTI1MDkxNTkxM1xuLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzL2lzc3Vlcy8xMjAyXG4vL1xuLy8gSW50ZW50aW9uYWxseSBnbG9iYWw7IGl0J3MgdGhlIGdsb2JhbCB0aHJlYWQgcG9vbCB0aGF0J3MgYW4gaXNzdWUuXG4vL1xubGV0IHpsaWJMaW1pdGVyO1xuXG4vKipcbiAqIHBlcm1lc3NhZ2UtZGVmbGF0ZSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xubGV0IFBlck1lc3NhZ2VEZWZsYXRlJDQgPSBjbGFzcyBQZXJNZXNzYWdlRGVmbGF0ZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgUGVyTWVzc2FnZURlZmxhdGUgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TnVtYmVyKX0gW29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0c10gQWR2ZXJ0aXNlIHN1cHBvcnRcbiAgICogICAgIGZvciwgb3IgcmVxdWVzdCwgYSBjdXN0b20gY2xpZW50IHdpbmRvdyBzaXplXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXI9ZmFsc2VdIEFkdmVydGlzZS9cbiAgICogICAgIGFja25vd2xlZGdlIGRpc2FibGluZyBvZiBjbGllbnQgY29udGV4dCB0YWtlb3ZlclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY29uY3VycmVuY3lMaW1pdD0xMF0gVGhlIG51bWJlciBvZiBjb25jdXJyZW50XG4gICAqICAgICBjYWxscyB0byB6bGliXG4gICAqIEBwYXJhbSB7KEJvb2xlYW58TnVtYmVyKX0gW29wdGlvbnMuc2VydmVyTWF4V2luZG93Qml0c10gUmVxdWVzdC9jb25maXJtIHRoZVxuICAgKiAgICAgdXNlIG9mIGEgY3VzdG9tIHNlcnZlciB3aW5kb3cgc2l6ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNlcnZlck5vQ29udGV4dFRha2VvdmVyPWZhbHNlXSBSZXF1ZXN0L2FjY2VwdFxuICAgKiAgICAgZGlzYWJsaW5nIG9mIHNlcnZlciBjb250ZXh0IHRha2VvdmVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aHJlc2hvbGQ9MTAyNF0gU2l6ZSAoaW4gYnl0ZXMpIGJlbG93IHdoaWNoXG4gICAqICAgICBtZXNzYWdlcyBzaG91bGQgbm90IGJlIGNvbXByZXNzZWQgaWYgY29udGV4dCB0YWtlb3ZlciBpcyBkaXNhYmxlZFxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuemxpYkRlZmxhdGVPcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gemxpYiBvblxuICAgKiAgICAgZGVmbGF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuemxpYkluZmxhdGVPcHRpb25zXSBPcHRpb25zIHRvIHBhc3MgdG8gemxpYiBvblxuICAgKiAgICAgaW5mbGF0ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtpc1NlcnZlcj1mYWxzZV0gQ3JlYXRlIHRoZSBpbnN0YW5jZSBpbiBlaXRoZXIgc2VydmVyIG9yXG4gICAqICAgICBjbGllbnQgbW9kZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW21heFBheWxvYWQ9MF0gVGhlIG1heGltdW0gYWxsb3dlZCBtZXNzYWdlIGxlbmd0aFxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucywgaXNTZXJ2ZXIsIG1heFBheWxvYWQpIHtcbiAgICB0aGlzLl9tYXhQYXlsb2FkID0gbWF4UGF5bG9hZCB8IDA7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy5fdGhyZXNob2xkID1cbiAgICAgIHRoaXMuX29wdGlvbnMudGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB0aGlzLl9vcHRpb25zLnRocmVzaG9sZCA6IDEwMjQ7XG4gICAgdGhpcy5faXNTZXJ2ZXIgPSAhIWlzU2VydmVyO1xuICAgIHRoaXMuX2RlZmxhdGUgPSBudWxsO1xuICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuXG4gICAgdGhpcy5wYXJhbXMgPSBudWxsO1xuXG4gICAgaWYgKCF6bGliTGltaXRlcikge1xuICAgICAgY29uc3QgY29uY3VycmVuY3kgPVxuICAgICAgICB0aGlzLl9vcHRpb25zLmNvbmN1cnJlbmN5TGltaXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdGhpcy5fb3B0aW9ucy5jb25jdXJyZW5jeUxpbWl0XG4gICAgICAgICAgOiAxMDtcbiAgICAgIHpsaWJMaW1pdGVyID0gbmV3IExpbWl0ZXIoY29uY3VycmVuY3kpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGdldCBleHRlbnNpb25OYW1lKCkge1xuICAgIHJldHVybiAncGVybWVzc2FnZS1kZWZsYXRlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyLlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9IEV4dGVuc2lvbiBwYXJhbWV0ZXJzXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIG9mZmVyKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIHBhcmFtcy5zZXJ2ZXJfbm9fY29udGV4dF90YWtlb3ZlciA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLmNsaWVudE5vQ29udGV4dFRha2VvdmVyKSB7XG4gICAgICBwYXJhbXMuY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXIgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzKSB7XG4gICAgICBwYXJhbXMuc2VydmVyX21heF93aW5kb3dfYml0cyA9IHRoaXMuX29wdGlvbnMuc2VydmVyTWF4V2luZG93Qml0cztcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cykge1xuICAgICAgcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPSB0aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHM7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHMgPT0gbnVsbCkge1xuICAgICAgcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0IGFuIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiBvZmZlci9yZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gY29uZmlndXJhdGlvbnMgVGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiBvZmZlcnMvcmVwb25zZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IEFjY2VwdGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgYWNjZXB0KGNvbmZpZ3VyYXRpb25zKSB7XG4gICAgY29uZmlndXJhdGlvbnMgPSB0aGlzLm5vcm1hbGl6ZVBhcmFtcyhjb25maWd1cmF0aW9ucyk7XG5cbiAgICB0aGlzLnBhcmFtcyA9IHRoaXMuX2lzU2VydmVyXG4gICAgICA/IHRoaXMuYWNjZXB0QXNTZXJ2ZXIoY29uZmlndXJhdGlvbnMpXG4gICAgICA6IHRoaXMuYWNjZXB0QXNDbGllbnQoY29uZmlndXJhdGlvbnMpO1xuXG4gICAgcmV0dXJuIHRoaXMucGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBjbGVhbnVwKCkge1xuICAgIGlmICh0aGlzLl9pbmZsYXRlKSB7XG4gICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XG4gICAgICB0aGlzLl9pbmZsYXRlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZGVmbGF0ZSkge1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLl9kZWZsYXRlW2tDYWxsYmFja107XG5cbiAgICAgIHRoaXMuX2RlZmxhdGUuY2xvc2UoKTtcbiAgICAgIHRoaXMuX2RlZmxhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1RoZSBkZWZsYXRlIHN0cmVhbSB3YXMgY2xvc2VkIHdoaWxlIGRhdGEgd2FzIGJlaW5nIHByb2Nlc3NlZCdcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqICBBY2NlcHQgYW4gZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBvZmZlcnMgVGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiBvZmZlcnNcbiAgICogQHJldHVybiB7T2JqZWN0fSBBY2NlcHRlZCBjb25maWd1cmF0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhY2NlcHRBc1NlcnZlcihvZmZlcnMpIHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5fb3B0aW9ucztcbiAgICBjb25zdCBhY2NlcHRlZCA9IG9mZmVycy5maW5kKChwYXJhbXMpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgKG9wdHMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXIgPT09IGZhbHNlICYmXG4gICAgICAgICAgcGFyYW1zLnNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyKSB8fFxuICAgICAgICAocGFyYW1zLnNlcnZlcl9tYXhfd2luZG93X2JpdHMgJiZcbiAgICAgICAgICAob3B0cy5zZXJ2ZXJNYXhXaW5kb3dCaXRzID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgKHR5cGVvZiBvcHRzLnNlcnZlck1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgIG9wdHMuc2VydmVyTWF4V2luZG93Qml0cyA+IHBhcmFtcy5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzKSkpIHx8XG4gICAgICAgICh0eXBlb2Ygb3B0cy5jbGllbnRNYXhXaW5kb3dCaXRzID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICFwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgaWYgKCFhY2NlcHRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb25lIG9mIHRoZSBleHRlbnNpb24gb2ZmZXJzIGNhbiBiZSBhY2NlcHRlZCcpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnNlcnZlck5vQ29udGV4dFRha2VvdmVyKSB7XG4gICAgICBhY2NlcHRlZC5zZXJ2ZXJfbm9fY29udGV4dF90YWtlb3ZlciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChvcHRzLmNsaWVudE5vQ29udGV4dFRha2VvdmVyKSB7XG4gICAgICBhY2NlcHRlZC5jbGllbnRfbm9fY29udGV4dF90YWtlb3ZlciA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0cy5zZXJ2ZXJNYXhXaW5kb3dCaXRzID09PSAnbnVtYmVyJykge1xuICAgICAgYWNjZXB0ZWQuc2VydmVyX21heF93aW5kb3dfYml0cyA9IG9wdHMuc2VydmVyTWF4V2luZG93Qml0cztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInKSB7XG4gICAgICBhY2NlcHRlZC5jbGllbnRfbWF4X3dpbmRvd19iaXRzID0gb3B0cy5jbGllbnRNYXhXaW5kb3dCaXRzO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBhY2NlcHRlZC5jbGllbnRfbWF4X3dpbmRvd19iaXRzID09PSB0cnVlIHx8XG4gICAgICBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHMgPT09IGZhbHNlXG4gICAgKSB7XG4gICAgICBkZWxldGUgYWNjZXB0ZWQuY2xpZW50X21heF93aW5kb3dfYml0cztcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjZXB0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0IHRoZSBleHRlbnNpb24gbmVnb3RpYXRpb24gcmVzcG9uc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHJlc3BvbnNlIFRoZSBleHRlbnNpb24gbmVnb3RpYXRpb24gcmVzcG9uc2VcbiAgICogQHJldHVybiB7T2JqZWN0fSBBY2NlcHRlZCBjb25maWd1cmF0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhY2NlcHRBc0NsaWVudChyZXNwb25zZSkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHJlc3BvbnNlWzBdO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5fb3B0aW9ucy5jbGllbnROb0NvbnRleHRUYWtlb3ZlciA9PT0gZmFsc2UgJiZcbiAgICAgIHBhcmFtcy5jbGllbnRfbm9fY29udGV4dF90YWtlb3ZlclxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHBhcmFtZXRlciBcImNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyXCInKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jbGllbnRfbWF4X3dpbmRvd19iaXRzKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPSB0aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cyA9PT0gZmFsc2UgfHxcbiAgICAgICh0eXBlb2YgdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzID09PSAnbnVtYmVyJyAmJlxuICAgICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA+IHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1VuZXhwZWN0ZWQgb3IgaW52YWxpZCBwYXJhbWV0ZXIgXCJjbGllbnRfbWF4X3dpbmRvd19iaXRzXCInXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbmZpZ3VyYXRpb25zIFRoZSBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXJzL3JlcG9uc2VcbiAgICogQHJldHVybiB7QXJyYXl9IFRoZSBvZmZlcnMvcmVzcG9uc2Ugd2l0aCBub3JtYWxpemVkIHBhcmFtZXRlcnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG5vcm1hbGl6ZVBhcmFtcyhjb25maWd1cmF0aW9ucykge1xuICAgIGNvbmZpZ3VyYXRpb25zLmZvckVhY2goKHBhcmFtcykgPT4ge1xuICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gcGFyYW1zW2tleV07XG5cbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmFtZXRlciBcIiR7a2V5fVwiIG11c3QgaGF2ZSBvbmx5IGEgc2luZ2xlIHZhbHVlYCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IHZhbHVlWzBdO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdjbGllbnRfbWF4X3dpbmRvd19iaXRzJykge1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgbnVtID0gK3ZhbHVlO1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtIDwgOCB8fCBudW0gPiAxNSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgXCIke2tleX1cIjogJHt2YWx1ZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IG51bTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc1NlcnZlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgYEludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciBcIiR7a2V5fVwiOiAke3ZhbHVlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3NlcnZlcl9tYXhfd2luZG93X2JpdHMnKSB7XG4gICAgICAgICAgY29uc3QgbnVtID0gK3ZhbHVlO1xuICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihudW0pIHx8IG51bSA8IDggfHwgbnVtID4gMTUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgXCIke2tleX1cIjogJHt2YWx1ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZSA9IG51bTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBrZXkgPT09ICdjbGllbnRfbm9fY29udGV4dF90YWtlb3ZlcicgfHxcbiAgICAgICAgICBrZXkgPT09ICdzZXJ2ZXJfbm9fY29udGV4dF90YWtlb3ZlcidcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyIFwiJHtrZXl9XCI6ICR7dmFsdWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHBhcmFtZXRlciBcIiR7a2V5fVwiYCk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29uZmlndXJhdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogRGVjb21wcmVzcyBkYXRhLiBDb25jdXJyZW5jeSBsaW1pdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBDb21wcmVzc2VkIGRhdGFcbiAgICogQHBhcmFtIHtCb29sZWFufSBmaW4gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgdGhlIGxhc3QgZnJhZ21lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2tcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZGVjb21wcmVzcyhkYXRhLCBmaW4sIGNhbGxiYWNrKSB7XG4gICAgemxpYkxpbWl0ZXIuYWRkKChkb25lKSA9PiB7XG4gICAgICB0aGlzLl9kZWNvbXByZXNzKGRhdGEsIGZpbiwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHJlc3MgZGF0YS4gQ29uY3VycmVuY3kgbGltaXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHsoQnVmZmVyfFN0cmluZyl9IGRhdGEgRGF0YSB0byBjb21wcmVzc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBjb21wcmVzcyhkYXRhLCBmaW4sIGNhbGxiYWNrKSB7XG4gICAgemxpYkxpbWl0ZXIuYWRkKChkb25lKSA9PiB7XG4gICAgICB0aGlzLl9jb21wcmVzcyhkYXRhLCBmaW4sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICBkb25lKCk7XG4gICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29tcHJlc3MgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgQ29tcHJlc3NlZCBkYXRhXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZmluIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIHRoZSBsYXN0IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZGVjb21wcmVzcyhkYXRhLCBmaW4sIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLl9pc1NlcnZlciA/ICdjbGllbnQnIDogJ3NlcnZlcic7XG5cbiAgICBpZiAoIXRoaXMuX2luZmxhdGUpIHtcbiAgICAgIGNvbnN0IGtleSA9IGAke2VuZHBvaW50fV9tYXhfd2luZG93X2JpdHNgO1xuICAgICAgY29uc3Qgd2luZG93Qml0cyA9XG4gICAgICAgIHR5cGVvZiB0aGlzLnBhcmFtc1trZXldICE9PSAnbnVtYmVyJ1xuICAgICAgICAgID8gemxpYi5aX0RFRkFVTFRfV0lORE9XQklUU1xuICAgICAgICAgIDogdGhpcy5wYXJhbXNba2V5XTtcblxuICAgICAgdGhpcy5faW5mbGF0ZSA9IHpsaWIuY3JlYXRlSW5mbGF0ZVJhdyh7XG4gICAgICAgIC4uLnRoaXMuX29wdGlvbnMuemxpYkluZmxhdGVPcHRpb25zLFxuICAgICAgICB3aW5kb3dCaXRzXG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2luZmxhdGVba1Blck1lc3NhZ2VEZWZsYXRlXSA9IHRoaXM7XG4gICAgICB0aGlzLl9pbmZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xuICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10gPSBbXTtcbiAgICAgIHRoaXMuX2luZmxhdGUub24oJ2Vycm9yJywgaW5mbGF0ZU9uRXJyb3IpO1xuICAgICAgdGhpcy5faW5mbGF0ZS5vbignZGF0YScsIGluZmxhdGVPbkRhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuX2luZmxhdGVba0NhbGxiYWNrXSA9IGNhbGxiYWNrO1xuXG4gICAgdGhpcy5faW5mbGF0ZS53cml0ZShkYXRhKTtcbiAgICBpZiAoZmluKSB0aGlzLl9pbmZsYXRlLndyaXRlKFRSQUlMRVIpO1xuXG4gICAgdGhpcy5faW5mbGF0ZS5mbHVzaCgoKSA9PiB7XG4gICAgICBjb25zdCBlcnIgPSB0aGlzLl9pbmZsYXRlW2tFcnJvciQxXTtcblxuICAgICAgaWYgKGVycikge1xuICAgICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBidWZmZXJVdGlsLmNvbmNhdChcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10sXG4gICAgICAgIHRoaXMuX2luZmxhdGVba1RvdGFsTGVuZ3RoXVxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuX2luZmxhdGUuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrVG90YWxMZW5ndGhdID0gMDtcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgICBpZiAoZmluICYmIHRoaXMucGFyYW1zW2Ake2VuZHBvaW50fV9ub19jb250ZXh0X3Rha2VvdmVyYF0pIHtcbiAgICAgICAgICB0aGlzLl9pbmZsYXRlLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHJlc3MgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHsoQnVmZmVyfFN0cmluZyl9IGRhdGEgRGF0YSB0byBjb21wcmVzc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuX2lzU2VydmVyID8gJ3NlcnZlcicgOiAnY2xpZW50JztcblxuICAgIGlmICghdGhpcy5fZGVmbGF0ZSkge1xuICAgICAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnR9X21heF93aW5kb3dfYml0c2A7XG4gICAgICBjb25zdCB3aW5kb3dCaXRzID1cbiAgICAgICAgdHlwZW9mIHRoaXMucGFyYW1zW2tleV0gIT09ICdudW1iZXInXG4gICAgICAgICAgPyB6bGliLlpfREVGQVVMVF9XSU5ET1dCSVRTXG4gICAgICAgICAgOiB0aGlzLnBhcmFtc1trZXldO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlID0gemxpYi5jcmVhdGVEZWZsYXRlUmF3KHtcbiAgICAgICAgLi4udGhpcy5fb3B0aW9ucy56bGliRGVmbGF0ZU9wdGlvbnMsXG4gICAgICAgIHdpbmRvd0JpdHNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xuICAgICAgdGhpcy5fZGVmbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgdGhpcy5fZGVmbGF0ZS5vbignZGF0YScsIGRlZmxhdGVPbkRhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuX2RlZmxhdGVba0NhbGxiYWNrXSA9IGNhbGxiYWNrO1xuXG4gICAgdGhpcy5fZGVmbGF0ZS53cml0ZShkYXRhKTtcbiAgICB0aGlzLl9kZWZsYXRlLmZsdXNoKHpsaWIuWl9TWU5DX0ZMVVNILCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2RlZmxhdGUpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGRlZmxhdGUgc3RyZWFtIHdhcyBjbG9zZWQgd2hpbGUgZGF0YSB3YXMgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAgICAvL1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhID0gYnVmZmVyVXRpbC5jb25jYXQoXG4gICAgICAgIHRoaXMuX2RlZmxhdGVba0J1ZmZlcnNdLFxuICAgICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF1cbiAgICAgICk7XG5cbiAgICAgIGlmIChmaW4pIHtcbiAgICAgICAgZGF0YSA9IG5ldyBGYXN0QnVmZmVyJDEoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5sZW5ndGggLSA0KTtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgYWdhaW4gaW5cbiAgICAgIC8vIGBQZXJNZXNzYWdlRGVmbGF0ZSNjbGVhbnVwKClgLlxuICAgICAgLy9cbiAgICAgIHRoaXMuX2RlZmxhdGVba0NhbGxiYWNrXSA9IG51bGw7XG5cbiAgICAgIHRoaXMuX2RlZmxhdGVba1RvdGFsTGVuZ3RoXSA9IDA7XG4gICAgICB0aGlzLl9kZWZsYXRlW2tCdWZmZXJzXSA9IFtdO1xuXG4gICAgICBpZiAoZmluICYmIHRoaXMucGFyYW1zW2Ake2VuZHBvaW50fV9ub19jb250ZXh0X3Rha2VvdmVyYF0pIHtcbiAgICAgICAgdGhpcy5fZGVmbGF0ZS5yZXNldCgpO1xuICAgICAgfVxuXG4gICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICB9KTtcbiAgfVxufTtcblxudmFyIHBlcm1lc3NhZ2VEZWZsYXRlID0gUGVyTWVzc2FnZURlZmxhdGUkNDtcblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGB6bGliLkRlZmxhdGVSYXdgIHN0cmVhbSBgJ2RhdGEnYCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgQSBjaHVuayBvZiBkYXRhXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZsYXRlT25EYXRhKGNodW5rKSB7XG4gIHRoaXNba0J1ZmZlcnNdLnB1c2goY2h1bmspO1xuICB0aGlzW2tUb3RhbExlbmd0aF0gKz0gY2h1bmsubGVuZ3RoO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYHpsaWIuSW5mbGF0ZVJhd2Agc3RyZWFtIGAnZGF0YSdgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayBBIGNodW5rIG9mIGRhdGFcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluZmxhdGVPbkRhdGEoY2h1bmspIHtcbiAgdGhpc1trVG90YWxMZW5ndGhdICs9IGNodW5rLmxlbmd0aDtcblxuICBpZiAoXG4gICAgdGhpc1trUGVyTWVzc2FnZURlZmxhdGVdLl9tYXhQYXlsb2FkIDwgMSB8fFxuICAgIHRoaXNba1RvdGFsTGVuZ3RoXSA8PSB0aGlzW2tQZXJNZXNzYWdlRGVmbGF0ZV0uX21heFBheWxvYWRcbiAgKSB7XG4gICAgdGhpc1trQnVmZmVyc10ucHVzaChjaHVuayk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpc1trRXJyb3IkMV0gPSBuZXcgUmFuZ2VFcnJvcignTWF4IHBheWxvYWQgc2l6ZSBleGNlZWRlZCcpO1xuICB0aGlzW2tFcnJvciQxXS5jb2RlID0gJ1dTX0VSUl9VTlNVUFBPUlRFRF9NRVNTQUdFX0xFTkdUSCc7XG4gIHRoaXNba0Vycm9yJDFdW2tTdGF0dXNDb2RlJDJdID0gMTAwOTtcbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIGluZmxhdGVPbkRhdGEpO1xuICB0aGlzLnJlc2V0KCk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgemxpYi5JbmZsYXRlUmF3YCBzdHJlYW0gYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyciBUaGUgZW1pdHRlZCBlcnJvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW5mbGF0ZU9uRXJyb3IoZXJyKSB7XG4gIC8vXG4gIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbCBgWmxpYiNjbG9zZSgpYCBhcyB0aGUgaGFuZGxlIGlzIGF1dG9tYXRpY2FsbHlcbiAgLy8gY2xvc2VkIHdoZW4gYW4gZXJyb3IgaXMgZW1pdHRlZC5cbiAgLy9cbiAgdGhpc1trUGVyTWVzc2FnZURlZmxhdGVdLl9pbmZsYXRlID0gbnVsbDtcbiAgZXJyW2tTdGF0dXNDb2RlJDJdID0gMTAwNztcbiAgdGhpc1trQ2FsbGJhY2tdKGVycik7XG59XG5cbnZhciB2YWxpZGF0aW9uRXhwb3J0cyA9IHt9O1xudmFyIHZhbGlkYXRpb24gPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiB2YWxpZGF0aW9uRXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IHZhbGlkYXRpb25FeHBvcnRzID0gdjsgfSxcbn07XG5cbmNvbnN0IHsgaXNVdGY4IH0gPSByZXF1aXJlJCQwJGI7XG5cbi8vXG4vLyBBbGxvd2VkIHRva2VuIGNoYXJhY3RlcnM6XG4vL1xuLy8gJyEnLCAnIycsICckJywgJyUnLCAnJicsICcnJywgJyonLCAnKycsICctJyxcbi8vICcuJywgMC05LCBBLVosICdeJywgJ18nLCAnYCcsIGEteiwgJ3wnLCAnfidcbi8vXG4vLyB0b2tlbkNoYXJzWzMyXSA9PT0gMCAvLyAnICdcbi8vIHRva2VuQ2hhcnNbMzNdID09PSAxIC8vICchJ1xuLy8gdG9rZW5DaGFyc1szNF0gPT09IDAgLy8gJ1wiJ1xuLy8gLi4uXG4vL1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCB0b2tlbkNoYXJzJDIgPSBbXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDAgLSAxNVxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAxNiAtIDMxXG4gIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDAsIC8vIDMyIC0gNDdcbiAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gNDggLSA2M1xuICAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyA2NCAtIDc5XG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDEsIDEsIC8vIDgwIC0gOTVcbiAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gOTYgLSAxMTFcbiAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMCwgMSwgMCAvLyAxMTIgLSAxMjdcbl07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3RhdHVzIGNvZGUgaXMgYWxsb3dlZCBpbiBhIGNsb3NlIGZyYW1lLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlIFRoZSBzdGF0dXMgY29kZVxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBzdGF0dXMgY29kZSBpcyB2YWxpZCwgZWxzZSBgZmFsc2VgXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTdGF0dXNDb2RlJDIoY29kZSkge1xuICByZXR1cm4gKFxuICAgIChjb2RlID49IDEwMDAgJiZcbiAgICAgIGNvZGUgPD0gMTAxNCAmJlxuICAgICAgY29kZSAhPT0gMTAwNCAmJlxuICAgICAgY29kZSAhPT0gMTAwNSAmJlxuICAgICAgY29kZSAhPT0gMTAwNikgfHxcbiAgICAoY29kZSA+PSAzMDAwICYmIGNvZGUgPD0gNDk5OSlcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBidWZmZXIgY29udGFpbnMgb25seSBjb3JyZWN0IFVURi04LlxuICogUG9ydGVkIGZyb20gaHR0cHM6Ly93d3cuY2wuY2FtLmFjLnVrLyU3RW1nazI1L3Vjcy91dGY4X2NoZWNrLmMgYnlcbiAqIE1hcmt1cyBLdWhuLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWYgVGhlIGJ1ZmZlciB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGBidWZgIGNvbnRhaW5zIG9ubHkgY29ycmVjdCBVVEYtOCwgZWxzZSBgZmFsc2VgXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIF9pc1ZhbGlkVVRGOChidWYpIHtcbiAgY29uc3QgbGVuID0gYnVmLmxlbmd0aDtcbiAgbGV0IGkgPSAwO1xuXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgaWYgKChidWZbaV0gJiAweDgwKSA9PT0gMCkge1xuICAgICAgLy8gMHh4eHh4eHhcbiAgICAgIGkrKztcbiAgICB9IGVsc2UgaWYgKChidWZbaV0gJiAweGUwKSA9PT0gMHhjMCkge1xuICAgICAgLy8gMTEweHh4eHggMTB4eHh4eHhcbiAgICAgIGlmIChcbiAgICAgICAgaSArIDEgPT09IGxlbiB8fFxuICAgICAgICAoYnVmW2kgKyAxXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaV0gJiAweGZlKSA9PT0gMHhjMCAvLyBPdmVybG9uZ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSArPSAyO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZjApID09PSAweGUwKSB7XG4gICAgICAvLyAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMiA+PSBsZW4gfHxcbiAgICAgICAgKGJ1ZltpICsgMV0gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICAoYnVmW2kgKyAyXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaV0gPT09IDB4ZTAgJiYgKGJ1ZltpICsgMV0gJiAweGUwKSA9PT0gMHg4MCkgfHwgLy8gT3ZlcmxvbmdcbiAgICAgICAgKGJ1ZltpXSA9PT0gMHhlZCAmJiAoYnVmW2kgKyAxXSAmIDB4ZTApID09PSAweGEwKSAvLyBTdXJyb2dhdGUgKFUrRDgwMCAtIFUrREZGRilcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGkgKz0gMztcbiAgICB9IGVsc2UgaWYgKChidWZbaV0gJiAweGY4KSA9PT0gMHhmMCkge1xuICAgICAgLy8gMTExMTB4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHhcbiAgICAgIGlmIChcbiAgICAgICAgaSArIDMgPj0gbGVuIHx8XG4gICAgICAgIChidWZbaSArIDFdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpICsgMl0gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICAoYnVmW2kgKyAzXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaV0gPT09IDB4ZjAgJiYgKGJ1ZltpICsgMV0gJiAweGYwKSA9PT0gMHg4MCkgfHwgLy8gT3ZlcmxvbmdcbiAgICAgICAgKGJ1ZltpXSA9PT0gMHhmNCAmJiBidWZbaSArIDFdID4gMHg4ZikgfHxcbiAgICAgICAgYnVmW2ldID4gMHhmNCAvLyA+IFUrMTBGRkZGXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpICs9IDQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxudmFsaWRhdGlvbi5leHBvcnRzID0ge1xuICBpc1ZhbGlkU3RhdHVzQ29kZTogaXNWYWxpZFN0YXR1c0NvZGUkMixcbiAgaXNWYWxpZFVURjg6IF9pc1ZhbGlkVVRGOCxcbiAgdG9rZW5DaGFyczogdG9rZW5DaGFycyQyXG59O1xuXG5pZiAoaXNVdGY4KSB7XG4gIHZhbGlkYXRpb25FeHBvcnRzLmlzVmFsaWRVVEY4ID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgIHJldHVybiBidWYubGVuZ3RoIDwgMjQgPyBfaXNWYWxpZFVURjgoYnVmKSA6IGlzVXRmOChidWYpO1xuICB9O1xufSAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAgKi8gZWxzZSBpZiAoIXByb2Nlc3MuZW52LldTX05PX1VURl84X1ZBTElEQVRFKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgaXNWYWxpZFVURjggPSByZXF1aXJlKCd1dGYtOC12YWxpZGF0ZScpO1xuXG4gICAgdmFsaWRhdGlvbkV4cG9ydHMuaXNWYWxpZFVURjggPSBmdW5jdGlvbiAoYnVmKSB7XG4gICAgICByZXR1cm4gYnVmLmxlbmd0aCA8IDMyID8gX2lzVmFsaWRVVEY4KGJ1ZikgOiBpc1ZhbGlkVVRGOChidWYpO1xuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBDb250aW51ZSByZWdhcmRsZXNzIG9mIHRoZSBlcnJvci5cbiAgfVxufVxuXG5jb25zdCB7IFdyaXRhYmxlOiBXcml0YWJsZSQxIH0gPSByZXF1aXJlJCQwJDc7XG5cbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlJDMgPSBwZXJtZXNzYWdlRGVmbGF0ZTtcbmNvbnN0IHtcbiAgQklOQVJZX1RZUEVTOiBCSU5BUllfVFlQRVMkMSxcbiAgRU1QVFlfQlVGRkVSOiBFTVBUWV9CVUZGRVIkMixcbiAga1N0YXR1c0NvZGU6IGtTdGF0dXNDb2RlJDEsXG4gIGtXZWJTb2NrZXQ6IGtXZWJTb2NrZXQkMlxufSA9IGNvbnN0YW50cztcbmNvbnN0IHsgY29uY2F0LCB0b0FycmF5QnVmZmVyLCB1bm1hc2sgfSA9IGJ1ZmZlclV0aWxFeHBvcnRzO1xuY29uc3QgeyBpc1ZhbGlkU3RhdHVzQ29kZTogaXNWYWxpZFN0YXR1c0NvZGUkMSwgaXNWYWxpZFVURjggfSA9IHZhbGlkYXRpb25FeHBvcnRzO1xuXG5jb25zdCBGYXN0QnVmZmVyID0gQnVmZmVyW1N5bWJvbC5zcGVjaWVzXTtcbmNvbnN0IEdFVF9JTkZPID0gMDtcbmNvbnN0IEdFVF9QQVlMT0FEX0xFTkdUSF8xNiA9IDE7XG5jb25zdCBHRVRfUEFZTE9BRF9MRU5HVEhfNjQgPSAyO1xuY29uc3QgR0VUX01BU0sgPSAzO1xuY29uc3QgR0VUX0RBVEEgPSA0O1xuY29uc3QgSU5GTEFUSU5HID0gNTtcblxuLyoqXG4gKiBIeUJpIFJlY2VpdmVyIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBleHRlbmRzIFdyaXRhYmxlXG4gKi9cbmxldCBSZWNlaXZlciQxID0gY2xhc3MgUmVjZWl2ZXIgZXh0ZW5kcyBXcml0YWJsZSQxIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBSZWNlaXZlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYmluYXJ5VHlwZT1ub2RlYnVmZmVyXSBUaGUgdHlwZSBmb3IgYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmV4dGVuc2lvbnNdIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBuZWdvdGlhdGVkXG4gICAqICAgICBleHRlbnNpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuaXNTZXJ2ZXI9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIHRvIG9wZXJhdGUgaW5cbiAgICogICAgIGNsaWVudCBvciBzZXJ2ZXIgbW9kZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0wXSBUaGUgbWF4aW11bSBhbGxvd2VkIG1lc3NhZ2UgbGVuZ3RoXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvclxuICAgKiAgICAgbm90IHRvIHNraXAgVVRGLTggdmFsaWRhdGlvbiBmb3IgdGV4dCBhbmQgY2xvc2UgbWVzc2FnZXNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9iaW5hcnlUeXBlID0gb3B0aW9ucy5iaW5hcnlUeXBlIHx8IEJJTkFSWV9UWVBFUyQxWzBdO1xuICAgIHRoaXMuX2V4dGVuc2lvbnMgPSBvcHRpb25zLmV4dGVuc2lvbnMgfHwge307XG4gICAgdGhpcy5faXNTZXJ2ZXIgPSAhIW9wdGlvbnMuaXNTZXJ2ZXI7XG4gICAgdGhpcy5fbWF4UGF5bG9hZCA9IG9wdGlvbnMubWF4UGF5bG9hZCB8IDA7XG4gICAgdGhpcy5fc2tpcFVURjhWYWxpZGF0aW9uID0gISFvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbjtcbiAgICB0aGlzW2tXZWJTb2NrZXQkMl0gPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMDtcbiAgICB0aGlzLl9idWZmZXJzID0gW107XG5cbiAgICB0aGlzLl9jb21wcmVzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5fcGF5bG9hZExlbmd0aCA9IDA7XG4gICAgdGhpcy5fbWFzayA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9mcmFnbWVudGVkID0gMDtcbiAgICB0aGlzLl9tYXNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9maW4gPSBmYWxzZTtcbiAgICB0aGlzLl9vcGNvZGUgPSAwO1xuXG4gICAgdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudHMgPSBbXTtcblxuICAgIHRoaXMuX3N0YXRlID0gR0VUX0lORk87XG4gICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgYFdyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGUoKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayBUaGUgY2h1bmsgb2YgZGF0YSB0byB3cml0ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZW5jb2RpbmcgVGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiBgY2h1bmtgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDB4MDggJiYgdGhpcy5fc3RhdGUgPT0gR0VUX0lORk8pIHJldHVybiBjYigpO1xuXG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyArPSBjaHVuay5sZW5ndGg7XG4gICAgdGhpcy5fYnVmZmVycy5wdXNoKGNodW5rKTtcbiAgICB0aGlzLnN0YXJ0TG9vcChjYik7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZXMgYG5gIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29uc3VtZVxuICAgKiBAcmV0dXJuIHtCdWZmZXJ9IFRoZSBjb25zdW1lZCBieXRlc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3VtZShuKSB7XG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyAtPSBuO1xuXG4gICAgaWYgKG4gPT09IHRoaXMuX2J1ZmZlcnNbMF0ubGVuZ3RoKSByZXR1cm4gdGhpcy5fYnVmZmVycy5zaGlmdCgpO1xuXG4gICAgaWYgKG4gPCB0aGlzLl9idWZmZXJzWzBdLmxlbmd0aCkge1xuICAgICAgY29uc3QgYnVmID0gdGhpcy5fYnVmZmVyc1swXTtcbiAgICAgIHRoaXMuX2J1ZmZlcnNbMF0gPSBuZXcgRmFzdEJ1ZmZlcihcbiAgICAgICAgYnVmLmJ1ZmZlcixcbiAgICAgICAgYnVmLmJ5dGVPZmZzZXQgKyBuLFxuICAgICAgICBidWYubGVuZ3RoIC0gblxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIG5ldyBGYXN0QnVmZmVyKGJ1Zi5idWZmZXIsIGJ1Zi5ieXRlT2Zmc2V0LCBuKTtcbiAgICB9XG5cbiAgICBjb25zdCBkc3QgPSBCdWZmZXIuYWxsb2NVbnNhZmUobik7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBidWYgPSB0aGlzLl9idWZmZXJzWzBdO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gZHN0Lmxlbmd0aCAtIG47XG5cbiAgICAgIGlmIChuID49IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgZHN0LnNldCh0aGlzLl9idWZmZXJzLnNoaWZ0KCksIG9mZnNldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkc3Quc2V0KG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIGJ1Zi5ieXRlT2Zmc2V0LCBuKSwgb2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fYnVmZmVyc1swXSA9IG5ldyBGYXN0QnVmZmVyKFxuICAgICAgICAgIGJ1Zi5idWZmZXIsXG4gICAgICAgICAgYnVmLmJ5dGVPZmZzZXQgKyBuLFxuICAgICAgICAgIGJ1Zi5sZW5ndGggLSBuXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG4gLT0gYnVmLmxlbmd0aDtcbiAgICB9IHdoaWxlIChuID4gMCk7XG5cbiAgICByZXR1cm4gZHN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGFyc2luZyBsb29wLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhcnRMb29wKGNiKSB7XG4gICAgbGV0IGVycjtcbiAgICB0aGlzLl9sb29wID0gdHJ1ZTtcblxuICAgIGRvIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fc3RhdGUpIHtcbiAgICAgICAgY2FzZSBHRVRfSU5GTzpcbiAgICAgICAgICBlcnIgPSB0aGlzLmdldEluZm8oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBHRVRfUEFZTE9BRF9MRU5HVEhfMTY6XG4gICAgICAgICAgZXJyID0gdGhpcy5nZXRQYXlsb2FkTGVuZ3RoMTYoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBHRVRfUEFZTE9BRF9MRU5HVEhfNjQ6XG4gICAgICAgICAgZXJyID0gdGhpcy5nZXRQYXlsb2FkTGVuZ3RoNjQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBHRVRfTUFTSzpcbiAgICAgICAgICB0aGlzLmdldE1hc2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBHRVRfREFUQTpcbiAgICAgICAgICBlcnIgPSB0aGlzLmdldERhdGEoY2IpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGBJTkZMQVRJTkdgXG4gICAgICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IHdoaWxlICh0aGlzLl9sb29wKTtcblxuICAgIGNiKGVycik7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGZpcnN0IHR3byBieXRlcyBvZiBhIGZyYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHsoUmFuZ2VFcnJvcnx1bmRlZmluZWQpfSBBIHBvc3NpYmxlIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRJbmZvKCkge1xuICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgMikge1xuICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuY29uc3VtZSgyKTtcblxuICAgIGlmICgoYnVmWzBdICYgMHgzMCkgIT09IDB4MDApIHtcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgIHJldHVybiBlcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgJ1JTVjIgYW5kIFJTVjMgbXVzdCBiZSBjbGVhcicsXG4gICAgICAgIHRydWUsXG4gICAgICAgIDEwMDIsXG4gICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMl8zJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wcmVzc2VkID0gKGJ1ZlswXSAmIDB4NDApID09PSAweDQwO1xuXG4gICAgaWYgKGNvbXByZXNzZWQgJiYgIXRoaXMuX2V4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUkMy5leHRlbnNpb25OYW1lXSkge1xuICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGVycm9yKFxuICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAnUlNWMSBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgMTAwMixcbiAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX1JTVl8xJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9maW4gPSAoYnVmWzBdICYgMHg4MCkgPT09IDB4ODA7XG4gICAgdGhpcy5fb3Bjb2RlID0gYnVmWzBdICYgMHgwZjtcbiAgICB0aGlzLl9wYXlsb2FkTGVuZ3RoID0gYnVmWzFdICYgMHg3ZjtcblxuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDB4MDApIHtcbiAgICAgIGlmIChjb21wcmVzc2VkKSB7XG4gICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ1JTVjEgbXVzdCBiZSBjbGVhcicsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMSdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9mcmFnbWVudGVkKSB7XG4gICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ2ludmFsaWQgb3Bjb2RlIDAnLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgMTAwMixcbiAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfT1BDT0RFJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9vcGNvZGUgPSB0aGlzLl9mcmFnbWVudGVkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fb3Bjb2RlID09PSAweDAxIHx8IHRoaXMuX29wY29kZSA9PT0gMHgwMikge1xuICAgICAgaWYgKHRoaXMuX2ZyYWdtZW50ZWQpIHtcbiAgICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICBgaW52YWxpZCBvcGNvZGUgJHt0aGlzLl9vcGNvZGV9YCxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX09QQ09ERSdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY29tcHJlc3NlZCA9IGNvbXByZXNzZWQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9vcGNvZGUgPiAweDA3ICYmIHRoaXMuX29wY29kZSA8IDB4MGIpIHtcbiAgICAgIGlmICghdGhpcy5fZmluKSB7XG4gICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ0ZJTiBtdXN0IGJlIHNldCcsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfRVhQRUNURURfRklOJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tcHJlc3NlZCkge1xuICAgICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBlcnJvcihcbiAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgICdSU1YxIG11c3QgYmUgY2xlYXInLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgMTAwMixcbiAgICAgICAgICAnV1NfRVJSX1VORVhQRUNURURfUlNWXzEnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fcGF5bG9hZExlbmd0aCA+IDB4N2QgfHxcbiAgICAgICAgKHRoaXMuX29wY29kZSA9PT0gMHgwOCAmJiB0aGlzLl9wYXlsb2FkTGVuZ3RoID09PSAxKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgYGludmFsaWQgcGF5bG9hZCBsZW5ndGggJHt0aGlzLl9wYXlsb2FkTGVuZ3RofWAsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfSU5WQUxJRF9DT05UUk9MX1BBWUxPQURfTEVOR1RIJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICByZXR1cm4gZXJyb3IoXG4gICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgIGBpbnZhbGlkIG9wY29kZSAke3RoaXMuX29wY29kZX1gLFxuICAgICAgICB0cnVlLFxuICAgICAgICAxMDAyLFxuICAgICAgICAnV1NfRVJSX0lOVkFMSURfT1BDT0RFJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2ZpbiAmJiAhdGhpcy5fZnJhZ21lbnRlZCkgdGhpcy5fZnJhZ21lbnRlZCA9IHRoaXMuX29wY29kZTtcbiAgICB0aGlzLl9tYXNrZWQgPSAoYnVmWzFdICYgMHg4MCkgPT09IDB4ODA7XG5cbiAgICBpZiAodGhpcy5faXNTZXJ2ZXIpIHtcbiAgICAgIGlmICghdGhpcy5fbWFza2VkKSB7XG4gICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ01BU0sgbXVzdCBiZSBzZXQnLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgMTAwMixcbiAgICAgICAgICAnV1NfRVJSX0VYUEVDVEVEX01BU0snXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLl9tYXNrZWQpIHtcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgIHJldHVybiBlcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgJ01BU0sgbXVzdCBiZSBjbGVhcicsXG4gICAgICAgIHRydWUsXG4gICAgICAgIDEwMDIsXG4gICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9NQVNLJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGF5bG9hZExlbmd0aCA9PT0gMTI2KSB0aGlzLl9zdGF0ZSA9IEdFVF9QQVlMT0FEX0xFTkdUSF8xNjtcbiAgICBlbHNlIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoID09PSAxMjcpIHRoaXMuX3N0YXRlID0gR0VUX1BBWUxPQURfTEVOR1RIXzY0O1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuaGF2ZUxlbmd0aCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGggKDcrMTYpLlxuICAgKlxuICAgKiBAcmV0dXJuIHsoUmFuZ2VFcnJvcnx1bmRlZmluZWQpfSBBIHBvc3NpYmxlIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRQYXlsb2FkTGVuZ3RoMTYoKSB7XG4gICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCAyKSB7XG4gICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcGF5bG9hZExlbmd0aCA9IHRoaXMuY29uc3VtZSgyKS5yZWFkVUludDE2QkUoMCk7XG4gICAgcmV0dXJuIHRoaXMuaGF2ZUxlbmd0aCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGggKDcrNjQpLlxuICAgKlxuICAgKiBAcmV0dXJuIHsoUmFuZ2VFcnJvcnx1bmRlZmluZWQpfSBBIHBvc3NpYmxlIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRQYXlsb2FkTGVuZ3RoNjQoKSB7XG4gICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCA4KSB7XG4gICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVmID0gdGhpcy5jb25zdW1lKDgpO1xuICAgIGNvbnN0IG51bSA9IGJ1Zi5yZWFkVUludDMyQkUoMCk7XG5cbiAgICAvL1xuICAgIC8vIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0IGlzIDJeNTMgLSAxLiBBbiBlcnJvciBpcyByZXR1cm5lZFxuICAgIC8vIGlmIHBheWxvYWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIG51bWJlci5cbiAgICAvL1xuICAgIGlmIChudW0gPiBNYXRoLnBvdygyLCA1MyAtIDMyKSAtIDEpIHtcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgIHJldHVybiBlcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgJ1Vuc3VwcG9ydGVkIFdlYlNvY2tldCBmcmFtZTogcGF5bG9hZCBsZW5ndGggPiAyXjUzIC0gMScsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAxMDA5LFxuICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX0RBVEFfUEFZTE9BRF9MRU5HVEgnXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX3BheWxvYWRMZW5ndGggPSBudW0gKiBNYXRoLnBvdygyLCAzMikgKyBidWYucmVhZFVJbnQzMkJFKDQpO1xuICAgIHJldHVybiB0aGlzLmhhdmVMZW5ndGgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXlsb2FkIGxlbmd0aCBoYXMgYmVlbiByZWFkLlxuICAgKlxuICAgKiBAcmV0dXJuIHsoUmFuZ2VFcnJvcnx1bmRlZmluZWQpfSBBIHBvc3NpYmxlIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBoYXZlTGVuZ3RoKCkge1xuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoICYmIHRoaXMuX29wY29kZSA8IDB4MDgpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCArPSB0aGlzLl9wYXlsb2FkTGVuZ3RoO1xuICAgICAgaWYgKHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCA+IHRoaXMuX21heFBheWxvYWQgJiYgdGhpcy5fbWF4UGF5bG9hZCA+IDApIHtcbiAgICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICAnTWF4IHBheWxvYWQgc2l6ZSBleGNlZWRlZCcsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgMTAwOSxcbiAgICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXNrZWQpIHRoaXMuX3N0YXRlID0gR0VUX01BU0s7XG4gICAgZWxzZSB0aGlzLl9zdGF0ZSA9IEdFVF9EQVRBO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIG1hc2sgYnl0ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRNYXNrKCkge1xuICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgNCkge1xuICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX21hc2sgPSB0aGlzLmNvbnN1bWUoNCk7XG4gICAgdGhpcy5fc3RhdGUgPSBHRVRfREFUQTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBkYXRhIGJ5dGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcmV0dXJuIHsoRXJyb3J8UmFuZ2VFcnJvcnx1bmRlZmluZWQpfSBBIHBvc3NpYmxlIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXREYXRhKGNiKSB7XG4gICAgbGV0IGRhdGEgPSBFTVBUWV9CVUZGRVIkMjtcblxuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IHRoaXMuX3BheWxvYWRMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRhdGEgPSB0aGlzLmNvbnN1bWUodGhpcy5fcGF5bG9hZExlbmd0aCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fbWFza2VkICYmXG4gICAgICAgICh0aGlzLl9tYXNrWzBdIHwgdGhpcy5fbWFza1sxXSB8IHRoaXMuX21hc2tbMl0gfCB0aGlzLl9tYXNrWzNdKSAhPT0gMFxuICAgICAgKSB7XG4gICAgICAgIHVubWFzayhkYXRhLCB0aGlzLl9tYXNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb3Bjb2RlID4gMHgwNykgcmV0dXJuIHRoaXMuY29udHJvbE1lc3NhZ2UoZGF0YSk7XG5cbiAgICBpZiAodGhpcy5fY29tcHJlc3NlZCkge1xuICAgICAgdGhpcy5fc3RhdGUgPSBJTkZMQVRJTkc7XG4gICAgICB0aGlzLmRlY29tcHJlc3MoZGF0YSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmxlbmd0aCkge1xuICAgICAgLy9cbiAgICAgIC8vIFRoaXMgbWVzc2FnZSBpcyBub3QgY29tcHJlc3NlZCBzbyBpdHMgbGVuZ3RoIGlzIHRoZSBzdW0gb2YgdGhlIHBheWxvYWRcbiAgICAgIC8vIGxlbmd0aCBvZiBhbGwgZnJhZ21lbnRzLlxuICAgICAgLy9cbiAgICAgIHRoaXMuX21lc3NhZ2VMZW5ndGggPSB0aGlzLl90b3RhbFBheWxvYWRMZW5ndGg7XG4gICAgICB0aGlzLl9mcmFnbWVudHMucHVzaChkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhTWVzc2FnZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29tcHJlc3NlcyBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBDb21wcmVzc2VkIGRhdGFcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlY29tcHJlc3MoZGF0YSwgY2IpIHtcbiAgICBjb25zdCBwZXJNZXNzYWdlRGVmbGF0ZSA9IHRoaXMuX2V4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUkMy5leHRlbnNpb25OYW1lXTtcblxuICAgIHBlck1lc3NhZ2VEZWZsYXRlLmRlY29tcHJlc3MoZGF0YSwgdGhpcy5fZmluLCAoZXJyLCBidWYpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuXG4gICAgICBpZiAoYnVmLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoICs9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLl9tZXNzYWdlTGVuZ3RoID4gdGhpcy5fbWF4UGF5bG9hZCAmJiB0aGlzLl9tYXhQYXlsb2FkID4gMCkge1xuICAgICAgICAgIHJldHVybiBjYihcbiAgICAgICAgICAgIGVycm9yKFxuICAgICAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgICAgICAnTWF4IHBheWxvYWQgc2l6ZSBleGNlZWRlZCcsXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAxMDA5LFxuICAgICAgICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9mcmFnbWVudHMucHVzaChidWYpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlciA9IHRoaXMuZGF0YU1lc3NhZ2UoKTtcbiAgICAgIGlmIChlcikgcmV0dXJuIGNiKGVyKTtcblxuICAgICAgdGhpcy5zdGFydExvb3AoY2IpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBkYXRhIG1lc3NhZ2UuXG4gICAqXG4gICAqIEByZXR1cm4geyhFcnJvcnx1bmRlZmluZWQpfSBBIHBvc3NpYmxlIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkYXRhTWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5fZmluKSB7XG4gICAgICBjb25zdCBtZXNzYWdlTGVuZ3RoID0gdGhpcy5fbWVzc2FnZUxlbmd0aDtcbiAgICAgIGNvbnN0IGZyYWdtZW50cyA9IHRoaXMuX2ZyYWdtZW50cztcblxuICAgICAgdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoID0gMDtcbiAgICAgIHRoaXMuX21lc3NhZ2VMZW5ndGggPSAwO1xuICAgICAgdGhpcy5fZnJhZ21lbnRlZCA9IDA7XG4gICAgICB0aGlzLl9mcmFnbWVudHMgPSBbXTtcblxuICAgICAgaWYgKHRoaXMuX29wY29kZSA9PT0gMikge1xuICAgICAgICBsZXQgZGF0YTtcblxuICAgICAgICBpZiAodGhpcy5fYmluYXJ5VHlwZSA9PT0gJ25vZGVidWZmZXInKSB7XG4gICAgICAgICAgZGF0YSA9IGNvbmNhdChmcmFnbWVudHMsIG1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JpbmFyeVR5cGUgPT09ICdhcnJheWJ1ZmZlcicpIHtcbiAgICAgICAgICBkYXRhID0gdG9BcnJheUJ1ZmZlcihjb25jYXQoZnJhZ21lbnRzLCBtZXNzYWdlTGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YSA9IGZyYWdtZW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGRhdGEsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYnVmID0gY29uY2F0KGZyYWdtZW50cywgbWVzc2FnZUxlbmd0aCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9za2lwVVRGOFZhbGlkYXRpb24gJiYgIWlzVmFsaWRVVEY4KGJ1ZikpIHtcbiAgICAgICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIGVycm9yKFxuICAgICAgICAgICAgRXJyb3IsXG4gICAgICAgICAgICAnaW52YWxpZCBVVEYtOCBzZXF1ZW5jZScsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgMTAwNyxcbiAgICAgICAgICAgICdXU19FUlJfSU5WQUxJRF9VVEY4J1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBidWYsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBjb250cm9sIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIERhdGEgdG8gaGFuZGxlXG4gICAqIEByZXR1cm4geyhFcnJvcnxSYW5nZUVycm9yfHVuZGVmaW5lZCl9IEEgcG9zc2libGUgZXJyb3JcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnRyb2xNZXNzYWdlKGRhdGEpIHtcbiAgICBpZiAodGhpcy5fb3Bjb2RlID09PSAweDA4KSB7XG4gICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG5cbiAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmVtaXQoJ2NvbmNsdWRlJywgMTAwNSwgRU1QVFlfQlVGRkVSJDIpO1xuICAgICAgICB0aGlzLmVuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGRhdGEucmVhZFVJbnQxNkJFKDApO1xuXG4gICAgICAgIGlmICghaXNWYWxpZFN0YXR1c0NvZGUkMShjb2RlKSkge1xuICAgICAgICAgIHJldHVybiBlcnJvcihcbiAgICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgICBgaW52YWxpZCBzdGF0dXMgY29kZSAke2NvZGV9YCxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAxMDAyLFxuICAgICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX0NMT1NFX0NPREUnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1ZiA9IG5ldyBGYXN0QnVmZmVyKFxuICAgICAgICAgIGRhdGEuYnVmZmVyLFxuICAgICAgICAgIGRhdGEuYnl0ZU9mZnNldCArIDIsXG4gICAgICAgICAgZGF0YS5sZW5ndGggLSAyXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9za2lwVVRGOFZhbGlkYXRpb24gJiYgIWlzVmFsaWRVVEY4KGJ1ZikpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3IoXG4gICAgICAgICAgICBFcnJvcixcbiAgICAgICAgICAgICdpbnZhbGlkIFVURi04IHNlcXVlbmNlJyxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAxMDA3LFxuICAgICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX1VURjgnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnY29uY2x1ZGUnLCBjb2RlLCBidWYpO1xuICAgICAgICB0aGlzLmVuZCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5fb3Bjb2RlID09PSAweDA5KSB7XG4gICAgICB0aGlzLmVtaXQoJ3BpbmcnLCBkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KCdwb25nJywgZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgfVxufTtcblxudmFyIHJlY2VpdmVyID0gUmVjZWl2ZXIkMTtcblxuLyoqXG4gKiBCdWlsZHMgYW4gZXJyb3Igb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3OkVycm9yfFJhbmdlRXJyb3IpfSBFcnJvckN0b3IgVGhlIGVycm9yIGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZVxuICogQHBhcmFtIHtCb29sZWFufSBwcmVmaXggU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGFkZCBhIGRlZmF1bHQgcHJlZml4IHRvXG4gKiAgICAgYG1lc3NhZ2VgXG4gKiBAcGFyYW0ge051bWJlcn0gc3RhdHVzQ29kZSBUaGUgc3RhdHVzIGNvZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBlcnJvckNvZGUgVGhlIGV4cG9zZWQgZXJyb3IgY29kZVxuICogQHJldHVybiB7KEVycm9yfFJhbmdlRXJyb3IpfSBUaGUgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGVycm9yKEVycm9yQ3RvciwgbWVzc2FnZSwgcHJlZml4LCBzdGF0dXNDb2RlLCBlcnJvckNvZGUpIHtcbiAgY29uc3QgZXJyID0gbmV3IEVycm9yQ3RvcihcbiAgICBwcmVmaXggPyBgSW52YWxpZCBXZWJTb2NrZXQgZnJhbWU6ICR7bWVzc2FnZX1gIDogbWVzc2FnZVxuICApO1xuXG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgZXJyb3IpO1xuICBlcnIuY29kZSA9IGVycm9yQ29kZTtcbiAgZXJyW2tTdGF0dXNDb2RlJDFdID0gc3RhdHVzQ29kZTtcbiAgcmV0dXJuIGVycjtcbn1cblxuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBbXCJlcnJvclwiLCB7IFwidmFyc0lnbm9yZVBhdHRlcm5cIjogXCJebmV0fHRscyRcIiB9XSAqL1xuY29uc3QgeyByYW5kb21GaWxsU3luYyB9ID0gcmVxdWlyZSQkNSQxO1xuXG5jb25zdCBQZXJNZXNzYWdlRGVmbGF0ZSQyID0gcGVybWVzc2FnZURlZmxhdGU7XG5jb25zdCB7IEVNUFRZX0JVRkZFUjogRU1QVFlfQlVGRkVSJDEgfSA9IGNvbnN0YW50cztcbmNvbnN0IHsgaXNWYWxpZFN0YXR1c0NvZGUgfSA9IHZhbGlkYXRpb25FeHBvcnRzO1xuY29uc3QgeyBtYXNrOiBhcHBseU1hc2ssIHRvQnVmZmVyOiB0b0J1ZmZlciQxIH0gPSBidWZmZXJVdGlsRXhwb3J0cztcblxuY29uc3Qga0J5dGVMZW5ndGggPSBTeW1ib2woJ2tCeXRlTGVuZ3RoJyk7XG5jb25zdCBtYXNrQnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuXG4vKipcbiAqIEh5QmkgU2VuZGVyIGltcGxlbWVudGF0aW9uLlxuICovXG5sZXQgU2VuZGVyJDEgPSBjbGFzcyBTZW5kZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIFNlbmRlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHsobmV0LlNvY2tldHx0bHMuU29ja2V0KX0gc29ja2V0IFRoZSBjb25uZWN0aW9uIHNvY2tldFxuICAgKiBAcGFyYW0ge09iamVjdH0gW2V4dGVuc2lvbnNdIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBuZWdvdGlhdGVkIGV4dGVuc2lvbnNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2dlbmVyYXRlTWFza10gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIG1hc2tpbmdcbiAgICogICAgIGtleVxuICAgKi9cbiAgY29uc3RydWN0b3Ioc29ja2V0LCBleHRlbnNpb25zLCBnZW5lcmF0ZU1hc2spIHtcbiAgICB0aGlzLl9leHRlbnNpb25zID0gZXh0ZW5zaW9ucyB8fCB7fTtcblxuICAgIGlmIChnZW5lcmF0ZU1hc2spIHtcbiAgICAgIHRoaXMuX2dlbmVyYXRlTWFzayA9IGdlbmVyYXRlTWFzaztcbiAgICAgIHRoaXMuX21hc2tCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc29ja2V0ID0gc29ja2V0O1xuXG4gICAgdGhpcy5fZmlyc3RGcmFnbWVudCA9IHRydWU7XG4gICAgdGhpcy5fY29tcHJlc3MgPSBmYWxzZTtcblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPSAwO1xuICAgIHRoaXMuX2RlZmxhdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3F1ZXVlID0gW107XG4gIH1cblxuICAvKipcbiAgICogRnJhbWVzIGEgcGllY2Ugb2YgZGF0YSBhY2NvcmRpbmcgdG8gdGhlIEh5QmkgV2ViU29ja2V0IHByb3RvY29sLlxuICAgKlxuICAgKiBAcGFyYW0geyhCdWZmZXJ8U3RyaW5nKX0gZGF0YSBUaGUgZGF0YSB0byBmcmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNldCB0aGVcbiAgICogICAgIEZJTiBiaXRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdGVNYXNrXSBUaGUgZnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSB0aGVcbiAgICogICAgIG1hc2tpbmcga2V5XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2tcbiAgICogICAgIGBkYXRhYFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gW29wdGlvbnMubWFza0J1ZmZlcl0gVGhlIGJ1ZmZlciB1c2VkIHRvIHN0b3JlIHRoZSBtYXNraW5nXG4gICAqICAgICBrZXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMub3Bjb2RlIFRoZSBvcGNvZGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZWFkT25seT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgYGRhdGFgIGNhbiBiZVxuICAgKiAgICAgbW9kaWZpZWRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yc3YxPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxuICAgKiAgICAgUlNWMSBiaXRcbiAgICogQHJldHVybiB7KEJ1ZmZlcnxTdHJpbmcpW119IFRoZSBmcmFtZWQgZGF0YVxuICAgKiBAcHVibGljXG4gICAqL1xuICBzdGF0aWMgZnJhbWUoZGF0YSwgb3B0aW9ucykge1xuICAgIGxldCBtYXNrO1xuICAgIGxldCBtZXJnZSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSAyO1xuICAgIGxldCBza2lwTWFza2luZyA9IGZhbHNlO1xuXG4gICAgaWYgKG9wdGlvbnMubWFzaykge1xuICAgICAgbWFzayA9IG9wdGlvbnMubWFza0J1ZmZlciB8fCBtYXNrQnVmZmVyO1xuXG4gICAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZU1hc2spIHtcbiAgICAgICAgb3B0aW9ucy5nZW5lcmF0ZU1hc2sobWFzayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYW5kb21GaWxsU3luYyhtYXNrLCAwLCA0KTtcbiAgICAgIH1cblxuICAgICAgc2tpcE1hc2tpbmcgPSAobWFza1swXSB8IG1hc2tbMV0gfCBtYXNrWzJdIHwgbWFza1szXSkgPT09IDA7XG4gICAgICBvZmZzZXQgPSA2O1xuICAgIH1cblxuICAgIGxldCBkYXRhTGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKFxuICAgICAgICAoIW9wdGlvbnMubWFzayB8fCBza2lwTWFza2luZykgJiZcbiAgICAgICAgb3B0aW9uc1trQnl0ZUxlbmd0aF0gIT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIGRhdGFMZW5ndGggPSBvcHRpb25zW2tCeXRlTGVuZ3RoXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhKTtcbiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICBtZXJnZSA9IG9wdGlvbnMubWFzayAmJiBvcHRpb25zLnJlYWRPbmx5ICYmICFza2lwTWFza2luZztcbiAgICB9XG5cbiAgICBsZXQgcGF5bG9hZExlbmd0aCA9IGRhdGFMZW5ndGg7XG5cbiAgICBpZiAoZGF0YUxlbmd0aCA+PSA2NTUzNikge1xuICAgICAgb2Zmc2V0ICs9IDg7XG4gICAgICBwYXlsb2FkTGVuZ3RoID0gMTI3O1xuICAgIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA+IDEyNSkge1xuICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICBwYXlsb2FkTGVuZ3RoID0gMTI2O1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShtZXJnZSA/IGRhdGFMZW5ndGggKyBvZmZzZXQgOiBvZmZzZXQpO1xuXG4gICAgdGFyZ2V0WzBdID0gb3B0aW9ucy5maW4gPyBvcHRpb25zLm9wY29kZSB8IDB4ODAgOiBvcHRpb25zLm9wY29kZTtcbiAgICBpZiAob3B0aW9ucy5yc3YxKSB0YXJnZXRbMF0gfD0gMHg0MDtcblxuICAgIHRhcmdldFsxXSA9IHBheWxvYWRMZW5ndGg7XG5cbiAgICBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI2KSB7XG4gICAgICB0YXJnZXQud3JpdGVVSW50MTZCRShkYXRhTGVuZ3RoLCAyKTtcbiAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgdGFyZ2V0WzJdID0gdGFyZ2V0WzNdID0gMDtcbiAgICAgIHRhcmdldC53cml0ZVVJbnRCRShkYXRhTGVuZ3RoLCA0LCA2KTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMubWFzaykgcmV0dXJuIFt0YXJnZXQsIGRhdGFdO1xuXG4gICAgdGFyZ2V0WzFdIHw9IDB4ODA7XG4gICAgdGFyZ2V0W29mZnNldCAtIDRdID0gbWFza1swXTtcbiAgICB0YXJnZXRbb2Zmc2V0IC0gM10gPSBtYXNrWzFdO1xuICAgIHRhcmdldFtvZmZzZXQgLSAyXSA9IG1hc2tbMl07XG4gICAgdGFyZ2V0W29mZnNldCAtIDFdID0gbWFza1szXTtcblxuICAgIGlmIChza2lwTWFza2luZykgcmV0dXJuIFt0YXJnZXQsIGRhdGFdO1xuXG4gICAgaWYgKG1lcmdlKSB7XG4gICAgICBhcHBseU1hc2soZGF0YSwgbWFzaywgdGFyZ2V0LCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgICAgcmV0dXJuIFt0YXJnZXRdO1xuICAgIH1cblxuICAgIGFwcGx5TWFzayhkYXRhLCBtYXNrLCBkYXRhLCAwLCBkYXRhTGVuZ3RoKTtcbiAgICByZXR1cm4gW3RhcmdldCwgZGF0YV07XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBjbG9zZSBtZXNzYWdlIHRvIHRoZSBvdGhlciBwZWVyLlxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2NvZGVdIFRoZSBzdGF0dXMgY29kZSBjb21wb25lbnQgb2YgdGhlIGJvZHlcbiAgICogQHBhcmFtIHsoU3RyaW5nfEJ1ZmZlcil9IFtkYXRhXSBUaGUgbWVzc2FnZSBjb21wb25lbnQgb2YgdGhlIGJvZHlcbiAgICogQHBhcmFtIHtCb29sZWFufSBbbWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2sgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBjbG9zZShjb2RlLCBkYXRhLCBtYXNrLCBjYikge1xuICAgIGxldCBidWY7XG5cbiAgICBpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBidWYgPSBFTVBUWV9CVUZGRVIkMTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2RlICE9PSAnbnVtYmVyJyB8fCAhaXNWYWxpZFN0YXR1c0NvZGUoY29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCBlcnJvciBjb2RlIG51bWJlcicpO1xuICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8ICFkYXRhLmxlbmd0aCkge1xuICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIpO1xuICAgICAgYnVmLndyaXRlVUludDE2QkUoY29kZSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xuXG4gICAgICBpZiAobGVuZ3RoID4gMTIzKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgbWVzc2FnZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMTIzIGJ5dGVzJyk7XG4gICAgICB9XG5cbiAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyICsgbGVuZ3RoKTtcbiAgICAgIGJ1Zi53cml0ZVVJbnQxNkJFKGNvZGUsIDApO1xuXG4gICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGJ1Zi53cml0ZShkYXRhLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1Zi5zZXQoZGF0YSwgMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIFtrQnl0ZUxlbmd0aF06IGJ1Zi5sZW5ndGgsXG4gICAgICBmaW46IHRydWUsXG4gICAgICBnZW5lcmF0ZU1hc2s6IHRoaXMuX2dlbmVyYXRlTWFzayxcbiAgICAgIG1hc2ssXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxuICAgICAgb3Bjb2RlOiAweDA4LFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgcnN2MTogZmFsc2VcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuX2RlZmxhdGluZykge1xuICAgICAgdGhpcy5lbnF1ZXVlKFt0aGlzLmRpc3BhdGNoLCBidWYsIGZhbHNlLCBvcHRpb25zLCBjYl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRGcmFtZShTZW5kZXIuZnJhbWUoYnVmLCBvcHRpb25zKSwgY2IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIHBpbmcgbWVzc2FnZSB0byB0aGUgb3RoZXIgcGVlci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXNzYWdlIHRvIHNlbmRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbbWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2sgYGRhdGFgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcGluZyhkYXRhLCBtYXNrLCBjYikge1xuICAgIGxldCBieXRlTGVuZ3RoO1xuICAgIGxldCByZWFkT25seTtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB0b0J1ZmZlciQxKGRhdGEpO1xuICAgICAgYnl0ZUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgcmVhZE9ubHkgPSB0b0J1ZmZlciQxLnJlYWRPbmx5O1xuICAgIH1cblxuICAgIGlmIChieXRlTGVuZ3RoID4gMTI1KSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIGRhdGEgc2l6ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMTI1IGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIFtrQnl0ZUxlbmd0aF06IGJ5dGVMZW5ndGgsXG4gICAgICBmaW46IHRydWUsXG4gICAgICBnZW5lcmF0ZU1hc2s6IHRoaXMuX2dlbmVyYXRlTWFzayxcbiAgICAgIG1hc2ssXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxuICAgICAgb3Bjb2RlOiAweDA5LFxuICAgICAgcmVhZE9ubHksXG4gICAgICByc3YxOiBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5fZGVmbGF0aW5nKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGRhdGEsIGZhbHNlLCBvcHRpb25zLCBjYl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRGcmFtZShTZW5kZXIuZnJhbWUoZGF0YSwgb3B0aW9ucyksIGNiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBwb25nIG1lc3NhZ2UgdG8gdGhlIG90aGVyIHBlZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWVzc2FnZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW21hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrIGBkYXRhYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHBvbmcoZGF0YSwgbWFzaywgY2IpIHtcbiAgICBsZXQgYnl0ZUxlbmd0aDtcbiAgICBsZXQgcmVhZE9ubHk7XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBieXRlTGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSk7XG4gICAgICByZWFkT25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdG9CdWZmZXIkMShkYXRhKTtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIHJlYWRPbmx5ID0gdG9CdWZmZXIkMS5yZWFkT25seTtcbiAgICB9XG5cbiAgICBpZiAoYnl0ZUxlbmd0aCA+IDEyNSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBkYXRhIHNpemUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIDEyNSBieXRlcycpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBba0J5dGVMZW5ndGhdOiBieXRlTGVuZ3RoLFxuICAgICAgZmluOiB0cnVlLFxuICAgICAgZ2VuZXJhdGVNYXNrOiB0aGlzLl9nZW5lcmF0ZU1hc2ssXG4gICAgICBtYXNrLFxuICAgICAgbWFza0J1ZmZlcjogdGhpcy5fbWFza0J1ZmZlcixcbiAgICAgIG9wY29kZTogMHgwYSxcbiAgICAgIHJlYWRPbmx5LFxuICAgICAgcnN2MTogZmFsc2VcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuX2RlZmxhdGluZykge1xuICAgICAgdGhpcy5lbnF1ZXVlKFt0aGlzLmRpc3BhdGNoLCBkYXRhLCBmYWxzZSwgb3B0aW9ucywgY2JdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kRnJhbWUoU2VuZGVyLmZyYW1lKGRhdGEsIG9wdGlvbnMpLCBjYik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgZGF0YSBtZXNzYWdlIHRvIHRoZSBvdGhlciBwZWVyLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1lc3NhZ2UgdG8gc2VuZFxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmJpbmFyeT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgYGRhdGFgIGlzIGJpbmFyeVxuICAgKiAgICAgb3IgdGV4dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNvbXByZXNzPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG9cbiAgICogICAgIGNvbXByZXNzIGBkYXRhYFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZyYWdtZW50IGlzIHRoZVxuICAgKiAgICAgbGFzdCBvbmVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFza1xuICAgKiAgICAgYGRhdGFgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2VuZChkYXRhLCBvcHRpb25zLCBjYikge1xuICAgIGNvbnN0IHBlck1lc3NhZ2VEZWZsYXRlID0gdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZSQyLmV4dGVuc2lvbk5hbWVdO1xuICAgIGxldCBvcGNvZGUgPSBvcHRpb25zLmJpbmFyeSA/IDIgOiAxO1xuICAgIGxldCByc3YxID0gb3B0aW9ucy5jb21wcmVzcztcblxuICAgIGxldCBieXRlTGVuZ3RoO1xuICAgIGxldCByZWFkT25seTtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB0b0J1ZmZlciQxKGRhdGEpO1xuICAgICAgYnl0ZUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgcmVhZE9ubHkgPSB0b0J1ZmZlciQxLnJlYWRPbmx5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9maXJzdEZyYWdtZW50KSB7XG4gICAgICB0aGlzLl9maXJzdEZyYWdtZW50ID0gZmFsc2U7XG4gICAgICBpZiAoXG4gICAgICAgIHJzdjEgJiZcbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUgJiZcbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUucGFyYW1zW1xuICAgICAgICAgIHBlck1lc3NhZ2VEZWZsYXRlLl9pc1NlcnZlclxuICAgICAgICAgICAgPyAnc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXInXG4gICAgICAgICAgICA6ICdjbGllbnRfbm9fY29udGV4dF90YWtlb3ZlcidcbiAgICAgICAgXVxuICAgICAgKSB7XG4gICAgICAgIHJzdjEgPSBieXRlTGVuZ3RoID49IHBlck1lc3NhZ2VEZWZsYXRlLl90aHJlc2hvbGQ7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb21wcmVzcyA9IHJzdjE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJzdjEgPSBmYWxzZTtcbiAgICAgIG9wY29kZSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZmluKSB0aGlzLl9maXJzdEZyYWdtZW50ID0gdHJ1ZTtcblxuICAgIGlmIChwZXJNZXNzYWdlRGVmbGF0ZSkge1xuICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgW2tCeXRlTGVuZ3RoXTogYnl0ZUxlbmd0aCxcbiAgICAgICAgZmluOiBvcHRpb25zLmZpbixcbiAgICAgICAgZ2VuZXJhdGVNYXNrOiB0aGlzLl9nZW5lcmF0ZU1hc2ssXG4gICAgICAgIG1hc2s6IG9wdGlvbnMubWFzayxcbiAgICAgICAgbWFza0J1ZmZlcjogdGhpcy5fbWFza0J1ZmZlcixcbiAgICAgICAgb3Bjb2RlLFxuICAgICAgICByZWFkT25seSxcbiAgICAgICAgcnN2MVxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuX2RlZmxhdGluZykge1xuICAgICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGRhdGEsIHRoaXMuX2NvbXByZXNzLCBvcHRzLCBjYl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaChkYXRhLCB0aGlzLl9jb21wcmVzcywgb3B0cywgY2IpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRGcmFtZShcbiAgICAgICAgU2VuZGVyLmZyYW1lKGRhdGEsIHtcbiAgICAgICAgICBba0J5dGVMZW5ndGhdOiBieXRlTGVuZ3RoLFxuICAgICAgICAgIGZpbjogb3B0aW9ucy5maW4sXG4gICAgICAgICAgZ2VuZXJhdGVNYXNrOiB0aGlzLl9nZW5lcmF0ZU1hc2ssXG4gICAgICAgICAgbWFzazogb3B0aW9ucy5tYXNrLFxuICAgICAgICAgIG1hc2tCdWZmZXI6IHRoaXMuX21hc2tCdWZmZXIsXG4gICAgICAgICAgb3Bjb2RlLFxuICAgICAgICAgIHJlYWRPbmx5LFxuICAgICAgICAgIHJzdjE6IGZhbHNlXG4gICAgICAgIH0pLFxuICAgICAgICBjYlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7KEJ1ZmZlcnxTdHJpbmcpfSBkYXRhIFRoZSBtZXNzYWdlIHRvIHNlbmRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbY29tcHJlc3M9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBjb21wcmVzc1xuICAgKiAgICAgYGRhdGFgXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmluPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxuICAgKiAgICAgRklOIGJpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZVxuICAgKiAgICAgbWFza2luZyBrZXlcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFza1xuICAgKiAgICAgYGRhdGFgXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBbb3B0aW9ucy5tYXNrQnVmZmVyXSBUaGUgYnVmZmVyIHVzZWQgdG8gc3RvcmUgdGhlIG1hc2tpbmdcbiAgICogICAgIGtleVxuICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5vcGNvZGUgVGhlIG9wY29kZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJlYWRPbmx5PWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgY2FuIGJlXG4gICAqICAgICBtb2RpZmllZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJzdjE9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlXG4gICAqICAgICBSU1YxIGJpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkaXNwYXRjaChkYXRhLCBjb21wcmVzcywgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAoIWNvbXByZXNzKSB7XG4gICAgICB0aGlzLnNlbmRGcmFtZShTZW5kZXIuZnJhbWUoZGF0YSwgb3B0aW9ucyksIGNiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJNZXNzYWdlRGVmbGF0ZSA9IHRoaXMuX2V4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUkMi5leHRlbnNpb25OYW1lXTtcblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gb3B0aW9uc1trQnl0ZUxlbmd0aF07XG4gICAgdGhpcy5fZGVmbGF0aW5nID0gdHJ1ZTtcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZS5jb21wcmVzcyhkYXRhLCBvcHRpb25zLmZpbiwgKF8sIGJ1ZikgPT4ge1xuICAgICAgaWYgKHRoaXMuX3NvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICdUaGUgc29ja2V0IHdhcyBjbG9zZWQgd2hpbGUgZGF0YSB3YXMgYmVpbmcgY29tcHJlc3NlZCdcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSBjYihlcnIpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLl9xdWV1ZVtpXTtcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgdGhpcy5fZGVmbGF0aW5nID0gZmFsc2U7XG4gICAgICBvcHRpb25zLnJlYWRPbmx5ID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbmRGcmFtZShTZW5kZXIuZnJhbWUoYnVmLCBvcHRpb25zKSwgY2IpO1xuICAgICAgdGhpcy5kZXF1ZXVlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgcXVldWVkIHNlbmQgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlcXVldWUoKSB7XG4gICAgd2hpbGUgKCF0aGlzLl9kZWZsYXRpbmcgJiYgdGhpcy5fcXVldWUubGVuZ3RoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLl9xdWV1ZS5zaGlmdCgpO1xuXG4gICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IHBhcmFtc1szXVtrQnl0ZUxlbmd0aF07XG4gICAgICBSZWZsZWN0LmFwcGx5KHBhcmFtc1swXSwgdGhpcywgcGFyYW1zLnNsaWNlKDEpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZXMgYSBzZW5kIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gcGFyYW1zIFNlbmQgb3BlcmF0aW9uIHBhcmFtZXRlcnMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbnF1ZXVlKHBhcmFtcykge1xuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gcGFyYW1zWzNdW2tCeXRlTGVuZ3RoXTtcbiAgICB0aGlzLl9xdWV1ZS5wdXNoKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBmcmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJbXX0gbGlzdCBUaGUgZnJhbWUgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kRnJhbWUobGlzdCwgY2IpIHtcbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDIpIHtcbiAgICAgIHRoaXMuX3NvY2tldC5jb3JrKCk7XG4gICAgICB0aGlzLl9zb2NrZXQud3JpdGUobGlzdFswXSk7XG4gICAgICB0aGlzLl9zb2NrZXQud3JpdGUobGlzdFsxXSwgY2IpO1xuICAgICAgdGhpcy5fc29ja2V0LnVuY29yaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zb2NrZXQud3JpdGUobGlzdFswXSwgY2IpO1xuICAgIH1cbiAgfVxufTtcblxudmFyIHNlbmRlciA9IFNlbmRlciQxO1xuXG5jb25zdCB7IGtGb3JPbkV2ZW50QXR0cmlidXRlOiBrRm9yT25FdmVudEF0dHJpYnV0ZSQxLCBrTGlzdGVuZXI6IGtMaXN0ZW5lciQxIH0gPSBjb25zdGFudHM7XG5cbmNvbnN0IGtDb2RlID0gU3ltYm9sKCdrQ29kZScpO1xuY29uc3Qga0RhdGEgPSBTeW1ib2woJ2tEYXRhJyk7XG5jb25zdCBrRXJyb3IgPSBTeW1ib2woJ2tFcnJvcicpO1xuY29uc3Qga01lc3NhZ2UgPSBTeW1ib2woJ2tNZXNzYWdlJyk7XG5jb25zdCBrUmVhc29uID0gU3ltYm9sKCdrUmVhc29uJyk7XG5jb25zdCBrVGFyZ2V0ID0gU3ltYm9sKCdrVGFyZ2V0Jyk7XG5jb25zdCBrVHlwZSA9IFN5bWJvbCgna1R5cGUnKTtcbmNvbnN0IGtXYXNDbGVhbiA9IFN5bWJvbCgna1dhc0NsZWFuJyk7XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGFuIGV2ZW50LlxuICovXG5jbGFzcyBFdmVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEV2ZW50YC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgdGhlIGB0eXBlYCBhcmd1bWVudCBpcyBub3Qgc3BlY2lmaWVkXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlKSB7XG4gICAgdGhpc1trVGFyZ2V0XSA9IG51bGw7XG4gICAgdGhpc1trVHlwZV0gPSB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHsqfVxuICAgKi9cbiAgZ2V0IHRhcmdldCgpIHtcbiAgICByZXR1cm4gdGhpc1trVGFyZ2V0XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXNba1R5cGVdO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsICd0YXJnZXQnLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnQucHJvdG90eXBlLCAndHlwZScsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBjbG9zZSBldmVudC5cbiAqXG4gKiBAZXh0ZW5kcyBFdmVudFxuICovXG5jbGFzcyBDbG9zZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBDbG9zZUV2ZW50YC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gQSBkaWN0aW9uYXJ5IG9iamVjdCB0aGF0IGFsbG93cyBmb3Igc2V0dGluZ1xuICAgKiAgICAgYXR0cmlidXRlcyB2aWEgb2JqZWN0IG1lbWJlcnMgb2YgdGhlIHNhbWUgbmFtZVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY29kZT0wXSBUaGUgc3RhdHVzIGNvZGUgZXhwbGFpbmluZyB3aHkgdGhlXG4gICAqICAgICBjb25uZWN0aW9uIHdhcyBjbG9zZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnJlYXNvbj0nJ10gQSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgZXhwbGFpbmluZyB3aHlcbiAgICogICAgIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy53YXNDbGVhbj1mYWxzZV0gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZVxuICAgKiAgICAgY29ubmVjdGlvbiB3YXMgY2xlYW5seSBjbG9zZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKHR5cGUpO1xuXG4gICAgdGhpc1trQ29kZV0gPSBvcHRpb25zLmNvZGUgPT09IHVuZGVmaW5lZCA/IDAgOiBvcHRpb25zLmNvZGU7XG4gICAgdGhpc1trUmVhc29uXSA9IG9wdGlvbnMucmVhc29uID09PSB1bmRlZmluZWQgPyAnJyA6IG9wdGlvbnMucmVhc29uO1xuICAgIHRoaXNba1dhc0NsZWFuXSA9IG9wdGlvbnMud2FzQ2xlYW4gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9ucy53YXNDbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKi9cbiAgZ2V0IGNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXNba0NvZGVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgcmVhc29uKCkge1xuICAgIHJldHVybiB0aGlzW2tSZWFzb25dO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgZ2V0IHdhc0NsZWFuKCkge1xuICAgIHJldHVybiB0aGlzW2tXYXNDbGVhbl07XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KENsb3NlRXZlbnQucHJvdG90eXBlLCAnY29kZScsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShDbG9zZUV2ZW50LnByb3RvdHlwZSwgJ3JlYXNvbicsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShDbG9zZUV2ZW50LnByb3RvdHlwZSwgJ3dhc0NsZWFuJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhbiBlcnJvciBldmVudC5cbiAqXG4gKiBAZXh0ZW5kcyBFdmVudFxuICovXG5jbGFzcyBFcnJvckV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBFcnJvckV2ZW50YC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gQSBkaWN0aW9uYXJ5IG9iamVjdCB0aGF0IGFsbG93cyBmb3Igc2V0dGluZ1xuICAgKiAgICAgYXR0cmlidXRlcyB2aWEgb2JqZWN0IG1lbWJlcnMgb2YgdGhlIHNhbWUgbmFtZVxuICAgKiBAcGFyYW0geyp9IFtvcHRpb25zLmVycm9yPW51bGxdIFRoZSBlcnJvciB0aGF0IGdlbmVyYXRlZCB0aGlzIGV2ZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlPScnXSBUaGUgZXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgY29uc3RydWN0b3IodHlwZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzW2tFcnJvcl0gPSBvcHRpb25zLmVycm9yID09PSB1bmRlZmluZWQgPyBudWxsIDogb3B0aW9ucy5lcnJvcjtcbiAgICB0aGlzW2tNZXNzYWdlXSA9IG9wdGlvbnMubWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBvcHRpb25zLm1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUgeyp9XG4gICAqL1xuICBnZXQgZXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXNba0Vycm9yXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXNba01lc3NhZ2VdO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFcnJvckV2ZW50LnByb3RvdHlwZSwgJ2Vycm9yJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEVycm9yRXZlbnQucHJvdG90eXBlLCAnbWVzc2FnZScsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBtZXNzYWdlIGV2ZW50LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50XG4gKi9cbmNsYXNzIE1lc3NhZ2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgTWVzc2FnZUV2ZW50YC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gQSBkaWN0aW9uYXJ5IG9iamVjdCB0aGF0IGFsbG93cyBmb3Igc2V0dGluZ1xuICAgKiAgICAgYXR0cmlidXRlcyB2aWEgb2JqZWN0IG1lbWJlcnMgb2YgdGhlIHNhbWUgbmFtZVxuICAgKiBAcGFyYW0geyp9IFtvcHRpb25zLmRhdGE9bnVsbF0gVGhlIG1lc3NhZ2UgY29udGVudFxuICAgKi9cbiAgY29uc3RydWN0b3IodHlwZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzW2tEYXRhXSA9IG9wdGlvbnMuZGF0YSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IG9wdGlvbnMuZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Kn1cbiAgICovXG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzW2tEYXRhXTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTWVzc2FnZUV2ZW50LnByb3RvdHlwZSwgJ2RhdGEnLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8qKlxuICogVGhpcyBwcm92aWRlcyBtZXRob2RzIGZvciBlbXVsYXRpbmcgdGhlIGBFdmVudFRhcmdldGAgaW50ZXJmYWNlLiBJdCdzIG5vdFxuICogbWVhbnQgdG8gYmUgdXNlZCBkaXJlY3RseS5cbiAqXG4gKiBAbWl4aW5cbiAqL1xuY29uc3QgRXZlbnRUYXJnZXQgPSB7XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBldmVudCB0eXBlIHRvIGxpc3RlbiBmb3JcbiAgICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gaGFuZGxlciBUaGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gQW4gb3B0aW9ucyBvYmplY3Qgc3BlY2lmaWVzIGNoYXJhY3RlcmlzdGljcyBhYm91dFxuICAgKiAgICAgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMub25jZT1mYWxzZV0gQSBgQm9vbGVhbmAgaW5kaWNhdGluZyB0aGF0IHRoZVxuICAgKiAgICAgbGlzdGVuZXIgc2hvdWxkIGJlIGludm9rZWQgYXQgbW9zdCBvbmNlIGFmdGVyIGJlaW5nIGFkZGVkLiBJZiBgdHJ1ZWAsXG4gICAqICAgICB0aGUgbGlzdGVuZXIgd291bGQgYmUgYXV0b21hdGljYWxseSByZW1vdmVkIHdoZW4gaW52b2tlZC5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBvcHRpb25zID0ge30pIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMubGlzdGVuZXJzKHR5cGUpKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFvcHRpb25zW2tGb3JPbkV2ZW50QXR0cmlidXRlJDFdICYmXG4gICAgICAgIGxpc3RlbmVyW2tMaXN0ZW5lciQxXSA9PT0gaGFuZGxlciAmJlxuICAgICAgICAhbGlzdGVuZXJba0Zvck9uRXZlbnRBdHRyaWJ1dGUkMV1cbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHdyYXBwZXI7XG5cbiAgICBpZiAodHlwZSA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICB3cmFwcGVyID0gZnVuY3Rpb24gb25NZXNzYWdlKGRhdGEsIGlzQmluYXJ5KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IE1lc3NhZ2VFdmVudCgnbWVzc2FnZScsIHtcbiAgICAgICAgICBkYXRhOiBpc0JpbmFyeSA/IGRhdGEgOiBkYXRhLnRvU3RyaW5nKClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xuICAgICAgICBjYWxsTGlzdGVuZXIoaGFuZGxlciwgdGhpcywgZXZlbnQpO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjbG9zZScpIHtcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbkNsb3NlKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ2xvc2VFdmVudCgnY2xvc2UnLCB7XG4gICAgICAgICAgY29kZSxcbiAgICAgICAgICByZWFzb246IG1lc3NhZ2UudG9TdHJpbmcoKSxcbiAgICAgICAgICB3YXNDbGVhbjogdGhpcy5fY2xvc2VGcmFtZVJlY2VpdmVkICYmIHRoaXMuX2Nsb3NlRnJhbWVTZW50XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV2ZW50W2tUYXJnZXRdID0gdGhpcztcbiAgICAgICAgY2FsbExpc3RlbmVyKGhhbmRsZXIsIHRoaXMsIGV2ZW50KTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZXJyb3InKSB7XG4gICAgICB3cmFwcGVyID0gZnVuY3Rpb24gb25FcnJvcihlcnJvcikge1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFcnJvckV2ZW50KCdlcnJvcicsIHtcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV2ZW50W2tUYXJnZXRdID0gdGhpcztcbiAgICAgICAgY2FsbExpc3RlbmVyKGhhbmRsZXIsIHRoaXMsIGV2ZW50KTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BlbicpIHtcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbk9wZW4oKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdvcGVuJyk7XG5cbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xuICAgICAgICBjYWxsTGlzdGVuZXIoaGFuZGxlciwgdGhpcywgZXZlbnQpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdyYXBwZXJba0Zvck9uRXZlbnRBdHRyaWJ1dGUkMV0gPSAhIW9wdGlvbnNba0Zvck9uRXZlbnRBdHRyaWJ1dGUkMV07XG4gICAgd3JhcHBlcltrTGlzdGVuZXIkMV0gPSBoYW5kbGVyO1xuXG4gICAgaWYgKG9wdGlvbnMub25jZSkge1xuICAgICAgdGhpcy5vbmNlKHR5cGUsIHdyYXBwZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uKHR5cGUsIHdyYXBwZXIpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV2ZW50IHR5cGUgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufE9iamVjdCl9IGhhbmRsZXIgVGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcHVibGljXG4gICAqL1xuICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIpIHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMubGlzdGVuZXJzKHR5cGUpKSB7XG4gICAgICBpZiAobGlzdGVuZXJba0xpc3RlbmVyJDFdID09PSBoYW5kbGVyICYmICFsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZSQxXSkge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgZXZlbnRUYXJnZXQgPSB7XG4gIENsb3NlRXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIEV2ZW50LFxuICBFdmVudFRhcmdldCxcbiAgTWVzc2FnZUV2ZW50XG59O1xuXG4vKipcbiAqIENhbGwgYW4gZXZlbnQgbGlzdGVuZXJcbiAqXG4gKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gY2FsbFxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSB2YWx1ZSB0byB1c2UgYXMgYHRoaXNgYCB3aGVuIGNhbGxpbmcgdGhlIGxpc3RlbmVyXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gcGFzcyB0byB0aGUgbGlzdGVuZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxMaXN0ZW5lcihsaXN0ZW5lciwgdGhpc0FyZywgZXZlbnQpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciA9PT0gJ29iamVjdCcgJiYgbGlzdGVuZXIuaGFuZGxlRXZlbnQpIHtcbiAgICBsaXN0ZW5lci5oYW5kbGVFdmVudC5jYWxsKGxpc3RlbmVyLCBldmVudCk7XG4gIH0gZWxzZSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzQXJnLCBldmVudCk7XG4gIH1cbn1cblxuY29uc3QgeyB0b2tlbkNoYXJzOiB0b2tlbkNoYXJzJDEgfSA9IHZhbGlkYXRpb25FeHBvcnRzO1xuXG4vKipcbiAqIEFkZHMgYW4gb2ZmZXIgdG8gdGhlIG1hcCBvZiBleHRlbnNpb24gb2ZmZXJzIG9yIGEgcGFyYW1ldGVyIHRvIHRoZSBtYXAgb2ZcbiAqIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlc3QgVGhlIG1hcCBvZiBleHRlbnNpb24gb2ZmZXJzIG9yIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBleHRlbnNpb24gb3IgcGFyYW1ldGVyIG5hbWVcbiAqIEBwYXJhbSB7KE9iamVjdHxCb29sZWFufFN0cmluZyl9IGVsZW0gVGhlIGV4dGVuc2lvbiBwYXJhbWV0ZXJzIG9yIHRoZVxuICogICAgIHBhcmFtZXRlciB2YWx1ZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcHVzaChkZXN0LCBuYW1lLCBlbGVtKSB7XG4gIGlmIChkZXN0W25hbWVdID09PSB1bmRlZmluZWQpIGRlc3RbbmFtZV0gPSBbZWxlbV07XG4gIGVsc2UgZGVzdFtuYW1lXS5wdXNoKGVsZW0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgYFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uc2AgaGVhZGVyIGludG8gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXIgVGhlIGZpZWxkIHZhbHVlIG9mIHRoZSBoZWFkZXJcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHBhcnNlZCBvYmplY3RcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gcGFyc2UkNChoZWFkZXIpIHtcbiAgY29uc3Qgb2ZmZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgbGV0IHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGxldCBtdXN0VW5lc2NhcGUgPSBmYWxzZTtcbiAgbGV0IGlzRXNjYXBpbmcgPSBmYWxzZTtcbiAgbGV0IGluUXVvdGVzID0gZmFsc2U7XG4gIGxldCBleHRlbnNpb25OYW1lO1xuICBsZXQgcGFyYW1OYW1lO1xuICBsZXQgc3RhcnQgPSAtMTtcbiAgbGV0IGNvZGUgPSAtMTtcbiAgbGV0IGVuZCA9IC0xO1xuICBsZXQgaSA9IDA7XG5cbiAgZm9yICg7IGkgPCBoZWFkZXIubGVuZ3RoOyBpKyspIHtcbiAgICBjb2RlID0gaGVhZGVyLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBpZiAoZXh0ZW5zaW9uTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZW5kID09PSAtMSAmJiB0b2tlbkNoYXJzJDFbY29kZV0gPT09IDEpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSAtMSkgc3RhcnQgPSBpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaSAhPT0gMCAmJlxuICAgICAgICAoY29kZSA9PT0gMHgyMCAvKiAnICcgKi8gfHwgY29kZSA9PT0gMHgwOSkgLyogJ1xcdCcgKi9cbiAgICAgICkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2IgLyogJzsnICovIHx8IGNvZGUgPT09IDB4MmMgLyogJywnICovKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICAgICAgICBjb25zdCBuYW1lID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgICBpZiAoY29kZSA9PT0gMHgyYykge1xuICAgICAgICAgIHB1c2gob2ZmZXJzLCBuYW1lLCBwYXJhbXMpO1xuICAgICAgICAgIHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IG5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydCA9IGVuZCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwYXJhbU5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVuZCA9PT0gLTEgJiYgdG9rZW5DaGFycyQxW2NvZGVdID09PSAxKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHN0YXJ0ID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMCB8fCBjb2RlID09PSAweDA5KSB7XG4gICAgICAgIGlmIChlbmQgPT09IC0xICYmIHN0YXJ0ICE9PSAtMSkgZW5kID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgzYiB8fCBjb2RlID09PSAweDJjKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICAgICAgICBwdXNoKHBhcmFtcywgaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpLCB0cnVlKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MmMpIHtcbiAgICAgICAgICBwdXNoKG9mZmVycywgZXh0ZW5zaW9uTmFtZSwgcGFyYW1zKTtcbiAgICAgICAgICBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGV4dGVuc2lvbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydCA9IGVuZCA9IC0xO1xuICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDNkIC8qICc9JyAqLyAmJiBzdGFydCAhPT0gLTEgJiYgZW5kID09PSAtMSkge1xuICAgICAgICBwYXJhbU5hbWUgPSBoZWFkZXIuc2xpY2Uoc3RhcnQsIGkpO1xuICAgICAgICBzdGFydCA9IGVuZCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICAvLyBUaGUgdmFsdWUgb2YgYSBxdW90ZWQtc3RyaW5nIGFmdGVyIHVuZXNjYXBpbmcgbXVzdCBjb25mb3JtIHRvIHRoZVxuICAgICAgLy8gdG9rZW4gQUJORiwgc28gb25seSB0b2tlbiBjaGFyYWN0ZXJzIGFyZSB2YWxpZC5cbiAgICAgIC8vIFJlZjogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY0NTUjc2VjdGlvbi05LjFcbiAgICAgIC8vXG4gICAgICBpZiAoaXNFc2NhcGluZykge1xuICAgICAgICBpZiAodG9rZW5DaGFycyQxW2NvZGVdICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ID09PSAtMSkgc3RhcnQgPSBpO1xuICAgICAgICBlbHNlIGlmICghbXVzdFVuZXNjYXBlKSBtdXN0VW5lc2NhcGUgPSB0cnVlO1xuICAgICAgICBpc0VzY2FwaW5nID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGluUXVvdGVzKSB7XG4gICAgICAgIGlmICh0b2tlbkNoYXJzJDFbY29kZV0gPT09IDEpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMiAvKiAnXCInICovICYmIHN0YXJ0ICE9PSAtMSkge1xuICAgICAgICAgIGluUXVvdGVzID0gZmFsc2U7XG4gICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDVjIC8qICdcXCcgKi8pIHtcbiAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDIyICYmIGhlYWRlci5jaGFyQ29kZUF0KGkgLSAxKSA9PT0gMHgzZCkge1xuICAgICAgICBpblF1b3RlcyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gLTEgJiYgdG9rZW5DaGFycyQxW2NvZGVdID09PSAxKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHN0YXJ0ID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnQgIT09IC0xICYmIChjb2RlID09PSAweDIwIHx8IGNvZGUgPT09IDB4MDkpKSB7XG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDNiIHx8IGNvZGUgPT09IDB4MmMpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSAtMSkge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtpfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IGk7XG4gICAgICAgIGxldCB2YWx1ZSA9IGhlYWRlci5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgaWYgKG11c3RVbmVzY2FwZSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgICAgICAgbXVzdFVuZXNjYXBlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcHVzaChwYXJhbXMsIHBhcmFtTmFtZSwgdmFsdWUpO1xuICAgICAgICBpZiAoY29kZSA9PT0gMHgyYykge1xuICAgICAgICAgIHB1c2gob2ZmZXJzLCBleHRlbnNpb25OYW1lLCBwYXJhbXMpO1xuICAgICAgICAgIHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmFtTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3RhcnQgPSBlbmQgPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtpfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gLTEgfHwgaW5RdW90ZXMgfHwgY29kZSA9PT0gMHgyMCB8fCBjb2RlID09PSAweDA5KSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCcpO1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IGk7XG4gIGNvbnN0IHRva2VuID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICBpZiAoZXh0ZW5zaW9uTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcHVzaChvZmZlcnMsIHRva2VuLCBwYXJhbXMpO1xuICB9IGVsc2Uge1xuICAgIGlmIChwYXJhbU5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcHVzaChwYXJhbXMsIHRva2VuLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKG11c3RVbmVzY2FwZSkge1xuICAgICAgcHVzaChwYXJhbXMsIHBhcmFtTmFtZSwgdG9rZW4ucmVwbGFjZSgvXFxcXC9nLCAnJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoKHBhcmFtcywgcGFyYW1OYW1lLCB0b2tlbik7XG4gICAgfVxuICAgIHB1c2gob2ZmZXJzLCBleHRlbnNpb25OYW1lLCBwYXJhbXMpO1xuICB9XG5cbiAgcmV0dXJuIG9mZmVycztcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnNgIGhlYWRlciBmaWVsZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZXh0ZW5zaW9ucyBUaGUgbWFwIG9mIGV4dGVuc2lvbnMgYW5kIHBhcmFtZXRlcnMgdG8gZm9ybWF0XG4gKiBAcmV0dXJuIHtTdHJpbmd9IEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gb2JqZWN0XG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdCQxKGV4dGVuc2lvbnMpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGV4dGVuc2lvbnMpXG4gICAgLm1hcCgoZXh0ZW5zaW9uKSA9PiB7XG4gICAgICBsZXQgY29uZmlndXJhdGlvbnMgPSBleHRlbnNpb25zW2V4dGVuc2lvbl07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlndXJhdGlvbnMpKSBjb25maWd1cmF0aW9ucyA9IFtjb25maWd1cmF0aW9uc107XG4gICAgICByZXR1cm4gY29uZmlndXJhdGlvbnNcbiAgICAgICAgLm1hcCgocGFyYW1zKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtleHRlbnNpb25dXG4gICAgICAgICAgICAuY29uY2F0KFxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLm1hcCgoaykgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBwYXJhbXNba107XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHZhbHVlcyA9IFt2YWx1ZXNdO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgIC5tYXAoKHYpID0+ICh2ID09PSB0cnVlID8gayA6IGAke2t9PSR7dn1gKSlcbiAgICAgICAgICAgICAgICAgIC5qb2luKCc7ICcpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCcsICcpO1xuICAgIH0pXG4gICAgLmpvaW4oJywgJyk7XG59XG5cbnZhciBleHRlbnNpb24kMSA9IHsgZm9ybWF0OiBmb3JtYXQkMSwgcGFyc2U6IHBhcnNlJDQgfTtcblxuLyogZXNsaW50IG5vLXVudXNlZC12YXJzOiBbXCJlcnJvclwiLCB7IFwidmFyc0lnbm9yZVBhdHRlcm5cIjogXCJeUmVhZGFibGUkXCIgfV0gKi9cblxuY29uc3QgRXZlbnRFbWl0dGVyJDEgPSByZXF1aXJlJCQwJDU7XG5jb25zdCBodHRwcyQyID0gcmVxdWlyZSQkMSQyO1xuY29uc3QgaHR0cCQzID0gcmVxdWlyZSQkMSQxO1xuY29uc3QgbmV0ID0gcmVxdWlyZSQkMyQyO1xuY29uc3QgdGxzID0gcmVxdWlyZSQkNDtcbmNvbnN0IHsgcmFuZG9tQnl0ZXMsIGNyZWF0ZUhhc2g6IGNyZWF0ZUhhc2gkMSB9ID0gcmVxdWlyZSQkNSQxO1xuY29uc3QgeyBVUkw6IFVSTCQyIH0gPSByZXF1aXJlJCQwJDk7XG5cbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlJDEgPSBwZXJtZXNzYWdlRGVmbGF0ZTtcbmNvbnN0IFJlY2VpdmVyID0gcmVjZWl2ZXI7XG5jb25zdCBTZW5kZXIgPSBzZW5kZXI7XG5jb25zdCB7XG4gIEJJTkFSWV9UWVBFUyxcbiAgRU1QVFlfQlVGRkVSLFxuICBHVUlEOiBHVUlEJDEsXG4gIGtGb3JPbkV2ZW50QXR0cmlidXRlLFxuICBrTGlzdGVuZXIsXG4gIGtTdGF0dXNDb2RlLFxuICBrV2ViU29ja2V0OiBrV2ViU29ja2V0JDEsXG4gIE5PT1Bcbn0gPSBjb25zdGFudHM7XG5jb25zdCB7XG4gIEV2ZW50VGFyZ2V0OiB7IGFkZEV2ZW50TGlzdGVuZXIsIHJlbW92ZUV2ZW50TGlzdGVuZXIgfVxufSA9IGV2ZW50VGFyZ2V0O1xuY29uc3QgeyBmb3JtYXQsIHBhcnNlOiBwYXJzZSQzIH0gPSBleHRlbnNpb24kMTtcbmNvbnN0IHsgdG9CdWZmZXIgfSA9IGJ1ZmZlclV0aWxFeHBvcnRzO1xuXG5jb25zdCBjbG9zZVRpbWVvdXQgPSAzMCAqIDEwMDA7XG5jb25zdCBrQWJvcnRlZCA9IFN5bWJvbCgna0Fib3J0ZWQnKTtcbmNvbnN0IHByb3RvY29sVmVyc2lvbnMgPSBbOCwgMTNdO1xuY29uc3QgcmVhZHlTdGF0ZXMgPSBbJ0NPTk5FQ1RJTkcnLCAnT1BFTicsICdDTE9TSU5HJywgJ0NMT1NFRCddO1xuY29uc3Qgc3VicHJvdG9jb2xSZWdleCA9IC9eWyEjJCUmJyorXFwtLjAtOUEtWl5fYHxhLXp+XSskLztcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBXZWJTb2NrZXQuXG4gKlxuICogQGV4dGVuZHMgRXZlbnRFbWl0dGVyXG4gKi9cbmxldCBXZWJTb2NrZXQkMSA9IGNsYXNzIFdlYlNvY2tldCBleHRlbmRzIEV2ZW50RW1pdHRlciQxIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgV2ViU29ja2V0YC5cbiAgICpcbiAgICogQHBhcmFtIHsoU3RyaW5nfFVSTCl9IGFkZHJlc3MgVGhlIFVSTCB0byB3aGljaCB0byBjb25uZWN0XG4gICAqIEBwYXJhbSB7KFN0cmluZ3xTdHJpbmdbXSl9IFtwcm90b2NvbHNdIFRoZSBzdWJwcm90b2NvbHNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBDb25uZWN0aW9uIG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFkZHJlc3MsIHByb3RvY29scywgb3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9iaW5hcnlUeXBlID0gQklOQVJZX1RZUEVTWzBdO1xuICAgIHRoaXMuX2Nsb3NlQ29kZSA9IDEwMDY7XG4gICAgdGhpcy5fY2xvc2VGcmFtZVJlY2VpdmVkID0gZmFsc2U7XG4gICAgdGhpcy5fY2xvc2VGcmFtZVNlbnQgPSBmYWxzZTtcbiAgICB0aGlzLl9jbG9zZU1lc3NhZ2UgPSBFTVBUWV9CVUZGRVI7XG4gICAgdGhpcy5fY2xvc2VUaW1lciA9IG51bGw7XG4gICAgdGhpcy5fZXh0ZW5zaW9ucyA9IHt9O1xuICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3Byb3RvY29sID0gJyc7XG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DT05ORUNUSU5HO1xuICAgIHRoaXMuX3JlY2VpdmVyID0gbnVsbDtcbiAgICB0aGlzLl9zZW5kZXIgPSBudWxsO1xuICAgIHRoaXMuX3NvY2tldCA9IG51bGw7XG5cbiAgICBpZiAoYWRkcmVzcyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fYnVmZmVyZWRBbW91bnQgPSAwO1xuICAgICAgdGhpcy5faXNTZXJ2ZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlZGlyZWN0cyA9IDA7XG5cbiAgICAgIGlmIChwcm90b2NvbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm90b2NvbHMgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkocHJvdG9jb2xzKSkge1xuICAgICAgICBpZiAodHlwZW9mIHByb3RvY29scyA9PT0gJ29iamVjdCcgJiYgcHJvdG9jb2xzICE9PSBudWxsKSB7XG4gICAgICAgICAgb3B0aW9ucyA9IHByb3RvY29scztcbiAgICAgICAgICBwcm90b2NvbHMgPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm90b2NvbHMgPSBbcHJvdG9jb2xzXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpbml0QXNDbGllbnQodGhpcywgYWRkcmVzcywgcHJvdG9jb2xzLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faXNTZXJ2ZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGRldmlhdGVzIGZyb20gdGhlIFdIQVRXRyBpbnRlcmZhY2Ugc2luY2Ugd3MgZG9lc24ndCBzdXBwb3J0IHRoZVxuICAgKiByZXF1aXJlZCBkZWZhdWx0IFwiYmxvYlwiIHR5cGUgKGluc3RlYWQgd2UgZGVmaW5lIGEgY3VzdG9tIFwibm9kZWJ1ZmZlclwiXG4gICAqIHR5cGUpLlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0IGJpbmFyeVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JpbmFyeVR5cGU7XG4gIH1cblxuICBzZXQgYmluYXJ5VHlwZSh0eXBlKSB7XG4gICAgaWYgKCFCSU5BUllfVFlQRVMuaW5jbHVkZXModHlwZSkpIHJldHVybjtcblxuICAgIHRoaXMuX2JpbmFyeVR5cGUgPSB0eXBlO1xuXG4gICAgLy9cbiAgICAvLyBBbGxvdyB0byBjaGFuZ2UgYGJpbmFyeVR5cGVgIG9uIHRoZSBmbHkuXG4gICAgLy9cbiAgICBpZiAodGhpcy5fcmVjZWl2ZXIpIHRoaXMuX3JlY2VpdmVyLl9iaW5hcnlUeXBlID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKi9cbiAgZ2V0IGJ1ZmZlcmVkQW1vdW50KCkge1xuICAgIGlmICghdGhpcy5fc29ja2V0KSByZXR1cm4gdGhpcy5fYnVmZmVyZWRBbW91bnQ7XG5cbiAgICByZXR1cm4gdGhpcy5fc29ja2V0Ll93cml0YWJsZVN0YXRlLmxlbmd0aCArIHRoaXMuX3NlbmRlci5fYnVmZmVyZWRCeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0IGV4dGVuc2lvbnMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2V4dGVuc2lvbnMpLmpvaW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICovXG4gIGdldCBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGF1c2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGdldCBvbmNsb3NlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGdldCBvbmVycm9yKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICovXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGdldCBvbm9wZW4oKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9ubWVzc2FnZSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0IHByb3RvY29sKCkge1xuICAgIHJldHVybiB0aGlzLl9wcm90b2NvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKi9cbiAgZ2V0IHJlYWR5U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWR5U3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdXAgdGhlIHNvY2tldCBhbmQgdGhlIGludGVybmFsIHJlc291cmNlcy5cbiAgICpcbiAgICogQHBhcmFtIHsobmV0LlNvY2tldHx0bHMuU29ja2V0KX0gc29ja2V0IFRoZSBuZXR3b3JrIHNvY2tldCBiZXR3ZWVuIHRoZVxuICAgKiAgICAgc2VydmVyIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWQgVGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdXBncmFkZWQgc3RyZWFtXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmdlbmVyYXRlTWFza10gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgdGhlXG4gICAqICAgICBtYXNraW5nIGtleVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0wXSBUaGUgbWF4aW11bSBhbGxvd2VkIG1lc3NhZ2Ugc2l6ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAgICogICAgIG5vdCB0byBza2lwIFVURi04IHZhbGlkYXRpb24gZm9yIHRleHQgYW5kIGNsb3NlIG1lc3NhZ2VzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXRTb2NrZXQoc29ja2V0LCBoZWFkLCBvcHRpb25zKSB7XG4gICAgY29uc3QgcmVjZWl2ZXIgPSBuZXcgUmVjZWl2ZXIoe1xuICAgICAgYmluYXJ5VHlwZTogdGhpcy5iaW5hcnlUeXBlLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5fZXh0ZW5zaW9ucyxcbiAgICAgIGlzU2VydmVyOiB0aGlzLl9pc1NlcnZlcixcbiAgICAgIG1heFBheWxvYWQ6IG9wdGlvbnMubWF4UGF5bG9hZCxcbiAgICAgIHNraXBVVEY4VmFsaWRhdGlvbjogb3B0aW9ucy5za2lwVVRGOFZhbGlkYXRpb25cbiAgICB9KTtcblxuICAgIHRoaXMuX3NlbmRlciA9IG5ldyBTZW5kZXIoc29ja2V0LCB0aGlzLl9leHRlbnNpb25zLCBvcHRpb25zLmdlbmVyYXRlTWFzayk7XG4gICAgdGhpcy5fcmVjZWl2ZXIgPSByZWNlaXZlcjtcbiAgICB0aGlzLl9zb2NrZXQgPSBzb2NrZXQ7XG5cbiAgICByZWNlaXZlcltrV2ViU29ja2V0JDFdID0gdGhpcztcbiAgICBzb2NrZXRba1dlYlNvY2tldCQxXSA9IHRoaXM7XG5cbiAgICByZWNlaXZlci5vbignY29uY2x1ZGUnLCByZWNlaXZlck9uQ29uY2x1ZGUpO1xuICAgIHJlY2VpdmVyLm9uKCdkcmFpbicsIHJlY2VpdmVyT25EcmFpbik7XG4gICAgcmVjZWl2ZXIub24oJ2Vycm9yJywgcmVjZWl2ZXJPbkVycm9yKTtcbiAgICByZWNlaXZlci5vbignbWVzc2FnZScsIHJlY2VpdmVyT25NZXNzYWdlKTtcbiAgICByZWNlaXZlci5vbigncGluZycsIHJlY2VpdmVyT25QaW5nKTtcbiAgICByZWNlaXZlci5vbigncG9uZycsIHJlY2VpdmVyT25Qb25nKTtcblxuICAgIHNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgIHNvY2tldC5zZXROb0RlbGF5KCk7XG5cbiAgICBpZiAoaGVhZC5sZW5ndGggPiAwKSBzb2NrZXQudW5zaGlmdChoZWFkKTtcblxuICAgIHNvY2tldC5vbignY2xvc2UnLCBzb2NrZXRPbkNsb3NlKTtcbiAgICBzb2NrZXQub24oJ2RhdGEnLCBzb2NrZXRPbkRhdGEpO1xuICAgIHNvY2tldC5vbignZW5kJywgc29ja2V0T25FbmQpO1xuICAgIHNvY2tldC5vbignZXJyb3InLCBzb2NrZXRPbkVycm9yJDEpO1xuXG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5PUEVOO1xuICAgIHRoaXMuZW1pdCgnb3BlbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGAnY2xvc2UnYCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXRDbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TRUQ7XG4gICAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgdGhpcy5fY2xvc2VDb2RlLCB0aGlzLl9jbG9zZU1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlJDEuZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgIHRoaXMuX2V4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUkMS5leHRlbnNpb25OYW1lXS5jbGVhbnVwKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVjZWl2ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TRUQ7XG4gICAgdGhpcy5lbWl0KCdjbG9zZScsIHRoaXMuX2Nsb3NlQ29kZSwgdGhpcy5fY2xvc2VNZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIGNsb3NpbmcgaGFuZHNoYWtlLlxuICAgKlxuICAgKiAgICAgICAgICArLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0rXG4gICAqICAgICAtIC0gLXx3cy5jbG9zZSgpfC0tPnxjbG9zZSBmcmFtZXwtLT58d3MuY2xvc2UoKXwtIC0gLVxuICAgKiAgICB8ICAgICArLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0rICAgICB8XG4gICAqICAgICAgICAgICstLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsgICAgICAgICB8XG4gICAqIENMT1NJTkcgIHx3cy5jbG9zZSgpfDwtLXxjbG9zZSBmcmFtZXw8LS0rLS0tLS0rICAgICAgIENMT1NJTkdcbiAgICogICAgICAgICAgKy0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0tKyAgIHxcbiAgICogICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICArLS0tKyAgICAgICAgfFxuICAgKiAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tPnxmaW58IC0gLSAtIC1cbiAgICogICAgfCAgICAgICAgICstLS0rICAgICAgICAgICAgICAgICAgICAgIHwgICArLS0tK1xuICAgKiAgICAgLSAtIC0gLSAtfGZpbnw8LS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgKiAgICAgICAgICAgICAgKy0tLStcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtjb2RlXSBTdGF0dXMgY29kZSBleHBsYWluaW5nIHdoeSB0aGUgY29ubmVjdGlvbiBpcyBjbG9zaW5nXG4gICAqIEBwYXJhbSB7KFN0cmluZ3xCdWZmZXIpfSBbZGF0YV0gVGhlIHJlYXNvbiB3aHkgdGhlIGNvbm5lY3Rpb24gaXNcbiAgICogICAgIGNsb3NpbmdcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgY2xvc2UoY29kZSwgZGF0YSkge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHJldHVybjtcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORykge1xuICAgICAgY29uc3QgbXNnID0gJ1dlYlNvY2tldCB3YXMgY2xvc2VkIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQnO1xuICAgICAgYWJvcnRIYW5kc2hha2UkMSh0aGlzLCB0aGlzLl9yZXEsIG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NJTkcpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fY2xvc2VGcmFtZVNlbnQgJiZcbiAgICAgICAgKHRoaXMuX2Nsb3NlRnJhbWVSZWNlaXZlZCB8fCB0aGlzLl9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fc29ja2V0LmVuZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgIHRoaXMuX3NlbmRlci5jbG9zZShjb2RlLCBkYXRhLCAhdGhpcy5faXNTZXJ2ZXIsIChlcnIpID0+IHtcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGVycm9yIGlzIGhhbmRsZWQgYnkgdGhlIGAnZXJyb3InYCBsaXN0ZW5lciBvbiB0aGUgc29ja2V0LiBXZSBvbmx5XG4gICAgICAvLyB3YW50IHRvIGtub3cgaWYgdGhlIGNsb3NlIGZyYW1lIGhhcyBiZWVuIHNlbnQgaGVyZS5cbiAgICAgIC8vXG4gICAgICBpZiAoZXJyKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX2Nsb3NlRnJhbWVTZW50ID0gdHJ1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgfHxcbiAgICAgICAgdGhpcy5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fc29ja2V0LmVuZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvLyBTcGVjaWZ5IGEgdGltZW91dCBmb3IgdGhlIGNsb3NpbmcgaGFuZHNoYWtlIHRvIGNvbXBsZXRlLlxuICAgIC8vXG4gICAgdGhpcy5fY2xvc2VUaW1lciA9IHNldFRpbWVvdXQoXG4gICAgICB0aGlzLl9zb2NrZXQuZGVzdHJveS5iaW5kKHRoaXMuX3NvY2tldCksXG4gICAgICBjbG9zZVRpbWVvdXRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlIHRoZSBzb2NrZXQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHBhdXNlKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcgfHxcbiAgICAgIHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3BhdXNlZCA9IHRydWU7XG4gICAgdGhpcy5fc29ja2V0LnBhdXNlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIHBpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gW2RhdGFdIFRoZSBkYXRhIHRvIHNlbmRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbbWFza10gSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2sgYGRhdGFgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2sgd2hpY2ggaXMgZXhlY3V0ZWQgd2hlbiB0aGUgcGluZyBpcyBzZW50XG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHBpbmcoZGF0YSwgbWFzaywgY2IpIHtcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJTb2NrZXQgaXMgbm90IG9wZW46IHJlYWR5U3RhdGUgMCAoQ09OTkVDVElORyknKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiID0gZGF0YTtcbiAgICAgIGRhdGEgPSBtYXNrID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1hc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiID0gbWFzaztcbiAgICAgIG1hc2sgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJykgZGF0YSA9IGRhdGEudG9TdHJpbmcoKTtcblxuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICBzZW5kQWZ0ZXJDbG9zZSh0aGlzLCBkYXRhLCBjYik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG1hc2sgPT09IHVuZGVmaW5lZCkgbWFzayA9ICF0aGlzLl9pc1NlcnZlcjtcbiAgICB0aGlzLl9zZW5kZXIucGluZyhkYXRhIHx8IEVNUFRZX0JVRkZFUiwgbWFzaywgY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBwb25nLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IFtkYXRhXSBUaGUgZGF0YSB0byBzZW5kXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW21hc2tdIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrIGBkYXRhYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrIHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIHBvbmcgaXMgc2VudFxuICAgKiBAcHVibGljXG4gICAqL1xuICBwb25nKGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IGlzIG5vdCBvcGVuOiByZWFkeVN0YXRlIDAgKENPTk5FQ1RJTkcpJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IGRhdGE7XG4gICAgICBkYXRhID0gbWFzayA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtYXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IG1hc2s7XG4gICAgICBtYXNrID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgc2VuZEFmdGVyQ2xvc2UodGhpcywgZGF0YSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYXNrID09PSB1bmRlZmluZWQpIG1hc2sgPSAhdGhpcy5faXNTZXJ2ZXI7XG4gICAgdGhpcy5fc2VuZGVyLnBvbmcoZGF0YSB8fCBFTVBUWV9CVUZGRVIsIG1hc2ssIGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgdGhlIHNvY2tldC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcmVzdW1lKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcgfHxcbiAgICAgIHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xuICAgIGlmICghdGhpcy5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluKSB0aGlzLl9zb2NrZXQucmVzdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIGRhdGEgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXNzYWdlIHRvIHNlbmRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmJpbmFyeV0gU3BlY2lmaWVzIHdoZXRoZXIgYGRhdGFgIGlzIGJpbmFyeSBvclxuICAgKiAgICAgdGV4dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNvbXByZXNzXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gY29tcHJlc3NcbiAgICogICAgIGBkYXRhYFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbj10cnVlXSBTcGVjaWZpZXMgd2hldGhlciB0aGUgZnJhZ21lbnQgaXMgdGhlXG4gICAqICAgICBsYXN0IG9uZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hc2tdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrIGBkYXRhYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrIHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW4gZGF0YSBpcyB3cml0dGVuIG91dFxuICAgKiBAcHVibGljXG4gICAqL1xuICBzZW5kKGRhdGEsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IGlzIG5vdCBvcGVuOiByZWFkeVN0YXRlIDAgKENPTk5FQ1RJTkcpJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IG9wdGlvbnM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJykgZGF0YSA9IGRhdGEudG9TdHJpbmcoKTtcblxuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICBzZW5kQWZ0ZXJDbG9zZSh0aGlzLCBkYXRhLCBjYik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGJpbmFyeTogdHlwZW9mIGRhdGEgIT09ICdzdHJpbmcnLFxuICAgICAgbWFzazogIXRoaXMuX2lzU2VydmVyLFxuICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICBmaW46IHRydWUsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIGlmICghdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZSQxLmV4dGVuc2lvbk5hbWVdKSB7XG4gICAgICBvcHRzLmNvbXByZXNzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fc2VuZGVyLnNlbmQoZGF0YSB8fCBFTVBUWV9CVUZGRVIsIG9wdHMsIGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjaWJseSBjbG9zZSB0aGUgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgdGVybWluYXRlKCkge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHJldHVybjtcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORykge1xuICAgICAgY29uc3QgbXNnID0gJ1dlYlNvY2tldCB3YXMgY2xvc2VkIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQnO1xuICAgICAgYWJvcnRIYW5kc2hha2UkMSh0aGlzLCB0aGlzLl9yZXEsIG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgICAgdGhpcy5fc29ja2V0LmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENPTk5FQ1RJTkdcbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXRcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldCQxLCAnQ09OTkVDVElORycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NPTk5FQ1RJTkcnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENPTk5FQ1RJTkdcbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXQucHJvdG90eXBlXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQkMS5wcm90b3R5cGUsICdDT05ORUNUSU5HJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignQ09OTkVDVElORycpXG59KTtcblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gT1BFTlxuICogQG1lbWJlcm9mIFdlYlNvY2tldFxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0JDEsICdPUEVOJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignT1BFTicpXG59KTtcblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gT1BFTlxuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldCQxLnByb3RvdHlwZSwgJ09QRU4nLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdPUEVOJylcbn0pO1xuXG4vKipcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBDTE9TSU5HXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQkMSwgJ0NMT1NJTkcnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TSU5HJylcbn0pO1xuXG4vKipcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBDTE9TSU5HXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0LnByb3RvdHlwZVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0JDEucHJvdG90eXBlLCAnQ0xPU0lORycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NMT1NJTkcnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENMT1NFRFxuICogQG1lbWJlcm9mIFdlYlNvY2tldFxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0JDEsICdDTE9TRUQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TRUQnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENMT1NFRFxuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldCQxLnByb3RvdHlwZSwgJ0NMT1NFRCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NMT1NFRCcpXG59KTtcblxuW1xuICAnYmluYXJ5VHlwZScsXG4gICdidWZmZXJlZEFtb3VudCcsXG4gICdleHRlbnNpb25zJyxcbiAgJ2lzUGF1c2VkJyxcbiAgJ3Byb3RvY29sJyxcbiAgJ3JlYWR5U3RhdGUnLFxuICAndXJsJ1xuXS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0JDEucHJvdG90eXBlLCBwcm9wZXJ0eSwgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xufSk7XG5cbi8vXG4vLyBBZGQgdGhlIGBvbm9wZW5gLCBgb25lcnJvcmAsIGBvbmNsb3NlYCwgYW5kIGBvbm1lc3NhZ2VgIGF0dHJpYnV0ZXMuXG4vLyBTZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY29tbXMuaHRtbCN0aGUtd2Vic29ja2V0LWludGVyZmFjZVxuLy9cblsnb3BlbicsICdlcnJvcicsICdjbG9zZScsICdtZXNzYWdlJ10uZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQkMS5wcm90b3R5cGUsIGBvbiR7bWV0aG9kfWAsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldCgpIHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMobWV0aG9kKSkge1xuICAgICAgICBpZiAobGlzdGVuZXJba0Zvck9uRXZlbnRBdHRyaWJ1dGVdKSByZXR1cm4gbGlzdGVuZXJba0xpc3RlbmVyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBzZXQoaGFuZGxlcikge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycyhtZXRob2QpKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZV0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKG1ldGhvZCwgbGlzdGVuZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIobWV0aG9kLCBoYW5kbGVyLCB7XG4gICAgICAgIFtrRm9yT25FdmVudEF0dHJpYnV0ZV06IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcblxuV2ViU29ja2V0JDEucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBhZGRFdmVudExpc3RlbmVyO1xuV2ViU29ja2V0JDEucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSByZW1vdmVFdmVudExpc3RlbmVyO1xuXG52YXIgd2Vic29ja2V0ID0gV2ViU29ja2V0JDE7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIFdlYlNvY2tldCBjbGllbnQuXG4gKlxuICogQHBhcmFtIHtXZWJTb2NrZXR9IHdlYnNvY2tldCBUaGUgY2xpZW50IHRvIGluaXRpYWxpemVcbiAqIEBwYXJhbSB7KFN0cmluZ3xVUkwpfSBhZGRyZXNzIFRoZSBVUkwgdG8gd2hpY2ggdG8gY29ubmVjdFxuICogQHBhcmFtIHtBcnJheX0gcHJvdG9jb2xzIFRoZSBzdWJwcm90b2NvbHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gQ29ubmVjdGlvbiBvcHRpb25zXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZvbGxvd1JlZGlyZWN0cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gZm9sbG93XG4gKiAgICAgcmVkaXJlY3RzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZVxuICogICAgIG1hc2tpbmcga2V5XG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaGFuZHNoYWtlVGltZW91dF0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZVxuICogICAgIGhhbmRzaGFrZSByZXF1ZXN0XG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0xMDQ4NTc2MDBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZVxuICogICAgIHNpemVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhSZWRpcmVjdHM9MTBdIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdHNcbiAqICAgICBhbGxvd2VkXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMub3JpZ2luXSBWYWx1ZSBvZiB0aGUgYE9yaWdpbmAgb3JcbiAqICAgICBgU2VjLVdlYlNvY2tldC1PcmlnaW5gIGhlYWRlclxuICogQHBhcmFtIHsoQm9vbGVhbnxPYmplY3QpfSBbb3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZT10cnVlXSBFbmFibGUvZGlzYWJsZVxuICogICAgIHBlcm1lc3NhZ2UtZGVmbGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnByb3RvY29sVmVyc2lvbj0xM10gVmFsdWUgb2YgdGhlXG4gKiAgICAgYFNlYy1XZWJTb2NrZXQtVmVyc2lvbmAgaGVhZGVyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAqICAgICBub3QgdG8gc2tpcCBVVEYtOCB2YWxpZGF0aW9uIGZvciB0ZXh0IGFuZCBjbG9zZSBtZXNzYWdlc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW5pdEFzQ2xpZW50KHdlYnNvY2tldCwgYWRkcmVzcywgcHJvdG9jb2xzLCBvcHRpb25zKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgcHJvdG9jb2xWZXJzaW9uOiBwcm90b2NvbFZlcnNpb25zWzFdLFxuICAgIG1heFBheWxvYWQ6IDEwMCAqIDEwMjQgKiAxMDI0LFxuICAgIHNraXBVVEY4VmFsaWRhdGlvbjogZmFsc2UsXG4gICAgcGVyTWVzc2FnZURlZmxhdGU6IHRydWUsXG4gICAgZm9sbG93UmVkaXJlY3RzOiBmYWxzZSxcbiAgICBtYXhSZWRpcmVjdHM6IDEwLFxuICAgIC4uLm9wdGlvbnMsXG4gICAgY3JlYXRlQ29ubmVjdGlvbjogdW5kZWZpbmVkLFxuICAgIHNvY2tldFBhdGg6IHVuZGVmaW5lZCxcbiAgICBob3N0bmFtZTogdW5kZWZpbmVkLFxuICAgIHByb3RvY29sOiB1bmRlZmluZWQsXG4gICAgdGltZW91dDogdW5kZWZpbmVkLFxuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgaG9zdDogdW5kZWZpbmVkLFxuICAgIHBhdGg6IHVuZGVmaW5lZCxcbiAgICBwb3J0OiB1bmRlZmluZWRcbiAgfTtcblxuICBpZiAoIXByb3RvY29sVmVyc2lvbnMuaW5jbHVkZXMob3B0cy5wcm90b2NvbFZlcnNpb24pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICBgVW5zdXBwb3J0ZWQgcHJvdG9jb2wgdmVyc2lvbjogJHtvcHRzLnByb3RvY29sVmVyc2lvbn0gYCArXG4gICAgICAgIGAoc3VwcG9ydGVkIHZlcnNpb25zOiAke3Byb3RvY29sVmVyc2lvbnMuam9pbignLCAnKX0pYFxuICAgICk7XG4gIH1cblxuICBsZXQgcGFyc2VkVXJsO1xuXG4gIGlmIChhZGRyZXNzIGluc3RhbmNlb2YgVVJMJDIpIHtcbiAgICBwYXJzZWRVcmwgPSBhZGRyZXNzO1xuICAgIHdlYnNvY2tldC5fdXJsID0gYWRkcmVzcy5ocmVmO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWRVcmwgPSBuZXcgVVJMJDIoYWRkcmVzcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIFVSTDogJHthZGRyZXNzfWApO1xuICAgIH1cblxuICAgIHdlYnNvY2tldC5fdXJsID0gYWRkcmVzcztcbiAgfVxuXG4gIGNvbnN0IGlzU2VjdXJlID0gcGFyc2VkVXJsLnByb3RvY29sID09PSAnd3NzOic7XG4gIGNvbnN0IGlzSXBjVXJsID0gcGFyc2VkVXJsLnByb3RvY29sID09PSAnd3MrdW5peDonO1xuICBsZXQgaW52YWxpZFVybE1lc3NhZ2U7XG5cbiAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCAhPT0gJ3dzOicgJiYgIWlzU2VjdXJlICYmICFpc0lwY1VybCkge1xuICAgIGludmFsaWRVcmxNZXNzYWdlID1cbiAgICAgICdUaGUgVVJMXFwncyBwcm90b2NvbCBtdXN0IGJlIG9uZSBvZiBcIndzOlwiLCBcIndzczpcIiwgb3IgXCJ3cyt1bml4OlwiJztcbiAgfSBlbHNlIGlmIChpc0lwY1VybCAmJiAhcGFyc2VkVXJsLnBhdGhuYW1lKSB7XG4gICAgaW52YWxpZFVybE1lc3NhZ2UgPSBcIlRoZSBVUkwncyBwYXRobmFtZSBpcyBlbXB0eVwiO1xuICB9IGVsc2UgaWYgKHBhcnNlZFVybC5oYXNoKSB7XG4gICAgaW52YWxpZFVybE1lc3NhZ2UgPSAnVGhlIFVSTCBjb250YWlucyBhIGZyYWdtZW50IGlkZW50aWZpZXInO1xuICB9XG5cbiAgaWYgKGludmFsaWRVcmxNZXNzYWdlKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IFN5bnRheEVycm9yKGludmFsaWRVcmxNZXNzYWdlKTtcblxuICAgIGlmICh3ZWJzb2NrZXQuX3JlZGlyZWN0cyA9PT0gMCkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0RXJyb3JBbmRDbG9zZSh3ZWJzb2NrZXQsIGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGVmYXVsdFBvcnQgPSBpc1NlY3VyZSA/IDQ0MyA6IDgwO1xuICBjb25zdCBrZXkgPSByYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICBjb25zdCByZXF1ZXN0ID0gaXNTZWN1cmUgPyBodHRwcyQyLnJlcXVlc3QgOiBodHRwJDMucmVxdWVzdDtcbiAgY29uc3QgcHJvdG9jb2xTZXQgPSBuZXcgU2V0KCk7XG4gIGxldCBwZXJNZXNzYWdlRGVmbGF0ZTtcblxuICBvcHRzLmNyZWF0ZUNvbm5lY3Rpb24gPSBpc1NlY3VyZSA/IHRsc0Nvbm5lY3QgOiBuZXRDb25uZWN0O1xuICBvcHRzLmRlZmF1bHRQb3J0ID0gb3B0cy5kZWZhdWx0UG9ydCB8fCBkZWZhdWx0UG9ydDtcbiAgb3B0cy5wb3J0ID0gcGFyc2VkVXJsLnBvcnQgfHwgZGVmYXVsdFBvcnQ7XG4gIG9wdHMuaG9zdCA9IHBhcnNlZFVybC5ob3N0bmFtZS5zdGFydHNXaXRoKCdbJylcbiAgICA/IHBhcnNlZFVybC5ob3N0bmFtZS5zbGljZSgxLCAtMSlcbiAgICA6IHBhcnNlZFVybC5ob3N0bmFtZTtcbiAgb3B0cy5oZWFkZXJzID0ge1xuICAgIC4uLm9wdHMuaGVhZGVycyxcbiAgICAnU2VjLVdlYlNvY2tldC1WZXJzaW9uJzogb3B0cy5wcm90b2NvbFZlcnNpb24sXG4gICAgJ1NlYy1XZWJTb2NrZXQtS2V5Jzoga2V5LFxuICAgIENvbm5lY3Rpb246ICdVcGdyYWRlJyxcbiAgICBVcGdyYWRlOiAnd2Vic29ja2V0J1xuICB9O1xuICBvcHRzLnBhdGggPSBwYXJzZWRVcmwucGF0aG5hbWUgKyBwYXJzZWRVcmwuc2VhcmNoO1xuICBvcHRzLnRpbWVvdXQgPSBvcHRzLmhhbmRzaGFrZVRpbWVvdXQ7XG5cbiAgaWYgKG9wdHMucGVyTWVzc2FnZURlZmxhdGUpIHtcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZSA9IG5ldyBQZXJNZXNzYWdlRGVmbGF0ZSQxKFxuICAgICAgb3B0cy5wZXJNZXNzYWdlRGVmbGF0ZSAhPT0gdHJ1ZSA/IG9wdHMucGVyTWVzc2FnZURlZmxhdGUgOiB7fSxcbiAgICAgIGZhbHNlLFxuICAgICAgb3B0cy5tYXhQYXlsb2FkXG4gICAgKTtcbiAgICBvcHRzLmhlYWRlcnNbJ1NlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyddID0gZm9ybWF0KHtcbiAgICAgIFtQZXJNZXNzYWdlRGVmbGF0ZSQxLmV4dGVuc2lvbk5hbWVdOiBwZXJNZXNzYWdlRGVmbGF0ZS5vZmZlcigpXG4gICAgfSk7XG4gIH1cbiAgaWYgKHByb3RvY29scy5sZW5ndGgpIHtcbiAgICBmb3IgKGNvbnN0IHByb3RvY29sIG9mIHByb3RvY29scykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgcHJvdG9jb2wgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgICFzdWJwcm90b2NvbFJlZ2V4LnRlc3QocHJvdG9jb2wpIHx8XG4gICAgICAgIHByb3RvY29sU2V0Lmhhcyhwcm90b2NvbClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXG4gICAgICAgICAgJ0FuIGludmFsaWQgb3IgZHVwbGljYXRlZCBzdWJwcm90b2NvbCB3YXMgc3BlY2lmaWVkJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwcm90b2NvbFNldC5hZGQocHJvdG9jb2wpO1xuICAgIH1cblxuICAgIG9wdHMuaGVhZGVyc1snU2VjLVdlYlNvY2tldC1Qcm90b2NvbCddID0gcHJvdG9jb2xzLmpvaW4oJywnKTtcbiAgfVxuICBpZiAob3B0cy5vcmlnaW4pIHtcbiAgICBpZiAob3B0cy5wcm90b2NvbFZlcnNpb24gPCAxMykge1xuICAgICAgb3B0cy5oZWFkZXJzWydTZWMtV2ViU29ja2V0LU9yaWdpbiddID0gb3B0cy5vcmlnaW47XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdHMuaGVhZGVycy5PcmlnaW4gPSBvcHRzLm9yaWdpbjtcbiAgICB9XG4gIH1cbiAgaWYgKHBhcnNlZFVybC51c2VybmFtZSB8fCBwYXJzZWRVcmwucGFzc3dvcmQpIHtcbiAgICBvcHRzLmF1dGggPSBgJHtwYXJzZWRVcmwudXNlcm5hbWV9OiR7cGFyc2VkVXJsLnBhc3N3b3JkfWA7XG4gIH1cblxuICBpZiAoaXNJcGNVcmwpIHtcbiAgICBjb25zdCBwYXJ0cyA9IG9wdHMucGF0aC5zcGxpdCgnOicpO1xuXG4gICAgb3B0cy5zb2NrZXRQYXRoID0gcGFydHNbMF07XG4gICAgb3B0cy5wYXRoID0gcGFydHNbMV07XG4gIH1cblxuICBsZXQgcmVxO1xuXG4gIGlmIChvcHRzLmZvbGxvd1JlZGlyZWN0cykge1xuICAgIGlmICh3ZWJzb2NrZXQuX3JlZGlyZWN0cyA9PT0gMCkge1xuICAgICAgd2Vic29ja2V0Ll9vcmlnaW5hbElwYyA9IGlzSXBjVXJsO1xuICAgICAgd2Vic29ja2V0Ll9vcmlnaW5hbFNlY3VyZSA9IGlzU2VjdXJlO1xuICAgICAgd2Vic29ja2V0Ll9vcmlnaW5hbEhvc3RPclNvY2tldFBhdGggPSBpc0lwY1VybFxuICAgICAgICA/IG9wdHMuc29ja2V0UGF0aFxuICAgICAgICA6IHBhcnNlZFVybC5ob3N0O1xuXG4gICAgICBjb25zdCBoZWFkZXJzID0gb3B0aW9ucyAmJiBvcHRpb25zLmhlYWRlcnM7XG5cbiAgICAgIC8vXG4gICAgICAvLyBTaGFsbG93IGNvcHkgdGhlIHVzZXIgcHJvdmlkZWQgb3B0aW9ucyBzbyB0aGF0IGhlYWRlcnMgY2FuIGJlIGNoYW5nZWRcbiAgICAgIC8vIHdpdGhvdXQgbXV0YXRpbmcgdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICAgIC8vXG4gICAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCBoZWFkZXJzOiB7fSB9O1xuXG4gICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAod2Vic29ja2V0Lmxpc3RlbmVyQ291bnQoJ3JlZGlyZWN0JykgPT09IDApIHtcbiAgICAgIGNvbnN0IGlzU2FtZUhvc3QgPSBpc0lwY1VybFxuICAgICAgICA/IHdlYnNvY2tldC5fb3JpZ2luYWxJcGNcbiAgICAgICAgICA/IG9wdHMuc29ja2V0UGF0aCA9PT0gd2Vic29ja2V0Ll9vcmlnaW5hbEhvc3RPclNvY2tldFBhdGhcbiAgICAgICAgICA6IGZhbHNlXG4gICAgICAgIDogd2Vic29ja2V0Ll9vcmlnaW5hbElwY1xuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogcGFyc2VkVXJsLmhvc3QgPT09IHdlYnNvY2tldC5fb3JpZ2luYWxIb3N0T3JTb2NrZXRQYXRoO1xuXG4gICAgICBpZiAoIWlzU2FtZUhvc3QgfHwgKHdlYnNvY2tldC5fb3JpZ2luYWxTZWN1cmUgJiYgIWlzU2VjdXJlKSkge1xuICAgICAgICAvL1xuICAgICAgICAvLyBNYXRjaCBjdXJsIDcuNzcuMCBiZWhhdmlvciBhbmQgZHJvcCB0aGUgZm9sbG93aW5nIGhlYWRlcnMuIFRoZXNlXG4gICAgICAgIC8vIGhlYWRlcnMgYXJlIGFsc28gZHJvcHBlZCB3aGVuIGZvbGxvd2luZyBhIHJlZGlyZWN0IHRvIGEgc3ViZG9tYWluLlxuICAgICAgICAvL1xuICAgICAgICBkZWxldGUgb3B0cy5oZWFkZXJzLmF1dGhvcml6YXRpb247XG4gICAgICAgIGRlbGV0ZSBvcHRzLmhlYWRlcnMuY29va2llO1xuXG4gICAgICAgIGlmICghaXNTYW1lSG9zdCkgZGVsZXRlIG9wdHMuaGVhZGVycy5ob3N0O1xuXG4gICAgICAgIG9wdHMuYXV0aCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIE1hdGNoIGN1cmwgNy43Ny4wIGJlaGF2aW9yIGFuZCBtYWtlIHRoZSBmaXJzdCBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIHdpbi5cbiAgICAvLyBJZiB0aGUgYEF1dGhvcml6YXRpb25gIGhlYWRlciBpcyBzZXQsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkbyBhcyBpdFxuICAgIC8vIHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICAgIC8vXG4gICAgaWYgKG9wdHMuYXV0aCAmJiAhb3B0aW9ucy5oZWFkZXJzLmF1dGhvcml6YXRpb24pIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5hdXRob3JpemF0aW9uID1cbiAgICAgICAgJ0Jhc2ljICcgKyBCdWZmZXIuZnJvbShvcHRzLmF1dGgpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICByZXEgPSB3ZWJzb2NrZXQuX3JlcSA9IHJlcXVlc3Qob3B0cyk7XG5cbiAgICBpZiAod2Vic29ja2V0Ll9yZWRpcmVjdHMpIHtcbiAgICAgIC8vXG4gICAgICAvLyBVbmxpa2Ugd2hhdCBpcyBkb25lIGZvciB0aGUgYCd1cGdyYWRlJ2AgZXZlbnQsIG5vIGVhcmx5IGV4aXQgaXNcbiAgICAgIC8vIHRyaWdnZXJlZCBoZXJlIGlmIHRoZSB1c2VyIGNhbGxzIGB3ZWJzb2NrZXQuY2xvc2UoKWAgb3JcbiAgICAgIC8vIGB3ZWJzb2NrZXQudGVybWluYXRlKClgIGZyb20gYSBsaXN0ZW5lciBvZiB0aGUgYCdyZWRpcmVjdCdgIGV2ZW50LiBUaGlzXG4gICAgICAvLyBpcyBiZWNhdXNlIHRoZSB1c2VyIGNhbiBhbHNvIGNhbGwgYHJlcXVlc3QuZGVzdHJveSgpYCB3aXRoIGFuIGVycm9yXG4gICAgICAvLyBiZWZvcmUgY2FsbGluZyBgd2Vic29ja2V0LmNsb3NlKClgIG9yIGB3ZWJzb2NrZXQudGVybWluYXRlKClgIGFuZCB0aGlzXG4gICAgICAvLyB3b3VsZCByZXN1bHQgaW4gYW4gZXJyb3IgYmVpbmcgZW1pdHRlZCBvbiB0aGUgYHJlcXVlc3RgIG9iamVjdCB3aXRoIG5vXG4gICAgICAvLyBgJ2Vycm9yJ2AgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkLlxuICAgICAgLy9cbiAgICAgIHdlYnNvY2tldC5lbWl0KCdyZWRpcmVjdCcsIHdlYnNvY2tldC51cmwsIHJlcSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlcSA9IHdlYnNvY2tldC5fcmVxID0gcmVxdWVzdChvcHRzKTtcbiAgfVxuXG4gIGlmIChvcHRzLnRpbWVvdXQpIHtcbiAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSQxKHdlYnNvY2tldCwgcmVxLCAnT3BlbmluZyBoYW5kc2hha2UgaGFzIHRpbWVkIG91dCcpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVxLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICBpZiAocmVxID09PSBudWxsIHx8IHJlcVtrQWJvcnRlZF0pIHJldHVybjtcblxuICAgIHJlcSA9IHdlYnNvY2tldC5fcmVxID0gbnVsbDtcbiAgICBlbWl0RXJyb3JBbmRDbG9zZSh3ZWJzb2NrZXQsIGVycik7XG4gIH0pO1xuXG4gIHJlcS5vbigncmVzcG9uc2UnLCAocmVzKSA9PiB7XG4gICAgY29uc3QgbG9jYXRpb24gPSByZXMuaGVhZGVycy5sb2NhdGlvbjtcbiAgICBjb25zdCBzdGF0dXNDb2RlID0gcmVzLnN0YXR1c0NvZGU7XG5cbiAgICBpZiAoXG4gICAgICBsb2NhdGlvbiAmJlxuICAgICAgb3B0cy5mb2xsb3dSZWRpcmVjdHMgJiZcbiAgICAgIHN0YXR1c0NvZGUgPj0gMzAwICYmXG4gICAgICBzdGF0dXNDb2RlIDwgNDAwXG4gICAgKSB7XG4gICAgICBpZiAoKyt3ZWJzb2NrZXQuX3JlZGlyZWN0cyA+IG9wdHMubWF4UmVkaXJlY3RzKSB7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlJDEod2Vic29ja2V0LCByZXEsICdNYXhpbXVtIHJlZGlyZWN0cyBleGNlZWRlZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlcS5hYm9ydCgpO1xuXG4gICAgICBsZXQgYWRkcjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYWRkciA9IG5ldyBVUkwkMihsb2NhdGlvbiwgYWRkcmVzcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBVUkw6ICR7bG9jYXRpb259YCk7XG4gICAgICAgIGVtaXRFcnJvckFuZENsb3NlKHdlYnNvY2tldCwgZXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpbml0QXNDbGllbnQod2Vic29ja2V0LCBhZGRyLCBwcm90b2NvbHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXdlYnNvY2tldC5lbWl0KCd1bmV4cGVjdGVkLXJlc3BvbnNlJywgcmVxLCByZXMpKSB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSQxKFxuICAgICAgICB3ZWJzb2NrZXQsXG4gICAgICAgIHJlcSxcbiAgICAgICAgYFVuZXhwZWN0ZWQgc2VydmVyIHJlc3BvbnNlOiAke3Jlcy5zdGF0dXNDb2RlfWBcbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICByZXEub24oJ3VwZ3JhZGUnLCAocmVzLCBzb2NrZXQsIGhlYWQpID0+IHtcbiAgICB3ZWJzb2NrZXQuZW1pdCgndXBncmFkZScsIHJlcyk7XG5cbiAgICAvL1xuICAgIC8vIFRoZSB1c2VyIG1heSBoYXZlIGNsb3NlZCB0aGUgY29ubmVjdGlvbiBmcm9tIGEgbGlzdGVuZXIgb2YgdGhlXG4gICAgLy8gYCd1cGdyYWRlJ2AgZXZlbnQuXG4gICAgLy9cbiAgICBpZiAod2Vic29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldCQxLkNPTk5FQ1RJTkcpIHJldHVybjtcblxuICAgIHJlcSA9IHdlYnNvY2tldC5fcmVxID0gbnVsbDtcblxuICAgIGlmIChyZXMuaGVhZGVycy51cGdyYWRlLnRvTG93ZXJDYXNlKCkgIT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSQxKHdlYnNvY2tldCwgc29ja2V0LCAnSW52YWxpZCBVcGdyYWRlIGhlYWRlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2gkMSgnc2hhMScpXG4gICAgICAudXBkYXRlKGtleSArIEdVSUQkMSlcbiAgICAgIC5kaWdlc3QoJ2Jhc2U2NCcpO1xuXG4gICAgaWYgKHJlcy5oZWFkZXJzWydzZWMtd2Vic29ja2V0LWFjY2VwdCddICE9PSBkaWdlc3QpIHtcbiAgICAgIGFib3J0SGFuZHNoYWtlJDEod2Vic29ja2V0LCBzb2NrZXQsICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtQWNjZXB0IGhlYWRlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZlclByb3QgPSByZXMuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1wcm90b2NvbCddO1xuICAgIGxldCBwcm90RXJyb3I7XG5cbiAgICBpZiAoc2VydmVyUHJvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXByb3RvY29sU2V0LnNpemUpIHtcbiAgICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IGEgc3VicHJvdG9jb2wgYnV0IG5vbmUgd2FzIHJlcXVlc3RlZCc7XG4gICAgICB9IGVsc2UgaWYgKCFwcm90b2NvbFNldC5oYXMoc2VydmVyUHJvdCkpIHtcbiAgICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IGFuIGludmFsaWQgc3VicHJvdG9jb2wnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvdG9jb2xTZXQuc2l6ZSkge1xuICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IG5vIHN1YnByb3RvY29sJztcbiAgICB9XG5cbiAgICBpZiAocHJvdEVycm9yKSB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSQxKHdlYnNvY2tldCwgc29ja2V0LCBwcm90RXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXJ2ZXJQcm90KSB3ZWJzb2NrZXQuX3Byb3RvY29sID0gc2VydmVyUHJvdDtcblxuICAgIGNvbnN0IHNlY1dlYlNvY2tldEV4dGVuc2lvbnMgPSByZXMuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1leHRlbnNpb25zJ107XG5cbiAgICBpZiAoc2VjV2ViU29ja2V0RXh0ZW5zaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXBlck1lc3NhZ2VEZWZsYXRlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICAgICdTZXJ2ZXIgc2VudCBhIFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyBoZWFkZXIgYnV0IG5vIGV4dGVuc2lvbiAnICtcbiAgICAgICAgICAnd2FzIHJlcXVlc3RlZCc7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlJDEod2Vic29ja2V0LCBzb2NrZXQsIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBleHRlbnNpb25zO1xuXG4gICAgICB0cnkge1xuICAgICAgICBleHRlbnNpb25zID0gcGFyc2UkMyhzZWNXZWJTb2NrZXRFeHRlbnNpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIGhlYWRlcic7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlJDEod2Vic29ja2V0LCBzb2NrZXQsIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbk5hbWVzID0gT2JqZWN0LmtleXMoZXh0ZW5zaW9ucyk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZXh0ZW5zaW9uTmFtZXMubGVuZ3RoICE9PSAxIHx8XG4gICAgICAgIGV4dGVuc2lvbk5hbWVzWzBdICE9PSBQZXJNZXNzYWdlRGVmbGF0ZSQxLmV4dGVuc2lvbk5hbWVcbiAgICAgICkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ1NlcnZlciBpbmRpY2F0ZWQgYW4gZXh0ZW5zaW9uIHRoYXQgd2FzIG5vdCByZXF1ZXN0ZWQnO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSQxKHdlYnNvY2tldCwgc29ja2V0LCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBwZXJNZXNzYWdlRGVmbGF0ZS5hY2NlcHQoZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZSQxLmV4dGVuc2lvbk5hbWVdKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIGhlYWRlcic7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlJDEod2Vic29ja2V0LCBzb2NrZXQsIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdlYnNvY2tldC5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZSQxLmV4dGVuc2lvbk5hbWVdID1cbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU7XG4gICAgfVxuXG4gICAgd2Vic29ja2V0LnNldFNvY2tldChzb2NrZXQsIGhlYWQsIHtcbiAgICAgIGdlbmVyYXRlTWFzazogb3B0cy5nZW5lcmF0ZU1hc2ssXG4gICAgICBtYXhQYXlsb2FkOiBvcHRzLm1heFBheWxvYWQsXG4gICAgICBza2lwVVRGOFZhbGlkYXRpb246IG9wdHMuc2tpcFVURjhWYWxpZGF0aW9uXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJlcS5lbmQoKTtcbn1cblxuLyoqXG4gKiBFbWl0IHRoZSBgJ2Vycm9yJ2AgYW5kIGAnY2xvc2UnYCBldmVudHMuXG4gKlxuICogQHBhcmFtIHtXZWJTb2NrZXR9IHdlYnNvY2tldCBUaGUgV2ViU29ja2V0IGluc3RhbmNlXG4gKiBAcGFyYW0ge0Vycm9yfSBUaGUgZXJyb3IgdG8gZW1pdFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZW1pdEVycm9yQW5kQ2xvc2Uod2Vic29ja2V0LCBlcnIpIHtcbiAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0JDEuQ0xPU0lORztcbiAgd2Vic29ja2V0LmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgd2Vic29ja2V0LmVtaXRDbG9zZSgpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGBuZXQuU29ja2V0YCBhbmQgaW5pdGlhdGUgYSBjb25uZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENvbm5lY3Rpb24gb3B0aW9uc1xuICogQHJldHVybiB7bmV0LlNvY2tldH0gVGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0IHVzZWQgdG8gc3RhcnQgdGhlIGNvbm5lY3Rpb25cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG5ldENvbm5lY3Qob3B0aW9ucykge1xuICBvcHRpb25zLnBhdGggPSBvcHRpb25zLnNvY2tldFBhdGg7XG4gIHJldHVybiBuZXQuY29ubmVjdChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgdGxzLlRMU1NvY2tldGAgYW5kIGluaXRpYXRlIGEgY29ubmVjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBDb25uZWN0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm4ge3Rscy5UTFNTb2NrZXR9IFRoZSBuZXdseSBjcmVhdGVkIHNvY2tldCB1c2VkIHRvIHN0YXJ0IHRoZSBjb25uZWN0aW9uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0bHNDb25uZWN0KG9wdGlvbnMpIHtcbiAgb3B0aW9ucy5wYXRoID0gdW5kZWZpbmVkO1xuXG4gIGlmICghb3B0aW9ucy5zZXJ2ZXJuYW1lICYmIG9wdGlvbnMuc2VydmVybmFtZSAhPT0gJycpIHtcbiAgICBvcHRpb25zLnNlcnZlcm5hbWUgPSBuZXQuaXNJUChvcHRpb25zLmhvc3QpID8gJycgOiBvcHRpb25zLmhvc3Q7XG4gIH1cblxuICByZXR1cm4gdGxzLmNvbm5lY3Qob3B0aW9ucyk7XG59XG5cbi8qKlxuICogQWJvcnQgdGhlIGhhbmRzaGFrZSBhbmQgZW1pdCBhbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7KGh0dHAuQ2xpZW50UmVxdWVzdHxuZXQuU29ja2V0fHRscy5Tb2NrZXQpfSBzdHJlYW0gVGhlIHJlcXVlc3QgdG9cbiAqICAgICBhYm9ydCBvciB0aGUgc29ja2V0IHRvIGRlc3Ryb3lcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZSQxKHdlYnNvY2tldCwgc3RyZWFtLCBtZXNzYWdlKSB7XG4gIHdlYnNvY2tldC5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldCQxLkNMT1NJTkc7XG5cbiAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIGFib3J0SGFuZHNoYWtlJDEpO1xuXG4gIGlmIChzdHJlYW0uc2V0SGVhZGVyKSB7XG4gICAgc3RyZWFtW2tBYm9ydGVkXSA9IHRydWU7XG4gICAgc3RyZWFtLmFib3J0KCk7XG5cbiAgICBpZiAoc3RyZWFtLnNvY2tldCAmJiAhc3RyZWFtLnNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIC8vXG4gICAgICAvLyBPbiBOb2RlLmpzID49IDE0LjMuMCBgcmVxdWVzdC5hYm9ydCgpYCBkb2VzIG5vdCBkZXN0cm95IHRoZSBzb2NrZXQgaWZcbiAgICAgIC8vIGNhbGxlZCBhZnRlciB0aGUgcmVxdWVzdCBjb21wbGV0ZWQuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvaXNzdWVzLzE4NjkuXG4gICAgICAvL1xuICAgICAgc3RyZWFtLnNvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JBbmRDbG9zZSwgd2Vic29ja2V0LCBlcnIpO1xuICB9IGVsc2Uge1xuICAgIHN0cmVhbS5kZXN0cm95KGVycik7XG4gICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgd2Vic29ja2V0LmVtaXQuYmluZCh3ZWJzb2NrZXQsICdlcnJvcicpKTtcbiAgICBzdHJlYW0ub25jZSgnY2xvc2UnLCB3ZWJzb2NrZXQuZW1pdENsb3NlLmJpbmQod2Vic29ja2V0KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIGBwaW5nKClgLCBgcG9uZygpYCwgb3IgYHNlbmQoKWAgbWV0aG9kcyBhcmUgY2FsbGVkXG4gKiB3aGVuIHRoZSBgcmVhZHlTdGF0ZWAgYXR0cmlidXRlIGlzIGBDTE9TSU5HYCBvciBgQ0xPU0VEYC5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Kn0gW2RhdGFdIFRoZSBkYXRhIHRvIHNlbmRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNlbmRBZnRlckNsb3NlKHdlYnNvY2tldCwgZGF0YSwgY2IpIHtcbiAgaWYgKGRhdGEpIHtcbiAgICBjb25zdCBsZW5ndGggPSB0b0J1ZmZlcihkYXRhKS5sZW5ndGg7XG5cbiAgICAvL1xuICAgIC8vIFRoZSBgX2J1ZmZlcmVkQW1vdW50YCBwcm9wZXJ0eSBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgcGVlciBpcyBhIGNsaWVudCBhbmRcbiAgICAvLyB0aGUgb3BlbmluZyBoYW5kc2hha2UgZmFpbHMuIFVuZGVyIHRoZXNlIGNpcmN1bXN0YW5jZXMsIGluIGZhY3QsIHRoZVxuICAgIC8vIGBzZXRTb2NrZXQoKWAgbWV0aG9kIGlzIG5vdCBjYWxsZWQsIHNvIHRoZSBgX3NvY2tldGAgYW5kIGBfc2VuZGVyYFxuICAgIC8vIHByb3BlcnRpZXMgYXJlIHNldCB0byBgbnVsbGAuXG4gICAgLy9cbiAgICBpZiAod2Vic29ja2V0Ll9zb2NrZXQpIHdlYnNvY2tldC5fc2VuZGVyLl9idWZmZXJlZEJ5dGVzICs9IGxlbmd0aDtcbiAgICBlbHNlIHdlYnNvY2tldC5fYnVmZmVyZWRBbW91bnQgKz0gbGVuZ3RoO1xuICB9XG5cbiAgaWYgKGNiKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgYFdlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAke3dlYnNvY2tldC5yZWFkeVN0YXRlfSBgICtcbiAgICAgICAgYCgke3JlYWR5U3RhdGVzW3dlYnNvY2tldC5yZWFkeVN0YXRlXX0pYFxuICAgICk7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ2NvbmNsdWRlJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGUgVGhlIHN0YXR1cyBjb2RlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gcmVhc29uIFRoZSByZWFzb24gZm9yIGNsb3NpbmdcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25Db25jbHVkZShjb2RlLCByZWFzb24pIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0JDFdO1xuXG4gIHdlYnNvY2tldC5fY2xvc2VGcmFtZVJlY2VpdmVkID0gdHJ1ZTtcbiAgd2Vic29ja2V0Ll9jbG9zZU1lc3NhZ2UgPSByZWFzb247XG4gIHdlYnNvY2tldC5fY2xvc2VDb2RlID0gY29kZTtcblxuICBpZiAod2Vic29ja2V0Ll9zb2NrZXRba1dlYlNvY2tldCQxXSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgd2Vic29ja2V0Ll9zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBzb2NrZXRPbkRhdGEpO1xuICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZSwgd2Vic29ja2V0Ll9zb2NrZXQpO1xuXG4gIGlmIChjb2RlID09PSAxMDA1KSB3ZWJzb2NrZXQuY2xvc2UoKTtcbiAgZWxzZSB3ZWJzb2NrZXQuY2xvc2UoY29kZSwgcmVhc29uKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdkcmFpbidgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25EcmFpbigpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0JDFdO1xuXG4gIGlmICghd2Vic29ja2V0LmlzUGF1c2VkKSB3ZWJzb2NrZXQuX3NvY2tldC5yZXN1bWUoKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFJhbmdlRXJyb3J8RXJyb3IpfSBlcnIgVGhlIGVtaXR0ZWQgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25FcnJvcihlcnIpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0JDFdO1xuXG4gIGlmICh3ZWJzb2NrZXQuX3NvY2tldFtrV2ViU29ja2V0JDFdICE9PSB1bmRlZmluZWQpIHtcbiAgICB3ZWJzb2NrZXQuX3NvY2tldC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHNvY2tldE9uRGF0YSk7XG5cbiAgICAvL1xuICAgIC8vIE9uIE5vZGUuanMgPCAxNC4wLjAgdGhlIGAnZXJyb3InYCBldmVudCBpcyBlbWl0dGVkIHN5bmNocm9ub3VzbHkuIFNlZVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzL2lzc3Vlcy8xOTQwLlxuICAgIC8vXG4gICAgcHJvY2Vzcy5uZXh0VGljayhyZXN1bWUsIHdlYnNvY2tldC5fc29ja2V0KTtcblxuICAgIHdlYnNvY2tldC5jbG9zZShlcnJba1N0YXR1c0NvZGVdKTtcbiAgfVxuXG4gIHdlYnNvY2tldC5lbWl0KCdlcnJvcicsIGVycik7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgUmVjZWl2ZXJgIGAnZmluaXNoJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZXJPbkZpbmlzaCgpIHtcbiAgdGhpc1trV2ViU29ja2V0JDFdLmVtaXRDbG9zZSgpO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ21lc3NhZ2UnYCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcnxBcnJheUJ1ZmZlcnxCdWZmZXJbXSl9IGRhdGEgVGhlIG1lc3NhZ2VcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCaW5hcnkgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgYmluYXJ5IG9yIG5vdFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZXJPbk1lc3NhZ2UoZGF0YSwgaXNCaW5hcnkpIHtcbiAgdGhpc1trV2ViU29ja2V0JDFdLmVtaXQoJ21lc3NhZ2UnLCBkYXRhLCBpc0JpbmFyeSk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgUmVjZWl2ZXJgIGAncGluZydgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIFRoZSBkYXRhIGluY2x1ZGVkIGluIHRoZSBwaW5nIGZyYW1lXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZWNlaXZlck9uUGluZyhkYXRhKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldCQxXTtcblxuICB3ZWJzb2NrZXQucG9uZyhkYXRhLCAhd2Vic29ja2V0Ll9pc1NlcnZlciwgTk9PUCk7XG4gIHdlYnNvY2tldC5lbWl0KCdwaW5nJywgZGF0YSk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgUmVjZWl2ZXJgIGAncG9uZydgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIFRoZSBkYXRhIGluY2x1ZGVkIGluIHRoZSBwb25nIGZyYW1lXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZWNlaXZlck9uUG9uZyhkYXRhKSB7XG4gIHRoaXNba1dlYlNvY2tldCQxXS5lbWl0KCdwb25nJywgZGF0YSk7XG59XG5cbi8qKlxuICogUmVzdW1lIGEgcmVhZGFibGUgc3RyZWFtXG4gKlxuICogQHBhcmFtIHtSZWFkYWJsZX0gc3RyZWFtIFRoZSByZWFkYWJsZSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0pIHtcbiAgc3RyZWFtLnJlc3VtZSgpO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYG5ldC5Tb2NrZXRgIGAnY2xvc2UnYCBldmVudC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzb2NrZXRPbkNsb3NlKCkge1xuICBjb25zdCB3ZWJzb2NrZXQgPSB0aGlzW2tXZWJTb2NrZXQkMV07XG5cbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBzb2NrZXRPbkNsb3NlKTtcbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHNvY2tldE9uRW5kKTtcblxuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQkMS5DTE9TSU5HO1xuXG4gIGxldCBjaHVuaztcblxuICAvL1xuICAvLyBUaGUgY2xvc2UgZnJhbWUgbWlnaHQgbm90IGhhdmUgYmVlbiByZWNlaXZlZCBvciB0aGUgYCdlbmQnYCBldmVudCBlbWl0dGVkLFxuICAvLyBmb3IgZXhhbXBsZSwgaWYgdGhlIHNvY2tldCB3YXMgZGVzdHJveWVkIGR1ZSB0byBhbiBlcnJvci4gRW5zdXJlIHRoYXQgdGhlXG4gIC8vIGByZWNlaXZlcmAgc3RyZWFtIGlzIGNsb3NlZCBhZnRlciB3cml0aW5nIGFueSByZW1haW5pbmcgYnVmZmVyZWQgZGF0YSB0b1xuICAvLyBpdC4gSWYgdGhlIHJlYWRhYmxlIHNpZGUgb2YgdGhlIHNvY2tldCBpcyBpbiBmbG93aW5nIG1vZGUgdGhlbiB0aGVyZSBpcyBub1xuICAvLyBidWZmZXJlZCBkYXRhIGFzIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gYWxyZWFkeSB3cml0dGVuIGFuZCBgcmVhZGFibGUucmVhZCgpYFxuICAvLyB3aWxsIHJldHVybiBgbnVsbGAuIElmIGluc3RlYWQsIHRoZSBzb2NrZXQgaXMgcGF1c2VkLCBhbnkgcG9zc2libGUgYnVmZmVyZWRcbiAgLy8gZGF0YSB3aWxsIGJlIHJlYWQgYXMgYSBzaW5nbGUgY2h1bmsuXG4gIC8vXG4gIGlmIChcbiAgICAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkICYmXG4gICAgIXdlYnNvY2tldC5fY2xvc2VGcmFtZVJlY2VpdmVkICYmXG4gICAgIXdlYnNvY2tldC5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkICYmXG4gICAgKGNodW5rID0gd2Vic29ja2V0Ll9zb2NrZXQucmVhZCgpKSAhPT0gbnVsbFxuICApIHtcbiAgICB3ZWJzb2NrZXQuX3JlY2VpdmVyLndyaXRlKGNodW5rKTtcbiAgfVxuXG4gIHdlYnNvY2tldC5fcmVjZWl2ZXIuZW5kKCk7XG5cbiAgdGhpc1trV2ViU29ja2V0JDFdID0gdW5kZWZpbmVkO1xuXG4gIGNsZWFyVGltZW91dCh3ZWJzb2NrZXQuX2Nsb3NlVGltZXIpO1xuXG4gIGlmIChcbiAgICB3ZWJzb2NrZXQuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkIHx8XG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWRcbiAgKSB7XG4gICAgd2Vic29ja2V0LmVtaXRDbG9zZSgpO1xuICB9IGVsc2Uge1xuICAgIHdlYnNvY2tldC5fcmVjZWl2ZXIub24oJ2Vycm9yJywgcmVjZWl2ZXJPbkZpbmlzaCk7XG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci5vbignZmluaXNoJywgcmVjZWl2ZXJPbkZpbmlzaCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBuZXQuU29ja2V0YCBgJ2RhdGEnYCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgQSBjaHVuayBvZiBkYXRhXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzb2NrZXRPbkRhdGEoY2h1bmspIHtcbiAgaWYgKCF0aGlzW2tXZWJTb2NrZXQkMV0uX3JlY2VpdmVyLndyaXRlKGNodW5rKSkge1xuICAgIHRoaXMucGF1c2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYG5ldC5Tb2NrZXRgIGAnZW5kJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc29ja2V0T25FbmQoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldCQxXTtcblxuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQkMS5DTE9TSU5HO1xuICB3ZWJzb2NrZXQuX3JlY2VpdmVyLmVuZCgpO1xuICB0aGlzLmVuZCgpO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYG5ldC5Tb2NrZXRgIGAnZXJyb3InYCBldmVudC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzb2NrZXRPbkVycm9yJDEoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldCQxXTtcblxuICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIHNvY2tldE9uRXJyb3IkMSk7XG4gIHRoaXMub24oJ2Vycm9yJywgTk9PUCk7XG5cbiAgaWYgKHdlYnNvY2tldCkge1xuICAgIHdlYnNvY2tldC5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldCQxLkNMT1NJTkc7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cbn1cblxuY29uc3QgeyB0b2tlbkNoYXJzIH0gPSB2YWxpZGF0aW9uRXhwb3J0cztcblxuLyoqXG4gKiBQYXJzZXMgdGhlIGBTZWMtV2ViU29ja2V0LVByb3RvY29sYCBoZWFkZXIgaW50byBhIHNldCBvZiBzdWJwcm90b2NvbCBuYW1lcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyIFRoZSBmaWVsZCB2YWx1ZSBvZiB0aGUgaGVhZGVyXG4gKiBAcmV0dXJuIHtTZXR9IFRoZSBzdWJwcm90b2NvbCBuYW1lc1xuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBwYXJzZSQyKGhlYWRlcikge1xuICBjb25zdCBwcm90b2NvbHMgPSBuZXcgU2V0KCk7XG4gIGxldCBzdGFydCA9IC0xO1xuICBsZXQgZW5kID0gLTE7XG4gIGxldCBpID0gMDtcblxuICBmb3IgKGk7IGkgPCBoZWFkZXIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlID0gaGVhZGVyLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBpZiAoZW5kID09PSAtMSAmJiB0b2tlbkNoYXJzW2NvZGVdID09PSAxKSB7XG4gICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGkgIT09IDAgJiZcbiAgICAgIChjb2RlID09PSAweDIwIC8qICcgJyAqLyB8fCBjb2RlID09PSAweDA5KSAvKiAnXFx0JyAqL1xuICAgICkge1xuICAgICAgaWYgKGVuZCA9PT0gLTEgJiYgc3RhcnQgIT09IC0xKSBlbmQgPSBpO1xuICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyYyAvKiAnLCcgKi8pIHtcbiAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuXG4gICAgICBjb25zdCBwcm90b2NvbCA9IGhlYWRlci5zbGljZShzdGFydCwgZW5kKTtcblxuICAgICAgaWYgKHByb3RvY29scy5oYXMocHJvdG9jb2wpKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVGhlIFwiJHtwcm90b2NvbH1cIiBzdWJwcm90b2NvbCBpcyBkdXBsaWNhdGVkYCk7XG4gICAgICB9XG5cbiAgICAgIHByb3RvY29scy5hZGQocHJvdG9jb2wpO1xuICAgICAgc3RhcnQgPSBlbmQgPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgIT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCcpO1xuICB9XG5cbiAgY29uc3QgcHJvdG9jb2wgPSBoZWFkZXIuc2xpY2Uoc3RhcnQsIGkpO1xuXG4gIGlmIChwcm90b2NvbHMuaGFzKHByb3RvY29sKSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVGhlIFwiJHtwcm90b2NvbH1cIiBzdWJwcm90b2NvbCBpcyBkdXBsaWNhdGVkYCk7XG4gIH1cblxuICBwcm90b2NvbHMuYWRkKHByb3RvY29sKTtcbiAgcmV0dXJuIHByb3RvY29scztcbn1cblxudmFyIHN1YnByb3RvY29sJDEgPSB7IHBhcnNlOiBwYXJzZSQyIH07XG5cbi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXm5ldHx0bHN8aHR0cHMkXCIgfV0gKi9cblxuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSQkMCQ1O1xuY29uc3QgaHR0cCQyID0gcmVxdWlyZSQkMSQxO1xuY29uc3QgeyBjcmVhdGVIYXNoIH0gPSByZXF1aXJlJCQ1JDE7XG5cbmNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbiQxO1xuY29uc3QgUGVyTWVzc2FnZURlZmxhdGUgPSBwZXJtZXNzYWdlRGVmbGF0ZTtcbmNvbnN0IHN1YnByb3RvY29sID0gc3VicHJvdG9jb2wkMTtcbmNvbnN0IFdlYlNvY2tldCA9IHdlYnNvY2tldDtcbmNvbnN0IHsgR1VJRCwga1dlYlNvY2tldCB9ID0gY29uc3RhbnRzO1xuXG5jb25zdCBrZXlSZWdleCA9IC9eWysvMC05QS1aYS16XXsyMn09PSQvO1xuXG5jb25zdCBSVU5OSU5HID0gMDtcbmNvbnN0IENMT1NJTkcgPSAxO1xuY29uc3QgQ0xPU0VEID0gMjtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBXZWJTb2NrZXQgc2VydmVyLlxuICpcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5jbGFzcyBXZWJTb2NrZXRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgYFdlYlNvY2tldFNlcnZlcmAgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYmFja2xvZz01MTFdIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcXVldWUgb2ZcbiAgICogICAgIHBlbmRpbmcgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGllbnRUcmFja2luZz10cnVlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG9cbiAgICogICAgIHRyYWNrIGNsaWVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuaGFuZGxlUHJvdG9jb2xzXSBBIGhvb2sgdG8gaGFuZGxlIHByb3RvY29sc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaG9zdF0gVGhlIGhvc3RuYW1lIHdoZXJlIHRvIGJpbmQgdGhlIHNlcnZlclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0xMDQ4NTc2MDBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZVxuICAgKiAgICAgc2l6ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5vU2VydmVyPWZhbHNlXSBFbmFibGUgbm8gc2VydmVyIG1vZGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBhdGhdIEFjY2VwdCBvbmx5IGNvbm5lY3Rpb25zIG1hdGNoaW5nIHRoaXMgcGF0aFxuICAgKiBAcGFyYW0geyhCb29sZWFufE9iamVjdCl9IFtvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlPWZhbHNlXSBFbmFibGUvZGlzYWJsZVxuICAgKiAgICAgcGVybWVzc2FnZS1kZWZsYXRlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wb3J0XSBUaGUgcG9ydCB3aGVyZSB0byBiaW5kIHRoZSBzZXJ2ZXJcbiAgICogQHBhcmFtIHsoaHR0cC5TZXJ2ZXJ8aHR0cHMuU2VydmVyKX0gW29wdGlvbnMuc2VydmVyXSBBIHByZS1jcmVhdGVkIEhUVFAvU1xuICAgKiAgICAgc2VydmVyIHRvIHVzZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAgICogICAgIG5vdCB0byBza2lwIFVURi04IHZhbGlkYXRpb24gZm9yIHRleHQgYW5kIGNsb3NlIG1lc3NhZ2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZlcmlmeUNsaWVudF0gQSBob29rIHRvIHJlamVjdCBjb25uZWN0aW9uc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5XZWJTb2NrZXQ9V2ViU29ja2V0XSBTcGVjaWZpZXMgdGhlIGBXZWJTb2NrZXRgXG4gICAqICAgICBjbGFzcyB0byB1c2UuIEl0IG11c3QgYmUgdGhlIGBXZWJTb2NrZXRgIGNsYXNzIG9yIGNsYXNzIHRoYXQgZXh0ZW5kcyBpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIEEgbGlzdGVuZXIgZm9yIHRoZSBgbGlzdGVuaW5nYCBldmVudFxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBzdXBlcigpO1xuXG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIG1heFBheWxvYWQ6IDEwMCAqIDEwMjQgKiAxMDI0LFxuICAgICAgc2tpcFVURjhWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgIHBlck1lc3NhZ2VEZWZsYXRlOiBmYWxzZSxcbiAgICAgIGhhbmRsZVByb3RvY29sczogbnVsbCxcbiAgICAgIGNsaWVudFRyYWNraW5nOiB0cnVlLFxuICAgICAgdmVyaWZ5Q2xpZW50OiBudWxsLFxuICAgICAgbm9TZXJ2ZXI6IGZhbHNlLFxuICAgICAgYmFja2xvZzogbnVsbCwgLy8gdXNlIGRlZmF1bHQgKDUxMSBhcyBpbXBsZW1lbnRlZCBpbiBuZXQuanMpXG4gICAgICBzZXJ2ZXI6IG51bGwsXG4gICAgICBob3N0OiBudWxsLFxuICAgICAgcGF0aDogbnVsbCxcbiAgICAgIHBvcnQ6IG51bGwsXG4gICAgICBXZWJTb2NrZXQsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIGlmIChcbiAgICAgIChvcHRpb25zLnBvcnQgPT0gbnVsbCAmJiAhb3B0aW9ucy5zZXJ2ZXIgJiYgIW9wdGlvbnMubm9TZXJ2ZXIpIHx8XG4gICAgICAob3B0aW9ucy5wb3J0ICE9IG51bGwgJiYgKG9wdGlvbnMuc2VydmVyIHx8IG9wdGlvbnMubm9TZXJ2ZXIpKSB8fFxuICAgICAgKG9wdGlvbnMuc2VydmVyICYmIG9wdGlvbnMubm9TZXJ2ZXIpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgXCJwb3J0XCIsIFwic2VydmVyXCIsIG9yIFwibm9TZXJ2ZXJcIiBvcHRpb25zICcgK1xuICAgICAgICAgICdtdXN0IGJlIHNwZWNpZmllZCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucG9ydCAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9zZXJ2ZXIgPSBodHRwJDIuY3JlYXRlU2VydmVyKChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCBib2R5ID0gaHR0cCQyLlNUQVRVU19DT0RFU1s0MjZdO1xuXG4gICAgICAgIHJlcy53cml0ZUhlYWQoNDI2LCB7XG4gICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJzogYm9keS5sZW5ndGgsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzLmVuZChib2R5KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fc2VydmVyLmxpc3RlbihcbiAgICAgICAgb3B0aW9ucy5wb3J0LFxuICAgICAgICBvcHRpb25zLmhvc3QsXG4gICAgICAgIG9wdGlvbnMuYmFja2xvZyxcbiAgICAgICAgY2FsbGJhY2tcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLnNlcnZlcikge1xuICAgICAgdGhpcy5fc2VydmVyID0gb3B0aW9ucy5zZXJ2ZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NlcnZlcikge1xuICAgICAgY29uc3QgZW1pdENvbm5lY3Rpb24gPSB0aGlzLmVtaXQuYmluZCh0aGlzLCAnY29ubmVjdGlvbicpO1xuXG4gICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMgPSBhZGRMaXN0ZW5lcnModGhpcy5fc2VydmVyLCB7XG4gICAgICAgIGxpc3RlbmluZzogdGhpcy5lbWl0LmJpbmQodGhpcywgJ2xpc3RlbmluZycpLFxuICAgICAgICBlcnJvcjogdGhpcy5lbWl0LmJpbmQodGhpcywgJ2Vycm9yJyksXG4gICAgICAgIHVwZ3JhZGU6IChyZXEsIHNvY2tldCwgaGVhZCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlVXBncmFkZShyZXEsIHNvY2tldCwgaGVhZCwgZW1pdENvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZSA9PT0gdHJ1ZSkgb3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZSA9IHt9O1xuICAgIGlmIChvcHRpb25zLmNsaWVudFRyYWNraW5nKSB7XG4gICAgICB0aGlzLmNsaWVudHMgPSBuZXcgU2V0KCk7XG4gICAgICB0aGlzLl9zaG91bGRFbWl0Q2xvc2UgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuX3N0YXRlID0gUlVOTklORztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBib3VuZCBhZGRyZXNzLCB0aGUgYWRkcmVzcyBmYW1pbHkgbmFtZSwgYW5kIHBvcnQgb2YgdGhlIHNlcnZlclxuICAgKiBhcyByZXBvcnRlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpZiBsaXN0ZW5pbmcgb24gYW4gSVAgc29ja2V0LlxuICAgKiBJZiB0aGUgc2VydmVyIGlzIGxpc3RlbmluZyBvbiBhIHBpcGUgb3IgVU5JWCBkb21haW4gc29ja2V0LCB0aGUgbmFtZSBpc1xuICAgKiByZXR1cm5lZCBhcyBhIHN0cmluZy5cbiAgICpcbiAgICogQHJldHVybiB7KE9iamVjdHxTdHJpbmd8bnVsbCl9IFRoZSBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXJcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgYWRkcmVzcygpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm5vU2VydmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzZXJ2ZXIgaXMgb3BlcmF0aW5nIGluIFwibm9TZXJ2ZXJcIiBtb2RlJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zZXJ2ZXIpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXIuYWRkcmVzcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgdGhlIHNlcnZlciBmcm9tIGFjY2VwdGluZyBuZXcgY29ubmVjdGlvbnMgYW5kIGVtaXQgdGhlIGAnY2xvc2UnYCBldmVudFxuICAgKiB3aGVuIGFsbCBleGlzdGluZyBjb25uZWN0aW9ucyBhcmUgY2xvc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIEEgb25lLXRpbWUgbGlzdGVuZXIgZm9yIHRoZSBgJ2Nsb3NlJ2AgZXZlbnRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgY2xvc2UoY2IpIHtcbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IENMT1NFRCkge1xuICAgICAgaWYgKGNiKSB7XG4gICAgICAgIHRoaXMub25jZSgnY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgY2IobmV3IEVycm9yKCdUaGUgc2VydmVyIGlzIG5vdCBydW5uaW5nJykpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIHRoaXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjYikgdGhpcy5vbmNlKCdjbG9zZScsIGNiKTtcblxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gQ0xPU0lORykgcmV0dXJuO1xuICAgIHRoaXMuX3N0YXRlID0gQ0xPU0lORztcblxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9TZXJ2ZXIgfHwgdGhpcy5vcHRpb25zLnNlcnZlcikge1xuICAgICAgaWYgKHRoaXMuX3NlcnZlcikge1xuICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzID0gdGhpcy5fc2VydmVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2xpZW50cykge1xuICAgICAgICBpZiAoIXRoaXMuY2xpZW50cy5zaXplKSB7XG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3Nob3VsZEVtaXRDbG9zZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2VydmVyID0gdGhpcy5fc2VydmVyO1xuXG4gICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycyA9IHRoaXMuX3NlcnZlciA9IG51bGw7XG5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgSFRUUC9TIHNlcnZlciB3YXMgY3JlYXRlZCBpbnRlcm5hbGx5LiBDbG9zZSBpdCwgYW5kIHJlbHkgb24gaXRzXG4gICAgICAvLyBgJ2Nsb3NlJ2AgZXZlbnQuXG4gICAgICAvL1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgZW1pdENsb3NlKHRoaXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlZSBpZiBhIGdpdmVuIHJlcXVlc3Qgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhpcyBzZXJ2ZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBSZXF1ZXN0IG9iamVjdCB0byBpbnNwZWN0XG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcmVxdWVzdCBpcyB2YWxpZCwgZWxzZSBgZmFsc2VgXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHNob3VsZEhhbmRsZShyZXEpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnBhdGgpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVxLnVybC5pbmRleE9mKCc/Jyk7XG4gICAgICBjb25zdCBwYXRobmFtZSA9IGluZGV4ICE9PSAtMSA/IHJlcS51cmwuc2xpY2UoMCwgaW5kZXgpIDogcmVxLnVybDtcblxuICAgICAgaWYgKHBhdGhuYW1lICE9PSB0aGlzLm9wdGlvbnMucGF0aCkgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIEhUVFAgVXBncmFkZSByZXF1ZXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge2h0dHAuSW5jb21pbmdNZXNzYWdlfSByZXEgVGhlIHJlcXVlc3Qgb2JqZWN0XG4gICAqIEBwYXJhbSB7KG5ldC5Tb2NrZXR8dGxzLlNvY2tldCl9IHNvY2tldCBUaGUgbmV0d29yayBzb2NrZXQgYmV0d2VlbiB0aGVcbiAgICogICAgIHNlcnZlciBhbmQgY2xpZW50XG4gICAqIEBwYXJhbSB7QnVmZmVyfSBoZWFkIFRoZSBmaXJzdCBwYWNrZXQgb2YgdGhlIHVwZ3JhZGVkIHN0cmVhbVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBoYW5kbGVVcGdyYWRlKHJlcSwgc29ja2V0LCBoZWFkLCBjYikge1xuICAgIHNvY2tldC5vbignZXJyb3InLCBzb2NrZXRPbkVycm9yKTtcblxuICAgIGNvbnN0IGtleSA9IHJlcS5oZWFkZXJzWydzZWMtd2Vic29ja2V0LWtleSddO1xuICAgIGNvbnN0IHZlcnNpb24gPSArcmVxLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtdmVyc2lvbiddO1xuXG4gICAgaWYgKHJlcS5tZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgSFRUUCBtZXRob2QnO1xuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDUsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChyZXEuaGVhZGVycy51cGdyYWRlLnRvTG93ZXJDYXNlKCkgIT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgVXBncmFkZSBoZWFkZXInO1xuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgha2V5IHx8ICFrZXlSZWdleC50ZXN0KGtleSkpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnTWlzc2luZyBvciBpbnZhbGlkIFNlYy1XZWJTb2NrZXQtS2V5IGhlYWRlcic7XG4gICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwMCwgbWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24gIT09IDggJiYgdmVyc2lvbiAhPT0gMTMpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnTWlzc2luZyBvciBpbnZhbGlkIFNlYy1XZWJTb2NrZXQtVmVyc2lvbiBoZWFkZXInO1xuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zaG91bGRIYW5kbGUocmVxKSkge1xuICAgICAgYWJvcnRIYW5kc2hha2Uoc29ja2V0LCA0MDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlY1dlYlNvY2tldFByb3RvY29sID0gcmVxLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtcHJvdG9jb2wnXTtcbiAgICBsZXQgcHJvdG9jb2xzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHNlY1dlYlNvY2tldFByb3RvY29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByb3RvY29scyA9IHN1YnByb3RvY29sLnBhcnNlKHNlY1dlYlNvY2tldFByb3RvY29sKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1Qcm90b2NvbCBoZWFkZXInO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwMCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZWNXZWJTb2NrZXRFeHRlbnNpb25zID0gcmVxLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucyddO1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMub3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZSAmJlxuICAgICAgc2VjV2ViU29ja2V0RXh0ZW5zaW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCBwZXJNZXNzYWdlRGVmbGF0ZSA9IG5ldyBQZXJNZXNzYWdlRGVmbGF0ZShcbiAgICAgICAgdGhpcy5vcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlLFxuICAgICAgICB0cnVlLFxuICAgICAgICB0aGlzLm9wdGlvbnMubWF4UGF5bG9hZFxuICAgICAgKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb2ZmZXJzID0gZXh0ZW5zaW9uLnBhcnNlKHNlY1dlYlNvY2tldEV4dGVuc2lvbnMpO1xuXG4gICAgICAgIGlmIChvZmZlcnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgICAgICBwZXJNZXNzYWdlRGVmbGF0ZS5hY2NlcHQob2ZmZXJzW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdKTtcbiAgICAgICAgICBleHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdID0gcGVyTWVzc2FnZURlZmxhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICAnSW52YWxpZCBvciB1bmFjY2VwdGFibGUgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIGhlYWRlcic7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcih0aGlzLCByZXEsIHNvY2tldCwgNDAwLCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gT3B0aW9uYWxseSBjYWxsIGV4dGVybmFsIGNsaWVudCB2ZXJpZmljYXRpb24gaGFuZGxlci5cbiAgICAvL1xuICAgIGlmICh0aGlzLm9wdGlvbnMudmVyaWZ5Q2xpZW50KSB7XG4gICAgICBjb25zdCBpbmZvID0ge1xuICAgICAgICBvcmlnaW46XG4gICAgICAgICAgcmVxLmhlYWRlcnNbYCR7dmVyc2lvbiA9PT0gOCA/ICdzZWMtd2Vic29ja2V0LW9yaWdpbicgOiAnb3JpZ2luJ31gXSxcbiAgICAgICAgc2VjdXJlOiAhIShyZXEuc29ja2V0LmF1dGhvcml6ZWQgfHwgcmVxLnNvY2tldC5lbmNyeXB0ZWQpLFxuICAgICAgICByZXFcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudmVyaWZ5Q2xpZW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICB0aGlzLm9wdGlvbnMudmVyaWZ5Q2xpZW50KGluZm8sICh2ZXJpZmllZCwgY29kZSwgbWVzc2FnZSwgaGVhZGVycykgPT4ge1xuICAgICAgICAgIGlmICghdmVyaWZpZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhYm9ydEhhbmRzaGFrZShzb2NrZXQsIGNvZGUgfHwgNDAxLCBtZXNzYWdlLCBoZWFkZXJzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbXBsZXRlVXBncmFkZShcbiAgICAgICAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwcm90b2NvbHMsXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICBzb2NrZXQsXG4gICAgICAgICAgICBoZWFkLFxuICAgICAgICAgICAgY2JcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy52ZXJpZnlDbGllbnQoaW5mbykpIHJldHVybiBhYm9ydEhhbmRzaGFrZShzb2NrZXQsIDQwMSk7XG4gICAgfVxuXG4gICAgdGhpcy5jb21wbGV0ZVVwZ3JhZGUoZXh0ZW5zaW9ucywga2V5LCBwcm90b2NvbHMsIHJlcSwgc29ja2V0LCBoZWFkLCBjYik7XG4gIH1cblxuICAvKipcbiAgICogVXBncmFkZSB0aGUgY29ubmVjdGlvbiB0byBXZWJTb2NrZXQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBleHRlbnNpb25zIFRoZSBhY2NlcHRlZCBleHRlbnNpb25zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgVGhlIHZhbHVlIG9mIHRoZSBgU2VjLVdlYlNvY2tldC1LZXlgIGhlYWRlclxuICAgKiBAcGFyYW0ge1NldH0gcHJvdG9jb2xzIFRoZSBzdWJwcm90b2NvbHNcbiAgICogQHBhcmFtIHtodHRwLkluY29taW5nTWVzc2FnZX0gcmVxIFRoZSByZXF1ZXN0IG9iamVjdFxuICAgKiBAcGFyYW0geyhuZXQuU29ja2V0fHRscy5Tb2NrZXQpfSBzb2NrZXQgVGhlIG5ldHdvcmsgc29ja2V0IGJldHdlZW4gdGhlXG4gICAqICAgICBzZXJ2ZXIgYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gaGVhZCBUaGUgZmlyc3QgcGFja2V0IG9mIHRoZSB1cGdyYWRlZCBzdHJlYW1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGNhbGxlZCBtb3JlIHRoYW4gb25jZSB3aXRoIHRoZSBzYW1lIHNvY2tldFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29tcGxldGVVcGdyYWRlKGV4dGVuc2lvbnMsIGtleSwgcHJvdG9jb2xzLCByZXEsIHNvY2tldCwgaGVhZCwgY2IpIHtcbiAgICAvL1xuICAgIC8vIERlc3Ryb3kgdGhlIHNvY2tldCBpZiB0aGUgY2xpZW50IGhhcyBhbHJlYWR5IHNlbnQgYSBGSU4gcGFja2V0LlxuICAgIC8vXG4gICAgaWYgKCFzb2NrZXQucmVhZGFibGUgfHwgIXNvY2tldC53cml0YWJsZSkgcmV0dXJuIHNvY2tldC5kZXN0cm95KCk7XG5cbiAgICBpZiAoc29ja2V0W2tXZWJTb2NrZXRdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdzZXJ2ZXIuaGFuZGxlVXBncmFkZSgpIHdhcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aCB0aGUgc2FtZSAnICtcbiAgICAgICAgICAnc29ja2V0LCBwb3NzaWJseSBkdWUgdG8gYSBtaXNjb25maWd1cmF0aW9uJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc3RhdGUgPiBSVU5OSU5HKSByZXR1cm4gYWJvcnRIYW5kc2hha2Uoc29ja2V0LCA1MDMpO1xuXG4gICAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaCgnc2hhMScpXG4gICAgICAudXBkYXRlKGtleSArIEdVSUQpXG4gICAgICAuZGlnZXN0KCdiYXNlNjQnKTtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSBbXG4gICAgICAnSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHMnLFxuICAgICAgJ1VwZ3JhZGU6IHdlYnNvY2tldCcsXG4gICAgICAnQ29ubmVjdGlvbjogVXBncmFkZScsXG4gICAgICBgU2VjLVdlYlNvY2tldC1BY2NlcHQ6ICR7ZGlnZXN0fWBcbiAgICBdO1xuXG4gICAgY29uc3Qgd3MgPSBuZXcgdGhpcy5vcHRpb25zLldlYlNvY2tldChudWxsKTtcblxuICAgIGlmIChwcm90b2NvbHMuc2l6ZSkge1xuICAgICAgLy9cbiAgICAgIC8vIE9wdGlvbmFsbHkgY2FsbCBleHRlcm5hbCBwcm90b2NvbCBzZWxlY3Rpb24gaGFuZGxlci5cbiAgICAgIC8vXG4gICAgICBjb25zdCBwcm90b2NvbCA9IHRoaXMub3B0aW9ucy5oYW5kbGVQcm90b2NvbHNcbiAgICAgICAgPyB0aGlzLm9wdGlvbnMuaGFuZGxlUHJvdG9jb2xzKHByb3RvY29scywgcmVxKVxuICAgICAgICA6IHByb3RvY29scy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG5cbiAgICAgIGlmIChwcm90b2NvbCkge1xuICAgICAgICBoZWFkZXJzLnB1c2goYFNlYy1XZWJTb2NrZXQtUHJvdG9jb2w6ICR7cHJvdG9jb2x9YCk7XG4gICAgICAgIHdzLl9wcm90b2NvbCA9IHByb3RvY29sO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBleHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdLnBhcmFtcztcbiAgICAgIGNvbnN0IHZhbHVlID0gZXh0ZW5zaW9uLmZvcm1hdCh7XG4gICAgICAgIFtQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXTogW3BhcmFtc11cbiAgICAgIH0pO1xuICAgICAgaGVhZGVycy5wdXNoKGBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnM6ICR7dmFsdWV9YCk7XG4gICAgICB3cy5fZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBBbGxvdyBleHRlcm5hbCBtb2RpZmljYXRpb24vaW5zcGVjdGlvbiBvZiBoYW5kc2hha2UgaGVhZGVycy5cbiAgICAvL1xuICAgIHRoaXMuZW1pdCgnaGVhZGVycycsIGhlYWRlcnMsIHJlcSk7XG5cbiAgICBzb2NrZXQud3JpdGUoaGVhZGVycy5jb25jYXQoJ1xcclxcbicpLmpvaW4oJ1xcclxcbicpKTtcbiAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgc29ja2V0T25FcnJvcik7XG5cbiAgICB3cy5zZXRTb2NrZXQoc29ja2V0LCBoZWFkLCB7XG4gICAgICBtYXhQYXlsb2FkOiB0aGlzLm9wdGlvbnMubWF4UGF5bG9hZCxcbiAgICAgIHNraXBVVEY4VmFsaWRhdGlvbjogdGhpcy5vcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvblxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY2xpZW50cykge1xuICAgICAgdGhpcy5jbGllbnRzLmFkZCh3cyk7XG4gICAgICB3cy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xpZW50cy5kZWxldGUod3MpO1xuXG4gICAgICAgIGlmICh0aGlzLl9zaG91bGRFbWl0Q2xvc2UgJiYgIXRoaXMuY2xpZW50cy5zaXplKSB7XG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjYih3cywgcmVxKTtcbiAgfVxufVxuXG52YXIgd2Vic29ja2V0U2VydmVyID0gV2ViU29ja2V0U2VydmVyO1xuXG4vKipcbiAqIEFkZCBldmVudCBsaXN0ZW5lcnMgb24gYW4gYEV2ZW50RW1pdHRlcmAgdXNpbmcgYSBtYXAgb2YgPGV2ZW50LCBsaXN0ZW5lcj5cbiAqIHBhaXJzLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBzZXJ2ZXIgVGhlIGV2ZW50IGVtaXR0ZXJcbiAqIEBwYXJhbSB7T2JqZWN0LjxTdHJpbmcsIEZ1bmN0aW9uPn0gbWFwIFRoZSBsaXN0ZW5lcnMgdG8gYWRkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0aGF0IHdpbGwgcmVtb3ZlIHRoZSBhZGRlZCBsaXN0ZW5lcnMgd2hlblxuICogICAgIGNhbGxlZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRkTGlzdGVuZXJzKHNlcnZlciwgbWFwKSB7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgT2JqZWN0LmtleXMobWFwKSkgc2VydmVyLm9uKGV2ZW50LCBtYXBbZXZlbnRdKTtcblxuICByZXR1cm4gZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKCkge1xuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgT2JqZWN0LmtleXMobWFwKSkge1xuICAgICAgc2VydmVyLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBtYXBbZXZlbnRdKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogRW1pdCBhIGAnY2xvc2UnYCBldmVudCBvbiBhbiBgRXZlbnRFbWl0dGVyYC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gc2VydmVyIFRoZSBldmVudCBlbWl0dGVyXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBlbWl0Q2xvc2Uoc2VydmVyKSB7XG4gIHNlcnZlci5fc3RhdGUgPSBDTE9TRUQ7XG4gIHNlcnZlci5lbWl0KCdjbG9zZScpO1xufVxuXG4vKipcbiAqIEhhbmRsZSBzb2NrZXQgZXJyb3JzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uRXJyb3IoKSB7XG4gIHRoaXMuZGVzdHJveSgpO1xufVxuXG4vKipcbiAqIENsb3NlIHRoZSBjb25uZWN0aW9uIHdoZW4gcHJlY29uZGl0aW9ucyBhcmUgbm90IGZ1bGZpbGxlZC5cbiAqXG4gKiBAcGFyYW0geyhuZXQuU29ja2V0fHRscy5Tb2NrZXQpfSBzb2NrZXQgVGhlIHNvY2tldCBvZiB0aGUgdXBncmFkZSByZXF1ZXN0XG4gKiBAcGFyYW0ge051bWJlcn0gY29kZSBUaGUgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IFttZXNzYWdlXSBUaGUgSFRUUCByZXNwb25zZSBib2R5XG4gKiBAcGFyYW0ge09iamVjdH0gW2hlYWRlcnNdIEFkZGl0aW9uYWwgSFRUUCByZXNwb25zZSBoZWFkZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZShzb2NrZXQsIGNvZGUsIG1lc3NhZ2UsIGhlYWRlcnMpIHtcbiAgLy9cbiAgLy8gVGhlIHNvY2tldCBpcyB3cml0YWJsZSB1bmxlc3MgdGhlIHVzZXIgZGVzdHJveWVkIG9yIGVuZGVkIGl0IGJlZm9yZSBjYWxsaW5nXG4gIC8vIGBzZXJ2ZXIuaGFuZGxlVXBncmFkZSgpYCBvciBpbiB0aGUgYHZlcmlmeUNsaWVudGAgZnVuY3Rpb24sIHdoaWNoIGlzIGEgdXNlclxuICAvLyBlcnJvci4gSGFuZGxpbmcgdGhpcyBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgYXMgdGhlIHdvcnN0IHRoYXQgY2FuIGhhcHBlblxuICAvLyBpcyB0aGF0IHNvbWUgb2YgdGhlIGRhdGEgd3JpdHRlbiBieSB0aGUgdXNlciBtaWdodCBiZSBkaXNjYXJkZWQgZHVlIHRvIHRoZVxuICAvLyBjYWxsIHRvIGBzb2NrZXQuZW5kKClgIGJlbG93LCB3aGljaCB0cmlnZ2VycyBhbiBgJ2Vycm9yJ2AgZXZlbnQgdGhhdCBpblxuICAvLyB0dXJuIGNhdXNlcyB0aGUgc29ja2V0IHRvIGJlIGRlc3Ryb3llZC5cbiAgLy9cbiAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgaHR0cCQyLlNUQVRVU19DT0RFU1tjb2RlXTtcbiAgaGVhZGVycyA9IHtcbiAgICBDb25uZWN0aW9uOiAnY2xvc2UnLFxuICAgICdDb250ZW50LVR5cGUnOiAndGV4dC9odG1sJyxcbiAgICAnQ29udGVudC1MZW5ndGgnOiBCdWZmZXIuYnl0ZUxlbmd0aChtZXNzYWdlKSxcbiAgICAuLi5oZWFkZXJzXG4gIH07XG5cbiAgc29ja2V0Lm9uY2UoJ2ZpbmlzaCcsIHNvY2tldC5kZXN0cm95KTtcblxuICBzb2NrZXQuZW5kKFxuICAgIGBIVFRQLzEuMSAke2NvZGV9ICR7aHR0cCQyLlNUQVRVU19DT0RFU1tjb2RlXX1cXHJcXG5gICtcbiAgICAgIE9iamVjdC5rZXlzKGhlYWRlcnMpXG4gICAgICAgIC5tYXAoKGgpID0+IGAke2h9OiAke2hlYWRlcnNbaF19YClcbiAgICAgICAgLmpvaW4oJ1xcclxcbicpICtcbiAgICAgICdcXHJcXG5cXHJcXG4nICtcbiAgICAgIG1lc3NhZ2VcbiAgKTtcbn1cblxuLyoqXG4gKiBFbWl0IGEgYCd3c0NsaWVudEVycm9yJ2AgZXZlbnQgb24gYSBgV2ViU29ja2V0U2VydmVyYCBpZiB0aGVyZSBpcyBhdCBsZWFzdFxuICogb25lIGxpc3RlbmVyIGZvciBpdCwgb3RoZXJ3aXNlIGNhbGwgYGFib3J0SGFuZHNoYWtlKClgLlxuICpcbiAqIEBwYXJhbSB7V2ViU29ja2V0U2VydmVyfSBzZXJ2ZXIgVGhlIFdlYlNvY2tldCBzZXJ2ZXJcbiAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBUaGUgcmVxdWVzdCBvYmplY3RcbiAqIEBwYXJhbSB7KG5ldC5Tb2NrZXR8dGxzLlNvY2tldCl9IHNvY2tldCBUaGUgc29ja2V0IG9mIHRoZSB1cGdyYWRlIHJlcXVlc3RcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlIFRoZSBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgSFRUUCByZXNwb25zZSBib2R5XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3Ioc2VydmVyLCByZXEsIHNvY2tldCwgY29kZSwgbWVzc2FnZSkge1xuICBpZiAoc2VydmVyLmxpc3RlbmVyQ291bnQoJ3dzQ2xpZW50RXJyb3InKSkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcik7XG5cbiAgICBzZXJ2ZXIuZW1pdCgnd3NDbGllbnRFcnJvcicsIGVyciwgc29ja2V0LCByZXEpO1xuICB9IGVsc2Uge1xuICAgIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgY29kZSwgbWVzc2FnZSk7XG4gIH1cbn1cblxuY29uc3QgSE1SX0hFQURFUiA9ICd2aXRlLWhtcic7XG5jb25zdCB3c1NlcnZlckV2ZW50cyA9IFtcbiAgICAnY29ubmVjdGlvbicsXG4gICAgJ2Vycm9yJyxcbiAgICAnaGVhZGVycycsXG4gICAgJ2xpc3RlbmluZycsXG4gICAgJ21lc3NhZ2UnLFxuXTtcbmZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFNlcnZlcihzZXJ2ZXIsIGNvbmZpZywgaHR0cHNPcHRpb25zKSB7XG4gICAgbGV0IHdzcztcbiAgICBsZXQgaHR0cHNTZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaG1yID0gaXNPYmplY3QkMihjb25maWcuc2VydmVyLmhtcikgJiYgY29uZmlnLnNlcnZlci5obXI7XG4gICAgY29uc3QgaG1yU2VydmVyID0gaG1yICYmIGhtci5zZXJ2ZXI7XG4gICAgY29uc3QgaG1yUG9ydCA9IGhtciAmJiBobXIucG9ydDtcbiAgICAvLyBUT0RPOiB0aGUgbWFpbiBzZXJ2ZXIgcG9ydCBtYXkgbm90IGhhdmUgYmVlbiBjaG9zZW4geWV0IGFzIGl0IG1heSB1c2UgdGhlIG5leHQgYXZhaWxhYmxlXG4gICAgY29uc3QgcG9ydHNBcmVDb21wYXRpYmxlID0gIWhtclBvcnQgfHwgaG1yUG9ydCA9PT0gY29uZmlnLnNlcnZlci5wb3J0O1xuICAgIGNvbnN0IHdzU2VydmVyID0gaG1yU2VydmVyIHx8IChwb3J0c0FyZUNvbXBhdGlibGUgJiYgc2VydmVyKTtcbiAgICBjb25zdCBjdXN0b21MaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgY2xpZW50c01hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgaWYgKHdzU2VydmVyKSB7XG4gICAgICAgIHdzcyA9IG5ldyB3ZWJzb2NrZXRTZXJ2ZXIoeyBub1NlcnZlcjogdHJ1ZSB9KTtcbiAgICAgICAgd3NTZXJ2ZXIub24oJ3VwZ3JhZGUnLCAocmVxLCBzb2NrZXQsIGhlYWQpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXEuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1wcm90b2NvbCddID09PSBITVJfSEVBREVSKSB7XG4gICAgICAgICAgICAgICAgd3NzLmhhbmRsZVVwZ3JhZGUocmVxLCBzb2NrZXQsIGhlYWQsICh3cykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB3c3MuZW1pdCgnY29ubmVjdGlvbicsIHdzLCByZXEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHdlYnNvY2tldFNlcnZlck9wdGlvbnMgPSB7fTtcbiAgICAgICAgY29uc3QgcG9ydCA9IGhtclBvcnQgfHwgMjQ2Nzg7XG4gICAgICAgIGNvbnN0IGhvc3QgPSAoaG1yICYmIGhtci5ob3N0KSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChodHRwc09wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHNlcnZpbmcgdGhlIG1pZGRsZXdhcmVzIG92ZXIgaHR0cHMsIHRoZSB3cyBsaWJyYXJ5IGRvZXNuJ3Qgc3VwcG9ydCBhdXRvbWF0aWNhbGx5IGNyZWF0aW5nIGFuIGh0dHBzIHNlcnZlciwgc28gd2UgbmVlZCB0byBkbyBpdCBvdXJzZWx2ZXNcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBpbmxpbmUgaHR0cHMgc2VydmVyIGFuZCBtb3VudCB0aGUgd2Vic29ja2V0IHNlcnZlciB0byBpdFxuICAgICAgICAgICAgaHR0cHNTZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIkMihodHRwc09wdGlvbnMsIChyZXEsIHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSA0MjY7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IFNUQVRVU19DT0RFU1tzdGF0dXNDb2RlXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gYm9keSB0ZXh0IGZvdW5kIGZvciB0aGUgJHtzdGF0dXNDb2RlfSBzdGF0dXMgY29kZWApO1xuICAgICAgICAgICAgICAgIHJlcy53cml0ZUhlYWQoc3RhdHVzQ29kZSwge1xuICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1MZW5ndGgnOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXMuZW5kKGJvZHkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBodHRwc1NlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gICAgICAgICAgICB3ZWJzb2NrZXRTZXJ2ZXJPcHRpb25zLnNlcnZlciA9IGh0dHBzU2VydmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBzZXJ2ZSBvdmVyIGh0dHBzLCBqdXN0IGxldCB3cyBoYW5kbGUgaXRzIG93biBzZXJ2ZXJcbiAgICAgICAgICAgIHdlYnNvY2tldFNlcnZlck9wdGlvbnMucG9ydCA9IHBvcnQ7XG4gICAgICAgICAgICBpZiAoaG9zdCkge1xuICAgICAgICAgICAgICAgIHdlYnNvY2tldFNlcnZlck9wdGlvbnMuaG9zdCA9IGhvc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdml0ZSBkZXYgc2VydmVyIGluIG1pZGRsZXdhcmUgbW9kZVxuICAgICAgICB3c3MgPSBuZXcgd2Vic29ja2V0U2VydmVyKHdlYnNvY2tldFNlcnZlck9wdGlvbnMpO1xuICAgIH1cbiAgICB3c3Mub24oJ2Nvbm5lY3Rpb24nLCAoc29ja2V0KSA9PiB7XG4gICAgICAgIHNvY2tldC5vbignbWVzc2FnZScsIChyYXcpID0+IHtcbiAgICAgICAgICAgIGlmICghY3VzdG9tTGlzdGVuZXJzLnNpemUpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IHBhcnNlZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShTdHJpbmcocmF3KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCB7IH1cbiAgICAgICAgICAgIGlmICghcGFyc2VkIHx8IHBhcnNlZC50eXBlICE9PSAnY3VzdG9tJyB8fCAhcGFyc2VkLmV2ZW50KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGN1c3RvbUxpc3RlbmVycy5nZXQocGFyc2VkLmV2ZW50KTtcbiAgICAgICAgICAgIGlmICghbGlzdGVuZXJzPy5zaXplKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNsaWVudCA9IGdldFNvY2tldENsaWVudChzb2NrZXQpO1xuICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihwYXJzZWQuZGF0YSwgY2xpZW50KSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzb2NrZXQub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5lcnJvcihgJHtwaWNvY29sb3JzRXhwb3J0cy5yZWQoYHdzIGVycm9yOmApfVxcbiR7ZXJyLnN0YWNrfWAsIHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnY29ubmVjdGVkJyB9KSk7XG4gICAgICAgIGlmIChidWZmZXJlZEVycm9yKSB7XG4gICAgICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShidWZmZXJlZEVycm9yKSk7XG4gICAgICAgICAgICBidWZmZXJlZEVycm9yID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHdzcy5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgICAgIGNvbmZpZy5sb2dnZXIuZXJyb3IocGljb2NvbG9yc0V4cG9ydHMucmVkKGBXZWJTb2NrZXQgc2VydmVyIGVycm9yOiBQb3J0IGlzIGFscmVhZHkgaW4gdXNlYCksIHsgZXJyb3I6IGUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25maWcubG9nZ2VyLmVycm9yKHBpY29jb2xvcnNFeHBvcnRzLnJlZChgV2ViU29ja2V0IHNlcnZlciBlcnJvcjpcXG4ke2Uuc3RhY2sgfHwgZS5tZXNzYWdlfWApLCB7IGVycm9yOiBlIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gUHJvdmlkZSBhIHdyYXBwZXIgdG8gdGhlIHdzIGNsaWVudCBzbyB3ZSBjYW4gc2VuZCBtZXNzYWdlcyBpbiBKU09OIGZvcm1hdFxuICAgIC8vIFRvIGJlIGNvbnNpc3RlbnQgd2l0aCBzZXJ2ZXIud3Muc2VuZFxuICAgIGZ1bmN0aW9uIGdldFNvY2tldENsaWVudChzb2NrZXQpIHtcbiAgICAgICAgaWYgKCFjbGllbnRzTWFwLmhhcyhzb2NrZXQpKSB7XG4gICAgICAgICAgICBjbGllbnRzTWFwLnNldChzb2NrZXQsIHtcbiAgICAgICAgICAgICAgICBzZW5kOiAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogYXJnc1swXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBhcmdzWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNvY2tldCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGllbnRzTWFwLmdldChzb2NrZXQpO1xuICAgIH1cbiAgICAvLyBPbiBwYWdlIHJlbG9hZHMsIGlmIGEgZmlsZSBmYWlscyB0byBjb21waWxlIGFuZCByZXR1cm5zIDUwMCwgdGhlIHNlcnZlclxuICAgIC8vIHNlbmRzIHRoZSBlcnJvciBwYXlsb2FkIGJlZm9yZSB0aGUgY2xpZW50IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuXG4gICAgLy8gSWYgd2UgaGF2ZSBubyBvcGVuIGNsaWVudHMsIGJ1ZmZlciB0aGUgZXJyb3IgYW5kIHNlbmQgaXQgdG8gdGhlIG5leHRcbiAgICAvLyBjb25uZWN0ZWQgY2xpZW50LlxuICAgIGxldCBidWZmZXJlZEVycm9yID0gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBvbjogKChldmVudCwgZm4pID0+IHtcbiAgICAgICAgICAgIGlmICh3c1NlcnZlckV2ZW50cy5pbmNsdWRlcyhldmVudCkpXG4gICAgICAgICAgICAgICAgd3NzLm9uKGV2ZW50LCBmbik7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1c3RvbUxpc3RlbmVycy5oYXMoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUxpc3RlbmVycy5zZXQoZXZlbnQsIG5ldyBTZXQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1c3RvbUxpc3RlbmVycy5nZXQoZXZlbnQpLmFkZChmbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBvZmY6ICgoZXZlbnQsIGZuKSA9PiB7XG4gICAgICAgICAgICBpZiAod3NTZXJ2ZXJFdmVudHMuaW5jbHVkZXMoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgd3NzLm9mZihldmVudCwgZm4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VzdG9tTGlzdGVuZXJzLmdldChldmVudCk/LmRlbGV0ZShmbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBnZXQgY2xpZW50cygpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2V0KEFycmF5LmZyb20od3NzLmNsaWVudHMpLm1hcChnZXRTb2NrZXRDbGllbnQpKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZCguLi5hcmdzKSB7XG4gICAgICAgICAgICBsZXQgcGF5bG9hZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IGFyZ3NbMF0sXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGFyZ3NbMV0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBhcmdzWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBheWxvYWQudHlwZSA9PT0gJ2Vycm9yJyAmJiAhd3NzLmNsaWVudHMuc2l6ZSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcmVkRXJyb3IgPSBwYXlsb2FkO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG4gICAgICAgICAgICB3c3MuY2xpZW50cy5mb3JFYWNoKChjbGllbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyByZWFkeVN0YXRlIDEgbWVhbnMgdGhlIGNvbm5lY3Rpb24gaXMgb3BlblxuICAgICAgICAgICAgICAgIGlmIChjbGllbnQucmVhZHlTdGF0ZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2VuZChzdHJpbmdpZmllZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB3c3MuY2xpZW50cy5mb3JFYWNoKChjbGllbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50LnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHdzcy5jbG9zZSgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0dHBzU2VydmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHNTZXJ2ZXIuY2xvc2UoKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG4vLyB0aGlzIG1pZGRsZXdhcmUgaXMgb25seSBhY3RpdmUgd2hlbiAoYmFzZSAhPT0gJy8nKVxuZnVuY3Rpb24gYmFzZU1pZGRsZXdhcmUoeyBjb25maWcsIH0pIHtcbiAgICAvLyBLZWVwIHRoZSBuYW1lZCBmdW5jdGlvbi4gVGhlIG5hbWUgaXMgdmlzaWJsZSBpbiBkZWJ1ZyBsb2dzIHZpYSBgREVCVUc9Y29ubmVjdDpkaXNwYXRjaGVyIC4uLmBcbiAgICByZXR1cm4gZnVuY3Rpb24gdml0ZUJhc2VNaWRkbGV3YXJlKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHJlcS51cmw7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwodXJsLCAnaHR0cDovL3ZpdGVqcy5kZXYnKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhcnNlZC5wYXRobmFtZSB8fCAnLyc7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBjb25maWcucmF3QmFzZTtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChiYXNlKSkge1xuICAgICAgICAgICAgLy8gcmV3cml0ZSB1cmwgdG8gcmVtb3ZlIGJhc2UuIHRoaXMgZW5zdXJlcyB0aGF0IG90aGVyIG1pZGRsZXdhcmUgZG9lc1xuICAgICAgICAgICAgLy8gbm90IG5lZWQgdG8gY29uc2lkZXIgYmFzZSBiZWluZyBwcmVwZW5kZWQgb3Igbm90XG4gICAgICAgICAgICByZXEudXJsID0gc3RyaXBCYXNlKHVybCwgYmFzZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNraXAgcmVkaXJlY3QgYW5kIGVycm9yIGZhbGxiYWNrIG9uIG1pZGRsZXdhcmUgbW9kZSwgIzQwNTdcbiAgICAgICAgaWYgKGNvbmZpZy5zZXJ2ZXIubWlkZGxld2FyZU1vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGggPT09ICcvJyB8fCBwYXRoID09PSAnL2luZGV4Lmh0bWwnKSB7XG4gICAgICAgICAgICAvLyByZWRpcmVjdCByb290IHZpc2l0IHRvIGJhc2VkIHVybCB3aXRoIHNlYXJjaCBhbmQgaGFzaFxuICAgICAgICAgICAgcmVzLndyaXRlSGVhZCgzMDIsIHtcbiAgICAgICAgICAgICAgICBMb2NhdGlvbjogYmFzZSArIChwYXJzZWQuc2VhcmNoIHx8ICcnKSArIChwYXJzZWQuaGFzaCB8fCAnJyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXEuaGVhZGVycy5hY2NlcHQ/LmluY2x1ZGVzKCd0ZXh0L2h0bWwnKSkge1xuICAgICAgICAgICAgLy8gbm9uLWJhc2VkIHBhZ2UgdmlzaXRcbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0UGF0aCA9IHVybCArICcvJyAhPT0gYmFzZSA/IGpvaW5VcmxTZWdtZW50cyhiYXNlLCB1cmwpIDogYmFzZTtcbiAgICAgICAgICAgIHJlcy53cml0ZUhlYWQoNDA0LCB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWwnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXMuZW5kKGBUaGUgc2VydmVyIGlzIGNvbmZpZ3VyZWQgd2l0aCBhIHB1YmxpYyBiYXNlIFVSTCBvZiAke2Jhc2V9IC0gYCArXG4gICAgICAgICAgICAgICAgYGRpZCB5b3UgbWVhbiB0byB2aXNpdCA8YSBocmVmPVwiJHtyZWRpcmVjdFBhdGh9XCI+JHtyZWRpcmVjdFBhdGh9PC9hPiBpbnN0ZWFkP2ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5leHQoKTtcbiAgICB9O1xufVxuXG52YXIgaHR0cFByb3h5RXhwb3J0cyQxID0ge307XG52YXIgaHR0cFByb3h5JDMgPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiBodHRwUHJveHlFeHBvcnRzJDE7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBodHRwUHJveHlFeHBvcnRzJDEgPSB2OyB9LFxufTtcblxudmFyIGh0dHBQcm94eUV4cG9ydHMgPSB7fTtcbnZhciBodHRwUHJveHkkMiA9IHtcbiAgZ2V0IGV4cG9ydHMoKXsgcmV0dXJuIGh0dHBQcm94eUV4cG9ydHM7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBodHRwUHJveHlFeHBvcnRzID0gdjsgfSxcbn07XG5cbnZhciBldmVudGVtaXR0ZXIzRXhwb3J0cyA9IHt9O1xudmFyIGV2ZW50ZW1pdHRlcjMgPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiBldmVudGVtaXR0ZXIzRXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IGV2ZW50ZW1pdHRlcjNFeHBvcnRzID0gdjsgfSxcbn07XG5cbihmdW5jdGlvbiAobW9kdWxlKSB7XG5cblx0dmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblx0ICAsIHByZWZpeCA9ICd+JztcblxuXHQvKipcblx0ICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cblx0ICogQW4gYEV2ZW50c2AgaW5zdGFuY2UgaXMgYSBwbGFpbiBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgZXZlbnQgbmFtZXMuXG5cdCAqXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0ZnVuY3Rpb24gRXZlbnRzKCkge31cblxuXHQvL1xuXHQvLyBXZSB0cnkgdG8gbm90IGluaGVyaXQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAuIEluIHNvbWUgZW5naW5lcyBjcmVhdGluZyBhblxuXHQvLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cblx0Ly8gSWYgYE9iamVjdC5jcmVhdGUobnVsbClgIGlzIG5vdCBzdXBwb3J0ZWQgd2UgcHJlZml4IHRoZSBldmVudCBuYW1lcyB3aXRoIGFcblx0Ly8gY2hhcmFjdGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsdC1pbiBvYmplY3QgcHJvcGVydGllcyBhcmUgbm90XG5cdC8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuXHQvL1xuXHRpZiAoT2JqZWN0LmNyZWF0ZSkge1xuXHQgIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5cdCAgLy9cblx0ICAvLyBUaGlzIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGBfX3Byb3RvX19gIHByb3BlcnR5IGlzIHN0aWxsIGluaGVyaXRlZCBpblxuXHQgIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG5cdCAgLy9cblx0ICBpZiAoIW5ldyBFdmVudHMoKS5fX3Byb3RvX18pIHByZWZpeCA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGV2ZW50IGxpc3RlbmVyLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG5cdCAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0ZnVuY3Rpb24gRUUoZm4sIGNvbnRleHQsIG9uY2UpIHtcblx0ICB0aGlzLmZuID0gZm47XG5cdCAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcblx0ICB0aGlzLm9uY2UgPSBvbmNlIHx8IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuXHQgKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cblx0ICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cblx0ICogQHBhcmFtIHtCb29sZWFufSBvbmNlIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG5cdCAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGRMaXN0ZW5lcihlbWl0dGVyLCBldmVudCwgZm4sIGNvbnRleHQsIG9uY2UpIHtcblx0ICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cdCAgfVxuXG5cdCAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG5cdCAgICAsIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cblx0ICBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdKSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IGxpc3RlbmVyLCBlbWl0dGVyLl9ldmVudHNDb3VudCsrO1xuXHQgIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG5cdCAgZWxzZSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IFtlbWl0dGVyLl9ldmVudHNbZXZ0XSwgbGlzdGVuZXJdO1xuXG5cdCAgcmV0dXJuIGVtaXR0ZXI7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgZXZlbnQgYnkgbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2dCBUaGUgRXZlbnQgbmFtZS5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGZ1bmN0aW9uIGNsZWFyRXZlbnQoZW1pdHRlciwgZXZ0KSB7XG5cdCAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcblx0ICBlbHNlIGRlbGV0ZSBlbWl0dGVyLl9ldmVudHNbZXZ0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNaW5pbWFsIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZSB0aGF0IGlzIG1vbGRlZCBhZ2FpbnN0IHRoZSBOb2RlLmpzXG5cdCAqIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZS5cblx0ICpcblx0ICogQGNvbnN0cnVjdG9yXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdGZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcblx0ICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG5cdCAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG5cdCAqIGxpc3RlbmVycy5cblx0ICpcblx0ICogQHJldHVybnMge0FycmF5fVxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRFdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuXHQgIHZhciBuYW1lcyA9IFtdXG5cdCAgICAsIGV2ZW50c1xuXHQgICAgLCBuYW1lO1xuXG5cdCAgaWYgKHRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSByZXR1cm4gbmFtZXM7XG5cblx0ICBmb3IgKG5hbWUgaW4gKGV2ZW50cyA9IHRoaXMuX2V2ZW50cykpIHtcblx0ICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcblx0ICB9XG5cblx0ICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuXHQgICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuXHQgIH1cblxuXHQgIHJldHVybiBuYW1lcztcblx0fTtcblxuXHQvKipcblx0ICogUmV0dXJuIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSByZWdpc3RlcmVkIGxpc3RlbmVycy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnMoZXZlbnQpIHtcblx0ICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuXHQgICAgLCBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG5cdCAgaWYgKCFoYW5kbGVycykgcmV0dXJuIFtdO1xuXHQgIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cblx0ICBmb3IgKHZhciBpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aCwgZWUgPSBuZXcgQXJyYXkobCk7IGkgPCBsOyBpKyspIHtcblx0ICAgIGVlW2ldID0gaGFuZGxlcnNbaV0uZm47XG5cdCAgfVxuXG5cdCAgcmV0dXJuIGVlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgbGlzdGVuaW5nIHRvIGEgZ2l2ZW4gZXZlbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIG51bWJlciBvZiBsaXN0ZW5lcnMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIGxpc3RlbmVyQ291bnQoZXZlbnQpIHtcblx0ICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuXHQgICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuXHQgIGlmICghbGlzdGVuZXJzKSByZXR1cm4gMDtcblx0ICBpZiAobGlzdGVuZXJzLmZuKSByZXR1cm4gMTtcblx0ICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcblx0fTtcblxuXHQvKipcblx0ICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cblx0ICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcblx0ICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuXHQgIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiBmYWxzZTtcblxuXHQgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuXHQgICAgLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoXG5cdCAgICAsIGFyZ3Ncblx0ICAgICwgaTtcblxuXHQgIGlmIChsaXN0ZW5lcnMuZm4pIHtcblx0ICAgIGlmIChsaXN0ZW5lcnMub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG5cdCAgICBzd2l0Y2ggKGxlbikge1xuXHQgICAgICBjYXNlIDE6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCksIHRydWU7XG5cdCAgICAgIGNhc2UgMjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSksIHRydWU7XG5cdCAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuXHQgICAgICBjYXNlIDQ6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMyksIHRydWU7XG5cdCAgICAgIGNhc2UgNTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCksIHRydWU7XG5cdCAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuXHQgICAgfVxuXG5cdCAgICBmb3IgKGkgPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcblx0ICAgIH1cblxuXHQgICAgbGlzdGVuZXJzLmZuLmFwcGx5KGxpc3RlbmVycy5jb250ZXh0LCBhcmdzKTtcblx0ICB9IGVsc2Uge1xuXHQgICAgdmFyIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGhcblx0ICAgICAgLCBqO1xuXG5cdCAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0ICAgICAgaWYgKGxpc3RlbmVyc1tpXS5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnNbaV0uZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cblx0ICAgICAgc3dpdGNoIChsZW4pIHtcblx0ICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG5cdCAgICAgICAgY2FzZSAyOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEpOyBicmVhaztcblx0ICAgICAgICBjYXNlIDM6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIpOyBicmVhaztcblx0ICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG5cdCAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgIGlmICghYXJncykgZm9yIChqID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBqIDwgbGVuOyBqKyspIHtcblx0ICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG5cdCAgICAgICAgICB9XG5cblx0ICAgICAgICAgIGxpc3RlbmVyc1tpXS5mbi5hcHBseShsaXN0ZW5lcnNbaV0uY29udGV4dCwgYXJncyk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cblx0ICByZXR1cm4gdHJ1ZTtcblx0fTtcblxuXHQvKipcblx0ICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuXHQgKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cblx0ICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGZuLCBjb250ZXh0KSB7XG5cdCAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG5cdCAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuXHQgKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGZuLCBjb250ZXh0KSB7XG5cdCAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG5cdCAqIEBwYXJhbSB7Kn0gY29udGV4dCBPbmx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRoYXQgaGF2ZSB0aGlzIGNvbnRleHQuXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBPbmx5IHJlbW92ZSBvbmUtdGltZSBsaXN0ZW5lcnMuXG5cdCAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuXHQgIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG5cdCAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIHRoaXM7XG5cdCAgaWYgKCFmbikge1xuXHQgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuXHQgICAgcmV0dXJuIHRoaXM7XG5cdCAgfVxuXG5cdCAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG5cdCAgaWYgKGxpc3RlbmVycy5mbikge1xuXHQgICAgaWYgKFxuXHQgICAgICBsaXN0ZW5lcnMuZm4gPT09IGZuICYmXG5cdCAgICAgICghb25jZSB8fCBsaXN0ZW5lcnMub25jZSkgJiZcblx0ICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuXHQgICAgKSB7XG5cdCAgICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcblx0ICAgIH1cblx0ICB9IGVsc2Uge1xuXHQgICAgZm9yICh2YXIgaSA9IDAsIGV2ZW50cyA9IFtdLCBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0ICAgICAgaWYgKFxuXHQgICAgICAgIGxpc3RlbmVyc1tpXS5mbiAhPT0gZm4gfHxcblx0ICAgICAgICAob25jZSAmJiAhbGlzdGVuZXJzW2ldLm9uY2UpIHx8XG5cdCAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG5cdCAgICAgICkge1xuXHQgICAgICAgIGV2ZW50cy5wdXNoKGxpc3RlbmVyc1tpXSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgLy9cblx0ICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cblx0ICAgIC8vXG5cdCAgICBpZiAoZXZlbnRzLmxlbmd0aCkgdGhpcy5fZXZlbnRzW2V2dF0gPSBldmVudHMubGVuZ3RoID09PSAxID8gZXZlbnRzWzBdIDogZXZlbnRzO1xuXHQgICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG5cdCAgfVxuXG5cdCAgcmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlbW92ZSBhbGwgbGlzdGVuZXJzLCBvciB0aG9zZSBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gW2V2ZW50XSBUaGUgZXZlbnQgbmFtZS5cblx0ICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyhldmVudCkge1xuXHQgIHZhciBldnQ7XG5cblx0ICBpZiAoZXZlbnQpIHtcblx0ICAgIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cdCAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcblx0ICB9IGVsc2Uge1xuXHQgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuXHQgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuXHQgIH1cblxuXHQgIHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdC8vXG5cdC8vIEFsaWFzIG1ldGhvZHMgbmFtZXMgYmVjYXVzZSBwZW9wbGUgcm9sbCBsaWtlIHRoYXQuXG5cdC8vXG5cdEV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblx0RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUub247XG5cblx0Ly9cblx0Ly8gRXhwb3NlIHRoZSBwcmVmaXguXG5cdC8vXG5cdEV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuXHQvL1xuXHQvLyBBbGxvdyBgRXZlbnRFbWl0dGVyYCB0byBiZSBpbXBvcnRlZCBhcyBtb2R1bGUgbmFtZXNwYWNlLlxuXHQvL1xuXHRFdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5cdC8vXG5cdC8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuXHQvL1xuXHR7XG5cdCAgbW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cdH1cbn0gKGV2ZW50ZW1pdHRlcjMpKTtcblxudmFyIGNvbW1vbiQzID0ge307XG5cbi8qKlxuICogQ2hlY2sgaWYgd2UncmUgcmVxdWlyZWQgdG8gYWRkIGEgcG9ydCBudW1iZXIuXG4gKlxuICogQHNlZSBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RlZmF1bHQtcG9ydFxuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBwb3J0IFBvcnQgbnVtYmVyIHdlIG5lZWQgdG8gY2hlY2tcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm90b2NvbCBQcm90b2NvbCB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gSXMgaXQgYSBkZWZhdWx0IHBvcnQgZm9yIHRoZSBnaXZlbiBwcm90b2NvbFxuICogQGFwaSBwcml2YXRlXG4gKi9cbnZhciByZXF1aXJlc1BvcnQgPSBmdW5jdGlvbiByZXF1aXJlZChwb3J0LCBwcm90b2NvbCkge1xuICBwcm90b2NvbCA9IHByb3RvY29sLnNwbGl0KCc6JylbMF07XG4gIHBvcnQgPSArcG9ydDtcblxuICBpZiAoIXBvcnQpIHJldHVybiBmYWxzZTtcblxuICBzd2l0Y2ggKHByb3RvY29sKSB7XG4gICAgY2FzZSAnaHR0cCc6XG4gICAgY2FzZSAnd3MnOlxuICAgIHJldHVybiBwb3J0ICE9PSA4MDtcblxuICAgIGNhc2UgJ2h0dHBzJzpcbiAgICBjYXNlICd3c3MnOlxuICAgIHJldHVybiBwb3J0ICE9PSA0NDM7XG5cbiAgICBjYXNlICdmdHAnOlxuICAgIHJldHVybiBwb3J0ICE9PSAyMTtcblxuICAgIGNhc2UgJ2dvcGhlcic6XG4gICAgcmV0dXJuIHBvcnQgIT09IDcwO1xuXG4gICAgY2FzZSAnZmlsZSc6XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHBvcnQgIT09IDA7XG59O1xuXG4oZnVuY3Rpb24gKGV4cG9ydHMpIHtcblx0dmFyIGNvbW1vbiAgID0gZXhwb3J0cyxcblx0ICAgIHVybCAgICAgID0gcmVxdWlyZSQkMCQ5LFxuXHQgICAgZXh0ZW5kICAgPSByZXF1aXJlJCQwJDYuX2V4dGVuZCxcblx0ICAgIHJlcXVpcmVkID0gcmVxdWlyZXNQb3J0O1xuXG5cdHZhciB1cGdyYWRlSGVhZGVyID0gLyhefCwpXFxzKnVwZ3JhZGVcXHMqKCR8LCkvaSxcblx0ICAgIGlzU1NMID0gL15odHRwc3x3c3MvO1xuXG5cdC8qKlxuXHQgKiBTaW1wbGUgUmVnZXggZm9yIHRlc3RpbmcgaWYgcHJvdG9jb2wgaXMgaHR0cHNcblx0ICovXG5cdGNvbW1vbi5pc1NTTCA9IGlzU1NMO1xuXHQvKipcblx0ICogQ29waWVzIHRoZSByaWdodCBoZWFkZXJzIGZyb20gYG9wdGlvbnNgIGFuZCBgcmVxYCB0b1xuXHQgKiBgb3V0Z29pbmdgIHdoaWNoIGlzIHRoZW4gdXNlZCB0byBmaXJlIHRoZSBwcm94aWVkXG5cdCAqIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEV4YW1wbGVzOlxuXHQgKlxuXHQgKiAgICBjb21tb24uc2V0dXBPdXRnb2luZyhvdXRnb2luZywgb3B0aW9ucywgcmVxKVxuXHQgKiAgICAvLyA9PiB7IGhvc3Q6IC4uLiwgaG9zdG5hbWU6IC4uLn1cblx0ICpcblx0ICogQHBhcmFtIHtPYmplY3R9IE91dGdvaW5nIEJhc2Ugb2JqZWN0IHRvIGJlIGZpbGxlZCB3aXRoIHJlcXVpcmVkIHByb3BlcnRpZXNcblx0ICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG5cdCAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3QgT2JqZWN0XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBGb3J3YXJkIFN0cmluZyB0byBzZWxlY3QgZm9yd2FyZCBvciB0YXJnZXRcblx0ICpcdTAwQTBcblx0ICogQHJldHVybiB7T2JqZWN0fSBPdXRnb2luZyBPYmplY3Qgd2l0aCBhbGwgcmVxdWlyZWQgcHJvcGVydGllcyBzZXRcblx0ICpcblx0ICogQGFwaSBwcml2YXRlXG5cdCAqL1xuXG5cdGNvbW1vbi5zZXR1cE91dGdvaW5nID0gZnVuY3Rpb24ob3V0Z29pbmcsIG9wdGlvbnMsIHJlcSwgZm9yd2FyZCkge1xuXHQgIG91dGdvaW5nLnBvcnQgPSBvcHRpb25zW2ZvcndhcmQgfHwgJ3RhcmdldCddLnBvcnQgfHxcblx0ICAgICAgICAgICAgICAgICAgKGlzU1NMLnRlc3Qob3B0aW9uc1tmb3J3YXJkIHx8ICd0YXJnZXQnXS5wcm90b2NvbCkgPyA0NDMgOiA4MCk7XG5cblx0ICBbJ2hvc3QnLCAnaG9zdG5hbWUnLCAnc29ja2V0UGF0aCcsICdwZngnLCAna2V5Jyxcblx0ICAgICdwYXNzcGhyYXNlJywgJ2NlcnQnLCAnY2EnLCAnY2lwaGVycycsICdzZWN1cmVQcm90b2NvbCddLmZvckVhY2goXG5cdCAgICBmdW5jdGlvbihlKSB7IG91dGdvaW5nW2VdID0gb3B0aW9uc1tmb3J3YXJkIHx8ICd0YXJnZXQnXVtlXTsgfVxuXHQgICk7XG5cblx0ICBvdXRnb2luZy5tZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCByZXEubWV0aG9kO1xuXHQgIG91dGdvaW5nLmhlYWRlcnMgPSBleHRlbmQoe30sIHJlcS5oZWFkZXJzKTtcblxuXHQgIGlmIChvcHRpb25zLmhlYWRlcnMpe1xuXHQgICAgZXh0ZW5kKG91dGdvaW5nLmhlYWRlcnMsIG9wdGlvbnMuaGVhZGVycyk7XG5cdCAgfVxuXG5cdCAgaWYgKG9wdGlvbnMuYXV0aCkge1xuXHQgICAgb3V0Z29pbmcuYXV0aCA9IG9wdGlvbnMuYXV0aDtcblx0ICB9XG5cdCAgXG5cdCAgaWYgKG9wdGlvbnMuY2EpIHtcblx0ICAgICAgb3V0Z29pbmcuY2EgPSBvcHRpb25zLmNhO1xuXHQgIH1cblxuXHQgIGlmIChpc1NTTC50ZXN0KG9wdGlvbnNbZm9yd2FyZCB8fCAndGFyZ2V0J10ucHJvdG9jb2wpKSB7XG5cdCAgICBvdXRnb2luZy5yZWplY3RVbmF1dGhvcml6ZWQgPSAodHlwZW9mIG9wdGlvbnMuc2VjdXJlID09PSBcInVuZGVmaW5lZFwiKSA/IHRydWUgOiBvcHRpb25zLnNlY3VyZTtcblx0ICB9XG5cblxuXHQgIG91dGdvaW5nLmFnZW50ID0gb3B0aW9ucy5hZ2VudCB8fCBmYWxzZTtcblx0ICBvdXRnb2luZy5sb2NhbEFkZHJlc3MgPSBvcHRpb25zLmxvY2FsQWRkcmVzcztcblxuXHQgIC8vXG5cdCAgLy8gUmVtYXJrOiBJZiB3ZSBhcmUgZmFsc2UgYW5kIG5vdCB1cGdyYWRpbmcsIHNldCB0aGUgY29ubmVjdGlvbjogY2xvc2UuIFRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvXG5cdCAgLy8gYXMgbm9kZSBjb3JlIGRvZXNuJ3QgaGFuZGxlIHRoaXMgQ09NUExFVEVMWSBwcm9wZXJseSB5ZXQuXG5cdCAgLy9cblx0ICBpZiAoIW91dGdvaW5nLmFnZW50KSB7XG5cdCAgICBvdXRnb2luZy5oZWFkZXJzID0gb3V0Z29pbmcuaGVhZGVycyB8fCB7fTtcblx0ICAgIGlmICh0eXBlb2Ygb3V0Z29pbmcuaGVhZGVycy5jb25uZWN0aW9uICE9PSAnc3RyaW5nJ1xuXHQgICAgICAgIHx8ICF1cGdyYWRlSGVhZGVyLnRlc3Qob3V0Z29pbmcuaGVhZGVycy5jb25uZWN0aW9uKVxuXHQgICAgICAgKSB7IG91dGdvaW5nLmhlYWRlcnMuY29ubmVjdGlvbiA9ICdjbG9zZSc7IH1cblx0ICB9XG5cblxuXHQgIC8vIHRoZSBmaW5hbCBwYXRoIGlzIHRhcmdldCBwYXRoICsgcmVsYXRpdmUgcGF0aCByZXF1ZXN0ZWQgYnkgdXNlcjpcblx0ICB2YXIgdGFyZ2V0ID0gb3B0aW9uc1tmb3J3YXJkIHx8ICd0YXJnZXQnXTtcblx0ICB2YXIgdGFyZ2V0UGF0aCA9IHRhcmdldCAmJiBvcHRpb25zLnByZXBlbmRQYXRoICE9PSBmYWxzZVxuXHQgICAgPyAodGFyZ2V0LnBhdGggfHwgJycpXG5cdCAgICA6ICcnO1xuXG5cdCAgLy9cblx0ICAvLyBSZW1hcms6IENhbiB3ZSBzb21laG93IG5vdCB1c2UgdXJsLnBhcnNlIGFzIGEgcGVyZiBvcHRpbWl6YXRpb24/XG5cdCAgLy9cblx0ICB2YXIgb3V0Z29pbmdQYXRoID0gIW9wdGlvbnMudG9Qcm94eVxuXHQgICAgPyAodXJsLnBhcnNlKHJlcS51cmwpLnBhdGggfHwgJycpXG5cdCAgICA6IHJlcS51cmw7XG5cblx0ICAvL1xuXHQgIC8vIFJlbWFyazogaWdub3JlUGF0aCB3aWxsIGp1c3Qgc3RyYWlnaHQgdXAgaWdub3JlIHdoYXRldmVyIHRoZSByZXF1ZXN0J3Ncblx0ICAvLyBwYXRoIGlzLiBUaGlzIGNhbiBiZSBsYWJlbGVkIGFzIEZPT1QtR1VOIG1hdGVyaWFsIGlmIHlvdSBkbyBub3Qga25vdyB3aGF0XG5cdCAgLy8geW91IGFyZSBkb2luZyBhbmQgYXJlIHVzaW5nIGNvbmZsaWN0aW5nIG9wdGlvbnMuXG5cdCAgLy9cblx0ICBvdXRnb2luZ1BhdGggPSAhb3B0aW9ucy5pZ25vcmVQYXRoID8gb3V0Z29pbmdQYXRoIDogJyc7XG5cblx0ICBvdXRnb2luZy5wYXRoID0gY29tbW9uLnVybEpvaW4odGFyZ2V0UGF0aCwgb3V0Z29pbmdQYXRoKTtcblxuXHQgIGlmIChvcHRpb25zLmNoYW5nZU9yaWdpbikge1xuXHQgICAgb3V0Z29pbmcuaGVhZGVycy5ob3N0ID1cblx0ICAgICAgcmVxdWlyZWQob3V0Z29pbmcucG9ydCwgb3B0aW9uc1tmb3J3YXJkIHx8ICd0YXJnZXQnXS5wcm90b2NvbCkgJiYgIWhhc1BvcnQob3V0Z29pbmcuaG9zdClcblx0ICAgICAgICA/IG91dGdvaW5nLmhvc3QgKyAnOicgKyBvdXRnb2luZy5wb3J0XG5cdCAgICAgICAgOiBvdXRnb2luZy5ob3N0O1xuXHQgIH1cblx0ICByZXR1cm4gb3V0Z29pbmc7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgcHJvcGVyIGNvbmZpZ3VyYXRpb24gZm9yIHNvY2tldHMsXG5cdCAqIHNldCBubyBkZWxheSBhbmQgc2V0IGtlZXAgYWxpdmUsIGFsc28gc2V0XG5cdCAqIHRoZSB0aW1lb3V0IHRvIDAuXG5cdCAqXG5cdCAqIEV4YW1wbGVzOlxuXHQgKlxuXHQgKiAgICBjb21tb24uc2V0dXBTb2NrZXQoc29ja2V0KVxuXHQgKiAgICAvLyA9PiBTb2NrZXRcblx0ICpcblx0ICogQHBhcmFtIHtTb2NrZXR9IFNvY2tldCBpbnN0YW5jZSB0byBzZXR1cFxuXHQgKlx1MDBBMFxuXHQgKiBAcmV0dXJuIHtTb2NrZXR9IFJldHVybiB0aGUgY29uZmlndXJlZCBzb2NrZXQuXG5cdCAqXG5cdCAqIEBhcGkgcHJpdmF0ZVxuXHQgKi9cblxuXHRjb21tb24uc2V0dXBTb2NrZXQgPSBmdW5jdGlvbihzb2NrZXQpIHtcblx0ICBzb2NrZXQuc2V0VGltZW91dCgwKTtcblx0ICBzb2NrZXQuc2V0Tm9EZWxheSh0cnVlKTtcblxuXHQgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSwgMCk7XG5cblx0ICByZXR1cm4gc29ja2V0O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHBvcnQgbnVtYmVyIGZyb20gdGhlIGhvc3QuIE9yIGd1ZXNzIGl0IGJhc2VkIG9uIHRoZSBjb25uZWN0aW9uIHR5cGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxIEluY29taW5nIEhUVFAgcmVxdWVzdC5cblx0ICpcblx0ICogQHJldHVybiB7U3RyaW5nfSBUaGUgcG9ydCBudW1iZXIuXG5cdCAqXG5cdCAqIEBhcGkgcHJpdmF0ZVxuXHQgKi9cblx0Y29tbW9uLmdldFBvcnQgPSBmdW5jdGlvbihyZXEpIHtcblx0ICB2YXIgcmVzID0gcmVxLmhlYWRlcnMuaG9zdCA/IHJlcS5oZWFkZXJzLmhvc3QubWF0Y2goLzooXFxkKykvKSA6ICcnO1xuXG5cdCAgcmV0dXJuIHJlcyA/XG5cdCAgICByZXNbMV0gOlxuXHQgICAgY29tbW9uLmhhc0VuY3J5cHRlZENvbm5lY3Rpb24ocmVxKSA/ICc0NDMnIDogJzgwJztcblx0fTtcblxuXHQvKipcblx0ICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaGFzIGFuIGVuY3J5cHRlZCBjb25uZWN0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1JlcXVlc3R9IHJlcSBJbmNvbWluZyBIVFRQIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgZW5jcnlwdGVkIG9yIG5vdC5cblx0ICpcblx0ICogQGFwaSBwcml2YXRlXG5cdCAqL1xuXHRjb21tb24uaGFzRW5jcnlwdGVkQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHJlcSkge1xuXHQgIHJldHVybiBCb29sZWFuKHJlcS5jb25uZWN0aW9uLmVuY3J5cHRlZCB8fCByZXEuY29ubmVjdGlvbi5wYWlyKTtcblx0fTtcblxuXHQvKipcblx0ICogT1MtYWdub3N0aWMgam9pbiAoZG9lc24ndCBicmVhayBvbiBVUkxzIGxpa2UgcGF0aC5qb2luIGRvZXMgb24gV2luZG93cyk+XG5cdCAqXG5cdCAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGdlbmVyYXRlZCBwYXRoLlxuXHQgKlxuXHQgKiBAYXBpIHByaXZhdGVcblx0ICovXG5cblx0Y29tbW9uLnVybEpvaW4gPSBmdW5jdGlvbigpIHtcblx0ICAgIC8vXG5cdCAgICAvLyBXZSBkbyBub3Qgd2FudCB0byBtZXNzIHdpdGggdGhlIHF1ZXJ5IHN0cmluZy4gQWxsIHdlIHdhbnQgdG8gdG91Y2ggaXMgdGhlIHBhdGguXG5cdCAgICAvL1xuXHQgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxcblx0ICAgICAgbGFzdEluZGV4ID0gYXJncy5sZW5ndGggLSAxLFxuXHQgICAgICBsYXN0ID0gYXJnc1tsYXN0SW5kZXhdLFxuXHQgICAgICBsYXN0U2VncyA9IGxhc3Quc3BsaXQoJz8nKSxcblx0ICAgICAgcmV0U2VncztcblxuXHQgIGFyZ3NbbGFzdEluZGV4XSA9IGxhc3RTZWdzLnNoaWZ0KCk7XG5cblx0ICAvL1xuXHQgIC8vIEpvaW4gYWxsIHN0cmluZ3MsIGJ1dCByZW1vdmUgZW1wdHkgc3RyaW5ncyBzbyB3ZSBkb24ndCBnZXQgZXh0cmEgc2xhc2hlcyBmcm9tXG5cdCAgLy8gam9pbmluZyBlLmcuIFsnJywgJ2FtJ11cblx0ICAvL1xuXHQgIHJldFNlZ3MgPSBbXG5cdCAgICBhcmdzLmZpbHRlcihCb29sZWFuKS5qb2luKCcvJylcblx0ICAgICAgICAucmVwbGFjZSgvXFwvKy9nLCAnLycpXG5cdCAgICAgICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcblx0ICAgICAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpXG5cdCAgXTtcblxuXHQgIC8vIE9ubHkgam9pbiB0aGUgcXVlcnkgc3RyaW5nIGlmIGl0IGV4aXN0cyBzbyB3ZSBkb24ndCBoYXZlIHRyYWlsaW5nIGEgJz8nXG5cdCAgLy8gb24gZXZlcnkgcmVxdWVzdFxuXG5cdCAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgPyBpbiB0aGUgVVJMLlxuXHQgIHJldFNlZ3MucHVzaC5hcHBseShyZXRTZWdzLCBsYXN0U2Vncyk7XG5cblx0ICByZXR1cm4gcmV0U2Vncy5qb2luKCc/Jylcblx0fTtcblxuXHQvKipcblx0ICogUmV3cml0ZXMgb3IgcmVtb3ZlcyB0aGUgZG9tYWluIG9mIGEgY29va2llIGhlYWRlclxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gSGVhZGVyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBDb25maWcsIG1hcHBpbmcgb2YgZG9tYWluIHRvIHJld3JpdHRlbiBkb21haW4uXG5cdCAqICAgICAgICAgICAgICAgICAnKicga2V5IHRvIG1hdGNoIGFueSBkb21haW4sIG51bGwgdmFsdWUgdG8gcmVtb3ZlIHRoZSBkb21haW4uXG5cdCAqXG5cdCAqIEBhcGkgcHJpdmF0ZVxuXHQgKi9cblx0Y29tbW9uLnJld3JpdGVDb29raWVQcm9wZXJ0eSA9IGZ1bmN0aW9uIHJld3JpdGVDb29raWVQcm9wZXJ0eShoZWFkZXIsIGNvbmZpZywgcHJvcGVydHkpIHtcblx0ICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXIpKSB7XG5cdCAgICByZXR1cm4gaGVhZGVyLm1hcChmdW5jdGlvbiAoaGVhZGVyRWxlbWVudCkge1xuXHQgICAgICByZXR1cm4gcmV3cml0ZUNvb2tpZVByb3BlcnR5KGhlYWRlckVsZW1lbnQsIGNvbmZpZywgcHJvcGVydHkpO1xuXHQgICAgfSk7XG5cdCAgfVxuXHQgIHJldHVybiBoZWFkZXIucmVwbGFjZShuZXcgUmVnRXhwKFwiKDtcXFxccypcIiArIHByb3BlcnR5ICsgXCI9KShbXjtdKylcIiwgJ2knKSwgZnVuY3Rpb24obWF0Y2gsIHByZWZpeCwgcHJldmlvdXNWYWx1ZSkge1xuXHQgICAgdmFyIG5ld1ZhbHVlO1xuXHQgICAgaWYgKHByZXZpb3VzVmFsdWUgaW4gY29uZmlnKSB7XG5cdCAgICAgIG5ld1ZhbHVlID0gY29uZmlnW3ByZXZpb3VzVmFsdWVdO1xuXHQgICAgfSBlbHNlIGlmICgnKicgaW4gY29uZmlnKSB7XG5cdCAgICAgIG5ld1ZhbHVlID0gY29uZmlnWycqJ107XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAvL25vIG1hdGNoLCByZXR1cm4gcHJldmlvdXMgdmFsdWVcblx0ICAgICAgcmV0dXJuIG1hdGNoO1xuXHQgICAgfVxuXHQgICAgaWYgKG5ld1ZhbHVlKSB7XG5cdCAgICAgIC8vcmVwbGFjZSB2YWx1ZVxuXHQgICAgICByZXR1cm4gcHJlZml4ICsgbmV3VmFsdWU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAvL3JlbW92ZSB2YWx1ZVxuXHQgICAgICByZXR1cm4gJyc7XG5cdCAgICB9XG5cdCAgfSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIENoZWNrIHRoZSBob3N0IGFuZCBzZWUgaWYgaXQgcG90ZW50aWFsbHkgaGFzIGEgcG9ydCBpbiBpdCAoa2VlcCBpdCBzaW1wbGUpXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufSBXaGV0aGVyIHdlIGhhdmUgb25lIG9yIG5vdFxuXHQgKlxuXHQgKiBAYXBpIHByaXZhdGVcblx0ICovXG5cdGZ1bmN0aW9uIGhhc1BvcnQoaG9zdCkge1xuXHQgIHJldHVybiAhIX5ob3N0LmluZGV4T2YoJzonKTtcblx0fX0gKGNvbW1vbiQzKSk7XG5cbnZhciB1cmwkMSAgICA9IHJlcXVpcmUkJDAkOSxcbiAgICBjb21tb24kMiA9IGNvbW1vbiQzO1xuXG5cbnZhciByZWRpcmVjdFJlZ2V4ID0gL14yMDF8MzAoMXwyfDd8OCkkLztcblxuLyohXG4gKiBBcnJheSBvZiBwYXNzZXMuXG4gKlxuICogQSBgcGFzc2AgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgb24gYHJlcSwgcmVzLCBvcHRpb25zYFxuICogc28gdGhhdCB5b3UgY2FuIGVhc2lseSBhZGQgbmV3IGNoZWNrcyB3aGlsZSBzdGlsbCBrZWVwaW5nIHRoZSBiYXNlXG4gKiBmbGV4aWJsZS5cbiAqL1xuXG52YXIgd2ViT3V0Z29pbmcgPSB7IC8vIDwtLVxuXG4gIC8qKlxuICAgKiBJZiBpcyBhIEhUVFAgMS4wIHJlcXVlc3QsIHJlbW92ZSBjaHVuayBoZWFkZXJzXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3Qgb2JqZWN0XG4gICAqXHUwMEEwQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IFJlcyBSZXNwb25zZSBvYmplY3RcbiAgICogQHBhcmFtIHtwcm94eVJlc3BvbnNlfSBSZXMgUmVzcG9uc2Ugb2JqZWN0IGZyb20gdGhlIHByb3h5IHJlcXVlc3RcbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuICByZW1vdmVDaHVua2VkOiBmdW5jdGlvbiByZW1vdmVDaHVua2VkKHJlcSwgcmVzLCBwcm94eVJlcykge1xuICAgIGlmIChyZXEuaHR0cFZlcnNpb24gPT09ICcxLjAnKSB7XG4gICAgICBkZWxldGUgcHJveHlSZXMuaGVhZGVyc1sndHJhbnNmZXItZW5jb2RpbmcnXTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIElmIGlzIGEgSFRUUCAxLjAgcmVxdWVzdCwgc2V0IHRoZSBjb3JyZWN0IGNvbm5lY3Rpb24gaGVhZGVyXG4gICAqIG9yIGlmIGNvbm5lY3Rpb24gaGVhZGVyIG5vdCBwcmVzZW50LCB0aGVuIHVzZSBga2VlcC1hbGl2ZWBcbiAgICpcbiAgICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBvYmplY3RcbiAgICpcdTAwQTBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gUmVzIFJlc3BvbnNlIG9iamVjdFxuICAgKiBAcGFyYW0ge3Byb3h5UmVzcG9uc2V9IFJlcyBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcHJveHkgcmVxdWVzdFxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIHNldENvbm5lY3Rpb246IGZ1bmN0aW9uIHNldENvbm5lY3Rpb24ocmVxLCByZXMsIHByb3h5UmVzKSB7XG4gICAgaWYgKHJlcS5odHRwVmVyc2lvbiA9PT0gJzEuMCcpIHtcbiAgICAgIHByb3h5UmVzLmhlYWRlcnMuY29ubmVjdGlvbiA9IHJlcS5oZWFkZXJzLmNvbm5lY3Rpb24gfHwgJ2Nsb3NlJztcbiAgICB9IGVsc2UgaWYgKHJlcS5odHRwVmVyc2lvbiAhPT0gJzIuMCcgJiYgIXByb3h5UmVzLmhlYWRlcnMuY29ubmVjdGlvbikge1xuICAgICAgcHJveHlSZXMuaGVhZGVycy5jb25uZWN0aW9uID0gcmVxLmhlYWRlcnMuY29ubmVjdGlvbiB8fCAna2VlcC1hbGl2ZSc7XG4gICAgfVxuICB9LFxuXG4gIHNldFJlZGlyZWN0SG9zdFJld3JpdGU6IGZ1bmN0aW9uIHNldFJlZGlyZWN0SG9zdFJld3JpdGUocmVxLCByZXMsIHByb3h5UmVzLCBvcHRpb25zKSB7XG4gICAgaWYgKChvcHRpb25zLmhvc3RSZXdyaXRlIHx8IG9wdGlvbnMuYXV0b1Jld3JpdGUgfHwgb3B0aW9ucy5wcm90b2NvbFJld3JpdGUpXG4gICAgICAgICYmIHByb3h5UmVzLmhlYWRlcnNbJ2xvY2F0aW9uJ11cbiAgICAgICAgJiYgcmVkaXJlY3RSZWdleC50ZXN0KHByb3h5UmVzLnN0YXR1c0NvZGUpKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gdXJsJDEucGFyc2Uob3B0aW9ucy50YXJnZXQpO1xuICAgICAgdmFyIHUgPSB1cmwkMS5wYXJzZShwcm94eVJlcy5oZWFkZXJzWydsb2NhdGlvbiddKTtcblxuICAgICAgLy8gbWFrZSBzdXJlIHRoZSByZWRpcmVjdGVkIGhvc3QgbWF0Y2hlcyB0aGUgdGFyZ2V0IGhvc3QgYmVmb3JlIHJld3JpdGluZ1xuICAgICAgaWYgKHRhcmdldC5ob3N0ICE9IHUuaG9zdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmhvc3RSZXdyaXRlKSB7XG4gICAgICAgIHUuaG9zdCA9IG9wdGlvbnMuaG9zdFJld3JpdGU7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuYXV0b1Jld3JpdGUpIHtcbiAgICAgICAgdS5ob3N0ID0gcmVxLmhlYWRlcnNbJ2hvc3QnXTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnByb3RvY29sUmV3cml0ZSkge1xuICAgICAgICB1LnByb3RvY29sID0gb3B0aW9ucy5wcm90b2NvbFJld3JpdGU7XG4gICAgICB9XG5cbiAgICAgIHByb3h5UmVzLmhlYWRlcnNbJ2xvY2F0aW9uJ10gPSB1LmZvcm1hdCgpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIENvcHkgaGVhZGVycyBmcm9tIHByb3h5UmVzcG9uc2UgdG8gcmVzcG9uc2VcbiAgICogc2V0IGVhY2ggaGVhZGVyIGluIHJlc3BvbnNlIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBvYmplY3RcbiAgICpcdTAwQTBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gUmVzIFJlc3BvbnNlIG9iamVjdFxuICAgKiBAcGFyYW0ge3Byb3h5UmVzcG9uc2V9IFJlcyBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcHJveHkgcmVxdWVzdFxuICAgKiBAcGFyYW0ge09iamVjdH0gT3B0aW9ucyBvcHRpb25zLmNvb2tpZURvbWFpblJld3JpdGU6IENvbmZpZyB0byByZXdyaXRlIGNvb2tpZSBkb21haW5cbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuICB3cml0ZUhlYWRlcnM6IGZ1bmN0aW9uIHdyaXRlSGVhZGVycyhyZXEsIHJlcywgcHJveHlSZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgcmV3cml0ZUNvb2tpZURvbWFpbkNvbmZpZyA9IG9wdGlvbnMuY29va2llRG9tYWluUmV3cml0ZSxcbiAgICAgICAgcmV3cml0ZUNvb2tpZVBhdGhDb25maWcgPSBvcHRpb25zLmNvb2tpZVBhdGhSZXdyaXRlLFxuICAgICAgICBwcmVzZXJ2ZUhlYWRlcktleUNhc2UgPSBvcHRpb25zLnByZXNlcnZlSGVhZGVyS2V5Q2FzZSxcbiAgICAgICAgcmF3SGVhZGVyS2V5TWFwLFxuICAgICAgICBzZXRIZWFkZXIgPSBmdW5jdGlvbihrZXksIGhlYWRlcikge1xuICAgICAgICAgIGlmIChoZWFkZXIgPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgICAgaWYgKHJld3JpdGVDb29raWVEb21haW5Db25maWcgJiYga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICAgICAgaGVhZGVyID0gY29tbW9uJDIucmV3cml0ZUNvb2tpZVByb3BlcnR5KGhlYWRlciwgcmV3cml0ZUNvb2tpZURvbWFpbkNvbmZpZywgJ2RvbWFpbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmV3cml0ZUNvb2tpZVBhdGhDb25maWcgJiYga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICAgICAgaGVhZGVyID0gY29tbW9uJDIucmV3cml0ZUNvb2tpZVByb3BlcnR5KGhlYWRlciwgcmV3cml0ZUNvb2tpZVBhdGhDb25maWcsICdwYXRoJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoU3RyaW5nKGtleSkudHJpbSgpLCBoZWFkZXIpO1xuICAgICAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiByZXdyaXRlQ29va2llRG9tYWluQ29uZmlnID09PSAnc3RyaW5nJykgeyAvL2Fsc28gdGVzdCBmb3IgJydcbiAgICAgIHJld3JpdGVDb29raWVEb21haW5Db25maWcgPSB7ICcqJzogcmV3cml0ZUNvb2tpZURvbWFpbkNvbmZpZyB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmV3cml0ZUNvb2tpZVBhdGhDb25maWcgPT09ICdzdHJpbmcnKSB7IC8vYWxzbyB0ZXN0IGZvciAnJ1xuICAgICAgcmV3cml0ZUNvb2tpZVBhdGhDb25maWcgPSB7ICcqJzogcmV3cml0ZUNvb2tpZVBhdGhDb25maWcgfTtcbiAgICB9XG5cbiAgICAvLyBtZXNzYWdlLnJhd0hlYWRlcnMgaXMgYWRkZWQgaW46IHYwLjExLjZcbiAgICAvLyBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfcmF3aGVhZGVyc1xuICAgIGlmIChwcmVzZXJ2ZUhlYWRlcktleUNhc2UgJiYgcHJveHlSZXMucmF3SGVhZGVycyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHJhd0hlYWRlcktleU1hcCA9IHt9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm94eVJlcy5yYXdIZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHZhciBrZXkgPSBwcm94eVJlcy5yYXdIZWFkZXJzW2ldO1xuICAgICAgICByYXdIZWFkZXJLZXlNYXBba2V5LnRvTG93ZXJDYXNlKCldID0ga2V5O1xuICAgICAgfVxuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKHByb3h5UmVzLmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICB2YXIgaGVhZGVyID0gcHJveHlSZXMuaGVhZGVyc1trZXldO1xuICAgICAgaWYgKHByZXNlcnZlSGVhZGVyS2V5Q2FzZSAmJiByYXdIZWFkZXJLZXlNYXApIHtcbiAgICAgICAga2V5ID0gcmF3SGVhZGVyS2V5TWFwW2tleV0gfHwga2V5O1xuICAgICAgfVxuICAgICAgc2V0SGVhZGVyKGtleSwgaGVhZGVyKTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0IHRoZSBzdGF0dXNDb2RlIGZyb20gdGhlIHByb3h5UmVzcG9uc2VcbiAgICpcbiAgICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBvYmplY3RcbiAgICpcdTAwQTBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gUmVzIFJlc3BvbnNlIG9iamVjdFxuICAgKiBAcGFyYW0ge3Byb3h5UmVzcG9uc2V9IFJlcyBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcHJveHkgcmVxdWVzdFxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIHdyaXRlU3RhdHVzQ29kZTogZnVuY3Rpb24gd3JpdGVTdGF0dXNDb2RlKHJlcSwgcmVzLCBwcm94eVJlcykge1xuICAgIC8vIEZyb20gTm9kZS5qcyBkb2NzOiByZXNwb25zZS53cml0ZUhlYWQoc3RhdHVzQ29kZVssIHN0YXR1c01lc3NhZ2VdWywgaGVhZGVyc10pXG4gICAgaWYocHJveHlSZXMuc3RhdHVzTWVzc2FnZSkge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSBwcm94eVJlcy5zdGF0dXNDb2RlO1xuICAgICAgcmVzLnN0YXR1c01lc3NhZ2UgPSBwcm94eVJlcy5zdGF0dXNNZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMuc3RhdHVzQ29kZSA9IHByb3h5UmVzLnN0YXR1c0NvZGU7XG4gICAgfVxuICB9XG5cbn07XG5cbnZhciBmb2xsb3dSZWRpcmVjdHNFeHBvcnRzID0ge307XG52YXIgZm9sbG93UmVkaXJlY3RzJDEgPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiBmb2xsb3dSZWRpcmVjdHNFeHBvcnRzOyB9LFxuICBzZXQgZXhwb3J0cyh2KXsgZm9sbG93UmVkaXJlY3RzRXhwb3J0cyA9IHY7IH0sXG59O1xuXG52YXIgZGVidWckMztcblxudmFyIGRlYnVnXzEgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghZGVidWckMykge1xuICAgIHRyeSB7XG4gICAgICAvKiBlc2xpbnQgZ2xvYmFsLXJlcXVpcmU6IG9mZiAqL1xuICAgICAgZGVidWckMyA9IHNyY0V4cG9ydHMkMShcImZvbGxvdy1yZWRpcmVjdHNcIik7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyAvKiAqLyB9XG4gICAgaWYgKHR5cGVvZiBkZWJ1ZyQzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGRlYnVnJDMgPSBmdW5jdGlvbiAoKSB7IC8qICovIH07XG4gICAgfVxuICB9XG4gIGRlYnVnJDMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn07XG5cbnZhciB1cmwgPSByZXF1aXJlJCQwJDk7XG52YXIgVVJMJDEgPSB1cmwuVVJMO1xudmFyIGh0dHAkMSA9IHJlcXVpcmUkJDEkMTtcbnZhciBodHRwcyQxID0gcmVxdWlyZSQkMSQyO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZSQkMCQ3LldyaXRhYmxlO1xudmFyIGFzc2VydCA9IHJlcXVpcmUkJDU7XG52YXIgZGVidWckMiA9IGRlYnVnXzE7XG5cbi8vIENyZWF0ZSBoYW5kbGVycyB0aGF0IHBhc3MgZXZlbnRzIGZyb20gbmF0aXZlIHJlcXVlc3RzXG52YXIgZXZlbnRzID0gW1wiYWJvcnRcIiwgXCJhYm9ydGVkXCIsIFwiY29ubmVjdFwiLCBcImVycm9yXCIsIFwic29ja2V0XCIsIFwidGltZW91dFwiXTtcbnZhciBldmVudEhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudEhhbmRsZXJzW2V2ZW50XSA9IGZ1bmN0aW9uIChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgdGhpcy5fcmVkaXJlY3RhYmxlLmVtaXQoZXZlbnQsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICB9O1xufSk7XG5cbi8vIEVycm9yIHR5cGVzIHdpdGggY29kZXNcbnZhciBSZWRpcmVjdGlvbkVycm9yID0gY3JlYXRlRXJyb3JUeXBlKFxuICBcIkVSUl9GUl9SRURJUkVDVElPTl9GQUlMVVJFXCIsXG4gIFwiUmVkaXJlY3RlZCByZXF1ZXN0IGZhaWxlZFwiXG4pO1xudmFyIFRvb01hbnlSZWRpcmVjdHNFcnJvciA9IGNyZWF0ZUVycm9yVHlwZShcbiAgXCJFUlJfRlJfVE9PX01BTllfUkVESVJFQ1RTXCIsXG4gIFwiTWF4aW11bSBudW1iZXIgb2YgcmVkaXJlY3RzIGV4Y2VlZGVkXCJcbik7XG52YXIgTWF4Qm9keUxlbmd0aEV4Y2VlZGVkRXJyb3IgPSBjcmVhdGVFcnJvclR5cGUoXG4gIFwiRVJSX0ZSX01BWF9CT0RZX0xFTkdUSF9FWENFRURFRFwiLFxuICBcIlJlcXVlc3QgYm9keSBsYXJnZXIgdGhhbiBtYXhCb2R5TGVuZ3RoIGxpbWl0XCJcbik7XG52YXIgV3JpdGVBZnRlckVuZEVycm9yID0gY3JlYXRlRXJyb3JUeXBlKFxuICBcIkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EXCIsXG4gIFwid3JpdGUgYWZ0ZXIgZW5kXCJcbik7XG5cbi8vIEFuIEhUVFAoUykgcmVxdWVzdCB0aGF0IGNhbiBiZSByZWRpcmVjdGVkXG5mdW5jdGlvbiBSZWRpcmVjdGFibGVSZXF1ZXN0KG9wdGlvbnMsIHJlc3BvbnNlQ2FsbGJhY2spIHtcbiAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVxdWVzdFxuICBXcml0YWJsZS5jYWxsKHRoaXMpO1xuICB0aGlzLl9zYW5pdGl6ZU9wdGlvbnMob3B0aW9ucyk7XG4gIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLl9lbmRlZCA9IGZhbHNlO1xuICB0aGlzLl9lbmRpbmcgPSBmYWxzZTtcbiAgdGhpcy5fcmVkaXJlY3RDb3VudCA9IDA7XG4gIHRoaXMuX3JlZGlyZWN0cyA9IFtdO1xuICB0aGlzLl9yZXF1ZXN0Qm9keUxlbmd0aCA9IDA7XG4gIHRoaXMuX3JlcXVlc3RCb2R5QnVmZmVycyA9IFtdO1xuXG4gIC8vIEF0dGFjaCBhIGNhbGxiYWNrIGlmIHBhc3NlZFxuICBpZiAocmVzcG9uc2VDYWxsYmFjaykge1xuICAgIHRoaXMub24oXCJyZXNwb25zZVwiLCByZXNwb25zZUNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vIFJlYWN0IHRvIHJlc3BvbnNlcyBvZiBuYXRpdmUgcmVxdWVzdHNcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLl9vbk5hdGl2ZVJlc3BvbnNlID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgc2VsZi5fcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfTtcblxuICAvLyBQZXJmb3JtIHRoZSBmaXJzdCByZXF1ZXN0XG4gIHRoaXMuX3BlcmZvcm1SZXF1ZXN0KCk7XG59XG5SZWRpcmVjdGFibGVSZXF1ZXN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoV3JpdGFibGUucHJvdG90eXBlKTtcblxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gIGFib3J0UmVxdWVzdCh0aGlzLl9jdXJyZW50UmVxdWVzdCk7XG4gIHRoaXMuZW1pdChcImFib3J0XCIpO1xufTtcblxuLy8gV3JpdGVzIGJ1ZmZlcmVkIGRhdGEgdG8gdGhlIGN1cnJlbnQgbmF0aXZlIHJlcXVlc3RcblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAvLyBXcml0aW5nIGlzIG5vdCBhbGxvd2VkIGlmIGVuZCBoYXMgYmVlbiBjYWxsZWRcbiAgaWYgKHRoaXMuX2VuZGluZykge1xuICAgIHRocm93IG5ldyBXcml0ZUFmdGVyRW5kRXJyb3IoKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGlucHV0IGFuZCBzaGlmdCBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeVxuICBpZiAoISh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiAoXCJsZW5ndGhcIiBpbiBkYXRhKSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiZGF0YSBzaG91bGQgYmUgYSBzdHJpbmcsIEJ1ZmZlciBvciBVaW50OEFycmF5XCIpO1xuICB9XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNhbGxiYWNrID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgLy8gSWdub3JlIGVtcHR5IGJ1ZmZlcnMsIHNpbmNlIHdyaXRpbmcgdGhlbSBkb2Vzbid0IGludm9rZSB0aGUgY2FsbGJhY2tcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8yMjA2NlxuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICAvLyBPbmx5IHdyaXRlIHdoZW4gd2UgZG9uJ3QgZXhjZWVkIHRoZSBtYXhpbXVtIGJvZHkgbGVuZ3RoXG4gIGlmICh0aGlzLl9yZXF1ZXN0Qm9keUxlbmd0aCArIGRhdGEubGVuZ3RoIDw9IHRoaXMuX29wdGlvbnMubWF4Qm9keUxlbmd0aCkge1xuICAgIHRoaXMuX3JlcXVlc3RCb2R5TGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMuX3JlcXVlc3RCb2R5QnVmZmVycy5wdXNoKHsgZGF0YTogZGF0YSwgZW5jb2Rpbmc6IGVuY29kaW5nIH0pO1xuICAgIHRoaXMuX2N1cnJlbnRSZXF1ZXN0LndyaXRlKGRhdGEsIGVuY29kaW5nLCBjYWxsYmFjayk7XG4gIH1cbiAgLy8gRXJyb3Igd2hlbiB3ZSBleGNlZWQgdGhlIG1heGltdW0gYm9keSBsZW5ndGhcbiAgZWxzZSB7XG4gICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgbmV3IE1heEJvZHlMZW5ndGhFeGNlZWRlZEVycm9yKCkpO1xuICAgIHRoaXMuYWJvcnQoKTtcbiAgfVxufTtcblxuLy8gRW5kcyB0aGUgY3VycmVudCBuYXRpdmUgcmVxdWVzdFxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAvLyBTaGlmdCBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeVxuICBpZiAodHlwZW9mIGRhdGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNhbGxiYWNrID0gZGF0YTtcbiAgICBkYXRhID0gZW5jb2RpbmcgPSBudWxsO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY2FsbGJhY2sgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICAvLyBXcml0ZSBkYXRhIGlmIG5lZWRlZCBhbmQgZW5kXG4gIGlmICghZGF0YSkge1xuICAgIHRoaXMuX2VuZGVkID0gdGhpcy5fZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9jdXJyZW50UmVxdWVzdC5lbmQobnVsbCwgbnVsbCwgY2FsbGJhY2spO1xuICB9XG4gIGVsc2Uge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY3VycmVudFJlcXVlc3QgPSB0aGlzLl9jdXJyZW50UmVxdWVzdDtcbiAgICB0aGlzLndyaXRlKGRhdGEsIGVuY29kaW5nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9lbmRlZCA9IHRydWU7XG4gICAgICBjdXJyZW50UmVxdWVzdC5lbmQobnVsbCwgbnVsbCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHRoaXMuX2VuZGluZyA9IHRydWU7XG4gIH1cbn07XG5cbi8vIFNldHMgYSBoZWFkZXIgdmFsdWUgb24gdGhlIGN1cnJlbnQgbmF0aXZlIHJlcXVlc3RcblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLnNldEhlYWRlciA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICB0aGlzLl9vcHRpb25zLmhlYWRlcnNbbmFtZV0gPSB2YWx1ZTtcbiAgdGhpcy5fY3VycmVudFJlcXVlc3Quc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbn07XG5cbi8vIENsZWFycyBhIGhlYWRlciB2YWx1ZSBvbiB0aGUgY3VycmVudCBuYXRpdmUgcmVxdWVzdFxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUucmVtb3ZlSGVhZGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMuX29wdGlvbnMuaGVhZGVyc1tuYW1lXTtcbiAgdGhpcy5fY3VycmVudFJlcXVlc3QucmVtb3ZlSGVhZGVyKG5hbWUpO1xufTtcblxuLy8gR2xvYmFsIHRpbWVvdXQgZm9yIGFsbCB1bmRlcmx5aW5nIHJlcXVlc3RzXG5SZWRpcmVjdGFibGVSZXF1ZXN0LnByb3RvdHlwZS5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKG1zZWNzLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gRGVzdHJveXMgdGhlIHNvY2tldCBvbiB0aW1lb3V0XG4gIGZ1bmN0aW9uIGRlc3Ryb3lPblRpbWVvdXQoc29ja2V0KSB7XG4gICAgc29ja2V0LnNldFRpbWVvdXQobXNlY3MpO1xuICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcihcInRpbWVvdXRcIiwgc29ja2V0LmRlc3Ryb3kpO1xuICAgIHNvY2tldC5hZGRMaXN0ZW5lcihcInRpbWVvdXRcIiwgc29ja2V0LmRlc3Ryb3kpO1xuICB9XG5cbiAgLy8gU2V0cyB1cCBhIHRpbWVyIHRvIHRyaWdnZXIgYSB0aW1lb3V0IGV2ZW50XG4gIGZ1bmN0aW9uIHN0YXJ0VGltZXIoc29ja2V0KSB7XG4gICAgaWYgKHNlbGYuX3RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChzZWxmLl90aW1lb3V0KTtcbiAgICB9XG4gICAgc2VsZi5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5lbWl0KFwidGltZW91dFwiKTtcbiAgICAgIGNsZWFyVGltZXIoKTtcbiAgICB9LCBtc2Vjcyk7XG4gICAgZGVzdHJveU9uVGltZW91dChzb2NrZXQpO1xuICB9XG5cbiAgLy8gU3RvcHMgYSB0aW1lb3V0IGZyb20gdHJpZ2dlcmluZ1xuICBmdW5jdGlvbiBjbGVhclRpbWVyKCkge1xuICAgIC8vIENsZWFyIHRoZSB0aW1lb3V0XG4gICAgaWYgKHNlbGYuX3RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChzZWxmLl90aW1lb3V0KTtcbiAgICAgIHNlbGYuX3RpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIGFsbCBhdHRhY2hlZCBsaXN0ZW5lcnNcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKFwiYWJvcnRcIiwgY2xlYXJUaW1lcik7XG4gICAgc2VsZi5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIGNsZWFyVGltZXIpO1xuICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoXCJyZXNwb25zZVwiLCBjbGVhclRpbWVyKTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoXCJ0aW1lb3V0XCIsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgaWYgKCFzZWxmLnNvY2tldCkge1xuICAgICAgc2VsZi5fY3VycmVudFJlcXVlc3QucmVtb3ZlTGlzdGVuZXIoXCJzb2NrZXRcIiwgc3RhcnRUaW1lcik7XG4gICAgfVxuICB9XG5cbiAgLy8gQXR0YWNoIGNhbGxiYWNrIGlmIHBhc3NlZFxuICBpZiAoY2FsbGJhY2spIHtcbiAgICB0aGlzLm9uKFwidGltZW91dFwiLCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyBTdGFydCB0aGUgdGltZXIgaWYgb3Igd2hlbiB0aGUgc29ja2V0IGlzIG9wZW5lZFxuICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICBzdGFydFRpbWVyKHRoaXMuc29ja2V0KTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aGlzLl9jdXJyZW50UmVxdWVzdC5vbmNlKFwic29ja2V0XCIsIHN0YXJ0VGltZXIpO1xuICB9XG5cbiAgLy8gQ2xlYW4gdXAgb24gZXZlbnRzXG4gIHRoaXMub24oXCJzb2NrZXRcIiwgZGVzdHJveU9uVGltZW91dCk7XG4gIHRoaXMub24oXCJhYm9ydFwiLCBjbGVhclRpbWVyKTtcbiAgdGhpcy5vbihcImVycm9yXCIsIGNsZWFyVGltZXIpO1xuICB0aGlzLm9uKFwicmVzcG9uc2VcIiwgY2xlYXJUaW1lcik7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBQcm94eSBhbGwgb3RoZXIgcHVibGljIENsaWVudFJlcXVlc3QgbWV0aG9kc1xuW1xuICBcImZsdXNoSGVhZGVyc1wiLCBcImdldEhlYWRlclwiLFxuICBcInNldE5vRGVsYXlcIiwgXCJzZXRTb2NrZXRLZWVwQWxpdmVcIixcbl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gIFJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50UmVxdWVzdFttZXRob2RdKGEsIGIpO1xuICB9O1xufSk7XG5cbi8vIFByb3h5IGFsbCBwdWJsaWMgQ2xpZW50UmVxdWVzdCBwcm9wZXJ0aWVzXG5bXCJhYm9ydGVkXCIsIFwiY29ubmVjdGlvblwiLCBcInNvY2tldFwiXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUsIHByb3BlcnR5LCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jdXJyZW50UmVxdWVzdFtwcm9wZXJ0eV07IH0sXG4gIH0pO1xufSk7XG5cblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLl9zYW5pdGl6ZU9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAvLyBFbnN1cmUgaGVhZGVycyBhcmUgYWx3YXlzIHByZXNlbnRcbiAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgfVxuXG4gIC8vIFNpbmNlIGh0dHAucmVxdWVzdCB0cmVhdHMgaG9zdCBhcyBhbiBhbGlhcyBvZiBob3N0bmFtZSxcbiAgLy8gYnV0IHRoZSB1cmwgbW9kdWxlIGludGVycHJldHMgaG9zdCBhcyBob3N0bmFtZSBwbHVzIHBvcnQsXG4gIC8vIGVsaW1pbmF0ZSB0aGUgaG9zdCBwcm9wZXJ0eSB0byBhdm9pZCBjb25mdXNpb24uXG4gIGlmIChvcHRpb25zLmhvc3QpIHtcbiAgICAvLyBVc2UgaG9zdG5hbWUgaWYgc2V0LCBiZWNhdXNlIGl0IGhhcyBwcmVjZWRlbmNlXG4gICAgaWYgKCFvcHRpb25zLmhvc3RuYW1lKSB7XG4gICAgICBvcHRpb25zLmhvc3RuYW1lID0gb3B0aW9ucy5ob3N0O1xuICAgIH1cbiAgICBkZWxldGUgb3B0aW9ucy5ob3N0O1xuICB9XG5cbiAgLy8gQ29tcGxldGUgdGhlIFVSTCBvYmplY3Qgd2hlbiBuZWNlc3NhcnlcbiAgaWYgKCFvcHRpb25zLnBhdGhuYW1lICYmIG9wdGlvbnMucGF0aCkge1xuICAgIHZhciBzZWFyY2hQb3MgPSBvcHRpb25zLnBhdGguaW5kZXhPZihcIj9cIik7XG4gICAgaWYgKHNlYXJjaFBvcyA8IDApIHtcbiAgICAgIG9wdGlvbnMucGF0aG5hbWUgPSBvcHRpb25zLnBhdGg7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgb3B0aW9ucy5wYXRobmFtZSA9IG9wdGlvbnMucGF0aC5zdWJzdHJpbmcoMCwgc2VhcmNoUG9zKTtcbiAgICAgIG9wdGlvbnMuc2VhcmNoID0gb3B0aW9ucy5wYXRoLnN1YnN0cmluZyhzZWFyY2hQb3MpO1xuICAgIH1cbiAgfVxufTtcblxuXG4vLyBFeGVjdXRlcyB0aGUgbmV4dCBuYXRpdmUgcmVxdWVzdCAoaW5pdGlhbCBvciByZWRpcmVjdClcblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLl9wZXJmb3JtUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gTG9hZCB0aGUgbmF0aXZlIHByb3RvY29sXG4gIHZhciBwcm90b2NvbCA9IHRoaXMuX29wdGlvbnMucHJvdG9jb2w7XG4gIHZhciBuYXRpdmVQcm90b2NvbCA9IHRoaXMuX29wdGlvbnMubmF0aXZlUHJvdG9jb2xzW3Byb3RvY29sXTtcbiAgaWYgKCFuYXRpdmVQcm90b2NvbCkge1xuICAgIHRoaXMuZW1pdChcImVycm9yXCIsIG5ldyBUeXBlRXJyb3IoXCJVbnN1cHBvcnRlZCBwcm90b2NvbCBcIiArIHByb3RvY29sKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgc3BlY2lmaWVkLCB1c2UgdGhlIGFnZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3RvY29sXG4gIC8vIChIVFRQIGFuZCBIVFRQUyB1c2UgZGlmZmVyZW50IHR5cGVzIG9mIGFnZW50cylcbiAgaWYgKHRoaXMuX29wdGlvbnMuYWdlbnRzKSB7XG4gICAgdmFyIHNjaGVtZSA9IHByb3RvY29sLnNsaWNlKDAsIC0xKTtcbiAgICB0aGlzLl9vcHRpb25zLmFnZW50ID0gdGhpcy5fb3B0aW9ucy5hZ2VudHNbc2NoZW1lXTtcbiAgfVxuXG4gIC8vIENyZWF0ZSB0aGUgbmF0aXZlIHJlcXVlc3RcbiAgdmFyIHJlcXVlc3QgPSB0aGlzLl9jdXJyZW50UmVxdWVzdCA9XG4gICAgICAgIG5hdGl2ZVByb3RvY29sLnJlcXVlc3QodGhpcy5fb3B0aW9ucywgdGhpcy5fb25OYXRpdmVSZXNwb25zZSk7XG4gIHRoaXMuX2N1cnJlbnRVcmwgPSB1cmwuZm9ybWF0KHRoaXMuX29wdGlvbnMpO1xuXG4gIC8vIFNldCB1cCBldmVudCBoYW5kbGVyc1xuICByZXF1ZXN0Ll9yZWRpcmVjdGFibGUgPSB0aGlzO1xuICBmb3IgKHZhciBlID0gMDsgZSA8IGV2ZW50cy5sZW5ndGg7IGUrKykge1xuICAgIHJlcXVlc3Qub24oZXZlbnRzW2VdLCBldmVudEhhbmRsZXJzW2V2ZW50c1tlXV0pO1xuICB9XG5cbiAgLy8gRW5kIGEgcmVkaXJlY3RlZCByZXF1ZXN0XG4gIC8vIChUaGUgZmlyc3QgcmVxdWVzdCBtdXN0IGJlIGVuZGVkIGV4cGxpY2l0bHkgd2l0aCBSZWRpcmVjdGFibGVSZXF1ZXN0I2VuZClcbiAgaWYgKHRoaXMuX2lzUmVkaXJlY3QpIHtcbiAgICAvLyBXcml0ZSB0aGUgcmVxdWVzdCBlbnRpdHkgYW5kIGVuZC5cbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBidWZmZXJzID0gdGhpcy5fcmVxdWVzdEJvZHlCdWZmZXJzO1xuICAgIChmdW5jdGlvbiB3cml0ZU5leHQoZXJyb3IpIHtcbiAgICAgIC8vIE9ubHkgd3JpdGUgaWYgdGhpcyByZXF1ZXN0IGhhcyBub3QgYmVlbiByZWRpcmVjdGVkIHlldFxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChyZXF1ZXN0ID09PSBzZWxmLl9jdXJyZW50UmVxdWVzdCkge1xuICAgICAgICAvLyBSZXBvcnQgYW55IHdyaXRlIGVycm9yc1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgc2VsZi5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdyaXRlIHRoZSBuZXh0IGJ1ZmZlciBpZiB0aGVyZSBhcmUgc3RpbGwgbGVmdFxuICAgICAgICBlbHNlIGlmIChpIDwgYnVmZmVycy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc1tpKytdO1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgaWYgKCFyZXF1ZXN0LmZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXF1ZXN0LndyaXRlKGJ1ZmZlci5kYXRhLCBidWZmZXIuZW5jb2RpbmcsIHdyaXRlTmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVuZCB0aGUgcmVxdWVzdCBpZiBgZW5kYCBoYXMgYmVlbiBjYWxsZWQgb24gdXNcbiAgICAgICAgZWxzZSBpZiAoc2VsZi5fZW5kZWQpIHtcbiAgICAgICAgICByZXF1ZXN0LmVuZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSgpKTtcbiAgfVxufTtcblxuLy8gUHJvY2Vzc2VzIGEgcmVzcG9uc2UgZnJvbSB0aGUgY3VycmVudCBuYXRpdmUgcmVxdWVzdFxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUuX3Byb2Nlc3NSZXNwb25zZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAvLyBTdG9yZSB0aGUgcmVkaXJlY3RlZCByZXNwb25zZVxuICB2YXIgc3RhdHVzQ29kZSA9IHJlc3BvbnNlLnN0YXR1c0NvZGU7XG4gIGlmICh0aGlzLl9vcHRpb25zLnRyYWNrUmVkaXJlY3RzKSB7XG4gICAgdGhpcy5fcmVkaXJlY3RzLnB1c2goe1xuICAgICAgdXJsOiB0aGlzLl9jdXJyZW50VXJsLFxuICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBSRkM3MjMxXHUwMEE3Ni40OiBUaGUgM3h4IChSZWRpcmVjdGlvbikgY2xhc3Mgb2Ygc3RhdHVzIGNvZGUgaW5kaWNhdGVzXG4gIC8vIHRoYXQgZnVydGhlciBhY3Rpb24gbmVlZHMgdG8gYmUgdGFrZW4gYnkgdGhlIHVzZXIgYWdlbnQgaW4gb3JkZXIgdG9cbiAgLy8gZnVsZmlsbCB0aGUgcmVxdWVzdC4gSWYgYSBMb2NhdGlvbiBoZWFkZXIgZmllbGQgaXMgcHJvdmlkZWQsXG4gIC8vIHRoZSB1c2VyIGFnZW50IE1BWSBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0IGl0cyByZXF1ZXN0IHRvIHRoZSBVUklcbiAgLy8gcmVmZXJlbmNlZCBieSB0aGUgTG9jYXRpb24gZmllbGQgdmFsdWUsXG4gIC8vIGV2ZW4gaWYgdGhlIHNwZWNpZmljIHN0YXR1cyBjb2RlIGlzIG5vdCB1bmRlcnN0b29kLlxuXG4gIC8vIElmIHRoZSByZXNwb25zZSBpcyBub3QgYSByZWRpcmVjdDsgcmV0dXJuIGl0IGFzLWlzXG4gIHZhciBsb2NhdGlvbiA9IHJlc3BvbnNlLmhlYWRlcnMubG9jYXRpb247XG4gIGlmICghbG9jYXRpb24gfHwgdGhpcy5fb3B0aW9ucy5mb2xsb3dSZWRpcmVjdHMgPT09IGZhbHNlIHx8XG4gICAgICBzdGF0dXNDb2RlIDwgMzAwIHx8IHN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgcmVzcG9uc2UucmVzcG9uc2VVcmwgPSB0aGlzLl9jdXJyZW50VXJsO1xuICAgIHJlc3BvbnNlLnJlZGlyZWN0cyA9IHRoaXMuX3JlZGlyZWN0cztcbiAgICB0aGlzLmVtaXQoXCJyZXNwb25zZVwiLCByZXNwb25zZSk7XG5cbiAgICAvLyBDbGVhbiB1cFxuICAgIHRoaXMuX3JlcXVlc3RCb2R5QnVmZmVycyA9IFtdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSByZXNwb25zZSBpcyBhIHJlZGlyZWN0LCBzbyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0XG4gIGFib3J0UmVxdWVzdCh0aGlzLl9jdXJyZW50UmVxdWVzdCk7XG4gIC8vIERpc2NhcmQgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVzcG9uc2UgdG8gYXZvaWQgd2FpdGluZyBmb3IgZGF0YVxuICByZXNwb25zZS5kZXN0cm95KCk7XG5cbiAgLy8gUkZDNzIzMVx1MDBBNzYuNDogQSBjbGllbnQgU0hPVUxEIGRldGVjdCBhbmQgaW50ZXJ2ZW5lXG4gIC8vIGluIGN5Y2xpY2FsIHJlZGlyZWN0aW9ucyAoaS5lLiwgXCJpbmZpbml0ZVwiIHJlZGlyZWN0aW9uIGxvb3BzKS5cbiAgaWYgKCsrdGhpcy5fcmVkaXJlY3RDb3VudCA+IHRoaXMuX29wdGlvbnMubWF4UmVkaXJlY3RzKSB7XG4gICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgbmV3IFRvb01hbnlSZWRpcmVjdHNFcnJvcigpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBTdG9yZSB0aGUgcmVxdWVzdCBoZWFkZXJzIGlmIGFwcGxpY2FibGVcbiAgdmFyIHJlcXVlc3RIZWFkZXJzO1xuICB2YXIgYmVmb3JlUmVkaXJlY3QgPSB0aGlzLl9vcHRpb25zLmJlZm9yZVJlZGlyZWN0O1xuICBpZiAoYmVmb3JlUmVkaXJlY3QpIHtcbiAgICByZXF1ZXN0SGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgLy8gVGhlIEhvc3QgaGVhZGVyIHdhcyBzZXQgYnkgbmF0aXZlUHJvdG9jb2wucmVxdWVzdFxuICAgICAgSG9zdDogcmVzcG9uc2UucmVxLmdldEhlYWRlcihcImhvc3RcIiksXG4gICAgfSwgdGhpcy5fb3B0aW9ucy5oZWFkZXJzKTtcbiAgfVxuXG4gIC8vIFJGQzcyMzFcdTAwQTc2LjQ6IEF1dG9tYXRpYyByZWRpcmVjdGlvbiBuZWVkcyB0byBkb25lIHdpdGhcbiAgLy8gY2FyZSBmb3IgbWV0aG9kcyBub3Qga25vd24gdG8gYmUgc2FmZSwgW1x1MjAyNl1cbiAgLy8gUkZDNzIzMVx1MDBBNzYuNC4yXHUyMDEzMzogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgYSB1c2VyIGFnZW50IE1BWSBjaGFuZ2VcbiAgLy8gdGhlIHJlcXVlc3QgbWV0aG9kIGZyb20gUE9TVCB0byBHRVQgZm9yIHRoZSBzdWJzZXF1ZW50IHJlcXVlc3QuXG4gIHZhciBtZXRob2QgPSB0aGlzLl9vcHRpb25zLm1ldGhvZDtcbiAgaWYgKChzdGF0dXNDb2RlID09PSAzMDEgfHwgc3RhdHVzQ29kZSA9PT0gMzAyKSAmJiB0aGlzLl9vcHRpb25zLm1ldGhvZCA9PT0gXCJQT1NUXCIgfHxcbiAgICAgIC8vIFJGQzcyMzFcdTAwQTc2LjQuNDogVGhlIDMwMyAoU2VlIE90aGVyKSBzdGF0dXMgY29kZSBpbmRpY2F0ZXMgdGhhdFxuICAgICAgLy8gdGhlIHNlcnZlciBpcyByZWRpcmVjdGluZyB0aGUgdXNlciBhZ2VudCB0byBhIGRpZmZlcmVudCByZXNvdXJjZSBbXHUyMDI2XVxuICAgICAgLy8gQSB1c2VyIGFnZW50IGNhbiBwZXJmb3JtIGEgcmV0cmlldmFsIHJlcXVlc3QgdGFyZ2V0aW5nIHRoYXQgVVJJXG4gICAgICAvLyAoYSBHRVQgb3IgSEVBRCByZXF1ZXN0IGlmIHVzaW5nIEhUVFApIFtcdTIwMjZdXG4gICAgICAoc3RhdHVzQ29kZSA9PT0gMzAzKSAmJiAhL14oPzpHRVR8SEVBRCkkLy50ZXN0KHRoaXMuX29wdGlvbnMubWV0aG9kKSkge1xuICAgIHRoaXMuX29wdGlvbnMubWV0aG9kID0gXCJHRVRcIjtcbiAgICAvLyBEcm9wIGEgcG9zc2libGUgZW50aXR5IGFuZCBoZWFkZXJzIHJlbGF0ZWQgdG8gaXRcbiAgICB0aGlzLl9yZXF1ZXN0Qm9keUJ1ZmZlcnMgPSBbXTtcbiAgICByZW1vdmVNYXRjaGluZ0hlYWRlcnMoL15jb250ZW50LS9pLCB0aGlzLl9vcHRpb25zLmhlYWRlcnMpO1xuICB9XG5cbiAgLy8gRHJvcCB0aGUgSG9zdCBoZWFkZXIsIGFzIHRoZSByZWRpcmVjdCBtaWdodCBsZWFkIHRvIGEgZGlmZmVyZW50IGhvc3RcbiAgdmFyIGN1cnJlbnRIb3N0SGVhZGVyID0gcmVtb3ZlTWF0Y2hpbmdIZWFkZXJzKC9eaG9zdCQvaSwgdGhpcy5fb3B0aW9ucy5oZWFkZXJzKTtcblxuICAvLyBJZiB0aGUgcmVkaXJlY3QgaXMgcmVsYXRpdmUsIGNhcnJ5IG92ZXIgdGhlIGhvc3Qgb2YgdGhlIGxhc3QgcmVxdWVzdFxuICB2YXIgY3VycmVudFVybFBhcnRzID0gdXJsLnBhcnNlKHRoaXMuX2N1cnJlbnRVcmwpO1xuICB2YXIgY3VycmVudEhvc3QgPSBjdXJyZW50SG9zdEhlYWRlciB8fCBjdXJyZW50VXJsUGFydHMuaG9zdDtcbiAgdmFyIGN1cnJlbnRVcmwgPSAvXlxcdys6Ly50ZXN0KGxvY2F0aW9uKSA/IHRoaXMuX2N1cnJlbnRVcmwgOlxuICAgIHVybC5mb3JtYXQoT2JqZWN0LmFzc2lnbihjdXJyZW50VXJsUGFydHMsIHsgaG9zdDogY3VycmVudEhvc3QgfSkpO1xuXG4gIC8vIERldGVybWluZSB0aGUgVVJMIG9mIHRoZSByZWRpcmVjdGlvblxuICB2YXIgcmVkaXJlY3RVcmw7XG4gIHRyeSB7XG4gICAgcmVkaXJlY3RVcmwgPSB1cmwucmVzb2x2ZShjdXJyZW50VXJsLCBsb2NhdGlvbik7XG4gIH1cbiAgY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgbmV3IFJlZGlyZWN0aW9uRXJyb3IoY2F1c2UpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDcmVhdGUgdGhlIHJlZGlyZWN0ZWQgcmVxdWVzdFxuICBkZWJ1ZyQyKFwicmVkaXJlY3RpbmcgdG9cIiwgcmVkaXJlY3RVcmwpO1xuICB0aGlzLl9pc1JlZGlyZWN0ID0gdHJ1ZTtcbiAgdmFyIHJlZGlyZWN0VXJsUGFydHMgPSB1cmwucGFyc2UocmVkaXJlY3RVcmwpO1xuICBPYmplY3QuYXNzaWduKHRoaXMuX29wdGlvbnMsIHJlZGlyZWN0VXJsUGFydHMpO1xuXG4gIC8vIERyb3AgY29uZmlkZW50aWFsIGhlYWRlcnMgd2hlbiByZWRpcmVjdGluZyB0byBhIGxlc3Mgc2VjdXJlIHByb3RvY29sXG4gIC8vIG9yIHRvIGEgZGlmZmVyZW50IGRvbWFpbiB0aGF0IGlzIG5vdCBhIHN1cGVyZG9tYWluXG4gIGlmIChyZWRpcmVjdFVybFBhcnRzLnByb3RvY29sICE9PSBjdXJyZW50VXJsUGFydHMucHJvdG9jb2wgJiZcbiAgICAgcmVkaXJlY3RVcmxQYXJ0cy5wcm90b2NvbCAhPT0gXCJodHRwczpcIiB8fFxuICAgICByZWRpcmVjdFVybFBhcnRzLmhvc3QgIT09IGN1cnJlbnRIb3N0ICYmXG4gICAgICFpc1N1YmRvbWFpbihyZWRpcmVjdFVybFBhcnRzLmhvc3QsIGN1cnJlbnRIb3N0KSkge1xuICAgIHJlbW92ZU1hdGNoaW5nSGVhZGVycygvXig/OmF1dGhvcml6YXRpb258Y29va2llKSQvaSwgdGhpcy5fb3B0aW9ucy5oZWFkZXJzKTtcbiAgfVxuXG4gIC8vIEV2YWx1YXRlIHRoZSBiZWZvcmVSZWRpcmVjdCBjYWxsYmFja1xuICBpZiAodHlwZW9mIGJlZm9yZVJlZGlyZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgcmVzcG9uc2VEZXRhaWxzID0ge1xuICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgIHN0YXR1c0NvZGU6IHN0YXR1c0NvZGUsXG4gICAgfTtcbiAgICB2YXIgcmVxdWVzdERldGFpbHMgPSB7XG4gICAgICB1cmw6IGN1cnJlbnRVcmwsXG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGJlZm9yZVJlZGlyZWN0KHRoaXMuX29wdGlvbnMsIHJlc3BvbnNlRGV0YWlscywgcmVxdWVzdERldGFpbHMpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zYW5pdGl6ZU9wdGlvbnModGhpcy5fb3B0aW9ucyk7XG4gIH1cblxuICAvLyBQZXJmb3JtIHRoZSByZWRpcmVjdGVkIHJlcXVlc3RcbiAgdHJ5IHtcbiAgICB0aGlzLl9wZXJmb3JtUmVxdWVzdCgpO1xuICB9XG4gIGNhdGNoIChjYXVzZSkge1xuICAgIHRoaXMuZW1pdChcImVycm9yXCIsIG5ldyBSZWRpcmVjdGlvbkVycm9yKGNhdXNlKSk7XG4gIH1cbn07XG5cbi8vIFdyYXBzIHRoZSBrZXkvdmFsdWUgb2JqZWN0IG9mIHByb3RvY29scyB3aXRoIHJlZGlyZWN0IGZ1bmN0aW9uYWxpdHlcbmZ1bmN0aW9uIHdyYXAocHJvdG9jb2xzKSB7XG4gIC8vIERlZmF1bHQgc2V0dGluZ3NcbiAgdmFyIGV4cG9ydHMgPSB7XG4gICAgbWF4UmVkaXJlY3RzOiAyMSxcbiAgICBtYXhCb2R5TGVuZ3RoOiAxMCAqIDEwMjQgKiAxMDI0LFxuICB9O1xuXG4gIC8vIFdyYXAgZWFjaCBwcm90b2NvbFxuICB2YXIgbmF0aXZlUHJvdG9jb2xzID0ge307XG4gIE9iamVjdC5rZXlzKHByb3RvY29scykuZm9yRWFjaChmdW5jdGlvbiAoc2NoZW1lKSB7XG4gICAgdmFyIHByb3RvY29sID0gc2NoZW1lICsgXCI6XCI7XG4gICAgdmFyIG5hdGl2ZVByb3RvY29sID0gbmF0aXZlUHJvdG9jb2xzW3Byb3RvY29sXSA9IHByb3RvY29sc1tzY2hlbWVdO1xuICAgIHZhciB3cmFwcGVkUHJvdG9jb2wgPSBleHBvcnRzW3NjaGVtZV0gPSBPYmplY3QuY3JlYXRlKG5hdGl2ZVByb3RvY29sKTtcblxuICAgIC8vIEV4ZWN1dGVzIGEgcmVxdWVzdCwgZm9sbG93aW5nIHJlZGlyZWN0c1xuICAgIGZ1bmN0aW9uIHJlcXVlc3QoaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAvLyBQYXJzZSBwYXJhbWV0ZXJzXG4gICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHZhciB1cmxTdHIgPSBpbnB1dDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbnB1dCA9IHVybFRvT3B0aW9ucyhuZXcgVVJMJDEodXJsU3RyKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgaW5wdXQgPSB1cmwucGFyc2UodXJsU3RyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoVVJMJDEgJiYgKGlucHV0IGluc3RhbmNlb2YgVVJMJDEpKSB7XG4gICAgICAgIGlucHV0ID0gdXJsVG9PcHRpb25zKGlucHV0KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMgPSBpbnB1dDtcbiAgICAgICAgaW5wdXQgPSB7IHByb3RvY29sOiBwcm90b2NvbCB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICBvcHRpb25zID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIG1heFJlZGlyZWN0czogZXhwb3J0cy5tYXhSZWRpcmVjdHMsXG4gICAgICAgIG1heEJvZHlMZW5ndGg6IGV4cG9ydHMubWF4Qm9keUxlbmd0aCxcbiAgICAgIH0sIGlucHV0LCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMubmF0aXZlUHJvdG9jb2xzID0gbmF0aXZlUHJvdG9jb2xzO1xuXG4gICAgICBhc3NlcnQuZXF1YWwob3B0aW9ucy5wcm90b2NvbCwgcHJvdG9jb2wsIFwicHJvdG9jb2wgbWlzbWF0Y2hcIik7XG4gICAgICBkZWJ1ZyQyKFwib3B0aW9uc1wiLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiBuZXcgUmVkaXJlY3RhYmxlUmVxdWVzdChvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZXMgYSBHRVQgcmVxdWVzdCwgZm9sbG93aW5nIHJlZGlyZWN0c1xuICAgIGZ1bmN0aW9uIGdldChpbnB1dCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgIHZhciB3cmFwcGVkUmVxdWVzdCA9IHdyYXBwZWRQcm90b2NvbC5yZXF1ZXN0KGlucHV0LCBvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgICB3cmFwcGVkUmVxdWVzdC5lbmQoKTtcbiAgICAgIHJldHVybiB3cmFwcGVkUmVxdWVzdDtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgdGhlIHByb3BlcnRpZXMgb24gdGhlIHdyYXBwZWQgcHJvdG9jb2xcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3cmFwcGVkUHJvdG9jb2wsIHtcbiAgICAgIHJlcXVlc3Q6IHsgdmFsdWU6IHJlcXVlc3QsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSxcbiAgICAgIGdldDogeyB2YWx1ZTogZ2V0LCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0sXG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gZXhwb3J0cztcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIG5vb3AkMSgpIHsgLyogZW1wdHkgKi8gfVxuXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL21hc3Rlci9saWIvaW50ZXJuYWwvdXJsLmpzXG5mdW5jdGlvbiB1cmxUb09wdGlvbnModXJsT2JqZWN0KSB7XG4gIHZhciBvcHRpb25zID0ge1xuICAgIHByb3RvY29sOiB1cmxPYmplY3QucHJvdG9jb2wsXG4gICAgaG9zdG5hbWU6IHVybE9iamVjdC5ob3N0bmFtZS5zdGFydHNXaXRoKFwiW1wiKSA/XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgdXJsT2JqZWN0Lmhvc3RuYW1lLnNsaWNlKDEsIC0xKSA6XG4gICAgICB1cmxPYmplY3QuaG9zdG5hbWUsXG4gICAgaGFzaDogdXJsT2JqZWN0Lmhhc2gsXG4gICAgc2VhcmNoOiB1cmxPYmplY3Quc2VhcmNoLFxuICAgIHBhdGhuYW1lOiB1cmxPYmplY3QucGF0aG5hbWUsXG4gICAgcGF0aDogdXJsT2JqZWN0LnBhdGhuYW1lICsgdXJsT2JqZWN0LnNlYXJjaCxcbiAgICBocmVmOiB1cmxPYmplY3QuaHJlZixcbiAgfTtcbiAgaWYgKHVybE9iamVjdC5wb3J0ICE9PSBcIlwiKSB7XG4gICAgb3B0aW9ucy5wb3J0ID0gTnVtYmVyKHVybE9iamVjdC5wb3J0KTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTWF0Y2hpbmdIZWFkZXJzKHJlZ2V4LCBoZWFkZXJzKSB7XG4gIHZhciBsYXN0VmFsdWU7XG4gIGZvciAodmFyIGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgaWYgKHJlZ2V4LnRlc3QoaGVhZGVyKSkge1xuICAgICAgbGFzdFZhbHVlID0gaGVhZGVyc1toZWFkZXJdO1xuICAgICAgZGVsZXRlIGhlYWRlcnNbaGVhZGVyXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChsYXN0VmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGxhc3RWYWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgP1xuICAgIHVuZGVmaW5lZCA6IFN0cmluZyhsYXN0VmFsdWUpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JUeXBlKGNvZGUsIGRlZmF1bHRNZXNzYWdlKSB7XG4gIGZ1bmN0aW9uIEN1c3RvbUVycm9yKGNhdXNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgaWYgKCFjYXVzZSkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gZGVmYXVsdE1lc3NhZ2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5tZXNzYWdlID0gZGVmYXVsdE1lc3NhZ2UgKyBcIjogXCIgKyBjYXVzZS5tZXNzYWdlO1xuICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICAgIH1cbiAgfVxuICBDdXN0b21FcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTtcbiAgQ3VzdG9tRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3VzdG9tRXJyb3I7XG4gIEN1c3RvbUVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJFcnJvciBbXCIgKyBjb2RlICsgXCJdXCI7XG4gIEN1c3RvbUVycm9yLnByb3RvdHlwZS5jb2RlID0gY29kZTtcbiAgcmV0dXJuIEN1c3RvbUVycm9yO1xufVxuXG5mdW5jdGlvbiBhYm9ydFJlcXVlc3QocmVxdWVzdCkge1xuICBmb3IgKHZhciBlID0gMDsgZSA8IGV2ZW50cy5sZW5ndGg7IGUrKykge1xuICAgIHJlcXVlc3QucmVtb3ZlTGlzdGVuZXIoZXZlbnRzW2VdLCBldmVudEhhbmRsZXJzW2V2ZW50c1tlXV0pO1xuICB9XG4gIHJlcXVlc3Qub24oXCJlcnJvclwiLCBub29wJDEpO1xuICByZXF1ZXN0LmFib3J0KCk7XG59XG5cbmZ1bmN0aW9uIGlzU3ViZG9tYWluKHN1YmRvbWFpbiwgZG9tYWluKSB7XG4gIGNvbnN0IGRvdCA9IHN1YmRvbWFpbi5sZW5ndGggLSBkb21haW4ubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGRvdCA+IDAgJiYgc3ViZG9tYWluW2RvdF0gPT09IFwiLlwiICYmIHN1YmRvbWFpbi5lbmRzV2l0aChkb21haW4pO1xufVxuXG4vLyBFeHBvcnRzXG5mb2xsb3dSZWRpcmVjdHMkMS5leHBvcnRzID0gd3JhcCh7IGh0dHA6IGh0dHAkMSwgaHR0cHM6IGh0dHBzJDEgfSk7XG5mb2xsb3dSZWRpcmVjdHNFeHBvcnRzLndyYXAgPSB3cmFwO1xuXG52YXIgaHR0cE5hdGl2ZSAgID0gcmVxdWlyZSQkMSQxLFxuICAgIGh0dHBzTmF0aXZlICA9IHJlcXVpcmUkJDEkMixcbiAgICB3ZWJfbyAgPSB3ZWJPdXRnb2luZyxcbiAgICBjb21tb24kMSA9IGNvbW1vbiQzLFxuICAgIGZvbGxvd1JlZGlyZWN0cyA9IGZvbGxvd1JlZGlyZWN0c0V4cG9ydHM7XG5cbndlYl9vID0gT2JqZWN0LmtleXMod2ViX28pLm1hcChmdW5jdGlvbihwYXNzKSB7XG4gIHJldHVybiB3ZWJfb1twYXNzXTtcbn0pO1xuXG52YXIgbmF0aXZlQWdlbnRzID0geyBodHRwOiBodHRwTmF0aXZlLCBodHRwczogaHR0cHNOYXRpdmUgfTtcblxuLyohXG4gKiBBcnJheSBvZiBwYXNzZXMuXG4gKlxuICogQSBgcGFzc2AgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgb24gYHJlcSwgcmVzLCBvcHRpb25zYFxuICogc28gdGhhdCB5b3UgY2FuIGVhc2lseSBhZGQgbmV3IGNoZWNrcyB3aGlsZSBzdGlsbCBrZWVwaW5nIHRoZSBiYXNlXG4gKiBmbGV4aWJsZS5cbiAqL1xuXG5cbnZhciB3ZWJJbmNvbWluZyA9IHtcblxuICAvKipcbiAgICogU2V0cyBgY29udGVudC1sZW5ndGhgIHRvICcwJyBpZiByZXF1ZXN0IGlzIG9mIERFTEVURSB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7SW5jb21pbmdNZXNzYWdlfSBSZXMgUmVzcG9uc2Ugb2JqZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIENvbmZpZyBvYmplY3QgcGFzc2VkIHRvIHRoZSBwcm94eVxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgZGVsZXRlTGVuZ3RoOiBmdW5jdGlvbiBkZWxldGVMZW5ndGgocmVxLCByZXMsIG9wdGlvbnMpIHtcbiAgICBpZigocmVxLm1ldGhvZCA9PT0gJ0RFTEVURScgfHwgcmVxLm1ldGhvZCA9PT0gJ09QVElPTlMnKVxuICAgICAgICYmICFyZXEuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSkge1xuICAgICAgcmVxLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPSAnMCc7XG4gICAgICBkZWxldGUgcmVxLmhlYWRlcnNbJ3RyYW5zZmVyLWVuY29kaW5nJ107XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIHRpbWVvdXQgaW4gcmVxdWVzdCBzb2NrZXQgaWYgaXQgd2FzIHNwZWNpZmllZCBpbiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7SW5jb21pbmdNZXNzYWdlfSBSZXMgUmVzcG9uc2Ugb2JqZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIENvbmZpZyBvYmplY3QgcGFzc2VkIHRvIHRoZSBwcm94eVxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgdGltZW91dDogZnVuY3Rpb24gdGltZW91dChyZXEsIHJlcywgb3B0aW9ucykge1xuICAgIGlmKG9wdGlvbnMudGltZW91dCkge1xuICAgICAgcmVxLnNvY2tldC5zZXRUaW1lb3V0KG9wdGlvbnMudGltZW91dCk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGB4LWZvcndhcmRlZC0qYCBoZWFkZXJzIGlmIHNwZWNpZmllZCBpbiBjb25maWcuXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3Qgb2JqZWN0XG4gICAqXHUwMEEwQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IFJlcyBSZXNwb25zZSBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBYSGVhZGVyczogZnVuY3Rpb24gWEhlYWRlcnMocmVxLCByZXMsIG9wdGlvbnMpIHtcbiAgICBpZighb3B0aW9ucy54ZndkKSByZXR1cm47XG5cbiAgICB2YXIgZW5jcnlwdGVkID0gcmVxLmlzU3BkeSB8fCBjb21tb24kMS5oYXNFbmNyeXB0ZWRDb25uZWN0aW9uKHJlcSk7XG4gICAgdmFyIHZhbHVlcyA9IHtcbiAgICAgIGZvciAgOiByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzIHx8IHJlcS5zb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICAgIHBvcnQgOiBjb21tb24kMS5nZXRQb3J0KHJlcSksXG4gICAgICBwcm90bzogZW5jcnlwdGVkID8gJ2h0dHBzJyA6ICdodHRwJ1xuICAgIH07XG5cbiAgICBbJ2ZvcicsICdwb3J0JywgJ3Byb3RvJ10uZm9yRWFjaChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC0nICsgaGVhZGVyXSA9XG4gICAgICAgIChyZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtJyArIGhlYWRlcl0gfHwgJycpICtcbiAgICAgICAgKHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC0nICsgaGVhZGVyXSA/ICcsJyA6ICcnKSArXG4gICAgICAgIHZhbHVlc1toZWFkZXJdO1xuICAgIH0pO1xuXG4gICAgcmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWhvc3QnXSA9IHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC1ob3N0J10gfHwgcmVxLmhlYWRlcnNbJ2hvc3QnXSB8fCAnJztcbiAgfSxcblxuICAvKipcbiAgICogRG9lcyB0aGUgYWN0dWFsIHByb3h5aW5nLiBJZiBgZm9yd2FyZGAgaXMgZW5hYmxlZCBmaXJlcyB1cFxuICAgKiBhIEZvcndhcmRTdHJlYW0sIHNhbWUgaGFwcGVucyBmb3IgUHJveHlTdHJlYW0uIFRoZSByZXF1ZXN0XG4gICAqIGp1c3QgZGllcyBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3Qgb2JqZWN0XG4gICAqXHUwMEEwQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IFJlcyBSZXNwb25zZSBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBzdHJlYW06IGZ1bmN0aW9uIHN0cmVhbShyZXEsIHJlcywgb3B0aW9ucywgXywgc2VydmVyLCBjbGIpIHtcblxuICAgIC8vIEFuZCB3ZSBiZWdpbiFcbiAgICBzZXJ2ZXIuZW1pdCgnc3RhcnQnLCByZXEsIHJlcywgb3B0aW9ucy50YXJnZXQgfHwgb3B0aW9ucy5mb3J3YXJkKTtcblxuICAgIHZhciBhZ2VudHMgPSBvcHRpb25zLmZvbGxvd1JlZGlyZWN0cyA/IGZvbGxvd1JlZGlyZWN0cyA6IG5hdGl2ZUFnZW50cztcbiAgICB2YXIgaHR0cCA9IGFnZW50cy5odHRwO1xuICAgIHZhciBodHRwcyA9IGFnZW50cy5odHRwcztcblxuICAgIGlmKG9wdGlvbnMuZm9yd2FyZCkge1xuICAgICAgLy8gSWYgZm9yd2FyZCBlbmFibGUsIHNvIGp1c3QgcGlwZSB0aGUgcmVxdWVzdFxuICAgICAgdmFyIGZvcndhcmRSZXEgPSAob3B0aW9ucy5mb3J3YXJkLnByb3RvY29sID09PSAnaHR0cHM6JyA/IGh0dHBzIDogaHR0cCkucmVxdWVzdChcbiAgICAgICAgY29tbW9uJDEuc2V0dXBPdXRnb2luZyhvcHRpb25zLnNzbCB8fCB7fSwgb3B0aW9ucywgcmVxLCAnZm9yd2FyZCcpXG4gICAgICApO1xuXG4gICAgICAvLyBlcnJvciBoYW5kbGVyIChlLmcuIEVDT05OUkVTRVQsIEVDT05OUkVGVVNFRClcbiAgICAgIC8vIEhhbmRsZSBlcnJvcnMgb24gaW5jb21pbmcgcmVxdWVzdCBhcyB3ZWxsIGFzIGl0IG1ha2VzIHNlbnNlIHRvXG4gICAgICB2YXIgZm9yd2FyZEVycm9yID0gY3JlYXRlRXJyb3JIYW5kbGVyKGZvcndhcmRSZXEsIG9wdGlvbnMuZm9yd2FyZCk7XG4gICAgICByZXEub24oJ2Vycm9yJywgZm9yd2FyZEVycm9yKTtcbiAgICAgIGZvcndhcmRSZXEub24oJ2Vycm9yJywgZm9yd2FyZEVycm9yKTtcblxuICAgICAgKG9wdGlvbnMuYnVmZmVyIHx8IHJlcSkucGlwZShmb3J3YXJkUmVxKTtcbiAgICAgIGlmKCFvcHRpb25zLnRhcmdldCkgeyByZXR1cm4gcmVzLmVuZCgpOyB9XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBpbml0YWxpemF0aW9uXG4gICAgdmFyIHByb3h5UmVxID0gKG9wdGlvbnMudGFyZ2V0LnByb3RvY29sID09PSAnaHR0cHM6JyA/IGh0dHBzIDogaHR0cCkucmVxdWVzdChcbiAgICAgIGNvbW1vbiQxLnNldHVwT3V0Z29pbmcob3B0aW9ucy5zc2wgfHwge30sIG9wdGlvbnMsIHJlcSlcbiAgICApO1xuXG4gICAgLy8gRW5hYmxlIGRldmVsb3BlcnMgdG8gbW9kaWZ5IHRoZSBwcm94eVJlcSBiZWZvcmUgaGVhZGVycyBhcmUgc2VudFxuICAgIHByb3h5UmVxLm9uKCdzb2NrZXQnLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICAgIGlmKHNlcnZlciAmJiAhcHJveHlSZXEuZ2V0SGVhZGVyKCdleHBlY3QnKSkge1xuICAgICAgICBzZXJ2ZXIuZW1pdCgncHJveHlSZXEnLCBwcm94eVJlcSwgcmVxLCByZXMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gYWxsb3cgb3V0Z29pbmcgc29ja2V0IHRvIHRpbWVvdXQgc28gdGhhdCB3ZSBjb3VsZFxuICAgIC8vIHNob3cgYW4gZXJyb3IgcGFnZSBhdCB0aGUgaW5pdGlhbCByZXF1ZXN0XG4gICAgaWYob3B0aW9ucy5wcm94eVRpbWVvdXQpIHtcbiAgICAgIHByb3h5UmVxLnNldFRpbWVvdXQob3B0aW9ucy5wcm94eVRpbWVvdXQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgcHJveHlSZXEuYWJvcnQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB3ZSBhYm9ydCBwcm94eSBpZiByZXF1ZXN0IGlzIGFib3J0ZWRcbiAgICByZXEub24oJ2Fib3J0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm94eVJlcS5hYm9ydCgpO1xuICAgIH0pO1xuXG4gICAgLy8gaGFuZGxlIGVycm9ycyBpbiBwcm94eSBhbmQgaW5jb21pbmcgcmVxdWVzdCwganVzdCBsaWtlIGZvciBmb3J3YXJkIHByb3h5XG4gICAgdmFyIHByb3h5RXJyb3IgPSBjcmVhdGVFcnJvckhhbmRsZXIocHJveHlSZXEsIG9wdGlvbnMudGFyZ2V0KTtcbiAgICByZXEub24oJ2Vycm9yJywgcHJveHlFcnJvcik7XG4gICAgcHJveHlSZXEub24oJ2Vycm9yJywgcHJveHlFcnJvcik7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVFcnJvckhhbmRsZXIocHJveHlSZXEsIHVybCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHByb3h5RXJyb3IoZXJyKSB7XG4gICAgICAgIGlmIChyZXEuc29ja2V0LmRlc3Ryb3llZCAmJiBlcnIuY29kZSA9PT0gJ0VDT05OUkVTRVQnKSB7XG4gICAgICAgICAgc2VydmVyLmVtaXQoJ2Vjb25ucmVzZXQnLCBlcnIsIHJlcSwgcmVzLCB1cmwpO1xuICAgICAgICAgIHJldHVybiBwcm94eVJlcS5hYm9ydCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsYikge1xuICAgICAgICAgIGNsYihlcnIsIHJlcSwgcmVzLCB1cmwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlcnZlci5lbWl0KCdlcnJvcicsIGVyciwgcmVxLCByZXMsIHVybCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAob3B0aW9ucy5idWZmZXIgfHwgcmVxKS5waXBlKHByb3h5UmVxKTtcblxuICAgIHByb3h5UmVxLm9uKCdyZXNwb25zZScsIGZ1bmN0aW9uKHByb3h5UmVzKSB7XG4gICAgICBpZihzZXJ2ZXIpIHsgc2VydmVyLmVtaXQoJ3Byb3h5UmVzJywgcHJveHlSZXMsIHJlcSwgcmVzKTsgfVxuXG4gICAgICBpZighcmVzLmhlYWRlcnNTZW50ICYmICFvcHRpb25zLnNlbGZIYW5kbGVSZXNwb25zZSkge1xuICAgICAgICBmb3IodmFyIGk9MDsgaSA8IHdlYl9vLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYod2ViX29baV0ocmVxLCByZXMsIHByb3h5UmVzLCBvcHRpb25zKSkgeyBicmVhazsgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzLmZpbmlzaGVkKSB7XG4gICAgICAgIC8vIEFsbG93IHVzIHRvIGxpc3RlbiB3aGVuIHRoZSBwcm94eSBoYXMgY29tcGxldGVkXG4gICAgICAgIHByb3h5UmVzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHNlcnZlcikgc2VydmVyLmVtaXQoJ2VuZCcsIHJlcSwgcmVzLCBwcm94eVJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBXZSBwaXBlIHRvIHRoZSByZXNwb25zZSB1bmxlc3MgaXRzIGV4cGVjdGVkIHRvIGJlIGhhbmRsZWQgYnkgdGhlIHVzZXJcbiAgICAgICAgaWYgKCFvcHRpb25zLnNlbGZIYW5kbGVSZXNwb25zZSkgcHJveHlSZXMucGlwZShyZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNlcnZlcikgc2VydmVyLmVtaXQoJ2VuZCcsIHJlcSwgcmVzLCBwcm94eVJlcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxufTtcblxudmFyIGh0dHAgICA9IHJlcXVpcmUkJDEkMSxcbiAgICBodHRwcyAgPSByZXF1aXJlJCQxJDIsXG4gICAgY29tbW9uID0gY29tbW9uJDM7XG5cbi8qIVxuICogQXJyYXkgb2YgcGFzc2VzLlxuICpcbiAqIEEgYHBhc3NgIGlzIGp1c3QgYSBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIG9uIGByZXEsIHNvY2tldCwgb3B0aW9uc2BcbiAqIHNvIHRoYXQgeW91IGNhbiBlYXNpbHkgYWRkIG5ldyBjaGVja3Mgd2hpbGUgc3RpbGwga2VlcGluZyB0aGUgYmFzZVxuICogZmxleGlibGUuXG4gKi9cblxuLypcbiAqIFdlYnNvY2tldHMgUGFzc2VzXG4gKlxuICovXG5cblxudmFyIHdzSW5jb21pbmcgPSB7XG4gIC8qKlxuICAgKiBXZWJTb2NrZXQgcmVxdWVzdHMgbXVzdCBoYXZlIHRoZSBgR0VUYCBtZXRob2QgYW5kXG4gICAqIHRoZSBgdXBncmFkZTp3ZWJzb2NrZXRgIGhlYWRlclxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7U29ja2V0fSBXZWJzb2NrZXRcbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGNoZWNrTWV0aG9kQW5kSGVhZGVyIDogZnVuY3Rpb24gY2hlY2tNZXRob2RBbmRIZWFkZXIocmVxLCBzb2NrZXQpIHtcbiAgICBpZiAocmVxLm1ldGhvZCAhPT0gJ0dFVCcgfHwgIXJlcS5oZWFkZXJzLnVwZ3JhZGUpIHtcbiAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocmVxLmhlYWRlcnMudXBncmFkZS50b0xvd2VyQ2FzZSgpICE9PSAnd2Vic29ja2V0Jykge1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBgeC1mb3J3YXJkZWQtKmAgaGVhZGVycyBpZiBzcGVjaWZpZWQgaW4gY29uZmlnLlxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7U29ja2V0fSBXZWJzb2NrZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBYSGVhZGVycyA6IGZ1bmN0aW9uIFhIZWFkZXJzKHJlcSwgc29ja2V0LCBvcHRpb25zKSB7XG4gICAgaWYoIW9wdGlvbnMueGZ3ZCkgcmV0dXJuO1xuXG4gICAgdmFyIHZhbHVlcyA9IHtcbiAgICAgIGZvciAgOiByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzIHx8IHJlcS5zb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICAgIHBvcnQgOiBjb21tb24uZ2V0UG9ydChyZXEpLFxuICAgICAgcHJvdG86IGNvbW1vbi5oYXNFbmNyeXB0ZWRDb25uZWN0aW9uKHJlcSkgPyAnd3NzJyA6ICd3cydcbiAgICB9O1xuXG4gICAgWydmb3InLCAncG9ydCcsICdwcm90byddLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtJyArIGhlYWRlcl0gPVxuICAgICAgICAocmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLScgKyBoZWFkZXJdIHx8ICcnKSArXG4gICAgICAgIChyZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtJyArIGhlYWRlcl0gPyAnLCcgOiAnJykgK1xuICAgICAgICB2YWx1ZXNbaGVhZGVyXTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogRG9lcyB0aGUgYWN0dWFsIHByb3h5aW5nLiBNYWtlIHRoZSByZXF1ZXN0IGFuZCB1cGdyYWRlIGl0XG4gICAqIHNlbmQgdGhlIFN3aXRjaGluZyBQcm90b2NvbHMgcmVxdWVzdCBhbmQgcGlwZSB0aGUgc29ja2V0cy5cbiAgICpcbiAgICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBvYmplY3RcbiAgICpcdTAwQTBAcGFyYW0ge1NvY2tldH0gV2Vic29ja2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIENvbmZpZyBvYmplY3QgcGFzc2VkIHRvIHRoZSBwcm94eVxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIHN0cmVhbSA6IGZ1bmN0aW9uIHN0cmVhbShyZXEsIHNvY2tldCwgb3B0aW9ucywgaGVhZCwgc2VydmVyLCBjbGIpIHtcblxuICAgIHZhciBjcmVhdGVIdHRwSGVhZGVyID0gZnVuY3Rpb24obGluZSwgaGVhZGVycykge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGhlYWRlcnMpLnJlZHVjZShmdW5jdGlvbiAoaGVhZCwga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGhlYWRlcnNba2V5XTtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgaGVhZC5wdXNoKGtleSArICc6ICcgKyB2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGhlYWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaGVhZC5wdXNoKGtleSArICc6ICcgKyB2YWx1ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWQ7XG4gICAgICB9LCBbbGluZV0pXG4gICAgICAuam9pbignXFxyXFxuJykgKyAnXFxyXFxuXFxyXFxuJztcbiAgICB9O1xuXG4gICAgY29tbW9uLnNldHVwU29ja2V0KHNvY2tldCk7XG5cbiAgICBpZiAoaGVhZCAmJiBoZWFkLmxlbmd0aCkgc29ja2V0LnVuc2hpZnQoaGVhZCk7XG5cblxuICAgIHZhciBwcm94eVJlcSA9IChjb21tb24uaXNTU0wudGVzdChvcHRpb25zLnRhcmdldC5wcm90b2NvbCkgPyBodHRwcyA6IGh0dHApLnJlcXVlc3QoXG4gICAgICBjb21tb24uc2V0dXBPdXRnb2luZyhvcHRpb25zLnNzbCB8fCB7fSwgb3B0aW9ucywgcmVxKVxuICAgICk7XG5cbiAgICAvLyBFbmFibGUgZGV2ZWxvcGVycyB0byBtb2RpZnkgdGhlIHByb3h5UmVxIGJlZm9yZSBoZWFkZXJzIGFyZSBzZW50XG4gICAgaWYgKHNlcnZlcikgeyBzZXJ2ZXIuZW1pdCgncHJveHlSZXFXcycsIHByb3h5UmVxLCByZXEsIHNvY2tldCwgb3B0aW9ucywgaGVhZCk7IH1cblxuICAgIC8vIEVycm9yIEhhbmRsZXJcbiAgICBwcm94eVJlcS5vbignZXJyb3InLCBvbk91dGdvaW5nRXJyb3IpO1xuICAgIHByb3h5UmVxLm9uKCdyZXNwb25zZScsIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIC8vIGlmIHVwZ3JhZGUgZXZlbnQgaXNuJ3QgZ29pbmcgdG8gaGFwcGVuLCBjbG9zZSB0aGUgc29ja2V0XG4gICAgICBpZiAoIXJlcy51cGdyYWRlKSB7XG4gICAgICAgIHNvY2tldC53cml0ZShjcmVhdGVIdHRwSGVhZGVyKCdIVFRQLycgKyByZXMuaHR0cFZlcnNpb24gKyAnICcgKyByZXMuc3RhdHVzQ29kZSArICcgJyArIHJlcy5zdGF0dXNNZXNzYWdlLCByZXMuaGVhZGVycykpO1xuICAgICAgICByZXMucGlwZShzb2NrZXQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcHJveHlSZXEub24oJ3VwZ3JhZGUnLCBmdW5jdGlvbihwcm94eVJlcywgcHJveHlTb2NrZXQsIHByb3h5SGVhZCkge1xuICAgICAgcHJveHlTb2NrZXQub24oJ2Vycm9yJywgb25PdXRnb2luZ0Vycm9yKTtcblxuICAgICAgLy8gQWxsb3cgdXMgdG8gbGlzdGVuIHdoZW4gdGhlIHdlYnNvY2tldCBoYXMgY29tcGxldGVkXG4gICAgICBwcm94eVNvY2tldC5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXJ2ZXIuZW1pdCgnY2xvc2UnLCBwcm94eVJlcywgcHJveHlTb2NrZXQsIHByb3h5SGVhZCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIHBpcGUgYmVsb3cgd2lsbCBlbmQgcHJveHlTb2NrZXQgaWYgc29ja2V0IGNsb3NlcyBjbGVhbmx5LCBidXQgbm90XG4gICAgICAvLyBpZiBpdCBlcnJvcnMgKGVnLCB2YW5pc2hlcyBmcm9tIHRoZSBuZXQgYW5kIHN0YXJ0cyByZXR1cm5pbmdcbiAgICAgIC8vIEVIT1NUVU5SRUFDSCkuIFdlIG5lZWQgdG8gZG8gdGhhdCBleHBsaWNpdGx5LlxuICAgICAgc29ja2V0Lm9uKCdlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcHJveHlTb2NrZXQuZW5kKCk7XG4gICAgICB9KTtcblxuICAgICAgY29tbW9uLnNldHVwU29ja2V0KHByb3h5U29ja2V0KTtcblxuICAgICAgaWYgKHByb3h5SGVhZCAmJiBwcm94eUhlYWQubGVuZ3RoKSBwcm94eVNvY2tldC51bnNoaWZ0KHByb3h5SGVhZCk7XG5cbiAgICAgIC8vXG4gICAgICAvLyBSZW1hcms6IEhhbmRsZSB3cml0aW5nIHRoZSBoZWFkZXJzIHRvIHRoZSBzb2NrZXQgd2hlbiBzd2l0Y2hpbmcgcHJvdG9jb2xzXG4gICAgICAvLyBBbHNvIGhhbmRsZXMgd2hlbiBhIGhlYWRlciBpcyBhbiBhcnJheVxuICAgICAgLy9cbiAgICAgIHNvY2tldC53cml0ZShjcmVhdGVIdHRwSGVhZGVyKCdIVFRQLzEuMSAxMDEgU3dpdGNoaW5nIFByb3RvY29scycsIHByb3h5UmVzLmhlYWRlcnMpKTtcblxuICAgICAgcHJveHlTb2NrZXQucGlwZShzb2NrZXQpLnBpcGUocHJveHlTb2NrZXQpO1xuXG4gICAgICBzZXJ2ZXIuZW1pdCgnb3BlbicsIHByb3h5U29ja2V0KTtcbiAgICAgIHNlcnZlci5lbWl0KCdwcm94eVNvY2tldCcsIHByb3h5U29ja2V0KTsgIC8vREVQUkVDQVRFRC5cbiAgICB9KTtcblxuICAgIHJldHVybiBwcm94eVJlcS5lbmQoKTsgLy8gWFhYOiBDSEVDSyBJRiBUSElTIElTIFRISVMgQ09SUkVDVFxuXG4gICAgZnVuY3Rpb24gb25PdXRnb2luZ0Vycm9yKGVycikge1xuICAgICAgaWYgKGNsYikge1xuICAgICAgICBjbGIoZXJyLCByZXEsIHNvY2tldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIuZW1pdCgnZXJyb3InLCBlcnIsIHJlcSwgc29ja2V0KTtcbiAgICAgIH1cbiAgICAgIHNvY2tldC5lbmQoKTtcbiAgICB9XG4gIH1cbn07XG5cbihmdW5jdGlvbiAobW9kdWxlKSB7XG5cdHZhciBodHRwUHJveHkgPSBtb2R1bGUuZXhwb3J0cyxcblx0ICAgIGV4dGVuZCAgICA9IHJlcXVpcmUkJDAkNi5fZXh0ZW5kLFxuXHQgICAgcGFyc2VfdXJsID0gcmVxdWlyZSQkMCQ5LnBhcnNlLFxuXHQgICAgRUUzICAgICAgID0gZXZlbnRlbWl0dGVyM0V4cG9ydHMsXG5cdCAgICBodHRwICAgICAgPSByZXF1aXJlJCQxJDEsXG5cdCAgICBodHRwcyAgICAgPSByZXF1aXJlJCQxJDIsXG5cdCAgICB3ZWIgICAgICAgPSB3ZWJJbmNvbWluZyxcblx0ICAgIHdzICAgICAgICA9IHdzSW5jb21pbmc7XG5cblx0aHR0cFByb3h5LlNlcnZlciA9IFByb3h5U2VydmVyO1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZSBsb2FkZXIgZm9yXG5cdCAqIGVpdGhlciBgd3NgIG9yIGB3ZWJgJ3MgIHBhc3Nlcy5cblx0ICpcblx0ICogRXhhbXBsZXM6XG5cdCAqXG5cdCAqICAgIGh0dHBQcm94eS5jcmVhdGVSaWdodFByb3h5KCd3cycpXG5cdCAqICAgIC8vID0+IFtGdW5jdGlvbl1cblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd9IFR5cGUgRWl0aGVyICd3cycgb3IgJ3dlYidcblx0ICpcdTAwQTBcblx0ICogQHJldHVybiB7RnVuY3Rpb259IExvYWRlciBGdW5jdGlvbiB0aGF0IHdoZW4gY2FsbGVkIHJldHVybnMgYW4gaXRlcmF0b3IgZm9yIHRoZSByaWdodCBwYXNzZXNcblx0ICpcblx0ICogQGFwaSBwcml2YXRlXG5cdCAqL1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZVJpZ2h0UHJveHkodHlwZSkge1xuXG5cdCAgcmV0dXJuIGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0ICAgIHJldHVybiBmdW5jdGlvbihyZXEsIHJlcyAvKiwgW2hlYWRdLCBbb3B0c10gKi8pIHtcblx0ICAgICAgdmFyIHBhc3NlcyA9ICh0eXBlID09PSAnd3MnKSA/IHRoaXMud3NQYXNzZXMgOiB0aGlzLndlYlBhc3Nlcyxcblx0ICAgICAgICAgIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyksXG5cdCAgICAgICAgICBjbnRyID0gYXJncy5sZW5ndGggLSAxLFxuXHQgICAgICAgICAgaGVhZCwgY2JsO1xuXG5cdCAgICAgIC8qIG9wdGlvbmFsIGFyZ3MgcGFyc2UgYmVnaW4gKi9cblx0ICAgICAgaWYodHlwZW9mIGFyZ3NbY250cl0gPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICBjYmwgPSBhcmdzW2NudHJdO1xuXG5cdCAgICAgICAgY250ci0tO1xuXHQgICAgICB9XG5cblx0ICAgICAgdmFyIHJlcXVlc3RPcHRpb25zID0gb3B0aW9ucztcblx0ICAgICAgaWYoXG5cdCAgICAgICAgIShhcmdzW2NudHJdIGluc3RhbmNlb2YgQnVmZmVyKSAmJlxuXHQgICAgICAgIGFyZ3NbY250cl0gIT09IHJlc1xuXHQgICAgICApIHtcblx0ICAgICAgICAvL0NvcHkgZ2xvYmFsIG9wdGlvbnNcblx0ICAgICAgICByZXF1ZXN0T3B0aW9ucyA9IGV4dGVuZCh7fSwgb3B0aW9ucyk7XG5cdCAgICAgICAgLy9PdmVyd3JpdGUgd2l0aCByZXF1ZXN0IG9wdGlvbnNcblx0ICAgICAgICBleHRlbmQocmVxdWVzdE9wdGlvbnMsIGFyZ3NbY250cl0pO1xuXG5cdCAgICAgICAgY250ci0tO1xuXHQgICAgICB9XG5cblx0ICAgICAgaWYoYXJnc1tjbnRyXSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuXHQgICAgICAgIGhlYWQgPSBhcmdzW2NudHJdO1xuXHQgICAgICB9XG5cblx0ICAgICAgLyogb3B0aW9uYWwgYXJncyBwYXJzZSBlbmQgKi9cblxuXHQgICAgICBbJ3RhcmdldCcsICdmb3J3YXJkJ10uZm9yRWFjaChmdW5jdGlvbihlKSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0T3B0aW9uc1tlXSA9PT0gJ3N0cmluZycpXG5cdCAgICAgICAgICByZXF1ZXN0T3B0aW9uc1tlXSA9IHBhcnNlX3VybChyZXF1ZXN0T3B0aW9uc1tlXSk7XG5cdCAgICAgIH0pO1xuXG5cdCAgICAgIGlmICghcmVxdWVzdE9wdGlvbnMudGFyZ2V0ICYmICFyZXF1ZXN0T3B0aW9ucy5mb3J3YXJkKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBhIHByb3BlciBVUkwgYXMgdGFyZ2V0JykpO1xuXHQgICAgICB9XG5cblx0ICAgICAgZm9yKHZhciBpPTA7IGkgPCBwYXNzZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBDYWxsIG9mIHBhc3NlcyBmdW5jdGlvbnNcblx0ICAgICAgICAgKiBwYXNzKHJlcSwgcmVzLCBvcHRpb25zLCBoZWFkKVxuXHQgICAgICAgICAqXG5cdCAgICAgICAgICogSW4gV2ViU29ja2V0cyBjYXNlIHRoZSBgcmVzYCB2YXJpYWJsZVxuXHQgICAgICAgICAqIHJlZmVyIHRvIHRoZSBjb25uZWN0aW9uIHNvY2tldFxuXHQgICAgICAgICAqIHBhc3MocmVxLCBzb2NrZXQsIG9wdGlvbnMsIGhlYWQpXG5cdCAgICAgICAgICovXG5cdCAgICAgICAgaWYocGFzc2VzW2ldKHJlcSwgcmVzLCByZXF1ZXN0T3B0aW9ucywgaGVhZCwgdGhpcywgY2JsKSkgeyAvLyBwYXNzZXMgY2FuIHJldHVybiBhIHRydXRoeSB2YWx1ZSB0byBoYWx0IHRoZSBsb29wXG5cdCAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfTtcblx0fVxuXHRodHRwUHJveHkuY3JlYXRlUmlnaHRQcm94eSA9IGNyZWF0ZVJpZ2h0UHJveHk7XG5cblx0ZnVuY3Rpb24gUHJveHlTZXJ2ZXIob3B0aW9ucykge1xuXHQgIEVFMy5jYWxsKHRoaXMpO1xuXG5cdCAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdCAgb3B0aW9ucy5wcmVwZW5kUGF0aCA9IG9wdGlvbnMucHJlcGVuZFBhdGggPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlO1xuXG5cdCAgdGhpcy53ZWIgPSB0aGlzLnByb3h5UmVxdWVzdCAgICAgICAgICAgPSBjcmVhdGVSaWdodFByb3h5KCd3ZWInKShvcHRpb25zKTtcblx0ICB0aGlzLndzICA9IHRoaXMucHJveHlXZWJzb2NrZXRSZXF1ZXN0ICA9IGNyZWF0ZVJpZ2h0UHJveHkoJ3dzJykob3B0aW9ucyk7XG5cdCAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuXHQgIHRoaXMud2ViUGFzc2VzID0gT2JqZWN0LmtleXMod2ViKS5tYXAoZnVuY3Rpb24ocGFzcykge1xuXHQgICAgcmV0dXJuIHdlYltwYXNzXTtcblx0ICB9KTtcblxuXHQgIHRoaXMud3NQYXNzZXMgPSBPYmplY3Qua2V5cyh3cykubWFwKGZ1bmN0aW9uKHBhc3MpIHtcblx0ICAgIHJldHVybiB3c1twYXNzXTtcblx0ICB9KTtcblxuXHQgIHRoaXMub24oJ2Vycm9yJywgdGhpcy5vbkVycm9yLCB0aGlzKTtcblxuXHR9XG5cblx0cmVxdWlyZSQkMCQ2LmluaGVyaXRzKFByb3h5U2VydmVyLCBFRTMpO1xuXG5cdFByb3h5U2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGVycikge1xuXHQgIC8vXG5cdCAgLy8gUmVtYXJrOiBSZXBsaWNhdGUgbm9kZSBjb3JlIGJlaGF2aW9yIHVzaW5nIEVFM1xuXHQgIC8vIHNvIHdlIGZvcmNlIHBlb3BsZSB0byBoYW5kbGUgdGhlaXIgb3duIGVycm9yc1xuXHQgIC8vXG5cdCAgaWYodGhpcy5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoID09PSAxKSB7XG5cdCAgICB0aHJvdyBlcnI7XG5cdCAgfVxuXHR9O1xuXG5cdFByb3h5U2VydmVyLnByb3RvdHlwZS5saXN0ZW4gPSBmdW5jdGlvbihwb3J0LCBob3N0bmFtZSkge1xuXHQgIHZhciBzZWxmICAgID0gdGhpcyxcblx0ICAgICAgY2xvc3VyZSA9IGZ1bmN0aW9uKHJlcSwgcmVzKSB7IHNlbGYud2ViKHJlcSwgcmVzKTsgfTtcblxuXHQgIHRoaXMuX3NlcnZlciAgPSB0aGlzLm9wdGlvbnMuc3NsID9cblx0ICAgIGh0dHBzLmNyZWF0ZVNlcnZlcih0aGlzLm9wdGlvbnMuc3NsLCBjbG9zdXJlKSA6XG5cdCAgICBodHRwLmNyZWF0ZVNlcnZlcihjbG9zdXJlKTtcblxuXHQgIGlmKHRoaXMub3B0aW9ucy53cykge1xuXHQgICAgdGhpcy5fc2VydmVyLm9uKCd1cGdyYWRlJywgZnVuY3Rpb24ocmVxLCBzb2NrZXQsIGhlYWQpIHsgc2VsZi53cyhyZXEsIHNvY2tldCwgaGVhZCk7IH0pO1xuXHQgIH1cblxuXHQgIHRoaXMuX3NlcnZlci5saXN0ZW4ocG9ydCwgaG9zdG5hbWUpO1xuXG5cdCAgcmV0dXJuIHRoaXM7XG5cdH07XG5cblx0UHJveHlTZXJ2ZXIucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcblx0ICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgaWYgKHRoaXMuX3NlcnZlcikge1xuXHQgICAgdGhpcy5fc2VydmVyLmNsb3NlKGRvbmUpO1xuXHQgIH1cblxuXHQgIC8vIFdyYXAgY2FsbGJhY2sgdG8gbnVsbGlmeSBzZXJ2ZXIgYWZ0ZXIgYWxsIG9wZW4gY29ubmVjdGlvbnMgYXJlIGNsb3NlZC5cblx0ICBmdW5jdGlvbiBkb25lKCkge1xuXHQgICAgc2VsZi5fc2VydmVyID0gbnVsbDtcblx0ICAgIGlmIChjYWxsYmFjaykge1xuXHQgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuXHQgICAgfVxuXHQgIH1cdH07XG5cblx0UHJveHlTZXJ2ZXIucHJvdG90eXBlLmJlZm9yZSA9IGZ1bmN0aW9uKHR5cGUsIHBhc3NOYW1lLCBjYWxsYmFjaykge1xuXHQgIGlmICh0eXBlICE9PSAnd3MnICYmIHR5cGUgIT09ICd3ZWInKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGUgbXVzdCBiZSBgd2ViYCBvciBgd3NgJyk7XG5cdCAgfVxuXHQgIHZhciBwYXNzZXMgPSAodHlwZSA9PT0gJ3dzJykgPyB0aGlzLndzUGFzc2VzIDogdGhpcy53ZWJQYXNzZXMsXG5cdCAgICAgIGkgPSBmYWxzZTtcblxuXHQgIHBhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKHYsIGlkeCkge1xuXHQgICAgaWYodi5uYW1lID09PSBwYXNzTmFtZSkgaSA9IGlkeDtcblx0ICB9KTtcblxuXHQgIGlmKGkgPT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoJ05vIHN1Y2ggcGFzcycpO1xuXG5cdCAgcGFzc2VzLnNwbGljZShpLCAwLCBjYWxsYmFjayk7XG5cdH07XG5cdFByb3h5U2VydmVyLnByb3RvdHlwZS5hZnRlciA9IGZ1bmN0aW9uKHR5cGUsIHBhc3NOYW1lLCBjYWxsYmFjaykge1xuXHQgIGlmICh0eXBlICE9PSAnd3MnICYmIHR5cGUgIT09ICd3ZWInKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGUgbXVzdCBiZSBgd2ViYCBvciBgd3NgJyk7XG5cdCAgfVxuXHQgIHZhciBwYXNzZXMgPSAodHlwZSA9PT0gJ3dzJykgPyB0aGlzLndzUGFzc2VzIDogdGhpcy53ZWJQYXNzZXMsXG5cdCAgICAgIGkgPSBmYWxzZTtcblxuXHQgIHBhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKHYsIGlkeCkge1xuXHQgICAgaWYodi5uYW1lID09PSBwYXNzTmFtZSkgaSA9IGlkeDtcblx0ICB9KTtcblxuXHQgIGlmKGkgPT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoJ05vIHN1Y2ggcGFzcycpO1xuXG5cdCAgcGFzc2VzLnNwbGljZShpKyssIDAsIGNhbGxiYWNrKTtcblx0fTtcbn0gKGh0dHBQcm94eSQyKSk7XG5cbi8vIFVzZSBleHBsaWNpdCAvaW5kZXguanMgdG8gaGVscCBicm93c2VyaWZ5IG5lZ29jaWF0aW9uIGluIHJlcXVpcmUgJy9saWIvaHR0cC1wcm94eScgKCEpXG52YXIgUHJveHlTZXJ2ZXIgPSBodHRwUHJveHlFeHBvcnRzLlNlcnZlcjtcblxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIHByb3h5IHNlcnZlci5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICBodHRwUHJveHkuY3JlYXRlUHJveHlTZXJ2ZXIoeyAuLiB9LCA4MDAwKVxuICogICAgLy8gPT4gJ3sgd2ViOiBbRnVuY3Rpb25dLCB3czogW0Z1bmN0aW9uXSAuLi4gfSdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gT3B0aW9ucyBDb25maWcgb2JqZWN0IHBhc3NlZCB0byB0aGUgcHJveHlcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IFByb3h5IFByb3h5IG9iamVjdCB3aXRoIGhhbmRsZXJzIGZvciBgd3NgIGFuZCBgd2ViYCByZXF1ZXN0c1xuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuXG5mdW5jdGlvbiBjcmVhdGVQcm94eVNlcnZlcihvcHRpb25zKSB7XG4gIC8qXG4gICAqICBgb3B0aW9uc2AgaXMgbmVlZGVkIGFuZCBpdCBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBsYXlvdXQ6XG4gICAqXG4gICAqICB7XG4gICAqICAgIHRhcmdldCA6IDx1cmwgc3RyaW5nIHRvIGJlIHBhcnNlZCB3aXRoIHRoZSB1cmwgbW9kdWxlPlxuICAgKiAgICBmb3J3YXJkOiA8dXJsIHN0cmluZyB0byBiZSBwYXJzZWQgd2l0aCB0aGUgdXJsIG1vZHVsZT5cbiAgICogICAgYWdlbnQgIDogPG9iamVjdCB0byBiZSBwYXNzZWQgdG8gaHR0cChzKS5yZXF1ZXN0PlxuICAgKiAgICBzc2wgICAgOiA8b2JqZWN0IHRvIGJlIHBhc3NlZCB0byBodHRwcy5jcmVhdGVTZXJ2ZXIoKT5cbiAgICogICAgd3MgICAgIDogPHRydWUvZmFsc2UsIGlmIHlvdSB3YW50IHRvIHByb3h5IHdlYnNvY2tldHM+XG4gICAqICAgIHhmd2QgICA6IDx0cnVlL2ZhbHNlLCBhZGRzIHgtZm9yd2FyZCBoZWFkZXJzPlxuICAgKiAgICBzZWN1cmUgOiA8dHJ1ZS9mYWxzZSwgdmVyaWZ5IFNTTCBjZXJ0aWZpY2F0ZT5cbiAgICogICAgdG9Qcm94eTogPHRydWUvZmFsc2UsIGV4cGxpY2l0bHkgc3BlY2lmeSBpZiB3ZSBhcmUgcHJveHlpbmcgdG8gYW5vdGhlciBwcm94eT5cbiAgICogICAgcHJlcGVuZFBhdGg6IDx0cnVlL2ZhbHNlLCBEZWZhdWx0OiB0cnVlIC0gc3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHRvIHByZXBlbmQgdGhlIHRhcmdldCdzIHBhdGggdG8gdGhlIHByb3h5IHBhdGg+XG4gICAqICAgIGlnbm9yZVBhdGg6IDx0cnVlL2ZhbHNlLCBEZWZhdWx0OiBmYWxzZSAtIHNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0byBpZ25vcmUgdGhlIHByb3h5IHBhdGggb2YgdGhlIGluY29taW5nIHJlcXVlc3Q+XG4gICAqICAgIGxvY2FsQWRkcmVzcyA6IDxMb2NhbCBpbnRlcmZhY2Ugc3RyaW5nIHRvIGJpbmQgZm9yIG91dGdvaW5nIGNvbm5lY3Rpb25zPlxuICAgKiAgICBjaGFuZ2VPcmlnaW46IDx0cnVlL2ZhbHNlLCBEZWZhdWx0OiBmYWxzZSAtIGNoYW5nZXMgdGhlIG9yaWdpbiBvZiB0aGUgaG9zdCBoZWFkZXIgdG8gdGhlIHRhcmdldCBVUkw+XG4gICAqICAgIHByZXNlcnZlSGVhZGVyS2V5Q2FzZTogPHRydWUvZmFsc2UsIERlZmF1bHQ6IGZhbHNlIC0gc3BlY2lmeSB3aGV0aGVyIHlvdSB3YW50IHRvIGtlZXAgbGV0dGVyIGNhc2Ugb2YgcmVzcG9uc2UgaGVhZGVyIGtleSA+XG4gICAqICAgIGF1dGggICA6IEJhc2ljIGF1dGhlbnRpY2F0aW9uIGkuZS4gJ3VzZXI6cGFzc3dvcmQnIHRvIGNvbXB1dGUgYW4gQXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gICAqICAgIGhvc3RSZXdyaXRlOiByZXdyaXRlcyB0aGUgbG9jYXRpb24gaG9zdG5hbWUgb24gKDIwMS8zMDEvMzAyLzMwNy8zMDgpIHJlZGlyZWN0cywgRGVmYXVsdDogbnVsbC5cbiAgICogICAgYXV0b1Jld3JpdGU6IHJld3JpdGVzIHRoZSBsb2NhdGlvbiBob3N0L3BvcnQgb24gKDIwMS8zMDEvMzAyLzMwNy8zMDgpIHJlZGlyZWN0cyBiYXNlZCBvbiByZXF1ZXN0ZWQgaG9zdC9wb3J0LiBEZWZhdWx0OiBmYWxzZS5cbiAgICogICAgcHJvdG9jb2xSZXdyaXRlOiByZXdyaXRlcyB0aGUgbG9jYXRpb24gcHJvdG9jb2wgb24gKDIwMS8zMDEvMzAyLzMwNy8zMDgpIHJlZGlyZWN0cyB0byAnaHR0cCcgb3IgJ2h0dHBzJy4gRGVmYXVsdDogbnVsbC5cbiAgICogIH1cbiAgICpcbiAgICogIE5PVEU6IGBvcHRpb25zLndzYCBhbmQgYG9wdGlvbnMuc3NsYCBhcmUgb3B0aW9uYWwuXG4gICAqICAgIGBvcHRpb25zLnRhcmdldCBhbmQgYG9wdGlvbnMuZm9yd2FyZGAgY2Fubm90IGJlXG4gICAqICAgIGJvdGggbWlzc2luZ1xuICAgKiAgfVxuICAgKi9cblxuICByZXR1cm4gbmV3IFByb3h5U2VydmVyKG9wdGlvbnMpO1xufVxuXG5cblByb3h5U2VydmVyLmNyZWF0ZVByb3h5U2VydmVyID0gY3JlYXRlUHJveHlTZXJ2ZXI7XG5Qcm94eVNlcnZlci5jcmVhdGVTZXJ2ZXIgICAgICA9IGNyZWF0ZVByb3h5U2VydmVyO1xuUHJveHlTZXJ2ZXIuY3JlYXRlUHJveHkgICAgICAgPSBjcmVhdGVQcm94eVNlcnZlcjtcblxuXG5cblxuLyoqXG4gKiBFeHBvcnQgdGhlIHByb3h5IFwiU2VydmVyXCIgYXMgdGhlIG1haW4gZXhwb3J0LlxuICovXG52YXIgaHR0cFByb3h5JDEgPSBQcm94eVNlcnZlcjtcblxuLyohXG4gKiBDYXJvbiBkaW1vbmlvLCBjb24gb2NjaGkgZGkgYnJhZ2lhXG4gKiBsb3JvIGFjY2VubmFuZG8sIHR1dHRlIGxlIHJhY2NvZ2xpZTtcbiAqIGJhdHRlIGNvbCByZW1vIHF1YWx1bnF1ZSBzXHUyMDE5YWRhZ2lhIFxuICpcbiAqIENoYXJvbiB0aGUgZGVtb24sIHdpdGggdGhlIGV5ZXMgb2YgZ2xlZGUsXG4gKiBCZWNrb25pbmcgdG8gdGhlbSwgY29sbGVjdHMgdGhlbSBhbGwgdG9nZXRoZXIsXG4gKiBCZWF0cyB3aXRoIGhpcyBvYXIgd2hvZXZlciBsYWdzIGJlaGluZFxuICogICAgICAgICAgXG4gKiAgICAgICAgICBEYW50ZSAtIFRoZSBEaXZpbmUgQ29tZWR5IChDYW50byBJSUkpXG4gKi9cblxuKGZ1bmN0aW9uIChtb2R1bGUpIHtcblx0bW9kdWxlLmV4cG9ydHMgPSBodHRwUHJveHkkMTtcbn0gKGh0dHBQcm94eSQzKSk7XG5cbnZhciBodHRwUHJveHkgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoaHR0cFByb3h5RXhwb3J0cyQxKTtcblxuY29uc3QgZGVidWckMSA9IGNyZWF0ZURlYnVnZ2VyKCd2aXRlOnByb3h5Jyk7XG5mdW5jdGlvbiBwcm94eU1pZGRsZXdhcmUoaHR0cFNlcnZlciwgb3B0aW9ucywgY29uZmlnKSB7XG4gICAgLy8gbGF6eSByZXF1aXJlIG9ubHkgd2hlbiBwcm94eSBpcyB1c2VkXG4gICAgY29uc3QgcHJveGllcyA9IHt9O1xuICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goKGNvbnRleHQpID0+IHtcbiAgICAgICAgbGV0IG9wdHMgPSBvcHRpb25zW2NvbnRleHRdO1xuICAgICAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvcHRzID0geyB0YXJnZXQ6IG9wdHMsIGNoYW5nZU9yaWdpbjogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3h5ID0gaHR0cFByb3h5LmNyZWF0ZVByb3h5U2VydmVyKG9wdHMpO1xuICAgICAgICBpZiAob3B0cy5jb25maWd1cmUpIHtcbiAgICAgICAgICAgIG9wdHMuY29uZmlndXJlKHByb3h5LCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBwcm94eS5vbignZXJyb3InLCAoZXJyLCByZXEsIG9yaWdpbmFsUmVzKSA9PiB7XG4gICAgICAgICAgICAvLyBXaGVuIGl0IGlzIHdzIHByb3h5LCByZXMgaXMgbmV0LlNvY2tldFxuICAgICAgICAgICAgY29uc3QgcmVzID0gb3JpZ2luYWxSZXM7XG4gICAgICAgICAgICBpZiAoJ3JlcScgaW4gcmVzKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5lcnJvcihgJHtwaWNvY29sb3JzRXhwb3J0cy5yZWQoYGh0dHAgcHJveHkgZXJyb3IgYXQgJHtvcmlnaW5hbFJlcy5yZXEudXJsfTpgKX1cXG4ke2Vyci5zdGFja31gLCB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCAmJiAhcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVIZWFkKDUwMCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5lbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25maWcubG9nZ2VyLmVycm9yKGAke3BpY29jb2xvcnNFeHBvcnRzLnJlZChgd3MgcHJveHkgZXJyb3I6YCl9XFxuJHtlcnIuc3RhY2t9YCwge1xuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gY2xvbmUgYmVmb3JlIHNhdmluZyBiZWNhdXNlIGh0dHAtcHJveHkgbXV0YXRlcyB0aGUgb3B0aW9uc1xuICAgICAgICBwcm94aWVzW2NvbnRleHRdID0gW3Byb3h5LCB7IC4uLm9wdHMgfV07XG4gICAgfSk7XG4gICAgaWYgKGh0dHBTZXJ2ZXIpIHtcbiAgICAgICAgaHR0cFNlcnZlci5vbigndXBncmFkZScsIChyZXEsIHNvY2tldCwgaGVhZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gcmVxLnVybDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29udGV4dCBpbiBwcm94aWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvZXNQcm94eUNvbnRleHRNYXRjaFVybChjb250ZXh0LCB1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtwcm94eSwgb3B0c10gPSBwcm94aWVzW2NvbnRleHRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKG9wdHMud3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMudGFyZ2V0Py50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ3dzOicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnRhcmdldD8udG9TdHJpbmcoKS5zdGFydHNXaXRoKCd3c3M6JykpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXEuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1wcm90b2NvbCddICE9PSBITVJfSEVBREVSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0cy5yZXdyaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnVybCA9IG9wdHMucmV3cml0ZSh1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWckMShgJHtyZXEudXJsfSAtPiB3cyAke29wdHMudGFyZ2V0fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJveHkud3MocmVxLCBzb2NrZXQsIGhlYWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gS2VlcCB0aGUgbmFtZWQgZnVuY3Rpb24uIFRoZSBuYW1lIGlzIHZpc2libGUgaW4gZGVidWcgbG9ncyB2aWEgYERFQlVHPWNvbm5lY3Q6ZGlzcGF0Y2hlciAuLi5gXG4gICAgcmV0dXJuIGZ1bmN0aW9uIHZpdGVQcm94eU1pZGRsZXdhcmUocmVxLCByZXMsIG5leHQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gcmVxLnVybDtcbiAgICAgICAgZm9yIChjb25zdCBjb250ZXh0IGluIHByb3hpZXMpIHtcbiAgICAgICAgICAgIGlmIChkb2VzUHJveHlDb250ZXh0TWF0Y2hVcmwoY29udGV4dCwgdXJsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtwcm94eSwgb3B0c10gPSBwcm94aWVzW2NvbnRleHRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5ieXBhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnlwYXNzUmVzdWx0ID0gb3B0cy5ieXBhc3MocmVxLCByZXMsIG9wdHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGJ5cGFzc1Jlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS51cmwgPSBieXBhc3NSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyQxKGBieXBhc3M6ICR7cmVxLnVybH0gLT4gJHtieXBhc3NSZXN1bHR9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ5cGFzc1Jlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnJDEoYGJ5cGFzczogJHtyZXEudXJsfSAtPiA0MDRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMuZW5kKDQwNCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVidWckMShgJHtyZXEudXJsfSAtPiAke29wdHMudGFyZ2V0IHx8IG9wdHMuZm9yd2FyZH1gKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0cy5yZXdyaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcS51cmwgPSBvcHRzLnJld3JpdGUocmVxLnVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3h5LndlYihyZXEsIHJlcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5leHQoKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gZG9lc1Byb3h5Q29udGV4dE1hdGNoVXJsKGNvbnRleHQsIHVybCkge1xuICAgIHJldHVybiAoKGNvbnRleHQuc3RhcnRzV2l0aCgnXicpICYmIG5ldyBSZWdFeHAoY29udGV4dCkudGVzdCh1cmwpKSB8fFxuICAgICAgICB1cmwuc3RhcnRzV2l0aChjb250ZXh0KSk7XG59XG5cbnZhciBsaWJFeHBvcnRzID0ge307XG52YXIgbGliID0ge1xuICBnZXQgZXhwb3J0cygpeyByZXR1cm4gbGliRXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IGxpYkV4cG9ydHMgPSB2OyB9LFxufTtcblxuKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHR2YXIgdXJsID0gcmVxdWlyZSQkMCQ5O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGlzdG9yeUFwaUZhbGxiYWNrKG9wdGlvbnMpIHtcblx0ICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0ICB2YXIgbG9nZ2VyID0gZ2V0TG9nZ2VyKG9wdGlvbnMpO1xuXG5cdCAgcmV0dXJuIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG5cdCAgICB2YXIgaGVhZGVycyA9IHJlcS5oZWFkZXJzO1xuXHQgICAgaWYgKHJlcS5tZXRob2QgIT09ICdHRVQnICYmIHJlcS5tZXRob2QgIT09ICdIRUFEJykge1xuXHQgICAgICBsb2dnZXIoXG5cdCAgICAgICAgJ05vdCByZXdyaXRpbmcnLFxuXHQgICAgICAgIHJlcS5tZXRob2QsXG5cdCAgICAgICAgcmVxLnVybCxcblx0ICAgICAgICAnYmVjYXVzZSB0aGUgbWV0aG9kIGlzIG5vdCBHRVQgb3IgSEVBRC4nXG5cdCAgICAgICk7XG5cdCAgICAgIHJldHVybiBuZXh0KCk7XG5cdCAgICB9IGVsc2UgaWYgKCFoZWFkZXJzIHx8IHR5cGVvZiBoZWFkZXJzLmFjY2VwdCAhPT0gJ3N0cmluZycpIHtcblx0ICAgICAgbG9nZ2VyKFxuXHQgICAgICAgICdOb3QgcmV3cml0aW5nJyxcblx0ICAgICAgICByZXEubWV0aG9kLFxuXHQgICAgICAgIHJlcS51cmwsXG5cdCAgICAgICAgJ2JlY2F1c2UgdGhlIGNsaWVudCBkaWQgbm90IHNlbmQgYW4gSFRUUCBhY2NlcHQgaGVhZGVyLidcblx0ICAgICAgKTtcblx0ICAgICAgcmV0dXJuIG5leHQoKTtcblx0ICAgIH0gZWxzZSBpZiAoaGVhZGVycy5hY2NlcHQuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpID09PSAwKSB7XG5cdCAgICAgIGxvZ2dlcihcblx0ICAgICAgICAnTm90IHJld3JpdGluZycsXG5cdCAgICAgICAgcmVxLm1ldGhvZCxcblx0ICAgICAgICByZXEudXJsLFxuXHQgICAgICAgICdiZWNhdXNlIHRoZSBjbGllbnQgcHJlZmVycyBKU09OLidcblx0ICAgICAgKTtcblx0ICAgICAgcmV0dXJuIG5leHQoKTtcblx0ICAgIH0gZWxzZSBpZiAoIWFjY2VwdHNIdG1sKGhlYWRlcnMuYWNjZXB0LCBvcHRpb25zKSkge1xuXHQgICAgICBsb2dnZXIoXG5cdCAgICAgICAgJ05vdCByZXdyaXRpbmcnLFxuXHQgICAgICAgIHJlcS5tZXRob2QsXG5cdCAgICAgICAgcmVxLnVybCxcblx0ICAgICAgICAnYmVjYXVzZSB0aGUgY2xpZW50IGRvZXMgbm90IGFjY2VwdCBIVE1MLidcblx0ICAgICAgKTtcblx0ICAgICAgcmV0dXJuIG5leHQoKTtcblx0ICAgIH1cblxuXHQgICAgdmFyIHBhcnNlZFVybCA9IHVybC5wYXJzZShyZXEudXJsKTtcblx0ICAgIHZhciByZXdyaXRlVGFyZ2V0O1xuXHQgICAgb3B0aW9ucy5yZXdyaXRlcyA9IG9wdGlvbnMucmV3cml0ZXMgfHwgW107XG5cdCAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMucmV3cml0ZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgdmFyIHJld3JpdGUgPSBvcHRpb25zLnJld3JpdGVzW2ldO1xuXHQgICAgICB2YXIgbWF0Y2ggPSBwYXJzZWRVcmwucGF0aG5hbWUubWF0Y2gocmV3cml0ZS5mcm9tKTtcblx0ICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG5cdCAgICAgICAgcmV3cml0ZVRhcmdldCA9IGV2YWx1YXRlUmV3cml0ZVJ1bGUocGFyc2VkVXJsLCBtYXRjaCwgcmV3cml0ZS50bywgcmVxKTtcblxuXHQgICAgICAgIGlmKHJld3JpdGVUYXJnZXQuY2hhckF0KDApICE9PSAnLycpIHtcblx0ICAgICAgICAgIGxvZ2dlcihcblx0ICAgICAgICAgICAgJ1dlIHJlY29tbWVuZCB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoIGZvciB0aGUgcmV3cml0ZSB0YXJnZXQuJyxcblx0ICAgICAgICAgICAgJ1JlY2VpdmVkIGEgbm9uLWFic29sdXRlIHJld3JpdGUgdGFyZ2V0Jyxcblx0ICAgICAgICAgICAgcmV3cml0ZVRhcmdldCxcblx0ICAgICAgICAgICAgJ2ZvciBVUkwnLFxuXHQgICAgICAgICAgICByZXEudXJsXG5cdCAgICAgICAgICApO1xuXHQgICAgICAgIH1cblxuXHQgICAgICAgIGxvZ2dlcignUmV3cml0aW5nJywgcmVxLm1ldGhvZCwgcmVxLnVybCwgJ3RvJywgcmV3cml0ZVRhcmdldCk7XG5cdCAgICAgICAgcmVxLnVybCA9IHJld3JpdGVUYXJnZXQ7XG5cdCAgICAgICAgcmV0dXJuIG5leHQoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICB2YXIgcGF0aG5hbWUgPSBwYXJzZWRVcmwucGF0aG5hbWU7XG5cdCAgICBpZiAocGF0aG5hbWUubGFzdEluZGV4T2YoJy4nKSA+IHBhdGhuYW1lLmxhc3RJbmRleE9mKCcvJykgJiZcblx0ICAgICAgICBvcHRpb25zLmRpc2FibGVEb3RSdWxlICE9PSB0cnVlKSB7XG5cdCAgICAgIGxvZ2dlcihcblx0ICAgICAgICAnTm90IHJld3JpdGluZycsXG5cdCAgICAgICAgcmVxLm1ldGhvZCxcblx0ICAgICAgICByZXEudXJsLFxuXHQgICAgICAgICdiZWNhdXNlIHRoZSBwYXRoIGluY2x1ZGVzIGEgZG90ICguKSBjaGFyYWN0ZXIuJ1xuXHQgICAgICApO1xuXHQgICAgICByZXR1cm4gbmV4dCgpO1xuXHQgICAgfVxuXG5cdCAgICByZXdyaXRlVGFyZ2V0ID0gb3B0aW9ucy5pbmRleCB8fCAnL2luZGV4Lmh0bWwnO1xuXHQgICAgbG9nZ2VyKCdSZXdyaXRpbmcnLCByZXEubWV0aG9kLCByZXEudXJsLCAndG8nLCByZXdyaXRlVGFyZ2V0KTtcblx0ICAgIHJlcS51cmwgPSByZXdyaXRlVGFyZ2V0O1xuXHQgICAgbmV4dCgpO1xuXHQgIH07XG5cdH07XG5cblx0ZnVuY3Rpb24gZXZhbHVhdGVSZXdyaXRlUnVsZShwYXJzZWRVcmwsIG1hdGNoLCBydWxlLCByZXEpIHtcblx0ICBpZiAodHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnKSB7XG5cdCAgICByZXR1cm4gcnVsZTtcblx0ICB9IGVsc2UgaWYgKHR5cGVvZiBydWxlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jld3JpdGUgcnVsZSBjYW4gb25seSBiZSBvZiB0eXBlIHN0cmluZyBvciBmdW5jdGlvbi4nKTtcblx0ICB9XG5cblx0ICByZXR1cm4gcnVsZSh7XG5cdCAgICBwYXJzZWRVcmw6IHBhcnNlZFVybCxcblx0ICAgIG1hdGNoOiBtYXRjaCxcblx0ICAgIHJlcXVlc3Q6IHJlcVxuXHQgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gYWNjZXB0c0h0bWwoaGVhZGVyLCBvcHRpb25zKSB7XG5cdCAgb3B0aW9ucy5odG1sQWNjZXB0SGVhZGVycyA9IG9wdGlvbnMuaHRtbEFjY2VwdEhlYWRlcnMgfHwgWyd0ZXh0L2h0bWwnLCAnKi8qJ107XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zLmh0bWxBY2NlcHRIZWFkZXJzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICBpZiAoaGVhZGVyLmluZGV4T2Yob3B0aW9ucy5odG1sQWNjZXB0SGVhZGVyc1tpXSkgIT09IC0xKSB7XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRMb2dnZXIob3B0aW9ucykge1xuXHQgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubG9nZ2VyKSB7XG5cdCAgICByZXR1cm4gb3B0aW9ucy5sb2dnZXI7XG5cdCAgfSBlbHNlIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmVyYm9zZSkge1xuXHQgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcblx0ICAgIHJldHVybiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuXHQgIH1cblx0ICByZXR1cm4gZnVuY3Rpb24oKXt9O1xuXHR9XG59IChsaWIpKTtcblxudmFyIGhpc3RvcnkgPSBsaWJFeHBvcnRzO1xuXG5mdW5jdGlvbiBodG1sRmFsbGJhY2tNaWRkbGV3YXJlKHJvb3QsIHNwYUZhbGxiYWNrKSB7XG4gICAgY29uc3QgaGlzdG9yeUh0bWxGYWxsYmFja01pZGRsZXdhcmUgPSBoaXN0b3J5KHtcbiAgICAgICAgbG9nZ2VyOiBjcmVhdGVEZWJ1Z2dlcigndml0ZTpodG1sLWZhbGxiYWNrJyksXG4gICAgICAgIC8vIHN1cHBvcnQgL2Rpci8gd2l0aG91dCBleHBsaWNpdCBpbmRleC5odG1sXG4gICAgICAgIHJld3JpdGVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZnJvbTogL1xcLyQvLFxuICAgICAgICAgICAgICAgIHRvKHsgcGFyc2VkVXJsLCByZXF1ZXN0IH0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV3cml0dGVuID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnNlZFVybC5wYXRobmFtZSkgKyAnaW5kZXguaHRtbCc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcyRsLmV4aXN0c1N5bmMocGF0aCRvLmpvaW4ocm9vdCwgcmV3cml0dGVuKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXdyaXR0ZW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwYUZhbGxiYWNrID8gYC9pbmRleC5odG1sYCA6IHJlcXVlc3QudXJsO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgIH0pO1xuICAgIC8vIEtlZXAgdGhlIG5hbWVkIGZ1bmN0aW9uLiBUaGUgbmFtZSBpcyB2aXNpYmxlIGluIGRlYnVnIGxvZ3MgdmlhIGBERUJVRz1jb25uZWN0OmRpc3BhdGNoZXIgLi4uYFxuICAgIHJldHVybiBmdW5jdGlvbiB2aXRlSHRtbEZhbGxiYWNrTWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUh0bWxGYWxsYmFja01pZGRsZXdhcmUocmVxLCByZXMsIG5leHQpO1xuICAgIH07XG59XG5cbmNvbnN0IGRlYnVnQ2FjaGUgPSBjcmVhdGVEZWJ1Z2dlcigndml0ZTpjYWNoZScpO1xuY29uc3QgaXNEZWJ1ZyA9ICEhcHJvY2Vzcy5lbnYuREVCVUc7XG5jb25zdCBrbm93bklnbm9yZUxpc3QgPSBuZXcgU2V0KFsnLycsICcvZmF2aWNvbi5pY28nXSk7XG5mdW5jdGlvbiB0cmFuc2Zvcm1NaWRkbGV3YXJlKHNlcnZlcikge1xuICAgIGNvbnN0IHsgY29uZmlnOiB7IHJvb3QsIGxvZ2dlciB9LCBtb2R1bGVHcmFwaCwgfSA9IHNlcnZlcjtcbiAgICAvLyBLZWVwIHRoZSBuYW1lZCBmdW5jdGlvbi4gVGhlIG5hbWUgaXMgdmlzaWJsZSBpbiBkZWJ1ZyBsb2dzIHZpYSBgREVCVUc9Y29ubmVjdDpkaXNwYXRjaGVyIC4uLmBcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gdml0ZVRyYW5zZm9ybU1pZGRsZXdhcmUocmVxLCByZXMsIG5leHQpIHtcbiAgICAgICAgaWYgKHJlcS5tZXRob2QgIT09ICdHRVQnIHx8IGtub3duSWdub3JlTGlzdC5oYXMocmVxLnVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVybDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHVybCA9IGRlY29kZVVSSShyZW1vdmVUaW1lc3RhbXBRdWVyeShyZXEudXJsKSkucmVwbGFjZShOVUxMX0JZVEVfUExBQ0VIT0xERVIsICdcXDAnKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5leHQoZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2l0aG91dFF1ZXJ5ID0gY2xlYW5VcmwodXJsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGlzU291cmNlTWFwID0gd2l0aG91dFF1ZXJ5LmVuZHNXaXRoKCcubWFwJyk7XG4gICAgICAgICAgICAvLyBzaW5jZSB3ZSBnZW5lcmF0ZSBzb3VyY2UgbWFwIHJlZmVyZW5jZXMsIGhhbmRsZSB0aG9zZSByZXF1ZXN0cyBoZXJlXG4gICAgICAgICAgICBpZiAoaXNTb3VyY2VNYXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBzT3B0aW1pemVyID0gZ2V0RGVwc09wdGltaXplcihzZXJ2ZXIuY29uZmlnLCBmYWxzZSk7IC8vIG5vbi1zc3JcbiAgICAgICAgICAgICAgICBpZiAoZGVwc09wdGltaXplcj8uaXNPcHRpbWl6ZWREZXBVcmwodXJsKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYnJvd3NlciBpcyByZXF1ZXN0aW5nIGEgc291cmNlIG1hcCBmb3IgYW4gb3B0aW1pemVkIGRlcCwgaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gbWVhbnMgdGhhdCB0aGUgZGVwZW5kZW5jeSBoYXMgYWxyZWFkeSBiZWVuIHByZS1idW5kbGVkIGFuZCBsb2FkZWRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwRmlsZSA9IHVybC5zdGFydHNXaXRoKEZTX1BSRUZJWClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZnNQYXRoRnJvbUlkKHVybClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbm9ybWFsaXplUGF0aCQzKGVuc3VyZVZvbHVtZUluUGF0aChwYXRoJG8ucmVzb2x2ZShyb290LCB1cmwuc2xpY2UoMSkpKSk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBhd2FpdCBwcm9taXNlcyQyLnJlYWRGaWxlKG1hcEZpbGUsICd1dGYtOCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbmQkMShyZXEsIHJlcywgbWFwLCAnanNvbicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBzZXJ2ZXIuY29uZmlnLnNlcnZlci5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE91dGRhdGVkIHNvdXJjZSBtYXAgcmVxdWVzdCBmb3Igb3B0aW1pemVkIGRlcHMsIHRoaXMgaXNuJ3QgYW4gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBwYXJ0IG9mIHRoZSBub3JtYWwgZmxvdyB3aGVuIHJlLW9wdGltaXppbmcgYWZ0ZXIgbWlzc2luZyBkZXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGJhY2sgYW4gZW1wdHkgc291cmNlIG1hcCBzbyB0aGUgYnJvd3NlciBkb2Vzbid0IGlzc3VlIHdhcm5pbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkdW1teVNvdXJjZU1hcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IG1hcEZpbGUucmVwbGFjZSgvXFwubWFwJC8sICcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzQ29udGVudDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzOiAnOzs7Ozs7Ozs7JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCQxKHJlcSwgcmVzLCBKU09OLnN0cmluZ2lmeShkdW1teVNvdXJjZU1hcCksICdqc29uJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlQ29udHJvbDogJ25vLWNhY2hlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBzZXJ2ZXIuY29uZmlnLnNlcnZlci5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVXJsID0gdXJsLnJlcGxhY2UoL1xcLm1hcCgkfFxcPykvLCAnJDEnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwID0gKGF3YWl0IG1vZHVsZUdyYXBoLmdldE1vZHVsZUJ5VXJsKG9yaWdpbmFsVXJsLCBmYWxzZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICA/LnRyYW5zZm9ybVJlc3VsdD8ubWFwO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCQxKHJlcSwgcmVzLCBKU09OLnN0cmluZ2lmeShtYXApLCAnanNvbicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBzZXJ2ZXIuY29uZmlnLnNlcnZlci5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgcHVibGljIGRpciBpcyBpbnNpZGUgcm9vdCBkaXJcbiAgICAgICAgICAgIGNvbnN0IHB1YmxpY0RpciA9IG5vcm1hbGl6ZVBhdGgkMyhzZXJ2ZXIuY29uZmlnLnB1YmxpY0Rpcik7XG4gICAgICAgICAgICBjb25zdCByb290RGlyID0gbm9ybWFsaXplUGF0aCQzKHNlcnZlci5jb25maWcucm9vdCk7XG4gICAgICAgICAgICBpZiAocHVibGljRGlyLnN0YXJ0c1dpdGgocm9vdERpcikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwdWJsaWNQYXRoID0gYCR7cHVibGljRGlyLnNsaWNlKHJvb3REaXIubGVuZ3RoKX0vYDtcbiAgICAgICAgICAgICAgICAvLyB3YXJuIGV4cGxpY2l0IHB1YmxpYyBwYXRoc1xuICAgICAgICAgICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aChwdWJsaWNQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2FybmluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW1wb3J0UmVxdWVzdCh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXdVcmwgPSByZW1vdmVJbXBvcnRRdWVyeSh1cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Fzc2V0cyBpbiBwdWJsaWMgY2Fubm90IGJlIGltcG9ydGVkIGZyb20gSmF2YVNjcmlwdC5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEluc3RlYWQgb2YgJHtwaWNvY29sb3JzRXhwb3J0cy5jeWFuKHJhd1VybCl9LCBwdXQgdGhlIGZpbGUgaW4gdGhlIHNyYyBkaXJlY3RvcnksIGFuZCB1c2UgJHtwaWNvY29sb3JzRXhwb3J0cy5jeWFuKHJhd1VybC5yZXBsYWNlKHB1YmxpY1BhdGgsICcvc3JjLycpKX0gaW5zdGVhZC5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZpbGVzIGluIHRoZSBwdWJsaWMgZGlyZWN0b3J5IGFyZSBzZXJ2ZWQgYXQgdGhlIHJvb3QgcGF0aC5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEluc3RlYWQgb2YgJHtwaWNvY29sb3JzRXhwb3J0cy5jeWFuKHVybCl9LCB1c2UgJHtwaWNvY29sb3JzRXhwb3J0cy5jeWFuKHVybC5yZXBsYWNlKHB1YmxpY1BhdGgsICcvJykpfS5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKHBpY29jb2xvcnNFeHBvcnRzLnllbGxvdyh3YXJuaW5nKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzSlNSZXF1ZXN0KHVybCkgfHxcbiAgICAgICAgICAgICAgICBpc0ltcG9ydFJlcXVlc3QodXJsKSB8fFxuICAgICAgICAgICAgICAgIGlzQ1NTUmVxdWVzdCh1cmwpIHx8XG4gICAgICAgICAgICAgICAgaXNIVE1MUHJveHkodXJsKSkge1xuICAgICAgICAgICAgICAgIC8vIHN0cmlwID9pbXBvcnRcbiAgICAgICAgICAgICAgICB1cmwgPSByZW1vdmVJbXBvcnRRdWVyeSh1cmwpO1xuICAgICAgICAgICAgICAgIC8vIFN0cmlwIHZhbGlkIGlkIHByZWZpeC4gVGhpcyBpcyBwcmVwZW5kZWQgdG8gcmVzb2x2ZWQgSWRzIHRoYXQgYXJlXG4gICAgICAgICAgICAgICAgLy8gbm90IHZhbGlkIGJyb3dzZXIgaW1wb3J0IHNwZWNpZmllcnMgYnkgdGhlIGltcG9ydEFuYWx5c2lzIHBsdWdpbi5cbiAgICAgICAgICAgICAgICB1cmwgPSB1bndyYXBJZCh1cmwpO1xuICAgICAgICAgICAgICAgIC8vIGZvciBDU1MsIHdlIG5lZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG5vcm1hbCBDU1MgcmVxdWVzdHMgYW5kXG4gICAgICAgICAgICAgICAgLy8gaW1wb3J0c1xuICAgICAgICAgICAgICAgIGlmIChpc0NTU1JlcXVlc3QodXJsKSAmJlxuICAgICAgICAgICAgICAgICAgICAhaXNEaXJlY3RSZXF1ZXN0KHVybCkgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVxLmhlYWRlcnMuYWNjZXB0Py5pbmNsdWRlcygndGV4dC9jc3MnKSkge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBpbmplY3RRdWVyeSh1cmwsICdkaXJlY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHJldHVybiAzMDQgZWFybHlcbiAgICAgICAgICAgICAgICBjb25zdCBpZk5vbmVNYXRjaCA9IHJlcS5oZWFkZXJzWydpZi1ub25lLW1hdGNoJ107XG4gICAgICAgICAgICAgICAgaWYgKGlmTm9uZU1hdGNoICYmXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCBtb2R1bGVHcmFwaC5nZXRNb2R1bGVCeVVybCh1cmwsIGZhbHNlKSk/LnRyYW5zZm9ybVJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgPy5ldGFnID09PSBpZk5vbmVNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBpc0RlYnVnICYmIGRlYnVnQ2FjaGUoYFszMDRdICR7cHJldHRpZnlVcmwodXJsLCByb290KX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSAzMDQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMuZW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJlc29sdmUsIGxvYWQgYW5kIHRyYW5zZm9ybSB1c2luZyB0aGUgcGx1Z2luIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybVJlcXVlc3QodXJsLCBzZXJ2ZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbDogcmVxLmhlYWRlcnMuYWNjZXB0Py5pbmNsdWRlcygndGV4dC9odG1sJyksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXBzT3B0aW1pemVyID0gZ2V0RGVwc09wdGltaXplcihzZXJ2ZXIuY29uZmlnLCBmYWxzZSk7IC8vIG5vbi1zc3JcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGlzRGlyZWN0Q1NTUmVxdWVzdCh1cmwpID8gJ2NzcycgOiAnanMnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0RlcCA9IERFUF9WRVJTSU9OX1JFLnRlc3QodXJsKSB8fCBkZXBzT3B0aW1pemVyPy5pc09wdGltaXplZERlcFVybCh1cmwpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZCQxKHJlcSwgcmVzLCByZXN1bHQuY29kZSwgdHlwZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXRhZzogcmVzdWx0LmV0YWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBicm93c2VyIHRvIGNhY2hlIG5wbSBkZXBzIVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiBpc0RlcCA/ICdtYXgtYWdlPTMxNTM2MDAwLGltbXV0YWJsZScgOiAnbm8tY2FjaGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogc2VydmVyLmNvbmZpZy5zZXJ2ZXIuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogcmVzdWx0Lm1hcCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZT8uY29kZSA9PT0gRVJSX09QVElNSVpFX0RFUFNfUFJPQ0VTU0lOR19FUlJPUikge1xuICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgcmVzcG9uc2UgaGFzIGFscmVhZHkgYmVlbiBzZW50XG4gICAgICAgICAgICAgICAgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDUwNDsgLy8gc3RhdHVzIGNvZGUgcmVxdWVzdCB0aW1lb3V0XG4gICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXNNZXNzYWdlID0gJ09wdGltaXplIERlcHMgUHJvY2Vzc2luZyBFcnJvcic7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVGhpcyB0aW1lb3V0IGlzIHVuZXhwZWN0ZWRcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZT8uY29kZSA9PT0gRVJSX09VVERBVEVEX09QVElNSVpFRF9ERVApIHtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHJlc3BvbnNlIGhhcyBhbHJlYWR5IGJlZW4gc2VudFxuICAgICAgICAgICAgICAgIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDQ7IC8vIHN0YXR1cyBjb2RlIHJlcXVlc3QgdGltZW91dFxuICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzTWVzc2FnZSA9ICdPdXRkYXRlZCBPcHRpbWl6ZSBEZXAnO1xuICAgICAgICAgICAgICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gbG9nIGFuIGVycm9yIGluIHRoaXMgY2FzZSwgdGhlIHJlcXVlc3RcbiAgICAgICAgICAgICAgICAvLyBpcyBvdXRkYXRlZCBiZWNhdXNlIG5ldyBkZXBlbmRlbmNpZXMgd2VyZSBkaXNjb3ZlcmVkIGFuZFxuICAgICAgICAgICAgICAgIC8vIHRoZSBuZXcgcHJlLWJ1bmRsZSBkZXBlbmRlbmNpZXMgaGF2ZSBjaGFuZ2VkLlxuICAgICAgICAgICAgICAgIC8vIEEgZnVsbC1wYWdlIHJlbG9hZCBoYXMgYmVlbiBpc3N1ZWQsIGFuZCB0aGVzZSBvbGQgcmVxdWVzdHNcbiAgICAgICAgICAgICAgICAvLyBjYW4ndCBiZSBwcm9wZXJseSBmdWxmaWxsZWQuIFRoaXMgaXNuJ3QgYW4gdW5leHBlY3RlZFxuICAgICAgICAgICAgICAgIC8vIGVycm9yIGJ1dCBhIG5vcm1hbCBwYXJ0IG9mIHRoZSBtaXNzaW5nIGRlcHMgZGlzY292ZXJ5IGZsb3dcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZT8uY29kZSA9PT0gRVJSX0xPQURfVVJMKSB7XG4gICAgICAgICAgICAgICAgLy8gTGV0IG90aGVyIG1pZGRsZXdhcmUgaGFuZGxlIGlmIHdlIGNhbid0IGxvYWQgdGhlIHVybCB2aWEgdHJhbnNmb3JtUmVxdWVzdFxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV4dChlKTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0KCk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGV2SHRtbFRyYW5zZm9ybUZuKHNlcnZlcikge1xuICAgIGNvbnN0IFtwcmVIb29rcywgbm9ybWFsSG9va3MsIHBvc3RIb29rc10gPSByZXNvbHZlSHRtbFRyYW5zZm9ybXMoc2VydmVyLmNvbmZpZy5wbHVnaW5zKTtcbiAgICByZXR1cm4gKHVybCwgaHRtbCwgb3JpZ2luYWxVcmwpID0+IHtcbiAgICAgICAgcmV0dXJuIGFwcGx5SHRtbFRyYW5zZm9ybXMoaHRtbCwgW1xuICAgICAgICAgICAgcHJlSW1wb3J0TWFwSG9vayhzZXJ2ZXIuY29uZmlnKSxcbiAgICAgICAgICAgIC4uLnByZUhvb2tzLFxuICAgICAgICAgICAgaHRtbEVudkhvb2soc2VydmVyLmNvbmZpZyksXG4gICAgICAgICAgICBkZXZIdG1sSG9vayxcbiAgICAgICAgICAgIC4uLm5vcm1hbEhvb2tzLFxuICAgICAgICAgICAgLi4ucG9zdEhvb2tzLFxuICAgICAgICAgICAgcG9zdEltcG9ydE1hcEhvb2soKSxcbiAgICAgICAgXSwge1xuICAgICAgICAgICAgcGF0aDogdXJsLFxuICAgICAgICAgICAgZmlsZW5hbWU6IGdldEh0bWxGaWxlbmFtZSh1cmwsIHNlcnZlciksXG4gICAgICAgICAgICBzZXJ2ZXIsXG4gICAgICAgICAgICBvcmlnaW5hbFVybCxcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldEh0bWxGaWxlbmFtZSh1cmwsIHNlcnZlcikge1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aChGU19QUkVGSVgpKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZnNQYXRoRnJvbUlkKHVybCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChub3JtYWxpemVQYXRoJDMocGF0aCRvLmpvaW4oc2VydmVyLmNvbmZpZy5yb290LCB1cmwuc2xpY2UoMSkpKSk7XG4gICAgfVxufVxuY29uc3Qgc3RhcnRzV2l0aFNpbmdsZVNsYXNoUkUgPSAvXlxcLyg/IVxcLykvO1xuY29uc3QgcHJvY2Vzc05vZGVVcmwgPSAoYXR0ciwgc291cmNlQ29kZUxvY2F0aW9uLCBzLCBjb25maWcsIGh0bWxQYXRoLCBvcmlnaW5hbFVybCwgbW9kdWxlR3JhcGgpID0+IHtcbiAgICBsZXQgdXJsID0gYXR0ci52YWx1ZSB8fCAnJztcbiAgICBpZiAobW9kdWxlR3JhcGgpIHtcbiAgICAgICAgY29uc3QgbW9kID0gbW9kdWxlR3JhcGgudXJsVG9Nb2R1bGVNYXAuZ2V0KHVybCk7XG4gICAgICAgIGlmIChtb2QgJiYgbW9kLmxhc3RITVJUaW1lc3RhbXAgPiAwKSB7XG4gICAgICAgICAgICB1cmwgPSBpbmplY3RRdWVyeSh1cmwsIGB0PSR7bW9kLmxhc3RITVJUaW1lc3RhbXB9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGV2QmFzZSA9IGNvbmZpZy5iYXNlO1xuICAgIGlmIChzdGFydHNXaXRoU2luZ2xlU2xhc2hSRS50ZXN0KHVybCkpIHtcbiAgICAgICAgLy8gcHJlZml4IHdpdGggYmFzZSAoZGV2IG9ubHksIGJhc2UgaXMgbmV2ZXIgcmVsYXRpdmUpXG4gICAgICAgIGNvbnN0IGZ1bGxVcmwgPSBwYXRoJG8ucG9zaXguam9pbihkZXZCYXNlLCB1cmwpO1xuICAgICAgICBvdmVyd3JpdGVBdHRyVmFsdWUocywgc291cmNlQ29kZUxvY2F0aW9uLCBmdWxsVXJsKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodXJsLnN0YXJ0c1dpdGgoJy4nKSAmJlxuICAgICAgICBvcmlnaW5hbFVybCAmJlxuICAgICAgICBvcmlnaW5hbFVybCAhPT0gJy8nICYmXG4gICAgICAgIGh0bWxQYXRoID09PSAnL2luZGV4Lmh0bWwnKSB7XG4gICAgICAgIC8vIHByZWZpeCB3aXRoIGJhc2UgKGRldiBvbmx5LCBiYXNlIGlzIG5ldmVyIHJlbGF0aXZlKVxuICAgICAgICBjb25zdCByZXBsYWNlciA9ICh1cmwpID0+IHBhdGgkby5wb3NpeC5qb2luKGRldkJhc2UsIHVybCk7XG4gICAgICAgIC8vICMzMjMwIGlmIHNvbWUgcmVxdWVzdCB1cmwgKGxvY2FsaG9zdDozMDAwL2EvYikgcmV0dXJuIHRvIGZhbGxiYWNrIGh0bWwsIHRoZSByZWxhdGl2ZSBhc3NldHNcbiAgICAgICAgLy8gcGF0aCB3aWxsIGFkZCBgL2EvYCBwcmVmaXgsIGl0IHdpbGwgY2F1c2VkIDQwNC5cbiAgICAgICAgLy8gcmV3cml0ZSBiZWZvcmUgYC4vaW5kZXguanNgIC0+IGBsb2NhbGhvc3Q6NTE3My9hL2luZGV4LmpzYC5cbiAgICAgICAgLy8gcmV3cml0ZSBhZnRlciBgLi4vaW5kZXguanNgIC0+IGBsb2NhbGhvc3Q6NTE3My9pbmRleC5qc2AuXG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZFVybCA9IGF0dHIubmFtZSA9PT0gJ3NyY3NldCcgJiYgYXR0ci5wcmVmaXggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBwcm9jZXNzU3JjU2V0U3luYyh1cmwsICh7IHVybCB9KSA9PiByZXBsYWNlcih1cmwpKVxuICAgICAgICAgICAgOiByZXBsYWNlcih1cmwpO1xuICAgICAgICBvdmVyd3JpdGVBdHRyVmFsdWUocywgc291cmNlQ29kZUxvY2F0aW9uLCBwcm9jZXNzZWRVcmwpO1xuICAgIH1cbn07XG5jb25zdCBkZXZIdG1sSG9vayA9IGFzeW5jIChodG1sLCB7IHBhdGg6IGh0bWxQYXRoLCBmaWxlbmFtZSwgc2VydmVyLCBvcmlnaW5hbFVybCB9KSA9PiB7XG4gICAgY29uc3QgeyBjb25maWcsIG1vZHVsZUdyYXBoLCB3YXRjaGVyIH0gPSBzZXJ2ZXI7XG4gICAgY29uc3QgYmFzZSA9IGNvbmZpZy5iYXNlIHx8ICcvJztcbiAgICBsZXQgcHJveHlNb2R1bGVQYXRoO1xuICAgIGxldCBwcm94eU1vZHVsZVVybDtcbiAgICBjb25zdCB0cmFpbGluZ1NsYXNoID0gaHRtbFBhdGguZW5kc1dpdGgoJy8nKTtcbiAgICBpZiAoIXRyYWlsaW5nU2xhc2ggJiYgZnMkbC5leGlzdHNTeW5jKGZpbGVuYW1lKSkge1xuICAgICAgICBwcm94eU1vZHVsZVBhdGggPSBodG1sUGF0aDtcbiAgICAgICAgcHJveHlNb2R1bGVVcmwgPSBqb2luVXJsU2VnbWVudHMoYmFzZSwgaHRtbFBhdGgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIHVzZXJzIG9mIHZpdGUudHJhbnNmb3JtSW5kZXhIdG1sIGNhbGxpbmcgaXQgd2l0aCB1cmwgJy8nXG4gICAgICAgIC8vIGZvciBTU1IgaW50ZWdyYXRpb25zICM3OTkzLCBmaWxlbmFtZSBpcyByb290IGZvciB0aGlzIGNhc2VcbiAgICAgICAgLy8gQSB1c2VyIG1heSBhbHNvIHVzZSBhIHZhbGlkIG5hbWUgZm9yIGEgdmlydHVhbCBodG1sIGZpbGVcbiAgICAgICAgLy8gTWFyayB0aGUgcGF0aCBhcyB2aXJ0dWFsIGluIGJvdGggY2FzZXMgc28gc291cmNlbWFwcyBhcmVuJ3QgcHJvY2Vzc2VkXG4gICAgICAgIC8vIGFuZCBpZHMgYXJlIHByb3Blcmx5IGhhbmRsZWRcbiAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYCR7aHRtbFBhdGh9JHt0cmFpbGluZ1NsYXNoID8gJ2luZGV4Lmh0bWwnIDogJyd9YDtcbiAgICAgICAgcHJveHlNb2R1bGVQYXRoID0gYFxcMCR7dmFsaWRQYXRofWA7XG4gICAgICAgIHByb3h5TW9kdWxlVXJsID0gd3JhcElkKHByb3h5TW9kdWxlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHMgPSBuZXcgTWFnaWNTdHJpbmcoaHRtbCk7XG4gICAgbGV0IGlubGluZU1vZHVsZUluZGV4ID0gLTE7XG4gICAgY29uc3QgcHJveHlDYWNoZVVybCA9IGNsZWFuVXJsKHByb3h5TW9kdWxlUGF0aCkucmVwbGFjZShub3JtYWxpemVQYXRoJDMoY29uZmlnLnJvb3QpLCAnJyk7XG4gICAgY29uc3Qgc3R5bGVVcmwgPSBbXTtcbiAgICBjb25zdCBhZGRJbmxpbmVNb2R1bGUgPSAobm9kZSwgZXh0KSA9PiB7XG4gICAgICAgIGlubGluZU1vZHVsZUluZGV4Kys7XG4gICAgICAgIGNvbnN0IGNvbnRlbnROb2RlID0gbm9kZS5jaGlsZE5vZGVzWzBdO1xuICAgICAgICBjb25zdCBjb2RlID0gY29udGVudE5vZGUudmFsdWU7XG4gICAgICAgIGxldCBtYXA7XG4gICAgICAgIGlmICghcHJveHlNb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJ1xcMCcpKSB7XG4gICAgICAgICAgICBtYXAgPSBuZXcgTWFnaWNTdHJpbmcoaHRtbClcbiAgICAgICAgICAgICAgICAuc25pcChjb250ZW50Tm9kZS5zb3VyY2VDb2RlTG9jYXRpb24uc3RhcnRPZmZzZXQsIGNvbnRlbnROb2RlLnNvdXJjZUNvZGVMb2NhdGlvbi5lbmRPZmZzZXQpXG4gICAgICAgICAgICAgICAgLmdlbmVyYXRlTWFwKHsgaGlyZXM6IHRydWUgfSk7XG4gICAgICAgICAgICBtYXAuc291cmNlcyA9IFtmaWxlbmFtZV07XG4gICAgICAgICAgICBtYXAuZmlsZSA9IGZpbGVuYW1lO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCBIVE1MIFByb3h5IHRvIE1hcFxuICAgICAgICBhZGRUb0hUTUxQcm94eUNhY2hlKGNvbmZpZywgcHJveHlDYWNoZVVybCwgaW5saW5lTW9kdWxlSW5kZXgsIHsgY29kZSwgbWFwIH0pO1xuICAgICAgICAvLyBpbmxpbmUganMgbW9kdWxlLiBjb252ZXJ0IHRvIHNyYz1cInByb3h5XCIgKGRldiBvbmx5LCBiYXNlIGlzIG5ldmVyIHJlbGF0aXZlKVxuICAgICAgICBjb25zdCBtb2R1bGVQYXRoID0gYCR7cHJveHlNb2R1bGVVcmx9P2h0bWwtcHJveHkmaW5kZXg9JHtpbmxpbmVNb2R1bGVJbmRleH0uJHtleHR9YDtcbiAgICAgICAgLy8gaW52YWxpZGF0ZSB0aGUgbW9kdWxlIHNvIHRoZSBuZXdseSBjYWNoZWQgY29udGVudHMgd2lsbCBiZSBzZXJ2ZWRcbiAgICAgICAgY29uc3QgbW9kdWxlID0gc2VydmVyPy5tb2R1bGVHcmFwaC5nZXRNb2R1bGVCeUlkKG1vZHVsZVBhdGgpO1xuICAgICAgICBpZiAobW9kdWxlKSB7XG4gICAgICAgICAgICBzZXJ2ZXI/Lm1vZHVsZUdyYXBoLmludmFsaWRhdGVNb2R1bGUobW9kdWxlKTtcbiAgICAgICAgfVxuICAgICAgICBzLnVwZGF0ZShub2RlLnNvdXJjZUNvZGVMb2NhdGlvbi5zdGFydE9mZnNldCwgbm9kZS5zb3VyY2VDb2RlTG9jYXRpb24uZW5kT2Zmc2V0LCBgPHNjcmlwdCB0eXBlPVwibW9kdWxlXCIgc3JjPVwiJHttb2R1bGVQYXRofVwiPjwvc2NyaXB0PmApO1xuICAgIH07XG4gICAgYXdhaXQgdHJhdmVyc2VIdG1sKGh0bWwsIGZpbGVuYW1lLCAobm9kZSkgPT4ge1xuICAgICAgICBpZiAoIW5vZGVJc0VsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBzY3JpcHQgdGFnc1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PT0gJ3NjcmlwdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3JjLCBzb3VyY2VDb2RlTG9jYXRpb24sIGlzTW9kdWxlIH0gPSBnZXRTY3JpcHRJbmZvKG5vZGUpO1xuICAgICAgICAgICAgaWYgKHNyYykge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NOb2RlVXJsKHNyYywgc291cmNlQ29kZUxvY2F0aW9uLCBzLCBjb25maWcsIGh0bWxQYXRoLCBvcmlnaW5hbFVybCwgbW9kdWxlR3JhcGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNNb2R1bGUgJiYgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGFkZElubGluZU1vZHVsZShub2RlLCAnanMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PT0gJ3N0eWxlJyAmJiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgICAgIHN0eWxlVXJsLnB1c2goe1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBjaGlsZHJlbi5zb3VyY2VDb2RlTG9jYXRpb24uc3RhcnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgZW5kOiBjaGlsZHJlbi5zb3VyY2VDb2RlTG9jYXRpb24uZW5kT2Zmc2V0LFxuICAgICAgICAgICAgICAgIGNvZGU6IGNoaWxkcmVuLnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxlbWVudHMgd2l0aCBbaHJlZi9zcmNdIGF0dHJzXG4gICAgICAgIGNvbnN0IGFzc2V0QXR0cnMgPSBhc3NldEF0dHJzQ29uZmlnW25vZGUubm9kZU5hbWVdO1xuICAgICAgICBpZiAoYXNzZXRBdHRycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIG5vZGUuYXR0cnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyS2V5ID0gZ2V0QXR0cktleShwKTtcbiAgICAgICAgICAgICAgICBpZiAocC52YWx1ZSAmJiBhc3NldEF0dHJzLmluY2x1ZGVzKGF0dHJLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOb2RlVXJsKHAsIG5vZGUuc291cmNlQ29kZUxvY2F0aW9uLmF0dHJzW2F0dHJLZXldLCBzLCBjb25maWcsIGh0bWxQYXRoLCBvcmlnaW5hbFVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoc3R5bGVVcmwubWFwKGFzeW5jICh7IHN0YXJ0LCBlbmQsIGNvZGUgfSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7cHJveHlNb2R1bGVQYXRofT9odG1sLXByb3h5JmRpcmVjdCZpbmRleD0ke2luZGV4fS5jc3NgO1xuICAgICAgICAvLyBlbnN1cmUgbW9kdWxlIGluIGdyYXBoIGFmdGVyIHN1Y2Nlc3NmdWwgbG9hZFxuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBtb2R1bGVHcmFwaC5lbnN1cmVFbnRyeUZyb21VcmwodXJsLCBmYWxzZSk7XG4gICAgICAgIGVuc3VyZVdhdGNoZWRGaWxlKHdhdGNoZXIsIG1vZC5maWxlLCBjb25maWcucm9vdCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZlci5wbHVnaW5Db250YWluZXIudHJhbnNmb3JtKGNvZGUsIG1vZC5pZCk7XG4gICAgICAgIHMub3ZlcndyaXRlKHN0YXJ0LCBlbmQsIHJlc3VsdD8uY29kZSB8fCAnJyk7XG4gICAgfSkpO1xuICAgIGh0bWwgPSBzLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaHRtbCxcbiAgICAgICAgdGFnczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRhZzogJ3NjcmlwdCcsXG4gICAgICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ21vZHVsZScsXG4gICAgICAgICAgICAgICAgICAgIHNyYzogcGF0aCRvLnBvc2l4LmpvaW4oYmFzZSwgQ0xJRU5UX1BVQkxJQ19QQVRIKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluamVjdFRvOiAnaGVhZC1wcmVwZW5kJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgfTtcbn07XG5mdW5jdGlvbiBpbmRleEh0bWxNaWRkbGV3YXJlKHNlcnZlcikge1xuICAgIC8vIEtlZXAgdGhlIG5hbWVkIGZ1bmN0aW9uLiBUaGUgbmFtZSBpcyB2aXNpYmxlIGluIGRlYnVnIGxvZ3MgdmlhIGBERUJVRz1jb25uZWN0OmRpc3BhdGNoZXIgLi4uYFxuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiB2aXRlSW5kZXhIdG1sTWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCkge1xuICAgICAgICBpZiAocmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJsID0gcmVxLnVybCAmJiBjbGVhblVybChyZXEudXJsKTtcbiAgICAgICAgLy8gaHRtbEZhbGxiYWNrTWlkZGxld2FyZSBhcHBlbmRzICcuaHRtbCcgdG8gVVJMc1xuICAgICAgICBpZiAodXJsPy5lbmRzV2l0aCgnLmh0bWwnKSAmJiByZXEuaGVhZGVyc1snc2VjLWZldGNoLWRlc3QnXSAhPT0gJ3NjcmlwdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gZ2V0SHRtbEZpbGVuYW1lKHVybCwgc2VydmVyKTtcbiAgICAgICAgICAgIGlmIChmcyRsLmV4aXN0c1N5bmMoZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGh0bWwgPSBmcyRsLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgPSBhd2FpdCBzZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgaHRtbCwgcmVxLm9yaWdpbmFsVXJsKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbmQkMShyZXEsIHJlcywgaHRtbCwgJ2h0bWwnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBzZXJ2ZXIuY29uZmlnLnNlcnZlci5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5leHQoKTtcbiAgICB9O1xufVxuXG5jb25zdCBsb2dUaW1lID0gY3JlYXRlRGVidWdnZXIoJ3ZpdGU6dGltZScpO1xuZnVuY3Rpb24gdGltZU1pZGRsZXdhcmUocm9vdCkge1xuICAgIC8vIEtlZXAgdGhlIG5hbWVkIGZ1bmN0aW9uLiBUaGUgbmFtZSBpcyB2aXNpYmxlIGluIGRlYnVnIGxvZ3MgdmlhIGBERUJVRz1jb25uZWN0OmRpc3BhdGNoZXIgLi4uYFxuICAgIHJldHVybiBmdW5jdGlvbiB2aXRlVGltZU1pZGRsZXdhcmUocmVxLCByZXMsIG5leHQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgY29uc3QgZW5kID0gcmVzLmVuZDtcbiAgICAgICAgcmVzLmVuZCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICBsb2dUaW1lKGAke3RpbWVGcm9tKHN0YXJ0KX0gJHtwcmV0dGlmeVVybChyZXEudXJsLCByb290KX1gKTtcbiAgICAgICAgICAgIHJldHVybiBlbmQuY2FsbChyZXMsIC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgICBuZXh0KCk7XG4gICAgfTtcbn1cblxuY2xhc3MgTW9kdWxlTm9kZSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHNldElzU2VsZkFjY2VwdGluZyAtIHNldCBgZmFsc2VgIHRvIHNldCBgaXNTZWxmQWNjZXB0aW5nYCBsYXRlci4gZS5nLiAjNzg3MFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVybCwgc2V0SXNTZWxmQWNjZXB0aW5nID0gdHJ1ZSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVzb2x2ZWQgZmlsZSBzeXN0ZW0gcGF0aCArIHF1ZXJ5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWxlID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbXBvcnRlcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuaW1wb3J0ZWRNb2R1bGVzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLmFjY2VwdGVkSG1yRGVwcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5hY2NlcHRlZEhtckV4cG9ydHMgPSBudWxsO1xuICAgICAgICB0aGlzLmltcG9ydGVkQmluZGluZ3MgPSBudWxsO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybVJlc3VsdCA9IG51bGw7XG4gICAgICAgIHRoaXMuc3NyVHJhbnNmb3JtUmVzdWx0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zc3JNb2R1bGUgPSBudWxsO1xuICAgICAgICB0aGlzLnNzckVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0SE1SVGltZXN0YW1wID0gMDtcbiAgICAgICAgdGhpcy5sYXN0SW52YWxpZGF0aW9uVGltZXN0YW1wID0gMDtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMudHlwZSA9IGlzRGlyZWN0Q1NTUmVxdWVzdCh1cmwpID8gJ2NzcycgOiAnanMnO1xuICAgICAgICBpZiAoc2V0SXNTZWxmQWNjZXB0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmlzU2VsZkFjY2VwdGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgTW9kdWxlR3JhcGgge1xuICAgIGNvbnN0cnVjdG9yKHJlc29sdmVJZCkge1xuICAgICAgICB0aGlzLnJlc29sdmVJZCA9IHJlc29sdmVJZDtcbiAgICAgICAgdGhpcy51cmxUb01vZHVsZU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5pZFRvTW9kdWxlTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAvLyBhIHNpbmdsZSBmaWxlIG1heSBjb3JyZXNwb25kcyB0byBtdWx0aXBsZSBtb2R1bGVzIHdpdGggZGlmZmVyZW50IHF1ZXJpZXNcbiAgICAgICAgdGhpcy5maWxlVG9Nb2R1bGVzTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnNhZmVNb2R1bGVzUGF0aCA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0TW9kdWxlQnlVcmwocmF3VXJsLCBzc3IpIHtcbiAgICAgICAgY29uc3QgW3VybF0gPSBhd2FpdCB0aGlzLnJlc29sdmVVcmwocmF3VXJsLCBzc3IpO1xuICAgICAgICByZXR1cm4gdGhpcy51cmxUb01vZHVsZU1hcC5nZXQodXJsKTtcbiAgICB9XG4gICAgZ2V0TW9kdWxlQnlJZChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZFRvTW9kdWxlTWFwLmdldChyZW1vdmVUaW1lc3RhbXBRdWVyeShpZCkpO1xuICAgIH1cbiAgICBnZXRNb2R1bGVzQnlGaWxlKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZVRvTW9kdWxlc01hcC5nZXQoZmlsZSk7XG4gICAgfVxuICAgIG9uRmlsZUNoYW5nZShmaWxlKSB7XG4gICAgICAgIGNvbnN0IG1vZHMgPSB0aGlzLmdldE1vZHVsZXNCeUZpbGUoZmlsZSk7XG4gICAgICAgIGlmIChtb2RzKSB7XG4gICAgICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgbW9kcy5mb3JFYWNoKChtb2QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRhdGVNb2R1bGUobW9kLCBzZWVuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludmFsaWRhdGVNb2R1bGUobW9kLCBzZWVuID0gbmV3IFNldCgpLCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpLCBpc0htciA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhtb2QpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5hZGQobW9kKTtcbiAgICAgICAgaWYgKGlzSG1yKSB7XG4gICAgICAgICAgICBtb2QubGFzdEhNUlRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHRpbWVzdGFtcCBmb3IgdGhpcyBpbnZhbGlkYXRpb24sIHNvIHdlIGNhbiBhdm9pZCBjYWNoaW5nIHRoZSByZXN1bHQgb2YgcG9zc2libGUgYWxyZWFkeSBzdGFydGVkXG4gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIGJlaW5nIGRvbmUgZm9yIHRoaXMgbW9kdWxlXG4gICAgICAgICAgICBtb2QubGFzdEludmFsaWRhdGlvblRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBEb24ndCBpbnZhbGlkYXRlIG1vZC5pbmZvIGFuZCBtb2QubWV0YSwgYXMgdGhleSBhcmUgcGFydCBvZiB0aGUgcHJvY2Vzc2luZyBwaXBlbGluZVxuICAgICAgICAvLyBJbnZhbGlkYXRpbmcgdGhlIHRyYW5zZm9ybSByZXN1bHQgaXMgZW5vdWdoIHRvIGVuc3VyZSB0aGlzIG1vZHVsZSBpcyByZS1wcm9jZXNzZWQgbmV4dCB0aW1lIGl0IGlzIHJlcXVlc3RlZFxuICAgICAgICBtb2QudHJhbnNmb3JtUmVzdWx0ID0gbnVsbDtcbiAgICAgICAgbW9kLnNzclRyYW5zZm9ybVJlc3VsdCA9IG51bGw7XG4gICAgICAgIG1vZC5zc3JNb2R1bGUgPSBudWxsO1xuICAgICAgICBtb2Quc3NyRXJyb3IgPSBudWxsO1xuICAgICAgICBtb2QuaW1wb3J0ZXJzLmZvckVhY2goKGltcG9ydGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWltcG9ydGVyLmFjY2VwdGVkSG1yRGVwcy5oYXMobW9kKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZU1vZHVsZShpbXBvcnRlciwgc2VlbiwgdGltZXN0YW1wLCBpc0htcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnZhbGlkYXRlQWxsKCkge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLmlkVG9Nb2R1bGVNYXAuZm9yRWFjaCgobW9kKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmludmFsaWRhdGVNb2R1bGUobW9kLCBzZWVuLCB0aW1lc3RhbXApO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBtb2R1bGUgZ3JhcGggYmFzZWQgb24gYSBtb2R1bGUncyB1cGRhdGVkIGltcG9ydHMgaW5mb3JtYXRpb25cbiAgICAgKiBJZiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgYW55IGltcG9ydGVycywgdGhleSBhcmVcbiAgICAgKiByZXR1cm5lZCBhcyBhIFNldC5cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVNb2R1bGVJbmZvKG1vZCwgaW1wb3J0ZWRNb2R1bGVzLCBpbXBvcnRlZEJpbmRpbmdzLCBhY2NlcHRlZE1vZHVsZXMsIGFjY2VwdGVkRXhwb3J0cywgaXNTZWxmQWNjZXB0aW5nLCBzc3IpIHtcbiAgICAgICAgbW9kLmlzU2VsZkFjY2VwdGluZyA9IGlzU2VsZkFjY2VwdGluZztcbiAgICAgICAgY29uc3QgcHJldkltcG9ydHMgPSBtb2QuaW1wb3J0ZWRNb2R1bGVzO1xuICAgICAgICBjb25zdCBuZXh0SW1wb3J0cyA9IChtb2QuaW1wb3J0ZWRNb2R1bGVzID0gbmV3IFNldCgpKTtcbiAgICAgICAgbGV0IG5vTG9uZ2VySW1wb3J0ZWQ7XG4gICAgICAgIC8vIHVwZGF0ZSBpbXBvcnQgZ3JhcGhcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRlZCBvZiBpbXBvcnRlZE1vZHVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcCA9IHR5cGVvZiBpbXBvcnRlZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGF3YWl0IHRoaXMuZW5zdXJlRW50cnlGcm9tVXJsKGltcG9ydGVkLCBzc3IpXG4gICAgICAgICAgICAgICAgOiBpbXBvcnRlZDtcbiAgICAgICAgICAgIGRlcC5pbXBvcnRlcnMuYWRkKG1vZCk7XG4gICAgICAgICAgICBuZXh0SW1wb3J0cy5hZGQoZGVwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgdGhlIGltcG9ydGVyIGZyb20gZGVwcyB0aGF0IHdlcmUgaW1wb3J0ZWQgYnV0IG5vIGxvbmdlciBhcmUuXG4gICAgICAgIHByZXZJbXBvcnRzLmZvckVhY2goKGRlcCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFuZXh0SW1wb3J0cy5oYXMoZGVwKSkge1xuICAgICAgICAgICAgICAgIGRlcC5pbXBvcnRlcnMuZGVsZXRlKG1vZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkZXAuaW1wb3J0ZXJzLnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgKG5vTG9uZ2VySW1wb3J0ZWQgfHwgKG5vTG9uZ2VySW1wb3J0ZWQgPSBuZXcgU2V0KCkpKS5hZGQoZGVwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB1cGRhdGUgYWNjZXB0ZWQgaG1yIGRlcHNcbiAgICAgICAgY29uc3QgZGVwcyA9IChtb2QuYWNjZXB0ZWRIbXJEZXBzID0gbmV3IFNldCgpKTtcbiAgICAgICAgZm9yIChjb25zdCBhY2NlcHRlZCBvZiBhY2NlcHRlZE1vZHVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcCA9IHR5cGVvZiBhY2NlcHRlZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGF3YWl0IHRoaXMuZW5zdXJlRW50cnlGcm9tVXJsKGFjY2VwdGVkLCBzc3IpXG4gICAgICAgICAgICAgICAgOiBhY2NlcHRlZDtcbiAgICAgICAgICAgIGRlcHMuYWRkKGRlcCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXBkYXRlIGFjY2VwdGVkIGhtciBleHBvcnRzXG4gICAgICAgIG1vZC5hY2NlcHRlZEhtckV4cG9ydHMgPSBhY2NlcHRlZEV4cG9ydHM7XG4gICAgICAgIG1vZC5pbXBvcnRlZEJpbmRpbmdzID0gaW1wb3J0ZWRCaW5kaW5ncztcbiAgICAgICAgcmV0dXJuIG5vTG9uZ2VySW1wb3J0ZWQ7XG4gICAgfVxuICAgIGFzeW5jIGVuc3VyZUVudHJ5RnJvbVVybChyYXdVcmwsIHNzciwgc2V0SXNTZWxmQWNjZXB0aW5nID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBbdXJsLCByZXNvbHZlZElkLCBtZXRhXSA9IGF3YWl0IHRoaXMucmVzb2x2ZVVybChyYXdVcmwsIHNzcik7XG4gICAgICAgIGxldCBtb2QgPSB0aGlzLmlkVG9Nb2R1bGVNYXAuZ2V0KHJlc29sdmVkSWQpO1xuICAgICAgICBpZiAoIW1vZCkge1xuICAgICAgICAgICAgbW9kID0gbmV3IE1vZHVsZU5vZGUodXJsLCBzZXRJc1NlbGZBY2NlcHRpbmcpO1xuICAgICAgICAgICAgaWYgKG1ldGEpXG4gICAgICAgICAgICAgICAgbW9kLm1ldGEgPSBtZXRhO1xuICAgICAgICAgICAgdGhpcy51cmxUb01vZHVsZU1hcC5zZXQodXJsLCBtb2QpO1xuICAgICAgICAgICAgbW9kLmlkID0gcmVzb2x2ZWRJZDtcbiAgICAgICAgICAgIHRoaXMuaWRUb01vZHVsZU1hcC5zZXQocmVzb2x2ZWRJZCwgbW9kKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSAobW9kLmZpbGUgPSBjbGVhblVybChyZXNvbHZlZElkKSk7XG4gICAgICAgICAgICBsZXQgZmlsZU1hcHBlZE1vZHVsZXMgPSB0aGlzLmZpbGVUb01vZHVsZXNNYXAuZ2V0KGZpbGUpO1xuICAgICAgICAgICAgaWYgKCFmaWxlTWFwcGVkTW9kdWxlcykge1xuICAgICAgICAgICAgICAgIGZpbGVNYXBwZWRNb2R1bGVzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZVRvTW9kdWxlc01hcC5zZXQoZmlsZSwgZmlsZU1hcHBlZE1vZHVsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsZU1hcHBlZE1vZHVsZXMuYWRkKG1vZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbXVsdGlwbGUgdXJscyBjYW4gbWFwIHRvIHRoZSBzYW1lIG1vZHVsZSBhbmQgaWQsIG1ha2Ugc3VyZSB3ZSByZWdpc3RlclxuICAgICAgICAvLyB0aGUgdXJsIHRvIHRoZSBleGlzdGluZyBtb2R1bGUgaW4gdGhhdCBjYXNlXG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLnVybFRvTW9kdWxlTWFwLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICB0aGlzLnVybFRvTW9kdWxlTWFwLnNldCh1cmwsIG1vZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZDtcbiAgICB9XG4gICAgLy8gc29tZSBkZXBzLCBsaWtlIGEgY3NzIGZpbGUgcmVmZXJlbmNlZCB2aWEgQGltcG9ydCwgZG9uJ3QgaGF2ZSBpdHMgb3duXG4gICAgLy8gdXJsIGJlY2F1c2UgdGhleSBhcmUgaW5saW5lZCBpbnRvIHRoZSBtYWluIGNzcyBpbXBvcnQuIEJ1dCB0aGV5IHN0aWxsXG4gICAgLy8gbmVlZCB0byBiZSByZXByZXNlbnRlZCBpbiB0aGUgbW9kdWxlIGdyYXBoIHNvIHRoYXQgdGhleSBjYW4gdHJpZ2dlclxuICAgIC8vIGhtciBpbiB0aGUgaW1wb3J0aW5nIGNzcyBmaWxlLlxuICAgIGNyZWF0ZUZpbGVPbmx5RW50cnkoZmlsZSkge1xuICAgICAgICBmaWxlID0gbm9ybWFsaXplUGF0aCQzKGZpbGUpO1xuICAgICAgICBsZXQgZmlsZU1hcHBlZE1vZHVsZXMgPSB0aGlzLmZpbGVUb01vZHVsZXNNYXAuZ2V0KGZpbGUpO1xuICAgICAgICBpZiAoIWZpbGVNYXBwZWRNb2R1bGVzKSB7XG4gICAgICAgICAgICBmaWxlTWFwcGVkTW9kdWxlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZVRvTW9kdWxlc01hcC5zZXQoZmlsZSwgZmlsZU1hcHBlZE1vZHVsZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybCA9IGAke0ZTX1BSRUZJWH0ke2ZpbGV9YDtcbiAgICAgICAgZm9yIChjb25zdCBtIG9mIGZpbGVNYXBwZWRNb2R1bGVzKSB7XG4gICAgICAgICAgICBpZiAobS51cmwgPT09IHVybCB8fCBtLmlkID09PSBmaWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kID0gbmV3IE1vZHVsZU5vZGUodXJsKTtcbiAgICAgICAgbW9kLmZpbGUgPSBmaWxlO1xuICAgICAgICBmaWxlTWFwcGVkTW9kdWxlcy5hZGQobW9kKTtcbiAgICAgICAgcmV0dXJuIG1vZDtcbiAgICB9XG4gICAgLy8gZm9yIGluY29taW5nIHVybHMsIGl0IGlzIGltcG9ydGFudCB0bzpcbiAgICAvLyAxLiByZW1vdmUgdGhlIEhNUiB0aW1lc3RhbXAgcXVlcnkgKD90PXh4eHgpXG4gICAgLy8gMi4gcmVzb2x2ZSBpdHMgZXh0ZW5zaW9uIHNvIHRoYXQgdXJscyB3aXRoIG9yIHdpdGhvdXQgZXh0ZW5zaW9uIGFsbCBtYXAgdG9cbiAgICAvLyB0aGUgc2FtZSBtb2R1bGVcbiAgICBhc3luYyByZXNvbHZlVXJsKHVybCwgc3NyKSB7XG4gICAgICAgIHVybCA9IHJlbW92ZUltcG9ydFF1ZXJ5KHJlbW92ZVRpbWVzdGFtcFF1ZXJ5KHVybCkpO1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMucmVzb2x2ZUlkKHVybCwgISFzc3IpO1xuICAgICAgICBjb25zdCByZXNvbHZlZElkID0gcmVzb2x2ZWQ/LmlkIHx8IHVybDtcbiAgICAgICAgaWYgKHVybCAhPT0gcmVzb2x2ZWRJZCAmJlxuICAgICAgICAgICAgIXVybC5pbmNsdWRlcygnXFwwJykgJiZcbiAgICAgICAgICAgICF1cmwuc3RhcnRzV2l0aChgdmlydHVhbDpgKSkge1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gZXh0bmFtZSQxKGNsZWFuVXJsKHJlc29sdmVkSWQpKTtcbiAgICAgICAgICAgIGNvbnN0IHsgcGF0aG5hbWUsIHNlYXJjaCwgaGFzaCB9ID0gbmV3IFVSTCh1cmwsICdyZWxhdGl2ZTovLycpO1xuICAgICAgICAgICAgaWYgKGV4dCAmJiAhcGF0aG5hbWUuZW5kc1dpdGgoZXh0KSkge1xuICAgICAgICAgICAgICAgIHVybCA9IHBhdGhuYW1lICsgZXh0ICsgc2VhcmNoICsgaGFzaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3VybCwgcmVzb2x2ZWRJZCwgcmVzb2x2ZWQ/Lm1ldGFdO1xuICAgIH1cbn1cblxudmFyIGlzV3NsRXhwb3J0cyA9IHt9O1xudmFyIGlzV3NsJDIgPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiBpc1dzbEV4cG9ydHM7IH0sXG4gIHNldCBleHBvcnRzKHYpeyBpc1dzbEV4cG9ydHMgPSB2OyB9LFxufTtcblxuY29uc3QgZnMkMyA9IHJlcXVpcmUkJDBfX2RlZmF1bHQ7XG5cbmxldCBpc0RvY2tlciQyO1xuXG5mdW5jdGlvbiBoYXNEb2NrZXJFbnYoKSB7XG5cdHRyeSB7XG5cdFx0ZnMkMy5zdGF0U3luYygnLy5kb2NrZXJlbnYnKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoXykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5mdW5jdGlvbiBoYXNEb2NrZXJDR3JvdXAoKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIGZzJDMucmVhZEZpbGVTeW5jKCcvcHJvYy9zZWxmL2Nncm91cCcsICd1dGY4JykuaW5jbHVkZXMoJ2RvY2tlcicpO1xuXHR9IGNhdGNoIChfKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbnZhciBpc0RvY2tlcl8xID0gKCkgPT4ge1xuXHRpZiAoaXNEb2NrZXIkMiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0aXNEb2NrZXIkMiA9IGhhc0RvY2tlckVudigpIHx8IGhhc0RvY2tlckNHcm91cCgpO1xuXHR9XG5cblx0cmV0dXJuIGlzRG9ja2VyJDI7XG59O1xuXG5jb25zdCBvcyA9IHJlcXVpcmUkJDI7XG5jb25zdCBmcyQyID0gcmVxdWlyZSQkMF9fZGVmYXVsdDtcbmNvbnN0IGlzRG9ja2VyJDEgPSBpc0RvY2tlcl8xO1xuXG5jb25zdCBpc1dzbCQxID0gKCkgPT4ge1xuXHRpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ2xpbnV4Jykge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmIChvcy5yZWxlYXNlKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnbWljcm9zb2Z0JykpIHtcblx0XHRpZiAoaXNEb2NrZXIkMSgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHR0cnkge1xuXHRcdHJldHVybiBmcyQyLnJlYWRGaWxlU3luYygnL3Byb2MvdmVyc2lvbicsICd1dGY4JykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnbWljcm9zb2Z0JykgP1xuXHRcdFx0IWlzRG9ja2VyJDEoKSA6IGZhbHNlO1xuXHR9IGNhdGNoIChfKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG5pZiAocHJvY2Vzcy5lbnYuX19JU19XU0xfVEVTVF9fKSB7XG5cdGlzV3NsJDIuZXhwb3J0cyA9IGlzV3NsJDE7XG59IGVsc2Uge1xuXHRpc1dzbCQyLmV4cG9ydHMgPSBpc1dzbCQxKCk7XG59XG5cbnZhciBkZWZpbmVMYXp5UHJvcCA9IChvYmplY3QsIHByb3BlcnR5TmFtZSwgZm4pID0+IHtcblx0Y29uc3QgZGVmaW5lID0gdmFsdWUgPT4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHlOYW1lLCB7dmFsdWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlfSk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHlOYW1lLCB7XG5cdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0Z2V0KCkge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gZm4oKTtcblx0XHRcdGRlZmluZShyZXN1bHQpO1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldCh2YWx1ZSkge1xuXHRcdFx0ZGVmaW5lKHZhbHVlKTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBvYmplY3Q7XG59O1xuXG5jb25zdCBwYXRoJDMgPSByZXF1aXJlJCQwJDQ7XG5jb25zdCBjaGlsZFByb2Nlc3MgPSByZXF1aXJlJCQyJDE7XG5jb25zdCB7cHJvbWlzZXM6IGZzJDEsIGNvbnN0YW50czogZnNDb25zdGFudHN9ID0gcmVxdWlyZSQkMF9fZGVmYXVsdDtcbmNvbnN0IGlzV3NsID0gaXNXc2xFeHBvcnRzO1xuY29uc3QgaXNEb2NrZXIgPSBpc0RvY2tlcl8xO1xuY29uc3QgZGVmaW5lTGF6eVByb3BlcnR5ID0gZGVmaW5lTGF6eVByb3A7XG5cbi8vIFBhdGggdG8gaW5jbHVkZWQgYHhkZy1vcGVuYC5cbmNvbnN0IGxvY2FsWGRnT3BlblBhdGggPSBwYXRoJDMuam9pbihfX2Rpcm5hbWUsICd4ZGctb3BlbicpO1xuXG5jb25zdCB7cGxhdGZvcm0sIGFyY2h9ID0gcHJvY2VzcztcblxuLy8gUG9kbWFuIGRldGVjdGlvblxuY29uc3QgaGFzQ29udGFpbmVyRW52ID0gKCkgPT4ge1xuXHR0cnkge1xuXHRcdGZzJDEuc3RhdFN5bmMoJy9ydW4vLmNvbnRhaW5lcmVudicpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbmxldCBjYWNoZWRSZXN1bHQ7XG5mdW5jdGlvbiBpc0luc2lkZUNvbnRhaW5lcigpIHtcblx0aWYgKGNhY2hlZFJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Y2FjaGVkUmVzdWx0ID0gaGFzQ29udGFpbmVyRW52KCkgfHwgaXNEb2NrZXIoKTtcblx0fVxuXG5cdHJldHVybiBjYWNoZWRSZXN1bHQ7XG59XG5cbi8qKlxuR2V0IHRoZSBtb3VudCBwb2ludCBmb3IgZml4ZWQgZHJpdmVzIGluIFdTTC5cblxuQGlubmVyXG5AcmV0dXJucyB7c3RyaW5nfSBUaGUgbW91bnQgcG9pbnQuXG4qL1xuY29uc3QgZ2V0V3NsRHJpdmVzTW91bnRQb2ludCA9ICgoKSA9PiB7XG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIFwicm9vdFwiIHBhcmFtXG5cdC8vIGFjY29yZGluZyB0byBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL3dzbC93c2wtY29uZmlnXG5cdGNvbnN0IGRlZmF1bHRNb3VudFBvaW50ID0gJy9tbnQvJztcblxuXHRsZXQgbW91bnRQb2ludDtcblxuXHRyZXR1cm4gYXN5bmMgZnVuY3Rpb24gKCkge1xuXHRcdGlmIChtb3VudFBvaW50KSB7XG5cdFx0XHQvLyBSZXR1cm4gbWVtb2l6ZWQgbW91bnQgcG9pbnQgdmFsdWVcblx0XHRcdHJldHVybiBtb3VudFBvaW50O1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gJy9ldGMvd3NsLmNvbmYnO1xuXG5cdFx0bGV0IGlzQ29uZmlnRmlsZUV4aXN0cyA9IGZhbHNlO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBmcyQxLmFjY2Vzcyhjb25maWdGaWxlUGF0aCwgZnNDb25zdGFudHMuRl9PSyk7XG5cdFx0XHRpc0NvbmZpZ0ZpbGVFeGlzdHMgPSB0cnVlO1xuXHRcdH0gY2F0Y2gge31cblxuXHRcdGlmICghaXNDb25maWdGaWxlRXhpc3RzKSB7XG5cdFx0XHRyZXR1cm4gZGVmYXVsdE1vdW50UG9pbnQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29uZmlnQ29udGVudCA9IGF3YWl0IGZzJDEucmVhZEZpbGUoY29uZmlnRmlsZVBhdGgsIHtlbmNvZGluZzogJ3V0ZjgnfSk7XG5cdFx0Y29uc3QgY29uZmlnTW91bnRQb2ludCA9IC8oPzwhIy4qKXJvb3RcXHMqPVxccyooPzxtb3VudFBvaW50Pi4qKS9nLmV4ZWMoY29uZmlnQ29udGVudCk7XG5cblx0XHRpZiAoIWNvbmZpZ01vdW50UG9pbnQpIHtcblx0XHRcdHJldHVybiBkZWZhdWx0TW91bnRQb2ludDtcblx0XHR9XG5cblx0XHRtb3VudFBvaW50ID0gY29uZmlnTW91bnRQb2ludC5ncm91cHMubW91bnRQb2ludC50cmltKCk7XG5cdFx0bW91bnRQb2ludCA9IG1vdW50UG9pbnQuZW5kc1dpdGgoJy8nKSA/IG1vdW50UG9pbnQgOiBgJHttb3VudFBvaW50fS9gO1xuXG5cdFx0cmV0dXJuIG1vdW50UG9pbnQ7XG5cdH07XG59KSgpO1xuXG5jb25zdCBwVHJ5RWFjaCA9IGFzeW5jIChhcnJheSwgbWFwcGVyKSA9PiB7XG5cdGxldCBsYXRlc3RFcnJvcjtcblxuXHRmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyYXkpIHtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGF3YWl0IG1hcHBlcihpdGVtKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1hd2FpdC1pbi1sb29wXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGxhdGVzdEVycm9yID0gZXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgbGF0ZXN0RXJyb3I7XG59O1xuXG5jb25zdCBiYXNlT3BlbiA9IGFzeW5jIG9wdGlvbnMgPT4ge1xuXHRvcHRpb25zID0ge1xuXHRcdHdhaXQ6IGZhbHNlLFxuXHRcdGJhY2tncm91bmQ6IGZhbHNlLFxuXHRcdG5ld0luc3RhbmNlOiBmYWxzZSxcblx0XHRhbGxvd05vbnplcm9FeGl0Q29kZTogZmFsc2UsXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuYXBwKSkge1xuXHRcdHJldHVybiBwVHJ5RWFjaChvcHRpb25zLmFwcCwgc2luZ2xlQXBwID0+IGJhc2VPcGVuKHtcblx0XHRcdC4uLm9wdGlvbnMsXG5cdFx0XHRhcHA6IHNpbmdsZUFwcFxuXHRcdH0pKTtcblx0fVxuXG5cdGxldCB7bmFtZTogYXBwLCBhcmd1bWVudHM6IGFwcEFyZ3VtZW50cyA9IFtdfSA9IG9wdGlvbnMuYXBwIHx8IHt9O1xuXHRhcHBBcmd1bWVudHMgPSBbLi4uYXBwQXJndW1lbnRzXTtcblxuXHRpZiAoQXJyYXkuaXNBcnJheShhcHApKSB7XG5cdFx0cmV0dXJuIHBUcnlFYWNoKGFwcCwgYXBwTmFtZSA9PiBiYXNlT3Blbih7XG5cdFx0XHQuLi5vcHRpb25zLFxuXHRcdFx0YXBwOiB7XG5cdFx0XHRcdG5hbWU6IGFwcE5hbWUsXG5cdFx0XHRcdGFyZ3VtZW50czogYXBwQXJndW1lbnRzXG5cdFx0XHR9XG5cdFx0fSkpO1xuXHR9XG5cblx0bGV0IGNvbW1hbmQ7XG5cdGNvbnN0IGNsaUFyZ3VtZW50cyA9IFtdO1xuXHRjb25zdCBjaGlsZFByb2Nlc3NPcHRpb25zID0ge307XG5cblx0aWYgKHBsYXRmb3JtID09PSAnZGFyd2luJykge1xuXHRcdGNvbW1hbmQgPSAnb3Blbic7XG5cblx0XHRpZiAob3B0aW9ucy53YWl0KSB7XG5cdFx0XHRjbGlBcmd1bWVudHMucHVzaCgnLS13YWl0LWFwcHMnKTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5iYWNrZ3JvdW5kKSB7XG5cdFx0XHRjbGlBcmd1bWVudHMucHVzaCgnLS1iYWNrZ3JvdW5kJyk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMubmV3SW5zdGFuY2UpIHtcblx0XHRcdGNsaUFyZ3VtZW50cy5wdXNoKCctLW5ldycpO1xuXHRcdH1cblxuXHRcdGlmIChhcHApIHtcblx0XHRcdGNsaUFyZ3VtZW50cy5wdXNoKCctYScsIGFwcCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHBsYXRmb3JtID09PSAnd2luMzInIHx8IChpc1dzbCAmJiAhaXNJbnNpZGVDb250YWluZXIoKSAmJiAhYXBwKSkge1xuXHRcdGNvbnN0IG1vdW50UG9pbnQgPSBhd2FpdCBnZXRXc2xEcml2ZXNNb3VudFBvaW50KCk7XG5cblx0XHRjb21tYW5kID0gaXNXc2wgP1xuXHRcdFx0YCR7bW91bnRQb2ludH1jL1dpbmRvd3MvU3lzdGVtMzIvV2luZG93c1Bvd2VyU2hlbGwvdjEuMC9wb3dlcnNoZWxsLmV4ZWAgOlxuXHRcdFx0YCR7cHJvY2Vzcy5lbnYuU1lTVEVNUk9PVH1cXFxcU3lzdGVtMzJcXFxcV2luZG93c1Bvd2VyU2hlbGxcXFxcdjEuMFxcXFxwb3dlcnNoZWxsYDtcblxuXHRcdGNsaUFyZ3VtZW50cy5wdXNoKFxuXHRcdFx0Jy1Ob1Byb2ZpbGUnLFxuXHRcdFx0Jy1Ob25JbnRlcmFjdGl2ZScsXG5cdFx0XHQnXHUyMDEzRXhlY3V0aW9uUG9saWN5Jyxcblx0XHRcdCdCeXBhc3MnLFxuXHRcdFx0Jy1FbmNvZGVkQ29tbWFuZCdcblx0XHQpO1xuXG5cdFx0aWYgKCFpc1dzbCkge1xuXHRcdFx0Y2hpbGRQcm9jZXNzT3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGVuY29kZWRBcmd1bWVudHMgPSBbJ1N0YXJ0J107XG5cblx0XHRpZiAob3B0aW9ucy53YWl0KSB7XG5cdFx0XHRlbmNvZGVkQXJndW1lbnRzLnB1c2goJy1XYWl0Jyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFwcCkge1xuXHRcdFx0Ly8gRG91YmxlIHF1b3RlIHdpdGggZG91YmxlIHF1b3RlcyB0byBlbnN1cmUgdGhlIGlubmVyIHF1b3RlcyBhcmUgcGFzc2VkIHRocm91Z2guXG5cdFx0XHQvLyBJbm5lciBxdW90ZXMgYXJlIGRlbGltaXRlZCBmb3IgUG93ZXJTaGVsbCBpbnRlcnByZXRhdGlvbiB3aXRoIGJhY2t0aWNrcy5cblx0XHRcdGVuY29kZWRBcmd1bWVudHMucHVzaChgXCJcXGBcIiR7YXBwfVxcYFwiXCJgLCAnLUFyZ3VtZW50TGlzdCcpO1xuXHRcdFx0aWYgKG9wdGlvbnMudGFyZ2V0KSB7XG5cdFx0XHRcdGFwcEFyZ3VtZW50cy51bnNoaWZ0KG9wdGlvbnMudGFyZ2V0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG9wdGlvbnMudGFyZ2V0KSB7XG5cdFx0XHRlbmNvZGVkQXJndW1lbnRzLnB1c2goYFwiJHtvcHRpb25zLnRhcmdldH1cImApO1xuXHRcdH1cblxuXHRcdGlmIChhcHBBcmd1bWVudHMubGVuZ3RoID4gMCkge1xuXHRcdFx0YXBwQXJndW1lbnRzID0gYXBwQXJndW1lbnRzLm1hcChhcmcgPT4gYFwiXFxgXCIke2FyZ31cXGBcIlwiYCk7XG5cdFx0XHRlbmNvZGVkQXJndW1lbnRzLnB1c2goYXBwQXJndW1lbnRzLmpvaW4oJywnKSk7XG5cdFx0fVxuXG5cdFx0Ly8gVXNpbmcgQmFzZTY0LWVuY29kZWQgY29tbWFuZCwgYWNjZXB0ZWQgYnkgUG93ZXJTaGVsbCwgdG8gYWxsb3cgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuXHRcdG9wdGlvbnMudGFyZ2V0ID0gQnVmZmVyLmZyb20oZW5jb2RlZEFyZ3VtZW50cy5qb2luKCcgJyksICd1dGYxNmxlJykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXHR9IGVsc2Uge1xuXHRcdGlmIChhcHApIHtcblx0XHRcdGNvbW1hbmQgPSBhcHA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFdoZW4gYnVuZGxlZCBieSBXZWJwYWNrLCB0aGVyZSdzIG5vIGFjdHVhbCBwYWNrYWdlIGZpbGUgcGF0aCBhbmQgbm8gbG9jYWwgYHhkZy1vcGVuYC5cblx0XHRcdGNvbnN0IGlzQnVuZGxlZCA9ICFfX2Rpcm5hbWUgfHwgX19kaXJuYW1lID09PSAnLyc7XG5cblx0XHRcdC8vIENoZWNrIGlmIGxvY2FsIGB4ZGctb3BlbmAgZXhpc3RzIGFuZCBpcyBleGVjdXRhYmxlLlxuXHRcdFx0bGV0IGV4ZUxvY2FsWGRnT3BlbiA9IGZhbHNlO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgZnMkMS5hY2Nlc3MobG9jYWxYZGdPcGVuUGF0aCwgZnNDb25zdGFudHMuWF9PSyk7XG5cdFx0XHRcdGV4ZUxvY2FsWGRnT3BlbiA9IHRydWU7XG5cdFx0XHR9IGNhdGNoIHt9XG5cblx0XHRcdGNvbnN0IHVzZVN5c3RlbVhkZ09wZW4gPSBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uIHx8XG5cdFx0XHRcdHBsYXRmb3JtID09PSAnYW5kcm9pZCcgfHwgaXNCdW5kbGVkIHx8ICFleGVMb2NhbFhkZ09wZW47XG5cdFx0XHRjb21tYW5kID0gdXNlU3lzdGVtWGRnT3BlbiA/ICd4ZGctb3BlbicgOiBsb2NhbFhkZ09wZW5QYXRoO1xuXHRcdH1cblxuXHRcdGlmIChhcHBBcmd1bWVudHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y2xpQXJndW1lbnRzLnB1c2goLi4uYXBwQXJndW1lbnRzKTtcblx0XHR9XG5cblx0XHRpZiAoIW9wdGlvbnMud2FpdCkge1xuXHRcdFx0Ly8gYHhkZy1vcGVuYCB3aWxsIGJsb2NrIHRoZSBwcm9jZXNzIHVubGVzcyBzdGRpbyBpcyBpZ25vcmVkXG5cdFx0XHQvLyBhbmQgaXQncyBkZXRhY2hlZCBmcm9tIHRoZSBwYXJlbnQgZXZlbiBpZiBpdCdzIHVucmVmJ2QuXG5cdFx0XHRjaGlsZFByb2Nlc3NPcHRpb25zLnN0ZGlvID0gJ2lnbm9yZSc7XG5cdFx0XHRjaGlsZFByb2Nlc3NPcHRpb25zLmRldGFjaGVkID0gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRpZiAob3B0aW9ucy50YXJnZXQpIHtcblx0XHRjbGlBcmd1bWVudHMucHVzaChvcHRpb25zLnRhcmdldCk7XG5cdH1cblxuXHRpZiAocGxhdGZvcm0gPT09ICdkYXJ3aW4nICYmIGFwcEFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG5cdFx0Y2xpQXJndW1lbnRzLnB1c2goJy0tYXJncycsIC4uLmFwcEFyZ3VtZW50cyk7XG5cdH1cblxuXHRjb25zdCBzdWJwcm9jZXNzID0gY2hpbGRQcm9jZXNzLnNwYXduKGNvbW1hbmQsIGNsaUFyZ3VtZW50cywgY2hpbGRQcm9jZXNzT3B0aW9ucyk7XG5cblx0aWYgKG9wdGlvbnMud2FpdCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRzdWJwcm9jZXNzLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcblxuXHRcdFx0c3VicHJvY2Vzcy5vbmNlKCdjbG9zZScsIGV4aXRDb2RlID0+IHtcblx0XHRcdFx0aWYgKCFvcHRpb25zLmFsbG93Tm9uemVyb0V4aXRDb2RlICYmIGV4aXRDb2RlID4gMCkge1xuXHRcdFx0XHRcdHJlamVjdChuZXcgRXJyb3IoYEV4aXRlZCB3aXRoIGNvZGUgJHtleGl0Q29kZX1gKSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzb2x2ZShzdWJwcm9jZXNzKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0c3VicHJvY2Vzcy51bnJlZigpO1xuXG5cdHJldHVybiBzdWJwcm9jZXNzO1xufTtcblxuY29uc3Qgb3BlbiA9ICh0YXJnZXQsIG9wdGlvbnMpID0+IHtcblx0aWYgKHR5cGVvZiB0YXJnZXQgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBgdGFyZ2V0YCcpO1xuXHR9XG5cblx0cmV0dXJuIGJhc2VPcGVuKHtcblx0XHQuLi5vcHRpb25zLFxuXHRcdHRhcmdldFxuXHR9KTtcbn07XG5cbmNvbnN0IG9wZW5BcHAgPSAobmFtZSwgb3B0aW9ucykgPT4ge1xuXHRpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBgbmFtZWAnKTtcblx0fVxuXG5cdGNvbnN0IHthcmd1bWVudHM6IGFwcEFyZ3VtZW50cyA9IFtdfSA9IG9wdGlvbnMgfHwge307XG5cdGlmIChhcHBBcmd1bWVudHMgIT09IHVuZGVmaW5lZCAmJiBhcHBBcmd1bWVudHMgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoYXBwQXJndW1lbnRzKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGBhcHBBcmd1bWVudHNgIGFzIEFycmF5IHR5cGUnKTtcblx0fVxuXG5cdHJldHVybiBiYXNlT3Blbih7XG5cdFx0Li4ub3B0aW9ucyxcblx0XHRhcHA6IHtcblx0XHRcdG5hbWUsXG5cdFx0XHRhcmd1bWVudHM6IGFwcEFyZ3VtZW50c1xuXHRcdH1cblx0fSk7XG59O1xuXG5mdW5jdGlvbiBkZXRlY3RBcmNoQmluYXJ5KGJpbmFyeSkge1xuXHRpZiAodHlwZW9mIGJpbmFyeSA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheShiaW5hcnkpKSB7XG5cdFx0cmV0dXJuIGJpbmFyeTtcblx0fVxuXG5cdGNvbnN0IHtbYXJjaF06IGFyY2hCaW5hcnl9ID0gYmluYXJ5O1xuXG5cdGlmICghYXJjaEJpbmFyeSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJHthcmNofSBpcyBub3Qgc3VwcG9ydGVkYCk7XG5cdH1cblxuXHRyZXR1cm4gYXJjaEJpbmFyeTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0UGxhdGZvcm1CaW5hcnkoe1twbGF0Zm9ybV06IHBsYXRmb3JtQmluYXJ5fSwge3dzbH0pIHtcblx0aWYgKHdzbCAmJiBpc1dzbCkge1xuXHRcdHJldHVybiBkZXRlY3RBcmNoQmluYXJ5KHdzbCk7XG5cdH1cblxuXHRpZiAoIXBsYXRmb3JtQmluYXJ5KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGAke3BsYXRmb3JtfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG5cdH1cblxuXHRyZXR1cm4gZGV0ZWN0QXJjaEJpbmFyeShwbGF0Zm9ybUJpbmFyeSk7XG59XG5cbmNvbnN0IGFwcHMgPSB7fTtcblxuZGVmaW5lTGF6eVByb3BlcnR5KGFwcHMsICdjaHJvbWUnLCAoKSA9PiBkZXRlY3RQbGF0Zm9ybUJpbmFyeSh7XG5cdGRhcndpbjogJ2dvb2dsZSBjaHJvbWUnLFxuXHR3aW4zMjogJ2Nocm9tZScsXG5cdGxpbnV4OiBbJ2dvb2dsZS1jaHJvbWUnLCAnZ29vZ2xlLWNocm9tZS1zdGFibGUnLCAnY2hyb21pdW0nXVxufSwge1xuXHR3c2w6IHtcblx0XHRpYTMyOiAnL21udC9jL1Byb2dyYW0gRmlsZXMgKHg4NikvR29vZ2xlL0Nocm9tZS9BcHBsaWNhdGlvbi9jaHJvbWUuZXhlJyxcblx0XHR4NjQ6IFsnL21udC9jL1Byb2dyYW0gRmlsZXMvR29vZ2xlL0Nocm9tZS9BcHBsaWNhdGlvbi9jaHJvbWUuZXhlJywgJy9tbnQvYy9Qcm9ncmFtIEZpbGVzICh4ODYpL0dvb2dsZS9DaHJvbWUvQXBwbGljYXRpb24vY2hyb21lLmV4ZSddXG5cdH1cbn0pKTtcblxuZGVmaW5lTGF6eVByb3BlcnR5KGFwcHMsICdmaXJlZm94JywgKCkgPT4gZGV0ZWN0UGxhdGZvcm1CaW5hcnkoe1xuXHRkYXJ3aW46ICdmaXJlZm94Jyxcblx0d2luMzI6ICdDOlxcXFxQcm9ncmFtIEZpbGVzXFxcXE1vemlsbGEgRmlyZWZveFxcXFxmaXJlZm94LmV4ZScsXG5cdGxpbnV4OiAnZmlyZWZveCdcbn0sIHtcblx0d3NsOiAnL21udC9jL1Byb2dyYW0gRmlsZXMvTW96aWxsYSBGaXJlZm94L2ZpcmVmb3guZXhlJ1xufSkpO1xuXG5kZWZpbmVMYXp5UHJvcGVydHkoYXBwcywgJ2VkZ2UnLCAoKSA9PiBkZXRlY3RQbGF0Zm9ybUJpbmFyeSh7XG5cdGRhcndpbjogJ21pY3Jvc29mdCBlZGdlJyxcblx0d2luMzI6ICdtc2VkZ2UnLFxuXHRsaW51eDogWydtaWNyb3NvZnQtZWRnZScsICdtaWNyb3NvZnQtZWRnZS1kZXYnXVxufSwge1xuXHR3c2w6ICcvbW50L2MvUHJvZ3JhbSBGaWxlcyAoeDg2KS9NaWNyb3NvZnQvRWRnZS9BcHBsaWNhdGlvbi9tc2VkZ2UuZXhlJ1xufSkpO1xuXG5vcGVuLmFwcHMgPSBhcHBzO1xub3Blbi5vcGVuQXBwID0gb3BlbkFwcDtcblxudmFyIG9wZW5fMSA9IG9wZW47XG5cbnZhciBjcm9zc1NwYXduRXhwb3J0cyA9IHt9O1xudmFyIGNyb3NzU3Bhd24gPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiBjcm9zc1NwYXduRXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IGNyb3NzU3Bhd25FeHBvcnRzID0gdjsgfSxcbn07XG5cbnZhciB3aW5kb3dzO1xudmFyIGhhc1JlcXVpcmVkV2luZG93cztcblxuZnVuY3Rpb24gcmVxdWlyZVdpbmRvd3MgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRXaW5kb3dzKSByZXR1cm4gd2luZG93cztcblx0aGFzUmVxdWlyZWRXaW5kb3dzID0gMTtcblx0d2luZG93cyA9IGlzZXhlO1xuXHRpc2V4ZS5zeW5jID0gc3luYztcblxuXHR2YXIgZnMgPSByZXF1aXJlJCQwX19kZWZhdWx0O1xuXG5cdGZ1bmN0aW9uIGNoZWNrUGF0aEV4dCAocGF0aCwgb3B0aW9ucykge1xuXHQgIHZhciBwYXRoZXh0ID0gb3B0aW9ucy5wYXRoRXh0ICE9PSB1bmRlZmluZWQgP1xuXHQgICAgb3B0aW9ucy5wYXRoRXh0IDogcHJvY2Vzcy5lbnYuUEFUSEVYVDtcblxuXHQgIGlmICghcGF0aGV4dCkge1xuXHQgICAgcmV0dXJuIHRydWVcblx0ICB9XG5cblx0ICBwYXRoZXh0ID0gcGF0aGV4dC5zcGxpdCgnOycpO1xuXHQgIGlmIChwYXRoZXh0LmluZGV4T2YoJycpICE9PSAtMSkge1xuXHQgICAgcmV0dXJuIHRydWVcblx0ICB9XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoZXh0Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICB2YXIgcCA9IHBhdGhleHRbaV0udG9Mb3dlckNhc2UoKTtcblx0ICAgIGlmIChwICYmIHBhdGguc3Vic3RyKC1wLmxlbmd0aCkudG9Mb3dlckNhc2UoKSA9PT0gcCkge1xuXHQgICAgICByZXR1cm4gdHJ1ZVxuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gZmFsc2Vcblx0fVxuXG5cdGZ1bmN0aW9uIGNoZWNrU3RhdCAoc3RhdCwgcGF0aCwgb3B0aW9ucykge1xuXHQgIGlmICghc3RhdC5pc1N5bWJvbGljTGluaygpICYmICFzdGF0LmlzRmlsZSgpKSB7XG5cdCAgICByZXR1cm4gZmFsc2Vcblx0ICB9XG5cdCAgcmV0dXJuIGNoZWNrUGF0aEV4dChwYXRoLCBvcHRpb25zKVxuXHR9XG5cblx0ZnVuY3Rpb24gaXNleGUgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG5cdCAgZnMuc3RhdChwYXRoLCBmdW5jdGlvbiAoZXIsIHN0YXQpIHtcblx0ICAgIGNiKGVyLCBlciA/IGZhbHNlIDogY2hlY2tTdGF0KHN0YXQsIHBhdGgsIG9wdGlvbnMpKTtcblx0ICB9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHN5bmMgKHBhdGgsIG9wdGlvbnMpIHtcblx0ICByZXR1cm4gY2hlY2tTdGF0KGZzLnN0YXRTeW5jKHBhdGgpLCBwYXRoLCBvcHRpb25zKVxuXHR9XG5cdHJldHVybiB3aW5kb3dzO1xufVxuXG52YXIgbW9kZTtcbnZhciBoYXNSZXF1aXJlZE1vZGU7XG5cbmZ1bmN0aW9uIHJlcXVpcmVNb2RlICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkTW9kZSkgcmV0dXJuIG1vZGU7XG5cdGhhc1JlcXVpcmVkTW9kZSA9IDE7XG5cdG1vZGUgPSBpc2V4ZTtcblx0aXNleGUuc3luYyA9IHN5bmM7XG5cblx0dmFyIGZzID0gcmVxdWlyZSQkMF9fZGVmYXVsdDtcblxuXHRmdW5jdGlvbiBpc2V4ZSAocGF0aCwgb3B0aW9ucywgY2IpIHtcblx0ICBmcy5zdGF0KHBhdGgsIGZ1bmN0aW9uIChlciwgc3RhdCkge1xuXHQgICAgY2IoZXIsIGVyID8gZmFsc2UgOiBjaGVja1N0YXQoc3RhdCwgb3B0aW9ucykpO1xuXHQgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gc3luYyAocGF0aCwgb3B0aW9ucykge1xuXHQgIHJldHVybiBjaGVja1N0YXQoZnMuc3RhdFN5bmMocGF0aCksIG9wdGlvbnMpXG5cdH1cblxuXHRmdW5jdGlvbiBjaGVja1N0YXQgKHN0YXQsIG9wdGlvbnMpIHtcblx0ICByZXR1cm4gc3RhdC5pc0ZpbGUoKSAmJiBjaGVja01vZGUoc3RhdCwgb3B0aW9ucylcblx0fVxuXG5cdGZ1bmN0aW9uIGNoZWNrTW9kZSAoc3RhdCwgb3B0aW9ucykge1xuXHQgIHZhciBtb2QgPSBzdGF0Lm1vZGU7XG5cdCAgdmFyIHVpZCA9IHN0YXQudWlkO1xuXHQgIHZhciBnaWQgPSBzdGF0LmdpZDtcblxuXHQgIHZhciBteVVpZCA9IG9wdGlvbnMudWlkICE9PSB1bmRlZmluZWQgP1xuXHQgICAgb3B0aW9ucy51aWQgOiBwcm9jZXNzLmdldHVpZCAmJiBwcm9jZXNzLmdldHVpZCgpO1xuXHQgIHZhciBteUdpZCA9IG9wdGlvbnMuZ2lkICE9PSB1bmRlZmluZWQgP1xuXHQgICAgb3B0aW9ucy5naWQgOiBwcm9jZXNzLmdldGdpZCAmJiBwcm9jZXNzLmdldGdpZCgpO1xuXG5cdCAgdmFyIHUgPSBwYXJzZUludCgnMTAwJywgOCk7XG5cdCAgdmFyIGcgPSBwYXJzZUludCgnMDEwJywgOCk7XG5cdCAgdmFyIG8gPSBwYXJzZUludCgnMDAxJywgOCk7XG5cdCAgdmFyIHVnID0gdSB8IGc7XG5cblx0ICB2YXIgcmV0ID0gKG1vZCAmIG8pIHx8XG5cdCAgICAobW9kICYgZykgJiYgZ2lkID09PSBteUdpZCB8fFxuXHQgICAgKG1vZCAmIHUpICYmIHVpZCA9PT0gbXlVaWQgfHxcblx0ICAgIChtb2QgJiB1ZykgJiYgbXlVaWQgPT09IDA7XG5cblx0ICByZXR1cm4gcmV0XG5cdH1cblx0cmV0dXJuIG1vZGU7XG59XG5cbnZhciBjb3JlO1xuaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgfHwgY29tbW9uanNHbG9iYWwuVEVTVElOR19XSU5ET1dTKSB7XG4gIGNvcmUgPSByZXF1aXJlV2luZG93cygpO1xufSBlbHNlIHtcbiAgY29yZSA9IHJlcXVpcmVNb2RlKCk7XG59XG5cbnZhciBpc2V4ZV8xID0gaXNleGUkMTtcbmlzZXhlJDEuc3luYyA9IHN5bmM7XG5cbmZ1bmN0aW9uIGlzZXhlJDEgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAoIWNiKSB7XG4gICAgaWYgKHR5cGVvZiBQcm9taXNlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBub3QgcHJvdmlkZWQnKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBpc2V4ZSQxKHBhdGgsIG9wdGlvbnMgfHwge30sIGZ1bmN0aW9uIChlciwgaXMpIHtcbiAgICAgICAgaWYgKGVyKSB7XG4gICAgICAgICAgcmVqZWN0KGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGlzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSlcbiAgfVxuXG4gIGNvcmUocGF0aCwgb3B0aW9ucyB8fCB7fSwgZnVuY3Rpb24gKGVyLCBpcykge1xuICAgIC8vIGlnbm9yZSBFQUNDRVMgYmVjYXVzZSB0aGF0IGp1c3QgbWVhbnMgd2UgYXJlbid0IGFsbG93ZWQgdG8gcnVuIGl0XG4gICAgaWYgKGVyKSB7XG4gICAgICBpZiAoZXIuY29kZSA9PT0gJ0VBQ0NFUycgfHwgb3B0aW9ucyAmJiBvcHRpb25zLmlnbm9yZUVycm9ycykge1xuICAgICAgICBlciA9IG51bGw7XG4gICAgICAgIGlzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGNiKGVyLCBpcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzeW5jIChwYXRoLCBvcHRpb25zKSB7XG4gIC8vIG15IGtpbmdkb20gZm9yIGEgZmlsdGVyZWQgY2F0Y2hcbiAgdHJ5IHtcbiAgICByZXR1cm4gY29yZS5zeW5jKHBhdGgsIG9wdGlvbnMgfHwge30pXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5pZ25vcmVFcnJvcnMgfHwgZXIuY29kZSA9PT0gJ0VBQ0NFUycpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlclxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInIHx8XG4gICAgcHJvY2Vzcy5lbnYuT1NUWVBFID09PSAnY3lnd2luJyB8fFxuICAgIHByb2Nlc3MuZW52Lk9TVFlQRSA9PT0gJ21zeXMnO1xuXG5jb25zdCBwYXRoJDIgPSByZXF1aXJlJCQwJDQ7XG5jb25zdCBDT0xPTiA9IGlzV2luZG93cyA/ICc7JyA6ICc6JztcbmNvbnN0IGlzZXhlID0gaXNleGVfMTtcblxuY29uc3QgZ2V0Tm90Rm91bmRFcnJvciA9IChjbWQpID0+XG4gIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBub3QgZm91bmQ6ICR7Y21kfWApLCB7IGNvZGU6ICdFTk9FTlQnIH0pO1xuXG5jb25zdCBnZXRQYXRoSW5mbyA9IChjbWQsIG9wdCkgPT4ge1xuICBjb25zdCBjb2xvbiA9IG9wdC5jb2xvbiB8fCBDT0xPTjtcblxuICAvLyBJZiBpdCBoYXMgYSBzbGFzaCwgdGhlbiB3ZSBkb24ndCBib3RoZXIgc2VhcmNoaW5nIHRoZSBwYXRoZW52LlxuICAvLyBqdXN0IGNoZWNrIHRoZSBmaWxlIGl0c2VsZiwgYW5kIHRoYXQncyBpdC5cbiAgY29uc3QgcGF0aEVudiA9IGNtZC5tYXRjaCgvXFwvLykgfHwgaXNXaW5kb3dzICYmIGNtZC5tYXRjaCgvXFxcXC8pID8gWycnXVxuICAgIDogKFxuICAgICAgW1xuICAgICAgICAvLyB3aW5kb3dzIGFsd2F5cyBjaGVja3MgdGhlIGN3ZCBmaXJzdFxuICAgICAgICAuLi4oaXNXaW5kb3dzID8gW3Byb2Nlc3MuY3dkKCldIDogW10pLFxuICAgICAgICAuLi4ob3B0LnBhdGggfHwgcHJvY2Vzcy5lbnYuUEFUSCB8fFxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiB2ZXJ5IHVudXN1YWwgKi8gJycpLnNwbGl0KGNvbG9uKSxcbiAgICAgIF1cbiAgICApO1xuICBjb25zdCBwYXRoRXh0RXhlID0gaXNXaW5kb3dzXG4gICAgPyBvcHQucGF0aEV4dCB8fCBwcm9jZXNzLmVudi5QQVRIRVhUIHx8ICcuRVhFOy5DTUQ7LkJBVDsuQ09NJ1xuICAgIDogJyc7XG4gIGNvbnN0IHBhdGhFeHQgPSBpc1dpbmRvd3MgPyBwYXRoRXh0RXhlLnNwbGl0KGNvbG9uKSA6IFsnJ107XG5cbiAgaWYgKGlzV2luZG93cykge1xuICAgIGlmIChjbWQuaW5kZXhPZignLicpICE9PSAtMSAmJiBwYXRoRXh0WzBdICE9PSAnJylcbiAgICAgIHBhdGhFeHQudW5zaGlmdCgnJyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhdGhFbnYsXG4gICAgcGF0aEV4dCxcbiAgICBwYXRoRXh0RXhlLFxuICB9XG59O1xuXG5jb25zdCB3aGljaCQxID0gKGNtZCwgb3B0LCBjYikgPT4ge1xuICBpZiAodHlwZW9mIG9wdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0O1xuICAgIG9wdCA9IHt9O1xuICB9XG4gIGlmICghb3B0KVxuICAgIG9wdCA9IHt9O1xuXG4gIGNvbnN0IHsgcGF0aEVudiwgcGF0aEV4dCwgcGF0aEV4dEV4ZSB9ID0gZ2V0UGF0aEluZm8oY21kLCBvcHQpO1xuICBjb25zdCBmb3VuZCA9IFtdO1xuXG4gIGNvbnN0IHN0ZXAgPSBpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAoaSA9PT0gcGF0aEVudi5sZW5ndGgpXG4gICAgICByZXR1cm4gb3B0LmFsbCAmJiBmb3VuZC5sZW5ndGggPyByZXNvbHZlKGZvdW5kKVxuICAgICAgICA6IHJlamVjdChnZXROb3RGb3VuZEVycm9yKGNtZCkpXG5cbiAgICBjb25zdCBwcFJhdyA9IHBhdGhFbnZbaV07XG4gICAgY29uc3QgcGF0aFBhcnQgPSAvXlwiLipcIiQvLnRlc3QocHBSYXcpID8gcHBSYXcuc2xpY2UoMSwgLTEpIDogcHBSYXc7XG5cbiAgICBjb25zdCBwQ21kID0gcGF0aCQyLmpvaW4ocGF0aFBhcnQsIGNtZCk7XG4gICAgY29uc3QgcCA9ICFwYXRoUGFydCAmJiAvXlxcLltcXFxcXFwvXS8udGVzdChjbWQpID8gY21kLnNsaWNlKDAsIDIpICsgcENtZFxuICAgICAgOiBwQ21kO1xuXG4gICAgcmVzb2x2ZShzdWJTdGVwKHAsIGksIDApKTtcbiAgfSk7XG5cbiAgY29uc3Qgc3ViU3RlcCA9IChwLCBpLCBpaSkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmIChpaSA9PT0gcGF0aEV4dC5sZW5ndGgpXG4gICAgICByZXR1cm4gcmVzb2x2ZShzdGVwKGkgKyAxKSlcbiAgICBjb25zdCBleHQgPSBwYXRoRXh0W2lpXTtcbiAgICBpc2V4ZShwICsgZXh0LCB7IHBhdGhFeHQ6IHBhdGhFeHRFeGUgfSwgKGVyLCBpcykgPT4ge1xuICAgICAgaWYgKCFlciAmJiBpcykge1xuICAgICAgICBpZiAob3B0LmFsbClcbiAgICAgICAgICBmb3VuZC5wdXNoKHAgKyBleHQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUocCArIGV4dClcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlKHN1YlN0ZXAocCwgaSwgaWkgKyAxKSlcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNiID8gc3RlcCgwKS50aGVuKHJlcyA9PiBjYihudWxsLCByZXMpLCBjYikgOiBzdGVwKDApXG59O1xuXG5jb25zdCB3aGljaFN5bmMgPSAoY21kLCBvcHQpID0+IHtcbiAgb3B0ID0gb3B0IHx8IHt9O1xuXG4gIGNvbnN0IHsgcGF0aEVudiwgcGF0aEV4dCwgcGF0aEV4dEV4ZSB9ID0gZ2V0UGF0aEluZm8oY21kLCBvcHQpO1xuICBjb25zdCBmb3VuZCA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEVudi5sZW5ndGg7IGkgKyspIHtcbiAgICBjb25zdCBwcFJhdyA9IHBhdGhFbnZbaV07XG4gICAgY29uc3QgcGF0aFBhcnQgPSAvXlwiLipcIiQvLnRlc3QocHBSYXcpID8gcHBSYXcuc2xpY2UoMSwgLTEpIDogcHBSYXc7XG5cbiAgICBjb25zdCBwQ21kID0gcGF0aCQyLmpvaW4ocGF0aFBhcnQsIGNtZCk7XG4gICAgY29uc3QgcCA9ICFwYXRoUGFydCAmJiAvXlxcLltcXFxcXFwvXS8udGVzdChjbWQpID8gY21kLnNsaWNlKDAsIDIpICsgcENtZFxuICAgICAgOiBwQ21kO1xuXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXRoRXh0Lmxlbmd0aDsgaiArKykge1xuICAgICAgY29uc3QgY3VyID0gcCArIHBhdGhFeHRbal07XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpcyA9IGlzZXhlLnN5bmMoY3VyLCB7IHBhdGhFeHQ6IHBhdGhFeHRFeGUgfSk7XG4gICAgICAgIGlmIChpcykge1xuICAgICAgICAgIGlmIChvcHQuYWxsKVxuICAgICAgICAgICAgZm91bmQucHVzaChjdXIpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBjdXJcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXgpIHt9XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdC5hbGwgJiYgZm91bmQubGVuZ3RoKVxuICAgIHJldHVybiBmb3VuZFxuXG4gIGlmIChvcHQubm90aHJvdylcbiAgICByZXR1cm4gbnVsbFxuXG4gIHRocm93IGdldE5vdEZvdW5kRXJyb3IoY21kKVxufTtcblxudmFyIHdoaWNoXzEgPSB3aGljaCQxO1xud2hpY2gkMS5zeW5jID0gd2hpY2hTeW5jO1xuXG52YXIgcGF0aEtleUV4cG9ydHMgPSB7fTtcbnZhciBwYXRoS2V5JDEgPSB7XG4gIGdldCBleHBvcnRzKCl7IHJldHVybiBwYXRoS2V5RXhwb3J0czsgfSxcbiAgc2V0IGV4cG9ydHModil7IHBhdGhLZXlFeHBvcnRzID0gdjsgfSxcbn07XG5cbmNvbnN0IHBhdGhLZXkgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG5cdGNvbnN0IGVudmlyb25tZW50ID0gb3B0aW9ucy5lbnYgfHwgcHJvY2Vzcy5lbnY7XG5cdGNvbnN0IHBsYXRmb3JtID0gb3B0aW9ucy5wbGF0Zm9ybSB8fCBwcm9jZXNzLnBsYXRmb3JtO1xuXG5cdGlmIChwbGF0Zm9ybSAhPT0gJ3dpbjMyJykge1xuXHRcdHJldHVybiAnUEFUSCc7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0LmtleXMoZW52aXJvbm1lbnQpLnJldmVyc2UoKS5maW5kKGtleSA9PiBrZXkudG9VcHBlckNhc2UoKSA9PT0gJ1BBVEgnKSB8fCAnUGF0aCc7XG59O1xuXG5wYXRoS2V5JDEuZXhwb3J0cyA9IHBhdGhLZXk7XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBmb3IgdGhlIG5leHQgbWFqb3IgcmVsZWFzZVxucGF0aEtleUV4cG9ydHMuZGVmYXVsdCA9IHBhdGhLZXk7XG5cbmNvbnN0IHBhdGgkMSA9IHJlcXVpcmUkJDAkNDtcbmNvbnN0IHdoaWNoID0gd2hpY2hfMTtcbmNvbnN0IGdldFBhdGhLZXkgPSBwYXRoS2V5RXhwb3J0cztcblxuZnVuY3Rpb24gcmVzb2x2ZUNvbW1hbmRBdHRlbXB0KHBhcnNlZCwgd2l0aG91dFBhdGhFeHQpIHtcbiAgICBjb25zdCBlbnYgPSBwYXJzZWQub3B0aW9ucy5lbnYgfHwgcHJvY2Vzcy5lbnY7XG4gICAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBoYXNDdXN0b21Dd2QgPSBwYXJzZWQub3B0aW9ucy5jd2QgIT0gbnVsbDtcbiAgICAvLyBXb3JrZXIgdGhyZWFkcyBkbyBub3QgaGF2ZSBwcm9jZXNzLmNoZGlyKClcbiAgICBjb25zdCBzaG91bGRTd2l0Y2hDd2QgPSBoYXNDdXN0b21Dd2QgJiYgcHJvY2Vzcy5jaGRpciAhPT0gdW5kZWZpbmVkICYmICFwcm9jZXNzLmNoZGlyLmRpc2FibGVkO1xuXG4gICAgLy8gSWYgYSBjdXN0b20gYGN3ZGAgd2FzIHNwZWNpZmllZCwgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHByb2Nlc3MgY3dkXG4gICAgLy8gYmVjYXVzZSBgd2hpY2hgIHdpbGwgZG8gc3RhdCBjYWxscyBidXQgZG9lcyBub3Qgc3VwcG9ydCBhIGN1c3RvbSBjd2RcbiAgICBpZiAoc2hvdWxkU3dpdGNoQ3dkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwcm9jZXNzLmNoZGlyKHBhcnNlZC5vcHRpb25zLmN3ZCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLyogRW1wdHkgKi9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxldCByZXNvbHZlZDtcblxuICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVkID0gd2hpY2guc3luYyhwYXJzZWQuY29tbWFuZCwge1xuICAgICAgICAgICAgcGF0aDogZW52W2dldFBhdGhLZXkoeyBlbnYgfSldLFxuICAgICAgICAgICAgcGF0aEV4dDogd2l0aG91dFBhdGhFeHQgPyBwYXRoJDEuZGVsaW1pdGVyIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qIEVtcHR5ICovXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHNob3VsZFN3aXRjaEN3ZCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5jaGRpcihjd2QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2Ugc3VjY2Vzc2Z1bGx5IHJlc29sdmVkLCBlbnN1cmUgdGhhdCBhbiBhYnNvbHV0ZSBwYXRoIGlzIHJldHVybmVkXG4gICAgLy8gTm90ZSB0aGF0IHdoZW4gYSBjdXN0b20gYGN3ZGAgd2FzIHVzZWQsIHdlIG5lZWQgdG8gcmVzb2x2ZSB0byBhbiBhYnNvbHV0ZSBwYXRoIGJhc2VkIG9uIGl0XG4gICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgIHJlc29sdmVkID0gcGF0aCQxLnJlc29sdmUoaGFzQ3VzdG9tQ3dkID8gcGFyc2VkLm9wdGlvbnMuY3dkIDogJycsIHJlc29sdmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb21tYW5kJDEocGFyc2VkKSB7XG4gICAgcmV0dXJuIHJlc29sdmVDb21tYW5kQXR0ZW1wdChwYXJzZWQpIHx8IHJlc29sdmVDb21tYW5kQXR0ZW1wdChwYXJzZWQsIHRydWUpO1xufVxuXG52YXIgcmVzb2x2ZUNvbW1hbmRfMSA9IHJlc29sdmVDb21tYW5kJDE7XG5cbnZhciBfZXNjYXBlID0ge307XG5cbi8vIFNlZSBodHRwOi8vd3d3LnJvYnZhbmRlcndvdWRlLmNvbS9lc2NhcGVjaGFycy5waHBcbmNvbnN0IG1ldGFDaGFyc1JlZ0V4cCA9IC8oWygpXFxdWyUhXlwiYDw+Jnw7LCAqP10pL2c7XG5cbmZ1bmN0aW9uIGVzY2FwZUNvbW1hbmQoYXJnKSB7XG4gICAgLy8gRXNjYXBlIG1ldGEgY2hhcnNcbiAgICBhcmcgPSBhcmcucmVwbGFjZShtZXRhQ2hhcnNSZWdFeHAsICdeJDEnKTtcblxuICAgIHJldHVybiBhcmc7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUFyZ3VtZW50KGFyZywgZG91YmxlRXNjYXBlTWV0YUNoYXJzKSB7XG4gICAgLy8gQ29udmVydCB0byBzdHJpbmdcbiAgICBhcmcgPSBgJHthcmd9YDtcblxuICAgIC8vIEFsZ29yaXRobSBiZWxvdyBpcyBiYXNlZCBvbiBodHRwczovL3FudG0ub3JnL2NtZFxuXG4gICAgLy8gU2VxdWVuY2Ugb2YgYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgYSBkb3VibGUgcXVvdGU6XG4gICAgLy8gZG91YmxlIHVwIGFsbCB0aGUgYmFja3NsYXNoZXMgYW5kIGVzY2FwZSB0aGUgZG91YmxlIHF1b3RlXG4gICAgYXJnID0gYXJnLnJlcGxhY2UoLyhcXFxcKilcIi9nLCAnJDEkMVxcXFxcIicpO1xuXG4gICAgLy8gU2VxdWVuY2Ugb2YgYmFja3NsYXNoZXMgZm9sbG93ZWQgYnkgdGhlIGVuZCBvZiB0aGUgc3RyaW5nXG4gICAgLy8gKHdoaWNoIHdpbGwgYmVjb21lIGEgZG91YmxlIHF1b3RlIGxhdGVyKTpcbiAgICAvLyBkb3VibGUgdXAgYWxsIHRoZSBiYWNrc2xhc2hlc1xuICAgIGFyZyA9IGFyZy5yZXBsYWNlKC8oXFxcXCopJC8sICckMSQxJyk7XG5cbiAgICAvLyBBbGwgb3RoZXIgYmFja3NsYXNoZXMgb2NjdXIgbGl0ZXJhbGx5XG5cbiAgICAvLyBRdW90ZSB0aGUgd2hvbGUgdGhpbmc6XG4gICAgYXJnID0gYFwiJHthcmd9XCJgO1xuXG4gICAgLy8gRXNjYXBlIG1ldGEgY2hhcnNcbiAgICBhcmcgPSBhcmcucmVwbGFjZShtZXRhQ2hhcnNSZWdFeHAsICdeJDEnKTtcblxuICAgIC8vIERvdWJsZSBlc2NhcGUgbWV0YSBjaGFycyBpZiBuZWNlc3NhcnlcbiAgICBpZiAoZG91YmxlRXNjYXBlTWV0YUNoYXJzKSB7XG4gICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKG1ldGFDaGFyc1JlZ0V4cCwgJ14kMScpO1xuICAgIH1cblxuICAgIHJldHVybiBhcmc7XG59XG5cbl9lc2NhcGUuY29tbWFuZCA9IGVzY2FwZUNvbW1hbmQ7XG5fZXNjYXBlLmFyZ3VtZW50ID0gZXNjYXBlQXJndW1lbnQ7XG5cbnZhciBzaGViYW5nUmVnZXgkMSA9IC9eIyEoLiopLztcblxuY29uc3Qgc2hlYmFuZ1JlZ2V4ID0gc2hlYmFuZ1JlZ2V4JDE7XG5cbnZhciBzaGViYW5nQ29tbWFuZCQxID0gKHN0cmluZyA9ICcnKSA9PiB7XG5cdGNvbnN0IG1hdGNoID0gc3RyaW5nLm1hdGNoKHNoZWJhbmdSZWdleCk7XG5cblx0aWYgKCFtYXRjaCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Y29uc3QgW3BhdGgsIGFyZ3VtZW50XSA9IG1hdGNoWzBdLnJlcGxhY2UoLyMhID8vLCAnJykuc3BsaXQoJyAnKTtcblx0Y29uc3QgYmluYXJ5ID0gcGF0aC5zcGxpdCgnLycpLnBvcCgpO1xuXG5cdGlmIChiaW5hcnkgPT09ICdlbnYnKSB7XG5cdFx0cmV0dXJuIGFyZ3VtZW50O1xuXHR9XG5cblx0cmV0dXJuIGFyZ3VtZW50ID8gYCR7YmluYXJ5fSAke2FyZ3VtZW50fWAgOiBiaW5hcnk7XG59O1xuXG5jb25zdCBmcyA9IHJlcXVpcmUkJDBfX2RlZmF1bHQ7XG5jb25zdCBzaGViYW5nQ29tbWFuZCA9IHNoZWJhbmdDb21tYW5kJDE7XG5cbmZ1bmN0aW9uIHJlYWRTaGViYW5nJDEoY29tbWFuZCkge1xuICAgIC8vIFJlYWQgdGhlIGZpcnN0IDE1MCBieXRlcyBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3Qgc2l6ZSA9IDE1MDtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2Moc2l6ZSk7XG5cbiAgICBsZXQgZmQ7XG5cbiAgICB0cnkge1xuICAgICAgICBmZCA9IGZzLm9wZW5TeW5jKGNvbW1hbmQsICdyJyk7XG4gICAgICAgIGZzLnJlYWRTeW5jKGZkLCBidWZmZXIsIDAsIHNpemUsIDApO1xuICAgICAgICBmcy5jbG9zZVN5bmMoZmQpO1xuICAgIH0gY2F0Y2ggKGUpIHsgLyogRW1wdHkgKi8gfVxuXG4gICAgLy8gQXR0ZW1wdCB0byBleHRyYWN0IHNoZWJhbmcgKG51bGwgaXMgcmV0dXJuZWQgaWYgbm90IGEgc2hlYmFuZylcbiAgICByZXR1cm4gc2hlYmFuZ0NvbW1hbmQoYnVmZmVyLnRvU3RyaW5nKCkpO1xufVxuXG52YXIgcmVhZFNoZWJhbmdfMSA9IHJlYWRTaGViYW5nJDE7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlJCQwJDQ7XG5jb25zdCByZXNvbHZlQ29tbWFuZCA9IHJlc29sdmVDb21tYW5kXzE7XG5jb25zdCBlc2NhcGUkMSA9IF9lc2NhcGU7XG5jb25zdCByZWFkU2hlYmFuZyA9IHJlYWRTaGViYW5nXzE7XG5cbmNvbnN0IGlzV2luJDEgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuY29uc3QgaXNFeGVjdXRhYmxlUmVnRXhwID0gL1xcLig/OmNvbXxleGUpJC9pO1xuY29uc3QgaXNDbWRTaGltUmVnRXhwID0gL25vZGVfbW9kdWxlc1tcXFxcL10uYmluW1xcXFwvXVteXFxcXC9dK1xcLmNtZCQvaTtcblxuZnVuY3Rpb24gZGV0ZWN0U2hlYmFuZyhwYXJzZWQpIHtcbiAgICBwYXJzZWQuZmlsZSA9IHJlc29sdmVDb21tYW5kKHBhcnNlZCk7XG5cbiAgICBjb25zdCBzaGViYW5nID0gcGFyc2VkLmZpbGUgJiYgcmVhZFNoZWJhbmcocGFyc2VkLmZpbGUpO1xuXG4gICAgaWYgKHNoZWJhbmcpIHtcbiAgICAgICAgcGFyc2VkLmFyZ3MudW5zaGlmdChwYXJzZWQuZmlsZSk7XG4gICAgICAgIHBhcnNlZC5jb21tYW5kID0gc2hlYmFuZztcblxuICAgICAgICByZXR1cm4gcmVzb2x2ZUNvbW1hbmQocGFyc2VkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkLmZpbGU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTm9uU2hlbGwocGFyc2VkKSB7XG4gICAgaWYgKCFpc1dpbiQxKSB7XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0ICYgYWRkIHN1cHBvcnQgZm9yIHNoZWJhbmdzXG4gICAgY29uc3QgY29tbWFuZEZpbGUgPSBkZXRlY3RTaGViYW5nKHBhcnNlZCk7XG5cbiAgICAvLyBXZSBkb24ndCBuZWVkIGEgc2hlbGwgaWYgdGhlIGNvbW1hbmQgZmlsZW5hbWUgaXMgYW4gZXhlY3V0YWJsZVxuICAgIGNvbnN0IG5lZWRzU2hlbGwgPSAhaXNFeGVjdXRhYmxlUmVnRXhwLnRlc3QoY29tbWFuZEZpbGUpO1xuXG4gICAgLy8gSWYgYSBzaGVsbCBpcyByZXF1aXJlZCwgdXNlIGNtZC5leGUgYW5kIHRha2UgY2FyZSBvZiBlc2NhcGluZyBldmVyeXRoaW5nIGNvcnJlY3RseVxuICAgIC8vIE5vdGUgdGhhdCBgZm9yY2VTaGVsbGAgaXMgYW4gaGlkZGVuIG9wdGlvbiB1c2VkIG9ubHkgaW4gdGVzdHNcbiAgICBpZiAocGFyc2VkLm9wdGlvbnMuZm9yY2VTaGVsbCB8fCBuZWVkc1NoZWxsKSB7XG4gICAgICAgIC8vIE5lZWQgdG8gZG91YmxlIGVzY2FwZSBtZXRhIGNoYXJzIGlmIHRoZSBjb21tYW5kIGlzIGEgY21kLXNoaW0gbG9jYXRlZCBpbiBgbm9kZV9tb2R1bGVzLy5iaW4vYFxuICAgICAgICAvLyBUaGUgY21kLXNoaW0gc2ltcGx5IGNhbGxzIGV4ZWN1dGUgdGhlIHBhY2thZ2UgYmluIGZpbGUgd2l0aCBOb2RlSlMsIHByb3h5aW5nIGFueSBhcmd1bWVudFxuICAgICAgICAvLyBCZWNhdXNlIHRoZSBlc2NhcGUgb2YgbWV0YWNoYXJzIHdpdGggXiBnZXRzIGludGVycHJldGVkIHdoZW4gdGhlIGNtZC5leGUgaXMgZmlyc3QgY2FsbGVkLFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGRvdWJsZSBlc2NhcGUgdGhlbVxuICAgICAgICBjb25zdCBuZWVkc0RvdWJsZUVzY2FwZU1ldGFDaGFycyA9IGlzQ21kU2hpbVJlZ0V4cC50ZXN0KGNvbW1hbmRGaWxlKTtcblxuICAgICAgICAvLyBOb3JtYWxpemUgcG9zaXggcGF0aHMgaW50byBPUyBjb21wYXRpYmxlIHBhdGhzIChlLmcuOiBmb28vYmFyIC0+IGZvb1xcYmFyKVxuICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBvdGhlcndpc2UgaXQgd2lsbCBhbHdheXMgZmFpbCB3aXRoIEVOT0VOVCBpbiB0aG9zZSBjYXNlc1xuICAgICAgICBwYXJzZWQuY29tbWFuZCA9IHBhdGgubm9ybWFsaXplKHBhcnNlZC5jb21tYW5kKTtcblxuICAgICAgICAvLyBFc2NhcGUgY29tbWFuZCAmIGFyZ3VtZW50c1xuICAgICAgICBwYXJzZWQuY29tbWFuZCA9IGVzY2FwZSQxLmNvbW1hbmQocGFyc2VkLmNvbW1hbmQpO1xuICAgICAgICBwYXJzZWQuYXJncyA9IHBhcnNlZC5hcmdzLm1hcCgoYXJnKSA9PiBlc2NhcGUkMS5hcmd1bWVudChhcmcsIG5lZWRzRG91YmxlRXNjYXBlTWV0YUNoYXJzKSk7XG5cbiAgICAgICAgY29uc3Qgc2hlbGxDb21tYW5kID0gW3BhcnNlZC5jb21tYW5kXS5jb25jYXQocGFyc2VkLmFyZ3MpLmpvaW4oJyAnKTtcblxuICAgICAgICBwYXJzZWQuYXJncyA9IFsnL2QnLCAnL3MnLCAnL2MnLCBgXCIke3NoZWxsQ29tbWFuZH1cImBdO1xuICAgICAgICBwYXJzZWQuY29tbWFuZCA9IHByb2Nlc3MuZW52LmNvbXNwZWMgfHwgJ2NtZC5leGUnO1xuICAgICAgICBwYXJzZWQub3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMgPSB0cnVlOyAvLyBUZWxsIG5vZGUncyBzcGF3biB0aGF0IHRoZSBhcmd1bWVudHMgYXJlIGFscmVhZHkgZXNjYXBlZFxuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlJDEoY29tbWFuZCwgYXJncywgb3B0aW9ucykge1xuICAgIC8vIE5vcm1hbGl6ZSBhcmd1bWVudHMsIHNpbWlsYXIgdG8gbm9kZWpzXG4gICAgaWYgKGFyZ3MgJiYgIUFycmF5LmlzQXJyYXkoYXJncykpIHtcbiAgICAgICAgb3B0aW9ucyA9IGFyZ3M7XG4gICAgICAgIGFyZ3MgPSBudWxsO1xuICAgIH1cblxuICAgIGFyZ3MgPSBhcmdzID8gYXJncy5zbGljZSgwKSA6IFtdOyAvLyBDbG9uZSBhcnJheSB0byBhdm9pZCBjaGFuZ2luZyB0aGUgb3JpZ2luYWxcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7IC8vIENsb25lIG9iamVjdCB0byBhdm9pZCBjaGFuZ2luZyB0aGUgb3JpZ2luYWxcblxuICAgIC8vIEJ1aWxkIG91ciBwYXJzZWQgb2JqZWN0XG4gICAgY29uc3QgcGFyc2VkID0ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBhcmdzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBmaWxlOiB1bmRlZmluZWQsXG4gICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gRGVsZWdhdGUgZnVydGhlciBwYXJzaW5nIHRvIHNoZWxsIG9yIG5vbi1zaGVsbFxuICAgIHJldHVybiBvcHRpb25zLnNoZWxsID8gcGFyc2VkIDogcGFyc2VOb25TaGVsbChwYXJzZWQpO1xufVxuXG52YXIgcGFyc2VfMSA9IHBhcnNlJDE7XG5cbmNvbnN0IGlzV2luID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblxuZnVuY3Rpb24gbm90Rm91bmRFcnJvcihvcmlnaW5hbCwgc3lzY2FsbCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgJHtzeXNjYWxsfSAke29yaWdpbmFsLmNvbW1hbmR9IEVOT0VOVGApLCB7XG4gICAgICAgIGNvZGU6ICdFTk9FTlQnLFxuICAgICAgICBlcnJubzogJ0VOT0VOVCcsXG4gICAgICAgIHN5c2NhbGw6IGAke3N5c2NhbGx9ICR7b3JpZ2luYWwuY29tbWFuZH1gLFxuICAgICAgICBwYXRoOiBvcmlnaW5hbC5jb21tYW5kLFxuICAgICAgICBzcGF3bmFyZ3M6IG9yaWdpbmFsLmFyZ3MsXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGhvb2tDaGlsZFByb2Nlc3MoY3AsIHBhcnNlZCkge1xuICAgIGlmICghaXNXaW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsRW1pdCA9IGNwLmVtaXQ7XG5cbiAgICBjcC5lbWl0ID0gZnVuY3Rpb24gKG5hbWUsIGFyZzEpIHtcbiAgICAgICAgLy8gSWYgZW1pdHRpbmcgXCJleGl0XCIgZXZlbnQgYW5kIGV4aXQgY29kZSBpcyAxLCB3ZSBuZWVkIHRvIGNoZWNrIGlmXG4gICAgICAgIC8vIHRoZSBjb21tYW5kIGV4aXN0cyBhbmQgZW1pdCBhbiBcImVycm9yXCIgaW5zdGVhZFxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0luZGlnb1VuaXRlZC9ub2RlLWNyb3NzLXNwYXduL2lzc3Vlcy8xNlxuICAgICAgICBpZiAobmFtZSA9PT0gJ2V4aXQnKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSB2ZXJpZnlFTk9FTlQoYXJnMSwgcGFyc2VkKTtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEVtaXQuY2FsbChjcCwgJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmlnaW5hbEVtaXQuYXBwbHkoY3AsIGFyZ3VtZW50cyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5RU5PRU5UKHN0YXR1cywgcGFyc2VkKSB7XG4gICAgaWYgKGlzV2luICYmIHN0YXR1cyA9PT0gMSAmJiAhcGFyc2VkLmZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5vdEZvdW5kRXJyb3IocGFyc2VkLm9yaWdpbmFsLCAnc3Bhd24nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5RU5PRU5UU3luYyhzdGF0dXMsIHBhcnNlZCkge1xuICAgIGlmIChpc1dpbiAmJiBzdGF0dXMgPT09IDEgJiYgIXBhcnNlZC5maWxlKSB7XG4gICAgICAgIHJldHVybiBub3RGb3VuZEVycm9yKHBhcnNlZC5vcmlnaW5hbCwgJ3NwYXduU3luYycpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG52YXIgZW5vZW50JDEgPSB7XG4gICAgaG9va0NoaWxkUHJvY2VzcyxcbiAgICB2ZXJpZnlFTk9FTlQsXG4gICAgdmVyaWZ5RU5PRU5UU3luYyxcbiAgICBub3RGb3VuZEVycm9yLFxufTtcblxuY29uc3QgY3AgPSByZXF1aXJlJCQyJDE7XG5jb25zdCBwYXJzZSA9IHBhcnNlXzE7XG5jb25zdCBlbm9lbnQgPSBlbm9lbnQkMTtcblxuZnVuY3Rpb24gc3Bhd24oY29tbWFuZCwgYXJncywgb3B0aW9ucykge1xuICAgIC8vIFBhcnNlIHRoZSBhcmd1bWVudHNcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZShjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcblxuICAgIC8vIFNwYXduIHRoZSBjaGlsZCBwcm9jZXNzXG4gICAgY29uc3Qgc3Bhd25lZCA9IGNwLnNwYXduKHBhcnNlZC5jb21tYW5kLCBwYXJzZWQuYXJncywgcGFyc2VkLm9wdGlvbnMpO1xuXG4gICAgLy8gSG9vayBpbnRvIGNoaWxkIHByb2Nlc3MgXCJleGl0XCIgZXZlbnQgdG8gZW1pdCBhbiBlcnJvciBpZiB0aGUgY29tbWFuZFxuICAgIC8vIGRvZXMgbm90IGV4aXN0cywgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vSW5kaWdvVW5pdGVkL25vZGUtY3Jvc3Mtc3Bhd24vaXNzdWVzLzE2XG4gICAgZW5vZW50Lmhvb2tDaGlsZFByb2Nlc3Moc3Bhd25lZCwgcGFyc2VkKTtcblxuICAgIHJldHVybiBzcGF3bmVkO1xufVxuXG5mdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZCwgYXJncywgb3B0aW9ucykge1xuICAgIC8vIFBhcnNlIHRoZSBhcmd1bWVudHNcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZShjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcblxuICAgIC8vIFNwYXduIHRoZSBjaGlsZCBwcm9jZXNzXG4gICAgY29uc3QgcmVzdWx0ID0gY3Auc3Bhd25TeW5jKHBhcnNlZC5jb21tYW5kLCBwYXJzZWQuYXJncywgcGFyc2VkLm9wdGlvbnMpO1xuXG4gICAgLy8gQW5hbHl6ZSBpZiB0aGUgY29tbWFuZCBkb2VzIG5vdCBleGlzdCwgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vSW5kaWdvVW5pdGVkL25vZGUtY3Jvc3Mtc3Bhd24vaXNzdWVzLzE2XG4gICAgcmVzdWx0LmVycm9yID0gcmVzdWx0LmVycm9yIHx8IGVub2VudC52ZXJpZnlFTk9FTlRTeW5jKHJlc3VsdC5zdGF0dXMsIHBhcnNlZCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5jcm9zc1NwYXduLmV4cG9ydHMgPSBzcGF3bjtcbmNyb3NzU3Bhd25FeHBvcnRzLnNwYXduID0gc3Bhd247XG5jcm9zc1NwYXduRXhwb3J0cy5zeW5jID0gc3Bhd25TeW5jO1xuXG5jcm9zc1NwYXduRXhwb3J0cy5fcGFyc2UgPSBwYXJzZTtcbmNyb3NzU3Bhd25FeHBvcnRzLl9lbm9lbnQgPSBlbm9lbnQ7XG5cbi8qKlxuICogVGhlIGZvbGxvd2luZyBpcyBtb2RpZmllZCBiYXNlZCBvbiBzb3VyY2UgZm91bmQgaW5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9jcmVhdGUtcmVhY3QtYXBwXG4gKlxuICogTUlUIExpY2Vuc2VkXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9jcmVhdGUtcmVhY3QtYXBwL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqXG4gKi9cbi8qKlxuICogUmVhZHMgdGhlIEJST1dTRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIGRlY2lkZXMgd2hhdCB0byBkbyB3aXRoIGl0LlxuICogUmV0dXJucyB0cnVlIGlmIGl0IG9wZW5lZCBhIGJyb3dzZXIgb3IgcmFuIGEgbm9kZS5qcyBzY3JpcHQsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gb3BlbkJyb3dzZXIodXJsLCBvcHQsIGxvZ2dlcikge1xuICAgIC8vIFRoZSBicm93c2VyIGV4ZWN1dGFibGUgdG8gb3Blbi5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9vcGVuI2FwcCBmb3IgZG9jdW1lbnRhdGlvbi5cbiAgICBjb25zdCBicm93c2VyID0gdHlwZW9mIG9wdCA9PT0gJ3N0cmluZycgPyBvcHQgOiBwcm9jZXNzLmVudi5CUk9XU0VSIHx8ICcnO1xuICAgIGlmIChicm93c2VyLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5qcycpKSB7XG4gICAgICAgIHJldHVybiBleGVjdXRlTm9kZVNjcmlwdChicm93c2VyLCB1cmwsIGxvZ2dlcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKGJyb3dzZXIudG9Mb3dlckNhc2UoKSAhPT0gJ25vbmUnKSB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJBcmdzID0gcHJvY2Vzcy5lbnYuQlJPV1NFUl9BUkdTXG4gICAgICAgICAgICA/IHByb2Nlc3MuZW52LkJST1dTRVJfQVJHUy5zcGxpdCgnICcpXG4gICAgICAgICAgICA6IFtdO1xuICAgICAgICByZXR1cm4gc3RhcnRCcm93c2VyUHJvY2Vzcyhicm93c2VyLCBicm93c2VyQXJncywgdXJsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZXhlY3V0ZU5vZGVTY3JpcHQoc2NyaXB0UGF0aCwgdXJsLCBsb2dnZXIpIHtcbiAgICBjb25zdCBleHRyYUFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMik7XG4gICAgY29uc3QgY2hpbGQgPSBjcm9zc1NwYXduRXhwb3J0cyhwcm9jZXNzLmV4ZWNQYXRoLCBbc2NyaXB0UGF0aCwgLi4uZXh0cmFBcmdzLCB1cmxdLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgY2hpbGQub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihwaWNvY29sb3JzRXhwb3J0cy5yZWQoYFxcblRoZSBzY3JpcHQgc3BlY2lmaWVkIGFzIEJST1dTRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgZmFpbGVkLlxcblxcbiR7cGljb2NvbG9yc0V4cG9ydHMuY3lhbihzY3JpcHRQYXRoKX0gZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LmApLCB7IGVycm9yOiBudWxsIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5jb25zdCBzdXBwb3J0ZWRDaHJvbWl1bUJyb3dzZXJzID0gW1xuICAgICdHb29nbGUgQ2hyb21lIENhbmFyeScsXG4gICAgJ0dvb2dsZSBDaHJvbWUgRGV2JyxcbiAgICAnR29vZ2xlIENocm9tZSBCZXRhJyxcbiAgICAnR29vZ2xlIENocm9tZScsXG4gICAgJ01pY3Jvc29mdCBFZGdlJyxcbiAgICAnQnJhdmUgQnJvd3NlcicsXG4gICAgJ1ZpdmFsZGknLFxuICAgICdDaHJvbWl1bScsXG5dO1xuZnVuY3Rpb24gc3RhcnRCcm93c2VyUHJvY2Vzcyhicm93c2VyLCBicm93c2VyQXJncywgdXJsKSB7XG4gICAgLy8gSWYgd2UncmUgb24gT1MgWCwgdGhlIHVzZXIgaGFzbid0IHNwZWNpZmljYWxseVxuICAgIC8vIHJlcXVlc3RlZCBhIGRpZmZlcmVudCBicm93c2VyLCB3ZSBjYW4gdHJ5IG9wZW5pbmdcbiAgICAvLyBhIENocm9taXVtIGJyb3dzZXIgd2l0aCBBcHBsZVNjcmlwdC4gVGhpcyBsZXRzIHVzIHJldXNlIGFuXG4gICAgLy8gZXhpc3RpbmcgdGFiIHdoZW4gcG9zc2libGUgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAgY29uc3QgcHJlZmVycmVkT1NYQnJvd3NlciA9IGJyb3dzZXIgPT09ICdnb29nbGUgY2hyb21lJyA/ICdHb29nbGUgQ2hyb21lJyA6IGJyb3dzZXI7XG4gICAgY29uc3Qgc2hvdWxkVHJ5T3BlbkNocm9tZVdpdGhBcHBsZVNjcmlwdCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nICYmXG4gICAgICAgICghcHJlZmVycmVkT1NYQnJvd3NlciB8fFxuICAgICAgICAgICAgc3VwcG9ydGVkQ2hyb21pdW1Ccm93c2Vycy5pbmNsdWRlcyhwcmVmZXJyZWRPU1hCcm93c2VyKSk7XG4gICAgaWYgKHNob3VsZFRyeU9wZW5DaHJvbWVXaXRoQXBwbGVTY3JpcHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBzID0gZXhlY1N5bmMoJ3BzIGNheCcpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCBvcGVuZWRCcm93c2VyID0gcHJlZmVycmVkT1NYQnJvd3NlciAmJiBwcy5pbmNsdWRlcyhwcmVmZXJyZWRPU1hCcm93c2VyKVxuICAgICAgICAgICAgICAgID8gcHJlZmVycmVkT1NYQnJvd3NlclxuICAgICAgICAgICAgICAgIDogc3VwcG9ydGVkQ2hyb21pdW1Ccm93c2Vycy5maW5kKChiKSA9PiBwcy5pbmNsdWRlcyhiKSk7XG4gICAgICAgICAgICBpZiAob3BlbmVkQnJvd3Nlcikge1xuICAgICAgICAgICAgICAgIC8vIFRyeSBvdXIgYmVzdCB0byByZXVzZSBleGlzdGluZyB0YWIgd2l0aCBBcHBsZVNjcmlwdFxuICAgICAgICAgICAgICAgIGV4ZWNTeW5jKGBvc2FzY3JpcHQgb3BlbkNocm9tZS5hcHBsZXNjcmlwdCBcIiR7ZW5jb2RlVVJJKHVybCl9XCIgXCIke29wZW5lZEJyb3dzZXJ9XCJgLCB7XG4gICAgICAgICAgICAgICAgICAgIGN3ZDogam9pbiQyKFZJVEVfUEFDS0FHRV9ESVIsICdiaW4nKSxcbiAgICAgICAgICAgICAgICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBbm90aGVyIHNwZWNpYWwgY2FzZTogb24gT1MgWCwgY2hlY2sgaWYgQlJPV1NFUiBoYXMgYmVlbiBzZXQgdG8gXCJvcGVuXCIuXG4gICAgLy8gSW4gdGhpcyBjYXNlLCBpbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHN0cmluZyBgb3BlbmAgdG8gYG9wZW5gIGZ1bmN0aW9uICh3aGljaCB3b24ndCB3b3JrKSxcbiAgICAvLyBqdXN0IGlnbm9yZSBpdCAodGh1cyBlbnN1cmluZyB0aGUgaW50ZW5kZWQgYmVoYXZpb3IsIGkuZS4gb3BlbmluZyB0aGUgc3lzdGVtIGJyb3dzZXIpOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9jcmVhdGUtcmVhY3QtYXBwL3B1bGwvMTY5MCNpc3N1ZWNvbW1lbnQtMjgzNTE4NzY4XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nICYmIGJyb3dzZXIgPT09ICdvcGVuJykge1xuICAgICAgICBicm93c2VyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBvcGVuXG4gICAgLy8gKEl0IHdpbGwgYWx3YXlzIG9wZW4gbmV3IHRhYilcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gYnJvd3NlclxuICAgICAgICAgICAgPyB7IGFwcDogeyBuYW1lOiBicm93c2VyLCBhcmd1bWVudHM6IGJyb3dzZXJBcmdzIH0gfVxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgb3Blbl8xKHVybCwgb3B0aW9ucykuY2F0Y2goKCkgPT4geyB9KTsgLy8gUHJldmVudCBgdW5oYW5kbGVkUmVqZWN0aW9uYCBlcnJvci5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU2VydmVyKGlubGluZUNvbmZpZyA9IHt9KSB7XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVzb2x2ZUNvbmZpZyhpbmxpbmVDb25maWcsICdzZXJ2ZScpO1xuICAgIGNvbnN0IHsgcm9vdCwgc2VydmVyOiBzZXJ2ZXJDb25maWcgfSA9IGNvbmZpZztcbiAgICBjb25zdCBodHRwc09wdGlvbnMgPSBhd2FpdCByZXNvbHZlSHR0cHNDb25maWcoY29uZmlnLnNlcnZlci5odHRwcyk7XG4gICAgY29uc3QgeyBtaWRkbGV3YXJlTW9kZSB9ID0gc2VydmVyQ29uZmlnO1xuICAgIGNvbnN0IHJlc29sdmVkV2F0Y2hPcHRpb25zID0gcmVzb2x2ZUNob2tpZGFyT3B0aW9ucyhjb25maWcsIHtcbiAgICAgICAgZGlzYWJsZUdsb2JiaW5nOiB0cnVlLFxuICAgICAgICAuLi5zZXJ2ZXJDb25maWcud2F0Y2gsXG4gICAgfSk7XG4gICAgY29uc3QgbWlkZGxld2FyZXMgPSBjb25uZWN0KCk7XG4gICAgY29uc3QgaHR0cFNlcnZlciA9IG1pZGRsZXdhcmVNb2RlXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGF3YWl0IHJlc29sdmVIdHRwU2VydmVyKHNlcnZlckNvbmZpZywgbWlkZGxld2FyZXMsIGh0dHBzT3B0aW9ucyk7XG4gICAgY29uc3Qgd3MgPSBjcmVhdGVXZWJTb2NrZXRTZXJ2ZXIoaHR0cFNlcnZlciwgY29uZmlnLCBodHRwc09wdGlvbnMpO1xuICAgIGlmIChodHRwU2VydmVyKSB7XG4gICAgICAgIHNldENsaWVudEVycm9ySGFuZGxlcihodHRwU2VydmVyLCBjb25maWcubG9nZ2VyKTtcbiAgICB9XG4gICAgY29uc3Qgd2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKFxuICAgIC8vIGNvbmZpZyBmaWxlIGRlcGVuZGVuY2llcyBhbmQgZW52IGZpbGUgbWlnaHQgYmUgb3V0c2lkZSBvZiByb290XG4gICAgW3Jvb3QsIC4uLmNvbmZpZy5jb25maWdGaWxlRGVwZW5kZW5jaWVzLCBjb25maWcuZW52RGlyXSwgcmVzb2x2ZWRXYXRjaE9wdGlvbnMpO1xuICAgIGNvbnN0IG1vZHVsZUdyYXBoID0gbmV3IE1vZHVsZUdyYXBoKCh1cmwsIHNzcikgPT4gY29udGFpbmVyLnJlc29sdmVJZCh1cmwsIHVuZGVmaW5lZCwgeyBzc3IgfSkpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGF3YWl0IGNyZWF0ZVBsdWdpbkNvbnRhaW5lcihjb25maWcsIG1vZHVsZUdyYXBoLCB3YXRjaGVyKTtcbiAgICBjb25zdCBjbG9zZUh0dHBTZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXJDbG9zZUZuKGh0dHBTZXJ2ZXIpO1xuICAgIGxldCBleGl0UHJvY2VzcztcbiAgICBjb25zdCBzZXJ2ZXIgPSB7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgbWlkZGxld2FyZXMsXG4gICAgICAgIGh0dHBTZXJ2ZXIsXG4gICAgICAgIHdhdGNoZXIsXG4gICAgICAgIHBsdWdpbkNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICB3cyxcbiAgICAgICAgbW9kdWxlR3JhcGgsXG4gICAgICAgIHJlc29sdmVkVXJsczogbnVsbCxcbiAgICAgICAgc3NyVHJhbnNmb3JtKGNvZGUsIGluTWFwLCB1cmwsIG9yaWdpbmFsQ29kZSA9IGNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzc3JUcmFuc2Zvcm0oY29kZSwgaW5NYXAsIHVybCwgb3JpZ2luYWxDb2RlLCBzZXJ2ZXIuY29uZmlnKTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdCh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1SZXF1ZXN0KHVybCwgc2VydmVyLCBvcHRpb25zKTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtSW5kZXhIdG1sOiBudWxsLFxuICAgICAgICBhc3luYyBzc3JMb2FkTW9kdWxlKHVybCwgb3B0cykge1xuICAgICAgICAgICAgaWYgKGlzRGVwc09wdGltaXplckVuYWJsZWQoY29uZmlnLCB0cnVlKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGluaXREZXZTc3JEZXBzT3B0aW1pemVyKGNvbmZpZywgc2VydmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHVwZGF0ZUNqc1NzckV4dGVybmFscyhzZXJ2ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHNzckxvYWRNb2R1bGUodXJsLCBzZXJ2ZXIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvcHRzPy5maXhTdGFja3RyYWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3NyRml4U3RhY2t0cmFjZShlKSB7XG4gICAgICAgICAgICBzc3JGaXhTdGFja3RyYWNlKGUsIG1vZHVsZUdyYXBoKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3NyUmV3cml0ZVN0YWNrdHJhY2Uoc3RhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBzc3JSZXdyaXRlU3RhY2t0cmFjZShzdGFjaywgbW9kdWxlR3JhcGgpO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyByZWxvYWRNb2R1bGUobW9kdWxlKSB7XG4gICAgICAgICAgICBpZiAoc2VydmVyQ29uZmlnLmhtciAhPT0gZmFsc2UgJiYgbW9kdWxlLmZpbGUpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVNb2R1bGVzKG1vZHVsZS5maWxlLCBbbW9kdWxlXSwgRGF0ZS5ub3coKSwgc2VydmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgbGlzdGVuKHBvcnQsIGlzUmVzdGFydCkge1xuICAgICAgICAgICAgYXdhaXQgc3RhcnRTZXJ2ZXIoc2VydmVyLCBwb3J0KTtcbiAgICAgICAgICAgIGlmIChodHRwU2VydmVyKSB7XG4gICAgICAgICAgICAgICAgc2VydmVyLnJlc29sdmVkVXJscyA9IGF3YWl0IHJlc29sdmVTZXJ2ZXJVcmxzKGh0dHBTZXJ2ZXIsIGNvbmZpZy5zZXJ2ZXIsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1Jlc3RhcnQgJiYgY29uZmlnLnNlcnZlci5vcGVuKVxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIub3BlbkJyb3dzZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZXJ2ZXI7XG4gICAgICAgIH0sXG4gICAgICAgIG9wZW5Ccm93c2VyKCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHNlcnZlci5jb25maWcuc2VydmVyO1xuICAgICAgICAgICAgY29uc3QgdXJsID0gc2VydmVyLnJlc29sdmVkVXJscz8ubG9jYWxbMF07XG4gICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHR5cGVvZiBvcHRpb25zLm9wZW4gPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gbmV3IFVSTChvcHRpb25zLm9wZW4sIHVybCkuaHJlZlxuICAgICAgICAgICAgICAgICAgICA6IHVybDtcbiAgICAgICAgICAgICAgICBvcGVuQnJvd3NlcihwYXRoLCB0cnVlLCBzZXJ2ZXIuY29uZmlnLmxvZ2dlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci53YXJuKCdObyBVUkwgYXZhaWxhYmxlIHRvIG9wZW4gaW4gYnJvd3NlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgICAgIGlmICghbWlkZGxld2FyZU1vZGUpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIGV4aXRQcm9jZXNzKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQ0kgIT09ICd0cnVlJykge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLnN0ZGluLm9mZignZW5kJywgZXhpdFByb2Nlc3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgICAgICAgICAgd2F0Y2hlci5jbG9zZSgpLFxuICAgICAgICAgICAgICAgIHdzLmNsb3NlKCksXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmNsb3NlKCksXG4gICAgICAgICAgICAgICAgZ2V0RGVwc09wdGltaXplcihzZXJ2ZXIuY29uZmlnKT8uY2xvc2UoKSxcbiAgICAgICAgICAgICAgICBnZXREZXBzT3B0aW1pemVyKHNlcnZlci5jb25maWcsIHRydWUpPy5jbG9zZSgpLFxuICAgICAgICAgICAgICAgIGNsb3NlSHR0cFNlcnZlcigpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBzZXJ2ZXIucmVzb2x2ZWRVcmxzID0gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgcHJpbnRVcmxzKCkge1xuICAgICAgICAgICAgaWYgKHNlcnZlci5yZXNvbHZlZFVybHMpIHtcbiAgICAgICAgICAgICAgICBwcmludFNlcnZlclVybHMoc2VydmVyLnJlc29sdmVkVXJscywgc2VydmVyQ29uZmlnLmhvc3QsIGNvbmZpZy5sb2dnZXIuaW5mbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtaWRkbGV3YXJlTW9kZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHByaW50IHNlcnZlciBVUkxzIGluIG1pZGRsZXdhcmUgbW9kZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHByaW50IHNlcnZlciBVUkxzIGJlZm9yZSBzZXJ2ZXIubGlzdGVuIGlzIGNhbGxlZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgcmVzdGFydChmb3JjZU9wdGltaXplKSB7XG4gICAgICAgICAgICBpZiAoIXNlcnZlci5fcmVzdGFydFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXIuX2ZvcmNlT3B0aW1pemVPblJlc3RhcnQgPSAhIWZvcmNlT3B0aW1pemU7XG4gICAgICAgICAgICAgICAgc2VydmVyLl9yZXN0YXJ0UHJvbWlzZSA9IHJlc3RhcnRTZXJ2ZXIoc2VydmVyKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyLl9yZXN0YXJ0UHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHNlcnZlci5fZm9yY2VPcHRpbWl6ZU9uUmVzdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNlcnZlci5fcmVzdGFydFByb21pc2U7XG4gICAgICAgIH0sXG4gICAgICAgIF9zc3JFeHRlcm5hbHM6IG51bGwsXG4gICAgICAgIF9yZXN0YXJ0UHJvbWlzZTogbnVsbCxcbiAgICAgICAgX2ltcG9ydEdsb2JNYXA6IG5ldyBNYXAoKSxcbiAgICAgICAgX2ZvcmNlT3B0aW1pemVPblJlc3RhcnQ6IGZhbHNlLFxuICAgICAgICBfcGVuZGluZ1JlcXVlc3RzOiBuZXcgTWFwKCksXG4gICAgICAgIF9mc0RlbnlHbG9iOiBwaWNvbWF0Y2gkMyhjb25maWcuc2VydmVyLmZzLmRlbnksIHsgbWF0Y2hCYXNlOiB0cnVlIH0pLFxuICAgICAgICBfc2hvcnRjdXRzT3B0aW9uczogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgc2VydmVyLnRyYW5zZm9ybUluZGV4SHRtbCA9IGNyZWF0ZURldkh0bWxUcmFuc2Zvcm1GbihzZXJ2ZXIpO1xuICAgIGlmICghbWlkZGxld2FyZU1vZGUpIHtcbiAgICAgICAgZXhpdFByb2Nlc3MgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGV4aXRQcm9jZXNzKTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkNJICE9PSAndHJ1ZScpIHtcbiAgICAgICAgICAgIHByb2Nlc3Muc3RkaW4ub24oJ2VuZCcsIGV4aXRQcm9jZXNzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB7IHBhY2thZ2VDYWNoZSB9ID0gY29uZmlnO1xuICAgIGNvbnN0IHNldFBhY2thZ2VEYXRhID0gcGFja2FnZUNhY2hlLnNldC5iaW5kKHBhY2thZ2VDYWNoZSk7XG4gICAgcGFja2FnZUNhY2hlLnNldCA9IChpZCwgcGtnKSA9PiB7XG4gICAgICAgIGlmIChpZC5lbmRzV2l0aCgnLmpzb24nKSkge1xuICAgICAgICAgICAgd2F0Y2hlci5hZGQoaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRQYWNrYWdlRGF0YShpZCwgcGtnKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uSE1SVXBkYXRlID0gYXN5bmMgKGZpbGUsIGNvbmZpZ09ubHkpID0+IHtcbiAgICAgICAgaWYgKHNlcnZlckNvbmZpZy5obXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUhNUlVwZGF0ZShmaWxlLCBzZXJ2ZXIsIGNvbmZpZ09ubHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHdzLnNlbmQoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBlcnI6IHByZXBhcmVFcnJvcihlcnIpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBvbkZpbGVBZGRVbmxpbmsgPSBhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICBmaWxlID0gbm9ybWFsaXplUGF0aCQzKGZpbGUpO1xuICAgICAgICBhd2FpdCBoYW5kbGVGaWxlQWRkVW5saW5rKGZpbGUsIHNlcnZlcik7XG4gICAgICAgIGF3YWl0IG9uSE1SVXBkYXRlKGZpbGUsIHRydWUpO1xuICAgIH07XG4gICAgd2F0Y2hlci5vbignY2hhbmdlJywgYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgZmlsZSA9IG5vcm1hbGl6ZVBhdGgkMyhmaWxlKTtcbiAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGludmFsaWRhdGVQYWNrYWdlRGF0YShwYWNrYWdlQ2FjaGUsIGZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGludmFsaWRhdGUgbW9kdWxlIGdyYXBoIGNhY2hlIG9uIGZpbGUgY2hhbmdlXG4gICAgICAgIG1vZHVsZUdyYXBoLm9uRmlsZUNoYW5nZShmaWxlKTtcbiAgICAgICAgYXdhaXQgb25ITVJVcGRhdGUoZmlsZSwgZmFsc2UpO1xuICAgIH0pO1xuICAgIHdhdGNoZXIub24oJ2FkZCcsIG9uRmlsZUFkZFVubGluayk7XG4gICAgd2F0Y2hlci5vbigndW5saW5rJywgb25GaWxlQWRkVW5saW5rKTtcbiAgICB3cy5vbigndml0ZTppbnZhbGlkYXRlJywgYXN5bmMgKHsgcGF0aCwgbWVzc2FnZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZCA9IG1vZHVsZUdyYXBoLnVybFRvTW9kdWxlTWFwLmdldChwYXRoKTtcbiAgICAgICAgaWYgKG1vZCAmJiBtb2QuaXNTZWxmQWNjZXB0aW5nICYmIG1vZC5sYXN0SE1SVGltZXN0YW1wID4gMCkge1xuICAgICAgICAgICAgY29uZmlnLmxvZ2dlci5pbmZvKHBpY29jb2xvcnNFeHBvcnRzLnllbGxvdyhgaG1yIGludmFsaWRhdGUgYCkgK1xuICAgICAgICAgICAgICAgIHBpY29jb2xvcnNFeHBvcnRzLmRpbShwYXRoKSArXG4gICAgICAgICAgICAgICAgKG1lc3NhZ2UgPyBgICR7bWVzc2FnZX1gIDogJycpLCB7IHRpbWVzdGFtcDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBnZXRTaG9ydE5hbWUobW9kLmZpbGUsIGNvbmZpZy5yb290KTtcbiAgICAgICAgICAgIHVwZGF0ZU1vZHVsZXMoZmlsZSwgWy4uLm1vZC5pbXBvcnRlcnNdLCBtb2QubGFzdEhNUlRpbWVzdGFtcCwgc2VydmVyLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghbWlkZGxld2FyZU1vZGUgJiYgaHR0cFNlcnZlcikge1xuICAgICAgICBodHRwU2VydmVyLm9uY2UoJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBhY3R1YWwgcG9ydCBzaW5jZSB0aGlzIG1heSBiZSBkaWZmZXJlbnQgZnJvbSBpbml0aWFsIHZhbHVlXG4gICAgICAgICAgICBzZXJ2ZXJDb25maWcucG9ydCA9IGh0dHBTZXJ2ZXIuYWRkcmVzcygpLnBvcnQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBhcHBseSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBob29rcyBmcm9tIHBsdWdpbnNcbiAgICBjb25zdCBwb3N0SG9va3MgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGhvb2sgb2YgY29uZmlnLmdldFNvcnRlZFBsdWdpbkhvb2tzKCdjb25maWd1cmVTZXJ2ZXInKSkge1xuICAgICAgICBwb3N0SG9va3MucHVzaChhd2FpdCBob29rKHNlcnZlcikpO1xuICAgIH1cbiAgICAvLyBJbnRlcm5hbCBtaWRkbGV3YXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyByZXF1ZXN0IHRpbWVyXG4gICAgaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgIG1pZGRsZXdhcmVzLnVzZSh0aW1lTWlkZGxld2FyZShyb290KSk7XG4gICAgfVxuICAgIC8vIGNvcnMgKGVuYWJsZWQgYnkgZGVmYXVsdClcbiAgICBjb25zdCB7IGNvcnMgfSA9IHNlcnZlckNvbmZpZztcbiAgICBpZiAoY29ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgbWlkZGxld2FyZXMudXNlKGxpYkV4cG9ydHMkMSh0eXBlb2YgY29ycyA9PT0gJ2Jvb2xlYW4nID8ge30gOiBjb3JzKSk7XG4gICAgfVxuICAgIC8vIHByb3h5XG4gICAgY29uc3QgeyBwcm94eSB9ID0gc2VydmVyQ29uZmlnO1xuICAgIGlmIChwcm94eSkge1xuICAgICAgICBtaWRkbGV3YXJlcy51c2UocHJveHlNaWRkbGV3YXJlKGh0dHBTZXJ2ZXIsIHByb3h5LCBjb25maWcpKTtcbiAgICB9XG4gICAgLy8gYmFzZVxuICAgIGlmIChjb25maWcuYmFzZSAhPT0gJy8nKSB7XG4gICAgICAgIG1pZGRsZXdhcmVzLnVzZShiYXNlTWlkZGxld2FyZShzZXJ2ZXIpKTtcbiAgICB9XG4gICAgLy8gb3BlbiBpbiBlZGl0b3Igc3VwcG9ydFxuICAgIG1pZGRsZXdhcmVzLnVzZSgnL19fb3Blbi1pbi1lZGl0b3InLCBsYXVuY2hFZGl0b3JNaWRkbGV3YXJlKCkpO1xuICAgIC8vIHNlcnZlIHN0YXRpYyBmaWxlcyB1bmRlciAvcHVibGljXG4gICAgLy8gdGhpcyBhcHBsaWVzIGJlZm9yZSB0aGUgdHJhbnNmb3JtIG1pZGRsZXdhcmUgc28gdGhhdCB0aGVzZSBmaWxlcyBhcmUgc2VydmVkXG4gICAgLy8gYXMtaXMgd2l0aG91dCB0cmFuc2Zvcm1zLlxuICAgIGlmIChjb25maWcucHVibGljRGlyKSB7XG4gICAgICAgIG1pZGRsZXdhcmVzLnVzZShzZXJ2ZVB1YmxpY01pZGRsZXdhcmUoY29uZmlnLnB1YmxpY0RpciwgY29uZmlnLnNlcnZlci5oZWFkZXJzKSk7XG4gICAgfVxuICAgIC8vIG1haW4gdHJhbnNmb3JtIG1pZGRsZXdhcmVcbiAgICBtaWRkbGV3YXJlcy51c2UodHJhbnNmb3JtTWlkZGxld2FyZShzZXJ2ZXIpKTtcbiAgICAvLyBzZXJ2ZSBzdGF0aWMgZmlsZXNcbiAgICBtaWRkbGV3YXJlcy51c2Uoc2VydmVSYXdGc01pZGRsZXdhcmUoc2VydmVyKSk7XG4gICAgbWlkZGxld2FyZXMudXNlKHNlcnZlU3RhdGljTWlkZGxld2FyZShyb290LCBzZXJ2ZXIpKTtcbiAgICAvLyBodG1sIGZhbGxiYWNrXG4gICAgaWYgKGNvbmZpZy5hcHBUeXBlID09PSAnc3BhJyB8fCBjb25maWcuYXBwVHlwZSA9PT0gJ21wYScpIHtcbiAgICAgICAgbWlkZGxld2FyZXMudXNlKGh0bWxGYWxsYmFja01pZGRsZXdhcmUocm9vdCwgY29uZmlnLmFwcFR5cGUgPT09ICdzcGEnKSk7XG4gICAgfVxuICAgIC8vIHJ1biBwb3N0IGNvbmZpZyBob29rc1xuICAgIC8vIFRoaXMgaXMgYXBwbGllZCBiZWZvcmUgdGhlIGh0bWwgbWlkZGxld2FyZSBzbyB0aGF0IHVzZXIgbWlkZGxld2FyZSBjYW5cbiAgICAvLyBzZXJ2ZSBjdXN0b20gY29udGVudCBpbnN0ZWFkIG9mIGluZGV4Lmh0bWwuXG4gICAgcG9zdEhvb2tzLmZvckVhY2goKGZuKSA9PiBmbiAmJiBmbigpKTtcbiAgICBpZiAoY29uZmlnLmFwcFR5cGUgPT09ICdzcGEnIHx8IGNvbmZpZy5hcHBUeXBlID09PSAnbXBhJykge1xuICAgICAgICAvLyB0cmFuc2Zvcm0gaW5kZXguaHRtbFxuICAgICAgICBtaWRkbGV3YXJlcy51c2UoaW5kZXhIdG1sTWlkZGxld2FyZShzZXJ2ZXIpKTtcbiAgICAgICAgLy8gaGFuZGxlIDQwNHNcbiAgICAgICAgLy8gS2VlcCB0aGUgbmFtZWQgZnVuY3Rpb24uIFRoZSBuYW1lIGlzIHZpc2libGUgaW4gZGVidWcgbG9ncyB2aWEgYERFQlVHPWNvbm5lY3Q6ZGlzcGF0Y2hlciAuLi5gXG4gICAgICAgIG1pZGRsZXdhcmVzLnVzZShmdW5jdGlvbiB2aXRlNDA0TWlkZGxld2FyZShfLCByZXMpIHtcbiAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gZXJyb3IgaGFuZGxlclxuICAgIG1pZGRsZXdhcmVzLnVzZShlcnJvck1pZGRsZXdhcmUoc2VydmVyLCBtaWRkbGV3YXJlTW9kZSkpO1xuICAgIGxldCBpbml0aW5nU2VydmVyO1xuICAgIGxldCBzZXJ2ZXJJbml0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBpbml0U2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoc2VydmVySW5pdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluaXRpbmdTZXJ2ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBpbml0aW5nU2VydmVyO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpbmdTZXJ2ZXIgPSAoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXdhaXQgY29udGFpbmVyLmJ1aWxkU3RhcnQoe30pO1xuICAgICAgICAgICAgaWYgKGlzRGVwc09wdGltaXplckVuYWJsZWQoY29uZmlnLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBub24tc3NyXG4gICAgICAgICAgICAgICAgYXdhaXQgaW5pdERlcHNPcHRpbWl6ZXIoY29uZmlnLCBzZXJ2ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5pdGluZ1NlcnZlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHNlcnZlckluaXRlZCA9IHRydWU7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHJldHVybiBpbml0aW5nU2VydmVyO1xuICAgIH07XG4gICAgaWYgKCFtaWRkbGV3YXJlTW9kZSAmJiBodHRwU2VydmVyKSB7XG4gICAgICAgIC8vIG92ZXJ3cml0ZSBsaXN0ZW4gdG8gaW5pdCBvcHRpbWl6ZXIgYmVmb3JlIHNlcnZlciBzdGFydFxuICAgICAgICBjb25zdCBsaXN0ZW4gPSBodHRwU2VydmVyLmxpc3Rlbi5iaW5kKGh0dHBTZXJ2ZXIpO1xuICAgICAgICBodHRwU2VydmVyLmxpc3RlbiA9IChhc3luYyAocG9ydCwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbml0U2VydmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGh0dHBTZXJ2ZXIuZW1pdCgnZXJyb3InLCBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbGlzdGVuKHBvcnQsIC4uLmFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGF3YWl0IGluaXRTZXJ2ZXIoKTtcbiAgICB9XG4gICAgLy8gRmlyZSBhIGNsZWFuIHVwIG9mIHN0YWxlIGNhY2hlIGRpcnMsIGluIGNhc2Ugb2xkIHByb2Nlc3NlcyBkaWRuJ3RcbiAgICAvLyB0ZXJtaW5hdGUgY29ycmVjdGx5LiBEb24ndCBhd2FpdCB0aGlzIHByb21pc2VcbiAgICBjbGVhbnVwRGVwc0NhY2hlU3RhbGVEaXJzKGNvbmZpZyk7XG4gICAgcmV0dXJuIHNlcnZlcjtcbn1cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0U2VydmVyKHNlcnZlciwgaW5saW5lUG9ydCkge1xuICAgIGNvbnN0IGh0dHBTZXJ2ZXIgPSBzZXJ2ZXIuaHR0cFNlcnZlcjtcbiAgICBpZiAoIWh0dHBTZXJ2ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBzZXJ2ZXIubGlzdGVuIGluIG1pZGRsZXdhcmUgbW9kZS4nKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9ucyA9IHNlcnZlci5jb25maWcuc2VydmVyO1xuICAgIGNvbnN0IHBvcnQgPSBpbmxpbmVQb3J0ID8/IG9wdGlvbnMucG9ydCA/PyBERUZBVUxUX0RFVl9QT1JUO1xuICAgIGNvbnN0IGhvc3RuYW1lID0gYXdhaXQgcmVzb2x2ZUhvc3RuYW1lKG9wdGlvbnMuaG9zdCk7XG4gICAgYXdhaXQgaHR0cFNlcnZlclN0YXJ0KGh0dHBTZXJ2ZXIsIHtcbiAgICAgICAgcG9ydCxcbiAgICAgICAgc3RyaWN0UG9ydDogb3B0aW9ucy5zdHJpY3RQb3J0LFxuICAgICAgICBob3N0OiBob3N0bmFtZS5ob3N0LFxuICAgICAgICBsb2dnZXI6IHNlcnZlci5jb25maWcubG9nZ2VyLFxuICAgIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlU2VydmVyQ2xvc2VGbihzZXJ2ZXIpIHtcbiAgICBpZiAoIXNlcnZlcikge1xuICAgICAgICByZXR1cm4gKCkgPT4geyB9O1xuICAgIH1cbiAgICBsZXQgaGFzTGlzdGVuZWQgPSBmYWxzZTtcbiAgICBjb25zdCBvcGVuU29ja2V0cyA9IG5ldyBTZXQoKTtcbiAgICBzZXJ2ZXIub24oJ2Nvbm5lY3Rpb24nLCAoc29ja2V0KSA9PiB7XG4gICAgICAgIG9wZW5Tb2NrZXRzLmFkZChzb2NrZXQpO1xuICAgICAgICBzb2NrZXQub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgb3BlblNvY2tldHMuZGVsZXRlKHNvY2tldCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICAgIGhhc0xpc3RlbmVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBvcGVuU29ja2V0cy5mb3JFYWNoKChzKSA9PiBzLmRlc3Ryb3koKSk7XG4gICAgICAgIGlmIChoYXNMaXN0ZW5lZCkge1xuICAgICAgICAgICAgc2VydmVyLmNsb3NlKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiByZXNvbHZlZEFsbG93RGlyKHJvb3QsIGRpcikge1xuICAgIHJldHVybiBub3JtYWxpemVQYXRoJDMocGF0aCRvLnJlc29sdmUocm9vdCwgZGlyKSk7XG59XG5mdW5jdGlvbiByZXNvbHZlU2VydmVyT3B0aW9ucyhyb290LCByYXcsIGxvZ2dlcikge1xuICAgIGNvbnN0IHNlcnZlciA9IHtcbiAgICAgICAgcHJlVHJhbnNmb3JtUmVxdWVzdHM6IHRydWUsXG4gICAgICAgIC4uLnJhdyxcbiAgICAgICAgc291cmNlbWFwSWdub3JlTGlzdDogcmF3Py5zb3VyY2VtYXBJZ25vcmVMaXN0ID09PSBmYWxzZVxuICAgICAgICAgICAgPyAoKSA9PiBmYWxzZVxuICAgICAgICAgICAgOiByYXc/LnNvdXJjZW1hcElnbm9yZUxpc3QgfHxcbiAgICAgICAgICAgICAgICAoKHNvdXJjZVBhdGgpID0+IHNvdXJjZVBhdGguaW5jbHVkZXMoJ25vZGVfbW9kdWxlcycpKSxcbiAgICAgICAgbWlkZGxld2FyZU1vZGU6ICEhcmF3Py5taWRkbGV3YXJlTW9kZSxcbiAgICB9O1xuICAgIGxldCBhbGxvd0RpcnMgPSBzZXJ2ZXIuZnM/LmFsbG93O1xuICAgIGNvbnN0IGRlbnkgPSBzZXJ2ZXIuZnM/LmRlbnkgfHwgWycuZW52JywgJy5lbnYuKicsICcqLntjcnQscGVtfSddO1xuICAgIGlmICghYWxsb3dEaXJzKSB7XG4gICAgICAgIGFsbG93RGlycyA9IFtzZWFyY2hGb3JXb3Jrc3BhY2VSb290KHJvb3QpXTtcbiAgICB9XG4gICAgYWxsb3dEaXJzID0gYWxsb3dEaXJzLm1hcCgoaSkgPT4gcmVzb2x2ZWRBbGxvd0Rpcihyb290LCBpKSk7XG4gICAgLy8gb25seSBwdXNoIGNsaWVudCBkaXIgd2hlbiB2aXRlIGl0c2VsZiBpcyBvdXRzaWRlLW9mLXJvb3RcbiAgICBjb25zdCByZXNvbHZlZENsaWVudERpciA9IHJlc29sdmVkQWxsb3dEaXIocm9vdCwgQ0xJRU5UX0RJUik7XG4gICAgaWYgKCFhbGxvd0RpcnMuc29tZSgoZGlyKSA9PiBpc1BhcmVudERpcmVjdG9yeShkaXIsIHJlc29sdmVkQ2xpZW50RGlyKSkpIHtcbiAgICAgICAgYWxsb3dEaXJzLnB1c2gocmVzb2x2ZWRDbGllbnREaXIpO1xuICAgIH1cbiAgICBzZXJ2ZXIuZnMgPSB7XG4gICAgICAgIHN0cmljdDogc2VydmVyLmZzPy5zdHJpY3QgPz8gdHJ1ZSxcbiAgICAgICAgYWxsb3c6IGFsbG93RGlycyxcbiAgICAgICAgZGVueSxcbiAgICB9O1xuICAgIGlmIChzZXJ2ZXIub3JpZ2luPy5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgIHNlcnZlci5vcmlnaW4gPSBzZXJ2ZXIub3JpZ2luLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgbG9nZ2VyLndhcm4ocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KGAke3BpY29jb2xvcnNFeHBvcnRzLmJvbGQoJyghKScpfSBzZXJ2ZXIub3JpZ2luIHNob3VsZCBub3QgZW5kIHdpdGggXCIvXCIuIFVzaW5nIFwiJHtzZXJ2ZXIub3JpZ2lufVwiIGluc3RlYWQuYCkpO1xuICAgIH1cbiAgICByZXR1cm4gc2VydmVyO1xufVxuYXN5bmMgZnVuY3Rpb24gcmVzdGFydFNlcnZlcihzZXJ2ZXIpIHtcbiAgICBnbG9iYWwuX192aXRlX3N0YXJ0X3RpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCB7IHBvcnQ6IHByZXZQb3J0LCBob3N0OiBwcmV2SG9zdCB9ID0gc2VydmVyLmNvbmZpZy5zZXJ2ZXI7XG4gICAgY29uc3Qgc2hvcnRjdXRzT3B0aW9ucyA9IHNlcnZlci5fc2hvcnRjdXRzT3B0aW9ucztcbiAgICBjb25zdCBvbGRVcmxzID0gc2VydmVyLnJlc29sdmVkVXJscztcbiAgICBsZXQgaW5saW5lQ29uZmlnID0gc2VydmVyLmNvbmZpZy5pbmxpbmVDb25maWc7XG4gICAgaWYgKHNlcnZlci5fZm9yY2VPcHRpbWl6ZU9uUmVzdGFydCkge1xuICAgICAgICBpbmxpbmVDb25maWcgPSBtZXJnZUNvbmZpZyhpbmxpbmVDb25maWcsIHtcbiAgICAgICAgICAgIG9wdGltaXplRGVwczoge1xuICAgICAgICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBuZXdTZXJ2ZXIgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICAgIG5ld1NlcnZlciA9IGF3YWl0IGNyZWF0ZVNlcnZlcihpbmxpbmVDb25maWcpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNlcnZlci5jb25maWcubG9nZ2VyLmVycm9yKGVyci5tZXNzYWdlLCB7XG4gICAgICAgICAgICB0aW1lc3RhbXA6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBzZXJ2ZXIuY29uZmlnLmxvZ2dlci5lcnJvcignc2VydmVyIHJlc3RhcnQgZmFpbGVkJywgeyB0aW1lc3RhbXA6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgLy8gcHJldmVudCBuZXcgc2VydmVyIGByZXN0YXJ0YCBmdW5jdGlvbiBmcm9tIGNhbGxpbmdcbiAgICBuZXdTZXJ2ZXIuX3Jlc3RhcnRQcm9taXNlID0gc2VydmVyLl9yZXN0YXJ0UHJvbWlzZTtcbiAgICBPYmplY3QuYXNzaWduKHNlcnZlciwgbmV3U2VydmVyKTtcbiAgICBjb25zdCB7IGxvZ2dlciwgc2VydmVyOiB7IHBvcnQsIGhvc3QsIG1pZGRsZXdhcmVNb2RlIH0sIH0gPSBzZXJ2ZXIuY29uZmlnO1xuICAgIGlmICghbWlkZGxld2FyZU1vZGUpIHtcbiAgICAgICAgYXdhaXQgc2VydmVyLmxpc3Rlbihwb3J0LCB0cnVlKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ3NlcnZlciByZXN0YXJ0ZWQuJywgeyB0aW1lc3RhbXA6IHRydWUgfSk7XG4gICAgICAgIGlmICgocG9ydCA/PyBERUZBVUxUX0RFVl9QT1JUKSAhPT0gKHByZXZQb3J0ID8/IERFRkFVTFRfREVWX1BPUlQpIHx8XG4gICAgICAgICAgICBob3N0ICE9PSBwcmV2SG9zdCB8fFxuICAgICAgICAgICAgZGlmZkRuc09yZGVyQ2hhbmdlKG9sZFVybHMsIG5ld1NlcnZlci5yZXNvbHZlZFVybHMpKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnJyk7XG4gICAgICAgICAgICBzZXJ2ZXIucHJpbnRVcmxzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdzZXJ2ZXIgcmVzdGFydGVkLicsIHsgdGltZXN0YW1wOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAoc2hvcnRjdXRzT3B0aW9ucykge1xuICAgICAgICBzaG9ydGN1dHNPcHRpb25zLnByaW50ID0gZmFsc2U7XG4gICAgICAgIGJpbmRTaG9ydGN1dHMobmV3U2VydmVyLCBzaG9ydGN1dHNPcHRpb25zKTtcbiAgICB9XG4gICAgLy8gbmV3IHNlcnZlciAodGhlIGN1cnJlbnQgc2VydmVyKSBjYW4gcmVzdGFydCBub3dcbiAgICBuZXdTZXJ2ZXIuX3Jlc3RhcnRQcm9taXNlID0gbnVsbDtcbn1cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNqc1NzckV4dGVybmFscyhzZXJ2ZXIpIHtcbiAgICBpZiAoIXNlcnZlci5fc3NyRXh0ZXJuYWxzKSB7XG4gICAgICAgIGxldCBrbm93bkltcG9ydHMgPSBbXTtcbiAgICAgICAgLy8gSW1wb3J0YW50ISBXZSB1c2UgdGhlIG5vbi1zc3Igb3B0aW1pemVkIGRlcHMgdG8gZmluZCBrbm93biBpbXBvcnRzXG4gICAgICAgIC8vIE9ubHkgdGhlIGV4cGxpY2l0bHkgZGVmaW5lZCBkZXBzIGFyZSBvcHRpbWl6ZWQgZHVyaW5nIGRldiBTU1IsIHNvXG4gICAgICAgIC8vIHdlIHVzZSB0aGUgZ2VuZXJhdGVkIGxpc3QgZnJvbSB0aGUgc2Nhbm5lZCBkZXBzIGluIHJlZ3VsYXIgZGV2LlxuICAgICAgICAvLyBUaGlzIGlzIHBhcnQgb2YgdGhlIHYyIGV4dGVybmFsaXphdGlvbiBoZXVyaXN0aWNzIGFuZCBpdCBpcyBrZXB0XG4gICAgICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpbiBjYXNlIHVzZXIgbmVlZHMgdG8gZmFsbGJhY2sgdG8gdGhlXG4gICAgICAgIC8vIGxlZ2FjeSBzY2hlbWUuIEl0IG1heSBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHYzIG1pbm9yLlxuICAgICAgICBjb25zdCBkZXBzT3B0aW1pemVyID0gZ2V0RGVwc09wdGltaXplcihzZXJ2ZXIuY29uZmlnLCBmYWxzZSk7IC8vIG5vbi1zc3JcbiAgICAgICAgaWYgKGRlcHNPcHRpbWl6ZXIpIHtcbiAgICAgICAgICAgIGF3YWl0IGRlcHNPcHRpbWl6ZXIuc2NhblByb2Nlc3Npbmc7XG4gICAgICAgICAgICBrbm93bkltcG9ydHMgPSBbXG4gICAgICAgICAgICAgICAgLi4uT2JqZWN0LmtleXMoZGVwc09wdGltaXplci5tZXRhZGF0YS5vcHRpbWl6ZWQpLFxuICAgICAgICAgICAgICAgIC4uLk9iamVjdC5rZXlzKGRlcHNPcHRpbWl6ZXIubWV0YWRhdGEuZGlzY292ZXJlZCksXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHNlcnZlci5fc3NyRXh0ZXJuYWxzID0gY2pzU3NyUmVzb2x2ZUV4dGVybmFscyhzZXJ2ZXIuY29uZmlnLCBrbm93bkltcG9ydHMpO1xuICAgIH1cbn1cblxudmFyIGluZGV4ID0ge1xuXHRfX3Byb3RvX186IG51bGwsXG5cdGNyZWF0ZVNlcnZlcjogY3JlYXRlU2VydmVyLFxuXHRyZXNvbHZlU2VydmVyT3B0aW9uczogcmVzb2x2ZVNlcnZlck9wdGlvbnMsXG5cdHNlYXJjaEZvcldvcmtzcGFjZVJvb3Q6IHNlYXJjaEZvcldvcmtzcGFjZVJvb3Rcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKiBnbG9iYWwgQnVmZmVyICovXG5jb25zdCBub29wID0gKCkgPT4geyB9O1xuY29uc3QgbWltZXMgPSAvdGV4dHxqYXZhc2NyaXB0fFxcL2pzb258eG1sL2k7XG5jb25zdCB0aHJlc2hvbGQgPSAxMDI0O1xuY29uc3QgbGV2ZWwgPSAtMTtcbmxldCBicm90bGkgPSBmYWxzZTtcbmNvbnN0IGdldENodW5rU2l6ZSA9IChjaHVuaywgZW5jKSA9PiAoY2h1bmsgPyBCdWZmZXIuYnl0ZUxlbmd0aChjaHVuaywgZW5jKSA6IDApO1xuZnVuY3Rpb24gY29tcHJlc3Npb24oKSB7XG4gICAgY29uc3QgYnJvdGxpT3B0cyA9ICh0eXBlb2YgYnJvdGxpID09PSAnb2JqZWN0JyAmJiBicm90bGkpIHx8IHt9O1xuICAgIGNvbnN0IGd6aXBPcHRzID0ge307XG4gICAgLy8gZGlzYWJsZSBCcm90bGkgb24gTm9kZTwxMi43IHdoZXJlIGl0IGlzIHVuc3VwcG9ydGVkOlxuICAgIGlmICghemxpYiQxLmNyZWF0ZUJyb3RsaUNvbXByZXNzKVxuICAgICAgICBicm90bGkgPSBmYWxzZTtcbiAgICByZXR1cm4gKHJlcSwgcmVzLCBuZXh0ID0gbm9vcCkgPT4ge1xuICAgICAgICBjb25zdCBhY2NlcHQgPSByZXEuaGVhZGVyc1snYWNjZXB0LWVuY29kaW5nJ10gKyAnJztcbiAgICAgICAgY29uc3QgZW5jb2RpbmcgPSAoKGJyb3RsaSAmJiBhY2NlcHQubWF0Y2goL1xcYmJyXFxiLykpIHx8XG4gICAgICAgICAgICAoYWNjZXB0Lm1hdGNoKC9cXGJnemlwXFxiLykpIHx8XG4gICAgICAgICAgICBbXSlbMF07XG4gICAgICAgIC8vIHNraXAgaWYgbm8gcmVzcG9uc2UgYm9keSBvciBubyBzdXBwb3J0ZWQgZW5jb2Rpbmc6XG4gICAgICAgIGlmIChyZXEubWV0aG9kID09PSAnSEVBRCcgfHwgIWVuY29kaW5nKVxuICAgICAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgICAgLyoqIEB0eXBlIHt6bGliLkd6aXAgfCB6bGliLkJyb3RsaUNvbXByZXNzfSAqL1xuICAgICAgICBsZXQgY29tcHJlc3M7XG4gICAgICAgIGxldCBwZW5kaW5nU3RhdHVzO1xuICAgICAgICAvKiogQHR5cGUge1tzdHJpbmcsIGZ1bmN0aW9uXVtdP30gKi9cbiAgICAgICAgbGV0IHBlbmRpbmdMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgbGV0IHN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNpemUgPSAwO1xuICAgICAgICBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgc2l6ZSA9IHJlcy5nZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJykgfCAwIHx8IHNpemU7XG4gICAgICAgICAgICBjb25zdCBjb21wcmVzc2libGUgPSBtaW1lcy50ZXN0KFN0cmluZyhyZXMuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSB8fCAndGV4dC9wbGFpbicpKTtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFydGV4dCA9ICFyZXMuZ2V0SGVhZGVyKCdDb250ZW50LUVuY29kaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBwZW5kaW5nTGlzdGVuZXJzIHx8IFtdO1xuICAgICAgICAgICAgaWYgKGNvbXByZXNzaWJsZSAmJiBjbGVhcnRleHQgJiYgc2l6ZSA+PSB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUVuY29kaW5nJywgZW5jb2RpbmcpO1xuICAgICAgICAgICAgICAgIHJlcy5yZW1vdmVIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nID09PSAnYnInKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFt6bGliJDEuY29uc3RhbnRzLkJST1RMSV9QQVJBTV9RVUFMSVRZXTogbGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBbemxpYiQxLmNvbnN0YW50cy5CUk9UTElfUEFSQU1fU0laRV9ISU5UXTogc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY29tcHJlc3MgPSB6bGliJDEuY3JlYXRlQnJvdGxpQ29tcHJlc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBPYmplY3QuYXNzaWduKHBhcmFtcywgYnJvdGxpT3B0cyksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcHJlc3MgPSB6bGliJDEuY3JlYXRlR3ppcChPYmplY3QuYXNzaWduKHsgbGV2ZWwgfSwgZ3ppcE9wdHMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYmFja3ByZXNzdXJlXG4gICAgICAgICAgICAgICAgY29tcHJlc3Mub24oJ2RhdGEnLCAoY2h1bmspID0+IHdyaXRlLmNhbGwocmVzLCBjaHVuaykgPT09IGZhbHNlICYmIGNvbXByZXNzLnBhdXNlKCkpO1xuICAgICAgICAgICAgICAgIG9uLmNhbGwocmVzLCAnZHJhaW4nLCAoKSA9PiBjb21wcmVzcy5yZXN1bWUoKSk7XG4gICAgICAgICAgICAgICAgY29tcHJlc3Mub24oJ2VuZCcsICgpID0+IGVuZC5jYWxsKHJlcykpO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChwKSA9PiBjb21wcmVzcy5vbi5hcHBseShjb21wcmVzcywgcCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZ0xpc3RlbmVycyA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKHApID0+IG9uLmFwcGx5KHJlcywgcCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd3JpdGVIZWFkLmNhbGwocmVzLCBwZW5kaW5nU3RhdHVzIHx8IHJlcy5zdGF0dXNDb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGVuZCwgd3JpdGUsIG9uLCB3cml0ZUhlYWQgfSA9IHJlcztcbiAgICAgICAgcmVzLndyaXRlSGVhZCA9IGZ1bmN0aW9uIChzdGF0dXMsIHJlYXNvbiwgaGVhZGVycykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWFzb24gIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIFtoZWFkZXJzLCByZWFzb25dID0gW3JlYXNvbiwgaGVhZGVyc107XG4gICAgICAgICAgICBpZiAoaGVhZGVycylcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpIGluIGhlYWRlcnMpXG4gICAgICAgICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoaSwgaGVhZGVyc1tpXSk7XG4gICAgICAgICAgICBwZW5kaW5nU3RhdHVzID0gc3RhdHVzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgICAgIHJlcy53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jLCBjYikge1xuICAgICAgICAgICAgc2l6ZSArPSBnZXRDaHVua1NpemUoY2h1bmssIGVuYyk7XG4gICAgICAgICAgICBpZiAoIXN0YXJ0ZWQpXG4gICAgICAgICAgICAgICAgc3RhcnQoKTtcbiAgICAgICAgICAgIGlmICghY29tcHJlc3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICByZXR1cm4gY29tcHJlc3Mud3JpdGUuYXBwbHkoY29tcHJlc3MsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICAgIHJlcy5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuYywgY2IpIHtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB0eXBlb2YgY2h1bmsgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBzaXplICs9IGdldENodW5rU2l6ZShjaHVuaywgZW5jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc3RhcnRlZClcbiAgICAgICAgICAgICAgICBzdGFydCgpO1xuICAgICAgICAgICAgaWYgKCFjb21wcmVzcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICByZXR1cm4gY29tcHJlc3MuZW5kLmFwcGx5KGNvbXByZXNzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgICByZXMub24gPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGlmICghcGVuZGluZ0xpc3RlbmVycyB8fCB0eXBlICE9PSAnZHJhaW4nKVxuICAgICAgICAgICAgICAgIG9uLmNhbGwodGhpcywgdHlwZSwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgZWxzZSBpZiAoY29tcHJlc3MpXG4gICAgICAgICAgICAgICAgY29tcHJlc3Mub24odHlwZSwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBlbmRpbmdMaXN0ZW5lcnMucHVzaChbdHlwZSwgbGlzdGVuZXJdKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgICAgICBuZXh0KCk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVByZXZpZXdPcHRpb25zKHByZXZpZXcsIHNlcnZlcikge1xuICAgIC8vIFRoZSBwcmV2aWV3IHNlcnZlciBpbmhlcml0cyBldmVyeSBDb21tb25TZXJ2ZXJPcHRpb24gZnJvbSB0aGUgYHNlcnZlcmAgY29uZmlnXG4gICAgLy8gZXhjZXB0IGZvciB0aGUgcG9ydCB0byBlbmFibGUgaGF2aW5nIGJvdGggdGhlIGRldiBhbmQgcHJldmlldyBzZXJ2ZXJzIHJ1bm5pbmdcbiAgICAvLyBhdCB0aGUgc2FtZSB0aW1lIHdpdGhvdXQgZXh0cmEgY29uZmlndXJhdGlvblxuICAgIHJldHVybiB7XG4gICAgICAgIHBvcnQ6IHByZXZpZXc/LnBvcnQsXG4gICAgICAgIHN0cmljdFBvcnQ6IHByZXZpZXc/LnN0cmljdFBvcnQgPz8gc2VydmVyLnN0cmljdFBvcnQsXG4gICAgICAgIGhvc3Q6IHByZXZpZXc/Lmhvc3QgPz8gc2VydmVyLmhvc3QsXG4gICAgICAgIGh0dHBzOiBwcmV2aWV3Py5odHRwcyA/PyBzZXJ2ZXIuaHR0cHMsXG4gICAgICAgIG9wZW46IHByZXZpZXc/Lm9wZW4gPz8gc2VydmVyLm9wZW4sXG4gICAgICAgIHByb3h5OiBwcmV2aWV3Py5wcm94eSA/PyBzZXJ2ZXIucHJveHksXG4gICAgICAgIGNvcnM6IHByZXZpZXc/LmNvcnMgPz8gc2VydmVyLmNvcnMsXG4gICAgICAgIGhlYWRlcnM6IHByZXZpZXc/LmhlYWRlcnMgPz8gc2VydmVyLmhlYWRlcnMsXG4gICAgfTtcbn1cbi8qKlxuICogU3RhcnRzIHRoZSBWaXRlIHNlcnZlciBpbiBwcmV2aWV3IG1vZGUsIHRvIHNpbXVsYXRlIGEgcHJvZHVjdGlvbiBkZXBsb3ltZW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXZpZXcoaW5saW5lQ29uZmlnID0ge30pIHtcbiAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXNvbHZlQ29uZmlnKGlubGluZUNvbmZpZywgJ3NlcnZlJywgJ3Byb2R1Y3Rpb24nLCAncHJvZHVjdGlvbicpO1xuICAgIGNvbnN0IGRpc3REaXIgPSBwYXRoJG8ucmVzb2x2ZShjb25maWcucm9vdCwgY29uZmlnLmJ1aWxkLm91dERpcik7XG4gICAgaWYgKCFmcyRsLmV4aXN0c1N5bmMoZGlzdERpcikgJiZcbiAgICAgICAgLy8gZXJyb3IgaWYgbm8gcGx1Z2lucyBpbXBsZW1lbnQgYGNvbmZpZ3VyZVByZXZpZXdTZXJ2ZXJgXG4gICAgICAgIGNvbmZpZy5wbHVnaW5zLmV2ZXJ5KChwbHVnaW4pID0+ICFwbHVnaW4uY29uZmlndXJlUHJldmlld1NlcnZlcikgJiZcbiAgICAgICAgLy8gZXJyb3IgaWYgY2FsbGVkIGluIENMSSBvbmx5LiBwcm9ncmFtbWF0aWMgdXNhZ2UgY291bGQgYWNjZXNzIGBodHRwU2VydmVyYFxuICAgICAgICAvLyBhbmQgYWZmZWN0IGZpbGUgc2VydmluZ1xuICAgICAgICBwcm9jZXNzLmFyZ3ZbMV0/LmVuZHNXaXRoKHBhdGgkby5ub3JtYWxpemUoJ2Jpbi92aXRlLmpzJykpICYmXG4gICAgICAgIHByb2Nlc3MuYXJndlsyXSA9PT0gJ3ByZXZpZXcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGRpcmVjdG9yeSBcIiR7Y29uZmlnLmJ1aWxkLm91dERpcn1cIiBkb2VzIG5vdCBleGlzdC4gRGlkIHlvdSBidWlsZCB5b3VyIHByb2plY3Q/YCk7XG4gICAgfVxuICAgIGNvbnN0IGFwcCA9IGNvbm5lY3QoKTtcbiAgICBjb25zdCBodHRwU2VydmVyID0gYXdhaXQgcmVzb2x2ZUh0dHBTZXJ2ZXIoY29uZmlnLnByZXZpZXcsIGFwcCwgYXdhaXQgcmVzb2x2ZUh0dHBzQ29uZmlnKGNvbmZpZy5wcmV2aWV3Py5odHRwcykpO1xuICAgIHNldENsaWVudEVycm9ySGFuZGxlcihodHRwU2VydmVyLCBjb25maWcubG9nZ2VyKTtcbiAgICAvLyBhcHBseSBzZXJ2ZXIgaG9va3MgZnJvbSBwbHVnaW5zXG4gICAgY29uc3QgcG9zdEhvb2tzID0gW107XG4gICAgZm9yIChjb25zdCBob29rIG9mIGNvbmZpZy5nZXRTb3J0ZWRQbHVnaW5Ib29rcygnY29uZmlndXJlUHJldmlld1NlcnZlcicpKSB7XG4gICAgICAgIHBvc3RIb29rcy5wdXNoKGF3YWl0IGhvb2soeyBtaWRkbGV3YXJlczogYXBwLCBodHRwU2VydmVyIH0pKTtcbiAgICB9XG4gICAgLy8gY29yc1xuICAgIGNvbnN0IHsgY29ycyB9ID0gY29uZmlnLnByZXZpZXc7XG4gICAgaWYgKGNvcnMgIT09IGZhbHNlKSB7XG4gICAgICAgIGFwcC51c2UobGliRXhwb3J0cyQxKHR5cGVvZiBjb3JzID09PSAnYm9vbGVhbicgPyB7fSA6IGNvcnMpKTtcbiAgICB9XG4gICAgLy8gcHJveHlcbiAgICBjb25zdCB7IHByb3h5IH0gPSBjb25maWcucHJldmlldztcbiAgICBpZiAocHJveHkpIHtcbiAgICAgICAgYXBwLnVzZShwcm94eU1pZGRsZXdhcmUoaHR0cFNlcnZlciwgcHJveHksIGNvbmZpZykpO1xuICAgIH1cbiAgICBhcHAudXNlKGNvbXByZXNzaW9uKCkpO1xuICAgIGNvbnN0IHByZXZpZXdCYXNlID0gY29uZmlnLmJhc2UgPT09ICcuLycgfHwgY29uZmlnLmJhc2UgPT09ICcnID8gJy8nIDogY29uZmlnLmJhc2U7XG4gICAgLy8gc3RhdGljIGFzc2V0c1xuICAgIGNvbnN0IGhlYWRlcnMgPSBjb25maWcucHJldmlldy5oZWFkZXJzO1xuICAgIGNvbnN0IGFzc2V0U2VydmVyID0gc2lydihkaXN0RGlyLCB7XG4gICAgICAgIGV0YWc6IHRydWUsXG4gICAgICAgIGRldjogdHJ1ZSxcbiAgICAgICAgc2luZ2xlOiBjb25maWcuYXBwVHlwZSA9PT0gJ3NwYScsXG4gICAgICAgIHNldEhlYWRlcnMocmVzKSB7XG4gICAgICAgICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBoZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIobmFtZSwgaGVhZGVyc1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzaG91bGRTZXJ2ZShmaWxlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNob3VsZFNlcnZlRmlsZShmaWxlUGF0aCwgZGlzdERpcik7XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgYXBwLnVzZShwcmV2aWV3QmFzZSwgYXNzZXRTZXJ2ZXIpO1xuICAgIC8vIGFwcGx5IHBvc3Qgc2VydmVyIGhvb2tzIGZyb20gcGx1Z2luc1xuICAgIHBvc3RIb29rcy5mb3JFYWNoKChmbikgPT4gZm4gJiYgZm4oKSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZy5wcmV2aWV3O1xuICAgIGNvbnN0IGhvc3RuYW1lID0gYXdhaXQgcmVzb2x2ZUhvc3RuYW1lKG9wdGlvbnMuaG9zdCk7XG4gICAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCA/PyBERUZBVUxUX1BSRVZJRVdfUE9SVDtcbiAgICBjb25zdCBwcm90b2NvbCA9IG9wdGlvbnMuaHR0cHMgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgIGNvbnN0IGxvZ2dlciA9IGNvbmZpZy5sb2dnZXI7XG4gICAgY29uc3Qgc2VydmVyUG9ydCA9IGF3YWl0IGh0dHBTZXJ2ZXJTdGFydChodHRwU2VydmVyLCB7XG4gICAgICAgIHBvcnQsXG4gICAgICAgIHN0cmljdFBvcnQ6IG9wdGlvbnMuc3RyaWN0UG9ydCxcbiAgICAgICAgaG9zdDogaG9zdG5hbWUuaG9zdCxcbiAgICAgICAgbG9nZ2VyLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc29sdmVkVXJscyA9IGF3YWl0IHJlc29sdmVTZXJ2ZXJVcmxzKGh0dHBTZXJ2ZXIsIGNvbmZpZy5wcmV2aWV3LCBjb25maWcpO1xuICAgIGlmIChvcHRpb25zLm9wZW4pIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHR5cGVvZiBvcHRpb25zLm9wZW4gPT09ICdzdHJpbmcnID8gb3B0aW9ucy5vcGVuIDogcHJldmlld0Jhc2U7XG4gICAgICAgIG9wZW5Ccm93c2VyKHBhdGguc3RhcnRzV2l0aCgnaHR0cCcpXG4gICAgICAgICAgICA/IHBhdGhcbiAgICAgICAgICAgIDogbmV3IFVSTChwYXRoLCBgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lLm5hbWV9OiR7c2VydmVyUG9ydH1gKS5ocmVmLCB0cnVlLCBsb2dnZXIpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjb25maWcsXG4gICAgICAgIGh0dHBTZXJ2ZXIsXG4gICAgICAgIHJlc29sdmVkVXJscyxcbiAgICAgICAgcHJpbnRVcmxzKCkge1xuICAgICAgICAgICAgcHJpbnRTZXJ2ZXJVcmxzKHJlc29sdmVkVXJscywgb3B0aW9ucy5ob3N0LCBsb2dnZXIuaW5mbyk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxudmFyIHByZXZpZXckMSA9IHtcblx0X19wcm90b19fOiBudWxsLFxuXHRwcmV2aWV3OiBwcmV2aWV3LFxuXHRyZXNvbHZlUHJldmlld09wdGlvbnM6IHJlc29sdmVQcmV2aWV3T3B0aW9uc1xufTtcblxuZnVuY3Rpb24gcmVzb2x2ZVNTUk9wdGlvbnMoc3NyLCBwcmVzZXJ2ZVN5bWxpbmtzLCBidWlsZFNzckNqc0V4dGVybmFsSGV1cmlzdGljcykge1xuICAgIHNzciA/PyAoc3NyID0ge30pO1xuICAgIGNvbnN0IG9wdGltaXplRGVwcyA9IHNzci5vcHRpbWl6ZURlcHMgPz8ge307XG4gICAgbGV0IGZvcm1hdCA9ICdlc20nO1xuICAgIGxldCB0YXJnZXQgPSAnbm9kZSc7XG4gICAgaWYgKGJ1aWxkU3NyQ2pzRXh0ZXJuYWxIZXVyaXN0aWNzKSB7XG4gICAgICAgIGlmIChzc3IpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9ICdjanMnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0ID0gJ25vZGUnO1xuICAgICAgICAgICAgZm9ybWF0ID0gJ2Nqcyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIC4uLnNzcixcbiAgICAgICAgb3B0aW1pemVEZXBzOiB7XG4gICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIC4uLm9wdGltaXplRGVwcyxcbiAgICAgICAgICAgIGVzYnVpbGRPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgcHJlc2VydmVTeW1saW5rcyxcbiAgICAgICAgICAgICAgICAuLi5vcHRpbWl6ZURlcHMuZXNidWlsZE9wdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH07XG59XG5cbmNvbnN0IGRlYnVnID0gY3JlYXRlRGVidWdnZXIoJ3ZpdGU6Y29uZmlnJyk7XG4vKipcbiAqIFR5cGUgaGVscGVyIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHVzZSB2aXRlLmNvbmZpZy50c1xuICogYWNjZXB0cyBhIGRpcmVjdCB7QGxpbmsgVXNlckNvbmZpZ30gb2JqZWN0LCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBpdC5cbiAqIFRoZSBmdW5jdGlvbiByZWNlaXZlcyBhIHtAbGluayBDb25maWdFbnZ9IG9iamVjdCB0aGF0IGV4cG9zZXMgdHdvIHByb3BlcnRpZXM6XG4gKiBgY29tbWFuZGAgKGVpdGhlciBgJ2J1aWxkJ2Agb3IgYCdzZXJ2ZSdgKSwgYW5kIGBtb2RlYC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lQ29uZmlnKGNvbmZpZykge1xuICAgIHJldHVybiBjb25maWc7XG59XG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ29uZmlnKGlubGluZUNvbmZpZywgY29tbWFuZCwgZGVmYXVsdE1vZGUgPSAnZGV2ZWxvcG1lbnQnLCBkZWZhdWx0Tm9kZUVudiA9ICdkZXZlbG9wbWVudCcpIHtcbiAgICBsZXQgY29uZmlnID0gaW5saW5lQ29uZmlnO1xuICAgIGxldCBjb25maWdGaWxlRGVwZW5kZW5jaWVzID0gW107XG4gICAgbGV0IG1vZGUgPSBpbmxpbmVDb25maWcubW9kZSB8fCBkZWZhdWx0TW9kZTtcbiAgICBjb25zdCBpc05vZGVFbnZTZXQgPSAhIXByb2Nlc3MuZW52Lk5PREVfRU5WO1xuICAgIC8vIHNvbWUgZGVwZW5kZW5jaWVzIGUuZy4gQHZ1ZS9jb21waWxlci0qIHJlbGllcyBvbiBOT0RFX0VOViBmb3IgZ2V0dGluZ1xuICAgIC8vIHByb2R1Y3Rpb24tc3BlY2lmaWMgYmVoYXZpb3IsIHNvIHNldCBpdCBlYXJseSBvblxuICAgIGlmICghaXNOb2RlRW52U2V0KSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID0gZGVmYXVsdE5vZGVFbnY7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZ0VudiA9IHtcbiAgICAgICAgbW9kZSxcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgc3NyQnVpbGQ6ICEhY29uZmlnLmJ1aWxkPy5zc3IsXG4gICAgfTtcbiAgICBsZXQgeyBjb25maWdGaWxlIH0gPSBjb25maWc7XG4gICAgaWYgKGNvbmZpZ0ZpbGUgIT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGxvYWRSZXN1bHQgPSBhd2FpdCBsb2FkQ29uZmlnRnJvbUZpbGUoY29uZmlnRW52LCBjb25maWdGaWxlLCBjb25maWcucm9vdCwgY29uZmlnLmxvZ0xldmVsKTtcbiAgICAgICAgaWYgKGxvYWRSZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlnKGxvYWRSZXN1bHQuY29uZmlnLCBjb25maWcpO1xuICAgICAgICAgICAgY29uZmlnRmlsZSA9IGxvYWRSZXN1bHQucGF0aDtcbiAgICAgICAgICAgIGNvbmZpZ0ZpbGVEZXBlbmRlbmNpZXMgPSBsb2FkUmVzdWx0LmRlcGVuZGVuY2llcztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyB1c2VyIGNvbmZpZyBtYXkgcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSBtb2RlLiBCdXQgLS1tb2RlIGhhcyBhIGhpZ2hlciBwcmlvcml0eVxuICAgIG1vZGUgPSBpbmxpbmVDb25maWcubW9kZSB8fCBjb25maWcubW9kZSB8fCBtb2RlO1xuICAgIGNvbmZpZ0Vudi5tb2RlID0gbW9kZTtcbiAgICBjb25zdCBmaWx0ZXJQbHVnaW4gPSAocCkgPT4ge1xuICAgICAgICBpZiAoIXApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghcC5hcHBseSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHAuYXBwbHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBwLmFwcGx5KHsgLi4uY29uZmlnLCBtb2RlIH0sIGNvbmZpZ0Vudik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcC5hcHBseSA9PT0gY29tbWFuZDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLy8gU29tZSBwbHVnaW5zIHRoYXQgYXJlbid0IGludGVuZGVkIHRvIHdvcmsgaW4gdGhlIGJ1bmRsaW5nIG9mIHdvcmtlcnMgKGRvaW5nIHBvc3QtcHJvY2Vzc2luZyBhdCBidWlsZCB0aW1lIGZvciBleGFtcGxlKS5cbiAgICAvLyBBbmQgUGx1Z2lucyBtYXkgYWxzbyBoYXZlIGNhY2hlZCB0aGF0IGNvdWxkIGJlIGNvcnJ1cHRlZCBieSBiZWluZyB1c2VkIGluIHRoZXNlIGV4dHJhIHJvbGx1cCBjYWxscy5cbiAgICAvLyBTbyB3ZSBuZWVkIHRvIHNlcGFyYXRlIHRoZSB3b3JrZXIgcGx1Z2luIGZyb20gdGhlIHBsdWdpbiB0aGF0IHZpdGUgbmVlZHMgdG8gcnVuLlxuICAgIGNvbnN0IHJhd1dvcmtlclVzZXJQbHVnaW5zID0gKGF3YWl0IGFzeW5jRmxhdHRlbihjb25maWcud29ya2VyPy5wbHVnaW5zIHx8IFtdKSkuZmlsdGVyKGZpbHRlclBsdWdpbik7XG4gICAgLy8gcmVzb2x2ZSBwbHVnaW5zXG4gICAgY29uc3QgcmF3VXNlclBsdWdpbnMgPSAoYXdhaXQgYXN5bmNGbGF0dGVuKGNvbmZpZy5wbHVnaW5zIHx8IFtdKSkuZmlsdGVyKGZpbHRlclBsdWdpbik7XG4gICAgY29uc3QgW3ByZVBsdWdpbnMsIG5vcm1hbFBsdWdpbnMsIHBvc3RQbHVnaW5zXSA9IHNvcnRVc2VyUGx1Z2lucyhyYXdVc2VyUGx1Z2lucyk7XG4gICAgLy8gcnVuIGNvbmZpZyBob29rc1xuICAgIGNvbnN0IHVzZXJQbHVnaW5zID0gWy4uLnByZVBsdWdpbnMsIC4uLm5vcm1hbFBsdWdpbnMsIC4uLnBvc3RQbHVnaW5zXTtcbiAgICBjb25maWcgPSBhd2FpdCBydW5Db25maWdIb29rKGNvbmZpZywgdXNlclBsdWdpbnMsIGNvbmZpZ0Vudik7XG4gICAgaWYgKHByb2Nlc3MuZW52LlZJVEVfVEVTVF9XSVRIT1VUX1BMVUdJTl9DT01NT05KUykge1xuICAgICAgICBjb25maWcgPSBtZXJnZUNvbmZpZyhjb25maWcsIHtcbiAgICAgICAgICAgIG9wdGltaXplRGVwczogeyBkaXNhYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHNzcjogeyBvcHRpbWl6ZURlcHM6IHsgZGlzYWJsZWQ6IGZhbHNlIH0gfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbmZpZy5idWlsZCA/PyAoY29uZmlnLmJ1aWxkID0ge30pO1xuICAgICAgICBjb25maWcuYnVpbGQuY29tbW9uanNPcHRpb25zID0geyBpbmNsdWRlOiBbXSB9O1xuICAgIH1cbiAgICAvLyBEZWZpbmUgbG9nZ2VyXG4gICAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKGNvbmZpZy5sb2dMZXZlbCwge1xuICAgICAgICBhbGxvd0NsZWFyU2NyZWVuOiBjb25maWcuY2xlYXJTY3JlZW4sXG4gICAgICAgIGN1c3RvbUxvZ2dlcjogY29uZmlnLmN1c3RvbUxvZ2dlcixcbiAgICB9KTtcbiAgICAvLyByZXNvbHZlIHJvb3RcbiAgICBjb25zdCByZXNvbHZlZFJvb3QgPSBub3JtYWxpemVQYXRoJDMoY29uZmlnLnJvb3QgPyBwYXRoJG8ucmVzb2x2ZShjb25maWcucm9vdCkgOiBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjbGllbnRBbGlhcyA9IFtcbiAgICAgICAgeyBmaW5kOiAvXlxcLz9Adml0ZVxcL2Vudi8sIHJlcGxhY2VtZW50OiBFTlZfRU5UUlkgfSxcbiAgICAgICAgeyBmaW5kOiAvXlxcLz9Adml0ZVxcL2NsaWVudC8sIHJlcGxhY2VtZW50OiBDTElFTlRfRU5UUlkgfSxcbiAgICBdO1xuICAgIC8vIHJlc29sdmUgYWxpYXMgd2l0aCBpbnRlcm5hbCBjbGllbnQgYWxpYXNcbiAgICBjb25zdCByZXNvbHZlZEFsaWFzID0gbm9ybWFsaXplQWxpYXMobWVyZ2VBbGlhcyhjbGllbnRBbGlhcywgY29uZmlnLnJlc29sdmU/LmFsaWFzIHx8IFtdKSk7XG4gICAgY29uc3QgcmVzb2x2ZU9wdGlvbnMgPSB7XG4gICAgICAgIG1haW5GaWVsZHM6IGNvbmZpZy5yZXNvbHZlPy5tYWluRmllbGRzID8/IERFRkFVTFRfTUFJTl9GSUVMRFMsXG4gICAgICAgIGJyb3dzZXJGaWVsZDogY29uZmlnLnJlc29sdmU/LmJyb3dzZXJGaWVsZCA/PyB0cnVlLFxuICAgICAgICBjb25kaXRpb25zOiBjb25maWcucmVzb2x2ZT8uY29uZGl0aW9ucyA/PyBbXSxcbiAgICAgICAgZXh0ZW5zaW9uczogY29uZmlnLnJlc29sdmU/LmV4dGVuc2lvbnMgPz8gREVGQVVMVF9FWFRFTlNJT05TJDEsXG4gICAgICAgIGRlZHVwZTogY29uZmlnLnJlc29sdmU/LmRlZHVwZSA/PyBbXSxcbiAgICAgICAgcHJlc2VydmVTeW1saW5rczogY29uZmlnLnJlc29sdmU/LnByZXNlcnZlU3ltbGlua3MgPz8gZmFsc2UsXG4gICAgICAgIGFsaWFzOiByZXNvbHZlZEFsaWFzLFxuICAgIH07XG4gICAgLy8gbG9hZCAuZW52IGZpbGVzXG4gICAgY29uc3QgZW52RGlyID0gY29uZmlnLmVudkRpclxuICAgICAgICA/IG5vcm1hbGl6ZVBhdGgkMyhwYXRoJG8ucmVzb2x2ZShyZXNvbHZlZFJvb3QsIGNvbmZpZy5lbnZEaXIpKVxuICAgICAgICA6IHJlc29sdmVkUm9vdDtcbiAgICBjb25zdCB1c2VyRW52ID0gaW5saW5lQ29uZmlnLmVudkZpbGUgIT09IGZhbHNlICYmXG4gICAgICAgIGxvYWRFbnYobW9kZSwgZW52RGlyLCByZXNvbHZlRW52UHJlZml4KGNvbmZpZykpO1xuICAgIC8vIE5vdGUgaXQgaXMgcG9zc2libGUgZm9yIHVzZXIgdG8gaGF2ZSBhIGN1c3RvbSBtb2RlLCBlLmcuIGBzdGFnaW5nYCB3aGVyZVxuICAgIC8vIGRldmVsb3BtZW50LWxpa2UgYmVoYXZpb3IgaXMgZXhwZWN0ZWQuIFRoaXMgaXMgaW5kaWNhdGVkIGJ5IE5PREVfRU5WPWRldmVsb3BtZW50XG4gICAgLy8gbG9hZGVkIGZyb20gYC5zdGFnaW5nLmVudmAgYW5kIHNldCBieSB1cyBhcyBWSVRFX1VTRVJfTk9ERV9FTlZcbiAgICBjb25zdCB1c2VyTm9kZUVudiA9IHByb2Nlc3MuZW52LlZJVEVfVVNFUl9OT0RFX0VOVjtcbiAgICBpZiAoIWlzTm9kZUVudlNldCAmJiB1c2VyTm9kZUVudikge1xuICAgICAgICBpZiAodXNlck5vZGVFbnYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID0gJ2RldmVsb3BtZW50JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PREVfRU5WPXByb2R1Y3Rpb24gaXMgbm90IHN1cHBvcnRlZCBhcyBpdCBjb3VsZCBicmVhayBITVIgaW4gZGV2IGZvciBmcmFtZXdvcmtzIGxpa2UgVnVlXG4gICAgICAgICAgICBsb2dnZXIud2FybihgTk9ERV9FTlY9JHt1c2VyTm9kZUVudn0gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgLmVudiBmaWxlLiBgICtcbiAgICAgICAgICAgICAgICBgT25seSBOT0RFX0VOVj1kZXZlbG9wbWVudCBpcyBzdXBwb3J0ZWQgdG8gY3JlYXRlIGEgZGV2ZWxvcG1lbnQgYnVpbGQgb2YgeW91ciBwcm9qZWN0LiBgICtcbiAgICAgICAgICAgICAgICBgSWYgeW91IG5lZWQgdG8gc2V0IHByb2Nlc3MuZW52Lk5PREVfRU5WLCB5b3UgY2FuIHNldCBpdCBpbiB0aGUgVml0ZSBjb25maWcgaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xuICAgIC8vIHJlc29sdmUgcHVibGljIGJhc2UgdXJsXG4gICAgY29uc3QgaXNCdWlsZCA9IGNvbW1hbmQgPT09ICdidWlsZCc7XG4gICAgY29uc3QgcmVsYXRpdmVCYXNlU2hvcnRjdXQgPSBjb25maWcuYmFzZSA9PT0gJycgfHwgY29uZmlnLmJhc2UgPT09ICcuLyc7XG4gICAgLy8gRHVyaW5nIGRldiwgd2UgaWdub3JlIHJlbGF0aXZlIGJhc2UgYW5kIGZhbGxiYWNrIHRvICcvJ1xuICAgIC8vIEZvciB0aGUgU1NSIGJ1aWxkLCByZWxhdGl2ZSBiYXNlIGlzbid0IHBvc3NpYmxlIGJ5IG1lYW5zXG4gICAgLy8gb2YgaW1wb3J0Lm1ldGEudXJsLlxuICAgIGNvbnN0IHJlc29sdmVkQmFzZSA9IHJlbGF0aXZlQmFzZVNob3J0Y3V0XG4gICAgICAgID8gIWlzQnVpbGQgfHwgY29uZmlnLmJ1aWxkPy5zc3JcbiAgICAgICAgICAgID8gJy8nXG4gICAgICAgICAgICA6ICcuLydcbiAgICAgICAgOiByZXNvbHZlQmFzZVVybChjb25maWcuYmFzZSwgaXNCdWlsZCwgbG9nZ2VyKSA/PyAnLyc7XG4gICAgY29uc3QgcmVzb2x2ZWRCdWlsZE9wdGlvbnMgPSByZXNvbHZlQnVpbGRPcHRpb25zKGNvbmZpZy5idWlsZCwgbG9nZ2VyLCByZXNvbHZlZFJvb3QpO1xuICAgIC8vIHJlc29sdmUgY2FjaGUgZGlyZWN0b3J5XG4gICAgY29uc3QgcGtnUGF0aCA9IGxvb2t1cEZpbGUocmVzb2x2ZWRSb290LCBbYHBhY2thZ2UuanNvbmBdLCB7IHBhdGhPbmx5OiB0cnVlIH0pO1xuICAgIGNvbnN0IGNhY2hlRGlyID0gbm9ybWFsaXplUGF0aCQzKGNvbmZpZy5jYWNoZURpclxuICAgICAgICA/IHBhdGgkby5yZXNvbHZlKHJlc29sdmVkUm9vdCwgY29uZmlnLmNhY2hlRGlyKVxuICAgICAgICA6IHBrZ1BhdGhcbiAgICAgICAgICAgID8gcGF0aCRvLmpvaW4ocGF0aCRvLmRpcm5hbWUocGtnUGF0aCksIGBub2RlX21vZHVsZXMvLnZpdGVgKVxuICAgICAgICAgICAgOiBwYXRoJG8uam9pbihyZXNvbHZlZFJvb3QsIGAudml0ZWApKTtcbiAgICBjb25zdCBhc3NldHNGaWx0ZXIgPSBjb25maWcuYXNzZXRzSW5jbHVkZSAmJlxuICAgICAgICAoIUFycmF5LmlzQXJyYXkoY29uZmlnLmFzc2V0c0luY2x1ZGUpIHx8IGNvbmZpZy5hc3NldHNJbmNsdWRlLmxlbmd0aClcbiAgICAgICAgPyBjcmVhdGVGaWx0ZXIoY29uZmlnLmFzc2V0c0luY2x1ZGUpXG4gICAgICAgIDogKCkgPT4gZmFsc2U7XG4gICAgLy8gY3JlYXRlIGFuIGludGVybmFsIHJlc29sdmVyIHRvIGJlIHVzZWQgaW4gc3BlY2lhbCBzY2VuYXJpb3MsIGUuZy5cbiAgICAvLyBvcHRpbWl6ZXIgJiBoYW5kbGluZyBjc3MgQGltcG9ydHNcbiAgICBjb25zdCBjcmVhdGVSZXNvbHZlciA9IChvcHRpb25zKSA9PiB7XG4gICAgICAgIGxldCBhbGlhc0NvbnRhaW5lcjtcbiAgICAgICAgbGV0IHJlc29sdmVyQ29udGFpbmVyO1xuICAgICAgICByZXR1cm4gYXN5bmMgKGlkLCBpbXBvcnRlciwgYWxpYXNPbmx5LCBzc3IpID0+IHtcbiAgICAgICAgICAgIGxldCBjb250YWluZXI7XG4gICAgICAgICAgICBpZiAoYWxpYXNPbmx5KSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyID1cbiAgICAgICAgICAgICAgICAgICAgYWxpYXNDb250YWluZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChhbGlhc0NvbnRhaW5lciA9IGF3YWl0IGNyZWF0ZVBsdWdpbkNvbnRhaW5lcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmVzb2x2ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luczogW2FsaWFzJDEoeyBlbnRyaWVzOiByZXNvbHZlZC5yZXNvbHZlLmFsaWFzIH0pXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyQ29udGFpbmVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzb2x2ZXJDb250YWluZXIgPSBhd2FpdCBjcmVhdGVQbHVnaW5Db250YWluZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlc29sdmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMkMSh7IGVudHJpZXM6IHJlc29sdmVkLnJlc29sdmUuYWxpYXMgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQbHVnaW4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmVzb2x2ZWQucmVzb2x2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q6IHJlc29sdmVkUm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJvZHVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQnVpbGQ6IGNvbW1hbmQgPT09ICdidWlsZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3JDb25maWc6IHJlc29sdmVkLnNzcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3JjOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVyUmVsYXRpdmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5SW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChhd2FpdCBjb250YWluZXIucmVzb2x2ZUlkKGlkLCBpbXBvcnRlciwge1xuICAgICAgICAgICAgICAgIHNzcixcbiAgICAgICAgICAgICAgICBzY2FuOiBvcHRpb25zPy5zY2FuLFxuICAgICAgICAgICAgfSkpPy5pZDtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IHsgcHVibGljRGlyIH0gPSBjb25maWc7XG4gICAgY29uc3QgcmVzb2x2ZWRQdWJsaWNEaXIgPSBwdWJsaWNEaXIgIT09IGZhbHNlICYmIHB1YmxpY0RpciAhPT0gJydcbiAgICAgICAgPyBwYXRoJG8ucmVzb2x2ZShyZXNvbHZlZFJvb3QsIHR5cGVvZiBwdWJsaWNEaXIgPT09ICdzdHJpbmcnID8gcHVibGljRGlyIDogJ3B1YmxpYycpXG4gICAgICAgIDogJyc7XG4gICAgY29uc3Qgc2VydmVyID0gcmVzb2x2ZVNlcnZlck9wdGlvbnMocmVzb2x2ZWRSb290LCBjb25maWcuc2VydmVyLCBsb2dnZXIpO1xuICAgIGNvbnN0IHNzciA9IHJlc29sdmVTU1JPcHRpb25zKGNvbmZpZy5zc3IsIHJlc29sdmVPcHRpb25zLnByZXNlcnZlU3ltbGlua3MsIGNvbmZpZy5sZWdhY3k/LmJ1aWxkU3NyQ2pzRXh0ZXJuYWxIZXVyaXN0aWNzKTtcbiAgICBjb25zdCBtaWRkbGV3YXJlTW9kZSA9IGNvbmZpZz8uc2VydmVyPy5taWRkbGV3YXJlTW9kZTtcbiAgICBjb25zdCBvcHRpbWl6ZURlcHMgPSBjb25maWcub3B0aW1pemVEZXBzIHx8IHt9O1xuICAgIGNvbnN0IEJBU0VfVVJMID0gcmVzb2x2ZWRCYXNlO1xuICAgIC8vIHJlc29sdmUgd29ya2VyXG4gICAgbGV0IHdvcmtlckNvbmZpZyA9IG1lcmdlQ29uZmlnKHt9LCBjb25maWcpO1xuICAgIGNvbnN0IFt3b3JrZXJQcmVQbHVnaW5zLCB3b3JrZXJOb3JtYWxQbHVnaW5zLCB3b3JrZXJQb3N0UGx1Z2luc10gPSBzb3J0VXNlclBsdWdpbnMocmF3V29ya2VyVXNlclBsdWdpbnMpO1xuICAgIC8vIHJ1biBjb25maWcgaG9va3NcbiAgICBjb25zdCB3b3JrZXJVc2VyUGx1Z2lucyA9IFtcbiAgICAgICAgLi4ud29ya2VyUHJlUGx1Z2lucyxcbiAgICAgICAgLi4ud29ya2VyTm9ybWFsUGx1Z2lucyxcbiAgICAgICAgLi4ud29ya2VyUG9zdFBsdWdpbnMsXG4gICAgXTtcbiAgICB3b3JrZXJDb25maWcgPSBhd2FpdCBydW5Db25maWdIb29rKHdvcmtlckNvbmZpZywgd29ya2VyVXNlclBsdWdpbnMsIGNvbmZpZ0Vudik7XG4gICAgY29uc3QgcmVzb2x2ZWRXb3JrZXJPcHRpb25zID0ge1xuICAgICAgICBmb3JtYXQ6IHdvcmtlckNvbmZpZy53b3JrZXI/LmZvcm1hdCB8fCAnaWlmZScsXG4gICAgICAgIHBsdWdpbnM6IFtdLFxuICAgICAgICByb2xsdXBPcHRpb25zOiB3b3JrZXJDb25maWcud29ya2VyPy5yb2xsdXBPcHRpb25zIHx8IHt9LFxuICAgICAgICBnZXRTb3J0ZWRQbHVnaW5zOiB1bmRlZmluZWQsXG4gICAgICAgIGdldFNvcnRlZFBsdWdpbkhvb2tzOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBjb25zdCByZXNvbHZlZENvbmZpZyA9IHtcbiAgICAgICAgY29uZmlnRmlsZTogY29uZmlnRmlsZSA/IG5vcm1hbGl6ZVBhdGgkMyhjb25maWdGaWxlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29uZmlnRmlsZURlcGVuZGVuY2llczogY29uZmlnRmlsZURlcGVuZGVuY2llcy5tYXAoKG5hbWUpID0+IG5vcm1hbGl6ZVBhdGgkMyhwYXRoJG8ucmVzb2x2ZShuYW1lKSkpLFxuICAgICAgICBpbmxpbmVDb25maWcsXG4gICAgICAgIHJvb3Q6IHJlc29sdmVkUm9vdCxcbiAgICAgICAgYmFzZTogcmVzb2x2ZWRCYXNlLmVuZHNXaXRoKCcvJykgPyByZXNvbHZlZEJhc2UgOiByZXNvbHZlZEJhc2UgKyAnLycsXG4gICAgICAgIHJhd0Jhc2U6IHJlc29sdmVkQmFzZSxcbiAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZU9wdGlvbnMsXG4gICAgICAgIHB1YmxpY0RpcjogcmVzb2x2ZWRQdWJsaWNEaXIsXG4gICAgICAgIGNhY2hlRGlyLFxuICAgICAgICBjb21tYW5kLFxuICAgICAgICBtb2RlLFxuICAgICAgICBzc3IsXG4gICAgICAgIGlzV29ya2VyOiBmYWxzZSxcbiAgICAgICAgbWFpbkNvbmZpZzogbnVsbCxcbiAgICAgICAgaXNQcm9kdWN0aW9uLFxuICAgICAgICBwbHVnaW5zOiB1c2VyUGx1Z2lucyxcbiAgICAgICAgZXNidWlsZDogY29uZmlnLmVzYnVpbGQgPT09IGZhbHNlXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBqc3hEZXY6ICFpc1Byb2R1Y3Rpb24sXG4gICAgICAgICAgICAgICAgLi4uY29uZmlnLmVzYnVpbGQsXG4gICAgICAgICAgICB9LFxuICAgICAgICBzZXJ2ZXIsXG4gICAgICAgIGJ1aWxkOiByZXNvbHZlZEJ1aWxkT3B0aW9ucyxcbiAgICAgICAgcHJldmlldzogcmVzb2x2ZVByZXZpZXdPcHRpb25zKGNvbmZpZy5wcmV2aWV3LCBzZXJ2ZXIpLFxuICAgICAgICBlbnZEaXIsXG4gICAgICAgIGVudjoge1xuICAgICAgICAgICAgLi4udXNlckVudixcbiAgICAgICAgICAgIEJBU0VfVVJMLFxuICAgICAgICAgICAgTU9ERTogbW9kZSxcbiAgICAgICAgICAgIERFVjogIWlzUHJvZHVjdGlvbixcbiAgICAgICAgICAgIFBST0Q6IGlzUHJvZHVjdGlvbixcbiAgICAgICAgfSxcbiAgICAgICAgYXNzZXRzSW5jbHVkZShmaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gREVGQVVMVF9BU1NFVFNfUkUudGVzdChmaWxlKSB8fCBhc3NldHNGaWx0ZXIoZmlsZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGxvZ2dlcixcbiAgICAgICAgcGFja2FnZUNhY2hlOiBuZXcgTWFwKCksXG4gICAgICAgIGNyZWF0ZVJlc29sdmVyLFxuICAgICAgICBvcHRpbWl6ZURlcHM6IHtcbiAgICAgICAgICAgIGRpc2FibGVkOiAnYnVpbGQnLFxuICAgICAgICAgICAgLi4ub3B0aW1pemVEZXBzLFxuICAgICAgICAgICAgZXNidWlsZE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBwcmVzZXJ2ZVN5bWxpbmtzOiByZXNvbHZlT3B0aW9ucy5wcmVzZXJ2ZVN5bWxpbmtzLFxuICAgICAgICAgICAgICAgIC4uLm9wdGltaXplRGVwcy5lc2J1aWxkT3B0aW9ucyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHdvcmtlcjogcmVzb2x2ZWRXb3JrZXJPcHRpb25zLFxuICAgICAgICBhcHBUeXBlOiBjb25maWcuYXBwVHlwZSA/PyAobWlkZGxld2FyZU1vZGUgPT09ICdzc3InID8gJ2N1c3RvbScgOiAnc3BhJyksXG4gICAgICAgIGV4cGVyaW1lbnRhbDoge1xuICAgICAgICAgICAgaW1wb3J0R2xvYlJlc3RvcmVFeHRlbnNpb246IGZhbHNlLFxuICAgICAgICAgICAgaG1yUGFydGlhbEFjY2VwdDogZmFsc2UsXG4gICAgICAgICAgICAuLi5jb25maWcuZXhwZXJpbWVudGFsLFxuICAgICAgICB9LFxuICAgICAgICBnZXRTb3J0ZWRQbHVnaW5zOiB1bmRlZmluZWQsXG4gICAgICAgIGdldFNvcnRlZFBsdWdpbkhvb2tzOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICBjb25zdCByZXNvbHZlZCA9IHtcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAuLi5yZXNvbHZlZENvbmZpZyxcbiAgICB9O1xuICAgIHJlc29sdmVkLnBsdWdpbnMgPSBhd2FpdCByZXNvbHZlUGx1Z2lucyhyZXNvbHZlZCwgcHJlUGx1Z2lucywgbm9ybWFsUGx1Z2lucywgcG9zdFBsdWdpbnMpO1xuICAgIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIGNyZWF0ZVBsdWdpbkhvb2tVdGlscyhyZXNvbHZlZC5wbHVnaW5zKSk7XG4gICAgY29uc3Qgd29ya2VyUmVzb2x2ZWQgPSB7XG4gICAgICAgIC4uLndvcmtlckNvbmZpZyxcbiAgICAgICAgLi4ucmVzb2x2ZWRDb25maWcsXG4gICAgICAgIGlzV29ya2VyOiB0cnVlLFxuICAgICAgICBtYWluQ29uZmlnOiByZXNvbHZlZCxcbiAgICB9O1xuICAgIHJlc29sdmVkQ29uZmlnLndvcmtlci5wbHVnaW5zID0gYXdhaXQgcmVzb2x2ZVBsdWdpbnMod29ya2VyUmVzb2x2ZWQsIHdvcmtlclByZVBsdWdpbnMsIHdvcmtlck5vcm1hbFBsdWdpbnMsIHdvcmtlclBvc3RQbHVnaW5zKTtcbiAgICBPYmplY3QuYXNzaWduKHJlc29sdmVkQ29uZmlnLndvcmtlciwgY3JlYXRlUGx1Z2luSG9va1V0aWxzKHJlc29sdmVkQ29uZmlnLndvcmtlci5wbHVnaW5zKSk7XG4gICAgLy8gY2FsbCBjb25maWdSZXNvbHZlZCBob29rc1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgLi4ucmVzb2x2ZWRcbiAgICAgICAgICAgIC5nZXRTb3J0ZWRQbHVnaW5Ib29rcygnY29uZmlnUmVzb2x2ZWQnKVxuICAgICAgICAgICAgLm1hcCgoaG9vaykgPT4gaG9vayhyZXNvbHZlZCkpLFxuICAgICAgICAuLi5yZXNvbHZlZENvbmZpZy53b3JrZXJcbiAgICAgICAgICAgIC5nZXRTb3J0ZWRQbHVnaW5Ib29rcygnY29uZmlnUmVzb2x2ZWQnKVxuICAgICAgICAgICAgLm1hcCgoaG9vaykgPT4gaG9vayh3b3JrZXJSZXNvbHZlZCkpLFxuICAgIF0pO1xuICAgIC8vIHZhbGlkYXRlIGNvbmZpZ1xuICAgIGlmIChtaWRkbGV3YXJlTW9kZSA9PT0gJ3NzcicpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4ocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KGBTZXR0aW5nIHNlcnZlci5taWRkbGV3YXJlTW9kZSB0byAnc3NyJyBpcyBkZXByZWNhdGVkLCBzZXQgc2VydmVyLm1pZGRsZXdhcmVNb2RlIHRvIFxcYHRydWVcXGAke2NvbmZpZy5hcHBUeXBlID09PSAnY3VzdG9tJyA/ICcnIDogYCBhbmQgYXBwVHlwZSB0byAnY3VzdG9tJ2B9IGluc3RlYWRgKSk7XG4gICAgfVxuICAgIGlmIChtaWRkbGV3YXJlTW9kZSA9PT0gJ2h0bWwnKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKHBpY29jb2xvcnNFeHBvcnRzLnllbGxvdyhgU2V0dGluZyBzZXJ2ZXIubWlkZGxld2FyZU1vZGUgdG8gJ2h0bWwnIGlzIGRlcHJlY2F0ZWQsIHNldCBzZXJ2ZXIubWlkZGxld2FyZU1vZGUgdG8gXFxgdHJ1ZVxcYCBpbnN0ZWFkYCkpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnNlcnZlcj8uZm9yY2UgJiZcbiAgICAgICAgIWlzQnVpbGQgJiZcbiAgICAgICAgY29uZmlnLm9wdGltaXplRGVwcz8uZm9yY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXNvbHZlZC5vcHRpbWl6ZURlcHMuZm9yY2UgPSB0cnVlO1xuICAgICAgICBsb2dnZXIud2FybihwaWNvY29sb3JzRXhwb3J0cy55ZWxsb3coYHNlcnZlci5mb3JjZSBpcyBkZXByZWNhdGVkLCB1c2Ugb3B0aW1pemVEZXBzLmZvcmNlIGluc3RlYWRgKSk7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICBkZWJ1ZyhgdXNpbmcgcmVzb2x2ZWQgY29uZmlnOiAlT2AsIHtcbiAgICAgICAgICAgIC4uLnJlc29sdmVkLFxuICAgICAgICAgICAgcGx1Z2luczogcmVzb2x2ZWQucGx1Z2lucy5tYXAoKHApID0+IHAubmFtZSksXG4gICAgICAgICAgICB3b3JrZXI6IHtcbiAgICAgICAgICAgICAgICAuLi5yZXNvbHZlZC53b3JrZXIsXG4gICAgICAgICAgICAgICAgcGx1Z2luczogcmVzb2x2ZWQud29ya2VyLnBsdWdpbnMubWFwKChwKSA9PiBwLm5hbWUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuYnVpbGQ/LnRlcnNlck9wdGlvbnMgJiYgY29uZmlnLmJ1aWxkLm1pbmlmeSAhPT0gJ3RlcnNlcicpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4ocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KGBidWlsZC50ZXJzZXJPcHRpb25zIGlzIHNwZWNpZmllZCBidXQgYnVpbGQubWluaWZ5IGlzIG5vdCBzZXQgdG8gdXNlIFRlcnNlci4gYCArXG4gICAgICAgICAgICBgTm90ZSBWaXRlIG5vdyBkZWZhdWx0cyB0byB1c2UgZXNidWlsZCBmb3IgbWluaWZpY2F0aW9uLiBJZiB5b3Ugc3RpbGwgYCArXG4gICAgICAgICAgICBgcHJlZmVyIFRlcnNlciwgc2V0IGJ1aWxkLm1pbmlmeSB0byBcInRlcnNlclwiLmApKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgYWxsIGFzc2V0RmlsZU5hbWVzIGhhdmUgdGhlIHNhbWUgcmVmZXJlbmNlLlxuICAgIC8vIElmIG5vdCwgZGlzcGxheSBhIHdhcm4gZm9yIHVzZXIuXG4gICAgY29uc3Qgb3V0cHV0T3B0aW9uID0gY29uZmlnLmJ1aWxkPy5yb2xsdXBPcHRpb25zPy5vdXRwdXQgPz8gW107XG4gICAgLy8gVXNlIGlzQXJyYXkgdG8gbmFycm93IGl0cyB0eXBlIHRvIGFycmF5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3V0cHV0T3B0aW9uKSkge1xuICAgICAgICBjb25zdCBhc3NldEZpbGVOYW1lc0xpc3QgPSBvdXRwdXRPcHRpb24ubWFwKChvdXRwdXQpID0+IG91dHB1dC5hc3NldEZpbGVOYW1lcyk7XG4gICAgICAgIGlmIChhc3NldEZpbGVOYW1lc0xpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RBc3NldEZpbGVOYW1lcyA9IGFzc2V0RmlsZU5hbWVzTGlzdFswXTtcbiAgICAgICAgICAgIGNvbnN0IGhhc0RpZmZlcmVudFJlZmVyZW5jZSA9IGFzc2V0RmlsZU5hbWVzTGlzdC5zb21lKChhc3NldEZpbGVOYW1lcykgPT4gYXNzZXRGaWxlTmFtZXMgIT09IGZpcnN0QXNzZXRGaWxlTmFtZXMpO1xuICAgICAgICAgICAgaWYgKGhhc0RpZmZlcmVudFJlZmVyZW5jZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmVkLmxvZ2dlci53YXJuKHBpY29jb2xvcnNFeHBvcnRzLnllbGxvdyhgXG5hc3NldEZpbGVOYW1lcyBpc24ndCBlcXVhbCBmb3IgZXZlcnkgYnVpbGQucm9sbHVwT3B0aW9ucy5vdXRwdXQuIEEgc2luZ2xlIHBhdHRlcm4gYWNyb3NzIGFsbCBvdXRwdXRzIGlzIHN1cHBvcnRlZCBieSBWaXRlLlxuYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlZDtcbn1cbi8qKlxuICogUmVzb2x2ZSBiYXNlIHVybC4gTm90ZSB0aGF0IHNvbWUgdXNlcnMgdXNlIFZpdGUgdG8gYnVpbGQgZm9yIG5vbi13ZWIgdGFyZ2V0cyBsaWtlXG4gKiBlbGVjdHJvbiBvciBleHBlY3RzIHRvIGRlcGxveVxuICovXG5mdW5jdGlvbiByZXNvbHZlQmFzZVVybChiYXNlID0gJy8nLCBpc0J1aWxkLCBsb2dnZXIpIHtcbiAgICBpZiAoYmFzZS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4ocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KHBpY29jb2xvcnNFeHBvcnRzLmJvbGQoYCghKSBpbnZhbGlkIFwiYmFzZVwiIG9wdGlvbjogJHtiYXNlfS4gVGhlIHZhbHVlIGNhbiBvbmx5IGJlIGFuIGFic29sdXRlIGAgK1xuICAgICAgICAgICAgYFVSTCwgLi8sIG9yIGFuIGVtcHR5IHN0cmluZy5gKSkpO1xuICAgICAgICByZXR1cm4gJy8nO1xuICAgIH1cbiAgICAvLyBleHRlcm5hbCBVUkwgZmxhZ1xuICAgIGNvbnN0IGlzRXh0ZXJuYWwgPSBpc0V4dGVybmFsVXJsKGJhc2UpO1xuICAgIC8vIG5vIGxlYWRpbmcgc2xhc2ggd2FyblxuICAgIGlmICghaXNFeHRlcm5hbCAmJiAhYmFzZS5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4ocGljb2NvbG9yc0V4cG9ydHMueWVsbG93KHBpY29jb2xvcnNFeHBvcnRzLmJvbGQoYCghKSBcImJhc2VcIiBvcHRpb24gc2hvdWxkIHN0YXJ0IHdpdGggYSBzbGFzaC5gKSkpO1xuICAgIH1cbiAgICAvLyBwYXJzZSBiYXNlIHdoZW4gY29tbWFuZCBpcyBzZXJ2ZSBvciBiYXNlIGlzIG5vdCBFeHRlcm5hbCBVUkxcbiAgICBpZiAoIWlzQnVpbGQgfHwgIWlzRXh0ZXJuYWwpIHtcbiAgICAgICAgYmFzZSA9IG5ldyBVUkwoYmFzZSwgJ2h0dHA6Ly92aXRlanMuZGV2JykucGF0aG5hbWU7XG4gICAgICAgIC8vIGVuc3VyZSBsZWFkaW5nIHNsYXNoXG4gICAgICAgIGlmICghYmFzZS5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIGJhc2UgPSAnLycgKyBiYXNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xufVxuZnVuY3Rpb24gc29ydFVzZXJQbHVnaW5zKHBsdWdpbnMpIHtcbiAgICBjb25zdCBwcmVQbHVnaW5zID0gW107XG4gICAgY29uc3QgcG9zdFBsdWdpbnMgPSBbXTtcbiAgICBjb25zdCBub3JtYWxQbHVnaW5zID0gW107XG4gICAgaWYgKHBsdWdpbnMpIHtcbiAgICAgICAgcGx1Z2lucy5mbGF0KCkuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgICAgaWYgKHAuZW5mb3JjZSA9PT0gJ3ByZScpXG4gICAgICAgICAgICAgICAgcHJlUGx1Z2lucy5wdXNoKHApO1xuICAgICAgICAgICAgZWxzZSBpZiAocC5lbmZvcmNlID09PSAncG9zdCcpXG4gICAgICAgICAgICAgICAgcG9zdFBsdWdpbnMucHVzaChwKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBub3JtYWxQbHVnaW5zLnB1c2gocCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gW3ByZVBsdWdpbnMsIG5vcm1hbFBsdWdpbnMsIHBvc3RQbHVnaW5zXTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGxvYWRDb25maWdGcm9tRmlsZShjb25maWdFbnYsIGNvbmZpZ0ZpbGUsIGNvbmZpZ1Jvb3QgPSBwcm9jZXNzLmN3ZCgpLCBsb2dMZXZlbCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgZ2V0VGltZSA9ICgpID0+IGAkeyhwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KS50b0ZpeGVkKDIpfW1zYDtcbiAgICBsZXQgcmVzb2x2ZWRQYXRoO1xuICAgIGlmIChjb25maWdGaWxlKSB7XG4gICAgICAgIC8vIGV4cGxpY2l0IGNvbmZpZyBwYXRoIGlzIGFsd2F5cyByZXNvbHZlZCBmcm9tIGN3ZFxuICAgICAgICByZXNvbHZlZFBhdGggPSBwYXRoJG8ucmVzb2x2ZShjb25maWdGaWxlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIGltcGxpY2l0IGNvbmZpZyBmaWxlIGxvYWRlZCBmcm9tIGlubGluZSByb290IChpZiBwcmVzZW50KVxuICAgICAgICAvLyBvdGhlcndpc2UgZnJvbSBjd2RcbiAgICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBERUZBVUxUX0NPTkZJR19GSUxFUykge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoJG8ucmVzb2x2ZShjb25maWdSb290LCBmaWxlbmFtZSk7XG4gICAgICAgICAgICBpZiAoIWZzJGwuZXhpc3RzU3luYyhmaWxlUGF0aCkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICByZXNvbHZlZFBhdGggPSBmaWxlUGF0aDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghcmVzb2x2ZWRQYXRoKSB7XG4gICAgICAgIGRlYnVnKCdubyBjb25maWcgZmlsZSBmb3VuZC4nKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCBpc0VTTSA9IGZhbHNlO1xuICAgIGlmICgvXFwubVtqdF1zJC8udGVzdChyZXNvbHZlZFBhdGgpKSB7XG4gICAgICAgIGlzRVNNID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoL1xcLmNbanRdcyQvLnRlc3QocmVzb2x2ZWRQYXRoKSkge1xuICAgICAgICBpc0VTTSA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gY2hlY2sgcGFja2FnZS5qc29uIGZvciB0eXBlOiBcIm1vZHVsZVwiIGFuZCBzZXQgYGlzRVNNYCB0byB0cnVlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwa2cgPSBsb29rdXBGaWxlKGNvbmZpZ1Jvb3QsIFsncGFja2FnZS5qc29uJ10pO1xuICAgICAgICAgICAgaXNFU00gPSAhIXBrZyAmJiBKU09OLnBhcnNlKHBrZykudHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBidW5kbGVkID0gYXdhaXQgYnVuZGxlQ29uZmlnRmlsZShyZXNvbHZlZFBhdGgsIGlzRVNNKTtcbiAgICAgICAgY29uc3QgdXNlckNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWdGcm9tQnVuZGxlZEZpbGUocmVzb2x2ZWRQYXRoLCBidW5kbGVkLmNvZGUsIGlzRVNNKTtcbiAgICAgICAgZGVidWcoYGJ1bmRsZWQgY29uZmlnIGZpbGUgbG9hZGVkIGluICR7Z2V0VGltZSgpfWApO1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCAodHlwZW9mIHVzZXJDb25maWcgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gdXNlckNvbmZpZyhjb25maWdFbnYpXG4gICAgICAgICAgICA6IHVzZXJDb25maWcpO1xuICAgICAgICBpZiAoIWlzT2JqZWN0JDIoY29uZmlnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb25maWcgbXVzdCBleHBvcnQgb3IgcmV0dXJuIGFuIG9iamVjdC5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogbm9ybWFsaXplUGF0aCQzKHJlc29sdmVkUGF0aCksXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IGJ1bmRsZWQuZGVwZW5kZW5jaWVzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBjcmVhdGVMb2dnZXIobG9nTGV2ZWwpLmVycm9yKHBpY29jb2xvcnNFeHBvcnRzLnJlZChgZmFpbGVkIHRvIGxvYWQgY29uZmlnIGZyb20gJHtyZXNvbHZlZFBhdGh9YCksIHsgZXJyb3I6IGUgfSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxufVxuYXN5bmMgZnVuY3Rpb24gYnVuZGxlQ29uZmlnRmlsZShmaWxlTmFtZSwgaXNFU00pIHtcbiAgICBjb25zdCBkaXJuYW1lVmFyTmFtZSA9ICdfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSc7XG4gICAgY29uc3QgZmlsZW5hbWVWYXJOYW1lID0gJ19fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSc7XG4gICAgY29uc3QgaW1wb3J0TWV0YVVybFZhck5hbWUgPSAnX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCc7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGQkMyh7XG4gICAgICAgIGFic1dvcmtpbmdEaXI6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgIGVudHJ5UG9pbnRzOiBbZmlsZU5hbWVdLFxuICAgICAgICBvdXRmaWxlOiAnb3V0LmpzJyxcbiAgICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgICB0YXJnZXQ6IFsnbm9kZTE0LjE4JywgJ25vZGUxNiddLFxuICAgICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgICBidW5kbGU6IHRydWUsXG4gICAgICAgIGZvcm1hdDogaXNFU00gPyAnZXNtJyA6ICdjanMnLFxuICAgICAgICBtYWluRmllbGRzOiBbJ21haW4nXSxcbiAgICAgICAgc291cmNlbWFwOiAnaW5saW5lJyxcbiAgICAgICAgbWV0YWZpbGU6IHRydWUsXG4gICAgICAgIGRlZmluZToge1xuICAgICAgICAgICAgX19kaXJuYW1lOiBkaXJuYW1lVmFyTmFtZSxcbiAgICAgICAgICAgIF9fZmlsZW5hbWU6IGZpbGVuYW1lVmFyTmFtZSxcbiAgICAgICAgICAgICdpbXBvcnQubWV0YS51cmwnOiBpbXBvcnRNZXRhVXJsVmFyTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdleHRlcm5hbGl6ZS1kZXBzJyxcbiAgICAgICAgICAgICAgICBzZXR1cChidWlsZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdDogcGF0aCRvLmRpcm5hbWUoZmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNCdWlsZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJvZHVjdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlclJlbGF0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeUluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkZpZWxkczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyRmllbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZUNvbmRpdGlvbnM6IFsnbm9kZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVkdXBlOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnM6IERFRkFVTFRfRVhURU5TSU9OUyQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVTeW1saW5rczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4dGVybmFsaXplIGJhcmUgaW1wb3J0c1xuICAgICAgICAgICAgICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IC9eW14uXS4qLyB9LCBhc3luYyAoeyBwYXRoOiBpZCwgaW1wb3J0ZXIsIGtpbmQgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPT09ICdlbnRyeS1wb2ludCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoJG8uaXNBYnNvbHV0ZShpZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0J1aWx0aW4oaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFydGlhbCBkZW5vIHN1cHBvcnQgYXMgYG5wbTpgIGRvZXMgbm90IHdvcmsgd2l0aCBlc2J1aWxkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aCgnbnBtOicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXh0ZXJuYWw6IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzSWRFU00gPSBpc0VTTSB8fCBraW5kID09PSAnZHluYW1pYy1pbXBvcnQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkRnNQYXRoID0gdHJ5Tm9kZVJlc29sdmUoaWQsIGltcG9ydGVyLCB7IC4uLm9wdGlvbnMsIGlzUmVxdWlyZTogIWlzSWRFU00gfSwgZmFsc2UpPy5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEZzUGF0aCAmJiBpc0lkRVNNKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRGc1BhdGggPSBwYXRoVG9GaWxlVVJMKGlkRnNQYXRoKS5ocmVmO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBpZEZzUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdpbmplY3QtZmlsZS1zY29wZS12YXJpYWJsZXMnLFxuICAgICAgICAgICAgICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogL1xcLltjbV0/W2p0XXMkLyB9LCBhc3luYyAoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudHMgPSBhd2FpdCBmcyRsLnByb21pc2VzLnJlYWRGaWxlKGFyZ3MucGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluamVjdFZhbHVlcyA9IGBjb25zdCAke2Rpcm5hbWVWYXJOYW1lfSA9ICR7SlNPTi5zdHJpbmdpZnkocGF0aCRvLmRpcm5hbWUoYXJncy5wYXRoKSl9O2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjb25zdCAke2ZpbGVuYW1lVmFyTmFtZX0gPSAke0pTT04uc3RyaW5naWZ5KGFyZ3MucGF0aCl9O2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjb25zdCAke2ltcG9ydE1ldGFVcmxWYXJOYW1lfSA9ICR7SlNPTi5zdHJpbmdpZnkocGF0aFRvRmlsZVVSTChhcmdzLnBhdGgpLmhyZWYpfTtgO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXI6IGFyZ3MucGF0aC5lbmRzV2l0aCgndHMnKSA/ICd0cycgOiAnanMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBpbmplY3RWYWx1ZXMgKyBjb250ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgIH0pO1xuICAgIGNvbnN0IHsgdGV4dCB9ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvZGU6IHRleHQsXG4gICAgICAgIGRlcGVuZGVuY2llczogcmVzdWx0Lm1ldGFmaWxlID8gT2JqZWN0LmtleXMocmVzdWx0Lm1ldGFmaWxlLmlucHV0cykgOiBbXSxcbiAgICB9O1xufVxuY29uc3QgX3JlcXVpcmUgPSBjcmVhdGVSZXF1aXJlJDEoaW1wb3J0Lm1ldGEudXJsKTtcbmFzeW5jIGZ1bmN0aW9uIGxvYWRDb25maWdGcm9tQnVuZGxlZEZpbGUoZmlsZU5hbWUsIGJ1bmRsZWRDb2RlLCBpc0VTTSkge1xuICAgIC8vIGZvciBlc20sIGJlZm9yZSB3ZSBjYW4gcmVnaXN0ZXIgbG9hZGVycyB3aXRob3V0IHJlcXVpcmluZyB1c2VycyB0byBydW4gbm9kZVxuICAgIC8vIHdpdGggLS1leHBlcmltZW50YWwtbG9hZGVyIHRoZW1zZWx2ZXMsIHdlIGhhdmUgdG8gZG8gYSBoYWNrIGhlcmU6XG4gICAgLy8gd3JpdGUgaXQgdG8gZGlzaywgbG9hZCBpdCB3aXRoIG5hdGl2ZSBOb2RlIEVTTSwgdGhlbiBkZWxldGUgdGhlIGZpbGUuXG4gICAgaWYgKGlzRVNNKSB7XG4gICAgICAgIGNvbnN0IGZpbGVCYXNlID0gYCR7ZmlsZU5hbWV9LnRpbWVzdGFtcC0ke0RhdGUubm93KCl9YDtcbiAgICAgICAgY29uc3QgZmlsZU5hbWVUbXAgPSBgJHtmaWxlQmFzZX0ubWpzYDtcbiAgICAgICAgY29uc3QgZmlsZVVybCA9IGAke3BhdGhUb0ZpbGVVUkwoZmlsZUJhc2UpfS5tanNgO1xuICAgICAgICBmcyRsLndyaXRlRmlsZVN5bmMoZmlsZU5hbWVUbXAsIGJ1bmRsZWRDb2RlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgZHluYW1pY0ltcG9ydChmaWxlVXJsKSkuZGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZnMkbC51bmxpbmtTeW5jKGZpbGVOYW1lVG1wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHJlbW92ZWQgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdHdpY2Ugc2ltdWx0YW5lb3VzbHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBmb3IgY2pzLCB3ZSBjYW4gcmVnaXN0ZXIgYSBjdXN0b20gbG9hZGVyIHZpYSBgX3JlcXVpcmUuZXh0ZW5zaW9uc2BcbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aCRvLmV4dG5hbWUoZmlsZU5hbWUpO1xuICAgICAgICBjb25zdCByZWFsRmlsZU5hbWUgPSBmcyRsLnJlYWxwYXRoU3luYyhmaWxlTmFtZSk7XG4gICAgICAgIGNvbnN0IGxvYWRlckV4dCA9IGV4dGVuc2lvbiBpbiBfcmVxdWlyZS5leHRlbnNpb25zID8gZXh0ZW5zaW9uIDogJy5qcyc7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRMb2FkZXIgPSBfcmVxdWlyZS5leHRlbnNpb25zW2xvYWRlckV4dF07XG4gICAgICAgIF9yZXF1aXJlLmV4dGVuc2lvbnNbbG9hZGVyRXh0XSA9IChtb2R1bGUsIGZpbGVuYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT09IHJlYWxGaWxlTmFtZSkge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5fY29tcGlsZShidW5kbGVkQ29kZSwgZmlsZW5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdExvYWRlcihtb2R1bGUsIGZpbGVuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gY2xlYXIgY2FjaGUgaW4gY2FzZSBvZiBzZXJ2ZXIgcmVzdGFydFxuICAgICAgICBkZWxldGUgX3JlcXVpcmUuY2FjaGVbX3JlcXVpcmUucmVzb2x2ZShmaWxlTmFtZSldO1xuICAgICAgICBjb25zdCByYXcgPSBfcmVxdWlyZShmaWxlTmFtZSk7XG4gICAgICAgIF9yZXF1aXJlLmV4dGVuc2lvbnNbbG9hZGVyRXh0XSA9IGRlZmF1bHRMb2FkZXI7XG4gICAgICAgIHJldHVybiByYXcuX19lc01vZHVsZSA/IHJhdy5kZWZhdWx0IDogcmF3O1xuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHJ1bkNvbmZpZ0hvb2soY29uZmlnLCBwbHVnaW5zLCBjb25maWdFbnYpIHtcbiAgICBsZXQgY29uZiA9IGNvbmZpZztcbiAgICBmb3IgKGNvbnN0IHAgb2YgZ2V0U29ydGVkUGx1Z2luc0J5SG9vaygnY29uZmlnJywgcGx1Z2lucykpIHtcbiAgICAgICAgY29uc3QgaG9vayA9IHAuY29uZmlnO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gaG9vayAmJiAnaGFuZGxlcicgaW4gaG9vayA/IGhvb2suaGFuZGxlciA6IGhvb2s7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBoYW5kbGVyKGNvbmYsIGNvbmZpZ0Vudik7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgY29uZiA9IG1lcmdlQ29uZmlnKGNvbmYsIHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbmY7XG59XG5mdW5jdGlvbiBnZXREZXBPcHRpbWl6YXRpb25Db25maWcoY29uZmlnLCBzc3IpIHtcbiAgICByZXR1cm4gc3NyID8gY29uZmlnLnNzci5vcHRpbWl6ZURlcHMgOiBjb25maWcub3B0aW1pemVEZXBzO1xufVxuZnVuY3Rpb24gaXNEZXBzT3B0aW1pemVyRW5hYmxlZChjb25maWcsIHNzcikge1xuICAgIGNvbnN0IHsgY29tbWFuZCB9ID0gY29uZmlnO1xuICAgIGNvbnN0IHsgZGlzYWJsZWQgfSA9IGdldERlcE9wdGltaXphdGlvbkNvbmZpZyhjb25maWcsIHNzcik7XG4gICAgcmV0dXJuICEoZGlzYWJsZWQgPT09IHRydWUgfHxcbiAgICAgICAgKGNvbW1hbmQgPT09ICdidWlsZCcgJiYgZGlzYWJsZWQgPT09ICdidWlsZCcpIHx8XG4gICAgICAgIChjb21tYW5kID09PSAnc2VydmUnICYmIGRpc2FibGVkID09PSAnZGV2JykpO1xufVxuXG5leHBvcnQgeyBwaWNvY29sb3JzRXhwb3J0cyBhcyBBLCBiaW5kU2hvcnRjdXRzIGFzIEIsIGNvbW1vbmpzR2xvYmFsIGFzIEMsIGluZGV4JDEgYXMgRCwgYnVpbGQkMSBhcyBFLCBpbmRleCBhcyBGLCBwcmV2aWV3JDEgYXMgRywgcHJlcHJvY2Vzc0NTUyBhcyBhLCBidWlsZCBhcyBiLCBjcmVhdGVTZXJ2ZXIgYXMgYywgcmVzb2x2ZVBhY2thZ2VEYXRhIGFzIGQsIGJ1aWxkRXJyb3JNZXNzYWdlIGFzIGUsIGZvcm1hdFBvc3Rjc3NTb3VyY2VNYXAgYXMgZiwgZGVmaW5lQ29uZmlnIGFzIGcsIHJlc29sdmVDb25maWcgYXMgaCwgcmVzb2x2ZUJhc2VVcmwgYXMgaSwgZ2V0RGVwT3B0aW1pemF0aW9uQ29uZmlnIGFzIGosIGlzRGVwc09wdGltaXplckVuYWJsZWQgYXMgaywgbG9hZENvbmZpZ0Zyb21GaWxlIGFzIGwsIG1lcmdlQ29uZmlnIGFzIG0sIG5vcm1hbGl6ZVBhdGgkMyBhcyBuLCBvcHRpbWl6ZURlcHMgYXMgbywgcHJldmlldyBhcyBwLCBtZXJnZUFsaWFzIGFzIHEsIHJlc29sdmVQYWNrYWdlRW50cnkgYXMgciwgc29ydFVzZXJQbHVnaW5zIGFzIHMsIHRyYW5zZm9ybVdpdGhFc2J1aWxkIGFzIHQsIGNyZWF0ZUZpbHRlciBhcyB1LCBzZW5kJDEgYXMgdiwgY3JlYXRlTG9nZ2VyIGFzIHcsIHNlYXJjaEZvcldvcmtzcGFjZVJvb3QgYXMgeCwgbG9hZEVudiBhcyB5LCByZXNvbHZlRW52UHJlZml4IGFzIHogfTtcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcQ2hhcmxlc1xcXFxEZXNrdG9wXFxcXE15IGZpbmlzaGVkIHByb2plY3RzXFxcXE5peGl4XFxcXHZpdGUtcGx1Z2luXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxDaGFybGVzXFxcXERlc2t0b3BcXFxcTXkgZmluaXNoZWQgcHJvamVjdHNcXFxcTml4aXhcXFxcdml0ZS1wbHVnaW5cXFxcaW5kZXguanNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0M6L1VzZXJzL0NoYXJsZXMvRGVza3RvcC9NeSUyMGZpbmlzaGVkJTIwcHJvamVjdHMvTml4aXgvdml0ZS1wbHVnaW4vaW5kZXguanNcIjtpbXBvcnQgeyBqb2luLCBub3JtYWxpemUgfSBmcm9tIFwicGF0aFwiO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ3ZpdGUnKS5QbHVnaW59IFBsdWdpblxuICogQHBhcmFtIHt7aG1yPzogYm9vbGVhbiwgZGV2PzogYm9vbGVhbn19IHBhcmFtMCBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE5peGl4UGx1Z2luKHtobXIsIGRldn0pIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtQbHVnaW59XG4gICAqL1xuICBjb25zdCByZWFjdGl2aXR5cGx1Z2luID0ge1xuICAgIG5hbWU6IFwibml4aXgtcmVhY3Rpdml0eVwiLFxuICAgIGFwcGx5OiAoKSA9PiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgYXN5bmMgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICAvLyBpZiBmaWxlIGV4dGVuc2lvbiBpcyBub3QgdHMgfCBqcyB8IGpzeCB8IHRzeC5cbiAgICAgIGlmICgvbm9kZV9tb2R1bGVzLy50ZXN0KGlkKSB8fCAhL1xcLih0fGopc3g/JC8udGVzdChpZCkpIHJldHVybjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBgJHtjb2RlfWAsXG4gICAgICAgIH07XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBwbHVnaW5zID0gW3JlYWN0aXZpdHlwbHVnaW5dO1xuICBobXIgJiYgcGx1Z2lucy5wdXNoKC4uLk5peGl4SE1SKG51bGwsIGRldikpXG4gIHJldHVybiBwbHVnaW5zO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBOaXhpeEhNUihwcm9qZWN0Um9vdCwgZGV2KSB7XG4gIGNvbnN0IGhtcnBsdWdpbiA9IHtcbiAgICBuYW1lOiBcIm5peGl4LXZpdGUtaG1yXCIsXG4gICAgYXBwbHk6IFwic2VydmVcIixcblxuICAgIGFzeW5jIHRyYW5zZm9ybShjb2RlLCBpZCkge1xuICAgICAgLy8gaWYgZmlsZSBleHRlbnNpb24gaXMgbm90IHRzIHwganMgfCBqc3ggfCB0c3guXG4gICAgICBpZiAoL25vZGVfbW9kdWxlcy8udGVzdChpZCkgfHwgIS9cXC4odHxqKXN4PyQvLnRlc3QoaWQpKSByZXR1cm47XG4gICAgICAvLyBwcm9qZWN0IHJvb3RcbiAgICAgIGNvbnN0IHJvb3QgPSBwcm9qZWN0Um9vdD8uc3BsaXQ/LihcIi9cIikgfHwgW1wic3JjXCIsIFwiaW5kZXgudHN4XCJdO1xuICAgICAgY29uc3QgcGF0aCA9IG5vcm1hbGl6ZShqb2luKGAke3Byb2Nlc3MuY3dkKCl9YCwgLi4ucm9vdCkpO1xuICAgICAgY29uc3QgcmVnRXhwID0gbm9ybWFsaXplKGlkKS5pbmNsdWRlcyhwYXRoKTtcbiAgICAgIGlmIChyZWdFeHApIHtcbiAgICAgICAgY29uc3QgcHJlbHVkZSA9IGBpZiAoaW1wb3J0Lm1ldGEuaG90KSB7XG4gICAgICAgICAgaW1wb3J0Lm1ldGEuaG90Py5hY2NlcHQoKG5ld01vZCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIG5peGl4U3RvcmVbJyQkX19yb3V0ZVN0b3JlJ11cbiAgICAgICAgICAgIGFnbm9zdGljUm91dGVPYmplY3RzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAobml4aXhTdG9yZT8ucm9vdCk/LnJlcGxhY2VDaGlsZHJlbj8uKFwiXCIpO1xuICAgICAgICBcbiAgICAgICAgICAgIG5ld01vZD8uZGVmYXVsdD8uKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGltcG9ydCB7IGFnbm9zdGljUm91dGVPYmplY3RzIH0gZnJvbSBcIiR7ZGV2ID8gJ3JvdXRlci91dGlscycgOiAnbml4aXgvcm91dGVyL3V0aWxzJ31cIjtcbiAgICAgICAgYDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb2RlOiBgJHtwcmVsdWRlfSR7Y29kZX1gLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIFtobXJwbHVnaW5dO1xufVxuXG5jb25zdCBlc2J1aWxkT3B0aW9ucyA9IHtcbiAganN4RmFjdG9yeTogXCJOaXhpeC5jcmVhdGVcIixcbiAganN4RnJhZ21lbnQ6ICdcImZyYWdtZW50XCInLFxuICBqc3hJbXBvcnRTb3VyY2U6IFwibml4aXhcIixcbiAganN4RGV2OiBmYWxzZSxcbiAganN4OiBcInRyYW5zZm9ybVwiLFxuICBqc3hJbmplY3Q6IFwiaW1wb3J0IE5peGl4LCB7IG5peGl4U3RvcmUsIHR1cm5PbkpzeCB9IGZyb20gJ25peGl4L2RvbSc7XCIsXG4gIG1pbmlmeUlkZW50aWZpZXJzOiB0cnVlLFxufTtcblxuY29uc3QgZGV2RXNidWlsZE9wdGlvbnMgPSB7XG4gIGpzeEZhY3Rvcnk6IFwiTml4aXguY3JlYXRlXCIsXG4gIGpzeEZyYWdtZW50OiBcIidmcmFnbWVudCdcIixcbiAganN4SW1wb3J0U291cmNlOiBcIi4vaW5kZXguanNcIixcbiAganN4SW5qZWN0OiAnaW1wb3J0IE5peGl4LCB7IG5peGl4U3RvcmUsIHR1cm5PbkpzeCB9IGZyb20gXCJkb21cIicsXG59O1xuXG5leHBvcnQgeyBkZXZFc2J1aWxkT3B0aW9ucywgZXNidWlsZE9wdGlvbnMgfTtcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcQ2hhcmxlc1xcXFxEZXNrdG9wXFxcXE15IGZpbmlzaGVkIHByb2plY3RzXFxcXE5peGl4XFxcXG5vZGVfbW9kdWxlc1xcXFx2aXRlXFxcXGRpc3RcXFxcbm9kZVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcQ2hhcmxlc1xcXFxEZXNrdG9wXFxcXE15IGZpbmlzaGVkIHByb2plY3RzXFxcXE5peGl4XFxcXG5vZGVfbW9kdWxlc1xcXFx2aXRlXFxcXGRpc3RcXFxcbm9kZVxcXFxpbmRleC5qc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vQzovVXNlcnMvQ2hhcmxlcy9EZXNrdG9wL015JTIwZmluaXNoZWQlMjBwcm9qZWN0cy9OaXhpeC9ub2RlX21vZHVsZXMvdml0ZS9kaXN0L25vZGUvaW5kZXguanNcIjtleHBvcnQgeyBiIGFzIGJ1aWxkLCBlIGFzIGJ1aWxkRXJyb3JNZXNzYWdlLCB1IGFzIGNyZWF0ZUZpbHRlciwgdyBhcyBjcmVhdGVMb2dnZXIsIGMgYXMgY3JlYXRlU2VydmVyLCBnIGFzIGRlZmluZUNvbmZpZywgZiBhcyBmb3JtYXRQb3N0Y3NzU291cmNlTWFwLCBqIGFzIGdldERlcE9wdGltaXphdGlvbkNvbmZpZywgayBhcyBpc0RlcHNPcHRpbWl6ZXJFbmFibGVkLCBsIGFzIGxvYWRDb25maWdGcm9tRmlsZSwgeSBhcyBsb2FkRW52LCBxIGFzIG1lcmdlQWxpYXMsIG0gYXMgbWVyZ2VDb25maWcsIG4gYXMgbm9ybWFsaXplUGF0aCwgbyBhcyBvcHRpbWl6ZURlcHMsIGEgYXMgcHJlcHJvY2Vzc0NTUywgcCBhcyBwcmV2aWV3LCBpIGFzIHJlc29sdmVCYXNlVXJsLCBoIGFzIHJlc29sdmVDb25maWcsIHogYXMgcmVzb2x2ZUVudlByZWZpeCwgZCBhcyByZXNvbHZlUGFja2FnZURhdGEsIHIgYXMgcmVzb2x2ZVBhY2thZ2VFbnRyeSwgeCBhcyBzZWFyY2hGb3JXb3Jrc3BhY2VSb290LCB2IGFzIHNlbmQsIHMgYXMgc29ydFVzZXJQbHVnaW5zLCB0IGFzIHRyYW5zZm9ybVdpdGhFc2J1aWxkIH0gZnJvbSAnLi9jaHVua3MvZGVwLTc5ODkyZGU4LmpzJztcbmV4cG9ydCB7IFZFUlNJT04gYXMgdmVyc2lvbiB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmV4cG9ydCB7IHZlcnNpb24gYXMgZXNidWlsZFZlcnNpb24gfSBmcm9tICdlc2J1aWxkJztcbmV4cG9ydCB7IFZFUlNJT04gYXMgcm9sbHVwVmVyc2lvbiB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgJ25vZGU6ZnMnO1xuaW1wb3J0ICdub2RlOnBhdGgnO1xuaW1wb3J0ICdub2RlOnVybCc7XG5pbXBvcnQgJ25vZGU6cGVyZl9ob29rcyc7XG5pbXBvcnQgJ25vZGU6bW9kdWxlJztcbmltcG9ydCAndHR5JztcbmltcG9ydCAncGF0aCc7XG5pbXBvcnQgJ2ZzJztcbmltcG9ydCAnZXZlbnRzJztcbmltcG9ydCAnYXNzZXJ0JztcbmltcG9ydCAndXRpbCc7XG5pbXBvcnQgJ25ldCc7XG5pbXBvcnQgJ3VybCc7XG5pbXBvcnQgJ2h0dHAnO1xuaW1wb3J0ICdzdHJlYW0nO1xuaW1wb3J0ICdvcyc7XG5pbXBvcnQgJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICdub2RlOm9zJztcbmltcG9ydCAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0ICdub2RlOnV0aWwnO1xuaW1wb3J0ICdub2RlOmRucyc7XG5pbXBvcnQgJ3Jlc29sdmUnO1xuaW1wb3J0ICdjcnlwdG8nO1xuaW1wb3J0ICdub2RlOmJ1ZmZlcic7XG5pbXBvcnQgJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICdtb2R1bGUnO1xuaW1wb3J0ICdub2RlOmFzc2VydCc7XG5pbXBvcnQgJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgJ25vZGU6djgnO1xuaW1wb3J0ICd3b3JrZXJfdGhyZWFkcyc7XG5pbXBvcnQgJ3psaWInO1xuaW1wb3J0ICdidWZmZXInO1xuaW1wb3J0ICdodHRwcyc7XG5pbXBvcnQgJ3Rscyc7XG5pbXBvcnQgJ25vZGU6aHR0cCc7XG5pbXBvcnQgJ25vZGU6aHR0cHMnO1xuaW1wb3J0ICdxdWVyeXN0cmluZyc7XG5pbXBvcnQgJ25vZGU6cmVhZGxpbmUnO1xuaW1wb3J0ICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICdub2RlOnpsaWInO1xuXG4vLyBUaGlzIGZpbGUgd2lsbCBiZSBidWlsdCBmb3IgYm90aCBFU00gYW5kIENKUy4gQXZvaWQgcmVseWluZyBvbiBvdGhlciBtb2R1bGVzIGFzIHBvc3NpYmxlLlxuLy8gY29weSBmcm9tIGNvbnN0YW50cy50c1xuY29uc3QgQ1NTX0xBTkdTX1JFID0gXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXVudXNlZC1jYXB0dXJpbmctZ3JvdXBcbi9cXC4oY3NzfGxlc3N8c2Fzc3xzY3NzfHN0eWx8c3R5bHVzfHBjc3N8cG9zdGNzc3xzc3MpKD86JHxcXD8pLztcbmNvbnN0IGlzQ1NTUmVxdWVzdCA9IChyZXF1ZXN0KSA9PiBDU1NfTEFOR1NfUkUudGVzdChyZXF1ZXN0KTtcbi8vIFVzZSBzcGxpdFZlbmRvckNodW5rUGx1Z2luKCkgdG8gZ2V0IHRoZSBzYW1lIG1hbnVhbENodW5rcyBzdHJhdGVneSBhcyBWaXRlIDIuN1xuLy8gV2UgZG9uJ3QgcmVjb21tZW5kIHVzaW5nIHRoaXMgc3RyYXRlZ3kgYXMgYSBnZW5lcmFsIHNvbHV0aW9uIG1vdmluZyBmb3J3YXJkXG4vLyBzcGxpdFZlbmRvckNodW5rIGlzIGEgc2ltcGxlIGluZGV4L3ZlbmRvciBzdHJhdGVneSB0aGF0IHdhcyB1c2VkIGluIFZpdGVcbi8vIHVudGlsIHYyLjguIEl0IGlzIGV4cG9zZWQgdG8gbGV0IHBlb3BsZSBjb250aW51ZSB0byB1c2UgaXQgaW4gY2FzZSBpdCB3YXNcbi8vIHdvcmtpbmcgd2VsbCBmb3IgdGhlaXIgc2V0dXBzLlxuLy8gVGhlIGNhY2hlIG5lZWRzIHRvIGJlIHJlc2V0IG9uIGJ1aWxkU3RhcnQgZm9yIHdhdGNoIG1vZGUgdG8gd29yayBjb3JyZWN0bHlcbi8vIERvbid0IHVzZSB0aGlzIG1hbnVhbENodW5rcyBzdHJhdGVneSBmb3Igc3NyLCBsaWIgbW9kZSwgYW5kICd1bWQnIG9yICdpaWZlJ1xuY2xhc3MgU3BsaXRWZW5kb3JDaHVua0NhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gc3BsaXRWZW5kb3JDaHVuayhvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBjYWNoZSA9IG9wdGlvbnMuY2FjaGUgPz8gbmV3IFNwbGl0VmVuZG9yQ2h1bmtDYWNoZSgpO1xuICAgIHJldHVybiAoaWQsIHsgZ2V0TW9kdWxlSW5mbyB9KSA9PiB7XG4gICAgICAgIGlmIChpZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykgJiZcbiAgICAgICAgICAgICFpc0NTU1JlcXVlc3QoaWQpICYmXG4gICAgICAgICAgICBzdGF0aWNJbXBvcnRlZEJ5RW50cnkoaWQsIGdldE1vZHVsZUluZm8sIGNhY2hlLmNhY2hlKSkge1xuICAgICAgICAgICAgcmV0dXJuICd2ZW5kb3InO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHN0YXRpY0ltcG9ydGVkQnlFbnRyeShpZCwgZ2V0TW9kdWxlSW5mbywgY2FjaGUsIGltcG9ydFN0YWNrID0gW10pIHtcbiAgICBpZiAoY2FjaGUuaGFzKGlkKSkge1xuICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGlkKTtcbiAgICB9XG4gICAgaWYgKGltcG9ydFN0YWNrLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICAvLyBjaXJjdWxhciBkZXBzIVxuICAgICAgICBjYWNoZS5zZXQoaWQsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSBnZXRNb2R1bGVJbmZvKGlkKTtcbiAgICBpZiAoIW1vZCkge1xuICAgICAgICBjYWNoZS5zZXQoaWQsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobW9kLmlzRW50cnkpIHtcbiAgICAgICAgY2FjaGUuc2V0KGlkLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHNvbWVJbXBvcnRlcklzID0gbW9kLmltcG9ydGVycy5zb21lKChpbXBvcnRlcikgPT4gc3RhdGljSW1wb3J0ZWRCeUVudHJ5KGltcG9ydGVyLCBnZXRNb2R1bGVJbmZvLCBjYWNoZSwgaW1wb3J0U3RhY2suY29uY2F0KGlkKSkpO1xuICAgIGNhY2hlLnNldChpZCwgc29tZUltcG9ydGVySXMpO1xuICAgIHJldHVybiBzb21lSW1wb3J0ZXJJcztcbn1cbmZ1bmN0aW9uIHNwbGl0VmVuZG9yQ2h1bmtQbHVnaW4oKSB7XG4gICAgY29uc3QgY2FjaGVzID0gW107XG4gICAgZnVuY3Rpb24gY3JlYXRlU3BsaXRWZW5kb3JDaHVuayhvdXRwdXQsIGNvbmZpZykge1xuICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBTcGxpdFZlbmRvckNodW5rQ2FjaGUoKTtcbiAgICAgICAgY2FjaGVzLnB1c2goY2FjaGUpO1xuICAgICAgICBjb25zdCBidWlsZCA9IGNvbmZpZy5idWlsZCA/PyB7fTtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gb3V0cHV0Py5mb3JtYXQ7XG4gICAgICAgIGlmICghYnVpbGQuc3NyICYmICFidWlsZC5saWIgJiYgZm9ybWF0ICE9PSAndW1kJyAmJiBmb3JtYXQgIT09ICdpaWZlJykge1xuICAgICAgICAgICAgcmV0dXJuIHNwbGl0VmVuZG9yQ2h1bmsoeyBjYWNoZSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiAndml0ZTpzcGxpdC12ZW5kb3ItY2h1bmsnLFxuICAgICAgICBjb25maWcoY29uZmlnKSB7XG4gICAgICAgICAgICBsZXQgb3V0cHV0cyA9IGNvbmZpZz8uYnVpbGQ/LnJvbGx1cE9wdGlvbnM/Lm91dHB1dDtcbiAgICAgICAgICAgIGlmIChvdXRwdXRzKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0cyA9IEFycmF5LmlzQXJyYXkob3V0cHV0cykgPyBvdXRwdXRzIDogW291dHB1dHNdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgdml0ZU1hbnVhbENodW5rcyA9IGNyZWF0ZVNwbGl0VmVuZG9yQ2h1bmsob3V0cHV0LCBjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodml0ZU1hbnVhbENodW5rcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC5tYW51YWxDaHVua3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG91dHB1dC5tYW51YWxDaHVua3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlck1hbnVhbENodW5rcyA9IG91dHB1dC5tYW51YWxDaHVua3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5tYW51YWxDaHVua3MgPSAoaWQsIGFwaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJNYW51YWxDaHVua3MoaWQsIGFwaSkgPz8gdml0ZU1hbnVhbENodW5rcyhpZCwgYXBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSwgbGVhdmUgdGhlIG9iamVjdCBmb3JtIG9mIG1hbnVhbENodW5rcyB1bnRvdWNoZWQsIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuJ3Qgc2FmZWx5IHJlcGxpY2F0ZSByb2xsdXAgaGFuZGxpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQubWFudWFsQ2h1bmtzID0gdml0ZU1hbnVhbENodW5rcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVhbENodW5rczogY3JlYXRlU3BsaXRWZW5kb3JDaHVuayh7fSwgY29uZmlnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBidWlsZFN0YXJ0KCkge1xuICAgICAgICAgICAgY2FjaGVzLmZvckVhY2goKGNhY2hlKSA9PiBjYWNoZS5yZXNldCgpKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5leHBvcnQgeyBpc0NTU1JlcXVlc3QsIHNwbGl0VmVuZG9yQ2h1bmssIHNwbGl0VmVuZG9yQ2h1bmtQbHVnaW4gfTtcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcQ2hhcmxlc1xcXFxEZXNrdG9wXFxcXE15IGZpbmlzaGVkIHByb2plY3RzXFxcXE5peGl4XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJDOlxcXFxVc2Vyc1xcXFxDaGFybGVzXFxcXERlc2t0b3BcXFxcTXkgZmluaXNoZWQgcHJvamVjdHNcXFxcTml4aXhcXFxcdml0ZS5jb25maWcuanNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0M6L1VzZXJzL0NoYXJsZXMvRGVza3RvcC9NeSUyMGZpbmlzaGVkJTIwcHJvamVjdHMvTml4aXgvdml0ZS5jb25maWcuanNcIjtpbXBvcnQgeyBlc2J1aWxkT3B0aW9ucywgZGV2RXNidWlsZE9wdGlvbnMsIE5peGl4UGx1Z2luIH0gZnJvbSBcIi4vdml0ZS1wbHVnaW5cIjtcclxuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcIi4vbm9kZV9tb2R1bGVzL3ZpdGVcIjtcclxuaW1wb3J0IHBhdGhDb25maWcgZnJvbSBcInZpdGUtanNjb25maWctcGF0aHNcIjtcclxuaW1wb3J0IHsgbml4aXhQbHVnaW4gfSBmcm9tICcuL3ZpdGUtcGx1Z2luL3BhcnNlcidcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XHJcbiAgLy8gQHRzLWlnbm9yZVxyXG4gIHBsdWdpbnM6IFtwYXRoQ29uZmlnKCksIC8qIE5peGl4UGx1Z2luKHsgaG1yOiB0cnVlLCBkZXY6IHRydWUgfSkgKi8gbml4aXhQbHVnaW4oKV0sXHJcbiAgcmVzb2x2ZToge1xyXG4gICAgYWxpYXM6IHtcclxuICAgICAgZG9tOiBcIi9kb21cIixcclxuICAgIH0sXHJcbiAgfSxcclxuICBlc2J1aWxkOiB7XHJcbiAgICAuLi5lc2J1aWxkT3B0aW9ucyxcclxuICAgIC4uLmRldkVzYnVpbGRPcHRpb25zLFxyXG4gIH0sXHJcbn0pO1xyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkM6XFxcXFVzZXJzXFxcXENoYXJsZXNcXFxcRGVza3RvcFxcXFxNeSBmaW5pc2hlZCBwcm9qZWN0c1xcXFxOaXhpeFxcXFx2aXRlLXBsdWdpblwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiQzpcXFxcVXNlcnNcXFxcQ2hhcmxlc1xcXFxEZXNrdG9wXFxcXE15IGZpbmlzaGVkIHByb2plY3RzXFxcXE5peGl4XFxcXHZpdGUtcGx1Z2luXFxcXHBhcnNlci5qc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vQzovVXNlcnMvQ2hhcmxlcy9EZXNrdG9wL015JTIwZmluaXNoZWQlMjBwcm9qZWN0cy9OaXhpeC92aXRlLXBsdWdpbi9wYXJzZXIuanNcIjtpbXBvcnQgeyB0cmFuc2Zvcm0sIHRyYW5zZm9ybVN5bmMgfSBmcm9tICdAYmFiZWwvY29yZSdcclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCd2aXRlJykuUGx1Z2luIH0gUGx1Z2luXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgY3JlYXRlRmlsdGVyIH0gZnJvbSBcIkByb2xsdXAvcGx1Z2ludXRpbHNcIjtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge3tleGNsdWRlPzogc3RyaW5nW10sIGluY2x1ZGU/OiBzdHJpbmdbXX19IG9wdGlvbnNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBuaXhpeFBsdWdpbihvcHRpb25zID0ge30pIHtcclxuICBjb25zdCBmaWx0ZXIgPSBjcmVhdGVGaWx0ZXIob3B0aW9ucy5pbmNsdWRlIHx8IFtdLCBvcHRpb25zLmV4Y2x1ZGUgfHwgW10pO1xyXG4gIC8qKlxyXG4gICAqIEB0eXBlIFBsdWdpblxyXG4gICAqL1xyXG4gIGNvbnN0IHBsdWdpbiA9IHtcclxuICAgIG5hbWU6IFwibml4aXg6c3RvcmUtcmVhY3Rpdml0eVwiLFxyXG4gICAgZW5mb3JjZTogXCJwcmVcIixcclxuICAgIHRyYW5zZm9ybTogKGNvZGUsIGlkKSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAhL1xcLih0fGopc3g/JC8udGVzdChpZCkgfHxcclxuICAgICAgICBpZC5pbmNsdWRlcyhcIm5vZGVfbW9kdWxlc1wiKSB8fFxyXG4gICAgICAgIGlkLmluY2x1ZGVzKFwiP3dvcmtlclwiKSB8fFxyXG4gICAgICAgICFmaWx0ZXIoaWQpXHJcbiAgICAgIClcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIGNvbnN0IHthc3R9ID0gdHJhbnNmb3JtU3luYyhjb2RlLCB7YXN0OiB0cnVlLCBwYXJzZXJPcHRzOiB7fX0pIHx8IHt9XHJcbiAgICAgIGNvbnNvbGUubG9nKGFzdCk7XHJcbiAgICB9LFxyXG4gICAgXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIFtwbHVnaW5dO1xyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7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SyxHQUFHLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsS0FBSyxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxNQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxPQUFPLEdBQUcsTUFBTSxJQUFJLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxNQUFNLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsUUFBUSxHQUFHO0FBRzNoQyxJQUFJLDZCQUE2QixDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsS0FBSyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsTUFBTSxJQUFJLEdBQUcsR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxJQUFJ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T2hCLGVBQVcsVUFBVTtBQUNyQixvQkFBZ0IsV0FBVztBQXFJM0IsSUFBSSxlQUFlO0FBQUEsTUFDbEIsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1As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QTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFD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QUFHO0FBQUEsSUFDekM7QUFFQSxLQUFNLEVBQUUsV0FBVztBQWNuQixJQUFNLGVBQWU7QUFBQSxNQUNuQjtBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBO0FBQUEsTUFDN0M7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQTtBQUFBLE1BQzdDO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUE7QUFBQSxNQUM3QztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBO0FBQUEsTUFDN0M7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQSxNQUFHO0FBQUEsTUFBRztBQUFBLE1BQUc7QUFBQTtBQUFBLE1BQzdDO0FBQUEsTUFB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QUFBLElBQ0gsR0FBRztBQUFBLEVBQ0w7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogWyJyZWFkRmlsZVN5bmMiLCAiVkVSU0lPTiIsICJhIiwgInJlYWxwYXRoU3luYyIsICJwYWQiLCAiaW5oZXJpdHMiLCAic2VsZiIsICJvcHRpb25zIiwgInBhdHRlcm4iLCAiTWluaW1hdGNoIiwgImxpdGVyYWwiLCAibSIsICJzbGFzaCIsICJwYXRoIiwgIm1pbmltYXRjaCIsICJhc3NlcnQiLCAiaXNBYnNvbHV0ZSIsICJjb21tb24iLCAic2V0b3B0cyIsICJvd25Qcm9wIiwgImNoaWxkcmVuSWdub3JlZCIsICJpc0lnbm9yZWQiLCAic2V0IiwgInJlYWQiLCAibHN0YXQiLCAiZXJyb3IiLCAic3RhdCIsICJjYiIsICJuYW1lIiwgImFycmF5IiwgImluZmxpZ2h0IiwgIm9uY2UiLCAiZXh0ZW5kIiwgInN5bmMiLCAiZm91bmQiLCAiZXIiLCAidmFsdWUiLCAiY3VycmVudCIsICJwYXJzZSIsICJtcyIsICJlbnYiLCAiZGVidWciLCAiZm9ybWF0IiwgImZvcm1hdHRlciIsICJleHBvcnRzIiwgImxvYWQiLCAid2FybmVkIiwgInR0eSIsICJ1dGlsIiwgImluaXQiLCAicmVxdWlyZSIsICJ1c2VDb2xvcnMiLCAidXJsIiwgInNyYyIsICJtaW4iLCAib2Zmc2V0IiwgImFzeW5jIiwgIm5vZGUiLCAiZW50cnkiLCAiemVyb3MiLCAibWF4IiwgInN0cmluZyIsICJwYXR0ZXJucyIsICJiYXNlbmFtZSIsICJzdHJlYW0iLCAic2V0dGluZ3MiLCAidGFza3MiLCAiaWdub3JlIiwgImJhc2UiLCAiRGlyZW50RnJvbVN0YXRzIiwgImdldCIsICJwdXNoIiwgInJlc3VtZSIsICJxdWV1ZSIsICJyZXNvbHZlIiwgImZpbHRlciIsICJwcm92aWRlciIsICJyZWYiLCAiZGF0YSIsICJyZXMiLCAibWFwIiwgInNjaGVtYSIsICJtb2RlIiwgImkiLCAiZW5kIiwgIl9hIiwgInN0cmluZ2lmeSIsICJjb21tZW50IiwgInN0ciIsICJzZXEiLCAicGFpcnMiLCAibiIsICJjb21tYSIsICJjb21wb3NlTm9kZSIsICJjb21wb3NlRW1wdHlOb2RlIiwgInNlcCIsICJpc01hcCIsICJDTiIsICJmaXJzdCIsICJvayIsICJ0YWciLCAiY3N0IiwgIlBhcnNlciIsICJ2ZXJzaW9uIiwgIndyYXAiLCAicmVsYXRpdmUiLCAibGVzcyIsICJyb290RmlsZSIsICJyZXNvbHZlcnMiLCAiYWxpYXMiLCAiZmQiLCAiZnMiLCAibmV0IiwgImVzY2FwZSIsICJmbiIsICJsaXN0ZW5lciIsICJyZXEiLCAic3RhdHVzZXMiLCAiY29kZXMiLCAic3RhdHVzIiwgImhhbmRsZSIsICJzIiwgImlzR2xvYiIsICJleHRlbnNpb25zIiwgImtleSIsICJsb2NhdGlvbiIsICJiaW5hcnkiLCAiaXNleGUiLCAiY3AiLCAiY29uZmlnIiwgIl9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwiLCAiREVGQVVMVF9FWFRFTlNJT05TIiwgImlzRXh0Z2xvYiIsICJTZXR0aW5ncyIsICJSZWFkZXIiLCAicmVhbHBhdGgiLCAiZ2xvYlBhcmVudCIsICJOb2RlRnNIYW5kbGVyIiwgIkZzRXZlbnRzSGFuZGxlciIsICJMaW1pdGVyIiwgIlJlY2VpdmVyIiwgIlNlbmRlciIsICJvcGVuIiwgImNsb3NlIiwgIm5leHRJbmRleCIsICJjaGFycyIsICJ3aW4zMiIsICJhcHBlbmQiLCAiYnJhY2VzIiwgImFkdmFuY2UiLCAiRE9UX0xJVEVSQUwiLCAiUExVU19MSVRFUkFMIiwgIlNMQVNIX0xJVEVSQUwiLCAiT05FX0NIQVIiLCAiRE9UU19TTEFTSCIsICJOT19ET1QiLCAiTk9fRE9UX1NMQVNIIiwgIk5PX0RPVFNfU0xBU0giLCAiUU1BUksiLCAiUU1BUktfTk9fRE9UIiwgIlNUQVIiLCAiU1RBUlRfQU5DSE9SIiwgIm9wdHMiLCAic3RhciIsICJyZXN0IiwgInBvc2l4IiwgImVzY2FwZWQiLCAiTk9fRE9UUyIsICJzb3VyY2UiLCAic3RhdGUiLCAibWF0Y2hlciIsICJlcnIiLCAicGFydGlhbCIsICJVcmxUeXBlIiwgInNlZyIsICJpbmRleCIsICJleHQiLCAiQSIsICJUb2tlblR5cGUiLCAiUG9zaXRpb24iLCAiU291cmNlTG9jYXRpb24iLCAicGx1Z2lucyIsICJEZXN0cnVjdHVyaW5nRXJyb3JzIiwgIm5vZGUkMSIsICJUb2tDb250ZXh0IiwgIlNjb3BlIiwgIk5vZGUiLCAiUmVnRXhwVmFsaWRhdGlvblN0YXRlIiwgIlRva2VuIiwgImlzUGFkZGVkIiwgImRlcHRoIiwgIm9zIiwgIkZhc3RHbG9iIiwgImlzRHluYW1pY1BhdHRlcm4iLCAiZ2V0T3B0aW9ucyIsICJ0cmFuc2Zvcm0iLCAiaXNFbXB0eSIsICJ5YW1sIiwgIm9tYXAiLCAiY2giLCAic3RhcnQiLCAiaW1wb3J0ZXIiLCAidmFyeSIsICJpc1N0cmluZyIsICJzbGljZSIsICJ0ZXN0U3RyaW5nIiwgInJldHVybkluZGV4IiwgInBsYXRmb3JtIiwgIm1haW4iLCAicmF3RW1pdHRlciIsICJkaXJuYW1lIiwgIm5ld1N0YXRzIiwgImF0IiwgInN0YXRzIiwgIm1haiIsICJwcCIsICJwcm9taXNlIiwgInRpbWVvdXQiLCAibm93IiwgImJ1ZmZlclV0aWwiLCAiaXNWYWxpZFVURjgiLCAicmVjZWl2ZXIiLCAiZXZlbnRzIiwgInJlcXVpcmVkIiwgImh0dHAiLCAiaHR0cHMiLCAicHJveHlSZXEiLCAicHJveHlFcnJvciIsICJYSGVhZGVycyIsICJoZWFkIiwgIlByb3h5U2VydmVyIiwgInZlcnNpb24iLCAiVkVSU0lPTiIsICJ0cmFuc2Zvcm0iLCAiY3JlYXRlRmlsdGVyIiwgIm9wdGlvbnMiLCAiZmlsdGVyIiwgImNyZWF0ZUZpbHRlciJdCn0K