mirror of
https://github.com/logos-messaging/lab.waku.org.git
synced 2026-01-08 16:53:08 +00:00
45 lines
119 KiB
JavaScript
45 lines
119 KiB
JavaScript
"use strict";
|
||
/*
|
||
* ATTENTION: An "eval-source-map" devtool has been used.
|
||
* This devtool is neither made for production nor for readable output files.
|
||
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
||
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
||
* or disable the default devtool with "devtool: false".
|
||
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
||
*/
|
||
exports.id = "vendor-chunks/unified";
|
||
exports.ids = ["vendor-chunks/unified"];
|
||
exports.modules = {
|
||
|
||
/***/ "(ssr)/./node_modules/unified/lib/callable-instance.js":
|
||
/*!*******************************************************!*\
|
||
!*** ./node_modules/unified/lib/callable-instance.js ***!
|
||
\*******************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CallableInstance: () => (/* binding */ CallableInstance)\n/* harmony export */ });\nconst CallableInstance = /**\n * @type {new <Parameters extends Array<unknown>, Result>(property: string | symbol) => (...parameters: Parameters) => Result}\n */ /** @type {unknown} */ /**\n * @this {Function}\n * @param {string | symbol} property\n * @returns {(...parameters: Array<unknown>) => unknown}\n */ function(property) {\n const self = this;\n const constr = self.constructor;\n const proto = /** @type {Record<string | symbol, Function>} */ // Prototypes do exist.\n // type-coverage:ignore-next-line\n constr.prototype;\n const func = proto[property];\n /** @type {(...parameters: Array<unknown>) => unknown} */ const apply = function() {\n return func.apply(apply, arguments);\n };\n Object.setPrototypeOf(apply, proto);\n const names = Object.getOwnPropertyNames(func);\n for (const p of names){\n const descriptor = Object.getOwnPropertyDescriptor(func, p);\n if (descriptor) Object.defineProperty(apply, p, descriptor);\n }\n return apply;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvdW5pZmllZC9saWIvY2FsbGFibGUtaW5zdGFuY2UuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFPLE1BQU1BLG1CQUNYOztHQUVDLEdBRUMsb0JBQW9CLEdBRWxCOzs7O09BSUMsR0FDRCxTQUFVQyxRQUFRO0lBQ2hCLE1BQU1DLE9BQU8sSUFBSTtJQUNqQixNQUFNQyxTQUFTRCxLQUFLRSxXQUFXO0lBQy9CLE1BQU1DLFFBQVEsOENBQThDLEdBQzFELHVCQUF1QjtJQUN2QixpQ0FBaUM7SUFDakNGLE9BQU9HLFNBQVM7SUFFbEIsTUFBTUMsT0FBT0YsS0FBSyxDQUFDSixTQUFTO0lBQzVCLHVEQUF1RCxHQUN2RCxNQUFNTyxRQUFRO1FBQ1osT0FBT0QsS0FBS0MsS0FBSyxDQUFDQSxPQUFPQztJQUMzQjtJQUVBQyxPQUFPQyxjQUFjLENBQUNILE9BQU9IO0lBRTdCLE1BQU1PLFFBQVFGLE9BQU9HLG1CQUFtQixDQUFDTjtJQUV6QyxLQUFLLE1BQU1PLEtBQUtGLE1BQU87UUFDckIsTUFBTUcsYUFBYUwsT0FBT00sd0JBQXdCLENBQUNULE1BQU1PO1FBQ3pELElBQUlDLFlBQVlMLE9BQU9PLGNBQWMsQ0FBQ1QsT0FBT00sR0FBR0M7SUFDbEQ7SUFFQSxPQUFPUDtBQUNULEVBRUgiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbHVzaC1ub3Rlcy8uL25vZGVfbW9kdWxlcy91bmlmaWVkL2xpYi9jYWxsYWJsZS1pbnN0YW5jZS5qcz80ZTljIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBDYWxsYWJsZUluc3RhbmNlID1cbiAgLyoqXG4gICAqIEB0eXBlIHtuZXcgPFBhcmFtZXRlcnMgZXh0ZW5kcyBBcnJheTx1bmtub3duPiwgUmVzdWx0Pihwcm9wZXJ0eTogc3RyaW5nIHwgc3ltYm9sKSA9PiAoLi4ucGFyYW1ldGVyczogUGFyYW1ldGVycykgPT4gUmVzdWx0fVxuICAgKi9cbiAgKFxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICAoXG4gICAgICAvKipcbiAgICAgICAqIEB0aGlzIHtGdW5jdGlvbn1cbiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sfSBwcm9wZXJ0eVxuICAgICAgICogQHJldHVybnMgeyguLi5wYXJhbWV0ZXJzOiBBcnJheTx1bmtub3duPikgPT4gdW5rbm93bn1cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgICAgIGNvbnN0IGNvbnN0ciA9IHNlbGYuY29uc3RydWN0b3JcbiAgICAgICAgY29uc3QgcHJvdG8gPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIEZ1bmN0aW9uPn0gKi8gKFxuICAgICAgICAgIC8vIFByb3RvdHlwZXMgZG8gZXhpc3QuXG4gICAgICAgICAgLy8gdHlwZS1jb3ZlcmFnZTppZ25vcmUtbmV4dC1saW5lXG4gICAgICAgICAgY29uc3RyLnByb3RvdHlwZVxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGZ1bmMgPSBwcm90b1twcm9wZXJ0eV1cbiAgICAgICAgLyoqIEB0eXBlIHsoLi4ucGFyYW1ldGVyczogQXJyYXk8dW5rbm93bj4pID0+IHVua25vd259ICovXG4gICAgICAgIGNvbnN0IGFwcGx5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGFwcGx5LCBhcmd1bWVudHMpXG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoYXBwbHksIHByb3RvKVxuXG4gICAgICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZnVuYylcblxuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgbmFtZXMpIHtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmdW5jLCBwKVxuICAgICAgICAgIGlmIChkZXNjcmlwdG9yKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwbHksIHAsIGRlc2NyaXB0b3IpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwbHlcbiAgICAgIH1cbiAgICApXG4gIClcbiJdLCJuYW1lcyI6WyJDYWxsYWJsZUluc3RhbmNlIiwicHJvcGVydHkiLCJzZWxmIiwiY29uc3RyIiwiY29uc3RydWN0b3IiLCJwcm90byIsInByb3RvdHlwZSIsImZ1bmMiLCJhcHBseSIsImFyZ3VtZW50cyIsIk9iamVjdCIsInNldFByb3RvdHlwZU9mIiwibmFtZXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicCIsImRlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJkZWZpbmVQcm9wZXJ0eSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/unified/lib/callable-instance.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/unified/lib/index.js":
|
||
/*!*******************************************!*\
|
||
!*** ./node_modules/unified/lib/index.js ***!
|
||
\*******************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Processor: () => (/* binding */ Processor),\n/* harmony export */ unified: () => (/* binding */ unified)\n/* harmony export */ });\n/* harmony import */ var bail__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! bail */ \"(ssr)/./node_modules/bail/index.js\");\n/* harmony import */ var extend__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! extend */ \"(ssr)/./node_modules/extend/index.js\");\n/* harmony import */ var devlop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! devlop */ \"(ssr)/./node_modules/devlop/lib/development.js\");\n/* harmony import */ var is_plain_obj__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! is-plain-obj */ \"(ssr)/./node_modules/unified/node_modules/is-plain-obj/index.js\");\n/* harmony import */ var trough__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! trough */ \"(ssr)/./node_modules/trough/index.js\");\n/* harmony import */ var vfile__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vfile */ \"(ssr)/./node_modules/vfile/lib/index.js\");\n/* harmony import */ var _callable_instance_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./callable-instance.js */ \"(ssr)/./node_modules/unified/lib/callable-instance.js\");\n/**\n * @typedef {import('trough').Pipeline} Pipeline\n *\n * @typedef {import('unist').Node} Node\n *\n * @typedef {import('vfile').Compatible} Compatible\n * @typedef {import('vfile').Value} Value\n *\n * @typedef {import('../index.js').CompileResultMap} CompileResultMap\n * @typedef {import('../index.js').Data} Data\n * @typedef {import('../index.js').Settings} Settings\n */ /**\n * @typedef {CompileResultMap[keyof CompileResultMap]} CompileResults\n * Acceptable results from compilers.\n *\n * To register custom results, add them to\n * {@link CompileResultMap `CompileResultMap`}.\n */ /**\n * @template {Node} [Tree=Node]\n * The node that the compiler receives (default: `Node`).\n * @template {CompileResults} [Result=CompileResults]\n * The thing that the compiler yields (default: `CompileResults`).\n * @callback Compiler\n * A **compiler** handles the compiling of a syntax tree to something else\n * (in most cases, text) (TypeScript type).\n *\n * It is used in the stringify phase and called with a {@link Node `Node`}\n * and {@link VFile `VFile`} representation of the document to compile.\n * It should return the textual representation of the given tree (typically\n * `string`).\n *\n * > 👉 **Note**: unified typically compiles by serializing: most compilers\n * > return `string` (or `Uint8Array`).\n * > Some compilers, such as the one configured with\n * > [`rehype-react`][rehype-react], return other values (in this case, a\n * > React tree).\n * > If you’re using a compiler that doesn’t serialize, expect different\n * > result values.\n * >\n * > To register custom results in TypeScript, add them to\n * > {@link CompileResultMap `CompileResultMap`}.\n *\n * [rehype-react]: https://github.com/rehypejs/rehype-react\n * @param {Tree} tree\n * Tree to compile.\n * @param {VFile} file\n * File associated with `tree`.\n * @returns {Result}\n * New content: compiled text (`string` or `Uint8Array`, for `file.value`) or\n * something else (for `file.result`).\n */ /**\n * @template {Node} [Tree=Node]\n * The node that the parser yields (default: `Node`)\n * @callback Parser\n * A **parser** handles the parsing of text to a syntax tree.\n *\n * It is used in the parse phase and is called with a `string` and\n * {@link VFile `VFile`} of the document to parse.\n * It must return the syntax tree representation of the given file\n * ({@link Node `Node`}).\n * @param {string} document\n * Document to parse.\n * @param {VFile} file\n * File associated with `document`.\n * @returns {Tree}\n * Node representing the given file.\n */ /**\n * @typedef {(\n * Plugin<Array<any>, any, any> |\n * PluginTuple<Array<any>, any, any> |\n * Preset\n * )} Pluggable\n * Union of the different ways to add plugins and settings.\n */ /**\n * @typedef {Array<Pluggable>} PluggableList\n * List of plugins and presets.\n */ // Note: we can’t use `callback` yet as it messes up `this`:\n// <https://github.com/microsoft/TypeScript/issues/55197>.\n/**\n * @template {Array<unknown>} [PluginParameters=[]]\n * Arguments passed to the plugin (default: `[]`, the empty tuple).\n * @template {Node | string | undefined} [Input=Node]\n * Value that is expected as input (default: `Node`).\n *\n * * If the plugin returns a {@link Transformer `Transformer`}, this\n * should be the node it expects.\n * * If the plugin sets a {@link Parser `Parser`}, this should be\n * `string`.\n * * If the plugin sets a {@link Compiler `Compiler`}, this should be the\n * node it expects.\n * @template [Output=Input]\n * Value that is yielded as output (default: `Input`).\n *\n * * If the plugin returns a {@link Transformer `Transformer`}, this\n * should be the node that that yields.\n * * If the plugin sets a {@link Parser `Parser`}, this should be the\n * node that it yields.\n * * If the plugin sets a {@link Compiler `Compiler`}, this should be\n * result it yields.\n * @typedef {(\n * (this: Processor, ...parameters: PluginParameters) =>\n * Input extends string ? // Parser.\n * Output extends Node | undefined ? undefined | void : never :\n * Output extends CompileResults ? // Compiler.\n * Input extends Node | undefined ? undefined | void : never :\n * Transformer<\n * Input extends Node ? Input : Node,\n * Output extends Node ? Output : Node\n * > | undefined | void\n * )} Plugin\n * Single plugin.\n *\n * Plugins configure the processors they are applied on in the following\n * ways:\n *\n * * they change the processor, such as the parser, the compiler, or by\n * configuring data\n * * they specify how to handle trees and files\n *\n * In practice, they are functions that can receive options and configure the\n * processor (`this`).\n *\n * > 👉 **Note**: plugins are called when the processor is *frozen*, not when\n * > they are applied.\n */ /**\n * Tuple of a plugin and its configuration.\n *\n * The first item is a plugin, the rest are its parameters.\n *\n * @template {Array<unknown>} [TupleParameters=[]]\n * Arguments passed to the plugin (default: `[]`, the empty tuple).\n * @template {Node | string | undefined} [Input=undefined]\n * Value that is expected as input (optional).\n *\n * * If the plugin returns a {@link Transformer `Transformer`}, this\n * should be the node it expects.\n * * If the plugin sets a {@link Parser `Parser`}, this should be\n * `string`.\n * * If the plugin sets a {@link Compiler `Compiler`}, this should be the\n * node it expects.\n * @template [Output=undefined] (optional).\n * Value that is yielded as output.\n *\n * * If the plugin returns a {@link Transformer `Transformer`}, this\n * should be the node that that yields.\n * * If the plugin sets a {@link Parser `Parser`}, this should be the\n * node that it yields.\n * * If the plugin sets a {@link Compiler `Compiler`}, this should be\n * result it yields.\n * @typedef {(\n * [\n * plugin: Plugin<TupleParameters, Input, Output>,\n * ...parameters: TupleParameters\n * ]\n * )} PluginTuple\n */ /**\n * @typedef Preset\n * Sharable configuration.\n *\n * They can contain plugins and settings.\n * @property {PluggableList | undefined} [plugins]\n * List of plugins and presets (optional).\n * @property {Settings | undefined} [settings]\n * Shared settings for parsers and compilers (optional).\n */ /**\n * @template {VFile} [File=VFile]\n * The file that the callback receives (default: `VFile`).\n * @callback ProcessCallback\n * Callback called when the process is done.\n *\n * Called with either an error or a result.\n * @param {Error | undefined} [error]\n * Fatal error (optional).\n * @param {File | undefined} [file]\n * Processed file (optional).\n * @returns {undefined}\n * Nothing.\n */ /**\n * @template {Node} [Tree=Node]\n * The tree that the callback receives (default: `Node`).\n * @callback RunCallback\n * Callback called when transformers are done.\n *\n * Called with either an error or results.\n * @param {Error | undefined} [error]\n * Fatal error (optional).\n * @param {Tree | undefined} [tree]\n * Transformed tree (optional).\n * @param {VFile | undefined} [file]\n * File (optional).\n * @returns {undefined}\n * Nothing.\n */ /**\n * @template {Node} [Output=Node]\n * Node type that the transformer yields (default: `Node`).\n * @callback TransformCallback\n * Callback passed to transforms.\n *\n * If the signature of a `transformer` accepts a third argument, the\n * transformer may perform asynchronous operations, and must call it.\n * @param {Error | undefined} [error]\n * Fatal error to stop the process (optional).\n * @param {Output | undefined} [tree]\n * New, changed, tree (optional).\n * @param {VFile | undefined} [file]\n * New, changed, file (optional).\n * @returns {undefined}\n * Nothing.\n */ /**\n * @template {Node} [Input=Node]\n * Node type that the transformer expects (default: `Node`).\n * @template {Node} [Output=Input]\n * Node type that the transformer yields (default: `Input`).\n * @callback Transformer\n * Transformers handle syntax trees and files.\n *\n * They are functions that are called each time a syntax tree and file are\n * passed through the run phase.\n * When an error occurs in them (either because it’s thrown, returned,\n * rejected, or passed to `next`), the process stops.\n *\n * The run phase is handled by [`trough`][trough], see its documentation for\n * the exact semantics of these functions.\n *\n * > 👉 **Note**: you should likely ignore `next`: don’t accept it.\n * > it supports callback-style async work.\n * > But promises are likely easier to reason about.\n *\n * [trough]: https://github.com/wooorm/trough#function-fninput-next\n * @param {Input} tree\n * Tree to handle.\n * @param {VFile} file\n * File to handle.\n * @param {TransformCallback<Output>} next\n * Callback.\n * @returns {(\n * Promise<Output | undefined | void> |\n * Promise<never> | // For some reason this is needed separately.\n * Output |\n * Error |\n * undefined |\n * void\n * )}\n * If you accept `next`, nothing.\n * Otherwise:\n *\n * * `Error` — fatal error to stop the process\n * * `Promise<undefined>` or `undefined` — the next transformer keeps using\n * same tree\n * * `Promise<Node>` or `Node` — new, changed, tree\n */ /**\n * @template {Node | undefined} ParseTree\n * Output of `parse`.\n * @template {Node | undefined} HeadTree\n * Input for `run`.\n * @template {Node | undefined} TailTree\n * Output for `run`.\n * @template {Node | undefined} CompileTree\n * Input of `stringify`.\n * @template {CompileResults | undefined} CompileResult\n * Output of `stringify`.\n * @template {Node | string | undefined} Input\n * Input of plugin.\n * @template Output\n * Output of plugin (optional).\n * @typedef {(\n * Input extends string\n * ? Output extends Node | undefined\n * ? // Parser.\n * Processor<\n * Output extends undefined ? ParseTree : Output,\n * HeadTree,\n * TailTree,\n * CompileTree,\n * CompileResult\n * >\n * : // Unknown.\n * Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>\n * : Output extends CompileResults\n * ? Input extends Node | undefined\n * ? // Compiler.\n * Processor<\n * ParseTree,\n * HeadTree,\n * TailTree,\n * Input extends undefined ? CompileTree : Input,\n * Output extends undefined ? CompileResult : Output\n * >\n * : // Unknown.\n * Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>\n * : Input extends Node | undefined\n * ? Output extends Node | undefined\n * ? // Transform.\n * Processor<\n * ParseTree,\n * HeadTree extends undefined ? Input : HeadTree,\n * Output extends undefined ? TailTree : Output,\n * CompileTree,\n * CompileResult\n * >\n * : // Unknown.\n * Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>\n * : // Unknown.\n * Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>\n * )} UsePlugin\n * Create a processor based on the input/output of a {@link Plugin plugin}.\n */ /**\n * @template {CompileResults | undefined} Result\n * Node type that the transformer yields.\n * @typedef {(\n * Result extends Value | undefined ?\n * VFile :\n * VFile & {result: Result}\n * )} VFileWithOutput\n * Type to generate a {@link VFile `VFile`} corresponding to a compiler result.\n *\n * If a result that is not acceptable on a `VFile` is used, that will\n * be stored on the `result` field of {@link VFile `VFile`}.\n */ \n\n\n\n\n\n\n// To do: next major: drop `Compiler`, `Parser`: prefer lowercase.\n// To do: we could start yielding `never` in TS when a parser is missing and\n// `parse` is called.\n// Currently, we allow directly setting `processor.parser`, which is untyped.\nconst own = {}.hasOwnProperty;\n/**\n * @template {Node | undefined} [ParseTree=undefined]\n * Output of `parse` (optional).\n * @template {Node | undefined} [HeadTree=undefined]\n * Input for `run` (optional).\n * @template {Node | undefined} [TailTree=undefined]\n * Output for `run` (optional).\n * @template {Node | undefined} [CompileTree=undefined]\n * Input of `stringify` (optional).\n * @template {CompileResults | undefined} [CompileResult=undefined]\n * Output of `stringify` (optional).\n * @extends {CallableInstance<[], Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>>}\n */ class Processor extends _callable_instance_js__WEBPACK_IMPORTED_MODULE_2__.CallableInstance {\n /**\n * Create a processor.\n */ constructor(){\n // If `Processor()` is called (w/o new), `copy` is called instead.\n super(\"copy\");\n /**\n * Compiler to use (deprecated).\n *\n * @deprecated\n * Use `compiler` instead.\n * @type {(\n * Compiler<\n * CompileTree extends undefined ? Node : CompileTree,\n * CompileResult extends undefined ? CompileResults : CompileResult\n * > |\n * undefined\n * )}\n */ this.Compiler = undefined;\n /**\n * Parser to use (deprecated).\n *\n * @deprecated\n * Use `parser` instead.\n * @type {(\n * Parser<ParseTree extends undefined ? Node : ParseTree> |\n * undefined\n * )}\n */ this.Parser = undefined;\n // Note: the following fields are considered private.\n // However, they are needed for tests, and TSC generates an untyped\n // `private freezeIndex` field for, which trips `type-coverage` up.\n // Instead, we use `@deprecated` to visualize that they shouldn’t be used.\n /**\n * Internal list of configured plugins.\n *\n * @deprecated\n * This is a private internal property and should not be used.\n * @type {Array<PluginTuple<Array<unknown>>>}\n */ this.attachers = [];\n /**\n * Compiler to use.\n *\n * @type {(\n * Compiler<\n * CompileTree extends undefined ? Node : CompileTree,\n * CompileResult extends undefined ? CompileResults : CompileResult\n * > |\n * undefined\n * )}\n */ this.compiler = undefined;\n /**\n * Internal state to track where we are while freezing.\n *\n * @deprecated\n * This is a private internal property and should not be used.\n * @type {number}\n */ this.freezeIndex = -1;\n /**\n * Internal state to track whether we’re frozen.\n *\n * @deprecated\n * This is a private internal property and should not be used.\n * @type {boolean | undefined}\n */ this.frozen = undefined;\n /**\n * Internal state.\n *\n * @deprecated\n * This is a private internal property and should not be used.\n * @type {Data}\n */ this.namespace = {};\n /**\n * Parser to use.\n *\n * @type {(\n * Parser<ParseTree extends undefined ? Node : ParseTree> |\n * undefined\n * )}\n */ this.parser = undefined;\n /**\n * Internal list of configured transformers.\n *\n * @deprecated\n * This is a private internal property and should not be used.\n * @type {Pipeline}\n */ this.transformers = (0,trough__WEBPACK_IMPORTED_MODULE_3__.trough)();\n }\n /**\n * Copy a processor.\n *\n * @deprecated\n * This is a private internal method and should not be used.\n * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n * New *unfrozen* processor ({@link Processor `Processor`}) that is\n * configured to work the same as its ancestor.\n * When the descendant processor is configured in the future it does not\n * affect the ancestral processor.\n */ copy() {\n // Cast as the type parameters will be the same after attaching.\n const destination = /** @type {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>} */ new Processor();\n let index = -1;\n while(++index < this.attachers.length){\n const attacher = this.attachers[index];\n destination.use(...attacher);\n }\n destination.data(extend__WEBPACK_IMPORTED_MODULE_0__(true, {}, this.namespace));\n return destination;\n }\n /**\n * Configure the processor with info available to all plugins.\n * Information is stored in an object.\n *\n * Typically, options can be given to a specific plugin, but sometimes it\n * makes sense to have information shared with several plugins.\n * For example, a list of HTML elements that are self-closing, which is\n * needed during all phases.\n *\n * > 👉 **Note**: setting information cannot occur on *frozen* processors.\n * > Call the processor first to create a new unfrozen processor.\n *\n * > 👉 **Note**: to register custom data in TypeScript, augment the\n * > {@link Data `Data`} interface.\n *\n * @example\n * This example show how to get and set info:\n *\n * ```js\n * import {unified} from 'unified'\n *\n * const processor = unified().data('alpha', 'bravo')\n *\n * processor.data('alpha') // => 'bravo'\n *\n * processor.data() // => {alpha: 'bravo'}\n *\n * processor.data({charlie: 'delta'})\n *\n * processor.data() // => {charlie: 'delta'}\n * ```\n *\n * @template {keyof Data} Key\n *\n * @overload\n * @returns {Data}\n *\n * @overload\n * @param {Data} dataset\n * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n *\n * @overload\n * @param {Key} key\n * @returns {Data[Key]}\n *\n * @overload\n * @param {Key} key\n * @param {Data[Key]} value\n * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n *\n * @param {Data | Key} [key]\n * Key to get or set, or entire dataset to set, or nothing to get the\n * entire dataset (optional).\n * @param {Data[Key]} [value]\n * Value to set (optional).\n * @returns {unknown}\n * The current processor when setting, the value at `key` when getting, or\n * the entire dataset when getting without key.\n */ data(key, value) {\n if (typeof key === \"string\") {\n // Set `key`.\n if (arguments.length === 2) {\n assertUnfrozen(\"data\", this.frozen);\n this.namespace[key] = value;\n return this;\n }\n // Get `key`.\n return own.call(this.namespace, key) && this.namespace[key] || undefined;\n }\n // Set space.\n if (key) {\n assertUnfrozen(\"data\", this.frozen);\n this.namespace = key;\n return this;\n }\n // Get space.\n return this.namespace;\n }\n /**\n * Freeze a processor.\n *\n * Frozen processors are meant to be extended and not to be configured\n * directly.\n *\n * When a processor is frozen it cannot be unfrozen.\n * New processors working the same way can be created by calling the\n * processor.\n *\n * It’s possible to freeze processors explicitly by calling `.freeze()`.\n * Processors freeze automatically when `.parse()`, `.run()`, `.runSync()`,\n * `.stringify()`, `.process()`, or `.processSync()` are called.\n *\n * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n * The current processor.\n */ freeze() {\n if (this.frozen) {\n return this;\n }\n // Cast so that we can type plugins easier.\n // Plugins are supposed to be usable on different processors, not just on\n // this exact processor.\n const self = /** @type {Processor} */ /** @type {unknown} */ this;\n while(++this.freezeIndex < this.attachers.length){\n const [attacher, ...options] = this.attachers[this.freezeIndex];\n if (options[0] === false) {\n continue;\n }\n if (options[0] === true) {\n options[0] = undefined;\n }\n const transformer = attacher.call(self, ...options);\n if (typeof transformer === \"function\") {\n this.transformers.use(transformer);\n }\n }\n this.frozen = true;\n this.freezeIndex = Number.POSITIVE_INFINITY;\n return this;\n }\n /**\n * Parse text to a syntax tree.\n *\n * > 👉 **Note**: `parse` freezes the processor if not already *frozen*.\n *\n * > 👉 **Note**: `parse` performs the parse phase, not the run phase or other\n * > phases.\n *\n * @param {Compatible | undefined} [file]\n * file to parse (optional); typically `string` or `VFile`; any value\n * accepted as `x` in `new VFile(x)`.\n * @returns {ParseTree extends undefined ? Node : ParseTree}\n * Syntax tree representing `file`.\n */ parse(file) {\n this.freeze();\n const realFile = vfile(file);\n const parser = this.parser || this.Parser;\n assertParser(\"parse\", parser);\n return parser(String(realFile), realFile);\n }\n /**\n * Process the given file as configured on the processor.\n *\n * > 👉 **Note**: `process` freezes the processor if not already *frozen*.\n *\n * > 👉 **Note**: `process` performs the parse, run, and stringify phases.\n *\n * @overload\n * @param {Compatible | undefined} file\n * @param {ProcessCallback<VFileWithOutput<CompileResult>>} done\n * @returns {undefined}\n *\n * @overload\n * @param {Compatible | undefined} [file]\n * @returns {Promise<VFileWithOutput<CompileResult>>}\n *\n * @param {Compatible | undefined} [file]\n * File (optional); typically `string` or `VFile`]; any value accepted as\n * `x` in `new VFile(x)`.\n * @param {ProcessCallback<VFileWithOutput<CompileResult>> | undefined} [done]\n * Callback (optional).\n * @returns {Promise<VFile> | undefined}\n * Nothing if `done` is given.\n * Otherwise a promise, rejected with a fatal error or resolved with the\n * processed file.\n *\n * The parsed, transformed, and compiled value is available at\n * `file.value` (see note).\n *\n * > 👉 **Note**: unified typically compiles by serializing: most\n * > compilers return `string` (or `Uint8Array`).\n * > Some compilers, such as the one configured with\n * > [`rehype-react`][rehype-react], return other values (in this case, a\n * > React tree).\n * > If you’re using a compiler that doesn’t serialize, expect different\n * > result values.\n * >\n * > To register custom results in TypeScript, add them to\n * > {@link CompileResultMap `CompileResultMap`}.\n *\n * [rehype-react]: https://github.com/rehypejs/rehype-react\n */ process(file, done) {\n const self = this;\n this.freeze();\n assertParser(\"process\", this.parser || this.Parser);\n assertCompiler(\"process\", this.compiler || this.Compiler);\n return done ? executor(undefined, done) : new Promise(executor);\n // Note: `void`s needed for TS.\n /**\n * @param {((file: VFileWithOutput<CompileResult>) => undefined | void) | undefined} resolve\n * @param {(error: Error | undefined) => undefined | void} reject\n * @returns {undefined}\n */ function executor(resolve, reject) {\n const realFile = vfile(file);\n // Assume `ParseTree` (the result of the parser) matches `HeadTree` (the\n // input of the first transform).\n const parseTree = /** @type {HeadTree extends undefined ? Node : HeadTree} */ /** @type {unknown} */ self.parse(realFile);\n self.run(parseTree, realFile, function(error, tree, file) {\n if (error || !tree || !file) {\n return realDone(error);\n }\n // Assume `TailTree` (the output of the last transform) matches\n // `CompileTree` (the input of the compiler).\n const compileTree = /** @type {CompileTree extends undefined ? Node : CompileTree} */ /** @type {unknown} */ tree;\n const compileResult = self.stringify(compileTree, file);\n if (looksLikeAValue(compileResult)) {\n file.value = compileResult;\n } else {\n file.result = compileResult;\n }\n realDone(error, /** @type {VFileWithOutput<CompileResult>} */ file);\n });\n /**\n * @param {Error | undefined} error\n * @param {VFileWithOutput<CompileResult> | undefined} [file]\n * @returns {undefined}\n */ function realDone(error, file) {\n if (error || !file) {\n reject(error);\n } else if (resolve) {\n resolve(file);\n } else {\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(done, \"`done` is defined if `resolve` is not\");\n done(undefined, file);\n }\n }\n }\n }\n /**\n * Process the given file as configured on the processor.\n *\n * An error is thrown if asynchronous transforms are configured.\n *\n * > 👉 **Note**: `processSync` freezes the processor if not already *frozen*.\n *\n * > 👉 **Note**: `processSync` performs the parse, run, and stringify phases.\n *\n * @param {Compatible | undefined} [file]\n * File (optional); typically `string` or `VFile`; any value accepted as\n * `x` in `new VFile(x)`.\n * @returns {VFileWithOutput<CompileResult>}\n * The processed file.\n *\n * The parsed, transformed, and compiled value is available at\n * `file.value` (see note).\n *\n * > 👉 **Note**: unified typically compiles by serializing: most\n * > compilers return `string` (or `Uint8Array`).\n * > Some compilers, such as the one configured with\n * > [`rehype-react`][rehype-react], return other values (in this case, a\n * > React tree).\n * > If you’re using a compiler that doesn’t serialize, expect different\n * > result values.\n * >\n * > To register custom results in TypeScript, add them to\n * > {@link CompileResultMap `CompileResultMap`}.\n *\n * [rehype-react]: https://github.com/rehypejs/rehype-react\n */ processSync(file) {\n /** @type {boolean} */ let complete = false;\n /** @type {VFileWithOutput<CompileResult> | undefined} */ let result;\n this.freeze();\n assertParser(\"processSync\", this.parser || this.Parser);\n assertCompiler(\"processSync\", this.compiler || this.Compiler);\n this.process(file, realDone);\n assertDone(\"processSync\", \"process\", complete);\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(result, \"we either bailed on an error or have a tree\");\n return result;\n /**\n * @type {ProcessCallback<VFileWithOutput<CompileResult>>}\n */ function realDone(error, file) {\n complete = true;\n (0,bail__WEBPACK_IMPORTED_MODULE_5__.bail)(error);\n result = file;\n }\n }\n /**\n * Run *transformers* on a syntax tree.\n *\n * > 👉 **Note**: `run` freezes the processor if not already *frozen*.\n *\n * > 👉 **Note**: `run` performs the run phase, not other phases.\n *\n * @overload\n * @param {HeadTree extends undefined ? Node : HeadTree} tree\n * @param {RunCallback<TailTree extends undefined ? Node : TailTree>} done\n * @returns {undefined}\n *\n * @overload\n * @param {HeadTree extends undefined ? Node : HeadTree} tree\n * @param {Compatible | undefined} file\n * @param {RunCallback<TailTree extends undefined ? Node : TailTree>} done\n * @returns {undefined}\n *\n * @overload\n * @param {HeadTree extends undefined ? Node : HeadTree} tree\n * @param {Compatible | undefined} [file]\n * @returns {Promise<TailTree extends undefined ? Node : TailTree>}\n *\n * @param {HeadTree extends undefined ? Node : HeadTree} tree\n * Tree to transform and inspect.\n * @param {(\n * RunCallback<TailTree extends undefined ? Node : TailTree> |\n * Compatible\n * )} [file]\n * File associated with `node` (optional); any value accepted as `x` in\n * `new VFile(x)`.\n * @param {RunCallback<TailTree extends undefined ? Node : TailTree>} [done]\n * Callback (optional).\n * @returns {Promise<TailTree extends undefined ? Node : TailTree> | undefined}\n * Nothing if `done` is given.\n * Otherwise, a promise rejected with a fatal error or resolved with the\n * transformed tree.\n */ run(tree, file, done) {\n assertNode(tree);\n this.freeze();\n const transformers = this.transformers;\n if (!done && typeof file === \"function\") {\n done = file;\n file = undefined;\n }\n return done ? executor(undefined, done) : new Promise(executor);\n // Note: `void`s needed for TS.\n /**\n * @param {(\n * ((tree: TailTree extends undefined ? Node : TailTree) => undefined | void) |\n * undefined\n * )} resolve\n * @param {(error: Error) => undefined | void} reject\n * @returns {undefined}\n */ function executor(resolve, reject) {\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(typeof file !== \"function\", \"`file` can’t be a `done` anymore, we checked\");\n const realFile = vfile(file);\n transformers.run(tree, realFile, realDone);\n /**\n * @param {Error | undefined} error\n * @param {Node} outputTree\n * @param {VFile} file\n * @returns {undefined}\n */ function realDone(error, outputTree, file) {\n const resultingTree = /** @type {TailTree extends undefined ? Node : TailTree} */ outputTree || tree;\n if (error) {\n reject(error);\n } else if (resolve) {\n resolve(resultingTree);\n } else {\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(done, \"`done` is defined if `resolve` is not\");\n done(undefined, resultingTree, file);\n }\n }\n }\n }\n /**\n * Run *transformers* on a syntax tree.\n *\n * An error is thrown if asynchronous transforms are configured.\n *\n * > 👉 **Note**: `runSync` freezes the processor if not already *frozen*.\n *\n * > 👉 **Note**: `runSync` performs the run phase, not other phases.\n *\n * @param {HeadTree extends undefined ? Node : HeadTree} tree\n * Tree to transform and inspect.\n * @param {Compatible | undefined} [file]\n * File associated with `node` (optional); any value accepted as `x` in\n * `new VFile(x)`.\n * @returns {TailTree extends undefined ? Node : TailTree}\n * Transformed tree.\n */ runSync(tree, file) {\n /** @type {boolean} */ let complete = false;\n /** @type {(TailTree extends undefined ? Node : TailTree) | undefined} */ let result;\n this.run(tree, file, realDone);\n assertDone(\"runSync\", \"run\", complete);\n (0,devlop__WEBPACK_IMPORTED_MODULE_4__.ok)(result, \"we either bailed on an error or have a tree\");\n return result;\n /**\n * @type {RunCallback<TailTree extends undefined ? Node : TailTree>}\n */ function realDone(error, tree) {\n (0,bail__WEBPACK_IMPORTED_MODULE_5__.bail)(error);\n result = tree;\n complete = true;\n }\n }\n /**\n * Compile a syntax tree.\n *\n * > 👉 **Note**: `stringify` freezes the processor if not already *frozen*.\n *\n * > 👉 **Note**: `stringify` performs the stringify phase, not the run phase\n * > or other phases.\n *\n * @param {CompileTree extends undefined ? Node : CompileTree} tree\n * Tree to compile.\n * @param {Compatible | undefined} [file]\n * File associated with `node` (optional); any value accepted as `x` in\n * `new VFile(x)`.\n * @returns {CompileResult extends undefined ? Value : CompileResult}\n * Textual representation of the tree (see note).\n *\n * > 👉 **Note**: unified typically compiles by serializing: most compilers\n * > return `string` (or `Uint8Array`).\n * > Some compilers, such as the one configured with\n * > [`rehype-react`][rehype-react], return other values (in this case, a\n * > React tree).\n * > If you’re using a compiler that doesn’t serialize, expect different\n * > result values.\n * >\n * > To register custom results in TypeScript, add them to\n * > {@link CompileResultMap `CompileResultMap`}.\n *\n * [rehype-react]: https://github.com/rehypejs/rehype-react\n */ stringify(tree, file) {\n this.freeze();\n const realFile = vfile(file);\n const compiler = this.compiler || this.Compiler;\n assertCompiler(\"stringify\", compiler);\n assertNode(tree);\n return compiler(tree, realFile);\n }\n /**\n * Configure the processor to use a plugin, a list of usable values, or a\n * preset.\n *\n * If the processor is already using a plugin, the previous plugin\n * configuration is changed based on the options that are passed in.\n * In other words, the plugin is not added a second time.\n *\n * > 👉 **Note**: `use` cannot be called on *frozen* processors.\n * > Call the processor first to create a new unfrozen processor.\n *\n * @example\n * There are many ways to pass plugins to `.use()`.\n * This example gives an overview:\n *\n * ```js\n * import {unified} from 'unified'\n *\n * unified()\n * // Plugin with options:\n * .use(pluginA, {x: true, y: true})\n * // Passing the same plugin again merges configuration (to `{x: true, y: false, z: true}`):\n * .use(pluginA, {y: false, z: true})\n * // Plugins:\n * .use([pluginB, pluginC])\n * // Two plugins, the second with options:\n * .use([pluginD, [pluginE, {}]])\n * // Preset with plugins and settings:\n * .use({plugins: [pluginF, [pluginG, {}]], settings: {position: false}})\n * // Settings only:\n * .use({settings: {position: false}})\n * ```\n *\n * @template {Array<unknown>} [Parameters=[]]\n * @template {Node | string | undefined} [Input=undefined]\n * @template [Output=Input]\n *\n * @overload\n * @param {Preset | null | undefined} [preset]\n * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n *\n * @overload\n * @param {PluggableList} list\n * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n *\n * @overload\n * @param {Plugin<Parameters, Input, Output>} plugin\n * @param {...(Parameters | [boolean])} parameters\n * @returns {UsePlugin<ParseTree, HeadTree, TailTree, CompileTree, CompileResult, Input, Output>}\n *\n * @param {PluggableList | Plugin | Preset | null | undefined} value\n * Usable value.\n * @param {...unknown} parameters\n * Parameters, when a plugin is given as a usable value.\n * @returns {Processor<ParseTree, HeadTree, TailTree, CompileTree, CompileResult>}\n * Current processor.\n */ use(value, ...parameters) {\n const attachers = this.attachers;\n const namespace = this.namespace;\n assertUnfrozen(\"use\", this.frozen);\n if (value === null || value === undefined) {\n // Empty.\n } else if (typeof value === \"function\") {\n addPlugin(value, parameters);\n } else if (typeof value === \"object\") {\n if (Array.isArray(value)) {\n addList(value);\n } else {\n addPreset(value);\n }\n } else {\n throw new TypeError(\"Expected usable value, not `\" + value + \"`\");\n }\n return this;\n /**\n * @param {Pluggable} value\n * @returns {undefined}\n */ function add(value) {\n if (typeof value === \"function\") {\n addPlugin(value, []);\n } else if (typeof value === \"object\") {\n if (Array.isArray(value)) {\n const [plugin, ...parameters] = /** @type {PluginTuple<Array<unknown>>} */ value;\n addPlugin(plugin, parameters);\n } else {\n addPreset(value);\n }\n } else {\n throw new TypeError(\"Expected usable value, not `\" + value + \"`\");\n }\n }\n /**\n * @param {Preset} result\n * @returns {undefined}\n */ function addPreset(result) {\n if (!(\"plugins\" in result) && !(\"settings\" in result)) {\n throw new Error(\"Expected usable value but received an empty preset, which is probably a mistake: presets typically come with `plugins` and sometimes with `settings`, but this has neither\");\n }\n addList(result.plugins);\n if (result.settings) {\n namespace.settings = extend__WEBPACK_IMPORTED_MODULE_0__(true, namespace.settings, result.settings);\n }\n }\n /**\n * @param {PluggableList | null | undefined} plugins\n * @returns {undefined}\n */ function addList(plugins) {\n let index = -1;\n if (plugins === null || plugins === undefined) {\n // Empty.\n } else if (Array.isArray(plugins)) {\n while(++index < plugins.length){\n const thing = plugins[index];\n add(thing);\n }\n } else {\n throw new TypeError(\"Expected a list of plugins, not `\" + plugins + \"`\");\n }\n }\n /**\n * @param {Plugin} plugin\n * @param {Array<unknown>} parameters\n * @returns {undefined}\n */ function addPlugin(plugin, parameters) {\n let index = -1;\n let entryIndex = -1;\n while(++index < attachers.length){\n if (attachers[index][0] === plugin) {\n entryIndex = index;\n break;\n }\n }\n if (entryIndex === -1) {\n attachers.push([\n plugin,\n ...parameters\n ]);\n } else if (parameters.length > 0) {\n let [primary, ...rest] = parameters;\n const currentPrimary = attachers[entryIndex][1];\n if ((0,is_plain_obj__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(currentPrimary) && (0,is_plain_obj__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(primary)) {\n primary = extend__WEBPACK_IMPORTED_MODULE_0__(true, currentPrimary, primary);\n }\n attachers[entryIndex] = [\n plugin,\n primary,\n ...rest\n ];\n }\n }\n }\n}\n// Note: this returns a *callable* instance.\n// That’s why it’s documented as a function.\n/**\n * Create a new processor.\n *\n * @example\n * This example shows how a new processor can be created (from `remark`) and linked\n * to **stdin**(4) and **stdout**(4).\n *\n * ```js\n * import process from 'node:process'\n * import concatStream from 'concat-stream'\n * import {remark} from 'remark'\n *\n * process.stdin.pipe(\n * concatStream(function (buf) {\n * process.stdout.write(String(remark().processSync(buf)))\n * })\n * )\n * ```\n *\n * @returns\n * New *unfrozen* processor (`processor`).\n *\n * This processor is configured to work the same as its ancestor.\n * When the descendant processor is configured in the future it does not\n * affect the ancestral processor.\n */ const unified = new Processor().freeze();\n/**\n * Assert a parser is available.\n *\n * @param {string} name\n * @param {unknown} value\n * @returns {asserts value is Parser}\n */ function assertParser(name, value) {\n if (typeof value !== \"function\") {\n throw new TypeError(\"Cannot `\" + name + \"` without `parser`\");\n }\n}\n/**\n * Assert a compiler is available.\n *\n * @param {string} name\n * @param {unknown} value\n * @returns {asserts value is Compiler}\n */ function assertCompiler(name, value) {\n if (typeof value !== \"function\") {\n throw new TypeError(\"Cannot `\" + name + \"` without `compiler`\");\n }\n}\n/**\n * Assert the processor is not frozen.\n *\n * @param {string} name\n * @param {unknown} frozen\n * @returns {asserts frozen is false}\n */ function assertUnfrozen(name, frozen) {\n if (frozen) {\n throw new Error(\"Cannot call `\" + name + \"` on a frozen processor.\\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.\");\n }\n}\n/**\n * Assert `node` is a unist node.\n *\n * @param {unknown} node\n * @returns {asserts node is Node}\n */ function assertNode(node) {\n // `isPlainObj` unfortunately uses `any` instead of `unknown`.\n // type-coverage:ignore-next-line\n if (!(0,is_plain_obj__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(node) || typeof node.type !== \"string\") {\n throw new TypeError(\"Expected node, got `\" + node + \"`\");\n // Fine.\n }\n}\n/**\n * Assert that `complete` is `true`.\n *\n * @param {string} name\n * @param {string} asyncName\n * @param {unknown} complete\n * @returns {asserts complete is true}\n */ function assertDone(name, asyncName, complete) {\n if (!complete) {\n throw new Error(\"`\" + name + \"` finished async. Use `\" + asyncName + \"` instead\");\n }\n}\n/**\n * @param {Compatible | undefined} [value]\n * @returns {VFile}\n */ function vfile(value) {\n return looksLikeAVFile(value) ? value : new vfile__WEBPACK_IMPORTED_MODULE_6__.VFile(value);\n}\n/**\n * @param {Compatible | undefined} [value]\n * @returns {value is VFile}\n */ function looksLikeAVFile(value) {\n return Boolean(value && typeof value === \"object\" && \"message\" in value && \"messages\" in value);\n}\n/**\n * @param {unknown} [value]\n * @returns {value is Value}\n */ function looksLikeAValue(value) {\n return typeof value === \"string\" || isUint8Array(value);\n}\n/**\n * Assert `value` is an `Uint8Array`.\n *\n * @param {unknown} value\n * thing.\n * @returns {value is Uint8Array}\n * Whether `value` is an `Uint8Array`.\n */ function isUint8Array(value) {\n return Boolean(value && typeof value === \"object\" && \"byteLength\" in value && \"byteOffset\" in value);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvdW5pZmllZC9saWIvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7O0NBV0MsR0FFRDs7Ozs7O0NBTUMsR0FFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUNDLEdBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FnQkMsR0FFRDs7Ozs7OztDQU9DLEdBRUQ7OztDQUdDLEdBRUQsNERBQTREO0FBQzVELDJEQUEyRDtBQUMzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThDQyxHQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBK0JDLEdBRUQ7Ozs7Ozs7OztDQVNDLEdBRUQ7Ozs7Ozs7Ozs7Ozs7Q0FhQyxHQUVEOzs7Ozs7Ozs7Ozs7Ozs7Q0FlQyxHQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0NBZ0JDLEdBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTBDQyxHQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXdEQyxHQUVEOzs7Ozs7Ozs7Ozs7Q0FZQyxHQUV3QjtBQUNFO0FBQ1E7QUFDRTtBQUNSO0FBQ0Y7QUFDNEI7QUFFdkQsa0VBQWtFO0FBRWxFLDRFQUE0RTtBQUM1RSxxQkFBcUI7QUFDckIsNkVBQTZFO0FBRTdFLE1BQU1RLE1BQU0sQ0FBQyxFQUFFQyxjQUFjO0FBRTdCOzs7Ozs7Ozs7Ozs7Q0FZQyxHQUNNLE1BQU1DLGtCQUFrQkgsbUVBQWdCQTtJQUM3Qzs7R0FFQyxHQUNESSxhQUFjO1FBQ1osa0VBQWtFO1FBQ2xFLEtBQUssQ0FBQztRQUVOOzs7Ozs7Ozs7Ozs7S0FZQyxHQUNELElBQUksQ0FBQ0MsUUFBUSxHQUFHQztRQUVoQjs7Ozs7Ozs7O0tBU0MsR0FDRCxJQUFJLENBQUNDLE1BQU0sR0FBR0Q7UUFFZCxxREFBcUQ7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LE1BQU0sSUFBSTZELE1BQ1Isa0JBQ0VVLE9BQ0E7SUFFTjtBQUNGO0FBRUE7Ozs7O0NBS0MsR0FDRCxTQUFTdkIsV0FBV3dCLElBQUk7SUFDdEIsOERBQThEO0lBQzlELGlDQUFpQztJQUNqQyxJQUFJLENBQUN0Rix3REFBVUEsQ0FBQ3NGLFNBQVMsT0FBT0EsS0FBS0MsSUFBSSxLQUFLLFVBQVU7UUFDdEQsTUFBTSxJQUFJZixVQUFVLHlCQUF5QmMsT0FBTztJQUNwRCxRQUFRO0lBQ1Y7QUFDRjtBQUVBOzs7Ozs7O0NBT0MsR0FDRCxTQUFTekIsV0FBV3dCLElBQUksRUFBRUcsU0FBUyxFQUFFNUIsUUFBUTtJQUMzQyxJQUFJLENBQUNBLFVBQVU7UUFDYixNQUFNLElBQUllLE1BQ1IsTUFBTVUsT0FBTyw0QkFBNEJHLFlBQVk7SUFFekQ7QUFDRjtBQUVBOzs7Q0FHQyxHQUNELFNBQVNqRCxNQUFNYixLQUFLO0lBQ2xCLE9BQU8rRCxnQkFBZ0IvRCxTQUFTQSxRQUFRLElBQUl4Qix3Q0FBS0EsQ0FBQ3dCO0FBQ3BEO0FBRUE7OztDQUdDLEdBQ0QsU0FBUytELGdCQUFnQi9ELEtBQUs7SUFDNUIsT0FBT2dFLFFBQ0xoRSxTQUNFLE9BQU9BLFVBQVUsWUFDakIsYUFBYUEsU0FDYixjQUFjQTtBQUVwQjtBQUVBOzs7Q0FHQyxHQUNELFNBQVMrQixnQkFBZ0IvQixLQUFLO0lBQzVCLE9BQU8sT0FBT0EsVUFBVSxZQUFZaUUsYUFBYWpFO0FBQ25EO0FBRUE7Ozs7Ozs7Q0FPQyxHQUNELFNBQVNpRSxhQUFhakUsS0FBSztJQUN6QixPQUFPZ0UsUUFDTGhFLFNBQ0UsT0FBT0EsVUFBVSxZQUNqQixnQkFBZ0JBLFNBQ2hCLGdCQUFnQkE7QUFFdEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9mbHVzaC1ub3Rlcy8uL25vZGVfbW9kdWxlcy91bmlmaWVkL2xpYi9pbmRleC5qcz8zOTM3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgndHJvdWdoJykuUGlwZWxpbmV9IFBpcGVsaW5lXG4gKlxuICogQHR5cGVkZWYge2ltcG9ydCgndW5pc3QnKS5Ob2RlfSBOb2RlXG4gKlxuICogQHR5cGVkZWYge2ltcG9ydCgndmZpbGUnKS5Db21wYXRpYmxlfSBDb21wYXRpYmxlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCd2ZmlsZScpLlZhbHVlfSBWYWx1ZVxuICpcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2luZGV4LmpzJykuQ29tcGlsZVJlc3VsdE1hcH0gQ29tcGlsZVJlc3VsdE1hcFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vaW5kZXguanMnKS5EYXRhfSBEYXRhXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9pbmRleC5qcycpLlNldHRpbmdzfSBTZXR0aW5nc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvbXBpbGVSZXN1bHRNYXBba2V5b2YgQ29tcGlsZVJlc3VsdE1hcF19IENvbXBpbGVSZXN1bHRzXG4gKiAgIEFjY2VwdGFibGUgcmVzdWx0cyBmcm9tIGNvbXBpbGVycy5cbiAqXG4gKiAgIFRvIHJlZ2lzdGVyIGN1c3RvbSByZXN1bHRzLCBhZGQgdGhlbSB0b1xuICogICB7QGxpbmsgQ29tcGlsZVJlc3VsdE1hcCBgQ29tcGlsZVJlc3VsdE1hcGB9LlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtOb2RlfSBbVHJlZT1Ob2RlXVxuICogICBUaGUgbm9kZSB0aGF0IHRoZSBjb21waWxlciByZWNlaXZlcyAoZGVmYXVsdDogYE5vZGVgKS5cbiAqIEB0ZW1wbGF0ZSB7Q29tcGlsZVJlc3VsdHN9IFtSZXN1bHQ9Q29tcGlsZVJlc3VsdHNdXG4gKiAgIFRoZSB0aGluZyB0aGF0IHRoZSBjb21waWxlciB5aWVsZHMgKGRlZmF1bHQ6IGBDb21waWxlUmVzdWx0c2ApLlxuICogQGNhbGxiYWNrIENvbXBpbGVyXG4gKiAgIEEgKipjb21waWxlcioqIGhhbmRsZXMgdGhlIGNvbXBpbGluZyBvZiBhIHN5bnRheCB0cmVlIHRvIHNvbWV0aGluZyBlbHNlXG4gKiAgIChpbiBtb3N0IGNhc2VzLCB0ZXh0KSAoVHlwZVNjcmlwdCB0eXBlKS5cbiAqXG4gKiAgIEl0IGlzIHVzZWQgaW4gdGhlIHN0cmluZ2lmeSBwaGFzZSBhbmQgY2FsbGVkIHdpdGggYSB7QGxpbmsgTm9kZSBgTm9kZWB9XG4gKiAgIGFuZCB7QGxpbmsgVkZpbGUgYFZGaWxlYH0gcmVwcmVzZW50YXRpb24gb2YgdGhlIGRvY3VtZW50IHRvIGNvbXBpbGUuXG4gKiAgIEl0IHNob3VsZCByZXR1cm4gdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRyZWUgKHR5cGljYWxseVxuICogICBgc3RyaW5nYCkuXG4gKlxuICogICA+IPCfkYkgKipOb3RlKio6IHVuaWZpZWQgdHlwaWNhbGx5IGNvbXBpbGVzIGJ5IHNlcmlhbGl6aW5nOiBtb3N0IGNvbXBpbGVyc1xuICogICA+IHJldHVybiBgc3RyaW5nYCAob3IgYFVpbnQ4QXJyYXlgKS5cbiAqICAgPiBTb21lIGNvbXBpbGVycywgc3VjaCBhcyB0aGUgb25lIGNvbmZpZ3VyZWQgd2l0aFxuICogICA+IFtgcmVoeXBlLXJlYWN0YF1bcmVoeXBlLXJlYWN0XSwgcmV0dXJuIG90aGVyIHZhbHVlcyAoaW4gdGhpcyBjYXNlLCBhXG4gKiAgID4gUmVhY3QgdHJlZSkuXG4gKiAgID4gSWYgeW914oCZcmUgdXNpbmcgYSBjb21waWxlciB0aGF0IGRvZXNu4oCZdCBzZXJpYWxpemUsIGV4cGVjdCBkaWZmZXJlbnRcbiAqICAgPiByZXN1bHQgdmFsdWVzLlxuICogICA+XG4gKiAgID4gVG8gcmVnaXN0ZXIgY3VzdG9tIHJlc3VsdHMgaW4gVHlwZVNjcmlwdCwgYWRkIHRoZW0gdG9cbiAqICAgPiB7QGxpbmsgQ29tcGlsZVJlc3VsdE1hcCBgQ29tcGlsZVJlc3VsdE1hcGB9LlxuICpcbiAqICAgW3JlaHlwZS1yZWFjdF06IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWh5cGVqcy9yZWh5cGUtcmVhY3RcbiAqIEBwYXJhbSB7VHJlZX0gdHJlZVxuICogICBUcmVlIHRvIGNvbXBpbGUuXG4gKiBAcGFyYW0ge1ZGaWxlfSBmaWxlXG4gKiAgIEZpbGUgYXNzb2NpYXRlZCB3aXRoIGB0cmVlYC5cbiAqIEByZXR1cm5zIHtSZXN1bHR9XG4gKiAgIE5ldyBjb250ZW50OiBjb21waWxlZCB0ZXh0IChgc3RyaW5nYCBvciBgVWludDhBcnJheWAsIGZvciBgZmlsZS52YWx1ZWApIG9yXG4gKiAgIHNvbWV0aGluZyBlbHNlIChmb3IgYGZpbGUucmVzdWx0YCkuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge05vZGV9IFtUcmVlPU5vZGVdXG4gKiAgIFRoZSBub2RlIHRoYXQgdGhlIHBhcnNlciB5aWVsZHMgKGRlZmF1bHQ6IGBOb2RlYClcbiAqIEBjYWxsYmFjayBQYXJzZXJcbiAqICAgQSAqKnBhcnNlcioqIGhhbmRsZXMgdGhlIHBhcnNpbmcgb2YgdGV4dCB0byBhIHN5bnRheCB0cmVlLlxuICpcbiAqICAgSXQgaXMgdXNlZCBpbiB0aGUgcGFyc2UgcGhhc2UgYW5kIGlzIGNhbGxlZCB3aXRoIGEgYHN0cmluZ2AgYW5kXG4gKiAgIHtAbGluayBWRmlsZSBgVkZpbGVgfSBvZiB0aGUgZG9jdW1lbnQgdG8gcGFyc2UuXG4gKiAgIEl0IG11c3QgcmV0dXJuIHRoZSBzeW50YXggdHJlZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZmlsZVxuICogICAoe0BsaW5rIE5vZGUgYE5vZGVgfSkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZG9jdW1lbnRcbiAqICAgRG9jdW1lbnQgdG8gcGFyc2UuXG4gKiBAcGFyYW0ge1ZGaWxlfSBmaWxlXG4gKiAgIEZpbGUgYXNzb2NpYXRlZCB3aXRoIGBkb2N1bWVudGAuXG4gKiBAcmV0dXJucyB7VHJlZX1cbiAqICAgTm9kZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGZpbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KFxuICogICBQbHVnaW48QXJyYXk8YW55PiwgYW55LCBhbnk+IHxcbiAqICAgUGx1Z2luVHVwbGU8QXJyYXk8YW55PiwgYW55LCBhbnk+IHxcbiAqICAgUHJlc2V0XG4gKiApfSBQbHVnZ2FibGVcbiAqICAgVW5pb24gb2YgdGhlIGRpZmZlcmVudCB3YXlzIHRvIGFkZCBwbHVnaW5zIGFuZCBzZXR0aW5ncy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxQbHVnZ2FibGU+fSBQbHVnZ2FibGVMaXN0XG4gKiAgIExpc3Qgb2YgcGx1Z2lucyBhbmQgcHJlc2V0cy5cbiAqL1xuXG4vLyBOb3RlOiB3ZSBjYW7igJl0IHVzZSBgY2FsbGJhY2tgIHlldCBhcyBpdCBtZXNzZXMgdXAgYHRoaXNgOlxuLy8gIDxodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzU1MTk3Pi5cbi8qKlxuICogQHRlbXBsYXRlIHtBcnJheTx1bmtub3duPn0gW1BsdWdpblBhcmFtZXRlcnM9W11dXG4gKiAgIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHBsdWdpbiAoZGVmYXVsdDogYFtdYCwgdGhlIGVtcHR5IHR1cGxlKS5cbiAqIEB0ZW1wbGF0ZSB7Tm9kZSB8IHN0cmluZyB8IHVuZGVmaW5lZH0gW0lucHV0PU5vZGVdXG4gKiAgIFZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYXMgaW5wdXQgKGRlZmF1bHQ6IGBOb2RlYCkuXG4gKlxuICogICAqICAgSWYgdGhlIHBsdWdpbiByZXR1cm5zIGEge0BsaW5rIFRyYW5zZm9ybWVyIGBUcmFuc2Zvcm1lcmB9LCB0aGlzXG4gKiAgICAgICBzaG91bGQgYmUgdGhlIG5vZGUgaXQgZXhwZWN0cy5cbiAqICAgKiAgIElmIHRoZSBwbHVnaW4gc2V0cyBhIHtAbGluayBQYXJzZXIgYFBhcnNlcmB9LCB0aGlzIHNob3VsZCBiZVxuICogICAgICAgYHN0cmluZ2AuXG4gKiAgICogICBJZiB0aGUgcGx1Z2luIHNldHMgYSB7QGxpbmsgQ29tcGlsZXIgYENvbXBpbGVyYH0sIHRoaXMgc2hvdWxkIGJlIHRoZVxuICogICAgICAgbm9kZSBpdCBleHBlY3RzLlxuICogQHRlbXBsYXRlIFtPdXRwdXQ9SW5wdXRdXG4gKiAgIFZhbHVlIHRoYXQgaXMgeWllbGRlZCBhcyBvdXRwdXQgKGRlZmF1bHQ6IGBJbnB1dGApLlxuICpcbiAqICAgKiAgIElmIHRoZSBwbHVnaW4gcmV0dXJucyBhIHtAbGluayBUcmFuc2Zvcm1lciBgVHJhbnNmb3JtZXJgfSwgdGhpc1xuICogICAgICAgc2hvdWxkIGJlIHRoZSBub2RlIHRoYXQgdGhhdCB5aWVsZHMuXG4gKiAgICogICBJZiB0aGUgcGx1Z2luIHNldHMgYSB7QGxpbmsgUGFyc2VyIGBQYXJzZXJgfSwgdGhpcyBzaG91bGQgYmUgdGhlXG4gKiAgICAgICBub2RlIHRoYXQgaXQgeWllbGRzLlxuICogICAqICAgSWYgdGhlIHBsdWdpbiBzZXRzIGEge0BsaW5rIENvbXBpbGVyIGBDb21waWxlcmB9LCB0aGlzIHNob3VsZCBiZVxuICogICAgICAgcmVzdWx0IGl0IHlpZWxkcy5cbiAqIEB0eXBlZGVmIHsoXG4gKiAgICh0aGlzOiBQcm9jZXNzb3IsIC4uLnBhcmFtZXRlcnM6IFBsdWdpblBhcmFtZXRlcnMpID0+XG4gKiAgICAgSW5wdXQgZXh0ZW5kcyBzdHJpbmcgPyAvLyBQYXJzZXIuXG4gKiAgICAgICAgT3V0cHV0IGV4dGVuZHMgTm9kZSB8IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCB8IHZvaWQgOiBuZXZlciA6XG4gKiAgICAgT3V0cHV0IGV4dGVuZHMgQ29tcGlsZVJlc3VsdHMgPyAvLyBDb21waWxlci5cbiAqICAgICAgICBJbnB1dCBleHRlbmRzIE5vZGUgfCB1bmRlZmluZWQgPyB1bmRlZmluZWQgfCB2b2lkIDogbmV2ZXIgOlxuICogICAgIFRyYW5zZm9ybWVyPFxuICogICAgICAgSW5wdXQgZXh0ZW5kcyBOb2RlID8gSW5wdXQgOiBOb2RlLFxuICogICAgICAgT3V0cHV0IGV4dGVuZHMgTm9kZSA/IE91dHB1dCA6IE5vZGVcbiAqICAgICA+IHwgdW5kZWZpbmVkIHwgdm9pZFxuICogKX0gUGx1Z2luXG4gKiAgIFNpbmdsZSBwbHVnaW4uXG4gKlxuICogICBQbHVnaW5zIGNvbmZpZ3VyZSB0aGUgcHJvY2Vzc29ycyB0aGV5IGFyZSBhcHBsaWVkIG9uIGluIHRoZSBmb2xsb3dpbmdcbiAqICAgd2F5czpcbiAqXG4gKiAgICogICB0aGV5IGNoYW5nZSB0aGUgcHJvY2Vzc29yLCBzdWNoIGFzIHRoZSBwYXJzZXIsIHRoZSBjb21waWxlciwgb3IgYnlcbiAqICAgICAgIGNvbmZpZ3VyaW5nIGRhdGFcbiAqICAgKiAgIHRoZXkgc3BlY2lmeSBob3cgdG8gaGFuZGxlIHRyZWVzIGFuZCBmaWxlc1xuICpcbiAqICAgSW4gcHJhY3RpY2UsIHRoZXkgYXJlIGZ1bmN0aW9ucyB0aGF0IGNhbiByZWNlaXZlIG9wdGlvbnMgYW5kIGNvbmZpZ3VyZSB0aGVcbiAqICAgcHJvY2Vzc29yIChgdGhpc2ApLlxuICpcbiAqICAgPiDwn5GJICoqTm90ZSoqOiBwbHVnaW5zIGFyZSBjYWxsZWQgd2hlbiB0aGUgcHJvY2Vzc29yIGlzICpmcm96ZW4qLCBub3Qgd2hlblxuICogICA+IHRoZXkgYXJlIGFwcGxpZWQuXG4gKi9cblxuLyoqXG4gKiBUdXBsZSBvZiBhIHBsdWdpbiBhbmQgaXRzIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVGhlIGZpcnN0IGl0ZW0gaXMgYSBwbHVnaW4sIHRoZSByZXN0IGFyZSBpdHMgcGFyYW1ldGVycy5cbiAqXG4gKiBAdGVtcGxhdGUge0FycmF5PHVua25vd24+fSBbVHVwbGVQYXJhbWV0ZXJzPVtdXVxuICogICBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBwbHVnaW4gKGRlZmF1bHQ6IGBbXWAsIHRoZSBlbXB0eSB0dXBsZSkuXG4gKiBAdGVtcGxhdGUge05vZGUgfCBzdHJpbmcgfCB1bmRlZmluZWR9IFtJbnB1dD11bmRlZmluZWRdXG4gKiAgIFZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYXMgaW5wdXQgKG9wdGlvbmFsKS5cbiAqXG4gKiAgICogICBJZiB0aGUgcGx1Z2luIHJldHVybnMgYSB7QGxpbmsgVHJhbnNmb3JtZXIgYFRyYW5zZm9ybWVyYH0sIHRoaXNcbiAqICAgICAgIHNob3VsZCBiZSB0aGUgbm9kZSBpdCBleHBlY3RzLlxuICogICAqICAgSWYgdGhlIHBsdWdpbiBzZXRzIGEge0BsaW5rIFBhcnNlciBgUGFyc2VyYH0sIHRoaXMgc2hvdWxkIGJlXG4gKiAgICAgICBgc3RyaW5nYC5cbiAqICAgKiAgIElmIHRoZSBwbHVnaW4gc2V0cyBhIHtAbGluayBDb21waWxlciBgQ29tcGlsZXJgfSwgdGhpcyBzaG91bGQgYmUgdGhlXG4gKiAgICAgICBub2RlIGl0IGV4cGVjdHMuXG4gKiBAdGVtcGxhdGUgW091dHB1dD11bmRlZmluZWRdIChvcHRpb25hbCkuXG4gKiAgIFZhbHVlIHRoYXQgaXMgeWllbGRlZCBhcyBvdXRwdXQuXG4gKlxuICogICAqICAgSWYgdGhlIHBsdWdpbiByZXR1cm5zIGEge0BsaW5rIFRyYW5zZm9ybWVyIGBUcmFuc2Zvcm1lcmB9LCB0aGlzXG4gKiAgICAgICBzaG91bGQgYmUgdGhlIG5vZGUgdGhhdCB0aGF0IHlpZWxkcy5cbiAqICAgKiAgIElmIHRoZSBwbHVnaW4gc2V0cyBhIHtAbGluayBQYXJzZXIgYFBhcnNlcmB9LCB0aGlzIHNob3VsZCBiZSB0aGVcbiAqICAgICAgIG5vZGUgdGhhdCBpdCB5aWVsZHMuXG4gKiAgICogICBJZiB0aGUgcGx1Z2luIHNldHMgYSB7QGxpbmsgQ29tcGlsZXIgYENvbXBpbGVyYH0sIHRoaXMgc2hvdWxkIGJlXG4gKiAgICAgICByZXN1bHQgaXQgeWllbGRzLlxuICogQHR5cGVkZWYgeyhcbiAqICAgW1xuICogICAgIHBsdWdpbjogUGx1Z2luPFR1cGxlUGFyYW1ldGVycywgSW5wdXQsIE91dHB1dD4sXG4gKiAgICAgLi4ucGFyYW1ldGVyczogVHVwbGVQYXJhbWV0ZXJzXG4gKiAgIF1cbiAqICl9IFBsdWdpblR1cGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQcmVzZXRcbiAqICAgU2hhcmFibGUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiAgIFRoZXkgY2FuIGNvbnRhaW4gcGx1Z2lucyBhbmQgc2V0dGluZ3MuXG4gKiBAcHJvcGVydHkge1BsdWdnYWJsZUxpc3QgfCB1bmRlZmluZWR9IFtwbHVnaW5zXVxuICogICBMaXN0IG9mIHBsdWdpbnMgYW5kIHByZXNldHMgKG9wdGlvbmFsKS5cbiAqIEBwcm9wZXJ0eSB7U2V0dGluZ3MgfCB1bmRlZmluZWR9IFtzZXR0aW5nc11cbiAqICAgU2hhcmVkIHNldHRpbmdzIGZvciBwYXJzZXJzIGFuZCBjb21waWxlcnMgKG9wdGlvbmFsKS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VkZpbGV9IFtGaWxlPVZGaWxlXVxuICogICBUaGUgZmlsZSB0aGF0IHRoZSBjYWxsYmFjayByZWNlaXZlcyAoZGVmYXVsdDogYFZGaWxlYCkuXG4gKiBAY2FsbGJhY2sgUHJvY2Vzc0NhbGxiYWNrXG4gKiAgIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSBwcm9jZXNzIGlzIGRvbmUuXG4gKlxuICogICBDYWxsZWQgd2l0aCBlaXRoZXIgYW4gZXJyb3Igb3IgYSByZXN1bHQuXG4gKiBAcGFyYW0ge0Vycm9yIHwgdW5kZWZpbmVkfSBbZXJyb3JdXG4gKiAgIEZhdGFsIGVycm9yIChvcHRpb25hbCkuXG4gKiBAcGFyYW0ge0ZpbGUgfCB1bmRlZmluZWR9IFtmaWxlXVxuICogICBQcm9jZXNzZWQgZmlsZSAob3B0aW9uYWwpLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqICAgTm90aGluZy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Tm9kZX0gW1RyZWU9Tm9kZV1cbiAqICAgVGhlIHRyZWUgdGhhdCB0aGUgY2FsbGJhY2sgcmVjZWl2ZXMgKGRlZmF1bHQ6IGBOb2RlYCkuXG4gKiBAY2FsbGJhY2sgUnVuQ2FsbGJhY2tcbiAqICAgQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdHJhbnNmb3JtZXJzIGFyZSBkb25lLlxuICpcbiAqICAgQ2FsbGVkIHdpdGggZWl0aGVyIGFuIGVycm9yIG9yIHJlc3VsdHMuXG4gKiBAcGFyYW0ge0Vycm9yIHwgdW5kZWZpbmVkfSBbZXJyb3JdXG4gKiAgIEZhdGFsIGVycm9yIChvcHRpb25hbCkuXG4gKiBAcGFyYW0ge1RyZWUgfCB1bmRlZmluZWR9IFt0cmVlXVxuICogICBUcmFuc2Zvcm1lZCB0cmVlIChvcHRpb25hbCkuXG4gKiBAcGFyYW0ge1ZGaWxlIHwgdW5kZWZpbmVkfSBbZmlsZV1cbiAqICAgRmlsZSAob3B0aW9uYWwpLlxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqICAgTm90aGluZy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Tm9kZX0gW091dHB1dD1Ob2RlXVxuICogICBOb2RlIHR5cGUgdGhhdCB0aGUgdHJhbnNmb3JtZXIgeWllbGRzIChkZWZhdWx0OiBgTm9kZWApLlxuICogQGNhbGxiYWNrIFRyYW5zZm9ybUNhbGxiYWNrXG4gKiAgIENhbGxiYWNrIHBhc3NlZCB0byB0cmFuc2Zvcm1zLlxuICpcbiAqICAgSWYgdGhlIHNpZ25hdHVyZSBvZiBhIGB0cmFuc2Zvcm1lcmAgYWNjZXB0cyBhIHRoaXJkIGFyZ3VtZW50LCB0aGVcbiAqICAgdHJhbnNmb3JtZXIgbWF5IHBlcmZvcm0gYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMsIGFuZCBtdXN0IGNhbGwgaXQuXG4gKiBAcGFyYW0ge0Vycm9yIHwgdW5kZWZpbmVkfSBbZXJyb3JdXG4gKiAgIEZhdGFsIGVycm9yIHRvIHN0b3AgdGhlIHByb2Nlc3MgKG9wdGlvbmFsKS5cbiAqIEBwYXJhbSB7T3V0cHV0IHwgdW5kZWZpbmVkfSBbdHJlZV1cbiAqICAgTmV3LCBjaGFuZ2VkLCB0cmVlIChvcHRpb25hbCkuXG4gKiBAcGFyYW0ge1ZGaWxlIHwgdW5kZWZpbmVkfSBbZmlsZV1cbiAqICAgTmV3LCBjaGFuZ2VkLCBmaWxlIChvcHRpb25hbCkuXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICogICBOb3RoaW5nLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtOb2RlfSBbSW5wdXQ9Tm9kZV1cbiAqICAgTm9kZSB0eXBlIHRoYXQgdGhlIHRyYW5zZm9ybWVyIGV4cGVjdHMgKGRlZmF1bHQ6IGBOb2RlYCkuXG4gKiBAdGVtcGxhdGUge05vZGV9IFtPdXRwdXQ9SW5wdXRdXG4gKiAgIE5vZGUgdHlwZSB0aGF0IHRoZSB0cmFuc2Zvcm1lciB5aWVsZHMgKGRlZmF1bHQ6IGBJbnB1dGApLlxuICogQGNhbGxiYWNrIFRyYW5zZm9ybWVyXG4gKiAgIFRyYW5zZm9ybWVycyBoYW5kbGUgc3ludGF4IHRyZWVzIGFuZCBmaWxlcy5cbiAqXG4gKiAgIFRoZXkgYXJlIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgZWFjaCB0aW1lIGEgc3ludGF4IHRyZWUgYW5kIGZpbGUgYXJlXG4gKiAgIHBhc3NlZCB0aHJvdWdoIHRoZSBydW4gcGhhc2UuXG4gKiAgIFdoZW4gYW4gZXJyb3Igb2NjdXJzIGluIHRoZW0gKGVpdGhlciBiZWNhdXNlIGl04oCZcyB0aHJvd24sIHJldHVybmVkLFxuICogICByZWplY3RlZCwgb3IgcGFzc2VkIHRvIGBuZXh0YCksIHRoZSBwcm9jZXNzIHN0b3BzLlxuICpcbiAqICAgVGhlIHJ1biBwaGFzZSBpcyBoYW5kbGVkIGJ5IFtgdHJvdWdoYF1bdHJvdWdoXSwgc2VlIGl0cyBkb2N1bWVudGF0aW9uIGZvclxuICogICB0aGUgZXhhY3Qgc2VtYW50aWNzIG9mIHRoZXNlIGZ1bmN0aW9ucy5cbiAqXG4gKiAgID4g8J+RiSAqKk5vdGUqKjogeW91IHNob3VsZCBsaWtlbHkgaWdub3JlIGBuZXh0YDogZG9u4oCZdCBhY2NlcHQgaXQuXG4gKiAgID4gaXQgc3VwcG9ydHMgY2FsbGJhY2stc3R5bGUgYXN5bmMgd29yay5cbiAqICAgPiBCdXQgcHJvbWlzZXMgYXJlIGxpa2VseSBlYXNpZXIgdG8gcmVhc29uIGFib3V0LlxuICpcbiAqICAgW3Ryb3VnaF06IGh0dHBzOi8vZ2l0aHViLmNvbS93b29vcm0vdHJvdWdoI2Z1bmN0aW9uLWZuaW5wdXQtbmV4dFxuICogQHBhcmFtIHtJbnB1dH0gdHJlZVxuICogICBUcmVlIHRvIGhhbmRsZS5cbiAqIEBwYXJhbSB7VkZpbGV9IGZpbGVcbiAqICAgRmlsZSB0byBoYW5kbGUuXG4gKiBAcGFyYW0ge1RyYW5zZm9ybUNhbGxiYWNrPE91dHB1dD59IG5leHRcbiAqICAgQ2FsbGJhY2suXG4gKiBAcmV0dXJucyB7KFxuICogICBQcm9taXNlPE91dHB1dCB8IHVuZGVmaW5lZCB8IHZvaWQ+IHxcbiAqICAgUHJvbWlzZTxuZXZlcj4gfCAvLyBGb3Igc29tZSByZWFzb24gdGhpcyBpcyBuZWVkZWQgc2VwYXJhdGVseS5cbiAqICAgT3V0cHV0IHxcbiAqICAgRXJyb3IgfFxuICogICB1bmRlZmluZWQgfFxuICogICB2b2lkXG4gKiApfVxuICogICBJZiB5b3UgYWNjZXB0IGBuZXh0YCwgbm90aGluZy5cbiAqICAgT3RoZXJ3aXNlOlxuICpcbiAqICAgKiAgIGBFcnJvcmAg4oCUIGZhdGFsIGVycm9yIHRvIHN0b3AgdGhlIHByb2Nlc3NcbiAqICAgKiAgIGBQcm9taXNlPHVuZGVmaW5lZD5gIG9yIGB1bmRlZmluZWRgIOKAlCB0aGUgbmV4dCB0cmFuc2Zvcm1lciBrZWVwcyB1c2luZ1xuICogICAgICAgc2FtZSB0cmVlXG4gKiAgICogICBgUHJvbWlzZTxOb2RlPmAgb3IgYE5vZGVgIOKAlCBuZXcsIGNoYW5nZWQsIHRyZWVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Tm9kZSB8IHVuZGVmaW5lZH0gUGFyc2VUcmVlXG4gKiAgIE91dHB1dCBvZiBgcGFyc2VgLlxuICogQHRlbXBsYXRlIHtOb2RlIHwgdW5kZWZpbmVkfSBIZWFkVHJlZVxuICogICBJbnB1dCBmb3IgYHJ1bmAuXG4gKiBAdGVtcGxhdGUge05vZGUgfCB1bmRlZmluZWR9IFRhaWxUcmVlXG4gKiAgIE91dHB1dCBmb3IgYHJ1bmAuXG4gKiBAdGVtcGxhdGUge05vZGUgfCB1bmRlZmluZWR9IENvbXBpbGVUcmVlXG4gKiAgIElucHV0IG9mIGBzdHJpbmdpZnlgLlxuICogQHRlbXBsYXRlIHtDb21waWxlUmVzdWx0cyB8IHVuZGVmaW5lZH0gQ29tcGlsZVJlc3VsdFxuICogICBPdXRwdXQgb2YgYHN0cmluZ2lmeWAuXG4gKiBAdGVtcGxhdGUge05vZGUgfCBzdHJpbmcgfCB1bmRlZmluZWR9IElucHV0XG4gKiAgIElucHV0IG9mIHBsdWdpbi5cbiAqIEB0ZW1wbGF0ZSBPdXRwdXRcbiAqICAgT3V0cHV0IG9mIHBsdWdpbiAob3B0aW9uYWwpLlxuICogQHR5cGVkZWYgeyhcbiAqICAgSW5wdXQgZXh0ZW5kcyBzdHJpbmdcbiAqICAgICA/IE91dHB1dCBleHRlbmRzIE5vZGUgfCB1bmRlZmluZWRcbiAqICAgICAgID8gLy8gUGFyc2VyLlxuICogICAgICAgICBQcm9jZXNzb3I8XG4gKiAgICAgICAgICAgT3V0cHV0IGV4dGVuZHMgdW5kZWZpbmVkID8gUGFyc2VUcmVlIDogT3V0cHV0LFxuICogICAgICAgICAgIEhlYWRUcmVlLFxuICogICAgICAgICAgIFRhaWxUcmVlLFxuICogICAgICAgICAgIENvbXBpbGVUcmVlLFxuICogICAgICAgICAgIENvbXBpbGVSZXN1bHRcbiAqICAgICAgICAgPlxuICogICAgICAgOiAvLyBVbmtub3duLlxuICogICAgICAgICBQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0PlxuICogICAgIDogT3V0cHV0IGV4dGVuZHMgQ29tcGlsZVJlc3VsdHNcbiAqICAgICA/IElucHV0IGV4dGVuZHMgTm9kZSB8IHVuZGVmaW5lZFxuICogICAgICAgPyAvLyBDb21waWxlci5cbiAqICAgICAgICAgUHJvY2Vzc29yPFxuICogICAgICAgICAgIFBhcnNlVHJlZSxcbiAqICAgICAgICAgICBIZWFkVHJlZSxcbiAqICAgICAgICAgICBUYWlsVHJlZSxcbiAqICAgICAgICAgICBJbnB1dCBleHRlbmRzIHVuZGVmaW5lZCA/IENvbXBpbGVUcmVlIDogSW5wdXQsXG4gKiAgICAgICAgICAgT3V0cHV0IGV4dGVuZHMgdW5kZWZpbmVkID8gQ29tcGlsZVJlc3VsdCA6IE91dHB1dFxuICogICAgICAgICA+XG4gKiAgICAgICA6IC8vIFVua25vd24uXG4gKiAgICAgICAgIFByb2Nlc3NvcjxQYXJzZVRyZWUsIEhlYWRUcmVlLCBUYWlsVHJlZSwgQ29tcGlsZVRyZWUsIENvbXBpbGVSZXN1bHQ+XG4gKiAgICAgOiBJbnB1dCBleHRlbmRzIE5vZGUgfCB1bmRlZmluZWRcbiAqICAgICA/IE91dHB1dCBleHRlbmRzIE5vZGUgfCB1bmRlZmluZWRcbiAqICAgICAgID8gLy8gVHJhbnNmb3JtLlxuICogICAgICAgICBQcm9jZXNzb3I8XG4gKiAgICAgICAgICAgUGFyc2VUcmVlLFxuICogICAgICAgICAgIEhlYWRUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gSW5wdXQgOiBIZWFkVHJlZSxcbiAqICAgICAgICAgICBPdXRwdXQgZXh0ZW5kcyB1bmRlZmluZWQgPyBUYWlsVHJlZSA6IE91dHB1dCxcbiAqICAgICAgICAgICBDb21waWxlVHJlZSxcbiAqICAgICAgICAgICBDb21waWxlUmVzdWx0XG4gKiAgICAgICAgID5cbiAqICAgICAgIDogLy8gVW5rbm93bi5cbiAqICAgICAgICAgUHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD5cbiAqICAgICA6IC8vIFVua25vd24uXG4gKiAgICAgICBQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0PlxuICogKX0gVXNlUGx1Z2luXG4gKiAgIENyZWF0ZSBhIHByb2Nlc3NvciBiYXNlZCBvbiB0aGUgaW5wdXQvb3V0cHV0IG9mIGEge0BsaW5rIFBsdWdpbiBwbHVnaW59LlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtDb21waWxlUmVzdWx0cyB8IHVuZGVmaW5lZH0gUmVzdWx0XG4gKiAgIE5vZGUgdHlwZSB0aGF0IHRoZSB0cmFuc2Zvcm1lciB5aWVsZHMuXG4gKiBAdHlwZWRlZiB7KFxuICogICBSZXN1bHQgZXh0ZW5kcyBWYWx1ZSB8IHVuZGVmaW5lZCA/XG4gKiAgICAgVkZpbGUgOlxuICogICAgIFZGaWxlICYge3Jlc3VsdDogUmVzdWx0fVxuICogICApfSBWRmlsZVdpdGhPdXRwdXRcbiAqICAgVHlwZSB0byBnZW5lcmF0ZSBhIHtAbGluayBWRmlsZSBgVkZpbGVgfSBjb3JyZXNwb25kaW5nIHRvIGEgY29tcGlsZXIgcmVzdWx0LlxuICpcbiAqICAgSWYgYSByZXN1bHQgdGhhdCBpcyBub3QgYWNjZXB0YWJsZSBvbiBhIGBWRmlsZWAgaXMgdXNlZCwgdGhhdCB3aWxsXG4gKiAgIGJlIHN0b3JlZCBvbiB0aGUgYHJlc3VsdGAgZmllbGQgb2Yge0BsaW5rIFZGaWxlIGBWRmlsZWB9LlxuICovXG5cbmltcG9ydCB7YmFpbH0gZnJvbSAnYmFpbCdcbmltcG9ydCBleHRlbmQgZnJvbSAnZXh0ZW5kJ1xuaW1wb3J0IHtvayBhcyBhc3NlcnR9IGZyb20gJ2RldmxvcCdcbmltcG9ydCBpc1BsYWluT2JqIGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCB7dHJvdWdofSBmcm9tICd0cm91Z2gnXG5pbXBvcnQge1ZGaWxlfSBmcm9tICd2ZmlsZSdcbmltcG9ydCB7Q2FsbGFibGVJbnN0YW5jZX0gZnJvbSAnLi9jYWxsYWJsZS1pbnN0YW5jZS5qcydcblxuLy8gVG8gZG86IG5leHQgbWFqb3I6IGRyb3AgYENvbXBpbGVyYCwgYFBhcnNlcmA6IHByZWZlciBsb3dlcmNhc2UuXG5cbi8vIFRvIGRvOiB3ZSBjb3VsZCBzdGFydCB5aWVsZGluZyBgbmV2ZXJgIGluIFRTIHdoZW4gYSBwYXJzZXIgaXMgbWlzc2luZyBhbmRcbi8vIGBwYXJzZWAgaXMgY2FsbGVkLlxuLy8gQ3VycmVudGx5LCB3ZSBhbGxvdyBkaXJlY3RseSBzZXR0aW5nIGBwcm9jZXNzb3IucGFyc2VyYCwgd2hpY2ggaXMgdW50eXBlZC5cblxuY29uc3Qgb3duID0ge30uaGFzT3duUHJvcGVydHlcblxuLyoqXG4gKiBAdGVtcGxhdGUge05vZGUgfCB1bmRlZmluZWR9IFtQYXJzZVRyZWU9dW5kZWZpbmVkXVxuICogICBPdXRwdXQgb2YgYHBhcnNlYCAob3B0aW9uYWwpLlxuICogQHRlbXBsYXRlIHtOb2RlIHwgdW5kZWZpbmVkfSBbSGVhZFRyZWU9dW5kZWZpbmVkXVxuICogICBJbnB1dCBmb3IgYHJ1bmAgKG9wdGlvbmFsKS5cbiAqIEB0ZW1wbGF0ZSB7Tm9kZSB8IHVuZGVmaW5lZH0gW1RhaWxUcmVlPXVuZGVmaW5lZF1cbiAqICAgT3V0cHV0IGZvciBgcnVuYCAob3B0aW9uYWwpLlxuICogQHRlbXBsYXRlIHtOb2RlIHwgdW5kZWZpbmVkfSBbQ29tcGlsZVRyZWU9dW5kZWZpbmVkXVxuICogICBJbnB1dCBvZiBgc3RyaW5naWZ5YCAob3B0aW9uYWwpLlxuICogQHRlbXBsYXRlIHtDb21waWxlUmVzdWx0cyB8IHVuZGVmaW5lZH0gW0NvbXBpbGVSZXN1bHQ9dW5kZWZpbmVkXVxuICogICBPdXRwdXQgb2YgYHN0cmluZ2lmeWAgKG9wdGlvbmFsKS5cbiAqIEBleHRlbmRzIHtDYWxsYWJsZUluc3RhbmNlPFtdLCBQcm9jZXNzb3I8UGFyc2VUcmVlLCBIZWFkVHJlZSwgVGFpbFRyZWUsIENvbXBpbGVUcmVlLCBDb21waWxlUmVzdWx0Pj59XG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9jZXNzb3IgZXh0ZW5kcyBDYWxsYWJsZUluc3RhbmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHByb2Nlc3Nvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIElmIGBQcm9jZXNzb3IoKWAgaXMgY2FsbGVkICh3L28gbmV3KSwgYGNvcHlgIGlzIGNhbGxlZCBpbnN0ZWFkLlxuICAgIHN1cGVyKCdjb3B5JylcblxuICAgIC8qKlxuICAgICAqIENvbXBpbGVyIHRvIHVzZSAoZGVwcmVjYXRlZCkuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqICAgVXNlIGBjb21waWxlcmAgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7KFxuICAgICAqICAgQ29tcGlsZXI8XG4gICAgICogICAgIENvbXBpbGVUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IENvbXBpbGVUcmVlLFxuICAgICAqICAgICBDb21waWxlUmVzdWx0IGV4dGVuZHMgdW5kZWZpbmVkID8gQ29tcGlsZVJlc3VsdHMgOiBDb21waWxlUmVzdWx0XG4gICAgICogICA+IHxcbiAgICAgKiAgIHVuZGVmaW5lZFxuICAgICAqICl9XG4gICAgICovXG4gICAgdGhpcy5Db21waWxlciA9IHVuZGVmaW5lZFxuXG4gICAgLyoqXG4gICAgICogUGFyc2VyIHRvIHVzZSAoZGVwcmVjYXRlZCkuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqICAgVXNlIGBwYXJzZXJgIGluc3RlYWQuXG4gICAgICogQHR5cGUgeyhcbiAgICAgKiAgIFBhcnNlcjxQYXJzZVRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogUGFyc2VUcmVlPiB8XG4gICAgICogICB1bmRlZmluZWRcbiAgICAgKiApfVxuICAgICAqL1xuICAgIHRoaXMuUGFyc2VyID0gdW5kZWZpbmVkXG5cbiAgICAvLyBOb3RlOiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgY29uc2lkZXJlZCBwcml2YXRlLlxuICAgIC8vIEhvd2V2ZXIsIHRoZXkgYXJlIG5lZWRlZCBmb3IgdGVzdHMsIGFuZCBUU0MgZ2VuZXJhdGVzIGFuIHVudHlwZWRcbiAgICAvLyBgcHJpdmF0ZSBmcmVlemVJbmRleGAgZmllbGQgZm9yLCB3aGljaCB0cmlwcyBgdHlwZS1jb3ZlcmFnZWAgdXAuXG4gICAgLy8gSW5zdGVhZCwgd2UgdXNlIGBAZGVwcmVjYXRlZGAgdG8gdmlzdWFsaXplIHRoYXQgdGhleSBzaG91bGRu4oCZdCBiZSB1c2VkLlxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGxpc3Qgb2YgY29uZmlndXJlZCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiAgIFRoaXMgaXMgYSBwcml2YXRlIGludGVybmFsIHByb3BlcnR5IGFuZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gICAgICogQHR5cGUge0FycmF5PFBsdWdpblR1cGxlPEFycmF5PHVua25vd24+Pj59XG4gICAgICovXG4gICAgdGhpcy5hdHRhY2hlcnMgPSBbXVxuXG4gICAgLyoqXG4gICAgICogQ29tcGlsZXIgdG8gdXNlLlxuICAgICAqXG4gICAgICogQHR5cGUgeyhcbiAgICAgKiAgIENvbXBpbGVyPFxuICAgICAqICAgICBDb21waWxlVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBDb21waWxlVHJlZSxcbiAgICAgKiAgICAgQ29tcGlsZVJlc3VsdCBleHRlbmRzIHVuZGVmaW5lZCA/IENvbXBpbGVSZXN1bHRzIDogQ29tcGlsZVJlc3VsdFxuICAgICAqICAgPiB8XG4gICAgICogICB1bmRlZmluZWRcbiAgICAgKiApfVxuICAgICAqL1xuICAgIHRoaXMuY29tcGlsZXIgPSB1bmRlZmluZWRcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIHN0YXRlIHRvIHRyYWNrIHdoZXJlIHdlIGFyZSB3aGlsZSBmcmVlemluZy5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogICBUaGlzIGlzIGEgcHJpdmF0ZSBpbnRlcm5hbCBwcm9wZXJ0eSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgdGhpcy5mcmVlemVJbmRleCA9IC0xXG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBzdGF0ZSB0byB0cmFjayB3aGV0aGVyIHdl4oCZcmUgZnJvemVuLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiAgIFRoaXMgaXMgYSBwcml2YXRlIGludGVybmFsIHByb3BlcnR5IGFuZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW4gfCB1bmRlZmluZWR9XG4gICAgICovXG4gICAgdGhpcy5mcm96ZW4gPSB1bmRlZmluZWRcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIHN0YXRlLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiAgIFRoaXMgaXMgYSBwcml2YXRlIGludGVybmFsIHByb3BlcnR5IGFuZCBzaG91bGQgbm90IGJlIHVzZWQuXG4gICAgICogQHR5cGUge0RhdGF9XG4gICAgICovXG4gICAgdGhpcy5uYW1lc3BhY2UgPSB7fVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VyIHRvIHVzZS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHsoXG4gICAgICogICBQYXJzZXI8UGFyc2VUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFBhcnNlVHJlZT4gfFxuICAgICAqICAgdW5kZWZpbmVkXG4gICAgICogKX1cbiAgICAgKi9cbiAgICB0aGlzLnBhcnNlciA9IHVuZGVmaW5lZFxuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbGlzdCBvZiBjb25maWd1cmVkIHRyYW5zZm9ybWVycy5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogICBUaGlzIGlzIGEgcHJpdmF0ZSBpbnRlcm5hbCBwcm9wZXJ0eSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtQaXBlbGluZX1cbiAgICAgKi9cbiAgICB0aGlzLnRyYW5zZm9ybWVycyA9IHRyb3VnaCgpXG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHByb2Nlc3Nvci5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogICBUaGlzIGlzIGEgcHJpdmF0ZSBpbnRlcm5hbCBtZXRob2QgYW5kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAgICogQHJldHVybnMge1Byb2Nlc3NvcjxQYXJzZVRyZWUsIEhlYWRUcmVlLCBUYWlsVHJlZSwgQ29tcGlsZVRyZWUsIENvbXBpbGVSZXN1bHQ+fVxuICAgKiAgIE5ldyAqdW5mcm96ZW4qIHByb2Nlc3NvciAoe0BsaW5rIFByb2Nlc3NvciBgUHJvY2Vzc29yYH0pIHRoYXQgaXNcbiAgICogICBjb25maWd1cmVkIHRvIHdvcmsgdGhlIHNhbWUgYXMgaXRzIGFuY2VzdG9yLlxuICAgKiAgIFdoZW4gdGhlIGRlc2NlbmRhbnQgcHJvY2Vzc29yIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGZ1dHVyZSBpdCBkb2VzIG5vdFxuICAgKiAgIGFmZmVjdCB0aGUgYW5jZXN0cmFsIHByb2Nlc3Nvci5cbiAgICovXG4gIGNvcHkoKSB7XG4gICAgLy8gQ2FzdCBhcyB0aGUgdHlwZSBwYXJhbWV0ZXJzIHdpbGwgYmUgdGhlIHNhbWUgYWZ0ZXIgYXR0YWNoaW5nLlxuICAgIGNvbnN0IGRlc3RpbmF0aW9uID1cbiAgICAgIC8qKiBAdHlwZSB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59ICovIChcbiAgICAgICAgbmV3IFByb2Nlc3NvcigpXG4gICAgICApXG4gICAgbGV0IGluZGV4ID0gLTFcblxuICAgIHdoaWxlICgrK2luZGV4IDwgdGhpcy5hdHRhY2hlcnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhdHRhY2hlciA9IHRoaXMuYXR0YWNoZXJzW2luZGV4XVxuICAgICAgZGVzdGluYXRpb24udXNlKC4uLmF0dGFjaGVyKVxuICAgIH1cblxuICAgIGRlc3RpbmF0aW9uLmRhdGEoZXh0ZW5kKHRydWUsIHt9LCB0aGlzLm5hbWVzcGFjZSkpXG5cbiAgICByZXR1cm4gZGVzdGluYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIHByb2Nlc3NvciB3aXRoIGluZm8gYXZhaWxhYmxlIHRvIGFsbCBwbHVnaW5zLlxuICAgKiBJbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gYW4gb2JqZWN0LlxuICAgKlxuICAgKiBUeXBpY2FsbHksIG9wdGlvbnMgY2FuIGJlIGdpdmVuIHRvIGEgc3BlY2lmaWMgcGx1Z2luLCBidXQgc29tZXRpbWVzIGl0XG4gICAqIG1ha2VzIHNlbnNlIHRvIGhhdmUgaW5mb3JtYXRpb24gc2hhcmVkIHdpdGggc2V2ZXJhbCBwbHVnaW5zLlxuICAgKiBGb3IgZXhhbXBsZSwgYSBsaXN0IG9mIEhUTUwgZWxlbWVudHMgdGhhdCBhcmUgc2VsZi1jbG9zaW5nLCB3aGljaCBpc1xuICAgKiBuZWVkZWQgZHVyaW5nIGFsbCBwaGFzZXMuXG4gICAqXG4gICAqID4g8J+RiSAqKk5vdGUqKjogc2V0dGluZyBpbmZvcm1hdGlvbiBjYW5ub3Qgb2NjdXIgb24gKmZyb3plbiogcHJvY2Vzc29ycy5cbiAgICogPiBDYWxsIHRoZSBwcm9jZXNzb3IgZmlyc3QgdG8gY3JlYXRlIGEgbmV3IHVuZnJvemVuIHByb2Nlc3Nvci5cbiAgICpcbiAgICogPiDwn5GJICoqTm90ZSoqOiB0byByZWdpc3RlciBjdXN0b20gZGF0YSBpbiBUeXBlU2NyaXB0LCBhdWdtZW50IHRoZVxuICAgKiA+IHtAbGluayBEYXRhIGBEYXRhYH0gaW50ZXJmYWNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgIFRoaXMgZXhhbXBsZSBzaG93IGhvdyB0byBnZXQgYW5kIHNldCBpbmZvOlxuICAgKlxuICAgKiAgIGBgYGpzXG4gICAqICAgaW1wb3J0IHt1bmlmaWVkfSBmcm9tICd1bmlmaWVkJ1xuICAgKlxuICAgKiAgIGNvbnN0IHByb2Nlc3NvciA9IHVuaWZpZWQoKS5kYXRhKCdhbHBoYScsICdicmF2bycpXG4gICAqXG4gICAqICAgcHJvY2Vzc29yLmRhdGEoJ2FscGhhJykgLy8gPT4gJ2JyYXZvJ1xuICAgKlxuICAgKiAgIHByb2Nlc3Nvci5kYXRhKCkgLy8gPT4ge2FscGhhOiAnYnJhdm8nfVxuICAgKlxuICAgKiAgIHByb2Nlc3Nvci5kYXRhKHtjaGFybGllOiAnZGVsdGEnfSlcbiAgICpcbiAgICogICBwcm9jZXNzb3IuZGF0YSgpIC8vID0+IHtjaGFybGllOiAnZGVsdGEnfVxuICAgKiAgIGBgYFxuICAgKlxuICAgKiBAdGVtcGxhdGUge2tleW9mIERhdGF9IEtleVxuICAgKlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHJldHVybnMge0RhdGF9XG4gICAqXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge0RhdGF9IGRhdGFzZXRcbiAgICogQHJldHVybnMge1Byb2Nlc3NvcjxQYXJzZVRyZWUsIEhlYWRUcmVlLCBUYWlsVHJlZSwgQ29tcGlsZVRyZWUsIENvbXBpbGVSZXN1bHQ+fVxuICAgKlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtLZXl9IGtleVxuICAgKiBAcmV0dXJucyB7RGF0YVtLZXldfVxuICAgKlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtLZXl9IGtleVxuICAgKiBAcGFyYW0ge0RhdGFbS2V5XX0gdmFsdWVcbiAgICogQHJldHVybnMge1Byb2Nlc3NvcjxQYXJzZVRyZWUsIEhlYWRUcmVlLCBUYWlsVHJlZSwgQ29tcGlsZVRyZWUsIENvbXBpbGVSZXN1bHQ+fVxuICAgKlxuICAgKiBAcGFyYW0ge0RhdGEgfCBLZXl9IFtrZXldXG4gICAqICAgS2V5IHRvIGdldCBvciBzZXQsIG9yIGVudGlyZSBkYXRhc2V0IHRvIHNldCwgb3Igbm90aGluZyB0byBnZXQgdGhlXG4gICAqICAgZW50aXJlIGRhdGFzZXQgKG9wdGlvbmFsKS5cbiAgICogQHBhcmFtIHtEYXRhW0tleV19IFt2YWx1ZV1cbiAgICogICBWYWx1ZSB0byBzZXQgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybnMge3Vua25vd259XG4gICAqICAgVGhlIGN1cnJlbnQgcHJvY2Vzc29yIHdoZW4gc2V0dGluZywgdGhlIHZhbHVlIGF0IGBrZXlgIHdoZW4gZ2V0dGluZywgb3JcbiAgICogICB0aGUgZW50aXJlIGRhdGFzZXQgd2hlbiBnZXR0aW5nIHdpdGhvdXQga2V5LlxuICAgKi9cbiAgZGF0YShrZXksIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBTZXQgYGtleWAuXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBhc3NlcnRVbmZyb3plbignZGF0YScsIHRoaXMuZnJvemVuKVxuICAgICAgICB0aGlzLm5hbWVzcGFjZVtrZXldID0gdmFsdWVcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgIH1cblxuICAgICAgLy8gR2V0IGBrZXlgLlxuICAgICAgcmV0dXJuIChvd24uY2FsbCh0aGlzLm5hbWVzcGFjZSwga2V5KSAmJiB0aGlzLm5hbWVzcGFjZVtrZXldKSB8fCB1bmRlZmluZWRcbiAgICB9XG5cbiAgICAvLyBTZXQgc3BhY2UuXG4gICAgaWYgKGtleSkge1xuICAgICAgYXNzZXJ0VW5mcm96ZW4oJ2RhdGEnLCB0aGlzLmZyb3plbilcbiAgICAgIHRoaXMubmFtZXNwYWNlID0ga2V5XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8vIEdldCBzcGFjZS5cbiAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmVlemUgYSBwcm9jZXNzb3IuXG4gICAqXG4gICAqIEZyb3plbiBwcm9jZXNzb3JzIGFyZSBtZWFudCB0byBiZSBleHRlbmRlZCBhbmQgbm90IHRvIGJlIGNvbmZpZ3VyZWRcbiAgICogZGlyZWN0bHkuXG4gICAqXG4gICAqIFdoZW4gYSBwcm9jZXNzb3IgaXMgZnJvemVuIGl0IGNhbm5vdCBiZSB1bmZyb3plbi5cbiAgICogTmV3IHByb2Nlc3NvcnMgd29ya2luZyB0aGUgc2FtZSB3YXkgY2FuIGJlIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGVcbiAgICogcHJvY2Vzc29yLlxuICAgKlxuICAgKiBJdOKAmXMgcG9zc2libGUgdG8gZnJlZXplIHByb2Nlc3NvcnMgZXhwbGljaXRseSBieSBjYWxsaW5nIGAuZnJlZXplKClgLlxuICAgKiBQcm9jZXNzb3JzIGZyZWV6ZSBhdXRvbWF0aWNhbGx5IHdoZW4gYC5wYXJzZSgpYCwgYC5ydW4oKWAsIGAucnVuU3luYygpYCxcbiAgICogYC5zdHJpbmdpZnkoKWAsIGAucHJvY2VzcygpYCwgb3IgYC5wcm9jZXNzU3luYygpYCBhcmUgY2FsbGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59XG4gICAqICAgVGhlIGN1cnJlbnQgcHJvY2Vzc29yLlxuICAgKi9cbiAgZnJlZXplKCkge1xuICAgIGlmICh0aGlzLmZyb3plbikge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvLyBDYXN0IHNvIHRoYXQgd2UgY2FuIHR5cGUgcGx1Z2lucyBlYXNpZXIuXG4gICAgLy8gUGx1Z2lucyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNhYmxlIG9uIGRpZmZlcmVudCBwcm9jZXNzb3JzLCBub3QganVzdCBvblxuICAgIC8vIHRoaXMgZXhhY3QgcHJvY2Vzc29yLlxuICAgIGNvbnN0IHNlbGYgPSAvKiogQHR5cGUge1Byb2Nlc3Nvcn0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHRoaXMpKVxuXG4gICAgd2hpbGUgKCsrdGhpcy5mcmVlemVJbmRleCA8IHRoaXMuYXR0YWNoZXJzLmxlbmd0aCkge1xuICAgICAgY29uc3QgW2F0dGFjaGVyLCAuLi5vcHRpb25zXSA9IHRoaXMuYXR0YWNoZXJzW3RoaXMuZnJlZXplSW5kZXhdXG5cbiAgICAgIGlmIChvcHRpb25zWzBdID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9uc1swXSA9PT0gdHJ1ZSkge1xuICAgICAgICBvcHRpb25zWzBdID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gYXR0YWNoZXIuY2FsbChzZWxmLCAuLi5vcHRpb25zKVxuXG4gICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybWVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtZXJzLnVzZSh0cmFuc2Zvcm1lcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZyb3plbiA9IHRydWVcbiAgICB0aGlzLmZyZWV6ZUluZGV4ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRleHQgdG8gYSBzeW50YXggdHJlZS5cbiAgICpcbiAgICogPiDwn5GJICoqTm90ZSoqOiBgcGFyc2VgIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi5cbiAgICpcbiAgICogPiDwn5GJICoqTm90ZSoqOiBgcGFyc2VgIHBlcmZvcm1zIHRoZSBwYXJzZSBwaGFzZSwgbm90IHRoZSBydW4gcGhhc2Ugb3Igb3RoZXJcbiAgICogPiBwaGFzZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gW2ZpbGVdXG4gICAqICAgZmlsZSB0byBwYXJzZSAob3B0aW9uYWwpOyB0eXBpY2FsbHkgYHN0cmluZ2Agb3IgYFZGaWxlYDsgYW55IHZhbHVlXG4gICAqICAgYWNjZXB0ZWQgYXMgYHhgIGluIGBuZXcgVkZpbGUoeClgLlxuICAgKiBAcmV0dXJucyB7UGFyc2VUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFBhcnNlVHJlZX1cbiAgICogICBTeW50YXggdHJlZSByZXByZXNlbnRpbmcgYGZpbGVgLlxuICAgKi9cbiAgcGFyc2UoZmlsZSkge1xuICAgIHRoaXMuZnJlZXplKClcbiAgICBjb25zdCByZWFsRmlsZSA9IHZmaWxlKGZpbGUpXG4gICAgY29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXIgfHwgdGhpcy5QYXJzZXJcbiAgICBhc3NlcnRQYXJzZXIoJ3BhcnNlJywgcGFyc2VyKVxuICAgIHJldHVybiBwYXJzZXIoU3RyaW5nKHJlYWxGaWxlKSwgcmVhbEZpbGUpXG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGUgZ2l2ZW4gZmlsZSBhcyBjb25maWd1cmVkIG9uIHRoZSBwcm9jZXNzb3IuXG4gICAqXG4gICAqID4g8J+RiSAqKk5vdGUqKjogYHByb2Nlc3NgIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi5cbiAgICpcbiAgICogPiDwn5GJICoqTm90ZSoqOiBgcHJvY2Vzc2AgcGVyZm9ybXMgdGhlIHBhcnNlLCBydW4sIGFuZCBzdHJpbmdpZnkgcGhhc2VzLlxuICAgKlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBmaWxlXG4gICAqIEBwYXJhbSB7UHJvY2Vzc0NhbGxiYWNrPFZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pj59IGRvbmVcbiAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gW2ZpbGVdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0Pj59XG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gW2ZpbGVdXG4gICAqICAgRmlsZSAob3B0aW9uYWwpOyB0eXBpY2FsbHkgYHN0cmluZ2Agb3IgYFZGaWxlYF07IGFueSB2YWx1ZSBhY2NlcHRlZCBhc1xuICAgKiAgIGB4YCBpbiBgbmV3IFZGaWxlKHgpYC5cbiAgICogQHBhcmFtIHtQcm9jZXNzQ2FsbGJhY2s8VkZpbGVXaXRoT3V0cHV0PENvbXBpbGVSZXN1bHQ+PiB8IHVuZGVmaW5lZH0gW2RvbmVdXG4gICAqICAgQ2FsbGJhY2sgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8VkZpbGU+IHwgdW5kZWZpbmVkfVxuICAgKiAgIE5vdGhpbmcgaWYgYGRvbmVgIGlzIGdpdmVuLlxuICAgKiAgIE90aGVyd2lzZSBhIHByb21pc2UsIHJlamVjdGVkIHdpdGggYSBmYXRhbCBlcnJvciBvciByZXNvbHZlZCB3aXRoIHRoZVxuICAgKiAgIHByb2Nlc3NlZCBmaWxlLlxuICAgKlxuICAgKiAgIFRoZSBwYXJzZWQsIHRyYW5zZm9ybWVkLCBhbmQgY29tcGlsZWQgdmFsdWUgaXMgYXZhaWxhYmxlIGF0XG4gICAqICAgYGZpbGUudmFsdWVgIChzZWUgbm90ZSkuXG4gICAqXG4gICAqICAgPiDwn5GJICoqTm90ZSoqOiB1bmlmaWVkIHR5cGljYWxseSBjb21waWxlcyBieSBzZXJpYWxpemluZzogbW9zdFxuICAgKiAgID4gY29tcGlsZXJzIHJldHVybiBgc3RyaW5nYCAob3IgYFVpbnQ4QXJyYXlgKS5cbiAgICogICA+IFNvbWUgY29tcGlsZXJzLCBzdWNoIGFzIHRoZSBvbmUgY29uZmlndXJlZCB3aXRoXG4gICAqICAgPiBbYHJlaHlwZS1yZWFjdGBdW3JlaHlwZS1yZWFjdF0sIHJldHVybiBvdGhlciB2YWx1ZXMgKGluIHRoaXMgY2FzZSwgYVxuICAgKiAgID4gUmVhY3QgdHJlZSkuXG4gICAqICAgPiBJZiB5b3XigJlyZSB1c2luZyBhIGNvbXBpbGVyIHRoYXQgZG9lc27igJl0IHNlcmlhbGl6ZSwgZXhwZWN0IGRpZmZlcmVudFxuICAgKiAgID4gcmVzdWx0IHZhbHVlcy5cbiAgICogICA+XG4gICAqICAgPiBUbyByZWdpc3RlciBjdXN0b20gcmVzdWx0cyBpbiBUeXBlU2NyaXB0LCBhZGQgdGhlbSB0b1xuICAgKiAgID4ge0BsaW5rIENvbXBpbGVSZXN1bHRNYXAgYENvbXBpbGVSZXN1bHRNYXBgfS5cbiAgICpcbiAgICogICBbcmVoeXBlLXJlYWN0XTogaHR0cHM6Ly9naXRodWIuY29tL3JlaHlwZWpzL3JlaHlwZS1yZWFjdFxuICAgKi9cbiAgcHJvY2VzcyhmaWxlLCBkb25lKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXNcblxuICAgIHRoaXMuZnJlZXplKClcbiAgICBhc3NlcnRQYXJzZXIoJ3Byb2Nlc3MnLCB0aGlzLnBhcnNlciB8fCB0aGlzLlBhcnNlcilcbiAgICBhc3NlcnRDb21waWxlcigncHJvY2VzcycsIHRoaXMuY29tcGlsZXIgfHwgdGhpcy5Db21waWxlcilcblxuICAgIHJldHVybiBkb25lID8gZXhlY3V0b3IodW5kZWZpbmVkLCBkb25lKSA6IG5ldyBQcm9taXNlKGV4ZWN1dG9yKVxuXG4gICAgLy8gTm90ZTogYHZvaWRgcyBuZWVkZWQgZm9yIFRTLlxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7KChmaWxlOiBWRmlsZVdpdGhPdXRwdXQ8Q29tcGlsZVJlc3VsdD4pID0+IHVuZGVmaW5lZCB8IHZvaWQpIHwgdW5kZWZpbmVkfSByZXNvbHZlXG4gICAgICogQHBhcmFtIHsoZXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkKSA9PiB1bmRlZmluZWQgfCB2b2lkfSByZWplY3RcbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGV4ZWN1dG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgY29uc3QgcmVhbEZpbGUgPSB2ZmlsZShmaWxlKVxuICAgICAgLy8gQXNzdW1lIGBQYXJzZVRyZWVgICh0aGUgcmVzdWx0IG9mIHRoZSBwYXJzZXIpIG1hdGNoZXMgYEhlYWRUcmVlYCAodGhlXG4gICAgICAvLyBpbnB1dCBvZiB0aGUgZmlyc3QgdHJhbnNmb3JtKS5cbiAgICAgIGNvbnN0IHBhcnNlVHJlZSA9XG4gICAgICAgIC8qKiBAdHlwZSB7SGVhZFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogSGVhZFRyZWV9ICovIChcbiAgICAgICAgICAvKiogQHR5cGUge3Vua25vd259ICovIChzZWxmLnBhcnNlKHJlYWxGaWxlKSlcbiAgICAgICAgKVxuXG4gICAgICBzZWxmLnJ1bihwYXJzZVRyZWUsIHJlYWxGaWxlLCBmdW5jdGlvbiAoZXJyb3IsIHRyZWUsIGZpbGUpIHtcbiAgICAgICAgaWYgKGVycm9yIHx8ICF0cmVlIHx8ICFmaWxlKSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWxEb25lKGVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXNzdW1lIGBUYWlsVHJlZWAgKHRoZSBvdXRwdXQgb2YgdGhlIGxhc3QgdHJhbnNmb3JtKSBtYXRjaGVzXG4gICAgICAgIC8vIGBDb21waWxlVHJlZWAgKHRoZSBpbnB1dCBvZiB0aGUgY29tcGlsZXIpLlxuICAgICAgICBjb25zdCBjb21waWxlVHJlZSA9XG4gICAgICAgICAgLyoqIEB0eXBlIHtDb21waWxlVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBDb21waWxlVHJlZX0gKi8gKFxuICAgICAgICAgICAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAodHJlZSlcbiAgICAgICAgICApXG5cbiAgICAgICAgY29uc3QgY29tcGlsZVJlc3VsdCA9IHNlbGYuc3RyaW5naWZ5KGNvbXBpbGVUcmVlLCBmaWxlKVxuXG4gICAgICAgIGlmIChsb29rc0xpa2VBVmFsdWUoY29tcGlsZVJlc3VsdCkpIHtcbiAgICAgICAgICBmaWxlLnZhbHVlID0gY29tcGlsZVJlc3VsdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbGUucmVzdWx0ID0gY29tcGlsZVJlc3VsdFxuICAgICAgICB9XG5cbiAgICAgICAgcmVhbERvbmUoZXJyb3IsIC8qKiBAdHlwZSB7VkZpbGVXaXRoT3V0cHV0PENvbXBpbGVSZXN1bHQ+fSAqLyAoZmlsZSkpXG4gICAgICB9KVxuXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7RXJyb3IgfCB1bmRlZmluZWR9IGVycm9yXG4gICAgICAgKiBAcGFyYW0ge1ZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0PiB8IHVuZGVmaW5lZH0gW2ZpbGVdXG4gICAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiByZWFsRG9uZShlcnJvciwgZmlsZSkge1xuICAgICAgICBpZiAoZXJyb3IgfHwgIWZpbGUpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZSkge1xuICAgICAgICAgIHJlc29sdmUoZmlsZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NlcnQoZG9uZSwgJ2Bkb25lYCBpcyBkZWZpbmVkIGlmIGByZXNvbHZlYCBpcyBub3QnKVxuICAgICAgICAgIGRvbmUodW5kZWZpbmVkLCBmaWxlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgdGhlIGdpdmVuIGZpbGUgYXMgY29uZmlndXJlZCBvbiB0aGUgcHJvY2Vzc29yLlxuICAgKlxuICAgKiBBbiBlcnJvciBpcyB0aHJvd24gaWYgYXN5bmNocm9ub3VzIHRyYW5zZm9ybXMgYXJlIGNvbmZpZ3VyZWQuXG4gICAqXG4gICAqID4g8J+RiSAqKk5vdGUqKjogYHByb2Nlc3NTeW5jYCBmcmVlemVzIHRoZSBwcm9jZXNzb3IgaWYgbm90IGFscmVhZHkgKmZyb3plbiouXG4gICAqXG4gICAqID4g8J+RiSAqKk5vdGUqKjogYHByb2Nlc3NTeW5jYCBwZXJmb3JtcyB0aGUgcGFyc2UsIHJ1biwgYW5kIHN0cmluZ2lmeSBwaGFzZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gW2ZpbGVdXG4gICAqICAgRmlsZSAob3B0aW9uYWwpOyB0eXBpY2FsbHkgYHN0cmluZ2Agb3IgYFZGaWxlYDsgYW55IHZhbHVlIGFjY2VwdGVkIGFzXG4gICAqICAgYHhgIGluIGBuZXcgVkZpbGUoeClgLlxuICAgKiBAcmV0dXJucyB7VkZpbGVXaXRoT3V0cHV0PENvbXBpbGVSZXN1bHQ+fVxuICAgKiAgIFRoZSBwcm9jZXNzZWQgZmlsZS5cbiAgICpcbiAgICogICBUaGUgcGFyc2VkLCB0cmFuc2Zvcm1lZCwgYW5kIGNvbXBpbGVkIHZhbHVlIGlzIGF2YWlsYWJsZSBhdFxuICAgKiAgIGBmaWxlLnZhbHVlYCAoc2VlIG5vdGUpLlxuICAgKlxuICAgKiAgID4g8J+RiSAqKk5vdGUqKjogdW5pZmllZCB0eXBpY2FsbHkgY29tcGlsZXMgYnkgc2VyaWFsaXppbmc6IG1vc3RcbiAgICogICA+IGNvbXBpbGVycyByZXR1cm4gYHN0cmluZ2AgKG9yIGBVaW50OEFycmF5YCkuXG4gICAqICAgPiBTb21lIGNvbXBpbGVycywgc3VjaCBhcyB0aGUgb25lIGNvbmZpZ3VyZWQgd2l0aFxuICAgKiAgID4gW2ByZWh5cGUtcmVhY3RgXVtyZWh5cGUtcmVhY3RdLCByZXR1cm4gb3RoZXIgdmFsdWVzIChpbiB0aGlzIGNhc2UsIGFcbiAgICogICA+IFJlYWN0IHRyZWUpLlxuICAgKiAgID4gSWYgeW914oCZcmUgdXNpbmcgYSBjb21waWxlciB0aGF0IGRvZXNu4oCZdCBzZXJpYWxpemUsIGV4cGVjdCBkaWZmZXJlbnRcbiAgICogICA+IHJlc3VsdCB2YWx1ZXMuXG4gICAqICAgPlxuICAgKiAgID4gVG8gcmVnaXN0ZXIgY3VzdG9tIHJlc3VsdHMgaW4gVHlwZVNjcmlwdCwgYWRkIHRoZW0gdG9cbiAgICogICA+IHtAbGluayBDb21waWxlUmVzdWx0TWFwIGBDb21waWxlUmVzdWx0TWFwYH0uXG4gICAqXG4gICAqICAgW3JlaHlwZS1yZWFjdF06IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWh5cGVqcy9yZWh5cGUtcmVhY3RcbiAgICovXG4gIHByb2Nlc3NTeW5jKGZpbGUpIHtcbiAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgbGV0IGNvbXBsZXRlID0gZmFsc2VcbiAgICAvKiogQHR5cGUge1ZGaWxlV2l0aE91dHB1dDxDb21waWxlUmVzdWx0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgcmVzdWx0XG5cbiAgICB0aGlzLmZyZWV6ZSgpXG4gICAgYXNzZXJ0UGFyc2VyKCdwcm9jZXNzU3luYycsIHRoaXMucGFyc2VyIHx8IHRoaXMuUGFyc2VyKVxuICAgIGFzc2VydENvbXBpbGVyKCdwcm9jZXNzU3luYycsIHRoaXMuY29tcGlsZXIgfHwgdGhpcy5Db21waWxlcilcblxuICAgIHRoaXMucHJvY2VzcyhmaWxlLCByZWFsRG9uZSlcbiAgICBhc3NlcnREb25lKCdwcm9jZXNzU3luYycsICdwcm9jZXNzJywgY29tcGxldGUpXG4gICAgYXNzZXJ0KHJlc3VsdCwgJ3dlIGVpdGhlciBiYWlsZWQgb24gYW4gZXJyb3Igb3IgaGF2ZSBhIHRyZWUnKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge1Byb2Nlc3NDYWxsYmFjazxWRmlsZVdpdGhPdXRwdXQ8Q29tcGlsZVJlc3VsdD4+fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlYWxEb25lKGVycm9yLCBmaWxlKSB7XG4gICAgICBjb21wbGV0ZSA9IHRydWVcbiAgICAgIGJhaWwoZXJyb3IpXG4gICAgICByZXN1bHQgPSBmaWxlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biAqdHJhbnNmb3JtZXJzKiBvbiBhIHN5bnRheCB0cmVlLlxuICAgKlxuICAgKiA+IPCfkYkgKipOb3RlKio6IGBydW5gIGZyZWV6ZXMgdGhlIHByb2Nlc3NvciBpZiBub3QgYWxyZWFkeSAqZnJvemVuKi5cbiAgICpcbiAgICogPiDwn5GJICoqTm90ZSoqOiBgcnVuYCBwZXJmb3JtcyB0aGUgcnVuIHBoYXNlLCBub3Qgb3RoZXIgcGhhc2VzLlxuICAgKlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gdHJlZVxuICAgKiBAcGFyYW0ge1J1bkNhbGxiYWNrPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPn0gZG9uZVxuICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgKlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtIZWFkVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBIZWFkVHJlZX0gdHJlZVxuICAgKiBAcGFyYW0ge0NvbXBhdGlibGUgfCB1bmRlZmluZWR9IGZpbGVcbiAgICogQHBhcmFtIHtSdW5DYWxsYmFjazxUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZT59IGRvbmVcbiAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICpcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7SGVhZFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogSGVhZFRyZWV9IHRyZWVcbiAgICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBbZmlsZV1cbiAgICogQHJldHVybnMge1Byb21pc2U8VGFpbFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogVGFpbFRyZWU+fVxuICAgKlxuICAgKiBAcGFyYW0ge0hlYWRUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IEhlYWRUcmVlfSB0cmVlXG4gICAqICAgVHJlZSB0byB0cmFuc2Zvcm0gYW5kIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7KFxuICAgKiAgIFJ1bkNhbGxiYWNrPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPiB8XG4gICAqICAgQ29tcGF0aWJsZVxuICAgKiApfSBbZmlsZV1cbiAgICogICBGaWxlIGFzc29jaWF0ZWQgd2l0aCBgbm9kZWAgKG9wdGlvbmFsKTsgYW55IHZhbHVlIGFjY2VwdGVkIGFzIGB4YCBpblxuICAgKiAgIGBuZXcgVkZpbGUoeClgLlxuICAgKiBAcGFyYW0ge1J1bkNhbGxiYWNrPFRhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlPn0gW2RvbmVdXG4gICAqICAgQ2FsbGJhY2sgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8VGFpbFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogVGFpbFRyZWU+IHwgdW5kZWZpbmVkfVxuICAgKiAgIE5vdGhpbmcgaWYgYGRvbmVgIGlzIGdpdmVuLlxuICAgKiAgIE90aGVyd2lzZSwgYSBwcm9taXNlIHJlamVjdGVkIHdpdGggYSBmYXRhbCBlcnJvciBvciByZXNvbHZlZCB3aXRoIHRoZVxuICAgKiAgIHRyYW5zZm9ybWVkIHRyZWUuXG4gICAqL1xuICBydW4odHJlZSwgZmlsZSwgZG9uZSkge1xuICAgIGFzc2VydE5vZGUodHJlZSlcbiAgICB0aGlzLmZyZWV6ZSgpXG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lcnMgPSB0aGlzLnRyYW5zZm9ybWVyc1xuXG4gICAgaWYgKCFkb25lICYmIHR5cGVvZiBmaWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBkb25lID0gZmlsZVxuICAgICAgZmlsZSA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiBkb25lID8gZXhlY3V0b3IodW5kZWZpbmVkLCBkb25lKSA6IG5ldyBQcm9taXNlKGV4ZWN1dG9yKVxuXG4gICAgLy8gTm90ZTogYHZvaWRgcyBuZWVkZWQgZm9yIFRTLlxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7KFxuICAgICAqICAgKCh0cmVlOiBUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZSkgPT4gdW5kZWZpbmVkIHwgdm9pZCkgfFxuICAgICAqICAgdW5kZWZpbmVkXG4gICAgICogKX0gcmVzb2x2ZVxuICAgICAqIEBwYXJhbSB7KGVycm9yOiBFcnJvcikgPT4gdW5kZWZpbmVkIHwgdm9pZH0gcmVqZWN0XG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBleGVjdXRvcihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgdHlwZW9mIGZpbGUgIT09ICdmdW5jdGlvbicsXG4gICAgICAgICdgZmlsZWAgY2Fu4oCZdCBiZSBhIGBkb25lYCBhbnltb3JlLCB3ZSBjaGVja2VkJ1xuICAgICAgKVxuICAgICAgY29uc3QgcmVhbEZpbGUgPSB2ZmlsZShmaWxlKVxuICAgICAgdHJhbnNmb3JtZXJzLnJ1bih0cmVlLCByZWFsRmlsZSwgcmVhbERvbmUpXG5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHtFcnJvciB8IHVuZGVmaW5lZH0gZXJyb3JcbiAgICAgICAqIEBwYXJhbSB7Tm9kZX0gb3V0cHV0VHJlZVxuICAgICAgICogQHBhcmFtIHtWRmlsZX0gZmlsZVxuICAgICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gcmVhbERvbmUoZXJyb3IsIG91dHB1dFRyZWUsIGZpbGUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0aW5nVHJlZSA9XG4gICAgICAgICAgLyoqIEB0eXBlIHtUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZX0gKi8gKFxuICAgICAgICAgICAgb3V0cHV0VHJlZSB8fCB0cmVlXG4gICAgICAgICAgKVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSBlbHNlIGlmIChyZXNvbHZlKSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHRpbmdUcmVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2VydChkb25lLCAnYGRvbmVgIGlzIGRlZmluZWQgaWYgYHJlc29sdmVgIGlzIG5vdCcpXG4gICAgICAgICAgZG9uZSh1bmRlZmluZWQsIHJlc3VsdGluZ1RyZWUsIGZpbGUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVuICp0cmFuc2Zvcm1lcnMqIG9uIGEgc3ludGF4IHRyZWUuXG4gICAqXG4gICAqIEFuIGVycm9yIGlzIHRocm93biBpZiBhc3luY2hyb25vdXMgdHJhbnNmb3JtcyBhcmUgY29uZmlndXJlZC5cbiAgICpcbiAgICogPiDwn5GJICoqTm90ZSoqOiBgcnVuU3luY2AgZnJlZXplcyB0aGUgcHJvY2Vzc29yIGlmIG5vdCBhbHJlYWR5ICpmcm96ZW4qLlxuICAgKlxuICAgKiA+IPCfkYkgKipOb3RlKio6IGBydW5TeW5jYCBwZXJmb3JtcyB0aGUgcnVuIHBoYXNlLCBub3Qgb3RoZXIgcGhhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge0hlYWRUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IEhlYWRUcmVlfSB0cmVlXG4gICAqICAgVHJlZSB0byB0cmFuc2Zvcm0gYW5kIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gW2ZpbGVdXG4gICAqICAgRmlsZSBhc3NvY2lhdGVkIHdpdGggYG5vZGVgIChvcHRpb25hbCk7IGFueSB2YWx1ZSBhY2NlcHRlZCBhcyBgeGAgaW5cbiAgICogICBgbmV3IFZGaWxlKHgpYC5cbiAgICogQHJldHVybnMge1RhaWxUcmVlIGV4dGVuZHMgdW5kZWZpbmVkID8gTm9kZSA6IFRhaWxUcmVlfVxuICAgKiAgIFRyYW5zZm9ybWVkIHRyZWUuXG4gICAqL1xuICBydW5TeW5jKHRyZWUsIGZpbGUpIHtcbiAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgbGV0IGNvbXBsZXRlID0gZmFsc2VcbiAgICAvKiogQHR5cGUgeyhUYWlsVHJlZSBleHRlbmRzIHVuZGVmaW5lZCA/IE5vZGUgOiBUYWlsVHJlZSkgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IHJlc3VsdFxuXG4gICAgdGhpcy5ydW4odHJlZSwgZmlsZSwgcmVhbERvbmUpXG5cbiAgICBhc3NlcnREb25lKCdydW5TeW5jJywgJ3J1bicsIGNvbXBsZXRlKVxuICAgIGFzc2VydChyZXN1bHQsICd3ZSBlaXRoZXIgYmFpbGVkIG9uIGFuIGVycm9yIG9yIGhhdmUgYSB0cmVlJylcbiAgICByZXR1cm4gcmVzdWx0XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UnVuQ2FsbGJhY2s8VGFpbFRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogVGFpbFRyZWU+fVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlYWxEb25lKGVycm9yLCB0cmVlKSB7XG4gICAgICBiYWlsKGVycm9yKVxuICAgICAgcmVzdWx0ID0gdHJlZVxuICAgICAgY29tcGxldGUgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBpbGUgYSBzeW50YXggdHJlZS5cbiAgICpcbiAgICogPiDwn5GJICoqTm90ZSoqOiBgc3RyaW5naWZ5YCBmcmVlemVzIHRoZSBwcm9jZXNzb3IgaWYgbm90IGFscmVhZHkgKmZyb3plbiouXG4gICAqXG4gICAqID4g8J+RiSAqKk5vdGUqKjogYHN0cmluZ2lmeWAgcGVyZm9ybXMgdGhlIHN0cmluZ2lmeSBwaGFzZSwgbm90IHRoZSBydW4gcGhhc2VcbiAgICogPiBvciBvdGhlciBwaGFzZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tcGlsZVRyZWUgZXh0ZW5kcyB1bmRlZmluZWQgPyBOb2RlIDogQ29tcGlsZVRyZWV9IHRyZWVcbiAgICogICBUcmVlIHRvIGNvbXBpbGUuXG4gICAqIEBwYXJhbSB7Q29tcGF0aWJsZSB8IHVuZGVmaW5lZH0gW2ZpbGVdXG4gICAqICAgRmlsZSBhc3NvY2lhdGVkIHdpdGggYG5vZGVgIChvcHRpb25hbCk7IGFueSB2YWx1ZSBhY2NlcHRlZCBhcyBgeGAgaW5cbiAgICogICBgbmV3IFZGaWxlKHgpYC5cbiAgICogQHJldHVybnMge0NvbXBpbGVSZXN1bHQgZXh0ZW5kcyB1bmRlZmluZWQgPyBWYWx1ZSA6IENvbXBpbGVSZXN1bHR9XG4gICAqICAgVGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJlZSAoc2VlIG5vdGUpLlxuICAgKlxuICAgKiAgID4g8J+RiSAqKk5vdGUqKjogdW5pZmllZCB0eXBpY2FsbHkgY29tcGlsZXMgYnkgc2VyaWFsaXppbmc6IG1vc3QgY29tcGlsZXJzXG4gICAqICAgPiByZXR1cm4gYHN0cmluZ2AgKG9yIGBVaW50OEFycmF5YCkuXG4gICAqICAgPiBTb21lIGNvbXBpbGVycywgc3VjaCBhcyB0aGUgb25lIGNvbmZpZ3VyZWQgd2l0aFxuICAgKiAgID4gW2ByZWh5cGUtcmVhY3RgXVtyZWh5cGUtcmVhY3RdLCByZXR1cm4gb3RoZXIgdmFsdWVzIChpbiB0aGlzIGNhc2UsIGFcbiAgICogICA+IFJlYWN0IHRyZWUpLlxuICAgKiAgID4gSWYgeW914oCZcmUgdXNpbmcgYSBjb21waWxlciB0aGF0IGRvZXNu4oCZdCBzZXJpYWxpemUsIGV4cGVjdCBkaWZmZXJlbnRcbiAgICogICA+IHJlc3VsdCB2YWx1ZXMuXG4gICAqICAgPlxuICAgKiAgID4gVG8gcmVnaXN0ZXIgY3VzdG9tIHJlc3VsdHMgaW4gVHlwZVNjcmlwdCwgYWRkIHRoZW0gdG9cbiAgICogICA+IHtAbGluayBDb21waWxlUmVzdWx0TWFwIGBDb21waWxlUmVzdWx0TWFwYH0uXG4gICAqXG4gICAqICAgW3JlaHlwZS1yZWFjdF06IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWh5cGVqcy9yZWh5cGUtcmVhY3RcbiAgICovXG4gIHN0cmluZ2lmeSh0cmVlLCBmaWxlKSB7XG4gICAgdGhpcy5mcmVlemUoKVxuICAgIGNvbnN0IHJlYWxGaWxlID0gdmZpbGUoZmlsZSlcbiAgICBjb25zdCBjb21waWxlciA9IHRoaXMuY29tcGlsZXIgfHwgdGhpcy5Db21waWxlclxuICAgIGFzc2VydENvbXBpbGVyKCdzdHJpbmdpZnknLCBjb21waWxlcilcbiAgICBhc3NlcnROb2RlKHRyZWUpXG5cbiAgICByZXR1cm4gY29tcGlsZXIodHJlZSwgcmVhbEZpbGUpXG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBwcm9jZXNzb3IgdG8gdXNlIGEgcGx1Z2luLCBhIGxpc3Qgb2YgdXNhYmxlIHZhbHVlcywgb3IgYVxuICAgKiBwcmVzZXQuXG4gICAqXG4gICAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYWxyZWFkeSB1c2luZyBhIHBsdWdpbiwgdGhlIHByZXZpb3VzIHBsdWdpblxuICAgKiBjb25maWd1cmF0aW9uIGlzIGNoYW5nZWQgYmFzZWQgb24gdGhlIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIGluLlxuICAgKiBJbiBvdGhlciB3b3JkcywgdGhlIHBsdWdpbiBpcyBub3QgYWRkZWQgYSBzZWNvbmQgdGltZS5cbiAgICpcbiAgICogPiDwn5GJICoqTm90ZSoqOiBgdXNlYCBjYW5ub3QgYmUgY2FsbGVkIG9uICpmcm96ZW4qIHByb2Nlc3NvcnMuXG4gICAqID4gQ2FsbCB0aGUgcHJvY2Vzc29yIGZpcnN0IHRvIGNyZWF0ZSBhIG5ldyB1bmZyb3plbiBwcm9jZXNzb3IuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAgVGhlcmUgYXJlIG1hbnkgd2F5cyB0byBwYXNzIHBsdWdpbnMgdG8gYC51c2UoKWAuXG4gICAqICAgVGhpcyBleGFtcGxlIGdpdmVzIGFuIG92ZXJ2aWV3OlxuICAgKlxuICAgKiAgIGBgYGpzXG4gICAqICAgaW1wb3J0IHt1bmlmaWVkfSBmcm9tICd1bmlmaWVkJ1xuICAgKlxuICAgKiAgIHVuaWZpZWQoKVxuICAgKiAgICAgLy8gUGx1Z2luIHdpdGggb3B0aW9uczpcbiAgICogICAgIC51c2UocGx1Z2luQSwge3g6IHRydWUsIHk6IHRydWV9KVxuICAgKiAgICAgLy8gUGFzc2luZyB0aGUgc2FtZSBwbHVnaW4gYWdhaW4gbWVyZ2VzIGNvbmZpZ3VyYXRpb24gKHRvIGB7eDogdHJ1ZSwgeTogZmFsc2UsIHo6IHRydWV9YCk6XG4gICAqICAgICAudXNlKHBsdWdpbkEsIHt5OiBmYWxzZSwgejogdHJ1ZX0pXG4gICAqICAgICAvLyBQbHVnaW5zOlxuICAgKiAgICAgLnVzZShbcGx1Z2luQiwgcGx1Z2luQ10pXG4gICAqICAgICAvLyBUd28gcGx1Z2lucywgdGhlIHNlY29uZCB3aXRoIG9wdGlvbnM6XG4gICAqICAgICAudXNlKFtwbHVnaW5ELCBbcGx1Z2luRSwge31dXSlcbiAgICogICAgIC8vIFByZXNldCB3aXRoIHBsdWdpbnMgYW5kIHNldHRpbmdzOlxuICAgKiAgICAgLnVzZSh7cGx1Z2luczogW3BsdWdpbkYsIFtwbHVnaW5HLCB7fV1dLCBzZXR0aW5nczoge3Bvc2l0aW9uOiBmYWxzZX19KVxuICAgKiAgICAgLy8gU2V0dGluZ3Mgb25seTpcbiAgICogICAgIC51c2Uoe3NldHRpbmdzOiB7cG9zaXRpb246IGZhbHNlfX0pXG4gICAqICAgYGBgXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSB7QXJyYXk8dW5rbm93bj59IFtQYXJhbWV0ZXJzPVtdXVxuICAgKiBAdGVtcGxhdGUge05vZGUgfCBzdHJpbmcgfCB1bmRlZmluZWR9IFtJbnB1dD11bmRlZmluZWRdXG4gICAqIEB0ZW1wbGF0ZSBbT3V0cHV0PUlucHV0XVxuICAgKlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtQcmVzZXQgfCBudWxsIHwgdW5kZWZpbmVkfSBbcHJlc2V0XVxuICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59XG4gICAqXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge1BsdWdnYWJsZUxpc3R9IGxpc3RcbiAgICogQHJldHVybnMge1Byb2Nlc3NvcjxQYXJzZVRyZWUsIEhlYWRUcmVlLCBUYWlsVHJlZSwgQ29tcGlsZVRyZWUsIENvbXBpbGVSZXN1bHQ+fVxuICAgKlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtQbHVnaW48UGFyYW1ldGVycywgSW5wdXQsIE91dHB1dD59IHBsdWdpblxuICAgKiBAcGFyYW0gey4uLihQYXJhbWV0ZXJzIHwgW2Jvb2xlYW5dKX0gcGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7VXNlUGx1Z2luPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdCwgSW5wdXQsIE91dHB1dD59XG4gICAqXG4gICAqIEBwYXJhbSB7UGx1Z2dhYmxlTGlzdCB8IFBsdWdpbiB8IFByZXNldCB8IG51bGwgfCB1bmRlZmluZWR9IHZhbHVlXG4gICAqICAgVXNhYmxlIHZhbHVlLlxuICAgKiBAcGFyYW0gey4uLnVua25vd259IHBhcmFtZXRlcnNcbiAgICogICBQYXJhbWV0ZXJzLCB3aGVuIGEgcGx1Z2luIGlzIGdpdmVuIGFzIGEgdXNhYmxlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7UHJvY2Vzc29yPFBhcnNlVHJlZSwgSGVhZFRyZWUsIFRhaWxUcmVlLCBDb21waWxlVHJlZSwgQ29tcGlsZVJlc3VsdD59XG4gICAqICAgQ3VycmVudCBwcm9jZXNzb3IuXG4gICAqL1xuICB1c2UodmFsdWUsIC4uLnBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBhdHRhY2hlcnMgPSB0aGlzLmF0dGFjaGVyc1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlXG5cbiAgICBhc3NlcnRVbmZyb3plbigndXNlJywgdGhpcy5mcm96ZW4pXG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRW1wdHkuXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFkZFBsdWdpbih2YWx1ZSwgcGFyYW1ldGVycylcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBhZGRMaXN0KHZhbHVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkUHJlc2V0KHZhbHVlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB1c2FibGUgdmFsdWUsIG5vdCBgJyArIHZhbHVlICsgJ2AnKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1BsdWdnYWJsZX0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhZGRQbHVnaW4odmFsdWUsIFtdKVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIGNvbnN0IFtwbHVnaW4sIC4uLnBhcmFtZXRlcnNdID1cbiAgICAgICAgICAgIC8qKiBAdHlwZSB7UGx1Z2luVHVwbGU8QXJyYXk8dW5rbm93bj4+fSAqLyAodmFsdWUpXG4gICAgICAgICAgYWRkUGx1Z2luKHBsdWdpbiwgcGFyYW1ldGVycylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRQcmVzZXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHVzYWJsZSB2YWx1ZSwgbm90IGAnICsgdmFsdWUgKyAnYCcpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtQcmVzZXR9IHJlc3VsdFxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkUHJlc2V0KHJlc3VsdCkge1xuICAgICAgaWYgKCEoJ3BsdWdpbnMnIGluIHJlc3VsdCkgJiYgISgnc2V0dGluZ3MnIGluIHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdFeHBlY3RlZCB1c2FibGUgdmFsdWUgYnV0IHJlY2VpdmVkIGFuIGVtcHR5IHByZXNldCwgd2hpY2ggaXMgcHJvYmFibHkgYSBtaXN0YWtlOiBwcmVzZXRzIHR5cGljYWxseSBjb21lIHdpdGggYHBsdWdpbnNgIGFuZCBzb21ldGltZXMgd2l0aCBgc2V0dGluZ3NgLCBidXQgdGhpcyBoYXMgbmVpdGhlcidcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBhZGRMaXN0KHJlc3VsdC5wbHVnaW5zKVxuXG4gICAgICBpZiAocmVzdWx0LnNldHRpbmdzKSB7XG4gICAgICAgIG5hbWVzcGFjZS5zZXR0aW5ncyA9IGV4dGVuZCh0cnVlLCBuYW1lc3BhY2Uuc2V0dGluZ3MsIHJlc3VsdC5zZXR0aW5ncylcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1BsdWdnYWJsZUxpc3QgfCBudWxsIHwgdW5kZWZpbmVkfSBwbHVnaW5zXG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGRMaXN0KHBsdWdpbnMpIHtcbiAgICAgIGxldCBpbmRleCA9IC0xXG5cbiAgICAgIGlmIChwbHVnaW5zID09PSBudWxsIHx8IHBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBFbXB0eS5cbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwbHVnaW5zKSkge1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IHBsdWdpbnMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgdGhpbmcgPSBwbHVnaW5zW2luZGV4XVxuICAgICAgICAgIGFkZCh0aGluZylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBsaXN0IG9mIHBsdWdpbnMsIG5vdCBgJyArIHBsdWdpbnMgKyAnYCcpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtQbHVnaW59IHBsdWdpblxuICAgICAqIEBwYXJhbSB7QXJyYXk8dW5rbm93bj59IHBhcmFtZXRlcnNcbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFkZFBsdWdpbihwbHVnaW4sIHBhcmFtZXRlcnMpIHtcbiAgICAgIGxldCBpbmRleCA9IC0xXG4gICAgICBsZXQgZW50cnlJbmRleCA9IC0xXG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgYXR0YWNoZXJzLmxlbmd0aCkge1xuICAgICAgICBpZiAoYXR0YWNoZXJzW2luZGV4XVswXSA9PT0gcGx1Z2luKSB7XG4gICAgICAgICAgZW50cnlJbmRleCA9IGluZGV4XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnlJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgYXR0YWNoZXJzLnB1c2goW3BsdWdpbiwgLi4ucGFyYW1ldGVyc10pXG4gICAgICB9XG4gICAgICAvLyBPbmx5IHNldCBpZiB0aGVyZSB3YXMgYXQgbGVhc3QgYSBgcHJpbWFyeWAgdmFsdWUsIG90aGVyd2lzZSB3ZeKAmWQgY2hhbmdlXG4gICAgICAvLyBgYXJndW1lbnRzLmxlbmd0aGAuXG4gICAgICBlbHNlIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IFtwcmltYXJ5LCAuLi5yZXN0XSA9IHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3QgY3VycmVudFByaW1hcnkgPSBhdHRhY2hlcnNbZW50cnlJbmRleF1bMV1cbiAgICAgICAgaWYgKGlzUGxhaW5PYmooY3VycmVudFByaW1hcnkpICYmIGlzUGxhaW5PYmoocHJpbWFyeSkpIHtcbiAgICAgICAgICBwcmltYXJ5ID0gZXh0ZW5kKHRydWUsIGN1cnJlbnRQcmltYXJ5LCBwcmltYXJ5KVxuICAgICAgICB9XG5cbiAgICAgICAgYXR0YWNoZXJzW2VudHJ5SW5kZXhdID0gW3BsdWdpbiwgcHJpbWFyeSwgLi4ucmVzdF1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gTm90ZTogdGhpcyByZXR1cm5zIGEgKmNhbGxhYmxlKiBpbnN0YW5jZS5cbi8vIFRoYXTigJlzIHdoeSBpdOKAmXMgZG9jdW1lbnRlZCBhcyBhIGZ1bmN0aW9uLlxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgcHJvY2Vzc29yLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgYSBuZXcgcHJvY2Vzc29yIGNhbiBiZSBjcmVhdGVkIChmcm9tIGByZW1hcmtgKSBhbmQgbGlua2VkXG4gKiAgIHRvICoqc3RkaW4qKig0KSBhbmQgKipzdGRvdXQqKig0KS5cbiAqXG4gKiAgIGBgYGpzXG4gKiAgIGltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2VzcydcbiAqICAgaW1wb3J0IGNvbmNhdFN0cmVhbSBmcm9tICdjb25jYXQtc3RyZWFtJ1xuICogICBpbXBvcnQge3JlbWFya30gZnJvbSAncmVtYXJrJ1xuICpcbiAqICAgcHJvY2Vzcy5zdGRpbi5waXBlKFxuICogICAgIGNvbmNhdFN0cmVhbShmdW5jdGlvbiAoYnVmKSB7XG4gKiAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShTdHJpbmcocmVtYXJrKCkucHJvY2Vzc1N5bmMoYnVmKSkpXG4gKiAgICAgfSlcbiAqICAgKVxuICogICBgYGBcbiAqXG4gKiBAcmV0dXJuc1xuICogICBOZXcgKnVuZnJvemVuKiBwcm9jZXNzb3IgKGBwcm9jZXNzb3JgKS5cbiAqXG4gKiAgIFRoaXMgcHJvY2Vzc29yIGlzIGNvbmZpZ3VyZWQgdG8gd29yayB0aGUgc2FtZSBhcyBpdHMgYW5jZXN0b3IuXG4gKiAgIFdoZW4gdGhlIGRlc2NlbmRhbnQgcHJvY2Vzc29yIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGZ1dHVyZSBpdCBkb2VzIG5vdFxuICogICBhZmZlY3QgdGhlIGFuY2VzdHJhbCBwcm9jZXNzb3IuXG4gKi9cbmV4cG9ydCBjb25zdCB1bmlmaWVkID0gbmV3IFByb2Nlc3NvcigpLmZyZWV6ZSgpXG5cbi8qKlxuICogQXNzZXJ0IGEgcGFyc2VyIGlzIGF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgUGFyc2VyfVxuICovXG5mdW5jdGlvbiBhc3NlcnRQYXJzZXIobmFtZSwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBgJyArIG5hbWUgKyAnYCB3aXRob3V0IGBwYXJzZXJgJylcbiAgfVxufVxuXG4vKipcbiAqIEFzc2VydCBhIGNvbXBpbGVyIGlzIGF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgQ29tcGlsZXJ9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydENvbXBpbGVyKG5hbWUsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgYCcgKyBuYW1lICsgJ2Agd2l0aG91dCBgY29tcGlsZXJgJylcbiAgfVxufVxuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJvY2Vzc29yIGlzIG5vdCBmcm96ZW4uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7dW5rbm93bn0gZnJvemVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBmcm96ZW4gaXMgZmFsc2V9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydFVuZnJvemVuKG5hbWUsIGZyb3plbikge1xuICBpZiAoZnJvemVuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0Nhbm5vdCBjYWxsIGAnICtcbiAgICAgICAgbmFtZSArXG4gICAgICAgICdgIG9uIGEgZnJvemVuIHByb2Nlc3Nvci5cXG5DcmVhdGUgYSBuZXcgcHJvY2Vzc29yIGZpcnN0LCBieSBjYWxsaW5nIGl0OiB1c2UgYHByb2Nlc3NvcigpYCBpbnN0ZWFkIG9mIGBwcm9jZXNzb3JgLidcbiAgICApXG4gIH1cbn1cblxuLyoqXG4gKiBBc3NlcnQgYG5vZGVgIGlzIGEgdW5pc3Qgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG5vZGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIG5vZGUgaXMgTm9kZX1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm9kZShub2RlKSB7XG4gIC8vIGBpc1BsYWluT2JqYCB1bmZvcnR1bmF0ZWx5IHVzZXMgYGFueWAgaW5zdGVhZCBvZiBgdW5rbm93bmAuXG4gIC8vIHR5cGUtY292ZXJhZ2U6aWdub3JlLW5leHQtbGluZVxuICBpZiAoIWlzUGxhaW5PYmoobm9kZSkgfHwgdHlwZW9mIG5vZGUudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBub2RlLCBnb3QgYCcgKyBub2RlICsgJ2AnKVxuICAgIC8vIEZpbmUuXG4gIH1cbn1cblxuLyoqXG4gKiBBc3NlcnQgdGhhdCBgY29tcGxldGVgIGlzIGB0cnVlYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGFzeW5jTmFtZVxuICogQHBhcmFtIHt1bmtub3dufSBjb21wbGV0ZVxuICogQHJldHVybnMge2Fzc2VydHMgY29tcGxldGUgaXMgdHJ1ZX1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0RG9uZShuYW1lLCBhc3luY05hbWUsIGNvbXBsZXRlKSB7XG4gIGlmICghY29tcGxldGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnYCcgKyBuYW1lICsgJ2AgZmluaXNoZWQgYXN5bmMuIFVzZSBgJyArIGFzeW5jTmFtZSArICdgIGluc3RlYWQnXG4gICAgKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBbdmFsdWVdXG4gKiBAcmV0dXJucyB7VkZpbGV9XG4gKi9cbmZ1bmN0aW9uIHZmaWxlKHZhbHVlKSB7XG4gIHJldHVybiBsb29rc0xpa2VBVkZpbGUodmFsdWUpID8gdmFsdWUgOiBuZXcgVkZpbGUodmFsdWUpXG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21wYXRpYmxlIHwgdW5kZWZpbmVkfSBbdmFsdWVdXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgVkZpbGV9XG4gKi9cbmZ1bmN0aW9uIGxvb2tzTGlrZUFWRmlsZSh2YWx1ZSkge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgJ21lc3NhZ2UnIGluIHZhbHVlICYmXG4gICAgICAnbWVzc2FnZXMnIGluIHZhbHVlXG4gIClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IFt2YWx1ZV1cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBWYWx1ZX1cbiAqL1xuZnVuY3Rpb24gbG9va3NMaWtlQVZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IGlzVWludDhBcnJheSh2YWx1ZSlcbn1cblxuLyoqXG4gKiBBc3NlcnQgYHZhbHVlYCBpcyBhbiBgVWludDhBcnJheWAuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogICB0aGluZy5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBVaW50OEFycmF5fVxuICogICBXaGV0aGVyIGB2YWx1ZWAgaXMgYW4gYFVpbnQ4QXJyYXlgLlxuICovXG5mdW5jdGlvbiBpc1VpbnQ4QXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgdmFsdWUgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICdieXRlTGVuZ3RoJyBpbiB2YWx1ZSAmJlxuICAgICAgJ2J5dGVPZmZzZXQnIGluIHZhbHVlXG4gIClcbn1cbiJdLCJuYW1lcyI6WyJiYWlsIiwiZXh0ZW5kIiwib2siLCJhc3NlcnQiLCJpc1BsYWluT2JqIiwidHJvdWdoIiwiVkZpbGUiLCJDYWxsYWJsZUluc3RhbmNlIiwib3duIiwiaGFzT3duUHJvcGVydHkiLCJQcm9jZXNzb3IiLCJjb25zdHJ1Y3RvciIsIkNvbXBpbGVyIiwidW5kZWZpbmVkIiwiUGFyc2VyIiwiYXR0YWNoZXJzIiwiY29tcGlsZXIiLCJmcmVlemVJbmRleCIsImZyb3plbiIsIm5hbWVzcGFjZSIsInBhcnNlciIsInRyYW5zZm9ybWVycyIsImNvcHkiLCJkZXN0aW5hdGlvbiIsImluZGV4IiwibGVuZ3RoIiwiYXR0YWNoZXIiLCJ1c2UiLCJkYXRhIiwia2V5IiwidmFsdWUiLCJhcmd1bWVudHMiLCJhc3NlcnRVbmZyb3plbiIsImNhbGwiLCJmcmVlemUiLCJzZWxmIiwib3B0aW9ucyIsInRyYW5zZm9ybWVyIiwiTnVtYmVyIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJwYXJzZSIsImZpbGUiLCJyZWFsRmlsZSIsInZmaWxlIiwiYXNzZXJ0UGFyc2VyIiwiU3RyaW5nIiwicHJvY2VzcyIsImRvbmUiLCJhc3NlcnRDb21waWxlciIsImV4ZWN1dG9yIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJwYXJzZVRyZWUiLCJydW4iLCJlcnJvciIsInRyZWUiLCJyZWFsRG9uZSIsImNvbXBpbGVUcmVlIiwiY29tcGlsZVJlc3VsdCIsInN0cmluZ2lmeSIsImxvb2tzTGlrZUFWYWx1ZSIsInJlc3VsdCIsInByb2Nlc3NTeW5jIiwiY29tcGxldGUiLCJhc3NlcnREb25lIiwiYXNzZXJ0Tm9kZSIsIm91dHB1dFRyZWUiLCJyZXN1bHRpbmdUcmVlIiwicnVuU3luYyIsInBhcmFtZXRlcnMiLCJhZGRQbHVnaW4iLCJBcnJheSIsImlzQXJyYXkiLCJhZGRMaXN0IiwiYWRkUHJlc2V0IiwiVHlwZUVycm9yIiwiYWRkIiwicGx1Z2luIiwiRXJyb3IiLCJwbHVnaW5zIiwic2V0dGluZ3MiLCJ0aGluZyIsImVudHJ5SW5kZXgiLCJwdXNoIiwicHJpbWFyeSIsInJlc3QiLCJjdXJyZW50UHJpbWFyeSIsInVuaWZpZWQiLCJuYW1lIiwibm9kZSIsInR5cGUiLCJhc3luY05hbWUiLCJsb29rc0xpa2VBVkZpbGUiLCJCb29sZWFuIiwiaXNVaW50OEFycmF5Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/unified/lib/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(ssr)/./node_modules/unified/node_modules/is-plain-obj/index.js":
|
||
/*!*****************************************************************!*\
|
||
!*** ./node_modules/unified/node_modules/is-plain-obj/index.js ***!
|
||
\*****************************************************************/
|
||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ isPlainObject)\n/* harmony export */ });\nfunction isPlainObject(value) {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvdW5pZmllZC9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBZSxTQUFTQSxjQUFjQyxLQUFLO0lBQzFDLElBQUksT0FBT0EsVUFBVSxZQUFZQSxVQUFVLE1BQU07UUFDaEQsT0FBTztJQUNSO0lBRUEsTUFBTUMsWUFBWUMsT0FBT0MsY0FBYyxDQUFDSDtJQUN4QyxPQUFPLENBQUNDLGNBQWMsUUFBUUEsY0FBY0MsT0FBT0QsU0FBUyxJQUFJQyxPQUFPQyxjQUFjLENBQUNGLGVBQWUsSUFBRyxLQUFNLENBQUVHLENBQUFBLE9BQU9DLFdBQVcsSUFBSUwsS0FBSSxLQUFNLENBQUVJLENBQUFBLE9BQU9FLFFBQVEsSUFBSU4sS0FBSTtBQUMxSyIsInNvdXJjZXMiOlsid2VicGFjazovL2ZsdXNoLW5vdGVzLy4vbm9kZV9tb2R1bGVzL3VuaWZpZWQvbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcz8zZTc2Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iXSwibmFtZXMiOlsiaXNQbGFpbk9iamVjdCIsInZhbHVlIiwicHJvdG90eXBlIiwiT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsIml0ZXJhdG9yIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/unified/node_modules/is-plain-obj/index.js\n");
|
||
|
||
/***/ })
|
||
|
||
};
|
||
; |